From e3fa06eaac487d52d80bc9ef15e071f7fa14c26c Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Sun, 14 Dec 2025 19:39:36 +0100 Subject: [PATCH] Update On Sun Dec 14 19:39:35 CET 2025 --- .github/update.log | 1 + clash-meta/common/net/websocket.go | 12 + clash-meta/docker/file-name.sh | 4 +- clash-meta/hub/route/common.go | 157 + clash-meta/hub/route/connections.go | 6 +- clash-meta/hub/route/server.go | 14 +- clash-meta/transport/vmess/websocket.go | 15 +- hysteria/.github/workflows/master.yml | 2 +- hysteria/.github/workflows/release.yml | 2 +- mihomo/common/net/websocket.go | 12 + mihomo/docker/file-name.sh | 4 +- mihomo/hub/route/common.go | 157 + mihomo/hub/route/connections.go | 6 +- mihomo/hub/route/server.go | 14 +- mihomo/transport/vmess/websocket.go | 15 +- naiveproxy/CHROMIUM_VERSION | 2 +- naiveproxy/USAGE.txt | 8 +- naiveproxy/src/AUTHORS | 24 + naiveproxy/src/BUILD.gn | 2 + naiveproxy/src/DEPS | 810 +-- naiveproxy/src/base/BUILD.gn | 52 +- naiveproxy/src/base/DEPS | 5 - .../src/base/allocator/allocator_check.h | 5 - .../base/allocator/dispatcher/configuration.h | 5 - .../base/allocator/dispatcher/dispatcher.h | 5 - .../dispatcher/internal/dispatch_data.h | 5 - .../dispatcher/internal/dispatcher_internal.h | 58 +- .../allocator/dispatcher/internal/tools.h | 5 - .../allocator/dispatcher/memory_tagging.cc | 5 - .../allocator/dispatcher/memory_tagging.h | 5 - .../src/base/allocator/dispatcher/subsystem.h | 5 - .../dispatcher/testing/dispatcher_test.h | 5 - .../allocator/early_zone_registration_apple.h | 5 - .../src/base/allocator/miracle_parameter.cc | 81 - .../src/base/allocator/miracle_parameter.h | 182 - .../allocator/partition_alloc_features.cc | 186 +- .../base/allocator/partition_alloc_features.h | 34 +- .../base/allocator/partition_alloc_support.cc | 127 +- .../base/allocator/partition_alloc_support.h | 1 + .../build_overrides/partition_alloc.gni | 1 - .../partition_allocator/partition_alloc.gni | 35 +- .../src/partition_alloc/BUILD.gn | 3 +- .../address_pool_manager_types.h | 5 - .../src/partition_alloc/allocator_config.cc | 13 +- .../dangling_raw_ptr_checks.cc | 5 - .../src/partition_alloc/internal_allocator.cc | 5 - .../internal_allocator_forward.h | 2 +- .../src/partition_alloc/oom_callback.cc | 5 - .../src/partition_alloc/oom_callback.h | 5 - .../src/partition_alloc/page_allocator.cc | 6 +- .../src/partition_alloc/page_allocator.h | 6 + .../page_allocator_constants.h | 7 +- .../partition_alloc/page_allocator_internal.h | 5 - .../partition_address_space.cc | 17 +- .../partition_alloc_base/compiler_specific.h | 7 +- .../partition_alloc_base/component_export.h | 5 - .../cxx20_is_constant_evaluated.h | 5 - .../partition_alloc_base/debug/alias.cc | 5 - .../files/file_util_posix.cc | 10 +- .../partition_alloc_base/immediate_crash.h | 5 - .../partition_alloc_base/ios/ios_util.h | 5 - .../partition_alloc_base/mac/mac_util.mm | 3 +- .../partition_alloc_base/memory/page_size.h | 5 - .../memory/scoped_policy.h | 5 - .../memory/stack_allocated.h | 61 + .../posix/safe_strerror.h | 5 - .../process/process_handle.h | 5 - .../process/process_handle_posix.cc | 5 - .../partition_alloc_base/rand_util.cc | 5 - .../scoped_clear_last_error.h | 5 - .../strings/string_util.cc | 19 +- .../threading/platform_thread.cc | 5 - .../platform_thread_apple_for_testing.mm | 2 +- .../time/time_conversion_posix.cc | 5 - .../time/time_override.cc | 5 - .../partition_alloc_buildflags.h | 4 - .../partition_alloc/partition_alloc_config.h | 12 + .../partition_alloc_constants.h | 6 +- .../partition_alloc_for_testing.h | 5 - .../partition_alloc/partition_alloc_hooks.cc | 5 - .../src/partition_alloc/partition_bucket.cc | 16 +- .../partition_freelist_entry.cc | 5 - .../src/partition_alloc/partition_oom.h | 5 - .../src/partition_alloc/partition_page.h | 20 +- .../src/partition_alloc/partition_root.cc | 17 +- .../src/partition_alloc/partition_root.h | 30 +- .../src/partition_alloc/partition_stats.cc | 9 +- .../src/partition_alloc/pointers/raw_ptr.h | 68 +- .../pointers/raw_ptr_backup_ref_impl.h | 31 +- .../pointers/raw_ptr_exclusion.h | 5 - .../pointers/raw_ptr_hookable_impl.h | 31 +- .../pointers/raw_ptr_nocompile.nc | 9 +- .../pointers/raw_ptr_noop_impl.h | 19 +- .../pointers/raw_ref_nocompile.nc | 17 +- .../src/partition_alloc/random.cc | 5 - .../scheduler_loop_quarantine.cc | 42 +- .../scheduler_loop_quarantine.h | 10 + .../scheduler_loop_quarantine_support.cc | 5 - .../scheduler_loop_quarantine_support.h | 28 +- .../partition_alloc/shim/allocator_dispatch.h | 5 + .../shim/allocator_interception_apple.h | 5 - .../src/partition_alloc/shim/allocator_shim.h | 13 +- .../shim/allocator_shim_apple.cc | 7 +- ..._default_dispatch_to_apple_zoned_malloc.cc | 19 +- ...llocator_shim_default_dispatch_to_glibc.cc | 10 + ...ault_dispatch_to_linker_wrapped_symbols.cc | 19 +- ...him_default_dispatch_to_partition_alloc.cc | 24 +- ...shim_default_dispatch_to_partition_alloc.h | 18 +- ...ult_dispatch_to_partition_alloc_internal.h | 5 - ...to_partition_alloc_with_advanced_checks.cc | 10 + ..._to_partition_alloc_with_advanced_checks.h | 5 - ...allocator_shim_dispatch_to_noop_on_free.cc | 6 +- .../allocator_shim_dispatch_to_noop_on_free.h | 5 - .../shim/allocator_shim_functions.h | 6 + .../shim/allocator_shim_internals.h | 5 - .../src/partition_alloc/spinning_mutex.cc | 58 + .../src/partition_alloc/spinning_mutex.h | 20 + .../third_party/apple_apsl/README.chromium | 3 +- .../src/partition_alloc/thread_cache.cc | 32 +- .../src/partition_alloc/thread_cache.h | 41 +- .../src/partition_alloc/use_death_tests.h | 5 - .../scheduler_loop_quarantine_config.cc | 14 +- .../scheduler_loop_quarantine_config.h | 2 + naiveproxy/src/base/android/OWNERS | 1 + .../android/android_hardware_buffer_compat.cc | 127 - .../android/android_hardware_buffer_compat.h | 77 - naiveproxy/src/base/android/android_info.cc | 2 +- naiveproxy/src/base/android/android_info.h | 22 +- .../src/base/android/android_info_stub.cc | 79 + .../android/android_input_receiver_compat.cc | 10 +- .../android/android_input_receiver_compat.h | 5 + naiveproxy/src/base/android/apk_info.cc | 4 + naiveproxy/src/base/android/apk_info.h | 22 +- naiveproxy/src/base/android/apk_info_stub.cc | 59 + .../background_thread_pool_field_trial.cc | 8 +- .../src/base/android/base_feature_map.cc | 4 + naiveproxy/src/base/android/build_info.cc | 95 - naiveproxy/src/base/android/build_info.h | 199 - .../src/base/android/callback_android.cc | 15 +- .../src/base/android/content_uri_utils.cc | 5 +- .../src/base/android/content_uri_utils.h | 7 +- .../base/android/content_uri_utils_stub.cc | 2 +- naiveproxy/src/base/android/device_info.cc | 34 +- naiveproxy/src/base/android/device_info.h | 3 + .../src/base/android/device_info_stub.cc | 61 + .../base/android/early_trace_event_binding.cc | 33 +- .../src/base/android/input_hint_checker.cc | 5 +- .../src/base/android/input_hint_checker.h | 2 +- .../base/android/jank_metric_uma_recorder.cc | 350 - .../base/android/jank_metric_uma_recorder.h | 56 - naiveproxy/src/base/android/jni_onload.cc | 2 - naiveproxy/src/base/android/jni_onload.h | 15 - .../library_loader/library_loader_hooks.cc | 8 +- .../library_loader/library_loader_hooks.h | 5 + .../library_loader/library_prefetcher.cc | 163 +- .../library_loader/library_prefetcher.h | 14 +- .../library_prefetcher_hooks.cc | 2 +- naiveproxy/src/base/android/linker/BUILD.gn | 9 + .../android/linker}/ashmem-dev.c | 186 +- .../ashmem => base/android/linker}/ashmem.h | 8 +- .../src/base/android/linker/linker_jni.cc | 94 +- .../src/base/android/linker/linker_jni.h | 11 +- .../memory_pressure_listener_android.cc | 18 +- .../android/memory_purge_manager_android.cc | 1 - naiveproxy/src/base/android/pmf_utils.cc | 29 +- naiveproxy/src/base/android/pmf_utils.h | 5 +- .../pre_freeze_background_memory_trimmer.cc | 32 +- .../pre_freeze_background_memory_trimmer.h | 6 +- .../android/scoped_hardware_buffer_handle.cc | 19 +- .../src/base/android/scoped_input_event.cc | 5 +- .../android/scoped_service_binding_batch.cc | 31 + .../android/scoped_service_binding_batch.h | 48 + .../base/android/self_compaction_manager.cc | 53 +- .../base/android/self_compaction_manager.h | 10 +- naiveproxy/src/base/android/sys_utils.cc | 12 +- naiveproxy/src/base/android/sys_utils.h | 18 + naiveproxy/src/base/android/sys_utils_stub.cc | 16 + .../task_scheduler/task_runner_android.cc | 63 + .../task_scheduler/task_runner_android.h | 8 + naiveproxy/src/base/apple/bridging.h | 6 +- .../base/apple/mach_port_rendezvous_mac.cc | 2 - naiveproxy/src/base/apple/owned_objc_types.h | 4 + naiveproxy/src/base/atomicops.h | 2 +- naiveproxy/src/base/byte_count.cc | 104 + naiveproxy/src/base/byte_count.h | 111 +- naiveproxy/src/base/byte_size.cc | 124 + naiveproxy/src/base/byte_size.h | 608 ++ naiveproxy/src/base/byte_size_nocompile.nc | 90 + naiveproxy/src/base/check_op.h | 2 +- .../containers/adapters_nocompile_cpp23.nc | 27 + .../src/base/containers/circular_deque.h | 2 +- naiveproxy/src/base/containers/flat_tree.h | 24 +- naiveproxy/src/base/containers/heap_array.h | 23 + .../base/containers/heap_array_nocompile.nc | 2 +- naiveproxy/src/base/containers/map_util.h | 20 +- naiveproxy/src/base/containers/variant_map.cc | 39 + naiveproxy/src/base/containers/variant_map.h | 317 + .../src/base/debug/asan_invalid_access.cc | 25 +- naiveproxy/src/base/debug/debugger.cc | 1 + naiveproxy/src/base/debug/dwarf_line_no.cc | 6 +- naiveproxy/src/base/debug/elf_reader.cc | 8 +- naiveproxy/src/base/debug/proc_maps_linux.cc | 4 +- naiveproxy/src/base/debug/proc_maps_linux.h | 18 +- naiveproxy/src/base/debug/stack_trace.cc | 38 +- naiveproxy/src/base/debug/stack_trace.h | 12 + .../src/base/debug/stack_trace_android.cc | 5 +- naiveproxy/src/base/debug/stack_trace_win.cc | 50 +- .../src/base/debug/test_elf_image_builder.cc | 3 +- naiveproxy/src/base/feature_list.cc | 5 +- naiveproxy/src/base/feature_list.h | 66 +- naiveproxy/src/base/feature_visitor.h | 5 - naiveproxy/src/base/features.cc | 120 +- naiveproxy/src/base/features.h | 23 +- naiveproxy/src/base/file_descriptor_posix.h | 2 +- naiveproxy/src/base/files/drive_info.h | 5 + naiveproxy/src/base/files/drive_info_posix.cc | 22 + naiveproxy/src/base/files/drive_info_win.cc | 47 +- naiveproxy/src/base/files/file.h | 2 +- naiveproxy/src/base/files/file_enumerator.h | 6 +- .../src/base/files/file_enumerator_posix.cc | 14 +- .../src/base/files/file_enumerator_win.cc | 5 +- naiveproxy/src/base/files/file_path.cc | 66 +- naiveproxy/src/base/files/file_path.h | 7 +- naiveproxy/src/base/files/file_posix.cc | 151 +- naiveproxy/src/base/files/file_util.cc | 62 +- naiveproxy/src/base/files/file_util.h | 19 +- naiveproxy/src/base/files/file_util_posix.cc | 14 +- naiveproxy/src/base/files/file_util_win.cc | 91 +- naiveproxy/src/base/files/scoped_temp_dir.cc | 19 +- naiveproxy/src/base/files/scoped_temp_dir.h | 18 +- .../src/base/functional/bind_internal.h | 3 +- naiveproxy/src/base/functional/callback.h | 9 +- .../src/base/functional/unretained_traits.h | 44 +- .../base/i18n/build_utf8_validator_tables.cc | 15 +- naiveproxy/src/base/i18n/icu_util.cc | 9 + naiveproxy/src/base/ios/ios_util.h | 8 + naiveproxy/src/base/ios/ios_util.mm | 10 + .../src/base/ios/scoped_critical_action.mm | 1 - .../base/json/json_file_value_serializer.h | 6 + .../base/json/json_perftest_decodebench.cc | 3 +- naiveproxy/src/base/json/json_reader.h | 10 +- .../base/json/json_string_value_serializer.h | 4 + naiveproxy/src/base/lazy_instance_helpers.cc | 1 + naiveproxy/src/base/linux_util.cc | 4 +- naiveproxy/src/base/logging_chromeos.cc | 1 + naiveproxy/src/base/mac/mac_util.h | 3 + naiveproxy/src/base/mac/mac_util.mm | 7 + .../src/base/memory/discardable_memory.cc | 24 +- .../base/memory/discardable_memory_internal.h | 7 +- .../base/memory/discardable_shared_memory.cc | 9 +- .../madv_free_discardable_memory_posix.cc | 1 - .../src/base/memory/memory_pressure_level.h | 38 + .../base/memory/memory_pressure_listener.cc | 284 +- .../base/memory/memory_pressure_listener.h | 259 +- .../memory_pressure_listener_registry.cc | 122 + .../memory_pressure_listener_registry.h | 53 + .../src/base/memory/memory_pressure_monitor.h | 22 +- .../memory/mock_memory_pressure_listener.cc | 26 + .../memory/mock_memory_pressure_listener.h | 45 + .../memory/platform_shared_memory_handle.h | 2 + .../platform_shared_memory_mapper_android.cc | 27 +- .../memory/platform_shared_memory_region.h | 26 - .../platform_shared_memory_region_android.cc | 2 +- .../platform_shared_memory_region_posix.cc | 12 - .../platform_shared_memory_region_win.cc | 19 +- .../post_delayed_memory_reduction_task.h | 1 + naiveproxy/src/base/memory/raw_ptr.md | 8 + naiveproxy/src/base/memory/ref_counted.h | 4 +- naiveproxy/src/base/memory/safety_checks.h | 7 +- .../memory/shared_memory_security_policy.cc | 22 +- .../src/base/memory/shared_memory_tracker.cc | 2 - .../src/base/memory/values_equivalent.h | 2 - .../async_memory_consumer_registration.cc | 44 +- .../async_memory_consumer_registration.h | 17 +- .../memory_coordinator/memory_consumer.cc | 39 +- .../base/memory_coordinator/memory_consumer.h | 44 +- .../memory_consumer_registry.cc | 35 + .../memory_consumer_registry.h | 32 +- ...y_consumer_registry_destruction_observer.h | 19 + .../mock_memory_consumer.cc | 7 + .../memory_coordinator/mock_memory_consumer.h | 12 + .../test_memory_consumer_registry.cc | 1 + .../base/message_loop/message_pump_epoll.cc | 10 +- .../base/message_loop/message_pump_epoll.h | 2 +- .../base/message_loop/message_pump_glib.cc | 120 +- .../src/base/message_loop/message_pump_glib.h | 11 +- naiveproxy/src/base/metrics/field_trial.cc | 113 +- naiveproxy/src/base/metrics/field_trial.h | 81 +- .../src/base/metrics/field_trial_entry.cc | 81 + .../src/base/metrics/field_trial_entry.h | 97 + ...field_trial_list_including_low_anonymity.h | 3 + .../metrics/field_trial_param_associator.h | 3 +- naiveproxy/src/base/metrics/histogram.cc | 14 +- .../src/base/metrics/histogram_functions.cc | 72 +- .../src/base/metrics/histogram_functions.h | 22 +- .../histogram_functions_internal_overloads.h | 10 + .../base/metrics/histogram_shared_memory.cc | 1 - .../metrics/persistent_histogram_allocator.cc | 15 +- .../metrics/persistent_histogram_allocator.h | 4 + .../src/base/metrics/statistics_recorder.cc | 17 +- .../src/base/metrics/statistics_recorder.h | 24 +- naiveproxy/src/base/native_library.cc | 15 - naiveproxy/src/base/native_library.h | 17 - naiveproxy/src/base/native_library_apple.mm | 9 +- naiveproxy/src/base/native_library_fuchsia.cc | 5 +- naiveproxy/src/base/native_library_posix.cc | 18 +- naiveproxy/src/base/native_library_win.cc | 5 +- .../src/base/numerics/byte_conversions.h | 2 +- naiveproxy/src/base/posix/safe_strerror.h | 2 + .../src/base/posix/unix_domain_socket.h | 13 + .../src/base/power_monitor/power_monitor.h | 2 +- .../power_monitor/power_monitor_features.cc | 4 +- naiveproxy/src/base/process/current_process.h | 12 +- naiveproxy/src/base/process/kill.h | 4 +- naiveproxy/src/base/process/kill_win.cc | 11 + naiveproxy/src/base/process/launch.h | 16 +- .../src/base/process/launch_unittest_win.cc | 53 +- naiveproxy/src/base/process/launch_win.cc | 18 +- naiveproxy/src/base/process/memory.cc | 36 +- naiveproxy/src/base/process/memory.h | 8 + naiveproxy/src/base/process/memory_fuchsia.cc | 9 + naiveproxy/src/base/process/memory_linux.cc | 12 + naiveproxy/src/base/process/memory_mac.mm | 17 +- naiveproxy/src/base/process/memory_win.cc | 29 + naiveproxy/src/base/process/process.h | 5 + naiveproxy/src/base/process/process_linux.cc | 8 +- .../src/base/process/process_metrics.cc | 6 +- naiveproxy/src/base/process/process_metrics.h | 68 +- .../src/base/process/process_metrics_apple.mm | 17 +- .../base/process/process_metrics_fuchsia.cc | 4 +- .../src/base/process/process_metrics_linux.cc | 30 +- .../src/base/process/process_metrics_win.cc | 13 +- naiveproxy/src/base/process/process_posix.cc | 6 +- naiveproxy/src/base/process/process_win.cc | 4 +- naiveproxy/src/base/profiler/OWNERS | 2 - .../src/base/profiler/stack_copier_signal.cc | 5 +- .../base/profiler/thread_group_profiler.cc | 2 +- .../src/base/profiler/thread_group_profiler.h | 1 + .../protobuf_hardening_test_support.proto | 16 + naiveproxy/src/base/rand_util_fuchsia.cc | 4 +- naiveproxy/src/base/rand_util_posix.cc | 4 +- naiveproxy/src/base/rand_util_win.cc | 4 +- .../lock_free_address_hash_set.cc | 155 +- .../lock_free_address_hash_set.h | 210 +- .../lock_free_bloom_filter.cc | 7 +- .../lock_free_bloom_filter.h | 3 + .../poisson_allocation_sampler.cc | 44 +- .../poisson_allocation_sampler.h | 37 +- .../base/strings/latin1_string_conversions.h | 4 + .../base/strings/string_number_conversions.cc | 7 + .../base/strings/string_number_conversions.h | 63 +- .../string_number_conversions_internal.h | 62 +- .../strings/string_number_conversions_win.cc | 4 + .../strings/string_number_conversions_win.h | 3 + naiveproxy/src/base/strings/string_util.cc | 31 - naiveproxy/src/base/strings/string_util.h | 6 - .../src/base/strings/string_util_posix.h | 5 + .../src/base/strings/string_util_win.cc | 10 + naiveproxy/src/base/strings/string_util_win.h | 9 + naiveproxy/src/base/strings/to_string.h | 2 +- .../strings/utf_string_conversion_utils.h | 18 + .../src/base/strings/utf_string_conversions.h | 7 +- naiveproxy/src/base/synchronization/lock.cc | 12 +- .../base/synchronization/lock_impl_posix.cc | 20 +- .../src/base/synchronization/lock_impl_win.cc | 3 + .../synchronization/lock_metrics_recorder.cc | 100 + .../synchronization/lock_metrics_recorder.h | 144 + .../base/synchronization/waitable_event.cc | 8 +- .../src/base/synchronization/waitable_event.h | 17 +- .../synchronization/waitable_event_apple.cc | 15 +- .../synchronization/waitable_event_posix.cc | 66 +- .../waitable_event_watcher_posix.cc | 2 +- .../synchronization/waitable_event_win.cc | 10 +- naiveproxy/src/base/system/sys_info.cc | 63 +- naiveproxy/src/base/system/sys_info.h | 54 +- naiveproxy/src/base/system/sys_info_apple.mm | 4 +- .../src/base/system/sys_info_freebsd.cc | 4 +- .../src/base/system/sys_info_fuchsia.cc | 24 +- naiveproxy/src/base/system/sys_info_ios.mm | 8 +- naiveproxy/src/base/system/sys_info_linux.cc | 42 +- naiveproxy/src/base/system/sys_info_mac.mm | 9 +- .../src/base/system/sys_info_openbsd.cc | 14 +- naiveproxy/src/base/system/sys_info_posix.cc | 33 +- naiveproxy/src/base/system/sys_info_win.cc | 39 +- .../src/base/task/common/task_annotator.cc | 22 + .../src/base/task/common/task_annotator.h | 9 + naiveproxy/src/base/task/current_thread.h | 5 +- naiveproxy/src/base/task/execution_fence.cc | 119 + naiveproxy/src/base/task/execution_fence.h | 81 + .../task/sequence_manager/sequence_manager.cc | 18 + .../task/sequence_manager/sequence_manager.h | 31 + .../sequence_manager/sequence_manager_impl.cc | 48 +- .../sequence_manager/sequence_manager_impl.h | 14 + .../sequence_manager/thread_controller.cc | 1 - .../thread_controller_power_monitor.cc | 4 +- ...hread_controller_with_message_pump_impl.cc | 22 +- ...thread_controller_with_message_pump_impl.h | 5 + .../src/base/task/sequenced_task_runner.h | 8 +- .../base/task/single_thread_task_executor.cc | 18 +- .../base/task/single_thread_task_executor.h | 13 +- .../base/task/single_thread_task_runner.cc | 48 + .../src/base/task/single_thread_task_runner.h | 47 +- naiveproxy/src/base/task/task_features.cc | 17 +- .../src/base/task/task_traits_nocompile.nc | 2 +- .../task/thread_pool/delayed_task_manager.h | 1 + .../base/task/thread_pool/test_task_factory.h | 2 +- .../src/base/task/thread_pool/test_utils.h | 1 + .../src/base/task/thread_pool/thread_group.cc | 4 +- .../src/base/task/thread_pool/thread_group.h | 2 +- .../task/thread_pool/thread_group_impl.cc | 19 +- .../base/task/thread_pool/thread_group_impl.h | 7 +- .../base/task/thread_pool/thread_pool_impl.cc | 55 +- .../base/task/thread_pool/thread_pool_impl.h | 13 +- .../task/thread_pool/thread_pool_instance.cc | 22 - .../task/thread_pool/thread_pool_instance.h | 28 +- naiveproxy/src/base/test/BUILD.gn | 21 +- .../test/android/content_uri_test_utils.cc | 33 +- .../test/android/content_uri_test_utils.h | 12 + naiveproxy/src/base/test/bind.h | 5 +- .../src/base/test/gmock_callback_support.h | 3 + naiveproxy/src/base/test/ios/wait_util.h | 2 +- .../src/base/test/launcher/test_launcher.cc | 3 +- .../test/launcher/test_launcher_test_utils.cc | 3 +- .../test/launcher/test_results_tracker.cc | 6 +- .../test/metrics/action_variants_reader.cc | 220 + .../test/metrics/action_variants_reader.h | 60 + .../src/base/test/metrics/histogram_tester.h | 3 + .../base/test/native_library_test_utils.cc | 25 - .../src/base/test/native_library_test_utils.h | 29 - ...oped_amount_of_physical_memory_override.cc | 16 +- ...coped_amount_of_physical_memory_override.h | 17 +- .../test/scoped_libc_timezone_override.cc | 33 + .../base/test/scoped_libc_timezone_override.h | 30 + ...oped_mock_time_message_loop_task_runner.cc | 4 + ...coped_mock_time_message_loop_task_runner.h | 2 +- naiveproxy/src/base/test/task_environment.cc | 24 +- naiveproxy/src/base/test/task_environment.h | 21 +- .../src/base/test/task_runner_test_template.h | 1 + .../test/test_discardable_memory_allocator.cc | 10 +- naiveproxy/src/base/test/test_file_util.cc | 35 +- naiveproxy/src/base/test/test_file_util.h | 11 + naiveproxy/src/base/test/test_io_thread.h | 2 +- .../src/base/test/test_shared_library.cc | 24 +- naiveproxy/src/base/test/test_suite.cc | 28 +- naiveproxy/src/base/test/test_suite.h | 5 + naiveproxy/src/base/test/test_support_ios.mm | 3 +- naiveproxy/src/base/test/test_switches.cc | 7 + naiveproxy/src/base/test/test_switches.h | 4 + naiveproxy/src/base/test/test_timeouts.cc | 4 +- .../src/base/test/test_trace_processor.cc | 4 +- .../src/base/test/trace_event_analyzer.cc | 3 +- naiveproxy/src/base/test/trace_test_utils.cc | 25 +- naiveproxy/src/base/test/trace_test_utils.h | 10 +- naiveproxy/src/base/test/trace_to_file.cc | 3 + naiveproxy/src/base/test/values_test_util.cc | 10 +- .../base/third_party/cityhash/README.chromium | 1 + .../src/base/third_party/nspr/README.chromium | 1 + .../third_party/superfasthash/README.chromium | 1 + .../third_party/symbolize/README.chromium | 2 + naiveproxy/src/base/threading/hang_watcher.cc | 38 +- naiveproxy/src/base/threading/hang_watcher.h | 9 +- .../src/base/threading/platform_thread.h | 3 +- .../base/threading/platform_thread_android.cc | 21 +- .../base/threading/platform_thread_apple.mm | 1 - .../base/threading/platform_thread_cros.cc | 12 +- .../platform_thread_internal_posix.cc | 6 +- .../platform_thread_internal_posix.h | 1 + .../base/threading/platform_thread_metrics.cc | 92 + .../base/threading/platform_thread_metrics.h | 62 + .../base/threading/platform_thread_posix.cc | 4 + .../src/base/threading/thread_restrictions.h | 15 +- naiveproxy/src/base/time/default_clock.cc | 1 + .../src/base/time/default_tick_clock.cc | 1 + naiveproxy/src/base/timer/elapsed_timer.cc | 7 - naiveproxy/src/base/timer/elapsed_timer.h | 16 +- naiveproxy/src/base/timer/timer.h | 1 + .../src/base/trace_event/builtin_categories.h | 30 +- .../base/trace_event/malloc_dump_provider.cc | 8 +- .../base/trace_event/memory_dump_manager.cc | 3 +- .../trace_event/memory_dump_request_args.h | 12 +- .../memory_pressure_level_proto.cc | 8 +- .../trace_event/memory_pressure_level_proto.h | 4 +- .../base/trace_event/memory_usage_estimator.h | 20 +- .../src/base/trace_event/trace_arguments.h | 4 +- .../src/base/trace_event/trace_config.cc | 8 +- naiveproxy/src/base/trace_event/trace_event.h | 29 + .../src/base/trace_event/trace_event_impl.cc | 22 + .../src/base/trace_event/trace_event_impl.h | 4 + naiveproxy/src/base/trace_event/trace_log.cc | 44 +- naiveproxy/src/base/trace_event/trace_log.h | 2 - .../src/base/trace_event/traced_value.cc | 4 - naiveproxy/src/base/tracing/BUILD.gn | 16 +- naiveproxy/src/base/tracing/protos/BUILD.gn | 1 + .../base/tracing/protos/chrome_enums.proto | 114 + .../tracing/protos/chrome_track_event.proto | 227 +- .../chrome_track_event_import_wrapper.proto | 1 + .../src/base/tracing/protos/sources.gni | 9 +- naiveproxy/src/base/types/always_false.h | 48 - naiveproxy/src/base/types/optional_ref.h | 23 +- naiveproxy/src/base/types/strong_alias.h | 10 + naiveproxy/src/base/types/variant_util.h | 4 +- .../src/base/types/variant_util_nocompile.nc | 4 +- naiveproxy/src/base/uuid.cc | 26 +- naiveproxy/src/base/values.cc | 28 + naiveproxy/src/base/values.h | 8 + .../src/base/version_info/android/BUILD.gn | 1 + .../src/base/version_info/android/OWNERS | 2 +- .../src/base/win/access_control_list.cc | 37 + naiveproxy/src/base/win/access_control_list.h | 13 + naiveproxy/src/base/win/access_token.cc | 77 +- naiveproxy/src/base/win/access_token.h | 20 +- naiveproxy/src/base/win/delayload_helpers.h | 61 + .../src/base/win/event_trace_provider.h | 22 +- naiveproxy/src/base/win/hardware_check.cc | 15 +- naiveproxy/src/base/win/object_watcher.h | 2 +- naiveproxy/src/base/win/scoped_gdi_object.h | 3 +- .../src/base/win/security_descriptor.cc | 16 +- naiveproxy/src/base/win/security_descriptor.h | 8 +- .../src/base/win/startup_information.cc | 4 +- naiveproxy/src/base/win/startup_information.h | 5 +- naiveproxy/src/base/win/vector.cc | 5 + naiveproxy/src/base/win/vector.h | 3 +- naiveproxy/src/base/win/win_util.cc | 24 + naiveproxy/src/base/win/win_util.h | 19 + naiveproxy/src/base/win/windows_version.cc | 3 - naiveproxy/src/base/win/windows_version.h | 11 - .../src/base/win/winrt_foundation_helpers.h | 1 + naiveproxy/src/build/PRESUBMIT.py | 2 +- naiveproxy/src/build/android/BUILD.gn | 2 + .../src/build/android/amd64/module.modulemap | 94 - .../src/build/android/apk_operations.py | 65 +- .../src/build/android/apk_operations.pydeps | 2 + .../build/android/generate_vscode_project.py | 2 +- .../build/android/gradle/generate_gradle.py | 14 +- .../src/build/android/gtest_apk/BUILD.gn | 8 + .../src/build/android/gyp/apkbuilder.py | 190 +- .../src/build/android/gyp/apkbuilder.pydeps | 1 - .../gyp/check_for_missing_direct_deps.py | 80 +- .../gyp/check_for_missing_direct_deps.pydeps | 3 - .../src/build/android/gyp/compile_java.py | 28 +- .../src/build/android/gyp/compile_java.pydeps | 6 - .../src/build/android/gyp/compile_kt.pydeps | 6 - .../gyp/create_bundle_wrapper_script.py | 2 +- naiveproxy/src/build/android/gyp/dex.py | 2 +- .../src/build/android/gyp/errorprone.py | 272 +- .../src/build/android/gyp/errorprone.pydeps | 6 - .../src/build/android/gyp/finalize_apk.py | 71 - .../src/build/android/gyp/java_cpp_enum.py | 34 +- .../build/android/gyp/java_cpp_enum_tests.py | 27 + .../build/android/gyp/java_cpp_features.py | 58 +- .../android/gyp/java_cpp_features_tests.py | 66 +- .../android/gyp/java_cpp_strings_tests.py | 75 + .../android/gyp/javac_output_processor.py | 225 +- naiveproxy/src/build/android/gyp/lint.py | 18 +- .../src/build/android/gyp/merge_manifest.py | 11 +- naiveproxy/src/build/android/gyp/proguard.py | 8 + naiveproxy/src/build/android/gyp/turbine.py | 8 +- .../src/build/android/gyp/turbine.pydeps | 6 - .../src/build/android/gyp/util/jar_utils.py | 47 +- .../build/android/gyp/util/java_cpp_utils.py | 60 +- .../build/android/gyp/util/manifest_utils.py | 7 + .../android/gyp/util/params_json_util.py | 65 +- .../build/android/gyp/write_build_config.py | 246 +- .../java/templates/BuildConfig.template | 7 + .../src/build/android/list_java_targets.py | 98 +- .../build/android/location_rewriter/BUILD.gn | 29 + .../src/build/android/native_flags/BUILD.gn | 6 + .../pylib/gtest/gtest_test_instance.py | 15 + .../instrumentation_test_instance.py | 2 +- .../local/device/local_device_environment.py | 17 + .../local/device/local_device_gtest_run.py | 3 +- .../local_device_instrumentation_test_run.py | 51 +- .../build/android/pylib/local/emulator/avd.py | 11 + .../machine/local_machine_junit_test_run.py | 4 +- naiveproxy/src/build/android/test_runner.py | 69 +- .../src/build/android/test_runner.pydeps | 1 + .../src/build/android/test_runner_test.py | 6 +- .../build/android/unused_resources/BUILD.gn | 2 +- .../unused_resources/UnusedResources.java | 104 +- .../src/build/check_gn_headers_allowlist.txt | 4 - naiveproxy/src/build/chromeos/test_runner.py | 38 +- naiveproxy/src/build/config/BUILD.gn | 2 +- naiveproxy/src/build/config/BUILDCONFIG.gn | 78 +- .../src/build/config/android/config.gni | 69 +- .../build/config/android/internal_rules.gni | 280 +- naiveproxy/src/build/config/android/rules.gni | 117 +- .../android/test/resource_overlay/BUILD.gn | 14 + .../src/build/config/apple/apple_sdk.gni | 20 + naiveproxy/src/build/config/apple/arch.gni | 43 + naiveproxy/src/build/config/apple/codesign.py | 167 +- .../config/apple/create_signed_bundle.gni | 13 +- naiveproxy/src/build/config/apple/sdk_info.py | 4 +- naiveproxy/src/build/config/avx512.gni | 9 + .../build/config/buildflags_paint_preview.gni | 1 - naiveproxy/src/build/config/c++/BUILD.gn | 14 + naiveproxy/src/build/config/c++/c++.gni | 39 +- naiveproxy/src/build/config/c++/libc++.natvis | 214 +- naiveproxy/src/build/config/c++/modules.gni | 93 +- naiveproxy/src/build/config/chrome_build.gni | 17 +- naiveproxy/src/build/config/chromeos/BUILD.gn | 11 + naiveproxy/src/build/config/clang/BUILD.gn | 62 +- naiveproxy/src/build/config/clang/clang.gni | 71 +- naiveproxy/src/build/config/compiler/BUILD.gn | 234 +- .../src/build/config/compiler/compiler.gni | 35 +- naiveproxy/src/build/config/cronet/config.gni | 44 +- naiveproxy/src/build/config/freetype/BUILD.gn | 21 +- .../src/build/config/fuchsia/gn_configs.gni | 2 +- .../perf_optimized_cast_receiver_args.gn | 5 +- naiveproxy/src/build/config/ios/BUILD.gn | 50 +- .../src/build/config/ios/ios_app_ipa.gni | 42 + naiveproxy/src/build/config/ios/ios_sdk.gni | 2 + .../build/config/ios/ios_sdk_overrides.gni | 10 +- .../src/build/config/ios/package_ipa.py | 33 + naiveproxy/src/build/config/ios/rules.gni | 39 +- .../src/build/config/linux/atk/BUILD.gn | 1 - naiveproxy/src/build/config/locales.gni | 1 - naiveproxy/src/build/config/mac/BUILD.gn | 30 +- naiveproxy/src/build/config/mac/mac_sdk.gni | 5 +- naiveproxy/src/build/config/mac/rules.gni | 19 + naiveproxy/src/build/config/pch.gni | 5 +- naiveproxy/src/build/config/rust.gni | 49 +- .../src/build/config/sanitizers/BUILD.gn | 4 + .../build/config/sanitizers/sanitizers.gni | 5 + naiveproxy/src/build/config/siso/README.md | 4 +- naiveproxy/src/build/config/siso/android.star | 8 +- .../config/siso/backend_config/README.md | 2 +- .../config/siso/backend_config/template.star | 2 +- .../src/build/config/siso/blink_all.star | 6 + .../src/build/config/siso/clang_all.star | 165 +- .../siso/clang_code_coverage_wrapper.star | 17 +- .../src/build/config/siso/clang_linux.star | 3 +- .../src/build/config/siso/clang_mac.star | 2 +- .../src/build/config/siso/clang_unix.star | 34 +- .../src/build/config/siso/clang_windows.star | 2 +- naiveproxy/src/build/config/siso/config.star | 4 + .../src/build/config/siso/configure_siso.py | 56 +- naiveproxy/src/build/config/siso/cros.star | 295 +- naiveproxy/src/build/config/siso/mac.star | 29 + naiveproxy/src/build/config/siso/rust.star | 14 +- naiveproxy/src/build/config/squid/BUILD.gn | 11 + naiveproxy/src/build/config/squid/README.md | 3 + .../src/build/config/squid/buildflags.gni | 8 + .../src/build/config/unsafe_buffers_paths.txt | 7 +- .../src/build/config/warning_suppression.txt | 22 + naiveproxy/src/build/config/win/BUILD.gn | 20 +- naiveproxy/src/build/dotfile_settings.gni | 2 - naiveproxy/src/build/fuchsia/cipd/BUILD.gn | 9 + naiveproxy/src/build/fuchsia/gcs_download.py | 2 +- .../src/build/fuchsia/gcs_download_test.py | 2 +- .../src/build/fuchsia/linux_internal.sdk.sha1 | 2 +- .../src/build/fuchsia/test/perf_trace.py | 7 +- naiveproxy/src/build/get_landmines.py | 2 + naiveproxy/src/build/gn_ast/json_gn_editor.py | 17 +- naiveproxy/src/build/install-build-deps.py | 4 +- .../src/build/linux/amd64/module.modulemap | 85 - naiveproxy/src/build/linux/dump_app_syms.py | 3 +- .../src/build/linux/unbundle/highway.gn | 3 + naiveproxy/src/build/linux/unbundle/icu.gn | 4 + naiveproxy/src/build/mac_toolchain.py | 15 +- .../src/build/modules/android-arm/BUILD.gn | 267 + .../modules/android-arm/module.modulemap.in | 361 + .../src/build/modules/android-arm64/BUILD.gn | 267 + .../modules/android-arm64/module.modulemap.in | 373 + .../src/build/modules/android-x64/BUILD.gn | 267 + .../modules/android-x64/module.modulemap.in | 369 + .../src/build/modules/android-x86/BUILD.gn | 267 + .../modules/android-x86/module.modulemap.in | 369 + naiveproxy/src/build/modules/fuchsia/BUILD.gn | 219 + .../build/modules/fuchsia/module.modulemap.in | 94 + .../src/build/modules/linux-x64/BUILD.gn | 24 +- .../build/modules/linux-x64/module.modulemap | 126 - .../modules/linux-x64/module.modulemap.in | 141 + naiveproxy/src/build/modules/linux/BUILD.gn | 248 + .../build/modules/linux/module.modulemap.in | 121 + .../src/build/modules/mac_xcode2600/BUILD.gn | 398 ++ .../src/build/modules/modularize/OWNERS | 8 + .../src/build/modules/modularize/README.md | 32 + .../src/build/modules/modularize/compiler.py | 286 +- .../build/modules/modularize/compiler_test.py | 73 +- .../src/build/modules/modularize/config.py | 243 +- .../src/build/modules/modularize/graph.py | 285 +- .../build/modules/modularize/modularize.py | 202 +- .../src/build/modules/modularize/modulemap.py | 173 + .../modules/modularize/modulemap_test.py | 144 + .../src/build/modules/modularize/platforms.py | 25 + .../src/build/modules/modularize/render.py | 158 +- .../submodule.framework/Headers/other.h | 10 + .../submodule.framework/Headers/umbrella.h} | 0 .../nested.framework/Headers/nested.h} | 0 .../nested.framework/Modules/module.modulemap | 12 + .../simple.framework/Headers/simple.h | 0 .../simple.framework/Modules/module.modulemap | 8 + .../umbrella.framework/Headers/first.h | 0 .../umbrella.framework/Headers/second.h | 0 .../Modules/module.modulemap | 8 + .../modularize/testdata/sysroot/first.h | 0 .../modularize/testdata/sysroot/first/first.h | 0 .../testdata/sysroot/first_textual.h | 0 .../importable.modulemap} | 17 +- .../testdata/sysroot/module.modulemap | 10 + .../modularize/testdata/sysroot/second.h | 0 .../testdata/sysroot/second_textual.h | 0 .../testdata/sysroot/subdir/module.modulemap | 8 + .../testdata/sysroot/subdir/subdir.h | 0 naiveproxy/src/build/modules/win-x64/BUILD.gn | 246 + .../build/modules/win-x64/module.modulemap.in | 224 + naiveproxy/src/build/nocompile.gni | 3 - .../build/private_code_test/ninja_parser.py | 211 +- .../private_code_test/private_code_test.gni | 45 +- .../private_code_test/private_code_test.py | 8 +- naiveproxy/src/build/rust/BUILD.gn | 13 +- naiveproxy/src/build/rust/allocator/lib.rs | 6 +- naiveproxy/src/build/rust/cargo_crate.gni | 21 +- .../rust/chromium_prelude/import_attribute.rs | 6 + naiveproxy/src/build/rust/gni_impl/BUILD.gn | 23 + .../build/rust/gni_impl/run_build_script.py | 55 +- .../src/build/rust/gni_impl/rust_target.gni | 16 +- .../build/rust/gni_impl/rustc_print_cfg.gni | 14 + .../build/rust/gni_impl/rustc_print_cfg.py | 57 + .../src/build/rust/gni_impl/rustc_wrapper.py | 88 +- .../src/build/rust/rust_bindgen_generator.gni | 6 - naiveproxy/src/build/rust/rust_executable.gni | 2 +- .../src/build/rust/rust_static_library.gni | 10 +- naiveproxy/src/build/rust/rust_unit_test.gni | 6 +- naiveproxy/src/build/rust/std/BUILD.gn | 1 - .../src/build/rust/std/find_std_rlibs.py | 1 + naiveproxy/src/build/rust/std/rules/BUILD.gn | 893 ++- .../bindgen_cpp_test_with_cpp_linkage/lib.rs | 2 +- .../rust_calling_cpp_rlib.rs | 2 +- .../rust/tests/test_rust_metadata/lib.rs | 2 +- naiveproxy/src/build/sanitizers/dlcloseshim.c | 3 +- .../src/build/sanitizers/sanitizer_options.cc | 5 - .../build/toolchain/apple/compile_xcassets.py | 20 + .../src/build/toolchain/apple/swiftc.py | 19 +- .../src/build/toolchain/apple/toolchain.gni | 24 +- .../toolchain/clang_code_coverage_wrapper.py | 17 +- naiveproxy/src/build/toolchain/cros/BUILD.gn | 134 +- .../src/build/toolchain/cros/cros_config.gni | 15 - .../build/toolchain/cros/get_resource_dir.py | 33 - .../src/build/toolchain/cros_toolchain.gni | 35 +- .../src/build/toolchain/gcc_toolchain.gni | 26 +- naiveproxy/src/build/toolchain/ios/BUILD.gn | 137 +- naiveproxy/src/build/toolchain/mac/BUILD.gn | 26 - naiveproxy/src/build/toolchain/rbe.gni | 11 +- naiveproxy/src/build/toolchain/toolchain.gni | 18 +- naiveproxy/src/build/toolchain/wasm/BUILD.gn | 6 +- .../build/toolchain/win/setup_toolchain.py | 38 +- naiveproxy/src/build/util/BUILD.gn | 6 +- naiveproxy/src/build/util/LASTCHANGE | 2 +- .../src/build/util/LASTCHANGE.committime | 2 +- .../src/build/util/android_chrome_version.py | 11 + .../build/util/android_chrome_version_test.py | 6 + naiveproxy/src/build/vs_toolchain.py | 39 +- naiveproxy/src/build/win/BUILD.gn | 1 + naiveproxy/src/build/xcode_binaries.yaml | 44 +- naiveproxy/src/build/zip_helpers.py | 17 +- naiveproxy/src/build_overrides/build.gni | 4 +- .../src/build_overrides/partition_alloc.gni | 35 +- naiveproxy/src/buildtools/deps_revisions.gni | 2 +- .../buildtools/third_party/libc++/BUILD.gn | 675 +- .../libc++/generate_libcxx_headers.py | 19 +- .../third_party/libc++/libcxx_headers.gni | 23 +- .../buildtools/third_party/libc++/modules.gni | 309 +- .../buildtools/third_party/libc++abi/BUILD.gn | 12 +- naiveproxy/src/chrome/VERSION | 6 +- .../src/chrome/android/profiles/newest.txt | 2 +- .../src/chrome/build/android-arm32.pgo.txt | 2 +- .../src/chrome/build/android-arm64.pgo.txt | 2 +- .../build/android-desktop-arm64.pgo.txt | 2 +- .../chrome/build/android-desktop-x64.pgo.txt | 2 +- naiveproxy/src/chrome/build/linux.pgo.txt | 2 +- naiveproxy/src/chrome/build/mac-arm.pgo.txt | 2 +- naiveproxy/src/chrome/build/mac.pgo.txt | 2 +- naiveproxy/src/chrome/build/win-arm64.pgo.txt | 2 +- naiveproxy/src/chrome/build/win32.pgo.txt | 2 +- naiveproxy/src/chrome/build/win64.pgo.txt | 2 +- naiveproxy/src/chrome/version.gni | 137 +- naiveproxy/src/components/cbor/BUILD.gn | 23 + naiveproxy/src/components/cbor/DIR_METADATA | 7 + naiveproxy/src/components/cbor/OWNERS | 2 + naiveproxy/src/components/cbor/cbor_export.h | 25 + naiveproxy/src/components/cbor/constants.h | 37 + .../src/components/cbor/diagnostic_writer.cc | 168 + .../src/components/cbor/diagnostic_writer.h | 29 + .../src/components/cbor/float_conversions.cc | 82 + .../src/components/cbor/float_conversions.h | 23 + naiveproxy/src/components/cbor/reader.cc | 508 ++ naiveproxy/src/components/cbor/reader.h | 228 + .../cbor/reader_fuzzer_corpus/cbor0 | Bin 0 -> 1 bytes .../cbor/reader_fuzzer_corpus/cbor1 | 1 + .../cbor/reader_fuzzer_corpus/cbor10 | 1 + .../cbor/reader_fuzzer_corpus/cbor11 | Bin 0 -> 11 bytes .../cbor/reader_fuzzer_corpus/cbor12 | 1 + .../cbor/reader_fuzzer_corpus/cbor13 | Bin 0 -> 11 bytes .../cbor/reader_fuzzer_corpus/cbor14 | 1 + .../cbor/reader_fuzzer_corpus/cbor15 | 1 + .../cbor/reader_fuzzer_corpus/cbor16 | 1 + .../cbor/reader_fuzzer_corpus/cbor17 | 1 + .../cbor/reader_fuzzer_corpus/cbor18 | Bin 0 -> 3 bytes .../cbor/reader_fuzzer_corpus/cbor19 | Bin 0 -> 3 bytes .../cbor/reader_fuzzer_corpus/cbor2 | 1 + .../cbor/reader_fuzzer_corpus/cbor20 | Bin 0 -> 3 bytes .../cbor/reader_fuzzer_corpus/cbor21 | 1 + .../cbor/reader_fuzzer_corpus/cbor22 | Bin 0 -> 3 bytes .../cbor/reader_fuzzer_corpus/cbor23 | 1 + .../cbor/reader_fuzzer_corpus/cbor24 | Bin 0 -> 5 bytes .../cbor/reader_fuzzer_corpus/cbor25 | 1 + .../cbor/reader_fuzzer_corpus/cbor26 | Bin 0 -> 9 bytes .../cbor/reader_fuzzer_corpus/cbor27 | Bin 0 -> 3 bytes .../cbor/reader_fuzzer_corpus/cbor28 | Bin 0 -> 3 bytes .../cbor/reader_fuzzer_corpus/cbor29 | Bin 0 -> 3 bytes .../cbor/reader_fuzzer_corpus/cbor3 | 1 + .../cbor/reader_fuzzer_corpus/cbor30 | 1 + .../cbor/reader_fuzzer_corpus/cbor31 | Bin 0 -> 3 bytes .../cbor/reader_fuzzer_corpus/cbor32 | Bin 0 -> 3 bytes .../cbor/reader_fuzzer_corpus/cbor33 | Bin 0 -> 3 bytes .../cbor/reader_fuzzer_corpus/cbor34 | Bin 0 -> 5 bytes .../cbor/reader_fuzzer_corpus/cbor35 | Bin 0 -> 5 bytes .../cbor/reader_fuzzer_corpus/cbor36 | Bin 0 -> 5 bytes .../cbor/reader_fuzzer_corpus/cbor37 | Bin 0 -> 9 bytes .../cbor/reader_fuzzer_corpus/cbor38 | Bin 0 -> 9 bytes .../cbor/reader_fuzzer_corpus/cbor39 | Bin 0 -> 9 bytes .../cbor/reader_fuzzer_corpus/cbor4 | 1 + .../cbor/reader_fuzzer_corpus/cbor40 | 1 + .../cbor/reader_fuzzer_corpus/cbor41 | 1 + .../cbor/reader_fuzzer_corpus/cbor42 | 1 + .../cbor/reader_fuzzer_corpus/cbor43 | 1 + .../cbor/reader_fuzzer_corpus/cbor44 | 1 + .../cbor/reader_fuzzer_corpus/cbor45 | 1 + .../cbor/reader_fuzzer_corpus/cbor46 | 1 + .../cbor/reader_fuzzer_corpus/cbor47 | 1 + .../cbor/reader_fuzzer_corpus/cbor48 | 1 + .../cbor/reader_fuzzer_corpus/cbor49 | Bin 0 -> 10 bytes .../cbor/reader_fuzzer_corpus/cbor5 | 1 + .../cbor/reader_fuzzer_corpus/cbor50 | 1 + .../cbor/reader_fuzzer_corpus/cbor51 | 1 + .../cbor/reader_fuzzer_corpus/cbor52 | 1 + .../cbor/reader_fuzzer_corpus/cbor53 | 1 + .../cbor/reader_fuzzer_corpus/cbor54 | 1 + .../cbor/reader_fuzzer_corpus/cbor55 | 1 + .../cbor/reader_fuzzer_corpus/cbor56 | 1 + .../cbor/reader_fuzzer_corpus/cbor57 | 1 + .../cbor/reader_fuzzer_corpus/cbor58 | 1 + .../cbor/reader_fuzzer_corpus/cbor59 | 1 + .../cbor/reader_fuzzer_corpus/cbor6 | 1 + .../cbor/reader_fuzzer_corpus/cbor60 | 1 + .../cbor/reader_fuzzer_corpus/cbor61 | 1 + .../cbor/reader_fuzzer_corpus/cbor62 | 1 + .../cbor/reader_fuzzer_corpus/cbor63 | 1 + .../cbor/reader_fuzzer_corpus/cbor64 | 1 + .../cbor/reader_fuzzer_corpus/cbor65 | 2 + .../cbor/reader_fuzzer_corpus/cbor66 | 1 + .../cbor/reader_fuzzer_corpus/cbor67 | 1 + .../cbor/reader_fuzzer_corpus/cbor68 | 1 + .../cbor/reader_fuzzer_corpus/cbor69 | 1 + .../cbor/reader_fuzzer_corpus/cbor7 | 1 + .../cbor/reader_fuzzer_corpus/cbor70 | 1 + .../cbor/reader_fuzzer_corpus/cbor71 | 1 + .../cbor/reader_fuzzer_corpus/cbor72 | 1 + .../cbor/reader_fuzzer_corpus/cbor73 | 1 + .../cbor/reader_fuzzer_corpus/cbor74 | 1 + .../cbor/reader_fuzzer_corpus/cbor75 | 1 + .../cbor/reader_fuzzer_corpus/cbor76 | 1 + .../cbor/reader_fuzzer_corpus/cbor77 | 1 + .../cbor/reader_fuzzer_corpus/cbor78 | 2 + .../cbor/reader_fuzzer_corpus/cbor79 | 1 + .../cbor/reader_fuzzer_corpus/cbor8 | Bin 0 -> 5 bytes .../cbor/reader_fuzzer_corpus/cbor80 | 1 + .../cbor/reader_fuzzer_corpus/cbor81 | 1 + .../cbor/reader_fuzzer_corpus/cbor9 | Bin 0 -> 9 bytes naiveproxy/src/components/cbor/values.cc | 318 + naiveproxy/src/components/cbor/values.h | 219 + naiveproxy/src/components/cbor/writer.cc | 246 + naiveproxy/src/components/cbor/writer.h | 120 + .../miracle_parameter/COMMON_METADATA | 3 - .../src/components/miracle_parameter/OWNERS | 4 - .../components/miracle_parameter/README.md | 5 - .../miracle_parameter/common/BUILD.gn | 16 - .../common/public/miracle_parameter.cc | 77 - .../common/public/miracle_parameter.h | 138 - .../network_time/network_time_tracker.cc | 11 +- .../network_time/network_time_tracker.h | 2 +- .../src/components/unexportable_keys/BUILD.gn | 40 - .../src/components/unexportable_keys/OWNERS | 1 + .../fake_unexportable_key_service.cc | 1 - .../fake_unexportable_key_service.h | 1 - .../components/unexportable_keys/features.cc | 1 - .../mock_unexportable_key_provider.cc | 12 + .../mock_unexportable_key_provider.h | 42 + .../mock_unexportable_key_service.h | 1 - .../unexportable_keys/service_error.h | 4 +- .../unexportable_key_service.h | 10 +- .../unexportable_key_service_impl.cc | 3 +- .../unexportable_key_service_impl.h | 1 - .../unexportable_key_task_manager.cc | 8 +- .../unexportable_key_task_manager.h | 4 +- .../unexportable_key_tasks.cc | 21 +- naiveproxy/src/crypto/BUILD.gn | 29 +- naiveproxy/src/crypto/DEPS | 2 + naiveproxy/src/crypto/apple/keychain.cc | 30 +- naiveproxy/src/crypto/apple/keychain.h | 3 +- .../src/crypto/apple/keychain_seckeychain.cc | 63 - .../src/crypto/apple/keychain_seckeychain.h | 33 - naiveproxy/src/crypto/apple/keychain_v2.h | 2 + naiveproxy/src/crypto/apple/mock_keychain.h | 3 +- .../src/crypto/{ => apple}/scoped_lacontext.h | 10 +- .../crypto/{ => apple}/scoped_lacontext.mm | 10 +- .../crypto/apple/security_framework_lock.cc | 17 + .../crypto/apple/security_framework_lock.h | 28 + .../crypto/{ => apple}/unexportable_key_mac.h | 10 +- .../{ => apple}/unexportable_key_mac.mm | 48 +- naiveproxy/src/crypto/cose.cc | 125 + naiveproxy/src/crypto/cose.h | 23 + naiveproxy/src/crypto/ecdsa_utils.cc | 63 + naiveproxy/src/crypto/ecdsa_utils.h | 40 + naiveproxy/src/crypto/features.cc | 9 +- naiveproxy/src/crypto/features.gni | 2 - naiveproxy/src/crypto/features.h | 3 - naiveproxy/src/crypto/hash.cc | 28 + naiveproxy/src/crypto/hash.h | 13 + naiveproxy/src/crypto/hmac.cc | 68 +- naiveproxy/src/crypto/hmac.h | 66 +- naiveproxy/src/crypto/kex.cc | 27 + naiveproxy/src/crypto/kex.h | 29 + naiveproxy/src/crypto/keypair.cc | 164 +- naiveproxy/src/crypto/keypair.h | 37 +- .../src/crypto/mac_security_services_lock.cc | 17 - .../src/crypto/mac_security_services_lock.h | 25 - naiveproxy/src/crypto/nss_util.cc | 27 +- naiveproxy/src/crypto/nss_util_chromeos.cc | 71 +- naiveproxy/src/crypto/obsolete/md5.cc | 2 + naiveproxy/src/crypto/obsolete/md5.h | 105 +- naiveproxy/src/crypto/obsolete/sha1.cc | 79 + naiveproxy/src/crypto/obsolete/sha1.h | 70 + naiveproxy/src/crypto/pem.cc | 44 + naiveproxy/src/crypto/pem.h | 45 + naiveproxy/src/crypto/process_bound_string.h | 11 +- naiveproxy/src/crypto/rsa_private_key.cc | 85 - naiveproxy/src/crypto/rsa_private_key.h | 60 - ...scoped_fake_user_verifying_key_provider.cc | 31 +- .../scoped_fake_user_verifying_key_provider.h | 18 +- naiveproxy/src/crypto/secure_hash.cc | 16 - naiveproxy/src/crypto/secure_hash.h | 6 - naiveproxy/src/crypto/subtle_passkey.h | 20 + naiveproxy/src/crypto/test/data/not-pem.txt | 1 + .../src/crypto/test/data/one-message.pem | 3 + .../src/crypto/test/data/plain-text.txt | 1 + .../src/crypto/test/data/three-messages.pem | 9 + naiveproxy/src/crypto/test_support.cc | 102 +- naiveproxy/src/crypto/test_support.h | 9 +- naiveproxy/src/crypto/unexportable_key.cc | 22 +- naiveproxy/src/crypto/unexportable_key_win.h | 17 +- naiveproxy/src/crypto/user_verifying_key.cc | 28 +- naiveproxy/src/crypto/user_verifying_key.h | 13 +- .../src/crypto/user_verifying_key_mac.mm | 11 +- .../src/crypto/user_verifying_key_win.cc | 5 +- naiveproxy/src/ios/features.gni | 11 +- naiveproxy/src/ipc/ipc_param_traits.h | 34 - naiveproxy/src/net/BUILD.gn | 54 +- naiveproxy/src/net/DEPS | 1 - ...etwork_change_notifier_delegate_android.cc | 1 - .../unittest_support/AndroidManifest.xml | 4 + naiveproxy/src/net/base/address_family.cc | 14 + naiveproxy/src/net/base/address_family.h | 5 + .../src/net/base/address_tracker_linux.cc | 69 +- .../src/net/base/address_tracker_linux.h | 44 +- .../src/net/base/apple/url_conversions.mm | 6 +- naiveproxy/src/net/base/directory_listing.cc | 65 +- naiveproxy/src/net/base/directory_listing.h | 7 +- naiveproxy/src/net/base/features.cc | 557 +- naiveproxy/src/net/base/features.h | 234 +- naiveproxy/src/net/base/filename_util.cc | 10 +- .../src/net/base/filename_util_internal.cc | 4 +- naiveproxy/src/net/base/host_port_pair.cc | 9 +- naiveproxy/src/net/base/host_port_pair.h | 6 +- naiveproxy/src/net/base/ip_address.cc | 4 +- naiveproxy/src/net/base/ip_address.h | 9 +- naiveproxy/src/net/base/ip_endpoint.cc | 3 +- naiveproxy/src/net/base/ip_endpoint.h | 3 +- naiveproxy/src/net/base/isolation_info.cc | 1 + naiveproxy/src/net/base/load_flags_list.h | 29 +- .../src/net/base/load_flags_to_string.h | 2 +- .../src/net/base/load_timing_internal_info.h | 26 + .../base/logging_network_change_observer.cc | 6 +- .../base/logging_network_change_observer.h | 3 +- naiveproxy/src/net/base/mime_sniffer.cc | 4 +- naiveproxy/src/net/base/mime_util.cc | 30 +- naiveproxy/src/net/base/mime_util.h | 22 +- .../src/net/base/mock_proxy_delegate.cc | 13 + naiveproxy/src/net/base/mock_proxy_delegate.h | 81 + naiveproxy/src/net/base/net_error_list.h | 25 +- .../src/net/base/network_change_notifier.cc | 35 +- .../src/net/base/network_change_notifier.h | 21 +- .../net/base/network_change_notifier_apple.h | 12 + .../net/base/network_change_notifier_apple.mm | 176 +- .../net/base/network_change_notifier_linux.cc | 7 +- .../base/network_change_notifier_passive.cc | 5 +- .../base/network_change_notifier_passive.h | 2 +- .../src/net/base/network_isolation_key.h | 6 + naiveproxy/src/net/base/pickle_traits.h | 2 +- naiveproxy/src/net/base/proxy_chain.cc | 35 + naiveproxy/src/net/base/proxy_chain.h | 18 +- naiveproxy/src/net/base/proxy_delegate.cc | 20 + naiveproxy/src/net/base/proxy_delegate.h | 53 +- naiveproxy/src/net/base/proxy_server.cc | 2 +- .../effective_tld_names.dat | 535 +- .../effective_tld_names.gperf | 239 +- .../registry_controlled_domain.cc | 23 +- naiveproxy/src/net/base/request_priority.cc | 2 + .../net/base/scheme_host_port_matcher_rule.cc | 11 +- naiveproxy/src/net/base/schemeful_site.h | 4 + .../src/net/base/sockaddr_util_posix.cc | 61 +- naiveproxy/src/net/base/sockaddr_util_posix.h | 4 +- naiveproxy/src/net/base/task/task_runner.cc | 8 +- naiveproxy/src/net/base/task/task_runner.h | 7 +- .../src/net/base/test_proxy_delegate.cc | 111 +- naiveproxy/src/net/base/test_proxy_delegate.h | 82 +- .../net/base/upload_bytes_element_reader.cc | 5 - .../net/base/upload_bytes_element_reader.h | 1 - .../src/net/base/upload_element_reader.cc | 8 - .../src/net/base/upload_element_reader.h | 10 - .../net/base/upload_file_element_reader.cc | 4 - .../src/net/base/upload_file_element_reader.h | 1 - naiveproxy/src/net/base/url_search_params.h | 3 + .../src/net/base/url_search_params_view.cc | 141 + .../src/net/base/url_search_params_view.h | 116 + .../src/net/base/url_unescape_iterator.cc | 131 + .../src/net/base/url_unescape_iterator.h | 198 + naiveproxy/src/net/base/url_util.cc | 40 +- naiveproxy/src/net/base/url_util.h | 5 +- naiveproxy/src/net/cert/cert_verifier.cc | 3 +- naiveproxy/src/net/cert/cert_verify_proc.cc | 121 +- naiveproxy/src/net/cert/cert_verify_proc.h | 2 +- .../src/net/cert/cert_verify_proc_android.cc | 9 +- .../net/cert/cert_verify_proc_blocklist.inc | 4 +- .../src/net/cert/cert_verify_proc_builtin.cc | 25 +- .../src/net/cert/cert_verify_proc_ios.cc | 40 +- .../src/net/cert/coalescing_cert_verifier.cc | 5 +- naiveproxy/src/net/cert/crl_set.cc | 52 +- naiveproxy/src/net/cert/crl_set.h | 7 +- naiveproxy/src/net/cert/ct_log_verifier.cc | 15 +- .../src/net/cert/ct_objects_extractor.cc | 18 +- .../src/net/cert/ct_objects_extractor.h | 2 +- naiveproxy/src/net/cert/ct_serialization.cc | 6 +- .../cert_issuer_source_sync_unittest.h | 29 +- .../net/cert/internal/revocation_checker.cc | 4 +- .../src/net/cert/internal/test_helpers.cc | 47 - .../src/net/cert/internal/test_helpers.h | 33 - .../net/cert/internal/trust_store_android.h | 1 + .../src/net/cert/internal/trust_store_mac.cc | 18 +- .../src/net/cert/internal/trust_store_nss.cc | 7 - .../src/net/cert/internal/trust_store_nss.h | 8 +- .../src/net/cert/internal/trust_store_win.cc | 13 +- naiveproxy/src/net/cert/nss_cert_database.cc | 213 +- naiveproxy/src/net/cert/nss_cert_database.h | 77 - .../net/cert/nss_cert_database_chromeos.cc | 45 +- .../src/net/cert/nss_cert_database_chromeos.h | 16 - naiveproxy/src/net/cert/signed_tree_head.cc | 4 +- naiveproxy/src/net/cert/signed_tree_head.h | 3 +- naiveproxy/src/net/cert/two_qwac.cc | 80 +- naiveproxy/src/net/cert/two_qwac.h | 5 +- naiveproxy/src/net/cert/x509_certificate.cc | 100 +- naiveproxy/src/net/cert/x509_certificate.h | 41 +- naiveproxy/src/net/cookies/OWNERS | 1 + .../src/net/cookies/canonical_cookie.cc | 61 +- naiveproxy/src/net/cookies/canonical_cookie.h | 20 +- .../canonical_cookie_proto_converter.cc | 1 + naiveproxy/src/net/cookies/cookie_base.cc | 5 +- naiveproxy/src/net/cookies/cookie_base.h | 4 +- .../net/cookies/cookie_change_dispatcher.h | 4 + .../src/net/cookies/cookie_constants.cc | 1 + .../src/net/cookies/cookie_deletion_info.h | 1 + naiveproxy/src/net/cookies/cookie_monster.cc | 14 +- .../src/net/cookies/cookie_partition_key.cc | 1 + .../cookies/cookie_store_change_unittest.h | 198 +- .../net/cookies/cookie_store_test_helpers.cc | 2 +- .../net/cookies/cookie_store_test_helpers.h | 3 +- .../src/net/cookies/cookie_store_unittest.h | 10 +- naiveproxy/src/net/cookies/cookie_util.cc | 49 +- naiveproxy/src/net/cookies/cookie_util.h | 42 +- naiveproxy/src/net/cookies/parsed_cookie.cc | 81 +- naiveproxy/src/net/cookies/parsed_cookie.h | 57 +- .../src/net/cookies/site_for_cookies.cc | 1 + .../src/net/data/ssl/chrome_root_store/OWNERS | 6 +- .../ssl/chrome_root_store/additional.certs | 1037 +++ .../ssl/chrome_root_store/root_store.certs | 126 - .../data/ssl/chrome_root_store/root_store.md | 7 +- .../chrome_root_store/root_store.textproto | 130 +- .../device_bound_sessions/cookie_craving.cc | 130 +- .../device_bound_sessions/cookie_craving.h | 30 +- .../net/device_bound_sessions/jwk_utils.cc | 67 +- .../src/net/device_bound_sessions/jwk_utils.h | 8 + .../mock_session_service.h | 31 +- .../registration_fetcher.cc | 910 ++- .../registration_fetcher.h | 41 +- .../registration_fetcher_param.cc | 57 +- .../registration_fetcher_param.h | 31 +- .../registration_result.cc | 62 + .../registration_result.h | 66 + .../src/net/device_bound_sessions/session.cc | 205 +- .../src/net/device_bound_sessions/session.h | 40 +- .../session_binding_utils.cc | 81 +- .../session_binding_utils.h | 20 +- .../session_challenge_param.cc | 12 +- .../session_challenge_param.h | 12 +- .../device_bound_sessions/session_error.cc | 125 +- .../net/device_bound_sessions/session_error.h | 79 +- .../session_inclusion_rules.cc | 37 +- .../session_inclusion_rules.h | 9 +- .../session_json_utils.cc | 144 +- .../session_json_utils.h | 3 + .../net/device_bound_sessions/session_key.h | 1 + .../device_bound_sessions/session_params.cc | 8 + .../device_bound_sessions/session_params.h | 15 + .../device_bound_sessions/session_service.h | 87 +- .../session_service_impl.cc | 678 +- .../session_service_impl.h | 133 +- .../session_store_impl.cc | 7 +- .../session_store_impl.h | 1 + .../net/device_bound_sessions/test_support.cc | 102 +- .../net/device_bound_sessions/test_support.h | 3 +- .../unexportable_key_service_factory.cc | 13 +- .../net/device_bound_sessions/url_fetcher.cc | 122 + .../net/device_bound_sessions/url_fetcher.h | 58 + .../net/disk_cache/blockfile/backend_impl.cc | 10 +- .../src/net/disk_cache/blockfile/entry_impl.h | 1 + .../src/net/disk_cache/blockfile/file_ios.cc | 4 +- naiveproxy/src/net/disk_cache/disk_cache.cc | 2 + naiveproxy/src/net/disk_cache/disk_cache.h | 4 + .../net/disk_cache/disk_cache_test_base.cc | 28 +- .../src/net/disk_cache/disk_cache_test_base.h | 3 + .../net/disk_cache/memory/mem_backend_impl.cc | 16 +- .../net/disk_cache/memory/mem_backend_impl.h | 9 +- .../disk_cache/simple/simple_backend_impl.cc | 3 +- .../src/net/disk_cache/simple/simple_index.cc | 4 +- .../src/net/disk_cache/simple/simple_util.cc | 7 + .../src/net/disk_cache/simple/simple_util.h | 5 +- naiveproxy/src/net/disk_cache/sql/DEPS | 2 + .../src/net/disk_cache/sql/cache_entry_key.cc | 7 +- .../src/net/disk_cache/sql/cache_entry_key.h | 8 +- .../sql/eviction_candidate_aggregator.cc | 136 + .../sql/eviction_candidate_aggregator.h | 109 + .../src/net/disk_cache/sql/indexed_pair_set.h | 176 + .../disk_cache/sql/sql_backend_constants.h | 79 +- .../net/disk_cache/sql/sql_backend_impl.cc | 879 ++- .../src/net/disk_cache/sql/sql_backend_impl.h | 265 +- .../src/net/disk_cache/sql/sql_entry_impl.cc | 89 +- .../src/net/disk_cache/sql/sql_entry_impl.h | 22 +- .../disk_cache/sql/sql_persistent_store.cc | 2926 ++------ .../net/disk_cache/sql/sql_persistent_store.h | 430 +- .../sql/sql_persistent_store_backend.cc | 2364 +++++++ .../sql/sql_persistent_store_backend.h | 340 + .../sql/sql_persistent_store_backend_shard.cc | 439 ++ .../sql/sql_persistent_store_backend_shard.h | 194 + .../sql_persistent_store_in_memory_index.cc | 80 + .../sql_persistent_store_in_memory_index.h | 137 + .../sql/sql_persistent_store_queries.h | 326 +- naiveproxy/src/net/dns/BUILD.gn | 4 + .../src/net/dns/address_sorter_posix.cc | 5 +- naiveproxy/src/net/dns/address_sorter_posix.h | 3 +- .../src/net/dns/context_host_resolver.cc | 5 + naiveproxy/src/net/dns/dns_alias_utility.cc | 2 +- naiveproxy/src/net/dns/dns_client.cc | 35 +- naiveproxy/src/net/dns/dns_client.h | 10 + .../src/net/dns/dns_config_service_win.cc | 3 +- naiveproxy/src/net/dns/dns_names_util.cc | 4 +- naiveproxy/src/net/dns/dns_response.cc | 42 +- naiveproxy/src/net/dns/dns_server_iterator.cc | 4 +- naiveproxy/src/net/dns/dns_transaction.cc | 24 +- .../dns/filtering_details_url_generator.cc | 46 + .../net/dns/filtering_details_url_generator.h | 37 + naiveproxy/src/net/dns/host_cache.cc | 4 +- naiveproxy/src/net/dns/host_resolver.cc | 10 +- naiveproxy/src/net/dns/host_resolver.h | 1 - naiveproxy/src/net/dns/host_resolver_cache.cc | 5 +- .../src/net/dns/host_resolver_dns_task.cc | 7 +- .../src/net/dns/host_resolver_dns_task.h | 5 + .../net/dns/host_resolver_internal_result.cc | 5 +- .../src/net/dns/host_resolver_manager.cc | 19 +- .../src/net/dns/host_resolver_manager.h | 7 +- .../src/net/dns/host_resolver_manager_job.cc | 102 +- .../src/net/dns/host_resolver_manager_job.h | 40 +- .../dns/host_resolver_manager_request_impl.cc | 2 +- .../src/net/dns/host_resolver_nat64_task.cc | 66 +- .../src/net/dns/host_resolver_nat64_task.h | 15 +- .../src/net/dns/host_resolver_system_task.cc | 193 +- .../src/net/dns/host_resolver_system_task.h | 32 +- .../src/net/dns/mapped_host_resolver.cc | 4 +- naiveproxy/src/net/dns/mock_host_resolver.h | 1 + .../src/net/dns/mock_mdns_socket_factory.cc | 9 +- .../src/net/dns/mock_mdns_socket_factory.h | 3 +- naiveproxy/src/net/dns/opt_record_rdata.cc | 70 +- naiveproxy/src/net/dns/opt_record_rdata.h | 20 + .../platform_dns_query_executor_android.cc | 192 + .../dns/platform_dns_query_executor_android.h | 90 + .../net/dns/public/dns_over_https_config.cc | 3 +- .../public/dns_over_https_server_config.cc | 2 +- naiveproxy/src/net/dns/resolve_context.cc | 3 +- .../src/net/extras/preload_data/decoder.cc | 35 +- .../src/net/extras/preload_data/decoder.h | 16 +- .../shared_dictionary_info.h | 6 +- .../sqlite/sqlite_persistent_cookie_store.cc | 75 +- ...lite_persistent_reporting_and_nel_store.cc | 3 +- ...lite_persistent_shared_dictionary_store.cc | 41 + ...qlite_persistent_shared_dictionary_store.h | 4 + naiveproxy/src/net/features.gni | 8 +- naiveproxy/src/net/http/OWNERS | 7 +- .../src/net/http/alternate_protocol_usage.h | 15 + .../src/net/http/http_auth_controller.cc | 147 +- .../src/net/http/http_auth_controller.h | 9 + naiveproxy/src/net/http/http_cache.cc | 129 +- naiveproxy/src/net/http/http_cache.h | 22 +- .../src/net/http/http_cache_transaction.cc | 174 +- .../src/net/http/http_cache_transaction.h | 1 - naiveproxy/src/net/http/http_cache_writers.cc | 13 +- naiveproxy/src/net/http/http_cache_writers.h | 4 + .../src/net/http/http_network_session.cc | 31 +- .../src/net/http/http_network_session.h | 10 +- .../src/net/http/http_network_transaction.cc | 215 +- .../src/net/http/http_network_transaction.h | 7 + .../src/net/http/http_no_vary_search_data.cc | 243 +- .../src/net/http/http_no_vary_search_data.h | 85 +- .../src/net/http/http_proxy_client_socket.cc | 161 +- .../src/net/http/http_proxy_client_socket.h | 21 +- .../src/net/http/http_proxy_connect_job.cc | 19 +- .../src/net/http/http_request_headers.cc | 13 +- .../src/net/http/http_request_headers.h | 3 +- .../src/net/http/http_response_headers.cc | 19 +- .../src/net/http/http_response_headers.h | 13 +- .../http/http_response_headers_test_util.h | 2 +- naiveproxy/src/net/http/http_response_info.cc | 23 +- naiveproxy/src/net/http/http_response_info.h | 6 +- .../src/net/http/http_server_properties.cc | 245 +- .../src/net/http/http_server_properties.h | 76 +- .../http/http_server_properties_manager.cc | 4 +- .../src/net/http/http_stream_factory.cc | 37 +- naiveproxy/src/net/http/http_stream_factory.h | 23 +- .../src/net/http/http_stream_factory_job.cc | 128 +- .../src/net/http/http_stream_factory_job.h | 51 +- .../http_stream_factory_job_controller.cc | 285 +- .../http/http_stream_factory_job_controller.h | 51 +- .../net/http/http_stream_factory_test_util.cc | 106 +- .../net/http/http_stream_factory_test_util.h | 78 +- naiveproxy/src/net/http/http_stream_key.cc | 2 +- naiveproxy/src/net/http/http_stream_parser.cc | 11 +- naiveproxy/src/net/http/http_stream_pool.cc | 71 +- naiveproxy/src/net/http/http_stream_pool.h | 31 +- .../http/http_stream_pool_attempt_manager.cc | 688 +- .../http/http_stream_pool_attempt_manager.h | 165 +- .../src/net/http/http_stream_pool_group.cc | 49 +- .../src/net/http/http_stream_pool_group.h | 8 +- ...p_stream_pool_ip_endpoint_state_tracker.cc | 12 +- ...tp_stream_pool_ip_endpoint_state_tracker.h | 8 +- .../src/net/http/http_stream_pool_job.cc | 130 +- .../src/net/http/http_stream_pool_job.h | 32 +- .../http/http_stream_pool_job_controller.cc | 141 +- .../http/http_stream_pool_job_controller.h | 42 +- .../net/http/http_stream_pool_request_info.cc | 2 + .../net/http/http_stream_pool_request_info.h | 4 + .../http_stream_pool_tcp_based_attempt.cc | 216 +- .../http/http_stream_pool_tcp_based_attempt.h | 101 +- .../net/http/http_stream_pool_test_util.cc | 33 +- .../src/net/http/http_stream_pool_test_util.h | 6 +- .../src/net/http/http_stream_request.cc | 18 +- naiveproxy/src/net/http/http_stream_request.h | 35 +- .../net/http/http_transaction_test_util.cc | 4 +- naiveproxy/src/net/http/http_util.cc | 32 +- naiveproxy/src/net/http/http_util.h | 2 +- naiveproxy/src/net/http/http_vary_data.cc | 235 +- naiveproxy/src/net/http/http_vary_data.h | 51 +- naiveproxy/src/net/http/mock_http_cache.h | 1 + .../src/net/http/no_vary_search_cache.cc | 800 +-- .../src/net/http/no_vary_search_cache.h | 200 +- .../net/http/no_vary_search_cache_storage.cc | 34 +- .../net/http/no_vary_search_cache_storage.h | 14 +- .../http/no_vary_search_cache_test_utils.h | 2 +- naiveproxy/src/net/http/partial_data.cc | 36 +- naiveproxy/src/net/http/proxy_fallback.cc | 21 +- naiveproxy/src/net/http/proxy_fallback.h | 8 +- .../net/http/transport_security_persister.cc | 5 +- .../http/transport_security_state_static.pins | 531 +- .../transport_security_state_static_pins.json | 117 +- .../transport_security_state_test_util.cc | 5 - .../http/transport_security_state_test_util.h | 4 - .../src/net/log/file_net_log_observer.cc | 3 +- .../src/net/log/net_log_capture_mode.cc | 14 + naiveproxy/src/net/log/net_log_capture_mode.h | 17 + .../src/net/log/net_log_event_type_list.h | 53 +- naiveproxy/src/net/log/net_log_util.cc | 8 +- naiveproxy/src/net/log/test_net_log.cc | 17 + naiveproxy/src/net/log/test_net_log.h | 6 + .../src/net/nqe/network_quality_estimator.cc | 94 +- .../src/net/nqe/network_quality_estimator.h | 25 +- naiveproxy/src/net/nqe/throughput_analyzer.cc | 5 +- naiveproxy/src/net/nqe/throughput_analyzer.h | 3 +- .../configured_proxy_resolution_service.cc | 247 +- .../configured_proxy_resolution_service.h | 122 +- .../proxy_resolution/mock_proxy_resolver.h | 1 + .../net/proxy_resolution/pac_file_decider.cc | 4 +- .../proxy_resolution/proxy_bypass_rules.cc | 10 +- .../src/net/proxy_resolution/proxy_config.cc | 2 +- .../proxy_config_service_linux.cc | 2 +- .../src/net/proxy_resolution/proxy_info.cc | 6 +- .../src/net/proxy_resolution/proxy_info.h | 7 +- .../src/net/proxy_resolution/proxy_list.cc | 131 +- .../src/net/proxy_resolution/proxy_list.h | 46 +- .../proxy_resolution_service.cc | 74 + .../proxy_resolution_service.h | 23 + .../proxy_resolution/proxy_resolver_apple.cc | 5 +- .../net/proxy_resolution/proxy_retry_info.h | 7 - ...windows_system_proxy_resolution_request.cc | 15 +- .../windows_system_proxy_resolution_request.h | 3 + ...windows_system_proxy_resolution_service.cc | 57 +- .../windows_system_proxy_resolution_service.h | 24 +- .../net/proxy_resolution/win/winhttp_status.h | 2 +- .../dedicated_web_transport_http3_client.cc | 68 +- .../dedicated_web_transport_http3_client.h | 7 +- naiveproxy/src/net/quic/network_connection.cc | 5 +- naiveproxy/src/net/quic/network_connection.h | 3 +- .../net/quic/quic_chromium_client_session.cc | 34 +- .../quic/quic_chromium_client_session_peer.cc | 3 +- .../net/quic/quic_chromium_client_stream.cc | 13 +- .../net/quic/quic_chromium_client_stream.h | 4 + .../src/net/quic/quic_connection_logger.cc | 7 +- .../src/net/quic/quic_connection_logger.h | 2 +- naiveproxy/src/net/quic/quic_context.cc | 19 +- naiveproxy/src/net/quic/quic_context.h | 21 +- naiveproxy/src/net/quic/quic_event_logger.cc | 11 +- naiveproxy/src/net/quic/quic_event_logger.h | 2 +- .../src/net/quic/quic_proxy_client_socket.cc | 142 +- .../src/net/quic/quic_proxy_client_socket.h | 18 + .../quic_proxy_client_socket_test_base.cc | 3 +- .../quic/quic_proxy_datagram_client_socket.cc | 171 +- .../quic/quic_proxy_datagram_client_socket.h | 28 +- .../src/net/quic/quic_session_attempt.cc | 3 +- naiveproxy/src/net/quic/quic_session_key.cc | 48 +- naiveproxy/src/net/quic/quic_session_key.h | 19 +- naiveproxy/src/net/quic/quic_session_pool.cc | 86 +- naiveproxy/src/net/quic/quic_session_pool.h | 13 +- .../src/net/quic/quic_session_pool_peer.cc | 34 +- .../src/net/quic/quic_session_pool_peer.h | 6 +- .../net/quic/quic_session_pool_proxy_job.cc | 15 +- .../net/quic/quic_session_pool_test_base.cc | 12 +- .../net/quic/quic_session_pool_test_base.h | 6 +- .../src/net/quic/quic_test_packet_maker.cc | 34 +- .../src/net/quic/quic_test_packet_printer.cc | 4 +- .../src/net/quic/web_transport_client.cc | 2 +- .../src/net/quic/web_transport_client.h | 9 +- .../src/net/reporting/reporting_cache_impl.cc | 13 +- .../net/reporting/reporting_delivery_agent.cc | 2 +- .../src/net/reporting/reporting_test_util.cc | 2 +- naiveproxy/src/net/server/web_socket.cc | 4 +- .../shared_dictionary_network_transaction.cc | 15 - .../net/socket/client_socket_pool_manager.cc | 49 +- .../net/socket/connect_job_params_factory.cc | 5 +- naiveproxy/src/net/socket/next_proto.cc | 13 + naiveproxy/src/net/socket/next_proto.h | 5 + naiveproxy/src/net/socket/socket_apple.cc | 118 + naiveproxy/src/net/socket/socket_apple.h | 227 + .../src/net/socket/socket_bio_adapter.cc | 19 - naiveproxy/src/net/socket/socket_posix.cc | 322 +- naiveproxy/src/net/socket/socket_posix.h | 58 - naiveproxy/src/net/socket/socket_tag.cc | 10 + naiveproxy/src/net/socket/socket_tag.h | 5 + naiveproxy/src/net/socket/socket_test_util.cc | 36 +- naiveproxy/src/net/socket/socket_test_util.h | 17 + .../src/net/socket/ssl_client_socket.cc | 35 +- naiveproxy/src/net/socket/ssl_client_socket.h | 34 +- .../src/net/socket/ssl_client_socket_impl.cc | 71 +- .../src/net/socket/ssl_client_socket_impl.h | 4 + naiveproxy/src/net/socket/ssl_connect_job.cc | 8 +- naiveproxy/src/net/socket/ssl_connect_job.h | 2 +- naiveproxy/src/net/socket/ssl_server_socket.h | 36 +- .../src/net/socket/ssl_server_socket_impl.cc | 317 +- .../src/net/socket/ssl_server_socket_impl.h | 19 +- .../net/socket/stream_socket_close_reason.h | 2 +- naiveproxy/src/net/socket/tcp_socket_posix.cc | 1 - naiveproxy/src/net/socket/tcp_socket_win.h | 5 +- .../src/net/socket/tls_stream_attempt.cc | 62 +- .../src/net/socket/tls_stream_attempt.h | 32 +- .../socket/transport_client_socket_pool.cc | 14 +- .../net/socket/transport_client_socket_pool.h | 7 +- .../net/socket/udp_socket_global_limits.cc | 17 +- .../src/net/socket/udp_socket_global_limits.h | 4 +- naiveproxy/src/net/socket/udp_socket_posix.cc | 52 +- naiveproxy/src/net/spdy/spdy_http_utils.cc | 4 +- naiveproxy/src/net/spdy/spdy_http_utils.h | 2 +- .../src/net/spdy/spdy_proxy_client_socket.cc | 140 +- .../src/net/spdy/spdy_proxy_client_socket.h | 17 + naiveproxy/src/net/spdy/spdy_session.cc | 18 +- naiveproxy/src/net/spdy/spdy_session.h | 5 +- naiveproxy/src/net/spdy/spdy_session_key.cc | 30 +- naiveproxy/src/net/spdy/spdy_session_key.h | 20 +- naiveproxy/src/net/spdy/spdy_session_pool.cc | 75 +- naiveproxy/src/net/spdy/spdy_session_pool.h | 32 +- naiveproxy/src/net/spdy/spdy_stream.cc | 2 + .../src/net/spdy/spdy_test_util_common.cc | 32 +- .../src/net/spdy/spdy_test_util_common.h | 30 +- .../src/net/ssl/client_cert_store_empty.cc | 24 + .../src/net/ssl/client_cert_store_empty.h | 37 + .../src/net/ssl/client_cert_store_mac.cc | 64 +- .../src/net/ssl/client_cert_store_nss.cc | 58 +- naiveproxy/src/net/ssl/openssl_ssl_util.cc | 13 +- naiveproxy/src/net/ssl/openssl_ssl_util.h | 10 - .../src/net/ssl/ssl_client_session_cache.cc | 31 +- .../src/net/ssl/ssl_client_session_cache.h | 26 +- naiveproxy/src/net/ssl/ssl_config.cc | 5 +- naiveproxy/src/net/ssl/ssl_config.h | 19 +- naiveproxy/src/net/ssl/ssl_config_service.cc | 40 +- naiveproxy/src/net/ssl/ssl_config_service.h | 34 +- .../src/net/ssl/ssl_platform_key_android.cc | 10 +- .../src/net/ssl/ssl_platform_key_android.h | 8 + .../src/net/ssl/ssl_platform_key_util.h | 2 +- .../src/net/ssl/ssl_platform_key_win.cc | 2 +- naiveproxy/src/net/ssl/ssl_server_config.cc | 6 + naiveproxy/src/net/ssl/ssl_server_config.h | 54 +- naiveproxy/src/net/test/ct_test_util.cc | 75 +- naiveproxy/src/net/test/ct_test_util.h | 14 +- .../android/embedded_test_server_android.cc | 3 - .../android/embedded_test_server_android.h | 2 - .../embedded_test_server/default_handlers.cc | 31 +- .../embedded_test_server.cc | 270 +- .../embedded_test_server.h | 85 +- ...mbedded_test_server_connection_listener.cc | 9 +- ...embedded_test_server_connection_listener.h | 16 +- .../request_handler_util.cc | 5 +- .../simple_connection_listener.cc | 3 - .../simple_connection_listener.h | 2 - .../websocket_connection.h | 1 + naiveproxy/src/net/test/net_test_suite.cc | 15 + naiveproxy/src/net/test/test_doh_server.cc | 2 +- .../url_request/url_request_mock_http_job.cc | 2 +- .../url_request_test_job_backed_by_file.cc | 4 +- .../mozilla_security_manager/README.chromium | 1 + .../third_party/mozilla_win/README.chromium | 1 + .../src/net/third_party/nss/DIR_METADATA | 7 - naiveproxy/src/net/third_party/nss/LICENSE | 403 -- naiveproxy/src/net/third_party/nss/OWNERS | 3 - .../src/net/third_party/nss/README.chromium | 19 - .../src/net/third_party/nss/ssl/cmpcert.cc | 108 - .../src/net/third_party/nss/ssl/cmpcert.h | 32 - .../src/net/third_party/quiche/BUILD.gn | 8 +- .../net/third_party/quiche/README.chromium | 1 + .../quiche_client_stats_impl.h | 5 +- .../src/net/third_party/quiche/src/.bazelrc | 2 + .../net/third_party/quiche/src/.bazelversion | 2 +- .../net/third_party/quiche/src/MODULE.bazel | 23 +- .../third_party/quiche/src/MODULE.bazel.lock | 5071 +++----------- .../src/net/third_party/quiche/src/README.md | 52 + .../quiche/src/build/source_list.bzl | 110 +- .../quiche/src/build/source_list.gni | 111 +- .../quiche/src/build/source_list.json | 115 +- .../third_party/quiche/src/quiche/BUILD.bazel | 89 + .../quiche/src/quiche/balsa/balsa_enums.cc | 4 + .../quiche/src/quiche/balsa/balsa_enums.h | 2 + .../quiche/src/quiche/balsa/balsa_frame.cc | 60 +- .../quiche/src/quiche/balsa/balsa_frame.h | 3 +- .../quiche/src/quiche/balsa/balsa_headers.cc | 57 + .../quiche/src/quiche/balsa/balsa_headers.h | 13 +- .../src/quiche/balsa/http_validation_policy.h | 10 + .../quiche/binary_http/binary_http_message.cc | 285 +- .../quiche/binary_http/binary_http_message.h | 68 +- .../quiche/blind_sign_auth/blind_sign_auth.cc | 279 +- .../quiche/blind_sign_auth/blind_sign_auth.h | 60 +- .../blind_sign_auth_interface.h | 16 +- .../blind_sign_message_response.cc | 3 - .../blind_sign_tracing_hooks.h | 33 + .../blind_sign_auth/direct_task_bundle.cc | 36 + .../blind_sign_auth/direct_task_bundle.h | 32 + .../src/quiche/blind_sign_auth/task_bundle.h | 30 + .../common/platform/api/quiche_client_stats.h | 5 +- .../platform/api/quiche_reference_counted.h | 3 + .../common/platform/api/quiche_server_stats.h | 2 +- .../quiche_client_stats_impl.h | 77 +- .../src/quiche/common/quiche_data_writer.h | 9 +- .../quiche/src/quiche/common/quiche_endian.h | 8 + .../quiche/common/quiche_feature_flags_list.h | 14 +- .../src/quiche/common/quiche_weak_ptr.h | 13 +- .../quiche/http2/adapter/oghttp2_adapter.cc | 61 +- .../quiche/http2/adapter/oghttp2_adapter.h | 6 +- .../quiche/http2/adapter/oghttp2_session.cc | 2 +- .../hpack/decoder/hpack_entry_decoder.cc | 18 + .../hpack/decoder/hpack_string_decoder.h | 19 +- .../src/quiche/http2/hpack/hpack_encoder.cc | 2 +- .../quiche/http2/hpack/hpack_header_table.h | 3 +- .../http2/test_tools/hpack_entry_collector.cc | 4 +- .../http2/test_tools/hpack_entry_collector.h | 3 +- .../test_tools/random_decoder_test_base.h | 18 + .../buffers/oblivious_http_request.cc | 115 +- .../buffers/oblivious_http_request.h | 15 +- .../buffers/oblivious_http_response.cc | 143 +- .../buffers/oblivious_http_response.h | 65 +- .../common/oblivious_http_chunk_handler.h | 25 + .../common/oblivious_http_definitions.h | 14 + .../common/oblivious_http_header_key_config.h | 4 + .../oblivious_http/oblivious_http_gateway.cc | 307 +- .../oblivious_http/oblivious_http_gateway.h | 114 + .../src/quiche/quic/core/chlo_extractor.cc | 4 +- .../quic/core/congestion_control/bbr2_misc.cc | 5 - .../send_algorithm_interface.h | 20 +- .../quiche/quic/core/crypto/crypto_protocol.h | 10 +- .../quic/core/crypto/crypto_secret_boxer.cc | 6 +- .../quiche/quic/core/crypto/proof_source.cc | 28 +- .../quiche/quic/core/crypto/proof_source.h | 33 +- .../core/crypto/quic_crypto_client_config.cc | 24 +- .../core/crypto/quic_crypto_client_config.h | 52 +- .../core/crypto/quic_crypto_server_config.cc | 31 +- .../core/crypto/quic_crypto_server_config.h | 13 +- .../quic/core/crypto/tls_server_connection.cc | 48 +- .../quic/core/crypto/tls_server_connection.h | 12 +- .../quic/core/crypto/transport_parameters.cc | 57 +- .../quic/core/crypto/transport_parameters.h | 4 + .../quic/core/frames/quic_datagram_frame.cc | 45 + .../quic/core/frames/quic_datagram_frame.h | 51 + .../src/quiche/quic/core/frames/quic_frame.cc | 30 +- .../src/quiche/quic/core/frames/quic_frame.h | 8 +- .../quic/core/frames/quic_message_frame.cc | 45 - .../quic/core/frames/quic_message_frame.h | 51 - .../http/quic_connection_migration_manager.cc | 1529 ++++ .../http/quic_connection_migration_manager.h | 409 ++ .../core/http/quic_server_session_base.cc | 8 +- .../quic/core/http/quic_server_session_base.h | 26 +- .../core/http/quic_spdy_client_session.cc | 54 +- .../quic/core/http/quic_spdy_client_session.h | 59 +- ...quic_spdy_client_session_with_migration.cc | 137 + .../quic_spdy_client_session_with_migration.h | 126 + .../quic/core/http/quic_spdy_session.cc | 56 +- .../quiche/quic/core/http/quic_spdy_session.h | 126 +- .../quiche/quic/core/http/quic_spdy_stream.cc | 7 +- .../quiche/quic/core/http/quic_spdy_stream.h | 2 +- .../quic/core/http/web_transport_http3.cc | 2 +- .../core/qpack/qpack_instruction_decoder.cc | 11 +- .../src/quiche/quic/core/quic_config.cc | 30 +- .../quiche/src/quiche/quic/core/quic_config.h | 30 +- .../src/quiche/quic/core/quic_connection.cc | 118 +- .../src/quiche/quic/core/quic_connection.h | 70 +- .../quic/core/quic_connection_alarms.cc | 104 - .../quic/core/quic_connection_id_manager.cc | 1 + .../core/quic_crypto_client_handshaker.cc | 22 +- .../quic/core/quic_crypto_client_handshaker.h | 6 + .../quic/core/quic_crypto_client_stream.cc | 7 + .../quic/core/quic_crypto_client_stream.h | 7 + .../quiche/quic/core/quic_datagram_queue.cc | 22 +- .../quiche/quic/core/quic_datagram_queue.h | 10 +- .../src/quiche/quic/core/quic_error_codes.cc | 4 +- .../src/quiche/quic/core/quic_error_codes.h | 2 +- .../quic_force_blockable_packet_writer.cc | 18 + .../core/quic_force_blockable_packet_writer.h | 32 + .../src/quiche/quic/core/quic_framer.cc | 121 +- .../quiche/src/quiche/quic/core/quic_framer.h | 19 +- .../quiche/quic/core/quic_generic_session.cc | 11 +- .../quiche/quic/core/quic_generic_session.h | 4 +- .../quiche/quic/core/quic_interval_deque.h | 46 +- .../quiche/quic/core/quic_packet_creator.cc | 65 +- .../quiche/quic/core/quic_packet_creator.h | 22 +- .../src/quiche/quic/core/quic_packets.cc | 6 +- .../src/quiche/quic/core/quic_packets.h | 2 +- .../quic/core/quic_path_context_factory.h | 77 + .../quiche/quic/core/quic_path_validator.h | 42 +- .../src/quiche/quic/core/quic_ping_manager.cc | 2 - .../quic/core/quic_sent_packet_manager.cc | 18 +- .../quic/core/quic_sent_packet_manager.h | 4 + .../src/quiche/quic/core/quic_session.cc | 119 +- .../src/quiche/quic/core/quic_session.h | 276 +- .../quic/core/quic_stream_send_buffer.cc | 6 +- .../quic/core/quic_stream_send_buffer.h | 2 +- .../core/quic_stream_send_buffer_inlining.cc | 6 +- .../core/quic_stream_send_buffer_inlining.h | 2 +- .../quiche/src/quiche/quic/core/quic_time.cc | 2 +- .../quiche/src/quiche/quic/core/quic_time.h | 64 +- .../quiche/quic/core/quic_trace_visitor.cc | 4 +- .../quiche/src/quiche/quic/core/quic_types.cc | 46 +- .../quiche/src/quiche/quic/core/quic_types.h | 78 +- .../quic/core/quic_unacked_packet_map.cc | 12 +- .../src/quiche/quic/core/tls_chlo_extractor.h | 2 +- .../quiche/quic/core/tls_client_handshaker.cc | 48 +- .../quiche/quic/core/tls_client_handshaker.h | 8 + .../quiche/quic/core/tls_server_handshaker.cc | 57 +- .../quiche/quic/core/tls_server_handshaker.h | 24 +- .../quic/core/web_transport_interface.h | 22 +- .../src/quiche/quic/masque/masque_client.cc | 7 +- .../src/quiche/quic/masque/masque_client.h | 4 +- .../quiche/quic/masque/masque_client_bin.cc | 70 +- .../quic/masque/masque_client_session.cc | 22 +- .../quic/masque/masque_client_session.h | 6 +- .../quic/masque/masque_encapsulated_client.cc | 2 +- .../quic/masque/masque_ohttp_client_bin.cc | 3 +- .../src/quiche/quic/masque/masque_server.cc | 4 +- .../quic/masque/masque_server_session.cc | 22 +- .../quic/masque/masque_server_session.h | 6 +- .../src/quiche/quic/moqt/moqt_cached_object.h | 28 - .../src/quiche/quic/moqt/moqt_failed_fetch.h | 41 - .../src/quiche/quic/moqt/moqt_fetch_task.h | 90 + .../src/quiche/quic/moqt/moqt_framer.cc | 200 +- .../quiche/src/quiche/quic/moqt/moqt_framer.h | 64 +- .../quic/moqt/moqt_known_track_publisher.cc | 7 +- .../quic/moqt/moqt_known_track_publisher.h | 6 +- .../quiche/quic/moqt/moqt_live_relay_queue.cc | 68 +- .../quiche/quic/moqt/moqt_live_relay_queue.h | 72 +- .../src/quiche/quic/moqt/moqt_messages.cc | 71 +- .../src/quiche/quic/moqt/moqt_messages.h | 350 +- .../{moqt_cached_object.cc => moqt_object.cc} | 3 +- .../quiche/src/quiche/quic/moqt/moqt_object.h | 49 + .../quiche/quic/moqt/moqt_outgoing_queue.cc | 102 +- .../quiche/quic/moqt/moqt_outgoing_queue.h | 35 +- .../src/quiche/quic/moqt/moqt_parser.cc | 423 +- .../quiche/src/quiche/quic/moqt/moqt_parser.h | 83 +- .../quiche/quic/moqt/moqt_probe_manager.cc | 1 + .../src/quiche/quic/moqt/moqt_probe_manager.h | 6 +- .../src/quiche/quic/moqt/moqt_publisher.h | 118 +- .../quiche/quic/moqt/moqt_relay_publisher.cc | 98 + .../quiche/quic/moqt/moqt_relay_publisher.h | 81 + .../quic/moqt/moqt_relay_track_publisher.cc | 303 + .../quic/moqt/moqt_relay_track_publisher.h | 155 + .../src/quiche/quic/moqt/moqt_session.cc | 670 +- .../src/quiche/quic/moqt/moqt_session.h | 306 +- .../quiche/quic/moqt/moqt_session_callbacks.h | 67 +- .../quiche/quic/moqt/moqt_session_interface.h | 111 +- .../quiche/quic/moqt/moqt_subscribe_windows.h | 29 +- .../quiche/quic/moqt/moqt_trace_recorder.cc | 58 + .../quiche/quic/moqt/moqt_trace_recorder.h | 52 + .../quiche/src/quiche/quic/moqt/moqt_track.cc | 51 +- .../quiche/src/quiche/quic/moqt/moqt_track.h | 64 +- .../quiche/quic/moqt/relay_namespace_tree.h | 228 + .../quiche/quic/moqt/session_namespace_tree.h | 84 + .../quic/moqt/test_tools/mock_moqt_session.h | 89 + .../quic/moqt/test_tools/moqt_framer_utils.cc | 180 +- .../quic/moqt/test_tools/moqt_framer_utils.h | 23 +- .../{tools => test_tools}/moqt_mock_visitor.h | 80 +- .../test_tools/moqt_parser_test_visitor.h | 44 +- .../quic/moqt/test_tools/moqt_session_peer.h | 11 +- .../quic/moqt/test_tools/moqt_simulator.cc | 386 ++ .../quic/moqt/test_tools/moqt_simulator.h | 241 + .../moqt/test_tools/moqt_simulator_harness.cc | 6 +- .../quic/moqt/test_tools/moqt_test_message.h | 585 +- .../src/quiche/quic/moqt/tools/chat_client.cc | 105 +- .../src/quiche/quic/moqt/tools/chat_client.h | 38 +- .../quiche/quic/moqt/tools/chat_client_bin.cc | 2 +- .../src/quiche/quic/moqt/tools/chat_server.cc | 95 +- .../src/quiche/quic/moqt/tools/chat_server.h | 44 +- .../src/quiche/quic/moqt/tools/moq_chat.h | 4 +- .../moqt/tools/moqt_ingestion_server_bin.cc | 62 +- .../src/quiche/quic/moqt/tools/moqt_relay.cc | 146 + .../src/quiche/quic/moqt/tools/moqt_relay.h | 81 + .../quiche/quic/moqt/tools/moqt_relay_bin.cc | 53 + .../src/quiche/quic/moqt/tools/moqt_server.cc | 2 +- .../quic/moqt/tools/moqt_simulator_bin.cc | 507 +- .../quic/platform/api/quic_client_stats.h | 5 +- .../quiche/quic/qbone/qbone_control_stream.cc | 2 +- .../quiche/quic/qbone/qbone_control_stream.h | 4 +- .../quiche/quic/qbone/qbone_session_base.cc | 40 +- .../quiche/quic/qbone/qbone_session_base.h | 24 +- .../test_tools/fake_proof_source_handle.cc | 21 +- .../test_tools/fake_proof_source_handle.h | 18 +- .../quic/test_tools/quic_connection_peer.cc | 15 + .../quic/test_tools/quic_connection_peer.h | 2 + .../quic/test_tools/quic_test_client.cc | 63 +- .../quiche/quic/test_tools/quic_test_client.h | 48 + .../quic/test_tools/quic_test_server.cc | 5 +- .../quiche/quic/test_tools/quic_test_utils.cc | 21 +- .../quiche/quic/test_tools/quic_test_utils.h | 38 +- .../quic/test_tools/simple_quic_framer.cc | 17 +- .../quic/test_tools/simple_quic_framer.h | 2 +- .../quic/test_tools/simulator/quic_endpoint.h | 5 +- .../test_tools/simulator/quic_endpoint_base.h | 6 + .../src/quiche/quic/tools/quic_client_base.cc | 14 +- .../src/quiche/quic/tools/quic_client_base.h | 13 + .../quic_client_default_network_helper.cc | 11 +- .../quiche/quic/tools/quic_default_client.cc | 145 + .../quiche/quic/tools/quic_default_client.h | 62 + .../quic/tools/quic_memory_cache_backend.cc | 12 +- .../quic/tools/quic_packet_printer_bin.cc | 4 +- .../src/quiche/quic/tools/quic_server.cc | 19 +- .../src/quiche/quic/tools/quic_server.h | 4 + .../quiche/quic/tools/quic_server_factory.cc | 3 +- .../quic/tools/quic_simple_client_session.cc | 28 +- .../quic/tools/quic_simple_client_session.h | 12 + .../src/quiche/quic/tools/quic_toy_client.cc | 13 +- .../quiche/src/quiche/quic/tools/quic_url.cc | 9 +- .../quic/tools/web_transport_test_server.cc | 5 +- .../test_tools/in_memory_stream.cc | 3 + .../test_tools/in_memory_stream.h | 7 + .../third_party/uri_template/README.chromium | 3 +- .../src/net/tools/dump_cache/dump_cache.cc | 2 +- .../src/net/tools/naive/naive_config.cc | 36 +- naiveproxy/src/net/tools/naive/naive_config.h | 2 +- .../src/net/tools/naive/naive_proxy_bin.cc | 10 +- .../net/tools/naive/naive_proxy_delegate.cc | 23 +- .../net/tools/naive/naive_proxy_delegate.h | 13 +- .../src/net/tools/net_watcher/net_watcher.cc | 26 +- .../tools/root_store_tool/root_store_tool.cc | 11 +- .../BUILD.gn | 2 - .../cert_util.cc | 17 +- .../input_file_parsers.cc | 8 +- .../spki_hash.cc | 25 +- .../spki_hash.h | 6 +- .../transport_security_state_generator.cc | 48 +- .../network_traffic_annotation.h | 159 +- .../src/net/url_request/redirect_info.cc | 2 +- naiveproxy/src/net/url_request/url_request.cc | 33 +- naiveproxy/src/net/url_request/url_request.h | 211 +- .../src/net/url_request/url_request_filter.cc | 11 +- .../net/url_request/url_request_http_job.cc | 218 +- .../src/net/url_request/url_request_job.cc | 8 +- .../url_request/url_request_job_factory.cc | 4 +- .../url_request/url_request_netlog_params.cc | 10 +- .../url_request/url_request_netlog_params.h | 6 +- .../websocket_basic_handshake_stream.cc | 4 +- .../src/net/websockets/websocket_channel.cc | 15 +- .../src/net/websockets/websocket_channel.h | 4 +- .../websockets/websocket_event_interface.h | 6 +- .../websocket_handshake_challenge.cc | 6 +- .../websocket_handshake_challenge.h | 5 +- .../websocket_handshake_constants.cc | 24 - .../websocket_handshake_constants.h | 22 +- .../websocket_handshake_stream_base.cc | 4 +- .../websocket_handshake_stream_base.h | 4 +- .../src/net/websockets/websocket_stream.cc | 4 +- .../src/net/websockets/websocket_stream.h | 5 +- .../websocket_stream_create_test_base.cc | 13 +- .../websocket_stream_create_test_base.h | 10 + .../src/net/websockets/websocket_test_util.cc | 46 +- .../src/net/websockets/websocket_test_util.h | 5 +- .../src/third_party/abseil-cpp/BUILD.gn | 56 +- .../abseil-cpp/CMake/AbseilDll.cmake | 7 +- .../src/third_party/abseil-cpp/MODULE.bazel | 8 +- .../third_party/abseil-cpp/README.chromium | 2 +- .../abseil-cpp/absl/algorithm/BUILD.bazel | 1 - .../abseil-cpp/absl/algorithm/BUILD.gn | 1 - .../abseil-cpp/absl/algorithm/CMakeLists.txt | 2 - .../abseil-cpp/absl/algorithm/container.h | 331 +- .../abseil-cpp/absl/base/BUILD.bazel | 43 +- .../third_party/abseil-cpp/absl/base/BUILD.gn | 57 +- .../abseil-cpp/absl/base/CMakeLists.txt | 44 +- .../abseil-cpp/absl/base/attributes.h | 2 +- .../third_party/abseil-cpp/absl/base/casts.h | 21 +- .../third_party/abseil-cpp/absl/base/config.h | 19 +- .../abseil-cpp/absl/base/internal/identity.h | 39 - .../absl/base/internal/nullability_traits.h | 71 + .../abseil-cpp/absl/base/internal/poison.cc | 13 +- .../absl/base/internal/raw_logging.cc | 7 +- .../abseil-cpp/absl/base/internal/spinlock.h | 17 +- .../absl/base/internal/spinlock_benchmark.cc | 2 +- .../abseil-cpp/absl/base/internal/sysinfo.cc | 9 - .../absl/base/internal/unscaledcycleclock.cc | 4 + .../base/internal/unscaledcycleclock_config.h | 2 +- .../abseil-cpp/absl/base/nullability.h | 2 +- .../abseil-cpp/absl/base/optimization.h | 4 +- .../absl/base/spinlock_test_common.cc | 25 +- .../abseil-cpp/absl/container/flat_hash_map.h | 4 +- .../abseil-cpp/absl/container/flat_hash_set.h | 4 +- .../absl/container/inlined_vector.h | 16 +- .../absl/container/internal/btree_container.h | 4 +- .../internal/hashtable_control_bytes.h | 19 +- .../absl/container/internal/inlined_vector.h | 3 +- .../absl/container/internal/raw_hash_map.h | 18 +- .../absl/container/internal/raw_hash_set.cc | 140 +- .../absl/container/internal/raw_hash_set.h | 186 +- .../internal/raw_hash_set_probe_benchmark.cc | 63 +- .../abseil-cpp/absl/container/node_hash_map.h | 4 +- .../abseil-cpp/absl/container/node_hash_set.h | 4 +- .../absl/crc/internal/cpu_detect.cc | 17 + .../abseil-cpp/absl/crc/internal/cpu_detect.h | 8 +- .../absl/crc/internal/crc_x86_arm_combined.cc | 154 +- .../internal/non_temporal_arm_intrinsics.h | 6 +- .../abseil-cpp/absl/debugging/BUILD.bazel | 5 + .../abseil-cpp/absl/debugging/BUILD.gn | 2 + .../abseil-cpp/absl/debugging/CMakeLists.txt | 2 + .../absl/debugging/internal/elf_mem_image.h | 8 +- .../internal/stacktrace_aarch64-inl.inc | 2 +- .../internal/stacktrace_emscripten-inl.inc | 7 - .../internal/stacktrace_riscv-inl.inc | 3 +- .../absl/debugging/internal/symbolize.h | 4 +- .../abseil-cpp/absl/debugging/stacktrace.cc | 96 +- .../absl/debugging/symbolize_emscripten.inc | 21 +- .../absl/debugging/symbolize_win32.inc | 6 +- .../abseil-cpp/absl/flags/BUILD.bazel | 1 + .../abseil-cpp/absl/flags/declare.h | 9 + .../absl/flags/internal/commandlineflag.h | 2 +- .../abseil-cpp/absl/flags/internal/flag.cc | 29 +- .../abseil-cpp/absl/flags/internal/flag.h | 55 +- .../absl/flags/internal/program_name.cc | 4 +- .../abseil-cpp/absl/flags/internal/usage.cc | 4 +- .../abseil-cpp/absl/flags/parse.cc | 8 +- .../abseil-cpp/absl/flags/reflection.cc | 18 +- .../abseil-cpp/absl/flags/usage.cc | 4 +- .../abseil-cpp/absl/flags/usage_config.cc | 4 +- .../abseil-cpp/absl/functional/BUILD.bazel | 6 + .../abseil-cpp/absl/functional/BUILD.gn | 6 + .../abseil-cpp/absl/functional/CMakeLists.txt | 6 + .../absl/functional/any_invocable.h | 6 +- .../abseil-cpp/absl/functional/function_ref.h | 145 +- .../absl/functional/internal/any_invocable.h | 3 +- .../absl/functional/internal/function_ref.h | 46 +- .../abseil-cpp/absl/hash/internal/hash.cc | 3 +- .../abseil-cpp/absl/hash/internal/hash.h | 6 +- .../abseil-cpp/absl/log/BUILD.bazel | 4 + .../third_party/abseil-cpp/absl/log/BUILD.gn | 5 + .../abseil-cpp/absl/log/CMakeLists.txt | 7 +- .../abseil-cpp/absl/log/check_test_impl.inc | 17 +- .../abseil-cpp/absl/log/die_if_null.cc | 4 +- .../abseil-cpp/absl/log/die_if_null.h | 27 +- .../abseil-cpp/absl/log/internal/BUILD.bazel | 2 +- .../abseil-cpp/absl/log/internal/BUILD.gn | 2 +- .../abseil-cpp/absl/log/internal/check_impl.h | 3 +- .../abseil-cpp/absl/log/internal/check_op.cc | 4 +- .../abseil-cpp/absl/log/internal/check_op.h | 77 +- .../abseil-cpp/absl/log/internal/conditions.h | 73 +- .../abseil-cpp/absl/log/internal/log_impl.h | 212 +- .../absl/log/internal/log_message.cc | 7 +- .../absl/log/internal/log_message.h | 6 +- .../absl/log/internal/log_sink_set.cc | 8 +- .../abseil-cpp/absl/log/internal/strip.h | 61 +- .../absl/log/internal/vlog_config.cc | 10 +- .../absl/log/internal/vlog_config.h | 1 - .../src/third_party/abseil-cpp/absl/log/log.h | 4 +- .../absl/log/log_basic_test_impl.inc | 12 + .../abseil-cpp/absl/log/log_entry.cc | 263 + .../abseil-cpp/absl/log/log_entry.h | 2 + .../abseil-cpp/absl/log/scoped_mock_log.h | 8 +- .../abseil-cpp/absl/meta/type_traits.h | 43 +- .../abseil-cpp/absl/numeric/int128.h | 62 +- .../absl/numeric/int128_have_intrinsic.inc | 38 +- .../absl/numeric/int128_no_intrinsic.inc | 12 +- .../abseil-cpp/absl/profiling/hashtable.cc | 18 +- .../absl/profiling/internal/sample_recorder.h | 14 +- .../absl/random/internal/BUILD.bazel | 1 + .../absl/random/internal/entropy_pool.cc | 4 +- .../absl/random/internal/platform.h | 13 - .../absl/random/internal/seed_material.cc | 28 +- .../absl/status/internal/status_internal.h | 6 +- .../absl/status/internal/statusor_internal.h | 3 +- .../abseil-cpp/absl/status/statusor.h | 2 +- .../abseil-cpp/absl/strings/BUILD.bazel | 32 +- .../abseil-cpp/absl/strings/BUILD.gn | 22 + .../abseil-cpp/absl/strings/CMakeLists.txt | 33 +- .../abseil-cpp/absl/strings/ascii.h | 13 +- .../abseil-cpp/absl/strings/cord.cc | 12 +- .../abseil-cpp/absl/strings/cord.h | 2 +- .../absl/strings/internal/cord_internal.h | 4 +- .../absl/strings/internal/cordz_handle.cc | 12 +- .../absl/strings/internal/cordz_info.cc | 48 +- .../absl/strings/internal/cordz_info.h | 28 +- .../strings/internal/str_format/checker.h | 6 +- .../absl/strings/internal/str_join_internal.h | 31 +- .../abseil-cpp/absl/strings/numbers.cc | 8 +- .../absl/strings/resize_and_overwrite.h | 190 + .../abseil-cpp/absl/strings/str_cat.cc | 87 +- .../abseil-cpp/absl/strings/str_cat.h | 29 +- .../abseil-cpp/absl/strings/string_view.h | 44 +- .../absl/synchronization/BUILD.bazel | 1 + .../abseil-cpp/absl/synchronization/BUILD.gn | 1 + .../absl/synchronization/CMakeLists.txt | 1 + .../absl/synchronization/barrier.cc | 2 +- .../absl/synchronization/blocking_counter.cc | 4 +- .../internal/create_thread_identity.cc | 4 +- .../synchronization/internal/graphcycles.cc | 2 +- .../synchronization/internal/thread_pool.h | 6 +- .../abseil-cpp/absl/synchronization/mutex.cc | 7 +- .../abseil-cpp/absl/synchronization/mutex.h | 142 +- .../absl/synchronization/mutex_benchmark.cc | 24 +- .../absl/synchronization/notification.cc | 10 +- .../abseil-cpp/absl/time/BUILD.bazel | 1 + .../absl/time/civil_time_benchmark.cc | 3 +- .../third_party/abseil-cpp/absl/time/clock.cc | 16 +- .../absl/time/duration_benchmark.cc | 144 + .../absl/time/internal/cctz/BUILD.bazel | 14 +- .../time/internal/cctz/src/cctz_benchmark.cc | 494 +- .../internal/cctz/src/test_time_zone_names.cc | 515 ++ .../internal/cctz/src/test_time_zone_names.h | 33 + .../internal/cctz/src/time_zone_format.cc | 45 +- .../third_party/abseil-cpp/absl/time/time.cc | 8 +- .../third_party/abseil-cpp/absl/time/time.h | 20 +- .../abseil-cpp/absl/types/compare.h | 123 +- .../abseil-cpp/absl/types/internal/span.h | 1 + .../abseil-cpp/absl/types/optional.h | 4 +- .../third_party/abseil-cpp/absl/types/span.h | 47 +- .../abseil-cpp/absl/utility/utility.h | 13 + .../abseil-cpp/generate_def_files.py | 185 +- .../abseil-cpp/symbols_arm64_dbg.def | 916 ++- .../abseil-cpp/symbols_arm64_dbg_cxx23.def | 5815 ++++++++++++++++ .../abseil-cpp/symbols_arm64_rel.def | 82 +- .../abseil-cpp/symbols_arm64_rel_cxx23.def | 1391 ++++ .../abseil-cpp/symbols_x64_dbg.def | 916 ++- .../abseil-cpp/symbols_x64_dbg_cxx23.def | 5819 ++++++++++++++++ .../abseil-cpp/symbols_x64_rel.def | 85 +- .../abseil-cpp/symbols_x64_rel_asan.def | 82 +- .../abseil-cpp/symbols_x64_rel_asan_cxx23.def | 1442 ++++ .../abseil-cpp/symbols_x64_rel_cxx23.def | 1391 ++++ .../abseil-cpp/symbols_x86_dbg.def | 916 ++- .../abseil-cpp/symbols_x86_dbg_cxx23.def | 5817 ++++++++++++++++ .../abseil-cpp/symbols_x86_rel.def | 88 +- .../abseil-cpp/symbols_x86_rel_cxx23.def | 1392 ++++ naiveproxy/src/third_party/ashmem/BUILD.gn | 14 - .../src/third_party/ashmem/DIR_METADATA | 6 - naiveproxy/src/third_party/ashmem/LICENSE | 202 - naiveproxy/src/third_party/ashmem/OWNERS | 2 - .../src/third_party/ashmem/README.chromium | 25 - .../0001-Add-ashmem-get-prot-region.patch | 28 - ...SharedMemory-functions-when-possible.patch | 332 - .../0003-Pthread-once-for-funcs-init.patch | 61 - ...xup-ashmem_get_prot_region-for-memfd.patch | 13 - .../0005-Fix-ashmem-availability-check.patch | 39 - .../src/third_party/boringssl/README.chromium | 1 + .../boringssl/src/API-CONVENTIONS.md | 131 +- .../src/third_party/boringssl/src/BUILDING.md | 8 +- .../third_party/boringssl/src/CMakeLists.txt | 32 +- .../third_party/boringssl/src/CONTRIBUTING.md | 73 +- .../boringssl/src/INCORPORATING.md | 2 +- .../third_party/boringssl/src/MODULE.bazel | 6 +- .../boringssl/src/MODULE.bazel.lock | 8 +- .../src/third_party/boringssl/src/PORTING.md | 2 +- .../third_party/boringssl/src/PRESUBMIT.py | 53 + .../src/third_party/boringssl/src/STYLE.md | 6 +- .../src/third_party/boringssl/src/build.json | 35 +- .../third_party/boringssl/src/cmake/go.cmake | 44 +- .../boringssl/src/cmake/paths.cmake | 12 - .../boringssl/src/crypto/asn1/a_bitstr.cc | 147 +- .../boringssl/src/crypto/asn1/a_bool.cc | 13 +- .../boringssl/src/crypto/asn1/a_d2i_fp.cc | 6 +- .../boringssl/src/crypto/asn1/a_dup.cc | 12 +- .../boringssl/src/crypto/asn1/a_gentm.cc | 37 +- .../boringssl/src/crypto/asn1/a_i2d_fp.cc | 13 +- .../boringssl/src/crypto/asn1/a_int.cc | 114 +- .../boringssl/src/crypto/asn1/a_mbstr.cc | 2 +- .../boringssl/src/crypto/asn1/a_object.cc | 126 +- .../boringssl/src/crypto/asn1/a_strex.cc | 20 +- .../boringssl/src/crypto/asn1/a_strnid.cc | 32 +- .../boringssl/src/crypto/asn1/a_time.cc | 42 +- .../boringssl/src/crypto/asn1/a_type.cc | 277 +- .../boringssl/src/crypto/asn1/a_utctm.cc | 36 +- .../boringssl/src/crypto/asn1/asn1_lib.cc | 108 +- .../boringssl/src/crypto/asn1/asn_pack.cc | 20 +- .../boringssl/src/crypto/asn1/f_int.cc | 2 +- .../boringssl/src/crypto/asn1/f_string.cc | 2 +- .../boringssl/src/crypto/asn1/internal.h | 249 +- .../boringssl/src/crypto/asn1/posix_time.cc | 2 +- .../boringssl/src/crypto/asn1/tasn_dec.cc | 516 +- .../boringssl/src/crypto/asn1/tasn_enc.cc | 33 +- .../boringssl/src/crypto/asn1/tasn_fre.cc | 30 +- .../boringssl/src/crypto/asn1/tasn_new.cc | 38 +- .../boringssl/src/crypto/asn1/tasn_typ.cc | 4 +- .../boringssl/src/crypto/asn1/tasn_utl.cc | 44 +- .../boringssl/src/crypto/base64/base64.cc | 2 +- .../boringssl/src/crypto/bcm_support.h | 7 - .../boringssl/src/crypto/bio/bio.cc | 85 +- .../boringssl/src/crypto/bio/bio_mem.cc | 24 +- .../boringssl/src/crypto/bio/connect.cc | 51 +- .../boringssl/src/crypto/bio/fd.cc | 4 +- .../boringssl/src/crypto/bio/file.cc | 22 +- .../boringssl/src/crypto/bio/pair.cc | 62 +- .../boringssl/src/crypto/bio/printf.cc | 2 +- .../boringssl/src/crypto/bio/socket.cc | 6 +- .../boringssl/src/crypto/blake2/blake2.cc | 4 +- .../boringssl/src/crypto/bn/bn_asn1.cc | 2 +- .../boringssl/src/crypto/bn/convert.cc | 34 +- .../boringssl/src/crypto/bn/div.cc | 2 +- .../boringssl/src/crypto/bn/exponentiation.cc | 8 +- .../boringssl/src/crypto/bn/sqrt.cc | 8 +- .../boringssl/src/crypto/buf/buf.cc | 2 +- .../src/crypto/bytestring/asn1_compat.cc | 6 +- .../boringssl/src/crypto/bytestring/ber.cc | 8 +- .../boringssl/src/crypto/bytestring/cbb.cc | 48 +- .../boringssl/src/crypto/bytestring/cbs.cc | 41 +- .../src/crypto/bytestring/internal.h | 60 +- .../crypto/cipher/asm/aes128gcmsiv-x86_64.pl | 2 +- .../cipher/asm/chacha20_poly1305_armv8.pl | 2 +- .../src/crypto/cipher/e_aesctrhmac.cc | 22 +- .../boringssl/src/crypto/cipher/e_aeseax.cc | 16 +- .../src/crypto/cipher/e_aesgcmsiv.cc | 40 +- .../src/crypto/cipher/e_chacha20poly1305.cc | 20 +- .../boringssl/src/crypto/cipher/e_tls.cc | 57 +- .../boringssl/src/crypto/cipher/get_cipher.cc | 20 +- .../boringssl/src/crypto/cipher/tls_cbc.cc | 5 +- .../boringssl/src/crypto/cms/cms.cc | 2 +- .../boringssl/src/crypto/conf/conf.cc | 90 +- .../boringssl/src/crypto/cpu_aarch64_apple.cc | 2 +- .../src/crypto/cpu_aarch64_openbsd.cc | 2 +- .../boringssl/src/crypto/cpu_arm_linux.cc | 8 +- .../boringssl/src/crypto/cpu_arm_linux.h | 4 +- .../boringssl/src/crypto/crypto.cc | 2 + .../src/crypto/curve25519/spake25519.cc | 17 +- .../boringssl/src/crypto/dh/dh_asn1.cc | 32 +- .../boringssl/src/crypto/dh/params.cc | 42 +- .../src/crypto/digest/digest_extra.cc | 72 +- .../boringssl/src/crypto/dsa/dsa.cc | 123 +- .../boringssl/src/crypto/dsa/dsa_asn1.cc | 120 +- .../boringssl/src/crypto/ec/ec_asn1.cc | 260 +- .../boringssl/src/crypto/ec/ec_derive.cc | 2 +- .../boringssl/src/crypto/ec/hash_to_curve.cc | 116 +- .../boringssl/src/crypto/ec/internal.h | 41 + .../boringssl/src/crypto/ecdh/ecdh.cc | 8 +- .../boringssl/src/crypto/ecdsa/ecdsa_asn1.cc | 71 +- .../boringssl/src/crypto/ecdsa/ecdsa_p1363.cc | 4 +- .../boringssl/src/crypto/engine/engine.cc | 2 +- .../boringssl/src/crypto/err/err.cc | 122 +- .../boringssl/src/crypto/err/evp.errordata | 3 +- .../boringssl/src/crypto/err/ssl.errordata | 5 +- .../boringssl/src/crypto/evp/evp.cc | 183 +- .../boringssl/src/crypto/evp/evp_asn1.cc | 412 +- .../boringssl/src/crypto/evp/evp_ctx.cc | 56 +- .../boringssl/src/crypto/evp/internal.h | 143 +- .../boringssl/src/crypto/evp/p_dh.cc | 146 +- .../boringssl/src/crypto/evp/p_dh_asn1.cc | 142 - .../crypto/evp/{p_dsa_asn1.cc => p_dsa.cc} | 69 +- .../boringssl/src/crypto/evp/p_ec.cc | 380 +- .../boringssl/src/crypto/evp/p_ec_asn1.cc | 307 - .../boringssl/src/crypto/evp/p_ed25519.cc | 243 +- .../src/crypto/evp/p_ed25519_asn1.cc | 225 - .../boringssl/src/crypto/evp/p_hkdf.cc | 42 +- .../boringssl/src/crypto/evp/p_mldsa.cc | 457 ++ .../boringssl/src/crypto/evp/p_rsa.cc | 510 +- .../boringssl/src/crypto/evp/p_rsa_asn1.cc | 198 - .../boringssl/src/crypto/evp/p_x25519.cc | 278 +- .../boringssl/src/crypto/evp/p_x25519_asn1.cc | 237 - .../boringssl/src/crypto/evp/pbkdf.cc | 10 +- .../boringssl/src/crypto/evp/print.cc | 99 +- .../boringssl/src/crypto/evp/scrypt.cc | 2 +- .../boringssl/src/crypto/ex_data.cc | 34 +- .../boringssl/src/crypto/fipsmodule/FIPS.md | 4 +- .../src/crypto/fipsmodule/aes/aes_nohw.cc.inc | 4 +- .../crypto/fipsmodule/aes/asm/aesni-x86_64.pl | 8 +- .../fipsmodule/aes/asm/ghash-ssse3-x86.pl | 2 +- .../fipsmodule/aes/asm/ghash-ssse3-x86_64.pl | 2 +- .../src/crypto/fipsmodule/aes/cbc.cc.inc | 8 +- .../src/crypto/fipsmodule/aes/ctr.cc.inc | 2 +- .../src/crypto/fipsmodule/aes/gcm.cc.inc | 2 +- .../src/crypto/fipsmodule/aes/key_wrap.cc.inc | 6 +- .../src/crypto/fipsmodule/aes/ofb.cc.inc | 4 +- .../boringssl/src/crypto/fipsmodule/bcm.cc | 7 +- .../src/crypto/fipsmodule/bcm_interface.h | 652 +- .../crypto/fipsmodule/bn/asm/armv8-mont.pl | 8 +- .../src/crypto/fipsmodule/bn/asm/co-586.pl | 8 +- .../src/crypto/fipsmodule/bn/bn.cc.inc | 24 +- .../src/crypto/fipsmodule/bn/bytes.cc.inc | 20 +- .../src/crypto/fipsmodule/bn/cmp.cc.inc | 6 +- .../src/crypto/fipsmodule/bn/div.cc.inc | 28 +- .../fipsmodule/bn/exponentiation.cc.inc | 20 +- .../src/crypto/fipsmodule/bn/gcd.cc.inc | 4 +- .../src/crypto/fipsmodule/bn/jacobi.cc.inc | 2 +- .../crypto/fipsmodule/bn/montgomery.cc.inc | 33 +- .../fipsmodule/bn/montgomery_inv.cc.inc | 125 +- .../src/crypto/fipsmodule/bn/mul.cc.inc | 2 +- .../src/crypto/fipsmodule/bn/prime.cc.inc | 26 +- .../src/crypto/fipsmodule/bn/random.cc.inc | 2 +- .../src/crypto/fipsmodule/bn/shift.cc.inc | 2 +- .../src/crypto/fipsmodule/bn/sqrt.cc.inc | 46 +- .../src/crypto/fipsmodule/cipher/aead.cc.inc | 22 +- .../crypto/fipsmodule/cipher/cipher.cc.inc | 24 +- .../src/crypto/fipsmodule/cipher/e_aes.cc.inc | 24 +- .../crypto/fipsmodule/cipher/e_aesccm.cc.inc | 5 +- .../src/crypto/fipsmodule/cmac/cmac.cc.inc | 16 +- .../src/crypto/fipsmodule/dh/check.cc.inc | 13 +- .../src/crypto/fipsmodule/dh/dh.cc.inc | 40 +- .../crypto/fipsmodule/digest/digest.cc.inc | 22 +- .../crypto/fipsmodule/digest/digests.cc.inc | 12 +- .../src/crypto/fipsmodule/digest/internal.h | 2 +- .../fipsmodule/digestsign/digestsign.cc.inc | 22 +- .../fipsmodule/ec/asm/p256-x86_64-asm.pl | 2 +- .../fipsmodule/ec/asm/p256_beeu-armv8-asm.pl | 2 +- .../src/crypto/fipsmodule/ec/ec.cc.inc | 163 +- .../src/crypto/fipsmodule/ec/ec_key.cc.inc | 100 +- .../crypto/fipsmodule/ec/ec_montgomery.cc.inc | 4 +- .../src/crypto/fipsmodule/ec/felem.cc.inc | 2 +- .../src/crypto/fipsmodule/ec/internal.h | 4 +- .../src/crypto/fipsmodule/ec/oct.cc.inc | 20 +- .../src/crypto/fipsmodule/ec/p224-64.cc.inc | 4 +- .../crypto/fipsmodule/ec/p256-nistz.cc.inc | 16 +- .../src/crypto/fipsmodule/ec/p256.cc.inc | 8 +- .../src/crypto/fipsmodule/ec/simple.cc.inc | 6 +- .../crypto/fipsmodule/ec/simple_mul.cc.inc | 25 +- .../src/crypto/fipsmodule/ec/wnaf.cc.inc | 18 +- .../src/crypto/fipsmodule/ecdh/ecdh.cc.inc | 5 +- .../src/crypto/fipsmodule/ecdsa/ecdsa.cc.inc | 11 +- .../src/crypto/fipsmodule/entropy/internal.h | 38 + .../crypto/fipsmodule/entropy/jitter.cc.inc | 463 ++ .../crypto/fipsmodule/entropy/sha512.cc.inc | 324 + .../src/crypto/fipsmodule/hkdf/hkdf.cc.inc | 12 +- .../src/crypto/fipsmodule/hmac/hmac.cc.inc | 19 +- .../fipsmodule/mldsa/fips_known_values.inc | 10 +- .../src/crypto/fipsmodule/mldsa/mldsa.cc.inc | 1022 +-- .../fipsmodule/mlkem/fips_known_values.inc | 10 +- .../src/crypto/fipsmodule/mlkem/mlkem.cc.inc | 337 +- .../src/crypto/fipsmodule/rand/ctrdrbg.cc.inc | 284 +- .../src/crypto/fipsmodule/rand/internal.h | 17 +- .../src/crypto/fipsmodule/rand/rand.cc.inc | 83 +- .../src/crypto/fipsmodule/rsa/blinding.cc.inc | 11 +- .../src/crypto/fipsmodule/rsa/internal.h | 18 + .../src/crypto/fipsmodule/rsa/padding.cc.inc | 16 +- .../src/crypto/fipsmodule/rsa/rsa.cc.inc | 156 +- .../src/crypto/fipsmodule/rsa/rsa_impl.cc.inc | 138 +- .../crypto/fipsmodule/self_check/fips.cc.inc | 4 +- .../fipsmodule/self_check/self_check.cc.inc | 119 +- .../fipsmodule/service_indicator/internal.h | 2 +- .../service_indicator.cc.inc | 18 +- .../src/crypto/fipsmodule/sha/sha1.cc.inc | 4 +- .../src/crypto/fipsmodule/sha/sha256.cc.inc | 26 +- .../src/crypto/fipsmodule/sha/sha512.cc.inc | 28 +- .../src/crypto/fipsmodule/tls/kdf.cc.inc | 8 +- .../boringssl/src/crypto/fuzzer_mode.cc | 8 +- .../boringssl/src/crypto/hpke/hpke.cc | 200 +- .../boringssl/src/crypto/hrss/hrss.cc | 10 +- .../boringssl/src/crypto/internal.h | 143 +- .../boringssl/src/crypto/kyber/internal.h | 111 +- .../boringssl/src/crypto/kyber/kyber.cc | 5 +- .../boringssl/src/crypto/lhash/internal.h | 2 +- .../boringssl/src/crypto/lhash/lhash.cc | 46 +- .../third_party/boringssl/src/crypto/mem.cc | 61 +- .../boringssl/src/crypto/mem_internal.h | 4 + .../boringssl/src/crypto/mldsa/mldsa.cc | 207 +- .../boringssl/src/crypto/mlkem/mlkem.cc | 78 +- .../boringssl/src/crypto/obj/obj.cc | 131 +- .../boringssl/src/crypto/obj/obj_dat.h | 74 +- .../boringssl/src/crypto/obj/obj_mac.num | 5 + .../boringssl/src/crypto/obj/obj_xref.cc | 22 +- .../boringssl/src/crypto/obj/objects.go | 47 +- .../boringssl/src/crypto/pem/pem_all.cc | 39 +- .../boringssl/src/crypto/pem/pem_info.cc | 82 +- .../boringssl/src/crypto/pem/pem_lib.cc | 58 +- .../boringssl/src/crypto/pem/pem_oth.cc | 12 +- .../boringssl/src/crypto/pem/pem_pk8.cc | 26 +- .../boringssl/src/crypto/pem/pem_pkey.cc | 22 +- .../boringssl/src/crypto/perlasm/readme | 4 +- .../boringssl/src/crypto/pkcs7/pkcs7.cc | 21 +- .../boringssl/src/crypto/pkcs7/pkcs7_x509.cc | 64 +- .../boringssl/src/crypto/pkcs8/p5_pbev2.cc | 4 +- .../boringssl/src/crypto/pkcs8/pkcs8.cc | 54 +- .../boringssl/src/crypto/pkcs8/pkcs8_x509.cc | 149 +- .../boringssl/src/crypto/pool/pool.cc | 52 +- .../src/crypto/rand/deterministic.cc | 5 - .../boringssl/src/crypto/rand/fork_detect.cc | 22 +- .../boringssl/src/crypto/rand/forkunsafe.cc | 10 +- .../boringssl/src/crypto/rand/getentropy.cc | 5 - .../boringssl/src/crypto/rand/ios.cc | 5 - .../boringssl/src/crypto/rand/passive.cc | 2 +- .../boringssl/src/crypto/rand/rand.cc | 2 +- .../boringssl/src/crypto/rand/trusty.cc | 5 - .../boringssl/src/crypto/rand/urandom.cc | 54 +- .../boringssl/src/crypto/rand/windows.cc | 13 +- .../boringssl/src/crypto/refcount.cc | 9 +- .../boringssl/src/crypto/rsa/internal.h | 20 + .../boringssl/src/crypto/rsa/rsa_asn1.cc | 241 +- .../boringssl/src/crypto/rsa/rsa_crypt.cc | 30 +- .../boringssl/src/crypto/rsa/rsa_extra.cc | 11 + .../boringssl/src/crypto/sha/sha512.cc | 6 +- .../boringssl/src/crypto/stack/stack.cc | 88 +- .../src/crypto/test/asm/trampoline-x86_64.pl | 2 +- .../src/crypto/test/der_trailing_data.cc | 78 + .../src/crypto/test/der_trailing_data.h | 38 + .../boringssl/src/crypto/test/file_test.h | 41 +- .../boringssl/src/crypto/test/test_util.cc | 19 +- .../boringssl/src/crypto/test/test_util.h | 9 +- .../boringssl/src/crypto/thread.cc | 8 +- .../boringssl/src/crypto/thread_pthread.cc | 16 +- .../boringssl/src/crypto/thread_win.cc | 16 +- .../src/crypto/trust_token/pmbtoken.cc | 107 +- .../src/crypto/trust_token/trust_token.cc | 97 +- .../boringssl/src/crypto/trust_token/voprf.cc | 51 +- .../boringssl/src/crypto/x509/a_digest.cc | 10 +- .../boringssl/src/crypto/x509/a_sign.cc | 101 +- .../boringssl/src/crypto/x509/a_verify.cc | 54 +- .../boringssl/src/crypto/x509/algorithm.cc | 33 +- .../boringssl/src/crypto/x509/asn1_gen.cc | 36 +- .../boringssl/src/crypto/x509/by_dir.cc | 36 +- .../boringssl/src/crypto/x509/by_file.cc | 56 +- .../boringssl/src/crypto/x509/internal.h | 132 +- .../boringssl/src/crypto/x509/name_print.cc | 8 +- .../boringssl/src/crypto/x509/policy.cc | 151 +- .../boringssl/src/crypto/x509/rsa_pss.cc | 354 +- .../boringssl/src/crypto/x509/t_crl.cc | 17 +- .../boringssl/src/crypto/x509/t_req.cc | 25 +- .../boringssl/src/crypto/x509/t_x509.cc | 39 +- .../crypto/x509/test/basic_constraints_ca.pem | 15 +- .../test/basic_constraints_ca_pathlen_0.pem | 15 +- .../test/basic_constraints_ca_pathlen_1.pem | 15 +- .../test/basic_constraints_ca_pathlen_10.pem | 15 +- .../x509/test/basic_constraints_leaf.pem | 4 +- .../x509/test/basic_constraints_none.pem | 8 +- .../src/crypto/x509/test/make_unusual_tbs.go | 140 + .../crypto/x509/test/rsa_pss_sha256_key.pk8 | Bin 0 -> 1268 bytes .../x509/test/unusual_tbs_critical_ber.pem | 9 + ...unusual_tbs_critical_false_not_omitted.pem | 9 + ...nusual_tbs_empty_extension_not_omitted.pem | 8 + .../src/crypto/x509/test/unusual_tbs_key.pem | 5 + .../test/unusual_tbs_null_sigalg_param.pem | 8 + .../crypto/x509/test/unusual_tbs_uid_both.pem | 9 + .../x509/test/unusual_tbs_uid_issuer.pem | 8 + .../x509/test/unusual_tbs_uid_subject.pem | 8 + .../x509/test/unusual_tbs_v1_not_omitted.pem | 8 + .../unusual_tbs_wrong_attribute_order.pem | 9 + .../boringssl/src/crypto/x509/v3_akey.cc | 46 +- .../boringssl/src/crypto/x509/v3_akeya.cc | 2 +- .../boringssl/src/crypto/x509/v3_alt.cc | 144 +- .../boringssl/src/crypto/x509/v3_bcons.cc | 24 +- .../boringssl/src/crypto/x509/v3_bitst.cc | 27 +- .../boringssl/src/crypto/x509/v3_conf.cc | 70 +- .../boringssl/src/crypto/x509/v3_cpols.cc | 52 +- .../boringssl/src/crypto/x509/v3_crld.cc | 103 +- .../boringssl/src/crypto/x509/v3_enum.cc | 20 +- .../boringssl/src/crypto/x509/v3_extku.cc | 28 +- .../boringssl/src/crypto/x509/v3_genn.cc | 18 +- .../boringssl/src/crypto/x509/v3_ia5.cc | 10 +- .../boringssl/src/crypto/x509/v3_info.cc | 46 +- .../boringssl/src/crypto/x509/v3_int.cc | 58 +- .../boringssl/src/crypto/x509/v3_lib.cc | 35 +- .../boringssl/src/crypto/x509/v3_ncons.cc | 104 +- .../boringssl/src/crypto/x509/v3_ocsp.cc | 38 +- .../boringssl/src/crypto/x509/v3_pcons.cc | 24 +- .../boringssl/src/crypto/x509/v3_pmaps.cc | 26 +- .../boringssl/src/crypto/x509/v3_prn.cc | 10 +- .../boringssl/src/crypto/x509/v3_purp.cc | 83 +- .../boringssl/src/crypto/x509/v3_skey.cc | 44 +- .../boringssl/src/crypto/x509/v3_utl.cc | 173 +- .../boringssl/src/crypto/x509/x509_att.cc | 46 +- .../boringssl/src/crypto/x509/x509_cmp.cc | 131 +- .../boringssl/src/crypto/x509/x509_d2.cc | 18 +- .../boringssl/src/crypto/x509/x509_ext.cc | 57 +- .../boringssl/src/crypto/x509/x509_lu.cc | 199 +- .../boringssl/src/crypto/x509/x509_obj.cc | 28 +- .../boringssl/src/crypto/x509/x509_req.cc | 57 +- .../boringssl/src/crypto/x509/x509_set.cc | 121 +- .../boringssl/src/crypto/x509/x509_trs.cc | 14 +- .../boringssl/src/crypto/x509/x509_v3.cc | 66 +- .../boringssl/src/crypto/x509/x509_vfy.cc | 114 +- .../boringssl/src/crypto/x509/x509_vpm.cc | 41 +- .../boringssl/src/crypto/x509/x509cset.cc | 55 +- .../boringssl/src/crypto/x509/x509name.cc | 121 +- .../boringssl/src/crypto/x509/x509rset.cc | 15 +- .../boringssl/src/crypto/x509/x509spki.cc | 26 +- .../boringssl/src/crypto/x509/x_algor.cc | 152 +- .../boringssl/src/crypto/x509/x_all.cc | 102 +- .../boringssl/src/crypto/x509/x_attrib.cc | 8 +- .../boringssl/src/crypto/x509/x_crl.cc | 67 +- .../boringssl/src/crypto/x509/x_name.cc | 766 +-- .../boringssl/src/crypto/x509/x_pubkey.cc | 216 +- .../boringssl/src/crypto/x509/x_req.cc | 6 +- .../boringssl/src/crypto/x509/x_sig.cc | 8 +- .../boringssl/src/crypto/x509/x_val.cc | 28 - .../boringssl/src/crypto/x509/x_x509.cc | 506 +- .../boringssl/src/crypto/x509/x_x509a.cc | 28 +- .../boringssl/src/crypto/xwing/xwing.cc | 40 +- .../boringssl/src/decrepit/bio/base64_bio.cc | 16 +- .../boringssl/src/decrepit/evp/evp_do_all.cc | 120 +- .../boringssl/src/decrepit/ripemd/ripemd.cc | 2 +- .../src/decrepit/rsa/rsa_decrepit.cc | 6 +- .../src/decrepit/ssl/ssl_decrepit.cc | 4 +- .../src/decrepit/x509/x509_decrepit.cc | 4 +- .../boringssl/src/decrepit/xts/xts.cc | 4 +- .../boringssl/src/docs/releasing.md | 30 +- .../boringssl/src/gen/bcm/armv8-mont-apple.S | 8 +- .../boringssl/src/gen/bcm/armv8-mont-linux.S | 8 +- .../boringssl/src/gen/bcm/armv8-mont-win.S | 8 +- .../crypto/chacha20_poly1305_armv8-apple.S | 2 +- .../crypto/chacha20_poly1305_armv8-linux.S | 2 +- .../gen/crypto/chacha20_poly1305_armv8-win.S | 2 +- .../boringssl/src/gen/crypto/err_data.cc | 1000 +-- .../third_party/boringssl/src/gen/sources.bzl | 88 +- .../boringssl/src/gen/sources.cmake | 92 +- .../third_party/boringssl/src/gen/sources.gni | 88 +- .../boringssl/src/gen/sources.json | 90 +- .../third_party/boringssl/src/gen/sources.mk | 88 +- .../boringssl/src/include/openssl/aead.h | 2 +- .../boringssl/src/include/openssl/asm_base.h | 2 +- .../boringssl/src/include/openssl/asn1.h | 31 +- .../boringssl/src/include/openssl/asn1t.h | 4 +- .../boringssl/src/include/openssl/base.h | 5 +- .../src/include/openssl/bcm_public.h | 83 - .../boringssl/src/include/openssl/bn.h | 3 + .../src/include/openssl/bytestring.h | 4 +- .../boringssl/src/include/openssl/cipher.h | 37 +- .../boringssl/src/include/openssl/cms.h | 2 +- .../boringssl/src/include/openssl/conf.h | 3 + .../boringssl/src/include/openssl/crypto.h | 5 +- .../boringssl/src/include/openssl/ctrdrbg.h | 48 +- .../boringssl/src/include/openssl/dh.h | 18 +- .../boringssl/src/include/openssl/digest.h | 7 +- .../boringssl/src/include/openssl/ec.h | 30 +- .../boringssl/src/include/openssl/ec_key.h | 2 +- .../boringssl/src/include/openssl/err.h | 9 +- .../boringssl/src/include/openssl/evp.h | 374 +- .../src/include/openssl/evp_errors.h | 3 +- .../src/include/openssl/experimental/kyber.h | 146 - .../boringssl/src/include/openssl/hmac.h | 8 +- .../boringssl/src/include/openssl/hpke.h | 10 +- .../boringssl/src/include/openssl/kdf.h | 3 +- .../boringssl/src/include/openssl/mldsa.h | 51 +- .../boringssl/src/include/openssl/nid.h | 1296 +++- .../boringssl/src/include/openssl/pkcs7.h | 3 +- .../src/include/openssl/pki/certificate.h | 6 +- .../src/include/openssl/pki/verify_error.h | 2 +- .../boringssl/src/include/openssl/rsa.h | 9 +- .../boringssl/src/include/openssl/sha.h | 26 +- .../boringssl/src/include/openssl/sha2.h | 18 +- .../boringssl/src/include/openssl/span.h | 259 +- .../boringssl/src/include/openssl/ssl.h | 173 +- .../boringssl/src/include/openssl/ssl3.h | 74 +- .../boringssl/src/include/openssl/tls1.h | 321 +- .../boringssl/src/include/openssl/x509.h | 318 +- .../infra/config/generated/cr-buildbucket.cfg | 2617 ++----- .../src/infra/config/generated/project.cfg | 2 +- .../boringssl/src/infra/config/main.star | 19 +- .../boringssl/src/pki/cert_errors.h | 2 +- .../boringssl/src/pki/certificate_policies.h | 2 +- .../boringssl/src/pki/common_cert_errors.h | 4 +- .../src/third_party/boringssl/src/pki/input.h | 3 +- .../src/third_party/boringssl/src/pki/ocsp.cc | 4 +- .../boringssl/src/pki/parse_certificate.h | 2 +- .../boringssl/src/pki/path_builder.cc | 4 +- .../src/third_party/boringssl/src/pki/pem.cc | 42 +- .../src/third_party/boringssl/src/pki/pem.h | 31 +- .../boringssl/src/pki/signature_algorithm.cc | 37 +- .../src/pki/simple_path_builder_delegate.cc | 7 +- .../boringssl/src/pki/string_util.cc | 2 +- .../boringssl/src/pki/test_helpers.cc | 2 +- .../third_party/boringssl/src/pki/verify.cc | 2 +- .../src/pki/verify_certificate_chain.cc | 4 +- .../boringssl/src/pki/verify_signed_data.cc | 22 +- .../src/rust/bssl-crypto/src/cipher/mod.rs | 2 +- .../boringssl/src/rust/bssl-crypto/src/ec.rs | 80 +- .../src/rust/bssl-crypto/src/ed25519.rs | 53 +- .../src/rust/bssl-crypto/src/hkdf.rs | 2 +- .../src/rust/bssl-crypto/src/hpke.rs | 16 +- .../boringssl/src/rust/bssl-crypto/src/lib.rs | 12 +- .../src/rust/bssl-crypto/src/mldsa.rs | 185 +- .../boringssl/src/rust/bssl-crypto/src/rsa.rs | 27 +- .../src/rust/bssl-crypto/src/scoped.rs | 44 +- .../src/rust/bssl-sys/CMakeLists.txt | 6 +- .../boringssl/src/rust/bssl-sys/src/lib.rs | 2 +- .../third_party/boringssl/src/ssl/bio_ssl.cc | 12 +- .../third_party/boringssl/src/ssl/d1_both.cc | 39 +- .../third_party/boringssl/src/ssl/d1_lib.cc | 5 +- .../third_party/boringssl/src/ssl/d1_srtp.cc | 2 +- .../boringssl/src/ssl/dtls_record.cc | 2 +- .../src/ssl/encrypted_client_hello.cc | 12 +- .../boringssl/src/ssl/extensions.cc | 311 +- .../third_party/boringssl/src/ssl/handoff.cc | 25 +- .../boringssl/src/ssl/handshake.cc | 8 +- .../boringssl/src/ssl/handshake_client.cc | 47 +- .../boringssl/src/ssl/handshake_server.cc | 45 +- .../third_party/boringssl/src/ssl/internal.h | 91 +- .../third_party/boringssl/src/ssl/s3_both.cc | 25 +- .../third_party/boringssl/src/ssl/s3_lib.cc | 4 +- .../boringssl/src/ssl/ssl_aead_ctx.cc | 2 +- .../third_party/boringssl/src/ssl/ssl_asn1.cc | 20 +- .../boringssl/src/ssl/ssl_buffer.cc | 2 +- .../third_party/boringssl/src/ssl/ssl_cert.cc | 51 +- .../boringssl/src/ssl/ssl_cipher.cc | 222 +- .../boringssl/src/ssl/ssl_credential.cc | 5 +- .../third_party/boringssl/src/ssl/ssl_file.cc | 6 +- .../boringssl/src/ssl/ssl_key_share.cc | 81 +- .../third_party/boringssl/src/ssl/ssl_lib.cc | 295 +- .../boringssl/src/ssl/ssl_privkey.cc | 58 +- .../boringssl/src/ssl/ssl_session.cc | 46 +- .../boringssl/src/ssl/ssl_transcript.cc | 6 +- .../boringssl/src/ssl/ssl_versions.cc | 8 +- .../third_party/boringssl/src/ssl/ssl_x509.cc | 123 +- .../third_party/boringssl/src/ssl/t1_enc.cc | 2 +- .../boringssl/src/ssl/tls13_both.cc | 5 +- .../boringssl/src/ssl/tls13_client.cc | 21 +- .../boringssl/src/ssl/tls13_enc.cc | 22 +- .../boringssl/src/ssl/tls13_server.cc | 12 +- .../boringssl/src/ssl/tls_record.cc | 4 +- .../boringssl/src/third_party/fiat/README.md | 4 +- .../src/third_party/fiat/curve25519_64_adx.h | 4 +- .../third_party/fiat/p256_field_32.br.c.inc | 2 - .../third_party/fiat/p256_field_64.br.c.inc | 4 - .../src/third_party/fiat/p256_point.br.c.inc | 3 - .../third_party/boringssl/src/tool/digest.cc | 6 +- .../third_party/boringssl/src/tool/speed.cc | 117 +- .../compiler-rt/src/lib/builtins/assembly.h | 27 +- .../third_party/cpu_features/README.chromium | 1 + .../src/third_party/jni_zero/README.chromium | 1 + .../jni_zero/codegen/header_common.py | 13 +- .../src/third_party/jni_zero/common_apis.h | 1 + .../src/org/jni_zero/AccessedByNative.java | 2 +- .../java/src/org/jni_zero/CalledByNative.java | 2 +- .../jni_zero/CalledByNativeForTesting.java | 2 +- .../org/jni_zero/CalledByNativeUnchecked.java | 2 +- .../java/src/org/jni_zero/JNINamespace.java | 2 +- .../java/src/org/jni_zero/JniType.java | 2 +- .../jni_zero/NativeClassQualifiedName.java | 2 +- .../java/src/org/jni_zero/NativeMethods.java | 2 +- .../src/third_party/jni_zero/java_refs.h | 4 +- .../src/third_party/jni_zero/jni_generator.py | 45 +- .../jni_zero/jni_registration_generator.py | 27 +- .../src/third_party/jni_zero/jni_zero.gni | 27 +- .../src/third_party/jni_zero/jni_zero.py | 24 +- naiveproxy/src/third_party/jni_zero/parse.py | 37 +- .../jni_zero/test/integration_tests.py | 19 +- .../org/jni_zero/SampleProxyEdgeCases.java | 7 +- .../test/java/src/org/stubs/MyClass.java | 4 +- .../src/third_party/libc++/README.chromium | 1 + .../src/third_party/libc++/src/CMakeLists.txt | 9 +- .../libc++/src/cmake/caches/Armv7Arm.cmake | 2 + .../src/cmake/caches/Armv7M-picolibc.cmake | 1 + .../caches/Armv7Thumb-no-exceptions.cmake | 2 + .../libc++/src/cmake/caches/Armv8Arm.cmake | 2 + .../caches/Armv8Thumb-no-exceptions.cmake | 2 + .../caches/Generic-hardening-mode-debug.cmake | 2 + .../Generic-hardening-mode-extensive.cmake | 2 + ...-hardening-mode-fast-with-abi-breaks.cmake | 3 + .../caches/Generic-hardening-mode-fast.cmake | 2 + .../src/cmake/caches/Generic-merged.cmake | 3 + .../src/cmake/caches/Generic-msan.cmake | 2 +- .../caches/Generic-optimized-speed.cmake | 2 + .../src/cmake/caches/Generic-static.cmake | 2 + .../src/cmake/caches/Generic-tsan.cmake | 2 + .../src/cmake/caches/Generic-ubsan.cmake | 2 + .../libc++/src/docs/ABIGuarantees.rst | 4 + .../libc++/src/docs/Contributing.rst | 100 +- .../docs/DesignDocs/HeaderRemovalPolicy.rst | 34 +- .../src/docs/DesignDocs/VisibilityMacros.rst | 4 +- .../libc++/src/docs/FeatureTestMacroTable.rst | 8 +- .../third_party/libc++/src/docs/Modules.rst | 5 +- .../libc++/src/docs/ReleaseNotes/21.rst | 18 +- .../libc++/src/docs/ReleaseNotes/22.rst | 57 +- .../libc++/src/docs/Status/Cxx17Issues.csv | 630 +- .../libc++/src/docs/Status/Cxx17Papers.csv | 226 +- .../libc++/src/docs/Status/Cxx20Issues.csv | 604 +- .../libc++/src/docs/Status/Cxx20Papers.csv | 412 +- .../libc++/src/docs/Status/Cxx23Issues.csv | 616 +- .../libc++/src/docs/Status/Cxx23Papers.csv | 244 +- .../libc++/src/docs/Status/Cxx2cIssues.csv | 306 +- .../libc++/src/docs/Status/Cxx2cPapers.csv | 318 +- .../libc++/src/docs/TestingLibcxx.rst | 59 +- .../libc++/src/docs/VendorDocumentation.rst | 2 +- .../src/third_party/libc++/src/docs/index.rst | 4 +- .../libc++/src/include/CMakeLists.txt | 23 +- .../libc++/src/include/__algorithm/comp.h | 4 + .../libc++/src/include/__algorithm/copy.h | 3 +- .../src/include/__algorithm/copy_backward.h | 3 +- .../libc++/src/include/__algorithm/count.h | 4 +- .../libc++/src/include/__algorithm/fill.h | 36 +- .../libc++/src/include/__algorithm/fill_n.h | 48 +- .../libc++/src/include/__algorithm/find.h | 114 +- .../libc++/src/include/__algorithm/for_each.h | 6 - .../libc++/src/include/__algorithm/generate.h | 6 +- .../src/include/__algorithm/generate_n.h | 13 +- .../src/include/__algorithm/is_permutation.h | 8 +- .../lexicographical_compare_three_way.h | 12 +- .../src/include/__algorithm/make_heap.h | 20 +- .../libc++/src/include/__algorithm/mismatch.h | 2 +- .../libc++/src/include/__algorithm/move.h | 3 +- .../src/include/__algorithm/move_backward.h | 3 +- .../src/include/__algorithm/partial_sort.h | 2 +- .../include/__algorithm/partial_sort_copy.h | 2 +- .../libc++/src/include/__algorithm/pstl.h | 4 +- .../src/include/__algorithm/radix_sort.h | 52 +- .../src/include/__algorithm/ranges_fill.h | 13 +- .../src/include/__algorithm/sift_down.h | 37 +- .../src/include/__algorithm/simd_utils.h | 7 +- .../libc++/src/include/__algorithm/sort.h | 3 + .../src/include/__algorithm/stable_sort.h | 2 +- .../libc++/src/include/__atomic/atomic.h | 66 +- .../libc++/src/include/__atomic/atomic_flag.h | 51 +- .../libc++/src/include/__atomic/atomic_ref.h | 32 +- .../libc++/src/include/__atomic/atomic_sync.h | 33 +- .../include/__atomic/floating_point_helper.h | 55 + .../libc++/src/include/__bit/bit_log2.h | 2 + .../libc++/src/include/__bit/countl.h | 3 +- .../libc++/src/include/__bit/countr.h | 3 +- .../libc++/src/include/__bit/has_single_bit.h | 2 +- .../libc++/src/include/__bit/popcount.h | 1 - .../libc++/src/include/__bit/rotate.h | 51 +- .../include/__charconv/from_chars_result.h | 2 +- .../src/include/__charconv/to_chars_result.h | 2 +- .../libc++/src/include/__chrono/file_clock.h | 2 +- .../libc++/src/include/__chrono/time_point.h | 2 +- .../src/include/__compare/strong_order.h | 42 +- .../third_party/libc++/src/include/__config | 15 +- .../libc++/src/include/__configuration/abi.h | 26 +- .../include/__configuration/availability.h | 68 +- .../__coroutine/noop_coroutine_handle.h | 14 +- .../src/include/__cxx03/__algorithm/count.h | 10 +- .../src/include/__cxx03/__algorithm/find.h | 6 +- .../include/__cxx03/__algorithm/for_each.h | 6 - .../src/include/__cxx03/__atomic/atomic.h | 8 +- .../include/__cxx03/__atomic/atomic_base.h | 4 + .../src/include/__cxx03/__bit/popcount.h | 12 +- .../src/include/__cxx03/__bit_reference | 18 +- .../src/include/__cxx03/__chrono/time_point.h | 2 +- .../libc++/src/include/__cxx03/__config | 12 - .../src/include/__cxx03/__iterator/prev.h | 18 +- .../libc++/src/include/__cxx03/__locale | 14 +- .../src/include/__cxx03/__math/traits.h | 31 +- .../src/include/__cxx03/__mutex/once_flag.h | 5 +- .../__cxx03/__thread/support/pthread.h | 2 +- .../src/include/__cxx03/__verbose_abort | 2 +- .../libc++/src/include/__cxx03/bitset | 108 +- .../libc++/src/include/__cxx03/cctype | 4 +- .../libc++/src/include/__cxx03/cerrno | 4 +- .../libc++/src/include/__cxx03/cfenv | 4 +- .../libc++/src/include/__cxx03/cfloat | 4 +- .../libc++/src/include/__cxx03/cinttypes | 4 +- .../libc++/src/include/__cxx03/complex.h | 32 - .../libc++/src/include/__cxx03/cstddef | 4 +- .../libc++/src/include/__cxx03/cstdio | 4 +- .../libc++/src/include/__cxx03/ctype.h | 61 - .../libc++/src/include/__cxx03/cwctype | 4 +- .../libc++/src/include/__cxx03/errno.h | 399 -- .../libc++/src/include/__cxx03/ext/__hash | 2 +- .../libc++/src/include/__cxx03/fenv.h | 114 - .../libc++/src/include/__cxx03/float.h | 95 - .../libc++/src/include/__cxx03/forward_list | 76 +- .../libc++/src/include/__cxx03/fstream | 43 +- .../libc++/src/include/__cxx03/inttypes.h | 264 - .../libc++/src/include/__cxx03/ios | 3 +- .../libc++/src/include/__cxx03/list | 164 +- .../libc++/src/include/__cxx03/locale | 25 +- .../libc++/src/include/__cxx03/regex | 4 +- .../libc++/src/include/__cxx03/sstream | 42 +- .../libc++/src/include/__cxx03/stdbool.h | 40 - .../libc++/src/include/__cxx03/stddef.h | 44 - .../libc++/src/include/__cxx03/stdio.h | 123 - .../libc++/src/include/__cxx03/string | 26 +- .../libc++/src/include/__cxx03/tgmath.h | 34 - .../libc++/src/include/__cxx03/vector | 16 +- .../libc++/src/include/__cxx03/wchar.h | 2 +- .../libc++/src/include/__cxx03/wctype.h | 95 - .../strict_weak_ordering_check.h | 2 +- .../src/include/__exception/exception.h | 2 +- .../libc++/src/include/__expected/expected.h | 11 +- .../include/__filesystem/directory_entry.h | 4 - .../include/__filesystem/directory_iterator.h | 10 +- .../src/include/__filesystem/file_status.h | 2 +- .../include/__filesystem/filesystem_error.h | 8 +- .../src/include/__filesystem/operations.h | 4 - .../libc++/src/include/__filesystem/path.h | 8 +- .../src/include/__filesystem/path_iterator.h | 2 - .../recursive_directory_iterator.h | 10 +- .../src/include/__filesystem/space_info.h | 2 +- .../libc++/src/include/__filesystem/u8path.h | 4 - .../libc++/src/include/__flat_map/flat_map.h | 35 +- .../src/include/__flat_map/flat_multimap.h | 38 +- .../include/__flat_map/key_value_iterator.h | 1 - .../src/include/__flat_set/flat_multiset.h | 47 +- .../libc++/src/include/__flat_set/flat_set.h | 40 +- .../src/include/__format/formatter_output.h | 2 +- .../src/include/__functional/function.h | 126 +- .../libc++/src/include/__functional/hash.h | 14 +- .../src/include/__functional/is_transparent.h | 8 + .../src/include/__functional/operations.h | 18 + .../include/__functional/ranges_operations.h | 7 + .../libc++/src/include/__fwd/map.h | 31 - .../libc++/src/include/__fwd/tuple.h | 14 + .../libc++/src/include/__hash_table | 537 +- .../include/__iterator/back_insert_iterator.h | 8 +- .../src/include/__iterator/bounded_iter.h | 15 +- .../libc++/src/include/__iterator/concepts.h | 2 +- .../__iterator/cpp17_iterator_concepts.h | 25 +- .../libc++/src/include/__iterator/distance.h | 55 +- .../__iterator/front_insert_iterator.h | 8 +- .../src/include/__iterator/insert_iterator.h | 8 +- .../src/include/__iterator/istream_iterator.h | 13 +- .../include/__iterator/istreambuf_iterator.h | 13 +- .../libc++/src/include/__iterator/iterator.h | 13 + .../src/include/__iterator/iterator_traits.h | 27 +- .../src/include/__iterator/ostream_iterator.h | 8 +- .../include/__iterator/ostreambuf_iterator.h | 8 +- .../src/include/__iterator/reverse_iterator.h | 21 +- .../include/__iterator/static_bounded_iter.h | 6 +- .../libc++/src/include/__iterator/wrap_iter.h | 14 +- .../third_party/libc++/src/include/__locale | 2 +- .../libc++/src/include/__locale_dir/time.h | 10 +- .../libc++/src/include/__math/hypot.h | 2 +- .../libc++/src/include/__math/traits.h | 76 + .../src/include/__memory/allocate_at_least.h | 25 +- .../src/include/__memory/array_cookie.h | 84 +- .../src/include/__memory/compressed_pair.h | 64 +- .../src/include/__memory/pointer_traits.h | 2 +- .../include/__memory/raw_storage_iterator.h | 8 +- .../src/include/__memory/shared_count.h | 39 +- .../libc++/src/include/__memory/shared_ptr.h | 93 +- .../__memory/uninitialized_algorithms.h | 158 +- .../__memory/uses_allocator_construction.h | 1 + .../__memory_resource/polymorphic_allocator.h | 1 + .../include/__memory_resource/pool_options.h | 2 +- .../libc++/src/include/__mutex/once_flag.h | 12 +- .../libc++/src/include/__mutex/tag_types.h | 6 +- .../libc++/src/include/__new/nothrow_t.h | 2 +- .../libc++/src/include/__numeric/pstl.h | 4 +- .../src/include/__pstl/backends/default.h | 28 +- .../src/include/__pstl/backends/libdispatch.h | 4 +- .../src/include/__pstl/cpu_algos/find_if.h | 2 +- .../src/include/__pstl/cpu_algos/transform.h | 11 +- .../__pstl/cpu_algos/transform_reduce.h | 9 +- .../include/__random/binomial_distribution.h | 20 +- .../src/include/__ranges/as_rvalue_view.h | 2 +- .../libc++/src/include/__ranges/iota_view.h | 16 +- .../libc++/src/include/__ranges/join_view.h | 9 +- .../libc++/src/include/__split_buffer | 840 ++- .../include/__stop_token/atomic_unique_lock.h | 2 +- .../src/include/__stop_token/stop_callback.h | 4 +- .../src/include/__stop_token/stop_source.h | 2 +- .../src/include/__stop_token/stop_state.h | 8 +- .../src/include/__stop_token/stop_token.h | 2 +- .../libc++/src/include/__string/char_traits.h | 7 + .../include/__string/constexpr_c_functions.h | 3 +- .../include/__system_error/error_category.h | 2 +- .../libc++/src/include/__thread/id.h | 2 +- .../libc++/src/include/__thread/jthread.h | 2 +- .../src/include/__thread/poll_with_backoff.h | 2 +- .../src/third_party/libc++/src/include/__tree | 1107 +-- .../src/include/__tuple/make_tuple_types.h | 77 - .../src/include/__tuple/sfinae_helpers.h | 45 +- .../src/include/__tuple/tuple_element.h | 11 - .../src/include/__tuple/tuple_like_ext.h | 52 - .../libc++/src/include/__tuple/tuple_size.h | 3 - .../include/__type_traits/can_extract_key.h | 53 - .../src/include/__type_traits/desugars_to.h | 4 + .../libc++/src/include/__type_traits/invoke.h | 18 +- .../src/include/__type_traits/is_allocator.h | 13 +- .../is_generic_transparent_comparator.h | 30 + .../include/__type_traits/is_specialization.h | 8 +- .../set.h => __type_traits/is_unqualified.h} | 15 +- .../include/__type_traits/make_transparent.h | 48 + .../libc++/src/include/__utility/cmp.h | 12 + .../__utility/default_three_way_comparator.h | 70 + .../libc++/src/include/__utility/in_place.h | 2 +- .../lazy_synth_three_way_comparator.h | 108 + .../src/include/__utility/scope_guard.h | 2 + .../include/__utility/try_key_extraction.h | 114 + .../libc++/src/include/__vector/vector.h | 114 +- .../libc++/src/include/__vector/vector_bool.h | 61 +- .../src/third_party/libc++/src/include/any | 46 +- .../third_party/libc++/src/include/barrier | 29 +- .../src/third_party/libc++/src/include/bitset | 11 +- .../third_party/libc++/src/include/complex.h | 20 +- .../libc++/src/include/condition_variable | 6 +- .../third_party/libc++/src/include/ctype.h | 48 +- .../src/third_party/libc++/src/include/deque | 90 +- .../third_party/libc++/src/include/errno.h | 542 +- .../libc++/src/include/ext/hash_map | 50 +- .../libc++/src/include/ext/hash_set | 5 +- .../src/third_party/libc++/src/include/fenv.h | 86 +- .../third_party/libc++/src/include/float.h | 34 +- .../libc++/src/include/forward_list | 45 +- .../third_party/libc++/src/include/fstream | 30 +- .../src/third_party/libc++/src/include/future | 14 +- .../third_party/libc++/src/include/inttypes.h | 32 +- .../third_party/libc++/src/include/istream | 6 + .../third_party/libc++/src/include/iterator | 10 + .../src/third_party/libc++/src/include/latch | 6 +- .../src/third_party/libc++/src/include/list | 75 +- .../src/third_party/libc++/src/include/map | 397 +- .../src/third_party/libc++/src/include/math.h | 19 + .../libc++/src/include/module.modulemap.in | 87 +- .../src/third_party/libc++/src/include/mutex | 24 +- .../third_party/libc++/src/include/optional | 85 +- .../src/third_party/libc++/src/include/queue | 60 +- .../src/third_party/libc++/src/include/ranges | 5 + .../third_party/libc++/src/include/semaphore | 23 +- .../src/third_party/libc++/src/include/set | 179 +- .../third_party/libc++/src/include/sstream | 8 +- .../src/third_party/libc++/src/include/stack | 20 +- .../third_party/libc++/src/include/stdbool.h | 30 +- .../third_party/libc++/src/include/stddef.h | 20 +- .../third_party/libc++/src/include/stdio.h | 41 +- .../third_party/libc++/src/include/streambuf | 40 + .../src/third_party/libc++/src/include/string | 703 +- .../libc++/src/include/string_view | 21 +- .../third_party/libc++/src/include/tgmath.h | 24 +- .../src/third_party/libc++/src/include/tuple | 148 +- .../libc++/src/include/unordered_map | 303 +- .../libc++/src/include/unordered_set | 192 +- .../third_party/libc++/src/include/valarray | 152 +- .../third_party/libc++/src/include/version | 25 +- .../third_party/libc++/src/include/wctype.h | 58 +- .../libc++/src/lib/abi/CHANGELOG.TXT | 15 + .../libc++/src/lib/abi/CMakeLists.txt | 3 + ...bcxxabi.v1.stable.exceptions.nonew.abilist | 4 - ...bcxxabi.v1.stable.exceptions.nonew.abilist | 4 - ...bcxxabi.v1.stable.exceptions.nonew.abilist | 4 - ...bcxxabi.v1.stable.exceptions.nonew.abilist | 4 - ...bcxxabi.v1.stable.exceptions.nonew.abilist | 4 - ...bcxxabi.v1.stable.exceptions.nonew.abilist | 4 - ...bcxxabi.v1.stable.exceptions.nonew.abilist | 4 - ...bcxxabi.v1.stable.exceptions.nonew.abilist | 4 - ...xxabi.v1.stable.noexceptions.nonew.abilist | 4 - .../libc++/src/modules/std/optional.inc | 11 +- .../libc++/src/modules/std/ranges.inc | 3 + .../third_party/libc++/src/src/algorithm.cpp | 3 + .../src/third_party/libc++/src/src/atomic.cpp | 2 +- .../libc++/src/src/experimental/tzdb.cpp | 2 +- .../libc++/src/src/filesystem/error.h | 26 +- .../libc++/src/src/filesystem/format_string.h | 27 +- .../libc++/src/src/filesystem/path.cpp | 4 +- .../src/third_party/libc++/src/src/locale.cpp | 370 +- .../src/third_party/libc++/src/src/string.cpp | 20 +- .../libc++/src/src/system_error.cpp | 2 + .../libc++/src/utils/benchmark-historical | 105 + .../libc++/src/utils/build-at-commit | 132 + .../third_party/libc++/src/utils/cat_files.py | 51 - .../libc++/src/utils/ci/BOT_OWNERS.txt | 9 +- .../libc++/src/utils/ci/Dockerfile | 8 +- .../libc++/src/utils/ci/build-picolibc.sh | 4 +- .../src/utils/ci/buildkite-pipeline.yml | 6 +- .../libc++/src/utils/ci/docker-compose.yml | 19 +- .../ci/vendor/android/Dockerfile.emulator | 2 +- .../ci/vendor/android/run-buildbot-container | 2 +- .../libc++/src/utils/compare-benchmarks | 196 + .../libc++/src/utils/consolidate-benchmarks | 36 + .../libc++/src/utils/find-rerun-candidates | 242 + .../generate_feature_test_macro_components.py | 42 +- .../src/utils/generate_libcxx_cppm_in.py | 12 +- .../libc++/src/utils/libcxx-benchmark-json | 57 - .../src/utils/libcxx-compare-benchmarks | 73 - .../libc++/src/utils/libcxx/sym_check/util.py | 2 +- .../libc++/src/utils/libcxx/test/dsl.py | 6 +- .../libc++/src/utils/libcxx/test/features.py | 49 +- .../libc++/src/utils/libcxx/test/format.py | 51 +- .../libc++/src/utils/libcxx/test/params.py | 14 + .../src/utils/parse-google-benchmark-results | 50 + .../libc++/src/utils/parse-spec-results | 113 + .../libc++/src/utils/requirements.txt | 7 + .../src/third_party/libc++/src/utils/ssh.py | 2 +- .../src/utils/synchronize_csv_status_files.py | 44 +- .../libc++/src/utils/test-at-commit | 96 + .../libc++/src/utils/visualize-historical | 267 + .../src/third_party/libc++abi/README.chromium | 1 + .../third_party/libc++abi/src/CMakeLists.txt | 4 +- .../libc++abi/src/include/__cxxabi_config.h | 41 + .../libc++abi/src/src/CMakeLists.txt | 2 +- .../libc++abi/src/src/cxa_exception.cpp | 4 +- .../libc++abi/src/src/cxa_exception.h | 30 +- .../libc++abi/src/src/cxa_personality.cpp | 129 +- .../configs/apple-libc++abi-shared.cfg.in | 2 +- .../configs/apple-libc++abi-system.cfg.in | 2 +- .../configs/armv7m-picolibc-libc++abi.cfg.in | 4 +- .../test/configs/ibm-libc++abi-shared.cfg.in | 2 +- .../configs/llvm-libc++abi-android.cfg.in | 2 +- .../test/configs/llvm-libc++abi-merged.cfg.in | 2 +- .../test/configs/llvm-libc++abi-mingw.cfg.in | 2 +- .../llvm-libc++abi-shared-clangcl.cfg.in | 2 +- .../test/configs/llvm-libc++abi-shared.cfg.in | 2 +- .../llvm-libc++abi-static-clangcl.cfg.in | 2 +- .../test/configs/llvm-libc++abi-static.cfg.in | 2 +- .../src/test/forced_unwind4.pass.cpp | 6 +- .../native/AArch64/ra_sign_state.pass.cpp | 2 +- .../src/third_party/libunwind/README.chromium | 1 + .../src/include/__libunwind_config.h | 13 +- .../libunwind/src/include/libunwind.h | 127 +- .../libunwind/src/src/AddressSpace.hpp | 27 +- .../libunwind/src/src/CMakeLists.txt | 2 +- .../libunwind/src/src/CompactUnwinder.hpp | 21 +- .../libunwind/src/src/DwarfInstructions.hpp | 29 +- .../libunwind/src/src/DwarfParser.hpp | 44 +- .../libunwind/src/src/Registers.hpp | 168 +- .../libunwind/src/src/Unwind-seh.cpp | 3 +- .../libunwind/src/src/UnwindCursor.hpp | 76 +- .../libunwind/src/src/UnwindLevel1.c | 38 +- .../src/src/UnwindRegistersRestore.S | 41 +- .../libunwind/src/src/UnwindRegistersSave.S | 24 +- .../third_party/libunwind/src/src/assembly.h | 2 +- .../libunwind/src/src/libunwind.cpp | 48 +- .../libunwind/src/src/shadow_stack_unwind.h | 4 +- .../src/test/aarch64_vg_unwind.pass.cpp | 68 + .../src/test/aix_signal_unwind.pass.sh.S | 7 +- .../src/test/bad_unwind_info.pass.cpp | 5 +- .../configs/apple-libunwind-system.cfg.in | 2 +- .../configs/armv7m-picolibc-libunwind.cfg.in | 4 +- .../src/test/configs/cmake-bridge.cfg.in | 11 + .../test/configs/ibm-libunwind-shared.cfg.in | 2 +- .../test/configs/llvm-libunwind-merged.cfg.in | 2 +- .../llvm-libunwind-shared-mingw.cfg.in | 2 +- .../test/configs/llvm-libunwind-shared.cfg.in | 2 +- .../llvm-libunwind-static-mingw.cfg.in | 2 +- .../test/configs/llvm-libunwind-static.cfg.in | 2 +- .../src/test/eh_frame_fde_pc_range.pass.cpp | 59 + .../libunwind/src/test/floatregister.pass.cpp | 2 +- .../libunwind/src/test/forceunwind.pass.cpp | 2 +- .../libunwind/src/test/unw_resume.pass.cpp | 2 +- .../src/test/unwind_scalable_vectors.pass.cpp | 7 +- .../src/third_party/llvm-libc/README.chromium | 1 + .../third_party/llvm-libc/src/CMakeLists.txt | 2 +- .../src/benchmarks/LibcMemoryBenchmark.cpp | 4 +- .../benchmarks/LibcMemoryBenchmarkMain.cpp | 6 +- .../benchmarks/LibcMemoryBenchmarkTest.cpp | 6 +- .../src/benchmarks/gpu/BenchmarkLogger.cpp | 97 - .../src/benchmarks/gpu/BenchmarkLogger.h | 29 - .../src/benchmarks/gpu/CMakeLists.txt | 27 +- .../src/benchmarks/gpu/LibcGpuBenchmark.cpp | 193 +- .../src/benchmarks/gpu/LibcGpuBenchmark.h | 209 +- .../llvm-libc/src/benchmarks/gpu/Random.h | 190 + .../benchmarks/gpu/src/math/CMakeLists.txt | 157 +- .../gpu/src/math/atan2_benchmark.cpp | 23 +- .../benchmarks/gpu/src/math/exp_benchmark.cpp | 59 + .../gpu/src/math/expf16_benchmark.cpp | 56 + .../gpu/src/math/expf_benchmark.cpp | 59 + .../benchmarks/gpu/src/math/log_benchmark.cpp | 68 + .../gpu/src/math/logf16_benchmark.cpp | 62 + .../gpu/src/math/logf_benchmark.cpp | 68 + .../src/benchmarks/gpu/src/math/platform.h | 19 +- .../benchmarks/gpu/src/math/sin_benchmark.cpp | 31 +- .../gpu/timing/amdgpu/CMakeLists.txt | 6 +- .../src/benchmarks/gpu/timing/amdgpu/timing.h | 109 +- .../gpu/timing/nvptx/CMakeLists.txt | 6 +- .../src/benchmarks/gpu/timing/nvptx/timing.h | 114 +- .../cmake/modules/CheckCompilerFeatures.cmake | 3 + .../modules/LLVMLibCCompileOptionRules.cmake | 40 +- .../cmake/modules/LLVMLibCLibraryRules.cmake | 29 - .../cmake/modules/LLVMLibCObjectRules.cmake | 83 +- .../src/cmake/modules/LLVMLibCTestRules.cmake | 15 +- .../cmake/modules/LibcParseArguments.cmake | 87 + .../check_ext_vector_type.cpp | 7 + .../modules/prepare_libc_gpu_build.cmake | 16 +- .../config/baremetal/aarch64/entrypoints.txt | 82 + .../src/config/baremetal/arm/entrypoints.txt | 79 + .../src/config/baremetal/config.json | 7 +- .../config/baremetal/riscv/entrypoints.txt | 79 + .../llvm-libc/src/config/config.json | 2 +- .../src/config/darwin/aarch64/entrypoints.txt | 77 + .../src/config/darwin/x86_64/entrypoints.txt | 68 + .../src/config/gpu/amdgpu/config.json | 45 - .../src/config/gpu/amdgpu/entrypoints.txt | 69 + .../src/config/gpu/{nvptx => }/config.json | 2 +- .../src/config/gpu/nvptx/entrypoints.txt | 69 + .../src/config/linux/aarch64/entrypoints.txt | 98 +- .../src/config/linux/aarch64/headers.txt | 1 + .../llvm-libc/src/config/linux/app.h | 14 - .../src/config/linux/arm/config.json | 7 + .../src/config/linux/arm/entrypoints.txt | 68 + .../llvm-libc/src/config/linux/config.json | 7 + .../src/config/linux/riscv/config.json | 7 + .../src/config/linux/riscv/entrypoints.txt | 84 + .../src/config/linux/riscv/headers.txt | 1 + .../src/config/linux/x86_64/entrypoints.txt | 96 +- .../src/config/linux/x86_64/headers.txt | 2 + .../llvm-libc/src/config/windows/README.md | 2 +- .../src/config/windows/entrypoints.txt | 68 + .../llvm-libc/src/docs/build_and_test.rst | 16 +- .../llvm-libc/src/docs/configure.rst | 2 +- .../src/docs/dev/undefined_behavior.rst | 7 + .../llvm-libc/src/docs/headers/complex.rst | 2 +- .../llvm-libc/src/docs/headers/math/index.rst | 671 +- .../llvm-libc/src/docs/headers/stdfix.rst | 2 +- .../llvm-libc/src/docs/headers/time.rst | 10 +- .../llvm-libc/src/hdr/localtime_overlay.h | 45 + .../llvm-libc/src/hdr/types/CMakeLists.txt | 22 +- .../llvm-libc/src/hdr/types/dl_info.h | 21 + .../llvm-libc/src/hdr/types/struct_rlimit.h | 22 + .../llvm-libc/src/include/CMakeLists.txt | 40 +- .../src/include/__llvm-libc-common.h | 10 +- .../llvm-libc/src/include/arpa/inet.yaml | 10 +- .../llvm-libc/src/include/dlfcn.yaml | 74 + .../include/llvm-libc-macros/CMakeLists.txt | 33 + .../include/llvm-libc-macros/annex-k-macros.h | 27 + .../llvm-libc-macros/cfloat128-macros.h | 41 + .../llvm-libc-macros/cfloat16-macros.h | 20 + .../include/llvm-libc-macros/complex-macros.h | 29 + .../llvm-libc-macros/gpu/signal-macros.h | 9 +- .../llvm-libc-macros/linux/fcntl-macros.h | 3 + .../llvm-libc-macros/linux/signal-macros.h | 9 +- .../llvm-libc-macros/netinet-in-macros.h | 27 + .../llvm-libc-macros/nl-types-macros.h | 15 + .../include/llvm-libc-types/CMakeLists.txt | 27 +- .../src/include/llvm-libc-types/Dl_info.h | 19 + .../src/include/llvm-libc-types/cfloat128.h | 39 +- .../src/include/llvm-libc-types/cfloat16.h | 11 +- .../src/include/llvm-libc-types/in_addr.h | 18 + .../src/include/llvm-libc-types/in_addr_t.h | 14 + .../src/include/llvm-libc-types/int_hk_t.h | 14 + .../src/include/llvm-libc-types/int_hr_t.h | 14 + .../src/include/llvm-libc-types/int_k_t.h | 14 + .../src/include/llvm-libc-types/int_lk_t.h | 14 + .../src/include/llvm-libc-types/int_lr_t.h | 14 + .../src/include/llvm-libc-types/int_r_t.h | 14 + .../src/include/llvm-libc-types/nl_catd.h | 14 + .../include/llvm-libc-types/stdfix-types.h | 25 - .../llvm-libc-types/test_rpc_opcodes_t.h | 21 - .../src/include/llvm-libc-types/uint_uhk_t.h | 14 + .../src/include/llvm-libc-types/uint_uhr_t.h | 14 + .../src/include/llvm-libc-types/uint_uk_t.h | 14 + .../src/include/llvm-libc-types/uint_ulk_t.h | 14 + .../src/include/llvm-libc-types/uint_ulr_t.h | 14 + .../src/include/llvm-libc-types/uint_ur_t.h | 14 + .../llvm-libc/src/include/math.yaml | 127 +- .../llvm-libc/src/include/netinet/in.h.def | 18 + .../llvm-libc/src/include/netinet/in.yaml | 7 + .../llvm-libc/src/include/nl_types.yaml | 35 + .../llvm-libc/src/include/sched.yaml | 2 +- .../llvm-libc/src/include/stdfix.yaml | 22 +- .../llvm-libc/src/include/stdio.yaml | 14 + .../llvm-libc/src/include/sys/ioctl.yaml | 10 +- .../llvm-libc/src/include/sys/syscall.h.def | 4 + .../llvm-libc/src/include/time.yaml | 13 + .../llvm-libc/src/include/unistd.yaml | 16 + .../llvm-libc/src/include/wchar.yaml | 11 +- .../third_party/llvm-libc/src/shared/math.h | 17 + .../llvm-libc/src/shared/math/cbrtf.h | 23 + .../llvm-libc/src/shared/math/cos.h | 23 + .../llvm-libc/src/shared/math/cosf.h | 23 + .../llvm-libc/src/shared/math/cosf16.h | 28 + .../llvm-libc/src/shared/math/coshf.h | 23 + .../llvm-libc/src/shared/math/coshf16.h | 28 + .../llvm-libc/src/shared/math/cospif.h | 23 + .../llvm-libc/src/shared/math/cospif16.h | 28 + .../llvm-libc/src/shared/math/dsqrtl.h | 23 + .../llvm-libc/src/shared/math/exp10m1f.h | 23 + .../llvm-libc/src/shared/math/exp10m1f16.h | 29 + .../llvm-libc/src/shared/math/exp2.h | 23 + .../llvm-libc/src/shared/math/exp2f.h | 23 + .../llvm-libc/src/shared/math/exp2f16.h | 29 + .../llvm-libc/src/shared/math/exp2m1f.h | 23 + .../llvm-libc/src/shared/math/rsqrtf.h | 23 + .../llvm-libc/src/shared/math/rsqrtf16.h | 29 + .../third_party/llvm-libc/src/shared/rpc.h | 3 + .../llvm-libc/src/shared/rpc_opcodes.h | 7 +- .../llvm-libc/src/src/CMakeLists.txt | 1 + .../src/src/__support/CMakeLists.txt | 2 + .../src/src/__support/CPP/CMakeLists.txt | 20 + .../src/src/__support/CPP/algorithm.h | 6 + .../llvm-libc/src/src/__support/CPP/bit.h | 27 +- .../llvm-libc/src/src/__support/CPP/new.h | 5 + .../llvm-libc/src/src/__support/CPP/simd.h | 410 ++ .../llvm-libc/src/src/__support/CPP/tuple.h | 144 + .../__support/CPP/type_traits/is_complex.h | 7 + .../CPP/type_traits/is_destructible.h | 2 +- .../__support/CPP/type_traits/is_unsigned.h | 6 + .../__support/CPP/utility/integer_sequence.h | 10 + .../src/__support/FPUtil/BasicOperations.h | 2 +- .../src/src/__support/FPUtil/CMakeLists.txt | 4 + .../src/src/__support/FPUtil/FEnvImpl.h | 8 +- .../src/src/__support/FPUtil/FPBits.h | 10 +- .../src/src/__support/FPUtil/Hypot.h | 15 +- .../src/src/__support/FPUtil/bfloat16.h | 38 +- .../llvm-libc/src/src/__support/FPUtil/cast.h | 66 +- .../src/src/__support/FPUtil/double_double.h | 11 +- .../src/src/__support/FPUtil/dyadic_float.h | 2 +- .../__support/FPUtil/generic/CMakeLists.txt | 2 + .../src/__support/FPUtil/generic/add_sub.h | 35 +- .../src/src/__support/FPUtil/generic/div.h | 8 +- .../src/src/__support/FPUtil/generic/sqrt.h | 8 +- .../src/src/__support/FPUtil/rounding_mode.h | 93 +- .../llvm-libc/src/src/__support/File/file.cpp | 2 +- .../src/src/__support/File/linux/lseekImpl.h | 9 +- .../src/src/__support/GPU/CMakeLists.txt | 7 + .../src/src/__support/GPU/allocator.cpp | 74 +- .../src/src/__support/GPU/fixedstack.h | 111 + .../src/__support/OSUtil/linux/CMakeLists.txt | 15 +- .../src/__support/OSUtil/linux/aarch64/vdso.h | 2 + .../src/src/__support/OSUtil/linux/auxv.h | 159 + .../src/src/__support/OSUtil/linux/syscall.h | 14 + .../src/src/__support/OSUtil/linux/vdso.cpp | 13 +- .../src/src/__support/OSUtil/linux/vdso_sym.h | 6 +- .../src/__support/OSUtil/linux/x86_64/vdso.h | 2 + .../src/src/__support/RPC/rpc_server.h | 53 +- .../__support/StringUtil/error_to_string.cpp | 19 +- .../__support/StringUtil/platform_errors.h | 2 +- .../__support/StringUtil/signal_to_string.cpp | 19 +- .../llvm-libc/src/src/__support/arg_list.h | 3 +- .../llvm-libc/src/src/__support/big_int.h | 26 +- .../llvm-libc/src/src/__support/common.h | 5 +- .../src/src/__support/endian_internal.h | 50 +- .../src/src/__support/fixed_point/fx_bits.h | 111 + .../llvm-libc/src/src/__support/libc_errno.h | 17 +- .../src/src/__support/macros/CMakeLists.txt | 3 + .../src/src/__support/macros/attributes.h | 45 +- .../src/src/__support/macros/config.h | 23 + .../src/src/__support/macros/optimization.h | 3 + .../macros/properties/architectures.h | 4 + .../__support/macros/properties/compiler.h | 6 +- .../macros/properties/cpu_features.h | 4 + .../src/src/__support/math/CMakeLists.txt | 350 + .../llvm-libc/src/src/__support/math/atan2f.h | 4 +- .../llvm-libc/src/src/__support/math/cbrtf.h | 161 + .../math/common_constants.h} | 47 +- .../llvm-libc/src/src/__support/math/cos.h | 173 + .../llvm-libc/src/src/__support/math/cosf.h | 174 + .../llvm-libc/src/src/__support/math/cosf16.h | 106 + .../llvm-libc/src/src/__support/math/coshf.h | 65 + .../src/src/__support/math/coshf16.h | 124 + .../llvm-libc/src/src/__support/math/cospif.h | 109 + .../src/src/__support/math/cospif16.h | 99 + .../llvm-libc/src/src/__support/math/dsqrtl.h | 26 + .../src/src/__support/math/exp10m1f.h | 234 + .../src/src/__support/math/exp10m1f16.h | 185 + .../llvm-libc/src/src/__support/math/exp2.h | 425 ++ .../exp2f_impl.h => __support/math/exp2f.h} | 23 +- .../src/src/__support/math/exp2f16.h | 111 + .../src/src/__support/math/exp2m1f.h | 195 + .../math/expxf16_utils.h} | 21 +- .../math}/range_reduction.h | 6 +- .../math}/range_reduction_double_common.h | 24 +- .../math}/range_reduction_double_fma.h | 18 +- .../math}/range_reduction_double_nofma.h | 16 +- .../math}/range_reduction_fma.h | 6 +- .../llvm-libc/src/src/__support/math/rsqrtf.h | 71 + .../src/src/__support/math/rsqrtf16.h | 86 + .../generic => __support/math}/sincos_eval.h | 8 +- .../math}/sincosf16_utils.h | 6 +- .../src/__support/math/sincosf_float_eval.h | 223 + .../math}/sincosf_utils.h | 6 +- .../math/sinhfcoshf_utils.h} | 26 +- .../llvm-libc/src/src/__support/math_extras.h | 24 +- .../src/src/__support/threads/callonce.h | 10 +- .../__support/threads/linux/CMakeLists.txt | 4 +- .../src/src/__support/threads/linux/barrier.h | 19 +- .../src/__support/threads/linux/callonce.cpp | 40 - .../src/__support/threads/linux/callonce.h | 25 + .../src/__support/threads/linux/thread.cpp | 2 +- .../src/src/__support/threads/mutex.h | 22 - .../src/src/__support/threads/thread.cpp | 2 + .../src/src/__support/threads/thread.h | 2 +- .../__support/wchar/character_converter.cpp | 14 +- .../src/__support/wchar/character_converter.h | 5 +- .../src/src/__support/wchar/mbrtowc.cpp | 1 - .../src/src/__support/wchar/mbsnrtowcs.h | 4 +- .../src/__support/wchar/string_converter.h | 38 +- .../src/src/__support/wchar/wcsnrtombs.h | 4 +- .../src/src/arpa/inet/CMakeLists.txt | 13 + .../llvm-libc/src/src/arpa/inet/inet_aton.cpp | 57 + .../llvm-libc/src/src/arpa/inet/inet_aton.h | 21 + .../llvm-libc/src/src/dlfcn/CMakeLists.txt | 24 +- .../llvm-libc/src/src/dlfcn/dladdr.cpp | 23 + .../llvm-libc/src/src/dlfcn/dladdr.h | 22 + .../llvm-libc/src/src/dlfcn/dlinfo.cpp | 24 + .../llvm-libc/src/src/dlfcn/dlinfo.h | 20 + .../llvm-libc/src/src/dlfcn/dlsym.cpp | 4 +- .../llvm-libc/src/src/dlfcn/dlsym.h | 2 +- .../llvm-libc/src/src/errno/libc_errno.cpp | 5 - .../llvm-libc/src/src/math/CMakeLists.txt | 87 +- .../llvm-libc/src/src/math/asinpif16.h | 21 + .../llvm-libc/src/src/math/atanpif16.h | 21 + .../llvm-libc/src/src/math/bf16add.h | 21 + .../llvm-libc/src/src/math/bf16addf.h | 21 + .../llvm-libc/src/src/math/bf16addf128.h | 21 + .../llvm-libc/src/src/math/bf16addl.h | 21 + .../llvm-libc/src/src/math/bf16div.h | 21 + .../llvm-libc/src/src/math/bf16divf.h | 21 + .../llvm-libc/src/src/math/bf16divf128.h | 21 + .../llvm-libc/src/src/math/bf16divl.h | 21 + .../llvm-libc/src/src/math/bf16fma.h | 21 + .../llvm-libc/src/src/math/bf16fmaf.h | 21 + .../llvm-libc/src/src/math/bf16fmaf128.h | 21 + .../llvm-libc/src/src/math/bf16fmal.h | 21 + .../llvm-libc/src/src/math/bf16mul.h | 21 + .../llvm-libc/src/src/math/bf16mulf.h | 21 + .../llvm-libc/src/src/math/bf16mulf128.h | 21 + .../llvm-libc/src/src/math/bf16mull.h | 21 + .../llvm-libc/src/src/math/bf16sub.h | 21 + .../llvm-libc/src/src/math/bf16subf.h | 21 + .../llvm-libc/src/src/math/bf16subf128.h | 21 + .../llvm-libc/src/src/math/bf16subl.h | 21 + .../llvm-libc/src/src/math/canonicalizebf16.h | 21 + .../llvm-libc/src/src/math/ceilbf16.h | 21 + .../llvm-libc/src/src/math/copysignbf16.h | 21 + .../llvm-libc/src/src/math/fdimbf16.h | 21 + .../llvm-libc/src/src/math/floorbf16.h | 21 + .../llvm-libc/src/src/math/fmaxbf16.h | 21 + .../src/src/math/fmaximum_mag_numbf16.h | 21 + .../llvm-libc/src/src/math/fmaximum_magbf16.h | 21 + .../llvm-libc/src/src/math/fmaximum_numbf16.h | 21 + .../llvm-libc/src/src/math/fmaximumbf16.h | 21 + .../llvm-libc/src/src/math/fminbf16.h | 21 + .../src/src/math/fminimum_mag_numbf16.h | 21 + .../llvm-libc/src/src/math/fminimum_magbf16.h | 21 + .../llvm-libc/src/src/math/fminimum_numbf16.h | 21 + .../llvm-libc/src/src/math/fminimumbf16.h | 21 + .../llvm-libc/src/src/math/fmodbf16.h | 21 + .../llvm-libc/src/src/math/frexpbf16.h | 21 + .../llvm-libc/src/src/math/fromfpbf16.h | 21 + .../llvm-libc/src/src/math/fromfpxbf16.h | 21 + .../src/src/math/generic/CMakeLists.txt | 1429 +++- .../llvm-libc/src/src/math/generic/acoshf.cpp | 1 - .../src/src/math/generic/asinpif16.cpp | 127 + .../src/src/math/generic/atanpif16.cpp | 157 + .../src/src/math/generic/bf16add.cpp | 21 + .../src/src/math/generic/bf16addf.cpp | 21 + .../src/src/math/generic/bf16addf128.cpp | 21 + .../src/src/math/generic/bf16addl.cpp | 21 + .../src/src/math/generic/bf16div.cpp | 21 + .../src/src/math/generic/bf16divf.cpp | 21 + .../src/src/math/generic/bf16divf128.cpp | 21 + .../src/src/math/generic/bf16divl.cpp | 21 + .../src/src/math/generic/bf16fma.cpp | 21 + .../src/src/math/generic/bf16fmaf.cpp | 21 + .../src/src/math/generic/bf16fmaf128.cpp | 22 + .../src/src/math/generic/bf16fmal.cpp | 22 + .../src/src/math/generic/bf16mul.cpp | 21 + .../src/src/math/generic/bf16mulf.cpp | 21 + .../src/src/math/generic/bf16mulf128.cpp | 21 + .../src/src/math/generic/bf16mull.cpp | 21 + .../src/src/math/generic/bf16sub.cpp | 21 + .../src/src/math/generic/bf16subf.cpp | 21 + .../src/src/math/generic/bf16subf128.cpp | 21 + .../src/src/math/generic/bf16subl.cpp | 21 + .../src/src/math/generic/canonicalizebf16.cpp | 21 + .../llvm-libc/src/src/math/generic/cbrtf.cpp | 147 +- .../src/src/math/generic/ceilbf16.cpp | 19 + .../src/src/math/generic/common_constants.h | 73 - .../src/src/math/generic/copysignbf16.cpp | 21 + .../llvm-libc/src/src/math/generic/cos.cpp | 155 +- .../llvm-libc/src/src/math/generic/cosf.cpp | 133 +- .../llvm-libc/src/src/math/generic/cosf16.cpp | 81 +- .../llvm-libc/src/src/math/generic/coshf.cpp | 44 +- .../src/src/math/generic/coshf16.cpp | 99 +- .../llvm-libc/src/src/math/generic/cospif.cpp | 89 +- .../src/src/math/generic/cospif16.cpp | 73 +- .../llvm-libc/src/src/math/generic/dsqrtl.cpp | 9 +- .../src/src/math/generic/exp10m1f.cpp | 210 +- .../src/src/math/generic/exp10m1f16.cpp | 158 +- .../llvm-libc/src/src/math/generic/exp2.cpp | 398 +- .../llvm-libc/src/src/math/generic/exp2f.cpp | 4 +- .../src/src/math/generic/exp2f16.cpp | 85 +- .../src/src/math/generic/exp2m1f.cpp | 178 +- .../src/src/math/generic/exp2m1f16.cpp | 3 +- .../llvm-libc/src/src/math/generic/expm1.cpp | 8 +- .../llvm-libc/src/src/math/generic/expm1f.cpp | 3 +- .../src/src/math/generic/expm1f16.cpp | 3 +- .../src/src/math/generic/fdimbf16.cpp | 21 + .../src/src/math/generic/floorbf16.cpp | 21 + .../src/src/math/generic/fmaxbf16.cpp | 21 + .../src/math/generic/fmaximum_mag_numbf16.cpp | 21 + .../src/src/math/generic/fmaximum_magbf16.cpp | 21 + .../src/src/math/generic/fmaximum_numbf16.cpp | 21 + .../src/src/math/generic/fmaximumbf16.cpp | 21 + .../src/src/math/generic/fminbf16.cpp | 21 + .../src/math/generic/fminimum_mag_numbf16.cpp | 21 + .../src/src/math/generic/fminimum_magbf16.cpp | 21 + .../src/src/math/generic/fminimum_numbf16.cpp | 21 + .../src/src/math/generic/fminimumbf16.cpp | 21 + .../src/src/math/generic/fmodbf16.cpp | 21 + .../src/src/math/generic/frexpbf16.cpp | 21 + .../src/src/math/generic/fromfpbf16.cpp | 22 + .../src/src/math/generic/fromfpxbf16.cpp | 22 + .../src/src/math/generic/getpayloadbf16.cpp | 21 + .../src/src/math/generic/hypotf16.cpp | 13 +- .../src/src/math/generic/ilogbbf16.cpp | 21 + .../src/src/math/generic/iscanonicalbf16.cpp | 22 + .../src/src/math/generic/issignalingbf16.cpp | 21 + .../src/src/math/generic/ldexpbf16.cpp | 21 + .../src/src/math/generic/llogbbf16.cpp | 21 + .../src/src/math/generic/llrintbf16.cpp | 23 + .../src/src/math/generic/llroundbf16.cpp | 21 + .../llvm-libc/src/src/math/generic/log.cpp | 4 +- .../llvm-libc/src/src/math/generic/log10.cpp | 5 +- .../llvm-libc/src/src/math/generic/log10f.cpp | 3 +- .../src/src/math/generic/log10f16.cpp | 3 +- .../llvm-libc/src/src/math/generic/log1p.cpp | 4 +- .../llvm-libc/src/src/math/generic/log1pf.cpp | 4 +- .../llvm-libc/src/src/math/generic/log2.cpp | 5 +- .../llvm-libc/src/src/math/generic/log2f.cpp | 5 +- .../src/src/math/generic/log2f16.cpp | 3 +- .../src/src/math/generic/log_bf16.cpp | 137 + .../src/math/generic/log_range_reduction.h | 3 +- .../src/src/math/generic/logbbf16.cpp | 19 + .../llvm-libc/src/src/math/generic/logf.cpp | 3 +- .../llvm-libc/src/src/math/generic/logf16.cpp | 3 +- .../src/src/math/generic/lrintbf16.cpp | 22 + .../src/src/math/generic/lroundbf16.cpp | 21 + .../src/src/math/generic/modfbf16.cpp | 21 + .../src/src/math/generic/nanbf16.cpp | 25 + .../src/src/math/generic/nearbyintbf16.cpp | 21 + .../src/src/math/generic/nextafterbf16.cpp | 21 + .../src/src/math/generic/nextdownbf16.cpp | 21 + .../src/src/math/generic/nexttowardbf16.cpp | 22 + .../src/src/math/generic/nextupbf16.cpp | 21 + .../llvm-libc/src/src/math/generic/pow.cpp | 5 +- .../llvm-libc/src/src/math/generic/powf.cpp | 11 +- .../src/src/math/generic/remainderbf16.cpp | 22 + .../src/src/math/generic/remquobf16.cpp | 21 + .../src/src/math/generic/rintbf16.cpp | 21 + .../src/src/math/generic/roundbf16.cpp | 21 + .../src/src/math/generic/roundevenbf16.cpp | 21 + .../llvm-libc/src/src/math/generic/rsqrtf.cpp | 16 + .../src/src/math/generic/rsqrtf16.cpp | 15 + .../src/src/math/generic/scalblnbf16.cpp | 26 + .../src/src/math/generic/scalbnbf16.cpp | 26 + .../src/src/math/generic/setpayloadbf16.cpp | 21 + .../src/math/generic/setpayloadsigbf16.cpp | 21 + .../llvm-libc/src/src/math/generic/sin.cpp | 14 +- .../llvm-libc/src/src/math/generic/sincos.cpp | 14 +- .../src/src/math/generic/sincosf.cpp | 2 +- .../llvm-libc/src/src/math/generic/sinf.cpp | 30 +- .../llvm-libc/src/src/math/generic/sinf16.cpp | 3 +- .../llvm-libc/src/src/math/generic/sinhf.cpp | 5 +- .../src/src/math/generic/sinhf16.cpp | 3 +- .../llvm-libc/src/src/math/generic/sinpif.cpp | 2 +- .../src/src/math/generic/sinpif16.cpp | 3 +- .../src/src/math/generic/sqrtbf16.cpp | 21 + .../llvm-libc/src/src/math/generic/tan.cpp | 7 +- .../llvm-libc/src/src/math/generic/tanf.cpp | 2 +- .../llvm-libc/src/src/math/generic/tanf16.cpp | 3 +- .../llvm-libc/src/src/math/generic/tanhf.cpp | 2 +- .../src/src/math/generic/tanhf16.cpp | 3 +- .../llvm-libc/src/src/math/generic/tanpif.cpp | 2 +- .../src/src/math/generic/tanpif16.cpp | 3 +- .../src/src/math/generic/totalorderbf16.cpp | 22 + .../src/math/generic/totalordermagbf16.cpp | 22 + .../src/src/math/generic/truncbf16.cpp | 21 + .../src/src/math/generic/ufromfpbf16.cpp | 22 + .../src/src/math/generic/ufromfpxbf16.cpp | 22 + .../llvm-libc/src/src/math/getpayloadbf16.h | 21 + .../llvm-libc/src/src/math/ilogbbf16.h | 21 + .../llvm-libc/src/src/math/iscanonicalbf16.h | 21 + .../llvm-libc/src/src/math/issignalingbf16.h | 21 + .../llvm-libc/src/src/math/ldexpbf16.h | 21 + .../llvm-libc/src/src/math/llogbbf16.h | 21 + .../llvm-libc/src/src/math/llrintbf16.h | 21 + .../llvm-libc/src/src/math/llroundbf16.h | 21 + .../llvm-libc/src/src/math/log_bf16.h | 21 + .../llvm-libc/src/src/math/logbbf16.h | 21 + .../llvm-libc/src/src/math/lrintbf16.h | 21 + .../llvm-libc/src/src/math/lroundbf16.h | 21 + .../llvm-libc/src/src/math/modfbf16.h | 21 + .../llvm-libc/src/src/math/nanbf16.h | 21 + .../llvm-libc/src/src/math/nearbyintbf16.h | 21 + .../llvm-libc/src/src/math/nextafterbf16.h | 21 + .../llvm-libc/src/src/math/nextdownbf16.h | 21 + .../llvm-libc/src/src/math/nexttowardbf16.h | 21 + .../llvm-libc/src/src/math/nextupbf16.h | 21 + .../llvm-libc/src/src/math/remainderbf16.h | 21 + .../llvm-libc/src/src/math/remquobf16.h | 21 + .../llvm-libc/src/src/math/rintbf16.h | 21 + .../llvm-libc/src/src/math/roundbf16.h | 22 + .../llvm-libc/src/src/math/roundevenbf16.h | 21 + .../llvm-libc/src/src/math/rsqrtf.h | 20 + .../llvm-libc/src/src/math/rsqrtf16.h | 21 + .../llvm-libc/src/src/math/scalblnbf16.h | 21 + .../llvm-libc/src/src/math/scalbnbf16.h | 21 + .../llvm-libc/src/src/math/setpayloadbf16.h | 21 + .../src/src/math/setpayloadsigbf16.h | 21 + .../llvm-libc/src/src/math/sqrtbf16.h | 21 + .../llvm-libc/src/src/math/totalorderbf16.h | 21 + .../src/src/math/totalordermagbf16.h | 21 + .../llvm-libc/src/src/math/truncbf16.h | 21 + .../llvm-libc/src/src/math/ufromfpbf16.h | 21 + .../llvm-libc/src/src/math/ufromfpxbf16.h | 21 + .../llvm-libc/src/src/nl_types/CMakeLists.txt | 31 + .../llvm-libc/src/src/nl_types/catclose.cpp | 22 + .../llvm-libc/src/src/nl_types/catclose.h | 21 + .../llvm-libc/src/src/nl_types/catgets.cpp | 25 + .../llvm-libc/src/src/nl_types/catgets.h | 22 + .../llvm-libc/src/src/nl_types/catopen.cpp | 26 + .../llvm-libc/src/src/nl_types/catopen.h | 21 + .../src/src/pthread/pthread_once.cpp | 3 +- .../src/src/setjmp/wasm/sigsetjmp.cpp | 18 + .../src/src/setjmp/x86_64/sigsetjmp.cpp | 3 +- .../llvm-libc/src/src/stdfix/CMakeLists.txt | 15 +- .../llvm-libc/src/src/stdfix/bitshk.cpp | 2 +- .../llvm-libc/src/src/stdfix/bitshk.h | 2 +- .../llvm-libc/src/src/stdfix/bitshr.cpp | 2 +- .../llvm-libc/src/src/stdfix/bitshr.h | 2 +- .../llvm-libc/src/src/stdfix/bitsk.cpp | 2 +- .../llvm-libc/src/src/stdfix/bitsk.h | 2 +- .../llvm-libc/src/src/stdfix/bitslk.cpp | 2 +- .../llvm-libc/src/src/stdfix/bitslk.h | 2 +- .../llvm-libc/src/src/stdfix/bitslr.cpp | 2 +- .../llvm-libc/src/src/stdfix/bitslr.h | 2 +- .../llvm-libc/src/src/stdfix/bitsr.cpp | 2 +- .../llvm-libc/src/src/stdfix/bitsr.h | 2 +- .../llvm-libc/src/src/stdfix/bitsuhk.cpp | 2 +- .../llvm-libc/src/src/stdfix/bitsuhk.h | 2 +- .../llvm-libc/src/src/stdfix/bitsuhr.cpp | 2 +- .../llvm-libc/src/src/stdfix/bitsuhr.h | 2 +- .../llvm-libc/src/src/stdfix/bitsuk.cpp | 2 +- .../llvm-libc/src/src/stdfix/bitsuk.h | 2 +- .../llvm-libc/src/src/stdfix/bitsulk.cpp | 2 +- .../llvm-libc/src/src/stdfix/bitsulk.h | 2 +- .../llvm-libc/src/src/stdfix/bitsulr.cpp | 2 +- .../llvm-libc/src/src/stdfix/bitsulr.h | 2 +- .../llvm-libc/src/src/stdfix/bitsur.cpp | 2 +- .../llvm-libc/src/src/stdfix/bitsur.h | 2 +- .../llvm-libc/src/src/stdfix/bitusk.cpp | 2 +- .../llvm-libc/src/src/stdfix/hkbits.h | 2 +- .../llvm-libc/src/src/stdfix/hrbits.h | 2 +- .../llvm-libc/src/src/stdfix/kbits.h | 2 +- .../llvm-libc/src/src/stdfix/lkbits.h | 2 +- .../llvm-libc/src/src/stdfix/lrbits.h | 2 +- .../llvm-libc/src/src/stdfix/rbits.h | 2 +- .../llvm-libc/src/src/stdfix/rdivi.cpp | 21 + .../llvm-libc/src/src/stdfix/rdivi.h | 21 + .../llvm-libc/src/src/stdfix/uhkbits.h | 2 +- .../llvm-libc/src/src/stdfix/uhrbits.h | 2 +- .../llvm-libc/src/src/stdfix/ukbits.h | 2 +- .../llvm-libc/src/src/stdfix/ulkbits.h | 2 +- .../llvm-libc/src/src/stdfix/ulrbits.h | 2 +- .../llvm-libc/src/src/stdfix/urbits.h | 2 +- .../src/src/stdio/printf_core/CMakeLists.txt | 1 + .../printf_core/float_dec_converter_limited.h | 5 +- .../stdio/printf_core/vasprintf_internal.h | 1 - .../llvm-libc/src/src/stdlib/CMakeLists.txt | 1 + .../llvm-libc/src/src/stdlib/exit.cpp | 14 + .../llvm-libc/src/src/stdlib/qsort_data.h | 11 +- .../llvm-libc/src/src/string/CMakeLists.txt | 14 +- .../src/string/memory_utils/CMakeLists.txt | 1 + .../memory_utils/aarch64/inline_strlen.h | 53 + .../memory_utils/generic/inline_strlen.h | 54 + .../src/src/string/memory_utils/op_aarch64.h | 18 +- .../src/src/string/memory_utils/op_generic.h | 24 +- .../src/src/string/memory_utils/op_x86.h | 96 +- .../src/src/string/memory_utils/utils.h | 5 + .../string/memory_utils/x86_64/inline_bcmp.h | 32 +- .../memory_utils/x86_64/inline_strlen.h | 107 + .../llvm-libc/src/src/string/stpcpy.cpp | 3 +- .../llvm-libc/src/src/string/string_utils.h | 79 +- .../src/src/sys/auxv/linux/CMakeLists.txt | 13 +- .../src/src/sys/auxv/linux/getauxval.cpp | 223 +- .../src/src/sys/mman/linux/CMakeLists.txt | 9 +- .../llvm-libc/src/src/sys/mman/linux/mmap.cpp | 2 +- .../src/src/sys/mman/linux/shm_common.h | 29 +- .../src/src/sys/mman/linux/shm_open.cpp | 24 +- .../src/src/sys/mman/linux/shm_unlink.cpp | 32 +- .../src/src/sys/resource/linux/CMakeLists.txt | 2 + .../src/src/sys/resource/linux/getrlimit.cpp | 5 +- .../src/src/sys/resource/linux/setrlimit.cpp | 5 +- .../src/src/sys/time/linux/utimes.cpp | 22 +- .../llvm-libc/src/src/threads/call_once.cpp | 3 +- .../llvm-libc/src/src/time/CMakeLists.txt | 24 + .../src/src/time/baremetal/CMakeLists.txt | 26 + .../src/src/time/baremetal/localtime.cpp | 22 + .../src/src/time/baremetal/localtime_r.cpp | 24 + .../llvm-libc/src/src/time/localtime.cpp | 24 + .../llvm-libc/src/src/time/localtime.h | 22 + .../llvm-libc/src/src/time/localtime_r.cpp | 25 + .../llvm-libc/src/src/time/localtime_r.h | 22 + .../llvm-libc/src/src/time/time_utils.h | 17 +- .../llvm-libc/src/src/unistd/CMakeLists.txt | 14 + .../llvm-libc/src/src/unistd/faccessat.h | 20 + .../llvm-libc/src/src/unistd/gethostname.h | 21 + .../src/src/unistd/linux/CMakeLists.txt | 31 +- .../llvm-libc/src/src/unistd/linux/access.cpp | 2 +- .../src/src/unistd/linux/faccessat.cpp | 37 + .../src/src/unistd/linux/gethostname.cpp | 53 + .../llvm-libc/src/src/unistd/linux/setsid.cpp | 8 +- .../src/src/unistd/linux/sysconf.cpp | 11 +- .../llvm-libc/src/src/wchar/CMakeLists.txt | 1 + .../llvm-libc/src/src/wchar/wcpcpy.cpp | 2 +- .../llvm-libc/src/src/wchar/wcscpy.cpp | 2 +- .../llvm-libc/src/src/wchar/wcsncmp.cpp | 3 +- .../llvm-libc/src/src/wchar/wcsnrtombs.cpp | 2 +- .../llvm-libc/src/src/wchar/wcsnrtombs.h | 2 +- .../llvm-libc/src/src/wchar/wcsrtombs.cpp | 2 +- .../llvm-libc/src/src/wchar/wcsrtombs.h | 2 +- .../llvm-libc/src/src/wchar/wmemcpy.cpp | 3 +- .../llvm-libc/src/src/wchar/wmempcpy.cpp | 3 +- .../llvm-libc/src/src/wctype/iswalpha.cpp | 2 +- .../llvm-libc/src/src/wctype/iswalpha.h | 2 +- .../startup/baremetal/aarch64/CMakeLists.txt | 16 + .../src/startup/baremetal/aarch64/start.cpp | 112 + .../src/startup/baremetal/arm/start.cpp | 112 +- .../llvm-libc/src/startup/baremetal/fini.h | 6 + .../llvm-libc/src/startup/baremetal/init.h | 6 + .../src/startup/gpu/amdgpu/start.cpp | 13 +- .../llvm-libc/src/startup/gpu/nvptx/start.cpp | 13 +- .../src/startup/linux/CMakeLists.txt | 1 + .../src/startup/linux/aarch64/tls.cpp | 2 +- .../llvm-libc/src/startup/linux/do_start.cpp | 15 +- .../llvm-libc/src/startup/linux/riscv/tls.cpp | 2 +- .../src/startup/linux/x86_64/tls.cpp | 2 +- .../src/test/IntegrationTest/CMakeLists.txt | 1 + .../src/test/IntegrationTest/test.cpp | 21 +- .../llvm-libc/src/test/IntegrationTest/test.h | 6 +- .../src/test/UnitTest/CMakeLists.txt | 2 + .../src/test/UnitTest/ErrnoCheckingTest.h | 15 + .../src/test/UnitTest/FEnvSafeTest.cpp | 11 +- .../src/test/UnitTest/FEnvSafeTest.h | 3 +- .../src/test/UnitTest/FPExceptMatcher.cpp | 2 +- .../src/test/UnitTest/FPExceptMatcher.h | 2 +- .../llvm-libc/src/test/UnitTest/FPMatcher.h | 81 +- .../src/test/UnitTest/HermeticTestUtils.cpp | 19 +- .../test/UnitTest/LibcDeathTestExecutors.cpp | 3 +- .../llvm-libc/src/test/UnitTest/LibcTest.h | 7 +- .../src/test/UnitTest/MemoryMatcher.cpp | 4 +- .../llvm-libc/src/test/UnitTest/Test.h | 15 - .../llvm-libc/src/test/include/CMakeLists.txt | 10 + .../src/test/include/complex_test.cpp | 19 + .../src/test/include/netinet_in_test.cpp | 29 + .../llvm-libc/src/test/include/stdbit_stub.h | 78 +- .../src/__support/GPU/CMakeLists.txt | 13 + .../src/__support/GPU/fixedstack_test.cpp | 44 + .../integration/src/__support/GPU/match.cpp | 4 +- .../src/__support/threads/CMakeLists.txt | 21 + .../__support/threads/double_exit_test.cpp | 33 + .../src/__support/threads/main_exit_test.cpp | 30 + .../src/pthread/pthread_create_test.cpp | 13 +- .../src/pthread/pthread_join_test.cpp | 6 +- .../src/pthread/pthread_mutex_test.cpp | 4 +- .../src/pthread/pthread_name_test.cpp | 2 +- .../src/spawn/posix_spawn_test.cpp | 3 +- .../src/spawn/posix_spawn_test_binary.cpp | 2 +- .../src/stdio/sprintf_size_test.cpp | 2 +- .../integration/src/stdlib/getenv_test.cpp | 3 +- .../test/integration/src/threads/cnd_test.cpp | 2 +- .../test/integration/src/threads/mtx_test.cpp | 4 +- .../integration/src/unistd/execv_test.cpp | 3 +- .../integration/src/unistd/execve_test.cpp | 3 +- .../test/integration/src/unistd/fork_test.cpp | 3 +- .../integration/src/unistd/getcwd_test.cpp | 10 +- .../startup/gpu/rpc_interface_test.cpp | 3 +- .../integration/startup/gpu/rpc_lane_test.cpp | 5 +- .../startup/gpu/rpc_stream_test.cpp | 7 +- .../test/integration/startup/gpu/rpc_test.cpp | 3 +- .../startup/linux/main_without_envp.cpp | 2 +- .../integration/startup/linux/tls_test.cpp | 5 +- .../llvm-libc/src/test/shared/CMakeLists.txt | 17 + .../src/test/shared/shared_math_test.cpp | 23 +- .../llvm-libc/src/test/src/CMakeLists.txt | 1 + .../src/test/src/__support/CMakeLists.txt | 2 + .../src/test/src/__support/CPP/CMakeLists.txt | 22 + .../__support/CPP/integer_sequence_test.cpp | 3 +- .../src/test/src/__support/CPP/simd_test.cpp | 150 + .../src/test/src/__support/CPP/tuple_test.cpp | 71 + .../src/test/src/__support/File/file_test.cpp | 19 + .../src/__support/OSUtil/linux/vdso_test.cpp | 30 +- .../test/src/__support/freelist_heap_test.cpp | 2 +- .../src/test/src/__support/str_to_fp_test.h | 1 - .../src/__support/str_to_integer_test.cpp | 1 - .../__support/wchar/string_converter_test.cpp | 110 +- .../src/__support/wcs_to_integer_test.cpp | 1 - .../src/test/src/arpa/inet/CMakeLists.txt | 19 +- .../src/test/src/arpa/inet/inet_aton_test.cpp | 92 + .../src/test/src/dirent/CMakeLists.txt | 1 + .../src/test/src/dirent/dirent_test.cpp | 13 +- .../src/test/src/errno/CMakeLists.txt | 1 + .../src/test/src/errno/errno_test.cpp | 1 + .../src/test/src/fcntl/CMakeLists.txt | 3 + .../src/test/src/fcntl/creat_test.cpp | 6 +- .../src/test/src/fcntl/fcntl_test.cpp | 19 +- .../src/test/src/fcntl/openat_test.cpp | 8 +- .../src/test/src/math/CMakeLists.txt | 539 +- .../llvm-libc/src/test/src/math/FModTest.h | 1 + .../src/test/src/math/RoundToIntegerTest.h | 4 +- .../llvm-libc/src/test/src/math/RsqrtTest.h | 74 + .../llvm-libc/src/test/src/math/acos_test.cpp | 9 +- .../src/test/src/math/acosf16_test.cpp | 11 +- .../src/test/src/math/acosf_test.cpp | 15 +- .../src/test/src/math/acoshf16_test.cpp | 1 - .../src/test/src/math/acoshf_test.cpp | 13 +- .../llvm-libc/src/test/src/math/asin_test.cpp | 11 +- .../src/test/src/math/asinf_test.cpp | 15 +- .../src/test/src/math/asinhf16_test.cpp | 13 +- .../src/test/src/math/asinhf_test.cpp | 14 +- .../src/test/src/math/asinpif16_test.cpp | 40 + .../src/test/src/math/atan2f_test.cpp | 19 +- .../src/test/src/math/atanf16_test.cpp | 11 +- .../src/test/src/math/atanf_test.cpp | 2 - .../src/test/src/math/atanhf_test.cpp | 4 +- .../src/test/src/math/atanpif16_test.cpp | 40 + .../src/test/src/math/bf16add_test.cpp | 14 + .../src/test/src/math/bf16addf128_test.cpp | 14 + .../src/test/src/math/bf16addf_test.cpp | 14 + .../src/test/src/math/bf16addl_test.cpp | 14 + .../src/test/src/math/bf16div_test.cpp | 14 + .../src/test/src/math/bf16divf128_test.cpp | 14 + .../src/test/src/math/bf16divf_test.cpp | 14 + .../src/test/src/math/bf16divl_test.cpp | 14 + .../src/test/src/math/bf16fma_test.cpp | 14 + .../src/test/src/math/bf16fmaf128_test.cpp | 14 + .../src/test/src/math/bf16fmaf_test.cpp | 14 + .../src/test/src/math/bf16fmal_test.cpp | 14 + .../src/test/src/math/bf16mul_test.cpp | 15 + .../src/test/src/math/bf16mulf128_test.cpp | 15 + .../src/test/src/math/bf16mulf_test.cpp | 15 + .../src/test/src/math/bf16mull_test.cpp | 15 + .../src/test/src/math/bf16sub_test.cpp | 14 + .../src/test/src/math/bf16subf128_test.cpp | 14 + .../src/test/src/math/bf16subf_test.cpp | 14 + .../src/test/src/math/bf16subl_test.cpp | 14 + .../llvm-libc/src/test/src/math/cbrt_test.cpp | 13 +- .../llvm-libc/src/test/src/math/cos_test.cpp | 9 +- .../src/test/src/math/cosf16_test.cpp | 11 +- .../src/test/src/math/cosf_float_test.cpp | 35 + .../llvm-libc/src/test/src/math/cosf_test.cpp | 28 +- .../src/test/src/math/coshf16_test.cpp | 11 +- .../src/test/src/math/coshf_test.cpp | 5 +- .../src/test/src/math/cospif_test.cpp | 4 +- .../llvm-libc/src/test/src/math/erff_test.cpp | 18 +- .../test/src/math/exhaustive/CMakeLists.txt | 133 + .../src/math/exhaustive/bfloat16_add_test.cpp | 65 + .../src/math/exhaustive/bfloat16_div_test.cpp | 65 + .../src/math/exhaustive/bfloat16_mul_test.cpp | 65 + .../src/math/exhaustive/bfloat16_sub_test.cpp | 65 + .../src/math/exhaustive/cosf_float_test.cpp | 44 + .../src/math/exhaustive/exhaustive_test.h | 15 +- .../src/math/exhaustive/fmodbf16_test.cpp | 42 + .../src/math/exhaustive/hypotf16_test.cpp | 5 +- .../test/src/math/exhaustive/rsqrtf_test.cpp | 27 + .../src/math/exhaustive/sinf_float_test.cpp | 47 + .../src/test/src/math/exp10_test.cpp | 20 +- .../src/test/src/math/exp10f16_test.cpp | 13 +- .../src/test/src/math/exp10f_test.cpp | 5 - .../src/test/src/math/exp10m1f16_test.cpp | 13 +- .../src/test/src/math/exp10m1f_test.cpp | 12 +- .../llvm-libc/src/test/src/math/exp2_test.cpp | 8 +- .../src/test/src/math/exp2f16_test.cpp | 11 +- .../src/test/src/math/exp2f_test.cpp | 14 +- .../src/test/src/math/exp2m1f16_test.cpp | 13 +- .../src/test/src/math/exp2m1f_test.cpp | 11 +- .../llvm-libc/src/test/src/math/exp_test.cpp | 20 +- .../src/test/src/math/expf16_test.cpp | 11 +- .../llvm-libc/src/test/src/math/expf_test.cpp | 15 +- .../src/test/src/math/explogxf_test.cpp | 4 +- .../src/test/src/math/expm1_test.cpp | 14 +- .../src/test/src/math/expm1f16_test.cpp | 13 +- .../src/test/src/math/expm1f_test.cpp | 17 +- .../src/test/src/math/llrintbf16_test.cpp | 15 + .../src/test/src/math/llroundbf16_test.cpp | 14 + .../src/test/src/math/log10_test.cpp | 18 +- .../src/test/src/math/log10f16_test.cpp | 13 +- .../src/test/src/math/log10f_test.cpp | 10 +- .../src/test/src/math/log1p_test.cpp | 21 +- .../src/test/src/math/log1pf_test.cpp | 12 +- .../llvm-libc/src/test/src/math/log2_test.cpp | 8 +- .../src/test/src/math/log2f16_test.cpp | 10 +- .../src/test/src/math/log_bf16_test.cpp | 41 + .../llvm-libc/src/test/src/math/log_test.cpp | 18 +- .../src/test/src/math/logf16_test.cpp | 11 +- .../llvm-libc/src/test/src/math/logf_test.cpp | 14 +- .../src/test/src/math/lrintbf16_test.cpp | 15 + .../src/test/src/math/lroundbf16_test.cpp | 14 + .../src/test/src/math/nearbyintbf16_test.cpp | 14 + .../llvm-libc/src/test/src/math/powf_test.cpp | 13 +- .../src/test/src/math/rintbf16_test.cpp | 14 + .../src/test/src/math/rsqrtf16_test.cpp | 43 + .../src/test/src/math/rsqrtf_test.cpp | 12 + .../llvm-libc/src/test/src/math/sin_test.cpp | 9 +- .../src/test/src/math/sincos_test.cpp | 23 +- .../src/test/src/math/sincosf_test.cpp | 27 +- .../src/test/src/math/sinf16_test.cpp | 11 +- .../src/test/src/math/sinf_float_test.cpp | 35 + .../llvm-libc/src/test/src/math/sinf_test.cpp | 40 +- .../src/test/src/math/sinhf16_test.cpp | 11 +- .../src/test/src/math/sinhf_test.cpp | 17 +- .../src/test/src/math/sinpif_test.cpp | 4 +- .../src/test/src/math/smoke/AddTest.h | 4 + .../src/test/src/math/smoke/CMakeLists.txt | 1319 +++- .../src/test/src/math/smoke/CeilTest.h | 4 +- .../src/test/src/math/smoke/DivTest.h | 5 + .../src/test/src/math/smoke/FModTest.h | 60 +- .../src/test/src/math/smoke/FloorTest.h | 5 +- .../src/test/src/math/smoke/FmaTest.h | 3 +- .../src/test/src/math/smoke/FromfpTest.h | 54 +- .../src/test/src/math/smoke/FromfpxTest.h | 60 +- .../src/test/src/math/smoke/GetPayloadTest.h | 59 +- .../src/test/src/math/smoke/LdExpTest.h | 11 +- .../src/test/src/math/smoke/ModfTest.h | 10 +- .../src/test/src/math/smoke/MulTest.h | 10 +- .../src/test/src/math/smoke/NextAfterTest.h | 43 +- .../src/test/src/math/smoke/NextTowardTest.h | 4 +- .../src/test/src/math/smoke/RoundTest.h | 6 +- .../test/src/math/smoke/RoundToIntegerTest.h | 71 +- .../test/src/math/smoke/SetPayloadSigTest.h | 32 +- .../src/test/src/math/smoke/SetPayloadTest.h | 34 +- .../src/test/src/math/smoke/SubTest.h | 4 + .../test/src/math/smoke/TotalOrderMagTest.h | 47 +- .../src/test/src/math/smoke/TotalOrderTest.h | 47 +- .../src/test/src/math/smoke/TruncTest.h | 4 +- .../src/test/src/math/smoke/UfromfpTest.h | 26 +- .../src/test/src/math/smoke/UfromfpxTest.h | 28 +- .../src/test/src/math/smoke/acos_test.cpp | 4 +- .../src/test/src/math/smoke/acosf16_test.cpp | 3 +- .../src/test/src/math/smoke/acosf_test.cpp | 4 +- .../src/test/src/math/smoke/acoshf16_test.cpp | 34 +- .../src/test/src/math/smoke/acoshf_test.cpp | 4 +- .../test/src/math/smoke/acospif16_test.cpp | 16 +- .../src/test/src/math/smoke/asinf16_test.cpp | 3 +- .../src/test/src/math/smoke/asinf_test.cpp | 4 +- .../src/test/src/math/smoke/asinhf16_test.cpp | 3 +- .../src/test/src/math/smoke/asinhf_test.cpp | 4 +- .../test/src/math/smoke/asinpif16_test.cpp | 73 + .../src/test/src/math/smoke/atan2f_test.cpp | 3 - .../src/test/src/math/smoke/atanf16_test.cpp | 2 - .../src/test/src/math/smoke/atanf_test.cpp | 2 - .../src/test/src/math/smoke/atanhf16_test.cpp | 3 +- .../src/test/src/math/smoke/atanhf_test.cpp | 3 +- .../test/src/math/smoke/atanpif16_test.cpp | 63 + .../src/test/src/math/smoke/bf16add_test.cpp | 14 + .../test/src/math/smoke/bf16addf128_test.cpp | 14 + .../src/test/src/math/smoke/bf16addf_test.cpp | 14 + .../src/test/src/math/smoke/bf16addl_test.cpp | 14 + .../src/test/src/math/smoke/bf16div_test.cpp | 14 + .../test/src/math/smoke/bf16divf128_test.cpp | 14 + .../src/test/src/math/smoke/bf16divf_test.cpp | 14 + .../src/test/src/math/smoke/bf16divl_test.cpp | 14 + .../src/test/src/math/smoke/bf16fma_test.cpp | 14 + .../test/src/math/smoke/bf16fmaf128_test.cpp | 14 + .../src/test/src/math/smoke/bf16fmaf_test.cpp | 14 + .../src/test/src/math/smoke/bf16fmal_test.cpp | 14 + .../src/test/src/math/smoke/bf16mul_test.cpp | 14 + .../test/src/math/smoke/bf16mulf128_test.cpp | 14 + .../src/test/src/math/smoke/bf16mulf_test.cpp | 14 + .../src/test/src/math/smoke/bf16mull_test.cpp | 14 + .../src/test/src/math/smoke/bf16sub_test.cpp | 14 + .../test/src/math/smoke/bf16subf128_test.cpp | 14 + .../src/test/src/math/smoke/bf16subf_test.cpp | 14 + .../src/test/src/math/smoke/bf16subl_test.cpp | 14 + .../test/src/math/smoke/bfloat16_add_test.cpp | 15 + .../test/src/math/smoke/bfloat16_div_test.cpp | 15 + .../test/src/math/smoke/bfloat16_mul_test.cpp | 15 + .../test/src/math/smoke/bfloat16_sub_test.cpp | 15 + .../src/math/smoke/canonicalizebf16_test.cpp | 14 + .../src/test/src/math/smoke/ceilbf16_test.cpp | 14 + .../test/src/math/smoke/copysignbf16_test.cpp | 14 + .../src/test/src/math/smoke/cosf16_test.cpp | 4 +- .../src/test/src/math/smoke/cosf_test.cpp | 4 +- .../src/test/src/math/smoke/coshf16_test.cpp | 6 +- .../src/test/src/math/smoke/coshf_test.cpp | 5 +- .../src/test/src/math/smoke/cospif16_test.cpp | 12 +- .../src/test/src/math/smoke/cospif_test.cpp | 4 +- .../src/test/src/math/smoke/exp10_test.cpp | 9 +- .../src/test/src/math/smoke/exp10f16_test.cpp | 8 +- .../src/test/src/math/smoke/exp10f_test.cpp | 5 +- .../test/src/math/smoke/exp10m1f16_test.cpp | 8 +- .../src/test/src/math/smoke/exp10m1f_test.cpp | 8 +- .../src/test/src/math/smoke/exp2_test.cpp | 9 +- .../src/test/src/math/smoke/exp2f16_test.cpp | 8 +- .../src/test/src/math/smoke/exp2f_test.cpp | 5 +- .../test/src/math/smoke/exp2m1f16_test.cpp | 8 +- .../src/test/src/math/smoke/exp2m1f_test.cpp | 8 +- .../src/test/src/math/smoke/exp_test.cpp | 9 +- .../src/test/src/math/smoke/expf16_test.cpp | 11 +- .../src/test/src/math/smoke/expf_test.cpp | 5 +- .../src/test/src/math/smoke/expm1_test.cpp | 8 +- .../src/test/src/math/smoke/expm1f16_test.cpp | 7 - .../src/test/src/math/smoke/expm1f_test.cpp | 5 +- .../src/test/src/math/smoke/fdimbf16_test.cpp | 14 + .../test/src/math/smoke/floorbf16_test.cpp | 14 + .../src/test/src/math/smoke/fmaxbf16_test.cpp | 14 + .../math/smoke/fmaximum_mag_numbf16_test.cpp | 14 + .../src/math/smoke/fmaximum_magbf16_test.cpp | 14 + .../src/math/smoke/fmaximum_numbf16_test.cpp | 14 + .../test/src/math/smoke/fmaximumbf16_test.cpp | 14 + .../src/test/src/math/smoke/fminbf16_test.cpp | 14 + .../math/smoke/fminimum_mag_numbf16_test.cpp | 14 + .../src/math/smoke/fminimum_magbf16_test.cpp | 14 + .../src/math/smoke/fminimum_numbf16_test.cpp | 14 + .../test/src/math/smoke/fminimumbf16_test.cpp | 14 + .../src/test/src/math/smoke/fmodbf16_test.cpp | 14 + .../test/src/math/smoke/frexpbf16_test.cpp | 14 + .../test/src/math/smoke/fromfpbf16_test.cpp | 14 + .../test/src/math/smoke/fromfpxbf16_test.cpp | 14 + .../src/math/smoke/getpayloadbf16_test.cpp | 14 + .../test/src/math/smoke/ilogbbf16_test.cpp | 14 + .../src/math/smoke/iscanonicalbf16_test.cpp | 14 + .../src/math/smoke/issignalingbf16_test.cpp | 14 + .../test/src/math/smoke/ldexpbf16_test.cpp | 14 + .../test/src/math/smoke/llogbbf16_test.cpp | 14 + .../test/src/math/smoke/llrintbf16_test.cpp | 15 + .../test/src/math/smoke/llroundbf16_test.cpp | 14 + .../src/test/src/math/smoke/log10_test.cpp | 8 +- .../src/test/src/math/smoke/log10f16_test.cpp | 4 +- .../src/test/src/math/smoke/log10f_test.cpp | 8 + .../src/test/src/math/smoke/log1p_test.cpp | 6 +- .../src/test/src/math/smoke/log1pf_test.cpp | 5 +- .../src/test/src/math/smoke/log2_test.cpp | 7 +- .../src/test/src/math/smoke/log2f16_test.cpp | 4 +- .../src/test/src/math/smoke/log2f_test.cpp | 7 +- .../src/test/src/math/smoke/log_bf16_test.cpp | 52 + .../src/test/src/math/smoke/log_test.cpp | 7 +- .../src/test/src/math/smoke/logbbf16_test.cpp | 14 + .../src/test/src/math/smoke/logf16_test.cpp | 4 +- .../src/test/src/math/smoke/logf_test.cpp | 6 + .../test/src/math/smoke/lrintbf16_test.cpp | 15 + .../test/src/math/smoke/lroundbf16_test.cpp | 14 + .../src/test/src/math/smoke/modfbf16_test.cpp | 14 + .../src/test/src/math/smoke/nanbf16_test.cpp | 55 + .../src/math/smoke/nearbyintbf16_test.cpp | 14 + .../src/math/smoke/nextafterbf16_test.cpp | 14 + .../test/src/math/smoke/nextdownbf16_test.cpp | 14 + .../src/math/smoke/nexttowardbf16_test.cpp | 14 + .../test/src/math/smoke/nextupbf16_test.cpp | 14 + .../test/src/math/smoke/remquobf16_test.cpp | 14 + .../src/test/src/math/smoke/rintbf16_test.cpp | 14 + .../test/src/math/smoke/roundbf16_test.cpp | 14 + .../src/math/smoke/roundevenbf16_test.cpp | 14 + .../src/test/src/math/smoke/rsqrtf16_test.cpp | 47 + .../src/test/src/math/smoke/rsqrtf_test.cpp | 41 + .../test/src/math/smoke/scalblnbf16_test.cpp | 14 + .../test/src/math/smoke/scalbnbf16_test.cpp | 14 + .../src/math/smoke/setpayloadbf16_test.cpp | 14 + .../src/math/smoke/setpayloadsigbf16_test.cpp | 14 + .../src/test/src/math/smoke/sincos_test.cpp | 3 + .../src/test/src/math/smoke/sincosf_test.cpp | 3 +- .../src/test/src/math/smoke/sinf16_test.cpp | 4 +- .../src/test/src/math/smoke/sinf_test.cpp | 10 +- .../src/test/src/math/smoke/sinhf16_test.cpp | 6 +- .../src/test/src/math/smoke/sinhf_test.cpp | 5 +- .../src/test/src/math/smoke/sinpif16_test.cpp | 12 +- .../src/test/src/math/smoke/sinpif_test.cpp | 4 +- .../src/test/src/math/smoke/sqrtbf16_test.cpp | 14 + .../src/test/src/math/smoke/tanf16_test.cpp | 4 +- .../src/test/src/math/smoke/tanf_test.cpp | 4 +- .../src/test/src/math/smoke/tanhf16_test.cpp | 6 +- .../src/test/src/math/smoke/tanhf_test.cpp | 4 +- .../src/test/src/math/smoke/tanpif16_test.cpp | 4 +- .../src/test/src/math/smoke/tanpif_test.cpp | 4 +- .../src/math/smoke/totalorderbf16_test.cpp | 14 + .../src/math/smoke/totalordermagbf16_test.cpp | 14 + .../test/src/math/smoke/truncbf16_test.cpp | 14 + .../test/src/math/smoke/ufromfpbf16_test.cpp | 14 + .../test/src/math/smoke/ufromfpxbf16_test.cpp | 14 + .../src/test/src/math/sqrtbf16_test.cpp | 29 + .../llvm-libc/src/test/src/math/tan_test.cpp | 13 +- .../src/test/src/math/tanf16_test.cpp | 11 +- .../llvm-libc/src/test/src/math/tanf_test.cpp | 15 +- .../src/test/src/math/tanhf16_test.cpp | 11 +- .../src/test/src/math/tanhf_test.cpp | 3 - .../src/test/src/math/tanpif16_test.cpp | 13 +- .../src/test/src/nl_types/CMakeLists.txt | 15 + .../src/test/src/nl_types/nl_types_test.cpp | 34 + .../src/test/src/poll/CMakeLists.txt | 2 +- .../llvm-libc/src/test/src/poll/poll_test.cpp | 11 +- .../src/test/src/sched/CMakeLists.txt | 6 + .../src/test/src/sched/affinity_test.cpp | 13 +- .../src/test/src/sched/cpu_count_test.cpp | 7 +- .../src/test/src/sched/get_priority_test.cpp | 10 +- .../src/test/src/sched/getcpu_test.cpp | 1 - .../src/sched/param_and_scheduler_test.cpp | 18 +- .../src/sched/sched_rr_get_interval_test.cpp | 11 +- .../src/test/src/sched/yield_test.cpp | 7 +- .../src/test/src/setjmp/setjmp_test.cpp | 4 + .../src/test/src/signal/CMakeLists.txt | 3 + .../src/test/src/signal/sigaltstack_test.cpp | 8 +- .../src/test/src/signal/signal_test.cpp | 9 +- .../src/test/src/signal/sigprocmask_test.cpp | 18 +- .../src/test/src/spawn/CMakeLists.txt | 2 +- .../spawn/posix_spawn_file_actions_test.cpp | 2 +- .../src/test/src/stdfix/BitsFxTest.h | 10 +- .../src/test/src/stdfix/CMakeLists.txt | 29 +- .../llvm-libc/src/test/src/stdfix/DivITest.h | 74 + .../src/test/src/stdfix/FxBitsTest.h | 1 - .../src/test/src/stdfix/bitshk_test.cpp | 2 +- .../src/test/src/stdfix/bitshr_test.cpp | 2 +- .../src/test/src/stdfix/bitsk_test.cpp | 2 +- .../src/test/src/stdfix/bitslk_test.cpp | 2 +- .../src/test/src/stdfix/bitslr_test.cpp | 2 +- .../src/test/src/stdfix/bitsr_test.cpp | 2 +- .../src/test/src/stdfix/bitsuhk_test.cpp | 2 +- .../src/test/src/stdfix/bitsuhr_test.cpp | 2 +- .../src/test/src/stdfix/bitsuk_test.cpp | 2 +- .../src/test/src/stdfix/bitsulk_test.cpp | 2 +- .../src/test/src/stdfix/bitsulr_test.cpp | 2 +- .../src/test/src/stdfix/bitsur_test.cpp | 2 +- .../src/test/src/stdfix/rdivi_test.cpp | 14 + .../src/test/src/stdio/CMakeLists.txt | 1 - .../src/test/src/stdio/asprintf_test.cpp | 1 + .../src/stdio/printf_core/writer_test.cpp | 7 +- .../src/test/src/stdio/vasprintf_test.cpp | 1 - .../src/test/src/stdlib/StrfromTest.h | 4 +- .../src/test/src/stdlib/quick_sort_test.cpp | 4 + .../src/test/src/string/memchr_test.cpp | 10 +- .../test/src/string/memory_utils/op_tests.cpp | 9 +- .../src/string/memory_utils/utils_test.cpp | 10 +- .../src/test/src/string/memrchr_test.cpp | 10 +- .../src/test/src/string/strcspn_test.cpp | 4 + .../src/test/src/string/strpbrk_test.cpp | 4 + .../src/test/src/string/strsep_test.cpp | 24 +- .../src/test/src/string/strspn_test.cpp | 4 + .../src/test/src/string/strtok_r_test.cpp | 17 + .../src/test/src/string/strtok_test.cpp | 14 + .../src/test/src/strings/bzero_test.cpp | 3 +- .../test/src/sys/ioctl/linux/CMakeLists.txt | 2 + .../test/src/sys/ioctl/linux/ioctl_test.cpp | 8 +- .../test/src/sys/mman/linux/CMakeLists.txt | 6 +- .../test/src/sys/mman/linux/madvise_test.cpp | 2 - .../test/src/sys/mman/linux/mincore_test.cpp | 17 +- .../test/src/sys/mman/linux/mlock_test.cpp | 32 +- .../test/src/sys/mman/linux/mremap_test.cpp | 2 - .../test/src/sys/mman/linux/msync_test.cpp | 4 +- .../sys/mman/linux/remap_file_pages_test.cpp | 8 +- .../src/test/src/sys/mman/linux/shm_test.cpp | 2 - .../src/sys/random/linux/getrandom_test.cpp | 5 +- .../src/test/src/sys/resource/CMakeLists.txt | 2 - .../sys/resource/getrlimit_setrlimit_test.cpp | 7 +- .../src/test/src/termios/CMakeLists.txt | 1 + .../src/test/src/termios/termios_test.cpp | 37 +- .../src/test/src/time/CMakeLists.txt | 36 +- .../src/test/src/time/asctime_r_test.cpp | 9 +- .../src/test/src/time/asctime_test.cpp | 19 +- .../src/test/src/time/ctime_r_test.cpp | 12 +- .../src/test/src/time/ctime_test.cpp | 12 +- .../src/test/src/time/gmtime_r_test.cpp | 7 +- .../src/test/src/time/gmtime_test.cpp | 26 +- .../src/test/src/time/localtime_r_test.cpp | 93 + .../src/test/src/time/localtime_test.cpp | 64 + .../src/test/src/time/nanosleep_test.cpp | 14 +- .../src/test/src/time/timespec_get_test.cpp | 3 + .../src/test/src/unistd/CMakeLists.txt | 29 + .../src/test/src/unistd/faccessat_test.cpp | 115 + .../src/test/src/unistd/gethostname_test.cpp | 31 + .../src/test/src/wchar/CMakeLists.txt | 23 +- .../llvm-libc/src/test/src/wchar/WcstolTest.h | 1 + .../src/test/src/wchar/mblen_test.cpp | 2 +- .../src/test/src/wchar/mbrlen_test.cpp | 2 +- .../src/test/src/wchar/mbrtowc_test.cpp | 62 +- .../src/test/src/wchar/mbsnrtowcs_test.cpp | 2 +- .../src/test/src/wchar/mbsrtowcs_test.cpp | 2 +- .../src/test/src/wchar/mbstowcs_test.cpp | 2 +- .../src/test/src/wchar/mbtowc_test.cpp | 2 +- .../src/test/src/wchar/wcrtomb_test.cpp | 2 +- .../src/test/src/wchar/wctomb_test.cpp | 2 +- .../src/test/src/wctype/iswalpha_test.cpp | 76 +- .../src/utils/MPFRWrapper/CMakeLists.txt | 1 + .../src/utils/MPFRWrapper/MPCommon.cpp | 36 + .../src/utils/MPFRWrapper/MPCommon.h | 3 + .../src/utils/MPFRWrapper/MPFRUtils.cpp | 96 + .../src/utils/MPFRWrapper/MPFRUtils.h | 8 +- .../llvm-libc/src/utils/buildbot/Dockerfile | 2 +- .../src/utils/hdrgen/hdrgen/header.py | 5 +- .../third_party/lss/linux_syscall_support.h | 3 + .../src/third_party/modp_b64/README.chromium | 1 + naiveproxy/src/third_party/perfetto/BUILD.gn | 3 + .../src/third_party/perfetto/gn/BUILD.gn | 4 +- .../src/third_party/perfetto/gn/perfetto.gni | 28 + .../perfetto/gn/perfetto_unittests.gni | 2 +- .../{standalone/protoc.py => run_binary.py} | 7 +- .../perfetto/gn/standalone/BUILD.gn | 2 + .../perfetto/gn/standalone/proto_library.gni | 2 +- .../gn/standalone/sanitizers/ignorelist.txt | 4 + .../perfetto/gn/standalone/wasm.gni | 2 + .../perfetto/gn/write_buildflag_header.py | 145 +- .../android_tree/perfetto_build_flags.h | 44 + .../bazel/perfetto_build_flags.h | 44 + .../perfetto/include/perfetto/base/flat_set.h | 2 + .../perfetto/base/thread_annotations.h | 20 + .../perfetto/include/perfetto/base/time.h | 3 +- .../include/perfetto/ext/base/BUILD.gn | 6 +- .../perfetto/include/perfetto/ext/base/bits.h | 100 + .../perfetto/ext/base/dynamic_string_writer.h | 105 + .../include/perfetto/ext/base/file_utils.h | 9 +- ...{string_writer.h => fixed_string_writer.h} | 10 +- .../include/perfetto/ext/base/flags.h | 13 +- .../perfetto/ext/base/lock_free_task_runner.h | 279 + .../include/perfetto/ext/base/murmur_hash.h | 1 + .../include/perfetto/ext/base/rt_mutex.h | 212 + .../include/perfetto/ext/base/scoped_file.h | 3 +- .../include/perfetto/ext/base/small_set.h | 2 + .../include/perfetto/ext/base/status_macros.h | 10 +- .../include/perfetto/ext/base/subprocess.h | 2 +- .../include/perfetto/ext/base/sys_types.h | 12 +- .../perfetto/ext/base/thread_task_runner.h | 24 +- .../perfetto/ext/base/threading/BUILD.gn | 12 +- .../perfetto/ext/base/threading/channel.h | 181 - .../perfetto/ext/base/threading/future.h | 149 - .../ext/base/threading/future_combinators.h | 76 - .../perfetto/ext/base/threading/poll.h | 245 - .../perfetto/ext/base/threading/spawn.h | 149 - .../perfetto/ext/base/threading/stream.h | 190 - .../ext/base/threading/stream_combinators.h | 315 - .../perfetto/ext/base/threading/util.h | 210 - .../perfetto/ext/base/unix_task_runner.h | 3 +- .../perfetto/ext/tracing/core/consumer.h | 3 +- .../ext/tracing/core/tracing_service.h | 5 + .../perfetto/protozero/proto_decoder.h | 90 +- .../protos/config/data_source_config.pzc.h | 6 + .../public/protos/config/trace_config.pzc.h | 10 + .../track_event/track_event_config.pzc.h | 5 + .../trace/android/android_track_event.pzc.h | 108 + .../public/protos/trace/trace_packet.pzc.h | 12 + .../track_event/counter_descriptor.pzc.h | 5 + .../trace/track_event/track_descriptor.pzc.h | 5 + .../trace/track_event/track_event.pzc.h | 36 + .../include/perfetto/trace_processor/BUILD.gn | 11 +- .../perfetto/trace_processor/basic_types.h | 20 + .../trace_processor/trace_blob_view.h | 1 + .../trace_processor/trace_processor.h | 2 +- .../tracing/internal/track_event_internal.h | 3 + .../tracing/internal/track_event_legacy.h | 4 + .../tracing/internal/track_event_macros.h | 16 +- .../include/perfetto/tracing/tracing.h | 8 + .../perfetto/include/perfetto/tracing/track.h | 69 +- .../include/perfetto/tracing/track_event.h | 20 +- .../perfetto/tracing/track_event_legacy.h | 38 +- .../common/gpu_counter_descriptor.proto | 1 + .../protos/perfetto/common/perf_events.proto | 27 +- .../protos/perfetto/config/android/BUILD.gn | 1 + .../config/android/packages_list_config.proto | 6 + .../config/android/user_list_config.proto | 27 + .../perfetto/config/data_source_config.proto | 6 +- .../perfetto/config/etw/etw_config.proto | 12 +- .../config/ftrace/ftrace_config.proto | 84 +- .../config/inode_file/inode_file_config.proto | 2 + .../perfetto/config/perfetto_config.proto | 247 +- .../process_stats/process_stats_config.proto | 43 +- .../config/profiling/perf_event_config.proto | 17 +- .../protos/perfetto/config/trace_config.proto | 32 +- .../track_event/track_event_config.proto | 7 + .../protos/perfetto/ipc/consumer_port.proto | 9 + .../android/wattson_in_time_period.proto | 5 + .../android/wattson_tasks_attribution.proto | 5 + .../metrics/perfetto_merged_metrics.proto | 10 + .../perfetto_sql/structured_query.proto | 63 +- .../protos/perfetto/trace/android/BUILD.gn | 1 + .../trace/android/android_track_event.proto | 86 + .../trace/android/frame_timeline_event.proto | 21 + .../trace/android/network_trace.proto | 4 +- .../android/server/windowmanagerservice.proto | 1 + .../trace/android/surfaceflinger_common.proto | 33 +- .../trace/android/surfaceflinger_layers.proto | 12 + .../android/surfaceflinger_transactions.proto | 9 + .../perfetto/trace/android/user_list.proto | 33 + .../protos/perfetto/trace/etw/etw.proto | 102 +- .../protos/perfetto/trace/etw/etw_event.proto | 9 +- .../perfetto/trace/ftrace/ftrace_event.proto | 5 + .../trace/ftrace/ftrace_event_bundle.proto | 5 +- .../perfetto/trace/ftrace/ftrace_stats.proto | 13 + .../perfetto/trace/ftrace/gpu_scheduler.proto | 34 + .../trace/generic_kernel/generic_task.proto | 45 + .../trace/gpu/gpu_render_stage_event.proto | 5 + .../perfetto/trace/perfetto_trace.proto | 821 ++- .../perfetto/trace/power/power_rails.proto | 6 + .../trace/profiling/profile_common.proto | 47 +- .../perfetto/trace/ps/process_stats.proto | 3 + .../protos/perfetto/trace/trace_packet.proto | 6 +- .../chrome_process_descriptor.proto | 51 +- .../chrome_thread_descriptor.proto | 62 +- .../track_event/counter_descriptor.proto | 9 + .../trace/track_event/track_descriptor.proto | 7 +- .../trace/track_event/track_event.proto | 72 +- .../trace_processor/trace_processor.proto | 13 +- .../perfetto/trace_summary/v2_metric.proto | 185 +- .../third_party/chromium/chrome_enums.proto | 114 + .../chromium/chrome_track_event.proto | 226 +- .../chrome_track_event_import_wrapper.proto | 1 + .../optimization_guide/actions_data.proto | 270 +- .../common_quality_data.proto | 206 +- .../protos/third_party/chromium/sources.gni | 9 +- .../protos/third_party/simpleperf/BUILD.gn | 11 +- .../simpleperf/cmd_report_sample.proto | 160 + .../third_party/simpleperf/record_file.proto | 2 + .../sdk/PerfettoTrackEventBuilder.java | 12 +- .../perfetto/sdk/PerfettoTrackEventExtra.java | 8 +- .../perfetto/sdk/test/PerfettoTraceTest.java | 8 +- .../src/android_stats/perfetto_atoms.h | 2 + .../third_party/perfetto/src/base/BUILD.gn | 2 + .../perfetto/src/base/file_utils.cc | 75 +- .../src/base/lock_free_task_runner.cc | 535 ++ .../third_party/perfetto/src/base/rt_mutex.cc | 100 + .../perfetto/src/base/rt_mutex_benchmark.cc | 115 + .../perfetto/src/base/subprocess_windows.cc | 2 +- .../src/base/task_runner_benchmark.cc | 151 + .../perfetto/src/base/test/test_task_runner.h | 4 +- .../perfetto/src/base/thread_checker.cc | 5 +- .../perfetto/src/base/thread_task_runner.cc | 11 +- .../perfetto/src/base/threading/BUILD.gn | 15 +- .../perfetto/src/base/threading/spawn.cc | 125 - .../perfetto/src/base/unix_task_runner.cc | 24 +- .../third_party/perfetto/src/base/utils.cc | 11 +- .../orchestrator/orchestrator_impl.cc | 2 +- .../src/ipc/test/ipc_integrationtest.cc | 15 +- .../perfetto/src/perfetto_cmd/config.cc | 2 +- .../perfetto/src/perfetto_cmd/perfetto_cmd.cc | 22 +- .../perfetto/src/perfetto_cmd/perfetto_cmd.h | 9 +- .../src/perfetto_cmd/perfetto_cmd_android.cc | 4 + .../src/perfetto_cmd/trigger_perfetto.cc | 4 +- .../src/profiling/common/producer_support.cc | 2 +- .../perfetto/src/profiling/deobfuscator.cc | 4 +- .../perfetto/src/profiling/memory/client.cc | 2 +- .../memory/client_api_factory_standalone.cc | 4 +- .../src/profiling/memory/heapprofd.cc | 5 +- .../src/profiling/perf/event_config.cc | 124 +- .../src/profiling/perf/event_config.h | 3 + .../src/profiling/perf/perf_producer.cc | 103 +- .../src/profiling/perf/regs_parsing.cc | 11 +- .../src/profiling/perf/traced_perf.cc | 4 +- .../perfetto/src/profiling/perf/unwinding.cc | 3 +- .../perfetto/src/profiling/perf/unwinding.h | 21 +- .../profiling/symbolizer/breakpad_parser.cc | 5 +- .../symbolizer/breakpad_symbolizer.cc | 20 +- .../symbolizer/breakpad_symbolizer.h | 12 +- .../src/profiling/symbolizer/filesystem.h | 11 +- .../symbolizer/filesystem_windows.cc | 8 +- .../profiling/symbolizer/local_symbolizer.cc | 559 +- .../profiling/symbolizer/local_symbolizer.h | 31 +- .../src/profiling/symbolizer/subprocess.h | 1 + .../symbolizer/symbolize_database.cc | 60 +- .../src/profiling/symbolizer/symbolizer.h | 8 + .../perfetto/src/protozero/BUILD.gn | 1 + .../src/protozero/descriptor_diff/BUILD.gn | 51 + .../descriptor_diff/descriptor_diff.cc | 76 + .../descriptor_diff/descriptor_diff.h | 70 + .../src/protozero/descriptor_diff/main.cc | 160 + .../src/protozero/filtering/filter_util.cc | 59 +- .../protoc_plugin/protozero_plugin.cc | 9 +- .../test/example_proto/extensions.proto | 10 + .../protozero/text_to_proto/text_to_proto.cc | 2 +- .../perfetto/src/shared_lib/BUILD.gn | 28 +- .../perfetto/src/shared_lib/test/BUILD.gn | 1 + .../shared_lib/test/protos/extensions.pzc.h | 25 + .../perfetto/src/shared_lib/track_event.cc | 1376 ---- .../src/shared_lib/track_event/BUILD.gn | 67 + .../shared_lib/track_event/category_impl.cc | 54 + .../shared_lib/track_event/category_impl.h | 36 + .../shared_lib/track_event/category_utils.cc | 112 + .../shared_lib/track_event/category_utils.h | 34 + .../perfetto/src/shared_lib/track_event/ds.cc | 76 + .../perfetto/src/shared_lib/track_event/ds.h | 153 + .../shared_lib/track_event/global_state.cc | 124 + .../src/shared_lib/track_event/global_state.h | 63 + .../perfetto/src/shared_lib/track_event/hl.cc | 554 ++ .../{ => track_event}/intern_map.cc | 2 +- .../shared_lib/{ => track_event}/intern_map.h | 6 +- .../perfetto/src/shared_lib/track_event/ll.cc | 171 + .../shared_lib/track_event/serialization.cc | 206 + .../shared_lib/track_event/serialization.h | 41 + .../src/shared_lib/track_event/track_event.cc | 88 + .../src/tools/dump_ftrace_stats/main.cc | 10 +- .../src/tools/ftrace_proto_gen/event_list | 5 + .../perfetto/src/trace_processor/BUILD.gn | 14 +- .../containers/implicit_segment_forest.h | 28 +- .../containers/string_pool_benchmark.cc | 5 + .../trace_processor/dataframe/dataframe.cc | 9 + .../src/trace_processor/dataframe/dataframe.h | 10 +- .../impl/bytecode_interpreter_test_utils.h | 24 +- .../dataframe/impl/query_plan.cc | 5 + .../dataframe/impl/query_plan.h | 5 +- .../src/trace_processor/export_json.cc | 289 +- .../src/trace_processor/export_json.h | 12 +- .../forwarding_trace_parser.cc | 100 +- .../trace_processor/forwarding_trace_parser.h | 7 +- .../importers/android_bugreport/BUILD.gn | 8 +- ...oid_battery_stats_history_string_tracker.h | 19 +- .../android_battery_stats_reader.cc | 21 +- .../android_battery_stats_reader.h | 5 + .../android_bugreport_reader.cc | 58 +- .../android_bugreport_reader.h | 31 +- ...l.cc => android_dumpstate_event_parser.cc} | 31 +- ...mpl.h => android_dumpstate_event_parser.h} | 24 +- .../android_dumpstate_reader.cc | 29 +- .../android_dumpstate_reader.h | 9 +- .../android_bugreport/android_log_event.cc | 9 +- ...er_impl.cc => android_log_event_parser.cc} | 7 +- ...rser_impl.h => android_log_event_parser.h} | 17 +- .../android_bugreport/android_log_reader.cc | 118 +- .../android_bugreport/android_log_reader.h | 33 +- .../android_bugreport/chunked_line_reader.cc | 13 +- .../importers/archive/tar_trace_reader.cc | 9 +- .../importers/archive/tar_trace_reader.h | 9 +- .../importers/archive/zip_trace_reader.cc | 16 +- .../importers/archive/zip_trace_reader.h | 7 +- .../importers/art_hprof/art_hprof_parser.h | 1 - .../importers/art_method/BUILD.gn | 4 +- ...od_parser_impl.cc => art_method_parser.cc} | 10 +- ...thod_parser_impl.h => art_method_parser.h} | 17 +- .../art_method/art_method_tokenizer.cc | 12 +- .../art_method/art_method_tokenizer.h | 5 +- .../trace_processor/importers/common/BUILD.gn | 20 +- .../importers/common/args_tracker.h | 18 +- .../importers/common/args_translation_table.h | 8 + .../importers/common/chunked_trace_reader.h | 3 +- .../importers/common/clock_tracker.cc | 346 +- .../importers/common/clock_tracker.h | 389 +- .../importers/common/event_tracker.cc | 15 +- .../importers/common/event_tracker.h | 3 +- .../importers/common/flow_tracker.cc | 31 +- .../importers/common/import_logs_tracker.cc | 89 + .../importers/common/import_logs_tracker.h | 74 + .../importers/common/jit_cache.cc | 1 - .../common/legacy_v8_cpu_profile_tracker.cc | 15 + .../common/legacy_v8_cpu_profile_tracker.h | 10 +- .../importers/common/mapping_tracker.cc | 16 +- .../importers/common/mapping_tracker.h | 2 +- .../importers/common/parser_types.h | 3 - .../importers/common/process_tracker.cc | 266 +- .../importers/common/process_tracker.h | 126 +- .../registered_file_tracker.cc} | 43 +- .../registered_file_tracker.h} | 42 +- .../importers/common/slice_tracker.cc | 15 +- .../importers/common/slice_tracker.h | 1 - .../importers/common/stack_profile_tracker.cc | 79 +- .../importers/common/stack_profile_tracker.h | 43 +- .../importers/common/symbol_tracker.cc | 94 + .../importers/common/symbol_tracker.h | 61 + .../importers/common/thread_state_tracker.cc | 43 +- .../importers/common/thread_state_tracker.h | 3 + .../importers/common/trace_file_tracker.cc | 8 +- .../importers/common/trace_file_tracker.h | 2 + .../importers/common/trace_parser.cc | 33 - .../importers/common/trace_parser.h | 129 - .../importers/common/track_compressor.cc | 7 + .../importers/common/track_compressor.h | 17 +- .../importers/common/track_tracker.cc | 14 +- .../importers/common/track_tracker.h | 23 +- .../trace_processor/importers/common/tracks.h | 52 +- .../importers/common/tracks_common.h | 137 +- .../importers/common/tracks_internal.h | 26 +- .../common/virtual_memory_mapping.cc | 82 +- .../importers/common/virtual_memory_mapping.h | 38 +- .../trace_processor/importers/etm/BUILD.gn | 51 +- .../importers/etm/element_cursor.cc | 10 +- .../importers/etm/element_cursor.h | 9 +- .../importers/etm/etm_tracker.cc | 21 +- .../importers/etm/etm_tracker.h | 23 +- .../importers/etm/etm_v4_decoder.cc | 1 + .../importers/etm/etm_v4_decoder.h | 3 +- .../importers/etm/etm_v4_stream.cc | 46 +- .../importers/etm/etm_v4_stream.h | 5 +- .../etm/etm_v4_stream_demultiplexer.cc | 26 +- .../etm/etm_v4_stream_demultiplexer.h | 3 + .../importers/etm/file_tracker.cc | 62 - .../importers/etm/file_tracker.h | 65 - .../importers/etm/frame_decoder.cc | 5 +- .../importers/etm/frame_decoder.h | 2 +- .../importers/etm/mapping_version.cc | 26 +- .../importers/etm/mapping_version.h | 10 +- .../trace_processor/importers/etm/opencsd.h | 1 + .../importers/etm/storage_handle.cc | 16 +- .../importers/etm/storage_handle.h | 4 +- .../importers/etm/target_memory.cc | 4 + .../importers/etm/target_memory.h | 1 + .../importers/etm/target_memory_reader.h | 4 +- .../importers/etm/virtual_address_space.cc | 18 +- .../importers/etm/virtual_address_space.h | 8 +- .../trace_processor/importers/etw/BUILD.gn | 1 - .../importers/etw/etw_module.cc | 14 +- .../importers/etw/etw_module.h | 10 +- .../importers/etw/etw_module_impl.cc | 20 +- .../importers/etw/etw_module_impl.h | 14 +- .../importers/etw/etw_parser.cc | 233 +- .../importers/etw/etw_parser.h | 5 + .../importers/etw/etw_tokenizer.cc | 25 +- .../importers/etw/etw_tokenizer.h | 16 +- .../trace_processor/importers/ftrace/BUILD.gn | 1 - .../importers/ftrace/drm_tracker.cc | 87 +- .../importers/ftrace/drm_tracker.h | 145 +- .../importers/ftrace/ftrace_descriptors.cc | 61 +- .../importers/ftrace/ftrace_module.cc | 16 +- .../importers/ftrace/ftrace_module.h | 11 +- .../importers/ftrace/ftrace_module_impl.cc | 23 +- .../importers/ftrace/ftrace_module_impl.h | 17 +- .../importers/ftrace/ftrace_parser.cc | 115 +- .../importers/ftrace/ftrace_parser.h | 23 +- .../ftrace/ftrace_sched_event_tracker.cc | 6 +- .../importers/ftrace/ftrace_tokenizer.cc | 49 +- .../importers/ftrace/ftrace_tokenizer.h | 24 +- .../ftrace/generic_ftrace_tracker.cc | 277 +- .../importers/ftrace/generic_ftrace_tracker.h | 50 +- .../ftrace/gpu_work_period_tracker.cc | 30 +- .../ftrace/gpu_work_period_tracker.h | 6 + .../importers/ftrace/v4l2_tracker.h | 7 - .../importers/ftrace/virtio_video_tracker.h | 8 - .../importers/fuchsia/fuchsia_trace_parser.cc | 3 +- .../importers/fuchsia/fuchsia_trace_parser.h | 7 +- .../fuchsia/fuchsia_trace_tokenizer.cc | 38 +- .../fuchsia/fuchsia_trace_tokenizer.h | 10 +- .../trace_processor/importers/gecko/BUILD.gn | 6 +- ...e_parser_impl.cc => gecko_trace_parser.cc} | 8 +- ...ace_parser_impl.h => gecko_trace_parser.h} | 18 +- .../importers/gecko/gecko_trace_tokenizer.cc | 18 +- .../importers/gecko/gecko_trace_tokenizer.h | 3 + .../importers/generic_kernel/BUILD.gn | 1 - .../generic_kernel/generic_kernel_module.cc | 31 +- .../generic_kernel/generic_kernel_module.h | 12 +- .../generic_kernel/generic_kernel_parser.cc | 93 +- .../generic_kernel/generic_kernel_parser.h | 2 + .../importers/i2c/i2c_tracker.h | 8 +- .../instruments/instruments_xml_tokenizer.cc | 14 +- .../instruments/instruments_xml_tokenizer.h | 4 + .../importers/instruments/row_data_tracker.h | 15 +- .../importers/instruments/row_parser.cc | 16 +- .../importers/instruments/row_parser.h | 13 +- .../trace_processor/importers/json/BUILD.gn | 33 +- ...ce_parser_impl.cc => json_trace_parser.cc} | 110 +- ...race_parser_impl.h => json_trace_parser.h} | 24 +- .../importers/json/json_trace_tokenizer.cc | 65 +- .../importers/json/json_trace_tokenizer.h | 21 +- .../importers/ninja/ninja_log_parser.h | 1 - .../trace_processor/importers/perf/BUILD.gn | 9 +- .../importers/perf/aux_data_tokenizer.h | 2 +- .../importers/perf/aux_stream_manager.cc | 12 +- .../importers/perf/aux_stream_manager.h | 10 +- .../importers/perf/features.cc | 17 +- .../trace_processor/importers/perf/features.h | 8 +- .../importers/perf/perf_data_tokenizer.cc | 68 +- .../importers/perf/perf_data_tokenizer.h | 28 +- .../importers/perf/perf_event_attr.cc | 30 +- .../importers/perf/perf_event_attr.h | 17 +- .../{perf_session.cc => perf_invocation.cc} | 49 +- .../{perf_session.h => perf_invocation.h} | 24 +- .../importers/perf/perf_tracker.cc | 127 +- .../importers/perf/perf_tracker.h | 44 +- .../trace_processor/importers/perf/record.h | 4 +- .../importers/perf/record_parser.cc | 51 +- .../importers/perf/record_parser.h | 22 +- .../trace_processor/importers/perf/sample.cc | 2 +- .../trace_processor/importers/perf/sample.h | 4 +- .../importers/perf/spe_record_parser.cc | 5 +- .../importers/perf/spe_record_parser.h | 9 +- .../importers/perf/spe_tokenizer.cc | 13 +- .../importers/perf/spe_tokenizer.h | 18 +- .../importers/perf_text/BUILD.gn | 5 +- ...rser_impl.cc => perf_text_trace_parser.cc} | 11 +- ...parser_impl.h => perf_text_trace_parser.h} | 17 +- .../perf_text/perf_text_trace_tokenizer.cc | 26 +- .../perf_text/perf_text_trace_tokenizer.h | 3 + .../trace_processor/importers/pprof/BUILD.gn | 31 + .../importers/pprof/pprof_trace_reader.cc | 349 + .../importers/pprof/pprof_trace_reader.h | 55 + .../trace_processor/importers/proto/BUILD.gn | 18 +- .../importers/proto/additional_modules.cc | 78 +- .../importers/proto/additional_modules.h | 11 +- .../proto/android_camera_event_module.cc | 9 +- .../proto/android_camera_event_module.h | 16 +- .../proto/android_cpu_per_uid_module.cc | 127 + .../proto/android_cpu_per_uid_module.h | 54 + .../proto/android_cpu_per_uid_state.cc | 26 + .../proto/android_cpu_per_uid_state.h | 43 + .../proto/android_kernel_wakelocks_module.cc | 6 +- .../proto/android_kernel_wakelocks_module.h | 4 +- .../importers/proto/android_probes_module.cc | 314 +- .../importers/proto/android_probes_module.h | 21 +- .../importers/proto/android_probes_parser.cc | 192 +- .../importers/proto/android_probes_parser.h | 27 +- .../importers/proto/android_probes_tracker.h | 45 +- .../importers/proto/app_wakelock_module.cc | 27 +- .../importers/proto/app_wakelock_module.h | 7 +- .../importers/proto/args_parser.cc | 4 +- .../importers/proto/chrome_string_lookup.cc | 381 +- .../importers/proto/chrome_string_lookup.h | 11 +- .../proto/chrome_system_probes_module.cc | 16 +- .../proto/chrome_system_probes_module.h | 13 +- .../proto/chrome_system_probes_parser.cc | 2 +- .../importers/proto/content_analyzer.cc | 3 +- .../importers/proto/default_modules.cc | 37 +- .../importers/proto/default_modules.h | 11 +- .../importers/proto/deobfuscation_module.cc | 278 +- .../importers/proto/deobfuscation_module.h | 29 +- .../importers/proto/deobfuscation_tracker.cc | 347 + .../importers/proto/deobfuscation_tracker.h | 99 + .../proto/frame_timeline_event_parser.cc | 175 +- .../proto/frame_timeline_event_parser.h | 14 + .../importers/proto/gpu_event_parser.cc | 153 +- .../importers/proto/gpu_event_parser.h | 9 +- .../importers/proto/graphics_event_module.cc | 64 +- .../importers/proto/graphics_event_module.h | 20 +- .../importers/proto/heap_graph_module.cc | 27 +- .../importers/proto/heap_graph_module.h | 12 +- .../importers/proto/heap_graph_tracker.h | 6 +- .../importers/proto/jit_tracker.h | 10 +- .../proto/memory_tracker_snapshot_module.cc | 19 +- .../proto/memory_tracker_snapshot_module.h | 13 +- .../proto/memory_tracker_snapshot_parser.cc | 4 +- .../proto/metadata_minimal_module.cc | 27 +- .../importers/proto/metadata_minimal_module.h | 16 +- .../importers/proto/metadata_module.cc | 25 +- .../importers/proto/metadata_module.h | 19 +- .../proto/multi_machine_trace_manager.cc | 84 - .../proto/multi_machine_trace_manager.h | 93 - .../importers/proto/network_trace_module.cc | 41 +- .../importers/proto/network_trace_module.h | 12 +- .../proto/packet_sequence_state_generation.h | 48 +- .../importers/proto/perf_sample_tracker.cc | 110 +- .../importers/proto/perf_sample_tracker.h | 1 - .../importers/proto/pigweed_detokenizer.cc | 4 +- .../importers/proto/pixel_modem_module.cc | 43 +- .../importers/proto/pixel_modem_module.h | 14 +- .../importers/proto/profile_module.cc | 48 +- .../importers/proto/profile_module.h | 14 +- .../importers/proto/proto_importer_module.cc | 71 +- .../importers/proto/proto_importer_module.h | 73 +- .../proto/proto_trace_parser_impl.cc | 60 +- .../importers/proto/proto_trace_parser_impl.h | 29 +- .../importers/proto/proto_trace_reader.cc | 154 +- .../importers/proto/proto_trace_reader.h | 9 +- .../proto/stack_profile_sequence_state.cc | 76 +- .../proto/stack_profile_sequence_state.h | 39 +- .../importers/proto/statsd_module.cc | 26 +- .../importers/proto/statsd_module.h | 4 +- .../importers/proto/system_probes_module.cc | 32 +- .../importers/proto/system_probes_module.h | 15 +- .../importers/proto/system_probes_parser.cc | 148 +- .../importers/proto/system_probes_parser.h | 22 +- .../proto/track_event_event_importer.h | 88 +- .../importers/proto/track_event_module.cc | 18 +- .../importers/proto/track_event_module.h | 3 +- .../importers/proto/track_event_parser.cc | 16 +- .../importers/proto/track_event_parser.h | 6 +- .../importers/proto/track_event_tokenizer.cc | 83 +- .../importers/proto/track_event_tokenizer.h | 12 +- .../importers/proto/track_event_tracker.cc | 9 +- .../importers/proto/track_event_tracker.h | 6 +- .../proto/translation_table_module.cc | 20 +- .../proto/translation_table_module.h | 12 +- .../importers/proto/v8_module.cc | 32 +- .../importers/proto/v8_module.h | 17 +- .../importers/proto/v8_sequence_state.cc | 5 +- .../importers/proto/v8_sequence_state.h | 7 +- .../importers/proto/v8_tracker.cc | 8 +- .../importers/proto/v8_tracker.h | 17 +- .../importers/proto/winscope/BUILD.gn | 21 + .../winscope/android_input_event_parser.cc | 9 +- .../winscope/protolog_message_decoder.cc | 55 + .../proto/winscope/protolog_parser.cc | 9 +- .../winscope/shell_transitions_parser.cc | 12 +- .../surfaceflinger_layers_extractor.cc | 92 +- .../winscope/surfaceflinger_layers_parser.cc | 53 +- .../surfaceflinger_layers_test_utils.h | 36 +- .../winscope/surfaceflinger_layers_utils.h | 28 + ...ceflinger_layers_visibility_computation.cc | 14 +- .../surfaceflinger_transactions_parser.cc | 3 +- .../test/windowmanager_sample_protos.h | 297 + .../proto/winscope/viewcapture_args_parser.cc | 106 +- .../proto/winscope/viewcapture_args_parser.h | 17 +- .../proto/winscope/viewcapture_parser.cc | 93 +- .../proto/winscope/viewcapture_parser.h | 23 +- .../winscope/viewcapture_rect_computation.cc | 135 + .../winscope/viewcapture_rect_computation.h | 61 + .../proto/winscope/viewcapture_test_utils.h | 92 + .../winscope/viewcapture_views_extractor.cc | 85 + .../winscope/viewcapture_views_extractor.h | 35 + .../viewcapture_visibility_computation.cc | 48 + .../viewcapture_visibility_computation.h | 47 + .../windowmanager_hierarchy_walker.cc | 441 ++ .../winscope/windowmanager_hierarchy_walker.h | 153 + .../proto/winscope/windowmanager_parser.cc | 196 + .../proto/winscope/windowmanager_parser.h | 58 + .../winscope/windowmanager_proto_clone.cc | 277 + .../winscope/windowmanager_proto_clone.h | 32 + .../proto/winscope/winscope_geometry.cc | 100 +- .../proto/winscope/winscope_geometry.h | 9 + .../winscope/winscope_geometry_test_utils.h | 48 + .../proto/winscope/winscope_module.cc | 57 +- .../proto/winscope/winscope_module.h | 18 +- .../importers/simpleperf_proto/BUILD.gn | 35 + .../simpleperf_proto_parser.cc | 154 + .../simpleperf_proto_parser.h | 50 + .../simpleperf_proto_tokenizer.cc | 240 + .../simpleperf_proto_tokenizer.h | 70 + .../simpleperf_proto_tracker.h | 97 + .../importers/systrace/BUILD.gn | 2 + .../systrace/systrace_line_parser.cc | 30 +- .../importers/systrace/systrace_line_parser.h | 1 - .../systrace/systrace_line_tokenizer.cc | 73 +- .../systrace/systrace_line_tokenizer.h | 15 +- .../importers/systrace/systrace_parser.cc | 2 + .../systrace/systrace_trace_parser.cc | 92 +- .../systrace/systrace_trace_parser.h | 15 +- .../src/trace_processor/iterator_impl.cc | 21 +- .../src/trace_processor/metrics/metrics.cc | 236 +- .../src/trace_processor/metrics/metrics.h | 58 +- .../metrics/sql/android/BUILD.gn | 1 + .../metrics/sql/android/android_binder.sql | 1 + ...id_blocking_calls_cuj_per_frame_metric.sql | 3 +- .../metrics/sql/android/android_jank_cuj.sql | 53 +- .../android/jank/android_jank_cuj_init.sql | 72 + .../sql/android/jank/cujs_boundaries.sql | 10 +- .../metrics/sql/android/jank/frames.sql | 2 +- .../sql/android/jank/internal/counters.sql | 83 +- .../sql/android/jank/relevant_slices.sql | 23 +- .../sql/android/java_heap_histogram.sql | 35 +- .../sql/android/wattson_app_startup_rails.sql | 8 +- .../android/wattson_app_startup_threads.sql | 8 +- .../sql/android/wattson_atrace_apps_rails.sql | 8 +- .../android/wattson_atrace_apps_threads.sql | 8 +- .../sql/android/wattson_markers_rails.sql | 8 +- .../sql/android/wattson_markers_threads.sql | 4 +- .../sql/android/wattson_rail_relations.sql | 7 + .../sql/android/wattson_tasks_attribution.sql | 6 + .../sql/android/wattson_trace_rails.sql | 8 +- .../sql/android/wattson_trace_threads.sql | 8 +- .../perfetto_sql/engine/created_function.cc | 206 +- .../perfetto_sql/engine/created_function.h | 30 +- .../engine/perfetto_sql_engine.cc | 100 +- .../perfetto_sql/engine/perfetto_sql_engine.h | 284 +- .../generator/structured_query_generator.cc | 160 +- .../grammar/perfettosql_grammar.c | 6125 +++++++++-------- .../grammar/perfettosql_grammar.h | 335 +- .../grammar/perfettosql_grammar.y | 341 +- .../grammar/perfettosql_grammar_interface.h | 8 + .../grammar/perfettosql_include.y | 7 +- .../grammar/perfettosql_keywordhash.h | 434 +- .../intrinsics/functions/BUILD.gn | 4 + .../perfetto_sql/intrinsics/functions/args.cc | 240 + .../perfetto_sql/intrinsics/functions/args.h | 65 + .../intrinsics/functions/base64.cc | 67 +- .../intrinsics/functions/clock_functions.h | 298 +- .../intrinsics/functions/counter_intervals.cc | 2 +- .../intrinsics/functions/create_function.cc | 105 +- .../intrinsics/functions/create_function.h | 36 +- .../functions/create_view_function.cc | 75 +- .../functions/create_view_function.h | 22 +- .../intrinsics/functions/graph_scan.cc | 6 +- .../intrinsics/functions/graph_traversal.cc | 4 +- .../intrinsics/functions/import.cc | 43 +- .../intrinsics/functions/import.h | 34 +- .../functions/interval_intersect.cc | 2 +- .../intrinsics/functions/layout_functions.cc | 4 +- .../intrinsics/functions/layout_functions.h | 2 - .../perfetto_sql/intrinsics/functions/math.cc | 108 +- .../intrinsics/functions/pprof_functions.cc | 21 +- .../intrinsics/functions/pprof_functions.h | 2 - .../functions/replace_numbers_function.cc | 122 +- .../functions/replace_numbers_function.h | 13 +- .../intrinsics/functions/stack_functions.cc | 240 +- .../intrinsics/functions/stack_functions.h | 8 +- .../functions/structural_tree_partition.cc | 3 + .../intrinsics/functions/symbolize.cc | 8 +- .../intrinsics/functions/to_ftrace.cc | 38 +- .../intrinsics/functions/to_ftrace.h | 23 +- .../intrinsics/functions/type_builders.cc | 71 +- .../perfetto_sql/intrinsics/functions/utils.h | 508 +- .../intrinsics/functions/window_functions.h | 6 +- .../intrinsics/operators/BUILD.gn | 30 +- .../operators/etm_decode_trace_vtable.cc | 346 +- .../operators/etm_decode_trace_vtable.h | 4 +- .../table_functions/connected_flow.cc | 58 +- .../table_functions/connected_flow.h | 25 +- .../experimental_flamegraph.cc | 5 +- .../perfetto_sql/intrinsics/types/counter.h | 4 + .../parser/perfetto_sql_parser.cc | 46 +- .../perfetto_sql/parser/perfetto_sql_parser.h | 3 + .../preprocessor/preprocessor_grammar.c | 139 +- .../perfetto_sql/stdlib/android/anrs.sql | 202 +- .../perfetto_sql/stdlib/android/binder.sql | 12 +- .../perfetto_sql/stdlib/android/bitmaps.sql | 24 +- .../perfetto_sql/stdlib/android/cpu/BUILD.gn | 5 +- .../stdlib/android/cpu/cpu_per_uid.sql | 98 + .../android/critical_blocking_calls.sql | 1 + .../perfetto_sql/stdlib/android/cujs/BUILD.gn | 5 +- .../android/cujs/sysui_cuj_counters.sql | 110 - .../stdlib/android/cujs/sysui_cujs.sql | 131 +- .../stdlib/android/frames/jank_type.sql | 13 + .../stdlib/android/kernel_wakelocks.sql | 44 +- .../stdlib/android/memory/dmabuf.sql | 29 + .../stdlib/android/memory/heap_graph/BUILD.gn | 1 + .../memory/heap_graph/class_relationship.sql | 63 + .../android/memory/heap_graph/class_tree.sql | 16 +- .../heap_graph_class_aggregation.sql | 4 +- .../stdlib/android/network_packets.sql | 163 + .../android/startup/startup_breakdowns.sql | 4 +- .../stdlib/android/surfaceflinger.sql | 126 + .../perfetto_sql/stdlib/android/suspend.sql | 13 +- .../perfetto_sql/stdlib/android/thread.sql | 71 +- .../stdlib/android/winscope/viewcapture.sql | 41 +- .../stdlib/android/winscope/windowmanager.sql | 55 +- .../stdlib/appleos/instruments/samples.sql | 5 + .../stdlib/callstacks/stack_profile.sql | 21 +- .../stdlib/counters/intervals.sql | 25 +- .../perfetto_sql/stdlib/export/to_svg.sql | 1524 ++-- .../perfetto_sql/stdlib/graphs/scan.sql | 8 +- .../stdlib/intervals/intersect.sql | 23 +- .../stdlib/linux/cpu/utilization/BUILD.gn | 1 + .../stdlib/linux/cpu/utilization/process.sql | 78 +- .../stdlib/linux/cpu/utilization/slice.sql | 3 + .../stdlib/linux/cpu/utilization/system.sql | 98 +- .../stdlib/linux/cpu/utilization/thread.sql | 83 +- .../linux/cpu/utilization/thread_cpu.sql | 108 + .../perfetto_sql/stdlib/linux/devfreq.sql | 9 +- .../perfetto_sql/stdlib/linux/perf/BUILD.gn | 5 +- .../perfetto_sql/stdlib/linux/perf/etm.sql | 18 +- .../stdlib/linux/perf/samples.sql | 2 + .../stdlib/prelude/after_eof/BUILD.gn | 6 + .../stdlib/prelude/after_eof/core.sql | 44 + .../stdlib/prelude/after_eof/counters.sql | 322 + .../prelude/after_eof/cpu_scheduling.sql | 199 + .../stdlib/prelude/after_eof/events.sql | 340 + .../stdlib/prelude/after_eof/memory.sql | 204 + .../stdlib/prelude/after_eof/tables_views.sql | 1227 +--- .../stdlib/prelude/after_eof/tracks.sql | 244 + .../stdlib/prelude/after_eof/views.sql | 4 +- .../stdlib/sched/time_in_state.sql | 6 + .../perfetto_sql/stdlib/slices/BUILD.gn | 1 + .../perfetto_sql/stdlib/slices/self_dur.sql | 42 + .../stdlib/stacks/cpu_profiling.sql | 1 + .../perfetto_sql/stdlib/v8/jit.sql | 7 + .../perfetto_sql/stdlib/viz/flamegraph.sql | 18 +- .../perfetto_sql/stdlib/viz/slices.sql | 17 +- .../stdlib/viz/summary/track_event.sql | 1 + .../perfetto_sql/stdlib/wattson/BUILD.gn | 11 +- .../stdlib/wattson/cpu/arm_dsu.sql | 54 + .../stdlib/wattson/cpu/estimates.sql | 180 +- .../stdlib/wattson/cpu/freq_idle.sql | 3 +- .../perfetto_sql/stdlib/wattson/cpu/idle.sql | 80 +- .../perfetto_sql/stdlib/wattson/cpu/pivot.sql | 283 +- .../stdlib/wattson/cpu/w_cpu_dependence.sql | 62 - .../stdlib/wattson/cpu/w_dsu_dependence.sql | 118 - .../stdlib/wattson/curves/device_cpu.sql | 927 --- .../stdlib/wattson/curves/device_cpu_1d.sql | 119 + .../stdlib/wattson/curves/device_cpu_2d.sql | 555 ++ .../stdlib/wattson/curves/device_l3.sql | 432 ++ .../stdlib/wattson/curves/tg5_cpu_1d.sql | 96 + .../stdlib/wattson/curves/tg5_cpu_2d.sql | 502 ++ .../stdlib/wattson/curves/tg5_cpu_2d_1.sql | 580 ++ .../stdlib/wattson/curves/tg5_cpu_2d_2.sql | 579 ++ .../stdlib/wattson/curves/tg5_l3.sql | 489 ++ .../stdlib/wattson/curves/utils.sql | 177 +- .../stdlib/wattson/device_infos.sql | 100 +- .../stdlib/wattson/gpu/freq_idle.sql | 2 - .../tasks/idle_transitions_attribution.sql | 16 + .../wattson/ui/continuous_estimates.sql | 26 +- .../perfetto_sql/stdlib/wattson/utils.sql | 5 + .../tokenizer/sqlite_tokenizer.cc | 5 +- .../perfetto_sql/tokenizer/sqlite_tokenizer.h | 2 +- .../tokenizer/tokenize_internal.c | 72 +- .../tokenizer/tokenize_internal_helper.h | 3 + .../read_trace_integrationtest.cc | 2 +- .../perfetto/src/trace_processor/rpc/httpd.cc | 20 +- .../perfetto/src/trace_processor/rpc/httpd.h | 15 +- .../perfetto/src/trace_processor/rpc/rpc.cc | 17 + .../perfetto/src/trace_processor/rpc/rpc.h | 2 + .../src/trace_processor/rpc/stdiod.cc | 11 +- .../perfetto/src/trace_processor/rpc/stdiod.h | 11 +- .../src/trace_processor/sorter/BUILD.gn | 9 - .../trace_processor/sorter/trace_sorter.cc | 335 +- .../src/trace_processor/sorter/trace_sorter.h | 438 +- .../sqlite/bindings/sqlite_value.h | 12 + .../trace_processor/sqlite/sqlite_engine.cc | 19 +- .../src/trace_processor/sqlite/sqlite_utils.h | 22 + .../src/trace_processor/storage/stats.h | 34 +- .../trace_processor/storage/trace_storage.h | 89 +- .../src/trace_processor/tables/etm_tables.py | 26 +- .../trace_processor/tables/metadata_tables.py | 63 + .../trace_processor/tables/profiler_tables.py | 62 + .../src/trace_processor/tables/v8_tables.py | 21 +- .../trace_processor/tables/winscope_tables.py | 180 +- .../trace_database_integrationtest.cc | 7 +- .../trace_processor_context.cc | 267 +- .../trace_processor/trace_processor_impl.cc | 384 +- .../trace_processor/trace_processor_impl.h | 10 +- .../trace_processor/trace_processor_shell.cc | 338 +- .../trace_processor_storage_impl.cc | 94 +- .../trace_processor_storage_impl.h | 15 +- .../trace_processor/trace_reader_registry.cc | 7 +- .../trace_processor/trace_reader_registry.h | 13 +- .../trace_processor/trace_summary/BUILD.gn | 9 + .../trace_processor/trace_summary/summary.cc | 401 +- .../trace_summary/summary_integrationtest.cc | 285 + .../src/trace_processor/types/BUILD.gn | 1 + .../src/trace_processor/types/gfp_flags.cc | 2 +- .../src/trace_processor/types/gfp_flags.h | 4 +- .../types/trace_processor_context.h | 299 +- .../types/trace_processor_context_ptr.h | 67 + .../src/trace_processor/util/BUILD.gn | 82 + .../src/trace_processor/util/args_utils.cc | 183 + .../src/trace_processor/util/args_utils.h | 95 + .../trace_processor/util/clock_synchronizer.h | 722 ++ .../{importers => util}/elf/BUILD.gn | 2 +- .../{importers => util}/elf/binary_info.cc | 9 +- .../{importers => util}/elf/binary_info.h | 6 +- .../{importers => util}/elf/elf.h | 6 +- .../{importers/json => util}/json_parser.h | 39 +- .../{importers/json => util}/json_utils.cc | 4 +- .../{importers/json => util}/json_utils.h | 8 +- .../src/trace_processor/util/json_writer.cc | 265 + .../src/trace_processor/util/json_writer.h | 145 + .../util/proto_to_args_parser.cc | 14 +- .../perfetto/src/trace_processor/util/regex.h | 6 +- .../src/trace_processor/util/tar_writer.cc | 194 + .../src/trace_processor/util/tar_writer.h | 92 + .../trace_processor/{ => util}/trace_blob.cc | 0 .../src/trace_processor/util/trace_type.cc | 87 + .../src/trace_processor/util/trace_type.h | 4 +- .../perfetto/src/trace_redaction/BUILD.gn | 27 +- .../src/trace_redaction/collect_clocks.cc | 130 + .../src/trace_redaction/collect_clocks.h | 65 + .../trace_redaction/populate_allow_lists.cc | 1 + .../src/trace_redaction/prune_perf_events.cc | 136 + .../src/trace_redaction/prune_perf_events.h | 50 + .../prune_perf_events_integrationtest.cc | 127 + .../redactor_clock_converter.cc | 138 + .../redactor_clock_converter.h | 138 + .../trace_processor_integrationtest.cc | 20 - .../trace_redaction_framework.h | 3 + .../trace_redaction_integration_fixture.cc | 20 + .../trace_redaction_integration_fixture.h | 4 + .../src/trace_redaction/trace_redactor.cc | 20 + .../perfetto/src/tracebox/tracebox.cc | 7 +- .../perfetto/src/traceconv/BUILD.gn | 3 + .../perfetto/src/traceconv/main.cc | 126 +- .../perfetto/src/traceconv/pprof_builder.cc | 2 +- .../src/traceconv/symbolize_profile.cc | 5 +- .../perfetto/src/traceconv/trace_to_bundle.cc | 182 + .../perfetto/src/traceconv/trace_to_bundle.h | 45 + .../perfetto/src/traceconv/trace_to_json.cc | 3 +- .../src/traceconv/trace_to_profile.cc | 8 +- .../perfetto/src/traceconv/trace_to_profile.h | 4 +- .../src/traceconv/trace_to_systrace.cc | 18 +- .../perfetto/src/traceconv/trace_to_text.cc | 5 +- .../perfetto/src/traced/probes/BUILD.gn | 2 + .../probes/android_cpu_per_uid/BUILD.gn | 1 + .../android_cpu_per_uid_data_source.cc | 107 +- .../android_cpu_per_uid_data_source.h | 9 +- .../src/traced/probes/common/BUILD.gn | 3 + .../common/android_cpu_per_uid_poller.cc | 130 + .../common/android_cpu_per_uid_poller.h | 55 + .../traced/probes/filesystem/file_scanner.cc | 4 +- .../src/traced/probes/ftrace/cpu_reader.cc | 12 +- .../src/traced/probes/ftrace/cpu_reader.h | 8 +- .../probes/ftrace/cpu_reader_benchmark.cc | 2 +- .../src/traced/probes/ftrace/event_info.cc | 107 + .../probes/ftrace/ftrace_config_muxer.cc | 202 +- .../probes/ftrace/ftrace_config_muxer.h | 18 +- .../traced/probes/ftrace/ftrace_controller.cc | 11 + .../traced/probes/ftrace/ftrace_metadata.h | 16 +- .../src/traced/probes/ftrace/ftrace_stats.cc | 5 + .../src/traced/probes/ftrace/ftrace_stats.h | 3 + .../probes/ftrace/predefined_tracepoints.cc | 15 +- .../probes/ftrace/predefined_tracepoints.h | 5 +- .../probes/ftrace/proto_translation_table.cc | 41 +- .../probes/ftrace/proto_translation_table.h | 25 +- .../drm_sched_job_add_dep/format | 14 + .../gpu_scheduler/drm_sched_job_done/format | 12 + .../gpu_scheduler/drm_sched_job_queue/format | 17 + .../gpu_scheduler/drm_sched_job_run/format | 17 + .../drm_sched_job_unschedulable/format | 14 + .../src/traced/probes/ftrace/tracefs.cc | 39 + .../src/traced/probes/ftrace/tracefs.h | 6 + .../probes/ftrace/tracefs_integrationtest.cc | 102 +- .../probes/ftrace/vendor_tracepoints.cc | 18 +- .../traced/probes/ftrace/vendor_tracepoints.h | 4 +- .../src/traced/probes/packages_list/BUILD.gn | 1 + .../packages_list_data_source.cc | 166 +- .../packages_list/packages_list_data_source.h | 31 +- .../probes/power/android_power_data_source.cc | 15 + .../probes/power/android_power_data_source.h | 3 + .../perfetto/src/traced/probes/probes.cc | 4 +- .../src/traced/probes/probes_producer.cc | 28 +- .../src/traced/probes/probes_producer.h | 2 +- .../probes/ps/process_stats_data_source.cc | 17 + .../probes/ps/process_stats_data_source.h | 2 + .../probes/sys_stats/sys_stats_data_source.cc | 20 +- .../src/traced/probes/user_list/BUILD.gn | 60 + .../probes/user_list/user_list_data_source.cc | 101 + .../probes/user_list/user_list_data_source.h | 65 + .../probes/user_list/user_list_parser.cc | 49 + .../probes/user_list/user_list_parser.h} | 18 +- .../perfetto/src/traced/service/service.cc | 4 +- .../src/traced_relay/relay_service_main.cc | 4 +- .../core/shared_memory_arbiter_impl.cc | 75 +- .../tracing/core/shared_memory_arbiter_impl.h | 17 +- .../tracing/internal/tracing_muxer_impl.cc | 6 +- .../tracing/internal/track_event_internal.cc | 23 +- .../ipc/consumer/consumer_ipc_client_impl.cc | 21 +- .../ipc/service/consumer_ipc_service.cc | 4 + .../perfetto/src/tracing/service/BUILD.gn | 5 +- .../src/tracing/service/trace_buffer.h | 721 +- .../{trace_buffer.cc => trace_buffer_v1.cc} | 90 +- .../src/tracing/service/trace_buffer_v1.h | 714 ++ .../tracing/service/tracing_service_impl.cc | 244 +- .../tracing/service/tracing_service_impl.h | 19 +- .../src/tracing/test/api_integrationtest.cc | 138 +- .../src/tracing/test/mock_consumer.cc | 25 +- .../src/tracing/test/mock_producer.cc | 47 +- .../perfetto/src/tracing/tracing.cc | 2 +- .../third_party/perfetto/src/tracing/track.cc | 17 +- .../src/websocket_bridge/websocket_bridge.cc | 4 +- naiveproxy/src/third_party/protobuf/BUILD.gn | 46 +- .../third_party/protobuf/proto_library.gni | 22 +- .../third_party/protobuf/proto_sources.gni | 2 + .../third_party/protobuf/src/file_lists.cmake | 368 +- .../protobuf/src/google/protobuf/BUILD.bazel | 116 +- .../protobuf/src/google/protobuf/any.h | 1 - .../protobuf/src/google/protobuf/any.pb.cc | 49 +- .../protobuf/src/google/protobuf/any.pb.h | 46 +- .../protobuf/src/google/protobuf/api.pb.cc | 406 +- .../protobuf/src/google/protobuf/api.pb.h | 336 +- .../protobuf/src/google/protobuf/api.proto | 24 +- .../protobuf/src/google/protobuf/arena.h | 31 +- .../src/google/protobuf/arenaz_sampler.cc | 2 +- .../src/google/protobuf/compiler/BUILD.bazel | 6 +- .../protobuf/compiler/annotation_test_util.cc | 8 +- .../protobuf/compiler/annotation_test_util.h | 11 +- .../google/protobuf/compiler/code_generator.h | 24 +- .../compiler/command_line_interface.cc | 91 +- .../compiler/command_line_interface.h | 10 + .../compiler/command_line_interface_tester.cc | 39 +- .../compiler/command_line_interface_tester.h | 10 + .../google/protobuf/compiler/cpp/BUILD.bazel | 16 +- .../google/protobuf/compiler/cpp/extension.cc | 85 +- .../src/google/protobuf/compiler/cpp/field.cc | 23 +- .../src/google/protobuf/compiler/cpp/field.h | 6 +- .../protobuf/compiler/cpp/field_chunk.cc | 29 +- .../protobuf/compiler/cpp/field_chunk.h | 10 +- .../cpp/field_generators/cord_field.cc | 1 + .../cpp/field_generators/map_field.cc | 4 + .../cpp/field_generators/message_field.cc | 7 +- .../cpp/field_generators/primitive_field.cc | 10 +- .../cpp/field_generators/string_field.cc | 15 +- .../cpp/field_generators/string_view_field.cc | 109 +- .../src/google/protobuf/compiler/cpp/file.cc | 12 +- .../google/protobuf/compiler/cpp/generator.cc | 258 +- .../google/protobuf/compiler/cpp/generator.h | 17 +- .../google/protobuf/compiler/cpp/helpers.cc | 147 +- .../google/protobuf/compiler/cpp/helpers.h | 52 +- .../google/protobuf/compiler/cpp/message.cc | 510 +- .../google/protobuf/compiler/cpp/message.h | 16 +- .../compiler/cpp/message_layout_helper.cc | 173 +- .../compiler/cpp/message_layout_helper.h | 71 +- .../google/protobuf/compiler/cpp/options.h | 13 +- .../compiler/cpp/parse_function_generator.cc | 118 +- .../compiler/cpp/parse_function_generator.h | 15 +- .../cpp/test_bad_identifiers_proto2.proto | 6 + .../cpp/tools/analyze_profile_proto.cc | 6 +- .../cpp/tools/analyze_profile_proto_main.cc | 48 +- .../google/protobuf/compiler/cpp/tracker.cc | 31 +- .../google/protobuf/compiler/cpp/unittest.inc | 2 +- .../compiler/csharp/csharp_generator.h | 4 +- .../src/google/protobuf/compiler/importer.cc | 6 +- .../src/google/protobuf/compiler/importer.h | 22 +- .../google/protobuf/compiler/java/BUILD.bazel | 44 +- .../protobuf/compiler/java/doc_comment.cc | 10 +- .../protobuf/compiler/java/doc_comment.h | 2 +- .../src/google/protobuf/compiler/java/file.cc | 36 +- .../protobuf/compiler/java/full/BUILD.bazel | 7 + .../protobuf/compiler/java/full/enum_field.cc | 2 - .../protobuf/compiler/java/full/message.cc | 34 - .../protobuf/compiler/java/full/message.h | 1 - .../compiler/java/full/message_field.cc | 7 +- .../compiler/java/full/message_field.h | 8 +- .../google/protobuf/compiler/java/generator.h | 5 +- .../protobuf/compiler/java/generator_common.h | 1 - .../google/protobuf/compiler/java/helpers.cc | 18 +- .../google/protobuf/compiler/java/helpers.h | 1 + .../compiler/java/java_features.pb.cc | 84 +- .../protobuf/compiler/java/java_features.pb.h | 63 +- .../protobuf/compiler/java/lite/BUILD.bazel | 4 + .../google/protobuf/compiler/java/lite/enum.h | 6 +- .../protobuf/compiler/java/lite/enum_field.cc | 27 +- .../protobuf/compiler/java/lite/enum_field.h | 6 +- .../protobuf/compiler/java/lite/extension.h | 6 +- .../protobuf/compiler/java/lite/map_field.h | 6 +- .../protobuf/compiler/java/lite/message.h | 6 +- .../compiler/java/lite/message_builder.h | 6 +- .../compiler/java/lite/message_field.cc | 2 - .../compiler/java/lite/message_field.h | 6 +- .../compiler/java/lite/primitive_field.h | 6 +- .../compiler/java/lite/string_field.cc | 3 +- .../compiler/java/lite/string_field.h | 6 +- .../compiler/java/message_serialization.h | 1 + .../protobuf/compiler/java/name_resolver.cc | 110 +- .../protobuf/compiler/java/name_resolver.h | 29 +- .../google/protobuf/compiler/java/names.cc | 36 +- .../src/google/protobuf/compiler/java/names.h | 22 + .../google/protobuf/compiler/java/options.h | 7 +- .../protobuf/compiler/kotlin/BUILD.bazel | 2 + .../protobuf/compiler/kotlin/generator.cc | 1 + .../protobuf/compiler/kotlin/generator.h | 4 +- .../protobuf/compiler/kotlin/message.cc | 12 +- .../google/protobuf/compiler/kotlin/message.h | 1 + .../protobuf/compiler/objectivec/generator.cc | 2 +- .../protobuf/compiler/objectivec/generator.h | 6 +- .../src/google/protobuf/compiler/parser.cc | 11 +- .../protobuf/compiler/php/php_generator.cc | 33 +- .../protobuf/compiler/php/php_generator.h | 10 +- .../src/google/protobuf/compiler/plugin.pb.cc | 262 +- .../src/google/protobuf/compiler/plugin.pb.h | 190 +- .../src/google/protobuf/compiler/plugin.proto | 4 +- .../protobuf/compiler/python/generator.h | 4 +- .../protobuf/compiler/python/pyi_generator.cc | 61 +- .../protobuf/compiler/python/pyi_generator.h | 4 +- .../protobuf/compiler/release/BUILD.bazel | 15 + .../protobuf/compiler/ruby/ruby_generator.h | 4 +- .../google/protobuf/compiler/rust/BUILD.bazel | 44 +- .../compiler/rust/accessors/repeated_field.cc | 20 +- .../compiler/rust/accessors/singular_cord.cc | 26 +- .../rust/accessors/singular_message.cc | 66 +- .../rust/accessors/singular_scalar.cc | 42 +- .../rust/accessors/singular_string.cc | 26 +- .../compiler/rust/accessors/with_presence.cc | 12 +- .../google/protobuf/compiler/rust/context.h | 17 + .../src/google/protobuf/compiler/rust/enum.cc | 31 +- .../src/google/protobuf/compiler/rust/enum.h | 4 +- .../protobuf/compiler/rust/generator.cc | 13 +- .../google/protobuf/compiler/rust/generator.h | 4 +- .../src/google/protobuf/compiler/rust/main.cc | 14 + .../google/protobuf/compiler/rust/message.cc | 816 +-- .../google/protobuf/compiler/rust/message.h | 3 +- .../google/protobuf/compiler/rust/naming.cc | 15 + .../google/protobuf/compiler/rust/naming.h | 4 + .../google/protobuf/compiler/rust/oneof.cc | 1 + .../protobuf/compiler/rust/upb_helpers.cc | 7 + .../protobuf/compiler/rust/upb_helpers.h | 8 +- .../src/google/protobuf/compiler/scc.h | 8 + .../compiler/test_plugin_injection.bzl | 4 +- .../src/google/protobuf/compiler/versions.h | 8 +- .../src/google/protobuf/cpp_features.pb.cc | 52 +- .../src/google/protobuf/cpp_features.pb.h | 31 +- .../src/google/protobuf/cpp_features.proto | 2 +- .../src/google/protobuf/descriptor.cc | 114 +- .../protobuf/src/google/protobuf/descriptor.h | 113 +- .../src/google/protobuf/descriptor.pb.cc | 2614 +++---- .../src/google/protobuf/descriptor.pb.h | 2241 +++--- .../src/google/protobuf/descriptor.proto | 8 +- .../src/google/protobuf/duration.pb.cc | 39 +- .../src/google/protobuf/duration.pb.h | 14 +- .../src/google/protobuf/dynamic_message.cc | 64 +- .../google/protobuf/edition_unittest.proto | 137 +- .../protobuf/src/google/protobuf/empty.pb.cc | 2 +- .../protobuf/src/google/protobuf/empty.pb.h | 17 +- .../src/google/protobuf/extension_set.cc | 267 +- .../src/google/protobuf/extension_set.h | 338 +- .../google/protobuf/extension_set_heavy.cc | 2 +- .../src/google/protobuf/extension_set_inl.h | 160 +- .../src/google/protobuf/feature_resolver.cc | 38 +- .../src/google/protobuf/feature_resolver.h | 8 +- .../src/google/protobuf/field_mask.pb.cc | 24 +- .../src/google/protobuf/field_mask.pb.h | 6 +- .../google/protobuf/generated_enum_util.cc | 4 +- .../protobuf/generated_message_reflection.cc | 178 +- .../protobuf/generated_message_reflection.h | 25 +- .../protobuf/generated_message_tctable_decl.h | 1 + .../protobuf/generated_message_tctable_gen.cc | 44 +- .../protobuf/generated_message_tctable_gen.h | 26 +- .../protobuf/generated_message_tctable_impl.h | 27 +- .../generated_message_tctable_lite.cc | 167 +- .../google/protobuf/generated_message_util.h | 19 +- .../google/protobuf/implicit_weak_message.cc | 2 + .../google/protobuf/inlined_string_field.h | 2 +- .../protobuf/internal_feature_helper.cc | 28 + .../google/protobuf/internal_feature_helper.h | 109 + .../google/protobuf/internal_options.proto | 35 + .../src/google/protobuf/io/BUILD.bazel | 5 +- .../src/google/protobuf/io/coded_stream.cc | 17 +- .../src/google/protobuf/io/coded_stream.h | 33 +- .../src/google/protobuf/io/gzip_stream.cc | 30 +- .../src/google/protobuf/io/printer.cc | 34 +- .../protobuf/src/google/protobuf/io/printer.h | 71 +- .../protobuf/io/test_zero_copy_stream.h | 72 +- .../src/google/protobuf/io/tokenizer.h | 21 +- .../google/protobuf/io/zero_copy_stream.cc | 11 +- .../protobuf/io/zero_copy_stream_impl_lite.cc | 2 +- .../src/google/protobuf/json/BUILD.bazel | 4 - .../json/internal/descriptor_traits.h | 34 +- .../google/protobuf/json/internal/parser.cc | 40 +- .../google/protobuf/json/internal/unparser.cc | 10 +- .../protobuf/json/internal/unparser_traits.h | 11 +- .../protobuf/json/internal/untyped_message.cc | 13 +- .../protobuf/json/internal/untyped_message.h | 16 +- .../google/protobuf/late_loaded_option.proto | 2 +- .../protobuf/late_loaded_option_user.proto | 4 +- .../protobuf/src/google/protobuf/map.h | 19 +- .../protobuf/src/google/protobuf/map_field.cc | 90 +- .../protobuf/src/google/protobuf/map_field.h | 151 +- .../google/protobuf/map_proto3_unittest.proto | 4 +- .../protobuf/src/google/protobuf/map_test.inc | 48 +- .../src/google/protobuf/map_unittest.proto | 5 +- .../protobuf/src/google/protobuf/message.cc | 21 +- .../protobuf/src/google/protobuf/message.h | 107 +- .../src/google/protobuf/message_lite.cc | 42 +- .../src/google/protobuf/message_lite.h | 80 +- .../src/google/protobuf/message_unittest.inc | 32 +- .../protobuf/message_unittest_legacy_apis.inc | 6 +- .../src/google/protobuf/micro_string.cc | 50 +- .../src/google/protobuf/micro_string.h | 72 +- .../google/protobuf/only_one_enum_test.proto | 2 +- .../src/google/protobuf/parse_context.cc | 86 +- .../src/google/protobuf/parse_context.h | 86 +- .../protobuf/src/google/protobuf/port.h | 297 +- .../protobuf/src/google/protobuf/port_def.inc | 19 +- .../src/google/protobuf/port_undef.inc | 1 + .../src/google/protobuf/reflection_ops.cc | 13 +- .../src/google/protobuf/reflection_tester.cc | 192 +- .../src/google/protobuf/reflection_tester.h | 4 + .../protobuf/reflection_visit_field_info.h | 32 +- .../google/protobuf/reflection_visit_fields.h | 43 +- .../src/google/protobuf/repeated_field.h | 77 +- .../src/google/protobuf/repeated_ptr_field.cc | 31 +- .../src/google/protobuf/repeated_ptr_field.h | 335 +- .../src/google/protobuf/runtime_version.h | 2 +- .../protobuf/sample_messages_edition.proto | 59 +- .../src/google/protobuf/serial_arena.h | 23 +- .../src/google/protobuf/source_context.pb.cc | 32 +- .../src/google/protobuf/source_context.pb.h | 22 +- .../protobuf/src/google/protobuf/struct.pb.cc | 107 +- .../protobuf/src/google/protobuf/struct.pb.h | 32 +- .../src/google/protobuf/stubs/BUILD.bazel | 6 - .../src/google/protobuf/stubs/common.h | 2 +- .../protobuf/src/google/protobuf/stubs/port.h | 7 - .../protobuf/test_messages_proto2.proto | 3 + .../protobuf/test_messages_proto3.proto | 3 + .../protobuf/src/google/protobuf/test_util.h | 80 +- .../src/google/protobuf/text_format.cc | 77 +- .../src/google/protobuf/text_format.h | 6 +- .../src/google/protobuf/timestamp.pb.cc | 39 +- .../src/google/protobuf/timestamp.pb.h | 14 +- .../protobuf/src/google/protobuf/type.pb.cc | 375 +- .../protobuf/src/google/protobuf/type.pb.h | 254 +- .../protobuf/src/google/protobuf/type.proto | 24 + .../src/google/protobuf/unittest.proto | 78 + .../src/google/protobuf/unittest_arena.proto | 2 +- .../unittest_custom_options_unlinked.proto | 37 + .../google/protobuf/unittest_delimited.proto | 6 +- .../protobuf/unittest_delimited_import.proto | 4 +- .../unittest_drop_unknown_fields.proto | 2 +- .../protobuf/unittest_import_option.proto | 31 + .../protobuf/unittest_lazy_dependencies.proto | 2 +- ...test_lazy_dependencies_custom_option.proto | 2 +- .../unittest_lazy_dependencies_enum.proto | 4 +- .../protobuf/unittest_legacy_features.proto | 8 +- .../protobuf/unittest_no_field_presence.proto | 20 +- .../unittest_preserve_unknown_enum.proto | 6 +- .../unittest_preserve_unknown_enum2.proto | 4 +- .../google/protobuf/unittest_redaction.proto | 2 +- .../protobuf/unittest_string_type.proto | 4 +- .../protobuf/unittest_string_view.proto | 6 +- .../src/google/protobuf/unknown_field_set.h | 24 +- .../src/google/protobuf/util/BUILD.bazel | 10 + .../google/protobuf/util/internal_timeval.h | 28 + .../protobuf/util/message_differencer.cc | 47 +- .../src/google/protobuf/util/python/README.md | 6 + .../protobuf/util/python/field_mask_util.clif | 24 + .../protobuf/util/python/field_mask_util.py | 57 + .../util/python/field_mask_util_clif_aux.cc | 31 + .../util/python/field_mask_util_clif_aux.h | 32 + .../util/python/field_mask_util_test.py | 168 + .../util/python/testdata/test_messages.proto | 18 + .../src/google/protobuf/util/time_util.cc | 13 +- .../src/google/protobuf/util/time_util.h | 20 +- .../src/google/protobuf/wire_format.cc | 24 +- .../src/google/protobuf/wire_format.h | 1 + .../src/google/protobuf/wire_format_lite.h | 30 + ...at_unittest.inc => wire_format_unittest.h} | 1055 +-- .../src/google/protobuf/wrappers.pb.cc | 216 +- .../src/google/protobuf/wrappers.pb.h | 82 +- .../third_party/utf8_range/BUILD.bazel | 2 + .../third_party/utf8_range/utf8_range.c | 12 +- .../utf8_range/utf8_range_neon.inc | 2 +- .../third_party/utf8_range/utf8_range_sse.inc | 2 +- naiveproxy/src/third_party/simdutf/BUILD.gn | 8 +- .../src/third_party/zlib/README.chromium | 8 +- .../src/third_party/zlib/adler32_simd.c | 3 + .../test/data/create_symlink_test_zips.py | 9 + .../test/data/symlink_follow_own_link_dir.zip | Bin 0 -> 298 bytes .../zlib/google/test_data.filelist | 1 + naiveproxy/src/third_party/zlib/google/zip.cc | 22 + .../src/third_party/zstd/README.chromium | 3 +- .../.github/workflows/android-ndk-build.yml | 15 +- .../src/.github/workflows/cmake-tests.yml | 153 + .../zstd/src/.github/workflows/commit.yml | 6 +- .../src/.github/workflows/dev-long-tests.yml | 79 +- .../src/.github/workflows/dev-short-tests.yml | 150 +- .../zstd/src/.github/workflows/nightly.yml | 2 +- .../workflows/publish-release-artifacts.yml | 2 +- .../src/.github/workflows/release_check.yml | 4 +- .../zstd/src/.github/workflows/scorecards.yml | 4 +- .../.github/workflows/windows-artifacts.yml | 138 +- .../src/third_party/zstd/src/CONTRIBUTING.md | 7 +- naiveproxy/src/third_party/zstd/src/Makefile | 5 +- naiveproxy/src/third_party/zstd/src/README.md | 10 +- .../zstd/src/build/cmake/CMakeLists.txt | 245 +- .../AddZstdCompilationFlags.cmake | 6 +- .../build/cmake/CMakeModules/ZstdBuild.cmake | 42 + .../cmake/CMakeModules/ZstdDependencies.cmake | 30 + .../cmake/CMakeModules/ZstdOptions.cmake | 68 + .../cmake/CMakeModules/ZstdPackage.cmake | 42 + .../cmake/CMakeModules/ZstdVersion.cmake | 31 + .../zstd/src/build/cmake/lib/CMakeLists.txt | 4 +- .../zstd/src/build/meson/lib/meson.build | 4 + .../zstd/src/build/meson/meson.build | 3 +- .../contrib/externalSequenceProducer/main.c | 5 +- .../src/contrib/largeNbDicts/largeNbDicts.c | 2 + .../zstd/src/contrib/premake/zstd.lua | 1 + .../seekable_format/tests/seekable_tests.c | 12 + .../src/third_party/zstd/src/lib/Makefile | 14 +- .../src/third_party/zstd/src/lib/README.md | 22 +- .../zstd/src/lib/common/compiler.h | 23 + .../zstd/src/lib/common/threading.c | 18 +- .../zstd/src/lib/common/zstd_internal.h | 2 +- .../third_party/zstd/src/lib/compress/hist.c | 261 +- .../third_party/zstd/src/lib/compress/hist.h | 4 + .../zstd/src/lib/compress/zstd_compress.c | 541 +- .../zstd/src/lib/compress/zstd_lazy.c | 44 +- .../zstd/src/lib/compress/zstd_opt.c | 12 +- .../zstd/src/lib/compress/zstdmt_compress.c | 29 +- .../zstd/src/lib/decompress/huf_decompress.c | 90 +- .../src/lib/decompress/huf_decompress_amd64.S | 200 +- .../lib/decompress/zstd_decompress_block.c | 127 +- .../zstd/src/lib/dictBuilder/cover.c | 12 +- .../src/lib/dll/example/build_package.bat | 33 +- .../third_party/zstd/src/lib/install_oses.mk | 17 + .../zstd/src/lib/legacy/zstd_v01.c | 2 +- .../zstd/src/lib/legacy/zstd_v03.c | 2 +- .../zstd/src/lib/legacy/zstd_v04.c | 2 +- .../zstd/src/lib/legacy/zstd_v05.c | 2 +- .../zstd/src/lib/legacy/zstd_v06.c | 2 +- .../src/third_party/zstd/src/lib/libzstd.mk | 5 +- .../third_party/zstd/src/programs/Makefile | 16 +- .../third_party/zstd/src/programs/README.md | 2 +- .../src/third_party/zstd/src/programs/dibio.c | 11 +- .../src/third_party/zstd/src/programs/util.c | 1 + .../src/third_party/zstd/src/programs/zstd.1 | 2 +- .../third_party/zstd/src/programs/zstd.1.md | 2 +- .../third_party/zstd/src/programs/zstdcli.c | 25 +- .../zstd/src/programs/zstdcli_trace.c | 3 +- .../src/third_party/zstd/src/tests/bigdict.c | 133 - .../tests/cli-tests/basic/help.sh.stdout.glob | 2 +- .../zstd/src/tests/cli-tests/run.py | 2 +- .../third_party/zstd/src/tests/fullbench.c | 1 + .../zstd/src/tests/largeDictionary.c | 33 +- .../src/third_party/zstd/src/tests/legacy.c | 2 + .../third_party/zstd/src/tests/longmatch.c | 55 +- .../zstd/src/tests/regression/method.c | 6 +- naiveproxy/src/tools/cfi/ignores.txt | 7 +- naiveproxy/src/tools/clang/scripts/update.py | 63 +- .../grit/tool/update_resource_ids/assigner.py | 2 +- naiveproxy/src/tools/grit/pak_util.py | 7 +- .../src/tools/gritsettings/resource_ids.spec | 91 +- .../gritsettings/translation_expectations.pyl | 7 +- .../tools/ubsan/array_bounds_ignorelist.txt | 22 + naiveproxy/src/tools/ubsan/ignorelist.txt | 48 + .../src/tools/ubsan/security_ignorelist.txt | 53 + .../src/tools/ubsan/vptr_ignorelist.txt | 128 + .../src/tools/win/DebugVisualizers/BUILD.gn | 6 + .../tools/win/DebugVisualizers/absl.natvis | 35 + .../tools/win/DebugVisualizers/chrome.natvis | 125 +- naiveproxy/src/url/OWNERS | 1 - naiveproxy/src/url/README.md | 13 + naiveproxy/src/url/features.gni | 6 +- naiveproxy/src/url/gurl.cc | 84 +- naiveproxy/src/url/gurl.h | 65 +- naiveproxy/src/url/ipc/BUILD.gn | 1 - naiveproxy/src/url/ipc/url_param_traits.cc | 4 - naiveproxy/src/url/ipc/url_param_traits.h | 5 +- naiveproxy/src/url/origin.cc | 4 +- naiveproxy/src/url/origin.h | 15 + naiveproxy/src/url/scheme_host_port.cc | 12 +- naiveproxy/src/url/scheme_host_port.h | 6 + .../url/third_party/mozilla/README.chromium | 10 +- .../src/url/third_party/mozilla/url_parse.cc | 61 +- .../src/url/third_party/mozilla/url_parse.h | 13 +- naiveproxy/src/url/url_canon.h | 161 +- naiveproxy/src/url/url_canon_etc.cc | 88 +- naiveproxy/src/url/url_canon_filesystemurl.cc | 46 +- naiveproxy/src/url/url_canon_fileurl.cc | 127 +- naiveproxy/src/url/url_canon_host.cc | 116 +- naiveproxy/src/url/url_canon_internal.cc | 25 +- naiveproxy/src/url/url_canon_internal.h | 12 +- naiveproxy/src/url/url_canon_ip.cc | 72 +- naiveproxy/src/url/url_canon_ip.h | 123 +- .../src/url/url_canon_non_special_url.cc | 50 +- naiveproxy/src/url/url_canon_relative.cc | 215 +- naiveproxy/src/url/url_canon_stdurl.cc | 38 +- naiveproxy/src/url/url_features.cc | 15 +- naiveproxy/src/url/url_features.h | 8 +- naiveproxy/src/url/url_idna_icu.cc | 14 +- naiveproxy/src/url/url_parse_internal.h | 48 +- naiveproxy/src/url/url_util.cc | 277 +- naiveproxy/src/url/url_util.h | 71 +- naiveproxy/src/url/url_util_internal.h | 6 +- naiveproxy/tools/include.txt | 5 +- .../resources/view/passwall/popper.min.js | 6 - .../view/passwall/cbi/nodes_listvalue.htm | 20 +- .../view/passwall/cbi/nodes_listvalue_com.htm | 211 +- .../luasrc/view/passwall/global/footer.htm | 17 +- small/gn/Makefile | 6 +- small/gn/src/out/last_commit_position.h | 4 +- .../htdocs/luci-static/resources/fchomo.js | 74 +- .../resources/view/fchomo/client.js | 378 +- .../luci-static/resources/view/fchomo/node.js | 104 +- .../resources/view/fchomo/ruleset.js | 50 +- .../etc/homeproxy/resources/china_ip4.txt | 283 +- .../etc/homeproxy/resources/china_ip4.ver | 2 +- .../etc/homeproxy/resources/china_ip6.txt | 326 +- .../etc/homeproxy/resources/china_ip6.ver | 2 +- .../etc/homeproxy/resources/china_list.txt | 420 +- .../etc/homeproxy/resources/china_list.ver | 2 +- .../root/etc/homeproxy/resources/gfw_list.txt | 41 +- .../root/etc/homeproxy/resources/gfw_list.ver | 2 +- .../resources/view/passwall/popper.min.js | 6 - .../view/passwall/cbi/nodes_listvalue.htm | 20 +- .../view/passwall/cbi/nodes_listvalue_com.htm | 211 +- .../luasrc/view/passwall/global/footer.htm | 17 +- .../luci-app-ssr-plus/root/usr/bin/ssr-rules | 362 +- small/sing-box/Makefile | 4 +- v2raya/service/core/serverObj/trojan.go | 10 +- xray-core/proxy/wireguard/client.go | 8 +- yt-dlp/yt_dlp/extractor/parti.py | 36 +- 5059 files changed, 192386 insertions(+), 93334 deletions(-) delete mode 100644 naiveproxy/src/base/allocator/miracle_parameter.cc delete mode 100644 naiveproxy/src/base/allocator/miracle_parameter.h create mode 100644 naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/stack_allocated.h delete mode 100644 naiveproxy/src/base/android/android_hardware_buffer_compat.cc delete mode 100644 naiveproxy/src/base/android/android_hardware_buffer_compat.h create mode 100644 naiveproxy/src/base/android/android_info_stub.cc create mode 100644 naiveproxy/src/base/android/apk_info_stub.cc delete mode 100644 naiveproxy/src/base/android/build_info.cc delete mode 100644 naiveproxy/src/base/android/build_info.h create mode 100644 naiveproxy/src/base/android/device_info_stub.cc delete mode 100644 naiveproxy/src/base/android/jank_metric_uma_recorder.cc delete mode 100644 naiveproxy/src/base/android/jank_metric_uma_recorder.h delete mode 100644 naiveproxy/src/base/android/jni_onload.h rename naiveproxy/src/{third_party/ashmem => base/android/linker}/ashmem-dev.c (62%) rename naiveproxy/src/{third_party/ashmem => base/android/linker}/ashmem.h (90%) create mode 100644 naiveproxy/src/base/android/scoped_service_binding_batch.cc create mode 100644 naiveproxy/src/base/android/scoped_service_binding_batch.h create mode 100644 naiveproxy/src/base/android/sys_utils.h create mode 100644 naiveproxy/src/base/android/sys_utils_stub.cc create mode 100644 naiveproxy/src/base/byte_count.cc create mode 100644 naiveproxy/src/base/byte_size.cc create mode 100644 naiveproxy/src/base/byte_size.h create mode 100644 naiveproxy/src/base/byte_size_nocompile.nc create mode 100644 naiveproxy/src/base/containers/adapters_nocompile_cpp23.nc create mode 100644 naiveproxy/src/base/containers/variant_map.cc create mode 100644 naiveproxy/src/base/containers/variant_map.h create mode 100644 naiveproxy/src/base/memory/memory_pressure_level.h create mode 100644 naiveproxy/src/base/memory/memory_pressure_listener_registry.cc create mode 100644 naiveproxy/src/base/memory/memory_pressure_listener_registry.h create mode 100644 naiveproxy/src/base/memory/mock_memory_pressure_listener.cc create mode 100644 naiveproxy/src/base/memory/mock_memory_pressure_listener.h create mode 100644 naiveproxy/src/base/memory_coordinator/memory_consumer_registry_destruction_observer.h create mode 100644 naiveproxy/src/base/metrics/field_trial_entry.cc create mode 100644 naiveproxy/src/base/metrics/field_trial_entry.h delete mode 100644 naiveproxy/src/base/native_library.cc create mode 100644 naiveproxy/src/base/protobuf_hardening_test_support.proto create mode 100644 naiveproxy/src/base/synchronization/lock_metrics_recorder.cc create mode 100644 naiveproxy/src/base/synchronization/lock_metrics_recorder.h create mode 100644 naiveproxy/src/base/task/execution_fence.cc create mode 100644 naiveproxy/src/base/task/execution_fence.h create mode 100644 naiveproxy/src/base/test/metrics/action_variants_reader.cc create mode 100644 naiveproxy/src/base/test/metrics/action_variants_reader.h delete mode 100644 naiveproxy/src/base/test/native_library_test_utils.cc delete mode 100644 naiveproxy/src/base/test/native_library_test_utils.h create mode 100644 naiveproxy/src/base/test/scoped_libc_timezone_override.cc create mode 100644 naiveproxy/src/base/test/scoped_libc_timezone_override.h create mode 100644 naiveproxy/src/base/tracing/protos/chrome_enums.proto delete mode 100644 naiveproxy/src/base/types/always_false.h create mode 100644 naiveproxy/src/base/win/delayload_helpers.h delete mode 100644 naiveproxy/src/build/android/amd64/module.modulemap delete mode 100644 naiveproxy/src/build/android/gyp/finalize_apk.py create mode 100644 naiveproxy/src/build/android/location_rewriter/BUILD.gn create mode 100644 naiveproxy/src/build/config/apple/apple_sdk.gni create mode 100644 naiveproxy/src/build/config/apple/arch.gni create mode 100644 naiveproxy/src/build/config/avx512.gni create mode 100644 naiveproxy/src/build/config/ios/ios_app_ipa.gni create mode 100755 naiveproxy/src/build/config/ios/package_ipa.py create mode 100644 naiveproxy/src/build/config/squid/BUILD.gn create mode 100644 naiveproxy/src/build/config/squid/README.md create mode 100644 naiveproxy/src/build/config/squid/buildflags.gni delete mode 100644 naiveproxy/src/build/linux/amd64/module.modulemap mode change 100644 => 100755 naiveproxy/src/build/linux/dump_app_syms.py create mode 100644 naiveproxy/src/build/modules/android-arm/BUILD.gn create mode 100644 naiveproxy/src/build/modules/android-arm/module.modulemap.in create mode 100644 naiveproxy/src/build/modules/android-arm64/BUILD.gn create mode 100644 naiveproxy/src/build/modules/android-arm64/module.modulemap.in create mode 100644 naiveproxy/src/build/modules/android-x64/BUILD.gn create mode 100644 naiveproxy/src/build/modules/android-x64/module.modulemap.in create mode 100644 naiveproxy/src/build/modules/android-x86/BUILD.gn create mode 100644 naiveproxy/src/build/modules/android-x86/module.modulemap.in create mode 100644 naiveproxy/src/build/modules/fuchsia/BUILD.gn create mode 100644 naiveproxy/src/build/modules/fuchsia/module.modulemap.in delete mode 100644 naiveproxy/src/build/modules/linux-x64/module.modulemap create mode 100644 naiveproxy/src/build/modules/linux-x64/module.modulemap.in create mode 100644 naiveproxy/src/build/modules/linux/BUILD.gn create mode 100644 naiveproxy/src/build/modules/linux/module.modulemap.in create mode 100644 naiveproxy/src/build/modules/mac_xcode2600/BUILD.gn create mode 100644 naiveproxy/src/build/modules/modularize/OWNERS create mode 100644 naiveproxy/src/build/modules/modularize/README.md create mode 100644 naiveproxy/src/build/modules/modularize/modulemap.py create mode 100644 naiveproxy/src/build/modules/modularize/modulemap_test.py create mode 100644 naiveproxy/src/build/modules/modularize/platforms.py create mode 100644 naiveproxy/src/build/modules/modularize/testdata/Frameworks/nested.framework/Frameworks/submodule.framework/Headers/other.h rename naiveproxy/src/{net/ntlm/OWNERS => build/modules/modularize/testdata/Frameworks/nested.framework/Frameworks/submodule.framework/Headers/umbrella.h} (100%) rename naiveproxy/src/{third_party/llvm-libc/src/test/src/sys/resource/testdata/CMakeLists.txt => build/modules/modularize/testdata/Frameworks/nested.framework/Headers/nested.h} (100%) create mode 100644 naiveproxy/src/build/modules/modularize/testdata/Frameworks/nested.framework/Modules/module.modulemap create mode 100644 naiveproxy/src/build/modules/modularize/testdata/Frameworks/simple.framework/Headers/simple.h create mode 100644 naiveproxy/src/build/modules/modularize/testdata/Frameworks/simple.framework/Modules/module.modulemap create mode 100644 naiveproxy/src/build/modules/modularize/testdata/Frameworks/umbrella.framework/Headers/first.h create mode 100644 naiveproxy/src/build/modules/modularize/testdata/Frameworks/umbrella.framework/Headers/second.h create mode 100644 naiveproxy/src/build/modules/modularize/testdata/Frameworks/umbrella.framework/Modules/module.modulemap create mode 100644 naiveproxy/src/build/modules/modularize/testdata/sysroot/first.h create mode 100644 naiveproxy/src/build/modules/modularize/testdata/sysroot/first/first.h create mode 100644 naiveproxy/src/build/modules/modularize/testdata/sysroot/first_textual.h rename naiveproxy/src/build/modules/modularize/testdata/{module.modulemap => sysroot/importable.modulemap} (63%) create mode 100644 naiveproxy/src/build/modules/modularize/testdata/sysroot/module.modulemap create mode 100644 naiveproxy/src/build/modules/modularize/testdata/sysroot/second.h create mode 100644 naiveproxy/src/build/modules/modularize/testdata/sysroot/second_textual.h create mode 100644 naiveproxy/src/build/modules/modularize/testdata/sysroot/subdir/module.modulemap create mode 100644 naiveproxy/src/build/modules/modularize/testdata/sysroot/subdir/subdir.h create mode 100644 naiveproxy/src/build/modules/win-x64/BUILD.gn create mode 100644 naiveproxy/src/build/modules/win-x64/module.modulemap.in create mode 100644 naiveproxy/src/build/rust/gni_impl/rustc_print_cfg.gni create mode 100755 naiveproxy/src/build/rust/gni_impl/rustc_print_cfg.py delete mode 100644 naiveproxy/src/build/toolchain/cros/cros_config.gni delete mode 100755 naiveproxy/src/build/toolchain/cros/get_resource_dir.py create mode 100644 naiveproxy/src/components/cbor/BUILD.gn create mode 100644 naiveproxy/src/components/cbor/DIR_METADATA create mode 100644 naiveproxy/src/components/cbor/OWNERS create mode 100644 naiveproxy/src/components/cbor/cbor_export.h create mode 100644 naiveproxy/src/components/cbor/constants.h create mode 100644 naiveproxy/src/components/cbor/diagnostic_writer.cc create mode 100644 naiveproxy/src/components/cbor/diagnostic_writer.h create mode 100644 naiveproxy/src/components/cbor/float_conversions.cc create mode 100644 naiveproxy/src/components/cbor/float_conversions.h create mode 100644 naiveproxy/src/components/cbor/reader.cc create mode 100644 naiveproxy/src/components/cbor/reader.h create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor0 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor1 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor10 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor11 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor12 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor13 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor14 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor15 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor16 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor17 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor18 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor19 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor2 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor20 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor21 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor22 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor23 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor24 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor25 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor26 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor27 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor28 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor29 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor3 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor30 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor31 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor32 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor33 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor34 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor35 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor36 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor37 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor38 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor39 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor4 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor40 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor41 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor42 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor43 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor44 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor45 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor46 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor47 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor48 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor49 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor5 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor50 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor51 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor52 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor53 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor54 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor55 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor56 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor57 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor58 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor59 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor6 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor60 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor61 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor62 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor63 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor64 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor65 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor66 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor67 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor68 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor69 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor7 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor70 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor71 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor72 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor73 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor74 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor75 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor76 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor77 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor78 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor79 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor8 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor80 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor81 create mode 100644 naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor9 create mode 100644 naiveproxy/src/components/cbor/values.cc create mode 100644 naiveproxy/src/components/cbor/values.h create mode 100644 naiveproxy/src/components/cbor/writer.cc create mode 100644 naiveproxy/src/components/cbor/writer.h delete mode 100644 naiveproxy/src/components/miracle_parameter/COMMON_METADATA delete mode 100644 naiveproxy/src/components/miracle_parameter/OWNERS delete mode 100644 naiveproxy/src/components/miracle_parameter/README.md delete mode 100644 naiveproxy/src/components/miracle_parameter/common/BUILD.gn delete mode 100644 naiveproxy/src/components/miracle_parameter/common/public/miracle_parameter.cc delete mode 100644 naiveproxy/src/components/miracle_parameter/common/public/miracle_parameter.h create mode 100644 naiveproxy/src/components/unexportable_keys/mock_unexportable_key_provider.cc create mode 100644 naiveproxy/src/components/unexportable_keys/mock_unexportable_key_provider.h delete mode 100644 naiveproxy/src/crypto/apple/keychain_seckeychain.cc delete mode 100644 naiveproxy/src/crypto/apple/keychain_seckeychain.h rename naiveproxy/src/crypto/{ => apple}/scoped_lacontext.h (87%) rename naiveproxy/src/crypto/{ => apple}/scoped_lacontext.mm (88%) create mode 100644 naiveproxy/src/crypto/apple/security_framework_lock.cc create mode 100644 naiveproxy/src/crypto/apple/security_framework_lock.h rename naiveproxy/src/crypto/{ => apple}/unexportable_key_mac.h (93%) rename naiveproxy/src/crypto/{ => apple}/unexportable_key_mac.mm (88%) create mode 100644 naiveproxy/src/crypto/cose.cc create mode 100644 naiveproxy/src/crypto/cose.h create mode 100644 naiveproxy/src/crypto/ecdsa_utils.cc create mode 100644 naiveproxy/src/crypto/ecdsa_utils.h create mode 100644 naiveproxy/src/crypto/kex.cc create mode 100644 naiveproxy/src/crypto/kex.h delete mode 100644 naiveproxy/src/crypto/mac_security_services_lock.cc delete mode 100644 naiveproxy/src/crypto/mac_security_services_lock.h create mode 100644 naiveproxy/src/crypto/obsolete/sha1.cc create mode 100644 naiveproxy/src/crypto/obsolete/sha1.h create mode 100644 naiveproxy/src/crypto/pem.cc create mode 100644 naiveproxy/src/crypto/pem.h delete mode 100644 naiveproxy/src/crypto/rsa_private_key.cc delete mode 100644 naiveproxy/src/crypto/rsa_private_key.h create mode 100644 naiveproxy/src/crypto/test/data/not-pem.txt create mode 100644 naiveproxy/src/crypto/test/data/one-message.pem create mode 100644 naiveproxy/src/crypto/test/data/plain-text.txt create mode 100644 naiveproxy/src/crypto/test/data/three-messages.pem delete mode 100644 naiveproxy/src/ipc/ipc_param_traits.h create mode 100644 naiveproxy/src/net/base/mock_proxy_delegate.cc create mode 100644 naiveproxy/src/net/base/mock_proxy_delegate.h create mode 100644 naiveproxy/src/net/base/proxy_delegate.cc create mode 100644 naiveproxy/src/net/base/url_search_params_view.cc create mode 100644 naiveproxy/src/net/base/url_search_params_view.h create mode 100644 naiveproxy/src/net/base/url_unescape_iterator.cc create mode 100644 naiveproxy/src/net/base/url_unescape_iterator.h create mode 100644 naiveproxy/src/net/device_bound_sessions/registration_result.cc create mode 100644 naiveproxy/src/net/device_bound_sessions/registration_result.h create mode 100644 naiveproxy/src/net/device_bound_sessions/url_fetcher.cc create mode 100644 naiveproxy/src/net/device_bound_sessions/url_fetcher.h create mode 100644 naiveproxy/src/net/disk_cache/sql/eviction_candidate_aggregator.cc create mode 100644 naiveproxy/src/net/disk_cache/sql/eviction_candidate_aggregator.h create mode 100644 naiveproxy/src/net/disk_cache/sql/indexed_pair_set.h create mode 100644 naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend.cc create mode 100644 naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend.h create mode 100644 naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend_shard.cc create mode 100644 naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend_shard.h create mode 100644 naiveproxy/src/net/disk_cache/sql/sql_persistent_store_in_memory_index.cc create mode 100644 naiveproxy/src/net/disk_cache/sql/sql_persistent_store_in_memory_index.h create mode 100644 naiveproxy/src/net/dns/filtering_details_url_generator.cc create mode 100644 naiveproxy/src/net/dns/filtering_details_url_generator.h create mode 100644 naiveproxy/src/net/dns/platform_dns_query_executor_android.cc create mode 100644 naiveproxy/src/net/dns/platform_dns_query_executor_android.h create mode 100644 naiveproxy/src/net/proxy_resolution/proxy_resolution_service.cc create mode 100644 naiveproxy/src/net/socket/socket_apple.cc create mode 100644 naiveproxy/src/net/socket/socket_apple.h create mode 100644 naiveproxy/src/net/ssl/client_cert_store_empty.cc create mode 100644 naiveproxy/src/net/ssl/client_cert_store_empty.h delete mode 100644 naiveproxy/src/net/third_party/nss/DIR_METADATA delete mode 100644 naiveproxy/src/net/third_party/nss/LICENSE delete mode 100644 naiveproxy/src/net/third_party/nss/OWNERS delete mode 100644 naiveproxy/src/net/third_party/nss/README.chromium delete mode 100644 naiveproxy/src/net/third_party/nss/ssl/cmpcert.cc delete mode 100644 naiveproxy/src/net/third_party/nss/ssl/cmpcert.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_tracing_hooks.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/direct_task_bundle.cc create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/direct_task_bundle.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/task_bundle.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_chunk_handler.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_definitions.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_datagram_frame.cc create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_datagram_frame.h delete mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_message_frame.cc delete mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_message_frame.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_connection_migration_manager.cc create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_connection_migration_manager.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_with_migration.cc create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_with_migration.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_force_blockable_packet_writer.cc create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_force_blockable_packet_writer.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_path_context_factory.h delete mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_cached_object.h delete mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_failed_fetch.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_fetch_task.h rename naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/{moqt_cached_object.cc => moqt_object.cc} (88%) create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_object.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_publisher.cc create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_publisher.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_track_publisher.cc create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_track_publisher.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_trace_recorder.cc create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_trace_recorder.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/relay_namespace_tree.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/session_namespace_tree.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/mock_moqt_session.h rename naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/{tools => test_tools}/moqt_mock_visitor.h (64%) create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_simulator.cc create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_simulator.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_relay.cc create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_relay.h create mode 100644 naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_relay_bin.cc delete mode 100644 naiveproxy/src/net/websockets/websocket_handshake_constants.cc delete mode 100644 naiveproxy/src/third_party/abseil-cpp/absl/base/internal/identity.h create mode 100644 naiveproxy/src/third_party/abseil-cpp/absl/base/internal/nullability_traits.h create mode 100644 naiveproxy/src/third_party/abseil-cpp/absl/log/log_entry.cc create mode 100644 naiveproxy/src/third_party/abseil-cpp/absl/strings/resize_and_overwrite.h create mode 100644 naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.cc create mode 100644 naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.h create mode 100644 naiveproxy/src/third_party/abseil-cpp/symbols_arm64_dbg_cxx23.def create mode 100644 naiveproxy/src/third_party/abseil-cpp/symbols_arm64_rel_cxx23.def create mode 100644 naiveproxy/src/third_party/abseil-cpp/symbols_x64_dbg_cxx23.def create mode 100644 naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel_asan_cxx23.def create mode 100644 naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel_cxx23.def create mode 100644 naiveproxy/src/third_party/abseil-cpp/symbols_x86_dbg_cxx23.def create mode 100644 naiveproxy/src/third_party/abseil-cpp/symbols_x86_rel_cxx23.def delete mode 100644 naiveproxy/src/third_party/ashmem/BUILD.gn delete mode 100644 naiveproxy/src/third_party/ashmem/DIR_METADATA delete mode 100644 naiveproxy/src/third_party/ashmem/LICENSE delete mode 100644 naiveproxy/src/third_party/ashmem/OWNERS delete mode 100644 naiveproxy/src/third_party/ashmem/README.chromium delete mode 100644 naiveproxy/src/third_party/ashmem/patches/0001-Add-ashmem-get-prot-region.patch delete mode 100644 naiveproxy/src/third_party/ashmem/patches/0002-Use-ASharedMemory-functions-when-possible.patch delete mode 100644 naiveproxy/src/third_party/ashmem/patches/0003-Pthread-once-for-funcs-init.patch delete mode 100644 naiveproxy/src/third_party/ashmem/patches/0004-Fixup-ashmem_get_prot_region-for-memfd.patch delete mode 100644 naiveproxy/src/third_party/ashmem/patches/0005-Fix-ashmem-availability-check.patch create mode 100644 naiveproxy/src/third_party/boringssl/src/PRESUBMIT.py delete mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/evp/p_dh_asn1.cc rename naiveproxy/src/third_party/boringssl/src/crypto/evp/{p_dsa_asn1.cc => p_dsa.cc} (83%) delete mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ec_asn1.cc delete mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ed25519_asn1.cc create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/evp/p_mldsa.cc delete mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/evp/p_rsa_asn1.cc delete mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/evp/p_x25519_asn1.cc create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/entropy/internal.h create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/entropy/jitter.cc.inc create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/entropy/sha512.cc.inc create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/test/der_trailing_data.cc create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/test/der_trailing_data.h create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/x509/test/make_unusual_tbs.go create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/x509/test/rsa_pss_sha256_key.pk8 create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_critical_ber.pem create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_critical_false_not_omitted.pem create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_empty_extension_not_omitted.pem create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_key.pem create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_null_sigalg_param.pem create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_uid_both.pem create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_uid_issuer.pem create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_uid_subject.pem create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_v1_not_omitted.pem create mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_wrong_attribute_order.pem delete mode 100644 naiveproxy/src/third_party/boringssl/src/crypto/x509/x_val.cc delete mode 100644 naiveproxy/src/third_party/boringssl/src/include/openssl/bcm_public.h delete mode 100644 naiveproxy/src/third_party/boringssl/src/include/openssl/experimental/kyber.h create mode 100644 naiveproxy/src/third_party/libc++/src/include/__atomic/floating_point_helper.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__cxx03/complex.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__cxx03/ctype.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__cxx03/errno.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__cxx03/fenv.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__cxx03/float.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__cxx03/inttypes.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__cxx03/stdbool.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__cxx03/stddef.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__cxx03/stdio.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__cxx03/tgmath.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__cxx03/wctype.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__fwd/map.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__tuple/make_tuple_types.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__tuple/tuple_like_ext.h delete mode 100644 naiveproxy/src/third_party/libc++/src/include/__type_traits/can_extract_key.h create mode 100644 naiveproxy/src/third_party/libc++/src/include/__type_traits/is_generic_transparent_comparator.h rename naiveproxy/src/third_party/libc++/src/include/{__fwd/set.h => __type_traits/is_unqualified.h} (60%) create mode 100644 naiveproxy/src/third_party/libc++/src/include/__type_traits/make_transparent.h create mode 100644 naiveproxy/src/third_party/libc++/src/include/__utility/default_three_way_comparator.h create mode 100644 naiveproxy/src/third_party/libc++/src/include/__utility/lazy_synth_three_way_comparator.h create mode 100644 naiveproxy/src/third_party/libc++/src/include/__utility/try_key_extraction.h create mode 100755 naiveproxy/src/third_party/libc++/src/utils/benchmark-historical create mode 100755 naiveproxy/src/third_party/libc++/src/utils/build-at-commit delete mode 100755 naiveproxy/src/third_party/libc++/src/utils/cat_files.py create mode 100755 naiveproxy/src/third_party/libc++/src/utils/compare-benchmarks create mode 100755 naiveproxy/src/third_party/libc++/src/utils/consolidate-benchmarks create mode 100755 naiveproxy/src/third_party/libc++/src/utils/find-rerun-candidates delete mode 100755 naiveproxy/src/third_party/libc++/src/utils/libcxx-benchmark-json delete mode 100755 naiveproxy/src/third_party/libc++/src/utils/libcxx-compare-benchmarks create mode 100755 naiveproxy/src/third_party/libc++/src/utils/parse-google-benchmark-results create mode 100755 naiveproxy/src/third_party/libc++/src/utils/parse-spec-results create mode 100644 naiveproxy/src/third_party/libc++/src/utils/requirements.txt create mode 100755 naiveproxy/src/third_party/libc++/src/utils/test-at-commit create mode 100755 naiveproxy/src/third_party/libc++/src/utils/visualize-historical create mode 100644 naiveproxy/src/third_party/libunwind/src/test/aarch64_vg_unwind.pass.cpp create mode 100644 naiveproxy/src/third_party/libunwind/src/test/eh_frame_fde_pc_range.pass.cpp delete mode 100644 naiveproxy/src/third_party/llvm-libc/src/benchmarks/gpu/BenchmarkLogger.cpp delete mode 100644 naiveproxy/src/third_party/llvm-libc/src/benchmarks/gpu/BenchmarkLogger.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/benchmarks/gpu/Random.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/benchmarks/gpu/src/math/exp_benchmark.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/benchmarks/gpu/src/math/expf16_benchmark.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/benchmarks/gpu/src/math/expf_benchmark.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/benchmarks/gpu/src/math/log_benchmark.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/benchmarks/gpu/src/math/logf16_benchmark.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/benchmarks/gpu/src/math/logf_benchmark.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/cmake/modules/LibcParseArguments.cmake create mode 100644 naiveproxy/src/third_party/llvm-libc/src/cmake/modules/compiler_features/check_ext_vector_type.cpp delete mode 100644 naiveproxy/src/third_party/llvm-libc/src/config/gpu/amdgpu/config.json rename naiveproxy/src/third_party/llvm-libc/src/config/gpu/{nvptx => }/config.json (84%) create mode 100644 naiveproxy/src/third_party/llvm-libc/src/config/linux/arm/config.json create mode 100644 naiveproxy/src/third_party/llvm-libc/src/config/linux/config.json create mode 100644 naiveproxy/src/third_party/llvm-libc/src/config/linux/riscv/config.json create mode 100644 naiveproxy/src/third_party/llvm-libc/src/hdr/localtime_overlay.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/hdr/types/dl_info.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/hdr/types/struct_rlimit.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-macros/annex-k-macros.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-macros/cfloat128-macros.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-macros/cfloat16-macros.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-macros/netinet-in-macros.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-macros/nl-types-macros.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/Dl_info.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/in_addr.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/in_addr_t.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/int_hk_t.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/int_hr_t.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/int_k_t.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/int_lk_t.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/int_lr_t.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/int_r_t.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/nl_catd.h delete mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/stdfix-types.h delete mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/test_rpc_opcodes_t.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/uint_uhk_t.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/uint_uhr_t.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/uint_uk_t.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/uint_ulk_t.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/uint_ulr_t.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/llvm-libc-types/uint_ur_t.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/netinet/in.h.def create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/netinet/in.yaml create mode 100644 naiveproxy/src/third_party/llvm-libc/src/include/nl_types.yaml create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/cbrtf.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/cos.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/cosf.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/cosf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/coshf.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/coshf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/cospif.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/cospif16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/dsqrtl.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/exp10m1f.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/exp10m1f16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/exp2.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/exp2f.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/exp2f16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/exp2m1f.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/rsqrtf.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/shared/math/rsqrtf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/CPP/simd.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/CPP/tuple.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/GPU/fixedstack.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/OSUtil/linux/auxv.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/cbrtf.h rename naiveproxy/src/third_party/llvm-libc/src/src/{math/generic/common_constants.cpp => __support/math/common_constants.h} (95%) create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/cos.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/cosf.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/cosf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/coshf.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/coshf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/cospif.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/cospif16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/dsqrtl.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/exp10m1f.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/exp10m1f16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/exp2.h rename naiveproxy/src/third_party/llvm-libc/src/src/{math/generic/exp2f_impl.h => __support/math/exp2f.h} (94%) create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/exp2f16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/exp2m1f.h rename naiveproxy/src/third_party/llvm-libc/src/src/{math/generic/expxf16.h => __support/math/expxf16_utils.h} (95%) rename naiveproxy/src/third_party/llvm-libc/src/src/{math/generic => __support/math}/range_reduction.h (95%) rename naiveproxy/src/third_party/llvm-libc/src/src/{math/generic => __support/math}/range_reduction_double_common.h (97%) rename naiveproxy/src/third_party/llvm-libc/src/src/{math/generic => __support/math}/range_reduction_double_fma.h (97%) rename naiveproxy/src/third_party/llvm-libc/src/src/{math/generic => __support/math}/range_reduction_double_nofma.h (97%) rename naiveproxy/src/third_party/llvm-libc/src/src/{math/generic => __support/math}/range_reduction_fma.h (95%) create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/rsqrtf.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/rsqrtf16.h rename naiveproxy/src/third_party/llvm-libc/src/src/{math/generic => __support/math}/sincos_eval.h (98%) rename naiveproxy/src/third_party/llvm-libc/src/src/{math/generic => __support/math}/sincosf16_utils.h (97%) create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/math/sincosf_float_eval.h rename naiveproxy/src/third_party/llvm-libc/src/src/{math/generic => __support/math}/sincosf_utils.h (97%) rename naiveproxy/src/third_party/llvm-libc/src/src/{math/generic/explogxf.h => __support/math/sinhfcoshf_utils.h} (89%) delete mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/__support/threads/linux/callonce.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/arpa/inet/inet_aton.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/arpa/inet/inet_aton.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/dlfcn/dladdr.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/dlfcn/dladdr.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/dlfcn/dlinfo.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/dlfcn/dlinfo.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/asinpif16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/atanpif16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16add.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16addf.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16addf128.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16addl.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16div.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16divf.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16divf128.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16divl.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16fma.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16fmaf.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16fmaf128.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16fmal.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16mul.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16mulf.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16mulf128.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16mull.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16sub.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16subf.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16subf128.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/bf16subl.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/canonicalizebf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/ceilbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/copysignbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/fdimbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/floorbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/fmaxbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/fmaximum_mag_numbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/fmaximum_magbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/fmaximum_numbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/fmaximumbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/fminbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/fminimum_mag_numbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/fminimum_magbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/fminimum_numbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/fminimumbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/fmodbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/frexpbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/fromfpbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/fromfpxbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/asinpif16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/atanpif16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16add.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16addf.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16addf128.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16addl.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16div.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16divf.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16divf128.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16divl.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16fma.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16fmaf.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16fmaf128.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16fmal.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16mul.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16mulf.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16mulf128.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16mull.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16sub.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16subf.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16subf128.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/bf16subl.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/canonicalizebf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/ceilbf16.cpp delete mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/common_constants.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/copysignbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/fdimbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/floorbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/fmaxbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/fmaximum_mag_numbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/fmaximum_magbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/fmaximum_numbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/fmaximumbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/fminbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/fminimum_mag_numbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/fminimum_magbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/fminimum_numbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/fminimumbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/fmodbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/frexpbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/fromfpbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/fromfpxbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/getpayloadbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/ilogbbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/iscanonicalbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/issignalingbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/ldexpbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/llogbbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/llrintbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/llroundbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/log_bf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/logbbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/lrintbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/lroundbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/modfbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/nanbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/nearbyintbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/nextafterbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/nextdownbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/nexttowardbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/nextupbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/remainderbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/remquobf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/rintbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/roundbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/roundevenbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/rsqrtf.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/rsqrtf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/scalblnbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/scalbnbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/setpayloadbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/setpayloadsigbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/sqrtbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/totalorderbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/totalordermagbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/truncbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/ufromfpbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/generic/ufromfpxbf16.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/getpayloadbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/ilogbbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/iscanonicalbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/issignalingbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/ldexpbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/llogbbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/llrintbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/llroundbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/log_bf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/logbbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/lrintbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/lroundbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/modfbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/nanbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/nearbyintbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/nextafterbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/nextdownbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/nexttowardbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/nextupbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/remainderbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/remquobf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/rintbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/roundbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/roundevenbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/rsqrtf.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/rsqrtf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/scalblnbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/scalbnbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/setpayloadbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/setpayloadsigbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/sqrtbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/totalorderbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/totalordermagbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/truncbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/ufromfpbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/math/ufromfpxbf16.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/nl_types/CMakeLists.txt create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/nl_types/catclose.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/nl_types/catclose.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/nl_types/catgets.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/nl_types/catgets.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/nl_types/catopen.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/nl_types/catopen.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/setjmp/wasm/sigsetjmp.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/stdfix/rdivi.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/stdfix/rdivi.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/string/memory_utils/aarch64/inline_strlen.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/string/memory_utils/generic/inline_strlen.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/string/memory_utils/x86_64/inline_strlen.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/time/baremetal/localtime.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/time/baremetal/localtime_r.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/time/localtime.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/time/localtime.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/time/localtime_r.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/time/localtime_r.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/unistd/faccessat.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/unistd/gethostname.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/unistd/linux/faccessat.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/src/unistd/linux/gethostname.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/startup/baremetal/aarch64/CMakeLists.txt create mode 100644 naiveproxy/src/third_party/llvm-libc/src/startup/baremetal/aarch64/start.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/include/netinet_in_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/integration/src/__support/GPU/fixedstack_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/integration/src/__support/threads/double_exit_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/integration/src/__support/threads/main_exit_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/__support/CPP/simd_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/__support/CPP/tuple_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/arpa/inet/inet_aton_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/RsqrtTest.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/asinpif16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/atanpif16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16add_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16addf128_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16addf_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16addl_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16div_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16divf128_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16divf_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16divl_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16fma_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16fmaf128_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16fmaf_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16fmal_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16mul_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16mulf128_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16mulf_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16mull_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16sub_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16subf128_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16subf_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/bf16subl_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/cosf_float_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/exhaustive/bfloat16_add_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/exhaustive/bfloat16_div_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/exhaustive/bfloat16_mul_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/exhaustive/bfloat16_sub_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/exhaustive/cosf_float_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/exhaustive/fmodbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/exhaustive/rsqrtf_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/exhaustive/sinf_float_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/llrintbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/llroundbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/log_bf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/lrintbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/lroundbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/nearbyintbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/rintbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/rsqrtf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/rsqrtf_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/sinf_float_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/asinpif16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/atanpif16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16add_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16addf128_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16addf_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16addl_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16div_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16divf128_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16divf_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16divl_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16fma_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16fmaf128_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16fmaf_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16fmal_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16mul_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16mulf128_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16mulf_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16mull_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16sub_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16subf128_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16subf_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bf16subl_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bfloat16_add_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bfloat16_div_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bfloat16_mul_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/bfloat16_sub_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/canonicalizebf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/ceilbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/copysignbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/fdimbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/floorbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/fmaxbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/fmaximum_mag_numbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/fmaximum_magbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/fmaximum_numbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/fmaximumbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/fminbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/fminimum_mag_numbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/fminimum_magbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/fminimum_numbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/fminimumbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/fmodbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/frexpbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/fromfpbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/fromfpxbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/getpayloadbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/ilogbbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/iscanonicalbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/issignalingbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/ldexpbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/llogbbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/llrintbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/llroundbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/log_bf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/logbbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/lrintbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/lroundbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/modfbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/nanbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/nearbyintbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/nextafterbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/nextdownbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/nexttowardbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/nextupbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/remquobf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/rintbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/roundbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/roundevenbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/rsqrtf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/rsqrtf_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/scalblnbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/scalbnbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/setpayloadbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/setpayloadsigbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/sqrtbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/totalorderbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/totalordermagbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/truncbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/ufromfpbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/smoke/ufromfpxbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/math/sqrtbf16_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/nl_types/CMakeLists.txt create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/nl_types/nl_types_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/stdfix/DivITest.h create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/stdfix/rdivi_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/time/localtime_r_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/time/localtime_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/unistd/faccessat_test.cpp create mode 100644 naiveproxy/src/third_party/llvm-libc/src/test/src/unistd/gethostname_test.cpp rename naiveproxy/src/third_party/perfetto/gn/{standalone/protoc.py => run_binary.py} (77%) create mode 100644 naiveproxy/src/third_party/perfetto/include/perfetto/ext/base/bits.h create mode 100644 naiveproxy/src/third_party/perfetto/include/perfetto/ext/base/dynamic_string_writer.h rename naiveproxy/src/third_party/perfetto/include/perfetto/ext/base/{string_writer.h => fixed_string_writer.h} (95%) create mode 100644 naiveproxy/src/third_party/perfetto/include/perfetto/ext/base/lock_free_task_runner.h create mode 100644 naiveproxy/src/third_party/perfetto/include/perfetto/ext/base/rt_mutex.h delete mode 100644 naiveproxy/src/third_party/perfetto/include/perfetto/ext/base/threading/channel.h delete mode 100644 naiveproxy/src/third_party/perfetto/include/perfetto/ext/base/threading/future.h delete mode 100644 naiveproxy/src/third_party/perfetto/include/perfetto/ext/base/threading/future_combinators.h delete mode 100644 naiveproxy/src/third_party/perfetto/include/perfetto/ext/base/threading/poll.h delete mode 100644 naiveproxy/src/third_party/perfetto/include/perfetto/ext/base/threading/spawn.h delete mode 100644 naiveproxy/src/third_party/perfetto/include/perfetto/ext/base/threading/stream.h delete mode 100644 naiveproxy/src/third_party/perfetto/include/perfetto/ext/base/threading/stream_combinators.h delete mode 100644 naiveproxy/src/third_party/perfetto/include/perfetto/ext/base/threading/util.h create mode 100644 naiveproxy/src/third_party/perfetto/protos/perfetto/config/android/user_list_config.proto create mode 100644 naiveproxy/src/third_party/perfetto/protos/perfetto/trace/android/user_list.proto create mode 100644 naiveproxy/src/third_party/perfetto/protos/third_party/chromium/chrome_enums.proto create mode 100644 naiveproxy/src/third_party/perfetto/protos/third_party/simpleperf/cmd_report_sample.proto create mode 100644 naiveproxy/src/third_party/perfetto/src/base/lock_free_task_runner.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/base/rt_mutex.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/base/rt_mutex_benchmark.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/base/task_runner_benchmark.cc delete mode 100644 naiveproxy/src/third_party/perfetto/src/base/threading/spawn.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/protozero/descriptor_diff/BUILD.gn create mode 100644 naiveproxy/src/third_party/perfetto/src/protozero/descriptor_diff/descriptor_diff.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/protozero/descriptor_diff/descriptor_diff.h create mode 100644 naiveproxy/src/third_party/perfetto/src/protozero/descriptor_diff/main.cc delete mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event/BUILD.gn create mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event/category_impl.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event/category_impl.h create mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event/category_utils.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event/category_utils.h create mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event/ds.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event/ds.h create mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event/global_state.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event/global_state.h create mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event/hl.cc rename naiveproxy/src/third_party/perfetto/src/shared_lib/{ => track_event}/intern_map.cc (96%) rename naiveproxy/src/third_party/perfetto/src/shared_lib/{ => track_event}/intern_map.h (97%) create mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event/ll.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event/serialization.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event/serialization.h create mode 100644 naiveproxy/src/third_party/perfetto/src/shared_lib/track_event/track_event.cc rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/android_bugreport/{android_dumpstate_event_parser_impl.cc => android_dumpstate_event_parser.cc} (94%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/android_bugreport/{android_dumpstate_event_parser_impl.h => android_dumpstate_event_parser.h} (74%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/android_bugreport/{android_log_event_parser_impl.cc => android_log_event_parser.cc} (85%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/android_bugreport/{android_log_event_parser_impl.h => android_log_event_parser.h} (74%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/art_method/{art_method_parser_impl.cc => art_method_parser.cc} (89%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/art_method/{art_method_parser_impl.h => art_method_parser.h} (80%) create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/common/import_logs_tracker.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/common/import_logs_tracker.h rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/{etm/elf_tracker.cc => common/registered_file_tracker.cc} (51%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/{etm/elf_tracker.h => common/registered_file_tracker.h} (52%) create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/common/symbol_tracker.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/common/symbol_tracker.h delete mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/common/trace_parser.cc delete mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/common/trace_parser.h delete mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/etm/file_tracker.cc delete mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/etm/file_tracker.h rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/gecko/{gecko_trace_parser_impl.cc => gecko_trace_parser.cc} (91%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/gecko/{gecko_trace_parser_impl.h => gecko_trace_parser.h} (67%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/json/{json_trace_parser_impl.cc => json_trace_parser.cc} (84%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/json/{json_trace_parser_impl.h => json_trace_parser.h} (70%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/perf/{perf_session.cc => perf_invocation.cc} (76%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/perf/{perf_session.h => perf_invocation.h} (88%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/perf_text/{perf_text_trace_parser_impl.cc => perf_text_trace_parser.cc} (82%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/importers/perf_text/{perf_text_trace_parser_impl.h => perf_text_trace_parser.h} (77%) create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/pprof/BUILD.gn create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/pprof/pprof_trace_reader.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/pprof/pprof_trace_reader.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/android_cpu_per_uid_module.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/android_cpu_per_uid_module.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/android_cpu_per_uid_state.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/android_cpu_per_uid_state.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/deobfuscation_tracker.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/deobfuscation_tracker.h delete mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/multi_machine_trace_manager.cc delete mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/multi_machine_trace_manager.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/test/windowmanager_sample_protos.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/viewcapture_rect_computation.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/viewcapture_rect_computation.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/viewcapture_test_utils.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/viewcapture_views_extractor.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/viewcapture_views_extractor.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/viewcapture_visibility_computation.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/viewcapture_visibility_computation.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/windowmanager_hierarchy_walker.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/windowmanager_hierarchy_walker.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/windowmanager_parser.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/windowmanager_parser.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/windowmanager_proto_clone.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/windowmanager_proto_clone.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/proto/winscope/winscope_geometry_test_utils.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/simpleperf_proto/BUILD.gn create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/simpleperf_proto/simpleperf_proto_parser.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/simpleperf_proto/simpleperf_proto_parser.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/simpleperf_proto/simpleperf_proto_tokenizer.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/simpleperf_proto/simpleperf_proto_tokenizer.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/importers/simpleperf_proto/simpleperf_proto_tracker.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/metrics/sql/android/jank/android_jank_cuj_init.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/intrinsics/functions/args.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/intrinsics/functions/args.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/android/cpu/cpu_per_uid.sql delete mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/android/cujs/sysui_cuj_counters.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/class_relationship.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/linux/cpu/utilization/thread_cpu.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/core.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/counters.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/cpu_scheduling.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/events.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/memory.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/tracks.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/slices/self_dur.sql delete mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/wattson/cpu/w_cpu_dependence.sql delete mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/wattson/cpu/w_dsu_dependence.sql delete mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/wattson/curves/device_cpu.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/wattson/curves/device_cpu_1d.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/wattson/curves/device_cpu_2d.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/wattson/curves/device_l3.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/wattson/curves/tg5_cpu_1d.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/wattson/curves/tg5_cpu_2d.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/wattson/curves/tg5_cpu_2d_1.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/wattson/curves/tg5_cpu_2d_2.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/perfetto_sql/stdlib/wattson/curves/tg5_l3.sql create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/types/trace_processor_context_ptr.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/util/args_utils.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/util/args_utils.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/util/clock_synchronizer.h rename naiveproxy/src/third_party/perfetto/src/trace_processor/{importers => util}/elf/BUILD.gn (96%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/{importers => util}/elf/binary_info.cc (95%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/{importers => util}/elf/binary_info.h (85%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/{importers => util}/elf/elf.h (96%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/{importers/json => util}/json_parser.h (96%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/{importers/json => util}/json_utils.cc (98%) rename naiveproxy/src/third_party/perfetto/src/trace_processor/{importers/json => util}/json_utils.h (90%) create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/util/json_writer.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/util/json_writer.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/util/tar_writer.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_processor/util/tar_writer.h rename naiveproxy/src/third_party/perfetto/src/trace_processor/{ => util}/trace_blob.cc (100%) create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_redaction/collect_clocks.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_redaction/collect_clocks.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_redaction/prune_perf_events.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_redaction/prune_perf_events.h create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_redaction/prune_perf_events_integrationtest.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_redaction/redactor_clock_converter.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/trace_redaction/redactor_clock_converter.h create mode 100644 naiveproxy/src/third_party/perfetto/src/traceconv/trace_to_bundle.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/traceconv/trace_to_bundle.h create mode 100644 naiveproxy/src/third_party/perfetto/src/traced/probes/common/android_cpu_per_uid_poller.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/traced/probes/common/android_cpu_per_uid_poller.h create mode 100644 naiveproxy/src/third_party/perfetto/src/traced/probes/ftrace/test/data/synthetic/events/gpu_scheduler/drm_sched_job_add_dep/format create mode 100644 naiveproxy/src/third_party/perfetto/src/traced/probes/ftrace/test/data/synthetic/events/gpu_scheduler/drm_sched_job_done/format create mode 100644 naiveproxy/src/third_party/perfetto/src/traced/probes/ftrace/test/data/synthetic/events/gpu_scheduler/drm_sched_job_queue/format create mode 100644 naiveproxy/src/third_party/perfetto/src/traced/probes/ftrace/test/data/synthetic/events/gpu_scheduler/drm_sched_job_run/format create mode 100644 naiveproxy/src/third_party/perfetto/src/traced/probes/ftrace/test/data/synthetic/events/gpu_scheduler/drm_sched_job_unschedulable/format create mode 100644 naiveproxy/src/third_party/perfetto/src/traced/probes/user_list/BUILD.gn create mode 100644 naiveproxy/src/third_party/perfetto/src/traced/probes/user_list/user_list_data_source.cc create mode 100644 naiveproxy/src/third_party/perfetto/src/traced/probes/user_list/user_list_data_source.h create mode 100644 naiveproxy/src/third_party/perfetto/src/traced/probes/user_list/user_list_parser.cc rename naiveproxy/src/third_party/perfetto/src/{base/threading/stream_combinators.cc => traced/probes/user_list/user_list_parser.h} (62%) rename naiveproxy/src/third_party/perfetto/src/tracing/service/{trace_buffer.cc => trace_buffer_v1.cc} (93%) create mode 100644 naiveproxy/src/third_party/perfetto/src/tracing/service/trace_buffer_v1.h create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/compiler/release/BUILD.bazel create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/compiler/rust/main.cc create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/internal_feature_helper.cc create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/internal_feature_helper.h create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/internal_options.proto create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/unittest_custom_options_unlinked.proto create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/unittest_import_option.proto create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/util/internal_timeval.h create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/util/python/README.md create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/util/python/field_mask_util.clif create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/util/python/field_mask_util.py create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/util/python/field_mask_util_clif_aux.cc create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/util/python/field_mask_util_clif_aux.h create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/util/python/field_mask_util_test.py create mode 100644 naiveproxy/src/third_party/protobuf/src/google/protobuf/util/python/testdata/test_messages.proto rename naiveproxy/src/third_party/protobuf/src/google/protobuf/{wire_format_unittest.inc => wire_format_unittest.h} (59%) create mode 100644 naiveproxy/src/third_party/zlib/google/test/data/symlink_follow_own_link_dir.zip create mode 100644 naiveproxy/src/third_party/zstd/src/.github/workflows/cmake-tests.yml create mode 100644 naiveproxy/src/third_party/zstd/src/build/cmake/CMakeModules/ZstdBuild.cmake create mode 100644 naiveproxy/src/third_party/zstd/src/build/cmake/CMakeModules/ZstdDependencies.cmake create mode 100644 naiveproxy/src/third_party/zstd/src/build/cmake/CMakeModules/ZstdOptions.cmake create mode 100644 naiveproxy/src/third_party/zstd/src/build/cmake/CMakeModules/ZstdPackage.cmake create mode 100644 naiveproxy/src/third_party/zstd/src/build/cmake/CMakeModules/ZstdVersion.cmake create mode 100644 naiveproxy/src/third_party/zstd/src/lib/install_oses.mk delete mode 100644 naiveproxy/src/third_party/zstd/src/tests/bigdict.c create mode 100644 naiveproxy/src/tools/ubsan/array_bounds_ignorelist.txt create mode 100644 naiveproxy/src/tools/ubsan/ignorelist.txt create mode 100644 naiveproxy/src/tools/ubsan/security_ignorelist.txt create mode 100644 naiveproxy/src/tools/ubsan/vptr_ignorelist.txt create mode 100644 naiveproxy/src/tools/win/DebugVisualizers/absl.natvis delete mode 100644 openwrt-passwall/luci-app-passwall/htdocs/luci-static/resources/view/passwall/popper.min.js delete mode 100644 small/luci-app-passwall/htdocs/luci-static/resources/view/passwall/popper.min.js diff --git a/.github/update.log b/.github/update.log index 887068f6e6..15e475211f 100644 --- a/.github/update.log +++ b/.github/update.log @@ -1211,3 +1211,4 @@ Update On Wed Dec 10 19:41:17 CET 2025 Update On Thu Dec 11 19:44:07 CET 2025 Update On Fri Dec 12 19:42:07 CET 2025 Update On Sat Dec 13 19:37:32 CET 2025 +Update On Sun Dec 14 19:39:26 CET 2025 diff --git a/clash-meta/common/net/websocket.go b/clash-meta/common/net/websocket.go index b002310a94..c49e60fa05 100644 --- a/clash-meta/common/net/websocket.go +++ b/clash-meta/common/net/websocket.go @@ -1,6 +1,8 @@ package net import ( + "crypto/sha1" + "encoding/base64" "encoding/binary" "math/bits" ) @@ -129,3 +131,13 @@ func MaskWebSocket(key uint32, b []byte) uint32 { return key } + +func GetWebSocketSecAccept(secKey string) string { + const magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" + const nonceSize = 24 // base64.StdEncoding.EncodedLen(nonceKeySize) + p := make([]byte, nonceSize+len(magic)) + copy(p[:nonceSize], secKey) + copy(p[nonceSize:], magic) + sum := sha1.Sum(p) + return base64.StdEncoding.EncodeToString(sum[:]) +} diff --git a/clash-meta/docker/file-name.sh b/clash-meta/docker/file-name.sh index 21cb61efb3..bd09da9572 100644 --- a/clash-meta/docker/file-name.sh +++ b/clash-meta/docker/file-name.sh @@ -13,7 +13,7 @@ case $TARGETPLATFORM in "linux/arm/v7") arch="armv7" ;; - "riscv64") + "linux/riscv64") arch="riscv64" ;; *) @@ -22,4 +22,4 @@ case $TARGETPLATFORM in ;; esac file_name="$os$arch-$(cat bin/version.txt)" -echo $file_name \ No newline at end of file +echo $file_name diff --git a/clash-meta/hub/route/common.go b/clash-meta/hub/route/common.go index d0053e674b..6dd0b40c85 100644 --- a/clash-meta/hub/route/common.go +++ b/clash-meta/hub/route/common.go @@ -1,10 +1,19 @@ package route import ( + "bufio" + "encoding/binary" + "errors" + "io" + "net" "net/http" "net/url" + "strconv" + "strings" + "time" "github.com/go-chi/chi/v5" + N "github.com/metacubex/mihomo/common/net" ) // When name is composed of a partial escape string, Golang does not unescape it @@ -15,3 +24,151 @@ func getEscapeParam(r *http.Request, paramName string) string { } return param } + +// wsUpgrade upgrades http connection to the websocket connection. +// +// It hijacks net.Conn from w and returns received net.Conn and +// bufio.ReadWriter. +func wsUpgrade(r *http.Request, w http.ResponseWriter) (conn net.Conn, rw *bufio.ReadWriter, err error) { + // See https://tools.ietf.org/html/rfc6455#section-4.1 + // The method of the request MUST be GET, and the HTTP version MUST be at least 1.1. + var nonce string + if r.Method != http.MethodGet { + err = errors.New("handshake error: bad HTTP request method") + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(http.StatusMethodNotAllowed) + w.Write([]byte(body)) + return nil, nil, err + } else if r.ProtoMajor < 1 || (r.ProtoMajor == 1 && r.ProtoMinor < 1) { + err = errors.New("handshake error: bad HTTP protocol version") + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(http.StatusHTTPVersionNotSupported) + w.Write([]byte(body)) + return nil, nil, err + } else if r.Host == "" { + err = errors.New("handshake error: bad Host header") + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(body)) + return nil, nil, err + } else if u := r.Header.Get("Upgrade"); u != "websocket" && !strings.EqualFold(u, "websocket") { + err = errors.New("handshake error: bad Upgrade header") + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(body)) + return nil, nil, err + } else if c := r.Header.Get("Connection"); c != "Upgrade" && !strings.Contains(strings.ToLower(c), "upgrade") { + err = errors.New("handshake error: bad Connection header") + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(body)) + return nil, nil, err + } else if nonce = r.Header.Get("Sec-WebSocket-Key"); len(nonce) != 24 { + err = errors.New("handshake error: bad Sec-WebSocket-Key header") + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(body)) + return nil, nil, err + } else if v := r.Header.Get("Sec-WebSocket-Version"); v != "13" { + err = errors.New("handshake error: bad Sec-WebSocket-Version header") + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + if v != "" { + // According to RFC6455: + // If this version does not match a version understood by the server, the + // server MUST abort the WebSocket handshake described in this section and + // instead send an appropriate HTTP error code (such as 426 Upgrade Required) + // and a |Sec-WebSocket-Version| header field indicating the version(s) the + // server is capable of understanding. + w.Header().Set("Sec-WebSocket-Version", "13") + w.WriteHeader(http.StatusUpgradeRequired) + } else { + w.WriteHeader(http.StatusBadRequest) + } + w.Write([]byte(body)) + return nil, nil, err + } + + conn, rw, err = http.NewResponseController(w).Hijack() + if err != nil { + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(body)) + return nil, nil, err + } + + // Clear deadlines set by server. + conn.SetDeadline(time.Time{}) + + rw.Writer.WriteString("HTTP/1.1 101 Switching Protocols\r\n") + header := http.Header{} + header.Set("Upgrade", "websocket") + header.Set("Connection", "Upgrade") + header.Set("Sec-WebSocket-Accept", N.GetWebSocketSecAccept(nonce)) + header.Write(rw.Writer) + rw.Writer.WriteString("\r\n") + err = rw.Writer.Flush() + + return conn, rw, err +} + +// wsWriteServerMessage writes message to w, considering that caller represents server side. +func wsWriteServerMessage(w io.Writer, op byte, p []byte) error { + dataLen := len(p) + + // Make slice of bytes with capacity 14 that could hold any header. + bts := make([]byte, 14) + + bts[0] |= 0x80 //FIN + bts[0] |= 0 << 4 //RSV + bts[0] |= op //OPCODE + + var n int + switch { + case dataLen < 126: + bts[1] = byte(dataLen) + n = 2 + case dataLen < 65536: + bts[1] = 126 + binary.BigEndian.PutUint16(bts[2:4], uint16(dataLen)) + n = 4 + default: + bts[1] = 127 + binary.BigEndian.PutUint64(bts[2:10], uint64(dataLen)) + n = 10 + } + + _, err := w.Write(bts[:n]) + if err != nil { + return err + } + _, err = w.Write(p) + return err +} + +// wsWriteServerText is the same as wsWriteServerMessage with ws.OpText. +func wsWriteServerText(w io.Writer, p []byte) error { + const opText = 0x1 + return wsWriteServerMessage(w, opText, p) +} + +// wsWriteServerBinary is the same as wsWriteServerMessage with ws.OpBinary. +func wsWriteServerBinary(w io.Writer, p []byte) error { + const opBinary = 0x2 + return wsWriteServerMessage(w, opBinary, p) +} diff --git a/clash-meta/hub/route/connections.go b/clash-meta/hub/route/connections.go index e0ff242648..2ae1e885be 100644 --- a/clash-meta/hub/route/connections.go +++ b/clash-meta/hub/route/connections.go @@ -11,8 +11,6 @@ import ( "github.com/go-chi/chi/v5" "github.com/go-chi/render" - "github.com/gobwas/ws" - "github.com/gobwas/ws/wsutil" ) func connectionRouter() http.Handler { @@ -30,7 +28,7 @@ func getConnections(w http.ResponseWriter, r *http.Request) { return } - conn, _, _, err := ws.UpgradeHTTP(r, w) + conn, _, err := wsUpgrade(r, w) if err != nil { return } @@ -56,7 +54,7 @@ func getConnections(w http.ResponseWriter, r *http.Request) { return err } - return wsutil.WriteMessage(conn, ws.StateServerSide, ws.OpText, buf.Bytes()) + return wsWriteServerText(conn, buf.Bytes()) } if err := sendSnapshot(); err != nil { diff --git a/clash-meta/hub/route/server.go b/clash-meta/hub/route/server.go index fe8275304e..27c13f75b1 100644 --- a/clash-meta/hub/route/server.go +++ b/clash-meta/hub/route/server.go @@ -26,8 +26,6 @@ import ( "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "github.com/go-chi/render" - "github.com/gobwas/ws" - "github.com/gobwas/ws/wsutil" "github.com/sagernet/cors" ) @@ -363,7 +361,7 @@ func traffic(w http.ResponseWriter, r *http.Request) { var wsConn net.Conn if r.Header.Get("Upgrade") == "websocket" { var err error - wsConn, _, _, err = ws.UpgradeHTTP(r, w) + wsConn, _, err = wsUpgrade(r, w) if err != nil { return } @@ -396,7 +394,7 @@ func traffic(w http.ResponseWriter, r *http.Request) { _, err = w.Write(buf.Bytes()) w.(http.Flusher).Flush() } else { - err = wsutil.WriteMessage(wsConn, ws.StateServerSide, ws.OpText, buf.Bytes()) + err = wsWriteServerText(wsConn, buf.Bytes()) } if err != nil { @@ -409,7 +407,7 @@ func memory(w http.ResponseWriter, r *http.Request) { var wsConn net.Conn if r.Header.Get("Upgrade") == "websocket" { var err error - wsConn, _, _, err = ws.UpgradeHTTP(r, w) + wsConn, _, err = wsUpgrade(r, w) if err != nil { return } @@ -446,7 +444,7 @@ func memory(w http.ResponseWriter, r *http.Request) { _, err = w.Write(buf.Bytes()) w.(http.Flusher).Flush() } else { - err = wsutil.WriteMessage(wsConn, ws.StateServerSide, ws.OpText, buf.Bytes()) + err = wsWriteServerText(wsConn, buf.Bytes()) } if err != nil { @@ -492,7 +490,7 @@ func getLogs(w http.ResponseWriter, r *http.Request) { var wsConn net.Conn if r.Header.Get("Upgrade") == "websocket" { var err error - wsConn, _, _, err = ws.UpgradeHTTP(r, w) + wsConn, _, err = wsUpgrade(r, w) if err != nil { return } @@ -551,7 +549,7 @@ func getLogs(w http.ResponseWriter, r *http.Request) { _, err = w.Write(buf.Bytes()) w.(http.Flusher).Flush() } else { - err = wsutil.WriteMessage(wsConn, ws.StateServerSide, ws.OpText, buf.Bytes()) + err = wsWriteServerText(wsConn, buf.Bytes()) } if err != nil { diff --git a/clash-meta/transport/vmess/websocket.go b/clash-meta/transport/vmess/websocket.go index 07fb9d6ad1..73b743dab7 100644 --- a/clash-meta/transport/vmess/websocket.go +++ b/clash-meta/transport/vmess/websocket.go @@ -5,7 +5,6 @@ import ( "bytes" "context" "crypto/rand" - "crypto/sha1" "crypto/tls" "encoding/base64" "encoding/binary" @@ -478,7 +477,7 @@ func streamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig, if lenSecAccept := len(secAccept); lenSecAccept != acceptSize { return nil, fmt.Errorf("unexpected Sec-Websocket-Accept length: %d", lenSecAccept) } - if getSecAccept(secKey) != secAccept { + if N.GetWebSocketSecAccept(secKey) != secAccept { return nil, errors.New("unexpected Sec-Websocket-Accept") } } @@ -489,16 +488,6 @@ func streamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig, return N.NewDeadlineConn(conn), nil } -func getSecAccept(secKey string) string { - const magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" - const nonceSize = 24 // base64.StdEncoding.EncodedLen(nonceKeySize) - p := make([]byte, nonceSize+len(magic)) - copy(p[:nonceSize], secKey) - copy(p[nonceSize:], magic) - sum := sha1.Sum(p) - return base64.StdEncoding.EncodeToString(sum[:]) -} - func StreamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig) (net.Conn, error) { if u, err := url.Parse(c.Path); err == nil { if q := u.Query(); q.Get("ed") != "" { @@ -568,7 +557,7 @@ func StreamUpgradedWebsocketConn(w http.ResponseWriter, r *http.Request) (net.Co w.Header().Set("Connection", "upgrade") w.Header().Set("Upgrade", "websocket") if !isRaw { - w.Header().Set("Sec-Websocket-Accept", getSecAccept(r.Header.Get("Sec-WebSocket-Key"))) + w.Header().Set("Sec-Websocket-Accept", N.GetWebSocketSecAccept(r.Header.Get("Sec-WebSocket-Key"))) } w.WriteHeader(http.StatusSwitchingProtocols) if flusher, isFlusher := w.(interface{ FlushError() error }); isFlusher && writeHeaderShouldFlush { diff --git a/hysteria/.github/workflows/master.yml b/hysteria/.github/workflows/master.yml index a4f79cc2b5..8152d13e25 100644 --- a/hysteria/.github/workflows/master.yml +++ b/hysteria/.github/workflows/master.yml @@ -29,7 +29,7 @@ jobs: - uses: nttld/setup-ndk@v1 id: setup-ndk with: - ndk-version: r26b + ndk-version: r29 add-to-path: false - name: Run build script diff --git a/hysteria/.github/workflows/release.yml b/hysteria/.github/workflows/release.yml index 2ada2d453b..847f4f6c2b 100644 --- a/hysteria/.github/workflows/release.yml +++ b/hysteria/.github/workflows/release.yml @@ -33,7 +33,7 @@ jobs: - uses: nttld/setup-ndk@v1 id: setup-ndk with: - ndk-version: r26b + ndk-version: r29 add-to-path: false - name: Run build script diff --git a/mihomo/common/net/websocket.go b/mihomo/common/net/websocket.go index b002310a94..c49e60fa05 100644 --- a/mihomo/common/net/websocket.go +++ b/mihomo/common/net/websocket.go @@ -1,6 +1,8 @@ package net import ( + "crypto/sha1" + "encoding/base64" "encoding/binary" "math/bits" ) @@ -129,3 +131,13 @@ func MaskWebSocket(key uint32, b []byte) uint32 { return key } + +func GetWebSocketSecAccept(secKey string) string { + const magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" + const nonceSize = 24 // base64.StdEncoding.EncodedLen(nonceKeySize) + p := make([]byte, nonceSize+len(magic)) + copy(p[:nonceSize], secKey) + copy(p[nonceSize:], magic) + sum := sha1.Sum(p) + return base64.StdEncoding.EncodeToString(sum[:]) +} diff --git a/mihomo/docker/file-name.sh b/mihomo/docker/file-name.sh index 21cb61efb3..bd09da9572 100644 --- a/mihomo/docker/file-name.sh +++ b/mihomo/docker/file-name.sh @@ -13,7 +13,7 @@ case $TARGETPLATFORM in "linux/arm/v7") arch="armv7" ;; - "riscv64") + "linux/riscv64") arch="riscv64" ;; *) @@ -22,4 +22,4 @@ case $TARGETPLATFORM in ;; esac file_name="$os$arch-$(cat bin/version.txt)" -echo $file_name \ No newline at end of file +echo $file_name diff --git a/mihomo/hub/route/common.go b/mihomo/hub/route/common.go index d0053e674b..6dd0b40c85 100644 --- a/mihomo/hub/route/common.go +++ b/mihomo/hub/route/common.go @@ -1,10 +1,19 @@ package route import ( + "bufio" + "encoding/binary" + "errors" + "io" + "net" "net/http" "net/url" + "strconv" + "strings" + "time" "github.com/go-chi/chi/v5" + N "github.com/metacubex/mihomo/common/net" ) // When name is composed of a partial escape string, Golang does not unescape it @@ -15,3 +24,151 @@ func getEscapeParam(r *http.Request, paramName string) string { } return param } + +// wsUpgrade upgrades http connection to the websocket connection. +// +// It hijacks net.Conn from w and returns received net.Conn and +// bufio.ReadWriter. +func wsUpgrade(r *http.Request, w http.ResponseWriter) (conn net.Conn, rw *bufio.ReadWriter, err error) { + // See https://tools.ietf.org/html/rfc6455#section-4.1 + // The method of the request MUST be GET, and the HTTP version MUST be at least 1.1. + var nonce string + if r.Method != http.MethodGet { + err = errors.New("handshake error: bad HTTP request method") + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(http.StatusMethodNotAllowed) + w.Write([]byte(body)) + return nil, nil, err + } else if r.ProtoMajor < 1 || (r.ProtoMajor == 1 && r.ProtoMinor < 1) { + err = errors.New("handshake error: bad HTTP protocol version") + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(http.StatusHTTPVersionNotSupported) + w.Write([]byte(body)) + return nil, nil, err + } else if r.Host == "" { + err = errors.New("handshake error: bad Host header") + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(body)) + return nil, nil, err + } else if u := r.Header.Get("Upgrade"); u != "websocket" && !strings.EqualFold(u, "websocket") { + err = errors.New("handshake error: bad Upgrade header") + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(body)) + return nil, nil, err + } else if c := r.Header.Get("Connection"); c != "Upgrade" && !strings.Contains(strings.ToLower(c), "upgrade") { + err = errors.New("handshake error: bad Connection header") + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(body)) + return nil, nil, err + } else if nonce = r.Header.Get("Sec-WebSocket-Key"); len(nonce) != 24 { + err = errors.New("handshake error: bad Sec-WebSocket-Key header") + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(body)) + return nil, nil, err + } else if v := r.Header.Get("Sec-WebSocket-Version"); v != "13" { + err = errors.New("handshake error: bad Sec-WebSocket-Version header") + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + if v != "" { + // According to RFC6455: + // If this version does not match a version understood by the server, the + // server MUST abort the WebSocket handshake described in this section and + // instead send an appropriate HTTP error code (such as 426 Upgrade Required) + // and a |Sec-WebSocket-Version| header field indicating the version(s) the + // server is capable of understanding. + w.Header().Set("Sec-WebSocket-Version", "13") + w.WriteHeader(http.StatusUpgradeRequired) + } else { + w.WriteHeader(http.StatusBadRequest) + } + w.Write([]byte(body)) + return nil, nil, err + } + + conn, rw, err = http.NewResponseController(w).Hijack() + if err != nil { + body := err.Error() + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(body)) + return nil, nil, err + } + + // Clear deadlines set by server. + conn.SetDeadline(time.Time{}) + + rw.Writer.WriteString("HTTP/1.1 101 Switching Protocols\r\n") + header := http.Header{} + header.Set("Upgrade", "websocket") + header.Set("Connection", "Upgrade") + header.Set("Sec-WebSocket-Accept", N.GetWebSocketSecAccept(nonce)) + header.Write(rw.Writer) + rw.Writer.WriteString("\r\n") + err = rw.Writer.Flush() + + return conn, rw, err +} + +// wsWriteServerMessage writes message to w, considering that caller represents server side. +func wsWriteServerMessage(w io.Writer, op byte, p []byte) error { + dataLen := len(p) + + // Make slice of bytes with capacity 14 that could hold any header. + bts := make([]byte, 14) + + bts[0] |= 0x80 //FIN + bts[0] |= 0 << 4 //RSV + bts[0] |= op //OPCODE + + var n int + switch { + case dataLen < 126: + bts[1] = byte(dataLen) + n = 2 + case dataLen < 65536: + bts[1] = 126 + binary.BigEndian.PutUint16(bts[2:4], uint16(dataLen)) + n = 4 + default: + bts[1] = 127 + binary.BigEndian.PutUint64(bts[2:10], uint64(dataLen)) + n = 10 + } + + _, err := w.Write(bts[:n]) + if err != nil { + return err + } + _, err = w.Write(p) + return err +} + +// wsWriteServerText is the same as wsWriteServerMessage with ws.OpText. +func wsWriteServerText(w io.Writer, p []byte) error { + const opText = 0x1 + return wsWriteServerMessage(w, opText, p) +} + +// wsWriteServerBinary is the same as wsWriteServerMessage with ws.OpBinary. +func wsWriteServerBinary(w io.Writer, p []byte) error { + const opBinary = 0x2 + return wsWriteServerMessage(w, opBinary, p) +} diff --git a/mihomo/hub/route/connections.go b/mihomo/hub/route/connections.go index e0ff242648..2ae1e885be 100644 --- a/mihomo/hub/route/connections.go +++ b/mihomo/hub/route/connections.go @@ -11,8 +11,6 @@ import ( "github.com/go-chi/chi/v5" "github.com/go-chi/render" - "github.com/gobwas/ws" - "github.com/gobwas/ws/wsutil" ) func connectionRouter() http.Handler { @@ -30,7 +28,7 @@ func getConnections(w http.ResponseWriter, r *http.Request) { return } - conn, _, _, err := ws.UpgradeHTTP(r, w) + conn, _, err := wsUpgrade(r, w) if err != nil { return } @@ -56,7 +54,7 @@ func getConnections(w http.ResponseWriter, r *http.Request) { return err } - return wsutil.WriteMessage(conn, ws.StateServerSide, ws.OpText, buf.Bytes()) + return wsWriteServerText(conn, buf.Bytes()) } if err := sendSnapshot(); err != nil { diff --git a/mihomo/hub/route/server.go b/mihomo/hub/route/server.go index fe8275304e..27c13f75b1 100644 --- a/mihomo/hub/route/server.go +++ b/mihomo/hub/route/server.go @@ -26,8 +26,6 @@ import ( "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "github.com/go-chi/render" - "github.com/gobwas/ws" - "github.com/gobwas/ws/wsutil" "github.com/sagernet/cors" ) @@ -363,7 +361,7 @@ func traffic(w http.ResponseWriter, r *http.Request) { var wsConn net.Conn if r.Header.Get("Upgrade") == "websocket" { var err error - wsConn, _, _, err = ws.UpgradeHTTP(r, w) + wsConn, _, err = wsUpgrade(r, w) if err != nil { return } @@ -396,7 +394,7 @@ func traffic(w http.ResponseWriter, r *http.Request) { _, err = w.Write(buf.Bytes()) w.(http.Flusher).Flush() } else { - err = wsutil.WriteMessage(wsConn, ws.StateServerSide, ws.OpText, buf.Bytes()) + err = wsWriteServerText(wsConn, buf.Bytes()) } if err != nil { @@ -409,7 +407,7 @@ func memory(w http.ResponseWriter, r *http.Request) { var wsConn net.Conn if r.Header.Get("Upgrade") == "websocket" { var err error - wsConn, _, _, err = ws.UpgradeHTTP(r, w) + wsConn, _, err = wsUpgrade(r, w) if err != nil { return } @@ -446,7 +444,7 @@ func memory(w http.ResponseWriter, r *http.Request) { _, err = w.Write(buf.Bytes()) w.(http.Flusher).Flush() } else { - err = wsutil.WriteMessage(wsConn, ws.StateServerSide, ws.OpText, buf.Bytes()) + err = wsWriteServerText(wsConn, buf.Bytes()) } if err != nil { @@ -492,7 +490,7 @@ func getLogs(w http.ResponseWriter, r *http.Request) { var wsConn net.Conn if r.Header.Get("Upgrade") == "websocket" { var err error - wsConn, _, _, err = ws.UpgradeHTTP(r, w) + wsConn, _, err = wsUpgrade(r, w) if err != nil { return } @@ -551,7 +549,7 @@ func getLogs(w http.ResponseWriter, r *http.Request) { _, err = w.Write(buf.Bytes()) w.(http.Flusher).Flush() } else { - err = wsutil.WriteMessage(wsConn, ws.StateServerSide, ws.OpText, buf.Bytes()) + err = wsWriteServerText(wsConn, buf.Bytes()) } if err != nil { diff --git a/mihomo/transport/vmess/websocket.go b/mihomo/transport/vmess/websocket.go index 07fb9d6ad1..73b743dab7 100644 --- a/mihomo/transport/vmess/websocket.go +++ b/mihomo/transport/vmess/websocket.go @@ -5,7 +5,6 @@ import ( "bytes" "context" "crypto/rand" - "crypto/sha1" "crypto/tls" "encoding/base64" "encoding/binary" @@ -478,7 +477,7 @@ func streamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig, if lenSecAccept := len(secAccept); lenSecAccept != acceptSize { return nil, fmt.Errorf("unexpected Sec-Websocket-Accept length: %d", lenSecAccept) } - if getSecAccept(secKey) != secAccept { + if N.GetWebSocketSecAccept(secKey) != secAccept { return nil, errors.New("unexpected Sec-Websocket-Accept") } } @@ -489,16 +488,6 @@ func streamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig, return N.NewDeadlineConn(conn), nil } -func getSecAccept(secKey string) string { - const magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" - const nonceSize = 24 // base64.StdEncoding.EncodedLen(nonceKeySize) - p := make([]byte, nonceSize+len(magic)) - copy(p[:nonceSize], secKey) - copy(p[nonceSize:], magic) - sum := sha1.Sum(p) - return base64.StdEncoding.EncodeToString(sum[:]) -} - func StreamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig) (net.Conn, error) { if u, err := url.Parse(c.Path); err == nil { if q := u.Query(); q.Get("ed") != "" { @@ -568,7 +557,7 @@ func StreamUpgradedWebsocketConn(w http.ResponseWriter, r *http.Request) (net.Co w.Header().Set("Connection", "upgrade") w.Header().Set("Upgrade", "websocket") if !isRaw { - w.Header().Set("Sec-Websocket-Accept", getSecAccept(r.Header.Get("Sec-WebSocket-Key"))) + w.Header().Set("Sec-Websocket-Accept", N.GetWebSocketSecAccept(r.Header.Get("Sec-WebSocket-Key"))) } w.WriteHeader(http.StatusSwitchingProtocols) if flusher, isFlusher := w.(interface{ FlushError() error }); isFlusher && writeHeaderShouldFlush { diff --git a/naiveproxy/CHROMIUM_VERSION b/naiveproxy/CHROMIUM_VERSION index 80179b13f3..08e5245d9a 100644 --- a/naiveproxy/CHROMIUM_VERSION +++ b/naiveproxy/CHROMIUM_VERSION @@ -1 +1 @@ -140.0.7339.123 +143.0.7499.109 diff --git a/naiveproxy/USAGE.txt b/naiveproxy/USAGE.txt index fad6387e04..b88448ee63 100644 --- a/naiveproxy/USAGE.txt +++ b/naiveproxy/USAGE.txt @@ -67,7 +67,7 @@ Options: The default proxy is a direct connection without proxying. The last PROXY-URI is negotiated automatically for Naive padding. - Can be specified multiple times, but they must match the number of specified + If multiple proxies are specified, they must match the number of specified LISTEN-URIs, and each LISTEN-URI is routed to the PROXY matched by position. Limitations: @@ -93,7 +93,6 @@ Options: --host-resolver-rules="MAP proxy.example.com 1.2.3.4" Statically resolves a domain name to an IP address. - Multiple rules are comma separated. --resolver-range=CIDR @@ -115,8 +114,3 @@ Options: --no-post-quantum Overrides the default and disables post-quantum key agreement. - - --env=NAME=VALUE - - Sets the environment variable NAME to the value VALUE. Can be specified - multiple times. diff --git a/naiveproxy/src/AUTHORS b/naiveproxy/src/AUTHORS index be87235814..3004860b12 100644 --- a/naiveproxy/src/AUTHORS +++ b/naiveproxy/src/AUTHORS @@ -102,6 +102,7 @@ Ambareesh Balaji Ambarish Rapte Ameen Basha Amey Jahagirdar +Amit P Amit Paul Amit Sarkar Amogh Bihani @@ -133,6 +134,7 @@ Andrew MacPherson Andrew Nicols Andrew Tulloch Andriy Rysin +Ane Diaz de Tuesta Anish Patankar Ankit Kiran Ankit Kumar @@ -175,6 +177,7 @@ Arunprasad Rajkumar Arunprasad Rajkumar Arup Barua Aryan Kaushik +Aryan P Krishnan Asami Doi Ashish Kumar Gupta Ashlin Joseph @@ -301,6 +304,7 @@ Clemens Fruhwirth Clement Scheelfeldt Skau Clinton Staley Cong Zuo +Connor Hewitt Connor Pearson Conrad Irwin Craig Schlenter @@ -311,6 +315,7 @@ Daeyoon Choi Dai Chunyang Daiwei Li Damien Marié +Damitha Gunawardena Dan McCombs Daniel Adams Daniel Bertalan @@ -411,6 +416,7 @@ Dushyant Kant Sharma Dustin Doloff Ebrahim Byagowi Ebrahim Byagowi +Eden Wang Eden Wang Eduardo Lima (Etrunko) Eduardo Lima (Etrunko) @@ -506,6 +512,7 @@ Greg Visser Gregory Davis Grzegorz Czajkowski Guangzhen Li +Guohui Xie Guobin Wu Gurpreet Kaur Gustav Tiger @@ -537,6 +544,7 @@ Harshit Pal Hassan Salehe Matar Hautio Kari He Qi +He Yang <1160386205@qq.com> Heejin R. Chung Heeyoun Lee Helmut Januschka @@ -544,6 +552,7 @@ Henrique de Carvalho Henrique Limas Henrique Valcanaia Henry Lim +Hewei Hewro Hikari Fujimoto Himadri Agrawal Himanshu Joshi @@ -917,6 +926,7 @@ Lionel Landwerlin Lisha Guo Lizhi Fan Lloyd Huang +Lloyd Torres Loay Ghreeb Loo Rong Jie Lorenzo Stoakes @@ -939,6 +949,7 @@ Lu Yahan Lyra Rebane Ma Aiguo Maarten Lankhorst +Maciej Czarnecki Maciej Pawlowski Magnus Danielsson Mahesh Kulkarni @@ -1024,6 +1035,7 @@ Md Sami Uddin Mego Tan Merajul Arefin Micha Hanselmann +Michael Chan Michael Cirone Michael Constant Michael Forney @@ -1055,6 +1067,7 @@ Mingeun Park Minggang Wang Mingmin Xie Mingming Xu +Mingtao Zhou Mingyue Ji Minjeong Kim Minjeong Lee @@ -1081,6 +1094,7 @@ Mohraiel Matta Moiseanu Rares-Marian Momoka Yamamoto Momoko Hattori +Mostafa Aboalkasim Mostafa Sedaghat joo Mrunal Kapade Muhammad Mahad @@ -1493,12 +1507,14 @@ Tanvir Rizvi Tao Wang Tao Xiong Tapu Kumar Ghose +Tau Gärtli Taylor Price Ted Kim Ted Vessenes Teodora Novkovic Thiago Farina Thiago Marcos P. Santos +Thibault Gagnaux Thirumurugan Thomas Butter Thomas Conti @@ -1532,6 +1548,7 @@ Torsten Kurbad Toshihito Kikuchi Toshiaki Tanaka Travis Leithead +Trent Taylor Trent Willis Trevor Perrin Tripta Gupta @@ -1540,6 +1557,7 @@ Tristan Fraipont Tudor Brindus Tushar Singh Tuukka Toivonen +Tyler Carson Tyler Jones U. Artie Eoff Umar Hansa @@ -1561,6 +1579,7 @@ Vernon Tang Viatcheslav Ostapenko Victor Costan Victor Solonsky +Vidya Balachander Viet-Trung Luu Vikas Mundra Vinay Anantharaman @@ -1624,7 +1643,9 @@ Xunran Ding Xunran Ding Yael Aharon Yagiz Nizipli +Yaksh Bariya Yan Wang +Yaniv Yissachar Yang Gu Yang Liu Yang Liu @@ -1676,6 +1697,7 @@ Yuma Takai Yumikiyo Osanai Yumin Su Yun Jiyun +Yun Ye Yunchao He Yupei Lin Yupei Wang @@ -1736,6 +1758,7 @@ BlackBerry Limited <*@blackberry.com> Bocoup <*@bocoup.com> Brave Software Inc. <*@brave.com> Canonical Limited <*@canonical.com> +Canva Pty Ltd <*@canva.com> Cloudflare, Inc. <*@cloudflare.com> CloudMosa, Inc. <*@cloudmosa.com> Code Aurora Forum <*@codeaurora.org> @@ -1760,6 +1783,7 @@ IBM Inc. <*@ibm.com> Igalia S.L. <*@igalia.com> Imagination Technologies Limited <*@imagination.corp-partner.google.com> Impossible Dreams Network <*@impossibledreams.net> +imput LLC <*@imput.net> Intel Corporation <*@intel.com> Island Technology, Inc. <*@island.io> LG Electronics, Inc. <*@lge.com> diff --git a/naiveproxy/src/BUILD.gn b/naiveproxy/src/BUILD.gn index c70ee7f327..3e56a049cf 100644 --- a/naiveproxy/src/BUILD.gn +++ b/naiveproxy/src/BUILD.gn @@ -8,7 +8,9 @@ # you add a new build file, there must be some path of dependencies from this # file to your new one or GN won't know about it. +import("//build/config/c++/modules.gni") import("//build/config/cast.gni") +import("//build/config/chrome_build.gni") import("//build/config/compiler/compiler.gni") import("//build/config/cronet/config.gni") import("//build/config/dcheck_always_on.gni") diff --git a/naiveproxy/src/DEPS b/naiveproxy/src/DEPS index 6668d42680..f3d06f9430 100644 --- a/naiveproxy/src/DEPS +++ b/naiveproxy/src/DEPS @@ -23,7 +23,7 @@ # # in origin/master. The path for the dep should start with src/. # roll-dep src/third_party/foo_package/src foo_package.git # # You should now have a modified DEPS file; commit and upload as normal -# git commit -aspv_he +# git commit -a # git cl upload # # For more on the syntax and semantics of this file, see: @@ -240,36 +240,53 @@ vars = { # luci-go CIPD package version. # Make sure the revision is uploaded by infra-packagers builder. # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console - 'luci_go': 'git_revision:69966f1a4984c4ade24b8e2e1af0bbc51b64d3c0', + 'luci_go': 'git_revision:91e1062e0934a2e58027eae7419bc61aef5e64dd', # This can be overridden, e.g. with custom_vars, to build clang from HEAD # instead of downloading the prebuilt pinned revision. 'llvm_force_head_revision': False, + # This can be overridden, e.g. with custom_vars, to build rust from HEAD + # against ToT LLVM, instead of downloading the prebuilt pinned revision. + 'rust_force_head_revision': False, + # Make Dawn skip its standalone dependencies 'dawn_standalone': False, # Fetch configuration files required for the 'use_remoteexec' gn arg 'download_remoteexec_cfg': False, # RBE instance to use for running remote builds + # Ignored if reapi_instance is configured for non-RBE address. 'rbe_instance': Str('projects/rbe-chrome-untrusted/instances/default_instance'), + # REAPI instance for non-RBE backends. + # need to set reapi_address too. + 'reapi_instance': Str(''), + # REAPI address for REAPI backends. + 'reapi_address': Str(''), + # REAPI backend config path for Siso. + # pathname relative to build/config/siso/backend_config, or absolute path. + 'reapi_backend_config_path': Str(''), + # siso CIPD package version. + 'siso_version': 'git_revision:0915813c4c786240e12d03aa3018c02bab4df14f', + + # reclient options. + # download reclient binaries, required for 'use_reclient` gn arg. + # TODO(crbug.com/448517720): make it false by default. + 'download_reclient': '(host_cpu != "arm64" or host_os == "mac")', # RBE project to download rewrapper config files for. Only needed if # different from the project used in 'rbe_instance' 'rewrapper_cfg_project': Str(''), # reclient CIPD package 'reclient_package': 'infra/rbe/client/', # reclient CIPD package version - 'reclient_version': 're_client_version:0.179.0.28341fc7-gomaip', + 'reclient_version': 're_client_version:0.185.0.db415f21-gomaip', # screen-ai CIPD packages - 'screen_ai_linux': 'version:140.02', - 'screen_ai_macos_amd64': 'version:140.02', - 'screen_ai_macos_arm64': 'version:140.02', - 'screen_ai_windows_amd64': 'version:140.02', - 'screen_ai_windows_386': 'version:140.02', - - # siso CIPD package version. - 'siso_version': 'git_revision:887a10bc8a038d8e330d06d1ad5ae6ec646f3040', + 'screen_ai_linux': 'version:140.10', + 'screen_ai_macos_amd64': 'version:140.10', + 'screen_ai_macos_arm64': 'version:140.10', + 'screen_ai_windows_amd64': 'version:140.10', + 'screen_ai_windows_386': 'version:140.10', # download libaom test data 'download_libaom_testdata': False, @@ -291,35 +308,35 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'src_internal_revision': 'f4c49123a405af8472494ccdef01a2c27b1ac99e', + 'src_internal_revision': '47b813be65155efd29c2259761f831e793db882f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '1fdbea293a53b270e3f5e74c92cc6670d68412ff', + 'skia_revision': 'da51f0d60ea2b14e845a823dc11b405dbeef42d8', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'fdb12b460f148895f6af2ff0e0d870ff8889f154', + 'v8_revision': 'beee9f5cafde91bbd086077a11db16cb9768e62a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': 'a8c8a6febe630c6239a5e207530e9fac651ae373', + 'angle_revision': '2dfb5b7603d09c1d06f9d7a894752431d98b9a3e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': 'fdb6700ecb04103b658d2e4623d6bc663ba80ea8', + 'swiftshader_revision': '3d536c0fc62b1cdea0f78c3c38d79be559855b88', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '1afaa1a380fcd06cec420f3e5b6ec1d2ccb920dc', + 'pdfium_revision': 'f5c376f93d33709ecd6b0dc8147b14a651ddbfeb', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. - 'boringssl_revision': '0a0009998fa180695f3e2071805dc03c9a5f3124', + 'boringssl_revision': '58da9b0d721fd807279f4e3898741c92cf43bdbd', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:29.20250730.5.1', + 'fuchsia_version': 'version:29.20251023.3.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -327,7 +344,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling googletest # and whatever else without interference from each other. - 'googletest_revision': '373af2e3df71599b87a40ce0e37164523849166b', + 'googletest_revision': 'b2b9072ecbe874f5937054653ef8f2731eb0f010', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling lighttpd # and whatever else without interference from each other. @@ -335,19 +352,19 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling lss # and whatever else without interference from each other. - 'lss_revision': 'ed31caa60f20a4f6569883b2d752ef7522de51e0', + 'lss_revision': '29164a80da4d41134950d76d55199ea33fbb9613', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling breakpad # and whatever else without interference from each other. - 'breakpad_revision': 'ff252ff6faf5e3a52dc4955aab0d84831697dc94', + 'breakpad_revision': 'd0b41ca2a38c7b14c4b7853254eb5bf3b4039691', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. - 'freetype_revision': '27c1cb10a52420515ce66729dfca897be21691b8', + 'freetype_revision': 'ae63cc0d13318f2f93fd440cce277388d1b30a49', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling HarfBuzz # and whatever else without interference from each other. - 'harfbuzz_revision': '9f83bbbe64654b45ba5bb06927ff36c2e7588495', + 'harfbuzz_revision': '7d936359a27abb2d7cb14ecc102463bb15c11843', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Emoji Segmenter # and whatever else without interference from each other. @@ -359,11 +376,11 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '0fd1415f0cf3219ba097d37336141897fab7c5e9', + 'catapult_revision': 'ddb5845c3f7d88d8698e602547bd854b36f0604f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. - 'crossbench_revision': '69b7e2bb8e1d8d92d4efbb92bcddba3af2716577', + 'crossbench_revision': 'e4937b062fe8b9130ea0fc02c406c045b5cb7b31', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. @@ -375,7 +392,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling fuzztest # and whatever else without interference from each other. - 'fuzztest_revision': '7bab06ff5fbbf8b8cce05a8661369dc2e11cde66', + 'fuzztest_revision': '7940ee9a7ebce6419c6391eef8b289524b16f198', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling domato # and whatever else without interference from each other. @@ -383,7 +400,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '5dbb6f71a9bd613c0403242c7c021652fbf155fd', + 'devtools_frontend_revision': 'e4dd1d1d96b706a33ae7d60237d3cdcd58294e4c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -407,19 +424,19 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '8550f9c1ff8859d25cc49bdfacef083cff2c5121', + 'dawn_revision': 'e1ce227ebf75378c5f60a9d531579982bcdd93ee', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'quiche_revision': '42832178b3b6ae20f0d1c9634c040c528614f45f', + 'quiche_revision': '42cbfedd76691c19af012a3d717fca07d7b09cc9', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ink # and whatever else without interference from each other. - 'ink_revision': '4e6081ad7052f97df7d77e1d87cea2d70c18a47b', + 'ink_revision': 'f70052a0bbae22fe52b630844e9651b27db92ed2', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ink_stroke_modeler # and whatever else without interference from each other. - 'ink_stroke_modeler_revision': 'fe79520c9ad7d2d445d26d3c59fda6fc54eb4d5c', + 'ink_stroke_modeler_revision': '2cd45e8683025c28fa2efcf672ad46607e8af869', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ios_webkit # and whatever else without interference from each other. @@ -431,7 +448,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling jetstream-main # and whatever else without interference from each other. - 'jetstream_main_revision': 'fe1f348226d4b7c3447e606577960a606cc058e4', + 'jetstream_main_revision': '0debbb0b94486d4c78162ad5a102279b96dc79d3', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling jetstream-v2.2 # and whatever else without interference from each other. @@ -443,11 +460,11 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling crabbyavif # and whatever else without interference from each other. - 'crabbyavif_revision': '644c9d84c123ac811a611760a9adc807e3eb5be5', + 'crabbyavif_revision': '3ba05863e84fd3acb4f4af2b4545221b317a2e55', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Speedometer main # and whatever else without interference from each other. - 'speedometer_main_revision': '87f9ed88c8f8abe3a3bb19b9ec5ea49623d803ad', + 'speedometer_main_revision': 'd90b6fde07041d9d19ab71de32b461b613c899a1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Speedometer v3.1 # and whatever else without interference from each other. @@ -467,7 +484,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling nearby # and whatever else without interference from each other. - 'nearby_revision': 'a8889d12a27ef7006d1a47dfefc272e0815f5c41', + 'nearby_revision': '0bad8b0c9877f92eeeb550654f1ea51a71a085e4', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling securemessage # and whatever else without interference from each other. @@ -487,35 +504,35 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libcxxabi_revision': 'a6c815c69d55ec59d020abde636754d120b402ad', + 'libcxxabi_revision': 'a02fa0058d8d52aca049868d229808a3e5dadbad', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libunwind_revision': '84c5262b57147e9934c0a8f2302d989b44ec7093', + 'libunwind_revision': 'b7c3dda13e46ced88a6f7230e271ebd633b4cef2', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'clang_format_revision': '37f6e68a107df43b7d7e044fd36a13cbae3413f2', + 'clang_format_revision': 'c2725e0622e1a86d55f14514f2177a39efea4a0e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'highway_revision': '00fe003dac355b979f36157f9407c7c46448958e', + 'highway_revision': '84379d1c73de9681b54fbe1c035a23c7bd5d272d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ffmpeg # and whatever else without interference from each other. - 'ffmpeg_revision': 'd2d06b12c22d27af58114e779270521074ff1f85', + 'ffmpeg_revision': '9e751092c9498b84bbb77e2e0689ef9f50fe608f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling webpagereplay # and whatever else without interference from each other. - 'webpagereplay_revision': 'eebd5c62cb5c6a5afbb36eccdcc3b3e01f28adc9', + 'webpagereplay_revision': 'ab0ca8075f0cc5d40fed25e08ddabb144c29fc08', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling llvm-libc # and whatever else without interference from each other. - 'llvm_libc_revision': '6adc0aa946a413c124758a3a0ac12e5a536c7dd3', + 'llvm_libc_revision': '796bfb264a22264b11acda9feaffdffb168c7e12', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling llvm-libc # and whatever else without interference from each other. - 'compiler_rt_revision': 'dc425afb37a69b60c8c02fef815af29e91b61773', + 'compiler_rt_revision': '08611c39bbfc52cc034904eb88817c6209b828f9', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling clusterfuzz-data # and whatever else without interference from each other. @@ -523,10 +540,10 @@ vars = { # If you change this, also update the libc++ revision in # //buildtools/deps_revisions.gni. - 'libcxx_revision': 'adbb4a5210ae2a8a4e27fa6199221156c02a9b1a', + 'libcxx_revision': '8cd54f6b0741cdef08299711668e6b25fef26406', # GN CIPD package version. - 'gn_version': 'git_revision:3a4f5cea73eca32e9586e8145f97b04cbd4a1aee', + 'gn_version': 'git_revision:07d3c6f4dc290fae5ca6152ebcb37d6815c411ab', # ninja CIPD package. 'ninja_package': 'infra/3pp/tools/ninja/', @@ -754,7 +771,7 @@ deps = { 'packages': [ { 'package': 'chrome_internal/third_party/google3/data_sharing_sdk', - 'version': 'i8ho99FBppSWsHbREBeWk-0Ap0kBuB7MRSWBJxWPO_QC', + 'version': 'NQq9pR3VrvsqPtQSfrezFe8hL-z_SfZsONkwC-MqX6wC', }, ], 'condition': 'checkout_src_internal and non_git_source', @@ -831,10 +848,10 @@ deps = { 'condition': 'non_git_source', 'objects': [ { - 'object_name': 'c2085eeb07e1db47d75633a23311b7d2b7b5d1ee', - 'sha256sum': '24f08d6ea505a468362b862591bdebdb8ba5f6b3da73b435fcc85bd1e38cfbca', - 'size_bytes': 9528349, - 'generation': 1748543466441365, + 'object_name': 'aeccaa9eadca1b3f850eb336a50c75a3da36e5a9', + 'sha256sum': '5a2afe63907f8f2c5d0d233e40ae2cf1b4d573aa80504afbbb9136f98d8c1e69', + 'size_bytes': 9771228, + 'generation': 1761676949002899, 'output_file': 'node_modules.tar.gz', }, ], @@ -846,157 +863,157 @@ deps = { 'objects': [ { # The Android libclang_rt.builtins libraries are currently only included in the Linux clang package. - 'object_name': 'Linux_x64/clang-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': 'b448a78b42740352a37b458115a9482f213097bbf28f1f839e72cab829bdfa6d', - 'size_bytes': 55133120, - 'generation': 1753983011666559, + 'object_name': 'Linux_x64/clang-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': 'f6a487ffd0e56ba7a39b063d85d1f8ff7846514f50635785730cffb7368872ce', + 'size_bytes': 55669844, + 'generation': 1759771493989631, 'condition': '(host_os == "linux" or checkout_android) and non_git_source', }, { - 'object_name': 'Linux_x64/clang-tidy-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '98da47515c1f996bdf884487afff4cca0bbbd6a23347b5fc9442ba4210ca66a2', - 'size_bytes': 13659920, - 'generation': 1753983011671003, + 'object_name': 'Linux_x64/clang-tidy-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': '4fc7aacf4c25e50a25a941f1186a9e042ae26a2c5c698f359907798fa68106c8', + 'size_bytes': 14053336, + 'generation': 1759771494041411, 'condition': 'host_os == "linux" and checkout_clang_tidy and non_git_source', }, { - 'object_name': 'Linux_x64/clangd-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': 'e133b8b139770ab170832e1fe68d03453bec0315dbc53ffa6928a61d0f348d41', - 'size_bytes': 13852732, - 'generation': 1753983011663674, + 'object_name': 'Linux_x64/clangd-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': '238897cb0b55ffcb7f6b8f6a10055e44e05023642441a800895704ced91d37d1', + 'size_bytes': 14197108, + 'generation': 1759771494144266, 'condition': 'host_os == "linux" and checkout_clangd and non_git_source', }, { - 'object_name': 'Linux_x64/llvm-code-coverage-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '2a61faffe37a31330cd825b567c4a422724b8d35426d79d4ac265f07ab8ecedf', - 'size_bytes': 2314532, - 'generation': 1753983011700114, + 'object_name': 'Linux_x64/llvm-code-coverage-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': '2c5b0bf210ca982d8ec37cacf3d06d9c45bd6e68b33dcaabce0d108d6c266a36', + 'size_bytes': 2272128, + 'generation': 1759771494296549, 'condition': 'host_os == "linux" and checkout_clang_coverage_tools and non_git_source', }, { - 'object_name': 'Linux_x64/llvmobjdump-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '1e4be8737102bff65c33e37867d28960b297bdd718fb43d544e5a977aa73e58e', - 'size_bytes': 5675780, - 'generation': 1753983011751371, + 'object_name': 'Linux_x64/llvmobjdump-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': 'fd644634db56977b072d951f26571ac41c9c298bf5989e99efeb150ee8427364', + 'size_bytes': 5666140, + 'generation': 1759771494159187, 'condition': '((checkout_linux or checkout_mac or checkout_android) and host_os == "linux") and non_git_source', }, { - 'object_name': 'Mac/clang-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '0cfd4ac1d5c922f3868b7d0f59731596c9f7651541a4e2cd32fcae91cb707389', - 'size_bytes': 52423592, - 'generation': 1753983013393204, + 'object_name': 'Mac/clang-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': '44811b6ed6868142c088807f6bcc0d08811a7b11d3f2bc2124c45868037e8cc3', + 'size_bytes': 53583464, + 'generation': 1759771495565305, 'condition': 'host_os == "mac" and host_cpu == "x64"', }, { - 'object_name': 'Mac/clang-mac-runtime-library-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '6267cf2fdd697c4f5ff60c1ea949dcde2c5638c86c254e410fd8093d8ba88854', - 'size_bytes': 995072, - 'generation': 1753983021140243, + 'object_name': 'Mac/clang-mac-runtime-library-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': '8a2e16410bede5d52c77a012f182dde2350b05e647f7c1acaf7823ce816b4422', + 'size_bytes': 1005144, + 'generation': 1759771503758969, 'condition': 'checkout_mac and not host_os == "mac"', }, { - 'object_name': 'Mac/clang-tidy-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': 'cb6aeb04f059f1d504efb4a8e018ce3dd6e71c9ca3b37e07974c1bce9a473444', - 'size_bytes': 13738952, - 'generation': 1753983013426743, + 'object_name': 'Mac/clang-tidy-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': '66633fe8846fddeda86b5ee992b945939bfe46567c9c685900c39531d22ce5cf', + 'size_bytes': 14133312, + 'generation': 1759771495642847, 'condition': 'host_os == "mac" and host_cpu == "x64" and checkout_clang_tidy', }, { - 'object_name': 'Mac/clangd-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': 'd4bd53a928a682b68d9f268ef2a7e5fc098090a051944bd3bd293f34920bfa1a', - 'size_bytes': 15157732, - 'generation': 1753983013465928, + 'object_name': 'Mac/clangd-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': '44088b951aa7ddc96c0f32703b076311a7e7b803b3adfe0bfe9725f78c4fab29', + 'size_bytes': 15627392, + 'generation': 1759771495653658, 'condition': 'host_os == "mac" and host_cpu == "x64" and checkout_clangd', }, { - 'object_name': 'Mac/llvm-code-coverage-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': 'a3aa1c0792baa8aba7e91fb9d72ec80c2fe6bb88ced406660f23e5b93c40e88c', - 'size_bytes': 2282708, - 'generation': 1753983013526049, + 'object_name': 'Mac/llvm-code-coverage-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': '79d62c78d256a508a0f3dbe59aa0fdf0391a9d462bf74e56adc1dee82efa83ac', + 'size_bytes': 2321940, + 'generation': 1759771495825689, 'condition': 'host_os == "mac" and host_cpu == "x64" and checkout_clang_coverage_tools', }, { - 'object_name': 'Mac/llvmobjdump-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '3ee5d49e92ad6cd1e532118f0713532962d6ef14aa119f81a893b72c95046ac6', - 'size_bytes': 5484504, - 'generation': 1753983013468350, + 'object_name': 'Mac/llvmobjdump-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': 'a10d075e19e7b614ffd8c5a65f04fbd45011ec74c735dda89f0b3780ab397329', + 'size_bytes': 5567160, + 'generation': 1759771495741126, 'condition': 'host_os == "mac" and host_cpu == "x64"', }, { - 'object_name': 'Mac_arm64/clang-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': 'afed7bb50e1e7f25472f3a43e942a774c3ef5dcc31a1a9cf817224aec411f4fb', - 'size_bytes': 44337520, - 'generation': 1753983022809149, + 'object_name': 'Mac_arm64/clang-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': 'c97e4f62cdd77edf725ccbf4cd63b589302605bf643c871f83214f39e629b2ea', + 'size_bytes': 44593804, + 'generation': 1759771504972271, 'condition': 'host_os == "mac" and host_cpu == "arm64"', }, { - 'object_name': 'Mac_arm64/clang-tidy-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '51e2940861747013b11833da69821364552776e29be54287e7d8b299c35357de', - 'size_bytes': 11873540, - 'generation': 1753983022864078, + 'object_name': 'Mac_arm64/clang-tidy-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': '3a0eb0fb3a4633c8b4b143e826c5476c41cdd6bd0db8e93a74bbee6520b02b79', + 'size_bytes': 12136348, + 'generation': 1759771505073378, 'condition': 'host_os == "mac" and host_cpu == "arm64" and checkout_clang_tidy', }, { - 'object_name': 'Mac_arm64/clangd-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '3344e7ed3d42be6c827502e2c4addbae42dfbe9699e5e391649fdf53ce3d16d7', - 'size_bytes': 12136100, - 'generation': 1753983022893296, + 'object_name': 'Mac_arm64/clangd-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': '2a5dc1f385bacd25b974b8aa15c57008e33bc384521e2d705a940acbb3292356', + 'size_bytes': 12479180, + 'generation': 1759771505148040, 'condition': 'host_os == "mac" and host_cpu == "arm64" and checkout_clangd', }, { - 'object_name': 'Mac_arm64/llvm-code-coverage-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '59709d0a6bc2f1930c0971b4f0cf4d8932d1321621cff570419342ee396cc43e', - 'size_bytes': 1989132, - 'generation': 1753983022902753, + 'object_name': 'Mac_arm64/llvm-code-coverage-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': '00bf0f82ca9aff15f32e7f0cf7e7b25d36a5a672a1a9bc345c1b7e140a478f93', + 'size_bytes': 1948520, + 'generation': 1759771505303586, 'condition': 'host_os == "mac" and host_cpu == "arm64" and checkout_clang_coverage_tools', }, { - 'object_name': 'Mac_arm64/llvmobjdump-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '76f2d491e7535e6051f3a6bc4a6948602a8e4a231882305e13c9adb9ce6af125', - 'size_bytes': 5313688, - 'generation': 1753983022869504, + 'object_name': 'Mac_arm64/llvmobjdump-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': '7aa959752d6beafc74129e4822912021f855584e55a55600044f1d42b889f8b0', + 'size_bytes': 5292960, + 'generation': 1759771505201957, 'condition': 'host_os == "mac" and host_cpu == "arm64"', }, { - 'object_name': 'Win/clang-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '418c186740c926b9ba85c173540ffa3ed459e3fab06ee45fe524f9b480c2a7a6', - 'size_bytes': 47378940, - 'generation': 1753983032535097, + 'object_name': 'Win/clang-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': 'fc756186dea61e700bd0f885b585050d9356bbd7f942dafae25d38eef4671adf', + 'size_bytes': 47657436, + 'generation': 1759771514781908, 'condition': 'host_os == "win"', }, { - 'object_name': 'Win/clang-tidy-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '0865195b3efdaab630f9acb06d4a4e414813752b28f7511dddf3cd69e38df4a0', - 'size_bytes': 13488148, - 'generation': 1753983032729035, + 'object_name': 'Win/clang-tidy-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': 'f7ecd7e8d555e8622e0096ea1aca3ddb3fb4e89e91228c3c87289a4b8ca7919c', + 'size_bytes': 14016476, + 'generation': 1759771514824669, 'condition': 'host_os == "win" and checkout_clang_tidy', }, { - 'object_name': 'Win/clang-win-runtime-library-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '2a7678deda052620fa8aff586922d1607d1e39e51726dee9e9325a668c495df4', - 'size_bytes': 2506544, - 'generation': 1753983040294404, + 'object_name': 'Win/clang-win-runtime-library-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': '0a426702c9e0f92ea27f9611a1665cc5df9a58820360d3fa6a4026b9a0e5120f', + 'size_bytes': 2501292, + 'generation': 1759771523074183, 'condition': 'checkout_win and not host_os == "win"', }, { - 'object_name': 'Win/clangd-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '79a70ce9405ed33f4dfddb4d3be82d827964fb79b898b82f892d9855d5dd3195', - 'size_bytes': 13904768, - 'generation': 1753983032665184, + 'object_name': 'Win/clangd-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': 'b172d0246511cdeffbc5a4fa44ad402a6b9eacd9d3e2e77d88a9965f80d344d5', + 'size_bytes': 14364312, + 'generation': 1759771514873065, 'condition': 'host_os == "win" and checkout_clangd', }, { - 'object_name': 'Win/llvm-code-coverage-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': 'b57dddb09757df2bb2bfd83e57a87c3f1da72a700afb66e853f60fe0102e1ba3', - 'size_bytes': 2384644, - 'generation': 1753983032706862, + 'object_name': 'Win/llvm-code-coverage-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': 'b70528795afd95729971b74939e512c638a8a93fd1ee1c9205a6240f7af28802', + 'size_bytes': 2368144, + 'generation': 1759771515105244, 'condition': 'host_os == "win" and checkout_clang_coverage_tools', }, { - 'object_name': 'Win/llvmobjdump-llvmorg-21-init-16348-gbd809ffb-15.tar.xz', - 'sha256sum': '4fd02b442dcb5cc8f4a80e4c8e6aeb972dc0163a8ee79b3ce3416d9cc24cb137', - 'size_bytes': 5654156, - 'generation': 1753983032704697, + 'object_name': 'Win/llvmobjdump-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', + 'sha256sum': '94c068f109e220e028a38f5beced7d6acd67725fc0b1da9fa8ed1b959f12d799', + 'size_bytes': 5673824, + 'generation': 1759771514962844, 'condition': '(checkout_linux or checkout_mac or checkout_android) and host_os == "win"', }, ] @@ -1005,33 +1022,34 @@ deps = { 'src/third_party/rust-toolchain': { 'dep_type': 'gcs', 'bucket': 'chromium-browser-clang', + 'condition': 'not rust_force_head_revision', 'objects': [ { - 'object_name': 'Linux_x64/rust-toolchain-22be76b7e259f27bf3e55eb931f354cd8b69d55f-3-llvmorg-21-init-16348-gbd809ffb.tar.xz', - 'sha256sum': '5f8e9ad847e5bf586e0de1bb563c9a49e05ad36edfad5037900d7510004fc577', - 'size_bytes': 138573136, - 'generation': 1750840933611077, + 'object_name': 'Linux_x64/rust-toolchain-15283f6fe95e5b604273d13a428bab5fc0788f5a-1-llvmorg-22-init-8940-g4d4cb757.tar.xz', + 'sha256sum': '2bdaea0b11cb11a8f2f4dcb79b0dbb4bf38e2bd22479ff8014f55b9b6890e135', + 'size_bytes': 142044388, + 'generation': 1758743116775859, 'condition': 'host_os == "linux" and non_git_source', }, { - 'object_name': 'Mac/rust-toolchain-22be76b7e259f27bf3e55eb931f354cd8b69d55f-3-llvmorg-21-init-16348-gbd809ffb.tar.xz', - 'sha256sum': '357db812ca0a518ef0fc4394ddc859d68f23384931294412b7424bb3aabb3c09', - 'size_bytes': 132392604, - 'generation': 1750840935469331, + 'object_name': 'Mac/rust-toolchain-15283f6fe95e5b604273d13a428bab5fc0788f5a-1-llvmorg-22-init-8940-g4d4cb757.tar.xz', + 'sha256sum': '351347e1930a900c63b3953cdb10775b73572c6145e389f3820ba920816d46ca', + 'size_bytes': 135891820, + 'generation': 1758743118329536, 'condition': 'host_os == "mac" and host_cpu == "x64"', }, { - 'object_name': 'Mac_arm64/rust-toolchain-22be76b7e259f27bf3e55eb931f354cd8b69d55f-3-llvmorg-21-init-16348-gbd809ffb.tar.xz', - 'sha256sum': 'd3cb60c6388e86d3d1a0c46c539f1ea0ed1ff48cf907dc21b2cb5ff441b23c03', - 'size_bytes': 120354192, - 'generation': 1750840937280735, + 'object_name': 'Mac_arm64/rust-toolchain-15283f6fe95e5b604273d13a428bab5fc0788f5a-1-llvmorg-22-init-8940-g4d4cb757.tar.xz', + 'sha256sum': '33d6b8cf4fc6617aa98888a46bc1dbef29ae9a9ebd01c3f248ef8c08ec5f198b', + 'size_bytes': 123302332, + 'generation': 1758743119839246, 'condition': 'host_os == "mac" and host_cpu == "arm64"', }, { - 'object_name': 'Win/rust-toolchain-22be76b7e259f27bf3e55eb931f354cd8b69d55f-3-llvmorg-21-init-16348-gbd809ffb.tar.xz', - 'sha256sum': '7e804f3a8bef4c8ca32d3368ca7564e5c12b684899453d9a522bdd05b1f1df7b', - 'size_bytes': 195000356, - 'generation': 1750840939064273, + 'object_name': 'Win/rust-toolchain-15283f6fe95e5b604273d13a428bab5fc0788f5a-1-llvmorg-22-init-8940-g4d4cb757.tar.xz', + 'sha256sum': '4f6dfa230e5d401bf9aadd804142b412467177b17d50a3f52a8c69c1957aa2db', + 'size_bytes': 199998880, + 'generation': 1758743121322555, 'condition': 'host_os == "win"', }, ], @@ -1077,7 +1095,7 @@ deps = { 'version': Var('reclient_version'), } ], - 'condition': '(host_cpu != "arm64" or host_os == "mac") and non_git_source', + 'condition': 'download_reclient and non_git_source', 'dep_type': 'cipd', }, @@ -1095,10 +1113,10 @@ deps = { 'bucket': 'chromium-telemetry', 'objects': [ { - 'object_name': 'meet-gpu-tests/750908933.tar.gz', - 'sha256sum': '687f07f3963ca30339aae16bd053357a1d632db67dc744539f43bf9c83b137e5', - 'size_bytes': 192267405, - 'generation': 1747334995545331, + 'object_name': 'meet-gpu-tests/794607354.tar.gz', + 'sha256sum': 'b6323f30b63286b6b23657f90766d7779a46c6051d872087ade177ecdad2fe92', + 'size_bytes': 192558604, + 'generation': 1755101371733816, }, ], }, @@ -1160,17 +1178,6 @@ deps = { 'dep_type': 'cipd', }, - 'src/third_party/cronet_android_mainline_clang/linux-amd64': { - 'packages': [ - { - 'package': 'chromium/third_party/cronet_android_mainline_clang/linux-amd64', - 'version': 'V0dPF9Cc6TYEaE6vsPyJoFO6xD2_NglmR7Gbqrp7d-sC', - }, - ], - 'condition': 'checkout_android and host_os == "linux"', - 'dep_type': 'cipd', - }, - 'src/android_webview/tools/cts_archive/cipd': { 'packages': [ { @@ -1186,10 +1193,10 @@ deps = { 'packages': [ { 'package': 'chromium/chrome/android/orderfiles/arm', - 'version': 'Zwbd6e_c1R4CLUGOn6nPr6PS4s3FADAGPvrOkCU_gb0C', + 'version': 'i-qbPfvG4NuDKYiqKzxZWu1EqtlAsh1hsF0ZcSwnTYwC', }, ], - 'condition': 'checkout_android', + 'condition': 'checkout_android and non_git_source', 'dep_type': 'cipd', }, @@ -1197,23 +1204,40 @@ deps = { 'packages': [ { 'package': 'chromium/chrome/android/orderfiles/arm64', - 'version': 'zGVpdGw8UhIPfmSfbyetTbDtROZ9HxEbT1uMmOW_F3YC', + 'version': 'gSDbJoILxmUtGyuobcdjwzbW1OwMfTn4tGGII99MStkC', }, ], - 'condition': 'checkout_android', + 'condition': 'checkout_android and non_git_source', + 'dep_type': 'cipd', + }, + + 'src/android_webview/tools/orderfiles/arm': { + 'packages': [ + { + 'package': 'chromium/android_webview/tools/orderfiles/arm', + 'version': 'NoXyrSZmjQiOEJ02JJaQAqk9Pl1s9S5g2FfqHnpStYEC', + }, + ], + 'condition': 'checkout_android and non_git_source', + 'dep_type': 'cipd', + }, + + 'src/android_webview/tools/orderfiles/arm64': { + 'packages': [ + { + 'package': 'chromium/android_webview/tools/orderfiles/arm64', + 'version': 'uubWWMKj5otPYsGZ4hg9JA2j5ObIlJQ6aGV_Xq-oPFQC', + }, + ], + 'condition': 'checkout_android and non_git_source', 'dep_type': 'cipd', }, 'src/chrome/browser/resources/preinstalled_web_apps/internal': { - 'url': Var('chrome_git') + '/chrome/components/default_apps.git' + '@' + '656ac90405cdbb7d7ab05c54a1628c6d7418832e', + 'url': Var('chrome_git') + '/chrome/components/default_apps.git' + '@' + 'ccb049e460ba89c4a52d672c644a5ce68d9d7c47', 'condition': 'checkout_src_internal', }, - 'src/chrome/installer/mac/third_party/xz/xz': { - 'url': Var('chromium_git') + '/chromium/deps/xz.git' + '@' + '10d236393a338a55830db628356f022a91978b61', - 'condition': 'checkout_mac', - }, - 'src/third_party/compiler-rt/src': Var('chromium_git') + '/external/github.com/llvm/llvm-project/compiler-rt.git' + '@' + @@ -1241,7 +1265,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/updater/chrome_linux64', - 'version': 'version:2@140.0.7273.0', + 'version': 'version:2@143.0.7482.0', }, ], }, @@ -1252,7 +1276,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/updater/chrome_mac_universal', - 'version': 'version:2@140.0.7273.0', + 'version': 'version:2@143.0.7482.0', }, ], }, @@ -1263,7 +1287,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/updater/chrome_mac_universal_prod', - 'version': 'version:2@140.0.7273.0', + 'version': 'version:2@143.0.7482.0', }, ], }, @@ -1274,7 +1298,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/updater/chrome_win_arm64', - 'version': 'version:2@140.0.7273.0', + 'version': 'version:2@143.0.7482.0', }, ], }, @@ -1285,7 +1309,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/updater/chrome_win_x86', - 'version': 'version:2@140.0.7273.0', + 'version': 'version:2@143.0.7482.0', }, ], }, @@ -1296,7 +1320,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/updater/chrome_win_x86_64', - 'version': 'version:2@140.0.7273.0', + 'version': 'version:2@143.0.7482.0', }, ], }, @@ -1374,31 +1398,29 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/updater/chromium_linux64', - 'version': 'version:2@1496001', + 'version': 'version:2@1531012', }, ], }, - # A somewhat recent Chromium-branded updater build. (x86_64) 'src/third_party/updater/chromium_mac_amd64/cipd': { 'dep_type': 'cipd', 'condition': 'checkout_mac', 'packages': [ { 'package': 'chromium/third_party/updater/chromium_mac_amd64', - 'version': 'version:2@1491002', + 'version': 'version:2@1531023', }, ], }, - # A somewhat recent Chromium-branded updater build. (ARM64) 'src/third_party/updater/chromium_mac_arm64/cipd': { 'dep_type': 'cipd', 'condition': 'checkout_mac', 'packages': [ { 'package': 'chromium/third_party/updater/chromium_mac_arm64', - 'version': 'version:2@1490005', + 'version': 'version:2@1531005', }, ], }, @@ -1409,7 +1431,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/updater/chromium_win_arm64', - 'version': 'version:2@1491011', + 'version': 'version:2@1531007', }, ], }, @@ -1420,7 +1442,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/updater/chromium_win_x86', - 'version': 'version:2@1496001', + 'version': 'version:2@1530011', }, ], }, @@ -1431,7 +1453,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/updater/chromium_win_x86_64', - 'version': 'version:2@1496004', + 'version': 'version:2@1531021', }, ], }, @@ -1509,7 +1531,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/enterprise_companion/chromium_linux64', - 'version': 'c-3HHiNKBHRve_MJrrUnwxI5SZ7giWyIaaGJHU8pjTEC', + 'version': 'WpGOxDzvqBA-adGoR7iivQ8xQaw0FlIJy8Mx2CWCidQC', }, ], }, @@ -1520,7 +1542,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/enterprise_companion/chromium_mac_amd64', - 'version': 'ZXik2MzB8S6g1-HZA6oFeGDAt_0wJc8FSis7qRKpkEYC', + 'version': 'tNvNFbHrCm3RgPI0wlhOjhgCiFTBTNtYVw1hyIjxLPoC', }, ], }, @@ -1531,7 +1553,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/enterprise_companion/chromium_mac_arm64', - 'version': 'kPgLQAjvoRkS1vb_CENY8g5YWhaRhSzZyrHyz3GaMF4C', + 'version': 'GhkiBRjUxjrsmiT20Z896CdRfPeounPhkglhrVnrGt0C', }, ], }, @@ -1542,7 +1564,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/enterprise_companion/chromium_win_x86', - 'version': 'YoKJcQ41yn2CLo3UEebIJ6ba7nqV_6EJHRHW3f0FhjAC', + 'version': 'W-bhCuekplPlueBRPZirWFZe0U9A-GP4-_0hQm2Ejz4C', }, ], }, @@ -1553,13 +1575,13 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/enterprise_companion/chromium_win_x86_64', - 'version': 'c6fb8bBjJbS3FTvo7ahNm30kd-zLLc-YO13KTDe60ZcC', + 'version': 'BquwzTZ6YOHbjQZsTgm4BnlrBg_BBtRKmWYV7G0RMBgC', }, ], }, 'src/chrome/test/data/autofill/captured_sites/artifacts': { - 'url': Var('chrome_git') + '/chrome/test/captured_sites/autofill.git' + '@' + '9745df742e0a2875264ac9d0288a7cea4b8124ff', + 'url': Var('chrome_git') + '/chrome/test/captured_sites/autofill.git' + '@' + 'b0e728f524b9fd4ee18392380cc93ce6af8ae48f', 'condition': 'checkout_chromium_autofill_test_dependencies', }, @@ -1589,7 +1611,7 @@ deps = { 'packages': [ { 'package': 'chromium/chrome/test/data/variations/cipd', - 'version': 'JuyQiG_WK-ei7GyfJTjYoEiBh4bmo4lIc8ZFrDUv8t8C', + 'version': 'RGfpCFqfeSnSzZE7otDniidP4VP1WMdbSdtjrtipE74C', }, ], 'dep_type': 'cipd', @@ -1600,21 +1622,21 @@ deps = { 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - '058e9b2aa355eaba5eaf0b2511a814dea5e75a8a', + '4f8b39285db4ffab188af29507991e00f7eea268', 'condition': 'checkout_android and checkout_src_internal', }, 'src/docs/website': { - 'url': Var('chromium_git') + '/website.git' + '@' + 'a89f6810f6a5b0e11e4ec00387e9f97e8f6c23ae', + 'url': Var('chromium_git') + '/website.git' + '@' + '2acb551cf58ff3b6e6a093fe36deb8c625046900', }, 'src/ios/third_party/earl_grey2/src': { - 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + 'd5b5f18f3cf231f3b3c53a898780926aaeed2905', + 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + 'efc198305fac8f39ce2d07b23c5d6200fbc335cf', 'condition': 'checkout_ios', }, 'src/ios/third_party/edo/src': { - 'url': Var('chromium_git') + '/external/github.com/google/eDistantObject.git' + '@' + 'd228369931f0872e32743ca2cbfea72eaf2e44bc', + 'url': Var('chromium_git') + '/external/github.com/google/eDistantObject.git' + '@' + '9c4f9da6e0ee24c206bb33aee884a350ef1e1e77', 'condition': 'checkout_ios', }, @@ -1628,56 +1650,6 @@ deps = { 'condition': 'checkout_ios', }, - 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '266bcd2e07d99bac742fd14f67b8fdc6e26169a5', - 'condition': 'checkout_ios', - }, - - 'src/ios/third_party/material_font_disk_loader_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-foundation/material-font-disk-loader-ios.git' + '@' + '93acc021e3034898716028822cb802a3a816be7e', - 'condition': 'checkout_ios', - }, - - 'src/ios/third_party/material_internationalization_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-foundation/material-internationalization-ios.git' + '@' + '305aa8d276f5137c98c5c1c888efc22e02251ee7', - 'condition': 'checkout_ios', - }, - - 'src/ios/third_party/material_roboto_font_loader_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-foundation/material-roboto-font-loader-ios.git' + '@' + '4be05d4676645febc453a6cde7f5adfb1b785dc1', - 'condition': 'checkout_ios', - }, - - 'src/ios/third_party/material_sprited_animation_view_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-foundation/material-sprited-animation-view-ios.git' + '@' + '8af9adaa182044cf2920dfb620b863669e1aeb7c', - 'condition': 'checkout_ios', - }, - - 'src/ios/third_party/material_text_accessibility_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-foundation/material-text-accessibility-ios.git' + '@' + '8cd910c1c8bbae261ae0d7e873ed96c69a386448', - 'condition': 'checkout_ios', - }, - - 'src/ios/third_party/motion_interchange_objc/src': { - 'url': Var('chromium_git') + '/external/github.com/material-motion/motion-interchange-objc.git' + '@' + '2f8b548f74c52f71d4c2160715a4ba9c887321dd', - 'condition': 'checkout_ios', - }, - - 'src/ios/third_party/motion_animator_objc/src': { - 'url': Var('chromium_git') + '/external/github.com/material-motion/motion-animator-objc.git' + '@' + '296f529321dd7c59c6284c7ccd85dec978c225cc', - 'condition': 'checkout_ios', - }, - - 'src/ios/third_party/motion_transitioning_objc/src': { - 'url': Var('chromium_git') + '/external/github.com/material-motion/motion-transitioning-objc.git' + '@' + '1fe4a9d81433c1d43e54b118f29642e9b233907b', - 'condition': 'checkout_ios', - }, - - 'src/ios/third_party/ochamcrest/src': { - 'url': Var('chromium_git') + '/external/github.com/hamcrest/OCHamcrest.git' + '@' + '92d9c14d13bb864255e65c09383564653896916b', - 'condition': 'checkout_ios', - }, - 'src/ios/third_party/webkit/src': { 'url': Var('chromium_git') + '/external/github.com/WebKit/webkit.git' + '@' + Var('ios_webkit_revision'), @@ -1750,7 +1722,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'IG08WxVoI4_gwNrbpXqXXmytPWFopEI1x0EaFC1KosAC', + 'version': 'tWTAmkk7gDijAsJqxNWEe8RmAUwJsykfb776WP6-lUsC', }, ], 'condition': 'checkout_android and non_git_source', @@ -1758,7 +1730,7 @@ deps = { }, 'src/third_party/androidx_javascriptengine/src': { - 'url': Var('chromium_git') + '/aosp/platform/frameworks/support/javascriptengine/javascriptengine/src.git' + '@' + 'e3b6fc680728040f97442dc29d978ce5df6e76f4', + 'url': Var('chromium_git') + '/aosp/platform/frameworks/support/javascriptengine/javascriptengine/src.git' + '@' + '7539442db1dc790c64d0d9bade922329292d834b', 'condition': 'checkout_android', }, @@ -1777,7 +1749,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_build_tools/aapt2', - 'version': '2Tff49a5dYTM5YvxxqyOsTQ9k8nOqM4ayydbCuKoxIwC', + 'version': 'XqcH9BN43Trcigbh3gSdKc-5OAI-r7MV7wIs5fRXxFMC', }, ], 'condition': 'checkout_android and non_git_source', @@ -1799,7 +1771,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_build_tools/bundletool', - 'version': 'zV93G9_1s5h6x7c2qdcibr0uuQ_5Q2QgcxhkUs9-tOsC', + 'version': 'uOjFFaA5gYLXkFeukj3Xd53BGvMYtkkoDeOO7s3qeyQC', }, ], 'condition': 'checkout_android and non_git_source', @@ -1821,7 +1793,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_build_tools/error_prone', - 'version': '56Xo0VEDkKxzOr5L7pafI6SaIY2S7wnOOcgy4CNSANEC', + 'version': 'ZnLz1dC-SbH89SjE-rqU0M6wP2Dx8ArcXWWyyU45Jy8C', }, ], 'condition': 'checkout_android and non_git_source', @@ -1843,7 +1815,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_build_tools/lint', - 'version': 'AGywP4kNoPZjZa3fVdf1g2cKgEPkXnVFRxhlFjroXJcC', + 'version': '7LpbK-QwQxOOn7upeZRDjXWMwqFVn1j32Cxtf9Db2EoC', }, ], 'condition': 'checkout_android and non_git_source', @@ -1854,7 +1826,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_build_tools/manifest_merger', - 'version': 'K-0K2jznbc6LGEnKhT8NliSShwC43TBuVFZ6gRjOuxgC', + 'version': 'tzUfKDInceWScEFgci-cZSjIUspNPbclS7ACaKCIFf4C', }, ], 'condition': 'checkout_android and non_git_source', @@ -1865,7 +1837,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_build_tools/nullaway', - 'version': 'mFkUqdlIqmMQ3rAaTHFmOBYjNFgFUQOmMlPG6PGgmHYC', + 'version': 'N8e9CN_YH72RHiFh5wTuXkcMtNbQBBrtot_-HePTmAwC', }, ], 'condition': 'checkout_android and non_git_source', @@ -1903,7 +1875,7 @@ deps = { Var('chromium_git') + '/angle/angle.git' + '@' + Var('angle_revision'), 'src/third_party/anonymous_tokens/src': - Var('chromium_git') + '/external/github.com/google/anonymous-tokens.git' + '@' + '50b2ee441f1c3bad73ab7430c41fd1ea5a7a06a6', + Var('chromium_git') + '/external/github.com/google/anonymous-tokens.git' + '@' + '50e04fb27eacd49a5e2bfde5977ac689e13ebeeb', 'src/third_party/blink/renderer/core/css/perftest_data': { 'dep_type': 'gcs', @@ -1977,13 +1949,13 @@ deps = { }, 'src/third_party/readability/src': - Var('chromium_git') + '/external/github.com/mozilla/readability.git' + '@' + '04fd32f72b448c12b02ba6c40928b67e510bac49', + Var('chromium_git') + '/external/github.com/mozilla/readability.git' + '@' + 'd7949dc47dd9ed9ee1d3b34ffdcf3bce28cde435', 'src/third_party/content_analysis_sdk/src': Var('chromium_git') + '/external/github.com/chromium/content_analysis_sdk.git' + '@' + '9a408736204513e0e95dd2ab3c08de0d95963efc', 'src/third_party/dav1d/libdav1d': - Var('chromium_git') + '/external/github.com/videolan/dav1d.git' + '@' + '716164239ad6e6b11c5dcdaa3fb540309d499833', + Var('chromium_git') + '/external/github.com/videolan/dav1d.git' + '@' + 'fcbc3d1b93f91c709293ed9faea8b7cbcac9030b', 'src/third_party/dawn': Var('dawn_git') + '/dawn.git' + '@' + Var('dawn_revision'), @@ -1999,6 +1971,9 @@ deps = { 'src/third_party/google_benchmark/src': Var('chromium_git') + '/external/github.com/google/benchmark.git' + '@' + '761305ec3b33abf30e08d50eb829e19a802581cc', + 'src/third_party/libpfm4/src': + Var('chromium_git') + '/external/git.code.sf.net/p/perfmon2/libpfm4.git' + '@' + '964baf9d35d5f88d8422f96d8a82c672042e7064', + # Download test data for Maps telemetry_gpu_integration_test. 'src/tools/perf/page_sets/maps_perf_test/dataset': { 'dep_type': 'gcs', @@ -2051,7 +2026,7 @@ deps = { # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '3411a369f26bdab1098052dcc0805fe3e1063e4b', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'ba621cbae54044bf342f5d2d8ea9447a3e7120db', 'condition': 'checkout_chromeos', }, @@ -2065,14 +2040,14 @@ deps = { Var('chromium_git') + '/external/github.com/google/cpu_features.git' + '@' + '936b9ab5515dead115606559502e3864958f7f6e', 'src/third_party/cpuinfo/src': - Var('chromium_git') + '/external/github.com/pytorch/cpuinfo.git' + '@' + '33ed0be77d7767d0e2010e2c3cf972ef36c7c307', + Var('chromium_git') + '/external/github.com/pytorch/cpuinfo.git' + '@' + '877328f188a3c7d1fa855871a278eb48d530c4c0', 'src/third_party/crc32c/src': Var('chromium_git') + '/external/github.com/google/crc32c.git' + '@' + 'd3d60ac6e0f16780bcfcc825385e1d338801a558', # For Linux and Chromium OS. 'src/third_party/cros_system_api': { - 'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '07b9fafa3fff468afa2960789d2b28444c38db3e', + 'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '2c31c25519405d3d2b107844fd5e8c8bc397dbf7', 'condition': 'checkout_linux or checkout_chromeos', }, @@ -2083,7 +2058,7 @@ deps = { Var('chromium_git') + '/chromium/web-tests.git' + '@' + Var('crossbench_web_tests_revision'), 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '7d1e2bdb9168718566caba63a170a67cdab2356b', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'e2bb3cd55899346cc68bbfd5139e59c9d85a6984', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -2095,7 +2070,7 @@ deps = { Var('chromium_git') + '/external/github.com/jk-jeon/dragonbox.git' + '@' + '6c7c925b571d54486b9ffae8d9d18a822801cbda', 'src/third_party/eigen3/src': - Var('chromium_git') + '/external/gitlab.com/libeigen/eigen.git' + '@' + '81044ec13df7608d0d9d86aff2ef9805fc69bed1', + Var('chromium_git') + '/external/gitlab.com/libeigen/eigen.git' + '@' + 'cd4f989f8f9288ab5aed1643ecb04c7be021021e', 'src/third_party/emoji-metadata/src': { 'url': Var('chromium_git') + '/external/github.com/googlefonts/emoji-metadata' + '@' + '045f146fca682a836e01cd265171312bfb300e06', @@ -2119,33 +2094,36 @@ deps = { 'src/third_party/fast_float/src': Var('chromium_git') + '/external/github.com/fastfloat/fast_float.git' + '@' + 'cb1d42aaa1e14b09e1452cfdef373d051b8c02a4', + 'src/third_party/federated_compute/src': + Var('chromium_git') + '/external/github.com/google-parfait/federated-compute.git' + '@' + 'e51058dfe7888094ecc09cda38bfceffd4d4664b', + 'src/third_party/ffmpeg': Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + Var('ffmpeg_revision'), 'src/third_party/flac': - Var('chromium_git') + '/chromium/deps/flac.git' + '@' + '689da3a7ed50af7448c3f1961d1791c7c1d9c85c', + Var('chromium_git') + '/chromium/deps/flac.git' + '@' + '807e251d9f8c5dd6059e547931e9c6a4251967af', 'src/third_party/flatbuffers/src': - Var('chromium_git') + '/external/github.com/google/flatbuffers.git' + '@' + '8db59321d9f02cdffa30126654059c7d02f70c32', + Var('chromium_git') + '/external/github.com/google/flatbuffers.git' + '@' + '187240970746d00bbd26b0f5873ed54d2477f9f3', 'src/third_party/fontconfig/src': { - 'url': Var('chromium_git') + '/external/fontconfig.git' + '@' + '86b48ec01ece451d5270d0c5181a43151e45a042', + 'url': Var('chromium_git') + '/external/fontconfig.git' + '@' + 'f0ed9c3f43161d3555f6f7a5234b22fe7ca60727', 'condition': 'checkout_linux', }, 'src/third_party/fp16/src': - Var('chromium_git') + '/external/github.com/Maratyszcza/FP16.git' + '@' + '0a92994d729ff76a58f692d3028ca1b64b145d91', + Var('chromium_git') + '/external/github.com/Maratyszcza/FP16.git' + '@' + '3d2de1816307bac63c16a297e8c4dc501b4076df', 'src/third_party/gemmlowp/src': - Var('chromium_git') + '/external/github.com/google/gemmlowp.git' + '@' + '13d57703abca3005d97b19df1f2db731607a7dc2', + Var('chromium_git') + '/external/github.com/google/gemmlowp.git' + '@' + '16e8662c34917be0065110bfcd9cc27d30f52fdf', 'src/third_party/glib/src': { - 'url': Var('chromium_git') + '/external/gitlab.gnome.org/GNOME/glib.git' + '@' + 'bd40fbba132fb3d6e5d785ae9d2b05a9e0da8409', + 'url': Var('chromium_git') + '/external/gitlab.gnome.org/GNOME/glib.git' + '@' + '354344fe59cc32627c9993b532d633e4ff34920e', 'condition': 'checkout_linux and checkout_mutter', }, 'src/third_party/gvdb/src': { - 'url': Var('chromium_git') + '/external/gitlab.gnome.org/GNOME/gvdb.git' + '@' + 'b54bc5da25127ef416858a3ad92e57159ff565b3', + 'url': Var('chromium_git') + '/external/gitlab.gnome.org/GNOME/gvdb.git' + '@' + '2b42fc75f09dbe1cd1057580b5782b08f2dcb400', 'condition': 'checkout_linux and checkout_mutter', }, @@ -2172,6 +2150,9 @@ deps = { 'src/third_party/emoji-segmenter/src': Var('chromium_git') + '/external/github.com/google/emoji-segmenter.git' + '@' + Var('emoji_segmenter_revision'), + 'src/third_party/oak/src': + Var('chromium_git') + '/external/github.com/project-oak/oak.git' + '@' + '96c00a6c99ac382f3f3a8f376bc7a70890d1adaa', + 'src/third_party/ots/src': Var('chromium_git') + '/external/github.com/khaledhosny/ots.git' + '@' + Var('ots_revision'), @@ -2197,7 +2178,7 @@ deps = { }, 'src/third_party/cardboard/src' : { - 'url': Var('chromium_git') + '/external/github.com/googlevr/cardboard/' + '@' + '8cc8ab8153e82367e32e168a93dd7ec9d6b4509a', + 'url': Var('chromium_git') + '/external/github.com/googlevr/cardboard/' + '@' + '02708c9018d5b7976dd87412be5b916dce379c53', 'condition': 'checkout_android', }, @@ -2235,7 +2216,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/google-java-format', - 'version': 'AQn4F5NfPAs_GKX-z3OW_Q7-yJ9N6tPrDnmnDScjkTEC', + 'version': 'vwy9yNEcAztEM-pQboJifH7_IPdxc5LkhQZMp2XKQ-UC', }, ], # Needed on Linux for use on chromium_presubmit. @@ -2258,7 +2239,7 @@ deps = { Var('chromium_git') + '/chromium/deps/hunspell_dictionaries.git' + '@' + '41cdffd71c9948f63c7ad36e1fb0ff519aa7a37e', 'src/third_party/icu': - Var('chromium_git') + '/chromium/deps/icu.git' + '@' + '1b2e3e8a421efae36141a7b932b41e315b089af8', + Var('chromium_git') + '/chromium/deps/icu.git' + '@' + 'a86a32e67b8d1384b33f8fa48c83a6079b86f8cd', 'src/third_party/icu4j/cipd': { 'packages': [ @@ -2325,7 +2306,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/kotlin_stdlib', - 'version': 'jHhaILmhjHo4cYTvCdIRMwWPOAGSwjhEtrMxwREj52gC', + 'version': 'esT2TqwXCbzTh62GRjh1cINKATy_tbHQeETS6uQ_9UUC', }, ], 'condition': 'checkout_android and non_git_source', @@ -2336,7 +2317,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/kotlinc', - 'version': 'clr2_okgxf1Zih4H2dIOKUWGJhrBo7fj3ZZ6nKV0dJIC', + 'version': 'XGFOIJ4vXF3daPfTEerI0Uhn3bM9mYPBrx6bygQVNQkC', }, ], 'condition': 'checkout_android and non_git_source', @@ -2359,7 +2340,7 @@ deps = { Var('chromium_git') + '/external/libaddressinput.git' + '@' + '2610f7b1043d6784ada41392fc9392d1ea09ea07', 'src/third_party/libaom/source/libaom': - Var('aomedia_git') + '/aom.git' + '@' + 'e91b7aa26d6d0979bba2bee5e1c27a7a695e0226', + Var('aomedia_git') + '/aom.git' + '@' + '93233d27eb23ac3f1f13da1b19c5380bacc75baa', 'src/third_party/crabbyavif/src': Var('chromium_git') + '/external/github.com/webmproject/CrabbyAvif.git' + '@' + Var('crabbyavif_revision'), @@ -2437,7 +2418,7 @@ deps = { # The library for IPP protocol (Chrome OS). 'src/third_party/libipp/libipp': { - 'url': Var('chromium_git') + '/chromiumos/platform2/libipp.git' + '@' + '2209bb84a8e122dab7c02fe66cc61a7b42873d7f', + 'url': Var('chromium_git') + '/chromiumos/platform2/libipp.git' + '@' + '4be5f77f672a3a9f1bbf3c935fb0ea8b3f86ce61', 'condition': 'checkout_linux', }, @@ -2460,12 +2441,12 @@ deps = { # Android Explicit Synchronization. 'src/third_party/libsync/src': { - 'url': Var('chromium_git') + '/aosp/platform/system/core/libsync.git' + '@' + 'f4f4387b6bf2387efbcfd1453af4892e8982faf6', + 'url': Var('chromium_git') + '/aosp/platform/system/core/libsync.git' + '@' + 'd29ac04dc81e6b072c091c5b1342a282765ea250', 'condition': 'checkout_linux or checkout_android', }, 'src/third_party/libunwindstack': { - 'url': Var('chromium_git') + '/chromium/src/third_party/libunwindstack.git' + '@' + '68973d9d4690b905cab27a553a0892868b697e4a', + 'url': Var('chromium_git') + '/chromium/src/third_party/libunwindstack.git' + '@' + '0928ad0d25e4af07c8be5ab06d0ca584f9f4ceb5', 'condition': 'checkout_android', }, @@ -2473,16 +2454,16 @@ deps = { Var('chromium_git') + '/chromiumos/platform/libva-fake-driver.git' + '@' + 'a9bcab9cd6b15d4e3634ca44d5e5f7652c612194', 'src/third_party/libvpx/source/libvpx': - Var('chromium_git') + '/webm/libvpx.git' + '@' + 'a985e5e847a2fe69bef3e547cf25088132194e39', + Var('chromium_git') + '/webm/libvpx.git' + '@' + '4c1801be20dd53900d2a7cd74f6fc91a9ae353be', 'src/third_party/libwebm/source': Var('chromium_git') + '/webm/libwebm.git' + '@' + 'f2a982d748b80586ae53b89a2e6ebbc305848b8c', 'src/third_party/libwebp/src': - Var('chromium_git') + '/webm/libwebp.git' + '@' + '4fa21912338357f89e4fd51cf2368325b59e9bd9', + Var('chromium_git') + '/webm/libwebp.git' + '@' + 'c00d83f6642e7838a12bb03bca94237f03cc2e00', 'src/third_party/libyuv': - Var('chromium_git') + '/libyuv/libyuv.git' + '@' + 'cdd3bae84818e78466fec1ce954eead8f403d10c', + Var('chromium_git') + '/libyuv/libyuv.git' + '@' + '900da61d3cadba86ec593c8226de736b5e6b2c43', 'src/third_party/lighttpd': { 'url': Var('chromium_git') + '/chromium/deps/lighttpd.git' + '@' + Var('lighttpd_revision'), @@ -2498,7 +2479,7 @@ deps = { 'packages': [ { 'package': 'infra/3pp/tools/7z/${{platform}}', - 'version': 'version:3@24.09', + 'version': 'version:3@25.01', }, ], 'condition': 'checkout_win', @@ -2509,7 +2490,7 @@ deps = { 'packages': [ { 'package': 'infra/3pp/tools/7z/windows-amd64', - 'version': 'version:3@24.09', + 'version': 'version:3@25.01', }, ], 'condition': 'checkout_win', @@ -2531,6 +2512,11 @@ deps = { 'condition': 'checkout_win', }, + 'src/third_party/microsoft_webauthn/src': { + 'url': Var('chromium_git') + '/external/github.com/microsoft/webauthn.git' + '@' + 'c3ed95fd7603441a0253c55c14e79239cb556a9f', + 'condition': 'checkout_win', + }, + 'src/third_party/mig/bin': { 'packages': [ { @@ -2549,7 +2535,7 @@ deps = { }, 'src/third_party/mutter/src': { - 'url': Var('chromium_git') + '/external/gitlab.gnome.org/GNOME/mutter.git' + '@' + 'e99ff5359c4134093efe3cb2aa208e4addf565c6', + 'url': Var('chromium_git') + '/external/gitlab.gnome.org/GNOME/mutter.git' + '@' + '7c88672bfc702f7d47c6b3755147fbeb859391af', 'condition': 'checkout_linux and checkout_mutter', }, @@ -2584,7 +2570,7 @@ deps = { 'src/third_party/siso/cipd': { 'packages': [ { - 'package': 'infra/build/siso/${{platform}}', + 'package': 'build/siso/${{platform}}', 'version': Var('siso_version'), } ], @@ -2596,7 +2582,7 @@ deps = { Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '652bdb7719f30b52b08e506645a7322ff1b2cc6f', 'src/third_party/openscreen/src': - Var('chromium_git') + '/openscreen' + '@' + 'f51be2dd676c855bc588a439f002bc941b87db6b', + Var('chromium_git') + '/openscreen' + '@' + '279b21edd27132609d2f46b702c42455ea05c4a8', 'src/third_party/openxr/src': { 'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '57572a0e91890fe7183de25a62153aec955d64ba', @@ -2622,7 +2608,7 @@ deps = { Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '4ab725613a8ee64e9acd7930eceb8995e24df562', + Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + 'ac7792a0f3f1cbfffb071e8b97cd9a5168900e03', 'src/base/tracing/test/data': { 'bucket': 'perfetto', @@ -2763,10 +2749,10 @@ deps = { }, 'src/third_party/protobuf-javascript/src': - Var('chromium_git') + '/external/github.com/protocolbuffers/protobuf-javascript' + '@' + '28bf5df73ef2f345a936d9cc95d64ba8ed426a53', + Var('chromium_git') + '/external/github.com/protocolbuffers/protobuf-javascript' + '@' + 'e6d763860001ba1a76a63adcff5efb12b1c96024', 'src/third_party/pthreadpool/src': - Var('chromium_git') + '/external/github.com/google/pthreadpool.git' + '@' + '149f0a86f5ad215e9f0441684385ce09f345dbe4', + Var('chromium_git') + '/external/github.com/google/pthreadpool.git' + '@' + '0e6ca13779b57d397a5ba6bfdcaa8a275bc8ea2e', # Dependency of skia. 'src/third_party/pyelftools': { @@ -2775,7 +2761,7 @@ deps = { }, 'src/third_party/quic_trace/src': - Var('chromium_git') + '/external/github.com/google/quic-trace.git' + '@' + 'ed3deb8a056b260c59f2fd42af6dfa3db48a8cad', + Var('chromium_git') + '/external/github.com/google/quic-trace.git' + '@' + 'e5c4ef17d934e078644e65d667ca6d86fe020d49', 'src/third_party/pywebsocket3/src': Var('chromium_git') + '/external/github.com/GoogleChromeLabs/pywebsocket3.git' + '@' + '50602a14f1b6da17e0b619833a13addc6ea78bc2', @@ -2793,13 +2779,13 @@ deps = { }, 'src/third_party/re2/src': - Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + '8451125897dd7816a5c118925e8e42309d598ecc', + Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + '61c4644171ee6b480540bf9e569cba06d9090b4b', 'src/third_party/r8/cipd': { 'packages': [ { 'package': 'chromium/third_party/r8', - 'version': 'qD5apdNjxRv3dBblf27nEZYf7r_pbLEgfN7hWyXvP_UC', + 'version': 'AYeAI5FH_WyqBwnhCmq8W1k-pGRyIkxmRN7PbMErE7EC', }, ], 'condition': 'checkout_android and non_git_source', @@ -2813,7 +2799,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/r8', - 'version': 'qD5apdNjxRv3dBblf27nEZYf7r_pbLEgfN7hWyXvP_UC', + 'version': '-6wE71EEpsUvYcBQRAIpTvt2tKtlnLuF7d_iuEH8JmEC', }, ], 'condition': 'checkout_android and non_git_source', @@ -2829,7 +2815,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/robolectric', - 'version': 'G3VkWqTv1YWDvC6zCrL34iQREzrzdBmSL4GMboAIiAEC', + 'version': 'dr-aJxRAPYDTBJXnjfht-bdxyywD6BP1lrcjZZPnRG0C', }, ], 'condition': 'checkout_android and non_git_source', @@ -2840,10 +2826,10 @@ deps = { Var('chromium_git') + '/external/github.com/google/ruy.git' + '@' + '9940fbf1e0c0863907e77e0600b99bb3e2bc2b9f', 'src/third_party/search_engines_data/resources': - Var('chromium_git') + '/external/search_engines_data.git' + '@' + '5c5db51f8c13cb42379d8b333890971f1a1a1797', + Var('chromium_git') + '/external/search_engines_data.git' + '@' + '94eb2a9a225078cb5f40e82fd890bce387c8121a', 'src/third_party/search_engines_data/resources_internal': { - 'url': Var('chrome_git') + '/external/search_engines_data_internal.git' + '@' + '755c49d2ec005159a2f413f4cd5cda0598bcb555', + 'url': Var('chrome_git') + '/external/search_engines_data_internal.git' + '@' + 'ab395ff6dac9f780c2cb6474ff42017a334b0725', 'condition': 'checkout_src_internal', }, @@ -2857,7 +2843,7 @@ deps = { Var('chromium_git') + '/external/github.com/google/snappy.git' + '@' + '32ded457c0b1fe78ceb8397632c416568d6714a0', 'src/third_party/sqlite/src': - Var('chromium_git') + '/chromium/deps/sqlite.git' + '@' + 'cc08c79629643fdd5b592f1391e738815f5577b6', + Var('chromium_git') + '/chromium/deps/sqlite.git' + '@' + '7d348fc79216a09b864ff881d8561a6222301666', 'src/third_party/sqlite4java/cipd': { 'packages': [ @@ -2876,10 +2862,10 @@ deps = { 'bucket': 'chromium-ads-detection', 'objects': [ { - 'object_name': '2e9b747b519d133c2cb0ef7f10119b7b023533363db30ef45c93bdeaf6dbc57e', - 'sha256sum': '2e9b747b519d133c2cb0ef7f10119b7b023533363db30ef45c93bdeaf6dbc57e', - 'size_bytes': 79185, - 'generation': 1744292578626605, + 'object_name': '9ee02112c411bb6fccc0e6d75d9d8c6f4867ce500f4358d0dfb2d83e37f26e44', + 'sha256sum': '9ee02112c411bb6fccc0e6d75d9d8c6f4867ce500f4358d0dfb2d83e37f26e44', + 'size_bytes': 82801, + 'generation': 1758805463370287, 'output_file': 'UnindexedRules', }, ], @@ -2928,36 +2914,36 @@ deps = { Var('chromium_git') + '/external/github.com/GoogleChromeLabs/text-fragments-polyfill.git' + '@' + 'c036420683f672d685e27415de0a5f5e85bdc23f', 'src/third_party/tflite/src': - Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + 'fe38b1b8c23d86ed93c13ef367b19496e398462d', + Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + '5fcf510a862fb6d3c0d34906044389095a180ff6', 'src/third_party/turbine/cipd': { 'packages': [ { 'package': 'chromium/third_party/turbine', - 'version': 'TkTaFqF4Bs-JmFtxFV_Nfh4u5jh_401ZQsLhC7vIEqQC', + 'version': 'EHj3lVL72PrpZUDnsWnaS5rdJuF5o1QYrJ7CUhO3MIEC', }, ], 'condition': 'checkout_android and non_git_source', 'dep_type': 'cipd', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@c466059b72815c7fbce8bb3ab4832407aabc5dc5', - 'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@38f6708b6b6f213010c51ffa8f577a7751e12ce7', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@224a52b06d0e019c7f7c006c2306de095207f77f', + 'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@36b4d078576ad465e85b4b0502695ac5f3edb2e6', 'src/third_party/spirv-cross/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3', - 'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@97e96f9e9defeb4bba3cfbd034dec516671dd7a3', - 'src/third_party/spirv-tools/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@3aeaaa088d37b86cff036eee1a9bf452abad7d9d', - 'src/third_party/vulkan-headers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Headers@a01329f307fa6067da824de9f587f292d761680b', - 'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@f2389e27734347c1d9f40e03be53f69f969976b1', - 'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@f766b30b2de3ffe2cf6b656d943720882617ec58', - 'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@b0a40d2e50310e9f84327061290a390a061125a3', - 'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@6b1b8e3d259241a68c0944ca0a7bb5320d086191', + 'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@6bb105b6c4b3a246e1e6bb96366fe14c6dbfde83', + 'src/third_party/spirv-tools/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@05b0ab1253db43c3ea29efd593f3f13dfa621ab1', + 'src/third_party/vulkan-headers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Headers@df274657d83f3bd8c77aef816c1cbf27352a948b', + 'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@e1cad037970cfeeb86051c49d00ead75311acbec', + 'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@7f6326618226225269a274869ac638b870c8fe2b', + 'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@ea43e2f5e51e9ad958a40fdce981f2f0abf09cb5', + 'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@0cb2d651931455e44aa898585d7d78a9d90d31c5', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'cb0597213b0fcb999caa9ed08c2f88dc45eb7d50', # Display server protocol for Linux. 'src/third_party/wayland/src': { - 'url': Var('chromium_git') + '/external/anongit.freedesktop.org/git/wayland/wayland.git' + '@' + 'a156431ea66fe67d69c9fbba8a8ad34dabbab81c', + 'url': Var('chromium_git') + '/external/anongit.freedesktop.org/git/wayland/wayland.git' + '@' + '736d12ac67c20c60dc406dc49bb06be878501f86', 'condition': 'checkout_linux', }, @@ -2987,13 +2973,13 @@ deps = { Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'c01b768bce4a143e152c1870b6ba99ea6267d2b0', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '07f4412e935c988d60fad2e373287d6450bcd231', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'eefe6f33964beec1bd1534b1d9065ad027b71740', 'src/third_party/webpagereplay': Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'), 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '36ea4535a500ac137dbf1f577ce40dc1aaa774ef', + Var('webrtc_git') + '/src.git' + '@' + '1788a81407183acc98163a4e1507c5c63fb175cc', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -3017,7 +3003,7 @@ deps = { }, 'src/third_party/xnnpack/src': - Var('chromium_git') + '/external/github.com/google/XNNPACK.git' + '@' + 'ae40b1a2d93d5c516bc7657c6c3eea1470f917ae', + Var('chromium_git') + '/external/github.com/google/XNNPACK.git' + '@' + '98a027498845d3e2acd0e983fff6950714edbfc2', 'src/third_party/libei/cipd': { @@ -3033,13 +3019,13 @@ deps = { }, 'src/third_party/zstd/src': - Var('chromium_git') + '/external/github.com/facebook/zstd.git' + '@' + 'f9938c217da17ec3e9dcd2a2d99c5cf39536aeb9', + Var('chromium_git') + '/external/github.com/facebook/zstd.git' + '@' + '89d685e42dbcf815a16ed0fcd7d050ef74ccad96', 'src/tools/skia_goldctl/linux': { 'packages': [ { 'package': 'skia/tools/goldctl/linux-amd64', - 'version': 'UePaQAmB4znC2DdGIm_DqUAEKytlOUofw0oMO0VhStcC', + 'version': 'C5hH7dYQuO3062SszdksQtirJFjAzexwuqjacLReHyQC', }, ], 'dep_type': 'cipd', @@ -3049,7 +3035,7 @@ deps = { 'packages': [ { 'package': 'skia/tools/goldctl/windows-amd64', - 'version': 'Y69lYD2QQGCN58_A0A21UHInQVZU2kWqKStG-ls-4NkC', + 'version': '3tkvtWdcjusN9sXn1ults600IvgJpTjBNuxwh3r1NcAC', }, ], 'dep_type': 'cipd', @@ -3060,7 +3046,7 @@ deps = { 'packages': [ { 'package': 'skia/tools/goldctl/mac-amd64', - 'version': 'RVm2d4iM3iQFkXafgLvvzi3KHIq_qhFWz3dNRFhamowC', + 'version': 'ELnDSBvrr14Qkz-HoQRVBRStEd1HvpLZF0VsGlKlnoUC', }, ], 'dep_type': 'cipd', @@ -3071,7 +3057,7 @@ deps = { 'packages': [ { 'package': 'skia/tools/goldctl/mac-arm64', - 'version': 'X4Xi1f4spVZ7l32U7eqx8LghvrWxh_NLSkTB_hqW3s4C', + 'version': 'pPhabi_-RX35tyLwh2GfIkvqryBCG3ZoPUSU2gaTQJQC', }, ], 'dep_type': 'cipd', @@ -3111,11 +3097,22 @@ deps = { 'dep_type': 'cipd', }, + 'src/ash/webui/boca_receiver_app_ui/resources/prod': { + 'packages': [ + { + 'package': 'chromeos_internal/apps/boca_receiver_app/app', + 'version': 'psFKAJHEEkLlJzEejMqOUUnlaRx7HyyMxHagxB09wuIC', + }, + ], + 'condition': 'checkout_chromeos and checkout_src_internal', + 'dep_type': 'cipd', + }, + 'src/ash/webui/boca_ui/resources/prod': { 'packages': [ { 'package': 'chromeos_internal/apps/boca_app/app', - 'version': 'xgl9jD_VmFlx7HFsx-IJAklV9b1882ggreXnX68nO8UC', + 'version': 'Zc5ggKwAzyXV7Agq1HDwkTmSuMOzjNW8eFjL-WLisYYC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3126,7 +3123,7 @@ deps = { 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': '7oDf3Vb5wiSo2ExFDfRhzhQl3wy6NovGkb4sDhyL6SEC', + 'version': 'rFYqr_DWSYbcPMYr4vQ3u6h6rWUDOvHgg1uliEbVDJ4C', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3137,7 +3134,7 @@ deps = { 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'FZZmilEd8YefiVLFtQBMp6iQXZ02wJlgbb-z_9YLoDwC', + 'version': 'TZYGhdiPwjlPK086Va-jS-uspsKZi_cqT_z7rX0zXpMC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3170,7 +3167,7 @@ deps = { 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': '9D7jzzfEqOgiQNDU6Y_WiKzlO4Upjb94bUfDQ6Kjje0C', + 'version': 'fZcOvxGhkY2ZLNOJRH-9lUwwvEEKa1atAmbO9VKzeOkC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3197,7 +3194,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/autorolled', - 'version': 'RcN7kx5OuQtBLrhCRBTO9NABzT2sjw-ogJBZmT3nOdAC', + 'version': 'd4jkY2eRYuH_OxLvxrLVxmeygXTxjhlJvxCNe59y-I0C', }, ], 'condition': 'checkout_android and non_git_source', @@ -3210,7 +3207,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_support_annotations', - 'version': 'version:2@28.0.0.cr1', + 'version': 'version:2@28.0.0.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3221,7 +3218,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_tools_common', - 'version': 'version:2@30.2.0-beta01.cr1', + 'version': 'version:2@30.2.0-beta01.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3232,7 +3229,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api', - 'version': 'version:2@30.2.0-beta01.cr1', + 'version': 'version:2@30.2.0-beta01.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3243,7 +3240,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_tools_sdk_common', - 'version': 'version:2@30.2.0-beta01.cr1', + 'version': 'version:2@30.2.0-beta01.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3254,18 +3251,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_apps_common_testing_accessibility_framework_accessibility_test_framework', - 'version': 'version:2@4.0.0.cr1', - }, - ], - 'condition': 'checkout_android and non_git_source', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/cipd/libs/com_google_ar_impress': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_google_ar_impress', - 'version': 'version:2@0.0.3.cr1', + 'version': 'version:2@4.0.0.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3276,7 +3262,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils', - 'version': 'version:2@1.3.0.cr1', + 'version': 'version:2@1.3.0.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3287,7 +3273,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_squareup_javapoet', - 'version': 'version:2@1.13.0.cr1', + 'version': 'version:2@1.13.0.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3298,7 +3284,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/net_bytebuddy_byte_buddy', - 'version': 'version:2@1.14.12.cr1', + 'version': 'version:2@1.17.6.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3309,7 +3295,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/net_bytebuddy_byte_buddy_agent', - 'version': 'version:2@1.14.12.cr1', + 'version': 'version:2@1.17.6.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3320,7 +3306,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup', - 'version': 'version:2@1.2.1.cr1', + 'version': 'version:2@1.2.1.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3331,7 +3317,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_checkerframework_checker_compat_qual', - 'version': 'version:2@2.5.5.cr1', + 'version': 'version:2@2.5.5.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3342,7 +3328,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_android_extensions_runtime', - 'version': 'version:2@1.9.22.cr1', + 'version': 'version:2@1.9.22.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3353,7 +3339,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_parcelize_runtime', - 'version': 'version:2@1.9.22.cr1', + 'version': 'version:2@1.9.22.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3364,7 +3350,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_atomicfu_jvm', - 'version': 'version:2@0.23.2.cr1', + 'version': 'version:2@0.23.2.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3375,7 +3361,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_guava', - 'version': 'version:2@1.8.1.cr1', + 'version': 'version:2@1.8.1.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3386,7 +3372,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_jsoup_jsoup', - 'version': 'version:2@1.15.1.cr1', + 'version': 'version:2@1.15.1.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3397,7 +3383,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_mockito_mockito_android', - 'version': 'version:2@5.11.0.cr1', + 'version': 'version:2@5.19.0.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3408,7 +3394,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_mockito_mockito_core', - 'version': 'version:2@5.11.0.cr1', + 'version': 'version:2@5.19.0.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3419,7 +3405,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_mockito_mockito_subclass', - 'version': 'version:2@5.11.0.cr1', + 'version': 'version:2@5.19.0.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3430,7 +3416,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_objenesis_objenesis', - 'version': 'version:2@3.3.cr1', + 'version': 'version:2@3.3.cr2', }, ], 'condition': 'checkout_android and non_git_source', @@ -3459,7 +3445,7 @@ deps = { 'src/chromeos/assistant/internal': { 'url': Var('chrome_git') + '/chrome/assistant.git' + '@' + - '7333fc7271a9c673862fcc3b5fd5d054d2e2ab30', + '1929b1906442b7b8d3fd5fffafe2ffbb9e395f13', 'condition': 'checkout_src_internal and checkout_chromeos', }, @@ -3487,19 +3473,25 @@ deps = { 'src/chrome/app/theme/default_100_percent/google_chrome': { 'url': Var('chrome_git') + '/chrome/theme/default_100_percent/google_chrome.git' + '@' + - 'e080feee1bd6b3ac5ccff65059ac093f7d46ad08', + '662d6ea16a230560e47522daa2dc12497beb5157', 'condition': 'checkout_src_internal', }, 'src/chrome/app/theme/default_200_percent/google_chrome': { 'url': Var('chrome_git') + '/chrome/theme/default_200_percent/google_chrome.git' + '@' + - '252c8851666cf517fa400ef87ff00d02eae3ee49', + 'ff9817fe7776a144405959f00fcaf2b1add3154d', 'condition': 'checkout_src_internal', }, 'src/chrome/app/theme/google_chrome': { 'url': Var('chrome_git') + '/chrome/theme/google_chrome.git' + '@' + - '8ff03bae520c6e903303c736c4c92ed807ce746c', + 'a05b44dab1c393652a5cfbcfd72c71f101076666', + 'condition': 'checkout_src_internal', + }, + + 'src/chrome/browser/actor/resources/internal': { + 'url': Var('chrome_git') + '/chrome/browser/actor/resources/internal.git' + '@' + + '7196ce812d7488380c95e2140655a92acd20c208', 'condition': 'checkout_src_internal', }, @@ -3511,13 +3503,13 @@ deps = { 'src/chrome/browser/glic/resources/internal': { 'url': Var('chrome_git') + '/chrome/browser/glic/resources/internal.git' + '@' + - '4bb714b15246ed0def1ab198f746637a926507ab', + '259f573cb2fd11181fe5477dd8142cfc02861268', 'condition': 'checkout_src_internal', }, 'src/chrome/browser/glic/e2e_test/internal': { 'url': Var('chrome_git') + '/chrome/browser/glic/test/internal.git' + '@' + - 'f27c9a46ebb7c3a2e484de830a1094c033e4a781', + 'f91c1cd6e06d7a93ff83265d2e7af48efd097a5c', 'condition': 'checkout_glic_e2e_tests', }, @@ -3529,7 +3521,7 @@ deps = { 'src/chrome/browser/internal': { 'url': Var('chrome_git') + '/chrome/browser_internal.git' + '@' + - '8cb067a9ea39c3b7f38bad55e4e5e8818319d0b7', + '2065c47f646d9e0cf4cbbc1774e86aa1b4223308', 'condition': 'checkout_src_internal', }, @@ -3547,7 +3539,7 @@ deps = { 'src/chrome/browser/platform_experience/win': { 'url': Var('chrome_git') + '/chrome/browser/platform_experience/win.git' + '@' + - 'e913d6144929b67b0123235efc020a1bb138c8ae', + 'e2eaaff5b9825bcc6aaf541caa1223a0857a7a0b', 'condition': 'checkout_src_internal', }, @@ -3559,7 +3551,7 @@ deps = { 'src/chrome/browser/resources/settings/internal': { 'url': Var('chrome_git') + '/chrome/browser/resources/settings_internal.git' + '@' + - '3626fa13752d21303b9b1a4546251bf0d187d0c9', # from svn revision 41419 + '27f38f851b668d7488dc35c41190c855fad3b770', 'condition': 'checkout_src_internal', }, @@ -3588,13 +3580,13 @@ deps = { 'src/chrome/common/request_header_integrity/internal': { 'url': Var('chrome_git') + '/chrome/browser/request_header_integrity/internal.git' + '@' + - '1592aa7ba598a048f918f54735bcf056556532c3', + 'f8540e200327c806b7434d1e6632bfd3f3673de8', 'condition': 'checkout_src_internal', }, 'src/chrome/elevation_service/internal': { 'url': Var('chrome_git') + '/chrome/elevation_service/internal.git' + '@' + - 'dbffd67b918c1d5b5657e8a4dfd10ee66b57bf48', + 'd4c05f706c5411195290a7622a1e6e8a4dc9fdad', 'condition': 'checkout_src_internal and checkout_win', }, @@ -3602,7 +3594,7 @@ deps = { # grepping. 'src/chrome/installer/mac/internal': { 'url': Var('chrome_git') + '/chrome/installer/mac/internal.git' + '@' + - '4fe3a76d806edba77d8a7ad2eefbcd37aab5192d', + '27b07a5c4a105a8b4508c61bc9aa6dc52b519907', 'condition': 'checkout_src_internal', }, @@ -3661,7 +3653,7 @@ deps = { 'src/chrome/updater/internal': { 'url': Var('chrome_git') + '/chrome/updater/internal.git' + '@' + - '9ae52b67200db02d7d35d2712602c820cee7dea6', + 'db5d0ba0230a45fd9b60e140b553aebb121ee31b', 'condition': 'checkout_src_internal', }, @@ -3673,7 +3665,7 @@ deps = { 'src/components/autofill/core/browser/form_parsing/internal_resources': { 'url': Var('chrome_git') + '/chrome/components/autofill_regex_patterns.git' + '@' + - 'ed7f0491fbc53c40b38ce100a091e278161091af', + '6f86f36a3644f55f31d29931210f822523ddf2c5', 'condition': 'checkout_src_internal', }, @@ -3696,11 +3688,11 @@ deps = { 'src/components/optimization_guide/internal': { 'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' + - '64b5a77344ec61457e9cceb839bf321b15f62ae1', + 'cd0f7ec848187ab28b99430205f0bb1181055779', 'condition': 'checkout_src_internal', }, - 'src/components/plus_addresses/resources/internal': { + 'src/components/plus_addresses/core/browser/resources/internal': { 'url': Var('chrome_git') + '/chrome/components/plus_addresses/resources.git' + '@' + '32ee8b65a346a72e8692d112ba9304d6344e3dd6', 'condition': 'checkout_src_internal', @@ -3708,19 +3700,25 @@ deps = { 'src/components/resources/default_100_percent/google_chrome': { 'url': Var('chrome_git') + '/chrome/components/default_100_percent/google_chrome.git' + '@' + - '4dabaf9b4a44b5119cbd0faf57fa9817b490c1a7', + '4efb110be77e43a4122267d5a16ef2d8476c6ae1', 'condition': 'checkout_src_internal', }, 'src/components/resources/default_200_percent/google_chrome': { 'url': Var('chrome_git') + '/chrome/components/default_200_percent/google_chrome.git' + '@' + - '5cd384925e31476b42b7c547ec1abde0153da4b3', + '57d3e874224b4f68285c7c86162756d28a65561c', 'condition': 'checkout_src_internal', }, 'src/components/resources/default_300_percent/google_chrome': { 'url': Var('chrome_git') + '/chrome/components/default_300_percent/google_chrome.git' + '@' + - '0ec8b9207d4a8df4d1475ba75b6ea10a39c730d6', + '58ffc3d135697ec897a39746a0462ada30d4dd7d', + 'condition': 'checkout_src_internal', + }, + + 'src/components/safe_browsing/internal': { + 'url': Var('chrome_git') + '/chrome/components/safe_browsing/internal.git' + '@' + + 'a4e5252de8a9fb866cd79a3616ed638887b943bd', 'condition': 'checkout_src_internal', }, @@ -3732,7 +3730,7 @@ deps = { 'src/components/test/data/autofill/heuristics-json/internal': { 'url': Var('chrome_git') + '/chrome/test/autofill/structured_forms.git' + '@' + - '58d69fdc487903ff0e57a56bd3bbdffd37e6f658', + 'd04a4dddd1b46ddd96ecf68855a73d0ae4d5ecc3', 'condition': 'checkout_chromium_autofill_test_dependencies', }, @@ -3744,7 +3742,7 @@ deps = { 'src/components/vector_icons/google_chrome': { 'url': Var('chrome_git') + '/chrome/vector_icons/google_chrome.git' + '@' + - '3d3b47ae1125a3e622a7b33ea7810c2bb83d39f1', + 'fbe6f288c8400579d15a7470650d205d9d1b884c', 'condition': 'checkout_src_internal', }, @@ -3762,7 +3760,7 @@ deps = { 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - 'e9c94631ae7b5f50ff1d7ef43a40778f0f34f322', + 'ffc0b438d50c7fc23c5e723a2925a74b57e6c8ce', 'condition': 'checkout_ios and checkout_src_internal', }, @@ -3774,7 +3772,7 @@ deps = { 'src/remoting/internal': { 'url': Var('chrome_git') + '/chrome/remoting/internal.git' + '@' + - '163d23002136b8aac8a46ea4045f0f9c41058c87', + '28b5b9cecb76d936f1f6d4182fa4671f845a74a9', 'condition': 'checkout_src_internal', }, @@ -3792,7 +3790,7 @@ deps = { 'src/services/shape_detection/internal': { 'url': Var('chrome_git') + '/chrome/services/shape_detection.git' + '@' + - 'b048cee6b7831af7bca5d25a74419f59a29f691f', + 'c56fb8783131945365a2ec6a52f3fb8c57a8e8d3', 'condition': 'checkout_src_internal', }, @@ -3921,19 +3919,19 @@ deps = { 'src/third_party/widevine/cdm/linux': { 'url': Var('chrome_git') + '/chrome/deps/widevine/cdm/linux.git' + '@' + - 'acdae03333e2a0da65745b30f6764f06eec655e4', + '71190e44ea5a6dbcb1e7fe2518210fb76c7c42ca', 'condition': 'checkout_linux and checkout_src_internal', }, 'src/third_party/widevine/cdm/mac': { 'url': Var('chrome_git') + '/chrome/deps/widevine/cdm/mac.git' + '@' + - '6d4742c1d3197bd3e8d5884f8620286bd3ac89be', + '31701813d35bec49eaf6f5fa13171c1ae4dbd19b', 'condition': 'checkout_mac and checkout_src_internal', }, 'src/third_party/widevine/cdm/win': { 'url': Var('chrome_git') + '/chrome/deps/widevine/cdm/win.git' + '@' + - '5a5f896c36cbf8708705f5fbfcc6427a73e7551a', + '1fcfc9e692ff515406662da8759cf745d6f7cc74', 'condition': 'checkout_win and checkout_src_internal', }, @@ -4035,6 +4033,7 @@ include_rules = [ '-third_party/abseil-cpp/absl/functional/bind_front.h', '-third_party/abseil-cpp/absl/functional/function_ref.h', '-third_party/abseil-cpp/absl/hash', + '+third_party/abseil-cpp/absl/hash/hash_testing.h', '-third_party/abseil-cpp/absl/log', '-third_party/abseil-cpp/absl/random', '-third_party/abseil-cpp/absl/status/statusor.h', @@ -4126,6 +4125,7 @@ hooks = [ 'src/third_party/test_fonts/test_fonts.tar.gz', # Remove after 20240901 'src/third_party/node/node_modules.tar.gz', # TODO: Remove after 20241201, see https://crbug.com/351092787 'src/third_party/tfhub_models', # TODO: Remove after 20241211 + 'src/tools/clang/crashreports', # TODO: Remove after 20260401 ], }, { @@ -4187,6 +4187,18 @@ hooks = [ '--with-android={checkout_android}', '--with-fuchsia={checkout_fuchsia}'], }, + { + # Build the rust toolchain from tip-of-tree, against tip-of-tree LLVM. + # Note: On Win, this should run after win_toolchain, as it may use it. + 'name': 'rust_tot', + 'pattern': '.', + 'condition': 'rust_force_head_revision', + 'action': ['vpython3', 'src/tools/rust/build_rust.py', + '--rust-force-head-revision', + '--llvm-force-head-revision', + '--entire-toolchain', + '--skip-test'], + }, { # Update LASTCHANGE. 'name': 'lastchange', @@ -4227,8 +4239,10 @@ hooks = [ 'name': 'lastchange_dawn', 'pattern': '.', 'action': ['python3', 'src/build/util/lastchange.py', + '-m', 'DAWN_COMMIT_HASH', '-s', 'src/third_party/dawn', - '--revision', 'src/gpu/webgpu/DAWN_VERSION'], + '--revision', 'src/gpu/webgpu/DAWN_VERSION', + '--header', 'src/gpu/webgpu/dawn_commit_hash.h'], }, # Pull dsymutil binaries using checked-in hashes. { @@ -4761,6 +4775,12 @@ hooks = [ 'src/build/config/siso/configure_siso.py', '--rbe_instance', Var('rbe_instance'), + '--reapi_instance', + Var('reapi_instance'), + '--reapi_address', + Var('reapi_address'), + '--reapi_backend_config_path', + Var('reapi_backend_config_path'), ], }, { diff --git a/naiveproxy/src/base/BUILD.gn b/naiveproxy/src/base/BUILD.gn index 562ed812a4..0c4f6f4c34 100644 --- a/naiveproxy/src/base/BUILD.gn +++ b/naiveproxy/src/base/BUILD.gn @@ -46,15 +46,14 @@ if (is_ios) { import("//build/config/ios/ios_sdk.gni") } -if (is_mac) { - # Used to generate fuzzer corpus :base_mach_port_rendezvous_convert_corpus. - import("//third_party/protobuf/proto_library.gni") -} - if (is_win) { import("//build/config/win/control_flow_guard.gni") } +if (is_android) { + import("//build/config/android/config.gni") +} + declare_args() { # Unsafe developer build. Has developer-friendly features that may weaken or # disable security measures like sandboxing or ASLR. @@ -208,7 +207,10 @@ component("base") { "bit_cast.h", "bits.h", "build_time.h", + "byte_count.cc", "byte_count.h", + "byte_size.cc", + "byte_size.h", "callback_list.cc", "callback_list.h", "cancelable_callback.h", @@ -256,6 +258,8 @@ component("base") { "containers/to_value_list.h", "containers/to_vector.h", "containers/unique_ptr_adapters.h", + "containers/variant_map.cc", + "containers/variant_map.h", "containers/vector_buffer.h", "critical_closure.h", "dcheck_is_on.h", @@ -355,8 +359,11 @@ component("base") { "memory/aligned_memory.h", "memory/asan_interface.h", "memory/free_deleter.h", + "memory/memory_pressure_level.h", "memory/memory_pressure_listener.cc", "memory/memory_pressure_listener.h", + "memory/memory_pressure_listener_registry.cc", + "memory/memory_pressure_listener_registry.h", "memory/memory_pressure_monitor.cc", "memory/memory_pressure_monitor.h", "memory/page_size.h", @@ -422,6 +429,7 @@ component("base") { "memory_coordinator/memory_consumer.h", "memory_coordinator/memory_consumer_registry.cc", "memory_coordinator/memory_consumer_registry.h", + "memory_coordinator/memory_consumer_registry_destruction_observer.h", "memory_coordinator/traits.h", "message_loop/io_watcher.cc", "message_loop/io_watcher.h", @@ -442,6 +450,8 @@ component("base") { "metrics/dummy_histogram.h", "metrics/field_trial.cc", "metrics/field_trial.h", + "metrics/field_trial_entry.cc", + "metrics/field_trial_entry.h", "metrics/field_trial_list_including_low_anonymity.cc", "metrics/field_trial_list_including_low_anonymity.h", "metrics/field_trial_param_associator.cc", @@ -662,6 +672,8 @@ component("base") { "synchronization/lock.cc", "synchronization/lock.h", "synchronization/lock_impl.h", + "synchronization/lock_metrics_recorder.cc", + "synchronization/lock_metrics_recorder.h", "synchronization/lock_subtle.h", "synchronization/waitable_event.cc", "synchronization/waitable_event.h", @@ -695,6 +707,8 @@ component("base") { "task/delay_policy.h", "task/delayed_task_handle.cc", "task/delayed_task_handle.h", + "task/execution_fence.cc", + "task/execution_fence.h", "task/lazy_thread_pool_task_runner.cc", "task/lazy_thread_pool_task_runner.h", "task/post_job.cc", @@ -902,7 +916,6 @@ component("base") { "trace_event/trace_id_helper.h", "traits_bag.h", "tuple.h", - "types/always_false.h", "types/cxx23_from_range.h", "types/cxx23_is_scoped_enum.h", "types/cxx23_to_underlying.h", @@ -1125,18 +1138,24 @@ component("base") { # Android. if (is_android) { sources += [ + "android/android_info.h", + "android/android_info_stub.cc", + "android/apk_info.h", + "android/apk_info_stub.cc", "android/application_status_listener.h", "android/application_status_listener_stub.cc", "android/background_thread_pool_field_trial.cc", "android/background_thread_pool_field_trial.h", - "android/build_info.h", - "android/build_info_stub.cc", "android/content_uri_utils.h", "android/content_uri_utils_stub.cc", + "android/device_info.h", + "android/device_info_stub.cc", "android/virtual_document_path.cc", "android/virtual_document_path.h", "android/yield_to_looper_checker.cc", "android/yield_to_looper_checker.h", + "android/sys_utils.h", + "android/sys_utils_stub.cc", "debug/stack_trace_android.cc", "files/file_android.cc", "files/file_android.h", @@ -1164,14 +1183,18 @@ component("base") { ] deps += [ - "//third_party/ashmem", "//third_party/cpu_features:ndk_compat", ] if (android_ndk_api_level >= 29) { - deps += [ - ":android_info_aidl_native", - ":build_info_aidl_native", + deps += [ ":build_info_aidl_native" ] + sources += [ + # Cronet uses lower NDK API level than is required for these files, + # but it doesn't need AHardwareBuffer anyway. + "android/scoped_hardware_buffer_fence_sync.cc", + "android/scoped_hardware_buffer_fence_sync.h", + "android/scoped_hardware_buffer_handle.cc", + "android/scoped_hardware_buffer_handle.h", ] } @@ -1251,6 +1274,7 @@ component("base") { "android/library_loader/library_prefetcher_hooks.cc", "android/native_uma_recorder.cc", "android/scoped_java_ref.h", + "android/statistics_recorder_android.cc", "android/token_android.cc", "android/token_android.h", "android/trace_event_binding.cc", @@ -1451,7 +1475,6 @@ component("base") { "memory/discardable_memory_internal.h", "metrics/persistent_histogram_storage.cc", "metrics/persistent_histogram_storage.h", - "native_library.cc", "native_library.h", "path_service.cc", "path_service.h", @@ -1596,8 +1619,6 @@ component("base") { sources += [ "allocator/dispatcher/memory_tagging.cc", "allocator/dispatcher/memory_tagging.h", - "allocator/miracle_parameter.cc", - "allocator/miracle_parameter.h", "allocator/partition_alloc_features.cc", "allocator/partition_alloc_features.h", "allocator/partition_alloc_support.cc", @@ -1708,6 +1729,7 @@ component("base") { "win/dark_mode_support.h", "win/default_apps_util.cc", "win/default_apps_util.h", + "win/delayload_helpers.h", "win/elevation_util.cc", "win/elevation_util.h", "win/embedded_i18n/language_selector.cc", diff --git a/naiveproxy/src/base/DEPS b/naiveproxy/src/base/DEPS index c7e2447d84..4eccf88383 100644 --- a/naiveproxy/src/base/DEPS +++ b/naiveproxy/src/base/DEPS @@ -1,6 +1,5 @@ include_rules = [ "+aidl/org/chromium/base", - "+third_party/ashmem", "+third_party/apple_apsl", "+third_party/boringssl/src/include", "+third_party/ced", @@ -35,10 +34,6 @@ include_rules = [ ] specific_include_rules = { - # Special case - "process/current_process(|_test)\.h": [ - "+third_party/perfetto/protos/perfetto/trace/track_event/chrome_process_descriptor.pbzero.h", - ], # To evaluate the performance effects of using absl's flat_hash_map. "supports_user_data\.cc": [ "+third_party/abseil-cpp/absl/container/flat_hash_map.h", diff --git a/naiveproxy/src/base/allocator/allocator_check.h b/naiveproxy/src/base/allocator/allocator_check.h index ff93a3273f..58add8b9a6 100644 --- a/naiveproxy/src/base/allocator/allocator_check.h +++ b/naiveproxy/src/base/allocator/allocator_check.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef BASE_ALLOCATOR_ALLOCATOR_CHECK_H_ #define BASE_ALLOCATOR_ALLOCATOR_CHECK_H_ diff --git a/naiveproxy/src/base/allocator/dispatcher/configuration.h b/naiveproxy/src/base/allocator/dispatcher/configuration.h index 5f892aa49e..4488cf8045 100644 --- a/naiveproxy/src/base/allocator/dispatcher/configuration.h +++ b/naiveproxy/src/base/allocator/dispatcher/configuration.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef BASE_ALLOCATOR_DISPATCHER_CONFIGURATION_H_ #define BASE_ALLOCATOR_DISPATCHER_CONFIGURATION_H_ diff --git a/naiveproxy/src/base/allocator/dispatcher/dispatcher.h b/naiveproxy/src/base/allocator/dispatcher/dispatcher.h index af25707bf6..ef46c79030 100644 --- a/naiveproxy/src/base/allocator/dispatcher/dispatcher.h +++ b/naiveproxy/src/base/allocator/dispatcher/dispatcher.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef BASE_ALLOCATOR_DISPATCHER_DISPATCHER_H_ #define BASE_ALLOCATOR_DISPATCHER_DISPATCHER_H_ diff --git a/naiveproxy/src/base/allocator/dispatcher/internal/dispatch_data.h b/naiveproxy/src/base/allocator/dispatcher/internal/dispatch_data.h index 60a210afab..9953111746 100644 --- a/naiveproxy/src/base/allocator/dispatcher/internal/dispatch_data.h +++ b/naiveproxy/src/base/allocator/dispatcher/internal/dispatch_data.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef BASE_ALLOCATOR_DISPATCHER_INTERNAL_DISPATCH_DATA_H_ #define BASE_ALLOCATOR_DISPATCHER_INTERNAL_DISPATCH_DATA_H_ diff --git a/naiveproxy/src/base/allocator/dispatcher/internal/dispatcher_internal.h b/naiveproxy/src/base/allocator/dispatcher/internal/dispatcher_internal.h index 1ae112be9b..94d5a1f52a 100644 --- a/naiveproxy/src/base/allocator/dispatcher/internal/dispatcher_internal.h +++ b/naiveproxy/src/base/allocator/dispatcher/internal/dispatcher_internal.h @@ -158,6 +158,18 @@ struct DispatcherImpl { return address; } + static void* AllocZeroInitializedUncheckedFn(size_t n, + size_t size, + void* context) { + void* const address = + allocator_dispatch_.next->alloc_zero_initialized_unchecked_function( + n, size, context); + + DoNotifyAllocationForShim(address, n * size); + + return address; + } + static void* AllocAlignedFn(size_t alignment, size_t size, void* context) { void* const address = allocator_dispatch_.next->alloc_aligned_function( alignment, size, context); @@ -347,28 +359,30 @@ std::tuple DispatcherImpl::s_observers; #if PA_BUILDFLAG(USE_ALLOCATOR_SHIM) template AllocatorDispatch DispatcherImpl::allocator_dispatch_ = { - AllocFn, // alloc_function - AllocUncheckedFn, // alloc_unchecked_function - AllocZeroInitializedFn, // alloc_zero_initialized_function - AllocAlignedFn, // alloc_aligned_function - ReallocFn, // realloc_function - ReallocUncheckedFn, // realloc_unchecked_function - FreeFn, // free_function - FreeWithSizeFn, // free_with_size_function - FreeWithAlignmentFn, // free_with_alignment_function - FreeWithSizeAndAlignmentFn, // free_with_size_and_alignment_function - nullptr, // get_size_estimate_function - nullptr, // good_size_function - nullptr, // claimed_address_function - BatchMallocFn, // batch_malloc_function - BatchFreeFn, // batch_free_function - TryFreeDefaultFn, // try_free_default_function - AlignedMallocFn, // aligned_malloc_function - AlignedMallocUncheckedFn, // aligned_malloc_unchecked_function - AlignedReallocFn, // aligned_realloc_function - AlignedReallocUncheckedFn, // aligned_realloc_unchecked_function - AlignedFreeFn, // aligned_free_function - nullptr // next + .alloc_function = AllocFn, + .alloc_unchecked_function = AllocUncheckedFn, + .alloc_zero_initialized_function = AllocZeroInitializedFn, + .alloc_zero_initialized_unchecked_function = + AllocZeroInitializedUncheckedFn, + .alloc_aligned_function = AllocAlignedFn, + .realloc_function = ReallocFn, + .realloc_unchecked_function = ReallocUncheckedFn, + .free_function = FreeFn, + .free_with_size_function = FreeWithSizeFn, + .free_with_alignment_function = FreeWithAlignmentFn, + .free_with_size_and_alignment_function = FreeWithSizeAndAlignmentFn, + .get_size_estimate_function = nullptr, + .good_size_function = nullptr, + .claimed_address_function = nullptr, + .batch_malloc_function = BatchMallocFn, + .batch_free_function = BatchFreeFn, + .try_free_default_function = TryFreeDefaultFn, + .aligned_malloc_function = AlignedMallocFn, + .aligned_malloc_unchecked_function = AlignedMallocUncheckedFn, + .aligned_realloc_function = AlignedReallocFn, + .aligned_realloc_unchecked_function = AlignedReallocUncheckedFn, + .aligned_free_function = AlignedFreeFn, + .next = nullptr, }; #endif // PA_BUILDFLAG(USE_ALLOCATOR_SHIM) diff --git a/naiveproxy/src/base/allocator/dispatcher/internal/tools.h b/naiveproxy/src/base/allocator/dispatcher/internal/tools.h index 3c81549d99..692232ef44 100644 --- a/naiveproxy/src/base/allocator/dispatcher/internal/tools.h +++ b/naiveproxy/src/base/allocator/dispatcher/internal/tools.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef BASE_ALLOCATOR_DISPATCHER_INTERNAL_TOOLS_H_ #define BASE_ALLOCATOR_DISPATCHER_INTERNAL_TOOLS_H_ diff --git a/naiveproxy/src/base/allocator/dispatcher/memory_tagging.cc b/naiveproxy/src/base/allocator/dispatcher/memory_tagging.cc index 240ad101f4..33a6c0ec06 100644 --- a/naiveproxy/src/base/allocator/dispatcher/memory_tagging.cc +++ b/naiveproxy/src/base/allocator/dispatcher/memory_tagging.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "base/allocator/dispatcher/memory_tagging.h" namespace base::allocator::dispatcher { diff --git a/naiveproxy/src/base/allocator/dispatcher/memory_tagging.h b/naiveproxy/src/base/allocator/dispatcher/memory_tagging.h index 769b18573e..ef1cb68634 100644 --- a/naiveproxy/src/base/allocator/dispatcher/memory_tagging.h +++ b/naiveproxy/src/base/allocator/dispatcher/memory_tagging.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef BASE_ALLOCATOR_DISPATCHER_MEMORY_TAGGING_H_ #define BASE_ALLOCATOR_DISPATCHER_MEMORY_TAGGING_H_ diff --git a/naiveproxy/src/base/allocator/dispatcher/subsystem.h b/naiveproxy/src/base/allocator/dispatcher/subsystem.h index d404d4a650..f9500bd67d 100644 --- a/naiveproxy/src/base/allocator/dispatcher/subsystem.h +++ b/naiveproxy/src/base/allocator/dispatcher/subsystem.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef BASE_ALLOCATOR_DISPATCHER_SUBSYSTEM_H_ #define BASE_ALLOCATOR_DISPATCHER_SUBSYSTEM_H_ diff --git a/naiveproxy/src/base/allocator/dispatcher/testing/dispatcher_test.h b/naiveproxy/src/base/allocator/dispatcher/testing/dispatcher_test.h index 0e97d21d9b..9cc232ef27 100644 --- a/naiveproxy/src/base/allocator/dispatcher/testing/dispatcher_test.h +++ b/naiveproxy/src/base/allocator/dispatcher/testing/dispatcher_test.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef BASE_ALLOCATOR_DISPATCHER_TESTING_DISPATCHER_TEST_H_ #define BASE_ALLOCATOR_DISPATCHER_TESTING_DISPATCHER_TEST_H_ diff --git a/naiveproxy/src/base/allocator/early_zone_registration_apple.h b/naiveproxy/src/base/allocator/early_zone_registration_apple.h index cc884f8db8..272a8727af 100644 --- a/naiveproxy/src/base/allocator/early_zone_registration_apple.h +++ b/naiveproxy/src/base/allocator/early_zone_registration_apple.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef BASE_ALLOCATOR_EARLY_ZONE_REGISTRATION_APPLE_H_ #define BASE_ALLOCATOR_EARLY_ZONE_REGISTRATION_APPLE_H_ diff --git a/naiveproxy/src/base/allocator/miracle_parameter.cc b/naiveproxy/src/base/allocator/miracle_parameter.cc deleted file mode 100644 index 22ac9df20c..0000000000 --- a/naiveproxy/src/base/allocator/miracle_parameter.cc +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - -#include "base/allocator/miracle_parameter.h" - -#include "base/command_line.h" -#include "base/strings/strcat.h" -#include "base/system/sys_info.h" - -namespace base::miracle_parameter { - -std::string GetParamNameWithSuffix(const std::string& param_name) { - // `base::SysInfo::AmountOfPhysicalMemoryMB()` refers to CommandLine - // internally. If the CommandLine is not initialized, we return early to avoid - // a crash. - if (!base::CommandLine::InitializedForCurrentProcess()) { - return param_name; - } - int physical_memory_mb = base::SysInfo::AmountOfPhysicalMemoryMB(); - const char* suffix = - physical_memory_mb < kMiracleParameterMemory512MB ? "ForLessThan512MB" - : physical_memory_mb < kMiracleParameterMemory1GB ? "For512MBTo1GB" - : physical_memory_mb < kMiracleParameterMemory2GB ? "For1GBTo2GB" - : physical_memory_mb < kMiracleParameterMemory4GB ? "For2GBTo4GB" - : physical_memory_mb < kMiracleParameterMemory8GB ? "For4GBTo8GB" - : physical_memory_mb < kMiracleParameterMemory16GB ? "For8GBTo16GB" - : "For16GBAndAbove"; - return base::StrCat({param_name, suffix}); -} - -std::string GetMiracleParameterAsString(const base::Feature& feature, - const std::string& param_name, - const std::string& default_value) { - return GetFieldTrialParamByFeatureAsString( - feature, GetParamNameWithSuffix(param_name), - GetFieldTrialParamByFeatureAsString(feature, param_name, default_value)); -} - -double GetMiracleParameterAsDouble(const base::Feature& feature, - const std::string& param_name, - double default_value) { - return base::GetFieldTrialParamByFeatureAsDouble( - feature, GetParamNameWithSuffix(param_name), - base::GetFieldTrialParamByFeatureAsDouble(feature, param_name, - default_value)); -} - -int GetMiracleParameterAsInt(const base::Feature& feature, - const std::string& param_name, - int default_value) { - return base::GetFieldTrialParamByFeatureAsInt( - feature, GetParamNameWithSuffix(param_name), - base::GetFieldTrialParamByFeatureAsInt(feature, param_name, - default_value)); -} - -bool GetMiracleParameterAsBool(const base::Feature& feature, - const std::string& param_name, - bool default_value) { - return base::GetFieldTrialParamByFeatureAsBool( - feature, GetParamNameWithSuffix(param_name), - base::GetFieldTrialParamByFeatureAsBool(feature, param_name, - default_value)); -} - -base::TimeDelta GetMiracleParameterAsTimeDelta(const base::Feature& feature, - const std::string& param_name, - base::TimeDelta default_value) { - return base::GetFieldTrialParamByFeatureAsTimeDelta( - feature, GetParamNameWithSuffix(param_name), - base::GetFieldTrialParamByFeatureAsTimeDelta(feature, param_name, - default_value)); -} - -} // namespace base::miracle_parameter diff --git a/naiveproxy/src/base/allocator/miracle_parameter.h b/naiveproxy/src/base/allocator/miracle_parameter.h deleted file mode 100644 index 8a9d1f6820..0000000000 --- a/naiveproxy/src/base/allocator/miracle_parameter.h +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - -#ifndef BASE_ALLOCATOR_MIRACLE_PARAMETER_H_ -#define BASE_ALLOCATOR_MIRACLE_PARAMETER_H_ - -#include "base/base_export.h" -#include "base/containers/span.h" -#include "base/feature_list.h" -#include "base/metrics/field_trial_params.h" - -// This is a mirror copy of the //components/miracle_parameter/ to resolve the -// dependency cycle of (base->miracle_parameter->base). -// Eventually the miracle_parameter component will have a public interface in -// //base/ and this could be removed. -// TODO(crbug.com/40279826): remove miracle_parameter from -// //base/allocator/. - -namespace base { - -namespace miracle_parameter { - -namespace { - -template -Enum GetFieldTrialParamByFeatureAsEnum( - const base::Feature& feature, - const std::string& param_name, - const Enum default_value, - const base::span::Option>& - options) { - std::string string_value = - base::GetFieldTrialParamValueByFeature(feature, param_name); - if (string_value.empty()) { - return default_value; - } - - for (const auto& option : options) { - if (string_value == option.name) { - return option.value; - } - } - - base::LogInvalidEnumValue(feature, param_name, string_value, - static_cast(default_value)); - return default_value; -} - -} // namespace - -constexpr int kMiracleParameterMemory512MB = 512; -constexpr int kMiracleParameterMemory1GB = 1024; -constexpr int kMiracleParameterMemory2GB = 2 * 1024; -constexpr int kMiracleParameterMemory4GB = 4 * 1024; -constexpr int kMiracleParameterMemory8GB = 8 * 1024; -constexpr int kMiracleParameterMemory16GB = 16 * 1024; - -// GetParamNameWithSuffix put a parameter name suffix based on -// the amount of physical memory. -// -// - "ForLessThan512MB" for less than 512MB memory devices. -// - "For512MBTo1GB" for 512MB to 1GB memory devices. -// - "For1GBTo2GB" for 1GB to 2GB memory devices. -// - "For2GBTo4GB" for 2GB to 4GB memory devices. -// - "For4GBTo8GB" for 4GB to 8GB memory devices. -// - "For8GBTo16GB" for 8GB to 16GB memory devices. -// - "For16GBAndAbove" for 16GB memory and above devices. -BASE_EXPORT -std::string GetParamNameWithSuffix(const std::string& param_name); - -// Provides a similar behavior with FeatureParam except the return -// value is determined by the amount of physical memory. -BASE_EXPORT -std::string GetMiracleParameterAsString(const base::Feature& feature, - const std::string& param_name, - const std::string& default_value); - -// Provides a similar behavior with FeatureParam except the return value -// is determined by the amount of physical memory. -BASE_EXPORT -double GetMiracleParameterAsDouble(const base::Feature& feature, - const std::string& param_name, - double default_value); - -// Provides a similar behavior with FeatureParam except the return value is -// determined by the amount of physical memory. -BASE_EXPORT -int GetMiracleParameterAsInt(const base::Feature& feature, - const std::string& param_name, - int default_value); - -// Provides a similar behavior with FeatureParam except the return value -// is determined by the amount of physical memory. -BASE_EXPORT -bool GetMiracleParameterAsBool(const base::Feature& feature, - const std::string& param_name, - bool default_value); - -// Provides a similar behavior with FeatureParam except the -// return value is determined by the amount of physical memory. -BASE_EXPORT -base::TimeDelta GetMiracleParameterAsTimeDelta(const base::Feature& feature, - const std::string& param_name, - base::TimeDelta default_value); - -// Provides a similar behavior with FeatureParam except the return value -// is determined by the amount of physical memory. -template -Enum GetMiracleParameterAsEnum( - const base::Feature& feature, - const std::string& param_name, - const Enum default_value, - const base::span::Option> options) { - return GetFieldTrialParamByFeatureAsEnum( - feature, GetParamNameWithSuffix(param_name), - GetFieldTrialParamByFeatureAsEnum(feature, param_name, default_value, - options), - options); -} - -#define MIRACLE_PARAMETER_FOR_STRING(function_name, feature, param_name, \ - default_value) \ - std::string function_name() { \ - static const std::string value = \ - miracle_parameter::GetMiracleParameterAsString(feature, param_name, \ - default_value); \ - return value; \ - } - -#define MIRACLE_PARAMETER_FOR_DOUBLE(function_name, feature, param_name, \ - default_value) \ - double function_name() { \ - static const double value = \ - miracle_parameter::GetMiracleParameterAsDouble(feature, param_name, \ - default_value); \ - return value; \ - } - -#define MIRACLE_PARAMETER_FOR_INT(function_name, feature, param_name, \ - default_value) \ - int function_name() { \ - static const int value = miracle_parameter::GetMiracleParameterAsInt( \ - feature, param_name, default_value); \ - return value; \ - } - -#define MIRACLE_PARAMETER_FOR_BOOL(function_name, feature, param_name, \ - default_value) \ - bool function_name() { \ - static const bool value = miracle_parameter::GetMiracleParameterAsBool( \ - feature, param_name, default_value); \ - return value; \ - } - -#define MIRACLE_PARAMETER_FOR_TIME_DELTA(function_name, feature, param_name, \ - default_value) \ - base::TimeDelta function_name() { \ - static const base::TimeDelta value = \ - miracle_parameter::GetMiracleParameterAsTimeDelta(feature, param_name, \ - default_value); \ - return value; \ - } - -#define MIRACLE_PARAMETER_FOR_ENUM(function_name, feature, param_name, \ - default_value, type, options) \ - type function_name() { \ - static const type value = miracle_parameter::GetMiracleParameterAsEnum( \ - feature, param_name, default_value, base::span(options)); \ - return value; \ - } - -} // namespace miracle_parameter - -} // namespace base - -#endif // BASE_ALLOCATOR_MIRACLE_PARAMETER_H_ diff --git a/naiveproxy/src/base/allocator/partition_alloc_features.cc b/naiveproxy/src/base/allocator/partition_alloc_features.cc index c09a910f8f..fdc30ae2f9 100644 --- a/naiveproxy/src/base/allocator/partition_alloc_features.cc +++ b/naiveproxy/src/base/allocator/partition_alloc_features.cc @@ -9,20 +9,15 @@ #include "base/allocator/partition_alloc_features.h" -#include "base/allocator/miracle_parameter.h" #include "base/base_export.h" #include "base/feature_list.h" #include "base/features.h" -#include "base/metrics/field_trial_params.h" -#include "base/time/time.h" #include "build/build_config.h" #include "build/chromecast_buildflags.h" #include "partition_alloc/buildflags.h" -#include "partition_alloc/partition_alloc_base/time/time.h" #include "partition_alloc/partition_alloc_constants.h" #include "partition_alloc/partition_root.h" #include "partition_alloc/shim/allocator_shim_dispatch_to_noop_on_free.h" -#include "partition_alloc/thread_cache.h" namespace base::features { @@ -36,9 +31,7 @@ static constexpr char kAllProcessesStr[] = "all-processes"; } // namespace -BASE_FEATURE(kPartitionAllocUnretainedDanglingPtr, - "PartitionAllocUnretainedDanglingPtr", - FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kPartitionAllocUnretainedDanglingPtr, FEATURE_ENABLED_BY_DEFAULT); constexpr FeatureParam::Option kUnretainedDanglingPtrModeOption[] = { @@ -60,7 +53,6 @@ constinit const FeatureParam // presence of DPD, but hypothetically fully launching DPD should prompt // a rethink of no-op `free()`. BASE_FEATURE(kPartitionAllocDanglingPtr, - "PartitionAllocDanglingPtr", #if PA_BUILDFLAG(ENABLE_DANGLING_RAW_PTR_FEATURE_FLAG) FEATURE_ENABLED_BY_DEFAULT #else @@ -93,32 +85,16 @@ constinit const FeatureParam kDanglingPtrTypeParam{ #if PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) // Use a larger maximum thread cache cacheable bucket size. -BASE_FEATURE(kPartitionAllocLargeThreadCacheSize, - "PartitionAllocLargeThreadCacheSize", - FEATURE_ENABLED_BY_DEFAULT); - -MIRACLE_PARAMETER_FOR_INT(GetPartitionAllocLargeThreadCacheSizeValue, - kPartitionAllocLargeThreadCacheSize, - "PartitionAllocLargeThreadCacheSizeValue", - ::partition_alloc::kThreadCacheLargeSizeThreshold) - -MIRACLE_PARAMETER_FOR_INT( - GetPartitionAllocLargeThreadCacheSizeValueForLowRAMAndroid, - kPartitionAllocLargeThreadCacheSize, - "PartitionAllocLargeThreadCacheSizeValueForLowRAMAndroid", - ::partition_alloc::kThreadCacheDefaultSizeThreshold) +BASE_FEATURE(kPartitionAllocLargeThreadCacheSize, FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kPartitionAllocLargeEmptySlotSpanRing, - "PartitionAllocLargeEmptySlotSpanRing", #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) FEATURE_ENABLED_BY_DEFAULT); #else FEATURE_DISABLED_BY_DEFAULT); #endif -BASE_FEATURE(kPartitionAllocWithAdvancedChecks, - "PartitionAllocWithAdvancedChecks", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kPartitionAllocWithAdvancedChecks, FEATURE_DISABLED_BY_DEFAULT); constexpr FeatureParam::Option kPartitionAllocWithAdvancedChecksEnabledProcessesOptions[] = { {PartitionAllocWithAdvancedChecksEnabledProcesses::kBrowserOnly, @@ -137,7 +113,6 @@ constinit const FeatureParam &kPartitionAllocWithAdvancedChecksEnabledProcessesOptions}; BASE_FEATURE(kPartitionAllocSchedulerLoopQuarantine, - "PartitionAllocSchedulerLoopQuarantine", FEATURE_DISABLED_BY_DEFAULT); // Scheduler Loop Quarantine's config. // Note: Do not use the prepared macro as of no need for a local cache. @@ -146,23 +121,40 @@ constinit const FeatureParam &kPartitionAllocSchedulerLoopQuarantine, "PartitionAllocSchedulerLoopQuarantineConfig", "{}"}; +BASE_FEATURE(kPartitionAllocSchedulerLoopQuarantineTaskControlledPurge, + FEATURE_DISABLED_BY_DEFAULT); +constexpr FeatureParam< + PartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcesses>::Option + kPartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcessesOptions[] = + {{PartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcesses:: + kBrowserOnly, + kBrowserOnlyStr}, + {PartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcesses:: + kBrowserAndRenderer, + kBrowserAndRendererStr}, + {PartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcesses:: + kNonRenderer, + kNonRendererStr}, + {PartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcesses:: + kAllProcesses, + kAllProcessesStr}}; +// Note: Do not use the prepared macro as of no need for a local cache. +constinit const FeatureParam< + PartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcesses> + kPartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcessesParam{ + &kPartitionAllocSchedulerLoopQuarantineTaskControlledPurge, + "PartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcess" + "es", + PartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcesses:: + kBrowserOnly, + &kPartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcessesOptions}; + BASE_FEATURE(kPartitionAllocEventuallyZeroFreedMemory, - "PartitionAllocEventuallyZeroFreedMemory", FEATURE_DISABLED_BY_DEFAULT); -// Evaluated and positive stability and peformance-wise on Linux-based systems, -// disabled elsewhere (for now). Does not apply to Windows. -BASE_FEATURE(kPartitionAllocFewerMemoryRegions, - "PartitionAllocFewerMemoryRegions", -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) - FEATURE_ENABLED_BY_DEFAULT); -#else - FEATURE_DISABLED_BY_DEFAULT); -#endif #endif // PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) BASE_FEATURE(kPartitionAllocBackupRefPtr, - "PartitionAllocBackupRefPtr", #if PA_BUILDFLAG(ENABLE_BACKUP_REF_PTR_FEATURE_FLAG) FEATURE_ENABLED_BY_DEFAULT #else @@ -208,10 +200,15 @@ constinit const FeatureParam kBackupRefPtrSuppressDoubleFreeDetectedCrash{ false}; constinit const FeatureParam kBackupRefPtrSuppressCorruptionDetectedCrash{ &kPartitionAllocBackupRefPtr, "brp-suppress-corruption-detected-crash", +#if PA_BUILDFLAG(IS_IOS) + // TODO(crbug.com/41497028): Continue investigation and remove once + // addressed. + true}; +#else false}; +#endif BASE_FEATURE(kPartitionAllocMemoryTagging, - "PartitionAllocMemoryTagging", #if PA_BUILDFLAG(USE_FULL_MTE) || BUILDFLAG(IS_ANDROID) FEATURE_ENABLED_BY_DEFAULT #else @@ -223,7 +220,7 @@ constexpr FeatureParam::Option kMemtagModeOptions[] = { {MemtagMode::kSync, "sync"}, {MemtagMode::kAsync, "async"}}; -// Note: Do not use the prepared macro as of no need for a local cache. +// Note: Do not use the prepared muacro as of no need for a local cache. constinit const FeatureParam kMemtagModeParam{ &kPartitionAllocMemoryTagging, "memtag-mode", #if PA_BUILDFLAG(USE_FULL_MTE) @@ -260,13 +257,10 @@ constinit const FeatureParam #endif &kMemoryTaggingEnabledProcessesOptions}; -BASE_FEATURE(kKillPartitionAllocMemoryTagging, - "KillPartitionAllocMemoryTagging", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kKillPartitionAllocMemoryTagging, FEATURE_DISABLED_BY_DEFAULT); BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocPermissiveMte); BASE_FEATURE(kPartitionAllocPermissiveMte, - "PartitionAllocPermissiveMte", #if PA_BUILDFLAG(USE_FULL_MTE) // We want to actually crash if USE_FULL_MTE is enabled. FEATURE_DISABLED_BY_DEFAULT @@ -275,22 +269,16 @@ BASE_FEATURE(kPartitionAllocPermissiveMte, #endif ); -BASE_FEATURE(kAsanBrpDereferenceCheck, - "AsanBrpDereferenceCheck", - FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kAsanBrpExtractionCheck, - "AsanBrpExtractionCheck", // Not much noise at the moment to +BASE_FEATURE(kAsanBrpDereferenceCheck, FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kAsanBrpExtractionCheck, // Not much noise at the moment to FEATURE_DISABLED_BY_DEFAULT); // enable by default. -BASE_FEATURE(kAsanBrpInstantiationCheck, - "AsanBrpInstantiationCheck", - FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kAsanBrpInstantiationCheck, FEATURE_ENABLED_BY_DEFAULT); // If enabled, switches the bucket distribution to a denser one. // // We enable this by default everywhere except for 32-bit Android, since we saw // regressions there. BASE_FEATURE(kPartitionAllocUseDenserDistribution, - "PartitionAllocUseDenserDistribution", #if BUILDFLAG(IS_ANDROID) && defined(ARCH_CPU_32_BITS) FEATURE_DISABLED_BY_DEFAULT #else @@ -313,9 +301,7 @@ constinit const FeatureParam #endif // BUILDFLAG(IS_ANDROID) && defined(ARCH_CPU_32_BITS) &kPartitionAllocBucketDistributionOption}; -BASE_FEATURE(kPartitionAllocMemoryReclaimer, - "PartitionAllocMemoryReclaimer", - FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kPartitionAllocMemoryReclaimer, FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE_PARAM(TimeDelta, kPartitionAllocMemoryReclaimerInterval, &kPartitionAllocMemoryReclaimer, @@ -326,13 +312,11 @@ BASE_FEATURE_PARAM(TimeDelta, // Configures whether we set a lower limit for renderers that do not have a main // frame, similar to the limit that is already done for backgrounded renderers. BASE_FEATURE(kLowerPAMemoryLimitForNonMainRenderers, - "LowerPAMemoryLimitForNonMainRenderers", FEATURE_DISABLED_BY_DEFAULT); // Whether to straighten free lists for larger slot spans in PurgeMemory() -> // ... -> PartitionPurgeSlotSpan(). BASE_FEATURE(kPartitionAllocStraightenLargerSlotSpanFreeLists, - "PartitionAllocStraightenLargerSlotSpanFreeLists", FEATURE_ENABLED_BY_DEFAULT); const FeatureParam:: Option kPartitionAllocStraightenLargerSlotSpanFreeListsModeOption[] = { @@ -355,19 +339,14 @@ constinit const FeatureParam< // Whether to sort free lists for smaller slot spans in PurgeMemory(). BASE_FEATURE(kPartitionAllocSortSmallerSlotSpanFreeLists, - "PartitionAllocSortSmallerSlotSpanFreeLists", FEATURE_ENABLED_BY_DEFAULT); // Whether to sort the active slot spans in PurgeMemory(). -BASE_FEATURE(kPartitionAllocSortActiveSlotSpans, - "PartitionAllocSortActiveSlotSpans", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kPartitionAllocSortActiveSlotSpans, FEATURE_DISABLED_BY_DEFAULT); #if BUILDFLAG(IS_WIN) // Whether to retry allocations when commit fails. -BASE_FEATURE(kPageAllocatorRetryOnCommitFailure, - "PageAllocatorRetryOnCommitFailure", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kPageAllocatorRetryOnCommitFailure, FEATURE_DISABLED_BY_DEFAULT); #endif #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) @@ -384,20 +363,6 @@ BASE_FEATURE_PARAM(bool, false); #endif -BASE_FEATURE(kEnableConfigurableThreadCacheMultiplier, - "EnableConfigurableThreadCacheMultiplier", - base::FEATURE_DISABLED_BY_DEFAULT); - -MIRACLE_PARAMETER_FOR_DOUBLE(GetThreadCacheMultiplier, - kEnableConfigurableThreadCacheMultiplier, - "ThreadCacheMultiplier", - 2.) - -MIRACLE_PARAMETER_FOR_DOUBLE(GetThreadCacheMultiplierForAndroid, - kEnableConfigurableThreadCacheMultiplier, - "ThreadCacheMultiplierForAndroid", - 1.) - constexpr partition_alloc::internal::base::TimeDelta ToPartitionAllocTimeDelta( TimeDelta time_delta) { return partition_alloc::internal::base::Microseconds( @@ -409,67 +374,7 @@ constexpr TimeDelta FromPartitionAllocTimeDelta( return Microseconds(time_delta.InMicroseconds()); } -BASE_FEATURE(kEnableConfigurableThreadCachePurgeInterval, - "EnableConfigurableThreadCachePurgeInterval", - FEATURE_DISABLED_BY_DEFAULT); - -MIRACLE_PARAMETER_FOR_TIME_DELTA( - GetThreadCacheMinPurgeIntervalValue, - kEnableConfigurableThreadCachePurgeInterval, - "ThreadCacheMinPurgeInterval", - FromPartitionAllocTimeDelta(partition_alloc::kMinPurgeInterval)) - -MIRACLE_PARAMETER_FOR_TIME_DELTA( - GetThreadCacheMaxPurgeIntervalValue, - kEnableConfigurableThreadCachePurgeInterval, - "ThreadCacheMaxPurgeInterval", - FromPartitionAllocTimeDelta(partition_alloc::kMaxPurgeInterval)) - -MIRACLE_PARAMETER_FOR_TIME_DELTA( - GetThreadCacheDefaultPurgeIntervalValue, - kEnableConfigurableThreadCachePurgeInterval, - "ThreadCacheDefaultPurgeInterval", - FromPartitionAllocTimeDelta(partition_alloc::kDefaultPurgeInterval)) - -const partition_alloc::internal::base::TimeDelta -GetThreadCacheMinPurgeInterval() { - return ToPartitionAllocTimeDelta(GetThreadCacheMinPurgeIntervalValue()); -} - -const partition_alloc::internal::base::TimeDelta -GetThreadCacheMaxPurgeInterval() { - return ToPartitionAllocTimeDelta(GetThreadCacheMaxPurgeIntervalValue()); -} - -const partition_alloc::internal::base::TimeDelta -GetThreadCacheDefaultPurgeInterval() { - return ToPartitionAllocTimeDelta(GetThreadCacheDefaultPurgeIntervalValue()); -} - -BASE_FEATURE(kEnableConfigurableThreadCacheMinCachedMemoryForPurging, - "EnableConfigurableThreadCacheMinCachedMemoryForPurging", - FEATURE_DISABLED_BY_DEFAULT); - -MIRACLE_PARAMETER_FOR_INT( - GetThreadCacheMinCachedMemoryForPurgingBytes, - kEnableConfigurableThreadCacheMinCachedMemoryForPurging, - "ThreadCacheMinCachedMemoryForPurgingBytes", - partition_alloc::kMinCachedMemoryForPurgingBytes) - -// An apparent quarantine leak in the buffer partition unacceptably -// bloats memory when MiraclePtr is enabled in the renderer process. -// We believe we have found and patched the leak, but out of an -// abundance of caution, we provide this toggle that allows us to -// wholly disable MiraclePtr in the buffer partition, if necessary. -// -// TODO(crbug.com/40064499): this is unneeded once -// MiraclePtr-for-Renderer launches. -BASE_FEATURE(kPartitionAllocDisableBRPInBufferPartition, - "PartitionAllocDisableBRPInBufferPartition", - FEATURE_DISABLED_BY_DEFAULT); - BASE_FEATURE(kPartitionAllocAdjustSizeWhenInForeground, - "PartitionAllocAdjustSizeWhenInForeground", #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) FEATURE_ENABLED_BY_DEFAULT); #else @@ -478,7 +383,6 @@ BASE_FEATURE(kPartitionAllocAdjustSizeWhenInForeground, #if PA_BUILDFLAG(ENABLE_PARTITION_LOCK_PRIORITY_INHERITANCE) BASE_FEATURE(kPartitionAllocUsePriorityInheritanceLocks, - "PartitionAllocUsePriorityInheritanceLocks", FEATURE_DISABLED_BY_DEFAULT); #endif // PA_BUILDFLAG(ENABLE_PARTITION_LOCK_PRIORITY_INHERITANCE) diff --git a/naiveproxy/src/base/allocator/partition_alloc_features.h b/naiveproxy/src/base/allocator/partition_alloc_features.h index 8b4827daa4..b4f2ea3945 100644 --- a/naiveproxy/src/base/allocator/partition_alloc_features.h +++ b/naiveproxy/src/base/allocator/partition_alloc_features.h @@ -16,10 +16,8 @@ #include "base/compiler_specific.h" #include "base/feature_list.h" #include "base/metrics/field_trial_params.h" -#include "base/time/time.h" #include "build/build_config.h" #include "partition_alloc/buildflags.h" -#include "partition_alloc/partition_alloc_base/time/time.h" #include "partition_alloc/partition_root.h" namespace base::features { @@ -86,8 +84,6 @@ using PartitionAllocWithAdvancedChecksEnabledProcesses = #if PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocLargeThreadCacheSize); -BASE_EXPORT int GetPartitionAllocLargeThreadCacheSizeValue(); -BASE_EXPORT int GetPartitionAllocLargeThreadCacheSizeValueForLowRAMAndroid(); BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocLargeEmptySlotSpanRing); @@ -101,15 +97,19 @@ BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( std::string, kPartitionAllocSchedulerLoopQuarantineConfig); +using PartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcesses = + internal::PAFeatureEnabledProcesses; +BASE_EXPORT BASE_DECLARE_FEATURE( + kPartitionAllocSchedulerLoopQuarantineTaskControlledPurge); +BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( + PartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcesses, + kPartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcessesParam); + // Eventually zero out most PartitionAlloc memory. This is not meant as a // security guarantee, but to increase the compression ratio of PartitionAlloc's // fragmented super pages. BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocEventuallyZeroFreedMemory); -// Whether to make PartitionAlloc use fewer memory regions. This matters on -// Linux-based systems, where there is a per-process limit that we hit in some -// cases. See the comment in PartitionBucket::SlotSpanCOmmitedSize() for detail. -BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocFewerMemoryRegions); #endif // PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) using BackupRefPtrEnabledProcesses = internal::PAFeatureEnabledProcesses; @@ -198,24 +198,6 @@ BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( kPartialLowEndModeExcludePartitionAllocSupport); #endif -BASE_EXPORT BASE_DECLARE_FEATURE(kEnableConfigurableThreadCacheMultiplier); -BASE_EXPORT double GetThreadCacheMultiplier(); -BASE_EXPORT double GetThreadCacheMultiplierForAndroid(); - -BASE_EXPORT BASE_DECLARE_FEATURE(kEnableConfigurableThreadCachePurgeInterval); -extern const partition_alloc::internal::base::TimeDelta -GetThreadCacheMinPurgeInterval(); -extern const partition_alloc::internal::base::TimeDelta -GetThreadCacheMaxPurgeInterval(); -extern const partition_alloc::internal::base::TimeDelta -GetThreadCacheDefaultPurgeInterval(); - -BASE_EXPORT BASE_DECLARE_FEATURE( - kEnableConfigurableThreadCacheMinCachedMemoryForPurging); -BASE_EXPORT int GetThreadCacheMinCachedMemoryForPurgingBytes(); - -BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocDisableBRPInBufferPartition); - // When set, partitions use a larger ring buffer and free memory less // aggressively when in the foreground. BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocAdjustSizeWhenInForeground); diff --git a/naiveproxy/src/base/allocator/partition_alloc_support.cc b/naiveproxy/src/base/allocator/partition_alloc_support.cc index c46748333d..7964b1c0e2 100644 --- a/naiveproxy/src/base/allocator/partition_alloc_support.cc +++ b/naiveproxy/src/base/allocator/partition_alloc_support.cc @@ -2,13 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/rand_util.h" #ifdef UNSAFE_BUFFERS_BUILD // TODO(crbug.com/40284755): Remove this and spanify to fix the errors. #pragma allow_unsafe_buffers #endif -#include "base/allocator/partition_alloc_support.h" - #include #include #include @@ -19,6 +18,7 @@ #include #include "base/allocator/partition_alloc_features.h" +#include "base/allocator/partition_alloc_support.h" #include "base/allocator/scheduler_loop_quarantine_config.h" #include "base/at_exit.h" #include "base/check.h" @@ -42,7 +42,9 @@ #include "base/strings/string_split.h" #include "base/strings/stringprintf.h" #include "base/synchronization/lock_impl.h" +#include "base/synchronization/lock_metrics_recorder.h" #include "base/system/sys_info.h" +#include "base/task/common/task_annotator.h" #include "base/task/single_thread_task_runner.h" #include "base/thread_annotations.h" #include "base/threading/platform_thread.h" @@ -67,9 +69,11 @@ #include "partition_alloc/partition_root.h" #include "partition_alloc/pointers/instance_tracer.h" #include "partition_alloc/pointers/raw_ptr.h" +#include "partition_alloc/scheduler_loop_quarantine.h" #include "partition_alloc/shim/allocator_shim.h" #include "partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h" #include "partition_alloc/shim/allocator_shim_dispatch_to_noop_on_free.h" +#include "partition_alloc/spinning_mutex.h" #include "partition_alloc/stack/stack.h" #include "partition_alloc/thread_cache.h" @@ -130,13 +134,40 @@ namespace switches { constexpr char kZygoteProcess[] = "zygote"; } // namespace switches +class LockMetricsRecorderSupport + : public partition_alloc::internal::LockMetricsRecorderInterface { + public: + LockMetricsRecorderSupport() : recorder_(base::LockMetricsRecorder::Get()) {} + + static LockMetricsRecorderSupport* Instance() { + static LockMetricsRecorderSupport instance; + return &instance; + } + + bool ShouldRecordLockAcquisitionTime() const override { + return recorder_->ShouldRecordLockAcquisitionTime(); + } + + void RecordLockAcquisitionTime( + partition_alloc::internal::base::TimeDelta sample) override { + recorder_->RecordLockAcquisitionTime( + Microseconds(sample.InMicroseconds()), + base::LockMetricsRecorder::LockType::kPartitionAllocLock); + } + + private: + base::LockMetricsRecorder* recorder_; +}; + } // namespace namespace { void RunThreadCachePeriodicPurge() { // Micros, since periodic purge should typically take at most a few ms. - SCOPED_UMA_HISTOGRAM_TIMER_MICROS("Memory.PartitionAlloc.PeriodicPurge"); + SCOPED_UMA_HISTOGRAM_TIMER_MICROS_SUBSAMPLED( + "Memory.PartitionAlloc.PeriodicPurge.Subsampled", + base::ShouldRecordSubsampledMetric(0.01)); TRACE_EVENT0("memory", "PeriodicPurge"); auto& instance = ::partition_alloc::ThreadCacheRegistry::Instance(); instance.RunPeriodicPurge(); @@ -785,6 +816,11 @@ void ReconfigurePartitionForKnownProcess(const std::string& process_type) { // experiments. } +#if PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) +BASE_FEATURE(kPartitionAllocMakeSchedulerLoopQuarantinePurgeNoOp, + FEATURE_ENABLED_BY_DEFAULT); +#endif // PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + void MakeFreeNoOp() { // Ignoring `free()` during Shutdown would allow developers to introduce new // dangling pointers. So we want to avoid ignoring free when it is enabled. @@ -796,9 +832,18 @@ void MakeFreeNoOp() { return; } #endif // PA_BUILDFLAG(ENABLE_DANGLING_RAW_PTR_CHECKS) + #if PA_BUILDFLAG(USE_ALLOCATOR_SHIM) allocator_shim::InsertNoOpOnFreeAllocatorShimOnShutDown(); #endif // PA_BUILDFLAG(USE_ALLOCATOR_SHIM) + +#if PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + if (base::FeatureList::IsEnabled( + kPartitionAllocMakeSchedulerLoopQuarantinePurgeNoOp)) { + partition_alloc::internal::ThreadBoundSchedulerLoopQuarantineBranch:: + DangerouslyDisablePurge(); + } +#endif // PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) } PartitionAllocSupport* PartitionAllocSupport::Get() { @@ -931,6 +976,9 @@ void PartitionAllocSupport::ReconfigureEarlyish( #if PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) allocator_shim::EnablePartitionAllocMemoryReclaimer(); #endif // PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + + partition_alloc::internal::SpinningMutex::SetLockMetricsRecorder( + LockMetricsRecorderSupport::Instance()); } void PartitionAllocSupport::ReconfigureAfterZygoteFork( @@ -976,6 +1024,7 @@ void PartitionAllocSupport::ReconfigureAfterFeatureListInit( base::allocator::InstallDanglingRawPtrChecks(); } base::allocator::InstallUnretainedDanglingRawPtrChecks(); + { base::AutoLock scoped_lock(lock_); // Avoid initializing more than once. @@ -1017,10 +1066,9 @@ void PartitionAllocSupport::ReconfigureAfterFeatureListInit( // Configure ASAN hooks to report the `MiraclePtr status`. This is enabled // only if BackupRefPtr is normally enabled in the current process for the - // current platform. Note that CastOS and iOS aren't protected by BackupRefPtr + // current platform. Note that CastOS is not protected by BackupRefPtr // a the moment, so they are excluded. -#if PA_BUILDFLAG(USE_ASAN_BACKUP_REF_PTR) && !PA_BUILDFLAG(IS_CASTOS) && \ - !PA_BUILDFLAG(IS_IOS) +#if PA_BUILDFLAG(USE_ASAN_BACKUP_REF_PTR) && !PA_BUILDFLAG(IS_CASTOS) if (ShouldEnableFeatureOnProcess( base::features::kBackupRefPtrEnabledProcessesParam.Get(), process_type)) { @@ -1036,7 +1084,7 @@ void PartitionAllocSupport::ReconfigureAfterFeatureListInit( EnableExtractionCheck(false), EnableInstantiationCheck(false)); } -#endif // PA_BUILDFLAG(USE_ASAN_BACKUP_REF_PTR) +#endif // PA_BUILDFLAG(USE_ASAN_BACKUP_REF_PTR) && !PA_BUILDFLAG(IS_CASTOS) #if PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) auto bucket_distribution = allocator_shim::BucketDistribution::kNeutral; @@ -1057,11 +1105,25 @@ void PartitionAllocSupport::ReconfigureAfterFeatureListInit( const auto scheduler_loop_quarantine_thread_local_config = GetSchedulerLoopQuarantineConfiguration( process_type, SchedulerLoopQuarantineBranchType::kThreadLocalDefault); + const auto + scheduler_loop_quarantine_for_advanced_memory_safety_checks_config = + GetSchedulerLoopQuarantineConfiguration( + process_type, + SchedulerLoopQuarantineBranchType::kAdvancedMemorySafetyChecks); + + if (base::FeatureList::IsEnabled( + base::features:: + kPartitionAllocSchedulerLoopQuarantineTaskControlledPurge) && + ShouldEnableFeatureOnProcess( + base::features:: + kPartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcessesParam + .Get(), + process_type)) { + base::EnableSchedulerLoopQuarantineTaskControlledPurge(); + } const bool eventually_zero_freed_memory = base::FeatureList::IsEnabled( base::features::kPartitionAllocEventuallyZeroFreedMemory); - const bool fewer_memory_regions = base::FeatureList::IsEnabled( - base::features::kPartitionAllocFewerMemoryRegions); bool enable_memory_tagging = false; partition_alloc::TagViolationReportingMode memory_tagging_reporting_mode = @@ -1158,8 +1220,8 @@ void PartitionAllocSupport::ReconfigureAfterFeatureListInit( memory_tagging_reporting_mode, bucket_distribution, scheduler_loop_quarantine_global_config, scheduler_loop_quarantine_thread_local_config, - allocator_shim::EventuallyZeroFreedMemory(eventually_zero_freed_memory), - allocator_shim::FewerMemoryRegions(fewer_memory_regions)); + scheduler_loop_quarantine_for_advanced_memory_safety_checks_config, + allocator_shim::EventuallyZeroFreedMemory(eventually_zero_freed_memory)); const uint32_t extras_size = allocator_shim::GetMainPartitionRootExtrasSize(); // As per description, extras are optional and are expected not to @@ -1237,56 +1299,31 @@ void PartitionAllocSupport::ReconfigureAfterTaskRunnerInit( // initialized later. DCHECK(process_type != switches::kZygoteProcess); - partition_alloc::ThreadCacheRegistry::Instance().SetPurgingConfiguration( - base::features::GetThreadCacheMinPurgeInterval(), - base::features::GetThreadCacheMaxPurgeInterval(), - base::features::GetThreadCacheDefaultPurgeInterval(), - size_t(base::features::GetThreadCacheMinCachedMemoryForPurgingBytes())); - base::allocator::StartThreadCachePeriodicPurge(); - if (base::FeatureList::IsEnabled( - base::features::kEnableConfigurableThreadCacheMultiplier)) { - // If kEnableConfigurableThreadCacheMultiplier is enabled, override the - // multiplier value with the corresponding feature param. -#if BUILDFLAG(IS_ANDROID) - ::partition_alloc::ThreadCacheRegistry::Instance().SetThreadCacheMultiplier( - base::features::GetThreadCacheMultiplierForAndroid()); -#else // BUILDFLAG(IS_ANDROID) - ::partition_alloc::ThreadCacheRegistry::Instance().SetThreadCacheMultiplier( - base::features::GetThreadCacheMultiplier()); -#endif // BUILDFLAG(IS_ANDROID) - } else { #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) - // If kEnableConfigurableThreadCacheMultiplier is not enabled, lower - // thread cache limits on Android low end device to avoid stranding too much - // memory in the caches. - if (SysInfo::IsLowEndDeviceOrPartialLowEndModeEnabled( - features::kPartialLowEndModeExcludePartitionAllocSupport)) { - ::partition_alloc::ThreadCacheRegistry::Instance() - .SetThreadCacheMultiplier( - ::partition_alloc::ThreadCache::kDefaultMultiplier / 2.); - } -#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) + // Lower thread cache limits to avoid stranding too much memory in the caches. + if (SysInfo::IsLowEndDeviceOrPartialLowEndModeEnabled( + features::kPartialLowEndModeExcludePartitionAllocSupport)) { + ::partition_alloc::ThreadCacheRegistry::Instance().SetThreadCacheMultiplier( + ::partition_alloc::ThreadCache::kDefaultMultiplier / 2.); } +#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) // Renderer processes are more performance-sensitive, increase thread cache // limits. if (process_type == switches::kRendererProcess && base::FeatureList::IsEnabled( base::features::kPartitionAllocLargeThreadCacheSize)) { - largest_cached_size_ = - size_t(base::features::GetPartitionAllocLargeThreadCacheSizeValue()); + largest_cached_size_ = ::partition_alloc::kThreadCacheLargeSizeThreshold; #if BUILDFLAG(IS_ANDROID) // Use appropriately lower amount for Android devices with 3GB or less. // Devices almost always report less physical memory than what they actually // have, so use 3.2GB (a threshold commonly uses throughout code) to avoid // accidentally catching devices advertised as 4GB. - if (base::SysInfo::AmountOfPhysicalMemoryMB() < 3.2 * 1024) { - largest_cached_size_ = size_t( - base::features:: - GetPartitionAllocLargeThreadCacheSizeValueForLowRAMAndroid()); + if (base::SysInfo::AmountOfPhysicalMemory().InGiBF() < 3.2) { + largest_cached_size_ = ::partition_alloc::kThreadCacheDefaultSizeThreshold; } #endif // BUILDFLAG(IS_ANDROID) diff --git a/naiveproxy/src/base/allocator/partition_alloc_support.h b/naiveproxy/src/base/allocator/partition_alloc_support.h index 81ad56f151..06e9c9f8fe 100644 --- a/naiveproxy/src/base/allocator/partition_alloc_support.h +++ b/naiveproxy/src/base/allocator/partition_alloc_support.h @@ -179,6 +179,7 @@ BASE_EXPORT void CheckHeapIntegrity(const void* ptr); BASE_EXPORT void SetDoubleFreeOrCorruptionDetectedFn(void (*fn)(uintptr_t)); using partition_alloc::SchedulerLoopQuarantineScanPolicyUpdater; +using partition_alloc::ScopedSchedulerLoopQuarantineDisallowScanlessPurge; using partition_alloc::ScopedSchedulerLoopQuarantineExclusion; } // namespace base::allocator diff --git a/naiveproxy/src/base/allocator/partition_allocator/build_overrides/partition_alloc.gni b/naiveproxy/src/base/allocator/partition_allocator/build_overrides/partition_alloc.gni index 00749baef8..b95f6d8633 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/build_overrides/partition_alloc.gni +++ b/naiveproxy/src/base/allocator/partition_allocator/build_overrides/partition_alloc.gni @@ -16,7 +16,6 @@ shim_supports_sized_dealloc_default = false enable_backup_ref_ptr_support_default = false enable_backup_ref_ptr_slow_checks_default = false enable_dangling_raw_ptr_checks_default = false -enable_ios_corruption_hardening_default = false # This is the default build configuration for pointers/raw_ptr*. raw_ptr_zero_on_construct_default = true diff --git a/naiveproxy/src/base/allocator/partition_allocator/partition_alloc.gni b/naiveproxy/src/base/allocator/partition_allocator/partition_alloc.gni index 4b758e7279..5cb2b85ae6 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/partition_alloc.gni +++ b/naiveproxy/src/base/allocator/partition_allocator/partition_alloc.gni @@ -54,6 +54,11 @@ if (!defined(partition_alloc_dcheck_always_on_default)) { } } +# Allows embedders to optionally disable PartitionAlloc. +if (!defined(use_partition_alloc_default)) { + use_partition_alloc_default = true +} + # PartitionAlloc have limited support for MSVC's cl.exe compiler. It can only # access the generate "buildflags" and the "raw_ptr" definitions implemented # with RawPtrNoOpImpl. Everything else is considered not supported. @@ -124,7 +129,7 @@ declare_args() { # and doesn't wish to incur the library size increase (crbug.com/674570). # 2. On NaCl (through this declaration), where PartitionAlloc doesn't # build at all. - use_partition_alloc = is_clang_or_gcc + use_partition_alloc = use_partition_alloc_default && is_clang_or_gcc } if (!is_clang_or_gcc) { @@ -152,15 +157,6 @@ declare_args() { use_partition_alloc_as_malloc } -declare_args() { - # This is a flag for binary experiment on iOS. When BRP for iOS is enabled, - # we see some un-actionable `DoubleFreeOrCorruptionDetected` crashes. - # This flag enables some extra `CHECK`s to get actionable crash reports. - # TODO(crbug.com/371135823): Remove upon completion of investigation. - enable_ios_corruption_hardening = use_partition_alloc_as_malloc && is_ios && - enable_ios_corruption_hardening_default -} - assert( !enable_allocator_shim_partition_alloc_dispatch_with_advanced_checks_support || use_partition_alloc_as_malloc, "PartitionAlloc with advanced checks requires PartitionAlloc itself.") @@ -214,20 +210,19 @@ declare_args() { # Enable reentrancy checks at `partition_alloc::internal::Lock`. # TODO(crbug.com/371135823): Remove upon completion of investigation. - enable_partition_lock_reentrancy_check = enable_ios_corruption_hardening + enable_partition_lock_reentrancy_check = false # This will write a fixed cookie pattern at the end of each allocation, and # later verify the pattern remain unchanged to ensure there is no OOB write. # It comes with performance and memory cost, hence enabled only in debug. use_partition_cookie = - partition_alloc_is_debug || partition_alloc_dcheck_always_on || - enable_ios_corruption_hardening + partition_alloc_is_debug || partition_alloc_dcheck_always_on # This will change partition cookie size to 4B or 8B, whichever equivalent to # size of InSlotMetadata. This option is useful for InSlotMetadata corruption # investigation. # TODO(crbug.com/371135823): Remove upon completion of investigation. - smaller_partition_cookie = enable_ios_corruption_hardening + smaller_partition_cookie = false } declare_args() { @@ -270,7 +265,7 @@ declare_args() { # outside of Chromium. use_asan_backup_ref_ptr = build_with_chromium && is_asan && - (is_win || is_android || is_linux || is_mac || is_chromeos) + (is_win || is_android || is_linux || is_apple || is_chromeos) # Use probe-on-destruct unowned ptr detection with ASAN. use_raw_ptr_asan_unowned_impl = false @@ -305,13 +300,12 @@ declare_args() { enable_backup_ref_ptr_feature_flag = enable_backup_ref_ptr_support && use_raw_ptr_backup_ref_impl && # Platforms where BackupRefPtr hasn't shipped yet: - !is_castos && !is_ios + !is_castos # While keeping BRP support, override a feature flag to make it disabled # state. This will overwrite `enable_backup_ref_ptr_feature_flag`. # TODO(https://crbug.com/372183586): Fix the bug and remove this arg. - force_disable_backup_ref_ptr_feature = - enable_backup_ref_ptr_support && enable_ios_corruption_hardening + force_disable_backup_ref_ptr_feature = enable_backup_ref_ptr_support && false # Build support for Dangling Ptr Detection (DPD) via BackupRefPtr (BRP), # making the raw_ptr implementation to RawPtrBackupRefImpl if active. @@ -345,12 +339,11 @@ declare_args() { declare_args() { # Because of address space issue, this feature cannot be enabled on # 32bit OS and iOS, i.e. has_64_bit_pointers && !is_ios - move_metadata_outside_gigacage = false && has_64_bit_pointers && !is_ios + move_metadata_outside_gigacage = has_64_bit_pointers && !is_ios } declare_args() { - enable_move_metadata_outside_gigacage_trial = - false && move_metadata_outside_gigacage + enable_move_metadata_outside_gigacage_trial = move_metadata_outside_gigacage } assert(!enable_move_metadata_outside_gigacage_trial || diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/BUILD.gn b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/BUILD.gn index df7b1d00a1..179a38ff93 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/BUILD.gn +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/BUILD.gn @@ -280,7 +280,7 @@ if (is_clang_or_gcc) { } config("memory_tagging") { - if (current_cpu == "arm64" && + if (current_cpu == "arm64" && is_clang && (is_linux || is_chromeos || is_android || is_fuchsia)) { # base/ has access to the MTE intrinsics because it needs to use them, # but they're not backwards compatible. Use base::CPU::has_mte() @@ -648,6 +648,7 @@ if (is_clang_or_gcc) { "partition_alloc_base/memory/ref_counted.h", "partition_alloc_base/memory/scoped_policy.h", "partition_alloc_base/memory/scoped_refptr.h", + "partition_alloc_base/memory/stack_allocated.h", "partition_alloc_base/no_destructor.h", "partition_alloc_base/notreached.h", "partition_alloc_base/numerics/checked_math.h", diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_types.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_types.h index 05d0f63a4b..4503c51230 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_types.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_types.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_ADDRESS_POOL_MANAGER_TYPES_H_ #define PARTITION_ALLOC_ADDRESS_POOL_MANAGER_TYPES_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/allocator_config.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/allocator_config.cc index ce5aafec9e..7b802ec1b8 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/allocator_config.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/allocator_config.cc @@ -15,9 +15,13 @@ namespace partition_alloc { namespace { enum ExternalMetadataTrialGroupPercentage { - kEnabled = 10, // 10% - kDisabled = 10, // 10% + kEnabled = 25, // 25% enabled + kDisabled = 25, // 25% control + // Otherwise, disabled (default behavior) }; +// Rather than doing percentage group based assignment, set all clients to +// enabled when true. +constexpr bool kDefaultEnableExternalMetadataTrial = true; ExternalMetadataTrialGroup s_externalMetadataJoinedGroup = ExternalMetadataTrialGroup::kUndefined; @@ -31,6 +35,11 @@ void SetExternalMetadataTrialGroup(ExternalMetadataTrialGroup group) { namespace internal { ExternalMetadataTrialGroup SelectExternalMetadataTrialGroup() { + if constexpr (kDefaultEnableExternalMetadataTrial) { + auto group = ExternalMetadataTrialGroup::kEnabled; + SetExternalMetadataTrialGroup(group); + return group; + } uint32_t random = internal::RandomValue() / static_cast(std::numeric_limits::max()) * 100.0; diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.cc index e0b21bedc1..b2d5632c9d 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/dangling_raw_ptr_checks.h" #include "partition_alloc/partition_alloc_base/component_export.h" diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/internal_allocator.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/internal_allocator.cc index a5ddd65416..65c5076773 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/internal_allocator.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/internal_allocator.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/internal_allocator.h" namespace partition_alloc::internal { diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/internal_allocator_forward.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/internal_allocator_forward.h index 77d415ff36..8965d2330c 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/internal_allocator_forward.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/internal_allocator_forward.h @@ -46,7 +46,7 @@ class InternalAllocator { } template - bool operator==(const InternalAllocator&) { + bool operator==(const InternalAllocator&) const { // InternalAllocator can free allocations made by InternalAllocator. return true; } diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/oom_callback.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/oom_callback.cc index afd87d11b4..0db8407182 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/oom_callback.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/oom_callback.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/oom_callback.h" #include "partition_alloc/partition_alloc_check.h" diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/oom_callback.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/oom_callback.h index ef703fd9af..3a4d32bcb1 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/oom_callback.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/oom_callback.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_OOM_CALLBACK_H_ #define PARTITION_ALLOC_OOM_CALLBACK_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator.cc index 6a9cc2494b..ad16e7803f 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator.cc @@ -475,11 +475,7 @@ void TerminateAnotherProcessOnCommitFailure() { return; } - // LINT.IfChange(CHROME_RESULT_CODE_TERMINATED_BY_OTHER_PROCESS_ON_COMMIT_FAILURE) - static constexpr UINT kExitCode = 39; - // LINT.ThenChange(/chrome/common/chrome_result_codes.h:CHROME_RESULT_CODE_TERMINATED_BY_OTHER_PROCESS_ON_COMMIT_FAILURE) - - ::TerminateProcess(process_to_terminate, kExitCode); + ::TerminateProcess(process_to_terminate, kTerminateOnCommitFailureExitCode); ::CloseHandle(process_to_terminate); } #endif diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator.h index 7003ca5374..70456222ed 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator.h @@ -26,6 +26,12 @@ namespace partition_alloc { +// LINT.IfChange(CHROME_RESULT_CODE_TERMINATED_BY_OTHER_PROCESS_ON_COMMIT_FAILURE) +// Exit code to use when another process is terminated on commit failure. +// This is defined here to avoid a dependency on Chrome. +static constexpr unsigned int kTerminateOnCommitFailureExitCode = 39; +// LINT.ThenChange(/chrome/common/chrome_result_codes.h:CHROME_RESULT_CODE_TERMINATED_BY_OTHER_PROCESS_ON_COMMIT_FAILURE) + struct PageAccessibilityConfiguration { enum Permissions { kInaccessible, diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h index cbb3c78f51..75311dc54d 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h @@ -32,7 +32,8 @@ #elif (PA_BUILDFLAG(IS_ANDROID) && PA_BUILDFLAG(PA_ARCH_CPU_64_BITS)) || \ (PA_BUILDFLAG(IS_LINUX) && PA_BUILDFLAG(PA_ARCH_CPU_ARM64)) || \ - (PA_BUILDFLAG(IS_LINUX) && PA_BUILDFLAG(PA_ARCH_CPU_PPC64)) + (PA_BUILDFLAG(IS_LINUX) && PA_BUILDFLAG(PA_ARCH_CPU_PPC64)) || \ + (PA_BUILDFLAG(IS_LINUX) && PA_BUILDFLAG(PA_ARCH_CPU_LOONGARCH64)) // This should work for all POSIX (if needed), but currently all other // supported OS/architecture combinations use either hard-coded values // (such as x86) or have means to determine these values without needing @@ -130,7 +131,7 @@ PageAllocationGranularityShift() { // compiled for 64kB are likely to work on 4kB systems, 64kB is a good choice // here. return 16; // 64kB -#elif defined(_MIPS_ARCH_LOONGSON) || PA_BUILDFLAG(PA_ARCH_CPU_LOONGARCH64) +#elif defined(_MIPS_ARCH_LOONGSON) return 14; // 16kB #elif PA_BUILDFLAG(IS_APPLE) && PA_BUILDFLAG(PA_ARCH_CPU_64_BITS) return static_cast(vm_page_shift); @@ -140,7 +141,7 @@ PageAllocationGranularityShift() { // compiled for 64kB are likely to work on 4kB systems, 64kB is a good choice // here. return 16; // 64kB -#elif defined(_MIPS_ARCH_LOONGSON) || PA_BUILDFLAG(PA_ARCH_CPU_LOONGARCH64) +#elif defined(_MIPS_ARCH_LOONGSON) return 14; // 16kB #elif PA_BUILDFLAG(IS_APPLE) && PA_BUILDFLAG(PA_ARCH_CPU_64_BITS) return static_cast(vm_page_shift); diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internal.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internal.h index 1433a585dd..d02f4548a6 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internal.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internal.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_PAGE_ALLOCATOR_INTERNAL_H_ #define PARTITION_ALLOC_PAGE_ALLOCATOR_INTERNAL_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_address_space.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_address_space.cc index 9133e5f582..f7f557efa7 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_address_space.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_address_space.cc @@ -320,9 +320,14 @@ void PartitionAddressSpace::InitThreadIsolatedPool( pool_size)); #if PA_CONFIG(MOVE_METADATA_OUT_OF_GIGACAGE) - offsets_to_metadata_[kThreadIsolatedPoolHandle] = - metadata_region_start_ - setup_.thread_isolated_pool_base_address_ + - MetadataInnerOffset(kThreadIsolatedPoolHandle); + if (metadata_region_start_ != kUninitializedPoolBaseAddress) { + offsets_to_metadata_[kThreadIsolatedPoolHandle] = + metadata_region_start_ - setup_.thread_isolated_pool_base_address_ + + MetadataInnerOffset(kThreadIsolatedPoolHandle); + } else { + // If no metadata region is available, use `SystemPageSize()`. + offsets_to_metadata_[kThreadIsolatedPoolHandle] = SystemPageSize(); + } #endif // PA_CONFIG(MOVE_METADATA_OUT_OF_GIGACAGE) } #endif // PA_BUILDFLAG(ENABLE_THREAD_ISOLATION) @@ -394,6 +399,9 @@ void PartitionAddressSpace::UninitThreadIsolatedPoolForTesting() { setup_.thread_isolated_pool_base_address_ = kUninitializedPoolBaseAddress; setup_.thread_isolation_.enabled = false; } +#if PA_CONFIG(MOVE_METADATA_OUT_OF_GIGACAGE) + offsets_to_metadata_[kThreadIsolatedPoolHandle] = SystemPageSize(); +#endif // PA_CONFIG(MOVE_METADATA_OUT_OF_GIGACAGE) } #endif @@ -444,6 +452,9 @@ void PartitionAddressSpace::InitMetadataRegionAndOffsets() { // ConfigurablePool has not been initialized yet at this time. offsets_to_metadata_[kConfigurablePoolHandle] = SystemPageSize(); +#if PA_BUILDFLAG(ENABLE_THREAD_ISOLATION) + offsets_to_metadata_[kThreadIsolatedPoolHandle] = SystemPageSize(); +#endif // PA_BUILDFLAG(ENABLE_THREAD_ISOLATION) } #endif // PA_CONFIG(MOVE_METADATA_OUT_OF_GIGACAGE) diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h index 38a6d906ec..63be26202c 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_COMPILER_SPECIFIC_H_ #define PARTITION_ALLOC_PARTITION_ALLOC_BASE_COMPILER_SPECIFIC_H_ @@ -495,7 +490,7 @@ inline constexpr bool AnalyzerAssumeTrue(bool arg) { // Annotates code indicating that it should be permanently exempted from // `-Wunsafe-buffer-usage`. For temporary cases such as migrating callers to -// safer patterns, use `UNSAFE_TODO()` instead; +// safer patterns, use `PA_UNSAFE_TODO()` instead; #if defined(__clang__) // Disabling `clang-format` allows each `_Pragma` to be on its own line, as // recommended by https://gcc.gnu.org/onlinedocs/cpp/Pragmas.html. diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h index 4d16758c85..94a565b834 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_COMPONENT_EXPORT_H_ #define PARTITION_ALLOC_PARTITION_ALLOC_BASE_COMPONENT_EXPORT_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h index 84cc320562..cdacb7ffb7 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_CXX20_IS_CONSTANT_EVALUATED_H_ #define PARTITION_ALLOC_PARTITION_ALLOC_BASE_CXX20_IS_CONSTANT_EVALUATED_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.cc index 2ded933823..842266a880 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/partition_alloc_base/debug/alias.h" #include "partition_alloc/partition_alloc_base/compiler_specific.h" diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util_posix.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util_posix.cc index 3359e7d1e4..ee693723d8 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util_posix.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util_posix.cc @@ -2,13 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/partition_alloc_base/files/file_util.h" +#include "partition_alloc/partition_alloc_base/compiler_specific.h" #include "partition_alloc/partition_alloc_base/posix/eintr_wrapper.h" namespace partition_alloc::internal::base { @@ -16,8 +12,8 @@ namespace partition_alloc::internal::base { bool ReadFromFD(int fd, char* buffer, size_t bytes) { size_t total_read = 0; while (total_read < bytes) { - ssize_t bytes_read = - WrapEINTR(read)(fd, buffer + total_read, bytes - total_read); + ssize_t bytes_read = WrapEINTR(read)( + fd, PA_UNSAFE_TODO(buffer + total_read), bytes - total_read); if (bytes_read <= 0) { break; } diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h index 649ee1b38e..e0ee3ec059 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_IMMEDIATE_CRASH_H_ #define PARTITION_ALLOC_PARTITION_ALLOC_BASE_IMMEDIATE_CRASH_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.h index 4e041b7e43..b389022b59 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_IOS_IOS_UTIL_H_ #define PARTITION_ALLOC_PARTITION_ALLOC_BASE_IOS_IOS_UTIL_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.mm b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.mm index 0f34a7c22b..21f6203a58 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.mm +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.mm @@ -101,8 +101,7 @@ int MacOSMajorVersion() { // Darwin major version 25 corresponds to macOS version 26. Assume a // correspondence between Darwin's major version numbers and macOS major - // version numbers. TODO(https://crbug.com/424162749): Verify this before - // release. + // version numbers. return darwin_major_version + 1; }(); return macos_major_version; diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size.h index b2f7a793aa..7180f034f1 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_MEMORY_PAGE_SIZE_H_ #define PARTITION_ALLOC_PARTITION_ALLOC_BASE_MEMORY_PAGE_SIZE_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/scoped_policy.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/scoped_policy.h index 32f88bc218..e8e9a200ff 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/scoped_policy.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/scoped_policy.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_MEMORY_SCOPED_POLICY_H_ #define PARTITION_ALLOC_PARTITION_ALLOC_BASE_MEMORY_SCOPED_POLICY_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/stack_allocated.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/stack_allocated.h new file mode 100644 index 0000000000..0b1963e0ee --- /dev/null +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/stack_allocated.h @@ -0,0 +1,61 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_MEMORY_STACK_ALLOCATED_H_ +#define PARTITION_ALLOC_PARTITION_ALLOC_BASE_MEMORY_STACK_ALLOCATED_H_ + +#include + +#if defined(__clang__) +#define PA_STACK_ALLOCATED_IGNORE(reason) \ + __attribute__((annotate("stack_allocated_ignore"))) +#else // !defined(__clang__) +#define PA_STACK_ALLOCATED_IGNORE(reason) +#endif // !defined(__clang__) + +// If a class or one of its ancestor classes is annotated with +// PA_STACK_ALLOCATED() in its class definition, then instances of the class may +// not be allocated on the heap or as a member variable of a non-stack-allocated +// class. +#define PA_STACK_ALLOCATED() \ + public: \ + using IsStackAllocatedTypeMarker [[maybe_unused]] = int; \ + \ + private: \ + void* operator new(size_t) = delete; \ + void* operator new(size_t, ::partition_alloc::internal::base::NotNullTag, \ + void*) = delete; \ + void* operator new(size_t, void*) = delete + +namespace partition_alloc::internal::base { + +// NotNullTag was originally added to WebKit here: +// https://trac.webkit.org/changeset/103243/webkit +// ...with the stated goal of improving the performance of the placement new +// operator and potentially enabling the -fomit-frame-pointer compiler flag. +// +// TODO(szager): The placement new operator which uses this tag is currently +// defined in third_party/blink/renderer/platform/wtf/allocator/allocator.h, +// in the global namespace. It should probably move to /base. +// +// It's unknown at the time of writing whether it still provides any benefit +// (or if it ever did). It is used by placing the kNotNull tag before the +// address of the object when calling placement new. +// +// If the kNotNull tag is specified to placement new for a null pointer, +// Undefined Behaviour can result. +// +// Example: +// +// union { int i; } u; +// +// // Typically placement new looks like this. +// new (&u.i) int(3); +// // But we can promise `&u.i` is not null like this. +// new (base::NotNullTag::kNotNull, &u.i) int(3); +enum class NotNullTag { kNotNull }; + +} // namespace partition_alloc::internal::base + +#endif // PARTITION_ALLOC_PARTITION_ALLOC_BASE_MEMORY_STACK_ALLOCATED_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.h index 9fe685428f..1637536718 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_POSIX_SAFE_STRERROR_H_ #define PARTITION_ALLOC_PARTITION_ALLOC_BASE_POSIX_SAFE_STRERROR_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle.h index 2e634e6268..f2961dd625 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_PROCESS_PROCESS_HANDLE_H_ #define PARTITION_ALLOC_PARTITION_ALLOC_BASE_PROCESS_PROCESS_HANDLE_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_posix.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_posix.cc index 8ce8c47de1..8989883dea 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_posix.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_posix.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/partition_alloc_base/process/process_handle.h" #include diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.cc index 765cd9ad27..84634564c4 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/partition_alloc_base/rand_util.h" #include diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error.h index 7cbfe824ea..d3460d907e 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_PARTITION_ALLOC_BASE_SCOPED_CLEAR_LAST_ERROR_H_ #define PARTITION_ALLOC_PARTITION_ALLOC_BASE_SCOPED_CLEAR_LAST_ERROR_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.cc index ad9f26dc40..9c4ff7f7f8 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.cc @@ -2,37 +2,34 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/partition_alloc_base/strings/string_util.h" #include +#include "partition_alloc/partition_alloc_base/compiler_specific.h" + namespace partition_alloc::internal::base::strings { const char* FindLastOf(const char* text, const char* characters) { size_t length = strlen(text); - const char* ptr = text + length - 1; + const char* ptr = PA_UNSAFE_TODO(text + length - 1); while (ptr >= text) { - if (strchr(characters, *ptr)) { + if (PA_UNSAFE_TODO(strchr(characters, *ptr))) { return ptr; } - --ptr; + PA_UNSAFE_TODO(--ptr); } return nullptr; } const char* FindLastNotOf(const char* text, const char* characters) { size_t length = strlen(text); - const char* ptr = text + length - 1; + const char* ptr = PA_UNSAFE_TODO(text + length - 1); while (ptr >= text) { - if (!strchr(characters, *ptr)) { + if (!PA_UNSAFE_TODO(strchr(characters, *ptr))) { return ptr; } - --ptr; + PA_UNSAFE_TODO(--ptr); } return nullptr; } diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.cc index ff4871b93d..27d2cff853 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/partition_alloc_base/threading/platform_thread.h" namespace partition_alloc::internal::base { diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_apple_for_testing.mm b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_apple_for_testing.mm index 19b5eecf01..9881d375b6 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_apple_for_testing.mm +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_apple_for_testing.mm @@ -58,7 +58,7 @@ void PlatformThreadForTesting::YieldCurrentThread() { size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes) { #if PA_BUILDFLAG(IS_IOS) - return 0; + return 1024 * 1024; #else // The macOS default for a pthread stack size is 512kB. // Libc-594.1.4/pthreads/pthread.c's pthread_attr_init uses diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_conversion_posix.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_conversion_posix.cc index 38bed1da65..1039869ad0 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_conversion_posix.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_conversion_posix.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include #include diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.cc index 5a4fc856e4..b1c4c925a3 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/partition_alloc_base/time/time_override.h" #include "partition_alloc/partition_alloc_base/check.h" diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h index f6f59debbe..54c02af1d3 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h @@ -2,10 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif #ifndef PARTITION_ALLOC_PARTITION_ALLOC_BUILDFLAGS_H_ #define PARTITION_ALLOC_PARTITION_ALLOC_BUILDFLAGS_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h index 07565170b9..823ab4159e 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h @@ -165,6 +165,18 @@ constexpr bool kUseLazyCommit = true; constexpr bool kUseLazyCommit = false; #endif +// See the comment in PartitionBucket::SlotSpanCommittedSize(). This should not +// be enabled on Windows (because it increases committed memory, which is a +// limited system-wide resource on this platform). It has been evaluated on +// macOS, where it yielded no beenefit (nor any real downside). +constexpr bool kUseFewerMemoryRegions = +#if PA_BUILDFLAG(IS_LINUX) || PA_BUILDFLAG(IS_ANDROID) || \ + PA_BUILDFLAG(IS_CHROMEOS) + true; +#else + false; +#endif + // On these platforms, lock all the partitions before fork(), and unlock after. // This may be required on more platforms in the future. #define PA_CONFIG_HAS_ATFORK_HANDLER() \ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h index 7f33bd5506..e941d1686b 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h @@ -69,7 +69,9 @@ enum class FreeFlags { kNoHooks = 1 << 1, // Internal. // Quarantine for a while to ensure no UaF from on-stack pointers. kSchedulerLoopQuarantine = 1 << 2, - kMaxValue = kSchedulerLoopQuarantine, + // Quarantine for a while to ensure no UaF from on-stack pointers. + kSchedulerLoopQuarantineForAdvancedMemorySafetyChecks = 1 << 3, + kMaxValue = kSchedulerLoopQuarantineForAdvancedMemorySafetyChecks, }; PA_DEFINE_OPERATORS_FOR_FLAGS(FreeFlags); } // namespace internal @@ -110,7 +112,7 @@ PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR size_t PartitionPageShift() { return PageAllocationGranularityShift() + 2; } -#elif defined(_MIPS_ARCH_LOONGSON) || PA_BUILDFLAG(PA_ARCH_CPU_LOONGARCH64) +#elif defined(_MIPS_ARCH_LOONGSON) PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR size_t PartitionPageShift() { return 16; // 64 KiB diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_for_testing.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_for_testing.h index fecc9f912f..49773244e2 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_for_testing.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_for_testing.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_PARTITION_ALLOC_FOR_TESTING_H_ #define PARTITION_ALLOC_PARTITION_ALLOC_FOR_TESTING_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.cc index 8fbce59af7..209ac54729 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/partition_alloc_hooks.h" #include diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.cc index 5850222b57..79051831f6 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.cc @@ -239,7 +239,7 @@ SlotSpanMetadata* PartitionDirectMap(PartitionRoot* root, // Note that this only affects allocations that are not served out of the // thread cache, but as a simple example the buffer partition in blink is // frequently used for large allocations (e.g. ArrayBuffer), and frequent, - // small ones (e.g. WTF::String), and does not have a thread cache. + // small ones (e.g. blink::String), and does not have a thread cache. ScopedUnlockGuard scoped_unlock{PartitionRootLock(root)}; const size_t slot_size = PartitionRoot::GetDirectMapSlotSize(raw_size); @@ -1449,7 +1449,7 @@ void PartitionBucket::InitializeSlotSpanForGwpAsan( size_t PartitionBucket::SlotSpanCommittedSize(PartitionRoot* root) const { // With lazy commit, we certainly don't want to commit more than // necessary. This is not reached, but keep the CHECK() as documentation. - PA_CHECK(!kUseLazyCommit); + static_assert(!(kUseLazyCommit && kUseFewerMemoryRegions)); // Memory is reserved in units of PartitionPage, but a given slot span may be // smaller than the reserved area. For instance (assuming 4k pages), for a @@ -1473,7 +1473,9 @@ size_t PartitionBucket::SlotSpanCommittedSize(PartitionRoot* root) const { // less than 2^16, and Chromium sometimes hits the limit (see // /proc/sys/vm/max_map_count for the current limit), largely because of // PartitionAlloc contributing thousands of regions. Locally, on a Linux - // system, this reduces the number of PartitionAlloc regions by up to ~4x. + // system, this reduces the number of PartitionAlloc regions by up to + // ~4x. This has been shown to meaningfully reduce crash rate on Linux-based + // platforms. // // Why is it safe? // The extra memory is not used by anything, so committing it doesn't make a @@ -1488,19 +1490,13 @@ size_t PartitionBucket::SlotSpanCommittedSize(PartitionRoot* root) const { // the size of the VMA red-black tree in the kernel), it might increase // slightly the cases where we bump into the sandbox memory limit. // - // Is it safe to do while running? - // Since this is decided through root settings, the value changes at runtime, - // so we may decommit memory that was never committed. This is safe onLinux, - // since decommitting is just changing permissions back to PROT_NONE, which - // the tail end would already have. - // // Can we do better? // For simplicity, we do not "fix" the regions that were committed before the // settings are changed (after feature list initialization). This means that // we end up with more regions that we could. The intent is to run a field // experiment, then change the default value, at which point we get the full // impact, so this is only temporary. - return root->settings.fewer_memory_regions + return kUseFewerMemoryRegions ? (get_pages_per_slot_span() << PartitionPageShift()) : get_bytes_per_span(); } diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.cc index d00a58e756..10ab7c6858 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/partition_freelist_entry.h" #include "partition_alloc/partition_alloc_base/immediate_crash.h" diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_oom.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_oom.h index 345fdc8913..6145c6520a 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_oom.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_oom.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - // Holds functions for generating OOM errors from PartitionAlloc. This is // distinct from oom.h in that it is meant only for use in PartitionAlloc. diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_page.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_page.h index ac78fd1685..a593ef453e 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_page.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_page.h @@ -110,7 +110,25 @@ struct SlotSpanMetadata { public: // Checks if it is feasible to store raw_size. - PA_ALWAYS_INLINE bool CanStoreRawSize() const { return can_store_raw_size_; } + PA_ALWAYS_INLINE bool CanStoreRawSize() const { +#if defined(THREAD_SANITIZER) + // `can_store_raw_size_` is a cache of the value in the bucket, stored there + // to avoid touching `bucket`. It causes issues with TSAN, since it is part + // of a bitfield along with non-constant values. + // + // The warning is correct, though it is extremely unlikely to cause issues + // in practice, as the element in the bitfield is constant, so the only case + // where it would cause issue is when a non-atomic read to a variable can + // give garbage results, where the bits are neither from the old nor the new + // value. + // + // TODO(crbug.com/437026570): Fix that properly, rather than relying on + // effectively a suppression. + return bucket->CanStoreRawSize(); +#else + return can_store_raw_size_; +#endif + } // Returns the total size of the slots that are currently provisioned. PA_ALWAYS_INLINE size_t GetProvisionedSize() const { diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc index 280ba23648..d8f9258ae9 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc @@ -1062,12 +1062,13 @@ void PartitionRoot::Init(PartitionOptions opts) { #endif // PA_BUILDFLAG(HAS_64_BIT_POINTERS) settings.eventually_zero_freed_memory = opts.eventually_zero_freed_memory == PartitionOptions::kEnabled; - settings.fewer_memory_regions = - opts.fewer_memory_regions == PartitionOptions::kEnabled; scheduler_loop_quarantine.Configure( scheduler_loop_quarantine_root, opts.scheduler_loop_quarantine_global_config); + scheduler_loop_quarantine_for_advanced_memory_safety_checks.Configure( + scheduler_loop_quarantine_root, + opts.scheduler_loop_quarantine_for_advanced_memory_safety_checks_config); settings.scheduler_loop_quarantine_thread_local_config = opts.scheduler_loop_quarantine_thread_local_config; @@ -1190,10 +1191,14 @@ void PartitionRoot::Init(PartitionOptions opts) { PartitionRoot::Settings::Settings() = default; PartitionRoot::PartitionRoot() - : scheduler_loop_quarantine_root(*this), scheduler_loop_quarantine(this) {} + : scheduler_loop_quarantine_root(*this), + scheduler_loop_quarantine(this), + scheduler_loop_quarantine_for_advanced_memory_safety_checks(this) {} PartitionRoot::PartitionRoot(PartitionOptions opts) - : scheduler_loop_quarantine_root(*this), scheduler_loop_quarantine(this) { + : scheduler_loop_quarantine_root(*this), + scheduler_loop_quarantine(this), + scheduler_loop_quarantine_for_advanced_memory_safety_checks(this) { Init(opts); } @@ -1845,11 +1850,7 @@ PA_NOINLINE void PartitionRoot::QuarantineForBrp( if (hook) [[unlikely]] { hook(object, usable_size); } else { -// TODO(https://crbug.com/371135823): Enable zapping again once finished -// investigation. -#if !PA_BUILDFLAG(IS_IOS) internal::SecureMemset(object, internal::kQuarantinedByte, usable_size); -#endif // !PA_BUILDFLAG(IS_IOS) } } #endif // PA_BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_root.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_root.h index d8161834f9..b645912320 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_root.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_root.h @@ -184,6 +184,11 @@ struct PartitionOptions { // each `ThreadCache` instance. internal::SchedulerLoopQuarantineConfig scheduler_loop_quarantine_thread_local_config; + // Configuration for the AMSC quarantine branch. Used when + // `FreeFlags::kSchedulerLoopQuarantineForAdvancedMemorySafetyChecks` is + // specified. + internal::SchedulerLoopQuarantineConfig + scheduler_loop_quarantine_for_advanced_memory_safety_checks_config; // As the name implies, this is not a security measure, as there is no // guarantee that memorys has been zeroed out when handed back to the @@ -191,17 +196,6 @@ struct PartitionOptions { // compression ratio of freed memory inside partially allocated pages (due to // fragmentation). EnableToggle eventually_zero_freed_memory = kDisabled; - // Linux-based systems have a limited per-process VMA limit, be more - // conservative there. This matches the feature setting in - // partition_alloc_features.cc, but not all clients use Chromium's feature - // system to configure PartitionAlloc. - EnableToggle fewer_memory_regions = -#if PA_BUILDFLAG(IS_LINUX) || PA_BUILDFLAG(IS_ANDROID) || \ - PA_BUILDFLAG(IS_CHROMEOS) - kEnabled; -#else - kDisabled; -#endif struct { EnableToggle enabled = kDisabled; @@ -274,7 +268,6 @@ struct alignas(64) PA_COMPONENT_EXPORT(PARTITION_ALLOC) PartitionRoot { bool eventually_zero_freed_memory = false; internal::SchedulerLoopQuarantineConfig scheduler_loop_quarantine_thread_local_config; - bool fewer_memory_regions = false; #if PA_BUILDFLAG(HAS_MEMORY_TAGGING) bool memory_tagging_enabled_ = false; bool use_random_memory_tagging_ = false; @@ -394,6 +387,8 @@ struct alignas(64) PA_COMPONENT_EXPORT(PARTITION_ALLOC) PartitionRoot { size_t scheduler_loop_quarantine_branch_capacity_in_bytes = 0; internal::SchedulerLoopQuarantineRoot scheduler_loop_quarantine_root; internal::GlobalSchedulerLoopQuarantineBranch scheduler_loop_quarantine; + internal::GlobalSchedulerLoopQuarantineBranch + scheduler_loop_quarantine_for_advanced_memory_safety_checks; static constexpr internal::base::TimeDelta kMaxPurgeDuration = internal::base::Milliseconds(2); @@ -1544,6 +1539,13 @@ PA_ALWAYS_INLINE void PartitionRoot::FreeNoHooksImmediate( scheduler_loop_quarantine.Quarantine(object, slot_span, slot_start); } return; + } else if constexpr ( + ContainsFlags( + flags, + FreeFlags::kSchedulerLoopQuarantineForAdvancedMemorySafetyChecks)) { + scheduler_loop_quarantine_for_advanced_memory_safety_checks.Quarantine( + object, slot_span, slot_start); + return; } // TODO(keishi): Create function to convert |object| to |slot_start_ptr|. @@ -1566,7 +1568,6 @@ PA_ALWAYS_INLINE void PartitionRoot::FreeAfterBRPQuarantine( // Iterating over the entire slot can be really expensive. #if PA_BUILDFLAG(EXPENSIVE_DCHECKS_ARE_ON) -#if !PA_BUILDFLAG(IS_IOS) auto hook = PartitionAllocHooks::GetQuarantineOverrideHook(); // If we have a hook the object segment is not necessarily filled // with |kQuarantinedByte|. @@ -1577,7 +1578,6 @@ PA_ALWAYS_INLINE void PartitionRoot::FreeAfterBRPQuarantine( PA_DCHECK(object[i] == internal::kQuarantinedByte); } } -#endif // !PA_BUILDFLAG(IS_IOS) internal::DebugMemset(internal::SlotStartAddr2Ptr(slot_start), internal::kFreedByte, slot_span->GetUtilizedSlotSize()); #endif // PA_BUILDFLAG(EXPENSIVE_DCHECKS_ARE_ON) @@ -2424,7 +2424,7 @@ void* PartitionRoot::ReallocInline(void* ptr, // factor to the new size to avoid this issue. This workaround is only // intended to be used for Skia bots, and is not intended to be a general // solution. - if (new_size > old_usable_size && new_size > 12 << 20) { + if (new_size > old_usable_size) { // 1.5x growth factor. // Note that in case of integer overflow, the std::max ensures that the // new_size is at least as large as the old_usable_size. diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_stats.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_stats.cc index c8cf441047..8983a8a5a4 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_stats.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/partition_stats.cc @@ -2,19 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/partition_stats.h" #include +#include "partition_alloc/partition_alloc_base/compiler_specific.h" + namespace partition_alloc { SimplePartitionStatsDumper::SimplePartitionStatsDumper() { - memset(&stats_, 0, sizeof(stats_)); + PA_UNSAFE_TODO(memset(&stats_, 0, sizeof(stats_))); } void SimplePartitionStatsDumper::PartitionDumpTotals( diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h index 0546bb210d..3aa56293e4 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - // IWYU pragma: private, include "base/memory/raw_ptr.h" #ifndef PARTITION_ALLOC_POINTERS_RAW_PTR_H_ @@ -680,21 +675,25 @@ class PA_TRIVIAL_ABI PA_GSL_POINTER raw_ptr { return static_cast(GetForExtraction()); } - PA_ALWAYS_INLINE constexpr raw_ptr& operator++() { + // PRECONDITIONS: `this` must not be at the end of the range. + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE constexpr raw_ptr& operator++() { static_assert( raw_ptr_traits::IsPtrArithmeticAllowed(Traits), "cannot increment raw_ptr unless AllowPtrArithmetic trait is present."); - wrapped_ptr_ = Impl::Advance(wrapped_ptr_, 1, true); + wrapped_ptr_ = PA_UNSAFE_TODO(Impl::Advance(wrapped_ptr_, 1, true)); return *this; } - PA_ALWAYS_INLINE constexpr raw_ptr& operator--() { + // PRECONDITIONS: `this` must not be at the start of the range. + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE constexpr raw_ptr& operator--() { static_assert( raw_ptr_traits::IsPtrArithmeticAllowed(Traits), "cannot decrement raw_ptr unless AllowPtrArithmetic trait is present."); - wrapped_ptr_ = Impl::Retreat(wrapped_ptr_, 1, true); + wrapped_ptr_ = PA_UNSAFE_TODO(Impl::Retreat(wrapped_ptr_, 1, true)); return *this; } - PA_ALWAYS_INLINE constexpr raw_ptr operator++(int /* post_increment */) { + // PRECONDITIONS: `this` must not be at the end of the range. + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE constexpr raw_ptr operator++( + int /* post_increment */) { static_assert( raw_ptr_traits::IsPtrArithmeticAllowed(Traits), "cannot increment raw_ptr unless AllowPtrArithmetic trait is present."); @@ -702,7 +701,9 @@ class PA_TRIVIAL_ABI PA_GSL_POINTER raw_ptr { ++(*this); return result; } - PA_ALWAYS_INLINE constexpr raw_ptr operator--(int /* post_decrement */) { + // PRECONDITIONS: `this` must not be at the start of the range. + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE constexpr raw_ptr operator--( + int /* post_decrement */) { static_assert( raw_ptr_traits::IsPtrArithmeticAllowed(Traits), "cannot decrement raw_ptr unless AllowPtrArithmetic trait is present."); @@ -710,40 +711,48 @@ class PA_TRIVIAL_ABI PA_GSL_POINTER raw_ptr { --(*this); return result; } + // PRECONDITIONS: `this` must be at least `delta_elems` before range end. template < typename Z, typename = std::enable_if_t>> - PA_ALWAYS_INLINE constexpr raw_ptr& operator+=(Z delta_elems) { + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE constexpr raw_ptr& operator+=( + Z delta_elems) { static_assert( raw_ptr_traits::IsPtrArithmeticAllowed(Traits), "cannot increment raw_ptr unless AllowPtrArithmetic trait is present."); - wrapped_ptr_ = Impl::Advance(wrapped_ptr_, delta_elems, true); + wrapped_ptr_ = + PA_UNSAFE_TODO(Impl::Advance(wrapped_ptr_, delta_elems, true)); return *this; } + // PRECONDITIONS: `this` must be at least `delta_elems` after range start. template < typename Z, typename = std::enable_if_t>> - PA_ALWAYS_INLINE constexpr raw_ptr& operator-=(Z delta_elems) { + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE constexpr raw_ptr& operator-=( + Z delta_elems) { static_assert( raw_ptr_traits::IsPtrArithmeticAllowed(Traits), "cannot decrement raw_ptr unless AllowPtrArithmetic trait is present."); - wrapped_ptr_ = Impl::Retreat(wrapped_ptr_, delta_elems, true); + wrapped_ptr_ = + PA_UNSAFE_TODO(Impl::Retreat(wrapped_ptr_, delta_elems, true)); return *this; } + // PRECONDITIONS: `delta_elems` must be an index inside the range. template ::type> && partition_alloc::internal::is_offset_type>> - PA_ALWAYS_INLINE constexpr U& operator[](Z delta_elems) const { + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE constexpr U& operator[]( + Z delta_elems) const { static_assert( raw_ptr_traits::IsPtrArithmeticAllowed(Traits), "cannot index raw_ptr unless AllowPtrArithmetic trait is present."); // Call SafelyUnwrapPtrForDereference() to simulate what GetForDereference() // does, but without creating a temporary. return *Impl::SafelyUnwrapPtrForDereference( - Impl::Advance(wrapped_ptr_, delta_elems, false)); + PA_UNSAFE_TODO(Impl::Advance(wrapped_ptr_, delta_elems, false))); } // Do not disable operator+() and operator-(). @@ -759,31 +768,40 @@ class PA_TRIVIAL_ABI PA_GSL_POINTER raw_ptr { // operators for Z=uint64_t on 32-bit systems. The compiler instead would // generate code that converts `raw_ptr` to `T*` and adds uint64_t to that, // bypassing the OOB protection entirely. + // + // PRECONDITIONS: `this` must be at least `delta_elems` before range end. template - PA_ALWAYS_INLINE friend constexpr raw_ptr operator+(const raw_ptr& p, - Z delta_elems) { + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE friend constexpr raw_ptr operator+( + const raw_ptr& p, + Z delta_elems) { // Don't check `is_offset_type` here, as existence of `Advance` is // already gated on that, and we'd get double errors. static_assert( raw_ptr_traits::IsPtrArithmeticAllowed(Traits), "cannot add to raw_ptr unless AllowPtrArithmetic trait is present."); - raw_ptr result = Impl::Advance(p.wrapped_ptr_, delta_elems, false); + raw_ptr result = + PA_UNSAFE_TODO(Impl::Advance(p.wrapped_ptr_, delta_elems, false)); return result; } + // PRECONDITIONS: `this` must be at least `delta_elems` before range end. template - PA_ALWAYS_INLINE friend constexpr raw_ptr operator+(Z delta_elems, - const raw_ptr& p) { + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE friend constexpr raw_ptr operator+( + Z delta_elems, + const raw_ptr& p) { return p + delta_elems; } + // PRECONDITIONS: `this` must be at least `delta_elems` after range start. template - PA_ALWAYS_INLINE friend constexpr raw_ptr operator-(const raw_ptr& p, - Z delta_elems) { + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE friend constexpr raw_ptr operator-( + const raw_ptr& p, + Z delta_elems) { // Don't check `is_offset_type` here, as existence of `Retreat` is // already gated on that, and we'd get double errors. static_assert(raw_ptr_traits::IsPtrArithmeticAllowed(Traits), "cannot subtract from raw_ptr unless AllowPtrArithmetic " "trait is present."); - raw_ptr result = Impl::Retreat(p.wrapped_ptr_, delta_elems, false); + raw_ptr result = + PA_UNSAFE_TODO(Impl::Retreat(p.wrapped_ptr_, delta_elems, false)); return result; } diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.h index 2de94215cb..b5ba695890 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_POINTERS_RAW_PTR_BACKUP_REF_IMPL_H_ #define PARTITION_ALLOC_POINTERS_RAW_PTR_BACKUP_REF_IMPL_H_ @@ -340,15 +335,18 @@ struct RawPtrBackupRefImpl { // Advance the wrapped pointer by `delta_elems`. // `is_in_pointer_modification` means that the result is intended to modify // the pointer (as opposed to creating a new one). + // PRECONDITIONS: `wrapped_ptr` must be at least `delta_elems` before the + // end of the range. template < typename T, typename Z, typename = std::enable_if_t, void>> - PA_ALWAYS_INLINE static constexpr T* + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE static constexpr T* Advance(T* wrapped_ptr, Z delta_elems, bool is_in_pointer_modification) { + // SAFETY: Preconditions enforced by PA_UNSAFE_BUFFER_USAGE. if (partition_alloc::internal::base::is_constant_evaluated()) { - return wrapped_ptr + delta_elems; + return PA_UNSAFE_BUFFERS(wrapped_ptr + delta_elems); } T* unpoisoned_ptr = UnpoisonPtr(wrapped_ptr); // When modifying the pointer, we have to make sure it doesn't migrate to a @@ -357,24 +355,29 @@ struct RawPtrBackupRefImpl { // properly. Do it anyway if extra OOB checks are enabled. if (PA_BUILDFLAG(BACKUP_REF_PTR_EXTRA_OOB_CHECKS) || is_in_pointer_modification) { + // SAFETY: Preconditions enforced by PA_UNSAFE_BUFFER_USAGE. return VerifyAndPoisonPointerAfterAdvanceOrRetreat( - unpoisoned_ptr, unpoisoned_ptr + delta_elems); + unpoisoned_ptr, PA_UNSAFE_BUFFERS(unpoisoned_ptr + delta_elems)); } - return unpoisoned_ptr + delta_elems; + // SAFETY: Preconditions enforced by PA_UNSAFE_BUFFER_USAGE. + return PA_UNSAFE_BUFFERS(unpoisoned_ptr + delta_elems); } // Retreat the wrapped pointer by `delta_elems`. // `is_in_pointer_modification` means that the result is intended to modify // the pointer (as opposed to creating a new one). + // PRECONDITIONS: `wrapped_ptr` must be at least `delta_elems` after + // the start of the range. template < typename T, typename Z, typename = std::enable_if_t, void>> - PA_ALWAYS_INLINE static constexpr T* + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE static constexpr T* Retreat(T* wrapped_ptr, Z delta_elems, bool is_in_pointer_modification) { if (partition_alloc::internal::base::is_constant_evaluated()) { - return wrapped_ptr - delta_elems; + // SAFETY: Preconditions enforced by PA_UNSAFE_BUFFER_USAGE. + return PA_UNSAFE_BUFFERS(wrapped_ptr - delta_elems); } T* unpoisoned_ptr = UnpoisonPtr(wrapped_ptr); // When modifying the pointer, we have to make sure it doesn't migrate to a @@ -383,10 +386,12 @@ struct RawPtrBackupRefImpl { // properly. Do it anyway if extra OOB checks are enabled. if (PA_BUILDFLAG(BACKUP_REF_PTR_EXTRA_OOB_CHECKS) || is_in_pointer_modification) { + // SAFETY: Preconditions enforced by PA_UNSAFE_BUFFER_USAGE. return VerifyAndPoisonPointerAfterAdvanceOrRetreat( - unpoisoned_ptr, unpoisoned_ptr - delta_elems); + unpoisoned_ptr, PA_UNSAFE_BUFFERS(unpoisoned_ptr - delta_elems)); } - return unpoisoned_ptr - delta_elems; + // SAFETY: Preconditions enforced by PA_UNSAFE_BUFFER_USAGE. + return PA_UNSAFE_BUFFERS(unpoisoned_ptr - delta_elems); } template diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_exclusion.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_exclusion.h index eaa2710fb1..f56f733984 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_exclusion.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_exclusion.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - // IWYU pragma: private, include "base/memory/raw_ptr_exclusion.h" #ifndef PARTITION_ALLOC_POINTERS_RAW_PTR_EXCLUSION_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h index 64d28ad826..2e28fec7fb 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_POINTERS_RAW_PTR_HOOKABLE_IMPL_H_ #define PARTITION_ALLOC_POINTERS_RAW_PTR_HOOKABLE_IMPL_H_ @@ -132,39 +127,45 @@ struct RawPtrHookableImpl { } // Advance the wrapped pointer by `delta_elems`. + // PRECONDITIONS: `wrapped_ptr` must be at least `delta_elems` before the + // end of the range. template < typename T, typename Z, typename = std::enable_if_t, void>> - PA_ALWAYS_INLINE static constexpr T* + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE static constexpr T* Advance(T* wrapped_ptr, Z delta_elems, bool /*is_in_pointer_modification*/) { + // SAFETY: required from caller, enforced by PA_UNSAFE_BUFFER_USAGE. if (!partition_alloc::internal::base::is_constant_evaluated()) { if (EnableHooks) { - GetRawPtrHooks()->advance( - reinterpret_cast(wrapped_ptr), - reinterpret_cast(wrapped_ptr + delta_elems)); + GetRawPtrHooks()->advance(reinterpret_cast(wrapped_ptr), + reinterpret_cast(PA_UNSAFE_BUFFERS( + wrapped_ptr + delta_elems))); } } - return wrapped_ptr + delta_elems; + return PA_UNSAFE_BUFFERS(wrapped_ptr + delta_elems); } // Retreat the wrapped pointer by `delta_elems`. + // PRECONDITIONS: `wrapped_ptr` must be at least `delta_elems` after + // the start of the range. template < typename T, typename Z, typename = std::enable_if_t, void>> - PA_ALWAYS_INLINE static constexpr T* + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE static constexpr T* Retreat(T* wrapped_ptr, Z delta_elems, bool /*is_in_pointer_modification*/) { + // SAFETY: required from caller, enforced by PA_UNSAFE_BUFFER_USAGE. if (!partition_alloc::internal::base::is_constant_evaluated()) { if (EnableHooks) { - GetRawPtrHooks()->advance( - reinterpret_cast(wrapped_ptr), - reinterpret_cast(wrapped_ptr - delta_elems)); + GetRawPtrHooks()->advance(reinterpret_cast(wrapped_ptr), + reinterpret_cast(PA_UNSAFE_BUFFERS( + wrapped_ptr - delta_elems))); } } - return wrapped_ptr - delta_elems; + return PA_UNSAFE_BUFFERS(wrapped_ptr - delta_elems); } template diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_nocompile.nc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_nocompile.nc index 7224bef305..4c0420f952 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_nocompile.nc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_nocompile.nc @@ -121,10 +121,11 @@ void CrossKindConversionFromMayDangle() { // Conversions may add the `kMayDangle` trait, but not remove it. DanglingPtrA ptr_a1 = new TypeA(); DanglingPtrB ptr_b1 = new TypeB(); + // TODO(https://crbug.com/437910658): remove regex check for both diagnostics once we roll clang raw_ptr ptr_a2 = ptr_a1; // expected-error {{no viable conversion from 'raw_ptr<[...], base::RawPtrTraits::kMayDangle aka 1>' to 'raw_ptr<[...], (default) RawPtrTraits::kEmpty aka 0>'}} - raw_ptr ptr_a3(ptr_a1); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeA, partition_alloc::internal::RawPtrTraits::kMayDangle>::Traits | RawPtrTraits::kMayDangle)'}} + raw_ptr ptr_a3(ptr_a1); // expected-error-re@*:* {{static assertion failed due to requirement 'Traits == ({{(base::)?}}raw_ptr<(anonymous namespace)::TypeA, partition_alloc::internal::RawPtrTraits::kMayDangle>::Traits | {{(partition_alloc::internal::)?}}RawPtrTraits::kMayDangle)'}} raw_ptr ptr_a4 = std::move(ptr_a1); // expected-error-re {{no viable conversion from '__libcpp_remove_reference_t<{{(base::)?}}raw_ptr<{{(\(anonymous namespace\)::)?}}TypeA, partition_alloc::internal::RawPtrTraits::kMayDangle> &>' (aka 'base::raw_ptr<(anonymous namespace)::TypeA, partition_alloc::internal::RawPtrTraits::kMayDangle>') to 'raw_ptr'}} - raw_ptr ptr_b2(std::move(ptr_b1)); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeB, partition_alloc::internal::RawPtrTraits::kMayDangle>::Traits | RawPtrTraits::kMayDangle)'}} + raw_ptr ptr_b2(std::move(ptr_b1)); // expected-error-re@*:* {{static assertion failed due to requirement 'Traits == ({{(base::)?}}raw_ptr<(anonymous namespace)::TypeB, partition_alloc::internal::RawPtrTraits::kMayDangle>::Traits | {{(partition_alloc::internal::)?}}RawPtrTraits::kMayDangle)'}} } void CrossKindConversionFromDummy() { @@ -132,9 +133,9 @@ void CrossKindConversionFromDummy() { raw_ptr ptr_a1 = new TypeA(); raw_ptr ptr_b1 = new TypeB(); DanglingPtrA ptr_a2 = ptr_a1; // expected-error {{no viable conversion from 'raw_ptr<[...], base::RawPtrTraits::kDummyForTest aka 2048>' to 'raw_ptr<[...], base::RawPtrTraits::kMayDangle aka 1>'}} - DanglingPtrA ptr_a3(ptr_a1); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeA, partition_alloc::internal::RawPtrTraits::kDummyForTest>::Traits | RawPtrTraits::kMayDangle)'}} + DanglingPtrA ptr_a3(ptr_a1); // expected-error-re@*:* {{static assertion failed due to requirement 'Traits == ({{(base::)?}}raw_ptr<(anonymous namespace)::TypeA, partition_alloc::internal::RawPtrTraits::kDummyForTest>::Traits | {{(partition_alloc::internal::)?}}RawPtrTraits::kMayDangle)'}} DanglingPtrA ptr_a4 = std::move(ptr_a1); // expected-error-re {{no viable conversion from '__libcpp_remove_reference_t<{{(base::)?}}raw_ptr<{{(\(anonymous namespace\)::)?}}TypeA, partition_alloc::internal::RawPtrTraits::kDummyForTest> &>' (aka 'base::raw_ptr<(anonymous namespace)::TypeA, partition_alloc::internal::RawPtrTraits::kDummyForTest>') to 'DanglingPtrA' (aka 'raw_ptr')}} - DanglingPtrB ptr_b2(std::move(ptr_b1)); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeB, partition_alloc::internal::RawPtrTraits::kDummyForTest>::Traits | RawPtrTraits::kMayDangle)'}} + DanglingPtrB ptr_b2(std::move(ptr_b1)); // expected-error-re@*:* {{static assertion failed due to requirement 'Traits == ({{(base::)?}}raw_ptr<(anonymous namespace)::TypeB, partition_alloc::internal::RawPtrTraits::kDummyForTest>::Traits | {{(partition_alloc::internal::)?}}RawPtrTraits::kMayDangle)'}} } void CantStorePointerObtainedFromEphemeralRawAddr() { diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_noop_impl.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_noop_impl.h index d4ef251dd7..2cb6f1ef04 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_noop_impl.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_noop_impl.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_POINTERS_RAW_PTR_NOOP_IMPL_H_ #define PARTITION_ALLOC_POINTERS_RAW_PTR_NOOP_IMPL_H_ @@ -68,25 +63,31 @@ struct RawPtrNoOpImpl { } // Advance the wrapped pointer by `delta_elems`. + // PRECONDITIONS: `wrapped_ptr` must be at least `delta_elems` before the + // end of the range. template < typename T, typename Z, typename = std::enable_if_t, void>> - PA_ALWAYS_INLINE static constexpr T* + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE static constexpr T* Advance(T* wrapped_ptr, Z delta_elems, bool /*is_in_pointer_modification*/) { - return wrapped_ptr + delta_elems; + // SAFETY: required from caller, enforced by PA_UNSAFE_BUFFER_USAGE. + return PA_UNSAFE_BUFFERS(wrapped_ptr + delta_elems); } // Retreat the wrapped pointer by `delta_elems`. + // PRECONDITIONS: `wrapped_ptr` must be at least `delta_elems` after + // the start of the range. template < typename T, typename Z, typename = std::enable_if_t, void>> - PA_ALWAYS_INLINE static constexpr T* + PA_UNSAFE_BUFFER_USAGE PA_ALWAYS_INLINE static constexpr T* Retreat(T* wrapped_ptr, Z delta_elems, bool /*is_in_pointer_modification*/) { - return wrapped_ptr - delta_elems; + // SAFETY: required from caller, enforced by PA_UNSAFE_BUFFER_USAGE. + return PA_UNSAFE_BUFFERS(wrapped_ptr - delta_elems); } template diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_nocompile.nc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_nocompile.nc index 634ad1cd06..ac3184d096 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_nocompile.nc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_nocompile.nc @@ -36,10 +36,11 @@ void CrossKindConversionFromMayDangle() { DanglingRefB ref_b1(b); DanglingRefC ref_c1(c); DanglingRefD ref_d1(d); - raw_ref ref_a2 = ref_a1; // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeA, 5>::Traits | RawPtrTraits::kMayDangle)'}} - raw_ref ref_b2(ref_b1); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeB, 5>::Traits | RawPtrTraits::kMayDangle)'}} - raw_ref ref_c2 = std::move(ref_c1); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeC, 5>::Traits | RawPtrTraits::kMayDangle)'}} - raw_ref ref_d2(std::move(ref_d1)); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeD, 5>::Traits | RawPtrTraits::kMayDangle)'}} + // TODO(https://crbug.com/437910658): remove regex check for both diagnostics once we roll clang + raw_ref ref_a2 = ref_a1; // expected-error-re@*:* {{static assertion failed due to requirement 'Traits == ({{(base::)?}}raw_ptr<(anonymous namespace)::TypeA, 5>::Traits | {{(partition_alloc::internal::)?}}RawPtrTraits::kMayDangle)'}} + raw_ref ref_b2(ref_b1); // expected-error-re@*:* {{static assertion failed due to requirement 'Traits == ({{(base::)?}}raw_ptr<(anonymous namespace)::TypeB, 5>::Traits | {{(partition_alloc::internal::)?}}RawPtrTraits::kMayDangle)'}} + raw_ref ref_c2 = std::move(ref_c1); // expected-error-re@*:* {{static assertion failed due to requirement 'Traits == ({{(base::)?}}raw_ptr<(anonymous namespace)::TypeC, 5>::Traits | {{(partition_alloc::internal::)?}}RawPtrTraits::kMayDangle)'}} + raw_ref ref_d2(std::move(ref_d1)); // expected-error-re@*:* {{static assertion failed due to requirement 'Traits == ({{(base::)?}}raw_ptr<(anonymous namespace)::TypeD, 5>::Traits | {{(partition_alloc::internal::)?}}RawPtrTraits::kMayDangle)'}} } void CrossKindConversionFromDummy() { @@ -52,10 +53,10 @@ void CrossKindConversionFromDummy() { raw_ref ref_b1(b); raw_ref ref_c1(c); raw_ref ref_d1(d); - DanglingRefA ref_a2 = ref_a1; // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeA, 2052>::Traits | RawPtrTraits::kMayDangle)'}} - DanglingRefB ref_b3(ref_b1); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeB, 2052>::Traits | RawPtrTraits::kMayDangle)'}} - DanglingRefC ref_c2 = std::move(ref_c1); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeC, 2052>::Traits | RawPtrTraits::kMayDangle)'}} - DanglingRefD ref_d2(std::move(ref_d1)); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeD, 2052>::Traits | RawPtrTraits::kMayDangle)'}} + DanglingRefA ref_a2 = ref_a1; // expected-error-re@*:* {{static assertion failed due to requirement 'Traits == ({{(base::)?}}raw_ptr<(anonymous namespace)::TypeA, 2052>::Traits | {{(partition_alloc::internal::)?}}RawPtrTraits::kMayDangle)'}} + DanglingRefB ref_b3(ref_b1); // expected-error-re@*:* {{static assertion failed due to requirement 'Traits == ({{(base::)?}}raw_ptr<(anonymous namespace)::TypeB, 2052>::Traits | {{(partition_alloc::internal::)?}}RawPtrTraits::kMayDangle)'}} + DanglingRefC ref_c2 = std::move(ref_c1); // expected-error-re@*:* {{static assertion failed due to requirement 'Traits == ({{(base::)?}}raw_ptr<(anonymous namespace)::TypeC, 2052>::Traits | {{(partition_alloc::internal::)?}}RawPtrTraits::kMayDangle)'}} + DanglingRefD ref_d2(std::move(ref_d1)); // expected-error-re@*:* {{static assertion failed due to requirement 'Traits == ({{(base::)?}}raw_ptr<(anonymous namespace)::TypeD, 2052>::Traits | {{(partition_alloc::internal::)?}}RawPtrTraits::kMayDangle)'}} } } // namespace diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/random.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/random.cc index 06447a7906..32ddc753a2 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/random.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/random.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/random.h" #include diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine.cc index d7fb206505..b6d014acfb 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine.cc @@ -9,6 +9,8 @@ #include "partition_alloc/scheduler_loop_quarantine.h" +#include + #include "partition_alloc/internal_allocator.h" #include "partition_alloc/partition_alloc_check.h" #include "partition_alloc/partition_page.h" @@ -34,6 +36,11 @@ class PA_SCOPED_LOCKABLE FakeScopedGuard { template using ScopedGuardIfNeeded = std::conditional_t; + +// When set to `true`, all the branches stop purging. It helps to reduce +// shutdown hangs. +std::atomic_bool g_no_purge = false; + } // namespace template @@ -79,6 +86,14 @@ void SchedulerLoopQuarantineBranch::Configure( enable_zapping_ = config.enable_zapping; leak_on_destruction_ = config.leak_on_destruction; branch_capacity_in_bytes_ = config.branch_capacity_in_bytes; + + // This bucket index can be invalid if "Neutral" distribution is in use, + // but value here is only for comparison and should be safe. + largest_bucket_index_ = + BucketIndexLookup::GetIndexForDenserBuckets(config.max_quarantine_size); + PA_CHECK(largest_bucket_index_ < BucketIndexLookup::kNumBuckets); + PA_CHECK(&allocator_root_->buckets[largest_bucket_index_] <= + &allocator_root_->sentinel_bucket); } template @@ -126,15 +141,21 @@ void SchedulerLoopQuarantineBranch::Quarantine( #if PA_BUILDFLAG(DCHECKS_ARE_ON) PA_DCHECK(!being_destructed_); #endif // PA_BUILDFLAG(DCHECKS_ARE_ON) - if (!enable_quarantine_ || pause_quarantine_ || - allocator_root_->IsDirectMappedBucket(slot_span->bucket)) [[unlikely]] { + if (!enable_quarantine_ || pause_quarantine_) [[unlikely]] { return allocator_root_->RawFreeWithThreadCache(slot_start, object, slot_span); } + if (slot_span->bucket < &allocator_root_->buckets[0] || + &allocator_root_->buckets[largest_bucket_index_] < slot_span->bucket) + [[unlikely]] { + // The allocation is direct-mapped or larger than `largest_bucket_index_`. + return allocator_root_->RawFreeWithThreadCache(slot_start, object, + slot_span); + } + PA_DCHECK(!allocator_root_->IsDirectMapped(slot_span)); + const size_t slot_size = slot_span->bucket->slot_size; - const size_t bucket_index = - static_cast(slot_span->bucket - allocator_root_->buckets); const size_t capacity_in_bytes = branch_capacity_in_bytes_.load(std::memory_order_relaxed); if (capacity_in_bytes < slot_size) [[unlikely]] { @@ -154,7 +175,8 @@ void SchedulerLoopQuarantineBranch::Quarantine( branch_size_in_bytes_ += slot_size; slots_.push_back({ .slot_start = slot_start, - .bucket_index = bucket_index, + .bucket_index = + static_cast(slot_span->bucket - allocator_root_->buckets), }); // Swap randomly so that the quarantine list remain shuffled. @@ -179,6 +201,10 @@ PA_ALWAYS_INLINE void SchedulerLoopQuarantineBranch::PurgeInternal( size_t target_size_in_bytes, [[maybe_unused]] bool for_destruction) { + if (g_no_purge.load(std::memory_order_relaxed)) { + return; + } + int64_t freed_count = 0; int64_t freed_size_in_bytes = 0; @@ -279,6 +305,12 @@ void SchedulerLoopQuarantineBranch::DisallowScanlessPurge() { PA_CHECK(disallow_scanless_purge_ > 0); // Overflow check. } +// static +template +void SchedulerLoopQuarantineBranch::DangerouslyDisablePurge() { + g_no_purge.store(true, std::memory_order_relaxed); +} + template const SchedulerLoopQuarantineConfig& SchedulerLoopQuarantineBranch::GetConfigurationForTesting() { diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine.h index 2d91eb29dc..389f6670c5 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine.h @@ -78,6 +78,9 @@ struct SchedulerLoopQuarantineConfig { bool leak_on_destruction = false; bool enable_quarantine = false; bool enable_zapping = false; + // Accepts allocations up to this bucket size. If the given number does not + // match bucket size, it is rounded up to next bucket size. + size_t max_quarantine_size = BucketIndexLookup::kMaxBucketSize; // For informational purposes only. char branch_name[32] = ""; }; @@ -161,6 +164,11 @@ class SchedulerLoopQuarantineBranch { void AllowScanlessPurge(); void DisallowScanlessPurge(); + // Once called, all the branches stop purging. This means every branch grows + // unbounded, potentially resulting in OOM. However, if we know the program + // is being terminated, this can help reduce hangs. + static void DangerouslyDisablePurge(); + const SchedulerLoopQuarantineConfig& GetConfigurationForTesting(); class ScopedQuarantineExclusion { @@ -211,6 +219,8 @@ class SchedulerLoopQuarantineBranch { bool enable_zapping_ = false; bool leak_on_destruction_ = false; + uint16_t largest_bucket_index_ = BucketIndexLookup::kNumBuckets - 1; + // When non-zero, this branch temporarily stops accepting incoming quarantine // requests. int pause_quarantine_ = 0; diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine_support.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine_support.cc index 3670be1aa9..7684f4e760 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine_support.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine_support.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/scheduler_loop_quarantine_support.h" namespace partition_alloc { diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine_support.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine_support.h index 77842160ee..867bf86f7d 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine_support.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine_support.h @@ -10,13 +10,13 @@ #ifndef PARTITION_ALLOC_SCHEDULER_LOOP_QUARANTINE_SUPPORT_H_ #define PARTITION_ALLOC_SCHEDULER_LOOP_QUARANTINE_SUPPORT_H_ -#include #include #include #include "partition_alloc/build_config.h" #include "partition_alloc/buildflags.h" #include "partition_alloc/partition_alloc_base/compiler_specific.h" +#include "partition_alloc/partition_alloc_base/memory/stack_allocated.h" #include "partition_alloc/partition_root.h" #include "partition_alloc/scheduler_loop_quarantine.h" #include "partition_alloc/thread_cache.h" @@ -84,8 +84,32 @@ class PA_COMPONENT_EXPORT(PARTITION_ALLOC) uintptr_t tcache_address_ = 0; }; -namespace internal { +// This is a lightweight version of `SchedulerLoopQuarantineScanPolicyUpdater`. +// It calls `DisallowScanlessPurge` in the constructor and `AllowScanlessPurge` +// in the destructor. +class PA_COMPONENT_EXPORT(PARTITION_ALLOC) + ScopedSchedulerLoopQuarantineDisallowScanlessPurge { + // This is `PA_STACK_ALLOCATED()` to ensure that those two calls are made on + // the same thread, allowing us to omit thread-safety analysis. + PA_STACK_ALLOCATED(); + public: + PA_ALWAYS_INLINE ScopedSchedulerLoopQuarantineDisallowScanlessPurge() { + ThreadCache* tcache = ThreadCache::EnsureAndGet(); + PA_CHECK(ThreadCache::IsValid(tcache)); + + tcache->GetSchedulerLoopQuarantineBranch().DisallowScanlessPurge(); + } + + PA_ALWAYS_INLINE ~ScopedSchedulerLoopQuarantineDisallowScanlessPurge() { + ThreadCache* tcache = ThreadCache::EnsureAndGet(); + PA_CHECK(ThreadCache::IsValid(tcache)); + + tcache->GetSchedulerLoopQuarantineBranch().AllowScanlessPurge(); + } +}; + +namespace internal { class PA_COMPONENT_EXPORT(PARTITION_ALLOC) ScopedSchedulerLoopQuarantineBranchAccessorForTesting { public: diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_dispatch.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_dispatch.h index bc112965cd..ce29cb0369 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_dispatch.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_dispatch.h @@ -20,6 +20,9 @@ struct AllocatorDispatch { using AllocFn = void*(size_t size, void* context); using AllocUncheckedFn = void*(size_t size, void* context); using AllocZeroInitializedFn = void*(size_t n, size_t size, void* context); + using AllocZeroInitializedUncheckedFn = void*(size_t n, + size_t size, + void* context); using AllocAlignedFn = void*(size_t alignment, size_t size, void* context); using ReallocFn = void*(void* address, size_t size, void* context); using ReallocUncheckedFn = void*(void* ptr, size_t size, void* context); @@ -60,6 +63,7 @@ struct AllocatorDispatch { AllocFn* alloc_function; AllocUncheckedFn* alloc_unchecked_function; AllocZeroInitializedFn* alloc_zero_initialized_function; + AllocZeroInitializedUncheckedFn* alloc_zero_initialized_unchecked_function; AllocAlignedFn* alloc_aligned_function; ReallocFn* realloc_function; ReallocUncheckedFn* realloc_unchecked_function; @@ -133,6 +137,7 @@ struct AllocatorDispatch { COPY_IF_NULLPTR(alloc_function); COPY_IF_NULLPTR(alloc_unchecked_function); COPY_IF_NULLPTR(alloc_zero_initialized_function); + COPY_IF_NULLPTR(alloc_zero_initialized_unchecked_function); COPY_IF_NULLPTR(alloc_aligned_function); COPY_IF_NULLPTR(realloc_function); COPY_IF_NULLPTR(realloc_unchecked_function); diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.h index de10bbf5ab..0ffe987a55 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_SHIM_ALLOCATOR_INTERCEPTION_APPLE_H_ #define PARTITION_ALLOC_SHIM_ALLOCATOR_INTERCEPTION_APPLE_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h index fae4719e1b..05f9e40ce3 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h @@ -66,6 +66,11 @@ void SetCallNewHandlerOnMallocFailure(bool value); // regardless of SetCallNewHandlerOnMallocFailure(). PA_COMPONENT_EXPORT(ALLOCATOR_SHIM) void* UncheckedAlloc(size_t size); +// Allocates |n| zeroed elements of size |size| or returns nullptr. It does NOT +// call the new_handler, regardless of SetCallNewHandlerOnMallocFailure(). +PA_COMPONENT_EXPORT(ALLOCATOR_SHIM) +void* UncheckedCalloc(size_t n, size_t size); + // Reallocates |ptr| to point at |size| bytes with the same alignment as |ptr|, // or returns nullptr while leaving the |ptr| unchanged. It does NOT call the // new_handler, regardless of SetCallNewHandlerOnMallocFailure(). @@ -151,9 +156,6 @@ using EnableMemoryTagging = enum class BucketDistribution : uint8_t { kNeutral, kDenser }; using EventuallyZeroFreedMemory = partition_alloc::internal::base:: StrongAlias; -using FewerMemoryRegions = - partition_alloc::internal::base::StrongAlias; // If |thread_cache_on_non_quarantinable_partition| is specified, the // thread-cache will be enabled on the non-quarantinable partition. The // thread-cache on the main (malloc) partition will be disabled. @@ -168,8 +170,9 @@ void ConfigurePartitions( scheduler_loop_quarantine_global_config, partition_alloc::internal::SchedulerLoopQuarantineConfig scheduler_loop_quarantine_thread_local_config, - EventuallyZeroFreedMemory eventually_zero_freed_memory, - FewerMemoryRegions fewer_memory_regions); + partition_alloc::internal::SchedulerLoopQuarantineConfig + scheduler_loop_quarantine_for_advanced_memory_safety_checks_config, + EventuallyZeroFreedMemory eventually_zero_freed_memory); PA_COMPONENT_EXPORT(ALLOCATOR_SHIM) uint32_t GetMainPartitionRootExtrasSize(); diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_apple.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_apple.cc index 3214cf5b28..d300ddde7b 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_apple.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_apple.cc @@ -32,6 +32,10 @@ namespace allocator_shim { void TryFreeDefaultFallbackToFindZoneAndFree(void* ptr) { + if (!ptr) [[unlikely]] { + return; + } + unsigned int zone_count = 0; vm_address_t* zones = nullptr; kern_return_t result = @@ -57,7 +61,8 @@ void TryFreeDefaultFallbackToFindZoneAndFree(void* ptr) { } // There must be an owner zone. - PA_CHECK(false); + PA_CHECK(false) << "Oops! No zone found for " + << reinterpret_cast(ptr); } } // namespace allocator_shim diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_apple_zoned_malloc.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_apple_zoned_malloc.cc index a59ee70449..126c43a77f 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_apple_zoned_malloc.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_apple_zoned_malloc.cc @@ -121,15 +121,16 @@ void TryFreeDefaultImpl(void* ptr, void* context) { } // namespace const AllocatorDispatch AllocatorDispatch::default_dispatch = { - &MallocImpl, /* alloc_function */ - &MallocImpl, /* alloc_unchecked_function */ - &CallocImpl, /* alloc_zero_initialized_function */ - &MemalignImpl, /* alloc_aligned_function */ - &ReallocImpl, /* realloc_function */ - &ReallocImpl, /* realloc_unchecked_function */ - &FreeImpl, /* free_function */ - &FreeWithSizeImpl, /* free_with_size_function */ - &FreeWithAlignmentImpl, /* free_with_size_function */ + &MallocImpl, /* alloc_function */ + &MallocImpl, /* alloc_unchecked_function */ + &CallocImpl, /* alloc_zero_initialized_function */ + &CallocImpl, /* alloc_zero_initialized_unchecked_function */ + &MemalignImpl, /* alloc_aligned_function */ + &ReallocImpl, /* realloc_function */ + &ReallocImpl, /* realloc_unchecked_function */ + &FreeImpl, /* free_function */ + &FreeWithSizeImpl, /* free_with_size_function */ + &FreeWithAlignmentImpl, /* free_with_size_function */ &FreeWithSizeAndAlignmentImpl, /* free_with_size_function */ &GetSizeEstimateImpl, /* get_size_estimate_function */ &GoodSizeImpl, /* good_size_function */ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_glibc.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_glibc.cc index aa42c8d7f4..b032eae581 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_glibc.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_glibc.cc @@ -65,6 +65,15 @@ void* GlibcCalloc(size_t n, size_t size, void* context) { return __libc_calloc(n, size); } +void* GlibcUncheckedCalloc(size_t n, size_t size, void* context) { + const auto total = partition_alloc::internal::base::CheckMul(n, size); + if (!total.IsValid() || total.ValueOrDie() >= kMaxAllowedSize) [[unlikely]] { + return nullptr; + } + + return __libc_calloc(n, size); +} + void* GlibcRealloc(void* address, size_t size, void* context) { if (size >= kMaxAllowedSize) [[unlikely]] { partition_alloc::TerminateBecauseOutOfMemory(size); @@ -128,6 +137,7 @@ const AllocatorDispatch AllocatorDispatch::default_dispatch = { &GlibcMalloc, /* alloc_function */ &GlibcUncheckedMalloc, /* alloc_unchecked_function */ &GlibcCalloc, /* alloc_zero_initialized_function */ + &GlibcUncheckedCalloc, /* alloc_zero_initialized_unchecked_function */ &GlibcMemalign, /* alloc_aligned_function */ &GlibcRealloc, /* realloc_function */ &GlibcUncheckedRealloc, /* realloc_unchecked_function */ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc index 668ce7be53..1ae372ae7c 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc @@ -76,15 +76,16 @@ size_t RealSizeEstimate(void* address, void* context) { } // namespace const AllocatorDispatch AllocatorDispatch::default_dispatch = { - &RealMalloc, /* alloc_function */ - &RealMalloc, /* alloc_unchecked_function */ - &RealCalloc, /* alloc_zero_initialized_function */ - &RealMemalign, /* alloc_aligned_function */ - &RealRealloc, /* realloc_function */ - &RealRealloc, /* realloc_unchecked_function */ - &RealFree, /* free_function */ - &RealFreeWithSize, /* free_with_size_function */ - &RealFreeWithAlignment, /* free_with_alignment_function */ + &RealMalloc, /* alloc_function */ + &RealMalloc, /* alloc_unchecked_function */ + &RealCalloc, /* alloc_zero_initialized_function */ + &RealCalloc, /* alloc_zero_initialized_unchecked_function */ + &RealMemalign, /* alloc_aligned_function */ + &RealRealloc, /* realloc_function */ + &RealRealloc, /* realloc_unchecked_function */ + &RealFree, /* free_function */ + &RealFreeWithSize, /* free_with_size_function */ + &RealFreeWithAlignment, /* free_with_alignment_function */ &RealFreeWithSizeAndAlignment, /* free_with_size_and_alignment_function */ &RealSizeEstimate, /* get_size_estimate_function */ nullptr, /* good_size_function */ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc index 928d1432cd..88a3d7824d 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc @@ -241,6 +241,20 @@ void* PartitionAllocFunctionsInternal +void* PartitionAllocFunctionsInternal:: + CallocUnchecked(size_t n, size_t size, void* context) { + partition_alloc::ScopedDisallowAllocations guard{}; + const size_t total = + partition_alloc::internal::base::CheckMul(n, size).ValueOrDie(); + return Allocator() + ->AllocInline(total); +} + // static template @@ -643,8 +657,9 @@ void ConfigurePartitions( scheduler_loop_quarantine_global_config, partition_alloc::internal::SchedulerLoopQuarantineConfig scheduler_loop_quarantine_thread_local_config, - EventuallyZeroFreedMemory eventually_zero_freed_memory, - FewerMemoryRegions fewer_memory_regions) { + partition_alloc::internal::SchedulerLoopQuarantineConfig + scheduler_loop_quarantine_for_advanced_memory_safety_checks_config, + EventuallyZeroFreedMemory eventually_zero_freed_memory) { // Calling Get() is actually important, even if the return value isn't // used, because it has a side effect of initializing the variable, if it // wasn't already. @@ -672,13 +687,12 @@ void ConfigurePartitions( eventually_zero_freed_memory ? partition_alloc::PartitionOptions::kEnabled : partition_alloc::PartitionOptions::kDisabled; - opts.fewer_memory_regions = - fewer_memory_regions ? partition_alloc::PartitionOptions::kEnabled - : partition_alloc::PartitionOptions::kDisabled; opts.scheduler_loop_quarantine_global_config = scheduler_loop_quarantine_global_config; opts.scheduler_loop_quarantine_thread_local_config = scheduler_loop_quarantine_thread_local_config; + opts.scheduler_loop_quarantine_for_advanced_memory_safety_checks_config = + scheduler_loop_quarantine_for_advanced_memory_safety_checks_config; opts.memory_tagging = { .enabled = enable_memory_tagging ? partition_alloc::PartitionOptions::kEnabled diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h index 4aaf8fa9e0..1bce5411a4 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h @@ -43,6 +43,8 @@ class PartitionAllocFunctionsInternal { static void* Calloc(size_t n, size_t size, void* context); + static void* CallocUnchecked(size_t n, size_t size, void* context); + static void* Memalign(size_t alignment, size_t size, void* context); static void* AlignedAlloc(size_t size, size_t alignment, void* context); @@ -102,6 +104,7 @@ class PartitionAllocFunctionsInternal { &Malloc, // alloc_function &MallocUnchecked, // alloc_unchecked_function &Calloc, // alloc_zero_initialized_function + &CallocUnchecked, // alloc_zero_initialized_unchecked_function &Memalign, // alloc_aligned_function &Realloc, // realloc_function &ReallocUnchecked, // realloc_unchecked_function @@ -191,15 +194,18 @@ PA_ALWAYS_INLINE void ConfigurePartitionsForTesting() { partition_alloc::internal::SchedulerLoopQuarantineConfig(); auto scheduler_loop_quarantine_thread_local_config = partition_alloc::internal::SchedulerLoopQuarantineConfig(); + auto scheduler_loop_quarantine_for_advanced_memory_safety_checks_config = + partition_alloc::internal::SchedulerLoopQuarantineConfig(); auto eventually_zero_freed_memory = EventuallyZeroFreedMemory(false); - auto fewer_memory_regions = FewerMemoryRegions(false); - ConfigurePartitions(enable_brp, brp_extra_extras_size, enable_memory_tagging, - memory_tagging_reporting_mode, distribution, - scheduler_loop_quarantine_global_config, - scheduler_loop_quarantine_thread_local_config, - eventually_zero_freed_memory, fewer_memory_regions); + ConfigurePartitions( + enable_brp, brp_extra_extras_size, enable_memory_tagging, + memory_tagging_reporting_mode, distribution, + scheduler_loop_quarantine_global_config, + scheduler_loop_quarantine_thread_local_config, + scheduler_loop_quarantine_for_advanced_memory_safety_checks_config, + eventually_zero_freed_memory); } #endif // PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_internal.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_internal.h index 2fa7ea27ee..b65a3b3ca1 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_internal.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_internal.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_SHIM_ALLOCATOR_SHIM_DEFAULT_DISPATCH_TO_PARTITION_ALLOC_INTERNAL_H_ #define PARTITION_ALLOC_SHIM_ALLOCATOR_SHIM_DEFAULT_DISPATCH_TO_PARTITION_ALLOC_INTERNAL_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_with_advanced_checks.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_with_advanced_checks.cc index bfa15991f6..b8a3f22fea 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_with_advanced_checks.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_with_advanced_checks.cc @@ -42,6 +42,14 @@ void* DelegatedAllocZeroInitializedFn(size_t n, size_t size, void* context) { context); } +void* DelegatedAllocZeroInitializedUncheckedFn(size_t n, + size_t size, + void* context) { + const AllocatorDispatch* delegate = GetDelegate(); + PA_MUSTTAIL return delegate->alloc_zero_initialized_unchecked_function( + n, size, context); +} + void* DelegatedAllocAlignedFn(size_t alignment, size_t size, void* context) { const AllocatorDispatch* delegate = GetDelegate(); PA_MUSTTAIL return delegate->alloc_aligned_function(alignment, size, context); @@ -227,6 +235,8 @@ const AllocatorDispatch AllocatorDispatch::default_dispatch = { .alloc_function = &DelegatedAllocFn, .alloc_unchecked_function = &DelegatedAllocUncheckedFn, .alloc_zero_initialized_function = &DelegatedAllocZeroInitializedFn, + .alloc_zero_initialized_unchecked_function = + &DelegatedAllocZeroInitializedUncheckedFn, .alloc_aligned_function = &DelegatedAllocAlignedFn, .realloc_function = &DelegatedReallocFn, .realloc_unchecked_function = &DelegatedReallocUncheckedFn, diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_with_advanced_checks.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_with_advanced_checks.h index 57ea1f778d..635d81354b 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_with_advanced_checks.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_with_advanced_checks.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_SHIM_ALLOCATOR_SHIM_DEFAULT_DISPATCH_TO_PARTITION_ALLOC_WITH_ADVANCED_CHECKS_H_ #define PARTITION_ALLOC_SHIM_ALLOCATOR_SHIM_DEFAULT_DISPATCH_TO_PARTITION_ALLOC_WITH_ADVANCED_CHECKS_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_dispatch_to_noop_on_free.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_dispatch_to_noop_on_free.cc index 7fca9c959e..8eb3d5ce85 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_dispatch_to_noop_on_free.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_dispatch_to_noop_on_free.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "partition_alloc/shim/allocator_shim_dispatch_to_noop_on_free.h" #include @@ -39,6 +34,7 @@ AllocatorDispatch allocator_dispatch = { nullptr, // alloc_function nullptr, // alloc_unchecked_function nullptr, // alloc_zero_initialized_function + nullptr, // alloc_zero_initialized_unchecked_function nullptr, // alloc_aligned_function nullptr, // realloc_function nullptr, // realloc_unchecked_function diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_dispatch_to_noop_on_free.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_dispatch_to_noop_on_free.h index 614c1ba6bb..b37bf97bfc 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_dispatch_to_noop_on_free.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_dispatch_to_noop_on_free.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_SHIM_ALLOCATOR_SHIM_DISPATCH_TO_NOOP_ON_FREE_H_ #define PARTITION_ALLOC_SHIM_ALLOCATOR_SHIM_DISPATCH_TO_NOOP_ON_FREE_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_functions.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_functions.h index 0df8695acd..8ae220e3b3 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_functions.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_functions.h @@ -72,6 +72,12 @@ void* UncheckedAlloc(size_t size) { return chain_head->alloc_unchecked_function(size, nullptr); } +void* UncheckedCalloc(size_t n, size_t size) { + const AllocatorDispatch* const chain_head = internal::GetChainHead(); + return chain_head->alloc_zero_initialized_unchecked_function(n, size, + nullptr); +} + void* UncheckedRealloc(void* ptr, size_t size) { const AllocatorDispatch* const chain_head = internal::GetChainHead(); return chain_head->realloc_unchecked_function(ptr, size, nullptr); diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h index 79ab27718f..d7d178d646 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_SHIM_ALLOCATOR_SHIM_INTERNALS_H_ #define PARTITION_ALLOC_SHIM_ALLOCATOR_SHIM_INTERNALS_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.cc index da7885756a..7d1e45e871 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.cc @@ -10,6 +10,7 @@ #include "partition_alloc/spinning_mutex.h" #include +#include #include "partition_alloc/build_config.h" #include "partition_alloc/partition_alloc_base/compiler_specific.h" @@ -48,6 +49,62 @@ namespace partition_alloc::internal { +namespace { + +// Pointer to the `LockMetricsRecorder` that all spinning mutexes record into. +std::atomic g_lock_metrics_recorder{nullptr}; + +LockMetricsRecorderInterface* GetLockMetricsRecorder() { + return g_lock_metrics_recorder.load(std::memory_order_acquire); +} + +// Timer that records into a lock metrics object. Copy of +// `::base::LockMetricsRecorder::ScopedLockAcquisitionTimer` for partition alloc +// with minor modifications. +class ScopedLockAcquisitionTimer { + public: + ScopedLockAcquisitionTimer() : lock_metrics_(GetLockMetricsRecorder()) { + if (!lock_metrics_ || !lock_metrics_->ShouldRecordLockAcquisitionTime()) + [[likely]] { + return; + } + + start_time_.emplace(base::TimeTicks::Now()); + } + + ~ScopedLockAcquisitionTimer() { + if (!start_time_.has_value()) [[likely]] { + return; + } + + lock_metrics_->RecordLockAcquisitionTime(base::TimeTicks::Now() - + *start_time_); + } + + private: + std::optional start_time_; + + // It is safe to hold onto the pointer to the lock metrics recorder since + // this is not expected to be modified once set except for in tests. + LockMetricsRecorderInterface* lock_metrics_; +}; + +} // namespace + +// static +void SpinningMutex::SetLockMetricsRecorder( + LockMetricsRecorderInterface* recorder) { + auto* old_recorder = + g_lock_metrics_recorder.exchange(recorder, std::memory_order_release); + PA_CHECK(old_recorder == nullptr); +} + +// static +void SpinningMutex::SetLockMetricsRecorderForTesting( + LockMetricsRecorderInterface* recorder) { + g_lock_metrics_recorder.store(recorder, std::memory_order_release); +} + void SpinningMutex::Reinit() { #if !PA_BUILDFLAG(IS_APPLE) // On most platforms, no need to re-init the lock, can just unlock it. @@ -86,6 +143,7 @@ void SpinningMutex::AcquireSpinThenBlock() { backoff = std::min(kMaxBackoff, backoff << 1); } while (tries < kSpinCount); + ScopedLockAcquisitionTimer timer; LockSlow(); } diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.h index a456727a3f..2a8822e5ef 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.h @@ -19,6 +19,7 @@ #include "partition_alloc/partition_alloc_base/cxx_wrapper/algorithm.h" #include "partition_alloc/partition_alloc_base/thread_annotations.h" #include "partition_alloc/partition_alloc_base/threading/platform_thread.h" +#include "partition_alloc/partition_alloc_base/threading/platform_thread_ref.h" #include "partition_alloc/partition_alloc_check.h" #include "partition_alloc/partition_alloc_config.h" #include "partition_alloc/yield_processor.h" @@ -48,6 +49,8 @@ namespace partition_alloc::internal { +class LockMetricsRecorderInterface; + // The behavior of this class depends on platform support: // 1. When platform supports is available: // @@ -92,6 +95,14 @@ class PA_LOCKABLE PA_COMPONENT_EXPORT(PARTITION_ALLOC) SpinningMutex { inline bool HasWaitersForTesting() const; #endif // PA_BUILDFLAG(ENABLE_PARTITION_LOCK_PRIORITY_INHERITANCE) + // Sets the global lock metrics recorder object. Must be called only once. + static void SetLockMetricsRecorder(LockMetricsRecorderInterface* recorder); + + // Same as `SetLockMetricsRecorder` but can be called multiple times for + // testing. + static void SetLockMetricsRecorderForTesting( + LockMetricsRecorderInterface* recorder); + private: PA_NOINLINE void AcquireSpinThenBlock() PA_EXCLUSIVE_LOCK_FUNCTION(); void LockSlow() PA_EXCLUSIVE_LOCK_FUNCTION(); @@ -309,6 +320,15 @@ PA_ALWAYS_INLINE void SpinningMutex::Release() { #endif +// Class for bridging from partition alloc internals to +// `::base::LockMetricsRecorder` +class LockMetricsRecorderInterface { + public: + virtual bool ShouldRecordLockAcquisitionTime() const = 0; + virtual void RecordLockAcquisitionTime(base::TimeDelta sample) = 0; + virtual ~LockMetricsRecorderInterface() = default; +}; + } // namespace partition_alloc::internal #endif // PARTITION_ALLOC_SPINNING_MUTEX_H_ diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/third_party/apple_apsl/README.chromium b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/third_party/apple_apsl/README.chromium index d6172a7586..980b48323a 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/third_party/apple_apsl/README.chromium +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/third_party/apple_apsl/README.chromium @@ -25,9 +25,10 @@ https://github.com/apple-oss-distributions/libmalloc/blob/libmalloc-409.40.6/inc Name: CF URL: https://www.opensource.apple.com/ Version: CF-635 +Update Mechanism: Static (https://crbug.com/422324360) Security Critical: yes Shipped: yes -License: Apple Public Source License 2.0 +License: APSL-2.0 License File: LICENSE Local Modifications: diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/thread_cache.cc b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/thread_cache.cc index e0a52923e0..2a27567e8c 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/thread_cache.cc +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/thread_cache.cc @@ -248,28 +248,12 @@ void ThreadCacheRegistry::SetThreadCacheMultiplier(float multiplier) { } } -void ThreadCacheRegistry::SetPurgingConfiguration( - const internal::base::TimeDelta min_purge_interval, - const internal::base::TimeDelta max_purge_interval, - const internal::base::TimeDelta default_purge_interval, - size_t min_cached_memory_for_purging_bytes) { - PA_CHECK(min_purge_interval <= default_purge_interval); - PA_CHECK(default_purge_interval <= max_purge_interval); - min_purge_interval_ = min_purge_interval; - max_purge_interval_ = max_purge_interval; - default_purge_interval_ = default_purge_interval; - min_cached_memory_for_purging_bytes_ = min_cached_memory_for_purging_bytes; - is_purging_configured_ = true; -} - void ThreadCacheRegistry::RunPeriodicPurge() { if (!periodic_purge_is_initialized_) { ThreadCache::EnsureThreadSpecificDataInitialized(); periodic_purge_is_initialized_ = true; } - PA_CHECK(is_purging_configured_); - // Summing across all threads can be slow, but is necessary. Otherwise we rely // on the assumption that the current thread is a good proxy for overall // allocation activity. This is not the case for all process types. @@ -304,15 +288,15 @@ void ThreadCacheRegistry::RunPeriodicPurge() { // scheduled purge with a small enough interval. This is the case for instance // of a renderer moving to foreground. To mitigate that, if cached memory // jumps is very large, make a greater leap to faster purging. - if (cached_memory_approx > 10 * min_cached_memory_for_purging_bytes_) { + if (cached_memory_approx > 10 * kMinCachedMemoryForPurgingBytes) { periodic_purge_next_interval_ = - std::min(default_purge_interval_, periodic_purge_next_interval_ / 2); - } else if (cached_memory_approx > 2 * min_cached_memory_for_purging_bytes_) { + std::min(kDefaultPurgeInterval, periodic_purge_next_interval_ / 2); + } else if (cached_memory_approx > 2 * kMinCachedMemoryForPurgingBytes) { periodic_purge_next_interval_ = - std::max(min_purge_interval_, periodic_purge_next_interval_ / 2); - } else if (cached_memory_approx < min_cached_memory_for_purging_bytes_) { + std::max(kMinPurgeInterval, periodic_purge_next_interval_ / 2); + } else if (cached_memory_approx < kMinCachedMemoryForPurgingBytes) { periodic_purge_next_interval_ = - std::min(max_purge_interval_, periodic_purge_next_interval_ * 2); + std::min(kMaxPurgeInterval, periodic_purge_next_interval_ * 2); } // Make sure that the next interval is in the right bounds. Even though the @@ -324,7 +308,7 @@ void ThreadCacheRegistry::RunPeriodicPurge() { // background threads, but only ask them to purge their own cache at the next // allocation). periodic_purge_next_interval_ = std::clamp( - periodic_purge_next_interval_, min_purge_interval_, max_purge_interval_); + periodic_purge_next_interval_, kMinPurgeInterval, kMaxPurgeInterval); PurgeAll(); } @@ -335,7 +319,7 @@ int64_t ThreadCacheRegistry::GetPeriodicPurgeNextIntervalInMicroseconds() } void ThreadCacheRegistry::ResetForTesting() { - periodic_purge_next_interval_ = default_purge_interval_; + periodic_purge_next_interval_ = kDefaultPurgeInterval; } // static diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/thread_cache.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/thread_cache.h index 67c9c9ab30..86ae60b9bc 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/thread_cache.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/thread_cache.h @@ -84,14 +84,6 @@ extern PA_COMPONENT_EXPORT( } // namespace internal -constexpr internal::base::TimeDelta kMinPurgeInterval = - internal::base::Seconds(1); -constexpr internal::base::TimeDelta kMaxPurgeInterval = - internal::base::Minutes(1); -constexpr internal::base::TimeDelta kDefaultPurgeInterval = - 2 * kMinPurgeInterval; -constexpr size_t kMinCachedMemoryForPurgingBytes = 500 * 1024; - // Global registry of all ThreadCache instances. // // This class cannot allocate in the (Un)registerThreadCache() functions, as @@ -138,26 +130,6 @@ class PA_COMPONENT_EXPORT(PARTITION_ALLOC) ThreadCacheRegistry { void SetThreadCacheMultiplier(float multiplier); void SetLargestActiveBucketIndex(uint16_t largest_active_bucket_index); - // Controls the thread cache purging configuration. - void SetPurgingConfiguration( - const internal::base::TimeDelta min_purge_interval, - const internal::base::TimeDelta max_purge_interval, - const internal::base::TimeDelta default_purge_interval, - size_t min_cached_memory_for_purging_bytes); - internal::base::TimeDelta min_purge_interval() const { - return min_purge_interval_; - } - internal::base::TimeDelta max_purge_interval() const { - return max_purge_interval_; - } - internal::base::TimeDelta default_purge_interval() const { - return default_purge_interval_; - } - size_t min_cached_memory_for_purging_bytes() const { - return min_cached_memory_for_purging_bytes_; - } - bool is_purging_configured() const { return is_purging_configured_; } - static internal::Lock& GetLock() { return Instance().lock_; } // Purges all thread caches *now*. This is completely thread-unsafe, and // should only be called in a post-fork() handler. @@ -165,6 +137,14 @@ class PA_COMPONENT_EXPORT(PARTITION_ALLOC) ThreadCacheRegistry { void ResetForTesting(); + static constexpr internal::base::TimeDelta kMinPurgeInterval = + internal::base::Seconds(1); + static constexpr internal::base::TimeDelta kMaxPurgeInterval = + internal::base::Minutes(1); + static constexpr internal::base::TimeDelta kDefaultPurgeInterval = + 2 * kMinPurgeInterval; + static constexpr size_t kMinCachedMemoryForPurgingBytes = 500 * 1024; + private: friend class tools::ThreadCacheInspector; friend class tools::HeapDumper; @@ -173,12 +153,7 @@ class PA_COMPONENT_EXPORT(PARTITION_ALLOC) ThreadCacheRegistry { internal::Lock lock_; ThreadCache* list_head_ PA_GUARDED_BY(GetLock()) = nullptr; bool periodic_purge_is_initialized_ = false; - internal::base::TimeDelta min_purge_interval_; - internal::base::TimeDelta max_purge_interval_; - internal::base::TimeDelta default_purge_interval_; - size_t min_cached_memory_for_purging_bytes_ = 0u; internal::base::TimeDelta periodic_purge_next_interval_; - bool is_purging_configured_ = false; uint16_t largest_active_bucket_index_ = BucketIndexLookup::GetIndexForNeutralBuckets( diff --git a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/use_death_tests.h b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/use_death_tests.h index ed52070eb6..7c795d4cee 100644 --- a/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/use_death_tests.h +++ b/naiveproxy/src/base/allocator/partition_allocator/src/partition_alloc/use_death_tests.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #ifndef PARTITION_ALLOC_USE_DEATH_TESTS_H_ #define PARTITION_ALLOC_USE_DEATH_TESTS_H_ diff --git a/naiveproxy/src/base/allocator/scheduler_loop_quarantine_config.cc b/naiveproxy/src/base/allocator/scheduler_loop_quarantine_config.cc index b8b1e20249..2e78957d2e 100644 --- a/naiveproxy/src/base/allocator/scheduler_loop_quarantine_config.cc +++ b/naiveproxy/src/base/allocator/scheduler_loop_quarantine_config.cc @@ -24,6 +24,7 @@ constexpr char kProcessTypeWildcardStr[] = "*"; constexpr char kBranchTypeGlobalStr[] = "global"; constexpr char kBranchTypeThreadLocalDefaultStr[] = "*"; constexpr char kBranchTypeMainStr[] = "main"; +constexpr char kBranchTypeAdvancedMemorySafetyChecksStr[] = "amsc"; constexpr std::string_view GetSchedulerLoopQuarantineBranchTypeStr( SchedulerLoopQuarantineBranchType type) { @@ -34,6 +35,8 @@ constexpr std::string_view GetSchedulerLoopQuarantineBranchTypeStr( return kBranchTypeThreadLocalDefaultStr; case SchedulerLoopQuarantineBranchType::kMain: return kBranchTypeMainStr; + case SchedulerLoopQuarantineBranchType::kAdvancedMemorySafetyChecks: + return kBranchTypeAdvancedMemorySafetyChecksStr; } NOTREACHED(); } @@ -49,6 +52,7 @@ constexpr char kKeyEnableQuarantine[] = "enable-quarantine"; constexpr char kKeyEnableZapping[] = "enable-zapping"; constexpr char kKeyLeakOnDestruction[] = "leak-on-destruction"; constexpr char kKeyBranchCapacityInBytes[] = "branch-capacity-in-bytes"; +constexpr char kKeyMaxQuarantineSize[] = "max-quarantine-size"; #endif // PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) } // namespace @@ -104,7 +108,9 @@ GetSchedulerLoopQuarantineConfiguration( // Falls back to thread-local default unless global. if (!config_entry && - branch_type != SchedulerLoopQuarantineBranchType::kGlobal) { + branch_type != SchedulerLoopQuarantineBranchType::kGlobal && + branch_type != + SchedulerLoopQuarantineBranchType::kAdvancedMemorySafetyChecks) { config_entry = config_current_process->FindDict(kBranchTypeThreadLocalDefaultStr); } @@ -139,6 +145,12 @@ GetSchedulerLoopQuarantineConfiguration( config.branch_capacity_in_bytes = static_cast(config_entry->FindInt(kKeyBranchCapacityInBytes) .value_or(config.branch_capacity_in_bytes)); + + int max_quarantine_size = + config_entry->FindInt(kKeyMaxQuarantineSize).value_or(-1); + if (0 < max_quarantine_size) { + config.max_quarantine_size = static_cast(max_quarantine_size); + } #endif // PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) return config; diff --git a/naiveproxy/src/base/allocator/scheduler_loop_quarantine_config.h b/naiveproxy/src/base/allocator/scheduler_loop_quarantine_config.h index 50e421e208..6d8b28ff16 100644 --- a/naiveproxy/src/base/allocator/scheduler_loop_quarantine_config.h +++ b/naiveproxy/src/base/allocator/scheduler_loop_quarantine_config.h @@ -22,6 +22,8 @@ enum class SchedulerLoopQuarantineBranchType { kThreadLocalDefault, // Specialized configuration for the main thread of a process. kMain, + // One for `ADVANCED_MEMORY_SAFETY_CHECKS()` objects. + kAdvancedMemorySafetyChecks, }; // Returns quarantine configuration for `process_name` and `branch_type`. diff --git a/naiveproxy/src/base/android/OWNERS b/naiveproxy/src/base/android/OWNERS index 2c13472136..7b261ad127 100644 --- a/naiveproxy/src/base/android/OWNERS +++ b/naiveproxy/src/base/android/OWNERS @@ -4,6 +4,7 @@ lizeb@chromium.org nuskos@chromium.org nyquist@chromium.org pasko@chromium.org +smaier@chromium.org torne@chromium.org yfriedman@chromium.org diff --git a/naiveproxy/src/base/android/android_hardware_buffer_compat.cc b/naiveproxy/src/base/android/android_hardware_buffer_compat.cc deleted file mode 100644 index 59d848d01d..0000000000 --- a/naiveproxy/src/base/android/android_hardware_buffer_compat.cc +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/android/android_hardware_buffer_compat.h" - -#include - -#include "base/android/build_info.h" -#include "base/check.h" - -namespace base { - -AndroidHardwareBufferCompat::AndroidHardwareBufferCompat() { - DCHECK(IsSupportAvailable()); - - // TODO(crbug.com/40877384): If the Chromium build requires - // __ANDROID_API__ >= 26 at some point in the future, we could directly use - // the global functions instead of dynamic loading. However, since this would - // be incompatible with pre-Oreo devices, this is unlikely to happen in the - // foreseeable future, so just unconditionally use dynamic loading. - - // cf. base/android/linker/linker_jni.cc - void* main_dl_handle = dlopen(nullptr, RTLD_NOW); - - *reinterpret_cast(&allocate_) = - dlsym(main_dl_handle, "AHardwareBuffer_allocate"); - DCHECK(allocate_); - - *reinterpret_cast(&acquire_) = - dlsym(main_dl_handle, "AHardwareBuffer_acquire"); - DCHECK(acquire_); - - *reinterpret_cast(&describe_) = - dlsym(main_dl_handle, "AHardwareBuffer_describe"); - DCHECK(describe_); - - *reinterpret_cast(&lock_) = - dlsym(main_dl_handle, "AHardwareBuffer_lock"); - DCHECK(lock_); - - *reinterpret_cast(&recv_handle_) = - dlsym(main_dl_handle, "AHardwareBuffer_recvHandleFromUnixSocket"); - DCHECK(recv_handle_); - - *reinterpret_cast(&release_) = - dlsym(main_dl_handle, "AHardwareBuffer_release"); - DCHECK(release_); - - *reinterpret_cast(&send_handle_) = - dlsym(main_dl_handle, "AHardwareBuffer_sendHandleToUnixSocket"); - DCHECK(send_handle_); - - *reinterpret_cast(&unlock_) = - dlsym(main_dl_handle, "AHardwareBuffer_unlock"); - DCHECK(unlock_); -} - -// static -bool AndroidHardwareBufferCompat::IsSupportAvailable() { - return base::android::BuildInfo::GetInstance()->sdk_int() >= - base::android::SDK_VERSION_OREO; -} - -// static -AndroidHardwareBufferCompat& AndroidHardwareBufferCompat::GetInstance() { - static AndroidHardwareBufferCompat compat; - return compat; -} - -void AndroidHardwareBufferCompat::Allocate(const AHardwareBuffer_Desc* desc, - AHardwareBuffer** out_buffer) { - DCHECK(IsSupportAvailable()); - allocate_(desc, out_buffer); -} - -void AndroidHardwareBufferCompat::Acquire(AHardwareBuffer* buffer) { - DCHECK(IsSupportAvailable()); - - // Null |buffer| is not allowed by |acquire_| and it fails somewhere in - // android framework code. Hence adding a DCHECK here for documenting this - // info and fail before. - DCHECK(buffer); - acquire_(buffer); -} - -void AndroidHardwareBufferCompat::Describe(const AHardwareBuffer* buffer, - AHardwareBuffer_Desc* out_desc) { - DCHECK(IsSupportAvailable()); - describe_(buffer, out_desc); -} - -int AndroidHardwareBufferCompat::Lock(AHardwareBuffer* buffer, - uint64_t usage, - int32_t fence, - const ARect* rect, - void** out_virtual_address) { - DCHECK(IsSupportAvailable()); - return lock_(buffer, usage, fence, rect, out_virtual_address); -} - -int AndroidHardwareBufferCompat::RecvHandleFromUnixSocket( - int socket_fd, - AHardwareBuffer** out_buffer) { - DCHECK(IsSupportAvailable()); - return recv_handle_(socket_fd, out_buffer); -} - -void AndroidHardwareBufferCompat::Release(AHardwareBuffer* buffer) { - DCHECK(IsSupportAvailable()); - release_(buffer); -} - -int AndroidHardwareBufferCompat::SendHandleToUnixSocket( - const AHardwareBuffer* buffer, - int socket_fd) { - DCHECK(IsSupportAvailable()); - return send_handle_(buffer, socket_fd); -} - -int AndroidHardwareBufferCompat::Unlock(AHardwareBuffer* buffer, - int32_t* fence) { - DCHECK(IsSupportAvailable()); - return unlock_(buffer, fence); -} - -} // namespace base diff --git a/naiveproxy/src/base/android/android_hardware_buffer_compat.h b/naiveproxy/src/base/android/android_hardware_buffer_compat.h deleted file mode 100644 index 99053ae7ba..0000000000 --- a/naiveproxy/src/base/android/android_hardware_buffer_compat.h +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_ANDROID_ANDROID_HARDWARE_BUFFER_COMPAT_H_ -#define BASE_ANDROID_ANDROID_HARDWARE_BUFFER_COMPAT_H_ - -#include -#include - -#include "base/base_export.h" -#include "base/no_destructor.h" - -extern "C" { -using PFAHardwareBuffer_allocate = void (*)(const AHardwareBuffer_Desc* desc, - AHardwareBuffer** outBuffer); -using PFAHardwareBuffer_acquire = void (*)(AHardwareBuffer* buffer); -using PFAHardwareBuffer_describe = void (*)(const AHardwareBuffer* buffer, - AHardwareBuffer_Desc* outDesc); -using PFAHardwareBuffer_lock = int (*)(AHardwareBuffer* buffer, - uint64_t usage, - int32_t fence, - const ARect* rect, - void** outVirtualAddress); -using PFAHardwareBuffer_recvHandleFromUnixSocket = - int (*)(int socketFd, AHardwareBuffer** outBuffer); -using PFAHardwareBuffer_release = void (*)(AHardwareBuffer* buffer); -using PFAHardwareBuffer_sendHandleToUnixSocket = - int (*)(const AHardwareBuffer* buffer, int socketFd); -using PFAHardwareBuffer_unlock = int (*)(AHardwareBuffer* buffer, - int32_t* fence); -} - -namespace base { - -// This class provides runtime support for working with AHardwareBuffer objects -// on Android O systems without requiring building for the Android O NDK level. -// Don't call GetInstance() unless IsSupportAvailable() returns true. -class BASE_EXPORT AndroidHardwareBufferCompat { - public: - static bool IsSupportAvailable(); - static AndroidHardwareBufferCompat& GetInstance(); - - AndroidHardwareBufferCompat(const AndroidHardwareBufferCompat&) = delete; - AndroidHardwareBufferCompat& operator=(const AndroidHardwareBufferCompat&) = - delete; - - void Allocate(const AHardwareBuffer_Desc* desc, AHardwareBuffer** outBuffer); - void Acquire(AHardwareBuffer* buffer); - void Describe(const AHardwareBuffer* buffer, AHardwareBuffer_Desc* outDesc); - int Lock(AHardwareBuffer* buffer, - uint64_t usage, - int32_t fence, - const ARect* rect, - void** out_virtual_address); - int RecvHandleFromUnixSocket(int socketFd, AHardwareBuffer** outBuffer); - void Release(AHardwareBuffer* buffer); - int SendHandleToUnixSocket(const AHardwareBuffer* buffer, int socketFd); - int Unlock(AHardwareBuffer* buffer, int32_t* fence); - - private: - friend class NoDestructor; - AndroidHardwareBufferCompat(); - - PFAHardwareBuffer_allocate allocate_; - PFAHardwareBuffer_acquire acquire_; - PFAHardwareBuffer_describe describe_; - PFAHardwareBuffer_lock lock_; - PFAHardwareBuffer_recvHandleFromUnixSocket recv_handle_; - PFAHardwareBuffer_release release_; - PFAHardwareBuffer_sendHandleToUnixSocket send_handle_; - PFAHardwareBuffer_unlock unlock_; -}; - -} // namespace base - -#endif // BASE_ANDROID_ANDROID_HARDWARE_BUFFER_COMPAT_H_ diff --git a/naiveproxy/src/base/android/android_info.cc b/naiveproxy/src/base/android/android_info.cc index 2d59521611..18492c2804 100644 --- a/naiveproxy/src/base/android/android_info.cc +++ b/naiveproxy/src/base/android/android_info.cc @@ -19,7 +19,7 @@ #include "base/strings/string_number_conversions.h" // Must come after all headers that specialize FromJniType() / ToJniType(). -#include "base/android_info_jni/AndroidInfo_jni.h" +#include "base/build_info_jni/AndroidInfo_jni.h" #if __ANDROID_API__ >= 29 // .aidl based NDK generation is only available when our min SDK level is 29 or diff --git a/naiveproxy/src/base/android/android_info.h b/naiveproxy/src/base/android/android_info.h index c124a93b0a..e3b6abc97a 100644 --- a/naiveproxy/src/base/android/android_info.h +++ b/naiveproxy/src/base/android/android_info.h @@ -45,36 +45,36 @@ enum SdkVersion { SDK_VERSION_BAKLAVA = 36, }; -const std::string& device(); +BASE_EXPORT const std::string& device(); -const std::string& manufacturer(); +BASE_EXPORT const std::string& manufacturer(); -const std::string& model(); +BASE_EXPORT const std::string& model(); BASE_EXPORT const std::string& brand(); -const std::string& android_build_id(); +BASE_EXPORT const std::string& android_build_id(); -const std::string& build_type(); +BASE_EXPORT const std::string& build_type(); -const std::string& board(); +BASE_EXPORT const std::string& board(); -const std::string& android_build_fp(); +BASE_EXPORT const std::string& android_build_fp(); BASE_EXPORT int sdk_int(); BASE_EXPORT bool is_debug_android(); -const std::string& version_incremental(); +BASE_EXPORT const std::string& version_incremental(); BASE_EXPORT const std::string& hardware(); -const std::string& codename(); +BASE_EXPORT const std::string& codename(); // Available only on android S+. For S-, this method returns empty string. -const std::string& soc_manufacturer(); +BASE_EXPORT const std::string& soc_manufacturer(); -const std::string& abi_name(); +BASE_EXPORT const std::string& abi_name(); BASE_EXPORT const std::string& security_patch(); diff --git a/naiveproxy/src/base/android/android_info_stub.cc b/naiveproxy/src/base/android/android_info_stub.cc new file mode 100644 index 0000000000..3e3200edbe --- /dev/null +++ b/naiveproxy/src/base/android/android_info_stub.cc @@ -0,0 +1,79 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/android/android_info.h" + +#include + +static constexpr std::string empty; + +namespace base::android::android_info { +void Set(const IAndroidInfo& info) { +} + +const std::string& device() { + return empty; +} + +const std::string& manufacturer() { + return empty; +} + +const std::string& model() { + return empty; +} + +const std::string& brand() { + return empty; +} + +const std::string& android_build_id() { + return empty; +} + +const std::string& build_type() { + return empty; +} + +const std::string& board() { + return empty; +} + +const std::string& android_build_fp() { + return empty; +} + +int sdk_int() { + return 0; +} + +bool is_debug_android() { + return false; +} + +const std::string& version_incremental() { + return empty; +} + +const std::string& hardware() { + return empty; +} + +const std::string& codename() { + return empty; +} + +const std::string& soc_manufacturer() { + return empty; +} + +const std::string& abi_name() { + return empty; +} + +const std::string& security_patch() { + return empty; +} + +} // namespace base::android::android_info diff --git a/naiveproxy/src/base/android/android_input_receiver_compat.cc b/naiveproxy/src/base/android/android_input_receiver_compat.cc index 6aacd391eb..dcc9b4f643 100644 --- a/naiveproxy/src/base/android/android_input_receiver_compat.cc +++ b/naiveproxy/src/base/android/android_input_receiver_compat.cc @@ -6,7 +6,7 @@ #include -#include "base/android/build_info.h" +#include "base/android/android_info.h" #include "base/check.h" #include "base/logging.h" @@ -49,6 +49,10 @@ AndroidInputReceiverCompat::AndroidInputReceiverCompat() { dlsym(main_dl_handle, "AInputReceiverCallbacks_setMotionEventCallback"); DCHECK(AInputReceiverCallbacks_setMotionEventCallbackFn); + *reinterpret_cast(&AInputReceiverCallbacks_setKeyEventCallbackFn) = + dlsym(main_dl_handle, "AInputReceiverCallbacks_setKeyEventCallback"); + DCHECK(AInputReceiverCallbacks_setKeyEventCallbackFn); + *reinterpret_cast(&AInputReceiver_createBatchedInputReceiverFn) = dlsym(main_dl_handle, "AInputReceiver_createBatchedInputReceiver"); DCHECK(AInputReceiver_createBatchedInputReceiverFn); @@ -68,8 +72,8 @@ AndroidInputReceiverCompat::AndroidInputReceiverCompat() { // static bool AndroidInputReceiverCompat::IsSupportAvailable() { - return base::android::BuildInfo::GetInstance()->sdk_int() >= - base::android::SDK_VERSION_V; + return base::android::android_info::sdk_int() >= + base::android::android_info::SDK_VERSION_V; } // static diff --git a/naiveproxy/src/base/android/android_input_receiver_compat.h b/naiveproxy/src/base/android/android_input_receiver_compat.h index 70fd282cff..b950d5c2ea 100644 --- a/naiveproxy/src/base/android/android_input_receiver_compat.h +++ b/naiveproxy/src/base/android/android_input_receiver_compat.h @@ -19,6 +19,7 @@ typedef struct AInputTransferToken AInputTransferToken; typedef struct AInputReceiver AInputReceiver; typedef bool (*AInputReceiver_onMotionEvent)(void* context, AInputEvent* motionEvent); +typedef bool (*AInputReceiver_onKeyEvent)(void* context, AInputEvent* keyEvent); using pAInputTransferToken_fromJava = AInputTransferToken* (*)(JNIEnv*, jobject); @@ -33,6 +34,8 @@ using pAInputReceiverCallbacks_release = void (*)(AInputReceiverCallbacks* callbacks); using pAInputReceiverCallbacks_setMotionEventCallback = void (*)(AInputReceiverCallbacks*, AInputReceiver_onMotionEvent); +using pAInputReceiverCallbacks_setKeyEventCallback = + void (*)(AInputReceiverCallbacks*, AInputReceiver_onKeyEvent); using pAInputReceiver_createBatchedInputReceiver = AInputReceiver* (*)(AChoreographer*, const AInputTransferToken*, @@ -71,6 +74,8 @@ class BASE_EXPORT AndroidInputReceiverCompat { pAInputReceiverCallbacks_release AInputReceiverCallbacks_releaseFn; pAInputReceiverCallbacks_setMotionEventCallback AInputReceiverCallbacks_setMotionEventCallbackFn; + pAInputReceiverCallbacks_setKeyEventCallback + AInputReceiverCallbacks_setKeyEventCallbackFn; pAInputReceiver_createUnbatchedInputReceiver AInputReceiver_createUnbatchedInputReceiverFn; pAInputReceiver_createBatchedInputReceiver diff --git a/naiveproxy/src/base/android/apk_info.cc b/naiveproxy/src/base/android/apk_info.cc index 294708135b..ce3dc0dc54 100644 --- a/naiveproxy/src/base/android/apk_info.cc +++ b/naiveproxy/src/base/android/apk_info.cc @@ -127,4 +127,8 @@ int target_sdk_version() { return get_apk_info().targetSdkVersion; } +std::string host_signing_cert_sha256() { + JNIEnv* env = AttachCurrentThread(); + return Java_ApkInfo_getHostSigningCertSha256(env); +} } // namespace base::android::apk_info diff --git a/naiveproxy/src/base/android/apk_info.h b/naiveproxy/src/base/android/apk_info.h index 03c28c75d0..5295d417c1 100644 --- a/naiveproxy/src/base/android/apk_info.h +++ b/naiveproxy/src/base/android/apk_info.h @@ -24,31 +24,33 @@ namespace base::android::apk_info { // name of the app that owns this particular instance of the SDK Runtime will // also be included. e.g. // com.google.android.sdksandbox:com:com.example.myappwithads -const std::string& host_package_name(); +BASE_EXPORT const std::string& host_package_name(); // The application name (e.g. "Chrome"). For WebView, this is name of the // embedding app. In the context of the SDK Runtime, this is the name of the // app that owns this particular instance of the SDK Runtime. -const std::string& host_version_code(); +BASE_EXPORT const std::string& host_version_code(); // By default: same as versionCode. For WebView: versionCode of the embedding // app. In the context of the SDK Runtime, this is the versionCode of the app // that owns this particular instance of the SDK Runtime. -const std::string& host_package_label(); +BASE_EXPORT const std::string& host_package_label(); -const std::string& package_version_code(); +BASE_EXPORT const std::string& package_version_code(); -const std::string& package_version_name(); +BASE_EXPORT const std::string& package_version_name(); -const std::string& package_name(); +BASE_EXPORT const std::string& package_name(); -const std::string& resources_version(); +BASE_EXPORT const std::string& resources_version(); -const std::string& installer_package_name(); +BASE_EXPORT const std::string& installer_package_name(); -bool is_debug_app(); +BASE_EXPORT bool is_debug_app(); -int target_sdk_version(); +BASE_EXPORT int target_sdk_version(); + +BASE_EXPORT std::string host_signing_cert_sha256(); BASE_EXPORT void Set(const IApkInfo& info); } // namespace base::android::apk_info diff --git a/naiveproxy/src/base/android/apk_info_stub.cc b/naiveproxy/src/base/android/apk_info_stub.cc new file mode 100644 index 0000000000..e5bac3639c --- /dev/null +++ b/naiveproxy/src/base/android/apk_info_stub.cc @@ -0,0 +1,59 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/android/apk_info.h" + +#include + +static constexpr std::string empty; + +namespace base::android::apk_info { + +void Set(const IApkInfo& info) { +} + +const std::string& host_package_name() { + return empty; +} + +const std::string& host_version_code() { + return empty; +} + +const std::string& host_package_label() { + return empty; +} + +const std::string& package_version_code() { + return empty; +} + +const std::string& package_version_name() { + return empty; +} + +const std::string& package_name() { + return empty; +} + +const std::string& resources_version() { + return empty; +} + +const std::string& installer_package_name() { + return empty; +} + +bool is_debug_app() { + return false; +} + +int target_sdk_version() { + return 0; +} + +std::string host_signing_cert_sha256() { + return empty; +} +} // namespace base::android::apk_info diff --git a/naiveproxy/src/base/android/background_thread_pool_field_trial.cc b/naiveproxy/src/base/android/background_thread_pool_field_trial.cc index 46c6887df6..08941a81cd 100644 --- a/naiveproxy/src/base/android/background_thread_pool_field_trial.cc +++ b/naiveproxy/src/base/android/background_thread_pool_field_trial.cc @@ -22,9 +22,7 @@ namespace base { namespace features { -BASE_FEATURE(kBackgroundThreadPoolFieldTrial, - "BackgroundThreadPoolFieldTrial", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kBackgroundThreadPoolFieldTrial, FEATURE_DISABLED_BY_DEFAULT); // |kBackgroundThreadPoolFieldTrialConfig| is queried only by the Java layer // using CachedFlags, so mark we mark it as unused to make the C++ compiler @@ -80,7 +78,7 @@ BackgroundThreadPoolFieldTrial::GetConfiguration() { #if BUILDFLAG(ENABLE_MUTEX_PRIORITY_INHERITANCE) BackgroundThreadPoolFieldTrial::TrialInfo BackgroundThreadPoolFieldTrial::GetPISupportedTrialInfo() { - const std::string_view kVersionSuffix = "_20250505"; + constexpr std::string_view kVersionSuffix = "_20250917"; std::string_view group_name; switch (GetConfiguration()) { @@ -110,7 +108,7 @@ BackgroundThreadPoolFieldTrial::GetPISupportedTrialInfo() { BackgroundThreadPoolFieldTrial::TrialInfo BackgroundThreadPoolFieldTrial::GetGeneralTrialInfo() { - const std::string_view kVersionSuffix = "_20250505"; + constexpr std::string_view kVersionSuffix = "_20250505"; std::string_view group_name; switch (GetConfiguration()) { diff --git a/naiveproxy/src/base/android/base_feature_map.cc b/naiveproxy/src/base/android/base_feature_map.cc index f6c4c746f5..17c3a8d9c0 100644 --- a/naiveproxy/src/base/android/base_feature_map.cc +++ b/naiveproxy/src/base/android/base_feature_map.cc @@ -17,9 +17,13 @@ namespace { // this array may either refer to features defined in //base features. const base::Feature* const kFeaturesExposedToJava[] = { &features::kBackgroundNotPerceptibleBinding, + &features::kEffectiveBindingState, &features::kPostPowerMonitorBroadcastReceiverInitToBackground, &features::kPostGetMyMemoryStateToBackground, + &features::kRebindingChildServiceConnectionController, + &features::kRebindServiceBatchApi, &features::kUpdateStateBeforeUnbinding, + &features::kUseIsUnboundCheck, &features::kUseSharedRebindServiceConnection, }; diff --git a/naiveproxy/src/base/android/build_info.cc b/naiveproxy/src/base/android/build_info.cc deleted file mode 100644 index 327559ffae..0000000000 --- a/naiveproxy/src/base/android/build_info.cc +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2012 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/android/build_info.h" - -#include - -#include "base/android/android_info.h" -#include "base/android/apk_info.h" -#include "base/android/device_info.h" -#include "base/android/jni_android.h" -#include "base/android/jni_array.h" -#include "base/android/jni_string.h" -#include "base/android/scoped_java_ref.h" -#include "base/check_op.h" -#include "base/memory/singleton.h" -#include "base/notreached.h" -#include "base/strings/string_number_conversions.h" - -// Must come after all headers that specialize FromJniType() / ToJniType(). -#include "base/build_info_jni/BuildInfo_jni.h" - -namespace base { -namespace android { - -struct BuildInfoSingletonTraits { - static BuildInfo* New() { return new BuildInfo(); } - - static void Delete(BuildInfo* x) { - // We're leaking this type, see kRegisterAtExit. - NOTREACHED(); - } - - static const bool kRegisterAtExit = false; -#if DCHECK_IS_ON() - static const bool kAllowedToAccessOnNonjoinableThread = true; -#endif -}; - -BuildInfo::BuildInfo() - : brand_(android_info::brand()), - device_(android_info::device()), - android_build_id_(android_info::android_build_id()), - manufacturer_(android_info::manufacturer()), - model_(android_info::model()), - sdk_int_(android_info::sdk_int()), - build_type_(android_info::build_type()), - board_(android_info::board()), - host_package_name_(apk_info::host_package_name()), - host_version_code_(apk_info::host_version_code()), - host_package_label_(apk_info::host_package_label()), - package_name_(apk_info::package_name()), - package_version_code_(apk_info::package_version_code()), - package_version_name_(apk_info::package_version_name()), - android_build_fp_(android_info::android_build_fp()), - installer_package_name_(apk_info::installer_package_name()), - abi_name_(android_info::abi_name()), - resources_version_(apk_info::resources_version()), - target_sdk_version_(apk_info::target_sdk_version()), - is_debug_android_(android_info::is_debug_android()), - is_tv_(device_info::is_tv()), - version_incremental_(android_info::version_incremental()), - hardware_(android_info::hardware()), - is_automotive_(device_info::is_automotive()), - codename_(android_info::codename()), - vulkan_deqp_level_(device_info::vulkan_deqp_level()), - is_foldable_(device_info::is_foldable()), - soc_manufacturer_(android_info::soc_manufacturer()), - is_debug_app_(apk_info::is_debug_app()), - is_desktop_(device_info::is_desktop()) {} - -BuildInfo::~BuildInfo() = default; - -const std::string& BuildInfo::gms_version_code() const { - return device_info::gms_version_code(); -} - -void BuildInfo::set_gms_version_code_for_test( - const std::string& gms_version_code) { - device_info::set_gms_version_code_for_test(gms_version_code); -} - -const std::string BuildInfo::host_signing_cert_sha256() { - JNIEnv* env = AttachCurrentThread(); - return Java_BuildInfo_lazyGetHostSigningCertSha256(env); -} - -// static -BuildInfo* BuildInfo::GetInstance() { - return Singleton::get(); -} - -} // namespace android -} // namespace base diff --git a/naiveproxy/src/base/android/build_info.h b/naiveproxy/src/base/android/build_info.h deleted file mode 100644 index a6452abeeb..0000000000 --- a/naiveproxy/src/base/android/build_info.h +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright 2012 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_ANDROID_BUILD_INFO_H_ -#define BASE_ANDROID_BUILD_INFO_H_ - -#include - -#include -#include - -#include "base/android/android_info.h" -#include "base/base_export.h" -#include "base/memory/singleton.h" - -namespace base::android { - -// DEPRECATED: Please use android_info::SdkVersion. -// -// This enumeration maps to the values returned by BuildInfo::sdk_int(), -// indicating the Android release associated with a given SDK version. -enum SdkVersion { - SDK_VERSION_JELLY_BEAN = android_info::SDK_VERSION_JELLY_BEAN, - SDK_VERSION_JELLY_BEAN_MR1 = android_info::SDK_VERSION_JELLY_BEAN_MR1, - SDK_VERSION_JELLY_BEAN_MR2 = android_info::SDK_VERSION_JELLY_BEAN_MR2, - SDK_VERSION_KITKAT = android_info::SDK_VERSION_KITKAT, - SDK_VERSION_KITKAT_WEAR = android_info::SDK_VERSION_KITKAT_WEAR, - SDK_VERSION_LOLLIPOP = android_info::SDK_VERSION_LOLLIPOP, - SDK_VERSION_LOLLIPOP_MR1 = android_info::SDK_VERSION_LOLLIPOP_MR1, - SDK_VERSION_MARSHMALLOW = android_info::SDK_VERSION_MARSHMALLOW, - SDK_VERSION_NOUGAT = android_info::SDK_VERSION_NOUGAT, - SDK_VERSION_NOUGAT_MR1 = android_info::SDK_VERSION_NOUGAT_MR1, - SDK_VERSION_OREO = android_info::SDK_VERSION_OREO, - SDK_VERSION_O_MR1 = android_info::SDK_VERSION_O_MR1, - SDK_VERSION_P = android_info::SDK_VERSION_P, - SDK_VERSION_Q = android_info::SDK_VERSION_Q, - SDK_VERSION_R = android_info::SDK_VERSION_R, - SDK_VERSION_S = android_info::SDK_VERSION_S, - SDK_VERSION_Sv2 = android_info::SDK_VERSION_Sv2, - SDK_VERSION_T = android_info::SDK_VERSION_T, - SDK_VERSION_U = android_info::SDK_VERSION_U, - SDK_VERSION_V = android_info::SDK_VERSION_V, -}; - -// DEPRECATED: Use AndroidInfo, DeviceInfo or ApkInfo instead. -// These are more efficient because they only retrieve the data being queried. -// -// BuildInfo is a singleton class that stores android build and device -// information. It will be called from Android specific code and gets used -// primarily in crash reporting. -class BASE_EXPORT BuildInfo { - public: - BuildInfo(const BuildInfo&) = delete; - BuildInfo& operator=(const BuildInfo&) = delete; - - ~BuildInfo(); - - // Static factory method for getting the singleton BuildInfo instance. - // Note that ownership is not conferred on the caller and the BuildInfo in - // question isn't actually freed until shutdown. This is ok because there - // should only be one instance of BuildInfo ever created. - static BuildInfo* GetInstance(); - - const std::string& device() const { return device_; } - - const std::string& manufacturer() const { return manufacturer_; } - - const std::string& model() const { return model_; } - - const std::string& brand() const { return brand_; } - - const std::string& android_build_id() const { return android_build_id_; } - - const std::string& android_build_fp() const { return android_build_fp_; } - - const std::string& gms_version_code() const; - - void set_gms_version_code_for_test(const std::string& gms_version_code); - - // The package name of the host app which has loaded WebView, retrieved from - // the application context. In the context of the SDK Runtime, the package - // name of the app that owns this particular instance of the SDK Runtime will - // also be included. e.g. - // com.google.android.sdksandbox:com:com.example.myappwithads - const std::string& host_package_name() const { return host_package_name_; } - - // The application name (e.g. "Chrome"). For WebView, this is name of the - // embedding app. In the context of the SDK Runtime, this is the name of the - // app that owns this particular instance of the SDK Runtime. - const std::string& host_version_code() const { return host_version_code_; } - - // By default: same as versionCode. For WebView: versionCode of the embedding - // app. In the context of the SDK Runtime, this is the versionCode of the app - // that owns this particular instance of the SDK Runtime. - const std::string& host_package_label() const { return host_package_label_; } - - // The SHA256 of the public certificate used to sign the host application. - // This will default to an empty string if we were unable to retrieve it. - const std::string host_signing_cert_sha256(); - - const std::string& package_version_code() const { - return package_version_code_; - } - - const std::string& package_version_name() const { - return package_version_name_; - } - - const std::string& package_name() const { return package_name_; } - - const std::string& resources_version() const { return resources_version_; } - - const std::string& build_type() const { return build_type_; } - - const std::string& board() const { return board_; } - - const std::string& installer_package_name() const { - return installer_package_name_; - } - - const std::string& abi_name() const { return abi_name_; } - - int sdk_int() const { return sdk_int_; } - - // Returns the targetSdkVersion of the currently running app. If called from a - // library, this returns the embedding app's targetSdkVersion. - // - // This can only be compared to finalized SDK versions, never against - // pre-release Android versions. For pre-release Android versions, see the - // targetsAtLeast*() methods in BuildInfo.java. - int target_sdk_version() const { return target_sdk_version_; } - - bool is_debug_android() const { return is_debug_android_; } - - bool is_tv() const { return is_tv_; } - - const std::string& version_incremental() const { - return version_incremental_; - } - - const std::string& hardware() const { return hardware_; } - - bool is_automotive() const { return is_automotive_; } - - const std::string& codename() const { return codename_; } - - bool is_foldable() const { return is_foldable_; } - - bool is_desktop() const { return is_desktop_; } - - // Available only on Android T+. - int32_t vulkan_deqp_level() const { return vulkan_deqp_level_; } - - // Available only on android S+. For S-, this method returns empty string. - const std::string& soc_manufacturer() const { return soc_manufacturer_; } - - bool is_debug_app() const { return is_debug_app_; } - - private: - friend struct BuildInfoSingletonTraits; - - BuildInfo(); - - const std::string brand_; - const std::string device_; - const std::string android_build_id_; - const std::string manufacturer_; - const std::string model_; - const int sdk_int_; - const std::string build_type_; - const std::string board_; - const std::string host_package_name_; - const std::string host_version_code_; - const std::string host_package_label_; - const std::string package_name_; - const std::string package_version_code_; - const std::string package_version_name_; - const std::string android_build_fp_; - const std::string installer_package_name_; - const std::string abi_name_; - const std::string resources_version_; - const int target_sdk_version_; - const bool is_debug_android_; - const bool is_tv_; - const std::string version_incremental_; - const std::string hardware_; - const bool is_automotive_; - const std::string codename_; - const int32_t vulkan_deqp_level_; - const bool is_foldable_; - const std::string soc_manufacturer_; - const bool is_debug_app_; - const bool is_desktop_; -}; - -} // namespace base::android - -#endif // BASE_ANDROID_BUILD_INFO_H_ diff --git a/naiveproxy/src/base/android/callback_android.cc b/naiveproxy/src/base/android/callback_android.cc index 220f97923f..797572d3c8 100644 --- a/naiveproxy/src/base/android/callback_android.cc +++ b/naiveproxy/src/base/android/callback_android.cc @@ -36,8 +36,7 @@ void RunLongCallbackAndroid(const JavaRef& callback, int64_t arg) { } void RunTimeCallbackAndroid(const JavaRef& callback, base::Time time) { - Java_Helper_onTimeResultFromNative(AttachCurrentThread(), callback, - time.InMillisecondsSinceUnixEpoch()); + RunLongCallbackAndroid(callback, time.InMillisecondsSinceUnixEpoch()); } void RunStringCallbackAndroid(const JavaRef& callback, @@ -51,14 +50,10 @@ void RunOptionalStringCallbackAndroid( const JavaRef& callback, base::optional_ref optional_string_arg) { JNIEnv* env = AttachCurrentThread(); - if (optional_string_arg.has_value()) { - Java_Helper_onOptionalStringResultFromNative( - env, callback, true, - ConvertUTF8ToJavaString(env, optional_string_arg.value())); - } else { - Java_Helper_onOptionalStringResultFromNative( - env, callback, false, ConvertUTF8ToJavaString(env, std::string())); - } + RunObjectCallbackAndroid( + callback, optional_string_arg + ? ConvertUTF8ToJavaString(env, optional_string_arg.value()) + : nullptr); } void RunByteArrayCallbackAndroid(const JavaRef& callback, diff --git a/naiveproxy/src/base/android/content_uri_utils.cc b/naiveproxy/src/base/android/content_uri_utils.cc index a1cb71c9cd..9457ed3d47 100644 --- a/naiveproxy/src/base/android/content_uri_utils.cc +++ b/naiveproxy/src/base/android/content_uri_utils.cc @@ -99,10 +99,11 @@ bool ContentUriGetFileInfo(const FilePath& content_uri, } std::vector ListContentUriDirectory( - const FilePath& content_uri) { + const FilePath& content_uri, + int file_type) { JNIEnv* env = android::AttachCurrentThread(); std::vector result; - Java_ContentUriUtils_listDirectory(env, content_uri.value(), + Java_ContentUriUtils_listDirectory(env, content_uri.value(), file_type, reinterpret_cast(&result)); // Java will call back sync to AddFileInfoToVector(&result). return result; diff --git a/naiveproxy/src/base/android/content_uri_utils.h b/naiveproxy/src/base/android/content_uri_utils.h index d0f8b58642..fba9161517 100644 --- a/naiveproxy/src/base/android/content_uri_utils.h +++ b/naiveproxy/src/base/android/content_uri_utils.h @@ -50,9 +50,12 @@ void ContentUriClose( bool ContentUriGetFileInfo(const FilePath& content_uri, FileEnumerator::FileInfo* results); -// Returns list of files in `content_uri` directory. +// Returns list of files in `content_uri` directory. `file_type` is the +// FileEnumerator::FileType flag that specifies the type of files to be +// enumerated. std::vector ListContentUriDirectory( - const FilePath& content_uri); + const FilePath& content_uri, + int file_type); // Deletes a content URI. bool DeleteContentUri(const FilePath& content_uri); diff --git a/naiveproxy/src/base/android/content_uri_utils_stub.cc b/naiveproxy/src/base/android/content_uri_utils_stub.cc index 9468e505c7..9f0ce2931c 100644 --- a/naiveproxy/src/base/android/content_uri_utils_stub.cc +++ b/naiveproxy/src/base/android/content_uri_utils_stub.cc @@ -30,7 +30,7 @@ bool ContentUriGetFileInfo(const FilePath&, FileEnumerator::FileInfo*) { return false; } -std::vector ListContentUriDirectory(const FilePath&) { +std::vector ListContentUriDirectory(const FilePath&, int) { return {}; } diff --git a/naiveproxy/src/base/android/device_info.cc b/naiveproxy/src/base/android/device_info.cc index 6374a41793..5c51d77c10 100644 --- a/naiveproxy/src/base/android/device_info.cc +++ b/naiveproxy/src/base/android/device_info.cc @@ -36,6 +36,7 @@ struct IDeviceInfo { // Available only on Android T+. int32_t vulkanDeqpLevel; bool isXr; + bool wasLaunchedOnLargeDisplay; }; #endif @@ -56,7 +57,6 @@ IDeviceInfo& get_device_info() { void Set(const IDeviceInfo& info) { std::optional& holder = get_holder(); - DCHECK(!holder.has_value()); holder.emplace(info); } @@ -67,14 +67,17 @@ static void JNI_DeviceInfo_FillFields(JNIEnv* env, jboolean isFoldable, jboolean isDesktop, jint vulkanDeqpLevel, - jboolean isXr) { + jboolean isXr, + jboolean wasLaunchedOnLargeDisplay) { Set(IDeviceInfo{.gmsVersionCode = gmsVersionCode, .isAutomotive = static_cast(isAutomotive), .isDesktop = static_cast(isDesktop), .isFoldable = static_cast(isFoldable), .isTv = static_cast(isTV), .vulkanDeqpLevel = vulkanDeqpLevel, - .isXr = static_cast(isXr)}); + .isXr = static_cast(isXr), + .wasLaunchedOnLargeDisplay = + static_cast(wasLaunchedOnLargeDisplay)}); } const std::string& gms_version_code() { @@ -110,8 +113,31 @@ bool is_xr() { return get_device_info().isXr; } +// Roughly matches the check logic in device_form_factor.h to see if the device +// is a tablet (based on mostly elimination of other possible form-factors and +// screen-width). Where possible, prefer using device_form_factor.h (runtime +// check) as a first choice, but fall back to this if not feasible. +bool is_tablet() { + return was_launched_on_large_display() && !is_tv() && !is_automotive() && + !is_desktop() && !is_xr(); +} + +// This returns the cached value during initial startup. If you need this +// evaluated at runtime, then use device_form_factor Additionally, this differs +// from device_form_factor in that it does not guarantee that the Android +// resource (-sw600) is respected. +bool was_launched_on_large_display() { + return get_device_info().wasLaunchedOnLargeDisplay; +} + +std::string device_name() { + JNIEnv* env = base::android::AttachCurrentThread(); + return base::android::ConvertJavaStringToUTF8( + env, Java_DeviceInfo_getDeviceName(env)); +} + void set_is_xr_for_testing() { - Java_DeviceInfo_setIsXrForTesting(AttachCurrentThread()); // IN-TEST + Java_DeviceInfo_setIsXrForTesting(AttachCurrentThread(), true); // IN-TEST get_holder().reset(); } diff --git a/naiveproxy/src/base/android/device_info.h b/naiveproxy/src/base/android/device_info.h index f4715bcf5e..18657de247 100644 --- a/naiveproxy/src/base/android/device_info.h +++ b/naiveproxy/src/base/android/device_info.h @@ -33,6 +33,9 @@ BASE_EXPORT bool is_desktop(); // Available only on Android T+. BASE_EXPORT int32_t vulkan_deqp_level(); BASE_EXPORT bool is_xr(); +BASE_EXPORT bool was_launched_on_large_display(); // >= 600dp +BASE_EXPORT bool is_tablet(); +BASE_EXPORT std::string device_name(); // For testing use only. BASE_EXPORT void set_is_xr_for_testing(); diff --git a/naiveproxy/src/base/android/device_info_stub.cc b/naiveproxy/src/base/android/device_info_stub.cc new file mode 100644 index 0000000000..a1d9f7e199 --- /dev/null +++ b/naiveproxy/src/base/android/device_info_stub.cc @@ -0,0 +1,61 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/android/device_info.h" + +#include + +static constexpr std::string empty; + +namespace base::android::device_info { +void Set(const IDeviceInfo& info) { +} + +const std::string& gms_version_code() { + return empty; +} + +void set_gms_version_code_for_test(const std::string& gms_version_code) { +} + +bool is_tv() { + return false; +} +bool is_automotive() { + return false; +} +bool is_foldable() { + return false; +} + +bool is_desktop() { + return false; +} + +int32_t vulkan_deqp_level() { + return 0; +} + +bool is_xr() { + return false; +} + +bool is_tablet() { + return false; +} + +bool was_launched_on_large_display() { + return false; +} + +std::string device_name() { + return empty; +} + +void set_is_xr_for_testing() { +} + +void reset_is_xr_for_testing() { +} +} // namespace base::android::device_info diff --git a/naiveproxy/src/base/android/early_trace_event_binding.cc b/naiveproxy/src/base/android/early_trace_event_binding.cc index c6b471ad0a..a75be6ef25 100644 --- a/naiveproxy/src/base/android/early_trace_event_binding.cc +++ b/naiveproxy/src/base/android/early_trace_event_binding.cc @@ -23,14 +23,9 @@ static void JNI_EarlyTraceEvent_RecordEarlyBeginEvent(JNIEnv* env, jlong time_ns, jint thread_id, jlong thread_time_ms) { - static const unsigned char* category_group_enabled = - TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(internal::kJavaTraceCategory); - trace_event_internal::AddTraceEventWithThreadIdAndTimestamps( - TRACE_EVENT_PHASE_BEGIN, category_group_enabled, name.c_str(), - /*scope=*/nullptr, trace_event_internal::kNoId, - PlatformThreadId(thread_id), TimeTicks::FromJavaNanoTime(time_ns), - ThreadTicks() + Milliseconds(thread_time_ms), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); + auto t = perfetto::ThreadTrack::ForThread(thread_id); + TRACE_EVENT_BEGIN(internal::kJavaTraceCategory, perfetto::DynamicString{name}, + t, TimeTicks::FromJavaNanoTime(time_ns)); } static void JNI_EarlyTraceEvent_RecordEarlyEndEvent(JNIEnv* env, @@ -38,14 +33,9 @@ static void JNI_EarlyTraceEvent_RecordEarlyEndEvent(JNIEnv* env, jlong time_ns, jint thread_id, jlong thread_time_ms) { - static const unsigned char* category_group_enabled = - TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(internal::kJavaTraceCategory); - trace_event_internal::AddTraceEventWithThreadIdAndTimestamps( - TRACE_EVENT_PHASE_END, category_group_enabled, name.c_str(), - /*scope=*/nullptr, trace_event_internal::kNoId, - PlatformThreadId(thread_id), TimeTicks::FromJavaNanoTime(time_ns), - ThreadTicks() + Milliseconds(thread_time_ms), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); + auto t = perfetto::ThreadTrack::ForThread(thread_id); + TRACE_EVENT_END(internal::kJavaTraceCategory, t, + TimeTicks::FromJavaNanoTime(time_ns)); } static void JNI_EarlyTraceEvent_RecordEarlyToplevelBeginEvent( @@ -86,12 +76,11 @@ static void JNI_EarlyTraceEvent_RecordEarlyAsyncBeginEvent(JNIEnv* env, std::string& name, jlong id, jlong time_ns) { - TRACE_EVENT_BEGIN(internal::kJavaTraceCategory, nullptr, - perfetto::Track(static_cast(id)), - TimeTicks::FromJavaNanoTime(time_ns), - [&](::perfetto::EventContext& ctx) { - ctx.event()->set_name(name.c_str()); - }); + TRACE_EVENT_BEGIN( + internal::kJavaTraceCategory, nullptr, + perfetto::Track(static_cast(id)), + TimeTicks::FromJavaNanoTime(time_ns), + [&](::perfetto::EventContext& ctx) { ctx.event()->set_name(name); }); } static void JNI_EarlyTraceEvent_RecordEarlyAsyncEndEvent(JNIEnv* env, diff --git a/naiveproxy/src/base/android/input_hint_checker.cc b/naiveproxy/src/base/android/input_hint_checker.cc index 690b3831c5..dcdb38e585 100644 --- a/naiveproxy/src/base/android/input_hint_checker.cc +++ b/naiveproxy/src/base/android/input_hint_checker.cc @@ -40,10 +40,7 @@ InputHintChecker* g_test_instance; // Whether to fetch the input hint from the system. When disabled, pretends // that no input is ever queued. -BASE_EXPORT -BASE_FEATURE(kYieldWithInputHint, - "YieldWithInputHint", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kYieldWithInputHint, base::FEATURE_ENABLED_BY_DEFAULT); // Min time delta between checks for the input hint. Must be a smaller than // time to produce a frame, but a bit longer than the time it takes to retrieve diff --git a/naiveproxy/src/base/android/input_hint_checker.h b/naiveproxy/src/base/android/input_hint_checker.h index 8cf58765d8..898abf1376 100644 --- a/naiveproxy/src/base/android/input_hint_checker.h +++ b/naiveproxy/src/base/android/input_hint_checker.h @@ -17,7 +17,7 @@ namespace base::android { -BASE_DECLARE_FEATURE(kYieldWithInputHint); +BASE_EXPORT BASE_DECLARE_FEATURE(kYieldWithInputHint); // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. diff --git a/naiveproxy/src/base/android/jank_metric_uma_recorder.cc b/naiveproxy/src/base/android/jank_metric_uma_recorder.cc deleted file mode 100644 index ebb362b972..0000000000 --- a/naiveproxy/src/base/android/jank_metric_uma_recorder.cc +++ /dev/null @@ -1,350 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/android/jank_metric_uma_recorder.h" - -#include - -#include "base/android/jni_android.h" -#include "base/android/jni_array.h" -#include "base/metrics/histogram_functions.h" -#include "base/notreached.h" -#include "base/time/time.h" -#include "base/trace_event/trace_event.h" -#include "jank_metric_uma_recorder.h" - -// Must come after all headers that specialize FromJniType() / ToJniType(). -#include "base/jank_tracker_jni/JankMetricUMARecorder_jni.h" - -namespace base::android { - -namespace { - -// Histogram min, max and no. of buckets. -constexpr int kVsyncCountsMin = 1; -constexpr int kVsyncCountsMax = 50; -constexpr int kVsyncCountsBuckets = 25; - -enum class PerScrollHistogramType { - kPercentage = 0, - kMax = 1, - kSum = 2, -}; - -const char* GetPerScrollHistogramName(JankScenario scenario, - int num_frames, - PerScrollHistogramType type, - bool with_scroll_size_suffix) { -#define HISTOGRAM_NAME(hist_scenario, hist_type, length) \ - "Android.FrameTimelineJank." #hist_scenario "." #hist_type \ - "." \ - "PerScroll" #length - if (scenario == JankScenario::WEBVIEW_SCROLLING) { - if (type == PerScrollHistogramType::kPercentage) { - if (!with_scroll_size_suffix) { - return HISTOGRAM_NAME(WebviewScrolling, DelayedFramesPercentage, - /*no suffix*/); - } - if (num_frames <= 16) { - return HISTOGRAM_NAME(WebviewScrolling, DelayedFramesPercentage, - .Small); - } else if (num_frames <= 64) { - return HISTOGRAM_NAME(WebviewScrolling, DelayedFramesPercentage, - .Medium); - } else { - return HISTOGRAM_NAME(WebviewScrolling, DelayedFramesPercentage, - .Large); - } - } else if (type == PerScrollHistogramType::kMax) { - if (!with_scroll_size_suffix) { - return HISTOGRAM_NAME(WebviewScrolling, MissedVsyncsMax, /*no suffix*/); - } - if (num_frames <= 16) { - return HISTOGRAM_NAME(WebviewScrolling, MissedVsyncsMax, .Small); - } else if (num_frames <= 64) { - return HISTOGRAM_NAME(WebviewScrolling, MissedVsyncsMax, .Medium); - } else { - return HISTOGRAM_NAME(WebviewScrolling, MissedVsyncsMax, .Large); - } - } else { - DCHECK_EQ(type, PerScrollHistogramType::kSum); - if (!with_scroll_size_suffix) { - return HISTOGRAM_NAME(WebviewScrolling, MissedVsyncsSum, /*no suffix*/); - } - if (num_frames <= 16) { - return HISTOGRAM_NAME(WebviewScrolling, MissedVsyncsSum, .Small); - } else if (num_frames <= 64) { - return HISTOGRAM_NAME(WebviewScrolling, MissedVsyncsSum, .Medium); - } else { - return HISTOGRAM_NAME(WebviewScrolling, MissedVsyncsSum, .Large); - } - } - } else { - DCHECK_EQ(scenario, JankScenario::FEED_SCROLLING); - if (type == PerScrollHistogramType::kPercentage) { - if (!with_scroll_size_suffix) { - return HISTOGRAM_NAME(FeedScrolling, DelayedFramesPercentage, - /*no suffix*/); - } - if (num_frames <= 16) { - return HISTOGRAM_NAME(FeedScrolling, DelayedFramesPercentage, .Small); - } else if (num_frames <= 64) { - return HISTOGRAM_NAME(FeedScrolling, DelayedFramesPercentage, .Medium); - } else { - return HISTOGRAM_NAME(FeedScrolling, DelayedFramesPercentage, .Large); - } - } else if (type == PerScrollHistogramType::kMax) { - if (!with_scroll_size_suffix) { - return HISTOGRAM_NAME(FeedScrolling, MissedVsyncsMax, /*no suffix*/); - } - if (num_frames <= 16) { - return HISTOGRAM_NAME(FeedScrolling, MissedVsyncsMax, .Small); - } else if (num_frames <= 64) { - return HISTOGRAM_NAME(FeedScrolling, MissedVsyncsMax, .Medium); - } else { - return HISTOGRAM_NAME(FeedScrolling, MissedVsyncsMax, .Large); - } - } else { - DCHECK_EQ(type, PerScrollHistogramType::kSum); - if (!with_scroll_size_suffix) { - return HISTOGRAM_NAME(FeedScrolling, MissedVsyncsSum, /*no suffix*/); - } - if (num_frames <= 16) { - return HISTOGRAM_NAME(FeedScrolling, MissedVsyncsSum, .Small); - } else if (num_frames <= 64) { - return HISTOGRAM_NAME(FeedScrolling, MissedVsyncsSum, .Medium); - } else { - return HISTOGRAM_NAME(FeedScrolling, MissedVsyncsSum, .Large); - } - } - } -#undef HISTOGRAM_NAME -} - -// Emits trace event for all scenarios and per scroll histograms for webview and -// feed scrolling scenarios. -void EmitMetrics(JankScenario scenario, - int janky_frame_count, - int missed_vsyncs_max, - int missed_vsyncs_sum, - int num_presented_frames, - int64_t reporting_interval_start_time, - int64_t reporting_interval_duration) { - DCHECK_GT(num_presented_frames, 0); - int delayed_frames_percentage = - (100 * janky_frame_count) / num_presented_frames; - if (reporting_interval_start_time > 0) { - // The following code does nothing if base tracing is disabled. - [[maybe_unused]] int non_janky_frame_count = - num_presented_frames - janky_frame_count; - [[maybe_unused]] auto t = perfetto::Track(static_cast( - reporting_interval_start_time + static_cast(scenario))); - TRACE_EVENT_BEGIN( - "android_webview.timeline,android.ui.jank", - "JankMetricsReportingInterval", t, - base::TimeTicks::FromUptimeMillis(reporting_interval_start_time), - "janky_frames", janky_frame_count, "non_janky_frames", - non_janky_frame_count, "scenario", static_cast(scenario), - "delayed_frames_percentage", delayed_frames_percentage, - "missed_vsyns_max", missed_vsyncs_max, "missed_vsyncs_sum", - missed_vsyncs_sum); - TRACE_EVENT_END( - "android_webview.timeline,android.ui.jank", t, - base::TimeTicks::FromUptimeMillis( - (reporting_interval_start_time + reporting_interval_duration))); - } - - if (scenario != JankScenario::WEBVIEW_SCROLLING && - scenario != JankScenario::FEED_SCROLLING) { - return; - } - // Emit non-bucketed per scroll metrics. - base::UmaHistogramPercentage( - GetPerScrollHistogramName(scenario, num_presented_frames, - PerScrollHistogramType::kPercentage, - /*with_scroll_size_suffix=*/false), - delayed_frames_percentage); - base::UmaHistogramCustomCounts( - GetPerScrollHistogramName(scenario, num_presented_frames, - PerScrollHistogramType::kMax, - /*with_scroll_size_suffix=*/false), - missed_vsyncs_max, kVsyncCountsMin, kVsyncCountsMax, kVsyncCountsBuckets); - base::UmaHistogramCustomCounts( - GetPerScrollHistogramName(scenario, num_presented_frames, - PerScrollHistogramType::kSum, - /*with_scroll_size_suffix=*/false), - missed_vsyncs_sum, kVsyncCountsMin, kVsyncCountsMax, kVsyncCountsBuckets); - - // Emit bucketed per scroll metrics where scrolls are divided into three - // buckets Small, Medium, Large. - base::UmaHistogramPercentage( - GetPerScrollHistogramName(scenario, num_presented_frames, - PerScrollHistogramType::kPercentage, - /*with_scroll_size_suffix=*/true), - delayed_frames_percentage); - base::UmaHistogramCustomCounts( - GetPerScrollHistogramName(scenario, num_presented_frames, - PerScrollHistogramType::kMax, - /*with_scroll_size_suffix=*/true), - missed_vsyncs_max, kVsyncCountsMin, kVsyncCountsMax, kVsyncCountsBuckets); - base::UmaHistogramCustomCounts( - GetPerScrollHistogramName(scenario, num_presented_frames, - PerScrollHistogramType::kSum, - /*with_scroll_size_suffix=*/true), - missed_vsyncs_sum, kVsyncCountsMin, kVsyncCountsMax, kVsyncCountsBuckets); -} - -} // namespace - -const char* GetAndroidFrameTimelineJankHistogramName(JankScenario scenario) { -#define HISTOGRAM_NAME(x) "Android.FrameTimelineJank.FrameJankStatus." #x - switch (scenario) { - case JankScenario::PERIODIC_REPORTING: - return HISTOGRAM_NAME(Total); - case JankScenario::OMNIBOX_FOCUS: - return HISTOGRAM_NAME(OmniboxFocus); - case JankScenario::NEW_TAB_PAGE: - return HISTOGRAM_NAME(NewTabPage); - case JankScenario::STARTUP: - return HISTOGRAM_NAME(Startup); - case JankScenario::TAB_SWITCHER: - return HISTOGRAM_NAME(TabSwitcher); - case JankScenario::OPEN_LINK_IN_NEW_TAB: - return HISTOGRAM_NAME(OpenLinkInNewTab); - case JankScenario::START_SURFACE_HOMEPAGE: - return HISTOGRAM_NAME(StartSurfaceHomepage); - case JankScenario::START_SURFACE_TAB_SWITCHER: - return HISTOGRAM_NAME(StartSurfaceTabSwitcher); - case JankScenario::FEED_SCROLLING: - return HISTOGRAM_NAME(FeedScrolling); - case JankScenario::WEBVIEW_SCROLLING: - return HISTOGRAM_NAME(WebviewScrolling); - case JankScenario::COMBINED_WEBVIEW_SCROLLING: - // Emit per frame metrics for combined scrolling scenario with same - // histogram name as webview scrolling. This is fine since we don't emit - // per frame metrics for |WEBVIEW_SCROLLING| scenario. - return HISTOGRAM_NAME(WebviewScrolling); - default: - NOTREACHED(); - } -#undef HISTOGRAM_NAME -} - -const char* GetAndroidFrameTimelineDurationHistogramName( - JankScenario scenario) { -#define HISTOGRAM_NAME(x) "Android.FrameTimelineJank.Duration." #x - switch (scenario) { - case JankScenario::PERIODIC_REPORTING: - return HISTOGRAM_NAME(Total); - case JankScenario::OMNIBOX_FOCUS: - return HISTOGRAM_NAME(OmniboxFocus); - case JankScenario::NEW_TAB_PAGE: - return HISTOGRAM_NAME(NewTabPage); - case JankScenario::STARTUP: - return HISTOGRAM_NAME(Startup); - case JankScenario::TAB_SWITCHER: - return HISTOGRAM_NAME(TabSwitcher); - case JankScenario::OPEN_LINK_IN_NEW_TAB: - return HISTOGRAM_NAME(OpenLinkInNewTab); - case JankScenario::START_SURFACE_HOMEPAGE: - return HISTOGRAM_NAME(StartSurfaceHomepage); - case JankScenario::START_SURFACE_TAB_SWITCHER: - return HISTOGRAM_NAME(StartSurfaceTabSwitcher); - case JankScenario::FEED_SCROLLING: - return HISTOGRAM_NAME(FeedScrolling); - case JankScenario::WEBVIEW_SCROLLING: - return HISTOGRAM_NAME(WebviewScrolling); - case JankScenario::COMBINED_WEBVIEW_SCROLLING: - // Emit per frame metrics for combined scrolling scenario with same - // histogram name as webview scrolling. This is fine since we don't emit - // per frame metrics for |WEBVIEW_SCROLLING| scenario. - return HISTOGRAM_NAME(WebviewScrolling); - default: - NOTREACHED(); - } -#undef HISTOGRAM_NAME -} - -// This function is called from Java with JNI, it's declared in -// base/base_jni/JankMetricUMARecorder_jni.h which is an autogenerated -// header. The actual implementation is in RecordJankMetrics for simpler -// testing. -void JNI_JankMetricUMARecorder_RecordJankMetrics( - JNIEnv* env, - const base::android::JavaParamRef& java_durations_ns, - const base::android::JavaParamRef& java_missed_vsyncs, - jlong java_reporting_interval_start_time, - jlong java_reporting_interval_duration, - jint java_scenario_enum) { - RecordJankMetrics(env, java_durations_ns, java_missed_vsyncs, - java_reporting_interval_start_time, - java_reporting_interval_duration, java_scenario_enum); -} - -void RecordJankMetrics( - JNIEnv* env, - const base::android::JavaParamRef& java_durations_ns, - const base::android::JavaParamRef& java_missed_vsyncs, - jlong java_reporting_interval_start_time, - jlong java_reporting_interval_duration, - jint java_scenario_enum) { - std::vector durations_ns; - JavaLongArrayToInt64Vector(env, java_durations_ns, &durations_ns); - - std::vector missed_vsyncs; - JavaIntArrayToIntVector(env, java_missed_vsyncs, &missed_vsyncs); - - JankScenario scenario = static_cast(java_scenario_enum); - - const char* frame_duration_histogram_name = - GetAndroidFrameTimelineDurationHistogramName(scenario); - const char* janky_frames_per_scenario_histogram_name = - GetAndroidFrameTimelineJankHistogramName(scenario); - - // We don't want to emit per frame metircs for WEBVIEW SCROLLING scenario - // which tracks individual scrolls differentiated by gesture_scroll_id. - // Scroll related per frame metrics are emitted from - // COMBINED_WEBVIEW_SCROLLING scenario to avoid emitting duplicate metrics for - // overlapping scrolls. - const bool emit_per_frame_metrics = - scenario != JankScenario::WEBVIEW_SCROLLING; - - if (emit_per_frame_metrics) { - for (const int64_t frame_duration_ns : durations_ns) { - base::UmaHistogramTimes(frame_duration_histogram_name, - base::Nanoseconds(frame_duration_ns)); - } - } - - int janky_frame_count = 0; - int missed_vsyncs_max = 0; - int missed_vsyncs_sum = 0; - const int num_presented_frames = static_cast(missed_vsyncs.size()); - - for (int curr_frame_missed_vsyncs : missed_vsyncs) { - bool is_janky = curr_frame_missed_vsyncs > 0; - if (curr_frame_missed_vsyncs > missed_vsyncs_max) { - missed_vsyncs_max = curr_frame_missed_vsyncs; - } - missed_vsyncs_sum += curr_frame_missed_vsyncs; - - if (emit_per_frame_metrics) { - base::UmaHistogramEnumeration( - janky_frames_per_scenario_histogram_name, - is_janky ? FrameJankStatus::kJanky : FrameJankStatus::kNonJanky); - } - if (is_janky) { - ++janky_frame_count; - } - } - - if (num_presented_frames > 0) { - EmitMetrics(scenario, janky_frame_count, missed_vsyncs_max, - missed_vsyncs_sum, num_presented_frames, - java_reporting_interval_start_time, - java_reporting_interval_duration); - } -} - -} // namespace base::android diff --git a/naiveproxy/src/base/android/jank_metric_uma_recorder.h b/naiveproxy/src/base/android/jank_metric_uma_recorder.h deleted file mode 100644 index a5bb223188..0000000000 --- a/naiveproxy/src/base/android/jank_metric_uma_recorder.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_ANDROID_JANK_METRIC_UMA_RECORDER_H_ -#define BASE_ANDROID_JANK_METRIC_UMA_RECORDER_H_ - -#include "base/android/jni_android.h" -#include "base/base_export.h" -#include "base/feature_list.h" - -namespace base::android { - -// These values are persisted to logs. Entries should not be renumbered and -// numeric values should never be reused. -enum class FrameJankStatus { - kJanky = 0, - kNonJanky = 1, - kMaxValue = kNonJanky, -}; - -// These values are persisted to logs. Entries should not be renumbered and -// numeric values should never be reused. -enum class JankScenario { - PERIODIC_REPORTING = 1, - OMNIBOX_FOCUS = 2, - NEW_TAB_PAGE = 3, - STARTUP = 4, - TAB_SWITCHER = 5, - OPEN_LINK_IN_NEW_TAB = 6, - START_SURFACE_HOMEPAGE = 7, - START_SURFACE_TAB_SWITCHER = 8, - FEED_SCROLLING = 9, - WEBVIEW_SCROLLING = 10, - COMBINED_WEBVIEW_SCROLLING = 11, - // This value should always be last and is not persisted to logs, exposed only - // for testing. - MAX_VALUE = COMBINED_WEBVIEW_SCROLLING + 1 -}; - -// Resolves the above name to a histogram value. -BASE_EXPORT const char* GetAndroidFrameTimelineJankHistogramName( - JankScenario scenario); -// Resolves the above name to a histogram value. -BASE_EXPORT const char* GetAndroidFrameTimelineDurationHistogramName( - JankScenario scenario); - -BASE_EXPORT void RecordJankMetrics( - JNIEnv* env, - const base::android::JavaParamRef& java_durations_ns, - const base::android::JavaParamRef& java_missed_vsyncs, - jlong java_reporting_interval_start_time, - jlong java_reporting_interval_duration, - jint java_scenario_enum); -} // namespace base::android -#endif // BASE_ANDROID_JANK_METRIC_UMA_RECORDER_H_ diff --git a/naiveproxy/src/base/android/jni_onload.cc b/naiveproxy/src/base/android/jni_onload.cc index 24a7d6893e..a294d07406 100644 --- a/naiveproxy/src/base/android/jni_onload.cc +++ b/naiveproxy/src/base/android/jni_onload.cc @@ -1,8 +1,6 @@ // Copyright 2025 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/android/jni_onload.h" - #include "base/android/jni_android.h" #include "base/android/library_loader/library_loader_hooks.h" diff --git a/naiveproxy/src/base/android/jni_onload.h b/naiveproxy/src/base/android/jni_onload.h deleted file mode 100644 index 2c6d622daf..0000000000 --- a/naiveproxy/src/base/android/jni_onload.h +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2025 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_ANDROID_JNI_ONLOAD_H_ -#define BASE_ANDROID_JNI_ONLOAD_H_ - -#include "base/android/library_loader/library_loader_hooks.h" - -// The JNI_OnLoad in //base cannot depend on any specific process type's init -// function, so we have this hook that we compile different implementations -// for depending on what shared library we are building. -bool NativeInitializationHook(base::android::LibraryProcessType value); - -#endif // BASE_ANDROID_JNI_ONLOAD_H_ diff --git a/naiveproxy/src/base/android/library_loader/library_loader_hooks.cc b/naiveproxy/src/base/android/library_loader/library_loader_hooks.cc index 056278ec97..1622f98768 100644 --- a/naiveproxy/src/base/android/library_loader/library_loader_hooks.cc +++ b/naiveproxy/src/base/android/library_loader/library_loader_hooks.cc @@ -47,9 +47,13 @@ void SetLibraryLoadedHook(LibraryLoadedHook* func) { bool LibraryLoaded(LibraryProcessType library_process_type) { DCHECK_EQ(g_library_process_type, PROCESS_UNINITIALIZED); g_library_process_type = library_process_type; - #if BUILDFLAG(ORDERFILE_INSTRUMENTATION) - orderfile::StartDelayedDump(); + // For WebView renderer process, we want to start the recording later close to + // when the navigation starts. That way we optimize more for the pageload + // time. + if (g_library_process_type != PROCESS_WEBVIEW_CHILD) { + orderfile::StartDelayedDump(); + } #endif if (g_native_initialization_hook && diff --git a/naiveproxy/src/base/android/library_loader/library_loader_hooks.h b/naiveproxy/src/base/android/library_loader/library_loader_hooks.h index a7772c8edc..47dcec4b22 100644 --- a/naiveproxy/src/base/android/library_loader/library_loader_hooks.h +++ b/naiveproxy/src/base/android/library_loader/library_loader_hooks.h @@ -73,4 +73,9 @@ BASE_EXPORT bool LibraryLoaded(LibraryProcessType library_process_type); } // namespace android } // namespace base +// The JNI_OnLoad in //base cannot depend on any specific process type's init +// function, so we have this hook that we compile different implementations +// for depending on what shared library we are building. +bool NativeInitializationHook(base::android::LibraryProcessType value); + #endif // BASE_ANDROID_LIBRARY_LOADER_LIBRARY_LOADER_HOOKS_H_ diff --git a/naiveproxy/src/base/android/library_loader/library_prefetcher.cc b/naiveproxy/src/base/android/library_loader/library_prefetcher.cc index a0a0d379ba..110acadb64 100644 --- a/naiveproxy/src/base/android/library_loader/library_prefetcher.cc +++ b/naiveproxy/src/base/android/library_loader/library_prefetcher.cc @@ -9,19 +9,30 @@ #include "base/android/library_loader/library_prefetcher.h" +#include #include #include +#include +#include +#include #include #include +#include #include "base/android/library_loader/anchor_functions.h" #include "base/android/orderfile/orderfile_buildflags.h" #include "base/bits.h" +#include "base/containers/span.h" +#include "base/feature_list.h" +#include "base/features.h" #include "base/logging.h" +#include "base/memory/page_size.h" #include "base/metrics/histogram_functions.h" #include "base/posix/eintr_wrapper.h" +#include "base/threading/platform_thread.h" #include "base/time/time.h" +#include "base/trace_event/trace_event.h" #include "build/build_config.h" #if BUILDFLAG(ORDERFILE_INSTRUMENTATION) @@ -37,10 +48,11 @@ namespace { #if !BUILDFLAG(ORDERFILE_INSTRUMENTATION) // The binary is aligned to a minimum 16K page size on AArch64 Android, else 4K. +// This might not match base::GetPageSize(), the booted Kernel's page size. #if defined(ARCH_CPU_ARM64) -constexpr size_t kPageSize = 16384; +constexpr size_t kBinaryPageSize = 16384; #else -constexpr size_t kPageSize = 4096; +constexpr size_t kBinaryPageSize = 4096; #endif // Reads a byte per page between |start| and |end| to force it into the page // cache. @@ -58,13 +70,50 @@ void Prefetch(size_t start, size_t end) { unsigned char* start_ptr = reinterpret_cast(start); unsigned char* end_ptr = reinterpret_cast(end); [[maybe_unused]] unsigned char dummy = 0; - for (unsigned char* ptr = start_ptr; ptr < end_ptr; ptr += kPageSize) { + // It's possible that using kBinaryPageSize instead of page_size (or some + // other value) is a bit arbitrary for the read stepping here. In practice, + // disk readahead is greater than either, so probably doesn't matter too much. + for (unsigned char* ptr = start_ptr; ptr < end_ptr; ptr += kBinaryPageSize) { // Volatile is required to prevent the compiler from eliminating this // loop. dummy ^= *static_cast(ptr); } } +// Call madvise from |start| to |end| in chunks of |target_length| (rounded up +// to a whole page). |target_length| can be 0 to madvise the entire range in a +// single call. |start| must already be aligned to a page. +int MadviseRange(size_t start, size_t end, int advice, size_t target_length) { + if (target_length == 0) { + target_length = end - start; + } + target_length = bits::AlignUp(target_length, base::GetPageSize()); + for (size_t current = start; current < end; current += target_length) { + // madvise will round `end - current` up to a page size if required. + size_t length = std::min(target_length, end - current); + if (madvise(reinterpret_cast(current), length, advice) != 0) { + return errno; + } + } + return 0; +} + +struct Section { + static Section CreateAligned(std::string_view name, + size_t start_anchor, + size_t end_anchor) { + return Section{ + .name = name, + .start = start_anchor - start_anchor % kBinaryPageSize, + .end = bits::AlignUp(end_anchor, kBinaryPageSize), + }; + } + + std::string_view name; + size_t start; + size_t end; +}; + // These values were used in the past for recording // "LibraryLoader.PrefetchDetailedStatus". // These values are persisted to logs. Entries should not be renumbered and @@ -75,44 +124,44 @@ enum class PrefetchStatus { kForkFailed = 2, kChildProcessCrashed = 3, kChildProcessKilled = 4, - kMaxValue = kChildProcessKilled + kMadviseFailed = 5, + kMaxValue = kMadviseFailed, }; -PrefetchStatus ForkAndPrefetch() { - if (!IsOrderingSane()) { - LOG(WARNING) << "Incorrect code ordering"; - return PrefetchStatus::kWrongOrdering; +PrefetchStatus PrefetchWithMadvise(base::span sections, + int madvise_advice, + size_t madvise_length) { + TRACE_EVENT("startup", "LibraryPrefetcher::PrefetchWithMadvise"); + for (const auto& section : sections) { + int result = MadviseRange(section.start, section.end, madvise_advice, + madvise_length); + if (result != 0) { + PLOG(WARNING) << "madvise failed for " << section.name << " section"; + return PrefetchStatus::kMadviseFailed; + } } + return PrefetchStatus::kSuccess; +} +PrefetchStatus PrefetchWithFork(base::span sections) { + TRACE_EVENT("startup", "LibraryPrefetcher::PrefetchWithFork"); + base::TimeTicks fork_start_time = base::TimeTicks::Now(); pid_t pid = fork(); if (pid == 0) { // Android defines the background priority to this value since at least 2009 // (see Process.java). constexpr int kBackgroundPriority = 10; setpriority(PRIO_PROCESS, 0, kBackgroundPriority); - - // |kStartOfText| may not be at the beginning of a page, since .plt can be - // before it, yet in the same mapping for instance. - size_t text_start_page = kStartOfText - kStartOfText % kPageSize; - // Set the end to the page on which the beginning of the last symbol is. The - // actual symbol may spill into the next page by a few bytes, but this is - // outside of the executable code range anyway. - size_t text_end_page = bits::AlignUp(kEndOfText, kPageSize); - - size_t ordered_start_page = - kStartOfOrderedText - kStartOfOrderedText % kPageSize; - // kEndOfUnorderedText is not considered ordered, but the byte immediately - // before is considered ordered and so can not be contained in the start - // page. - size_t ordered_end_page = bits::AlignUp(kEndOfOrderedText, kPageSize); - - // Fetch the ordered section first. - Prefetch(ordered_start_page, ordered_end_page); - Prefetch(text_start_page, text_end_page); - + for (const auto& section : sections) { + Prefetch(section.start, section.end); + } // _exit() doesn't call the atexit() handlers. _exit(EXIT_SUCCESS); } else { + base::UmaHistogramCustomMicrosecondsTimes( + "Android.LibraryLoader.Prefetch.ForkDuration", + base::TimeTicks::Now() - fork_start_time, base::Microseconds(1), + base::Seconds(1), 50); if (pid < 0) { return PrefetchStatus::kForkFailed; } @@ -142,19 +191,73 @@ PrefetchStatus ForkAndPrefetch() { return PrefetchStatus::kChildProcessKilled; } } + +PrefetchStatus PrefetchWithForkOrMadvise() { + if (!IsOrderingSane()) { + LOG(WARNING) << "Incorrect code ordering"; + return PrefetchStatus::kWrongOrdering; + } + + const std::array sections{ + // Fetch the ordered section first. + Section::CreateAligned("ordered", kStartOfOrderedText, kEndOfOrderedText), + Section::CreateAligned("text", kStartOfText, kEndOfText), + }; + + if (base::FeatureList::IsEnabled(features::kLibraryPrefetcherMadvise)) { + // MADV_POPULATE_READ was an alternative considered. The differences being: + // - It can be used reliably on the entire range at once. + // - It takes longer than multiple WILLNEEDs of moderate (~64K) length. + // - It grows attributed RSS aggressively. (WILLNEED doesn't.) + // - It is not as widely supported as WILLNEED. + // - (At time of writing) it is not already allowlisted in our seccomp BPF. + constexpr int madvise_advice = MADV_WILLNEED; + + // The man page for madvise(2) expressly supports using madvise(0, 0, ...) + // as a way to probe support, but it still trips -Wnonnull. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnonnull" + bool supported = madvise(nullptr, 0, madvise_advice) == 0; +#pragma clang diagnostic pop + if (!supported) { + // PLOG immediately after check so that nothing overwrites errno. + PLOG(WARNING) << "madvise not supported for library prefetch"; + } + base::UmaHistogramBoolean("Android.LibraryLoader.Prefetch.Madvise", + supported); + + if (supported) { + base::ThreadType old_thread_type = + base::PlatformThread::GetCurrentThreadType(); + base::PlatformThread::SetCurrentThreadType(base::ThreadType::kBackground); + PrefetchStatus status = + PrefetchWithMadvise(sections, madvise_advice, + features::kLibraryPrefetcherMadviseLength.Get()); + base::PlatformThread::SetCurrentThreadType(old_thread_type); + return status; + } + + if (!features::kLibraryPrefetcherMadviseFallback.Get()) { + return PrefetchStatus::kMadviseFailed; + } + LOG(WARNING) << "falling back to fork-based library prefetch"; + } + + return PrefetchWithFork(sections); +} #endif // !BUILDFLAG(ORDERFILE_INSTRUMENTATION) } // namespace // static -void NativeLibraryPrefetcher::ForkAndPrefetchNativeLibrary() { +void NativeLibraryPrefetcher::PrefetchNativeLibrary() { #if BUILDFLAG(ORDERFILE_INSTRUMENTATION) // Avoid forking with orderfile instrumentation because the child process // would create a dump as well. return; #else base::TimeTicks start_time = base::TimeTicks::Now(); - PrefetchStatus status = ForkAndPrefetch(); + PrefetchStatus status = PrefetchWithForkOrMadvise(); base::UmaHistogramMediumTimes("Android.LibraryLoader.Prefetch.Duration", base::TimeTicks::Now() - start_time); base::UmaHistogramEnumeration("Android.LibraryLoader.Prefetch.Status", diff --git a/naiveproxy/src/base/android/library_loader/library_prefetcher.h b/naiveproxy/src/base/android/library_loader/library_prefetcher.h index 4839a09c5d..66f8938516 100644 --- a/naiveproxy/src/base/android/library_loader/library_prefetcher.h +++ b/naiveproxy/src/base/android/library_loader/library_prefetcher.h @@ -16,24 +16,26 @@ namespace base { namespace android { -// Forks and waits for a process prefetching the native library. This is done in -// a forked process for the following reasons: +// Prefetches the native library. This may be done in a forked process for the +// following reasons: // - Isolating the main process from mistakes in getting the address range, only // crashing the forked process in case of mistake. // - Not inflating the memory used by the main process uselessly, which could // increase its likelihood to be killed. // The forked process has background priority and, since it is not declared to // the Android runtime, can be killed at any time, which is not an issue here. +// +// An alternative in-process madvise prefetch can be used if the +// "LibraryPrefetcherMadvise" feature is enabled. class BASE_EXPORT NativeLibraryPrefetcher { public: NativeLibraryPrefetcher() = delete; NativeLibraryPrefetcher(const NativeLibraryPrefetcher&) = delete; NativeLibraryPrefetcher& operator=(const NativeLibraryPrefetcher&) = delete; - // Finds the executable code range, forks a low priority process pre-fetching - // it wait()s for the process to exit or die. It fetches any ordered section - // first. - static void ForkAndPrefetchNativeLibrary(); + // Finds the executable code range and prefetches it. It fetches any ordered + // section first. + static void PrefetchNativeLibrary(); }; } // namespace android diff --git a/naiveproxy/src/base/android/library_loader/library_prefetcher_hooks.cc b/naiveproxy/src/base/android/library_loader/library_prefetcher_hooks.cc index 382e0ad4a5..1406b23747 100644 --- a/naiveproxy/src/base/android/library_loader/library_prefetcher_hooks.cc +++ b/naiveproxy/src/base/android/library_loader/library_prefetcher_hooks.cc @@ -16,7 +16,7 @@ namespace android { static void JNI_LibraryPrefetcher_PrefetchNativeLibraryForWebView(JNIEnv* env) { #if BUILDFLAG(SUPPORTS_CODE_ORDERING) - return NativeLibraryPrefetcher::ForkAndPrefetchNativeLibrary(); + return NativeLibraryPrefetcher::PrefetchNativeLibrary(); #endif } diff --git a/naiveproxy/src/base/android/linker/BUILD.gn b/naiveproxy/src/base/android/linker/BUILD.gn index 91175a3d37..d71954d0c3 100644 --- a/naiveproxy/src/base/android/linker/BUILD.gn +++ b/naiveproxy/src/base/android/linker/BUILD.gn @@ -7,6 +7,13 @@ import("//build/config/sysroot.gni") assert(is_android) +source_set("ashmem") { + sources = [ + "ashmem-dev.c", + "ashmem.h", + ] +} + shared_library("chromium_android_linker") { sources = [ "linker_jni.cc", @@ -20,6 +27,8 @@ shared_library("chromium_android_linker") { "//third_party/jni_zero", ] + public_deps = [ ":ashmem" ] + # Export JNI symbols. configs -= [ "//build/config/android:hide_all_but_jni_onload" ] configs += [ "//build/config/android:hide_all_but_jni" ] diff --git a/naiveproxy/src/third_party/ashmem/ashmem-dev.c b/naiveproxy/src/base/android/linker/ashmem-dev.c similarity index 62% rename from naiveproxy/src/third_party/ashmem/ashmem-dev.c rename to naiveproxy/src/base/android/linker/ashmem-dev.c index 4a3e31f691..272f722b20 100644 --- a/naiveproxy/src/third_party/ashmem/ashmem-dev.c +++ b/naiveproxy/src/base/android/linker/ashmem-dev.c @@ -27,12 +27,15 @@ #include #include #include /* for fdstat() */ +#include #include +#include #include #include #define ASHMEM_DEVICE "/dev/ashmem" +#define LOG_E(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "chromium-ashmem", __VA_ARGS__)) /* Technical note regarding reading system properties. * @@ -75,6 +78,13 @@ static int device_api_level() { return s_api_level; } +static int vendor_api_level() { + static int v_api_level = -1; + if (v_api_level < 0) + v_api_level = system_property_get_int("ro.vendor.api_level"); + return v_api_level; +} + typedef enum { ASHMEM_STATUS_INIT, ASHMEM_STATUS_NOT_SUPPORTED, @@ -107,7 +117,7 @@ static AshmemStatus ashmem_get_status(void) { /* Returns true iff the ashmem device ioctl should be used for a given fd. * NOTE: Try not to use fstat() when possible to avoid performance issues. */ -static int ashmem_dev_fd_check(int fd) { +static int is_ashmem_fd(int fd) { if (device_api_level() <= __ANDROID_API_O_MR1__) return 1; if (ashmem_get_status() == ASHMEM_STATUS_SUPPORTED) { @@ -118,41 +128,6 @@ static int ashmem_dev_fd_check(int fd) { return 0; } -/* - * ashmem_create_region - creates a new ashmem region and returns the file - * descriptor, or <0 on error - * - * `name' is an optional label to give the region (visible in /proc/pid/maps) - * `size' is the size of the region, in page-aligned bytes - */ -static int ashmem_dev_create_region(const char *name, size_t size) { - int fd = open(ASHMEM_DEVICE, O_RDWR); - if (fd < 0) - return fd; - - int ret; - if (name) { - char buf[ASHMEM_NAME_LEN]; - strlcpy(buf, name, sizeof(buf)); - ret = ioctl(fd, ASHMEM_SET_NAME, buf); - if (ret < 0) - goto error; - } - ret = ioctl(fd, ASHMEM_SET_SIZE, size); - if (ret < 0) - goto error; - - return fd; - -error: - close(fd); - return ret; -} - -static int ashmem_dev_set_prot_region(int fd, int prot) { - return ioctl(fd, ASHMEM_SET_PROT_MASK, prot); -} - static int ashmem_dev_get_prot_region(int fd) { return ioctl(fd, ASHMEM_GET_PROT_MASK); } @@ -172,36 +147,113 @@ static size_t ashmem_dev_get_size_region(int fd) { } // Starting with API level 26, the following functions from -// libandroid.so should be used to create shared memory regions. +// libandroid.so should be used to create shared memory regions, +// unless the device's vendor.api_level is 202604 (Android 17) +// or newer, in which case, use memfd directly instead of +// the ASharedMemory API. typedef int(*ASharedMemory_createFunc)(const char*, size_t); -typedef size_t(*ASharedMemory_getSizeFunc)(int fd); +// ASharedMemory_setProtFunc() is typically invoked in conjunction with ASharedMemory_createFunc(), +// so it's okay for setProt to implicitly assume the type of fd it needs to work with. typedef int(*ASharedMemory_setProtFunc)(int fd, int prot); // Function pointers to shared memory functions. typedef struct { ASharedMemory_createFunc create; - ASharedMemory_getSizeFunc getSize; ASharedMemory_setProtFunc setProt; } ASharedMemoryFuncs; static ASharedMemoryFuncs s_ashmem_funcs = {}; static pthread_once_t s_ashmem_funcs_once = PTHREAD_ONCE_INIT; +static int memfd_create_region(const char *name, size_t size) { + int fd = syscall(__NR_memfd_create, name, MFD_CLOEXEC | MFD_ALLOW_SEALING); + if (fd < 0) { + LOG_E("memfd_create(%s, %zd) failed: %m", name, size); + return fd; + } + + int ret = ftruncate(fd, size); + if (ret < 0) { + LOG_E("ftruncate(%s, %zd) failed: %m", name, size); + goto error; + } + + ret = fcntl(fd, F_ADD_SEALS, F_SEAL_GROW | F_SEAL_SHRINK); + if (ret < 0) { + LOG_E("memfd_create(%s, %zd) fcntl(F_ADD_SEALS) failed: %m", name, size); + goto error; + } + + return fd; + +error: + close(fd); + return ret; +} + +static int memfd_set_prot_region(int fd, int prot) { + int seals = fcntl(fd, F_GET_SEALS); + if (seals == -1) { + LOG_E("memfd_set_prot_region(%d, %d): F_GET_SEALS failed: %m", fd, prot); + return -1; + } + + if (prot & PROT_WRITE) { + /* + * Now we want the buffer to be read-write, let's check if the buffer + * has been previously marked as read-only before, if so return error + */ + if (seals & F_SEAL_FUTURE_WRITE) { + LOG_E("memfd_set_prot_region(%d, %d): region is write protected", fd, prot); + // Inline with ashmem error code, if already in read-only mode. + errno = EINVAL; + return -1; + } + + return 0; + } + + // We would only allow read-only for any future file operations + if (fcntl(fd, F_ADD_SEALS, F_SEAL_FUTURE_WRITE) == -1) { + LOG_E("memfd_set_prot_region(%d, %d): F_SEAL_FUTURE_WRITE seal failed: %m", fd, prot); + return -1; + } + + return 0; +} + +static int memfd_get_prot_region(int fd) { + int prot = PROT_READ; + int seals = fcntl(fd, F_GET_SEALS); + if (seals == -1) + LOG_E("memfd_get_prot_region(%d): F_GET_SEALS failed: %m", fd); + else if (!(seals & (F_SEAL_FUTURE_WRITE | F_SEAL_WRITE))) + prot |= PROT_WRITE; + return prot; +} + static void ashmem_init_funcs() { ASharedMemoryFuncs* funcs = &s_ashmem_funcs; - if (device_api_level() >= __ANDROID_API_O__) { + /* + * When a device conforms to the VSR for API level 202604 (Android 17), + * ASharedMemory will allocate memfds and attempt to relabel them by using + * fsetxattr() to workaround how SELinux handles memfds. + * + * fsetxattr() is not allowlisted in our seccomp filter, and allowlisting + * it may be unsafe. Since memfds from Chromium should be accessible with + * the existing sepolicy for appdomain_tmpfs files, just allocate memfds + * directly if the device conforms to the VSR for API level 202604. + */ + if (vendor_api_level() >= 202604) { + funcs->create = &memfd_create_region; + funcs->setProt = &memfd_set_prot_region; + } else { /* Leaked intentionally! */ void* lib = dlopen("libandroid.so", RTLD_NOW); funcs->create = (ASharedMemory_createFunc)dlsym(lib, "ASharedMemory_create"); - funcs->getSize = - (ASharedMemory_getSizeFunc)dlsym(lib, "ASharedMemory_getSize"); funcs->setProt = (ASharedMemory_setProtFunc)dlsym(lib, "ASharedMemory_setProt"); - } else { - funcs->create = &ashmem_dev_create_region; - funcs->getSize = &ashmem_dev_get_size_region; - funcs->setProt = &ashmem_dev_set_prot_region; } } @@ -218,32 +270,30 @@ int ashmem_set_prot_region(int fd, int prot) { return ashmem_get_funcs()->setProt(fd, prot); } +static bool is_memfd_fd(int fd) { + if (fcntl(fd, F_GET_SEALS, 0) == -1) + return false; + return true; +} + int ashmem_get_prot_region(int fd) { - if (ashmem_dev_fd_check(fd)) + if (is_memfd_fd(fd)) + return memfd_get_prot_region(fd); + + if (is_ashmem_fd(fd)) return ashmem_dev_get_prot_region(fd); - /* There are only two practical values to return here: either - * PROT_READ|PROT_WRITE or just PROT_READ, so try to determine - * the flags by trying to mmap() the region read-write first. - */ - int result = PROT_READ; - const size_t page_size = (size_t)sysconf(_SC_PAGESIZE); - void* m = mmap(NULL, page_size, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, 0); - if (m != MAP_FAILED) { - munmap(m, page_size); - result = PROT_READ|PROT_WRITE; - } - return result; + + return -1; } int ashmem_pin_region(int fd, size_t offset, size_t len) { - if (ashmem_dev_fd_check(fd)) + if (is_ashmem_fd(fd)) return ashmem_dev_pin_region(fd, offset, len); return ASHMEM_NOT_PURGED; } int ashmem_unpin_region(int fd, size_t offset, size_t len) { - if (ashmem_dev_fd_check(fd)) + if (is_ashmem_fd(fd)) return ashmem_dev_unpin_region(fd, offset, len); /* NOTE: It is not possible to use madvise() here because it requires a * memory address. This could be done in the caller though, instead of @@ -252,8 +302,16 @@ int ashmem_unpin_region(int fd, size_t offset, size_t len) { } int ashmem_get_size_region(int fd) { - /* NOTE: Original API returns an int. Avoid breaking it. */ - return (int)ashmem_get_funcs()->getSize(fd); + if (is_ashmem_fd(fd)) + return ashmem_dev_get_size_region(fd); + + struct stat sb; + if (fstat(fd, &sb) == -1) { + LOG_E("fstat(%d) failed: %m", fd); + return -1; + } + + return sb.st_size; } int ashmem_device_is_supported(void) { diff --git a/naiveproxy/src/third_party/ashmem/ashmem.h b/naiveproxy/src/base/android/linker/ashmem.h similarity index 90% rename from naiveproxy/src/third_party/ashmem/ashmem.h rename to naiveproxy/src/base/android/linker/ashmem.h index f3675c98b1..1ac04f39aa 100644 --- a/naiveproxy/src/third_party/ashmem/ashmem.h +++ b/naiveproxy/src/base/android/linker/ashmem.h @@ -1,4 +1,4 @@ -/* third_party/ashmem/ashmem.h +/* base/android/linker/ashmem.h ** ** Copyright 2008 The Android Open Source Project ** @@ -7,8 +7,8 @@ ** General Public License. */ -#ifndef _THIRD_PARTY_ASHMEM_H -#define _THIRD_PARTY_ASHMEM_H +#ifndef BASE_ANDROID_LINKER_ASHMEM_H_ +#define BASE_ANDROID_LINKER_ASHMEM_H_ #include @@ -51,4 +51,4 @@ int ashmem_get_size_region(int fd); #endif /* ! __ASHMEMIOC */ -#endif /* _THIRD_PARTY_ASHMEM_H */ +#endif /* BASE_ANDROID_LINKER_ASHMEM_H_ */ diff --git a/naiveproxy/src/base/android/linker/linker_jni.cc b/naiveproxy/src/base/android/linker/linker_jni.cc index 03c0c07d8b..a31dc2ceab 100644 --- a/naiveproxy/src/base/android/linker/linker_jni.cc +++ b/naiveproxy/src/base/android/linker/linker_jni.cc @@ -18,10 +18,17 @@ #include #include #include +#include #include #include +#include +#include + +#define LOG_E(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "linker-jni", __VA_ARGS__)) + +#include "base/android/linker/ashmem.h" // Must come after all headers that specialize FromJniType() / ToJniType(). #include "base/android/linker/linker_jni.h" @@ -237,7 +244,6 @@ bool CallJniOnLoad(void* handle) { LOG_INFO("Done"); return true; } - } // namespace String::String(JNIEnv* env, jstring str) { @@ -326,48 +332,6 @@ bool FindWebViewReservation(uintptr_t* out_address, size_t* out_size) { return result; } -// Starting with API level 26 (Android O) the following functions from -// libandroid.so should be used to create shared memory regions to ensure -// compatibility with the future versions: -// * ASharedMemory_create() -// * ASharedMemory_setProt() -// -// This is inspired by //third_party/ashmem/ashmem-dev.c, which cannot be -// referenced from the linker library to avoid increasing binary size. -// -// *Not* threadsafe. -struct SharedMemoryFunctions { - SharedMemoryFunctions() { - library_handle = dlopen("libandroid.so", RTLD_NOW); - create = reinterpret_cast( - dlsym(library_handle, "ASharedMemory_create")); - set_protection = reinterpret_cast( - dlsym(library_handle, "ASharedMemory_setProt")); - } - - bool IsWorking() const { - if (!create || !set_protection) { - LOG_ERROR("Cannot get the shared memory functions from libandroid"); - return false; - } - return true; - } - - ~SharedMemoryFunctions() { - if (library_handle) { - dlclose(library_handle); - } - } - - typedef int (*CreateFunction)(const char*, size_t); - typedef int (*SetProtectionFunction)(int fd, int prot); - - CreateFunction create; - SetProtectionFunction set_protection; - - void* library_handle = nullptr; -}; - void NativeLibInfo::ExportLoadInfoToJava() const { if (!env_) { return; @@ -517,8 +481,7 @@ bool NativeLibInfo::LoadWithDlopenExt(const String& path, void** handle) { return true; } -bool NativeLibInfo::CreateSharedRelroFd( - const SharedMemoryFunctions& functions) { +bool NativeLibInfo::CreateSharedRelroFd() { LOG_INFO("Entering"); if (!relro_start_ || !relro_size_) { LOG_ERROR("RELRO region is not populated"); @@ -526,13 +489,13 @@ bool NativeLibInfo::CreateSharedRelroFd( } // Create a writable shared memory region. - int shared_mem_fd = functions.create("cr_relro", relro_size_); + int shared_mem_fd = ashmem_create_region("cr_relro", relro_size_); if (shared_mem_fd == -1) { LOG_ERROR("Cannot create the shared memory file"); return false; } int rw_flags = PROT_READ | PROT_WRITE; - functions.set_protection(shared_mem_fd, rw_flags); + ashmem_set_prot_region(shared_mem_fd, rw_flags); // Map the region as writable. void* relro_copy_addr = @@ -556,7 +519,7 @@ bool NativeLibInfo::CreateSharedRelroFd( // writable memory mappings, since they are not directly affected by the // change of region's protection flags. munmap(relro_copy_addr, relro_size_); - if (functions.set_protection(shared_mem_fd, PROT_READ) == -1) { + if (ashmem_set_prot_region(shared_mem_fd, PROT_READ) == -1) { LOG_ERROR("Failed to set the RELRO FD as read-only."); close(shared_mem_fd); return false; @@ -566,8 +529,7 @@ bool NativeLibInfo::CreateSharedRelroFd( return true; } -bool NativeLibInfo::ReplaceRelroWithSharedOne( - const SharedMemoryFunctions& functions) const { +bool NativeLibInfo::ReplaceRelroWithSharedOne() const { LOG_INFO("Entering"); if (relro_fd_ == -1 || !relro_start_ || !relro_size_) { LOG_ERROR("Replacement RELRO not ready"); @@ -626,15 +588,11 @@ bool NativeLibInfo::LoadLibrary(const String& library_path, // Spawn RELRO to a shared memory region by copying and remapping on top of // itself. - SharedMemoryFunctions functions; - if (!functions.IsWorking()) { - return false; - } - if (!CreateSharedRelroFd(functions)) { + if (!CreateSharedRelroFd()) { LOG_ERROR("Failed to create shared RELRO"); return false; } - if (!ReplaceRelroWithSharedOne(functions)) { + if (!ReplaceRelroWithSharedOne()) { LOG_ERROR("Failed to convert RELRO to shared memory"); CloseRelroFd(); return false; @@ -649,8 +607,7 @@ bool NativeLibInfo::LoadLibrary(const String& library_path, } bool NativeLibInfo::RelroIsIdentical( - const NativeLibInfo& other_lib_info, - const SharedMemoryFunctions& functions) const { + const NativeLibInfo& other_lib_info) const { // Abandon sharing if contents of the incoming RELRO region does not match the // current one. This can be useful for debugging, but should never happen in // the field. @@ -699,12 +656,7 @@ bool NativeLibInfo::CompareRelroAndReplaceItBy( return false; } - SharedMemoryFunctions functions; - if (!functions.IsWorking()) { - s_relro_sharing_status = RelroSharingStatus::NO_SHMEM_FUNCTIONS; - return false; - } - if (!RelroIsIdentical(other_lib_info, functions)) { + if (!RelroIsIdentical(other_lib_info)) { LOG_ERROR("RELRO is not identical"); s_relro_sharing_status = RelroSharingStatus::NOT_IDENTICAL; return false; @@ -718,7 +670,7 @@ bool NativeLibInfo::CompareRelroAndReplaceItBy( // * It does not rely on disallowing mprotect(PROT_WRITE) // * This way |ReplaceRelroWithSharedOne()| is reused across spawning RELRO // and receiving it - if (!other_lib_info.ReplaceRelroWithSharedOne(functions)) { + if (!other_lib_info.ReplaceRelroWithSharedOne()) { LOG_ERROR("Failed to use relro_fd"); s_relro_sharing_status = RelroSharingStatus::REMAP_FAILED; return false; @@ -731,17 +683,7 @@ bool NativeLibInfo::CompareRelroAndReplaceItBy( bool NativeLibInfo::CreateSharedRelroFdForTesting() { // The library providing these functions will be dlclose()-ed after returning // from this context. The extra overhead of dlopen() is OK for testing. - SharedMemoryFunctions functions; - if (!functions.IsWorking()) { - abort(); - } - return CreateSharedRelroFd(functions); -} - -// static -bool NativeLibInfo::SharedMemoryFunctionsSupportedForTesting() { - SharedMemoryFunctions functions; - return functions.IsWorking(); + return CreateSharedRelroFd(); } JNI_ZERO_BOUNDARY_EXPORT void diff --git a/naiveproxy/src/base/android/linker/linker_jni.h b/naiveproxy/src/base/android/linker/linker_jni.h index ed04e663e5..1cc10a2a19 100644 --- a/naiveproxy/src/base/android/linker/linker_jni.h +++ b/naiveproxy/src/base/android/linker/linker_jni.h @@ -239,8 +239,6 @@ enum class RelroSharingStatus { COUNT = 9, }; -struct SharedMemoryFunctions; - // Holds address ranges of the loaded native library, its RELRO region, along // with the RELRO FD identifying the shared memory region. Carries the same // members as the Java-side LibInfo (without mLibFilePath), allowing to @@ -312,8 +310,6 @@ class NativeLibInfo { size_t get_relro_start_for_testing() const { return relro_start_; } size_t get_load_size_for_testing() const { return load_size_; } - static bool SharedMemoryFunctionsSupportedForTesting(); - bool FindRelroAndLibraryRangesInElfForTesting() { return FindRelroAndLibraryRangesInElf(); } @@ -346,16 +342,15 @@ class NativeLibInfo { // Initializes |relro_fd_| with a newly created read-only shared memory region // sized as the library's RELRO and with identical data. - bool CreateSharedRelroFd(const SharedMemoryFunctions& functions); + bool CreateSharedRelroFd(); // Assuming that RELRO-related information is populated, memory-maps the RELRO // FD on top of the library's RELRO. - bool ReplaceRelroWithSharedOne(const SharedMemoryFunctions& functions) const; + bool ReplaceRelroWithSharedOne() const; // Returns true iff the RELRO address and size, along with the contents are // equal among the two. - bool RelroIsIdentical(const NativeLibInfo& external_lib_info, - const SharedMemoryFunctions& functions) const; + bool RelroIsIdentical(const NativeLibInfo& external_lib_info) const; static constexpr int kInvalidFd = -1; uintptr_t load_address_ = 0; diff --git a/naiveproxy/src/base/android/memory_pressure_listener_android.cc b/naiveproxy/src/base/android/memory_pressure_listener_android.cc index 098c93dc0a..1a968705d4 100644 --- a/naiveproxy/src/base/android/memory_pressure_listener_android.cc +++ b/naiveproxy/src/base/android/memory_pressure_listener_android.cc @@ -5,7 +5,10 @@ #include "base/android/memory_pressure_listener_android.h" #include "base/android/pre_freeze_background_memory_trimmer.h" +#include "base/functional/bind.h" +#include "base/location.h" #include "base/memory/memory_pressure_listener.h" +#include "base/task/single_thread_task_runner.h" // Must come after all headers that specialize FromJniType() / ToJniType(). #include "base/memory_jni/MemoryPressureListener_jni.h" @@ -16,9 +19,18 @@ using base::android::JavaParamRef; static void JNI_MemoryPressureListener_OnMemoryPressure( JNIEnv* env, jint memory_pressure_level) { - base::MemoryPressureListener::NotifyMemoryPressure( - static_cast( - memory_pressure_level)); + // Sometimes, early in the process's lifetime, the main thread task runner is + // not set yet. + if (!base::SingleThreadTaskRunner::HasMainThreadDefault()) { + return; + } + + // Forward the notification to the registry of MemoryPressureListeners. + base::SingleThreadTaskRunner::GetMainThreadDefault()->PostTask( + FROM_HERE, + base::BindOnce( + &base::MemoryPressureListener::NotifyMemoryPressure, + static_cast(memory_pressure_level))); } static void JNI_MemoryPressureListener_OnPreFreeze(JNIEnv* env) { diff --git a/naiveproxy/src/base/android/memory_purge_manager_android.cc b/naiveproxy/src/base/android/memory_purge_manager_android.cc index 7d98a12b38..f9eb02ef0f 100644 --- a/naiveproxy/src/base/android/memory_purge_manager_android.cc +++ b/naiveproxy/src/base/android/memory_purge_manager_android.cc @@ -4,7 +4,6 @@ #include "base/android/memory_purge_manager_android.h" -#include "base/android/build_info.h" #include "base/android/pre_freeze_background_memory_trimmer.h" #include "base/functional/bind.h" #include "third_party/jni_zero/jni_zero.h" diff --git a/naiveproxy/src/base/android/pmf_utils.cc b/naiveproxy/src/base/android/pmf_utils.cc index 6858ea329f..b63f62fcdb 100644 --- a/naiveproxy/src/base/android/pmf_utils.cc +++ b/naiveproxy/src/base/android/pmf_utils.cc @@ -14,7 +14,7 @@ namespace base::android { namespace { -std::optional CalculateProcessMemoryFootprint( +std::optional CalculateProcessMemoryFootprint( base::File& statm_file, base::File& status_file) { // Get total resident and shared sizes from statm file. @@ -22,13 +22,13 @@ std::optional CalculateProcessMemoryFootprint( uint64_t resident_pages = 0; uint64_t shared_pages = 0; uint64_t vm_size_pages = 0; - uint64_t swap_footprint = 0; + uint64_t swap_footprint_kb = 0; constexpr uint32_t kMaxLineSize = 4096; char line[kMaxLineSize]; int n = UNSAFE_TODO(statm_file.ReadAtCurrentPos(line, sizeof(line) - 1)); if (n <= 0) { - return std::optional(); + return std::optional(); } UNSAFE_TODO(line[n]) = '\0'; @@ -36,40 +36,41 @@ std::optional CalculateProcessMemoryFootprint( UNSAFE_TODO(sscanf(line, "%" SCNu64 " %" SCNu64 " %" SCNu64, &vm_size_pages, &resident_pages, &shared_pages)); if (num_scanned != 3) { - return std::optional(); + return std::optional(); } // Get swap size from status file. The format is: VmSwap : 10 kB. n = UNSAFE_TODO(status_file.ReadAtCurrentPos(line, sizeof(line) - 1)); if (n <= 0) { - return std::optional(); + return std::optional(); } UNSAFE_TODO(line[n]) = '\0'; char* swap_line = UNSAFE_TODO(strstr(line, "VmSwap")); if (!swap_line) { - return std::optional(); + return std::optional(); } - num_scanned = - UNSAFE_TODO(sscanf(swap_line, "VmSwap: %" SCNu64 " kB", &swap_footprint)); + num_scanned = UNSAFE_TODO( + sscanf(swap_line, "VmSwap: %" SCNu64 " kB", &swap_footprint_kb)); if (num_scanned != 1) { - return std::optional(); + return std::optional(); } - swap_footprint *= 1024; - return (resident_pages - shared_pages) * page_size + swap_footprint; + return ByteCount::FromUnsigned((resident_pages - shared_pages) * page_size) + + KiB(swap_footprint_kb); } } // namespace // static -std::optional PmfUtils::CalculatePrivateMemoryFootprintForTesting( +std::optional PmfUtils::CalculatePrivateMemoryFootprintForTesting( base::File& statm_file, base::File& status_file) { return CalculateProcessMemoryFootprint(statm_file, status_file); } // static -std::optional PmfUtils::GetPrivateMemoryFootprintForCurrentProcess() { +std::optional +PmfUtils::GetPrivateMemoryFootprintForCurrentProcess() { // ScopedAllowBlocking is required to use base::File, but /proc/{pid}/status // and /proc/{pid}/statm are not regular files. For example, regarding linux, // proc_pid_statm() defined in fs/proc/array.c is invoked when reading @@ -86,7 +87,7 @@ std::optional PmfUtils::GetPrivateMemoryFootprintForCurrentProcess() { proc_self_dir.Append("statm"), base::File::Flags::FLAG_OPEN | base::File::Flags::FLAG_READ); if (!status_file.IsValid() || !statm_file.IsValid()) { - return std::optional(); + return std::optional(); } return CalculateProcessMemoryFootprint(statm_file, status_file); diff --git a/naiveproxy/src/base/android/pmf_utils.h b/naiveproxy/src/base/android/pmf_utils.h index 17b99d03b2..19c5ac17be 100644 --- a/naiveproxy/src/base/android/pmf_utils.h +++ b/naiveproxy/src/base/android/pmf_utils.h @@ -5,6 +5,7 @@ #ifndef BASE_ANDROID_PMF_UTILS_H_ #define BASE_ANDROID_PMF_UTILS_H_ +#include "base/byte_count.h" #include "base/files/file.h" #include "base/gtest_prod_util.h" #include "base/process/process.h" @@ -13,11 +14,11 @@ namespace base::android { class BASE_EXPORT PmfUtils { public: - static std::optional GetPrivateMemoryFootprintForCurrentProcess(); + static std::optional GetPrivateMemoryFootprintForCurrentProcess(); private: FRIEND_TEST_ALL_PREFIXES(PmfUtilsTest, CalculatePrivateMemoryFootprint); - static std::optional CalculatePrivateMemoryFootprintForTesting( + static std::optional CalculatePrivateMemoryFootprintForTesting( base::File& statm_file, base::File& status_file); }; diff --git a/naiveproxy/src/base/android/pre_freeze_background_memory_trimmer.cc b/naiveproxy/src/base/android/pre_freeze_background_memory_trimmer.cc index fa8c4ee3d4..55d0149ab7 100644 --- a/naiveproxy/src/base/android/pre_freeze_background_memory_trimmer.cc +++ b/naiveproxy/src/base/android/pre_freeze_background_memory_trimmer.cc @@ -10,7 +10,7 @@ #include #include -#include "base/android/build_info.h" +#include "base/android/android_info.h" #include "base/android/pmf_utils.h" #include "base/android/self_compaction_manager.h" #include "base/cancelable_callback.h" @@ -47,10 +47,6 @@ enum class MetricsFailure { // to finish running BEFORE collecting metrics. constexpr base::TimeDelta kDelayForMetrics = base::Seconds(2); -uint64_t BytesToMiB(uint64_t v) { - return v / 1024 / 1024; -} - const char* GetProcessType() { CHECK(base::CommandLine::InitializedForCurrentProcess()); const std::string type = @@ -75,7 +71,7 @@ class PrivateMemoryFootprintMetric PrivateMemoryFootprintMetric() : PreFreezeBackgroundMemoryTrimmer::PreFreezeMetric( "PrivateMemoryFootprint") {} - std::optional Measure() const override { + std::optional Measure() const override { return PmfUtils::GetPrivateMemoryFootprintForCurrentProcess(); } @@ -90,35 +86,35 @@ class PrivateMemoryFootprintMetric bool PrivateMemoryFootprintMetric::did_register_ = false; -void MaybeRecordPreFreezeMetric(std::optional value_bytes, +void MaybeRecordPreFreezeMetric(std::optional value, std::string_view metric_name, std::string_view suffix) { // Skip recording the metric if we failed to get the PMF. - if (!value_bytes.has_value()) { + if (!value.has_value()) { return; } UmaHistogramMemoryMB(GetPreFreezeMetricName(metric_name, suffix), - static_cast(BytesToMiB(value_bytes.value()))); + value.value()); } -std::optional Diff(std::optional before, - std::optional after) { +std::optional Diff(std::optional before, + std::optional after) { if (!before.has_value() || !before.has_value()) { return std::nullopt; } - const uint64_t before_value = before.value(); - const uint64_t after_value = after.value(); + const ByteCount before_value = before.value(); + const ByteCount after_value = after.value(); - return after_value < before_value ? before_value - after_value : 0; + return after_value < before_value ? before_value - after_value : ByteCount(0); } } // namespace PreFreezeBackgroundMemoryTrimmer::PreFreezeBackgroundMemoryTrimmer() - : supports_modern_trim_(BuildInfo::GetInstance()->sdk_int() >= - SDK_VERSION_U) {} + : supports_modern_trim_(base::android::android_info::sdk_int() >= + base::android::android_info::SDK_VERSION_U) {} // static PreFreezeBackgroundMemoryTrimmer& PreFreezeBackgroundMemoryTrimmer::Instance() { @@ -141,9 +137,9 @@ void PreFreezeBackgroundMemoryTrimmer::RecordMetrics() { for (size_t i = 0; i < metrics_.size(); i++) { const auto metric = metrics_[i]; - const std::optional value_before = values_before_[i]; + const std::optional value_before = values_before_[i]; - std::optional value_after = metric->Measure(); + std::optional value_after = metric->Measure(); if (!value_after) { UmaHistogramEnumeration("Memory.PreFreeze2.RecordMetricsFailureType", diff --git a/naiveproxy/src/base/android/pre_freeze_background_memory_trimmer.h b/naiveproxy/src/base/android/pre_freeze_background_memory_trimmer.h index 73cf312889..09f176a0e2 100644 --- a/naiveproxy/src/base/android/pre_freeze_background_memory_trimmer.h +++ b/naiveproxy/src/base/android/pre_freeze_background_memory_trimmer.h @@ -7,12 +7,14 @@ #include +#include "base/byte_count.h" #include "base/compiler_specific.h" #include "base/feature_list.h" #include "base/functional/callback.h" #include "base/memory/post_delayed_memory_reduction_task.h" #include "base/no_destructor.h" #include "base/profiler/sample_metadata.h" +#include "base/sequence_checker.h" #include "base/task/delayed_task_handle.h" #include "base/task/sequenced_task_runner.h" #include "base/timer/timer.h" @@ -71,7 +73,7 @@ class BASE_EXPORT PreFreezeBackgroundMemoryTrimmer { // unable to record the metric for any reason. It is called underneath a // lock, so it should be fast enough to avoid delays (the same lock is held // when unregistering metrics). - virtual std::optional Measure() const = 0; + virtual std::optional Measure() const = 0; const std::string& name() const LIFETIME_BOUND { return name_; } @@ -231,7 +233,7 @@ class BASE_EXPORT PreFreezeBackgroundMemoryTrimmer { // metric before any tasks are run are saved here. The "i"th entry corresponds // to the "i"th entry in |metrics_|. When there is no pending metrics task, // |values_before_| should be empty. - std::vector> values_before_ GUARDED_BY(lock()); + std::vector> values_before_ GUARDED_BY(lock()); bool supports_modern_trim_; }; diff --git a/naiveproxy/src/base/android/scoped_hardware_buffer_handle.cc b/naiveproxy/src/base/android/scoped_hardware_buffer_handle.cc index a78daa1c8e..b93c9a5d91 100644 --- a/naiveproxy/src/base/android/scoped_hardware_buffer_handle.cc +++ b/naiveproxy/src/base/android/scoped_hardware_buffer_handle.cc @@ -4,7 +4,8 @@ #include "base/android/scoped_hardware_buffer_handle.h" -#include "base/android/android_hardware_buffer_compat.h" +#include + #include "base/logging.h" #include "base/posix/unix_domain_socket.h" @@ -31,7 +32,7 @@ ScopedHardwareBufferHandle ScopedHardwareBufferHandle::Adopt( // static ScopedHardwareBufferHandle ScopedHardwareBufferHandle::Create( AHardwareBuffer* buffer) { - AndroidHardwareBufferCompat::GetInstance().Acquire(buffer); + AHardwareBuffer_acquire(buffer); return ScopedHardwareBufferHandle(buffer); } @@ -52,7 +53,7 @@ AHardwareBuffer* ScopedHardwareBufferHandle::get() const { void ScopedHardwareBufferHandle::reset() { if (buffer_) { - AndroidHardwareBufferCompat::GetInstance().Release(buffer_); + AHardwareBuffer_release(buffer_); buffer_ = nullptr; } } @@ -65,7 +66,7 @@ AHardwareBuffer* ScopedHardwareBufferHandle::Take() { ScopedHardwareBufferHandle ScopedHardwareBufferHandle::Clone() const { DCHECK(buffer_); - AndroidHardwareBufferCompat::GetInstance().Acquire(buffer_); + AHardwareBuffer_acquire(buffer_); return ScopedHardwareBufferHandle(buffer_); } @@ -81,9 +82,7 @@ ScopedFD ScopedHardwareBufferHandle::SerializeAsFileDescriptor() const { // NOTE: SendHandleToUnixSocket does NOT acquire or retain a reference to the // buffer object. The caller is therefore responsible for ensuring that the // buffer remains alive through the lifetime of this file descriptor. - int result = - AndroidHardwareBufferCompat::GetInstance().SendHandleToUnixSocket( - buffer_, writer.get()); + int result = AHardwareBuffer_sendHandleToUnixSocket(buffer_, writer.get()); if (result < 0) { PLOG(ERROR) << "send"; return ScopedFD(); @@ -96,14 +95,11 @@ ScopedFD ScopedHardwareBufferHandle::SerializeAsFileDescriptor() const { ScopedHardwareBufferHandle ScopedHardwareBufferHandle::DeserializeFromFileDescriptor(ScopedFD fd) { DCHECK(fd.is_valid()); - DCHECK(AndroidHardwareBufferCompat::IsSupportAvailable()); AHardwareBuffer* buffer = nullptr; // NOTE: Upon success, RecvHandleFromUnixSocket acquires a new reference to // the AHardwareBuffer. - int result = - AndroidHardwareBufferCompat::GetInstance().RecvHandleFromUnixSocket( - fd.get(), &buffer); + int result = AHardwareBuffer_recvHandleFromUnixSocket(fd.get(), &buffer); if (result < 0) { PLOG(ERROR) << "recv"; return ScopedHardwareBufferHandle(); @@ -114,7 +110,6 @@ ScopedHardwareBufferHandle::DeserializeFromFileDescriptor(ScopedFD fd) { ScopedHardwareBufferHandle::ScopedHardwareBufferHandle(AHardwareBuffer* buffer) : buffer_(buffer) { - DCHECK(AndroidHardwareBufferCompat::IsSupportAvailable()); } } // namespace android diff --git a/naiveproxy/src/base/android/scoped_input_event.cc b/naiveproxy/src/base/android/scoped_input_event.cc index 74d7a144aa..7933ac62b3 100644 --- a/naiveproxy/src/base/android/scoped_input_event.cc +++ b/naiveproxy/src/base/android/scoped_input_event.cc @@ -4,7 +4,7 @@ #include "base/android/scoped_input_event.h" -#include "base/android/build_info.h" +#include "base/android/android_info.h" #include "base/check.h" #include "base/notreached.h" @@ -16,8 +16,7 @@ namespace base::android { #endif ScopedInputEvent::ScopedInputEvent(const AInputEvent* event) { - CHECK(base::android::BuildInfo::GetInstance()->sdk_int() >= - SCOPED_INPUT_EVENT_MIN_API); + CHECK(base::android::android_info::sdk_int() >= SCOPED_INPUT_EVENT_MIN_API); CHECK(event); a_input_event_ = event; } diff --git a/naiveproxy/src/base/android/scoped_service_binding_batch.cc b/naiveproxy/src/base/android/scoped_service_binding_batch.cc new file mode 100644 index 0000000000..170d830060 --- /dev/null +++ b/naiveproxy/src/base/android/scoped_service_binding_batch.cc @@ -0,0 +1,31 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/android/scoped_service_binding_batch.h" + +#include "base/android/jni_android.h" +#include "base/process_launcher_jni/ScopedServiceBindingBatch_jni.h" + +namespace base::android { + +ScopedServiceBindingBatch::ScopedServiceBindingBatch() { + JNIEnv* env = base::android::AttachCurrentThread(); + // The Java method can return null if the feature is not activated. + base::android::ScopedJavaLocalRef java_scoped_batch_update = + Java_ScopedServiceBindingBatch_scoped(env); + if (java_scoped_batch_update) { + java_object_.Reset(java_scoped_batch_update); + } +} + +ScopedServiceBindingBatch::~ScopedServiceBindingBatch() { + // If java_object_ is null, it means the batch update was not started, + // so there is no need to close it. + if (java_object_) { + JNIEnv* env = base::android::AttachCurrentThread(); + Java_ScopedServiceBindingBatch_close(env, java_object_); + } +} + +} // namespace base::android diff --git a/naiveproxy/src/base/android/scoped_service_binding_batch.h b/naiveproxy/src/base/android/scoped_service_binding_batch.h new file mode 100644 index 0000000000..d2582c20cd --- /dev/null +++ b/naiveproxy/src/base/android/scoped_service_binding_batch.h @@ -0,0 +1,48 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ANDROID_SCOPED_SERVICE_BINDING_BATCH_H_ +#define BASE_ANDROID_SCOPED_SERVICE_BINDING_BATCH_H_ + +#include "base/android/scoped_java_ref.h" +#include "base/base_export.h" + +namespace base::android { + +// ScopedServiceBindingBatch is used to batch up service binding requests. +// +// +// This is a C++ wrapper for the ScopedServiceBindingBatch Java class. This +// class follows RAII to ensure that batch updates are started and stopped +// correctly. +// +// When a ScopedServiceBindingBatch is created, it begins a batch update on the +// process launcher thread. When the ScopedServiceBindingBatch is destroyed, it +// ends the batch update. ScopedServiceBindingBatch supports nested batch +// updates. If the batch update count drops to 0, the binding request queue is +// flushed. +// +// ScopedServiceBindingBatch must be created on the main thread to ensure that +// nested batch window does not partially overlap. The batch open/end events are +// dispatched to the process launcher thread and counter is +// incremented/decremented on the launcher thread. +// +// While it is in batch mode, BindService will queue up binding requests. When +// the batch is over, the queue is flushed. +class BASE_EXPORT ScopedServiceBindingBatch { + public: + ScopedServiceBindingBatch(); + ~ScopedServiceBindingBatch(); + + ScopedServiceBindingBatch(const ScopedServiceBindingBatch&) = delete; + ScopedServiceBindingBatch& operator=(const ScopedServiceBindingBatch&) = + delete; + + private: + base::android::ScopedJavaGlobalRef java_object_; +}; + +} // namespace base::android + +#endif // BASE_ANDROID_SCOPED_SERVICE_BINDING_BATCH_H_ diff --git a/naiveproxy/src/base/android/self_compaction_manager.cc b/naiveproxy/src/base/android/self_compaction_manager.cc index c999720db3..65a3f50763 100644 --- a/naiveproxy/src/base/android/self_compaction_manager.cc +++ b/naiveproxy/src/base/android/self_compaction_manager.cc @@ -19,7 +19,7 @@ #include "base/trace_event/trace_event.h" namespace base::android { -BASE_FEATURE(kShouldFreezeSelf, "ShouldFreezeSelf", FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kShouldFreezeSelf, FEATURE_ENABLED_BY_DEFAULT); // Max amount of compaction to do in each chunk, measured in MiB. BASE_FEATURE_PARAM(size_t, @@ -35,9 +35,7 @@ BASE_FEATURE_PARAM(size_t, "delay_after_tasks", 30); -BASE_FEATURE(kUseRunningCompact, - "UseRunningCompact", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kUseRunningCompact, FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE_PARAM(size_t, kUseRunningCompactDelayAfterPreFreezeTasks, &kUseRunningCompact, @@ -47,7 +45,7 @@ BASE_FEATURE_PARAM(size_t, kUseRunningCompactMaxSize, &kUseRunningCompact, "running_compact_max_chunk_size", - 10); + 100); namespace { @@ -83,10 +81,6 @@ bool IsMadvisePageoutSupported() { // be more than enough. constexpr base::TimeDelta kCompactionTimeout = base::Seconds(10); -uint64_t BytesToMiB(uint64_t v) { - return v / 1024 / 1024; -} - uint64_t MiBToBytes(uint64_t v) { return v * 1024 * 1024; } @@ -242,6 +236,34 @@ void SelfCompactionManager::MaybeCancelCompactionInternal( base::TimeTicks::Now(); } +// static +void SelfCompactionManager::OnTriggerRunningCompact( + std::unique_ptr state) { + base::AutoLock locker(lock()); + Instance().OnTriggerCompact(std::move(state)); +} + +// static +void SelfCompactionManager::RequestRunningCompactWithDelay( + const TimeDelta delay) { + TRACE_EVENT0("base", "RequestRunningCompactWithDelay"); + + const auto triggered_at = base::TimeTicks::Now(); + base::AutoLock locker(lock()); + Instance().compaction_last_triggered_ = triggered_at; + + auto task_runner = base::ThreadPool::CreateSequencedTaskRunner( + {base::TaskPriority::BEST_EFFORT, MayBlock()}); + auto state = + std::make_unique(task_runner, triggered_at); + + task_runner->PostDelayedTask( + FROM_HERE, + base::BindOnce(&SelfCompactionManager::OnTriggerRunningCompact, + std::move(state)), + delay); +} + // static void SelfCompactionManager::OnRunningCompact() { TRACE_EVENT0("base", "OnRunningCompact"); @@ -515,11 +537,11 @@ void SelfCompactionManager::CompactionMetric::MaybeRecordCompactionMetrics() { } void SelfCompactionManager::CompactionMetric::RecordCompactionMetric( - size_t value_bytes, + ByteCount value_bytes, std::string_view metric_name, std::string_view suffix) { UmaHistogramMemoryMB(GetMetricName(metric_name, suffix), - static_cast(BytesToMiB(value_bytes))); + static_cast(value_bytes.InMiB())); } void SelfCompactionManager::CompactionMetric::RecordCompactionMetrics( @@ -533,12 +555,13 @@ void SelfCompactionManager::CompactionMetric::RecordCompactionMetrics( } void SelfCompactionManager::CompactionMetric::RecordCompactionDiffMetric( - size_t before_value_bytes, - size_t after_value_bytes, + ByteCount before_value_bytes, + ByteCount after_value_bytes, std::string_view name, std::string_view suffix) { - size_t diff_non_negative = std::max(before_value_bytes, after_value_bytes) - - std::min(before_value_bytes, after_value_bytes); + ByteCount diff_non_negative = + std::max(before_value_bytes, after_value_bytes) - + std::min(before_value_bytes, after_value_bytes); const std::string full_suffix = StrCat( {"Diff.", suffix, ".", before_value_bytes < after_value_bytes ? "Increase" : "Decrease"}); diff --git a/naiveproxy/src/base/android/self_compaction_manager.h b/naiveproxy/src/base/android/self_compaction_manager.h index d2046425a9..175140d717 100644 --- a/naiveproxy/src/base/android/self_compaction_manager.h +++ b/naiveproxy/src/base/android/self_compaction_manager.h @@ -8,6 +8,7 @@ // TODO(thiabaud): remove this include once we have separated the locks // between these two classes. #include "base/android/pre_freeze_background_memory_trimmer.h" +#include "base/byte_count.h" #include "base/debug/proc_maps_linux.h" #include "base/no_destructor.h" #include "base/profiler/sample_metadata.h" @@ -31,6 +32,7 @@ class BASE_EXPORT SelfCompactionManager { using CompactCancellationReason = CompactCancellationReason; static void OnSelfFreeze(); static void OnRunningCompact(); + static void RequestRunningCompactWithDelay(const TimeDelta delay); // If we are currently doing self compaction, cancel it. If it was running, // record a metric with the reason for the cancellation. @@ -68,14 +70,14 @@ class BASE_EXPORT SelfCompactionManager { std::string_view suffix) const; void RecordCompactionMetrics(const debug::SmapsRollup& value, std::string_view suffix); - void RecordCompactionMetric(size_t value_bytes, + void RecordCompactionMetric(ByteCount value_bytes, std::string_view metric_name, std::string_view suffix); void RecordCompactionDiffMetrics(const debug::SmapsRollup& before, const debug::SmapsRollup& after, std::string_view suffix); - void RecordCompactionDiffMetric(size_t before_value_bytes, - size_t after_value_bytes, + void RecordCompactionDiffMetric(ByteCount before_value_bytes, + ByteCount after_value_bytes, std::string_view name, std::string_view suffix); @@ -158,6 +160,8 @@ class BASE_EXPORT SelfCompactionManager { void OnTriggerCompact(scoped_refptr task_runner); void OnTriggerCompact(std::unique_ptr state) EXCLUSIVE_LOCKS_REQUIRED(lock()); + static void OnTriggerRunningCompact(std::unique_ptr state) + LOCKS_EXCLUDED(lock()); void StartCompaction(std::unique_ptr state) LOCKS_EXCLUDED(lock()); void MaybePostCompactionTask(std::unique_ptr state, diff --git a/naiveproxy/src/base/android/sys_utils.cc b/naiveproxy/src/base/android/sys_utils.cc index 0424fc0817..5dbbb69853 100644 --- a/naiveproxy/src/base/android/sys_utils.cc +++ b/naiveproxy/src/base/android/sys_utils.cc @@ -2,11 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/process/process_metrics.h" -#include "base/trace_event/trace_event.h" +#include -// Must come after all headers that specialize FromJniType() / ToJniType(). +#include "base/android/jni_android.h" +#include "base/process/process_metrics.h" #include "base/sys_utils_jni/SysUtils_jni.h" +#include "base/trace_event/trace_event.h" namespace base { namespace android { @@ -31,6 +32,11 @@ static void JNI_SysUtils_LogPageFaultCountToTracing(JNIEnv* env) { "major", counts.major); } +int GetCachedLowMemoryDeviceThresholdMb() { + JNIEnv* env = AttachCurrentThread(); + return static_cast(Java_SysUtils_getLowMemoryDeviceThresholdMb(env)); +} + } // namespace android } // namespace base diff --git a/naiveproxy/src/base/android/sys_utils.h b/naiveproxy/src/base/android/sys_utils.h new file mode 100644 index 0000000000..138078eaf1 --- /dev/null +++ b/naiveproxy/src/base/android/sys_utils.h @@ -0,0 +1,18 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ANDROID_SYS_UTILS_H_ +#define BASE_ANDROID_SYS_UTILS_H_ + +#include "base/base_export.h" + +namespace base::android { + +// Returns the RAM thresholds below which a device is considered low-RAM, +// obtained from a feature param +BASE_EXPORT int GetCachedLowMemoryDeviceThresholdMb(); + +} // namespace base::android + +#endif // BASE_ANDROID_SYS_UTILS_H_ diff --git a/naiveproxy/src/base/android/sys_utils_stub.cc b/naiveproxy/src/base/android/sys_utils_stub.cc new file mode 100644 index 0000000000..450539ad48 --- /dev/null +++ b/naiveproxy/src/base/android/sys_utils_stub.cc @@ -0,0 +1,16 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/android/sys_utils.h" + +namespace base { +namespace android { + +int GetCachedLowMemoryDeviceThresholdMb() { + return 0; +} + +} // namespace android + +} // namespace base diff --git a/naiveproxy/src/base/android/task_scheduler/task_runner_android.cc b/naiveproxy/src/base/android/task_scheduler/task_runner_android.cc index 9b2656bb5f..4d40ebc31e 100644 --- a/naiveproxy/src/base/android/task_scheduler/task_runner_android.cc +++ b/naiveproxy/src/base/android/task_scheduler/task_runner_android.cc @@ -5,13 +5,18 @@ #include "base/android/task_scheduler/task_runner_android.h" #include +#include #include +#include #include #include "base/android/jni_string.h" +#include "base/android/trace_event_binding.h" #include "base/check.h" #include "base/compiler_specific.h" #include "base/functional/bind.h" +#include "base/functional/bind_internal.h" +#include "base/location.h" #include "base/no_destructor.h" #include "base/strings/strcat.h" #include "base/task/current_thread.h" @@ -36,6 +41,43 @@ TaskRunnerAndroid::UiThreadTaskRunnerCallback& GetUiThreadTaskRunnerCallback() { return *callback; } +// A helper class to encapsulate Java stack frame information for tracing +// purposes. +class JavaLocation { + public: + JavaLocation(JNIEnv* env, + const android::JavaParamRef& file_name, + const android::JavaParamRef& function_name, + int line_number) + : JavaLocation(base::android::ConvertJavaStringToUTF8(env, file_name), + base::android::ConvertJavaStringToUTF8(env, function_name), + line_number) {} + + // Move-only to avoid overhead of copying strings. + JavaLocation(const JavaLocation& other) = delete; + JavaLocation& operator=(const JavaLocation& other) = delete; + JavaLocation(JavaLocation&& other) noexcept = default; + + void WriteIntoTrace(perfetto::TracedValue context) const { + auto dict = std::move(context).WriteDictionary(); + dict.Add("function_name", function_name_); + dict.Add("file_name", file_name_); + dict.Add("line_number", line_number_); + } + + private: + JavaLocation(const std::string&& file_name, + const std::string&& function_name, + int line_number) + : function_name_(std::move(function_name)), + file_name_(std::move(file_name)), + line_number_(line_number) {} + + const std::string function_name_; + const std::string file_name_; + const int line_number_; +}; + void RunJavaTask(jint task_index) { Java_TaskRunnerImpl_runTask(jni_zero::AttachCurrentThread(), task_index); } @@ -70,6 +112,27 @@ void TaskRunnerAndroid::PostDelayedTask(JNIEnv* env, FROM_HERE, base::BindOnce(&RunJavaTask, task_index), Milliseconds(delay)); } +void TaskRunnerAndroid::PostDelayedTaskWithLocation( + JNIEnv* env, + jlong delay, + jint task_index, + const android::JavaParamRef& file_name, + const android::JavaParamRef& function_name, + jint line_number) { + // This could be run on any java thread, so we can't cache |env| in the + // BindOnce because JNIEnv is thread specific. + task_runner_->PostDelayedTask( + FROM_HERE, + base::BindOnce( + [](const JavaLocation& location, jint task_index) { + TRACE_EVENT(android::internal::kToplevelTraceCategory, + "Running Java Task", "posted_from", location); + RunJavaTask(task_index); + }, + JavaLocation(env, file_name, function_name, line_number), task_index), + Milliseconds(delay)); +} + // static std::unique_ptr TaskRunnerAndroid::Create( jint task_runner_type, diff --git a/naiveproxy/src/base/android/task_scheduler/task_runner_android.h b/naiveproxy/src/base/android/task_scheduler/task_runner_android.h index e1b3c75ffd..b630738115 100644 --- a/naiveproxy/src/base/android/task_scheduler/task_runner_android.h +++ b/naiveproxy/src/base/android/task_scheduler/task_runner_android.h @@ -33,6 +33,14 @@ class BASE_EXPORT TaskRunnerAndroid { void PostDelayedTask(JNIEnv* env, jlong delay, jint taskIndex); + void PostDelayedTaskWithLocation( + JNIEnv* env, + jlong delay, + jint taskIndex, + const android::JavaParamRef& fileName, + const android::JavaParamRef& functionName, + jint lineNumber); + bool BelongsToCurrentThread(JNIEnv* env); static std::unique_ptr Create(jint task_runner_type, diff --git a/naiveproxy/src/base/apple/bridging.h b/naiveproxy/src/base/apple/bridging.h index 19911dce3b..ae5135cc9c 100644 --- a/naiveproxy/src/base/apple/bridging.h +++ b/naiveproxy/src/base/apple/bridging.h @@ -11,7 +11,6 @@ #include "base/apple/scoped_cftyperef.h" #include "base/base_export.h" #include "base/check.h" -#include "base/types/always_false.h" #include "build/build_config.h" #if BUILDFLAG(IS_IOS) @@ -146,9 +145,8 @@ namespace base::apple { template id _Nullable CFToNSOwnershipCast(ScopedCFTypeRef) { static_assert( - AlwaysFalse, - "Error: Do not pass a ScopedCFTypeRef to CFToNSOwnershipCast. " - "Call .release() on the ScopedCFTypeRef and pass the result in."); + false, "Error: Do not pass a ScopedCFTypeRef to CFToNSOwnershipCast. " + "Call .release() on the ScopedCFTypeRef and pass the result in."); return nil; } diff --git a/naiveproxy/src/base/apple/mach_port_rendezvous_mac.cc b/naiveproxy/src/base/apple/mach_port_rendezvous_mac.cc index 94731aa7c9..bd9d2a2e65 100644 --- a/naiveproxy/src/base/apple/mach_port_rendezvous_mac.cc +++ b/naiveproxy/src/base/apple/mach_port_rendezvous_mac.cc @@ -32,13 +32,11 @@ namespace base { // Whether any peer process requirements should be validated. BASE_FEATURE(kMachPortRendezvousValidatePeerRequirements, - "MachPortRendezvousValidatePeerRequirements", base::FEATURE_DISABLED_BY_DEFAULT); // Whether a failure to validate a peer process against a requirement // should result in aborting the rendezvous. BASE_FEATURE(kMachPortRendezvousEnforcePeerRequirements, - "MachPortRendezvousEnforcePeerRequirements", base::FEATURE_DISABLED_BY_DEFAULT); namespace { diff --git a/naiveproxy/src/base/apple/owned_objc_types.h b/naiveproxy/src/base/apple/owned_objc_types.h index d81286ac80..c1c942137d 100644 --- a/naiveproxy/src/base/apple/owned_objc_types.h +++ b/naiveproxy/src/base/apple/owned_objc_types.h @@ -26,7 +26,11 @@ GENERATE_STRONG_OBJC_TYPE(NSEvent) GENERATE_STRONG_OBJC_TYPE(NSObject) GENERATE_STRONG_OBJC_TYPE(UIEvent) #if BUILDFLAG(USE_BLINK) +#if BUILDFLAG(IS_IOS_TVOS) +GENERATE_STRONG_OBJC_TYPE(UIPress) +#else GENERATE_STRONG_OBJC_TYPE(BEKeyEntry) +#endif // BUILDFLAG(IS_IOS_TVOS) #endif // BUILDFLAG(USE_BLINK) #endif diff --git a/naiveproxy/src/base/atomicops.h b/naiveproxy/src/base/atomicops.h index e7a2bcd268..537a4c42ba 100644 --- a/naiveproxy/src/base/atomicops.h +++ b/naiveproxy/src/base/atomicops.h @@ -139,7 +139,7 @@ Atomic64 Acquire_Load(volatile const Atomic64* ptr); // Copies non-overlapping spans of the same size. Writes are done using C++ // atomics with `std::memory_order_relaxed`. // -// This is an analogue of `WTF::AtomicWriteMemcpy` and it should be used +// This is an analogue of `blink::AtomicWriteMemcpy` and it should be used // for copying data into buffers that are accessible from another // thread while the copy is being done. The buffer will appear inconsistent, // but it won't trigger C++ UB and won't upset TSAN. The end of copy needs to diff --git a/naiveproxy/src/base/byte_count.cc b/naiveproxy/src/base/byte_count.cc new file mode 100644 index 0000000000..924720d8c1 --- /dev/null +++ b/naiveproxy/src/base/byte_count.cc @@ -0,0 +1,104 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/byte_count.h" + +#include + +#include "base/strings/string_number_conversions.h" + +namespace base { + +std::ostream& operator<<(std::ostream& os, ByteCount byte_count) { + int64_t bytes = byte_count.InBytes(); + + // If it's exactly 0 then stream and return. + if (bytes == 0) { + os << "0B"; + return os; + } + + // If it's exactly INT64_MIN then stream and return. Later in this function, + // negative values are handled by processing their absolute value, but + // INT64_MIN, like all two's complement minimums, has no corresponding + // positive value within range. + if (bytes == std::numeric_limits::min()) { + os << "-8EiB"; + return os; + } + + // Reserve enough space (e.g. "-1152920504606846976B (-1023.999PiB)" which is + // a full 64-bit negative value with four digits before the decimal). + std::string result; + result.reserve(36); + + // Separate out the sign, as it's easier to do magnitude tests on positive + // values. + bool is_negative = bytes < 0; + if (is_negative) { + bytes = -bytes; + byte_count = -byte_count; + result += "-"; + } + + // If it's an exact number of [EPTGMK]kB then stream that, unless it's a + // quantity measurable by the next magnitude prefix (e.g. if the value is in + // the pebibyte range but it happens to be divisible by 1024 it shouldn't be + // logged in KiB). + if (bytes % EiB(1).InBytes() == 0) { + result += NumberToString(byte_count.InEiB()); + result += "EiB"; + } else if (bytes % PiB(1).InBytes() == 0 && bytes / EiB(1).InBytes() == 0) { + result += NumberToString(byte_count.InPiB()); + result += "PiB"; + } else if (bytes % TiB(1).InBytes() == 0 && bytes / PiB(1).InBytes() == 0) { + result += NumberToString(byte_count.InTiB()); + result += "TiB"; + } else if (bytes % GiB(1).InBytes() == 0 && bytes / TiB(1).InBytes() == 0) { + result += NumberToString(byte_count.InGiB()); + result += "GiB"; + } else if (bytes % MiB(1).InBytes() == 0 && bytes / GiB(1).InBytes() == 0) { + result += NumberToString(byte_count.InMiB()); + result += "MiB"; + } else if (bytes % KiB(1).InBytes() == 0 && bytes / MiB(1).InBytes() == 0) { + result += NumberToString(byte_count.InKiB()); + result += "KiB"; + } else { + // If not, then stream the exact byte count plus (if larger than 1KiB) an + // estimate for scale. + result += NumberToString(bytes); + result += "B"; + if (bytes > KiB(1).InBytes()) { + result += " ("; + if (is_negative) { + result += "-"; + } + if (bytes > EiB(1).InBytes()) { + result += NumberToStringWithFixedPrecision(byte_count.InEiBF(), 3); + result += "EiB"; + } else if (bytes > PiB(1).InBytes()) { + result += NumberToStringWithFixedPrecision(byte_count.InPiBF(), 3); + result += "PiB"; + } else if (bytes > TiB(1).InBytes()) { + result += NumberToStringWithFixedPrecision(byte_count.InTiBF(), 3); + result += "TiB"; + } else if (bytes > GiB(1).InBytes()) { + result += NumberToStringWithFixedPrecision(byte_count.InGiBF(), 3); + result += "GiB"; + } else if (bytes > MiB(1).InBytes()) { + result += NumberToStringWithFixedPrecision(byte_count.InMiBF(), 3); + result += "MiB"; + } else { + result += NumberToStringWithFixedPrecision(byte_count.InKiBF(), 3); + result += "KiB"; + } + result += ")"; + } + } + + os << result; + return os; +} + +} // namespace base diff --git a/naiveproxy/src/base/byte_count.h b/naiveproxy/src/base/byte_count.h index 8f7f43d7e8..eb5d57a325 100644 --- a/naiveproxy/src/base/byte_count.h +++ b/naiveproxy/src/base/byte_count.h @@ -5,18 +5,22 @@ #ifndef BASE_BYTE_COUNT_H_ #define BASE_BYTE_COUNT_H_ -#include +#include #include -#include +#include +#include "base/base_export.h" #include "base/numerics/checked_math.h" #include "base/numerics/safe_conversions.h" namespace base { +// DEPRECATED: use ByteSize for unsigned values and ByteSizeDelta for signed. +// // Represents an integral number of bytes. Supports arithmetic operations and -// conversions to/from KiB, MiB and GiB. Any operation that overflows will -// result in a crash and thus this should only be used for trusted inputs. +// conversions to/from KiB, MiB, GiB, TiB, PiB, and EiB. Any operation that +// overflows will result in a crash and thus this should only be used for +// trusted inputs. // // Sample usage: // @@ -31,7 +35,7 @@ namespace base { // // KiB(), MiB() and GiB() can take float parameters. This will return the // nearest integral number of bytes, rounding towards zero. -class ByteCount { +class BASE_EXPORT ByteCount { public: constexpr ByteCount() = default; @@ -51,19 +55,41 @@ class ByteCount { return ByteCount(checked_bytes.ValueOrDie()); } + constexpr bool is_positive() const { return bytes_ > 0; } constexpr bool is_zero() const { return bytes_ == 0; } + constexpr bool is_negative() const { return bytes_ < 0; } + + // A value corresponding to the "maximum" number of bytes possible. Useful as + // a constant to mean "unlimited". + static constexpr ByteCount Max(); // Conversion to integral values. constexpr int64_t InBytes() const { return bytes_; } constexpr int64_t InKiB() const { return bytes_ / 1024; } constexpr int64_t InMiB() const { return bytes_ / 1024 / 1024; } constexpr int64_t InGiB() const { return bytes_ / 1024 / 1024 / 1024; } + constexpr int64_t InTiB() const { return bytes_ / 1024 / 1024 / 1024 / 1024; } + constexpr int64_t InPiB() const { + return bytes_ / 1024 / 1024 / 1024 / 1024 / 1024; + } + constexpr int64_t InEiB() const { + return bytes_ / 1024 / 1024 / 1024 / 1024 / 1024 / 1024; + } // Conversion to floating point values. constexpr double InBytesF() const { return bytes_; } constexpr double InKiBF() const { return bytes_ / 1024.0; } constexpr double InMiBF() const { return bytes_ / 1024.0 / 1024.0; } constexpr double InGiBF() const { return bytes_ / 1024.0 / 1024.0 / 1024.0; } + constexpr double InTiBF() const { + return bytes_ / 1024.0 / 1024.0 / 1024.0 / 1024.0; + } + constexpr double InPiBF() const { + return bytes_ / 1024.0 / 1024.0 / 1024.0 / 1024.0 / 1024.0; + } + constexpr double InEiBF() const { + return bytes_ / 1024.0 / 1024.0 / 1024.0 / 1024.0 / 1024.0 / 1024.0; + } // Conversion to an unsigned amount of bytes. Only use when it is guaranteed // that the value is positive. Fails if the value is negative. @@ -73,6 +99,9 @@ class ByteCount { // Math operations. + constexpr ByteCount operator+() const { return *this; } + constexpr ByteCount operator-() const { return ByteCount(-bytes_); } + constexpr ByteCount& operator+=(const ByteCount& other) { *this = ByteCount::FromChecked(CheckedNumeric(bytes_) + other.bytes_); @@ -107,6 +136,12 @@ class ByteCount { return left; } + template + friend constexpr ByteCount operator*(const T& left, ByteCount right) { + right *= left; + return right; + } + template constexpr ByteCount& operator/=(const T& value) { *this = ByteCount::FromChecked(CheckedNumeric(bytes_) / value); @@ -128,49 +163,103 @@ class ByteCount { int64_t bytes_ = 0; }; +// DEPRECATED: use KiBU, etc, for unsigned values and KiBS, etc, for signed. +// +// TODO(crbug.com/448661443): After all uses are migrated to explicit signed/ +// unsigned, delete these and rename KiBU to KiB. +// // Templated functions to construct from various types. Note that integers must // be converted to CheckedNumeric BEFORE multiplying to detect // overflows, while floats must be converted AFTER multiplying to avoid // premature truncation. template - requires std::is_integral_v + requires std::integral constexpr ByteCount KiB(T kib) { return ByteCount::FromChecked(CheckedNumeric(kib) * 1024); } template - requires std::is_floating_point_v + requires std::floating_point constexpr ByteCount KiB(T kib) { return ByteCount::FromChecked(CheckedNumeric(kib * 1024.0)); } template - requires std::is_integral_v + requires std::integral constexpr ByteCount MiB(T mib) { return ByteCount::FromChecked(CheckedNumeric(mib) * 1024 * 1024); } template - requires std::is_floating_point_v + requires std::floating_point constexpr ByteCount MiB(T mib) { return ByteCount::FromChecked(CheckedNumeric(mib * 1024.0 * 1024.0)); } template - requires std::is_integral_v + requires std::integral constexpr ByteCount GiB(T gib) { return ByteCount::FromChecked(CheckedNumeric(gib) * 1024 * 1024 * 1024); } template - requires std::is_floating_point_v + requires std::floating_point constexpr ByteCount GiB(T gib) { return ByteCount::FromChecked( CheckedNumeric(gib * 1024.0 * 1024.0 * 1024.0)); } +template + requires std::integral +constexpr ByteCount TiB(T tib) { + return ByteCount::FromChecked(CheckedNumeric(tib) * 1024 * 1024 * + 1024 * 1024); +} + +template + requires std::floating_point +constexpr ByteCount TiB(T gib) { + return ByteCount::FromChecked( + CheckedNumeric(gib * 1024.0 * 1024.0 * 1024.0 * 1024.0)); +} + +template + requires std::integral +constexpr ByteCount PiB(T pib) { + return ByteCount::FromChecked(CheckedNumeric(pib) * 1024 * 1024 * + 1024 * 1024 * 1024); +} + +template + requires std::floating_point +constexpr ByteCount PiB(T pib) { + return ByteCount::FromChecked(CheckedNumeric( + pib * 1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0)); +} + +template + requires std::integral +constexpr ByteCount EiB(T eib) { + return ByteCount::FromChecked(CheckedNumeric(eib) * 1024 * 1024 * + 1024 * 1024 * 1024 * 1024); +} + +template + requires std::floating_point +constexpr ByteCount EiB(T eib) { + return ByteCount::FromChecked(CheckedNumeric( + eib * 1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0)); +} + +BASE_EXPORT std::ostream& operator<<(std::ostream& os, ByteCount byte_count); + +// static +constexpr ByteCount ByteCount::Max() { + return ByteCount(std::numeric_limits::max()); +} + } // namespace base #endif // BASE_BYTE_COUNT_H_ diff --git a/naiveproxy/src/base/byte_size.cc b/naiveproxy/src/base/byte_size.cc new file mode 100644 index 0000000000..c941992aa9 --- /dev/null +++ b/naiveproxy/src/base/byte_size.cc @@ -0,0 +1,124 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/byte_size.h" + +#include +#include + +#include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" + +namespace base { + +namespace { + +constexpr uint64_t kOneKiB = KiBU(1).InBytes(); +constexpr uint64_t kOneMiB = MiBU(1).InBytes(); +constexpr uint64_t kOneGiB = GiBU(1).InBytes(); +constexpr uint64_t kOneTiB = TiBU(1).InBytes(); +constexpr uint64_t kOnePiB = PiBU(1).InBytes(); +constexpr uint64_t kOneEiB = EiBU(1).InBytes(); + +void AppendMagnitude(std::string* dest, + ByteSize magnitude, + const std::string& sign_prefix = "") { + uint64_t bytes = magnitude.InBytes(); + + StrAppend(dest, {sign_prefix}); + + // If it's an exact number of [EPTGMK]kB then stream that, unless it's a + // quantity measurable by the next magnitude prefix (e.g. if the value is in + // the pebibyte range but it happens to be divisible by 1024 it shouldn't be + // logged in KiB). + if (bytes % kOneEiB == 0) { + StrAppend(dest, {NumberToString(magnitude.InEiB()), "EiB"}); + } else if (bytes % kOnePiB == 0 && bytes / kOneEiB == 0) { + StrAppend(dest, {NumberToString(magnitude.InPiB()), "PiB"}); + } else if (bytes % kOneTiB == 0 && bytes / kOnePiB == 0) { + StrAppend(dest, {NumberToString(magnitude.InTiB()), "TiB"}); + } else if (bytes % kOneGiB == 0 && bytes / kOneTiB == 0) { + StrAppend(dest, {NumberToString(magnitude.InGiB()), "GiB"}); + } else if (bytes % kOneMiB == 0 && bytes / kOneGiB == 0) { + StrAppend(dest, {NumberToString(magnitude.InMiB()), "MiB"}); + } else if (bytes % kOneKiB == 0 && bytes / kOneMiB == 0) { + StrAppend(dest, {NumberToString(magnitude.InKiB()), "KiB"}); + } else { + // If not, then stream the exact byte count plus (if larger than 1KiB) an + // estimate for scale. + StrAppend(dest, {NumberToString(bytes), "B"}); + if (bytes > kOneKiB) { + StrAppend(dest, {" (", sign_prefix}); + if (bytes > kOneEiB) { + StrAppend( + dest, + {NumberToStringWithFixedPrecision(magnitude.InEiBF(), 3), "EiB"}); + } else if (bytes > kOnePiB) { + StrAppend( + dest, + {NumberToStringWithFixedPrecision(magnitude.InPiBF(), 3), "PiB"}); + } else if (bytes > kOneTiB) { + StrAppend( + dest, + {NumberToStringWithFixedPrecision(magnitude.InTiBF(), 3), "TiB"}); + } else if (bytes > kOneGiB) { + StrAppend( + dest, + {NumberToStringWithFixedPrecision(magnitude.InGiBF(), 3), "GiB"}); + } else if (bytes > kOneMiB) { + StrAppend( + dest, + {NumberToStringWithFixedPrecision(magnitude.InMiBF(), 3), "MiB"}); + } else { + StrAppend( + dest, + {NumberToStringWithFixedPrecision(magnitude.InKiBF(), 3), "KiB"}); + } + StrAppend(dest, {")"}); + } + } +} + +} // namespace + +std::ostream& operator<<(std::ostream& os, ByteSize size) { + // If it's exactly 0 then stream and return. + if (size.is_zero()) { + return os << "0B"; + } + + // Reserve enough space (e.g. "1152920504606846976B (1023.999PiB)" which is + // a full 64-bit value with four digits before the decimal). + std::string result; + result.reserve(34); + + AppendMagnitude(&result, size); + return os << result; +} + +std::ostream& operator<<(std::ostream& os, ByteSizeDelta delta) { + // If it's exactly 0 then stream and return. + if (delta.is_zero()) { + return os << "0B"; + } + + // If it's exactly INT64_MIN then stream and return. Later in this function, + // negative values are handled by processing their absolute value, but + // INT64_MIN, like all two's complement minimums, has no corresponding + // positive value within range. + if (delta.is_min()) { + return os << "-8EiB"; + } + + // Reserve enough space (e.g. "-1152920504606846976B (-1023.999PiB)" which is + // a full 64-bit negative value with four digits before the decimal). + std::string result; + result.reserve(36); + + // Format that magnitude, with negative signs prepended if necessary. + AppendMagnitude(&result, delta.Magnitude(), delta.is_negative() ? "-" : ""); + return os << result; +} + +} // namespace base diff --git a/naiveproxy/src/base/byte_size.h b/naiveproxy/src/base/byte_size.h new file mode 100644 index 0000000000..17a2d0359a --- /dev/null +++ b/naiveproxy/src/base/byte_size.h @@ -0,0 +1,608 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BYTE_SIZE_H_ +#define BASE_BYTE_SIZE_H_ + +#include +#include +#include + +#include "base/base_export.h" +#include "base/numerics/checked_math.h" +#include "base/numerics/safe_conversions.h" + +namespace base { + +// ByteSize (unsigned, 64-bit) and ByteSizeDelta (signed, 64-bit) each represent +// an integral number of bytes. They support arithmetic operations and +// conversions to/from KiB, MiB, GiB, TiB, PiB, and EiB. +// +// The range of ByteSize is [0...max(int64_t)] so that it's a strict subset of +// ByteSizeDelta, to simplify conversion rules. Any operation that overflows +// (including converting a negative ByteSizeDelta to ByteSize) will result in a +// crash and thus this should only be used for trusted inputs. +// +// Sample usage: +// +// // Do not reinvent conversion between units. +// constexpr ByteSize kBufferSize = MiBU(1); +// std::vector buffer(kBufferSize.InBytes()); +// +// // Enforce that correct units are used across APIs at compile time. +// ByteSize quota = GetQuota(); +// SetMetadataSize(KiBU(10)); +// ByteSizeDelta remaining_quota = quota - KiBU(10); +// SetDatabaseSize(remaining_quota.AsByteSize()); +// +// KiBU()/KiBS(), MiBU()/MiBS(), etc. can take float parameters. This will +// return the nearest integral number of bytes, rounding towards zero. + +namespace internal { + +// Shared code between ByteSize and ByteSizeDelta. +// +// This wraps a number of bytes stored as int64_t, which covers the full range +// of both ByteSize ([0...max(int64_t)]) and ByteSizeDelta. +class ByteSizeBase { + public: + ~ByteSizeBase() = default; + + // Comparators and hashers. + constexpr friend bool operator==(ByteSizeBase a, ByteSizeBase b) = default; + constexpr friend auto operator<=>(ByteSizeBase a, ByteSizeBase b) = default; + + template + friend H AbslHashValue(H h, ByteSizeBase b) { + return H::combine(std::move(h), b.bytes_); + } + + protected: + // Can only be constructed by subclasses. + constexpr ByteSizeBase() = default; + + template + constexpr explicit ByteSizeBase(T bytes) + : bytes_(checked_cast(bytes)) {} + + // Conversion helper functions. + template + constexpr ReturnType InBytesImpl() const { + return checked_cast(bytes_); + } + template + constexpr ReturnType InKiBImpl() const { + return InBytesImpl() / 1024; + } + template + constexpr ReturnType InMiBImpl() const { + return InBytesImpl() / 1024 / 1024; + } + template + constexpr ReturnType InGiBImpl() const { + return InBytesImpl() / 1024 / 1024 / 1024; + } + template + constexpr ReturnType InTiBImpl() const { + return InBytesImpl() / 1024 / 1024 / 1024 / 1024; + } + template + constexpr ReturnType InPiBImpl() const { + return InBytesImpl() / 1024 / 1024 / 1024 / 1024 / 1024; + } + template + constexpr ReturnType InEiBImpl() const { + return InBytesImpl() / 1024 / 1024 / 1024 / 1024 / 1024 / 1024; + } + + // Returns the wrapped value as a CheckedNumeric. Always use int64_t for + // checked math so that intermediate steps can handle the full range of + // ByteSizeDelta. The ByteSize constructor will CHECK if a final ByteSize + // result is negative. + constexpr CheckedNumeric AsChecked() const { return bytes_; } + + // Helpers to implement math operations, storing the result in ResultType. + // These all modify a CheckedNumeric in-place because + // `operator+(CheckedNumeric, uint64_t)` will return a + // CheckedNumeric, failing on any negative value. + + template + requires std::derived_from + constexpr ResultType AddImpl(ByteSizeBase other) const { + auto checked_bytes = AsChecked(); + checked_bytes += other.bytes_; + return ResultType(checked_bytes); + } + + template + requires std::derived_from + constexpr ResultType SubImpl(ByteSizeBase other) const { + auto checked_bytes = AsChecked(); + checked_bytes -= other.bytes_; + return ResultType(checked_bytes); + } + + template + requires std::derived_from + constexpr ResultType MulImpl(T value) const { + auto checked_bytes = AsChecked(); + checked_bytes *= value; + return ResultType(checked_bytes); + } + + template + requires std::derived_from + constexpr ResultType DivImpl(T value) const { + auto checked_bytes = AsChecked(); + checked_bytes /= value; + return ResultType(checked_bytes); + } + + private: + // The wrapped number of bytes. Not stored as a CheckedNumeric because it only + // needs to be checked on modification. It doesn't carry around errors. This + // is private so that it can't be modified by subclasses without going through + // the constructor, which range-checks it. + int64_t bytes_ = 0; +}; + +} // namespace internal + +class ByteSizeDelta; + +// A non-negative number of bytes, in the range [0...max(int64_t)]. +class BASE_EXPORT ByteSize : public internal::ByteSizeBase { + public: + constexpr ByteSize() = default; + + // Constructs a ByteSize from an unsigned integer. CHECK's that the value is + // in range. + template + requires std::unsigned_integral + constexpr explicit ByteSize(T bytes) + // The inherited constructor ensures `bytes` is also in range for int64_t. + : ByteSizeBase(checked_cast(bytes)) {} + + // Constructs a ByteSize from a compile-time constant with signed type, for + // convenience. Constants that are out of range will fail to compile. + // + // To construct a ByteSize from a signed integer at runtime, cast explicitly + // or use FromByteSizeDelta(). + template + requires std::signed_integral + consteval explicit ByteSize(T bytes) + // The inherited constructor ensures `bytes` is also in range for int64_t. + : ByteSizeBase(checked_cast(bytes)) {} + + // Converts ByteSize to and from a signed ByteSizeDelta. Converting from a + // delta CHECK's that it's in range (ie. non-negative). Converting to a delta + // always succeeds. + static constexpr ByteSize FromByteSizeDelta(ByteSizeDelta delta); + constexpr ByteSizeDelta AsByteSizeDelta() const; + + // Returns a value corresponding to the "maximum" number of bytes possible. + // Useful as a constant to mean "unlimited". + static constexpr ByteSize Max() { + return ByteSize(std::numeric_limits::max()); + } + + constexpr bool is_zero() const { return InBytes() == 0; } + + constexpr bool is_max() const { return *this == Max(); } + + // Conversion to integral values. + constexpr uint64_t InBytes() const { return InBytesImpl(); } + constexpr uint64_t InKiB() const { return InKiBImpl(); } + constexpr uint64_t InMiB() const { return InMiBImpl(); } + constexpr uint64_t InGiB() const { return InGiBImpl(); } + constexpr uint64_t InTiB() const { return InTiBImpl(); } + constexpr uint64_t InPiB() const { return InPiBImpl(); } + constexpr uint64_t InEiB() const { return InEiBImpl(); } + + // Conversion to floating point values. + constexpr double InBytesF() const { return InBytesImpl(); } + constexpr double InKiBF() const { return InKiBImpl(); } + constexpr double InMiBF() const { return InMiBImpl(); } + constexpr double InGiBF() const { return InGiBImpl(); } + constexpr double InTiBF() const { return InTiBImpl(); } + constexpr double InPiBF() const { return InPiBImpl(); } + constexpr double InEiBF() const { return InEiBImpl(); } + + // Math operators. Addition and subtraction deliberately support only ByteSize + // and ByteSizeDelta, to make sure all values are constructed with explicit + // units. + + constexpr ByteSize& operator+=(ByteSize other) { + return *this = AddImpl(other); + } + constexpr ByteSize& operator+=(ByteSizeDelta delta); + + constexpr ByteSize& operator-=(ByteSize other) { + return *this = SubImpl(other); + } + constexpr ByteSize& operator-=(ByteSizeDelta delta); + + template + constexpr ByteSize& operator*=(T value) { + return *this = MulImpl(value); + } + + template + constexpr ByteSize& operator/=(T value) { + return *this = DivImpl(value); + } + + // Returns the sum of two ByteSizes. + friend constexpr ByteSize operator+(ByteSize left, ByteSize right) { + return left.AddImpl(right); + } + + // Returns the delta between two ByteSizes. + friend constexpr ByteSizeDelta operator-(ByteSize left, ByteSize right); + + // Modifies a ByteSize by a delta, and returns the result. + friend constexpr ByteSize operator+(ByteSize left, ByteSizeDelta right); + friend constexpr ByteSize operator+(ByteSizeDelta left, ByteSize right); + friend constexpr ByteSize operator-(ByteSize left, ByteSizeDelta right); + + // Scales a ByteSize by a numeric value, and returns the result. + template + friend constexpr ByteSize operator*(ByteSize left, T right) { + return left.MulImpl(right); + } + template + friend constexpr ByteSize operator*(T left, ByteSize right) { + return right * left; + } + template + friend constexpr ByteSize operator/(ByteSize left, T right) { + return left.DivImpl(right); + } + + private: + // Allow ByteSizeBase::AddImpl, etc. to construct from the math result. + friend class ByteSizeBase; + + constexpr explicit ByteSize(CheckedNumeric checked_bytes) + : ByteSizeBase(checked_cast(checked_bytes.ValueOrDie())) {} +}; + +// A signed number of bytes, in the range [min(int64_t)...max(int64_t)]. +class BASE_EXPORT ByteSizeDelta : public internal::ByteSizeBase { + public: + constexpr ByteSizeDelta() = default; + + // Constructs a ByteSizeDelta from a signed integer. + template + requires std::signed_integral + constexpr explicit ByteSizeDelta(T bytes) : ByteSizeBase(bytes) {} + + // Constructs a ByteSizeDelta from a compile-time constant with unsigned type, + // for convenience. Constants that are out of range will fail to compile. + // + // To construct a ByteSizeDelta from an unsigned integer at runtime, cast + // explicitly or use FromByteSize(). + template + requires std::unsigned_integral + consteval explicit ByteSizeDelta(T bytes) + // The inherited constructor ensures `bytes` is in range for int64_t. + : ByteSizeBase(bytes) {} + + // Converts ByteSizeDelta to and from an unsigned ByteSize. Converting from a + // delta CHECK's that it's in range (ie. non-negative). Converting to a delta + // always succeeds. + static constexpr ByteSizeDelta FromByteSize(ByteSize size) { + return size.AsByteSizeDelta(); + } + constexpr ByteSize AsByteSize() const { + return ByteSize(checked_cast(InBytes())); + } + + // Returns a value corresponding to the "maximum" (positive) number of bytes + // possible. Useful as a constant to mean "unlimited" in the positive + // direction. + static constexpr ByteSizeDelta Max() { + return ByteSizeDelta(std::numeric_limits::max()); + } + + // Returns a value corresponding to the "minimum" (or maximum negative) number + // of bytes possible. Useful as a constant to mean "unlimited" in the negative + // direction. + static constexpr ByteSizeDelta Min() { + return ByteSizeDelta(std::numeric_limits::min()); + } + + constexpr bool is_positive() const { return InBytes() > 0; } + constexpr bool is_zero() const { return InBytes() == 0; } + constexpr bool is_negative() const { return InBytes() < 0; } + + constexpr bool is_max() const { return *this == Max(); } + constexpr bool is_min() const { return *this == Min(); } + + // Conversion to integral values. + constexpr int64_t InBytes() const { return InBytesImpl(); } + constexpr int64_t InKiB() const { return InKiBImpl(); } + constexpr int64_t InMiB() const { return InMiBImpl(); } + constexpr int64_t InGiB() const { return InGiBImpl(); } + constexpr int64_t InTiB() const { return InTiBImpl(); } + constexpr int64_t InPiB() const { return InPiBImpl(); } + constexpr int64_t InEiB() const { return InEiBImpl(); } + + // Conversion to floating point values. + constexpr double InBytesF() const { return InBytesImpl(); } + constexpr double InKiBF() const { return InKiBImpl(); } + constexpr double InMiBF() const { return InMiBImpl(); } + constexpr double InGiBF() const { return InGiBImpl(); } + constexpr double InTiBF() const { return InTiBImpl(); } + constexpr double InPiBF() const { return InPiBImpl(); } + constexpr double InEiBF() const { return InEiBImpl(); } + + // Returns the absolute value, as a ByteSizeDelta. CHECK's that the absolute + // value is in range (ie. not Min(), since two's complement minimums have no + // corresponding positive value in range.) + constexpr ByteSizeDelta Abs() const { + return ByteSizeDelta(AsChecked().Abs()); + } + + // Returns the absolute value, as a ByteSize. CHECK's that the absolute value + // is in range for a ByteSize. + constexpr ByteSize Magnitude() const { return Abs().AsByteSize(); } + + // Math operators. Addition and subtraction deliberately support only + // ByteSizeDelta, to make sure all values are constructed with explicit units. + + constexpr ByteSizeDelta operator+() const { return *this; } + constexpr ByteSizeDelta operator-() const { + return ByteSizeDelta(-AsChecked()); + } + + constexpr ByteSizeDelta& operator+=(ByteSizeDelta other) { + return *this = AddImpl(other); + } + constexpr ByteSizeDelta& operator-=(ByteSizeDelta other) { + return *this = SubImpl(other); + } + + template + constexpr ByteSizeDelta& operator*=(T value) { + return *this = MulImpl(value); + } + + template + constexpr ByteSizeDelta& operator/=(T value) { + return *this = DivImpl(value); + } + + friend constexpr ByteSizeDelta operator+(ByteSizeDelta left, + ByteSizeDelta right) { + return left.AddImpl(right); + } + + friend constexpr ByteSizeDelta operator-(ByteSizeDelta left, + ByteSizeDelta right) { + return left.SubImpl(right); + } + + template + friend constexpr ByteSizeDelta operator*(ByteSizeDelta left, T right) { + return left.MulImpl(right); + } + template + friend constexpr ByteSizeDelta operator*(T left, ByteSizeDelta right) { + return right * left; + } + + template + friend constexpr ByteSizeDelta operator/(ByteSizeDelta left, T right) { + return left.DivImpl(right); + } + + private: + // Allow ByteSizeBase::AddImpl, etc. to construct from the math result. + friend class ByteSizeBase; + + constexpr explicit ByteSizeDelta(CheckedNumeric checked_bytes) + : ByteSizeBase(checked_bytes.ValueOrDie()) {} +}; + +// Templated functions to construct from various types. Note that integers must +// be converted to CheckedNumeric BEFORE multiplying to detect overflows, while +// floats must be converted AFTER multiplying to avoid premature truncation. +// +// TODO(crbug.com/448661443): After all uses of KiB, etc, are migrated to +// explicit signed/ unsigned, rename KiBU to KiB. + +template + requires std::integral +constexpr ByteSize KiBU(T kib) { + return ByteSize(kib) * 1024; +} + +template + requires std::floating_point +constexpr ByteSize KiBU(T kib) { + return ByteSize(checked_cast(kib * 1024.0)); +} + +template + requires std::integral +constexpr ByteSizeDelta KiBS(T kib) { + return ByteSizeDelta(kib) * 1024; +} + +template + requires std::floating_point +constexpr ByteSizeDelta KiBS(T kib) { + return ByteSizeDelta(checked_cast(kib * 1024.0)); +} + +template + requires std::integral +constexpr ByteSize MiBU(T mib) { + return ByteSize(mib) * 1024 * 1024; +} + +template + requires std::floating_point +constexpr ByteSize MiBU(T mib) { + return ByteSize(checked_cast(mib * 1024.0 * 1024.0)); +} + +template + requires std::integral +constexpr ByteSizeDelta MiBS(T mib) { + return ByteSizeDelta(mib) * 1024 * 1024; +} + +template + requires std::floating_point +constexpr ByteSizeDelta MiBS(T mib) { + return ByteSizeDelta(checked_cast(mib * 1024.0 * 1024.0)); +} + +template + requires std::integral +constexpr ByteSize GiBU(T gib) { + return ByteSize(gib) * 1024 * 1024 * 1024; +} + +template + requires std::floating_point +constexpr ByteSize GiBU(T gib) { + return ByteSize(checked_cast(gib * 1024.0 * 1024.0 * 1024.0)); +} + +template + requires std::integral +constexpr ByteSizeDelta GiBS(T gib) { + return ByteSizeDelta(gib) * 1024 * 1024 * 1024; +} + +template + requires std::floating_point +constexpr ByteSizeDelta GiBS(T gib) { + return ByteSizeDelta(checked_cast(gib * 1024.0 * 1024.0 * 1024.0)); +} + +template + requires std::integral +constexpr ByteSize TiBU(T tib) { + return ByteSize(tib) * 1024 * 1024 * 1024 * 1024; +} + +template + requires std::floating_point +constexpr ByteSize TiBU(T tib) { + return ByteSize( + checked_cast(tib * 1024.0 * 1024.0 * 1024.0 * 1024.0)); +} + +template + requires std::integral +constexpr ByteSizeDelta TiBS(T tib) { + return ByteSizeDelta(tib) * 1024 * 1024 * 1024 * 1024; +} + +template + requires std::floating_point +constexpr ByteSizeDelta TiBS(T tib) { + return ByteSizeDelta( + checked_cast(tib * 1024.0 * 1024.0 * 1024.0 * 1024.0)); +} + +template + requires std::integral +constexpr ByteSize PiBU(T pib) { + return ByteSize(pib) * 1024 * 1024 * 1024 * 1024 * 1024; +} + +template + requires std::floating_point +constexpr ByteSize PiBU(T pib) { + return ByteSize( + checked_cast(pib * 1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0)); +} + +template + requires std::integral +constexpr ByteSizeDelta PiBS(T pib) { + return ByteSizeDelta(pib) * 1024 * 1024 * 1024 * 1024 * 1024; +} + +template + requires std::floating_point +constexpr ByteSizeDelta PiBS(T pib) { + return ByteSizeDelta( + checked_cast(pib * 1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0)); +} + +template + requires std::integral +constexpr ByteSize EiBU(T eib) { + return ByteSize(eib) * 1024 * 1024 * 1024 * 1024 * 1024 * 1024; +} + +template + requires std::floating_point +constexpr ByteSize EiBU(T eib) { + return ByteSize(checked_cast(eib * 1024.0 * 1024.0 * 1024.0 * + 1024.0 * 1024.0 * 1024.0)); +} + +template + requires std::integral +constexpr ByteSizeDelta EiBS(T eib) { + return ByteSizeDelta(eib) * 1024 * 1024 * 1024 * 1024 * 1024 * 1024; +} + +template + requires std::floating_point +constexpr ByteSizeDelta EiBS(T eib) { + return ByteSizeDelta(checked_cast(eib * 1024.0 * 1024.0 * 1024.0 * + 1024.0 * 1024.0 * 1024.0)); +} + +// Stream operators for logging and testing. + +BASE_EXPORT std::ostream& operator<<(std::ostream& os, ByteSize size); +BASE_EXPORT std::ostream& operator<<(std::ostream& os, ByteSizeDelta delta); + +// Implementation. + +// static +constexpr ByteSize ByteSize::FromByteSizeDelta(ByteSizeDelta delta) { + return delta.AsByteSize(); +} + +constexpr ByteSizeDelta ByteSize::AsByteSizeDelta() const { + return ByteSizeDelta(checked_cast(InBytes())); +} + +constexpr ByteSize& ByteSize::operator+=(ByteSizeDelta delta) { + return *this = AddImpl(delta); +} + +constexpr ByteSize& ByteSize::operator-=(ByteSizeDelta delta) { + return *this = SubImpl(delta); +} + +constexpr ByteSizeDelta operator-(ByteSize left, ByteSize right) { + return left.SubImpl(right); +} + +constexpr ByteSize operator+(ByteSize left, ByteSizeDelta right) { + return left.AddImpl(right); +} + +constexpr ByteSize operator+(ByteSizeDelta left, ByteSize right) { + return right + left; +} + +constexpr ByteSize operator-(ByteSize left, ByteSizeDelta right) { + return left.SubImpl(right); +} + +} // namespace base + +#endif // BASE_BYTE_SIZE_H_ diff --git a/naiveproxy/src/base/byte_size_nocompile.nc b/naiveproxy/src/base/byte_size_nocompile.nc new file mode 100644 index 0000000000..d3eb81b15a --- /dev/null +++ b/naiveproxy/src/base/byte_size_nocompile.nc @@ -0,0 +1,90 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This is a "No Compile Test" suite. +// http://dev.chromium.org/developers/testing/no-compile-tests + +#include "base/byte_size.h" + +#include + +#include "base/rand_util.h" + +namespace base { + +void ConstructByteSizeFromSigned() { + // Any runtime signed value not allowed. + [[maybe_unused]] ByteSize bytes(RandInt(-10, 10)); // expected-error {{call to consteval function}} + + // Negative constant not allowed. + [[maybe_unused]] ByteSize bytes2(-1); // expected-error {{call to consteval function}} +} + +void ConstructByteSizeFromFloat() { + [[maybe_unused]] ByteSize bytes(1.0); // expected-error {{calling a private constructor}} +} + +void ConstructByteSizeFromOtherUnit() { + // Any runtime signed value not allowed. + int i = RandInt(-10, 10); + [[maybe_unused]] ByteSize kib = KiBU(i); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize mib = MiBU(i); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize gib = GiBU(i); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize tib = TiBU(i); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize pib = PiBU(i); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize eib = EiBU(i); // expected-error {{not a constant expression}} + + // Negative constant not allowed. + [[maybe_unused]] ByteSize kib2 = KiBU(-1); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize mib2 = MiBU(-1); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize gib2 = GiBU(-1); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize tib2 = TiBU(-1); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize pib2 = PiBU(-1); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize eib2 = EiBU(-1); // expected-error {{not a constant expression}} + + // Out-of-range signed constant not allowed. + constexpr int64_t kLargeInt = std::numeric_limits::max(); + [[maybe_unused]] ByteSize kib3 = KiBU(kLargeInt); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize mib3 = MiBU(kLargeInt); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize gib3 = GiBU(kLargeInt); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize tib3 = TiBU(kLargeInt); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize pib3 = PiBU(kLargeInt); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSize eib3 = EiBU(kLargeInt); // expected-error {{not a constant expression}} +} + +void ConstructByteSizeDeltaFromUnsigned() { + // Any runtime unsigned value not allowed (require explicit cast). + unsigned u = static_cast(RandInt(0, 10)); + [[maybe_unused]] ByteSizeDelta delta(u); // expected-error {{call to consteval function}} + + // Out-of-range constant not allowed. + [[maybe_unused]] ByteSizeDelta delta2(std::numeric_limits::max()); // expected-error {{call to consteval function}} +} + +void ConstructByteSizeDeltaFromFloat() { + [[maybe_unused]] ByteSizeDelta delta(1.0); // expected-error {{calling a private constructor}} +} + +void ConstructByteSizeDeltaFromOtherUnit() { + // Any runtime unsigned value not allowed (require explicit cast). + unsigned u = static_cast(RandInt(0, 10)); + [[maybe_unused]] ByteSizeDelta kib = KiBS(u); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSizeDelta mib = MiBS(u); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSizeDelta gib = GiBS(u); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSizeDelta tib = TiBS(u); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSizeDelta pib = PiBS(u); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSizeDelta eib = EiBS(u); // expected-error {{not a constant expression}} + + // Out-of-range unsigned constant not allowed. + + constexpr uint64_t kLargeUnsigned = std::numeric_limits::max(); + [[maybe_unused]] ByteSizeDelta kib3 = KiBS(kLargeUnsigned); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSizeDelta mib3 = MiBS(kLargeUnsigned); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSizeDelta gib3 = GiBS(kLargeUnsigned); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSizeDelta tib3 = TiBS(kLargeUnsigned); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSizeDelta pib3 = PiBS(kLargeUnsigned); // expected-error {{not a constant expression}} + [[maybe_unused]] ByteSizeDelta eib3 = EiBS(kLargeUnsigned); // expected-error {{not a constant expression}} +} + +} // namespace base diff --git a/naiveproxy/src/base/check_op.h b/naiveproxy/src/base/check_op.h index f49470aeb0..88fe3d9357 100644 --- a/naiveproxy/src/base/check_op.h +++ b/naiveproxy/src/base/check_op.h @@ -128,7 +128,7 @@ template requires(!base::internal::SupportsOstreamOperator && base::internal::SupportsToString) inline char* CheckOpValueStr(const T& v) { - // .ToString() may not return a std::string, e.g. blink::WTF::String. + // .ToString() may not return a std::string, e.g. blink::String. return CheckOpValueStr(v.ToString()); } diff --git a/naiveproxy/src/base/containers/adapters_nocompile_cpp23.nc b/naiveproxy/src/base/containers/adapters_nocompile_cpp23.nc new file mode 100644 index 0000000000..9cd7882f24 --- /dev/null +++ b/naiveproxy/src/base/containers/adapters_nocompile_cpp23.nc @@ -0,0 +1,27 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This is a "No Compile Test" suite. +// http://dev.chromium.org/developers/testing/no-compile-tests + +#include "base/containers/adapters.h" +#include "base/containers/span.h" + +#include +#include + +namespace base { + +void RangeAsRvaluesRequiresNonBorrowedRange() { + std::vector v; + RangeAsRvalues(v); // expected-error {{no matching function for call to 'RangeAsRvalues'}} +} + +void RangeAsRvaluesRequiresMutableRange() { + // A non-mutable range can't be moved from. + const std::vector v; + RangeAsRvalues(std::move(v)); // expected-error {{no matching function for call to 'RangeAsRvalues'}} +} + +} // namespace base diff --git a/naiveproxy/src/base/containers/circular_deque.h b/naiveproxy/src/base/containers/circular_deque.h index 7e8ff24b9e..bb3c53485a 100644 --- a/naiveproxy/src/base/containers/circular_deque.h +++ b/naiveproxy/src/base/containers/circular_deque.h @@ -1109,7 +1109,7 @@ class circular_deque { min_new_capacity = std::max(min_new_capacity, internal::kCircularBufferInitialCapacity); - // std::vector always grows by at least 50%. WTF::Deque grows by at least + // std::vector always grows by at least 50%. blink::Deque grows by at least // 25%. We expect queue workloads to generally stay at a similar size and // grow less than a vector might, so use 25%. SetCapacityTo(std::max(min_new_capacity, cur_capacity + cur_capacity / 4u)); diff --git a/naiveproxy/src/base/containers/flat_tree.h b/naiveproxy/src/base/containers/flat_tree.h index 5422e464e2..3bf060274a 100644 --- a/naiveproxy/src/base/containers/flat_tree.h +++ b/naiveproxy/src/base/containers/flat_tree.h @@ -349,7 +349,7 @@ class flat_tree { // Implementation note: currently we use operator==() and operator<() on // std::vector, because they have the same contract we need, so we use them // directly for brevity and in case it is more optimal than calling equal() - // and lexicograhpical_compare(). If the underlying container type is changed, + // and lexicographical_compare(). If the underlying container type is changed, // this code may need to be modified. void swap(flat_tree& other) noexcept; @@ -364,6 +364,28 @@ class flat_tree { friend void swap(flat_tree& lhs, flat_tree& rhs) noexcept { lhs.swap(rhs); } + // This type should be hashable by Abseil if the contained type(s) are. + template + requires requires(H h, const value_type& value) { + { H::combine(std::move(h), value) } -> std::same_as; + } + friend H AbslHashValue(H h, const flat_tree& tree) { + // Usually Container is contiguous, which allows us to use a faster hash + // algorithm. + if constexpr (std::ranges::contiguous_range) { + auto size = std::ranges::size(tree.body_); + return H::combine(H::combine_contiguous( + std::move(h), std::ranges::data(tree.body_), size), + size); + } + + for (const auto& value : tree) { + h = H::combine(std::move(h), value); + } + h = H::combine(std::move(h), tree.size()); + return h; + } + protected: // Emplaces a new item into the tree that is known not to be in it. This // is for implementing map operator[]. diff --git a/naiveproxy/src/base/containers/heap_array.h b/naiveproxy/src/base/containers/heap_array.h index d8e5c2bb51..47b22a2f3e 100644 --- a/naiveproxy/src/base/containers/heap_array.h +++ b/naiveproxy/src/base/containers/heap_array.h @@ -88,6 +88,29 @@ class TRIVIAL_ABI GSL_OWNER HeapArray { return HeapArray(std::unique_ptr(ptr), size); } + // Constructs a HeapArray from an existing pointer and a deleter instance, + // taking ownership of both. + // + // # Safety + // The pointer must be correctly aligned for type `T` and able to be deleted + // through the provided `deleter` instance. The `ptr` must point to an array + // of at least `size` many elements. If these are not met, then Undefined + // Behaviour can result. + // + // # Checks + // When the `size` is zero, the `ptr` must be null. + UNSAFE_BUFFER_USAGE static HeapArray FromOwningPointer(T* ptr, + size_t size, + deleter_type deleter) { + if (!size) { + CHECK_EQ(ptr, nullptr); + return HeapArray( + std::unique_ptr(nullptr, std::move(deleter)), 0); + } + return HeapArray( + std::unique_ptr(ptr, std::move(deleter)), size); + } + // Constructs an empty array and does not allocate any memory. HeapArray() requires(std::constructible_from) diff --git a/naiveproxy/src/base/containers/heap_array_nocompile.nc b/naiveproxy/src/base/containers/heap_array_nocompile.nc index 05a4be12e2..4245f31ec0 100644 --- a/naiveproxy/src/base/containers/heap_array_nocompile.nc +++ b/naiveproxy/src/base/containers/heap_array_nocompile.nc @@ -27,7 +27,7 @@ void WontCompileUninithNonTrivialClass() { void WontCompileWithSizeConstructorRequiresArgs() { auto vec = HeapArray::WithSize(2u); // expected-error {{constraints not satisfied}} - // expected-error@*:* 0-1 {{no matching constructor for initialization}} + // expected-error@*:* {{no matching constructor for initialization}} } void WontCompileUninitConstructorRequiresArgs() { diff --git a/naiveproxy/src/base/containers/map_util.h b/naiveproxy/src/base/containers/map_util.h index 70ede354e6..83358a953f 100644 --- a/naiveproxy/src/base/containers/map_util.h +++ b/naiveproxy/src/base/containers/map_util.h @@ -35,22 +35,6 @@ constexpr internal::MappedType* FindOrNull(Map& map, const Key& key) { return it != map.end() ? &it->second : nullptr; } -// Returns the const pointer value associated with the given key. If none is -// found, null is returned. The function is designed to be used with a map of -// keys to pointers or smart pointers. -// -// This function does not distinguish between a missing key and a key mapped -// to a null value. -template >::element_type> -constexpr const MappedElementType* FindPtrOrNull(const Map& map, - const Key& key) { - auto it = map.find(key); - return it != map.end() ? base::to_address(it->second) : nullptr; -} - // Returns the pointer value associated with the given key. If none is found, // null is returned. The function is designed to be used with a map of keys to // pointers or smart pointers. @@ -61,7 +45,7 @@ template >::element_type> -constexpr MappedElementType* FindPtrOrNull(Map& map, const Key& key) { +constexpr MappedElementType* FindPtrOrNull(const Map& map, const Key& key) { auto it = map.find(key); return it != map.end() ? base::to_address(it->second) : nullptr; } @@ -85,7 +69,7 @@ constexpr MappedElementType* FindPtrOrNull(Map& map, const Key& key) { // TODO(crbug.com/376532871): This can be removed once map::operator[] and // map::insert_or_assign support heterogenous key overloads, in C++26. template >::element_type> Map::iterator InsertOrAssign(Map& map, diff --git a/naiveproxy/src/base/containers/variant_map.cc b/naiveproxy/src/base/containers/variant_map.cc new file mode 100644 index 0000000000..b6d7ceafc2 --- /dev/null +++ b/naiveproxy/src/base/containers/variant_map.cc @@ -0,0 +1,39 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/containers/variant_map.h" + +#include + +#include "base/feature_list.h" + +namespace base { + +namespace { + +// Whether the "AbslFlatMapInVariantMap" feature is enabled. +// +// An atomic is used because this can be queried racily by a thread checking +// which map type to use and another thread initializing this after FeatureList +// initialization. All operations use std::memory_order_relaxed because there +// are no dependent memory operations. +std::atomic_bool g_is_absl_flat_map_in_variant_map_enabled{false}; + +// Whether absl::flat_hash_map is used by default instead of std::map in +// base::VariantMap. +BASE_FEATURE(kAbslFlatMapInVariantMap, FEATURE_DISABLED_BY_DEFAULT); + +} // namespace + +bool IsAbslFlatMapInVariantMapEnabled() { + return g_is_absl_flat_map_in_variant_map_enabled.load( + std::memory_order_relaxed); +} + +void InitializeVariantMapFeatures() { + g_is_absl_flat_map_in_variant_map_enabled.store( + FeatureList::IsEnabled(kAbslFlatMapInVariantMap)); +} + +} // namespace base diff --git a/naiveproxy/src/base/containers/variant_map.h b/naiveproxy/src/base/containers/variant_map.h new file mode 100644 index 0000000000..246792c886 --- /dev/null +++ b/naiveproxy/src/base/containers/variant_map.h @@ -0,0 +1,317 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_VARIANT_MAP_H_ +#define BASE_CONTAINERS_VARIANT_MAP_H_ + +#include +#include + +#include "base/check_op.h" +#include "base/features.h" +#include "base/gtest_prod_util.h" +#include "base/notreached.h" +#include "base/types/pass_key.h" +#include "build/build_config.h" +#include "third_party/abseil-cpp/absl/container/flat_hash_map.h" + +namespace metrics { +class SubprocessMetricsProvider; +} + +namespace mojo { +template +class BinderMapWithContext; + +class ReceiverSetState; + +template +class ReceiverSetBase; +} + +namespace resource_attribution { +class CPUMeasurementMonitor; +class FakeMemoryMeasurementDelegateFactory; +class MemoryMeasurementDelegate; +class QueryResultMap; +} // namespace resource_attribution + +namespace base { + +// Enum to specify which underlying map implementation to use. +enum class MapType { + // See StdMapVariant + kStdMap, + // See FlatHashMapVariant + kFlatHashMap, +}; + +// Whether the AbslFlatMapInVariantMap feature is enabled. +BASE_EXPORT bool IsAbslFlatMapInVariantMapEnabled(); + +// Initializes VariantMap features. See `base::features::Init()`. +BASE_EXPORT void InitializeVariantMapFeatures(); + +// Class used to evaluate the performance of switching from std::map to +// absl::flat_hash_map in place. This class is used exactly like the underlying +// map implementation for the implemented subset of operations. Constructing can +// be done with a chosen `MapType` or if the default constructor is used the +// variant is chosen automatically with a base::Feature. +// +// Example: +// VariantMap map(MapType::kFlatHashMap); +// map[4] = 5; +// +// Since this class supports backing map implementations with different +// guarantees users have to assume that the least permissive guarantees apply. +// This includes but is not limited to: +// 1) No specific entry ordering +// 2) No iterator stability through modifications +// 3) No storage stability through modifications +// +// TODO(crbug.com/433462519): Remove this entire class by M145. +template +class VariantMap { + public: + using StdMapVariant = std::map; + using FlatHashMapVariant = absl::flat_hash_map; + using value_type = std::pair; + + // Iterator class used to erase the difference in backend variant. This should + // mostly be a drop-in replacement for the iterator types of the underlying + // map and user code that already uses `auto` for iterator variables should + // not need to be updated. + template + class IteratorImpl { + public: + using StdMapIter = + std::conditional_t; + using FlatHashMapIter = + std::conditional_t; + + using pointer = + std::conditional_t; + using reference = + std::conditional_t; + + explicit IteratorImpl(StdMapIter it) : iter_variant_(it) {} + explicit IteratorImpl(FlatHashMapIter it) : iter_variant_(it) {} + + // Allow narrowing access from a non-const iterator to a const iterator but + // not the opposite. + template + requires(is_const && !other_is_const) + explicit IteratorImpl(IteratorImpl other) + : iter_variant_(std::visit( + [](const auto& it) { return decltype(iter_variant_)(it); }, + other.iter_variant_)) {} + + IteratorImpl& operator++() { + std::visit([](auto& it) { ++it; }, iter_variant_); + return *this; + } + + reference operator*() const { + return std::visit([](auto& it) -> reference { return *it; }, + iter_variant_); + } + + pointer operator->() const { + // Tie the implementation of this operator to operator*. + // *this accesses this instance * of that uses the * operator. + // & of that result is a pointer to the value. + return &(**this); + } + + bool operator==(const IteratorImpl& other) const { + // Comparing iterators from different variants should never happen. + CHECK_EQ(iter_variant_.index(), other.iter_variant_.index()); + + return iter_variant_ == other.iter_variant_; + } + + private: + template + friend class IteratorImpl; + + // For access to `iter_variant_`. + friend class VariantMap; + + // The variant holds the specific iterator from the underlying map. + std::variant iter_variant_; + }; + + using iterator = IteratorImpl; + using const_iterator = IteratorImpl; + + // Protected by PassKey because not intended for general use but only + // experimenting. + template + explicit VariantMap( + base::PassKey> passkey) + : VariantMap() {} + + template + explicit VariantMap( + base::PassKey> passkey) + : VariantMap() {} + + explicit VariantMap(base::PassKey passkey) + : VariantMap() {} + + explicit VariantMap(base::PassKey passkey) + : VariantMap() {} + + explicit VariantMap( + base::PassKey passkey) + : VariantMap() {} + + explicit VariantMap( + base::PassKey + passkey) + : VariantMap() {} + + explicit VariantMap( + base::PassKey passkey) + : VariantMap() {} + + explicit VariantMap( + base::PassKey passkey) + : VariantMap() {} + + size_t size() const { + return std::visit([](const auto& map) { return map.size(); }, data_); + } + + bool empty() const { + return std::visit([](const auto& map) { return map.empty(); }, data_); + } + + void clear() { + return std::visit([](auto& map) { return map.clear(); }, data_); + } + + Value& operator[](const Key& key) { + return std::visit([&key](auto& map) -> Value& { return map[key]; }, data_); + } + + Value& at(const Key& key) { + return std::visit([&key](auto& map) -> Value& { return map.at(key); }, + data_); + } + + const Value& at(const Key& key) const { + return std::visit( + [&key](const auto& map) -> const Value& { return map.at(key); }, data_); + } + + template + std::pair emplace(Args&&... args) { + return std::visit( + [&](auto& map) { + auto result = map.emplace(std::forward(args)...); + return std::make_pair(iterator(result.first), result.second); + }, + data_); + } + + template + std::pair try_emplace(Args&&... args) { + return std::visit( + [&](auto& map) { + auto result = map.try_emplace(std::forward(args)...); + return std::make_pair(iterator(result.first), result.second); + }, + data_); + } + + std::pair insert(value_type&& value) { + return std::visit( + [&](auto& map) { + auto result = map.insert(std::move(value)); + return std::make_pair(iterator(result.first), result.second); + }, + data_); + } + + size_t erase(const Key& key) { + return std::visit([&](auto& map) { return map.erase(key); }, data_); + } + + void erase(iterator pos) { + std::visit( + [&](auto& map) { + // Get the correct native_iterator out. + using MapType = typename std::decay::type; + auto native_it = + std::get(pos.iter_variant_); + + map.erase(native_it); + }, + data_); + } + + iterator begin() { + return std::visit([](auto& map) { return iterator(map.begin()); }, data_); + } + const_iterator begin() const { + return const_iterator(const_cast(this)->begin()); + } + + iterator end() { + return std::visit([](auto& map) { return iterator(map.end()); }, data_); + } + const_iterator end() const { + return const_iterator(const_cast(this)->end()); + } + + iterator find(const Key& key) { + return std::visit([&key](auto& map) { return iterator(map.find(key)); }, + data_); + } + const_iterator find(const Key& key) const { + return const_iterator(const_cast(this)->find(key)); + } + + private: + FRIEND_TEST_ALL_PREFIXES(VariantMapTest, Construction); + FRIEND_TEST_ALL_PREFIXES(VariantMapTest, Insertion); + FRIEND_TEST_ALL_PREFIXES(VariantMapTest, At); + FRIEND_TEST_ALL_PREFIXES(VariantMapTest, Find); + FRIEND_TEST_ALL_PREFIXES(VariantMapTest, Iteration); + FRIEND_TEST_ALL_PREFIXES(VariantMapTest, Empty); + FRIEND_TEST_ALL_PREFIXES(VariantMapTest, Clear); + + using Map = std::variant; + + // Constructors private because protected via PassKey. + + explicit VariantMap(MapType type) + : data_([&]() { + switch (type) { + case MapType::kStdMap: + return Map(std::in_place_index_t<0>()); + case MapType::kFlatHashMap: + return Map(std::in_place_index_t<1>()); + + NOTREACHED(); + } + }()) {} + + VariantMap() + : VariantMap(base::IsAbslFlatMapInVariantMapEnabled() + ? MapType::kFlatHashMap + : MapType::kStdMap) {} + + // The variant that holds one of the two map types. + Map data_; +}; + +} // namespace base + +#endif // BASE_CONTAINERS_VARIANT_MAP_H_ diff --git a/naiveproxy/src/base/debug/asan_invalid_access.cc b/naiveproxy/src/base/debug/asan_invalid_access.cc index a615289f0d..5cebf9ae0f 100644 --- a/naiveproxy/src/base/debug/asan_invalid_access.cc +++ b/naiveproxy/src/base/debug/asan_invalid_access.cc @@ -11,9 +11,9 @@ #include -#include #include "base/check.h" +#include "base/containers/heap_array.h" #include "base/debug/alias.h" #include "base/immediate_crash.h" #include "build/build_config.h" @@ -33,8 +33,8 @@ namespace { NOINLINE void CorruptMemoryBlock(bool induce_crash) { // NOTE(sebmarchand): We intentionally corrupt a memory block here in order to // trigger an Address Sanitizer (ASAN) error report. - static const int kArraySize = 5; - LONG* array = new LONG[kArraySize]; + static const size_t kArraySize = 5; + auto array = base::HeapArray::Uninit(kArraySize); // Explicitly call out to a kernel32 function to perform the memory access. // This way the underflow won't be detected but the corruption will (as the @@ -44,13 +44,12 @@ NOINLINE void CorruptMemoryBlock(bool induce_crash) { GetProcAddress(GetModuleHandle(L"kernel32"), "InterlockedIncrement")); CHECK(InterlockedIncrementFn); - LONG volatile dummy = InterlockedIncrementFn(array - 1); + LONG volatile dummy = InterlockedIncrementFn(array.data() - 1); base::debug::Alias(const_cast(&dummy)); if (induce_crash) { base::ImmediateCrash(); } - delete[] array; } #endif // BUILDFLAG(IS_WIN) && defined(ADDRESS_SANITIZER) @@ -67,16 +66,15 @@ static const size_t kArraySize = 4; void AsanHeapOverflow() { // Declares the array as volatile to make sure it doesn't get optimized away. - std::unique_ptr array( - const_cast(new int[kArraySize])); - int dummy = array[kArraySize]; + auto array = base::HeapArray::Uninit(kArraySize); + // SAFETY: required for test. + int dummy = UNSAFE_BUFFERS(array.data()[kArraySize]); base::debug::Alias(&dummy); } void AsanHeapUnderflow() { // Declares the array as volatile to make sure it doesn't get optimized away. - std::unique_ptr array( - const_cast(new int[kArraySize])); + auto array = base::HeapArray::Uninit(kArraySize); // We need to store the underflow address in a temporary variable as trying to // access array[-1] will trigger a warning C4245: "conversion from 'int' to // 'size_t', signed/unsigned mismatch". @@ -87,10 +85,9 @@ void AsanHeapUnderflow() { void AsanHeapUseAfterFree() { // Declares the array as volatile to make sure it doesn't get optimized away. - std::unique_ptr array( - const_cast(new int[kArraySize])); - volatile int* dangling = array.get(); - array.reset(); + auto array = base::HeapArray::Uninit(kArraySize); + volatile int* dangling = array.data(); + array = base::HeapArray(); int dummy = dangling[kArraySize / 2]; base::debug::Alias(&dummy); } diff --git a/naiveproxy/src/base/debug/debugger.cc b/naiveproxy/src/base/debug/debugger.cc index 4d2232ec2f..1822c2f021 100644 --- a/naiveproxy/src/base/debug/debugger.cc +++ b/naiveproxy/src/base/debug/debugger.cc @@ -7,6 +7,7 @@ #include "base/clang_profiling_buildflags.h" #include "base/logging.h" #include "base/threading/platform_thread.h" +#include "base/time/time.h" #include "build/build_config.h" #if BUILDFLAG(CLANG_PROFILING) diff --git a/naiveproxy/src/base/debug/dwarf_line_no.cc b/naiveproxy/src/base/debug/dwarf_line_no.cc index 40c3222006..f37dab0471 100644 --- a/naiveproxy/src/base/debug/dwarf_line_no.cc +++ b/naiveproxy/src/base/debug/dwarf_line_no.cc @@ -797,8 +797,10 @@ bool GetCompileUnitName(int fd, debug_abbrev.sh_offset + abbrev_offset); uint64_t tag; bool has_children; - AdvancedReaderToAttributeList(abbrev_reader, debug_abbrev_end, - abbreviation_code, tag, has_children); + if (!AdvancedReaderToAttributeList(abbrev_reader, debug_abbrev_end, + abbreviation_code, tag, has_children)) { + return false; + } // Ignore if it has children. static constexpr int kDW_TAG_compile_unit = 0x11; diff --git a/naiveproxy/src/base/debug/elf_reader.cc b/naiveproxy/src/base/debug/elf_reader.cc index 2d4cf7f1e0..d618c69840 100644 --- a/naiveproxy/src/base/debug/elf_reader.cc +++ b/naiveproxy/src/base/debug/elf_reader.cc @@ -162,8 +162,12 @@ std::optional ReadElfLibraryName( for (const Dyn* dynamic_iter = dynamic_start; dynamic_iter < dynamic_end; ++dynamic_iter) { if (dynamic_iter->d_tag == DT_STRTAB) { -#if BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_ANDROID) - // Fuchsia and Android do not relocate the symtab pointer on ELF load. +#if BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_ANDROID) || \ + (defined(ARCH_CPU_RISCV_FAMILY) && BUILDFLAG(IS_LINUX)) + // Fuchsia and Android do not relocate the strtab pointer on ELF load. + // When the dynamic section is readonly, the strtab pointer is also not + // relocated. This is the default ABI behavior on RISC-V GNU Linux (See + // sysdeps/riscv/dl-relocate-ld.h). strtab_addr = static_cast(dynamic_iter->d_un.d_ptr) + reinterpret_cast(relocation_offset); #else diff --git a/naiveproxy/src/base/debug/proc_maps_linux.cc b/naiveproxy/src/base/debug/proc_maps_linux.cc index ea6f59ab0a..dd9f551c31 100644 --- a/naiveproxy/src/base/debug/proc_maps_linux.cc +++ b/naiveproxy/src/base/debug/proc_maps_linux.cc @@ -188,7 +188,7 @@ std::optional ParseSmapsRollup(const std::string& buffer) { std::vector lines = SplitString(buffer, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); - std::unordered_map tmp; + std::unordered_map tmp; for (const auto& line : lines) { // This should be more than enough space for any output we get (but we also // verify the size below). @@ -200,7 +200,7 @@ std::optional ParseSmapsRollup(const std::string& buffer) { // here. |resize| does not count the length of the nul-byte, and we want // to trim off the trailing colon at the end, so we use |strlen - 1| here. key.resize(strlen(key.c_str()) - 1); - tmp[key] = val * 1024; + tmp[key] = KiB(val); } } diff --git a/naiveproxy/src/base/debug/proc_maps_linux.h b/naiveproxy/src/base/debug/proc_maps_linux.h index 41791accbf..2fc22c603b 100644 --- a/naiveproxy/src/base/debug/proc_maps_linux.h +++ b/naiveproxy/src/base/debug/proc_maps_linux.h @@ -12,6 +12,7 @@ #include #include "base/base_export.h" +#include "base/byte_count.h" namespace base::debug { @@ -101,16 +102,15 @@ BASE_EXPORT bool ReadProcMaps(std::string* proc_maps); BASE_EXPORT bool ParseProcMaps(const std::string& input, std::vector* regions); -// All values are in bytes. struct SmapsRollup { - size_t rss = 0; - size_t pss = 0; - size_t pss_anon = 0; - size_t pss_file = 0; - size_t pss_shmem = 0; - size_t private_dirty = 0; - size_t swap = 0; - size_t swap_pss = 0; + ByteCount rss = ByteCount(0); + ByteCount pss = ByteCount(0); + ByteCount pss_anon = ByteCount(0); + ByteCount pss_file = ByteCount(0); + ByteCount pss_shmem = ByteCount(0); + ByteCount private_dirty = ByteCount(0); + ByteCount swap = ByteCount(0); + ByteCount swap_pss = ByteCount(0); }; // Attempts to read /proc/self/smaps_rollup. Returns nullopt on error. diff --git a/naiveproxy/src/base/debug/stack_trace.cc b/naiveproxy/src/base/debug/stack_trace.cc index 595b6c1fd8..8de552c24c 100644 --- a/naiveproxy/src/base/debug/stack_trace.cc +++ b/naiveproxy/src/base/debug/stack_trace.cc @@ -7,11 +7,15 @@ #include #include +#include #include #include +#include "base/byte_count.h" #include "base/check_op.h" #include "base/debug/debugging_buildflags.h" +#include "base/features.h" +#include "base/numerics/clamped_math.h" #include "build/build_config.h" #include "build/config/compiler/compiler_buildflags.h" @@ -50,6 +54,13 @@ constexpr size_t kStackFrameAdjustment = sizeof(uintptr_t); constexpr size_t kStackFrameAdjustment = 0; #endif +// The max gap threshold in bytes for stack scanning. If the gap between a frame +// pointer to stack end is beyond this threshold, stack end is deemed as +// unreliable and stack scan stops. The value is initialized from the param of +// `kStackScanMaxFramePointerToStackEndGap` feature if the feature is enabled. +constinit std::optional g_stack_scan_max_fp_to_stack_end_gap_bytes{ + std::nullopt}; + // On Arm-v8.3+ systems with pointer authentication codes (PAC), signature bits // are set in the top bits of the pointer, which confuses test assertions. // Because the signature size can vary based on the system configuration, use @@ -149,9 +160,22 @@ uintptr_t ScanStackForNextFrame(uintptr_t fp, uintptr_t stack_end) { return 0; } + if (g_stack_scan_max_fp_to_stack_end_gap_bytes.has_value()) { + // If `stack_end` is below `fp`, or is too far above `fp`, do not scan since + // `stack_end` is likely not a good indication of stack end and it is too + // dangerous to scan without knowing the stack end. + // See https://crbug.com/402542102 for the context. + if (stack_end < fp || + (stack_end - fp) > *g_stack_scan_max_fp_to_stack_end_gap_bytes) { + return 0; + } + } + fp += sizeof(uintptr_t); // current frame is known to be invalid uintptr_t last_fp_to_scan = - std::min(fp + kMaxStackScanArea, stack_end) - sizeof(uintptr_t); + (base::ClampedNumeric(fp) + kMaxStackScanArea).Min(stack_end) - + sizeof(uintptr_t); + for (; fp <= last_fp_to_scan; fp += sizeof(uintptr_t)) { uintptr_t next_fp = GetNextStackFrame(fp); if (IsStackFrameValid(next_fp, fp, stack_end)) { @@ -295,6 +319,18 @@ bool StackTrace::WillSymbolizeToStreamForTesting() { #endif } +// static +void StackTrace::InitializeFeatures() { +#if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS) + if (FeatureList::IsEnabled( + features::kStackScanMaxFramePointerToStackEndGap)) { + g_stack_scan_max_fp_to_stack_end_gap_bytes = + MiB(features::kStackScanMaxFramePointerToStackEndGapThresholdMB.Get()) + .InBytesUnsigned(); + } +#endif // BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS) +} + void StackTrace::Print() const { PrintWithPrefix({}); } diff --git a/naiveproxy/src/base/debug/stack_trace.h b/naiveproxy/src/base/debug/stack_trace.h index a9129db48a..8b4ca96b9e 100644 --- a/naiveproxy/src/base/debug/stack_trace.h +++ b/naiveproxy/src/base/debug/stack_trace.h @@ -41,6 +41,15 @@ namespace base::debug { // done in official builds because it has security implications). BASE_EXPORT bool EnableInProcessStackDumping(); +#if BUILDFLAG(IS_WIN) +// Returns `true` if EnableInProcessStackDumping() was called and succeeded. +// Only supported on Windows. +BASE_EXPORT bool InProcessStackDumpingEnabled(); + +// Allows tests to exercise code that runs when symbolization is not available. +BASE_EXPORT bool DisableInProcessStackDumpingForTesting(); +#endif // BUILDFLAG(IS_WIN) + #if BUILDFLAG(IS_POSIX) // Sets a first-chance callback for the stack dump signal handler. This callback // is called at the beginning of the signal handler to handle special kinds of @@ -100,6 +109,9 @@ class BASE_EXPORT StackTrace { // symbolized frames when printing a stack trace. static bool WillSymbolizeToStreamForTesting(); + // Initialize features. + static void InitializeFeatures(); + // Copying and assignment are allowed with the default functions. // Gets an array of instruction pointer values. |*count| will be set to the diff --git a/naiveproxy/src/base/debug/stack_trace_android.cc b/naiveproxy/src/base/debug/stack_trace_android.cc index a184a51a0c..a38c22014d 100644 --- a/naiveproxy/src/base/debug/stack_trace_android.cc +++ b/naiveproxy/src/base/debug/stack_trace_android.cc @@ -49,7 +49,7 @@ _Unwind_Reason_Code TraceStackFrame(_Unwind_Context* context, void* arg) { return _URC_NO_REASON; } - state->frames[state->frame_count++] = ip; + UNSAFE_TODO(state->frames[state->frame_count++] = ip); if (state->frame_count >= state->max_depth) { return _URC_END_OF_STACK; } @@ -71,8 +71,7 @@ bool EnableInProcessStackDumping() { // to be ignored. Therefore, when testing that same code, it should run // with SIGPIPE ignored as well. // TODO(phajdan.jr): De-duplicate this SIGPIPE code. - struct sigaction action; - UNSAFE_TODO(memset(&action, 0, sizeof(action))); + struct sigaction action = {}; action.sa_handler = SIG_IGN; sigemptyset(&action.sa_mask); return (sigaction(SIGPIPE, &action, NULL) == 0); diff --git a/naiveproxy/src/base/debug/stack_trace_win.cc b/naiveproxy/src/base/debug/stack_trace_win.cc index 7220bd4211..68715b10cc 100644 --- a/naiveproxy/src/base/debug/stack_trace_win.cc +++ b/naiveproxy/src/base/debug/stack_trace_win.cc @@ -39,6 +39,9 @@ DWORD g_init_error = ERROR_SUCCESS; // here. DWORD g_status_info_length_mismatch = 0xC0000004; +// Are symbolized in-process stack dumps enabled? +bool g_in_process_stack_dumps_enabled = false; + // Prints the exception call stack. // This is the unit tests exception filter. long WINAPI StackDumpExceptionFilter(EXCEPTION_POINTERS* info) { @@ -308,6 +311,18 @@ class SymbolContext { Lock lock_; }; +// Raw output when symbols are not available. +void OutputAddressesWithPrefix(std::ostream* os, + cstring_view prefix_string, + span addresses) { + for (const void* const addr : addresses) { + (*os) << prefix_string << "\t" << addr << "\n"; + if (!os->good()) { + break; + } + } +} + } // namespace bool EnableInProcessStackDumping() { @@ -318,7 +333,18 @@ bool EnableInProcessStackDumping() { // Need to initialize symbols early in the process or else this fails on // swarming (since symbols are in different directory than in the exes) and // also release x64. - return InitializeSymbols(); + g_in_process_stack_dumps_enabled = InitializeSymbols(); + return g_in_process_stack_dumps_enabled; +} + +bool InProcessStackDumpingEnabled() { + return g_in_process_stack_dumps_enabled; +} + +bool DisableInProcessStackDumpingForTesting() { + g_previous_filter = SetUnhandledExceptionFilter(g_previous_filter); + g_in_process_stack_dumps_enabled = false; + return true; } NOINLINE size_t CollectStackTrace(span trace) { @@ -353,8 +379,7 @@ void StackTrace::InitTrace(const CONTEXT* context_record) { // When walking an exception stack, we need to use StackWalk64(). count_ = 0; // Initialize stack walking. - STACKFRAME64 stack_frame; - UNSAFE_TODO(memset(&stack_frame, 0, sizeof(stack_frame))); + STACKFRAME64 stack_frame = {}; #if defined(ARCH_CPU_X86_64) DWORD machine_type = IMAGE_FILE_MACHINE_AMD64; stack_frame.AddrPC.Offset = context_record->Rip; @@ -399,15 +424,18 @@ void StackTrace::PrintWithPrefixImpl(cstring_view prefix_string) const { void StackTrace::OutputToStreamWithPrefixImpl( std::ostream* os, cstring_view prefix_string) const { - SymbolContext* context = SymbolContext::GetInstance(); - if (g_init_error != ERROR_SUCCESS) { - (*os) << "Error initializing symbols (" << g_init_error - << "). Dumping unresolved backtrace:\n"; - for (size_t i = 0; (i < count_) && os->good(); ++i) { - (*os) << prefix_string << "\t" << trace_[i] << "\n"; - } + if (!InProcessStackDumpingEnabled()) { + (*os) << "Symbols not available. Dumping unresolved backtrace:\n"; + OutputAddressesWithPrefix(os, prefix_string, addresses()); } else { - context->OutputTraceToStream(addresses(), os, prefix_string); + SymbolContext* context = SymbolContext::GetInstance(); + if (g_init_error != ERROR_SUCCESS) { + (*os) << "Error initializing symbols (" << g_init_error + << "). Dumping unresolved backtrace:\n"; + OutputAddressesWithPrefix(os, prefix_string, addresses()); + } else { + context->OutputTraceToStream(addresses(), os, prefix_string); + } } } diff --git a/naiveproxy/src/base/debug/test_elf_image_builder.cc b/naiveproxy/src/base/debug/test_elf_image_builder.cc index dd4d0f0bde..027ad0f959 100644 --- a/naiveproxy/src/base/debug/test_elf_image_builder.cc +++ b/naiveproxy/src/base/debug/test_elf_image_builder.cc @@ -270,7 +270,8 @@ TestElfImage TestElfImageBuilder::Build() { Dyn strtab_dyn; strtab_dyn.d_tag = DT_STRTAB; -#if BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_ANDROID) || \ + (defined(ARCH_CPU_RISCV_FAMILY) && BUILDFLAG(IS_LINUX)) // Fuchsia and Android do not alter the symtab pointer on ELF load -- it's // expected to remain a 'virutal address'. strtab_dyn.d_un.d_ptr = diff --git a/naiveproxy/src/base/feature_list.cc b/naiveproxy/src/base/feature_list.cc index 439f49d9e3..7aad398a3b 100644 --- a/naiveproxy/src/base/feature_list.cc +++ b/naiveproxy/src/base/feature_list.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/location.h" +#include "base/feature_list.h" #ifdef UNSAFE_BUFFERS_BUILD // TODO(crbug.com/40284755): Remove this and spanify to fix the errors. #pragma allow_unsafe_buffers @@ -17,12 +17,13 @@ #include "base/base_switches.h" #include "base/check_is_test.h" +#include "base/command_line.h" #include "base/containers/contains.h" #include "base/containers/span.h" #include "base/debug/crash_logging.h" #include "base/debug/dump_without_crashing.h" -#include "base/feature_list.h" #include "base/feature_visitor.h" +#include "base/location.h" #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" diff --git a/naiveproxy/src/base/feature_list.h b/naiveproxy/src/base/feature_list.h index ada523119e..30a5733aac 100644 --- a/naiveproxy/src/base/feature_list.h +++ b/naiveproxy/src/base/feature_list.h @@ -69,14 +69,49 @@ enum FeatureState { // Provides a definition for `kFeature` with `name` and `default_state`, e.g. // -// BASE_FEATURE(kMyFeature, "MyFeature", base::FEATURE_DISABLED_BY_DEFAULT); +// This macro can be used in two ways: +// +// 1. With two arguments, to define a feature whose name is derived from the C++ +// identifier. This form is preferred, as it avoids repeating the feature +// name and helps prevent typos. +// +// BASE_FEATURE(kMyFeature, base::FEATURE_DISABLED_BY_DEFAULT); +// +// This is equivalent to: +// +// BASE_FEATURE(kMyFeature, "MyFeature", +// base::FEATURE_DISABLED_BY_DEFAULT); +// +// 2. With three arguments, to explicitly specify the C++ identifier and the +// name of the feature. This form should be used only if the feature needs +// to have a C++ identifier that does not match the feature name, which +// should be rare. +// +// BASE_FEATURE(kMyFeature, "MyFeatureName", +// base::FEATURE_DISABLED_BY_DEFAULT); // // Features should *not* be defined in header files; do not use this macro in // header files. -#define BASE_FEATURE(feature, name, default_state) \ - constinit const base::Feature feature( \ +#define BASE_FEATURE_INTERNAL_3_ARGS(feature, name, default_state) \ + constinit const base::Feature feature( \ name, default_state, base::internal::FeatureMacroHandshake::kSecret) +// TODO(crbug.com/436274260): Use constexpr lambda to avoid the namespace hack +// after C++23 is supported. See https://godbolt.org/z/W3sdhresP for the syntax. +#define BASE_FEATURE_INTERNAL_2_ARGS(feature, default_state) \ + namespace base_feature_internal_##feature { \ + static_assert(#feature[0] == 'k'); \ + static constexpr base::internal::StringStorage feature##Name(#feature); \ + } \ + constinit const base::Feature feature( \ + base_feature_internal_##feature::feature##Name.storage.data(), \ + default_state, base::internal::FeatureMacroHandshake::kSecret) + +#define GET_BASE_FEATURE_MACRO(_1, _2, _3, NAME, ...) NAME +#define BASE_FEATURE(...) \ + GET_BASE_FEATURE_MACRO(__VA_ARGS__, BASE_FEATURE_INTERNAL_3_ARGS, \ + BASE_FEATURE_INTERNAL_2_ARGS)(__VA_ARGS__) + // Provides a forward declaration for `feature_object_name` in a header file, // e.g. // @@ -147,11 +182,32 @@ enum FeatureState { &field_trial_params_internal:: \ GetFeatureParamWithCacheFor##feature_object_name) +namespace internal { // Secret handshake to (try to) ensure all places that construct a base::Feature // go through the helper `BASE_FEATURE()` macro above. -namespace internal { enum class FeatureMacroHandshake { kSecret }; -} + +// Storage class for feature name. This is needed so we store the feature name +// "MyFeature" instead of the feature identifier name "kMyFeature" in .rodata. +template +struct StringStorage { + explicit constexpr StringStorage(base::span feature) { + static_assert(N > 2, "Feature name cannot be too short."); + for (size_t i = 0; i < N; ++i) { + storage[i] = feature[i + 1]; + } + } + + std::array storage; +}; + +// Deduce how much storage is needed for a given string literal. `feature` +// includes space for a NUL terminator; `StringStorage` also needs storage +// for the NUL terminator but drops the first character. +template +StringStorage(const char (&feature)[N]) -> StringStorage; + +} // namespace internal // The Feature struct is used to define the default state for a feature. There // must only ever be one struct instance for a given feature name—generally diff --git a/naiveproxy/src/base/feature_visitor.h b/naiveproxy/src/base/feature_visitor.h index 47732397bf..7a058e49bb 100644 --- a/naiveproxy/src/base/feature_visitor.h +++ b/naiveproxy/src/base/feature_visitor.h @@ -10,10 +10,6 @@ #include "base/feature_list.h" -namespace variations::cros_early_boot::evaluate_seed { -class EarlyBootFeatureVisitor; -} - namespace gin { class V8FeatureVisitor; } @@ -44,7 +40,6 @@ class FeatureVisitor { const std::string& group_name) = 0; private: - friend variations::cros_early_boot::evaluate_seed::EarlyBootFeatureVisitor; friend gin::V8FeatureVisitor; friend TestFeatureVisitor; diff --git a/naiveproxy/src/base/features.cc b/naiveproxy/src/base/features.cc index f75a71a805..4b0efd90ea 100644 --- a/naiveproxy/src/base/features.cc +++ b/naiveproxy/src/base/features.cc @@ -6,6 +6,8 @@ #include +#include "base/containers/variant_map.h" +#include "base/debug/stack_trace.h" #include "base/files/file_path.h" #include "base/task/sequence_manager/sequence_manager_impl.h" #include "base/threading/platform_thread.h" @@ -49,18 +51,19 @@ std::atomic_bool g_is_reduce_ppms_enabled{false}; // Alphabetical: +// When enabled, the compositor threads (including GPU) will be boosted to +// kInteractive when not in input or loading scenarios. +BASE_FEATURE(kBoostCompositorThreadsPriorityWhenIdle, + FEATURE_DISABLED_BY_DEFAULT); + // Controls caching within BASE_FEATURE_PARAM(). This is feature-controlled // so that ScopedFeatureList can disable it to turn off caching. -BASE_FEATURE(kFeatureParamWithCache, - "FeatureParamWithCache", - FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kFeatureParamWithCache, FEATURE_ENABLED_BY_DEFAULT); // Whether a fast implementation of FilePath::IsParent is used. This feature // exists to ensure that the fast implementation can be disabled quickly if // issues are found with it. -BASE_FEATURE(kFastFilePathIsParent, - "FastFilePathIsParent", - FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kFastFilePathIsParent, FEATURE_ENABLED_BY_DEFAULT); // Use non default low memory device threshold. // Value should be given via |LowMemoryDeviceThresholdMB|. @@ -75,23 +78,45 @@ BASE_FEATURE(kFastFilePathIsParent, // Updated Desktop default threshold to match the Android 2021 definition. #define LOW_MEMORY_DEVICE_THRESHOLD_MB 2048 #endif -BASE_FEATURE(kLowEndMemoryExperiment, - "LowEndMemoryExperiment", - FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE_PARAM(size_t, +BASE_FEATURE(kLowEndMemoryExperiment, FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE_PARAM(int, kLowMemoryDeviceThresholdMB, &kLowEndMemoryExperiment, "LowMemoryDeviceThresholdMB", LOW_MEMORY_DEVICE_THRESHOLD_MB); -BASE_FEATURE(kReducePPMs, "ReducePPMs", FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kReducePPMs, FEATURE_DISABLED_BY_DEFAULT); + +// Apply base::ScopedBestEffortExecutionFence to registered task queues as well +// as the thread pool. +BASE_FEATURE(kScopedBestEffortExecutionFenceForTaskQueue, + base::FEATURE_DISABLED_BY_DEFAULT); + +// Whether to restrict the max gap between the frame pointer and the stack end +// for stack scanning. If the gap is beyond the given gap threshold, the stack +// end is treated as unreliable. Stack scanning stops when that happens. +// This feature is only in effect when BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS) +// is on and `TraceStackFramePointers` would run stack scanning. Default gap +// threshold is an absurdly large 100MB. +// The feature is enabled by default on ChromeOS where crashes caused by +// unreliable stack end are found. See https://crbug.com/402542102 +BASE_FEATURE(kStackScanMaxFramePointerToStackEndGap, +#if BUILDFLAG(IS_CHROMEOS) + FEATURE_ENABLED_BY_DEFAULT +#else + FEATURE_DISABLED_BY_DEFAULT +#endif +); +BASE_FEATURE_PARAM(int, + kStackScanMaxFramePointerToStackEndGapThresholdMB, + &kStackScanMaxFramePointerToStackEndGap, + "StackScanMaxFramePointerToStackEndGapThresholdMB", + 100); #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) // Force to enable LowEndDeviceMode partially on Android 3Gb devices. // (see PartialLowEndModeOnMidRangeDevices below) -BASE_FEATURE(kPartialLowEndModeOn3GbDevices, - "PartialLowEndModeOn3GbDevices", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kPartialLowEndModeOn3GbDevices, FEATURE_DISABLED_BY_DEFAULT); // Used to enable LowEndDeviceMode partially on Android and ChromeOS mid-range // devices. Such devices aren't considered low-end, but we'd like experiment @@ -103,7 +128,6 @@ BASE_FEATURE(kPartialLowEndModeOn3GbDevices, // devices, where we didn't ship yet. However, we first need a larger // population to collect data. BASE_FEATURE(kPartialLowEndModeOnMidRangeDevices, - "PartialLowEndModeOnMidRangeDevices", #if BUILDFLAG(IS_ANDROID) FEATURE_ENABLED_BY_DEFAULT); #elif BUILDFLAG(IS_CHROMEOS) @@ -114,37 +138,66 @@ BASE_FEATURE(kPartialLowEndModeOnMidRangeDevices, #if BUILDFLAG(IS_ANDROID) // Enable not perceptible binding without cpu priority boosting. -BASE_FEATURE(kBackgroundNotPerceptibleBinding, - "BackgroundNotPerceptibleBinding", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kBackgroundNotPerceptibleBinding, FEATURE_DISABLED_BY_DEFAULT); -// Whether to report frame metrics to the Android.FrameTimeline.* histograms. -BASE_FEATURE(kCollectAndroidFrameTimelineMetrics, - "CollectAndroidFrameTimelineMetrics", - FEATURE_DISABLED_BY_DEFAULT); +// Whether to use effective binding state to manage child process bindings. +// ChildProcessConnection will binds at most 2 service connections only, +// the connection for the effective binding state and waived binding. +BASE_FEATURE(kEffectiveBindingState, FEATURE_DISABLED_BY_DEFAULT); // If enabled, post registering PowerMonitor broadcast receiver to a background // thread, BASE_FEATURE(kPostPowerMonitorBroadcastReceiverInitToBackground, - "PostPowerMonitorBroadcastReceiverInitToBackground", FEATURE_ENABLED_BY_DEFAULT); // If enabled, getMyMemoryState IPC will be posted to background. -BASE_FEATURE(kPostGetMyMemoryStateToBackground, - "PostGetMyMemoryStateToBackground", - FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kPostGetMyMemoryStateToBackground, FEATURE_ENABLED_BY_DEFAULT); + +// Use a single connection and rebindService() to manage the binding to a child +// process service. +BASE_FEATURE(kRebindingChildServiceConnectionController, + FEATURE_DISABLED_BY_DEFAULT); + +// Use a batch API to rebind service connections. +BASE_FEATURE(kRebindServiceBatchApi, FEATURE_DISABLED_BY_DEFAULT); // Update child process binding state before unbinding. -BASE_FEATURE(kUpdateStateBeforeUnbinding, - "UpdateStateBeforeUnbinding", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kUpdateStateBeforeUnbinding, FEATURE_ENABLED_BY_DEFAULT); + +// Use ChildServiceConnectionController.isUnbound() instead of isConnected() to +// check the connection state in ChildProcessConnection. +BASE_FEATURE(kUseIsUnboundCheck, FEATURE_DISABLED_BY_DEFAULT); // Use shared service connection to rebind a service binding to update the LRU // in the ProcessList of OomAdjuster. -BASE_FEATURE(kUseSharedRebindServiceConnection, - "UseSharedRebindServiceConnection", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kUseSharedRebindServiceConnection, FEATURE_ENABLED_BY_DEFAULT); + +// Use madvise MADV_WILLNEED to prefetch the native library. This replaces the +// default mechanism of pre-reading the memory from a forked process. +BASE_FEATURE(kLibraryPrefetcherMadvise, FEATURE_DISABLED_BY_DEFAULT); + +// If > 0, split the madvise range into chunks of this many bytes, rounded up to +// a page size. The default of 1 therefore rounds to a whole page. +BASE_FEATURE_PARAM(size_t, + kLibraryPrefetcherMadviseLength, + &kLibraryPrefetcherMadvise, + "length", + 1); + +// Whether to fall back to the fork-and-read method if madvise is not supported. +// Does not trigger fork-and-read if madvise failed during the actual prefetch. +BASE_FEATURE_PARAM(bool, + kLibraryPrefetcherMadviseFallback, + &kLibraryPrefetcherMadvise, + "fallback", + true); #endif // BUILDFLAG(IS_ANDROID) +// When enabled, GetTerminationStatus() returns +// TERMINATION_STATUS_EVICTED_FOR_MEMORY for processes terminated due to commit +// failures. Otherwise, it returns TERMINATION_STATUS_OOM. +BASE_FEATURE(kUseTerminationStatusMemoryExhaustion, + FEATURE_DISABLED_BY_DEFAULT); + bool IsReducePPMsEnabled() { return g_is_reduce_ppms_enabled.load(std::memory_order_relaxed); } @@ -158,7 +211,9 @@ void Init(EmitThreadControllerProfilerMetadata sequence_manager::internal::ThreadController::InitializeFeatures( emit_thread_controller_profiler_metadata); + debug::StackTrace::InitializeFeatures(); FilePath::InitializeFeatures(); + InitializeVariantMapFeatures(); #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) MessagePumpEpoll::InitializeFeatures(); @@ -169,7 +224,6 @@ void Init(EmitThreadControllerProfilerMetadata #endif #if BUILDFLAG(IS_APPLE) - File::InitializeFeatures(); MessagePumpCFRunLoopBase::InitializeFeatures(); // Kqueue is not used for ios blink. diff --git a/naiveproxy/src/base/features.h b/naiveproxy/src/base/features.h index b745510d32..2c698fe3a4 100644 --- a/naiveproxy/src/base/features.h +++ b/naiveproxy/src/base/features.h @@ -15,6 +15,8 @@ namespace base::features { // alongside the definition of their values in the .cc file. // Alphabetical: +BASE_EXPORT BASE_DECLARE_FEATURE(kBoostCompositorThreadsPriorityWhenIdle); + BASE_EXPORT BASE_DECLARE_FEATURE(kFeatureParamWithCache); BASE_EXPORT BASE_DECLARE_FEATURE(kFastFilePathIsParent); @@ -24,7 +26,7 @@ BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, BASE_EXPORT BASE_DECLARE_FEATURE(kLowEndMemoryExperiment); -BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(size_t, kLowMemoryDeviceThresholdMB); +BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(int, kLowMemoryDeviceThresholdMB); // PPM: Poor performance moment. // @@ -32,6 +34,13 @@ BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(size_t, kLowMemoryDeviceThresholdMB); // is to measure their aggregated impact. BASE_EXPORT BASE_DECLARE_FEATURE(kReducePPMs); +BASE_EXPORT BASE_DECLARE_FEATURE(kScopedBestEffortExecutionFenceForTaskQueue); + +BASE_EXPORT BASE_DECLARE_FEATURE(kStackScanMaxFramePointerToStackEndGap); +BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( + int, + kStackScanMaxFramePointerToStackEndGapThresholdMB); + #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) BASE_EXPORT BASE_DECLARE_FEATURE(kPartialLowEndModeOn3GbDevices); BASE_EXPORT BASE_DECLARE_FEATURE(kPartialLowEndModeOnMidRangeDevices); @@ -39,18 +48,28 @@ BASE_EXPORT BASE_DECLARE_FEATURE(kPartialLowEndModeOnMidRangeDevices); #if BUILDFLAG(IS_ANDROID) BASE_EXPORT BASE_DECLARE_FEATURE(kBackgroundNotPerceptibleBinding); -BASE_EXPORT BASE_DECLARE_FEATURE(kCollectAndroidFrameTimelineMetrics); +BASE_EXPORT BASE_DECLARE_FEATURE(kEffectiveBindingState); BASE_EXPORT BASE_DECLARE_FEATURE( kPostPowerMonitorBroadcastReceiverInitToBackground); BASE_EXPORT BASE_DECLARE_FEATURE(kPostGetMyMemoryStateToBackground); +BASE_EXPORT BASE_DECLARE_FEATURE(kRebindingChildServiceConnectionController); +BASE_EXPORT BASE_DECLARE_FEATURE(kRebindServiceBatchApi); BASE_EXPORT BASE_DECLARE_FEATURE(kUpdateStateBeforeUnbinding); +BASE_EXPORT BASE_DECLARE_FEATURE(kUseIsUnboundCheck); BASE_EXPORT BASE_DECLARE_FEATURE(kUseSharedRebindServiceConnection); BASE_EXPORT BASE_DECLARE_FEATURE(kBackgroundThreadPoolFieldTrial); BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(int, kBackgroundThreadPoolFieldTrialConfig); + +BASE_EXPORT BASE_DECLARE_FEATURE(kLibraryPrefetcherMadvise); +BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(size_t, kLibraryPrefetcherMadviseLength); +BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, kLibraryPrefetcherMadviseFallback); + #endif +BASE_EXPORT BASE_DECLARE_FEATURE(kUseTerminationStatusMemoryExhaustion); + // Whether the ReducePPMs feature is enabled. Unlike // `FeatureList::IsEnabled(base::features::kReducePPMs)`, this can be called // racily with initializing the FeatureList (although the return value might not diff --git a/naiveproxy/src/base/file_descriptor_posix.h b/naiveproxy/src/base/file_descriptor_posix.h index 7c25a02f87..e6fec11ee7 100644 --- a/naiveproxy/src/base/file_descriptor_posix.h +++ b/naiveproxy/src/base/file_descriptor_posix.h @@ -27,7 +27,7 @@ constexpr int kInvalidFd = -1; // a message that contains a base::FileDescriptor if auto_close == true. On the // other end, the receiver must make sure to close() |fd| after it has finished // processing the IPC message. See the IPC::ParamTraits<> specialization in -// ipc/ipc_message_utils.h for all the details. +// ipc/param_traits_utils.h for all the details. // ----------------------------------------------------------------------------- struct BASE_EXPORT FileDescriptor { FileDescriptor(); diff --git a/naiveproxy/src/base/files/drive_info.h b/naiveproxy/src/base/files/drive_info.h index f649a0f0b8..d872b3f021 100644 --- a/naiveproxy/src/base/files/drive_info.h +++ b/naiveproxy/src/base/files/drive_info.h @@ -89,6 +89,11 @@ struct BASE_EXPORT DriveInfo { // example, the 3rd partition of the 3rd disk is "disk3s3". std::optional bsd_name; #endif + +#if BUILDFLAG(IS_WIN) + // The size, in bytes, of a physical sector on the disk. + std::optional bytes_per_sector; +#endif }; // Given a path to a file (following symlinks), returns information about the diff --git a/naiveproxy/src/base/files/drive_info_posix.cc b/naiveproxy/src/base/files/drive_info_posix.cc index 17aaa60376..486f8f93b2 100644 --- a/naiveproxy/src/base/files/drive_info_posix.cc +++ b/naiveproxy/src/base/files/drive_info_posix.cc @@ -11,6 +11,7 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_file.h" +#include "base/numerics/clamped_math.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" @@ -18,6 +19,8 @@ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) #include +#include +#include #endif namespace base { @@ -44,6 +47,25 @@ std::optional GetFileDriveInfo(const FilePath& file_path) { return std::nullopt; } + struct statfs fs_stat; + error = fstatfs(file.GetPlatformFile(), &fs_stat); + if (error < 0) { + return std::nullopt; + } + + // tmpfs needs a special case: it is not a block device so it won't appear in + // /sys/dev/block. Fortunately all tmpfs have the same behavior so fill + // hardcoded values here and bail out. + if (fs_stat.f_type == TMPFS_MAGIC) { + drive_info.has_seek_penalty = false; + // This doesn't have a precise definition but in general unmounting a tmpfs + // destroys its contents, so a specific filesystem shouldn't be considered + // removable and then re-mountable afterwards. + drive_info.is_removable = false; + drive_info.size_bytes = base::ClampMul(fs_stat.f_bsize, fs_stat.f_blocks); + return drive_info; + } + std::string rotational_path = StringPrintf( kRotationalFormat, MAJOR(path_stat.st_dev), MINOR(path_stat.st_dev)); std::string removable_path = StringPrintf( diff --git a/naiveproxy/src/base/files/drive_info_win.cc b/naiveproxy/src/base/files/drive_info_win.cc index 9be0f907e1..e9ff908d11 100644 --- a/naiveproxy/src/base/files/drive_info_win.cc +++ b/naiveproxy/src/base/files/drive_info_win.cc @@ -25,33 +25,46 @@ std::optional GetFileDriveInfo(const FilePath& path) { STORAGE_PROPERTY_QUERY seek_query = { .PropertyId = StorageDeviceSeekPenaltyProperty, .QueryType = PropertyStandardQuery}; - DEVICE_SEEK_PENALTY_DESCRIPTOR seek_result; + DEVICE_SEEK_PENALTY_DESCRIPTOR seek_result = {}; DWORD bytes_returned; - BOOL success = - DeviceIoControl(volume.GetPlatformFile(), IOCTL_STORAGE_QUERY_PROPERTY, - &seek_query, sizeof(seek_query), &seek_result, - sizeof(seek_result), &bytes_returned, nullptr); - if (success == TRUE && bytes_returned >= sizeof(seek_result)) { + BOOL success = ::DeviceIoControl( + volume.GetPlatformFile(), IOCTL_STORAGE_QUERY_PROPERTY, &seek_query, + sizeof(seek_query), &seek_result, sizeof(seek_result), &bytes_returned, + /*lpOverlapped=*/nullptr); + if (success && bytes_returned >= sizeof(seek_result)) { info.has_seek_penalty = seek_result.IncursSeekPenalty != FALSE; } STORAGE_PROPERTY_QUERY bus_query = {.PropertyId = StorageDeviceProperty, .QueryType = PropertyStandardQuery}; - STORAGE_DEVICE_DESCRIPTOR bus_result; - success = - DeviceIoControl(volume.GetPlatformFile(), IOCTL_STORAGE_QUERY_PROPERTY, - &bus_query, sizeof(bus_query), &bus_result, - sizeof(bus_result), &bytes_returned, nullptr); - if (success == TRUE && bytes_returned >= sizeof(bus_result)) { + STORAGE_DEVICE_DESCRIPTOR bus_result = {}; + success = ::DeviceIoControl( + volume.GetPlatformFile(), IOCTL_STORAGE_QUERY_PROPERTY, &bus_query, + sizeof(bus_query), &bus_result, sizeof(bus_result), &bytes_returned, + /*lpOverlapped=*/nullptr); + if (success && bytes_returned >= sizeof(bus_result)) { info.is_usb = bus_result.BusType == BusTypeUsb; info.is_removable = bus_result.RemovableMedia == TRUE; } - PARTITION_INFORMATION_EX partition_info; - success = DeviceIoControl( - volume.GetPlatformFile(), IOCTL_DISK_GET_PARTITION_INFO_EX, nullptr, 0, - &partition_info, sizeof(partition_info), &bytes_returned, nullptr); - if (success == TRUE && bytes_returned >= sizeof(partition_info)) { + STORAGE_PROPERTY_QUERY alignment_query = { + .PropertyId = StorageAccessAlignmentProperty, + .QueryType = PropertyStandardQuery}; + STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR alignment = {}; + success = ::DeviceIoControl( + volume.GetPlatformFile(), IOCTL_STORAGE_QUERY_PROPERTY, &alignment_query, + sizeof(alignment_query), &alignment, sizeof(alignment), &bytes_returned, + /*lpOverlapped=*/nullptr); + if (success && bytes_returned >= sizeof(alignment)) { + info.bytes_per_sector = alignment.BytesPerPhysicalSector; + } + + PARTITION_INFORMATION_EX partition_info = {}; + success = ::DeviceIoControl(volume.GetPlatformFile(), + IOCTL_DISK_GET_PARTITION_INFO_EX, nullptr, 0, + &partition_info, sizeof(partition_info), + &bytes_returned, /*lpOverlapped=*/nullptr); + if (success && bytes_returned >= sizeof(partition_info)) { info.size_bytes = partition_info.PartitionLength.QuadPart; } diff --git a/naiveproxy/src/base/files/file.h b/naiveproxy/src/base/files/file.h index c7d25ec1b9..96e4660456 100644 --- a/naiveproxy/src/base/files/file.h +++ b/naiveproxy/src/base/files/file.h @@ -120,7 +120,7 @@ class BASE_EXPORT File { // If you add more fields to this structure (platform-specific fields are OK), // make sure to update all functions that use it in file_util_{win|posix}.cc, // too, and the ParamTraits implementation in - // ipc/ipc_message_utils.cc. + // ipc/param_traits_utils.cc. struct BASE_EXPORT Info { Info(); ~Info(); diff --git a/naiveproxy/src/base/files/file_enumerator.h b/naiveproxy/src/base/files/file_enumerator.h index 0e2d69fcb4..00a3e755ca 100644 --- a/naiveproxy/src/base/files/file_enumerator.h +++ b/naiveproxy/src/base/files/file_enumerator.h @@ -104,13 +104,15 @@ class BASE_EXPORT FileEnumerator { std::vector subdirs_; #endif #if BUILDFLAG(IS_WIN) - CHROME_WIN32_FIND_DATA find_data_; + CHROME_WIN32_FIND_DATA find_data_ = {}; #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) stat_wrapper_t stat_; FilePath filename_; #endif }; + // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.base + // GENERATED_JAVA_IS_FLAG: true enum FileType { FILES = 1 << 0, DIRECTORIES = 1 << 1, @@ -240,7 +242,7 @@ class BASE_EXPORT FileEnumerator { // True when find_data_ is valid. bool has_find_data_ = false; - CHROME_WIN32_FIND_DATA find_data_; + CHROME_WIN32_FIND_DATA find_data_ = {}; HANDLE find_handle_ = INVALID_HANDLE_VALUE; #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) diff --git a/naiveproxy/src/base/files/file_enumerator_posix.cc b/naiveproxy/src/base/files/file_enumerator_posix.cc index ad148d16b0..6db4248d19 100644 --- a/naiveproxy/src/base/files/file_enumerator_posix.cc +++ b/naiveproxy/src/base/files/file_enumerator_posix.cc @@ -21,6 +21,7 @@ #if BUILDFLAG(IS_ANDROID) #include "base/android/content_uri_utils.h" +#include "base/files/file_util.h" #endif namespace base { @@ -145,12 +146,10 @@ FileEnumerator::FileEnumerator(const FilePath& root_path, DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); #if BUILDFLAG(IS_ANDROID) - // Content-URIs have limited support. - if (root_path.IsContentUri()) { - CHECK_EQ(file_type_, FileType::FILES | FileType::DIRECTORIES); + if (auto content_uri = base::ResolveToContentUri(root_path); content_uri) { // Get display-name of root path. FileInfo root_info; - internal::ContentUriGetFileInfo(root_path, &root_info); + internal::ContentUriGetFileInfo(*content_uri, &root_info); pending_subdirs_.push( std::vector({root_info.GetName().value()})); } @@ -190,10 +189,11 @@ FilePath FileEnumerator::Next() { pending_paths_.pop(); #if BUILDFLAG(IS_ANDROID) - if (root_path_.IsContentUri()) { + if (auto content_uri = base::ResolveToContentUri(root_path_); content_uri) { subdirs_ = pending_subdirs_.top(); pending_subdirs_.pop(); - directory_entries_ = internal::ListContentUriDirectory(root_path_); + directory_entries_ = + internal::ListContentUriDirectory(*content_uri, file_type_); current_directory_entry_ = 0; if (directory_entries_.empty()) { continue; @@ -310,7 +310,7 @@ FilePath FileEnumerator::Next() { } #if BUILDFLAG(IS_ANDROID) - if (root_path_.IsContentUri()) { + if (root_path_.IsContentUri() || root_path_.IsVirtualDocumentPath()) { return directory_entries_[current_directory_entry_].content_uri_; } #endif diff --git a/naiveproxy/src/base/files/file_enumerator_win.cc b/naiveproxy/src/base/files/file_enumerator_win.cc index e3ae611891..f3a99627c6 100644 --- a/naiveproxy/src/base/files/file_enumerator_win.cc +++ b/naiveproxy/src/base/files/file_enumerator_win.cc @@ -37,9 +37,7 @@ FilePath BuildSearchFilter(FileEnumerator::FolderSearchPolicy policy, // FileEnumerator::FileInfo ---------------------------------------------------- -FileEnumerator::FileInfo::FileInfo() { - UNSAFE_TODO(memset(&find_data_, 0, sizeof(find_data_))); -} +FileEnumerator::FileInfo::FileInfo() = default; bool FileEnumerator::FileInfo::IsDirectory() const { return (find_data().dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; @@ -116,7 +114,6 @@ FileEnumerator::FileEnumerator(const FilePath& root_path, file_type_ |= (FileType::FILES | FileType::DIRECTORIES); } - UNSAFE_TODO(memset(&find_data_, 0, sizeof(find_data_))); pending_paths_.push(root_path); } diff --git a/naiveproxy/src/base/files/file_path.cc b/naiveproxy/src/base/files/file_path.cc index 207f84e83f..651381cd17 100644 --- a/naiveproxy/src/base/files/file_path.cc +++ b/naiveproxy/src/base/files/file_path.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "base/files/file_path.h" #include @@ -16,6 +11,8 @@ #include #include "base/check_op.h" +#include "base/containers/contains.h" +#include "base/containers/span.h" #include "base/features.h" #include "base/files/safe_base_name.h" #include "base/numerics/safe_conversions.h" @@ -322,13 +319,8 @@ std::ostream& operator<<(std::ostream& out, const FilePath& file_path) { // static bool FilePath::IsSeparator(CharType character) { - for (size_t i = 0; i < kSeparatorsLength - 1; ++i) { - if (character == kSeparators[i]) { - return true; - } - } - - return false; + span all_known_separators = SeparatorsAsSpan(); + return base::Contains(all_known_separators, character); } std::vector FilePath::GetComponents() const { @@ -814,6 +806,19 @@ FilePath FilePath::StripTrailingSeparators() const { return new_path; } +// static +span FilePath::SeparatorsAsSpan() { + // The last element of `kSeparators` is a terminating NUL character. + // Discard it when creating the span. + // + // TODO(lukasza): We could try to avoid `UNSAFE_TODO` here. One idea would + // be changing the type of `kSeparators` to `std::array`, + // but this idea seems incompatible with `constexpr` (and maybe the risk + // of changing the public API is not worth it). + DCHECK_EQ(kSeparators[kSeparatorsLength - 1], FILE_PATH_LITERAL('\0')); + return UNSAFE_TODO(span(kSeparators, kSeparatorsLength - 1)); +} + bool FilePath::ReferencesParent() const { if (path_.find(kParentDirectory) == StringType::npos) { // GetComponents is quite expensive, so avoid calling it in the majority @@ -1035,7 +1040,7 @@ int FilePath::CompareIgnoreCase(StringViewType string1, namespace { // clang-format off -const UInt16 lower_case_table[11 * 256] = { +const std::array lower_case_table = { // High-byte indices ( == 0 iff no case mapping and no ignorables ) /* 0 */ 0x0100, 0x0200, 0x0000, 0x0300, 0x0400, 0x0500, 0x0000, 0x0000, @@ -1434,18 +1439,20 @@ inline base_icu::UChar32 HFSReadNextNonIgnorableCodepoint(const char* string, while (*index < length && codepoint == 0) { // CBU8_NEXT returns a value < 0 in error cases. For purposes of string // comparison, we just use that value and flag it with DCHECK. - CBU8_NEXT(reinterpret_cast(string), *index, length, - codepoint); + UNSAFE_BUFFERS(CBU8_NEXT(reinterpret_cast(string), *index, + length, codepoint)); DCHECK_GT(codepoint, 0); // Note: Here, there are no lower case conversion implemented in the // Supplementary Multilingual Plane (codepoint > 0xFFFF). if (codepoint > 0 && codepoint <= 0xFFFF) { + UInt16 unsigned_codepoint = checked_cast(codepoint); // Check if there is a subtable for this upper byte. - int lookup_offset = lower_case_table[codepoint >> 8]; + UInt16 lookup_offset = lower_case_table[unsigned_codepoint >> 8]; if (lookup_offset != 0) { - codepoint = lower_case_table[lookup_offset + (codepoint & 0x00FF)]; + codepoint = + lower_case_table[lookup_offset + (unsigned_codepoint & 0x00FF)]; } // Note: `codepoint` may be again 0 at this point if the character was // an ignorable. @@ -1546,15 +1553,14 @@ int FilePath::CompareIgnoreCase(StringViewType string1, // succeed, fall back to strcmp. This can occur when the input string is // invalid UTF-8. if (!cfstring1 || !cfstring2) { - int comparison = memcmp(string1.data(), string2.data(), - std::min(string1.length(), string2.length())); - if (comparison < 0) { + std::strong_ordering order = (string1 <=> string2); + if (order < 0) { return -1; - } - if (comparison > 0) { + } else if (order > 0) { return 1; + } else { + return 0; } - return 0; } return static_cast(CFStringCompare(cfstring1.get(), cfstring2.get(), @@ -1611,13 +1617,17 @@ void FilePath::WriteIntoTrace(perfetto::TracedValue context) const { perfetto::WriteIntoTracedValue(std::move(context), value()); } -FilePath FilePath::NormalizePathSeparatorsTo(CharType separator) const { +FilePath FilePath::NormalizePathSeparatorsTo( + CharType normalized_separator) const { #if defined(FILE_PATH_USES_WIN_SEPARATORS) - DCHECK_NE(kSeparators + kSeparatorsLength, - std::find(kSeparators, kSeparators + kSeparatorsLength, separator)); + span all_known_separators = SeparatorsAsSpan(); + DCHECK(base::Contains(all_known_separators, normalized_separator)); + StringType copy = path_; - for (size_t i = 0; i < kSeparatorsLength; ++i) { - std::replace(copy.begin(), copy.end(), kSeparators[i], separator); + for (CharType known_separator : all_known_separators) { + if (known_separator != normalized_separator) { + std::ranges::replace(copy, known_separator, normalized_separator); + } } return FilePath(copy); #else diff --git a/naiveproxy/src/base/files/file_path.h b/naiveproxy/src/base/files/file_path.h index a04fec3677..70cbb8f69d 100644 --- a/naiveproxy/src/base/files/file_path.h +++ b/naiveproxy/src/base/files/file_path.h @@ -110,6 +110,7 @@ #include "base/base_export.h" #include "base/compiler_specific.h" +#include "base/containers/span_forward_internal.h" #include "base/trace_event/base_tracing_forward.h" #include "build/build_config.h" @@ -471,7 +472,8 @@ class BASE_EXPORT FilePath { // Normalize all path separators to given type on Windows // (if FILE_PATH_USES_WIN_SEPARATORS is true), or do nothing on POSIX systems. - [[nodiscard]] FilePath NormalizePathSeparatorsTo(CharType separator) const; + [[nodiscard]] FilePath NormalizePathSeparatorsTo( + CharType normalized_separator) const; // Compare two strings in the same way the file system does. // Note that these always ignore case, even on file systems that are case- @@ -539,6 +541,9 @@ class BASE_EXPORT FilePath { // support UNC paths on Windows. void StripTrailingSeparatorsInternal(); + // Returns `kSeparators` as a `span` (without the terminating NUL character). + static span SeparatorsAsSpan(); + bool IsParentFast(const FilePath& child) const; bool IsParentSlow(const FilePath& child) const; diff --git a/naiveproxy/src/base/files/file_posix.cc b/naiveproxy/src/base/files/file_posix.cc index 364b9fbe42..94caf9f0c0 100644 --- a/naiveproxy/src/base/files/file_posix.cc +++ b/naiveproxy/src/base/files/file_posix.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "base/files/file.h" // The only 32-bit platform that uses this file is Android. On Android APIs @@ -27,6 +22,7 @@ static_assert(sizeof(base::stat_wrapper_t::st_size) >= 8); #include #include "base/check_op.h" +#include "base/compiler_specific.h" #include "base/feature_list.h" #include "base/metrics/field_trial_params.h" #include "base/notreached.h" @@ -57,32 +53,19 @@ static_assert(File::FROM_BEGIN == SEEK_SET && File::FROM_CURRENT == SEEK_CUR && namespace { -#if BUILDFLAG(IS_APPLE) -// When enabled, `F_FULLFSYNC` is not used in `File::Flush`. Instead, -// `F_BARRIERFSYNC` or `flush()` is used (depending on the -// "MacEfficientFileFlushUseBarrier" param). See -// https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/fsync.2.html -BASE_FEATURE(kMacEfficientFileFlush, - "MacEfficientFileFlush", - base::FEATURE_ENABLED_BY_DEFAULT); - -const FeatureParam kMacEfficientFileFlushUseBarrier{ - &kMacEfficientFileFlush, "MacEfficientFileFlushUseBarrier", true}; - -enum class MacFileFlushMechanism { - kFlush, - kFullFsync, - kBarrierFsync, -}; - -std::atomic g_mac_file_flush_mechanism{ - MacFileFlushMechanism::kFullFsync}; -#endif // BUILDFLAG(IS_APPLE) - #if BUILDFLAG(IS_ANDROID) #define OffsetType off64_t +// In case __USE_FILE_OFFSET64 is not used, the `File` methods in this file need +// to call lseek64(), pread64() and pwrite64() instead of lseek(), pread() and +// pwrite(); +#define LSeekFunc lseek64 +#define PReadFunc pread64 +#define PWriteFunc pwrite64 #else #define OffsetType off_t +#define LSeekFunc lseek +#define PReadFunc pread +#define PWriteFunc pwrite #endif static_assert(sizeof(int64_t) == sizeof(OffsetType)); @@ -111,22 +94,22 @@ int CallFtruncate(PlatformFile file, int64_t length) { #endif } -int CallFutimes(PlatformFile file, const struct timeval times[2]) { +int CallFutimes(PlatformFile file, const std::array times) { #ifdef __USE_XOPEN2K8 // futimens should be available, but futimes might not be // http://pubs.opengroup.org/onlinepubs/9699919799/ - timespec ts_times[2]; + std::array ts_times; ts_times[0].tv_sec = times[0].tv_sec; ts_times[0].tv_nsec = times[0].tv_usec * 1000; ts_times[1].tv_sec = times[1].tv_sec; ts_times[1].tv_nsec = times[1].tv_usec * 1000; - return futimens(file, ts_times); + return futimens(file, ts_times.data()); #else #pragma clang diagnostic push // Can be removed once Cronet's min-sdk is >= 26. #pragma clang diagnostic ignored "-Wunguarded-availability" - return futimes(file, times); + return futimes(file, times.data()); #pragma clang diagnostic pop #endif } @@ -292,14 +275,8 @@ int64_t File::Seek(Whence whence, int64_t offset) { DCHECK(IsValid()); SCOPED_FILE_TRACE_WITH_SIZE("Seek", offset); - -#if BUILDFLAG(IS_ANDROID) - return lseek64(file_.get(), static_cast(offset), - static_cast(whence)); -#else - return lseek(file_.get(), static_cast(offset), - static_cast(whence)); -#endif + return LSeekFunc(file_.get(), static_cast(offset), + static_cast(whence)); } int File::Read(int64_t offset, char* data, int size) { @@ -314,17 +291,9 @@ int File::Read(int64_t offset, char* data, int size) { int bytes_read = 0; long rv; do { -#if BUILDFLAG(IS_ANDROID) - // In case __USE_FILE_OFFSET64 is not used, we need to call pread64() - // instead of pread(). - rv = HANDLE_EINTR(pread64(file_.get(), data + bytes_read, - static_cast(size - bytes_read), - static_cast(offset + bytes_read))); -#else - rv = HANDLE_EINTR(pread(file_.get(), data + bytes_read, - static_cast(size - bytes_read), - static_cast(offset + bytes_read))); -#endif + rv = HANDLE_EINTR(PReadFunc(file_.get(), data + bytes_read, + static_cast(size - bytes_read), + static_cast(offset + bytes_read))); if (rv <= 0) { break; } @@ -401,17 +370,10 @@ int File::Write(int64_t offset, const char* data, int size) { int bytes_written = 0; long rv; do { -#if BUILDFLAG(IS_ANDROID) - // In case __USE_FILE_OFFSET64 is not used, we need to call pwrite64() - // instead of pwrite(). - rv = HANDLE_EINTR(pwrite64(file_.get(), data + bytes_written, - static_cast(size - bytes_written), - static_cast(offset + bytes_written))); -#else - rv = HANDLE_EINTR(pwrite(file_.get(), data + bytes_written, - static_cast(size - bytes_written), - static_cast(offset + bytes_written))); -#endif + rv = HANDLE_EINTR( + PWriteFunc(file_.get(), data + bytes_written, + static_cast(size - bytes_written), + static_cast(offset + bytes_written))); if (rv <= 0) { break; } @@ -485,7 +447,7 @@ bool File::SetTimes(Time last_access_time, Time last_modified_time) { SCOPED_FILE_TRACE("SetTimes"); - timeval times[2]; + std::array times; times[0] = last_access_time.ToTimeVal(); times[1] = last_modified_time.ToTimeVal(); @@ -551,22 +513,6 @@ File File::Duplicate() const { return File(std::move(other_fd), async()); } -#if BUILDFLAG(IS_APPLE) -void File::InitializeFeatures() { - if (FeatureList::IsEnabled(kMacEfficientFileFlush)) { - // "relaxed" because there is no dependency between these memory operations - // and other memory operations. - if (kMacEfficientFileFlushUseBarrier.Get()) { - g_mac_file_flush_mechanism.store(MacFileFlushMechanism::kBarrierFsync, - std::memory_order_relaxed); - } else { - g_mac_file_flush_mechanism.store(MacFileFlushMechanism::kFlush, - std::memory_order_relaxed); - } - } -} -#endif // BUILDFLAG(IS_APPLE) - // Static. File::Error File::OSErrorToFileError(int saved_errno) { switch (saved_errno) { @@ -718,40 +664,25 @@ bool File::Flush() { // On macOS and iOS, fsync() is guaranteed to send the file's data to the // underlying storage device, but may return before the device actually writes // the data to the medium. When used by database systems, this may result in - // unexpected data loss. Depending on experiment state, this function may use - // F_BARRIERFSYNC or F_FULLFSYNC to provide stronger guarantees than fsync(). + // unexpected data loss. This function uses F_BARRIERFSYNC to provide stronger + // guarantees than fsync(). The default behavior used to be `F_FULLFSYNC`. + // Changing it to F_BARRIERFSYNC for greatly reduced latency was extensively + // tried via experiment and showed no detectable sign of increased corruption + // in mechanisms that make use of this function. For similar discussions + // regarding rationale one can refer to the SQLite documentation where the + // default is to go directly to fsync. (See PRAGMA fullfsync) // // See documentation: // https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/fsync.2.html // - // "relaxed" because there is no dependency between this memory operation and - // other memory operations. - switch (g_mac_file_flush_mechanism.load(std::memory_order_relaxed)) { - case MacFileFlushMechanism::kBarrierFsync: { - if (!HANDLE_EINTR(fcntl(file_.get(), F_BARRIERFSYNC))) { - return true; - } - // Fall back to `fsync()` in case of failure. - break; - } - case MacFileFlushMechanism::kFullFsync: { - if (!HANDLE_EINTR(fcntl(file_.get(), F_FULLFSYNC))) { - return true; - } - // Fall back to `fsync()` in case of failure. - break; - } - case MacFileFlushMechanism::kFlush: { - // Fall back to `fsync()`. - break; - } + if (!HANDLE_EINTR(fcntl(file_.get(), F_BARRIERFSYNC))) { + return true; } - // `fsync()` if `F_BARRIERFSYNC` or `F_FULLFSYNC` failed, or if the mechanism - // is `kFlush`. Some file systems do not support `F_FULLFSYNC` / + // `fsync()` if `F_BARRIERFSYNC` failed. Some file systems do not support // `F_BARRIERFSYNC` but we cannot use the error code as a definitive indicator - // that it's the case, so we'll keep trying `F_FULLFSYNC` / `F_BARRIERFSYNC` - // for every call to this method when it's the case. See the CL description at + // that it's the case, so we'll keep trying `F_BARRIERFSYNC` for every call to + // this method when it's the case. See the CL description at // https://crrev.com/c/1400159 for details. return !HANDLE_EINTR(fsync(file_.get())); #else @@ -773,18 +704,18 @@ int File::Stat(const FilePath& path, stat_wrapper_t* sb) { ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); #if BUILDFLAG(IS_ANDROID) if (path.IsContentUri() || path.IsVirtualDocumentPath()) { - std::optional p = base::ResolveToContentUri(path); - if (!p) { + std::optional content_uri = base::ResolveToContentUri(path); + if (!content_uri) { errno = ENOENT; return -1; } // Attempt to open the file and call GetInfo(), otherwise call Java code // with the path which is required for dirs. - File file(*p, base::File::FLAG_OPEN | base::File::FLAG_READ); + File file(*content_uri, base::File::FLAG_OPEN | base::File::FLAG_READ); Info info; if ((file.IsValid() && file.GetInfo(&info)) || - GetContentUriInfo(path, &info)) { - memset(sb, 0, sizeof(*sb)); + GetContentUriInfo(*content_uri, &info)) { + UNSAFE_BUFFERS(memset(sb, 0, sizeof(*sb))); sb->st_mode = info.is_directory ? S_IFDIR : S_IFREG; sb->st_size = info.size; sb->st_mtime = info.last_modified.ToTimeT(); diff --git a/naiveproxy/src/base/files/file_util.cc b/naiveproxy/src/base/files/file_util.cc index 30bdcc0cb8..4c78291ba9 100644 --- a/naiveproxy/src/base/files/file_util.cc +++ b/naiveproxy/src/base/files/file_util.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "base/files/file_util.h" #include @@ -35,6 +30,7 @@ #include "base/files/file_path.h" #include "base/functional/function_ref.h" #include "base/notreached.h" +#include "base/numerics/checked_math.h" #include "base/posix/eintr_wrapper.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" @@ -114,8 +110,12 @@ bool ReadStreamToSpanWithMaxSize( span bytes_span = resize_span(chunk_size); DCHECK_EQ(bytes_span.size(), chunk_size); - while ((bytes_read_this_pass = fread(bytes_span.data() + bytes_read_so_far, 1, - chunk_size, stream)) > 0) { + // TODO(https://crbug.com/40284755): Replace `UNSAFE_TODO` with + // `UNSAFE_BUFFERS` after replacing pointer arithmetic with `span::subspan` + // and adding a comment explaining why `fread` calls are safe. + while ((bytes_read_this_pass = UNSAFE_TODO(fread( + bytes_span.data() + bytes_read_so_far, 1, chunk_size, stream))) > + 0) { if ((max_size - bytes_read_so_far) < bytes_read_this_pass) { // Read more than max_size bytes, bail out. bytes_read_so_far = max_size; @@ -200,29 +200,28 @@ bool CopyFileContents(File& infile, File& outfile) { #endif static constexpr size_t kBufferSize = 32768; - std::vector buffer(kBufferSize); + std::vector buffer(kBufferSize); for (;;) { - int bytes_read = - infile.ReadAtCurrentPos(buffer.data(), static_cast(buffer.size())); - if (bytes_read < 0) { + std::optional bytes_read = infile.ReadAtCurrentPos(buffer); + if (!bytes_read.has_value()) { return false; } if (bytes_read == 0) { return true; } // Allow for partial writes - int bytes_written_per_read = 0; + span bytes_to_write = + as_byte_span(buffer).first(*bytes_read); do { - int bytes_written_partial = outfile.WriteAtCurrentPos( - &buffer[static_cast(bytes_written_per_read)], - bytes_read - bytes_written_per_read); - if (bytes_written_partial < 0) { + std::optional bytes_written = + outfile.WriteAtCurrentPos(bytes_to_write); + if (!bytes_written.has_value()) { return false; } - bytes_written_per_read += bytes_written_partial; - } while (bytes_written_per_read < bytes_read); + bytes_to_write = bytes_to_write.subspan(*bytes_written); + } while (!bytes_to_write.empty()); } NOTREACHED(); @@ -253,17 +252,19 @@ bool ContentsEqual(const FilePath& filename1, const FilePath& filename2) { do { file1.read(buffer1, BUFFER_SIZE); file2.read(buffer2, BUFFER_SIZE); + if ((file1.eof() != file2.eof()) || (file1.gcount() != file2.gcount())) { + return false; + } - if ((file1.eof() != file2.eof()) || (file1.gcount() != file2.gcount()) || - (memcmp(buffer1, buffer2, static_cast(file1.gcount())))) { - file1.close(); - file2.close(); + span data1 = + as_byte_span(buffer1).first(checked_cast(file1.gcount())); + span data2 = + as_byte_span(buffer2).first(checked_cast(file2.gcount())); + if (data1 != data2) { return false; } } while (!file1.eof() || !file2.eof()); - file1.close(); - file2.close(); return true; } @@ -485,8 +486,17 @@ int ReadFile(const FilePath& filename, char* data, int max_size) { if (max_size < 0) { return -1; } - std::optional result = - ReadFile(filename, span(data, static_cast(max_size))); + size_t unsigned_size = checked_cast(max_size); + + // SAFETY: Depending on the caller to provide valid `data` and `max_size`. + // + // TODO(https://crbug.com/40284755): Mark this overload of `ReadFile` with + // `UNSAFE_BUFFER_USAGE` and eventually remove it altogether (preferring the + // overload that takes a `span`). + span chars_buffer = UNSAFE_TODO(span(data, unsigned_size)); + + span bytes_buffer = as_writable_byte_span(chars_buffer); + std::optional result = ReadFile(filename, bytes_buffer); if (!result) { return -1; } diff --git a/naiveproxy/src/base/files/file_util.h b/naiveproxy/src/base/files/file_util.h index 9c46ee2c82..31d11adc19 100644 --- a/naiveproxy/src/base/files/file_util.h +++ b/naiveproxy/src/base/files/file_util.h @@ -94,9 +94,7 @@ MakeAbsoluteFilePathNoResolveSymbolicLinks(const FilePath& input); BASE_EXPORT int64_t ComputeDirectorySize(const FilePath& root_path); // Deletes the given path, whether it's a file or a directory. -// If it's a directory, it's perfectly happy to delete all of the directory's -// contents, but it will not recursively delete subdirectories and their -// contents. +// Directories will only be successfully deleted if empty. // Returns true if successful, false otherwise. It is considered successful to // attempt to delete a file that does not exist. // @@ -448,7 +446,6 @@ BASE_EXPORT ScopedFILE CreateAndOpenTemporaryStreamInDir(const FilePath& dir, // // Create a new directory. If prefix is provided, the new directory name is in // the format of prefixyyyy. -// NOTE: prefix is ignored in the POSIX implementation. // If success, return true and output the full path of the directory created. // // For Windows, this directory is usually created in a secure location if the @@ -456,7 +453,7 @@ BASE_EXPORT ScopedFILE CreateAndOpenTemporaryStreamInDir(const FilePath& dir, // insecure, since low privilege users can get the path of folders under %TEMP% // after creation and are able to create subfolders and files within these // folders which can lead to privilege escalation. -BASE_EXPORT bool CreateNewTempDirectory(const FilePath::StringType& prefix, +BASE_EXPORT bool CreateNewTempDirectory(FilePath::StringViewType prefix, FilePath* new_temp_path); // Create a directory within another directory. @@ -498,6 +495,13 @@ BASE_EXPORT bool NormalizeFilePath(const FilePath& path, FilePath* real_path); #if BUILDFLAG(IS_WIN) +// Returns `SystemTemp` (or `DIR_PROGRAM_FILES` if SystemTemp does not exist) +// for security reasons if the caller is the default admin (i.e., no split +// token, such as the SYSTEM user or the built-in administrator) to avoid +// attacks from lower privilege processes. For non-default-admin cases, returns +// `%TEMP%`. An override of `DIR_SYSTEM_TEMP` by tests is respected. +BASE_EXPORT bool GetSecureTempDirectory(FilePath* temp_dir); + // Removes the Windows extended-length path prefix from a prefixed path. // Exported for testing. Refer to the function implementation for details. BASE_EXPORT FilePath @@ -760,6 +764,11 @@ BASE_EXPORT bool MoveUnsafe(const FilePath& from_path, const FilePath& to_path); // This function is not transactional. BASE_EXPORT bool CopyAndDeleteDirectory(const FilePath& from_path, const FilePath& to_path); + +// Returns true if the user is an administrator with default elevation type, +// i.e., no split token, such as the SYSTEM user or the built-in +// administrator. +BASE_EXPORT bool IsUserDefaultAdmin(); #endif // BUILDFLAG(IS_WIN) #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) diff --git a/naiveproxy/src/base/files/file_util_posix.cc b/naiveproxy/src/base/files/file_util_posix.cc index 7ea5784936..363a1a94ce 100644 --- a/naiveproxy/src/base/files/file_util_posix.cc +++ b/naiveproxy/src/base/files/file_util_posix.cc @@ -127,8 +127,9 @@ bool VerifySpecificPathControlledByUser(const FilePath& path, } #endif -base::FilePath GetTempTemplate() { - return FormatTemporaryFileName("XXXXXX"); +base::FilePath GetTempTemplate(FilePath::StringViewType prefix = "") { + return FormatTemporaryFileName( + StrCat({prefix, prefix.empty() ? "" : ".", "XXXXXX"})); } bool AdvanceEnumeratorWithStat(FileEnumerator* traversal, @@ -928,14 +929,15 @@ bool CreateTemporaryDirInDir(const FilePath& base_dir, new_dir); } -bool CreateNewTempDirectory(const FilePath::StringType& prefix, +bool CreateNewTempDirectory(FilePath::StringViewType prefix, FilePath* new_temp_path) { FilePath tmpdir; if (!GetTempDir(&tmpdir)) { return false; } - return CreateTemporaryDirInDirImpl(tmpdir, GetTempTemplate(), new_temp_path); + return CreateTemporaryDirInDirImpl(tmpdir, GetTempTemplate(prefix), + new_temp_path); } bool CreateDirectoryAndGetError(const FilePath& full_path, File::Error* error) { @@ -1149,6 +1151,10 @@ bool WriteFile(const FilePath& filename, span data) { std::optional vp = files_internal::VirtualDocumentPath::Parse(filename.value()); return vp && vp->WriteFile(data); + } else if (filename.IsContentUri()) { + File file(filename, + File::Flags::FLAG_WRITE | File::Flags::FLAG_CREATE_ALWAYS); + return file.Write(0, data).has_value(); } #endif diff --git a/naiveproxy/src/base/files/file_util_win.cc b/naiveproxy/src/base/files/file_util_win.cc index 5d57b315aa..0de9cb3e3b 100644 --- a/naiveproxy/src/base/files/file_util_win.cc +++ b/naiveproxy/src/base/files/file_util_win.cc @@ -385,34 +385,6 @@ OnceClosure GetDeleteFileCallbackInternal( std::move(bound_callback)); } -// This function checks if the user is an administrator and whether they have a -// default elevation type. This corresponds to a full administrator such as the -// SYSTEM user or built in administrator. It will return false for split-token -// administrators used in UAC and any non-administrator caller. It checks the -// effective token in case the caller is impersonating an administrator. -bool IsUserDefaultAdmin() { - base::win::Sid admin_sid(base::win::WellKnownSid::kBuiltinAdministrators); - BOOL is_member = FALSE; - if (!::CheckTokenMembership(nullptr, admin_sid.GetPSID(), &is_member)) { - DPLOG(WARNING) << "Error checking token membership"; - return false; - } - - if (!is_member) { - return false; - } - - TOKEN_ELEVATION_TYPE elevation_type; - DWORD ret_length; - if (!::GetTokenInformation(::GetCurrentThreadEffectiveToken(), - TokenElevationType, &elevation_type, - sizeof(elevation_type), &ret_length)) { - DPLOG(WARNING) << "Cannot get token elevation type"; - return false; - } - return elevation_type == TokenElevationTypeDefault; -} - // This function removes the Windows extended-length path prefix from a prefixed // path. It supports both the native UNC prefix and the native local path // prefix. If the prefix is not recognized, it logs a warning and returns an @@ -477,10 +449,10 @@ bool IsPathSafeToSetAclOn(const FilePath& path) { } // Admin users create temporary files in SystemTemp; see - // `CreateNewTempDirectory` below. + // `GetSecureTempDirectory` below. FilePath secure_system_temp; - if (IsUserDefaultAdmin() && - PathService::Get(DIR_SYSTEM_TEMP, &secure_system_temp)) { + if (internal::IsUserDefaultAdmin() && + GetSecureTempDirectory(&secure_system_temp)) { valid_paths.push_back(secure_system_temp); } @@ -761,33 +733,21 @@ bool CreateTemporaryDirInDir(const FilePath& base_dir, } // The directory is created under SystemTemp for security reasons if the caller -// is admin to avoid attacks from lower privilege processes. -// -// If unable to create a dir under SystemTemp, the dir is created under -// %TEMP%. The reasons for not being able to create a dir under SystemTemp could -// be because `%systemroot%\SystemTemp` does not exist, or unable to resolve -// `DIR_WINDOWS` or `DIR_PROGRAM_FILES`, say due to registry redirection, or -// unable to create a directory due to SystemTemp being read-only or having -// atypical ACLs. An override of `DIR_SYSTEM_TEMP` by tests will be respected. -bool CreateNewTempDirectory(const FilePath::StringType& prefix, +// is the default admin (i.e., no split token, such as the SYSTEM user or the +// built-in administrator) to avoid attacks from lower privilege processes. +bool CreateNewTempDirectory(FilePath::StringViewType prefix, FilePath* new_temp_path) { ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); DCHECK(new_temp_path); FilePath parent_dir; - if (IsUserDefaultAdmin() && PathService::Get(DIR_SYSTEM_TEMP, &parent_dir) && - CreateTemporaryDirInDir(parent_dir, - prefix.empty() ? kDefaultTempDirPrefix : prefix, - new_temp_path)) { - return true; - } - - if (!GetTempDir(&parent_dir)) { + if (!GetSecureTempDirectory(&parent_dir)) { return false; } - - return CreateTemporaryDirInDir(parent_dir, prefix, new_temp_path); + return CreateTemporaryDirInDir( + parent_dir, prefix.empty() ? kDefaultTempDirPrefix : prefix, + new_temp_path); } bool CreateDirectoryAndGetError(const FilePath& full_path, File::Error* error) { @@ -883,6 +843,14 @@ bool NormalizeFilePath(const FilePath& path, FilePath* real_path) { return !real_path->empty(); } +bool GetSecureTempDirectory(FilePath* temp_dir) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(temp_dir); + return internal::IsUserDefaultAdmin() + ? PathService::Get(DIR_SYSTEM_TEMP, temp_dir) + : GetTempDir(temp_dir); +} + FilePath RemoveWindowsExtendedPathPrefixForTesting( std::wstring_view prefixed_path) { return RemoveWindowsExtendedPathPrefix(prefixed_path); @@ -1354,5 +1322,28 @@ bool CopyAndDeleteDirectory(const FilePath& from_path, return false; } +bool IsUserDefaultAdmin() { + base::win::Sid admin_sid(base::win::WellKnownSid::kBuiltinAdministrators); + BOOL is_member = FALSE; + if (!::CheckTokenMembership(nullptr, admin_sid.GetPSID(), &is_member)) { + DPLOG(WARNING) << "Error checking token membership"; + return false; + } + + if (!is_member) { + return false; + } + + TOKEN_ELEVATION_TYPE elevation_type = TokenElevationTypeDefault; + DWORD ret_length = 0; + if (!::GetTokenInformation(::GetCurrentThreadEffectiveToken(), + TokenElevationType, &elevation_type, + sizeof(elevation_type), &ret_length)) { + DPLOG(WARNING) << "Cannot get token elevation type"; + return false; + } + return elevation_type == TokenElevationTypeDefault; +} + } // namespace internal } // namespace base diff --git a/naiveproxy/src/base/files/scoped_temp_dir.cc b/naiveproxy/src/base/files/scoped_temp_dir.cc index 42db9c15c0..09262ae208 100644 --- a/naiveproxy/src/base/files/scoped_temp_dir.cc +++ b/naiveproxy/src/base/files/scoped_temp_dir.cc @@ -11,7 +11,7 @@ namespace base { namespace { -constexpr FilePath::CharType kScopedDirPrefix[] = +constexpr FilePath::CharType kDefaultScopedDirPrefix[] = FILE_PATH_LITERAL("scoped_dir"); } // namespace @@ -35,21 +35,22 @@ ScopedTempDir::~ScopedTempDir() { } } -bool ScopedTempDir::CreateUniqueTempDir() { +bool ScopedTempDir::CreateUniqueTempDir(FilePath::StringViewType prefix) { if (!path_.empty()) { return false; } - // This "scoped_dir" prefix is only used on Windows and serves as a template - // for the unique name. - if (!CreateNewTempDirectory(kScopedDirPrefix, &path_)) { + // The `prefix` serves as a template for the unique name. + if (!CreateNewTempDirectory(prefix, &path_)) { return false; } return true; } -bool ScopedTempDir::CreateUniqueTempDirUnderPath(const FilePath& base_path) { +bool ScopedTempDir::CreateUniqueTempDirUnderPath( + const FilePath& base_path, + FilePath::StringViewType prefix) { if (!path_.empty()) { return false; } @@ -60,7 +61,7 @@ bool ScopedTempDir::CreateUniqueTempDirUnderPath(const FilePath& base_path) { } // Create a new, uniquely named directory under |base_path|. - if (!CreateTemporaryDirInDir(base_path, kScopedDirPrefix, &path_)) { + if (!CreateTemporaryDirInDir(base_path, prefix, &path_)) { return false; } @@ -108,8 +109,8 @@ bool ScopedTempDir::IsValid() const { } // static -const FilePath::CharType* ScopedTempDir::GetTempDirPrefix() { - return kScopedDirPrefix; +const FilePath::CharType* ScopedTempDir::GetDefaultTempDirPrefix() { + return kDefaultScopedDirPrefix; } } // namespace base diff --git a/naiveproxy/src/base/files/scoped_temp_dir.h b/naiveproxy/src/base/files/scoped_temp_dir.h index 3cbc16842e..a765d05d5f 100644 --- a/naiveproxy/src/base/files/scoped_temp_dir.h +++ b/naiveproxy/src/base/files/scoped_temp_dir.h @@ -25,7 +25,8 @@ namespace base { class BASE_EXPORT ScopedTempDir { public: - // No directory is owned/created initially. + // No directory is owned/created initially. Call one of the `CreateUnique` + // functions to create a directory. ScopedTempDir(); ScopedTempDir(ScopedTempDir&&) noexcept; @@ -34,12 +35,17 @@ class BASE_EXPORT ScopedTempDir { // Recursively delete path. ~ScopedTempDir(); - // Creates a unique directory in TempPath, and takes ownership of it. + // Creates a unique directory in TempPath, and takes ownership of it. The new + // directory name is in the format of "{prefix}yyyy". // See file_util::CreateNewTemporaryDirectory. - [[nodiscard]] bool CreateUniqueTempDir(); + [[nodiscard]] bool CreateUniqueTempDir( + FilePath::StringViewType prefix = GetDefaultTempDirPrefix()); // Creates a unique directory under a given path, and takes ownership of it. - [[nodiscard]] bool CreateUniqueTempDirUnderPath(const FilePath& path); + // The new directory name is in the format of "{prefix}yyyy". + [[nodiscard]] bool CreateUniqueTempDirUnderPath( + const FilePath& path, + FilePath::StringViewType prefix = GetDefaultTempDirPrefix()); // Takes ownership of directory at |path|, creating it if necessary. // Don't call multiple times unless Take() has been called first. @@ -59,9 +65,9 @@ class BASE_EXPORT ScopedTempDir { // Returns true if path_ is non-empty and exists. bool IsValid() const; - // Returns the prefix used for temp directory names generated by + // Returns the default prefix used for temp directory names generated by // ScopedTempDirs. - static const FilePath::CharType* GetTempDirPrefix(); + static const FilePath::CharType* GetDefaultTempDirPrefix(); private: FilePath path_; diff --git a/naiveproxy/src/base/functional/bind_internal.h b/naiveproxy/src/base/functional/bind_internal.h index 674de37e97..8aa759e324 100644 --- a/naiveproxy/src/base/functional/bind_internal.h +++ b/naiveproxy/src/base/functional/bind_internal.h @@ -21,7 +21,6 @@ #include "base/memory/raw_ptr.h" #include "base/memory/raw_ref.h" #include "base/memory/weak_ptr.h" -#include "base/types/always_false.h" #include "base/types/is_complete.h" #include "base/types/is_instantiation.h" #include "base/types/to_address.h" @@ -1354,7 +1353,7 @@ struct ValidateReceiverType { private: // Pointer-like receivers use a different specialization, so this never // succeeds. - template > + template struct ReceiverMustBePointerLike { static constexpr bool value = [] { static_assert(v, diff --git a/naiveproxy/src/base/functional/callback.h b/naiveproxy/src/base/functional/callback.h index b5f076b193..2dd28d05db 100644 --- a/naiveproxy/src/base/functional/callback.h +++ b/naiveproxy/src/base/functional/callback.h @@ -22,7 +22,6 @@ #include "base/functional/callback_tags.h" #include "base/functional/function_ref.h" #include "base/notreached.h" -#include "base/types/always_false.h" // ----------------------------------------------------------------------------- // Usage documentation @@ -255,7 +254,7 @@ class TRIVIAL_ABI OnceCallback { // NOLINTNEXTLINE(google-explicit-constructor) operator FunctionRef() & { static_assert( - AlwaysFalse, + false, "need to convert a base::OnceCallback to base::FunctionRef? " "Please bring up this use case on #cxx (Slack) or cxx@chromium.org."); } @@ -264,7 +263,7 @@ class TRIVIAL_ABI OnceCallback { // NOLINTNEXTLINE(google-explicit-constructor) operator FunctionRef() && { static_assert( - AlwaysFalse, + false, "using base::BindOnce() is not necessary with base::FunctionRef; is it " "possible to use a capturing lambda directly? If not, please bring up " "this use case on #cxx (Slack) or cxx@chromium.org."); @@ -463,7 +462,7 @@ class TRIVIAL_ABI RepeatingCallback { // NOLINTNEXTLINE(google-explicit-constructor) operator FunctionRef() & { static_assert( - AlwaysFalse, + false, "need to convert a base::RepeatingCallback to base::FunctionRef? " "Please bring up this use case on #cxx (Slack) or cxx@chromium.org."); } @@ -472,7 +471,7 @@ class TRIVIAL_ABI RepeatingCallback { // NOLINTNEXTLINE(google-explicit-constructor) operator FunctionRef() && { static_assert( - AlwaysFalse, + false, "using base::BindRepeating() is not necessary with base::FunctionRef; " "is it possible to use a capturing lambda directly? If not, please " "bring up this use case on #cxx (Slack) or cxx@chromium.org."); diff --git a/naiveproxy/src/base/functional/unretained_traits.h b/naiveproxy/src/base/functional/unretained_traits.h index cc949da38a..64ef1e6b56 100644 --- a/naiveproxy/src/base/functional/unretained_traits.h +++ b/naiveproxy/src/base/functional/unretained_traits.h @@ -13,27 +13,29 @@ // Various opaque system types that should still be usable with the base // callback system. Please keep sorted. -#define BASE_INTERNAL_LIST_OF_SAFE_FOR_UNRETAINED \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(ANativeWindow) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(DBusMessage) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(HWND__) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(VkBuffer_T) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(VkDeviceMemory_T) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(VkImage_T) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(VkSemaphore_T) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(VmaAllocation_T) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(WGPUAdapterImpl) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_action_t__) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_annotation_t__) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_attachment_t__) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_bookmark_t__) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_document_t__) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_form_handle_t__) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_page_t__) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_structelement_t__) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(hb_set_t) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(wl_gpu) \ - BASE_INTERNAL_SAFE_FOR_UNRETAINED(wl_shm) \ +#define BASE_INTERNAL_LIST_OF_SAFE_FOR_UNRETAINED \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(ANativeWindow) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(DBusMessage) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(HWND__) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(VkBuffer_T) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(VkDeviceMemory_T) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(VkImage_T) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(VkSemaphore_T) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(VmaAllocation_T) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(WGPUAdapterImpl) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_action_t__) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_annotation_t__) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_attachment_t__) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_bookmark_t__) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_document_t__) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_form_handle_t__) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_page_t__) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_structelement_t__) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_structelement_attr_t__) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(fpdf_structelement_attr_value_t__) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(hb_set_t) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(wl_gpu) \ + BASE_INTERNAL_SAFE_FOR_UNRETAINED(wl_shm) \ BASE_INTERNAL_SAFE_FOR_UNRETAINED(wl_surface) #define BASE_INTERNAL_SAFE_FOR_UNRETAINED(x) struct x; diff --git a/naiveproxy/src/base/i18n/build_utf8_validator_tables.cc b/naiveproxy/src/base/i18n/build_utf8_validator_tables.cc index b7ddec8306..b41872002e 100644 --- a/naiveproxy/src/base/i18n/build_utf8_validator_tables.cc +++ b/naiveproxy/src/base/i18n/build_utf8_validator_tables.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include // Create a state machine for validating UTF-8. The algorithm in brief: @@ -143,7 +138,7 @@ class TablePrinter { void PrintValue(uint8_t value) { if (values_on_this_line_ == 0) { - fputs(" ", stream_); + UNSAFE_TODO(fputs(" ", stream_)); } else if (values_on_this_line_ == kMaxValuesPerLine) { fprintf(stream_.get(), " // 0x%02x\n ", current_offset_); values_on_this_line_ = 0; @@ -155,7 +150,7 @@ class TablePrinter { void NewLine() { while (values_on_this_line_ < kMaxValuesPerLine) { - fputs(" ", stream_); + UNSAFE_TODO(fputs(" ", stream_)); ++values_on_this_line_; } fprintf(stream_.get(), " // 0x%02x\n", current_offset_); @@ -396,7 +391,7 @@ void PrintStates(const std::vector& states, FILE* stream) { DCHECK_EQ(129, state_offset[1]); - fputs(kProlog, stream); + UNSAFE_TODO(fputs(kProlog, stream)); TablePrinter table_printer(stream); for (uint8_t state_index = 0; state_index < states.size(); ++state_index) { @@ -420,7 +415,7 @@ void PrintStates(const std::vector& states, FILE* stream) { table_printer.NewLine(); } - fputs(kEpilog, stream); + UNSAFE_TODO(fputs(kEpilog, stream)); } } // namespace @@ -432,7 +427,7 @@ int main(int argc, char* argv[]) { logging::LOG_TO_SYSTEM_DEBUG_LOG | logging::LOG_TO_STDERR; logging::InitLogging(settings); if (base::CommandLine::ForCurrentProcess()->HasSwitch("help")) { - fwrite(kHelpText, 1, std::size(kHelpText), stdout); + UNSAFE_TODO(fwrite(kHelpText, 1, std::size(kHelpText), stdout)); exit(EXIT_SUCCESS); } base::FilePath filename = diff --git a/naiveproxy/src/base/i18n/icu_util.cc b/naiveproxy/src/base/i18n/icu_util.cc index a52dcbe8ec..6e6e12089d 100644 --- a/naiveproxy/src/base/i18n/icu_util.cc +++ b/naiveproxy/src/base/i18n/icu_util.cc @@ -17,6 +17,7 @@ #include "base/compiler_specific.h" #include "base/debug/alias.h" +#include "base/debug/crash_logging.h" #include "base/environment.h" #include "base/files/file_path.h" #include "base/files/file_util.h" @@ -25,6 +26,7 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/metrics_hashes.h" #include "base/path_service.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "build/chromecast_buildflags.h" #include "third_party/icu/source/common/unicode/putil.h" @@ -195,6 +197,13 @@ void LazyInitIcuDataFile() { g_debug_icu_pf_last_error = ::GetLastError(); g_debug_icu_pf_error_details = file.error_details(); UNSAFE_TODO(wcscpy_s(g_debug_icu_pf_filename, data_path.value().c_str())); + static auto* const path_crash_key = debug::AllocateCrashKeyString( + "icu-open-file-path", debug::CrashKeySize::Size256); + debug::SetCrashKeyString(path_crash_key, data_path.AsUTF8Unsafe()); + static auto* const error_crash_key = debug::AllocateCrashKeyString( + "icu-open-file-error", debug::CrashKeySize::Size32); + debug::SetCrashKeyString(error_crash_key, + NumberToString(g_debug_icu_pf_last_error)); } #endif // BUILDFLAG(IS_WIN) } diff --git a/naiveproxy/src/base/ios/ios_util.h b/naiveproxy/src/base/ios/ios_util.h index b5393fdbe9..1f8ce26b6d 100644 --- a/naiveproxy/src/base/ios/ios_util.h +++ b/naiveproxy/src/base/ios/ios_util.h @@ -20,6 +20,14 @@ BASE_EXPORT bool IsRunningOnIOS16OrLater(); // Returns whether the operating system is iOS 17 or later. BASE_EXPORT bool IsRunningOnIOS17OrLater(); +// Returns whether the operating system is iOS 18 or later. +BASE_EXPORT bool IsRunningOnIOS18OrLater(); + +// Returns whether the operating system is iOS 26 or later. +// Note: there is no iOS version 19 to 25 (i.e. the version +// following 18.x is 26.0). +BASE_EXPORT bool IsRunningOnIOS26OrLater(); + // Returns whether the operating system is at the given version or later. BASE_EXPORT bool IsRunningOnOrLater(int32_t major, int32_t minor, diff --git a/naiveproxy/src/base/ios/ios_util.mm b/naiveproxy/src/base/ios/ios_util.mm index 44f08e0d33..c30163dedf 100644 --- a/naiveproxy/src/base/ios/ios_util.mm +++ b/naiveproxy/src/base/ios/ios_util.mm @@ -34,6 +34,16 @@ bool IsRunningOnIOS17OrLater() { return is_running_on_or_later; } +bool IsRunningOnIOS18OrLater() { + static const bool is_running_on_or_later = IsRunningOnOrLater(18, 0, 0); + return is_running_on_or_later; +} + +bool IsRunningOnIOS26OrLater() { + static const bool is_running_on_or_later = IsRunningOnOrLater(26, 0, 0); + return is_running_on_or_later; +} + bool IsRunningOnOrLater(int32_t major, int32_t minor, int32_t bug_fix) { static const class OSVersion { public: diff --git a/naiveproxy/src/base/ios/scoped_critical_action.mm b/naiveproxy/src/base/ios/scoped_critical_action.mm index dec3f9ca6f..f4f3186d77 100644 --- a/naiveproxy/src/base/ios/scoped_critical_action.mm +++ b/naiveproxy/src/base/ios/scoped_critical_action.mm @@ -22,7 +22,6 @@ namespace base::ios { BASE_FEATURE(kScopedCriticalActionSkipOnShutdown, - "ScopedCriticalActionSkipOnShutdown", base::FEATURE_DISABLED_BY_DEFAULT); namespace { diff --git a/naiveproxy/src/base/json/json_file_value_serializer.h b/naiveproxy/src/base/json/json_file_value_serializer.h index da48251e68..fb21ca22a4 100644 --- a/naiveproxy/src/base/json/json_file_value_serializer.h +++ b/naiveproxy/src/base/json/json_file_value_serializer.h @@ -15,6 +15,9 @@ #include "base/json/json_reader.h" #include "base/values.h" +// Use this class to work with code that takes `base::ValueSerializer`. +// To just serialize a JSON string to files, use base/json/json_writer.h in +// combination with base/files/ code. class BASE_EXPORT JSONFileValueSerializer : public base::ValueSerializer { public: JSONFileValueSerializer() = delete; @@ -49,6 +52,9 @@ class BASE_EXPORT JSONFileValueSerializer : public base::ValueSerializer { const base::FilePath json_file_path_; }; +// Use this class to work with code that takes `base::ValueDeserializer`. +// To just deserialize a JSON string stored in a file, use +// base/json/json_reader.h in combination with base/files/ code. class BASE_EXPORT JSONFileValueDeserializer : public base::ValueDeserializer { public: JSONFileValueDeserializer() = delete; diff --git a/naiveproxy/src/base/json/json_perftest_decodebench.cc b/naiveproxy/src/base/json/json_perftest_decodebench.cc index ff31bdf592..586915d00e 100644 --- a/naiveproxy/src/base/json/json_perftest_decodebench.cc +++ b/naiveproxy/src/base/json/json_perftest_decodebench.cc @@ -65,7 +65,8 @@ int main(int argc, char* argv[]) { std::string error_message; for (int i = 0; i < iterations; ++i) { auto start = base::ThreadTicks::Now(); - auto v = base::JSONReader::ReadAndReturnValueWithError(src); + auto v = base::JSONReader::ReadAndReturnValueWithError( + src, base::JSON_PARSE_CHROMIUM_EXTENSIONS); auto end = base::ThreadTicks::Now(); int64_t iteration_time = (end - start).InMicroseconds(); total_time += iteration_time; diff --git a/naiveproxy/src/base/json/json_reader.h b/naiveproxy/src/base/json/json_reader.h index 8b17717b57..a3229c425b 100644 --- a/naiveproxy/src/base/json/json_reader.h +++ b/naiveproxy/src/base/json/json_reader.h @@ -105,30 +105,28 @@ class BASE_EXPORT JSONReader { // If |json| is not a properly formed JSON string, returns std::nullopt. static std::optional Read( std::string_view json, - int options = JSON_PARSE_CHROMIUM_EXTENSIONS, + int options, size_t max_depth = internal::kAbsoluteMaxDepth); // Reads and parses |json|, returning a Value::Dict. // If |json| is not a properly formed JSON dict string, returns std::nullopt. static std::optional ReadDict( std::string_view json, - int options = JSON_PARSE_CHROMIUM_EXTENSIONS, + int options, size_t max_depth = internal::kAbsoluteMaxDepth); // Reads and parses |json|, returning a Value::List. // If |json| is not a properly formed JSON list string, returns std::nullopt. static std::optional ReadList( std::string_view json, - int options = JSON_PARSE_CHROMIUM_EXTENSIONS, + int options, size_t max_depth = internal::kAbsoluteMaxDepth); // Reads and parses |json| like Read(). On success returns a Value as the // expected value. Otherwise, it returns an Error instance, populated with a // formatted error message, an error code, and the error location if // appropriate as the error value of the expected type. - static Result ReadAndReturnValueWithError( - std::string_view json, - int options = JSON_PARSE_CHROMIUM_EXTENSIONS); + static Result ReadAndReturnValueWithError(std::string_view json, int options); }; } // namespace base diff --git a/naiveproxy/src/base/json/json_string_value_serializer.h b/naiveproxy/src/base/json/json_string_value_serializer.h index d14fecf838..9cfa1ba881 100644 --- a/naiveproxy/src/base/json/json_string_value_serializer.h +++ b/naiveproxy/src/base/json/json_string_value_serializer.h @@ -14,6 +14,8 @@ #include "base/memory/raw_ptr.h" #include "base/values.h" +// Use this class to work with code that takes `base::ValueSerializer`. +// To just serialize a JSON string, use base/json/json_writer.h instead. class BASE_EXPORT JSONStringValueSerializer : public base::ValueSerializer { public: // |json_string| is the string that will be the destination of the @@ -47,6 +49,8 @@ class BASE_EXPORT JSONStringValueSerializer : public base::ValueSerializer { bool pretty_print_; // If true, serialization will span multiple lines. }; +// Use this class to work with code that takes `base::ValueDeserializer`. +// To just deserialize a JSON string, use base/json/json_reader.h instead. class BASE_EXPORT JSONStringValueDeserializer : public base::ValueDeserializer { public: // This retains a reference to the contents of |json_string|, so the data diff --git a/naiveproxy/src/base/lazy_instance_helpers.cc b/naiveproxy/src/base/lazy_instance_helpers.cc index 4d206dd091..69f73669d0 100644 --- a/naiveproxy/src/base/lazy_instance_helpers.cc +++ b/naiveproxy/src/base/lazy_instance_helpers.cc @@ -8,6 +8,7 @@ #include "base/at_exit.h" #include "base/threading/platform_thread.h" +#include "base/time/time.h" namespace base::internal { diff --git a/naiveproxy/src/base/linux_util.cc b/naiveproxy/src/base/linux_util.cc index 25e5eca0d1..25d50e7e00 100644 --- a/naiveproxy/src/base/linux_util.cc +++ b/naiveproxy/src/base/linux_util.cc @@ -194,7 +194,9 @@ pid_t FindThreadIDWithSyscall(pid_t pid, continue; } - *syscall_supported = true; + if (syscall_supported) { + *syscall_supported = true; + } if (!ReadFromFD(fd.get(), syscall_data)) { continue; } diff --git a/naiveproxy/src/base/logging_chromeos.cc b/naiveproxy/src/base/logging_chromeos.cc index 834b8adca3..db54cc8166 100644 --- a/naiveproxy/src/base/logging_chromeos.cc +++ b/naiveproxy/src/base/logging_chromeos.cc @@ -13,6 +13,7 @@ #include "base/logging.h" #include +#include #include #include diff --git a/naiveproxy/src/base/mac/mac_util.h b/naiveproxy/src/base/mac/mac_util.h index fca3e45a35..4e8dbd438e 100644 --- a/naiveproxy/src/base/mac/mac_util.h +++ b/naiveproxy/src/base/mac/mac_util.h @@ -71,6 +71,9 @@ inline __attribute__((const)) int MacOSMajorVersion() { return MacOSVersion() / 1'00'00; } +// Returns true if Mac is running in a virtual machine. +BASE_EXPORT bool IsVirtualMachine(); + enum class CPUType { kIntel, kTranslatedIntel, // Rosetta diff --git a/naiveproxy/src/base/mac/mac_util.mm b/naiveproxy/src/base/mac/mac_util.mm index f5ed1e0e11..00272f21bf 100644 --- a/naiveproxy/src/base/mac/mac_util.mm +++ b/naiveproxy/src/base/mac/mac_util.mm @@ -353,6 +353,13 @@ int MacOSVersion() { return macos_version; } +bool IsVirtualMachine() { + int ret; + size_t size = sizeof(ret); + PCHECK(sysctlbyname("kern.hv_vmm_present", &ret, &size, nullptr, 0) != -1); + return ret; +} + namespace { #if defined(ARCH_CPU_X86_64) diff --git a/naiveproxy/src/base/memory/discardable_memory.cc b/naiveproxy/src/base/memory/discardable_memory.cc index 1add4162b9..a01cd0dae5 100644 --- a/naiveproxy/src/base/memory/discardable_memory.cc +++ b/naiveproxy/src/base/memory/discardable_memory.cc @@ -11,25 +11,17 @@ #include "base/notreached.h" #include "build/build_config.h" -#if BUILDFLAG(IS_ANDROID) -#include "third_party/ashmem/ashmem.h" -#endif // BUILDFLAG(IS_ANDROID) - namespace base { namespace features { #if BUILDFLAG(IS_POSIX) // Feature flag allowing the use of MADV_FREE discardable memory when there are // multiple supported discardable memory backings. -BASE_FEATURE(kMadvFreeDiscardableMemory, - "MadvFreeDiscardableMemory", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kMadvFreeDiscardableMemory, base::FEATURE_DISABLED_BY_DEFAULT); #endif // BUILDFLAG(IS_POSIX) #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) -BASE_FEATURE(kDiscardableMemoryBackingTrial, - "DiscardableMemoryBackingTrial", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kDiscardableMemoryBackingTrial, base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE_ENUM_PARAM(DiscardableMemoryTrialGroup, kDiscardableMemoryBackingParam, @@ -51,7 +43,6 @@ DiscardableMemoryBacking GetBackingForFieldTrial() { GetDiscardableMemoryBackingFieldTrialGroup(); switch (trial_group) { case DiscardableMemoryTrialGroup::kEmulatedSharedMemory: - case DiscardableMemoryTrialGroup::kAshmem: return DiscardableMemoryBacking::kSharedMemory; case DiscardableMemoryTrialGroup::kMadvFree: return DiscardableMemoryBacking::kMadvFree; @@ -68,11 +59,6 @@ DiscardableMemoryBacking GetBackingForFieldTrial() { // Probe capabilities of this device to determine whether we should participate // in the discardable memory backing trial. bool DiscardableMemoryBackingFieldTrialIsEnabled() { -#if BUILDFLAG(IS_ANDROID) - if (!ashmem_device_is_supported()) { - return false; - } -#endif // BUILDFLAG(IS_ANDROID) if (base::GetMadvFreeSupport() != base::MadvFreeSupport::kSupported) { return false; } @@ -102,12 +88,6 @@ DiscardableMemoryBacking GetDiscardableMemoryBacking() { #endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || // BUILDFLAG(IS_CHROMEOS) -#if BUILDFLAG(IS_ANDROID) - if (ashmem_device_is_supported()) { - return DiscardableMemoryBacking::kSharedMemory; - } -#endif // BUILDFLAG(IS_ANDROID) - #if BUILDFLAG(IS_POSIX) if (base::FeatureList::IsEnabled( base::features::kMadvFreeDiscardableMemory) && diff --git a/naiveproxy/src/base/memory/discardable_memory_internal.h b/naiveproxy/src/base/memory/discardable_memory_internal.h index 86c50cca9a..94f6cfb1f2 100644 --- a/naiveproxy/src/base/memory/discardable_memory_internal.h +++ b/naiveproxy/src/base/memory/discardable_memory_internal.h @@ -17,15 +17,11 @@ namespace base { // Enumeration of the possible experiment groups in the discardable memory -// backing trial. Note that |kAshmem| and |kEmulatedSharedMemory| both map to -// discardable shared memory, except the former allows for the use of ashmem for -// unpinning memory. Ensure that the order of the enum values matches those in +// backing trial. Ensure that the order of the enum values matches those in // |kDiscardableMemoryBackingParamOptions|. enum DiscardableMemoryTrialGroup : int { kEmulatedSharedMemory = 0, kMadvFree, - // Only Android devices will be assigned to the ashmem group. - kAshmem, }; namespace features { @@ -38,7 +34,6 @@ constexpr inline auto kDiscardableMemoryBackingParamOptions = std::to_array::Option>({ {DiscardableMemoryTrialGroup::kEmulatedSharedMemory, "shmem"}, {DiscardableMemoryTrialGroup::kMadvFree, "madvfree"}, - {DiscardableMemoryTrialGroup::kAshmem, "ashmem"}, }); BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(DiscardableMemoryTrialGroup, diff --git a/naiveproxy/src/base/memory/discardable_shared_memory.cc b/naiveproxy/src/base/memory/discardable_shared_memory.cc index 8d898db9ab..b010c8f705 100644 --- a/naiveproxy/src/base/memory/discardable_shared_memory.cc +++ b/naiveproxy/src/base/memory/discardable_shared_memory.cc @@ -30,7 +30,7 @@ #endif #if BUILDFLAG(IS_ANDROID) -#include "third_party/ashmem/ashmem.h" +#include "base/android/linker/ashmem.h" #endif #if BUILDFLAG(IS_WIN) @@ -136,11 +136,10 @@ bool UseAshmemUnpinningForDiscardableMemory() { return false; } - // If we are participating in the discardable memory backing trial, only - // enable ashmem unpinning when we are in the corresponding trial group. if (base::DiscardableMemoryBackingFieldTrialIsEnabled()) { - return base::GetDiscardableMemoryBackingFieldTrialGroup() == - base::DiscardableMemoryTrialGroup::kAshmem; + // With the DiscardableMemoryTrial neither kEmulatedSharedMemory nor + // kMadvFree support unpinning. + return false; } return true; } diff --git a/naiveproxy/src/base/memory/madv_free_discardable_memory_posix.cc b/naiveproxy/src/base/memory/madv_free_discardable_memory_posix.cc index 4d75784603..9d6a2f2aad 100644 --- a/naiveproxy/src/base/memory/madv_free_discardable_memory_posix.cc +++ b/naiveproxy/src/base/memory/madv_free_discardable_memory_posix.cc @@ -17,7 +17,6 @@ #include -#include "base/atomicops.h" #include "base/bits.h" #include "base/functional/callback.h" #include "base/logging.h" diff --git a/naiveproxy/src/base/memory/memory_pressure_level.h b/naiveproxy/src/base/memory/memory_pressure_level.h new file mode 100644 index 0000000000..13c6d5a94d --- /dev/null +++ b/naiveproxy/src/base/memory/memory_pressure_level.h @@ -0,0 +1,38 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_MEMORY_MEMORY_PRESSURE_LEVEL_H_ +#define BASE_MEMORY_MEMORY_PRESSURE_LEVEL_H_ + +namespace base { + +// A Java counterpart will be generated for this enum. +// The values needs to be kept in sync with the MemoryPressureLevel entry in +// enums.xml. +// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.base +// GENERATED_JAVA_PREFIX_TO_STRIP: MEMORY_PRESSURE_LEVEL_ +enum MemoryPressureLevel { + // No problems, there is enough memory to use. This event is not sent via + // callback, but the enum is used in other places to find out the current + // state of the system. + MEMORY_PRESSURE_LEVEL_NONE = 0, + + // Modules are advised to free buffers that are cheap to re-allocate and not + // immediately needed. + MEMORY_PRESSURE_LEVEL_MODERATE = 1, + + // At this level, modules are advised to free all possible memory. The + // alternative is to be killed by the system, which means all memory will + // have to be re-created, plus the cost of a cold start. + MEMORY_PRESSURE_LEVEL_CRITICAL = 2, + + // This must be the last value in the enum. The casing is different from the + // other values to make this enum work well with the + // UMA_HISTOGRAM_ENUMERATION macro. + kMaxValue = MEMORY_PRESSURE_LEVEL_CRITICAL, +}; + +} // namespace base + +#endif // BASE_MEMORY_MEMORY_PRESSURE_LEVEL_H_ diff --git a/naiveproxy/src/base/memory/memory_pressure_listener.cc b/naiveproxy/src/base/memory/memory_pressure_listener.cc index 7846d75f4b..1b85082196 100644 --- a/naiveproxy/src/base/memory/memory_pressure_listener.cc +++ b/naiveproxy/src/base/memory/memory_pressure_listener.cc @@ -4,11 +4,14 @@ #include "base/memory/memory_pressure_listener.h" -#include +#include +#include -#include "base/observer_list.h" -#include "base/observer_list_threadsafe.h" +#include "base/feature_list.h" +#include "base/functional/bind.h" +#include "base/memory/memory_pressure_listener_registry.h" #include "base/task/sequenced_task_runner.h" +#include "base/task/single_thread_task_runner.h" #include "base/trace_event/interned_args_helper.h" #include "base/trace_event/memory_dump_manager.h" #include "base/trace_event/memory_pressure_level_proto.h" @@ -19,87 +22,167 @@ namespace base { namespace { -// This class is thread safe and internally synchronized. -class MemoryPressureObserver { - public: - // There is at most one MemoryPressureObserver and it is never deleted. - ~MemoryPressureObserver() = delete; +// Controls whether or no MemoryPressureListeners are notified synchronously or, +// in the disabled state, asynchronously. This is only suitable for a listener +// that only lives on the main thread. +BASE_FEATURE(kMakeMemoryPressureListenerSync, + base::FEATURE_DISABLED_BY_DEFAULT); - void AddObserver(MemoryPressureListener* listener, bool sync) { - // TODO(crbug.com/40123466): DCHECK instead of silently failing when a - // MemoryPressureListener is created in a non-sequenced context. Tests will - // need to be adjusted for that to work. - if (SequencedTaskRunner::HasCurrentDefault()) { - async_observers_->AddObserver(listener); - } - - if (sync) { - AutoLock lock(sync_observers_lock_); - sync_observers_.AddObserver(listener); - } +std::variant +CreateMemoryPressureListenerRegistrationImpl( + const Location& creation_location, + MemoryPressureListenerTag tag, + MemoryPressureListener* memory_pressure_listener) { + using ListenerVariant = std::variant; + if (FeatureList::IsEnabled(kMakeMemoryPressureListenerSync)) { + return ListenerVariant( + std::in_place_type, tag, + memory_pressure_listener); + } else { + return ListenerVariant( + std::in_place_type, + creation_location, tag, memory_pressure_listener); } - - void RemoveObserver(MemoryPressureListener* listener) { - async_observers_->RemoveObserver(listener); - AutoLock lock(sync_observers_lock_); - sync_observers_.RemoveObserver(listener); - } - - void Notify( - MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { - async_observers_->Notify(FROM_HERE, &MemoryPressureListener::Notify, - memory_pressure_level); - AutoLock lock(sync_observers_lock_); - for (auto& observer : sync_observers_) { - observer.SyncNotify(memory_pressure_level); - } - } - - private: - const scoped_refptr> - async_observers_ = - base::MakeRefCounted>( - ObserverListPolicy::EXISTING_ONLY); - ObserverList::Unchecked sync_observers_; - Lock sync_observers_lock_; -}; - -// Gets the shared MemoryPressureObserver singleton instance. -MemoryPressureObserver* GetMemoryPressureObserver() { - static auto* const observer = new MemoryPressureObserver(); - return observer; } -std::atomic g_notifications_suppressed; - } // namespace -MemoryPressureListener::MemoryPressureListener( - const base::Location& creation_location, - const MemoryPressureListener::MemoryPressureCallback& callback) - : callback_(callback), creation_location_(creation_location) { - GetMemoryPressureObserver()->AddObserver(this, false); +// MemoryPressureListener ------------------------------------------------------ + +// static +void MemoryPressureListener::NotifyMemoryPressure( + MemoryPressureLevel memory_pressure_level) { + MemoryPressureListenerRegistry::NotifyMemoryPressure(memory_pressure_level); } -MemoryPressureListener::MemoryPressureListener( - const base::Location& creation_location, - const MemoryPressureListener::MemoryPressureCallback& callback, - const MemoryPressureListener::SyncMemoryPressureCallback& - sync_memory_pressure_callback) - : callback_(callback), - sync_memory_pressure_callback_(sync_memory_pressure_callback), +// static +bool MemoryPressureListener::AreNotificationsSuppressed() { + return MemoryPressureListenerRegistry::AreNotificationsSuppressed(); +} + +// static +void MemoryPressureListener::SetNotificationsSuppressed(bool suppressed) { + MemoryPressureListenerRegistry::SetNotificationsSuppressed(suppressed); +} + +// static +void MemoryPressureListener::SimulatePressureNotification( + MemoryPressureLevel memory_pressure_level) { + MemoryPressureListenerRegistry::SimulatePressureNotification( + memory_pressure_level); +} + +// static +void MemoryPressureListener::SimulatePressureNotificationAsync( + MemoryPressureLevel memory_pressure_level) { + MemoryPressureListenerRegistry::SimulatePressureNotificationAsync( + memory_pressure_level); +} + +// SyncMemoryPressureListenerRegistration -------------------------------------- + +SyncMemoryPressureListenerRegistration::SyncMemoryPressureListenerRegistration( + MemoryPressureListenerTag tag, + MemoryPressureListener* memory_pressure_listener) + : tag_(tag), memory_pressure_listener_(memory_pressure_listener) { + MemoryPressureListenerRegistry::Get().AddObserver(this); +} + +SyncMemoryPressureListenerRegistration:: + ~SyncMemoryPressureListenerRegistration() { + MemoryPressureListenerRegistry::Get().RemoveObserver(this); +} + +void SyncMemoryPressureListenerRegistration::Notify( + MemoryPressureLevel memory_pressure_level) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + memory_pressure_listener_->OnMemoryPressure(memory_pressure_level); +} + +// AsyncMainThread ------------------------- + +class AsyncMemoryPressureListenerRegistration::MainThread + : public MemoryPressureListener { + public: + MainThread() { DETACH_FROM_THREAD(thread_checker_); } + + void Init(WeakPtr parent, + scoped_refptr listener_task_runner, + MemoryPressureListenerTag tag) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + listener_task_runner_ = std::move(listener_task_runner); + parent_ = std::move(parent); + listener_.emplace(tag, this); + } + + private: + void OnMemoryPressure(MemoryPressureLevel memory_pressure_level) override { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + listener_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&AsyncMemoryPressureListenerRegistration::Notify, + parent_, memory_pressure_level)); + } + + // The task runner on which the listener lives. + scoped_refptr listener_task_runner_ + GUARDED_BY_CONTEXT(thread_checker_); + + // A pointer to the listener that lives on `listener_task_runner_`. + WeakPtr parent_ + GUARDED_BY_CONTEXT(thread_checker_); + + // The actual sync listener that lives on the main thread. + std::optional listener_ + GUARDED_BY_CONTEXT(thread_checker_); + + THREAD_CHECKER(thread_checker_); +}; + +// AsyncMemoryPressureListenerRegistration ------------------------------------- + +AsyncMemoryPressureListenerRegistration:: + AsyncMemoryPressureListenerRegistration( + const base::Location& creation_location, + MemoryPressureListenerTag tag, + MemoryPressureListener* memory_pressure_listener) + : memory_pressure_listener_(memory_pressure_listener), creation_location_(creation_location) { - GetMemoryPressureObserver()->AddObserver(this, true); + // TODO(crbug.com/40123466): DCHECK instead of silently failing when a + // MemoryPressureListenerRegistration is created in a non-sequenced context. + // Tests will need to be adjusted for that to work. + if (SingleThreadTaskRunner::HasMainThreadDefault() && + SequencedTaskRunner::HasCurrentDefault()) { + main_thread_task_runner_ = SingleThreadTaskRunner::GetMainThreadDefault(); + main_thread_ = std::make_unique(); + main_thread_task_runner_->PostTask( + FROM_HERE, BindOnce(&MainThread::Init, Unretained(main_thread_.get()), + weak_ptr_factory_.GetWeakPtr(), + SequencedTaskRunner::GetCurrentDefault(), tag)); + } } -MemoryPressureListener::~MemoryPressureListener() { - GetMemoryPressureObserver()->RemoveObserver(this); +AsyncMemoryPressureListenerRegistration:: + ~AsyncMemoryPressureListenerRegistration() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (main_thread_) { + // To ensure |main_thread_| is deleted on the correct thread, we transfer + // ownership to a no-op task. The object is deleted with the task, even + // if it's cancelled before it can run. + main_thread_task_runner_->PostTask( + FROM_HERE, BindOnce([](std::unique_ptr main_thread) {}, + std::move(main_thread_))); + } } -void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) { +void AsyncMemoryPressureListenerRegistration::Notify( + MemoryPressureLevel memory_pressure_level) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); TRACE_EVENT( - "base", "MemoryPressureListener::Notify", - [&](perfetto::EventContext ctx) { + "base", "AsyncNotify", [&](perfetto::EventContext ctx) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); auto* event = ctx.event(); auto* data = event->set_chrome_memory_pressure_notification(); data->set_level( @@ -108,58 +191,21 @@ void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) { base::trace_event::InternedSourceLocation::Get(&ctx, creation_location_)); }); - callback_.Run(memory_pressure_level); + memory_pressure_listener_->OnMemoryPressure(memory_pressure_level); } -void MemoryPressureListener::SyncNotify( - MemoryPressureLevel memory_pressure_level) { - if (!sync_memory_pressure_callback_.is_null()) { - sync_memory_pressure_callback_.Run(memory_pressure_level); - } -} +// MemoryPressureListenerRegistration ------------------------------------------ -// static -void MemoryPressureListener::NotifyMemoryPressure( - MemoryPressureLevel memory_pressure_level) { - DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); - TRACE_EVENT_INSTANT( - trace_event::MemoryDumpManager::kTraceCategory, - "MemoryPressureListener::NotifyMemoryPressure", - [&](perfetto::EventContext ctx) { - auto* event = ctx.event(); - auto* data = event->set_chrome_memory_pressure_notification(); - data->set_level( - trace_event::MemoryPressureLevelToTraceEnum(memory_pressure_level)); - }); - if (AreNotificationsSuppressed()) { - return; - } - DoNotifyMemoryPressure(memory_pressure_level); -} +MemoryPressureListenerRegistration::MemoryPressureListenerRegistration( + const Location& creation_location, + MemoryPressureListenerTag tag, + MemoryPressureListener* memory_pressure_listener) + : listener_(CreateMemoryPressureListenerRegistrationImpl( + creation_location, + tag, + memory_pressure_listener)) {} -// static -bool MemoryPressureListener::AreNotificationsSuppressed() { - return g_notifications_suppressed.load(std::memory_order_acquire); -} - -// static -void MemoryPressureListener::SetNotificationsSuppressed(bool suppress) { - g_notifications_suppressed.store(suppress, std::memory_order_release); -} - -// static -void MemoryPressureListener::SimulatePressureNotification( - MemoryPressureLevel memory_pressure_level) { - // Notify all listeners even if regular pressure notifications are suppressed. - DoNotifyMemoryPressure(memory_pressure_level); -} - -// static -void MemoryPressureListener::DoNotifyMemoryPressure( - MemoryPressureLevel memory_pressure_level) { - DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); - - GetMemoryPressureObserver()->Notify(memory_pressure_level); -} +MemoryPressureListenerRegistration::~MemoryPressureListenerRegistration() = + default; } // namespace base diff --git a/naiveproxy/src/base/memory/memory_pressure_listener.h b/naiveproxy/src/base/memory/memory_pressure_listener.h index 29e9364809..d91298c992 100644 --- a/naiveproxy/src/base/memory/memory_pressure_listener.h +++ b/naiveproxy/src/base/memory/memory_pressure_listener.h @@ -10,106 +10,227 @@ #ifndef BASE_MEMORY_MEMORY_PRESSURE_LISTENER_H_ #define BASE_MEMORY_MEMORY_PRESSURE_LISTENER_H_ +#include +#include + #include "base/base_export.h" +// TODO(pmonette): Fix IWYU issues, and remove this include. #include "base/functional/callback.h" #include "base/location.h" -#include "base/tracing_buildflags.h" +#include "base/memory/memory_pressure_level.h" +#include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" +#include "base/observer_list_types.h" +#include "base/sequence_checker.h" +#include "base/threading/thread_checker.h" namespace base { -// To start listening, create a new instance, passing a callback to a -// function that takes a MemoryPressureLevel parameter. To stop listening, -// simply delete the listener object. The implementation guarantees -// that the callback will always be called on the thread that created -// the listener. -// Note that even on the same thread, the callback is not guaranteed to be -// called synchronously within the system memory pressure broadcast. +class SingleThreadTaskRunner; + +enum class MemoryPressureListenerTag { + kTest = 0, + kHangWatcher = 1, + kMemBackend = 2, + kLevelDb = 3, + kSSLClientSessionCache = 4, + kVulkanInProcessContextProvider = 5, + kDemuxerManager = 6, + kFrameEvictionManager = 7, + kSlopBucket = 8, + kDiscardableSharedMemoryManager = 9, + kSharedStorageManager = 10, + kStagingBufferPool = 11, + kSharedDictionaryStorageOnDisk = 12, + kHttpNetworkSession = 13, + kBlobMemoryController = 14, + kQuicSessionPool = 15, + kImageDecodingStore = 16, + kCompositorGpuThread = 17, + kApplicationBreadcrumbsLogger = 18, + kSkiaOutputSurfaceImpl = 19, + kGpuImageDecodeCache = 20, + kResourcePool = 21, + kOnDeviceTailModelService = 22, + kGpuChannelManager = 23, + // Deprecated. + // kSharedDictionaryManagerOnDisk = 24, + kSharedDictionaryManager = 25, + kHistoryBackend = 26, + kMediaUrlIndex = 27, + kBFCachePolicy = 28, + kLayerTreeHostImpl = 29, + kCacheStorageManager = 30, + kPlayerCompositorDelegate = 31, + kNetworkServiceClient = 32, + kGpuChildThread = 33, + kNavigationEntryScreenshotManager = 34, + kGlicKeyedService = 35, + kRenderThreadImpl = 36, + kSpareRenderProcessHostManagerImpl = 37, + kDOMStorageContextWrapper = 38, + kGpuProcessHost = 39, + kPrerenderHostRegistry = 40, + kUrgentPageDiscardingPolicy = 41, + kTabLoader = 42, + kBackgroundTabLoadingPolicy = 43, + kThumbnailCache = 44, + kUserspaceSwapPolicy = 45, + kWorkingSetTrimmerPolicyChromeOS = 46, + kLruRendererCache = 47, + kCastMemoryPressureControllerImpl = 48, + kFontGlobalContext = 49, + kMax, +}; + +// To start listening, derive from MemoryPressureListener, and use +// MemoryPressureListenerRegistration to register your class with the global +// registry. To stop listening, simply delete the registration object, which +// will ensure that `OnMemoryPressure()` will no longer be invoked. The +// implementation guarantees that the notification will always be received on +// the thread that created the listener. +// +// If the registration can't be done on the main thread of the process, then +// AsyncMemoryPressureListenerRegistration must be used, and notifications will +// be asynchronous as well. +// // Please see notes in MemoryPressureLevel enum below: some levels are // absolutely critical, and if not enough memory is returned to the system, // it'll potentially kill the app, and then later the app will have to be // cold-started. // -// Example: +// Example usage: // -// void OnMemoryPressure(MemoryPressureLevel memory_pressure_level) { -// ... -// } +// class ExampleMemoryPressureListener : public MemoryPressureListener { +// public: +// ExampleMemoryPressureListener() +// : memory_pressure_listener_registration_(tag, this) {} +// ~ExampleMemoryPressureListener() override; // -// // Start listening. -// auto listener = std::make_unique( -// base::BindRepeating(&OnMemoryPressure)); +// // MemoryPressureListener: +// void OnMemoryPressure(MemoryPressureLevel level) override { +// // Do something with `level`. +// } // -// ... -// -// // Stop listening. -// listener.reset(); -// -class BASE_EXPORT MemoryPressureListener { +// private: +// MemoryPressureListenerRegistration memory_pressure_listener_registration_; +// }; + +class BASE_EXPORT MemoryPressureListener : public CheckedObserver { public: - // A Java counterpart will be generated for this enum. - // The values needs to be kept in sync with the MemoryPressureLevel entry in - // enums.xml. - // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.base - // GENERATED_JAVA_PREFIX_TO_STRIP: MEMORY_PRESSURE_LEVEL_ - enum MemoryPressureLevel { - // No problems, there is enough memory to use. This event is not sent via - // callback, but the enum is used in other places to find out the current - // state of the system. - MEMORY_PRESSURE_LEVEL_NONE = 0, - - // Modules are advised to free buffers that are cheap to re-allocate and not - // immediately needed. - MEMORY_PRESSURE_LEVEL_MODERATE = 1, - - // At this level, modules are advised to free all possible memory. The - // alternative is to be killed by the system, which means all memory will - // have to be re-created, plus the cost of a cold start. - MEMORY_PRESSURE_LEVEL_CRITICAL = 2, - - // This must be the last value in the enum. The casing is different from the - // other values to make this enum work well with the - // UMA_HISTOGRAM_ENUMERATION macro. - kMaxValue = MEMORY_PRESSURE_LEVEL_CRITICAL, - }; - - using MemoryPressureCallback = RepeatingCallback; - using SyncMemoryPressureCallback = - RepeatingCallback; - - MemoryPressureListener( - const base::Location& creation_location, - const MemoryPressureCallback& memory_pressure_callback); - MemoryPressureListener( - const base::Location& creation_location, - const MemoryPressureCallback& memory_pressure_callback, - const SyncMemoryPressureCallback& sync_memory_pressure_callback); - - MemoryPressureListener(const MemoryPressureListener&) = delete; - MemoryPressureListener& operator=(const MemoryPressureListener&) = delete; - - ~MemoryPressureListener(); - // Intended for use by the platform specific implementation. + // Note: This simply forwards the call to MemoryPressureListenerRegistry to + // avoid the need to refactor the whole codebase. static void NotifyMemoryPressure(MemoryPressureLevel memory_pressure_level); // These methods should not be used anywhere else but in memory measurement // code, where they are intended to maintain stable conditions across // measurements. + // Note: This simply forwards the call to MemoryPressureListenerRegistry to + // avoid the need to refactor the whole codebase. static bool AreNotificationsSuppressed(); static void SetNotificationsSuppressed(bool suppressed); static void SimulatePressureNotification( MemoryPressureLevel memory_pressure_level); + // Invokes `SimulatePressureNotification` asynchronously on the main thread, + // ensuring that any pending registration tasks have completed by the time it + // runs. + static void SimulatePressureNotificationAsync( + MemoryPressureLevel memory_pressure_level); + + virtual void OnMemoryPressure(MemoryPressureLevel memory_pressure_level) = 0; +}; + +// Used for listeners that live on the main thread and must be called +// synchronously. Prefer using MemoryPressureListenerRegistration as this will +// eventually be removed. +class BASE_EXPORT SyncMemoryPressureListenerRegistration { + public: + SyncMemoryPressureListenerRegistration( + MemoryPressureListenerTag, + MemoryPressureListener* memory_pressure_listener); + + SyncMemoryPressureListenerRegistration( + const SyncMemoryPressureListenerRegistration&) = delete; + SyncMemoryPressureListenerRegistration& operator=( + const SyncMemoryPressureListenerRegistration&) = delete; + + ~SyncMemoryPressureListenerRegistration(); void Notify(MemoryPressureLevel memory_pressure_level); - void SyncNotify(MemoryPressureLevel memory_pressure_level); + + MemoryPressureListenerTag tag() { return tag_; } private: - static void DoNotifyMemoryPressure(MemoryPressureLevel memory_pressure_level); + MemoryPressureListenerTag tag_; - MemoryPressureCallback callback_; - SyncMemoryPressureCallback sync_memory_pressure_callback_; + raw_ptr memory_pressure_listener_ + GUARDED_BY_CONTEXT(thread_checker_); - const base::Location creation_location_; + THREAD_CHECKER(thread_checker_); +}; + +// Used for listeners that can exists on sequences other than the main thread +// and don't need to be called synchronously. +class BASE_EXPORT AsyncMemoryPressureListenerRegistration { + public: + AsyncMemoryPressureListenerRegistration( + const base::Location& creation_location, + MemoryPressureListenerTag tag, + MemoryPressureListener* memory_pressure_listener); + + AsyncMemoryPressureListenerRegistration( + const AsyncMemoryPressureListenerRegistration&) = delete; + AsyncMemoryPressureListenerRegistration& operator=( + const AsyncMemoryPressureListenerRegistration&) = delete; + + ~AsyncMemoryPressureListenerRegistration(); + + private: + class MainThread; + + void Notify(MemoryPressureLevel memory_pressure_level); + + raw_ptr memory_pressure_listener_ + GUARDED_BY_CONTEXT(sequence_checker_); + + // Handle to the main thread's task runner. This is cached because it might no + // longer be registered at the time this instance is destroyed. + scoped_refptr main_thread_task_runner_; + + // Parts of this class that lives on the main thread. + std::unique_ptr main_thread_ + GUARDED_BY_CONTEXT(sequence_checker_); + + const base::Location creation_location_ GUARDED_BY_CONTEXT(sequence_checker_); + + SEQUENCE_CHECKER(sequence_checker_); + + WeakPtrFactory weak_ptr_factory_{ + this}; +}; + +// Used for listeners that live on the main thread. Can be call synchronously or +// asynchronously. +// Note: In the future, this will be always called synchronously. +class BASE_EXPORT MemoryPressureListenerRegistration { + public: + MemoryPressureListenerRegistration( + const Location& creation_location, + MemoryPressureListenerTag tag, + MemoryPressureListener* memory_pressure_listener); + + MemoryPressureListenerRegistration( + const MemoryPressureListenerRegistration&) = delete; + MemoryPressureListenerRegistration& operator=( + const MemoryPressureListenerRegistration&) = delete; + + ~MemoryPressureListenerRegistration(); + + private: + std::variant + listener_; }; } // namespace base diff --git a/naiveproxy/src/base/memory/memory_pressure_listener_registry.cc b/naiveproxy/src/base/memory/memory_pressure_listener_registry.cc new file mode 100644 index 0000000000..4ff3303ffe --- /dev/null +++ b/naiveproxy/src/base/memory/memory_pressure_listener_registry.cc @@ -0,0 +1,122 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/memory/memory_pressure_listener_registry.h" + +#include + +#include "base/feature_list.h" +#include "base/memory/memory_pressure_level.h" +#include "base/metrics/field_trial_params.h" +#include "base/trace_event/interned_args_helper.h" +#include "base/trace_event/memory_dump_manager.h" +#include "base/trace_event/memory_pressure_level_proto.h" +#include "base/trace_event/trace_event.h" +#include "base/tracing_buildflags.h" + +namespace base { + +namespace { + +std::atomic g_notifications_suppressed = false; + +BASE_FEATURE(kSuppressMemoryListeners, base::FEATURE_DISABLED_BY_DEFAULT); + +BASE_FEATURE_PARAM(std::string, + kSuppressMemoryListenersMask, + &kSuppressMemoryListeners, + "suppress_memory_listeners_mask", + ""); +} // namespace + +MemoryPressureListenerRegistry::MemoryPressureListenerRegistry() = default; + +// static +MemoryPressureListenerRegistry& MemoryPressureListenerRegistry::Get() { + static auto* const registry = new MemoryPressureListenerRegistry(); + return *registry; +} + +// static +void MemoryPressureListenerRegistry::NotifyMemoryPressure( + MemoryPressureLevel memory_pressure_level) { + DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); + TRACE_EVENT_INSTANT( + trace_event::MemoryDumpManager::kTraceCategory, + "MemoryPressureListener::NotifyMemoryPressure", + [&](perfetto::EventContext ctx) { + auto* event = ctx.event(); + auto* data = event->set_chrome_memory_pressure_notification(); + data->set_level( + trace_event::MemoryPressureLevelToTraceEnum(memory_pressure_level)); + }); + if (AreNotificationsSuppressed()) { + return; + } + Get().DoNotifyMemoryPressure(memory_pressure_level); +} + +void MemoryPressureListenerRegistry::AddObserver( + SyncMemoryPressureListenerRegistration* listener) { + CHECK( + !SingleThreadTaskRunner::HasMainThreadDefault() || + SingleThreadTaskRunner::GetMainThreadDefault()->BelongsToCurrentThread()); + listeners_.AddObserver(listener); +} + +void MemoryPressureListenerRegistry::RemoveObserver( + SyncMemoryPressureListenerRegistration* listener) { + listeners_.RemoveObserver(listener); +} + +void MemoryPressureListenerRegistry::DoNotifyMemoryPressure( + MemoryPressureLevel memory_pressure_level) { + if (base::FeatureList::IsEnabled(kSuppressMemoryListeners)) { + auto mask = kSuppressMemoryListenersMask.Get(); + for (auto& listener : listeners_) { + const size_t tag_index = static_cast(listener.tag()); + // Only Notify observers that aren't suppressed. An observer is suppressed + // if its tag is present in the mask, the value is not '0'. A value of '1' + // suppresses non critical levels, and a value of '2' supressess all + // levels. + if (tag_index >= mask.size() || mask[tag_index] == '0' || + (mask[tag_index] == '1' && + memory_pressure_level == MEMORY_PRESSURE_LEVEL_CRITICAL)) { + listener.Notify(memory_pressure_level); + } + } + } else { + listeners_.Notify(&SyncMemoryPressureListenerRegistration::Notify, + memory_pressure_level); + } +} + +// static +bool MemoryPressureListenerRegistry::AreNotificationsSuppressed() { + return g_notifications_suppressed.load(std::memory_order_acquire); +} + +// static +void MemoryPressureListenerRegistry::SetNotificationsSuppressed(bool suppress) { + g_notifications_suppressed.store(suppress, std::memory_order_release); +} + +// static +void MemoryPressureListenerRegistry::SimulatePressureNotification( + MemoryPressureLevel memory_pressure_level) { + // Notify all listeners even if regular pressure notifications are suppressed. + Get().DoNotifyMemoryPressure(memory_pressure_level); +} + +// static +void MemoryPressureListenerRegistry::SimulatePressureNotificationAsync( + MemoryPressureLevel memory_pressure_level) { + CHECK(base::SingleThreadTaskRunner::GetMainThreadDefault() + ->BelongsToCurrentThread()); + base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, + base::BindOnce(&SimulatePressureNotification, memory_pressure_level)); +} + +} // namespace base diff --git a/naiveproxy/src/base/memory/memory_pressure_listener_registry.h b/naiveproxy/src/base/memory/memory_pressure_listener_registry.h new file mode 100644 index 0000000000..86ac5c5841 --- /dev/null +++ b/naiveproxy/src/base/memory/memory_pressure_listener_registry.h @@ -0,0 +1,53 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_MEMORY_MEMORY_PRESSURE_LISTENER_REGISTRY_H_ +#define BASE_MEMORY_MEMORY_PRESSURE_LISTENER_REGISTRY_H_ + +#include "base/base_export.h" +#include "base/memory/memory_pressure_level.h" +#include "base/memory/memory_pressure_listener.h" +#include "base/observer_list.h" +#include "base/observer_list_threadsafe.h" + +namespace base { + +// This class is thread safe and internally synchronized. +class BASE_EXPORT MemoryPressureListenerRegistry { + public: + MemoryPressureListenerRegistry(); + // There is at most one MemoryPressureListenerRegistry and it is never + // deleted. + ~MemoryPressureListenerRegistry() = delete; + + // Gets the shared MemoryPressureListenerRegistry singleton instance. + static MemoryPressureListenerRegistry& Get(); + + // Intended for use by the platform specific implementation. + static void NotifyMemoryPressure(MemoryPressureLevel memory_pressure_level); + + void AddObserver(SyncMemoryPressureListenerRegistration* listener); + + void RemoveObserver(SyncMemoryPressureListenerRegistration* listener); + + // These methods should not be used anywhere else but in memory measurement + // code, where they are intended to maintain stable conditions across + // measurements. + static bool AreNotificationsSuppressed(); + static void SetNotificationsSuppressed(bool suppressed); + static void SimulatePressureNotification( + MemoryPressureLevel memory_pressure_level); + static void SimulatePressureNotificationAsync( + MemoryPressureLevel memory_pressure_level); + + private: + void DoNotifyMemoryPressure(MemoryPressureLevel memory_pressure_level); + + base::ObserverList::Unchecked + listeners_; +}; + +} // namespace base + +#endif // BASE_MEMORY_MEMORY_PRESSURE_LISTENER_REGISTRY_H_ diff --git a/naiveproxy/src/base/memory/memory_pressure_monitor.h b/naiveproxy/src/base/memory/memory_pressure_monitor.h index d91a8f8d28..8331da7d0d 100644 --- a/naiveproxy/src/base/memory/memory_pressure_monitor.h +++ b/naiveproxy/src/base/memory/memory_pressure_monitor.h @@ -12,6 +12,24 @@ namespace base { +enum class MemoryPressureMonitorTag { + kTest = 0, + kGlicProfileManager = 1, + kLongScreenshotsTabService = 2, + kPaintPreviewTabService = 3, + kTabLoader = 4, + kTabHoverCardController = 5, + kWebUIContentsPreloadManager = 6, + kOnDeviceTailModelService = 7, + kPlayerCompositorDelegate = 8, + kFrameEvictionManager = 9, + kPrerenderHostRegistry = 10, + kSubframeShutdownDelay = 11, + kSpareRendererHostManager = 12, + kUsbDeviceLinux = 13, + kMax, +}; + // TODO(chrisha): Make this a concrete class with per-OS implementations rather // than an abstract base class. @@ -23,7 +41,6 @@ namespace base { // all MemoryPressureListener instances via a callback. class BASE_EXPORT MemoryPressureMonitor { public: - using MemoryPressureLevel = base::MemoryPressureListener::MemoryPressureLevel; using DispatchCallback = base::RepeatingCallback; @@ -36,7 +53,8 @@ class BASE_EXPORT MemoryPressureMonitor { static MemoryPressureMonitor* Get(); // Returns the currently observed memory pressure. - virtual MemoryPressureLevel GetCurrentPressureLevel() const = 0; + virtual MemoryPressureLevel GetCurrentPressureLevel( + base::MemoryPressureMonitorTag tag) const = 0; protected: MemoryPressureMonitor(); diff --git a/naiveproxy/src/base/memory/mock_memory_pressure_listener.cc b/naiveproxy/src/base/memory/mock_memory_pressure_listener.cc new file mode 100644 index 0000000000..cfa4ef58d8 --- /dev/null +++ b/naiveproxy/src/base/memory/mock_memory_pressure_listener.cc @@ -0,0 +1,26 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/memory/mock_memory_pressure_listener.h" + +namespace base { + +MockMemoryPressureListener::MockMemoryPressureListener() = default; + +MockMemoryPressureListener::~MockMemoryPressureListener() = default; + +RegisteredMockMemoryPressureListener::RegisteredMockMemoryPressureListener() + : registration_(MemoryPressureListenerTag::kTest, this) {} + +RegisteredMockMemoryPressureListener::~RegisteredMockMemoryPressureListener() = + default; + +RegisteredMockAsyncMemoryPressureListener:: + RegisteredMockAsyncMemoryPressureListener() + : registration_(FROM_HERE, MemoryPressureListenerTag::kTest, this) {} + +RegisteredMockAsyncMemoryPressureListener:: + ~RegisteredMockAsyncMemoryPressureListener() = default; + +} // namespace base diff --git a/naiveproxy/src/base/memory/mock_memory_pressure_listener.h b/naiveproxy/src/base/memory/mock_memory_pressure_listener.h new file mode 100644 index 0000000000..255ef09d08 --- /dev/null +++ b/naiveproxy/src/base/memory/mock_memory_pressure_listener.h @@ -0,0 +1,45 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_MEMORY_MOCK_MEMORY_PRESSURE_LISTENER_H_ +#define BASE_MEMORY_MOCK_MEMORY_PRESSURE_LISTENER_H_ + +#include "base/memory/memory_pressure_listener.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace base { + +class MockMemoryPressureListener : public MemoryPressureListener { + public: + MockMemoryPressureListener(); + ~MockMemoryPressureListener() override; + + MOCK_METHOD(void, OnMemoryPressure, (base::MemoryPressureLevel), (override)); +}; + +// Same as MockMemoryPressureListener, but automatically registers with the +// global registry. +class RegisteredMockMemoryPressureListener : public MockMemoryPressureListener { + public: + RegisteredMockMemoryPressureListener(); + ~RegisteredMockMemoryPressureListener() override; + + private: + SyncMemoryPressureListenerRegistration registration_; +}; + +// Async version of RegisteredMockMemoryPressureListener. +class RegisteredMockAsyncMemoryPressureListener + : public MockMemoryPressureListener { + public: + RegisteredMockAsyncMemoryPressureListener(); + ~RegisteredMockAsyncMemoryPressureListener() override; + + private: + AsyncMemoryPressureListenerRegistration registration_; +}; + +} // namespace base + +#endif // BASE_MEMORY_MOCK_MEMORY_PRESSURE_LISTENER_H_ diff --git a/naiveproxy/src/base/memory/platform_shared_memory_handle.h b/naiveproxy/src/base/memory/platform_shared_memory_handle.h index 61909e625f..2eb9a4f39a 100644 --- a/naiveproxy/src/base/memory/platform_shared_memory_handle.h +++ b/naiveproxy/src/base/memory/platform_shared_memory_handle.h @@ -34,6 +34,8 @@ struct BASE_EXPORT FDPair { // The read-only descriptor, valid only in kWritable mode. Replaces |fd| when // a region is converted to read-only. int readonly_fd; + + friend bool operator==(const FDPair&, const FDPair&) = default; }; struct BASE_EXPORT ScopedFDPair { diff --git a/naiveproxy/src/base/memory/platform_shared_memory_mapper_android.cc b/naiveproxy/src/base/memory/platform_shared_memory_mapper_android.cc index 36df982ee0..1a915743b9 100644 --- a/naiveproxy/src/base/memory/platform_shared_memory_mapper_android.cc +++ b/naiveproxy/src/base/memory/platform_shared_memory_mapper_android.cc @@ -18,8 +18,31 @@ std::optional> PlatformSharedMemoryMapper::Map( uint64_t offset, size_t size) { // IMPORTANT: Even if the mapping is readonly and the mapped data is not - // changing, the region must ALWAYS be mapped with MAP_SHARED, otherwise with - // ashmem the mapping is equivalent to a private anonymous mapping. + // changing, the region should be mapped with MAP_SHARED. + // + // With ashmem doing a mmap(MAP_PRIVATE) would be equivalent anonymous + // mapping, not a shared one. + // + // Historically, memfd had the opposite and confusing behavior: attempting to + // mmap(MAP_SHARED) a sealed, read-only region would fail, while + // mmap(MAP_PRIVATE) would correctly create a read-only shared mapping. + // + // This inconsistency was resolved in Linux kernel 6.7, which now allows + // MAP_SHARED to work as well. This fix may also be cherry-picked to + // older LTS kernels. + // + // See the upstream patches: + // https://lkml.kernel.org/r/cover.1697116581.git.lstoakes@gmail.com + // + // For old devices PlatformSharedMemoryMapper only receives ashmem regions. + // New devices shipping with Android 17 do not have ashmem, and memfd should + // be used instead. These new systems are based on 6.12+ kernels (in other + // words, MAP_SHARED works for them). Devices updating to Android 17 + // (potentially with kernels as old as 6.6) continue using ashmem. + // + // Therefore, it is unnecessary to dynamically check the memory region type + // (ashmem vs. memfd), as MAP_SHARED is the correct flag for all scenarios + // this code handles. void* address = mmap(nullptr, size, PROT_READ | (write_allowed ? PROT_WRITE : 0), MAP_SHARED, handle, checked_cast(offset)); diff --git a/naiveproxy/src/base/memory/platform_shared_memory_region.h b/naiveproxy/src/base/memory/platform_shared_memory_region.h index bbd0653eca..30c62557aa 100644 --- a/naiveproxy/src/base/memory/platform_shared_memory_region.h +++ b/naiveproxy/src/base/memory/platform_shared_memory_region.h @@ -19,12 +19,6 @@ #include "base/unguessable_token.h" #include "build/build_config.h" -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) -namespace content { -class SandboxIPCHandler; -} -#endif - namespace base { namespace subtle { @@ -86,26 +80,6 @@ class BASE_EXPORT PlatformSharedMemoryRegion { kMaxValue = GET_SHMEM_TEMP_DIR_FAILURE }; -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) - // Structure to limit access to executable region creation. - struct ExecutableRegion { - private: - // Creates a new shared memory region the unsafe mode (writable and not and - // convertible to read-only), and in addition marked executable. A ScopedFD - // to this region is returned. Any any mapping will have to be done - // manually, including setting executable permissions if necessary - // - // This is only used to support sandbox_ipc_linux.cc, and should not be used - // anywhere else in chrome. This is restricted via AllowCreateExecutable. - // TODO(crbug.com/41470149): remove this when NaCl is unshipped. - // - // Returns an invalid ScopedFD if the call fails. - static ScopedFD CreateFD(size_t size); - - friend class content::SandboxIPCHandler; - }; -#endif - // The minimum alignment in bytes that any mapped address produced by Map() // and MapAt() is guaranteed to have. enum { kMapMinimumAlignment = 32 }; diff --git a/naiveproxy/src/base/memory/platform_shared_memory_region_android.cc b/naiveproxy/src/base/memory/platform_shared_memory_region_android.cc index 8ce2876543..a40155da38 100644 --- a/naiveproxy/src/base/memory/platform_shared_memory_region_android.cc +++ b/naiveproxy/src/base/memory/platform_shared_memory_region_android.cc @@ -6,6 +6,7 @@ #include +#include "base/android/linker/ashmem.h" #include "base/bits.h" #include "base/check_op.h" #include "base/logging.h" @@ -14,7 +15,6 @@ #include "base/metrics/histogram_macros.h" #include "base/posix/eintr_wrapper.h" #include "base/types/expected.h" -#include "third_party/ashmem/ashmem.h" namespace base { namespace subtle { diff --git a/naiveproxy/src/base/memory/platform_shared_memory_region_posix.cc b/naiveproxy/src/base/memory/platform_shared_memory_region_posix.cc index 37b6c29f29..ebdaab8cad 100644 --- a/naiveproxy/src/base/memory/platform_shared_memory_region_posix.cc +++ b/naiveproxy/src/base/memory/platform_shared_memory_region_posix.cc @@ -59,18 +59,6 @@ std::optional CheckFDAccessMode(int fd, int expected_mode) { } // namespace -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) -// static -ScopedFD PlatformSharedMemoryRegion::ExecutableRegion::CreateFD(size_t size) { - PlatformSharedMemoryRegion region = - Create(Mode::kUnsafe, size, true /* executable */); - if (region.IsValid()) { - return region.PassPlatformHandle().fd; - } - return ScopedFD(); -} -#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) - // static expected PlatformSharedMemoryRegion::TakeOrFail(ScopedFDPair handle, diff --git a/naiveproxy/src/base/memory/platform_shared_memory_region_win.cc b/naiveproxy/src/base/memory/platform_shared_memory_region_win.cc index a9bf95255c..52dae77f50 100644 --- a/naiveproxy/src/base/memory/platform_shared_memory_region_win.cc +++ b/naiveproxy/src/base/memory/platform_shared_memory_region_win.cc @@ -72,10 +72,10 @@ bool IsSectionSafeToMap(HANDLE handle) { // In order to remove the access control permissions, after being created the // handle is duplicated with only the file access permissions. HANDLE CreateFileMappingWithReducedPermissions(SECURITY_ATTRIBUTES* sa, - size_t rounded_size, + size_t size, LPCWSTR name) { HANDLE h = CreateFileMapping(INVALID_HANDLE_VALUE, sa, PAGE_READWRITE, 0, - static_cast(rounded_size), name); + static_cast(size), name); if (!h) { return nullptr; } @@ -194,15 +194,22 @@ bool PlatformSharedMemoryRegion::ConvertToUnsafe() { // static PlatformSharedMemoryRegion PlatformSharedMemoryRegion::Create(Mode mode, size_t size) { - // TODO(crbug.com/40307662): NaCl forces us to round up 64k here, wasting 32k - // per mapping on average. - static const size_t kSectionSize = 65536; if (size == 0) { return {}; } - // Aligning may overflow so check that the result doesn't decrease. + // Historically, //base aligned sizes to 64k due to NaCl constraints (see + // crbug.com/40307662). Windows itself doesn't enforce any alignment on + // sizes (internally, it appears to align on page size though). + // + // However, Windows also has the concept of "allocation granularity", which + // is 64K–this is probably the origin of NaCl's constraints. However, even + // though NaCl is gone, V8's address space management has many `CHECK()`s + // throughout that the size is aligned to allocation granularity–so for now, + // preserve the old alignment behavior to avoid breaking V8. + static const size_t kSectionSize = 65536; size_t rounded_size = bits::AlignUp(size, kSectionSize); + // Aligning may overflow so check that the result doesn't decrease. if (rounded_size < size || rounded_size > static_cast(std::numeric_limits::max())) { return {}; diff --git a/naiveproxy/src/base/memory/post_delayed_memory_reduction_task.h b/naiveproxy/src/base/memory/post_delayed_memory_reduction_task.h index 9d746262c4..14a4dd0cb7 100644 --- a/naiveproxy/src/base/memory/post_delayed_memory_reduction_task.h +++ b/naiveproxy/src/base/memory/post_delayed_memory_reduction_task.h @@ -6,6 +6,7 @@ #define BASE_MEMORY_POST_DELAYED_MEMORY_REDUCTION_TASK_H_ #include "base/task/sequenced_task_runner.h" +#include "base/time/time.h" namespace base { diff --git a/naiveproxy/src/base/memory/raw_ptr.md b/naiveproxy/src/base/memory/raw_ptr.md index 62870e2977..2c3070c4be 100644 --- a/naiveproxy/src/base/memory/raw_ptr.md +++ b/naiveproxy/src/base/memory/raw_ptr.md @@ -694,6 +694,14 @@ You will need to make sure that `DoStuff()` is sufficiently trivial and can't `DoOtherStuff()` call may be considered protected. The tool will provide you with the stack trace for both the extraction and dereference events. +Note that this becomes significantly more difficult in the presence of +multiple threads. In order to avoid exploitable race conditions, the +creation of the `raw_ptr` must be sequenced before the free, and it +must not be destroyed or change its value before the use. `raw_ptr` +only prevents exploitation if no possible allocation of sqeuences to +threads and no possible interleaving of thread operations could result +in this region having no `raw_ptr`. + #### Not protected The dangling `T*` doesn't appear to originate from a `raw_ptr` variable, diff --git a/naiveproxy/src/base/memory/ref_counted.h b/naiveproxy/src/base/memory/ref_counted.h index 9826eb4cc1..e95b8d25da 100644 --- a/naiveproxy/src/base/memory/ref_counted.h +++ b/naiveproxy/src/base/memory/ref_counted.h @@ -325,8 +325,8 @@ class BASE_EXPORT ScopedAllowCrossThreadRefCountAccess final { // that has zero ref count. That tends to happen on custom deleter that // delays the deletion. // TODO(tzik): Implement invalid acquisition detection. -// - Behavior parity to Blink's WTF::RefCounted, whose count starts from one. -// And start-from-one ref count is a step to merge WTF::RefCounted into +// - Behavior parity to Blink's blink::RefCounted, whose count starts from one. +// And start-from-one ref count is a step to merge blink::RefCounted into // base::RefCounted. // #define REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE() \ diff --git a/naiveproxy/src/base/memory/safety_checks.h b/naiveproxy/src/base/memory/safety_checks.h index fd45631fbf..89d855f5ec 100644 --- a/naiveproxy/src/base/memory/safety_checks.h +++ b/naiveproxy/src/base/memory/safety_checks.h @@ -67,7 +67,7 @@ namespace internal { enum class MemorySafetyCheck : uint32_t { kNone = 0, kForcePartitionAlloc = (1u << 0), - // Enables |FreeFlags::kSchedulerLoopQuarantine|. + // Enables |FreeFlags::kSchedulerLoopQuarantineForAdvancedMemorySafetyChecks|. // Requires PA-E. kSchedulerLoopQuarantine = (1u << 1), }; @@ -119,7 +119,8 @@ constexpr partition_alloc::AllocFlags GetAllocFlags(MemorySafetyCheck checks) { constexpr partition_alloc::FreeFlags GetFreeFlags(MemorySafetyCheck checks) { auto flags = partition_alloc::FreeFlags::kNone; if (static_cast(checks & MemorySafetyCheck::kSchedulerLoopQuarantine)) { - flags |= partition_alloc::FreeFlags::kSchedulerLoopQuarantine; + flags |= partition_alloc::FreeFlags:: + kSchedulerLoopQuarantineForAdvancedMemorySafetyChecks; } return flags; } @@ -341,12 +342,14 @@ class BASE_EXPORT ScopedSafetyChecksExclusion { #if PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) using base::allocator::SchedulerLoopQuarantineScanPolicyUpdater; +using base::allocator::ScopedSchedulerLoopQuarantineDisallowScanlessPurge; #else class SchedulerLoopQuarantineScanPolicyUpdater { public: ALWAYS_INLINE void DisallowScanlessPurge() {} ALWAYS_INLINE void AllowScanlessPurge() {} }; +class ScopedSchedulerLoopQuarantineDisallowScanlessPurge {}; #endif // PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) } // namespace base diff --git a/naiveproxy/src/base/memory/shared_memory_security_policy.cc b/naiveproxy/src/base/memory/shared_memory_security_policy.cc index c03dba3b4a..a72a7bc2e6 100644 --- a/naiveproxy/src/base/memory/shared_memory_security_policy.cc +++ b/naiveproxy/src/base/memory/shared_memory_security_policy.cc @@ -10,8 +10,8 @@ #include #include "base/bits.h" -#include "base/memory/page_size.h" #include "base/numerics/checked_math.h" +#include "base/system/sys_info.h" #include "build/build_config.h" namespace base { @@ -30,15 +30,17 @@ constexpr size_t kTotalMappedSizeLimit = 32ULL * 1024 * 1024 * 1024; static std::atomic_size_t total_mapped_size_; std::optional AlignWithPageSize(size_t size) { -#if BUILDFLAG(IS_WIN) - // TODO(crbug.com/40307662): Matches alignment requirements defined in - // platform_shared_memory_region_win.cc:PlatformSharedMemoryRegion::Create. - // Remove this when NaCl is gone. - static const size_t kSectionSize = 65536; - const size_t page_size = std::max(kSectionSize, GetPageSize()); -#else - const size_t page_size = GetPageSize(); -#endif // BUILDFLAG(IS_WIN) + // Note that the function name says "page size", but on Windows, the + // allocation granularity is distinct from the page size: on typical systems, + // the allocation granularity is 64KB but the page size is 4KB. In practice, + // `MapViewOfFile()` returns addresses that are aligned to the allocation + // granularity, so every mapping on Windows costs at least 64KB. + // + // TODO(crbug.com/440123090): Windows 10 version 1803 and later provide + // `VirtualAlloc2()` and `MapViewOfFile3()` to relax the alignment to page + // granularity. This will also require sorting out the alignment checks in V8, + // which largely use allocation granularity instead of page size. + const size_t page_size = SysInfo::VMAllocationGranularity(); size_t rounded_size = bits::AlignUp(size, page_size); // Fail on overflow. diff --git a/naiveproxy/src/base/memory/shared_memory_tracker.cc b/naiveproxy/src/base/memory/shared_memory_tracker.cc index 354f427963..c6c3eb41fd 100644 --- a/naiveproxy/src/base/memory/shared_memory_tracker.cc +++ b/naiveproxy/src/base/memory/shared_memory_tracker.cc @@ -99,14 +99,12 @@ SharedMemoryTracker::GetOrCreateSharedMemoryDumpInternal( size_t virtual_size = mapped_size; // If resident size is not available, a virtual size is used as fallback. size_t size = virtual_size; -#if defined(COUNT_RESIDENT_BYTES_SUPPORTED) std::optional resident_size = trace_event::ProcessMemoryDump::CountResidentBytesInSharedMemory( mapped_memory, mapped_size); if (resident_size.has_value()) { size = resident_size.value(); } -#endif local_dump = pmd->CreateAllocatorDump(dump_name); local_dump->AddScalar(trace_event::MemoryAllocatorDump::kNameSize, diff --git a/naiveproxy/src/base/memory/values_equivalent.h b/naiveproxy/src/base/memory/values_equivalent.h index c85f9f2398..d912ee2f57 100644 --- a/naiveproxy/src/base/memory/values_equivalent.h +++ b/naiveproxy/src/base/memory/values_equivalent.h @@ -9,8 +9,6 @@ #include #include -#include "base/memory/scoped_refptr.h" - namespace base { namespace internal { diff --git a/naiveproxy/src/base/memory_coordinator/async_memory_consumer_registration.cc b/naiveproxy/src/base/memory_coordinator/async_memory_consumer_registration.cc index 467e1b5a51..6795b39c99 100644 --- a/naiveproxy/src/base/memory_coordinator/async_memory_consumer_registration.cc +++ b/naiveproxy/src/base/memory_coordinator/async_memory_consumer_registration.cc @@ -20,13 +20,18 @@ namespace base { class AsyncMemoryConsumerRegistration::MainThread : public MemoryConsumer { public: - MainThread(std::string observer_id, - MemoryConsumerTraits traits, - WeakPtr parent, - scoped_refptr consumer_task_runner) - : consumer_task_runner_(std::move(consumer_task_runner)), - parent_(std::move(parent)), - registration_(std::move(observer_id), traits, this) {} + MainThread() { DETACH_FROM_THREAD(thread_checker_); } + + void Init(std::string consumer_id, + MemoryConsumerTraits traits, + CheckUnregister check_unregister, + WeakPtr parent, + scoped_refptr consumer_task_runner) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + consumer_task_runner_ = std::move(consumer_task_runner); + parent_ = std::move(parent); + registration_.emplace(consumer_id, traits, this, check_unregister); + } private: // MemoryConsumer: @@ -54,7 +59,7 @@ class AsyncMemoryConsumerRegistration::MainThread : public MemoryConsumer { GUARDED_BY_CONTEXT(thread_checker_); // The registration with the MemoryConsumerRegistry. - ScopedMemoryConsumerRegistration registration_ + std::optional registration_ GUARDED_BY_CONTEXT(thread_checker_); THREAD_CHECKER(thread_checker_); @@ -63,19 +68,30 @@ class AsyncMemoryConsumerRegistration::MainThread : public MemoryConsumer { // AsyncMemoryConsumerRegistration --------------------------------------------- AsyncMemoryConsumerRegistration::AsyncMemoryConsumerRegistration( - scoped_refptr main_task_runner, std::string_view consumer_id, MemoryConsumerTraits traits, - MemoryConsumer* consumer) + MemoryConsumer* consumer, + CheckUnregister check_unregister) : consumer_(consumer) { - DCHECK(!main_task_runner->BelongsToCurrentThread()); - main_thread_.emplace(std::move(main_task_runner), std::string(consumer_id), - traits, weak_ptr_factory_.GetWeakPtr(), - SequencedTaskRunner::GetCurrentDefault()); + main_thread_task_runner_ = SingleThreadTaskRunner::GetMainThreadDefault(); + main_thread_ = std::make_unique(); + main_thread_task_runner_->PostTask( + FROM_HERE, BindOnce(&MainThread::Init, Unretained(main_thread_.get()), + std::string(consumer_id), traits, check_unregister, + weak_ptr_factory_.GetWeakPtr(), + SequencedTaskRunner::GetCurrentDefault())); } AsyncMemoryConsumerRegistration::~AsyncMemoryConsumerRegistration() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (main_thread_) { + // To ensure |main_thread_| is deleted on the correct thread, we transfer + // ownership to a no-op task. The object is deleted with the task, even + // if it's cancelled before it can run. + main_thread_task_runner_->PostTask( + FROM_HERE, BindOnce([](std::unique_ptr main_thread) {}, + std::move(main_thread_))); + } } void AsyncMemoryConsumerRegistration::NotifyUpdateMemoryLimit(int percentage) { diff --git a/naiveproxy/src/base/memory_coordinator/async_memory_consumer_registration.h b/naiveproxy/src/base/memory_coordinator/async_memory_consumer_registration.h index 4fa33b7806..83dbb739f5 100644 --- a/naiveproxy/src/base/memory_coordinator/async_memory_consumer_registration.h +++ b/naiveproxy/src/base/memory_coordinator/async_memory_consumer_registration.h @@ -5,29 +5,31 @@ #ifndef BASE_MEMORY_COORDINATOR_ASYNC_MEMORY_CONSUMER_REGISTRATION_H_ #define BASE_MEMORY_COORDINATOR_ASYNC_MEMORY_CONSUMER_REGISTRATION_H_ +#include #include #include "base/base_export.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" +#include "base/memory_coordinator/memory_consumer.h" #include "base/memory_coordinator/traits.h" #include "base/sequence_checker.h" -#include "base/threading/sequence_bound.h" namespace base { -class MemoryConsumer; class SingleThreadTaskRunner; // Used to register a MemoryConsumer that does not live on the main thread, // which means that the consumer will receive its notifications asynchronously. class BASE_EXPORT AsyncMemoryConsumerRegistration { public: + using CheckUnregister = MemoryConsumerRegistration::CheckUnregister; + AsyncMemoryConsumerRegistration( - scoped_refptr main_thread_task_runner, std::string_view consumer_id, MemoryConsumerTraits traits, - MemoryConsumer* consumer); + MemoryConsumer* consumer, + CheckUnregister check_unregister = CheckUnregister::kEnabled); ~AsyncMemoryConsumerRegistration(); private: @@ -39,8 +41,13 @@ class BASE_EXPORT AsyncMemoryConsumerRegistration { // A pointer to the actual consumer. Must outlive `this`. raw_ptr consumer_ GUARDED_BY_CONTEXT(sequence_checker_); + // Handle to the main thread's task runner. This is cached because it might no + // longer be registered at the time this instance is destroyed. + scoped_refptr main_thread_task_runner_; + // Parts of this class that lives on the main thread. - SequenceBound main_thread_ GUARDED_BY_CONTEXT(sequence_checker_); + std::unique_ptr main_thread_ + GUARDED_BY_CONTEXT(sequence_checker_); SEQUENCE_CHECKER(sequence_checker_); diff --git a/naiveproxy/src/base/memory_coordinator/memory_consumer.cc b/naiveproxy/src/base/memory_coordinator/memory_consumer.cc index b0b0e6fcb9..73c991f758 100644 --- a/naiveproxy/src/base/memory_coordinator/memory_consumer.cc +++ b/naiveproxy/src/base/memory_coordinator/memory_consumer.cc @@ -11,6 +11,10 @@ namespace base { // MemoryConsumer --------------------------------------------------- +MemoryConsumer::MemoryConsumer() { + DETACH_FROM_SEQUENCE(sequence_checker_); +} + void MemoryConsumer::ReleaseMemory() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); OnReleaseMemory(); @@ -24,19 +28,38 @@ void MemoryConsumer::UpdateMemoryLimit(int percentage) { OnUpdateMemoryLimit(); } -// ScopedMemoryConsumerRegistration --------------------------------- +// MemoryConsumerRegistration --------------------------------------- -ScopedMemoryConsumerRegistration::ScopedMemoryConsumerRegistration( +MemoryConsumerRegistration::MemoryConsumerRegistration( std::string_view consumer_id, MemoryConsumerTraits traits, - MemoryConsumer* consumer) - : consumer_id_(consumer_id), consumer_(consumer) { - MemoryConsumerRegistry::Get().AddMemoryConsumer(consumer_id, traits, - consumer_); + MemoryConsumer* consumer, + CheckUnregister check_unregister) + : consumer_id_(consumer_id), + consumer_(consumer), + check_unregister_(check_unregister), + registry_(&MemoryConsumerRegistry::Get()) { + registry_->AddDestructionObserver(PassKey(), this); + registry_->AddMemoryConsumer(consumer_id, traits, consumer_); } -ScopedMemoryConsumerRegistration::~ScopedMemoryConsumerRegistration() { - MemoryConsumerRegistry::Get().RemoveMemoryConsumer(consumer_id_, consumer_); +MemoryConsumerRegistration::~MemoryConsumerRegistration() { + if (registry_) { + registry_->RemoveMemoryConsumer(consumer_id_, consumer_); + registry_->RemoveDestructionObserver(PassKey(), this); + } +} + +void MemoryConsumerRegistration::OnBeforeMemoryConsumerRegistryDestroyed() { + // If this function is called, this means that the registry is being destroyed + // before the unregistration. This is only acceptable if the check is + // disabled. + CHECK_EQ(check_unregister_, CheckUnregister::kDisabled) + << ". The global MemoryConsumerRegistry was destroyed before this " + "MemoryConsumerRegistration was destroyed."; + registry_->RemoveMemoryConsumer(consumer_id_, consumer_); + registry_->RemoveDestructionObserver(PassKey(), this); + registry_ = nullptr; } } // namespace base diff --git a/naiveproxy/src/base/memory_coordinator/memory_consumer.h b/naiveproxy/src/base/memory_coordinator/memory_consumer.h index 136d4b80d1..ffadcc9511 100644 --- a/naiveproxy/src/base/memory_coordinator/memory_consumer.h +++ b/naiveproxy/src/base/memory_coordinator/memory_consumer.h @@ -10,11 +10,15 @@ #include "base/base_export.h" #include "base/memory/raw_ptr.h" +#include "base/memory_coordinator/memory_consumer_registry_destruction_observer.h" #include "base/memory_coordinator/traits.h" #include "base/sequence_checker.h" +#include "base/types/pass_key.h" namespace base { +class MemoryConsumerRegistry; + // The MemoryConsumer is used to coordinate memory usage across all processes. // By registering with the MemoryConsumerRegistry, instances of this class are // notified when they should reduce or increase memory usage. @@ -69,6 +73,7 @@ namespace base { // class BASE_EXPORT MemoryConsumer { public: + MemoryConsumer(); virtual ~MemoryConsumer() = default; // The memory limit, expressed as a percentage. @@ -104,22 +109,45 @@ class BASE_EXPORT MemoryConsumer { // Similar to ScopedObservation, registers a MemoryConsumer with the global // MemoryConsumerRegistry. -class BASE_EXPORT ScopedMemoryConsumerRegistration { +// +// If `check_unregister` is kEnabled, this class will assert that the +// registration object is destroyed before the destruction of the global +// registry. It can be useful to disable this assert for globals that are +// sometimes leaked. +class BASE_EXPORT MemoryConsumerRegistration + : public MemoryConsumerRegistryDestructionObserver { public: - ScopedMemoryConsumerRegistration(std::string_view consumer_id, - MemoryConsumerTraits traits, - MemoryConsumer* consumer); + enum class CheckUnregister { + kEnabled, + kDisabled, + }; - ScopedMemoryConsumerRegistration(const ScopedMemoryConsumerRegistration&) = + MemoryConsumerRegistration( + std::string_view consumer_id, + MemoryConsumerTraits traits, + MemoryConsumer* consumer, + CheckUnregister check_unregister = CheckUnregister::kEnabled); + + MemoryConsumerRegistration(const MemoryConsumerRegistration&) = delete; + MemoryConsumerRegistration& operator=(const MemoryConsumerRegistration&) = delete; - ScopedMemoryConsumerRegistration& operator=( - const ScopedMemoryConsumerRegistration&) = delete; - ~ScopedMemoryConsumerRegistration(); + ~MemoryConsumerRegistration() override; + + // MemoryConsumerRegistryDestructionObserver: + void OnBeforeMemoryConsumerRegistryDestroyed() override; private: + using PassKey = PassKey; + std::string consumer_id_; raw_ptr consumer_; + + // Indicates if failure to unregister in time should cause a CHECK failure, or + // if it should simply be ignored. + CheckUnregister check_unregister_; + + raw_ptr registry_; }; } // namespace base diff --git a/naiveproxy/src/base/memory_coordinator/memory_consumer_registry.cc b/naiveproxy/src/base/memory_coordinator/memory_consumer_registry.cc index 04317bf9fa..5ba4f963e7 100644 --- a/naiveproxy/src/base/memory_coordinator/memory_consumer_registry.cc +++ b/naiveproxy/src/base/memory_coordinator/memory_consumer_registry.cc @@ -27,6 +27,11 @@ RegisteredMemoryConsumer::RegisteredMemoryConsumer( MemoryConsumer* memory_consumer) : memory_consumer_(memory_consumer) {} +// static +bool MemoryConsumerRegistry::Exists() { + return g_memory_consumer_registry; +} + // static MemoryConsumerRegistry& MemoryConsumerRegistry::Get() { CHECK(g_memory_consumer_registry); @@ -39,6 +44,18 @@ void MemoryConsumerRegistry::Set(MemoryConsumerRegistry* instance) { g_memory_consumer_registry = instance; } +MemoryConsumerRegistry::MemoryConsumerRegistry() = default; + +MemoryConsumerRegistry::~MemoryConsumerRegistry() { + // Checks that implementations of this class correctly call + // NotifyDestruction(). + CHECK(destruction_observers_notified_); + + // Checks that implementations of the destruction observer interface correctly + // unregister themselves. + CHECK(destruction_observers_.empty()); +} + void MemoryConsumerRegistry::AddMemoryConsumer(std::string_view consumer_id, MemoryConsumerTraits traits, MemoryConsumer* consumer) { @@ -53,4 +70,22 @@ void MemoryConsumerRegistry::RemoveMemoryConsumer(std::string_view consumer_id, OnMemoryConsumerRemoved(consumer_id, RegisteredMemoryConsumer(consumer)); } +void MemoryConsumerRegistry::AddDestructionObserver( + PassKey, + MemoryConsumerRegistryDestructionObserver* observer) { + destruction_observers_.AddObserver(observer); +} + +void MemoryConsumerRegistry::RemoveDestructionObserver( + PassKey, + MemoryConsumerRegistryDestructionObserver* observer) { + destruction_observers_.RemoveObserver(observer); +} + +void MemoryConsumerRegistry::NotifyDestruction() { + destruction_observers_.Notify(&MemoryConsumerRegistryDestructionObserver:: + OnBeforeMemoryConsumerRegistryDestroyed); + destruction_observers_notified_ = true; +} + } // namespace base diff --git a/naiveproxy/src/base/memory_coordinator/memory_consumer_registry.h b/naiveproxy/src/base/memory_coordinator/memory_consumer_registry.h index 66d84cc8d6..0bc8fc418a 100644 --- a/naiveproxy/src/base/memory_coordinator/memory_consumer_registry.h +++ b/naiveproxy/src/base/memory_coordinator/memory_consumer_registry.h @@ -11,10 +11,15 @@ #include "base/base_export.h" #include "base/memory/raw_ptr.h" #include "base/memory_coordinator/memory_consumer.h" +#include "base/memory_coordinator/memory_consumer_registry_destruction_observer.h" +#include "base/observer_list.h" #include "base/sequence_checker.h" +#include "base/types/pass_key.h" namespace base { +class MemoryConsumerRegistration; + // Provides an interface to safely notify MemoryConsumers of their memory limit. class BASE_EXPORT RegisteredMemoryConsumer { public: @@ -24,6 +29,8 @@ class BASE_EXPORT RegisteredMemoryConsumer { friend bool operator==(const RegisteredMemoryConsumer& lhs, const RegisteredMemoryConsumer& rhs) = default; + int memory_limit() const { return memory_consumer_->memory_limit(); } + private: friend class MemoryConsumerRegistry; @@ -32,13 +39,17 @@ class BASE_EXPORT RegisteredMemoryConsumer { raw_ptr memory_consumer_; }; -// A minimal interface for registering a MemoryConsumer with the -// global registry for the current process. +// A base class for registering a MemoryConsumer with the global registry for +// the current process. class BASE_EXPORT MemoryConsumerRegistry { public: + static bool Exists(); static MemoryConsumerRegistry& Get(); static void Set(MemoryConsumerRegistry* instance); + MemoryConsumerRegistry(); + virtual ~MemoryConsumerRegistry(); + // Adds/Removes an instance of MemoryConsumer with a specific // `consumer_id` and `traits`. void AddMemoryConsumer(std::string_view consumer_id, @@ -47,14 +58,23 @@ class BASE_EXPORT MemoryConsumerRegistry { void RemoveMemoryConsumer(std::string_view consumer_id, MemoryConsumer* consumer); - protected: - virtual ~MemoryConsumerRegistry() = default; + void AddDestructionObserver( + PassKey, + MemoryConsumerRegistryDestructionObserver* observer); + void RemoveDestructionObserver( + PassKey, + MemoryConsumerRegistryDestructionObserver* observer); + protected: RegisteredMemoryConsumer CreateRegisteredMemoryConsumer( MemoryConsumer* memory_consumer) { return RegisteredMemoryConsumer(memory_consumer); } + // Implementations must call this at the beginning of their destructors. + // Notifies all registered MemoryConsumerRegistryDestructionObservers. + void NotifyDestruction(); + private: virtual void OnMemoryConsumerAdded(std::string_view consumer_id, MemoryConsumerTraits traits, @@ -63,6 +83,10 @@ class BASE_EXPORT MemoryConsumerRegistry { RegisteredMemoryConsumer consumer) = 0; SEQUENCE_CHECKER(sequence_checker_); + + ObserverList + destruction_observers_; + bool destruction_observers_notified_ = false; }; // Helper class for creating and registering a singleton registry. This is diff --git a/naiveproxy/src/base/memory_coordinator/memory_consumer_registry_destruction_observer.h b/naiveproxy/src/base/memory_coordinator/memory_consumer_registry_destruction_observer.h new file mode 100644 index 0000000000..a9985723fc --- /dev/null +++ b/naiveproxy/src/base/memory_coordinator/memory_consumer_registry_destruction_observer.h @@ -0,0 +1,19 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_MEMORY_COORDINATOR_MEMORY_CONSUMER_REGISTRY_DESTRUCTION_OBSERVER_H_ +#define BASE_MEMORY_COORDINATOR_MEMORY_CONSUMER_REGISTRY_DESTRUCTION_OBSERVER_H_ + +#include "base/observer_list_types.h" + +namespace base { + +class MemoryConsumerRegistryDestructionObserver : public CheckedObserver { + public: + virtual void OnBeforeMemoryConsumerRegistryDestroyed() = 0; +}; + +} // namespace base + +#endif // BASE_MEMORY_COORDINATOR_MEMORY_CONSUMER_REGISTRY_DESTRUCTION_OBSERVER_H_ diff --git a/naiveproxy/src/base/memory_coordinator/mock_memory_consumer.cc b/naiveproxy/src/base/memory_coordinator/mock_memory_consumer.cc index 8fad5aa822..b8445b07ea 100644 --- a/naiveproxy/src/base/memory_coordinator/mock_memory_consumer.cc +++ b/naiveproxy/src/base/memory_coordinator/mock_memory_consumer.cc @@ -10,4 +10,11 @@ MockMemoryConsumer::MockMemoryConsumer() = default; MockMemoryConsumer::~MockMemoryConsumer() = default; +RegisteredMockMemoryConsumer::RegisteredMockMemoryConsumer( + std::string_view consumer_id, + MemoryConsumerTraits traits) + : registration_(consumer_id, traits, this) {} + +RegisteredMockMemoryConsumer::~RegisteredMockMemoryConsumer() = default; + } // namespace base diff --git a/naiveproxy/src/base/memory_coordinator/mock_memory_consumer.h b/naiveproxy/src/base/memory_coordinator/mock_memory_consumer.h index cc3c96b5f5..7499aad76b 100644 --- a/naiveproxy/src/base/memory_coordinator/mock_memory_consumer.h +++ b/naiveproxy/src/base/memory_coordinator/mock_memory_consumer.h @@ -19,6 +19,18 @@ class MockMemoryConsumer : public MemoryConsumer { MOCK_METHOD(void, OnReleaseMemory, (), (override)); }; +// Same as MockMemoryConsumer, but automatically registers with the global +// registry. +class RegisteredMockMemoryConsumer : public MockMemoryConsumer { + public: + RegisteredMockMemoryConsumer(std::string_view consumer_id, + MemoryConsumerTraits traits); + ~RegisteredMockMemoryConsumer() override; + + private: + MemoryConsumerRegistration registration_; +}; + } // namespace base #endif // BASE_MEMORY_COORDINATOR_MOCK_MEMORY_CONSUMER_H_ diff --git a/naiveproxy/src/base/memory_coordinator/test_memory_consumer_registry.cc b/naiveproxy/src/base/memory_coordinator/test_memory_consumer_registry.cc index f1848b320a..2b34c950e5 100644 --- a/naiveproxy/src/base/memory_coordinator/test_memory_consumer_registry.cc +++ b/naiveproxy/src/base/memory_coordinator/test_memory_consumer_registry.cc @@ -16,6 +16,7 @@ TestMemoryConsumerRegistry::TestMemoryConsumerRegistry() { } TestMemoryConsumerRegistry::~TestMemoryConsumerRegistry() { + NotifyDestruction(); MemoryConsumerRegistry::Set(nullptr); CHECK(memory_consumers_.empty()); diff --git a/naiveproxy/src/base/message_loop/message_pump_epoll.cc b/naiveproxy/src/base/message_loop/message_pump_epoll.cc index 5157ad33f2..f36682af0e 100644 --- a/naiveproxy/src/base/message_loop/message_pump_epoll.cc +++ b/naiveproxy/src/base/message_loop/message_pump_epoll.cc @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/390223051): Remove C-library calls to fix the errors. -#pragma allow_unsafe_libc_calls -#endif - #include "base/message_loop/message_pump_epoll.h" #include @@ -19,6 +14,7 @@ #include "base/auto_reset.h" #include "base/check_op.h" +#include "base/compiler_specific.h" #include "base/feature_list.h" #include "base/logging.h" #include "base/memory/raw_ptr.h" @@ -41,7 +37,6 @@ namespace { // Under this feature native work is batched. BASE_FEATURE(kBatchNativeEventsInMessagePumpEpoll, - "BatchNativeEventsInMessagePumpEpoll", base::FEATURE_DISABLED_BY_DEFAULT); // Caches the state of the "BatchNativeEventsInMessagePumpEpoll". @@ -543,8 +538,7 @@ bool MessagePumpEpoll::GetEventsPoll(int epoll_timeout, continue; } - epoll_event event; - memset(&event, 0, sizeof(event)); + epoll_event event = {}; if (pollfd_entry.fd == wake_event_.get()) { event.data.ptr = &wake_event_; diff --git a/naiveproxy/src/base/message_loop/message_pump_epoll.h b/naiveproxy/src/base/message_loop/message_pump_epoll.h index 06735898b8..f8fe03dbdd 100644 --- a/naiveproxy/src/base/message_loop/message_pump_epoll.h +++ b/naiveproxy/src/base/message_loop/message_pump_epoll.h @@ -17,7 +17,7 @@ #include "base/files/scoped_file.h" #include "base/memory/raw_ptr.h" #include "base/memory/raw_ptr_exclusion.h" -#include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/message_loop/message_pump.h" #include "base/message_loop/watchable_io_message_pump_posix.h" diff --git a/naiveproxy/src/base/message_loop/message_pump_glib.cc b/naiveproxy/src/base/message_loop/message_pump_glib.cc index 5df743e45e..4e89c10d36 100644 --- a/naiveproxy/src/base/message_loop/message_pump_glib.cc +++ b/naiveproxy/src/base/message_loop/message_pump_glib.cc @@ -10,12 +10,18 @@ #include "base/logging.h" #include "base/memory/raw_ptr.h" +#include "base/message_loop/io_watcher.h" #include "base/notreached.h" #include "base/numerics/safe_conversions.h" #include "base/posix/eintr_wrapper.h" #include "base/synchronization/lock.h" +#include "base/task/current_thread.h" #include "base/threading/platform_thread.h" +#if !BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_FUCHSIA) +#include "base/notimplemented.h" +#endif // !BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_FUCHSIA) + namespace base { namespace { @@ -252,6 +258,80 @@ bool RunningOnMainThread() { // 4.2.1: DoWork uses its own work item, so no ScopedDoWorkItems are active in // this case. +class FdWatchImpl : public IOWatcher::FdWatch, + public MessagePumpForIO::FdWatcher { + public: + FdWatchImpl(IOWatcher::FdWatcher* fd_watcher, const Location& location) + : fd_watcher_(fd_watcher), controller_(location) {} + + ~FdWatchImpl() override { controller_.StopWatchingFileDescriptor(); } + + MessagePumpGlib::FdWatchController& controller() { return controller_; } + + private: + // MessagePumpForIO::FdWatcher: + void OnFileCanReadWithoutBlocking(int fd) override { + fd_watcher_->OnFdReadable(fd); + } + + void OnFileCanWriteWithoutBlocking(int fd) override { + fd_watcher_->OnFdWritable(fd); + } + + const raw_ptr fd_watcher_; + MessagePumpGlib::FdWatchController controller_; +}; + +// Implements IOWatcher to allow any UI thread using a glib message pump to +// watch arbitrary file descriptors for I/O events. +class IOWatcherImpl : public IOWatcher { + public: + explicit IOWatcherImpl() : thread_(CurrentUIThread::Get()) {} + + // IOWatcher: + std::unique_ptr WatchFileDescriptorImpl( + int fd, + FdWatchDuration duration, + FdWatchMode mode, + IOWatcher::FdWatcher& watcher, + const Location& location) override { + // CurrentThreadForUI::WatchFileDescriptor is an Ozone-only feature. + // On ChromeOS, the libchrome package is built with use_glib=true, which + // includes this file. However, its configuration does not have + // BUILDFLAG(IS_OZONE) enabled, so WatchFileDescriptor is not declared. This + // guard prevents a compile error. Please note that while libchrome is + // ChromeOS specific and is used extensively by various components within + // ChromeOS, libchrome is not part of Ash-chrome. +#if BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_FUCHSIA) + MessagePumpForIO::Mode io_mode; + switch (mode) { + case FdWatchMode::kRead: + io_mode = MessagePumpForIO::WATCH_READ; + break; + case FdWatchMode::kWrite: + io_mode = MessagePumpForIO::WATCH_WRITE; + break; + case FdWatchMode::kReadWrite: + io_mode = MessagePumpForIO::WATCH_READ_WRITE; + break; + } + const bool is_persistent = duration == FdWatchDuration::kPersistent; + auto watch = std::make_unique(&watcher, location); + if (!thread_->WatchFileDescriptor(fd, is_persistent, io_mode, + &watch->controller(), watch.get())) { + return nullptr; + } + return watch; +#else + NOTIMPLEMENTED(); + return nullptr; +#endif // BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_FUCHSIA) + } + + private: + CurrentUIThread thread_; +}; + struct WorkSource : public GSource { raw_ptr pump; }; @@ -333,8 +413,7 @@ gboolean FdWatchSourceDispatch(GSource* gsource, GSourceFunc unused_func, gpointer unused_data) { auto* source = static_cast(gsource); - source->pump->HandleFdWatchDispatch(source->controller); - return TRUE; + return source->pump->HandleFdWatchDispatch(source->controller) ? TRUE : FALSE; } void FdWatchSourceFinalize(GSource* gsource) { @@ -424,6 +503,7 @@ MessagePumpGlib::MessagePumpGlib() MessagePumpGlib::~MessagePumpGlib() { work_source_.reset(); + io_watcher_.reset(); close(wakeup_pipe_read_); close(wakeup_pipe_write_); context_ = nullptr; @@ -435,9 +515,6 @@ MessagePumpGlib::FdWatchController::FdWatchController(const Location& location) MessagePumpGlib::FdWatchController::~FdWatchController() { if (IsInitialized()) { - auto* source = static_cast(source_); - source->controller = nullptr; - CHECK(StopWatchingFileDescriptor()); } if (was_destroyed_) { @@ -451,6 +528,7 @@ bool MessagePumpGlib::FdWatchController::StopWatchingFileDescriptor() { return false; } + static_cast(source_)->controller = nullptr; g_source_destroy(source_); g_source_unref(source_.ExtractAsDangling()); watcher_ = nullptr; @@ -462,6 +540,7 @@ bool MessagePumpGlib::FdWatchController::IsInitialized() const { } bool MessagePumpGlib::FdWatchController::InitOrUpdate(int fd, + bool persistent, int mode, FdWatcher* watcher) { gushort event_flags = 0; @@ -496,6 +575,7 @@ bool MessagePumpGlib::FdWatchController::InitOrUpdate(int fd, g_source_set_priority(source_, kPriorityFdWatch); watcher_ = watcher; + is_persistent_ = persistent; return true; } @@ -540,7 +620,7 @@ bool MessagePumpGlib::WatchFileDescriptor(int fd, // threadsafe, so the watcher may never be registered. DCHECK_CALLED_ON_VALID_THREAD(watch_fd_caller_checker_); - if (!controller->InitOrUpdate(fd, mode, watcher)) { + if (!controller->InitOrUpdate(fd, persistent, mode, watcher)) { DPLOG(ERROR) << "FdWatchController init failed (fd=" << fd << ")"; return false; } @@ -745,18 +825,33 @@ void MessagePumpGlib::ScheduleDelayedWork( ScheduleWork(); } +IOWatcher* MessagePumpGlib::GetIOWatcher() { + if (!io_watcher_) { + io_watcher_ = std::make_unique(); + } + return io_watcher_.get(); +} + bool MessagePumpGlib::HandleFdWatchCheck(FdWatchController* controller) { DCHECK(controller); gushort flags = controller->poll_fd_->revents; return (flags & G_IO_IN) || (flags & G_IO_OUT); } -void MessagePumpGlib::HandleFdWatchDispatch(FdWatchController* controller) { +bool MessagePumpGlib::HandleFdWatchDispatch(FdWatchController* controller) { DCHECK(controller); DCHECK(controller->poll_fd_); gushort flags = controller->poll_fd_->revents; - if ((flags & G_IO_IN) && (flags & G_IO_OUT)) { - // Both callbacks will be called. It is necessary to check that + + // The contract for a one-shot (i.e. is_persistent is false) watch is exactly + // one event fires, doesn't matter if it's read or write. This implementation + // reports writes before reads. + const bool is_persistent = controller->is_persistent_; + const bool can_write = flags & G_IO_OUT; + const bool can_read = flags & G_IO_IN && (is_persistent || !can_write); + + if (can_read && can_write) { + // In case both callbacks can be called, it's necessary to check that // |controller| is not destroyed. bool controller_was_destroyed = false; controller->was_destroyed_ = &controller_was_destroyed; @@ -767,11 +862,12 @@ void MessagePumpGlib::HandleFdWatchDispatch(FdWatchController* controller) { if (!controller_was_destroyed) { controller->was_destroyed_ = nullptr; } - } else if (flags & G_IO_IN) { - controller->NotifyCanRead(); - } else if (flags & G_IO_OUT) { + } else if (can_write) { controller->NotifyCanWrite(); + } else if (can_read) { + controller->NotifyCanRead(); } + return is_persistent; } bool MessagePumpGlib::ShouldQuit() const { diff --git a/naiveproxy/src/base/message_loop/message_pump_glib.h b/naiveproxy/src/base/message_loop/message_pump_glib.h index f2ad5d5401..525d9c38af 100644 --- a/naiveproxy/src/base/message_loop/message_pump_glib.h +++ b/naiveproxy/src/base/message_loop/message_pump_glib.h @@ -18,6 +18,8 @@ namespace base { +class IOWatcher; + // This class implements a base MessagePump needed for TYPE_UI MessageLoops on // platforms using GLib. class BASE_EXPORT MessagePumpGlib : public MessagePump, @@ -46,7 +48,7 @@ class BASE_EXPORT MessagePumpGlib : public MessagePump, // WatchFileDescriptor() and sets up a GSource for the input parameters. // The source is not attached here, so the events will not be fired until // Attach() is called. - bool InitOrUpdate(int fd, int mode, FdWatcher* watcher); + bool InitOrUpdate(int fd, bool persistent, int mode, FdWatcher* watcher); // Returns the current initialization status. bool IsInitialized() const; @@ -67,6 +69,7 @@ class BASE_EXPORT MessagePumpGlib : public MessagePump, // If this pointer is non-null, the pointee is set to true in the // destructor. raw_ptr was_destroyed_ = nullptr; + bool is_persistent_ = false; // false if this event is one-shot. }; MessagePumpGlib(); @@ -106,12 +109,13 @@ class BASE_EXPORT MessagePumpGlib : public MessagePump, void ScheduleWork() override; void ScheduleDelayedWork( const Delegate::NextWorkInfo& next_work_info) override; + IOWatcher* GetIOWatcher() override; // Internal methods used for processing the FdWatchSource callbacks. As for // main pump callbacks, they are public for simplicity but should not be used // directly. bool HandleFdWatchCheck(FdWatchController* controller); - void HandleFdWatchDispatch(FdWatchController* controller); + bool HandleFdWatchDispatch(FdWatchController* controller); private: struct GMainContextDeleter { @@ -193,6 +197,9 @@ class BASE_EXPORT MessagePumpGlib : public MessagePump, // Use a unique_ptr to avoid needing the definition of GPollFD in the header. std::unique_ptr wakeup_gpollfd_; + // The IOWatcher for this thread, lazily initialized as needed. + std::unique_ptr io_watcher_; + THREAD_CHECKER(watch_fd_caller_checker_); }; diff --git a/naiveproxy/src/base/metrics/field_trial.cc b/naiveproxy/src/base/metrics/field_trial.cc index b98df6a24b..c6bec84de1 100644 --- a/naiveproxy/src/base/metrics/field_trial.cc +++ b/naiveproxy/src/base/metrics/field_trial.cc @@ -19,6 +19,7 @@ #include "base/debug/crash_logging.h" #include "base/logging.h" #include "base/memory/raw_ptr.h" +#include "base/metrics/field_trial_entry.h" #include "base/metrics/field_trial_param_associator.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" @@ -203,63 +204,6 @@ FieldTrial::PickleState::PickleState(const PickleState& other) = default; FieldTrial::PickleState::~PickleState() = default; -bool FieldTrial::FieldTrialEntry::GetState(std::string_view& trial_name, - std::string_view& group_name, - bool& overridden) const { - PickleIterator iter = GetPickleIterator(); - return ReadHeader(iter, trial_name, group_name, overridden); -} - -bool FieldTrial::FieldTrialEntry::GetParams( - std::map* params) const { - PickleIterator iter = GetPickleIterator(); - std::string_view tmp_string; - bool tmp_bool; - // Skip reading trial and group name, and overridden bit. - if (!ReadHeader(iter, tmp_string, tmp_string, tmp_bool)) { - return false; - } - - while (true) { - std::string_view key; - std::string_view value; - if (!ReadStringPair(&iter, &key, &value)) { - return key.empty(); // Non-empty is bad: got one of a pair. - } - (*params)[std::string(key)] = std::string(value); - } -} - -PickleIterator FieldTrial::FieldTrialEntry::GetPickleIterator() const { - Pickle pickle = Pickle::WithUnownedBuffer( - // TODO(crbug.com/40284755): FieldTrialEntry should be constructed with a - // span over the pickle memory. - UNSAFE_TODO( - span(GetPickledDataPtr(), checked_cast(pickle_size)))); - return PickleIterator(pickle); -} - -bool FieldTrial::FieldTrialEntry::ReadHeader(PickleIterator& iter, - std::string_view& trial_name, - std::string_view& group_name, - bool& overridden) const { - return ReadStringPair(&iter, &trial_name, &group_name) && - iter.ReadBool(&overridden); -} - -bool FieldTrial::FieldTrialEntry::ReadStringPair( - PickleIterator* iter, - std::string_view* trial_name, - std::string_view* group_name) const { - if (!iter->ReadStringPiece(trial_name)) { - return false; - } - if (!iter->ReadStringPiece(group_name)) { - return false; - } - return true; -} - void FieldTrial::AppendGroup(const std::string& name, Probability group_probability) { // When the group choice was previously forced, we only need to return the @@ -681,8 +625,8 @@ std::set FieldTrialList::GetActiveTrialsOfParentProcess() { FieldTrialAllocator* allocator = global_->field_trial_allocator_.get(); FieldTrialAllocator::Iterator mem_iter(allocator); - const FieldTrial::FieldTrialEntry* entry; - while ((entry = mem_iter.GetNextOfObject()) != + const internal::FieldTrialEntry* entry; + while ((entry = mem_iter.GetNextOfObject()) != nullptr) { std::string_view trial_name; std::string_view group_name; @@ -939,13 +883,12 @@ bool FieldTrialList::GetParamsFromSharedMemory( } size_t allocated_size = 0; - const FieldTrial::FieldTrialEntry* entry = - global_->field_trial_allocator_->GetAsObject( + const internal::FieldTrialEntry* entry = + global_->field_trial_allocator_->GetAsObject( field_trial->ref_, &allocated_size); CHECK(entry); - uint64_t actual_size = - sizeof(FieldTrial::FieldTrialEntry) + entry->pickle_size; + uint64_t actual_size = sizeof(internal::FieldTrialEntry) + entry->pickle_size; if (allocated_size < actual_size) { return false; } @@ -975,11 +918,11 @@ void FieldTrialList::ClearParamsFromSharedMemoryForTesting() { std::vector new_refs; FieldTrial::FieldTrialRef prev_ref; - while ((prev_ref = mem_iter.GetNextOfType()) != + while ((prev_ref = mem_iter.GetNextOfType()) != FieldTrialAllocator::kReferenceNull) { // Get the existing field trial entry in shared memory. - const FieldTrial::FieldTrialEntry* prev_entry = - allocator->GetAsObject(prev_ref); + const internal::FieldTrialEntry* prev_entry = + allocator->GetAsObject(prev_ref); std::string_view trial_name; std::string_view group_name; bool is_overridden; @@ -1005,9 +948,9 @@ void FieldTrialList::ClearParamsFromSharedMemoryForTesting() { continue; } - size_t total_size = sizeof(FieldTrial::FieldTrialEntry) + pickle.size(); - FieldTrial::FieldTrialEntry* new_entry = - allocator->New(total_size); + size_t total_size = sizeof(internal::FieldTrialEntry) + pickle.size(); + internal::FieldTrialEntry* new_entry = + allocator->New(total_size); DCHECK(new_entry) << "Failed to allocate a new entry, likely because the allocator is " "full. Consider increasing kFieldTrialAllocationSize."; @@ -1028,7 +971,7 @@ void FieldTrialList::ClearParamsFromSharedMemoryForTesting() { // Mark the existing entry as unused. allocator->ChangeType(prev_ref, 0, - FieldTrial::FieldTrialEntry::kPersistentTypeId, + internal::FieldTrialEntry::kPersistentTypeId, /*clear=*/false); } @@ -1049,20 +992,6 @@ void FieldTrialList::DumpAllFieldTrialsToPersistentAllocator( } } -// static -std::vector -FieldTrialList::GetAllFieldTrialsFromPersistentAllocator( - PersistentMemoryAllocator const& allocator) { - std::vector entries; - FieldTrialAllocator::Iterator iter(&allocator); - const FieldTrial::FieldTrialEntry* entry; - while ((entry = iter.GetNextOfObject()) != - nullptr) { - entries.push_back(entry); - } - return entries; -} - // static FieldTrialList* FieldTrialList::GetInstance() { return global_; @@ -1127,8 +1056,8 @@ bool FieldTrialList::CreateTrialsFromSharedMemoryMapping( FieldTrialAllocator* shalloc = global_->field_trial_allocator_.get(); FieldTrialAllocator::Iterator mem_iter(shalloc); - const FieldTrial::FieldTrialEntry* entry; - while ((entry = mem_iter.GetNextOfObject()) != + const internal::FieldTrialEntry* entry; + while ((entry = mem_iter.GetNextOfObject()) != nullptr) { std::string_view trial_name; std::string_view group_name; @@ -1215,15 +1144,15 @@ void FieldTrialList::AddToAllocatorWhileLocked( Pickle pickle; PickleFieldTrial(trial_state, &pickle); - size_t total_size = sizeof(FieldTrial::FieldTrialEntry) + pickle.size(); + size_t total_size = sizeof(internal::FieldTrialEntry) + pickle.size(); FieldTrial::FieldTrialRef ref = allocator->Allocate( - total_size, FieldTrial::FieldTrialEntry::kPersistentTypeId); + total_size, internal::FieldTrialEntry::kPersistentTypeId); if (ref == FieldTrialAllocator::kReferenceNull) { NOTREACHED(); } - FieldTrial::FieldTrialEntry* entry = - allocator->GetAsObject(ref); + internal::FieldTrialEntry* entry = + allocator->GetAsObject(ref); subtle::NoBarrier_Store(&entry->activated, trial_state.activated); entry->pickle_size = pickle.size(); @@ -1254,8 +1183,8 @@ void FieldTrialList::ActivateFieldTrialEntryWhileLocked( // It's also okay to do this even though the callee doesn't have a lock -- // the only thing that happens on a stale read here is a slight performance // hit from the child re-synchronizing activation state. - FieldTrial::FieldTrialEntry* entry = - allocator->GetAsObject(ref); + internal::FieldTrialEntry* entry = + allocator->GetAsObject(ref); subtle::NoBarrier_Store(&entry->activated, 1); } } diff --git a/naiveproxy/src/base/metrics/field_trial.h b/naiveproxy/src/base/metrics/field_trial.h index b57fe9789c..1a6594f2e9 100644 --- a/naiveproxy/src/base/metrics/field_trial.h +++ b/naiveproxy/src/base/metrics/field_trial.h @@ -79,20 +79,15 @@ #include #include -#include "base/atomicops.h" #include "base/base_export.h" -#include "base/command_line.h" #include "base/compiler_specific.h" -#include "base/feature_list.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" #include "base/memory/read_only_shared_memory_region.h" #include "base/memory/ref_counted.h" #include "base/memory/shared_memory_mapping.h" #include "base/metrics/persistent_memory_allocator.h" -#include "base/pickle.h" #include "base/synchronization/lock.h" -#include "base/types/expected.h" #include "base/types/pass_key.h" #include "build/blink_buildflags.h" #include "build/build_config.h" @@ -104,11 +99,14 @@ namespace base { +class FeatureList; + namespace test { class ScopedFeatureList; } // namespace test class CompareActiveGroupToFieldTrialMatcher; +class CommandLine; class FieldTrialList; struct LaunchOptions; @@ -173,70 +171,6 @@ class BASE_EXPORT FieldTrial : public RefCounted { ~PickleState(); }; - // We create one FieldTrialEntry per field trial in shared memory, via - // AddToAllocatorWhileLocked. The FieldTrialEntry is followed by a - // base::Pickle object that we unpickle and read from. - struct BASE_EXPORT FieldTrialEntry { - // SHA1(FieldTrialEntry): Increment this if structure changes! - static constexpr uint32_t kPersistentTypeId = 0xABA17E13 + 3; - - // Expected size for 32/64-bit check. - static constexpr size_t kExpectedInstanceSize = 16; - - // Return a pointer to the data area immediately following the entry. - uint8_t* GetPickledDataPtr() { - return UNSAFE_TODO(reinterpret_cast(this + 1)); - } - const uint8_t* GetPickledDataPtr() const { - return UNSAFE_TODO(reinterpret_cast(this + 1)); - } - - // Whether or not this field trial is activated. This is really just a - // boolean but using a 32 bit value for portability reasons. It should be - // accessed via NoBarrier_Load()/NoBarrier_Store() to prevent the compiler - // from doing unexpected optimizations because it thinks that only one - // thread is accessing the memory location. - subtle::Atomic32 activated; - - // On e.g. x86, alignof(uint64_t) is 4. Ensure consistent size and - // alignment of `pickle_size` across platforms. This can be considered - // to be padding for the final 32 bit value (activated). If this struct - // gains or loses fields, consider if this padding is still needed. - uint32_t padding; - - // Size of the pickled structure, NOT the total size of this entry. - uint64_t pickle_size; - - // Calling this is only valid when the entry is initialized. That is, it - // resides in shared memory and has a pickle containing the trial name, - // group name, and is_overridden. - bool GetState(std::string_view& trial_name, - std::string_view& group_name, - bool& is_overridden) const; - - // Calling this is only valid when the entry is initialized as well. Reads - // the parameters following the trial and group name and stores them as - // key-value mappings in |params|. - bool GetParams(std::map* params) const; - - private: - // Returns an iterator over the data containing names and params. - PickleIterator GetPickleIterator() const; - - // Takes the iterator and writes out the first two items into |trial_name| - // and |group_name|. - bool ReadStringPair(PickleIterator* iter, - std::string_view* trial_name, - std::string_view* group_name) const; - - // Reads the field trial header, which includes the name of the trial and - // group, and the is_overridden bool. - bool ReadHeader(PickleIterator& iter, - std::string_view& trial_name, - std::string_view& group_name, - bool& is_overridden) const; - }; - typedef std::vector ActiveGroups; // A return value to indicate that a given instance has not yet had a group @@ -310,7 +244,7 @@ class BASE_EXPORT FieldTrial : public RefCounted { // // Note that currently, States returned here have is_overridden=false, but we // are in the process of migrating to marking field trials set manually by - // command line as overridden. See b/284986126. + // command line as overridden. See crbug.com/438734773. static bool ParseFieldTrialsString(std::string_view field_trials_string, bool override_trials, std::vector& entries); @@ -687,13 +621,6 @@ class BASE_EXPORT FieldTrialList { static void DumpAllFieldTrialsToPersistentAllocator( PersistentMemoryAllocator* allocator); - // Retrieves field trial state from an allocator so that it can be analyzed - // after a crash. The pointers in the returned vector are into the persistent - // memory segment and so are only valid as long as the allocator is valid. - static std::vector - GetAllFieldTrialsFromPersistentAllocator( - PersistentMemoryAllocator const& allocator); - // Returns a pointer to the global instance. This is exposed so that it can // be used in a DCHECK in FeatureList and ScopedFeatureList test-only logic // and is not intended to be used widely beyond those cases. diff --git a/naiveproxy/src/base/metrics/field_trial_entry.cc b/naiveproxy/src/base/metrics/field_trial_entry.cc new file mode 100644 index 0000000000..1945c06e95 --- /dev/null +++ b/naiveproxy/src/base/metrics/field_trial_entry.cc @@ -0,0 +1,81 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/metrics/field_trial_entry.h" + +#include "base/containers/span.h" +#include "base/numerics/safe_conversions.h" + +namespace base::internal { + +// static +std::vector +FieldTrialEntry::GetAllFieldTrialsFromPersistentAllocator( + const PersistentMemoryAllocator& allocator) { + std::vector entries; + PersistentMemoryAllocator::Iterator iter(&allocator); + const FieldTrialEntry* entry; + while ((entry = iter.GetNextOfObject()) != nullptr) { + entries.push_back(entry); + } + return entries; +} + +bool FieldTrialEntry::GetState(std::string_view& trial_name, + std::string_view& group_name, + bool& overridden) const { + PickleIterator iter = GetPickleIterator(); + return ReadHeader(iter, trial_name, group_name, overridden); +} + +bool FieldTrialEntry::GetParams( + std::map* params) const { + PickleIterator iter = GetPickleIterator(); + std::string_view tmp_string; + bool tmp_bool; + // Skip reading trial and group name, and overridden bit. + if (!ReadHeader(iter, tmp_string, tmp_string, tmp_bool)) { + return false; + } + + while (true) { + std::string_view key; + std::string_view value; + if (!ReadStringPair(&iter, &key, &value)) { + return key.empty(); // Non-empty is bad: got one of a pair. + } + (*params)[std::string(key)] = std::string(value); + } +} + +PickleIterator FieldTrialEntry::GetPickleIterator() const { + Pickle pickle = Pickle::WithUnownedBuffer( + // TODO(crbug.com/40284755): FieldTrialEntry should be constructed with a + // span over the pickle memory. + UNSAFE_TODO( + span(GetPickledDataPtr(), checked_cast(pickle_size)))); + return PickleIterator(pickle); +} + +bool FieldTrialEntry::ReadHeader(PickleIterator& iter, + std::string_view& trial_name, + std::string_view& group_name, + bool& overridden) const { + return ReadStringPair(&iter, &trial_name, &group_name) && + iter.ReadBool(&overridden); +} + +bool FieldTrialEntry::ReadStringPair(PickleIterator* iter, + std::string_view* trial_name, + std::string_view* group_name) const { + if (!iter->ReadStringPiece(trial_name)) { + return false; + } + if (!iter->ReadStringPiece(group_name)) { + return false; + } + return true; +} + +} // namespace base::internal diff --git a/naiveproxy/src/base/metrics/field_trial_entry.h b/naiveproxy/src/base/metrics/field_trial_entry.h new file mode 100644 index 0000000000..5e53110f93 --- /dev/null +++ b/naiveproxy/src/base/metrics/field_trial_entry.h @@ -0,0 +1,97 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_METRICS_FIELD_TRIAL_ENTRY_H_ +#define BASE_METRICS_FIELD_TRIAL_ENTRY_H_ + +#include +#include + +#include +#include +#include +#include + +#include "base/atomicops.h" +#include "base/base_export.h" +#include "base/compiler_specific.h" +#include "base/metrics/persistent_memory_allocator.h" +#include "base/pickle.h" + +namespace base::internal { + +// Used by field_trial.cc to represent field trials in a shared memory segment +// that's shared with child processes. One FieldTrialEntry is created per field +// trial and is followed by a base::Pickle object that gets decoded and read. +struct BASE_EXPORT FieldTrialEntry { + // SHA1(FieldTrialEntry): Increment this if structure changes! + static constexpr uint32_t kPersistentTypeId = 0xABA17E13 + 3; + + // Expected size for 32/64-bit check. + static constexpr size_t kExpectedInstanceSize = 16; + + // Retrieves field trial state from an allocator so that it can be analyzed + // after a crash. The pointers in the returned vector are into the persistent + // memory segment and so are only valid as long as the allocator is valid. + static std::vector + GetAllFieldTrialsFromPersistentAllocator( + const PersistentMemoryAllocator& allocator); + + // Return a pointer to the data area immediately following the entry. + uint8_t* GetPickledDataPtr() { + return UNSAFE_TODO(reinterpret_cast(this + 1)); + } + const uint8_t* GetPickledDataPtr() const { + return UNSAFE_TODO(reinterpret_cast(this + 1)); + } + + // Whether or not this field trial is activated. This is really just a + // boolean but using a 32 bit value for portability reasons. It should be + // accessed via NoBarrier_Load()/NoBarrier_Store() to prevent the compiler + // from doing unexpected optimizations because it thinks that only one + // thread is accessing the memory location. + subtle::Atomic32 activated; + + // On e.g. x86, alignof(uint64_t) is 4. Ensure consistent size and + // alignment of `pickle_size` across platforms. This can be considered + // to be padding for the final 32 bit value (activated). If this struct + // gains or loses fields, consider if this padding is still needed. + uint32_t padding; + + // Size of the pickled structure, NOT the total size of this entry. + uint64_t pickle_size; + + // Calling this is only valid when the entry is initialized. That is, it + // resides in shared memory and has a pickle containing the trial name, + // group name, and is_overridden. + bool GetState(std::string_view& trial_name, + std::string_view& group_name, + bool& is_overridden) const; + + // Calling this is only valid when the entry is initialized as well. Reads + // the parameters following the trial and group name and stores them as + // key-value mappings in |params|. + bool GetParams(std::map* params) const; + + private: + // Returns an iterator over the data containing names and params. + PickleIterator GetPickleIterator() const; + + // Takes the iterator and writes out the first two items into |trial_name| + // and |group_name|. + bool ReadStringPair(PickleIterator* iter, + std::string_view* trial_name, + std::string_view* group_name) const; + + // Reads the field trial header, which includes the name of the trial and + // group, and the is_overridden bool. + bool ReadHeader(PickleIterator& iter, + std::string_view& trial_name, + std::string_view& group_name, + bool& is_overridden) const; +}; + +} // namespace base::internal + +#endif // BASE_METRICS_FIELD_TRIAL_ENTRY_H_ diff --git a/naiveproxy/src/base/metrics/field_trial_list_including_low_anonymity.h b/naiveproxy/src/base/metrics/field_trial_list_including_low_anonymity.h index a70af448dd..a86beccc59 100644 --- a/naiveproxy/src/base/metrics/field_trial_list_including_low_anonymity.h +++ b/naiveproxy/src/base/metrics/field_trial_list_including_low_anonymity.h @@ -20,6 +20,7 @@ class ChildProcessFieldTrialSyncer; class EntropyProviders; class ProcessedStudy; struct SeedSimulationResult; +class StickyActivationManager; class VariationsCrashKeys; class VariationsLayers; SeedSimulationResult ComputeDifferences( @@ -60,6 +61,8 @@ class BASE_EXPORT FieldTrialListIncludingLowAnonymity { friend class content::FieldTrialSynchronizer; friend class variations::ChildProcessFieldTrialSyncer; + friend class variations::StickyActivationManager; + // This is only used to simulate seed changes, not sent to Google servers. friend variations::SeedSimulationResult variations::ComputeDifferences( const std::vector& processed_studies, diff --git a/naiveproxy/src/base/metrics/field_trial_param_associator.h b/naiveproxy/src/base/metrics/field_trial_param_associator.h index bb320db5d5..12f3a1dae1 100644 --- a/naiveproxy/src/base/metrics/field_trial_param_associator.h +++ b/naiveproxy/src/base/metrics/field_trial_param_associator.h @@ -12,7 +12,6 @@ #include "base/base_export.h" #include "base/memory/singleton.h" -#include "base/metrics/field_trial.h" #include "base/metrics/field_trial_params.h" #include "base/synchronization/lock.h" #include "base/types/pass_key.h" @@ -21,6 +20,8 @@ class AppShimController; namespace base { +class FieldTrial; + // Keeps track of the parameters of all field trials and ensures access to them // is thread-safe. class BASE_EXPORT FieldTrialParamAssociator { diff --git a/naiveproxy/src/base/metrics/histogram.cc b/naiveproxy/src/base/metrics/histogram.cc index c5a3de611a..427cf34b38 100644 --- a/naiveproxy/src/base/metrics/histogram.cc +++ b/naiveproxy/src/base/metrics/histogram.cc @@ -22,6 +22,8 @@ #include "base/compiler_specific.h" #include "base/debug/alias.h" +#include "base/debug/crash_logging.h" +#include "base/debug/dump_without_crashing.h" #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" @@ -702,8 +704,12 @@ HistogramBase* Histogram::FactoryGetInternal(std::string_view name, int32_t flags) { bool valid_arguments = InspectConstructionArguments(name, &minimum, &maximum, &bucket_count); - DCHECK(valid_arguments) << name; if (!valid_arguments) { + // Produce a crash dump with the histogram name, so that we can detect cases + // where there is a coding error where a histogram is logged from multiple + // places with different params. + SCOPED_CRASH_KEY_STRING32("BadHistogramArgs", "name", std::string(name)); + base::debug::DumpWithoutCrashing(); DLOG(ERROR) << "Histogram " << name << " dropped for invalid parameters."; return DummyHistogram::GetInstance(); } @@ -901,8 +907,12 @@ HistogramBase* LinearHistogram::FactoryGetWithRangeDescription( bool valid_arguments = Histogram::InspectConstructionArguments( name, &minimum, &maximum, &bucket_count); - DCHECK(valid_arguments) << name; if (!valid_arguments) { + // Produce a crash dump with the histogram name, so that we can detect cases + // where there is a coding error where a histogram is logged from multiple + // places with different params. + SCOPED_CRASH_KEY_STRING32("BadHistogramArgs", "name", std::string(name)); + base::debug::DumpWithoutCrashing(); DLOG(ERROR) << "Histogram " << name << " dropped for invalid parameters."; return DummyHistogram::GetInstance(); } diff --git a/naiveproxy/src/base/metrics/histogram_functions.cc b/naiveproxy/src/base/metrics/histogram_functions.cc index c9ce26600f..14e463dc08 100644 --- a/naiveproxy/src/base/metrics/histogram_functions.cc +++ b/naiveproxy/src/base/metrics/histogram_functions.cc @@ -311,40 +311,76 @@ void UmaHistogramMicrosecondsTimes(const char* name, TimeDelta sample) { Seconds(10), 50); } -void UmaHistogramMemoryKB(std::string_view name, int sample) { - UmaHistogramCustomCounts(name, sample, 1000, 500000, 50); +void UmaHistogramMemoryKB(std::string_view name, int sample_kb) { + UmaHistogramCustomCounts(name, sample_kb, 1000, 500000, 50); } -void UmaHistogramMemoryKB(const std::string& name, int sample) { - UmaHistogramCustomCounts(name, sample, 1000, 500000, 50); +void UmaHistogramMemoryKB(const std::string& name, int sample_kb) { + UmaHistogramCustomCounts(name, sample_kb, 1000, 500000, 50); } -void UmaHistogramMemoryKB(const char* name, int sample) { - UmaHistogramCustomCounts(name, sample, 1000, 500000, 50); +void UmaHistogramMemoryKB(const char* name, int sample_kb) { + UmaHistogramCustomCounts(name, sample_kb, 1000, 500000, 50); } -void UmaHistogramMemoryMB(std::string_view name, int sample) { - UmaHistogramCustomCounts(name, sample, 1, 1000, 50); +void UmaHistogramMemoryKB(std::string_view name, ByteCount sample) { + UmaHistogramMemoryKB(name, static_cast(sample.InKiB())); } -void UmaHistogramMemoryMB(const std::string& name, int sample) { - UmaHistogramCustomCounts(name, sample, 1, 1000, 50); +void UmaHistogramMemoryKB(const std::string& name, ByteCount sample) { + UmaHistogramMemoryKB(name, static_cast(sample.InKiB())); } -void UmaHistogramMemoryMB(const char* name, int sample) { - UmaHistogramCustomCounts(name, sample, 1, 1000, 50); +void UmaHistogramMemoryKB(const char* name, ByteCount sample) { + UmaHistogramMemoryKB(name, static_cast(sample.InKiB())); } -void UmaHistogramMemoryLargeMB(std::string_view name, int sample) { - UmaHistogramCustomCounts(name, sample, 1, 64000, 100); +void UmaHistogramMemoryMB(std::string_view name, int sample_mb) { + UmaHistogramCustomCounts(name, sample_mb, 1, 1000, 50); } -void UmaHistogramMemoryLargeMB(const std::string& name, int sample) { - UmaHistogramCustomCounts(name, sample, 1, 64000, 100); +void UmaHistogramMemoryMB(const std::string& name, int sample_mb) { + UmaHistogramCustomCounts(name, sample_mb, 1, 1000, 50); } -void UmaHistogramMemoryLargeMB(const char* name, int sample) { - UmaHistogramCustomCounts(name, sample, 1, 64000, 100); +void UmaHistogramMemoryMB(const char* name, int sample_mb) { + UmaHistogramCustomCounts(name, sample_mb, 1, 1000, 50); +} + +void UmaHistogramMemoryMB(std::string_view name, ByteCount sample) { + UmaHistogramMemoryMB(name, static_cast(sample.InMiB())); +} + +void UmaHistogramMemoryMB(const std::string& name, ByteCount sample) { + UmaHistogramMemoryMB(name, static_cast(sample.InMiB())); +} + +void UmaHistogramMemoryMB(const char* name, ByteCount sample) { + UmaHistogramMemoryMB(name, static_cast(sample.InMiB())); +} + +void UmaHistogramMemoryLargeMB(std::string_view name, int sample_mb) { + UmaHistogramCustomCounts(name, sample_mb, 1, 64000, 100); +} + +void UmaHistogramMemoryLargeMB(const std::string& name, int sample_mb) { + UmaHistogramCustomCounts(name, sample_mb, 1, 64000, 100); +} + +void UmaHistogramMemoryLargeMB(const char* name, int sample_mb) { + UmaHistogramCustomCounts(name, sample_mb, 1, 64000, 100); +} + +void UmaHistogramMemoryLargeMB(std::string_view name, ByteCount sample) { + UmaHistogramMemoryLargeMB(name, static_cast(sample.InMiB())); +} + +void UmaHistogramMemoryLargeMB(const std::string& name, ByteCount sample) { + UmaHistogramMemoryLargeMB(name, static_cast(sample.InMiB())); +} + +void UmaHistogramMemoryLargeMB(const char* name, ByteCount sample) { + UmaHistogramMemoryLargeMB(name, static_cast(sample.InMiB())); } void UmaHistogramSparse(std::string_view name, int sample) { diff --git a/naiveproxy/src/base/metrics/histogram_functions.h b/naiveproxy/src/base/metrics/histogram_functions.h index 5df0663a06..063dca5ce9 100644 --- a/naiveproxy/src/base/metrics/histogram_functions.h +++ b/naiveproxy/src/base/metrics/histogram_functions.h @@ -12,6 +12,7 @@ #include #include "base/base_export.h" +#include "base/byte_count.h" #include "base/check_op.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_base.h" @@ -168,7 +169,6 @@ BASE_EXPORT void UmaHistogramCustomTimes(std::string_view name, BASE_EXPORT void UmaHistogramTimes(std::string_view name, TimeDelta sample); // For medium timings up to 3 minutes (50 buckets). -// TODO(crbug.com/353712922): rename and disambiguate this function/macro BASE_EXPORT void UmaHistogramMediumTimes(std::string_view name, TimeDelta sample); // For time intervals up to 1 hr (50 buckets). @@ -195,15 +195,19 @@ BASE_EXPORT void UmaHistogramMicrosecondsTimes(std::string_view name, // For recording memory-related histograms. // LINT.IfChange(UmaHistogramMemory) // -// Used to measure common KB-granularity memory stats. Sample is in KB. Range is -// from 1000KB (see crbug.com/40526504) to 500M. For measuring sizes less than -// 1000K, use `UmaHistogramCounts`. -BASE_EXPORT void UmaHistogramMemoryKB(std::string_view name, int sample); -// Used to measure common MB-granularity memory stats. Sample is in MB. Range is -// 1MB to ~1G. -BASE_EXPORT void UmaHistogramMemoryMB(std::string_view name, int sample); +// Used to measure common KB-granularity memory stats. Range is from 1000KB +// (see crbug.com/40526504) to 500M. For measuring sizes less than 1000K, use +// `UmaHistogramCounts`. +BASE_EXPORT void UmaHistogramMemoryKB(std::string_view name, int sample_kb); +BASE_EXPORT void UmaHistogramMemoryKB(std::string_view name, ByteCount sample); +// Used to measure common MB-granularity memory stats. Range is 1MB to ~1G. +BASE_EXPORT void UmaHistogramMemoryMB(std::string_view name, int sample_mb); +BASE_EXPORT void UmaHistogramMemoryMB(std::string_view name, ByteCount sample); // Used to measure common MB-granularity memory stats. Range is 1MB to ~64G. -BASE_EXPORT void UmaHistogramMemoryLargeMB(std::string_view name, int sample); +BASE_EXPORT void UmaHistogramMemoryLargeMB(std::string_view name, + int sample_mb); +BASE_EXPORT void UmaHistogramMemoryLargeMB(std::string_view name, + ByteCount sample); // LINT.ThenChange(/base/metrics/histogram_functions_internal_overloads.h:UmaHistogramMemory) // For recording sparse histograms. diff --git a/naiveproxy/src/base/metrics/histogram_functions_internal_overloads.h b/naiveproxy/src/base/metrics/histogram_functions_internal_overloads.h index 154b0b61fa..d023c2d3f8 100644 --- a/naiveproxy/src/base/metrics/histogram_functions_internal_overloads.h +++ b/naiveproxy/src/base/metrics/histogram_functions_internal_overloads.h @@ -14,6 +14,7 @@ #include #include "base/base_export.h" +#include "base/byte_count.h" #include "base/check_op.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_base.h" @@ -180,12 +181,21 @@ BASE_EXPORT void UmaHistogramMicrosecondsTimes(const char* name, // LINT.IfChange(UmaHistogramMemory) BASE_EXPORT void UmaHistogramMemoryKB(const std::string& name, int sample); BASE_EXPORT void UmaHistogramMemoryKB(const char* name, int sample); +BASE_EXPORT void UmaHistogramMemoryKB(const std::string& name, + ByteCount sample); +BASE_EXPORT void UmaHistogramMemoryKB(const char* name, ByteCount sample); BASE_EXPORT void UmaHistogramMemoryMB(const std::string& name, int sample); BASE_EXPORT void UmaHistogramMemoryMB(const char* name, int sample); +BASE_EXPORT void UmaHistogramMemoryMB(const std::string& name, + ByteCount sample); +BASE_EXPORT void UmaHistogramMemoryMB(const char* name, ByteCount sample); BASE_EXPORT void UmaHistogramMemoryLargeMB(const std::string& name, int sample); BASE_EXPORT void UmaHistogramMemoryLargeMB(const char* name, int sample); +BASE_EXPORT void UmaHistogramMemoryLargeMB(const std::string& name, + ByteCount sample); +BASE_EXPORT void UmaHistogramMemoryLargeMB(const char* name, ByteCount sample); // LINT.ThenChange(/base/metrics/histogram_functions.h:UmaHistogramMemory) // LINT.IfChange(UmaHistogramSparse) diff --git a/naiveproxy/src/base/metrics/histogram_shared_memory.cc b/naiveproxy/src/base/metrics/histogram_shared_memory.cc index b8ba6af6fe..ae5663c4ee 100644 --- a/naiveproxy/src/base/metrics/histogram_shared_memory.cc +++ b/naiveproxy/src/base/metrics/histogram_shared_memory.cc @@ -68,7 +68,6 @@ namespace base { BASE_FEATURE(kPassHistogramSharedMemoryOnLaunch, - "PassHistogramSharedMemoryOnLaunch", #if BUILDFLAG(IS_ANDROID) FEATURE_DISABLED_BY_DEFAULT #else diff --git a/naiveproxy/src/base/metrics/persistent_histogram_allocator.cc b/naiveproxy/src/base/metrics/persistent_histogram_allocator.cc index a0096152c5..f886122581 100644 --- a/naiveproxy/src/base/metrics/persistent_histogram_allocator.cc +++ b/naiveproxy/src/base/metrics/persistent_histogram_allocator.cc @@ -316,8 +316,10 @@ std::unique_ptr PersistentHistogramAllocator::GetHistogram( '\0' || data->samples_metadata.id == 0 || data->logged_metadata.id == 0 || // Note: Sparse histograms use `id + 1` in `logged_metadata`. - (data->logged_metadata.id != data->samples_metadata.id && - data->logged_metadata.id != data->samples_metadata.id + 1) || + (data->histogram_type == SPARSE_HISTOGRAM + ? (data->logged_metadata.id != data->samples_metadata.id && + data->logged_metadata.id != data->samples_metadata.id + 1) + : (data->logged_metadata.id != data->samples_metadata.id)) || // Most non-matching values happen due to truncated names. Ideally, we // could just verify the name length based on the overall alloc length, // but that doesn't work because the allocated block may have been @@ -834,7 +836,7 @@ bool GlobalHistogramAllocator::CreateWithActiveFileInDir( std::string_view name) { FilePath base_path = ConstructFilePath(dir, name); FilePath active_path = ConstructFilePathForActiveFile(dir, name); - FilePath spare_path = ConstructFilePath(dir, std::string(name) + "-spare"); + FilePath spare_path = ConstructFilePathForSpareFile(dir, name); return CreateWithActiveFile(base_path, active_path, spare_path, size, id, name); } @@ -853,6 +855,13 @@ FilePath GlobalHistogramAllocator::ConstructFilePathForActiveFile( return ConstructFilePath(dir, std::string(name) + "-active"); } +// static +FilePath GlobalHistogramAllocator::ConstructFilePathForSpareFile( + const FilePath& dir, + std::string_view name) { + return ConstructFilePath(dir, std::string(name) + "-spare"); +} + // static FilePath GlobalHistogramAllocator::ConstructFilePathForUploadDir( const FilePath& dir, diff --git a/naiveproxy/src/base/metrics/persistent_histogram_allocator.h b/naiveproxy/src/base/metrics/persistent_histogram_allocator.h index 0f0c387eb4..7a11e3a7d4 100644 --- a/naiveproxy/src/base/metrics/persistent_histogram_allocator.h +++ b/naiveproxy/src/base/metrics/persistent_histogram_allocator.h @@ -434,6 +434,10 @@ class BASE_EXPORT GlobalHistogramAllocator static FilePath ConstructFilePathForActiveFile(const FilePath& dir, std::string_view name); + // Constructs a filename using a name for a "spare" file. + static FilePath ConstructFilePathForSpareFile(const FilePath& dir, + std::string_view name); + // Like above but with timestamp and pid for use in upload directories. static FilePath ConstructFilePathForUploadDir(const FilePath& dir, std::string_view name, diff --git a/naiveproxy/src/base/metrics/statistics_recorder.cc b/naiveproxy/src/base/metrics/statistics_recorder.cc index 20755633d4..d450839210 100644 --- a/naiveproxy/src/base/metrics/statistics_recorder.cc +++ b/naiveproxy/src/base/metrics/statistics_recorder.cc @@ -89,6 +89,19 @@ void StatisticsRecorder::ScopedHistogramSampleObserver::RunCallback( callback_.Run(event_id, histogram_name, name_hash, sample); } +StatisticsRecorder::HistogramWaiter::HistogramWaiter(std::string_view metric_name) { + histogram_observer_ = + std::make_unique( + metric_name, + run_loop_.QuitClosure()); +} + +StatisticsRecorder::HistogramWaiter::~HistogramWaiter() = default; + +void StatisticsRecorder::HistogramWaiter::Wait() { + run_loop_.Run(); +} + StatisticsRecorder::~StatisticsRecorder() { const AutoLock auto_lock(GetLock()); DCHECK_EQ(this, top_); @@ -577,9 +590,7 @@ StatisticsRecorder::Histograms StatisticsRecorder::WithName( // Erase the non-matching histograms. Note that `histograms` was passed by // value so we can efficiently remove the unwanted elements and return the // local instance. - histograms.erase(std::remove_if(histograms.begin(), histograms.end(), - histogram_name_does_not_contain_query), - histograms.end()); + std::erase_if(histograms, histogram_name_does_not_contain_query); return histograms; } diff --git a/naiveproxy/src/base/metrics/statistics_recorder.h b/naiveproxy/src/base/metrics/statistics_recorder.h index 221bec825d..07dc7f698c 100644 --- a/naiveproxy/src/base/metrics/statistics_recorder.h +++ b/naiveproxy/src/base/metrics/statistics_recorder.h @@ -26,8 +26,8 @@ #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_base.h" #include "base/metrics/ranges_manager.h" -#include "base/metrics/record_histogram_checker.h" #include "base/observer_list_threadsafe.h" +#include "base/run_loop.h" #include "base/synchronization/lock.h" #include "base/thread_annotations.h" #include "base/types/pass_key.h" @@ -36,6 +36,7 @@ namespace base { class BucketRanges; class HistogramSnapshotManager; +class RecordHistogramChecker; // In-memory recorder of usage statistics (aka metrics, aka histograms). // @@ -118,6 +119,27 @@ class BASE_EXPORT StatisticsRecorder { const OnSampleWithEventCallback callback_; }; + // A convenience wrapper around ScopedHistogramSampleObserver. Listens for + // changes to the histogram provided at construction. This class only allows + // `Wait()` to be called once. If you need to call `Wait()` multiple + // times, create multiple instances of this class. + class BASE_EXPORT HistogramWaiter { + public: + explicit HistogramWaiter(std::string_view histogram_name); + + ~HistogramWaiter(); + HistogramWaiter(const HistogramWaiter&) = delete; + HistogramWaiter& operator=(const HistogramWaiter&) = delete; + + // Waits for the next update to the observed histogram. + void Wait(); + + private: + base::RunLoop run_loop_; + std::unique_ptr + histogram_observer_; + }; + typedef std::vector Histograms; StatisticsRecorder(const StatisticsRecorder&) = delete; diff --git a/naiveproxy/src/base/native_library.cc b/naiveproxy/src/base/native_library.cc deleted file mode 100644 index 32c00e7673..0000000000 --- a/naiveproxy/src/base/native_library.cc +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/native_library.h" - -namespace base { - -NativeLibrary LoadNativeLibrary(const FilePath& library_path, - NativeLibraryLoadError* error) { - return LoadNativeLibraryWithOptions(library_path, NativeLibraryOptions(), - error); -} - -} // namespace base diff --git a/naiveproxy/src/base/native_library.h b/naiveproxy/src/base/native_library.h index 5c45d3b278..bbd78d8f32 100644 --- a/naiveproxy/src/base/native_library.h +++ b/naiveproxy/src/base/native_library.h @@ -57,15 +57,6 @@ struct BASE_EXPORT NativeLibraryLoadError { #endif // BUILDFLAG(IS_WIN) }; -struct BASE_EXPORT NativeLibraryOptions { - // If |true|, a loaded library is required to prefer local symbol resolution - // before considering global symbols. Note that this is already the default - // behavior on most systems. Setting this to |false| does not guarantee the - // inverse, i.e., it does not force a preference for global symbols over local - // ones. - bool prefer_own_symbols = false; -}; - // Loads a native library from disk. Release it with UnloadNativeLibrary when // you're done. Returns NULL on failure. // If |error| is not NULL, it may be filled in on load error. @@ -91,14 +82,6 @@ PinSystemLibrary(FilePath::StringViewType name, NativeLibraryLoadError* error = nullptr); #endif -// Loads a native library from disk. Release it with UnloadNativeLibrary when -// you're done. Returns NULL on failure. -// If |error| is not NULL, it may be filled in on load error. -BASE_EXPORT NativeLibrary -LoadNativeLibraryWithOptions(const FilePath& library_path, - const NativeLibraryOptions& options, - NativeLibraryLoadError* error); - // Unloads a native library. BASE_EXPORT void UnloadNativeLibrary(NativeLibrary library); diff --git a/naiveproxy/src/base/native_library_apple.mm b/naiveproxy/src/base/native_library_apple.mm index d2ab98387f..bd4da1ba2b 100644 --- a/naiveproxy/src/base/native_library_apple.mm +++ b/naiveproxy/src/base/native_library_apple.mm @@ -26,12 +26,11 @@ std::string NativeLibraryLoadError::ToString() const { return message; } -NativeLibrary LoadNativeLibraryWithOptions(const FilePath& library_path, - const NativeLibraryOptions& options, - NativeLibraryLoadError* error) { +NativeLibrary LoadNativeLibrary(const FilePath& library_path, + NativeLibraryLoadError* error) { // dlopen() etc. open the file off disk. - if (library_path.Extension() == "dylib" || !DirectoryExists(library_path)) { - void* dylib = dlopen(library_path.value().c_str(), RTLD_LAZY); + if (!DirectoryExists(library_path)) { + void* dylib = dlopen(library_path.value().c_str(), RTLD_LAZY | RTLD_LOCAL); if (!dylib) { if (error) { error->message = dlerror(); diff --git a/naiveproxy/src/base/native_library_fuchsia.cc b/naiveproxy/src/base/native_library_fuchsia.cc index 9c58a2f878..bd35db268b 100644 --- a/naiveproxy/src/base/native_library_fuchsia.cc +++ b/naiveproxy/src/base/native_library_fuchsia.cc @@ -35,9 +35,8 @@ std::string NativeLibraryLoadError::ToString() const { return message; } -NativeLibrary LoadNativeLibraryWithOptions(const FilePath& library_path, - const NativeLibraryOptions& options, - NativeLibraryLoadError* error) { +NativeLibrary LoadNativeLibrary(const FilePath& library_path, + NativeLibraryLoadError* error) { FilePath computed_path; FilePath library_root_path = base::PathService::CheckedGet(DIR_ASSETS).Append("lib"); diff --git a/naiveproxy/src/base/native_library_posix.cc b/naiveproxy/src/base/native_library_posix.cc index e8fd06328d..56944c9ac2 100644 --- a/naiveproxy/src/base/native_library_posix.cc +++ b/naiveproxy/src/base/native_library_posix.cc @@ -23,9 +23,8 @@ std::string NativeLibraryLoadError::ToString() const { return message; } -NativeLibrary LoadNativeLibraryWithOptions(const FilePath& library_path, - const NativeLibraryOptions& options, - NativeLibraryLoadError* error) { +NativeLibrary LoadNativeLibrary(const FilePath& library_path, + NativeLibraryLoadError* error) { // dlopen() opens the file off disk. ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); @@ -33,18 +32,7 @@ NativeLibrary LoadNativeLibraryWithOptions(const FilePath& library_path, // please refer to the bug tracker. Some useful bug reports to read include: // http://crbug.com/17943, http://crbug.com/17557, http://crbug.com/36892, // and http://crbug.com/40794. - int flags = RTLD_LAZY; -#if BUILDFLAG(IS_ANDROID) || !defined(RTLD_DEEPBIND) - // Certain platforms don't define RTLD_DEEPBIND. Android dlopen() requires - // further investigation, as it might vary across versions. Crash here to - // warn developers that they're trying to rely on uncertain behavior. - CHECK(!options.prefer_own_symbols); -#else - if (options.prefer_own_symbols) { - flags |= RTLD_DEEPBIND; - } -#endif - void* dl = dlopen(library_path.value().c_str(), flags); + void* dl = dlopen(library_path.value().c_str(), RTLD_LAZY); if (!dl && error) { error->message = dlerror(); } diff --git a/naiveproxy/src/base/native_library_win.cc b/naiveproxy/src/base/native_library_win.cc index 6124f607fc..fbfc9400e8 100644 --- a/naiveproxy/src/base/native_library_win.cc +++ b/naiveproxy/src/base/native_library_win.cc @@ -116,9 +116,8 @@ std::string NativeLibraryLoadError::ToString() const { return StringPrintf("%lu", code); } -NativeLibrary LoadNativeLibraryWithOptions(const FilePath& library_path, - const NativeLibraryOptions& options, - NativeLibraryLoadError* error) { +NativeLibrary LoadNativeLibrary(const FilePath& library_path, + NativeLibraryLoadError* error) { return LoadNativeLibraryHelper(library_path, error); } diff --git a/naiveproxy/src/base/numerics/byte_conversions.h b/naiveproxy/src/base/numerics/byte_conversions.h index 440b507828..8400afb6ae 100644 --- a/naiveproxy/src/base/numerics/byte_conversions.h +++ b/naiveproxy/src/base/numerics/byte_conversions.h @@ -23,7 +23,7 @@ namespace base { // TODO(pkasting): Once C++23 is available, replace with std::byteswap. template requires(std::is_integral_v) -inline constexpr T ByteSwap(T value) { +[[nodiscard]] inline constexpr T ByteSwap(T value) { return internal::SwapBytes(value); } diff --git a/naiveproxy/src/base/posix/safe_strerror.h b/naiveproxy/src/base/posix/safe_strerror.h index f7458274d9..77bee8345c 100644 --- a/naiveproxy/src/base/posix/safe_strerror.h +++ b/naiveproxy/src/base/posix/safe_strerror.h @@ -29,6 +29,8 @@ namespace base { // result is always null-terminated. The value of errno is never changed. // // Use this instead of strerror_r(). +// TODO(crbug.com/40284755): implement spanified version. +// void safe_strerror_r(int err, base::span buf); BASE_EXPORT void safe_strerror_r(int err, char* buf, size_t len); // Calls safe_strerror_r with a buffer of suitable size and returns the result diff --git a/naiveproxy/src/base/posix/unix_domain_socket.h b/naiveproxy/src/base/posix/unix_domain_socket.h index e37db7daf6..baa0d7c214 100644 --- a/naiveproxy/src/base/posix/unix_domain_socket.h +++ b/naiveproxy/src/base/posix/unix_domain_socket.h @@ -37,6 +37,10 @@ class BASE_EXPORT UnixDomainSocket { // Use sendmsg to write the given msg and include a vector of file // descriptors. Returns true if successful. + // TODO(crbug.com/40284755): implement spanified version. + // static bool SendMsg(int fd, + // base::span msg, + // base::span fds); static bool SendMsg(int fd, const void* msg, size_t length, @@ -44,6 +48,10 @@ class BASE_EXPORT UnixDomainSocket { // Use recvmsg to read a message and an array of file descriptors. Returns // -1 on failure. Note: will read, at most, |kMaxFileDescriptors| descriptors. + // TODO(crbug.com/40284755): implement spanified version. + // static ssize_t RecvMsg(int fd, + // base::span msg, + // std::vector* fds); static ssize_t RecvMsg(int fd, void* msg, size_t length, @@ -53,6 +61,11 @@ class BASE_EXPORT UnixDomainSocket { // from the caller's namespace). However, before using this function to // receive process IDs, EnableReceiveProcessId() should be called on the // receiving socket. + // TODO(crbug.com/40284755): implement spanified version. + // static ssize_t RecvMsgWithPid(int fd, + // base::span msg, + // std::vector* fds, + // ProcessId* pid); static ssize_t RecvMsgWithPid(int fd, void* msg, size_t length, diff --git a/naiveproxy/src/base/power_monitor/power_monitor.h b/naiveproxy/src/base/power_monitor/power_monitor.h index 14c9d7417e..4ad002654c 100644 --- a/naiveproxy/src/base/power_monitor/power_monitor.h +++ b/naiveproxy/src/base/power_monitor/power_monitor.h @@ -14,7 +14,7 @@ #include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" -#include "third_party/perfetto/include/perfetto/tracing/internal/track_event_internal.h" +#include "third_party/perfetto/include/perfetto/tracing/track.h" namespace base { diff --git a/naiveproxy/src/base/power_monitor/power_monitor_features.cc b/naiveproxy/src/base/power_monitor/power_monitor_features.cc index 42b3c5aa23..5c42c88f45 100644 --- a/naiveproxy/src/base/power_monitor/power_monitor_features.cc +++ b/naiveproxy/src/base/power_monitor/power_monitor_features.cc @@ -9,9 +9,7 @@ namespace base { #if BUILDFLAG(IS_IOS) -BASE_FEATURE(kRemoveIOSPowerEventNotifications, - "RemoveIOSPowerEventNotifications", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kRemoveIOSPowerEventNotifications, FEATURE_DISABLED_BY_DEFAULT); #endif } // namespace base diff --git a/naiveproxy/src/base/process/current_process.h b/naiveproxy/src/base/process/current_process.h index 9773afe6b2..4f7701fa63 100644 --- a/naiveproxy/src/base/process/current_process.h +++ b/naiveproxy/src/base/process/current_process.h @@ -13,8 +13,8 @@ #include "base/no_destructor.h" #include "base/process/process_handle.h" #include "base/synchronization/lock.h" +#include "base/tracing/protos/chrome_enums.pbzero.h" #include "build/buildflag.h" -#include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_process_descriptor.pbzero.h" namespace tracing { class TraceEventDataSource; @@ -35,8 +35,11 @@ namespace test { class CurrentProcessForTest; } // namespace test -using CurrentProcessType = - perfetto::protos::pbzero::ChromeProcessDescriptor::ProcessType; +#if BUILDFLAG(IS_ANDROID) +class PlatformThreadPriorityMonitor; +#endif // BUILDFLAG(IS_ANDROID) + +using CurrentProcessType = perfetto::protos::chrome_enums::pbzero::ProcessType; // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. @@ -102,6 +105,9 @@ class BASE_EXPORT CurrentProcess { class NameKey { private: NameKey() = default; +#if BUILDFLAG(IS_ANDROID) + friend class ::base::PlatformThreadPriorityMonitor; +#endif // BUILDFLAG(IS_ANDROID) friend class ::base::test::CurrentProcessForTest; friend class ::tracing::TraceEventDataSource; friend class ::tracing::TrackNameRecorder; diff --git a/naiveproxy/src/base/process/kill.h b/naiveproxy/src/base/process/kill.h index 9b91c21637..112d6c4b67 100644 --- a/naiveproxy/src/base/process/kill.h +++ b/naiveproxy/src/base/process/kill.h @@ -82,7 +82,9 @@ enum TerminationStatus : int { // On Windows, the OS terminated process due to code integrity failure. TERMINATION_STATUS_INTEGRITY_FAILURE = 9, #endif - TERMINATION_STATUS_MAX_ENUM = 10, + // The process was proactively terminated by the browser to reclaim memory. + TERMINATION_STATUS_EVICTED_FOR_MEMORY = 10, + TERMINATION_STATUS_MAX_ENUM = 11, }; // Attempts to kill all the processes on the current machine that were launched diff --git a/naiveproxy/src/base/process/kill_win.cc b/naiveproxy/src/base/process/kill_win.cc index 2b6b9307e6..7816a51ff6 100644 --- a/naiveproxy/src/base/process/kill_win.cc +++ b/naiveproxy/src/base/process/kill_win.cc @@ -11,10 +11,12 @@ #include +#include "base/features.h" #include "base/logging.h" #include "base/notreached.h" #include "base/process/memory.h" #include "base/process/process_iterator.h" +#include "partition_alloc/page_allocator.h" namespace base { @@ -76,6 +78,15 @@ TerminationStatus GetTerminationStatus(ProcessHandle handle, int* exit_code) { // object memory limits. case win::kOomExceptionCode: // Ran out of memory. return TERMINATION_STATUS_OOM; + // This exit code is used when a process is terminated by another process + // due to a commit failure. See + // `CHROME_RESULT_CODE_TERMINATED_BY_OTHER_PROCESS_ON_COMMIT_FAILURE` + // in `chrome/common/chrome_result_codes.h`. + case partition_alloc::kTerminateOnCommitFailureExitCode: + return FeatureList::IsEnabled( + features::kUseTerminationStatusMemoryExhaustion) + ? TERMINATION_STATUS_EVICTED_FOR_MEMORY + : TERMINATION_STATUS_OOM; // This exit code means the process failed an OS integrity check. // This is tested in ProcessMitigationsTest.* in sandbox. case win::kStatusInvalidImageHashExitCode: diff --git a/naiveproxy/src/base/process/launch.h b/naiveproxy/src/base/process/launch.h index a601e7c93f..59eac5dc8c 100644 --- a/naiveproxy/src/base/process/launch.h +++ b/naiveproxy/src/base/process/launch.h @@ -454,12 +454,12 @@ BASE_EXPORT bool GetAppOutput(CommandLine::StringViewType cl, // * an optional `output` providing the complete output of `cl`. // * an optional `timeout` if `cl` does not complete in time. // * an optional `LaunchOptions`. -// * an optional `FunctionRef`, called multiple times while waiting, with -// streaming partial output received since the last call to the `FunctionRef` -// from stdout/stderr of the running `cl` process. The implementation of the -// `FunctionRef` can log the output, or concatenate the partial outputs over -// successive calls to effectively produce the full `output` from the `cl` -// process. +// * an optional `FunctionRef`, called multiple times while waiting, with the +// launched `Process` and streaming partial output received since the last +// call to the `FunctionRef` from stdout/stderr of the running `cl` process. +// The implementation of the `FunctionRef` can log the output, or concatenate +// the partial outputs over successive calls to effectively produce the full +// `output` from the `cl` process. // * an optional `final_status` `TerminationStatus` value on function return. // // Returns `true` if the application runs and exits. If this is the case the @@ -483,8 +483,8 @@ BASE_EXPORT bool GetAppOutputWithExitCodeAndTimeout( int* exit_code, TimeDelta timeout = TimeDelta::Max(), const LaunchOptions& options = {}, - FunctionRef still_waiting = - [](std::string_view partial_output) {}, + FunctionRef still_waiting = + [](const Process& process, std::string_view partial_output) {}, TerminationStatus* final_status = nullptr); #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) diff --git a/naiveproxy/src/base/process/launch_unittest_win.cc b/naiveproxy/src/base/process/launch_unittest_win.cc index 8a07a00442..0026667e78 100644 --- a/naiveproxy/src/base/process/launch_unittest_win.cc +++ b/naiveproxy/src/base/process/launch_unittest_win.cc @@ -48,7 +48,8 @@ TEST(LaunchWinTest, GetAppOutputWithExitCodeAndTimeout_SuccessOutput) { ASSERT_TRUE(GetAppOutputWithExitCodeAndTimeout( cl.GetCommandLineString(), true, &output, &exit_code, base::Seconds(2), options, - [&](std::string_view partial_output) { + [&](const Process& process, std::string_view partial_output) { + ASSERT_TRUE(process.IsValid()); ++count; partial_outputs.append(partial_output); }, @@ -73,7 +74,8 @@ TEST(LaunchWinTest, GetAppOutputWithExitCodeAndTimeout_TimeoutOutput) { ASSERT_FALSE(GetAppOutputWithExitCodeAndTimeout( cl.GetCommandLineString(), true, &output, &exit_code, base::Seconds(1), options, - [&](std::string_view partial_output) { + [&](const Process& process, std::string_view partial_output) { + ASSERT_TRUE(process.IsValid()); ++count; partial_outputs.append(partial_output); }, @@ -84,6 +86,50 @@ TEST(LaunchWinTest, GetAppOutputWithExitCodeAndTimeout_TimeoutOutput) { ASSERT_EQ(final_status, TERMINATION_STATUS_STILL_RUNNING); } +TEST(LaunchWinTest, GetAppOutputWithExitCodeAndTimeout_InvalidApplication) { + CommandLine cl(FilePath(FILE_PATH_LITERAL("this-is-an-invalid-application"))); + std::string output; + int exit_code = 0; + TerminationStatus final_status = TERMINATION_STATUS_MAX_ENUM; + int count = 0; + base::LaunchOptions options; + options.start_hidden = true; + ASSERT_FALSE(GetAppOutputWithExitCodeAndTimeout( + cl.GetCommandLineString(), true, &output, &exit_code, TimeDelta::Max(), + options, + [&](const Process& process, std::string_view partial_output) { + ASSERT_FALSE(process.IsValid()); + ++count; + }, + &final_status)); + ASSERT_EQ(count, 0); + ASSERT_EQ(output, ""); + ASSERT_EQ(final_status, TERMINATION_STATUS_LAUNCH_FAILED); +} + +TEST(LaunchWinTest, GetAppOutputWithExitCodeAndTimeout_NoOutput) { + CommandLine cl(FilePath(FILE_PATH_LITERAL("cmd"))); + cl.AppendArg("/q"); + cl.AppendArg("/c"); + std::string output; + int exit_code = 0; + TerminationStatus final_status = TERMINATION_STATUS_MAX_ENUM; + int count = 0; + base::LaunchOptions options; + options.start_hidden = true; + ASSERT_TRUE(GetAppOutputWithExitCodeAndTimeout( + cl.GetCommandLineString(), true, &output, &exit_code, TimeDelta::Max(), + options, + [&](const Process& process, std::string_view partial_output) { + ASSERT_TRUE(process.IsValid()); + ++count; + }, + &final_status)); + ASSERT_EQ(count, 1); + ASSERT_EQ(output, ""); + ASSERT_EQ(final_status, TERMINATION_STATUS_NORMAL_TERMINATION); +} + TEST(LaunchWinTest, GetAppOutputWithExitCodeAndTimeout_StreamingOutput) { CommandLine cl(FilePath(FILE_PATH_LITERAL("powershell"))); cl.AppendArg("-command"); @@ -99,7 +145,8 @@ TEST(LaunchWinTest, GetAppOutputWithExitCodeAndTimeout_StreamingOutput) { ASSERT_TRUE(GetAppOutputWithExitCodeAndTimeout( cl.GetCommandLineString(), true, &output, &exit_code, TimeDelta::Max(), options, - [&](std::string_view partial_output) { + [&](const Process& process, std::string_view partial_output) { + ASSERT_TRUE(process.IsValid()); ++count; partial_outputs.append(partial_output); }, diff --git a/naiveproxy/src/base/process/launch_win.cc b/naiveproxy/src/base/process/launch_win.cc index 1dd6a6da9a..68dafcc94b 100644 --- a/naiveproxy/src/base/process/launch_win.cc +++ b/naiveproxy/src/base/process/launch_win.cc @@ -54,8 +54,8 @@ bool GetAppOutputInternal( int* exit_code, TimeDelta timeout = TimeDelta::Max(), LaunchOptions options = {}, - FunctionRef still_waiting = - [](std::string_view partial_output) {}, + FunctionRef still_waiting = + [](const Process& process, std::string_view partial_output) {}, TerminationStatus* final_status = nullptr) { TRACE_EVENT0("base", "GetAppOutput"); @@ -91,6 +91,7 @@ bool GetAppOutputInternal( if (!process.IsValid()) { return false; } + still_waiting(process, {}); // Close our writing end of pipe now. Otherwise later read would not be able // to detect end of child's output. @@ -126,7 +127,7 @@ bool GetAppOutputInternal( } CHECK_LE(bytes_read, bytes_to_read); std::string_view buffer_view(buffer, bytes_read); - still_waiting(buffer_view); + still_waiting(process, buffer_view); if (output) { output->append(buffer_view); } @@ -140,14 +141,7 @@ bool GetAppOutputInternal( // The process ended, so continue reading as long as there is data // available. } - - if (process_exited) { - // Exit and return from the function. - break; - } - - still_waiting({}); - } while (timer.Elapsed() < timeout); + } while (!process_exited && (timer.Elapsed() < timeout)); if (final_status) { *final_status = process_exited ? TERMINATION_STATUS_NORMAL_TERMINATION @@ -505,7 +499,7 @@ bool GetAppOutputWithExitCodeAndTimeout( int* exit_code, TimeDelta timeout, const LaunchOptions& options, - FunctionRef still_waiting, + FunctionRef still_waiting, TerminationStatus* final_status) { return GetAppOutputInternal(cl, include_stderr, output, exit_code, timeout, options, still_waiting, final_status); diff --git a/naiveproxy/src/base/process/memory.cc b/naiveproxy/src/base/process/memory.cc index 0a4a8a0f7b..41362ad809 100644 --- a/naiveproxy/src/base/process/memory.cc +++ b/naiveproxy/src/base/process/memory.cc @@ -18,6 +18,10 @@ #include "build/build_config.h" #include "partition_alloc/buildflags.h" +#if PA_BUILDFLAG(USE_ALLOCATOR_SHIM) +#include "partition_alloc/shim/allocator_shim.h" // nogncheck +#endif + #if PA_BUILDFLAG(USE_PARTITION_ALLOC) #include "partition_alloc/page_allocator.h" // nogncheck #endif @@ -28,33 +32,7 @@ #include #endif // BUILDFLAG(IS_WIN) -namespace base { - -// Defined in memory_mac.mm for macOS + use_partition_alloc_as_malloc=false. -// In case of use_partition_alloc_as_malloc=true, no need to route the call to -// the system default calloc of macOS. -#if !BUILDFLAG(IS_APPLE) || PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) - -bool UncheckedCalloc(size_t num_items, size_t size, void** result) { - const size_t alloc_size = num_items * size; - - // Overflow check - if (size && ((alloc_size / size) != num_items)) { - *result = nullptr; - return false; - } - - if (!UncheckedMalloc(alloc_size, result)) { - return false; - } - - memset(*result, 0, alloc_size); - return true; -} - -#endif // !BUILDFLAG(IS_APPLE) || PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) - -namespace internal { +namespace base::internal { bool ReleaseAddressSpaceReservation() { #if PA_BUILDFLAG(USE_PARTITION_ALLOC) return partition_alloc::ReleaseReservation(); @@ -62,6 +40,4 @@ bool ReleaseAddressSpaceReservation() { return false; #endif } -} // namespace internal - -} // namespace base +} // namespace base::internal diff --git a/naiveproxy/src/base/process/memory.h b/naiveproxy/src/base/process/memory.h index 5d11d4a156..b8147f0c93 100644 --- a/naiveproxy/src/base/process/memory.h +++ b/naiveproxy/src/base/process/memory.h @@ -100,6 +100,14 @@ struct UncheckedFreeDeleter { inline void operator()(void* ptr) const { UncheckedFree(ptr); } }; +#if BUILDFLAG(IS_WIN) +// As above, but allocates/frees an aligned region of memory. +[[nodiscard]] BASE_EXPORT bool UncheckedAlignedAlloc(size_t size, + size_t alignment, + void** result); +BASE_EXPORT void UncheckedAlignedFree(void* ptr); +#endif // BUILDFLAG(IS_WIN) + } // namespace base #endif // BASE_PROCESS_MEMORY_H_ diff --git a/naiveproxy/src/base/process/memory_fuchsia.cc b/naiveproxy/src/base/process/memory_fuchsia.cc index 6c3175618a..f8e12bf701 100644 --- a/naiveproxy/src/base/process/memory_fuchsia.cc +++ b/naiveproxy/src/base/process/memory_fuchsia.cc @@ -22,6 +22,15 @@ void EnableTerminationOnHeapCorruption() { // Nothing to be done here. } +bool UncheckedCalloc(size_t num_items, size_t size, void** result) { +#if PA_BUILDFLAG(USE_ALLOCATOR_SHIM) + *result = allocator_shim::UncheckedCalloc(num_items, size); +#else + *result = calloc(num_items, size); +#endif + return *result != nullptr; +} + bool UncheckedMalloc(size_t size, void** result) { #if PA_BUILDFLAG(USE_ALLOCATOR_SHIM) *result = allocator_shim::UncheckedAlloc(size); diff --git a/naiveproxy/src/base/process/memory_linux.cc b/naiveproxy/src/base/process/memory_linux.cc index 6d2b69c4dd..4f1aefa547 100644 --- a/naiveproxy/src/base/process/memory_linux.cc +++ b/naiveproxy/src/base/process/memory_linux.cc @@ -23,6 +23,7 @@ extern "C" { void* __libc_malloc(size_t); void __libc_free(void*); +void* __libc_calloc(size_t, size_t); } #endif @@ -112,6 +113,17 @@ bool AdjustOOMScore(ProcessId process, int score) { return AdjustOOMScoreHelper::AdjustOOMScore(process, score); } +bool UncheckedCalloc(size_t num_items, size_t size, void** result) { +#if PA_BUILDFLAG(USE_ALLOCATOR_SHIM) + *result = allocator_shim::UncheckedCalloc(num_items, size); +#elif defined(MEMORY_TOOL_REPLACES_ALLOCATOR) || !defined(LIBC_GLIBC) + *result = calloc(num_items, size); +#elif defined(LIBC_GLIBC) + *result = __libc_calloc(num_items, size); +#endif + return *result != nullptr; +} + bool UncheckedMalloc(size_t size, void** result) { #if PA_BUILDFLAG(USE_ALLOCATOR_SHIM) *result = allocator_shim::UncheckedAlloc(size); diff --git a/naiveproxy/src/base/process/memory_mac.mm b/naiveproxy/src/base/process/memory_mac.mm index dcfd85e610..27b75f767c 100644 --- a/naiveproxy/src/base/process/memory_mac.mm +++ b/naiveproxy/src/base/process/memory_mac.mm @@ -70,18 +70,25 @@ bool UncheckedMalloc(size_t size, void** result) { // !PA_BUILDFLAG(USE_ALLOCATOR_SHIM) } -// The standard version is defined in memory.cc in case of -// USE_PARTITION_ALLOC_AS_MALLOC. -#if !PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) bool UncheckedCalloc(size_t num_items, size_t size, void** result) { -#if PA_BUILDFLAG(USE_ALLOCATOR_SHIM) +#if PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + // See comment in UncheckedMalloc for an explanation. + if (!allocator_shim::IsDefaultAllocatorPartitionRootInitialized()) { + *result = calloc(num_items, size); + return *result != nullptr; + } + + // Unlike use_partition_alloc_as_malloc=false, the default malloc zone is + // replaced with PartitionAlloc, so the allocator shim functions work best. + *result = allocator_shim::UncheckedCalloc(num_items, size); + return *result != nullptr; +#elif PA_BUILDFLAG(USE_ALLOCATOR_SHIM) return allocator_shim::UncheckedCallocMac(num_items, size, result); #else *result = calloc(num_items, size); return *result != nullptr; #endif // PA_BUILDFLAG(USE_ALLOCATOR_SHIM) } -#endif // !PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) void EnableTerminationOnOutOfMemory() { // Step 1: Enable OOM killer on C++ failures. diff --git a/naiveproxy/src/base/process/memory_win.cc b/naiveproxy/src/base/process/memory_win.cc index 059324c1fc..06ad566d4e 100644 --- a/naiveproxy/src/base/process/memory_win.cc +++ b/naiveproxy/src/base/process/memory_win.cc @@ -43,6 +43,15 @@ void EnableTerminationOnOutOfMemory() { _set_new_mode(kCallNewHandlerOnAllocationFailure); } +bool UncheckedCalloc(size_t num_items, size_t size, void** result) { +#if PA_BUILDFLAG(USE_ALLOCATOR_SHIM) + *result = allocator_shim::UncheckedCalloc(num_items, size); +#else + *result = calloc(num_items, size); +#endif // PA_BUILDFLAG(USE_ALLOCATOR_SHIM) + return *result != nullptr; +} + bool UncheckedMalloc(size_t size, void** result) { #if PA_BUILDFLAG(USE_ALLOCATOR_SHIM) *result = allocator_shim::UncheckedAlloc(size); @@ -63,4 +72,24 @@ void UncheckedFree(void* ptr) { #endif // PA_BUILDFLAG(USE_ALLOCATOR_SHIM) } +bool UncheckedAlignedAlloc(size_t size, size_t alignment, void** result) { +#if PA_BUILDFLAG(USE_ALLOCATOR_SHIM) + // Reach PartitionAlloc's allocator_shim::internal::AlignedAllocUnchecked by + // way of the shims when available. + *result = allocator_shim::UncheckedAlignedAlloc(size, alignment); +#else + // Fall-back to the UCRT's _aligned_malloc otherwise. + *result = _aligned_malloc(size, alignment); +#endif // PA_BUILDFLAG(USE_ALLOCATOR_SHIM) + return *result != NULL; +} + +void UncheckedAlignedFree(void* ptr) { +#if PA_BUILDFLAG(USE_ALLOCATOR_SHIM) + allocator_shim::UncheckedAlignedFree(ptr); +#else + _aligned_free(ptr); +#endif // PA_BUILDFLAG(USE_ALLOCATOR_SHIM) +} + } // namespace base diff --git a/naiveproxy/src/base/process/process.h b/naiveproxy/src/base/process/process.h index aa41efa307..c41e271770 100644 --- a/naiveproxy/src/base/process/process.h +++ b/naiveproxy/src/base/process/process.h @@ -83,6 +83,11 @@ class BASE_EXPORT Process { Process& operator=(Process&& other); + // The result code that is used when a process is killed by a bad message. + // Consistent with the value of RESULT_CODE_KILLED_BAD_MESSAGE in + // content/public/common/result_codes.h. + static constexpr int kResultCodeKilledBadMessage = 3; + // Returns an object for the current process. static Process Current(); diff --git a/naiveproxy/src/base/process/process_linux.cc b/naiveproxy/src/base/process/process_linux.cc index 6997c920d0..e0f95584b7 100644 --- a/naiveproxy/src/base/process/process_linux.cc +++ b/naiveproxy/src/base/process/process_linux.cc @@ -46,13 +46,9 @@ namespace base { #if BUILDFLAG(IS_CHROMEOS) -BASE_FEATURE(kOneGroupPerRenderer, - "OneGroupPerRenderer", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kOneGroupPerRenderer, FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kFlattenCpuCgroups, - "FlattenCpuCgroups", - FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kFlattenCpuCgroups, FEATURE_ENABLED_BY_DEFAULT); // If FlattenCpuCgroupsUnified parameter is enabled, foreground renderer // processes uses /sys/fs/cgroup/cpu/ui cgroup instead of diff --git a/naiveproxy/src/base/process/process_metrics.cc b/naiveproxy/src/base/process/process_metrics.cc index f885e56399..4956f651b8 100644 --- a/naiveproxy/src/base/process/process_metrics.cc +++ b/naiveproxy/src/base/process/process_metrics.cc @@ -39,11 +39,11 @@ int CalculateEventsPerSecond(uint64_t event_count, } // namespace -SystemMemoryInfoKB::SystemMemoryInfoKB() = default; +SystemMemoryInfo::SystemMemoryInfo() = default; -SystemMemoryInfoKB::SystemMemoryInfoKB(const SystemMemoryInfoKB&) = default; +SystemMemoryInfo::SystemMemoryInfo(const SystemMemoryInfo&) = default; -SystemMemoryInfoKB& SystemMemoryInfoKB::operator=(const SystemMemoryInfoKB&) = +SystemMemoryInfo& SystemMemoryInfo::operator=(const SystemMemoryInfo&) = default; SystemMetrics::SystemMetrics() { diff --git a/naiveproxy/src/base/process/process_metrics.h b/naiveproxy/src/base/process/process_metrics.h index 4ade83b7ed..254a8f4e49 100644 --- a/naiveproxy/src/base/process/process_metrics.h +++ b/naiveproxy/src/base/process/process_metrics.h @@ -15,6 +15,7 @@ #include #include "base/base_export.h" +#include "base/byte_count.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" #include "base/process/process_handle.h" @@ -98,7 +99,7 @@ struct ProcessMemoryInfo { #endif // BUILDFLAG(IS_WIN) // On iOS, - // TBD: https://crbug.com/714961 + // TBD: https://crbug.com/41315025 }; // Provides performance metrics for a specified process (CPU usage and IO @@ -311,25 +312,28 @@ BASE_EXPORT void IncreaseFdLimitTo(unsigned int max_descriptors); #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_AIX) || \ BUILDFLAG(IS_FUCHSIA) -// Data about system-wide memory consumption. Values are in KB. Available on -// Windows, Mac, Linux, Android and Chrome OS. +// Data about system-wide memory consumption. Available on Windows, Mac, Linux, +// Android and Chrome OS. +// +// The values are kept in ByteCount but depending on the platform, the +// granularity might be at the KB level or higher. // // Total memory are available on all platforms that implement // GetSystemMemoryInfo(). Total/free swap memory are available on all platforms // except on Mac. Buffers/cached/active_anon/inactive_anon/active_file/ // inactive_file/dirty/reclaimable/pswpin/pswpout/pgmajfault are available on // Linux/Android/Chrome OS. Shmem/slab are Chrome OS only. -// Speculative/file_backed/purgeable are Mac and iOS only. -// Free is absent on Windows (see "avail_phys" below). -struct BASE_EXPORT SystemMemoryInfoKB { - SystemMemoryInfoKB(); - SystemMemoryInfoKB(const SystemMemoryInfoKB& other); - SystemMemoryInfoKB& operator=(const SystemMemoryInfoKB& other); +// Speculative/file_backed/purgeable are Mac and iOS only. Free is absent on +// Windows (see "avail_phys" below). +struct BASE_EXPORT SystemMemoryInfo { + SystemMemoryInfo(); + SystemMemoryInfo(const SystemMemoryInfo& other); + SystemMemoryInfo& operator=(const SystemMemoryInfo& other); - int total = 0; + ByteCount total; #if !BUILDFLAG(IS_WIN) - int free = 0; + ByteCount free; #endif #if BUILDFLAG(IS_WIN) @@ -338,7 +342,7 @@ struct BASE_EXPORT SystemMemoryInfoKB { // size of the standby, free, and zero lists." (MSDN). // Standby: not modified pages of physical ram (file-backed memory) that are // not actively being used. - int avail_phys = 0; + ByteCount avail_phys; #endif #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \ @@ -348,36 +352,36 @@ struct BASE_EXPORT SystemMemoryInfoKB { // NOTE: this is ONLY valid in kernels 3.14 and up. Its value will always // be 0 in earlier kernel versions. // Note: it includes _all_ file-backed memory (active + inactive). - int available = 0; + ByteCount available; #endif #if !BUILDFLAG(IS_APPLE) - int swap_total = 0; - int swap_free = 0; + ByteCount swap_total; + ByteCount swap_free; #endif #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \ BUILDFLAG(IS_AIX) || BUILDFLAG(IS_FUCHSIA) - int buffers = 0; - int cached = 0; - int active_anon = 0; - int inactive_anon = 0; - int active_file = 0; - int inactive_file = 0; - int dirty = 0; - int reclaimable = 0; + ByteCount buffers; + ByteCount cached; + ByteCount active_anon; + ByteCount inactive_anon; + ByteCount active_file; + ByteCount inactive_file; + ByteCount dirty; + ByteCount reclaimable; #endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) BUILDFLAG(IS_FUCHSIA) #if BUILDFLAG(IS_CHROMEOS) - int shmem = 0; - int slab = 0; + ByteCount shmem; + ByteCount slab; #endif // BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(IS_APPLE) - int speculative = 0; - int file_backed = 0; - int purgeable = 0; + ByteCount speculative; + ByteCount file_backed; + ByteCount purgeable; #endif // BUILDFLAG(IS_APPLE) }; @@ -387,7 +391,7 @@ struct BASE_EXPORT SystemMemoryInfoKB { // // Fills in the provided |meminfo| structure. Returns true on success. // Exposed for memory debugging widget. -BASE_EXPORT bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo); +BASE_EXPORT bool GetSystemMemoryInfo(SystemMemoryInfo* meminfo); #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || // BUILDFLAG(IS_CHROMEOS) BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_AIX) || @@ -413,13 +417,13 @@ BASE_EXPORT extern const char kProcSelfExe[]; // returns true on success or false for a parsing error // Exposed for testing. BASE_EXPORT bool ParseProcMeminfo(std::string_view input, - SystemMemoryInfoKB* meminfo); + SystemMemoryInfo* meminfo); // Returns the memory committed by the system in KBytes, as from // GetSystemCommitCharge(), using data from `meminfo` instead of /proc/meminfo. // Exposed for testing. BASE_EXPORT size_t -GetSystemCommitChargeFromMeminfo(const SystemMemoryInfoKB& meminfo); +GetSystemCommitChargeFromMeminfo(const SystemMemoryInfo& meminfo); // Data from /proc/vmstat. struct BASE_EXPORT VmStatInfo { @@ -571,7 +575,7 @@ class BASE_EXPORT SystemMetrics { size_t committed_memory_; #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) - SystemMemoryInfoKB memory_info_; + SystemMemoryInfo memory_info_; VmStatInfo vmstat_info_; SystemDiskInfo disk_info_; #endif diff --git a/naiveproxy/src/base/process/process_metrics_apple.mm b/naiveproxy/src/base/process/process_metrics_apple.mm index 9e9f36b9c5..4dece97459 100644 --- a/naiveproxy/src/base/process/process_metrics_apple.mm +++ b/naiveproxy/src/base/process/process_metrics_apple.mm @@ -16,6 +16,7 @@ #include "base/apple/mach_logging.h" #include "base/apple/scoped_mach_port.h" +#include "base/byte_count.h" #include "base/containers/heap_array.h" #include "base/logging.h" #include "base/mac/mac_util.h" @@ -252,8 +253,8 @@ size_t GetSystemCommitCharge() { return (data.active_count * PAGE_SIZE) / 1024; } -bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo) { - meminfo->total = static_cast(SysInfo::AmountOfPhysicalMemory() / 1024); +bool GetSystemMemoryInfo(SystemMemoryInfo* meminfo) { + meminfo->total = SysInfo::AmountOfPhysicalMemory(); base::apple::ScopedMachSendRight host(mach_host_self()); vm_statistics64_data_t vm_info; @@ -298,8 +299,8 @@ bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo) { #endif // !(defined(IS_IOS) && defined(ARCH_CPU_X86_FAMILY)) if (vm_info.speculative_count <= vm_info.free_count) { - meminfo->free = saturated_cast( - PAGE_SIZE / 1024 * (vm_info.free_count - vm_info.speculative_count)); + meminfo->free = ByteCount::FromUnsigned( + PAGE_SIZE * (vm_info.free_count - vm_info.speculative_count)); } else { // Inside the `host_statistics64` call above, `speculative_count` is // computed later than `free_count`, so these values are snapshots of two @@ -312,15 +313,15 @@ bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo) { // inexact, but even in the case where `speculative_count` is less than // `free_count`, the computed `meminfo->free` will only be an approximation // given that the two inputs come from different points in time. - meminfo->free = 0; + meminfo->free = ByteCount(); } meminfo->speculative = - saturated_cast(PAGE_SIZE / 1024 * vm_info.speculative_count); + ByteCount::FromUnsigned(PAGE_SIZE * vm_info.speculative_count); meminfo->file_backed = - saturated_cast(PAGE_SIZE / 1024 * vm_info.external_page_count); + ByteCount::FromUnsigned(PAGE_SIZE * vm_info.external_page_count); meminfo->purgeable = - saturated_cast(PAGE_SIZE / 1024 * vm_info.purgeable_count); + ByteCount::FromUnsigned(PAGE_SIZE * vm_info.purgeable_count); return true; } diff --git a/naiveproxy/src/base/process/process_metrics_fuchsia.cc b/naiveproxy/src/base/process/process_metrics_fuchsia.cc index f14d8c55bf..58c256ea3d 100644 --- a/naiveproxy/src/base/process/process_metrics_fuchsia.cc +++ b/naiveproxy/src/base/process/process_metrics_fuchsia.cc @@ -68,8 +68,8 @@ ProcessMetrics::GetMemoryInfo() const { return memory_info; } -bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo) { - // TODO(crbug.com/42050627). +bool GetSystemMemoryInfo(SystemMemoryInfo* meminfo) { + // TODO(https://crbug.com/42050627). return false; } diff --git a/naiveproxy/src/base/process/process_metrics_linux.cc b/naiveproxy/src/base/process/process_metrics_linux.cc index c1fe2c2e11..d44ab9758c 100644 --- a/naiveproxy/src/base/process/process_metrics_linux.cc +++ b/naiveproxy/src/base/process/process_metrics_linux.cc @@ -20,6 +20,7 @@ #include #include +#include "base/byte_count.h" #include "base/compiler_specific.h" #include "base/containers/span.h" #include "base/cpu.h" @@ -266,20 +267,20 @@ ProcessMetrics::ProcessMetrics(ProcessHandle process) : process_(process) {} #endif size_t GetSystemCommitCharge() { - SystemMemoryInfoKB meminfo; + SystemMemoryInfo meminfo; if (!GetSystemMemoryInfo(&meminfo)) { return 0; } return GetSystemCommitChargeFromMeminfo(meminfo); } -size_t GetSystemCommitChargeFromMeminfo(const SystemMemoryInfoKB& meminfo) { - // TODO(crbug.com/315988925): This math is incorrect: `cached` can be very +size_t GetSystemCommitChargeFromMeminfo(const SystemMemoryInfo& meminfo) { + // TODO(http://b/315988925): This math is incorrect: `cached` can be very // large so that `free` + `buffers` + `cached` > `total`. Replace this with a // more meaningful metric or remove it. In the meantime, convert underflows to // 0 instead of crashing. - return ClampedNumeric(meminfo.total) - meminfo.free - - meminfo.buffers - meminfo.cached; + return ClampedNumeric(meminfo.total.InKiB()) - meminfo.free.InKiB() - + meminfo.buffers.InKiB() - meminfo.cached.InKiB(); } int ParseProcStatCPU(std::string_view input) { @@ -380,7 +381,7 @@ const size_t kDiskWeightedIOTime = 13; } // namespace bool ParseProcMeminfo(std::string_view meminfo_data, - SystemMemoryInfoKB* meminfo) { + SystemMemoryInfo* meminfo) { // The format of /proc/meminfo is: // // MemTotal: 8235324 kB @@ -393,7 +394,7 @@ bool ParseProcMeminfo(std::string_view meminfo_data, // As a basic sanity check at the end, make sure the MemTotal value will be at // least non-zero. So start off with a zero total. - meminfo->total = 0; + meminfo->total = ByteCount(0); for (std::string_view line : SplitStringPiece( meminfo_data, "\n", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY)) { @@ -407,7 +408,7 @@ bool ParseProcMeminfo(std::string_view meminfo_data, continue; } - int* target = nullptr; + ByteCount* target = nullptr; if (tokens[0] == "MemTotal:") { target = &meminfo->total; } else if (tokens[0] == "MemFree:") { @@ -445,12 +446,15 @@ bool ParseProcMeminfo(std::string_view meminfo_data, } #endif if (target) { - StringToInt(tokens[1], target); + int64_t value; + if (StringToInt64(tokens[1], &value)) { + *target = KiB(value); + } } } // Make sure the MemTotal is valid. - return meminfo->total > 0; + return meminfo->total > ByteCount(0); } bool ParseProcVmstat(std::string_view vmstat_data, VmStatInfo* vmstat) { @@ -510,7 +514,7 @@ bool ParseProcVmstat(std::string_view vmstat_data, VmStatInfo* vmstat) { return has_pswpin && has_pswpout && has_pgmajfault; } -bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo) { +bool GetSystemMemoryInfo(SystemMemoryInfo* meminfo) { // Used memory is: total - free - buffers - caches // ReadFileToStringNonBlocking doesn't require ScopedAllowIO, and reading // /proc/meminfo is fast. See crbug.com/1160988 for details. @@ -1015,8 +1019,8 @@ bool GetGraphicsMemoryInfo(GraphicsMemoryInfoKB* gpu_meminfo) { std::string mali_memory_data; if (ReadFileToStringNonBlocking(mali_memory_file, &mali_memory_data)) { int64_t mali_size = -1; - int num_res = - sscanf(mali_memory_data.c_str(), "%" SCNd64 " bytes", &mali_size); + int num_res = UNSAFE_TODO( + sscanf(mali_memory_data.c_str(), "%" SCNd64 " bytes", &mali_size)); if (num_res == 1) { gpu_meminfo->gpu_memory_size += mali_size; } diff --git a/naiveproxy/src/base/process/process_metrics_win.cc b/naiveproxy/src/base/process/process_metrics_win.cc index 0cf0300a2c..36f1f7d561 100644 --- a/naiveproxy/src/base/process/process_metrics_win.cc +++ b/naiveproxy/src/base/process/process_metrics_win.cc @@ -13,6 +13,7 @@ #include +#include "base/byte_count.h" #include "base/check.h" #include "base/logging.h" #include "base/memory/ptr_util.h" @@ -247,22 +248,22 @@ size_t GetSystemCommitCharge() { } // This function uses the following mapping between MEMORYSTATUSEX and -// SystemMemoryInfoKB: +// SystemMemoryInfo: // ullTotalPhys ==> total // ullAvailPhys ==> avail_phys // ullTotalPageFile ==> swap_total // ullAvailPageFile ==> swap_free -bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo) { +bool GetSystemMemoryInfo(SystemMemoryInfo* meminfo) { MEMORYSTATUSEX mem_status; mem_status.dwLength = sizeof(mem_status); if (!::GlobalMemoryStatusEx(&mem_status)) { return false; } - meminfo->total = saturated_cast(mem_status.ullTotalPhys / 1024); - meminfo->avail_phys = saturated_cast(mem_status.ullAvailPhys / 1024); - meminfo->swap_total = saturated_cast(mem_status.ullTotalPageFile / 1024); - meminfo->swap_free = saturated_cast(mem_status.ullAvailPageFile / 1024); + meminfo->total = ByteCount::FromUnsigned(mem_status.ullTotalPhys); + meminfo->avail_phys = ByteCount::FromUnsigned(mem_status.ullAvailPhys); + meminfo->swap_total = ByteCount::FromUnsigned(mem_status.ullTotalPageFile); + meminfo->swap_free = ByteCount::FromUnsigned(mem_status.ullAvailPageFile); return true; } diff --git a/naiveproxy/src/base/process/process_posix.cc b/naiveproxy/src/base/process/process_posix.cc index 8e8c6acda3..c956c344c0 100644 --- a/naiveproxy/src/base/process/process_posix.cc +++ b/naiveproxy/src/base/process/process_posix.cc @@ -306,12 +306,12 @@ bool Process::Terminate(int exit_code, bool wait) const { #if !BUILDFLAG(IS_IOS) || (BUILDFLAG(USE_BLINK) && TARGET_OS_SIMULATOR) bool Process::TerminateInternal(int exit_code, bool wait) const { - // RESULT_CODE_KILLED_BAD_MESSAGE == 3, but layering prevents its use. // |wait| is always false when terminating badly-behaved processes. - const bool maybe_compromised = !wait && exit_code == 3; + const bool maybe_compromised = + !wait && exit_code == Process::kResultCodeKilledBadMessage; if (maybe_compromised) { // Forcibly terminate the process immediately. - const bool was_killed = kill(process_, SIGKILL) != 0; + const bool was_killed = kill(process_, SIGKILL) == 0; #if BUILDFLAG(IS_CHROMEOS) if (was_killed) { CleanUpProcessAsync(); diff --git a/naiveproxy/src/base/process/process_win.cc b/naiveproxy/src/base/process/process_win.cc index 45fbe12145..ca62d42768 100644 --- a/naiveproxy/src/base/process/process_win.cc +++ b/naiveproxy/src/base/process/process_win.cc @@ -33,9 +33,7 @@ namespace base { // (available on hybrid CPUs). // QoS is a scheduling Win API which indicates the desired performance and power // efficiency of a process/thread. EcoQoS is introduced since Windows 11. -BASE_FEATURE(kUseEcoQoSForBackgroundProcess, - "UseEcoQoSForBackgroundProcess", - FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kUseEcoQoSForBackgroundProcess, FEATURE_ENABLED_BY_DEFAULT); Process::Process(ProcessHandle handle) : process_(handle), is_current_process_(false) { diff --git a/naiveproxy/src/base/profiler/OWNERS b/naiveproxy/src/base/profiler/OWNERS index 6f0b1ede2d..124986a12b 100644 --- a/naiveproxy/src/base/profiler/OWNERS +++ b/naiveproxy/src/base/profiler/OWNERS @@ -1,5 +1,3 @@ -kartarsingh@google.com -wittman@chromium.org thiabaud@google.com spvm@chromium.org jpgravel@chromium.org diff --git a/naiveproxy/src/base/profiler/stack_copier_signal.cc b/naiveproxy/src/base/profiler/stack_copier_signal.cc index 79a3fce9ac..f66c006576 100644 --- a/naiveproxy/src/base/profiler/stack_copier_signal.cc +++ b/naiveproxy/src/base/profiler/stack_copier_signal.cc @@ -248,9 +248,7 @@ bool StackCopierSignal::CopyStack(StackBuffer* stack_buffer, ScopedSetSignalHandlerParams scoped_handler_params(¶ms); // Set the signal handler for the thread to the stack copy function. - struct sigaction action; - struct sigaction original_action; - UNSAFE_TODO(memset(&action, 0, sizeof(action))); + struct sigaction action = {}; action.sa_sigaction = CopyStackSignalHandler; action.sa_flags = SA_RESTART | SA_SIGINFO; sigemptyset(&action.sa_mask); @@ -258,6 +256,7 @@ bool StackCopierSignal::CopyStack(StackBuffer* stack_buffer, "StackCopierSignal copy stack"); // SIGURG is chosen here because we observe no crashes with this signal and // neither Chrome or the AOSP sets up a special handler for this signal. + struct sigaction original_action = {}; ScopedSigaction scoped_sigaction(SIGURG, &action, &original_action); if (!scoped_sigaction.succeeded()) { return false; diff --git a/naiveproxy/src/base/profiler/thread_group_profiler.cc b/naiveproxy/src/base/profiler/thread_group_profiler.cc index 9d2978fcdb..535a177dad 100644 --- a/naiveproxy/src/base/profiler/thread_group_profiler.cc +++ b/naiveproxy/src/base/profiler/thread_group_profiler.cc @@ -155,7 +155,7 @@ void ThreadGroupProfiler::OnWorkerThreadExiting( // During shutdown profiling_has_stopped may not get a chance to signal as // task runner is stopped, profiler_shutdown event will signal instead // indicating that clean up has finished and worker thread may safely exit. - WaitableEvent::WaitMany(event_array, std::size(event_array)); + WaitableEvent::WaitMany(event_array); } // Production implementation that wraps an actual StackSamplingProfiler. diff --git a/naiveproxy/src/base/profiler/thread_group_profiler.h b/naiveproxy/src/base/profiler/thread_group_profiler.h index 326df871b8..7ab163a127 100644 --- a/naiveproxy/src/base/profiler/thread_group_profiler.h +++ b/naiveproxy/src/base/profiler/thread_group_profiler.h @@ -14,6 +14,7 @@ #include "base/profiler/periodic_sampling_scheduler.h" #include "base/profiler/sampling_profiler_thread_token.h" #include "base/profiler/stack_sampling_profiler.h" +#include "base/sequence_checker.h" #include "base/task/sequenced_task_runner.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" diff --git a/naiveproxy/src/base/protobuf_hardening_test_support.proto b/naiveproxy/src/base/protobuf_hardening_test_support.proto new file mode 100644 index 0000000000..84bf74f1ae --- /dev/null +++ b/naiveproxy/src/base/protobuf_hardening_test_support.proto @@ -0,0 +1,16 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +syntax = "proto2"; + +package base.test; + +option optimize_for = LITE_RUNTIME; + +message HardeningTestMessage { + message NestedMessage {} + + repeated int32 repeated_field = 1; + repeated NestedMessage repeated_ptr_field = 2; +} diff --git a/naiveproxy/src/base/rand_util_fuchsia.cc b/naiveproxy/src/base/rand_util_fuchsia.cc index 620133772e..d34b44cee6 100644 --- a/naiveproxy/src/base/rand_util_fuchsia.cc +++ b/naiveproxy/src/base/rand_util_fuchsia.cc @@ -22,9 +22,7 @@ namespace { // rand_util_win.cc. std::atomic g_use_boringssl; -BASE_FEATURE(kUseBoringSSLForRandBytes, - "UseBoringSSLForRandBytes", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kUseBoringSSLForRandBytes, FEATURE_DISABLED_BY_DEFAULT); } // namespace diff --git a/naiveproxy/src/base/rand_util_posix.cc b/naiveproxy/src/base/rand_util_posix.cc index 94f46d1304..39ad7e442d 100644 --- a/naiveproxy/src/base/rand_util_posix.cc +++ b/naiveproxy/src/base/rand_util_posix.cc @@ -102,9 +102,7 @@ namespace { // rand_util_win.cc. std::atomic g_use_boringssl; -BASE_FEATURE(kUseBoringSSLForRandBytes, - "UseBoringSSLForRandBytes", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kUseBoringSSLForRandBytes, FEATURE_DISABLED_BY_DEFAULT); } // namespace diff --git a/naiveproxy/src/base/rand_util_win.cc b/naiveproxy/src/base/rand_util_win.cc index 0b772cbae8..c840303611 100644 --- a/naiveproxy/src/base/rand_util_win.cc +++ b/naiveproxy/src/base/rand_util_win.cc @@ -33,9 +33,7 @@ namespace { // rand_util_posix.cc. std::atomic g_use_boringssl; -BASE_FEATURE(kUseBoringSSLForRandBytes, - "UseBoringSSLForRandBytes", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kUseBoringSSLForRandBytes, FEATURE_DISABLED_BY_DEFAULT); } // namespace diff --git a/naiveproxy/src/base/sampling_heap_profiler/lock_free_address_hash_set.cc b/naiveproxy/src/base/sampling_heap_profiler/lock_free_address_hash_set.cc index d37a4f6fdf..4dd59e810d 100644 --- a/naiveproxy/src/base/sampling_heap_profiler/lock_free_address_hash_set.cc +++ b/naiveproxy/src/base/sampling_heap_profiler/lock_free_address_hash_set.cc @@ -11,14 +11,41 @@ #include #include -#include "base/check.h" +#include "base/check_op.h" #include "base/containers/contains.h" +#include "base/feature_list.h" +#include "base/metrics/field_trial_params.h" +#include "base/sampling_heap_profiler/lock_free_bloom_filter.h" #include "base/synchronization/lock.h" namespace base { +BASE_FEATURE(kUseLockFreeBloomFilter, base::FEATURE_DISABLED_BY_DEFAULT); + namespace { +// See the probability table in lock_free_bloom_filter.h to estimate the +// optimal bits per key. It's a tradeoff between better performance for the most +// common table sizes and better performance at outliers. +// +// Field data shows that on most platforms the hash table has about 5-10 entries +// at the 50th percentile, 10-20 entries at the 75th percentile, and 40-100 +// entries at the 99th percentile. That gives expected false positive rates of: +// +// 2 bits per key: 2.1% to 7.2% at the 50th +// 7.2% to 21.6% at the 75th +// 50.9% to 91.4% at the 99th +// +// 3 bits per key: 0.9% to 5.2% at the 50th +// 5.2% to 22.5% at the 75th +// 60.7% to 97.3% at the 99th +// +// 4 bits per key: 0.5% to 4.7% at the 50th +// 4.7% to 25.0% at the 75th +// 71.0% to 99.2% at the 99th +constexpr base::FeatureParam kBitsPerKey{&kUseLockFreeBloomFilter, + "bits_per_key", 3}; + // Returns the result of a chi-squared test showing how evenly keys are // distributed. `bucket_key_counts` is the count of keys stored in each bucket. double ChiSquared(const std::vector& bucket_key_counts) { @@ -26,8 +53,8 @@ double ChiSquared(const std::vector& bucket_key_counts) { // https://en.wikipedia.org/wiki/Hash_function#Testing_and_measurement: // "n is the number of keys, m is the number of buckets, and b[j] is the // number of items in bucket j." - const size_t n = - std::accumulate(bucket_key_counts.begin(), bucket_key_counts.end(), 0u); + const size_t n = std::accumulate(bucket_key_counts.begin(), + bucket_key_counts.end(), size_t{0}); const size_t m = bucket_key_counts.size(); DCHECK(m); @@ -42,18 +69,15 @@ double ChiSquared(const std::vector& bucket_key_counts) { } // namespace -void* const LockFreeAddressHashSet::kDeletedKey = - reinterpret_cast(intptr_t{-1}); - -LockFreeAddressHashSet::LockFreeAddressHashSet(size_t buckets_count, - Lock& lock, - bool multi_key) - : lock_(lock), - buckets_(buckets_count), - bucket_mask_(buckets_count - 1), - multi_key_(multi_key) { +LockFreeAddressHashSet::LockFreeAddressHashSet(size_t buckets_count, Lock& lock) + : lock_(lock), buckets_(buckets_count), bucket_mask_(buckets_count - 1) { DCHECK(std::has_single_bit(buckets_count)); DCHECK_LE(bucket_mask_, std::numeric_limits::max()); + if (base::FeatureList::IsEnabled(kUseLockFreeBloomFilter)) { + const size_t bits_per_key = kBitsPerKey.Get(); + CHECK_GT(bits_per_key, 0u); + filter_.emplace(bits_per_key); + } } LockFreeAddressHashSet::~LockFreeAddressHashSet() { @@ -61,11 +85,7 @@ LockFreeAddressHashSet::~LockFreeAddressHashSet() { Node* node = bucket.load(std::memory_order_relaxed); while (node) { Node* next = node->next; - if (multi_key_) { - delete reinterpret_cast(node); - } else { - delete reinterpret_cast(node); - } + delete node; node = next; } } @@ -74,31 +94,76 @@ LockFreeAddressHashSet::~LockFreeAddressHashSet() { void LockFreeAddressHashSet::Insert(void* key) { lock_->AssertAcquired(); DCHECK_NE(key, nullptr); - DCHECK_NE(key, kDeletedKey); - CHECK(!Contains(key)); + CHECK_NE(Contains(key), ContainsResult::kFound); + + // Also store the key in the bloom filter. + // + // Note that other threads may be calling Contains() from a free hook while + // Insert() is called from an alloc hook. In a well-behaved program `key` can + // never be looked up until after Insert() returns, because it's returned from + // alloc and passed to free, which happens-after alloc. But a race can happen + // if one thread passes a random value to free while another receives the same + // value from alloc. (This could happen if the program double-frees a pointer, + // and the allocator reissues the same memory location between the two free + // calls.) + // + // In this case, with only the hash set, there's a true race condition in the + // free hook: if it sees the state before Insert(), Contains(key) returns + // kNotFound and the free is ignored. If it sees the state after Insert(), + // Contains(key) returns kFound and the profiler records that the memory was + // freed. The only problem is that the memory stats could become incorrect, + // and freeing an invalid pointer is undefined behaviour that makes the memory + // stats unreliable anyway. + // + // When the Bloom filter is used, Insert() and Contains() are no longer + // atomic. They each access `filter_` and `buckets_` in separate atomic + // operations. This is safe because the possible outcomes don't change: + // + // When thread T1 races to look up `key` while thread T2 inserts it, T1 calls + // filter_.MaybeContains(key), then only if MaybeContains returned true, + // searches `buckets_` with FindNode(key). Meanwhile in T2, `filter_` and + // `buckets_` can be updated in either order due to code reordering, and T1 + // can run between the updates. The possible states observed by T1 are + // summarized in the following table. + // + // MaybeContains | FindNode | Causes + // --------------+--------------+--------------------------------------------- + // False | undefined | T1 sees state before Insert() call (FindNode + // | (not called) | would return null) + // | | T1 sees update to `buckets_` but not + // | | `filter_` (FindNode would return non-null) + // --------------+--------------+--------------------------------------------- + // True | NULL | T1 sees state before Insert() call, with a + // | | false positive in `filter_` + // | | T1 sees update to `filter_` but not + // | | `buckets_` + // --------------+--------------+--------------------------------------------- + // True | non-NULL | T1 sees state after Insert() call + // | | T1 sees update to `buckets_` but not + // | | `filter_`, which had a false positive + // + // Each of the 3 states that could be seen by T1 due to unsynchronized updates + // of `filter_` and `buckets_` could already be seen by T1 if the updates + // were sequentially consistent. + if (filter_) { + filter_->Add(key); + } + ++size_; // Note: There's no need to use std::atomic_compare_exchange here, // as we do not support concurrent inserts, so values cannot change midair. std::atomic& bucket = buckets_[Hash(key) & bucket_mask_]; Node* node = bucket.load(std::memory_order_relaxed); - // First iterate over the bucket nodes and try to use an empty key slot. + // First iterate over the bucket nodes and try to reuse an empty one if found. for (; node != nullptr; node = node->next) { - for (KeySlot& key_slot : GetKeySlots(node)) { - void* existing_key = key_slot.load(std::memory_order_relaxed); - if (existing_key == nullptr || existing_key == kDeletedKey) { - key_slot.store(key, std::memory_order_relaxed); - return; - } + if (node->key.load(std::memory_order_relaxed) == nullptr) { + node->key.store(key, std::memory_order_relaxed); + return; } } - // There are no empty key slots to reuse left in the bucket. + // There are no empty nodes to reuse left in the bucket. // Create a new node first... - Node* new_node; - if (multi_key_) { - new_node = new MultiKeyNode(key, bucket.load(std::memory_order_relaxed)); - } else { - new_node = new SingleKeyNode(key, bucket.load(std::memory_order_relaxed)); - } + Node* new_node = new Node(key, bucket.load(std::memory_order_relaxed)); // ... and then publish the new chain. bucket.store(new_node, std::memory_order_release); } @@ -109,11 +174,9 @@ void LockFreeAddressHashSet::Copy(const LockFreeAddressHashSet& other) { for (const std::atomic& bucket : other.buckets_) { for (const Node* node = bucket.load(std::memory_order_relaxed); node; node = node->next) { - for (const KeySlot& key_slot : other.GetKeySlots(node)) { - void* key = key_slot.load(std::memory_order_relaxed); - if (key != nullptr && key != kDeletedKey) { - Insert(key); - } + void* key = node->key.load(std::memory_order_relaxed); + if (key) { + Insert(key); } } } @@ -127,22 +190,16 @@ LockFreeAddressHashSet::BucketStats LockFreeAddressHashSet::GetBucketStats() std::vector key_counts; key_counts.reserve(buckets_.size()); for (const std::atomic& bucket : buckets_) { - // Bucket length includes all non-null values, including kDeletedKey, since + // Bucket length includes all nodes, including ones with null keys, since // they will need to be searched when iterating. Key count only includes // real keys. size_t length = 0; size_t key_count = 0; for (const Node* node = bucket.load(std::memory_order_relaxed); node != nullptr; node = node->next) { - for (const KeySlot& key_slot : GetKeySlots(node)) { - void* key = key_slot.load(std::memory_order_relaxed); - if (key == nullptr) { - break; - } - ++length; - if (key != kDeletedKey) { - ++key_count; - } + ++length; + if (node->key.load(std::memory_order_relaxed)) { + ++key_count; } } lengths.push_back(length); diff --git a/naiveproxy/src/base/sampling_heap_profiler/lock_free_address_hash_set.h b/naiveproxy/src/base/sampling_heap_profiler/lock_free_address_hash_set.h index 82c5e791bb..ee3d94ac2e 100644 --- a/naiveproxy/src/base/sampling_heap_profiler/lock_free_address_hash_set.h +++ b/naiveproxy/src/base/sampling_heap_profiler/lock_free_address_hash_set.h @@ -5,23 +5,27 @@ #ifndef BASE_SAMPLING_HEAP_PROFILER_LOCK_FREE_ADDRESS_HASH_SET_H_ #define BASE_SAMPLING_HEAP_PROFILER_LOCK_FREE_ADDRESS_HASH_SET_H_ -#include #include #include -#include +#include #include #include "base/base_export.h" #include "base/check_op.h" #include "base/compiler_specific.h" -#include "base/containers/span.h" +#include "base/feature_list.h" #include "base/memory/raw_ptr_exclusion.h" #include "base/memory/raw_ref.h" +#include "base/sampling_heap_profiler/lock_free_bloom_filter.h" #include "base/synchronization/lock.h" #include "base/thread_annotations.h" +#include "base/types/optional_util.h" namespace base { +// If enabled, LockFreeAddressHashSet will use the bloom filter. +BASE_EXPORT BASE_DECLARE_FEATURE(kUseLockFreeBloomFilter); + // A hash set container that provides lock-free version of |Contains| operation. // It does not support concurrent write operations |Insert| and |Remove|. // All write operations if performed from multiple threads must be properly @@ -36,30 +40,18 @@ namespace base { // // Internally the hashset is implemented as a vector of N buckets // (N has to be a power of 2). Each bucket holds a single-linked list of -// nodes each containing keys. -// -// As an optimization, each node can optionally hold a fixed-length array of -// keys, so that in most cases all keys in the bucket share a cache line. -// Ideally only in extreme cases will a bucket hold so many keys that a second -// node in a different area of the heap must be allocated. -// +// nodes each corresponding to a key. // It is not possible to really delete nodes from the list as there might // be concurrent reads being executed over the node. The |Remove| operation -// just marks the node as empty by placing a sentinel into its key field. +// just marks the node as empty by placing nullptr into its key field. // Consequent |Insert| operations may reuse empty nodes when possible. // -// The structure of the hashset for N buckets is the following (assuming 2 keys -// per node): -// -// 0: {*}--> {[key1,key2],*}--> NULL +// The structure of the hashset for N buckets is the following: +// 0: {*}--> {key1,*}--> {key2,*}--> NULL // 1: {*}--> NULL -// 2: {*}--> {[kDeletedKey,key3],*}--> {[key4,NULL],*}--> NULL +// 2: {*}--> {NULL,*}--> {key3,*}--> {key4,*}--> NULL // ... -// N-1: {*}--> {[keyM,NULL],*}--> NULL -// -// In bucket 2, three keys were inserted. The third required a second node, -// containing the array [key4,NULL]. Then a key was removed, leaving a -// kDeletedKey in the first node that can be reused if needed. +// N-1: {*}--> {keyM,*}--> NULL class BASE_EXPORT LockFreeAddressHashSet { public: // Stats about the hash set's buckets, for metrics. @@ -80,26 +72,38 @@ class BASE_EXPORT LockFreeAddressHashSet { // Creates a hash set with `buckets_count` buckets. `lock` is a lock that // must be held by callers of |Insert|, |Remove| and |Copy|. |Contains| is // lock-free. - LockFreeAddressHashSet(size_t buckets_count, - Lock& lock, - bool multi_key = false); + LockFreeAddressHashSet(size_t buckets_count, Lock& lock); ~LockFreeAddressHashSet(); - // Checks if the |key|, which must not be nullptr or kDeletedKey, is in the - // set. - // Can be executed concurrently with |Insert|, |Remove|, and |Contains| - // operations. - ALWAYS_INLINE bool Contains(void* key) const; + enum class ContainsResult { + // The key is in the hash set. If the kUseLockFreeBloomFilter feature is + // enabled, it's also in the supplemental Bloom filter. + kFound, + // The key is not in the hash set. If the kUseLockFreeBloomFilter feature is + // enabled, it's also not in the supplemental Bloom filter. + kNotFound, + // The key was matched in the supplemental Bloom filter, but not the hash + // set. (A Bloom filter false positive.) This is only returned if the + // kUseLockFreeBloomFilter feature is enabled, and is mainly useful for + // tracking statistics of the Bloom filter usage. + kNotFoundButMatchedInBloomFilter, + }; - // Removes the |key|, which must not be nullptr or kDeletedKey, from the set. - // The key must be present in the set before the invocation. - // Concurrent execution of |Insert|, |Remove|, or |Copy| is not supported. + // Checks if the |key|, which must not be nullptr, is in the set. Checks the + // bloom filter first if it's enabled. Can be executed concurrently with + // |Insert|, |Remove|, and |Contains| operations. + ALWAYS_INLINE ContainsResult Contains(void* key) const; + + // Removes the |key|, which must not be nullptr, from the set. The key must be + // present in the set before the invocation. Concurrent execution of |Insert|, + // |Remove|, or |Copy| is not supported. ALWAYS_INLINE void Remove(void* key); - // Inserts the |key|, which must not be nullptr or kDeletedKey, into the set. - // The key must not be present in the set before the invocation. - // Concurrent execution of |Insert|, |Remove|, or |Copy| is not supported. + // Inserts the |key|, which must not be nullptr, into the set. The key must + // not be present in the set before the invocation. Also adds the key to the + // bloom filter if it's enabled. Concurrent execution of |Insert|, |Remove|, + // or |Copy| is not supported. void Insert(void* key); // Copies contents of |other| set into the current set. The current set @@ -128,65 +132,29 @@ class BASE_EXPORT LockFreeAddressHashSet { // |Insert|, |Remove| or |Copy|. BucketStats GetBucketStats() const; + LockFreeBloomFilter* bloom_filter() { return base::OptionalToPtr(filter_); } + const LockFreeBloomFilter* bloom_filter() const { + return base::OptionalToPtr(filter_); + } + private: friend class LockFreeAddressHashSetTest; - static void* const kDeletedKey; - - using KeySlot = std::atomic; - - class Node { - public: - // This field is not a raw_ptr<> to avoid out-of-line destructor. - RAW_PTR_EXCLUSION Node* next; - - protected: - // Can only be created through subclasses. - ALWAYS_INLINE explicit Node(Node* next) : next(next) {} - }; - - class SingleKeyNode : public Node { - public: - ALWAYS_INLINE SingleKeyNode(void* k, Node* next) : Node(next) { + struct Node { + ALWAYS_INLINE Node(void* k, Node* next) : next(next) { key.store(k, std::memory_order_relaxed); } - KeySlot key; + std::atomic key; + + // This field is not a raw_ptr<> to avoid out-of-line destructor. + RAW_PTR_EXCLUSION Node* next; }; - template - class KeyArrayNode : public Node { - public: - static constexpr bool kFitsInCacheLine = - sizeof(KeyArrayNode) <= std::hardware_constructive_interference_size; - - ALWAYS_INLINE KeyArrayNode(void* k, Node* next) : Node(next) { - keys.front().store(k, std::memory_order_relaxed); - } - - std::array keys{}; - }; - - // For the median client, the 50th %ile of bucket chain length ranges from 0.6 - // nodes to 2.6 nodes, depending on platform and process type. The 99th %ile - // ranges from 1.6 nodes to 4.6 nodes. So 4-node chunks is a good choice to - // maximize locality without wasting too much unused space. However the chosen - // length should fit in a single cache line; if not fall back to smaller - // chunks. - static constexpr size_t kKeysPerNode = - KeyArrayNode<4>::kFitsInCacheLine - ? 4 - : (KeyArrayNode<2>::kFitsInCacheLine ? 2 : 1); - using MultiKeyNode = KeyArrayNode; - - // Returns the KeySlot containing `key` (which must not be null), or nullptr - // if it's not in the hash set. - ALWAYS_INLINE KeySlot* FindKey(void* key); - ALWAYS_INLINE const KeySlot* FindKey(void* key) const; - - // Returns a view of all key slots in `node`. - ALWAYS_INLINE base::span GetKeySlots(Node* node); - ALWAYS_INLINE base::span GetKeySlots(const Node* node) const; + // Returns the node containing `key` (which must not be null), or nullptr if + // it's not in the hash set. + ALWAYS_INLINE Node* FindNode(void* key); + ALWAYS_INLINE const Node* FindNode(void* key) const; // Returns the hash of `key`. ALWAYS_INLINE static uint32_t Hash(void* key); @@ -196,29 +164,40 @@ class BASE_EXPORT LockFreeAddressHashSet { std::vector> buckets_; size_t size_ GUARDED_BY(lock_) = 0; const size_t bucket_mask_; - const bool multi_key_; + + // A bloom filter to speed up lookups of addresses not in the hash set. + std::optional filter_; }; -ALWAYS_INLINE bool LockFreeAddressHashSet::Contains(void* key) const { - return FindKey(key) != nullptr; +ALWAYS_INLINE LockFreeAddressHashSet::ContainsResult +LockFreeAddressHashSet::Contains(void* key) const { + if (!filter_) { + return FindNode(key) ? ContainsResult::kFound : ContainsResult::kNotFound; + } + if (filter_->MaybeContains(key)) { + // The filter may have false positives, so need to check the hash set. + return FindNode(key) ? ContainsResult::kFound + : ContainsResult::kNotFoundButMatchedInBloomFilter; + } + return ContainsResult::kNotFound; } ALWAYS_INLINE void LockFreeAddressHashSet::Remove(void* key) { lock_->AssertAcquired(); - KeySlot* key_slot = FindKey(key); - DCHECK_NE(key_slot, nullptr); - // Mark the key slot as empty, so |Insert| can reuse it later. - key_slot->store(kDeletedKey, std::memory_order_relaxed); - // The node may now be empty, but we can never delete it, nor detach it from - // the current bucket as there may always be another thread currently - // iterating over it. + Node* node = FindNode(key); + DCHECK_NE(node, nullptr); + // We can never delete the node, nor detach it from the current bucket + // as there may always be another thread currently iterating over it. + // Instead we just mark it as empty, so |Insert| can reuse it later. + node->key.store(nullptr, std::memory_order_relaxed); --size_; + // Keys can't be removed from the bloom filter. Old keys will be cleared out + // when the hash set is resized. } -ALWAYS_INLINE LockFreeAddressHashSet::KeySlot* LockFreeAddressHashSet::FindKey( +ALWAYS_INLINE LockFreeAddressHashSet::Node* LockFreeAddressHashSet::FindNode( void* key) { DCHECK_NE(key, nullptr); - DCHECK_NE(key, kDeletedKey); const std::atomic& bucket = buckets_[Hash(key) & bucket_mask_]; // It's enough to use std::memory_order_consume ordering here, as the // node->next->...->next loads form a dependency chain. @@ -235,41 +214,16 @@ ALWAYS_INLINE LockFreeAddressHashSet::KeySlot* LockFreeAddressHashSet::FindKey( // here. for (Node* node = bucket.load(std::memory_order_acquire); node != nullptr; node = node->next) { - for (KeySlot& key_slot : GetKeySlots(node)) { - void* key_in_slot = key_slot.load(std::memory_order_relaxed); - if (key_in_slot == key) { - return &key_slot; - } else if (key_in_slot == nullptr) { - // Remaining slots in this node are empty. - break; - } + if (node->key.load(std::memory_order_relaxed) == key) { + return node; } } return nullptr; } -ALWAYS_INLINE const LockFreeAddressHashSet::KeySlot* -LockFreeAddressHashSet::FindKey(void* key) const { - return const_cast(this)->FindKey(key); -} - -ALWAYS_INLINE base::span -LockFreeAddressHashSet::GetKeySlots(Node* node) { - if (multi_key_) { - return base::span(reinterpret_cast(node)->keys); - } else { - return base::span_from_ref(reinterpret_cast(node)->key); - } -} - -ALWAYS_INLINE base::span -LockFreeAddressHashSet::GetKeySlots(const Node* node) const { - if (multi_key_) { - return base::span(reinterpret_cast(node)->keys); - } else { - return base::span_from_ref( - reinterpret_cast(node)->key); - } +ALWAYS_INLINE const LockFreeAddressHashSet::Node* +LockFreeAddressHashSet::FindNode(void* key) const { + return const_cast(this)->FindNode(key); } // static diff --git a/naiveproxy/src/base/sampling_heap_profiler/lock_free_bloom_filter.cc b/naiveproxy/src/base/sampling_heap_profiler/lock_free_bloom_filter.cc index 3d74ad72e3..0190f041f1 100644 --- a/naiveproxy/src/base/sampling_heap_profiler/lock_free_bloom_filter.cc +++ b/naiveproxy/src/base/sampling_heap_profiler/lock_free_bloom_filter.cc @@ -8,8 +8,8 @@ #include #include +#include -#include "base/check_op.h" #include "base/compiler_specific.h" #include "base/hash/hash.h" @@ -62,4 +62,9 @@ void LockFreeBloomFilter::SetBitsForTesting(const BitStorage& bits) { bits_.store(bits, std::memory_order_relaxed); } +size_t LockFreeBloomFilter::CountBits() const { + // Relaxed ordering is enough since this is only for statistics. + return std::bitset(bits_.load(std::memory_order_relaxed)).count(); +} + } // namespace base diff --git a/naiveproxy/src/base/sampling_heap_profiler/lock_free_bloom_filter.h b/naiveproxy/src/base/sampling_heap_profiler/lock_free_bloom_filter.h index 12de2159fa..a70814e071 100644 --- a/naiveproxy/src/base/sampling_heap_profiler/lock_free_bloom_filter.h +++ b/naiveproxy/src/base/sampling_heap_profiler/lock_free_bloom_filter.h @@ -125,6 +125,9 @@ class BASE_EXPORT LockFreeBloomFilter { use_fake_hash_functions_ = use_fake_hash_functions; } + // Returns the number of bits that are set, for stats. + size_t CountBits() const; + private: // Number of bits to set for each added key. const size_t num_hash_functions_; diff --git a/naiveproxy/src/base/sampling_heap_profiler/poisson_allocation_sampler.cc b/naiveproxy/src/base/sampling_heap_profiler/poisson_allocation_sampler.cc index c093e98ee2..7beeac0b7a 100644 --- a/naiveproxy/src/base/sampling_heap_profiler/poisson_allocation_sampler.cc +++ b/naiveproxy/src/base/sampling_heap_profiler/poisson_allocation_sampler.cc @@ -15,7 +15,6 @@ #include "base/allocator/dispatcher/tls.h" #include "base/check.h" #include "base/compiler_specific.h" -#include "base/feature_list.h" #include "base/no_destructor.h" #include "base/rand_util.h" #include "build/build_config.h" @@ -24,10 +23,6 @@ namespace base { namespace { -BASE_FEATURE(kHeapProfilerMultiKeyHashSet, - "HeapProfilerMultiKeyHashSet", - base::FEATURE_DISABLED_BY_DEFAULT); - using ::base::allocator::dispatcher::ReentryGuard; const size_t kDefaultSamplingIntervalBytes = 128 * 1024; @@ -106,12 +101,18 @@ PoissonAllocationSamplerStats::PoissonAllocationSamplerStats( size_t address_cache_misses, size_t address_cache_max_size, float address_cache_max_load_factor, - AddressCacheBucketStats address_cache_bucket_stats) + AddressCacheBucketStats address_cache_bucket_stats, + size_t bloom_filter_hits, + size_t bloom_filter_misses, + size_t bloom_filter_max_saturation) : address_cache_hits(address_cache_hits), address_cache_misses(address_cache_misses), address_cache_max_size(address_cache_max_size), address_cache_max_load_factor(address_cache_max_load_factor), - address_cache_bucket_stats(std::move(address_cache_bucket_stats)) {} + address_cache_bucket_stats(std::move(address_cache_bucket_stats)), + bloom_filter_hits(bloom_filter_hits), + bloom_filter_misses(bloom_filter_misses), + bloom_filter_max_saturation(bloom_filter_max_saturation) {} PoissonAllocationSamplerStats::~PoissonAllocationSamplerStats() = default; @@ -214,8 +215,7 @@ constinit std::atomic PoissonAllocationSampler::PoissonAllocationSampler() { Init(); - auto* sampled_addresses = new LockFreeAddressHashSet( - 64, mutex_, base::FeatureList::IsEnabled(kHeapProfilerMultiKeyHashSet)); + auto* sampled_addresses = new LockFreeAddressHashSet(64, mutex_); g_sampled_addresses_set.store(sampled_addresses, std::memory_order_release); } @@ -254,7 +254,10 @@ PoissonAllocationSamplerStats PoissonAllocationSampler::GetAndResetStats() { address_cache_misses_.exchange(0, std::memory_order_relaxed), std::exchange(address_cache_max_size_, 0), std::exchange(address_cache_max_load_factor_, 0.0), - sampled_addresses_set().GetBucketStats()); + sampled_addresses_set().GetBucketStats(), + bloom_filter_hits_.exchange(0, std::memory_order_relaxed), + bloom_filter_misses_.exchange(0, std::memory_order_relaxed), + std::exchange(bloom_filter_max_saturation_, 0)); } // static @@ -357,17 +360,27 @@ void PoissonAllocationSampler::DoRecordAllocation( // TODO(alph): Sometimes RecordAlloc is called twice in a row without // a RecordFree in between. Investigate it. - if (sampled_addresses_set().Contains(address)) { + LockFreeAddressHashSet& address_cache = sampled_addresses_set(); + if (address_cache.Contains(address) == + LockFreeAddressHashSet::ContainsResult::kFound) { return; } - sampled_addresses_set().Insert(address); + address_cache.Insert(address); BalanceAddressesHashSet(); + // Record the load factor after balancing gets a chance to reduce it. // Balancing won't change the size. + const LockFreeAddressHashSet& balanced_address_cache = + sampled_addresses_set(); address_cache_max_size_ = - std::max(address_cache_max_size_, sampled_addresses_set().size()); + std::max(address_cache_max_size_, balanced_address_cache.size()); address_cache_max_load_factor_ = std::max( - address_cache_max_load_factor_, sampled_addresses_set().load_factor()); + address_cache_max_load_factor_, balanced_address_cache.load_factor()); + if (balanced_address_cache.bloom_filter()) { + bloom_filter_max_saturation_ = + std::max(bloom_filter_max_saturation_, + balanced_address_cache.bloom_filter()->CountBits()); + } observers_copy = observers_; } @@ -409,8 +422,7 @@ void PoissonAllocationSampler::BalanceAddressesHashSet() { return; } auto new_set = std::make_unique( - current_set.buckets_count() * 2, mutex_, - base::FeatureList::IsEnabled(kHeapProfilerMultiKeyHashSet)); + current_set.buckets_count() * 2, mutex_); new_set->Copy(current_set); // Atomically switch all the new readers to the new set. g_sampled_addresses_set.store(new_set.release(), std::memory_order_release); diff --git a/naiveproxy/src/base/sampling_heap_profiler/poisson_allocation_sampler.h b/naiveproxy/src/base/sampling_heap_profiler/poisson_allocation_sampler.h index 820a1c98f8..c25ba58184 100644 --- a/naiveproxy/src/base/sampling_heap_profiler/poisson_allocation_sampler.h +++ b/naiveproxy/src/base/sampling_heap_profiler/poisson_allocation_sampler.h @@ -18,6 +18,7 @@ #include "base/memory/raw_ptr_exclusion.h" #include "base/no_destructor.h" #include "base/sampling_heap_profiler/lock_free_address_hash_set.h" +#include "base/sampling_heap_profiler/lock_free_bloom_filter.h" #include "base/synchronization/lock.h" #include "base/thread_annotations.h" @@ -34,7 +35,10 @@ struct BASE_EXPORT PoissonAllocationSamplerStats { size_t address_cache_misses, size_t address_cache_max_size, float address_cache_max_load_factor, - AddressCacheBucketStats address_cache_bucket_stats); + AddressCacheBucketStats address_cache_bucket_stats, + size_t bloom_filter_hits, + size_t bloom_filter_misses, + size_t bloom_filter_max_saturation); ~PoissonAllocationSamplerStats(); PoissonAllocationSamplerStats(const PoissonAllocationSamplerStats&); @@ -46,6 +50,9 @@ struct BASE_EXPORT PoissonAllocationSamplerStats { size_t address_cache_max_size; float address_cache_max_load_factor; AddressCacheBucketStats address_cache_bucket_stats; + size_t bloom_filter_hits; + size_t bloom_filter_misses; + size_t bloom_filter_max_saturation; }; // This singleton class implements Poisson sampling of the incoming allocations @@ -265,6 +272,9 @@ class BASE_EXPORT PoissonAllocationSampler { size_t address_cache_max_size_ GUARDED_BY(mutex_) = 0; // The max load factor that's observed in sampled_addresses_set(). float address_cache_max_load_factor_ GUARDED_BY(mutex_) = 0; + std::atomic bloom_filter_hits_; + std::atomic bloom_filter_misses_; + size_t bloom_filter_max_saturation_ GUARDED_BY(mutex_) = 0; // The load factor that will trigger rebalancing in sampled_addresses_set(). // By definition `address_cache_max_load_factor_` will never exceed this. @@ -377,11 +387,28 @@ ALWAYS_INLINE void PoissonAllocationSampler::OnFree( if (address == nullptr) [[unlikely]] { return; } - if (!sampled_addresses_set().Contains(address)) [[likely]] { - address_cache_misses_.fetch_add(1, std::memory_order_relaxed); - return; + const LockFreeAddressHashSet& address_cache = sampled_addresses_set(); + switch (address_cache.Contains(address)) { + [[likely]] case LockFreeAddressHashSet::ContainsResult::kNotFound: + if (address_cache.bloom_filter()) { + bloom_filter_misses_.fetch_add(1, std::memory_order_relaxed); + } else { + address_cache_misses_.fetch_add(1, std::memory_order_relaxed); + } + return; + case LockFreeAddressHashSet::ContainsResult:: + kNotFoundButMatchedInBloomFilter: + bloom_filter_hits_.fetch_add(1, std::memory_order_relaxed); + address_cache_misses_.fetch_add(1, std::memory_order_relaxed); + return; + [[unlikely]] case LockFreeAddressHashSet::ContainsResult::kFound: + if (address_cache.bloom_filter()) { + bloom_filter_hits_.fetch_add(1, std::memory_order_relaxed); + } + address_cache_hits_.fetch_add(1, std::memory_order_relaxed); + // Continue after switch. + break; } - address_cache_hits_.fetch_add(1, std::memory_order_relaxed); if (ScopedMuteThreadSamples::IsMuted()) [[unlikely]] { return; } diff --git a/naiveproxy/src/base/strings/latin1_string_conversions.h b/naiveproxy/src/base/strings/latin1_string_conversions.h index 19dbbe1cd8..384707da38 100644 --- a/naiveproxy/src/base/strings/latin1_string_conversions.h +++ b/naiveproxy/src/base/strings/latin1_string_conversions.h @@ -25,6 +25,10 @@ typedef unsigned char Latin1Char; // array to std::u16string. This function is defined here rather than in // WebString.h to avoid binary bloat in all the callers of the conversion // operator. +// TODO(crbug.com/40284755): implement spanified version. +// BASE_EXPORT std::u16string Latin1OrUTF16ToUTF16( +// base::span latin1, +// base::span utf16); BASE_EXPORT std::u16string Latin1OrUTF16ToUTF16(size_t length, const Latin1Char* latin1, const char16_t* utf16); diff --git a/naiveproxy/src/base/strings/string_number_conversions.cc b/naiveproxy/src/base/strings/string_number_conversions.cc index 77fa2ec70c..dbca9a9b58 100644 --- a/naiveproxy/src/base/strings/string_number_conversions.cc +++ b/naiveproxy/src/base/strings/string_number_conversions.cc @@ -70,6 +70,13 @@ std::u16string NumberToString16(double value) { return internal::DoubleToStringT(value); } +std::string NumberToStringWithFixedPrecision(double value, int digits) { + return internal::DoubleToStringFixedT(value, digits); +} +std::u16string NumberToString16WithFixedPrecision(double value, int digits) { + return internal::DoubleToStringFixedT(value, digits); +} + bool StringToInt(std::string_view input, int* output) { return internal::StringToIntImpl(input, *output); } diff --git a/naiveproxy/src/base/strings/string_number_conversions.h b/naiveproxy/src/base/strings/string_number_conversions.h index 3beaa9359a..af7b4b9046 100644 --- a/naiveproxy/src/base/strings/string_number_conversions.h +++ b/naiveproxy/src/base/strings/string_number_conversions.h @@ -50,26 +50,35 @@ BASE_EXPORT std::string NumberToString(long long value); BASE_EXPORT std::u16string NumberToString16(long long value); BASE_EXPORT std::string NumberToString(unsigned long long value); BASE_EXPORT std::u16string NumberToString16(unsigned long long value); + +// Returns a string that contains a full representation of `value`. BASE_EXPORT std::string NumberToString(double value); BASE_EXPORT std::u16string NumberToString16(double value); +// Returns a string that contains a representation of `value` expressed with +// exactly `digits` digits after the decimal point. +BASE_EXPORT std::string NumberToStringWithFixedPrecision(double value, + int digits); +BASE_EXPORT std::u16string NumberToString16WithFixedPrecision(double value, + int digits); + // String -> number conversions ------------------------------------------------ // Perform a best-effort conversion of the input string to a numeric type, -// setting |*output| to the result of the conversion. Returns true for +// setting `*output` to the result of the conversion. Returns true for // "perfect" conversions; returns false in the following cases: -// - Overflow. |*output| will be set to the maximum value supported +// - Overflow. `*output` will be set to the maximum value supported // by the data type. -// - Underflow. |*output| will be set to the minimum value supported +// - Underflow. `*output` will be set to the minimum value supported // by the data type. -// - Trailing characters in the string after parsing the number. |*output| +// - Trailing characters in the string after parsing the number. `*output` // will be set to the value of the number that was parsed. -// - Leading whitespace in the string before parsing the number. |*output| will +// - Leading whitespace in the string before parsing the number. `*output` will // be set to the value of the number that was parsed. // - No characters parseable as a number at the beginning of the string. -// |*output| will be set to 0. -// - Empty string. |*output| will be set to 0. -// WARNING: Will write to |output| even when returning false. +// `*output` will be set to 0. +// - Empty string. `*output` will be set to 0. +// WARNING: Will write to `output` even when returning false. // Read the comments above carefully. BASE_EXPORT bool StringToInt(std::string_view input, int* output); BASE_EXPORT bool StringToInt(std::u16string_view input, int* output); @@ -92,7 +101,7 @@ BASE_EXPORT bool StringToSizeT(std::u16string_view input, size_t* output); // NaN and inf) is undefined. Otherwise, these behave the same as the integral // variants. This expects the input string to NOT be specific to the locale. // If your input is locale specific, use ICU to read the number. -// WARNING: Will write to |output| even when returning false. +// WARNING: Will write to `output` even when returning false. // Read the comments here and above StringToInt() carefully. BASE_EXPORT bool StringToDouble(std::string_view input, double* output); BASE_EXPORT bool StringToDouble(std::u16string_view input, double* output); @@ -100,10 +109,10 @@ BASE_EXPORT bool StringToDouble(std::u16string_view input, double* output); // Hex encoding ---------------------------------------------------------------- // Returns a hex string representation of a binary buffer. The returned hex -// string will be in upper case. This function does not check if |size| is +// string will be in upper case. This function does not check if `size` is // within reasonable limits since it's written with trusted data in mind. If // you suspect that the data you want to format might be large, the absolute -// max size for |size| should be is +// max size for `size` should be is // std::numeric_limits::max() / 2 BASE_EXPORT std::string HexEncode(base::span bytes); BASE_EXPORT std::string HexEncode(std::string_view chars); @@ -128,42 +137,42 @@ inline void AppendHexEncodedByte(uint8_t byte, } // Best effort conversion, see StringToInt above for restrictions. -// Will only successful parse hex values that will fit into |output|, i.e. -// -0x80000000 < |input| < 0x7FFFFFFF. +// Will only successful parse hex values that will fit into `output`, i.e. +// -0x8000'0000 < `input` < 0x7FFF'FFFF. BASE_EXPORT bool HexStringToInt(std::string_view input, int* output); // Best effort conversion, see StringToInt above for restrictions. -// Will only successful parse hex values that will fit into |output|, i.e. -// 0x00000000 < |input| < 0xFFFFFFFF. -// The string is not required to start with 0x. +// Will only successful parse hex values that will fit into `output`, i.e. +// 0x0000'0000 < `input` < 0xFFFF'FFFF. +// The string is not required to start with "0x". BASE_EXPORT bool HexStringToUInt(std::string_view input, uint32_t* output); // Best effort conversion, see StringToInt above for restrictions. -// Will only successful parse hex values that will fit into |output|, i.e. -// -0x8000000000000000 < |input| < 0x7FFFFFFFFFFFFFFF. +// Will only successful parse hex values that will fit into `output`, i.e. +// -0x8000'0000'0000'0000 < `input` < 0x7FFF'FFFF'FFFF'FFFF. BASE_EXPORT bool HexStringToInt64(std::string_view input, int64_t* output); // Best effort conversion, see StringToInt above for restrictions. -// Will only successful parse hex values that will fit into |output|, i.e. -// 0x0000000000000000 < |input| < 0xFFFFFFFFFFFFFFFF. -// The string is not required to start with 0x. +// Will only successful parse hex values that will fit into `output`, i.e. +// 0x0000'0000'0000'0000 < `input` < 0xFFFF'FFFF'FFFF'FFFF. +// The string is not required to start with "0x". BASE_EXPORT bool HexStringToUInt64(std::string_view input, uint64_t* output); // Similar to the previous functions, except that output is a vector of bytes. -// |*output| will contain as many bytes as were successfully parsed prior to the +// `*output` will contain as many bytes as were successfully parsed prior to the // error. There is no overflow, but input.size() must be evenly divisible by 2. -// Leading 0x or +/- are not allowed. +// Leading "0x" or +/- are not allowed. BASE_EXPORT bool HexStringToBytes(std::string_view input, std::vector* output); // Same as HexStringToBytes, but for an std::string. BASE_EXPORT bool HexStringToString(std::string_view input, std::string* output); -// Decodes the hex string |input| into a presized |output|. The output buffer -// must be sized exactly to |input.size() / 2| or decoding will fail and no -// bytes will be written to |output|. Decoding an empty input is also +// Decodes the hex string `input` into a presized `output`. The output buffer +// must be sized exactly to `input.size() / 2` or decoding will fail and no +// bytes will be written to `output`. Decoding an empty input is also // considered a failure. When decoding fails due to encountering invalid input -// characters, |output| will have been filled with the decoded bytes up until +// characters, `output` will have been filled with the decoded bytes up until // the failure. BASE_EXPORT bool HexStringToSpan(std::string_view input, base::span output); diff --git a/naiveproxy/src/base/strings/string_number_conversions_internal.h b/naiveproxy/src/base/strings/string_number_conversions_internal.h index 2de7823c76..6b6e41ebd4 100644 --- a/naiveproxy/src/base/strings/string_number_conversions_internal.h +++ b/naiveproxy/src/base/strings/string_number_conversions_internal.h @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -19,9 +20,7 @@ #include "base/strings/string_util.h" #include "base/third_party/double_conversion/double-conversion/double-conversion.h" -namespace base { - -namespace internal { +namespace base::internal { template static STR IntToStringT(INT value) { @@ -33,27 +32,27 @@ static STR IntToStringT(INT value) { // Create the string in a temporary buffer, write it back to front, and // then return the substr of what we ended up using. using CHR = typename STR::value_type; - CHR outbuf[kOutputBufSize]; + std::array outbuf = {}; // The ValueOrDie call below can never fail, because UnsignedAbs is valid // for all valid inputs. std::make_unsigned_t res = CheckedNumeric(value).UnsignedAbs().ValueOrDie(); - CHR* end = UNSAFE_TODO(outbuf + kOutputBufSize); - CHR* i = end; + // Fill digits right-to-left. + size_t write = outbuf.size(); do { - UNSAFE_TODO(--i); - DCHECK(i != outbuf); - *i = static_cast((res % 10) + '0'); + const CHR digit = static_cast((res % 10) + '0'); + outbuf[--write] = digit; res /= 10; } while (res != 0); + if (IsValueNegative(value)) { - UNSAFE_TODO(--i); - DCHECK(i != outbuf); - *i = static_cast('-'); + outbuf[--write] = static_cast('-'); } - return STR(i, end); + + auto result_span = base::span(outbuf).subspan(write); + return STR(result_span.begin(), result_span.end()); } // Utility to convert a character to a digit in a given base @@ -212,27 +211,24 @@ GetDoubleToStringConverter() { return &converter; } -// Converts a given (data, size) pair to a desired string type. For -// performance reasons, this dispatches to a different constructor if the -// passed-in data matches the string's value_type. -template -StringT ToString(const typename StringT::value_type* data, size_t size) { - return StringT(data, size); -} - -// TODO(tsepez): should be UNSAFE_BUFFER_USAGE. -template -StringT ToString(const CharT* data, size_t size) { - // SAFETY: required from caller. - return StringT(data, UNSAFE_BUFFERS(data + size)); -} - template StringT DoubleToStringT(double value) { - char buffer[32]; - double_conversion::StringBuilder builder(buffer, sizeof(buffer)); + std::array buffer; + double_conversion::StringBuilder builder(buffer.data(), buffer.size()); GetDoubleToStringConverter()->ToShortest(value, &builder); - return ToString(buffer, static_cast(builder.position())); + auto result_span = + base::span(buffer).first(static_cast(builder.position())); + return StringT(result_span.begin(), result_span.end()); +} + +template +StringT DoubleToStringFixedT(double value, int digits) { + std::array buffer; + double_conversion::StringBuilder builder(buffer.data(), buffer.size()); + GetDoubleToStringConverter()->ToFixed(value, digits, &builder); + auto result_span = + base::span(buffer).first(static_cast(builder.position())); + return StringT(result_span.begin(), result_span.end()); } template @@ -281,8 +277,6 @@ static bool HexStringToByteContainer(std::string_view input, OutIter output) { return true; } -} // namespace internal - -} // namespace base +} // namespace base::internal #endif // BASE_STRINGS_STRING_NUMBER_CONVERSIONS_INTERNAL_H_ diff --git a/naiveproxy/src/base/strings/string_number_conversions_win.cc b/naiveproxy/src/base/strings/string_number_conversions_win.cc index d19101759d..a854a38b4e 100644 --- a/naiveproxy/src/base/strings/string_number_conversions_win.cc +++ b/naiveproxy/src/base/strings/string_number_conversions_win.cc @@ -39,6 +39,10 @@ std::wstring NumberToWString(double value) { return internal::DoubleToStringT(value); } +std::wstring NumberToWStringWithFixedPrecision(double value, int digits) { + return internal::DoubleToStringFixedT(value, digits); +} + bool StringToInt(std::wstring_view input, int* output) { return internal::StringToIntImpl(input, *output); } diff --git a/naiveproxy/src/base/strings/string_number_conversions_win.h b/naiveproxy/src/base/strings/string_number_conversions_win.h index dd28d177b2..e0a3170557 100644 --- a/naiveproxy/src/base/strings/string_number_conversions_win.h +++ b/naiveproxy/src/base/strings/string_number_conversions_win.h @@ -5,6 +5,7 @@ #ifndef BASE_STRINGS_STRING_NUMBER_CONVERSIONS_WIN_H_ #define BASE_STRINGS_STRING_NUMBER_CONVERSIONS_WIN_H_ +#include #include #include @@ -19,6 +20,8 @@ BASE_EXPORT std::wstring NumberToWString(unsigned long value); BASE_EXPORT std::wstring NumberToWString(long long value); BASE_EXPORT std::wstring NumberToWString(unsigned long long value); BASE_EXPORT std::wstring NumberToWString(double value); +BASE_EXPORT std::wstring NumberToWStringWithFixedPrecision(double value, + int digits); // The following section contains overloads of the cross-platform APIs for // std::wstring and std::wstring_view. diff --git a/naiveproxy/src/base/strings/string_util.cc b/naiveproxy/src/base/strings/string_util.cc index ceac509b6e..f8f7935851 100644 --- a/naiveproxy/src/base/strings/string_util.cc +++ b/naiveproxy/src/base/strings/string_util.cc @@ -336,37 +336,6 @@ char HexDigitToInt(char c) { : static_cast(c - 'a' + 10); } -static const auto kByteStringsUnlocalized = std::to_array({ - " B", - " kB", - " MB", - " GB", - " TB", - " PB", -}); - -std::u16string FormatBytesUnlocalized(int64_t bytes) { - double unit_amount = static_cast(bytes); - size_t dimension = 0; - const int kKilo = 1024; - while (unit_amount >= kKilo && - dimension < std::size(kByteStringsUnlocalized) - 1) { - unit_amount /= kKilo; - dimension++; - } - - char buf[64]; - if (bytes != 0 && dimension > 0 && unit_amount < 100) { - UNSAFE_TODO(base::snprintf(buf, std::size(buf), "%.1lf%s", unit_amount, - kByteStringsUnlocalized[dimension])); - } else { - UNSAFE_TODO(base::snprintf(buf, std::size(buf), "%.0lf%s", unit_amount, - kByteStringsUnlocalized[dimension])); - } - - return ASCIIToUTF16(buf); -} - void ReplaceFirstSubstringAfterOffset(std::u16string* str, size_t start_offset, std::u16string_view find_this, diff --git a/naiveproxy/src/base/strings/string_util.h b/naiveproxy/src/base/strings/string_util.h index 1525d0fd2e..e926f87bd1 100644 --- a/naiveproxy/src/base/strings/string_util.h +++ b/naiveproxy/src/base/strings/string_util.h @@ -531,12 +531,6 @@ constexpr bool IsWhitespace(Char c) { } } -// Return a byte string in human-readable format with a unit suffix. Not -// appropriate for use in any UI; use of FormatBytes and friends in ui/base is -// highly recommended instead. TODO(avi): Figure out how to get callers to use -// FormatBytes instead; remove this. -BASE_EXPORT std::u16string FormatBytesUnlocalized(int64_t bytes); - // Starting at |start_offset| (usually 0), replace the first instance of // |find_this| with |replace_with|. BASE_EXPORT void ReplaceFirstSubstringAfterOffset( diff --git a/naiveproxy/src/base/strings/string_util_posix.h b/naiveproxy/src/base/strings/string_util_posix.h index 2a9d69a5ec..1c79bd5fd7 100644 --- a/naiveproxy/src/base/strings/string_util_posix.h +++ b/naiveproxy/src/base/strings/string_util_posix.h @@ -33,6 +33,11 @@ inline int vsnprintf(char* buffer, return ::vsnprintf(buffer, size, format, arguments); } +// TODO(crbug.com/40284755): implement spanified version, or just remove +// this entirely as it has ~no non-test uses. +// inline int vswprintf(base::span buffer, +// const wchar_t* format, +// va_list arguments); inline int vswprintf(wchar_t* buffer, size_t size, const wchar_t* format, diff --git a/naiveproxy/src/base/strings/string_util_win.cc b/naiveproxy/src/base/strings/string_util_win.cc index 7a7858b7c5..9b45097cc3 100644 --- a/naiveproxy/src/base/strings/string_util_win.cc +++ b/naiveproxy/src/base/strings/string_util_win.cc @@ -93,6 +93,16 @@ bool EndsWith(std::wstring_view str, return internal::EndsWithT(str, search_for, case_sensitivity); } +std::optional RemovePrefix(std::wstring_view string, + std::wstring_view prefix, + CompareCase case_sensitivity) { + if (!StartsWith(string, prefix, case_sensitivity)) { + return std::nullopt; + } + string.remove_prefix(prefix.size()); + return string; +} + void ReplaceFirstSubstringAfterOffset(std::wstring* str, size_t start_offset, std::wstring_view find_this, diff --git a/naiveproxy/src/base/strings/string_util_win.h b/naiveproxy/src/base/strings/string_util_win.h index 2841eedc24..58b5725441 100644 --- a/naiveproxy/src/base/strings/string_util_win.h +++ b/naiveproxy/src/base/strings/string_util_win.h @@ -40,6 +40,10 @@ inline int vsnprintf(char* buffer, return length; } +// TODO(crbug.com/40284755): implement spanified version. +// inline int vswprintf(base::span buffer, +// const wchar_t* format, +// va_list arguments); inline int vswprintf(wchar_t* buffer, size_t size, const wchar_t* format, @@ -182,6 +186,11 @@ BASE_EXPORT bool EndsWith( std::wstring_view search_for, CompareCase case_sensitivity = CompareCase::SENSITIVE); +BASE_EXPORT std::optional RemovePrefix( + std::wstring_view string, + std::wstring_view prefix, + CompareCase case_sensitivity = CompareCase::SENSITIVE); + BASE_EXPORT void ReplaceFirstSubstringAfterOffset( std::wstring* str, size_t start_offset, diff --git a/naiveproxy/src/base/strings/to_string.h b/naiveproxy/src/base/strings/to_string.h index ab7da292d1..da1db6682a 100644 --- a/naiveproxy/src/base/strings/to_string.h +++ b/naiveproxy/src/base/strings/to_string.h @@ -93,7 +93,7 @@ template requires(!SupportsOstreamOperator && SupportsToString) struct ToStringHelper { static void Stringify(const T& v, std::ostringstream& ss) { - // .ToString() may not return a std::string, e.g. blink::WTF::String. + // .ToString() may not return a std::string, e.g. blink::String. ToStringHelper::Stringify(v.ToString(), ss); } }; diff --git a/naiveproxy/src/base/strings/utf_string_conversion_utils.h b/naiveproxy/src/base/strings/utf_string_conversion_utils.h index a730215a9d..499cb4dbd7 100644 --- a/naiveproxy/src/base/strings/utf_string_conversion_utils.h +++ b/naiveproxy/src/base/strings/utf_string_conversion_utils.h @@ -59,12 +59,20 @@ BASE_EXPORT std::optional CountUnicodeCharacters( // (as in a for loop) will take the reader to the next character. // // Returns true on success. On false, |*code_point| will be invalid. +// TODO(crbug.com/40284755): implement spanified version (or use string view). +// BASE_EXPORT bool ReadUnicodeCharacter(base::span src, +// size_t* char_index, +// base_icu::UChar32* code_point_out); BASE_EXPORT bool ReadUnicodeCharacter(const char* src, size_t src_len, size_t* char_index, base_icu::UChar32* code_point_out); // Reads a UTF-16 character. The usage is the same as the 8-bit version above. +// TODO(crbug.com/40284755): implement spanified version (or use string view). +// BASE_EXPORT bool ReadUnicodeCharacter(base::span src, +// size_t* char_index, +// base_icu::UChar32* code_point); BASE_EXPORT bool ReadUnicodeCharacter(const char16_t* src, size_t src_len, size_t* char_index, @@ -72,6 +80,10 @@ BASE_EXPORT bool ReadUnicodeCharacter(const char16_t* src, #if defined(WCHAR_T_IS_32_BIT) // Reads UTF-32 character. The usage is the same as the 8-bit version above. +// TODO(crbug.com/40284755): implement spanified version (or use string view). +// BASE_EXPORT bool ReadUnicodeCharacter(base::span src, +// size_t* char_index, +// base_icu::UChar32* code_point); BASE_EXPORT bool ReadUnicodeCharacter(const wchar_t* src, size_t src_len, size_t* char_index, @@ -107,11 +119,17 @@ inline size_t WriteUnicodeCharacter(base_icu::UChar32 code_point, // string, and reserves that amount of space. We assume that the input // character types are unsigned, which will be true for UTF-16 and -32 on our // systems. +// TODO(crbug.com/40284755): implement spanified version. +// template +// void PrepareForUTF8Output(base::span src, std::string* output); template void PrepareForUTF8Output(const CHAR* src, size_t src_len, std::string* output); // Prepares an output buffer (containing either UTF-16 or -32 data) given some // UTF-8 input that will be converted to it. See PrepareForUTF8Output(). +// TODO(crbug.com/40284755): implement spanified version. +// template +// void PrepareForUTF16Or32Output(base::span src, STRING* output); template void PrepareForUTF16Or32Output(const char* src, size_t src_len, STRING* output); diff --git a/naiveproxy/src/base/strings/utf_string_conversions.h b/naiveproxy/src/base/strings/utf_string_conversions.h index 6878038a19..3430b571db 100644 --- a/naiveproxy/src/base/strings/utf_string_conversions.h +++ b/naiveproxy/src/base/strings/utf_string_conversions.h @@ -11,7 +11,6 @@ #include #include "base/base_export.h" -#include "base/types/always_false.h" #include "build/build_config.h" namespace base { @@ -73,19 +72,19 @@ BASE_EXPORT bool UTF16ToUTF8(const char16_t* src, // time. template [[noreturn]] std::u16string WideToUTF16(const wchar_t (&str)[N]) { - static_assert(AlwaysFalse, + static_assert(false, "Error: Use u\"...\" to create a std::u16string literal."); } template [[noreturn]] std::u16string UTF8ToUTF16(const char (&str)[N]) { - static_assert(AlwaysFalse, + static_assert(false, "Error: Use u\"...\" to create a std::u16string literal."); } template [[noreturn]] std::u16string ASCIIToUTF16(const char (&str)[N]) { - static_assert(AlwaysFalse, + static_assert(false, "Error: Use u\"...\" to create a std::u16string literal."); } diff --git a/naiveproxy/src/base/synchronization/lock.cc b/naiveproxy/src/base/synchronization/lock.cc index 7cd17ed60e..0d3df094dd 100644 --- a/naiveproxy/src/base/synchronization/lock.cc +++ b/naiveproxy/src/base/synchronization/lock.cc @@ -6,15 +6,12 @@ // is functionally a wrapper around the LockImpl class, so the only // real intelligence in the class is in the debugging logic. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include "base/synchronization/lock.h" #include +#include "base/compiler_specific.h" + #if DCHECK_IS_ON() #include #include @@ -145,8 +142,9 @@ void Lock::RemoveFromLocksHeldOnCurrentThread() { namespace subtle { span GetTrackedLocksHeldByCurrentThread() { - return span(g_tracked_locks_held_by_thread.begin(), - g_num_tracked_locks_held_by_thread); + return UNSAFE_TODO( + span(g_tracked_locks_held_by_thread.begin(), + g_num_tracked_locks_held_by_thread)); } } // namespace subtle diff --git a/naiveproxy/src/base/synchronization/lock_impl_posix.cc b/naiveproxy/src/base/synchronization/lock_impl_posix.cc index 2e2e02ac8d..20a2582f4a 100644 --- a/naiveproxy/src/base/synchronization/lock_impl_posix.cc +++ b/naiveproxy/src/base/synchronization/lock_impl_posix.cc @@ -14,6 +14,7 @@ #include "base/check_op.h" #include "base/posix/safe_strerror.h" #include "base/synchronization/lock.h" +#include "base/synchronization/lock_metrics_recorder.h" #include "base/synchronization/synchronization_buildflags.h" #include "base/system/sys_info.h" #include "build/build_config.h" @@ -21,6 +22,8 @@ #include "base/android/background_thread_pool_field_trial.h" #endif + +#if BUILDFLAG(IS_ANDROID) // On Android, `pthread_mutexattr_setprotocol()` is only defined in bionic // starting with API level 28. Make it a weak import, so that we can compile. extern "C" { @@ -28,6 +31,7 @@ int __attribute__((weak)) pthread_mutexattr_setprotocol( pthread_mutexattr_t* _Nonnull __attr, int __protocol); } +#endif namespace base { @@ -124,6 +128,7 @@ LockImpl::~LockImpl() { } void LockImpl::LockInternal() { + LockMetricsRecorder::ScopedLockAcquisitionTimer timer; int rv = pthread_mutex_lock(&native_handle_); DCHECK_EQ(rv, 0) << ". " << SystemErrorCodeToString(rv); } @@ -162,12 +167,15 @@ bool KernelSupportsPriorityInheritanceFutex() { // kernel and was backported to the 6.1.75 and 6.6.29 kernels. This change // hasn't been upstreamed yet. #if BUILDFLAG(IS_ANDROID) - auto kernel_version = SysInfo::KernelVersionNumber::Current(); - return (kernel_version > SysInfo::KernelVersionNumber(6, 12, 13)) || - ((kernel_version > SysInfo::KernelVersionNumber(6, 6, 29)) && - (kernel_version < SysInfo::KernelVersionNumber(6, 6, INT32_MAX))) || - ((kernel_version > SysInfo::KernelVersionNumber(6, 1, 75)) && - (kernel_version < SysInfo::KernelVersionNumber(6, 1, INT32_MAX))); + static bool supports_pi_futex = [] { + auto kernel_version = SysInfo::KernelVersionNumber::Current(); + return (kernel_version > SysInfo::KernelVersionNumber(6, 12, 13)) || + ((kernel_version > SysInfo::KernelVersionNumber(6, 6, 29)) && + (kernel_version < SysInfo::KernelVersionNumber(6, 6, INT32_MAX))) || + ((kernel_version > SysInfo::KernelVersionNumber(6, 1, 75)) && + (kernel_version < SysInfo::KernelVersionNumber(6, 1, INT32_MAX))); + }(); + return supports_pi_futex; #else // BUILDFLAG(IS_ANDROID) return false; #endif // BUILDFLAG(IS_ANDROID) diff --git a/naiveproxy/src/base/synchronization/lock_impl_win.cc b/naiveproxy/src/base/synchronization/lock_impl_win.cc index 6819c23356..4b63c35108 100644 --- a/naiveproxy/src/base/synchronization/lock_impl_win.cc +++ b/naiveproxy/src/base/synchronization/lock_impl_win.cc @@ -6,6 +6,8 @@ #include +#include "base/synchronization/lock_metrics_recorder.h" + namespace base { namespace internal { @@ -14,6 +16,7 @@ LockImpl::LockImpl() : native_handle_(SRWLOCK_INIT) {} LockImpl::~LockImpl() = default; void LockImpl::LockInternal() { + LockMetricsRecorder::ScopedLockAcquisitionTimer timer; ::AcquireSRWLockExclusive(reinterpret_cast(&native_handle_)); } diff --git a/naiveproxy/src/base/synchronization/lock_metrics_recorder.cc b/naiveproxy/src/base/synchronization/lock_metrics_recorder.cc new file mode 100644 index 0000000000..6927a39708 --- /dev/null +++ b/naiveproxy/src/base/synchronization/lock_metrics_recorder.cc @@ -0,0 +1,100 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/synchronization/lock_metrics_recorder.h" + +#include "base/auto_reset.h" +#include "base/check.h" +#include "base/containers/ring_buffer.h" +#include "base/metrics/histogram_macros.h" +#include "base/no_destructor.h" +#include "base/strings/strcat.h" +#include "base/synchronization/lock.h" +#include "base/threading/platform_thread.h" +#include "base/threading/platform_thread_ref.h" +#include "base/time/time.h" + +namespace base { + +namespace { + +// The histogram bounds (1us to 1s) are chosen to select for meaningful lock +// contention. A lower bound of 1us (the approximate maximum overhead of a +// no-op syscall) helps filter out noise from uncontended lock acquisitions +// including cases where the detection of contention is best-effort, such as +// in Lock. An upper bound of 1s is used because waits longer than this +// are exceptionally rare, and bucketing them together is sufficient for +// analysis. +void ReportBaseLockHistogram(const TimeDelta& sample) { + static const NoDestructor base_lock_hist_name( + StrCat({"Scheduling.ContendedLockAcquisitionTime.BaseLock.", + PlatformThread::GetName()})); + UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(*base_lock_hist_name, sample, + Microseconds(1), Seconds(1), 100); +} + +void ReportPartitionAllocLockHistogram(const TimeDelta& sample) { + static const NoDestructor pa_lock_hist_name( + StrCat({"Scheduling.ContendedLockAcquisitionTime.PartitionAllocLock.", + PlatformThread::GetName()})); + UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(*pa_lock_hist_name, sample, + Microseconds(1), Seconds(1), 100); +} + +} // namespace + +void LockMetricsRecorder::RecordLockAcquisitionTime(TimeDelta sample, + LockType type) { + buffer_[static_cast(type)].SaveToBuffer(sample); +} + +void LockMetricsRecorder::ForEachSample(LockType type, + FunctionRef f) { + CHECK(!iterating_in_progress_); + CHECK_LE(type, LockType::kMax); + // Set the `reporting_in_progress_` flag to true to prevent re-entrancy due to + // any lock contention during the recording of the histogram. This keeps the + // recording and reporting logic simple at the cost of a tiny blind-spot in + // our metrics. + AutoReset mark_iterating_in_progress(&iterating_in_progress_, true); + auto& buffer = buffer_[static_cast(type)]; + for (auto it = buffer.Begin(); it; ++it) { + f(**it); + } + buffer.Clear(); +} + +void LockMetricsRecorder::ReportLockAcquisitionTimes() { + // Only report samples from target thread. + if (!IsCurrentThreadTarget()) { + return; + } + + ForEachSample(LockType::kBaseLock, ReportBaseLockHistogram); + ForEachSample(LockType::kPartitionAllocLock, + ReportPartitionAllocLockHistogram); +} + +// static +void LockMetricsRecorder::SetTargetCurrentThread() { + PlatformThreadRef current_thread = PlatformThread::CurrentRef(); + PlatformThreadRef prev_target_thread = + target_thread_.exchange(current_thread, std::memory_order_relaxed); + CHECK(prev_target_thread.is_null() || prev_target_thread == current_thread); +} + +// static +LockMetricsRecorder* LockMetricsRecorder::Get() { + static LockMetricsRecorder g_lock_metrics_recorder; + return &g_lock_metrics_recorder; +} + +// static +LockMetricsRecorder::ScopedLockAcquisitionTimer +LockMetricsRecorder::ScopedLockAcquisitionTimer::CreateForTest( + LockMetricsRecorder* recorder) { + return LockMetricsRecorder::ScopedLockAcquisitionTimer(recorder); +} + +} // namespace base diff --git a/naiveproxy/src/base/synchronization/lock_metrics_recorder.h b/naiveproxy/src/base/synchronization/lock_metrics_recorder.h new file mode 100644 index 0000000000..c1bbbb2bda --- /dev/null +++ b/naiveproxy/src/base/synchronization/lock_metrics_recorder.h @@ -0,0 +1,144 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_SYNCHRONIZATION_LOCK_METRICS_RECORDER_H_ +#define BASE_SYNCHRONIZATION_LOCK_METRICS_RECORDER_H_ + +#include +#include +#include + +#include "base/base_export.h" +#include "base/compiler_specific.h" +#include "base/containers/ring_buffer.h" +#include "base/functional/function_ref.h" +#include "base/memory/stack_allocated.h" +#include "base/rand_util.h" +#include "base/time/time.h" +#include "base/time/time_override.h" + +namespace base { + +// A class used to hold samples of metrics related to locks. +// +// `LockMetricsRecorder` is not thread-safe and all samples must be recorded +// from the same thread for the lifetime of the process after setting that +// thread as the target thread. +class BASE_EXPORT LockMetricsRecorder { + public: + // The internal buffer size is a trade-off between memory usage and the number + // of samples that can be stored. With sampling, this buffer size should be + // sufficient for most cases. If the buffer overflows, the RingBuffer will + // overwrite the oldest samples. + constexpr static size_t kMaxSamples = 256; + + LockMetricsRecorder() = default; + LockMetricsRecorder(const LockMetricsRecorder&) = delete; + LockMetricsRecorder& operator=(const LockMetricsRecorder&) = delete; + ~LockMetricsRecorder() = default; + + // Get the global instance of lock metrics recorder. + static LockMetricsRecorder* Get(); + + // Sets current thread as the target thread for recording lock-related + // metrics. + // + // This function can be called multiple times from the same thread but will + // crash if called from different threads. + void SetTargetCurrentThread(); + + inline bool IsCurrentThreadTarget() const { + return target_thread_.load(std::memory_order_relaxed) == + PlatformThread::CurrentRef(); + } + + inline bool ShouldRecordLockAcquisitionTime() const { + return IsCurrentThreadTarget() && !iterating_in_progress_ && + metrics_sub_sampler_.ShouldSample(kSamplingRatio); + } + + // The type of lock the sample is associated with. + enum class LockType : size_t { + // For samples associated with base::Lock + kBaseLock = 0, + // For samples associated with partition_alloc::internal::Lock + kPartitionAllocLock = 1, + kMax = kPartitionAllocLock, + }; + + // Records a sample into the internal buffer. Must be called on the target + // thread. + void RecordLockAcquisitionTime(TimeDelta sample, LockType type); + + // Report lock acquisition times to UMA histograms, if the current thread is + // the target thread. + void ReportLockAcquisitionTimes(); + + // Iterate over all the samples of the given type and synchronously call the + // FunctionRef for each sample. Only exposed for testing. Call + // `ReportLockAcquisitionTimes()` to report histograms for all the stored + // samples. + void ForEachSample(LockType type, FunctionRef f); + + // Timer that records into a lock metrics object. + class BASE_EXPORT ScopedLockAcquisitionTimer { + STACK_ALLOCATED(); + + public: + ScopedLockAcquisitionTimer() + : ScopedLockAcquisitionTimer(LockMetricsRecorder::Get()) {} + + ScopedLockAcquisitionTimer(const ScopedLockAcquisitionTimer&) = delete; + ScopedLockAcquisitionTimer& operator=(const ScopedLockAcquisitionTimer&) = + delete; + + ~ScopedLockAcquisitionTimer() { + if (!start_time_.has_value()) [[likely]] { + return; + } + + lock_metrics_->RecordLockAcquisitionTime( + subtle::TimeTicksNowIgnoringOverride() - *start_time_, + LockType::kBaseLock); + } + + static ScopedLockAcquisitionTimer CreateForTest( + LockMetricsRecorder* lock_metrics); + + private: + explicit ScopedLockAcquisitionTimer(LockMetricsRecorder* lock_metrics) + : lock_metrics_(lock_metrics) { + if (!lock_metrics_->ShouldRecordLockAcquisitionTime()) [[likely]] { + return; + } + + start_time_.emplace(subtle::TimeTicksNowIgnoringOverride()); + } + + // `ElapsedTimer` is not used here since it is mocked in tests and the mock + // might acquire a base::Lock thereby causing re-entrancy. + std::optional start_time_; + + // It is safe to hold onto the pointer to the lock metrics recorder since + // it points to a global variable. + const raw_ptr lock_metrics_; + }; + + private: + constexpr static double kSamplingRatio = 0.001; + std::array, + static_cast(LockType::kMax) + 1> + buffer_; + MetricsSubSampler metrics_sub_sampler_; + bool iterating_in_progress_ = false; + // Thread local variables on Android are extremely slow. So on the hot-path, + // use atomics to record the target thread-ref and read it back from multiple + // threads, adding the constraints that samples can be recorded only from the + // same thread for the lifetime of the process. + std::atomic target_thread_; +}; + +} // namespace base + +#endif // BASE_SYNCHRONIZATION_LOCK_METRICS_RECORDER_H_ diff --git a/naiveproxy/src/base/synchronization/waitable_event.cc b/naiveproxy/src/base/synchronization/waitable_event.cc index 7cfa11ea54..f5b89f0a53 100644 --- a/naiveproxy/src/base/synchronization/waitable_event.cc +++ b/naiveproxy/src/base/synchronization/waitable_event.cc @@ -70,13 +70,13 @@ bool WaitableEvent::TimedWait(TimeDelta wait_delta) { return result; } -size_t WaitableEvent::WaitMany(WaitableEvent** events, size_t count) { - DCHECK(count) << "Cannot wait on no events"; +size_t WaitableEvent::WaitMany(base::span events) { + DCHECK(!events.empty()) << "Cannot wait on no events"; internal::ScopedBlockingCallWithBaseSyncPrimitives scoped_blocking_call( FROM_HERE, BlockingType::MAY_BLOCK); - const size_t signaled_id = WaitManyImpl(events, count); - WaitableEvent* const signaled_event = UNSAFE_TODO(events[signaled_id]); + const size_t signaled_id = WaitManyImpl(events); + WaitableEvent* const signaled_event = events[signaled_id]; if (!signaled_event->only_used_while_idle_) { TRACE_EVENT_INSTANT("wakeup.flow,toplevel.flow", "WaitableEvent::WaitMany Complete", diff --git a/naiveproxy/src/base/synchronization/waitable_event.h b/naiveproxy/src/base/synchronization/waitable_event.h index 8f91192d77..81880a2508 100644 --- a/naiveproxy/src/base/synchronization/waitable_event.h +++ b/naiveproxy/src/base/synchronization/waitable_event.h @@ -10,6 +10,7 @@ #include "base/base_export.h" #include "base/compiler_specific.h" #include "base/containers/circular_deque.h" +#include "base/containers/span.h" #include "base/memory/raw_ptr.h" #include "build/blink_buildflags.h" #include "build/build_config.h" @@ -122,10 +123,10 @@ class BASE_EXPORT WaitableEvent { void declare_only_used_while_idle() { only_used_while_idle_ = true; } // Wait, synchronously, on multiple events. - // waitables: an array of WaitableEvent pointers - // count: the number of elements in @waitables + // waitables: a span of WaitableEvent pointers // - // returns: the index of a WaitableEvent which has been signaled. + // returns: the index of a WaitableEvent within the span which has been + // signaled. // // You MUST NOT delete any of the WaitableEvent objects while this wait is // happening, however WaitMany's return "happens after" the |Signal| call @@ -133,8 +134,7 @@ class BASE_EXPORT WaitableEvent { // // If more than one WaitableEvent is signaled to unblock WaitMany, the lowest // index among them is returned. - NOT_TAIL_CALLED static size_t WaitMany(WaitableEvent** waitables, - size_t count); + NOT_TAIL_CALLED static size_t WaitMany(base::span waitables); // For asynchronous waiting, see WaitableEventWatcher @@ -175,7 +175,7 @@ class BASE_EXPORT WaitableEvent { // the actual signaling and waiting). void SignalImpl(); bool TimedWaitImpl(TimeDelta wait_delta); - static size_t WaitManyImpl(WaitableEvent** waitables, size_t count); + static size_t WaitManyImpl(base::span waitables); #if BUILDFLAG(IS_WIN) win::ScopedHandle handle_; @@ -249,15 +249,14 @@ class BASE_EXPORT WaitableEvent { ~WaitableEventKernel(); }; - typedef std::pair WaiterAndIndex; + using WaiterAndIndex = std::pair; // When dealing with arrays of WaitableEvent*, we want to sort by the address // of the WaitableEvent in order to have a globally consistent locking order. // In that case we keep them, in sorted order, in an array of pairs where the // second element is the index of the WaitableEvent in the original, // unsorted, array. - static size_t EnqueueMany(WaiterAndIndex* waitables, - size_t count, + static size_t EnqueueMany(base::span waitables, Waiter* waiter); bool SignalAll(); diff --git a/naiveproxy/src/base/synchronization/waitable_event_apple.cc b/naiveproxy/src/base/synchronization/waitable_event_apple.cc index 5cad36ef3a..ebf50bdf7c 100644 --- a/naiveproxy/src/base/synchronization/waitable_event_apple.cc +++ b/naiveproxy/src/base/synchronization/waitable_event_apple.cc @@ -127,8 +127,7 @@ bool WaitableEvent::TimedWaitImpl(TimeDelta wait_delta) { } // static -size_t WaitableEvent::WaitManyImpl(WaitableEvent** raw_waitables, - size_t count) { +size_t WaitableEvent::WaitManyImpl(base::span raw_waitables) { // On macOS 10.11+, using Mach port sets may cause system instability, per // https://crbug.com/756102. On macOS 10.12+, a kqueue can be used // instead to work around that. @@ -142,18 +141,18 @@ size_t WaitableEvent::WaitManyImpl(WaitableEvent** raw_waitables, const WaitManyPrimitive kPrimitive = KQUEUE; #endif if (kPrimitive == KQUEUE) { - std::vector events(count); - for (size_t i = 0; i < count; ++i) { + std::vector events(raw_waitables.size()); + for (size_t i = 0; i < raw_waitables.size(); ++i) { EV_SET64(&events[i], raw_waitables[i]->receive_right_->Name(), EVFILT_MACHPORT, EV_ADD, 0, 0, i, 0, 0); } - std::vector out_events(count); + std::vector out_events(raw_waitables.size()); ScopedFD wait_many(kqueue()); PCHECK(wait_many.is_valid()) << "kqueue"; - const int count_int = checked_cast(count); + const int count_int = checked_cast(raw_waitables.size()); int rv = HANDLE_EINTR(kevent64(wait_many.get(), events.data(), count_int, out_events.data(), count_int, /*flags=*/0, /*timeout=*/nullptr)); @@ -188,7 +187,7 @@ size_t WaitableEvent::WaitManyImpl(WaitableEvent** raw_waitables, port_set.reset(name); } - for (size_t i = 0; i < count; ++i) { + for (size_t i = 0; i < raw_waitables.size(); ++i) { kr = mach_port_insert_member(mach_task_self(), raw_waitables[i]->receive_right_->Name(), port_set.get()); @@ -206,7 +205,7 @@ size_t WaitableEvent::WaitManyImpl(WaitableEvent** raw_waitables, /*timeout=*/0, /*notify=*/MACH_PORT_NULL); MACH_CHECK(kr == MACH_RCV_TOO_LARGE, kr) << "mach_msg"; - for (size_t i = 0; i < count; ++i) { + for (size_t i = 0; i < raw_waitables.size(); ++i) { WaitableEvent* event = raw_waitables[i]; if (msg.header.msgh_local_port == event->receive_right_->Name()) { if (event->policy_ == ResetPolicy::AUTOMATIC) { diff --git a/naiveproxy/src/base/synchronization/waitable_event_posix.cc b/naiveproxy/src/base/synchronization/waitable_event_posix.cc index ab14e0055a..180e5924fa 100644 --- a/naiveproxy/src/base/synchronization/waitable_event_posix.cc +++ b/naiveproxy/src/base/synchronization/waitable_event_posix.cc @@ -12,7 +12,7 @@ #include #include "base/check_op.h" -#include "base/compiler_specific.h" +#include "base/containers/adapters.h" #include "base/memory/stack_allocated.h" #include "base/synchronization/condition_variable.h" #include "base/synchronization/lock.h" @@ -225,19 +225,17 @@ cmp_fst_addr(const std::pair& a, // static // NO_THREAD_SAFETY_ANALYSIS: Complex control flow. -size_t WaitableEvent::WaitManyImpl(WaitableEvent** raw_waitables, - size_t count) NO_THREAD_SAFETY_ANALYSIS { +size_t WaitableEvent::WaitManyImpl(base::span raw_waitables) + NO_THREAD_SAFETY_ANALYSIS { // We need to acquire the locks in a globally consistent order. Thus we sort // the array of waitables by address. We actually sort a pairs so that we can // map back to the original index values later. std::vector> waitables; - waitables.reserve(count); - for (size_t i = 0; i < count; ++i) { - waitables.emplace_back(UNSAFE_TODO(raw_waitables[i]), i); + waitables.reserve(raw_waitables.size()); + for (size_t i = 0; i < raw_waitables.size(); ++i) { + waitables.emplace_back(raw_waitables[i], i); } - DCHECK_EQ(count, waitables.size()); - std::ranges::sort(waitables, cmp_fst_addr); // The set of waitables must be distinct. Since we have just sorted by @@ -249,8 +247,8 @@ size_t WaitableEvent::WaitManyImpl(WaitableEvent** raw_waitables, SyncWaiter sw; - const size_t r = EnqueueMany(&waitables[0], count, &sw); - if (r < count) { + const size_t r = EnqueueMany(waitables, &sw); + if (r < waitables.size()) { // One of the events is already signaled. The SyncWaiter has not been // enqueued anywhere. return waitables[r].second; @@ -260,8 +258,8 @@ size_t WaitableEvent::WaitManyImpl(WaitableEvent** raw_waitables, // enqueued our waiter in them all. sw.lock()->Acquire(); // Release the WaitableEvent locks in the reverse order - for (size_t i = 0; i < count; ++i) { - waitables[count - (1 + i)].first->kernel_->lock_.Release(); + for (size_t i = 0; i < waitables.size(); ++i) { + waitables[waitables.size() - (1 + i)].first->kernel_->lock_.Release(); } for (;;) { @@ -280,20 +278,20 @@ size_t WaitableEvent::WaitManyImpl(WaitableEvent** raw_waitables, // Take the locks of each WaitableEvent in turn (except the signaled one) and // remove our SyncWaiter from the wait-list - for (size_t i = 0; i < count; ++i) { - if (UNSAFE_TODO(raw_waitables[i]) != signaled_event) { - UNSAFE_TODO(raw_waitables[i])->kernel_->lock_.Acquire(); + for (size_t i = 0; i < waitables.size(); ++i) { + if (raw_waitables[i] != signaled_event) { + raw_waitables[i]->kernel_->lock_.Acquire(); // There's no possible ABA issue with the address of the SyncWaiter here // because it lives on the stack. Thus the tag value is just the pointer // value again. - UNSAFE_TODO(raw_waitables[i])->kernel_->Dequeue(&sw, &sw); - UNSAFE_TODO(raw_waitables[i])->kernel_->lock_.Release(); + raw_waitables[i]->kernel_->Dequeue(&sw, &sw); + raw_waitables[i]->kernel_->lock_.Release(); } else { // By taking this lock here we ensure that |Signal| has completed by the // time we return, because |Signal| holds this lock. This matches the // behaviour of |Wait| and |TimedWait|. - UNSAFE_TODO(raw_waitables[i])->kernel_->lock_.Acquire(); - UNSAFE_TODO(raw_waitables[i])->kernel_->lock_.Release(); + raw_waitables[i]->kernel_->lock_.Acquire(); + raw_waitables[i]->kernel_->lock_.Release(); signaled_index = i; } } @@ -313,35 +311,33 @@ size_t WaitableEvent::WaitManyImpl(WaitableEvent** raw_waitables, // ----------------------------------------------------------------------------- // static // NO_THREAD_SAFETY_ANALYSIS: Complex control flow. -size_t WaitableEvent::EnqueueMany(std::pair* waitables, - size_t count, +size_t WaitableEvent::EnqueueMany(base::span waitables, Waiter* waiter) NO_THREAD_SAFETY_ANALYSIS { - size_t winner = count; - size_t winner_index = count; - for (size_t i = 0; i < count; ++i) { - auto& kernel = UNSAFE_TODO(waitables[i]).first->kernel_; + size_t winner = waitables.size(); + size_t winner_index = waitables.size(); + for (size_t i = 0; i < waitables.size(); ++i) { + auto& kernel = waitables[i].first->kernel_; kernel->lock_.Acquire(); - if (kernel->signaled_ && UNSAFE_TODO(waitables[i]).second < winner) { - winner = UNSAFE_TODO(waitables[i]).second; + if (kernel->signaled_ && waitables[i].second < winner) { + winner = waitables[i].second; winner_index = i; } } // No events signaled. All locks acquired. Enqueue the Waiter on all of them // and return. - if (winner == count) { - for (size_t i = 0; i < count; ++i) { - UNSAFE_TODO(waitables[i]).first->Enqueue(waiter); + if (winner == waitables.size()) { + for (auto& w : waitables) { + w.first->Enqueue(waiter); } - return count; + return waitables.size(); } // Unlock in reverse order and possibly clear the chosen winner's signal // before returning its index. - for (auto* w = UNSAFE_TODO(waitables + count - 1); w >= waitables; - UNSAFE_TODO(--w)) { - auto& kernel = w->first->kernel_; - if (w->second == winner) { + for (auto& w : base::Reversed(waitables)) { + auto& kernel = w.first->kernel_; + if (w.second == winner) { if (!kernel->manual_reset_) { kernel->signaled_ = false; } diff --git a/naiveproxy/src/base/synchronization/waitable_event_watcher_posix.cc b/naiveproxy/src/base/synchronization/waitable_event_watcher_posix.cc index 45d7fea74b..5aa3a372a3 100644 --- a/naiveproxy/src/base/synchronization/waitable_event_watcher_posix.cc +++ b/naiveproxy/src/base/synchronization/waitable_event_watcher_posix.cc @@ -219,7 +219,7 @@ void WaitableEventWatcher::StopWatching() { // list. We've removed it, thus we can delete it and the task (which cannot // have been enqueued with the MessageLoop because the waiter was never // signaled) - delete waiter_; + waiter_.ClearAndDelete(); cancel_flag_ = nullptr; return; } diff --git a/naiveproxy/src/base/synchronization/waitable_event_win.cc b/naiveproxy/src/base/synchronization/waitable_event_win.cc index 49b49e0978..98d92911a1 100644 --- a/naiveproxy/src/base/synchronization/waitable_event_win.cc +++ b/naiveproxy/src/base/synchronization/waitable_event_win.cc @@ -131,21 +131,21 @@ bool WaitableEvent::TimedWaitImpl(TimeDelta wait_delta) { } // static -size_t WaitableEvent::WaitManyImpl(WaitableEvent** events, size_t count) { +size_t WaitableEvent::WaitManyImpl(base::span events) { HANDLE handles[MAXIMUM_WAIT_OBJECTS]; - CHECK_LE(count, static_cast(MAXIMUM_WAIT_OBJECTS)) + CHECK_LE(events.size(), static_cast(MAXIMUM_WAIT_OBJECTS)) << "Can only wait on " << MAXIMUM_WAIT_OBJECTS << " with WaitMany"; - for (size_t i = 0; i < count; ++i) { + for (size_t i = 0; i < events.size(); ++i) { handles[i] = events[i]->handle(); } // The cast is safe because count is small - see the CHECK above. DWORD result = - WaitForMultipleObjects(static_cast(count), handles, + WaitForMultipleObjects(static_cast(events.size()), handles, FALSE, // don't wait for all the objects INFINITE); // no timeout - if (result >= WAIT_OBJECT_0 + count) { + if (result >= WAIT_OBJECT_0 + events.size()) { DPLOG(FATAL) << "WaitForMultipleObjects failed"; return 0; } diff --git a/naiveproxy/src/base/system/sys_info.cc b/naiveproxy/src/base/system/sys_info.cc index 000604bcb8..b95916c283 100644 --- a/naiveproxy/src/base/system/sys_info.cc +++ b/naiveproxy/src/base/system/sys_info.cc @@ -18,10 +18,13 @@ #include "base/task/thread_pool.h" #include "base/time/time.h" #include "build/build_config.h" +#if BUILDFLAG(IS_ANDROID) +#include "base/android/sys_utils.h" +#endif // BUILDFLAG(IS_ANDROID) namespace base { namespace { -std::optional g_amount_of_physical_memory_mb_for_testing; +std::optional g_amount_of_physical_memory_for_testing; } // namespace // static @@ -31,35 +34,33 @@ int SysInfo::NumberOfEfficientProcessors() { } // static -uint64_t SysInfo::AmountOfPhysicalMemory() { - constexpr uint64_t kMB = 1024 * 1024; - +ByteCount SysInfo::AmountOfPhysicalMemory() { if (base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableLowEndDeviceMode)) { // Keep using 512MB as the simulated RAM amount for when users or tests have // manually enabled low-end device mode. Note this value is different from // the threshold used for low end devices. - constexpr uint64_t kSimulatedMemoryForEnableLowEndDeviceMode = 512 * kMB; + constexpr ByteCount kSimulatedMemoryForEnableLowEndDeviceMode = MiB(512); return std::min(kSimulatedMemoryForEnableLowEndDeviceMode, AmountOfPhysicalMemoryImpl()); } - if (g_amount_of_physical_memory_mb_for_testing) { - return g_amount_of_physical_memory_mb_for_testing.value() * kMB; + if (g_amount_of_physical_memory_for_testing) { + return *g_amount_of_physical_memory_for_testing; } return AmountOfPhysicalMemoryImpl(); } // static -uint64_t SysInfo::AmountOfAvailablePhysicalMemory() { +ByteCount SysInfo::AmountOfAvailablePhysicalMemory() { if (base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableLowEndDeviceMode)) { // Estimate the available memory by subtracting our memory used estimate // from the fake |kLowMemoryDeviceThresholdMB| limit. - uint64_t memory_used = + ByteCount memory_used = AmountOfPhysicalMemoryImpl() - AmountOfAvailablePhysicalMemoryImpl(); - uint64_t memory_limit = features::kLowMemoryDeviceThresholdMB.Get() * 1024 * 1024; + ByteCount memory_limit = MiB(features::kLowMemoryDeviceThresholdMB.Get()); // std::min ensures no underflow, as |memory_used| can be > |memory_limit|. return memory_limit - std::min(memory_used, memory_limit); } @@ -89,32 +90,32 @@ enum class BucketizedSize { }; BucketizedSize GetSystemRamBucketizedSize() { - int physical_memory = base::SysInfo::AmountOfPhysicalMemoryMB(); + ByteCount physical_memory = SysInfo::AmountOfPhysicalMemory(); // Because of Android carveouts, AmountOfPhysicalMemory() returns smaller // than the actual memory size, So we will use a small lowerbound than "X"GB // to discriminate real "X"GB devices from lower memory ones. // Addendum: This logic should also work for ChromeOS. - constexpr int kUpperBound2GB = 2 * 1024; // inclusive + constexpr ByteCount kUpperBound2GB = GiB(2); // inclusive if (physical_memory <= kUpperBound2GB) { return BucketizedSize::k2GbOrLess; } - constexpr int kLowerBound3GB = kUpperBound2GB; // exclusive - constexpr int kUpperBound3GB = 3.2 * 1024; // inclusive + constexpr ByteCount kLowerBound3GB = kUpperBound2GB; // exclusive + constexpr ByteCount kUpperBound3GB = GiB(3.2); // inclusive if (kLowerBound3GB < physical_memory && physical_memory <= kUpperBound3GB) { return BucketizedSize::k3Gb; } - constexpr int kLowerBound4GB = kUpperBound3GB; // exclusive - constexpr int kUpperBound4GB = 4 * 1024; // inclusive + constexpr ByteCount kLowerBound4GB = kUpperBound3GB; // exclusive + constexpr ByteCount kUpperBound4GB = GiB(4); // inclusive if (kLowerBound4GB < physical_memory && physical_memory <= kUpperBound4GB) { return BucketizedSize::k4Gb; } - constexpr int kLowerBound6GB = kUpperBound4GB; // exclusive - constexpr int kUpperBound6GB = 6.5 * 1024 - 1; // inclusive + constexpr ByteCount kLowerBound6GB = kUpperBound4GB; // exclusive + constexpr ByteCount kUpperBound6GB = GiB(6.5) - MiB(1); // inclusive if (kLowerBound6GB < physical_memory && physical_memory <= kUpperBound6GB) { return BucketizedSize::k6Gb; } @@ -198,9 +199,17 @@ bool DetectLowEndDevice() { return false; } - int ram_size_mb = SysInfo::AmountOfPhysicalMemoryMB(); - return ram_size_mb > 0 && - static_cast(ram_size_mb) <= features::kLowMemoryDeviceThresholdMB.Get(); + ByteCount ram_size = SysInfo::AmountOfPhysicalMemory(); +#if BUILDFLAG(IS_ANDROID) + if (FeatureList::GetInstance() == nullptr) { + int threshold_mb = base::android::GetCachedLowMemoryDeviceThresholdMb(); + if (threshold_mb > 0) { + return ram_size > ByteCount(0) && ram_size <= MiB(threshold_mb); + } + } +#endif // BUILDFLAG(IS_ANDROID) + return ram_size > ByteCount(0) && + ram_size <= MiB(features::kLowMemoryDeviceThresholdMB.Get()); // LINT.ThenChange(//base/android/java/src/org/chromium/base/SysUtils.java) } @@ -262,16 +271,16 @@ std::string SysInfo::ProcessCPUArchitecture() { } // static -std::optional SysInfo::SetAmountOfPhysicalMemoryMbForTesting( - const uint64_t amount_of_memory_mb) { - std::optional current = g_amount_of_physical_memory_mb_for_testing; - g_amount_of_physical_memory_mb_for_testing.emplace(amount_of_memory_mb); +std::optional SysInfo::SetAmountOfPhysicalMemoryForTesting( + ByteCount amount_of_memory) { + std::optional current = g_amount_of_physical_memory_for_testing; + g_amount_of_physical_memory_for_testing.emplace(amount_of_memory); return current; } // static -void SysInfo::ClearAmountOfPhysicalMemoryMbForTesting() { - g_amount_of_physical_memory_mb_for_testing.reset(); +void SysInfo::ClearAmountOfPhysicalMemoryForTesting() { + g_amount_of_physical_memory_for_testing.reset(); } } // namespace base diff --git a/naiveproxy/src/base/system/sys_info.h b/naiveproxy/src/base/system/sys_info.h index 3470b510d3..20b12d91c6 100644 --- a/naiveproxy/src/base/system/sys_info.h +++ b/naiveproxy/src/base/system/sys_info.h @@ -16,6 +16,7 @@ #include #include "base/base_export.h" +#include "base/byte_count.h" #include "base/functional/callback_forward.h" #include "base/gtest_prod_util.h" #include "base/metrics/field_trial_params.h" @@ -50,7 +51,7 @@ class ScopedAmountOfPhysicalMemoryOverride; } class FilePath; -struct SystemMemoryInfoKB; +struct SystemMemoryInfo; class BASE_EXPORT SysInfo { public: @@ -74,38 +75,29 @@ class BASE_EXPORT SysInfo { // Return the number of bytes of physical memory on the current machine. // If low-end device mode is manually enabled via command line flag, this // will return the lesser of the actual physical memory, or 512MB. - static uint64_t AmountOfPhysicalMemory(); + static ByteCount AmountOfPhysicalMemory(); // Return the number of bytes of current available physical memory on the // machine. // (The amount of memory that can be allocated without any significant // impact on the system. It can lead to freeing inactive file-backed // and/or speculative file-backed memory). - static uint64_t AmountOfAvailablePhysicalMemory(); + static ByteCount AmountOfAvailablePhysicalMemory(); // Return the number of bytes of virtual memory of this process. A return // value of zero means that there is no limit on the available virtual // memory. - static uint64_t AmountOfVirtualMemory(); - - // Return the number of megabytes of physical memory on the current machine. - static int AmountOfPhysicalMemoryMB() { - return static_cast(AmountOfPhysicalMemory() / 1024 / 1024); - } - - // Return the number of megabytes of available virtual memory, or zero if it - // is unlimited. - static int AmountOfVirtualMemoryMB() { - return static_cast(AmountOfVirtualMemory() / 1024 / 1024); - } + static ByteCount AmountOfVirtualMemory(); // Return the available disk space in bytes on the volume containing |path|, - // or -1 on failure. - static int64_t AmountOfFreeDiskSpace(const FilePath& path); + // or nullopt on failure. + // TODO(crbug.com/429140103): Convert the return type to ByteCount. + static std::optional AmountOfFreeDiskSpace(const FilePath& path); - // Return the total disk space in bytes on the volume containing |path|, or -1 - // on failure. - static int64_t AmountOfTotalDiskSpace(const FilePath& path); + // Return the total disk space in bytes on the volume containing |path|, or + // nullopt on failure. + // TODO(crbug.com/429140103): Convert the return type to ByteCount. + static std::optional AmountOfTotalDiskSpace(const FilePath& path); #if BUILDFLAG(IS_FUCHSIA) // Sets the total amount of disk space to report under the specified |path|. @@ -236,7 +228,9 @@ class BASE_EXPORT SysInfo { static std::string CPUModelName(); // Return the smallest amount of memory (in bytes) which the VM system will - // allocate. + // allocate. On some platforms, such as Windows, this may not match the page + // size (e.g. x86/x86-64 Windows use a 4KB page size but a 64KB allocation + // granularity). static size_t VMAllocationGranularity(); #if BUILDFLAG(IS_CHROMEOS) @@ -366,22 +360,22 @@ class BASE_EXPORT SysInfo { FRIEND_TEST_ALL_PREFIXES(debug::SystemMetricsTest, ParseMeminfo); static int NumberOfEfficientProcessorsImpl(); - static uint64_t AmountOfPhysicalMemoryImpl(); - static uint64_t AmountOfAvailablePhysicalMemoryImpl(); + static ByteCount AmountOfPhysicalMemoryImpl(); + static ByteCount AmountOfAvailablePhysicalMemoryImpl(); static bool IsLowEndDeviceImpl(); static HardwareInfo GetHardwareInfoSync(); #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \ BUILDFLAG(IS_AIX) - static uint64_t AmountOfAvailablePhysicalMemory( - const SystemMemoryInfoKB& meminfo); + static ByteCount AmountOfAvailablePhysicalMemory( + const SystemMemoryInfo& meminfo); #endif - // Sets the amount of physical memory in MB for testing, thus allowing tests - // to run irrespective of the host machine's configuration. - static std::optional SetAmountOfPhysicalMemoryMbForTesting( - uint64_t amount_of_memory_mb); - static void ClearAmountOfPhysicalMemoryMbForTesting(); + // Sets the amount of physical memory for testing, thus allowing tests to run + // irrespective of the host machine's configuration. + static std::optional SetAmountOfPhysicalMemoryForTesting( + ByteCount amount_of_memory); + static void ClearAmountOfPhysicalMemoryForTesting(); }; #if BUILDFLAG(IS_POSIX) diff --git a/naiveproxy/src/base/system/sys_info_apple.mm b/naiveproxy/src/base/system/sys_info_apple.mm index 02670cbc82..1f020d7a3e 100644 --- a/naiveproxy/src/base/system/sys_info_apple.mm +++ b/naiveproxy/src/base/system/sys_info_apple.mm @@ -50,12 +50,12 @@ int SysInfo::NumberOfEfficientProcessorsImpl() { } // static -uint64_t SysInfo::AmountOfPhysicalMemoryImpl() { +ByteCount SysInfo::AmountOfPhysicalMemoryImpl() { uint64_t physical_memory; size_t size = sizeof(physical_memory); int rv = sysctlbyname("hw.memsize", &physical_memory, &size, nullptr, 0); PCHECK(rv == 0) << "sysctlbyname(\"hw.memsize\")"; - return physical_memory; + return ByteCount::FromUnsigned(physical_memory); } } // namespace base diff --git a/naiveproxy/src/base/system/sys_info_freebsd.cc b/naiveproxy/src/base/system/sys_info_freebsd.cc index 3751893377..690dfe263e 100644 --- a/naiveproxy/src/base/system/sys_info_freebsd.cc +++ b/naiveproxy/src/base/system/sys_info_freebsd.cc @@ -12,7 +12,7 @@ namespace base { -int64_t SysInfo::AmountOfPhysicalMemoryImpl() { +ByteCount SysInfo::AmountOfPhysicalMemoryImpl() { int pages, page_size; size_t size = sizeof(pages); sysctlbyname("vm.stats.vm.v_page_count", &pages, &size, NULL, 0); @@ -20,7 +20,7 @@ int64_t SysInfo::AmountOfPhysicalMemoryImpl() { if (pages == -1 || page_size == -1) { NOTREACHED(); } - return static_cast(pages) * page_size; + return ByteCount(page_size) * pages; } // static diff --git a/naiveproxy/src/base/system/sys_info_fuchsia.cc b/naiveproxy/src/base/system/sys_info_fuchsia.cc index 09c249dee4..0613155250 100644 --- a/naiveproxy/src/base/system/sys_info_fuchsia.cc +++ b/naiveproxy/src/base/system/sys_info_fuchsia.cc @@ -94,15 +94,15 @@ int64_t GetAmountOfTotalDiskSpaceAndVolumePath(const FilePath& path, } // namespace // static -uint64_t SysInfo::AmountOfPhysicalMemoryImpl() { - return zx_system_get_physmem(); +ByteCount SysInfo::AmountOfPhysicalMemoryImpl() { + return ByteCount::FromUnsigned(zx_system_get_physmem()); } // static -uint64_t SysInfo::AmountOfAvailablePhysicalMemoryImpl() { +ByteCount SysInfo::AmountOfAvailablePhysicalMemoryImpl() { // TODO(crbug.com/42050649): Implement this when Fuchsia supports it. NOTIMPLEMENTED_LOG_ONCE(); - return 0; + return ByteCount(0); } // static @@ -111,10 +111,10 @@ int SysInfo::NumberOfProcessors() { } // static -uint64_t SysInfo::AmountOfVirtualMemory() { +ByteCount SysInfo::AmountOfVirtualMemory() { // Fuchsia does not provide this type of information. // Return zero to indicate that there is unlimited available virtual memory. - return 0; + return ByteCount(0); } // static @@ -123,7 +123,7 @@ std::string SysInfo::OperatingSystemName() { } // static -int64_t SysInfo::AmountOfFreeDiskSpace(const FilePath& path) { +std::optional SysInfo::AmountOfFreeDiskSpace(const FilePath& path) { ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); // First check whether there is a soft-quota that applies to |path|. @@ -139,18 +139,19 @@ int64_t SysInfo::AmountOfFreeDiskSpace(const FilePath& path) { // Report the actual amount of free space in |path|'s filesystem. int64_t available; if (GetDiskSpaceInfo(path, &available, nullptr)) { + CHECK(available >= 0, base::NotFatalUntil::M150); return available; } - return -1; + return std::nullopt; } // static -int64_t SysInfo::AmountOfTotalDiskSpace(const FilePath& path) { +std::optional SysInfo::AmountOfTotalDiskSpace(const FilePath& path) { ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); if (path.empty()) { - return -1; + return std::nullopt; } // Return the soft-quota that applies to |path|, if one is configured. @@ -161,10 +162,11 @@ int64_t SysInfo::AmountOfTotalDiskSpace(const FilePath& path) { // Report the actual space in |path|'s filesystem. if (GetDiskSpaceInfo(path, nullptr, &total_space)) { + CHECK(total_space >= 0, base::NotFatalUntil::M150); return total_space; } - return -1; + return std::nullopt; } // static diff --git a/naiveproxy/src/base/system/sys_info_ios.mm b/naiveproxy/src/base/system/sys_info_ios.mm index 24b48fbf56..22b3c91b18 100644 --- a/naiveproxy/src/base/system/sys_info_ios.mm +++ b/naiveproxy/src/base/system/sys_info_ios.mm @@ -106,14 +106,14 @@ void SysInfo::OverrideHardwareModelName(std::string name) { } // static -uint64_t SysInfo::AmountOfAvailablePhysicalMemoryImpl() { - SystemMemoryInfoKB info; +ByteCount SysInfo::AmountOfAvailablePhysicalMemoryImpl() { + SystemMemoryInfo info; if (!GetSystemMemoryInfo(&info)) { - return 0; + return ByteCount(0); } // We should add inactive file-backed memory also but there is no such // information from iOS unfortunately. - return checked_cast(info.free + info.speculative) * 1024; + return info.free + info.speculative; } // static diff --git a/naiveproxy/src/base/system/sys_info_linux.cc b/naiveproxy/src/base/system/sys_info_linux.cc index de42105dc4..a1c8d0fa31 100644 --- a/naiveproxy/src/base/system/sys_info_linux.cc +++ b/naiveproxy/src/base/system/sys_info_linux.cc @@ -15,10 +15,11 @@ #include #include #include +#include +#include "base/byte_count.h" #include "base/check.h" #include "base/files/file_util.h" -#include "base/lazy_instance.h" #include "base/notreached.h" #include "base/numerics/safe_conversions.h" #include "base/process/process_metrics.h" @@ -30,52 +31,53 @@ namespace { -uint64_t AmountOfMemory(int pages_name) { +base::ByteCount AmountOfMemory(int pages_name) { long pages = sysconf(pages_name); long page_size = sysconf(_SC_PAGESIZE); if (pages < 0 || page_size < 0) { - return 0; + return base::ByteCount(0); } - return static_cast(pages) * static_cast(page_size); + return base::ByteCount(page_size) * pages; } -uint64_t AmountOfPhysicalMemory() { +base::ByteCount AmountOfPhysicalMemory() { return AmountOfMemory(_SC_PHYS_PAGES); } - -base::LazyInstance< - base::internal::LazySysInfoValue>::Leaky - g_lazy_physical_memory = LAZY_INSTANCE_INITIALIZER; +using LazyPhysicalMemory = + base::internal::LazySysInfoValue; } // namespace namespace base { // static -uint64_t SysInfo::AmountOfPhysicalMemoryImpl() { - return g_lazy_physical_memory.Get().value(); +ByteCount SysInfo::AmountOfPhysicalMemoryImpl() { + static_assert(std::is_trivially_destructible::value); + static LazyPhysicalMemory physical_memory; + return physical_memory.value(); } // static -uint64_t SysInfo::AmountOfAvailablePhysicalMemoryImpl() { - SystemMemoryInfoKB info; +ByteCount SysInfo::AmountOfAvailablePhysicalMemoryImpl() { + SystemMemoryInfo info; if (!GetSystemMemoryInfo(&info)) { - return 0; + return ByteCount(0); } return AmountOfAvailablePhysicalMemory(info); } // static -uint64_t SysInfo::AmountOfAvailablePhysicalMemory( - const SystemMemoryInfoKB& info) { +ByteCount SysInfo::AmountOfAvailablePhysicalMemory( + const SystemMemoryInfo& info) { // See details here: // https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773 // The fallback logic (when there is no MemAvailable) would be more precise // if we had info about zones watermarks (/proc/zoneinfo). - int res_kb = info.available != 0 - ? std::max(info.available - info.active_file, 0) - : info.free + info.reclaimable + info.inactive_file; - return checked_cast(res_kb) * 1024; + ByteCount res = + !info.available.is_zero() + ? std::max(info.available - info.active_file, ByteCount(0)) + : info.free + info.reclaimable + info.inactive_file; + return res; } // static diff --git a/naiveproxy/src/base/system/sys_info_mac.mm b/naiveproxy/src/base/system/sys_info_mac.mm index a00b8d7c37..cfa959eed2 100644 --- a/naiveproxy/src/base/system/sys_info_mac.mm +++ b/naiveproxy/src/base/system/sys_info_mac.mm @@ -62,7 +62,6 @@ std::optional NumberOfProcessorsWhenCpuSecurityMitigationEnabled() { } // namespace internal BASE_FEATURE(kNumberOfCoresWithCpuSecurityMitigation, - "NumberOfCoresWithCpuSecurityMitigation", FEATURE_ENABLED_BY_DEFAULT); // static @@ -100,14 +99,14 @@ std::string SysInfo::OperatingSystemArchitecture() { } // static -uint64_t SysInfo::AmountOfAvailablePhysicalMemoryImpl() { - SystemMemoryInfoKB info; +ByteCount SysInfo::AmountOfAvailablePhysicalMemoryImpl() { + SystemMemoryInfo info; if (!GetSystemMemoryInfo(&info)) { - return 0; + return ByteCount(0); } // We should add inactive file-backed memory also but there is no such // information from Mac OS unfortunately. - return checked_cast(info.free + info.speculative) * 1024; + return info.free + info.speculative; } // static diff --git a/naiveproxy/src/base/system/sys_info_openbsd.cc b/naiveproxy/src/base/system/sys_info_openbsd.cc index 7cd23428e5..80a1678a51 100644 --- a/naiveproxy/src/base/system/sys_info_openbsd.cc +++ b/naiveproxy/src/base/system/sys_info_openbsd.cc @@ -13,21 +13,21 @@ #include "base/notreached.h" #include "base/posix/sysctl.h" +namespace base { + namespace { -uint64_t AmountOfMemory(int pages_name) { +ByteCount AmountOfMemory(int pages_name) { long pages = sysconf(pages_name); long page_size = sysconf(_SC_PAGESIZE); if (pages < 0 || page_size < 0) { - return 0; + return ByteCount(0); } - return static_cast(pages) * static_cast(page_size); + return ByteCount(page_size) * pages; } } // namespace -namespace base { - // static int SysInfo::NumberOfProcessors() { int mib[] = {CTL_HW, HW_NCPU}; @@ -40,12 +40,12 @@ int SysInfo::NumberOfProcessors() { } // static -uint64_t SysInfo::AmountOfPhysicalMemoryImpl() { +ByteCount SysInfo::AmountOfPhysicalMemoryImpl() { return AmountOfMemory(_SC_PHYS_PAGES); } // static -uint64_t SysInfo::AmountOfAvailablePhysicalMemoryImpl() { +ByteCount SysInfo::AmountOfAvailablePhysicalMemoryImpl() { // We should add inactive file-backed memory also but there is no such // information from OpenBSD unfortunately. return AmountOfMemory(_SC_AVPHYS_PAGES); diff --git a/naiveproxy/src/base/system/sys_info_posix.cc b/naiveproxy/src/base/system/sys_info_posix.cc index 901f2eaba8..f4c7896885 100644 --- a/naiveproxy/src/base/system/sys_info_posix.cc +++ b/naiveproxy/src/base/system/sys_info_posix.cc @@ -17,14 +17,14 @@ #include #include #include -#include #include #include +#include #include "base/check.h" #include "base/files/file_util.h" -#include "base/lazy_instance.h" +#include "base/memory/page_size.h" #include "base/notimplemented.h" #include "base/notreached.h" #include "base/numerics/safe_conversions.h" @@ -54,18 +54,17 @@ namespace { -uint64_t AmountOfVirtualMemory() { +base::ByteCount AmountOfVirtualMemory() { struct rlimit limit; int result = getrlimit(RLIMIT_DATA, &limit); if (result != 0) { NOTREACHED(); } - return limit.rlim_cur == RLIM_INFINITY ? 0 : limit.rlim_cur; + return base::ByteCount::FromUnsigned( + limit.rlim_cur == RLIM_INFINITY ? 0 : limit.rlim_cur); } - -base::LazyInstance< - base::internal::LazySysInfoValue>::Leaky - g_lazy_virtual_memory = LAZY_INSTANCE_INITIALIZER; +using LazyVirtualMemory = + base::internal::LazySysInfoValue; #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) bool IsStatsZeroIfUnlimited(const base::FilePath& path) { @@ -203,31 +202,35 @@ int SysInfo::NumberOfProcessors() { #endif // !BUILDFLAG(IS_OPENBSD) // static -uint64_t SysInfo::AmountOfVirtualMemory() { - return g_lazy_virtual_memory.Get().value(); +ByteCount SysInfo::AmountOfVirtualMemory() { + static_assert(std::is_trivially_destructible::value); + static LazyVirtualMemory virtual_memory; + return virtual_memory.value(); } // static -int64_t SysInfo::AmountOfFreeDiskSpace(const FilePath& path) { +std::optional SysInfo::AmountOfFreeDiskSpace(const FilePath& path) { base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); int64_t available; if (!GetDiskSpaceInfo(path, &available, nullptr)) { - return -1; + return std::nullopt; } + CHECK(available >= 0, base::NotFatalUntil::M150); return available; } // static -int64_t SysInfo::AmountOfTotalDiskSpace(const FilePath& path) { +std::optional SysInfo::AmountOfTotalDiskSpace(const FilePath& path) { base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); int64_t total; if (!GetDiskSpaceInfo(path, nullptr, &total)) { - return -1; + return std::nullopt; } + CHECK(total >= 0, base::NotFatalUntil::M150); return total; } @@ -295,7 +298,7 @@ std::string SysInfo::OperatingSystemArchitecture() { // static size_t SysInfo::VMAllocationGranularity() { - return checked_cast(getpagesize()); + return GetPageSize(); } #if !BUILDFLAG(IS_APPLE) diff --git a/naiveproxy/src/base/system/sys_info_win.cc b/naiveproxy/src/base/system/sys_info_win.cc index 9c735e5ca9..6f318ce489 100644 --- a/naiveproxy/src/base/system/sys_info_win.cc +++ b/naiveproxy/src/base/system/sys_info_win.cc @@ -28,7 +28,6 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" -#include "base/strings/utf_string_conversions.h" #include "base/threading/scoped_blocking_call.h" #include "base/win/registry.h" #include "base/win/windows_version.h" @@ -115,14 +114,14 @@ std::vector GetCoreProcessorMasks() { return processor_masks; } -uint64_t AmountOfMemory(DWORDLONG MEMORYSTATUSEX::*memory_field) { +base::ByteCount AmountOfMemory(DWORDLONG MEMORYSTATUSEX::* memory_field) { MEMORYSTATUSEX memory_info; memory_info.dwLength = sizeof(memory_info); if (!GlobalMemoryStatusEx(&memory_info)) { NOTREACHED(); } - return memory_info.*memory_field; + return base::ByteCount::FromUnsigned(memory_info.*memory_field); } bool GetDiskSpaceInfo(const base::FilePath& path, @@ -189,45 +188,47 @@ int SysInfo::NumberOfEfficientProcessorsImpl() { } // static -uint64_t SysInfo::AmountOfPhysicalMemoryImpl() { +ByteCount SysInfo::AmountOfPhysicalMemoryImpl() { return AmountOfMemory(&MEMORYSTATUSEX::ullTotalPhys); } // static -uint64_t SysInfo::AmountOfAvailablePhysicalMemoryImpl() { - SystemMemoryInfoKB info; +ByteCount SysInfo::AmountOfAvailablePhysicalMemoryImpl() { + SystemMemoryInfo info; if (!GetSystemMemoryInfo(&info)) { - return 0; + return ByteCount(0); } - return checked_cast(info.avail_phys) * 1024; + return info.avail_phys; } // static -uint64_t SysInfo::AmountOfVirtualMemory() { +ByteCount SysInfo::AmountOfVirtualMemory() { return AmountOfMemory(&MEMORYSTATUSEX::ullTotalVirtual); } // static -int64_t SysInfo::AmountOfFreeDiskSpace(const FilePath& path) { +std::optional SysInfo::AmountOfFreeDiskSpace(const FilePath& path) { base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); int64_t available; if (!GetDiskSpaceInfo(path, &available, nullptr)) { - return -1; + return std::nullopt; } + CHECK(available >= 0, base::NotFatalUntil::M150); return available; } // static -int64_t SysInfo::AmountOfTotalDiskSpace(const FilePath& path) { +std::optional SysInfo::AmountOfTotalDiskSpace(const FilePath& path) { base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); int64_t total; if (!GetDiskSpaceInfo(path, nullptr, &total)) { - return -1; + return std::nullopt; } + CHECK(total >= 0, base::NotFatalUntil::M150); return total; } @@ -239,16 +240,8 @@ std::string SysInfo::OperatingSystemName() { std::string SysInfo::OperatingSystemVersion() { win::OSInfo* os_info = win::OSInfo::GetInstance(); win::OSInfo::VersionNumber version_number = os_info->version_number(); - std::string version(StringPrintf("%d.%d.%d", version_number.major, - version_number.minor, version_number.build)); - win::OSInfo::ServicePack service_pack = os_info->service_pack(); - if (service_pack.major != 0) { - version += StringPrintf(" SP%d", service_pack.major); - if (service_pack.minor != 0) { - version += StringPrintf(".%d", service_pack.minor); - } - } - return version; + return StringPrintf("%d.%d.%d", version_number.major, version_number.minor, + version_number.build); } // TODO: Implement OperatingSystemVersionComplete, which would include diff --git a/naiveproxy/src/base/task/common/task_annotator.cc b/naiveproxy/src/base/task/common/task_annotator.cc index 8ecc8cf6ef..f9d181d8ed 100644 --- a/naiveproxy/src/base/task/common/task_annotator.cc +++ b/naiveproxy/src/base/task/common/task_annotator.cc @@ -8,6 +8,8 @@ #include #include +#include +#include #include #include "base/auto_reset.h" @@ -16,6 +18,7 @@ #include "base/containers/span.h" #include "base/debug/alias.h" #include "base/logging.h" +#include "base/memory/safety_checks.h" #include "base/metrics/metrics_hashes.h" #include "base/time/time.h" #include "base/trace_event/heap_profiler.h" @@ -30,6 +33,9 @@ namespace base { namespace { +std::atomic_bool g_scheduler_loop_quarantine_task_controlled_purge_enabled = + false; + TaskAnnotator::ObserverForTesting* g_task_annotator_observer = nullptr; // The PendingTask currently in progress on each thread. Used to allow creating @@ -83,6 +89,16 @@ perfetto::protos::pbzero::ChromeTaskAnnotator::DelayPolicy ToProtoEnum( } // namespace +void EnableSchedulerLoopQuarantineTaskControlledPurge() { + g_scheduler_loop_quarantine_task_controlled_purge_enabled.store( + true, std::memory_order_relaxed); +} + +void DisableSchedulerLoopQuarantineTaskControlledPurgeForTesting() { + g_scheduler_loop_quarantine_task_controlled_purge_enabled.store( + false, std::memory_order_relaxed); +} + const PendingTask* TaskAnnotator::CurrentTaskForThread() { // Workaround false-positive MSAN use-of-uninitialized-value on // thread_local storage for loaded libraries: @@ -200,6 +216,12 @@ void TaskAnnotator::RunTaskImpl(PendingTask& pending_task) { { const AutoReset resetter(¤t_pending_task, &pending_task); + std::optional + scoped_disallow_purge; + if (g_scheduler_loop_quarantine_task_controlled_purge_enabled.load( + std::memory_order_relaxed)) { + scoped_disallow_purge.emplace(); + } if (g_task_annotator_observer) { g_task_annotator_observer->BeforeRunTask(&pending_task); diff --git a/naiveproxy/src/base/task/common/task_annotator.h b/naiveproxy/src/base/task/common/task_annotator.h index 58df202166..7af4427a8f 100644 --- a/naiveproxy/src/base/task/common/task_annotator.h +++ b/naiveproxy/src/base/task/common/task_annotator.h @@ -12,6 +12,7 @@ #include "base/auto_reset.h" #include "base/base_export.h" #include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/safety_checks.h" #include "base/pending_task.h" #include "base/time/tick_clock.h" #include "base/trace_event/trace_event.h" @@ -19,6 +20,14 @@ namespace base { +// Enables task-controlled purge for the scheduler loop quarantine in +// TaskAnnotator. +BASE_EXPORT void EnableSchedulerLoopQuarantineTaskControlledPurge(); + +// Disables task-controlled purge for the scheduler loop quarantine in +// TaskAnnotator. For use in tests. +BASE_EXPORT void DisableSchedulerLoopQuarantineTaskControlledPurgeForTesting(); + namespace sequence_manager::internal { class WorkQueue; } diff --git a/naiveproxy/src/base/task/current_thread.h b/naiveproxy/src/base/task/current_thread.h index bca2544745..d0615fee23 100644 --- a/naiveproxy/src/base/task/current_thread.h +++ b/naiveproxy/src/base/task/current_thread.h @@ -9,7 +9,6 @@ #include #include "base/base_export.h" -#include "base/callback_list.h" #include "base/check.h" #include "base/functional/callback_forward.h" #include "base/memory/raw_ptr.h" @@ -37,6 +36,8 @@ class WebTaskEnvironment; namespace base { +class CallbackListSubscription; + namespace test { bool RunUntil(FunctionRef); void TestPredicateOrRegisterOnNextIdleCallback(base::FunctionRef, @@ -250,7 +251,7 @@ class BASE_EXPORT CurrentUIThread : public CurrentThread { CurrentUIThread* operator->() { return this; } -#if BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_FUCHSIA) static_assert( std::is_base_of_v, "CurrentThreadForUI::WatchFileDescriptor is supported only" diff --git a/naiveproxy/src/base/task/execution_fence.cc b/naiveproxy/src/base/task/execution_fence.cc new file mode 100644 index 0000000000..7b673a03d8 --- /dev/null +++ b/naiveproxy/src/base/task/execution_fence.cc @@ -0,0 +1,119 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/task/execution_fence.h" + +#include +#include +#include + +#include "base/check_op.h" +#include "base/feature_list.h" +#include "base/features.h" +#include "base/no_destructor.h" +#include "base/not_fatal_until.h" +#include "base/sequence_checker.h" +#include "base/task/sequence_manager/sequence_manager.h" +#include "base/task/sequence_manager/task_queue.h" +#include "base/task/thread_pool/thread_pool_instance.h" +#include "third_party/abseil-cpp/absl/container/flat_hash_set.h" + +namespace base { + +using sequence_manager::SequenceManager; +using sequence_manager::TaskQueue; + +namespace { + +// Global list of SequenceManagers to notify of ScopedBestEffortExecutionFences. +class SequenceManagerRegistry { + public: + SequenceManagerRegistry() = default; + ~SequenceManagerRegistry() = default; + + SequenceManagerRegistry(const SequenceManagerRegistry&) = delete; + SequenceManagerRegistry& operator=(const SequenceManagerRegistry&) = delete; + + static SequenceManagerRegistry& GetInstance() { + static NoDestructor instance; + return *instance; + } + + void AddSequenceManager(SequenceManager* sequence_manager) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + auto [_, inserted] = sequence_managers_.emplace(sequence_manager); + CHECK(inserted, NotFatalUntil::M145); + } + + void RemoveSequenceManager(SequenceManager* sequence_manager) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + size_t erased = sequence_managers_.erase(sequence_manager); + CHECK_EQ(erased, 1u, NotFatalUntil::M145); + } + + std::vector> + GetCurrentVoters() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + std::vector> voters; + for (auto* sequence_manager : sequence_managers_) { + for (auto& voter : + sequence_manager->CreateBestEffortTaskQueueEnabledVoters()) { + voter->SetVoteToEnable(false); + voters.push_back(std::move(voter)); + } + } + return voters; + } + + private: + SEQUENCE_CHECKER(sequence_checker_); + absl::flat_hash_set sequence_managers_ + GUARDED_BY_CONTEXT(sequence_checker_); +}; + +} // namespace + +ScopedThreadPoolExecutionFence::ScopedThreadPoolExecutionFence() { + auto* thread_pool = ThreadPoolInstance::Get(); + CHECK(thread_pool, NotFatalUntil::M145); + thread_pool->BeginFence(); +} + +ScopedThreadPoolExecutionFence::~ScopedThreadPoolExecutionFence() { + auto* thread_pool = ThreadPoolInstance::Get(); + CHECK(thread_pool, NotFatalUntil::M145); + thread_pool->EndFence(); +} + +ScopedBestEffortExecutionFence::ScopedBestEffortExecutionFence() { + if (FeatureList::IsEnabled( + features::kScopedBestEffortExecutionFenceForTaskQueue)) { + task_queue_voters_ = + SequenceManagerRegistry::GetInstance().GetCurrentVoters(); + } + auto* thread_pool = ThreadPoolInstance::Get(); + CHECK(thread_pool, NotFatalUntil::M145); + thread_pool->BeginBestEffortFence(); +} + +ScopedBestEffortExecutionFence::~ScopedBestEffortExecutionFence() { + auto* thread_pool = ThreadPoolInstance::Get(); + CHECK(thread_pool, NotFatalUntil::M145); + thread_pool->EndBestEffortFence(); +} + +// static +void ScopedBestEffortExecutionFence::AddSequenceManager( + SequenceManager* sequence_manager) { + SequenceManagerRegistry::GetInstance().AddSequenceManager(sequence_manager); +} + +// static +void ScopedBestEffortExecutionFence::RemoveSequenceManager( + SequenceManager* sequence_manager) { + SequenceManagerRegistry::GetInstance().RemoveSequenceManager( + sequence_manager); +} + +} // namespace base diff --git a/naiveproxy/src/base/task/execution_fence.h b/naiveproxy/src/base/task/execution_fence.h new file mode 100644 index 0000000000..5fa510639d --- /dev/null +++ b/naiveproxy/src/base/task/execution_fence.h @@ -0,0 +1,81 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_TASK_EXECUTION_FENCE_H_ +#define BASE_TASK_EXECUTION_FENCE_H_ + +#include +#include + +#include "base/base_export.h" +#include "base/task/sequence_manager/task_queue.h" + +namespace base { + +namespace sequence_manager { +class SequenceManager; +} + +// A ScopedThreadPoolExecutionFence prevents new tasks from being scheduled in +// the ThreadPool within its scope. Multiple fences can exist at the same time. +// Upon destruction of all ScopedThreadPoolExecutionFences, tasks that were +// preeempted are released. Note: the constructor of +// ScopedThreadPoolExecutionFence will not wait for currently running tasks (as +// they were posted before entering this scope and do not violate the contract; +// some of them could be CONTINUE_ON_SHUTDOWN and waiting for them to complete +// is ill-advised). +// TODO(crbug.com/454908699): Remove the "Scoped" prefix. It's too verbose. +class BASE_EXPORT ScopedThreadPoolExecutionFence { + public: + ScopedThreadPoolExecutionFence(); + ScopedThreadPoolExecutionFence(const ScopedThreadPoolExecutionFence&) = + delete; + ScopedThreadPoolExecutionFence& operator=( + const ScopedThreadPoolExecutionFence&) = delete; + ~ScopedThreadPoolExecutionFence(); +}; + +// ScopedBestEffortExecutionFence is similar to ScopedThreadPoolExecutionFence, +// but only prevents new tasks of BEST_EFFORT priority from being scheduled. +// See ScopedThreadPoolExecutionFence for the full semantics. +// +// By default this only applies to tasks posted to the ThreadPool, same as +// ScopedThreadPoolExecutionFence. To apply fences to other task queues, call +// AddSequenceManager. +// TODO(crbug.com/454908699): Remove the "Scoped" prefix. It's too verbose. +class BASE_EXPORT ScopedBestEffortExecutionFence { + public: + ScopedBestEffortExecutionFence(); + ScopedBestEffortExecutionFence(const ScopedBestEffortExecutionFence&) = + delete; + ScopedBestEffortExecutionFence& operator=( + const ScopedBestEffortExecutionFence&) = delete; + ~ScopedBestEffortExecutionFence(); + + // ScopedBestEffortExecutionFences created after this will also preempt + // best-effort tasks posted to the backing sequence of `sequence_manager`. + // Existing fences aren't affected. Does nothing if `sequence_manager` doesn't + // define a best-effort priority. Must be called on the thread that created + // `sequence_manager`. + // TODO(crbug.com/441949788): Currently only sequence managers bound to the + // main thread are supported. + static void AddSequenceManager( + sequence_manager::SequenceManager* sequence_manager); + + // ScopedBestEffortExecutionFences created after this will no longer preempt + // best-effort tasks posted to the backing sequence of `sequence_manager`. + // Existing fences aren't affected. Must be called on the thread that called + // AddSequenceManager(). + static void RemoveSequenceManager( + sequence_manager::SequenceManager* sequence_manager); + + private: + // Voters used to disable additional task queues. + std::vector> + task_queue_voters_; +}; + +} // namespace base + +#endif // BASE_TASK_EXECUTION_FENCE_H_ diff --git a/naiveproxy/src/base/task/sequence_manager/sequence_manager.cc b/naiveproxy/src/base/task/sequence_manager/sequence_manager.cc index 1cc21ee073..7291fa2e98 100644 --- a/naiveproxy/src/base/task/sequence_manager/sequence_manager.cc +++ b/naiveproxy/src/base/task/sequence_manager/sequence_manager.cc @@ -139,6 +139,24 @@ SequenceManager::Settings::Builder::SetPrioritySettings( return *this; } +SequenceManager::Settings::Builder& +SequenceManager::Settings::Builder::SetIsMainThread(bool is_main_thread_val) { + settings_.is_main_thread = is_main_thread_val; + return *this; +} + +SequenceManager::Settings::Builder& +SequenceManager::Settings::Builder::SetShouldReportLockMetrics(bool enable) { + settings_.should_report_lock_metrics = enable; + return *this; +} + +SequenceManager::Settings::Builder& +SequenceManager::Settings::Builder::SetShouldBlockOnScopedFences(bool enable) { + settings_.should_block_on_scoped_fences = enable; + return *this; +} + #if DCHECK_IS_ON() SequenceManager::Settings::Builder& diff --git a/naiveproxy/src/base/task/sequence_manager/sequence_manager.h b/naiveproxy/src/base/task/sequence_manager/sequence_manager.h index 534e301399..9709d03eff 100644 --- a/naiveproxy/src/base/task/sequence_manager/sequence_manager.h +++ b/naiveproxy/src/base/task/sequence_manager/sequence_manager.h @@ -6,6 +6,7 @@ #define BASE_TASK_SEQUENCE_MANAGER_SEQUENCE_MANAGER_H_ #include +#include #include #include #include @@ -154,6 +155,19 @@ class BASE_EXPORT SequenceManager { PrioritySettings priority_settings = PrioritySettings::CreateDefault(); + // Whether this sequence manager represents the main thread of the process. + // This is only used to set + // base::SingleThreadTaskRunner::GetMainThreadDefault(). + bool is_main_thread = false; + + bool should_report_lock_metrics = false; + + // If true, tasks posted to this sequence manager should be delayed when a + // Scoped(*)ExecutionFence covering the task type exists. For example + // best-effort tasks would be delayed by ScopedBestEffortExecutionFence. + // (Note: ScopedThreadPoolExecutionFence only ever affects the ThreadPool.) + bool should_block_on_scoped_fences = false; + #if DCHECK_IS_ON() // TODO(alexclarke): Consider adding command line flags to control these. enum class TaskLogging { @@ -257,6 +271,14 @@ class BASE_EXPORT SequenceManager { virtual TaskQueue::QueuePriority GetPriorityCount() const = 0; + // Returns a list of voters that can enable/disable each TaskQueue with the + // priority used for "best-effort" tasks. This is the largest value (lowest + // priority) defined by the PrioritySettings, unless that's the default + // priority, in which case there's no "best-effort" priority and the returned + // list is empty. + virtual std::vector> + CreateBestEffortTaskQueueEnabledVoters() = 0; + // Creates a `TaskQueue` and returns a `TaskQueue::Handle`for it. The queue is // owned by the handle and shut down when the handle is destroyed. Must be // called on the main thread. @@ -308,6 +330,15 @@ class BASE_EXPORT SequenceManager::Settings::Builder { Builder& SetPrioritySettings(PrioritySettings settings); + Builder& SetIsMainThread(bool is_main_thread); + + // Whether lock contention metrics should be reported to UMA. + Builder& SetShouldReportLockMetrics(bool enable); + + // Whether tasks posted to this sequence manager should be delayed when a + // Scoped(*)ExecutionFence covering the task type exists. + Builder& SetShouldBlockOnScopedFences(bool enable); + #if DCHECK_IS_ON() // Controls task execution logging. Builder& SetTaskLogging(TaskLogging task_execution_logging); diff --git a/naiveproxy/src/base/task/sequence_manager/sequence_manager_impl.cc b/naiveproxy/src/base/task/sequence_manager/sequence_manager_impl.cc index 1848f831cc..3aac8c718e 100644 --- a/naiveproxy/src/base/task/sequence_manager/sequence_manager_impl.cc +++ b/naiveproxy/src/base/task/sequence_manager/sequence_manager_impl.cc @@ -18,6 +18,7 @@ #include #include "base/callback_list.h" +#include "base/check_op.h" #include "base/compiler_specific.h" #include "base/debug/crash_logging.h" #include "base/debug/stack_trace.h" @@ -30,6 +31,7 @@ #include "base/notreached.h" #include "base/observer_list.h" #include "base/rand_util.h" +#include "base/task/execution_fence.h" #include "base/task/sequence_manager/enqueue_order.h" #include "base/task/sequence_manager/task_queue_impl.h" #include "base/task/sequence_manager/task_time_observer.h" @@ -53,7 +55,6 @@ namespace { // Whether SequenceManagerImpl records crash keys. Enable via Finch when needed // for an investigation. Disabled by default to avoid unnecessary overhead. BASE_FEATURE(kRecordSequenceManagerCrashKeys, - "RecordSequenceManagerCrashKeys", base::FEATURE_DISABLED_BY_DEFAULT); constinit thread_local internal::SequenceManagerImpl* @@ -66,9 +67,7 @@ class TracedBaseValue : public trace_event::ConvertableToTraceFormat { void AppendAsTraceFormat(std::string* out) const override { if (!value_.is_none()) { - std::string tmp; - JSONWriter::Write(value_, &tmp); - *out += tmp; + *out += WriteJson(value_).value_or(""); } else { *out += "{}"; } @@ -181,6 +180,10 @@ SequenceManagerImpl::SequenceManagerImpl( main_thread_clock()->NowTicks() + kReclaimMemoryInterval; controller_->SetSequencedTaskSource(this); + + if (settings_.should_block_on_scoped_fences && GetBestEffortPriority()) { + ScopedBestEffortExecutionFence::AddSequenceManager(this); + } } SequenceManagerImpl::~SequenceManagerImpl() { @@ -188,6 +191,10 @@ SequenceManagerImpl::~SequenceManagerImpl() { TRACE_EVENT_OBJECT_DELETED_WITH_ID( TRACE_DISABLED_BY_DEFAULT("sequence_manager"), "SequenceManager", this); + if (settings_.should_block_on_scoped_fences && GetBestEffortPriority()) { + ScopedBestEffortExecutionFence::RemoveSequenceManager(this); + } + #if BUILDFLAG(IS_IOS) if (settings_.message_loop_type == MessagePumpType::UI && associated_thread_->IsBound()) { @@ -1142,9 +1149,7 @@ TaskQueue::Handle SequenceManagerImpl::CreateTaskQueue( std::string SequenceManagerImpl::DescribeAllPendingTasks() const { Value::Dict value = AsValueWithSelectorResult(nullptr, /* force_verbose */ true); - std::string result; - JSONWriter::Write(value, &result); - return result; + return WriteJson(value).value_or(""); } void SequenceManagerImpl::AddDestructionObserver( @@ -1243,6 +1248,35 @@ TaskQueue::QueuePriority SequenceManagerImpl::GetPriorityCount() const { return settings().priority_settings.priority_count(); } +std::vector> +SequenceManagerImpl::CreateBestEffortTaskQueueEnabledVoters() { + std::vector> voters; + if (std::optional best_effort_priority = + GetBestEffortPriority()) { + for (internal::TaskQueueImpl* task_queue : + main_thread_only().active_queues) { + if (task_queue->GetQueuePriority() == *best_effort_priority) { + voters.push_back(task_queue->CreateQueueEnabledVoter()); + } + } + } + return voters; +} + +std::optional +SequenceManagerImpl::GetBestEffortPriority() const { + const PrioritySettings& priority_settings = settings().priority_settings; + const size_t priority_count = + static_cast(priority_settings.priority_count()); + CHECK_GT(priority_count, 0u); + auto lowest_priority = + static_cast(priority_count - 1); + if (lowest_priority == priority_settings.default_priority()) { + return std::nullopt; + } + return lowest_priority; +} + constexpr TimeDelta SequenceManagerImpl::kReclaimMemoryInterval; } // namespace internal diff --git a/naiveproxy/src/base/task/sequence_manager/sequence_manager_impl.h b/naiveproxy/src/base/task/sequence_manager/sequence_manager_impl.h index fb8b5ced49..348f18d6fa 100644 --- a/naiveproxy/src/base/task/sequence_manager/sequence_manager_impl.h +++ b/naiveproxy/src/base/task/sequence_manager/sequence_manager_impl.h @@ -23,6 +23,7 @@ #include "base/debug/crash_logging.h" #include "base/feature_list.h" #include "base/functional/callback_forward.h" +#include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" #include "base/memory/raw_ptr_exclusion.h" #include "base/memory/scoped_refptr.h" @@ -133,6 +134,8 @@ class BASE_EXPORT SequenceManagerImpl void RemoveTaskObserver(TaskObserver* task_observer) override; std::optional GetNextDelayedWakeUp() const override; TaskQueue::QueuePriority GetPriorityCount() const override; + std::vector> + CreateBestEffortTaskQueueEnabledVoters() override; // SequencedTaskSource implementation: void SetRunTaskSynchronouslyAllowed( @@ -215,6 +218,13 @@ class BASE_EXPORT SequenceManagerImpl friend class ::base::sequence_manager::SequenceManagerForTest; private: + FRIEND_TEST_ALL_PREFIXES(SequenceManagerTest, + BestEffortPriority_SinglePriority); + FRIEND_TEST_ALL_PREFIXES(SequenceManagerTest, + BestEffortPriority_ManyHighPriorities); + FRIEND_TEST_ALL_PREFIXES(SequenceManagerTest, + BestEffortPriority_ManyLowPriorities); + // Returns the SequenceManager running the // current thread. It must only be used on the thread it was obtained. // Only to be used by CurrentThread for the moment @@ -468,6 +478,10 @@ class BASE_EXPORT SequenceManagerImpl TaskQueue::TaskTiming InitializeTaskTiming( internal::TaskQueueImpl* task_queue); + // Returns the priority to use for CreateBestEffortTaskQueueEnabledVoters(), + // or nullopt if there's no appropriate priority defined. + std::optional GetBestEffortPriority() const; + const scoped_refptr associated_thread_; EnqueueOrderGenerator enqueue_order_generator_; diff --git a/naiveproxy/src/base/task/sequence_manager/thread_controller.cc b/naiveproxy/src/base/task/sequence_manager/thread_controller.cc index 4b3d07dabc..ae4dbd3a3b 100644 --- a/naiveproxy/src/base/task/sequence_manager/thread_controller.cc +++ b/naiveproxy/src/base/task/sequence_manager/thread_controller.cc @@ -27,7 +27,6 @@ namespace { // Note that even if `kThreadControllerSetsProfilerMetadata` is disabled, sample // metadata may still be recorded. BASE_FEATURE(kThreadControllerSetsProfilerMetadata, - "ThreadControllerSetsProfilerMetadata", base::FEATURE_DISABLED_BY_DEFAULT); // Thread safe copy to be updated once feature list is available. This diff --git a/naiveproxy/src/base/task/sequence_manager/thread_controller_power_monitor.cc b/naiveproxy/src/base/task/sequence_manager/thread_controller_power_monitor.cc index fd250b271c..e000679fa9 100644 --- a/naiveproxy/src/base/task/sequence_manager/thread_controller_power_monitor.cc +++ b/naiveproxy/src/base/task/sequence_manager/thread_controller_power_monitor.cc @@ -13,9 +13,7 @@ namespace base::sequence_manager::internal { namespace { // Activate the power management events that affect task scheduling. -BASE_FEATURE(kUsePowerMonitorWithThreadController, - "UsePowerMonitorWithThreadController", - FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kUsePowerMonitorWithThreadController, FEATURE_ENABLED_BY_DEFAULT); // TODO(crbug.com/40127966): Remove this when the experiment becomes the // default. diff --git a/naiveproxy/src/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc b/naiveproxy/src/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc index f6f5ca4835..bde5172510 100644 --- a/naiveproxy/src/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc +++ b/naiveproxy/src/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -17,6 +18,9 @@ #include "base/message_loop/message_pump.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_macros.h" +#include "base/strings/strcat.h" +#include "base/synchronization/lock.h" +#include "base/synchronization/lock_metrics_recorder.h" #include "base/task/sequence_manager/tasks.h" #include "base/task/task_features.h" #include "base/threading/hang_watcher.h" @@ -45,7 +49,6 @@ TimeTicks CapAtOneDay(TimeTicks next_run_time, LazyNow* lazy_now) { } BASE_FEATURE(kAvoidScheduleWorkDuringNativeEventProcessing, - "AvoidScheduleWorkDuringNativeEventProcessing", base::FEATURE_ENABLED_BY_DEFAULT); std::atomic_bool g_run_tasks_by_batches = false; @@ -80,7 +83,12 @@ ThreadControllerWithMessagePumpImpl::ThreadControllerWithMessagePumpImpl( const SequenceManager::Settings& settings) : ThreadController(settings.clock), work_deduplicator_(associated_thread_), - can_run_tasks_by_batches_(settings.can_run_tasks_by_batches) {} + can_run_tasks_by_batches_(settings.can_run_tasks_by_batches), + is_main_thread_(settings.is_main_thread) { + if (settings.should_report_lock_metrics) { + LockMetricsRecorder::Get()->SetTargetCurrentThread(); + } +} ThreadControllerWithMessagePumpImpl::ThreadControllerWithMessagePumpImpl( std::unique_ptr message_pump, @@ -238,6 +246,14 @@ void ThreadControllerWithMessagePumpImpl:: main_thread_only().thread_task_runner_handle = std::make_unique( task_runner_); + + if (is_main_thread_) { + main_thread_only().main_thread_default_task_runner_handle.reset(); + main_thread_only().main_thread_default_task_runner_handle = + std::make_unique( + task_runner_); + } + // When the task runner is known, bind the power manager. Power notifications // are received through that sequence. power_monitor_.BindToCurrentThread(); @@ -557,6 +573,8 @@ void ThreadControllerWithMessagePumpImpl::DoIdleWork() { } #endif // BUILDFLAG(IS_WIN) + LockMetricsRecorder::Get()->ReportLockAcquisitionTimes(); + if (main_thread_only().task_source->OnIdle()) { work_id_provider_->IncrementWorkId(); // The OnIdle() callback resulted in more immediate work, so schedule a diff --git a/naiveproxy/src/base/task/sequence_manager/thread_controller_with_message_pump_impl.h b/naiveproxy/src/base/task/sequence_manager/thread_controller_with_message_pump_impl.h index b9cbdf18fd..a6f8fa1add 100644 --- a/naiveproxy/src/base/task/sequence_manager/thread_controller_with_message_pump_impl.h +++ b/naiveproxy/src/base/task/sequence_manager/thread_controller_with_message_pump_impl.h @@ -114,6 +114,9 @@ class BASE_EXPORT ThreadControllerWithMessagePumpImpl raw_ptr nesting_observer = nullptr; // Not owned. std::unique_ptr thread_task_runner_handle; + // Only used if this thread represents the main thread of the process. + std::unique_ptr + main_thread_default_task_runner_handle; // Indicates that we should yield DoWork between each task to let a possibly // nested RunLoop exit. @@ -210,6 +213,8 @@ class BASE_EXPORT ThreadControllerWithMessagePumpImpl // |pump_|. This means that it should be destroyed first. This member cannot // be moved up. std::unique_ptr pump_; + + const bool is_main_thread_; }; } // namespace internal diff --git a/naiveproxy/src/base/task/sequenced_task_runner.h b/naiveproxy/src/base/task/sequenced_task_runner.h index fcd4b34211..ffe36e6aa2 100644 --- a/naiveproxy/src/base/task/sequenced_task_runner.h +++ b/naiveproxy/src/base/task/sequenced_task_runner.h @@ -11,12 +11,13 @@ #include "base/functional/callback.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr_exclusion.h" -#include "base/task/delay_policy.h" #include "base/task/delayed_task_handle.h" #include "base/task/sequenced_task_runner_helpers.h" #include "base/task/task_runner.h" -#include "base/types/pass_key.h" +namespace actor { +class PageStabilityMonitor; +} // namespace actor namespace blink { class LowPrecisionTimer; class ScriptedIdleTaskController; @@ -56,12 +57,15 @@ class TimeTicks; namespace subtle { +enum class DelayPolicy; + // Restricts access to PostCancelableDelayedTask*() to authorized callers. class PostDelayedTaskPassKey { private: // Avoid =default to disallow creation by uniform initialization. PostDelayedTaskPassKey() = default; + friend class actor::PageStabilityMonitor; friend class base::internal::DelayTimerBase; friend class base::internal::DelayedTaskManager; friend class base::DeadlineTimer; diff --git a/naiveproxy/src/base/task/single_thread_task_executor.cc b/naiveproxy/src/base/task/single_thread_task_executor.cc index 9897c5907f..dc2d713ee5 100644 --- a/naiveproxy/src/base/task/single_thread_task_executor.cc +++ b/naiveproxy/src/base/task/single_thread_task_executor.cc @@ -12,21 +12,29 @@ namespace base { -SingleThreadTaskExecutor::SingleThreadTaskExecutor(MessagePumpType type) - : SingleThreadTaskExecutor(type, MessagePump::Create(type)) { +SingleThreadTaskExecutor::SingleThreadTaskExecutor(MessagePumpType type, + bool is_main_thread) + : SingleThreadTaskExecutor(type, + MessagePump::Create(type), + is_main_thread) { DCHECK_NE(type, MessagePumpType::CUSTOM); } SingleThreadTaskExecutor::SingleThreadTaskExecutor( - std::unique_ptr pump) - : SingleThreadTaskExecutor(MessagePumpType::CUSTOM, std::move(pump)) {} + std::unique_ptr pump, + bool is_main_thread) + : SingleThreadTaskExecutor(MessagePumpType::CUSTOM, + std::move(pump), + is_main_thread) {} SingleThreadTaskExecutor::SingleThreadTaskExecutor( MessagePumpType type, - std::unique_ptr pump) + std::unique_ptr pump, + bool is_main_thread) : sequence_manager_(sequence_manager::CreateUnboundSequenceManager( sequence_manager::SequenceManager::Settings::Builder() .SetMessagePumpType(type) + .SetIsMainThread(is_main_thread) .Build())), default_task_queue_( sequence_manager_->CreateTaskQueue(sequence_manager::TaskQueue::Spec( diff --git a/naiveproxy/src/base/task/single_thread_task_executor.h b/naiveproxy/src/base/task/single_thread_task_executor.h index 585254e727..0466eb91d3 100644 --- a/naiveproxy/src/base/task/single_thread_task_executor.h +++ b/naiveproxy/src/base/task/single_thread_task_executor.h @@ -27,11 +27,13 @@ class BASE_EXPORT SingleThreadTaskExecutor { public: // For MessagePumpType::CUSTOM use the constructor that takes a pump. explicit SingleThreadTaskExecutor( - MessagePumpType type = MessagePumpType::DEFAULT); + MessagePumpType type = MessagePumpType::DEFAULT, + bool is_main_thread = false); // Creates a SingleThreadTaskExecutor pumping from a custom |pump|. // The above constructor using MessagePumpType is generally preferred. - explicit SingleThreadTaskExecutor(std::unique_ptr pump); + explicit SingleThreadTaskExecutor(std::unique_ptr pump, + bool is_main_thread = false); SingleThreadTaskExecutor(const SingleThreadTaskExecutor&) = delete; SingleThreadTaskExecutor& operator=(const SingleThreadTaskExecutor&) = delete; @@ -51,9 +53,14 @@ class BASE_EXPORT SingleThreadTaskExecutor { // high overhead and yielding to native isn't critical. void SetWorkBatchSize(int work_batch_size); + sequence_manager::SequenceManager* sequence_manager() { + return sequence_manager_.get(); + } + private: SingleThreadTaskExecutor(MessagePumpType type, - std::unique_ptr pump); + std::unique_ptr pump, + bool is_main_thread); std::unique_ptr sequence_manager_; sequence_manager::TaskQueue::Handle default_task_queue_; diff --git a/naiveproxy/src/base/task/single_thread_task_runner.cc b/naiveproxy/src/base/task/single_thread_task_runner.cc index 651267a81a..514c9ff38b 100644 --- a/naiveproxy/src/base/task/single_thread_task_runner.cc +++ b/naiveproxy/src/base/task/single_thread_task_runner.cc @@ -22,6 +22,11 @@ namespace { constinit thread_local SingleThreadTaskRunner::CurrentDefaultHandle* current_default_handle = nullptr; +constinit SingleThreadTaskRunner::MainThreadDefaultHandle* + main_thread_default_handle = nullptr; + +bool can_override = false; + // This function can be removed, and the calls below replaced with direct // variable accesses, once the MSAN workaround is not necessary. SingleThreadTaskRunner::CurrentDefaultHandle* GetCurrentDefaultHandle() { @@ -63,6 +68,24 @@ bool SingleThreadTaskRunner::HasCurrentDefault() { !!GetCurrentDefaultHandle()->task_runner_; } +// static +const scoped_refptr& +SingleThreadTaskRunner::GetMainThreadDefault() { + const auto* const handle = main_thread_default_handle; + CHECK(handle && handle->task_runner_) + << "Error: The main thread's handle is not initialized yet. This " + "probably means that you're calling this function too early in the " + "process's lifetime. If you're in a test, you can use " + "base::test::TaskEnvironement"; + return handle->task_runner_; +} + +// static +bool SingleThreadTaskRunner::HasMainThreadDefault() { + return !!main_thread_default_handle && + !!main_thread_default_handle->task_runner_; +} + SingleThreadTaskRunner::CurrentDefaultHandle::CurrentDefaultHandle( scoped_refptr task_runner) : CurrentDefaultHandle(std::move(task_runner), MayAlreadyExist{}) { @@ -99,4 +122,29 @@ SingleThreadTaskRunner::CurrentHandleOverrideForTesting:: SingleThreadTaskRunner::CurrentHandleOverrideForTesting:: ~CurrentHandleOverrideForTesting() = default; +SingleThreadTaskRunner::MainThreadDefaultHandle::MainThreadDefaultHandle( + scoped_refptr task_runner) + : task_runner_(std::move(task_runner)), + previous_handle_(main_thread_default_handle) { + CHECK(!main_thread_default_handle || can_override); + main_thread_default_handle = this; +} + +SingleThreadTaskRunner::MainThreadDefaultHandle::~MainThreadDefaultHandle() { + DCHECK_EQ(main_thread_default_handle, this); + main_thread_default_handle = previous_handle_; +} + +SingleThreadTaskRunner::ScopedCanOverrideMainThreadDefaultHandle:: + ScopedCanOverrideMainThreadDefaultHandle() { + CHECK(!can_override); + can_override = true; +} + +SingleThreadTaskRunner::ScopedCanOverrideMainThreadDefaultHandle:: + ~ScopedCanOverrideMainThreadDefaultHandle() { + CHECK(can_override); + can_override = false; +} + } // namespace base diff --git a/naiveproxy/src/base/task/single_thread_task_runner.h b/naiveproxy/src/base/task/single_thread_task_runner.h index 66b9b1db7d..93f92ce5e6 100644 --- a/naiveproxy/src/base/task/single_thread_task_runner.h +++ b/naiveproxy/src/base/task/single_thread_task_runner.h @@ -10,6 +10,7 @@ #include "base/base_export.h" #include "base/dcheck_is_on.h" #include "base/gtest_prod_util.h" +#include "base/memory/raw_ptr.h" #include "base/memory/raw_ptr_exclusion.h" #include "base/task/sequenced_task_runner.h" @@ -56,12 +57,11 @@ class BASE_EXPORT SingleThreadTaskRunner : public SequencedTaskRunner { // cases, e.g. DeleteSoon or RefCountedDeleteOnSequence should delete the // object on the same task queue it's used from (or on a lower priority). // - // DCHECKs if the current thread isn't servicing a SingleThreadTaskRunner. + // CHECKs if the current thread isn't servicing a SingleThreadTaskRunner. // // See // https://chromium.googlesource.com/chromium/src/+/main/docs/threading_and_tasks.md#Posting-to-the-Current-Virtual_Thread // for details - [[nodiscard]] static const scoped_refptr& GetCurrentDefault(); @@ -69,6 +69,16 @@ class BASE_EXPORT SingleThreadTaskRunner : public SequencedTaskRunner { // the current thread. [[nodiscard]] static bool HasCurrentDefault(); + // Returns the default SingleThreadTaskRunner for the main thread. + // + // CHECKs if the main thread task runner hasn't yet been initialized. + [[nodiscard]] static const scoped_refptr& + GetMainThreadDefault(); + + // Returns true if the SingleThreadTaskRunner is already created for + // the main thread. + [[nodiscard]] static bool HasMainThreadDefault(); + class CurrentHandleOverrideForTesting; class BASE_EXPORT CurrentDefaultHandle { @@ -139,6 +149,39 @@ class BASE_EXPORT SingleThreadTaskRunner : public SequencedTaskRunner { std::unique_ptr no_running_during_override_; }; + class BASE_EXPORT MainThreadDefaultHandle { + public: + // Sets the value returned by + // `SingleThreadTaskRunner::GetMainThreadDefault()` to `task_runner` within + // its scope. `task_runner` must belong to the current thread. There must + // not already be a current default `SingleThreadTaskRunner` on this thread. + // For tests where this is necessary, it's possible to use + // ScopedCanOverrideMainThreadDefaultHandle. + explicit MainThreadDefaultHandle( + scoped_refptr task_runner); + + ~MainThreadDefaultHandle(); + + private: + friend class SingleThreadTaskRunner; + + scoped_refptr task_runner_; + + // Some tests requires the ability to override the `previous_handle_`. + // TODO(pmonette): Remove this when this is no longer the case. + raw_ptr previous_handle_ = nullptr; + }; + + // Allows overriding the main thread default handle in some test + // configuration. Callers must be friended to avoid spreading its usage. + class BASE_EXPORT ScopedCanOverrideMainThreadDefaultHandle { + private: + friend class ScopedMockTimeMessageLoopTaskRunner; + + ScopedCanOverrideMainThreadDefaultHandle(); + ~ScopedCanOverrideMainThreadDefaultHandle(); + }; + protected: ~SingleThreadTaskRunner() override = default; }; diff --git a/naiveproxy/src/base/task/task_features.cc b/naiveproxy/src/base/task/task_features.cc index c58e0fa612..44b7873e61 100644 --- a/naiveproxy/src/base/task/task_features.cc +++ b/naiveproxy/src/base/task/task_features.cc @@ -22,9 +22,7 @@ namespace base { // must be aware that all tests sharing a process will have the same state, // regardless of future ScopedFeatureList instances. -BASE_FEATURE(kUseUtilityThreadGroup, - "UseUtilityThreadGroup", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kUseUtilityThreadGroup, FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kAddTaskLeewayFeature, "AddTaskLeeway", @@ -39,20 +37,15 @@ BASE_FEATURE_PARAM(TimeDelta, "max_precise_delay", kDefaultMaxPreciseDelay); -BASE_FEATURE(kAlignWakeUps, "AlignWakeUps", FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kAlignWakeUps, FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kTimerSlackMac, "TimerSlackMac", FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kTimerSlackMac, FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kUIPumpImprovementsWin, - "UIPumpImprovementsWin", - FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kUIPumpImprovementsWin, FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kPumpFastToSleepAndroid, - "PumpFastToSleepAndroid", - FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kPumpFastToSleepAndroid, FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kRunTasksByBatches, - "RunTasksByBatches", #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) FEATURE_ENABLED_BY_DEFAULT); #else diff --git a/naiveproxy/src/base/task/task_traits_nocompile.nc b/naiveproxy/src/base/task/task_traits_nocompile.nc index 9255e6cfb2..4f653a01ed 100644 --- a/naiveproxy/src/base/task/task_traits_nocompile.nc +++ b/naiveproxy/src/base/task/task_traits_nocompile.nc @@ -33,6 +33,6 @@ constexpr TaskTraits traits5 = {TaskShutdownBehavior::BLOCK_SHUTDOWN, // MayBlock(), // expected-error@base/traits_bag.h:* {{The traits bag contains multiple traits of the same type.}} TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}; // expected-error@*:* {{type occurs more than once in type list}} -constexpr TaskTraits traits6 = {TaskShutdownBehavior::BLOCK_SHUTDOWN, true}; // expected-error@*:* 0-1 {{no matching constructor for initialization}} +constexpr TaskTraits traits6 = {TaskShutdownBehavior::BLOCK_SHUTDOWN, true}; // expected-error@*:* {{no matching constructor for initialization}} } // namespace base diff --git a/naiveproxy/src/base/task/thread_pool/delayed_task_manager.h b/naiveproxy/src/base/task/thread_pool/delayed_task_manager.h index 6fcae0562f..cbec9f2f01 100644 --- a/naiveproxy/src/base/task/thread_pool/delayed_task_manager.h +++ b/naiveproxy/src/base/task/thread_pool/delayed_task_manager.h @@ -13,6 +13,7 @@ #include "base/functional/callback.h" #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" +#include "base/sequence_checker.h" #include "base/synchronization/atomic_flag.h" #include "base/task/common/checked_lock.h" #include "base/task/delay_policy.h" diff --git a/naiveproxy/src/base/task/thread_pool/test_task_factory.h b/naiveproxy/src/base/task/thread_pool/test_task_factory.h index 9805eb3c03..7d4fcdc1f1 100644 --- a/naiveproxy/src/base/task/thread_pool/test_task_factory.h +++ b/naiveproxy/src/base/task/thread_pool/test_task_factory.h @@ -10,7 +10,7 @@ #include #include "base/functional/callback_forward.h" -#include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" #include "base/synchronization/condition_variable.h" #include "base/synchronization/lock.h" #include "base/task/task_runner.h" diff --git a/naiveproxy/src/base/task/thread_pool/test_utils.h b/naiveproxy/src/base/task/thread_pool/test_utils.h index 5ec1bac64a..5c8cdc7420 100644 --- a/naiveproxy/src/base/task/thread_pool/test_utils.h +++ b/naiveproxy/src/base/task/thread_pool/test_utils.h @@ -10,6 +10,7 @@ #include "base/functional/callback.h" #include "base/memory/raw_ptr.h" +#include "base/memory/ref_counted.h" #include "base/task/common/checked_lock.h" #include "base/task/post_job.h" #include "base/task/task_features.h" diff --git a/naiveproxy/src/base/task/thread_pool/thread_group.cc b/naiveproxy/src/base/task/thread_pool/thread_group.cc index 30ba510307..93dfd5fe72 100644 --- a/naiveproxy/src/base/task/thread_pool/thread_group.cc +++ b/naiveproxy/src/base/task/thread_pool/thread_group.cc @@ -11,6 +11,7 @@ #include "base/check.h" #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" +#include "base/strings/stringprintf.h" #include "base/task/task_features.h" #include "base/task/thread_pool/task_tracker.h" #include "build/build_config.h" @@ -127,7 +128,8 @@ ThreadGroup::ThreadGroup(std::string_view histogram_label, TrackedRef delegate) : task_tracker_(std::move(task_tracker)), delegate_(std::move(delegate)), - histogram_label_(histogram_label), + unnecessary_wakeup_histogram_label_( + StringPrintf("ThreadPool.UnnecessaryWakeup.%s", histogram_label)), thread_group_label_(thread_group_label), thread_type_hint_(thread_type_hint), idle_workers_set_cv_for_testing_(lock_.CreateConditionVariable()) { diff --git a/naiveproxy/src/base/task/thread_pool/thread_group.h b/naiveproxy/src/base/task/thread_pool/thread_group.h index 7115d8a628..3c4408b510 100644 --- a/naiveproxy/src/base/task/thread_pool/thread_group.h +++ b/naiveproxy/src/base/task/thread_pool/thread_group.h @@ -476,7 +476,7 @@ class BASE_EXPORT ThreadGroup { std::atomic max_allowed_sort_key_ GUARDED_BY(lock_){ kMaxYieldSortKey}; - const std::string histogram_label_; + const std::string unnecessary_wakeup_histogram_label_; const std::string thread_group_label_; const ThreadType thread_type_hint_; diff --git a/naiveproxy/src/base/task/thread_pool/thread_group_impl.cc b/naiveproxy/src/base/task/thread_pool/thread_group_impl.cc index d00ccdc041..28d7efb9c0 100644 --- a/naiveproxy/src/base/task/thread_pool/thread_group_impl.cc +++ b/naiveproxy/src/base/task/thread_pool/thread_group_impl.cc @@ -13,6 +13,7 @@ #include "base/strings/stringprintf.h" #include "base/task/common/checked_lock.h" #include "base/task/thread_pool/worker_thread.h" +#include "base/threading/platform_thread_metrics.h" #include "base/threading/scoped_blocking_call.h" #include "base/threading/scoped_blocking_call_internal.h" #include "base/threading/thread_checker.h" @@ -211,14 +212,16 @@ ThreadGroupImpl::ThreadGroupImpl(std::string_view histogram_label, ThreadType thread_type_hint, int64_t thread_group_type, TrackedRef task_tracker, - TrackedRef delegate) + TrackedRef delegate, + bool monitor_worker_thread_priorities) : ThreadGroup(histogram_label, thread_group_label, thread_type_hint, std::move(task_tracker), std::move(delegate)), thread_group_type_(thread_group_type), - tracked_ref_factory_(this) { + tracked_ref_factory_(this), + monitor_worker_thread_priorities_(monitor_worker_thread_priorities) { DCHECK(!thread_group_label_.empty()); } @@ -338,8 +341,14 @@ void ThreadGroupImpl::WorkerDelegate::OnMainEntry(WorkerThread* worker) { outer_->after_start().worker_environment); #endif // BUILDFLAG(IS_WIN) - PlatformThread::SetName( - StringPrintf("ThreadPool%sWorker", outer_->thread_group_label_.c_str())); + std::string thread_name = + StringPrintf("ThreadPool%sWorker", outer_->thread_group_label_.c_str()); + PlatformThread::SetName(thread_name); +#if BUILDFLAG(IS_ANDROID) + if (outer_->monitor_worker_thread_priorities_) { + PlatformThreadPriorityMonitor::Get().RegisterCurrentThread(thread_name); + } +#endif // BUILDFLAG(IS_ANDROID) outer_->BindToCurrentThread(); worker_only().worker_thread_ = static_cast(worker); @@ -637,7 +646,7 @@ void ThreadGroupImpl::WorkerDelegate::RecordUnnecessaryWakeup() { DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); base::BooleanHistogram::FactoryGet( - std::string("ThreadPool.UnnecessaryWakeup.") + outer_->histogram_label_, + outer_->unnecessary_wakeup_histogram_label_, base::Histogram::kUmaTargetedHistogramFlag) ->Add(true); diff --git a/naiveproxy/src/base/task/thread_pool/thread_group_impl.h b/naiveproxy/src/base/task/thread_pool/thread_group_impl.h index 9416295070..d5927e4984 100644 --- a/naiveproxy/src/base/task/thread_pool/thread_group_impl.h +++ b/naiveproxy/src/base/task/thread_pool/thread_group_impl.h @@ -52,7 +52,8 @@ class BASE_EXPORT ThreadGroupImpl : public ThreadGroup { ThreadType thread_type_hint, int64_t thread_group_type, TrackedRef task_tracker, - TrackedRef delegate); + TrackedRef delegate, + bool monitor_worker_thread_priorities = false); ThreadGroupImpl(const ThreadGroupImpl&) = delete; ThreadGroupImpl& operator=(const ThreadGroupImpl&) = delete; @@ -155,6 +156,10 @@ class BASE_EXPORT ThreadGroupImpl : public ThreadGroup { // https://crbug.com/810464. Uses AtomicRefCount to make its only public // method thread-safe. TrackedRefFactory tracked_ref_factory_; + + // This is used by worker threads to decide if they should be reporting thread + // priorities to UMA. + const bool monitor_worker_thread_priorities_; }; } // namespace internal diff --git a/naiveproxy/src/base/task/thread_pool/thread_pool_impl.cc b/naiveproxy/src/base/task/thread_pool/thread_pool_impl.cc index 64a70b9de2..23a424382f 100644 --- a/naiveproxy/src/base/task/thread_pool/thread_pool_impl.cc +++ b/naiveproxy/src/base/task/thread_pool/thread_pool_impl.cc @@ -77,7 +77,8 @@ ThreadPoolImpl::ThreadPoolImpl(std::string_view histogram_label) ThreadPoolImpl::ThreadPoolImpl(std::string_view histogram_label, std::unique_ptr task_tracker, - bool use_background_threads) + bool use_background_threads, + bool monitor_worker_thread_priorities) : histogram_label_(histogram_label), task_tracker_(std::move(task_tracker)), single_thread_task_runner_manager_(task_tracker_->GetTrackedRef(), @@ -93,7 +94,7 @@ ThreadPoolImpl::ThreadPoolImpl(std::string_view histogram_label, kForegroundPoolEnvironmentParams.name_suffix, kForegroundPoolEnvironmentParams.thread_type_hint, ThreadGroupType::FOREGROUND, task_tracker_->GetTrackedRef(), - tracked_ref_factory_.GetTrackedRef()); + tracked_ref_factory_.GetTrackedRef(), monitor_worker_thread_priorities); if (CanUseBackgroundThreadTypeForWorkerThread()) { background_thread_group_ = std::make_unique( @@ -107,7 +108,7 @@ ThreadPoolImpl::ThreadPoolImpl(std::string_view histogram_label, ? kBackgroundPoolEnvironmentParams.thread_type_hint : kForegroundPoolEnvironmentParams.thread_type_hint, ThreadGroupType::BACKGROUND, task_tracker_->GetTrackedRef(), - tracked_ref_factory_.GetTrackedRef()); + tracked_ref_factory_.GetTrackedRef(), monitor_worker_thread_priorities); } } @@ -165,7 +166,7 @@ void ThreadPoolImpl::Start(const ThreadPoolInstance::InitParams& init_params, } // Update the CanRunPolicy based on |has_disable_best_effort_switch_|. - UpdateCanRunPolicy(); + UpdateCanRunPolicy(CalculateCanRunPolicy()); // Needs to happen after starting the service thread to get its task_runner(). auto service_thread_task_runner = service_thread_.task_runner(); @@ -360,7 +361,7 @@ void ThreadPoolImpl::Shutdown() { // Allow all tasks to run. Done after initiating shutdown to ensure that non- // BLOCK_SHUTDOWN tasks don't get a chance to run and that BLOCK_SHUTDOWN // tasks run with a normal thread priority. - UpdateCanRunPolicy(); + UpdateCanRunPolicy(CalculateCanRunPolicy()); // Ensures that there are enough background worker to run BLOCK_SHUTDOWN // tasks. @@ -378,7 +379,31 @@ void ThreadPoolImpl::Shutdown() { } void ThreadPoolImpl::FlushForTesting() { + // If BEST_EFFORT tasks can run it means all tasks can run. + const bool can_run_all = + task_tracker_->CanRunPriority(TaskPriority::BEST_EFFORT); + + if (!can_run_all) { + // Calling `FlushForTesting` when not all tasks are allowed to run can only + // be done under `sequence_checker_`. + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + // Forcibly set the policy to allow running of all tasks. This does not + // affect the fence counts. This means that fences are effectively + // disregarded for the duration of flushing. + UpdateCanRunPolicy(CanRunPolicy::kAll); + } + task_tracker_->FlushForTesting(); + + if (!can_run_all) { + // Calling `FlushForTesting` when not all tasks are allowed to run can only + // be done under `sequence_checker_`. + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + // Restore the policy to the previous state. + UpdateCanRunPolicy(CalculateCanRunPolicy()); + } } void ThreadPoolImpl::FlushAsyncForTesting(OnceClosure flush_callback) { @@ -413,27 +438,27 @@ void ThreadPoolImpl::JoinForTesting() { void ThreadPoolImpl::BeginFence() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); ++num_fences_; - UpdateCanRunPolicy(); + UpdateCanRunPolicy(CalculateCanRunPolicy()); } void ThreadPoolImpl::EndFence() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_GT(num_fences_, 0); --num_fences_; - UpdateCanRunPolicy(); + UpdateCanRunPolicy(CalculateCanRunPolicy()); } void ThreadPoolImpl::BeginBestEffortFence() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); ++num_best_effort_fences_; - UpdateCanRunPolicy(); + UpdateCanRunPolicy(CalculateCanRunPolicy()); } void ThreadPoolImpl::EndBestEffortFence() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_GT(num_best_effort_fences_, 0); --num_best_effort_fences_; - UpdateCanRunPolicy(); + UpdateCanRunPolicy(CalculateCanRunPolicy()); } void ThreadPoolImpl::BeginFizzlingBlockShutdownTasks() { @@ -604,22 +629,24 @@ ThreadGroup* ThreadPoolImpl::GetThreadGroupForTraits(const TaskTraits& traits) { return foreground_thread_group_.get(); } -void ThreadPoolImpl::UpdateCanRunPolicy() { +CanRunPolicy ThreadPoolImpl::CalculateCanRunPolicy() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - CanRunPolicy can_run_policy; if ((num_fences_ == 0 && num_best_effort_fences_ == 0 && !has_disable_best_effort_switch_) || task_tracker_->HasShutdownStarted()) { - can_run_policy = CanRunPolicy::kAll; + return CanRunPolicy::kAll; } else if (num_fences_ != 0) { - can_run_policy = CanRunPolicy::kNone; + return CanRunPolicy::kNone; } else { DCHECK(num_best_effort_fences_ > 0 || has_disable_best_effort_switch_); - can_run_policy = CanRunPolicy::kForegroundOnly; + return CanRunPolicy::kForegroundOnly; } +} +void ThreadPoolImpl::UpdateCanRunPolicy(CanRunPolicy can_run_policy) { task_tracker_->SetCanRunPolicy(can_run_policy); + foreground_thread_group_->DidUpdateCanRunPolicy(); if (utility_thread_group_) { utility_thread_group_->DidUpdateCanRunPolicy(); diff --git a/naiveproxy/src/base/task/thread_pool/thread_pool_impl.h b/naiveproxy/src/base/task/thread_pool/thread_pool_impl.h index 758d56bc50..d60534572b 100644 --- a/naiveproxy/src/base/task/thread_pool/thread_pool_impl.h +++ b/naiveproxy/src/base/task/thread_pool/thread_pool_impl.h @@ -56,7 +56,8 @@ class BASE_EXPORT ThreadPoolImpl : public ThreadPoolInstance, // priority. ThreadPoolImpl(std::string_view histogram_label, std::unique_ptr task_tracker, - bool use_background_threads = true); + bool use_background_threads = true, + bool monitor_worker_thread_priorities = true); ThreadPoolImpl(const ThreadPoolImpl&) = delete; ThreadPoolImpl& operator=(const ThreadPoolImpl&) = delete; @@ -166,9 +167,13 @@ class BASE_EXPORT ThreadPoolImpl : public ThreadPoolInstance, const base::FilePath& path); private: - // Invoked after |num_fences_| or |num_best_effort_fences_| is updated. Sets - // the CanRunPolicy in TaskTracker and wakes up workers as appropriate. - void UpdateCanRunPolicy(); + // Use after |num_fences_| or |num_best_effort_fences_| is updated to get the + // new effective policy. + CanRunPolicy CalculateCanRunPolicy(); + + // Sets the CanRunPolicy in TaskTracker to `can_run_policy` and wakes up + // workers as appropriate. + void UpdateCanRunPolicy(CanRunPolicy can_run_policy); const ThreadGroup* GetThreadGroupForTraits(const TaskTraits& traits) const; diff --git a/naiveproxy/src/base/task/thread_pool/thread_pool_instance.cc b/naiveproxy/src/base/task/thread_pool/thread_pool_instance.cc index 16e6633716..00cc0bb8f2 100644 --- a/naiveproxy/src/base/task/thread_pool/thread_pool_instance.cc +++ b/naiveproxy/src/base/task/thread_pool/thread_pool_instance.cc @@ -47,28 +47,6 @@ ThreadPoolInstance::InitParams::InitParams(size_t max_num_foreground_threads_in, ThreadPoolInstance::InitParams::~InitParams() = default; -ThreadPoolInstance::ScopedExecutionFence::ScopedExecutionFence() { - DCHECK(g_thread_pool); - g_thread_pool->BeginFence(); -} - -ThreadPoolInstance::ScopedExecutionFence::~ScopedExecutionFence() { - DCHECK(g_thread_pool); - g_thread_pool->EndFence(); -} - -ThreadPoolInstance::ScopedBestEffortExecutionFence:: - ScopedBestEffortExecutionFence() { - DCHECK(g_thread_pool); - g_thread_pool->BeginBestEffortFence(); -} - -ThreadPoolInstance::ScopedBestEffortExecutionFence:: - ~ScopedBestEffortExecutionFence() { - DCHECK(g_thread_pool); - g_thread_pool->EndBestEffortFence(); -} - ThreadPoolInstance::ScopedRestrictedTasks::ScopedRestrictedTasks() { DCHECK(g_thread_pool); g_thread_pool->BeginRestrictedTasks(); diff --git a/naiveproxy/src/base/task/thread_pool/thread_pool_instance.h b/naiveproxy/src/base/task/thread_pool/thread_pool_instance.h index 079b7c2dd0..32751b75eb 100644 --- a/naiveproxy/src/base/task/thread_pool/thread_pool_instance.h +++ b/naiveproxy/src/base/task/thread_pool/thread_pool_instance.h @@ -95,32 +95,6 @@ class BASE_EXPORT ThreadPoolInstance { #endif }; - // A Scoped(BestEffort)ExecutionFence prevents new tasks of any/BEST_EFFORT - // priority from being scheduled in ThreadPoolInstance within its scope. - // Multiple fences can exist at the same time. Upon destruction of all - // Scoped(BestEffort)ExecutionFences, tasks that were preeempted are released. - // Note: the constructor of Scoped(BestEffort)ExecutionFence will not wait for - // currently running tasks (as they were posted before entering this scope and - // do not violate the contract; some of them could be CONTINUE_ON_SHUTDOWN and - // waiting for them to complete is ill-advised). - class BASE_EXPORT ScopedExecutionFence { - public: - ScopedExecutionFence(); - ScopedExecutionFence(const ScopedExecutionFence&) = delete; - ScopedExecutionFence& operator=(const ScopedExecutionFence&) = delete; - ~ScopedExecutionFence(); - }; - - class BASE_EXPORT ScopedBestEffortExecutionFence { - public: - ScopedBestEffortExecutionFence(); - ScopedBestEffortExecutionFence(const ScopedBestEffortExecutionFence&) = - delete; - ScopedBestEffortExecutionFence& operator=( - const ScopedBestEffortExecutionFence&) = delete; - ~ScopedBestEffortExecutionFence(); - }; - // Used to restrict the maximum number of concurrent tasks that can run in a // scope. class BASE_EXPORT ScopedRestrictedTasks { @@ -258,6 +232,8 @@ class BASE_EXPORT ThreadPoolInstance { static ThreadPoolInstance* Get(); private: + friend class ScopedBestEffortExecutionFence; + friend class ScopedThreadPoolExecutionFence; friend class ThreadPoolTestHelpers; friend class gin::V8Platform; friend class content::BrowserMainLoopTest_CreateThreadsInSingleProcess_Test; diff --git a/naiveproxy/src/base/test/BUILD.gn b/naiveproxy/src/base/test/BUILD.gn index 9932446936..3ce8362168 100644 --- a/naiveproxy/src/base/test/BUILD.gn +++ b/naiveproxy/src/base/test/BUILD.gn @@ -49,6 +49,8 @@ rust_static_library("test_rust_logger_consumer") { static_library("test_support") { testonly = true sources = [ + "../memory/mock_memory_pressure_listener.cc", + "../memory/mock_memory_pressure_listener.h", "../memory_coordinator/mock_memory_consumer.cc", "../memory_coordinator/mock_memory_consumer.h", "../memory_coordinator/test_memory_consumer_registry.cc", @@ -96,6 +98,8 @@ static_library("test_support") { "manual_hang_watcher.h", "metrics/action_suffix_reader.cc", "metrics/action_suffix_reader.h", + "metrics/action_variants_reader.cc", + "metrics/action_variants_reader.h", "metrics/histogram_enum_reader.cc", "metrics/histogram_enum_reader.h", "metrics/histogram_tester.cc", @@ -141,6 +145,8 @@ static_library("test_support") { "scoped_command_line.h", "scoped_feature_list.cc", "scoped_feature_list.h", + "scoped_libc_timezone_override.cc", + "scoped_libc_timezone_override.h", "scoped_mock_clock_override.cc", "scoped_mock_clock_override.h", "scoped_mock_time_message_loop_task_runner.cc", @@ -427,16 +433,6 @@ static_library("run_all_unittests") { deps = [ ":test_support" ] } -# These sources are linked into both the base_unittests binary and the test -# shared library target below. -source_set("native_library_test_utils") { - testonly = true - sources = [ - "native_library_test_utils.cc", - "native_library_test_utils.h", - ] -} - # This shared library is dynamically loaded by ImmediateCrash unittests. shared_library("immediate_crash_test_helper") { sources = [ "immediate_crash_test_helper.cc" ] @@ -467,8 +463,6 @@ shared_library("immediate_crash_test_helper") { shared_library("test_shared_library") { testonly = true sources = [ "test_shared_library.cc" ] - - deps = [ ":native_library_test_utils" ] } if (is_ios) { @@ -478,8 +472,6 @@ if (is_ios) { info_plist = "ios/native-library-Info.plist" sources = [ "test_shared_library.cc" ] - - deps = [ ":native_library_test_utils" ] } } @@ -524,6 +516,7 @@ if (is_android) { "//base:base_java", "//base:content_uri_utils_java", "//base:process_launcher_java", + "//base:virtual_document_path_java", "//testing/android/native_test:native_main_runner_java", "//third_party/android_deps:com_google_code_findbugs_jsr305_java", "//third_party/jni_zero:jni_zero_java", diff --git a/naiveproxy/src/base/test/android/content_uri_test_utils.cc b/naiveproxy/src/base/test/android/content_uri_test_utils.cc index 0785325351..d14d7951e4 100644 --- a/naiveproxy/src/base/test/android/content_uri_test_utils.cc +++ b/naiveproxy/src/base/test/android/content_uri_test_utils.cc @@ -6,10 +6,11 @@ #include -#include "base/android/build_info.h" +#include "base/android/apk_info.h" #include "base/android/path_utils.h" #include "base/files/file_path.h" #include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" #include "base/strings/escape.h" #include "base/strings/strcat.h" @@ -26,10 +27,10 @@ std::optional GetInMemoryContentDocumentUriFromCacheDirPath( if (!cache_dir.AppendRelativePath(path, &document_id)) { return std::nullopt; } - base::FilePath uri(base::StrCat( - {"content://", base::android::BuildInfo::GetInstance()->package_name(), - ".docprov/", is_tree ? "tree/" : "document/", - base::EscapeAllExceptUnreserved(document_id.value())})); + base::FilePath uri( + base::StrCat({"content://", base::android::apk_info::package_name(), + ".docprov/", is_tree ? "tree/" : "document/", + base::EscapeAllExceptUnreserved(document_id.value())})); return uri; } } // namespace @@ -40,9 +41,9 @@ std::optional GetContentUriFromCacheDirFilePath( if (!base::android::GetCacheDirectory(&cache_dir)) { return std::nullopt; } - base::FilePath uri(base::StrCat( - {"content://", base::android::BuildInfo::GetInstance()->package_name(), - ".fileprovider/cache/"})); + base::FilePath uri( + base::StrCat({"content://", base::android::apk_info::package_name(), + ".fileprovider/cache/"})); if (!cache_dir.AppendRelativePath(path, &uri)) { return std::nullopt; } @@ -55,9 +56,9 @@ std::optional GetInMemoryContentUriFromCacheDirFilePath( if (!base::android::GetCacheDirectory(&cache_dir)) { return std::nullopt; } - base::FilePath uri(base::StrCat( - {"content://", base::android::BuildInfo::GetInstance()->package_name(), - ".inmemory/cache/"})); + base::FilePath uri( + base::StrCat({"content://", base::android::apk_info::package_name(), + ".inmemory/cache/"})); if (!cache_dir.AppendRelativePath(path, &uri)) { return std::nullopt; } @@ -84,4 +85,14 @@ std::optional GetVirtualDocumentPathFromCacheDirDirectory( return base::ResolveToVirtualDocumentPath(*content_url); } +std::optional CreateCacheCopyAndGetContentUri( + const FilePath& source_path, + const ScopedTempDir& temp_dir) { + if (!base::CopyDirectory(source_path, temp_dir.GetPath(), true)) { + return std::nullopt; + } + return GetInMemoryContentTreeUriFromCacheDirDirectory( + temp_dir.GetPath().Append(source_path.BaseName())); +} + } // namespace base::test::android diff --git a/naiveproxy/src/base/test/android/content_uri_test_utils.h b/naiveproxy/src/base/test/android/content_uri_test_utils.h index b971d4ab4a..dfdf87c603 100644 --- a/naiveproxy/src/base/test/android/content_uri_test_utils.h +++ b/naiveproxy/src/base/test/android/content_uri_test_utils.h @@ -9,6 +9,7 @@ namespace base { class FilePath; +class ScopedTempDir; namespace test::android { @@ -40,6 +41,17 @@ std::optional GetInMemoryContentTreeUriFromCacheDirDirectory( std::optional GetVirtualDocumentPathFromCacheDirDirectory( const FilePath& path); +// Copies a source directory into an existing ScopedTempDir and generates a +// content URI for it. +// +// This is a workaround for Android security policies that prevent loading +// extensions directly from the file system. This function enables tests by +// copying the extension directory to a temporary location and resolving it to +// a content URI, which can then be used for extension packing. +std::optional CreateCacheCopyAndGetContentUri( + const FilePath& source_path, + const ScopedTempDir& temp_dir); + } // namespace test::android } // namespace base diff --git a/naiveproxy/src/base/test/bind.h b/naiveproxy/src/base/test/bind.h index 9ca960e6e7..d1b4b70328 100644 --- a/naiveproxy/src/base/test/bind.h +++ b/naiveproxy/src/base/test/bind.h @@ -60,8 +60,9 @@ struct BindLambdaForTestingHelper { static auto BindLambdaForTesting(Lambda&& lambda) { if constexpr (kHasConstCallOperator) { - // If WTF::BindRepeating is available, and a callback argument is in WTF, - // then this call is ambiguous without the full namespace path. + // If blink::BindRepeating is available, and a callback argument is in + // the blink namespace, then this call is ambiguous without the full + // namespace path. return ::base::BindRepeating(&Run, std::forward(lambda)); } else if constexpr (IsNonConstRvalueRef<>::value) { // Since a mutable lambda potentially can invalidate its state after being diff --git a/naiveproxy/src/base/test/gmock_callback_support.h b/naiveproxy/src/base/test/gmock_callback_support.h index 3d5638abe2..1dd09a24f4 100644 --- a/naiveproxy/src/base/test/gmock_callback_support.h +++ b/naiveproxy/src/base/test/gmock_callback_support.h @@ -104,6 +104,9 @@ auto RunOnceClosure() { // the N-th (0-based) argument of the mock function, with arguments p1, p2, ..., // p_k. // +// Since testing::InvokeArgument does not work with base::OnceCallback, use +// this and other helpers in this header to support mocking callbacks. +// // Notes: // // 1. The arguments are passed by value by default. If you need to diff --git a/naiveproxy/src/base/test/ios/wait_util.h b/naiveproxy/src/base/test/ios/wait_util.h index 5665bf65d9..132425999c 100644 --- a/naiveproxy/src/base/test/ios/wait_util.h +++ b/naiveproxy/src/base/test/ios/wait_util.h @@ -33,7 +33,7 @@ constexpr TimeDelta kWaitForActionTimeout = Seconds(10); // Constant for timeout while waiting for clear browsing data. It seems this // can take a very long time on the bots when running simulators in parallel. // TODO(crbug.com/41475878): Investigate why this is sometimes very slow. -constexpr TimeDelta kWaitForClearBrowsingDataTimeout = Seconds(45); +constexpr TimeDelta kWaitForClearBrowsingDataTimeout = Seconds(60); // Constant for timeout while waiting for cookies operations to complete. constexpr TimeDelta kWaitForCookiesTimeout = Seconds(4); diff --git a/naiveproxy/src/base/test/launcher/test_launcher.cc b/naiveproxy/src/base/test/launcher/test_launcher.cc index 41f571607a..cdf5a6e7af 100644 --- a/naiveproxy/src/base/test/launcher/test_launcher.cc +++ b/naiveproxy/src/base/test/launcher/test_launcher.cc @@ -880,9 +880,8 @@ void TestRunner::Run(const std::vector& test_names) { { AutoLock auto_lock(lock_); - tests_to_run_ = test_names; // Reverse test order to avoid copying the whole vector when removing tests. - std::reverse(tests_to_run_.begin(), tests_to_run_.end()); + tests_to_run_ = {test_names.rbegin(), test_names.rend()}; } job_handle_ = base::PostJob( diff --git a/naiveproxy/src/base/test/launcher/test_launcher_test_utils.cc b/naiveproxy/src/base/test/launcher/test_launcher_test_utils.cc index 89a1634340..79621d280a 100644 --- a/naiveproxy/src/base/test/launcher/test_launcher_test_utils.cc +++ b/naiveproxy/src/base/test/launcher/test_launcher_test_utils.cc @@ -156,7 +156,8 @@ std::optional ReadSummary(const FilePath& path) { const int size = 2e7; std::string json; CHECK(ReadFileToStringWithMaxSize(path, &json, size)); - std::optional value = JSONReader::Read(json); + std::optional value = + JSONReader::Read(json, JSON_PARSE_CHROMIUM_EXTENSIONS); if (value && value->is_dict()) { result = std::move(*value).TakeDict(); } diff --git a/naiveproxy/src/base/test/launcher/test_results_tracker.cc b/naiveproxy/src/base/test/launcher/test_results_tracker.cc index fe34e14c5d..0641d9b37f 100644 --- a/naiveproxy/src/base/test/launcher/test_results_tracker.cc +++ b/naiveproxy/src/base/test/launcher/test_results_tracker.cc @@ -631,8 +631,8 @@ bool TestResultsTracker::SaveSummaryAsJSON( } summary_root.Set("test_locations", std::move(test_locations)); - std::string json; - if (!JSONWriter::Write(summary_root, &json)) { + std::optional json = WriteJson(summary_root); + if (!json.has_value()) { return false; } @@ -640,7 +640,7 @@ bool TestResultsTracker::SaveSummaryAsJSON( if (!output.IsValid()) { return false; } - if (!output.WriteAtCurrentPosAndCheck(base::as_byte_span(json))) { + if (!output.WriteAtCurrentPosAndCheck(base::as_byte_span(json.value()))) { return false; } diff --git a/naiveproxy/src/base/test/metrics/action_variants_reader.cc b/naiveproxy/src/base/test/metrics/action_variants_reader.cc new file mode 100644 index 0000000000..8f73896b39 --- /dev/null +++ b/naiveproxy/src/base/test/metrics/action_variants_reader.cc @@ -0,0 +1,220 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/test/metrics/action_variants_reader.h" + +#include +#include +#include +#include +#include + +#include "base/check.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/path_service.h" +#include "base/test/gtest_util.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/libxml/chromium/xml_reader.h" + +namespace base::test { + +namespace { + +// Parses a ... block from the XML file. +// Variants name passed as logging context in case of failure. +// The reader must be positioned on the node. +// Returns nullopt if parsing fails or the block is empty. +std::optional ParseVariants( + std::string_view logging_context, + XmlReader& reader, + std::string_view separator) { + if (reader.IsEmptyElement()) { + return std::nullopt; + } + + ActionVariantsEntryMap variants; + const int parent_depth = reader.Depth(); + bool success = true; + + // The reader is on the node. We need to read until we find the + // closing tag. + while (reader.Read() && reader.Depth() > parent_depth) { + if (!reader.IsElement()) { + continue; + } + if (reader.NodeName() != "variant") { + ADD_FAILURE() << "Unexpected node in variants block " << logging_context + << ": " << reader.NodeName(); + // Do not return yet, identify all bad variants. + success = false; + continue; + } + std::string name; + std::string summary; + if (!reader.NodeAttribute("name", &name) || + !reader.NodeAttribute("summary", &summary)) { + ADD_FAILURE() << "Variant in " << logging_context + << " is missing name or summary."; + // Do not return yet, identify all bad variants. + success = false; + continue; + } + // Do not count the base variant with empty name, such that in the example + // below we count 2 variants, not 3: + // + // + // + // + // + if (name.empty()) { + continue; + } + + // Variants in the xml file start with the separator. If a symbol was + // passed in place of separator argument, and the variant name starts + // with that symbol, omit it. + if (!separator.empty() && name.starts_with(separator)) { + name = name.substr(1); + } + variants[name] = summary; + } + + if (!success || variants.empty()) { + return std::nullopt; + } + + return variants; +} + +// Parses an node to find the variants for `affected_action`. +// Returns true if the action was found, in which case `result` will be +// populated and the calling loop should terminate. +bool ParseActionNode( + XmlReader& reader, + std::string_view affected_action, + const std::map& global_variants, + std::vector& result, + std::string_view separator) { + std::string name; + if (!reader.NodeAttribute("name", &name)) { + return false; + } + + // In case of patterned action with {variant}, identify the base action name. + // Locate the first bracket and return the preceding substring. + std::string base_name = name; + const size_t brace_pos = name.find('{'); + if (brace_pos != std::string::npos) { + base_name = name.substr(0, brace_pos); + } + + if (base_name != affected_action) { + return false; + } + if (reader.IsEmptyElement()) { + return false; + } + // Found the action. Now parse its tokens. + const int parent_depth = reader.Depth(); + while (reader.Read() && reader.Depth() > parent_depth) { + if (!reader.IsElement() || reader.NodeName() != "token") { + continue; + } + + std::string variants_name; + if (reader.NodeAttribute("variants", &variants_name)) { + // Out-of-line variants. + auto it = global_variants.find(variants_name); + if (it == global_variants.end()) { + ADD_FAILURE() << "Variants block not found: " << variants_name; + return false; + } + result.push_back(it->second); + } else { + auto variants = ParseVariants("inline", reader, separator); + if (variants) { + result.push_back(std::move(*variants)); + } + } + } + // We found the action and processed it, so we can stop. + return true; +} + +std::vector ReadActionVariantsForActionImpl( + XmlReader& reader, + std::string_view affected_action, + std::string_view separator) { + std::vector result; + std::map global_variants; + + // This is a manual depth-first traversal of the XML tree. We read each node + // and only process the ones we care about. This is much safer than using + // SkipToElement() and prevents the infinite loops that were causing timeouts. + while (reader.Read()) { + if (!reader.IsElement()) { + continue; + } + + const std::string node_name = reader.NodeName(); + + // The blocks are expected to appear before any + // blocks that may use them. + if (node_name == "variants") { + std::string variants_name; + if (reader.NodeAttribute("name", &variants_name)) { + auto variants = ParseVariants(variants_name, reader, separator); + if (variants) { + global_variants[variants_name] = std::move(*variants); + } + } + } else if (node_name == "action") { + if (ParseActionNode(reader, affected_action, global_variants, result, + separator)) { + // We found the action and processed it, so we can stop. + return result; + } + } + } + + return result; +} + +} // namespace + +std::vector ReadActionVariantsForAction( + std::string_view action_name, + std::string_view separator) { + base::FilePath actions_xml_path; + // This path is from //chrome/test/data/ + CHECK( + base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &actions_xml_path)); + actions_xml_path = actions_xml_path.AppendASCII("tools") + .AppendASCII("metrics") + .AppendASCII("actions") + .AppendASCII("actions.xml"); + std::string xml_string; + if (!base::ReadFileToString(actions_xml_path, &xml_string)) { + ADD_FAILURE() << "Could not read " << actions_xml_path; + return {}; + } + XmlReader reader; + if (!reader.Load(xml_string)) { + ADD_FAILURE() << "Failed to load XML from string."; + return {}; + } + return ReadActionVariantsForActionImpl(reader, action_name, separator); +} + +std::vector ReadActionVariantsForActionFromXmlString( + std::string_view xml_string, + std::string_view action_name, + std::string_view separator) { + XmlReader reader; + CHECK(reader.Load(xml_string)); + return ReadActionVariantsForActionImpl(reader, action_name, separator); +} + +} // namespace base::test diff --git a/naiveproxy/src/base/test/metrics/action_variants_reader.h b/naiveproxy/src/base/test/metrics/action_variants_reader.h new file mode 100644 index 0000000000..5174575d54 --- /dev/null +++ b/naiveproxy/src/base/test/metrics/action_variants_reader.h @@ -0,0 +1,60 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_TEST_METRICS_ACTION_VARIANTS_READER_H_ +#define BASE_TEST_METRICS_ACTION_VARIANTS_READER_H_ + +#include +#include +#include + +namespace base::test { + +// A map from a variant name to its summary. +// Variant name is substituted in the action name in place of the {token}. +// Each variant has a summary +// +// chrome-collections@google.com +// "" +// +// +// +// +// +// +// +// +using ActionVariantsEntryMap = std::map; + +// Finds and reads the variants prefixed with `action_name` from actions.xml. +// When a non-empty separator argument is passed, then any variants beginning +// with that prefix will have it omitted from their names in the result map. In +// the example action from the comment above, passing "Bookmarks.Opened"and "." +// should return 3 variants: AccountStorage, LocalStorage, LocalStorageSyncing. + +// An action can have multiple s, each with their own set of variants. +// This function returns a vector of maps, where each map corresponds to a +// element and contains the variants for that token. +// +// Useful for when you want to verify that the set of variants associated with +// a particular action actually matches the set of expected values. +// +// Returns a vector of maps from name to summary. The vector will be empty on +// failure or if the action is not found. +std::vector ReadActionVariantsForAction( + std::string_view action_name, + std::string_view separator = ""); + +// ReadActionVariantsForAction() version that reads from the given XML content. +std::vector ReadActionVariantsForActionFromXmlString( + std::string_view xml_content, + std::string_view action_name, + std::string_view separator = ""); + +} // namespace base::test + +#endif // BASE_TEST_METRICS_ACTION_VARIANTS_READER_H_ diff --git a/naiveproxy/src/base/test/metrics/histogram_tester.h b/naiveproxy/src/base/test/metrics/histogram_tester.h index 313b138aad..46b88831f5 100644 --- a/naiveproxy/src/base/test/metrics/histogram_tester.h +++ b/naiveproxy/src/base/test/metrics/histogram_tester.h @@ -37,6 +37,9 @@ class HistogramSamples; // content browser test, then content::FetchHistogramsFromChildProcesses() // should be used to achieve that. // To test histograms in Java tests, use HistogramWatcher. +// To wait for a histogram to be recorded in C++ tests, use +// StatisticsRecorder::ScopedHistogramSampleObserver or +// StatisticsRecorder::HistogramWaiter. class HistogramTester { public: using CountsMap = std::map>; diff --git a/naiveproxy/src/base/test/native_library_test_utils.cc b/naiveproxy/src/base/test/native_library_test_utils.cc deleted file mode 100644 index 3cb35561e9..0000000000 --- a/naiveproxy/src/base/test/native_library_test_utils.cc +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/test/native_library_test_utils.h" - -namespace { - -int g_static_value = 0; - -} // namespace - -extern "C" { - -int g_native_library_exported_value = 0; - -int NativeLibraryTestIncrement() { - return ++g_static_value; -} - -void NativeLibraryResetCounter() { - g_static_value = 0; -} - -} // extern "C" diff --git a/naiveproxy/src/base/test/native_library_test_utils.h b/naiveproxy/src/base/test/native_library_test_utils.h deleted file mode 100644 index 5446007b98..0000000000 --- a/naiveproxy/src/base/test/native_library_test_utils.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_TEST_NATIVE_LIBRARY_TEST_UTILS_H_ -#define BASE_TEST_NATIVE_LIBRARY_TEST_UTILS_H_ - -#include "build/build_config.h" - -#if BUILDFLAG(IS_WIN) -#define NATIVE_LIBRARY_TEST_ALWAYS_EXPORT __declspec(dllexport) -#else -#define NATIVE_LIBRARY_TEST_ALWAYS_EXPORT __attribute__((visibility("default"))) -#endif - -extern "C" { - -extern NATIVE_LIBRARY_TEST_ALWAYS_EXPORT int g_native_library_exported_value; - -// A function which increments an internal counter value and returns its value. -// The first call returns 1, then 2, etc. -NATIVE_LIBRARY_TEST_ALWAYS_EXPORT int NativeLibraryTestIncrement(); - -// A function which resets the internal counter value to 0. -NATIVE_LIBRARY_TEST_ALWAYS_EXPORT void NativeLibraryResetCounter(); - -} // extern "C" - -#endif // BASE_TEST_NATIVE_LIBRARY_TEST_UTILS_H_ diff --git a/naiveproxy/src/base/test/scoped_amount_of_physical_memory_override.cc b/naiveproxy/src/base/test/scoped_amount_of_physical_memory_override.cc index c33efc882a..6c5848eb07 100644 --- a/naiveproxy/src/base/test/scoped_amount_of_physical_memory_override.cc +++ b/naiveproxy/src/base/test/scoped_amount_of_physical_memory_override.cc @@ -10,18 +10,18 @@ namespace base::test { ScopedAmountOfPhysicalMemoryOverride::ScopedAmountOfPhysicalMemoryOverride( - uint64_t amount_of_memory_mb) { - CHECK_GT(amount_of_memory_mb, 0u); - old_amount_of_physical_memory_mb_ = - base::SysInfo::SetAmountOfPhysicalMemoryMbForTesting(amount_of_memory_mb); + ByteCount amount_of_memory) { + CHECK_GT(amount_of_memory, ByteCount(0)); + old_amount_of_physical_memory_ = + base::SysInfo::SetAmountOfPhysicalMemoryForTesting(amount_of_memory); } ScopedAmountOfPhysicalMemoryOverride::~ScopedAmountOfPhysicalMemoryOverride() { - if (old_amount_of_physical_memory_mb_) { - base::SysInfo::SetAmountOfPhysicalMemoryMbForTesting( - *old_amount_of_physical_memory_mb_); + if (old_amount_of_physical_memory_) { + base::SysInfo::SetAmountOfPhysicalMemoryForTesting( + *old_amount_of_physical_memory_); } else { - base::SysInfo::ClearAmountOfPhysicalMemoryMbForTesting(); + base::SysInfo::ClearAmountOfPhysicalMemoryForTesting(); } } diff --git a/naiveproxy/src/base/test/scoped_amount_of_physical_memory_override.h b/naiveproxy/src/base/test/scoped_amount_of_physical_memory_override.h index f8f3d36569..fce8750120 100644 --- a/naiveproxy/src/base/test/scoped_amount_of_physical_memory_override.h +++ b/naiveproxy/src/base/test/scoped_amount_of_physical_memory_override.h @@ -9,17 +9,18 @@ #include +#include "base/byte_count.h" + namespace base::test { -// Sets the amount of physical memory in MB override on construction, and -// removes it when the object goes out of scope. This class is intended to be -// used by tests that need to override the amount of physical memory on the -// system to validate different system conditions. +// Sets the amount of physical memory override on construction, and removes it +// when the object goes out of scope. This class is intended to be used by tests +// that need to override the amount of physical memory on the system to validate +// different system conditions. class ScopedAmountOfPhysicalMemoryOverride { public: - // Constructor that initializes the amount of memory override. Memory is - // specified in MB. - explicit ScopedAmountOfPhysicalMemoryOverride(uint64_t amount_of_memory_mb); + // Constructor that initializes the amount of memory override. + explicit ScopedAmountOfPhysicalMemoryOverride(ByteCount amount_of_memory); ScopedAmountOfPhysicalMemoryOverride( const ScopedAmountOfPhysicalMemoryOverride&) = delete; @@ -29,7 +30,7 @@ class ScopedAmountOfPhysicalMemoryOverride { ~ScopedAmountOfPhysicalMemoryOverride(); private: - std::optional old_amount_of_physical_memory_mb_; + std::optional old_amount_of_physical_memory_; }; } // namespace base::test diff --git a/naiveproxy/src/base/test/scoped_libc_timezone_override.cc b/naiveproxy/src/base/test/scoped_libc_timezone_override.cc new file mode 100644 index 0000000000..c22033d950 --- /dev/null +++ b/naiveproxy/src/base/test/scoped_libc_timezone_override.cc @@ -0,0 +1,33 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/test/scoped_libc_timezone_override.h" + +#include "base/check.h" +#include "base/environment.h" + +namespace base::test { +namespace { +constexpr char kTZ[] = "TZ"; +} // namespace + +ScopedLibcTimezoneOverride::ScopedLibcTimezoneOverride( + const std::string& timezone) { + auto env = base::Environment::Create(); + old_value_ = env->GetVar(kTZ); + CHECK(env->SetVar(kTZ, timezone)); + tzset(); +} + +ScopedLibcTimezoneOverride::~ScopedLibcTimezoneOverride() { + auto env = base::Environment::Create(); + if (old_value_.has_value()) { + CHECK(env->SetVar(kTZ, *old_value_)); + } else { + CHECK(env->UnSetVar(kTZ)); + } + tzset(); +} + +} // namespace base::test diff --git a/naiveproxy/src/base/test/scoped_libc_timezone_override.h b/naiveproxy/src/base/test/scoped_libc_timezone_override.h new file mode 100644 index 0000000000..8f6e7c2fa6 --- /dev/null +++ b/naiveproxy/src/base/test/scoped_libc_timezone_override.h @@ -0,0 +1,30 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_TEST_SCOPED_LIBC_TIMEZONE_OVERRIDE_H_ +#define BASE_TEST_SCOPED_LIBC_TIMEZONE_OVERRIDE_H_ + +#include +#include + +namespace base::test { + +// Temporarily sets up libc timezone to use the specified timezone. +// Restores on the destruction of this instance. +// Note that there's similar API ScopedRestoreDefaultTimezone to override +// ICU's timezone config. Both may need to be used together. +class ScopedLibcTimezoneOverride { + public: + explicit ScopedLibcTimezoneOverride(const std::string& timezone); + ScopedLibcTimezoneOverride(const ScopedLibcTimezoneOverride&) = delete; + ScopedLibcTimezoneOverride& operator=(const ScopedLibcTimezoneOverride&); + ~ScopedLibcTimezoneOverride(); + + private: + std::optional old_value_; +}; + +} // namespace base::test + +#endif // BASE_TEST_SCOPED_LIBC_TIMEZONE_OVERRIDE_H_ diff --git a/naiveproxy/src/base/test/scoped_mock_time_message_loop_task_runner.cc b/naiveproxy/src/base/test/scoped_mock_time_message_loop_task_runner.cc index 2ff81f1c44..88146272bc 100644 --- a/naiveproxy/src/base/test/scoped_mock_time_message_loop_task_runner.cc +++ b/naiveproxy/src/base/test/scoped_mock_time_message_loop_task_runner.cc @@ -21,6 +21,8 @@ ScopedMockTimeMessageLoopTaskRunner::ScopedMockTimeMessageLoopTaskRunner() // To ensure that we process any initialization tasks posted to the // MessageLoop by a test fixture before replacing its TaskRunner. RunLoop().RunUntilIdle(); + SingleThreadTaskRunner::ScopedCanOverrideMainThreadDefaultHandle + scoped_override; CurrentThread::Get()->SetTaskRunner(task_runner_); } @@ -32,6 +34,8 @@ ScopedMockTimeMessageLoopTaskRunner::~ScopedMockTimeMessageLoopTaskRunner() { pending_task.location, std::move(pending_task.task), pending_task.GetTimeToRun() - task_runner_->NowTicks()); } + SingleThreadTaskRunner::ScopedCanOverrideMainThreadDefaultHandle + scoped_override; CurrentThread::Get()->SetTaskRunner(std::move(previous_task_runner_)); } diff --git a/naiveproxy/src/base/test/scoped_mock_time_message_loop_task_runner.h b/naiveproxy/src/base/test/scoped_mock_time_message_loop_task_runner.h index 2a1e5fdeff..2862e92b6f 100644 --- a/naiveproxy/src/base/test/scoped_mock_time_message_loop_task_runner.h +++ b/naiveproxy/src/base/test/scoped_mock_time_message_loop_task_runner.h @@ -5,7 +5,7 @@ #ifndef BASE_TEST_SCOPED_MOCK_TIME_MESSAGE_LOOP_TASK_RUNNER_H_ #define BASE_TEST_SCOPED_MOCK_TIME_MESSAGE_LOOP_TASK_RUNNER_H_ -#include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" #include "base/test/test_mock_time_task_runner.h" namespace base { diff --git a/naiveproxy/src/base/test/task_environment.cc b/naiveproxy/src/base/test/task_environment.cc index eb5fb264a7..69d159a63c 100644 --- a/naiveproxy/src/base/test/task_environment.cc +++ b/naiveproxy/src/base/test/task_environment.cc @@ -86,13 +86,20 @@ base::MessagePumpType GetMessagePumpTypeForMainThreadType( std::unique_ptr CreateSequenceManagerForMainThreadType( TaskEnvironment::MainThreadType main_thread_type, - sequence_manager::SequenceManager::PrioritySettings priority_settings) { + sequence_manager::SequenceManager::PrioritySettings priority_settings, + TaskEnvironment::ScopedExecutionFenceBehaviour + scoped_execution_fence_behaviour) { auto type = GetMessagePumpTypeForMainThreadType(main_thread_type); return sequence_manager::CreateSequenceManagerOnCurrentThreadWithPump( MessagePump::Create(type), base::sequence_manager::SequenceManager::Settings::Builder() .SetMessagePumpType(type) .SetPrioritySettings(std::move(priority_settings)) + .SetIsMainThread(true) + .SetShouldBlockOnScopedFences( + scoped_execution_fence_behaviour == + TaskEnvironment::ScopedExecutionFenceBehaviour:: + MAIN_THREAD_AND_THREAD_POOL) .Build()); } @@ -417,16 +424,19 @@ TaskEnvironment::TaskEnvironment( ThreadPoolExecutionMode thread_pool_execution_mode, ThreadingMode threading_mode, ThreadPoolCOMEnvironment thread_pool_com_environment, + ScopedExecutionFenceBehaviour scoped_execution_fence_behaviour, bool subclass_creates_default_taskrunner, trait_helpers::NotATraitTag) : main_thread_type_(main_thread_type), thread_pool_execution_mode_(thread_pool_execution_mode), threading_mode_(threading_mode), thread_pool_com_environment_(thread_pool_com_environment), + scoped_execution_fence_behaviour_(scoped_execution_fence_behaviour), subclass_creates_default_taskrunner_(subclass_creates_default_taskrunner), - sequence_manager_( - CreateSequenceManagerForMainThreadType(main_thread_type, - std::move(priority_settings))), + sequence_manager_(CreateSequenceManagerForMainThreadType( + main_thread_type, + std::move(priority_settings), + scoped_execution_fence_behaviour)), mock_time_domain_( time_source != TimeSource::SYSTEM_TIME ? std::make_unique( @@ -497,9 +507,13 @@ TaskEnvironment::TestTaskTracker* TaskEnvironment::CreateThreadPool() { auto task_tracker = std::make_unique(); TestTaskTracker* raw_task_tracker = task_tracker.get(); // Disable background threads to avoid hangs when flushing background tasks. + // Also disable thread priority monitoring so that creating worker threads + // does not interfere with tests that are sensitive to creation of new + // histograms. auto thread_pool = std::make_unique( std::string(), std::move(task_tracker), - /*use_background_threads=*/false); + /*use_background_threads=*/false, + /*monitor_worker_thread_priorities=*/false); ThreadPoolInstance::Set(std::move(thread_pool)); DCHECK(!g_task_tracker); g_task_tracker = raw_task_tracker; diff --git a/naiveproxy/src/base/test/task_environment.h b/naiveproxy/src/base/test/task_environment.h index 0fe6347ec1..ee2dceb62a 100644 --- a/naiveproxy/src/base/test/task_environment.h +++ b/naiveproxy/src/base/test/task_environment.h @@ -10,7 +10,7 @@ #include "base/compiler_specific.h" #include "base/functional/callback_forward.h" #include "base/memory/raw_ptr.h" -#include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" #include "base/observer_list_types.h" #include "base/run_loop.h" #include "base/task/lazy_thread_pool_task_runner.h" @@ -186,6 +186,19 @@ class TaskEnvironment { DEFAULT = COM_MTA, }; + // Defines how the scoped execution fences defined in + // base/task/execution_fence.h interact with TaskEnvironment threads. + enum class ScopedExecutionFenceBehaviour { + // Scoped execution fences only block tasks on the ThreadPool. + THREAD_POOL_ONLY, + // Scoped execution fences block tasks on the main thread as well as the + // ThreadPool. (Except for ScopedThreadPoolExecutionFence which only ever + // affects the ThreadPool.) + MAIN_THREAD_AND_THREAD_POOL, + + DEFAULT = THREAD_POOL_ONLY + }; + // List of traits that are valid inputs for the constructor below. struct ValidTraits { ValidTraits(TimeSource); @@ -194,6 +207,7 @@ class TaskEnvironment { ValidTraits(SubclassCreatesDefaultTaskRunner); ValidTraits(ThreadingMode); ValidTraits(ThreadPoolCOMEnvironment); + ValidTraits(ScopedExecutionFenceBehaviour); }; // Constructor accepts zero or more traits which customize the testing @@ -425,6 +439,9 @@ class TaskEnvironment { trait_helpers::GetEnum( traits...), + trait_helpers::GetEnum( + traits...), trait_helpers::HasTrait(), trait_helpers::NotATraitTag()) {} @@ -473,6 +490,7 @@ class TaskEnvironment { ThreadPoolExecutionMode thread_pool_execution_mode, ThreadingMode threading_mode, ThreadPoolCOMEnvironment thread_pool_com_environment, + ScopedExecutionFenceBehaviour scoped_execution_fence_behaviour, bool subclass_creates_default_taskrunner, trait_helpers::NotATraitTag tag); @@ -480,6 +498,7 @@ class TaskEnvironment { const ThreadPoolExecutionMode thread_pool_execution_mode_; const ThreadingMode threading_mode_; const ThreadPoolCOMEnvironment thread_pool_com_environment_; + const ScopedExecutionFenceBehaviour scoped_execution_fence_behaviour_; const bool subclass_creates_default_taskrunner_; std::unique_ptr sequence_manager_; diff --git a/naiveproxy/src/base/test/task_runner_test_template.h b/naiveproxy/src/base/test/task_runner_test_template.h index 835c6d6884..34352dcbd5 100644 --- a/naiveproxy/src/base/test/task_runner_test_template.h +++ b/naiveproxy/src/base/test/task_runner_test_template.h @@ -59,6 +59,7 @@ #include "base/task/single_thread_task_runner.h" #include "base/task/task_runner.h" #include "base/threading/thread.h" +#include "base/time/time.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { diff --git a/naiveproxy/src/base/test/test_discardable_memory_allocator.cc b/naiveproxy/src/base/test/test_discardable_memory_allocator.cc index b2d042cdae..124e7023f2 100644 --- a/naiveproxy/src/base/test/test_discardable_memory_allocator.cc +++ b/naiveproxy/src/base/test/test_discardable_memory_allocator.cc @@ -9,6 +9,7 @@ #include "base/check.h" #include "base/compiler_specific.h" +#include "base/containers/heap_array.h" #include "base/memory/discardable_memory.h" #include "base/memory/ptr_util.h" @@ -18,7 +19,7 @@ namespace { class DiscardableMemoryImpl : public DiscardableMemory { public: explicit DiscardableMemoryImpl(size_t size) - : data_(new uint8_t[size]), size_(size) {} + : data_(base::HeapArray::Uninit(size)) {} // Overridden from DiscardableMemory: bool Lock() override { @@ -32,12 +33,12 @@ class DiscardableMemoryImpl : public DiscardableMemory { is_locked_ = false; // Force eviction to catch clients not correctly checking the return value // of Lock(). - UNSAFE_TODO(memset(data_.get(), 0, size_)); + UNSAFE_TODO(memset(data_.data(), 0, data_.size())); } void* data() const override { DCHECK(is_locked_); - return data_.get(); + return const_cast(data_.data()); } void DiscardForTesting() override {} @@ -50,8 +51,7 @@ class DiscardableMemoryImpl : public DiscardableMemory { private: bool is_locked_ = true; - std::unique_ptr data_; - size_t size_; + base::HeapArray data_; }; } // namespace diff --git a/naiveproxy/src/base/test/test_file_util.cc b/naiveproxy/src/base/test/test_file_util.cc index dd049f1461..66c07ff88e 100644 --- a/naiveproxy/src/base/test/test_file_util.cc +++ b/naiveproxy/src/base/test/test_file_util.cc @@ -6,10 +6,12 @@ #include +#include "base/containers/contains.h" #include "base/files/file_enumerator.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/logging.h" +#include "base/no_destructor.h" #include "base/test/test_timeouts.h" #include "base/threading/platform_thread.h" #include "base/threading/thread_restrictions.h" @@ -58,12 +60,34 @@ class PathDeleterOnTestEnd : public testing::EmptyTestEventListener { base::FileEnumerator enumerator( file_path, true, base::FileEnumerator::FILES | FileEnumerator::DIRECTORIES); + int num_non_ignored_files = 0; for (base::FilePath failed_to_delete = enumerator.Next(); !failed_to_delete.empty(); failed_to_delete = enumerator.Next()) { +#if BUILDFLAG(IS_WIN) + // Ignore failure to delete a directory. Most likely, it's because + // we failed to delete one or more files or subdirectories in the + // directory. Otherwise, the paths allowed to leak would all have to + // be top-level sub-directories of `file_path`. This could be worked + // around, but it's not worth complicating the code. + if (enumerator.GetInfo().IsDirectory()) { + continue; + } + // Ignore this file if its path contains one of the sub-path names + // known to leak on Windows. If not, the test will fail. + if (!std::ranges::any_of( + GetPathsAllowedToLeak(), + [&failed_to_delete = + failed_to_delete.value()](const auto& allowed_to_leak) { + return base::Contains(failed_to_delete, allowed_to_leak); + })) { + ++num_non_ignored_files; + } +#endif // BUILDFLAG(IS_WIN) LOG(WARNING) << "failed to delete " << failed_to_delete; } - ADD_FAILURE() << "Failed to delete temporary directory for testing: " - << file_path; + EXPECT_EQ(num_non_ignored_files, 0) + << "Failed to delete temporary directory for testing: " + << file_path; } } file_paths_to_delete_.clear(); @@ -112,6 +136,13 @@ FilePath GetTempDirForTesting() { return path; } +#if BUILDFLAG(IS_WIN) +std::vector& GetPathsAllowedToLeak() { + static base::NoDestructor> paths_allowed_to_leak; + return *paths_allowed_to_leak; +} +#endif // BUILDFLAG(IS_WIN) + FilePath CreateUniqueTempDirectoryScopedToTest() { ScopedAllowBlockingForTesting allow_blocking; FilePath path; diff --git a/naiveproxy/src/base/test/test_file_util.h b/naiveproxy/src/base/test/test_file_util.h index 542792904c..5acd025d99 100644 --- a/naiveproxy/src/base/test/test_file_util.h +++ b/naiveproxy/src/base/test/test_file_util.h @@ -39,6 +39,17 @@ bool DieFileDie(const FilePath& file, bool recurse); // `base::FilePath`. FilePath GetTempDirForTesting(); +#if BUILDFLAG(IS_WIN) +// Returns the collection of sub-paths that, if found within the path to files +// that cannot be deleted at test end, do not trigger test failure. +// The goal is get rid of the leaking paths one by one, and ultimately the need +// for this function, but allows us to get back our test coverage for the many +// browser and interactive_ui_tests that have been disabled because of leaking +// files, while still catching new leaks. See crbug.com/410751413 for more +// details. Note that the sub-path name comparisons are case-sensitive. +std::vector& GetPathsAllowedToLeak(); +#endif // BUILDFLAG(IS_WIN) + // Creates a a new unique directory and returns the generated path. The // directory will be automatically deleted when the test completes. Failure // upon creation or deletion will cause a test failure. diff --git a/naiveproxy/src/base/test/test_io_thread.h b/naiveproxy/src/base/test/test_io_thread.h index ce895a17d4..8738d602ee 100644 --- a/naiveproxy/src/base/test/test_io_thread.h +++ b/naiveproxy/src/base/test/test_io_thread.h @@ -7,7 +7,7 @@ #include "base/compiler_specific.h" #include "base/functional/callback_forward.h" -#include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" #include "base/task/task_runner.h" #include "base/threading/thread.h" diff --git a/naiveproxy/src/base/test/test_shared_library.cc b/naiveproxy/src/base/test/test_shared_library.cc index 56bfaa95c8..72774323f7 100644 --- a/naiveproxy/src/base/test/test_shared_library.cc +++ b/naiveproxy/src/base/test/test_shared_library.cc @@ -2,29 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/test/native_library_test_utils.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +#define NATIVE_LIBRARY_TEST_ALWAYS_EXPORT __declspec(dllexport) +#else +#define NATIVE_LIBRARY_TEST_ALWAYS_EXPORT __attribute__((visibility("default"))) +#endif extern "C" { -int NATIVE_LIBRARY_TEST_ALWAYS_EXPORT GetExportedValue() { - return g_native_library_exported_value; -} - -void NATIVE_LIBRARY_TEST_ALWAYS_EXPORT SetExportedValue(int value) { - g_native_library_exported_value = value; -} - // A test function used only to verify basic dynamic symbol resolution. int NATIVE_LIBRARY_TEST_ALWAYS_EXPORT GetSimpleTestValue() { return 5; } -// When called by |NativeLibraryTest.LoadLibraryPreferOwnSymbols|, this should -// forward to the local definition of NativeLibraryTestIncrement(), even though -// the test module also links in the native_library_test_utils source library -// which exports it. -int NATIVE_LIBRARY_TEST_ALWAYS_EXPORT GetIncrementValue() { - return NativeLibraryTestIncrement(); -} - } // extern "C" diff --git a/naiveproxy/src/base/test/test_suite.cc b/naiveproxy/src/base/test/test_suite.cc index c7f973f99e..5084e1f821 100644 --- a/naiveproxy/src/base/test/test_suite.cc +++ b/naiveproxy/src/base/test/test_suite.cc @@ -96,6 +96,7 @@ #include #include "base/debug/handle_hooks_win.h" +#include "base/win/win_util.h" #endif // BUILDFLAG(IS_WIN) #if PA_BUILDFLAG(USE_PARTITION_ALLOC) @@ -159,8 +160,12 @@ class ResetCommandLineBetweenTests : public testing::EmptyTestEventListener { // to initialize them manually. class FeatureListScopedToEachTest : public testing::EmptyTestEventListener { public: - FeatureListScopedToEachTest() = default; - ~FeatureListScopedToEachTest() override = default; + FeatureListScopedToEachTest() { + instance_ = this; + } + ~FeatureListScopedToEachTest() override { + instance_ = nullptr; + } FeatureListScopedToEachTest(const FeatureListScopedToEachTest&) = delete; FeatureListScopedToEachTest& operator=(const FeatureListScopedToEachTest&) = @@ -182,10 +187,20 @@ class FeatureListScopedToEachTest : public testing::EmptyTestEventListener { scoped_feature_list_.Reset(); } + static void Reset() { + if (instance_) { + instance_->scoped_feature_list_.Reset(); + } + } + private: test::ScopedFeatureList scoped_feature_list_; + + static FeatureListScopedToEachTest* instance_; }; +FeatureListScopedToEachTest* FeatureListScopedToEachTest::instance_ = nullptr; + class CheckForLeakedGlobals : public testing::EmptyTestEventListener { public: CheckForLeakedGlobals() = default; @@ -444,6 +459,10 @@ void TestSuite::DisableCheckForLeakedGlobals() { check_for_leaked_globals_ = false; } +void TestSuite::ResetScopedFeatureListInstance() { + FeatureListScopedToEachTest::Reset(); +} + void TestSuite::UnitTestAssertHandler(const char* file, int line, std::string_view summary, @@ -591,6 +610,11 @@ void TestSuite::Initialize() { // Make sure we run with high resolution timer to minimize differences // between production code and test code. Time::EnableHighResolutionTimer(true); + + if (!command_line->HasSwitch( + ::switches::kDisableStrictHandleCheckingForTesting)) { + PCHECK(win::EnableStrictHandleCheckingForCurrentProcess()); + } #endif // BUILDFLAG(IS_WIN) // In some cases, we do not want to see standard error dialogs. diff --git a/naiveproxy/src/base/test/test_suite.h b/naiveproxy/src/base/test/test_suite.h index a2958f1edf..0e78148921 100644 --- a/naiveproxy/src/base/test/test_suite.h +++ b/naiveproxy/src/base/test/test_suite.h @@ -64,6 +64,11 @@ class TestSuite { // Disables checks for certain global objects being leaked across tests. void DisableCheckForLeakedGlobals(); + // Resets the ScopedFeatureList instance that is initialized for each test. + // This may be needed in cases where there's an exit() in the middle of a test + // that has its own ScopedFeatureList, such as fuzz tests. + static void ResetScopedFeatureListInstance(); + protected: // By default fatal log messages (e.g. from DCHECKs) result in error dialogs // which gum up buildbots. Use a minimalistic assert handler which just diff --git a/naiveproxy/src/base/test/test_support_ios.mm b/naiveproxy/src/base/test/test_support_ios.mm index 902b33cabc..0f584dbe9a 100644 --- a/naiveproxy/src/base/test/test_support_ios.mm +++ b/naiveproxy/src/base/test/test_support_ios.mm @@ -40,11 +40,12 @@ namespace { void PopulateUIWindow(UIWindow* window) { window.backgroundColor = UIColor.whiteColor; [window makeKeyAndVisible]; - CGRect bounds = UIScreen.mainScreen.bounds; + CGRect bounds = window.windowScene.screen.bounds; // Add a label with the app name. UILabel* label = [[UILabel alloc] initWithFrame:bounds]; label.text = NSProcessInfo.processInfo.processName; label.textAlignment = NSTextAlignmentCenter; + label.textColor = UIColor.blackColor; [window addSubview:label]; // An NSInternalInconsistencyException is thrown if the app doesn't have a diff --git a/naiveproxy/src/base/test/test_switches.cc b/naiveproxy/src/base/test/test_switches.cc index b1f00aff4b..eb40bcf195 100644 --- a/naiveproxy/src/base/test/test_switches.cc +++ b/naiveproxy/src/base/test/test_switches.cc @@ -154,3 +154,10 @@ const char switches::kEnableRunIOSUnittestsWithXCTest[] = const char switches::kWriteCompiledTestsJsonToWritablePath[] = "write-compiled-tests-json-to-writable-path"; #endif + +#if BUILDFLAG(IS_WIN) +// Disable strict handle checking for the test process, for testing. This can be +// used if it's expected that a test process will use an invalid handle. +const char switches::kDisableStrictHandleCheckingForTesting[] = + "disable-strict-handle-checking-for-testing"; +#endif // BUILDFLAG(IS_WIN) diff --git a/naiveproxy/src/base/test/test_switches.h b/naiveproxy/src/base/test/test_switches.h index 8ffc3c0b83..6abd3d079e 100644 --- a/naiveproxy/src/base/test/test_switches.h +++ b/naiveproxy/src/base/test/test_switches.h @@ -51,6 +51,10 @@ extern const char kEnableRunIOSUnittestsWithXCTest[]; extern const char kWriteCompiledTestsJsonToWritablePath[]; #endif +#if BUILDFLAG(IS_WIN) +extern const char kDisableStrictHandleCheckingForTesting[]; +#endif + } // namespace switches #endif // BASE_TEST_TEST_SWITCHES_H_ diff --git a/naiveproxy/src/base/test/test_timeouts.cc b/naiveproxy/src/base/test/test_timeouts.cc index 0b5b7c4424..41d4430cef 100644 --- a/naiveproxy/src/base/test/test_timeouts.cc +++ b/naiveproxy/src/base/test/test_timeouts.cc @@ -82,8 +82,8 @@ void InitializeTimeout(const char* switch_name, constexpr int kTimeoutMultiplier = 3; #elif !defined(NDEBUG) && BUILDFLAG(IS_CHROMEOS) constexpr int kTimeoutMultiplier = kAshBaseMultiplier; -#elif !defined(NDEBUG) && BUILDFLAG(IS_MAC) - // A lot of browser_tests on Mac debug time out. +#elif !defined(NDEBUG) && (BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)) + // A lot of browser_tests on Mac and Linux debug time out. constexpr int kTimeoutMultiplier = 2; #elif BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(IS_CHROMEOS_DEVICE) // For test running on ChromeOS device/VM, they could be slower. We should not diff --git a/naiveproxy/src/base/test/test_trace_processor.cc b/naiveproxy/src/base/test/test_trace_processor.cc index 879f9ef90a..451d15d4e0 100644 --- a/naiveproxy/src/base/test/test_trace_processor.cc +++ b/naiveproxy/src/base/test/test_trace_processor.cc @@ -12,6 +12,7 @@ #include "base/test/chrome_track_event.descriptor.h" #include "base/test/perfetto_sql_stdlib.h" #include "base/threading/thread_restrictions.h" +#include "base/trace_event/trace_event_impl.h" #include "base/trace_event/trace_log.h" #include "third_party/perfetto/protos/perfetto/trace/extension_descriptor.pbzero.h" @@ -131,8 +132,7 @@ void TestTraceProcessor::StartTrace(const TraceConfig& config, // explicitly specialize the custom backend to prevent tests from connecting // to a system backend. if (backend == perfetto::kUnspecifiedBackend) { - if (base::trace_event::TraceLog::GetInstance() - ->IsPerfettoInitializedByTraceLog()) { + if (base::trace_event::IsPerfettoInitializedForTesting()) { backend = perfetto::kInProcessBackend; } else { backend = perfetto::kCustomBackend; diff --git a/naiveproxy/src/base/test/trace_event_analyzer.cc b/naiveproxy/src/base/test/trace_event_analyzer.cc index 589e7d51e4..3a9fda6090 100644 --- a/naiveproxy/src/base/test/trace_event_analyzer.cc +++ b/naiveproxy/src/base/test/trace_event_analyzer.cc @@ -785,7 +785,8 @@ size_t FindMatchingEvents(const std::vector& events, bool ParseEventsFromJson(const std::string& json, std::vector* output) { - std::optional root = base::JSONReader::Read(json); + std::optional root = + base::JSONReader::Read(json, base::JSON_PARSE_CHROMIUM_EXTENSIONS); if (!root) { return false; diff --git a/naiveproxy/src/base/test/trace_test_utils.cc b/naiveproxy/src/base/test/trace_test_utils.cc index 47f5869143..a1a5f80287 100644 --- a/naiveproxy/src/base/test/trace_test_utils.cc +++ b/naiveproxy/src/base/test/trace_test_utils.cc @@ -4,16 +4,39 @@ #include "base/test/trace_test_utils.h" +#include "base/check.h" +#include "base/trace_event/trace_event_impl.h" #include "base/trace_event/trace_log.h" #include "third_party/perfetto/include/perfetto/tracing/tracing.h" namespace base::test { TracingEnvironment::TracingEnvironment() { - trace_event::TraceLog::ResetForTesting(); + InitializeTracing(); } TracingEnvironment::~TracingEnvironment() { + trace_event::TraceLog::ResetForTesting(); + perfetto::Tracing::ResetForTesting(); +} + +void InitializeTracing() { + // The tracing service shouldn't have initialized Perfetto in this process, + // because it's not safe to consume trace data from arbitrary processes + // through TraceLog as the JSON conversion here isn't sandboxed like with the + // real tracing service. + CHECK(!perfetto::Tracing::IsInitialized() || + base::trace_event::IsPerfettoInitializedForTesting()); + + if (perfetto::Tracing::IsInitialized()) { + return; + } + base::trace_event::SetPerfettoInitializedForTesting(); + base::trace_event::InitializeInProcessPerfettoBackend(); +} + +void SetupTracing() { + base::trace_event::InitializeInProcessPerfettoBackend(); perfetto::Tracing::ResetForTesting(); } diff --git a/naiveproxy/src/base/test/trace_test_utils.h b/naiveproxy/src/base/test/trace_test_utils.h index 1908509220..51bd794b35 100644 --- a/naiveproxy/src/base/test/trace_test_utils.h +++ b/naiveproxy/src/base/test/trace_test_utils.h @@ -5,9 +5,7 @@ #ifndef BASE_TEST_TRACE_TEST_UTILS_H_ #define BASE_TEST_TRACE_TEST_UTILS_H_ -namespace base { - -namespace test { +namespace base::test { // A scoped class that sets up and tears down tracing support for unit tests. // Note that only in-process tracing is supported by this harness. See @@ -20,7 +18,9 @@ class TracingEnvironment { ~TracingEnvironment(); }; -} // namespace test -} // namespace base +void InitializeTracing(); +void SetupTracing(); + +} // namespace base::test #endif // BASE_TEST_TRACE_TEST_UTILS_H_ diff --git a/naiveproxy/src/base/test/trace_to_file.cc b/naiveproxy/src/base/test/trace_to_file.cc index 7d3248142c..ab640db4c7 100644 --- a/naiveproxy/src/base/test/trace_to_file.cc +++ b/naiveproxy/src/base/test/trace_to_file.cc @@ -13,6 +13,7 @@ #include "base/task/single_thread_task_runner.h" #include "base/test/task_environment.h" #include "base/trace_event/trace_buffer.h" +#include "base/trace_event/trace_event_impl.h" #include "base/trace_event/trace_log.h" namespace base::test { @@ -54,6 +55,8 @@ void TraceToFile::BeginTracing(const FilePath& path, path_ = path; WriteFileHeader(); + base::trace_event::SetPerfettoInitializedForTesting(); + base::trace_event::InitializeInProcessPerfettoBackend(); trace_event::TraceLog::GetInstance()->SetEnabled( trace_event::TraceConfig(categories, trace_event::RECORD_UNTIL_FULL)); } diff --git a/naiveproxy/src/base/test/values_test_util.cc b/naiveproxy/src/base/test/values_test_util.cc index 1935ffd814..df4d3fcd40 100644 --- a/naiveproxy/src/base/test/values_test_util.cc +++ b/naiveproxy/src/base/test/values_test_util.cc @@ -24,9 +24,7 @@ namespace base::test { namespace { std::string FormatAsJSON(ValueView value) { - std::string json; - JSONWriter::Write(value, &json); - return json; + return WriteJson(value).value_or(""); } // Attempts to parse `json` as JSON. Returns resulting Value on success, has an @@ -403,11 +401,11 @@ Value::Dict ParseJsonDictFromFile(const FilePath& json_file_path) { expected WriteJsonFile(const FilePath& json_file_path, ValueView root) { - std::string json; - if (!JSONWriter::Write(root, &json)) { + std::optional json = WriteJson(root); + if (!json.has_value()) { return unexpected(WriteJsonError::kGenerateJsonFailure); } - if (!WriteFile(json_file_path, json)) { + if (!WriteFile(json_file_path, json.value())) { return unexpected(WriteJsonError::kWriteFileFailure); } return {}; diff --git a/naiveproxy/src/base/third_party/cityhash/README.chromium b/naiveproxy/src/base/third_party/cityhash/README.chromium index dc5c245b78..46bed48caf 100644 --- a/naiveproxy/src/base/third_party/cityhash/README.chromium +++ b/naiveproxy/src/base/third_party/cityhash/README.chromium @@ -2,6 +2,7 @@ Name: CityHash URL: https://github.com/google/cityhash Version: 1.1.1 Revision: 8af9b8c +Update Mechanism: Manual License: MIT License File: COPYING Security Critical: yes diff --git a/naiveproxy/src/base/third_party/nspr/README.chromium b/naiveproxy/src/base/third_party/nspr/README.chromium index 1ea510d879..eca0642b38 100644 --- a/naiveproxy/src/base/third_party/nspr/README.chromium +++ b/naiveproxy/src/base/third_party/nspr/README.chromium @@ -2,6 +2,7 @@ Name: Netscape Portable Runtime (NSPR) URL: https://hg.mozilla.org/projects/nspr Version: 4.8 Revision: dd5b9aa4631b350ba58e2e83106724808fd9a97f +Update Mechanism: Manual License: MPL-1.1 License File: LICENSE Security Critical: yes diff --git a/naiveproxy/src/base/third_party/superfasthash/README.chromium b/naiveproxy/src/base/third_party/superfasthash/README.chromium index d6da22b4ec..c6256a526a 100644 --- a/naiveproxy/src/base/third_party/superfasthash/README.chromium +++ b/naiveproxy/src/base/third_party/superfasthash/README.chromium @@ -3,6 +3,7 @@ Short Name: SuperFastHash URL: http://www.azillionmonkeys.com/qed/hash.html Version: N/A Date: 2012-02-21 +Update Mechanism: Manual License: BSD-3-Clause License File: LICENSE Security Critical: yes diff --git a/naiveproxy/src/base/third_party/symbolize/README.chromium b/naiveproxy/src/base/third_party/symbolize/README.chromium index 0ddd458f9e..4233570546 100644 --- a/naiveproxy/src/base/third_party/symbolize/README.chromium +++ b/naiveproxy/src/base/third_party/symbolize/README.chromium @@ -1,8 +1,10 @@ Name: google-glog's symbolization library URL: https://github.com/google/glog +Update Mechanism: Static (https://crbug.com/419062317) License: BSD-3-Clause License File: LICENSE Shipped: yes +Security Critical: yes The following files were copied from: https://github.com/google/glog/tree/b70ea80433c2a8f20b832be97b90f1f82b0d29e9 diff --git a/naiveproxy/src/base/threading/hang_watcher.cc b/naiveproxy/src/base/threading/hang_watcher.cc index 6090fe95e7..348b2134ed 100644 --- a/naiveproxy/src/base/threading/hang_watcher.cc +++ b/naiveproxy/src/base/threading/hang_watcher.cc @@ -240,7 +240,6 @@ bool ThreadTypeLoggingLevelGreaterOrEqual(HangWatcher::ThreadType thread_type, // started. Enabled by default only on platforms where the generated data is // used, to avoid unnecessary overhead. BASE_FEATURE(kEnableHangWatcher, - "EnableHangWatcher", #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS) || \ BUILDFLAG(IS_LINUX) FEATURE_ENABLED_BY_DEFAULT @@ -250,9 +249,7 @@ BASE_FEATURE(kEnableHangWatcher, ); // Enable HangWatcher on the GPU process. -BASE_FEATURE(kEnableHangWatcherOnGpuProcess, - "EnableHangWatcherOnGpuProcess", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kEnableHangWatcherOnGpuProcess, FEATURE_DISABLED_BY_DEFAULT); // Browser process. // Note: Do not use the prepared macro as of no need for a local cache. @@ -280,16 +277,16 @@ const char kGpuProcessCompositorThreadLogLevelParam[] = const char kGpuProcessThreadPoolLogLevelParam[] = "gpu_process_threadpool_log_level"; constexpr base::FeatureParam kGPUProcessIOThreadLogLevel{ - &kEnableHangWatcher, kGpuProcessIoThreadLogLevelParam, + &kEnableHangWatcherOnGpuProcess, kGpuProcessIoThreadLogLevelParam, static_cast(LoggingLevel::kUmaOnly)}; constexpr base::FeatureParam kGPUProcessMainThreadLogLevel{ - &kEnableHangWatcher, kGpuProcessMainThreadLogLevelParam, + &kEnableHangWatcherOnGpuProcess, kGpuProcessMainThreadLogLevelParam, static_cast(LoggingLevel::kUmaOnly)}; constexpr base::FeatureParam kGPUProcessCompositorThreadLogLevel{ - &kEnableHangWatcher, kGpuProcessCompositorThreadLogLevelParam, + &kEnableHangWatcherOnGpuProcess, kGpuProcessCompositorThreadLogLevelParam, static_cast(LoggingLevel::kUmaOnly)}; constexpr base::FeatureParam kGPUProcessThreadPoolLogLevel{ - &kEnableHangWatcher, kGpuProcessThreadPoolLogLevelParam, + &kEnableHangWatcherOnGpuProcess, kGpuProcessThreadPoolLogLevelParam, static_cast(LoggingLevel::kUmaOnly)}; // Renderer process. @@ -455,15 +452,10 @@ void HangWatcher::InitializeOnMainThread(ProcessType process_type, DCHECK(g_main_thread_log_level == LoggingLevel::kNone); DCHECK(g_threadpool_log_level == LoggingLevel::kNone); - bool enable_hang_watcher = base::FeatureList::IsEnabled(kEnableHangWatcher); - - // The issue related to invalid magic signature in the GPU WatchDog is fixed - // (https://crbug.com/1297760), we can now rollout HangWatcher on the GPU - // process. - if (process_type == ProcessType::kGPUProcess && - !base::FeatureList::IsEnabled(kEnableHangWatcherOnGpuProcess)) { - enable_hang_watcher = false; - } + bool enable_hang_watcher = + (process_type == ProcessType::kGPUProcess + ? base::FeatureList::IsEnabled(kEnableHangWatcherOnGpuProcess) + : base::FeatureList::IsEnabled(kEnableHangWatcher)); g_use_hang_watcher.store(enable_hang_watcher, std::memory_order_relaxed); @@ -614,10 +606,10 @@ HangWatcher::HangWatcher() should_monitor_(WaitableEvent::ResetPolicy::AUTOMATIC), thread_(this, kThreadName), tick_clock_(base::DefaultTickClock::GetInstance()), - memory_pressure_listener_( + memory_pressure_listener_registration_( FROM_HERE, - base::BindRepeating(&HangWatcher::OnMemoryPressure, - base::Unretained(this))) { + base::MemoryPressureListenerTag::kHangWatcher, + this) { // |thread_checker_| should not be bound to the constructing thread. DETACH_FROM_THREAD(hang_watcher_thread_checker_); @@ -685,10 +677,8 @@ std::string HangWatcher::GetTimeSinceLastSystemPowerResumeCrashKeyValue() return NumberToString(time_since_last_system_resume.InSeconds()); } -void HangWatcher::OnMemoryPressure( - base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { - if (memory_pressure_level == - base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) { +void HangWatcher::OnMemoryPressure(MemoryPressureLevel memory_pressure_level) { + if (memory_pressure_level == MEMORY_PRESSURE_LEVEL_CRITICAL) { last_critical_memory_pressure_.store(base::TimeTicks::Now(), std::memory_order_relaxed); } diff --git a/naiveproxy/src/base/threading/hang_watcher.h b/naiveproxy/src/base/threading/hang_watcher.h index 713e922263..0b30a9bf8f 100644 --- a/naiveproxy/src/base/threading/hang_watcher.h +++ b/naiveproxy/src/base/threading/hang_watcher.h @@ -104,7 +104,8 @@ class BASE_EXPORT [[maybe_unused, nodiscard]] WatchHangsInScope { // HangWatchStates for deadline overruns. This happens at a regular interval on // a separate thread. Only one instance of HangWatcher can exist at a time // within a single process. This instance must outlive all monitored threads. -class BASE_EXPORT HangWatcher : public DelegateSimpleThread::Delegate { +class BASE_EXPORT HangWatcher : public DelegateSimpleThread::Delegate, + public base::MemoryPressureListener { public: // Describes the type of a process for logging purposes. enum class ProcessType { @@ -283,8 +284,7 @@ class BASE_EXPORT HangWatcher : public DelegateSimpleThread::Delegate { THREAD_CHECKER(constructing_thread_checker_); // Invoked on memory pressure signal. - void OnMemoryPressure( - base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level); + void OnMemoryPressure(MemoryPressureLevel memory_pressure_level) override; // Returns a ScopedCrashKeyString that sets the crash key with the time since // last critical memory pressure signal. @@ -399,7 +399,8 @@ class BASE_EXPORT HangWatcher : public DelegateSimpleThread::Delegate { raw_ptr tick_clock_; // Registration to receive memory pressure signals. - base::MemoryPressureListener memory_pressure_listener_; + base::MemoryPressureListenerRegistration + memory_pressure_listener_registration_; // The last time at which a critical memory pressure signal was received, or // null if no signal was ever received. Atomic because it's set and read from diff --git a/naiveproxy/src/base/threading/platform_thread.h b/naiveproxy/src/base/threading/platform_thread.h index 2457ead0cd..36f3b22ad9 100644 --- a/naiveproxy/src/base/threading/platform_thread.h +++ b/naiveproxy/src/base/threading/platform_thread.h @@ -20,7 +20,6 @@ #include "base/message_loop/message_pump_type.h" #include "base/process/process_handle.h" #include "base/threading/platform_thread_ref.h" -#include "base/time/time.h" #include "base/trace_event/base_tracing_forward.h" #include "base/types/strong_alias.h" #include "build/build_config.h" @@ -40,6 +39,8 @@ namespace base { +class TimeDelta; + // Used for uniquely identifying a thread. // // Wraps a platform-specific integer value with platform-specific size, diff --git a/naiveproxy/src/base/threading/platform_thread_android.cc b/naiveproxy/src/base/threading/platform_thread_android.cc index 29317cffa0..d926b0a16f 100644 --- a/naiveproxy/src/base/threading/platform_thread_android.cc +++ b/naiveproxy/src/base/threading/platform_thread_android.cc @@ -12,10 +12,11 @@ #include -#include "base/android/build_info.h" +#include "base/android/android_info.h" #include "base/android/jni_android.h" #include "base/feature_list.h" #include "base/logging.h" +#include "base/system/sys_info.h" #include "base/threading/platform_thread_internal_posix.h" #include "base/threading/thread_id_name_manager.h" @@ -30,6 +31,17 @@ BASE_FEATURE(kIncreaseDisplayCriticalThreadPriority, namespace internal { +// Returns true if the kDisplayCriticalThreadPriority should be boosted. +static bool ShouldBoostDisplayCriticalThreadPriority() { + // ADPF-equipped Google Pixels are excluded from the study because of + // potential input jank. Because Finch doesn't support per-device targeting, + // switch this off even if the flag's on. TODO (ritownsend): make it possible + // to switch this back on for Pixel. + static bool is_google_soc = SysInfo::SocManufacturer() == "Google"; + return !is_google_soc && + base::FeatureList::IsEnabled(kIncreaseDisplayCriticalThreadPriority); +} + // - kRealtimeAudio corresponds to Android's PRIORITY_AUDIO = -16 value. // - kDisplay corresponds to Android's PRIORITY_DISPLAY = -4 value. // - kUtility corresponds to Android's THREAD_PRIORITY_LESS_FAVORABLE = 1 value. @@ -63,8 +75,7 @@ int ThreadTypeToNiceValue(const ThreadType thread_type) { return 0; case ThreadType::kDisplayCritical: case ThreadType::kInteractive: - if (base::FeatureList::IsEnabled( - kIncreaseDisplayCriticalThreadPriority)) { + if (ShouldBoostDisplayCriticalThreadPriority()) { return -12; } return -4; @@ -85,8 +96,8 @@ bool SetCurrentThreadTypeForPlatform(ThreadType thread_type, // https://android-review.googlesource.com/c/platform/system/core/+/1975808 // this becomes obsolete and we can avoid this starting in API level 33. if (thread_type == ThreadType::kRealtimeAudio && - base::android::BuildInfo::GetInstance()->sdk_int() < - base::android::SDK_VERSION_T) { + base::android::android_info::sdk_int() < + base::android::android_info::SDK_VERSION_T) { JNIEnv* env = base::android::AttachCurrentThread(); Java_ThreadUtils_setThreadPriorityAudio(env, PlatformThread::CurrentId().raw()); diff --git a/naiveproxy/src/base/threading/platform_thread_apple.mm b/naiveproxy/src/base/threading/platform_thread_apple.mm index b486e51864..b65dd7116d 100644 --- a/naiveproxy/src/base/threading/platform_thread_apple.mm +++ b/naiveproxy/src/base/threading/platform_thread_apple.mm @@ -85,7 +85,6 @@ void PlatformThreadBase::SetName(const std::string& name) { // Whether optimized real-time thread config should be used for audio. BASE_FEATURE(kOptimizedRealtimeThreadingMac, - "OptimizedRealtimeThreadingMac", #if BUILDFLAG(IS_MAC) FEATURE_ENABLED_BY_DEFAULT #else diff --git a/naiveproxy/src/base/threading/platform_thread_cros.cc b/naiveproxy/src/base/threading/platform_thread_cros.cc index 1a796a8fb0..452d6f4515 100644 --- a/naiveproxy/src/base/threading/platform_thread_cros.cc +++ b/naiveproxy/src/base/threading/platform_thread_cros.cc @@ -26,17 +26,11 @@ namespace base { -BASE_FEATURE(kSchedUtilHints, - "SchedUtilHints", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kSchedUtilHints, base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kSetThreadBgForBgProcess, - "SetThreadBgForBgProcess", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kSetThreadBgForBgProcess, FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kSetRtForDisplayThreads, - "SetRtForDisplayThreads", - FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kSetRtForDisplayThreads, FEATURE_DISABLED_BY_DEFAULT); namespace { CrossProcessPlatformThreadDelegate* g_cross_process_platform_thread_delegate = diff --git a/naiveproxy/src/base/threading/platform_thread_internal_posix.cc b/naiveproxy/src/base/threading/platform_thread_internal_posix.cc index 25e766f7ee..6a90aea12f 100644 --- a/naiveproxy/src/base/threading/platform_thread_internal_posix.cc +++ b/naiveproxy/src/base/threading/platform_thread_internal_posix.cc @@ -31,10 +31,14 @@ ThreadPriorityForTest NiceValueToThreadPriorityForTest(int nice_value) { } int GetCurrentThreadNiceValue() { + return GetThreadNiceValue(PlatformThreadId{0}); +} + +int GetThreadNiceValue(PlatformThreadId id) { // Need to clear errno before calling getpriority(): // http://man7.org/linux/man-pages/man2/getpriority.2.html errno = 0; - int nice_value = getpriority(PRIO_PROCESS, 0); + int nice_value = getpriority(PRIO_PROCESS, static_cast(id.raw())); if (errno != 0) { DVPLOG(1) << "Failed to get nice value of thread (" << PlatformThread::CurrentId() << ")"; diff --git a/naiveproxy/src/base/threading/platform_thread_internal_posix.h b/naiveproxy/src/base/threading/platform_thread_internal_posix.h index d034a5b543..d1373dc194 100644 --- a/naiveproxy/src/base/threading/platform_thread_internal_posix.h +++ b/naiveproxy/src/base/threading/platform_thread_internal_posix.h @@ -58,6 +58,7 @@ std::optional GetCurrentThreadPriorityForPlatformForTest(); int GetCurrentThreadNiceValue(); +int GetThreadNiceValue(PlatformThreadId id); } // namespace internal diff --git a/naiveproxy/src/base/threading/platform_thread_metrics.cc b/naiveproxy/src/base/threading/platform_thread_metrics.cc index 2cda142729..c5765208ec 100644 --- a/naiveproxy/src/base/threading/platform_thread_metrics.cc +++ b/naiveproxy/src/base/threading/platform_thread_metrics.cc @@ -5,16 +5,45 @@ #include "base/threading/platform_thread_metrics.h" #include +#include #include #include "base/check.h" +#include "base/functional/bind.h" +#include "base/functional/callback_forward.h" #include "base/memory/ptr_util.h" +#include "base/metrics/histogram_base.h" +#include "base/metrics/sparse_histogram.h" +#include "base/no_destructor.h" +#include "base/process/current_process.h" +#include "base/strings/strcat.h" +#include "base/strings/string_util.h" +#include "base/synchronization/lock.h" +#include "base/task/thread_pool.h" #include "base/threading/platform_thread.h" #include "base/time/time.h" #include "build/build_config.h" +#if BUILDFLAG(IS_ANDROID) +#include "base/threading/platform_thread_internal_posix.h" +#endif // BUILDFLAG(IS_ANDROID) + namespace base { +namespace { + +#if BUILDFLAG(IS_ANDROID) +std::string GetCurrentProcessName(CurrentProcess::NameKey key) { + std::string process_name = CurrentProcess::GetInstance().GetName(key); + // The process name may have whitespaces (e.g. 'GPU Process') and that won't + // work as a histogram name. + RemoveChars(process_name, " ", &process_name); + return process_name; +} +#endif // BUILDFLAG(IS_ANDROID) + +} // namespace + // Apple and Windows have platform-specific create methods. #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_WIN) @@ -78,4 +107,67 @@ std::optional PlatformThreadMetrics::GetCPUUsageProportion() { return std::nullopt; } +#if BUILDFLAG(IS_ANDROID) + +PlatformThreadPriorityMonitor::PlatformThreadPriorityMonitor() + : process_name_(GetCurrentProcessName({})) {} +PlatformThreadPriorityMonitor::~PlatformThreadPriorityMonitor() = default; + +// static +PlatformThreadPriorityMonitor& PlatformThreadPriorityMonitor::Get() { + static base::NoDestructor instance; + return *instance; +} + +std::string PlatformThreadPriorityMonitor::GetHistogramNameForSuffix( + const std::string_view suffix) { + return StrCat({"Scheduling.ThreadPriority.", process_name_, ".", suffix}); +} + +void PlatformThreadPriorityMonitor::RegisterCurrentThread( + const std::string_view suffix) { + PlatformThreadId current_thread_id = PlatformThread::CurrentId(); + HistogramBase* histogram = + SparseHistogram::FactoryGet(GetHistogramNameForSuffix(suffix), + HistogramBase::kUmaTargetedHistogramFlag); + + AutoLock auto_lock(lock_); + thread_id_to_histogram_[current_thread_id] = histogram; +} + +void PlatformThreadPriorityMonitor::UnregisterCurrentThread() { + PlatformThreadId current_thread_id = PlatformThread::CurrentId(); + + AutoLock auto_lock(lock_); + thread_id_to_histogram_.erase(current_thread_id); +} + +void PlatformThreadPriorityMonitor::RecordThreadPriorities() { + AutoLock auto_lock(lock_); + for (auto& [thread_id, histogram] : thread_id_to_histogram_) { + histogram->Add(internal::GetThreadNiceValue(thread_id)); + } +} + +// static +void PlatformThreadPriorityMonitor::ScheduleRecordingTask() { + static NoDestructor closure(BindRepeating([] { + auto& monitor = PlatformThreadPriorityMonitor::Get(); + monitor.RecordThreadPriorities(); + monitor.ScheduleRecordingTask(); + })); + + ThreadPool::PostDelayedTask( + FROM_HERE, + {TaskPriority::BEST_EFFORT, TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + *closure, kMinSamplingInterval); +} + +void PlatformThreadPriorityMonitor::Start() { + std::call_once(once_flag_, + &PlatformThreadPriorityMonitor::ScheduleRecordingTask); +} + +#endif // BUILDFLAG(IS_ANDROID) + } // namespace base diff --git a/naiveproxy/src/base/threading/platform_thread_metrics.h b/naiveproxy/src/base/threading/platform_thread_metrics.h index 1cdeb94e3f..f51333e43c 100644 --- a/naiveproxy/src/base/threading/platform_thread_metrics.h +++ b/naiveproxy/src/base/threading/platform_thread_metrics.h @@ -5,12 +5,21 @@ #ifndef BASE_THREADING_PLATFORM_THREAD_METRICS_H_ #define BASE_THREADING_PLATFORM_THREAD_METRICS_H_ +#include #include +#include #include +#include +#include #include "base/base_export.h" +#include "base/functional/callback_forward.h" +#include "base/metrics/histogram.h" +#include "base/synchronization/lock.h" +#include "base/thread_annotations.h" #include "base/threading/platform_thread.h" #include "base/time/time.h" +#include "base/timer/timer.h" #include "build/build_config.h" #if BUILDFLAG(IS_WIN) @@ -19,6 +28,13 @@ namespace base { +#if BUILDFLAG(IS_ANDROID) +// Forward declaration +template +class NoDestructor; +class PlatformThreadPriorityMonitorTest; +#endif // BUILDFLAG(IS_ANDROID) + // Used to log metrics about a specific thread. Modeled on ProcessMetrics. // // On Android and Fuchsia the thread must belong to the current process. (This @@ -109,6 +125,52 @@ class BASE_EXPORT PlatformThreadMetrics { TimeDelta last_cumulative_cpu_; }; +#if BUILDFLAG(IS_ANDROID) +// A class to monitor thread priorities on Android. +class BASE_EXPORT PlatformThreadPriorityMonitor { + public: + // Gets the singleton instance of the monitor. + static PlatformThreadPriorityMonitor& Get(); + + // Registers the current thread for priority monitoring. A histogram named + // "Scheduling.ThreadPriority.." will be created to record + // the thread's nice value. The thread will be unregistered automatically on + // join. + void RegisterCurrentThread(const std::string_view suffix); + + // Removes the current thread from priority monitoring. + void UnregisterCurrentThread(); + + // Start recording the current priority (nice value) of all registered threads + // to their respective histograms. Sampled every 5 minutes. + void Start(); + + private: + friend class NoDestructor; + friend class PlatformThreadPriorityMonitorTest; + + // The mean interval between two consecutive recordings of thread + // priorities. + static constexpr TimeDelta kMinSamplingInterval = Minutes(5); + + PlatformThreadPriorityMonitor(); + ~PlatformThreadPriorityMonitor(); + void RecordThreadPriorities(); + std::string GetHistogramNameForSuffix(const std::string_view suffix); + static void ScheduleRecordingTask(); + + Lock lock_; + // Maps a thread ID to the histogram used to record its priority. + std::map> thread_id_to_histogram_ + GUARDED_BY(lock_); + std::optional next_reporting_time_ GUARDED_BY(lock_); + + std::once_flag once_flag_; + const std::string process_name_; +}; + +#endif // BUILDFLAG(IS_ANDROID) + } // namespace base #endif // BASE_THREADING_PLATFORM_THREAD_METRICS_H_ diff --git a/naiveproxy/src/base/threading/platform_thread_posix.cc b/naiveproxy/src/base/threading/platform_thread_posix.cc index 09c17bc298..80492c101e 100644 --- a/naiveproxy/src/base/threading/platform_thread_posix.cc +++ b/naiveproxy/src/base/threading/platform_thread_posix.cc @@ -22,6 +22,7 @@ #include "base/memory/raw_ptr.h" #include "base/notimplemented.h" #include "base/threading/platform_thread_internal_posix.h" +#include "base/threading/platform_thread_metrics.h" #include "base/threading/scoped_blocking_call.h" #include "base/threading/thread_id_name_manager.h" #include "base/threading/thread_restrictions.h" @@ -103,6 +104,9 @@ void* ThreadFunc(void* params) { ThreadIdNameManager::GetInstance()->RemoveName( PlatformThread::CurrentHandle().platform_handle(), PlatformThread::CurrentId()); +#if BUILDFLAG(IS_ANDROID) + PlatformThreadPriorityMonitor::Get().UnregisterCurrentThread(); +#endif #if PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) partition_alloc::internal::StackTopRegistry::Get().NotifyThreadDestroyed(); diff --git a/naiveproxy/src/base/threading/thread_restrictions.h b/naiveproxy/src/base/threading/thread_restrictions.h index f9e528588b..e062ef013e 100644 --- a/naiveproxy/src/base/threading/thread_restrictions.h +++ b/naiveproxy/src/base/threading/thread_restrictions.h @@ -124,6 +124,7 @@ class BrowserProcessImpl; class BrowserThemePack; +class ChromeContentRendererClient; class ChromeNSSCryptoModuleDelegate; class DesktopNotificationBalloon; class FirefoxProfileLock; @@ -301,7 +302,9 @@ bool InitializeStaticGLBindings(GLImplementationParts); } } // namespace gl namespace gpu { -class GpuMemoryBufferImplDXGI; +class MappableBufferAHB; +class MappableBufferDXGI; +class GpuPersistentCache; } namespace history_report { class HistoryReportJniBridge; @@ -344,7 +347,7 @@ class V4L2DevicePoller; // TODO(crbug.com/41486289): remove this. namespace memory_instrumentation { class OSMetrics; } -namespace memory_pressure { +namespace content { class UserLevelMemoryPressureSignalGenerator; } namespace metrics { @@ -569,6 +572,7 @@ class BASE_EXPORT ScopedAllowBlocking { // Sorted by class name (with namespace), #if blocks at the bottom. friend class ::BrowserProcessImpl; friend class ::BrowserThemePack; // http://crbug.com/80206 + friend class ::ChromeContentRendererClient; friend class ::DesktopNotificationBalloon; friend class ::FirefoxProfileLock; friend class ::GaiaConfig; @@ -608,6 +612,7 @@ class BASE_EXPORT ScopedAllowBlocking { friend class content:: ScopedAllowBlockingForViewAura; // http://crbug.com/332579 friend class content::ShellPathProvider; + friend class content::UserLevelMemoryPressureSignalGenerator; friend class content::WebContentsViewMac; friend class cronet::CronetContext; friend class cronet::CronetPrefsManager; @@ -620,7 +625,6 @@ class BASE_EXPORT ScopedAllowBlocking { friend class io_thread::IOSIOThread; friend class media::FileVideoCaptureDeviceFactory; friend class memory_instrumentation::OSMetrics; - friend class memory_pressure::UserLevelMemoryPressureSignalGenerator; friend class metrics::CleanExitBeacon; friend class module_installer::ScopedAllowModulePakLoad; friend class net::GSSAPISharedLibrary; // http://crbug.com/66702 @@ -753,6 +757,7 @@ class BASE_EXPORT ScopedAllowBaseSyncPrimitives { friend class content::ServiceWorkerContextClient; friend class device::UsbContext; friend class enterprise_connectors::LinuxKeyRotationCommand; + friend class gpu::GpuPersistentCache; friend class history_report::HistoryReportJniBridge; friend class internal::TaskTracker; friend class leveldb::port::CondVar; @@ -821,6 +826,7 @@ class BASE_EXPORT // Allowed usage: // Sorted by class name (with namespace). friend class ::BrowserProcessImpl; // http://crbug.com/125207 + friend class ::ChromeContentRendererClient; friend class ::KeyStorageLinux; friend class ::NativeDesktopMediaList; friend class android::JavaHandlerThread; @@ -852,7 +858,8 @@ class BASE_EXPORT friend class content::SynchronousCompositor; friend class content::SynchronousCompositorHost; friend class content::SynchronousCompositorSyncCallBridge; - friend class gpu::GpuMemoryBufferImplDXGI; + friend class gpu::MappableBufferAHB; + friend class gpu::MappableBufferDXGI; friend class media::AudioInputDevice; friend class media::AudioOutputDevice; friend class media::MailboxVideoFrameConverter; diff --git a/naiveproxy/src/base/time/default_clock.cc b/naiveproxy/src/base/time/default_clock.cc index 9f80951b40..dbb9a7cfa5 100644 --- a/naiveproxy/src/base/time/default_clock.cc +++ b/naiveproxy/src/base/time/default_clock.cc @@ -5,6 +5,7 @@ #include "base/time/default_clock.h" #include "base/no_destructor.h" +#include "base/time/time.h" namespace base { diff --git a/naiveproxy/src/base/time/default_tick_clock.cc b/naiveproxy/src/base/time/default_tick_clock.cc index 95a34df987..891fffde99 100644 --- a/naiveproxy/src/base/time/default_tick_clock.cc +++ b/naiveproxy/src/base/time/default_tick_clock.cc @@ -5,6 +5,7 @@ #include "base/time/default_tick_clock.h" #include "base/no_destructor.h" +#include "base/time/time.h" namespace base { diff --git a/naiveproxy/src/base/timer/elapsed_timer.cc b/naiveproxy/src/base/timer/elapsed_timer.cc index 25837614f8..17eb217dc0 100644 --- a/naiveproxy/src/base/timer/elapsed_timer.cc +++ b/naiveproxy/src/base/timer/elapsed_timer.cc @@ -14,13 +14,6 @@ bool g_mock_elapsed_timers_for_test = false; ElapsedTimer::ElapsedTimer() : start_time_(TimeTicks::Now()) {} -ElapsedTimer::ElapsedTimer(ElapsedTimer&& other) - : start_time_(other.start_time_) {} - -void ElapsedTimer::operator=(ElapsedTimer&& other) { - start_time_ = other.start_time_; -} - TimeDelta ElapsedTimer::Elapsed() const { if (g_mock_elapsed_timers_for_test) { return ScopedMockElapsedTimersForTest::kMockElapsedTime; diff --git a/naiveproxy/src/base/timer/elapsed_timer.h b/naiveproxy/src/base/timer/elapsed_timer.h index 1f2ecf6fa9..60569abcd9 100644 --- a/naiveproxy/src/base/timer/elapsed_timer.h +++ b/naiveproxy/src/base/timer/elapsed_timer.h @@ -15,12 +15,8 @@ class BASE_EXPORT ElapsedTimer { public: ElapsedTimer(); - ElapsedTimer(const ElapsedTimer&) = delete; - ElapsedTimer& operator=(const ElapsedTimer&) = delete; - - ElapsedTimer(ElapsedTimer&& other); - - void operator=(ElapsedTimer&& other); + ElapsedTimer(const ElapsedTimer&) = default; + ElapsedTimer& operator=(const ElapsedTimer&) = default; // Returns the time elapsed since object construction. TimeDelta Elapsed() const; @@ -37,8 +33,8 @@ class BASE_EXPORT ElapsedThreadTimer { public: ElapsedThreadTimer(); - ElapsedThreadTimer(const ElapsedThreadTimer&) = delete; - ElapsedThreadTimer& operator=(const ElapsedThreadTimer&) = delete; + ElapsedThreadTimer(const ElapsedThreadTimer&) = default; + ElapsedThreadTimer& operator=(const ElapsedThreadTimer&) = default; // Returns the ThreadTicks time elapsed since object construction. // Only valid if |is_supported()| returns true, otherwise returns TimeDelta(). @@ -47,8 +43,8 @@ class BASE_EXPORT ElapsedThreadTimer { bool is_supported() const { return is_supported_; } private: - const bool is_supported_; - const ThreadTicks begin_; + bool is_supported_; + ThreadTicks begin_; }; // Whenever there's a ScopedMockElapsedTimersForTest in scope, diff --git a/naiveproxy/src/base/timer/timer.h b/naiveproxy/src/base/timer/timer.h index 96781894ba..8f20b1fa20 100644 --- a/naiveproxy/src/base/timer/timer.h +++ b/naiveproxy/src/base/timer/timer.h @@ -75,6 +75,7 @@ #include "base/location.h" #include "base/memory/raw_ptr.h" #include "base/sequence_checker.h" +#include "base/task/delay_policy.h" #include "base/task/delayed_task_handle.h" #include "base/task/sequenced_task_runner.h" #include "base/time/time.h" diff --git a/naiveproxy/src/base/trace_event/builtin_categories.h b/naiveproxy/src/base/trace_event/builtin_categories.h index 6c811af11e..404faaae45 100644 --- a/naiveproxy/src/base/trace_event/builtin_categories.h +++ b/naiveproxy/src/base/trace_event/builtin_categories.h @@ -63,6 +63,8 @@ PERFETTO_DEFINE_CATEGORIES_IN_NAMESPACE_WITH_ATTRS( perfetto::Category("__metadata"), perfetto::Category("accessibility"), perfetto::Category("AccountFetcherService"), + perfetto::Category("actor").SetDescription( + "Events for the Actor component."), perfetto::Category("android.adpf"), perfetto::Category("android.ui.jank"), perfetto::Category("android_webview"), @@ -72,16 +74,17 @@ PERFETTO_DEFINE_CATEGORIES_IN_NAMESPACE_WITH_ATTRS( perfetto::Category("audio").SetTags("audio"), perfetto::Category("base").SetTags("toplevel"), perfetto::Category("benchmark").SetTags("input"), + perfetto::Category("tracing.background").SetDescription( + "Events related to background tracing, scenarios and triggers."), perfetto::Category("blink").SetTags("javascript", "rendering"), perfetto::Category("blink.animations"), perfetto::Category("blink.bindings"), perfetto::Category("blink.console"), - perfetto::Category("blink.debug.invalidation_tracking") - .SetDescription( - "Debugging events for style invalidation, related to " - "devtools.timeline.InvalidationTracking").SetTags("debug"), perfetto::Category("blink.net"), perfetto::Category("blink.resource"), + perfetto::Category("blink.task_attribution").SetDescription( + "Traces for Task Attribution, blink's internal mechanism for propagating " + "task state information across tasks and microtasks"), perfetto::Category("blink.user_timing"), perfetto::Category("blink.worker"), perfetto::Category("blink_style"), @@ -112,6 +115,8 @@ PERFETTO_DEFINE_CATEGORIES_IN_NAMESPACE_WITH_ATTRS( perfetto::Category("config.scheduler.record_task_post_time").SetDescription( "Controls details emitted by TaskAnnotator::EmitTaskTimingDetails"), perfetto::Category("content"), + perfetto::Category("content.fedcm").SetDescription( + "Traces for the Federated Credential Management API"), perfetto::Category("content_capture"), perfetto::Category("cronet"), perfetto::Category("interactions"), @@ -130,6 +135,9 @@ PERFETTO_DEFINE_CATEGORIES_IN_NAMESPACE_WITH_ATTRS( perfetto::Category("event"), perfetto::Category("exo"), perfetto::Category("extensions"), + perfetto::Category("extensions.content_verifier.debug").SetDescription( + "Traces for the extension file (content) verification process at " + "//extensions/browser/content_verifier.").SetTags("debug"), perfetto::Category("explore_sites"), perfetto::Category("FileSystem"), perfetto::Category("file_system_provider"), @@ -151,6 +159,8 @@ PERFETTO_DEFINE_CATEGORIES_IN_NAMESPACE_WITH_ATTRS( perfetto::Category("input").SetTags("input"), perfetto::Category("input.scrolling").SetTags("input"), perfetto::Category("io"), + perfetto::Category("ip_protection").SetDescription( + "Traces for //components/ip_protection."), perfetto::Category("ipc").SetTags("ipc"), perfetto::Category("Java"), perfetto::Category("jni"), @@ -186,6 +196,11 @@ PERFETTO_DEFINE_CATEGORIES_IN_NAMESPACE_WITH_ATTRS( perfetto::Category("omnibox"), perfetto::Category("oobe"), perfetto::Category("openscreen"), + + perfetto::Category("optimization_guide").SetDescription( + "Includes events related to processing hints and machine learning " + "models by the Optimization Guide component."), + perfetto::Category("optimization_guide.debug").SetTags("debug"), perfetto::Category("ozone"), perfetto::Category("partition_alloc"), perfetto::Category("passwords"), @@ -202,6 +217,9 @@ PERFETTO_DEFINE_CATEGORIES_IN_NAMESPACE_WITH_ATTRS( "to global async tracks."), perfetto::Category("performance_manager.cpu_metrics").SetDescription( "Events reporting cpu metrics computed in performance_manager"), + perfetto::Category("performance_manager.graph").SetDescription( + "Describes the performance manager graph structure with frames, pages, " + "processes, etc. and their properties.").SetTags("toplevel"), perfetto::Category("persistent_cache"), perfetto::Category("PlatformMalloc"), perfetto::Category("ppapi"), @@ -250,6 +268,9 @@ PERFETTO_DEFINE_CATEGORIES_IN_NAMESPACE_WITH_ATTRS( perfetto::Category("viz").SetTags("rendering"), perfetto::Category("vk"), perfetto::Category("wakeup.flow").SetTags("scheduling"), + perfetto::Category("waap").SetDescription( + "Includes events related to WaaP (Webium-as-a-Product) UI experiments as " + "described in //chrome/browser/waap."), perfetto::Category("wayland"), perfetto::Category("webaudio").SetTags("audio"), perfetto::Category("webengine.fidl"), @@ -544,7 +565,6 @@ PERFETTO_DEFINE_CATEGORIES_IN_NAMESPACE_WITH_ATTRS( perfetto::Category::Group("startup,rail"), perfetto::Category::Group("toplevel,graphics.pipeline"), perfetto::Category::Group("toplevel,Java"), - perfetto::Category::Group("toplevel,latency"), perfetto::Category::Group("toplevel,mojom"), perfetto::Category::Group("toplevel,viz"), perfetto::Category::Group("toplevel.flow,mojom.flow"), diff --git a/naiveproxy/src/base/trace_event/malloc_dump_provider.cc b/naiveproxy/src/base/trace_event/malloc_dump_provider.cc index e59558b500..cc8e25802b 100644 --- a/naiveproxy/src/base/trace_event/malloc_dump_provider.cc +++ b/naiveproxy/src/base/trace_event/malloc_dump_provider.cc @@ -609,10 +609,10 @@ void MemoryDumpPartitionStatsDumper::PartitionDumpTotals( auto total_active_bytes = memory_stats->total_active_bytes; size_t wasted = 0; // This should always be true, but only if our accounting of committed bytes - // is consistent, which it isn't. Indeed, with - // PartitionAllocFewerMemoryRegions, we may allocate a slot span before the - // feature state is known, in which case we commit less, then decommit it - // after, in which case we subtract the new commit unit, which is larger. + // is consistent, which it isn't. Indeed, with kUseFewerMemoryRegions, we may + // allocate a slot span before the feature state is known, in which case we + // commit less, then decommit it after, in which case we subtract the new + // commit unit, which is larger. // // Properly handling this would require remembering how much was committed, // which complicates bookkeeping, especially as metadata space is diff --git a/naiveproxy/src/base/trace_event/memory_dump_manager.cc b/naiveproxy/src/base/trace_event/memory_dump_manager.cc index d12a8bf8e4..8cd2dfd753 100644 --- a/naiveproxy/src/base/trace_event/memory_dump_manager.cc +++ b/naiveproxy/src/base/trace_event/memory_dump_manager.cc @@ -26,6 +26,7 @@ #include "base/trace_event/heap_profiler_allocation_context_tracker.h" #include "base/trace_event/malloc_dump_provider.h" #include "base/trace_event/memory_dump_provider.h" +#include "base/trace_event/memory_dump_request_args.h" #include "base/trace_event/memory_dump_scheduler.h" #include "base/trace_event/memory_infra_background_allowlist.h" #include "base/trace_event/process_memory_dump.h" @@ -479,7 +480,7 @@ void MemoryDumpManager::FinishAsyncProcessDump( if (!pmd_async_state->callback.is_null()) { std::move(pmd_async_state->callback) - .Run(true /* success */, dump_guid, + .Run(ProcessMemoryDumpOutcome::kSuccess, dump_guid, std::move(pmd_async_state->process_memory_dump)); } diff --git a/naiveproxy/src/base/trace_event/memory_dump_request_args.h b/naiveproxy/src/base/trace_event/memory_dump_request_args.h index e29cca49b4..e382303bb2 100644 --- a/naiveproxy/src/base/trace_event/memory_dump_request_args.h +++ b/naiveproxy/src/base/trace_event/memory_dump_request_args.h @@ -90,8 +90,16 @@ struct MemoryDumpArgs { uint64_t dump_guid; }; -using ProcessMemoryDumpCallback = OnceCallback< - void(bool success, uint64_t dump_guid, std::unique_ptr)>; +// A memory dump always succeeds. +// TODO(crbug.com/450929521): Consider removing this. +enum class ProcessMemoryDumpOutcome { + kSuccess, +}; + +using ProcessMemoryDumpCallback = + OnceCallback)>; BASE_EXPORT const char* MemoryDumpTypeToString(const MemoryDumpType& dump_type); diff --git a/naiveproxy/src/base/trace_event/memory_pressure_level_proto.cc b/naiveproxy/src/base/trace_event/memory_pressure_level_proto.cc index f1f7efbb99..3b88727c3b 100644 --- a/naiveproxy/src/base/trace_event/memory_pressure_level_proto.cc +++ b/naiveproxy/src/base/trace_event/memory_pressure_level_proto.cc @@ -14,14 +14,14 @@ namespace base::trace_event { perfetto::protos::pbzero::MemoryPressureLevel MemoryPressureLevelToTraceEnum( - MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { + MemoryPressureLevel memory_pressure_level) { using ProtoLevel = perfetto::protos::pbzero::MemoryPressureLevel; switch (memory_pressure_level) { - case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE: + case MEMORY_PRESSURE_LEVEL_NONE: return ProtoLevel::MEMORY_PRESSURE_LEVEL_NONE; - case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE: + case MEMORY_PRESSURE_LEVEL_MODERATE: return ProtoLevel::MEMORY_PRESSURE_LEVEL_MODERATE; - case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL: + case MEMORY_PRESSURE_LEVEL_CRITICAL: return ProtoLevel::MEMORY_PRESSURE_LEVEL_CRITICAL; } } diff --git a/naiveproxy/src/base/trace_event/memory_pressure_level_proto.h b/naiveproxy/src/base/trace_event/memory_pressure_level_proto.h index 03132c24ee..dd3fc05e58 100644 --- a/naiveproxy/src/base/trace_event/memory_pressure_level_proto.h +++ b/naiveproxy/src/base/trace_event/memory_pressure_level_proto.h @@ -18,9 +18,7 @@ namespace base { namespace trace_event { BASE_EXPORT perfetto::protos::pbzero::MemoryPressureLevel -MemoryPressureLevelToTraceEnum( - MemoryPressureListener::MemoryPressureLevel memory_pressure_level); - +MemoryPressureLevelToTraceEnum(MemoryPressureLevel memory_pressure_level); } } // namespace base diff --git a/naiveproxy/src/base/trace_event/memory_usage_estimator.h b/naiveproxy/src/base/trace_event/memory_usage_estimator.h index e155e38f64..10a1f87a6a 100644 --- a/naiveproxy/src/base/trace_event/memory_usage_estimator.h +++ b/naiveproxy/src/base/trace_event/memory_usage_estimator.h @@ -38,7 +38,7 @@ #include "base/containers/span.h" #include "base/memory/raw_ptr.h" #include "base/stl_util.h" -#include "base/types/always_false.h" +#include "third_party/abseil-cpp/absl/container/flat_hash_map.h" // Composable memory usage estimators. // @@ -203,6 +203,10 @@ size_t EstimateMemoryUsage(const base::LRUCacheSet& lru); template size_t EstimateMemoryUsage(const base::HashingLRUCacheSet& lru); +// Abseil containers +template +size_t EstimateMemoryUsage(const absl::flat_hash_map& map); + // TODO(dskiba): // std::forward_list @@ -268,7 +272,7 @@ size_t EstimateItemMemoryUsage(const T& value) { if constexpr (internal::HasEMU) { return EstimateMemoryUsage(value); } else if constexpr (!internal::IsKnownNonAllocatingType) { - static_assert(base::AlwaysFalse, + static_assert(false, "Neither global function 'size_t EstimateMemoryUsage(T)' " "nor member function 'size_t T::EstimateMemoryUsage() const' " "is defined for the type."); @@ -631,6 +635,18 @@ size_t EstimateMemoryUsage(const HashingLRUCacheSet& lru_cache) { return internal::DoEstimateMemoryUsageForLruCache(lru_cache); } +// Abseil containers +template +size_t EstimateMemoryUsage(const absl::flat_hash_map& map) { + using value_type = typename absl::flat_hash_map::value_type; + // `absl::flat_hash_map` stores its elements directly in an array. + // The memory usage includes the array itself (capacity * sizeof(value_type)) + // plus control bytes (capacity * sizeof(char)). See + // https://abseil.io/docs/cpp/guides/container#memory-usage for details. + return map.capacity() * (sizeof(value_type) + sizeof(char)) + + EstimateIterableMemoryUsage(map); +} + } // namespace trace_event } // namespace base diff --git a/naiveproxy/src/base/trace_event/trace_arguments.h b/naiveproxy/src/base/trace_event/trace_arguments.h index dad1a04c68..7da5e9d348 100644 --- a/naiveproxy/src/base/trace_event/trace_arguments.h +++ b/naiveproxy/src/base/trace_event/trace_arguments.h @@ -31,7 +31,7 @@ // identified by a name (a C string literal) and a value, which can be an // integer, enum, floating point, boolean, string pointer or reference, or // std::unique_ptr compatible values. Additionally, -// custom data types need to be supported, like time values or WTF::CString. +// custom data types need to be supported, like time values. // // TraceArguments is a helper class used to store 0 to 2 named arguments // corresponding to an individual trace macro call. As efficiently as possible, @@ -130,7 +130,7 @@ // Finally, it is possible to support initialization from custom values by // specializing the TraceValue::Helper<> template struct as described below. // -// This is how values of custom types like WTF::CString can be passed directly +// This is how values of custom types like base::Time can be passed directly // to trace macros. namespace base { diff --git a/naiveproxy/src/base/trace_event/trace_config.cc b/naiveproxy/src/base/trace_event/trace_config.cc index a9012f23d9..3cb2a47792 100644 --- a/naiveproxy/src/base/trace_event/trace_config.cc +++ b/naiveproxy/src/base/trace_event/trace_config.cc @@ -363,10 +363,7 @@ bool TraceConfig::IsEquivalentTo(const TraceConfig& other) const { } std::string TraceConfig::ToString() const { - Value dict = ToValue(); - std::string json; - JSONWriter::Write(dict, &json); - return json; + return WriteJson(ToValue()).value_or(""); } std::unique_ptr @@ -492,7 +489,8 @@ void TraceConfig::InitializeFromConfigDict(const Value::Dict& dict) { } void TraceConfig::InitializeFromConfigString(std::string_view config_string) { - std::optional dict = JSONReader::Read(config_string); + std::optional dict = + JSONReader::Read(config_string, JSON_PARSE_CHROMIUM_EXTENSIONS); if (dict && dict->is_dict()) { InitializeFromConfigDict(dict->GetDict()); } else { diff --git a/naiveproxy/src/base/trace_event/trace_event.h b/naiveproxy/src/base/trace_event/trace_event.h index 42dc76fe75..b6cb1a2734 100644 --- a/naiveproxy/src/base/trace_event/trace_event.h +++ b/naiveproxy/src/base/trace_event/trace_event.h @@ -193,6 +193,35 @@ class TraceScopedTrackableObject { IDType id_; }; +// Tracks that are used to group other tracks may not get any events of their +// own, so their descriptor needs to be explicitly registered. This class wraps +// a track to automatically register/unregistered its descriptor in the +// constructor/destructor. +template +class TrackRegistration { + public: + explicit TrackRegistration(const TrackType& track) : track_(track) { + if (perfetto::Tracing::IsInitialized()) { + // SetTrackDescriptor may crash in unit tests where tracing isn't + // initialized. + base::TrackEvent::SetTrackDescriptor(track, track.Serialize()); + } + } + ~TrackRegistration() { + if (perfetto::Tracing::IsInitialized()) { + base::TrackEvent::EraseTrackDescriptor(track_); + } + } + TrackRegistration(const TrackRegistration&) = delete; + TrackRegistration& operator=(const TrackRegistration&) = delete; + + const TrackType& operator*() const { return track_; } + const TrackType& track() const { return track_; } + + private: + TrackType track_; +}; + } // namespace trace_event } // namespace base diff --git a/naiveproxy/src/base/trace_event/trace_event_impl.cc b/naiveproxy/src/base/trace_event/trace_event_impl.cc index bdee289797..71322477f2 100644 --- a/naiveproxy/src/base/trace_event/trace_event_impl.cc +++ b/naiveproxy/src/base/trace_event/trace_event_impl.cc @@ -60,6 +60,9 @@ void WriteDebugAnnotation(protos::pbzero::DebugAnnotation* annotation, } // namespace perfetto namespace base::trace_event { +namespace { +bool g_perfetto_initialized_for_testing = false; +} bool ConvertableToTraceFormat::AppendToProto(ProtoAppender* appender) const { return false; @@ -337,4 +340,23 @@ void TraceEvent::AppendPrettyPrinted(std::ostringstream* out) const { } } +void SetPerfettoInitializedForTesting() { + g_perfetto_initialized_for_testing = true; +} + +bool IsPerfettoInitializedForTesting() { + return g_perfetto_initialized_for_testing; +} + +void InitializeInProcessPerfettoBackend() { + perfetto::TracingInitArgs init_args; + init_args.backends = perfetto::BackendType::kInProcessBackend; + init_args.shmem_batch_commits_duration_ms = 1000; + init_args.shmem_size_hint_kb = 4 * 1024; + init_args.shmem_direct_patching_enabled = true; + init_args.disallow_merging_with_system_tracks = true; + perfetto::Tracing::Initialize(init_args); + TrackEvent::Register(); +} + } // namespace base::trace_event diff --git a/naiveproxy/src/base/trace_event/trace_event_impl.h b/naiveproxy/src/base/trace_event/trace_event_impl.h index 27ae8aa047..360f045b24 100644 --- a/naiveproxy/src/base/trace_event/trace_event_impl.h +++ b/naiveproxy/src/base/trace_event/trace_event_impl.h @@ -26,6 +26,10 @@ namespace base::trace_event { +void BASE_EXPORT SetPerfettoInitializedForTesting(); +bool BASE_EXPORT IsPerfettoInitializedForTesting(); +void BASE_EXPORT InitializeInProcessPerfettoBackend(); + using ArgumentNameFilterPredicate = base::RepeatingCallback; diff --git a/naiveproxy/src/base/trace_event/trace_log.cc b/naiveproxy/src/base/trace_event/trace_log.cc index 910972916d..23af35137d 100644 --- a/naiveproxy/src/base/trace_event/trace_log.cc +++ b/naiveproxy/src/base/trace_event/trace_log.cc @@ -62,8 +62,6 @@ namespace base::trace_event { namespace { -bool g_perfetto_initialized_by_tracelog = false; - TraceLog* g_trace_log_for_testing = nullptr; ThreadTicks ThreadNow() { @@ -361,10 +359,10 @@ TraceLog* TraceLog::GetInstance() { void TraceLog::ResetForTesting() { auto* self = GetInstance(); AutoLock lock(self->observers_lock_); + self->tracing_session_.reset(); self->enabled_state_observers_.clear(); self->owned_enabled_state_observer_copy_.clear(); self->async_observers_.clear(); - self->InitializePerfettoIfNeeded(); } TraceLog::TraceLog() : process_id_(base::kNullProcessId) { @@ -474,38 +472,6 @@ std::vector TraceLog::GetTrackEventSessions() return track_event_sessions_; } -void TraceLog::InitializePerfettoIfNeeded() { - // When we're using the Perfetto client library, only tests should be - // recording traces directly through TraceLog. Production code should instead - // use perfetto::Tracing::NewTrace(). Let's make sure the tracing service - // didn't already initialize Perfetto in this process, because it's not safe - // to consume trace data from arbitrary processes through TraceLog as the JSON - // conversion here isn't sandboxed like with the real tracing service. - // - // Note that initializing Perfetto here requires the thread pool to be ready. - CHECK(!perfetto::Tracing::IsInitialized() || - g_perfetto_initialized_by_tracelog) - << "Don't use TraceLog for recording traces from non-test code. Use " - "perfetto::Tracing::NewTrace() instead."; - - if (perfetto::Tracing::IsInitialized()) { - return; - } - g_perfetto_initialized_by_tracelog = true; - perfetto::TracingInitArgs init_args; - init_args.backends = perfetto::BackendType::kInProcessBackend; - init_args.shmem_batch_commits_duration_ms = 1000; - init_args.shmem_size_hint_kb = 4 * 1024; - init_args.shmem_direct_patching_enabled = true; - init_args.disallow_merging_with_system_tracks = true; - perfetto::Tracing::Initialize(init_args); - TrackEvent::Register(); -} - -bool TraceLog::IsPerfettoInitializedByTraceLog() const { - return g_perfetto_initialized_by_tracelog; -} - void TraceLog::SetEnabled(const TraceConfig& trace_config, const perfetto::TraceConfig& perfetto_config) { AutoLock lock(lock_); @@ -515,8 +481,14 @@ void TraceLog::SetEnabled(const TraceConfig& trace_config, void TraceLog::SetEnabledImpl(const TraceConfig& trace_config, const perfetto::TraceConfig& perfetto_config) { DCHECK(!TrackEvent::IsEnabled()); + CHECK(perfetto::Tracing::IsInitialized()); + // When we're using the Perfetto client library, only tests should be + // recording traces directly through TraceLog. Production code should instead + // use perfetto::Tracing::NewTrace(). + CHECK(IsPerfettoInitializedForTesting()) + << "Don't use TraceLog for recording traces from non-test code. Use " + "perfetto::Tracing::NewTrace() instead."; lock_.AssertAcquired(); - InitializePerfettoIfNeeded(); perfetto_config_ = perfetto_config; tracing_session_ = perfetto::Tracing::NewTrace(); diff --git a/naiveproxy/src/base/trace_event/trace_log.h b/naiveproxy/src/base/trace_event/trace_log.h index 509e6d9092..8015219393 100644 --- a/naiveproxy/src/base/trace_event/trace_log.h +++ b/naiveproxy/src/base/trace_event/trace_log.h @@ -175,8 +175,6 @@ class BASE_EXPORT TraceLog : public perfetto::TrackEventSessionObserver { }; std::vector GetTrackEventSessions() const; - void InitializePerfettoIfNeeded(); - bool IsPerfettoInitializedByTraceLog() const; void SetEnabledImpl(const TraceConfig& trace_config, const perfetto::TraceConfig& perfetto_config); diff --git a/naiveproxy/src/base/trace_event/traced_value.cc b/naiveproxy/src/base/trace_event/traced_value.cc index 15358de352..7ab879f117 100644 --- a/naiveproxy/src/base/trace_event/traced_value.cc +++ b/naiveproxy/src/base/trace_event/traced_value.cc @@ -715,10 +715,6 @@ TracedValue::ValueHolder::ValueHolder(TracedValue::Array& value) { } TracedValue::ValueHolder::ValueHolder(TracedValue::ValueHolder&& other) { - // Remember to call a destructor if necessary. - if (kept_value_type_ == KeptValueType::kStdStringType) { - delete (&kept_value_.std_string_value); - } switch (other.kept_value_type_) { case KeptValueType::kIntType: { kept_value_.int_value = other.kept_value_.int_value; diff --git a/naiveproxy/src/base/tracing/BUILD.gn b/naiveproxy/src/base/tracing/BUILD.gn index 61bee55cc9..097822ef1c 100644 --- a/naiveproxy/src/base/tracing/BUILD.gn +++ b/naiveproxy/src/base/tracing/BUILD.gn @@ -21,6 +21,10 @@ generate_wrapper("perfetto_diff_tests") { "$_protos_path/perfetto/metrics/chrome/all_chrome_metrics.descriptor" _rebased_all_chrome_metrics_descriptor = rebase_path(_all_chrome_metrics_descriptor, root_build_dir) + _all_webview_metrics_descriptor = + "$_protos_path/perfetto/metrics/webview/all_webview_metrics.descriptor" + _rebased_all_webview_metrics_descriptor = + rebase_path(_all_webview_metrics_descriptor, root_build_dir) _chrome_track_event_descriptor = "$root_gen_dir/base/tracing/protos/chrome_track_event.descriptor" _rebased_chrome_track_event_descriptor = @@ -29,6 +33,10 @@ generate_wrapper("perfetto_diff_tests") { "$_protos_path/perfetto/trace/android/winscope.descriptor" _rebased_winscope_extensions_descriptor = rebase_path(_winscope_extensions_descriptor, root_build_dir) + _trace_summary_descriptor = + "$_protos_path/perfetto/trace_summary/trace_summary.descriptor" + _rebased_trace_summary_descriptor = + rebase_path(_trace_summary_descriptor, root_build_dir) _perfetto_script = rebase_path("//third_party/perfetto/tools/diff_test_trace_processor.py", @@ -52,12 +60,14 @@ generate_wrapper("perfetto_diff_tests") { "@WrappedPath($_rebased_test_extensions_descriptor)", "--metrics-descriptor", "@WrappedPath($_rebased_metrics_descriptor)", - "--all-chrome-metrics-descriptor", "@WrappedPath($_rebased_all_chrome_metrics_descriptor)", + "@WrappedPath($_rebased_all_webview_metrics_descriptor)", "--chrome-track-event-descriptor", "@WrappedPath($_rebased_chrome_track_event_descriptor)", "--winscope-extensions-descriptor", "@WrappedPath($_rebased_winscope_extensions_descriptor)", + "--summary-descriptor", + "@WrappedPath($_rebased_trace_summary_descriptor)", "--script", "@WrappedPath($_perfetto_script)", ] @@ -66,9 +76,11 @@ generate_wrapper("perfetto_diff_tests") { "//base/tracing/protos:chrome_track_event", "//third_party/perfetto/protos/perfetto/metrics:descriptor", "//third_party/perfetto/protos/perfetto/metrics/chrome:descriptor", + "//third_party/perfetto/protos/perfetto/metrics/webview:descriptor", "//third_party/perfetto/protos/perfetto/trace:descriptor", "//third_party/perfetto/protos/perfetto/trace:test_extensions_descriptor", "//third_party/perfetto/protos/perfetto/trace/android:winscope_descriptor", + "//third_party/perfetto/protos/perfetto/trace_summary:descriptor", "//third_party/perfetto/src/trace_processor:trace_processor_shell", ] @@ -80,7 +92,9 @@ generate_wrapper("perfetto_diff_tests") { _test_extensions_descriptor, _metrics_descriptor, _all_chrome_metrics_descriptor, + _all_webview_metrics_descriptor, _chrome_track_event_descriptor, _winscope_extensions_descriptor, + _trace_summary_descriptor, ] } diff --git a/naiveproxy/src/base/tracing/protos/BUILD.gn b/naiveproxy/src/base/tracing/protos/BUILD.gn index 86a7a49f0b..8ccfb3346d 100644 --- a/naiveproxy/src/base/tracing/protos/BUILD.gn +++ b/naiveproxy/src/base/tracing/protos/BUILD.gn @@ -32,6 +32,7 @@ proto_library("chrome_track_event") { } protozero_library("chrome_track_event_zero") { + proto_in_dir = "//" perfetto_root_path = "//third_party/perfetto/" sources = chrome_track_event_sources import_dirs = [ "//third_party/perfetto/" ] diff --git a/naiveproxy/src/base/tracing/protos/chrome_enums.proto b/naiveproxy/src/base/tracing/protos/chrome_enums.proto new file mode 100644 index 0000000000..2ce6dfb218 --- /dev/null +++ b/naiveproxy/src/base/tracing/protos/chrome_enums.proto @@ -0,0 +1,114 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +syntax = "proto2"; + +package perfetto.protos.chrome_enums; + +// Note: the protobuf C++ generator puts all enum values directly into the +// containing namespace. In C++ code prefer to shorten long names with an alias +// (eg. `namespace chrome_enums = perfetto::protos::chrome_enums`). + +// More detailed process breakdown than content::ProcessType. +enum ProcessType { + PROCESS_UNSPECIFIED = 0; + PROCESS_BROWSER = 1; + PROCESS_RENDERER = 2; + PROCESS_UTILITY = 3; + PROCESS_ZYGOTE = 4; + PROCESS_SANDBOX_HELPER = 5; + PROCESS_GPU = 6; + PROCESS_PPAPI_PLUGIN = 7; + PROCESS_PPAPI_BROKER = 8; + PROCESS_SERVICE_NETWORK = 9; + PROCESS_SERVICE_TRACING = 10; + PROCESS_SERVICE_STORAGE = 11; + PROCESS_SERVICE_AUDIO = 12; + PROCESS_SERVICE_DATA_DECODER = 13; + PROCESS_SERVICE_UTIL_WIN = 14; + PROCESS_SERVICE_PROXY_RESOLVER = 15; + PROCESS_SERVICE_CDM = 16; + PROCESS_SERVICE_VIDEO_CAPTURE = 17; + PROCESS_SERVICE_UNZIPPER = 18; + PROCESS_SERVICE_MIRRORING = 19; + PROCESS_SERVICE_FILEPATCHER = 20; + PROCESS_SERVICE_TTS = 21; + PROCESS_SERVICE_PRINTING = 22; + PROCESS_SERVICE_QUARANTINE = 23; + PROCESS_SERVICE_CROS_LOCALSEARCH = 24; + PROCESS_SERVICE_CROS_ASSISTANT_AUDIO_DECODER = 25; + PROCESS_SERVICE_FILEUTIL = 26; + PROCESS_SERVICE_PRINTCOMPOSITOR = 27; + PROCESS_SERVICE_PAINTPREVIEW = 28; + PROCESS_SERVICE_SPEECHRECOGNITION = 29; + PROCESS_SERVICE_XRDEVICE = 30; + PROCESS_SERVICE_READICON = 31; + PROCESS_SERVICE_LANGUAGEDETECTION = 32; + PROCESS_SERVICE_SHARING = 33; + PROCESS_SERVICE_MEDIAPARSER = 34; + PROCESS_SERVICE_QRCODEGENERATOR = 35; + PROCESS_SERVICE_PROFILEIMPORT = 36; + PROCESS_SERVICE_IME = 37; + PROCESS_SERVICE_RECORDING = 38; + PROCESS_SERVICE_SHAPEDETECTION = 39; + PROCESS_RENDERER_EXTENSION = 40; + PROCESS_SERVICE_MEDIA_FOUNDATION = 41; +} + +enum ThreadType { + THREAD_UNSPECIFIED = 0; + + THREAD_MAIN = 1; + THREAD_IO = 2; + + THREAD_POOL_BG_WORKER = 3; + THREAD_POOL_FG_WORKER = 4; + THREAD_POOL_FG_BLOCKING = 5; + THREAD_POOL_BG_BLOCKING = 6; + THREAD_POOL_SERVICE = 7; + + THREAD_COMPOSITOR = 8; + THREAD_VIZ_COMPOSITOR = 9; + THREAD_COMPOSITOR_WORKER = 10; + + THREAD_SERVICE_WORKER = 11; + THREAD_NETWORK_SERVICE = 12; + + THREAD_CHILD_IO = 13; + THREAD_BROWSER_IO = 14; + + THREAD_BROWSER_MAIN = 15; + THREAD_RENDERER_MAIN = 16; + THREAD_UTILITY_MAIN = 17; + THREAD_GPU_MAIN = 18; + + THREAD_CACHE_BLOCKFILE = 19; + THREAD_MEDIA = 20; + THREAD_AUDIO_OUTPUTDEVICE = 21; + THREAD_AUDIO_INPUTDEVICE = 22; + THREAD_GPU_MEMORY = 23; + THREAD_GPU_VSYNC = 24; + THREAD_DXA_VIDEODECODER = 25; + THREAD_BROWSER_WATCHDOG = 26; + THREAD_WEBRTC_NETWORK = 27; + THREAD_WINDOW_OWNER = 28; + THREAD_WEBRTC_SIGNALING = 29; + THREAD_WEBRTC_WORKER = 30; + THREAD_PPAPI_MAIN = 31; + THREAD_GPU_WATCHDOG = 32; + THREAD_SWAPPER = 33; + THREAD_GAMEPAD_POLLING = 34; + THREAD_WEBCRYPTO = 35; + THREAD_DATABASE = 36; + THREAD_PROXYRESOLVER = 37; + THREAD_DEVTOOLSADB = 38; + THREAD_NETWORKCONFIGWATCHER = 39; + THREAD_WASAPI_RENDER = 40; + THREAD_LOADER_LOCK_SAMPLER = 41; + + THREAD_MEMORY_INFRA = 50; + THREAD_SAMPLING_PROFILER = 51; + + THREAD_COMPOSITOR_GPU = 52; +} diff --git a/naiveproxy/src/base/tracing/protos/chrome_track_event.proto b/naiveproxy/src/base/tracing/protos/chrome_track_event.proto index 4f597eb359..c07e885ad7 100644 --- a/naiveproxy/src/base/tracing/protos/chrome_track_event.proto +++ b/naiveproxy/src/base/tracing/protos/chrome_track_event.proto @@ -41,6 +41,7 @@ message BlinkTaskScope { TASK_SCOPE_XML_HTTP_REQUEST = 8; TASK_SCOPE_SOFT_NAVIGATION = 9; TASK_SCOPE_MISC_EVENT = 10; + TASK_SCOPE_MICROTASK = 11; } optional TaskScopeType type = 1; optional int64 scope_task_id = 2; @@ -706,6 +707,7 @@ message BackForwardCacheCanStoreDocumentResult { CACHE_LIMIT_PRUNED_ON_MODERATE_MEMORY_PRESSURE = 66; CACHE_LIMIT_PRUNED_ON_CRITICAL_MEMORY_PRESSURE = 67; SHARED_WORKER_MESSAGE = 68; + SHARED_WORKER_WITH_NO_ACTIVE_CLIENT = 69; } optional BackForwardCacheNotRestoredReason @@ -851,6 +853,7 @@ message EventLatency { GESTURE_PINCH_UPDATE = 25; INERTIAL_GESTURE_SCROLL_UPDATE = 26; MOUSE_MOVED_EVENT = 27; + INERTIAL_GESTURE_SCROLL_END = 28; } optional EventType event_type = 1; @@ -873,15 +876,88 @@ message EventLatency { // aggregation) in which the input was first presented. See also // ChromeGraphicsPipeline.display_trace_id. optional int64 display_trace_id = 8; - // This is set only for scroll updates and is based on the - // Event.ScrollJank.DelayedFramesPercentage.FixedWindow3 metric. - // NOTE: This field is a new experimental version of is_janky_scrolled_frame. - // This field aims to address the old field's shortcomings and eventually - // replace it. For now, we recommend you still use the old field - // (is_janky_scrolled_frame). See the - // Event.ScrollJank.DelayedFramesPercentage.FixedWindow3 histogram's - // documentation for more details. - optional bool is_janky_scrolled_frame_v3 = 9; + + // Deprecated in favor of `scroll_jank_v4.is_janky`. Not filled + // anymore in newer versions of Chrome. + optional bool is_janky_scrolled_frame_v3 = 9 [deprecated = true]; + + // Result of the Scroll Jank V4 Metric for a scroll update. This is set only + // for scroll updates. See + // cc::ScrollUpdateEventMetrics::ScrollJankV4MetricResults, + // https://docs.google.com/document/d/1AaBvTIf8i-c-WTKkjaL4vyhQMkSdynxo3XEiwpofdeA + // and the Event.ScrollJank.DelayedFramesPercentage4.FixedWindow histogram's + // documentation for more information. + message ScrollJankV4Result { + // This field is a new version of `EventLatency.is_janky_scrolled_frame` + // based on the Event.ScrollJank.DelayedFramesPercentage4.FixedWindow + // metric. This field aims to address the old field's shortcomings and + // eventually replace it. + optional bool is_janky = 1; + + // Reason why Chrome's scroll jank v4 metric marked a scroll update as + // janky. A single scroll update can be janky for more than one reason. + // LINT.IfChange(JankReason) + enum JankReason { + JANK_REASON_UNSPECIFIED = 0; + + // Chrome's input→frame delivery slowed down to the point that it missed + // one or more VSyncs. + MISSED_VSYNC_DUE_TO_DECELERATING_INPUT_FRAME_DELIVERY = 1; + + // Chrome missed one or more VSyncs in the middle of a fast regular + // scroll. + MISSED_VSYNC_DURING_FAST_SCROLL = 2; + + // Chrome missed one or more VSyncs during the transition from a fast + // regular scroll to a fling. + MISSED_VSYNC_AT_START_OF_FLING = 3; + + // Chrome missed one or more VSyncs in the middle of a fling. + MISSED_VSYNC_DURING_FLING = 4; + } + // LINT.ThenChange(//cc/metrics/event_metrics.h:JankReason,//tools/metrics/histograms/metadata/event/histograms.xml:ScrollJankReasonV4) + + // Number of VSyncs that that Chrome missed before presenting the scroll + // update for each reason. Essentially a map. + message MissedVsyncsForJankReason { + optional JankReason jank_reason = 1; + optional int32 missed_vsyncs = 2; + } + repeated MissedVsyncsForJankReason missed_vsyncs_per_jank_reason = 2; + + // The absolute total raw (unpredicted) delta of all scroll updates included + // in the frame in which the scroll update was presented (in pixels). + optional float abs_total_raw_delta_pixels = 3; + + // The maximum absolute raw (unpredicted) delta out of all inertial (fling) + // scroll updates included in the frame in which the scroll update was + // presented (in pixels). Zero if there were no inertial scroll updates in + // the frame. + optional float max_abs_inertial_raw_delta_pixels = 4; + + // How many VSync were between (A) the frame in which the scroll update was + // presented and (B) the previous frame. If this value is greater than one, + // then Chrome potentially missed one or more VSyncs (i.e. might have been + // able to present this scroll update earlier). Empty if this scroll update + // was presented in the first scroll update of a scroll. + optional int32 vsyncs_since_previous_frame = 5; + + // The running delivery cut-off based on frames preceding the frame in which + // the scroll update was presented. Empty if this scroll update was + // presented in the first scroll update of a scroll. + optional int64 running_delivery_cutoff_us = 6; + + // The running delivery cut-off adjusted for the frame that the scroll + // update was presented in. Empty if this scroll update was presented in the + // first scroll update of a scroll or if `vsyncs_since_previous_frame` is + // one. + optional int64 adjusted_delivery_cutoff_us = 7; + + // The delivery cut-off of the frame that the scroll update was presented + // in. + optional int64 current_delivery_cutoff_us = 8; + } + optional ScrollJankV4Result scroll_jank_v4 = 10; } message ProcessSingleton { @@ -960,6 +1036,12 @@ message SequenceManagerTask { NORMAL_PRIORITY_CONTINUATION = 9; LOW_PRIORITY_CONTINUATION = 10; EXTREMELY_HIGH_PRIORITY = 11; + + // Priorities used in Network Service. + MEDIUM_PRIORITY = 12; + LOWEST_PRIORITY = 13; + IDLE_PRIORITY = 14; + THROTTLED_PRIORITY = 15; } enum QueueName { @@ -1030,11 +1112,20 @@ message SequenceManagerTask { V8_USER_VISIBLE_TQ = 56; V8_BEST_EFFORT_TQ = 57; + // TODO(crbug.com/450428442): Deprecate these TQ names when + // NetworkServicePerPriorityTaskQueues is enabled by default. NETWORK_SERVICE_THREAD_HIGH_TQ = 58; NETWORK_SERVICE_THREAD_DEFAULT_TQ = 59; UI_STARTUP_TQ = 60; IO_STARTUP_TQ = 61; + + NETWORK_SERVICE_THREAD_THROTTLED_TQ = 62; + NETWORK_SERVICE_THREAD_IDLE_TQ = 63; + NETWORK_SERVICE_THREAD_LOWEST_TQ = 64; + NETWORK_SERVICE_THREAD_LOW_TQ = 65; + NETWORK_SERVICE_THREAD_MEDIUM_TQ = 66; + NETWORK_SERVICE_THREAD_HIGHEST_TQ = 67; } optional Priority priority = 1; @@ -2003,10 +2094,16 @@ message CompositorTimingHistoryV2 { message WebViewStartup { optional bool from_ui_thread = 1 [deprecated = true]; // This enum must be kept in sync with WebViewChromiumAwInit.CallSite + // LINT.IfChange(WebViewStartup) enum CallSite { GET_AW_TRACING_CONTROLLER = 0; GET_AW_PROXY_CONTROLLER = 1; + // This entry should no longer be used. This was a catch all for all methods + // in the WebView instance but we now have different callsites for each + // method. WEBVIEW_INSTANCE = 2; + // This entry should no longer be used. This was a catch all for all static + // methods but we now have different callsites for each method. GET_STATICS = 3; GET_DEFAULT_GEOLOCATION_PERMISSIONS = 4; GET_DEFAULT_SERVICE_WORKER_CONTROLLER = 5; @@ -2015,7 +2112,107 @@ message WebViewStartup { GET_DEFAULT_WEBVIEW_DATABASE = 8; GET_TRACING_CONTROLLER = 9; ASYNC_WEBVIEW_STARTUP = 10; + WEBVIEW_INSTANCE_OVERLAY_HORIZONTAL_SCROLLBAR = 11; + WEBVIEW_INSTANCE_OVERLAY_VERTICAL_SCROLLBAR = 12; + WEBVIEW_INSTANCE_GET_CERTIFICATE = 13; + WEBVIEW_INSTANCE_GET_HTTP_AUTH_USERNAME_PASSWORD = 14; + WEBVIEW_INSTANCE_SAVE_STATE = 15; + WEBVIEW_INSTANCE_RESTORE_STATE = 16; + WEBVIEW_INSTANCE_LOAD_URL = 17; + WEBVIEW_INSTANCE_POST_URL = 18; + WEBVIEW_INSTANCE_LOAD_DATA = 19; + WEBVIEW_INSTANCE_LOAD_DATA_WITH_BASE_URL = 20; + WEBVIEW_INSTANCE_EVALUATE_JAVASCRIPT = 21; + WEBVIEW_INSTANCE_CAN_GO_BACK = 22; + WEBVIEW_INSTANCE_CAN_GO_FORWARD = 23; + WEBVIEW_INSTANCE_CAN_GO_BACK_OR_FORWARD = 24; + WEBVIEW_INSTANCE_IS_PAUSED = 25; + WEBVIEW_INSTANCE_COPY_BACK_FORWARD_LIST = 26; + WEBVIEW_INSTANCE_SHOW_FIND_DIALOG = 27; + WEBVIEW_INSTANCE_SET_WEBVIEW_CLIENT = 28; + WEBVIEW_INSTANCE_SET_WEBCHROME_CLIENT = 29; + WEBVIEW_INSTANCE_CREATE_WEBMESSAGE_CHANNEL = 30; + WEBVIEW_INSTANCE_GET_ZOOM_CONTROLS = 31; + WEBVIEW_INSTANCE_ZOOM_IN = 32; + WEBVIEW_INSTANCE_ZOOM_OUT = 33; + WEBVIEW_INSTANCE_ZOOM_BY = 34; + WEBVIEW_INSTANCE_SET_RENDERER_PRIORITY_POLICY = 35; + WEBVIEW_INSTANCE_GET_RENDERER_REQUESTED_PRIORITY = 36; + WEBVIEW_INSTANCE_GET_RENDERER_PRIORITY_WAIVED_WHEN_NOT_VISIBLE = 37; + WEBVIEW_INSTANCE_SET_TEXT_CLASSIFIER = 38; + WEBVIEW_INSTANCE_GET_TEXT_CLASSIFIER = 39; + WEBVIEW_INSTANCE_AUTOFILL = 40; + WEBVIEW_INSTANCE_ON_PROVIDE_AUTOFILL_VIRTUAL_STRUCTURE = 41; + WEBVIEW_INSTANCE_ON_PROVIDE_CONTENT_CAPTURE_STRUCTURE = 42; + WEBVIEW_INSTANCE_SHOULD_DELAY_CHILD_PRESSED_STATE = 43; + WEBVIEW_INSTANCE_GET_ACCESSIBILITY_NODE_PROVIDER = 44; + WEBVIEW_INSTANCE_ON_PROVIDE_VIRTUAL_STRUCTURE = 45; + WEBVIEW_INSTANCE_PERFORM_ACCESSIBILITY_ACTION = 46; + WEBVIEW_INSTANCE_ON_DRAW = 47; + WEBVIEW_INSTANCE_SET_LAYOUT_PARAMS = 48; + WEBVIEW_INSTANCE_ON_DRAG_EVENT = 49; + WEBVIEW_INSTANCE_ON_CREATE_INPUT_CONNECTION = 50; + WEBVIEW_INSTANCE_ON_KEY_MULTIPLE = 51; + WEBVIEW_INSTANCE_ON_KEY_DOWN = 52; + WEBVIEW_INSTANCE_ON_KEY_UP = 53; + WEBVIEW_INSTANCE_ON_ATTACHED_TO_WINDOW = 54; + WEBVIEW_INSTANCE_DISPATCH_KEY_EVENT = 55; + WEBVIEW_INSTANCE_ON_TOUCH_EVENT = 56; + WEBVIEW_INSTANCE_ON_HOVER_EVENT = 57; + WEBVIEW_INSTANCE_ON_GENERIC_MOTION_EVENT = 58; + WEBVIEW_INSTANCE_REQUEST_FOCUS = 59; + WEBVIEW_INSTANCE_ON_MEASURE = 60; + WEBVIEW_INSTANCE_REQUEST_CHILD_RECTANGLE_ON_SCREEN = 61; + WEBVIEW_INSTANCE_SET_BACKGROUND_COLOR = 62; + WEBVIEW_INSTANCE_ON_START_TEMPORARY_DETACH = 63; + WEBVIEW_INSTANCE_ON_FINISH_TEMPORARY_DETACH = 64; + WEBVIEW_INSTANCE_ON_CHECK_IS_TEXT_EDITOR = 65; + WEBVIEW_INSTANCE_ON_APPLY_WINDOW_INSETS = 66; + WEBVIEW_INSTANCE_ON_RESOLVE_POINTER_ICON = 67; + WEBVIEW_INSTANCE_COMPUTE_HORIZONTAL_SCROLL_RANGE = 68; + WEBVIEW_INSTANCE_COMPUTE_HORIZONTAL_SCROLL_OFFSET = 69; + WEBVIEW_INSTANCE_COMPUTE_VERTICAL_SCROLL_RANGE = 70; + WEBVIEW_INSTANCE_COMPUTE_VERTICAL_SCROLL_OFFSET = 71; + WEBVIEW_INSTANCE_COMPUTE_VERTICAL_SCROLL_EXTENT = 72; + WEBVIEW_INSTANCE_COMPUTE_SCROLL = 73; + WEBVIEW_INSTANCE_CREATE_PRINT_DOCUMENT_ADAPTER = 74; + WEBVIEW_INSTANCE_EXTRACT_SMART_CLIP_DATA = 75; + WEBVIEW_INSTANCE_SET_SMART_CLIP_RESULT_HANDLER = 76; + WEBVIEW_INSTANCE_GET_RENDER_PROCESS = 77; + WEBVIEW_INSTANCE_GET_WEBVIEW_RENDERER_CLIENT_ADAPTER = 78; + WEBVIEW_INSTANCE_PAGE_UP = 79; + WEBVIEW_INSTANCE_PAGE_DOWN = 80; + WEBVIEW_INSTANCE_LOAD_URL_ADDITIONAL_HEADERS = 81; + WEBVIEW_INSTANCE_INIT = 82; + WEBVIEW_INSTANCE_CAPTURE_PICTURE = 83; + WEBVIEW_INSTANCE_GET_SCALE = 84; + WEBVIEW_INSTANCE_SET_INITIAL_SCALE = 85; + WEBVIEW_INSTANCE_GET_HIT_TEST_RESULT = 86; + WEBVIEW_INSTANCE_GET_URL = 87; + WEBVIEW_INSTANCE_GET_ORIGINAL_URL = 88; + WEBVIEW_INSTANCE_GET_TITLE = 89; + WEBVIEW_INSTANCE_GET_FAVICON = 90; + STATIC_FIND_ADDRESS = 91; + STATIC_GET_DEFAULT_USER_AGENT = 92; + STATIC_SET_WEB_CONTENTS_DEBUGGING_ENABLED = 93; + STATIC_CLEAR_CLIENT_CERT_PREFERENCES = 94; + STATIC_FREE_MEMORY_FOR_TESTS = 95; + STATIC_ENABLE_SLOW_WHOLE_DOCUMENT_DRAW = 96; + STATIC_PARSE_FILE_CHOOSER_RESULT = 97; + STATIC_INIT_SAFE_BROWSING = 98; + STATIC_SET_SAFE_BROWSING_ALLOWLIST = 99; + STATIC_GET_SAFE_BROWSING_PRIVACY_POLICY_URL = 100; + STATIC_IS_MULTI_PROCESS_ENABLED = 101; + STATIC_GET_VARIATIONS_HEADER = 102; + STATIC_SET_DEFAULT_TRAFFIC_STATS_TAG = 103; + STATIC_SET_DEFAULT_TRAFFIC_STATS_UID = 104; + STATIC_SET_RENDERER_LIBRARY_PREFETCH_MODE = 105; + STATIC_GET_RENDERER_LIBRARY_PREFETCH_MODE = 106; + GET_DEFAULT_COOKIE_MANAGER = 107; + // Remember to update WebViewStartupCallSite in enums.xml when adding new + // values here. } + // LINT.ThenChange(//android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java:CallSite) // LINT.IfChange(WebViewChromiumStartupMode) enum StartupMode { @@ -2534,9 +2731,17 @@ message InputTransferHandler { optional TransferInputToVizResult transfer_result = 1; }; +message ResponseInfo { + // The HTTP response code. Will be left empty if the response code is unknown. + optional int64 response_code = 1; + + // Whether the response was served from the HTTP cache. + optional bool was_http_cache = 2; +}; + message ChromeTrackEvent { // Extension range for Chrome: 1000-1999 - // Next ID: 1077 + // Next ID: 1078 extend TrackEvent { optional ChromeAppState chrome_app_state = 1000; @@ -2701,5 +2906,7 @@ message ChromeTrackEvent { optional ChromeFrameReporter2 frame_reporter = 1075; optional InputTransferHandler input_transfer_handler = 1076; + + optional ResponseInfo response_info = 1077; } } diff --git a/naiveproxy/src/base/tracing/protos/chrome_track_event_import_wrapper.proto b/naiveproxy/src/base/tracing/protos/chrome_track_event_import_wrapper.proto index ba3ed79ab7..7b20fc95c0 100644 --- a/naiveproxy/src/base/tracing/protos/chrome_track_event_import_wrapper.proto +++ b/naiveproxy/src/base/tracing/protos/chrome_track_event_import_wrapper.proto @@ -5,4 +5,5 @@ syntax = "proto2"; // Import all .proto files that should be included in the proto descriptor. +import public "base/tracing/protos/chrome_enums.proto"; import public "base/tracing/protos/chrome_track_event.proto"; diff --git a/naiveproxy/src/base/tracing/protos/sources.gni b/naiveproxy/src/base/tracing/protos/sources.gni index cc4762777b..b1fcb363d4 100644 --- a/naiveproxy/src/base/tracing/protos/sources.gni +++ b/naiveproxy/src/base/tracing/protos/sources.gni @@ -4,11 +4,10 @@ # List of .proto files used when defining Chromium extensions for typed events. # New files should be added to this list. -# -# DO NOT EDIT THIS AT THE MOMENT. This file has to be supported in Perfetto -# first in order to be useful. -# TODO(b/181318121): Implement the support in Perfetto and remove the warning. -chrome_track_event_sources = [ "chrome_track_event.proto" ] +chrome_track_event_sources = [ + "chrome_enums.proto", + "chrome_track_event.proto", +] # protoc can generate a descriptor file from a single .proto file. If # `chrome_track_event_sources` contains multiple files, add a single wrapper diff --git a/naiveproxy/src/base/types/always_false.h b/naiveproxy/src/base/types/always_false.h deleted file mode 100644 index 77fc285da2..0000000000 --- a/naiveproxy/src/base/types/always_false.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_TYPES_ALWAYS_FALSE_H_ -#define BASE_TYPES_ALWAYS_FALSE_H_ - -namespace base { - -// A helper that can be used with a static_assert() that must always fail (e.g. -// for an undesirable template instantiation). Such a static_assert() cannot -// simply be written as static_assert(false, ...) because that would always fail -// to compile, even if the template was never instantiated. Instead, a common -// idiom is to force the static_assert() to depend on a template parameter so -// that it is only evaluated when the template is instantiated: -// -// template -// void SomeDangerousMethodThatShouldNeverCompile() { -// static_assert(base::AlwaysFalse, "explanatory message here"); -// } -// -// -// The issue of not being able to use static_assert(false, ...) in a -// non-instantiated template was fixed in C++23. When Chromium switches to -// building with C++23, remove this file and use false directly, and search -// across the Chromium codebase for "AlwaysFalse", as there are other -// implementations in places that cannot depend on this file. -// -// References: -// - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2593r0.html -// - https://github.com/cplusplus/papers/issues/1251 - -namespace internal { - -template -struct AlwaysFalseHelper { - static constexpr bool kValue = false; -}; - -} // namespace internal - -template -inline constexpr bool AlwaysFalse = - internal::AlwaysFalseHelper::kValue; - -} // namespace base - -#endif // BASE_TYPES_ALWAYS_FALSE_H_ diff --git a/naiveproxy/src/base/types/optional_ref.h b/naiveproxy/src/base/types/optional_ref.h index c1ac3c2422..60377580a7 100644 --- a/naiveproxy/src/base/types/optional_ref.h +++ b/naiveproxy/src/base/types/optional_ref.h @@ -5,6 +5,7 @@ #ifndef BASE_TYPES_OPTIONAL_REF_H_ #define BASE_TYPES_OPTIONAL_REF_H_ +#include #include #include #include @@ -66,7 +67,10 @@ namespace base { // // `optional_ref` is lightweight and should be passed by value. It is copy // constructible but not copy assignable, to reduce the risk of lifetime bugs. -template +template class optional_ref { private: // Disallowed because `std::optional` does not allow its template argument to @@ -74,6 +78,12 @@ class optional_ref { static_assert(!std::is_reference_v, "T must not be a reference type (use a pointer?)"); + // DanglingUntriaged is really just base::RawPtrTraits::kMayDangle, but + // ideally no one should be intentionally dangling pointers and then disabling + // detection... + static_assert(kRawPtrTraits == base::RawPtrTraits::kEmpty || + kRawPtrTraits == DanglingUntriaged); + // Both checks are important here, as: // - optional_ref does not allow silent implicit conversions between types, // so the decayed types must match exactly. @@ -192,8 +202,7 @@ class optional_ref { template requires std::equality_comparable_with constexpr bool operator==(optional_ref u) const { - return (!has_value() && !u.has_value()) || - (has_value() && u.has_value() && value() == u.value()); + return has_value() == u.has_value() && (!has_value() || value() == *u); } // Equality comparison operator against `T`. @@ -204,16 +213,14 @@ class optional_ref { } // Three-way comparison (homogeneous). Mirrors that of std::optional. - friend constexpr auto operator<=>(const optional_ref x, - const optional_ref y) + friend constexpr auto operator<=>(optional_ref x, optional_ref y) requires std::three_way_comparable { - return (!x.ptr_ || !y.ptr_) ? (!!x.ptr_) <=> (!!y.ptr_) - : *x.ptr_ <=> *y.ptr_; + return x && y ? *x <=> *y : x.has_value() <=> y.has_value(); } private: - raw_ptr const ptr_ = nullptr; + raw_ptr const ptr_ = nullptr; }; template diff --git a/naiveproxy/src/base/types/strong_alias.h b/naiveproxy/src/base/types/strong_alias.h index 1ff8e35d21..cc958afbfe 100644 --- a/naiveproxy/src/base/types/strong_alias.h +++ b/naiveproxy/src/base/types/strong_alias.h @@ -113,6 +113,16 @@ class StrongAlias { friend bool operator==(const StrongAlias& lhs, const StrongAlias& rhs) = default; + // Make this type hashable by Abseil if the underlying type is hashable + // by Abseil. + template + requires requires(H h, const StrongAlias& strong_alias) { + { H::combine(std::move(h), strong_alias.value()) } -> std::same_as; + } + friend H AbslHashValue(H h, const StrongAlias& strong_alias) { + return H::combine(std::move(h), strong_alias.value_); + } + // If UnderlyingType can be serialised into trace, its alias is also // serialisable. template diff --git a/naiveproxy/src/base/types/variant_util.h b/naiveproxy/src/base/types/variant_util.h index b3cbcfa4eb..12f6f37531 100644 --- a/naiveproxy/src/base/types/variant_util.h +++ b/naiveproxy/src/base/types/variant_util.h @@ -10,14 +10,12 @@ #include #include -#include "base/types/always_false.h" - namespace base { namespace internal { template struct VariantIndexOfTypeHelper { - static_assert(AlwaysFalse, "Variant must be an std::variant<...>"); + static_assert(false, "Variant must be an std::variant<...>"); }; template diff --git a/naiveproxy/src/base/types/variant_util_nocompile.nc b/naiveproxy/src/base/types/variant_util_nocompile.nc index 80ae5bc350..128a85c242 100644 --- a/naiveproxy/src/base/types/variant_util_nocompile.nc +++ b/naiveproxy/src/base/types/variant_util_nocompile.nc @@ -15,13 +15,13 @@ namespace base { inline constexpr size_t kValue = VariantIndexOfType, int>(); // expected-error {{constexpr variable 'kValue' must be initialized by a constant expression}} // expected-error@base/types/variant_util.h:* {{Variant is not constructible from T}} // expected-error@base/types/variant_util.h:* {{no matching conversion for functional-style cast}} - // expected-error@base/types/variant_util.h:* 0-1 {{no matching constructor for initialization}} + // expected-error@base/types/variant_util.h:* {{no matching constructor for initialization}} // Should fail if the type is not mentioned in the variant instantiation at // all. inline constexpr size_t kValue2 = VariantIndexOfType, bool>(); // expected-error {{constexpr variable 'kValue2' must be initialized by a constant expression}} // expected-error@base/types/variant_util.h:* {{Variant is not constructible from T}} // expected-error@base/types/variant_util.h:* {{no matching conversion for functional-style cast}} - // expected-error@base/types/variant_util.h:* 0-1 {{no matching constructor for initialization}} + // expected-error@base/types/variant_util.h:* {{no matching constructor for initialization}} } // namespace base diff --git a/naiveproxy/src/base/uuid.cc b/naiveproxy/src/base/uuid.cc index 9a45669bb2..1628a9b679 100644 --- a/naiveproxy/src/base/uuid.cc +++ b/naiveproxy/src/base/uuid.cc @@ -13,6 +13,7 @@ #include "base/compiler_specific.h" #include "base/containers/span.h" #include "base/hash/hash.h" +#include "base/numerics/byte_conversions.h" #include "base/rand_util.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" @@ -78,30 +79,29 @@ Uuid Uuid::GenerateRandomV4() { Uuid Uuid::FormatRandomDataAsV4Impl(base::span input) { DCHECK_EQ(input.size_bytes(), kGuidV4InputLength); - uint64_t sixteen_bytes[2]; - UNSAFE_TODO(memcpy(&sixteen_bytes, input.data(), sizeof(sixteen_bytes))); + uint64_t first_u64 = U64FromLittleEndian(input.first<8>()); + uint64_t second_u64 = U64FromLittleEndian(input.last<8>()); // Set the Uuid to version 4 as described in RFC 4122, section 4.4. // The format of Uuid version 4 must be xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, // where y is one of [8, 9, a, b]. // Clear the version bits and set the version to 4: - sixteen_bytes[0] &= 0xffffffff'ffff0fffULL; - sixteen_bytes[0] |= 0x00000000'00004000ULL; + first_u64 &= 0xffffffff'ffff0fffULL; + first_u64 |= 0x00000000'00004000ULL; // Clear bit 65 and set bit 64, to set the 'var' field to 0b10 per RFC 9562 // section 5.4. - sixteen_bytes[1] &= 0x3fffffff'ffffffffULL; - sixteen_bytes[1] |= 0x80000000'00000000ULL; + second_u64 &= 0x3fffffff'ffffffffULL; + second_u64 |= 0x80000000'00000000ULL; Uuid uuid; - uuid.lowercase_ = - StringPrintf("%08x-%04x-%04x-%04x-%012llx", - static_cast(sixteen_bytes[0] >> 32), - static_cast((sixteen_bytes[0] >> 16) & 0x0000ffff), - static_cast(sixteen_bytes[0] & 0x0000ffff), - static_cast(sixteen_bytes[1] >> 48), - sixteen_bytes[1] & 0x0000ffff'ffffffffULL); + uuid.lowercase_ = StringPrintf( + "%08x-%04x-%04x-%04x-%012llx", static_cast(first_u64 >> 32), + static_cast((first_u64 >> 16) & 0x0000ffff), + static_cast(first_u64 & 0x0000ffff), + static_cast(second_u64 >> 48), + second_u64 & 0x0000ffff'ffffffffULL); return uuid; } diff --git a/naiveproxy/src/base/values.cc b/naiveproxy/src/base/values.cc index 571d7be415..6abf643cbd 100644 --- a/naiveproxy/src/base/values.cc +++ b/naiveproxy/src/base/values.cc @@ -378,6 +378,10 @@ size_t DictValue::size() const { return storage_.size(); } +void DictValue::reserve(size_t capacity) { + return storage_.reserve(capacity); +} + DictValue::iterator DictValue::begin() { return iterator(storage_.begin()); } @@ -543,6 +547,11 @@ ListValue* DictValue::EnsureList(std::string_view key) { } Value* DictValue::Set(std::string_view key, Value&& value) & { + // These methods should typically be modified together: + // Value* DictValue::Set(std::string_view key, Value&& value) & + // DictValue::Set_HintAtEnd(std::string_view key, Value&& value) & + // DictValue&& DictValue::Set(std::string_view key, Value&& value) && + DCHECK(IsStringUTF8AllowingNoncharacters(key)); auto wrapped_value = std::make_unique(std::move(value)); @@ -595,7 +604,26 @@ Value* DictValue::Set(std::string_view key, ListValue&& value) & { return Set(key, Value(std::move(value))); } +Value* DictValue::Set_HintAtEnd(std::string_view key, Value&& value) & { + // These methods should typically be modified together: + // Value* DictValue::Set(std::string_view key, Value&& value) & + // DictValue::Set_HintAtEnd(std::string_view key, Value&& value) & + // DictValue&& DictValue::Set(std::string_view key, Value&& value) && + + DCHECK(IsStringUTF8AllowingNoncharacters(key)); + + auto wrapped_value = std::make_unique(std::move(value)); + auto* raw_value = wrapped_value.get(); + storage_.insert_or_assign(storage_.end(), key, std::move(wrapped_value)); + return raw_value; +} + DictValue&& DictValue::Set(std::string_view key, Value&& value) && { + // These methods should typically be modified together: + // Value* DictValue::Set(std::string_view key, Value&& value) & + // DictValue::Set_HintAtEnd(std::string_view key, Value&& value) & + // DictValue&& DictValue::Set(std::string_view key, Value&& value) && + DCHECK(IsStringUTF8AllowingNoncharacters(key)); storage_.insert_or_assign(key, std::make_unique(std::move(value))); return std::move(*this); diff --git a/naiveproxy/src/base/values.h b/naiveproxy/src/base/values.h index 79ccb4fc26..bd5c1828fe 100644 --- a/naiveproxy/src/base/values.h +++ b/naiveproxy/src/base/values.h @@ -279,6 +279,10 @@ class BASE_EXPORT GSL_OWNER DictValue { // Returns the number of entries in this dictionary. size_t size() const; + // Increase the capacity of the backing container, but does not change the + // size. Assume all existing iterators will be invalidated. + void reserve(size_t capacity); + // Returns an iterator to the first entry in this dictionary. iterator begin(); const_iterator begin() const; @@ -358,6 +362,10 @@ class BASE_EXPORT GSL_OWNER DictValue { Value* Set(std::string_view key, DictValue&& value) &; Value* Set(std::string_view key, ListValue&& value) &; + // Same as above, but more efficient if the new key is greater than all + // pre-existing keys in the dictionary. + Value* Set_HintAtEnd(std::string_view key, Value&& value) &; + // Rvalue overrides of the `Set` methods, which allow you to construct // a `Value::Dict` builder-style: // diff --git a/naiveproxy/src/base/version_info/android/BUILD.gn b/naiveproxy/src/base/version_info/android/BUILD.gn index 264d010326..64795555f8 100644 --- a/naiveproxy/src/base/version_info/android/BUILD.gn +++ b/naiveproxy/src/base/version_info/android/BUILD.gn @@ -22,6 +22,7 @@ android_library("version_constants_java") { deps = [ ":generate_version_constants", ":version_constants_bridge_jni_java", + "//base:resetters_java", "//build/android:build_java", "//third_party/androidx:androidx_annotation_annotation_java", "//third_party/jni_zero:jni_zero_java", diff --git a/naiveproxy/src/base/version_info/android/OWNERS b/naiveproxy/src/base/version_info/android/OWNERS index 154a23b925..e5ddca162b 100644 --- a/naiveproxy/src/base/version_info/android/OWNERS +++ b/naiveproxy/src/base/version_info/android/OWNERS @@ -1 +1 @@ -torne@chromium.org +file://base/android/OWNERS diff --git a/naiveproxy/src/base/win/access_control_list.cc b/naiveproxy/src/base/win/access_control_list.cc index 4a3f9494ff..04111f5a82 100644 --- a/naiveproxy/src/base/win/access_control_list.cc +++ b/naiveproxy/src/base/win/access_control_list.cc @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -177,6 +178,42 @@ bool AccessControlList::SetEntry(const Sid& sid, return SetEntries(ace_list); } +bool AccessControlList::AddAccessAllowedConditionalAce( + const Sid& sid, + DWORD ace_flags, + DWORD access_mask, + std::wstring_view condition) { + base::HeapArray base_acl = + acl_.empty() ? EmptyAclToBuffer() + : base::HeapArray::CopiedFrom(acl_); + std::wstring condition_str(condition); + DWORD length; + if (::AddConditionalAce(reinterpret_cast(base_acl.data()), ACL_REVISION, + ace_flags, ACCESS_ALLOWED_CALLBACK_ACE_TYPE, + access_mask, sid.GetPSID(), condition_str.data(), + &length)) { + ::SetLastError(ERROR_INVALID_PARAMETER); + return false; + } + + if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER) { + return false; + } + + base::HeapArray acl = base::HeapArray::Uninit(length); + acl.copy_prefix_from(base_acl); + ACL* pacl = reinterpret_cast(acl.data()); + pacl->AclSize = checked_cast(length); + if (!::AddConditionalAce(pacl, ACL_REVISION, ace_flags, + ACCESS_ALLOWED_CALLBACK_ACE_TYPE, access_mask, + sid.GetPSID(), condition_str.data(), &length)) { + return false; + } + + acl_ = std::move(acl); + return true; +} + AccessControlList AccessControlList::Clone() const { return AccessControlList{get()}; } diff --git a/naiveproxy/src/base/win/access_control_list.h b/naiveproxy/src/base/win/access_control_list.h index 3384b302a7..80a1d8cbd7 100644 --- a/naiveproxy/src/base/win/access_control_list.h +++ b/naiveproxy/src/base/win/access_control_list.h @@ -9,6 +9,7 @@ #include #include +#include #include #include "base/base_export.h" @@ -95,6 +96,18 @@ class BASE_EXPORT AccessControlList { DWORD access_mask, DWORD inheritance); + // Add an access allowed conditional ACE to the ACL. + // |sid| the SID for the ACE. + // |ace_flags| the flags for the ACE, such as inheritance. + // |access_mask| the granted access mask. + // |condition| the conditional expression to filter the ACE. The conditional + // expression must be enclosed with parentheses. + // Returns true if successful, false on error with the Win32 last error set. + bool AddAccessAllowedConditionalAce(const Sid& sid, + DWORD ace_flags, + DWORD access_mask, + std::wstring_view condition); + // Make a clone of the current AccessControlList object. AccessControlList Clone() const; diff --git a/naiveproxy/src/base/win/access_token.cc b/naiveproxy/src/base/win/access_token.cc index 89e0b5cd27..62436f510f 100644 --- a/naiveproxy/src/base/win/access_token.cc +++ b/naiveproxy/src/base/win/access_token.cc @@ -22,6 +22,7 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/win/access_control_list.h" +#include "base/win/win_util.h" namespace base::win { @@ -39,7 +40,7 @@ typedef struct _TOKEN_SECURITY_ATTRIBUTE_V1 { USHORT Reserved; ULONG Flags; ULONG ValueCount; - PLONG64 pInt64; + PUNICODE_STRING pString; } TOKEN_SECURITY_ATTRIBUTE_V1, *PTOKEN_SECURITY_ATTRIBUTE_V1; #define TOKEN_SECURITY_ATTRIBUTES_INFORMATION_VERSION_V1 1 @@ -84,9 +85,9 @@ typedef struct _TOKEN_SECURITY_ATTRIBUTES_AND_OPERATION_INFORMATION { } TOKEN_SECURITY_ATTRIBUTES_AND_OPERATION_INFORMATION, *PTOKEN_SECURITY_ATTRIBUTES_AND_OPERATION_INFORMATION; -#define TOKEN_SECURITY_ATTRIBUTE_TYPE_INT64 0x01 -static_assert(TOKEN_SECURITY_ATTRIBUTE_TYPE_INT64 == - AUTHZ_SECURITY_ATTRIBUTE_TYPE_INT64); +#define TOKEN_SECURITY_ATTRIBUTE_TYPE_STRING 0x03 +static_assert(TOKEN_SECURITY_ATTRIBUTE_TYPE_STRING == + AUTHZ_SECURITY_ATTRIBUTE_TYPE_STRING); #define TOKEN_SECURITY_ATTRIBUTE_NON_INHERITABLE 0x0001 static_assert(TOKEN_SECURITY_ATTRIBUTE_NON_INHERITABLE == @@ -286,6 +287,27 @@ std::optional AdjustPrivilege(const ScopedHandle& token, return attributes; } +std::optional FindSecurityAttribute( + std::optional>& buffer, + std::wstring_view name) { + if (!buffer) { + return std::nullopt; + } + + const auto* info = GetType(buffer); + if (info->Version != TOKEN_SECURITY_ATTRIBUTES_INFORMATION_VERSION_V1) { + return std::nullopt; + } + + for (ULONG i = 0; i < info->AttributeCount; ++i) { + if (UnicodeStringToView(info->pAttributeV1[i].Name) == name) { + return &info->pAttributeV1[i]; + } + } + + return nullptr; +} + } // namespace bool AccessToken::Group::IsIntegrity() const { @@ -732,7 +754,9 @@ bool AccessToken::RemoveAllPrivileges() { /*PreviousState=*/nullptr, /*ReturnLength=*/nullptr); } -bool AccessToken::AddSecurityAttribute(const std::wstring& name, bool inherit) { +bool AccessToken::AddSecurityAttribute(std::wstring_view name, + bool inherit, + std::wstring_view value) { TOKEN_SECURITY_ATTRIBUTE_V1 attr = {}; attr.Flags = TOKEN_SECURITY_ATTRIBUTE_MANDATORY; @@ -740,11 +764,17 @@ bool AccessToken::AddSecurityAttribute(const std::wstring& name, bool inherit) { attr.Flags |= TOKEN_SECURITY_ATTRIBUTE_NON_INHERITABLE; } - ::RtlInitUnicodeString(&attr.Name, name.c_str()); - LONG64 value = 0; + if (!ViewToUnicodeString(name, attr.Name)) { + return false; + } + + UNICODE_STRING ustr_value = {}; + if (!ViewToUnicodeString(value, ustr_value)) { + return false; + } attr.ValueCount = 1; - attr.ValueType = TOKEN_SECURITY_ATTRIBUTE_TYPE_INT64; - attr.pInt64 = &value; + attr.ValueType = TOKEN_SECURITY_ATTRIBUTE_TYPE_STRING; + attr.pString = &ustr_value; TOKEN_SECURITY_ATTRIBUTES_INFORMATION attrs = {}; attrs.Version = TOKEN_SECURITY_ATTRIBUTES_INFORMATION_VERSION_V1; @@ -761,6 +791,35 @@ bool AccessToken::AddSecurityAttribute(const std::wstring& name, bool inherit) { return Set(token_, TokenSecurityAttributes, info); } +std::optional AccessToken::HasSecurityAttribute( + std::wstring_view name) const { + std::optional> buffer = + GetTokenInfo(token_.get(), TokenSecurityAttributes); + const auto attr = FindSecurityAttribute(buffer, name); + if (!attr) { + return std::nullopt; + } + return *attr != nullptr; +} + +std::optional AccessToken::GetSecurityAttributeString( + std::wstring_view name) const { + std::optional> buffer = + GetTokenInfo(token_.get(), TokenSecurityAttributes); + const auto attr = FindSecurityAttribute(buffer, name); + if (!attr) { + return std::nullopt; + } + PTOKEN_SECURITY_ATTRIBUTE_V1 attr_val = *attr; + if (attr_val == nullptr || + attr_val->ValueType != TOKEN_SECURITY_ATTRIBUTE_TYPE_STRING || + attr_val->ValueCount < 1) { + return std::nullopt; + } + + return std::wstring(UnicodeStringToView(*attr_val->pString)); +} + bool AccessToken::is_valid() const { return token_.is_valid(); } diff --git a/naiveproxy/src/base/win/access_token.h b/naiveproxy/src/base/win/access_token.h index 10599b1318..613492a0db 100644 --- a/naiveproxy/src/base/win/access_token.h +++ b/naiveproxy/src/base/win/access_token.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include "base/base_export.h" @@ -319,12 +320,23 @@ class BASE_EXPORT AccessToken { // Add a security attribute by name to the token. // |name| the name of the attribute to add. - // The security attribute is added with a single 64-bit integer value. The - // purpose of this is to add a marker attribute for the purposes of access - // checking rather than for general use. + // |inherit| whether the attribute can be inherited by child processes. + // |value| the value of the attribute as a string. // The token must be opened with TOKEN_ADJUST_DEFAULT access. The caller must // have SeTcbPrivilege enabled to successfully add the attribute. - bool AddSecurityAttribute(const std::wstring& name, bool inherit); + bool AddSecurityAttribute(std::wstring_view name, + bool inherit, + std::wstring_view value); + + // Returns whether or not the token has the specified security attribute. The + // value of the security attribute is ignored. Returns std::nullopt if the + // token's security attributes could not be queried. + std::optional HasSecurityAttribute(std::wstring_view name) const; + + // Returns a string value from a security attribute. Returns std::nullopt if + // the attribute doesn't exist or does not contain a string value. + std::optional GetSecurityAttributeString( + std::wstring_view name) const; // Indicates if the AccessToken object is valid. bool is_valid() const; diff --git a/naiveproxy/src/base/win/delayload_helpers.h b/naiveproxy/src/base/win/delayload_helpers.h new file mode 100644 index 0000000000..78cfbc67b0 --- /dev/null +++ b/naiveproxy/src/base/win/delayload_helpers.h @@ -0,0 +1,61 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_WIN_DELAYLOAD_HELPERS_H_ +#define BASE_WIN_DELAYLOAD_HELPERS_H_ + +#include + +#include + +#include "base/strings/cstring_view.h" +#include "base/types/expected.h" + +namespace base::win { + +// Resolves all delayload imports for `module` rather than doing so when the +// functions are first called. Returns `bool:true` if the attempt succeeded, +// `bool:false` if the module is not a delayloaded dep of the current module +// (this often happens in tests or the component build), or an `HRESULT` error +// otherwise. This helper is `inline` so that the module calling this helper +// is the one that attempts the import (rather than base.dll in the component +// build), and brings in ``. +// +// See docs for __HrLoadAllImportsForDll() at +// https://learn.microsoft.com/en-us/cpp/build/reference/linker-support-for-delay-loaded-dlls +// +// Note that `dll_name` is case-sensitive including the dll extension and must +// match the name listed in the current module's delayloaded imports section. +inline base::expected LoadAllImportsForDll( + base::cstring_view dll_name) { + HRESULT hr = E_FAIL; + __try { + hr = ::__HrLoadAllImportsForDll(dll_name.c_str()); + + if (hr == HRESULT_FROM_WIN32(ERROR_MOD_NOT_FOUND)) { + // __HrLoadAllImportsForDll returns this exact value (FACILITY_WIN32) + // if the module is not found in the calling module's list of delay + // imports. This may be the case in the component build or in tests, + // where the module may be delayloaded by some module other than + // chrome.dll or the test binary. + return base::ok(false); + } + } __except (HRESULT_FACILITY(::GetExceptionCode()) == FACILITY_VISUALCPP + ? EXCEPTION_EXECUTE_HANDLER + : EXCEPTION_CONTINUE_SEARCH) { + // Resolution of all imports failed; possibly because the module failed to + // load or because one or more imports was not found. Note that the filter + // expression above matches exceptions where the code is an HRESULT with the + // facility bits set to FACILITY_VISUALCPP, so the following cast is safe. + hr = static_cast(::GetExceptionCode()); + } + if (FAILED(hr)) { + return base::unexpected(hr); + } + return base::ok(true); +} + +} // namespace base::win + +#endif // BASE_WIN_DELAYLOAD_HELPERS_H_ diff --git a/naiveproxy/src/base/win/event_trace_provider.h b/naiveproxy/src/base/win/event_trace_provider.h index edc9a482ff..254c21ff35 100644 --- a/naiveproxy/src/base/win/event_trace_provider.h +++ b/naiveproxy/src/base/win/event_trace_provider.h @@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - // Declaration of a Windows event trace provider class, to allow using // Windows Event Tracing for logging transport and control. #ifndef BASE_WIN_EVENT_TRACE_PROVIDER_H_ @@ -20,7 +15,9 @@ #include #include +#include #include +#include #include "base/base_export.h" #include "base/compiler_specific.h" @@ -38,7 +35,7 @@ using EtwEventFlags = ULONG; template struct EtwMofEventBase { EVENT_TRACE_HEADER header; - MOF_FIELD fields[N]; + std::array fields; }; // Utility class to auto-initialize event trace header structures. @@ -47,17 +44,20 @@ class EtwMofEvent : public EtwMofEventBase { public: using Super = EtwMofEventBase; + static_assert(std::is_trivial_v && std::is_standard_layout_v, + "EtwMofEventBase must be a POD type."); + // Clang and the C++ standard don't allow unqualified lookup into dependent // bases, hence these using decls to explicitly pull the names out. using EtwMofEventBase::header; using EtwMofEventBase::fields; - EtwMofEvent() { memset(static_cast(this), 0, sizeof(Super)); } + EtwMofEvent() : Super{} {} EtwMofEvent(const EtwEventClass& event_class, EtwEventType type, - EtwEventLevel level) { - memset(static_cast(this), 0, sizeof(Super)); + EtwEventLevel level) + : Super{} { header.Size = sizeof(Super); header.Guid = event_class; header.Class.Type = type; @@ -68,8 +68,8 @@ class EtwMofEvent : public EtwMofEventBase { EtwMofEvent(const EtwEventClass& event_class, EtwEventType type, EtwEventVersion version, - EtwEventLevel level) { - memset(static_cast(this), 0, sizeof(Super)); + EtwEventLevel level) + : Super{} { header.Size = sizeof(Super); header.Guid = event_class; header.Class.Type = type; diff --git a/naiveproxy/src/base/win/hardware_check.cc b/naiveproxy/src/base/win/hardware_check.cc index 4e2da04cd3..425823a127 100644 --- a/naiveproxy/src/base/win/hardware_check.cc +++ b/naiveproxy/src/base/win/hardware_check.cc @@ -17,6 +17,7 @@ #include "base/scoped_native_library.h" #include "base/strings/string_util.h" #include "base/system/sys_info.h" +#include "base/threading/scoped_thread_priority.h" #include "base/win/registry.h" #include "base/win/windows_version.h" #include "build/build_config.h" @@ -85,6 +86,8 @@ bool IsUEFISecureBootCapable() { } bool IsTPM20Supported() { + SCOPED_MAY_LOAD_LIBRARY_AT_BACKGROUND_PRIORITY(); + // Using dynamic loading instead of using linker support for delay // loading to prevent failed loads being treated as a fatal failure which // can happen in rare cases due to missing or corrupted DLL file. @@ -113,7 +116,9 @@ bool HardwareEvaluationResult::IsEligible() const { HardwareEvaluationResult EvaluateWin11HardwareRequirements() { static constexpr int64_t kMinTotalDiskSpace = 64 * 1024 * 1024; - static constexpr uint64_t kMinTotalPhysicalMemory = 4 * 1024 * 1024; + // TODO(crbug.com/429140103): This was migrated as-is to 4MiB in ByteCount but + // the legacy code potentially intended 4GiB, needs investigation. + static constexpr ByteCount kMinTotalPhysicalMemory = MiB(4); static const HardwareEvaluationResult evaluate_win11_upgrade_eligibility = [] { @@ -126,10 +131,10 @@ HardwareEvaluationResult EvaluateWin11HardwareRequirements() { SysInfo::AmountOfPhysicalMemory() >= kMinTotalPhysicalMemory; FilePath system_path; - result.disk = - PathService::Get(DIR_SYSTEM, &system_path) && - SysInfo::AmountOfTotalDiskSpace( - FilePath(system_path.GetComponents()[0])) >= kMinTotalDiskSpace; + result.disk = PathService::Get(DIR_SYSTEM, &system_path) && + SysInfo::AmountOfTotalDiskSpace( + FilePath(system_path.GetComponents()[0])) + .value_or(-1) >= kMinTotalDiskSpace; result.firmware = IsUEFISecureBootCapable(); diff --git a/naiveproxy/src/base/win/object_watcher.h b/naiveproxy/src/base/win/object_watcher.h index daa89935d6..be4a7d7c95 100644 --- a/naiveproxy/src/base/win/object_watcher.h +++ b/naiveproxy/src/base/win/object_watcher.h @@ -7,7 +7,7 @@ #include "base/base_export.h" #include "base/functional/callback.h" -#include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/task/sequenced_task_runner.h" #include "base/win/windows_types.h" diff --git a/naiveproxy/src/base/win/scoped_gdi_object.h b/naiveproxy/src/base/win/scoped_gdi_object.h index def6bf4314..ad8a38181a 100644 --- a/naiveproxy/src/base/win/scoped_gdi_object.h +++ b/naiveproxy/src/base/win/scoped_gdi_object.h @@ -7,7 +7,6 @@ #include "base/base_export.h" #include "base/scoped_generic.h" -#include "base/types/always_false.h" #include "base/win/win_handle_types.h" // Defines `ScopedGDIObject`, an RAII helper for GDI objects. Use like @@ -37,7 +36,7 @@ template struct BASE_EXPORT ScopedGDIObjectTraits { static T InvalidValue() { return nullptr; } static void Free(T object) { - static_assert(base::AlwaysFalse, "Explicitly forward-declare this T"); + static_assert(false, "Explicitly forward-declare this T"); } }; diff --git a/naiveproxy/src/base/win/security_descriptor.cc b/naiveproxy/src/base/win/security_descriptor.cc index 1febc7c103..aeefb11d44 100644 --- a/naiveproxy/src/base/win/security_descriptor.cc +++ b/naiveproxy/src/base/win/security_descriptor.cc @@ -302,9 +302,8 @@ std::optional SecurityDescriptor::ToSddl( // populating the `SECURITY_DESCRIPTOR` with them. Since we're in a const- // qualified member method, we need to clone ourselves and call `ToAbsolute()` // on the clone. - auto self = Clone(); - SECURITY_DESCRIPTOR sd = {}; - self.ToAbsolute(sd); + SecurityDescriptor self = Clone(); + SECURITY_DESCRIPTOR sd = self.ToAbsolute(); LPWSTR sddl; if (!::ConvertSecurityDescriptorToStringSecurityDescriptor( @@ -315,8 +314,8 @@ std::optional SecurityDescriptor::ToSddl( return sddl_ptr.get(); } -void SecurityDescriptor::ToAbsolute(SECURITY_DESCRIPTOR& sd) { - UNSAFE_TODO(memset(&sd, 0, sizeof(sd))); +SECURITY_DESCRIPTOR SecurityDescriptor::ToAbsolute() { + SECURITY_DESCRIPTOR sd = {}; sd.Revision = SECURITY_DESCRIPTOR_REVISION; sd.Owner = owner_ ? owner_->GetPSID() : nullptr; sd.Group = group_ ? group_->GetPSID() : nullptr; @@ -335,6 +334,7 @@ void SecurityDescriptor::ToAbsolute(SECURITY_DESCRIPTOR& sd) { } } DCHECK(::IsValidSecurityDescriptor(&sd)); + return sd; } std::optional @@ -344,8 +344,7 @@ SecurityDescriptor::ToSelfRelative() const { // qualified member method, we need to clone ourselves and call `ToAbsolute()` // on the clone. auto self = Clone(); - SECURITY_DESCRIPTOR sd = {}; - self.ToAbsolute(sd); + SECURITY_DESCRIPTOR sd = self.ToAbsolute(); DWORD size = sizeof(SECURITY_DESCRIPTOR_MIN_LENGTH); std::vector buffer(SECURITY_DESCRIPTOR_MIN_LENGTH); @@ -421,8 +420,7 @@ std::optional SecurityDescriptor::AccessCheck( std::vector priv_set(priv_set_length); DWORD granted_access = 0; BOOL access_status = FALSE; - SECURITY_DESCRIPTOR sd = {}; - ToAbsolute(sd); + SECURITY_DESCRIPTOR sd = ToAbsolute(); if (!::AccessCheck(&sd, token.get(), desired_access, &local_mapping, reinterpret_cast(priv_set.data()), &priv_set_length, &granted_access, &access_status)) { diff --git a/naiveproxy/src/base/win/security_descriptor.h b/naiveproxy/src/base/win/security_descriptor.h index fa5a852d7b..951d7e186d 100644 --- a/naiveproxy/src/base/win/security_descriptor.h +++ b/naiveproxy/src/base/win/security_descriptor.h @@ -12,6 +12,7 @@ #include #include "base/base_export.h" +#include "base/compiler_specific.h" #include "base/files/file_path.h" #include "base/win/access_control_list.h" #include "base/win/access_token.h" @@ -130,10 +131,9 @@ class BASE_EXPORT SecurityDescriptor { // |security_info| determines what parts are included in the string. std::optional ToSddl(SECURITY_INFORMATION security_info) const; - // Create an reference to the absolute security descriptor of this instance. - // |sd| the SECURITY_DESCRIPTOR structure to populate. This is is only valid - // as long as this object is in scope and not modified. - void ToAbsolute(SECURITY_DESCRIPTOR& sd); + // Create a reference to the absolute security descriptor of this instance. + // This is is only valid as long as this object is in scope and not modified. + SECURITY_DESCRIPTOR ToAbsolute() LIFETIME_BOUND; // Create a self-relative security descriptor in a single buffer. std::optional ToSelfRelative() const; diff --git a/naiveproxy/src/base/win/startup_information.cc b/naiveproxy/src/base/win/startup_information.cc index 9a585983c9..f440e0c700 100644 --- a/naiveproxy/src/base/win/startup_information.cc +++ b/naiveproxy/src/base/win/startup_information.cc @@ -32,9 +32,9 @@ bool StartupInformation::InitializeProcThreadAttributeList( return false; } - auto attribute_list = std::make_unique(size); + auto attribute_list = base::HeapArray::Uninit(size); auto* attribute_list_ptr = - reinterpret_cast(attribute_list.get()); + reinterpret_cast(attribute_list.data()); if (!::InitializeProcThreadAttributeList(attribute_list_ptr, attribute_count, 0, &size)) { return false; diff --git a/naiveproxy/src/base/win/startup_information.h b/naiveproxy/src/base/win/startup_information.h index 32882d327b..9d7722c064 100644 --- a/naiveproxy/src/base/win/startup_information.h +++ b/naiveproxy/src/base/win/startup_information.h @@ -9,9 +9,8 @@ #include -#include - #include "base/base_export.h" +#include "base/containers/heap_array.h" namespace base { namespace win { @@ -44,7 +43,7 @@ class BASE_EXPORT StartupInformation { } private: - std::unique_ptr attribute_list_; + base::HeapArray attribute_list_; STARTUPINFOEXW startup_info_; }; diff --git a/naiveproxy/src/base/win/vector.cc b/naiveproxy/src/base/win/vector.cc index 7a9d76b845..502e08c4d8 100644 --- a/naiveproxy/src/base/win/vector.cc +++ b/naiveproxy/src/base/win/vector.cc @@ -8,6 +8,11 @@ namespace base { namespace win { namespace internal { +VectorChangedEventArgs::VectorChangedEventArgs( + ABI::Windows::Foundation::Collections::CollectionChange change, + unsigned int index) + : change_(change), index_(index) {} + HRESULT VectorChangedEventArgs::get_CollectionChange( ABI::Windows::Foundation::Collections::CollectionChange* value) { *value = change_; diff --git a/naiveproxy/src/base/win/vector.h b/naiveproxy/src/base/win/vector.h index 7ec11dab45..b2b772d0d2 100644 --- a/naiveproxy/src/base/win/vector.h +++ b/naiveproxy/src/base/win/vector.h @@ -122,8 +122,7 @@ class BASE_EXPORT VectorChangedEventArgs public: VectorChangedEventArgs( ABI::Windows::Foundation::Collections::CollectionChange change, - unsigned int index) - : change_(change), index_(index) {} + unsigned int index); ~VectorChangedEventArgs() override = default; diff --git a/naiveproxy/src/base/win/win_util.cc b/naiveproxy/src/base/win/win_util.cc index 158f6090ea..a338d1b7bf 100644 --- a/naiveproxy/src/base/win/win_util.cc +++ b/naiveproxy/src/base/win/win_util.cc @@ -1244,6 +1244,30 @@ std::optional GetSerialNumber() { return std::nullopt; } +std::wstring_view UnicodeStringToView(const UNICODE_STRING& ustr) { + return std::wstring_view(ustr.Buffer, ustr.Length / sizeof(wchar_t)); +} + +bool ViewToUnicodeString(std::wstring_view str, UNICODE_STRING& ustr) { + constexpr size_t kMaxLength = USHORT_MAX / sizeof(WCHAR); + if (std::size(str) > kMaxLength) { + return false; + } + ustr.Buffer = const_cast(str.data()); + ustr.Length = static_cast(std::size(str) * sizeof(WCHAR)); + ustr.MaximumLength = ustr.Length; + return true; +} + +bool EnableStrictHandleCheckingForCurrentProcess() { + PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY policy = {}; + policy.HandleExceptionsPermanentlyEnabled = + policy.RaiseExceptionOnInvalidHandleReference = true; + + return ::SetProcessMitigationPolicy(ProcessStrictHandleCheckPolicy, &policy, + sizeof(policy)); +} + ScopedDomainStateForTesting::ScopedDomainStateForTesting(bool state) : initial_state_(IsEnrolledToDomain()) { *GetDomainEnrollmentStateStorage() = state; diff --git a/naiveproxy/src/base/win/win_util.h b/naiveproxy/src/base/win/win_util.h index 9c579c93e2..89faa23823 100644 --- a/naiveproxy/src/base/win/win_util.h +++ b/naiveproxy/src/base/win/win_util.h @@ -27,6 +27,7 @@ #include #include #include +#include #include #include "base/auto_reset.h" @@ -42,6 +43,7 @@ struct _tagpropertykey; using PROPERTYKEY = _tagpropertykey; struct tagPOINTER_DEVICE_INFO; using POINTER_DEVICE_INFO = tagPOINTER_DEVICE_INFO; +typedef struct _UNICODE_STRING UNICODE_STRING; namespace base { @@ -367,6 +369,23 @@ BASE_EXPORT bool SetProcessTimerThrottleState(HANDLE process, // enabled thread. BASE_EXPORT std::optional GetSerialNumber(); +// Converts a native UNICODE_STRING to a wstring_view. +// Note the UNICODE_STRING must be in scope as long as the wstring_view is +// valid. +BASE_EXPORT std::wstring_view UnicodeStringToView(const UNICODE_STRING& ustr); + +// Converts a wstring_view to a native UNICODE_STRING. +// Returns false if the string can't be stored in the UNICODE_STRING buffer. +// Note the wstring_view must be in scope as long as the UNICODE_STRING is +// valid. +BASE_EXPORT bool ViewToUnicodeString(std::wstring_view str, + UNICODE_STRING& ustr); + +// Enables strict handle checking for the current process. +// See +// https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-process_mitigation_strict_handle_check_policy. +BASE_EXPORT bool EnableStrictHandleCheckingForCurrentProcess(); + // Allows changing the domain enrolled state for the life time of the object. // The original state is restored upon destruction. class BASE_EXPORT ScopedDomainStateForTesting { diff --git a/naiveproxy/src/base/win/windows_version.cc b/naiveproxy/src/base/win/windows_version.cc index 63471af190..bd5b803837 100644 --- a/naiveproxy/src/base/win/windows_version.cc +++ b/naiveproxy/src/base/win/windows_version.cc @@ -170,9 +170,6 @@ OSInfo::OSInfo(const _OSVERSIONINFOEXW& version_info, version_ = MajorMinorBuildToVersion( version_number_.major, version_number_.minor, version_number_.build); InitializeWowStatusValuesForProcess(GetCurrentProcess()); - service_pack_.major = version_info.wServicePackMajor; - service_pack_.minor = version_info.wServicePackMinor; - service_pack_str_ = WideToUTF8(version_info.szCSDVersion); processors_ = static_cast(system_info.dwNumberOfProcessors); allocation_granularity_ = system_info.dwAllocationGranularity; diff --git a/naiveproxy/src/base/win/windows_version.h b/naiveproxy/src/base/win/windows_version.h index ef242e6d18..bf28cd9208 100644 --- a/naiveproxy/src/base/win/windows_version.h +++ b/naiveproxy/src/base/win/windows_version.h @@ -149,12 +149,6 @@ class BASE_EXPORT OSInfo { const VersionType& version_type() const LIFETIME_BOUND { return version_type_; } - const ServicePack& service_pack() const LIFETIME_BOUND { - return service_pack_; - } - const std::string& service_pack_str() const LIFETIME_BOUND { - return service_pack_str_; - } // Returns the number of processors on the system. const int& processors() const { return processors_; } @@ -226,7 +220,6 @@ class BASE_EXPORT OSInfo { Version version_; VersionNumber version_number_; VersionType version_type_; - ServicePack service_pack_; // Represents the version of the OS associated to a release of // Windows 10. Each version may have different releases (such as patch @@ -238,10 +231,6 @@ class BASE_EXPORT OSInfo { // for more information. std::string release_id_; - // A string, such as "Service Pack 3", that indicates the latest Service Pack - // installed on the system. If no Service Pack has been installed, the string - // is empty. - std::string service_pack_str_; int processors_; size_t allocation_granularity_; WowProcessMachine wow_process_machine_; diff --git a/naiveproxy/src/base/win/winrt_foundation_helpers.h b/naiveproxy/src/base/win/winrt_foundation_helpers.h index e5154c0d13..140ef45932 100644 --- a/naiveproxy/src/base/win/winrt_foundation_helpers.h +++ b/naiveproxy/src/base/win/winrt_foundation_helpers.h @@ -15,6 +15,7 @@ #include #include +#include #include #include "base/check.h" diff --git a/naiveproxy/src/build/PRESUBMIT.py b/naiveproxy/src/build/PRESUBMIT.py index a74917b668..61911b18b7 100644 --- a/naiveproxy/src/build/PRESUBMIT.py +++ b/naiveproxy/src/build/PRESUBMIT.py @@ -17,7 +17,7 @@ def CheckNoBadDeps(input_api, output_api): r'build/rust/tests', ] blocklist_pattern = input_api.re.compile(r'^[^#]*"//(?!build).+?/.*"') - allowlist_pattern = input_api.re.compile(r'^[^#]*"//third_party/junit') + allowlist_pattern = input_api.re.compile(r'^[^#]*"//(third_party/junit|out)') warning_message = textwrap.dedent(""" The //build directory is meant to be as hermetic as possible so that diff --git a/naiveproxy/src/build/android/BUILD.gn b/naiveproxy/src/build/android/BUILD.gn index bd675a51de..cfd0b7c920 100644 --- a/naiveproxy/src/build/android/BUILD.gn +++ b/naiveproxy/src/build/android/BUILD.gn @@ -42,6 +42,7 @@ if (enable_java_templates) { # Required to prevent circular dependency from //tools/android/errorprone_plugin. enable_errorprone = false + srcjar_deps = [ ":native_libraries_gen", ":placeholder_build_config_srcjar", @@ -60,6 +61,7 @@ if (enable_java_templates) { "java/src/org/chromium/build/annotations/Initializer.java", "java/src/org/chromium/build/annotations/MockedInTests.java", "java/src/org/chromium/build/annotations/MonotonicNonNull.java", + "java/src/org/chromium/build/annotations/NonNull.java", "java/src/org/chromium/build/annotations/NullMarked.java", "java/src/org/chromium/build/annotations/NullUnmarked.java", "java/src/org/chromium/build/annotations/Nullable.java", diff --git a/naiveproxy/src/build/android/amd64/module.modulemap b/naiveproxy/src/build/android/amd64/module.modulemap deleted file mode 100644 index 3fb3faea02..0000000000 --- a/naiveproxy/src/build/android/amd64/module.modulemap +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2025 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module sysroot_features [system] [extern_c] { - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/limits.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/features.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/cdefs.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/versioning.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/api-level.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/ndk-version.h" -} - -module sysroot [system] [extern_c] { - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/alloca.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/legacy_stdlib_inlines.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/mbstate_t.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/compiler.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/compiler_types.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/errno.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/posix_types.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/sched.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/signal.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/stddef.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/time.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/time_types.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/types.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/wait.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/locale.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/malloc.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/pthread.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sched.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/signal.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/stdio.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/stdlib.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/strings.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/select.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/signal.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/time.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/types.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/ucontext.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/user.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/time.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/wchar.h" - header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/xlocale.h" - - export * -} - -// The following are all textual because they are the subject of include_next from a non-textual module. -// eg. usr/include/errno.h is included by std_errno_h -module sysroot_ctype [system] [extern_c] { - textual header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/ctype.h" -} - -module sysroot_errno [system] [extern_c] { - textual header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/errno.h" -} - -module sysroot_fenv [system] [extern_c] { - textual header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/fenv.h" -} - -module sysroot_limits [system] [extern_c] { - textual header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/limits.h" -} - -module sysroot_math [system] [extern_c] { - textual header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/math.h" -} - -module sysroot_inttypes [system] [extern_c] { - textual header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/inttypes.h" -} - -module sysroot_string [system] [extern_c] { - textual header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/string.h" -} - -module sysroot_stdatomic [system] [extern_c] { - textual header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/stdatomic.h" -} - -module sysroot_stdint [system] [extern_c] { - textual header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/stdint.h" -} - -module sysroot_uchar [system] [extern_c] { - textual header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/uchar.h" -} - -module sysroot_wctype [system] [extern_c] { - textual header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/wctype.h" -} diff --git a/naiveproxy/src/build/android/apk_operations.py b/naiveproxy/src/build/android/apk_operations.py index 5fd98e4d9f..10489f0d0d 100755 --- a/naiveproxy/src/build/android/apk_operations.py +++ b/naiveproxy/src/build/android/apk_operations.py @@ -53,13 +53,19 @@ with devil_env.SysPath( os.path.join(_DIR_SOURCE_ROOT, 'build', 'android', 'gyp')): import bundletool +with devil_env.SysPath(os.path.join(_DIR_SOURCE_ROOT, 'build', 'util')): + import android_chrome_version + BASE_MODULE = 'base' +def _IsTrichrome(): + calling_script_name = os.path.basename(sys.argv[0]) + return 'trichrome' in calling_script_name + + def _Colorize(text, style=''): - return (style - + text - + colorama.Style.RESET_ALL) + return style + text + colorama.Style.RESET_ALL def _InstallApk(devices, apk, install_dict): @@ -190,7 +196,11 @@ def _NormalizeProcessName(debug_process_name, package_name): return debug_process_name -def _ResolveActivity(device, package_name, category, action): +def _ResolveActivity(device, + package_name, + category, + action, + preferred_activity=None): # E.g.: # Activity Resolver Table: # Schemes: @@ -242,7 +252,7 @@ def _ResolveActivity(device, package_name, category, action): raise Exception(f'Did not find {category_text}, {action_text} in\n{data}') if len(matched_entries) > 1: # When there are multiple matches, look for the one marked as default. - # Necessary for Monochrome, which also has MonochromeLauncherActivity. + # Added for Monochrome. default_entries = [ e for e in matched_entries if 'android.intent.category.DEFAULT' in e ] @@ -252,6 +262,22 @@ def _ResolveActivity(device, package_name, category, action): activity_names = {activity_name_from_entry(e) for e in matched_entries} if len(activity_names) > 1: + # If a preferred activity is specified, try to use it + if preferred_activity and preferred_activity in activity_names: + return preferred_activity + + # If no preferred activity is specified, try to find the main activity + main_activity = None + for activity in activity_names: + # Look for the activity that ends with exactly ".Main" + # (not ".Main1", ".Main2", etc.) + if activity.endswith('.Main'): + main_activity = activity + break + + if main_activity: + return main_activity + raise Exception('Found multiple launcher activities:\n * ' + '\n * '.join(sorted(activity_names))) return next(iter(activity_names)) @@ -307,7 +333,8 @@ def _LaunchUrl(devices, url=None, wait_for_java_debugger=False, debug_process_name=None, - nokill=None): + nokill=None, + preferred_activity=None): if argv and command_line_flags_file is None: raise Exception('This apk does not support any flags.') @@ -321,7 +348,8 @@ def _LaunchUrl(devices, action = 'android.intent.action.VIEW' def launch(device): - activity = _ResolveActivity(device, package_name, category, action) + activity = _ResolveActivity(device, package_name, category, action, + preferred_activity) # --persistent is required to have Settings.Global.DEBUG_APP be set, which # we currently use to allow reading of flags. https://crbug.com/784947 if not nokill: @@ -1345,8 +1373,7 @@ class _Command: def _FindSupportedDevices(self, devices): """Returns supported devices and reasons for each not supported one.""" app_abis = self.apk_helper.GetAbis() - calling_script_name = os.path.basename(sys.argv[0]) - is_webview = 'webview' in calling_script_name + is_webview = _IsWebViewProvider(self.apk_helper) requires_32_bit = self.apk_helper.Get32BitAbiOverride() == '0xffffffff' logging.debug('App supports (requires 32bit: %r, is webview: %r): %r', requires_32_bit, is_webview, app_abis) @@ -1538,6 +1565,20 @@ class _PackageInfoCommand(_Command): print('targetSdkVersion: %s' % self.apk_helper.GetTargetSdkVersion()) print('Supported ABIs: %r' % self.apk_helper.GetAbis()) + if len(str(self.apk_helper.GetVersionCode())) == 9: + # android_chrome_version expects Trichrome to be is_webview=False, even if + # this is TrichromeWebView. + is_webview = (_IsWebViewProvider(self.apk_helper) and not _IsTrichrome()) + x = android_chrome_version.TranslateVersionCode( + str(self.apk_helper.GetVersionCode()), is_webview) + print(f'Decoded versionCode: build_number={x.build_number} ' + f'patch_number={x.patch_number} sku={x.package_name} abi={x.abi}') + else: + # This does not follow the chromium versionCode scheme. This might be a + # test APK, a utiltiy APK (like WebView shell browser), or it could just + # be any other non-chromium APK. + print('Decoded versionCode: N/A') + class _InstallCommand(_Command): name = 'install' @@ -1634,6 +1675,9 @@ class _LaunchCommand(_Command): help='Do not set the debug-app, nor set command-line ' 'flags. Useful to load a URL without having the ' 'app restart.') + group.add_argument('--preferred-activity', + help='Preferred activity to launch when multiple ' + 'launcher activities are available.') group.add_argument('url', nargs='?', help='A URL to launch with.') def Run(self): @@ -1646,7 +1690,8 @@ class _LaunchCommand(_Command): url=self.args.url, wait_for_java_debugger=self.args.wait_for_java_debugger, debug_process_name=self.args.debug_process_name, - nokill=self.args.nokill) + nokill=self.args.nokill, + preferred_activity=self.args.preferred_activity) class _StopCommand(_Command): diff --git a/naiveproxy/src/build/android/apk_operations.pydeps b/naiveproxy/src/build/android/apk_operations.pydeps index 5455106a75..78a07f3d3b 100644 --- a/naiveproxy/src/build/android/apk_operations.pydeps +++ b/naiveproxy/src/build/android/apk_operations.pydeps @@ -38,6 +38,7 @@ ../../third_party/catapult/devil/devil/android/sdk/bundletool.py ../../third_party/catapult/devil/devil/android/sdk/intent.py ../../third_party/catapult/devil/devil/android/sdk/keyevent.py +../../third_party/catapult/devil/devil/android/sdk/shared_prefs.py ../../third_party/catapult/devil/devil/android/sdk/split_select.py ../../third_party/catapult/devil/devil/android/sdk/version_codes.py ../../third_party/catapult/devil/devil/android/tools/__init__.py @@ -84,6 +85,7 @@ ../action_helpers.py ../gn_helpers.py ../print_python_deps.py +../util/android_chrome_version.py ../zip_helpers.py adb_command_line.py apk_operations.py diff --git a/naiveproxy/src/build/android/generate_vscode_project.py b/naiveproxy/src/build/android/generate_vscode_project.py index f5e9b6e3e0..401879754e 100755 --- a/naiveproxy/src/build/android/generate_vscode_project.py +++ b/naiveproxy/src/build/android/generate_vscode_project.py @@ -85,7 +85,7 @@ def _ProcessBuildConfigFile(output_dir, build_config_path, source_dirs, libs, libs.add(lib_path) input_srcjars = os.path.join(output_dir, - _WithoutSuffix(build_config_path, '.build_config.json'), + _WithoutSuffix(params_json, '.params.json'), 'generated_java', 'input_srcjars') if os.path.exists(input_srcjars): source_dirs.add(input_srcjars) diff --git a/naiveproxy/src/build/android/gradle/generate_gradle.py b/naiveproxy/src/build/android/gradle/generate_gradle.py index 6fe86bba84..5e1eec5fd8 100755 --- a/naiveproxy/src/build/android/gradle/generate_gradle.py +++ b/naiveproxy/src/build/android/gradle/generate_gradle.py @@ -113,7 +113,7 @@ def _ReadJson(path): def _RunGnGen(output_dir, args=None): - cmd = [os.path.join(_DEPOT_TOOLS_PATH, 'gn'), 'gen', output_dir] + cmd = [os.path.join(_DEPOT_TOOLS_PATH, 'gn.py'), 'gen', output_dir] if args: cmd.extend(args) logging.info('Running: %r', cmd) @@ -809,9 +809,13 @@ def main(): if args.extra_targets: targets_from_args.update(args.extra_targets) + if args.all and args.native_targets: + gn_args = ['--ide=json'] + else: + gn_args = None + _RunGnGen(output_dir, gn_args) + if args.all: - if args.native_targets: - _RunGnGen(output_dir, ['--ide=json']) # Query siso for all __build_config_crbug_908819 targets. targets = _QueryForAllGnTargets(output_dir) else: @@ -820,10 +824,6 @@ def main(): re.sub(r'_test_apk$', _INSTRUMENTATION_TARGET_SUFFIX, t) for t in targets_from_args ] - # Necessary after "gn clean" - if not os.path.exists( - os.path.join(output_dir, gn_helpers.BUILD_VARS_FILENAME)): - _RunGnGen(output_dir) main_entries = [_ProjectEntry.FromGnTarget(t) for t in targets] build_vars = gn_helpers.ReadBuildVars(output_dir) diff --git a/naiveproxy/src/build/android/gtest_apk/BUILD.gn b/naiveproxy/src/build/android/gtest_apk/BUILD.gn index 69b0889c9f..3fd8c43ce8 100644 --- a/naiveproxy/src/build/android/gtest_apk/BUILD.gn +++ b/naiveproxy/src/build/android/gtest_apk/BUILD.gn @@ -9,7 +9,15 @@ android_library("native_test_instrumentation_test_runner_java") { sources = [ "java/src/org/chromium/build/gtest_apk/NativeTestInstrumentationTestRunner.java", "java/src/org/chromium/build/gtest_apk/NativeTestIntent.java", + "java/src/org/chromium/build/gtest_apk/ProcessKeepaliveService.java", "java/src/org/chromium/build/gtest_apk/TestStatusIntent.java", "java/src/org/chromium/build/gtest_apk/TestStatusReceiver.java", ] + srcjar_deps = [ ":aidl" ] +} + +android_aidl("aidl") { + testonly = true + sources = + [ "java/src/org/chromium/build/gtest_apk/IProcessKeepaliveService.aidl" ] } diff --git a/naiveproxy/src/build/android/gyp/apkbuilder.py b/naiveproxy/src/build/android/gyp/apkbuilder.py index 3f20bd1941..6d1860a4f3 100755 --- a/naiveproxy/src/build/android/gyp/apkbuilder.py +++ b/naiveproxy/src/build/android/gyp/apkbuilder.py @@ -10,11 +10,9 @@ import argparse import logging import os import posixpath +import shutil import sys import zipfile -import zlib - -import finalize_apk from util import build_utils from util import diff_utils @@ -91,16 +89,13 @@ def _ParseArgs(args): 'a boolean value.') parser.add_argument( '--apksigner-jar', help='Path to the apksigner executable.') - parser.add_argument('--zipalign-path', - help='Path to the zipalign executable.') parser.add_argument('--key-path', help='Path to keystore for signing.') parser.add_argument('--key-passwd', help='Keystore password') parser.add_argument('--key-name', help='Keystore name') - parser.add_argument( - '--min-sdk-version', required=True, help='Value of APK\'s minSdkVersion') + parser.add_argument('--min-sdk-version', type=int, required=True) parser.add_argument( '--best-compression', action='store_true', @@ -142,6 +137,54 @@ def _ParseArgs(args): return options +def _AlignAndSign(apksigner_path, + android_abi, + apk_path, + key_path, + key_passwd, + key_name, + min_sdk_version, + warnings_as_errors=False): + sign_cmd = build_utils.JavaCmd() + [ + '-jar', + apksigner_path, + 'sign', + '--in', + apk_path, + '--out', + apk_path, + '--ks', + key_path, + '--ks-key-alias', + key_name, + '--ks-pass', + 'pass:' + key_passwd, + ] + # V3 signing adds security niceties, which are irrelevant for local builds. + sign_cmd += ['--v3-signing-enabled', 'false'] + + if min_sdk_version >= 24: + # Disable v1 signatures when v2 signing can be used (it's much faster). + sign_cmd += ['--v1-signing-enabled', 'false'] + # Passing minSdkVersion avoids ApkSigner having to parse it from the APK. + sign_cmd += ['--min-sdk-version', str(min_sdk_version)] + else: + # Force SHA-1 (makes signing faster; insecure is fine for local builds). + # Leave v2 signing enabled since it verifies faster on device when + # supported. + sign_cmd += ['--min-sdk-version', '1'] + + # v4 signatures (.idsig files) require a v2 or v3 signature at the same time. + # These are enabled by default. + + if android_abi and '64' in android_abi: + sign_cmd += ['--lib-page-alignment', str(0x4000)] + + build_utils.CheckOutput(sign_cmd, + print_stdout=True, + fail_on_output=warnings_as_errors) + + def _SplitAssetPath(path): """Returns (src, dest) given an asset path in the form src[:dest].""" path_parts = path.split(':') @@ -176,21 +219,15 @@ def _ExpandPaths(paths): def _GetAssetsToAdd(path_tuples, - fast_align, disable_compression=False, - allow_reads=True, apk_root_dir=''): """Returns the list of file_detail tuples for assets in the apk. Args: path_tuples: List of src_path, dest_path tuples to add. - fast_align: Whether to perform alignment in python zipfile (alternatively - alignment can be done using the zipalign utility out of band). disable_compression: Whether to disable compression. - allow_reads: If false, we do not try to read the files from disk (to find - their size for example). - Returns: A list of (src_path, apk_path, compress, alignment) tuple + Returns: A list of (src_path, apk_path, compress) tuple representing what and how assets are added. """ assets_to_add = [] @@ -203,30 +240,17 @@ def _GetAssetsToAdd(path_tuples, os.path.splitext(src_path)[1] not in _NO_COMPRESS_EXTENSIONS) if target_compress == compress: - # add_to_zip_hermetic() uses this logic to avoid growing small files. - # We need it here in order to set alignment correctly. - if allow_reads and compress and os.path.getsize(src_path) < 16: - compress = False - if dest_path.startswith('../'): # posixpath.join('', 'foo') == 'foo' apk_path = posixpath.join(apk_root_dir, dest_path[3:]) else: apk_path = 'assets/' + dest_path - alignment = 0 if compress and not fast_align else 4 - assets_to_add.append((apk_path, src_path, compress, alignment)) + assets_to_add.append((apk_path, src_path, compress)) return assets_to_add -def _AddFiles(apk, details): - """Adds files to the apk. - - Args: - apk: path to APK to add to. - details: A list of file detail tuples (src_path, apk_path, compress, - alignment) representing what and how files are added to the APK. - """ - for apk_path, src_path, compress, alignment in details: +def _AddFiles(apk, details, compress_level): + for apk_path, src_path, compress in details: # This check is only relevant for assets, but it should not matter if it is # checked for the whole list of files. try: @@ -239,21 +263,14 @@ def _AddFiles(apk, details): apk_path, src_path=src_path, compress=compress, - alignment=alignment) + compress_level=compress_level) -def _GetAbiAlignment(android_abi): - if '64' in android_abi: - return 0x4000 # 16k alignment - return 0x1000 # 4k alignment - - -def _GetNativeLibrariesToAdd(native_libs, android_abi, fast_align, - lib_always_compress): +def _GetNativeLibrariesToAdd(native_libs, android_abi, lib_always_compress): """Returns the list of file_detail tuples for native libraries in the apk. - Returns: A list of (src_path, apk_path, compress, alignment) tuple - representing what and how native libraries are added. + Returns: A list of (src_path, apk_path, compress) tuple representing what and + how native libraries are added. """ libraries_to_add = [] @@ -266,11 +283,7 @@ def _GetNativeLibrariesToAdd(native_libs, android_abi, fast_align, lib_android_abi = 'arm64-v8a-hwasan' apk_path = 'lib/%s/%s' % (lib_android_abi, basename) - if compress and not fast_align: - alignment = 0 - else: - alignment = _GetAbiAlignment(android_abi) - libraries_to_add.append((apk_path, path, compress, alignment)) + libraries_to_add.append((apk_path, path, compress)) return libraries_to_add @@ -281,9 +294,8 @@ def _CreateExpectationsData(native_libs, assets): assets = sorted(assets) ret = [] - for apk_path, _, compress, alignment in native_libs + assets: - ret.append('apk_path=%s, compress=%s, alignment=%s\n' % - (apk_path, compress, alignment)) + for apk_path, _, compress in native_libs + assets: + ret.append(f'apk_path={apk_path}, compress={compress}\n') return ''.join(ret) @@ -291,26 +303,11 @@ def main(args): build_utils.InitLogging('APKBUILDER_DEBUG') args = build_utils.ExpandFileArgs(args) options = _ParseArgs(args) - - # Until Python 3.7, there's no better way to set compression level. - # The default is 6. - if options.best_compression: - # Compresses about twice as slow as the default. - zlib.Z_DEFAULT_COMPRESSION = 9 - else: - # Compresses about twice as fast as the default. - zlib.Z_DEFAULT_COMPRESSION = 1 - - # Python's zip implementation duplicates file comments in the central - # directory, whereas zipalign does not, so use zipalign for official builds. - requires_alignment = options.format == 'apk' - # TODO(crbug.com/40286668): Re-enable zipalign once we are using Android V - # SDK. - run_zipalign = requires_alignment and options.best_compression and False - fast_align = bool(requires_alignment and not run_zipalign) - native_libs = sorted(options.native_libs) + # Optimize either for size or speed. + compress_level = 9 if options.best_compression else 1 + # Include native libs in the depfile_deps since GN doesn't know about the # dependencies when is_component_build=true. depfile_deps = list(native_libs) @@ -358,38 +355,30 @@ def main(args): apk_root_dir = '' apk_dex_dir = '' - def _GetAssetDetails(assets, uncompressed_assets, fast_align, allow_reads): + def _GetAssetDetails(assets, uncompressed_assets): ret = _GetAssetsToAdd(assets, - fast_align, disable_compression=False, - allow_reads=allow_reads, apk_root_dir=apk_root_dir) ret.extend( _GetAssetsToAdd(uncompressed_assets, - fast_align, disable_compression=True, - allow_reads=allow_reads, apk_root_dir=apk_root_dir)) return ret libs_to_add = _GetNativeLibrariesToAdd(native_libs, options.android_abi, - fast_align, options.library_always_compress) if options.secondary_android_abi: libs_to_add.extend( _GetNativeLibrariesToAdd(secondary_native_libs, options.secondary_android_abi, - fast_align, options.library_always_compress)) + options.library_always_compress)) if options.expected_file: # We compute expectations without reading the files. This allows us to check # expectations for different targets by just generating their build_configs # and not have to first generate all the actual files and all their # dependencies (for example by just passing --only-verify-expectations). - asset_details = _GetAssetDetails(assets, - uncompressed_assets, - fast_align, - allow_reads=False) + asset_details = _GetAssetDetails(assets, uncompressed_assets) actual_data = _CreateExpectationsData(libs_to_add, asset_details) diff_utils.CheckExpectations(actual_data, options) @@ -404,8 +393,7 @@ def main(args): # If we are past this point, we are going to actually create the final apk so # we should recompute asset details again but maybe perform some optimizations # based on the size of the files on disk. - assets_to_add = _GetAssetDetails( - assets, uncompressed_assets, fast_align, allow_reads=True) + assets_to_add = _GetAssetDetails(assets, uncompressed_assets) # Targets generally do not depend on apks, so no need for only_if_changed. with action_helpers.atomic_output(options.output_apk, @@ -413,13 +401,12 @@ def main(args): with zipfile.ZipFile(options.resource_apk) as resource_apk, \ zipfile.ZipFile(f, 'w') as out_apk: - def add_to_zip(zip_path, data, compress=True, alignment=4): - zip_helpers.add_to_zip_hermetic( - out_apk, - zip_path, - data=data, - compress=compress, - alignment=0 if compress and not fast_align else alignment) + def add_to_zip(zip_path, data, compress=True): + zip_helpers.add_to_zip_hermetic(out_apk, + zip_path, + data=data, + compress=compress, + compress_level=compress_level) def copy_resource(zipinfo, out_dir=''): add_to_zip( @@ -438,7 +425,7 @@ def main(args): # 2. Assets logging.debug('Adding assets/') - _AddFiles(out_apk, assets_to_add) + _AddFiles(out_apk, assets_to_add, compress_level) # 3. DEX and META-INF/services/ logging.debug('Adding classes.dex') @@ -473,7 +460,7 @@ def main(args): # 4. Native libraries. logging.debug('Adding lib/') - _AddFiles(out_apk, libs_to_add) + _AddFiles(out_apk, libs_to_add, compress_level) # Add a placeholder lib if the APK should be multi ABI but is missing libs # for one of the ABIs. @@ -495,16 +482,14 @@ def main(args): # with stale builds when the only change is adding/removing # placeholders). apk_path = 'lib/%s/%s' % (options.android_abi, name) - alignment = _GetAbiAlignment(options.android_abi) - add_to_zip(apk_path, '', alignment=alignment) + add_to_zip(apk_path, '') for name in sorted(secondary_native_lib_placeholders): # Note: Empty libs files are ignored by md5check (can cause issues # with stale builds when the only change is adding/removing # placeholders). apk_path = 'lib/%s/%s' % (options.secondary_android_abi, name) - alignment = _GetAbiAlignment(options.secondary_android_abi) - add_to_zip(apk_path, '', alignment=alignment) + add_to_zip(apk_path, '') # 5. Resources logging.debug('Adding res/') @@ -532,16 +517,15 @@ def main(args): java_resource_jar.read(apk_path)) if options.format == 'apk' and options.key_path: - zipalign_path = None if fast_align else options.zipalign_path - finalize_apk.FinalizeApk(options.apksigner_jar, - zipalign_path, - f.name, - f.name, - options.key_path, - options.key_passwd, - options.key_name, - int(options.min_sdk_version), - warnings_as_errors=options.warnings_as_errors) + _AlignAndSign(options.apksigner_jar, + options.android_abi, + f.name, + options.key_path, + options.key_passwd, + options.key_name, + options.min_sdk_version, + warnings_as_errors=options.warnings_as_errors) + shutil.move(f'{f.name}.idsig', f'{options.output_apk}.idsig') logging.debug('Moving file into place') if options.depfile: diff --git a/naiveproxy/src/build/android/gyp/apkbuilder.pydeps b/naiveproxy/src/build/android/gyp/apkbuilder.pydeps index 28dfdb0354..5c72d9cf33 100644 --- a/naiveproxy/src/build/android/gyp/apkbuilder.pydeps +++ b/naiveproxy/src/build/android/gyp/apkbuilder.pydeps @@ -4,7 +4,6 @@ ../../gn_helpers.py ../../zip_helpers.py apkbuilder.py -finalize_apk.py util/__init__.py util/build_utils.py util/diff_utils.py diff --git a/naiveproxy/src/build/android/gyp/check_for_missing_direct_deps.py b/naiveproxy/src/build/android/gyp/check_for_missing_direct_deps.py index 3b2c0d6715..c52e0c41ab 100755 --- a/naiveproxy/src/build/android/gyp/check_for_missing_direct_deps.py +++ b/naiveproxy/src/build/android/gyp/check_for_missing_direct_deps.py @@ -18,10 +18,6 @@ from util import jar_utils from util import server_utils import action_helpers # build_utils adds //build to sys.path. -_SRC_PATH = pathlib.Path(build_utils.DIR_SOURCE_ROOT).resolve() -sys.path.insert(1, str(_SRC_PATH / 'build/gn_ast')) -from gn_editor import NO_VALID_GN_STR - def _ShouldIgnoreDep(dep_name: str): if 'gen.base_module.R' in dep_name: @@ -33,6 +29,7 @@ def _ParseDepGraph(jar_path: str): output = jar_utils.run_jdeps(pathlib.Path(jar_path)) assert output is not None, f'Unable to parse jdep for {jar_path}' dep_graph = collections.defaultdict(set) + # pylint: disable=line-too-long # Example output: # java.javac.jar -> java.base # java.javac.jar -> not found @@ -40,6 +37,7 @@ def _ParseDepGraph(jar_path: str): # org.chromium.chrome.browser.tabmodel.TabWindowManagerImpl -> org.chromium.base.ApplicationStatus not found # org.chromium.chrome.browser.tabmodel.TabWindowManagerImpl -> org.chromium.base.ApplicationStatus$ActivityStateListener not found # org.chromium.chrome.browser.tabmodel.TabWindowManagerImpl -> org.chromium.chrome.browser.tab.Tab not found + # pylint: enable=line-too-long for line in output.splitlines(): parsed = line.split() # E.g. java.javac.jar -> java.base @@ -66,7 +64,6 @@ def _EnsureDirectClasspathIsComplete( full_classpath_jars: List[str], full_classpath_gn_targets: List[str], warnings_as_errors: bool, - auto_add_deps: bool, ): logging.info('Parsing %d direct classpath jars', len(sdk_classpath_jars)) sdk_classpath_deps = set() @@ -113,17 +110,13 @@ def _EnsureDirectClasspathIsComplete( if missing_class_to_caller: _ProcessMissingDirectClasspathDeps(missing_class_to_caller, dep_to_target, gn_target, output_dir, - warnings_as_errors, auto_add_deps) + warnings_as_errors) -def _ProcessMissingDirectClasspathDeps( - missing_class_to_caller: Dict[str, str], - dep_to_target: Dict[str, Set[str]], - gn_target: str, - output_dir: str, - warnings_as_errors: bool, - auto_add_deps: bool, -): +def _ProcessMissingDirectClasspathDeps(missing_class_to_caller: Dict[str, str], + dep_to_target: Dict[str, Set[str]], + gn_target: str, output_dir: str, + warnings_as_errors: bool): potential_targets_to_missing_classes: Dict[ Tuple, List[str]] = collections.defaultdict(list) for missing_class in missing_class_to_caller: @@ -137,36 +130,9 @@ def _ProcessMissingDirectClasspathDeps( cmd = dep_utils.CreateAddDepsCommand(gn_target, sorted(deps_to_add_programatically)) - if not auto_add_deps: - _PrintAndMaybeExit(potential_targets_to_missing_classes, - missing_class_to_caller, gn_target, warnings_as_errors, - cmd) - else: - failed = False - try: - stdout = build_utils.CheckOutput(cmd, - cwd=build_utils.DIR_SOURCE_ROOT, - fail_on_output=warnings_as_errors) - if f'Unable to find {gn_target}' in stdout: - # This can happen if a target's deps are stored in a variable instead - # of a list and then simply assigned: `deps = deps_variable`. These - # need to be manually added to the `deps_variable`. - failed = True - except build_utils.CalledProcessError as e: - if NO_VALID_GN_STR in e.output: - failed = True - else: - raise - - build_file_path = dep_utils.GnTargetToBuildFilePath(gn_target) - if failed: - print(f'Unable to auto-add missing dep(s) to {build_file_path}.') - _PrintAndMaybeExit(potential_targets_to_missing_classes, - missing_class_to_caller, gn_target, warnings_as_errors) - else: - gn_target_name = gn_target.split(':', 1)[-1] - print(f'Successfully updated "{gn_target_name}" in {build_file_path} ' - f'with missing direct deps: {deps_to_add_programatically}') + _PrintAndMaybeExit(potential_targets_to_missing_classes, + missing_class_to_caller, gn_target, warnings_as_errors, + cmd) def _DisambiguateMissingDeps( @@ -180,7 +146,7 @@ def _DisambiguateMissingDeps( for (potential_targets, missing_classes) in potential_targets_to_missing_classes.items(): # Dict for ordered dict. - potential_targets = {t: True for t in potential_targets} + potential_targets_dict = {t: True for t in potential_targets} # Rather than just picking any of the potential targets, we want to use # dep_utils.ClassLookupIndex to ensure we respect the preferred dep if any # exists for the missing deps. It is necessary to obtain the preferred dep @@ -196,14 +162,22 @@ def _DisambiguateMissingDeps( target_name_to_class_entry[class_entry.target] = class_entry # Ensure preferred deps are always included in the options. if (class_entry.preferred_dep - and class_entry.target not in potential_targets): - potential_targets[class_entry.target] = True + and class_entry.target not in potential_targets_dict): + potential_targets_dict[class_entry.target] = True potential_class_entries = [ - target_name_to_class_entry[t] for t in potential_targets + target_name_to_class_entry[t] for t in potential_targets_dict + if t in target_name_to_class_entry ] potential_class_entries = dep_utils.DisambiguateDeps( potential_class_entries) - deps_to_add_programatically.add(potential_class_entries[0].target) + if potential_class_entries: + deps_to_add_programatically.add(potential_class_entries[0].target) + else: + # For some missing classes like R.java, the actual file is not in the + # ClassLookupIndex as it's not listed in the target's sources file. In + # these corner cases, we can just go with whatever jdeps found as a + # potential target. See https://crbug.com/437121440 for context. + deps_to_add_programatically.add(potential_targets[0]) return deps_to_add_programatically @@ -253,11 +227,6 @@ def main(argv): parser.add_argument('--warnings-as-errors', action='store_true', help='Treat all warnings as errors.') - parser.add_argument( - '--auto-add-deps', - action='store_true', - help='Attempt to automatically add missing deps to the corresponding ' - 'BUILD.gn file.') args = parser.parse_args(argv) args.sdk_classpath_jars = action_helpers.parse_gn_list( @@ -292,8 +261,7 @@ def main(argv): direct_classpath_jars=args.direct_classpath_jars, full_classpath_jars=args.full_classpath_jars, full_classpath_gn_targets=args.full_classpath_gn_targets, - warnings_as_errors=args.warnings_as_errors, - auto_add_deps=args.auto_add_deps) + warnings_as_errors=args.warnings_as_errors) logging.info('Check completed.') server_utils.MaybeTouch(args.stamp) diff --git a/naiveproxy/src/build/android/gyp/check_for_missing_direct_deps.pydeps b/naiveproxy/src/build/android/gyp/check_for_missing_direct_deps.pydeps index 69af4a84c3..099f2dbf39 100644 --- a/naiveproxy/src/build/android/gyp/check_for_missing_direct_deps.pydeps +++ b/naiveproxy/src/build/android/gyp/check_for_missing_direct_deps.pydeps @@ -10,9 +10,6 @@ ../../../third_party/catapult/devil/devil/constants/__init__.py ../../../third_party/catapult/devil/devil/constants/exit_codes.py ../../action_helpers.py -../../gn_ast/gn_editor.py -../../gn_ast/json_gn_editor.py -../../gn_ast/utils.py ../../gn_helpers.py ../list_java_targets.py ../pylib/__init__.py diff --git a/naiveproxy/src/build/android/gyp/compile_java.py b/naiveproxy/src/build/android/gyp/compile_java.py index cb6286607a..5efca54ecb 100755 --- a/naiveproxy/src/build/android/gyp/compile_java.py +++ b/naiveproxy/src/build/android/gyp/compile_java.py @@ -30,19 +30,16 @@ _JAVAC_EXTRACTOR = os.path.join(build_utils.DIR_SOURCE_ROOT, 'third_party', 'android_prebuilts', 'build_tools', 'common', 'framework', 'javac_extractor.jar') +# These warnings cannot be suppressed even for third party code. Deprecation +# warnings especially do not help since we must support older android version. +_OUTPUT_FILTER_RE = re.compile( + r'^Note: .* uses? or overrides? a deprecated API.*\n|' + r'^Note: .* uses? unchecked or unsafe operations.*\n|' + r'^Note: Recompile with -Xlint:.* for details.*\n', re.MULTILINE) + def ProcessJavacOutput(output, target_name): - # These warnings cannot be suppressed even for third party code. Deprecation - # warnings especially do not help since we must support older android version. - deprecated_re = re.compile(r'Note: .* uses? or overrides? a deprecated API') - unchecked_re = re.compile( - r'(Note: .* uses? unchecked or unsafe operations.)$') - recompile_re = re.compile(r'(Note: Recompile with -Xlint:.* for details.)$') - - def ApplyFilters(line): - return not (deprecated_re.match(line) or unchecked_re.match(line) - or recompile_re.match(line)) - + output = _OUTPUT_FILTER_RE.sub('', output) output = build_utils.FilterReflectiveAccessJavaWarnings(output) # Warning currently cannot be silenced via javac flag. @@ -54,14 +51,9 @@ def ProcessJavacOutput(output, target_name): # ^ output = re.sub(r'.*?Unsafe is internal proprietary API[\s\S]*?\^\n', '', output) - output = re.sub(r'\d+ warnings\n', '', output) + output = re.sub(r'\d+ warnings?\n', '', output) - lines = (l for l in output.split('\n') if ApplyFilters(l)) - - output_processor = javac_output_processor.JavacOutputProcessor(target_name) - lines = output_processor.Process(lines) - - return '\n'.join(lines) + return javac_output_processor.Process(target_name, output) def CreateJarFile(jar_path, diff --git a/naiveproxy/src/build/android/gyp/compile_java.pydeps b/naiveproxy/src/build/android/gyp/compile_java.pydeps index 65cbd13aca..3ca1ada71d 100644 --- a/naiveproxy/src/build/android/gyp/compile_java.pydeps +++ b/naiveproxy/src/build/android/gyp/compile_java.pydeps @@ -9,12 +9,6 @@ ../../../third_party/catapult/devil/devil/android/sdk/version_codes.py ../../../third_party/catapult/devil/devil/constants/__init__.py ../../../third_party/catapult/devil/devil/constants/exit_codes.py -../../../third_party/colorama/src/colorama/__init__.py -../../../third_party/colorama/src/colorama/ansi.py -../../../third_party/colorama/src/colorama/ansitowin32.py -../../../third_party/colorama/src/colorama/initialise.py -../../../third_party/colorama/src/colorama/win32.py -../../../third_party/colorama/src/colorama/winterm.py ../../action_helpers.py ../../gn_helpers.py ../../print_python_deps.py diff --git a/naiveproxy/src/build/android/gyp/compile_kt.pydeps b/naiveproxy/src/build/android/gyp/compile_kt.pydeps index 223647d4e9..a604d8fa0c 100644 --- a/naiveproxy/src/build/android/gyp/compile_kt.pydeps +++ b/naiveproxy/src/build/android/gyp/compile_kt.pydeps @@ -9,12 +9,6 @@ ../../../third_party/catapult/devil/devil/android/sdk/version_codes.py ../../../third_party/catapult/devil/devil/constants/__init__.py ../../../third_party/catapult/devil/devil/constants/exit_codes.py -../../../third_party/colorama/src/colorama/__init__.py -../../../third_party/colorama/src/colorama/ansi.py -../../../third_party/colorama/src/colorama/ansitowin32.py -../../../third_party/colorama/src/colorama/initialise.py -../../../third_party/colorama/src/colorama/win32.py -../../../third_party/colorama/src/colorama/winterm.py ../../action_helpers.py ../../gn_helpers.py ../../print_python_deps.py diff --git a/naiveproxy/src/build/android/gyp/create_bundle_wrapper_script.py b/naiveproxy/src/build/android/gyp/create_bundle_wrapper_script.py index 934300f9f0..9bb152e31a 100755 --- a/naiveproxy/src/build/android/gyp/create_bundle_wrapper_script.py +++ b/naiveproxy/src/build/android/gyp/create_bundle_wrapper_script.py @@ -14,7 +14,7 @@ from util import build_utils import action_helpers # build_utils adds //build to sys.path. SCRIPT_TEMPLATE = string.Template("""\ -#!/usr/bin/env python3 +#!/usr/bin/env vpython3 # # This file was generated by build/android/gyp/create_bundle_wrapper_script.py diff --git a/naiveproxy/src/build/android/gyp/dex.py b/naiveproxy/src/build/android/gyp/dex.py index c622e8318d..39da2082ab 100755 --- a/naiveproxy/src/build/android/gyp/dex.py +++ b/naiveproxy/src/build/android/gyp/dex.py @@ -21,7 +21,7 @@ import action_helpers # build_utils adds //build to sys.path. import zip_helpers -_DEX_XMX = '2G' # Increase this when __final_dex OOMs. +_DEX_XMX = '3G' # Increase this when __final_dex OOMs. DEFAULT_IGNORE_WARNINGS = ( # Warning: Running R8 version main (build engineering), which cannot be diff --git a/naiveproxy/src/build/android/gyp/errorprone.py b/naiveproxy/src/build/android/gyp/errorprone.py index 4ca5baef53..a896343bcb 100755 --- a/naiveproxy/src/build/android/gyp/errorprone.py +++ b/naiveproxy/src/build/android/gyp/errorprone.py @@ -13,8 +13,10 @@ from util import server_utils # Add a check here to cause the suggested fix to be applied while compiling. # Use this when trying to enable more checks. -# BE SURE TO BUILD WITH --offline -ERRORPRONE_CHECKS_TO_APPLY = [] +ERRORPRONE_CHECKS_TO_APPLY = [ + # Be sure to first update "android/errorprone" within + # build/config/siso/android.star to set "remote": False. +] # Checks to disable in tests. TESTONLY_ERRORPRONE_WARNINGS_TO_DISABLE = [ @@ -28,109 +30,165 @@ TESTONLY_ERRORPRONE_WARNINGS_TO_DISABLE = [ # Full list of checks: https://errorprone.info/bugpatterns ERRORPRONE_WARNINGS_TO_DISABLE = [ + # High priority to enable in non-tests: + 'StaticAssignmentInConstructor', + # CheckReturnValue: See note below about enabling via -Xep. + + # Still to look into: + 'AnnotationPosition', + 'AvoidObjectArrays', + 'BanSerializableRead', + 'BooleanParameter', + 'CannotMockMethod', + 'CatchingUnchecked', + 'CheckedExceptionNotThrown', + 'ConstantField', + 'ConstantPatternCompile', + 'DeduplicateConstants', + 'DefaultLocale', + 'DepAnn', + 'DifferentNameButSame', + 'ExpectedExceptionChecker', + 'ForEachIterable', + 'FunctionalInterfaceClash', + 'IdentifierName', + 'ImmutableMemberCollection', + 'InconsistentOverloads', + 'InitializeInline', + 'InterruptedExceptionSwallowed', + 'Interruption', + 'MethodCanBeStatic', + 'MissingDefault', + 'MixedArrayDimensions', + 'MockitoDoSetup', + 'NegativeBoolean', + 'NonCanonicalStaticMemberImport', + 'NonFinalStaticField', + 'PreferJavaTimeOverload', + 'PreferredInterfaceType', + 'PrimitiveArrayPassedToVarargsMethod', + 'PrivateConstructorForUtilityClass', + 'RedundantThrows', + 'ReturnsNullCollection', + 'StringFormatWithLiteral', + 'SuppressWarningsWithoutExplanation', + 'SystemExitOutsideMain', + 'SystemOut', + 'TestExceptionChecker', + 'ThrowSpecificExceptions', + 'ThrowsUncheckedException', + 'TooManyParameters', + 'TryFailRefactoring', + 'TypeParameterNaming', + 'UngroupedOverloads', + 'UnnecessaryAnonymousClass', + 'UnnecessaryBoxedAssignment', + 'UnnecessaryDefaultInEnumSwitch', + 'UnnecessaryFinal', + 'UnsafeLocaleUsage', + 'UnusedException', + 'UseEnumSwitch', + 'UsingJsr305CheckReturnValue', + 'Var', + 'Varifier', + 'YodaCondition', + + # Low priority. + 'CatchAndPrintStackTrace', + 'EqualsHashCode', + 'JavaUtilDate', + 'OverrideThrowableToString', + 'ParameterComment', + 'PatternMatchingInstanceof', + 'StatementSwitchToExpressionSwitch', + 'UndefinedEquals', + 'StaticAssignmentOfThrowable', # Want in non-test + 'StaticMockMember', + 'StringCaseLocaleUsage', + 'StringCharset', + 'ThreadLocalUsage', + 'TypeParameterUnusedInFormals', + 'UnnecessaryBoxedVariable', + 'UnnecessarilyFullyQualified', + 'UnsafeReflectiveConstructionCast', + + # Never Enable: + # + # Chromium uses assert statements. + 'AssertFalse', + # Debatable whether it makes code less readable by forcing larger names for + # "Builder". + 'BadImport', + # Such modifiers in nested classes do not hurt readability IMO. + 'EffectivelyPrivate', + # Android APIs sometimes throw random exceptions that are safe to ignore. + 'EmptyCatch', + # Just use Android Studio refactors to inline things. 'InlineMeInliner', 'InlineMeSuggester', - # High priority to enable: - 'HidingField', - 'AlreadyChecked', - 'DirectInvocationOnMock', - 'MockNotUsedInProduction', - 'PatternMatchingInstanceof', - 'AssignmentExpression', - 'RuleNotRun', - # High priority to enable in non-tests: - 'JdkObsolete', - 'ReturnValueIgnored', - 'StaticAssignmentInConstructor', + # We already have presubmit checks for this. We don't want it to fail + # local compiles. + 'RemoveUnusedImports', + # Several instances of using a string right before the String.format(), + # which seems better than inlining. + 'InlineFormatString', + # Assigning to fields marked as @Mock or @Spy. Suggested fix is to delete + # assignments, which would break tests in many cases. + 'UnnecessaryAssignment', + # Android platform default is always UTF-8. + # https://developer.android.com/reference/java/nio/charset/Charset.html#defaultCharset() + 'DefaultCharset', + # If google-java-format is not going to do this, it's not worth our time. + 'StringConcatToTextBlock', + # We don't use Dagger. + 'RefersToDaggerCodegen', + # Only has false positives (would not want to enable this). + 'UnicodeEscape', + # Does not apply to Android because it assumes no desugaring. + 'UnnecessaryLambda', + # These are best practices that I doubt are worth the churn / overhead. + 'MixedMutabilityReturnType', + 'MutablePublicArray', + 'NonApiType', + # Not that useful. + 'ClassNewInstance', + # Low priority corner cases with String.split. + # Linking Guava and using Splitter was rejected + # in the https://chromium-review.googlesource.com/c/chromium/src/+/871630. + 'StringSplitter', + # There are lots of times when we just want to post a task. + 'FutureReturnValueIgnored', + # Just false positives in our code. + 'ThreadJoinLoop', + # Fine to run the auto-fix from time to time (which replaces assert + # statements with Truth assertions), but because using assert statements is + # normal in non-test code, they also show up in test helpers, which are + # arguably false-positives. + 'UseCorrectAssertInTests', + # NullAway makes these redundant. + 'FieldMissingNullable', + 'ParameterMissingNullable', + 'ReturnMissingNullable', + # Style guide difference between google3 & chromium. + 'MissingBraces', + # Does not seem to take into account R8 backports. Redundant with Android + # Lint anyways. + 'Java8ApiChecker', + # Style guide difference between google3 & chromium. + 'UnnecessaryTestMethodPrefix', + # Too many suggestions where it's not actually necessary. + 'CanIgnoreReturnValueSuggester', + # These are all for Javadoc, which we don't really care about. - # vvv 'InvalidBlockTag', - 'InvalidParam', - 'InvalidLink', 'InvalidInlineTag', + 'InvalidLink', + 'InvalidParam', 'MalformedInlineTag', 'MissingSummary', 'NotJavadoc', 'UnescapedEntity', 'UnrecognisedJavadocTag', - # ^^^ - 'MutablePublicArray', - 'NonCanonicalType', - 'DoNotClaimAnnotations', - 'JavaUtilDate', - 'IdentityHashMapUsage', - 'StaticMockMember', - # Triggers in tests where this is useful to do. - 'StaticAssignmentOfThrowable', - # TODO(crbug.com/41384349): Follow steps in bug. - 'CatchAndPrintStackTrace', - # TODO(crbug.com/41364806): Follow steps in bug. - 'TypeParameterUnusedInFormals', - # Android platform default is always UTF-8. - # https://developer.android.com/reference/java/nio/charset/Charset.html#defaultCharset() - 'DefaultCharset', - # There are lots of times when we just want to post a task. - 'FutureReturnValueIgnored', - # Just false positives in our code. - 'ThreadJoinLoop', - # Low priority corner cases with String.split. - # Linking Guava and using Splitter was rejected - # in the https://chromium-review.googlesource.com/c/chromium/src/+/871630. - 'StringSplitter', - # Preferred to use another method since it propagates exceptions better. - 'ClassNewInstance', - # Results in false positives. - 'ThreadLocalUsage', - # Low priority. - 'EqualsHashCode', - # Not necessary for tests. - 'OverrideThrowableToString', - # Not that useful. - 'UnsafeReflectiveConstructionCast', - # Not that useful. - 'MixedMutabilityReturnType', - # Nice to have. - 'EqualsGetClass', - # A lot of false-positives from CharSequence.equals(). - 'UndefinedEquals', - # Dagger generated code triggers this. - 'SameNameButDifferent', - # Does not apply to Android because it assumes no desugaring. - 'UnnecessaryLambda', - # Nice to have. - 'EmptyCatch', - # Nice to have. - 'BadImport', - # Nice to have. - 'UseCorrectAssertInTests', - # Must be off since we are now passing in annotation processor generated - # code as a source jar (deduplicating work with turbine). - 'RefersToDaggerCodegen', - # We already have presubmit checks for this. We don't want it to fail - # local compiles. - 'RemoveUnusedImports', - # Only has false positives (would not want to enable this). - 'UnicodeEscape', - # A lot of existing violations. e.g. Should return List and not ArrayList - 'NonApiType', - # Nice to have. - 'StringCharset', - # Nice to have. - 'StringConcatToTextBlock', - # Nice to have. - 'StringCaseLocaleUsage', - # Low priority. - 'RedundantControlFlow', - # Low priority. - 'StatementSwitchToExpressionSwitch', - # Assigning to fields marked as @Mock or @Spy. Suggested fix is to delete - # assignments, which would break tests in many cases. - 'UnnecessaryAssignment', - # Serveral instances of using a string right before the String.format(), - # which seems better than inlining. - 'InlineFormatString', - # Low priority. - 'EffectivelyPrivate', ] # Full list of checks: https://errorprone.info/bugpatterns @@ -200,9 +258,11 @@ def main(): # https://github.com/uber/NullAway/issues/1104 # errorprone_flags += ['-XepOpt:NullAway:CheckContracts=true'] + # TODO(agrieve): Re-enable once we sort out nullability of + # ObservableSuppliers. https://crbug.com/430320400 # Make it a warning to use assumeNonNull() with a @NonNull. - errorprone_flags += [('-XepOpt:NullAway:CastToNonNullMethod=' - 'org.chromium.build.NullUtil.assumeNonNull')] + #errorprone_flags += [('-XepOpt:NullAway:CastToNonNullMethod=' + # 'org.chromium.build.NullUtil.assumeNonNull')] # Detect "assert foo != null" as a null check. errorprone_flags += ['-XepOpt:NullAway:AssertsEnabled=true'] # Do not ignore @Nullable & @NonNull in non-@NullMarked classes. @@ -227,6 +287,16 @@ def main(): errorprone_flags += [ '-XepOpt:NullAway:KnownInitializers=' + ','.join(init_methods) ] + # Exclude fields with these annotations from null-checking. + mock_annotations = [ + 'org.mockito.Captor', + 'org.mockito.Mock', + 'org.mockito.Spy', + ] + errorprone_flags += [ + '-XepOpt:NullAway:ExcludedFieldAnnotations=' + + ','.join(mock_annotations) + ] # Make everything a warning so that when treat_warnings_as_errors is false, # they do not fail the build. @@ -240,6 +310,14 @@ def main(): if options.testonly: errorprone_flags.extend('-Xep:{}:OFF'.format(x) for x in TESTONLY_ERRORPRONE_WARNINGS_TO_DISABLE) + errorprone_flags += ['-XepCompilingTestOnlyCode'] + + # To enable CheckReturnValue to be opt-out rather than opt-in: + # packages = 'org.chromium,com.google,java.util.regex' + # errorprone_flags += ['-XepOpt:CheckReturnValue:Packages=' + packages] + # errorprone_flags += ['-XepOpt:CheckReturnValue:CheckAllConstructors=true'] + # Might also need "-XepOpt:CheckReturnValue:ApiExclusionList=" with a + # "cirvlist.txt" that annotates android.* / java.* as @CanIgnoreReturnValue. if ERRORPRONE_CHECKS_TO_APPLY: to_apply = list(ERRORPRONE_CHECKS_TO_APPLY) diff --git a/naiveproxy/src/build/android/gyp/errorprone.pydeps b/naiveproxy/src/build/android/gyp/errorprone.pydeps index 2841d0dd7f..536d2ea3ef 100644 --- a/naiveproxy/src/build/android/gyp/errorprone.pydeps +++ b/naiveproxy/src/build/android/gyp/errorprone.pydeps @@ -9,12 +9,6 @@ ../../../third_party/catapult/devil/devil/android/sdk/version_codes.py ../../../third_party/catapult/devil/devil/constants/__init__.py ../../../third_party/catapult/devil/devil/constants/exit_codes.py -../../../third_party/colorama/src/colorama/__init__.py -../../../third_party/colorama/src/colorama/ansi.py -../../../third_party/colorama/src/colorama/ansitowin32.py -../../../third_party/colorama/src/colorama/initialise.py -../../../third_party/colorama/src/colorama/win32.py -../../../third_party/colorama/src/colorama/winterm.py ../../action_helpers.py ../../gn_helpers.py ../../print_python_deps.py diff --git a/naiveproxy/src/build/android/gyp/finalize_apk.py b/naiveproxy/src/build/android/gyp/finalize_apk.py deleted file mode 100644 index 15267a1f62..0000000000 --- a/naiveproxy/src/build/android/gyp/finalize_apk.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright 2013 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Signs and aligns an APK.""" - -import logging -import shutil -import tempfile - -from util import build_utils - - -def FinalizeApk(apksigner_path, - zipalign_path, - unsigned_apk_path, - final_apk_path, - key_path, - key_passwd, - key_name, - min_sdk_version, - warnings_as_errors=False): - # Use a tempfile so that Ctrl-C does not leave the file with a fresh mtime - # and a corrupted state. - with tempfile.NamedTemporaryFile() as staging_file: - if zipalign_path: - # v2 signing requires that zipalign happen first. - logging.debug('Running zipalign') - zipalign_cmd = [ - zipalign_path, '-p', '-f', '4', unsigned_apk_path, staging_file.name - ] - build_utils.CheckOutput(zipalign_cmd, - print_stdout=True, - fail_on_output=warnings_as_errors) - signer_input_path = staging_file.name - else: - signer_input_path = unsigned_apk_path - - sign_cmd = build_utils.JavaCmd() + [ - '-jar', - apksigner_path, - 'sign', - '--in', - signer_input_path, - '--out', - staging_file.name, - '--ks', - key_path, - '--ks-key-alias', - key_name, - '--ks-pass', - 'pass:' + key_passwd, - ] - # V3 signing adds security niceties, which are irrelevant for local builds. - sign_cmd += ['--v3-signing-enabled', 'false'] - - if min_sdk_version >= 24: - # Disable v1 signatures when v2 signing can be used (it's much faster). - # By default, both v1 and v2 signing happen. - sign_cmd += ['--v1-signing-enabled', 'false'] - else: - # Force SHA-1 (makes signing faster; insecure is fine for local builds). - # Leave v2 signing enabled since it verifies faster on device when - # supported. - sign_cmd += ['--min-sdk-version', '1'] - - logging.debug('Signing apk') - build_utils.CheckOutput(sign_cmd, - print_stdout=True, - fail_on_output=warnings_as_errors) - shutil.move(staging_file.name, final_apk_path) - staging_file._closer.delete = False # pylint: disable=protected-access diff --git a/naiveproxy/src/build/android/gyp/java_cpp_enum.py b/naiveproxy/src/build/android/gyp/java_cpp_enum.py index ffd896d9bc..b2eb263543 100755 --- a/naiveproxy/src/build/android/gyp/java_cpp_enum.py +++ b/naiveproxy/src/build/android/gyp/java_cpp_enum.py @@ -212,12 +212,6 @@ class HeaderParser: multi_line_comment_start_re = re.compile(r'\s*/\*') enum_line_re = re.compile(r'^\s*(\w+)(\s*\=\s*([^,\n]+))?,?') enum_end_re = re.compile(r'^\s*}\s*;\.*$') - # Note: For now we only support a very specific `#if` statement to prevent the - # possibility of miscalculating whether lines should be ignored when building - # for Android. - if_buildflag_re = re.compile( - r'^#if BUILDFLAG\((\w+)\)(?: \|\| BUILDFLAG\((\w+)\))*$') - if_buildflag_end_re = re.compile(r'^#endif.*$') generator_error_re = re.compile(r'^\s*//\s+GENERATED_JAVA_(\w+)\s*:\s*$') generator_directive_re = re.compile( r'^\s*//\s+GENERATED_JAVA_(\w+)\s*:\s*([\.\w]+)$') @@ -237,26 +231,16 @@ class HeaderParser: r'^\s*(?:\[cpp.*\])?\s*enum.*{(?P.*)}.*$') def __init__(self, lines, path=''): - self._lines = lines + self._lines = java_cpp_utils.PreprocessIfBlocks(lines) self._path = path self._enum_definitions = [] self._in_enum = False - # Indicates whether an #if block was encountered on a previous line (until - # an #endif block was seen). When nonzero, `_in_buildflag_android` indicates - # whether the blocks were `#if BUILDFLAG(IS_ANDROID)` or not. - # Note: Currently only statements like `#if BUILDFLAG(IS_)` are - # supported. - self._in_preprocessor_block = 0 - self._in_buildflag_android = [] self._current_definition = None self._current_comments = [] self._generator_directives = DirectiveSet() self._multi_line_generator_directive = None self._current_enum_entry = '' - def _ShouldIgnoreLine(self): - return self._in_preprocessor_block and not all(self._in_buildflag_android) - def _ApplyGeneratorDirectives(self): self._generator_directives.UpdateDefinition(self._current_definition) self._generator_directives = DirectiveSet() @@ -267,19 +251,6 @@ class HeaderParser: return self._enum_definitions def _ParseLine(self, line): - if HeaderParser.if_buildflag_re.match(line): - self._in_preprocessor_block += 1 - self._in_buildflag_android.append('BUILDFLAG(IS_ANDROID)' in line) - return - if self._in_preprocessor_block and HeaderParser.if_buildflag_end_re.match( - line): - self._in_preprocessor_block -= 1 - self._in_buildflag_android.pop() - return - - if self._ShouldIgnoreLine(): - return - if self._multi_line_generator_directive: self._ParseMultiLineDirectiveLine(line) return @@ -336,7 +307,8 @@ class HeaderParser: self._current_enum_entry += ' ' + line.strip() def _FinalizeCurrentEnumDefinition(self): - if self._current_enum_entry: + # It has a space as a prefix so strip is needed. + if self._current_enum_entry.strip(): self._ParseCurrentEnumEntry() self._ApplyGeneratorDirectives() self._current_definition.Finalize() diff --git a/naiveproxy/src/build/android/gyp/java_cpp_enum_tests.py b/naiveproxy/src/build/android/gyp/java_cpp_enum_tests.py index c84d3d0cf7..16412b77a5 100755 --- a/naiveproxy/src/build/android/gyp/java_cpp_enum_tests.py +++ b/naiveproxy/src/build/android/gyp/java_cpp_enum_tests.py @@ -586,6 +586,29 @@ enum TerminationStatus { #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) TERMINATION_STATUS_TWELVE = 12, #endif + + TERMINATION_STATUS_THIRTEEN = 13, + +#if BUILDFLAG(IS_POSIX) + TERMINATION_STATUS_FOURTEEN = 14, +#endif + +#if !BUILDFLAG(IS_WIN) + // This should be included. + TERMINATION_STATUS_FIFTEEN = 15, +#endif +#if !BUILDFLAG(IS_ANDROID) + // This should NOT be included. + TERMINATION_STATUS_SIXTEEN = 16, +#endif +#if !BUILDFLAG(IS_POSIX) + // This should NOT be included. + TERMINATION_STATUS_SEVENTEEN = 17, +#endif + +#if BUILDFLAG(IS_WIN) + TERMINATION_STATUS_LAST = 1000, +#endif }; """.split('\n') definitions = HeaderParser(test_data).ParseDefinitions() @@ -606,6 +629,9 @@ enum TerminationStatus { # INTEGRITY_FAILURE value should not appear here. # TEN and ELEVEN should not appear here. ('TWELVE', '12'), + ('THIRTEEN', '13'), + ('FOURTEEN', '14'), + ('FIFTEEN', '15'), ]), definition.entries) self.assertEqual( @@ -616,6 +642,7 @@ enum TerminationStatus { 'On Android processes are spawned from the system Zygote and we ' + 'do not get the termination status.'), ('OOM', 'Out of memory.'), + ('FIFTEEN', 'This should be included.'), ]), definition.comments) def testParseEnumStruct(self): diff --git a/naiveproxy/src/build/android/gyp/java_cpp_features.py b/naiveproxy/src/build/android/gyp/java_cpp_features.py index 3c1e5857a0..4e4f422cce 100755 --- a/naiveproxy/src/build/android/gyp/java_cpp_features.py +++ b/naiveproxy/src/build/android/gyp/java_cpp_features.py @@ -17,23 +17,67 @@ import zip_helpers class FeatureParserDelegate(java_cpp_utils.CppConstantParser.Delegate): # Ex. 'BASE_FEATURE(kConstantName, "StringNameOfTheFeature", ...);' + # or 'BASE_FEATURE(kConstantName, ...);' # would parse as: # ExtractConstantName() -> 'ConstantName' - # ExtractValue() -> '"StringNameOfTheFeature"' - FEATURE_RE = re.compile(r'BASE_FEATURE\(k([^,]+),') - VALUE_RE = re.compile(r'\s*("(?:\"|[^"])*")\s*,') + # ExtractValue() -> '"StringNameOfTheFeature"' or '"ConstantName"' + _FEATURE_RE = re.compile(r'BASE_FEATURE\(\s*(k\w+),') + _STRING_LITERAL_RE = re.compile(r'"(?:\\"|[^"])*"') + _constant_name = None # The name of the current macro. + _comma_count = 0 # Number of commas seen in the current macro. + _string_literals = [] # All string literals seen in the current macro. def ExtractConstantName(self, line): - match = FeatureParserDelegate.FEATURE_RE.match(line) - return match.group(1) if match else None + # Reset to a clean state when extracting constant name. + self._comma_count = 0 + self._string_literals = [] + self._constant_name = None + + match = self._FEATURE_RE.match(line) + if match: + # The regex ensures that the feature name starts with 'k'. + feature_name = match.group(1) + self._constant_name = feature_name[1:] + return self._constant_name + return None def ExtractValue(self, line): - match = FeatureParserDelegate.VALUE_RE.search(line) - return match.group(1) if match else None + if line.strip().startswith('#') or line.strip().startswith("//"): + # Skip C++ directives and comments within macros + return None + + # Track all string literals. + self._string_literals.extend(self._STRING_LITERAL_RE.findall(line)) + + self._comma_count += line.count(',') + + # The value of a feature is determined once the whole macro has been parsed. + if ')' not in line: + return None + + # If there is exactly one string literal, that is the value. This handles + # the 3-arg form of BASE_FEATURE. + if len(self._string_literals) == 1: + return self._string_literals[0] + + # If there are multiple string literals, we can't be sure which is correct. + if len(self._string_literals) > 1: + return None + + # If there is no string literal, this might be the 2-arg form. The value is + # the constant name, quoted. + if self._comma_count == 1: + return f'"{self._constant_name}"' + + return None def CreateJavaConstant(self, name, value, comments): return java_cpp_utils.JavaString(name, value, comments) + # This delegate requires multiline parsing to determine the feature string. + def RequiresMultilineValueParsing(self): + return True + def _GenerateOutput(template, source_paths, features): description_template = """ diff --git a/naiveproxy/src/build/android/gyp/java_cpp_features_tests.py b/naiveproxy/src/build/android/gyp/java_cpp_features_tests.py index 3053955ec1..49c22dc981 100755 --- a/naiveproxy/src/build/android/gyp/java_cpp_features_tests.py +++ b/naiveproxy/src/build/android/gyp/java_cpp_features_tests.py @@ -16,6 +16,7 @@ from util import java_cpp_utils class _TestFeaturesParser(unittest.TestCase): + def testParseComments(self): test_data = """ /** @@ -120,11 +121,60 @@ BASE_FEATURE(kMaybeEnabled, "MaybeEnabled", self.assertEqual('MAYBE_ENABLED', features[3].name) self.assertEqual('"MaybeEnabled"', features[3].value) - def testNotYetSupported(self): - # Negative test for cases we don't yet support, to ensure we don't misparse - # these until we intentionally add proper support. + + def testTwoArgumentMacro(self): + test_data = """ +// 2-arg BASE_FEATURE macro +BASE_FEATURE(kMyFeature, base::FEATURE_ENABLED_BY_DEFAULT); + +// 2-arg BASE_FEATURE macro over multiple lines +BASE_FEATURE(kAnotherFeature, + base::FEATURE_DISABLED_BY_DEFAULT); + +// Mix of 2-arg and 3-arg. +BASE_FEATURE(kOldStyleFeature, "OldStyleFeature", + base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kNewStyleFeature, base::FEATURE_DISABLED_BY_DEFAULT); + +// Value depends on build config +BASE_FEATURE(kMaybeEnabledFeature, +#if BUILDFLAG(IS_ANDROID) + base::FEATURE_DISABLED_BY_DEFAULT +#else + base::FEATURE_ENABLED_BY_DEFAULT +#endif +); + +// Comments in 2-arg macro definition +BASE_FEATURE(kCommentsInFeatureDefinition, +// Add the following line to confuse the parser. +// TODO(crrev.com/c/12345678): BASE_FEATURE(Foo, ...) +#if BUILDFLAG(IS_CHROMEOS) + base::FEATURE_DISABLED_BY_DEFAULT +#else + base::FEATURE_ENABLED_BY_DEFAULT +#endif +); +""".split('\n') + feature_file_parser = java_cpp_utils.CppConstantParser( + java_cpp_features.FeatureParserDelegate(), test_data) + features = feature_file_parser.Parse() + self.assertEqual(6, len(features)) + self.assertEqual('MY_FEATURE', features[0].name) + self.assertEqual('"MyFeature"', features[0].value) + self.assertEqual('ANOTHER_FEATURE', features[1].name) + self.assertEqual('"AnotherFeature"', features[1].value) + self.assertEqual('OLD_STYLE_FEATURE', features[2].name) + self.assertEqual('"OldStyleFeature"', features[2].value) + self.assertEqual('NEW_STYLE_FEATURE', features[3].name) + self.assertEqual('"NewStyleFeature"', features[3].value) + self.assertEqual('MAYBE_ENABLED_FEATURE', features[4].name) + self.assertEqual('"MaybeEnabledFeature"', features[4].value) + self.assertEqual('COMMENTS_IN_FEATURE_DEFINITION', features[5].name) + self.assertEqual('"CommentsInFeatureDefinition"', features[5].value) + + def testNameDependsOnOs(self): test_data = """ -// Not currently supported: name depends on C++ directive BASE_FEATURE(kNameDependsOnOs, #if BUILDFLAG(IS_ANDROID) "MaybeName1", @@ -132,15 +182,13 @@ BASE_FEATURE(kNameDependsOnOs, "MaybeName2", #endif base::FEATURE_DISABLED_BY_DEFAULT); - -// Not currently supported: feature named with a constant instead of literal -BASE_FEATURE(kNamedAfterConstant, kNamedStringConstant, - base::FEATURE_DISABLED_BY_DEFAULT}; """.split('\n') feature_file_parser = java_cpp_utils.CppConstantParser( java_cpp_features.FeatureParserDelegate(), test_data) features = feature_file_parser.Parse() - self.assertEqual(0, len(features)) + self.assertEqual(1, len(features)) + self.assertEqual('NAME_DEPENDS_ON_OS', features[0].name) + self.assertEqual('"MaybeName1"', features[0].value) def testTreatWebViewLikeOneWord(self): test_data = """ diff --git a/naiveproxy/src/build/android/gyp/java_cpp_strings_tests.py b/naiveproxy/src/build/android/gyp/java_cpp_strings_tests.py index 24e1a0b209..b12dc725f2 100755 --- a/naiveproxy/src/build/android/gyp/java_cpp_strings_tests.py +++ b/naiveproxy/src/build/android/gyp/java_cpp_strings_tests.py @@ -146,6 +146,81 @@ public any sort of class MyClass {{ self.assertEqual('my.java.package', package) self.assertEqual('MyClass', class_name) + def testParseStringsWithConditionallyDefinedValues(self): + test_data = """ +#if BUILDFLAG(IS_CHROMEOS) + const char kMyTestString1[] = "test-string-1"; +#endif +#if BUILDFLAG(IS_ANDROID) + const char kMyTestString1[] = "test-string-1"; +#endif +#if BUILDFLAG(IS_WIN) + const char kMyTestString1[] = "test-string-1"; +#endif +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) + const char kMyTestString2[] = "test-string-2"; +#if BUILDFLAG(IS_POSIX) + const char kMyTestString3[] = "test-string-3"; +#endif +#endif +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + const char kMyTestString4[] = "test-string-4"; +#endif + +#if BUILDFLAG(IS_POSIX) + const char kMyTestString5[] = "test-string-5"; +#endif + +#if !BUILDFLAG(IS_WIN) + const char kMyTestString6[] = "test-string-6"; +#endif +#if !BUILDFLAG(IS_ANDROID) + const char kMyTestString7[] = "test-string-7"; +#else + const char kMyTestString8[] = "test-string-8"; +#endif +#if !BUILDFLAG(IS_POSIX) + const char kMyTestString9[] = "test-string-9"; +#endif + +#if BUILDFLAG(ENABLE_HLS_DEMUXER) + const char kMyTestString10[] = "test-string-10"; +#endif + +#if BUILDFLAG(ENABLE_EXTENSIONS) +#if BUILDFLAG(IS_ANDROID) + const char kMyTestString11[] = "test-string-11"; +#else + const char kMyTestString12[] = "test-string-12"; +#endif +#endif + +#if !BUILDFLAG(IS_WIN) + const char kMyTestString13[] = "test-string-13"; +#else + const char kMyTestString14[] = "test-string-14"; +#endif + +}; + """.split('\n') + string_file_parser = java_cpp_utils.CppConstantParser( + java_cpp_strings.StringParserDelegate(), test_data) + strings = string_file_parser.Parse() + self.assertEqual(8, len(strings)) + self.assertEqual('MY_TEST_STRING1', strings[0].name) + self.assertEqual('"test-string-1"', strings[0].value) + self.assertEqual('MY_TEST_STRING4', strings[1].name) + self.assertEqual('"test-string-4"', strings[1].value) + self.assertEqual('MY_TEST_STRING5', strings[2].name) + self.assertEqual('"test-string-5"', strings[2].value) + self.assertEqual('MY_TEST_STRING6', strings[3].name) + self.assertEqual('"test-string-6"', strings[3].value) + self.assertEqual('MY_TEST_STRING8', strings[4].name) + self.assertEqual('"test-string-8"', strings[4].value) + self.assertEqual('MY_TEST_STRING10', strings[5].name) + self.assertEqual('"test-string-10"', strings[5].value) + self.assertEqual('MY_TEST_STRING11', strings[6].name) + self.assertEqual('"test-string-11"', strings[6].value) if __name__ == '__main__': unittest.main() diff --git a/naiveproxy/src/build/android/gyp/javac_output_processor.py b/naiveproxy/src/build/android/gyp/javac_output_processor.py index 68cf04dab8..26d2f1b477 100755 --- a/naiveproxy/src/build/android/gyp/javac_output_processor.py +++ b/naiveproxy/src/build/android/gyp/javac_output_processor.py @@ -8,96 +8,87 @@ import functools import os import pathlib +import posixpath import re import shlex import sys import traceback -from util import build_utils from util import dep_utils -sys.path.insert( - 0, - os.path.join(build_utils.DIR_SOURCE_ROOT, 'third_party', 'colorama', 'src')) -import colorama + +_PACKAGE_RE = re.compile(r'^package\s+(.*?)(;|\s*$)', flags=re.MULTILINE) -@functools.lru_cache(maxsize=1) +@functools.cache def _running_locally(): return os.path.exists('build.ninja') -def yellow(text): - return colorama.Fore.YELLOW + text + colorama.Fore.RESET +@functools.cache # pylint: disable=method-cache-max-size-none +def _extract_package_name(path): + data = pathlib.Path(path).read_text('utf-8') + if m := _PACKAGE_RE.search(data): + return m.group(1) + return None class JavacOutputProcessor: def __init__(self, target_name): self._target_name = self._RemoveSuffixesIfPresent( ["__compile_java", "__errorprone", "__header"], target_name) - self._missing_classes = set() + self._missing_classes_short = set() + self._missing_classes_full = set() self._suggested_targets = set() self._unresolvable_classes = set() - # Example: ../../ui/android/java/src/org/chromium/ui/base/Clipboard.java:45: - fileline_prefix = ( - r'(?P(?P[-.\w/\\]+.java):(?P[0-9]+):)') - - self._warning_re = re.compile( - fileline_prefix + r'(?P warning: (?P.*))$') - self._error_re = re.compile(fileline_prefix + - r'(?P (?P.*))$') - self._marker_re = re.compile(r'\s*(?P\^)\s*$') - - self._symbol_not_found_re_list = [ - # Example: + # Examples: + # ../../path/to/Foo.java:54: error: cannot find symbol + # ClangProfiler.writeClangProfilingProfile(); + # ^ + # symbol: variable ClangProfiler + # + # ../../path/to/Foo.java:69: error: could not resolve Linker.LibInfo + # static Linker.LibInfo anyLibInfo() { + # ^ + self._resolution_re = re.compile( + # ../../ui/android/java/src/org/chromium/ui/base/Clipboard.java:45: + r'^(?P[-.\w/\\]+.java):(?:[0-9]+):' # error: package org.chromium.components.url_formatter does not exist - re.compile(fileline_prefix + - r'( error: package [\w.]+ does not exist)$'), - # Example: error: cannot find symbol - re.compile(fileline_prefix + r'( error: cannot find symbol)$'), - # Example: error: symbol not found org.chromium.url.GURL - re.compile(fileline_prefix + r'( error: symbol not found [\w.]+)$'), - ] - - # Example: import org.chromium.url.GURL; - self._import_re = re.compile(r'\s*import (?P[\w\.]+);$') - # Example: import static org.chromium.url.GURL.method; - self._import_static_re = re.compile( - r'\s*import static (?P[\w\.]+)\.\s+;$') - - self._warning_color = [ - 'full_message', colorama.Fore.YELLOW + colorama.Style.DIM - ] - self._error_color = [ - 'full_message', colorama.Fore.MAGENTA + colorama.Style.BRIGHT - ] - self._marker_color = ['marker', colorama.Fore.BLUE + colorama.Style.BRIGHT] + r'(?: error: package [\w.]+ does not exist|' + # error: cannot find symbol + r' error: cannot find symbol|' + # error: could not resolve Linker.LibInfo + r' error: could not resolve (?P[A-Z]\w*).*|' + # error: symbol not found org.chromium.url.GURL + r' error: symbol not found [\w.]+)$' + r'\s*(?:' + # import org.chromium.url.GURL; + r'import (?P[\w\.]+);|' + # import static org.chromium.url.GURL.method; + r'import static (?P[\w\.]+)\.\S+;|' + r'.*)$' + r'\s*\^*$' + # symbol: variable ClangProfiler + r'\s*(symbol:\s+variable (?P[A-Z]\w+))?', + re.MULTILINE) self._class_lookup_index = None - colorama.init() + def Process(self, output): + self._LookForUnknownSymbols(output) - def Process(self, lines): - """ Processes javac output. + if not self._missing_classes_full: + return output - - Applies colors to output. - - Suggests GN dep to add for 'unresolved symbol in Java import' errors. - """ - lines = self._ElaborateLinesForUnknownSymbol(iter(lines)) - for line in lines: - yield self._ApplyColors(line) - if not self._missing_classes: - return - - yield yellow('Hint:') + ' One or more errors due to missing GN deps.' + sb = [] + sb.append('💡 One or more errors due to missing GN deps 💡') if self._unresolvable_classes: - yield 'Failed to find targets for the following classes:' + sb.append('Failed to find targets for the following classes:') for class_name in sorted(self._unresolvable_classes): - yield f'* {class_name}' + sb.append(f'* {class_name}') if self._suggested_targets: - yield (yellow('Hint:') + ' Try adding the following to ' + - yellow(self._target_name)) + sb.append('Hint: Try adding the following to ' + self._target_name) for targets in sorted(self._suggested_targets): if len(targets) > 1: @@ -105,77 +96,56 @@ class JavacOutputProcessor: else: suggested_targets_str = targets[0] # Show them in quotes so they can be copy/pasted into BUILD.gn files. - yield ' "{}",'.format(suggested_targets_str) + sb.append(f' "{suggested_targets_str}",') - yield '' - yield yellow('Hint:') + (' Run the following command to add the missing ' - 'deps:') + sb.append('') + sb.append('Hint: Run the following command to add the missing deps:') missing_targets = {targets[0] for targets in self._suggested_targets} cmd = dep_utils.CreateAddDepsCommand(self._target_name, sorted(missing_targets)) - yield f' {shlex.join(cmd)}\n ' # Extra space necessary for new line. + sb.append(f' {shlex.join(cmd)}') + sb.append('') + sb.append('Use tools/android/tools/android/auto_fix_missing_java_deps.py' + ' to auto-apply suggestions.') elif not self._unresolvable_classes: - yield yellow('Hint:') + ' Rebuild with --offline to show missing deps.' + sb.append( + 'Hint: Rebuild with -config no-remote-javac to show missing deps.') - def _ElaborateLinesForUnknownSymbol(self, lines): - """ Elaborates passed-in javac output for unresolved symbols. + sb.append('') + return output + '\n'.join(sb) - Looks for unresolved symbols in imports. - Adds: - - Line with GN target which cannot compile. - - Mention of unresolved class if not present in error message. - - Line with suggestion of GN dep to add. + def _LookForUnknownSymbols(self, output): + for m in self._resolution_re.finditer(output): + full_class_name = m.group('import') or m.group('static_import') + if not full_class_name: + short_class_name = m.group('unresolved') or m.group('variable') + if not short_class_name: + continue + if short_class_name in self._missing_classes_short: + continue + path = m.group('path') + if os.path.exists(path): + package_name = _extract_package_name(path) + if not package_name: + continue + else: + # This can happen for .srcjars in turbine.py (which directly supports + # .srcjar files). + # E.g.: "org/chromium/network/mojom/ParsedHeaders.java" + package_name = posixpath.dirname(path).replace('/', '.') + full_class_name = f'{package_name}.{short_class_name}' - Args: - lines: Generator with javac input. - Returns: - Generator with processed output. - """ - previous_line = next(lines, None) - line = next(lines, None) - while previous_line is not None: - try: - self._LookForUnknownSymbol(previous_line, line) - except Exception: - yield 'Error in _LookForUnknownSymbol ---' - yield from traceback.format_exc().splitlines() - yield '--- end _LookForUnknownSymbol error' - - yield previous_line - previous_line = line - line = next(lines, None) - - def _ApplyColors(self, line): - """Adds colors to passed-in line and returns processed line.""" - if self._warning_re.match(line): - line = self._Colorize(line, self._warning_re, self._warning_color) - elif self._error_re.match(line): - line = self._Colorize(line, self._error_re, self._error_color) - elif self._marker_re.match(line): - line = self._Colorize(line, self._marker_re, self._marker_color) - return line - - def _LookForUnknownSymbol(self, line, next_line): - if not next_line: - return - - import_re_match = self._import_re.match(next_line) - if not import_re_match: - import_re_match = self._import_static_re.match(next_line) - if not import_re_match: - return - - for regex in self._symbol_not_found_re_list: - if regex.match(line): - break - else: - return - - class_name = import_re_match.group('imported_class') - if class_name not in self._missing_classes: - self._missing_classes.add(class_name) - if _running_locally(): - self._AnalyzeMissingClass(class_name) + if full_class_name not in self._missing_classes_full: + short_class_name = full_class_name.split('.')[-1] + self._missing_classes_short.add(short_class_name) + self._missing_classes_full.add(full_class_name) + if _running_locally(): + try: + self._AnalyzeMissingClass(full_class_name) + except Exception: + sys.stderr.write('Error in _AnalyzeMissingClass---\n' + + traceback.format_exc()) + return def _AnalyzeMissingClass(self, class_name): if self._class_lookup_index is None: @@ -200,10 +170,7 @@ class JavacOutputProcessor: return text[:-len(suffix)] return text - @staticmethod - def _Colorize(line, regex, color): - match = regex.match(line) - start = match.start(color[0]) - end = match.end(color[0]) - return (line[:start] + color[1] + line[start:end] + colorama.Fore.RESET + - colorama.Style.RESET_ALL + line[end:]) + +def Process(target_name, output): + processor = JavacOutputProcessor(target_name) + return processor.Process(output) diff --git a/naiveproxy/src/build/android/gyp/lint.py b/naiveproxy/src/build/android/gyp/lint.py index fb030010c2..177981aa62 100755 --- a/naiveproxy/src/build/android/gyp/lint.py +++ b/naiveproxy/src/build/android/gyp/lint.py @@ -192,8 +192,7 @@ def _WriteXmlFile(root, path): root, encoding='utf-8')).toprettyxml(indent=' ')) -def _RunLint(custom_lint_jar_path, - lint_jar_path, +def _RunLint(lint_jar_path, backported_methods_path, config_path, manifest_paths, @@ -224,10 +223,10 @@ def _RunLint(custom_lint_jar_path, # Generating new baselines is only done locally, and requires more memory to # avoid OOMs. creating_baseline = True - lint_xmx = '4G' + lint_xmx = '6G' else: creating_baseline = False - lint_xmx = '3G' + lint_xmx = '4G' # Lint requires this directory to exist and be cleared. # See b/324598620 @@ -245,8 +244,8 @@ def _RunLint(custom_lint_jar_path, cmd = build_utils.JavaCmd(xmx=lint_xmx) + [ '-cp', - '{}:{}'.format(lint_jar_path, custom_lint_jar_path), - 'org.chromium.build.CustomLint', + lint_jar_path, + 'com.android.tools.lint.Main', '--sdk-home', android_sdk_root, '--jdk-home', @@ -344,7 +343,6 @@ def _RunLint(custom_lint_jar_path, return build_utils.FilterLines(output, 'Manifest merger failed') start = time.time() - logging.debug('Lint command %s', ' '.join(cmd)) failed = False if creating_baseline and not warnings_as_errors: @@ -400,9 +398,6 @@ def _ParseArgs(argv): parser.add_argument('--lint-jar-path', required=True, help='Path to the lint jar.') - parser.add_argument('--custom-lint-jar-path', - required=True, - help='Path to our custom lint jar.') parser.add_argument('--backported-methods', help='Path to backported methods file created by R8.') parser.add_argument('--cache-dir', @@ -502,8 +497,7 @@ def main(): use_build_server=args.use_build_server)): return - _RunLint(args.custom_lint_jar_path, - args.lint_jar_path, + _RunLint(args.lint_jar_path, args.backported_methods, args.config_path, args.manifest_paths, diff --git a/naiveproxy/src/build/android/gyp/merge_manifest.py b/naiveproxy/src/build/android/gyp/merge_manifest.py index 55b65a3a33..75abf9771e 100755 --- a/naiveproxy/src/build/android/gyp/merge_manifest.py +++ b/naiveproxy/src/build/android/gyp/merge_manifest.py @@ -21,18 +21,17 @@ _MANIFEST_MERGER_MAIN_CLASS = 'com.android.manifmerger.Merger' @contextlib.contextmanager -def _ProcessMainManifest(manifest_path, min_sdk_version, target_sdk_version, - max_sdk_version, manifest_package): +def _ProcessMainManifest(manifest_path, manifest_package): """Patches the main Android manifest""" doc, manifest, _ = manifest_utils.ParseManifest(manifest_path) - manifest_utils.SetUsesSdk(manifest, target_sdk_version, min_sdk_version, - max_sdk_version) assert manifest_utils.GetPackage(manifest) or manifest_package, \ 'Must set manifest package in GN or in AndroidManifest.xml' if manifest_package: manifest.set('package', manifest_package) tmp_prefix = manifest_path.replace(os.path.sep, '-') with tempfile.NamedTemporaryFile(prefix=tmp_prefix) as patched_manifest: + # Manifest merger requires to not exist in the main manifest. + manifest_utils.RemoveUsesSdk(manifest) manifest_utils.SaveManifest(doc, patched_manifest.name) yield patched_manifest.name, manifest_utils.GetPackage(manifest) @@ -123,9 +122,7 @@ def main(argv): with contextlib.ExitStack() as stack: root_manifest, package = stack.enter_context( - _ProcessMainManifest(args.root_manifest, args.min_sdk_version, - args.target_sdk_version, args.max_sdk_version, - args.manifest_package)) + _ProcessMainManifest(args.root_manifest, args.manifest_package)) if extras: seen_package_names = collections.Counter() extras_processed = [ diff --git a/naiveproxy/src/build/android/gyp/proguard.py b/naiveproxy/src/build/android/gyp/proguard.py index de84397b81..417c0d1246 100755 --- a/naiveproxy/src/build/android/gyp/proguard.py +++ b/naiveproxy/src/build/android/gyp/proguard.py @@ -50,6 +50,8 @@ _IGNORE_WARNINGS = ( r'PaymentRequest[BH]', # This service is defined in Native not Java. r'NativeServiceSandboxedProcessService', + # TODO(450243304): Temporary. + r'DnsNameResolverProvider', ]) + ')', # We enforce that this class is removed via -checkdiscard. r'FastServiceLoader\.class:.*Could not inline ServiceLoader\.load', @@ -61,6 +63,9 @@ _IGNORE_WARNINGS = ( # TODO(b/404818708): androidx.appsearch code is referencing classes in the # Android B sdk thus we must ignore these warnings until after the sdk roll. r'Missing class .* androidx.appsearch.platformstorage.converter.*\$ApiHelperForB', + # This class is only in SDK 36.1. Until we are updated to or past that + # version, R8 will complain of AndroidX's usage of this. + r'Missing class android.graphics.pdf.component.*', # Ignore MethodParameter attribute count isn't matching in espresso. # This is a banner warning and each individual file affected will have # its own warning. @@ -80,6 +85,8 @@ _IGNORE_WARNINGS = ( # so safe to ignore. b/431248021 r'.*AndroidComposeUiTestEnvironment.*', r'.*ComposeUiTest.*', + # We don't use this, so safe to ignore. crbug.com/453685303 + r'.*AndroidComposeTestRule.*', ) _BLOCKLISTED_EXPECTATION_PATHS = [ @@ -393,6 +400,7 @@ def _OptimizeWithR8(options, config_paths, libraries, dynamic_config_data): if options.disable_checks: cmd += ['--map-diagnostics:CheckDiscardDiagnostic', 'error', 'none'] + cmd += ['--map-diagnostics:CheckEnumUnboxedDiagnostic', 'error', 'none'] # Triggered by rules from deps we cannot control. cmd += [('--map-diagnostics:EmptyMemberRulesToDefaultInitRuleConversion' 'Diagnostic'), 'warning', 'none'] diff --git a/naiveproxy/src/build/android/gyp/turbine.py b/naiveproxy/src/build/android/gyp/turbine.py index c446b913a9..b89ba97de1 100755 --- a/naiveproxy/src/build/android/gyp/turbine.py +++ b/naiveproxy/src/build/android/gyp/turbine.py @@ -18,12 +18,6 @@ import action_helpers # build_utils adds //build to sys.path. import zip_helpers -def ProcessJavacOutput(output, target_name): - output_processor = javac_output_processor.JavacOutputProcessor(target_name) - lines = output_processor.Process(output.split('\n')) - return '\n'.join(lines) - - def main(argv): build_utils.InitLogging('TURBINE_DEBUG') argv = build_utils.ExpandFileArgs(argv[1:]) @@ -139,7 +133,7 @@ def main(argv): action_helpers.atomic_output(options.generated_jar_path) as gensrc_jar: cmd += ['--output', output_jar.name, '--gensrc_output', gensrc_jar.name] process_javac_output_partial = functools.partial( - ProcessJavacOutput, target_name=options.target_name) + javac_output_processor.Process, options.target_name) logging.debug('Command: %s', cmd) start = time.time() diff --git a/naiveproxy/src/build/android/gyp/turbine.pydeps b/naiveproxy/src/build/android/gyp/turbine.pydeps index febc5bcabc..b2991ae4a5 100644 --- a/naiveproxy/src/build/android/gyp/turbine.pydeps +++ b/naiveproxy/src/build/android/gyp/turbine.pydeps @@ -9,12 +9,6 @@ ../../../third_party/catapult/devil/devil/android/sdk/version_codes.py ../../../third_party/catapult/devil/devil/constants/__init__.py ../../../third_party/catapult/devil/devil/constants/exit_codes.py -../../../third_party/colorama/src/colorama/__init__.py -../../../third_party/colorama/src/colorama/ansi.py -../../../third_party/colorama/src/colorama/ansitowin32.py -../../../third_party/colorama/src/colorama/initialise.py -../../../third_party/colorama/src/colorama/win32.py -../../../third_party/colorama/src/colorama/winterm.py ../../action_helpers.py ../../gn_helpers.py ../../zip_helpers.py diff --git a/naiveproxy/src/build/android/gyp/util/jar_utils.py b/naiveproxy/src/build/android/gyp/util/jar_utils.py index 1649eab6a4..f563a35677 100644 --- a/naiveproxy/src/build/android/gyp/util/jar_utils.py +++ b/naiveproxy/src/build/android/gyp/util/jar_utils.py @@ -6,6 +6,7 @@ import logging import pathlib import subprocess +import tempfile import zipfile from typing import List, Optional, Union @@ -18,6 +19,7 @@ _IGNORED_JAR_PATHS = [ 'cipd/libs/org_ow2_asm_asm', ] + def _should_ignore(jar_path: pathlib.Path) -> bool: for ignored_jar_path in _IGNORED_JAR_PATHS: if ignored_jar_path in str(jar_path): @@ -25,6 +27,16 @@ def _should_ignore(jar_path: pathlib.Path) -> bool: return False +def _create_filtered_jar_tempfile(jar_path: pathlib): + ret = tempfile.NamedTemporaryFile(suffix='-jdeps.jar') + with zipfile.ZipFile(jar_path) as in_z: + with zipfile.ZipFile(ret, 'w') as out_z: + for info in in_z.infolist(): + if info.filename != 'module-info.class': + out_z.writestr(info, in_z.read(info), zipfile.ZIP_STORED) + return ret + + def run_jdeps(filepath: pathlib.Path, *, jdeps_path: pathlib.Path = _JDEPS_PATH, @@ -46,21 +58,26 @@ def run_jdeps(filepath: pathlib.Path, if verbose: logging.debug('Starting %s', filepath) - try: - return subprocess.run( - cmd, - check=True, - text=True, - capture_output=True, - ).stdout - except subprocess.CalledProcessError as e: - # Pack all the information into the error message since that is the last - # thing visible in the output. - raise RuntimeError(f'\nFilepath:\n{filepath}\ncmd:\n{" ".join(cmd)}\n' - f'stdout:\n{e.stdout}\nstderr:{e.stderr}\n') from e - finally: - if verbose: - logging.debug('Finished %s', filepath) + result = subprocess.run(cmd, text=True, check=False, capture_output=True) + if result.returncode and result.stdout.startswith('Error: Module '): + logging.info('Retrying without modules: %s', filepath) + # E.g.: Error: Module net.bytebuddy not found, required by org.mockito + # See: https://stackoverflow.com/questions/64066952/jdeps-module-not-found-exception-when-listing-dependancies + with _create_filtered_jar_tempfile(filepath) as f: + new_cmd = cmd[:-1] + [f.name] + result = subprocess.run(new_cmd, + text=True, + check=False, + capture_output=True) + if result.returncode: + # Pack all the information into the error message since that is the last + # thing visible in the output. + raise RuntimeError( + f'\nFilepath:\n{filepath}\ncmd:\n{" ".join(cmd)}\n' + f'stdout:\n{result.stdout}\nstderr:{result.stderr}\n') + if verbose: + logging.debug('Finished %s', filepath) + return result.stdout def extract_full_class_names_from_jar( diff --git a/naiveproxy/src/build/android/gyp/util/java_cpp_utils.py b/naiveproxy/src/build/android/gyp/util/java_cpp_utils.py index 3f0334e8f0..89185aa565 100644 --- a/naiveproxy/src/build/android/gyp/util/java_cpp_utils.py +++ b/naiveproxy/src/build/android/gyp/util/java_cpp_utils.py @@ -56,6 +56,58 @@ def KCamelToShouty(s): return s.upper() +def PreprocessIfBlocks(lines): + """Strips C++ preprocessor blocks that are not for Android.""" + if_buildflag_re = re.compile( + r'^#if !?BUILDFLAG\((\w+)\)(?: \|\| !?BUILDFLAG\((\w+)\))*$') + android_os = r'ANDROID|POSIX' + non_android_os = r'AIX|ASMJS|CHROMEOS|FREEBSD|FUCHSIA|IOS|IOS_MACCATALYST|IOS_TVOS|LINUX|MAC|NETBSD|OPENBSD|QNX|SOLARIS|WATCHOS|WIN|APPLE|BSD' + any_os = android_os + r'|' + non_android_os + includes_android_buildflag_re = re.compile( + rf'(? tag from the manifest node.""" + uses_sdk_node = manifest_node.find('./uses-sdk') + if uses_sdk_node is not None: + manifest_node.remove(uses_sdk_node) + + def _SortAndStripElementTree(root): # Sort alphabetically with two exceptions: # 1) Put node last (since it's giant). diff --git a/naiveproxy/src/build/android/gyp/util/params_json_util.py b/naiveproxy/src/build/android/gyp/util/params_json_util.py index 3f0a17d39a..67bbc0c218 100644 --- a/naiveproxy/src/build/android/gyp/util/params_json_util.py +++ b/naiveproxy/src/build/android/gyp/util/params_json_util.py @@ -42,16 +42,20 @@ _COLLECTS_NATIVE_LIBRARIES_TYPES = frozenset([ 'robolectric_binary', ]) -_CLASSPATH_TYPES = frozenset([ +_COMPILE_TYPES = frozenset([ 'android_apk', 'android_app_bundle_module', - 'dist_aar', - 'dist_jar', 'java_annotation_processor', 'java_binary', + 'java_library', 'robolectric_binary', ]) +_CLASSPATH_TYPES = frozenset(list(_COMPILE_TYPES) + [ + 'dist_aar', + 'dist_jar', +]) + # Track inputs for use in depfiles. _input_paths = [] @@ -122,8 +126,12 @@ def _topological_walk(top, deps_func): def _filter_deps(deps, restrict_to_resource_types=False): """Filters dependencies based on their type.""" if restrict_to_resource_types: - # Root types are never is_resource_type(). - keep_func = lambda x: x.is_resource_type() or x.is_group() + # Consider groups that set input_jars_paths() as java targets. This + # prevents such groups from contributing to the classpath when they are + # depended on via resource deps. Admittedly, a bit of a hack... + keep_func = lambda x: x.is_resource_type() or (x.is_group() and not x.get( + 'input_jars_paths')) + else: keep_func = lambda x: not x.is_root_type() @@ -317,14 +325,23 @@ class ParamsJson(dict): def __repr__(self): return f'<{self.path}>' - def build_config_path(self): - """Returns the corresponding .build_config.json path.""" - return self.path.replace('.params.json', '.build_config.json') + def build_config_path(self, suffix='.build_config.json'): + """Returns the .build_config.json path.""" + return self.path.replace('.params.json', suffix) def build_config_json(self): - """Returns the parsed JSON of the corresponding .build_config.json.""" + """Returns the parsed JSON of the .build_config.json.""" return get_build_config(self.build_config_path()) + def javac_build_config_json(self): + """Returns the parsed JSON of the .javac.build_config.json.""" + return get_build_config(self.build_config_path('.javac.build_config.json')) + + def manifest_build_config_json(self): + """Returns the parsed JSON of the .manifest.build_config.json.""" + return get_build_config( + self.build_config_path('.manifest.build_config.json')) + def is_root_type(self): """Returns True if the target type is a "root" type (e.g., an APK).""" return self.type in _ROOT_TYPES @@ -341,6 +358,13 @@ class ParamsJson(dict): """Returns True if the target type runs manifest_merger.py.""" return self.type in _MERGES_MANIFESTS_TYPES + def needs_full_javac_classpath(self): + """Returns True if the target type runs manifest_merger.py.""" + return self.type in ('android_apk', 'android_app_bundle_module') or ( + self.is_library() and self.get('needs_full_javac_classpath', + False)) or (self.type == 'dist_jar' + and self.requires_android()) + def collects_dex_paths(self): """Returns True if the target type collects transitive .dex files.""" if self.type in ('dist_aar', 'dist_jar'): @@ -369,9 +393,22 @@ class ParamsJson(dict): def has_classpath(self): """Returns True if the target type has a classpath.""" if self.is_library(): - return self.get('dex_needs_classpath') or not self.get('is_prebuilt') + return bool(self.get('dex_needs_classpath') or not self.is_prebuilt()) return self.type in _CLASSPATH_TYPES + def is_compile_type(self): + """Returns True if the target has a compile step.""" + return not self.is_prebuilt() and self.type in _COMPILE_TYPES + + def needs_transitive_rtxt(self): + """Returns True if the target populates "dependency_rtxt_files".""" + return self.type == 'dist_aar' or (self.is_library() + and not self.is_prebuilt()) + + def is_prebuilt(self): + """If it's a java_library prebuilt.""" + return self.is_library() and self.get('is_prebuilt', False) + def is_resource_type(self): """Returns True if the target is an Android resource type.""" return self.type in _RESOURCE_TYPES @@ -385,8 +422,8 @@ class ParamsJson(dict): def is_bundle_module(self): return self.type == 'android_app_bundle_module' - def is_dist_jar(self): - return self.type == 'dist_jar' + def is_dist_xar(self): + return self.type in ('dist_aar', 'dist_jar') def is_group(self): return self.type == 'group' @@ -401,7 +438,7 @@ class ParamsJson(dict): """Returns True if the target requires the Android platform.""" if self.type.startswith('android') or self.type == 'dist_aar': return True - return self.is_resource_type or self.get('requires_android', False) + return self.is_resource_type() or self.get('requires_android', False) def supports_android(self): """Returns True if the target supports the Android platform.""" @@ -422,7 +459,7 @@ class ParamsJson(dict): @functools.cache # pylint: disable=method-cache-max-size-none def deps(self): - """Returns all dependencies, from both deps and public_deps.""" + """Returns deps + resolved public_deps.""" deps = DepsList(self._direct_deps()) deps += self._cached_direct_public_deps() deps += _filter_deps(_collect_public_deps(deps), diff --git a/naiveproxy/src/build/android/gyp/write_build_config.py b/naiveproxy/src/build/android/gyp/write_build_config.py index 03358f386e..5c2f819602 100755 --- a/naiveproxy/src/build/android/gyp/write_build_config.py +++ b/naiveproxy/src/build/android/gyp/write_build_config.py @@ -230,13 +230,13 @@ class _TransitiveValuesBuilder: # Add the target's .jar (except for dist_jar, where it's the output .jar). if params.collects_processed_classpath(): - if not params.is_dist_jar(): + if not params.is_dist_xar(): if path := params.get('processed_jar_path'): ret.all_processed_jars.add(path) ret.all_processed_jars.update(all_deps.collect('processed_jar_path')) if params.collects_dex_paths(): - if not params.is_dist_jar(): + if not params.is_dist_xar(): if path := params.get('dex_path'): ret.all_dex_files.add(path) ret.all_dex_files.update(all_deps.collect('dex_path')) @@ -532,7 +532,7 @@ def _ToTraceEventRewrittenPath(jar_dir, path): return os.path.join(jar_dir, path) -def _WriteLintJson(params, lint_json, main_config): +def _CreateLintConfig(params, javac_config, manifest_config): # Collect all sources and resources at the apk/bundle_module level. aars = set() srcjars = set() @@ -567,15 +567,16 @@ def _WriteLintJson(params, lint_json, main_config): classpath = OrderedSet() manifests = OrderedSet(p['android_manifest'] for p in params.module_deps()) for m in params.module_deps(): - module_config = m.build_config_json() - classpath.update(module_config['javac_full_interface_classpath']) - manifests.update(module_config['extra_android_manifests']) + classpath.update( + m.javac_build_config_json()['javac_full_interface_classpath']) + manifests.update( + m.manifest_build_config_json()['extra_android_manifests']) classpath = list(classpath) manifests = list(manifests) else: - classpath = main_config['javac_full_interface_classpath'] + classpath = javac_config['javac_full_interface_classpath'] manifests = [params['android_manifest']] - manifests += main_config['extra_android_manifests'] + manifests += manifest_config['extra_android_manifests'] config = {} config['aars'] = sorted(aars) @@ -585,8 +586,7 @@ def _WriteLintJson(params, lint_json, main_config): config['srcjars'] = sorted(srcjars) config['resource_sources'] = sorted(resource_sources) config['resource_zips'] = sorted(resource_zips) - - build_utils.WriteJson(config, lint_json, only_if_changed=True) + return config def main(): @@ -650,72 +650,94 @@ def main(): # This must then have instrumentation only for itself. manifest.CheckInstrumentationElements(manifest.GetPackageName()) - config = {} + main_config = {} + # Separate to prevent APK / bundle-related values from invalidating + # compile_java.py, and to minimize the .json that compile_java.py needs to + # parse. + javac_config = {} + # Separate to prevent transitive classpath changes invalidating turbine.py. + turbine_config = {} + # Separate because so few targets enable lint. + lint_config = {} + # Separate to prevent keys other than extra_android_manifests from + # invalidating merge_manifest.py. + manifest_config = {} + # Separate to prevent .java changes invalidating compile_resources.py, and + # new resource targets from invalidating java compiles. + res_config = {} + # Separate to prevent .java changes invalidating create_r_java.py, and new + # resource targets from invalidating java compiles. + rtxt_config = {} + # Separate to save targets that don't need it from having to parse it. + targets_config = {} if is_apk: - config['apk_path'] = params['apk_path'] + main_config['apk_path'] = params['apk_path'] if path := params.get('incremental_install_json_path'): - config['incremental_install_json_path'] = path - config['incremental_apk_path'] = params['incremental_apk_path'] + main_config['incremental_install_json_path'] = path + main_config['incremental_apk_path'] = params['incremental_apk_path'] if is_bundle_module: - config['unprocessed_jar_path'] = params['unprocessed_jar_path'] - config['res_size_info_path'] = params['res_size_info_path'] + main_config['unprocessed_jar_path'] = params['unprocessed_jar_path'] + main_config['res_size_info_path'] = params['res_size_info_path'] if has_classpath: tv = _TransitiveValuesBuilder(params).Build() + sdk_deps = params.deps().of_type('system_java_library') - if apk_under_test_params: - assert is_apk - config['arsc_package_name'] = ( - apk_under_test_params.build_config_json()['package_name']) + javac_full_classpath = (list(tv.all_unprocessed_jars) + + list(tv.all_input_jars_paths)) - config['classpath'] = list(tv.direct_unprocessed_jars) + list( - tv.direct_input_jars_paths) - config['interface_classpath'] = list(tv.direct_interface_jars) + list( - tv.direct_input_jars_paths) - # processor_configs will be of type 'java_annotation_processor', and so not - # included in deps().recursive().of_type('java_library'). Annotation - # processors run as part of the build, so need processed_jar_path. - processor_deps = params.processor_deps() - config['processor_classpath'] = _SortClasspath( - processor_deps.recursive()).collect('processed_jar_path') - config['processor_classes'] = sorted(processor_deps.collect('main_class')) - - config['javac_full_classpath'] = (list(tv.all_unprocessed_jars) + - list(tv.all_input_jars_paths)) - config['javac_full_interface_classpath'] = (list(tv.all_interface_jars) + - list(tv.all_input_jars_paths)) + if params.needs_full_javac_classpath(): + main_config['javac_full_classpath'] = javac_full_classpath + main_config['sdk_jars'] = sdk_deps.collect('unprocessed_jar_path') if params.collects_processed_classpath(): - config['processed_classpath'] = list(tv.all_processed_jars) + main_config['processed_classpath'] = list(tv.all_processed_jars) if trace_events_jar_dir := params.get('trace_events_jar_dir'): - config['trace_event_rewritten_classpath'] = [ + main_config['trace_event_rewritten_classpath'] = [ _ToTraceEventRewrittenPath(trace_events_jar_dir, p) for p in tv.all_processed_jars ] if params.collects_dex_paths(): - config['all_dex_files'] = list(tv.all_dex_files) + main_config['all_dex_files'] = list(tv.all_dex_files) - if target_type in ('dist_aar', 'java_library'): - config['dependency_rtxt_files'] = ( + if params.needs_transitive_rtxt(): + rtxt_config['dependency_rtxt_files'] = ( params.resource_deps().collect('rtxt_path')) - sdk_deps = params.deps().of_type('system_java_library') - config['sdk_jars'] = sdk_deps.collect('unprocessed_jar_path') - config['sdk_interface_jars'] = sdk_deps.collect('interface_jar_path') - if proguard_enabled or target_type == 'dist_aar': - config['proguard_all_configs'] = sorted(tv.proguard_configs) + main_config['proguard_all_configs'] = sorted(tv.proguard_configs) if proguard_enabled: - config['proguard_classpath_jars'] = sorted(tv.all_input_jars_paths) + main_config['proguard_classpath_jars'] = sorted(tv.all_input_jars_paths) if is_apk_or_module: - config['java_resources_jars'] = sorted(tv.java_resources_jars) + main_config['java_resources_jars'] = sorted(tv.java_resources_jars) - if params.is_dist_jar(): + if params.is_compile_type(): + # Needed by turbine.py and check_for_missing_direct_deps.py: + turbine_config['interface_classpath'] = list( + tv.direct_interface_jars) + list(tv.direct_input_jars_paths) + # processor_configs will be of type 'java_annotation_processor', and so not + # included in deps().recursive().of_type('java_library'). Annotation + # processors run as part of the build, so need processed_jar_path. + processor_deps = params.processor_deps() + turbine_config['processor_classpath'] = _SortClasspath( + processor_deps.recursive()).collect('processed_jar_path') + turbine_config['processor_classes'] = sorted( + processor_deps.collect('main_class')) + + sdk_interface_jars = sdk_deps.collect('interface_jar_path') + turbine_config['sdk_interface_jars'] = sdk_interface_jars + + javac_config['javac_full_interface_classpath'] = ( + list(tv.all_interface_jars) + list(tv.all_input_jars_paths)) + # Duplicate so that compile_java.py does not need to read another .json. + javac_config['sdk_interface_jars'] = sdk_interface_jars + + if params.is_dist_xar(): if params.get('direct_deps_only'): if params.get('use_interface_jars'): dist_jars = tv.direct_interface_jars @@ -726,25 +748,35 @@ def main(): else: dist_jars = tv.all_processed_jars - config['dist_jar'] = {} - config['dist_jar']['jars'] = list(dist_jars) + main_config['dist_classpath'] = list(dist_jars) + + if params.collects_resources(): + main_config['assets'] = sorted(tv.assets) + main_config['uncompressed_assets'] = sorted(tv.uncompressed_assets) + + if params.get('create_locales_java_list'): + main_config['locales_java_list'] = _CreateJavaLocaleListFromAssets( + tv.uncompressed_assets, tv.locale_paks) if params.collects_resources(): # Safe to sort: Build checks that non-overlay resource have no overlap. - config['dependency_zips'] = sorted(tv.dependency_zips) - config['dependency_zip_overlays'] = list(tv.dependency_zip_overlays) - config['assets'] = sorted(tv.assets) - config['uncompressed_assets'] = sorted(tv.uncompressed_assets) + res_config['dependency_zips'] = sorted(tv.dependency_zips) - if params.get('create_locales_java_list'): - config['locales_java_list'] = _CreateJavaLocaleListFromAssets( - tv.uncompressed_assets, tv.locale_paks) + # Reverse overlay list so that dependents override dependencies + # The topological walk puts dependencies before dependents, but for resource + # overlays we need dependents to come after dependencies in AAPT2's -R list + overlay_list = list(reversed(tv.dependency_zip_overlays)) + res_config['dependency_zip_overlays'] = overlay_list - if params.compiles_resources(): - config['extra_package_names'] = sorted(tv.extra_package_names) + if params.compiles_resources(): + res_config['extra_package_names'] = sorted(tv.extra_package_names) + if apk_under_test_params: + assert is_apk + res_config['arsc_package_name'] = ( + apk_under_test_params.build_config_json()['package_name']) if params.merges_manifests(): - config['extra_android_manifests'] = list(tv.android_manifests) + manifest_config['extra_android_manifests'] = list(tv.android_manifests) if is_bundle: module_deps = params.module_deps() @@ -781,13 +813,13 @@ def main(): for n, c in module_configs_by_name.items(): module_params = module_params_by_name[n] if n == 'base': - assert 'base_module_config' not in config, ( + assert 'base_module_config' not in main_config, ( 'Must have exactly 1 base module!') - config['package_name'] = c['package_name'] - config['version_code'] = module_params['version_code'] - config['version_name'] = module_params['version_name'] - config['base_module_config'] = module_params.path - config['android_manifest'] = module_params['android_manifest'] + main_config['package_name'] = c['package_name'] + main_config['version_code'] = module_params['version_code'] + main_config['version_name'] = module_params['version_name'] + main_config['base_module_config'] = module_params.path + main_config['android_manifest'] = module_params['android_manifest'] for dst_key, src_key in union_fields.items(): unioned_values[dst_key].update(c[src_key]) @@ -799,25 +831,25 @@ def main(): module[f] = c[f] for dst_key in union_fields: - config[dst_key] = list(unioned_values[dst_key]) + main_config[dst_key] = list(unioned_values[dst_key]) # Promote duplicates from siblings/cousins. for f in per_module_fields: _PromoteToCommonAncestor(modules, child_to_ancestors, f) - config['modules'] = modules + main_config['modules'] = modules if is_apk_or_module: - config['package_name'] = manifest.GetPackageName() - config['android_manifest'] = params['android_manifest'] - config['merged_android_manifest'] = params['merged_android_manifest'] + main_config['package_name'] = manifest.GetPackageName() + main_config['android_manifest'] = params['android_manifest'] + main_config['merged_android_manifest'] = params['merged_android_manifest'] if is_apk: - config['version_code'] = params['version_code'] - config['version_name'] = params['version_name'] + main_config['version_code'] = params['version_code'] + main_config['version_name'] = params['version_name'] # TrichromeLibrary has no dex. if final_dex_path := params.get('final_dex_path'): - config['final_dex_path'] = final_dex_path + main_config['final_dex_path'] = final_dex_path library_paths = params.native_libraries() secondary_abi_libraries = params.secondary_abi_native_libraries() @@ -833,9 +865,9 @@ def main(): 'monochrome_secondary_abi_lib //base:base\n') sys.exit(1) - config['native'] = {} - config['native']['libraries'] = library_paths - config['native']['secondary_abi_libraries'] = secondary_abi_libraries + main_config['native'] = {} + main_config['native']['libraries'] = library_paths + main_config['native']['secondary_abi_libraries'] = secondary_abi_libraries if is_bundle_module: loadable_modules = params.get('loadable_modules', []) @@ -849,28 +881,29 @@ def main(): 'secondary_native_lib_placeholders', []) secondary_abi_placeholder_paths.sort() - config['native']['loadable_modules'] = loadable_modules - config['native']['placeholders'] = placeholder_paths - config['native'][ + main_config['native']['loadable_modules'] = loadable_modules + main_config['native']['placeholders'] = placeholder_paths + main_config['native'][ 'secondary_abi_loadable_modules'] = secondary_abi_loadable_modules - config['native'][ + main_config['native'][ 'secondary_abi_placeholders'] = secondary_abi_placeholder_paths - config['native']['library_always_compress'] = params.get( + main_config['native']['library_always_compress'] = params.get( 'library_always_compress') - config['proto_resources_path'] = params['proto_resources_path'] - config['base_allowlist_rtxt_path'] = params['base_allowlist_rtxt_path'] - config['rtxt_path'] = params['rtxt_path'] - config['module_pathmap_path'] = params['module_pathmap_path'] + main_config['proto_resources_path'] = params['proto_resources_path'] + main_config['base_allowlist_rtxt_path'] = params[ + 'base_allowlist_rtxt_path'] + main_config['rtxt_path'] = params['rtxt_path'] + main_config['module_pathmap_path'] = params['module_pathmap_path'] if is_apk_or_module or target_type == 'robolectric_binary': if path := params.get('suffix_apk_assets_used_by_config'): if path == build_config_path: - target_config = config + target_config = main_config else: target_config = params_json_util.get_build_config(path) - _SuffixAssets(config, target_config) + _SuffixAssets(main_config, target_config) - if has_classpath: + if params.get('enable_bytecode_checks'): jar_to_target = {} all_params = params.deps() + [params] if apk_under_test_params: @@ -880,16 +913,33 @@ def main(): # Used by check_for_missing_direct_deps.py to give better error message # when missing deps are found. Both javac_full_classpath_targets and - # javac_full_classpath must be in identical orders, as they get passed as - # separate arrays and then paired up based on index. - config['javac_full_classpath_targets'] = [ - jar_to_target[x] for x in config['javac_full_classpath'] + # javac_full_interface_classpath must be in identical orders, as they get + # passed as separate arrays and then paired up based on index. + targets_config['javac_full_classpath_targets'] = [ + jar_to_target[x] for x in javac_full_classpath ] - if path := params.get('lint_json'): - _WriteLintJson(params, path, config) + if params.get('enable_lint'): + lint_config = _CreateLintConfig(params, javac_config, manifest_config) - build_utils.WriteJson(config, build_config_path, only_if_changed=True) + # Depfiles expect output order to match the order in GN. + outputs = [ + (main_config, '.build_config.json'), + (javac_config, '.javac.build_config.json'), + (turbine_config, '.turbine.build_config.json'), + (lint_config, '.lint.build_config.json'), + (manifest_config, '.manifest.build_config.json'), + (res_config, '.res.build_config.json'), + (rtxt_config, '.rtxt.build_config.json'), + (targets_config, '.targets.build_config.json'), + ] + + first_output = None + for config, extension in outputs: + if config: + path = build_config_path.replace('.build_config.json', extension) + first_output = first_output or path + build_utils.WriteJson(config, path, only_if_changed=True) if options.depfile: all_inputs = params_json_util.all_read_file_paths() @@ -899,7 +949,7 @@ def main(): all_inputs.append(path) if path := params.get('secondary_abi_shared_libraries_runtime_deps_file'): all_inputs.append(path) - action_helpers.write_depfile(options.depfile, build_config_path, all_inputs) + action_helpers.write_depfile(options.depfile, first_output, all_inputs) if __name__ == '__main__': diff --git a/naiveproxy/src/build/android/java/templates/BuildConfig.template b/naiveproxy/src/build/android/java/templates/BuildConfig.template index 09bfe4779c..21b22ca8cf 100644 --- a/naiveproxy/src/build/android/java/templates/BuildConfig.template +++ b/naiveproxy/src/build/android/java/templates/BuildConfig.template @@ -114,6 +114,13 @@ public class BuildConfig { public static boolean IS_DESKTOP_ANDROID; #endif + // Use to check if proguard is enabled for the current build. +#if defined(_IS_PROGUARD_ENABLED) + public static boolean IS_PROGUARD_ENABLED = true; +#else + public static boolean IS_PROGUARD_ENABLED = false; +#endif + // Controls whether or not native-only renderers are available. Note that this check isn't // sufficient to determine whether they are enabled, but just whether they have been included // in the build. diff --git a/naiveproxy/src/build/android/list_java_targets.py b/naiveproxy/src/build/android/list_java_targets.py index d83718d4f7..e66fd3697e 100755 --- a/naiveproxy/src/build/android/list_java_targets.py +++ b/naiveproxy/src/build/android/list_java_targets.py @@ -25,6 +25,7 @@ build/android/list_java_targets.py -C out/Default --stats import argparse import collections +import glob import json import logging import os @@ -66,7 +67,7 @@ def _compile(output_dir, args, quiet=False): subprocess.run(cmd, check=True, stdout=sys.stderr) -def _query_for_build_config_targets(output_dir): +def _query_for_targets(output_dir): # Query ninja rather than GN since it's faster. cmd = [ os.path.join(_SRC_ROOT, 'third_party', 'siso', 'cipd', 'siso'), 'query', @@ -82,18 +83,27 @@ def _query_for_build_config_targets(output_dir): sys.stderr.write('Command output:\n' + e.stdout + e.stderr) raise - ret = [] - SUFFIX = '__build_config_crbug_908819' - SUFFIX_LEN = len(SUFFIX) + # Dict of target name -> has_build_config + ret = {} + # java_prebuilt() targets do not write build_config files, so look for + # __assetres as well. Targets like android_assets() will not appear at all + # (oh well). + SUFFIX1 = '__build_config_crbug_908819' + SUFFIX_LEN1 = len(SUFFIX1) + SUFFIX2 = '__assetres' + SUFFIX_LEN2 = len(SUFFIX2) for line in query_output.splitlines(): ninja_target = line.rsplit(':', 1)[0] # Ignore root aliases by ensuring a : exists. - if ':' in ninja_target and ninja_target.endswith(SUFFIX): - ret.append(f'//{ninja_target[:-SUFFIX_LEN]}') + if ':' in ninja_target: + if ninja_target.endswith(SUFFIX1): + ret[f'//{ninja_target[:-SUFFIX_LEN1]}'] = True + elif ninja_target.endswith(SUFFIX2): + ret.setdefault(f'//{ninja_target[:-SUFFIX_LEN2]}', False) return ret -def _query_json(*, json_dict: dict, query: str, path: str): +def _query_json(*, json_dict: dict, query: str, target: str): """Traverses through the json dictionary according to the query. If at any point a key does not exist, return the empty string, but raise an @@ -126,17 +136,19 @@ def _query_json(*, json_dict: dict, query: str, path: str): return '' except AttributeError as e: raise Exception( - f'Failed when attempting to get {queries} from {path}') from e + f'Failed when attempting to get {queries} from {target}') from e return value class _TargetEntry: - def __init__(self, gn_target): + def __init__(self, gn_target, has_build_config): assert gn_target.startswith('//'), f'{gn_target} does not start with //' assert ':' in gn_target, f'Non-root {gn_target} required' self.gn_target = gn_target - self._build_config = None + self.has_build_config = has_build_config + self._combined_config = None + self._params_json = None @property def ninja_target(self): @@ -144,37 +156,48 @@ class _TargetEntry: @property def ninja_build_config_target(self): + assert self.has_build_config, 'No build config for ' + self.gn_target return self.ninja_target + '__build_config_crbug_908819' @property def build_config_path(self): """Returns the filepath of the project's .build_config.json.""" - ninja_target = self.ninja_target - # Support targets at the root level. e.g. //:foo - if ninja_target[0] == ':': - ninja_target = ninja_target[1:] - subpath = ninja_target.replace(':', os.path.sep) + '.build_config.json' - return os.path.relpath( - os.path.join(constants.GetOutDirectory(), 'gen', subpath)) + assert self.has_build_config, 'No build config for ' + self.gn_target + return self.params_path.replace('.params.json', '.build_config.json') @property def params_path(self): """Returns the filepath of the project's .params.json.""" - return self.build_config_path.replace('.build_config.json', '.params.json') + ninja_target = self.ninja_target + # Support targets at the root level. e.g. //:foo + if ninja_target[0] == ':': + ninja_target = ninja_target[1:] + subpath = ninja_target.replace(':', os.path.sep) + '.params.json' + return os.path.relpath( + os.path.join(constants.GetOutDirectory(), 'gen', subpath)) - def build_config(self): - """Reads and returns the project's .build_config.json JSON.""" - if not self._build_config: + def params_values(self): + if not self._params_json: with open(self.params_path) as f: - config = json.load(f) - with open(self.build_config_path) as f: - config.update(json.load(f)) - self._build_config = config - return self._build_config + self._params_json = json.load(f) + return self._params_json + + def combined_config_values(self): + """Union of .params.json and *.build_config.json""" + if not self._combined_config: + config = dict(self.params_values()) + if self.has_build_config: + pattern = self.build_config_path.replace('.build_config.json', + '*.build_config.json') + for p in glob.glob(pattern): + with open(p) as f: + config.update(json.load(f)) + self._combined_config = config + return self._combined_config def get_type(self): """Returns the target type from its .build_config.json.""" - return self.build_config()['type'] + return self.params_values()['type'] def proguard_enabled(self): """Returns whether proguard runs for this target.""" @@ -182,7 +205,7 @@ class _TargetEntry: # bundle level. if self.get_type() == 'android_app_bundle_module': return False - return self.build_config().get('proguard_enabled', False) + return self.params_values().get('proguard_enabled', False) def main(): @@ -254,17 +277,20 @@ def main(): # write .build_config.json files, and so will not show up by this query. # If we ever need them to, use "gn gen" into a temp dir, and set an extra # gn arg that causes all write_build_config() template to print all targets. - targets = _query_for_build_config_targets(output_dir) - entries = [_TargetEntry(t) for t in targets] + result = _query_for_targets(output_dir) + entries = [_TargetEntry(t, v) for t, v in sorted(result.items())] + entries = [e for e in entries if os.path.exists(e.params_path)] if not entries: logging.warning('No targets found. Run with --build') sys.exit(1) if args.build: - logging.warning('Building %d .build_config.json files...', len(entries)) - _compile(output_dir, [e.ninja_build_config_target for e in entries], - quiet=args.quiet) + targets = [ + e.ninja_build_config_target for e in entries if e.has_build_config + ] + logging.warning('Building %d .build_config.json files...', len(targets)) + _compile(output_dir, targets, quiet=args.quiet) if args.type: if set(args.type) & {'android_resources', 'android_assets', 'group'}: @@ -298,13 +324,13 @@ def main(): if args.print_types: type_part = e.get_type() elif args.print_build_config_paths: - type_part = e.build_config_path + type_part = e.build_config_path if e.has_build_config else 'N/A' elif args.print_params_paths: type_part = e.params_path elif args.query: - type_part = _query_json(json_dict=e.build_config(), + type_part = _query_json(json_dict=e.combined_config_values(), query=args.query, - path=e.build_config_path) + target=e.gn_target) if not type_part: continue diff --git a/naiveproxy/src/build/android/location_rewriter/BUILD.gn b/naiveproxy/src/build/android/location_rewriter/BUILD.gn new file mode 100644 index 0000000000..bf7f9e54bc --- /dev/null +++ b/naiveproxy/src/build/android/location_rewriter/BUILD.gn @@ -0,0 +1,29 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/android/rules.gni") + +java_binary("location_rewriter") { + main_class = "org.chromium.build.location_rewriter.LocationRewriter" + deps = [ ":location_rewriter_java" ] + wrapper_script_name = "helper/location_rewriter" +} + +java_library("location_rewriter_java") { + visibility = [ ":*" ] + jacoco_never_instrument = true + enable_errorprone = false + + sources = [ + "src/org/chromium/build/location_rewriter/LocationClass.java", + "src/org/chromium/build/location_rewriter/LocationRewriter.java", + "src/org/chromium/build/location_rewriter/LocationRewriterImpl.java", + "src/org/chromium/build/location_rewriter/LocationRewriterTargetMethods.java", + "src/org/chromium/build/location_rewriter/VisitableMethod.java", + ] + deps = [ + "//third_party/android_deps:org_ow2_asm_asm_commons_java", + "//third_party/android_deps:org_ow2_asm_asm_java", + ] +} diff --git a/naiveproxy/src/build/android/native_flags/BUILD.gn b/naiveproxy/src/build/android/native_flags/BUILD.gn index 3171030261..be73766294 100644 --- a/naiveproxy/src/build/android/native_flags/BUILD.gn +++ b/naiveproxy/src/build/android/native_flags/BUILD.gn @@ -17,6 +17,10 @@ if (current_toolchain == default_toolchain) { command = "$solink {{output}} {{ldflags}}" outputs = [ "{{root_out_dir}}/{{label_name}}.txt" ] } + tool("cxx_module") { + command = "this-should-never-run" + outputs = [ "this-will-never-exist" ] + } tool("alink") { command = "this-should-never-run" outputs = [ "this-will-never-exist" ] @@ -30,8 +34,10 @@ if (current_toolchain == default_toolchain) { # This will record flags from all default configs of the default toolchain. source_set("default_ccflags") { sources = [ "empty.cc" ] + use_libcxx_modules = false } shared_library("default_ldflags") { no_default_deps = true + use_libcxx_modules = false } } diff --git a/naiveproxy/src/build/android/pylib/gtest/gtest_test_instance.py b/naiveproxy/src/build/android/pylib/gtest/gtest_test_instance.py index c90ea50f28..97d323b886 100644 --- a/naiveproxy/src/build/android/pylib/gtest/gtest_test_instance.py +++ b/naiveproxy/src/build/android/pylib/gtest/gtest_test_instance.py @@ -18,6 +18,7 @@ from pylib import constants from pylib.constants import host_paths from pylib.base import base_test_result from pylib.base import test_instance +from pylib.symbols import deobfuscator from pylib.symbols import stack_symbolizer from pylib.utils import test_filter @@ -396,6 +397,8 @@ class GtestTestInstance(test_instance.TestInstance): self._wait_for_java_debugger = args.wait_for_java_debugger self._use_existing_test_data = args.use_existing_test_data self._deploy_mock_openxr_runtime = args.deploy_mock_openxr_runtime + self._proguard_mapping_path = args.proguard_mapping_path + self._deobfuscator = None # GYP: if args.executable_dist_dir: @@ -632,6 +635,14 @@ class GtestTestInstance(test_instance.TestInstance): """Map data dependencies via isolate.""" self._data_deps.extend( self._data_deps_delegate(self._runtime_deps_path)) + if self._proguard_mapping_path: + self._deobfuscator = deobfuscator.DeobfuscatorPool( + self._proguard_mapping_path) + + def MaybeDeobfuscateLines(self, lines): + if not self._deobfuscator: + return lines + return self._deobfuscator.TransformLines(lines) def GetDataDependencies(self): """Returns the test suite's data dependencies. @@ -706,3 +717,7 @@ class GtestTestInstance(test_instance.TestInstance): #override def TearDown(self): """Do nothing.""" + self.symbolizer.CleanUp() + if self._deobfuscator: + self._deobfuscator.Close() + self._deobfuscator = None diff --git a/naiveproxy/src/build/android/pylib/instrumentation/instrumentation_test_instance.py b/naiveproxy/src/build/android/pylib/instrumentation/instrumentation_test_instance.py index 87df2113b9..e7021e3fd0 100644 --- a/naiveproxy/src/build/android/pylib/instrumentation/instrumentation_test_instance.py +++ b/naiveproxy/src/build/android/pylib/instrumentation/instrumentation_test_instance.py @@ -1134,7 +1134,7 @@ class InstrumentationTestInstance(test_instance.TestInstance): # Preserve historic default. if (not self._uses_base_instrumentation and not any(a in _VALID_ANNOTATIONS for a in annotations)): - annotations['MediumTest'] = None + annotations['MediumTest'] = {} inflated_tests.append({ 'class': clazz['class'], diff --git a/naiveproxy/src/build/android/pylib/local/device/local_device_environment.py b/naiveproxy/src/build/android/pylib/local/device/local_device_environment.py index 0083400132..ef3d556aa3 100644 --- a/naiveproxy/src/build/android/pylib/local/device/local_device_environment.py +++ b/naiveproxy/src/build/android/pylib/local/device/local_device_environment.py @@ -18,6 +18,7 @@ from devil.android import device_errors from devil.android import device_utils from devil.android import logcat_monitor from devil.android.sdk import adb_wrapper +from devil.android.sdk import version_codes from devil.utils import file_utils from devil.utils import parallelizer from pylib import constants @@ -119,6 +120,9 @@ class LocalDeviceEnvironment(environment.Environment): self._force_main_user = False if hasattr(args, 'force_main_user'): self._force_main_user = args.force_main_user + self._skia_gold_consider_unsupported = False + if hasattr(args, 'skia_gold_consider_unsupported'): + self._skia_gold_consider_unsupported = args.skia_gold_consider_unsupported self._use_persistent_shell = args.use_persistent_shell use_local_devil_tools = False @@ -209,6 +213,15 @@ class LocalDeviceEnvironment(environment.Environment): self._logcat_monitors.append(monitor) monitor.Start() + # There is a change in soft keyboard behavior since Android 16. + # See https://crbug.com/443782461 for more details. + if d.build_version_sdk >= version_codes.BAKLAVA: + with d.GboardPreferences() as gboard_prefs: + # Disable the stylus. + gboard_prefs.SetBoolean('enable_scribe', False) + # Always show the soft keyboards. + gboard_prefs.SetBoolean('pk_always_show_vk', True) + self.parallel_devices.pMap(prepare_device) @property @@ -261,6 +274,10 @@ class LocalDeviceEnvironment(environment.Environment): def force_main_user(self): return self._force_main_user + @property + def skia_gold_consider_unsupported(self): + return self._skia_gold_consider_unsupported + #override def TearDown(self): if self.trace_output and self._trace_all: diff --git a/naiveproxy/src/build/android/pylib/local/device/local_device_gtest_run.py b/naiveproxy/src/build/android/pylib/local/device/local_device_gtest_run.py index 0fcbb23d57..59ed7fb673 100644 --- a/naiveproxy/src/build/android/pylib/local/device/local_device_gtest_run.py +++ b/naiveproxy/src/build/android/pylib/local/device/local_device_gtest_run.py @@ -799,7 +799,8 @@ class LocalDeviceGtestRun(local_device_test_run.LocalDeviceTestRun): device.adb, filter_specs=local_device_environment.LOGCAT_FILTERS, output_file=logcat_file.name, - transform_func=symbolizer.TransformLines, + transform_func=lambda lines: symbolizer.TransformLines( + self._test_instance.MaybeDeobfuscateLines(lines)), check_error=False) as logmon: with contextlib_ext.Optional(trace_event.trace(str(test)), self._env.trace_output): diff --git a/naiveproxy/src/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/naiveproxy/src/build/android/pylib/local/device/local_device_instrumentation_test_run.py index 5529b5d8f0..67373b7147 100644 --- a/naiveproxy/src/build/android/pylib/local/device/local_device_instrumentation_test_run.py +++ b/naiveproxy/src/build/android/pylib/local/device/local_device_instrumentation_test_run.py @@ -134,10 +134,8 @@ _DEVICE_GOLD_DIR = 'skia_gold' RENDER_TEST_MODEL_SDK_CONFIGS = { # Android x86 emulator. 'Android SDK built for x86': [29], - # We would like this to be supported, but it is currently too prone to - # introducing flakiness due to a combination of Gold and Chromium issues. - # See crbug.com/1233700 and skbug.com/12149 for more information. - # 'Pixel 2': [28], + # Android x64 emulator. + 'Android SDK built for x64': [35], } _BATCH_SUFFIX = '_batch' @@ -812,8 +810,11 @@ class LocalDeviceInstrumentationTestRun( else: raise Exception('No PackageInfo found but' '--use-apk-under-test-flags-file is specified.') - self._flag_changers[str(device)] = flag_changer.FlagChanger( - device, cmdline_file) + changer = flag_changer.FlagChanger(device, cmdline_file) + # Ensure that any existing flags are cleared so that there cannot be any + # conflicts with added flags. + changer.RemoveFlags(changer.GetCurrentFlags()) + self._flag_changers[str(device)] = changer #override def _CreateShardsForDevices(self, tests): @@ -1716,9 +1717,13 @@ class LocalDeviceInstrumentationTestRun( should_rewrite = True del json_dict['full_test_name'] - running_on_unsupported = ( - device.build_version_sdk not in RENDER_TEST_MODEL_SDK_CONFIGS.get( - device.product_model, []) and not fail_on_unsupported) + supported_sdks_for_device = RENDER_TEST_MODEL_SDK_CONFIGS.get( + device.product_model, []) + is_unsupported_config = (device.build_version_sdk + not in supported_sdks_for_device + or self._env.skia_gold_consider_unsupported) + running_on_unsupported = (is_unsupported_config + and not fail_on_unsupported) should_ignore_in_gold = running_on_unsupported # We still want to fail the test even if we're ignoring the image in # Gold if we're running on a supported configuration, so @@ -1759,20 +1764,22 @@ class LocalDeviceInstrumentationTestRun( # the test has explicitly opted in, as it's likely that baselines # aren't maintained for that configuration. if should_hide_failure: - if self._test_instance.skia_gold_properties.local_pixel_tests: - _AppendToLog( - results, full_test_name, - 'Gold comparison for %s failed, but model %s with SDK ' - '%d is not a supported configuration. This failure would be ' - 'ignored on the bots, but failing since tests are being run ' - 'locally.' % - (render_name, device.product_model, device.build_version_sdk)) + message = 'Gold comparison for %s failed, but ' % render_name + if self._env.skia_gold_consider_unsupported: + message += 'the --skia-gold-consider-unsupported flag was passed' else: - _AppendToLog( - results, full_test_name, - 'Gold comparison for %s failed, but model %s with SDK ' - '%d is not a supported configuration, so ignoring failure.' % - (render_name, device.product_model, device.build_version_sdk)) + message += ( + 'model %s with SDK %d is not a supported configuration' % + (device.product_model, device.build_version_sdk)) + + if self._test_instance.skia_gold_properties.local_pixel_tests: + message += ( + '. This failure would be ignored on the bots, but failing ' + 'since tests are being run locally.') + _AppendToLog(results, full_test_name, message) + else: + message += ', so ignoring failure.' + _AppendToLog(results, full_test_name, message) continue _FailTestIfNecessary(results, full_test_name) diff --git a/naiveproxy/src/build/android/pylib/local/emulator/avd.py b/naiveproxy/src/build/android/pylib/local/emulator/avd.py index 98ae991cef..a268d8447c 100644 --- a/naiveproxy/src/build/android/pylib/local/emulator/avd.py +++ b/naiveproxy/src/build/android/pylib/local/emulator/avd.py @@ -1233,6 +1233,7 @@ class _AvdInstance: if enable_network: _EnableNetwork(self.device) + except base_error.BaseError as e: self.UploadCrashreport() raise AvdStartException(str(e)) from e @@ -1354,6 +1355,16 @@ def _EnsureSystemSettings(device): device.RunShellCommand( ['settings', 'put', 'global', 'hide_error_dialogs', '1']) + # There is a change in soft keyboard behavior since Android 16. + # See https://crbug.com/443782461 for more details. + if device.build_version_sdk >= version_codes.BAKLAVA: + logging.info('Update Gboard preferences.') + with device.GboardPreferences() as gboard_prefs: + # Disable the stylus. + gboard_prefs.SetBoolean('enable_scribe', False) + # Always show the soft keyboards. + gboard_prefs.SetBoolean('pk_always_show_vk', True) + def _EnableNetwork(device): logging.info('Enable the network on the emulator.') diff --git a/naiveproxy/src/build/android/pylib/local/machine/local_machine_junit_test_run.py b/naiveproxy/src/build/android/pylib/local/machine/local_machine_junit_test_run.py index b7026dc376..03955bd62f 100644 --- a/naiveproxy/src/build/android/pylib/local/machine/local_machine_junit_test_run.py +++ b/naiveproxy/src/build/android/pylib/local/machine/local_machine_junit_test_run.py @@ -27,7 +27,7 @@ from pylib.results import json_results # Chosen after timing test runs of chrome_junit_tests with 7,16,32, # and 64 workers in threadpool and different classes_per_job. -_MAX_TESTS_PER_JOB = 150 +_MAX_TESTS_PER_JOB = 128 _FAILURE_TYPES = ( base_test_result.ResultType.FAIL, @@ -203,7 +203,7 @@ class LocalMachineJunitTestRun(test_run.TestRun): # 3 seconds per method. num_classes = len(test_group.methods_by_class) num_tests = sum(len(x) for x in test_group.methods_by_class.values()) - timeout = 20 + 5 * num_classes + num_tests * 3 + timeout = 30 + 5 * num_classes + num_tests * 3 return _Job(shard_id=shard_id, cmd=cmd, timeout=timeout, diff --git a/naiveproxy/src/build/android/test_runner.py b/naiveproxy/src/build/android/test_runner.py index 7791a5ee23..ebc821d756 100755 --- a/naiveproxy/src/build/android/test_runner.py +++ b/naiveproxy/src/build/android/test_runner.py @@ -439,6 +439,10 @@ def AddGTestOptions(parser): '--gs-test-artifacts-bucket', help=('If present, test artifacts will be uploaded to this Google ' 'Storage bucket.')) + parser.add_argument( + '--proguard-mapping-path', + help='.mapping file to use to Deobfuscate java stack traces in test ' + 'output and logcat.') parser.add_argument( '--render-test-output-dir', help='If present, store rendering artifacts in this path.') @@ -454,6 +458,15 @@ def AddGTestOptions(parser): '--store-tombstones', dest='store_tombstones', action='store_true', help='Add tombstones in results if crash.') + parser.add_argument( + '--do-not-store-tombstones', + dest='store_tombstones', + action='store_false', + help=('Do not add tombstones in results if a crash occurs. This is the ' + 'default behavior, but is available via an explicit flag for ' + 'cases such as crbug.com/419062315 where tombstones should not ' + 'be stored and --store-tombstones cannot be removed from the ' + 'command line.')) parser.add_argument( '-s', '--suite', dest='suite_name', nargs='+', metavar='SUITE_NAME', required=True, @@ -641,6 +654,15 @@ def AddInstrumentationTestOptions(parser): '--store-tombstones', action='store_true', dest='store_tombstones', help='Add tombstones in results if crash.') + parser.add_argument( + '--do-not-store-tombstones', + dest='store_tombstones', + action='store_false', + help=('Do not add tombstones in results if a crash occurs. This is the ' + 'default behavior, but is available via an explicit flag for ' + 'cases such as crbug.com/419062315 where tombstones should not ' + 'be stored and --store-tombstones cannot be removed from the ' + 'command line.')) parser.add_argument( '--strict-mode', dest='strict_mode', default='testing', @@ -761,6 +783,12 @@ def AddSkiaGoldTestOptions(parser): help='Bypass all interaction with Skia Gold, effectively disabling the ' 'image comparison portion of any tests that use Gold. Only meant to be ' 'used in case a Gold outage occurs and cannot be fixed quickly.') + parser.add_argument( + '--skia-gold-consider-unsupported', + action='store_true', + help='Considers the configuration unsupported for Skia Gold, even if the ' + 'Device + SDK Level is considered supported, which will avoid failing ' + 'the test if there is a mismatch with goldens.') def AddHostsideTestOptions(parser): @@ -1071,10 +1099,45 @@ def _CreateStructuredTestDict(test_instance, test_result): # The proto requires a list. struct_test_dict['caseNameComponents'] = [re_match.group(3)] elif test_instance.TestType() == 'gtest': + found_match = False + # Attempt to parse gtests based on: + # infra/go/src/infra/tools/result_adapter/gtest.go + # Type-parameterised test (e.g. MyInstantiation/FooTest/MyType.DoesBar) + re_match = re.search(r'^((\w+)/)?(\w+)/(\w+)\.(\w+)$', test_id) + if re_match: + suite = re_match.group(3) + name = re_match.group(5) + instantiation = re_match.group(2) + case_id = re_match.group(4) + found_match = True + + # Value-parameterised test (e.g. MyInstantiation/FooTest.DoesBar/TestValue) + re_match = re.search(r'^((\w+)/)?(\w+)\.(\w+)/(\w+)$', test_id) + if not found_match and re_match: + suite = re_match.group(3) + name = re_match.group(4) + instantiation = re_match.group(2) + case_id = re_match.group(5) + found_match = True + + # Neither type nor value-parameterised (e.g. FooTest.DoesBar) + re_match = re.search(r'^(\w+)\.(\w+)$', test_id) + if not found_match and re_match: + suite = re_match.group(1) + name = re_match.group(2) + instantiation = "" + case_id = "" + struct_test_dict['coarseName'] = None # Not used. - struct_test_dict['fineName'] = test_instance.suite - # The proto requires a list. - struct_test_dict['caseNameComponents'] = [test_id] + struct_test_dict['fineName'] = suite + if not case_id: + struct_test_dict['caseNameComponents'] = [name] + elif not instantiation: + struct_test_dict['caseNameComponents'] = ['%s/%s' % (name, case_id)] + else: + struct_test_dict['caseNameComponents'] = [ + '%s/%s.%s' % (name, instantiation, case_id) + ] else: return None diff --git a/naiveproxy/src/build/android/test_runner.pydeps b/naiveproxy/src/build/android/test_runner.pydeps index 852361077a..3729d95485 100644 --- a/naiveproxy/src/build/android/test_runner.pydeps +++ b/naiveproxy/src/build/android/test_runner.pydeps @@ -60,6 +60,7 @@ ../../third_party/catapult/devil/devil/android/sdk/bundletool.py ../../third_party/catapult/devil/devil/android/sdk/intent.py ../../third_party/catapult/devil/devil/android/sdk/keyevent.py +../../third_party/catapult/devil/devil/android/sdk/shared_prefs.py ../../third_party/catapult/devil/devil/android/sdk/split_select.py ../../third_party/catapult/devil/devil/android/sdk/version_codes.py ../../third_party/catapult/devil/devil/android/tools/__init__.py diff --git a/naiveproxy/src/build/android/test_runner_test.py b/naiveproxy/src/build/android/test_runner_test.py index b4f13edb39..3138dbfd69 100755 --- a/naiveproxy/src/build/android/test_runner_test.py +++ b/naiveproxy/src/build/android/test_runner_test.py @@ -123,13 +123,13 @@ class TestRunnerHelperTest(unittest.TestCase): # gtest t_instance_mock.TestType.return_value = 'gtest' - test_id = 'foo.bar.class.test1[28]' + test_id = 'FooTest.DoesBar' t_result_mock.GetNameForResultSink.return_value = test_id test_dict = test_runner._CreateStructuredTestDict(t_instance_mock, t_result_mock) self.assertIsNone(test_dict['coarseName']) - self.assertEqual(test_dict['fineName'], 'foo_suite') - self.assertTrue(test_id in test_dict['caseNameComponents']) + self.assertEqual(test_dict['fineName'], 'FooTest') + self.assertTrue('DoesBar' in test_dict['caseNameComponents']) # pylint: disable=protected-access diff --git a/naiveproxy/src/build/android/unused_resources/BUILD.gn b/naiveproxy/src/build/android/unused_resources/BUILD.gn index 4b8749b479..dfe3484e6c 100644 --- a/naiveproxy/src/build/android/unused_resources/BUILD.gn +++ b/naiveproxy/src/build/android/unused_resources/BUILD.gn @@ -11,7 +11,7 @@ java_binary("unused_resources") { "//third_party/android_deps:com_android_tools_common_java", "//third_party/android_deps:com_android_tools_layoutlib_layoutlib_api_java", "//third_party/android_deps:com_android_tools_sdk_common_java", - "//third_party/android_deps:com_google_guava_guava_java", + "//third_party/android_deps:guava_java", "//third_party/kotlin_stdlib:kotlin_stdlib_java", "//third_party/r8:r8_java", ] diff --git a/naiveproxy/src/build/android/unused_resources/UnusedResources.java b/naiveproxy/src/build/android/unused_resources/UnusedResources.java index be7a08e18d..958768517b 100644 --- a/naiveproxy/src/build/android/unused_resources/UnusedResources.java +++ b/naiveproxy/src/build/android/unused_resources/UnusedResources.java @@ -59,10 +59,12 @@ import java.io.StringWriter; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; +import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -400,48 +402,70 @@ public class UnusedResources { private void recordClassUsages(File file, String name, byte[] bytes) { assert name.endsWith(DOT_DEX); - ReferenceChecker callback = new ReferenceChecker() { - @Override - public boolean shouldProcess(String internalName) { - // We do not need to ignore R subclasses since R8 now removes - // unused resource id fields in R subclasses thus their - // remaining presence means real usage. - return true; - } - - @Override - public void referencedInt(int value) { - UnusedResources.this.referencedInt("dex", value, file, name); - } - - @Override - public void referencedString(String value) { - // do nothing. - } - - @Override - public void referencedStaticField(String internalName, String fieldName) { - Resource resource = getResourceFromCode(internalName, fieldName); - if (resource != null) { - ResourceUsageModel.markReachable(resource); - if (mDebugPrinter != null) { - mDebugPrinter.println("Marking " + stringifyResource(resource) - + " reachable: referenced from dex" - + " in " + file + ":" + name + " (static field access " - + internalName + "." + fieldName + ")"); + ReferenceChecker callback = + new ReferenceChecker() { + @Override + public boolean shouldProcess(String internalName) { + // We do not need to ignore R subclasses since R8 now removes + // unused resource id fields in R subclasses thus their + // remaining presence means real usage. + return true; } - } - } - @Override - public void referencedMethod( - String internalName, String methodName, String methodDescriptor) { - // Do nothing. - } - }; - ProgramResource resource = ProgramResource.fromBytes( - new PathOrigin(file.toPath()), ProgramResource.Kind.DEX, bytes, null); - ProgramResourceProvider provider = () -> Arrays.asList(resource); + @Override + public void referencedInt(int value) { + UnusedResources.this.referencedInt("dex", value, file, name); + } + + @Override + public void referencedString(String value) { + // do nothing. + } + + @Override + public void referencedStaticField(String internalName, String fieldName) { + Resource resource = getResourceFromCode(internalName, fieldName); + if (resource != null) { + ResourceUsageModel.markReachable(resource); + if (mDebugPrinter != null) { + mDebugPrinter.println( + "Marking " + + stringifyResource(resource) + + " reachable: referenced from dex" + + " in " + + file + + ":" + + name + + " (static field access " + + internalName + + "." + + fieldName + + ")"); + } + } + } + + @Override + public void referencedMethod( + String internalName, String methodName, String methodDescriptor) { + // Do nothing. + } + }; + ProgramResource resource = + ProgramResource.fromBytes( + new PathOrigin(file.toPath()), ProgramResource.Kind.DEX, bytes, null); + ProgramResourceProvider provider = + new ProgramResourceProvider() { + @Override + public Collection getProgramResources() { + return Arrays.asList(resource); + } + + @Override + public void getProgramResources(Consumer consumer) { + consumer.accept(resource); + } + }; try { Command command = (new ResourceShrinker.Builder()).addProgramResourceProvider(provider).build(); diff --git a/naiveproxy/src/build/check_gn_headers_allowlist.txt b/naiveproxy/src/build/check_gn_headers_allowlist.txt index 8943891aaa..c2b8150903 100644 --- a/naiveproxy/src/build/check_gn_headers_allowlist.txt +++ b/naiveproxy/src/build/check_gn_headers_allowlist.txt @@ -55,8 +55,6 @@ chrome/installer/util/google_update_settings.h components/device_event_log/device_event_log_export.h components/login/login_export.h components/media_router/common/providers/cast/certificate/cast_crl_root_ca_cert_der-inc.h -components/nacl/browser/nacl_browser_delegate.h -components/nacl/renderer/ppb_nacl_private.h components/policy/core/browser/configuration_policy_handler_parameters.h components/policy/proto/policy_proto_export.h components/rlz/rlz_tracker_delegate.h @@ -106,7 +104,6 @@ gpu/config/gpu_lists_version.h gpu/gles2_conform_support/gtf/gtf_stubs.h gpu/gpu_export.h ipc/ipc_channel_proxy_unittest_messages.h -ipc/ipc_message_null_macros.h media/audio/audio_logging.h media/cast/common/mod_util.h media/cast/net/rtcp/rtcp_session.h @@ -205,7 +202,6 @@ ui/events/keycodes/keyboard_codes_posix.h ui/gfx/overlay_transform.h ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h ui/gfx/swap_result.h -ui/gfx/sys_color_change_listener.h ui/gl/gl_bindings_api_autogen_egl.h ui/gl/gl_bindings_api_autogen_gl.h ui/gl/gl_bindings_api_autogen_glx.h diff --git a/naiveproxy/src/build/chromeos/test_runner.py b/naiveproxy/src/build/chromeos/test_runner.py index 500e9f9199..63cf901be1 100755 --- a/naiveproxy/src/build/chromeos/test_runner.py +++ b/naiveproxy/src/build/chromeos/test_runner.py @@ -396,6 +396,7 @@ class TastTest(RemoteTest): html_artifact = debug_link if result == base_test_result.ResultType.SKIP: html_artifact = 'Test was skipped because: ' + test['skipReason'] + self._rdb_client.Post( test['name'], result, @@ -404,7 +405,9 @@ class TastTest(RemoteTest): None, artifacts=artifacts, failure_reason=primary_error_message, - html_artifact=html_artifact) + html_artifact=html_artifact, + test_id_structured=_create_structured_test_id_dict(test['name']), + ) if self._rdb_client and self._logs_dir: # Attach artifacts from the device that don't apply to a single test. @@ -719,6 +722,39 @@ class GTestTest(RemoteTest): 'See crbug.com/1330441.') +def _create_structured_test_id_dict(test_id): + """Fills in fields for the structured_test_dict. + + Args: + test_id: A string of the test name. + + Returns: + A dictionary containing structured test id fields. + """ + struct_test_dict = { + 'coarseName': '', + 'fineName': '', + 'caseNameComponents': None, + } + + # test_ids are expected to take the form: + # tast.network.DNSProxy.arc_doh_off + # tast.network.DNSProxy + # network.DNSProxy.arc_doh_off + # network.DNSProxy + test_id = test_id.removeprefix('tast.') + test_split = test_id.split('.', 1) + if len(test_split) == 2: + struct_test_dict['fineName'] = test_split[0] + struct_test_dict['caseNameComponents'] = [test_split[1]] + else: + logging.error( + 'Test id: %s, did not match known format, so could not be parsed.', + test_id) + + return struct_test_dict + + def device_test(args, unknown_args): # cros_run_test has trouble with relative paths that go up directories, # so cd to src/, which should be the root of all data deps. diff --git a/naiveproxy/src/build/config/BUILD.gn b/naiveproxy/src/build/config/BUILD.gn index 56ca3ca739..96085b41f0 100644 --- a/naiveproxy/src/build/config/BUILD.gn +++ b/naiveproxy/src/build/config/BUILD.gn @@ -143,7 +143,7 @@ config("release") { if (is_ios) { # Disable NSAssert and GTMDevAssert (from Google Toolbox for Mac). This - # follows XCode's default behavior for Release builds. + # follows Xcode's default behavior for Release builds. defines += [ "NS_BLOCK_ASSERTIONS=1" ] } } diff --git a/naiveproxy/src/build/config/BUILDCONFIG.gn b/naiveproxy/src/build/config/BUILDCONFIG.gn index 934e15c267..1af7756936 100644 --- a/naiveproxy/src/build/config/BUILDCONFIG.gn +++ b/naiveproxy/src/build/config/BUILDCONFIG.gn @@ -139,8 +139,7 @@ declare_args() { is_clang = current_os != "linux" || (current_cpu != "s390x" && current_cpu != "s390" && current_cpu != "ppc64" && current_cpu != "ppc" && - current_cpu != "mips" && current_cpu != "mips64" && - current_cpu != "riscv64") + current_cpu != "mips" && current_cpu != "mips64") # Allows the path to a custom target toolchain to be injected as a single # argument, and set as the default toolchain. @@ -155,13 +154,6 @@ declare_args() { # True when compiling native code for use with robolectric_binary(). is_robolectric = false - # Use explicit Clang header modules for libc++. - # This is experimental only (see crbug.com/543704). - # For details on the current state of modules in Chromium see - # https://chromium.googlesource.com/chromium/src/+/main/docs/modules.md - # We explicitly need this flag in this file because it's read by this file. - use_clang_modules = false - # DON'T ADD MORE FLAGS HERE. Read the comment above. } @@ -329,12 +321,6 @@ is_fuchsia = current_os == "fuchsia" is_ios = current_os == "ios" is_linux = current_os == "linux" || current_os == "openwrt" is_mac = current_os == "mac" - -# TODO(crbug.com/40511454): Remove is_nacl from all build files, then -# remove the is_nacl variable. -assert(current_os != "nacl") -is_nacl = false - is_wasm = current_os == "emscripten" is_watchos = current_os == "watchos" is_win = current_os == "win" || current_os == "winuwp" @@ -375,12 +361,11 @@ default_compiler_configs = [ "//build/config/compiler:default_stack_frames", "//build/config/compiler:default_symbols", "//build/config/compiler:disallow_unstable_features", - "//build/config/compiler:libcxx_hardening", - "//build/config/compiler:libcxx_module", "//build/config/compiler:no_exceptions", "//build/config/compiler:no_rtti", "//build/config/compiler:no_unresolved_symbols", "//build/config/compiler:runtime_library", + "//build/config/compiler:sanitize_c_array_bounds", "//build/config/compiler:thin_archive", "//build/config/compiler:thinlto_optimize_max", "//build/config/compiler:tot_warnings", @@ -420,7 +405,7 @@ if (is_android) { [ "//build/config/android:default_orderfile_instrumentation" ] } -if (is_clang && !is_nacl) { +if (is_clang) { default_compiler_configs += [ "//build/config/clang:extra_warnings", "//build/config/clang:find_bad_constructs", @@ -573,9 +558,7 @@ foreach(_target_type, ]) { template(_target_type) { target(_target_type, target_name) { - forward_variables_from(invoker, - "*", - TESTONLY_AND_VISIBILITY + [ "use_clang_modules" ]) + forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY) forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) if (!defined(inputs)) { inputs = [] @@ -588,18 +571,18 @@ foreach(_target_type, public_deps = [] } - if (use_clang_modules) { - # When Clang modules are used, libc++ headers must be copied (to the gen - # directory) regardless of whether the libc++ module is used in this - # target. + if (is_clang) { + # When clang is used, some target may use clang module. This dependency + # is required for things to work, regardless of whether the libc++ + # module is used in this target or not. public_deps += [ - "//buildtools/third_party/libc++:copy_custom_headers", - "//buildtools/third_party/libc++:copy_libcxx_headers", + "//buildtools/third_party/libc++:custom_headers", + "//buildtools/third_party/libc++:libcxx_headers", ] } if (!defined(use_libcxx_modules)) { - use_libcxx_modules = use_clang_modules + use_libcxx_modules = is_clang } if (filter_include( @@ -620,16 +603,8 @@ foreach(_target_type, } if (use_libcxx_modules) { - # This is necessary for Clang modules builds. + # Add a dependency needed for Clang modules builds. deps += [ "//buildtools/third_party/libc++:all_modules" ] - if (!defined(defines)) { - defines = [] - } - defines += [ "USE_LIBCXX_MODULES" ] - } else if (filter_include(configs, - [ "//build/config/compiler:libcxx_module" ]) != - []) { - configs -= [ "//build/config/compiler:libcxx_module" ] } # Consumed by the unsafe-buffers plugin during compile. @@ -675,10 +650,7 @@ foreach(_target_type, target(_target_type, _target_name) { forward_variables_from(invoker, "*", - TESTONLY_AND_VISIBILITY + [ - "no_default_deps", - "use_clang_modules", - ]) + TESTONLY_AND_VISIBILITY + [ "no_default_deps" ]) forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) if (!defined(inputs)) { inputs = [] @@ -720,18 +692,18 @@ foreach(_target_type, public_deps = [] } - if (use_clang_modules) { - # When Clang modules are used, libc++ headers must be copied (to the gen - # directory) regardless of whether the libc++ module is used in this - # target. + if (is_clang) { + # When clang is used, some target may use clang module. This dependency + # is required for things to work, regardless of whether the libc++ + # module is used in this target or not. public_deps += [ - "//buildtools/third_party/libc++:copy_custom_headers", - "//buildtools/third_party/libc++:copy_libcxx_headers", + "//buildtools/third_party/libc++:custom_headers", + "//buildtools/third_party/libc++:libcxx_headers", ] } if (!defined(use_libcxx_modules)) { - use_libcxx_modules = use_clang_modules + use_libcxx_modules = is_clang } if (filter_include( @@ -752,16 +724,8 @@ foreach(_target_type, } if (use_libcxx_modules) { - # These are necessary for Clang modules builds. + # Add a dependency needed for Clang modules builds. deps += [ "//buildtools/third_party/libc++:all_modules" ] - if (!defined(defines)) { - defines = [] - } - defines += [ "USE_LIBCXX_MODULES" ] - } else if (filter_include(configs, - [ "//build/config/compiler:libcxx_module" ]) != - []) { - configs -= [ "//build/config/compiler:libcxx_module" ] } # On Android, write shared library output file to metadata. We will use diff --git a/naiveproxy/src/build/config/android/config.gni b/naiveproxy/src/build/config/android/config.gni index 8a1e384ac5..31ddfda0c1 100644 --- a/naiveproxy/src/build/config/android/config.gni +++ b/naiveproxy/src/build/config/android/config.gni @@ -17,7 +17,9 @@ declare_args() { # off will enable proguard. is_java_debug = is_debug || incremental_install - enable_javaless_renderers = false + # Component build breaks javaless renderers - see + # go/javaless-renderers-component-build + enable_javaless_renderers = !is_component_build } # These two combinations could theoretically be made to work, but they are @@ -35,7 +37,9 @@ robolectric_toolchain = "//build/toolchain/android:robolectric_$host_cpu" if (is_android) { import("//build/config/android/channel.gni") + import("//build/config/chrome_build.gni") import("//build/config/clang/clang.gni") + import("//build/config/cronet/config.gni") import("//build/config/dcheck_always_on.gni") import("//build/config/sanitizers/sanitizers.gni") import("//build/toolchain/siso.gni") @@ -67,16 +71,16 @@ if (is_android) { # is set from gclient vars, with target_os needed for chromeos. # Can be set to false to disable all internal android things. enable_chrome_android_internal = - build_with_chromium && checkout_src_internal && target_os == "android" - - # Experimental new flag for the build system to automatically attempt to - # fix missing java deps. This should always be false on bots so they do not - # succeed when there are build errors. Devs can override this in args.gn. - auto_add_missing_java_deps = false + build_with_chromium && enable_src_internal && target_os == "android" # The default to use for android:minSdkVersion for targets that do # not explicitly set it. default_min_sdk_version = 29 + if (is_cronet_build) { + # Cronet's min sdk version support policy is different from the rest of + # Chromium; Cronet explicitly supports older devices. + default_min_sdk_version = 23 + } # Static analysis can be either "on" or "off" or "build_server". This # controls how android lint, error-prone, bytecode checks are run. This @@ -93,12 +97,7 @@ if (is_android) { # "off" # Disables static analysis. Many bots set this so as to not duplicate # the same analysis steps as other bots. - android_static_analysis = "build_server" - if (is_official_build) { - # Speed up official builds by disabling. Any failures should have already - # been caught by other bots. - android_static_analysis = "off" - } + android_static_analysis = "default" # Embed a wrap.sh file within apks to set custom environment variables. # Use a comma space-separated list. @@ -107,6 +106,24 @@ if (is_android) { } enable_wrap_sh = is_hwasan || is_asan || android_custom_env != "" + # Make it such that is_official_build sets android_static_analysis="off", but + # leaves enable_r8_tracerefs=true. + declare_args() { + # Controls whether TraceReferences checks are done (for targets with + # proguard_enabled=true). + enable_r8_tracerefs = android_static_analysis != "off" + } + + if (android_static_analysis == "default") { + if (is_official_build) { + # Speed up official builds by disabling. Any failures should have already + # been caught by other bots. + android_static_analysis = "off" + } else { + android_static_analysis = "build_server" + } + } + if (android_static_analysis == "build_server" && enable_java_templates && getenv("SWARMING_TASK_ID") != "") { # All android bots that can build java targets need to explicitly set @@ -120,7 +137,7 @@ if (is_android) { } # Our build system no longer supports legacy multidex. - min_supported_sdk_version = 21 + min_supported_sdk_version = 23 # ASAN requires O MR1. # https://github.com/google/sanitizers/wiki/AddressSanitizerOnAndroid/01f8df1ac1a447a8475cdfcb03e8b13140042dbd#running-with-wrapsh-recommended @@ -154,13 +171,13 @@ if (is_android) { } public_android_sdk_root = "//third_party/android_sdk/public" - public_android_sdk_build_tools = - "${public_android_sdk_root}/build-tools/36.0.0" public_android_sdk_platform_version = "36" + public_android_sdk_build_tools_version = "36.0.0" if (android_sdk_release == "b") { default_android_sdk_root = public_android_sdk_root default_android_sdk_platform_version = public_android_sdk_platform_version - default_android_sdk_build_tools_version = "36.0.0" + default_android_sdk_build_tools_version = + public_android_sdk_build_tools_version public_android_sdk = true } @@ -304,6 +321,11 @@ if (is_android) { # Where to write failed expectations for bots to read. expectations_failure_dir = "$root_build_dir/failed_expectations" + + # Enables rewriting of certain method invocations with overloads that take an + # additional argument of type org.chromium.base.task.Location (see + # //build/android/location_rewriter) + enable_java_location_rewrite = false } if (is_asan) { @@ -311,6 +333,12 @@ if (is_android) { disable_android_lint = true } + if (is_cronet_build) { + # Disable Java bytecode rewriting for cronet to prevent pulling in bytecode + # rewriter's dependencies + enable_java_location_rewrite = false + } + assert( android_ndk_api_level >= min_supported_sdk_version, "android_ndk_api_level ($android_ndk_api_level) must be >= min_supported_sdk_version ($min_supported_sdk_version)") @@ -375,13 +403,16 @@ if (is_android) { # than just the current one) since these are needed by the Android toolchain # file to define toolchains for all possible targets in one pass. - android_sdk = + android_sdk_platform_root = "${android_sdk_root}/platforms/android-${android_sdk_platform_version}" + public_android_sdk_platform_root = "${public_android_sdk_root}/platforms/android-${public_android_sdk_platform_version}" android_sdk_build_tools = "${android_sdk_root}/build-tools/$android_sdk_build_tools_version" + public_android_sdk_build_tools = "${public_android_sdk_root}/build-tools/$public_android_sdk_build_tools_version" # Path to the SDK's android.jar - android_sdk_jar = "$android_sdk/android.jar" + android_sdk_jar = "$android_sdk_platform_root/android.jar" + public_android_sdk_jar = "$public_android_sdk_platform_root/android.jar" # Location of libgcc. This is only needed for the current GN toolchain, so we # only need to define the current one, rather than one for every platform diff --git a/naiveproxy/src/build/config/android/internal_rules.gni b/naiveproxy/src/build/config/android/internal_rules.gni index 82668c13e6..8f136746b2 100644 --- a/naiveproxy/src/build/config/android/internal_rules.gni +++ b/naiveproxy/src/build/config/android/internal_rules.gni @@ -102,7 +102,6 @@ _custom_r8_path = "//third_party/r8/custom_r8.jar" _d8_path = "//third_party/r8/d8/cipd/lib/r8.jar" _custom_d8_path = "//third_party/r8/custom_d8.jar" _default_lint_jar_path = "//third_party/android_build_tools/lint/cipd/lint.jar" -_custom_lint_jar_path = "//third_party/android_build_tools/lint/custom_lint.jar" _manifest_merger_jar_path = "//third_party/android_build_tools/manifest_merger/cipd/manifest-merger.jar" @@ -110,6 +109,24 @@ _manifest_merger_jar_path = # the error message about why non-existent dependencies are there. build_config_target_suffix = "__build_config_crbug_908819" +# Paths for Java location rewriter +_asm_deps = [ + "//third_party/android_deps:org_ow2_asm_asm_commons_java", + "//third_party/android_deps:org_ow2_asm_asm_java", +] + +rebased_asm_params_path = [] +foreach(_asm_dep, _asm_deps) { + _asm_dep_gen_dir = get_label_info(_asm_dep, "target_gen_dir") + _asm_dep_name = get_label_info(_asm_dep, "name") + rebased_asm_params_path += + [ rebase_path("$_asm_dep_gen_dir/$_asm_dep_name.params.json", + root_build_dir) ] +} + +rebased_location_rewriter_path = + rebase_path("$root_build_dir/bin/helper/location_rewriter", root_build_dir) + # Write the target's .build_config.json file. This is a json file that contains a # dictionary of information about how to build this target (things that # require knowledge about this target's dependencies and cannot be calculated @@ -126,10 +143,77 @@ template("write_build_config") { _params_file = string_replace(invoker.build_config, ".build_config.json", ".params.json") _inputs = [ _params_file ] - _outputs = [ invoker.build_config ] + _outputs = [] _deps = [] _type = invoker.type + # ParamsJson.needs_full_javac_classpath() + _needs_full_javac_classpath = + _type == "android_apk" || _type == "android_app_bundle" || + (defined(invoker.needs_full_javac_classpath) && + invoker.needs_full_javac_classpath) || + (defined(invoker.dex_needs_classpath) && invoker.dex_needs_classpath) + + if (_needs_full_javac_classpath || + (_type != "java_library" && _type != "system_java_library" && + _type != "android_assets" && _type != "android_resources" && + _type != "group" && _type != "java_annotation_processor")) { + _outputs = [ invoker.build_config ] + } + + # ParamsJson.is_compile_type() + if (_type == "android_apk" || _type == "android_app_bundle_module" || + _type == "java_annotation_processor" || _type == "java_binary" || + _type == "robolectric_binary" || + (_type == "java_library" && !invoker.is_prebuilt)) { + _outputs += [ + string_replace(invoker.build_config, + ".build_config.json", + ".javac.build_config.json"), + string_replace(invoker.build_config, + ".build_config.json", + ".turbine.build_config.json"), + ] + } + + if (defined(invoker.enable_lint) && invoker.enable_lint) { + _outputs += [ string_replace(invoker.build_config, + ".build_config.json", + ".lint.build_config.json") ] + } + + # ParamsJson.merges_manifests() + _merges_manifests = + _type == "android_apk" || _type == "android_app_bundle_module" || + _type == "robolectric_binary" + if (_merges_manifests) { + _outputs += [ string_replace(invoker.build_config, + ".build_config.json", + ".manifest.build_config.json") ] + } + + # ParamsJson.collects_resources() + if (_merges_manifests || _type == "dist_aar") { + _outputs += [ string_replace(invoker.build_config, + ".build_config.json", + ".res.build_config.json") ] + } + + # ParamsJson.needs_transitive_rtxt() + if (_type == "dist_aar" || + (_type == "java_library" && !invoker.is_prebuilt)) { + _outputs += [ string_replace(invoker.build_config, + ".build_config.json", + ".rtxt.build_config.json") ] + } + + if (defined(invoker.enable_bytecode_checks) && + invoker.enable_bytecode_checks) { + _outputs += [ string_replace(invoker.build_config, + ".build_config.json", + ".targets.build_config.json") ] + } + if (current_toolchain == default_toolchain) { # Ensure targets match naming patterns so that __assetres, __header, __host, # and __validate targets work properly. @@ -313,11 +397,6 @@ template("write_build_config") { _rebased_asset_sources = rebase_path(_assets.sources, root_build_dir) } - if (defined(invoker.enable_lint) && invoker.enable_lint) { - _lint_json = string_replace(invoker.build_config, ".json", ".lint.json") - _outputs += [ _lint_json ] - } - _params = { type = _type gn_target = _target_label @@ -360,6 +439,8 @@ template("write_build_config") { "dex_needs_classpath", "direct_deps_only", "disable_asset_compression", + "enable_bytecode_checks", + "enable_lint", "gradle_treat_as_prebuilt", "is_prebuilt", "library_always_compress", @@ -528,16 +609,15 @@ template("write_build_config") { rebase_path("$target_out_dir/$_trace_events_target_name", root_build_dir) } - if (defined(_lint_json)) { - lint_json = rebase_path(_lint_json, root_build_dir) + if (defined(_needs_full_javac_classpath) && _type == "java_library") { + needs_full_javac_classpath = _needs_full_javac_classpath } } } write_file(_params_file, _params, "json") - # These build steps require no computed values. - if (_type == "android_assets" || _type == "android_resources" || - _type == "group") { + # Some types require no computed values. + if (_outputs == []) { not_needed([ "_deps", "_inputs", @@ -588,16 +668,17 @@ template("generate_r_java") { action_with_pydeps(target_name) { forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ "deps" ]) depfile = "$target_gen_dir/${invoker.target_name}.d" - inputs = [ invoker.build_config ] + inputs = [ invoker.rtxt_build_config ] outputs = [ invoker.srcjar_path ] - _rebased_build_config = rebase_path(invoker.build_config, root_build_dir) + _rebased_rtxt_build_config = + rebase_path(invoker.rtxt_build_config, root_build_dir) script = "//build/android/gyp/create_r_java.py" args = [ "--depfile", rebase_path(depfile, root_build_dir), "--srcjar-out", rebase_path(invoker.srcjar_path, root_build_dir), - "--deps-rtxts=@FileArg($_rebased_build_config:dependency_rtxt_files)", + "--deps-rtxts=@FileArg($_rebased_rtxt_build_config:dependency_rtxt_files)", "--r-package=${invoker.package}", ] } @@ -751,6 +832,20 @@ template("test_runner_script") { _jacoco_coverage_dir_name = "java_coverage" } + if (defined(invoker.proguard_mapping_path)) { + if (_incremental_apk) { + not_needed(invoker, [ "proguard_mapping_path" ]) + } else { + data += [ invoker.proguard_mapping_path ] + _rebased_mapping_path = + rebase_path(invoker.proguard_mapping_path, root_build_dir) + executable_args += [ + "--proguard-mapping-path", + "@WrappedPath($_rebased_mapping_path)", + ] + } + } + _device_test = true if (_test_type == "gtest") { assert(defined(invoker.test_suite)) @@ -811,19 +906,6 @@ template("test_runner_script") { "@WrappedPath(@FileArg($_rebased_build_config:apk_path))", ] } - if (defined(invoker.proguard_mapping_path)) { - if (_incremental_apk) { - not_needed(invoker, [ "proguard_mapping_path" ]) - } else { - data += [ invoker.proguard_mapping_path ] - _rebased_mapping_path = - rebase_path(invoker.proguard_mapping_path, root_build_dir) - executable_args += [ - "--proguard-mapping-path", - "@WrappedPath($_rebased_mapping_path)", - ] - } - } if (use_jacoco_coverage) { # Set a default coverage output directory (can be overridden by user # passing the same flag). @@ -1024,7 +1106,6 @@ if (enable_java_templates) { depfile = "$target_gen_dir/$target_name.d" inputs = java_paths_for_inputs + [ _lint_jar_path, - _custom_lint_jar_path, _backported_methods, ] @@ -1035,8 +1116,6 @@ if (enable_java_templates) { rebase_path(depfile, root_build_dir), "--lint-jar-path", rebase_path(_lint_jar_path, root_build_dir), - "--custom-lint-jar-path", - rebase_path(_custom_lint_jar_path, root_build_dir), "--lint-gen-dir", rebase_path(_lint_gen_dir, root_build_dir), "--android-sdk-version=${lint_android_sdk_version}", @@ -1107,7 +1186,9 @@ if (enable_java_templates) { deps += [ "//build/android:prepare_android_lint_cache" ] inputs += [ _create_cache_stamp_path ] } - _lint_json = string_replace(invoker.build_config, ".json", ".lint.json") + _lint_json = string_replace(invoker.build_config, + ".build_config.json", + ".lint.build_config.json") inputs += [ _lint_json ] _rebased_lint_json = rebase_path(_lint_json, root_build_dir) @@ -1286,9 +1367,8 @@ if (enable_java_templates) { } _outputs += [ _mapping_path ] - _enable_checks = - (!defined(invoker.enable_proguard_checks) || - invoker.enable_proguard_checks) && android_static_analysis != "off" + _enable_checks = (!defined(invoker.enable_proguard_checks) || + invoker.enable_proguard_checks) && enable_r8_tracerefs if (!_enable_checks) { _args += [ "--disable-checks" ] } @@ -1780,12 +1860,19 @@ if (enable_java_templates) { ]) script = "//build/android/gyp/check_for_missing_direct_deps.py" inputs = java_paths_for_inputs + [ - invoker.build_config, invoker.input_jar, + invoker.javac_build_config, + invoker.targets_build_config, + invoker.turbine_build_config, ] depfile = "$target_gen_dir/$target_name.d" outputs = [ "$target_out_dir/$target_name.bytecode.stamp" ] - _rebased_build_config = rebase_path(invoker.build_config, root_build_dir) + _rebased_turbine_build_config = + rebase_path(invoker.turbine_build_config, root_build_dir) + _rebased_javac_build_config = + rebase_path(invoker.javac_build_config, root_build_dir) + _rebased_targets_build_config = + rebase_path(invoker.targets_build_config, root_build_dir) args = [ "--depfile", rebase_path(depfile, root_build_dir), @@ -1798,24 +1885,20 @@ if (enable_java_templates) { rebase_path(outputs[0], root_build_dir), "--chromium-output-dir", rebase_path(root_build_dir, root_build_dir), - "--direct-classpath-jars=@FileArg($_rebased_build_config:interface_classpath)", - "--full-classpath-jars=@FileArg($_rebased_build_config:javac_full_interface_classpath)", - "--full-classpath-gn-targets=@FileArg($_rebased_build_config:javac_full_classpath_targets)", + "--direct-classpath-jars=@FileArg($_rebased_turbine_build_config:interface_classpath)", + "--full-classpath-jars=@FileArg($_rebased_javac_build_config:javac_full_interface_classpath)", + "--full-classpath-gn-targets=@FileArg($_rebased_targets_build_config:javac_full_classpath_targets)", ] if (defined(invoker.header_jar_path)) { _rebased_header_jar_path = rebase_path(invoker.header_jar_path, root_build_dir) args += [ "--direct-classpath-jars=$_rebased_header_jar_path" ] } - if (auto_add_missing_java_deps) { - args += [ "--auto-add-deps" ] - } if (android_static_analysis == "build_server") { args += [ "--use-build-server" ] } if (invoker.include_android_sdk) { - args += - [ "--sdk-classpath-jars=@FileArg($_rebased_build_config:sdk_jars)" ] + args += [ "--sdk-classpath-jars=@FileArg($_rebased_turbine_build_config:sdk_interface_jars)" ] } if (treat_warnings_as_errors) { args += [ "--warnings-as-errors" ] @@ -1833,13 +1916,14 @@ if (enable_java_templates) { depfile = "$target_gen_dir/$target_name.d" inputs = java_paths_for_inputs + [ - invoker.build_config, + invoker.manifest_build_config, invoker.input_manifest, _manifest_merger_jar_path, ] outputs = [ invoker.output_manifest ] - _rebased_build_config = rebase_path(invoker.build_config, root_build_dir) + _rebased_build_config = + rebase_path(invoker.manifest_build_config, root_build_dir) args = [ "--depfile", @@ -2514,21 +2598,27 @@ if (enable_java_templates) { script = "//build/android/gyp/unused_resources.py" depfile = "$target_gen_dir/${target_name}.d" _unused_resources_script = "$root_build_dir/bin/helper/unused_resources" - inputs = [ _unused_resources_script ] + java_paths_for_inputs + inputs = [ + _unused_resources_script, + invoker.build_config, + invoker.res_build_config, + ] + java_paths_for_inputs outputs = [ invoker.output_config ] if (!defined(deps)) { deps = [] } deps += [ "//build/android/unused_resources" ] _rebased_build_config = rebase_path(invoker.build_config, root_build_dir) + _rebased_res_build_config = + rebase_path(invoker.res_build_config, root_build_dir) args = [ "--script", rebase_path(_unused_resources_script, root_build_dir), "--output-config", rebase_path(invoker.output_config, root_build_dir), "--r-text-in=@FileArg($_rebased_build_config:rtxt_path)", - "--dependencies-res-zips=@FileArg($_rebased_build_config:dependency_zips)", - "--dependencies-res-zips=@FileArg($_rebased_build_config:dependency_zip_overlays)", + "--dependencies-res-zips=@FileArg($_rebased_res_build_config:dependency_zips)", + "--dependencies-res-zips=@FileArg($_rebased_res_build_config:dependency_zip_overlays)", "--depfile", rebase_path(depfile, root_build_dir), ] @@ -2713,7 +2803,6 @@ if (enable_java_templates) { } if (!_is_robolectric_apk) { _apksigner = "$android_sdk_build_tools/lib/apksigner.jar" - _zipalign = "$android_sdk_build_tools/zipalign" _keystore_path = android_keystore_path _keystore_name = android_keystore_name _keystore_password = android_keystore_password @@ -2726,14 +2815,11 @@ if (enable_java_templates) { _inputs += [ _apksigner, - _zipalign, _keystore_path, ] _args += [ "--apksigner-jar", rebase_path(_apksigner, root_build_dir), - "--zipalign-path", - rebase_path(_zipalign, root_build_dir), "--key-path", rebase_path(_keystore_path, root_build_dir), "--key-name", @@ -2998,11 +3084,8 @@ if (enable_java_templates) { } inputs += _java_srcjars } - inputs += invoker.source_files + [ - "$android_sdk/optional/android.test.base.jar", - "$android_sdk/optional/org.apache.http.legacy.jar", - _build_config, - ] + java_paths_for_inputs + + inputs += invoker.source_files + [ _build_config ] + java_paths_for_inputs if (invoker.source_files != []) { inputs += [ invoker.target_sources_file ] @@ -3507,6 +3590,13 @@ if (enable_java_templates) { _type == "java_library" || _type == "dist_jar" _build_device_jar = _type != "system_java_library" && _supports_android + if (_build_host_jar || _build_device_jar) { + _enable_bytecode_checks = + (!defined(invoker.enable_bytecode_checks) || + invoker.enable_bytecode_checks) && !_is_prebuilt && + android_static_analysis != "off" && !_skip_header_jar + } + _jacoco_instrument = use_jacoco_coverage && _chromium_code && _source_files != [] && _build_device_jar && (!defined(invoker.testonly) || !invoker.testonly) @@ -3561,8 +3651,12 @@ if (enable_java_templates) { # Skip "process device" step if the step would be just a copy. _processed_jar_path = invoker.jar_path } else if (_has_sources) { - # Filter directly in compile_java.py when no other processing is required. - _processed_jar_path = _javac_jar_path + if (defined(invoker.bytecode_rewriter_target)) { + _processed_jar_path = "$target_out_dir/$target_name.rewritten.jar" + } else { + # Filter directly in compile_java.py when no other processing is required. + _processed_jar_path = _javac_jar_path + } } if (_build_device_jar) { @@ -3764,6 +3858,11 @@ if (enable_java_templates) { is_prebuilt = _is_prebuilt if (defined(_dex_needs_classpath)) { dex_needs_classpath = _dex_needs_classpath + } else if (defined(invoker.bytecode_rewriter_target)) { + needs_full_javac_classpath = true + } + if (defined(_enable_bytecode_checks) && _enable_bytecode_checks) { + enable_bytecode_checks = _enable_bytecode_checks } # Specifically avoid passing in invoker.base_module_target as one of the @@ -3876,7 +3975,9 @@ if (enable_java_templates) { generate_r_java(_fake_rjava_target) { deps = [ ":$_build_config_target_name" ] + _java_assetres_deps + _non_java_deps - build_config = _build_config + _rtxt_build_config = + "$target_gen_dir/$_main_target_name.rtxt.build_config.json" + rtxt_build_config = _rtxt_build_config # Filepath has to be exactly this because compile_java looks for the # srcjar of srcjar_deps at this location $gen_dir/$target_name.srcjar @@ -3886,13 +3987,19 @@ if (enable_java_templates) { _srcjar_deps += [ ":$_fake_rjava_target" ] } + _javac_build_config = string_replace(_build_config, + ".build_config.json", + ".javac.build_config.json") + _turbine_build_config = string_replace(_build_config, + ".build_config.json", + ".turbine.build_config.json") + if (_kt_files != []) { _abs_kt_files = get_path_info(_kt_files, "abspath") _kt_allowlist = [ "*/AsyncTabParamsManagerImpl.kt", "//third_party/androidx/*", "*/webengine_shell_apk/*", - "local_modifications/pdf/java/androidx/pdf/viewer/fragment/PdfViewerFragment.kt", ] _found_kt = filter_exclude(_abs_kt_files, _kt_allowlist) assert( @@ -3909,7 +4016,7 @@ if (enable_java_templates) { output_jar_path = _kotlinc_jar_path output_interface_jar_path = _kotlin_interface_jar_path main_target_name = _main_target_name - build_config = _build_config + build_config = _javac_build_config srcjar_deps = _srcjar_deps source_files = _source_files target_sources_file = _target_sources_file @@ -3936,7 +4043,11 @@ if (enable_java_templates) { enable_errorprone = _enable_errorprone use_turbine = defined(invoker.use_turbine) && invoker.use_turbine - build_config = _build_config + if (use_turbine) { + build_config = _turbine_build_config + } else { + build_config = _javac_build_config + } if (_enable_errorprone) { source_files = _errorprone_source_files @@ -4048,7 +4159,7 @@ if (enable_java_templates) { assert(_build_host_jar || _build_device_jar, "A host or device jar must be created to use bytecode rewriting") - _rewritten_jar = "$target_out_dir/${target_name}_rewritten.jar" + _rewritten_jar = "$target_out_dir/${target_name}.rewritten.jar" _rewritten_jar_target_name = "${target_name}__rewritten" _rewriter_path = root_build_dir + "/bin/helper/" + get_label_info(invoker.bytecode_rewriter_target, "name") @@ -4080,9 +4191,9 @@ if (enable_java_templates) { [ invoker.bytecode_rewriter_target ] } - _unprocessed_jar_deps = [] - _unprocessed_jar_deps = [ ":$_rewritten_jar_target_name" ] + _unprocessed_jar_deps += [ ":$_rewritten_jar_target_name" ] _unprocessed_jar_path = _rewritten_jar + _process_jar_target_name = _rewritten_jar_target_name } if (_is_prebuilt) { @@ -4095,19 +4206,18 @@ if (enable_java_templates) { # ijar needs only _unprocessed_jar_deps, but this also needs to export # __header and __build_config targets from deps. - deps = _unprocessed_jar_deps + _java_header_deps + - [ ":$_build_config_target_name" ] + deps = _unprocessed_jar_deps + _java_header_deps } } if (_build_host_jar || _build_device_jar) { - _enable_bytecode_checks = !defined(invoker.enable_bytecode_checks) || - invoker.enable_bytecode_checks _enable_bytecode_checks = - _enable_bytecode_checks && !_is_prebuilt && + (!defined(invoker.enable_bytecode_checks) || + invoker.enable_bytecode_checks) && !_is_prebuilt && android_static_analysis != "off" && !_skip_header_jar if (_enable_bytecode_checks) { _validate_target_name = "${target_name}__validate" + check_for_missing_direct_deps(_validate_target_name) { forward_variables_from(invoker, [ "missing_classes_allowlist" ]) deps = _unprocessed_jar_deps + _header_classpath_deps + @@ -4126,7 +4236,11 @@ if (enable_java_templates) { target_label = get_label_info(":${invoker.target_name}", "label_no_toolchain") input_jar = _unprocessed_jar_path - build_config = _build_config + javac_build_config = _javac_build_config + turbine_build_config = _turbine_build_config + targets_build_config = string_replace(_build_config, + ".build_config.json", + ".targets.build_config.json") } } else { not_needed(invoker, [ "missing_classes_allowlist" ]) @@ -4257,8 +4371,8 @@ if (enable_java_templates) { # the sandbox), and to enumerate test methods. extra_classpath_jars = [ android_sdk_jar, - "$android_sdk/optional/android.test.base.jar", - "$android_sdk/optional/android.test.runner.jar", + "$android_sdk_platform_root/optional/android.test.base.jar", + "$android_sdk_platform_root/optional/android.test.runner.jar", ] } } @@ -4324,7 +4438,6 @@ if (enable_java_templates) { if (defined(invoker.deps)) { deps += invoker.deps } - public_deps += [ ":$_build_config_target_name" ] if (defined(invoker.public_deps)) { public_deps += invoker.public_deps } @@ -4458,12 +4571,11 @@ template("create_android_app_bundle_module") { _script = "//build/android/gyp/apkbuilder.py" # NOTE: Compared to the inputs of the "package_apk" template action, - # this list is much smaller, since finalize_apk is never called - # by apkbuild.py --format=bundle-module. This means not using - # apksigner and zipalign as well, nor the keystore. Other - # dependencies like extra native libraries are all pulled from the - # .build_config.json through @FileArg() references (see below) and - # will be listed in the generated depfile instead. + # this list is much smaller, since ApkSigner is never called + # by apkbuilder.py --format=bundle-module. Other dependencies like + # extra native libraries are all pulled from the .build_config.json + # through @FileArg() references (see below) and will be listed in the + # generated depfile instead. _inputs = [ invoker.build_config, invoker.app_bundle_build_config, @@ -4525,8 +4637,8 @@ template("create_android_app_bundle_module") { invoker.build_config, ] deps = [ - invoker.build_config_target, invoker.app_bundle_build_config_target, + invoker.build_config_target, ] outputs = [ _actual_file, diff --git a/naiveproxy/src/build/config/android/rules.gni b/naiveproxy/src/build/config/android/rules.gni index d176f828ca..727c3f7dac 100644 --- a/naiveproxy/src/build/config/android/rules.gni +++ b/naiveproxy/src/build/config/android/rules.gni @@ -1120,6 +1120,9 @@ if (!is_robolectric && enable_java_templates) { _main_class = "org.chromium.testing.local.JunitTestMain" _build_config = "$target_gen_dir/$target_name.build_config.json" + _res_build_config = "$target_gen_dir/$target_name.res.build_config.json" + _manifest_build_config = + "$target_gen_dir/$target_name.manifest.build_config.json" _build_config_target_name = "$target_name$build_config_target_suffix" _java_binary_target_name = "${target_name}__java_binary" @@ -1159,7 +1162,7 @@ if (!is_robolectric && enable_java_templates) { manifest_package = _package_name } output_manifest = _android_manifest - build_config = _build_config + manifest_build_config = _manifest_build_config min_sdk_version = default_min_sdk_version target_sdk_version = default_target_sdk_version deps = _non_java_deps + _java_assetres_deps + @@ -1175,7 +1178,7 @@ if (!is_robolectric && enable_java_templates) { deps = _non_java_deps + _java_assetres_deps + [ ":$_merge_manifest_target_name" ] build_config_dep = ":$_build_config_target_name" - build_config = _build_config + build_config = _res_build_config if (defined(_package_name)) { rename_manifest_package = _package_name } @@ -1561,10 +1564,10 @@ if (!is_robolectric && enable_java_templates) { "--output", rebase_path(_zip_jar_path, root_build_dir), "--no-compress", - "--input-zips=@FileArg($_rebased_build_config:dist_jar:jars)", + "--input-zips=@FileArg($_rebased_build_config:dist_classpath)", ] - _excludes = [] + _excludes = [ "module-info.class" ] if (defined(invoker.jar_excluded_patterns)) { _excludes += invoker.jar_excluded_patterns } @@ -1691,9 +1694,6 @@ if (!is_robolectric && enable_java_templates) { template("dist_aar") { forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) - _direct_deps_only = - defined(invoker.direct_deps_only) && invoker.direct_deps_only - _deps = [] if (defined(invoker.deps)) { @@ -1701,11 +1701,17 @@ if (!is_robolectric && enable_java_templates) { } _build_config = "$target_gen_dir/$target_name.build_config.json" + _res_build_config = "$target_gen_dir/$target_name.res.build_config.json" + _rtxt_build_config = "$target_gen_dir/$target_name.rtxt.build_config.json" _build_config_target_name = "$target_name$build_config_target_suffix" write_build_config(_build_config_target_name) { type = "dist_aar" - forward_variables_from(invoker, [ "proguard_configs" ]) + forward_variables_from(invoker, + [ + "direct_deps_only", + "proguard_configs", + ]) possible_config_deps = _deps supports_android = true requires_android = true @@ -1715,6 +1721,8 @@ if (!is_robolectric && enable_java_templates) { _deps += [ ":$_build_config_target_name" ] _rebased_build_config = rebase_path(_build_config, root_build_dir) + _rebased_res_build_config = rebase_path(_res_build_config, root_build_dir) + _rebased_rtxt_build_config = rebase_path(_rtxt_build_config, root_build_dir) action_with_pydeps(target_name) { forward_variables_from(invoker, @@ -1726,7 +1734,11 @@ if (!is_robolectric && enable_java_templates) { deps = _deps script = "//build/android/gyp/dist_aar.py" - inputs = [ _build_config ] + inputs = [ + _build_config, + _res_build_config, + _rtxt_build_config, + ] # Although these will be listed as deps in the depfile, they must also # appear here so that "gn analyze" knows about them. @@ -1742,17 +1754,12 @@ if (!is_robolectric && enable_java_templates) { rebase_path(depfile, root_build_dir), "--output", rebase_path(invoker.output, root_build_dir), - "--dependencies-res-zips=@FileArg($_rebased_build_config:dependency_zips)", - "--dependencies-res-zips=@FileArg($_rebased_build_config:dependency_zip_overlays)", - "--r-text-files=@FileArg($_rebased_build_config:dependency_rtxt_files)", + "--dependencies-res-zips=@FileArg($_rebased_res_build_config:dependency_zips)", + "--dependencies-res-zips=@FileArg($_rebased_res_build_config:dependency_zip_overlays)", + "--r-text-files=@FileArg($_rebased_rtxt_build_config:dependency_rtxt_files)", "--proguard-configs=@FileArg($_rebased_build_config:proguard_all_configs)", + "--jars=@FileArg($_rebased_build_config:dist_classpath)", ] - if (_direct_deps_only) { - args += [ "--jars=@FileArg($_rebased_build_config:classpath)" ] - } else { - args += - [ "--jars=@FileArg($_rebased_build_config:processed_classpath)" ] - } if (defined(invoker.android_manifest)) { args += [ @@ -1847,6 +1854,13 @@ if (!is_robolectric && enable_java_templates) { "*/R\$*.class", ] } + + if ((defined(force_java_location_rewrite) && + force_java_location_rewrite) || enable_java_location_rewrite) { + assert(!defined(invoker.bytecode_rewriter_target)) + bytecode_rewriter_target = + "//build/android/location_rewriter:location_rewriter" + } } } @@ -1984,6 +1998,9 @@ if (!is_robolectric && enable_java_templates) { "_APK_ASSETS_SUFFIX=${invoker.apk_assets_suffix}", ] } + if (defined(invoker.proguard_enabled) && invoker.proguard_enabled) { + defines += [ "_IS_PROGUARD_ENABLED" ] + } _test_only = defined(testonly) && testonly if (_test_only) { @@ -2169,6 +2186,9 @@ if (!is_robolectric && enable_java_templates) { _template_name = target_name _base_path = "$target_out_dir/$target_name/$target_name" _build_config = "$target_gen_dir/$target_name.build_config.json" + _res_build_config = "$target_gen_dir/$target_name.res.build_config.json" + _manifest_build_config = + "$target_gen_dir/$target_name.manifest.build_config.json" _build_config_target = "$target_name$build_config_target_suffix" _java_target_name = "${_template_name}__java" @@ -2362,7 +2382,7 @@ if (!is_robolectric && enable_java_templates) { ]) input_manifest = invoker.android_manifest output_manifest = _android_manifest - build_config = _build_config + manifest_build_config = _manifest_build_config min_sdk_version = _min_sdk_version target_sdk_version = _target_sdk_version @@ -2467,7 +2487,7 @@ if (!is_robolectric && enable_java_templates) { size_info_path = _res_size_info_path proguard_file = _generated_proguard_config - build_config = _build_config + build_config = _res_build_config build_config_dep = ":$_build_config_target" deps = _java_assetres_deps + _non_java_deps @@ -2481,7 +2501,10 @@ if (!is_robolectric && enable_java_templates) { # So that test resources can references under_test resources via # @type/name syntax. r_java_root_package_name = "test" - arsc_package_name = "@FileArg($_rebased_build_config:arsc_package_name)" + _rebased_res_build_config = + rebase_path(_res_build_config, root_build_dir) + arsc_package_name = + "@FileArg($_rebased_res_build_config:arsc_package_name)" # Passing in the --emit-ids mapping will cause aapt2 to assign resources # IDs that do not conflict with those from apk_under_test. @@ -2720,6 +2743,7 @@ if (!is_robolectric && enable_java_templates) { [ "disable_strict_mode_context", "isolated_splits_enabled", + "proguard_enabled", ]) assertions_implicitly_enabled = _assertions_implicitly_enabled is_incremental_install = _incremental_apk @@ -2779,6 +2803,7 @@ if (!is_robolectric && enable_java_templates) { "apk_under_test", "asset_deps", "base_module_target", + "bytecode_rewriter_target", "chromium_code", "deps", "jacoco_never_instrument", @@ -2911,6 +2936,11 @@ if (!is_robolectric && enable_java_templates) { deps += [ ":$_compile_resources_target" ] proguard_mapping_path = _proguard_mapping_path + if (!defined(enable_proguard_checks) && defined(testonly) && testonly) { + # Ignore -checkdiscard and -checkenumunboxed failures. + enable_proguard_checks = false + } + # Must not be set via write_build_config, because that will cause it # to be picked up by test apks that use apk_under_test. if (!_assertions_implicitly_enabled && !enable_java_asserts && @@ -2958,6 +2988,7 @@ if (!is_robolectric && enable_java_templates) { ":$_final_dex_target_name", ] build_config = _build_config + res_build_config = _res_build_config if (_proguard_enabled) { proguard_mapping_path = _proguard_mapping_path } @@ -3198,7 +3229,7 @@ if (!is_robolectric && enable_java_templates) { _static_library_apk_path, ] } - data = [] + data = [ _generated_script ] data_deps = [ "//build/android:apk_operations_py", "//build/android:stack_tools", @@ -3334,6 +3365,7 @@ if (!is_robolectric && enable_java_templates) { "asset_deps", "build_config_include_product_version_resource", "bundles_supported", + "bytecode_rewriter_target", "chromium_code", "command_line_flags_file", "create_apk_script", @@ -3795,7 +3827,6 @@ if (!is_robolectric && enable_java_templates) { if (defined(invoker.proguard_configs)) { proguard_configs += invoker.proguard_configs } - enable_proguard_checks = false if (defined(invoker.final_apk_path)) { _final_apk_path = invoker.final_apk_path } else { @@ -3889,9 +3920,12 @@ if (!is_robolectric && enable_java_templates) { # as otherwise _use_native_activity and _android_manifest would not be used. assert(_use_native_activity != "" && _android_manifest != "") + # allow_cleartext_traffic only works with the default manifest. + _allow_cleartext_traffic = defined(invoker.allow_cleartext_traffic) && + invoker.allow_cleartext_traffic + assert(!defined(invoker.android_manifest) || !_allow_cleartext_traffic) + if (!defined(invoker.android_manifest)) { - _allow_cleartext_traffic = defined(invoker.allow_cleartext_traffic) && - invoker.allow_cleartext_traffic jinja_template("${target_name}_manifest") { _native_library_name = get_label_info(invoker.shared_library, "name") if (defined(invoker.android_manifest_template)) { @@ -3915,17 +3949,11 @@ if (!is_robolectric && enable_java_templates) { forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY) create_apk_script = false - if (!defined(apk_name)) { - apk_name = get_label_info(invoker.shared_library, "name") - } - if (!defined(android_manifest)) { android_manifest_dep = ":${target_name}_manifest" android_manifest = _android_manifest } - final_apk_path = "$root_build_dir/${apk_name}_apk/${apk_name}-debug.apk" - if (!defined(use_default_launcher) || use_default_launcher) { deps += [ "//build/android/gtest_apk:native_test_instrumentation_test_runner_java", @@ -3937,6 +3965,9 @@ if (!is_robolectric && enable_java_templates) { ":${target_name}__secondary_abi_shared_library_list", ":${target_name}__shared_library_list", ] + if (_allow_cleartext_traffic) { + deps += [ "//testing/android/native_test:cleartext_traffic_resources" ] + } } } @@ -3990,9 +4021,11 @@ if (!is_robolectric && enable_java_templates) { depfile = "$target_gen_dir/$target_name.d" sources = invoker.sources + # Use public SDK to ensure LGPL-licensed code can be built without the + # internal SDK. + _aidl_path = "${public_android_sdk_build_tools}/aidl" + _framework_aidl = "$public_android_sdk_platform_root/framework.aidl" _srcjar_path = "${target_gen_dir}/${target_name}.srcjar" - _aidl_path = "${android_sdk_build_tools}/aidl" - _framework_aidl = "$android_sdk/framework.aidl" _imports = [ _framework_aidl ] if (defined(invoker.interface_file)) { assert(invoker.interface_file != "") @@ -4059,6 +4092,10 @@ if (!is_robolectric && enable_java_templates) { "//third_party/android_sdk:libbinder_include", ":$_aidl_config", ] + + # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and + # enable the diagnostic by removing this line. + configs += [ "//build/config/compiler:no_exit_time_destructors" ] } } } @@ -4637,9 +4674,6 @@ if (!is_robolectric && enable_java_templates) { # # proguard_enable_obfuscation: Whether to enable obfuscation (default=true) # - # proguard_android_sdk_dep: Optional. android_system_java_prebuilt() target - # used as a library jar for synchronized proguarding. - # # system_image_locale_allowlist: List of locales that should be included # on system APKs generated from this bundle. # @@ -4709,7 +4743,7 @@ if (!is_robolectric && enable_java_templates) { _base_target_gen_dir = get_label_info(invoker.base_module_target, "target_gen_dir") _base_module_build_config = - "$_base_target_gen_dir/${_base_target_name}.build_config.json" + "$_base_target_gen_dir/$_base_target_name.build_config.json" _base_module_build_config_target = "${invoker.base_module_target}$build_config_target_suffix" _rebased_base_module_build_config = @@ -4776,11 +4810,6 @@ if (!is_robolectric && enable_java_templates) { _build_config = "$target_gen_dir/${_target_name}.build_config.json" _rebased_build_config = rebase_path(_build_config, root_build_dir) - if (defined(invoker.proguard_android_sdk_dep)) { - _android_sdk_dep = invoker.proguard_android_sdk_dep - } else { - _android_sdk_dep = default_android_sdk_dep - } if (_proguard_enabled) { _proguard_mapping_path = "${_bundle_path}.mapping" @@ -4798,7 +4827,7 @@ if (!is_robolectric && enable_java_templates) { _build_config_target = ":$_build_config_target_name" write_build_config(_build_config_target_name) { type = "android_app_bundle" - possible_config_deps = _module_targets + [ _android_sdk_dep ] + possible_config_deps = _module_targets build_config = _build_config proguard_enabled = _proguard_enabled enable_lint = _enable_lint @@ -4986,6 +5015,8 @@ if (!is_robolectric && enable_java_templates) { deps = _all_module_unused_resources_deps all_module_build_configs = _all_module_build_configs build_config = _base_module_build_config + res_build_config = + "$_base_target_gen_dir/$_base_target_name.res.build_config.json" if (_proguard_enabled) { proguard_mapping_path = _proguard_mapping_path } diff --git a/naiveproxy/src/build/config/android/test/resource_overlay/BUILD.gn b/naiveproxy/src/build/config/android/test/resource_overlay/BUILD.gn index 3b7936384c..dbcb342b0f 100644 --- a/naiveproxy/src/build/config/android/test/resource_overlay/BUILD.gn +++ b/naiveproxy/src/build/config/android/test/resource_overlay/BUILD.gn @@ -43,6 +43,19 @@ test_resources("root_tagged_root_resources") { deps = [ ":root_tagged_dependency_resources" ] } +test_resources("both_tagged_dependency_resources") { + resource_overlay = true + resource_name = "resource_overlay_both_tagged_secret" + resource_value = 41 +} + +test_resources("both_tagged_root_resources") { + resource_overlay = true + resource_name = "resource_overlay_both_tagged_secret" + resource_value = 42 + deps = [ ":both_tagged_dependency_resources" ] +} + android_library("unit_device_javatests") { testonly = true sources = [ @@ -50,6 +63,7 @@ android_library("unit_device_javatests") { ] resources_package = "org.chromium.build.resource_overlay" deps = [ + ":both_tagged_root_resources", ":dependency_tagged_root_resources", ":root_tagged_root_resources", "//base:base_java_test_support", diff --git a/naiveproxy/src/build/config/apple/apple_sdk.gni b/naiveproxy/src/build/config/apple/apple_sdk.gni new file mode 100644 index 0000000000..55d55e261c --- /dev/null +++ b/naiveproxy/src/build/config/apple/apple_sdk.gni @@ -0,0 +1,20 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +if (is_ios) { + import("//build/config/ios/ios_sdk.gni") + sdk_path = ios_sdk_path + use_xcode_symlinks = ios_use_xcode_symlinks +} else if (is_mac) { + import("//build/config/mac/mac_sdk.gni") + sdk_path = mac_sdk_path + use_xcode_symlinks = mac_use_xcode_symlinks +} else { + use_xcode_symlinks = false +} + +if (is_apple) { + frameworks_dir = "${sdk_path}/System/Library/Frameworks" + sysroot_include_dir = "${sdk_path}/usr/include" +} diff --git a/naiveproxy/src/build/config/apple/arch.gni b/naiveproxy/src/build/config/apple/arch.gni new file mode 100644 index 0000000000..9033808e17 --- /dev/null +++ b/naiveproxy/src/build/config/apple/arch.gni @@ -0,0 +1,43 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This scope allows mapping configuration from target_os and target_cpu +# to the architecture as understood by the different tools (compiler, +# dsymutil, ...). +# +# The mapping is defined as a scope to allow using it in the definition +# of toolchains (as all toolchains are evaluated in the context of the +# default_toolchain, and the variables such as current_os or current_cpu +# are not set to the default value of target_os or target_cpu). + +archs_mapping = { + ios = { + arm64 = { + clang_arch = "arm64" + dsym_arch = "aarch64" + } + + arm64e = { + clang_arch = "arm64e" + dsym_arch = "arm64e" + } + + x64 = { + clang_arch = "x86_64" + dsym_arch = "x86_64" + } + } + + mac = { + arm64 = { + clang_arch = "arm64" + dsym_arch = "aarch64" + } + + x64 = { + clang_arch = "x86_64" + dsym_arch = "x86_64" + } + } +} diff --git a/naiveproxy/src/build/config/apple/codesign.py b/naiveproxy/src/build/config/apple/codesign.py index 84a1a57543..bb09bc4935 100644 --- a/naiveproxy/src/build/config/apple/codesign.py +++ b/naiveproxy/src/build/config/apple/codesign.py @@ -11,6 +11,7 @@ import glob import json import os import plistlib +import re import shutil import subprocess import stat @@ -28,6 +29,16 @@ BANNED_KEYS = [ "com.apple.developer.web-browser-engine.webcontent", ] +# Patterns for bundle extension per bundle type. +# Note: "ExtensionIcon83.5x83.5@2x.png" is one of the generated icon filename +# thus this pattern need to match decimal sized icons. +ICON_SUFFIX_PATTERN = '(\\d+(?:\\.\\d+)?)x\\1(@[23]x)?(~ipad)?\\.png' +BUNDLE_ICON_PATTERNS_MAP = { + ".app": re.compile('AppIcon' + ICON_SUFFIX_PATTERN), + ".appex": re.compile('ExtensionIcon' + ICON_SUFFIX_PATTERN), +} + + if sys.version_info.major < 3: basestring_compat = basestring else: @@ -173,6 +184,18 @@ class Bundle(object): def signature_dir(self): return os.path.join(self.contents_dir, '_CodeSignature') + @property + def relative_signature_dir(self): + return os.path.relpath(self.signature_dir, self.path) + + @property + def embedded_mobileprovision(self): + return os.path.join(self.path, 'embedded.mobileprovision') + + @property + def relative_embedded_mobileprovision(self): + return os.path.relpath(self.embedded_mobileprovision, self.path) + @property def identifier(self): return self._data['CFBundleIdentifier'] @@ -386,6 +409,123 @@ def CodeSignBundle(bundle_path, identity, extra_args): sys.stderr.write('\n') +def IsSubPath(path, parent_path): + """Returns whether path is a sub-path of parent_path.""" + return path.startswith(parent_path + os.path.sep) + + +def DeleteItemAtPath(path): + """Delete item at path. + + Support being called with a path pointing to a file, a symlink or a + directory, calling the correct function for each situation. + """ + if os.path.isdir(path): + if not os.path.islink(path): + shutil.rmtree(path) + return + os.unlink(path) + + +def VerifyBundleManifest(bundle, manifest): + """Verify that bundle corresponds to manifest. + + If non-empty, then manifest is a list of all the files that should be present + in the bundle (including the code signature that will be generated by this + script). + + Does nothing if the manifest is empty. Otherwise, delete all files found in + the bundle directory that are not listed in the manifest and terminate with + an error if any files listed in the manifest is missing. + """ + if not manifest: + return + + # Ignore the files and directories created by the script when codesigning. + # They will be listed in the manifest, but will be created after checking + # the validity of the bundle. + patterns = [ + lambda p: p == bundle.relative_embedded_mobileprovision, + lambda p: IsSubPath(p, bundle.relative_signature_dir), + ] + filtered = lambda path: any(map(lambda pattern: pattern(path), patterns)) + manifest = set(path for path in manifest if not filtered(path)) + + # Create a set of all directories in the manifest. Used to avoid doing + # a linear scan of all files when a directory is found that may not be + # present in the bundle (as that would cause the script to have O(n^2) + # behaviour, since this check would happen for all directories). + # + # Note: since manifest only list files and maybe some directories that + # should be considered as files (see comments below when processing + # dirnames), it is required to iterate over all parent directories here. + # + # E.g if the manifest contains the following: + # 'Foo' + # 'data/test/files/file1' + # 'data/test/files/file2' + # 'data/test/files/file3' + # + # then manifest_directories should contain the following + # 'data' + # 'data/test' + # 'data/test/files' + manifest_directories = set() + for path in manifest: + dirname = os.path.dirname(path) + while dirname and dirname not in manifest_directories: + manifest_directories.add(dirname) + dirname = os.path.dirname(dirname) + + # The bundle may contain a set of icons which will not be listed in the + # manifest (this is because they are conditionally based on the sources + # passed to the build/toolchain/apple/compile_xcassets.py script). Skip + # them if present. + bundle_icon_pattern = BUNDLE_ICON_PATTERNS_MAP.get( + os.path.splitext(bundle.path)[-1], None) + + # Iterate over the content of the bundle. + for dirpath, dirnames, filenames in os.walk(bundle.path): + reldirpath = os.path.relpath(dirpath, bundle.path) + + # For directories, if they are listed explicitly in the manifest (and + # not individual files), then skip them. This is necessary due to how + # embedded frameworks work (there is a single bundle_data(...) target + # that list the top-level bundle directory as the only source file). + dirnames_to_skip = [] + for dirname in dirnames: + subdirpath = os.path.normpath(os.path.join(reldirpath, dirname)) + if subdirpath in manifest: + dirnames_to_skip.append(dirname) + manifest.remove(subdirpath) + elif subdirpath not in manifest_directories: + dirnames_to_skip.append(dirname) + print(f'warning: deleting old directory: {subdirpath}', file=sys.stderr) + DeleteItemAtPath(os.path.join(dirpath, dirname)) + if dirnames_to_skip: + dirnames[:] = list(set(dirnames) - set(dirnames_to_skip)) + + # For files, if they are not listed by the manifest, delete them and + # print a warning (this is not an error because they may be left-over + # from an incremental build after changing the target dependencies). + for filename in filenames: + filepath = os.path.normpath(os.path.join(reldirpath, filename)) + if not filepath in manifest: + if not bundle_icon_pattern or not bundle_icon_pattern.match(filename): + print(f'warning: deleting old file: {filepath}', file=sys.stderr) + DeleteItemAtPath(os.path.join(dirpath, filename)) + else: + manifest.remove(filepath) + + # At this point, any files still listed in manifest is missing from the + # bundle, so report this as an error and terminate the script with error. + if manifest: + print(f'error: {len(manifest)} missing files:', file=sys.stderr) + for filepath in sorted(manifest): + print(f' - {filepath}', file=sys.stderr) + sys.exit(1) + + def InstallSystemFramework(framework_path, bundle_path, args): """Install framework from |framework_path| to |bundle| and code-re-sign it.""" installed_framework_path = os.path.join( @@ -518,6 +658,16 @@ class CodeSignBundleAction(Action): help='path to a file containing a list of mobileprovision files to ' + 'use (this will behave as each "-m $line" was passsed for each line ' + 'in that file)') + parser.add_argument( + '--manifest', + '-L', + default=[], + action=FileListAction, + dest='manifest', + help='if present, path to a file containing the list of files that ' + + 'are part of the bundle to codesign. The script will delete any ' + + 'files found that are not listed, and will fail if any files is ' + + 'missing.') parser.set_defaults(no_signature=False) @staticmethod @@ -565,8 +715,7 @@ class CodeSignBundleAction(Action): sys.exit(1) # Delete existing embedded mobile provisioning. - embedded_provisioning_profile = os.path.join( - bundle.path, 'embedded.mobileprovision') + embedded_provisioning_profile = bundle.embedded_mobileprovision if os.path.isfile(embedded_provisioning_profile): os.unlink(embedded_provisioning_profile) @@ -583,11 +732,17 @@ class CodeSignBundleAction(Action): os.makedirs(bundle.executable_dir) shutil.copy(args.binary, bundle.binary_path) + # Record the symlinks created (they are likely not listed in the + # manifest, but must not be deleted). + created_symlinks = [] + if bundle.kind == 'mac_framework': # Create Versions/Current -> Versions/A symlink + created_symlinks.append('Versions/Current') CreateSymlink('A', os.path.join(bundle.path, 'Versions/Current')) # Create $binary_name -> Versions/Current/$binary_name symlink + created_symlinks.append(bundle.binary_name) CreateSymlink(os.path.join('Versions/Current', bundle.binary_name), os.path.join(bundle.path, bundle.binary_name)) @@ -595,6 +750,7 @@ class CodeSignBundleAction(Action): for name in ('Headers', 'Resources', 'Modules'): target = os.path.join(bundle.path, 'Versions/A', name) if os.path.exists(target): + created_symlinks.append(name) CreateSymlink(os.path.join('Versions/Current', name), os.path.join(bundle.path, name)) else: @@ -602,6 +758,13 @@ class CodeSignBundleAction(Action): if os.path.exists(obsolete_path): os.unlink(obsolete_path) + # If the manifest is present, check that the bundle is well-formed. Only + # perform this verification if requested, but in that case, consider all + # the created symlinks as part of the manifest (since they are generated + # conditionally, it is difficult to explicit list them all). + if args.manifest: + VerifyBundleManifest(bundle, set(args.manifest) | set(created_symlinks)) + if args.no_signature: return diff --git a/naiveproxy/src/build/config/apple/create_signed_bundle.gni b/naiveproxy/src/build/config/apple/create_signed_bundle.gni index c2325afa8c..3f31a1b096 100644 --- a/naiveproxy/src/build/config/apple/create_signed_bundle.gni +++ b/naiveproxy/src/build/config/apple/create_signed_bundle.gni @@ -94,7 +94,7 @@ apple_mobile_xcode_xcuitest_bundle_id = # test target. # # xcode_product_bundle_id: -# (optional) string, the bundle ID that will be added in the XCode +# (optional) string, the bundle ID that will be added in the Xcode # attributes to enable some features when debugging (e.g. MetricKit). # # primary_info_plist: @@ -271,6 +271,7 @@ template("apple_mobile_create_signed_bundle") { } post_processing_script = "//build/config/apple/codesign.py" + post_processing_manifest = "$target_out_dir/$_target_name.manifest" post_processing_sources = [ _bundle_binary_path ] if (_enable_entitlements) { if (defined(invoker.entitlements_target)) { @@ -294,15 +295,6 @@ template("apple_mobile_create_signed_bundle") { "$bundle_root_dir/Versions/Current", "$bundle_root_dir/$_output_name", ] - - if (defined(invoker.has_public_headers) && invoker.has_public_headers) { - post_processing_outputs += [ - "$bundle_root_dir/Headers", - "$bundle_root_dir/Modules", - ] - } - } else { - not_needed(invoker, [ "has_public_headers" ]) } } @@ -319,6 +311,7 @@ template("apple_mobile_create_signed_bundle") { "-i=" + ios_code_signing_identity, "-b=" + rebase_path(_bundle_binary_path, root_build_dir), "-M=" + rebase_path(ios_mobileprovision_files_filelist, root_build_dir), + "-L=" + rebase_path(post_processing_manifest, root_build_dir), ] post_processing_sources += ios_mobileprovision_files post_processing_sources += [ ios_mobileprovision_files_filelist ] diff --git a/naiveproxy/src/build/config/apple/sdk_info.py b/naiveproxy/src/build/config/apple/sdk_info.py index bbadc12473..88f9cd680f 100755 --- a/naiveproxy/src/build/config/apple/sdk_info.py +++ b/naiveproxy/src/build/config/apple/sdk_info.py @@ -60,8 +60,10 @@ def FillXcodeVersion(settings, developer_dir): lines = subprocess.check_output(['xcodebuild', '-version']).decode('UTF-8').splitlines() - settings['xcode_version'] = FormatVersion(lines[0].split()[-1]) + version_verbatim = lines[0].split()[-1] + settings['xcode_version'] = FormatVersion(version_verbatim) settings['xcode_version_int'] = int(settings['xcode_version'], 10) + settings['xcode_version_verbatim'] = version_verbatim settings['xcode_build'] = lines[-1].split()[-1] diff --git a/naiveproxy/src/build/config/avx512.gni b/naiveproxy/src/build/config/avx512.gni new file mode 100644 index 0000000000..f01f5b6b8d --- /dev/null +++ b/naiveproxy/src/build/config/avx512.gni @@ -0,0 +1,9 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +declare_args() { + # The popular debugging tool pernosco (pernos.co) can't handle avx512 + # instructions. Overriding this flag to `false` will suppress them. + allow_avx512 = true +} diff --git a/naiveproxy/src/build/config/buildflags_paint_preview.gni b/naiveproxy/src/build/config/buildflags_paint_preview.gni index f5eabf49ae..7f75552815 100644 --- a/naiveproxy/src/build/config/buildflags_paint_preview.gni +++ b/naiveproxy/src/build/config/buildflags_paint_preview.gni @@ -3,7 +3,6 @@ # found in the LICENSE file. import("//build/config/cast.gni") -import("//build/config/features.gni") declare_args() { # Enable basic paint preview support. Does not work on iOS. Should diff --git a/naiveproxy/src/build/config/c++/BUILD.gn b/naiveproxy/src/build/config/c++/BUILD.gn index 10bc70f5ab..9a555bd2ed 100644 --- a/naiveproxy/src/build/config/c++/BUILD.gn +++ b/naiveproxy/src/build/config/c++/BUILD.gn @@ -105,6 +105,20 @@ config("runtime_library") { } } + if (is_ios) { + # Add the path to our custom libc++ to the swift compiler. This is used when + # enabling the C++/Swift interoperability. + swiftflags = [ + "-Xcc=-nostdinc++", + "-isystem", + rebase_path("//third_party/libc++/src/include", root_build_dir), + "-isystem", + rebase_path("//third_party/libc++abi/src/include", root_build_dir), + "-I", + rebase_path("//buildtools/third_party/libc++", root_build_dir), + ] + } + # In a world without NaCl, the `runtime_library` config would also configure # the `_LIBCPP_ENABLE_ASSERTIONS` define to enable hardening when using the # custom hermetic libc++. However, this is currently added by the `compiler` diff --git a/naiveproxy/src/build/config/c++/c++.gni b/naiveproxy/src/build/config/c++/c++.gni index d559d2adee..1d1d93f8ea 100644 --- a/naiveproxy/src/build/config/c++/c++.gni +++ b/naiveproxy/src/build/config/c++/c++.gni @@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/clang/clang.gni") import("//build/config/sanitizers/sanitizers.gni") import("//build/toolchain/rbe.gni") import("//build_overrides/build.gni") @@ -99,19 +100,43 @@ if (is_android && export_libcxxabi_from_executables) { } if (use_clang_modules) { - libcxx_prefix = "${root_gen_dir}/third_party/libc++/src" - libcxx_modulemap_in = + libcxx_prefix = "${root_build_dir}/gen/third_party/libc++/src" + libcxx_modulemap = read_file("//third_party/libc++/src/include/module.modulemap.in", "string") - libcxx_modulemap_out = string_replace(libcxx_modulemap_in, - "@LIBCXX_CONFIG_SITE_MODULE_ENTRY@", - "textual header \"__config_site\"") - write_file("${libcxx_prefix}/include/module.modulemap", libcxx_modulemap_out) + libcxx_modulemap = string_replace(libcxx_modulemap, + "@LIBCXX_CONFIG_SITE_MODULE_ENTRY@", + "textual header \"__config_site\"") + + # vcruntime_exception.h is where std::bad_alloc is declared on windows, for + # example. Thus, it needs to be re-exported from the standard library. + # Since it's used in multiple places and has #pragma once it can't be textual. + # Note: Clang doesn't complain when you attempt to export a nonexistent + # module, so this still works fine on non-windows platforms. + libcxx_modulemap = + string_replace(libcxx_modulemap, + "header \"__exception/exception.h\"", + "header \"__exception/exception.h\"" + + " export sys_stage1.vcruntime_exception_h") + libcxx_modulemap = string_replace(libcxx_modulemap, + "header \"__new/align_val_t.h\"", + "header \"__new/align_val_t.h\"" + + " export sys_stage1.vcruntime_new_h") + libcxx_modulemap = + string_replace(libcxx_modulemap, + "header \"__new/exceptions.h\"", + "header \"__new/exceptions.h\"" + + " export sys_stage1.vcruntime_exception_h") + libcxx_modulemap = + string_replace(libcxx_modulemap, + "header \"__new/new_handler.h\"", + "header \"__new/new_handler.h\" export sys_stage1.new_h") + + write_file("${libcxx_prefix}/include/module.modulemap", libcxx_modulemap) } else { libcxx_prefix = "//third_party/libc++/src" } libcxxabi_prefix = "//third_party/libc++abi/src" -libcxx_module_prefix = "$root_gen_dir/libcxx" assert(!(is_ios && libcxx_is_shared), "Can't build libc++ as a shared library on iOS.") diff --git a/naiveproxy/src/build/config/c++/libc++.natvis b/naiveproxy/src/build/config/c++/libc++.natvis index 504743fd7d..9026f14549 100644 --- a/naiveproxy/src/build/config/c++/libc++.natvis +++ b/naiveproxy/src/build/config/c++/libc++.natvis @@ -2,28 +2,6 @@ - - - {__value_} - - __value_ - - - - {*($T1*)this} - - *($T1*)this - - - {{ size={$T2} }} @@ -34,6 +12,14 @@ + + + {value()} + + value() + + + + + + + + + + + + + - - - - - {*(char**)this} - {(char*)this} - *(char**)this - (char*)this - - ((size_t*)this)[1] - *(((char*)this) + 3*sizeof(size_t) - 1) - - ((size_t*)this)[2] & (~((size_t)0) >> 1) - - 22 - - ((size_t*)this)[1] - - *(((char*)this) + 3*sizeof(size_t) - 1) - - *(char**)this - (char*)this - - - + {data(),[size()]s} (data after NUL exists) + {data(),[size()]su} (data after NUL exists) + {data(),[size()]s} + {data(),[size()]su} + + data(),[size()] - - - {*(wchar_t**)this} - {(wchar_t*)this} - *(wchar_t**)this - (wchar_t*)this - ((size_t*)this)[1] - *(((char*)this) + 3*sizeof(size_t) - 1) - - ((size_t*)this)[2] & (~((size_t)0) >> 1) - - 10 + size() + long_cap() + short_cap() + data() - ((size_t*)this)[1] - - *(((char*)this) + 3*sizeof(size_t) - 1) - - *(wchar_t**)this - (wchar_t*)this + size() + data() + + + + + + + + + p + + p += (is_wide() ? wcslen(p) : strlen(p)) + 1 + + + + @@ -171,14 +138,14 @@ - + {{ size={size()} }} size() size() - ((__node_pointer)&__tree_.__pair1_)->__left_ + ((__node_pointer)&__tree_.__end_node_)->__left_ ((std::__Cr::map<$T1,$T2,$T3,$T4>::__node_pointer)this) @@ -190,21 +157,21 @@ ((std::__Cr::map<$T1,$T2,$T3,$T4>::__node_pointer)this) - ->__value_.__cc_ + ->__value_ - + {{ size={size()} }} size() size() - ((__node_pointer)&__tree_.__pair1_)->__left_ + ((__node_pointer)&__tree_.__end_node_)->__left_ ((std::__Cr::multimap<$T1,$T2,$T3,$T4>::__node_pointer)this) @@ -216,21 +183,21 @@ ((std::__Cr::multimap<$T1,$T2,$T3,$T4>::__node_pointer)this) - ->__value_.__cc_ + ->__value_ - + {{ size={size()} }} size() size() - ((__base::__node_pointer)&__tree_.__pair1_)->__left_ + ((__base::__node_pointer)&__tree_.__end_node_)->__left_ ((std::__Cr::multiset<$T1,$T2,$T3>::__base::__node_pointer)this) @@ -329,6 +296,14 @@ + + {first}, {second} + + first + second + + + {c} @@ -338,14 +313,14 @@ - + {{ size={size()} }} size() size() - ((__base::__node_pointer)&__tree_.__pair1_)->__left_ + ((__base::__node_pointer)&__tree_.__end_node_)->__left_ ((std::__Cr::set<$T1,$T2,$T3>::__base::__node_pointer)this) @@ -460,46 +435,53 @@ - + - - - - + + + {{ size={size()} }} + size() bucket_count() - - bucket_count() != 0 ? (float)size() / bucket_count() : 0.f - *(float*)&__table_.__p3_ - - - + bucket_count() != 0 ? (float)size() / bucket_count() : 0.f + max_load_factor() + size() - - (*(__table::__node_pointer*)&node)->__value_ - node = node->__next_ - - + __table_.__first_node_.__next_ + __next_ + ((std::__Cr::__hash_node<std::__Cr::__hash_value_type<$T1,$T2>,void *> *)this)->__value_ + + + + + + + + {{ size={size()} }} + + size() + bucket_count() + bucket_count() != 0 ? (float)size() / bucket_count() : 0.f + max_load_factor() + + size() + __table_.__first_node_.__next_ + __next_ + ((std::__Cr::__hash_node<$T1,void *> *)this)->__value_ + + + + - {__cc} + {__cc_} - __cc + __cc_ diff --git a/naiveproxy/src/build/config/c++/modules.gni b/naiveproxy/src/build/config/c++/modules.gni index 0350c5ec60..3c32affd14 100644 --- a/naiveproxy/src/build/config/c++/modules.gni +++ b/naiveproxy/src/build/config/c++/modules.gni @@ -2,44 +2,79 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/apple/apple_sdk.gni") import("//build/config/clang/clang.gni") -if (is_ios) { - import("//build/config/ios/ios_sdk.gni") - sdk_path = ios_sdk_path +declare_args() { + # Set to true when being run by build/modules/modularize.py + running_modularize = false + + # It's a nontrivial switch, with differing APIs, so it's somewhat difficult + # to migrate over one platform at a time. + # In general, this should be true unless we have specifically supported + # a platform with manual modules and are in the process of migrating. + # Eg. linux arm64 and windows were never supported with manual clang modules, + # so they should use_autogenerated_modules = true despite not having + # autogenerated modules because they're guarded by use_clang_modules. + use_autogenerated_modules = !(is_apple && use_system_xcode) } -if (is_mac) { - import("//build/config/mac/mac_sdk.gni") - sdk_path = mac_sdk_path +module_platform = "${current_os}-${current_cpu}" +if (is_chromeos) { + # ChromeOS uses the linux sysroot. + module_platform = "linux" +} else if (is_fuchsia || is_mac || is_linux) { + # Currently, these generate the same sysroot for all architectures. This is + # not inherently the case. If we start getting errors on one architecture + # but not the other, we will revert back to one modulemap per cpu. + module_platform = current_os } -if (use_clang_modules) { - if (is_linux || is_chromeos) { - sysroot_modulemap = "//build/linux/amd64/module.modulemap" - } else if (is_apple) { - sysroot_modulemaps = [ - "$sdk_path/usr/include/DarwinBasic.modulemap", - "$sdk_path/usr/include/DarwinFoundation.modulemap", - "$sdk_path/usr/include/c_standard_library.modulemap", - ] - } else if (is_android) { - sysroot_modulemap = "//build/android/amd64/module.modulemap" +if (is_apple && use_autogenerated_modules) { + # This must maintain sorted order + # xcode versions are bucketed by compatibility groups. + # eg. if our xcode 2600 config stops working while trying to roll xcode 3000, + # we would update it from [2600] to [2600, 3000] and rerun modularize to + # This would create the buckets: + # [0, 2600) => unsupported + # [2600, 3000) => 2600 + # [3000, ...) => 3000 + xcode_version_buckets = [ 2600 ] + foreach(version, xcode_version_buckets) { + if (xcode_version_int >= version) { + bucket = version + } } + assert(defined(bucket), + "xcode version ${xcode_version_int} was below the minimum supported " + + "version ${xcode_version_buckets[0]}") + module_platform += "_xcode${bucket}" +} - if (defined(sysroot_modulemap)) { - sysroot_modulemaps = [ sysroot_modulemap ] - } +# This is read by the modularize.py script to determine which directory to write +# to. +if (current_toolchain == default_toolchain) { + write_file("${root_gen_dir}/module_platform.txt", module_platform) +} - module_map_flags = - [ "-fmodule-map-file=" + rebase_path( - "${root_gen_dir}/third_party/libc++/src/include/module.modulemap", - root_build_dir) ] - module_map_flags += [ clang_arg_prefix + "-fbuiltin-module-map" ] - foreach(modulemap, sysroot_modulemaps) { - module_map_flags += - [ "-fmodule-map-file=" + rebase_path(modulemap, root_build_dir) ] - } +if (clang_modules_platform_supported && use_autogenerated_modules) { + chrome_build_file_bug = "https://g-issues.chromium.org/issues/new?cc=chrome-build-team@google.com&component=1456832&type=BUG&priority=P2&severity=S2&template=1959503" + + path = "//build/modules/${module_platform}/BUILD.gn" + assert( + path_exists(path), + "${path} does not exist. Please file a bug at ${chrome_build_file_bug} " + + "containing your args.gn, and mention that it failed on " + + "${current_os}-${current_cpu}") +} + +if (!use_autogenerated_modules && use_clang_modules) { + sysroot_modulemaps = [ + "$sdk_path/usr/include/DarwinBasic.modulemap", + "$sdk_path/usr/include/DarwinFoundation1.modulemap", + "$sdk_path/usr/include/DarwinFoundation2.modulemap", + "$sdk_path/usr/include/DarwinFoundation3.modulemap", + ] # Textual modules do not need to be precompiled. # However, like regular modules, they do need to include things. diff --git a/naiveproxy/src/build/config/chrome_build.gni b/naiveproxy/src/build/config/chrome_build.gni index e7f18493d5..75a22b2798 100644 --- a/naiveproxy/src/build/config/chrome_build.gni +++ b/naiveproxy/src/build/config/chrome_build.gni @@ -2,12 +2,17 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/gclient_args.gni") + declare_args() { # Select the desired branding flavor. False means normal Chromium branding, # true means official Google Chrome branding (requires extra Google-internal # resources). is_chrome_branded = false + # Whether to enable Google internal-only sources. + enable_src_internal = checkout_src_internal + # Whether to enable the Chrome for Testing (CfT) flavor. This arg is not # compatible with `is_chrome_branded`. # @@ -34,9 +39,17 @@ declare_args() { # package name. This currently only affects builds with `android_channel = # "beta"`. use_stable_package_name_for_trichrome = false + + # Set to true to enable new logic for setting the package name and version + # code for standalone WebView targets. + enable_new_standalone_webview_settings = true } } +# Use this for is_chrome_branded things that live in src-internal. +# See: b/452971335 +is_internal_chrome_branded = enable_src_internal && is_chrome_branded + # Ensure !is_android implies !is_high_end_android. is_high_end_android = is_high_end_android && is_android @@ -72,7 +85,7 @@ declare_args() { branding_path_component = "chromium" } branding_path_product = "chromium" - } else if (is_chrome_branded) { + } else if (is_internal_chrome_branded) { branding_path_component = "google_chrome" branding_path_product = "google_chrome" } else { @@ -88,4 +101,4 @@ declare_args() { # Whether to enable built-in branding assets (logos & marketing snippets) for # search providers in choice UIs. -enable_builtin_search_provider_assets = is_chrome_branded +enable_builtin_search_provider_assets = is_internal_chrome_branded diff --git a/naiveproxy/src/build/config/chromeos/BUILD.gn b/naiveproxy/src/build/config/chromeos/BUILD.gn index 84be2dcca1..db00386c34 100644 --- a/naiveproxy/src/build/config/chromeos/BUILD.gn +++ b/naiveproxy/src/build/config/chromeos/BUILD.gn @@ -6,6 +6,17 @@ import("//build/config/chromeos/ui_mode.gni") assert(is_chromeos) +config("compiler") { + cflags = [ "-faddrsig" ] + + # Strip prefix paths from predefined preprocessor macros and __builtin_FILE() + # so that log lines is easier to read. See crbug.com/405206784. + # This makes source file paths relative to the src directory, instead of + # prefixing them with something like "../../../../../path/to/chromium/src". + src_prefix = rebase_path("//", root_build_dir) + cflags += [ "-fmacro-prefix-map=${src_prefix}=" ] +} + config("compiler_cpu_abi") { # These flags are added by the Chrome OS toolchain compiler wrapper, # or are implicitly passed by Chome OS's toolchain's clang due to diff --git a/naiveproxy/src/build/config/clang/BUILD.gn b/naiveproxy/src/build/config/clang/BUILD.gn index 20a2ec81a1..b79e725894 100644 --- a/naiveproxy/src/build/config/clang/BUILD.gn +++ b/naiveproxy/src/build/config/clang/BUILD.gn @@ -6,22 +6,11 @@ import("//build/config/pch.gni") import("//build/config/rust.gni") import("clang.gni") -declare_args() { - # Whether to use Clang runtime libraries from the ChromeOS chroot. - # This should be true iff using the compiler from the chroot. - use_cros_sysroot_libs = - is_chromeos_device && current_toolchain == default_toolchain -} - if (is_ios) { # For `target_environment` and `target_platform`. import("//build/config/apple/mobile_config.gni") } -if (use_cros_sysroot_libs) { - import("//build/toolchain/cros_toolchain.gni") # For `cros_target_cc` -} - # Helper function for adding cflags to use a clang plugin. # - `plugin` is the name of the plugin. # - `plugin_arguments` is a list of arguments to pass to the plugin. @@ -96,11 +85,7 @@ clang_plugin("find_bad_constructs") { # The plugin is built directly into clang, so there's no need to load it # dynamically. plugin = "find-bad-constructs" - plugin_arguments = [ - "raw-ref-template-as-trivial-member", - "raw-span-template-as-trivial-member", - "check-stack-allocated", - ] + plugin_arguments = [ "check-stack-allocated" ] if (is_linux || is_chromeos || is_android || is_fuchsia) { plugin_arguments += [ "check-ipc" ] @@ -124,12 +109,13 @@ clang_plugin("find_bad_constructs") { # not serialized to precompiled header files, and thus we get warnings that we # should not. clang_plugin("unsafe_buffers") { - if (clang_use_chrome_plugins && clang_unsafe_buffers_paths != "" && - !enable_precompiled_headers) { - cflags = [ "-DUNSAFE_BUFFERS_BUILD" ] - plugin = "unsafe-buffers" - plugin_arguments = - [ rebase_path(clang_unsafe_buffers_paths, root_build_dir) ] + if (clang_use_chrome_plugins || clang_use_unsafe_buffers_plugin) { + if (clang_unsafe_buffers_paths != "" && !enable_precompiled_headers) { + cflags = [ "-DUNSAFE_BUFFERS_BUILD" ] + plugin = "unsafe-buffers" + plugin_arguments = + [ rebase_path(clang_unsafe_buffers_paths, root_build_dir) ] + } } } @@ -154,15 +140,6 @@ group("llvm-symbolizer_data") { } } -_cros_resource_dir = "" -if (use_cros_sysroot_libs) { - _cros_resource_dir = - exec_script(rebase_path("../../toolchain/cros/get_resource_dir.py"), - [ cros_target_cc ], - "trim string", - []) -} - template("clang_lib") { if (!defined(invoker.libname) || is_wasm) { not_needed(invoker, "*") @@ -176,7 +153,6 @@ template("clang_lib") { _suffix = "" _ext = "a" - _clang_lib_dir = "$clang_base_path/lib/clang/$clang_version/lib" if (is_win) { _dir = "windows" _prefix = "" @@ -192,20 +168,6 @@ template("clang_lib") { } } else if (is_apple) { _dir = "darwin" - } else if (use_cros_sysroot_libs) { - _clang_lib_dir = _cros_resource_dir - _dir = "lib/linux" - if (current_cpu == "x64") { - _suffix = "-x86_64" - } else if (current_cpu == "x86") { - _suffix = "-i386" - } else if (current_cpu == "arm") { - _suffix = "-armhf" - } else if (current_cpu == "arm64") { - _suffix = "-aarch64" - } else { - assert(false) # Unhandled cpu type - } } else if (is_linux || is_chromeos) { if (current_cpu == "x64") { _dir = "x86_64-unknown-linux-gnu" @@ -253,15 +215,9 @@ template("clang_lib") { assert(false) # Unhandled target platform } + _clang_lib_dir = "$clang_base_path/lib/clang/$clang_version/lib" _lib_file = "${_prefix}clang_rt.${_libname}${_suffix}.${_ext}" libs = [ "$_clang_lib_dir/$_dir/$_lib_file" ] - - # HACK: using ChromeOS' compiler-rt results in DSOs exporting - # compiler-rt symbols; figure out why it's (presumably) not using hidden - # visibility for most symbols. - if (use_cros_sysroot_libs) { - ldflags = [ "-Wl,--exclude-libs=$_lib_file" ] - } } } } diff --git a/naiveproxy/src/build/config/clang/clang.gni b/naiveproxy/src/build/config/clang/clang.gni index 95812df016..ea62f32bb6 100644 --- a/naiveproxy/src/build/config/clang/clang.gni +++ b/naiveproxy/src/build/config/clang/clang.gni @@ -2,22 +2,56 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//build/config/c++/c++.gni") +import("//build/config/cast.gni") +import("//build/config/cronet/config.gni") +import("//build/config/gclient_args.gni") +import("//build/toolchain/cc_wrapper.gni") +import("//build/toolchain/kythe.gni") import("//build/toolchain/rbe.gni") import("//build/toolchain/siso.gni") import("//build/toolchain/toolchain.gni") +import("//build_overrides/build.gni") + +# ChromeOS is the only OS for which we support clang modules with a custom +# sysroot. See http://crbug.com/443587270. +# Android is here because on android, sysroot.gni would introduce a circular +# dependency. We just assume that android is always safe to use clang modules +# for, but we can change this later down the line if that turns out to be false. +if (is_chromeos || is_android) { + using_tested_sysroot = true +} else { + import("//build/config/sysroot.gni") + + using_tested_sysroot = + use_sysroot && (current_os != target_os || current_cpu != target_cpu || + target_sysroot == "") +} default_clang_base_path = "//third_party/llvm-build/Release+Asserts" +# These platforms have been well-tested with clang modules. +# Platforms not in this list *may* work with clang modules, but we don't +# guarantee it, and we don't test them on CI/CQ with modules, so breakages may +# occur. +linux_supported_cpus = [ + "arm", + "arm64", + "x64", + "x86", +] +clang_modules_platform_supported = + (is_linux && current_os != "openwrt" && filter_include(linux_supported_cpus, [ current_cpu ]) != []) || + (is_android && current_cpu == "x64") || + (is_android && current_cpu == "arm64") || is_apple || is_fuchsia + declare_args() { # Indicates if the build should use the Chrome-specific plugins for enforcing - # coding guidelines, etc. Only used when compiling with Chrome's Clang, not - # Chrome OS's. - clang_use_chrome_plugins = - is_clang && current_os != "zos" && - default_toolchain != "//build/toolchain/cros:target" + # coding guidelines, etc. Only used when compiling with Chromium's Clang. + # Setting this enables all of the functionality of the plugin. + clang_use_chrome_plugins = is_clang && current_os != "zos" - # Use this instead of clang_use_chrome_plugins to enable just the raw-ptr-plugin. + # Use this instead of clang_use_chrome_plugins to enable just the raw-ptr + # functionality of the plugin. clang_use_raw_ptr_plugin = false enable_check_raw_ptr_fields = @@ -32,6 +66,10 @@ declare_args() { ((is_linux && !is_castos) || (is_android && !is_cast_android) || is_win || is_mac || is_ios || is_chromeos) + # Use this instead of clang_use_chrome_plugins to enable just the unsafe + # buffers functionality of the plugin + clang_use_unsafe_buffers_plugin = false + clang_base_path = default_clang_base_path # Specifies whether or not bitcode should be embedded during compilation. @@ -41,6 +79,22 @@ declare_args() { # Set to true to enable output of ThinLTO index and import files used for # creating a Chromium MLGO corpus in the ThinLTO case. lld_emit_indexes_and_imports = false + + # Use explicit Clang header modules for libc++. + # We'll gradually expand supported platform of modules + # (https://crbug.com/40440396). + # For details on the current state of modules in Chromium see + # https://chromium.googlesource.com/chromium/src/+/main/docs/modules.md + # + # TODO(https://crbug.com/440260716): Enable for Cronet in AOSP once gn2bp + # supports copy targets. + use_clang_modules = + # Clang modules doesn't work with translation_unit used in codesearch + # pipeline http://b/436082487. + !enable_kythe_annotations && is_clang && + clang_modules_platform_supported && using_tested_sysroot && + # reclient and icecc don't handle headers in modulemap config. + !use_reclient && !is_cronet_for_aosp_build && cc_wrapper != "icecc" } # We don't really need to collect a corpus for the host tools, just for the target. @@ -51,7 +105,8 @@ lld_emit_indexes_and_imports = # targets. We work around the bug in Reclient by # specifying the files here. rbe_bug_326584510_missing_input_list = [] -if (clang_use_chrome_plugins && defined(clang_unsafe_buffers_paths) && +if ((clang_use_chrome_plugins || clang_use_unsafe_buffers_plugin) && + defined(clang_unsafe_buffers_paths) && "$clang_unsafe_buffers_paths" != "") { rbe_bug_326584510_missing_input_list += [ rebase_path(clang_unsafe_buffers_paths, rbe_exec_root) ] diff --git a/naiveproxy/src/build/config/compiler/BUILD.gn b/naiveproxy/src/build/config/compiler/BUILD.gn index 8864110fc9..73f807aacc 100644 --- a/naiveproxy/src/build/config/compiler/BUILD.gn +++ b/naiveproxy/src/build/config/compiler/BUILD.gn @@ -6,11 +6,13 @@ import("//build/buildflag_header.gni") import("//build/config/android/config.gni") import("//build/config/c++/c++.gni") import("//build/config/c++/modules.gni") +import("//build/config/cast.gni") import("//build/config/chrome_build.gni") import("//build/config/chromeos/args.gni") import("//build/config/clang/clang.gni") import("//build/config/compiler/compiler.gni") import("//build/config/coverage/coverage.gni") +import("//build/config/cronet/config.gni") import("//build/config/dcheck_always_on.gni") import("//build/config/gclient_args.gni") import("//build/config/host_byteorder.gni") @@ -18,7 +20,6 @@ import("//build/config/pch.gni") import("//build/config/rust.gni") import("//build/config/ui.gni") import("//build/config/unwind.gni") -import("//build/toolchain/cros/cros_config.gni") import("//build/toolchain/rbe.gni") import("//build/toolchain/toolchain.gni") import("//build_overrides/build.gni") @@ -93,7 +94,8 @@ declare_args() { # nonsensical for said projects. clang_use_default_sample_profile = chrome_pgo_phase == 0 && build_with_chromium && is_official_build && - ((is_android && !is_high_end_android) || chromeos_is_browser_only) + ((is_android && !is_high_end_android) || chromeos_is_browser_only) && + !is_cronet_build # This configuration is used to select a default profile in Chrome OS based on # the microarchitectures we are using. This is only used if @@ -140,9 +142,14 @@ declare_args() { # needs to be evaluated before enabling it there as well. init_stack_vars = !(is_android && is_official_build) - # Zero init has favorable performance/size tradeoffs for Chrome OS - # but was not evaluated for other platforms. - init_stack_vars_zero = is_chromeos + # Specialization of `init_stack_vars` where locals are initialized with + # zeroes instead of patterns. Zero init is generally faster and can lead to + # better binary size due to being able to use instructions taking + # immediates. Patterns potentially have better signaling behavior though. We + # thus enable zero-init for all official builds that don't also enable + # DCHECKs explicitly or implicitly. Note that this intentionally also keeps + # the patterns for DCHECK Canary releases. + init_stack_vars_zero = is_official_build && !dcheck_always_on # This argument is to control whether enabling text section splitting in the # final binary. When enabled, the separated text sections with prefix @@ -200,10 +207,7 @@ declare_args() { # warning serves as a flip switch to allow a gradual migration of targets # away from the opt-in wexit_time_destructors config, and into the default # compiler config. - # TODO(crbug.com/40031409): This argument will eventually default to true, - # but ultimately the goal is for it to eventually be removed, once this mode - # is stable enough. - is_wexit_time_destructors_default = false + is_wexit_time_destructors_default = true } declare_args() { @@ -262,8 +266,15 @@ declare_args() { (clang_use_default_sample_profile || clang_sample_profile_path != "")) } -assert(!(llvm_force_head_revision && use_remoteexec && host_os != "linux"), - "rbe with locally built clang only works on linux") +is_bot = false +if (getenv("SWARMING_HEADLESS") != "" || getenv("SWARMING_BOT_ID") != "" || + getenv("SWARMING_TASK_ID") != "") { + is_bot = true +} + +assert(is_bot || + !(llvm_force_head_revision && use_remoteexec && host_os != "linux"), + "rbe with locally built clang only works on linux") # Or on CI bots # Whether or not we should pass the warning_suppression.txt file to clang # compilations. This file allows us to suppress warnings that originate from @@ -272,8 +283,7 @@ assert(!(llvm_force_head_revision && use_remoteexec && host_os != "linux"), # Since this is referenced both when passing the file and when deciding which # warnings to enable, store it in a separate variable here. use_clang_warning_suppression_file = - default_toolchain != "//build/toolchain/cros:target" && - !llvm_android_mainline && is_clang && clang_warning_suppression_file != "" + is_clang && clang_warning_suppression_file != "" # default_include_dirs --------------------------------------------------------- # @@ -326,7 +336,12 @@ config("compiler") { configs += [ "//build/config/win:compiler" ] } else if (is_android) { configs += [ "//build/config/android:compiler" ] - } else if (is_linux || is_chromeos) { + } else if (is_chromeos) { + configs += [ + "//build/config/linux:compiler", + "//build/config/chromeos:compiler", + ] + } else if (is_linux) { configs += [ "//build/config/linux:compiler" ] if (current_os == "openwrt") { configs += [ "//build/config/openwrt:compiler" ] @@ -592,6 +607,21 @@ config("compiler") { # --------------------------------------- if (is_chromeos) { cflags += [ "-Werror=poison-system-directories" ] + + # Enable std::vector []-operator bounds checking. + cflags_cc += [ "-D__google_stl_debug_vector=1" ] + + # Use -fdebug-types-section to avoid out-of-range relocations + # (crbug.com/1050819). When using ThinLTO, pass the equivalent + # to the code generator. + if (use_thin_lto) { + ldflags += [ + "-Wl,-mllvm", + "-Wl,-generate-type-units", + ] + } else { + cflags += [ "-fdebug-types-section" ] + } } if (is_chromeos_device && current_toolchain == default_toolchain) { @@ -675,9 +705,7 @@ config("compiler") { # TODO(crbug.com/40283598): This causes binary size growth and potentially # other problems. - # TODO(crbug.com/40284925): This isn't supported by Cronet's mainline llvm version. - if (default_toolchain != "//build/toolchain/cros:target" && - !llvm_android_mainline) { + if (default_toolchain != "//build/toolchain/cros:target") { cflags += [ "-mllvm", "-split-threshold-for-reg-with-hint=0", @@ -698,15 +726,12 @@ config("compiler") { cflags += [ "-ffp-contract=off" ] } - # Enable ELF CREL (see crbug.com/357878242) for all platforms that use ELF - # (excluding toolchains that use an older version of LLVM). + # Enable ELF CREL (see crbug.com/357878242) for all platforms that use ELF. # TODO(crbug.com/376278218): This causes segfault on Linux ARM builds. # It also causes segfault on Linux s390x: # https://github.com/llvm/llvm-project/issues/149511 - if (is_linux && use_lld && !llvm_android_mainline && current_cpu != "arm" && - current_cpu != "s390x" && - current_cpu != "mipsel" && current_cpu != "mips64el" && - default_toolchain != "//build/toolchain/cros:target") { + if (is_linux && use_lld && current_cpu != "arm" && current_cpu != "s390x" && + current_cpu != "mipsel" && current_cpu != "mips64el") { cflags += [ "-Wa,--crel,--allow-experimental-crel" ] } } @@ -751,7 +776,7 @@ config("compiler") { assert(!use_cxx23) cflags_cc += [ "/std:c++17" ] } else if (use_cxx23) { - cflags_cc += [ "/std:c++23" ] + cflags_cc += [ "/std:c++23preview" ] } else { cflags_cc += [ "/std:c++20" ] } @@ -1169,10 +1194,23 @@ config("compiler") { # abort instead of unwinding when panic occurs. In official builds, panics # abort immediately (this is configured in the stdlib) to keep binary size # down. So we unconditionally match behaviour in unofficial too. - rustflags += [ - "-Cpanic=abort", - "-Zpanic_abort_tests", - ] + # AOSP does not allow the usage of unstable features. This means that + # we can't enable `immediate-abort` when building cronet in AOSP until + # it has been stabilized. + # + # TODO(crbug.com/447558108): Use immediate-abort in AOSP once stabilized. + if (is_official_build && !is_cronet_for_aosp_build) { + rustflags += [ + "-Zunstable-options", + "-Cpanic=immediate-abort", + "-Zpanic_abort_tests", + ] + } else { + rustflags += [ + "-Cpanic=abort", + "-Zpanic_abort_tests", + ] + } } # crbug.com/397463803: Set this until CrOS' user enumeration is done; its @@ -1198,28 +1236,6 @@ config("disallow_unstable_features") { rustflags = [ "-Zallow-features=" ] } -config("libcxx_hardening") { - # Normally, this would be defined in the `runtime_library` config but NaCl - # saigo libc++ does not use the custom hermetic libc++. Unfortunately, there - # isn't really a better config to add this define for the define to - # consistently apply in both Chromium and non-Chromium code *and* non-NaCl and - # NaCl code. - # - # TODO(crbug.com/40511454): Move this back to the `runtime_library` config - # when NaCl is removed. - if (use_safe_libcxx) { - defines = [ "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE" ] - } else { - defines = [ "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE" ] - } - - # Enable libstdc++ hardening lightweight assertions. Those have a low - # performance penalty but are considered a bare minimum for security. - if (use_safe_libstdcxx) { - defines += [ "_GLIBCXX_ASSERTIONS=1" ] - } -} - # The BUILDCONFIG file sets this config on targets by default, which means when # building with ThinLTO, no optimization is performed in the link step. config("thinlto_optimize_default") { @@ -1748,6 +1764,12 @@ config("compiler_deterministic") { # This removes absolute paths from .pcm files. "-Xclang", "-fmodule-file-home-is-cwd", + + # Set a fixed dummy path to get deterministic module files even if the + # build happens in a different directory. See https://crbug.com/448270644 + # for more context. + "-Xclang", + "-fmodules-cache-path=/not_exist_dummy_dir", ] } } @@ -1806,7 +1828,8 @@ config("clang_revision") { "clang_revision=\"$_clang_revision\" but clang_version=\"$clang_version\". clang_version in build/toolchain/toolchain.gni is likely outdated.") } - if (toolchain_has_rust && _perform_consistency_checks) { + if (toolchain_has_rust && _perform_consistency_checks && + !rust_force_head_revision) { # Ensure that the synced rust version matches what's in git. _rust_revision_lines = filter_include(read_file("//tools/rust/update_rust.py", "list lines"), @@ -1873,6 +1896,11 @@ config("sanitize_c_array_bounds") { "-fsanitize=array-bounds", "-fsanitize-trap=array-bounds", ] + + if (defined(ubsan_array_bounds_ignorelist_path)) { + rebased = rebase_path(ubsan_array_bounds_ignorelist_path, root_build_dir) + cflags += [ "-fsanitize-ignorelist=$rebased" ] + } } } @@ -1914,25 +1942,26 @@ config("compiler_arm") { config("libcxx_module") { if (use_clang_modules) { - cflags_cc = - [ - "-fmodules", - clang_arg_prefix + "-fno-implicit-module-maps", - "-fno-implicit-modules", + cflags_cc = [ + "-fmodules", + clang_arg_prefix + "-fno-implicit-module-maps", + "-fno-implicit-modules", - "-Xclang", - "-fmodules-local-submodule-visibility", # required for builtins + "-Xclang", + "-fmodules-local-submodule-visibility", # required for builtins - # TODO(crbug.com/1456385): Figure out if this can be removed. - "-Wno-modules-ambiguous-internal-linkage", + # TODO(crbug.com/1456385): Figure out if this can be removed. + "-Wno-modules-ambiguous-internal-linkage", - # TODO(crbug.com/40440396): Clean up. - "-Wno-modules-import-nested-redundant", + # TODO(crbug.com/40440396): Clean up. + "-Wno-modules-import-nested-redundant", - # Needed to allow using builtin modules when the headers are - # unnecessarily using extern "C". - "-Wno-module-import-in-extern-c", - ] + module_map_flags + # Needed to allow using builtin modules when the headers are + # unnecessarily using extern "C". + "-Wno-module-import-in-extern-c", + ] + + defines = [ "USE_LIBCXX_MODULES" ] } } @@ -1948,6 +1977,7 @@ config("libcxx_module") { config("runtime_library") { configs = [] + defines = [] # The order of this config is important: it must appear before # android:runtime_library. This is to ensure libc++ appears before @@ -1963,7 +1993,7 @@ config("runtime_library") { # the C++ symbols. This config ensures the C++ symbols exist and are strong in # order to cause that replacement to occur by explicitly linking in clang's # compiler-rt library. - if (is_clang && !is_cronet_build) { + if (is_clang && !(is_a_target_toolchain && is_cronet_build)) { configs += [ "//build/config/clang:compiler_builtins" ] } @@ -1998,7 +2028,27 @@ config("runtime_library") { } if (is_component_build) { - defines = [ "COMPONENT_BUILD" ] + defines += [ "COMPONENT_BUILD" ] + } + + if (use_safe_libcxx) { + defines += [ "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE" ] + } else { + defines += [ "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE" ] + } + + # Enable libstdc++ hardening lightweight assertions. Those have a low + # performance penalty but are considered a bare minimum for security. + if (use_safe_libstdcxx) { + defines += [ "_GLIBCXX_ASSERTIONS=1" ] + } + + # Propagate all definitions for hardening to the swift compiler. + if (is_ios) { + swiftflags = [] + foreach(_define, defines) { + swiftflags += [ "-Xcc=-D$_define" ] + } } } @@ -2046,8 +2096,6 @@ config("tot_warnings") { # Entries should generally require both is_clang and llvm_force_head_revision, # but may have additional constraints as well (e.g. only some OSes) if (is_clang && llvm_force_head_revision) { - # TODO(crbug.com/432275627): Fix and re-enable. - cflags += [ "-Wno-uninitialized-const-pointer" ] } } @@ -2177,6 +2225,9 @@ config("default_warnings") { # TODO(crbug.com/376641662): Fix and re-enable. "-Wno-nontrivial-memcall", + + # TODO(crbug.com/432275627): Fix and re-enable. + "-Wno-uninitialized-const-pointer", ] cflags_cc += [ @@ -2208,7 +2259,7 @@ config("default_warnings") { ] } - if (is_component_build && use_clang_warning_suppression_file && !is_win) { + if (is_component_build && use_clang_warning_suppression_file) { # Warn for globally unique objects which might get duplicated if built # into different components, due to hidden visibility. Only applicable # to component builds. @@ -2232,17 +2283,6 @@ config("default_warnings") { ldflags += [ "-Wno-version-check" ] } - # Some builders, such as Cronet, use a different version of Clang than - # Chromium. This can cause minor errors when compiling Chromium changes. We - # want to avoid these errors. - if (llvm_android_mainline) { - cflags += [ - "-Wno-error=unknown-warning-option", - "-Wno-error=unused-command-line-argument", - "-Wno-error=unknown-pragmas", - ] - } - # Disable the GNU line marker warning when building a target with Icecc, # ccache, or both. This warning appears frequently when compiling # files that use GNU-style line markers with Clang and Icecc. It can @@ -2252,9 +2292,10 @@ config("default_warnings") { cflags += [ "-Wno-gnu-line-marker" ] } - if (is_wexit_time_destructors_default) { + if (is_wexit_time_destructors_default && + use_clang_warning_suppression_file) { # TODO(crbug.com/40031409): We are migrating towards making this warning - # enabled by default, and once that is completed, the warning + # enabled by default. Once that is completed, the warning # should always be added for clang builds. cflags += [ "-Wexit-time-destructors" ] } @@ -2355,7 +2396,7 @@ config("chromium_code") { # ChromeOS's toolchain supports a high-quality _FORTIFY_SOURCE=3 # implementation with a few custom glibc patches. Use that if it's # available. - if (is_chromeos_device && !lacros_use_chromium_toolchain) { + if (is_chromeos_device) { fortify_level = "3" } defines += [ "_FORTIFY_SOURCE=" + fortify_level ] @@ -2733,6 +2774,14 @@ if (is_win) { common_optimize_on_ldflags += [ "-Wl,--gc-sections" ] } + + if (chrome_pgo_phase == 1 && target_os == "android") { + # LLVM's SLP vectorizer is causing compiler hangs when run on PGO + # instrumented code. Disable it until that's fixed. This does not affect the + # data generated by the instrumentation, but may slow it down slightly. + # TODO(crbug.com/445202451): Remove this after rolling in a fixed compiler. + common_optimize_on_cflags += [ "-fno-slp-vectorize" ] + } } config("default_stack_frames") { @@ -2794,7 +2843,7 @@ config("optimize") { # -Os in clang is more of a size-conscious -O2 than "size at any cost" # (AKA -Oz). - if (is_fuchsia) { + if (is_fuchsia || enable_cast_receiver) { cflags = [ "-Oz" ] + common_optimize_on_cflags } else { cflags = [ "-Os" ] + common_optimize_on_cflags @@ -3113,16 +3162,25 @@ config("symbols") { swiftflags = [ "-g" ] } + split_dwarf_flags = [] if (use_debug_fission) { - cflags += [ "-gsplit-dwarf" ] + split_dwarf_flags += [ "-gsplit-dwarf" ] + + # When building for ChromeOS, turn off split DWARF inlining. + # Breakpad does not correctly handle files generated with + # that feature (https://g-issues.chromium.org/issues/41312543). + if (is_chromeos) { + split_dwarf_flags += [ "-fno-split-dwarf-inlining" ] + } } + cflags += split_dwarf_flags asmflags = cflags ldflags = [] # Split debug info with all thinlto builds except apple. # thinlto requires -gsplit-dwarf in ldflags. if (use_debug_fission && use_thin_lto && !is_apple) { - ldflags += [ "-gsplit-dwarf" ] + ldflags += split_dwarf_flags } _enable_gdb_index = symbol_level == 2 && !is_apple && use_lld && !is_wasm diff --git a/naiveproxy/src/build/config/compiler/compiler.gni b/naiveproxy/src/build/config/compiler/compiler.gni index babd5a12fa..2cf6def300 100644 --- a/naiveproxy/src/build/config/compiler/compiler.gni +++ b/naiveproxy/src/build/config/compiler/compiler.gni @@ -83,13 +83,9 @@ declare_args() { # Use it by default on official-optimized android and Chrome OS builds, but # not ARC or linux-chromeos since it's been seen to not play nicely with # Chrome's clang. crbug.com/1033839 - # Disabled in iOS cronet builds since build step cronet_static_complete - # wants to build a .a file consumable by external clients, and they won't - # have the same LLVM revisions as us, making bitcode useless to them. use_thin_lto = is_cfi || (is_clang && is_official_build && chrome_pgo_phase != 1 && - (is_linux || is_win || is_mac || - (is_ios && use_lld && !is_cronet_build) || + (is_linux || is_win || is_mac || (is_ios && use_lld) || (is_android && target_os != "chromeos") || (is_chromeos && is_chromeos_device))) @@ -119,8 +115,7 @@ declare_args() { exclude_unwind_tables = is_official_build && !is_android # Where to redirect clang crash diagnoses - clang_diagnostic_dir = - rebase_path("//tools/clang/crashreports", root_build_dir) + clang_diagnostic_dir = rebase_path("//out/clang-crashreports", root_build_dir) # Mark binaries as compatible with Shadow Stack of Control-flow Enforcement # Technology (CET). If Windows version and hardware supports the feature and @@ -132,8 +127,7 @@ declare_args() { # Set to true to enable using the ML inliner in LLVM. This currently only # enables the ML inliner when targeting Android. # Currently the ML inliner is only supported on linux hosts - use_ml_inliner = host_os == "linux" && is_android && - !llvm_android_mainline # https://crbug.com/1468680 + use_ml_inliner = host_os == "linux" && is_android # Whether we should consider the profile we're using to be accurate. Accurate # profiles have the benefit of (potentially substantial) binary size @@ -173,13 +167,25 @@ if (use_thin_lto && is_debug) { " (is_debug=true) build.") } +compiler_logs = [] + +if (use_thin_lto) { + compiler_logs += [ "use_thin_lto=true" ] +} else { + compiler_logs += [ "use_thin_lto=false" ] +} + # Determine whether to enable or disable frame pointers, based on the platform # and build arguments. -if (is_chromeos) { +if (is_chromeos || (enable_cast_receiver && is_linux)) { # ChromeOS generally prefers frame pointers, to support CWP. # However, Clang does not currently generate usable frame pointers in ARM # 32-bit builds (https://bugs.llvm.org/show_bug.cgi?id=18505) so disable them # there to avoid the unnecessary overhead. + # + # Linux cast builds run on embedded devices and are often constrained + # by binary size; disabling frame ptrs for ARM32 builds can save + # several MB. enable_frame_pointers = current_cpu != "arm" } else if (is_apple || is_linux) { enable_frame_pointers = true @@ -267,9 +273,9 @@ if (strip_absolute_paths_from_debug_symbols_default) { clang_need_input_root_absolute_path = !strip_absolute_paths_from_debug_symbols if (clang_need_input_root_absolute_path) { - compiler_logs = [ "clang_need_input_root_absolute_path=true" ] + compiler_logs += [ "clang_need_input_root_absolute_path=true" ] } else { - compiler_logs = [ "clang_need_input_root_absolute_path=false" ] + compiler_logs += [ "clang_need_input_root_absolute_path=false" ] } # TODO: https://issues.chromium.org/40120210 - remove this @@ -313,11 +319,10 @@ if (symbol_level == -1) { # Sanitizers also require symbols for filename suppressions to work. symbol_level = 1 } else if ((!is_linux && !is_chromeos && !is_fuchsia && - current_os != "aix") || is_debug || is_castos || - is_cast_android) { + current_os != "aix") || is_debug) { # Linux builds slower by having symbols as part of the target binary, # whereas Mac and Windows have them separate, so in Release Linux, default - # them off, but keep them on for Chromecast builds. + # them off. symbol_level = 2 } else { symbol_level = 0 diff --git a/naiveproxy/src/build/config/cronet/config.gni b/naiveproxy/src/build/config/cronet/config.gni index 8d4743571e..e529cc5da1 100644 --- a/naiveproxy/src/build/config/cronet/config.gni +++ b/naiveproxy/src/build/config/cronet/config.gni @@ -2,20 +2,40 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -declare_args() { - # Control whether cronet is built (this is usually set by the script - # components/cronet/tools/cr_cronet.py as cronet requires specific - # gn args to build correctly). - is_cronet_build = false +# Cronet can be built within: +# 1) Chromium. By setting `is_cronet_build` to true and using GN directly. +# 2) Android. By bypassing GN and instead running +# //components/cronet/gn2bp/run_gn2bp.py. +# +# Note: in both cases Cronet is always built *for* Android. What is changing is +# the underlying repository and build infrastructure. - # Controls whether cronet is currently being built for AOSP or Chromium. - # This will always be false when building Cronet for Chromium. - # the flag exists to accommodate for the divergence between the repos. +declare_args() { + # Signals that Cronet is being built within Android. + # + # Note: attempting to build directly with GN, while this arg is set to true, + # is wrong and will not work. Instead, this arg is used internally by the + # scripts within //components/cronet/android/gn2bp to generate Soong build + # rules to build within the Android repository. is_cronet_for_aosp_build = false } -if (is_cronet_for_aosp_build) { - assert( - is_cronet_build, - "`is_cronet_for_aosp_build` flag can be only enabled when `is_cronet_build` flag is enabled.") +# Rely on a second declare_args block. This forces `is_cronet_for_aosp_build` to +# be computed first, including overrides (see +# https://gn.googlesource.com/gn/+/main/docs/reference.md#func_declare_args). +# Allowing `is_cronet_build` to depend on the overridden value of +# `is_cronet_for_aosp_build`. +declare_args() { + # Signals that Cronet is being built. Building within Android always implies + # that Cronet is being built. + is_cronet_build = is_cronet_for_aosp_build } + +# This should only ever happen if one decides to override, at the same time, +# is_cronet_build = false and is_cronet_for_aosp_build = true. +# This is always wrong, so surface it via an assert instead of a broken build. +assert( + !is_cronet_for_aosp_build || is_cronet_build, + "`is_cronet_build` cannot be disabled when `is_cronet_for_aosp_build` is enabled.") + +assert(!is_cronet_for_aosp_build || target_os == "android") diff --git a/naiveproxy/src/build/config/freetype/BUILD.gn b/naiveproxy/src/build/config/freetype/BUILD.gn index 981ad9956e..dcbd00bd82 100644 --- a/naiveproxy/src/build/config/freetype/BUILD.gn +++ b/naiveproxy/src/build/config/freetype/BUILD.gn @@ -2,7 +2,6 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//build/config/features.gni") import("//build/config/freetype/freetype.gni") group("freetype") { @@ -11,4 +10,24 @@ group("freetype") { } else { public_deps = [ "//third_party/freetype" ] } + + # This list tracks all current users of the `freetype` library. + # + # Eventually `freetype` should be replaced with Fontations libraries. + # Therefore no new entries should be added to this list. + visibility = [ + "//chrome/test:*", + "//content/test:*", + "//skia", + "//third_party/fontconfig", + + # The path/label of the PDFium target that depends on `freetype` is + # different when building PDFium during Chromium build and during + # standalone-PDFium-build: + "//:freetype_common", # Building standalone PDFium + "//third_party/pdfium:freetype_common", # Building Chromium + + # Other dependencies that we think are PDFium-related: + "//components/services/font:font_service_unittests", + ] } diff --git a/naiveproxy/src/build/config/fuchsia/gn_configs.gni b/naiveproxy/src/build/config/fuchsia/gn_configs.gni index 1c61458caa..7da1913420 100644 --- a/naiveproxy/src/build/config/fuchsia/gn_configs.gni +++ b/naiveproxy/src/build/config/fuchsia/gn_configs.gni @@ -53,7 +53,7 @@ declare_args() { # files from //third_party/ in //build/. # Note, `current_cpu` should always exist in the //build/ tree, so the # `target_cpu` fallback has been removed. -fuchsia_target_api_level = 27 +fuchsia_target_api_level = 28 fuchsia_arch_root = "${fuchsia_sdk}/obj/${target_cpu}-api-${fuchsia_target_api_level}" diff --git a/naiveproxy/src/build/config/fuchsia/perf_optimized_cast_receiver_args.gn b/naiveproxy/src/build/config/fuchsia/perf_optimized_cast_receiver_args.gn index d7d5ad488d..5d50827ca3 100644 --- a/naiveproxy/src/build/config/fuchsia/perf_optimized_cast_receiver_args.gn +++ b/naiveproxy/src/build/config/fuchsia/perf_optimized_cast_receiver_args.gn @@ -14,4 +14,7 @@ import("//build/config/fuchsia/size_optimized_cast_receiver_args.gn") chrome_pgo_phase = 2 -optimize_for_size = false + +# TODO(crbug.com/436861859): PGO and optimize for performance cannot be combined with +# dcheck due to a known issue, which is why optimize for size is enabled instead. +optimize_for_size = true diff --git a/naiveproxy/src/build/config/ios/BUILD.gn b/naiveproxy/src/build/config/ios/BUILD.gn index 9cd1fb75e0..077644c7c2 100644 --- a/naiveproxy/src/build/config/ios/BUILD.gn +++ b/naiveproxy/src/build/config/ios/BUILD.gn @@ -2,6 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/buildflag_header.gni") +import("//build/config/apple/arch.gni") import("//build/config/apple/mobile_config.gni") import("//build/config/ios/config.gni") import("//build/config/ios/ios_sdk.gni") @@ -18,17 +20,12 @@ config("compiler") { common_flags = [] # CPU architecture. - if (current_cpu == "x64") { - triplet_cpu = "x86_64" - } else if (current_cpu == "x86") { - triplet_cpu = "i386" - } else if (current_cpu == "arm" || current_cpu == "armv7") { - triplet_cpu = "armv7" - } else if (current_cpu == "arm64") { - triplet_cpu = "arm64" - } else if (current_cpu == "arm64e") { - triplet_cpu = "arm64e" + _archs_mapping_os = archs_mapping[current_os] + if (defined(_archs_mapping_os[current_cpu])) { + _archs_mapping_os_cpu = _archs_mapping_os[current_cpu] + triplet_cpu = _archs_mapping_os_cpu.clang_arch } else { + notneeded([ "_archs_mapping_os" ]) assert(false, "unsupported cpu: $current_cpu") } @@ -59,7 +56,7 @@ config("compiler") { # This is here so that all files get recompiled after an Xcode update. # (defines are passed via the command line, and build system rebuild things # when their commandline changes). Nothing should ever read this define. - defines = [ "CR_XCODE_VERSION=$xcode_version" ] + defines = [ "CR_XCODE_BUILD=$xcode_build" ] asmflags = common_flags cflags = common_flags @@ -270,10 +267,28 @@ config("xctest_config") { } } -# TODO(crbug.com/40911785): any target that uses this config will miscompile. -# This needs to be fixed if we want to use Swift - C++ interop. +# When you have a modulemap to define modules for the C++ code that can be +# called from Swift, you need to include the path to the modulemap. config("enable_swift_cxx_interop") { - swiftflags = [ "-enable-experimental-cxx-interop" ] + swiftflags = [ + "-cxx-interoperability-mode=default", + + # Add a path to the bridging code. This is used for . + "-I", + rebase_path("$ios_toolchains_path/usr/include", root_build_dir), + "-Xcc=-fmodule-map-file=" + + rebase_path("$ios_toolchains_path/usr/include/swift/bridging.modulemap", + root_build_dir), + ] + + # TODO(crbug.com/451945291): Move the following compiler flags to + # build/config/compiler/BUILD.gn when Swift/C++ interop is enabled by default. + # The '-std=c++' flag is not allowed with 'Objective-C'. + if (use_cxx23) { + swiftflags += [ "-Xcc=-std=c++23" ] + } else { + swiftflags += [ "-Xcc=-std=c++20" ] + } } group("xctest") { @@ -331,3 +346,10 @@ action("xctest_runner_without_arm64e") { deps += [ ":copy_xctrunner_app" ] } } + +# Allow code to detect whether it is compiler for an app extension or not +# (extensions cannot access some APIs, e.g. UIApplication.sharedApplication). +buildflag_header("buildflags") { + header = "buildflags.h" + flags = [ "IOS_IS_APP_EXTENSION=$ios_is_app_extension" ] +} diff --git a/naiveproxy/src/build/config/ios/ios_app_ipa.gni b/naiveproxy/src/build/config/ios/ios_app_ipa.gni new file mode 100644 index 0000000000..f43b94e771 --- /dev/null +++ b/naiveproxy/src/build/config/ios/ios_app_ipa.gni @@ -0,0 +1,42 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Template to package a .app bundle into a .ipa. +# +# Arguments +# bundle_target: +# Target that generates the .app +# +# bundle_app_path: +# (optional) Path to the .app generated by bundle_target. Defaults to the +# last output of `bundle_target` if it can be automatically determined. +template("ios_app_ipa") { + assert(defined(invoker.bundle_target), + "bundle_target must be defined for ios_app_ipa(\"$target_name\")") + + if (defined(invoker.bundle_app_path)) { + _bundle_app_path = invoker.bundle_app_path + } else { + _bundle_target_outputs = get_target_outputs(invoker.bundle_target) + assert(len(_bundle_target_outputs) > 0, + "ios_app_ipa(\"$target_name\") couldn't get the outputs of " + + "${invoker.bundle_target}") + _bundle_app_path = _bundle_target_outputs[len(_bundle_target_outputs) - 1] + } + _bundle_app_name = get_label_info(invoker.bundle_target, "name") + + action(target_name) { + forward_variables_from(invoker, + [ + "visibility", + "testonly", + ]) + script = "//build/config/ios/package_ipa.py" + sources = [ "$_bundle_app_path" ] + outputs = [ "$root_out_dir/$_bundle_app_name.ipa" ] + args = rebase_path(sources, root_build_dir) + + rebase_path(outputs, root_build_dir) + deps = [ invoker.bundle_target ] + } +} diff --git a/naiveproxy/src/build/config/ios/ios_sdk.gni b/naiveproxy/src/build/config/ios/ios_sdk.gni index cab82e04cf..305f6b8240 100644 --- a/naiveproxy/src/build/config/ios/ios_sdk.gni +++ b/naiveproxy/src/build/config/ios/ios_sdk.gni @@ -24,6 +24,7 @@ declare_args() { ios_toolchains_path = "" xcode_version = "" xcode_version_int = 0 + xcode_version_verbatim = "" xcode_build = "" machine_os_build = "" @@ -124,6 +125,7 @@ if (ios_sdk_path == "") { ios_toolchains_path = _ios_sdk_result.toolchains_path xcode_version = _ios_sdk_result.xcode_version xcode_version_int = _ios_sdk_result.xcode_version_int + xcode_version_verbatim = _ios_sdk_result.xcode_version_verbatim xcode_build = _ios_sdk_result.xcode_build machine_os_build = _ios_sdk_result.machine_os_build if (target_environment == "simulator") { diff --git a/naiveproxy/src/build/config/ios/ios_sdk_overrides.gni b/naiveproxy/src/build/config/ios/ios_sdk_overrides.gni index 03f747901d..f34cf576bc 100644 --- a/naiveproxy/src/build/config/ios/ios_sdk_overrides.gni +++ b/naiveproxy/src/build/config/ios/ios_sdk_overrides.gni @@ -11,12 +11,7 @@ import("//build/config/features.gni") declare_args() { # Version of iOS that we're targeting. if (use_blink) { - if (target_platform == "iphoneos") { - ios_deployment_target = "26.0" - } else { - # tvOS requires at least SDK version 17.4. - ios_deployment_target = "17.4" - } + ios_deployment_target = "26.0" } else { ios_deployment_target = "17.0" } @@ -25,6 +20,5 @@ declare_args() { # Always assert that ios_deployment_target is used on non-iOS platforms to # prevent unused args warnings. if (!is_ios) { - assert(ios_deployment_target == "17.0" || ios_deployment_target == "17.4" || - ios_deployment_target == "26.0" || true) + not_needed([ "ios_deployment_target" ]) } diff --git a/naiveproxy/src/build/config/ios/package_ipa.py b/naiveproxy/src/build/config/ios/package_ipa.py new file mode 100755 index 0000000000..aee433aa24 --- /dev/null +++ b/naiveproxy/src/build/config/ios/package_ipa.py @@ -0,0 +1,33 @@ +#!/usr/bin/env vpython3 +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Generates .ipa file from an unpackaged .app bundle.""" + +import argparse +import pathlib +import shutil +import tempfile + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("app_path", type=str) + parser.add_argument("ipa_path", type=str) + args = parser.parse_args() + app_path = pathlib.Path(args.app_path) + ipa_path = pathlib.Path(args.ipa_path) + with tempfile.TemporaryDirectory() as tmp_dir_path: + tmp_dir = pathlib.Path(tmp_dir_path) + payload_dir = tmp_dir / 'Payload' + payload_dir.mkdir() + shutil.copytree(app_path, str(payload_dir / app_path.name)) + shutil.make_archive(str(tmp_dir / app_path.with_suffix("").name), + 'zip', + root_dir=tmp_dir_path, + base_dir='Payload') + shutil.move(str(tmp_dir / app_path.with_suffix(".zip").name), ipa_path) + + +if __name__ == '__main__': + main() diff --git a/naiveproxy/src/build/config/ios/rules.gni b/naiveproxy/src/build/config/ios/rules.gni index e9ddde5f8c..02d429590e 100644 --- a/naiveproxy/src/build/config/ios/rules.gni +++ b/naiveproxy/src/build/config/ios/rules.gni @@ -827,13 +827,7 @@ template("ios_framework_bundle") { if (_has_public_headers) { _public_headers = invoker.public_headers - _framework_root_dir = "$root_out_dir/$_output_name.framework" - if (target_environment == "simulator" || target_environment == "device") { - _framework_contents_dir = _framework_root_dir - } else if (target_environment == "catalyst") { - _framework_contents_dir = "$_framework_root_dir/Versions/A" - } _compile_headers_map_target = _target_name + "_compile_headers_map" action(_compile_headers_map_target) { @@ -867,26 +861,40 @@ template("ios_framework_bundle") { } _create_module_map_target = _target_name + "_module_map" + _module_map_bundle_data = _target_name + "_module_map_bundle_data" action(_create_module_map_target) { - visibility = [ ":$_framework_headers_target" ] + visibility = [ + ":$_framework_headers_target", + ":$_module_map_bundle_data", + ] + script = "//build/config/apple/write_framework_modulemap.py" - outputs = [ "$_framework_contents_dir/Modules/module.modulemap" ] + outputs = [ "$target_out_dir/$target_name/module.modulemap" ] args = [ _output_name, - rebase_path("$_framework_contents_dir/Modules", root_build_dir), + rebase_path("$target_out_dir/$target_name", root_build_dir), ] } - _copy_public_headers_target = _target_name + "_copy_public_headers" - copy(_copy_public_headers_target) { + bundle_data(_module_map_bundle_data) { + visibility = [ ":$_framework_headers_target" ] + sources = get_target_outputs(":$_create_module_map_target") + outputs = [ "{{bundle_contents_dir}}/Modules/{{source_file_part}}" ] + + public_deps = [ ":$_create_module_map_target" ] + } + + _public_headers_bundle_data = _target_name + "_public_headers_bundle_data" + bundle_data(_public_headers_bundle_data) { forward_variables_from(invoker, [ "testonly", "deps", ]) + visibility = [ ":$_framework_headers_target" ] sources = _public_headers - outputs = [ "$_framework_contents_dir/Headers/{{source_file_part}}" ] + outputs = [ "{{bundle_contents_dir}}/Headers/{{source_file_part}}" ] # Do not use forward_variables_from for "public_deps" as # we do not want to forward those dependencies. @@ -904,7 +912,10 @@ template("ios_framework_bundle") { ":$_compile_headers_map_target", ":$_create_module_map_target", ] - public_deps = [ ":$_copy_public_headers_target" ] + public_deps = [ + ":$_module_map_bundle_data", + ":$_public_headers_bundle_data", + ] } } @@ -965,8 +976,6 @@ template("ios_framework_bundle") { bundle_binary_target = ":$_shared_library_target" bundle_binary_output = _output_name - has_public_headers = _has_public_headers - # Framework do not have entitlements nor mobileprovision because they use # the one from the bundle using them (.app or .appex) as they are just # dynamic library with shared code. diff --git a/naiveproxy/src/build/config/linux/atk/BUILD.gn b/naiveproxy/src/build/config/linux/atk/BUILD.gn index 239c3870a1..3931a5a897 100644 --- a/naiveproxy/src/build/config/linux/atk/BUILD.gn +++ b/naiveproxy/src/build/config/linux/atk/BUILD.gn @@ -3,7 +3,6 @@ # found in the LICENSE file. import("//build/config/chromeos/ui_mode.gni") -import("//build/config/features.gni") import("//build/config/linux/pkg_config.gni") import("//build/config/ui.gni") diff --git a/naiveproxy/src/build/config/locales.gni b/naiveproxy/src/build/config/locales.gni index 4d503e1523..f6e638087f 100644 --- a/naiveproxy/src/build/config/locales.gni +++ b/naiveproxy/src/build/config/locales.gni @@ -221,7 +221,6 @@ if (is_chromeos) { "sw", "ta", "te", - "ur", ] } diff --git a/naiveproxy/src/build/config/mac/BUILD.gn b/naiveproxy/src/build/config/mac/BUILD.gn index d9218b3ca1..765f91d883 100644 --- a/naiveproxy/src/build/config/mac/BUILD.gn +++ b/naiveproxy/src/build/config/mac/BUILD.gn @@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/apple/arch.gni") import("//build/config/apple/symbols.gni") import("//build/config/c++/c++.gni") import("//build/config/mac/mac_sdk.gni") @@ -16,13 +17,12 @@ config("compiler") { common_mac_flags = [] # CPU architecture. - if (current_cpu == "x64") { - clang_arch = "x86_64" - } else if (current_cpu == "x86") { - clang_arch = "i386" - } else if (current_cpu == "arm64") { - clang_arch = current_cpu + _archs_mapping_os = archs_mapping[current_os] + if (defined(_archs_mapping_os[current_cpu])) { + _archs_mapping_os_cpu = _archs_mapping_os[current_cpu] + clang_arch = _archs_mapping_os_cpu.clang_arch } else { + notneeded([ "_archs_mapping_os" ]) assert(false, "unknown current_cpu $current_cpu") } common_mac_flags += [ "--target=$clang_arch-apple-macos" ] @@ -30,7 +30,7 @@ config("compiler") { # This is here so that all files get recompiled after an Xcode update. # (defines are passed via the command line, and build system rebuild things # when their commandline changes). Nothing should ever read this define. - defines = [ "CR_XCODE_VERSION=$xcode_version" ] + defines = [ "CR_XCODE_BUILD=$xcode_build" ] asmflags = common_mac_flags cflags = common_mac_flags @@ -67,19 +67,9 @@ config("runtime_library") { cflags = common_flags ldflags = common_flags - # Record the SDK as 26.0, even though that may not be the SDK in use. This - # convinces macOS 26 (and its betas) to enable new features gated on that SDK - # being used at build time, before actually migrating to that SDK (which is - # currently in beta, and which we wouldn’t normally use until released). On - # macOS < 26, this white lie is a no-op, as older versions won’t change - # behaviors if this field is set to anything newer than they’re aware of. On - # macOS 26, this enables Liquid Glass, and disables the undesirable - # SystemVersionCompat OS version reporting, where macOS 26 calls itself macOS - # 16. - # - # TODO(https://crbug.com/423933062): Remove this once the macOS 26 SDK is in - # use. - ldflags += [ "-Wl,-platform_version,macos,$mac_deployment_target,26.0" ] + # TODO(https://crbug.com/442128549): see if we can convince upstream rust to + # add an -isysroot flag instead. + rustenv = [ "SDKROOT=" + rebase_path(sysroot, root_build_dir) ] } # On Mac, this is used for everything except static libraries. diff --git a/naiveproxy/src/build/config/mac/mac_sdk.gni b/naiveproxy/src/build/config/mac/mac_sdk.gni index 94880f8c88..8159fa4dca 100644 --- a/naiveproxy/src/build/config/mac/mac_sdk.gni +++ b/naiveproxy/src/build/config/mac/mac_sdk.gni @@ -48,12 +48,12 @@ declare_args() { # The SDK version used when making official builds. This is a single exact # version, not a minimum. If this version isn't available, official builds # will fail. - mac_sdk_official_version = "15.5" + mac_sdk_official_version = "26.0" # The SDK build version used when making official builds. This is a single # exact version found at "System/Library/CoreServices/SystemVersion.plist" # inside the SDK. - mac_sdk_official_build_version = "24F74" + mac_sdk_official_build_version = "25A352" # Production builds should use hermetic Xcode. If you want to do production # builds with system Xcode to test new SDKs, set this. @@ -133,6 +133,7 @@ sdk_info_args += [ mac_sdk_name ] _mac_sdk_result = exec_script(script_name, sdk_info_args, "scope") xcode_version = _mac_sdk_result.xcode_version +xcode_version_int = _mac_sdk_result.xcode_version_int xcode_build = _mac_sdk_result.xcode_build if (mac_sdk_path == "" && use_system_xcode && use_remoteexec) { mac_sdk_path = _mac_sdk_result.sdk_path diff --git a/naiveproxy/src/build/config/mac/rules.gni b/naiveproxy/src/build/config/mac/rules.gni index c32a3e694c..2d495bc8f4 100644 --- a/naiveproxy/src/build/config/mac/rules.gni +++ b/naiveproxy/src/build/config/mac/rules.gni @@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/apple/apple_info_plist.gni") +import("//build/config/apple/arch.gni") import("//build/config/apple/symbols.gni") import("//build/config/mac/mac_sdk.gni") @@ -349,9 +350,15 @@ template("mac_framework_bundle") { ] if (enable_dsyms) { + _archs_mapping_os = archs_mapping.mac + _archs_mapping_os_cpu = _archs_mapping_os[current_cpu] + _dsym_arch = _archs_mapping_os_cpu.dsym_arch + data = [ "$root_out_dir/$_output_name.dSYM/Contents/Info.plist", "$root_out_dir/$_output_name.dSYM/Contents/Resources/DWARF/$_output_name", + "$root_out_dir/$_output_name.dSYM/Contents/Resources/Relocations/" + + "$_dsym_arch/$_output_name.yml", ] } @@ -545,9 +552,15 @@ template("mac_app_bundle") { } if (enable_dsyms) { + _archs_mapping_os = archs_mapping.mac + _archs_mapping_os_cpu = _archs_mapping_os[current_cpu] + _dsym_arch = _archs_mapping_os_cpu.dsym_arch + data = [ "$root_out_dir/$_output_name.dSYM/Contents/Info.plist", "$root_out_dir/$_output_name.dSYM/Contents/Resources/DWARF/$_output_name", + "$root_out_dir/$_output_name.dSYM/Contents/Resources/Relocations/" + + "$_dsym_arch/$_output_name.yml", ] } @@ -616,9 +629,15 @@ template("mac_plugin_bundle") { deps += [ ":$_loadable_module_bundle_data" ] if (enable_dsyms) { + _archs_mapping_os = archs_mapping.mac + _archs_mapping_os_cpu = _archs_mapping_os[current_cpu] + _dsym_arch = _archs_mapping_os_cpu.dsym_arch + data = [ "$root_out_dir/$_output_name.so.dSYM/Contents/Info.plist", "$root_out_dir/$_output_name.so.dSYM/Contents/Resources/DWARF/$_output_name.so", + "$root_out_dir/$_output_name.so.dSYM/Contents/Resources/Relocations/" + + "$_dsym_arch/$_output_name.so.yml", ] } diff --git a/naiveproxy/src/build/config/pch.gni b/naiveproxy/src/build/config/pch.gni index 6f8504ae4d..f608cb477b 100644 --- a/naiveproxy/src/build/config/pch.gni +++ b/naiveproxy/src/build/config/pch.gni @@ -2,9 +2,9 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/clang/clang.gni") import("//build/toolchain/cc_wrapper.gni") import("//build/toolchain/rbe.gni") -import("//build/toolchain/siso.gni") declare_args() { # Precompiled header file support is by default available, except on the @@ -16,5 +16,6 @@ declare_args() { # supported by sccache: https://github.com/mozilla/sccache/issues/978. # - On Linux it slows down the build. enable_precompiled_headers = - !is_official_build && !use_remoteexec && cc_wrapper == "" && !is_linux + !is_official_build && !use_remoteexec && cc_wrapper == "" && !is_linux && + !use_clang_modules } diff --git a/naiveproxy/src/build/config/rust.gni b/naiveproxy/src/build/config/rust.gni index 7b09b0d80f..6b646a5037 100644 --- a/naiveproxy/src/build/config/rust.gni +++ b/naiveproxy/src/build/config/rust.gni @@ -68,12 +68,9 @@ declare_args() { # # One important consideration is whether the linker uses the same LLVM # version as `rustc` (i.e. if it can understand the LLVM-IR from the - # compilation artifacts produced by `rustc`). In LaCrOS and ash builds this - # may not be true - see b/299483903. - # - # TODO(crbug.com/40281834): Re-enable ThinLTO for Rust on LaCrOS - # TODO(b/300937673): Re-enable ThinLTO for Rust on ash-chrome - toolchain_supports_rust_thin_lto = !is_chromeos + # compilation artifacts produced by `rustc`). For more context please see + # older bugs like b/299483903, https://crbug.com/40281834, or b/300937673. + toolchain_supports_rust_thin_lto = true # Any extra std rlibs in your Rust toolchain, relative to the standard # Rust toolchain. Typically used with 'rust_sysroot_absolute' @@ -175,23 +172,14 @@ if (enable_rust) { # targets to Rust targets comprehensively despite not having official support # (see '*_toolchain_supports_platform above') to enable experimentation with # other toolchains. -# -# The `cargo_target_abi` is the `target_abi` given by Cargo to build scripts -# as the `CARGO_CFG_TARGET_ABI` environment variable. It is determined for -# each `rust_abi_target` by doing `cargo build --target $rust_abi_target` with -# a cargo project that dumps the `CARGO_CFG_TARGET_ABI` from its build.rs. See -# https://issues.chromium.org/u/1/issues/372512092#comment5 for an example. rust_abi_target = "" if (is_linux || is_chromeos) { if (current_cpu == "arm64") { rust_abi_target = "aarch64-unknown-linux-gnu" - cargo_target_abi = "" } else if (current_cpu == "x86") { rust_abi_target = "i686-unknown-linux-gnu" - cargo_target_abi = "" } else if (current_cpu == "x64") { rust_abi_target = "x86_64-unknown-linux-gnu" - cargo_target_abi = "" } else if (current_cpu == "arm") { if (arm_float_abi == "hard") { float_suffix = "hf" @@ -214,33 +202,25 @@ if (is_linux || is_chromeos) { } else { rust_abi_target = "armv7-unknown-linux-gnueabi" + float_suffix } - cargo_target_abi = "eabi" + float_suffix } else { rust_abi_target = "arm-unknown-linux-gnueabi" + float_suffix - cargo_target_abi = "eabi" + float_suffix } } else if (current_cpu == "riscv64") { rust_abi_target = "riscv64gc-unknown-linux-gnu" - cargo_target_abi = "" } else if (current_cpu == "ppc64") { rust_abi_target = "powerpc64le-unknown-linux-gnu" - cargo_target_abi = "" } else if (current_cpu == "s390x") { rust_abi_target = "s390x-unknown-linux-gnu" - cargo_target_abi = "" } else if (current_cpu == "loong64") { rust_abi_target = "loongarch64-unknown-linux-gnu" - cargo_target_abi = "" } else { # Best guess for other future platforms. rust_abi_target = current_cpu + "-unknown-linux-gnu" - cargo_target_abi = "" } } else if (is_android) { import("//build/config/android/abi.gni") if (android_abi_target == "i686-linux-android") { rust_abi_target = android_abi_target - cargo_target_abi = "" } else if (android_abi_target == "arm-linux-androideabi") { # Android clang target specifications mostly match Rust, but this # is an exception. @@ -251,34 +231,26 @@ if (is_linux || is_chromeos) { } else { rust_abi_target = "armv7-linux-androideabi" } - cargo_target_abi = "eabi" } else if (android_abi_target == "mipsel-linux-android") { # There is no MIPS android target. rust_abi_target = "" - cargo_target_abi = "" } else if (android_abi_target == "x86_64-linux-android") { rust_abi_target = android_abi_target - cargo_target_abi = "" } else if (android_abi_target == "aarch64-linux-android") { rust_abi_target = android_abi_target - cargo_target_abi = "" } else if (android_abi_target == "mips64el-linux-android") { # There is no MIPS android target. rust_abi_target = "" - cargo_target_abi = "" } else if (android_abi_target == "riscv64-linux-android") { rust_abi_target = android_abi_target - cargo_target_abi = "" } else { assert(false, "Unknown Android ABI: " + android_abi_target) } } else if (is_fuchsia) { if (current_cpu == "arm64") { rust_abi_target = "aarch64-unknown-fuchsia" - cargo_target_abi = "" } else if (current_cpu == "x64") { rust_abi_target = "x86_64-unknown-fuchsia" - cargo_target_abi = "" } else { assert(false, "Architecture not supported") } @@ -287,28 +259,22 @@ if (is_linux || is_chromeos) { assert(target_platform == "iphoneos", "unsupported target_platform=$target_platform") rust_abi_target = "arm64e-apple-ios" - cargo_target_abi = "" } else if (current_cpu == "arm64") { if (target_platform == "iphoneos") { if (target_environment == "simulator") { rust_abi_target = "aarch64-apple-ios-sim" - cargo_target_abi = "sim" } else if (target_environment == "device") { rust_abi_target = "aarch64-apple-ios" - cargo_target_abi = "" } else if (target_environment == "catalyst") { rust_abi_target = "aarch64-apple-ios-macabi" - cargo_target_abi = "macabi" } else { assert(false, "unsupported target_environment=$target_environment") } } else if (target_platform == "tvos") { if (target_environment == "simulator") { rust_abi_target = "aarch64-apple-tvos-sim" - cargo_target_abi = "sim" } else if (target_environment == "device") { rust_abi_target = "aarch64-apple-tvos" - cargo_target_abi = "" } else { assert(false, "unsupported target_environment=$target_environment") } @@ -317,22 +283,18 @@ if (is_linux || is_chromeos) { } } else if (current_cpu == "arm") { rust_abi_target = "armv7s-apple-ios" - cargo_target_abi = "" } else if (current_cpu == "x64") { if (target_platform == "iphoneos") { if (target_environment == "simulator") { rust_abi_target = "x86_64-apple-ios" - cargo_target_abi = "sim" } else if (target_environment == "catalyst") { rust_abi_target = "x86_64-apple-ios-macabi" - cargo_target_abi = "macabi" } else { assert(false, "unsupported target_environment=$target_environment") } } else if (target_platform == "tvos") { if (target_environment == "simulator") { rust_abi_target = "x86_64-apple-tvos" - cargo_target_abi = "sim" } else { assert(false, "unsupported target_environment=$target_environment") } @@ -347,23 +309,18 @@ if (is_linux || is_chromeos) { } else if (is_mac) { if (current_cpu == "arm64") { rust_abi_target = "aarch64-apple-darwin" - cargo_target_abi = "" } else if (current_cpu == "x64") { rust_abi_target = "x86_64-apple-darwin" - cargo_target_abi = "" } else { assert(false, "Architecture not supported") } } else if (is_win) { if (current_cpu == "arm64") { rust_abi_target = "aarch64-pc-windows-msvc" - cargo_target_abi = "" } else if (current_cpu == "x64") { rust_abi_target = "x86_64-pc-windows-msvc" - cargo_target_abi = "" } else if (current_cpu == "x86") { rust_abi_target = "i686-pc-windows-msvc" - cargo_target_abi = "" } else { assert(false, "Architecture not supported") } diff --git a/naiveproxy/src/build/config/sanitizers/BUILD.gn b/naiveproxy/src/build/config/sanitizers/BUILD.gn index e2f39f029a..52ffb8d0e1 100644 --- a/naiveproxy/src/build/config/sanitizers/BUILD.gn +++ b/naiveproxy/src/build/config/sanitizers/BUILD.gn @@ -426,12 +426,16 @@ config("coverage_flags") { # well with `pc-table` instrumentation enabled by `fuzzer-no-link`. cflags += [ "-fno-sanitize-coverage=pc-table" ] } + if (is_android) { + cflags += [ "-fno-sanitize-coverage=stack-depth" ] + } } else { cflags += [ "-fsanitize-coverage=$sanitizer_coverage_flags", "-mllvm", "-sanitizer-coverage-prune-blocks=1", ] + if (current_cpu == "arm") { # http://crbug.com/517105 cflags += [ diff --git a/naiveproxy/src/build/config/sanitizers/sanitizers.gni b/naiveproxy/src/build/config/sanitizers/sanitizers.gni index e371f02882..4c7db89531 100644 --- a/naiveproxy/src/build/config/sanitizers/sanitizers.gni +++ b/naiveproxy/src/build/config/sanitizers/sanitizers.gni @@ -193,6 +193,11 @@ declare_args() { assert(!is_hwasan || (target_os == "android" && target_cpu == "arm64"), "HWASan only supported on Android ARM64 builds.") +if (is_asan && target_os == "android") { + print( + "Warning: is_asan is no longer supported on Android. It might work, but you'll probably have better luck with is_hwasan=true (which requires arm64). https://crbug.com/441905843") +} + assert( !(enable_fuzztest_fuzz && use_libfuzzer), "Can't specify enable_fuzztest_fuzz and use_libfuzzer. When libfuzzer is enabled, fuzztest executables automatically support --fuzz but provide output that's libfuzzer compatible.") diff --git a/naiveproxy/src/build/config/siso/README.md b/naiveproxy/src/build/config/siso/README.md index ff38eba475..e41e21d492 100644 --- a/naiveproxy/src/build/config/siso/README.md +++ b/naiveproxy/src/build/config/siso/README.md @@ -1,8 +1,8 @@ # Build config for Siso This directory contains configurations for -[siso](https://chromium.googlesource.com/infra/infra/+/refs/heads/main/go/src/infra/build/siso/) +[siso](https://chromium.googlesource.com/build/+/refs/heads/main/siso/) build tool. -Please refer to [the config specifications](https://chromium.googlesource.com/infra/infra/+/refs/heads/main/go/src/infra/build/siso/docs/starlark_config.md) in the Siso repo. +Please refer to [the config specifications](https://chromium.googlesource.com/build/+/refs/heads/main/siso/docs/starlark_config.md) in the Siso repo. diff --git a/naiveproxy/src/build/config/siso/android.star b/naiveproxy/src/build/config/siso/android.star index f6a1c3e6ba..7b7b8c42db 100644 --- a/naiveproxy/src/build/config/siso/android.star +++ b/naiveproxy/src/build/config/siso/android.star @@ -95,7 +95,7 @@ def __step_config(ctx, step_config): "*.svg", "*.xml", ], - "remote": remote_run, + "remote": remote_run and not config.get(ctx, "no-remote-javac"), "platform_ref": "large", "canonicalize_dir": True, "timeout": "2m", @@ -137,7 +137,7 @@ def __step_config(ctx, step_config): # However, this is harmful for remote build cache hits. "ignore_extra_input_pattern": ".*srcjars.*\\.java", "ignore_extra_output_pattern": ".*srcjars.*\\.java", - "remote": remote_run, + "remote": remote_run and not config.get(ctx, "no-remote-javac"), "platform_ref": "large", "canonicalize_dir": True, "timeout": "2m", @@ -156,7 +156,7 @@ def __step_config(ctx, step_config): "*.pak", "*.sql", ], - "remote": remote_run_static_analysis, + "remote": remote_run_static_analysis and not config.get(ctx, "no-remote-javac"), "platform_ref": "large", "canonicalize_dir": True, # obj/chrome/android/chrome_java__errorprone.stamp step takes too @@ -390,7 +390,7 @@ def __android_compile_java_handler(ctx, cmd): inputs = [] for i, arg in enumerate(cmd.args): - for k in ["--classpath=", "--bootclasspath=", "--processorpath="]: + for k in ["--classpath=", "--processorpath="]: if arg.startswith(k): arg = arg.removeprefix(k) fn, v = __filearg(ctx, arg) diff --git a/naiveproxy/src/build/config/siso/backend_config/README.md b/naiveproxy/src/build/config/siso/backend_config/README.md index 26175d4952..9308e52824 100644 --- a/naiveproxy/src/build/config/siso/backend_config/README.md +++ b/naiveproxy/src/build/config/siso/backend_config/README.md @@ -1,7 +1,7 @@ # Backend config for Siso This directory contains backend specific config for -[siso](https://chromium.googlesource.com/infra/infra/+/refs/heads/main/go/src/infra/build/siso/) +[siso](https://chromium.googlesource.com/build/+/refs/heads/main/siso/) build tool. User needs to add `backend.star` that provides `backend` module diff --git a/naiveproxy/src/build/config/siso/backend_config/template.star b/naiveproxy/src/build/config/siso/backend_config/template.star index 9bae3790a8..696f3569df 100644 --- a/naiveproxy/src/build/config/siso/backend_config/template.star +++ b/naiveproxy/src/build/config/siso/backend_config/template.star @@ -11,7 +11,7 @@ load("@builtin//struct.star", "module") def __platform_properties(ctx): # You can use ctx to access file by ctx.fs etc. - # See https://chromium.googlesource.com/infra/infra/+/refs/heads/main/go/src/infra/build/siso/docs/starlark_config.md#initialization + # See https://chromium.googlesource.com/build/+/refs/heads/main/siso/docs/starlark_config.md#initialization return { "default": { "OSFamily": "Linux", diff --git a/naiveproxy/src/build/config/siso/blink_all.star b/naiveproxy/src/build/config/siso/blink_all.star index 3c819d0536..2b2f071b67 100644 --- a/naiveproxy/src/build/config/siso/blink_all.star +++ b/naiveproxy/src/build/config/siso/blink_all.star @@ -39,6 +39,12 @@ def __step_config(ctx, step_config): # not specified in the build graph correctly. "output_local": True, }, + { + "name": "blink/build_web_idl_database", + "command_prefix": platform.python_bin + " ../../third_party/blink/renderer/bindings/scripts/build_web_idl_database.py", + "remote": True, + "timeout": "2m", + }, ]) return step_config diff --git a/naiveproxy/src/build/config/siso/clang_all.star b/naiveproxy/src/build/config/siso/clang_all.star index 86d61cc19d..aa929713e2 100644 --- a/naiveproxy/src/build/config/siso/clang_all.star +++ b/naiveproxy/src/build/config/siso/clang_all.star @@ -59,30 +59,6 @@ def __filegroups(ctx): "clang_rt.profile*.lib", ], }, - "third_party/cronet_android_mainline_clang/linux-amd64:headers": { - "type": "glob", - "includes": [ - "*.h", - "*.modulemap", - "bin/clang*", - ], - }, - "third_party/cronet_android_mainline_clang/linux-amd64:link": { - "type": "glob", - "includes": [ - "bin/clang*", - "bin/ld.lld", - "bin/lld", - "bin/llvm-nm", - "bin/llvm-objcopy", - "bin/llvm-readelf", - "bin/llvm-readobj", - "bin/llvm-strip", - "*.so", - "*.so.*", - "*.a", - ], - }, } if win_sdk.enabled(ctx): fg.update(win_sdk.filegroups(ctx)) @@ -90,71 +66,82 @@ def __filegroups(ctx): fg.update(mac_sdk.filegroups(ctx)) return fg -__input_deps = { - # need this because we use - # third_party/libc++/src/include:headers, - # but scandeps doesn't scan `__config` file, which uses - # `#include <__config_site>` - # also need `__assertion_handler`. b/321171148 - "third_party/libc++/src/include": [ - "buildtools/third_party/libc++:headers", - ], - "third_party/llvm-build/Release+Asserts/bin/clang": __clang_plugin_configs, - "third_party/llvm-build/Release+Asserts/bin/clang++": __clang_plugin_configs, - "third_party/llvm-build/Release+Asserts/bin/clang-cl": __clang_plugin_configs, - "third_party/llvm-build/Release+Asserts/bin/clang-cl.exe": __clang_plugin_configs, - "third_party/llvm-build/Release+Asserts/bin/lld-link": [ - "build/config/c++/libc++.natvis", - "build/win/as_invoker.manifest", - "build/win/common_controls.manifest", - "build/win/compatibility.manifest", - "build/win/require_administrator.manifest", - "build/win/segment_heap.manifest", - "remoting/host/win/dpi_aware.manifest", - "third_party/llvm-build/Release+Asserts/bin/lld", - "tools/win/DebugVisualizers/blink.natvis", - "tools/win/DebugVisualizers/chrome.natvis", - ], - "third_party/llvm-build/Release+Asserts/bin/lld-link.exe": [ - "build/config/c++/libc++.natvis", - "build/win/as_invoker.manifest", - "build/win/common_controls.manifest", - "build/win/compatibility.manifest", - "build/win/require_administrator.manifest", - "build/win/segment_heap.manifest", - "remoting/host/win/dpi_aware.manifest", - "third_party/llvm-build/Release+Asserts/bin/lld.exe", - "tools/win/DebugVisualizers/blink.natvis", - "tools/win/DebugVisualizers/chrome.natvis", - ], - "build/toolchain/gcc_solink_wrapper.py": [ - "build/toolchain/whole_archive.py", - "build/toolchain/wrapper_utils.py", - ], - "build/toolchain/gcc_solink_wrapper.py:link": [ - "build/toolchain/gcc_solink_wrapper.py", - "build/toolchain/whole_archive.py", - "build/toolchain/wrapper_utils.py", - ], - "build/toolchain/gcc_link_wrapper.py": [ - "build/toolchain/whole_archive.py", - "build/toolchain/wrapper_utils.py", - ], - "build/toolchain/gcc_link_wrapper.py:link": [ - "build/toolchain/gcc_link_wrapper.py", - "build/toolchain/whole_archive.py", - "build/toolchain/wrapper_utils.py", - ], - "build/toolchain/apple/linker_driver.py:link": [ - "build/toolchain/apple/linker_driver.py", - "build/toolchain/whole_archive.py", - ], - "build/toolchain/apple/solink_driver.py:link": [ - "build/toolchain/apple/linker_driver.py", - "build/toolchain/apple/solink_driver.py", - "build/toolchain/whole_archive.py", - ], -} +def __input_deps(ctx): + build_dir = ctx.fs.canonpath(".") + + return { + # need this because we use + # third_party/libc++/src/include:headers, + # but scandeps doesn't scan `__config` file, which uses + # `#include <__config_site>` + # also need `__assertion_handler`. b/321171148 + "third_party/libc++/src/include": [ + "buildtools/third_party/libc++:headers", + ], + # This is necessary for modules build where libc++ headers are copied to build directory. + path.join(build_dir, "gen/third_party/libc++/src/include") + ":headers": [ + path.join(build_dir, "gen/third_party/libc++/src/include/module.modulemap"), + path.join(build_dir, "phony/buildtools/third_party/libc++/copy_custom_headers") + ":inputs", + path.join(build_dir, "phony/buildtools/third_party/libc++/copy_libcxx_headers") + ":inputs", + ], + "third_party/llvm-build/Release+Asserts/bin/clang": __clang_plugin_configs, + "third_party/llvm-build/Release+Asserts/bin/clang++": __clang_plugin_configs, + "third_party/llvm-build/Release+Asserts/bin/clang-cl": __clang_plugin_configs, + "third_party/llvm-build/Release+Asserts/bin/clang-cl.exe": __clang_plugin_configs, + "third_party/llvm-build/Release+Asserts/bin/lld-link": [ + "build/config/c++/libc++.natvis", + "build/win/as_invoker.manifest", + "build/win/common_controls.manifest", + "build/win/compatibility.manifest", + "build/win/require_administrator.manifest", + "build/win/segment_heap.manifest", + "remoting/host/win/dpi_aware.manifest", + "third_party/llvm-build/Release+Asserts/bin/lld", + "tools/win/DebugVisualizers/absl.natvis", + "tools/win/DebugVisualizers/blink.natvis", + "tools/win/DebugVisualizers/chrome.natvis", + ], + "third_party/llvm-build/Release+Asserts/bin/lld-link.exe": [ + "build/config/c++/libc++.natvis", + "build/win/as_invoker.manifest", + "build/win/common_controls.manifest", + "build/win/compatibility.manifest", + "build/win/require_administrator.manifest", + "build/win/segment_heap.manifest", + "remoting/host/win/dpi_aware.manifest", + "third_party/llvm-build/Release+Asserts/bin/lld.exe", + "tools/win/DebugVisualizers/absl.natvis", + "tools/win/DebugVisualizers/blink.natvis", + "tools/win/DebugVisualizers/chrome.natvis", + ], + "build/toolchain/gcc_solink_wrapper.py": [ + "build/toolchain/whole_archive.py", + "build/toolchain/wrapper_utils.py", + ], + "build/toolchain/gcc_solink_wrapper.py:link": [ + "build/toolchain/gcc_solink_wrapper.py", + "build/toolchain/whole_archive.py", + "build/toolchain/wrapper_utils.py", + ], + "build/toolchain/gcc_link_wrapper.py": [ + "build/toolchain/whole_archive.py", + "build/toolchain/wrapper_utils.py", + ], + "build/toolchain/gcc_link_wrapper.py:link": [ + "build/toolchain/gcc_link_wrapper.py", + "build/toolchain/whole_archive.py", + "build/toolchain/wrapper_utils.py", + ], + "build/toolchain/apple/linker_driver.py:link": [ + "build/toolchain/apple/linker_driver.py", + "build/toolchain/whole_archive.py", + ], + "build/toolchain/apple/solink_driver.py:link": [ + "build/toolchain/apple/linker_driver.py", + "build/toolchain/apple/solink_driver.py", + "build/toolchain/whole_archive.py", + ], + } def __lld_link(ctx, cmd): # Replace thin archives with /start-lib ... /end-lib in rsp file. diff --git a/naiveproxy/src/build/config/siso/clang_code_coverage_wrapper.star b/naiveproxy/src/build/config/siso/clang_code_coverage_wrapper.star index 4a63518583..c46e6c7f68 100644 --- a/naiveproxy/src/build/config/siso/clang_code_coverage_wrapper.star +++ b/naiveproxy/src/build/config/siso/clang_code_coverage_wrapper.star @@ -37,16 +37,15 @@ _DEFAULT_COVERAGE_EXCLUSION_LIST = [ "../../base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.cc", "../../base/allocator/partition_allocator/src/partition_alloc/address_space_randomization_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/allocation_guard.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/allocator_config.cc", "../../base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.cc", "../../base/allocator/partition_allocator/src/partition_alloc/compressed_pointer_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.cc", "../../base/allocator/partition_allocator/src/partition_alloc/extended_api.cc", - "../../base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/gwp_asan_support.cc", "../../base/allocator/partition_allocator/src/partition_alloc/hardening_unittest.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/in_slot_metadata.cc", "../../base/allocator/partition_allocator/src/partition_alloc/internal_allocator.cc", - "../../base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.cc", - "../../base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.cc", "../../base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/oom_callback.cc", @@ -59,6 +58,8 @@ _DEFAULT_COVERAGE_EXCLUSION_LIST = [ "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits_pa_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export_pa_unittest.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_map_pa_unittest.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_tree_pa_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu_pa_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.cc", @@ -92,6 +93,9 @@ _DEFAULT_COVERAGE_EXCLUSION_LIST = [ "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_pa_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_posix.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_win.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/algorithm_pa_unittest.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/functional_pa_unittest.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/ranges_pa_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_pa_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_win.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.cc", @@ -102,6 +106,7 @@ _DEFAULT_COVERAGE_EXCLUSION_LIST = [ "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf_pa_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util_pa_unittest.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/template_util_pa_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations_pa_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_android_for_testing.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.cc", @@ -122,6 +127,7 @@ _DEFAULT_COVERAGE_EXCLUSION_LIST = [ "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_perftest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_bucket.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/partition_cookie.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.cc", "../../base/allocator/partition_allocator/src/partition_alloc/partition_lock_perftest.cc", @@ -135,12 +141,16 @@ _DEFAULT_COVERAGE_EXCLUSION_LIST = [ "../../base/allocator/partition_allocator/src/partition_alloc/pointers/instance_tracer.cc", "../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.cc", "../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_counting_impl_for_test.cc", "../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.cc", "../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/random.cc", "../../base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.cc", "../../base/allocator/partition_allocator/src/partition_alloc/reverse_bytes_unittest.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine_support.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine_unittest.cc", "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_android.cc", "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_apple.cc", "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.cc", @@ -165,6 +175,7 @@ _DEFAULT_COVERAGE_EXCLUSION_LIST = [ "../../base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.cc", "../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/arm64/push_registers_asm.cc", "../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/arm/push_registers_asm.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/loong64/push_registers_asm.cc", "../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/riscv64/push_registers_asm.cc", "../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/x64/push_registers_asm.cc", "../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/x86/push_registers_asm.cc", diff --git a/naiveproxy/src/build/config/siso/clang_linux.star b/naiveproxy/src/build/config/siso/clang_linux.star index ea1bb86262..37106ec6cd 100644 --- a/naiveproxy/src/build/config/siso/clang_linux.star +++ b/naiveproxy/src/build/config/siso/clang_linux.star @@ -97,6 +97,7 @@ def __step_config(ctx, step_config): # source_root is set only for CrOS's chroot builds that use # rbe_exec_root="/". root = gn_logs_data.get("source_root", "") + step_config["input_deps"].update({ "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot:headers": [ "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include:include", @@ -129,7 +130,7 @@ def __step_config(ctx, step_config): for cpu in target_cpus: __add_sysroot_for_target_cpu(step_config, cpu) - step_config["input_deps"].update(clang_all.input_deps) + step_config["input_deps"].update(clang_all.input_deps(ctx)) step_config["rules"].extend(clang_unix.rules(ctx)) if win_sdk.enabled(ctx): diff --git a/naiveproxy/src/build/config/siso/clang_mac.star b/naiveproxy/src/build/config/siso/clang_mac.star index a79351572e..c8a7acadc2 100644 --- a/naiveproxy/src/build/config/siso/clang_mac.star +++ b/naiveproxy/src/build/config/siso/clang_mac.star @@ -36,7 +36,7 @@ def __step_config(ctx, step_config): "clang": reproxy_config["platform"], "clang_large": largePlatform, }) - step_config["input_deps"].update(clang_all.input_deps) + step_config["input_deps"].update(clang_all.input_deps(ctx)) clang_rules = clang_unix.rules(ctx) diff --git a/naiveproxy/src/build/config/siso/clang_unix.star b/naiveproxy/src/build/config/siso/clang_unix.star index ab469f7310..7c83c0a95f 100644 --- a/naiveproxy/src/build/config/siso/clang_unix.star +++ b/naiveproxy/src/build/config/siso/clang_unix.star @@ -12,31 +12,7 @@ load("./config.star", "config") load("./gn_logs.star", "gn_logs") load("./win_sdk.star", "win_sdk") -def __add_generated_libcxx_headers(ctx, cmd): - """Adds libc++ headers as tool inputs for clang compile actions. - - This is needed because libc++ headers in the build directory are not always - discovered by the precomputed tree and scandeps. It identifies them using - `-isystem` flags and `libcxx_headers.gni`. - """ - - libcxx_headers = [] - for line in str(ctx.fs.read("buildtools/third_party/libc++/libcxx_headers.gni")).split("\n"): - if "third_party/libc++/src/include" in line: - libcxx_headers.append(line.split("src/include/")[1].removesuffix("\",")) - - tool_inputs = [] - for arg in cmd.args: - isystem = arg.removeprefix("-isystem") - if arg == isystem or "third_party/libc++/src/include" not in isystem: - continue - isystem = ctx.fs.canonpath(isystem) - for header in libcxx_headers: - tool_inputs.append(path.join(isystem, header)) - ctx.actions.fix(tool_inputs = cmd.tool_inputs + tool_inputs) - def __clang_compile_coverage(ctx, cmd): - __add_generated_libcxx_headers(ctx, cmd) clang_command = clang_code_coverage_wrapper.run(ctx, list(cmd.args)) ctx.actions.fix(args = clang_command) @@ -98,7 +74,6 @@ def __clang_link(ctx, cmd): ctx.actions.fix(inputs = cmd.inputs + inputs) __handlers = { - "add_generated_libcxx_headers": __add_generated_libcxx_headers, "clang_compile_coverage": __clang_compile_coverage, "clang_link": __clang_link, } @@ -111,6 +86,8 @@ def __rules(ctx): canonicalize_dir = not input_root_absolute_path canonicalize_dir_for_objc = not input_root_absolute_path_for_objc + use_thin_lto = gn_logs_data.get("use_thin_lto") == "true" + rules = [] if win_sdk.enabled(ctx): rules.extend([ @@ -225,7 +202,6 @@ def __rules(ctx): "third_party/llvm-build/Release+Asserts/bin/clang++", ], "exclude_input_patterns": ["*.stamp"], - "handler": "add_generated_libcxx_headers", "remote": True, "input_root_absolute_path": input_root_absolute_path, "canonicalize_dir": canonicalize_dir, @@ -265,7 +241,6 @@ def __rules(ctx): "third_party/llvm-build/Release+Asserts/bin/clang++", ], "exclude_input_patterns": ["*.stamp"], - "handler": "add_generated_libcxx_headers", "remote": True, "timeout": "2m", "input_root_absolute_path": input_root_absolute_path_for_objc, @@ -425,7 +400,10 @@ def __rules(ctx): "remote": config.get(ctx, "remote-link"), "canonicalize_dir": True, "platform_ref": "large", - "timeout": "10m", + # Remote linking with ThinLTO takes much longer. + # Linking browser_tests takes 50m locally. On remote with gVisor, + # it takes even more. + "timeout": "80m" if use_thin_lto else "10m", }, ]) return rules diff --git a/naiveproxy/src/build/config/siso/clang_windows.star b/naiveproxy/src/build/config/siso/clang_windows.star index f1deb0e066..369a8c86c5 100644 --- a/naiveproxy/src/build/config/siso/clang_windows.star +++ b/naiveproxy/src/build/config/siso/clang_windows.star @@ -49,7 +49,7 @@ def __step_config(ctx, step_config): "clang-cl_large": largePlatform, "lld-link": largePlatform, }) - step_config["input_deps"].update(clang_all.input_deps) + step_config["input_deps"].update(clang_all.input_deps(ctx)) # when win_toolchain_dir is unknown (e.g. # missing build/win_toolchain.json), we can't run diff --git a/naiveproxy/src/build/config/siso/config.star b/naiveproxy/src/build/config/siso/config.star index 4b0e4f58ad..9ff86a8625 100644 --- a/naiveproxy/src/build/config/siso/config.star +++ b/naiveproxy/src/build/config/siso/config.star @@ -31,6 +31,10 @@ __KNOWN_CONFIG_OPTIONS = [ # This is useful when remote actions are expected to take longer than # the configured timeouts. e.g. remote linking for official builds. "no-remote-timeout", + + # Run javac commands locally. Needed to get hints about how to fix missing + # GN deps. + "no-remote-javac", ] def __check(ctx): diff --git a/naiveproxy/src/build/config/siso/configure_siso.py b/naiveproxy/src/build/config/siso/configure_siso.py index 631054c8ff..dce3f81425 100755 --- a/naiveproxy/src/build/config/siso/configure_siso.py +++ b/naiveproxy/src/build/config/siso/configure_siso.py @@ -49,7 +49,19 @@ def ReadConfig(): def main(): parser = argparse.ArgumentParser(description="configure siso") - parser.add_argument("--rbe_instance", help="RBE instance to use for Siso") + parser.add_argument("--rbe_instance", + help="RBE instance to use for Siso." + + "Ignored if --reapi_address is set for non-RBE address.") + parser.add_argument("--reapi_instance", + default="", + help="REAPI instance to use for Siso.") + parser.add_argument("--reapi_address", + help="REAPI address to use for " + + "Siso. If set for non-RBE address, rbe_instance is " + + "ignored.") + parser.add_argument("--reapi_backend_config_path", + help="REAPI backend config path. relative to " + + "backend_config dir or absolute path.") parser.add_argument("--get-siso-project", help="Print the currently configured siso project to " "stdout", @@ -64,32 +76,44 @@ def main(): return 0 project = None - rbe_instance = args.rbe_instance - if rbe_instance: - elems = rbe_instance.split("/") + reapi_instance = args.reapi_instance + reapi_address = args.reapi_address + if not reapi_address or \ + reapi_address.endswith("remotebuildexecution.googleapis.com:443") and \ + args.rbe_instance: + elems = args.rbe_instance.split("/") if len(elems) == 4 and elems[0] == "projects": project = elems[1] - rbe_instance = elems[-1] + reapi_instance = elems[-1] with open(SISO_ENV, "w") as f: if project: f.write("%s=%s\n" % (SISO_PROJECT_CFG, project)) - if rbe_instance: - f.write("SISO_REAPI_INSTANCE=%s\n" % rbe_instance) + f.write("SISO_REAPI_INSTANCE=%s\n" % reapi_instance) + if reapi_address: + f.write("SISO_REAPI_ADDRESS=%s\n" % reapi_address) - if project in _KNOWN_GOOGLE_PROJECTS: + reapi_backend_config_path = args.reapi_backend_config_path + if project and not reapi_backend_config_path: + if project in _KNOWN_GOOGLE_PROJECTS: + reapi_backend_config_path = _GOOGLE_STAR + elif project.startswith('chromeos-') and project.endswith('-bot'): + reapi_backend_config_path = _GOOGLE_CROS_STAR + + if reapi_backend_config_path: + if not os.path.isabs(reapi_backend_config_path): + reapi_backend_config_path = os.path.join(THIS_DIR, "backend_config", + reapi_backend_config_path) if os.path.exists(_BACKEND_STAR): os.remove(_BACKEND_STAR) - shutil.copy2(_GOOGLE_STAR, _BACKEND_STAR) - elif project.startswith('chromeos-') and project.endswith('-bot'): - if os.path.exists(_BACKEND_STAR): - os.remove(_BACKEND_STAR) - shutil.copy2(_GOOGLE_CROS_STAR, _BACKEND_STAR) + shutil.copy2(reapi_backend_config_path, _BACKEND_STAR) if not os.path.exists(_BACKEND_STAR): - print('Need to provide {} for your backend {}'.format( - _BACKEND_STAR, args.rbe_instance), - file=sys.stderr) + print( + ('Need to provide {} (by reapi_backend_config_path custom_var) ' + + 'for your backend {} instance={}').format(_BACKEND_STAR, reapi_address, + reapi_instance), + file=sys.stderr) return 1 return 0 diff --git a/naiveproxy/src/build/config/siso/cros.star b/naiveproxy/src/build/config/siso/cros.star index 55d3e21811..d605febe26 100644 --- a/naiveproxy/src/build/config/siso/cros.star +++ b/naiveproxy/src/build/config/siso/cros.star @@ -9,118 +9,25 @@ load("@builtin//path.star", "path") load("@builtin//struct.star", "module") load("./config.star", "config") -def __cros_gn_args(ctx): - """Returns all CrOS specific toolchain and sysroot GN args.""" +def __cros_sysroot(ctx): + """Returns all CrOS specific sysroot GN args.""" if not "args.gn" in ctx.metadata: print("no args.gn") - return {} + return gn_args = gn.args(ctx) if gn_args.get("target_os") != '"chromeos"': - return {} - - cros_args = {} - for arg in [ - "cros_target_ar", - "cros_target_cc", - "cros_target_cxx", - "cros_target_ld", - "cros_target_nm", - "cros_target_readelf", - "target_sysroot", - ]: - if arg not in gn_args: - print("no " + arg) - continue - fp = ctx.fs.canonpath(gn_args.get(arg).strip('"')) - cros_args[arg] = fp - if arg == "cros_target_cxx": - cros_args["cros_toolchain"] = path.dir(path.dir(fp)) - return cros_args + return + arg = "target_sysroot" + if arg not in gn_args: + return + fp = ctx.fs.canonpath(gn_args.get(arg).strip('"')) + if "chrome-sdk" not in fp: + return + return fp def __filegroups(ctx): fg = {} - cros_args = __cros_gn_args(ctx) - toolchain = cros_args.get("cros_toolchain") - if toolchain: - print("toolchain = %s" % toolchain) - if toolchain == "/usr": - # cros chroot ebuild. - fg[toolchain + ":headers"] = { - "type": "glob", - "includes": [ - "include/*.h", - "include/*/*.h", - "include/*/*/*.h", - "include/*/*/*/*.h", - "include/c++/*/*", - "bin/ccache", - "bin/*clang*", - "bin/sysroot_wrapper*", - "lib", - "lib64/*.so.*", - "lib64/clang/*/include/*", - "lib64/clang/*/include/*/*", - "lib64/*/include/*.h", - ], - } - fg["/lib64:solibs"] = { - "type": "glob", - "includes": [ - "*.so.*", - ], - } - else: - fg[toolchain + ":headers"] = { - "type": "glob", - # TODO: Avoid using "*" to include only required files. - "includes": ["*"], - } - fg[path.join(toolchain, "bin") + ":llddeps"] = { - "type": "glob", - "includes": [ - "*lld*", - "*clang*", - "llvm-nm*", - "llvm-readelf*", - "llvm-readobj*", - ], - } - fg[path.join(toolchain, "usr/bin") + ":llddeps"] = { - "type": "glob", - "includes": [ - "*lld*", - "*clang*", - "sysroot_wrapper*", - "llvm-nm*", - "llvm-readelf*", - "llvm-readobj*", - ], - } - fg[path.join(toolchain, "lib") + ":libs"] = { - "type": "glob", - "includes": ["*.so", "*.so.*", "*.a", "*.o"], - } - fg[path.join(toolchain, "lib64") + ":libs"] = { - "type": "glob", - "includes": ["*.so", "*.so.*", "*.a", "*.o"], - } - fg[path.join(toolchain, "usr/lib64") + ":libs"] = { - "type": "glob", - "includes": ["*.so", "*.so.*", "*.a", "*.o", "cfi_ignorelist.txt"], - } - fg[path.join(toolchain, "usr/armv7a-cros-linux-gnueabihf") + ":libs"] = { - "type": "glob", - "includes": ["*.so", "*.so.*", "*.a", "*.o"], - } - fg[path.join(toolchain, "usr/bin") + ":clang"] = { - "type": "glob", - "includes": [ - "*clang*", - "sysroot_wrapper.hardened.ccache*", - ], - } - - sysroot = cros_args.get("target_sysroot") + sysroot = __cros_sysroot(ctx) if sysroot: print("sysroot = %s" % sysroot) fg[path.join(sysroot, "usr/include") + ":include"] = { @@ -144,190 +51,16 @@ def __filegroups(ctx): return fg def __step_config(ctx, step_config): - cros_args = __cros_gn_args(ctx) - toolchain = cros_args.get("cros_toolchain") - sysroot = cros_args.get("target_sysroot") - if not (toolchain and sysroot): + sysroot = __cros_sysroot(ctx) + if not sysroot: return step_config - cros_target_cxx = cros_args.get("cros_target_cxx") - if cros_target_cxx: - if path.isabs(cros_target_cxx): - # cros chroot ebuild - step_config["rules"].extend([ - { - "name": "clang-cros/cxx", - "action": "(.*_)?cxx", - "remote": True, - "inputs": [ - cros_target_cxx, - ], - # fast-deps is not safe with cros toolchain. crbug.com/391160876 - "no_fast_deps": True, - "timeout": "5m", - }, - ]) - step_config["input_deps"].update({ - cros_target_cxx: [ - "/lib", - "/lib64:solibs", - ], - }) - else: - step_config["rules"].extend([ - { - "name": "clang-cros/cxx", - "action": "(.*_)?cxx", - "command_prefix": path.join("../../", cros_target_cxx), - "remote": True, - # fast-deps is not safe with cros toolchain. crbug.com/391160876 - "no_fast_deps": True, - "canonicalize_dir": True, - "timeout": "5m", - }, - ]) - - cros_target_cc = cros_args.get("cros_target_cc") - if cros_target_cc: - if path.isabs(cros_target_cc): - # cros chroot ebuild - step_config["rules"].extend([ - { - "name": "clang-cros/cc", - "action": "(.*_)?cc", - "remote": True, - "inputs": [ - cros_target_cc, - ], - # fast-deps is not safe with cros toolchain. crbug.com/391160876 - "no_fast_deps": True, - "timeout": "5m", - }, - ]) - step_config["input_deps"].update({ - cros_target_cc: [ - "/lib", - "/lib64:solibs", - ], - }) - else: - step_config["rules"].extend([ - { - "name": "clang-cros/cc", - "action": "(.*_)?cc", - "command_prefix": path.join("../../", cros_target_cc), - "remote": True, - # fast-deps is not safe with cros toolchain. crbug.com/391160876 - "no_fast_deps": True, - "canonicalize_dir": True, - "timeout": "5m", - }, - ]) - - cros_target_ar = cros_args.get("cros_target_ar") - if cros_target_ar: - step_config["rules"].extend([ - { - "name": "clang-cros/alink/llvm-ar", - # Other alink steps should use clang/alink/llvm-ar rule. - "action": "(target_with_system_allocator_)?alink", - "inputs": [ - cros_target_ar, - ], - "exclude_input_patterns": [ - "*.cc", - "*.h", - "*.js", - "*.pak", - "*.py", - ], - "handler": "lld_thin_archive", - "remote": config.get(ctx, "remote-link"), - "canonicalize_dir": True, - "timeout": "5m", - "platform_ref": "large", - "accumulate": True, - }, - ]) - step_config["input_deps"].update({ - cros_target_ar: [ - path.join(toolchain, "bin/llvm-ar.elf"), - path.join(toolchain, "lib") + ":libs", - path.join(toolchain, "usr/lib64") + ":libs", - ], - }) - - step_config["rules"].extend([ - { - "name": "clang-cros/solink/gcc_solink_wrapper", - "action": "(target_with_system_allocator_)?solink", - "command_prefix": "\"python3\" \"../../build/toolchain/gcc_solink_wrapper.py\"", - "inputs": [ - "build/toolchain/gcc_solink_wrapper.py", - path.join(toolchain, "bin/ld.lld"), - ], - "exclude_input_patterns": [ - "*.cc", - "*.h", - "*.js", - "*.pak", - "*.py", - ], - "remote": config.get(ctx, "remote-link"), - # TODO: Do not use absolute paths for custom toolchain/sysroot GN - # args. - "input_root_absolute_path": True, - "platform_ref": "large", - "timeout": "2m", - }, - { - "name": "clang-cros/link/gcc_link_wrapper", - "action": "(target_with_system_allocator_)?link", - "command_prefix": "\"python3\" \"../../build/toolchain/gcc_link_wrapper.py\"", - "handler": "clang_link", - "inputs": [ - "build/toolchain/gcc_link_wrapper.py", - path.join(toolchain, "bin/ld.lld"), - ], - "exclude_input_patterns": [ - "*.cc", - "*.h", - "*.js", - "*.pak", - "*.py", - ], - "remote": config.get(ctx, "remote-link"), - "canonicalize_dir": True, - "platform_ref": "large", - "timeout": "10m", - }, - ]) step_config["input_deps"].update({ sysroot + ":headers": [ path.join(sysroot, "usr/include") + ":include", path.join(sysroot, "usr/lib") + ":headers", path.join(sysroot, "usr/lib64") + ":headers", ], - path.join(toolchain, "bin/llvm-ar"): [ - path.join(toolchain, "bin/llvm-ar.elf"), - path.join(toolchain, "lib") + ":libs", - path.join(toolchain, "usr/lib64") + ":libs", - ], - path.join(toolchain, "bin/ld.lld"): [ - path.join(toolchain, "bin:llddeps"), - path.join(toolchain, "lib") + ":libs", - path.join(toolchain, "lib64") + ":libs", - path.join(toolchain, "usr/bin:clang"), - path.join(toolchain, "usr/lib64") + ":libs", - sysroot + ":libs", - ], - toolchain + ":link": [ - path.join(toolchain, "bin") + ":llddeps", - path.join(toolchain, "lib") + ":libs", - path.join(toolchain, "lib64") + ":libs", - path.join(toolchain, "usr/bin") + ":llddeps", - path.join(toolchain, "usr/lib64") + ":libs", - ], sysroot + ":link": [ sysroot + ":libs", ], diff --git a/naiveproxy/src/build/config/siso/mac.star b/naiveproxy/src/build/config/siso/mac.star index 17d116bb2f..26a6b41e71 100644 --- a/naiveproxy/src/build/config/siso/mac.star +++ b/naiveproxy/src/build/config/siso/mac.star @@ -4,6 +4,7 @@ # found in the LICENSE file. """Siso configuration for macOS.""" +load("@builtin//path.star", "path") load("@builtin//struct.star", "module") load("./clang_mac.star", "clang") load("./config.star", "config") @@ -25,8 +26,31 @@ def __codesign(ctx, cmd): bundle_path = ctx.fs.canonpath(cmd.args[-1]) ctx.actions.fix(reconcile_outputdirs = [bundle_path]) +def __package_framework(ctx, cmd): + # package_framework.py updates symlink, but use only stamp file + # for output. + # https://source.chromium.org/chromium/chromium/src/+/main:build/config/mac/rules.gni;l=274;bpv=1 + # siso would miss symlink update, so would fail copy_bundle_data + # in later step. + framework_dir = "" + outputs = [] + flag = "" + for i, arg in enumerate(cmd.args): + if flag == "--contents" and not arg.startswith("-"): + outputs.append(path.join(framework_dir, arg)) + continue + flag = "" + if arg == "--framework": + framework_dir = ctx.fs.canonpath(cmd.args[i + 1]) + outputs.append(path.join(framework_dir, "Versions", "Current")) + continue + if arg == "--contents": + flag = arg + ctx.actions.fix(outputs = cmd.outputs + outputs) + __handlers = { "codesign": __codesign, + "package_framework": __package_framework, } __handlers.update(clang.handlers) __handlers.update(typescript.handlers) @@ -41,6 +65,11 @@ def __step_config(ctx, step_config): "command_prefix": "python3 ../../build/config/apple/codesign.py ", "handler": "codesign", }, + { + "name": "package_framework", + "command_prefix": "python3 ../../build/config/mac/package_framework.py ", + "handler": "package_framework", + }, ]) return step_config diff --git a/naiveproxy/src/build/config/siso/rust.star b/naiveproxy/src/build/config/siso/rust.star index 9656b4f0fb..5d9a6293c7 100644 --- a/naiveproxy/src/build/config/siso/rust.star +++ b/naiveproxy/src/build/config/siso/rust.star @@ -220,7 +220,7 @@ def __step_config(ctx, step_config): "handler": "rust_link_handler", "deps": "none", # disable gcc scandeps "remote": remote_link, - # "canonicalize_dir": True, # TODO(b/300352286) + "canonicalize_dir": True, "timeout": "2m", "platform_ref": platform_ref, }, @@ -232,7 +232,7 @@ def __step_config(ctx, step_config): "handler": "rust_link_handler", "deps": "none", # disable gcc scandeps "remote": remote_link, - # "canonicalize_dir": True, # TODO(b/300352286) + "canonicalize_dir": True, "timeout": "2m", "platform_ref": platform_ref, }, @@ -243,7 +243,7 @@ def __step_config(ctx, step_config): "indirect_inputs": rust_indirect_inputs, "handler": "rust_link_handler", "deps": "none", # disable gcc scandeps - # "canonicalize_dir": True, # TODO(b/300352286) + "canonicalize_dir": True, "remote": remote_link, "timeout": "2m", "platform_ref": platform_ref, @@ -255,7 +255,7 @@ def __step_config(ctx, step_config): "indirect_inputs": rust_indirect_inputs, "deps": "none", # disable gcc scandeps "remote": remote, - # "canonicalize_dir": True, # TODO(b/300352286) + "canonicalize_dir": True, "timeout": "2m", "platform_ref": platform_ref, }, @@ -266,7 +266,7 @@ def __step_config(ctx, step_config): "indirect_inputs": rust_indirect_inputs, "deps": "none", # disable gcc scandeps "remote": remote, - # "canonicalize_dir": True, # TODO(b/300352286) + "canonicalize_dir": True, "timeout": "2m", "platform_ref": platform_ref, }, @@ -279,7 +279,7 @@ def __step_config(ctx, step_config): ], "handler": "rust_build_handler", "remote": remote and config.get(ctx, "cog"), - "input_root_absolute_path": True, + "canonicalize_dir": True, "timeout": "2m", }, { @@ -290,7 +290,7 @@ def __step_config(ctx, step_config): "third_party/rust-toolchain/lib/rustlib:rlib", ], "remote": remote and config.get(ctx, "cog"), - "input_root_absolute_path": True, + "canonicalize_dir": True, "timeout": "2m", }, { diff --git a/naiveproxy/src/build/config/squid/BUILD.gn b/naiveproxy/src/build/config/squid/BUILD.gn new file mode 100644 index 0000000000..695081bb3c --- /dev/null +++ b/naiveproxy/src/build/config/squid/BUILD.gn @@ -0,0 +1,11 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/buildflag_header.gni") +import("//build/config/squid/buildflags.gni") + +buildflag_header("buildflags") { + header = "buildflags.h" + flags = [ "PLATFORM_SQUID=$is_squid" ] +} diff --git a/naiveproxy/src/build/config/squid/README.md b/naiveproxy/src/build/config/squid/README.md new file mode 100644 index 0000000000..d4a170e9a0 --- /dev/null +++ b/naiveproxy/src/build/config/squid/README.md @@ -0,0 +1,3 @@ +# Squid GN Build Flags +## is_squid (BUILDFLAG(PLATFORM_SQUID)) +Flag for building chromium for Squid devices. diff --git a/naiveproxy/src/build/config/squid/buildflags.gni b/naiveproxy/src/build/config/squid/buildflags.gni new file mode 100644 index 0000000000..e431dd4768 --- /dev/null +++ b/naiveproxy/src/build/config/squid/buildflags.gni @@ -0,0 +1,8 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +declare_args() { + # True if building Squid devices. + is_squid = false +} diff --git a/naiveproxy/src/build/config/unsafe_buffers_paths.txt b/naiveproxy/src/build/config/unsafe_buffers_paths.txt index 57c1d12d18..4433777ae4 100644 --- a/naiveproxy/src/build/config/unsafe_buffers_paths.txt +++ b/naiveproxy/src/build/config/unsafe_buffers_paths.txt @@ -4,10 +4,13 @@ # See `docs/unsafe_buffers.md`. -# Checks to enable +# Checks to enable. .buffers,libc -# Directories to exempt from checks +# Path to source root from the directory containing this file. +$../../ + +# Directories to exempt from checks, relative to source root. -base/third_party/ -codelabs/ # Examples, keep simple. -chrome/browser/platform_experience/win/ diff --git a/naiveproxy/src/build/config/warning_suppression.txt b/naiveproxy/src/build/config/warning_suppression.txt index d1e75ad43d..5e3d46f6e1 100644 --- a/naiveproxy/src/build/config/warning_suppression.txt +++ b/naiveproxy/src/build/config/warning_suppression.txt @@ -45,3 +45,25 @@ src:*{/,\\}third_party{/,\\}nearby{/,\\}* src:*{/,\\}third_party{/,\\}* # v8's build system isn't amenable to fixes: https://crbug.com/408259026 src:*{/,\\}v8{/,\\}* + +[exit-time-destructors] +src:*{/,\\}third_party{/,\\}angle{/,\\}* +src:*{/,\\}third_party{/,\\}crashpad{/,\\}crashpad{/,\\}third_party{/,\\}cpp-httplib{/,\\}* +src:*{/,\\}third_party{/,\\}crc32c{/,\\}src{/,\\}src{/,\\}* +src:*{/,\\}third_party{/,\\}dawn{/,\\}* +src:*{/,\\}third_party{/,\\}fuzztest{/,\\}src{/,\\}* +src:*{/,\\}third_party{/,\\}gemmlowp{/,\\}* +src:*{/,\\}third_party{/,\\}googletest{/,\\}src{/,\\}googlemock{/,\\}src{/,\\}* +src:*{/,\\}third_party{/,\\}grpc{/,\\}source{/,\\}src{/,\\}* +src:*{/,\\}third_party{/,\\}libprotobuf-mutator{/,\\}src{/,\\}src{/,\\}libfuzzer{/,\\}* +src:*{/,\\}third_party{/,\\}openscreen{/,\\}src{/,\\}* +src:*{/,\\}third_party{/,\\}openxr{/,\\}src{/,\\}src{/,\\}* +src:*{/,\\}third_party{/,\\}skia{/,\\}tools{/,\\}* +src:*{/,\\}third_party{/,\\}spirv-tools{/,\\}* +src:*{/,\\}third_party{/,\\}swiftshader{/,\\}* +src:*{/,\\}third_party{/,\\}tflite{/,\\}src{/,\\}third_party{/,\\}xla{/,\\}* +src:*{/,\\}third_party{/,\\}vulkan-utility-libraries{/,\\}* +src:*{/,\\}third_party{/,\\}webrtc{/,\\}* +src:*{/,\\}third_party{/,\\}webrtc_overrides{/,\\}test{/,\\}* +# TODO(crbug.com/439492886): This suppression must be fixed internally. +src:*{/,\\}chrome{/,\\}browser{/,\\}platform_experience{/,\\}* diff --git a/naiveproxy/src/build/config/win/BUILD.gn b/naiveproxy/src/build/config/win/BUILD.gn index eae6724d4a..7f8aa872e6 100644 --- a/naiveproxy/src/build/config/win/BUILD.gn +++ b/naiveproxy/src/build/config/win/BUILD.gn @@ -398,10 +398,7 @@ config("cfi_linker") { # unnecessarily, even if advapi32.dll itself is loaded. # # This config applies to chrome.exe, chrome.dll, chrome_elf.dll (& others). -# -# This config should also be used for any test binary whose goal is to run -# tests with the full browser. -config("delayloads") { +config("delayloads_except_dbghelp") { ldflags = [ "/DELAYLOAD:api-ms-win-core-synch-l1-2-0.dll", "/DELAYLOAD:api-ms-win-core-winrt-error-l1-1-0.dll", @@ -432,6 +429,7 @@ config("delayloads") { "/DELAYLOAD:ncrypt.dll", "/DELAYLOAD:ole32.dll", "/DELAYLOAD:oleacc.dll", + "/DELAYLOAD:oleaut32.dll", "/DELAYLOAD:pdh.dll", "/DELAYLOAD:propsys.dll", "/DELAYLOAD:psapi.dll", @@ -454,16 +452,26 @@ config("delayloads") { ] } +# Production binaries should use this config. +config("delayloads") { + configs = [ ":delayloads_except_dbghelp" ] + ldflags = [ "/DELAYLOAD:dbghelp.dll" ] +} + +# This config should also be used for any test binary whose goal is to run +# tests with the full browser. +config("delayloads_for_tests") { + configs = [ ":delayloads_except_dbghelp" ] +} + # This config (along with `:delayloads`) applies to chrome.exe & chrome_elf.dll. # Entries should not appear in both configs. config("delayloads_not_for_child_dll") { ldflags = [ "/DELAYLOAD:crypt32.dll", - "/DELAYLOAD:dbghelp.dll", "/DELAYLOAD:dhcpcsvc.dll", "/DELAYLOAD:dwrite.dll", "/DELAYLOAD:iphlpapi.dll", - "/DELAYLOAD:oleaut32.dll", "/DELAYLOAD:secur32.dll", "/DELAYLOAD:userenv.dll", "/DELAYLOAD:winhttp.dll", diff --git a/naiveproxy/src/build/dotfile_settings.gni b/naiveproxy/src/build/dotfile_settings.gni index 4b8d16a5d5..4911002e5c 100644 --- a/naiveproxy/src/build/dotfile_settings.gni +++ b/naiveproxy/src/build/dotfile_settings.gni @@ -10,7 +10,6 @@ build_dotfile_settings = { "//build/config/android/rules.gni", "//build/config/apple/mobile_config.gni", "//build/config/chromeos/rules.gni", - "//build/config/clang/BUILD.gn", "//build/config/compiler/pgo/BUILD.gn", "//build/config/gcc/gcc_version.gni", "//build/config/host_byteorder.gni", @@ -31,7 +30,6 @@ build_dotfile_settings = { "//build/toolchain/apple/toolchain.gni", "//build/toolchain/BUILD.gn", "//build/toolchain/concurrent_links.gni", - "//build/toolchain/nacl/BUILD.gn", "//build/toolchain/rbe.gni", "//build/toolchain/toolchain.gni", "//build/toolchain/win/BUILD.gn", diff --git a/naiveproxy/src/build/fuchsia/cipd/BUILD.gn b/naiveproxy/src/build/fuchsia/cipd/BUILD.gn index 4814f98f4b..7b0cdd06a3 100644 --- a/naiveproxy/src/build/fuchsia/cipd/BUILD.gn +++ b/naiveproxy/src/build/fuchsia/cipd/BUILD.gn @@ -43,6 +43,11 @@ _host_tools_directory = "host_tools" _archive_suffix = "_archive" +# List of directories that are excluded from the generated LICENSE file. +# SwiftShader is excluded here because SwiftShader libraries are excluded +# from the WebEngine package, see `fuchsia_web/common/swiftshader_exclude.gni`. +_license_exclude_list = [ "third_party/swiftshader" ] + # Extracts the numeric Chrome version and writes it to a file in the output # directory. # @@ -114,6 +119,8 @@ template("cipd_archive") { _license_target, "--gn-out-dir", ".", + "--exclude-dirs", + "$_license_exclude_list", ] } @@ -135,6 +142,8 @@ template("cipd_archive") { "spdx", "--spdx-doc-name", "${invoker.target_name}", + "--exclude-dirs", + "$_license_exclude_list", ] } diff --git a/naiveproxy/src/build/fuchsia/gcs_download.py b/naiveproxy/src/build/fuchsia/gcs_download.py index 8d28fc5034..794699a3b3 100644 --- a/naiveproxy/src/build/fuchsia/gcs_download.py +++ b/naiveproxy/src/build/fuchsia/gcs_download.py @@ -19,4 +19,4 @@ def DownloadAndUnpackFromCloudStorage(url, output_dir): tmp_file_location = os.path.join(tmp_d, tmp_file) run_gsutil(['cp', url, tmp_file_location]) tarfile.open(name=tmp_file_location, - mode='r|gz').extractall(path=output_dir) + mode='r:gz').extractall(path=output_dir) diff --git a/naiveproxy/src/build/fuchsia/gcs_download_test.py b/naiveproxy/src/build/fuchsia/gcs_download_test.py index 48db5e376e..1d22e64b94 100755 --- a/naiveproxy/src/build/fuchsia/gcs_download_test.py +++ b/naiveproxy/src/build/fuchsia/gcs_download_test.py @@ -48,7 +48,7 @@ class TestDownloadAndUnpackFromCloudStorage(unittest.TestCase): mock.call.MkTmpD(), mock.call.MkTmpD().__enter__(), mock.call.Run(mock.ANY, check=True), - mock.call.Untar(name=image_tgz_path, mode='r|gz'), + mock.call.Untar(name=image_tgz_path, mode='r:gz'), mock.call.Untar().extractall(path=output_dir), mock.call.MkTmpD().__exit__(None, None, None) ], diff --git a/naiveproxy/src/build/fuchsia/linux_internal.sdk.sha1 b/naiveproxy/src/build/fuchsia/linux_internal.sdk.sha1 index 9f4e4c078c..c0552ea13e 100644 --- a/naiveproxy/src/build/fuchsia/linux_internal.sdk.sha1 +++ b/naiveproxy/src/build/fuchsia/linux_internal.sdk.sha1 @@ -1 +1 @@ -28.20250730.101.1 +29.20251025.102.1 diff --git a/naiveproxy/src/build/fuchsia/test/perf_trace.py b/naiveproxy/src/build/fuchsia/test/perf_trace.py index 0b7c65cc3b..f937a0c623 100644 --- a/naiveproxy/src/build/fuchsia/test/perf_trace.py +++ b/naiveproxy/src/build/fuchsia/test/perf_trace.py @@ -37,15 +37,14 @@ def start() -> None: # TODO(crbug.com/40935291): May include kernel:meta, kernel:sched, magma, # oemcrypto, media, kernel:syscall run_ffx_command(cmd=('trace', 'start', '--background', '--categories', - 'gfx,memory_monitor,system_metrics', '--output', - FXT_FILE, '--buffer-size', '32', '--buffering-mode', - 'streaming')) + 'gfx,memory_monitor,system_metrics', '--buffer-size', + '32', '--buffering-mode', 'streaming')) def stop(prefix: Optional[str] = None) -> None: """ Stops the system tracing and logs the metrics into the monitors system with an optional prefix as part of the metric names. """ - run_ffx_command(cmd=('trace', 'stop')) + run_ffx_command(cmd=('trace', 'stop', '--output', FXT_FILE)) _parse_trace(prefix) diff --git a/naiveproxy/src/build/get_landmines.py b/naiveproxy/src/build/get_landmines.py index 889fd0cf08..9560246317 100755 --- a/naiveproxy/src/build/get_landmines.py +++ b/naiveproxy/src/build/get_landmines.py @@ -83,6 +83,8 @@ def print_landmines(): if host_os() == 'mac': print('Clobber to clear old nocompile targets. See crbug.com/1497005.') print('Clobber to flush old TFLite files. See crbug.com/365705857') + if host_os() == 'android': + print('Clobber to clear stale JNI headers. See crbug.com/448419364.') def main(): diff --git a/naiveproxy/src/build/gn_ast/json_gn_editor.py b/naiveproxy/src/build/gn_ast/json_gn_editor.py index 08a9c0f6d2..87b3ae36cd 100644 --- a/naiveproxy/src/build/gn_ast/json_gn_editor.py +++ b/naiveproxy/src/build/gn_ast/json_gn_editor.py @@ -229,14 +229,15 @@ class BuildFile: return '' if name.startswith('"'): name = name[1:-1] - if not name.startswith('//') and abs_path: - name = self._gn_rel_path + name - if not ':' in name: - name += ':' + os.path.basename(name) - if allow_relative: - base_path, target_name = name.split(':') - if base_path == self._gn_rel_path: - return ':' + target_name + if not name.startswith('$'): + if not name.startswith('//') and abs_path: + name = self._gn_rel_path + name + if not ':' in name: + name += ':' + os.path.basename(name) + if allow_relative: + base_path, target_name = name.split(':') + if base_path == self._gn_rel_path: + return ':' + target_name return name def _find_all_list_assignments(self): diff --git a/naiveproxy/src/build/install-build-deps.py b/naiveproxy/src/build/install-build-deps.py index 8800d36164..6adf7b03ee 100755 --- a/naiveproxy/src/build/install-build-deps.py +++ b/naiveproxy/src/build/install-build-deps.py @@ -224,6 +224,7 @@ def dev_list(): "dpkg-dev", "elfutils", "fakeroot", + "fd-find", "flex", "git-core", "gperf", @@ -272,6 +273,7 @@ def dev_list(): "patch", "perl", "pkgconf", + "ripgrep", "rpm", "ruby", "uuid-dev", @@ -374,7 +376,6 @@ def lib_list(): "libpango-1.0-0", "libpangocairo-1.0-0", "libpci3", - "libpcre3", "libpixman-1-0", "libspeechd2", "libstdc++6", @@ -580,6 +581,7 @@ def backwards_compatible_list(options): "libgtk2.0-0", "libgtk2.0-0:i386", "libgtk2.0-dev", + "libpcre3", "mesa-common-dev", "mesa-common-dev-lts-trusty", "mesa-common-dev-lts-xenial", diff --git a/naiveproxy/src/build/linux/amd64/module.modulemap b/naiveproxy/src/build/linux/amd64/module.modulemap deleted file mode 100644 index d50a3a3a5c..0000000000 --- a/naiveproxy/src/build/linux/amd64/module.modulemap +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2025 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module sysroot_limits [system] [extern_c] { - header "../debian_bullseye_amd64-sysroot/usr/include/features.h" - header "../debian_bullseye_amd64-sysroot/usr/include/linux/limits.h" - header "../debian_bullseye_amd64-sysroot/usr/include/stdc-predef.h" - header "../debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/bits/long-double.h" - header "../debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/bits/wordsize.h" - header "../debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/gnu/stubs-64.h" - header "../debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/gnu/stubs.h" - header "../debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/sys/cdefs.h" -} - -module sysroot [system] [extern_c] { - header "../debian_bullseye_amd64-sysroot/usr/include/alloca.h" - header "../debian_bullseye_amd64-sysroot/usr/include/asm-generic/errno-base.h" - header "../debian_bullseye_amd64-sysroot/usr/include/asm-generic/errno.h" - header "../debian_bullseye_amd64-sysroot/usr/include/endian.h" - header "../debian_bullseye_amd64-sysroot/usr/include/linux/errno.h" - header "../debian_bullseye_amd64-sysroot/usr/include/locale.h" - header "../debian_bullseye_amd64-sysroot/usr/include/nl_types.h" - header "../debian_bullseye_amd64-sysroot/usr/include/pthread.h" - header "../debian_bullseye_amd64-sysroot/usr/include/setjmp.h" - header "../debian_bullseye_amd64-sysroot/usr/include/signal.h" - header "../debian_bullseye_amd64-sysroot/usr/include/stdc-predef.h" - header "../debian_bullseye_amd64-sysroot/usr/include/stdlib.h" - header "../debian_bullseye_amd64-sysroot/usr/include/stdio.h" - header "../debian_bullseye_amd64-sysroot/usr/include/strings.h" - header "../debian_bullseye_amd64-sysroot/usr/include/time.h" - header "../debian_bullseye_amd64-sysroot/usr/include/unistd.h" - header "../debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/asm/errno.h" - header "../debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/gnu/stubs.h" - header "../debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/sys/select.h" - header "../debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/sys/types.h" - header "../debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/sys/ucontext.h" - // Needs to be textual due to missing include of stddef.h in pthread.h - textual header "../debian_bullseye_amd64-sysroot/usr/include/sched.h" - // Allow files such as sys/types.h to re-export size_t - export * -} - -// The following are all textual because they are the subject of include_next -// from a non-textual module. -// eg. usr/include/errno.h is included by std_errno_h -module sysroot_ctype [system] [extern_c] { - textual header "../debian_bullseye_amd64-sysroot/usr/include/ctype.h" -} - -module sysroot_errno [system] [extern_c] { - textual header "../debian_bullseye_amd64-sysroot/usr/include/errno.h" -} - -module sysroot_fenv [system] [extern_c] { - textual header "../debian_bullseye_amd64-sysroot/usr/include/fenv.h" -} - -module sysroot_math [system] [extern_c] { - textual header "../debian_bullseye_amd64-sysroot/usr/include/math.h" -} - -module sysroot_inttypes [system] [extern_c] { - textual header "../debian_bullseye_amd64-sysroot/usr/include/inttypes.h" -} - -module sysroot_string [system] [extern_c] { - textual header "../debian_bullseye_amd64-sysroot/usr/include/string.h" -} - -module sysroot_stdatomic [system] [extern_c] { - textual header "../debian_bullseye_amd64-sysroot/usr/include/stdatomic.h" -} - -module sysroot_stdint [system] [extern_c] { - textual header "../debian_bullseye_amd64-sysroot/usr/include/stdint.h" -} - -module sysroot_uchar [system] [extern_c] { - textual header "../debian_bullseye_amd64-sysroot/usr/include/uchar.h" -} - -module sysroot_wctype [system] [extern_c] { - textual header "../debian_bullseye_amd64-sysroot/usr/include/wctype.h" -} \ No newline at end of file diff --git a/naiveproxy/src/build/linux/dump_app_syms.py b/naiveproxy/src/build/linux/dump_app_syms.py old mode 100644 new mode 100755 index ca2d700e27..adb9443168 --- a/naiveproxy/src/build/linux/dump_app_syms.py +++ b/naiveproxy/src/build/linux/dump_app_syms.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 # Copyright 2015 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. @@ -27,4 +28,4 @@ if not os.path.isfile(outfile) or \ subprocess.check_call([dumpsyms, '-m', '-d', infile], stdout=outfileobj) if strip_binary != '0': - subprocess.check_call(['strip', infile]) + subprocess.check_call(['strip', infile]) \ No newline at end of file diff --git a/naiveproxy/src/build/linux/unbundle/highway.gn b/naiveproxy/src/build/linux/unbundle/highway.gn index ac7e743f70..b43cc6b042 100644 --- a/naiveproxy/src/build/linux/unbundle/highway.gn +++ b/naiveproxy/src/build/linux/unbundle/highway.gn @@ -18,3 +18,6 @@ source_set("libhwy") { public_configs = [ ":libhwy_external_config" ] public_deps = [ ":libhwy_shim" ] } + +source_set("highway_tests") { +} diff --git a/naiveproxy/src/build/linux/unbundle/icu.gn b/naiveproxy/src/build/linux/unbundle/icu.gn index bad83cda02..87c960161f 100644 --- a/naiveproxy/src/build/linux/unbundle/icu.gn +++ b/naiveproxy/src/build/linux/unbundle/icu.gn @@ -65,6 +65,10 @@ group("icuuc_public") { public_deps = [ ":icuuc" ] } +group("icui18n_hidden_visibility") { + public_deps = [ ":icui18n" ] +} + shim_headers("icui18n_shim") { root_path = "source/i18n" headers = [ diff --git a/naiveproxy/src/build/mac_toolchain.py b/naiveproxy/src/build/mac_toolchain.py index d0645e4fb9..130b26d9f4 100755 --- a/naiveproxy/src/build/mac_toolchain.py +++ b/naiveproxy/src/build/mac_toolchain.py @@ -33,8 +33,9 @@ def LoadPList(path): return plistlib.load(f) -# This contains binaries from Xcode 16.4 (16F6) along with the macOS SDK 15.5 -# (24F74). To build these packages, see comments in build/xcode_binaries.yaml. +# This contains binaries from Xcode 26.0.1 (17A400) along with the macOS 26.0 +# SDK (25A352, which is like macOS 26.0 25A354) and the Metal toolchain (17A324, +# 32023). To build these packages, see comments in build/xcode_binaries.yaml. # # To update the version numbers, open Xcode's "About Xcode" or run `xcodebuild # -version` for the Xcode version, and run `xcrun --show-sdk-version` and `xcrun @@ -45,17 +46,17 @@ def LoadPList(path): # MAC_BINARIES_LABEL. MAC_BINARIES_LABEL = 'infra_internal/ios/xcode/xcode_binaries/mac-amd64' -MAC_BINARIES_TAG = 'F1uq3udJtPSmTDjMME_VqfH5PfdlNy2zKWvgVy-tBZoC' +MAC_BINARIES_TAG = 'ab7mQwdyDemzw1Utqhv4AaS7WLz4_Nq9V3L-eMuupMsC' # The toolchain will not be downloaded if the minimum OS version is not met. 19 -# is the major version number for macOS 10.15. Xcode 15.0 only runs on macOS -# 13.5 and newer, but some bots are still running older OS versions. macOS -# 10.15.4, the OS minimum through Xcode 12.4, still seems to work. +# is the Darwin major version number for macOS 10.15. Xcode 26.0 17A324 only +# runs on macOS 15.6 and newer, but some bots are still running older OS +# versions. macOS 10.15.4, the OS minimum through Xcode 12.4, still seems to +# work. MAC_MINIMUM_OS_VERSION = [19, 4] BASE_DIR = os.path.abspath(os.path.dirname(__file__)) TOOLCHAIN_ROOT = os.path.join(BASE_DIR, 'mac_files') -TOOLCHAIN_BUILD_DIR = os.path.join(TOOLCHAIN_ROOT, 'Xcode.app') # Always integrity-check the entire SDK. Mac SDK packages are complex and often # hit edge cases in cipd (eg https://crbug.com/1033987, diff --git a/naiveproxy/src/build/modules/android-arm/BUILD.gn b/naiveproxy/src/build/modules/android-arm/BUILD.gn new file mode 100644 index 0000000000..e60e0b254a --- /dev/null +++ b/naiveproxy/src/build/modules/android-arm/BUILD.gn @@ -0,0 +1,267 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# AUTOGENERATED FILE. DO NOT EDIT. +# To regenerate, see instructions at build/modules/modularize/README.md + +import("//buildtools/third_party/libc++/modules.gni") + +sysroot_modulemap("sysroot_modulemap") { + source = "module.modulemap.in" + out = "${target_gen_dir}/module.modulemap" +} + +builtin_module("_Builtin_float") { +} + +builtin_module("_Builtin_intrinsics") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std_core", + ":sys_stage1", + ":sys_stage2", + ] +} + +builtin_module("_Builtin_inttypes") { + public_deps = [ + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_iso646") { +} + +builtin_module("_Builtin_limits") { + public_deps = [ + ":std_float_h", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_stdalign") { +} + +builtin_module("_Builtin_stdarg") { +} + +builtin_module("_Builtin_stdatomic") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_stdbool") { +} + +builtin_module("_Builtin_stdcountof") { +} + +builtin_module("_Builtin_stddef") { +} + +builtin_module("_Builtin_stddef_wint_t") { +} + +builtin_module("_Builtin_stdint") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_stdnoreturn") { +} + +builtin_module("_Builtin_unwind") { + public_deps = [ ":_Builtin_stdint" ] +} + +builtin_module("ptrauth") { +} + +libcxx_module("std") { + public_deps = [ + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stddef", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_string_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_stage1", + ":sys_stage2", + ] +} + +libcxx_module("std_complex_h") { + public_deps = [ + ":std", + ":sys_stage1", + ] +} + +libcxx_module("std_core") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +libcxx_module("std_ctype_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_errno_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_fenv_h") { + public_deps = [ + ":sys_stage1", + ":sys_stage2", + ] +} + +libcxx_module("std_float_h") { + public_deps = [ + ":_Builtin_float", + ":sys_stage1", + ] +} + +libcxx_module("std_inttypes_h") { + public_deps = [ + ":_Builtin_inttypes", + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +libcxx_module("std_math_h") { + public_deps = [ + ":_Builtin_limits", + ":std_core", + ":sys_stage1", + ] +} + +libcxx_module("std_private_mbstate_t") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ":sys_stage2", + ] + defines = [ "_LIBCPP_WCHAR_H_HAS_CONST_OVERLOADS" ] +} + +libcxx_module("std_stdatomic_h") { + public_deps = [ + ":_Builtin_stdatomic", + ":std", + ":sys_stage1", + ] +} + +libcxx_module("std_string_h") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ":sys_stage2", + ] +} + +libcxx_module("std_tgmath_h") { + public_deps = [ + ":std", + ":sys_stage1", + ] +} + +libcxx_module("std_uchar_h") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ] +} + +libcxx_module("std_wctype_h") { + public_deps = [ ":sys_stage1" ] +} + +sysroot_module("sys_stage1") { + public_deps = [ ":_Builtin_stddef" ] +} + +sysroot_module("sys_stage2") { + public_deps = [ + ":_Builtin_limits", + ":_Builtin_stdarg", + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std_core", + ":std_errno_h", + ":sys_stage1", + ] +} + +group("all_modules") { + public_deps = [ + ":_Builtin_float", + ":_Builtin_intrinsics", + ":_Builtin_inttypes", + ":_Builtin_iso646", + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stdatomic", + ":_Builtin_stdbool", + ":_Builtin_stdcountof", + ":_Builtin_stddef", + ":_Builtin_stddef_wint_t", + ":_Builtin_stdint", + ":_Builtin_stdnoreturn", + ":_Builtin_unwind", + ":ptrauth", + ":std", + ":std_complex_h", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_stdatomic_h", + ":std_string_h", + ":std_tgmath_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_stage1", + ":sys_stage2", + ] +} + +config("all_modulemap_configs") { + configs = [ + "//buildtools/third_party/libc++:builtin_modulemap", + "//buildtools/third_party/libc++:libcxx_modulemap", + ":sysroot_modulemap", + ] +} diff --git a/naiveproxy/src/build/modules/android-arm/module.modulemap.in b/naiveproxy/src/build/modules/android-arm/module.modulemap.in new file mode 100644 index 0000000000..2a470c0b3e --- /dev/null +++ b/naiveproxy/src/build/modules/android-arm/module.modulemap.in @@ -0,0 +1,361 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// AUTOGENERATED FILE. DO NOT EDIT. +// To regenerate, see instructions at build/modules/modularize/README.md + + +module sys_stage1 [system] [extern_c] { + module alloca_h { + header "$sysroot/alloca.h" + export * + } + module android_api_level_h { + header "$sysroot/android/api-level.h" + header "$sysroot/sys/cdefs.h" + export * + } + module android_ndk_version_h { + header "$sysroot/android/ndk-version.h" + export * + } + module android_versioning_h { + header "$sysroot/android/versioning.h" + export * + } + module asm_generic_errno_base_h { + header "$sysroot/asm-generic/errno-base.h" + export * + } + module asm_generic_errno_h { + header "$sysroot/asm-generic/errno.h" + export * + } + module asm_generic_int_ll64_h { + header "$sysroot/asm-generic/int-ll64.h" + export * + } + module asm_generic_ioctl_h { + header "$sysroot/asm-generic/ioctl.h" + export * + } + module asm_generic_ioctls_h { + header "$sysroot/asm-generic/ioctls.h" + export * + } + module asm_generic_siginfo_h { + header "$sysroot/asm-generic/siginfo.h" + export * + } + module asm_generic_signal_defs_h { + header "$sysroot/asm-generic/signal-defs.h" + export * + } + module asm_generic_termbits_common_h { + header "$sysroot/asm-generic/termbits-common.h" + export * + } + module asm_generic_termbits_h { + header "$sysroot/asm-generic/termbits.h" + export * + } + module asm_generic_termios_h { + header "$sysroot/asm-generic/termios.h" + export * + } + module asm_bitsperlong_h { + header "$sysroot/arm-linux-androideabi/asm/bitsperlong.h" + export * + } + module asm_errno_h { + header "$sysroot/arm-linux-androideabi/asm/errno.h" + export * + } + module asm_ioctl_h { + header "$sysroot/arm-linux-androideabi/asm/ioctl.h" + export * + } + module asm_ioctls_h { + header "$sysroot/arm-linux-androideabi/asm/ioctls.h" + export * + } + module asm_sigcontext_h { + header "$sysroot/arm-linux-androideabi/asm/sigcontext.h" + export * + } + module asm_siginfo_h { + header "$sysroot/arm-linux-androideabi/asm/siginfo.h" + export * + } + module asm_signal_h { + header "$sysroot/arm-linux-androideabi/asm/signal.h" + export * + } + module asm_termbits_h { + header "$sysroot/arm-linux-androideabi/asm/termbits.h" + export * + } + module asm_termios_h { + header "$sysroot/arm-linux-androideabi/asm/termios.h" + export * + } + module asm_types_h { + header "$sysroot/arm-linux-androideabi/asm/types.h" + export * + } + module bits_bionic_multibyte_result_h { + header "$sysroot/bits/bionic_multibyte_result.h" + export * + } + module bits_fcntl_h { + header "$sysroot/bits/fcntl.h" + export * + } + module bits_flock64_h { + header "$sysroot/bits/flock64.h" + export * + } + module bits_getopt_h { + header "$sysroot/bits/getopt.h" + export * + } + module bits_ioctl_h { + header "$sysroot/bits/ioctl.h" + export * + } + module bits_mbstate_t_h { + header "$sysroot/bits/mbstate_t.h" + export * + } + module bits_page_size_h { + header "$sysroot/bits/page_size.h" + export * + } + module bits_seek_constants_h { + header "$sysroot/bits/seek_constants.h" + export * + } + module bits_wait_h { + header "$sysroot/bits/wait.h" + export * + } + module bits_wchar_limits_h { + header "$sysroot/bits/wchar_limits.h" + export * + } + module features_h { + header "$sysroot/features.h" + export * + } + module getopt_h { + header "$sysroot/getopt.h" + export * + } + module linux_compiler_h { + header "$sysroot/linux/compiler.h" + export * + } + module linux_compiler_types_h { + header "$sysroot/linux/compiler_types.h" + export * + } + module linux_errno_h { + header "$sysroot/linux/errno.h" + export * + } + module linux_fadvise_h { + header "$sysroot/linux/fadvise.h" + export * + } + module linux_falloc_h { + header "$sysroot/linux/falloc.h" + export * + } + module linux_ioctl_h { + header "$sysroot/linux/ioctl.h" + export * + } + module linux_limits_h { + header "$sysroot/linux/limits.h" + export * + } + module linux_openat2_h { + header "$sysroot/linux/openat2.h" + export * + } + module linux_posix_types_h { + header "$sysroot/linux/posix_types.h" + export * + } + module linux_sched_h { + header "$sysroot/linux/sched.h" + export * + } + module linux_signal_h { + header "$sysroot/linux/signal.h" + export * + } + module linux_stat_h { + header "$sysroot/linux/stat.h" + export * + } + module linux_stddef_h { + header "$sysroot/linux/stddef.h" + export * + } + module linux_termios_h { + header "$sysroot/linux/termios.h" + export * + } + module linux_tty_h { + header "$sysroot/linux/tty.h" + export * + } + module linux_types_h { + header "$sysroot/linux/types.h" + export * + } + module linux_uio_h { + header "$sysroot/linux/uio.h" + export * + } + module linux_wait_h { + header "$sysroot/linux/wait.h" + export * + } + module locale_h { + header "$sysroot/locale.h" + export * + } + module setjmp_h { + header "$sysroot/setjmp.h" + export * + } + module sys_ioctl_h { + header "$sysroot/sys/ioctl.h" + export * + } + module sys_syscall_h { + header "$sysroot/sys/syscall.h" + export * + } + module syscall_h { + header "$sysroot/syscall.h" + export * + } + module xlocale_h { + header "$sysroot/xlocale.h" + export * + } +} + +module sys_stage2 [system] [extern_c] { + module asm_generic_fcntl_h { + header "$sysroot/asm-generic/fcntl.h" + export * + } + module asm_fcntl_h { + header "$sysroot/arm-linux-androideabi/asm/fcntl.h" + export * + } + module bits_fenv_arm_h { + header "$sysroot/bits/fenv_arm.h" + export * + } + module bits_flock_h { + header "$sysroot/bits/flock.h" + export * + } + module bits_lockf_h { + header "$sysroot/bits/lockf.h" + export * + } + module bits_pthread_types_h { + header "$sysroot/bits/pthread_types.h" + header "$sysroot/sys/types.h" + export * + } + module bits_signal_types_h { + header "$sysroot/bits/signal_types.h" + export * + } + module bits_strcasecmp_h { + header "$sysroot/bits/strcasecmp.h" + export * + } + module bits_timespec_h { + header "$sysroot/bits/timespec.h" + export * + } + module fcntl_h { + header "$sysroot/fcntl.h" + export * + } + module linux_fcntl_h { + header "$sysroot/linux/fcntl.h" + export * + } + module linux_time_h { + header "$sysroot/linux/time.h" + header "$sysroot/linux/time_types.h" + export * + } + module malloc_h { + header "$sysroot/malloc.h" + export * + } + module pthread_h { + header "$sysroot/pthread.h" + export * + } + module sched_h { + header "$sysroot/sched.h" + export * + } + module signal_h { + header "$sysroot/signal.h" + header "$sysroot/sys/ucontext.h" + export * + } + module stdio_h { + header "$sysroot/stdio.h" + export * + } + module stdlib_h { + header "$sysroot/stdlib.h" + export * + } + module strings_h { + header "$sysroot/strings.h" + export * + } + module sys_select_h { + header "$sysroot/sys/select.h" + export * + } + module sys_time_h { + header "$sysroot/sys/time.h" + export * + } + module sys_user_h { + header "$sysroot/sys/user.h" + export * + } + module threads_h { + header "$sysroot/threads.h" + export * + } + module time_h { + header "$sysroot/time.h" + export * + } + module unistd_h { + header "$sysroot/unistd.h" + export * + } + module wchar_h { + header "$sysroot/wchar.h" + export * + } +} diff --git a/naiveproxy/src/build/modules/android-arm64/BUILD.gn b/naiveproxy/src/build/modules/android-arm64/BUILD.gn new file mode 100644 index 0000000000..e60e0b254a --- /dev/null +++ b/naiveproxy/src/build/modules/android-arm64/BUILD.gn @@ -0,0 +1,267 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# AUTOGENERATED FILE. DO NOT EDIT. +# To regenerate, see instructions at build/modules/modularize/README.md + +import("//buildtools/third_party/libc++/modules.gni") + +sysroot_modulemap("sysroot_modulemap") { + source = "module.modulemap.in" + out = "${target_gen_dir}/module.modulemap" +} + +builtin_module("_Builtin_float") { +} + +builtin_module("_Builtin_intrinsics") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std_core", + ":sys_stage1", + ":sys_stage2", + ] +} + +builtin_module("_Builtin_inttypes") { + public_deps = [ + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_iso646") { +} + +builtin_module("_Builtin_limits") { + public_deps = [ + ":std_float_h", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_stdalign") { +} + +builtin_module("_Builtin_stdarg") { +} + +builtin_module("_Builtin_stdatomic") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_stdbool") { +} + +builtin_module("_Builtin_stdcountof") { +} + +builtin_module("_Builtin_stddef") { +} + +builtin_module("_Builtin_stddef_wint_t") { +} + +builtin_module("_Builtin_stdint") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_stdnoreturn") { +} + +builtin_module("_Builtin_unwind") { + public_deps = [ ":_Builtin_stdint" ] +} + +builtin_module("ptrauth") { +} + +libcxx_module("std") { + public_deps = [ + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stddef", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_string_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_stage1", + ":sys_stage2", + ] +} + +libcxx_module("std_complex_h") { + public_deps = [ + ":std", + ":sys_stage1", + ] +} + +libcxx_module("std_core") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +libcxx_module("std_ctype_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_errno_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_fenv_h") { + public_deps = [ + ":sys_stage1", + ":sys_stage2", + ] +} + +libcxx_module("std_float_h") { + public_deps = [ + ":_Builtin_float", + ":sys_stage1", + ] +} + +libcxx_module("std_inttypes_h") { + public_deps = [ + ":_Builtin_inttypes", + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +libcxx_module("std_math_h") { + public_deps = [ + ":_Builtin_limits", + ":std_core", + ":sys_stage1", + ] +} + +libcxx_module("std_private_mbstate_t") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ":sys_stage2", + ] + defines = [ "_LIBCPP_WCHAR_H_HAS_CONST_OVERLOADS" ] +} + +libcxx_module("std_stdatomic_h") { + public_deps = [ + ":_Builtin_stdatomic", + ":std", + ":sys_stage1", + ] +} + +libcxx_module("std_string_h") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ":sys_stage2", + ] +} + +libcxx_module("std_tgmath_h") { + public_deps = [ + ":std", + ":sys_stage1", + ] +} + +libcxx_module("std_uchar_h") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ] +} + +libcxx_module("std_wctype_h") { + public_deps = [ ":sys_stage1" ] +} + +sysroot_module("sys_stage1") { + public_deps = [ ":_Builtin_stddef" ] +} + +sysroot_module("sys_stage2") { + public_deps = [ + ":_Builtin_limits", + ":_Builtin_stdarg", + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std_core", + ":std_errno_h", + ":sys_stage1", + ] +} + +group("all_modules") { + public_deps = [ + ":_Builtin_float", + ":_Builtin_intrinsics", + ":_Builtin_inttypes", + ":_Builtin_iso646", + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stdatomic", + ":_Builtin_stdbool", + ":_Builtin_stdcountof", + ":_Builtin_stddef", + ":_Builtin_stddef_wint_t", + ":_Builtin_stdint", + ":_Builtin_stdnoreturn", + ":_Builtin_unwind", + ":ptrauth", + ":std", + ":std_complex_h", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_stdatomic_h", + ":std_string_h", + ":std_tgmath_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_stage1", + ":sys_stage2", + ] +} + +config("all_modulemap_configs") { + configs = [ + "//buildtools/third_party/libc++:builtin_modulemap", + "//buildtools/third_party/libc++:libcxx_modulemap", + ":sysroot_modulemap", + ] +} diff --git a/naiveproxy/src/build/modules/android-arm64/module.modulemap.in b/naiveproxy/src/build/modules/android-arm64/module.modulemap.in new file mode 100644 index 0000000000..fdb95cd372 --- /dev/null +++ b/naiveproxy/src/build/modules/android-arm64/module.modulemap.in @@ -0,0 +1,373 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// AUTOGENERATED FILE. DO NOT EDIT. +// To regenerate, see instructions at build/modules/modularize/README.md + + +module sys_stage1 [system] [extern_c] { + module alloca_h { + header "$sysroot/alloca.h" + export * + } + module android_api_level_h { + header "$sysroot/android/api-level.h" + header "$sysroot/sys/cdefs.h" + export * + } + module android_ndk_version_h { + header "$sysroot/android/ndk-version.h" + export * + } + module android_versioning_h { + header "$sysroot/android/versioning.h" + export * + } + module asm_generic_errno_base_h { + header "$sysroot/asm-generic/errno-base.h" + export * + } + module asm_generic_errno_h { + header "$sysroot/asm-generic/errno.h" + export * + } + module asm_generic_int_ll64_h { + header "$sysroot/asm-generic/int-ll64.h" + export * + } + module asm_generic_ioctl_h { + header "$sysroot/asm-generic/ioctl.h" + export * + } + module asm_generic_ioctls_h { + header "$sysroot/asm-generic/ioctls.h" + export * + } + module asm_generic_siginfo_h { + header "$sysroot/asm-generic/siginfo.h" + export * + } + module asm_generic_signal_defs_h { + header "$sysroot/asm-generic/signal-defs.h" + export * + } + module asm_generic_signal_h { + header "$sysroot/asm-generic/signal.h" + export * + } + module asm_generic_termbits_common_h { + header "$sysroot/asm-generic/termbits-common.h" + export * + } + module asm_generic_termbits_h { + header "$sysroot/asm-generic/termbits.h" + export * + } + module asm_generic_termios_h { + header "$sysroot/asm-generic/termios.h" + export * + } + module asm_generic_types_h { + header "$sysroot/asm-generic/types.h" + export * + } + module asm_bitsperlong_h { + header "$sysroot/aarch64-linux-android/asm/bitsperlong.h" + export * + } + module asm_errno_h { + header "$sysroot/aarch64-linux-android/asm/errno.h" + export * + } + module asm_ioctl_h { + header "$sysroot/aarch64-linux-android/asm/ioctl.h" + export * + } + module asm_ioctls_h { + header "$sysroot/aarch64-linux-android/asm/ioctls.h" + export * + } + module asm_sigcontext_h { + header "$sysroot/aarch64-linux-android/asm/sigcontext.h" + export * + } + module asm_siginfo_h { + header "$sysroot/aarch64-linux-android/asm/siginfo.h" + export * + } + module asm_signal_h { + header "$sysroot/aarch64-linux-android/asm/signal.h" + export * + } + module asm_sve_context_h { + header "$sysroot/aarch64-linux-android/asm/sve_context.h" + export * + } + module asm_termbits_h { + header "$sysroot/aarch64-linux-android/asm/termbits.h" + export * + } + module asm_termios_h { + header "$sysroot/aarch64-linux-android/asm/termios.h" + export * + } + module asm_types_h { + header "$sysroot/aarch64-linux-android/asm/types.h" + export * + } + module bits_bionic_multibyte_result_h { + header "$sysroot/bits/bionic_multibyte_result.h" + export * + } + module bits_fcntl_h { + header "$sysroot/bits/fcntl.h" + export * + } + module bits_flock64_h { + header "$sysroot/bits/flock64.h" + export * + } + module bits_getopt_h { + header "$sysroot/bits/getopt.h" + export * + } + module bits_ioctl_h { + header "$sysroot/bits/ioctl.h" + export * + } + module bits_mbstate_t_h { + header "$sysroot/bits/mbstate_t.h" + export * + } + module bits_page_size_h { + header "$sysroot/bits/page_size.h" + export * + } + module bits_seek_constants_h { + header "$sysroot/bits/seek_constants.h" + export * + } + module bits_wait_h { + header "$sysroot/bits/wait.h" + export * + } + module bits_wchar_limits_h { + header "$sysroot/bits/wchar_limits.h" + export * + } + module features_h { + header "$sysroot/features.h" + export * + } + module getopt_h { + header "$sysroot/getopt.h" + export * + } + module linux_compiler_h { + header "$sysroot/linux/compiler.h" + export * + } + module linux_compiler_types_h { + header "$sysroot/linux/compiler_types.h" + export * + } + module linux_errno_h { + header "$sysroot/linux/errno.h" + export * + } + module linux_fadvise_h { + header "$sysroot/linux/fadvise.h" + export * + } + module linux_falloc_h { + header "$sysroot/linux/falloc.h" + export * + } + module linux_ioctl_h { + header "$sysroot/linux/ioctl.h" + export * + } + module linux_limits_h { + header "$sysroot/linux/limits.h" + export * + } + module linux_openat2_h { + header "$sysroot/linux/openat2.h" + export * + } + module linux_posix_types_h { + header "$sysroot/linux/posix_types.h" + export * + } + module linux_sched_h { + header "$sysroot/linux/sched.h" + export * + } + module linux_signal_h { + header "$sysroot/linux/signal.h" + export * + } + module linux_stat_h { + header "$sysroot/linux/stat.h" + export * + } + module linux_stddef_h { + header "$sysroot/linux/stddef.h" + export * + } + module linux_termios_h { + header "$sysroot/linux/termios.h" + export * + } + module linux_tty_h { + header "$sysroot/linux/tty.h" + export * + } + module linux_types_h { + header "$sysroot/linux/types.h" + export * + } + module linux_uio_h { + header "$sysroot/linux/uio.h" + export * + } + module linux_wait_h { + header "$sysroot/linux/wait.h" + export * + } + module locale_h { + header "$sysroot/locale.h" + export * + } + module setjmp_h { + header "$sysroot/setjmp.h" + export * + } + module sys_ioctl_h { + header "$sysroot/sys/ioctl.h" + export * + } + module sys_syscall_h { + header "$sysroot/sys/syscall.h" + export * + } + module syscall_h { + header "$sysroot/syscall.h" + export * + } + module xlocale_h { + header "$sysroot/xlocale.h" + export * + } +} + +module sys_stage2 [system] [extern_c] { + module asm_generic_fcntl_h { + header "$sysroot/asm-generic/fcntl.h" + export * + } + module asm_fcntl_h { + header "$sysroot/aarch64-linux-android/asm/fcntl.h" + export * + } + module bits_fenv_arm_h { + header "$sysroot/bits/fenv_arm.h" + export * + } + module bits_flock_h { + header "$sysroot/bits/flock.h" + export * + } + module bits_lockf_h { + header "$sysroot/bits/lockf.h" + export * + } + module bits_pthread_types_h { + header "$sysroot/bits/pthread_types.h" + header "$sysroot/sys/types.h" + export * + } + module bits_signal_types_h { + header "$sysroot/bits/signal_types.h" + export * + } + module bits_strcasecmp_h { + header "$sysroot/bits/strcasecmp.h" + export * + } + module bits_timespec_h { + header "$sysroot/bits/timespec.h" + export * + } + module fcntl_h { + header "$sysroot/fcntl.h" + export * + } + module linux_fcntl_h { + header "$sysroot/linux/fcntl.h" + export * + } + module linux_time_h { + header "$sysroot/linux/time.h" + header "$sysroot/linux/time_types.h" + export * + } + module malloc_h { + header "$sysroot/malloc.h" + export * + } + module pthread_h { + header "$sysroot/pthread.h" + export * + } + module sched_h { + header "$sysroot/sched.h" + export * + } + module signal_h { + header "$sysroot/signal.h" + header "$sysroot/sys/ucontext.h" + export * + } + module stdio_h { + header "$sysroot/stdio.h" + export * + } + module stdlib_h { + header "$sysroot/stdlib.h" + export * + } + module strings_h { + header "$sysroot/strings.h" + export * + } + module sys_select_h { + header "$sysroot/sys/select.h" + export * + } + module sys_time_h { + header "$sysroot/sys/time.h" + export * + } + module sys_user_h { + header "$sysroot/sys/user.h" + export * + } + module threads_h { + header "$sysroot/threads.h" + export * + } + module time_h { + header "$sysroot/time.h" + export * + } + module unistd_h { + header "$sysroot/unistd.h" + export * + } + module wchar_h { + header "$sysroot/wchar.h" + export * + } +} diff --git a/naiveproxy/src/build/modules/android-x64/BUILD.gn b/naiveproxy/src/build/modules/android-x64/BUILD.gn new file mode 100644 index 0000000000..e60e0b254a --- /dev/null +++ b/naiveproxy/src/build/modules/android-x64/BUILD.gn @@ -0,0 +1,267 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# AUTOGENERATED FILE. DO NOT EDIT. +# To regenerate, see instructions at build/modules/modularize/README.md + +import("//buildtools/third_party/libc++/modules.gni") + +sysroot_modulemap("sysroot_modulemap") { + source = "module.modulemap.in" + out = "${target_gen_dir}/module.modulemap" +} + +builtin_module("_Builtin_float") { +} + +builtin_module("_Builtin_intrinsics") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std_core", + ":sys_stage1", + ":sys_stage2", + ] +} + +builtin_module("_Builtin_inttypes") { + public_deps = [ + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_iso646") { +} + +builtin_module("_Builtin_limits") { + public_deps = [ + ":std_float_h", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_stdalign") { +} + +builtin_module("_Builtin_stdarg") { +} + +builtin_module("_Builtin_stdatomic") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_stdbool") { +} + +builtin_module("_Builtin_stdcountof") { +} + +builtin_module("_Builtin_stddef") { +} + +builtin_module("_Builtin_stddef_wint_t") { +} + +builtin_module("_Builtin_stdint") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_stdnoreturn") { +} + +builtin_module("_Builtin_unwind") { + public_deps = [ ":_Builtin_stdint" ] +} + +builtin_module("ptrauth") { +} + +libcxx_module("std") { + public_deps = [ + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stddef", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_string_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_stage1", + ":sys_stage2", + ] +} + +libcxx_module("std_complex_h") { + public_deps = [ + ":std", + ":sys_stage1", + ] +} + +libcxx_module("std_core") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +libcxx_module("std_ctype_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_errno_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_fenv_h") { + public_deps = [ + ":sys_stage1", + ":sys_stage2", + ] +} + +libcxx_module("std_float_h") { + public_deps = [ + ":_Builtin_float", + ":sys_stage1", + ] +} + +libcxx_module("std_inttypes_h") { + public_deps = [ + ":_Builtin_inttypes", + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +libcxx_module("std_math_h") { + public_deps = [ + ":_Builtin_limits", + ":std_core", + ":sys_stage1", + ] +} + +libcxx_module("std_private_mbstate_t") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ":sys_stage2", + ] + defines = [ "_LIBCPP_WCHAR_H_HAS_CONST_OVERLOADS" ] +} + +libcxx_module("std_stdatomic_h") { + public_deps = [ + ":_Builtin_stdatomic", + ":std", + ":sys_stage1", + ] +} + +libcxx_module("std_string_h") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ":sys_stage2", + ] +} + +libcxx_module("std_tgmath_h") { + public_deps = [ + ":std", + ":sys_stage1", + ] +} + +libcxx_module("std_uchar_h") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ] +} + +libcxx_module("std_wctype_h") { + public_deps = [ ":sys_stage1" ] +} + +sysroot_module("sys_stage1") { + public_deps = [ ":_Builtin_stddef" ] +} + +sysroot_module("sys_stage2") { + public_deps = [ + ":_Builtin_limits", + ":_Builtin_stdarg", + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std_core", + ":std_errno_h", + ":sys_stage1", + ] +} + +group("all_modules") { + public_deps = [ + ":_Builtin_float", + ":_Builtin_intrinsics", + ":_Builtin_inttypes", + ":_Builtin_iso646", + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stdatomic", + ":_Builtin_stdbool", + ":_Builtin_stdcountof", + ":_Builtin_stddef", + ":_Builtin_stddef_wint_t", + ":_Builtin_stdint", + ":_Builtin_stdnoreturn", + ":_Builtin_unwind", + ":ptrauth", + ":std", + ":std_complex_h", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_stdatomic_h", + ":std_string_h", + ":std_tgmath_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_stage1", + ":sys_stage2", + ] +} + +config("all_modulemap_configs") { + configs = [ + "//buildtools/third_party/libc++:builtin_modulemap", + "//buildtools/third_party/libc++:libcxx_modulemap", + ":sysroot_modulemap", + ] +} diff --git a/naiveproxy/src/build/modules/android-x64/module.modulemap.in b/naiveproxy/src/build/modules/android-x64/module.modulemap.in new file mode 100644 index 0000000000..dc4d363b0e --- /dev/null +++ b/naiveproxy/src/build/modules/android-x64/module.modulemap.in @@ -0,0 +1,369 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// AUTOGENERATED FILE. DO NOT EDIT. +// To regenerate, see instructions at build/modules/modularize/README.md + + +module sys_stage1 [system] [extern_c] { + module alloca_h { + header "$sysroot/alloca.h" + export * + } + module android_api_level_h { + header "$sysroot/android/api-level.h" + header "$sysroot/sys/cdefs.h" + export * + } + module android_ndk_version_h { + header "$sysroot/android/ndk-version.h" + export * + } + module android_versioning_h { + header "$sysroot/android/versioning.h" + export * + } + module asm_generic_errno_base_h { + header "$sysroot/asm-generic/errno-base.h" + export * + } + module asm_generic_errno_h { + header "$sysroot/asm-generic/errno.h" + export * + } + module asm_generic_int_ll64_h { + header "$sysroot/asm-generic/int-ll64.h" + export * + } + module asm_generic_ioctl_h { + header "$sysroot/asm-generic/ioctl.h" + export * + } + module asm_generic_ioctls_h { + header "$sysroot/asm-generic/ioctls.h" + export * + } + module asm_generic_siginfo_h { + header "$sysroot/asm-generic/siginfo.h" + export * + } + module asm_generic_signal_defs_h { + header "$sysroot/asm-generic/signal-defs.h" + export * + } + module asm_generic_termbits_common_h { + header "$sysroot/asm-generic/termbits-common.h" + export * + } + module asm_generic_termbits_h { + header "$sysroot/asm-generic/termbits.h" + export * + } + module asm_generic_termios_h { + header "$sysroot/asm-generic/termios.h" + export * + } + module asm_generic_types_h { + header "$sysroot/asm-generic/types.h" + export * + } + module asm_bitsperlong_h { + header "$sysroot/x86_64-linux-android/asm/bitsperlong.h" + export * + } + module asm_errno_h { + header "$sysroot/x86_64-linux-android/asm/errno.h" + export * + } + module asm_ioctl_h { + header "$sysroot/x86_64-linux-android/asm/ioctl.h" + export * + } + module asm_ioctls_h { + header "$sysroot/x86_64-linux-android/asm/ioctls.h" + export * + } + module asm_posix_types_64_h { + header "$sysroot/x86_64-linux-android/asm/posix_types_64.h" + export * + } + module asm_sigcontext_h { + header "$sysroot/x86_64-linux-android/asm/sigcontext.h" + export * + } + module asm_siginfo_h { + header "$sysroot/x86_64-linux-android/asm/siginfo.h" + export * + } + module asm_signal_h { + header "$sysroot/x86_64-linux-android/asm/signal.h" + export * + } + module asm_termbits_h { + header "$sysroot/x86_64-linux-android/asm/termbits.h" + export * + } + module asm_termios_h { + header "$sysroot/x86_64-linux-android/asm/termios.h" + export * + } + module asm_types_h { + header "$sysroot/x86_64-linux-android/asm/types.h" + export * + } + module bits_bionic_multibyte_result_h { + header "$sysroot/bits/bionic_multibyte_result.h" + export * + } + module bits_fcntl_h { + header "$sysroot/bits/fcntl.h" + export * + } + module bits_flock64_h { + header "$sysroot/bits/flock64.h" + export * + } + module bits_getopt_h { + header "$sysroot/bits/getopt.h" + export * + } + module bits_ioctl_h { + header "$sysroot/bits/ioctl.h" + export * + } + module bits_mbstate_t_h { + header "$sysroot/bits/mbstate_t.h" + export * + } + module bits_page_size_h { + header "$sysroot/bits/page_size.h" + export * + } + module bits_seek_constants_h { + header "$sysroot/bits/seek_constants.h" + export * + } + module bits_wait_h { + header "$sysroot/bits/wait.h" + export * + } + module bits_wchar_limits_h { + header "$sysroot/bits/wchar_limits.h" + export * + } + module features_h { + header "$sysroot/features.h" + export * + } + module getopt_h { + header "$sysroot/getopt.h" + export * + } + module linux_compiler_h { + header "$sysroot/linux/compiler.h" + export * + } + module linux_compiler_types_h { + header "$sysroot/linux/compiler_types.h" + export * + } + module linux_errno_h { + header "$sysroot/linux/errno.h" + export * + } + module linux_fadvise_h { + header "$sysroot/linux/fadvise.h" + export * + } + module linux_falloc_h { + header "$sysroot/linux/falloc.h" + export * + } + module linux_ioctl_h { + header "$sysroot/linux/ioctl.h" + export * + } + module linux_limits_h { + header "$sysroot/linux/limits.h" + export * + } + module linux_openat2_h { + header "$sysroot/linux/openat2.h" + export * + } + module linux_posix_types_h { + header "$sysroot/linux/posix_types.h" + export * + } + module linux_sched_h { + header "$sysroot/linux/sched.h" + export * + } + module linux_signal_h { + header "$sysroot/linux/signal.h" + export * + } + module linux_stat_h { + header "$sysroot/linux/stat.h" + export * + } + module linux_stddef_h { + header "$sysroot/linux/stddef.h" + export * + } + module linux_termios_h { + header "$sysroot/linux/termios.h" + export * + } + module linux_tty_h { + header "$sysroot/linux/tty.h" + export * + } + module linux_types_h { + header "$sysroot/linux/types.h" + export * + } + module linux_uio_h { + header "$sysroot/linux/uio.h" + export * + } + module linux_wait_h { + header "$sysroot/linux/wait.h" + export * + } + module locale_h { + header "$sysroot/locale.h" + export * + } + module setjmp_h { + header "$sysroot/setjmp.h" + export * + } + module sys_ioctl_h { + header "$sysroot/sys/ioctl.h" + export * + } + module sys_syscall_h { + header "$sysroot/sys/syscall.h" + export * + } + module syscall_h { + header "$sysroot/syscall.h" + export * + } + module xlocale_h { + header "$sysroot/xlocale.h" + export * + } +} + +module sys_stage2 [system] [extern_c] { + module asm_generic_fcntl_h { + header "$sysroot/asm-generic/fcntl.h" + export * + } + module asm_fcntl_h { + header "$sysroot/x86_64-linux-android/asm/fcntl.h" + export * + } + module bits_fenv_x86_64_h { + header "$sysroot/bits/fenv_x86_64.h" + export * + } + module bits_flock_h { + header "$sysroot/bits/flock.h" + export * + } + module bits_lockf_h { + header "$sysroot/bits/lockf.h" + export * + } + module bits_pthread_types_h { + header "$sysroot/bits/pthread_types.h" + header "$sysroot/sys/types.h" + export * + } + module bits_signal_types_h { + header "$sysroot/bits/signal_types.h" + export * + } + module bits_strcasecmp_h { + header "$sysroot/bits/strcasecmp.h" + export * + } + module bits_timespec_h { + header "$sysroot/bits/timespec.h" + export * + } + module fcntl_h { + header "$sysroot/fcntl.h" + export * + } + module linux_fcntl_h { + header "$sysroot/linux/fcntl.h" + export * + } + module linux_time_h { + header "$sysroot/linux/time.h" + header "$sysroot/linux/time_types.h" + export * + } + module malloc_h { + header "$sysroot/malloc.h" + export * + } + module pthread_h { + header "$sysroot/pthread.h" + export * + } + module sched_h { + header "$sysroot/sched.h" + export * + } + module signal_h { + header "$sysroot/signal.h" + header "$sysroot/sys/ucontext.h" + export * + } + module stdio_h { + header "$sysroot/stdio.h" + export * + } + module stdlib_h { + header "$sysroot/stdlib.h" + export * + } + module strings_h { + header "$sysroot/strings.h" + export * + } + module sys_select_h { + header "$sysroot/sys/select.h" + export * + } + module sys_time_h { + header "$sysroot/sys/time.h" + export * + } + module sys_user_h { + header "$sysroot/sys/user.h" + export * + } + module threads_h { + header "$sysroot/threads.h" + export * + } + module time_h { + header "$sysroot/time.h" + export * + } + module unistd_h { + header "$sysroot/unistd.h" + export * + } + module wchar_h { + header "$sysroot/wchar.h" + export * + } +} diff --git a/naiveproxy/src/build/modules/android-x86/BUILD.gn b/naiveproxy/src/build/modules/android-x86/BUILD.gn new file mode 100644 index 0000000000..e60e0b254a --- /dev/null +++ b/naiveproxy/src/build/modules/android-x86/BUILD.gn @@ -0,0 +1,267 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# AUTOGENERATED FILE. DO NOT EDIT. +# To regenerate, see instructions at build/modules/modularize/README.md + +import("//buildtools/third_party/libc++/modules.gni") + +sysroot_modulemap("sysroot_modulemap") { + source = "module.modulemap.in" + out = "${target_gen_dir}/module.modulemap" +} + +builtin_module("_Builtin_float") { +} + +builtin_module("_Builtin_intrinsics") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std_core", + ":sys_stage1", + ":sys_stage2", + ] +} + +builtin_module("_Builtin_inttypes") { + public_deps = [ + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_iso646") { +} + +builtin_module("_Builtin_limits") { + public_deps = [ + ":std_float_h", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_stdalign") { +} + +builtin_module("_Builtin_stdarg") { +} + +builtin_module("_Builtin_stdatomic") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_stdbool") { +} + +builtin_module("_Builtin_stdcountof") { +} + +builtin_module("_Builtin_stddef") { +} + +builtin_module("_Builtin_stddef_wint_t") { +} + +builtin_module("_Builtin_stdint") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_stdnoreturn") { +} + +builtin_module("_Builtin_unwind") { + public_deps = [ ":_Builtin_stdint" ] +} + +builtin_module("ptrauth") { +} + +libcxx_module("std") { + public_deps = [ + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stddef", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_string_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_stage1", + ":sys_stage2", + ] +} + +libcxx_module("std_complex_h") { + public_deps = [ + ":std", + ":sys_stage1", + ] +} + +libcxx_module("std_core") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +libcxx_module("std_ctype_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_errno_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_fenv_h") { + public_deps = [ + ":sys_stage1", + ":sys_stage2", + ] +} + +libcxx_module("std_float_h") { + public_deps = [ + ":_Builtin_float", + ":sys_stage1", + ] +} + +libcxx_module("std_inttypes_h") { + public_deps = [ + ":_Builtin_inttypes", + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +libcxx_module("std_math_h") { + public_deps = [ + ":_Builtin_limits", + ":std_core", + ":sys_stage1", + ] +} + +libcxx_module("std_private_mbstate_t") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ":sys_stage2", + ] + defines = [ "_LIBCPP_WCHAR_H_HAS_CONST_OVERLOADS" ] +} + +libcxx_module("std_stdatomic_h") { + public_deps = [ + ":_Builtin_stdatomic", + ":std", + ":sys_stage1", + ] +} + +libcxx_module("std_string_h") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ":sys_stage2", + ] +} + +libcxx_module("std_tgmath_h") { + public_deps = [ + ":std", + ":sys_stage1", + ] +} + +libcxx_module("std_uchar_h") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ] +} + +libcxx_module("std_wctype_h") { + public_deps = [ ":sys_stage1" ] +} + +sysroot_module("sys_stage1") { + public_deps = [ ":_Builtin_stddef" ] +} + +sysroot_module("sys_stage2") { + public_deps = [ + ":_Builtin_limits", + ":_Builtin_stdarg", + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std_core", + ":std_errno_h", + ":sys_stage1", + ] +} + +group("all_modules") { + public_deps = [ + ":_Builtin_float", + ":_Builtin_intrinsics", + ":_Builtin_inttypes", + ":_Builtin_iso646", + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stdatomic", + ":_Builtin_stdbool", + ":_Builtin_stdcountof", + ":_Builtin_stddef", + ":_Builtin_stddef_wint_t", + ":_Builtin_stdint", + ":_Builtin_stdnoreturn", + ":_Builtin_unwind", + ":ptrauth", + ":std", + ":std_complex_h", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_stdatomic_h", + ":std_string_h", + ":std_tgmath_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_stage1", + ":sys_stage2", + ] +} + +config("all_modulemap_configs") { + configs = [ + "//buildtools/third_party/libc++:builtin_modulemap", + "//buildtools/third_party/libc++:libcxx_modulemap", + ":sysroot_modulemap", + ] +} diff --git a/naiveproxy/src/build/modules/android-x86/module.modulemap.in b/naiveproxy/src/build/modules/android-x86/module.modulemap.in new file mode 100644 index 0000000000..89381fe375 --- /dev/null +++ b/naiveproxy/src/build/modules/android-x86/module.modulemap.in @@ -0,0 +1,369 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// AUTOGENERATED FILE. DO NOT EDIT. +// To regenerate, see instructions at build/modules/modularize/README.md + + +module sys_stage1 [system] [extern_c] { + module alloca_h { + header "$sysroot/alloca.h" + export * + } + module android_api_level_h { + header "$sysroot/android/api-level.h" + header "$sysroot/sys/cdefs.h" + export * + } + module android_ndk_version_h { + header "$sysroot/android/ndk-version.h" + export * + } + module android_versioning_h { + header "$sysroot/android/versioning.h" + export * + } + module asm_generic_errno_base_h { + header "$sysroot/asm-generic/errno-base.h" + export * + } + module asm_generic_errno_h { + header "$sysroot/asm-generic/errno.h" + export * + } + module asm_generic_int_ll64_h { + header "$sysroot/asm-generic/int-ll64.h" + export * + } + module asm_generic_ioctl_h { + header "$sysroot/asm-generic/ioctl.h" + export * + } + module asm_generic_ioctls_h { + header "$sysroot/asm-generic/ioctls.h" + export * + } + module asm_generic_siginfo_h { + header "$sysroot/asm-generic/siginfo.h" + export * + } + module asm_generic_signal_defs_h { + header "$sysroot/asm-generic/signal-defs.h" + export * + } + module asm_generic_termbits_common_h { + header "$sysroot/asm-generic/termbits-common.h" + export * + } + module asm_generic_termbits_h { + header "$sysroot/asm-generic/termbits.h" + export * + } + module asm_generic_termios_h { + header "$sysroot/asm-generic/termios.h" + export * + } + module asm_generic_types_h { + header "$sysroot/asm-generic/types.h" + export * + } + module asm_bitsperlong_h { + header "$sysroot/i686-linux-android/asm/bitsperlong.h" + export * + } + module asm_errno_h { + header "$sysroot/i686-linux-android/asm/errno.h" + export * + } + module asm_ioctl_h { + header "$sysroot/i686-linux-android/asm/ioctl.h" + export * + } + module asm_ioctls_h { + header "$sysroot/i686-linux-android/asm/ioctls.h" + export * + } + module asm_posix_types_32_h { + header "$sysroot/i686-linux-android/asm/posix_types_32.h" + export * + } + module asm_sigcontext_h { + header "$sysroot/i686-linux-android/asm/sigcontext.h" + export * + } + module asm_siginfo_h { + header "$sysroot/i686-linux-android/asm/siginfo.h" + export * + } + module asm_signal_h { + header "$sysroot/i686-linux-android/asm/signal.h" + export * + } + module asm_termbits_h { + header "$sysroot/i686-linux-android/asm/termbits.h" + export * + } + module asm_termios_h { + header "$sysroot/i686-linux-android/asm/termios.h" + export * + } + module asm_types_h { + header "$sysroot/i686-linux-android/asm/types.h" + export * + } + module bits_bionic_multibyte_result_h { + header "$sysroot/bits/bionic_multibyte_result.h" + export * + } + module bits_fcntl_h { + header "$sysroot/bits/fcntl.h" + export * + } + module bits_flock64_h { + header "$sysroot/bits/flock64.h" + export * + } + module bits_getopt_h { + header "$sysroot/bits/getopt.h" + export * + } + module bits_ioctl_h { + header "$sysroot/bits/ioctl.h" + export * + } + module bits_mbstate_t_h { + header "$sysroot/bits/mbstate_t.h" + export * + } + module bits_page_size_h { + header "$sysroot/bits/page_size.h" + export * + } + module bits_seek_constants_h { + header "$sysroot/bits/seek_constants.h" + export * + } + module bits_wait_h { + header "$sysroot/bits/wait.h" + export * + } + module bits_wchar_limits_h { + header "$sysroot/bits/wchar_limits.h" + export * + } + module features_h { + header "$sysroot/features.h" + export * + } + module getopt_h { + header "$sysroot/getopt.h" + export * + } + module linux_compiler_h { + header "$sysroot/linux/compiler.h" + export * + } + module linux_compiler_types_h { + header "$sysroot/linux/compiler_types.h" + export * + } + module linux_errno_h { + header "$sysroot/linux/errno.h" + export * + } + module linux_fadvise_h { + header "$sysroot/linux/fadvise.h" + export * + } + module linux_falloc_h { + header "$sysroot/linux/falloc.h" + export * + } + module linux_ioctl_h { + header "$sysroot/linux/ioctl.h" + export * + } + module linux_limits_h { + header "$sysroot/linux/limits.h" + export * + } + module linux_openat2_h { + header "$sysroot/linux/openat2.h" + export * + } + module linux_posix_types_h { + header "$sysroot/linux/posix_types.h" + export * + } + module linux_sched_h { + header "$sysroot/linux/sched.h" + export * + } + module linux_signal_h { + header "$sysroot/linux/signal.h" + export * + } + module linux_stat_h { + header "$sysroot/linux/stat.h" + export * + } + module linux_stddef_h { + header "$sysroot/linux/stddef.h" + export * + } + module linux_termios_h { + header "$sysroot/linux/termios.h" + export * + } + module linux_tty_h { + header "$sysroot/linux/tty.h" + export * + } + module linux_types_h { + header "$sysroot/linux/types.h" + export * + } + module linux_uio_h { + header "$sysroot/linux/uio.h" + export * + } + module linux_wait_h { + header "$sysroot/linux/wait.h" + export * + } + module locale_h { + header "$sysroot/locale.h" + export * + } + module setjmp_h { + header "$sysroot/setjmp.h" + export * + } + module sys_ioctl_h { + header "$sysroot/sys/ioctl.h" + export * + } + module sys_syscall_h { + header "$sysroot/sys/syscall.h" + export * + } + module syscall_h { + header "$sysroot/syscall.h" + export * + } + module xlocale_h { + header "$sysroot/xlocale.h" + export * + } +} + +module sys_stage2 [system] [extern_c] { + module asm_generic_fcntl_h { + header "$sysroot/asm-generic/fcntl.h" + export * + } + module asm_fcntl_h { + header "$sysroot/i686-linux-android/asm/fcntl.h" + export * + } + module bits_fenv_x86_h { + header "$sysroot/bits/fenv_x86.h" + export * + } + module bits_flock_h { + header "$sysroot/bits/flock.h" + export * + } + module bits_lockf_h { + header "$sysroot/bits/lockf.h" + export * + } + module bits_pthread_types_h { + header "$sysroot/bits/pthread_types.h" + header "$sysroot/sys/types.h" + export * + } + module bits_signal_types_h { + header "$sysroot/bits/signal_types.h" + export * + } + module bits_strcasecmp_h { + header "$sysroot/bits/strcasecmp.h" + export * + } + module bits_timespec_h { + header "$sysroot/bits/timespec.h" + export * + } + module fcntl_h { + header "$sysroot/fcntl.h" + export * + } + module linux_fcntl_h { + header "$sysroot/linux/fcntl.h" + export * + } + module linux_time_h { + header "$sysroot/linux/time.h" + header "$sysroot/linux/time_types.h" + export * + } + module malloc_h { + header "$sysroot/malloc.h" + export * + } + module pthread_h { + header "$sysroot/pthread.h" + export * + } + module sched_h { + header "$sysroot/sched.h" + export * + } + module signal_h { + header "$sysroot/signal.h" + header "$sysroot/sys/ucontext.h" + export * + } + module stdio_h { + header "$sysroot/stdio.h" + export * + } + module stdlib_h { + header "$sysroot/stdlib.h" + export * + } + module strings_h { + header "$sysroot/strings.h" + export * + } + module sys_select_h { + header "$sysroot/sys/select.h" + export * + } + module sys_time_h { + header "$sysroot/sys/time.h" + export * + } + module sys_user_h { + header "$sysroot/sys/user.h" + export * + } + module threads_h { + header "$sysroot/threads.h" + export * + } + module time_h { + header "$sysroot/time.h" + export * + } + module unistd_h { + header "$sysroot/unistd.h" + export * + } + module wchar_h { + header "$sysroot/wchar.h" + export * + } +} diff --git a/naiveproxy/src/build/modules/fuchsia/BUILD.gn b/naiveproxy/src/build/modules/fuchsia/BUILD.gn new file mode 100644 index 0000000000..636f78ae11 --- /dev/null +++ b/naiveproxy/src/build/modules/fuchsia/BUILD.gn @@ -0,0 +1,219 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# AUTOGENERATED FILE. DO NOT EDIT. +# To regenerate, see instructions at build/modules/modularize/README.md + +import("//buildtools/third_party/libc++/modules.gni") + +sysroot_modulemap("sysroot_modulemap") { + source = "module.modulemap.in" + out = "${target_gen_dir}/module.modulemap" +} + +builtin_module("_Builtin_float") { +} + +builtin_module("_Builtin_intrinsics") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std_core", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_inttypes") { + public_deps = [ ":_Builtin_stdint" ] +} + +builtin_module("_Builtin_iso646") { +} + +builtin_module("_Builtin_limits") { + public_deps = [ ":sys_stage1" ] +} + +builtin_module("_Builtin_stdalign") { +} + +builtin_module("_Builtin_stdarg") { +} + +builtin_module("_Builtin_stdatomic") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ] +} + +builtin_module("_Builtin_stdbool") { +} + +builtin_module("_Builtin_stdcountof") { +} + +builtin_module("_Builtin_stddef") { +} + +builtin_module("_Builtin_stddef_wint_t") { +} + +builtin_module("_Builtin_stdint") { +} + +builtin_module("_Builtin_stdnoreturn") { +} + +builtin_module("_Builtin_unwind") { + public_deps = [ ":_Builtin_stdint" ] +} + +builtin_module("ptrauth") { +} + +libcxx_module("std") { + public_deps = [ + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stddef", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_string_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_stage1", + ] +} + +libcxx_module("std_complex_h") { + public_deps = [ ":std" ] +} + +libcxx_module("std_core") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ] +} + +libcxx_module("std_ctype_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_errno_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_fenv_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_float_h") { + public_deps = [ ":_Builtin_float" ] +} + +libcxx_module("std_inttypes_h") { + public_deps = [ + ":_Builtin_inttypes", + ":_Builtin_stdint", + ] +} + +libcxx_module("std_math_h") { + public_deps = [ + ":std_core", + ":sys_stage1", + ] +} + +libcxx_module("std_private_mbstate_t") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ] + defines = [ "_LIBCPP_WCHAR_H_HAS_CONST_OVERLOADS" ] +} + +libcxx_module("std_stdatomic_h") { + public_deps = [ ":_Builtin_stdatomic" ] +} + +libcxx_module("std_string_h") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ] +} + +libcxx_module("std_tgmath_h") { + public_deps = [ ":std" ] +} + +libcxx_module("std_uchar_h") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ] +} + +libcxx_module("std_wctype_h") { + public_deps = [ ":sys_stage1" ] +} + +sysroot_module("sys_stage1") { + public_deps = [ ":_Builtin_stddef" ] +} + +group("all_modules") { + public_deps = [ + ":_Builtin_float", + ":_Builtin_intrinsics", + ":_Builtin_inttypes", + ":_Builtin_iso646", + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stdatomic", + ":_Builtin_stdbool", + ":_Builtin_stdcountof", + ":_Builtin_stddef", + ":_Builtin_stddef_wint_t", + ":_Builtin_stdint", + ":_Builtin_stdnoreturn", + ":_Builtin_unwind", + ":ptrauth", + ":std", + ":std_complex_h", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_stdatomic_h", + ":std_string_h", + ":std_tgmath_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_stage1", + ] +} + +config("all_modulemap_configs") { + configs = [ + "//buildtools/third_party/libc++:builtin_modulemap", + "//buildtools/third_party/libc++:libcxx_modulemap", + ":sysroot_modulemap", + ] +} diff --git a/naiveproxy/src/build/modules/fuchsia/module.modulemap.in b/naiveproxy/src/build/modules/fuchsia/module.modulemap.in new file mode 100644 index 0000000000..4a7dd67281 --- /dev/null +++ b/naiveproxy/src/build/modules/fuchsia/module.modulemap.in @@ -0,0 +1,94 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// AUTOGENERATED FILE. DO NOT EDIT. +// To regenerate, see instructions at build/modules/modularize/README.md + + +module sys_stage1 [system] [extern_c] { + module __llvm_libc_common_h { + header "$sysroot/__llvm-libc-common.h" + export * + } + module alloca_h { + header "$sysroot/alloca.h" + export * + } + module fcntl_h { + header "$sysroot/fcntl.h" + export * + } + module features_h { + header "$sysroot/features.h" + export * + } + module getopt_h { + header "$sysroot/getopt.h" + export * + } + module llvm_libc_macros_fenv_macros_h { + header "$sysroot/llvm-libc-macros/fenv-macros.h" + export * + } + module llvm_libc_types_fenv_t_h { + header "$sysroot/llvm-libc-types/fenv_t.h" + export * + } + module llvm_libc_types_fexcept_t_h { + header "$sysroot/llvm-libc-types/fexcept_t.h" + export * + } + module locale_h { + header "$sysroot/locale.h" + export * + } + module pthread_h { + header "$sysroot/pthread.h" + export * + } + module sched_h { + header "$sysroot/sched.h" + export * + } + module setjmp_h { + header "$sysroot/setjmp.h" + export * + } + module signal_h { + header "$sysroot/signal.h" + export * + } + module stdio_h { + header "$sysroot/stdio.h" + export * + } + module stdlib_h { + header "$sysroot/stdlib.h" + export * + } + module strings_h { + header "$sysroot/strings.h" + export * + } + module sys_ioctl_h { + header "$sysroot/sys/ioctl.h" + export * + } + module threads_h { + header "$sysroot/threads.h" + export * + } + module time_h { + header "$sysroot/time.h" + export * + } + module unistd_h { + header "$sysroot/unistd.h" + export * + } + module wchar_h { + header "$sysroot/wchar.h" + export * + } +} diff --git a/naiveproxy/src/build/modules/linux-x64/BUILD.gn b/naiveproxy/src/build/modules/linux-x64/BUILD.gn index c96deb47b9..d516d8444a 100644 --- a/naiveproxy/src/build/modules/linux-x64/BUILD.gn +++ b/naiveproxy/src/build/modules/linux-x64/BUILD.gn @@ -3,10 +3,15 @@ # found in the LICENSE file. # AUTOGENERATED FILE. DO NOT EDIT. -# To regenerate, run build/modules/modularize/modularize.py +# To regenerate, see instructions at build/modules/modularize/README.md import("//buildtools/third_party/libc++/modules.gni") +sysroot_modulemap("sysroot_modulemap") { + source = "module.modulemap.in" + out = "${target_gen_dir}/module.modulemap" +} + builtin_module("_Builtin_float") { } @@ -67,10 +72,6 @@ builtin_module("_Builtin_stdint") { builtin_module("_Builtin_stdnoreturn") { } -builtin_module("_Builtin_tgmath") { - public_deps = [ ":std_math_h" ] -} - builtin_module("_Builtin_unwind") { public_deps = [ ":_Builtin_stdint" ] } @@ -200,8 +201,8 @@ sysroot_module("sys_stage2") { ] } -alias("all_modules") { - actual = [ +group("all_modules") { + public_deps = [ ":_Builtin_float", ":_Builtin_intrinsics", ":_Builtin_inttypes", @@ -216,7 +217,6 @@ alias("all_modules") { ":_Builtin_stddef_wint_t", ":_Builtin_stdint", ":_Builtin_stdnoreturn", - ":_Builtin_tgmath", ":_Builtin_unwind", ":ptrauth", ":std", @@ -238,3 +238,11 @@ alias("all_modules") { ":sys_stage2", ] } + +config("all_modulemap_configs") { + configs = [ + "//buildtools/third_party/libc++:builtin_modulemap", + "//buildtools/third_party/libc++:libcxx_modulemap", + ":sysroot_modulemap", + ] +} diff --git a/naiveproxy/src/build/modules/linux-x64/module.modulemap b/naiveproxy/src/build/modules/linux-x64/module.modulemap deleted file mode 100644 index c0842e547f..0000000000 --- a/naiveproxy/src/build/modules/linux-x64/module.modulemap +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2025 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// AUTOGENERATED FILE. DO NOT EDIT. -// To regenerate, run build/modules/modularize/modularize.py - - -module sys_stage1 [system] [extern_c] { - module sysroot_alloca_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/alloca.h" - export * - } - module sysroot_asm_generic_errno_base_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/asm-generic/errno-base.h" - export * - } - module sysroot_asm_generic_errno_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/asm-generic/errno.h" - export * - } - module sysroot_asm_errno_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/asm/errno.h" - export * - } - module sysroot_endian_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/endian.h" - export * - } - module sysroot_fcntl_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/fcntl.h" - export * - } - module sysroot_features_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/features.h" - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/sys/cdefs.h" - export * - } - module sysroot_gnu_stubs_64_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/gnu/stubs-64.h" - export * - } - module sysroot_gnu_stubs_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/gnu/stubs.h" - export * - } - module sysroot_linux_errno_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/linux/errno.h" - export * - } - module sysroot_linux_falloc_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/linux/falloc.h" - export * - } - module sysroot_linux_limits_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/linux/limits.h" - export * - } - module sysroot_locale_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/locale.h" - export * - } - module sysroot_nl_types_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/nl_types.h" - export * - } - module sysroot_pthread_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/pthread.h" - export * - } - module sysroot_sched_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/sched.h" - export * - } - module sysroot_setjmp_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/setjmp.h" - export * - } - module sysroot_signal_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/signal.h" - export * - } - module sysroot_stdc_predef_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/stdc-predef.h" - export * - } - module sysroot_stdio_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/stdio.h" - export * - } - module sysroot_strings_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/strings.h" - export * - } - module sysroot_sys_select_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/sys/select.h" - export * - } - module sysroot_sys_types_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/sys/types.h" - export * - } - module sysroot_sys_ucontext_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/sys/ucontext.h" - export * - } - module sysroot_threads_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/threads.h" - export * - } - module sysroot_time_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/time.h" - export * - } - module sysroot_unistd_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/unistd.h" - export * - } -} - -module sys_stage2 [system] [extern_c] { - module sysroot_stdlib_h { - header "../../linux/debian_bullseye_amd64-sysroot/usr/include/stdlib.h" - export * - } -} diff --git a/naiveproxy/src/build/modules/linux-x64/module.modulemap.in b/naiveproxy/src/build/modules/linux-x64/module.modulemap.in new file mode 100644 index 0000000000..98d6ad98f7 --- /dev/null +++ b/naiveproxy/src/build/modules/linux-x64/module.modulemap.in @@ -0,0 +1,141 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// AUTOGENERATED FILE. DO NOT EDIT. +// To regenerate, see instructions at build/modules/modularize/README.md + + +module sys_stage1 [system] [extern_c] { + module alloca_h { + header "$sysroot/alloca.h" + export * + } + module asm_generic_errno_base_h { + header "$sysroot/asm-generic/errno-base.h" + export * + } + module asm_generic_errno_h { + header "$sysroot/asm-generic/errno.h" + export * + } + module asm_generic_int_ll64_h { + header "$sysroot/asm-generic/int-ll64.h" + export * + } + module asm_generic_ioctl_h { + header "$sysroot/asm-generic/ioctl.h" + export * + } + module asm_generic_ioctls_h { + header "$sysroot/asm-generic/ioctls.h" + export * + } + module asm_generic_posix_types_h { + header "$sysroot/asm-generic/posix_types.h" + export * + } + module endian_h { + header "$sysroot/endian.h" + export * + } + module fcntl_h { + header "$sysroot/fcntl.h" + export * + } + module features_h { + header "$sysroot/features.h" + export * + } + module getopt_h { + header "$sysroot/getopt.h" + export * + } + module linux_errno_h { + header "$sysroot/linux/errno.h" + export * + } + module linux_falloc_h { + header "$sysroot/linux/falloc.h" + export * + } + module linux_ioctl_h { + header "$sysroot/linux/ioctl.h" + export * + } + module linux_posix_types_h { + header "$sysroot/linux/posix_types.h" + export * + } + module linux_stddef_h { + header "$sysroot/linux/stddef.h" + export * + } + module linux_types_h { + header "$sysroot/linux/types.h" + export * + } + module locale_h { + header "$sysroot/locale.h" + export * + } + module nl_types_h { + header "$sysroot/nl_types.h" + export * + } + module pthread_h { + header "$sysroot/pthread.h" + export * + } + module sched_h { + header "$sysroot/sched.h" + export * + } + module setjmp_h { + header "$sysroot/setjmp.h" + export * + } + module signal_h { + header "$sysroot/signal.h" + export * + } + module stdc_predef_h { + header "$sysroot/stdc-predef.h" + export * + } + module stdio_h { + header "$sysroot/stdio.h" + export * + } + module strings_h { + header "$sysroot/strings.h" + export * + } + module syscall_h { + header "$sysroot/syscall.h" + export * + } + module threads_h { + header "$sysroot/threads.h" + export * + } + module time_h { + header "$sysroot/time.h" + export * + } + module unistd_h { + header "$sysroot/unistd.h" + export * + } + module wchar_h { + header "$sysroot/wchar.h" + export * + } +} + +module sys_stage2 [system] [extern_c] { + module stdlib_h { + header "$sysroot/stdlib.h" + export * + } +} diff --git a/naiveproxy/src/build/modules/linux/BUILD.gn b/naiveproxy/src/build/modules/linux/BUILD.gn new file mode 100644 index 0000000000..d516d8444a --- /dev/null +++ b/naiveproxy/src/build/modules/linux/BUILD.gn @@ -0,0 +1,248 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# AUTOGENERATED FILE. DO NOT EDIT. +# To regenerate, see instructions at build/modules/modularize/README.md + +import("//buildtools/third_party/libc++/modules.gni") + +sysroot_modulemap("sysroot_modulemap") { + source = "module.modulemap.in" + out = "${target_gen_dir}/module.modulemap" +} + +builtin_module("_Builtin_float") { +} + +builtin_module("_Builtin_intrinsics") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std_core", + ":sys_stage1", + ":sys_stage2", + ] +} + +builtin_module("_Builtin_inttypes") { + public_deps = [ + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_iso646") { +} + +builtin_module("_Builtin_limits") { + public_deps = [ ":sys_stage1" ] +} + +builtin_module("_Builtin_stdalign") { +} + +builtin_module("_Builtin_stdarg") { +} + +builtin_module("_Builtin_stdatomic") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_stdbool") { +} + +builtin_module("_Builtin_stdcountof") { +} + +builtin_module("_Builtin_stddef") { +} + +builtin_module("_Builtin_stddef_wint_t") { +} + +builtin_module("_Builtin_stdint") { + public_deps = [ ":sys_stage1" ] +} + +builtin_module("_Builtin_stdnoreturn") { +} + +builtin_module("_Builtin_unwind") { + public_deps = [ ":_Builtin_stdint" ] +} + +builtin_module("ptrauth") { +} + +libcxx_module("std") { + public_deps = [ + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stddef", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_string_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_stage1", + ":sys_stage2", + ] +} + +libcxx_module("std_complex_h") { + public_deps = [ + ":std", + ":sys_stage1", + ] +} + +libcxx_module("std_core") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +libcxx_module("std_ctype_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_errno_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_fenv_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_float_h") { + public_deps = [ + ":_Builtin_float", + ":sys_stage1", + ] +} + +libcxx_module("std_inttypes_h") { + public_deps = [ + ":_Builtin_inttypes", + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +libcxx_module("std_math_h") { + public_deps = [ + ":std_core", + ":sys_stage1", + ] +} + +libcxx_module("std_private_mbstate_t") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_stdatomic_h") { + public_deps = [ + ":_Builtin_stdatomic", + ":sys_stage1", + ] +} + +libcxx_module("std_string_h") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ] +} + +libcxx_module("std_tgmath_h") { + public_deps = [ + ":std", + ":sys_stage1", + ] +} + +libcxx_module("std_uchar_h") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ] +} + +libcxx_module("std_wctype_h") { + public_deps = [ ":sys_stage1" ] +} + +sysroot_module("sys_stage1") { + public_deps = [ + ":_Builtin_stdarg", + ":_Builtin_stddef", + ] +} + +sysroot_module("sys_stage2") { + public_deps = [ + ":_Builtin_limits", + ":_Builtin_stddef", + ":sys_stage1", + ] +} + +group("all_modules") { + public_deps = [ + ":_Builtin_float", + ":_Builtin_intrinsics", + ":_Builtin_inttypes", + ":_Builtin_iso646", + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stdatomic", + ":_Builtin_stdbool", + ":_Builtin_stdcountof", + ":_Builtin_stddef", + ":_Builtin_stddef_wint_t", + ":_Builtin_stdint", + ":_Builtin_stdnoreturn", + ":_Builtin_unwind", + ":ptrauth", + ":std", + ":std_complex_h", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_stdatomic_h", + ":std_string_h", + ":std_tgmath_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_stage1", + ":sys_stage2", + ] +} + +config("all_modulemap_configs") { + configs = [ + "//buildtools/third_party/libc++:builtin_modulemap", + "//buildtools/third_party/libc++:libcxx_modulemap", + ":sysroot_modulemap", + ] +} diff --git a/naiveproxy/src/build/modules/linux/module.modulemap.in b/naiveproxy/src/build/modules/linux/module.modulemap.in new file mode 100644 index 0000000000..8ad28a285d --- /dev/null +++ b/naiveproxy/src/build/modules/linux/module.modulemap.in @@ -0,0 +1,121 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// AUTOGENERATED FILE. DO NOT EDIT. +// To regenerate, see instructions at build/modules/modularize/README.md + + +module sys_stage1 [system] [extern_c] { + module alloca_h { + header "$sysroot/alloca.h" + export * + } + module asm_generic_errno_base_h { + header "$sysroot/asm-generic/errno-base.h" + export * + } + module asm_generic_errno_h { + header "$sysroot/asm-generic/errno.h" + export * + } + module asm_generic_ioctl_h { + header "$sysroot/asm-generic/ioctl.h" + export * + } + module asm_generic_ioctls_h { + header "$sysroot/asm-generic/ioctls.h" + export * + } + module endian_h { + header "$sysroot/endian.h" + export * + } + module fcntl_h { + header "$sysroot/fcntl.h" + export * + } + module features_h { + header "$sysroot/features.h" + export * + } + module getopt_h { + header "$sysroot/getopt.h" + export * + } + module linux_errno_h { + header "$sysroot/linux/errno.h" + export * + } + module linux_falloc_h { + header "$sysroot/linux/falloc.h" + export * + } + module linux_ioctl_h { + header "$sysroot/linux/ioctl.h" + export * + } + module locale_h { + header "$sysroot/locale.h" + export * + } + module nl_types_h { + header "$sysroot/nl_types.h" + export * + } + module pthread_h { + header "$sysroot/pthread.h" + export * + } + module sched_h { + header "$sysroot/sched.h" + export * + } + module setjmp_h { + header "$sysroot/setjmp.h" + export * + } + module signal_h { + header "$sysroot/signal.h" + export * + } + module stdc_predef_h { + header "$sysroot/stdc-predef.h" + export * + } + module stdio_h { + header "$sysroot/stdio.h" + export * + } + module strings_h { + header "$sysroot/strings.h" + export * + } + module syscall_h { + header "$sysroot/syscall.h" + export * + } + module threads_h { + header "$sysroot/threads.h" + export * + } + module time_h { + header "$sysroot/time.h" + export * + } + module unistd_h { + header "$sysroot/unistd.h" + export * + } + module wchar_h { + header "$sysroot/wchar.h" + export * + } +} + +module sys_stage2 [system] [extern_c] { + module stdlib_h { + header "$sysroot/stdlib.h" + export * + } +} diff --git a/naiveproxy/src/build/modules/mac_xcode2600/BUILD.gn b/naiveproxy/src/build/modules/mac_xcode2600/BUILD.gn new file mode 100644 index 0000000000..4df9cc6b50 --- /dev/null +++ b/naiveproxy/src/build/modules/mac_xcode2600/BUILD.gn @@ -0,0 +1,398 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# AUTOGENERATED FILE. DO NOT EDIT. +# To regenerate, see instructions at build/modules/modularize/README.md + +import("//buildtools/third_party/libc++/modules.gni") + +apple_sysroot_modulemap("DarwinFoundation1_modulemap") { + sysroot_path = "DarwinFoundation1.modulemap" +} +apple_sysroot_module("TargetConditionals") { + modulemap = ":DarwinFoundation1_modulemap" + modulemap_path = "DarwinFoundation1.modulemap" + public_deps = [ ":_DarwinFoundation1" ] +} + +apple_sysroot_module("_AvailabilityInternal") { + modulemap = ":DarwinFoundation1_modulemap" + modulemap_path = "DarwinFoundation1.modulemap" +} + +builtin_module("_Builtin_float") { +} + +builtin_module("_Builtin_intrinsics") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":_DarwinFoundation3", + ":std_core", + ] +} + +builtin_module("_Builtin_inttypes") { + public_deps = [ ":_DarwinFoundation3" ] +} + +builtin_module("_Builtin_iso646") { +} + +builtin_module("_Builtin_limits") { + public_deps = [ ":_DarwinFoundation1" ] +} + +builtin_module("_Builtin_stdalign") { +} + +builtin_module("_Builtin_stdarg") { +} + +builtin_module("_Builtin_stdatomic") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ] +} + +builtin_module("_Builtin_stdbool") { +} + +builtin_module("_Builtin_stdcountof") { +} + +builtin_module("_Builtin_stddef") { +} + +builtin_module("_Builtin_stddef_wint_t") { +} + +builtin_module("_Builtin_stdint") { + public_deps = [ ":_DarwinFoundation2" ] +} + +builtin_module("_Builtin_stdnoreturn") { +} + +builtin_module("_Builtin_unwind") { + public_deps = [ + ":_Builtin_stdint", + ":unwind", + ] +} + +apple_sysroot_module("_DarwinFoundation1") { + modulemap = ":DarwinFoundation1_modulemap" + modulemap_path = "DarwinFoundation1.modulemap" + public_deps = [ ":_AvailabilityInternal" ] +} + +apple_sysroot_modulemap("DarwinFoundation2_modulemap") { + sysroot_path = "DarwinFoundation2.modulemap" +} +apple_sysroot_module("_DarwinFoundation2") { + modulemap = ":DarwinFoundation2_modulemap" + modulemap_path = "DarwinFoundation2.modulemap" + public_deps = [ + ":_Builtin_stdarg", + ":_Builtin_stddef", + ":_DarwinFoundation1", + ] +} + +apple_sysroot_modulemap("DarwinFoundation3_modulemap") { + sysroot_path = "DarwinFoundation3.modulemap" +} +apple_sysroot_module("_DarwinFoundation3") { + modulemap = ":DarwinFoundation3_modulemap" + modulemap_path = "DarwinFoundation3.modulemap" + public_deps = [ + ":_Builtin_stdarg", + ":_Builtin_stddef", + ":_Builtin_stdint", + ":_DarwinFoundation1", + ":_DarwinFoundation2", + ":std_ctype_h", + ] +} + +apple_sysroot_module("alloca") { + modulemap = ":DarwinFoundation2_modulemap" + modulemap_path = "DarwinFoundation2.modulemap" + public_deps = [ ":_DarwinFoundation2" ] +} + +apple_sysroot_modulemap("libunwind_modulemap") { + sysroot_path = "libunwind.modulemap" +} +apple_sysroot_module("libunwind") { + modulemap = ":libunwind_modulemap" + modulemap_path = "libunwind.modulemap" + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":_DarwinFoundation1", + ":unwind", + ] +} + +apple_sysroot_module("nl_types") { + modulemap = ":DarwinFoundation2_modulemap" + modulemap_path = "DarwinFoundation2.modulemap" + public_deps = [ ":_DarwinFoundation2" ] +} + +apple_sysroot_module("os_availability") { + modulemap = ":DarwinFoundation1_modulemap" + modulemap_path = "DarwinFoundation1.modulemap" + public_deps = [ ":_DarwinFoundation1" ] +} + +apple_sysroot_module("pthread") { + modulemap = ":DarwinFoundation3_modulemap" + modulemap_path = "DarwinFoundation3.modulemap" + public_deps = [ ":_DarwinFoundation3" ] +} + +builtin_module("ptrauth") { +} + +apple_sysroot_module("runetype") { + modulemap = ":DarwinFoundation2_modulemap" + modulemap_path = "DarwinFoundation2.modulemap" + public_deps = [ ":_DarwinFoundation2" ] +} + +apple_sysroot_module("sched") { + modulemap = ":DarwinFoundation3_modulemap" + modulemap_path = "DarwinFoundation3.modulemap" + public_deps = [ ":_DarwinFoundation3" ] +} + +libcxx_module("std") { + public_deps = [ + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stddef", + ":_DarwinFoundation2", + ":_DarwinFoundation3", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_string_h", + ":std_uchar_h", + ":std_wctype_h", + ":xlocale", + ] +} + +libcxx_module("std_complex_h") { + public_deps = [ ":std" ] +} + +libcxx_module("std_core") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ] +} + +libcxx_module("std_ctype_h") { + public_deps = [ ":_DarwinFoundation2" ] +} + +libcxx_module("std_errno_h") { + public_deps = [ ":_DarwinFoundation1" ] +} + +libcxx_module("std_fenv_h") { + public_deps = [ ":_DarwinFoundation1" ] +} + +libcxx_module("std_float_h") { + public_deps = [ ":_Builtin_float" ] +} + +libcxx_module("std_inttypes_h") { + public_deps = [ + ":_Builtin_inttypes", + ":_Builtin_stdint", + ] +} + +libcxx_module("std_math_h") { + public_deps = [ + ":_DarwinFoundation1", + ":std_core", + ] +} + +libcxx_module("std_private_mbstate_t") { + public_deps = [ ":_DarwinFoundation3" ] +} + +libcxx_module("std_stdatomic_h") { + public_deps = [ ":_Builtin_stdatomic" ] +} + +libcxx_module("std_string_h") { + public_deps = [ ":_DarwinFoundation2" ] +} + +libcxx_module("std_tgmath_h") { + public_deps = [ ":std" ] +} + +libcxx_module("std_uchar_h") { + public_deps = [ + ":_Builtin_stddef", + ":std_private_mbstate_t", + ] +} + +libcxx_module("std_wctype_h") { + public_deps = [ ":_DarwinFoundation3" ] +} + +apple_sysroot_module("sys_appleapiopts") { + modulemap = ":DarwinFoundation1_modulemap" + modulemap_path = "DarwinFoundation1.modulemap" + public_deps = [ ":_DarwinFoundation1" ] +} + +apple_sysroot_module("sys_cdefs") { + modulemap = ":DarwinFoundation1_modulemap" + modulemap_path = "DarwinFoundation1.modulemap" + public_deps = [ ":_DarwinFoundation1" ] +} + +apple_sysroot_module("sys_qos") { + modulemap = ":DarwinFoundation1_modulemap" + modulemap_path = "DarwinFoundation1.modulemap" + public_deps = [ ":_DarwinFoundation1" ] +} + +apple_sysroot_module("sys_resource") { + modulemap = ":DarwinFoundation3_modulemap" + modulemap_path = "DarwinFoundation3.modulemap" + public_deps = [ ":_DarwinFoundation3" ] +} + +apple_sysroot_module("sys_select") { + modulemap = ":DarwinFoundation3_modulemap" + modulemap_path = "DarwinFoundation3.modulemap" + public_deps = [ ":_DarwinFoundation3" ] +} + +apple_sysroot_module("sys_types") { + modulemap = ":DarwinFoundation2_modulemap" + modulemap_path = "DarwinFoundation2.modulemap" + public_deps = [ ":_DarwinFoundation2" ] +} + +apple_sysroot_module("sys_wait") { + modulemap = ":DarwinFoundation3_modulemap" + modulemap_path = "DarwinFoundation3.modulemap" + public_deps = [ ":_DarwinFoundation3" ] +} + +apple_sysroot_module("unistd") { + modulemap = ":DarwinFoundation3_modulemap" + modulemap_path = "DarwinFoundation3.modulemap" + public_deps = [ ":_DarwinFoundation3" ] +} + +apple_sysroot_module("unwind") { + modulemap = ":libunwind_modulemap" + modulemap_path = "libunwind.modulemap" + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ] +} + +apple_sysroot_module("xlocale") { + modulemap = ":DarwinFoundation3_modulemap" + modulemap_path = "DarwinFoundation3.modulemap" + public_deps = [ + ":_DarwinFoundation1", + ":_DarwinFoundation2", + ] +} + +group("all_modules") { + public_deps = [ + ":TargetConditionals", + ":_AvailabilityInternal", + ":_Builtin_float", + ":_Builtin_intrinsics", + ":_Builtin_inttypes", + ":_Builtin_iso646", + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stdatomic", + ":_Builtin_stdbool", + ":_Builtin_stdcountof", + ":_Builtin_stddef", + ":_Builtin_stddef_wint_t", + ":_Builtin_stdint", + ":_Builtin_stdnoreturn", + ":_Builtin_unwind", + ":_DarwinFoundation1", + ":_DarwinFoundation2", + ":_DarwinFoundation3", + ":alloca", + ":libunwind", + ":nl_types", + ":os_availability", + ":pthread", + ":ptrauth", + ":runetype", + ":sched", + ":std", + ":std_complex_h", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_stdatomic_h", + ":std_string_h", + ":std_tgmath_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_appleapiopts", + ":sys_cdefs", + ":sys_qos", + ":sys_resource", + ":sys_select", + ":sys_types", + ":sys_wait", + ":unistd", + ":unwind", + ":xlocale", + ] +} + +config("all_modulemap_configs") { + configs = [ + "//buildtools/third_party/libc++:builtin_modulemap", + "//buildtools/third_party/libc++:libcxx_modulemap", + ":DarwinFoundation1_modulemap", + ":DarwinFoundation2_modulemap", + ":DarwinFoundation3_modulemap", + ":libunwind_modulemap", + ] +} diff --git a/naiveproxy/src/build/modules/modularize/OWNERS b/naiveproxy/src/build/modules/modularize/OWNERS new file mode 100644 index 0000000000..d946e4cbba --- /dev/null +++ b/naiveproxy/src/build/modules/modularize/OWNERS @@ -0,0 +1,8 @@ +# Primary owner +msta@google.com + +# Secondary owner +tikuta@chromium.org + +# Chrome Build Team members +file://infra/config/groups/chrome-build/OWNERS diff --git a/naiveproxy/src/build/modules/modularize/README.md b/naiveproxy/src/build/modules/modularize/README.md new file mode 100644 index 0000000000..c4c3ea5e63 --- /dev/null +++ b/naiveproxy/src/build/modules/modularize/README.md @@ -0,0 +1,32 @@ +# What is modularize +Modularize is a tool named after clang's +[modularize](https://clang.llvm.org/extra/modularize.html) tool to allow you to +modularize a platform. + +# How do I use it? +If you want to create a new platform, you will want to do the following. If you +want to update an existing platform, you can either follow the instructions +below, or replace the `-C ` with `--all` to update all platforms +(strongly recommended to do this at least once before submitting). + +1) Create a gn output directory for said platform with the following values set: + * `target_os = ""` + * `target_cpu = ""` + * `use_clang_modules = true` (required because of libcxx's generated + directories) +2) Run `modularize.py -C out/ --cache` (`--cache` is strongly + recommended, `--no-cache` should only be used if you've modified + `compiler.py` or `modulemap.py`. Caching reduces the runtime from minutes to + ~1 second). +3) Check if it works (don't forget to set `use_autogenerated_modules = true` in + your `args.gn`) +4) If it doesn't work, you can modify `config.py` to add any customization, then + go back to step 2. + +For example, if you want to create a linux-arm64 configuration, you would create +or reuse an output directory with the following args.gn: +``` +target_os = "linux" +target_cpu = "arm64" +use_clang_modules = true +``` diff --git a/naiveproxy/src/build/modules/modularize/compiler.py b/naiveproxy/src/build/modules/modularize/compiler.py index b9ba024dc2..6634215166 100644 --- a/naiveproxy/src/build/modules/modularize/compiler.py +++ b/naiveproxy/src/build/modules/modularize/compiler.py @@ -4,29 +4,29 @@ import collections import functools -import hashlib -import itertools import logging import pathlib import pickle import re import shutil import subprocess -import sys import tempfile +import time -from graph import IncludeDir +import config +from graph import CompileStatus from graph import Header -from graph import HeaderRef +from graph import IncludeDir +from graph import calculate_rdeps +from platforms import Cpu +from platforms import Os +import modulemap -_MODULE_START = re.compile('^module ([a-z0-9_]+) ', flags=re.I) -_HEADER = re.compile('( textual)? header "([^"]*)"') - -# It doesn't matter if these don't work on all platforms. -# It'll just print a warning saying it failed to compile. -# This contains a list of files that aren't depended on by libc++, but we still -# want to precompile. -_SYSROOT_PRECOMPILED_HEADERS = ['fcntl.h'] +_FRAMEWORK = ' (framework directory)' +# Foo.framework/Versions/A/headers/Bar.h -> Foo/Bar.h +_FRAMEWORK_HEADER = re.compile( + r'([^/]+)\.framework/(?:Versions/[^/]+/)?(?:Headers|Modules)/(.*)') +_LIBCXXABI = '../../third_party/libc++abi/src/include' # Some of these steps are quite slow (O(minutes)). @@ -34,116 +34,71 @@ _SYSROOT_PRECOMPILED_HEADERS = ['fcntl.h'] def _maybe_cache(fn): @functools.wraps(fn) - def new_fn(self, *args, **kwargs): + def new_fn(self, *args): # The results should be solely dependent on the GN out dir (assuming the # user doesn't change args.gn) gn_rel = str(self.gn_out.resolve()).lstrip('/') - cache_path = pathlib.Path(f'/tmp/modularize_cache', gn_rel, fn.__name__) + cache_path = pathlib.Path(f'/tmp/modularize_cache', gn_rel, fn.__name__, + *args) cache_path.parent.mkdir(exist_ok=True, parents=True) if self._use_cache and cache_path.is_file(): - return pickle.loads(cache_path.read_bytes()) - result = fn(self, *args, **kwargs) + try: + return pickle.loads(cache_path.read_bytes()) + # When attempting to run this without a debugger after pickling from a + # debugger it fails to load pathlib._local. + except ModuleNotFoundError: + logging.info('Failed to unpickle - not using cache') + result = fn(self, *args) cache_path.write_bytes(pickle.dumps(result)) return result return new_fn -# We don't need a true parse, just want to determine which modules correspond -# to which files. -def _parse_modulemap(path: pathlib.Path) -> dict[str, list[tuple[str, bool]]]: - """Parses a modulemap into name -> [(header, textual)]""" - modules = collections.defaultdict(list) - with path.open() as f: - for line in f: - mod = _MODULE_START.match(line) - if mod is not None: - current_module = mod.group(1) - header = _HEADER.search(line) - if header is not None: - modules[current_module].append((header.group(2), bool(header.group(1)))) - # This is a builtin module with feature requirements. - modules.pop('opencl_c', None) - return modules - - class Compiler: def __init__(self, *, source_root: pathlib.Path, gn_out: pathlib.Path, - error_dir: pathlib.Path | None, use_cache: bool): + error_dir: pathlib.Path | None, use_cache: bool, os: Os, + cpu: Cpu): self._error_dir = error_dir self._use_cache = use_cache self.gn_out = gn_out self.source_root = source_root - self.os = self._get_os() - self.cpu = self._get_cpu() + self.os = os + self.cpu = cpu + self.sysroot_dir = IncludeDir.SysrootModule if self.os.is_apple else \ + IncludeDir.Sysroot + self.sysroot = None - if self.os == 'linux': - self.sysroot = self.source_root / 'build/linux/debian_bullseye_amd64-sysroot/usr/include' - elif self.os == 'android': - self.sysroot = self.source_root / 'third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include' - else: - self.sysroot = list( - source_root.glob( - 'third_party/depot_tools/win_toolchain/vs_files/*/Windows Kits/10/Include/*' - ))[0] - self.msvc_dir = list( - source_root.glob( - 'third_party/depot_tools/win_toolchain/vs_files/*/VC/Tools/MSVC/*/include' - ))[0] + # __eq__ and __hash__ are required for functools.cache to work correctly. + def __eq__(self, other): + return self.gn_out == other.gn_out + + def __hash__(self): + return hash(self.gn_out) def _parse_depfile(self, content: str) -> list[pathlib.Path]: + deps = content.replace('\\\n', '').split(': ', 1)[1] + deps = deps.replace('\\ ', ':SPACE:') files = [] # The file will look like: - # /dev/null: .cc \ - #
\ - # \ - # So we need [1:] to ensure it doesn't have a dependency on itself. - for line in content.rstrip().split('\n')[1:]: + # /dev/null: foo.h bar.cc \ + # baz.h \ + # + for dep in deps.split(): # Remove both the trailing newlines and any escapes in the file names. - files.append( - pathlib.Path(self.gn_out, - line.replace('\\', '').strip(' ')).resolve()) + p = pathlib.Path(self.gn_out, dep.replace(':SPACE:', ' ')).resolve() + if p.suffix != '.txt' and p.suffix != '.cc': + files.append(p) return files - def _get_gn_arg(self, name: str) -> str: - content = (self.gn_out / 'args.gn').read_text() - ps = subprocess.run( - ['gn', 'args', '.', f'--list={name}', '--short'], - text=True, - check=False, - cwd=self.gn_out, - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL, - ) - - # GN args outputs errors to stdout, so we can't use check=True. - if ps.returncode != 0: - print(ps.stdout, file=sys.stderr) - exit(1) - - # output format: 'target_cpu = "x64"\n' - return ps.stdout.rstrip().split(' = ')[1].strip('"') - def _clang_arg(self, arg: str) -> str: if self.os == 'win': return f'/clang:{arg}' else: return arg - @_maybe_cache - def _get_cpu(self): - # If the target_cpu is not explicitly set, it returns the empty string and - # it uses the host_cpu instead. - return self._get_gn_arg('target_cpu') or self._get_gn_arg('host_cpu') - - @_maybe_cache - def _get_os(self): - # If the target_os is not explicitly set, it returns the empty string and - # it uses the host_os instead. - return self._get_gn_arg('target_os') or self._get_gn_arg('host_os') - def _write_err(self, rel: str, content: bytes): if self._error_dir is not None: out = self._error_dir / rel @@ -156,7 +111,12 @@ class Compiler: assert path.is_absolute() for d, include_dir in self.include_dirs: if path.is_relative_to(d): - return include_dir, str(path.relative_to(d)) + rel = str(path.relative_to(d)) + if include_dir == IncludeDir.Framework: + framework, hdr = _FRAMEWORK_HEADER.search(rel).groups() + rel = f'{framework}/{hdr}' + return include_dir, rel + raise NotImplementedError(f'Unsupported path {path}') # Apply two layers of cache here. # The _maybe_cache layer caches between runs via a file. @@ -169,19 +129,17 @@ class Compiler: [ 'build/modules/modularize/no_modules_compile_command.sh', str(self.gn_out), - self.os, + str(self.os), ], check=True, text=True, cwd=self.source_root, stdout=subprocess.PIPE, - # Strip the -o /dev/null with [:-2] - # Windows requires it to be at the end, otherwise it writes to {output}.obj. + # Strip the -o /dev/null with [:-2]. Windows requires it to be at the + # end, otherwise it writes to {output}.obj. ).stdout.rstrip().replace('\\', '').split(' ')[:-2] - # Again, two layers of cache here to cache between runs and within a run. @functools.cached_property - @_maybe_cache def include_dirs(self) -> list[tuple[pathlib.Path, IncludeDir]]: cmd = self.base_command() + [ '-E', @@ -192,7 +150,7 @@ class Compiler: '-o', '/dev/null', ] - cmd.remove('-c') + cmd.remove('/c' if self.os == Os.Win else '-c') # include dir lines both start and end with whitespace lines = [ line.strip() for line in subprocess.run( @@ -212,22 +170,29 @@ class Compiler: # We don't care about these. dirs.remove('../..') dirs.remove('gen') - dirs.remove('../../third_party/libc++abi/src/include') + if _LIBCXXABI in dirs: + dirs.remove(_LIBCXXABI) out = [] for d in dirs: - d = (self.gn_out / d).resolve() - if d.is_relative_to(self.sysroot): - out.append((d, IncludeDir.Sysroot)) + is_framework = d.endswith(_FRAMEWORK) + d = (self.gn_out / d.removesuffix(_FRAMEWORK)).resolve() + + if is_framework: + out.append((d, IncludeDir.Framework)) elif 'libc++' in d.parts: out.append((d, IncludeDir.LibCxx)) elif 'clang' in d.parts: out.append((d, IncludeDir.Builtin)) + elif config.SYSROOT_DIRS.intersection(d.parts): + out.append((d, self.sysroot_dir)) + self.sysroot = d else: raise NotImplementedError(f'Unknown include directory {d}') return out + @_maybe_cache def compile_one( self, include: str ) -> tuple[subprocess.CompletedProcess, None | list[pathlib.Path]]: @@ -259,7 +224,7 @@ class Compiler: ] if logging.getLogger().isEnabledFor(logging.DEBUG): logging.debug('Running command: (cd %s && %s)', self.gn_out, - ' '.join(command)) + ' '.join(map(str, command))) ps = subprocess.run( command, stderr=subprocess.PIPE, @@ -271,13 +236,23 @@ class Compiler: except FileNotFoundError: return ps, None + @functools.cache + def _modules_and_headers(self): + return modulemap.calculate_modules(self.include_dirs) + + def modulemaps_for_modules(self) -> dict[str, pathlib.Path]: + return self._modules_and_headers()[0] + + def modulemap_headers(self) -> set[Header]: + return self._modules_and_headers()[1] + @_maybe_cache - def compile_all(self) -> dict[HeaderRef, Header]: + def compile_all(self) -> dict[str, Header]: """Generates a graph of headers by compiling all files in the sysroot.""" if self._error_dir is not None: shutil.rmtree(self._error_dir, ignore_errors=True) - graph: dict[HeaderRef, Header] = {} + graph: dict[str, Header] = {} uncompiled = [] seen = set() @@ -286,31 +261,27 @@ class Compiler: uncompiled.append(include) seen.add(include) - # Use a list as a set because it's tiny. - seen_dirs = [IncludeDir.Sysroot] - - def add_to_dfs(kind: IncludeDir, modulemap: pathlib.Path): - if kind in seen_dirs: - return - seen_dirs.append(kind) - for mod, files in _parse_modulemap(modulemap).items(): - for path, textual in files: - graph[(kind, path)] = Header(include_dir=kind, - rel=path, - root_module=mod, - textual=textual) - visit(path) + for hdr in self.modulemap_headers(): + if hdr.root_module not in config.IGNORED_MODULES: + graph[(hdr.include_dir, hdr.rel)] = hdr + visit(hdr.rel) # Populate a list of initial headers to compile. - add_to_dfs( - IncludeDir.LibCxx, - self.source_root / 'third_party/libc++/src/include/module.modulemap.in') - for header in _SYSROOT_PRECOMPILED_HEADERS: - visit(header) + for hdr in config.SYSROOT_PRECOMPILED_HEADERS: + visit(hdr) + + logging.info('Starting compilation') # Could consider making the DFS parallel to improve performance. # But it's a lot of effort for a script that's rarely run. + i = 0 + start = time.time() while uncompiled: + i += 1 + if i % 100 == 0: + rate = i / (time.time() - start) + logging.info('Compiled %d/%d, %.2f/s, estimate: %ds', i - 1, len(seen), + rate, (len(seen) - i) / rate) rel = uncompiled.pop() ps, files = self.compile_one(rel) @@ -322,16 +293,10 @@ class Compiler: abs_path = files[0] kind, _ = self.split_path(abs_path) - # The first time we come across a builtin header, we use that to find - # the builtin modulemap to ensure we compile every module in it. - add_to_dfs( - kind, - abs_path.parents[rel.count('/')] / 'module.modulemap', - ) - if (kind, rel) not in graph: # If we're seeing it for the first time here, but it's from another - # include dir, it must not be in the module map, so it should be treated as textual. + # include dir, it must not be in the module map, so it should be treated + # as textual. graph[(kind, rel)] = Header(include_dir=kind, rel=rel, textual=kind != IncludeDir.Sysroot) @@ -341,22 +306,33 @@ class Compiler: for to_abs in files[1:]: to_kind, to_rel = self.split_path(to_abs) assert (kind, rel) != (to_kind, to_rel) - if (to_kind, to_rel) not in graph: - graph[(to_kind, to_rel)] = Header( + dep = graph.get((to_kind, to_rel), None) + if dep is None: + dep = Header( include_dir=to_kind, rel=to_rel, abs=to_abs, textual=to_kind != IncludeDir.Sysroot, ) - state.deps.append((to_kind, to_rel)) - visit(to_rel) + graph[(to_kind, to_rel)] = dep + # Skip compiling textual headers - we'll calculate their dependencies + # after the fact. + if not dep.textual: + visit(to_rel) + state.deps.append(dep) + state.compile_status = CompileStatus.Success if ps.returncode == 0 else \ + CompileStatus.Failure if ps.returncode == 0: logging.debug('Compiled %s', state.pretty_name) elif any([ state.textual, - rel.startswith('bits/'), '/bits/' in rel, - rel.endswith('intrin.h') + rel.startswith('bits/'), + '/bits/' in rel, + rel.endswith('intrin.h'), + b'Do not include this header directly' in ps.stderr, + # eg. Please #include instead of this file directly. + b'Please #include' in ps.stderr, ]): # These things are generally expected to not compile standalone. logging.debug('Probably fine: Failed to compile %s', state.pretty_name) @@ -374,9 +350,12 @@ class Compiler: if state.root_module is None and ps.returncode != 0: state.textual = True - assert IncludeDir.Builtin in seen_dirs + rdeps = calculate_rdeps(graph.values()) + includes = collections.defaultdict(list) - for header in graph.values(): + logging.info('Inferring dependencies') + for header in sorted(graph.values()): + includes[header.rel].append(header) if header.abs is None: for d, kind in self.include_dirs: if header.include_dir == kind and (d / header.rel).is_file(): @@ -384,7 +363,30 @@ class Compiler: break assert header.abs is not None - for dep in header.deps: - assert dep in graph + # If we were unable to compile something, calculate what the dependencies + # likely are. + if header.compile_status == CompileStatus.NotCompiled and rdeps[header]: + intersection = set.intersection( + *[set(rdep.deps) for rdep in rdeps[header]]) + # For libcxx/foo.h -> builtin/foo.h -> sysroot/foo.h + # Despite the fact that builtin/foo.h should appear all the time, we + # need to filter it out for sysroot/foo.h. + header.deps = [ + dep for dep in intersection + if dep.rel != header.rel or dep.include_dir > header.include_dir + ] - return graph + # Translate it to a mapping from include path to a linked list of headers. + out = {} + for k, headers in includes.items(): + headers.sort() + for prev, nxt in zip(headers, headers[1:]): + # If it didn't #include_next we don't need to worry about it. + if nxt not in prev.deps: + break + prev.next = nxt + nxt.prev = prev + out[k] = headers[0] + + logging.info('Compilation complete') + return out diff --git a/naiveproxy/src/build/modules/modularize/compiler_test.py b/naiveproxy/src/build/modules/modularize/compiler_test.py index 7f72837ecf..ffb2738222 100644 --- a/naiveproxy/src/build/modules/modularize/compiler_test.py +++ b/naiveproxy/src/build/modules/modularize/compiler_test.py @@ -4,13 +4,13 @@ import pathlib import unittest -import tempfile import textwrap from compiler import _maybe_cache -from compiler import _parse_modulemap from compiler import Compiler from modularize import SOURCE_ROOT +from platforms import Cpu +from platforms import Os class TestableCompiler(Compiler): @@ -20,36 +20,30 @@ class TestableCompiler(Compiler): def cached_n(self): return self.n - # Override these to prevent it from invoking GN - def _get_os(self): - return 'linux' - - def _get_cpu(self): - return 'x64' - class CompilerTest(unittest.TestCase): def setUp(self): super().setUp() - self.compiler1 = TestableCompiler( - gn_out=pathlib.Path('/tmp/compiler1'), - source_root=SOURCE_ROOT, - error_dir=None, - use_cache=True, - ) + self.compiler1 = TestableCompiler(gn_out=pathlib.Path('/tmp/compiler1'), + source_root=SOURCE_ROOT, + error_dir=None, + use_cache=True, + os=Os.Linux, + cpu=Cpu.x64) self.compiler1_uncached = TestableCompiler( gn_out=pathlib.Path('/tmp/compiler1'), source_root=SOURCE_ROOT, error_dir=None, use_cache=False, - ) - self.compiler2 = TestableCompiler( - gn_out=pathlib.Path('/tmp/compiler2'), - source_root=SOURCE_ROOT, - error_dir=None, - use_cache=True, - ) + os=Os.Linux, + cpu=Cpu.x64) + self.compiler2 = TestableCompiler(gn_out=pathlib.Path('/tmp/compiler2'), + source_root=SOURCE_ROOT, + error_dir=None, + use_cache=True, + os=Os.Linux, + cpu=Cpu.x64) def test_maybe_cache(self): # Uncached compilers should write to the cache, but not read from it. @@ -64,38 +58,23 @@ class CompilerTest(unittest.TestCase): self.compiler2.n = 4 self.assertEqual(self.compiler2.cached_n(), 4) - def test_parse_modulemap(self): - self.assertDictEqual( - # It's a defaultdict - _parse_modulemap(SOURCE_ROOT / - 'build/modules/modularize/testdata/module.modulemap'), - { - 'first': [ - ('first.h', False), - ('../first_textual.h', True), - ], - 'second': [ - ('second.h', False), - ('../second_textual.h', True), - ] - }, - ) - def test_parse_depfile(self): self.assertListEqual( self.compiler1._parse_depfile( textwrap.dedent("""\ /dev/null: /tmp/main.cc \\ - ../up.cc \\ - path/to/relative.cc \\ - /path/to/absolute.cc \\ - path\\ with\\ spaces.cc \\ + /path/to/foo.txt \\ + ../up.h \\ + path/to/relative \\ + /path/to/absolute.hpp \\ + path\\ with\\ spaces path2.h \\ """)), [ - pathlib.Path('/tmp/up.cc'), - pathlib.Path('/tmp/compiler1/path/to/relative.cc'), - pathlib.Path('/path/to/absolute.cc'), - pathlib.Path('/tmp/compiler1/path with spaces.cc'), + pathlib.Path('/tmp/up.h'), + pathlib.Path('/tmp/compiler1/path/to/relative'), + pathlib.Path('/path/to/absolute.hpp'), + pathlib.Path('/tmp/compiler1/path with spaces'), + pathlib.Path('/tmp/compiler1/path2.h'), ], ) diff --git a/naiveproxy/src/build/modules/modularize/config.py b/naiveproxy/src/build/modules/modularize/config.py index f93c6d0b2d..b87338b532 100644 --- a/naiveproxy/src/build/modules/modularize/config.py +++ b/naiveproxy/src/build/modules/modularize/config.py @@ -2,85 +2,198 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import collections import pathlib +import typing -from graph import IncludeDir +from graph import all_headers +from graph import calculate_rdeps from graph import Header -from graph import HeaderRef +from graph import IncludeDir +from graph import Target +from platforms import Os + +if typing.TYPE_CHECKING: + # To fix circular dependency. + from compiler import Compiler + +IGNORED_MODULES = [ + # This is a builtin module with feature requirements. + 'opencl_c', + # This is a mac module with feature requirements that should be disabled. + '_stddef', +] + +# When any of the following directory names are in the path, it's treated as a +# sysroot directory. +SYSROOT_DIRS = { + 'android_toolchain', + 'debian_bullseye_amd64-sysroot', + 'debian_bullseye_arm64-sysroot', + 'debian_bullseye_armhf-sysroot', + 'debian_bullseye_i386-sysroot', + 'fuchsia-sdk', + 'MacOSX.platform', + 'win_toolchain', +} + +# It doesn't matter if these don't work on all platforms. +# It'll just print a warning saying it failed to compile. +# This contains a list of files that aren't depended on by libc++, but we still +# want to precompile. +SYSROOT_PRECOMPILED_HEADERS = [ + 'fcntl.h', + 'getopt.h', + 'linux/types.h', + 'sys/ioctl.h', + 'syscall.h', +] -def fix_graph(graph: dict[HeaderRef, Header], os: str, cpu: str): +def fix_graph(graph: dict[str, Header], + compiler: 'Compiler') -> dict[pathlib.Path, str]: """Applies manual augmentation of the header graph.""" - is_apple = os in ['mac', 'ios'] - # Deal with include_next for modules with modulemaps. - # We were only able to compile the one in the first include dir. - # To solve this, we copy all dependencies except the shadow to the shadowed - # header file. - # eg. If libcxx/stddef.h has deps [builtin/stddef.h, sysroot/stdint.h], we - # set the deps of builtin/stddef.h to [sysroot/stdint.h] - includes = {} - for rel in {header.rel for header in graph.values()}: - order = [] - for d in IncludeDir: - header = graph.get((d, rel), None) - if header is not None: - order.append(header) - for prev, header in zip(order, order[1:]): - header.deps = [(to_kind, to_rel) for (to_kind, to_rel) in order[0].deps - if to_rel != header.rel or to_kind > header.include_dir] - header.prev = prev - prev.next = header - includes[rel] = order + def force_textual(key: str): + if key in graph: + graph[key].textual = True - for header in graph.values(): - header.direct_deps = header.calculate_direct_deps(includes) + def add_dep(frm, to, check=True): + if check: + assert to not in frm.deps + if to not in frm.deps: + frm.deps.append(to) - if is_apple: - # From here on out we're modifying which headers are textual. - # This isn't relevant to apple since it has a modulemap. - return + def skip_module(name): + found = False + for hdr in graph.values(): + while True: + if hdr.root_module == name: + hdr.textual = True + found = True + if hdr.next is None: + break + hdr = hdr.next + assert found - # Calculate a reverse dependency graph - rdeps = collections.defaultdict(list) - for header in graph.values(): - for dep in header.deps: - rdeps[graph[dep]].append(header) + # We made the assumption that the deps of something we couldn't compile is + # the intersection of the deps of all users of it. + # This does not hold true for stddef.h because of __need_size_t + add_dep(graph['stddef.h'].next, graph['__stddef_size_t.h'], check=False) - sysroot = lambda rel, kind=IncludeDir.Sysroot: graph[(kind, rel)] + if compiler.os in [Os.Android, Os.Win, Os.Fuchsia]: + # include_next behaves differently in module builds and non-module builds. + # Because of this, module builds include libcxx's wchar.h instead of + # the sysroot's wchar.h + add_dep(graph['__mbstate_t.h'], graph['wchar.h']) + # This makes the libcxx/wchar.h included by mbstate_t.h act more like + # sysroot/wchar.h by preventing it from defining functions. + graph['__mbstate_t.h'].kwargs['defines'].append( + '_LIBCPP_WCHAR_H_HAS_CONST_OVERLOADS') + elif compiler.os.is_apple: + # This is shadowed by the builtin iso646, so we don't need to build it. + graph['iso646.h'].next.textual = True - for header in graph.values(): - if header.include_dir != IncludeDir.Sysroot: - continue + rdeps = calculate_rdeps(all_headers(graph)) - parts = set(pathlib.Path(header.rel).parts) - # We want non-textual, but we don't need to do so if the header including - # you via include_next is non-textual. - if header.prev is not None: - header.textual = not header.prev.textual - # Anything not to be included by the user directly that was only included - # once can be marked as textual. Unfortunately since .d files calculate - # *transitive* dependencies this is not particularly effective. - elif (len(rdeps[header]) < 2 - and parts.intersection(['asm', 'asm-generic', 'bits'])): - header.textual = True - elif '#pragma once' in (header.content or ''): - header.textual = False - elif 'bits' in parts: - header.textual = True + sysroot = graph['assert.h'].abs.parent + for header in all_headers(graph): + header.direct_deps = header.calculate_direct_deps(graph, sysroot=sysroot) - # Assert is inherently textual. - sysroot('assert.h').textual = True + if compiler.os.is_apple: + # See https://github.com/llvm/llvm-project/issues/154675 + # Darwin defines the symbol "echo" in curses.h + # Although curses.h is not included, the symbol is part of the module and + # thus we get an error when attempting to use the symbol "echo" after + # including *any* part of the module Darwin. + skip_module("Darwin") + # This module isn't intended to be used - it's intended to catch + # misconfigured sysroots. + skip_module("_c_standard_library_obsolete") + else: + for header in all_headers(graph): + if header.include_dir != IncludeDir.Sysroot: + continue - # This is included from the std_wchar_h module, but that module is marked as - # textual. Normally that would mean we would mark this as non-textual, but - # wchar.h doesn't play nice being non-textual. - sysroot('wchar.h').textual = True + parts = set(pathlib.Path(header.rel).parts) + # We want non-textual, but we don't need to do so if the header including + # you via include_next is non-textual. + if header.prev is not None: + header.textual = not header.prev.textual + # Anything not to be included by the user directly that was only included + # once can be marked as textual. Unfortunately since .d files calculate + # *transitive* dependencies this is not particularly effective. + elif (len(rdeps[header]) < 2 + and parts.intersection(['asm', 'asm-generic', 'bits'])): + header.textual = True + elif '#pragma once' in (header.content or ''): + header.textual = False + elif 'bits' in parts: + header.textual = True - if os == 'android': - graph[(IncludeDir.LibCxx, 'wchar.h')].public_configs.append( - '//buildtools/third_party/libc++:wchar_android_fix') + # Assert is inherently textual. + graph['assert.h'].textual = True - sysroot('android/legacy_threads_inlines.h').textual = True - sysroot('bits/threads_inlines.h').textual = True + force_textual('asm-generic/unistd.h') + force_textual('asm-generic/bitsperlong.h') + + if compiler.os == Os.Android: + graph['android/legacy_stdlib_inlines.h'].textual = True + graph['android/legacy_threads_inlines.h'].textual = True + graph['android/legacy_unistd_inlines.h'].textual = True + graph['bits/threads_inlines.h'].textual = True + + graph['asm-generic/posix_types.h'].textual = True + graph['asm/posix_types.h'].textual = True + + # sys/syscall.h includes asm/unistd.h, which includes + # asm/unistd_.h, which defines some macros. + # It then includes bits/glibc-syscalls.h which uses said macros, so both + # must be non-textual. + for k in graph: + if k.startswith('asm/unistd'): + graph[k].textual = True + graph['bits/glibc-syscalls.h'].textual = True + + elif compiler.os == Os.Linux: + # See https://codebrowser.dev/glibc/glibc/sysdeps/unix/sysv/linux/bits/local_lim.h.html#56 + # if linux/limits.h is non-textual, then limits.h undefs the limits.h + # defined in the linux/limits.h module. + # Thus, limits.h exports an undef. + # if it's textual, limits.h undefs something it defined itself. + graph['linux/limits.h'].textual = True + + # This is not included on arm32 + graph['asm-generic/types.h'].textual = True + + # On chromeos, x86_64-linux-gnu/foo.h will be either moved to foo.h or to + # x86_64-cros-gnu. + # So we just mark them all as textual so they don't appear in the modulemap. + for hdr in graph.values(): + if '-linux-gnu' in str(hdr.abs): + hdr.textual = True + + # Windows has multiple include directories contained with the sysroot. + if compiler.os == Os.Win: + graph['math.h'].kwargs['defines'].append('_USE_MATH_DEFINES') + return { + graph['corecrt.h'].abs.parent.parent: '$windows_kits', + graph['eh.h'].abs.parent: '$msvc', + } + else: + return {sysroot: '$sysroot'} + + +def should_compile(target: Target) -> bool: + """Decides whether a target should be compiled or not. + + If this returns true, the target should be compiled. + If this returns false, the target *may* be compiled (eg. if a target that + should be compiled depends on this). + """ + for header in target.headers: + # For now, we only precompile the transitive dependencies of libcxx, and + # nothing else in the sysroot. + if header.include_dir == IncludeDir.LibCxx: + return True + + return False diff --git a/naiveproxy/src/build/modules/modularize/graph.py b/naiveproxy/src/build/modules/modularize/graph.py index 6e18bfc681..7a77bf36a4 100644 --- a/naiveproxy/src/build/modules/modularize/graph.py +++ b/naiveproxy/src/build/modules/modularize/graph.py @@ -5,6 +5,7 @@ from __future__ import annotations import collections +import contextlib import dataclasses import enum import functools @@ -12,25 +13,29 @@ import itertools import pathlib import re -_INCLUDES = re.compile(r'#\s*include(_next)?\s*<([^>]+)>') +# Almost every sysroot just uses #include <>, but fuchsia uses #include "" +# sometimes. +_INCLUDES = re.compile(r'#\s*(?:include|import)(_next)?\s*["<]([^>"]+)[>"]') + + +class CompileStatus(enum.Enum): + NotCompiled = 1 + Success = 2 + Failure = 3 class IncludeDir(enum.Enum): # Ordered by include order for clang LibCxx = 1 Builtin = 2 - DarwinBasic = 3 - DarwinFoundation = 4 - CStandardLibrary = 5 - Sysroot = 6 + SysrootModule = 3 + Sysroot = 4 + Framework = 5 def __lt__(self, other): return self.value < other.value -HeaderRef = tuple[IncludeDir, str] - - @dataclasses.dataclass class Header: include_dir: IncludeDir @@ -44,20 +49,28 @@ class Header: next: None | Header = None root_module: None | str = None textual: bool = False - deps: list[HeaderRef] = dataclasses.field(default_factory=list) + umbrella: bool = False + compile_status: CompileStatus = CompileStatus.NotCompiled + + deps: list[Header] = dataclasses.field(default_factory=list) direct_deps: set[Header] = dataclasses.field(default_factory=set) # Here, None means no exports, and the empty list means 'export *' # We default to exporting all to preserve the behaviour of includes. - exports: None | list[HeaderRef] = dataclasses.field(default_factory=list) + exports: None | list[str] = dataclasses.field(default_factory=list) - # Any configs required to build this file. - public_configs: list[str] = dataclasses.field(default_factory=list) + # Kwargs that will end up on the BUILD.gn targets. + kwargs: dict[str, list[str]] = dataclasses.field( + default_factory=lambda: collections.defaultdict(list)) def __hash__(self): return hash((self.include_dir, self.rel)) def __eq__(self, other): - return (self.include_dir, self.rel) == (other.include_dir, other.rel) + if isinstance(other, Header): + return (self.include_dir, self.rel) == (other.include_dir, other.rel) + else: + # This allows you to write (Sysroot, 'foo.h') in set[Header] + return (self.include_dir, self.rel) == other def __lt__(self, other): return (self.include_dir, self.rel) < (other.include_dir, other.rel) @@ -71,36 +84,105 @@ class Header: @property def submodule_name(self): - normalized = self.rel.replace('.', '_').replace('/', '_').replace('-', '_') - return 'sysroot_' + normalized + return self.rel.replace('.', '_').replace('/', '_').replace('-', '_') @functools.cached_property - def content(self) -> None | str: - return self.abs.read_text() + def content(self) -> str: + return self.abs.read_text(errors='ignore') + + def calculate_direct_deps(self, includes: dict[str, Header], + sysroot: pathlib.Path) -> set[Header]: - def calculate_direct_deps(self, includes: dict[str, - list[Header]]) -> set[Header]: direct = set() - for is_next, include in _INCLUDES.findall(self.content): - header = None - order = includes.get(include, []) - if is_next and self in order[:-1]: - header = order[order.index(self) + 1] - if not is_next and order: - header = order[0] + found_includes = _INCLUDES.findall(self.content) + + def find_include(is_next, include) -> bool: + header = None + first = includes.get(include, None) + if first is not None: + # When modules are enabled, #include_next from any file other + # than foo.h is treated the same as #include . + if not is_next or (is_next and self.rel != include): + header = first + elif self.next is not None: + header = self.next + + # It might have been conditionally included. + if header is not None and header in self.deps: + direct.add(header) + return True + return False + + for is_next, include in found_includes: + if not find_include(is_next, include): + # This is required, because, for example, libcxx's threading includes + # pthread.h, but the include scanner sees pthread/pthread.h (the + # symlink target). + with contextlib.suppress(OSError, FileNotFoundError): + find_include(is_next, str((sysroot / include).readlink())) - # It might have been conditionally included. - if header is not None and (header.include_dir, header.rel) in self.deps: - direct.add(header) return direct - def direct_deps_closure(self) -> set[Header]: - closure = set(self.direct_deps) - for dep in self.direct_deps: - if dep.textual: - closure.remove(dep) - closure.update(dep.direct_deps_closure()) - return closure + @functools.cache + def _required_deps(self) -> tuple[set[Header], set[Header]]: + nontextual = set() + textual = set() + todo = [self] + while todo: + hdr = todo.pop() + for dep in hdr.direct_deps: + if dep.textual and dep not in textual: + todo.append(dep) + textual.add(dep) + elif not dep.textual: + nontextual.add(dep) + return nontextual, textual + + @property + def required_deps(self) -> set[Header]: + """The header files required to be built before we can build.""" + return self._required_deps()[0] + + @property + def required_textual_deps(self) -> set[Header]: + """The textual header files we directly include. + + This includes textual headers included via other textual headers""" + return self._required_deps()[1] + + def find_loop(self) -> list[Header] | None: + """Finds a loop of #includes, if it exists.""" + chain = [self] + has_chain = True + while has_chain: + has_chain = False + if self in chain[-1].direct_deps: + return chain + [self] + for dep in chain[-1].direct_deps: + if dep not in chain and self in dep.deps: + chain.append(dep) + has_chain = True + break + # It shouldn't be possible to have a node that has you as a transitive + # dep without having a dep that has you as a transitive dep. + assert len(chain) == 1 + + +def calculate_rdeps(headers: list[Header]) -> dict[Header, list[Header]]: + """Calculates a reverse dependency graph""" + rdeps = collections.defaultdict(list) + for header in headers: + for dep in header.deps: + rdeps[dep].append(header) + return rdeps + + +def all_headers(graph: dict[str, Header]): + """Iterates through all headers in a graph.""" + for header in graph.values(): + while header is not None: + yield header + header = header.next @dataclasses.dataclass @@ -113,13 +195,52 @@ class Target: def __lt__(self, other): return self.name < other.name + def __eq__(self, other): + return self.name == other.name -def run_build(graph: dict[HeaderRef, Header]) -> list[Target]: + def __hash__(self): + return hash(self.name) + + @property + def kwargs(self) -> dict[str, set[str]]: + """The kwargs associated with a build target. + + eg. if you have kwargs = {"defines": ["FOO"]}, then it outputs: + + target_type(target.name) { + defines = ["FOO"] + } + """ + kwargs = collections.defaultdict(set) + for header in self.headers: + for single in header.group: + for dep in {single} | single.required_textual_deps: + for k, v in dep.kwargs.items(): + kwargs[k].update(v) + return kwargs + + @property + def header_deps(self) -> set[Header]: + direct_deps = set() + for hdr in self.headers: + direct_deps.update(hdr.required_deps) + return direct_deps + + @property + def public_deps(self) -> list[str]: + return sorted( + set([ + hdr.root_module for hdr in self.header_deps + if hdr.root_module is not None and hdr.root_module != self.name + ])) + + +def run_build(graph: dict[str, Header]) -> list[Target]: """Calculates the correct way to run a build.""" unbuilt_modules: dict[str, list[Header]] = collections.defaultdict(list) unbuilt_headers: set[Header] = set() - for header in graph.values(): + for header in all_headers(graph): if not header.textual: if header.root_module is None: unbuilt_headers.add(header) @@ -130,31 +251,57 @@ def run_build(graph: dict[HeaderRef, Header]) -> list[Target]: # form a dependency loop. header.group = [header] header.mod_deps = set() - header.unbuilt_deps = set([ - graph[dep] for dep in header.deps - # Textual headers don't need to be built. - # Also, you don't need to wait for a dependency within the same module. - if not graph[dep].textual and \ - (header.root_module is None or \ - header.root_module != graph[dep].root_module) - ]) + header.unbuilt_deps = set( + dep for dep in header.required_deps + # You don't need to wait for a dependency within the same module. + if (header.root_module is None or header.root_module != dep.root_module) + and dep != header) - for header in graph.values(): + # Perform a union find to find all dependency loops. + # Since we can easily tell if a given edge represents a dependency loop, we + # simply union together all pairs of nodes on loop edges. + # We perform a simple form of union find where we don't bother with rank or + # size, and only do path compression (always on the lexicographically first + # header). It's slower but still plenty fast and simplifies things. + parents = {} + + def find(header): + if header in parents: + # Optimization: path compression + parents[header] = find(parents[header]) + return parents[header] + else: + return header + + for header in sorted(unbuilt_headers): + for dep in header.required_deps: + if dep > header and header in dep.deps: + assert header.include_dir == IncludeDir.Sysroot and dep.include_dir == IncludeDir.Sysroot, ( + header, dep) + # Perform the 'union' operation. + x, y = sorted([find(header), find(dep)]) + if x != y: + parents[y] = x + + loops = collections.defaultdict(list) + for header in unbuilt_headers: + loops[find(header)].append(header) + + for headers in loops.values(): + # Not a loop + if len(headers) == 1: + continue + headers.sort() + headers[0].group = headers + headers[0].unbuilt_deps = set.union( + *[header.unbuilt_deps for header in headers]) - set(headers) + for header in headers[1:]: + unbuilt_headers.remove(header) + + for header in all_headers(graph): for dep in header.unbuilt_deps: dep.rdeps.add(header) - # Break dependency loops. - for header in sorted(graph.values()): - for dep in list(header.unbuilt_deps): - # Mark all headers but one in the loop as already having been built. - if header in dep.unbuilt_deps and header.include_dir == IncludeDir.Sysroot and dep.include_dir == IncludeDir.Sysroot: - header.group.append(dep) - dep.group = header.group - for rdep in dep.rdeps: - assert header is rdep or header in rdep.unbuilt_deps - rdep.unbuilt_deps.remove(dep) - unbuilt_headers.remove(dep) - build_gn = [] for i in itertools.count(): @@ -188,12 +335,13 @@ def run_build(graph: dict[HeaderRef, Header]) -> list[Target]: n_remaining = len(unbuilt_headers) for header in list(unbuilt_headers): if not header.unbuilt_deps: - header.root_module = sysroot_mod build_gn[-1].headers.append(header) unbuilt_headers.remove(header) - for rdep in header.rdeps: - rdep.mod_deps.add(header.root_module) - rdep.unbuilt_deps.remove(header) + for header in header.group: + header.root_module = sysroot_mod + for rdep in header.rdeps: + rdep.mod_deps.add(header.root_module) + rdep.unbuilt_deps.remove(header) if n_remaining == len(unbuilt_headers): break @@ -212,13 +360,14 @@ def run_build(graph: dict[HeaderRef, Header]) -> list[Target]: "Dependency loop in sysroot. You probably want to make one of them textual." ) print("The following headers are in a dependency loop:") - pairs = set() + seen = set() for header in unbuilt_headers: - for dep in header.unbuilt_deps: - if header in dep.unbuilt_deps: - print(f'{header.pretty_name} -> {dep.pretty_name}') + if header not in seen: + chain = header.find_loop() + if chain is not None: + print(' -> '.join([header.pretty_name for header in chain])) + seen.update(chain) # If you get to this point, you probably want a debugger to help understand what the problem is. - sysroot = lambda rel: graph[(IncludeDir.Sysroot, rel)] breakpoint() exit(1) diff --git a/naiveproxy/src/build/modules/modularize/modularize.py b/naiveproxy/src/build/modules/modularize/modularize.py index 575ee911ce..6ade912cec 100755 --- a/naiveproxy/src/build/modules/modularize/modularize.py +++ b/naiveproxy/src/build/modules/modularize/modularize.py @@ -6,63 +6,186 @@ """Modularize modularizes a platform.""" import argparse +import concurrent.futures import logging import pathlib -import shutil +import re +import subprocess import sys -import tempfile -from config import fix_graph -from graph import run_build -from render import render_build_gn -from render import render_modulemap +import traceback + from compiler import Compiler +from config import fix_graph +from graph import IncludeDir +from graph import run_build +from platforms import Cpu +from platforms import Os +import render SOURCE_ROOT = pathlib.Path(__file__).parents[3].resolve() +_OS_OPTS = '|'.join(os.value for os in Os) +_CPU_OPTS = '|'.join(cpu.value for cpu in Cpu) +_PLATFORM = re.compile('^' + ''.join([ + f'(?P{_OS_OPTS})', + f'(?:-(?P{_CPU_OPTS}))?', + r'(?P_xcode\d+)?', +]) + '$') def main(args): logging.basicConfig(level=logging.getLevelNamesMapping()[args.verbosity]) + existing_platforms = [ + f.name for f in (SOURCE_ROOT / 'build/modules').iterdir() + ] + filter = { + 'os': args.os, + 'cpu': args.cpu, + } + + calls = {} + for platform in existing_platforms: + match = _PLATFORM.match(platform) + if match is None: + continue + + props = match.groupdict() + os = Os(props['os']) + # If no CPU is provided, we support all CPUs with a single BUILD.gn. + # But we do need to be consistent about the CPU we target, so we arbitrarily + # pick x64 since it's probably the most supported CPU. + cpu = Cpu(props['cpu'] or 'x64') + + # We want to reconstruct the platform to dedupe xcode versions, and ensure + # that we always have the correct cpu arch. + platform = f"{os.value}-{cpu.value}" + + skip = False + for k, v in filter.items(): + if v is not None and props[k] != v: + skip = True + if skip: + continue + out_dir = SOURCE_ROOT / 'out' / platform + args_gn = out_dir / 'args.gn' + if not args_gn.exists(): + out_dir.mkdir(exist_ok=True, parents=True) + args_gn.write_text('\n'.join([ + # These are required + f'target_os = "{os.value}"', + f'target_cpu = "{cpu.value}"', + # This is required (see README.md) + 'use_clang_modules = true', + # This is strongly recommended, otherwise you may accidentally + # test manual modules. + 'use_autogenerated_modules = true', + # Some useful defaults. User is free to change these. + 'use_remoteexec = true', + 'symbol_level = 0', + 'is_debug = false', + 'running_modularize = true', + ])) + + error_log = None if args.error_log is None else args.error_log / platform + calls[platform] = dict( + out_dir=out_dir, + error_log=error_log, + use_cache=args.cache, + compile=args.compile, + os=os, + cpu=cpu, + ) + + if not calls: + print('No matching platforms. Try copying an existing one', file=sys.stderr) + elif len(calls) == 1: + _modularize(**next(iter(calls.values()))) + return + + # Use a ProcessPoolExecutor rather than a ThreadPoolExecutor because: + # * No shared state between instances + # * GIL prevents a performance benefit from a thread pool executor. + with concurrent.futures.ProcessPoolExecutor() as executor: + futures = { + k: executor.submit(_modularize, **kwargs) + for k, kwargs in calls.items() + } + + success = True + for platform, future in sorted(futures.items()): + exc = future.exception() + if exc is not None: + success = False + print(f'{platform} raised an exception:', file=sys.stderr) + traceback.print_exception(exc) + if not success: + exit(1) + + +def _modularize(out_dir: pathlib.Path, error_log: pathlib.Path | None, + use_cache: bool, compile: bool, cpu: Cpu, os: Os): + # Modularize requires gn gen to have been run at least once. + if not (out_dir / 'build.ninja').is_file(): + subprocess.run(['gn', 'gen', out_dir], check=True) compiler = Compiler( source_root=SOURCE_ROOT, - gn_out=args.C.resolve(), - error_dir=None if args.error_log is None else args.error_log.resolve(), - use_cache=args.cache, + gn_out=out_dir, + error_dir=error_log, + use_cache=use_cache, + cpu=cpu, + os=os, ) - platform = f'{compiler.os}-{compiler.cpu}' - logging.info('Detected platform %s', platform) - out_dir = SOURCE_ROOT / f'build/modules/{platform}' - # Otherwise gn will error out because it tries to import a file that doesn't exist. - if not out_dir.is_dir(): - shutil.copytree(out_dir.parent / 'linux-x64', out_dir) - - if args.compile: - with tempfile.TemporaryDirectory() as td: - ps, files = compiler.compile_one(args.compile, pathlib.Path(td, 'source')) - print('stderr:', ps.stderr.decode('utf-8'), file=sys.stderr) - print('Files used:') - print('\n'.join(sorted(map(str, files)))) - print('Setting breakpoint to allow further debugging') - breakpoint() - return + if compile: + ps, files = compiler.compile_one(compile) + print('stderr:', ps.stderr.decode('utf-8'), file=sys.stderr) + print('Files used:') + print('\n'.join(sorted(map(str, files)))) + print('Setting breakpoint to allow further debugging') + breakpoint() + return graph = compiler.compile_all() - fix_graph(graph, compiler.os, compiler.cpu) + replacements = fix_graph(graph, compiler) targets = run_build(graph) + + platform = (out_dir / 'gen/module_platform.txt').read_text() + logging.info('Detected platform %s', platform) + + out_dir = SOURCE_ROOT / 'build/modules' / platform out_dir.mkdir(exist_ok=True, parents=False) - # Since apple provides a modulemap, we only need to create a BUILD.gn file. - if compiler.os not in ['mac', 'ios']: - render_modulemap(out_dir=out_dir, sysroot=compiler.sysroot, targets=targets) - textual_headers = [hdr for hdr in graph.values() if hdr.textual] - render_build_gn(out_dir=out_dir, - textual_headers=textual_headers, - targets=targets) + if compiler.sysroot_dir == IncludeDir.Sysroot: + render.render_modulemap(out_dir=out_dir, + replacements=replacements, + targets=targets) + render.render_build_gn( + out_dir=out_dir, + targets=targets, + compiler=compiler, + ) + + +def _optional_path(s: str) -> pathlib.Path | None: + if s: + return pathlib.Path(s).resolve() if __name__ == '__main__': parser = argparse.ArgumentParser() - parser.add_argument('-C', type=pathlib.Path) + parser.add_argument( + '--cpu', + help='Only update platforms matching this cpu', + type=lambda x: None if x is None else Cpu(x), + default=None, + choices=[cpu.value for cpu in Cpu], + ) + parser.add_argument( + '--os', + help='Only update platforms matching this cpu', + type=lambda x: None if x is None else Os(x), + default=None, + choices=[os.value for os in Os], + ) # Make it required so the user understands how compilation works. cache = parser.add_mutually_exclusive_group(required=True) @@ -74,17 +197,16 @@ if __name__ == '__main__': '--no-cache', action='store_false', dest='cache', - help= - 'Disable caching. Will attempt to recompile the whole libcxx, builtins, and sysroot on every invocation' - ) + help='Disable caching. Will attempt to recompile the whole libcxx, ' + + 'builtins, and sysroot on every invocation') parser.add_argument( '--compile', - help='Compile a single header file', + help='Compile a single header file (eg. --compile=sys/types.h) instead ' + + 'of the whole sysroot. Useful for debugging.', ) - parser.add_argument('--error-log', - type=lambda value: pathlib.Path(value) if value else None) + parser.add_argument('--error-log', type=_optional_path) parser.add_argument( '--verbosity', diff --git a/naiveproxy/src/build/modules/modularize/modulemap.py b/naiveproxy/src/build/modules/modularize/modulemap.py new file mode 100644 index 0000000000..4a8bd66f5f --- /dev/null +++ b/naiveproxy/src/build/modules/modularize/modulemap.py @@ -0,0 +1,173 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import collections +import pathlib +import re + +from graph import Header +from graph import IncludeDir + +_MODULE_START = re.compile( + r'^(\s*)(?:explicit )?((?:framework )?)module ([^\s.{]+)', flags=re.I) +_HEADER = re.compile( + r'\s+(exclude header|textual header|umbrella header|header|umbrella) "([^"]*)"' +) +_EXTERN_MODULE = re.compile(r'^(\s*)extern module ([^ ]*) "([^"]*)"') + + +def _parse_modulemap(include_dir: pathlib.Path, mm_path: pathlib.Path, + include_kind: IncludeDir, modules: dict[str, pathlib.Path], + headers: set[Header]): + # The modulemap's paths are relative to the modulemap, but the include's + # paths are relative to d. + rel = str(mm_path.parent.relative_to(include_dir)) + rel_prefix = '' if rel == '.' else f'{rel}/' + framework_layers = [] + + def absolute(rel: str, check_exist=True): + # We don't have / support three layers of nesting of frameworks. + assert len(framework_layers) < 3 + if include_kind != IncludeDir.Framework: + path = mm_path.parent / rel + # Frameworks have very specific path requirements. + elif len(framework_layers) == 1: + path = include_dir / 'Headers' / rel + elif len(framework_layers) == 2: + path = include_dir / f'Frameworks/{framework_layers[1]}.framework/Headers' / rel + if check_exist: + assert path.is_file(), path + return path + + def relative(rel: str): + if include_kind == IncludeDir.Framework: + # In the event of foo.framework/Frameworks/bar.framework/..., it's bar + return f'{framework_layers[-1]}/{rel}' + else: + return rel_prefix + rel + + current_module = None + with mm_path.open() as f: + for line in f: + match = _MODULE_START.match(line) + if match is not None: + indent, is_framework, mod = match.groups() + if not indent: + # It must be a root module + current_module = mod + modules[current_module] = mm_path + if is_framework: + # This is a bit hacky, but frameworks don't go deeper than two layers. + if not indent: + framework_layers = [mod] + else: + framework_layers = [framework_layers[0], mod] + + header = _HEADER.search(line) + if header is not None: + kind, name = header.groups() + if kind in ['header', 'umbrella header', 'textual header']: + headers.add( + Header( + root_module=current_module, + include_dir=include_kind, + rel=relative(name), + abs=absolute(name), + textual=kind == 'textual header', + umbrella=kind == 'umbrella header', + )) + if kind == 'umbrella': + if len(framework_layers) == 2: + # In case of submodules, reroot at the submodule + # a is an arbitrary filename that we discard with parents. + mod_root = absolute('a', must_exist=False).parents[1] + elif include_kind == IncludeDir.Framework: + mod_root = include_dir + else: + mod_root = mm_path.parent + for path in mod_root.glob(f"{name}/*.h"): + # We need a way to calculate what the name *should* have been. + rel = str( + path.relative_to(mod_root)).removeprefix('Headers').lstrip('/') + headers.add( + Header( + root_module=current_module, + include_dir=include_kind, + rel=relative(rel), + abs=path, + textual=False, + )) + extern = _EXTERN_MODULE.match(line) + if extern is not None: + indent, extern_module_name, modulemap = extern.groups() + # The same module can be defined in multiple files. If it is, we can use + # the root module.modulemap's extern module foo "foo.modulemap" to + # resolve which one is the canonical definition. + if current_module is None: + modules[extern_module_name] = include_dir / modulemap + submap_headers = set() + submap_modules = {} + _parse_modulemap( + include_dir, + include_dir / modulemap, + include_kind, + modules=modules if current_module is None else submap_modules, + headers=submap_headers) + for k, v in submap_modules.items(): + if k not in submap_modules: + submap_modules[k] = v + + # For module foo { extern module bar }, although the module is bar, the + # compilation unit is foo + if indent: + for hdr in submap_headers: + hdr.root_module = current_module + headers.update(submap_headers) + + +def calculate_modules( + include_kinds: list[tuple[pathlib.Path, IncludeDir]] +) -> tuple[dict[str, pathlib.Path], set[Header]]: + """Calculates modules and the headers contained within. + + Args: + include_kinds: A list of include dirs + + Returns: + A mapping from module names to modulemaps, and headers defined by modulemaps + """ + modules = {} + headers = set() + for d, kind in include_kinds: + if kind == IncludeDir.Framework: + # For the semantics of frameworks, see + # https://clang.llvm.org/docs/Modules.html#module-declaration + for modulemap in d.glob("**/Modules/module.modulemap"): + if 'Versions' not in modulemap.parts: + _parse_modulemap(modulemap.parents[1], + modulemap, + include_kind=kind, + modules=modules, + headers=headers) + else: + # One level deep is sufficient for the apple sysroot. + # ** doesn't work because otherwise it includes the things referenced by + # the root module.modulemap + for modulemap in d.glob('*/module.modulemap'): + _parse_modulemap(d, + modulemap, + include_kind=kind, + modules=modules, + headers=headers) + + # Intentionally place this after the previous parse_modulemap so that we + # override the modules. + if (d / 'module.modulemap').is_file(): + _parse_modulemap(d, + d / 'module.modulemap', + include_kind=kind, + modules=modules, + headers=headers) + + return modules, headers diff --git a/naiveproxy/src/build/modules/modularize/modulemap_test.py b/naiveproxy/src/build/modules/modularize/modulemap_test.py new file mode 100644 index 0000000000..1f9bd71062 --- /dev/null +++ b/naiveproxy/src/build/modules/modularize/modulemap_test.py @@ -0,0 +1,144 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import dataclasses +import pathlib +import unittest + +import modulemap +import graph + +_TESTDATA = pathlib.Path(__file__).parent / 'testdata' +_FRAMEWORK = graph.IncludeDir.Framework +_SYSROOT = graph.IncludeDir.SysrootModule + + +@dataclasses.dataclass +class HeaderProps: + include_dir: graph.IncludeDir + abs: str + module: str + textual: bool = False + umbrella: bool = False + + +class ModulemapTest(unittest.TestCase): + + def setUp(self): + super().setUp() + self.maxDiff = None + + def test_parse_modulemap(self): + got_modules, got_headers = modulemap.calculate_modules([ + (_TESTDATA / 'Frameworks', graph.IncludeDir.Framework), + (_TESTDATA / 'sysroot', graph.IncludeDir.SysrootModule), + ]) + + got_headers = { + hdr.rel: + HeaderProps( + include_dir=hdr.include_dir, + abs=str(hdr.abs.relative_to(_TESTDATA)), + module=hdr.root_module, + textual=hdr.textual, + umbrella=hdr.umbrella, + ) + for hdr in got_headers + } + + self.assertEqual( + got_headers, { + 'umbrella/first.h': + HeaderProps( + include_dir=_FRAMEWORK, + abs='Frameworks/umbrella.framework/Headers/first.h', + module='umbrella', + ), + 'umbrella/second.h': + HeaderProps( + include_dir=_FRAMEWORK, + abs='Frameworks/umbrella.framework/Headers/second.h', + module='umbrella', + ), + 'first.h': + HeaderProps( + include_dir=_SYSROOT, + abs='sysroot/first.h', + module='first', + ), + 'first/first.h': + HeaderProps( + include_dir=_SYSROOT, + abs='sysroot/first/first.h', + module='first', + ), + 'first_textual.h': + HeaderProps( + include_dir=_SYSROOT, + abs='sysroot/first_textual.h', + module='first', + textual=True, + ), + 'nested/nested.h': + HeaderProps( + include_dir=_FRAMEWORK, + abs='Frameworks/nested.framework/Headers/nested.h', + module='nested', + textual=True, + ), + 'second.h': + HeaderProps( + include_dir=_SYSROOT, + abs='sysroot/second.h', + module='second', + ), + 'second_textual.h': + HeaderProps( + include_dir=_SYSROOT, + abs='sysroot/second_textual.h', + module='second', + textual=True, + ), + 'simple/simple.h': + HeaderProps( + include_dir=_FRAMEWORK, + abs='Frameworks/simple.framework/Headers/simple.h', + module='simple', + ), + 'subdir/subdir.h': + HeaderProps( + include_dir=_SYSROOT, + abs='sysroot/subdir/subdir.h', + module='subdir', + ), + 'submodule/umbrella.h': + HeaderProps( + include_dir=_FRAMEWORK, + abs= + 'Frameworks/nested.framework/Frameworks/submodule.framework/Headers/umbrella.h', + module='nested', + umbrella=True, + ), + }) + + got_modules = { + mod: str(path.relative_to(_TESTDATA)) + for mod, path in got_modules.items() + } + + self.assertEqual( + got_modules, { + 'container': 'sysroot/module.modulemap', + 'first': 'sysroot/importable.modulemap', + 'nested': 'Frameworks/nested.framework/Modules/module.modulemap', + 'second': 'sysroot/importable.modulemap', + 'simple': 'Frameworks/simple.framework/Modules/module.modulemap', + 'subdir': 'sysroot/subdir/module.modulemap', + 'umbrella': + 'Frameworks/umbrella.framework/Modules/module.modulemap', + }) + + +if __name__ == '__main__': + unittest.main() diff --git a/naiveproxy/src/build/modules/modularize/platforms.py b/naiveproxy/src/build/modules/modularize/platforms.py new file mode 100644 index 0000000000..9c4084c408 --- /dev/null +++ b/naiveproxy/src/build/modules/modularize/platforms.py @@ -0,0 +1,25 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import enum + + +class Os(str, enum.Enum): + Android = 'android' + Fuchsia = 'fuchsia' + Ios = 'ios' + Linux = 'linux' + Mac = 'mac' + Win = 'win' + + @property + def is_apple(self): + return self == Os.Mac or self == Os.Ios + + +class Cpu(str, enum.Enum): + x86 = 'x86' + x64 = 'x64' + arm = 'arm' + arm64 = 'arm64' diff --git a/naiveproxy/src/build/modules/modularize/render.py b/naiveproxy/src/build/modules/modularize/render.py index d74c11e3d4..9419082003 100644 --- a/naiveproxy/src/build/modules/modularize/render.py +++ b/naiveproxy/src/build/modules/modularize/render.py @@ -2,11 +2,13 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import collections import contextlib import io import pathlib -from graph import Header +from compiler import Compiler +import config from graph import IncludeDir from graph import Target @@ -15,9 +17,51 @@ _HEADER = """# Copyright 2025 The Chromium Authors # found in the LICENSE file. # AUTOGENERATED FILE. DO NOT EDIT. -# To regenerate, run build/modules/modularize/modularize.py +# To regenerate, see instructions at build/modules/modularize/README.md """ +_RULE_MAP = { + IncludeDir.Builtin: 'builtin_module', + IncludeDir.Framework: 'framework_module', + IncludeDir.LibCxx: 'libcxx_module', + IncludeDir.Sysroot: 'sysroot_module', + IncludeDir.SysrootModule: 'apple_sysroot_module', +} + +_SYSROOT_MODULEMAP = """sysroot_modulemap("sysroot_modulemap") { + source = "module.modulemap.in" + out = "${target_gen_dir}/module.modulemap" +} + +""" + + +def _filter_targets(targets: list[Target], compiler: Compiler) -> list[Target]: + module_to_modulemap = compiler.modulemaps_for_modules() + modulemap_to_modules = collections.defaultdict(list) + for k, v in module_to_modulemap.items(): + modulemap_to_modules[v].append(k) + + remaining = [target for target in targets if config.should_compile(target)] + compiled = set(remaining) + targets = {target.name: target for target in targets} + while remaining: + target = remaining.pop() + for dep in target.public_deps: + dep = targets[dep] + if dep not in compiled: + compiled.add(dep) + remaining.append(dep) + + # If we use -fmodule-map-file=c_standard_library.modulemap for one target, + # all modules in c_standard_library.modulemap need to be precompiled. + if dep.name not in module_to_modulemap: + continue + for module in modulemap_to_modules[module_to_modulemap[dep.name]]: + if module in targets and targets[module] not in compiled: + compiled.add(targets[module]) + remaining.append(targets[module]) + return sorted(compiled) def _update_content(path: pathlib.Path, content: str): @@ -28,7 +72,8 @@ def _update_content(path: pathlib.Path, content: str): path.write_text(content) -def render_modulemap(out_dir: pathlib.Path, sysroot: pathlib.Path, +def render_modulemap(out_dir: pathlib.Path, replacements: dict[pathlib.Path, + str], targets: list[Target]): """Writes a modulemap to {out_dir}""" f = io.StringIO() @@ -42,8 +87,12 @@ def render_modulemap(out_dir: pathlib.Path, sysroot: pathlib.Path, f.write(f' module {header.submodule_name} {{\n') for single in sorted(header.group): assert single.abs is not None - f.write( - f' header "{single.abs.relative_to(out_dir, walk_up=True)}"\n') + path = str(single.abs) + for frm, to in replacements.items(): + path = path.replace(str(frm), to) + # After replacements, all paths should be absolute. + assert not path.startswith('/'), path + f.write(f' header "{path}"\n') if not header.exports and header.exports is not None: f.write(' export *\n') for export in header.exports or []: @@ -52,22 +101,14 @@ def render_modulemap(out_dir: pathlib.Path, sysroot: pathlib.Path, f.write(' }\n') f.write('}\n') - _update_content(out_dir / 'module.modulemap', f.getvalue()) + _update_content(out_dir / 'module.modulemap.in', f.getvalue()) -def _render_string_list(f, - indent: int, - key: str, - values: list[str], - add: str | None = None): - if not values and add is None: +def _render_string_list(f, indent: int, key: str, values: list[str]): + if not values: return indent = " " * indent f.write(f'{indent}{key} = ') - if add is not None: - f.write(add) - if values: - f.write(' + ') if len(values) == 1: f.write(f'[ "{values[0]}" ]\n') @@ -76,59 +117,68 @@ def _render_string_list(f, for value in values: f.write(f'{indent} "{value}",\n') f.write(f'{indent}]\n') - else: - f.write('\n') def render_build_gn(out_dir: pathlib.Path, targets: list[Target], - textual_headers: list[Header]): + compiler: Compiler): """Renders a BUILD.gn file for a specific platform to {out_dir}""" - # textual configs are associated with textual headers, so we just apply them - # indiscriminately since they're not for compiling a specific target. - textual_configs = sorted( - {cfg - for hdr in textual_headers - for cfg in hdr.public_configs}) + targets = _filter_targets(targets, compiler) f = io.StringIO() f.write(_HEADER) f.write('import("//buildtools/third_party/libc++/modules.gni")\n\n') - if textual_configs: - _render_string_list(f, 0, 'textual_configs', textual_configs) - f.write('\n') - for target in sorted(targets): - direct_deps = set() - for hdr in target.headers: - direct_deps.update(hdr.direct_deps_closure()) - public_deps = sorted({ - f':{hdr.root_module}' - for hdr in direct_deps - if hdr.root_module is not None and hdr.root_module != target.name - }) + all_modulemap_configs = set() + if compiler.sysroot_dir == IncludeDir.Sysroot: + all_modulemap_configs.add("sysroot_modulemap") + f.write(_SYSROOT_MODULEMAP) + + module_to_modulemaps = compiler.modulemaps_for_modules() + + for target in sorted(targets): + rule = _RULE_MAP[target.include_dir] + + modulemap_target = None + if target.name in module_to_modulemaps: + kind, rel = compiler.split_path(module_to_modulemaps[target.name]) + modulemap_target = rel.removesuffix('/module.modulemap').removesuffix( + '.modulemap').replace('/', '_') + '_modulemap' + if kind == IncludeDir.Framework and modulemap_target not in all_modulemap_configs: + f.write(f'framework_modulemap("{modulemap_target}") {{\n') + f.write(f' name = "{modulemap_target.removesuffix("_modulemap")}"\n') + f.write('}\n') + all_modulemap_configs.add(modulemap_target) + elif kind == IncludeDir.SysrootModule and modulemap_target not in all_modulemap_configs: + f.write(f'apple_sysroot_modulemap("{modulemap_target}") {{\n') + f.write(f' sysroot_path = "{rel}"\n') + f.write('}\n') + all_modulemap_configs.add(modulemap_target) - rule = { - IncludeDir.LibCxx: 'libcxx_module', - IncludeDir.Sysroot: 'sysroot_module', - IncludeDir.Builtin: 'builtin_module', - }[target.include_dir] f.write(f'{rule}("{target.name}") {{\n') - _render_string_list(f, 2, 'public_deps', public_deps) - configs = sorted([ - c for header in target.headers for single in header.group - for c in single.public_configs - ]) - _render_string_list(f, - 2, - 'public_configs', - sorted(configs), - add='textual_configs' if textual_configs else None) + if target.include_dir in [IncludeDir.SysrootModule, IncludeDir.Framework + ] and modulemap_target is not None: + f.write(f' modulemap = ":{modulemap_target}"\n') + if kind == IncludeDir.SysrootModule: + f.write(f' modulemap_path = "{rel}"\n') + _render_string_list(f, 2, 'public_deps', + [f':{dep}' for dep in target.public_deps]) + for k, v in sorted(target.kwargs.items()): + _render_string_list(f, 2, k, sorted(v)) f.write('}\n\n') - f.write('alias("all_modules") {\n') - f.write(' actual = [\n') + f.write('group("all_modules") {\n') + f.write(' public_deps = [\n') for target in sorted(targets): f.write(f' ":{target.name}",\n') f.write(' ]\n') + f.write('}\n\n') + + f.write('config("all_modulemap_configs") {\n') + f.write(' configs = [\n') + f.write(' "//buildtools/third_party/libc++:builtin_modulemap",\n') + f.write(' "//buildtools/third_party/libc++:libcxx_modulemap",\n') + for target in sorted(all_modulemap_configs): + f.write(f' ":{target}",\n') + f.write(' ]\n') f.write('}\n') _update_content(out_dir / 'BUILD.gn', f.getvalue()) diff --git a/naiveproxy/src/build/modules/modularize/testdata/Frameworks/nested.framework/Frameworks/submodule.framework/Headers/other.h b/naiveproxy/src/build/modules/modularize/testdata/Frameworks/nested.framework/Frameworks/submodule.framework/Headers/other.h new file mode 100644 index 0000000000..fc47d8f64c --- /dev/null +++ b/naiveproxy/src/build/modules/modularize/testdata/Frameworks/nested.framework/Frameworks/submodule.framework/Headers/other.h @@ -0,0 +1,10 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BUILD_MODULES_MODULARIZE_TESTDATA_FRAMEWORKS_NESTED_FRAMEWORK_FRAMEWORKS_SUBMODULE_FRAMEWORK_HEADERS_OTHER_H_ +#define BUILD_MODULES_MODULARIZE_TESTDATA_FRAMEWORKS_NESTED_FRAMEWORK_FRAMEWORKS_SUBMODULE_FRAMEWORK_HEADERS_OTHER_H_ + + + +#endif // BUILD_MODULES_MODULARIZE_TESTDATA_FRAMEWORKS_NESTED_FRAMEWORK_FRAMEWORKS_SUBMODULE_FRAMEWORK_HEADERS_OTHER_H_ diff --git a/naiveproxy/src/net/ntlm/OWNERS b/naiveproxy/src/build/modules/modularize/testdata/Frameworks/nested.framework/Frameworks/submodule.framework/Headers/umbrella.h similarity index 100% rename from naiveproxy/src/net/ntlm/OWNERS rename to naiveproxy/src/build/modules/modularize/testdata/Frameworks/nested.framework/Frameworks/submodule.framework/Headers/umbrella.h diff --git a/naiveproxy/src/third_party/llvm-libc/src/test/src/sys/resource/testdata/CMakeLists.txt b/naiveproxy/src/build/modules/modularize/testdata/Frameworks/nested.framework/Headers/nested.h similarity index 100% rename from naiveproxy/src/third_party/llvm-libc/src/test/src/sys/resource/testdata/CMakeLists.txt rename to naiveproxy/src/build/modules/modularize/testdata/Frameworks/nested.framework/Headers/nested.h diff --git a/naiveproxy/src/build/modules/modularize/testdata/Frameworks/nested.framework/Modules/module.modulemap b/naiveproxy/src/build/modules/modularize/testdata/Frameworks/nested.framework/Modules/module.modulemap new file mode 100644 index 0000000000..181f291d2e --- /dev/null +++ b/naiveproxy/src/build/modules/modularize/testdata/Frameworks/nested.framework/Modules/module.modulemap @@ -0,0 +1,12 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +framework module nested { + textual header "nested.h" + + framework module submodule { + umbrella header "umbrella.h" + } +} + diff --git a/naiveproxy/src/build/modules/modularize/testdata/Frameworks/simple.framework/Headers/simple.h b/naiveproxy/src/build/modules/modularize/testdata/Frameworks/simple.framework/Headers/simple.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/naiveproxy/src/build/modules/modularize/testdata/Frameworks/simple.framework/Modules/module.modulemap b/naiveproxy/src/build/modules/modularize/testdata/Frameworks/simple.framework/Modules/module.modulemap new file mode 100644 index 0000000000..24a1406330 --- /dev/null +++ b/naiveproxy/src/build/modules/modularize/testdata/Frameworks/simple.framework/Modules/module.modulemap @@ -0,0 +1,8 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +framework module simple { + header "simple.h" +} + diff --git a/naiveproxy/src/build/modules/modularize/testdata/Frameworks/umbrella.framework/Headers/first.h b/naiveproxy/src/build/modules/modularize/testdata/Frameworks/umbrella.framework/Headers/first.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/naiveproxy/src/build/modules/modularize/testdata/Frameworks/umbrella.framework/Headers/second.h b/naiveproxy/src/build/modules/modularize/testdata/Frameworks/umbrella.framework/Headers/second.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/naiveproxy/src/build/modules/modularize/testdata/Frameworks/umbrella.framework/Modules/module.modulemap b/naiveproxy/src/build/modules/modularize/testdata/Frameworks/umbrella.framework/Modules/module.modulemap new file mode 100644 index 0000000000..ef73344342 --- /dev/null +++ b/naiveproxy/src/build/modules/modularize/testdata/Frameworks/umbrella.framework/Modules/module.modulemap @@ -0,0 +1,8 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +framework module umbrella { + umbrella "Headers" +} + diff --git a/naiveproxy/src/build/modules/modularize/testdata/sysroot/first.h b/naiveproxy/src/build/modules/modularize/testdata/sysroot/first.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/naiveproxy/src/build/modules/modularize/testdata/sysroot/first/first.h b/naiveproxy/src/build/modules/modularize/testdata/sysroot/first/first.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/naiveproxy/src/build/modules/modularize/testdata/sysroot/first_textual.h b/naiveproxy/src/build/modules/modularize/testdata/sysroot/first_textual.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/naiveproxy/src/build/modules/modularize/testdata/module.modulemap b/naiveproxy/src/build/modules/modularize/testdata/sysroot/importable.modulemap similarity index 63% rename from naiveproxy/src/build/modules/modularize/testdata/module.modulemap rename to naiveproxy/src/build/modules/modularize/testdata/sysroot/importable.modulemap index c94b889b54..30ddaa71f4 100644 --- a/naiveproxy/src/build/modules/modularize/testdata/module.modulemap +++ b/naiveproxy/src/build/modules/modularize/testdata/sysroot/importable.modulemap @@ -5,13 +5,16 @@ module first [system] [extern_c] { header "first.h" module submod { - textual header "../first_textual.h" + textual header "first_textual.h" + } + + umbrella "first" +} + +explicit module second.submodule [system] [extern_c] { + header "second.h" + module submod { + textual header "second_textual.h" } } -module second [system] [extern_c] { - header "second.h" - module submod { - textual header "../second_textual.h" - } -} \ No newline at end of file diff --git a/naiveproxy/src/build/modules/modularize/testdata/sysroot/module.modulemap b/naiveproxy/src/build/modules/modularize/testdata/sysroot/module.modulemap new file mode 100644 index 0000000000..e3d3307a3e --- /dev/null +++ b/naiveproxy/src/build/modules/modularize/testdata/sysroot/module.modulemap @@ -0,0 +1,10 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +extern module first "importable.modulemap" + +module container { + extern module second "importable.modulemap" +} + diff --git a/naiveproxy/src/build/modules/modularize/testdata/sysroot/second.h b/naiveproxy/src/build/modules/modularize/testdata/sysroot/second.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/naiveproxy/src/build/modules/modularize/testdata/sysroot/second_textual.h b/naiveproxy/src/build/modules/modularize/testdata/sysroot/second_textual.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/naiveproxy/src/build/modules/modularize/testdata/sysroot/subdir/module.modulemap b/naiveproxy/src/build/modules/modularize/testdata/sysroot/subdir/module.modulemap new file mode 100644 index 0000000000..03f772bc5e --- /dev/null +++ b/naiveproxy/src/build/modules/modularize/testdata/sysroot/subdir/module.modulemap @@ -0,0 +1,8 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module subdir { + umbrella "." +} + diff --git a/naiveproxy/src/build/modules/modularize/testdata/sysroot/subdir/subdir.h b/naiveproxy/src/build/modules/modularize/testdata/sysroot/subdir/subdir.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/naiveproxy/src/build/modules/win-x64/BUILD.gn b/naiveproxy/src/build/modules/win-x64/BUILD.gn new file mode 100644 index 0000000000..635dcf0e8d --- /dev/null +++ b/naiveproxy/src/build/modules/win-x64/BUILD.gn @@ -0,0 +1,246 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# AUTOGENERATED FILE. DO NOT EDIT. +# To regenerate, see instructions at build/modules/modularize/README.md + +import("//buildtools/third_party/libc++/modules.gni") + +sysroot_modulemap("sysroot_modulemap") { + source = "module.modulemap.in" + out = "${target_gen_dir}/module.modulemap" +} + +builtin_module("_Builtin_float") { + public_deps = [ ":sys_stage1" ] +} + +builtin_module("_Builtin_intrinsics") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":std_core", + ":sys_stage1", + ":sys_stage2", + ] +} + +builtin_module("_Builtin_inttypes") { + public_deps = [ + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +builtin_module("_Builtin_iso646") { +} + +builtin_module("_Builtin_limits") { + public_deps = [ ":sys_stage1" ] +} + +builtin_module("_Builtin_stdalign") { +} + +builtin_module("_Builtin_stdarg") { +} + +builtin_module("_Builtin_stdatomic") { + public_deps = [ ":sys_stage1" ] +} + +builtin_module("_Builtin_stdbool") { +} + +builtin_module("_Builtin_stdcountof") { +} + +builtin_module("_Builtin_stddef") { +} + +builtin_module("_Builtin_stddef_wint_t") { +} + +builtin_module("_Builtin_stdint") { + public_deps = [ ":sys_stage1" ] +} + +builtin_module("_Builtin_stdnoreturn") { +} + +builtin_module("_Builtin_unwind") { + public_deps = [ ":_Builtin_stdint" ] +} + +builtin_module("ptrauth") { +} + +libcxx_module("std") { + public_deps = [ + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stddef", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_string_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_stage1", + ":sys_stage2", + ":sys_stage3", + ] +} + +libcxx_module("std_complex_h") { + public_deps = [ ":std" ] +} + +libcxx_module("std_core") { + public_deps = [ + ":_Builtin_stddef", + ":_Builtin_stdint", + ":sys_stage1", + ] +} + +libcxx_module("std_ctype_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_errno_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_fenv_h") { + public_deps = [ + ":std_float_h", + ":sys_stage1", + ] +} + +libcxx_module("std_float_h") { + public_deps = [ ":_Builtin_float" ] +} + +libcxx_module("std_inttypes_h") { + public_deps = [ + ":_Builtin_inttypes", + ":_Builtin_stdint", + ] +} + +libcxx_module("std_math_h") { + public_deps = [ + ":std_core", + ":sys_stage1", + ] + defines = [ "_USE_MATH_DEFINES" ] +} + +libcxx_module("std_private_mbstate_t") { + public_deps = [ + ":_Builtin_stddef", + ":sys_stage1", + ":sys_stage3", + ] + defines = [ "_LIBCPP_WCHAR_H_HAS_CONST_OVERLOADS" ] +} + +libcxx_module("std_stdatomic_h") { + public_deps = [ ":_Builtin_stdatomic" ] +} + +libcxx_module("std_string_h") { + public_deps = [ + ":sys_stage1", + ":sys_stage2", + ] +} + +libcxx_module("std_tgmath_h") { + public_deps = [ ":std" ] +} + +libcxx_module("std_uchar_h") { + public_deps = [ ":sys_stage1" ] +} + +libcxx_module("std_wctype_h") { + public_deps = [ ":sys_stage1" ] +} + +sysroot_module("sys_stage1") { + public_deps = [ ":_Builtin_stddef" ] +} + +sysroot_module("sys_stage2") { + public_deps = [ + ":_Builtin_limits", + ":_Builtin_stdint", + ":std_errno_h", + ":sys_stage1", + ] +} + +sysroot_module("sys_stage3") { + public_deps = [ + ":_Builtin_intrinsics", + ":sys_stage1", + ":sys_stage2", + ] +} + +group("all_modules") { + public_deps = [ + ":_Builtin_float", + ":_Builtin_intrinsics", + ":_Builtin_inttypes", + ":_Builtin_iso646", + ":_Builtin_limits", + ":_Builtin_stdalign", + ":_Builtin_stdarg", + ":_Builtin_stdatomic", + ":_Builtin_stdbool", + ":_Builtin_stdcountof", + ":_Builtin_stddef", + ":_Builtin_stddef_wint_t", + ":_Builtin_stdint", + ":_Builtin_stdnoreturn", + ":_Builtin_unwind", + ":ptrauth", + ":std", + ":std_complex_h", + ":std_core", + ":std_ctype_h", + ":std_errno_h", + ":std_fenv_h", + ":std_float_h", + ":std_inttypes_h", + ":std_math_h", + ":std_private_mbstate_t", + ":std_stdatomic_h", + ":std_string_h", + ":std_tgmath_h", + ":std_uchar_h", + ":std_wctype_h", + ":sys_stage1", + ":sys_stage2", + ":sys_stage3", + ] +} + +config("all_modulemap_configs") { + configs = [ + "//buildtools/third_party/libc++:builtin_modulemap", + "//buildtools/third_party/libc++:libcxx_modulemap", + ":sysroot_modulemap", + ] +} diff --git a/naiveproxy/src/build/modules/win-x64/module.modulemap.in b/naiveproxy/src/build/modules/win-x64/module.modulemap.in new file mode 100644 index 0000000000..6920a022ed --- /dev/null +++ b/naiveproxy/src/build/modules/win-x64/module.modulemap.in @@ -0,0 +1,224 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// AUTOGENERATED FILE. DO NOT EDIT. +// To regenerate, see instructions at build/modules/modularize/README.md + + +module sys_stage1 [system] [extern_c] { + module __msvc_cxx_stdatomic_hpp { + header "$msvc/__msvc_cxx_stdatomic.hpp" + export * + } + module concurrencysal_h { + header "$msvc/concurrencysal.h" + export * + } + module corecrt_h { + header "$windows_kits/ucrt/corecrt.h" + export * + } + module corecrt_malloc_h { + header "$windows_kits/ucrt/corecrt_malloc.h" + export * + } + module corecrt_math_h { + header "$windows_kits/ucrt/corecrt_math.h" + export * + } + module corecrt_search_h { + header "$windows_kits/ucrt/corecrt_search.h" + export * + } + module corecrt_share_h { + header "$windows_kits/ucrt/corecrt_share.h" + export * + } + module corecrt_stdio_config_h { + header "$windows_kits/ucrt/corecrt_stdio_config.h" + export * + } + module corecrt_terminate_h { + header "$windows_kits/ucrt/corecrt_terminate.h" + export * + } + module corecrt_wconio_h { + header "$windows_kits/ucrt/corecrt_wconio.h" + export * + } + module corecrt_wctype_h { + header "$windows_kits/ucrt/corecrt_wctype.h" + export * + } + module corecrt_wdirect_h { + header "$windows_kits/ucrt/corecrt_wdirect.h" + export * + } + module corecrt_wio_h { + header "$windows_kits/ucrt/corecrt_wio.h" + export * + } + module corecrt_wprocess_h { + header "$windows_kits/ucrt/corecrt_wprocess.h" + export * + } + module corecrt_wstdio_h { + header "$windows_kits/ucrt/corecrt_wstdio.h" + export * + } + module corecrt_wstdlib_h { + header "$windows_kits/ucrt/corecrt_wstdlib.h" + export * + } + module corecrt_wstring_h { + header "$windows_kits/ucrt/corecrt_wstring.h" + export * + } + module corecrt_wtime_h { + header "$windows_kits/ucrt/corecrt_wtime.h" + export * + } + module crtdbg_h { + header "$windows_kits/ucrt/crtdbg.h" + export * + } + module crtdefs_h { + header "$msvc/crtdefs.h" + export * + } + module eh_h { + header "$msvc/eh.h" + export * + } + module fcntl_h { + header "$windows_kits/ucrt/fcntl.h" + export * + } + module locale_h { + header "$windows_kits/ucrt/locale.h" + export * + } + module malloc_h { + header "$windows_kits/ucrt/malloc.h" + export * + } + module new_h { + header "$windows_kits/ucrt/new.h" + export * + } + module sal_h { + header "$msvc/sal.h" + export * + } + module setjmp_h { + header "$msvc/setjmp.h" + export * + } + module signal_h { + header "$windows_kits/ucrt/signal.h" + export * + } + module stdarg_h { + header "$msvc/stdarg.h" + export * + } + module stddef_h { + header "$windows_kits/ucrt/stddef.h" + export * + } + module stdio_h { + header "$windows_kits/ucrt/stdio.h" + export * + } + module sys_stat_h { + header "$windows_kits/ucrt/sys/stat.h" + export * + } + module sys_types_h { + header "$windows_kits/ucrt/sys/types.h" + export * + } + module time_h { + header "$windows_kits/ucrt/time.h" + export * + } + module use_ansi_h { + header "$msvc/use_ansi.h" + export * + } + module vadefs_h { + header "$msvc/vadefs.h" + export * + } + module vcruntime_h { + header "$msvc/vcruntime.h" + export * + } + module vcruntime_exception_h { + header "$msvc/vcruntime_exception.h" + export * + } + module vcruntime_new_h { + header "$msvc/vcruntime_new.h" + export * + } + module vcruntime_new_debug_h { + header "$msvc/vcruntime_new_debug.h" + export * + } + module vcruntime_string_h { + header "$msvc/vcruntime_string.h" + export * + } + module vcruntime_typeinfo_h { + header "$msvc/vcruntime_typeinfo.h" + export * + } + module winapifamily_h { + header "$windows_kits/shared/winapifamily.h" + export * + } + module winpackagefamily_h { + header "$windows_kits/shared/winpackagefamily.h" + export * + } + module xkeycheck_h { + header "$msvc/xkeycheck.h" + export * + } + module yvals_h { + header "$msvc/yvals.h" + export * + } + module yvals_core_h { + header "$msvc/yvals_core.h" + export * + } +} + +module sys_stage2 [system] [extern_c] { + module corecrt_memcpy_s_h { + header "$windows_kits/ucrt/corecrt_memcpy_s.h" + export * + } + module corecrt_memory_h { + header "$windows_kits/ucrt/corecrt_memory.h" + export * + } + module stdlib_h { + header "$windows_kits/ucrt/stdlib.h" + export * + } + module threads_h { + header "$msvc/threads.h" + export * + } +} + +module sys_stage3 [system] [extern_c] { + module wchar_h { + header "$windows_kits/ucrt/wchar.h" + export * + } +} diff --git a/naiveproxy/src/build/nocompile.gni b/naiveproxy/src/build/nocompile.gni index f1ec54cc33..cb65827629 100644 --- a/naiveproxy/src/build/nocompile.gni +++ b/naiveproxy/src/build/nocompile.gni @@ -80,9 +80,6 @@ if (enable_nocompile_tests) { # Disable the checks that the Chrome style plugin normally enforces to # reduce the amount of boilerplate needed in nocompile tests. "//build/config/clang:find_bad_constructs", - - # Disable modules in this target to keep config for this action simple. - "//build/config/compiler:libcxx_module", ] if (is_win) { diff --git a/naiveproxy/src/build/private_code_test/ninja_parser.py b/naiveproxy/src/build/private_code_test/ninja_parser.py index aa4833f756..f1a97c08e7 100755 --- a/naiveproxy/src/build/private_code_test/ninja_parser.py +++ b/naiveproxy/src/build/private_code_test/ninja_parser.py @@ -4,8 +4,6 @@ # found in the LICENSE file. """Extract source file information from .ninja files.""" -# Copied from //tools/binary_size/libsupersize - import argparse import io import json @@ -22,14 +20,26 @@ import action_helpers # build obj/.../libfoo.a: alink obj/.../a.o obj/.../b.o | # build ./libchrome.so ./lib.unstripped/libchrome.so: solink a.o b.o ... # build libmonochrome.so: __chrome_android_libmonochrome___rule | ... -_REGEX = re.compile(r'build ([^:]+): \w+ (.*?)(?: *\||\n|$)') +# build somefile.cc somefile.h: __some_rule | ... +_REGEX = re.compile( + r'^(?:subninja (.*)|build ([^:]+): [^\s]+ (.*)| rlibs = (.*))', + re.MULTILINE) -_RLIBS_REGEX = re.compile(r' rlibs = (.*?)(?:\n|$)') +_IGNORED_SUFFIXES = ( + '.build_metadata', + '.empty', + '_expected_outputs.txt', + '_grd_files.json', + '.modulemap', + '.rsp', + 'typemap_config', +) # Unmatches seems to happen for empty source_sets(). E.g.: # obj/chrome/browser/ui/libui_public_dependencies.a -_MAX_UNMATCHED_TO_LOG = 20 +_MAX_UNMATCHED_TO_LOG = 1000 _MAX_UNMATCHED_TO_IGNORE = 200 +_MAX_RECURSION = 200 class _SourceMapper: @@ -39,46 +49,16 @@ class _SourceMapper: self.parsed_files = parsed_files self._unmatched_paths = set() - def _FindSourceForPathInternal(self, path): - if not path.endswith(')'): - if path.startswith('..'): - return path - return self._dep_map.get(path) - - # foo/bar.a(baz.o) - start_idx = path.index('(') - lib_name = path[:start_idx] - obj_name = path[start_idx + 1:-1] - by_basename = self._dep_map.get(lib_name) - if not by_basename: - if lib_name.endswith('rlib') and 'std/' in lib_name: - # Currently we use binary prebuilt static libraries of the Rust - # stdlib so we can't get source paths. That may change in future. - return '(Rust stdlib)/%s' % lib_name - return None - if lib_name.endswith('.rlib'): - # Rust doesn't really have the concept of an object file because - # the compilation unit is the whole 'crate'. Return whichever - # filename was the crate root. - return next(iter(by_basename.values())) - obj_path = by_basename.get(obj_name) - if not obj_path: - # Found the library, but it doesn't list the .o file. - logging.warning('no obj basename for %s %s', path, obj_name) - return None - return self._dep_map.get(obj_path) - - def FindSourceForPath(self, path): - """Returns the source path for the given object path (or None if not found). - - Paths for objects within archives should be in the format: foo/bar.a(baz.o) - """ - ret = self._FindSourceForPathInternal(path) - if not ret and path not in self._unmatched_paths: - if self.unmatched_paths_count < _MAX_UNMATCHED_TO_LOG: - logging.warning('Could not find source path for %s (empty source_set?)', - path) - self._unmatched_paths.add(path) + def Lookup(self, path): + ret = self._dep_map.get(path) + if not ret: + # .ninja files do not record origin of files written by write_file() and + # generated_file(). + if not path.endswith(_IGNORED_SUFFIXES): + if path not in self._unmatched_paths: + if self.unmatched_paths_count < _MAX_UNMATCHED_TO_LOG: + logging.warning('Could not find source path for %s', path) + self._unmatched_paths.add(path) return ret @property @@ -88,46 +68,33 @@ class _SourceMapper: def _ParseNinjaPathList(path_list): ret = path_list.replace('\\ ', '\b') - return [s.replace('\b', ' ') for s in ret.split()] + return [ + os.path.normpath(s.replace('\b', ' ')) for s in ret.split() if s[0] != '|' + ] -def _OutputsAreObject(outputs): - return (outputs.endswith('.a') or outputs.endswith('.o') - or outputs.endswith('.rlib')) - - -def _ParseOneFile(lines, dep_map, executable_path): +def _ParseOneFile(data, dep_map, executable_path): sub_ninjas = [] - executable_inputs = None - last_executable_paths = [] - for line in lines: - if line.startswith('subninja '): - sub_ninjas.append(line[9:-1]) - # Rust .rlibs are listed as implicit dependencies of the main - # target linking rule, then are given as an extra - # rlibs = - # variable on a subsequent line. Watch out for that line. - elif m := _RLIBS_REGEX.match(line): - if executable_path in last_executable_paths: - executable_inputs.extend(_ParseNinjaPathList(m.group(1))) - elif m := _REGEX.match(line): - outputs, srcs = m.groups() - if _OutputsAreObject(outputs): - output = outputs.replace('\\ ', ' ') - assert output not in dep_map, 'Duplicate output: ' + output - if output[-1] == 'o': - dep_map[output] = srcs.replace('\\ ', ' ') - else: - obj_paths = _ParseNinjaPathList(srcs) - dep_map[output] = {os.path.basename(p): p for p in obj_paths} - elif executable_path: - last_executable_paths = [ - os.path.normpath(p) for p in _ParseNinjaPathList(outputs) - ] - if executable_path in last_executable_paths: - executable_inputs = _ParseNinjaPathList(srcs) + prev_inputs = None + for m in _REGEX.finditer(data): + groups = m.groups() + if groups[0]: + sub_ninjas.append(groups[0]) + elif groups[3]: + # Rust .rlibs are listed as implicit dependencies of the main + # target linking rule, then are given as an extra + # rlibs = + # variable on a subsequent line. Watch out for that line. + prev_inputs.extend(_ParseNinjaPathList(groups[3])) + else: + outputs = _ParseNinjaPathList(groups[1]) + input_paths = _ParseNinjaPathList(groups[2]) + for output in outputs: + assert output not in dep_map, f'Duplicate output: {output}' + dep_map[output] = input_paths + prev_inputs = input_paths - return sub_ninjas, executable_inputs + return sub_ninjas def _Parse(output_directory, executable_path): @@ -137,32 +104,50 @@ def _Parse(output_directory, executable_path): output_directory: Where to find the root build.ninja. executable_path: Path to binary to find inputs for. - Returns: A tuple of (source_mapper, executable_inputs). - source_mapper: _SourceMapper instance. - executable_inputs: List of paths of linker inputs. + Returns: _SourceMapper instance. """ - if executable_path: - executable_path = os.path.relpath(executable_path, output_directory) to_parse = ['build.ninja'] seen_paths = set(to_parse) dep_map = {} - executable_inputs = None while to_parse: path = os.path.join(output_directory, to_parse.pop()) with open(path, encoding='utf-8', errors='ignore') as obj: - sub_ninjas, found_executable_inputs = _ParseOneFile( - obj, dep_map, executable_path) - if found_executable_inputs: - assert not executable_inputs, ( - 'Found multiple inputs for executable_path ' + executable_path) - executable_inputs = found_executable_inputs + data = obj.read() + sub_ninjas = _ParseOneFile(data, dep_map, executable_path) for subpath in sub_ninjas: assert subpath not in seen_paths, 'Double include of ' + subpath seen_paths.add(subpath) to_parse.extend(sub_ninjas) - assert executable_inputs, 'Failed to find rule that builds ' + executable_path - return _SourceMapper(dep_map, seen_paths), executable_inputs + assert executable_path in dep_map, ('Failed to find rule that builds ' + + executable_path) + return _SourceMapper(dep_map, seen_paths) + + +def _CollectInputs(source_mapper, ret, output_path, stack, visited): + token = len(visited) + if visited.setdefault(output_path, token) != token: + return + if token % 10000 == 0: + logging.info('Resolved %d', token) + + # Don't recurse into non-generated files or into shared libraries. + if output_path.startswith('..') or output_path.endswith(('.so', '.so.TOC')): + ret.add(output_path) + return + + inputs = source_mapper.Lookup(output_path) + if not inputs: + return + + stack.append(output_path) + if len(stack) > _MAX_RECURSION: + print('Input loop!') + print('\n'.join(enumerate(stack))) + sys.exit(1) + for p in inputs: + _CollectInputs(source_mapper, ret, p, stack, visited) + stack.pop() def main(): @@ -176,35 +161,35 @@ def main(): format='%(levelname).1s %(relativeCreated)6d %(message)s', stream=logs_io) - source_mapper, object_paths = _Parse('.', args.executable) + logging.info('Parsing build.ninja') + executable_path = os.path.relpath(args.executable) + source_mapper = _Parse('.', executable_path) + object_paths = source_mapper.Lookup(executable_path) logging.info('Found %d linker inputs', len(object_paths)) - source_paths = [] - for obj_path in object_paths: - result = source_mapper.FindSourceForPath(obj_path) or obj_path - # Need to recurse on .a files. - if isinstance(result, dict): - source_paths.extend( - source_mapper.FindSourceForPath(v) or v for v in result.values()) - else: - source_paths.append(result) + source_paths = set() + stack = [] + visited = {} + for p in object_paths: + _CollectInputs(source_mapper, source_paths, p, stack, visited) logging.info('Found %d source paths', len(source_paths)) num_unmatched = source_mapper.unmatched_paths_count - if num_unmatched > _MAX_UNMATCHED_TO_LOG: - logging.warning('%d paths were missing sources (showed the first %d)', - num_unmatched, _MAX_UNMATCHED_TO_LOG) + logging.warning('%d paths were missing sources', num_unmatched) if num_unmatched > _MAX_UNMATCHED_TO_IGNORE: - raise Exception('Too many unmapped files. Likely a bug in ninja_parser.py') + raise Exception(f'{num_unmatched} unmapped files (of {len(object_paths)}).' + ' Likely a bug in ninja_parser.py') if args.depfile: action_helpers.write_depfile(args.depfile, args.result_json, source_mapper.parsed_files) + logging.warning('Writing %s source paths', len(source_paths)) with open(args.result_json, 'w', encoding='utf-8') as f: - json.dump({ - 'logs': logs_io.getvalue(), - 'source_paths': source_paths, - }, f) + json.dump( + { + 'logs': logs_io.getvalue(), + 'source_paths': sorted(source_paths), + }, f) if __name__ == '__main__': diff --git a/naiveproxy/src/build/private_code_test/private_code_test.gni b/naiveproxy/src/build/private_code_test/private_code_test.gni index 09d6a8dcae..f2effe9d94 100644 --- a/naiveproxy/src/build/private_code_test/private_code_test.gni +++ b/naiveproxy/src/build/private_code_test/private_code_test.gni @@ -4,6 +4,37 @@ import("//testing/test.gni") +_default_allowed_violations = [ + # Public-branding counterpart defines the same resources. + "../../chrome/app/theme/google_chrome/*", + + # Defines public counterpart with same entries. + "../../components/metrics/internal/server_urls.grd", + + # TODO(b/452971335): Audit entries below. + "../../chrome/browser/internal/resources/additional_modules_list.input", + "../../chrome/browser/internal/transform_additional_modules_list.py", + "../../chrome/common/request_header_integrity/internal/*", + "../../components/autofill/core/browser/form_parsing/internal_resources/0_default_regex_patterns.json", + "../../components/plus_addresses/core/browser/resources/internal/*", + "../../components/vector_icons/google_chrome/*", + "../../google_apis/internal/generate_metrics_key.py", + "../../third_party/search_engines_data/resources_internal/search_engines_scaled_resources.grd", +] + +if (!is_android) { + _default_allowed_violations += [ + "../../chrome/browser/actor/resources/internal/browser_resources.grd", + "../../chrome/browser/glic/resources/internal/browser_resources.grd", + "../../chrome/browser/nearby_sharing/internal/nearby_share_internal_icons.grd", + "../../chrome/browser/nearby_sharing/internal/nearby_share_internal_strings.grd", + "../../chrome/browser/resources/downloads/internal/icons.html", + "../../chrome/browser/resources/settings/internal/icons.html", + "../../third_party/search_engines_data/resources_internal/search_engine_descriptions_strings.grd", + "../../third_party/widevine/cdm/linux/x64/manifest.json", + ] +} + template("private_code_test") { testonly = true assert(!is_component_build, "Guard your test behind if (!is_component_build)") @@ -77,13 +108,15 @@ template("private_code_test") { rebase_path(get_label_info(_linker_inputs_dep, "root_out_dir"), root_build_dir), ] + _globs = _default_allowed_violations if (defined(invoker.allowed_violations)) { - foreach(_glob, invoker.allowed_violations) { - args += [ - "--allow-violation", - _glob, - ] - } + _globs += invoker.allowed_violations + } + foreach(_glob, _globs) { + args += [ + "--allow-violation", + _glob, + ] } if (defined(invoker.expect_failure) && invoker.expect_failure) { args += [ "--expect-failure" ] diff --git a/naiveproxy/src/build/private_code_test/private_code_test.py b/naiveproxy/src/build/private_code_test/private_code_test.py index f51888443a..ddea663401 100755 --- a/naiveproxy/src/build/private_code_test/private_code_test.py +++ b/naiveproxy/src/build/private_code_test/private_code_test.py @@ -127,17 +127,17 @@ def main(): if args.allow_violation: found, ignored_paths = _apply_allowlist(found, args.allow_violation) if ignored_paths: - print('Ignoring {len(ignored_paths)} allowlisted private paths:') - _print_paths(sorted(ignored_paths), 10) + print(f'Ignoring {len(ignored_paths)} allowlisted private paths:') + _print_paths(sorted(ignored_paths), 100) if found: limit = 10 if args.expect_failure else 1000 - print(f'Found {len(found)} private paths being linked into public code:') + print(f'Found {len(found)} non-allowlisted private paths:') _print_paths(found, limit) elif args.expect_failure: print('Expected to find a private path, but none were found.') else: - print('No private paths found 👍.') + print('No non-allowlisted private paths found 👍.') sys.exit(0 if bool(found) == args.expect_failure else 1) diff --git a/naiveproxy/src/build/rust/BUILD.gn b/naiveproxy/src/build/rust/BUILD.gn index 68a9290f2c..6362c0dcc2 100644 --- a/naiveproxy/src/build/rust/BUILD.gn +++ b/naiveproxy/src/build/rust/BUILD.gn @@ -34,18 +34,15 @@ if (toolchain_has_rust) { "//third_party/rust/cxx/v1/cxx.h", ] - defines = [ "RUST_CXX_NO_EXCEPTIONS" ] - # We cannot depend on base/base_export.h because base depends on us. if (is_component_build) { if (is_win) { - defines += [ "CXX_RS_EXPORT=__declspec(dllexport)" ] + defines = [ "CXX_RS_EXPORT=__declspec(dllexport)" ] } else { - defines += - [ "CXX_RS_EXPORT=__attribute__((visibility(\"default\")))" ] + defines = [ "CXX_RS_EXPORT=__attribute__((visibility(\"default\")))" ] } } else { - defines += [ "CXX_RS_EXPORT=" ] + defines = [ "CXX_RS_EXPORT=" ] } deps = [ @@ -98,8 +95,8 @@ config("panic_immediate_abort") { visibility = [ "//build/rust/std/rules:*" ] if (is_official_build) { rustflags = [ - "--cfg", - "feature=\"panic_immediate_abort\"", + "-Zunstable-options", + "-Cpanic=immediate-abort", ] } } diff --git a/naiveproxy/src/build/rust/allocator/lib.rs b/naiveproxy/src/build/rust/allocator/lib.rs index 29b3af1274..b92aec8086 100644 --- a/naiveproxy/src/build/rust/allocator/lib.rs +++ b/naiveproxy/src/build/rust/allocator/lib.rs @@ -90,11 +90,11 @@ mod both_allocators { #[linkage = "weak"] fn __rust_no_alloc_shim_is_unstable_v2() {} - // Mangle the symbol name as rustc expects. #[rustc_std_internal_symbol] - #[allow(non_upper_case_globals)] #[linkage = "weak"] - static __rust_alloc_error_handler_should_panic: u8 = 0; + fn __rust_alloc_error_handler_should_panic_v2() -> u8 { + 0 + } // Mangle the symbol name as rustc expects. #[rustc_std_internal_symbol] diff --git a/naiveproxy/src/build/rust/cargo_crate.gni b/naiveproxy/src/build/rust/cargo_crate.gni index cb0220af07..f3527b3f1e 100644 --- a/naiveproxy/src/build/rust/cargo_crate.gni +++ b/naiveproxy/src/build/rust/cargo_crate.gni @@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/rust/gni_impl/rustc_print_cfg.gni") import("//build/rust/rust_executable.gni") import("//build/rust/rust_macro.gni") import("//build/rust/rust_static_library.gni") @@ -148,6 +149,16 @@ template("cargo_crate") { } if (defined(invoker.cargo_pkg_version)) { _rustenv += [ "CARGO_PKG_VERSION=${invoker.cargo_pkg_version}" ] + + # Parse `..-
` (the `-
` part of optional,
+    # other parts are mandatory).
+    _cargo_pkg_version_parts = string_split(invoker.cargo_pkg_version, ".")
+    _rustenv += [ "CARGO_PKG_VERSION_MAJOR=${_cargo_pkg_version_parts[0]}" ]
+    _rustenv += [ "CARGO_PKG_VERSION_MINOR=${_cargo_pkg_version_parts[1]}" ]
+    _cargo_pkg_version_subparts = string_split(_cargo_pkg_version_parts[2], "-")
+    _cargo_pkg_version_subparts += [ "" ]  # In case there is no prerelease.
+    _rustenv += [ "CARGO_PKG_VERSION_PATCH=${_cargo_pkg_version_subparts[0]}" ]
+    _rustenv += [ "CARGO_PKG_VERSION_PRE=${_cargo_pkg_version_subparts[1]}" ]
   }
   if (defined(invoker.cargo_pkg_name)) {
     _rustenv += [ "CARGO_PKG_NAME=${invoker.cargo_pkg_name}" ]
@@ -438,10 +449,12 @@ template("cargo_crate") {
         "//build/action_helpers.py",
         "//build/gn_helpers.py",
         _rustflags_txt,
+        rustc_print_cfg_path,
       ]
       build_script_target = ":${_build_script_name}($rust_macro_toolchain)"
       deps = [
         ":${_build_script_name}_write_rustflags",
+        "//build/rust/gni_impl:rustc_print_cfg",
         build_script_target,
       ]
       testonly = _testonly
@@ -480,15 +493,11 @@ template("cargo_crate") {
         rebase_path(get_path_info(invoker.build_root, "dir"), root_build_dir),
         "--target",
         rust_abi_target,
+        "--rustc-print-cfg-path",
+        rebase_path(rustc_print_cfg_path, root_build_dir),
         "--rustflags",
         rebase_path(_rustflags_txt, root_build_dir),
       ]
-      if (cargo_target_abi != "") {
-        args += [
-          "--target-abi",
-          cargo_target_abi,
-        ]
-      }
       if (defined(invoker.features)) {
         args += [ "--features" ]
         args += invoker.features
diff --git a/naiveproxy/src/build/rust/chromium_prelude/import_attribute.rs b/naiveproxy/src/build/rust/chromium_prelude/import_attribute.rs
index bc0d1e73fb..f3149398f2 100644
--- a/naiveproxy/src/build/rust/chromium_prelude/import_attribute.rs
+++ b/naiveproxy/src/build/rust/chromium_prelude/import_attribute.rs
@@ -167,6 +167,12 @@ fn escape_non_identifier_chars(symbol: &str) -> Result {
             _ => return Err(format!("Unsupported character in GN path component: `{c}`")),
         }
     }
+    // The string replacements below are introduced to decrease the number
+    // of characters in the crate name. This is particularly important while
+    // building Chromium with lld_emit_indexes_and_imports=True, since it
+    // will potentially need to generate huge filenames, and the build will
+    // fail in some filesystems.
+    result = result.replace("third_uparty_srust_s", "_tpr");
 
     Ok(result)
 }
diff --git a/naiveproxy/src/build/rust/gni_impl/BUILD.gn b/naiveproxy/src/build/rust/gni_impl/BUILD.gn
index bcbe13d5a9..6daa92e9cc 100644
--- a/naiveproxy/src/build/rust/gni_impl/BUILD.gn
+++ b/naiveproxy/src/build/rust/gni_impl/BUILD.gn
@@ -2,6 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/rust.gni")
+import("//build/rust/gni_impl/rustc_print_cfg.gni")
+
 # The `allow_all_warnings` is meant to be used for suppressing warnings in
 # third-party crates coming from crates.io (ones under `//third_party/rust`).
 # Note that Chromium still wants to deny most warnings in some notionally
@@ -27,3 +30,23 @@ config("allow_all_warnings") {
   rustflags += [ "@${_path}" ]
   inputs = [ "allow_all_warnings.rsp" ]
 }
+
+# This `action` is meant to be run *once* per build and stashes the output
+# of `rustc --print=cfg --target=$rust_abi_target` into `rustc_print_cfg_path`.
+#
+# Scripts that need to be aware of Rust configuration (e.g. is `target_family =
+# "unix"` set) should 1) depend on this target, and 2) use
+# `rustc_print_cfg_path` as one of their `inputs` (after `import`-ing that
+# variable from `//build/rust/gni_impl/rustc_print_cfg.gni`).
+action("rustc_print_cfg") {
+  script = "rustc_print_cfg.py"
+  args = [
+    "--rust-prefix",
+    rebase_path("${rust_sysroot}/bin", root_build_dir),
+    "--target",
+    rust_abi_target,
+    "--output-path",
+    rebase_path(rustc_print_cfg_path, root_build_dir),
+  ]
+  outputs = [ rustc_print_cfg_path ]
+}
diff --git a/naiveproxy/src/build/rust/gni_impl/run_build_script.py b/naiveproxy/src/build/rust/gni_impl/run_build_script.py
index 12c40c678b..b4f6e209ba 100755
--- a/naiveproxy/src/build/rust/gni_impl/run_build_script.py
+++ b/naiveproxy/src/build/rust/gni_impl/run_build_script.py
@@ -61,31 +61,24 @@ def host_triple(rustc_path):
   return known_vars["host"]
 
 
-def set_cargo_cfg_target_env_variables(rustc_path, env):
-  """ Sets CARGO_CFG_TARGET_... based on output from rustc. """
-  target_triple = env["TARGET"]
-  assert target_triple
+def set_cargo_cfg_target_env_variables(rustc_print_cfg_path, env):
+  """ Sets `CARGO_CFG_TARGET_...` in `env` based on output from rustc.
 
-  # TODO(lukasza): Check if command-line flags other `--target` may affect the
-  # output of `--print-cfg`.  If so, then consider also passing extra `args`
-  # (derived from `rustflags` maybe?).
-  args = [rustc_path, "--print=cfg", f"--target={target_triple}"]
-
-  # TODO(https://crbug.com/435437947): Ideally `rustc --print=cfg
-  # --target=...` would only be invoked **once** per build (not once per
-  # `run_cxxbridge.py` and once per `run_build_script.py`).
-  proc = subprocess.Popen(args, stdout=subprocess.PIPE)
-  for line in io.TextIOWrapper(proc.stdout, encoding="utf-8"):
-    line = line.strip()
-    if "=" not in line: continue
-    key, value = line.split("=")
-    if key.startswith("target_"):
-      key = "CARGO_CFG_" + key.upper()
-      value = value.strip('"')
-      if key in env:
-        env[key] = env[key] + f",{value}"
-      else:
-        env[key] = value
+      `rustc_print_cfg_path` should be a path to the output of
+      `//build/rust/gni_impl:rustc_print_cfg`
+  """
+  with open(rustc_print_cfg_path, 'r') as file:
+    for line in file:
+      line = line.strip()
+      if "=" not in line: continue
+      key, value = line.split("=")
+      if key.startswith("target_"):
+        key = "CARGO_CFG_" + key.upper()
+        value = value.strip('"')
+        if key in env:
+          env[key] = env[key] + f",{value}"
+        else:
+          env[key] = value
 
 
 # Before 1.77, the format was `cargo:rustc-cfg=`. As of 1.77 the format is now
@@ -101,8 +94,11 @@ def main():
   parser.add_argument('--output',
                       required=True,
                       help='where to write output rustc flags')
-  parser.add_argument('--target', help='rust target triple')
-  parser.add_argument('--target-abi', help='rust target_abi')
+  parser.add_argument('--target', required=True, help='rust target triple')
+  parser.add_argument(
+      '--rustc-print-cfg-path',
+      required=True,
+      help='path to output from //build/rust/gni_impl:rustc_print_cfg')
   parser.add_argument('--features', help='features', nargs='+')
   parser.add_argument('--env', help='environment variable', nargs='+')
   parser.add_argument('--rustflags',
@@ -133,11 +129,8 @@ def main():
     env["OUT_DIR"] = tempdir
     env["CARGO_MANIFEST_DIR"] = os.path.abspath(args.src_dir)
     env["HOST"] = host_triple(rustc_path)
-    if args.target is None:
-      env["TARGET"] = env["HOST"]
-    else:
-      env["TARGET"] = args.target
-    set_cargo_cfg_target_env_variables(rustc_path, env)
+    env["TARGET"] = args.target
+    set_cargo_cfg_target_env_variables(args.rustc_print_cfg_path, env)
     if args.features:
       for f in args.features:
         feature_name = f.upper().replace("-", "_")
diff --git a/naiveproxy/src/build/rust/gni_impl/rust_target.gni b/naiveproxy/src/build/rust/gni_impl/rust_target.gni
index f400a023cb..ec0cafa0d0 100644
--- a/naiveproxy/src/build/rust/gni_impl/rust_target.gni
+++ b/naiveproxy/src/build/rust/gni_impl/rust_target.gni
@@ -65,6 +65,13 @@ template("rust_target") {
     _crate_name = string_replace(_crate_name, "/", "_s")
     _crate_name = string_replace(_crate_name, ":", "_c")
     _crate_name = string_replace(_crate_name, "-", "_d")
+
+    # The string replacements below are introduced to decrease the number
+    # of characters in the crate name. This is particularly important while
+    # building Chromium with lld_emit_indexes_and_imports=True, since it
+    # will potentially need to generate huge filenames, and the build will
+    # fail in some filesystems.
+    _crate_name = string_replace(_crate_name, "third_uparty_srust_s", "_tpr")
   }
   _generate_crate_root =
       defined(invoker.generate_crate_root) && invoker.generate_crate_root
@@ -137,7 +144,11 @@ template("rust_target") {
       _rustflags += [ "--cfg=feature=\"${i}\"" ]
     }
   }
-  _edition = "2021"
+
+  # Default to the 2024 edition of the Rust language, but allow the `invoker`
+  # to override this.  See also doc comments for `edition` at the top of
+  # `//build/rust/rust_static_library.gni`.
+  _edition = "2024"
   if (defined(invoker.edition)) {
     _edition = invoker.edition
   }
@@ -224,8 +235,7 @@ template("rust_target") {
   if (defined(invoker.cxx_bindings)) {
     _cxx_bindings = invoker.cxx_bindings
   }
-  _rustenv = [ "OUT_DIR=" +
-               rebase_path(_env_out_dir, get_path_info(_crate_root, "dir")) ]
+  _rustenv = [ "OUT_DIR=" + rebase_path(_env_out_dir, root_build_dir) ]
   if (defined(invoker.rustenv)) {
     _rustenv += invoker.rustenv
   }
diff --git a/naiveproxy/src/build/rust/gni_impl/rustc_print_cfg.gni b/naiveproxy/src/build/rust/gni_impl/rustc_print_cfg.gni
new file mode 100644
index 0000000000..fb19f5be5e
--- /dev/null
+++ b/naiveproxy/src/build/rust/gni_impl/rustc_print_cfg.gni
@@ -0,0 +1,14 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/rust.gni")
+
+# `third_party/rust/cxx/chromium_integration/rust_cxx.gni` can't discover
+# the path to the output of `//build/rust/gni_impl:rustc_print_cfg` using
+# `get_target_outputs`, because `get_target_outputs` can only be used for
+# targets defined in the same file.  So, to work around that, we specify
+# a reusable path definition below:
+rustc_print_cfg_path =
+    get_label_info("//build/rust/gni_impl:rustc_print_cfg", "target_gen_dir")
+rustc_print_cfg_path += "/rustc-print-cfg-${rust_abi_target}.txt"
diff --git a/naiveproxy/src/build/rust/gni_impl/rustc_print_cfg.py b/naiveproxy/src/build/rust/gni_impl/rustc_print_cfg.py
new file mode 100755
index 0000000000..01bd7521ab
--- /dev/null
+++ b/naiveproxy/src/build/rust/gni_impl/rustc_print_cfg.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Invokes `rustc --print=cfg --target=...` and writes results to a file.
+
+This script is typically invoked using the
+`//build/rust/gni_impl:rustc_print_cfg` target.
+"""
+
+import argparse
+import io
+import os
+import platform
+import re
+import subprocess
+import sys
+import tempfile
+
+
+def rustc_name():
+  if platform.system() == 'Windows':
+    return "rustc.exe"
+  else:
+    return "rustc"
+
+
+def capture_rustc_cfg(rust_prefix, target, output_path):
+  """ Invokes `rustc --print=cfg --target=` and saves results.
+
+  Results are saved to a file at `output_path`. """
+
+  rustc_path = os.path.join(rust_prefix, rustc_name())
+
+  # TODO(lukasza): Check if command-line flags other `--target` may affect the
+  # output of `--print-cfg`.  If so, then consider also passing extra `args`
+  # (derived from `rustflags` maybe?).
+  args = [rustc_path, "--print=cfg", f"--target={target}"]
+
+  os.makedirs(os.path.dirname(output_path), exist_ok=True)
+  with open(output_path, 'w') as output_file:
+    subprocess.run(args, stdout=output_file, check=True)
+
+
+def main():
+  parser = argparse.ArgumentParser("rustc_print_cfg.py")
+  parser.add_argument('--rust-prefix', required=True, help='rust path prefix')
+  parser.add_argument('--target', required=True, help='rust target triple')
+  parser.add_argument('--output-path', required=True, help='output file')
+  args = parser.parse_args()
+  capture_rustc_cfg(args.rust_prefix, args.target, args.output_path)
+  return 0
+
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/naiveproxy/src/build/rust/gni_impl/rustc_wrapper.py b/naiveproxy/src/build/rust/gni_impl/rustc_wrapper.py
index 1c675000e8..5e87cb54e9 100755
--- a/naiveproxy/src/build/rust/gni_impl/rustc_wrapper.py
+++ b/naiveproxy/src/build/rust/gni_impl/rustc_wrapper.py
@@ -82,7 +82,18 @@ import action_helpers
 # using our clang toolchain. That will remove the need for most of this
 # script.
 
-FILE_RE = re.compile("[^:]+: (.+)")
+# Regex for a line that specifies inter-file dependencies in a `.d` file.
+#
+# The syntax for such files follows the Makefile syntax and a regex is not
+# necessarily the best way to parse the lines. But this is what we started
+# with and it worked reasonably well so far. The main known issue is that
+# spaces in filenames are not supported.
+#
+# Other notes:
+# * We rely on greediness of `*` and `+`
+# * "#" is rejected as the first character to reject lines like
+#   `# env-dep:OUT_DIR=foo/bar`.
+FILE_RE = re.compile("^([^# ][^ ]*):( .+)?$")
 
 
 # Equivalent of python3.9 built-in
@@ -92,6 +103,49 @@ def remove_lib_suffix_from_l_args(text):
   return text
 
 
+def normalize_path(path, abs_build_root):
+  """Returns normalized `path` ('/' + relative to build root). """
+
+  # str.removeprefix() does not exist before python 3.9.
+  def remove_prefix(text, prefix):
+    if text.startswith(prefix):
+      return text[len(prefix):]
+    return text
+
+  return os.path.relpath(os.path.normpath(remove_prefix(
+      path, abs_build_root))).replace('\\', '/')
+
+
+def normalize_depline(depline, abs_build_root):
+  """Returns `depline` with normalized file paths.
+
+     Path normalization is needed to avoid "absolute path in deps ... request is
+     not relocatable" error.
+
+     If `depline` doesn't describe file/path dependencies (e.g. describes an
+     `env-dep`) then an unmodified `depline` is returned.
+  """
+  m = FILE_RE.match(depline)
+  if not m:
+    return depline
+
+  lhs_file = m.group(1)
+  rhs_group = m.group(2)
+  if rhs_group:
+    rhs_files = rhs_group.split()
+  else:
+    rhs_files = []
+
+  lhs_file = normalize_path(lhs_file, abs_build_root)
+  rhs_files = [normalize_path(f, abs_build_root) for f in rhs_files]
+
+  if rhs_files:
+    rhs_files = " ".join(rhs_files)
+    return f"{lhs_file}: {rhs_files}"
+  else:
+    return f"{lhs_file}:"
+
+
 def verify_inputs(depline, sources, abs_build_root):
   """Verify everything used by rustc (found in `depline`) was specified in the
   GN build rule (found in `sources` or `inputs`).
@@ -103,22 +157,12 @@ def verify_inputs(depline, sources, abs_build_root):
   consumed.
   """
 
-  # str.removeprefix() does not exist before python 3.9.
-  def remove_prefix(text, prefix):
-    if text.startswith(prefix):
-      return text[len(prefix):]
-    return text
-
-  def normalize_path(p):
-    return os.path.relpath(os.path.normpath(remove_prefix(
-        p, abs_build_root))).replace('\\', '/')
-
   # Collect the files that rustc says are needed.
   found_files = {}
   m = FILE_RE.match(depline)
-  if m:
-    files = m.group(1)
-    found_files = {normalize_path(f): f for f in files.split()}
+  if m and m.group(2):
+    files = m.group(2)
+    found_files = {normalize_path(f, abs_build_root): f for f in files.split()}
   # Get which ones are not listed in GN.
   missing_files = found_files.keys() - sources
 
@@ -190,6 +234,18 @@ def main():
   fixed_env_vars = []
   for item in rustenv:
     (k, v) = item.split("=", 1)
+
+    # Paths need to be relative at gn/ninja level (for compatibility with
+    # distributed builds), but it's okay to use absolute paths below gn/ninja
+    # level.  And because some paths need to be absolute, we make all of them
+    # absolute.  Examples of environment-variable-stored paths that need to be
+    # absolute:
+    #
+    # * `OUT_DIR` (because `rustc` resolves `include!` in relation to `.rs`
+    #   files - see https://crbug.com/448040713#comment6).
+    # * `SDKROOT` - see https://crbug.com/442128549
+    if os.path.exists(v):
+      v = os.path.abspath(v)
     env[k] = v
     fixed_env_vars.append(k)
 
@@ -215,7 +271,9 @@ def main():
       if m and m.group(1) in fixed_env_vars:
         dirty = True  # We want to skip this line.
       else:
-        final_depfile_lines.append(line)
+        new_line = normalize_depline(line, abs_build_root)
+        dirty = dirty or (new_line != line)
+        final_depfile_lines.append(new_line)
 
   # Verify each dependent file is listed in sources/inputs.
   for line in final_depfile_lines:
diff --git a/naiveproxy/src/build/rust/rust_bindgen_generator.gni b/naiveproxy/src/build/rust/rust_bindgen_generator.gni
index bc1ad33786..8a60841979 100644
--- a/naiveproxy/src/build/rust/rust_bindgen_generator.gni
+++ b/naiveproxy/src/build/rust/rust_bindgen_generator.gni
@@ -123,12 +123,6 @@ template("rust_bindgen_generator") {
     # Several important compiler flags come from default_compiler_configs
     configs += default_compiler_configs
 
-    # Disable libc++ module build as GN couldn't handle module deps for action
-    # correctly.
-    # TODO(crbug.com/418642435): Remove this workaround once GN can handle module deps for
-    # action correctly.
-    configs -= [ "//build/config/compiler:libcxx_module" ]
-
     # Bindgen uses the pinned version of clang, and these warnings only apply
     # to the very newest version.
     configs -= [ "//build/config/compiler:tot_warnings" ]
diff --git a/naiveproxy/src/build/rust/rust_executable.gni b/naiveproxy/src/build/rust/rust_executable.gni
index 029a865984..7f2215c076 100644
--- a/naiveproxy/src/build/rust/rust_executable.gni
+++ b/naiveproxy/src/build/rust/rust_executable.gni
@@ -11,7 +11,7 @@ import("//build/rust/gni_impl/rust_target.gni")
 #
 #   edition (optional)
 #     Edition of the Rust language to be used.
-#     Options are "2015", "2018" and "2021". Defaults to "2021".
+#     Options are "2015", "2018", "2021", and "2024". Defaults to "2024".
 #
 #   test_deps (optional)
 #     List of GN targets on which this crate's tests depend, in addition
diff --git a/naiveproxy/src/build/rust/rust_static_library.gni b/naiveproxy/src/build/rust/rust_static_library.gni
index e9c65885ae..19ba67d5c1 100644
--- a/naiveproxy/src/build/rust/rust_static_library.gni
+++ b/naiveproxy/src/build/rust/rust_static_library.gni
@@ -25,7 +25,7 @@ import("//build/rust/gni_impl/rust_target.gni")
 #
 #   edition (optional)
 #     Edition of the Rust language to be used.
-#     Options are "2015", "2018" and "2021". Defaults to "2021".
+#     Options are "2015", "2018", "2021", and "2024". Defaults to "2024".
 #
 #   allow_unsafe (optional)
 #     Set to true to allow unsafe code in this target. Defaults to false.
@@ -196,6 +196,14 @@ template("rust_static_library") {
         _crate_name = string_replace(_crate_name, "/", "_s")
         _crate_name = string_replace(_crate_name, ":", "_c")
         _crate_name = string_replace(_crate_name, "-", "_d")
+
+        # The string replacements below are introduced to decrease the number
+        # of characters in the crate name. This is particularly important while
+        # building Chromium with lld_emit_indexes_and_imports=True, since it
+        # will potentially need to generate huge filenames, and the build will
+        # fail in some filesystems.
+        _crate_name =
+            string_replace(_crate_name, "third_uparty_srust_s", "_tpr")
       }
 
       _rlib_path = "${_output_dir}/lib${_crate_name}.rlib"
diff --git a/naiveproxy/src/build/rust/rust_unit_test.gni b/naiveproxy/src/build/rust/rust_unit_test.gni
index be2bbeb4a0..86329a40dc 100644
--- a/naiveproxy/src/build/rust/rust_unit_test.gni
+++ b/naiveproxy/src/build/rust/rust_unit_test.gni
@@ -59,7 +59,8 @@ template("rust_unit_test") {
     }
   }
   _configs = invoker.configs
-  _edition = "2021"
+
+  _edition = "2024"
   if (defined(invoker.edition)) {
     _edition = invoker.edition
   }
@@ -118,8 +119,7 @@ template("rust_unit_test") {
       rustenv = []
     }
 
-    rustenv += [ "OUT_DIR=" +
-                 rebase_path(_env_out_dir, get_path_info(_crate_root, "dir")) ]
+    rustenv += [ "OUT_DIR=" + rebase_path(_env_out_dir, root_build_dir) ]
     metadata = {
       # Consumed by "rust_unit_tests_group" gni template.
       rust_unit_test_executables = [ _crate_name ]
diff --git a/naiveproxy/src/build/rust/std/BUILD.gn b/naiveproxy/src/build/rust/std/BUILD.gn
index bb2c988452..6d510bc0c5 100644
--- a/naiveproxy/src/build/rust/std/BUILD.gn
+++ b/naiveproxy/src/build/rust/std/BUILD.gn
@@ -42,7 +42,6 @@ if (toolchain_has_rust) {
     "rustc_demangle",
     "std_detect",
     "test",
-    "unicode_width",
     "unwind",
   ]
 
diff --git a/naiveproxy/src/build/rust/std/find_std_rlibs.py b/naiveproxy/src/build/rust/std/find_std_rlibs.py
index 386258f890..a9d9046682 100755
--- a/naiveproxy/src/build/rust/std/find_std_rlibs.py
+++ b/naiveproxy/src/build/rust/std/find_std_rlibs.py
@@ -51,6 +51,7 @@ def main():
   if args.target:
     rustc_args.extend(["--target", args.target])
   rustlib_dir = subprocess.check_output(rustc_args).rstrip().decode()
+  rustlib_dir = os.path.relpath(rustlib_dir)
 
   # Copy the rlibs to a predictable location. Whilst we're doing so,
   # also write a .d file so that ninja knows it doesn't need to do this
diff --git a/naiveproxy/src/build/rust/std/rules/BUILD.gn b/naiveproxy/src/build/rust/std/rules/BUILD.gn
index b51bd50ecd..e8678f4afe 100644
--- a/naiveproxy/src/build/rust/std/rules/BUILD.gn
+++ b/naiveproxy/src/build/rust/std/rules/BUILD.gn
@@ -204,6 +204,8 @@ cargo_crate("alloc") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/alloc/src/vec/spec_from_iter.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/alloc/src/vec/spec_from_iter_nested.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/alloc/src/vec/splice.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/alloc/src/wtf8/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/alloc/src/wtf8/tests.rs",
   ]
   inputs = []
   no_std = true
@@ -584,6 +586,7 @@ cargo_crate("core") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/fmt/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/fmt/nofloat.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/fmt/num.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/fmt/num_buffer.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/fmt/rt.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/future/async_drop.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/future/future.rs",
@@ -656,6 +659,7 @@ cargo_crate("core") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/macros/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/marker.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/marker/variance.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/mem/drop_guard.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/mem/manually_drop.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/mem/maybe_uninit.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/mem/mod.rs",
@@ -697,19 +701,7 @@ cargo_crate("core") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/nonzero.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/overflow_panic.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/saturating.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/i128.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/i16.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/i32.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/i64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/i8.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/int_macros.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/isize.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/u128.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/u16.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/u32.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/u64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/u8.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/usize.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/legacy_int_modules.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/uint_macros.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/wrapping.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/arith.rs",
@@ -727,6 +719,9 @@ cargo_crate("core") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/try_trait.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/unsize.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/option.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/os/darwin/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/os/darwin/objc.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/os/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/panic.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/panic/location.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/panic/panic_info.rs",
@@ -798,6 +793,7 @@ cargo_crate("core") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/unicode/unicode_data.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/unit.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/unsafe_binder.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/wtf8.rs",
   ]
   inputs = [
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/examples/README.md",
@@ -907,6 +903,7 @@ cargo_crate("core") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm_shared/test_support.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/core_arch_docs.md",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/lib.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/loongarch32/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/loongarch64/lasx/generated.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/loongarch64/lasx/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/loongarch64/lasx/tests.rs",
@@ -916,6 +913,7 @@ cargo_crate("core") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/loongarch64/lsx/tests.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/loongarch64/lsx/types.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/loongarch64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/loongarch_shared/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/macros.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/mips/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/mips/msa.rs",
@@ -1032,7 +1030,11 @@ cargo_crate("core") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ffi/c_void.md",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/fmt/fmt_trait_method_doc.md",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/macros/panic.md",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ptr/docs/INFO.md",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ptr/docs/add.md",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ptr/docs/addr.md",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ptr/docs/as_ref.md",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ptr/docs/as_uninit_ref.md",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ptr/docs/as_uninit_slice.md",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ptr/docs/is_null.md",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ptr/docs/offset.md",
@@ -1075,10 +1077,10 @@ cargo_crate("core") {
 }
 cargo_crate("getopts") {
   crate_type = "rlib"
-  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/getopts-0.2.23/src/lib.rs"
+  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/getopts-0.2.24/src/lib.rs"
   sources = [
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/getopts-0.2.23/src/lib.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/getopts-0.2.23/src/tests/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/getopts-0.2.24/src/lib.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/getopts-0.2.24/src/tests/mod.rs",
   ]
   inputs = []
   no_std = true
@@ -1086,7 +1088,7 @@ cargo_crate("getopts") {
   # Unit tests skipped. Generate with --with-tests to include them.
   build_native_rust_unit_tests = false
   edition = "2021"
-  cargo_pkg_version = "0.2.23"
+  cargo_pkg_version = "0.2.24"
   cargo_pkg_authors = "The Rust Project Developers"
   cargo_pkg_name = "getopts"
   cargo_pkg_description = "getopts-like option parsing"
@@ -1104,7 +1106,6 @@ cargo_crate("getopts") {
   deps = [
     ":rustc_std_workspace_core",
     ":rustc_std_workspace_std",
-    ":unicode_width",
     "//build/rust/std:profiler_builtins_group",
     "//build/rust/std:std_build_deps",
   ]
@@ -1234,35 +1235,35 @@ cargo_crate("gimli") {
 }
 cargo_crate("hashbrown") {
   crate_type = "rlib"
-  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/lib.rs"
+  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/lib.rs"
   sources = [
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/control/bitmask.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/control/group/generic.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/control/group/lsx.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/control/group/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/control/group/neon.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/control/group/sse2.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/control/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/control/tag.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/external_trait_impls/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/external_trait_impls/rayon/helpers.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/external_trait_impls/rayon/map.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/external_trait_impls/rayon/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/external_trait_impls/rayon/raw.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/external_trait_impls/rayon/set.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/external_trait_impls/rayon/table.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/external_trait_impls/serde.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/lib.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/macros.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/map.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/raw/alloc.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/raw/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/raw_entry.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/rustc_entry.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/scopeguard.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/set.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/table.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.4/src/util.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/control/bitmask.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/control/group/generic.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/control/group/lsx.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/control/group/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/control/group/neon.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/control/group/sse2.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/control/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/control/tag.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/external_trait_impls/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/external_trait_impls/rayon/helpers.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/external_trait_impls/rayon/map.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/external_trait_impls/rayon/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/external_trait_impls/rayon/raw.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/external_trait_impls/rayon/set.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/external_trait_impls/rayon/table.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/external_trait_impls/serde.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/lib.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/macros.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/map.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/raw/alloc.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/raw/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/raw_entry.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/rustc_entry.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/scopeguard.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/set.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/table.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/hashbrown-0.15.5/src/util.rs",
   ]
   inputs = []
   no_std = true
@@ -1270,7 +1271,7 @@ cargo_crate("hashbrown") {
   # Unit tests skipped. Generate with --with-tests to include them.
   build_native_rust_unit_tests = false
   edition = "2021"
-  cargo_pkg_version = "0.15.4"
+  cargo_pkg_version = "0.15.5"
   cargo_pkg_authors = "Amanieu d'Antras "
   cargo_pkg_name = "hashbrown"
   cargo_pkg_description = "A Rust port of Google's SwissTable hash map"
@@ -1316,189 +1317,199 @@ cargo_crate("hashbrown") {
 }
 cargo_crate("libc") {
   crate_type = "rlib"
-  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/lib.rs"
+  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/lib.rs"
   enabled = !is_win
   sources = [
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/fuchsia/aarch64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/fuchsia/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/fuchsia/riscv64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/fuchsia/x86_64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/hermit.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/lib.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/macros.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/primitives.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/psp.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/sgx.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/solid/aarch64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/solid/arm.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/solid/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/switch.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/teeos/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/trusty.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/aix/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/aix/powerpc64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/apple/b32/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/apple/b64/aarch64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/apple/b64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/apple/b64/x86_64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/apple/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/dragonfly/errno.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/dragonfly/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/aarch64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/arm.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/freebsd11/b32.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/freebsd15/x86_64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/powerpc.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/riscv64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/x86.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/freebsdlike/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/netbsd/aarch64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/netbsd/arm.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/netbsd/mips.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/netbsd/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/netbsd/powerpc.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/netbsd/riscv64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/netbsd/sparc64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/netbsd/x86.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/netbsd/x86_64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/openbsd/aarch64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/openbsd/arm.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/openbsd/mips64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/openbsd/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/openbsd/powerpc.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/openbsd/riscv64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/openbsd/sparc64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/openbsd/x86.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/bsd/netbsdlike/openbsd/x86_64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/cygwin/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/haiku/b32.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/haiku/b64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/haiku/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/haiku/native.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/haiku/x86_64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/hurd/b32.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/hurd/b64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/hurd/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/android/b32/arm.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/android/b32/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/android/b32/x86/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/android/b64/aarch64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/android/b64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/android/b64/riscv64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/android/b64/x86_64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/android/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/emscripten/lfs64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/emscripten/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/arch/generic/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/arch/mips/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/arch/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/arch/powerpc/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/arch/sparc/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b32/arm/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b32/csky/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b32/mips/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b32/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b32/powerpc.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b32/x86/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b64/s390x.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/gnu/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b32/arm/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b32/hexagon.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b32/mips/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b32/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b32/powerpc.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b32/x86/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b64/mips64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b64/powerpc64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b64/s390x.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b64/wasm32/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b64/wasm32/wali.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/lfs64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/musl/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/uclibc/arm/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/uclibc/mips/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/uclibc/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/uclibc/x86_64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/linux/uclibc/x86_64/other.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/linux_like/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/newlib/aarch64/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/newlib/arm/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/newlib/espidf/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/newlib/generic.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/newlib/horizon/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/newlib/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/newlib/powerpc/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/newlib/rtems/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/newlib/vita/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/nto/aarch64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/nto/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/nto/neutrino.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/nto/x86_64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/nuttx/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/redox/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/solarish/compat.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/solarish/illumos.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/solarish/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/solarish/solaris.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/solarish/x86.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/solarish/x86_64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/unix/solarish/x86_common.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/vxworks/aarch64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/vxworks/arm.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/vxworks/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/vxworks/powerpc.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/vxworks/powerpc64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/vxworks/riscv32.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/vxworks/riscv64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/vxworks/x86.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/vxworks/x86_64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/wasi/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/wasi/p2.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/windows/gnu/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/windows/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/windows/msvc/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/src/xous.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/fuchsia/aarch64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/fuchsia/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/fuchsia/riscv64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/fuchsia/x86_64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/hermit.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/lib.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/macros.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/new/bionic/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/new/bionic/sys/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/new/bionic/sys/socket.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/new/linux_uapi/linux/can.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/new/linux_uapi/linux/can/j1939.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/new/linux_uapi/linux/can/raw.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/new/linux_uapi/linux/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/new/linux_uapi/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/new/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/primitives.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/psp.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/sgx.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/solid/aarch64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/solid/arm.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/solid/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/switch.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/teeos/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/trusty.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/aix/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/aix/powerpc64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/apple/b32/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/apple/b64/aarch64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/apple/b64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/apple/b64/x86_64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/apple/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/dragonfly/errno.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/dragonfly/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/aarch64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/arm.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/freebsd11/b32.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/freebsd15/x86_64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/powerpc.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/riscv64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/x86.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/freebsdlike/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/netbsd/aarch64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/netbsd/arm.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/netbsd/mips.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/netbsd/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/netbsd/powerpc.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/netbsd/riscv64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/netbsd/sparc64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/netbsd/x86.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/netbsd/x86_64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/openbsd/aarch64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/openbsd/arm.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/openbsd/mips64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/openbsd/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/openbsd/powerpc.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/openbsd/riscv64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/openbsd/sparc64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/openbsd/x86.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/bsd/netbsdlike/openbsd/x86_64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/cygwin/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/haiku/b32.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/haiku/b64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/haiku/bsd.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/haiku/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/haiku/native.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/haiku/x86_64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/hurd/b32.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/hurd/b64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/hurd/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/android/b32/arm.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/android/b32/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/android/b32/x86/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/android/b64/aarch64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/android/b64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/android/b64/riscv64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/android/b64/x86_64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/android/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/emscripten/lfs64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/emscripten/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/arch/generic/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/arch/mips/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/arch/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/arch/powerpc/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/arch/sparc/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b32/arm/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b32/csky/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b32/mips/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b32/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b32/powerpc.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b32/x86/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b64/s390x.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/gnu/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b32/arm/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b32/hexagon.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b32/mips/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b32/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b32/powerpc.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b32/x86/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b64/mips64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b64/powerpc64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b64/s390x.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b64/wasm32/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b64/wasm32/wali.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/lfs64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/musl/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/uclibc/arm/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/uclibc/mips/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/uclibc/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/uclibc/x86_64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/linux/uclibc/x86_64/other.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/linux_like/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/newlib/aarch64/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/newlib/arm/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/newlib/espidf/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/newlib/generic.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/newlib/horizon/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/newlib/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/newlib/powerpc/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/newlib/rtems/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/newlib/vita/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/nto/aarch64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/nto/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/nto/neutrino.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/nto/x86_64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/nuttx/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/redox/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/solarish/compat.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/solarish/illumos.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/solarish/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/solarish/solaris.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/solarish/x86.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/solarish/x86_64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/unix/solarish/x86_common.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/vxworks/aarch64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/vxworks/arm.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/vxworks/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/vxworks/powerpc.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/vxworks/powerpc64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/vxworks/riscv32.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/vxworks/riscv64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/vxworks/x86.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/vxworks/x86_64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/wasi/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/wasi/p2.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/windows/gnu/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/windows/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/windows/msvc/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/src/xous.rs",
   ]
   inputs = []
   no_std = true
@@ -1506,7 +1517,7 @@ cargo_crate("libc") {
   # Unit tests skipped. Generate with --with-tests to include them.
   build_native_rust_unit_tests = false
   edition = "2021"
-  cargo_pkg_version = "0.2.174"
+  cargo_pkg_version = "0.2.175"
   cargo_pkg_authors = "The Rust Project Developers"
   cargo_pkg_name = "libc"
   cargo_pkg_description = "Raw FFI bindings to platform libraries like libc."
@@ -1531,8 +1542,8 @@ cargo_crate("libc") {
     "rustc-dep-of-std",
     "rustc-std-workspace-core",
   ]
-  build_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/build.rs"
-  build_sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.174/build.rs" ]
+  build_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/build.rs"
+  build_sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.175/build.rs" ]
   rustenv = [
     "CFG_DISABLE_UNSTABLE_FEATURES=0",
     "STD_ENV_ARCH=$rust_target_arch",
@@ -1719,89 +1730,89 @@ cargo_crate("miniz_oxide") {
 }
 cargo_crate("object") {
   crate_type = "rlib"
-  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/lib.rs"
+  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/lib.rs"
   enabled = !is_win
   sources = [
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/archive.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/build/bytes.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/build/elf.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/build/error.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/build/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/build/table.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/common.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/elf.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/endian.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/lib.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/macho.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/pe.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/pod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/any.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/archive.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/coff/comdat.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/coff/file.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/coff/import.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/coff/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/coff/relocation.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/coff/section.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/coff/symbol.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/elf/attributes.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/elf/comdat.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/elf/compression.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/elf/dynamic.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/elf/file.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/elf/hash.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/elf/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/elf/note.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/elf/relocation.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/elf/section.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/elf/segment.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/elf/symbol.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/elf/version.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/gnu_compression.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/macho/dyld_cache.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/macho/fat.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/macho/file.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/macho/load_command.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/macho/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/macho/relocation.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/macho/section.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/macho/segment.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/macho/symbol.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/pe/data_directory.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/pe/export.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/pe/file.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/pe/import.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/pe/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/pe/relocation.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/pe/resource.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/pe/rich.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/pe/section.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/read_cache.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/read_ref.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/traits.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/util.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/wasm.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/xcoff/comdat.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/xcoff/file.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/xcoff/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/xcoff/relocation.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/xcoff/section.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/xcoff/segment.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/read/xcoff/symbol.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/write/coff/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/write/coff/object.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/write/coff/writer.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/write/elf/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/write/elf/object.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/write/elf/writer.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/write/macho.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/write/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/write/pe.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/write/string.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/write/util.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/write/xcoff.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/src/xcoff.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/archive.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/build/bytes.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/build/elf.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/build/error.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/build/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/build/table.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/common.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/elf.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/endian.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/lib.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/macho.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/pe.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/pod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/any.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/archive.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/coff/comdat.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/coff/file.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/coff/import.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/coff/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/coff/relocation.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/coff/section.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/coff/symbol.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/elf/attributes.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/elf/comdat.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/elf/compression.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/elf/dynamic.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/elf/file.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/elf/hash.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/elf/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/elf/note.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/elf/relocation.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/elf/section.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/elf/segment.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/elf/symbol.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/elf/version.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/gnu_compression.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/macho/dyld_cache.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/macho/fat.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/macho/file.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/macho/load_command.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/macho/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/macho/relocation.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/macho/section.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/macho/segment.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/macho/symbol.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/pe/data_directory.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/pe/export.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/pe/file.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/pe/import.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/pe/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/pe/relocation.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/pe/resource.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/pe/rich.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/pe/section.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/read_cache.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/read_ref.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/traits.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/util.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/wasm.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/xcoff/comdat.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/xcoff/file.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/xcoff/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/xcoff/relocation.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/xcoff/section.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/xcoff/segment.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/read/xcoff/symbol.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/write/coff/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/write/coff/object.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/write/coff/writer.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/write/elf/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/write/elf/object.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/write/elf/writer.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/write/macho.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/write/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/write/pe.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/write/string.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/write/util.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/write/xcoff.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/src/xcoff.rs",
   ]
   inputs = []
   no_std = true
@@ -1809,7 +1820,7 @@ cargo_crate("object") {
   # Unit tests skipped. Generate with --with-tests to include them.
   build_native_rust_unit_tests = false
   edition = "2018"
-  cargo_pkg_version = "0.37.1"
+  cargo_pkg_version = "0.37.3"
   cargo_pkg_name = "object"
   cargo_pkg_description =
       "A unified interface for reading and writing object file formats."
@@ -1852,8 +1863,8 @@ cargo_crate("object") {
     "unaligned",
     "xcoff",
   ]
-  build_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/build.rs"
-  build_sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.1/build.rs" ]
+  build_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/build.rs"
+  build_sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.37.3/build.rs" ]
   rustenv = [
     "CFG_DISABLE_UNSTABLE_FEATURES=0",
     "STD_ENV_ARCH=$rust_target_arch",
@@ -1895,8 +1906,7 @@ cargo_crate("panic_abort") {
   ]
   executable_configs += [ "//build/config/compiler:no_chromium_code" ]
   deps = [
-    ":compiler_builtins",
-    ":core",
+    ":rustc_std_workspace_core",
     "//build/rust/std:profiler_builtins_group",
     "//build/rust/std:std_build_deps",
   ]
@@ -1906,6 +1916,9 @@ cargo_crate("panic_abort") {
       ":libc",
     ]
   }
+  aliased_deps = {
+    core = ":rustc_std_workspace_core"
+  }
   rustenv = [
     "CFG_DISABLE_UNSTABLE_FEATURES=0",
     "STD_ENV_ARCH=$rust_target_arch",
@@ -1952,9 +1965,7 @@ cargo_crate("panic_unwind") {
   executable_configs += [ "//build/config/compiler:no_chromium_code" ]
   deps = [
     ":alloc",
-    ":cfg_if",
-    ":compiler_builtins",
-    ":core",
+    ":rustc_std_workspace_core",
     ":unwind",
     "//build/rust/std:profiler_builtins_group",
     "//build/rust/std:std_build_deps",
@@ -1962,6 +1973,9 @@ cargo_crate("panic_unwind") {
   if (!is_win) {
     deps += [ ":libc" ]
   }
+  aliased_deps = {
+    core = ":rustc_std_workspace_core"
+  }
   rustenv = [
     "CFG_DISABLE_UNSTABLE_FEATURES=0",
     "STD_ENV_ARCH=$rust_target_arch",
@@ -2074,11 +2088,11 @@ cargo_crate("profiler_builtins") {
 }
 cargo_crate("rustc_demangle") {
   crate_type = "rlib"
-  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/rustc-demangle-0.1.25/src/lib.rs"
+  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/rustc-demangle-0.1.26/src/lib.rs"
   sources = [
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/rustc-demangle-0.1.25/src/legacy.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/rustc-demangle-0.1.25/src/lib.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/rustc-demangle-0.1.25/src/v0.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/rustc-demangle-0.1.26/src/legacy.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/rustc-demangle-0.1.26/src/lib.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/rustc-demangle-0.1.26/src/v0.rs",
   ]
   inputs = []
   no_std = true
@@ -2086,7 +2100,7 @@ cargo_crate("rustc_demangle") {
   # Unit tests skipped. Generate with --with-tests to include them.
   build_native_rust_unit_tests = false
   edition = "2015"
-  cargo_pkg_version = "0.1.25"
+  cargo_pkg_version = "0.1.26"
   cargo_pkg_authors = "Alex Crichton "
   cargo_pkg_name = "rustc-demangle"
   cargo_pkg_description = "Rust compiler symbol demangling."
@@ -2127,10 +2141,10 @@ cargo_crate("rustc_demangle") {
 }
 cargo_crate("rustc_literal_escaper") {
   crate_type = "rlib"
-  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/rustc-literal-escaper-0.0.2/src/lib.rs"
+  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/rustc-literal-escaper-0.0.5/src/lib.rs"
   sources = [
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/rustc-literal-escaper-0.0.2/src/lib.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/rustc-literal-escaper-0.0.2/src/tests.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/rustc-literal-escaper-0.0.5/src/lib.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/rustc-literal-escaper-0.0.5/src/tests.rs",
   ]
   inputs = []
   no_std = true
@@ -2138,7 +2152,7 @@ cargo_crate("rustc_literal_escaper") {
   # Unit tests skipped. Generate with --with-tests to include them.
   build_native_rust_unit_tests = false
   edition = "2021"
-  cargo_pkg_version = "0.0.2"
+  cargo_pkg_version = "0.0.5"
   cargo_pkg_name = "rustc-literal-escaper"
   cargo_pkg_description = "Provides code to unescape string literals"
   cargo_pkg_repository = "https://github.com/rust-lang/literal-escaper"
@@ -2153,11 +2167,13 @@ cargo_crate("rustc_literal_escaper") {
   ]
   executable_configs += [ "//build/config/compiler:no_chromium_code" ]
   deps = [
+    ":rustc_std_workspace_core",
     ":rustc_std_workspace_std",
     "//build/rust/std:profiler_builtins_group",
     "//build/rust/std:std_build_deps",
   ]
   aliased_deps = {
+    core = ":rustc_std_workspace_core"
     std = ":rustc_std_workspace_std"
   }
   features = [ "rustc-dep-of-std" ]
@@ -2374,9 +2390,11 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/android/raw.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/cygwin/fs.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/cygwin/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/cygwin/net.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/cygwin/raw.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/darwin/fs.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/darwin/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/darwin/objc.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/darwin/raw.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/dragonfly/fs.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/dragonfly/mod.rs",
@@ -2418,6 +2436,7 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/hurd/raw.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/illumos/fs.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/illumos/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/illumos/net.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/illumos/raw.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/ios/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/l4re/fs.rs",
@@ -2459,6 +2478,7 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/rtems/raw.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/solaris/fs.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/solaris/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/solaris/net.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/solaris/raw.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/solid/ffi.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/solid/io.rs",
@@ -2545,6 +2565,10 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sync/mpmc/waker.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sync/mpmc/zero.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sync/mpsc.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sync/nonpoison.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sync/nonpoison/condvar.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sync/nonpoison/mutex.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sync/nonpoison/rwlock.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sync/once_lock.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sync/poison.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sync/poison/condvar.rs",
@@ -2573,13 +2597,15 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/args/uefi.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/args/unix.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/args/unsupported.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/args/wasi.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/args/wasip1.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/args/wasip2.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/args/windows.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/args/windows/tests.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/args/xous.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/args/zkvm.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/backtrace.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/cmath.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/configure_builtins.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/env/common.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/env/hermit.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/env/mod.rs",
@@ -2612,6 +2638,7 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/fs/windows.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/fs/windows/remove_dir_all.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/io/io_slice/iovec.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/io/io_slice/uefi.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/io/io_slice/unsupported.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/io/io_slice/wasi.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/io/io_slice/windows.rs",
@@ -2621,9 +2648,10 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/io/is_terminal/windows.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/io/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/sgx.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/socket.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/socket/hermit.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/socket/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/socket/solid.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/socket/tests.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/socket/unix.rs",
@@ -2650,13 +2678,11 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/futex.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/os.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/thread.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/time.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/abi.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/error.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/spin.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/task.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/thread.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/thread_parking.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/time.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/time/tests.rs",
@@ -2676,7 +2702,6 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/libunwind_integration.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/os.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/thread.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/thread_parking.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/time.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/waitqueue/mod.rs",
@@ -2694,13 +2719,11 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/time.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/teeos/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/teeos/os.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/teeos/thread.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/trusty/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/helpers.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/os.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/tests.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/thread.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/time.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/fuchsia.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/futex.rs",
@@ -2718,25 +2741,23 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/sync/condvar.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/sync/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/sync/mutex.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/thread.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/thread_parking.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/time.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/weak.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/weak/tests.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/common.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/os.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/pipe.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/thread.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/time.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/helpers.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/os.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/thread.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/time.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasip1/helpers.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasip1/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasip1/os.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasip1/time.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasip2/cabi_realloc.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasip2/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasip2/time.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasm/atomics/futex.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasm/atomics/thread.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasm/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/api.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/api/tests.rs",
@@ -2752,13 +2773,11 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/pipe.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/stack_overflow.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/stack_overflow_uwp.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/thread.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/time.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/os.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/os/params.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/os/params/tests.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/thread.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/time.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/zkvm/abi.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/zkvm/mod.rs",
@@ -2778,6 +2797,11 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/personality/emcc.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/personality/gcc.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/personality/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/platform_version/darwin/core_foundation.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/platform_version/darwin/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/platform_version/darwin/public_extern.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/platform_version/darwin/tests.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/platform_version/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/process/env.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/process/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/process/uefi.rs",
@@ -2813,7 +2837,8 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/random/unix_legacy.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/random/unsupported.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/random/vxworks.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/random/wasi.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/random/wasip1.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/random/wasip2.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/random/windows.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/random/zkvm.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/stdio/mod.rs",
@@ -2824,7 +2849,8 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/stdio/uefi.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/stdio/unix.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/stdio/unsupported.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/stdio/wasi.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/stdio/wasip1.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/stdio/wasip2.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/stdio/windows.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/stdio/windows/tests.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/stdio/xous.rs",
@@ -2866,6 +2892,19 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sync/thread_parking/unsupported.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sync/thread_parking/windows7.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sync/thread_parking/xous.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread/hermit.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread/sgx.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread/solid.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread/teeos.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread/uefi.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread/unix.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread/unsupported.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread/wasip1.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread/wasip2.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread/wasm.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread/windows.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread/xous.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread_local/destructors/linux_like.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread_local/destructors/list.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread_local/guard/apple.rs",
@@ -2887,8 +2926,6 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys_common/mod.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys_common/tests.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys_common/wstr.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys_common/wtf8.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys_common/wtf8/tests.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/test_helpers.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/thread/current.rs",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/thread/local.rs",
@@ -2953,7 +2990,11 @@ cargo_crate("std") {
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/fmt/fmt_trait_method_doc.md",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/macros/panic.md",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/primitive_docs.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/ptr/docs/INFO.md",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/ptr/docs/add.md",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/ptr/docs/addr.md",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/ptr/docs/as_ref.md",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/ptr/docs/as_uninit_ref.md",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/ptr/docs/as_uninit_slice.md",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/ptr/docs/is_null.md",
     "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/ptr/docs/offset.md",
@@ -2987,7 +3028,6 @@ cargo_crate("std") {
   deps = [
     ":alloc",
     ":cfg_if",
-    ":compiler_builtins",
     ":core",
     ":hashbrown",
     ":panic_abort",
@@ -3014,7 +3054,7 @@ cargo_crate("std") {
     "backtrace",
     "miniz_oxide",
     "object",
-    "panic_unwind",
+    "panic-unwind",
     "std_detect_dlsym_getauxval",
     "std_detect_file_io",
   ]
@@ -3037,45 +3077,48 @@ cargo_crate("std") {
 }
 cargo_crate("std_detect") {
   crate_type = "rlib"
-  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/lib.rs"
+  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/lib.rs"
   sources = [
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/aarch64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/arm.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/loongarch.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/mips.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/mips64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/powerpc.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/powerpc64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/riscv.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/s390x.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/x86.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/bit.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/cache.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/macros.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/aarch64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/darwin/aarch64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/freebsd/aarch64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/freebsd/arm.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/freebsd/auxvec.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/freebsd/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/freebsd/powerpc.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/aarch64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/arm.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/auxvec.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/loongarch.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/mips.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/mod.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/powerpc.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/riscv.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/s390x.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/openbsd/aarch64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/other.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/riscv.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/windows/aarch64.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/x86.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/lib.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/arch/aarch64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/arch/arm.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/arch/loongarch.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/arch/mips.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/arch/mips64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/arch/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/arch/powerpc.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/arch/powerpc64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/arch/riscv.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/arch/s390x.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/arch/x86.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/bit.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/cache.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/macros.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/aarch64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/darwin/aarch64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/freebsd/aarch64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/freebsd/arm.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/freebsd/auxvec.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/freebsd/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/freebsd/powerpc.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/linux/aarch64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/linux/aarch64/tests.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/linux/arm.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/linux/auxvec.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/linux/auxvec/tests.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/linux/loongarch.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/linux/mips.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/linux/mod.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/linux/powerpc.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/linux/riscv.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/linux/s390x.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/openbsd/aarch64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/other.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/riscv.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/riscv/tests.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/windows/aarch64.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/detect/os/x86.rs",
+    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std_detect/src/lib.rs",
   ]
   inputs = []
   no_std = true
@@ -3100,7 +3143,6 @@ cargo_crate("std_detect") {
   ]
   executable_configs += [ "//build/config/compiler:no_chromium_code" ]
   deps = [
-    ":cfg_if",
     ":rustc_std_workspace_alloc",
     ":rustc_std_workspace_core",
     "//build/rust/std:profiler_builtins_group",
@@ -3114,10 +3156,8 @@ cargo_crate("std_detect") {
     core = ":rustc_std_workspace_core"
   }
   features = [
-    "alloc",
-    "core",
+    "default",
     "libc",
-    "rustc-dep-of-std",
     "std_detect_dlsym_getauxval",
     "std_detect_file_io",
   ]
@@ -3257,64 +3297,6 @@ cargo_crate("test") {
   output_dir =
       "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/"
 }
-cargo_crate("unicode_width") {
-  crate_type = "rlib"
-  crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/unicode-width-0.2.1/src/lib.rs"
-  sources = [
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/unicode-width-0.2.1/src/lib.rs",
-    "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/unicode-width-0.2.1/src/tables.rs",
-  ]
-  inputs = []
-  no_std = true
-
-  # Unit tests skipped. Generate with --with-tests to include them.
-  build_native_rust_unit_tests = false
-  edition = "2021"
-  cargo_pkg_version = "0.2.1"
-  cargo_pkg_authors =
-      "kwantam , Manish Goregaokar "
-  cargo_pkg_name = "unicode-width"
-  cargo_pkg_description = "Determine displayed width of `char` and `str` types according to Unicode Standard Annex #11 rules."
-  cargo_pkg_repository = "https://github.com/unicode-rs/unicode-width"
-  library_configs -= [
-    "//build/config/compiler:chromium_code",
-    "//build/config/compiler:disallow_unstable_features",
-  ]
-  library_configs += [ "//build/config/compiler:no_chromium_code" ]
-  executable_configs -= [
-    "//build/config/compiler:chromium_code",
-    "//build/config/compiler:disallow_unstable_features",
-  ]
-  executable_configs += [ "//build/config/compiler:no_chromium_code" ]
-  deps = [
-    ":rustc_std_workspace_core",
-    ":rustc_std_workspace_std",
-    "//build/rust/std:profiler_builtins_group",
-    "//build/rust/std:std_build_deps",
-  ]
-  aliased_deps = {
-    core = ":rustc_std_workspace_core"
-    std = ":rustc_std_workspace_std"
-  }
-  features = [
-    "cjk",
-    "core",
-    "default",
-    "rustc-dep-of-std",
-    "std",
-  ]
-  rustenv = [
-    "CFG_DISABLE_UNSTABLE_FEATURES=0",
-    "STD_ENV_ARCH=$rust_target_arch",
-  ]
-  rustflags = [
-    "--cfg=backtrace_in_libstd",
-    "-Zforce-unstable-if-unmarked",
-    "--cap-lints=allow",  # Suppress all warnings in stdlib crates
-  ]
-  output_dir =
-      "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/"
-}
 cargo_crate("unwind") {
   crate_type = "rlib"
   crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/unwind/src/lib.rs"
@@ -3344,15 +3326,16 @@ cargo_crate("unwind") {
   ]
   executable_configs += [ "//build/config/compiler:no_chromium_code" ]
   deps = [
-    ":cfg_if",
-    ":compiler_builtins",
-    ":core",
+    ":rustc_std_workspace_core",
     "//build/rust/std:profiler_builtins_group",
     "//build/rust/std:std_build_deps",
   ]
   if (!is_win) {
     deps += [ ":libc" ]
   }
+  aliased_deps = {
+    core = ":rustc_std_workspace_core"
+  }
   rustenv = [
     "CFG_DISABLE_UNSTABLE_FEATURES=0",
     "STD_ENV_ARCH=$rust_target_arch",
diff --git a/naiveproxy/src/build/rust/tests/bindgen_cpp_test_with_cpp_linkage/lib.rs b/naiveproxy/src/build/rust/tests/bindgen_cpp_test_with_cpp_linkage/lib.rs
index 25d80df65d..bdf4fb5c9f 100644
--- a/naiveproxy/src/build/rust/tests/bindgen_cpp_test_with_cpp_linkage/lib.rs
+++ b/naiveproxy/src/build/rust/tests/bindgen_cpp_test_with_cpp_linkage/lib.rs
@@ -6,7 +6,7 @@ chromium::import! {
     "//build/rust/tests/bindgen_cpp_test_with_cpp_linkage:cpp_lib_bindgen";
 }
 
-#[no_mangle]
+#[unsafe(no_mangle)]
 pub fn rust_main() {
     let from_cpp =
         unsafe { cpp_lib_bindgen::functions::normal_fn(cpp_lib_bindgen::functions::kNumber) };
diff --git a/naiveproxy/src/build/rust/tests/test_rust_calling_cpp/rust_calling_cpp_rlib.rs b/naiveproxy/src/build/rust/tests/test_rust_calling_cpp/rust_calling_cpp_rlib.rs
index 54557e455a..8fe0cddc47 100644
--- a/naiveproxy/src/build/rust/tests/test_rust_calling_cpp/rust_calling_cpp_rlib.rs
+++ b/naiveproxy/src/build/rust/tests/test_rust_calling_cpp/rust_calling_cpp_rlib.rs
@@ -15,7 +15,7 @@ mod ffi {
     }
 }
 
-#[no_mangle]
+#[unsafe(no_mangle)]
 pub fn rust_calling_cpp() {
     assert_eq!(ffi::mul_by_2_in_cpp_library(3), 6);
 }
diff --git a/naiveproxy/src/build/rust/tests/test_rust_metadata/lib.rs b/naiveproxy/src/build/rust/tests/test_rust_metadata/lib.rs
index bfe2e1b268..46452297a1 100644
--- a/naiveproxy/src/build/rust/tests/test_rust_metadata/lib.rs
+++ b/naiveproxy/src/build/rust/tests/test_rust_metadata/lib.rs
@@ -19,7 +19,7 @@ pub use foo_dependency::say_foo;
 pub use foo_dependency::say_foo_directly;
 pub use transitive_dep::say_something;
 
-#[no_mangle]
+#[unsafe(no_mangle)]
 pub extern "C" fn print_foo_bar() {
     println!("{}", foo_dependency::say_foo());
     println!("{}", transitive_dep::say_something());
diff --git a/naiveproxy/src/build/sanitizers/dlcloseshim.c b/naiveproxy/src/build/sanitizers/dlcloseshim.c
index 8d932898e5..e7410534f1 100644
--- a/naiveproxy/src/build/sanitizers/dlcloseshim.c
+++ b/naiveproxy/src/build/sanitizers/dlcloseshim.c
@@ -11,6 +11,7 @@
 #if defined(__clang__)
 __attribute__((visibility("default"), noinline))
 #endif
-void __wrap_dlclose(void *handle) {
+int __wrap_dlclose(void *handle) {
   // Do nothing. We don't want to call the real dlclose on libfuzzer builds.
+  return 0;
 }
diff --git a/naiveproxy/src/build/sanitizers/sanitizer_options.cc b/naiveproxy/src/build/sanitizers/sanitizer_options.cc
index b304362601..f131e1c7b5 100644
--- a/naiveproxy/src/build/sanitizers/sanitizer_options.cc
+++ b/naiveproxy/src/build/sanitizers/sanitizer_options.cc
@@ -57,13 +57,8 @@ const char* kAsanDefaultOptions =
 
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_APPLE) || \
     BUILDFLAG(IS_WIN)
-// Allow NaCl to override the default asan options.
-extern const char* kAsanDefaultOptionsNaCl;
-__attribute__((weak)) const char* kAsanDefaultOptionsNaCl = nullptr;
 
 SANITIZER_HOOK_ATTRIBUTE const char *__asan_default_options() {
-  if (kAsanDefaultOptionsNaCl)
-    return kAsanDefaultOptionsNaCl;
   return kAsanDefaultOptions;
 }
 
diff --git a/naiveproxy/src/build/toolchain/apple/compile_xcassets.py b/naiveproxy/src/build/toolchain/apple/compile_xcassets.py
index f99192129b..29e13f289b 100644
--- a/naiveproxy/src/build/toolchain/apple/compile_xcassets.py
+++ b/naiveproxy/src/build/toolchain/apple/compile_xcassets.py
@@ -31,6 +31,9 @@ SECTION_HEADER = re.compile('^/\\* ([^ ]*) \\*/$')
 # Name of the section containing informational messages that can be ignored.
 NOTICE_SECTION = 'com.apple.actool.compilation-results'
 
+# Name of the section containing warning messages.
+WARNING_SECTION = 'com.apple.actool.document.warnings'
+
 # App icon asset type.
 APP_ICON_ASSET_TYPE = '.appiconset'
 
@@ -86,6 +89,11 @@ def FilterCompilerOutput(compiler_output, relative_paths):
             data_in_section = False
             current_section = match.group(1)
             continue
+        if current_section and current_section == WARNING_SECTION:
+            if line.startswith(
+                    ':(null): warning: Failed to generate flattened icon stack'
+            ):
+                continue
         if current_section and current_section != NOTICE_SECTION:
             if not data_in_section:
                 data_in_section = True
@@ -254,6 +262,18 @@ def CompileAssetCatalog(output, target_os, target_environment, product_type,
                 else:
                     command.extend(['--app-icon', asset_name])
 
+            if asset_type == ".icon":
+                inputs.remove(relative_path)
+                dir = os.path.dirname(relative_path)
+                path_with_dir = os.path.join(dir, asset_name + asset_type)
+                path_without_dir = os.path.join(relative_path,
+                                                asset_name + asset_type)
+                shutil.copytree(path_without_dir, path_with_dir)
+                inputs.append(path_with_dir)
+                command.extend(['--app-icon', asset_name])
+                command.extend(
+                    ['--enable-icon-stack-fallback-generation=disabled'])
+                command.extend(['--include-all-app-icons'])
             if asset_type not in ACTOOL_FLAG_FOR_ASSET_TYPE:
                 continue
 
diff --git a/naiveproxy/src/build/toolchain/apple/swiftc.py b/naiveproxy/src/build/toolchain/apple/swiftc.py
index b030a73add..ec0e65f81e 100644
--- a/naiveproxy/src/build/toolchain/apple/swiftc.py
+++ b/naiveproxy/src/build/toolchain/apple/swiftc.py
@@ -78,7 +78,7 @@ class FrameworkArgumentForwarder(ArgumentForwarder):
     ArgumentForwarder.__init__(self,
                                arg_name,
                                arg_join=lambda _: len(arg_name) == 1,
-                               to_swift=lambda _: True,
+                               to_swift=lambda _: arg_name != '-iframework',
                                to_clang=lambda _: True)
 
 
@@ -99,6 +99,7 @@ ARGUMENT_FORWARDER_FOR_ATTR = (
     ('system_include_dirs', IncludeArgumentForwarder('-isystem')),
     ('framework_dirs', FrameworkArgumentForwarder('-F')),
     ('system_framework_dirs', FrameworkArgumentForwarder('-Fsystem')),
+    ('iframework_dirs', FrameworkArgumentForwarder('-iframework')),
     ('defines', DefineArgumentForwarder('-D')),
 )
 
@@ -384,6 +385,7 @@ def invoke_swift_compiler(args, extras_args, build_cache_dir, output_file_map):
       '-save-temps',
       '-no-color-diagnostics',
       '-serialize-diagnostics',
+      '-explicit-module-build',
       '-emit-dependencies',
       '-emit-module',
       '-emit-module-path',
@@ -418,6 +420,11 @@ def invoke_swift_compiler(args, extras_args, build_cache_dir, output_file_map):
   for (attr_name, forwarder) in ARGUMENT_FORWARDER_FOR_ATTR:
     forwarder.forward(swiftc_args, getattr(args, attr_name), args.target_triple)
 
+  # Handle optional -Xcc arguments.
+  if args.xcc_args:
+    for xcc_arg in args.xcc_args:
+      swiftc_args.extend(['-Xcc', xcc_arg])
+
   # Handle -whole-module-optimization flag.
   num_threads = max(1, multiprocessing.cpu_count() // 2)
   if args.whole_module_optimization:
@@ -627,6 +634,11 @@ def main(args):
                       dest='system_framework_dirs',
                       help='add directory to system framework search path')
 
+  parser.add_argument('-iframework',
+                      action='append',
+                      dest='iframework_dirs',
+                      help='add directory to system framework search path')
+
   parser.add_argument('-D',
                       action='append',
                       dest='defines',
@@ -645,6 +657,11 @@ def main(args):
                       nargs='+',
                       help='Swift source files to compile')
 
+  parser.add_argument('-Xcc',
+                      action='append',
+                      dest='xcc_args',
+                      help='add argument to the clang compiler')
+
   parsed, extras = parser.parse_known_args(args)
   compile_module(parsed, extras, build_signature(os.environ, args))
 
diff --git a/naiveproxy/src/build/toolchain/apple/toolchain.gni b/naiveproxy/src/build/toolchain/apple/toolchain.gni
index 8eeccf0b9c..c5e065c030 100644
--- a/naiveproxy/src/build/toolchain/apple/toolchain.gni
+++ b/naiveproxy/src/build/toolchain/apple/toolchain.gni
@@ -6,6 +6,7 @@
 # some enhancements since the commands on Mac are slightly different than on
 # Linux.
 
+import("//build/config/apple/arch.gni")
 import("//build/config/apple/symbols.gni")
 import("//build/config/clang/clang.gni")
 import("//build/config/compiler/compiler.gni")
@@ -235,12 +236,33 @@ template("single_apple_toolchain") {
                      rebase_path("//tools/clang/dsymutil/bin/dsymutil",
                                  root_build_dir) + " "
 
+      # All the toolchains are defined in the context of the default toolchain,
+      # this means that the global variable `current_cpu` is not correct, it
+      # will be the one for the default toolchain.
+      #
+      # This means that the code cannot use the variable `dsym_arch` defined in
+      # build/config/apple/symbols.gni since it is defined from `current_cpu`.
+      #
+      # Instead declare another local variable `_dsym_arch` based from the
+      # toolchain `toolchain_args.current_cpu` which will be used when targets
+      # are evaluated in the context of the current toolchain.
+      _archs_mapping_os = archs_mapping[toolchain_args.current_os]
+      if (defined(_archs_mapping_os[toolchain_args.current_cpu])) {
+        _archs_mapping_os_cpu = _archs_mapping_os[toolchain_args.current_cpu]
+        _dsym_arch = _archs_mapping_os_cpu.dsym_arch
+      } else {
+        not_needed([ "_archs_mapping_os" ])
+        assert("cpu unsupported ${toolchain_args.current_cpu}")
+      }
+
       dsym_output_dir =
           "{{root_out_dir}}/{{target_output_name}}{{output_extension}}.dSYM"
       dsym_output = [
         "$dsym_output_dir/Contents/Info.plist",
         "$dsym_output_dir/Contents/Resources/DWARF/" +
             "{{target_output_name}}{{output_extension}}",
+        "$dsym_output_dir/Contents/Resources/Relocations/" +
+            "$_dsym_arch/{{target_output_name}}{{output_extension}}.yml",
       ]
     } else {
       dsym_switch = ""
@@ -419,7 +441,7 @@ template("single_apple_toolchain") {
 
       # Module file doesn't need coverage instrumentation because module files
       # represent interfaces rather than implementations.
-      command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} {{module_deps_no_self}} -fmodule-name={{label_name}} -c -x c++ -Xclang -emit-module {{source}} -o {{output}}"
+      command = "$cxx -MD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} {{module_deps_no_self}} -fmodule-name={{label_name}} -c -x c++ -Xclang -emit-module {{source}} -o {{output}}"
       depsformat = "gcc"
       description = "CXX_MODULE {{output}}"
       outputs = [ "$object_subdir/{{source_name_part}}.pcm" ]
diff --git a/naiveproxy/src/build/toolchain/clang_code_coverage_wrapper.py b/naiveproxy/src/build/toolchain/clang_code_coverage_wrapper.py
index 81a15c61c2..9b94bcf55c 100755
--- a/naiveproxy/src/build/toolchain/clang_code_coverage_wrapper.py
+++ b/naiveproxy/src/build/toolchain/clang_code_coverage_wrapper.py
@@ -83,16 +83,15 @@ _DEFAULT_COVERAGE_EXCLUSION_LIST = [
     '../../base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/address_space_randomization_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/allocation_guard.cc',  #pylint: disable=line-too-long
+    '../../base/allocator/partition_allocator/src/partition_alloc/allocator_config.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/compressed_pointer_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/extended_api.cc',  #pylint: disable=line-too-long
-    '../../base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/gwp_asan_support.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/hardening_unittest.cc',  #pylint: disable=line-too-long
+    '../../base/allocator/partition_allocator/src/partition_alloc/in_slot_metadata.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/internal_allocator.cc',  #pylint: disable=line-too-long
-    '../../base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.cc',  #pylint: disable=line-too-long
-    '../../base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/oom_callback.cc',  #pylint: disable=line-too-long
@@ -105,6 +104,8 @@ _DEFAULT_COVERAGE_EXCLUSION_LIST = [
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits_pa_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export_pa_unittest.cc',  #pylint: disable=line-too-long
+    '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_map_pa_unittest.cc',  #pylint: disable=line-too-long
+    '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_tree_pa_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu_pa_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.cc',  #pylint: disable=line-too-long
@@ -138,6 +139,9 @@ _DEFAULT_COVERAGE_EXCLUSION_LIST = [
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_pa_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_posix.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_win.cc',  #pylint: disable=line-too-long
+    '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/algorithm_pa_unittest.cc',  #pylint: disable=line-too-long
+    '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/functional_pa_unittest.cc',  #pylint: disable=line-too-long
+    '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/ranges_pa_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_pa_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_win.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.cc',  #pylint: disable=line-too-long
@@ -148,6 +152,7 @@ _DEFAULT_COVERAGE_EXCLUSION_LIST = [
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf_pa_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util_pa_unittest.cc',  #pylint: disable=line-too-long
+    '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/template_util_pa_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations_pa_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_android_for_testing.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.cc',  #pylint: disable=line-too-long
@@ -168,6 +173,7 @@ _DEFAULT_COVERAGE_EXCLUSION_LIST = [
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_perftest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_bucket.cc',  #pylint: disable=line-too-long
+    '../../base/allocator/partition_allocator/src/partition_alloc/partition_cookie.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/partition_lock_perftest.cc',  #pylint: disable=line-too-long
@@ -181,12 +187,16 @@ _DEFAULT_COVERAGE_EXCLUSION_LIST = [
     '../../base/allocator/partition_allocator/src/partition_alloc/pointers/instance_tracer.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.cc',  #pylint: disable=line-too-long
+    '../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_counting_impl_for_test.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/random.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/reverse_bytes_unittest.cc',  #pylint: disable=line-too-long
+    '../../base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine.cc',  #pylint: disable=line-too-long
+    '../../base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine_support.cc',  #pylint: disable=line-too-long
+    '../../base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine_unittest.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_android.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_apple.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.cc',  #pylint: disable=line-too-long
@@ -211,6 +221,7 @@ _DEFAULT_COVERAGE_EXCLUSION_LIST = [
     '../../base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/arm64/push_registers_asm.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/arm/push_registers_asm.cc',  #pylint: disable=line-too-long
+    '../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/loong64/push_registers_asm.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/riscv64/push_registers_asm.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/x64/push_registers_asm.cc',  #pylint: disable=line-too-long
     '../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/x86/push_registers_asm.cc',  #pylint: disable=line-too-long
diff --git a/naiveproxy/src/build/toolchain/cros/BUILD.gn b/naiveproxy/src/build/toolchain/cros/BUILD.gn
index 0fb7834dab..19cf42f6b8 100644
--- a/naiveproxy/src/build/toolchain/cros/BUILD.gn
+++ b/naiveproxy/src/build/toolchain/cros/BUILD.gn
@@ -4,125 +4,37 @@
 
 import("//build/config/compiler/compiler.gni")
 import("//build/config/sysroot.gni")
-import("//build/toolchain/cros/cros_config.gni")
 import("//build/toolchain/cros_toolchain.gni")
 import("//build/toolchain/gcc_toolchain.gni")
 
-# This is mostly identical to gcc_toolchain, but handles relativizing toolchain
-# paths. This is needed for CrOS since these paths often change based on the
-# environment. For example, cxx is a relative path picked up on $PATH in the
-# chroot. But in Simple Chrome, cxx is a system-absolute path.
-template("cros_toolchain") {
-  if (lacros_use_chromium_toolchain) {
-    clang_toolchain(target_name) {
-      forward_variables_from(invoker, "*")
-    }
-  } else {
-    gcc_toolchain(target_name) {
-      forward_variables_from(invoker, "*")
-
-      toolchain_args.cc_wrapper = ""
-      toolchain_args.clang_use_chrome_plugins = false
-
-      # CrOS's target toolchain wrapper prefers to invoke rewrapper itself, so
-      # pass it the rewrapper path via cmd-line arg. Otherwise, for both CrOS's
-      # host wrapper (used in the ebuild) and Chrome's clang (used in Simple
-      # Chrome), prepend rewrapper like normal.
-      if (use_reclient && invoker.needs_rewrapper_path_arg) {
-        # crbug.com/417677693: if cppflags exist, give them space.
-        if (extra_cppflags != "") {
-          extra_cppflags += " "
-        }
-        extra_cppflags += "--rewrapper-path $reclient_cros_cc_wrapper --rewrapper-cfg ${reclient_cc_cfg_file}"
-      }
-
-      # crbug.com/397463803: Add these so the compiler wrapper doesn't error
-      # out. Should be removable around Q4 2025.
-      extra_asmflags = "-D_CROSTC_IS_AWARE_OF_THIS_USECASE"
-      extra_cppflags += " -D_CROSTC_IS_AWARE_OF_THIS_USECASE"
-      extra_ldflags += " -D_CROSTC_IS_AWARE_OF_THIS_USECASE"
-
-      # Relativize path if compiler is specified such that not to lookup from
-      # $PATH and cc/cxx does not contain additional flags.
-      if (cc != get_path_info(cc, "file") &&
-          string_replace(cc, " ", "") == cc) {
-        cc = rebase_path(cc, root_build_dir)
-      }
-      if (cxx != get_path_info(cxx, "file") &&
-          string_replace(cxx, " ", "") == cxx) {
-        cxx = rebase_path(cxx, root_build_dir)
-      }
-      if (ar != get_path_info(ar, "file") &&
-          string_replace(ar, " ", "") == ar) {
-        ar = rebase_path(ar, root_build_dir)
-      }
-      if (ld != get_path_info(ld, "file") &&
-          string_replace(ld, " ", "") == ld) {
-        ld = rebase_path(ld, root_build_dir)
-      }
-    }
-  }
-}
-
 # This is the normal toolchain for most targets.
-cros_toolchain("target") {
+clang_toolchain("target") {
   toolchain_args = {
     current_cpu = target_cpu
     current_os = "chromeos"
     sysroot = target_sysroot
   }
 
-  if (!lacros_use_chromium_toolchain) {
-    ar = cros_target_ar
-    cc = cros_target_cc
-    cxx = cros_target_cxx
-    ld = cros_target_ld
-
-    if (cros_target_nm != "") {
-      nm = cros_target_nm
-    }
-    if (cros_target_readelf != "") {
-      readelf = cros_target_readelf
-    }
-    extra_cflags = cros_target_extra_cflags
-    extra_cppflags = cros_target_extra_cppflags
-    extra_cxxflags = cros_target_extra_cxxflags
-    extra_ldflags = cros_target_extra_ldflags
-
-    needs_rewrapper_path_arg = cros_needs_rewrapper_path_arg
-  }
+  extra_cflags = cros_target_extra_cflags
+  extra_cppflags = cros_target_extra_cppflags
+  extra_cxxflags = cros_target_extra_cxxflags
+  extra_ldflags = cros_target_extra_ldflags
 }
 
-cros_toolchain("host") {
+clang_toolchain("host") {
   toolchain_args = {
     current_cpu = host_cpu
     current_os = "linux"
     sysroot = cros_host_sysroot
   }
 
-  if (!lacros_use_chromium_toolchain) {
-    # These are args for the template.
-    ar = cros_host_ar
-    cc = cros_host_cc
-    cxx = cros_host_cxx
-    ld = cros_host_ld
-
-    if (cros_host_nm != "") {
-      nm = cros_host_nm
-    }
-    if (cros_host_readelf != "") {
-      readelf = cros_host_readelf
-    }
-    extra_cflags = cros_host_extra_cflags
-    extra_cppflags = cros_host_extra_cppflags
-    extra_cxxflags = cros_host_extra_cxxflags
-    extra_ldflags = cros_host_extra_ldflags
-
-    needs_rewrapper_path_arg = false
-  }
+  extra_cflags = cros_host_extra_cflags
+  extra_cppflags = cros_host_extra_cppflags
+  extra_cxxflags = cros_host_extra_cxxflags
+  extra_ldflags = cros_host_extra_ldflags
 }
 
-cros_toolchain("v8_snapshot") {
+clang_toolchain("v8_snapshot") {
   toolchain_args = {
     if (target_cpu == "x86" || target_cpu == "arm" || target_cpu == "mipsel") {
       current_cpu = "x86"
@@ -134,24 +46,8 @@ cros_toolchain("v8_snapshot") {
     sysroot = cros_v8_snapshot_sysroot
   }
 
-  if (!lacros_use_chromium_toolchain) {
-    # These are args for the template.
-    ar = cros_v8_snapshot_ar
-    cc = cros_v8_snapshot_cc
-    cxx = cros_v8_snapshot_cxx
-    ld = cros_v8_snapshot_ld
-
-    if (cros_v8_snapshot_nm != "") {
-      nm = cros_v8_snapshot_nm
-    }
-    if (cros_v8_snapshot_readelf != "") {
-      readelf = cros_v8_snapshot_readelf
-    }
-    extra_cflags = cros_v8_snapshot_extra_cflags
-    extra_cppflags = cros_v8_snapshot_extra_cppflags
-    extra_cxxflags = cros_v8_snapshot_extra_cxxflags
-    extra_ldflags = cros_v8_snapshot_extra_ldflags
-
-    needs_rewrapper_path_arg = false
-  }
+  extra_cflags = cros_v8_snapshot_extra_cflags
+  extra_cppflags = cros_v8_snapshot_extra_cppflags
+  extra_cxxflags = cros_v8_snapshot_extra_cxxflags
+  extra_ldflags = cros_v8_snapshot_extra_ldflags
 }
diff --git a/naiveproxy/src/build/toolchain/cros/cros_config.gni b/naiveproxy/src/build/toolchain/cros/cros_config.gni
deleted file mode 100644
index d7ae6a9200..0000000000
--- a/naiveproxy/src/build/toolchain/cros/cros_config.gni
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright 2023 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-declare_args() {
-  # If set, build lacros with Chromium's toolchain instead of with Chrome OS's.
-  # TODO(thakis): Set this to `= chromeos_is_browser_only` once that works.
-  lacros_use_chromium_toolchain = false
-
-  # Whether or not the toolchain used to build for ChromeOS needs
-  # --rewrapper-path and --rewrapper-cfg arguments.
-  # TODO(crbug.com/356466829): Remove this once we no longer use
-  # ChromeOS's toolchain.
-  cros_needs_rewrapper_path_arg = true
-}
diff --git a/naiveproxy/src/build/toolchain/cros/get_resource_dir.py b/naiveproxy/src/build/toolchain/cros/get_resource_dir.py
deleted file mode 100755
index ba74aa1a1e..0000000000
--- a/naiveproxy/src/build/toolchain/cros/get_resource_dir.py
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env python3
-# Copyright 2025 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Script to get Clang's resource dir from `cros_target_cc`."""
-
-import argparse
-import os
-import subprocess
-import sys
-from typing import List
-
-
-def main(argv: List[str]) -> None:
-  parser = argparse.ArgumentParser(
-      description=__doc__,
-      formatter_class=argparse.RawDescriptionHelpFormatter,
-  )
-  parser.add_argument("cros_target_cc", help="The value of 'cros_target_cc'.")
-  opts = parser.parse_args(argv)
-
-  # crbug.com/397463803: Add these so the compiler wrapper doesn't error
-  # out. Should be removable around Q4 2025.
-  os.environ["CROSTC_IS_AWARE_OF_THIS_USECASE"] = "1"
-  sys.exit(
-      subprocess.run(
-          (opts.cros_target_cc, "--print-resource-dir"),
-          check=False,
-      ).returncode)
-
-
-if __name__ == "__main__":
-  main(sys.argv[1:])
diff --git a/naiveproxy/src/build/toolchain/cros_toolchain.gni b/naiveproxy/src/build/toolchain/cros_toolchain.gni
index f5a962de90..a41bc1a67d 100644
--- a/naiveproxy/src/build/toolchain/cros_toolchain.gni
+++ b/naiveproxy/src/build/toolchain/cros_toolchain.gni
@@ -35,13 +35,6 @@ import("//build/config/clang/clang.gni")
 import("//build/config/compiler/compiler.gni")
 
 declare_args() {
-  # These must be specified for a board-specific build.
-  cros_target_ar = "${clang_base_path}/bin/llvm-ar"
-  cros_target_cc = "${clang_base_path}/bin/clang"
-  cros_target_cxx = "${clang_base_path}/bin/clang++"
-  cros_target_nm = ""
-  cros_target_readelf = ""
-
   # These can be optionally set. The "_cppflags"  will be applied to *both*
   # C and C++ files; use "_cxxflags" for C++-only flags.
   cros_target_extra_cflags = ""
@@ -49,30 +42,38 @@ declare_args() {
   cros_target_extra_cxxflags = ""
   cros_target_extra_ldflags = ""
 
-  cros_host_ar = "${clang_base_path}/bin/llvm-ar"
-  cros_host_cc = "${clang_base_path}/bin/clang"
-  cros_host_cxx = "${clang_base_path}/bin/clang++"
-  cros_host_nm = ""
-  cros_host_readelf = ""
   cros_host_extra_cflags = ""
   cros_host_extra_cppflags = ""
   cros_host_extra_cxxflags = ""
   cros_host_extra_ldflags = ""
   cros_host_sysroot = ""
 
-  cros_v8_snapshot_ar = "${clang_base_path}/bin/llvm-ar"
-  cros_v8_snapshot_cc = "${clang_base_path}/bin/clang"
-  cros_v8_snapshot_cxx = "${clang_base_path}/bin/clang++"
-  cros_v8_snapshot_nm = ""
-  cros_v8_snapshot_readelf = ""
   cros_v8_snapshot_extra_cflags = ""
   cros_v8_snapshot_extra_cppflags = ""
   cros_v8_snapshot_extra_cxxflags = ""
   cros_v8_snapshot_extra_ldflags = ""
   cros_v8_snapshot_sysroot = ""
+
+  # The following are ignored and should no longer be set.
+  cros_target_ar = "${clang_base_path}/bin/llvm-ar"
+  cros_target_cc = "${clang_base_path}/bin/clang"
+  cros_target_cxx = "${clang_base_path}/bin/clang++"
+  cros_target_nm = ""
+  cros_target_readelf = ""
+  cros_host_ar = "${clang_base_path}/bin/llvm-ar"
+  cros_host_cc = "${clang_base_path}/bin/clang"
+  cros_host_cxx = "${clang_base_path}/bin/clang++"
+  cros_host_nm = ""
+  cros_host_readelf = ""
+  cros_v8_snapshot_ar = "${clang_base_path}/bin/llvm-ar"
+  cros_v8_snapshot_cc = "${clang_base_path}/bin/clang"
+  cros_v8_snapshot_cxx = "${clang_base_path}/bin/clang++"
+  cros_v8_snapshot_nm = ""
+  cros_v8_snapshot_readelf = ""
 }
 
 declare_args() {
+  # The following are ignored and should no longer be set.
   cros_target_ld = cros_target_cxx
   cros_host_ld = cros_host_cxx
   cros_v8_snapshot_ld = cros_v8_snapshot_cxx
diff --git a/naiveproxy/src/build/toolchain/gcc_toolchain.gni b/naiveproxy/src/build/toolchain/gcc_toolchain.gni
index 7d670b1315..6ebe01730c 100644
--- a/naiveproxy/src/build/toolchain/gcc_toolchain.gni
+++ b/naiveproxy/src/build/toolchain/gcc_toolchain.gni
@@ -5,6 +5,7 @@
 import("//build/config/clang/clang.gni")
 import("//build/config/compiler/compiler.gni")
 import("//build/config/coverage/coverage.gni")
+import("//build/config/cronet/config.gni")
 import("//build/config/rust.gni")
 import("//build/config/sanitizers/sanitizers.gni")
 import("//build/config/sysroot.gni")
@@ -20,7 +21,10 @@ declare_args() {
   enable_resource_allowlist_generation =
       is_official_build &&
       # Don't enable for Android-on-Chrome OS.
-      (target_os == "android" || target_os == "win")
+      (target_os == "android" || target_os == "win") &&
+      # TODO(https://crbug.com/445896263): Consider whether Cronet should enable
+      # this.
+      !is_cronet_build
 
   # Use -MD instead of -MMD for compiler commands. This is useful for tracking
   # the comprehensive set of dependencies.  It's also required when building
@@ -91,10 +95,6 @@ if (enable_resource_allowlist_generation) {
 #      for an executable, rather than using no extension; targets will
 #      still be able to override the extension using the output_extension
 #      variable.
-#  - rebuild_define
-#      The contents of this string, if specified, will be passed as a #define
-#      to the toolchain. It can be used to force recompiles whenever a
-#      toolchain is updated.
 #  - shlib_extension
 #      If this string is specified it will be used for the file extension
 #      for a shared library, rather than default value specified in
@@ -114,14 +114,6 @@ template("single_gcc_toolchain") {
     assert(defined(invoker.cxx), "gcc_toolchain() must specify a \"cxx\" value")
     assert(defined(invoker.ld), "gcc_toolchain() must specify a \"ld\" value")
 
-    # This define changes when the toolchain changes, forcing a rebuild.
-    # Nothing should ever use this define.
-    if (defined(invoker.rebuild_define)) {
-      rebuild_string = "-D" + invoker.rebuild_define + " "
-    } else {
-      rebuild_string = ""
-    }
-
     # GN's syntax can't handle more than one scope dereference at once, like
     # "invoker.toolchain_args.foo", so make a temporary to hold the toolchain
     # args so we can do "invoker_toolchain_args.foo".
@@ -338,7 +330,7 @@ template("single_gcc_toolchain") {
     tool("cc") {
       depfile = "{{output}}.d"
       precompiled_header_type = "gcc"
-      command = "$coverage_wrapper$cc $md -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cppflags}${extra_cflags} -c {{source}} -o {{output}}"
+      command = "$coverage_wrapper$cc $md -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cppflags}${extra_cflags} -c {{source}} -o {{output}}"
       depsformat = "gcc"
       description = "CC {{output}}"
       outputs = [ "$object_subdir/{{source_name_part}}.o" ]
@@ -347,7 +339,7 @@ template("single_gcc_toolchain") {
     tool("cxx") {
       depfile = "{{output}}.d"
       precompiled_header_type = "gcc"
-      command = "$coverage_wrapper$cxx $md -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cppflags}${extra_cxxflags} {{module_deps_no_self}} -c {{source}} -o {{output}}"
+      command = "$coverage_wrapper$cxx $md -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cppflags}${extra_cxxflags} {{module_deps_no_self}} -c {{source}} -o {{output}}"
       depsformat = "gcc"
       description = "CXX {{output}}"
       outputs = [ "$object_subdir/{{source_name_part}}.o" ]
@@ -358,7 +350,7 @@ template("single_gcc_toolchain") {
 
       # Module file doesn't need coverage instrumentation because module files
       # represent interfaces rather than implementations.
-      command = "$cxx $md -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cppflags}${extra_cxxflags} {{module_deps_no_self}} -fmodule-name={{label_name}} -c -x c++ -Xclang -emit-module {{source}} -o {{output}}"
+      command = "$cxx -MD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cppflags}${extra_cxxflags} {{module_deps_no_self}} -fmodule-name={{label_name}} -x c++ -Xclang -emit-module -c {{source}} -o {{output}}"
       depsformat = "gcc"
       description = "CXX_MODULE {{output}}"
       outputs = [ "$object_subdir/{{source_name_part}}.pcm" ]
@@ -367,7 +359,7 @@ template("single_gcc_toolchain") {
     tool("asm") {
       # For GCC we can just use the C compiler to compile assembly.
       depfile = "{{output}}.d"
-      command = "$asm $md -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{asmflags}}${extra_asmflags} -c {{source}} -o {{output}}"
+      command = "$asm $md -MF $depfile {{defines}} {{include_dirs}} {{asmflags}}${extra_asmflags} -c {{source}} -o {{output}}"
       depsformat = "gcc"
       description = "ASM {{output}}"
       outputs = [ "$object_subdir/{{source_name_part}}.o" ]
diff --git a/naiveproxy/src/build/toolchain/ios/BUILD.gn b/naiveproxy/src/build/toolchain/ios/BUILD.gn
index a1329faf2f..6a4ad03a13 100644
--- a/naiveproxy/src/build/toolchain/ios/BUILD.gn
+++ b/naiveproxy/src/build/toolchain/ios/BUILD.gn
@@ -5,9 +5,9 @@
 import("//build/config/ios/ios_sdk.gni")
 import("//build/toolchain/apple/toolchain.gni")
 
-# Specialisation of the apple_toolchain template to declare the toolchain
+# Specialisation of the apple_toolchain template to declare a single toolchain
 # and its tools to build target for iOS platform.
-template("ios_toolchain") {
+template("ios_single_toolchain") {
   assert(defined(invoker.toolchain_args),
          "Toolchains must declare toolchain_args")
 
@@ -23,146 +23,59 @@ template("ios_toolchain") {
       forward_variables_from(invoker.toolchain_args, "*")
       xcode_build = xcode_build
       current_os = "ios"
-    }
-  }
-}
 
-# Specialisation of the ios_toolchain template to declare the toolchain
-# and its tools to build application extension for iOS platform.
-template("ios_app_ext_toolchain") {
-  assert(defined(invoker.toolchain_args),
-         "Toolchains must declare toolchain_args")
+      # TODO(crbug.com/408032145): Add ptrauth support to lld, remove this.
+      if (current_cpu == "arm64e") {
+        use_lld = false
+      }
 
-  ios_toolchain(target_name) {
-    forward_variables_from(invoker, "*", [ "toolchain_args" ])
-
-    toolchain_args = {
-      forward_variables_from(invoker.toolchain_args, "*")
-
-      ios_is_app_extension = true
-
-      # Those variables are defined outside of //build and thus only exists
-      # when used as part of Chromium. Use build_with_chromium to check if
-      # they can be overridden safely. This prevents breaking third-party
-      # projects such as WebRTC that only uses //build but not //base.
-      if (build_with_chromium) {
-        use_partition_alloc = false
-        ios_partition_alloc_enabled = false
+      # Disable partition alloc for app extensions except for blink.
+      if (ios_is_app_extension && !use_blink) {
+        # As use_partition_alloc is defined outside of //build, check that
+        # the build is part of chromium before overriding the variable.
+        if (build_with_chromium) {
+          use_partition_alloc = false
+        }
       }
     }
   }
 }
 
-# Specialisation of the ios_toolchain template to declare the toolchain
-# and its tools to build application extension for iOS platform.
-template("ios_blink_app_ext_toolchain") {
+# Template to declare all the toolchains for a given architecture for iOS.
+template("ios_all_toolchains") {
   assert(defined(invoker.toolchain_args),
          "Toolchains must declare toolchain_args")
 
-  ios_toolchain(target_name) {
+  ios_single_toolchain(target_name) {
     forward_variables_from(invoker, "*", [ "toolchain_args" ])
-
     toolchain_args = {
       forward_variables_from(invoker.toolchain_args, "*")
+    }
+  }
 
+  ios_single_toolchain(target_name + "_app_ext") {
+    forward_variables_from(invoker, "*", [ "toolchain_args" ])
+    toolchain_args = {
+      forward_variables_from(invoker.toolchain_args, "*")
       ios_is_app_extension = true
     }
   }
 }
 
-ios_toolchain("ios_clang_arm64") {
+ios_all_toolchains("ios_clang_arm64") {
   toolchain_args = {
     current_cpu = "arm64"
   }
 }
 
-ios_toolchain("ios_clang_arm64e") {
+ios_all_toolchains("ios_clang_arm64e") {
   toolchain_args = {
     current_cpu = "arm64e"
-
-    # TODO(crbug.com/408032145): Add ptrauth support to lld, remove this.
-    use_lld = false
   }
 }
 
-ios_toolchain("ios_clang_arm64_16_0") {
-  toolchain_args = {
-    current_cpu = "arm64"
-    ios_deployment_target = "16.0"
-  }
-}
-
-ios_toolchain("ios_clang_arm64e_16_0") {
-  toolchain_args = {
-    current_cpu = "arm64e"
-    ios_deployment_target = "16.0"
-
-    # TODO(crbug.com/408032145): Add ptrauth support to lld, remove this.
-    use_lld = false
-  }
-}
-
-ios_toolchain("ios_clang_x64") {
+ios_all_toolchains("ios_clang_x64") {
   toolchain_args = {
     current_cpu = "x64"
   }
 }
-
-ios_toolchain("ios_clang_x64_16_0") {
-  toolchain_args = {
-    current_cpu = "x64"
-    ios_deployment_target = "16.0"
-  }
-}
-
-ios_app_ext_toolchain("ios_clang_arm64_app_ext") {
-  toolchain_args = {
-    current_cpu = "arm64"
-  }
-}
-
-ios_app_ext_toolchain("ios_clang_arm64e_app_ext") {
-  toolchain_args = {
-    current_cpu = "arm64e"
-
-    # TODO(crbug.com/408032145): Add ptrauth support to lld, remove this.
-    use_lld = false
-  }
-}
-
-ios_blink_app_ext_toolchain("ios_clang_arm64_blink_app_ext") {
-  toolchain_args = {
-    current_cpu = "arm64"
-    use_blink = true
-  }
-}
-
-ios_blink_app_ext_toolchain("ios_clang_arm64e_blink_app_ext") {
-  toolchain_args = {
-    current_cpu = "arm64e"
-    use_blink = true
-
-    # TODO(crbug.com/408032145): Add ptrauth support to lld, remove this.
-    use_lld = false
-  }
-}
-
-ios_blink_app_ext_toolchain("ios_clang_x64_blink_app_ext") {
-  toolchain_args = {
-    current_cpu = "x64"
-    use_blink = true
-  }
-}
-
-ios_app_ext_toolchain("ios_clang_x64_app_ext") {
-  toolchain_args = {
-    current_cpu = "x64"
-  }
-}
-
-ios_toolchain("ios_clang_arm64_blink") {
-  toolchain_args = {
-    current_cpu = "arm64"
-    use_blink = true
-  }
-}
diff --git a/naiveproxy/src/build/toolchain/mac/BUILD.gn b/naiveproxy/src/build/toolchain/mac/BUILD.gn
index d8543c4f2e..0063a0f337 100644
--- a/naiveproxy/src/build/toolchain/mac/BUILD.gn
+++ b/naiveproxy/src/build/toolchain/mac/BUILD.gn
@@ -52,12 +52,6 @@ template("mac_toolchain") {
   }
 }
 
-mac_toolchain("clang_arm") {
-  toolchain_args = {
-    current_cpu = "arm"
-  }
-}
-
 mac_toolchain("clang_arm64") {
   toolchain_args = {
     current_cpu = "arm64"
@@ -70,26 +64,6 @@ mac_toolchain("clang_x64") {
   }
 }
 
-mac_toolchain("clang_x86") {
-  toolchain_args = {
-    current_cpu = "x86"
-  }
-}
-
-mac_toolchain("clang_x86_v8_arm") {
-  toolchain_args = {
-    current_cpu = "x86"
-    v8_current_cpu = "arm"
-  }
-}
-
-mac_toolchain("clang_x86_v8_mipsel") {
-  toolchain_args = {
-    current_cpu = "x86"
-    v8_current_cpu = "mipsel"
-  }
-}
-
 mac_toolchain("clang_x64_v8_arm64") {
   toolchain_args = {
     current_cpu = "x64"
diff --git a/naiveproxy/src/build/toolchain/rbe.gni b/naiveproxy/src/build/toolchain/rbe.gni
index a2366ef264..46cd247e43 100644
--- a/naiveproxy/src/build/toolchain/rbe.gni
+++ b/naiveproxy/src/build/toolchain/rbe.gni
@@ -126,7 +126,6 @@ declare_args() {
   }
 
   if (use_reclient) {
-    # TODO: crbug.com/342270134 - Rename reclient_cros_cc_wrapper to reclient_cros_cc_wrapper.
     # Note that reclient_cros_cc_wrapper is referenced by CrOS's chromite.
     # Set to the path of the RBE recleint wrapper for ChromeOS.
     if (rbe_cros_cc_wrapper != "") {
@@ -143,6 +142,16 @@ declare_args() {
   }
 }
 
+if (use_reclient) {
+  rewrapper_path = "${reclient_bin_dir}/rewrapper"
+  if (is_win) {
+    rewrapper_path = "${reclient_bin_dir}/rewrapper.exe"
+  }
+  assert(path_exists(rewrapper_path),
+         "use_reclient=true requires reclient binary. " +
+             "need '\"download_reclient\": True' in .gclient custom_vars.")
+}
+
 if (use_reclient_cfgs && current_toolchain == default_toolchain) {
   # Check existence of reclient configs and show user friendly error message if
   # it doesn't.
diff --git a/naiveproxy/src/build/toolchain/toolchain.gni b/naiveproxy/src/build/toolchain/toolchain.gni
index ed381d00db..9211d8c5a6 100644
--- a/naiveproxy/src/build/toolchain/toolchain.gni
+++ b/naiveproxy/src/build/toolchain/toolchain.gni
@@ -13,11 +13,10 @@ declare_args() {
   # `gclient runhooks` is run as well.
   llvm_force_head_revision = false
 
-  # Cronet is shipped in AOSP, where it is built using the Android Mainline
-  # Clang. Please refer to go/cronet-builders-with-mainline-clang-design for
-  # more information.
-  # If this arg is set to true, we use the Android Mainline LLVM.
-  llvm_android_mainline = false
+  # Equivalent to llvm_force_head_revision, but for rust. When true, we expect
+  # to find a locally-build version of rust rather than the version specified
+  # in //tools/clang/scripts/update.py.
+  rust_force_head_revision = false
 
   # Used for binary size analysis.
   generate_linker_map = is_android && is_official_build
@@ -33,14 +32,7 @@ declare_args() {
 }
 
 declare_args() {
-  if (llvm_android_mainline) {  # https://crbug.com/1481060
-    clang_version = "17"
-  } else if (llvm_force_head_revision) {
-    clang_version = "22"
-  } else {
-    # TODO(crbug.com/432036065): Remove in the next Clang roll.
-    clang_version = "21"
-  }
+  clang_version = "22"
 }
 
 # Extension for shared library files (including leading dot).
diff --git a/naiveproxy/src/build/toolchain/wasm/BUILD.gn b/naiveproxy/src/build/toolchain/wasm/BUILD.gn
index 4b4d65c8c2..5bdcacafe1 100644
--- a/naiveproxy/src/build/toolchain/wasm/BUILD.gn
+++ b/naiveproxy/src/build/toolchain/wasm/BUILD.gn
@@ -19,9 +19,9 @@ gcc_toolchain("wasm") {
     _suffix = ".bat"
   }
 
-  cc = rebase_path("$emscripten_path/emcc$_suffix", root_build_dir)
-  cxx = rebase_path("$emscripten_path/em++$_suffix", root_build_dir)
-  ar = rebase_path("$emscripten_path/emar$_suffix", root_build_dir)
+  cc = rebase_path("$emscripten_path/emcc$_suffix")
+  cxx = rebase_path("$emscripten_path/em++$_suffix")
+  ar = rebase_path("$emscripten_path/emar$_suffix")
   nm = cc
   ld = cxx
 
diff --git a/naiveproxy/src/build/toolchain/win/setup_toolchain.py b/naiveproxy/src/build/toolchain/win/setup_toolchain.py
index d6598893c0..e0b7c03a52 100644
--- a/naiveproxy/src/build/toolchain/win/setup_toolchain.py
+++ b/naiveproxy/src/build/toolchain/win/setup_toolchain.py
@@ -10,7 +10,6 @@
 # win tool. The script assumes that the root build directory is the current dir
 # and the files will be written to the current directory.
 
-
 import errno
 import json
 import os
@@ -23,6 +22,8 @@ import gn_helpers
 
 SCRIPT_DIR = os.path.dirname(__file__)
 SDK_VERSION = '10.0.26100.0'
+MSVC_DIR = re.compile('^.*/VC/Tools/MSVC/[^/]+/include$')
+WINDOWS_KITS_DIR = re.compile(r'^(.*/Windows Kits/\d+/Include/[^/]+)/.*')
 
 
 def _ExtractImportantEnvironment(output_of_set):
@@ -92,8 +93,10 @@ def _LoadEnvFromBat(args):
   """Given a bat command, runs it and returns env vars set by it."""
   args = args[:]
   args.extend(('&&', 'set'))
-  popen = subprocess.Popen(
-      args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+  popen = subprocess.Popen(args,
+                           shell=True,
+                           stdout=subprocess.PIPE,
+                           stderr=subprocess.STDOUT)
   variables, _ = popen.communicate()
   if popen.returncode != 0:
     raise Exception('"%s" failed with error %d' % (args, popen.returncode))
@@ -147,9 +150,8 @@ def _LoadToolchainEnv(cpu, toolchain_root, sdk_dir, target_store):
     if 'GYP_MSVS_OVERRIDE_PATH' not in os.environ:
       os.environ['GYP_MSVS_OVERRIDE_PATH'] = _DetectVisualStudioPath()
     # We only support x64-hosted tools.
-    script_path = os.path.normpath(os.path.join(
-                                       os.environ['GYP_MSVS_OVERRIDE_PATH'],
-                                       'VC/vcvarsall.bat'))
+    script_path = os.path.normpath(
+        os.path.join(os.environ['GYP_MSVS_OVERRIDE_PATH'], 'VC/vcvarsall.bat'))
     if not os.path.exists(script_path):
       # vcvarsall.bat for VS 2017 fails if run after running vcvarsall.bat from
       # VS 2013 or VS 2015. Fix this by clearing the vsinstalldir environment
@@ -166,9 +168,9 @@ def _LoadToolchainEnv(cpu, toolchain_root, sdk_dir, target_store):
           del os.environ['LIB']
         if 'LIBPATH' in os.environ:
           del os.environ['LIBPATH']
-      other_path = os.path.normpath(os.path.join(
-                                        os.environ['GYP_MSVS_OVERRIDE_PATH'],
-                                        'VC/Auxiliary/Build/vcvarsall.bat'))
+      other_path = os.path.normpath(
+          os.path.join(os.environ['GYP_MSVS_OVERRIDE_PATH'],
+                       'VC/Auxiliary/Build/vcvarsall.bat'))
       if not os.path.exists(other_path):
         raise Exception('%s is missing - make sure VC++ tools are installed.' %
                         script_path)
@@ -177,7 +179,10 @@ def _LoadToolchainEnv(cpu, toolchain_root, sdk_dir, target_store):
     if (cpu != 'x64'):
       # x64 is default target CPU thus any other CPU requires a target set
       cpu_arg += '_' + cpu
-    args = [script_path, cpu_arg, ]
+    args = [
+        script_path,
+        cpu_arg,
+    ]
     # Store target must come before any SDK version declaration
     if (target_store):
       args.append('store')
@@ -254,6 +259,8 @@ def main():
   vc_bin_dir = ''
   include = ''
   lib = ''
+  windows_kits_dir = ''
+  msvc_dir = ''
 
   def relflag(s):  # Make s relative to builddir when cwd and sdk on same drive.
     try:
@@ -280,6 +287,14 @@ def main():
       lib = [p.replace('"', r'\"') for p in env['LIB'].split(';') if p]
       lib = list(map(relflag, lib))
 
+      for i in include:
+        msvc_match = MSVC_DIR.match(i)
+        if msvc_match is not None:
+          msvc_dir = msvc_match.group(0)
+        windows_kits_match = WINDOWS_KITS_DIR.match(i)
+        if windows_kits_match is not None:
+          windows_kits_dir = windows_kits_match.group(1)
+
       include_I = ['/I' + i for i in include]
       include_imsvc = ['-imsvc' + i for i in include]
       libpath_flags = ['-libpath:' + i for i in lib]
@@ -319,6 +334,9 @@ def main():
     print(f'libpath_lldlink_flags = {ListToArgString(libpath_flags)}')
     print(f'libpath_lldlink_flags_list = {ListToArgList(libpath_flags)}')
 
+  print(f'msvc_dir = {gn_helpers.ToGNString(msvc_dir)}')
+  print(f'windows_kits_dir = {gn_helpers.ToGNString(windows_kits_dir)}')
+
 
 if __name__ == '__main__':
   main()
diff --git a/naiveproxy/src/build/util/BUILD.gn b/naiveproxy/src/build/util/BUILD.gn
index b5fd3bbf3d..ea1188ed0c 100644
--- a/naiveproxy/src/build/util/BUILD.gn
+++ b/naiveproxy/src/build/util/BUILD.gn
@@ -18,7 +18,11 @@ action("chromium_git_revision") {
   output_file = "$target_gen_dir/chromium_git_revision.h"
   outputs = [ output_file ]
 
-  args = [
+  args = []
+  if (is_official_build) {
+    args += [ "--official" ]
+  }
+  args += [
     # LASTCHANGE contains "-".  The user agent only wants the
     # "" bit, so chop off everything after it.
     "-e",
diff --git a/naiveproxy/src/build/util/LASTCHANGE b/naiveproxy/src/build/util/LASTCHANGE
index 803b2103a0..8d4ea30c3a 100644
--- a/naiveproxy/src/build/util/LASTCHANGE
+++ b/naiveproxy/src/build/util/LASTCHANGE
@@ -1,2 +1,2 @@
-LASTCHANGE=202bdc7b1c78777deb8fb5046c1d686b9cc3a01f-refs/branch-heads/7339@{#1839}
+LASTCHANGE=71a0dbd6672e2ccb6d1008376cbb7acd315cb8d6-refs/branch-heads/7499@{#3142}
 LASTCHANGE_YEAR=2025
diff --git a/naiveproxy/src/build/util/LASTCHANGE.committime b/naiveproxy/src/build/util/LASTCHANGE.committime
index d5336b8618..c6dec1ea97 100644
--- a/naiveproxy/src/build/util/LASTCHANGE.committime
+++ b/naiveproxy/src/build/util/LASTCHANGE.committime
@@ -1 +1 @@
-1757361266
\ No newline at end of file
+1765226133
\ No newline at end of file
diff --git a/naiveproxy/src/build/util/android_chrome_version.py b/naiveproxy/src/build/util/android_chrome_version.py
index 6b3888857f..6f04eee8e4 100755
--- a/naiveproxy/src/build/util/android_chrome_version.py
+++ b/naiveproxy/src/build/util/android_chrome_version.py
@@ -57,6 +57,7 @@ _PACKAGE_NAMES = {
     'TRICHROME_BETA': 40,
     'TRICHROME_AUTO': 50,
     'TRICHROME_DESKTOP': 60,
+    'CHROME_DESKTOP': 70,
     'WEBVIEW_STABLE': 0,
     'WEBVIEW_BETA': 10,
     'WEBVIEW_DEV': 20,
@@ -93,6 +94,7 @@ _APKS = {
         ('WEBVIEW_STABLE', 'WEBVIEW_STABLE', '32'),
         ('WEBVIEW_BETA', 'WEBVIEW_BETA', '32'),
         ('WEBVIEW_DEV', 'WEBVIEW_DEV', '32'),
+        ('WEBVIEW_AUTO', 'WEBVIEW_AUTO', '32'),
     ],
     '64': [
         ('CHROME', 'CHROME', '64'),
@@ -136,6 +138,7 @@ _APKS = {
         ('TRICHROME_64_32_HIGH_BETA', 'TRICHROME_BETA', '64_32_high'),
         ('TRICHROME_DESKTOP_64', 'TRICHROME_DESKTOP', '64'),
         ('TRICHROME_64_BETA', 'TRICHROME_BETA', '64'),
+        ('CHROME_DESKTOP', 'CHROME_DESKTOP', '64'),
         ('WEBVIEW_STABLE', 'WEBVIEW_STABLE', '32_64'),
         ('WEBVIEW_32_STABLE', 'WEBVIEW_STABLE', '32'),
         ('WEBVIEW_32_64_STABLE', 'WEBVIEW_STABLE', '32_64'),
@@ -144,6 +147,7 @@ _APKS = {
         ('WEBVIEW_64_32_HIGH_STABLE', 'WEBVIEW_STABLE', '64_32_high'),
         ('WEBVIEW_BETA', 'WEBVIEW_BETA', '32_64'),
         ('WEBVIEW_32_BETA', 'WEBVIEW_BETA', '32'),
+        ('WEBVIEW_32_64_BETA', 'WEBVIEW_BETA', '32_64'),
         ('WEBVIEW_64_BETA', 'WEBVIEW_BETA', '64'),
         ('WEBVIEW_64_32_BETA', 'WEBVIEW_BETA', '64_32'),
         ('WEBVIEW_64_32_HIGH_BETA', 'WEBVIEW_BETA', '64_32_high'),
@@ -151,6 +155,9 @@ _APKS = {
         ('WEBVIEW_32_DEV', 'WEBVIEW_DEV', '32'),
         ('WEBVIEW_64_DEV', 'WEBVIEW_DEV', '64'),
         ('WEBVIEW_64_32_DEV', 'WEBVIEW_DEV', '64_32'),
+        ('WEBVIEW_AUTO', 'WEBVIEW_AUTO', '32_64'),
+        ('WEBVIEW_AUTO_32', 'WEBVIEW_AUTO', '32'),
+        ('WEBVIEW_AUTO_32_64', 'WEBVIEW_AUTO', '32_64'),
         ('WEBVIEW_AUTO_64', 'WEBVIEW_AUTO', '64'),
         ('WEBVIEW_AUTO_64_32', 'WEBVIEW_AUTO', '64_32'),
         ('WEBVIEW_AUTO_64_32_HIGH', 'WEBVIEW_AUTO', '64_32_high'),
@@ -314,11 +321,15 @@ def TranslateVersionCode(version_code, is_webview=False):
     is_next_build = True
     package_digit -= 5
 
+  package_name = None
   for package, number in _PACKAGE_NAMES.items():
     if number == package_digit * 10:
       if is_webview == ('WEBVIEW' in package):
         package_name = package
         break
+  if not package_name:
+    raise Error(f'Unable to match package with package_digit={package_digit} '
+                f'and is_webview={is_webview}')
 
   for arch, bitness_to_number in (_GetAbisToDigitMask(build_number,
                                                       patch_number).items()):
diff --git a/naiveproxy/src/build/util/android_chrome_version_test.py b/naiveproxy/src/build/util/android_chrome_version_test.py
index 5d7344d558..7509e1aa2b 100644
--- a/naiveproxy/src/build/util/android_chrome_version_test.py
+++ b/naiveproxy/src/build/util/android_chrome_version_test.py
@@ -157,6 +157,8 @@ class _VersionTest(unittest.TestCase):
         'TRICHROME_AUTO_64_32_VERSION_CODE']
     arch_trichrome_desktop_64_version_code = output[
         'TRICHROME_DESKTOP_64_VERSION_CODE']
+    arch_chrome_desktop_version_code = output[
+        'CHROME_DESKTOP_VERSION_CODE']
 
     self.assertEqual(arch_monochrome_32_version_code, '484400020')
     self.assertEqual(arch_monochrome_32_64_version_code, '484400023')
@@ -175,6 +177,7 @@ class _VersionTest(unittest.TestCase):
     self.assertEqual(arch_trichrome_auto_64_version_code, '484400055')
     self.assertEqual(arch_trichrome_auto_64_32_version_code, '484400054')
     self.assertEqual(arch_trichrome_desktop_64_version_code, '484400065')
+    self.assertEqual(arch_chrome_desktop_version_code, '484400075')
 
   def testGenerateVersionCodesAndroidArchX64(self):
     """Assert it handles different architectures correctly.
@@ -217,6 +220,8 @@ class _VersionTest(unittest.TestCase):
         'TRICHROME_AUTO_64_32_VERSION_CODE']
     arch_trichrome_desktop_64_version_code = output[
         'TRICHROME_DESKTOP_64_VERSION_CODE']
+    arch_chrome_desktop_version_code = output[
+        'CHROME_DESKTOP_VERSION_CODE']
 
     self.assertEqual(arch_monochrome_32_version_code, '484400021')
     self.assertEqual(arch_monochrome_32_64_version_code, '484400026')
@@ -234,6 +239,7 @@ class _VersionTest(unittest.TestCase):
     self.assertEqual(arch_trichrome_auto_64_version_code, '484400058')
     self.assertEqual(arch_trichrome_auto_64_32_version_code, '484400057')
     self.assertEqual(arch_trichrome_desktop_64_version_code, '484400068')
+    self.assertEqual(arch_chrome_desktop_version_code, '484400078')
 
   def testGenerateVersionCodesAndroidArchOrderArm(self):
     """Assert it handles different architectures correctly.
diff --git a/naiveproxy/src/build/vs_toolchain.py b/naiveproxy/src/build/vs_toolchain.py
index 61b3229502..d909f5b36f 100755
--- a/naiveproxy/src/build/vs_toolchain.py
+++ b/naiveproxy/src/build/vs_toolchain.py
@@ -17,7 +17,7 @@ import sys
 
 from gn_helpers import ToGNString
 
-# VS 2022 17.13.4 with 10.0.26100.3323 SDK with ARM64 libraries and UWP support.
+# VS 2022 17.13.4 with 10.0.26100.4654 SDK with ARM64 libraries and UWP support.
 # See go/win-toolchain-reference for instructions about how to update the
 # toolchain.
 #
@@ -59,7 +59,7 @@ from gn_helpers import ToGNString
 # * docs/windows_build_instructions.md
 #   Make sure any version numbers in the documentation match the code.
 #
-TOOLCHAIN_HASH = '68a20d6dee'
+TOOLCHAIN_HASH = 'e4305f407e'
 SDK_VERSION = '10.0.26100.0'
 
 # Visual Studio versions are listed in descending order of priority.
@@ -304,7 +304,7 @@ def _SortByHighestVersionNumberFirst(list_of_str_versions):
   list_of_str_versions.sort(key=to_number_sequence, reverse=True)
 
 
-def _CopyUCRTRuntime(target_dir, source_dir, target_cpu, suffix):
+def _CopyUCRTRuntime(target_dir, source_dir, target_cpu, debug):
   """Copy both the msvcp and vccorlib runtime DLLs, only if the target doesn't
   exist, but the target directory does exist."""
   if target_cpu == 'arm64':
@@ -312,7 +312,7 @@ def _CopyUCRTRuntime(target_dir, source_dir, target_cpu, suffix):
     # {x.y.z}/[debug_nonredist/]arm64/Microsoft.VC14x.CRT/.
     # Select VC toolset directory based on Visual Studio version
     vc_redist_root = FindVCRedistRoot()
-    if suffix.startswith('.'):
+    if not debug:
       vc_toolset_dir = 'Microsoft.{}.CRT' \
          .format(MSVC_TOOLSET_VERSION[GetVisualStudioVersion()])
       source_dir = os.path.join(vc_redist_root,
@@ -322,17 +322,25 @@ def _CopyUCRTRuntime(target_dir, source_dir, target_cpu, suffix):
          .format(MSVC_TOOLSET_VERSION[GetVisualStudioVersion()])
       source_dir = os.path.join(vc_redist_root, 'debug_nonredist',
                                 'arm64', vc_toolset_dir)
-  file_parts = ('msvcp140', 'vccorlib140', 'vcruntime140')
+
+  # The filepaths may have an additional 'd' depending on whether we are in
+  # debug mode.
+  def d(s):
+    return s + 'd' if debug else s
+
+  file_parts = (d('msvcp140'), d('msvcp140') + '_atomic_wait', d('vccorlib140'),
+                d('vcruntime140'))
   if target_cpu == 'x64' and GetVisualStudioVersion() != '2017':
-    file_parts = file_parts + ('vcruntime140_1', )
+    file_parts = file_parts + (d('vcruntime140_1'), )
   for file_part in file_parts:
-    dll = file_part + suffix
+    dll = file_part + '.dll'
     target = os.path.join(target_dir, dll)
     source = os.path.join(source_dir, dll)
     _CopyRuntimeImpl(target, source)
+
   # We must copy ucrtbased.dll for all CPU types. The rest of the Universal CRT
   # is installed as part of the OS in Windows 10 and beyond.
-  if not suffix.startswith('.'):
+  if debug:
     win_sdk_dir = os.path.normpath(
         os.environ.get(
             'WINDOWSSDKDIR',
@@ -352,8 +360,10 @@ def _CopyUCRTRuntime(target_dir, source_dir, target_cpu, suffix):
       if not os.path.isdir(source_dir):
         continue
       break
-    _CopyRuntimeImpl(os.path.join(target_dir, 'ucrtbase' + suffix),
-                     os.path.join(source_dir, 'ucrtbase' + suffix))
+    _CopyRuntimeImpl(os.path.join(target_dir,
+                                  d('ucrtbase') + '.dll'),
+                     os.path.join(source_dir,
+                                  d('ucrtbase') + '.dll'))
 
 
 def FindVCComponentRoot(component):
@@ -389,9 +399,8 @@ def FindVCRedistRoot():
 def _CopyRuntime(target_dir, source_dir, target_cpu, debug):
   """Copy the VS runtime DLLs, only if the target doesn't exist, but the target
   directory does exist. Handles VS 2015, 2017 and 2019."""
-  suffix = 'd.dll' if debug else '.dll'
   # VS 2015, 2017 and 2019 use the same CRT DLLs.
-  _CopyUCRTRuntime(target_dir, source_dir, target_cpu, suffix)
+  _CopyUCRTRuntime(target_dir, source_dir, target_cpu, debug)
 
 
 def CopyDlls(target_dir, configuration, target_cpu):
@@ -529,7 +538,11 @@ def Update(force=False, no_download=False):
         # ciopfs not found in PATH; try the one downloaded from the DEPS hook.
         ciopfs = os.path.join(script_dir, 'ciopfs')
       if not os.path.isdir(toolchain_dir):
-        os.mkdir(toolchain_dir)
+        try:
+          os.mkdir(toolchain_dir)
+        except FileExistsError:
+          # ciopfsd died, but fuse is still mounted.
+          subprocess.check_call(["fusermount", "-u", toolchain_dir])
       if not os.path.isdir(toolchain_dir + '.ciopfs'):
         os.mkdir(toolchain_dir + '.ciopfs')
       # Without use_ino, clang's #pragma once and Wnonportable-include-path
diff --git a/naiveproxy/src/build/win/BUILD.gn b/naiveproxy/src/build/win/BUILD.gn
index 0c47c2c8c6..3eb5520cd1 100644
--- a/naiveproxy/src/build/win/BUILD.gn
+++ b/naiveproxy/src/build/win/BUILD.gn
@@ -62,6 +62,7 @@ if (is_win) {
       # vs_toolchain script that runs as part of toolchain configuration.
       data += [
         "$root_out_dir/msvcp140${vcrt_suffix}.dll",
+        "$root_out_dir/msvcp140${vcrt_suffix}_atomic_wait.dll",
         "$root_out_dir/vccorlib140${vcrt_suffix}.dll",
         "$root_out_dir/vcruntime140${vcrt_suffix}.dll",
       ]
diff --git a/naiveproxy/src/build/xcode_binaries.yaml b/naiveproxy/src/build/xcode_binaries.yaml
index e22ab237a9..d3a7d5a25d 100644
--- a/naiveproxy/src/build/xcode_binaries.yaml
+++ b/naiveproxy/src/build/xcode_binaries.yaml
@@ -1,22 +1,49 @@
 # This yaml file is used to package binaries from Xcode.app.
 #
 # To use this:
-#   1) Make sure Xcode is fully updated (via the app store or otherwise).
-#   2) Move Xcode.app to the same directory as this file, and rename Xcode.app
-#      to xcode_binaries. Or make a symlink:
-#      $ rm -rf build/xcode_binaries && \
-#        ln -s /Applications/Xcode.app build/xcode_binaries
-#   3) Create the package and upload it to CIPD:
-#      $ cipd create --pkg-def build/xcode_binaries.yaml \
+#
+#   1. Make sure Xcode is fully updated (via the app store or otherwise).
+#
+#   2. Copy Xcode.app to the same directory as this file, naming it
+#      xcode_binaries. `cp -c` uses `clonefile` which is speedier and uses less
+#      disk space than making true copies, but requires source and destination
+#      to be on the same APFS filesystem. Remove the `-c` if clonefile failures
+#      are reported.
+#
+#      % rm -rf build/xcode_binaries
+#      % cp -ac /Applications/Xcode.app/ build/xcode_binaries
+#
+#      Xcode 26 has unbundled the Metal compiler, so download it and integrate
+#      it into the toolchain. This installs the Metal toolchain corresponding
+#      to Xcode’s version, finds the filesystem mount point where it appears,
+#      and splices it into build/xcode_binaries:
+#
+#      % DEVELOPER_DIR=/Applications/Xcode.app \
+#        xcodebuild -downloadComponent MetalToolchain
+#      % METAL_DIR=$(xcrun --find metal |
+#                    sed -E -e 's%(/Metal\.xctoolchain)/.*%\1%')
+#      % rsync --archive --delete ${METAL_DIR}/usr/metal/ \
+#        build/xcode_binaries/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/metal
+#      % rsync --archive ${METAL_DIR}/usr/bin/{air-lld,metal,metallib} \
+#        build/xcode_binaries/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
+#
+#   3. Create the package and upload it to CIPD:
+#
+#      % cipd create --pkg-def build/xcode_binaries.yaml \
 #            -ref ${xcode_version} -ref ${xcode_build_version} \
 #            -ref sdk_${sdk_version} -ref sdk_${sdk_build_version}
+#
 #      ${xcode_version} and ${xcode_build_version} can be found in "About
 #      Xcode", or by running `xcodebuild -version`. ${sdk_version} can be found
 #      by running `xcrun --show-sdk-version`. ${sdk_build_version} can be found
 #      by running `xcrun --show-sdk-build-version`.
 #
+#   4. Optional: clean up.
+#
+#      % rm -rf build/xcode_binaries
+#
 # To deploy the newly created cipd package across the fleet, modify
-# ./mac_toolchain.py to point to the new cipd hash, and update the
+# build/mac_toolchain.py to point to the new cipd hash, and update the
 # mac_sdk_official_* variables in build/config/mac/mac_sdk.gni.
 #
 # Note that the Chromium build looks for the mac binaries in
@@ -26,6 +53,7 @@
 #
 # The ACLs for this package are determined by the directory structure. The
 # nomenclature mirrors that of the hermetic toolchain to avoid ACL duplication.
+
 package: infra_internal/ios/xcode/xcode_binaries/mac-amd64
 description: A hermetic deployment of all Xcode binaries used to build Chromium.
 root: "xcode_binaries"
diff --git a/naiveproxy/src/build/zip_helpers.py b/naiveproxy/src/build/zip_helpers.py
index 6d4bcba04b..35fe13eb49 100644
--- a/naiveproxy/src/build/zip_helpers.py
+++ b/naiveproxy/src/build/zip_helpers.py
@@ -45,6 +45,7 @@ def add_to_zip_hermetic(zip_file,
                         src_path=None,
                         data=None,
                         compress=None,
+                        compress_level=1,
                         alignment=None,
                         timestamp=None):
   """Adds a file to the given ZipFile with a hard-coded modified time.
@@ -56,6 +57,7 @@ def add_to_zip_hermetic(zip_file,
     data: File data as a string.
     compress: Whether to enable compression. Default is taken from ZipFile
         constructor.
+    compress_level: When compress=True, level of compression.
     alignment: If set, align the data of the entry to this many bytes.
     timestamp: The last modification date and time for the archive member.
   """
@@ -109,7 +111,7 @@ def add_to_zip_hermetic(zip_file,
   compress_type = zip_file.compression
   if compress is not None:
     compress_type = zipfile.ZIP_DEFLATED if compress else zipfile.ZIP_STORED
-  zip_file.writestr(zipinfo, data, compress_type)
+  zip_file.writestr(zipinfo, data, compress_type, compresslevel=compress_level)
 
 
 def add_files_to_zip(inputs,
@@ -118,6 +120,7 @@ def add_files_to_zip(inputs,
                      base_dir=None,
                      path_transform=None,
                      compress=None,
+                     compress_level=1,
                      zip_prefix_path=None,
                      timestamp=None):
   """Creates a zip file from a list of files.
@@ -129,6 +132,7 @@ def add_files_to_zip(inputs,
     path_transform: Called for each entry path. Returns a new zip path, or None
         to skip the file.
     compress: Whether to compress
+    compress_level: When compress=True, level of compression.
     zip_prefix_path: Path prepended to file path in zip file.
     timestamp: Unix timestamp to use for files in the archive.
   """
@@ -164,6 +168,7 @@ def add_files_to_zip(inputs,
                           zip_path,
                           src_path=fs_path,
                           compress=compress,
+                          compress_level=compress_level,
                           timestamp=timestamp)
   finally:
     if output is not out_zip:
@@ -180,7 +185,11 @@ def zip_directory(output, base_dir, **kwargs):
   add_files_to_zip(inputs, output, base_dir=base_dir, **kwargs)
 
 
-def merge_zips(output, input_zips, path_transform=None, compress=None):
+def merge_zips(output,
+               input_zips,
+               path_transform=None,
+               compress=None,
+               compress_level=1):
   """Combines all files from |input_zips| into |output|.
 
   Args:
@@ -189,6 +198,7 @@ def merge_zips(output, input_zips, path_transform=None, compress=None):
     path_transform: Called for each entry path. Returns a new zip path, or None
         to skip the file.
     compress: Overrides compression setting from origin zip entries.
+    compress_level: When compress=True, level of compression.
   """
   assert not isinstance(input_zips, str)  # Easy mistake to make.
   if isinstance(output, zipfile.ZipFile):
@@ -238,7 +248,8 @@ Input2: {in_file}"""
           add_to_zip_hermetic(out_zip,
                               dst_name,
                               data=data,
-                              compress=compress_entry)
+                              compress=compress_entry,
+                              compress_level=compress_level)
           crc_by_name[dst_name] = (in_file, out_zip.getinfo(dst_name).CRC)
   finally:
     if output is not out_zip:
diff --git a/naiveproxy/src/build_overrides/build.gni b/naiveproxy/src/build_overrides/build.gni
index ec8982ac2f..00b0d2dbc6 100644
--- a/naiveproxy/src/build_overrides/build.gni
+++ b/naiveproxy/src/build_overrides/build.gni
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import("//build/config/cronet/config.gni")
-import("//build/config/features.gni")
 import("//build/config/gclient_args.gni")
 
 # Uncomment these to specify a different NDK location and version in
@@ -50,7 +49,7 @@ declare_args() {
   gtest_enable_absl_printers = true
 
   # Allow projects that wish to stay on C++17 to override Chromium's default.
-  # TODO(crbug.com/40251117): evaluate removing this end of 2023
+  # TODO(anglebug.com/330910097): evaluate removing this 2026-04-01
   use_cxx17 = false
 }
 
@@ -73,6 +72,7 @@ declare_args() {
 # ubsan_vptr_ignorelist_path = "path/to/ubsan/vptr_ignorelist.txt"
 # ubsan_security_ignorelist_path = "path/to/ubsan/security_ignorelist.txt"
 # cfi_ignorelist_path = "path/to/cfi/ignores.txt"
+ubsan_array_bounds_ignorelist_path = "//tools/ubsan/array_bounds_ignorelist.txt"
 
 if (host_os == "mac" || is_apple) {
   # Needed for is_apple when targeting macOS or iOS, independent of host.
diff --git a/naiveproxy/src/build_overrides/partition_alloc.gni b/naiveproxy/src/build_overrides/partition_alloc.gni
index c039386e97..9e42bbaee2 100644
--- a/naiveproxy/src/build_overrides/partition_alloc.gni
+++ b/naiveproxy/src/build_overrides/partition_alloc.gni
@@ -67,9 +67,11 @@ if (!is_debug || partition_alloc_optimized_debug) {
 
 # llvm_profile_set_target() generated by -fgenerate-profile invokes malloc()
 # internally. Since allocator_shim and PartitionAlloc are not reenterant,
-# the code will cause crashes. See crbug.com/338094768.
-partition_alloc_remove_configs +=
-    [ "//build/config/compiler/pgo:default_pgo_flags" ]
+# the code will cause crashes frequently on mac. See crbug.com/338094768.
+if (is_mac) {
+  partition_alloc_remove_configs +=
+      [ "//build/config/compiler/pgo:default_pgo_flags" ]
+}
 
 # - Component build support is disabled on all platforms except Linux. It is
 #   known to cause issues on some (e.g. Windows with shims, Android with
@@ -78,9 +80,6 @@ partition_alloc_remove_configs +=
 _disable_partition_alloc_everywhere =
     (!is_linux && is_component_build) || (is_win && is_debug)
 
-# - iOS: Depends on ios_partition_alloc_enabled.
-_is_partition_alloc_everywhere_platform = !is_ios || ios_partition_alloc_enabled
-
 use_allocator_shim_default = true  # Updated below:
 
 # Sanitizers replace the allocator, don't use our own.
@@ -102,11 +101,16 @@ if (is_win && is_component_build && (!use_custom_libcxx || libcxx_is_shared)) {
   use_allocator_shim_default = false
 }
 
+# When Cronet builds within Android this is not supported. See
+# https://crrev.com/c/6179216.
+if (is_cronet_for_aosp_build) {
+  use_allocator_shim_default = false
+}
+
 shim_supports_sized_dealloc_default = use_sized_deallocation
 
 use_partition_alloc_as_malloc_default =
-    use_allocator_shim_default && _is_partition_alloc_everywhere_platform &&
-    !_disable_partition_alloc_everywhere
+    use_allocator_shim_default && !_disable_partition_alloc_everywhere
 
 enable_backup_ref_ptr_support_default = use_partition_alloc_as_malloc_default
 
@@ -129,16 +133,15 @@ enable_dangling_raw_ptr_checks_default =
     # DCHECKd/Debug builds. In the future, given its neutral performance impact,
     # we could consider removing this restriction.
     (is_debug || dcheck_always_on) &&
-    # Fuchsia and iOS have never been tested against DanglingPointerDetector at
-    # the moment.
-    !is_ios && !is_fuchsia &&
+    # iOS is rolling out DanglingPointerDetection bot-by-bot.
+    (!is_ios || ios_enable_dangling_raw_ptr_checks) &&
+    # Fuchsia has never been tested against DanglingPointerDetector at the
+    #moment.
+    !is_fuchsia &&
     # Only the `android-rel` CQ bot has enforced DanglingPointerDetector checks
     # at the moment. The other Android bots are not ready for it yet.
     !is_android
 
-enable_ios_corruption_hardening_default =
-    is_ios && ios_partition_alloc_corruption_hardening_enabled
-
 raw_ptr_zero_on_construct_default = true
 raw_ptr_zero_on_move_default = true
 raw_ptr_zero_on_destruct_default = false
@@ -146,3 +149,7 @@ raw_ptr_zero_on_destruct_default = false
 # Allow embedders to opt-out of C++20 build which is set as default.
 # Kindly notify PartitionAlloc owners of change to false.
 assert_cpp20_default = true
+
+# Cronet disables PartitionAlloc to reduce its binary size (crbug.com/674570).
+# TODO(crbug.com/384669394): Consider enabling it instead.
+# use_partition_alloc_default = !is_cronet_build
diff --git a/naiveproxy/src/buildtools/deps_revisions.gni b/naiveproxy/src/buildtools/deps_revisions.gni
index fe1a65609c..263cfd532e 100644
--- a/naiveproxy/src/buildtools/deps_revisions.gni
+++ b/naiveproxy/src/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@
 declare_args() {
   # Used to cause full rebuilds on libc++ rolls. This should be kept in sync
   # with the libcxx_revision var in //DEPS.
-  libcxx_revision = "adbb4a5210ae2a8a4e27fa6199221156c02a9b1a"
+  libcxx_revision = "8cd54f6b0741cdef08299711668e6b25fef26406"
 }
diff --git a/naiveproxy/src/buildtools/third_party/libc++/BUILD.gn b/naiveproxy/src/buildtools/third_party/libc++/BUILD.gn
index 2900b06198..673a59d9ce 100644
--- a/naiveproxy/src/buildtools/third_party/libc++/BUILD.gn
+++ b/naiveproxy/src/buildtools/third_party/libc++/BUILD.gn
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import("//build/config/c++/c++.gni")
-import("//build/config/compiler/compiler.gni")
 import("//build/config/sanitizers/sanitizers.gni")
 import("//build/toolchain/toolchain.gni")
 import("//buildtools/third_party/libc++/libcxx_headers.gni")
@@ -16,6 +15,13 @@ if (is_mac) {
 # Used by libc++ and libc++abi.
 # See //build/config/c++:runtime_library for the config used by users of libc++.
 config("config") {
+  configs = [
+    ":extra_flags",
+    ":stdver",
+  ]
+}
+
+config("extra_flags") {
   cflags = [
     "-fstrict-aliasing",
     "-Wundef",
@@ -26,27 +32,25 @@ config("config") {
       # in its implementation.
       "-Wno-macro-redefined",
     ]
-
-    # We want to use a uniform C++ version across all of chromium, but upstream
-    # libc++ requires at least C++20 so we have to make an exception here. No
-    # other target should override the default -std= flag.
-    if (use_cxx23) {
-      cflags_cc = [ "-std:c++23" ]
-    } else {
-      cflags_cc = [ "-std:c++20" ]
-    }
   } else {
     cflags += [ "-fPIC" ]
-    if (use_cxx23) {
-      cflags_cc = [ "-std=c++23" ]
-    } else {
-      cflags_cc = [ "-std=c++20" ]
-    }
   }
-
   defines = [ "_LIBCPP_BUILDING_LIBRARY" ]
 }
 
+config("stdver") {
+  if (is_win) {
+    cflags_cc = [
+      # We want to use a uniform C++ version across all of chromium, but
+      # upstream libc++ requires C++23 so we have to make an exception here.
+      # No other target should override the default -std= flag.
+      "-std:c++23preview",
+    ]
+  } else {
+    cflags_cc = [ "-std=c++23" ]
+  }
+}
+
 # Explicitly set version macros to Windows 7 to prevent libc++ from adding a
 # hard dependency on GetSystemTimePreciseAsFileTime, which was introduced in
 # Windows 8.
@@ -58,512 +62,183 @@ config("winver") {
   ]
 }
 
-if (use_clang_modules) {
-  if (is_linux || is_chromeos) {
-    textual_module("sysroot_ctype") {
-    }
-    textual_module("sysroot_errno") {
-      public_deps = [ ":sysroot" ]
-    }
-    textual_module("sysroot_fenv") {
-    }
-    alias("sysroot_features") {
-      actual = [ ":sysroot_limits" ]
-    }
-    textual_module("sysroot_inttypes") {
-      public_deps = [
-        ":_Builtin_stdint",
-        ":sysroot_features",
-      ]
-    }
-    sysroot_module("sysroot_limits") {
-    }
+config("builtin_modulemap") {
+  cflags_cc = [ clang_arg_prefix + "-fbuiltin-module-map" ]
+}
 
-    alias("sysroot_locale") {
-      actual = []
-    }
+modulemap_config("libcxx_modulemap") {
+  source =
+      "${root_build_dir}/gen/third_party/libc++/src/include/module.modulemap"
+}
 
-    textual_module("sysroot_math") {
-      public_deps = [ ":sysroot_stdlib" ]
-    }
+if (current_toolchain == default_toolchain) {
+  # The Clang modules build requires libc++ headers, __assertion_handler, and
+  # __config_site to be in the same directory.
+  #
+  # To avoid redundant work, the copy targets are declared only in the default
+  # toolchain. This prevents unnecessary copies in multi-toolchain builds and
+  # allows Siso to use its precomputed tree for the default toolchain's `gen`
+  # directory.
+  #
+  # Note: there are setups where clang_modules is enabled for some, but not all,
+  # toolchains (see https://crrev.com/c/6849070). So, this copy must happen
+  # unconditionally.
+  copy("copy_libcxx_headers") {
+    sources = libcxx_headers
+    outputs = [ "{{source_gen_dir}}/{{source_file_part}}" ]
 
-    alias("sysroot_pthread") {
-      actual = [ ":sysroot" ]
-    }
+    # Rely on `:libcxx_headers` instead: it abstract away the default toolchain
+    # optimization and the internal copy.
+    visibility = [ ":libcxx_headers" ]
+  }
 
-    textual_module("sysroot_stdatomic") {
-    }
-    textual_module("sysroot_stdint") {
-      public_deps = [ ":sysroot_features" ]
-    }
-    alias("sysroot_stdlib") {
-      actual = [ ":sysroot" ]
-    }
-    textual_module("sysroot_string") {
-      public_deps = [
-        ":_Builtin_stddef",
-        ":sysroot",
-      ]
-    }
-    textual_module("sysroot_uchar") {
-      public_deps = [ ":_Builtin_stddef" ]
-    }
-    alias("sysroot_wchar") {
-      actual = [ ":sysroot" ]
-    }
-    textual_module("sysroot_wctype") {
-    }
+  # Note: there are setups where clang_modules is enabled for some, but not all,
+  # toolchains (see https://crrev.com/c/6849070). So, this copy must happen
+  # unconditionally.
+  copy("copy_custom_headers") {
+    sources = [
+      "__assertion_handler",
+      "__config_site",
+    ]
+    outputs = [
+      "${root_gen_dir}/third_party/libc++/src/include/{{source_file_part}}",
+    ]
 
-    sysroot_module("sysroot") {
-      public_deps = [
-        ":_Builtin_limits",
-        ":_Builtin_stdarg",
-        ":_Builtin_stddef",
-      ]
-    }
+    # Rely on `:custom_headers` instead: it abstract away the default toolchain
+    # optimization and the internal copy.
+    visibility = [ ":custom_headers" ]
+  }
+}
 
-    alias("all_sysroot") {
-      actual = [
-        ":sysroot_limits",
-        ":sysroot",
-      ]
-    }
-  } else if (is_android) {
-    textual_module("sysroot_ctype") {
-      public_deps = [ ":sysroot" ]
-    }
+# TODO(https://crbug.com/440260716): This intermediate target can be removed
+# once Cronet's gn2bp supports copy targets with multiple outputs.
+group("libcxx_headers") {
+  if (use_clang_modules) {
+    deps = [ ":copy_libcxx_headers($default_toolchain)" ]
+  }
+}
 
-    textual_module("sysroot_errno") {
-      public_deps = [ ":sysroot" ]
-    }
+# TODO(https://crbug.com/440260716): This intermediate target can be removed
+# once Cronet's gn2bp supports copy targets with multiple outputs.
+group("custom_headers") {
+  if (use_clang_modules) {
+    deps = [ ":copy_custom_headers($default_toolchain)" ]
+  }
+}
 
-    sysroot_module("sysroot_features") {
-    }
+if (use_clang_modules && use_xcode_symlinks && !use_autogenerated_modules) {
+  # sysroot_modulemaps can be inside the build directory. This no-op action
+  # declares the modulemap files as outputs to satisfy GN's dependency
+  # tracking when other targets use them as inputs.
+  action("copy_sysroot_modulemaps") {
+    script = "//build/noop.py"
+    outputs = sysroot_modulemaps
+  }
+}
 
-    textual_module("sysroot_fenv") {
-      public_deps = [ ":sysroot" ]
-    }
-
-    textual_module("sysroot_inttypes") {
-      public_deps = [
-        ":_Builtin_stdint",
-        ":sysroot_features",
-      ]
-    }
-
-    textual_module("sysroot_limits") {
-      public_deps = [ ":sysroot_features" ]
-    }
-
-    alias("sysroot_locale") {
-      actual = []
-    }
-
-    textual_module("sysroot_math") {
-      public_deps = [ ":sysroot_stdlib" ]
-    }
-
-    alias("sysroot_pthread") {
-      actual = [ ":sysroot" ]
-    }
-
-    textual_module("sysroot_stdatomic") {
-      # stdatomic includes libc++'s 
-      public_deps = [ ":std" ]
-    }
-
-    textual_module("sysroot_stdint") {
-      public_deps = [
-        ":_Builtin_stddef",
-        ":sysroot_features",
-      ]
-    }
-
-    alias("sysroot_stdlib") {
-      actual = [ ":sysroot" ]
-    }
-
-    textual_module("sysroot_string") {
-      public_deps = [
-        ":_Builtin_stddef",
-        ":sysroot",
-      ]
-    }
-
-    textual_module("sysroot_uchar") {
-      public_deps = [
-        ":_Builtin_stddef",
-        ":sysroot",
-      ]
-    }
-
-    textual_module("sysroot_wctype") {
-      public_deps = [ ":sysroot" ]
-    }
-
-    alias("sysroot_wchar") {
-      actual = [ ":sysroot" ]
-    }
-
-    config("wchar_fix") {
-      # See https://github.com/llvm/llvm-project/blob/3f33e7ba5b08a97939280e539ad20a34d54b2719/libcxx/include/wchar.h#L139
-      # Since android doesn't come with glibc, this isn't defined, and thus
-      # wchar.h defines (not declares) additional overloads when this is unset,
-      # and wchar.h is textual, we set this to ensure ODR is not violated.
-      defines = [ "_LIBCPP_WCHAR_H_HAS_CONST_OVERLOADS" ]
-    }
-
-    sysroot_module("sysroot") {
-      public_deps = [
-        ":_Builtin_limits",
-        ":_Builtin_stdarg",
-        ":_Builtin_stddef",
-        ":_Builtin_stdint",
-      ]
-      public_configs = [ ":wchar_fix" ]
-    }
-
-    alias("all_sysroot") {
-      actual = [
-        ":sysroot_features",
-        ":sysroot",
-      ]
-    }
-  } else if (is_apple) {
-    if (default_toolchain == current_toolchain && is_ios) {
-      # sysroot_modulemaps can be inside the build directory. This no-op action
-      # declares the modulemap files as outputs to satisfy GN's dependency
-      # tracking when other targets use them as inputs.
-      action("copy_sysroot_modulemaps") {
-        script = "//build/noop.py"
-        outputs = sysroot_modulemaps
-      }
-    }
+if (use_autogenerated_modules && use_clang_modules) {
+  group("all_modules") {
+    # If this doesn't exist, you'll need to run build/modules/modularize.py for that platform.
+    public_deps = [ "//build/modules/${module_platform}:all_modules" ]
+    public_configs = [ "//build/config/compiler:libcxx_module" ]
+  }
 
+  config("all_modulemap_configs") {
+    configs = [ "//build/modules/${module_platform}:all_modulemap_configs" ]
+  }
+} else if (use_clang_modules) {
+  if (is_apple) {
     DarwinBasic_module("MachO") {
       public_deps = [
         ":_Builtin_stdbool",
         ":_Builtin_stdint",
-        ":_limits",
-        ":_string",
-        ":mach",
+        ":_DarwinFoundation3",
         ":std_string_h",
-        ":unistd",
-        ":uuid",
       ]
     }
 
-    DarwinBasic_module("_strings") {
-      public_deps = [ ":DarwinFoundation" ]
+    DarwinFoundation1_module("_DarwinFoundation1") {
+      public_deps = [ ":_AvailabilityInternal" ]
     }
-
-    DarwinBasic_module("alloca") {
-      public_deps = [ ":DarwinFoundation" ]
+    DarwinFoundation1_module("_AvailabilityInternal") {
     }
-
-    DarwinBasic_module("gethostuuid") {
-      public_deps = [
-        ":_time",
-        ":uuid",
-      ]
-    }
-
-    DarwinBasic_module("nl_types") {
-      public_deps = [
-        ":DarwinFoundation",
-        ":sys_types",
-      ]
-    }
-
-    DarwinBasic_module("pthread") {
-      public_deps = [
-        ":DarwinFoundation",
-        ":_signal",
-        ":_time",
-        ":mach",
-      ]
-    }
-
-    DarwinBasic_module("runetype") {
-      public_deps = [ ":DarwinFoundation" ]
-    }
-
-    DarwinBasic_module("sys_select") {
-      public_deps = [
-        ":DarwinFoundation",
-        ":_signal",
-        ":_sys_select",
-        ":_time",
-        ":sys_time",
-      ]
-    }
-
-    DarwinBasic_module("sys_types") {
-      public_deps = [
-        ":DarwinFoundation",
-        ":_errno",
-        ":_sys_select",
-        ":_useconds_t",
-        ":netinet_in",
-      ]
-    }
-
-    DarwinBasic_module("sys_wait") {
-      public_deps = [
-        ":DarwinFoundation",
-        ":_signal",
-        ":sys_resource",
-        ":sys_types",
-      ]
-    }
-
-    DarwinBasic_module("sys_resource") {
-      public_deps = [
-        ":DarwinFoundation",
-        ":_Builtin_stdint",
-        ":sys_time",
-        ":sys_types",
-      ]
-    }
-
-    DarwinBasic_module("unistd") {
-      public_deps = [
-        ":DarwinFoundation",
-        ":_limits",
-        ":_stdio",
-        ":gethostuuid",
-        ":sys_select",
-        ":uuid",
-      ]
-    }
-
-    DarwinBasic_module("xlocale") {
-      public_deps = [
-        ":DarwinFoundation",
-        ":_locale",
-      ]
-    }
-
-    DarwinFoundation_module("DarwinFoundation") {
+    DarwinFoundation2_module("_DarwinFoundation2") {
       public_deps = [
         ":_Builtin_stdarg",
         ":_Builtin_stddef",
+        ":_DarwinFoundation1",
       ]
     }
-
-    DarwinFoundation_module("_sys_select") {
-      public_deps = [ ":DarwinFoundation" ]
+    DarwinFoundation2_module("alloca") {
+      public_deps = [ ":_DarwinFoundation2" ]
     }
-
-    DarwinFoundation_module("_useconds_t") {
-      public_deps = [ ":DarwinFoundation" ]
-    }
-
-    DarwinFoundation_module("mach") {
-      public_deps = [ ":DarwinFoundation" ]
-    }
-
-    DarwinFoundation_module("netinet_in") {
-      public_deps = [ ":DarwinFoundation" ]
-    }
-
-    DarwinFoundation_module("sys_time") {
-      public_deps = [ ":DarwinFoundation" ]
-    }
-
-    DarwinFoundation_module("uuid") {
-      public_deps = [ ":DarwinFoundation" ]
-    }
-
-    c_standard_library_module("__wctype") {
+    DarwinFoundation3_module("_DarwinFoundation3") {
       public_deps = [
-        ":_ctype",
+        ":_Builtin_stdint",
+        ":_DarwinFoundation2",
         ":std_ctype_h",
       ]
     }
-
-    c_standard_library_module("_assert") {
-      public_deps = [ ":DarwinFoundation" ]
-    }
-
-    c_standard_library_module("_ctype") {
+    DarwinFoundation3_module("xlocale") {
       public_deps = [
-        ":DarwinFoundation",
-        ":runetype",
+        ":_DarwinFoundation1",
+        ":_DarwinFoundation2",
       ]
     }
 
-    c_standard_library_module("_errno") {
-      public_deps = [ ":DarwinFoundation" ]
-    }
-
-    c_standard_library_module("_fenv") {
-    }
-
-    c_standard_library_module("_inttypes") {
+    group("all_sysroot") {
       public_deps = [
-        ":_Builtin_stdint",
-        ":_stdint",
-      ]
-    }
-
-    c_standard_library_module("_limits") {
-      public_deps = [ ":DarwinFoundation" ]
-    }
-
-    c_standard_library_module("_locale") {
-      public_deps = [ ":DarwinFoundation" ]
-    }
-
-    c_standard_library_module("_math") {
-      public_deps = [ ":DarwinFoundation" ]
-    }
-
-    c_standard_library_module("_setjmp") {
-      public_deps = [ ":DarwinFoundation" ]
-    }
-
-    c_standard_library_module("_signal") {
-      public_deps = [
-        ":DarwinFoundation",
-        ":mach",
-        ":sys_types",
-      ]
-    }
-
-    c_standard_library_module("_stdint") {
-      public_deps = [ ":DarwinFoundation" ]
-    }
-
-    c_standard_library_module("_stdio") {
-      public_deps = [
-        ":DarwinFoundation",
-        ":sys_types",
-      ]
-    }
-
-    c_standard_library_module("_stdlib") {
-      public_deps = [
-        ":_signal",
-        ":_stdint",
-        ":alloca",
-        ":runetype",
-        ":sys_wait",
-      ]
-    }
-
-    c_standard_library_module("_string") {
-      public_deps = [
-        ":DarwinFoundation",
-        ":_strings",
-        ":sys_types",
-      ]
-    }
-
-    c_standard_library_module("_time") {
-      public_deps = [
-        ":DarwinFoundation",
-        ":sys_types",
-      ]
-    }
-
-    c_standard_library_module("_wchar") {
-      public_deps = [
-        ":__wctype",
-        ":_stdio",
-        ":_time",
-      ]
-    }
-
-    c_standard_library_module("_wctype") {
-      public_deps = [ ":__wctype" ]
-    }
-
-    alias("all_sysroot") {
-      actual = [
-        ":DarwinFoundation",
         ":MachO",
-        ":__wctype",
-        ":_assert",
-        ":_ctype",
-        ":_errno",
-        ":_fenv",
-        ":_inttypes",
-        ":_limits",
-        ":_locale",
-        ":_setjmp",
-        ":_signal",
-        ":_stdint",
-        ":_stdio",
-        ":_stdlib",
-        ":_string",
-        ":_strings",
-        ":_sys_select",
-        ":_time",
-        ":_useconds_t",
-        ":_wchar",
-        ":_wctype",
+        ":_AvailabilityInternal",
+        ":_DarwinFoundation1",
+        ":_DarwinFoundation2",
+        ":_DarwinFoundation3",
         ":alloca",
-        ":gethostuuid",
-        ":mach",
-        ":netinet_in",
-        ":nl_types",
-        ":pthread",
-        ":runetype",
-        ":sys_resource",
-        ":sys_time",
-        ":sys_types",
-        ":sys_wait",
-        ":unistd",
-        ":uuid",
         ":xlocale",
       ]
     }
 
-    alias("sysroot_ctype") {
-      actual = [ ":_ctype" ]
+    group("sysroot_ctype") {
+      public_deps = [ ":_DarwinFoundation2" ]
     }
-    alias("sysroot_errno") {
-      actual = [ ":_errno" ]
+    group("sysroot_errno") {
+      public_deps = [ ":_DarwinFoundation1" ]
     }
-    alias("sysroot_fenv") {
-      actual = [ ":_fenv" ]
+    group("sysroot_fenv") {
+      public_deps = [ ":_DarwinFoundation1" ]
     }
-    alias("sysroot_inttypes") {
-      actual = [ ":_inttypes" ]
+    group("sysroot_inttypes") {
+      public_deps = [ ":_DarwinFoundation3" ]
     }
-    alias("sysroot_limits") {
-      actual = [ ":_limits" ]
+    group("sysroot_limits") {
+      public_deps = [ ":_DarwinFoundation1" ]
     }
-    alias("sysroot_locale") {
-      actual = [ ":_locale" ]
+    group("sysroot_locale") {
     }
-    alias("sysroot_math") {
-      actual = [ ":_math" ]
+    group("sysroot_math") {
     }
-    alias("sysroot_pthread") {
-      actual = [ ":pthread" ]
+    group("sysroot_pthread") {
     }
-    alias("sysroot_stdatomic") {
-      actual = []
+    group("sysroot_stdatomic") {
+      public_deps = []
     }
-    alias("sysroot_stdint") {
-      actual = [ ":_stdint" ]
+    group("sysroot_stdint") {
+      public_deps = [ ":_DarwinFoundation2" ]
     }
-    alias("sysroot_stdlib") {
-      actual = [ ":_stdlib" ]
+    group("sysroot_stdlib") {
+      public_deps = [ ":_DarwinFoundation3" ]
     }
-    alias("sysroot_string") {
-      actual = [ ":_string" ]
+    group("sysroot_string") {
+      public_deps = [ ":_DarwinFoundation2" ]
     }
-    alias("sysroot_uchar") {
-      actual = []
+    group("sysroot_uchar") {
+      public_deps = []
     }
-    alias("sysroot_wchar") {
-      actual = [ ":_wchar" ]
+    group("sysroot_wchar") {
+      public_deps = [ ":_DarwinFoundation3" ]
     }
-    alias("sysroot_wctype") {
-      actual = [ ":_wctype" ]
+    group("sysroot_wctype") {
+      public_deps = [ ":_DarwinFoundation3" ]
     }
   }
 
@@ -623,8 +298,8 @@ if (use_clang_modules) {
   builtin_module("ptrauth") {
   }
 
-  alias("all_builtins") {
-    actual = [
+  group("all_builtins") {
+    public_deps = [
       "//buildtools/third_party/libc++:_Builtin_float",
       "//buildtools/third_party/libc++:_Builtin_intrinsics",
       "//buildtools/third_party/libc++:_Builtin_inttypes",
@@ -640,23 +315,6 @@ if (use_clang_modules) {
     ]
   }
 
-  # We need to have libc++ headers, __assertion_handler and __config_site in the
-  # same directory for clang modules build.
-  copy("copy_libcxx_headers") {
-    sources = libcxx_headers
-    outputs = [ "{{source_gen_dir}}/{{source_file_part}}" ]
-  }
-
-  copy("copy_custom_headers") {
-    sources = [
-      "__assertion_handler",
-      "__config_site",
-    ]
-    outputs = [
-      "${root_gen_dir}/third_party/libc++/src/include/{{source_file_part}}",
-    ]
-  }
-
   libcxx_module("std") {
     public_deps = [
       ":_Builtin_limits",
@@ -677,10 +335,6 @@ if (use_clang_modules) {
     ]
     if (is_apple) {
       public_deps += [
-        #  includes  inside an __APPLE__ macro guard which
-        # requires nl_types module.
-        ":nl_types",
-
         # __locale_dir/support/apple.h includes __locale_dir/support/bsd_like.h,
         #  which includes xlocale.h.
         ":xlocale",
@@ -689,13 +343,6 @@ if (use_clang_modules) {
   }
 
   textual_module("std_config") {
-    # Snippet from __configuration/platform.h:
-    # #if defined(__linux__) || defined(__AMDGPU__) || defined(__NVPTX__)
-    #  if __has_include()
-    #    include 
-    if (is_linux || is_chromeos || is_android) {
-      public_deps = [ ":sysroot_features" ]
-    }
   }
 
   libcxx_module("std_core") {
@@ -785,10 +432,10 @@ if (use_clang_modules) {
     ]
   }
 
-  alias("all_std") {
+  group("all_std") {
     # There are more modules than this, but since the others are purely
     # textual, they don't need to be compiled to a pcm.
-    actual = [
+    public_deps = [
       ":std",
       ":std_core",
       ":std_ctype_h",
@@ -805,12 +452,26 @@ if (use_clang_modules) {
     ]
   }
 
-  alias("all_modules") {
-    actual = [
+  config("sysroot_modulemaps") {
+    cflags_cc = []
+    foreach(modulemap, sysroot_modulemaps) {
+      cflags_cc +=
+          [ "-fmodule-map-file=" + rebase_path(modulemap, root_build_dir) ]
+    }
+  }
+
+  group("all_modules") {
+    public_deps = [
       ":all_builtins",
       ":all_std",
       ":all_sysroot",
     ]
+    public_configs = [ "//build/config/compiler:libcxx_module" ]
+  }
+} else {
+  # This is a no-op target for when use_clang_modules = false. It is
+  # still referenced in BUILDCONFIG.gn.
+  group("all_modules") {
   }
 }
 
@@ -944,7 +605,11 @@ target(libcxx_target_type, "libc++") {
   configs += configs_to_add + [
              ]
 
-  deps = [ "//third_party/llvm-libc:llvm-libc-shared" ]
+  deps = [
+    ":custom_headers",
+    ":libcxx_headers",
+    "//third_party/llvm-libc:llvm-libc-shared",
+  ]
 
   if (use_clang_modules) {
     # TODO(https://github.com/llvm/llvm-project/issues/127012): We don't enable
@@ -955,12 +620,8 @@ target(libcxx_target_type, "libc++") {
     # This removes deps to libc++'s modules from libc++'s build as libc++
     # doesn't support modules build itself.
     use_libcxx_modules = false
-
-    deps += [
-      ":copy_custom_headers",
-      ":copy_libcxx_headers",
-    ]
   }
+
   if ((is_android || is_apple) && libcxx_is_shared) {
     # Use libc++_chrome to avoid conflicting with system libc++
     output_name = "libc++_chrome"
diff --git a/naiveproxy/src/buildtools/third_party/libc++/generate_libcxx_headers.py b/naiveproxy/src/buildtools/third_party/libc++/generate_libcxx_headers.py
index d07bf88b49..244ccf5b91 100755
--- a/naiveproxy/src/buildtools/third_party/libc++/generate_libcxx_headers.py
+++ b/naiveproxy/src/buildtools/third_party/libc++/generate_libcxx_headers.py
@@ -11,16 +11,13 @@ import subprocess
 from typing import Optional
 
 _CURRENT_DIR = pathlib.Path(__file__).parent
-_OUT_OF_DATE_ERROR = """Your libcxx_headers.gni is out of date.
-
-If you synced without running hooks, run `gclient sync`
+_OUT_OF_DATE_ERROR = """libcxx_headers.gni and third_party/libc++ are out of sync.
 
 If you were messing around with the libc++ repository, run:
 `buildtools/third_party/libc++/generate_libcxx_headers.py`
 
-In any other scenario, this *should not* happen. You can temporarily solve the
-problem by running the above command, but please file a bug and assign it to
-msta@ with reproduction details.""".replace('\n', '$0x0A')
+If the script doesn't resolve the error, file a bug to msta@ with reproduction details.
+""".replace('\n', '$0x0A')
 
 
 def _get_headers(include_dir: pathlib.Path) -> list[str]:
@@ -56,15 +53,17 @@ def _write_headers(path: pathlib.Path, headers: list[str],
         assertion = ''
     else:
         assertion = f"""
-assert(libcxx_revision == "{libcxx_revision}",
-       "{_OUT_OF_DATE_ERROR}")
+assert(
+    libcxx_revision == "{libcxx_revision}",
+    "{_OUT_OF_DATE_ERROR}")
 """
     path.write_text(f"""# Copyright 2025 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
 # DO NOT EDIT. This file is generated.
-# This file should automatically be generated as a gclient hook.
+# This file should automatically be generated by the auto-roller.
+# https://autoroll.skia.org/r/libcxx-chromium
 # To manually regenerate, run:
 # buildtools/third_party/libc++/generate_libcxx_headers.py
 
@@ -79,7 +78,7 @@ libcxx_headers = [
 if __name__ == '__main__':
     libcxx = _CURRENT_DIR / '../../../third_party/libc++/src'
     _write_headers(
-        _CURRENT_DIR / 'generated_libcxx_headers.gni',
+        _CURRENT_DIR / 'libcxx_headers.gni',
         _get_headers(libcxx / 'include'),
         _get_libcxx_revision(libcxx),
     )
diff --git a/naiveproxy/src/buildtools/third_party/libc++/libcxx_headers.gni b/naiveproxy/src/buildtools/third_party/libc++/libcxx_headers.gni
index 2224d85f27..b4d0a266d9 100644
--- a/naiveproxy/src/buildtools/third_party/libc++/libcxx_headers.gni
+++ b/naiveproxy/src/buildtools/third_party/libc++/libcxx_headers.gni
@@ -3,7 +3,16 @@
 # found in the LICENSE file.
 
 # DO NOT EDIT. This file is generated.
-# To regenerate, run buildtools/third_party/libc++/generate_libcxx_headers.py
+# This file should automatically be generated by the auto-roller.
+# https://autoroll.skia.org/r/libcxx-chromium
+# To manually regenerate, run:
+# buildtools/third_party/libc++/generate_libcxx_headers.py
+
+import("//buildtools/deps_revisions.gni")
+
+assert(
+    libcxx_revision == "8cd54f6b0741cdef08299711668e6b25fef26406",
+    "libcxx_headers.gni and third_party/libc++ are out of sync.$0x0A$0x0AIf you were messing around with the libc++ repository, run:$0x0A`buildtools/third_party/libc++/generate_libcxx_headers.py`$0x0A$0x0AIf the script doesn't resolve the error, file a bug to msta@ with reproduction details.$0x0A")
 
 libcxx_headers = [
   "//third_party/libc++/src/include/__algorithm/adjacent_find.h",
@@ -223,6 +232,7 @@ libcxx_headers = [
   "//third_party/libc++/src/include/__atomic/check_memory_order.h",
   "//third_party/libc++/src/include/__atomic/contention_t.h",
   "//third_party/libc++/src/include/__atomic/fence.h",
+  "//third_party/libc++/src/include/__atomic/floating_point_helper.h",
   "//third_party/libc++/src/include/__atomic/is_always_lock_free.h",
   "//third_party/libc++/src/include/__atomic/kill_dependency.h",
   "//third_party/libc++/src/include/__atomic/memory_order.h",
@@ -455,14 +465,12 @@ libcxx_headers = [
   "//third_party/libc++/src/include/__fwd/get.h",
   "//third_party/libc++/src/include/__fwd/ios.h",
   "//third_party/libc++/src/include/__fwd/istream.h",
-  "//third_party/libc++/src/include/__fwd/map.h",
   "//third_party/libc++/src/include/__fwd/mdspan.h",
   "//third_party/libc++/src/include/__fwd/memory.h",
   "//third_party/libc++/src/include/__fwd/memory_resource.h",
   "//third_party/libc++/src/include/__fwd/ostream.h",
   "//third_party/libc++/src/include/__fwd/pair.h",
   "//third_party/libc++/src/include/__fwd/queue.h",
-  "//third_party/libc++/src/include/__fwd/set.h",
   "//third_party/libc++/src/include/__fwd/span.h",
   "//third_party/libc++/src/include/__fwd/sstream.h",
   "//third_party/libc++/src/include/__fwd/stack.h",
@@ -788,11 +796,9 @@ libcxx_headers = [
   "//third_party/libc++/src/include/__tree",
   "//third_party/libc++/src/include/__tuple/find_index.h",
   "//third_party/libc++/src/include/__tuple/ignore.h",
-  "//third_party/libc++/src/include/__tuple/make_tuple_types.h",
   "//third_party/libc++/src/include/__tuple/sfinae_helpers.h",
   "//third_party/libc++/src/include/__tuple/tuple_element.h",
   "//third_party/libc++/src/include/__tuple/tuple_like.h",
-  "//third_party/libc++/src/include/__tuple/tuple_like_ext.h",
   "//third_party/libc++/src/include/__tuple/tuple_like_no_subrange.h",
   "//third_party/libc++/src/include/__tuple/tuple_size.h",
   "//third_party/libc++/src/include/__tuple/tuple_types.h",
@@ -802,7 +808,6 @@ libcxx_headers = [
   "//third_party/libc++/src/include/__type_traits/aligned_storage.h",
   "//third_party/libc++/src/include/__type_traits/aligned_union.h",
   "//third_party/libc++/src/include/__type_traits/alignment_of.h",
-  "//third_party/libc++/src/include/__type_traits/can_extract_key.h",
   "//third_party/libc++/src/include/__type_traits/common_reference.h",
   "//third_party/libc++/src/include/__type_traits/common_type.h",
   "//third_party/libc++/src/include/__type_traits/conditional.h",
@@ -850,6 +855,7 @@ libcxx_headers = [
   "//third_party/libc++/src/include/__type_traits/is_floating_point.h",
   "//third_party/libc++/src/include/__type_traits/is_function.h",
   "//third_party/libc++/src/include/__type_traits/is_fundamental.h",
+  "//third_party/libc++/src/include/__type_traits/is_generic_transparent_comparator.h",
   "//third_party/libc++/src/include/__type_traits/is_implicit_lifetime.h",
   "//third_party/libc++/src/include/__type_traits/is_implicitly_default_constructible.h",
   "//third_party/libc++/src/include/__type_traits/is_integral.h",
@@ -883,6 +889,7 @@ libcxx_headers = [
   "//third_party/libc++/src/include/__type_traits/is_trivially_relocatable.h",
   "//third_party/libc++/src/include/__type_traits/is_unbounded_array.h",
   "//third_party/libc++/src/include/__type_traits/is_union.h",
+  "//third_party/libc++/src/include/__type_traits/is_unqualified.h",
   "//third_party/libc++/src/include/__type_traits/is_unsigned.h",
   "//third_party/libc++/src/include/__type_traits/is_valid_expansion.h",
   "//third_party/libc++/src/include/__type_traits/is_void.h",
@@ -891,6 +898,7 @@ libcxx_headers = [
   "//third_party/libc++/src/include/__type_traits/make_32_64_or_128_bit.h",
   "//third_party/libc++/src/include/__type_traits/make_const_lvalue_ref.h",
   "//third_party/libc++/src/include/__type_traits/make_signed.h",
+  "//third_party/libc++/src/include/__type_traits/make_transparent.h",
   "//third_party/libc++/src/include/__type_traits/make_unsigned.h",
   "//third_party/libc++/src/include/__type_traits/maybe_const.h",
   "//third_party/libc++/src/include/__type_traits/nat.h",
@@ -922,6 +930,7 @@ libcxx_headers = [
   "//third_party/libc++/src/include/__utility/cmp.h",
   "//third_party/libc++/src/include/__utility/convert_to_integral.h",
   "//third_party/libc++/src/include/__utility/declval.h",
+  "//third_party/libc++/src/include/__utility/default_three_way_comparator.h",
   "//third_party/libc++/src/include/__utility/element_count.h",
   "//third_party/libc++/src/include/__utility/empty.h",
   "//third_party/libc++/src/include/__utility/exception_guard.h",
@@ -932,6 +941,7 @@ libcxx_headers = [
   "//third_party/libc++/src/include/__utility/integer_sequence.h",
   "//third_party/libc++/src/include/__utility/is_pointer_in_range.h",
   "//third_party/libc++/src/include/__utility/is_valid_range.h",
+  "//third_party/libc++/src/include/__utility/lazy_synth_three_way_comparator.h",
   "//third_party/libc++/src/include/__utility/move.h",
   "//third_party/libc++/src/include/__utility/no_destroy.h",
   "//third_party/libc++/src/include/__utility/pair.h",
@@ -943,6 +953,7 @@ libcxx_headers = [
   "//third_party/libc++/src/include/__utility/small_buffer.h",
   "//third_party/libc++/src/include/__utility/swap.h",
   "//third_party/libc++/src/include/__utility/to_underlying.h",
+  "//third_party/libc++/src/include/__utility/try_key_extraction.h",
   "//third_party/libc++/src/include/__utility/unreachable.h",
   "//third_party/libc++/src/include/__variant/monostate.h",
   "//third_party/libc++/src/include/__vector/comparison.h",
diff --git a/naiveproxy/src/buildtools/third_party/libc++/modules.gni b/naiveproxy/src/buildtools/third_party/libc++/modules.gni
index d66d50f55c..3d10cb7811 100644
--- a/naiveproxy/src/buildtools/third_party/libc++/modules.gni
+++ b/naiveproxy/src/buildtools/third_party/libc++/modules.gni
@@ -2,21 +2,21 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/apple/apple_sdk.gni")
 import("//build/config/c++/modules.gni")
 import("//build/config/clang/clang.gni")
-
-if (is_ios) {
-  import("//build/config/ios/ios_sdk.gni")
-  sdk_path = ios_sdk_path
+import("//build/config/compiler/compiler.gni")
+import("//build/config/sysroot.gni")
+if (use_xcode_symlinks) {
+  import("//build/config/apple/mobile_config.gni")
 }
-
-if (is_mac) {
-  import("//build/config/mac/mac_sdk.gni")
-  sdk_path = mac_sdk_path
+if (is_win) {
+  import("//build/toolchain/win/win_toolchain_data.gni")
 }
 
 configs_to_add = [
-  "//buildtools/third_party/libc++:config",
+  "//buildtools/third_party/libc++:extra_flags",
+  "//buildtools/third_party/libc++:stdver",
   "//build/config/compiler:no_chromium_code",
 ]
 
@@ -26,105 +26,278 @@ configs_to_remove = [
 ]
 
 if (use_clang_modules) {
-  template("modulemap") {
+  template("clang_module") {
     source_set(target_name) {
-      forward_variables_from(invoker,
-                             [
-                               "deps",
-                               "public_configs",
-                               "public_deps",
-                             ])
+      forward_variables_from(invoker, "*", [ "modulemap" ])
       use_libcxx_modules = false
       sources = [ invoker.modulemap ]
+      if (!defined(public_deps)) {
+        public_deps = []
+      }
 
-      # By always including all module maps, we can get it to error out if
-      # we attempt to include something not in your dependencies.
-      # Otherwise, it would silently add it to your own AST.
-      cflags = module_map_flags
+      # Implicit module maps won't work on apple because we're currently
+      # missing some dependencies.
+      if (use_autogenerated_modules) {
+        # Explicitly DO NOT use public configs here. If we have two framework
+        # modules foo and bar, and only foo is transitively depended on by
+        # libcxx:
+        # * When building the module for libcxx, we want both -fmodule-map-file
+        #   for both foo and bar, to ensure that if libcxx did depend on bar, we
+        #   would throw an error.
+        # * We may choose not to build bar because it's so rarely used that it
+        #   won't increase performance to precompile it
+        # * If we provide -fmodule-map-file=bar but choose not to build bar,
+        #   then any target that did depend on bar would fail to compile.
+        configs += [ "//buildtools/third_party/libc++:all_modulemap_configs" ]
+        if (!defined(cflags)) {
+          cflags = []
+        }
+
+        # While it'd be nice to enable implicit module maps to pick up on errors
+        # for missing modules, unfortunately then it finds modulemap files we've
+        # intentionally disabled because it's broken (eg. Darwin.modulemap).
+        cflags += [ clang_arg_prefix + "-fno-implicit-module-maps" ]
+      } else {
+        if (use_xcode_symlinks) {
+          # The `copy_sysroot_modulemaps` action depends on SDK paths that differ
+          # between macOS and iOS, so it must be built with the correct toolchain
+          # for the target OS.
+          toolchain = "//build/toolchain/mac:clang_$target_cpu"
+          if (is_ios || target_environment == "catalyst") {
+            toolchain = "//build/toolchain/ios:ios_clang_$target_cpu"
+          } else if (target_os == "ios" && is_mac) {
+            toolchain = "//build/toolchain/mac:clang_$host_cpu"
+          }
+          public_deps += [ "//buildtools/third_party/libc++:copy_sysroot_modulemaps($toolchain)" ]
+        }
+
+        if (!defined(public_configs)) {
+          public_configs = []
+        }
+
+        # By always including all module maps, we can get it to error out if
+        # we attempt to include something not in your dependencies.
+        # Otherwise, it would silently add it to your own AST.
+        public_configs += [
+          "//buildtools/third_party/libc++:builtin_modulemap",
+          "//buildtools/third_party/libc++:libcxx_modulemap",
+          "//buildtools/third_party/libc++:sysroot_modulemaps",
+        ]
+      }
       configs -= configs_to_remove
-      configs += configs_to_add
-    }
-  }
 
-  # When I change sysroot_features from an alias to a group, it omits
-  # -fmodule-file for the aliased target from the command-line.
-  # This seems like it might be a bug in GN, but I'm not waiting for a fix
-  # before submitting this.
-  template("alias") {
-    source_set(target_name) {
-      public_deps = invoker.actual
-      use_libcxx_modules = false
+      # The module needs to use the same version of -std that is used by the
+      # libraries depending on it. Otherwise we get a module config mismatch.
+      configs += configs_to_add - [ "//buildtools/third_party/libc++:stdver" ]
+
+      # Any complex target-specific logic needs to go in here.
+      # The modularize tool supports simple attributes, but not conditional
+      # logic.
+      if (target_name == "std_stdatomic_h" && use_cxx23) {
+        # In cxx23, stdatomic.h uses libcxx's stdatomic rather than the
+        # builtin.
+        public_deps -= [ ":_Builtin_stdatomic" ]
+        public_deps += [ ":std" ]
+      }
     }
   }
 
   template("builtin_module") {
-    # This is a template to build clang builtin's module file.
-    modulemap(target_name) {
+    # This is a template to build modules that reside in clang builtin's module file.
+    clang_module(target_name) {
       forward_variables_from(invoker, "*")
       modulemap = "${clang_base_path}/lib/clang/${clang_version}/include/module.modulemap"
+      if (use_autogenerated_modules) {
+        public_configs = [ "//buildtools/third_party/libc++:builtin_modulemap" ]
+      }
     }
   }
 
   template("libcxx_module") {
-    # This is a template to build libc++'s module file.
-    modulemap(target_name) {
+    # This is a template to build modules that reside in libc++'s module file.
+    clang_module(target_name) {
       forward_variables_from(invoker, "*")
-      modulemap =
-          "${root_gen_dir}/third_party/libc++/src/include/module.modulemap"
+      modulemap = "${root_build_dir}/gen/third_party/libc++/src/include/module.modulemap"
       deps = [
-        "//buildtools/third_party/libc++:copy_custom_headers",
-        "//buildtools/third_party/libc++:copy_libcxx_headers",
+        "//buildtools/third_party/libc++:custom_headers",
+        "//buildtools/third_party/libc++:libcxx_headers",
       ]
+      if (use_autogenerated_modules) {
+        public_configs = [ "//buildtools/third_party/libc++:libcxx_modulemap" ]
+      }
     }
   }
 
-  if (is_apple) {
+  if (use_autogenerated_modules) {
+    template("sysroot_module") {
+      clang_module(target_name) {
+        forward_variables_from(invoker, "*")
+        modulemap = "${target_gen_dir}/module.modulemap"
+        public_configs = [ ":sysroot_modulemap" ]
+      }
+    }
+  } else if (is_apple) {
     template("DarwinBasic_module") {
-      modulemap(target_name) {
+      clang_module(target_name) {
         forward_variables_from(invoker, "*")
         modulemap = "$sdk_path/usr/include/DarwinBasic.modulemap"
-        if (!defined(public_deps)) {
-          public_deps = []
-        }
-        if (is_ios) {
-          public_deps += [ ":copy_sysroot_modulemaps($default_toolchain)" ]
-        }
       }
     }
-    template("DarwinFoundation_module") {
-      modulemap(target_name) {
+    template("DarwinFoundation1_module") {
+      clang_module(target_name) {
         forward_variables_from(invoker, "*")
-        modulemap = "$sdk_path/usr/include/DarwinFoundation.modulemap"
-        if (!defined(public_deps)) {
-          public_deps = []
-        }
-        if (is_ios) {
-          public_deps += [ ":copy_sysroot_modulemaps($default_toolchain)" ]
-        }
+        modulemap = "$sdk_path/usr/include/DarwinFoundation1.modulemap"
       }
     }
-    template("c_standard_library_module") {
-      modulemap(target_name) {
+    template("DarwinFoundation2_module") {
+      clang_module(target_name) {
         forward_variables_from(invoker, "*")
-        modulemap = "$sdk_path/usr/include/c_standard_library.modulemap"
-        if (!defined(public_deps)) {
-          public_deps = []
-        }
-        if (is_ios) {
-          public_deps += [ ":copy_sysroot_modulemaps($default_toolchain)" ]
-        }
+        modulemap = "$sdk_path/usr/include/DarwinFoundation2.modulemap"
+      }
+    }
+    template("DarwinFoundation3_module") {
+      clang_module(target_name) {
+        forward_variables_from(invoker, "*")
+        modulemap = "$sdk_path/usr/include/DarwinFoundation3.modulemap"
       }
     }
   } else {
     template("sysroot_module") {
-      modulemap(target_name) {
+      clang_module(target_name) {
         forward_variables_from(invoker, "*")
         modulemap = sysroot_modulemap
         deps = [
-          ":copy_custom_headers",
-          ":copy_libcxx_headers",
+          ":custom_headers",
+          ":libcxx_headers",
         ]
       }
     }
   }
 }
+
+template("modulemap_config") {
+  config(target_name) {
+    path = rebase_path(invoker.source, root_build_dir)
+    cflags_cc = [ "-fmodule-map-file=${path}" ]
+    swiftflags = [ "-Xcc=-fmodule-map-file=${path}" ]
+  }
+}
+
+template("sysroot_modulemap") {
+  content = read_file(invoker.source, "string")
+  if (is_win) {
+    if (current_cpu == "x64") {
+      win_toolchain_data = win_toolchain_data_x64
+    } else if (current_cpu == "x86") {
+      win_toolchain_data = win_toolchain_data_x86
+    } else if (current_cpu == "arm64") {
+      win_toolchain_data = win_toolchain_data_arm64
+    } else {
+      error("Unsuppported windows CPU, add it to win_toolchain_data.gni")
+    }
+
+    # This must be relative to the directory the modulemap is contained within.
+    content = string_replace(content,
+                             "\$msvc",
+                             rebase_path(win_toolchain_data.msvc_dir,
+                                         target_gen_dir,
+                                         root_build_dir))
+    content = string_replace(content,
+                             "\$windows_kits",
+                             rebase_path(win_toolchain_data.windows_kits_dir,
+                                         target_gen_dir,
+                                         root_build_dir))
+  } else {
+    include_dir = "${sysroot}/usr/include"
+    if (is_fuchsia) {
+      include_dir = "${sysroot}/include"
+    }
+
+    # This must be relative to the directory the modulemap is contained within.
+    content =
+        string_replace(content,
+                       "\$sysroot",
+                       rebase_path(include_dir, target_gen_dir, root_build_dir))
+  }
+  write_file(invoker.out, content)
+
+  modulemap_config(target_name) {
+    source = invoker.out
+  }
+}
+
+template("apple_sysroot_modulemap") {
+  modulemap = "${sysroot_include_dir}/${invoker.sysroot_path}"
+  modulemap_config(target_name) {
+    source = modulemap
+  }
+
+  # sysroot_modulemaps can be inside the build directory. This no-op action
+  # declares the modulemap files as outputs to satisfy GN's dependency
+  # tracking when other targets use them as inputs.
+  rel = string_split(rebase_path(modulemap, root_build_dir), "/")
+  if (rel[0] == "..") {
+    # It's not in the output directory so we can't declare it as an output file.
+    group(target_name + "_file") {
+    }
+  } else {
+    action(target_name + "_file") {
+      script = "//build/noop.py"
+      outputs = [ modulemap ]
+    }
+  }
+}
+
+template("apple_sysroot_module") {
+  clang_module(target_name) {
+    forward_variables_from(invoker,
+                           "*",
+                           [
+                             "modulemap",
+                             "modulemap_path",
+                           ])
+    modulemap = "${sysroot_include_dir}/${invoker.modulemap_path}"
+    public_configs = [ invoker.modulemap ]
+    if (!defined(public_deps)) {
+      public_deps = []
+    }
+
+    # The no-op action above depends on SDK paths that differ between macOS and
+    # iOS, so it must be built with the correct toolchain
+    # for the target OS.
+    if (use_xcode_symlinks) {
+      toolchain = "//build/toolchain/mac:clang_$target_cpu"
+      if (is_ios || target_environment == "catalyst") {
+        toolchain = "//build/toolchain/ios:ios_clang_$target_cpu"
+      } else if (target_os == "ios" && is_mac) {
+        toolchain = "//build/toolchain/mac:clang_$host_cpu"
+      }
+      public_deps += [ "${invoker.modulemap}_file(${toolchain})" ]
+    }
+  }
+}
+
+template("framework_modulemap") {
+  modulemap_config(target_name) {
+    source =
+        "${frameworks_dir}/${invoker.name}.framework/Modules/module.modulemap"
+  }
+}
+
+template("framework_module") {
+  clang_module(target_name) {
+    forward_variables_from(invoker, "*", [ "framework" ])
+
+    # :foo_modulemap -> ${frameworks_dir}/foo.framework/Modules/module.modulemap
+    modulemap = string_replace(
+            string_replace(invoker.modulemap, ":", "${frameworks_dir}/"),
+            "_modulemap",
+            ".framework/Modules/module.modulemap")
+    public_configs = [ invoker.modulemap ]
+
+    cflags = [
+      # Some frameworks don't have proper umbrellas.
+      "-Wno-incomplete-umbrella",
+    ]
+  }
+}
diff --git a/naiveproxy/src/buildtools/third_party/libc++abi/BUILD.gn b/naiveproxy/src/buildtools/third_party/libc++abi/BUILD.gn
index c17d627e61..c2a58f25d8 100644
--- a/naiveproxy/src/buildtools/third_party/libc++abi/BUILD.gn
+++ b/naiveproxy/src/buildtools/third_party/libc++abi/BUILD.gn
@@ -13,7 +13,10 @@ target(libcxxabi_target_type, "libc++abi") {
     visibility = [ "//buildtools/third_party/libc++" ]
   }
 
-  deps = []
+  deps = [
+    "//buildtools/third_party/libc++:custom_headers",
+    "//buildtools/third_party/libc++:libcxx_headers",
+  ]
 
   # Fuchsia builds don't link against any libraries that provide stack
   # unwinding symbols, unlike Linux does with glibc (same applies for Android).
@@ -22,13 +25,6 @@ target(libcxxabi_target_type, "libc++abi") {
     deps += [ "//buildtools/third_party/libunwind" ]
   }
 
-  if (use_clang_modules) {
-    deps += [
-      "//buildtools/third_party/libc++:copy_custom_headers",
-      "//buildtools/third_party/libc++:copy_libcxx_headers",
-    ]
-  }
-
   # TODO(crbug.com/40273848): Move this build file to third_party/libc++/BUILD.gn once submodule migration is done
   sources = [
     "//third_party/libc++abi/src/src/abort_message.cpp",
diff --git a/naiveproxy/src/chrome/VERSION b/naiveproxy/src/chrome/VERSION
index e77853a97a..1ffd92034b 100644
--- a/naiveproxy/src/chrome/VERSION
+++ b/naiveproxy/src/chrome/VERSION
@@ -1,4 +1,4 @@
-MAJOR=140
+MAJOR=143
 MINOR=0
-BUILD=7339
-PATCH=123
+BUILD=7499
+PATCH=109
diff --git a/naiveproxy/src/chrome/android/profiles/newest.txt b/naiveproxy/src/chrome/android/profiles/newest.txt
index 45cd10d324..12e5c2d81f 100644
--- a/naiveproxy/src/chrome/android/profiles/newest.txt
+++ b/naiveproxy/src/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-140.0.7339.100_rc-r1-merged.afdo.bz2
+chromeos-chrome-amd64-143.0.7499.102_rc-r1-merged.afdo.bz2
diff --git a/naiveproxy/src/chrome/build/android-arm32.pgo.txt b/naiveproxy/src/chrome/build/android-arm32.pgo.txt
index 0b5f505e3e..209c9729c0 100644
--- a/naiveproxy/src/chrome/build/android-arm32.pgo.txt
+++ b/naiveproxy/src/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1754308544-6c9fdd52c29e7623172130fc0f5de3ada5060dd6-8f771923c5ae9a6832681bb6441f7779445a972c.profdata
+chrome-android32-main-1761587907-1b430c9d614984fe278e5fe14092ce0c83b9766c-c6c1c9f3d80c31ed89e7145b94ea6e30cea78bf3.profdata
diff --git a/naiveproxy/src/chrome/build/android-arm64.pgo.txt b/naiveproxy/src/chrome/build/android-arm64.pgo.txt
index 026b618071..c3a24ee704 100644
--- a/naiveproxy/src/chrome/build/android-arm64.pgo.txt
+++ b/naiveproxy/src/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-7339-1756848249-3f18e526d8f73f32a6ec7e07625ab7c27d4922b4-85016540b523d8b6da61659b5540e10c08c34bad.profdata
+chrome-android64-7499-1763487101-99a5db67c29d3aedb4b45c8777e293afed3c606f-67a3136aa2d5efc751af3037a364a7521ec65589.profdata
diff --git a/naiveproxy/src/chrome/build/android-desktop-arm64.pgo.txt b/naiveproxy/src/chrome/build/android-desktop-arm64.pgo.txt
index 4c1c64fccc..49edd90c57 100644
--- a/naiveproxy/src/chrome/build/android-desktop-arm64.pgo.txt
+++ b/naiveproxy/src/chrome/build/android-desktop-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android-desktop-arm64-main-1754186741-76eb47e4aa79fdc5e1fc41fbe0a9f93787dc9c91-e69c02481d9a10a6fa2c7ff7c98b0eb483c922b6.profdata
+chrome-android-desktop-arm64-main-1756461135-92315c719e6a2f89e46aab48079e1acf58aa5880-05d475a73c264090f2af9393612481363853df99.profdata
diff --git a/naiveproxy/src/chrome/build/android-desktop-x64.pgo.txt b/naiveproxy/src/chrome/build/android-desktop-x64.pgo.txt
index 06c338c540..1bde0455c1 100644
--- a/naiveproxy/src/chrome/build/android-desktop-x64.pgo.txt
+++ b/naiveproxy/src/chrome/build/android-desktop-x64.pgo.txt
@@ -1 +1 @@
-chrome-android-desktop-x64-main-1754308544-414e0d6f021ab98b3b8851addc568cc42f08908d-8f771923c5ae9a6832681bb6441f7779445a972c.profdata
+chrome-android-desktop-x64-main-1761587907-41681ea8a8206564282b713dcf9ca3d07feeadda-c6c1c9f3d80c31ed89e7145b94ea6e30cea78bf3.profdata
diff --git a/naiveproxy/src/chrome/build/linux.pgo.txt b/naiveproxy/src/chrome/build/linux.pgo.txt
index fcd93a08f5..56fd401349 100644
--- a/naiveproxy/src/chrome/build/linux.pgo.txt
+++ b/naiveproxy/src/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1752989296-3dc3c84b1ea64dfbadeca18145c6e823bab3ff87-3a0e503d2bd87771c1e55103ac2a9a7b59a7411b.profdata
+chrome-linux-7499-1764697213-c882935fa3cd65518c410503710d1c1528e41260-abb34356235cd297f57c1bb9c272d7f54dbe3bd8.profdata
diff --git a/naiveproxy/src/chrome/build/mac-arm.pgo.txt b/naiveproxy/src/chrome/build/mac-arm.pgo.txt
index f76e0b0254..26879aa6d3 100644
--- a/naiveproxy/src/chrome/build/mac-arm.pgo.txt
+++ b/naiveproxy/src/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-7339-1756848249-ed9cb8baeddb344edb6cd72d0eef6a38afe4d447-85016540b523d8b6da61659b5540e10c08c34bad.profdata
+chrome-mac-arm-7499-1764711199-9c486de5019a45d6553ecfa38f72779cb55547fd-8695cde4e8d1c406a67d434e8b12331e42f8581c.profdata
diff --git a/naiveproxy/src/chrome/build/mac.pgo.txt b/naiveproxy/src/chrome/build/mac.pgo.txt
index 9cea966196..790bd6ec68 100644
--- a/naiveproxy/src/chrome/build/mac.pgo.txt
+++ b/naiveproxy/src/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-7339-1756835008-b642d6d242366625c5cc1192d331f94bc64b2e71-1ed65dc990ea30d64c53cf01c7e21b26bfa80e63.profdata
+chrome-mac-7499-1764697213-f7685cf5eb28598c00ebe4cfc06b2e71d494fc18-abb34356235cd297f57c1bb9c272d7f54dbe3bd8.profdata
diff --git a/naiveproxy/src/chrome/build/win-arm64.pgo.txt b/naiveproxy/src/chrome/build/win-arm64.pgo.txt
index 98d72d7a3c..9354fcd23a 100644
--- a/naiveproxy/src/chrome/build/win-arm64.pgo.txt
+++ b/naiveproxy/src/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1753984643-2d9b0172080dc3c51a908c33cad2e3cf9d619714-739f10b7f26e3db54704550f0cea4efc11e28c37.profdata
\ No newline at end of file
+chrome-win-arm64-main-1761587907-776858b2b945af8a5c9022985f095946874b1f33-c6c1c9f3d80c31ed89e7145b94ea6e30cea78bf3.profdata
diff --git a/naiveproxy/src/chrome/build/win32.pgo.txt b/naiveproxy/src/chrome/build/win32.pgo.txt
index 8cfe11c686..cac087432e 100644
--- a/naiveproxy/src/chrome/build/win32.pgo.txt
+++ b/naiveproxy/src/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-7339-1756835008-f91201edc384400768926af2b13b6dedd04462d9-1ed65dc990ea30d64c53cf01c7e21b26bfa80e63.profdata
+chrome-win32-7499-1762559831-5b11d9b74bead6213c8863f92adb88553a88effb-001cae1b38e03d8de079469153eaa396f356d723.profdata
diff --git a/naiveproxy/src/chrome/build/win64.pgo.txt b/naiveproxy/src/chrome/build/win64.pgo.txt
index 4940a9b34c..9d57181811 100644
--- a/naiveproxy/src/chrome/build/win64.pgo.txt
+++ b/naiveproxy/src/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-7339-1756835008-2d312b4b7bb945e1e6cdb266a5434c0ec6ab1f97-1ed65dc990ea30d64c53cf01c7e21b26bfa80e63.profdata
+chrome-win64-7499-1762559831-13a318988c984bc29af5b9ccf377263ab2389205-001cae1b38e03d8de079469153eaa396f356d723.profdata
diff --git a/naiveproxy/src/chrome/version.gni b/naiveproxy/src/chrome/version.gni
index 7e7c4a838f..90b0e520e7 100644
--- a/naiveproxy/src/chrome/version.gni
+++ b/naiveproxy/src/chrome/version.gni
@@ -43,13 +43,16 @@ if (target_os == "android") {
 
   _version_dictionary_template +=
       "chrome_version_code = " + "\"@CHROME_VERSION_CODE@\" " +
+      "chrome_beta_version_code = " + "\"@CHROME_MODERN_VERSION_CODE@\" " +
+      "chrome_auto_version_code = " + "\"@MONOCHROME_VERSION_CODE@\" " +
+      "chrome_desktop_version_code = \"@CHROME_DESKTOP_VERSION_CODE@\" " +
       "monochrome_version_code = \"@MONOCHROME_VERSION_CODE@\" " +
       "trichrome_version_code = \"@TRICHROME_VERSION_CODE@\" " +
       "trichrome_auto_version_code = \"@TRICHROME_AUTO_VERSION_CODE@\" " +
       "trichrome_beta_version_code = \"@TRICHROME_BETA_VERSION_CODE@\" " +
       "webview_stable_version_code = \"@WEBVIEW_STABLE_VERSION_CODE@\" " +
       "webview_beta_version_code = \"@WEBVIEW_BETA_VERSION_CODE@\" " +
-      "webview_dev_version_code = \"@WEBVIEW_DEV_VERSION_CODE@\" "
+      "webview_auto_version_code = \"@WEBVIEW_AUTO_VERSION_CODE@\" "
 
   # Generate hybrid configurations for target_cpu's that can run in hybrid configurations.
   # i.e. "riscv64" does not show up in this list, as it's a 64-bit-only target_cpu.
@@ -92,24 +95,36 @@ if (target_os == "android") {
     if (target_cpu == "arm64") {
       _version_dictionary_template += "trichrome_64_32_high_beta_version_code = \"@TRICHROME_64_32_HIGH_BETA_VERSION_CODE@\" "
     }
+
     _version_dictionary_template +=
         "webview_32_stable_version_code = \"@WEBVIEW_32_STABLE_VERSION_CODE@\" "
-    _version_dictionary_template +=
-        "webview_32_beta_version_code = \"@WEBVIEW_32_BETA_VERSION_CODE@\" "
-    _version_dictionary_template +=
-        "webview_32_dev_version_code = \"@WEBVIEW_32_DEV_VERSION_CODE@\" "
-    _version_dictionary_template +=
-        "webview_64_stable_version_code = \"@WEBVIEW_64_STABLE_VERSION_CODE@\" "
-    _version_dictionary_template +=
-        "webview_64_beta_version_code = \"@WEBVIEW_64_BETA_VERSION_CODE@\" "
-    _version_dictionary_template +=
-        "webview_64_dev_version_code = \"@WEBVIEW_64_DEV_VERSION_CODE@\" "
     _version_dictionary_template += "webview_32_64_stable_version_code = \"@WEBVIEW_32_64_STABLE_VERSION_CODE@\" "
     _version_dictionary_template +=
-        "webview_64_32_dev_version_code = \"@WEBVIEW_64_32_DEV_VERSION_CODE@\" "
-    _version_dictionary_template += "webview_64_32_beta_version_code = \"@WEBVIEW_64_32_BETA_VERSION_CODE@\" "
+        "webview_64_stable_version_code = \"@WEBVIEW_64_STABLE_VERSION_CODE@\" "
     _version_dictionary_template += "webview_64_32_stable_version_code = \"@WEBVIEW_64_32_STABLE_VERSION_CODE@\" "
-    _version_dictionary_template += "webview_64_32_high_stable_version_code = \"@WEBVIEW_64_32_HIGH_STABLE_VERSION_CODE@\" "
+    if (target_cpu == "arm64") {
+      _version_dictionary_template += "webview_64_32_high_stable_version_code = \"@WEBVIEW_64_32_HIGH_STABLE_VERSION_CODE@\" "
+    }
+
+    _version_dictionary_template +=
+        "webview_32_beta_version_code = \"@WEBVIEW_32_BETA_VERSION_CODE@\" "
+    _version_dictionary_template += "webview_32_64_beta_version_code = \"@WEBVIEW_32_64_BETA_VERSION_CODE@\" "
+    _version_dictionary_template +=
+        "webview_64_beta_version_code = \"@WEBVIEW_64_BETA_VERSION_CODE@\" "
+    _version_dictionary_template += "webview_64_32_beta_version_code = \"@WEBVIEW_64_32_BETA_VERSION_CODE@\" "
+    if (target_cpu == "arm64") {
+      _version_dictionary_template += "webview_64_32_high_beta_version_code = \"@WEBVIEW_64_32_HIGH_BETA_VERSION_CODE@\" "
+    }
+
+    _version_dictionary_template +=
+        "webview_auto_32_version_code = \"@WEBVIEW_AUTO_32_VERSION_CODE@\" "
+    _version_dictionary_template += "webview_auto_32_64_version_code = \"@WEBVIEW_AUTO_32_64_VERSION_CODE@\" "
+    _version_dictionary_template +=
+        "webview_auto_64_version_code = \"@WEBVIEW_AUTO_64_VERSION_CODE@\" "
+    _version_dictionary_template += "webview_auto_64_32_version_code = \"@WEBVIEW_AUTO_64_32_VERSION_CODE@\" "
+    if (target_cpu == "arm64") {
+      _version_dictionary_template += "webview_auto_64_32_high_version_code = \"@WEBVIEW_AUTO_64_32_HIGH_VERSION_CODE@\" "
+    }
   }
 
   _script_arguments += [
@@ -154,6 +169,9 @@ if (is_mac) {
   forward_variables_from(_result,
                          [
                            "chrome_version_code",
+                           "chrome_beta_version_code",
+                           "chrome_auto_version_code",
+                           "chrome_desktop_version_code",
                            "chrome_32_version_code",
                            "monochrome_version_code",
                            "monochrome_32_version_code",
@@ -180,19 +198,23 @@ if (is_mac) {
                            "trichrome_64_32_high_beta_version_code",
                            "trichrome_64_beta_version_code",
                            "webview_beta_version_code",
-                           "webview_dev_version_code",
                            "webview_stable_version_code",
                            "webview_32_beta_version_code",
-                           "webview_32_dev_version_code",
                            "webview_32_stable_version_code",
                            "webview_64_beta_version_code",
-                           "webview_64_dev_version_code",
                            "webview_64_stable_version_code",
+                           "webview_32_64_beta_version_code",
                            "webview_32_64_stable_version_code",
-                           "webview_64_32_dev_version_code",
                            "webview_64_32_beta_version_code",
                            "webview_64_32_stable_version_code",
+                           "webview_64_32_high_beta_version_code",
                            "webview_64_32_high_stable_version_code",
+                           "webview_auto_version_code",
+                           "webview_auto_32_version_code",
+                           "webview_auto_32_64_version_code",
+                           "webview_auto_64_version_code",
+                           "webview_auto_64_32_version_code",
+                           "webview_auto_64_32_high_version_code",
                          ])
 
   chrome_version_name = chrome_version_full
@@ -202,7 +224,9 @@ if (is_mac) {
     trichrome_64_32_high_beta_version_code = trichrome_64_32_beta_version_code
     trichrome_64_32_high_version_code = trichrome_64_32_version_code
     trichrome_auto_64_32_high_version_code = trichrome_auto_64_32_version_code
+    webview_64_32_high_beta_version_code = webview_64_32_beta_version_code
     webview_64_32_high_stable_version_code = webview_64_32_stable_version_code
+    webview_auto_64_32_high_version_code = webview_auto_64_32_version_code
   }
 }
 
@@ -210,15 +234,24 @@ if (is_android && current_toolchain == default_toolchain) {
   lines_to_write = [
     "VersionName: $chrome_version_name",
     "Chrome: $chrome_version_code",
-    "Monochrome: $monochrome_version_code",
+    "ChromeOpenBeta: $chrome_beta_version_code",
+    "ChromeAuto: $chrome_auto_version_code",
     "TrichromeChrome: $trichrome_version_code",
     "TrichromeChromeOpenBeta: $trichrome_beta_version_code",
     "TrichromeChromeAuto: $trichrome_auto_version_code",
+    "AndroidWebview: $webview_stable_version_code",
+    "AndroidWebviewOpenBeta: $webview_beta_version_code",
     "AndroidWebviewStable: $webview_stable_version_code",
     "AndroidWebviewBeta: $webview_beta_version_code",
-    "AndroidWebviewDev: $webview_dev_version_code",
+    "AndroidWebviewAuto: $webview_auto_version_code",
   ]
 
+  if (android_64bit_target_cpu) {
+    lines_to_write += [
+      "ChromeDesktop: $chrome_desktop_version_code",
+    ]
+  }
+
   if (android_64bit_target_cpu && defined(android_app_secondary_abi)) {
     lines_to_write += [
       "Monochrome32: $monochrome_32_version_code",
@@ -234,11 +267,21 @@ if (is_android && current_toolchain == default_toolchain) {
       "TrichromeChromeAuto64: $trichrome_auto_64_version_code",
       "TrichromeChromeAuto6432: $trichrome_auto_64_32_version_code",
       "TrichromeChromeDesktop64: $trichrome_desktop_64_version_code",
+      "AndroidWebview3264: $webview_32_64_stable_version_code",
+      "AndroidWebview64: $webview_64_stable_version_code",
+      "AndroidWebview6432: $webview_64_32_stable_version_code",
+      "AndroidWebview32: $webview_32_stable_version_code",
+      "AndroidWebviewAuto32: $webview_auto_32_version_code",
+      "AndroidWebviewAuto3264: $webview_auto_32_64_version_code",
+      "AndroidWebviewAuto64: $webview_auto_64_version_code",
+      "AndroidWebviewAuto6432: $webview_auto_64_32_version_code",
     ]
     if (target_cpu == "arm64") {
       lines_to_write += [
         "TrichromeChrome6432High: $trichrome_64_32_high_version_code",
         "TrichromeChromeAuto6432High: $trichrome_auto_64_32_high_version_code",
+        "AndroidWebview6432High: $webview_64_32_high_stable_version_code",
+        "AndroidWebviewAuto6432High: $webview_auto_64_32_high_version_code",
       ]
     }
     lines_to_write += [
@@ -246,17 +289,22 @@ if (is_android && current_toolchain == default_toolchain) {
       "TrichromeChrome3264OpenBeta: $trichrome_32_64_beta_version_code",
       "TrichromeChrome6432OpenBeta: $trichrome_64_32_beta_version_code",
       "TrichromeChrome64OpenBeta: $trichrome_64_beta_version_code",
+      "AndroidWebview32OpenBeta: $webview_32_beta_version_code",
+      "AndroidWebview3264OpenBeta: $webview_32_64_beta_version_code",
+      "AndroidWebview6432OpenBeta: $webview_64_32_beta_version_code",
+      "AndroidWebview64OpenBeta: $webview_64_beta_version_code",
     ]
     if (target_cpu == "arm64") {
-      lines_to_write += [ "TrichromeChrome6432HighOpenBeta: $trichrome_64_32_high_beta_version_code" ]
+      lines_to_write += [
+        "TrichromeChrome6432HighOpenBeta: $trichrome_64_32_high_beta_version_code",
+        "AndroidWebview6432HighOpenBeta: $webview_64_32_high_beta_version_code",
+      ]
     }
     lines_to_write += [
       "AndroidWebview32Stable: $webview_32_stable_version_code",
       "AndroidWebview32Beta: $webview_32_beta_version_code",
-      "AndroidWebview32Dev: $webview_32_dev_version_code",
       "AndroidWebview64Stable: $webview_64_stable_version_code",
       "AndroidWebview64Beta: $webview_64_beta_version_code",
-      "AndroidWebview64Dev: $webview_64_dev_version_code",
     ]
   }
 
@@ -268,6 +316,17 @@ if (is_android) {
   import("//build/config/android/config.gni")
   import("//build/config/chrome_build.gni")
 
+  _use_stable_package_name_for_trichrome =
+      use_stable_package_name_for_trichrome && android_channel == "beta"
+
+  # Changing chrome_version_code here to prevent different output
+  # in the android_chrome_versions.txt above
+  if (_use_stable_package_name_for_trichrome) {
+    chrome_version_code = chrome_beta_version_code
+  } else if (is_desktop_android) {
+    chrome_version_code = chrome_desktop_version_code
+  }
+
   # Lookup tables for version codes.
   # For the list of configurations that exist, see:
   #     https://chromium.googlesource.com/chromium/src/+/main/docs/android_native_libraries.md#build-variants-eg_monochrome_64_32_apk
@@ -277,9 +336,6 @@ if (is_android) {
 
   # Key: {android_64bit_target_cpu}_{is_64_bit_browser}_{include_64_bit_webview}_{include_32_bit_webview}
   TRICHROME_VERSION_MAP = {
-    _use_stable_package_name_for_trichrome =
-        use_stable_package_name_for_trichrome && android_channel == "beta"
-
     # 64-bit constants are not generated by version.py on non-64-bit target_cpu.
     if (android_64bit_target_cpu) {
       # hybrid constants are not generated by version.py on non-64-bit-only target_cpu.
@@ -340,21 +396,28 @@ if (is_android) {
     }
   }
 
+  # We use the beta version code in one of two cases:
+  # 1- For old standalone settings: we check (android_channel == "beta")
+  # 2- For new standalone settings: we check (android_channel == "beta" && use_stable_package_name_for_trichrome)
+  _use_beta_version_code =
+      (!enable_new_standalone_webview_settings && android_channel == "beta") ||
+      (enable_new_standalone_webview_settings &&
+       _use_stable_package_name_for_trichrome)
+
   # Key: {android_64bit_target_cpu}_{is_64_bit_browser}_{include_64_bit_webview}_{include_32_bit_webview}
   WEBVIEW_VERSION_MAP = {
     # 64-bit constants are not generated by version.py on non-64-bit target_cpu.
     if (android_64bit_target_cpu) {
       if (defined(android_app_secondary_abi)) {
-        if (android_channel == "dev") {
-          true_false_false_true = webview_32_dev_version_code
-          true_true_true_false = webview_64_dev_version_code
-          true_false_true_true = webview_dev_version_code
-          true_true_true_true = webview_64_32_dev_version_code
-        } else if (android_channel == "beta") {
+        if (_use_beta_version_code) {
           true_false_false_true = webview_32_beta_version_code
           true_true_true_false = webview_64_beta_version_code
           true_false_true_true = webview_beta_version_code
-          true_true_true_true = webview_64_32_beta_version_code
+          if (is_high_end_android) {
+            true_true_true_true = webview_64_32_high_beta_version_code
+          } else {
+            true_true_true_true = webview_64_32_beta_version_code
+          }
         } else {
           if (is_high_end_android) {
             true_true_true_true = webview_64_32_high_stable_version_code
@@ -366,9 +429,7 @@ if (is_android) {
           true_false_true_true = webview_stable_version_code
         }
       } else {
-        if (android_channel == "dev") {
-          true_true_true_false = webview_dev_version_code
-        } else if (android_channel == "beta") {
+        if (_use_beta_version_code) {
           true_true_true_false = webview_beta_version_code
         } else {
           true_true_true_false = webview_stable_version_code
@@ -376,9 +437,7 @@ if (is_android) {
       }
     } else {
       # !android_64bit_target_cpu
-      if (android_channel == "dev") {
-        false_false_false_true = webview_dev_version_code
-      } else if (android_channel == "beta") {
+      if (_use_beta_version_code) {
         false_false_false_true = webview_beta_version_code
       } else {
         false_false_false_true = webview_stable_version_code
diff --git a/naiveproxy/src/components/cbor/BUILD.gn b/naiveproxy/src/components/cbor/BUILD.gn
new file mode 100644
index 0000000000..7f5389c6de
--- /dev/null
+++ b/naiveproxy/src/components/cbor/BUILD.gn
@@ -0,0 +1,23 @@
+# Copyright 2017 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+component("cbor") {
+  sources = [
+    "constants.h",
+    "diagnostic_writer.cc",
+    "diagnostic_writer.h",
+    "float_conversions.cc",
+    "float_conversions.h",
+    "reader.cc",
+    "reader.h",
+    "values.cc",
+    "values.h",
+    "writer.cc",
+    "writer.h",
+  ]
+
+  defines = [ "CBOR_IMPLEMENTATION" ]
+
+  deps = [ "//base" ]
+}
diff --git a/naiveproxy/src/components/cbor/DIR_METADATA b/naiveproxy/src/components/cbor/DIR_METADATA
new file mode 100644
index 0000000000..27aa00bf2b
--- /dev/null
+++ b/naiveproxy/src/components/cbor/DIR_METADATA
@@ -0,0 +1,7 @@
+monorail: {
+  component: "Blink>WebAuthentication"
+}
+team_email: "security-dev@chromium.org"
+buganizer_public: {
+  component_id: 1456855
+}
diff --git a/naiveproxy/src/components/cbor/OWNERS b/naiveproxy/src/components/cbor/OWNERS
new file mode 100644
index 0000000000..125c883b48
--- /dev/null
+++ b/naiveproxy/src/components/cbor/OWNERS
@@ -0,0 +1,2 @@
+engedy@chromium.org
+file://base/SECURITY_OWNERS
diff --git a/naiveproxy/src/components/cbor/cbor_export.h b/naiveproxy/src/components/cbor/cbor_export.h
new file mode 100644
index 0000000000..410d555d41
--- /dev/null
+++ b/naiveproxy/src/components/cbor/cbor_export.h
@@ -0,0 +1,25 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_CBOR_CBOR_EXPORT_H_
+#define COMPONENTS_CBOR_CBOR_EXPORT_H_
+
+#if defined(COMPONENT_BUILD)
+#if defined(WIN32)
+
+#if defined(CBOR_IMPLEMENTATION)
+#define CBOR_EXPORT __declspec(dllexport)
+#else
+#define CBOR_EXPORT __declspec(dllimport)
+#endif  // defined(CBOR_IMPLEMENTATION)
+
+#else  // defined(WIN32)
+#define CBOR_EXPORT __attribute__((visibility("default")))
+#endif
+
+#else  // defined(COMPONENT_BUILD)
+#define CBOR_EXPORT
+#endif
+
+#endif  // COMPONENTS_CBOR_CBOR_EXPORT_H_
diff --git a/naiveproxy/src/components/cbor/constants.h b/naiveproxy/src/components/cbor/constants.h
new file mode 100644
index 0000000000..df2a0a559b
--- /dev/null
+++ b/naiveproxy/src/components/cbor/constants.h
@@ -0,0 +1,37 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_CBOR_CONSTANTS_H_
+#define COMPONENTS_CBOR_CONSTANTS_H_
+
+#include 
+
+namespace cbor {
+namespace constants {
+
+// Mask selecting the low-order 5 bits of the "initial byte", which is where
+// the additional information is encoded.
+static constexpr uint8_t kAdditionalInformationMask = 0x1F;
+// Mask selecting the high-order 3 bits of the "initial byte", which indicates
+// the major type of the encoded value.
+static constexpr uint8_t kMajorTypeMask = 0xE0;
+// Indicates the number of bits the "initial byte" needs to be shifted to the
+// right after applying |kMajorTypeMask| to produce the major type in the
+// lowermost bits.
+static constexpr uint8_t kMajorTypeBitShift = 5u;
+// Indicates the integer is in the following byte.
+static constexpr uint8_t kAdditionalInformation1Byte = 24u;
+// Indicates the integer is in the next 2 bytes.
+static constexpr uint8_t kAdditionalInformation2Bytes = 25u;
+// Indicates the integer is in the next 4 bytes.
+static constexpr uint8_t kAdditionalInformation4Bytes = 26u;
+// Indicates the integer is in the next 8 bytes.
+static constexpr uint8_t kAdditionalInformation8Bytes = 27u;
+
+extern const char kUnsupportedMajorType[];
+
+}  // namespace constants
+}  // namespace cbor
+
+#endif  // COMPONENTS_CBOR_CONSTANTS_H_
diff --git a/naiveproxy/src/components/cbor/diagnostic_writer.cc b/naiveproxy/src/components/cbor/diagnostic_writer.cc
new file mode 100644
index 0000000000..37d3f5513e
--- /dev/null
+++ b/naiveproxy/src/components/cbor/diagnostic_writer.cc
@@ -0,0 +1,168 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/cbor/diagnostic_writer.h"
+
+#include 
+
+#include "base/json/string_escape.h"
+#include "base/notreached.h"
+#include "base/numerics/clamped_math.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/stringprintf.h"
+#include "components/cbor/constants.h"
+#include "components/cbor/values.h"
+
+using base::ClampAdd;
+using base::ClampMul;
+
+namespace cbor {
+
+static bool AppendHex(const std::vector bytes,
+                      char type_char,
+                      size_t rough_max_output_bytes,
+                      std::string* s) {
+  if (s->size() > rough_max_output_bytes) {
+    return false;
+  }
+
+  const size_t hex_size = ClampMul(2u, bytes.size());
+  // If the hex string would be longer than 87.5% of the total output space, or
+  // if it would cause the current string to be too long, replace it with an
+  // indication of its length. (87.5% was chosen because it's easy to
+  // calculate and is reasonable.)
+  if (hex_size > rough_max_output_bytes - (rough_max_output_bytes >> 3) ||
+      ClampAdd(s->size(), hex_size) >= rough_max_output_bytes) {
+    s->append(base::StringPrintf("(%zu bytes)", bytes.size()));
+  } else {
+    s->push_back(type_char);
+    s->push_back('\'');
+    s->append(base::HexEncode(bytes));
+    s->push_back('\'');
+  }
+
+  return s->size() < rough_max_output_bytes;
+}
+
+static bool Serialize(const Value& node,
+                      size_t rough_max_output_bytes,
+                      std::string* s) {
+  switch (node.type()) {
+    case Value::Type::UNSIGNED:
+      s->append(base::NumberToString(node.GetUnsigned()));
+      break;
+
+    case Value::Type::NEGATIVE:
+      s->append(base::NumberToString(node.GetNegative()));
+      break;
+
+    case Value::Type::INVALID_UTF8:
+      if (!AppendHex(node.GetInvalidUTF8(), 's', rough_max_output_bytes, s)) {
+        return false;
+      }
+      break;
+
+    case Value::Type::BYTE_STRING:
+      if (!AppendHex(node.GetBytestring(), 'h', rough_max_output_bytes, s)) {
+        return false;
+      }
+      break;
+
+    case Value::Type::STRING: {
+      std::string quoted_and_escaped;
+      base::EscapeJSONString(node.GetString(), /*put_in_quotes=*/true,
+                             "ed_and_escaped);
+      if (ClampAdd(s->size(), quoted_and_escaped.size()) >
+          rough_max_output_bytes) {
+        return false;
+      }
+      s->append(quoted_and_escaped);
+      break;
+    }
+
+    case Value::Type::ARRAY: {
+      s->push_back('[');
+
+      const Value::ArrayValue& nodes = node.GetArray();
+      bool first = true;
+      for (const auto& subnode : nodes) {
+        if (!first) {
+          s->append(", ");
+        }
+        if (!Serialize(subnode, rough_max_output_bytes, s) ||
+            s->size() > rough_max_output_bytes) {
+          return false;
+        }
+        first = false;
+      }
+
+      s->push_back(']');
+      break;
+    }
+
+    case Value::Type::MAP: {
+      s->push_back('{');
+
+      const Value::MapValue& nodes = node.GetMap();
+      bool first = true;
+      for (const auto& pair : nodes) {
+        if (!first) {
+          s->append(", ");
+        }
+        if (!Serialize(pair.first, rough_max_output_bytes, s)) {
+          return false;
+        }
+        s->append(": ");
+        if (!Serialize(pair.second, rough_max_output_bytes, s) ||
+            s->size() > rough_max_output_bytes) {
+          return false;
+        }
+        first = false;
+      }
+
+      s->push_back('}');
+      break;
+    }
+
+    case Value::Type::SIMPLE_VALUE:
+      switch (node.GetSimpleValue()) {
+        case Value::SimpleValue::FALSE_VALUE:
+          s->append("false");
+          break;
+        case Value::SimpleValue::TRUE_VALUE:
+          s->append("true");
+          break;
+        case Value::SimpleValue::NULL_VALUE:
+          s->append("null");
+          break;
+        case Value::SimpleValue::UNDEFINED:
+          s->append("undefined");
+          break;
+        default:
+          NOTREACHED();
+      }
+      break;
+    case Value::Type::FLOAT_VALUE:
+      s->append(base::NumberToString(node.GetDouble()));
+      break;
+    case Value::Type::NONE:
+      s->append("none");
+      break;
+
+    case Value::Type::TAG:
+      NOTREACHED();
+  }
+
+  return true;
+}
+
+// static
+std::string DiagnosticWriter::Write(const Value& node,
+                                    size_t rough_max_output_bytes) {
+  std::string ret;
+  Serialize(node, rough_max_output_bytes, &ret);
+  return ret;
+}
+
+}  // namespace cbor
diff --git a/naiveproxy/src/components/cbor/diagnostic_writer.h b/naiveproxy/src/components/cbor/diagnostic_writer.h
new file mode 100644
index 0000000000..77f17d2cea
--- /dev/null
+++ b/naiveproxy/src/components/cbor/diagnostic_writer.h
@@ -0,0 +1,29 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_CBOR_DIAGNOSTIC_WRITER_H_
+#define COMPONENTS_CBOR_DIAGNOSTIC_WRITER_H_
+
+#include 
+
+#include "components/cbor/cbor_export.h"
+
+namespace cbor {
+
+class Value;
+
+class CBOR_EXPORT DiagnosticWriter {
+ public:
+  // Write converts the given CBOR value to a compact string, following the
+  // "Diagnostic Notation" format for CBOR
+  // (https://tools.ietf.org/html/rfc7049#section-6). |rough_max_output_bytes|
+  // provides a loose upper bound on the size of the result and the result may
+  // be truncated if it exceeds this size.
+  static std::string Write(const Value& node,
+                           size_t rough_max_output_bytes = 4096);
+};
+
+}  // namespace cbor
+
+#endif  // COMPONENTS_CBOR_DIAGNOSTIC_WRITER_H_
diff --git a/naiveproxy/src/components/cbor/float_conversions.cc b/naiveproxy/src/components/cbor/float_conversions.cc
new file mode 100644
index 0000000000..1ffcf43100
--- /dev/null
+++ b/naiveproxy/src/components/cbor/float_conversions.cc
@@ -0,0 +1,82 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include 
+#include 
+#include 
+
+namespace cbor {
+
+// This is adapted from the example in RFC8949 appendix D.
+double DecodeHalfPrecisionFloat(uint16_t value) {
+  uint16_t half = value;
+  uint16_t exp = (half >> 10) & 0x1f;  // 5 bit exponent
+  uint16_t mant = half & 0x3ff;        // 10 bit mantissa
+  double val;
+
+  if (exp == 0) {
+    // Handle denormalized case
+    val = std::ldexp(mant, -24);
+  } else if (exp != 31) {
+    // Handle normal case
+    val = std::ldexp(mant + 1024, exp - 25);
+  } else {
+    // Handle special cases.
+    if (mant == 0) {
+      val = std::numeric_limits::infinity();
+    } else {
+      val = std::numeric_limits::quiet_NaN();
+    }
+  }
+  // Handle sign bit.
+  return half & 0x8000 ? -val : val;
+}
+
+uint16_t EncodeHalfPrecisionFloat(double input) {
+  int exp = 0;
+  uint16_t mantissa = 0;
+
+  double abs_value = std::abs(input);
+  // First handle special cases.
+  if (!std::isfinite(input)) {
+    // Set all-ones for exponent as a flag.
+    exp = 0x1F;
+    if (std::isnan(input)) {
+      // A NaN value has a nonzero mantissa
+      mantissa = 1;
+    }  // else - infinity
+  } else if (abs_value == 0.0) {
+    // This is a special case because it's not handled well with frexp().
+    exp = 0;
+    mantissa = 0;
+  } else {
+    int normal_exp;
+    double normal_value = std::frexp(abs_value, &normal_exp);
+
+    // frexp returns numbers in the range [0.5,1) instead of the usual [1,2)
+    // range used for the floating point mantissa so we need to offset the
+    // exponent by one through the below.
+
+    // Half-precision uses an offset of 15 for the exponent. We already have 1
+    // from the frexp so we just increase it by 14.
+    exp = 14 + normal_exp;
+    if (exp <= 0) {
+      // Denormalized numbers. We don't remove the MSB in this case.
+      mantissa = std::ldexp(normal_value, 10 + exp);
+      exp = 0;
+    } else {
+      // Handle the normal case. We remove the MSB by subtracting 0.5. Then we
+      // use an exponent of 11 here instead of 10 because we're in the [0.5, 1)
+      // range and need the full 10 bits of precision.
+      mantissa = std::ldexp(normal_value - 0.5, 11);
+    }
+  }
+  uint16_t result = exp << 10 | mantissa;
+  if (std::copysign(1, input) < 0) {
+    result |= 0x8000;
+  }
+  return result;
+}
+
+}  // namespace cbor
diff --git a/naiveproxy/src/components/cbor/float_conversions.h b/naiveproxy/src/components/cbor/float_conversions.h
new file mode 100644
index 0000000000..5b032d0d59
--- /dev/null
+++ b/naiveproxy/src/components/cbor/float_conversions.h
@@ -0,0 +1,23 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_CBOR_FLOAT_CONVERSIONS_H_
+#define COMPONENTS_CBOR_FLOAT_CONVERSIONS_H_
+
+#include 
+
+namespace cbor {
+
+// Convert the half-precision float in the provided `value` to a double
+// precision floating point number.
+double DecodeHalfPrecisionFloat(uint16_t value);
+
+// Convert the double precision float in the provided `value` to a
+// half-precision floating point number. The output is only meaningful if the
+// value can be represented in half-precision.
+uint16_t EncodeHalfPrecisionFloat(double value);
+
+}  // namespace cbor
+
+#endif  // COMPONENTS_CBOR_FLOAT_CONVERSIONS_H_
diff --git a/naiveproxy/src/components/cbor/reader.cc b/naiveproxy/src/components/cbor/reader.cc
new file mode 100644
index 0000000000..827d79aeef
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader.cc
@@ -0,0 +1,508 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/cbor/reader.h"
+
+#include 
+
+#include 
+#include 
+#include 
+
+#include "base/bit_cast.h"
+#include "base/check_op.h"
+#include "base/notreached.h"
+#include "base/numerics/checked_math.h"
+#include "base/numerics/safe_conversions.h"
+#include "base/strings/string_util.h"
+#include "components/cbor/constants.h"
+#include "components/cbor/float_conversions.h"
+
+namespace cbor {
+
+namespace constants {
+const char kUnsupportedMajorType[] = "Unsupported major type.";
+}
+
+namespace {
+
+Value::Type GetMajorType(uint8_t initial_data_byte) {
+  return static_cast(
+      (initial_data_byte & constants::kMajorTypeMask) >>
+      constants::kMajorTypeBitShift);
+}
+
+uint8_t GetAdditionalInfo(uint8_t initial_data_byte) {
+  return initial_data_byte & constants::kAdditionalInformationMask;
+}
+
+// Error messages that correspond to each of the error codes. There is 1
+// exception: we declare |kUnsupportedMajorType| in constants.h in the
+// `constants` namespace, because we use it in several files.
+const char kNoError[] = "Successfully deserialized to a CBOR value.";
+const char kUnknownAdditionalInfo[] =
+    "Unknown additional info format in the first byte.";
+const char kIncompleteCBORData[] =
+    "Prematurely terminated CBOR data byte array.";
+const char kIncorrectMapKeyType[] =
+    "Specified map key type is not supported by the current implementation.";
+const char kTooMuchNesting[] = "Too much nesting.";
+const char kInvalidUTF8[] =
+    "String encodings other than UTF-8 are not allowed.";
+const char kExtraneousData[] = "Trailing data bytes are not allowed.";
+const char kMapKeyOutOfOrder[] =
+    "Map keys must be strictly monotonically increasing based on byte length "
+    "and then by byte-wise lexical order.";
+const char kNonMinimalCBOREncoding[] =
+    "Unsigned integers must be encoded with minimum number of bytes.";
+const char kUnsupportedSimpleValue[] =
+    "Unsupported or unassigned simple value.";
+const char kUnsupportedFloatingPointValue[] =
+    "Floating point numbers are not supported unless the "
+    "`allow_floating_point` configuration option is set.";
+const char kOutOfRangeIntegerValue[] =
+    "Integer values must be between INT64_MIN and INT64_MAX.";
+const char kMapKeyDuplicate[] = "Duplicate map keys are not allowed.";
+const char kUnknownError[] = "An unknown error occured.";
+
+}  // namespace
+
+Reader::Config::Config() = default;
+Reader::Config::~Config() = default;
+
+Reader::Reader(base::span data)
+    : rest_(data), error_code_(DecoderError::CBOR_NO_ERROR) {}
+Reader::~Reader() = default;
+
+// static
+std::optional Reader::Read(base::span data,
+                                  DecoderError* error_code_out,
+                                  int max_nesting_level) {
+  Config config;
+  config.error_code_out = error_code_out;
+  config.max_nesting_level = max_nesting_level;
+
+  return Read(data, config);
+}
+
+// static
+std::optional Reader::Read(base::span data,
+                                  size_t* num_bytes_consumed,
+                                  DecoderError* error_code_out,
+                                  int max_nesting_level) {
+  DCHECK(num_bytes_consumed);
+
+  Config config;
+  config.num_bytes_consumed = num_bytes_consumed;
+  config.error_code_out = error_code_out;
+  config.max_nesting_level = max_nesting_level;
+
+  return Read(data, config);
+}
+
+// static
+std::optional Reader::Read(base::span data,
+                                  const Config& config) {
+  Reader reader(data);
+  std::optional value =
+      reader.DecodeCompleteDataItem(config, config.max_nesting_level);
+
+  auto error = reader.GetErrorCode();
+  const bool success = value.has_value();
+  DCHECK_EQ(success, error == DecoderError::CBOR_NO_ERROR);
+
+  if (config.num_bytes_consumed) {
+    *config.num_bytes_consumed =
+        success ? data.size() - reader.num_bytes_remaining() : 0;
+  } else if (success && reader.num_bytes_remaining() > 0) {
+    error = DecoderError::EXTRANEOUS_DATA;
+    value.reset();
+  }
+
+  if (config.error_code_out) {
+    *config.error_code_out = error;
+  }
+
+  return value;
+}
+
+std::optional Reader::DecodeCompleteDataItem(const Config& config,
+                                                    int max_nesting_level) {
+  if (max_nesting_level < 0 || max_nesting_level > kCBORMaxDepth) {
+    error_code_ = DecoderError::TOO_MUCH_NESTING;
+    return std::nullopt;
+  }
+
+  std::optional header = DecodeDataItemHeader();
+  if (!header.has_value()) {
+    return std::nullopt;
+  }
+
+  switch (header->type) {
+    case Value::Type::UNSIGNED:
+      return DecodeValueToUnsigned(header->value);
+    case Value::Type::NEGATIVE:
+      return DecodeValueToNegative(header->value);
+    case Value::Type::BYTE_STRING:
+      return ReadByteStringContent(*header);
+    case Value::Type::STRING:
+      return ReadStringContent(*header, config);
+    case Value::Type::ARRAY:
+      return ReadArrayContent(*header, config, max_nesting_level);
+    case Value::Type::MAP:
+      return ReadMapContent(*header, config, max_nesting_level);
+    case Value::Type::SIMPLE_VALUE:
+    case Value::Type::FLOAT_VALUE:
+      // Floating point values also go here since they are also type 7.
+      return DecodeToSimpleValueOrFloat(*header, config);
+    case Value::Type::TAG:  // We explicitly don't support TAG.
+    case Value::Type::NONE:
+    case Value::Type::INVALID_UTF8:
+      break;
+  }
+
+  error_code_ = DecoderError::UNSUPPORTED_MAJOR_TYPE;
+  return std::nullopt;
+}
+
+std::optional Reader::DecodeDataItemHeader() {
+  const std::optional initial_byte = ReadByte();
+  if (!initial_byte) {
+    return std::nullopt;
+  }
+
+  const auto major_type = GetMajorType(initial_byte.value());
+  const uint8_t additional_info = GetAdditionalInfo(initial_byte.value());
+
+  std::optional value =
+      ReadVariadicLengthInteger(major_type, additional_info);
+  return value ? std::make_optional(
+                     DataItemHeader{major_type, additional_info, value.value()})
+               : std::nullopt;
+}
+
+std::optional Reader::ReadVariadicLengthInteger(
+    Value::Type type,
+    uint8_t additional_info) {
+  uint8_t additional_bytes = 0;
+  if (additional_info < 24) {
+    return std::make_optional(additional_info);
+  } else if (additional_info == 24) {
+    additional_bytes = 1;
+  } else if (additional_info == 25) {
+    additional_bytes = 2;
+  } else if (additional_info == 26) {
+    additional_bytes = 4;
+  } else if (additional_info == 27) {
+    additional_bytes = 8;
+  } else {
+    error_code_ = DecoderError::UNKNOWN_ADDITIONAL_INFO;
+    return std::nullopt;
+  }
+
+  const std::optional> bytes =
+      ReadBytes(additional_bytes);
+  if (!bytes) {
+    return std::nullopt;
+  }
+
+  uint64_t int_data = 0;
+  for (const uint8_t b : bytes.value()) {
+    int_data <<= 8;
+    int_data |= b;
+  }
+
+  if (type == Value::Type::SIMPLE_VALUE && additional_info >= 25 &&
+      additional_info <= 27) {
+    // This is a floating point value and so `additional_bytes` should not be
+    // treated as an integer by minimality checking.
+    return std::make_optional(int_data);
+  }
+
+  return IsEncodingMinimal(additional_bytes, int_data)
+             ? std::make_optional(int_data)
+             : std::nullopt;
+}
+
+std::optional Reader::DecodeValueToNegative(uint64_t value) {
+  auto negative_value = -base::CheckedNumeric(value) - 1;
+  if (!negative_value.IsValid()) {
+    error_code_ = DecoderError::OUT_OF_RANGE_INTEGER_VALUE;
+    return std::nullopt;
+  }
+  return Value(static_cast(negative_value.ValueOrDie()));
+}
+
+std::optional Reader::DecodeValueToUnsigned(uint64_t value) {
+  auto unsigned_value = base::CheckedNumeric(value);
+  if (!unsigned_value.IsValid()) {
+    error_code_ = DecoderError::OUT_OF_RANGE_INTEGER_VALUE;
+    return std::nullopt;
+  }
+  return Value(static_cast(unsigned_value.ValueOrDie()));
+}
+
+std::optional Reader::DecodeToSimpleValueOrFloat(
+    const DataItemHeader& header,
+    const Config& config) {
+  // ReadVariadicLengthInteger provides this bound.
+  CHECK_LE(header.additional_info, 27);
+  // Floating point numbers.
+  if (header.additional_info > 24) {
+    if (header.additional_info >= 28) {
+      error_code_ = DecoderError::UNSUPPORTED_SIMPLE_VALUE;
+      return std::nullopt;
+    }
+    if (!config.allow_floating_point) {
+      error_code_ = DecoderError::UNSUPPORTED_FLOATING_POINT_VALUE;
+      return std::nullopt;
+    }
+
+    switch (header.additional_info) {
+      case 25:
+        return Value(DecodeHalfPrecisionFloat(header.value));
+      case 26: {
+        double result =
+            base::bit_cast(static_cast(header.value));
+        if (!std::isfinite(result) ||
+            result ==
+                DecodeHalfPrecisionFloat(EncodeHalfPrecisionFloat(result))) {
+          // This could have been encoded as a 16 bit float.
+          // Note that we use `isfinite()` here to handle NaN since infinity
+          // and NaN can both be encoded in 16 bits but NaN doesn't compare
+          // with equality.
+          error_code_ = DecoderError::NON_MINIMAL_CBOR_ENCODING;
+          return std::nullopt;
+        }
+        return Value(result);
+      }
+      case 27: {
+        double result = base::bit_cast(header.value);
+        float result_32 = result;
+        if (result == result_32) {
+          // This could have been encoded as a 32 bit float.
+          error_code_ = DecoderError::NON_MINIMAL_CBOR_ENCODING;
+          return std::nullopt;
+        }
+        return Value(result);
+      }
+      default:
+        NOTREACHED();
+    }
+  }
+
+  // Since |header.additional_info| <= 24, ReadVariadicLengthInteger also
+  // provides this bound for |header.value|.
+  CHECK_LE(header.value, 255u);
+  // |SimpleValue| is an enum class and so the underlying type is specified to
+  // be |int|. So this cast is safe.
+  Value::SimpleValue possibly_unsupported_simple_value =
+      static_cast(static_cast(header.value));
+  switch (possibly_unsupported_simple_value) {
+    case Value::SimpleValue::FALSE_VALUE:
+    case Value::SimpleValue::TRUE_VALUE:
+    case Value::SimpleValue::NULL_VALUE:
+    case Value::SimpleValue::UNDEFINED:
+      return Value(possibly_unsupported_simple_value);
+  }
+
+  error_code_ = DecoderError::UNSUPPORTED_SIMPLE_VALUE;
+  return std::nullopt;
+}
+
+std::optional Reader::ReadStringContent(
+    const Reader::DataItemHeader& header,
+    const Config& config) {
+  uint64_t num_bytes = header.value;
+  const std::optional> bytes = ReadBytes(num_bytes);
+  if (!bytes) {
+    return std::nullopt;
+  }
+
+  std::string cbor_string(bytes->begin(), bytes->end());
+  if (base::IsStringUTF8(cbor_string)) {
+    return Value(std::move(cbor_string));
+  }
+
+  if (config.allow_invalid_utf8) {
+    return Value(*bytes, Value::Type::INVALID_UTF8);
+  }
+
+  error_code_ = DecoderError::INVALID_UTF8;
+  return std::nullopt;
+}
+
+std::optional Reader::ReadByteStringContent(
+    const Reader::DataItemHeader& header) {
+  uint64_t num_bytes = header.value;
+  const std::optional> bytes = ReadBytes(num_bytes);
+  if (!bytes) {
+    return std::nullopt;
+  }
+
+  std::vector cbor_byte_string(bytes->begin(), bytes->end());
+  return Value(std::move(cbor_byte_string));
+}
+
+std::optional Reader::ReadArrayContent(
+    const Reader::DataItemHeader& header,
+    const Config& config,
+    int max_nesting_level) {
+  const uint64_t length = header.value;
+
+  Value::ArrayValue cbor_array;
+  for (uint64_t i = 0; i < length; ++i) {
+    std::optional cbor_element =
+        DecodeCompleteDataItem(config, max_nesting_level - 1);
+    if (!cbor_element.has_value()) {
+      return std::nullopt;
+    }
+    cbor_array.push_back(std::move(cbor_element.value()));
+  }
+  return Value(std::move(cbor_array));
+}
+
+std::optional Reader::ReadMapContent(
+    const Reader::DataItemHeader& header,
+    const Config& config,
+    int max_nesting_level) {
+  const uint64_t length = header.value;
+
+  std::map cbor_map;
+  for (uint64_t i = 0; i < length; ++i) {
+    std::optional key =
+        DecodeCompleteDataItem(config, max_nesting_level - 1);
+    std::optional value =
+        DecodeCompleteDataItem(config, max_nesting_level - 1);
+    if (!key.has_value() || !value.has_value()) {
+      return std::nullopt;
+    }
+
+    switch (key.value().type()) {
+      case Value::Type::UNSIGNED:
+      case Value::Type::NEGATIVE:
+      case Value::Type::STRING:
+      case Value::Type::BYTE_STRING:
+        break;
+      case Value::Type::INVALID_UTF8:
+        error_code_ = DecoderError::INVALID_UTF8;
+        return std::nullopt;
+      default:
+        error_code_ = DecoderError::INCORRECT_MAP_KEY_TYPE;
+        return std::nullopt;
+    }
+    if (IsDuplicateKey(key.value(), cbor_map))
+      return std::nullopt;
+
+    if (!config.allow_and_canonicalize_out_of_order_keys &&
+        !IsKeyInOrder(key.value(), cbor_map)) {
+      return std::nullopt;
+    }
+
+    cbor_map.emplace(std::move(key.value()), std::move(value.value()));
+  }
+
+  Value::MapValue map;
+  map.reserve(cbor_map.size());
+  while (!cbor_map.empty()) {
+    auto node = cbor_map.extract(cbor_map.begin());
+    map.emplace_hint(map.end(), std::move(node.key()),
+                     std::move(node.mapped()));
+  }
+  return Value(std::move(map));
+}
+
+std::optional Reader::ReadByte() {
+  const std::optional> bytes = ReadBytes(1);
+  return bytes ? std::make_optional(bytes.value()[0]) : std::nullopt;
+}
+
+std::optional> Reader::ReadBytes(uint64_t num_bytes) {
+  if (base::strict_cast(rest_.size()) < num_bytes) {
+    error_code_ = DecoderError::INCOMPLETE_CBOR_DATA;
+    return std::nullopt;
+  }
+
+  // The `uint64_t` => `size_t` conversion below will always succeed
+  // because the `if` condition above implies that `num_bytes` fits into a
+  // `size_t`.
+  size_t size = base::checked_cast(num_bytes);
+
+  const base::span ret = rest_.first(size);
+  rest_ = rest_.subspan(size);
+  return ret;
+}
+
+bool Reader::IsEncodingMinimal(uint8_t additional_bytes, uint64_t uint_data) {
+  if ((additional_bytes == 1 && uint_data < 24) ||
+      uint_data <= (1ULL << 8 * (additional_bytes >> 1)) - 1) {
+    error_code_ = DecoderError::NON_MINIMAL_CBOR_ENCODING;
+    return false;
+  }
+  return true;
+}
+
+bool Reader::IsKeyInOrder(const Value& new_key,
+                          const std::map& map) {
+  if (map.empty()) {
+    return true;
+  }
+
+  const auto& max_current_key = map.rbegin()->first;
+  const auto less = map.key_comp();
+  if (!less(max_current_key, new_key)) {
+    error_code_ = DecoderError::OUT_OF_ORDER_KEY;
+    return false;
+  }
+  return true;
+}
+
+bool Reader::IsDuplicateKey(const Value& new_key,
+                            const std::map& map) {
+  if (map.find(new_key) == map.end()) {
+    return false;
+  }
+  error_code_ = DecoderError::DUPLICATE_KEY;
+  return true;
+}
+
+// static
+const char* Reader::ErrorCodeToString(DecoderError error) {
+  switch (error) {
+    case DecoderError::CBOR_NO_ERROR:
+      return kNoError;
+    case DecoderError::UNSUPPORTED_MAJOR_TYPE:
+      return constants::kUnsupportedMajorType;
+    case DecoderError::UNKNOWN_ADDITIONAL_INFO:
+      return kUnknownAdditionalInfo;
+    case DecoderError::INCOMPLETE_CBOR_DATA:
+      return kIncompleteCBORData;
+    case DecoderError::INCORRECT_MAP_KEY_TYPE:
+      return kIncorrectMapKeyType;
+    case DecoderError::TOO_MUCH_NESTING:
+      return kTooMuchNesting;
+    case DecoderError::INVALID_UTF8:
+      return kInvalidUTF8;
+    case DecoderError::EXTRANEOUS_DATA:
+      return kExtraneousData;
+    case DecoderError::OUT_OF_ORDER_KEY:
+      return kMapKeyOutOfOrder;
+    case DecoderError::NON_MINIMAL_CBOR_ENCODING:
+      return kNonMinimalCBOREncoding;
+    case DecoderError::UNSUPPORTED_SIMPLE_VALUE:
+      return kUnsupportedSimpleValue;
+    case DecoderError::UNSUPPORTED_FLOATING_POINT_VALUE:
+      return kUnsupportedFloatingPointValue;
+    case DecoderError::OUT_OF_RANGE_INTEGER_VALUE:
+      return kOutOfRangeIntegerValue;
+    case DecoderError::DUPLICATE_KEY:
+      return kMapKeyDuplicate;
+    case DecoderError::UNKNOWN_ERROR:
+      return kUnknownError;
+    default:
+      NOTREACHED();
+  }
+}
+
+}  // namespace cbor
diff --git a/naiveproxy/src/components/cbor/reader.h b/naiveproxy/src/components/cbor/reader.h
new file mode 100644
index 0000000000..5f11ba48ba
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader.h
@@ -0,0 +1,228 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_CBOR_READER_H_
+#define COMPONENTS_CBOR_READER_H_
+
+#include 
+
+#include 
+#include 
+
+#include "base/containers/span.h"
+#include "base/memory/raw_ptr.h"
+#include "base/memory/raw_span.h"
+#include "components/cbor/cbor_export.h"
+#include "components/cbor/values.h"
+
+// Concise Binary Object Representation (CBOR) decoder as defined by
+// https://tools.ietf.org/html/rfc7049. This decoder only accepts canonical CBOR
+// as defined by section 3.9.
+//
+// This implementation supports the following major types:
+//  - 0: Unsigned integers, up to 64-bit values*.
+//  - 1: Signed integers, up to 64-bit values*.
+//  - 2: Byte strings.
+//  - 3: UTF-8 strings.
+//  - 4: Definite-length arrays.
+//  - 5: Definite-length maps.
+//  - 7: Simple values or floating point values.
+//
+//  * Note: For simplicity, this implementation represents both signed and
+//    unsigned integers with signed int64_t. This reduces the effective range
+//    of unsigned integers.
+//
+// Requirements for canonical CBOR representation:
+//  - Duplicate keys in maps are not allowed.
+//  - Keys for maps must be sorted first by length and then by byte-wise
+//    lexical order, as defined in Section 3.9.
+//
+// Known limitations and interpretations of the RFC (and the reasons):
+//  - Does not support indefinite-length data streams or semantic tags (major
+//    type 6). (Simplicity; security)
+//  - Does not support the floating point and BREAK stop code value types in
+//    major type 7. (Simplicity)
+//  - Does not support non-character codepoints in major type 3. (Security)
+//  - Treats incomplete CBOR data items as syntax errors. (Security)
+//  - Treats trailing data bytes as errors. (Security)
+//  - Treats unknown additional information formats as syntax errors.
+//    (Simplicity; security)
+//  - Limits CBOR value inputs to at most 16 layers of nesting. Callers can
+//    enforce more shallow nesting by setting |max_nesting_level|. (Efficiency;
+//    security)
+//  - Only supports CBOR maps with integer or string type keys, due to the
+//    cost of serialization when sorting map keys. (Efficiency; simplicity)
+//  - Does not support simple values that are unassigned/reserved as per RFC
+//    7049, and treats them as errors. (Security)
+
+namespace cbor {
+
+class CBOR_EXPORT Reader {
+ public:
+  enum class DecoderError {
+    CBOR_NO_ERROR = 0,
+    UNSUPPORTED_MAJOR_TYPE,
+    UNKNOWN_ADDITIONAL_INFO,
+    INCOMPLETE_CBOR_DATA,
+    INCORRECT_MAP_KEY_TYPE,
+    TOO_MUCH_NESTING,
+    INVALID_UTF8,
+    EXTRANEOUS_DATA,
+    OUT_OF_ORDER_KEY,
+    NON_MINIMAL_CBOR_ENCODING,
+    UNSUPPORTED_SIMPLE_VALUE,
+    UNSUPPORTED_FLOATING_POINT_VALUE,
+    OUT_OF_RANGE_INTEGER_VALUE,
+    DUPLICATE_KEY,
+    UNKNOWN_ERROR,
+  };
+
+  // CBOR nested depth sufficient for most use cases.
+  static const int kCBORMaxDepth = 16;
+
+  // Config contains configuration for a CBOR parsing operation.
+  struct CBOR_EXPORT Config {
+    Config();
+
+    Config(const Config&) = delete;
+    Config& operator=(const Config&) = delete;
+
+    ~Config();
+
+    // Used to report the number of bytes of input consumed. This suppresses the
+    // |EXTRANEOUS_DATA| error case. May be nullptr.
+    raw_ptr num_bytes_consumed = nullptr;
+
+    // Used to report the specific error in the case that parsing fails. May be
+    // nullptr;
+    raw_ptr error_code_out = nullptr;
+
+    // Controls the maximum depth of CBOR nesting that will be permitted. This
+    // exists to control stack consumption during parsing.
+    int max_nesting_level = kCBORMaxDepth;
+
+    // Causes strings that are not valid UTF-8 to be accepted and suppresses the
+    // |INVALID_UTF8| error, unless such strings are map keys. Invalid strings
+    // will result in Values of type |INVALID_UTF8| rather than |STRING|. Users
+    // of this feature should ensure that every invalid string is accounted for
+    // in the resulting structure.
+    //
+    // (Map keys are not allowed to be invalid because it was not necessary for
+    // the motivating case and because it adds complexity to handle the ordering
+    // correctly.)
+    bool allow_invalid_utf8 = false;
+
+    // Causes an input to be accepted even if it contains one or more maps with
+    // keys that are not in the canonical ordering as defined in Section 3.9,
+    // and suppresses the OUT_OF_ORDER_KEY error. The original ordering of keys
+    // will _not_ be preserved, but instead, in the returned cbor::Value, all
+    // maps are re-sorted so that their keys are in canonical order. By
+    // definition, enabling this option may result in loss of information (i.e.
+    // the original key ordering).
+    //
+    // Enabling this option will still not allow duplicate keys, in case of
+    // which the DUPLICATE_KEY error will be emitted.
+    bool allow_and_canonicalize_out_of_order_keys = false;
+
+    // Causes floating point in CBOR to be decoded. This is an option as
+    // several users of this library do not want to accept floats in CBOR. When
+    // this option is set to `false` any floating point values encountered
+    // during decoding will set raise the `UNSUPPORTED_FLOATING_POINT_VALUE`
+    // error.
+    bool allow_floating_point = false;
+  };
+
+  Reader(const Reader&) = delete;
+  Reader& operator=(const Reader&) = delete;
+
+  ~Reader();
+
+  // Reads and parses |input_data| into a Value. Returns an empty Optional
+  // if the input violates any one of the syntax requirements (including unknown
+  // additional info and incomplete CBOR data).
+  //
+  // The caller can optionally provide |error_code_out| to obtain additional
+  // information about decoding failures.
+  //
+  // If the caller provides it, |max_nesting_level| cannot exceed
+  // |kCBORMaxDepth|.
+  //
+  // Returns an empty Optional if not all the data was consumed, and sets
+  // |error_code_out| to EXTRANEOUS_DATA in this case.
+  static std::optional Read(base::span input_data,
+                                   DecoderError* error_code_out = nullptr,
+                                   int max_nesting_level = kCBORMaxDepth);
+
+  // A version of |Read|, above, that takes a |Config| structure to allow
+  // additional controls.
+  static std::optional Read(base::span input_data,
+                                   const Config& config);
+
+  // A version of |Read| that takes some fields of |Config| as parameters to
+  // avoid having to construct a |Config| object explicitly.
+  static std::optional Read(base::span input_data,
+                                   size_t* num_bytes_consumed,
+                                   DecoderError* error_code_out = nullptr,
+                                   int max_nesting_level = kCBORMaxDepth);
+
+  // Translates errors to human-readable error messages.
+  static const char* ErrorCodeToString(DecoderError error_code);
+
+ private:
+  explicit Reader(base::span data);
+
+  // Encapsulates information extracted from the header of a CBOR data item,
+  // which consists of the initial byte, and a variable-length-encoded integer
+  // (if any).
+  struct DataItemHeader {
+    // The major type decoded from the initial byte.
+    Value::Type type;
+
+    // The raw 5-bit additional information from the initial byte.
+    uint8_t additional_info;
+
+    // The integer |value| decoded from the |additional_info| and the
+    // variable-length-encoded integer, if any.
+    uint64_t value;
+  };
+
+  std::optional DecodeDataItemHeader();
+  std::optional DecodeCompleteDataItem(const Config& config,
+                                              int max_nesting_level);
+  std::optional DecodeValueToNegative(uint64_t value);
+  std::optional DecodeValueToUnsigned(uint64_t value);
+  std::optional DecodeToSimpleValueOrFloat(const DataItemHeader& header,
+                                                  const Config& config);
+  std::optional ReadVariadicLengthInteger(Value::Type type,
+                                                    uint8_t additional_info);
+  std::optional ReadByteStringContent(const DataItemHeader& header);
+  std::optional ReadStringContent(const DataItemHeader& header,
+                                         const Config& config);
+  std::optional ReadArrayContent(const DataItemHeader& header,
+                                        const Config& config,
+                                        int max_nesting_level);
+  std::optional ReadMapContent(const DataItemHeader& header,
+                                      const Config& config,
+                                      int max_nesting_level);
+  std::optional ReadByte();
+  std::optional> ReadBytes(uint64_t num_bytes);
+  bool IsKeyInOrder(const Value& new_key,
+                    const std::map& map);
+  // Check if `new_key` is a duplicate of a key that already exists in the
+  // `map`.
+  bool IsDuplicateKey(const Value& new_key,
+                      const std::map& map);
+  bool IsEncodingMinimal(uint8_t additional_bytes, uint64_t uint_data);
+
+  DecoderError GetErrorCode() { return error_code_; }
+
+  size_t num_bytes_remaining() const { return rest_.size(); }
+
+  base::raw_span rest_;
+  DecoderError error_code_;
+};
+
+}  // namespace cbor
+
+#endif  // COMPONENTS_CBOR_READER_H_
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor0 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor0
new file mode 100644
index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d
GIT binary patch
literal 1
IcmZPo000310RR91

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor1 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor1
new file mode 100644
index 0000000000..6b2aaa7640
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor1
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor10 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor10
new file mode 100644
index 0000000000..fed1e13fcf
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor10
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor11 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor11
new file mode 100644
index 0000000000000000000000000000000000000000..00a3f0c5362935b7b6818bd076c0a6660a2535d7
GIT binary patch
literal 11
McmX@)$;bc&01HF`4FCWD

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor12 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor12
new file mode 100644
index 0000000000..077457ad25
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor12
@@ -0,0 +1 @@
+;
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor13 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor13
new file mode 100644
index 0000000000000000000000000000000000000000..b4818a3b38bb1c2abbef8fe1d8eb71c3ce6bcaef
GIT binary patch
literal 11
McmX@?$;bc&01Hn64gdfE

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor14 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor14
new file mode 100644
index 0000000000..0519ecba6e
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor14
@@ -0,0 +1 @@
+ 
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor15 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor15
new file mode 100644
index 0000000000..e8a0f87653
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor15
@@ -0,0 +1 @@
+)
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor16 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor16
new file mode 100644
index 0000000000..bfefdad18c
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor16
@@ -0,0 +1 @@
+8c
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor17 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor17
new file mode 100644
index 0000000000..5de255544f
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor17
@@ -0,0 +1 @@
+9
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor18 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor18
new file mode 100644
index 0000000000000000000000000000000000000000..e43ae5af822856d46f13a8542a24c6b2c9cefd31
GIT binary patch
literal 3
Kcmey#zyJUO?g07#

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor19 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor19
new file mode 100644
index 0000000000000000000000000000000000000000..6935671d0de15469bab55bfe4173599a3b99fb96
GIT binary patch
literal 3
Kcmey_zyJUP?g4rL

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor2 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor2
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor2
@@ -0,0 +1 @@
+
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor20 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor20
new file mode 100644
index 0000000000000000000000000000000000000000..ed788bb3a4c21ac9c95c12edcf761b23f8260fb5
GIT binary patch
literal 3
Kcmexq!vFvSW&t(;

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor21 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor21
new file mode 100644
index 0000000000..fc9ea00d18
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor21
@@ -0,0 +1 @@
+?񙙙
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor22 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor22
new file mode 100644
index 0000000000000000000000000000000000000000..5ac3929dea8dc3977d700318b539d312863a22a3
GIT binary patch
literal 3
Kcmexq#{d8WY5_O^

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor23 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor23
new file mode 100644
index 0000000000..735f4675f1
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor23
@@ -0,0 +1 @@
+{
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor24 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor24
new file mode 100644
index 0000000000000000000000000000000000000000..f36a086ed50782c300cfc1f06812ad6dff20be1d
GIT binary patch
literal 5
Mcmez6emH;u00`^?RR910

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor25 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor25
new file mode 100644
index 0000000000..16f3345724
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor25
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor26 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor26
new file mode 100644
index 0000000000000000000000000000000000000000..8e79bf519feabadca9207af6b9863e6bf5994faf
GIT binary patch
literal 9
QcmexeXa2;dgQ0W|02p@!Y5)KL

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor27 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor27
new file mode 100644
index 0000000000000000000000000000000000000000..8e144ff3cd2a96b7f2fed3f50d939b97760217ae
GIT binary patch
literal 3
Kcmey#zz6^W?*RJ%

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor28 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor28
new file mode 100644
index 0000000000000000000000000000000000000000..16b0d43402f7e4ac37a328ac16a7111e476f6410
GIT binary patch
literal 3
Kcmey#!T

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor29 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor29
new file mode 100644
index 0000000000000000000000000000000000000000..e5b8b4d8adba9dab320166039dbaebae37366bd6
GIT binary patch
literal 3
Kcmex)gaH5qb^*Qs

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor3 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor3
new file mode 100644
index 0000000000..c96ab3cc70
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor3
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor30 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor30
new file mode 100644
index 0000000000..815adc3e41
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor30
@@ -0,0 +1 @@
+ffffff
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor31 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor31
new file mode 100644
index 0000000000000000000000000000000000000000..2b119eb6592bf4c4dbae34df4cca474b6692a40d
GIT binary patch
literal 3
Kcmexa!vFvS<^gs9

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor32 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor32
new file mode 100644
index 0000000000000000000000000000000000000000..d73f58e36a28da5a13c238bc3be65180080c73e3
GIT binary patch
literal 3
Kcmexa#{d8W>H&BF

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor33 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor33
new file mode 100644
index 0000000000000000000000000000000000000000..7c2eb64047e0573cb36f7d717fd9cc2eb3f2a68b
GIT binary patch
literal 3
KcmezQhXDWt<^lEq

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor34 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor34
new file mode 100644
index 0000000000000000000000000000000000000000..82965f3b13a68cf30976af8537e2f96c6ac61f0b
GIT binary patch
literal 5
McmexW-@w2C00?6N`Tzg`

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor35 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor35
new file mode 100644
index 0000000000000000000000000000000000000000..2a9ccaec94adda68dea3be3ff87c02583d08f491
GIT binary patch
literal 5
McmexWe}I7j00|=kIsgCw

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor36 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor36
new file mode 100644
index 0000000000000000000000000000000000000000..a9e0eebe00cad0d1bf2d9467ebbc7edbc7b1fd2f
GIT binary patch
literal 5
McmezMzkz`P019IQdH?_b

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor37 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor37
new file mode 100644
index 0000000000000000000000000000000000000000..c90d682d848b336be7a7d466d07bce0749674260
GIT binary patch
literal 9
Mcmexe|A7Gv025>aYXATM

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor38 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor38
new file mode 100644
index 0000000000000000000000000000000000000000..802efe1966e186be2dc4369732a8cb358fb1272b
GIT binary patch
literal 9
Mcmexe|APSx027=7a{vGU

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor39 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor39
new file mode 100644
index 0000000000000000000000000000000000000000..7a1f61c5343e99f5c223dc67b42fae1aa96d905f
GIT binary patch
literal 9
NcmezU{{sUU000+c0_y+(

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor4 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor4
new file mode 100644
index 0000000000..a1910b3f6c
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor4
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor40 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor40
new file mode 100644
index 0000000000..3a6e607aa5
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor40
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor41 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor41
new file mode 100644
index 0000000000..bb7d13c5e9
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor41
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor42 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor42
new file mode 100644
index 0000000000..f7a8cadeb5
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor42
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor43 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor43
new file mode 100644
index 0000000000..009080e8e0
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor43
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor44 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor44
new file mode 100644
index 0000000000..04f7b5be69
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor44
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor45 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor45
new file mode 100644
index 0000000000..33c4e29de1
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor45
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor46 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor46
new file mode 100644
index 0000000000..a61a4624f2
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor46
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor47 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor47
new file mode 100644
index 0000000000..d2fbff8927
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor47
@@ -0,0 +1 @@
+t2013-03-21T20:04:00Z
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor48 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor48
new file mode 100644
index 0000000000..4ecf94681e
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor48
@@ -0,0 +1 @@
+QKg
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor49 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor49
new file mode 100644
index 0000000000000000000000000000000000000000..c5c79cf7779808a9d3d2e4b5942417ab3c311002
GIT binary patch
literal 10
RcmX^3+wn@!%{K}R3;-f@1qlEE

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor5 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor5
new file mode 100644
index 0000000000..d4e634a6b5
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor5
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor50 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor50
new file mode 100644
index 0000000000..7d0120d5bf
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor50
@@ -0,0 +1 @@
+D
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor51 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor51
new file mode 100644
index 0000000000..2784fd87e9
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor51
@@ -0,0 +1 @@
+EdIETF
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor52 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor52
new file mode 100644
index 0000000000..b7d2601ab1
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor52
@@ -0,0 +1 @@
+ vhttp://www.example.com
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor53 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor53
new file mode 100644
index 0000000000..b516b2c489
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor53
@@ -0,0 +1 @@
+@
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor54 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor54
new file mode 100644
index 0000000000..352e89a801
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor54
@@ -0,0 +1 @@
+D
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor55 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor55
new file mode 100644
index 0000000000..64845fb767
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor55
@@ -0,0 +1 @@
+`
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor56 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor56
new file mode 100644
index 0000000000..7ec9a4b774
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor56
@@ -0,0 +1 @@
+aa
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor57 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor57
new file mode 100644
index 0000000000..743669bb19
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor57
@@ -0,0 +1 @@
+dIETF
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor58 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor58
new file mode 100644
index 0000000000..cce6615381
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor58
@@ -0,0 +1 @@
+b"\
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor59 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor59
new file mode 100644
index 0000000000..9055a92aa6
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor59
@@ -0,0 +1 @@
+bü
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor6 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor6
new file mode 100644
index 0000000000..3b5c90718a
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor6
@@ -0,0 +1 @@
+d
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor60 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor60
new file mode 100644
index 0000000000..0868c9a428
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor60
@@ -0,0 +1 @@
+c水
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor61 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor61
new file mode 100644
index 0000000000..8ea48a07a2
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor61
@@ -0,0 +1 @@
+d𐅑
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor62 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor62
new file mode 100644
index 0000000000..5416677bc7
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor62
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor63 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor63
new file mode 100644
index 0000000000..4cdf6ce18a
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor63
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor64 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor64
new file mode 100644
index 0000000000..80fd3949e5
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor64
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor65 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor65
new file mode 100644
index 0000000000..b4495842ec
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor65
@@ -0,0 +1,2 @@
+	
+

\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor66 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor66
new file mode 100644
index 0000000000..eea1bf0c31
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor66
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor67 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor67
new file mode 100644
index 0000000000..abc169a8cc
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor67
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor68 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor68
new file mode 100644
index 0000000000..81e38473ff
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor68
@@ -0,0 +1 @@
+aaab
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor69 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor69
new file mode 100644
index 0000000000..9b1d08caf4
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor69
@@ -0,0 +1 @@
+aaabac
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor7 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor7
new file mode 100644
index 0000000000..fda74fd9c8
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor7
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor70 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor70
new file mode 100644
index 0000000000..05bb07fc9d
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor70
@@ -0,0 +1 @@
+aaaAabaBacaCadaDaeaE
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor71 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor71
new file mode 100644
index 0000000000..2681a857cb
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor71
@@ -0,0 +1 @@
+_BC
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor72 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor72
new file mode 100644
index 0000000000..d0daf28239
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor72
@@ -0,0 +1 @@
+estreadming
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor73 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor73
new file mode 100644
index 0000000000..422ce24eaa
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor73
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor74 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor74
new file mode 100644
index 0000000000..f67cd5703a
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor74
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor75 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor75
new file mode 100644
index 0000000000..78343ed40e
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor75
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor76 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor76
new file mode 100644
index 0000000000..a0f1ea2596
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor76
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor77 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor77
new file mode 100644
index 0000000000..dbbf8e51a3
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor77
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor78 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor78
new file mode 100644
index 0000000000..81c9910e82
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor78
@@ -0,0 +1,2 @@
+	
+

\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor79 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor79
new file mode 100644
index 0000000000..018602c1e1
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor79
@@ -0,0 +1 @@
+aaab
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor8 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor8
new file mode 100644
index 0000000000000000000000000000000000000000..916281951cd165d0c94a823aa0180c47935486ac
GIT binary patch
literal 5
Mcmb1Q;CFHW00DRatN;K2

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor80 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor80
new file mode 100644
index 0000000000..151c13e53d
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor80
@@ -0,0 +1 @@
+aaabac
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor81 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor81
new file mode 100644
index 0000000000..c0f4fd5eb3
--- /dev/null
+++ b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor81
@@ -0,0 +1 @@
+cFuncAmt!
\ No newline at end of file
diff --git a/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor9 b/naiveproxy/src/components/cbor/reader_fuzzer_corpus/cbor9
new file mode 100644
index 0000000000000000000000000000000000000000..4cdcd7ccc3f0a4bff373449b313d443379473a32
GIT binary patch
literal 9
Qcmb1UU|@K0WvKuI01D#*jQ{`u

literal 0
HcmV?d00001

diff --git a/naiveproxy/src/components/cbor/values.cc b/naiveproxy/src/components/cbor/values.cc
new file mode 100644
index 0000000000..df9d94ae88
--- /dev/null
+++ b/naiveproxy/src/components/cbor/values.cc
@@ -0,0 +1,318 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/cbor/values.h"
+
+#include 
+#include 
+#include 
+#include 
+
+#include "base/check_op.h"
+#include "base/containers/span.h"
+#include "base/notreached.h"
+#include "base/numerics/safe_conversions.h"
+#include "base/strings/string_util.h"
+#include "components/cbor/constants.h"
+
+namespace cbor {
+
+// static
+Value Value::InvalidUTF8StringValueForTesting(std::string_view in_string) {
+  return Value(base::as_byte_span(in_string), Type::INVALID_UTF8);
+}
+
+Value::Value() noexcept : type_(Type::NONE) {}
+
+Value::Value(Value&& that) noexcept {
+  InternalMoveConstructFrom(std::move(that));
+}
+
+Value::Value(Type type) : type_(type) {
+  // Initialize with the default value.
+  switch (type_) {
+    case Type::UNSIGNED:
+    case Type::NEGATIVE:
+      integer_value_ = 0;
+      return;
+    case Type::INVALID_UTF8:
+    case Type::BYTE_STRING:
+      new (&bytestring_value_) BinaryValue();
+      return;
+    case Type::STRING:
+      new (&string_value_) std::string();
+      return;
+    case Type::ARRAY:
+      new (&array_value_) ArrayValue();
+      return;
+    case Type::MAP:
+      new (&map_value_) MapValue();
+      return;
+    case Type::TAG:
+      NOTREACHED() << constants::kUnsupportedMajorType;
+    case Type::SIMPLE_VALUE:
+      simple_value_ = Value::SimpleValue::UNDEFINED;
+      return;
+    case Type::FLOAT_VALUE:
+      float_value_ = 0.0;
+      return;
+    case Type::NONE:
+      return;
+  }
+  NOTREACHED();
+}
+
+Value::Value(SimpleValue in_simple)
+    : type_(Type::SIMPLE_VALUE), simple_value_(in_simple) {
+  CHECK(static_cast(in_simple) >= 20 && static_cast(in_simple) <= 23);
+}
+
+Value::Value(bool boolean_value) : type_(Type::SIMPLE_VALUE) {
+  simple_value_ = boolean_value ? Value::SimpleValue::TRUE_VALUE
+                                : Value::SimpleValue::FALSE_VALUE;
+}
+
+Value::Value(double float_value)
+    : type_(Type::FLOAT_VALUE), float_value_(float_value) {}
+
+Value::Value(int integer_value)
+    : Value(base::checked_cast(integer_value)) {}
+
+Value::Value(int64_t integer_value) : integer_value_(integer_value) {
+  type_ = integer_value >= 0 ? Type::UNSIGNED : Type::NEGATIVE;
+}
+
+Value::Value(base::span in_bytes)
+    : type_(Type::BYTE_STRING),
+      bytestring_value_(in_bytes.begin(), in_bytes.end()) {}
+
+Value::Value(base::span in_bytes, Type type)
+    : type_(type), bytestring_value_(in_bytes.begin(), in_bytes.end()) {
+  DCHECK(type_ == Type::BYTE_STRING || type_ == Type::INVALID_UTF8);
+}
+
+Value::Value(BinaryValue&& in_bytes) noexcept
+    : type_(Type::BYTE_STRING), bytestring_value_(std::move(in_bytes)) {}
+
+Value::Value(const char* in_string, Type type)
+    : Value(std::string_view(in_string), type) {}
+
+Value::Value(std::string&& in_string, Type type) noexcept : type_(type) {
+  switch (type_) {
+    case Type::STRING:
+      new (&string_value_) std::string();
+      string_value_ = std::move(in_string);
+      DCHECK(base::IsStringUTF8(string_value_));
+      break;
+    case Type::BYTE_STRING:
+      new (&bytestring_value_) BinaryValue();
+      bytestring_value_ = BinaryValue(in_string.begin(), in_string.end());
+      break;
+    default:
+      NOTREACHED();
+  }
+}
+
+Value::Value(std::string_view in_string, Type type) : type_(type) {
+  switch (type_) {
+    case Type::STRING:
+      new (&string_value_) std::string();
+      string_value_ = std::string(in_string);
+      DCHECK(base::IsStringUTF8(string_value_));
+      break;
+    case Type::BYTE_STRING:
+      new (&bytestring_value_) BinaryValue();
+      bytestring_value_ = BinaryValue(in_string.begin(), in_string.end());
+      break;
+    default:
+      NOTREACHED();
+  }
+}
+
+Value::Value(const ArrayValue& in_array) : type_(Type::ARRAY), array_value_() {
+  array_value_.reserve(in_array.size());
+  for (const auto& val : in_array)
+    array_value_.emplace_back(val.Clone());
+}
+
+Value::Value(ArrayValue&& in_array) noexcept
+    : type_(Type::ARRAY), array_value_(std::move(in_array)) {}
+
+Value::Value(const MapValue& in_map) : type_(Type::MAP), map_value_() {
+  map_value_.reserve(in_map.size());
+  for (const auto& it : in_map)
+    map_value_.emplace_hint(map_value_.end(), it.first.Clone(),
+                            it.second.Clone());
+}
+
+Value::Value(MapValue&& in_map) noexcept
+    : type_(Type::MAP), map_value_(std::move(in_map)) {}
+
+Value& Value::operator=(Value&& that) noexcept {
+  InternalCleanup();
+  InternalMoveConstructFrom(std::move(that));
+
+  return *this;
+}
+
+Value::~Value() {
+  InternalCleanup();
+}
+
+Value Value::Clone() const {
+  switch (type_) {
+    case Type::NONE:
+      return Value();
+    case Type::INVALID_UTF8:
+      return Value(bytestring_value_, Type::INVALID_UTF8);
+    case Type::UNSIGNED:
+    case Type::NEGATIVE:
+      return Value(integer_value_);
+    case Type::BYTE_STRING:
+      return Value(bytestring_value_);
+    case Type::STRING:
+      return Value(string_value_);
+    case Type::ARRAY:
+      return Value(array_value_);
+    case Type::MAP:
+      return Value(map_value_);
+    case Type::TAG:
+      NOTREACHED() << constants::kUnsupportedMajorType;
+    case Type::SIMPLE_VALUE:
+      return Value(simple_value_);
+    case Type::FLOAT_VALUE:
+      return Value(float_value_);
+  }
+
+  NOTREACHED();
+}
+
+Value::SimpleValue Value::GetSimpleValue() const {
+  CHECK(is_simple());
+  return simple_value_;
+}
+
+bool Value::GetBool() const {
+  CHECK(is_bool());
+  return simple_value_ == SimpleValue::TRUE_VALUE;
+}
+
+double Value::GetDouble() const {
+  CHECK(is_double());
+  return float_value_;
+}
+
+const int64_t& Value::GetInteger() const {
+  CHECK(is_integer());
+  return integer_value_;
+}
+
+const int64_t& Value::GetUnsigned() const {
+  CHECK(is_unsigned());
+  CHECK_GE(integer_value_, 0);
+  return integer_value_;
+}
+
+const int64_t& Value::GetNegative() const {
+  CHECK(is_negative());
+  CHECK_LT(integer_value_, 0);
+  return integer_value_;
+}
+
+const std::string& Value::GetString() const {
+  CHECK(is_string());
+  return string_value_;
+}
+
+const Value::BinaryValue& Value::GetBytestring() const {
+  CHECK(is_bytestring());
+  return bytestring_value_;
+}
+
+std::string_view Value::GetBytestringAsString() const {
+  CHECK(is_bytestring());
+  const auto& bytestring_value = GetBytestring();
+  return std::string_view(
+      reinterpret_cast(bytestring_value.data()),
+      bytestring_value.size());
+}
+
+const Value::ArrayValue& Value::GetArray() const {
+  CHECK(is_array());
+  return array_value_;
+}
+
+const Value::MapValue& Value::GetMap() const {
+  CHECK(is_map());
+  return map_value_;
+}
+
+const Value::BinaryValue& Value::GetInvalidUTF8() const {
+  CHECK(is_invalid_utf8());
+  return bytestring_value_;
+}
+
+void Value::InternalMoveConstructFrom(Value&& that) {
+  type_ = that.type_;
+
+  switch (type_) {
+    case Type::UNSIGNED:
+    case Type::NEGATIVE:
+      integer_value_ = that.integer_value_;
+      return;
+    case Type::INVALID_UTF8:
+    case Type::BYTE_STRING:
+      new (&bytestring_value_) BinaryValue(std::move(that.bytestring_value_));
+      return;
+    case Type::STRING:
+      new (&string_value_) std::string(std::move(that.string_value_));
+      return;
+    case Type::ARRAY:
+      new (&array_value_) ArrayValue(std::move(that.array_value_));
+      return;
+    case Type::MAP:
+      new (&map_value_) MapValue(std::move(that.map_value_));
+      return;
+    case Type::TAG:
+      NOTREACHED() << constants::kUnsupportedMajorType;
+    case Type::SIMPLE_VALUE:
+      simple_value_ = that.simple_value_;
+      return;
+    case Type::FLOAT_VALUE:
+      float_value_ = that.float_value_;
+      return;
+    case Type::NONE:
+      return;
+  }
+  NOTREACHED();
+}
+
+void Value::InternalCleanup() {
+  switch (type_) {
+    case Type::BYTE_STRING:
+    case Type::INVALID_UTF8:
+      bytestring_value_.~BinaryValue();
+      break;
+    case Type::STRING:
+      string_value_.~basic_string();
+      break;
+    case Type::ARRAY:
+      array_value_.~ArrayValue();
+      break;
+    case Type::MAP:
+      map_value_.~MapValue();
+      break;
+    case Type::TAG:
+      NOTREACHED() << constants::kUnsupportedMajorType;
+    case Type::NONE:
+    case Type::UNSIGNED:
+    case Type::NEGATIVE:
+    case Type::SIMPLE_VALUE:
+    case Type::FLOAT_VALUE:
+      break;
+  }
+  type_ = Type::NONE;
+}
+
+}  // namespace cbor
diff --git a/naiveproxy/src/components/cbor/values.h b/naiveproxy/src/components/cbor/values.h
new file mode 100644
index 0000000000..46a9508ed5
--- /dev/null
+++ b/naiveproxy/src/components/cbor/values.h
@@ -0,0 +1,219 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_CBOR_VALUES_H_
+#define COMPONENTS_CBOR_VALUES_H_
+
+#include 
+
+#include 
+#include 
+#include 
+#include 
+
+#include "base/check.h"
+#include "base/containers/flat_map.h"
+#include "base/containers/span.h"
+#include "base/notreached.h"
+#include "components/cbor/cbor_export.h"
+
+namespace cbor {
+
+// A class for Concise Binary Object Representation (CBOR) values.
+// This does not support indefinite-length encodings.
+class CBOR_EXPORT Value {
+ public:
+  struct Less {
+    // Comparison predicate to order keys in a dictionary as required by the
+    // canonical CBOR order defined in
+    // https://tools.ietf.org/html/rfc7049#section-3.9
+    // TODO(crbug.com/40560917): Clarify where this stands.
+    bool operator()(const Value& a, const Value& b) const {
+      // The current implementation only supports integer, text string, byte
+      // string and invalid UTF8 keys.
+      DCHECK((a.is_integer() || a.is_string() || a.is_bytestring() ||
+              a.is_invalid_utf8()) &&
+             (b.is_integer() || b.is_string() || b.is_bytestring() ||
+              b.is_invalid_utf8()));
+
+      // Below text from https://tools.ietf.org/html/rfc7049 errata 4409:
+      // *  If the major types are different, the one with the lower value
+      //    in numerical order sorts earlier.
+      if (a.type() != b.type())
+        return a.type() < b.type();
+
+      // *  If two keys have different lengths, the shorter one sorts
+      //    earlier;
+      // *  If two keys have the same length, the one with the lower value
+      //    in (byte-wise) lexical order sorts earlier.
+      switch (a.type()) {
+        case Type::UNSIGNED:
+          // For unsigned integers, the smaller value has shorter length,
+          // and (byte-wise) lexical representation.
+          return a.GetInteger() < b.GetInteger();
+        case Type::NEGATIVE:
+          // For negative integers, the value closer to zero has shorter length,
+          // and (byte-wise) lexical representation.
+          return a.GetInteger() > b.GetInteger();
+        case Type::STRING: {
+          const auto& a_str = a.GetString();
+          const size_t a_length = a_str.size();
+          const auto& b_str = b.GetString();
+          const size_t b_length = b_str.size();
+          return std::tie(a_length, a_str) < std::tie(b_length, b_str);
+        }
+        case Type::BYTE_STRING: {
+          const auto& a_str = a.GetBytestring();
+          const size_t a_length = a_str.size();
+          const auto& b_str = b.GetBytestring();
+          const size_t b_length = b_str.size();
+          return std::tie(a_length, a_str) < std::tie(b_length, b_str);
+        }
+        case Type::INVALID_UTF8: {
+          const auto& a_str = a.GetInvalidUTF8();
+          const size_t a_length = a_str.size();
+          const auto& b_str = b.GetInvalidUTF8();
+          const size_t b_length = b_str.size();
+          return std::tie(a_length, a_str) < std::tie(b_length, b_str);
+        }
+        default:
+          break;
+      }
+
+      NOTREACHED();
+    }
+
+    using is_transparent = void;
+  };
+
+  using BinaryValue = std::vector;
+  using ArrayValue = std::vector;
+  using MapValue = base::flat_map;
+
+  enum class Type {
+    UNSIGNED = 0,
+    NEGATIVE = 1,
+    BYTE_STRING = 2,
+    STRING = 3,
+    ARRAY = 4,
+    MAP = 5,
+    TAG = 6,
+    SIMPLE_VALUE = 7,
+    // In CBOR floating types also have major type 7, but we separate them here
+    // for simplicity.
+    FLOAT_VALUE = 70,
+    NONE = -1,
+    INVALID_UTF8 = -2,
+  };
+
+  enum class SimpleValue {
+    FALSE_VALUE = 20,
+    TRUE_VALUE = 21,
+    NULL_VALUE = 22,
+    UNDEFINED = 23,
+  };
+
+  // Returns a Value with Type::INVALID_UTF8. This factory method lets tests
+  // encode such a value as a CBOR string. It should never be used outside of
+  // tests since encoding may yield invalid CBOR data.
+  static Value InvalidUTF8StringValueForTesting(std::string_view in_string);
+
+  Value(Value&& that) noexcept;
+  Value() noexcept;  // A NONE value.
+
+  explicit Value(Type type);
+
+  explicit Value(SimpleValue in_simple);
+  explicit Value(bool boolean_value);
+  explicit Value(double in_float);
+
+  explicit Value(int integer_value);
+  explicit Value(int64_t integer_value);
+  explicit Value(uint64_t integer_value) = delete;
+
+  explicit Value(base::span in_bytes);
+  explicit Value(BinaryValue&& in_bytes) noexcept;
+
+  explicit Value(const char* in_string, Type type = Type::STRING);
+  explicit Value(std::string&& in_string, Type type = Type::STRING) noexcept;
+  explicit Value(std::string_view in_string, Type type = Type::STRING);
+
+  explicit Value(const ArrayValue& in_array);
+  explicit Value(ArrayValue&& in_array) noexcept;
+
+  explicit Value(const MapValue& in_map);
+  explicit Value(MapValue&& in_map) noexcept;
+
+  Value& operator=(Value&& that) noexcept;
+
+  Value(const Value&) = delete;
+  Value& operator=(const Value&) = delete;
+
+  ~Value();
+
+  // Value's copy constructor and copy assignment operator are deleted.
+  // Use this to obtain a deep copy explicitly.
+  Value Clone() const;
+
+  // Returns the type of the value stored by the current Value object.
+  Type type() const { return type_; }
+
+  // Returns true if the current object represents a given type.
+  bool is_type(Type type) const { return type == type_; }
+  bool is_none() const { return type() == Type::NONE; }
+  bool is_invalid_utf8() const { return type() == Type::INVALID_UTF8; }
+  bool is_simple() const { return type() == Type::SIMPLE_VALUE; }
+  bool is_bool() const {
+    return is_simple() && (simple_value_ == SimpleValue::TRUE_VALUE ||
+                           simple_value_ == SimpleValue::FALSE_VALUE);
+  }
+  bool is_double() const { return type() == Type::FLOAT_VALUE; }
+  bool is_unsigned() const { return type() == Type::UNSIGNED; }
+  bool is_negative() const { return type() == Type::NEGATIVE; }
+  bool is_integer() const { return is_unsigned() || is_negative(); }
+  bool is_bytestring() const { return type() == Type::BYTE_STRING; }
+  bool is_string() const { return type() == Type::STRING; }
+  bool is_array() const { return type() == Type::ARRAY; }
+  bool is_map() const { return type() == Type::MAP; }
+
+  // These will all fatally assert if the type doesn't match.
+  SimpleValue GetSimpleValue() const;
+  bool GetBool() const;
+  double GetDouble() const;
+  const int64_t& GetInteger() const;
+  const int64_t& GetUnsigned() const;
+  const int64_t& GetNegative() const;
+  const BinaryValue& GetBytestring() const;
+  std::string_view GetBytestringAsString() const;
+  // Returned string may contain NUL characters.
+  const std::string& GetString() const;
+  const ArrayValue& GetArray() const;
+  const MapValue& GetMap() const;
+  const BinaryValue& GetInvalidUTF8() const;
+
+ private:
+  friend class Reader;
+  // This constructor allows INVALID_UTF8 values to be created, which only
+  // |Reader| and InvalidUTF8StringValueForTesting() may do.
+  Value(base::span in_bytes, Type type);
+
+  Type type_;
+
+  union {
+    SimpleValue simple_value_;
+    int64_t integer_value_;
+    double float_value_;
+    BinaryValue bytestring_value_;
+    std::string string_value_;
+    ArrayValue array_value_;
+    MapValue map_value_;
+  };
+
+  void InternalMoveConstructFrom(Value&& that);
+  void InternalCleanup();
+};
+
+}  // namespace cbor
+
+#endif  // COMPONENTS_CBOR_VALUES_H_
diff --git a/naiveproxy/src/components/cbor/writer.cc b/naiveproxy/src/components/cbor/writer.cc
new file mode 100644
index 0000000000..8b020116c0
--- /dev/null
+++ b/naiveproxy/src/components/cbor/writer.cc
@@ -0,0 +1,246 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/cbor/writer.h"
+
+#include 
+#include 
+#include 
+#include 
+
+#include "base/bit_cast.h"
+#include "base/check_op.h"
+#include "base/notreached.h"
+#include "base/numerics/safe_conversions.h"
+#include "components/cbor/constants.h"
+
+namespace cbor {
+
+Writer::~Writer() = default;
+
+// static
+std::optional> Writer::Write(const Value& node,
+                                                  const Config& config) {
+  std::vector cbor;
+  Writer writer(&cbor);
+  if (!writer.EncodeCBOR(node, config.max_nesting_level,
+                         config.allow_invalid_utf8_for_testing)) {
+    return std::nullopt;
+  }
+  return cbor;
+}
+
+// static
+std::optional> Writer::Write(const Value& node,
+                                                  size_t max_nesting_level) {
+  Config config;
+  config.max_nesting_level = base::checked_cast(max_nesting_level);
+  return Write(node, config);
+}
+
+Writer::Writer(std::vector* cbor) : encoded_cbor_(cbor) {}
+
+bool Writer::EncodeCBOR(const Value& node,
+                        int max_nesting_level,
+                        bool allow_invalid_utf8) {
+  if (max_nesting_level < 0)
+    return false;
+
+  switch (node.type()) {
+    case Value::Type::NONE: {
+      StartItem(Value::Type::BYTE_STRING, 0);
+      return true;
+    }
+
+    case Value::Type::INVALID_UTF8: {
+      if (!allow_invalid_utf8) {
+        NOTREACHED() << constants::kUnsupportedMajorType;
+      }
+      // Encode a CBOR string with invalid UTF-8 data. This may produce invalid
+      // CBOR and is reachable in tests only. See
+      // |allow_invalid_utf8_for_testing| in Config.
+      const Value::BinaryValue& bytes = node.GetInvalidUTF8();
+      StartItem(Value::Type::STRING, base::strict_cast(bytes.size()));
+      encoded_cbor_->insert(encoded_cbor_->end(), bytes.begin(), bytes.end());
+      return true;
+    }
+
+    // Represents unsigned integers.
+    case Value::Type::UNSIGNED: {
+      int64_t value = node.GetUnsigned();
+      StartItem(Value::Type::UNSIGNED, static_cast(value));
+      return true;
+    }
+
+    // Represents negative integers.
+    case Value::Type::NEGATIVE: {
+      int64_t value = node.GetNegative();
+      StartItem(Value::Type::NEGATIVE, static_cast(-(value + 1)));
+      return true;
+    }
+
+    // Represents a byte string.
+    case Value::Type::BYTE_STRING: {
+      const Value::BinaryValue& bytes = node.GetBytestring();
+      StartItem(Value::Type::BYTE_STRING,
+                base::strict_cast(bytes.size()));
+      // Add the bytes.
+      encoded_cbor_->insert(encoded_cbor_->end(), bytes.begin(), bytes.end());
+      return true;
+    }
+
+    case Value::Type::STRING: {
+      std::string_view string = node.GetString();
+      StartItem(Value::Type::STRING,
+                base::strict_cast(string.size()));
+
+      // Add the characters.
+      encoded_cbor_->insert(encoded_cbor_->end(), string.begin(), string.end());
+      return true;
+    }
+
+    // Represents an array.
+    case Value::Type::ARRAY: {
+      const Value::ArrayValue& array = node.GetArray();
+      StartItem(Value::Type::ARRAY, array.size());
+      for (const auto& value : array) {
+        if (!EncodeCBOR(value, max_nesting_level - 1, allow_invalid_utf8))
+          return false;
+      }
+      return true;
+    }
+
+    // Represents a map.
+    case Value::Type::MAP: {
+      const Value::MapValue& map = node.GetMap();
+      StartItem(Value::Type::MAP, map.size());
+
+      for (const auto& value : map) {
+        if (!EncodeCBOR(value.first, max_nesting_level - 1, allow_invalid_utf8))
+          return false;
+        if (!EncodeCBOR(value.second, max_nesting_level - 1,
+                        allow_invalid_utf8))
+          return false;
+      }
+      return true;
+    }
+
+    case Value::Type::TAG:
+      NOTREACHED() << constants::kUnsupportedMajorType;
+
+    // Represents a simple value.
+    case Value::Type::SIMPLE_VALUE: {
+      const Value::SimpleValue simple_value = node.GetSimpleValue();
+      StartItem(Value::Type::SIMPLE_VALUE,
+                base::checked_cast(simple_value));
+      return true;
+    }
+
+    case Value::Type::FLOAT_VALUE: {
+      const double float_value = node.GetDouble();
+      encoded_cbor_->push_back(base::checked_cast(
+          static_cast(Value::Type::SIMPLE_VALUE)
+          << constants::kMajorTypeBitShift));
+      {
+        uint16_t value_16 = EncodeHalfPrecisionFloat(float_value);
+        const double decoded_float_16 = DecodeHalfPrecisionFloat(value_16);
+        if (decoded_float_16 == float_value ||
+            (std::isnan(decoded_float_16) && std::isnan(float_value))) {
+          // We can encode it in 16 bits.
+
+          SetAdditionalInformation(constants::kAdditionalInformation2Bytes);
+          for (int shift = 1; shift >= 0; shift--) {
+            encoded_cbor_->push_back(0xFF & (value_16 >> (shift * 8)));
+          }
+          return true;
+        }
+      }
+      {
+        const float float_value_32 = float_value;
+        if (float_value == float_value_32) {
+          // We can encode it in 32 bits.
+
+          SetAdditionalInformation(constants::kAdditionalInformation4Bytes);
+          uint32_t value_32 = base::bit_cast(float_value_32);
+          for (int shift = 3; shift >= 0; shift--) {
+            encoded_cbor_->push_back(0xFF & (value_32 >> (shift * 8)));
+          }
+          return true;
+        }
+      }
+      {
+        // We can always encode it in 64 bits.
+        SetAdditionalInformation(constants::kAdditionalInformation8Bytes);
+        uint64_t value_64 = base::bit_cast(float_value);
+        for (int shift = 7; shift >= 0; shift--) {
+          encoded_cbor_->push_back(0xFF & (value_64 >> (shift * 8)));
+        }
+        return true;
+      }
+    }
+  }
+}
+
+void Writer::StartItem(Value::Type type, uint64_t size) {
+  encoded_cbor_->push_back(base::checked_cast(
+      static_cast(type) << constants::kMajorTypeBitShift));
+  SetUint(size);
+}
+
+void Writer::SetAdditionalInformation(uint8_t additional_information) {
+  DCHECK(!encoded_cbor_->empty());
+  DCHECK_EQ(additional_information & constants::kAdditionalInformationMask,
+            additional_information);
+  encoded_cbor_->back() |=
+      (additional_information & constants::kAdditionalInformationMask);
+}
+
+void Writer::SetUint(uint64_t value) {
+  size_t count = GetNumUintBytes(value);
+  int shift = -1;
+  // Values under 24 are encoded directly in the initial byte.
+  // Otherwise, the last 5 bits of the initial byte contains the length
+  // of unsigned integer, which is encoded in following bytes.
+  switch (count) {
+    case 0:
+      SetAdditionalInformation(base::checked_cast(value));
+      break;
+    case 1:
+      SetAdditionalInformation(constants::kAdditionalInformation1Byte);
+      shift = 0;
+      break;
+    case 2:
+      SetAdditionalInformation(constants::kAdditionalInformation2Bytes);
+      shift = 1;
+      break;
+    case 4:
+      SetAdditionalInformation(constants::kAdditionalInformation4Bytes);
+      shift = 3;
+      break;
+    case 8:
+      SetAdditionalInformation(constants::kAdditionalInformation8Bytes);
+      shift = 7;
+      break;
+    default:
+      NOTREACHED();
+  }
+  for (; shift >= 0; shift--) {
+    encoded_cbor_->push_back(0xFF & (value >> (shift * 8)));
+  }
+}
+
+size_t Writer::GetNumUintBytes(uint64_t value) {
+  if (value < 24) {
+    return 0;
+  } else if (value <= 0xFF) {
+    return 1;
+  } else if (value <= 0xFFFF) {
+    return 2;
+  } else if (value <= 0xFFFFFFFF) {
+    return 4;
+  }
+  return 8;
+}
+
+}  // namespace cbor
diff --git a/naiveproxy/src/components/cbor/writer.h b/naiveproxy/src/components/cbor/writer.h
new file mode 100644
index 0000000000..5862b4f10b
--- /dev/null
+++ b/naiveproxy/src/components/cbor/writer.h
@@ -0,0 +1,120 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_CBOR_WRITER_H_
+#define COMPONENTS_CBOR_WRITER_H_
+
+#include 
+#include 
+
+#include 
+#include 
+
+#include "base/memory/raw_ptr.h"
+#include "components/cbor/cbor_export.h"
+#include "components/cbor/float_conversions.h"
+#include "components/cbor/values.h"
+
+// A basic Concise Binary Object Representation (CBOR) encoder as defined by
+// https://tools.ietf.org/html/rfc7049. This is a generic encoder that supplies
+// canonical, well-formed CBOR values but does not guarantee their validity
+// (see https://tools.ietf.org/html/rfc7049#section-3.2).
+// Supported:
+//  * Major types:
+//     * 0: Unsigned integers, up to INT64_MAX.
+//     * 1: Negative integers, to INT64_MIN.
+//     * 2: Byte strings.
+//     * 3: UTF-8 strings.
+//     * 4: Arrays, with the number of elements known at the start.
+//     * 5: Maps, with the number of elements known at the start
+//              of the container.
+//     * 7: Simple values.
+//
+// Unsupported:
+//  * Indefinite-length encodings.
+//  * Parsing.
+//
+// Requirements for canonical CBOR as suggested by RFC 7049 are:
+//  1) All major data types for the CBOR values must be as short as possible.
+//      * Unsigned integer between 0 to 23 must be expressed in same byte as
+//            the major type.
+//      * 24 to 255 must be expressed only with an additional uint8_t.
+//      * 256 to 65535 must be expressed only with an additional uint16_t.
+//      * 65536 to 4294967295 must be expressed only with an additional
+//            uint32_t. * The rules for expression of length in major types
+//            2 to 5 follow the above rule for integers.
+//  2) Keys in every map must be sorted (first by major type, then by key
+//         length, then by value in byte-wise lexical order).
+//  3) Indefinite length items must be converted to definite length items.
+//  4) All maps must not have duplicate keys.
+//
+// Current implementation of Writer encoder meets all the requirements of
+// canonical CBOR.
+
+namespace cbor {
+
+class CBOR_EXPORT Writer {
+ public:
+  // Default that should be sufficiently large for most use cases.
+  static constexpr size_t kDefaultMaxNestingDepth = 16;
+
+  struct CBOR_EXPORT Config {
+    // Controls the maximum depth of CBOR nesting that will be permitted in a
+    // Value. Nesting depth is defined as the number of arrays/maps that have to
+    // be traversed to reach the most nested contained Value. Primitive values
+    // and empty containers have nesting depths of 0.
+    int max_nesting_level = kDefaultMaxNestingDepth;
+
+    // Controls whether the Writer allows writing string values of type
+    // Value::Type::INVALID_UTF8. Regular CBOR strings must be valid UTF-8.
+    // Writers with this setting will produce invalid CBOR, so it may only be
+    // enabled in tests.
+    bool allow_invalid_utf8_for_testing = false;
+  };
+
+  Writer(const Writer&) = delete;
+  Writer& operator=(const Writer&) = delete;
+
+  ~Writer();
+
+  // Returns the CBOR byte string representation of |node|, unless its nesting
+  // depth is greater than |max_nesting_level|, in which case an empty optional
+  // value is returned.
+  static std::optional> Write(
+      const Value& node,
+      size_t max_nesting_level = kDefaultMaxNestingDepth);
+
+  // A version of |Write| above that takes a Config.
+  static std::optional> Write(const Value& node,
+                                                   const Config& config);
+
+ private:
+  explicit Writer(std::vector* cbor);
+
+  // Called recursively to build the CBOR bytestring. When completed,
+  // |encoded_cbor_| will contain the CBOR.
+  bool EncodeCBOR(const Value& node,
+                  int max_nesting_level,
+                  bool allow_invalid_utf8);
+
+  // Encodes the type and size of the data being added.
+  void StartItem(Value::Type type, uint64_t size);
+
+  // Encodes the additional information for the data.
+  void SetAdditionalInformation(uint8_t additional_information);
+
+  // Encodes an unsigned integer value. This is used to both write
+  // unsigned integers and to encode the lengths of other major types.
+  void SetUint(uint64_t value);
+
+  // Returns the number of bytes needed to store the unsigned integer.
+  size_t GetNumUintBytes(uint64_t value);
+
+  // Holds the encoded CBOR data.
+  raw_ptr> encoded_cbor_;
+};
+
+}  // namespace cbor
+
+#endif  // COMPONENTS_CBOR_WRITER_H_
diff --git a/naiveproxy/src/components/miracle_parameter/COMMON_METADATA b/naiveproxy/src/components/miracle_parameter/COMMON_METADATA
deleted file mode 100644
index 8529bd6b70..0000000000
--- a/naiveproxy/src/components/miracle_parameter/COMMON_METADATA
+++ /dev/null
@@ -1,3 +0,0 @@
-monorail {
-  component: "Blink>Loader"
-}
diff --git a/naiveproxy/src/components/miracle_parameter/OWNERS b/naiveproxy/src/components/miracle_parameter/OWNERS
deleted file mode 100644
index 738877c22e..0000000000
--- a/naiveproxy/src/components/miracle_parameter/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-kouhei@chromium.org
-yyanagisawa@chromium.org
-leimy@chromium.org
-chikamune@chromium.org
diff --git a/naiveproxy/src/components/miracle_parameter/README.md b/naiveproxy/src/components/miracle_parameter/README.md
deleted file mode 100644
index 3758e357cc..0000000000
--- a/naiveproxy/src/components/miracle_parameter/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# MiracleParameter Component
-
-This experimental component contains MiracleParameter related code to
-evaluate the MiracleParameter idea. This component must be used only for
-the MiracleParameter project.
diff --git a/naiveproxy/src/components/miracle_parameter/common/BUILD.gn b/naiveproxy/src/components/miracle_parameter/common/BUILD.gn
deleted file mode 100644
index 7bbf4f00e2..0000000000
--- a/naiveproxy/src/components/miracle_parameter/common/BUILD.gn
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2023 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-component("common") {
-  defines = [ "IS_MIRACLE_PARAMETER_IMPL" ]
-
-  output_name = "miracle_parameter_common"
-
-  sources = [
-    "public/miracle_parameter.cc",
-    "public/miracle_parameter.h",
-  ]
-
-  deps = [ "//base" ]
-}
diff --git a/naiveproxy/src/components/miracle_parameter/common/public/miracle_parameter.cc b/naiveproxy/src/components/miracle_parameter/common/public/miracle_parameter.cc
deleted file mode 100644
index 3d493cd028..0000000000
--- a/naiveproxy/src/components/miracle_parameter/common/public/miracle_parameter.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/miracle_parameter/common/public/miracle_parameter.h"
-
-#include "base/command_line.h"
-#include "base/strings/strcat.h"
-#include "base/system/sys_info.h"
-
-namespace miracle_parameter {
-
-std::string GetParamNameWithSuffix(const std::string& param_name) {
-  // `base::SysInfo::AmountOfPhysicalMemoryMB()` refers to CommandLine
-  // internally. If the CommandLine is not initialized, we return early to avoid
-  // a crash.
-  if (!base::CommandLine::InitializedForCurrentProcess()) {
-    return param_name;
-  }
-  int physical_memory_mb = base::SysInfo::AmountOfPhysicalMemoryMB();
-  const char* suffix =
-      physical_memory_mb < kMiracleParameterMemory512MB  ? "ForLessThan512MB"
-      : physical_memory_mb < kMiracleParameterMemory1GB  ? "For512MBTo1GB"
-      : physical_memory_mb < kMiracleParameterMemory2GB  ? "For1GBTo2GB"
-      : physical_memory_mb < kMiracleParameterMemory4GB  ? "For2GBTo4GB"
-      : physical_memory_mb < kMiracleParameterMemory8GB  ? "For4GBTo8GB"
-      : physical_memory_mb < kMiracleParameterMemory16GB ? "For8GBTo16GB"
-                                                         : "For16GBAndAbove";
-  return base::StrCat({param_name, suffix});
-}
-
-std::string GetMiracleParameterAsString(const base::Feature& feature,
-                                        const std::string& param_name,
-                                        const std::string& default_value) {
-  return base::GetFieldTrialParamByFeatureAsString(
-      feature, GetParamNameWithSuffix(param_name),
-      base::GetFieldTrialParamByFeatureAsString(feature, param_name,
-                                                default_value));
-}
-
-double GetMiracleParameterAsDouble(const base::Feature& feature,
-                                   const std::string& param_name,
-                                   double default_value) {
-  return base::GetFieldTrialParamByFeatureAsDouble(
-      feature, GetParamNameWithSuffix(param_name),
-      base::GetFieldTrialParamByFeatureAsDouble(feature, param_name,
-                                                default_value));
-}
-
-int GetMiracleParameterAsInt(const base::Feature& feature,
-                             const std::string& param_name,
-                             int default_value) {
-  return base::GetFieldTrialParamByFeatureAsInt(
-      feature, GetParamNameWithSuffix(param_name),
-      base::GetFieldTrialParamByFeatureAsInt(feature, param_name,
-                                             default_value));
-}
-
-bool GetMiracleParameterAsBool(const base::Feature& feature,
-                               const std::string& param_name,
-                               bool default_value) {
-  return base::GetFieldTrialParamByFeatureAsBool(
-      feature, GetParamNameWithSuffix(param_name),
-      base::GetFieldTrialParamByFeatureAsBool(feature, param_name,
-                                              default_value));
-}
-
-base::TimeDelta GetMiracleParameterAsTimeDelta(const base::Feature& feature,
-                                               const std::string& param_name,
-                                               base::TimeDelta default_value) {
-  return base::GetFieldTrialParamByFeatureAsTimeDelta(
-      feature, GetParamNameWithSuffix(param_name),
-      base::GetFieldTrialParamByFeatureAsTimeDelta(feature, param_name,
-                                                   default_value));
-}
-
-}  // namespace miracle_parameter
diff --git a/naiveproxy/src/components/miracle_parameter/common/public/miracle_parameter.h b/naiveproxy/src/components/miracle_parameter/common/public/miracle_parameter.h
deleted file mode 100644
index ef92298621..0000000000
--- a/naiveproxy/src/components/miracle_parameter/common/public/miracle_parameter.h
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_MIRACLE_PARAMETER_COMMON_PUBLIC_MIRACLE_PARAMETER_H_
-#define COMPONENTS_MIRACLE_PARAMETER_COMMON_PUBLIC_MIRACLE_PARAMETER_H_
-
-#include "base/component_export.h"
-#include "base/containers/span.h"
-#include "base/feature_list.h"
-#include "base/metrics/field_trial_params.h"
-
-namespace miracle_parameter {
-
-constexpr int kMiracleParameterMemory512MB = 512;
-constexpr int kMiracleParameterMemory1GB = 1024;
-constexpr int kMiracleParameterMemory2GB = 2 * 1024;
-constexpr int kMiracleParameterMemory4GB = 4 * 1024;
-constexpr int kMiracleParameterMemory8GB = 8 * 1024;
-constexpr int kMiracleParameterMemory16GB = 16 * 1024;
-
-// GetParamNameWithSuffix put a parameter name suffix based on
-// the amount of physical memory.
-//
-// - "ForLessThan512MB" for less than 512MB memory devices.
-// - "For512MBTo1GB" for 512MB to 1GB memory devices.
-// - "For1GBTo2GB" for 1GB to 2GB memory devices.
-// - "For2GBTo4GB" for 2GB to 4GB memory devices.
-// - "For4GBTo8GB" for 4GB to 8GB memory devices.
-// - "For8GBTo16GB" for 8GB to 16GB memory devices.
-// - "For16GBAndAbove" for 16GB memory and above devices.
-COMPONENT_EXPORT(MIRACLE_PARAMETER)
-std::string GetParamNameWithSuffix(const std::string& param_name);
-
-// Provides a similar behavior with FeatureParam except the return
-// value is determined by the amount of physical memory.
-COMPONENT_EXPORT(MIRACLE_PARAMETER)
-std::string GetMiracleParameterAsString(const base::Feature& feature,
-                                        const std::string& param_name,
-                                        const std::string& default_value);
-
-// Provides a similar behavior with FeatureParam except the return value
-// is determined by the amount of physical memory.
-COMPONENT_EXPORT(MIRACLE_PARAMETER)
-double GetMiracleParameterAsDouble(const base::Feature& feature,
-                                   const std::string& param_name,
-                                   double default_value);
-
-// Provides a similar behavior with FeatureParam except the return value is
-// determined by the amount of physical memory.
-COMPONENT_EXPORT(MIRACLE_PARAMETER)
-int GetMiracleParameterAsInt(const base::Feature& feature,
-                             const std::string& param_name,
-                             int default_value);
-
-// Provides a similar behavior with FeatureParam except the return value
-// is determined by the amount of physical memory.
-COMPONENT_EXPORT(MIRACLE_PARAMETER)
-bool GetMiracleParameterAsBool(const base::Feature& feature,
-                               const std::string& param_name,
-                               bool default_value);
-
-// Provides a similar behavior with FeatureParam except the
-// return value is determined by the amount of physical memory.
-COMPONENT_EXPORT(MIRACLE_PARAMETER)
-base::TimeDelta GetMiracleParameterAsTimeDelta(const base::Feature& feature,
-                                               const std::string& param_name,
-                                               base::TimeDelta default_value);
-
-// Provides a similar behavior with FeatureParam except the return value
-// is determined by the amount of physical memory.
-template 
-Enum GetMiracleParameterAsEnum(
-    const base::Feature& feature,
-    const std::string& param_name,
-    const Enum default_value,
-    const base::span::Option> options) {
-  return GetFieldTrialParamByFeatureAsEnum(
-      feature, GetParamNameWithSuffix(param_name),
-      GetFieldTrialParamByFeatureAsEnum(feature, param_name, default_value,
-                                        options),
-      options);
-}
-
-#define MIRACLE_PARAMETER_FOR_STRING(function_name, feature, param_name,    \
-                                     default_value)                         \
-  std::string function_name() {                                             \
-    static const std::string value =                                        \
-        miracle_parameter::GetMiracleParameterAsString(feature, param_name, \
-                                                       default_value);      \
-    return value;                                                           \
-  }
-
-#define MIRACLE_PARAMETER_FOR_DOUBLE(function_name, feature, param_name,    \
-                                     default_value)                         \
-  double function_name() {                                                  \
-    static const double value =                                             \
-        miracle_parameter::GetMiracleParameterAsDouble(feature, param_name, \
-                                                       default_value);      \
-    return value;                                                           \
-  }
-
-#define MIRACLE_PARAMETER_FOR_INT(function_name, feature, param_name,     \
-                                  default_value)                          \
-  int function_name() {                                                   \
-    static const int value = miracle_parameter::GetMiracleParameterAsInt( \
-        feature, param_name, default_value);                              \
-    return value;                                                         \
-  }
-
-#define MIRACLE_PARAMETER_FOR_BOOL(function_name, feature, param_name,      \
-                                   default_value)                           \
-  bool function_name() {                                                    \
-    static const bool value = miracle_parameter::GetMiracleParameterAsBool( \
-        feature, param_name, default_value);                                \
-    return value;                                                           \
-  }
-
-#define MIRACLE_PARAMETER_FOR_TIME_DELTA(function_name, feature, param_name,   \
-                                         default_value)                        \
-  base::TimeDelta function_name() {                                            \
-    static const base::TimeDelta value =                                       \
-        miracle_parameter::GetMiracleParameterAsTimeDelta(feature, param_name, \
-                                                          default_value);      \
-    return value;                                                              \
-  }
-
-#define MIRACLE_PARAMETER_FOR_ENUM(function_name, feature, param_name,      \
-                                   default_value, type, options)            \
-  type function_name() {                                                    \
-    static const type value = miracle_parameter::GetMiracleParameterAsEnum( \
-        feature, param_name, default_value, base::span(options));           \
-    return value;                                                           \
-  }
-
-}  // namespace miracle_parameter
-
-#endif  // COMPONENTS_MIRACLE_PARAMETER_COMMON_PUBLIC_MIRACLE_PARAMETER_H_
diff --git a/naiveproxy/src/components/network_time/network_time_tracker.cc b/naiveproxy/src/components/network_time/network_time_tracker.cc
index 0cb23bb48b..2c9bc2d09d 100644
--- a/naiveproxy/src/components/network_time/network_time_tracker.cc
+++ b/naiveproxy/src/components/network_time/network_time_tracker.cc
@@ -59,13 +59,9 @@ namespace network_time {
 // Network time queries are enabled on Android and all desktop platforms except
 // Chrome OS, which uses tlsdated to set the system time.
 #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_IOS)
-BASE_FEATURE(kNetworkTimeServiceQuerying,
-             "NetworkTimeServiceQuerying",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kNetworkTimeServiceQuerying, base::FEATURE_DISABLED_BY_DEFAULT);
 #else
-BASE_FEATURE(kNetworkTimeServiceQuerying,
-             "NetworkTimeServiceQuerying",
-             base::FEATURE_ENABLED_BY_DEFAULT);
+BASE_FEATURE(kNetworkTimeServiceQuerying, base::FEATURE_ENABLED_BY_DEFAULT);
 #endif
 
 namespace {
@@ -492,7 +488,8 @@ bool NetworkTimeTracker::UpdateTimeFromResponse(
     return false;
   }
   response.remove_prefix(5);  // Skips leading )]}'\n
-  std::optional value = base::JSONReader::ReadDict(response);
+  std::optional value = base::JSONReader::ReadDict(
+      response, base::JSON_PARSE_CHROMIUM_EXTENSIONS);
   if (!value) {
     DVLOG(1) << "not a dictionary";
     return false;
diff --git a/naiveproxy/src/components/network_time/network_time_tracker.h b/naiveproxy/src/components/network_time/network_time_tracker.h
index 699dd44ba3..0f515a9b50 100644
--- a/naiveproxy/src/components/network_time/network_time_tracker.h
+++ b/naiveproxy/src/components/network_time/network_time_tracker.h
@@ -15,7 +15,7 @@
 #include "base/feature_list.h"
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/observer_list.h"
 #include "base/observer_list_types.h"
 #include "base/threading/thread_checker.h"
diff --git a/naiveproxy/src/components/unexportable_keys/BUILD.gn b/naiveproxy/src/components/unexportable_keys/BUILD.gn
index e80cdb9dd2..ea440ea39b 100644
--- a/naiveproxy/src/components/unexportable_keys/BUILD.gn
+++ b/naiveproxy/src/components/unexportable_keys/BUILD.gn
@@ -39,43 +39,3 @@ component("unexportable_keys") {
     "//third_party/abseil-cpp:absl",
   ]
 }
-
-source_set("test_support") {
-  testonly = true
-
-  sources = [
-    "fake_unexportable_key_service.cc",
-    "fake_unexportable_key_service.h",
-    "mock_unexportable_key.cc",
-    "mock_unexportable_key.h",
-    "mock_unexportable_key_service.cc",
-    "mock_unexportable_key_service.h",
-    "scoped_mock_unexportable_key_provider.cc",
-    "scoped_mock_unexportable_key_provider.h",
-  ]
-
-  public_deps = [
-    ":unexportable_keys",
-    "//crypto",
-    "//testing/gmock",
-  ]
-}
-
-source_set("unit_tests") {
-  testonly = true
-
-  sources = [
-    "background_long_task_scheduler_unittest.cc",
-    "unexportable_key_loader_unittest.cc",
-    "unexportable_key_service_impl_unittest.cc",
-    "unexportable_key_task_manager_unittest.cc",
-  ]
-
-  deps = [
-    ":test_support",
-    ":unexportable_keys",
-    "//base/test:test_support",
-    "//crypto:test_support",
-    "//testing/gtest",
-  ]
-}
diff --git a/naiveproxy/src/components/unexportable_keys/OWNERS b/naiveproxy/src/components/unexportable_keys/OWNERS
index e2e671496e..0f2b2ee7d1 100644
--- a/naiveproxy/src/components/unexportable_keys/OWNERS
+++ b/naiveproxy/src/components/unexportable_keys/OWNERS
@@ -1,2 +1,3 @@
 alexilin@chromium.org
 msalama@chromium.org
+ernn@google.com
diff --git a/naiveproxy/src/components/unexportable_keys/fake_unexportable_key_service.cc b/naiveproxy/src/components/unexportable_keys/fake_unexportable_key_service.cc
index 65525b66bb..a32863fb2c 100644
--- a/naiveproxy/src/components/unexportable_keys/fake_unexportable_key_service.cc
+++ b/naiveproxy/src/components/unexportable_keys/fake_unexportable_key_service.cc
@@ -31,7 +31,6 @@ void FakeUnexportableKeyService::SignSlowlyAsync(
     const UnexportableKeyId& key_id,
     base::span data,
     BackgroundTaskPriority priority,
-    size_t max_retries,
     base::OnceCallback>)> callback) {
   std::move(callback).Run(base::unexpected(ServiceError::kKeyNotFound));
 }
diff --git a/naiveproxy/src/components/unexportable_keys/fake_unexportable_key_service.h b/naiveproxy/src/components/unexportable_keys/fake_unexportable_key_service.h
index e51c8b59de..8e3c568aae 100644
--- a/naiveproxy/src/components/unexportable_keys/fake_unexportable_key_service.h
+++ b/naiveproxy/src/components/unexportable_keys/fake_unexportable_key_service.h
@@ -29,7 +29,6 @@ class FakeUnexportableKeyService : public UnexportableKeyService {
       const UnexportableKeyId& key_id,
       base::span data,
       BackgroundTaskPriority priority,
-      size_t max_retries,
       base::OnceCallback>)> callback)
       override;
   ServiceErrorOr> GetSubjectPublicKeyInfo(
diff --git a/naiveproxy/src/components/unexportable_keys/features.cc b/naiveproxy/src/components/unexportable_keys/features.cc
index 52e0c920ca..0e7ffa9fd7 100644
--- a/naiveproxy/src/components/unexportable_keys/features.cc
+++ b/naiveproxy/src/components/unexportable_keys/features.cc
@@ -7,7 +7,6 @@
 namespace unexportable_keys {
 
 BASE_FEATURE(kEnableBoundSessionCredentialsSoftwareKeysForManualTesting,
-             "EnableBoundSessionCredentialsSoftwareKeysForManualTesting",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
 }  // namespace unexportable_keys
diff --git a/naiveproxy/src/components/unexportable_keys/mock_unexportable_key_provider.cc b/naiveproxy/src/components/unexportable_keys/mock_unexportable_key_provider.cc
new file mode 100644
index 0000000000..e80a0fef8d
--- /dev/null
+++ b/naiveproxy/src/components/unexportable_keys/mock_unexportable_key_provider.cc
@@ -0,0 +1,12 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/unexportable_keys/mock_unexportable_key_provider.h"
+
+namespace unexportable_keys {
+
+MockUnexportableKeyProvider::MockUnexportableKeyProvider() = default;
+MockUnexportableKeyProvider::~MockUnexportableKeyProvider() = default;
+
+}  // namespace unexportable_keys
diff --git a/naiveproxy/src/components/unexportable_keys/mock_unexportable_key_provider.h b/naiveproxy/src/components/unexportable_keys/mock_unexportable_key_provider.h
new file mode 100644
index 0000000000..f650f40c83
--- /dev/null
+++ b/naiveproxy/src/components/unexportable_keys/mock_unexportable_key_provider.h
@@ -0,0 +1,42 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_UNEXPORTABLE_KEYS_MOCK_UNEXPORTABLE_KEY_PROVIDER_H_
+#define COMPONENTS_UNEXPORTABLE_KEYS_MOCK_UNEXPORTABLE_KEY_PROVIDER_H_
+
+#include "crypto/signature_verifier.h"
+#include "crypto/unexportable_key.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace unexportable_keys {
+
+class MockUnexportableKeyProvider : public crypto::UnexportableKeyProvider {
+ public:
+  MockUnexportableKeyProvider();
+  ~MockUnexportableKeyProvider() override;
+
+  // crypto::UnexportableKeyProvider:
+  MOCK_METHOD(std::optional,
+              SelectAlgorithm,
+              (base::span
+                   acceptable_algorithms),
+              (override));
+  MOCK_METHOD(std::unique_ptr,
+              GenerateSigningKeySlowly,
+              (base::span
+                   acceptable_algorithms),
+              (override));
+  MOCK_METHOD(std::unique_ptr,
+              FromWrappedSigningKeySlowly,
+              (base::span wrapped_key),
+              (override));
+  MOCK_METHOD(bool,
+              DeleteSigningKeySlowly,
+              (base::span wrapped_key),
+              (override));
+};
+
+}  // namespace unexportable_keys
+
+#endif  // COMPONENTS_UNEXPORTABLE_KEYS_MOCK_UNEXPORTABLE_KEY_PROVIDER_H_
diff --git a/naiveproxy/src/components/unexportable_keys/mock_unexportable_key_service.h b/naiveproxy/src/components/unexportable_keys/mock_unexportable_key_service.h
index 759333c1e7..6e81aac831 100644
--- a/naiveproxy/src/components/unexportable_keys/mock_unexportable_key_service.h
+++ b/naiveproxy/src/components/unexportable_keys/mock_unexportable_key_service.h
@@ -43,7 +43,6 @@ class MockUnexportableKeyService : public UnexportableKeyService {
       (const UnexportableKeyId& key_id,
        base::span data,
        BackgroundTaskPriority priority,
-       size_t max_retries,
        base::OnceCallback>)> callback),
       (override));
   MOCK_METHOD(ServiceErrorOr>,
diff --git a/naiveproxy/src/components/unexportable_keys/service_error.h b/naiveproxy/src/components/unexportable_keys/service_error.h
index 07a810d4ca..91abc350b6 100644
--- a/naiveproxy/src/components/unexportable_keys/service_error.h
+++ b/naiveproxy/src/components/unexportable_keys/service_error.h
@@ -28,8 +28,10 @@ enum class ServiceError {
   kAlgorithmNotSupported = 5,
   // The key object hasn't been created yet. Try again later.
   kKeyNotReady = 6,
+  // The returned signature did not verify with the corresponding public key.
+  kVerifySignatureFailed = 7,
 
-  kMaxValue = kKeyNotReady
+  kMaxValue = kVerifySignatureFailed
 };
 
 // Fake `ServiceError` value that can be used for metrics to signify that no
diff --git a/naiveproxy/src/components/unexportable_keys/unexportable_key_service.h b/naiveproxy/src/components/unexportable_keys/unexportable_key_service.h
index bd490cca84..755e3442c5 100644
--- a/naiveproxy/src/components/unexportable_keys/unexportable_key_service.h
+++ b/naiveproxy/src/components/unexportable_keys/unexportable_key_service.h
@@ -86,19 +86,15 @@ class COMPONENT_EXPORT(UNEXPORTABLE_KEYS) UnexportableKeyService {
 
   // Schedules a new asynchronous signing task.
   // Might return a cached result if a task with the same combination of
-  // `signing_key` and `data` has been completed recently. In case of a failure,
-  // the task might be retried up to `max_retries` times.
+  // `signing_key` and `data` has been completed recently.
   // Invokes `callback` with a signature of `data`, or a `ServiceError` if
-  // `key_id` is/ not found or an error occurs during signing.
+  // `key_id` is not found or an error occurs during signing.
   // `key_id` must have resulted from calling `GenerateSigningKeySlowlyAsync()`
-  // or `FromWrappedSigningKeySlowlyAsync()`
-  // TODO(crbug.com/405408610): remove `max_retries` parameter once all callers
-  // adopt the retry logic.
+  // or `FromWrappedSigningKeySlowlyAsync()`.
   virtual void SignSlowlyAsync(
       const UnexportableKeyId& key_id,
       base::span data,
       BackgroundTaskPriority priority,
-      size_t max_retries,
       base::OnceCallback>)>
           callback) = 0;
 
diff --git a/naiveproxy/src/components/unexportable_keys/unexportable_key_service_impl.cc b/naiveproxy/src/components/unexportable_keys/unexportable_key_service_impl.cc
index ce664e3916..a760076074 100644
--- a/naiveproxy/src/components/unexportable_keys/unexportable_key_service_impl.cc
+++ b/naiveproxy/src/components/unexportable_keys/unexportable_key_service_impl.cc
@@ -160,14 +160,13 @@ void UnexportableKeyServiceImpl::SignSlowlyAsync(
     const UnexportableKeyId& key_id,
     base::span data,
     BackgroundTaskPriority priority,
-    size_t max_retries,
     base::OnceCallback>)> callback) {
   auto it = key_by_key_id_.find(key_id);
   if (it == key_by_key_id_.end()) {
     std::move(callback).Run(base::unexpected(ServiceError::kKeyNotFound));
     return;
   }
-  task_manager_->SignSlowlyAsync(it->second, data, priority, max_retries,
+  task_manager_->SignSlowlyAsync(it->second, data, priority,
                                  std::move(callback));
 }
 
diff --git a/naiveproxy/src/components/unexportable_keys/unexportable_key_service_impl.h b/naiveproxy/src/components/unexportable_keys/unexportable_key_service_impl.h
index 530950c08d..c8f90932c3 100644
--- a/naiveproxy/src/components/unexportable_keys/unexportable_key_service_impl.h
+++ b/naiveproxy/src/components/unexportable_keys/unexportable_key_service_impl.h
@@ -57,7 +57,6 @@ class COMPONENT_EXPORT(UNEXPORTABLE_KEYS) UnexportableKeyServiceImpl
       const UnexportableKeyId& key_id,
       base::span data,
       BackgroundTaskPriority priority,
-      size_t max_retries,
       base::OnceCallback>)> callback)
       override;
   ServiceErrorOr> GetSubjectPublicKeyInfo(
diff --git a/naiveproxy/src/components/unexportable_keys/unexportable_key_task_manager.cc b/naiveproxy/src/components/unexportable_keys/unexportable_key_task_manager.cc
index a9b62d7528..4d98b4513b 100644
--- a/naiveproxy/src/components/unexportable_keys/unexportable_key_task_manager.cc
+++ b/naiveproxy/src/components/unexportable_keys/unexportable_key_task_manager.cc
@@ -36,6 +36,7 @@ constexpr std::string_view kBaseTaskResultHistogramName =
     "Crypto.UnexportableKeys.BackgroundTaskResult";
 constexpr std::string_view kBaseTaskRetriesHistogramName =
     "Crypto.UnexportableKeys.BackgroundTaskRetries";
+constexpr size_t kSignTaskMaxRetries = 3;
 
 template 
 ServiceErrorOr ReportResultMetrics(
@@ -158,7 +159,6 @@ void UnexportableKeyTaskManager::SignSlowlyAsync(
     scoped_refptr signing_key,
     base::span data,
     BackgroundTaskPriority priority,
-    size_t max_retries,
     base::OnceCallback>)> callback) {
   auto callback_wrapper =
       WrapCallbackWithMetrics(BackgroundTaskType::kSign, std::move(callback));
@@ -172,9 +172,9 @@ void UnexportableKeyTaskManager::SignSlowlyAsync(
 
   // TODO(b/263249728): deduplicate tasks with the same parameters.
   // TODO(b/263249728): implement a cache of recent signings.
-  auto task =
-      std::make_unique(std::move(signing_key), data, priority,
-                                 max_retries, std::move(callback_wrapper));
+  auto task = std::make_unique(std::move(signing_key), data, priority,
+                                         kSignTaskMaxRetries,
+                                         std::move(callback_wrapper));
   task_scheduler_.PostTask(std::move(task));
 }
 
diff --git a/naiveproxy/src/components/unexportable_keys/unexportable_key_task_manager.h b/naiveproxy/src/components/unexportable_keys/unexportable_key_task_manager.h
index 883781797a..83c55ec336 100644
--- a/naiveproxy/src/components/unexportable_keys/unexportable_key_task_manager.h
+++ b/naiveproxy/src/components/unexportable_keys/unexportable_key_task_manager.h
@@ -86,15 +86,13 @@ class COMPONENT_EXPORT(UNEXPORTABLE_KEYS) UnexportableKeyTaskManager {
   // Schedules a new signing task or appends `callback` to an existing
   // task with `signing_key` and `data` arguments. Might return a cached result
   // if a task with the same combination of `signing_key` and `data` has been
-  // completed recently. In case of a failure, the task might be retried up to
-  // `max_retries` times.
+  // completed recently.
   // Invokes `callback` with a signature of `data`, or `ServiceError` if an
   // error occurs during signing.
   void SignSlowlyAsync(
       scoped_refptr signing_key,
       base::span data,
       BackgroundTaskPriority priority,
-      size_t max_retries,
       base::OnceCallback>)> callback);
 
  private:
diff --git a/naiveproxy/src/components/unexportable_keys/unexportable_key_tasks.cc b/naiveproxy/src/components/unexportable_keys/unexportable_key_tasks.cc
index d456ecd3cf..caaf0bbc37 100644
--- a/naiveproxy/src/components/unexportable_keys/unexportable_key_tasks.cc
+++ b/naiveproxy/src/components/unexportable_keys/unexportable_key_tasks.cc
@@ -62,8 +62,25 @@ ServiceErrorOr> SignSlowlyWithRefCountedKey(
   TRACE_EVENT("browser", "unexportable_keys::SignSlowlyWithRefCountedKey",
               perfetto::Flow::FromPointer(task_ptr_for_tracing));
   CHECK(signing_key);
-  return base::OptionalToExpected(signing_key->key().SignSlowly(data),
-                                  ServiceError::kCryptoApiFailed);
+  std::optional> signature =
+      signing_key->key().SignSlowly(data);
+  if (!signature.has_value()) {
+    return base::unexpected(ServiceError::kCryptoApiFailed);
+  }
+  // The analysis has proven that the returned signature does not always verify
+  // correctly. This is a very rare occurrence. Return an error if it does
+  // happen to force the retry mechanism to kick in as it is very likely to
+  // succeed on the next attempt.
+  crypto::SignatureVerifier verifier;
+  if (!verifier.VerifyInit(signing_key->key().Algorithm(), *signature,
+                           signing_key->key().GetSubjectPublicKeyInfo())) {
+    return base::unexpected(ServiceError::kVerifySignatureFailed);
+  }
+  verifier.VerifyUpdate(data);
+  if (!verifier.VerifyFinal()) {
+    return base::unexpected(ServiceError::kVerifySignatureFailed);
+  }
+  return *std::move(signature);
 }
 
 }  // namespace
diff --git a/naiveproxy/src/crypto/BUILD.gn b/naiveproxy/src/crypto/BUILD.gn
index 0bbbf1ca13..b026be6a7c 100644
--- a/naiveproxy/src/crypto/BUILD.gn
+++ b/naiveproxy/src/crypto/BUILD.gn
@@ -23,7 +23,11 @@ component("crypto") {
     "aes_cbc.h",
     "aes_ctr.cc",
     "aes_ctr.h",
+    "cose.cc",
+    "cose.h",
     "crypto_export.h",
+    "ecdsa_utils.cc",
+    "ecdsa_utils.h",
     "evp.cc",
     "evp.h",
     "features.cc",
@@ -36,18 +40,22 @@ component("crypto") {
     "hmac.h",
     "kdf.cc",
     "kdf.h",
+    "kex.cc",
+    "kex.h",
     "keypair.cc",
     "keypair.h",
     "obsolete/md5.cc",
     "obsolete/md5.h",
+    "obsolete/sha1.cc",
+    "obsolete/sha1.h",
     "openssl_util.cc",
     "openssl_util.h",
+    "pem.cc",
+    "pem.h",
     "process_bound_string.cc",
     "process_bound_string.h",
     "random.cc",
     "random.h",
-    "rsa_private_key.cc",
-    "rsa_private_key.h",
     "scoped_nss_types.h",
     "secure_hash.cc",
     "secure_hash.h",
@@ -70,7 +78,7 @@ component("crypto") {
     "user_verifying_key.h",
   ]
 
-  deps = []
+  deps = [ "//components/cbor" ]
 
   public_deps = [
     ":buildflags",
@@ -92,14 +100,12 @@ component("crypto") {
 
     if (is_mac) {
       sources += [
-        "apple/keychain_seckeychain.cc",
-        "apple/keychain_seckeychain.h",
-        "mac_security_services_lock.cc",
-        "mac_security_services_lock.h",
-        "scoped_lacontext.h",
-        "scoped_lacontext.mm",
-        "unexportable_key_mac.h",
-        "unexportable_key_mac.mm",
+        "apple/scoped_lacontext.h",
+        "apple/scoped_lacontext.mm",
+        "apple/security_framework_lock.cc",
+        "apple/security_framework_lock.h",
+        "apple/unexportable_key_mac.h",
+        "apple/unexportable_key_mac.mm",
         "user_verifying_key_mac.mm",
       ]
     }
@@ -152,4 +158,5 @@ component("crypto") {
   }
 
   defines = [ "CRYPTO_IMPLEMENTATION" ]
+  configs += [ "//build/config/compiler:wexit_time_destructors" ]
 }
diff --git a/naiveproxy/src/crypto/DEPS b/naiveproxy/src/crypto/DEPS
index b74c2ae474..66df21b3c8 100644
--- a/naiveproxy/src/crypto/DEPS
+++ b/naiveproxy/src/crypto/DEPS
@@ -1,4 +1,6 @@
 include_rules = [
+  "+components/cbor",
   "+third_party/boringssl/src/include",
+  "+third_party/boringssl/src/pki/pem.h",
 ]
 new_usages_require_review = True
diff --git a/naiveproxy/src/crypto/apple/keychain.cc b/naiveproxy/src/crypto/apple/keychain.cc
index 8dbc87e580..b4c6b43bc4 100644
--- a/naiveproxy/src/crypto/apple/keychain.cc
+++ b/naiveproxy/src/crypto/apple/keychain.cc
@@ -11,29 +11,11 @@
 #include "crypto/apple/keychain_secitem.h"
 #include "third_party/abseil-cpp/absl/cleanup/cleanup.h"
 
-#if BUILDFLAG(IS_MAC)
-#include "crypto/apple/keychain_seckeychain.h"
-#endif
-
 namespace crypto::apple {
 
-#if BUILDFLAG(IS_MAC)
-BASE_FEATURE(kAppleKeychainUseSecItem,
-             "AppleKeychainUseSecItem",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-#endif
-
 // static
 std::unique_ptr Keychain::DefaultKeychain() {
-#if BUILDFLAG(IS_MAC)
-  if (base::FeatureList::IsEnabled(kAppleKeychainUseSecItem)) {
-    return std::make_unique();
-  }
-
-  return std::make_unique();
-#else
   return std::make_unique();
-#endif
 }
 
 Keychain::Keychain() = default;
@@ -43,14 +25,10 @@ Keychain::~Keychain() = default;
 
 // ---------- ScopedKeychainUserInteractionAllowed ----------
 
-// Much of the Keychain API was marked deprecated as of the macOS 13 SDK.
-// Removal of its use is tracked in https://crbug.com/40233280 but deprecation
-// warnings are disabled in the meanwhile.
-//
-// This specific usage is unfortunate. While the new SecItem keychain API has
-// ways to suppress user interaction, none of those ways work when using the new
-// API to access file-based keychains. This was filed as FB16959400, but until
-// that is addressed, this usage of deprecated API cannot be removed.
+// On the Mac, the SecItem keychain API has ways to suppress user interaction,
+// but none of those ways work when using it to access file-based keychains.
+// This was filed as FB16959400, but until that is addressed, this usage of
+// deprecated API cannot be removed.
 
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
diff --git a/naiveproxy/src/crypto/apple/keychain.h b/naiveproxy/src/crypto/apple/keychain.h
index 2438c3947f..b5e604c525 100644
--- a/naiveproxy/src/crypto/apple/keychain.h
+++ b/naiveproxy/src/crypto/apple/keychain.h
@@ -18,7 +18,6 @@
 
 namespace crypto::apple {
 
-// DEPRECATED: use `KeychainV2` instead.
 // Wraps the KeychainServices API in a very thin layer, to allow it to be
 // mocked out for testing.
 
@@ -26,7 +25,7 @@ namespace crypto::apple {
 // through directly to their Keychain Services equivalents (Foo ->
 // SecKeychainFoo).
 //
-// New code should use KeychainV2.
+// TODO(https://crbug.com/441317288): Unify with KeychainV2.
 class CRYPTO_EXPORT Keychain {
  public:
   // Returns an object suitable for accessing the platform's default type of
diff --git a/naiveproxy/src/crypto/apple/keychain_seckeychain.cc b/naiveproxy/src/crypto/apple/keychain_seckeychain.cc
deleted file mode 100644
index 4ad5acbf29..0000000000
--- a/naiveproxy/src/crypto/apple/keychain_seckeychain.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "crypto/apple/keychain_seckeychain.h"
-
-#include "base/containers/span.h"
-#include "base/containers/to_vector.h"
-#include "base/memory/raw_ptr.h"
-#include "base/synchronization/lock.h"
-#include "base/types/expected.h"
-#include "crypto/mac_security_services_lock.h"
-
-// Much of the Keychain API was marked deprecated as of the macOS 13 SDK.
-// Removal of its use is tracked in https://crbug.com/40233280 but deprecation
-// warnings are disabled in the meanwhile.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-
-namespace crypto::apple {
-
-KeychainSecKeychain::KeychainSecKeychain() = default;
-
-KeychainSecKeychain::~KeychainSecKeychain() = default;
-
-base::expected, OSStatus>
-KeychainSecKeychain::FindGenericPassword(std::string_view service_name,
-                                         std::string_view account_name) const {
-  base::AutoLock lock(GetMacSecurityServicesLock());
-  uint32_t password_length = 0;
-  void* password_data = nullptr;
-  OSStatus status = SecKeychainFindGenericPassword(
-      nullptr, service_name.length(), service_name.data(),
-      account_name.length(), account_name.data(), &password_length,
-      &password_data, nullptr);
-  if (status != noErr) {
-    return base::unexpected(status);
-  }
-
-  // SAFETY: SecKeychainFindGenericPassword returns an allocation of
-  // `password_length` bytes in size.
-  UNSAFE_BUFFERS(base::span password_span(
-      static_cast(password_data), password_length));
-  auto result = base::ToVector(password_span);
-  SecKeychainItemFreeContent(nullptr, password_data);
-  return result;
-}
-
-OSStatus KeychainSecKeychain::AddGenericPassword(
-    std::string_view service_name,
-    std::string_view account_name,
-    base::span password) const {
-  base::AutoLock lock(GetMacSecurityServicesLock());
-  return SecKeychainAddGenericPassword(
-      nullptr, base::checked_cast(service_name.length()),
-      service_name.data(), base::checked_cast(account_name.length()),
-      account_name.data(), base::checked_cast(password.size()),
-      password.data(), nullptr);
-}
-
-#pragma clang diagnostic pop
-
-}  // namespace crypto::apple
diff --git a/naiveproxy/src/crypto/apple/keychain_seckeychain.h b/naiveproxy/src/crypto/apple/keychain_seckeychain.h
deleted file mode 100644
index 991b2c8deb..0000000000
--- a/naiveproxy/src/crypto/apple/keychain_seckeychain.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CRYPTO_APPLE_KEYCHAIN_SECKEYCHAIN_H_
-#define CRYPTO_APPLE_KEYCHAIN_SECKEYCHAIN_H_
-
-#include "crypto/apple/keychain.h"
-
-namespace crypto::apple {
-
-// An implementation of Keychain on top of the deprecated SecKeychain API.
-//
-// The underlying API was deprecated as of the macOS 13 SDK.
-// Removal of its use is tracked in https://crbug.com/1348251
-class CRYPTO_EXPORT KeychainSecKeychain : public Keychain {
- public:
-  KeychainSecKeychain();
-  ~KeychainSecKeychain() override;
-
-  base::expected, OSStatus> FindGenericPassword(
-      std::string_view service_name,
-      std::string_view account_name) const override;
-
-  OSStatus AddGenericPassword(
-      std::string_view service_name,
-      std::string_view account_name,
-      base::span password) const override;
-};
-
-}  // namespace crypto::apple
-
-#endif  // CRYPTO_APPLE_KEYCHAIN_SECKEYCHAIN_H_
diff --git a/naiveproxy/src/crypto/apple/keychain_v2.h b/naiveproxy/src/crypto/apple/keychain_v2.h
index 27d701f0b7..d15812600f 100644
--- a/naiveproxy/src/crypto/apple/keychain_v2.h
+++ b/naiveproxy/src/crypto/apple/keychain_v2.h
@@ -22,6 +22,8 @@ namespace crypto::apple {
 // KeychainV2 wraps iOS-style operations from the macOS Security framework
 // to work with keys and keychain items. These functions are grouped here so
 // they can be mocked out in testing.
+//
+// TODO(https://crbug.com/441317288): Unify with Keychain.
 class CRYPTO_EXPORT KeychainV2 {
  public:
   static KeychainV2& GetInstance();
diff --git a/naiveproxy/src/crypto/apple/mock_keychain.h b/naiveproxy/src/crypto/apple/mock_keychain.h
index 40fb4e1f75..680efe0312 100644
--- a/naiveproxy/src/crypto/apple/mock_keychain.h
+++ b/naiveproxy/src/crypto/apple/mock_keychain.h
@@ -19,8 +19,7 @@
 
 namespace crypto::apple {
 
-// Mock Keychain wrapper for testing code that interacts with the OS X
-// Keychain.
+// Mock Keychain wrapper for testing code that interacts with the Keychain.
 //
 // Note that "const" is pretty much meaningless for this class; the const-ness
 // of Keychain doesn't apply to the actual keychain data, so all of the Mock
diff --git a/naiveproxy/src/crypto/scoped_lacontext.h b/naiveproxy/src/crypto/apple/scoped_lacontext.h
similarity index 87%
rename from naiveproxy/src/crypto/scoped_lacontext.h
rename to naiveproxy/src/crypto/apple/scoped_lacontext.h
index b592f434bf..b97e8037a6 100644
--- a/naiveproxy/src/crypto/scoped_lacontext.h
+++ b/naiveproxy/src/crypto/apple/scoped_lacontext.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CRYPTO_SCOPED_LACONTEXT_H_
-#define CRYPTO_SCOPED_LACONTEXT_H_
+#ifndef CRYPTO_APPLE_SCOPED_LACONTEXT_H_
+#define CRYPTO_APPLE_SCOPED_LACONTEXT_H_
 
 #if defined(__OBJC__)
 #import 
@@ -13,7 +13,7 @@
 
 #include "crypto/crypto_export.h"
 
-namespace crypto {
+namespace crypto::apple {
 
 // ScopedLAContext can hold an `LAContext` and is safe to pass around from C++.
 // ScopedLAContext functions as a unique pointer. The UI can create one with an
@@ -41,6 +41,6 @@ class CRYPTO_EXPORT ScopedLAContext {
   std::unique_ptr storage_;
 };
 
-}  // namespace crypto
+}  // namespace crypto::apple
 
-#endif  // CRYPTO_SCOPED_LACONTEXT_H_
+#endif  // CRYPTO_APPLE_SCOPED_LACONTEXT_H_
diff --git a/naiveproxy/src/crypto/scoped_lacontext.mm b/naiveproxy/src/crypto/apple/scoped_lacontext.mm
similarity index 88%
rename from naiveproxy/src/crypto/scoped_lacontext.mm
rename to naiveproxy/src/crypto/apple/scoped_lacontext.mm
index 7c8875b419..78557597ce 100644
--- a/naiveproxy/src/crypto/scoped_lacontext.mm
+++ b/naiveproxy/src/crypto/apple/scoped_lacontext.mm
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "crypto/scoped_lacontext.h"
-
-#include 
+#include "crypto/apple/scoped_lacontext.h"
 
 #include 
 
+#include 
+
 #include "base/check.h"
 
-namespace crypto {
+namespace crypto::apple {
 
 struct ScopedLAContext::ObjCStorage {
   LAContext* __strong context;
@@ -32,4 +32,4 @@ LAContext* ScopedLAContext::release() {
   return context;
 }
 
-}  // namespace crypto
+}  // namespace crypto::apple
diff --git a/naiveproxy/src/crypto/apple/security_framework_lock.cc b/naiveproxy/src/crypto/apple/security_framework_lock.cc
new file mode 100644
index 0000000000..000b116459
--- /dev/null
+++ b/naiveproxy/src/crypto/apple/security_framework_lock.cc
@@ -0,0 +1,17 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "crypto/apple/security_framework_lock.h"
+
+#include "base/no_destructor.h"
+#include "base/synchronization/lock.h"
+
+namespace crypto::apple {
+
+base::Lock& GetSecurityFrameworkLock() {
+  static base::NoDestructor s_lock;
+  return *s_lock;
+}
+
+}  // namespace crypto::apple
diff --git a/naiveproxy/src/crypto/apple/security_framework_lock.h b/naiveproxy/src/crypto/apple/security_framework_lock.h
new file mode 100644
index 0000000000..47db1365b4
--- /dev/null
+++ b/naiveproxy/src/crypto/apple/security_framework_lock.h
@@ -0,0 +1,28 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CRYPTO_APPLE_SECURITY_FRAMEWORK_LOCK_H_
+#define CRYPTO_APPLE_SECURITY_FRAMEWORK_LOCK_H_
+
+#include "crypto/crypto_export.h"
+
+namespace base {
+class Lock;
+}
+
+namespace crypto::apple {
+
+// Some of the APIs exported by macOS Security.framework cannot be called
+// concurrently. This lock protects calls to:
+//   SecKeychain*()
+//   SecPolicy*()
+//   SecTrust*()
+// See
+// https://developer.apple.com/documentation/security/certificate_key_and_trust_services/working_with_concurrency
+// for more details.
+CRYPTO_EXPORT base::Lock& GetSecurityFrameworkLock();
+
+}  // namespace crypto::apple
+
+#endif  // CRYPTO_APPLE_SECURITY_FRAMEWORK_LOCK_H_
diff --git a/naiveproxy/src/crypto/unexportable_key_mac.h b/naiveproxy/src/crypto/apple/unexportable_key_mac.h
similarity index 93%
rename from naiveproxy/src/crypto/unexportable_key_mac.h
rename to naiveproxy/src/crypto/apple/unexportable_key_mac.h
index 5392c847c3..f8577ba848 100644
--- a/naiveproxy/src/crypto/unexportable_key_mac.h
+++ b/naiveproxy/src/crypto/apple/unexportable_key_mac.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CRYPTO_UNEXPORTABLE_KEY_MAC_H_
-#define CRYPTO_UNEXPORTABLE_KEY_MAC_H_
+#ifndef CRYPTO_APPLE_UNEXPORTABLE_KEY_MAC_H_
+#define CRYPTO_APPLE_UNEXPORTABLE_KEY_MAC_H_
 
 #include 
 
@@ -13,7 +13,7 @@
 
 #include "crypto/unexportable_key.h"
 
-namespace crypto {
+namespace crypto::apple {
 
 // UserVerifyingKeyProviderMac is an implementation of the
 // UserVerifyingKeyProvider interface on top of Apple's Secure Enclave. Callers
@@ -67,6 +67,6 @@ class UnexportableKeyProviderMac : public UnexportableKeyProvider {
 std::unique_ptr GetUnexportableKeyProviderMac(
     UnexportableKeyProvider::Config config);
 
-}  // namespace crypto
+}  // namespace crypto::apple
 
-#endif  // CRYPTO_UNEXPORTABLE_KEY_MAC_H_
+#endif  // CRYPTO_APPLE_UNEXPORTABLE_KEY_MAC_H_
diff --git a/naiveproxy/src/crypto/unexportable_key_mac.mm b/naiveproxy/src/crypto/apple/unexportable_key_mac.mm
similarity index 88%
rename from naiveproxy/src/crypto/unexportable_key_mac.mm
rename to naiveproxy/src/crypto/apple/unexportable_key_mac.mm
index ad232acc16..5343ba7802 100644
--- a/naiveproxy/src/crypto/unexportable_key_mac.mm
+++ b/naiveproxy/src/crypto/apple/unexportable_key_mac.mm
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "crypto/unexportable_key.h"
 
 #import 
@@ -36,26 +31,18 @@
 #include "base/threading/scoped_blocking_call.h"
 #include "crypto/apple/keychain_util.h"
 #include "crypto/apple/keychain_v2.h"
+#include "crypto/apple/unexportable_key_mac.h"
+#include "crypto/keypair.h"
 #include "crypto/signature_verifier.h"
-#include "crypto/unexportable_key_mac.h"
 #include "crypto/unexportable_key_metrics.h"
-#include "third_party/boringssl/src/include/openssl/bn.h"
-#include "third_party/boringssl/src/include/openssl/bytestring.h"
-#include "third_party/boringssl/src/include/openssl/ec.h"
-#include "third_party/boringssl/src/include/openssl/evp.h"
-#include "third_party/boringssl/src/include/openssl/mem.h"
-#include "third_party/boringssl/src/include/openssl/obj.h"
 
 using base::apple::CFToNSPtrCast;
 using base::apple::NSToCFPtrCast;
 
-namespace crypto {
+namespace crypto::apple {
 
 namespace {
 
-// The size of an uncompressed x9.63 encoded EC public key, 04 || X || Y.
-constexpr size_t kUncompressedPointLength = 65;
-
 // The value of the kSecAttrLabel when generating the key. The documentation
 // claims this should be a user-visible label, but there does not exist any UI
 // that shows this value. Therefore, it is left untranslated.
@@ -69,32 +56,13 @@ std::vector CFDataToVec(CFDataRef data) {
 
 std::optional> Convertx963ToDerSpki(
     base::span x962) {
-  // Parse x9.63 point into an |EC_POINT|.
-  bssl::UniquePtr p256(
-      EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1));
-  bssl::UniquePtr point(EC_POINT_new(p256.get()));
-  if (x962.size() != kUncompressedPointLength ||
-      x962[0] != POINT_CONVERSION_UNCOMPRESSED ||
-      !EC_POINT_oct2point(p256.get(), point.get(), x962.data(), x962.size(),
-                          /*ctx=*/nullptr)) {
+  std::optional imported =
+      crypto::keypair::PublicKey::FromEcP256Point(x962);
+  if (!imported) {
     LOG(ERROR) << "P-256 public key is not on curve";
     return std::nullopt;
   }
-  // Marshal point into a DER SPKI.
-  bssl::UniquePtr ec_key(
-      EC_KEY_new_by_curve_name(NID_X9_62_prime256v1));
-  CHECK(EC_KEY_set_public_key(ec_key.get(), point.get()));
-  bssl::UniquePtr pkey(EVP_PKEY_new());
-  CHECK(EVP_PKEY_assign_EC_KEY(pkey.get(), ec_key.release()));
-  bssl::ScopedCBB cbb;
-  uint8_t* der_bytes = nullptr;
-  size_t der_bytes_len = 0;
-  CHECK(CBB_init(cbb.get(), /* initial size */ 128) &&
-        EVP_marshal_public_key(cbb.get(), pkey.get()) &&
-        CBB_finish(cbb.get(), &der_bytes, &der_bytes_len));
-  std::vector ret(der_bytes, der_bytes + der_bytes_len);
-  OPENSSL_free(der_bytes);
-  return ret;
+  return imported->ToSubjectPublicKeyInfo();
 }
 
 // Logs `status` to an error histogram capturing that `operation` failed for a
@@ -385,4 +353,4 @@ std::unique_ptr GetUnexportableKeyProviderMac(
   return std::make_unique(std::move(config));
 }
 
-}  // namespace crypto
+}  // namespace crypto::apple
diff --git a/naiveproxy/src/crypto/cose.cc b/naiveproxy/src/crypto/cose.cc
new file mode 100644
index 0000000000..4143d6eef1
--- /dev/null
+++ b/naiveproxy/src/crypto/cose.cc
@@ -0,0 +1,125 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "crypto/cose.h"
+
+#include 
+
+#include "base/check_op.h"
+#include "base/notreached.h"
+#include "components/cbor/values.h"
+#include "components/cbor/writer.h"
+#include "third_party/boringssl/src/include/openssl/base.h"
+#include "third_party/boringssl/src/include/openssl/bn.h"
+#include "third_party/boringssl/src/include/openssl/evp.h"
+#include "third_party/boringssl/src/include/openssl/rsa.h"
+
+namespace crypto {
+
+namespace {
+
+constexpr size_t kEcP256FieldElementLength = 32;
+
+// Enumerates the keys in a COSE Key structure. See
+// https://tools.ietf.org/html/rfc8152#section-7.1
+enum class CoseKeyKey : int {
+  kAlg = 3,
+  kKty = 1,
+  kRSAModulus = -1,
+  kRSAPublicExponent = -2,
+  kEllipticCurve = -1,
+  kEllipticX = -2,
+  kEllipticY = -3,
+};
+
+// Enumerates COSE key types. See
+// https://tools.ietf.org/html/rfc8152#section-13
+enum class CoseKeyTypes : int {
+  kOKP = 1,
+  kEC2 = 2,
+  kRSA = 3,
+};
+
+// Enumerates COSE elliptic curves. See
+// https://tools.ietf.org/html/rfc8152#section-13.1
+enum class CoseCurves : int {
+  kP256 = 1,
+  kEd25519 = 6,
+};
+
+enum class CoseAlgorithmIdentifier : int {
+  kEs256 = -7,
+  kEdDSA = -8,
+  kRs256 = -257,
+};
+
+std::vector RsaToCoseKey(const EVP_PKEY* key) {
+  // Extract the RSA key and its components (n and e).
+  const RSA* rsa_key = EVP_PKEY_get0_RSA(key);
+  CHECK(rsa_key);
+
+  const BIGNUM* n = RSA_get0_n(rsa_key);  // modulus
+  const BIGNUM* e = RSA_get0_e(rsa_key);  // public exponent
+  CHECK(n && e);
+
+  // Convert BIGNUM components to byte vectors.
+  std::vector n_bytes(BN_num_bytes(n));
+  BN_bn2bin(n, n_bytes.data());
+  std::vector e_bytes(BN_num_bytes(e));
+  BN_bn2bin(e, e_bytes.data());
+
+  // Construct the COSE_Key CBOR Map.
+  cbor::Value::MapValue map;
+  map.emplace(static_cast(CoseKeyKey::kAlg),
+              static_cast(CoseAlgorithmIdentifier::kRs256));
+  map.emplace(static_cast(CoseKeyKey::kKty),
+              static_cast(CoseKeyTypes::kRSA));
+  map.emplace(static_cast(CoseKeyKey::kRSAModulus),
+              std::move(n_bytes));
+  map.emplace(static_cast(CoseKeyKey::kRSAPublicExponent),
+              std::move(e_bytes));
+
+  std::optional> cbor_bytes =
+      cbor::Writer::Write(cbor::Value(std::move(map)));
+  CHECK(cbor_bytes);
+  return cbor_bytes.value();
+}
+
+std::vector EcP256ToCoseKey(const keypair::PublicKey& key) {
+  // COSE's non-standard public key encoding is the x and y halves of the
+  // standard X9.62 uncompressed encoding: 04 || x || y.
+  std::vector uncompressed = key.ToUncompressedForm();
+  CHECK_EQ(uncompressed.size(), 1 + 2 * kEcP256FieldElementLength);
+  auto [x, y] =
+      base::span(uncompressed).subspan(1u).split_at(kEcP256FieldElementLength);
+
+  cbor::Value::MapValue map;
+  map.emplace(static_cast(CoseKeyKey::kKty),
+              static_cast(CoseKeyTypes::kEC2));
+  map.emplace(static_cast(CoseKeyKey::kAlg),
+              static_cast(CoseAlgorithmIdentifier::kEs256));
+  map.emplace(static_cast(CoseKeyKey::kEllipticCurve),
+              static_cast(CoseCurves::kP256));
+  map.emplace(static_cast(CoseKeyKey::kEllipticX), std::move(x));
+  map.emplace(static_cast(CoseKeyKey::kEllipticY), std::move(y));
+
+  std::optional> cbor_bytes =
+      cbor::Writer::Write(cbor::Value(std::move(map)));
+  CHECK(cbor_bytes);
+  return cbor_bytes.value();
+}
+
+}  // namespace
+
+std::vector PublicKeyToCoseKey(const keypair::PublicKey& key) {
+  if (key.IsRsa()) {
+    return RsaToCoseKey(key.key());
+  } else if (key.IsEcP256()) {
+    return EcP256ToCoseKey(key);
+  }
+
+  NOTREACHED();
+}
+
+}  // namespace crypto
diff --git a/naiveproxy/src/crypto/cose.h b/naiveproxy/src/crypto/cose.h
new file mode 100644
index 0000000000..028bf853ba
--- /dev/null
+++ b/naiveproxy/src/crypto/cose.h
@@ -0,0 +1,23 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CRYPTO_COSE_H_
+#define CRYPTO_COSE_H_
+
+#include 
+
+#include "crypto/crypto_export.h"
+#include "crypto/keypair.h"
+
+namespace crypto {
+
+// Converts a PublicKey in |key| to a COSE_Key structure, returning the
+// serialized CBOR bytes. Currently, we only support keys using the RSA and
+// EC-P256 algorithms.
+CRYPTO_EXPORT std::vector PublicKeyToCoseKey(
+    const keypair::PublicKey& key);
+
+}  // namespace crypto
+
+#endif  // CRYPTO_COSE_H_
diff --git a/naiveproxy/src/crypto/ecdsa_utils.cc b/naiveproxy/src/crypto/ecdsa_utils.cc
new file mode 100644
index 0000000000..6360dde4d0
--- /dev/null
+++ b/naiveproxy/src/crypto/ecdsa_utils.cc
@@ -0,0 +1,63 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "crypto/ecdsa_utils.h"
+
+#include 
+
+#include "base/containers/span.h"
+#include "base/logging.h"
+#include "crypto/keypair.h"
+#include "crypto/openssl_util.h"
+#include "third_party/boringssl/src/include/openssl/bn.h"
+#include "third_party/boringssl/src/include/openssl/bytestring.h"
+#include "third_party/boringssl/src/include/openssl/ec.h"
+#include "third_party/boringssl/src/include/openssl/ecdsa.h"
+#include "third_party/boringssl/src/include/openssl/evp.h"
+
+namespace crypto {
+
+std::optional> ConvertEcdsaDerSignatureToRaw(
+    const keypair::PublicKey& public_key,
+    base::span der_signature) {
+  EC_KEY* ec_key = EVP_PKEY_get0_EC_KEY(public_key.key());
+  if (!ec_key) {
+    return std::nullopt;
+  }
+
+  return ConvertEcdsaDerSignatureToRaw(EC_KEY_get0_group(ec_key),
+                                       der_signature);
+}
+
+std::optional> ConvertEcdsaDerSignatureToRaw(
+    const EC_GROUP* group,
+    base::span der_signature) {
+  OpenSSLErrStackTracer err_tracer(FROM_HERE);
+
+  if (!group) {
+    return std::nullopt;
+  }
+
+  // Verify that `der_signature` is a valid ECDSA signature.
+  bssl::UniquePtr ecdsa_sig(
+      ECDSA_SIG_from_bytes(der_signature.data(), der_signature.size()));
+  if (!ecdsa_sig) {
+    return std::nullopt;
+  }
+
+  size_t order_size_bits = EC_GROUP_order_bits(group);
+  size_t order_size_bytes = (order_size_bits + 7) / 8;
+
+  // Produce r || s output from the ECDSA signature.
+  std::vector raw_signature(2 * order_size_bytes);
+  if (!BN_bn2bin_padded(&raw_signature[0], order_size_bytes, ecdsa_sig->r) ||
+      !BN_bn2bin_padded(&raw_signature[order_size_bytes], order_size_bytes,
+                        ecdsa_sig->s)) {
+    return std::nullopt;
+  }
+
+  return raw_signature;
+}
+
+}  // namespace crypto
diff --git a/naiveproxy/src/crypto/ecdsa_utils.h b/naiveproxy/src/crypto/ecdsa_utils.h
new file mode 100644
index 0000000000..e01897ff33
--- /dev/null
+++ b/naiveproxy/src/crypto/ecdsa_utils.h
@@ -0,0 +1,40 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CRYPTO_ECDSA_UTILS_H_
+#define CRYPTO_ECDSA_UTILS_H_
+
+#include 
+#include 
+
+#include "base/containers/span.h"
+#include "crypto/crypto_export.h"
+#include "third_party/boringssl/src/include/openssl/ec.h"
+
+namespace crypto {
+
+namespace keypair {
+class PublicKey;
+}
+
+// Converts a DER-encoded ECDSA-Sig-Value signature to the fixed-width format
+// defined in IEEE P1363
+// (https://commondatastorage.googleapis.com/chromium-boringssl-docs/ecdsa.h.html#IEEE-P1363-signing-and-verifying).
+// In it, signatures are a concatenation of the big-endian padded `r` and `s`
+// components. The length of `r` and `s` is determined by the curve of the
+// public key.
+//
+// This format is used in particular in JWT.
+CRYPTO_EXPORT std::optional> ConvertEcdsaDerSignatureToRaw(
+    const keypair::PublicKey& public_key,
+    base::span der_signature);
+// The same as above but uses `EC_GROUP` to determine the length of the
+// signature.
+CRYPTO_EXPORT std::optional> ConvertEcdsaDerSignatureToRaw(
+    const EC_GROUP* group,
+    base::span der_signature);
+
+}  // namespace crypto
+
+#endif  // CRYPTO_ECDSA_UTILS_H_
diff --git a/naiveproxy/src/crypto/features.cc b/naiveproxy/src/crypto/features.cc
index 53ff5305db..debe79bd3a 100644
--- a/naiveproxy/src/crypto/features.cc
+++ b/naiveproxy/src/crypto/features.cc
@@ -8,16 +8,9 @@
 
 namespace crypto::features {
 
-BASE_FEATURE(kProcessBoundStringEncryption,
-             "ProcessBoundStringEncryption",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
-BASE_FEATURE(kIsHardwareBackedFixEnabled,
-             "IsHardwareBackedFixEnabled",
-             base::FEATURE_ENABLED_BY_DEFAULT);
+BASE_FEATURE(kIsHardwareBackedFixEnabled, base::FEATURE_ENABLED_BY_DEFAULT);
 
 BASE_FEATURE(kMigrateIOSKeychainAccessibility,
-             "MigrateIOSKeychainAccessibility",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
 }  // namespace crypto::features
diff --git a/naiveproxy/src/crypto/features.gni b/naiveproxy/src/crypto/features.gni
index e9ec884de1..bcb5d1d986 100644
--- a/naiveproxy/src/crypto/features.gni
+++ b/naiveproxy/src/crypto/features.gni
@@ -2,8 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/config/features.gni")
-
 declare_args() {
   # True if NSS is used for certificate handling.
   use_nss_certs = is_linux || is_chromeos
diff --git a/naiveproxy/src/crypto/features.h b/naiveproxy/src/crypto/features.h
index c55b61b5ef..e8a49c6c67 100644
--- a/naiveproxy/src/crypto/features.h
+++ b/naiveproxy/src/crypto/features.h
@@ -10,9 +10,6 @@
 
 namespace crypto::features {
 
-// Enable encryption for process bound strings, if supported by the platform.
-CRYPTO_EXPORT BASE_DECLARE_FEATURE(kProcessBoundStringEncryption);
-
 // Enables the fix for `UnexportableSigningKey::IsHardwareBacked` when
 // dealing with Windows software keys.
 // Enabled by default on M139. Remove in or after M142.
diff --git a/naiveproxy/src/crypto/hash.cc b/naiveproxy/src/crypto/hash.cc
index e379d4cde1..f1aefe9413 100644
--- a/naiveproxy/src/crypto/hash.cc
+++ b/naiveproxy/src/crypto/hash.cc
@@ -8,6 +8,9 @@
 
 #include "base/check.h"
 #include "base/check_op.h"
+#include "base/containers/heap_array.h"
+#include "base/files/file.h"
+#include "base/memory/page_size.h"
 #include "base/notreached.h"
 #include "third_party/boringssl/src/include/openssl/digest.h"
 #include "third_party/boringssl/src/include/openssl/evp.h"
@@ -126,4 +129,29 @@ void Hasher::Finish(base::span digest) {
   CHECK(EVP_DigestFinal(ctx_.get(), digest.data(), nullptr));
 }
 
+bool HashFile(HashKind kind, base::File* file, base::span digest) {
+  if (!file->IsValid()) {
+    // Zero the out digest so that callers that fail to check the return value
+    // won't read uninitialized values.
+    std::ranges::fill(digest, 0);
+    return false;
+  }
+
+  Hasher hasher(kind);
+
+  while (true) {
+    std::array buffer;
+    std::optional bytes_read = file->ReadAtCurrentPos(buffer);
+    if (!bytes_read.has_value()) {
+      std::ranges::fill(digest, 0);
+      return false;
+    }
+    if (bytes_read.value() == 0) {
+      hasher.Finish(digest);
+      return true;
+    }
+    hasher.Update(base::span(buffer).first(*bytes_read));
+  }
+}
+
 }  // namespace crypto::hash
diff --git a/naiveproxy/src/crypto/hash.h b/naiveproxy/src/crypto/hash.h
index 4b62cd3fd8..941a3f09ab 100644
--- a/naiveproxy/src/crypto/hash.h
+++ b/naiveproxy/src/crypto/hash.h
@@ -16,6 +16,10 @@
 #include "third_party/boringssl/src/include/openssl/base.h"
 #include "third_party/boringssl/src/include/openssl/digest.h"
 
+namespace base {
+class File;
+}
+
 namespace crypto::hash {
 
 inline constexpr size_t kSha1Size = 20;
@@ -99,6 +103,15 @@ class CRYPTO_EXPORT Hasher {
   bssl::ScopedEVP_MD_CTX ctx_;
 };
 
+// A utility function for a common use-case (hashing the entire body of a
+// base::File). The digest span must be of the correct size for the specified
+// HashKind. If file IO fails while reading the file, or the passed-in file is
+// not valid, the output span is filled with zeroes and this function returns
+// false.
+[[nodiscard]] CRYPTO_EXPORT bool HashFile(HashKind kind,
+                                          base::File* file,
+                                          base::span digest);
+
 }  // namespace crypto::hash
 
 #endif  // CRYPTO_HASH_H_
diff --git a/naiveproxy/src/crypto/hmac.cc b/naiveproxy/src/crypto/hmac.cc
index 3f29b59db9..5c22879dc1 100644
--- a/naiveproxy/src/crypto/hmac.cc
+++ b/naiveproxy/src/crypto/hmac.cc
@@ -12,6 +12,7 @@
 #include "base/check.h"
 #include "base/check_op.h"
 #include "base/compiler_specific.h"
+#include "base/containers/to_vector.h"
 #include "base/notreached.h"
 #include "base/stl_util.h"
 #include "crypto/openssl_util.h"
@@ -42,11 +43,11 @@ size_t HMAC::DigestLength() const {
   }
 }
 
-bool HMAC::Init(const unsigned char* key, size_t key_length) {
+bool HMAC::Init(base::span key) {
   // Init must not be called more than once on the same HMAC object.
   DCHECK(!initialized_);
   initialized_ = true;
-  key_.assign(key, UNSAFE_TODO(key + key_length));
+  key_ = base::ToVector(key);
   return true;
 }
 
@@ -77,27 +78,8 @@ bool HMAC::Verify(std::string_view data, std::string_view digest) const {
 
 bool HMAC::Verify(base::span data,
                   base::span digest) const {
-  if (digest.size() != DigestLength())
-    return false;
-  return VerifyTruncated(data, digest);
-}
-
-bool HMAC::VerifyTruncated(std::string_view data,
-                           std::string_view digest) const {
-  return VerifyTruncated(base::as_byte_span(data), base::as_byte_span(digest));
-}
-
-bool HMAC::VerifyTruncated(base::span data,
-                           base::span digest) const {
-  if (digest.empty())
-    return false;
-
-  size_t digest_length = DigestLength();
-  if (digest.size() > digest_length)
-    return false;
-
   std::array computed_buffer;
-  auto computed_digest = base::span(computed_buffer).first(digest.size());
+  auto computed_digest = base::span(computed_buffer).first(DigestLength());
   if (!Sign(data, computed_digest)) {
     return false;
   }
@@ -177,6 +159,48 @@ bool VerifySha512(base::span key,
   return Verify(crypto::hash::HashKind::kSha512, key, data, hmac);
 }
 
+HmacSigner::HmacSigner(crypto::hash::HashKind kind,
+                       base::span key)
+    : kind_(kind), finished_(false) {
+  CHECK(HMAC_Init_ex(ctx_.get(), key.data(), key.size(),
+                     crypto::hash::EVPMDForHashKind(kind), nullptr));
+}
+
+HmacSigner::~HmacSigner() = default;
+
+void HmacSigner::Update(base::span data) {
+  CHECK(!finished_);
+  CHECK(HMAC_Update(ctx_.get(), data.data(), data.size()));
+}
+
+void HmacSigner::Finish(base::span result) {
+  CHECK(!finished_);
+  finished_ = true;
+  unsigned int len = result.size();
+  CHECK(HMAC_Final(ctx_.get(), result.data(), &len));
+  CHECK(len == result.size());
+}
+
+std::vector HmacSigner::Finish() {
+  std::vector result(crypto::hash::DigestSizeForHashKind(kind_));
+  Finish(result);
+  return result;
+}
+
+HmacVerifier::HmacVerifier(crypto::hash::HashKind kind,
+                           base::span key)
+    : signer_(kind, key) {}
+HmacVerifier::~HmacVerifier() = default;
+
+void HmacVerifier::Update(base::span data) {
+  signer_.Update(data);
+}
+
+bool HmacVerifier::Finish(base::span expected_signature) {
+  std::vector result = signer_.Finish();
+  return crypto::SecureMemEqual(result, expected_signature);
+}
+
 }  // namespace hmac
 
 }  // namespace crypto
diff --git a/naiveproxy/src/crypto/hmac.h b/naiveproxy/src/crypto/hmac.h
index 5a7823c40e..05de29a7a2 100644
--- a/naiveproxy/src/crypto/hmac.h
+++ b/naiveproxy/src/crypto/hmac.h
@@ -17,14 +17,18 @@
 #include 
 #include 
 
+#include "base/check.h"
 #include "base/containers/span.h"
 #include "crypto/crypto_export.h"
 #include "crypto/hash.h"
+#include "crypto/secure_util.h"
+#include "third_party/boringssl/src/include/openssl/hmac.h"
 
 namespace crypto {
 
 // TODO(https://issues.chromium.org/issues/374334448): Rework this interface and
 // delete much of it.
+// Deprecated; don't add new uses. See the interfaces below this class instead.
 class CRYPTO_EXPORT HMAC {
  public:
   // The set of supported hash functions. Extend as required.
@@ -45,18 +49,6 @@ class CRYPTO_EXPORT HMAC {
 
   // TODO(abarth): Add a PreferredKeyLength() member function.
 
-  // Initializes this instance using |key| of the length |key_length|. Call Init
-  // only once. It returns false on the second or later calls.
-  //
-  // NOTE: the US Federal crypto standard FIPS 198, Section 3 says:
-  //   The size of the key, K, shall be equal to or greater than L/2, where L
-  //   is the size of the hash function output.
-  // In FIPS 198-1 (and SP-800-107, which describes key size recommendations),
-  // this requirement is gone.  But a system crypto library may still enforce
-  // this old requirement.  If the key is shorter than this recommended value,
-  // Init() may fail.
-  [[nodiscard]] bool Init(const unsigned char* key, size_t key_length);
-
   // Initializes this instance using |key|. Call Init only once. It returns
   // false on the second or later calls.
   [[nodiscard]] bool Init(std::string_view key) {
@@ -65,9 +57,7 @@ class CRYPTO_EXPORT HMAC {
 
   // Initializes this instance using |key|. Call Init only once. It returns
   // false on the second or later calls.
-  [[nodiscard]] bool Init(base::span key) {
-    return Init(key.data(), key.size());
-  }
+  [[nodiscard]] bool Init(base::span key);
 
   // Calculates the HMAC for the message in |data| using the algorithm supplied
   // to the constructor and the key supplied to the Init method. The HMAC is
@@ -92,13 +82,6 @@ class CRYPTO_EXPORT HMAC {
   [[nodiscard]] bool Verify(base::span data,
                             base::span digest) const;
 
-  // Verifies a truncated HMAC, behaving identical to Verify(), except
-  // that |digest| is allowed to be smaller than |DigestLength()|.
-  [[nodiscard]] bool VerifyTruncated(std::string_view data,
-                                     std::string_view digest) const;
-  [[nodiscard]] bool VerifyTruncated(base::span data,
-                                     base::span digest) const;
-
  private:
   HashAlgorithm hash_alg_;
   bool initialized_;
@@ -149,6 +132,45 @@ CRYPTO_EXPORT void Sign(crypto::hash::HashKind kind,
                                         base::span data,
                                         base::span hmac);
 
+// Streaming sign and verify interfaces. In general you should only use these if
+// you are taking the HMAC of multiple chunks of data and want to avoid making
+// an intermediate copy - otherwise the one-shot interfaces are simpler to use.
+//
+// These classes don't impose any requirements on key sizes.
+//
+// After you call Finish() on an instance of these classes, it is illegal to
+// call Update() or Finish() on it again.
+class CRYPTO_EXPORT HmacSigner {
+ public:
+  HmacSigner(crypto::hash::HashKind kind, base::span key);
+  ~HmacSigner();
+
+  void Update(base::span data);
+  void Finish(base::span result);
+  std::vector Finish();
+
+ private:
+  const crypto::hash::HashKind kind_;
+  bool finished_;
+  bssl::ScopedHMAC_CTX ctx_;
+};
+
+class CRYPTO_EXPORT HmacVerifier {
+ public:
+  HmacVerifier(crypto::hash::HashKind kind, base::span key);
+  ~HmacVerifier();
+
+  void Update(base::span data);
+
+  // Returns whether the signature of all the data passed in via Update() so far
+  // matches |expected_signature|. This function tolerates the expected
+  // signature being the wrong length (by returning false in that case).
+  [[nodiscard]] bool Finish(base::span expected_signature);
+
+ private:
+  HmacSigner signer_;
+};
+
 }  // namespace hmac
 
 }  // namespace crypto
diff --git a/naiveproxy/src/crypto/kex.cc b/naiveproxy/src/crypto/kex.cc
new file mode 100644
index 0000000000..a64dea820c
--- /dev/null
+++ b/naiveproxy/src/crypto/kex.cc
@@ -0,0 +1,27 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "crypto/kex.h"
+
+#include "third_party/boringssl/src/include/openssl/ec_key.h"
+#include "third_party/boringssl/src/include/openssl/ecdh.h"
+#include "third_party/boringssl/src/include/openssl/evp.h"
+
+namespace crypto::kex {
+
+void EcdhP256(const crypto::keypair::PublicKey& theirs,
+              const crypto::keypair::PrivateKey& ours,
+              base::span out) {
+  CHECK(theirs.IsEcP256());
+  CHECK(ours.IsEcP256());
+
+  const EC_KEY* ourkey = EVP_PKEY_get0_EC_KEY(ours.key());
+  const EC_KEY* theirkey = EVP_PKEY_get0_EC_KEY(theirs.key());
+  const EC_POINT* theirpoint = EC_KEY_get0_public_key(theirkey);
+
+  CHECK(ECDH_compute_key(out.data(), out.size(), theirpoint, ourkey, nullptr) ==
+        out.size());
+}
+
+}  // namespace crypto::kex
diff --git a/naiveproxy/src/crypto/kex.h b/naiveproxy/src/crypto/kex.h
new file mode 100644
index 0000000000..ac62f106e8
--- /dev/null
+++ b/naiveproxy/src/crypto/kex.h
@@ -0,0 +1,29 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CRYPTO_KEX_H_
+#define CRYPTO_KEX_H_
+
+#include "base/containers/span.h"
+#include "crypto/keypair.h"
+
+namespace crypto::kex {
+
+// Derives a shared secret using elliptic-curve Diffie Hellman from a public key
+// and a private key, and stores it in the provided out span. The resulting
+// secret is not processed in any way and is not appropriate to use directly as
+// key material (not all of the bits are uniformly random).
+//
+// The caller is responsible for ensuring that `theirs` and `ours` are P-256
+// keys, e.g. with `IsEcP256`. Passing keys of the wrong type will cause the
+// function to abort. Note that these conditions imply ECDH is infallible;
+// `PublicKey` constructors enforce that P-256 keys are on the curve and not the
+// point at infinity.
+CRYPTO_EXPORT void EcdhP256(const crypto::keypair::PublicKey& theirs,
+                            const crypto::keypair::PrivateKey& ours,
+                            base::span out);
+
+}  // namespace crypto::kex
+
+#endif  // CRYPTO_KEX_H_
diff --git a/naiveproxy/src/crypto/keypair.cc b/naiveproxy/src/crypto/keypair.cc
index a13ee6c7d0..95b502f4ba 100644
--- a/naiveproxy/src/crypto/keypair.cc
+++ b/naiveproxy/src/crypto/keypair.cc
@@ -6,7 +6,6 @@
 
 #include "base/logging.h"
 #include "crypto/openssl_util.h"
-#include "crypto/rsa_private_key.h"
 #include "third_party/boringssl/src/include/openssl/bn.h"
 #include "third_party/boringssl/src/include/openssl/bytestring.h"
 #include "third_party/boringssl/src/include/openssl/curve25519.h"
@@ -37,6 +36,18 @@ bssl::UniquePtr GenerateRsa(size_t bits) {
   return key;
 }
 
+bssl::UniquePtr GenerateEc(int nid) {
+  OpenSSLErrStackTracer err_tracer(FROM_HERE);
+
+  bssl::UniquePtr ec_key(EC_KEY_new_by_curve_name(nid));
+  CHECK(ec_key);
+  CHECK(EC_KEY_generate_key(ec_key.get()));
+
+  bssl::UniquePtr key(EVP_PKEY_new());
+  CHECK(EVP_PKEY_set1_EC_KEY(key.get(), ec_key.get()));
+  return key;
+}
+
 bool IsSupportedEvpId(int evp_id) {
   return evp_id == EVP_PKEY_RSA || evp_id == EVP_PKEY_EC ||
          evp_id == EVP_PKEY_ED25519;
@@ -61,6 +72,40 @@ std::vector ExportEVPPublicKey(EVP_PKEY* pkey) {
   return result;
 }
 
+bssl::UniquePtr EVP_PKEYFromEcPoint(const EC_GROUP* group,
+                                              base::span p) {
+  bssl::UniquePtr ec(EC_KEY_new());
+  CHECK(ec);
+  CHECK(EC_KEY_set_group(ec.get(), group));
+
+  if (!EC_KEY_oct2key(ec.get(), p.data(), p.size(), nullptr)) {
+    return nullptr;
+  }
+
+  // The only failure mode for EVP_PKEY_new() is memory allocation failures,
+  // and the only failure mode for EVP_PKEY_set1_EC_KEY() is being passed a null
+  // key or EC_KEY object.
+  bssl::UniquePtr pkey(EVP_PKEY_new());
+  CHECK(pkey);
+  CHECK(EVP_PKEY_set1_EC_KEY(pkey.get(), ec.get()));
+  return pkey;
+}
+
+std::vector EvpToUncompressedEcForm(EVP_PKEY* key) {
+  OpenSSLErrStackTracer err_tracer(FROM_HERE);
+
+  std::vector ec_buffer(255);
+  EC_KEY* ec_key = EVP_PKEY_get0_EC_KEY(key);
+  size_t len = EC_POINT_point2oct(
+      EC_KEY_get0_group(ec_key), EC_KEY_get0_public_key(ec_key),
+      POINT_CONVERSION_UNCOMPRESSED, ec_buffer.data(), ec_buffer.size(),
+      /*ctx=*/nullptr);
+  CHECK(len);
+  ec_buffer.resize(len);
+
+  return ec_buffer;
+}
+
 }  // namespace
 
 PrivateKey::PrivateKey(bssl::UniquePtr key, crypto::SubtlePassKey)
@@ -87,16 +132,17 @@ PrivateKey PrivateKey::GenerateRsa4096() {
 
 // static
 PrivateKey PrivateKey::GenerateEcP256() {
-  OpenSSLErrStackTracer err_tracer(FROM_HERE);
+  return PrivateKey(GenerateEc(NID_X9_62_prime256v1));
+}
 
-  bssl::UniquePtr ec_key(
-      EC_KEY_new_by_curve_name(NID_X9_62_prime256v1));
-  CHECK(ec_key);
-  CHECK(EC_KEY_generate_key(ec_key.get()));
+// static
+PrivateKey PrivateKey::GenerateEcP384() {
+  return PrivateKey(GenerateEc(NID_secp384r1));
+}
 
-  bssl::UniquePtr key(EVP_PKEY_new());
-  CHECK(EVP_PKEY_set1_EC_KEY(key.get(), ec_key.get()));
-  return PrivateKey(std::move(key));
+// static
+PrivateKey PrivateKey::GenerateEcP521() {
+  return PrivateKey(GenerateEc(NID_secp521r1));
 }
 
 // static
@@ -134,11 +180,6 @@ std::optional PrivateKey::FromPrivateKeyInfo(
   return std::optional(PrivateKey(std::move(pkey)));
 }
 
-// static
-PrivateKey PrivateKey::FromDeprecatedRSAPrivateKey(RSAPrivateKey* key) {
-  return PrivateKey(bssl::UpRef(key->key()));
-}
-
 // static
 PrivateKey PrivateKey::FromEd25519PrivateKey(
     base::span key) {
@@ -181,15 +222,7 @@ std::vector PrivateKey::ToSubjectPublicKeyInfo() const {
 }
 
 std::vector PrivateKey::ToUncompressedForm() const {
-  OpenSSLErrStackTracer err_tracer(FROM_HERE);
-
-  std::vector buf(65);
-  EC_KEY* ec_key = EVP_PKEY_get0_EC_KEY(key_.get());
-  CHECK(EC_POINT_point2oct(
-      EC_KEY_get0_group(ec_key), EC_KEY_get0_public_key(ec_key),
-      POINT_CONVERSION_UNCOMPRESSED, buf.data(), buf.size(), /*ctx=*/nullptr));
-
-  return buf;
+  return EvpToUncompressedEcForm(key_.get());
 }
 
 std::array PrivateKey::ToEd25519PublicKey() const {
@@ -201,8 +234,6 @@ std::array PrivateKey::ToEd25519PublicKey() const {
   return result;
 }
 
-PrivateKey::PrivateKey(bssl::UniquePtr key) : key_(std::move(key)) {}
-
 bool PrivateKey::IsRsa() const {
   return EVP_PKEY_id(key_.get()) == EVP_PKEY_RSA;
 }
@@ -215,6 +246,20 @@ bool PrivateKey::IsEd25519() const {
   return EVP_PKEY_id(key_.get()) == EVP_PKEY_ED25519;
 }
 
+bool PrivateKey::IsEcP256() const {
+  return EVP_PKEY_get_ec_curve_nid(key_.get()) == NID_X9_62_prime256v1;
+}
+
+bool PrivateKey::IsEcP384() const {
+  return EVP_PKEY_get_ec_curve_nid(key_.get()) == NID_secp384r1;
+}
+
+bool PrivateKey::IsEcP521() const {
+  return EVP_PKEY_get_ec_curve_nid(key_.get()) == NID_secp521r1;
+}
+
+PrivateKey::PrivateKey(bssl::UniquePtr key) : key_(std::move(key)) {}
+
 PublicKey::PublicKey(bssl::UniquePtr key, crypto::SubtlePassKey)
     : PublicKey(std::move(key)) {}
 PublicKey::~PublicKey() = default;
@@ -276,23 +321,34 @@ std::optional PublicKey::FromRsaPublicKeyComponents(
   return PublicKey(std::move(pkey));
 }
 
+// static
 std::optional PublicKey::FromEcP256Point(
     base::span p) {
-  bssl::UniquePtr ec(EC_KEY_new());
-  CHECK(ec);
-  CHECK(EC_KEY_set_group(ec.get(), EC_group_p256()));
-
-  if (!EC_KEY_oct2key(ec.get(), p.data(), p.size(), nullptr)) {
+  auto key = EVP_PKEYFromEcPoint(EC_group_p256(), p);
+  if (!key) {
     return std::nullopt;
   }
+  return PublicKey(std::move(key));
+}
 
-  // The only failure mode for EVP_PKEY_new() is memory allocation failures,
-  // and the only failure mode for EVP_PKEY_set1_EC_KEY() is being passed a null
-  // key or EC_KEY object.
-  bssl::UniquePtr pkey(EVP_PKEY_new());
-  CHECK(pkey);
-  CHECK(EVP_PKEY_set1_EC_KEY(pkey.get(), ec.get()));
-  return PublicKey(std::move(pkey));
+// static
+std::optional PublicKey::FromEcP384Point(
+    base::span p) {
+  auto key = EVP_PKEYFromEcPoint(EC_group_p384(), p);
+  if (!key) {
+    return std::nullopt;
+  }
+  return PublicKey(std::move(key));
+}
+
+// static
+std::optional PublicKey::FromEcP521Point(
+    base::span p) {
+  auto key = EVP_PKEYFromEcPoint(EC_group_p521(), p);
+  if (!key) {
+    return std::nullopt;
+  }
+  return PublicKey(std::move(key));
 }
 
 // static
@@ -309,6 +365,28 @@ std::vector PublicKey::ToSubjectPublicKeyInfo() const {
   return ExportEVPPublicKey(key_.get());
 }
 
+std::vector PublicKey::ToUncompressedForm() const {
+  return EvpToUncompressedEcForm(key_.get());
+}
+
+std::vector PublicKey::GetRsaExponent() const {
+  CHECK(IsRsa());
+  RSA* rsa = EVP_PKEY_get0_RSA(key_.get());
+  const BIGNUM* e = RSA_get0_e(rsa);
+  std::vector result(BN_num_bytes(e));
+  BN_bn2bin(e, result.data());
+  return result;
+}
+
+std::vector PublicKey::GetRsaModulus() const {
+  CHECK(IsRsa());
+  RSA* rsa = EVP_PKEY_get0_RSA(key_.get());
+  const BIGNUM* n = RSA_get0_n(rsa);
+  std::vector result(BN_num_bytes(n));
+  BN_bn2bin(n, result.data());
+  return result;
+}
+
 bool PublicKey::IsRsa() const {
   return EVP_PKEY_id(key_.get()) == EVP_PKEY_RSA;
 }
@@ -321,6 +399,18 @@ bool PublicKey::IsEd25519() const {
   return EVP_PKEY_id(key_.get()) == EVP_PKEY_ED25519;
 }
 
+bool PublicKey::IsEcP256() const {
+  return EVP_PKEY_get_ec_curve_nid(key_.get()) == NID_X9_62_prime256v1;
+}
+
+bool PublicKey::IsEcP384() const {
+  return EVP_PKEY_get_ec_curve_nid(key_.get()) == NID_secp384r1;
+}
+
+bool PublicKey::IsEcP521() const {
+  return EVP_PKEY_get_ec_curve_nid(key_.get()) == NID_secp521r1;
+}
+
 PublicKey::PublicKey(bssl::UniquePtr key) : key_(std::move(key)) {}
 
 }  // namespace crypto::keypair
diff --git a/naiveproxy/src/crypto/keypair.h b/naiveproxy/src/crypto/keypair.h
index b3b2838ade..9adca201d6 100644
--- a/naiveproxy/src/crypto/keypair.h
+++ b/naiveproxy/src/crypto/keypair.h
@@ -13,10 +13,6 @@
 #include "crypto/subtle_passkey.h"
 #include "third_party/boringssl/src/include/openssl/base.h"
 
-namespace crypto {
-class RSAPrivateKey;
-}
-
 namespace crypto::keypair {
 
 // This class wraps an EVP_PKEY containing a private key. Since EVP_PKEY is
@@ -44,8 +40,10 @@ class CRYPTO_EXPORT PrivateKey {
   static PrivateKey GenerateRsa2048();
   static PrivateKey GenerateRsa4096();
 
-  // Generates a fresh, random elliptic curve key on the NIST P-256 curve.
+  // Generates a fresh, random elliptic curve key on the specified curve.
   static PrivateKey GenerateEcP256();
+  static PrivateKey GenerateEcP384();
+  static PrivateKey GenerateEcP521();
 
   // Generates a fresh, random Ed25519 key.
   static PrivateKey GenerateEd25519();
@@ -56,10 +54,6 @@ class CRYPTO_EXPORT PrivateKey {
   static std::optional FromPrivateKeyInfo(
       base::span pki);
 
-  // Deprecated compatibility interface for using new signing APIs with the old
-  // RSAPrivateKey type. Do not add new uses.
-  static PrivateKey FromDeprecatedRSAPrivateKey(RSAPrivateKey* key);
-
   // Imports an RFC 8032-encoded Ed25519 private key.
   //
   // The encoding used doesn't allow for importing to fail (all input bit
@@ -97,6 +91,10 @@ class CRYPTO_EXPORT PrivateKey {
   bool IsEc() const;
   bool IsEd25519() const;
 
+  bool IsEcP256() const;
+  bool IsEcP384() const;
+  bool IsEcP521() const;
+
  private:
   explicit PrivateKey(bssl::UniquePtr key);
 
@@ -134,15 +132,19 @@ class CRYPTO_EXPORT PublicKey {
       base::span n,
       base::span e);
 
-  // Imports a big-endian integer point to form an EC P-256 public key. Returns
+  // Imports a big-endian integer point to form an EC public key. Returns
   // nullopt if the point is not on the curve or something else is wrong with
   // it.
   //
-  // Note: unless you *only* want an EC P-256 key, you should use
+  // Note: unless you *only* want an EC key on a fixed curve, you should use
   // SubjectPublicKeyInfo as a serialization format rather than inventing your
   // own format.
   static std::optional FromEcP256Point(
       base::span point);
+  static std::optional FromEcP384Point(
+      base::span point);
+  static std::optional FromEcP521Point(
+      base::span point);
 
   // Imports an Ed25519 public key in RFC 8032 format.
   //
@@ -154,6 +156,15 @@ class CRYPTO_EXPORT PublicKey {
   // Exports a PublicKey as an X.509 SubjectPublicKeyInfo.
   std::vector ToSubjectPublicKeyInfo() const;
 
+  // Exports an EC public key in X9.62 uncompressed form. It is illegal to call
+  // this on a non-EC PublicKey.
+  std::vector ToUncompressedForm() const;
+
+  // Export the components (e, n) of an RSA public key, as big-endian integers.
+  // It is illegal to call these on a non-RSA PublicKey.
+  std::vector GetRsaExponent() const;
+  std::vector GetRsaModulus() const;
+
   EVP_PKEY* key() { return key_.get(); }
   const EVP_PKEY* key() const { return key_.get(); }
 
@@ -161,6 +172,10 @@ class CRYPTO_EXPORT PublicKey {
   bool IsEc() const;
   bool IsEd25519() const;
 
+  bool IsEcP256() const;
+  bool IsEcP384() const;
+  bool IsEcP521() const;
+
  private:
   explicit PublicKey(bssl::UniquePtr key);
 
diff --git a/naiveproxy/src/crypto/mac_security_services_lock.cc b/naiveproxy/src/crypto/mac_security_services_lock.cc
deleted file mode 100644
index c96e698280..0000000000
--- a/naiveproxy/src/crypto/mac_security_services_lock.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2011 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "crypto/mac_security_services_lock.h"
-
-#include "base/no_destructor.h"
-#include "base/synchronization/lock.h"
-
-namespace crypto {
-
-base::Lock& GetMacSecurityServicesLock() {
-  static base::NoDestructor lock;
-  return *lock;
-}
-
-}  // namespace crypto
diff --git a/naiveproxy/src/crypto/mac_security_services_lock.h b/naiveproxy/src/crypto/mac_security_services_lock.h
deleted file mode 100644
index 08750d15fc..0000000000
--- a/naiveproxy/src/crypto/mac_security_services_lock.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CRYPTO_MAC_SECURITY_SERVICES_LOCK_H_
-#define CRYPTO_MAC_SECURITY_SERVICES_LOCK_H_
-
-#include "crypto/crypto_export.h"
-
-namespace base {
-class Lock;
-}
-
-namespace crypto {
-
-// The Mac OS X certificate and key management wrappers over CSSM are not
-// thread-safe. In particular, code that accesses the CSSM database is
-// problematic.
-//
-// https://developer.apple.com/documentation/security/certificate_key_and_trust_services/working_with_concurrency
-CRYPTO_EXPORT base::Lock& GetMacSecurityServicesLock();
-
-}  // namespace crypto
-
-#endif  // CRYPTO_MAC_SECURITY_SERVICES_LOCK_H_
diff --git a/naiveproxy/src/crypto/nss_util.cc b/naiveproxy/src/crypto/nss_util.cc
index 00cd0c8a58..9f90fc0539 100644
--- a/naiveproxy/src/crypto/nss_util.cc
+++ b/naiveproxy/src/crypto/nss_util.cc
@@ -21,8 +21,8 @@
 #include "base/debug/alias.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/lazy_instance.h"
 #include "base/logging.h"
+#include "base/no_destructor.h"
 #include "base/path_service.h"
 #include "base/strings/stringprintf.h"
 #include "base/threading/scoped_blocking_call.h"
@@ -89,7 +89,7 @@ char* PKCS11PasswordFunc(PK11SlotInfo* slot, PRBool retry, void* arg) {
 // singleton.
 class NSPRInitSingleton {
  private:
-  friend struct base::LazyInstanceTraitsBase;
+  friend class base::NoDestructor;
 
   NSPRInitSingleton() { PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0); }
 
@@ -99,8 +99,10 @@ class NSPRInitSingleton {
   ~NSPRInitSingleton() = delete;
 };
 
-base::LazyInstance::Leaky g_nspr_singleton =
-    LAZY_INSTANCE_INITIALIZER;
+NSPRInitSingleton& GetNSPRInitSingleton() {
+  static base::NoDestructor instance;
+  return *instance;
+}
 
 // Force a crash with error info on NSS_NoDB_Init failure.
 void CrashOnNSSInitFailure() {
@@ -178,7 +180,7 @@ class NSSInitSingleton {
   }
 
  private:
-  friend struct base::LazyInstanceTraitsBase;
+  friend class base::NoDestructor;
 
   NSSInitSingleton() {
     // Initializing NSS causes us to do blocking IO.
@@ -276,25 +278,28 @@ class NSSInitSingleton {
   base::Lock slot_map_lock_;
 };
 
-base::LazyInstance::Leaky g_nss_singleton =
-    LAZY_INSTANCE_INITIALIZER;
+NSSInitSingleton& GetNSSInitSingleton() {
+  static base::NoDestructor instance;
+  return *instance;
+}
+
 }  // namespace
 
 ScopedPK11Slot OpenSoftwareNSSDB(const base::FilePath& path,
                                  const std::string& description) {
-  return g_nss_singleton.Get().OpenSoftwareNSSDB(path, description);
+  return GetNSSInitSingleton().OpenSoftwareNSSDB(path, description);
 }
 
 SECStatus CloseSoftwareNSSDB(PK11SlotInfo* slot) {
-  return g_nss_singleton.Get().CloseSoftwareNSSDB(slot);
+  return GetNSSInitSingleton().CloseSoftwareNSSDB(slot);
 }
 
 void EnsureNSPRInit() {
-  g_nspr_singleton.Get();
+  GetNSPRInitSingleton();
 }
 
 void EnsureNSSInit() {
-  g_nss_singleton.Get();
+  GetNSSInitSingleton();
 }
 
 bool CheckNSSVersion(const char* version) {
diff --git a/naiveproxy/src/crypto/nss_util_chromeos.cc b/naiveproxy/src/crypto/nss_util_chromeos.cc
index 15a75c25f3..124149c562 100644
--- a/naiveproxy/src/crypto/nss_util_chromeos.cc
+++ b/naiveproxy/src/crypto/nss_util_chromeos.cc
@@ -21,7 +21,6 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/functional/bind.h"
-#include "base/lazy_instance.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
@@ -152,6 +151,13 @@ class ChromeOSTokenManager {
     ScopedPK11Slot tpm_slot;
   };
 
+  static ChromeOSTokenManager& Get() {
+    static base::NoDestructor instance;
+    return *instance;
+  }
+
+  static bool IsCreated() { return instance_created_; }
+
   ScopedPK11Slot OpenPersistentNSSDBForPath(const std::string& db_name,
                                             const base::FilePath& path) {
     DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -476,9 +482,14 @@ class ChromeOSTokenManager {
   }
 
  private:
-  friend struct base::LazyInstanceTraitsBase;
+  friend class base::NoDestructor;
 
-  ChromeOSTokenManager() { EnsureNSSInit(); }
+  static bool instance_created_;
+
+  ChromeOSTokenManager() {
+    EnsureNSSInit();
+    instance_created_ = true;
+  }
 
   // NOTE(willchan): We don't actually cleanup on destruction since we leak NSS
   // to prevent non-joinable threads from using NSS after it's already been
@@ -509,8 +520,8 @@ class ChromeOSTokenManager {
   THREAD_CHECKER(thread_checker_);
 };
 
-base::LazyInstance::Leaky g_token_manager =
-    LAZY_INSTANCE_INITIALIZER;
+bool ChromeOSTokenManager::instance_created_ = false;
+
 }  // namespace
 
 base::FilePath GetSoftwareNSSDBPath(
@@ -519,13 +530,13 @@ base::FilePath GetSoftwareNSSDBPath(
 }
 
 void GetSystemNSSKeySlot(base::OnceCallback callback) {
-  g_token_manager.Get().GetSystemNSSKeySlot(std::move(callback));
+  ChromeOSTokenManager::Get().GetSystemNSSKeySlot(std::move(callback));
 }
 
 void PrepareSystemSlotForTesting(ScopedPK11Slot slot) {
   DCHECK(!ChromeOSTokenManagerDataForTesting::GetInstance().test_system_slot);
-  DCHECK(!g_token_manager.IsCreated() ||
-         !g_token_manager.Get().IsInitializationStarted())
+  DCHECK(!ChromeOSTokenManager::IsCreated() ||
+         !ChromeOSTokenManager::Get().IsInitializationStarted())
       << "PrepareSystemSlotForTesting is called after initialization started";
 
   ChromeOSTokenManagerDataForTesting::GetInstance().test_system_slot =
@@ -533,83 +544,87 @@ void PrepareSystemSlotForTesting(ScopedPK11Slot slot) {
 }
 
 void ResetSystemSlotForTesting() {
-  if (g_token_manager.IsCreated()) {
-    g_token_manager.Get().ResetSystemSlotForTesting();  // IN-TEST
+  if (ChromeOSTokenManager::IsCreated()) {
+    ChromeOSTokenManager::Get().ResetSystemSlotForTesting();  // IN-TEST
   }
   ChromeOSTokenManagerDataForTesting::GetInstance().test_system_slot.reset();
 }
 
 void ResetTokenManagerForTesting() {
-  if (g_token_manager.IsCreated()) {
-    g_token_manager.Get().ResetTokenManagerForTesting();  // IN-TEST
+  if (ChromeOSTokenManager::IsCreated()) {
+    ChromeOSTokenManager::Get().ResetTokenManagerForTesting();  // IN-TEST
   }
   ResetSystemSlotForTesting();  // IN-TEST
 }
 
 void IsTPMTokenEnabled(base::OnceCallback callback) {
-  g_token_manager.Get().IsTPMTokenEnabled(std::move(callback));
+  ChromeOSTokenManager::Get().IsTPMTokenEnabled(std::move(callback));
 }
 
 void InitializeTPMTokenAndSystemSlot(int token_slot_id,
                                      base::OnceCallback callback) {
-  g_token_manager.Get().InitializeTPMTokenAndSystemSlot(token_slot_id,
-                                                        std::move(callback));
+  ChromeOSTokenManager::Get().InitializeTPMTokenAndSystemSlot(
+      token_slot_id, std::move(callback));
 }
 
 void FinishInitializingTPMTokenAndSystemSlot() {
-  g_token_manager.Get().FinishInitializingTPMTokenAndSystemSlot();
+  ChromeOSTokenManager::Get().FinishInitializingTPMTokenAndSystemSlot();
 }
 
 bool InitializeNSSForChromeOSUser(const std::string& username_hash,
                                   const base::FilePath& path) {
-  return g_token_manager.Get().InitializeNSSForChromeOSUser(username_hash,
-                                                            path);
+  return ChromeOSTokenManager::Get().InitializeNSSForChromeOSUser(username_hash,
+                                                                  path);
 }
 
 bool InitializeNSSForChromeOSUserWithSlot(const std::string& username_hash,
                                           ScopedPK11Slot public_slot) {
-  return g_token_manager.Get().InitializeNSSForChromeOSUserWithSlot(
+  return ChromeOSTokenManager::Get().InitializeNSSForChromeOSUserWithSlot(
       username_hash, std::move(public_slot));
 }
 
 bool ShouldInitializeTPMForChromeOSUser(const std::string& username_hash) {
-  return g_token_manager.Get().ShouldInitializeTPMForChromeOSUser(
+  return ChromeOSTokenManager::Get().ShouldInitializeTPMForChromeOSUser(
       username_hash);
 }
 
 void WillInitializeTPMForChromeOSUser(const std::string& username_hash) {
-  g_token_manager.Get().WillInitializeTPMForChromeOSUser(username_hash);
+  ChromeOSTokenManager::Get().WillInitializeTPMForChromeOSUser(username_hash);
 }
 
 void InitializeTPMForChromeOSUser(const std::string& username_hash,
                                   CK_SLOT_ID slot_id) {
-  g_token_manager.Get().InitializeTPMForChromeOSUser(username_hash, slot_id);
+  ChromeOSTokenManager::Get().InitializeTPMForChromeOSUser(username_hash,
+                                                           slot_id);
 }
 
 void InitializePrivateSoftwareSlotForChromeOSUser(
     const std::string& username_hash) {
-  g_token_manager.Get().InitializePrivateSoftwareSlotForChromeOSUser(
+  ChromeOSTokenManager::Get().InitializePrivateSoftwareSlotForChromeOSUser(
       username_hash);
 }
 
 ScopedPK11Slot GetPublicSlotForChromeOSUser(const std::string& username_hash) {
-  return g_token_manager.Get().GetPublicSlotForChromeOSUser(username_hash);
+  return ChromeOSTokenManager::Get().GetPublicSlotForChromeOSUser(
+      username_hash);
 }
 
 ScopedPK11Slot GetPrivateSlotForChromeOSUser(
     const std::string& username_hash,
     base::OnceCallback callback) {
-  return g_token_manager.Get().GetPrivateSlotForChromeOSUser(
+  return ChromeOSTokenManager::Get().GetPrivateSlotForChromeOSUser(
       username_hash, std::move(callback));
 }
 
 void CloseChromeOSUserForTesting(const std::string& username_hash) {
-  g_token_manager.Get().CloseChromeOSUserForTesting(username_hash);
+  ChromeOSTokenManager::Get().CloseChromeOSUserForTesting(  // IN-TEST
+      username_hash);
 }
 
 void SetPrivateSoftwareSlotForChromeOSUserForTesting(ScopedPK11Slot slot) {
-  g_token_manager.Get().SetPrivateSoftwareSlotForChromeOSUserForTesting(
-      std::move(slot));
+  ChromeOSTokenManager::Get()
+      .SetPrivateSoftwareSlotForChromeOSUserForTesting(  // IN-TEST
+          std::move(slot));
 }
 
 }  // namespace crypto
diff --git a/naiveproxy/src/crypto/obsolete/md5.cc b/naiveproxy/src/crypto/obsolete/md5.cc
index 55166917ad..38f347bcc0 100644
--- a/naiveproxy/src/crypto/obsolete/md5.cc
+++ b/naiveproxy/src/crypto/obsolete/md5.cc
@@ -47,10 +47,12 @@ Md5& Md5::operator=(Md5&& other) {
 
 Md5::~Md5() = default;
 
+// static
 Md5 Md5::MakeMd5HasherForTesting() {
   return {};
 }
 
+// static
 std::array Md5::HashForTesting(
     base::span data) {
   return Hash(data);
diff --git a/naiveproxy/src/crypto/obsolete/md5.h b/naiveproxy/src/crypto/obsolete/md5.h
index 8af433b11c..72b002aafe 100644
--- a/naiveproxy/src/crypto/obsolete/md5.h
+++ b/naiveproxy/src/crypto/obsolete/md5.h
@@ -13,6 +13,7 @@
 #include "third_party/boringssl/src/include/openssl/digest.h"
 
 namespace crypto::obsolete {
+static constexpr size_t kMd5Size = 16;
 class Md5;
 }
 
@@ -20,6 +21,7 @@ namespace ash::printing {
 crypto::obsolete::Md5 MakeMd5HasherForPrinterConfigurer();
 crypto::obsolete::Md5 MakeMd5HasherForUsbPrinterUtil();
 crypto::obsolete::Md5 MakeMd5HasherForZeroconf();
+std::string PolicyPrinterId(const std::string& json);
 std::string ServerPrinterId(const std::string& url);
 }  // namespace ash::printing
 
@@ -31,6 +33,15 @@ namespace autofill {
 crypto::obsolete::Md5 MakeMd5HasherForPasswordRequirementsSpec();
 }
 
+namespace base {
+std::array Md5ForWinInspectionResultsCache(
+    base::span payload);
+}
+
+namespace blink {
+uint32_t MD5Hash32ForBackgroundTracingHelper(std::string_view str);
+}
+
 namespace bookmarks {
 class BookmarkCodec;
 }  // namespace bookmarks
@@ -39,6 +50,26 @@ namespace cachetool {
 crypto::obsolete::Md5 MakeMd5HasherForCachetools();
 }
 
+namespace content {
+std::string Md5OfPixelsAsHexForWebTests(base::span pixels);
+}
+
+namespace content_suggestions_tile_saver {
+std::string Md5AsHexForFaviconUrl(std::string_view url);
+}
+
+namespace devtools {
+std::string Md5OfUrlAsHexForDevTools(std::string_view url);
+}
+
+namespace display {
+std::string Md5AsHexForEdid(std::string_view data);
+}
+
+namespace drive {
+crypto::obsolete::Md5 MakeMd5HasherForDriveFsAccount();
+}
+
 namespace drive::util {
 crypto::obsolete::Md5 MakeMd5HasherForDriveApi();
 }
@@ -47,6 +78,10 @@ namespace extensions::image_writer {
 crypto::obsolete::Md5 MakeMd5HasherForImageWriter();
 }
 
+namespace history {
+std::string Md5AsHexForTopSites(std::string_view url_spec);
+}
+
 namespace media::test {
 crypto::obsolete::Md5 MakeMd5HasherForVideoFrameValidation();
 }
@@ -55,10 +90,34 @@ namespace net {
 crypto::obsolete::Md5 MakeMd5HasherForHttpVaryData();
 }
 
+namespace performance_manager {
+std::string Md5AsHexForDatabaseKey(std::string_view input);
+}
+
 namespace policy {
 crypto::obsolete::Md5 MakeMd5HasherForPolicyEventId();
 }
 
+namespace reading_list {
+std::string Md5AsHexForOfflineUrlUtils(std::string_view url);
+}
+
+namespace remoting {
+std::string GetHostHash();
+}
+
+namespace safe_browsing {
+std::string Md5AsHexForBodyDigest(std::string_view data);
+}
+
+namespace shell_util {
+std::string Md5AsBase32ForUserSpecificRegistrySuffix(std::string_view str);
+}
+
+namespace spellcheck {
+std::string Md5AsHexForDictionaryChecksum(std::string_view data);
+}
+
 namespace trusted_vault {
 std::string MD5StringForTrustedVault(const std::string& local_trusted_value);
 }
@@ -81,7 +140,7 @@ namespace crypto::obsolete {
 // MD5 in new production code.
 class CRYPTO_EXPORT Md5 {
  public:
-  static constexpr size_t kSize = 16;
+  static constexpr size_t kSize = kMd5Size;
 
   Md5(const Md5& other);
   Md5(Md5&& other);
@@ -95,7 +154,7 @@ class CRYPTO_EXPORT Md5 {
   void Finish(base::span result);
   std::array Finish();
 
-  Md5 MakeMd5HasherForTesting();
+  static Md5 MakeMd5HasherForTesting();
   static std::array HashForTesting(
       base::span data);
 
@@ -105,29 +164,67 @@ class CRYPTO_EXPORT Md5 {
   // The friends listed here are the areas required to continue using MD5 for
   // compatibility with existing specs, on-disk data, or similar.
   friend Md5 android_tools::MakeMd5HasherForMd5sumTool();
-  friend Md5 policy::MakeMd5HasherForPolicyEventId();
+  friend uint32_t blink::MD5Hash32ForBackgroundTracingHelper(
+      std::string_view str);
+  friend Md5 cachetool::MakeMd5HasherForCachetools();
+  friend std::string content::Md5OfPixelsAsHexForWebTests(
+      base::span pixels);
+  friend Md5 drive::MakeMd5HasherForDriveFsAccount();
   friend Md5 drive::util::MakeMd5HasherForDriveApi();
   friend Md5 extensions::image_writer::MakeMd5HasherForImageWriter();
-  friend Md5 cachetool::MakeMd5HasherForCachetools();
+  friend Md5 policy::MakeMd5HasherForPolicyEventId();
+  friend std::string remoting::GetHostHash();
+  friend std::string safe_browsing::Md5AsHexForBodyDigest(
+      std::string_view data);
+  friend std::string shell_util::Md5AsBase32ForUserSpecificRegistrySuffix(
+      std::string_view str);
+  friend std::string spellcheck::Md5AsHexForDictionaryChecksum(
+      std::string_view data);
 
   // TODO(b/298652869): get rid of these.
   friend Md5 ash::printing::MakeMd5HasherForPrinterConfigurer();
   friend Md5 ash::printing::MakeMd5HasherForUsbPrinterUtil();
   friend Md5 ash::printing::MakeMd5HasherForZeroconf();
+  friend std::string ash::printing::PolicyPrinterId(const std::string& json);
   friend std::string ash::printing::ServerPrinterId(const std::string& url);
 
   // TODO(https://crbug.com/433545115): get rid of this.
   friend Md5 autofill::MakeMd5HasherForPasswordRequirementsSpec();
 
+  // TODO(https://crbug.com/450285252): get rid of this.
+  friend std::array base::Md5ForWinInspectionResultsCache(
+      base::span payload);
+
   // TODO(https://crbug.com/426243026): get rid of this.
   friend class bookmarks::BookmarkCodec;
 
+  // TODO(crbug.com/454958766): get rid of this.
+  friend std::string content_suggestions_tile_saver::Md5AsHexForFaviconUrl(
+      std::string_view url);
+
+  // TODO(crbug.com/454363517): get rid of this.
+  friend std::string devtools::Md5OfUrlAsHexForDevTools(std::string_view url);
+
+  // TODO(crbug.com/454630854): get rid of this.
+  friend std::string display::Md5AsHexForEdid(std::string_view data);
+
+  // TODO(https://crbug.com/454354275): get rid of this.
+  friend std::string history::Md5AsHexForTopSites(std::string_view url_spec);
+
   // TODO(https://crbug.com/428022614): get rid of this.
   friend Md5 media::test::MakeMd5HasherForVideoFrameValidation();
 
   // TODO(https://crbug.com/419853200): get rid of this.
   friend Md5 net::MakeMd5HasherForHttpVaryData();
 
+  // TODO(crbug.com/454931298): get rid of this.
+  friend std::string performance_manager::Md5AsHexForDatabaseKey(
+      std::string_view input);
+
+  // TODO(https://crbug.com/454946840): get rid of this.
+  friend std::string reading_list::Md5AsHexForOfflineUrlUtils(
+      std::string_view url);
+
   // TODO(https://crbug.com/425990763): get rid of this.
   friend std::string trusted_vault::MD5StringForTrustedVault(
       const std::string& local_trusted_value);
diff --git a/naiveproxy/src/crypto/obsolete/sha1.cc b/naiveproxy/src/crypto/obsolete/sha1.cc
new file mode 100644
index 0000000000..b5bb52c40f
--- /dev/null
+++ b/naiveproxy/src/crypto/obsolete/sha1.cc
@@ -0,0 +1,79 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "crypto/obsolete/sha1.h"
+
+#include "third_party/boringssl/src/include/openssl/digest.h"
+#include "third_party/boringssl/src/include/openssl/evp.h"
+
+namespace crypto::obsolete {
+
+// static
+std::array Sha1::Hash(std::string_view data) {
+  return Hash(base::as_byte_span(data));
+}
+
+// static
+std::array Sha1::Hash(base::span data) {
+  std::array result;
+  Sha1 hasher;
+  hasher.Update(data);
+  hasher.Finish(result);
+  return result;
+}
+
+Sha1::Sha1() {
+  CHECK(EVP_DigestInit(ctx_.get(), EVP_sha1()));
+}
+
+Sha1::Sha1(const Sha1& other) {
+  *this = other;
+}
+
+Sha1::Sha1(Sha1&& other) {
+  *this = other;
+}
+
+Sha1& Sha1::operator=(const Sha1& other) {
+  CHECK(EVP_MD_CTX_copy_ex(ctx_.get(), other.ctx_.get()));
+  return *this;
+}
+
+Sha1& Sha1::operator=(Sha1&& other) {
+  ctx_ = std::move(other.ctx_);
+  return *this;
+}
+
+Sha1::~Sha1() = default;
+
+// static
+Sha1 Sha1::MakeSha1HasherForTesting() {
+  return {};
+}
+
+// static
+std::array Sha1::HashForTesting(
+    base::span data) {
+  return Hash(data);
+}
+
+void Sha1::Update(std::string_view data) {
+  Update(base::as_byte_span(data));
+}
+
+void Sha1::Update(base::span data) {
+  CHECK(EVP_DigestUpdate(ctx_.get(), data.data(), data.size()));
+}
+
+void Sha1::Finish(base::span result) {
+  CHECK(EVP_DigestFinal(ctx_.get(), result.data(), nullptr));
+}
+
+std::array Sha1::Finish() {
+  std::array result;
+  Finish(result);
+  return result;
+}
+
+}  // namespace crypto::obsolete
diff --git a/naiveproxy/src/crypto/obsolete/sha1.h b/naiveproxy/src/crypto/obsolete/sha1.h
new file mode 100644
index 0000000000..932a225475
--- /dev/null
+++ b/naiveproxy/src/crypto/obsolete/sha1.h
@@ -0,0 +1,70 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CRYPTO_OBSOLETE_SHA1_H_
+#define CRYPTO_OBSOLETE_SHA1_H_
+
+#include 
+#include 
+
+#include "base/containers/span.h"
+#include "base/gtest_prod_util.h"
+#include "crypto/crypto_export.h"
+#include "third_party/boringssl/src/include/openssl/digest.h"
+
+namespace crypto::obsolete {
+static constexpr size_t kSha1Size = 20;
+class Sha1;
+}  // namespace crypto::obsolete
+
+namespace ash::ambient {
+std::string GetCachedImageHash(std::string_view image);
+std::string Sha1UrlAsHexEncodeForFilename(std::string_view url);
+}  // namespace ash::ambient
+
+namespace crypto::obsolete {
+
+// This class is used for computing SHA-1 hashes, either one-shot via
+// SHA1::Hash(), or streaming via constructing a SHA-1 instance, calling
+// Update(), then calling Finish(). It cannot be constructed except by friend
+// classes, and to become a friend class you must talk to a member of
+// //CRYPTO_OWNERS. You should not use SHA-1 in new production code.
+class CRYPTO_EXPORT Sha1 {
+ public:
+  static constexpr size_t kSize = kSha1Size;
+
+  Sha1(const Sha1& other);
+  Sha1(Sha1&& other);
+  Sha1& operator=(const Sha1& other);
+  Sha1& operator=(Sha1&& other);
+  ~Sha1();
+
+  void Update(std::string_view data);
+  void Update(base::span data);
+
+  void Finish(base::span result);
+  std::array Finish();
+
+  static Sha1 MakeSha1HasherForTesting();
+  static std::array HashForTesting(
+      base::span data);
+
+ private:
+  FRIEND_TEST_ALL_PREFIXES(Sha1Test, KnownAnswer);
+
+  // The friends listed here are the areas required to continue using SHA-1 for
+  // compatibility with existing specs, on-disk data, or similar.
+  friend std::string ash::ambient::GetCachedImageHash(std::string_view image);
+  friend std::string ash::ambient::Sha1UrlAsHexEncodeForFilename(std::string_view url);
+
+  Sha1();
+  static std::array Hash(std::string_view data);
+  static std::array Hash(base::span data);
+
+  bssl::ScopedEVP_MD_CTX ctx_;
+};
+
+}  // namespace crypto::obsolete
+
+#endif  // CRYPTO_OBSOLETE_SHA1_H_
diff --git a/naiveproxy/src/crypto/pem.cc b/naiveproxy/src/crypto/pem.cc
new file mode 100644
index 0000000000..82e92b0e54
--- /dev/null
+++ b/naiveproxy/src/crypto/pem.cc
@@ -0,0 +1,44 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "crypto/pem.h"
+
+#include "base/containers/to_vector.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/strings/string_view_util.h"
+#include "third_party/boringssl/src/pki/pem.h"
+
+namespace crypto::pem {
+
+std::vector MessagesFromFile(
+    const base::FilePath& path,
+    std::initializer_list allowed_types) {
+  std::optional> contents = base::ReadFileToBytes(path);
+  if (!contents.has_value()) {
+    return {};
+  }
+
+  base::span types(allowed_types);
+  return bssl::PEMDecode(base::as_string_view(*contents),
+                         bssl::Span(types));
+}
+
+std::optional> SingleMessageFromFile(
+    const base::FilePath& path,
+    std::string_view allowed_type) {
+  std::optional> contents = base::ReadFileToBytes(path);
+  if (!contents.has_value()) {
+    return std::nullopt;
+  }
+
+  std::optional body =
+      bssl::PEMDecodeSingle(base::as_string_view(*contents), allowed_type);
+  if (!body.has_value()) {
+    return std::nullopt;
+  }
+  return base::ToVector(base::as_byte_span(*body));
+}
+
+}  // namespace crypto::pem
diff --git a/naiveproxy/src/crypto/pem.h b/naiveproxy/src/crypto/pem.h
new file mode 100644
index 0000000000..c7329020e6
--- /dev/null
+++ b/naiveproxy/src/crypto/pem.h
@@ -0,0 +1,45 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Utility functions for dealing with RFC 1421 PEM messages.
+
+#ifndef CRYPTO_PEM_H_
+#define CRYPTO_PEM_H_
+
+#include 
+#include 
+
+#include "base/containers/span.h"
+#include "crypto/crypto_export.h"
+
+namespace base {
+class FilePath;
+}
+
+namespace bssl {
+struct PEMToken;
+}
+
+namespace crypto::pem {
+
+// These functions are wrappers for bssl::PEMDecode and bssl::PEMDecodeSingle
+// that decode the contents of a named file. MessageFromFile() returns a vector
+// of all the messages in the named file with one of the allowed types. If file
+// IO fails for some reason, this function returns an empty vector, so that case
+// is not distinguishable from an invalid PEM file, or a valid PEM file with no
+// messages of the named types.
+//
+// SingleMessageFromFile() does similar, but returns the body of the single
+// decoded message, if there is one. For any other case (multiple valid
+// messages, an invalid message, an unreadable file, etc) it returns nullopt.
+CRYPTO_EXPORT std::vector MessagesFromFile(
+    const base::FilePath& path,
+    std::initializer_list allowed_types);
+CRYPTO_EXPORT std::optional> SingleMessageFromFile(
+    const base::FilePath& path,
+    std::string_view allowed_type);
+
+}  // namespace crypto::pem
+
+#endif  // CRYPTO_PEM_H_
diff --git a/naiveproxy/src/crypto/process_bound_string.h b/naiveproxy/src/crypto/process_bound_string.h
index 729f75126d..d271d164a6 100644
--- a/naiveproxy/src/crypto/process_bound_string.h
+++ b/naiveproxy/src/crypto/process_bound_string.h
@@ -74,12 +74,9 @@ class CRYPTO_EXPORT ProcessBound {
   explicit ProcessBound(const StringType& value)
       : original_size_(value.size()) {
     std::vector data(value.begin(), value.end());
-    if (base::FeatureList::IsEnabled(
-            crypto::features::kProcessBoundStringEncryption)) {
-      data.resize(internal::MaybeRoundUp(data.size()));
-      encrypted_ =
-          internal::MaybeEncryptBuffer(base::as_writable_byte_span(data));
-    }
+    data.resize(internal::MaybeRoundUp(data.size()));
+    encrypted_ =
+        internal::MaybeEncryptBuffer(base::as_writable_byte_span(data));
     maybe_encrypted_data_ = std::move(data);
   }
 
@@ -121,7 +118,7 @@ class CRYPTO_EXPORT ProcessBound {
   bool empty() const { return size() == 0; }
 
  private:
-  FRIEND_TEST_ALL_PREFIXES(ProcessBoundFeatureTest, Encryption);
+  FRIEND_TEST_ALL_PREFIXES(ProcessBoundEncryptionTest, Encryption);
   std::vector maybe_encrypted_data_;
   size_t original_size_;
   bool encrypted_ = false;
diff --git a/naiveproxy/src/crypto/rsa_private_key.cc b/naiveproxy/src/crypto/rsa_private_key.cc
deleted file mode 100644
index edd70d2d09..0000000000
--- a/naiveproxy/src/crypto/rsa_private_key.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2011 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "crypto/rsa_private_key.h"
-
-#include 
-
-#include 
-#include 
-
-#include "base/check.h"
-#include "base/compiler_specific.h"
-#include "base/containers/span.h"
-#include "crypto/openssl_util.h"
-#include "third_party/boringssl/src/include/openssl/bn.h"
-#include "third_party/boringssl/src/include/openssl/bytestring.h"
-#include "third_party/boringssl/src/include/openssl/evp.h"
-#include "third_party/boringssl/src/include/openssl/mem.h"
-#include "third_party/boringssl/src/include/openssl/rsa.h"
-
-namespace crypto {
-
-// static
-std::unique_ptr RSAPrivateKey::CreateFromPrivateKeyInfo(
-    base::span input) {
-  OpenSSLErrStackTracer err_tracer(FROM_HERE);
-
-  CBS cbs;
-  CBS_init(&cbs, input.data(), input.size());
-  bssl::UniquePtr pkey(EVP_parse_private_key(&cbs));
-  if (!pkey || CBS_len(&cbs) != 0 || EVP_PKEY_id(pkey.get()) != EVP_PKEY_RSA)
-    return nullptr;
-
-  std::unique_ptr result(new RSAPrivateKey);
-  result->key_ = std::move(pkey);
-  return result;
-}
-
-RSAPrivateKey::RSAPrivateKey() = default;
-
-RSAPrivateKey::~RSAPrivateKey() = default;
-
-std::unique_ptr RSAPrivateKey::Copy() const {
-  std::unique_ptr copy(new RSAPrivateKey);
-  bssl::UniquePtr rsa(EVP_PKEY_get1_RSA(key_.get()));
-  if (!rsa)
-    return nullptr;
-  copy->key_.reset(EVP_PKEY_new());
-  if (!EVP_PKEY_set1_RSA(copy->key_.get(), rsa.get()))
-    return nullptr;
-  return copy;
-}
-
-bool RSAPrivateKey::ExportPrivateKey(std::vector* output) const {
-  OpenSSLErrStackTracer err_tracer(FROM_HERE);
-  uint8_t *der;
-  size_t der_len;
-  bssl::ScopedCBB cbb;
-  if (!CBB_init(cbb.get(), 0) ||
-      !EVP_marshal_private_key(cbb.get(), key_.get()) ||
-      !CBB_finish(cbb.get(), &der, &der_len)) {
-    return false;
-  }
-  output->assign(der, UNSAFE_TODO(der + der_len));
-  OPENSSL_free(der);
-  return true;
-}
-
-bool RSAPrivateKey::ExportPublicKey(std::vector* output) const {
-  OpenSSLErrStackTracer err_tracer(FROM_HERE);
-  uint8_t *der;
-  size_t der_len;
-  bssl::ScopedCBB cbb;
-  if (!CBB_init(cbb.get(), 0) ||
-      !EVP_marshal_public_key(cbb.get(), key_.get()) ||
-      !CBB_finish(cbb.get(), &der, &der_len)) {
-    return false;
-  }
-  output->assign(der, UNSAFE_TODO(der + der_len));
-  OPENSSL_free(der);
-  return true;
-}
-
-}  // namespace crypto
diff --git a/naiveproxy/src/crypto/rsa_private_key.h b/naiveproxy/src/crypto/rsa_private_key.h
deleted file mode 100644
index b5f88c5f45..0000000000
--- a/naiveproxy/src/crypto/rsa_private_key.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// This interface is deprecated and being removed: https://crbug.com/425863216.
-// New users should use crypto/keypair instead.
-
-#ifndef CRYPTO_RSA_PRIVATE_KEY_H_
-#define CRYPTO_RSA_PRIVATE_KEY_H_
-
-#include 
-#include 
-
-#include 
-#include 
-
-#include "base/containers/span.h"
-#include "build/build_config.h"
-#include "crypto/crypto_export.h"
-#include "third_party/boringssl/src/include/openssl/base.h"
-
-namespace crypto {
-
-// Encapsulates an RSA private key. Can be used to export keys to other formats
-// or to extract a public key.
-// TODO(https://crbug.com/425863216): Delete this.
-class CRYPTO_EXPORT RSAPrivateKey {
- public:
-  RSAPrivateKey(const RSAPrivateKey&) = delete;
-  RSAPrivateKey& operator=(const RSAPrivateKey&) = delete;
-
-  ~RSAPrivateKey();
-
-  // Create a new instance by importing an existing private key. The format is
-  // an ASN.1-encoded PrivateKeyInfo block from PKCS #8. This can return NULL if
-  // initialization fails.
-  static std::unique_ptr CreateFromPrivateKeyInfo(
-      base::span input);
-
-  EVP_PKEY* key() const { return key_.get(); }
-
-  // Creates a copy of the object.
-  std::unique_ptr Copy() const;
-
-  // Exports the private key to a PKCS #8 PrivateKeyInfo block.
-  bool ExportPrivateKey(std::vector* output) const;
-
-  // Exports the public key to an X509 SubjectPublicKeyInfo block.
-  bool ExportPublicKey(std::vector* output) const;
-
- private:
-  // Constructor is private. Use one of the Create*() methods above instead.
-  RSAPrivateKey();
-
-  bssl::UniquePtr key_;
-};
-
-}  // namespace crypto
-
-#endif  // CRYPTO_RSA_PRIVATE_KEY_H_
diff --git a/naiveproxy/src/crypto/scoped_fake_user_verifying_key_provider.cc b/naiveproxy/src/crypto/scoped_fake_user_verifying_key_provider.cc
index aad12c5ede..988b0da3a1 100644
--- a/naiveproxy/src/crypto/scoped_fake_user_verifying_key_provider.cc
+++ b/naiveproxy/src/crypto/scoped_fake_user_verifying_key_provider.cc
@@ -13,6 +13,8 @@
 #include "base/containers/span.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
+#include "base/functional/callback_helpers.h"
+#include "base/no_destructor.h"
 #include "crypto/signature_verifier.h"
 #include "crypto/unexportable_key.h"
 #include "crypto/user_verifying_key.h"
@@ -21,9 +23,14 @@ namespace crypto {
 
 namespace {
 
-// This tracks deleted keys, so calling `DeleteUserVerifyingKey` with one
-// can return false, allowing deletion to be tested.
-std::vector g_deleted_keys_;
+// The vector of deleted keys needs to be shared between instances of
+// FakeUserVerifyingKeyProvider - in production the keys all live in a shared
+// key store, so deleting a key via one provider should show up in any other
+// providers as well.
+std::vector& GetDeletedKeys() {
+  static base::NoDestructor> s_labels;
+  return *s_labels;
+}
 
 // When true, fake UV signing keys indicate that they are hardware backed.
 bool g_fake_hardware_backing_ = false;
@@ -82,7 +89,7 @@ class FakeUserVerifyingKeyProvider : public UserVerifyingKeyProvider {
   void GetUserVerifyingSigningKey(
       UserVerifyingKeyLabel key_label,
       UserVerifyingKeyCreationCallback callback) override {
-    for (auto deleted_key : g_deleted_keys_) {
+    for (auto deleted_key : GetDeletedKeys()) {
       if (deleted_key == key_label) {
         std::move(callback).Run(
             base::unexpected(UserVerifyingKeyCreationError::kUnknownError));
@@ -106,7 +113,7 @@ class FakeUserVerifyingKeyProvider : public UserVerifyingKeyProvider {
   void DeleteUserVerifyingKey(
       UserVerifyingKeyLabel key_label,
       base::OnceCallback callback) override {
-    g_deleted_keys_.push_back(key_label);
+    GetDeletedKeys().push_back(key_label);
     std::move(callback).Run(true);
   }
 };
@@ -198,4 +205,18 @@ ScopedFailingUserVerifyingKeyProvider::
     ~ScopedFailingUserVerifyingKeyProvider() {
   internal::SetUserVerifyingKeyProviderForTesting(nullptr);
 }
+
+ScopedUserVerifyingKeysSupportedOverride::
+    ScopedUserVerifyingKeysSupportedOverride(
+        UserVerifyingKeysSupportedOverride override) {
+  internal::SetUserVerifyingKeysSupportedOverrideForTesting(
+      std::move(override));
+}
+
+ScopedUserVerifyingKeysSupportedOverride::
+    ~ScopedUserVerifyingKeysSupportedOverride() {
+  internal::SetUserVerifyingKeysSupportedOverrideForTesting(
+      base::NullCallback());
+}
+
 }  // namespace crypto
diff --git a/naiveproxy/src/crypto/scoped_fake_user_verifying_key_provider.h b/naiveproxy/src/crypto/scoped_fake_user_verifying_key_provider.h
index 6bb2249dbb..4a7a01161b 100644
--- a/naiveproxy/src/crypto/scoped_fake_user_verifying_key_provider.h
+++ b/naiveproxy/src/crypto/scoped_fake_user_verifying_key_provider.h
@@ -5,9 +5,11 @@
 #ifndef CRYPTO_SCOPED_FAKE_USER_VERIFYING_KEY_PROVIDER_H_
 #define CRYPTO_SCOPED_FAKE_USER_VERIFYING_KEY_PROVIDER_H_
 
+#include "crypto/user_verifying_key.h"
+
 namespace crypto {
 
-// ScopedFakeUserVerifyingKeyProvider causes `GetUserVerifyingKeyProvider` to
+// `ScopedFakeUserVerifyingKeyProvider` causes `GetUserVerifyingKeyProvider` to
 // return a mock implementation of `UserVerifyingKeyProvider`, that does not use
 // system APIs, while it is in scope.
 class ScopedFakeUserVerifyingKeyProvider {
@@ -26,8 +28,8 @@ class ScopedNullUserVerifyingKeyProvider {
   ~ScopedNullUserVerifyingKeyProvider();
 };
 
-// ScopedFailingUserVerifyingKeyProvider causes `GetUserVerifyingKeyProvider` to
-// return a mock implementation of `UserVerifyingKeyProvider` that fails all
+// `ScopedFailingUserVerifyingKeyProvider` causes `GetUserVerifyingKeyProvider`
+// to return a mock implementation of `UserVerifyingKeyProvider` that fails all
 // signing requests.
 class ScopedFailingUserVerifyingKeyProvider {
  public:
@@ -35,6 +37,16 @@ class ScopedFailingUserVerifyingKeyProvider {
   ~ScopedFailingUserVerifyingKeyProvider();
 };
 
+// `ScopedUserVerifyingKeysSupportedOverride` allows a client to control the
+// timing and result of `AreUserVerifyingKeysSupported`. If this is in scope, it
+// takes priority over any of the scoped providers above.
+class ScopedUserVerifyingKeysSupportedOverride {
+ public:
+  explicit ScopedUserVerifyingKeysSupportedOverride(
+      UserVerifyingKeysSupportedOverride override);
+  ~ScopedUserVerifyingKeysSupportedOverride();
+};
+
 }  // namespace crypto
 
 #endif  // CRYPTO_SCOPED_FAKE_USER_VERIFYING_KEY_PROVIDER_H_
diff --git a/naiveproxy/src/crypto/secure_hash.cc b/naiveproxy/src/crypto/secure_hash.cc
index 06c3070a1c..3a3891e31b 100644
--- a/naiveproxy/src/crypto/secure_hash.cc
+++ b/naiveproxy/src/crypto/secure_hash.cc
@@ -94,20 +94,4 @@ std::unique_ptr SecureHash::Create(Algorithm algorithm) {
   }
 }
 
-void SecureHash::Update(const void* input, size_t len) {
-  // SAFETY: This API is deprecated & being migrated away from. It can't be
-  // safely implemented at the moment.
-  // TODO(https://crbug.com/364687923): Remove this.
-  return Update(UNSAFE_BUFFERS(
-      base::span(static_cast(input), len)));
-}
-
-void SecureHash::Finish(void* output, size_t len) {
-  // SAFETY: This API is deprecated & being migrated away from. It can't be
-  // safely implemented at the moment.
-  // TODO(https://crbug.com/364687923): Remove this.
-  return Finish(
-      UNSAFE_BUFFERS(base::span(static_cast(output), len)));
-}
-
 }  // namespace crypto
diff --git a/naiveproxy/src/crypto/secure_hash.h b/naiveproxy/src/crypto/secure_hash.h
index 587331fca6..a4cac86c02 100644
--- a/naiveproxy/src/crypto/secure_hash.h
+++ b/naiveproxy/src/crypto/secure_hash.h
@@ -41,12 +41,6 @@ class CRYPTO_EXPORT SecureHash {
 
   virtual size_t GetHashLength() const = 0;
 
-  // Deprecated non-span APIs - do not add new uses of them, and please remove
-  // existing uses.
-  // TODO(https://crbug.com/364687923): Delete these.
-  void Update(const void* input, size_t len);
-  void Finish(void* output, size_t len);
-
   // Create a clone of this SecureHash. The returned clone and this both
   // represent the same hash state. But from this point on, calling
   // Update()/Finish() on either doesn't affect the state of the other.
diff --git a/naiveproxy/src/crypto/subtle_passkey.h b/naiveproxy/src/crypto/subtle_passkey.h
index fcdb22b26d..69909a05ab 100644
--- a/naiveproxy/src/crypto/subtle_passkey.h
+++ b/naiveproxy/src/crypto/subtle_passkey.h
@@ -20,12 +20,22 @@ namespace crypto {
 class SubtlePassKey;
 }  // namespace crypto
 
+namespace chromeos {
+crypto::SubtlePassKey MakeCryptoPassKeyForSharedSessionHandler();
+}
+
 namespace chromeos::onc {
 crypto::SubtlePassKey MakeCryptoPassKey();
 }
 
 namespace os_crypt_async {
 class FreedesktopSecretKeyProvider;
+class KeychainKeyProvider;
+}
+
+namespace password_manager {
+crypto::SubtlePassKey MakeCryptoPassKey();
+crypto::SubtlePassKey MakeCryptoPassKeyForPasswordHash();
 }
 
 class OSCryptImpl;
@@ -58,6 +68,10 @@ class CRYPTO_EXPORT SubtlePassKey final {
   // This class uses custom PBKDF2 parameters - the Nigori spec requires this.
   friend class syncer::Nigori;
 
+  // SharedSessionHandler needs to use the same scrypt parameters to stay
+  // compatible with existing data on disk.
+  friend SubtlePassKey chromeos::MakeCryptoPassKeyForSharedSessionHandler();
+
   // ONC EncryptedConfiguration objects can contain and require us to use
   // arbitrary (possibly attacker-supplied) PBKDF2 parameters.
   friend SubtlePassKey chromeos::onc::MakeCryptoPassKey();
@@ -66,6 +80,12 @@ class CRYPTO_EXPORT SubtlePassKey final {
   // compatibility with existing persisted data.
   friend class ::OSCryptImpl;
   friend class os_crypt_async::FreedesktopSecretKeyProvider;
+  friend class os_crypt_async::KeychainKeyProvider;
+
+  // This class uses custom scrypt parameters and has to keep doing so for
+  // compatibility with a server-side implementation.
+  friend SubtlePassKey password_manager::MakeCryptoPassKey();
+  friend SubtlePassKey password_manager::MakeCryptoPassKeyForPasswordHash();
 
   // This class uses custom PBKDF2 parameters which cannot be changed for
   // compatibility with persisted data.
diff --git a/naiveproxy/src/crypto/test/data/not-pem.txt b/naiveproxy/src/crypto/test/data/not-pem.txt
new file mode 100644
index 0000000000..071df45674
--- /dev/null
+++ b/naiveproxy/src/crypto/test/data/not-pem.txt
@@ -0,0 +1 @@
+This is a text file that doesn't contain any PEM tokens.
diff --git a/naiveproxy/src/crypto/test/data/one-message.pem b/naiveproxy/src/crypto/test/data/one-message.pem
new file mode 100644
index 0000000000..d1e6a86691
--- /dev/null
+++ b/naiveproxy/src/crypto/test/data/one-message.pem
@@ -0,0 +1,3 @@
+-----BEGIN SINGLE MESSAGE-----
+Y3J5cHRvIHRlc3QgZGF0YSBzaW5nbGUgbWVzc2FnZQ==
+-----END SINGLE MESSAGE-----
diff --git a/naiveproxy/src/crypto/test/data/plain-text.txt b/naiveproxy/src/crypto/test/data/plain-text.txt
new file mode 100644
index 0000000000..602534fdb1
--- /dev/null
+++ b/naiveproxy/src/crypto/test/data/plain-text.txt
@@ -0,0 +1 @@
+This file is used as a test input for hash and signature functions.
diff --git a/naiveproxy/src/crypto/test/data/three-messages.pem b/naiveproxy/src/crypto/test/data/three-messages.pem
new file mode 100644
index 0000000000..89b2c962d1
--- /dev/null
+++ b/naiveproxy/src/crypto/test/data/three-messages.pem
@@ -0,0 +1,9 @@
+-----BEGIN TYPE ONE-----
+Y3J5cHRvIHRlc3QgZGF0YSBtZXNzYWdlIG9uZQ==
+-----END TYPE ONE-----
+-----BEGIN TYPE TWO-----
+Y3J5cHRvIHRlc3QgZGF0YSBtZXNzYWdlIHR3bw==
+-----END TYPE TWO-----
+-----BEGIN TYPE ONE-----
+Y3J5cHRvIHRlc3QgZGF0YSBtZXNzYWdlIHRocmVl
+-----END TYPE ONE-----
diff --git a/naiveproxy/src/crypto/test_support.cc b/naiveproxy/src/crypto/test_support.cc
index 6135311cbd..afa5907496 100644
--- a/naiveproxy/src/crypto/test_support.cc
+++ b/naiveproxy/src/crypto/test_support.cc
@@ -8,7 +8,7 @@
 
 namespace crypto::test {
 
-// To generate these keys:
+// To generate RSA keys:
 // $ openssl genrsa -out test.key $BITS
 // $ openssl rsa -in test.key -outform DER | xxd -i > private.key
 // $ openssl rsa -in test.key -outform DER -pubout | xxd -i > public.key
@@ -147,6 +147,40 @@ static constexpr auto kRsa2048Public = std::to_array(
      0x76, 0x72, 0xc8, 0x4b, 0xbf, 0x70, 0x75, 0xb7, 0xc1, 0x5d, 0xff, 0x91,
      0xdd, 0x02, 0x03, 0x01, 0x00, 0x01});
 
+// {
+//  1: 3,     kty = RSA
+//  3: -257,  alg = RS256
+//  n = matches 256 bytes (starting at index 33) of the public key
+//  -1:
+//  h'B77311A14756B8DF45AB81C11724006D70C23F54AC71DAF55DD87C7736A62E30BD07273420DFC5F7DB9D93DC68A1C4024FCBB11EB9D01292A2F00DFBE6A06236D26EAE03D5A85346777AE383FE8D542903C1196D22440F1A585701EF813F0BF3968E5140D367D8859F85808E84C6AA35AE35FF3820BBE395C5E3D6DDE92887B938CEBD53179790ED87D5086C84EFB19E715E2C0BCEC176BBFBD65B5585E04DF7AFCF34E1400A761FB1DCD7B063A2C7238556FD8CEC6B0FFB6ECBBA3B1204BBF75D28E2579C381D8FC9513F438A6EB0A1BB6F19798F815CD98991DEFACE0953B7373604485F447C1909B81B8FF1F5863A81F8447672C84BBF7075B7C15DFF91DD',
+//  e = matches 3 bytes (starting at index 291) of the public key
+//  -2: h'010001',
+// }
+static constexpr auto kRsa2048PublicCose = std::to_array(
+    {0xa4, 0x01, 0x03, 0x03, 0x39, 0x01, 0x00, 0x20, 0x59, 0x01, 0x00, 0xb7,
+     0x73, 0x11, 0xa1, 0x47, 0x56, 0xb8, 0xdf, 0x45, 0xab, 0x81, 0xc1, 0x17,
+     0x24, 0x00, 0x6d, 0x70, 0xc2, 0x3f, 0x54, 0xac, 0x71, 0xda, 0xf5, 0x5d,
+     0xd8, 0x7c, 0x77, 0x36, 0xa6, 0x2e, 0x30, 0xbd, 0x07, 0x27, 0x34, 0x20,
+     0xdf, 0xc5, 0xf7, 0xdb, 0x9d, 0x93, 0xdc, 0x68, 0xa1, 0xc4, 0x02, 0x4f,
+     0xcb, 0xb1, 0x1e, 0xb9, 0xd0, 0x12, 0x92, 0xa2, 0xf0, 0x0d, 0xfb, 0xe6,
+     0xa0, 0x62, 0x36, 0xd2, 0x6e, 0xae, 0x03, 0xd5, 0xa8, 0x53, 0x46, 0x77,
+     0x7a, 0xe3, 0x83, 0xfe, 0x8d, 0x54, 0x29, 0x03, 0xc1, 0x19, 0x6d, 0x22,
+     0x44, 0x0f, 0x1a, 0x58, 0x57, 0x01, 0xef, 0x81, 0x3f, 0x0b, 0xf3, 0x96,
+     0x8e, 0x51, 0x40, 0xd3, 0x67, 0xd8, 0x85, 0x9f, 0x85, 0x80, 0x8e, 0x84,
+     0xc6, 0xaa, 0x35, 0xae, 0x35, 0xff, 0x38, 0x20, 0xbb, 0xe3, 0x95, 0xc5,
+     0xe3, 0xd6, 0xdd, 0xe9, 0x28, 0x87, 0xb9, 0x38, 0xce, 0xbd, 0x53, 0x17,
+     0x97, 0x90, 0xed, 0x87, 0xd5, 0x08, 0x6c, 0x84, 0xef, 0xb1, 0x9e, 0x71,
+     0x5e, 0x2c, 0x0b, 0xce, 0xc1, 0x76, 0xbb, 0xfb, 0xd6, 0x5b, 0x55, 0x85,
+     0xe0, 0x4d, 0xf7, 0xaf, 0xcf, 0x34, 0xe1, 0x40, 0x0a, 0x76, 0x1f, 0xb1,
+     0xdc, 0xd7, 0xb0, 0x63, 0xa2, 0xc7, 0x23, 0x85, 0x56, 0xfd, 0x8c, 0xec,
+     0x6b, 0x0f, 0xfb, 0x6e, 0xcb, 0xba, 0x3b, 0x12, 0x04, 0xbb, 0xf7, 0x5d,
+     0x28, 0xe2, 0x57, 0x9c, 0x38, 0x1d, 0x8f, 0xc9, 0x51, 0x3f, 0x43, 0x8a,
+     0x6e, 0xb0, 0xa1, 0xbb, 0x6f, 0x19, 0x79, 0x8f, 0x81, 0x5c, 0xd9, 0x89,
+     0x91, 0xde, 0xfa, 0xce, 0x09, 0x53, 0xb7, 0x37, 0x36, 0x04, 0x48, 0x5f,
+     0x44, 0x7c, 0x19, 0x09, 0xb8, 0x1b, 0x8f, 0xf1, 0xf5, 0x86, 0x3a, 0x81,
+     0xf8, 0x44, 0x76, 0x72, 0xc8, 0x4b, 0xbf, 0x70, 0x75, 0xb7, 0xc1, 0x5d,
+     0xff, 0x91, 0xdd, 0x21, 0x43, 0x01, 0x00, 0x01});
+
 static constexpr auto kRsa4096Private = std::to_array(
     {0x30, 0x82, 0x09, 0x43, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a,
      0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
@@ -395,6 +429,56 @@ static constexpr auto kRsa4096Public = std::to_array(
      0x45, 0x8a, 0x4c, 0x08, 0xcc, 0x06, 0xa0, 0x6d, 0xab, 0xa3, 0xea, 0xee,
      0x63, 0x65, 0x9e, 0x40, 0x19, 0x02, 0x03, 0x01, 0x00, 0x01});
 
+// To generate ECP256 keys:
+// $ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out
+//    test.key $BITS
+// $ openssl pkey -in test.key -outform DER | xxd -i > private.key
+// $ openssl pkey -in test.key -outform DER -pubout | xxd -i > public.key
+//
+// That produces the big arrays of hex given below. These are DER-encoded
+// private and public keys respectively.
+
+static constexpr auto kEcP256Private = std::to_array(
+    {0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0xa5, 0xc6, 0x3d, 0xdb,
+     0x01, 0x37, 0x5e, 0x75, 0x15, 0x6a, 0x79, 0x05, 0xe5, 0x4a, 0x24,
+     0xab, 0xc0, 0xbc, 0x25, 0x7e, 0xc9, 0xc8, 0xfd, 0xf6, 0xf5, 0x65,
+     0xae, 0x01, 0xce, 0x13, 0x8e, 0x06, 0xa0, 0x0a, 0x06, 0x08, 0x2a,
+     0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0xa1, 0x44, 0x03, 0x42,
+     0x00, 0x04, 0x0d, 0x40, 0xfb, 0xfe, 0xbb, 0x66, 0x71, 0xab, 0xf2,
+     0xaf, 0x33, 0x0f, 0x60, 0x34, 0x3e, 0xc6, 0xad, 0x0e, 0xbd, 0x09,
+     0x66, 0x78, 0x77, 0xbd, 0x73, 0x06, 0x72, 0x60, 0xa2, 0xcb, 0x76,
+     0x3b, 0x57, 0x20, 0x0f, 0xaa, 0xe1, 0xd6, 0x9b, 0x97, 0x2e, 0x34,
+     0x45, 0x02, 0xca, 0xa9, 0x44, 0x49, 0xcd, 0x51, 0x05, 0xdd, 0xbe,
+     0xa5, 0x15, 0x4b, 0xa9, 0xa9, 0x3c, 0x3d, 0xbc, 0x47, 0x6f, 0x10});
+
+static constexpr auto kEcP256Public = std::to_array(
+    {0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
+     0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
+     0x42, 0x00, 0x04, 0x0d, 0x40, 0xfb, 0xfe, 0xbb, 0x66, 0x71, 0xab, 0xf2,
+     0xaf, 0x33, 0x0f, 0x60, 0x34, 0x3e, 0xc6, 0xad, 0x0e, 0xbd, 0x09, 0x66,
+     0x78, 0x77, 0xbd, 0x73, 0x06, 0x72, 0x60, 0xa2, 0xcb, 0x76, 0x3b, 0x57,
+     0x20, 0x0f, 0xaa, 0xe1, 0xd6, 0x9b, 0x97, 0x2e, 0x34, 0x45, 0x02, 0xca,
+     0xa9, 0x44, 0x49, 0xcd, 0x51, 0x05, 0xdd, 0xbe, 0xa5, 0x15, 0x4b, 0xa9,
+     0xa9, 0x3c, 0x3d, 0xbc, 0x47, 0x6f, 0x10});
+
+// {
+//  1: 2,   kty = EC2
+//  3: -7,  alg = ES256
+//  -1: 1,  crv = P-256
+//  x = matches 32 bytes (starting at index 27) of the public key
+//  -2: h'0D40FBFEBB6671ABF2AF330F60343EC6AD0EBD09667877BD73067260A2CB763B',
+//  y = matches 32 bytes (starting at index 59) of the public key
+//  -3: h'57200FAAE1D69B972E344502CAA94449CD5105DDBEA5154BA9A93C3DBC476F10',
+// }
+static constexpr auto kEcP256PublicCose = std::to_array(
+    {0xa5, 0x01, 0x02, 0x03, 0x26, 0x20, 0x01, 0x21, 0x58, 0x20, 0x0d,
+     0x40, 0xfb, 0xfe, 0xbb, 0x66, 0x71, 0xab, 0xf2, 0xaf, 0x33, 0x0f,
+     0x60, 0x34, 0x3e, 0xc6, 0xad, 0x0e, 0xbd, 0x09, 0x66, 0x78, 0x77,
+     0xbd, 0x73, 0x06, 0x72, 0x60, 0xa2, 0xcb, 0x76, 0x3b, 0x22, 0x58,
+     0x20, 0x57, 0x20, 0x0f, 0xaa, 0xe1, 0xd6, 0x9b, 0x97, 0x2e, 0x34,
+     0x45, 0x02, 0xca, 0xa9, 0x44, 0x49, 0xcd, 0x51, 0x05, 0xdd, 0xbe,
+     0xa5, 0x15, 0x4b, 0xa9, 0xa9, 0x3c, 0x3d, 0xbc, 0x47, 0x6f, 0x10});
+
 PrivateKey FixedRsa2048PrivateKeyForTesting() {
   return *PrivateKey::FromPrivateKeyInfo(kRsa2048Private);
 }
@@ -403,6 +487,10 @@ PublicKey FixedRsa2048PublicKeyForTesting() {
   return *PublicKey::FromSubjectPublicKeyInfo(kRsa2048Public);
 }
 
+const base::span FixedRsa2048PublicKeyAsCoseForTesting() {
+  return kRsa2048PublicCose;
+}
+
 PrivateKey FixedRsa4096PrivateKeyForTesting() {
   return *PrivateKey::FromPrivateKeyInfo(kRsa4096Private);
 }
@@ -411,4 +499,16 @@ PublicKey FixedRsa4096PublicKeyForTesting() {
   return *PublicKey::FromSubjectPublicKeyInfo(kRsa4096Public);
 }
 
+PrivateKey FixedEcP256PrivateKeyForTesting() {
+  return *PrivateKey::FromPrivateKeyInfo(kEcP256Private);
+}
+
+PublicKey FixedEcP256PublicKeyForTesting() {
+  return *PublicKey::FromSubjectPublicKeyInfo(kEcP256Public);
+}
+
+const base::span FixedEcP256PublicKeyAsCoseForTesting() {
+  return kEcP256PublicCose;
+}
+
 }  // namespace crypto::test
diff --git a/naiveproxy/src/crypto/test_support.h b/naiveproxy/src/crypto/test_support.h
index 7e29810460..95cdc3eca9 100644
--- a/naiveproxy/src/crypto/test_support.h
+++ b/naiveproxy/src/crypto/test_support.h
@@ -16,11 +16,16 @@ using crypto::keypair::PublicKey;
 // private keys for use in tests. Tests should prefer these keys over freshly
 // generating keys whenever practical, since they are much cheaper.
 PrivateKey FixedRsa2048PrivateKeyForTesting();
-PrivateKey FixedRsa4096PrivateKeyForTesting();
-
 PublicKey FixedRsa2048PublicKeyForTesting();
+const base::span FixedRsa2048PublicKeyAsCoseForTesting();
+
+PrivateKey FixedRsa4096PrivateKeyForTesting();
 PublicKey FixedRsa4096PublicKeyForTesting();
 
+PrivateKey FixedEcP256PrivateKeyForTesting();
+PublicKey FixedEcP256PublicKeyForTesting();
+const base::span FixedEcP256PublicKeyAsCoseForTesting();
+
 }  // namespace crypto::test
 
 #endif  // CRYPTO_TEST_SUPPORT_H_
diff --git a/naiveproxy/src/crypto/unexportable_key.cc b/naiveproxy/src/crypto/unexportable_key.cc
index 88fba4f13e..ff2705b461 100644
--- a/naiveproxy/src/crypto/unexportable_key.cc
+++ b/naiveproxy/src/crypto/unexportable_key.cc
@@ -6,6 +6,11 @@
 
 #include "base/check.h"
 #include "base/functional/bind.h"
+#if BUILDFLAG(IS_WIN)
+#include "crypto/unexportable_key_win.h"
+#elif BUILDFLAG(IS_MAC)
+#include "crypto/apple/unexportable_key_mac.h"
+#endif
 
 namespace crypto {
 
@@ -22,21 +27,6 @@ bool UnexportableSigningKey::IsHardwareBacked() const {
   return false;
 }
 
-#if BUILDFLAG(IS_WIN)
-std::unique_ptr GetUnexportableKeyProviderWin();
-std::unique_ptr
-GetMicrosoftSoftwareUnexportableKeyProviderWin();
-std::unique_ptr
-GetVirtualUnexportableKeyProviderWin();
-#elif BUILDFLAG(IS_MAC)
-std::unique_ptr GetUnexportableKeyProviderMac(
-    UnexportableKeyProvider::Config config);
-#endif
-
-// Implemented in unexportable_key_software_unsecure.cc.
-std::unique_ptr
-GetUnexportableKeyProviderSoftwareUnsecure();
-
 std::unique_ptr GetUnexportableKeyProvider(
     UnexportableKeyProvider::Config config) {
   if (g_mock_provider) {
@@ -46,7 +36,7 @@ std::unique_ptr GetUnexportableKeyProvider(
 #if BUILDFLAG(IS_WIN)
   return GetUnexportableKeyProviderWin();
 #elif BUILDFLAG(IS_MAC)
-  return GetUnexportableKeyProviderMac(std::move(config));
+  return apple::GetUnexportableKeyProviderMac(std::move(config));
 #else
   return nullptr;
 #endif
diff --git a/naiveproxy/src/crypto/unexportable_key_win.h b/naiveproxy/src/crypto/unexportable_key_win.h
index eb9c3e6179..dcd90bb457 100644
--- a/naiveproxy/src/crypto/unexportable_key_win.h
+++ b/naiveproxy/src/crypto/unexportable_key_win.h
@@ -5,8 +5,8 @@
 #ifndef CRYPTO_UNEXPORTABLE_KEY_WIN_H_
 #define CRYPTO_UNEXPORTABLE_KEY_WIN_H_
 
-#include "base/containers/span.h"
-#include "base/win/wincrypt_shim.h"
+#include 
+
 #include "crypto/crypto_export.h"
 #include "crypto/scoped_cng_types.h"
 #include "crypto/unexportable_key.h"
@@ -18,6 +18,19 @@ namespace crypto {
 CRYPTO_EXPORT ScopedNCryptKey
 DuplicatePlatformKeyHandle(const UnexportableSigningKey& key);
 
+// Returns an `UnexportableKeyProvider` that is backed by the Windows TPM.
+std::unique_ptr GetUnexportableKeyProviderWin();
+
+// Returns an `UnexportableKeyProvider` that is backed by the Microsoft Software
+// Key Storage Provider.
+std::unique_ptr
+GetMicrosoftSoftwareUnexportableKeyProviderWin();
+
+// Returns a `VirtualUnexportableKeyProvider` that is backed by the Windows
+// Credential Guard.
+std::unique_ptr
+GetVirtualUnexportableKeyProviderWin();
+
 }  // namespace crypto
 
 #endif  // CRYPTO_UNEXPORTABLE_KEY_WIN_H_
diff --git a/naiveproxy/src/crypto/user_verifying_key.cc b/naiveproxy/src/crypto/user_verifying_key.cc
index 279a7a1431..41310238dd 100644
--- a/naiveproxy/src/crypto/user_verifying_key.cc
+++ b/naiveproxy/src/crypto/user_verifying_key.cc
@@ -5,6 +5,8 @@
 #include "crypto/user_verifying_key.h"
 
 #include "base/check.h"
+#include "base/functional/callback.h"
+#include "base/no_destructor.h"
 
 namespace crypto {
 
@@ -12,6 +14,13 @@ namespace {
 
 std::unique_ptr (*g_mock_provider)() = nullptr;
 
+UserVerifyingKeysSupportedOverride& GetUserVerifyingKeysSupportedOverride() {
+  static base::NoDestructor<
+      base::RepeatingCallback>
+      user_verifying_keys_supported_override;
+  return *user_verifying_keys_supported_override;
+}
+
 }  // namespace
 
 UserVerifyingKeyProvider::Config::Config() = default;
@@ -63,8 +72,13 @@ std::unique_ptr GetUserVerifyingKeyProvider(
 #endif
 }
 
-void AreUserVerifyingKeysSupported(UserVerifyingKeyProvider::Config config,
-                                   base::OnceCallback callback) {
+void AreUserVerifyingKeysSupported(
+    UserVerifyingKeyProvider::Config config,
+    UserVerifyingKeysSupportedCallback callback) {
+  if (GetUserVerifyingKeysSupportedOverride()) {
+    GetUserVerifyingKeysSupportedOverride().Run(std::move(callback));
+    return;
+  }
   if (g_mock_provider) {
     std::move(callback).Run(g_mock_provider() != nullptr);
     return;
@@ -91,6 +105,16 @@ void SetUserVerifyingKeyProviderForTesting(
   }
 }
 
+void SetUserVerifyingKeysSupportedOverrideForTesting(
+    UserVerifyingKeysSupportedOverride override) {
+  if (GetUserVerifyingKeysSupportedOverride()) {
+    CHECK(!override);
+    GetUserVerifyingKeysSupportedOverride().Reset();
+  } else {
+    GetUserVerifyingKeysSupportedOverride() = std::move(override);
+  }
+}
+
 }  // namespace internal
 
 }  // namespace crypto
diff --git a/naiveproxy/src/crypto/user_verifying_key.h b/naiveproxy/src/crypto/user_verifying_key.h
index 0608f9a252..186bc90de9 100644
--- a/naiveproxy/src/crypto/user_verifying_key.h
+++ b/naiveproxy/src/crypto/user_verifying_key.h
@@ -16,8 +16,8 @@
 #include "base/memory/ref_counted.h"
 #include "base/types/expected.h"
 #include "build/build_config.h"
+#include "crypto/apple/scoped_lacontext.h"
 #include "crypto/crypto_export.h"
-#include "crypto/scoped_lacontext.h"
 #include "crypto/signature_verifier.h"
 #include "crypto/unexportable_key.h"
 
@@ -25,6 +25,10 @@ namespace crypto {
 
 typedef std::string UserVerifyingKeyLabel;
 
+using UserVerifyingKeysSupportedCallback = base::OnceCallback;
+using UserVerifyingKeysSupportedOverride =
+    base::RepeatingCallback;
+
 // Error values supplied to the callbacks for creating and retrieving
 // user-verifying keys, upon failure.
 enum class UserVerifyingKeyCreationError {
@@ -118,7 +122,7 @@ class CRYPTO_EXPORT UserVerifyingKeyProvider {
     // Optional LAContext to be used when retrieving and storing keys. Passing
     // an authenticated LAContext lets you call UserVerifyingSigningKey::Sign()
     // without triggering a macOS local authentication prompt.
-    std::optional lacontext;
+    std::optional lacontext;
 #endif  // BUILDFLAG(IS_MAC)
   };
 
@@ -170,13 +174,16 @@ GetUserVerifyingKeyProvider(UserVerifyingKeyProvider::Config config);
 // asynchronously.
 CRYPTO_EXPORT void AreUserVerifyingKeysSupported(
     UserVerifyingKeyProvider::Config config,
-    base::OnceCallback callback);
+    UserVerifyingKeysSupportedCallback callback);
 
 namespace internal {
 
 CRYPTO_EXPORT void SetUserVerifyingKeyProviderForTesting(
     std::unique_ptr (*func)());
 
+CRYPTO_EXPORT void SetUserVerifyingKeysSupportedOverrideForTesting(
+    UserVerifyingKeysSupportedOverride override);
+
 }  // namespace internal
 
 }  // namespace crypto
diff --git a/naiveproxy/src/crypto/user_verifying_key_mac.mm b/naiveproxy/src/crypto/user_verifying_key_mac.mm
index 900b3c07fc..ffb263be8d 100644
--- a/naiveproxy/src/crypto/user_verifying_key_mac.mm
+++ b/naiveproxy/src/crypto/user_verifying_key_mac.mm
@@ -22,9 +22,8 @@
 #include "base/threading/scoped_thread_priority.h"
 #include "base/types/expected.h"
 #include "crypto/apple/keychain_v2.h"
-#include "crypto/scoped_lacontext.h"
+#include "crypto/apple/unexportable_key_mac.h"
 #include "crypto/unexportable_key.h"
-#include "crypto/unexportable_key_mac.h"
 
 namespace crypto {
 
@@ -113,8 +112,8 @@ DoGenerateKey(base::span
                   acceptable_algorithms,
               UnexportableKeyProvider::Config config,
               LAContext* lacontext) {
-  std::unique_ptr key_provider =
-      GetUnexportableKeyProviderMac(std::move(config));
+  std::unique_ptr key_provider =
+      apple::GetUnexportableKeyProviderMac(std::move(config));
   if (!key_provider) {
     return base::unexpected(UserVerifyingKeyCreationError::kPlatformApiError);
   }
@@ -132,8 +131,8 @@ base::expected,
 DoGetKey(std::vector wrapped_key,
          UnexportableKeyProvider::Config config,
          LAContext* lacontext) {
-  std::unique_ptr key_provider =
-      GetUnexportableKeyProviderMac(std::move(config));
+  std::unique_ptr key_provider =
+      apple::GetUnexportableKeyProviderMac(std::move(config));
   if (!key_provider) {
     return base::unexpected(UserVerifyingKeyCreationError::kPlatformApiError);
   }
diff --git a/naiveproxy/src/crypto/user_verifying_key_win.cc b/naiveproxy/src/crypto/user_verifying_key_win.cc
index e7ec1c29e0..1db35c8c3f 100644
--- a/naiveproxy/src/crypto/user_verifying_key_win.cc
+++ b/naiveproxy/src/crypto/user_verifying_key_win.cc
@@ -164,7 +164,6 @@ class HelloDialogForegrounder
       return;
     }
 
-    constexpr wchar_t kTargetWindowName[] = L"Windows Security";
     constexpr wchar_t kTargetClassName[] = L"Credential Dialog Xaml Host";
     if (state_ == State::kPollingForFirstAppearance) {
       constexpr int kMaxIterations = 40;
@@ -174,7 +173,7 @@ class HelloDialogForegrounder
         return;
       }
 
-      if (HWND hwnd = FindWindowW(kTargetClassName, kTargetWindowName)) {
+      if (HWND hwnd = FindWindowW(kTargetClassName, nullptr)) {
         base::UmaHistogramExactLinear(
             "WebAuthentication.Windows.FindHelloDialogIterationCount",
             iteration,
@@ -189,7 +188,7 @@ class HelloDialogForegrounder
       }
     } else {
       CHECK_EQ(state_, State::kPollingForAuthRetry);
-      if (HWND hwnd = FindWindowW(kTargetClassName, kTargetWindowName)) {
+      if (HWND hwnd = FindWindowW(kTargetClassName, nullptr)) {
         SetForegroundWindow(hwnd);
       }
       interval = 500;
diff --git a/naiveproxy/src/ios/features.gni b/naiveproxy/src/ios/features.gni
index 14fd64fee4..f3a42c96d4 100644
--- a/naiveproxy/src/ios/features.gni
+++ b/naiveproxy/src/ios/features.gni
@@ -9,14 +9,9 @@ declare_args() {
   # WebKit for mac but incorrectly setting `target_os="ios"`.
   is_webkit_only_build = false
 
-  # Control whether iOS builds with PartitionAlloc.
-  # Temporarily disable for rollout -- see crbug.com/1412190 for details.
-  ios_partition_alloc_enabled = true
-
-  # Control whether PartitionAlloc for iOS builds has extra checks for
-  # metadata corruption issue investigation.
-  # TODO(crbug.com/371135823): Remove upon completion of the investigation.
-  ios_partition_alloc_corruption_hardening_enabled = false
+  # Control whether iOS builds with DanglingRawPtrChecks when available.
+  # Temporarily disable for rollout -- see crbug.com/424376811 for details.
+  ios_enable_dangling_raw_ptr_checks = true
 
   # Control whether //ios/chrome and //ios/web targets are build. This
   # is used by bots from projects based on top of Chromium that want to
diff --git a/naiveproxy/src/ipc/ipc_param_traits.h b/naiveproxy/src/ipc/ipc_param_traits.h
deleted file mode 100644
index ba484e0faa..0000000000
--- a/naiveproxy/src/ipc/ipc_param_traits.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2010 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IPC_IPC_PARAM_TRAITS_H_
-#define IPC_IPC_PARAM_TRAITS_H_
-
-// Our IPC system uses the following partially specialized header to define how
-// a data type is read, written and logged in the IPC system.
-
-namespace IPC {
-namespace internal {
-
-template 
-struct AlwaysFalse {
-  static const bool value = false;
-};
-
-}  // namespace internal
-
-template  struct ParamTraits {
-  static_assert(internal::AlwaysFalse

::value, - "Cannot find the IPC::ParamTraits specialization. Did you " - "forget to include the corresponding header file?"); -}; - -template -struct SimilarTypeTraits { - typedef P Type; -}; - -} // namespace IPC - -#endif // IPC_IPC_PARAM_TRAITS_H_ diff --git a/naiveproxy/src/net/BUILD.gn b/naiveproxy/src/net/BUILD.gn index da122b4419..0a4c1a4340 100644 --- a/naiveproxy/src/net/BUILD.gn +++ b/naiveproxy/src/net/BUILD.gn @@ -149,6 +149,17 @@ proto_library("device_bound_sessions_storage_proto") { sources = [ "device_bound_sessions/proto/storage.proto" ] } +source_set("net_features") { + sources = [ "base/features.h" ] + deps = [ + ":buildflags", + ":disk_cache_buildflags", + ":net_export_header", + "//base", + "//crypto:buildflags", + ] +} + component("net") { sources = [ "base/address_family.cc", @@ -180,7 +191,6 @@ component("net") { "base/elements_upload_data_stream.h", "base/expiring_cache.h", "base/features.cc", - "base/features.h", "base/file_stream.cc", "base/file_stream.h", "base/file_stream_context.cc", @@ -273,6 +283,7 @@ component("net") { "base/privacy_mode.h", "base/proxy_chain.cc", "base/proxy_chain.h", + "base/proxy_delegate.cc", "base/proxy_delegate.h", "base/proxy_server.cc", "base/proxy_server.h", @@ -312,6 +323,10 @@ component("net") { "base/upload_progress.h", "base/url_search_params.cc", "base/url_search_params.h", + "base/url_search_params_view.cc", + "base/url_search_params_view.h", + "base/url_unescape_iterator.cc", + "base/url_unescape_iterator.h", "base/url_util.cc", "base/url_util.h", "cert/asn1_util.cc", @@ -460,6 +475,8 @@ component("net") { "device_bound_sessions/session_access.h", "device_bound_sessions/session_key.cc", "device_bound_sessions/session_key.h", + "device_bound_sessions/session_params.cc", + "device_bound_sessions/session_params.h", "device_bound_sessions/session_usage.h", "disk_cache/backend_cleanup_tracker.cc", "disk_cache/backend_cleanup_tracker.h", @@ -822,6 +839,7 @@ component("net") { "proxy_resolution/proxy_list.cc", "proxy_resolution/proxy_list.h", "proxy_resolution/proxy_resolution_request.h", + "proxy_resolution/proxy_resolution_service.cc", "proxy_resolution/proxy_resolution_service.h", "proxy_resolution/proxy_resolve_dns_operation.h", "proxy_resolution/proxy_resolver.h", @@ -1064,6 +1082,8 @@ component("net") { "ssl/client_cert_matcher.cc", "ssl/client_cert_matcher.h", "ssl/client_cert_store.h", + "ssl/client_cert_store_empty.cc", + "ssl/client_cert_store_empty.h", "ssl/openssl_private_key.cc", "ssl/openssl_private_key.h", "ssl/openssl_ssl_util.cc", @@ -1152,8 +1172,8 @@ component("net") { deps = [ ":cronet_buildflags", ":net_deps", - "//components/miracle_parameter/common", "//components/network_time/time_tracker", + "//components/unexportable_keys", "//net/http:transport_security_state_generated_files", "//third_party/simdutf", ] @@ -1161,6 +1181,7 @@ component("net") { public_deps = [ ":disk_cache_buildflags", ":net_export_header", + ":net_features", ":net_public_deps", "//base", "//net/dns", @@ -1237,6 +1258,8 @@ component("net") { "device_bound_sessions/registration_fetcher_param.h", "device_bound_sessions/registration_request_param.cc", "device_bound_sessions/registration_request_param.h", + "device_bound_sessions/registration_result.cc", + "device_bound_sessions/registration_result.h", "device_bound_sessions/session.cc", "device_bound_sessions/session.h", "device_bound_sessions/session_binding_utils.cc", @@ -1249,8 +1272,6 @@ component("net") { "device_bound_sessions/session_inclusion_rules.h", "device_bound_sessions/session_json_utils.cc", "device_bound_sessions/session_json_utils.h", - "device_bound_sessions/session_params.cc", - "device_bound_sessions/session_params.h", "device_bound_sessions/session_service.cc", "device_bound_sessions/session_service.h", "device_bound_sessions/session_service_impl.cc", @@ -1261,12 +1282,14 @@ component("net") { "device_bound_sessions/session_store_impl.h", "device_bound_sessions/unexportable_key_service_factory.cc", "device_bound_sessions/unexportable_key_service_factory.h", + "device_bound_sessions/url_fetcher.cc", + "device_bound_sessions/url_fetcher.h", ] deps += [ ":device_bound_sessions_storage_proto", + "//build:branding_buildflags", "//components/sqlite_proto", - "//components/unexportable_keys", "//sql", ] } @@ -1378,6 +1401,8 @@ component("net") { "proxy_resolution/proxy_chain_util_apple.h", "proxy_resolution/proxy_resolver_apple.cc", "proxy_resolution/proxy_resolver_apple.h", + "socket/socket_apple.cc", + "socket/socket_apple.h", ] } @@ -1554,8 +1579,6 @@ component("net") { "third_party/mozilla_security_manager/nsNSSCertificateDB.h", "third_party/mozilla_security_manager/nsPKCS12Blob.cpp", "third_party/mozilla_security_manager/nsPKCS12Blob.h", - "third_party/nss/ssl/cmpcert.cc", - "third_party/nss/ssl/cmpcert.h", ] deps += [ "//build:chromeos_buildflags" ] if (!is_castos) { @@ -1609,6 +1632,7 @@ component("net") { "CFNetwork.framework", "CoreServices.framework", "Foundation.framework", + "Network.framework", "Security.framework", "SystemConfiguration.framework", "UniformTypeIdentifiers.framework", @@ -1701,7 +1725,6 @@ component("net") { "websockets/websocket_frame_parser.h", "websockets/websocket_handshake_challenge.cc", "websockets/websocket_handshake_challenge.h", - "websockets/websocket_handshake_constants.cc", "websockets/websocket_handshake_constants.h", "websockets/websocket_handshake_request_info.cc", "websockets/websocket_handshake_request_info.h", @@ -1785,8 +1808,11 @@ component("net") { sources += [ "disk_cache/sql/cache_entry_key.cc", "disk_cache/sql/cache_entry_key.h", + "disk_cache/sql/eviction_candidate_aggregator.cc", + "disk_cache/sql/eviction_candidate_aggregator.h", "disk_cache/sql/exclusive_operation_coordinator.cc", "disk_cache/sql/exclusive_operation_coordinator.h", + "disk_cache/sql/indexed_pair_set.h", "disk_cache/sql/sql_backend_constants.h", "disk_cache/sql/sql_backend_impl.cc", "disk_cache/sql/sql_backend_impl.h", @@ -1794,9 +1820,18 @@ component("net") { "disk_cache/sql/sql_entry_impl.h", "disk_cache/sql/sql_persistent_store.cc", "disk_cache/sql/sql_persistent_store.h", + "disk_cache/sql/sql_persistent_store_backend.cc", + "disk_cache/sql/sql_persistent_store_backend.h", + "disk_cache/sql/sql_persistent_store_backend_shard.cc", + "disk_cache/sql/sql_persistent_store_backend_shard.h", + "disk_cache/sql/sql_persistent_store_in_memory_index.cc", + "disk_cache/sql/sql_persistent_store_in_memory_index.h", "disk_cache/sql/sql_persistent_store_queries.h", ] - deps += [ "//sql" ] + deps += [ + "//components/performance_manager/scenario_api", + "//sql", + ] } } @@ -1828,6 +1863,7 @@ source_set("net_deps") { ":cronet_buildflags", ":isolation_info_proto", ":net_export_header", + ":net_features", ":preload_decoder", "//base", "//net/base/registry_controlled_domains", diff --git a/naiveproxy/src/net/DEPS b/naiveproxy/src/net/DEPS index 0708576806..b7c78318b3 100644 --- a/naiveproxy/src/net/DEPS +++ b/naiveproxy/src/net/DEPS @@ -1,5 +1,4 @@ include_rules = [ - "+components/miracle_parameter", "+components/network_time/time_tracker", "+crypto", "+net/net_jni_headers", diff --git a/naiveproxy/src/net/android/network_change_notifier_delegate_android.cc b/naiveproxy/src/net/android/network_change_notifier_delegate_android.cc index b23af7ea07..ffb84d1d52 100644 --- a/naiveproxy/src/net/android/network_change_notifier_delegate_android.cc +++ b/naiveproxy/src/net/android/network_change_notifier_delegate_android.cc @@ -4,7 +4,6 @@ #include "net/android/network_change_notifier_delegate_android.h" -#include "base/android/build_info.h" #include "base/android/jni_array.h" #include "base/check.h" #include "base/notreached.h" diff --git a/naiveproxy/src/net/android/unittest_support/AndroidManifest.xml b/naiveproxy/src/net/android/unittest_support/AndroidManifest.xml index dd01ad8f26..0d10497714 100644 --- a/naiveproxy/src/net/android/unittest_support/AndroidManifest.xml +++ b/naiveproxy/src/net/android/unittest_support/AndroidManifest.xml @@ -54,6 +54,10 @@ found in the LICENSE file. + + + #include "base/notreached.h" #include "net/base/ip_address.h" #include "net/base/sys_addrinfo.h" @@ -44,4 +46,16 @@ AddressFamily ToAddressFamily(int family) { NOTREACHED(); } +std::string_view AddressFamilyToString(AddressFamily address_family) { + switch (address_family) { + case ADDRESS_FAMILY_UNSPECIFIED: + return "Unspecified"; + case ADDRESS_FAMILY_IPV4: + return "IPv4"; + case ADDRESS_FAMILY_IPV6: + return "IPv6"; + } + NOTREACHED(); +} + } // namespace net diff --git a/naiveproxy/src/net/base/address_family.h b/naiveproxy/src/net/base/address_family.h index 476d77d323..add2a270d6 100644 --- a/naiveproxy/src/net/base/address_family.h +++ b/naiveproxy/src/net/base/address_family.h @@ -5,6 +5,8 @@ #ifndef NET_BASE_ADDRESS_FAMILY_H_ #define NET_BASE_ADDRESS_FAMILY_H_ +#include + #include "net/base/net_export.h" namespace net { @@ -45,6 +47,9 @@ NET_EXPORT int ConvertAddressFamily(AddressFamily address_family); // (or any other value) passed in results in NOTREACHED(). NET_EXPORT AddressFamily ToAddressFamily(int family); +// Returns a string representation of `address_family`. Used for histograms. +NET_EXPORT std::string_view AddressFamilyToString(AddressFamily address_family); + } // namespace net #endif // NET_BASE_ADDRESS_FAMILY_H_ diff --git a/naiveproxy/src/net/base/address_tracker_linux.cc b/naiveproxy/src/net/base/address_tracker_linux.cc index ff0a77f823..8bfb6510a3 100644 --- a/naiveproxy/src/net/base/address_tracker_linux.cc +++ b/naiveproxy/src/net/base/address_tracker_linux.cc @@ -180,7 +180,8 @@ AddressTrackerLinux::AddressTrackerLinux() tracking_(false) {} AddressTrackerLinux::AddressTrackerLinux( - const base::RepeatingClosure& address_callback, + const base::RepeatingCallback< + void(NetworkChangeNotifier::IPAddressChangeType)>& address_callback, const base::RepeatingClosure& link_callback, const base::RepeatingClosure& tunnel_callback, const std::unordered_set& ignored_interfaces, @@ -366,10 +367,10 @@ void AddressTrackerLinux::DumpInitialAddressesAndWatch() { // Consume pending message to populate the AddressMap, but don't notify. // Sending another request without first reading responses results in EBUSY. - bool address_changed; + NetworkChangeNotifier::IPAddressChangeType address_change_type; bool link_changed; bool tunnel_changed; - ReadMessages(&address_changed, &link_changed, &tunnel_changed); + ReadMessages(&address_change_type, &link_changed, &tunnel_changed); // Request dump of link state request.header.nlmsg_type = RTM_GETLINK; @@ -384,7 +385,7 @@ void AddressTrackerLinux::DumpInitialAddressesAndWatch() { } // Consume pending message to populate links_online_, but don't notify. - ReadMessages(&address_changed, &link_changed, &tunnel_changed); + ReadMessages(&address_change_type, &link_changed, &tunnel_changed); { AddressTrackerAutoLock lock(*this, connection_type_lock_); connection_type_initialized_ = true; @@ -402,11 +403,12 @@ void AddressTrackerLinux::DumpInitialAddressesAndWatch() { } } -void AddressTrackerLinux::ReadMessages(bool* address_changed, - bool* link_changed, - bool* tunnel_changed) { +void AddressTrackerLinux::ReadMessages( + NetworkChangeNotifier::IPAddressChangeType* address_change_type, + bool* link_changed, + bool* tunnel_changed) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - *address_changed = false; + *address_change_type = NetworkChangeNotifier::IP_ADDRESS_CHANGE_NONE; *link_changed = false; *tunnel_changed = false; bool first_loop = true; @@ -457,19 +459,35 @@ void AddressTrackerLinux::ReadMessages(bool* address_changed, PLOG(ERROR) << "Failed to recv from netlink socket"; return; } - HandleMessage(buffer.data(), rv, address_changed, link_changed, + HandleMessage(buffer.data(), rv, address_change_type, link_changed, tunnel_changed); } } - if (*link_changed || *address_changed) + if (*link_changed || + *address_change_type != NetworkChangeNotifier::IP_ADDRESS_CHANGE_NONE) { UpdateCurrentConnectionType(); + } } -void AddressTrackerLinux::HandleMessage(const char* buffer, - int length, - bool* address_changed, - bool* link_changed, - bool* tunnel_changed) { +// Upgrades |IP_ADDRESS_CHANGE_NONE| to either |IP_ADDRESS_CHANGE_IPV6_TEMPADDR| +// or |IP_ADDRESS_CHANGE_NORMAL| and possibly upgrades +// |IP_ADDRESS_CHANGE_IPV6_TEMPADDR| to |IP_ADDRESS_CHANGE_NORMAL|. +static NetworkChangeNotifier::IPAddressChangeType ModifyAddressChangeType( + NetworkChangeNotifier::IPAddressChangeType previous_change_type, + const struct ifaddrmsg& msg) { + if (msg.ifa_family == AF_INET6 && msg.ifa_flags & IFA_F_TEMPORARY && + previous_change_type != NetworkChangeNotifier::IP_ADDRESS_CHANGE_NORMAL) { + return NetworkChangeNotifier::IP_ADDRESS_CHANGE_IPV6_TEMPADDR; + } + return NetworkChangeNotifier::IP_ADDRESS_CHANGE_NORMAL; +} + +void AddressTrackerLinux::HandleMessage( + const char* buffer, + int length, + NetworkChangeNotifier::IPAddressChangeType* address_change_type, + bool* link_changed, + bool* tunnel_changed) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(buffer); // Note that NLMSG_NEXT decrements |length| to reflect the number of bytes @@ -516,15 +534,19 @@ void AddressTrackerLinux::HandleMessage(const char* buffer, auto it = address_map_.find(address); if (it == address_map_.end()) { address_map_.insert(it, std::pair(address, msg_copy)); - *address_changed = true; + *address_change_type = + ModifyAddressChangeType(*address_change_type, *msg); // Unfortunately, `ifaddrmsg` has no equality operator, so have to // either do this, or compare every field individually. } else if (base::byte_span_from_ref(it->second) != base::byte_span_from_ref(msg_copy)) { it->second = msg_copy; - *address_changed = true; + *address_change_type = + ModifyAddressChangeType(*address_change_type, *msg); } - if (*address_changed && address_map_diff_.has_value()) { + if (*address_change_type != + NetworkChangeNotifier::IP_ADDRESS_CHANGE_NONE && + address_map_diff_.has_value()) { (*address_map_diff_)[address] = msg_copy; } } @@ -540,7 +562,8 @@ void AddressTrackerLinux::HandleMessage(const char* buffer, if (GetAddress(header, length, &address, nullptr)) { AddressTrackerAutoLock lock(*this, address_map_lock_); if (address_map_.erase(address)) { - *address_changed = true; + *address_change_type = + ModifyAddressChangeType(*address_change_type, *msg); if (address_map_diff_.has_value()) { (*address_map_diff_)[address] = std::nullopt; } @@ -606,15 +629,15 @@ void AddressTrackerLinux::HandleMessage(const char* buffer, void AddressTrackerLinux::OnFileCanReadWithoutBlocking() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - bool address_changed; + NetworkChangeNotifier::IPAddressChangeType address_change_type; bool link_changed; bool tunnel_changed; - ReadMessages(&address_changed, &link_changed, &tunnel_changed); + ReadMessages(&address_change_type, &link_changed, &tunnel_changed); if (diff_callback_) { RunDiffCallback(); } - if (address_changed) { - address_callback_.Run(); + if (address_change_type != NetworkChangeNotifier::IP_ADDRESS_CHANGE_NONE) { + address_callback_.Run(address_change_type); } if (link_changed) { link_callback_.Run(); diff --git a/naiveproxy/src/net/base/address_tracker_linux.h b/naiveproxy/src/net/base/address_tracker_linux.h index 0a5de0fb85..3fd816b617 100644 --- a/naiveproxy/src/net/base/address_tracker_linux.h +++ b/naiveproxy/src/net/base/address_tracker_linux.h @@ -75,12 +75,14 @@ class NET_EXPORT_PRIVATE AddressTrackerLinux : public AddressMapOwnerLinux { // should run on a sequence that can block, e.g. a base::SequencedTaskRunner // with base::MayBlock(). If nullptr, SetDiffCallback() cannot be used off of // the AddressTrackerLinux's sequence. - AddressTrackerLinux(const base::RepeatingClosure& address_callback, - const base::RepeatingClosure& link_callback, - const base::RepeatingClosure& tunnel_callback, - const std::unordered_set& ignored_interfaces, - scoped_refptr - blocking_thread_runner = nullptr); + AddressTrackerLinux( + const base::RepeatingCallback< + void(NetworkChangeNotifier::IPAddressChangeType)>& address_callback, + const base::RepeatingClosure& link_callback, + const base::RepeatingClosure& tunnel_callback, + const std::unordered_set& ignored_interfaces, + scoped_refptr blocking_thread_runner = + nullptr); ~AddressTrackerLinux() override; // In tracking mode, it starts watching the system configuration for @@ -173,8 +175,9 @@ class NET_EXPORT_PRIVATE AddressTrackerLinux : public AddressMapOwnerLinux { // of initialization. Expects |netlink_fd_| to exist already. void DumpInitialAddressesAndWatch(); - // Sets |*address_changed| to indicate whether |address_map_| changed and - // sets |*link_changed| to indicate if |online_links_| changed and sets + // Sets |*address_change_type| to indicate whether |address_map_| changed and + // whether only IPv6 temporary addresses changed in |address_map_|, sets + // |*link_changed| to indicate if |online_links_| changed, and sets // |*tunnel_changed| to indicate if |online_links_| changed with regards to a // tunnel interface while reading messages from |netlink_fd_|. // @@ -183,11 +186,13 @@ class NET_EXPORT_PRIVATE AddressTrackerLinux : public AddressMapOwnerLinux { // Similarly, if |online_links_| has changed and |online_links_diff_| is not // nullopt, |*online_links_diff| is populated with the changes to the set of // online links. - void ReadMessages(bool* address_changed, - bool* link_changed, - bool* tunnel_changed); + void ReadMessages( + NetworkChangeNotifier::IPAddressChangeType* address_change_type, + bool* link_changed, + bool* tunnel_changed); - // Sets |*address_changed| to true if |address_map_| changed, sets + // Sets |*address_change_type| to indicate whether |address_map_| changed and + // whether only IPv6 temporary addresses changed in |address_map_|, sets // |*link_changed| to true if |online_links_| changed, sets |*tunnel_changed| // to true if |online_links_| changed with regards to a tunnel interface while // reading the message from |buffer|. @@ -197,11 +202,12 @@ class NET_EXPORT_PRIVATE AddressTrackerLinux : public AddressMapOwnerLinux { // Similarly, if |online_links_| has changed and |online_links_diff_| is not // nullopt, |*online_links_diff| is populated with the changes to the set of // online links. - void HandleMessage(const char* buffer, - int length, - bool* address_changed, - bool* link_changed, - bool* tunnel_changed); + void HandleMessage( + const char* buffer, + int length, + NetworkChangeNotifier::IPAddressChangeType* address_change_type, + bool* link_changed, + bool* tunnel_changed); // Call when some part of initialization failed; forces online and unblocks. void AbortAndForceOnline(); @@ -245,8 +251,8 @@ class NET_EXPORT_PRIVATE AddressTrackerLinux : public AddressMapOwnerLinux { GetInterfaceNameFunction get_interface_name_; DiffCallback diff_callback_ GUARDED_BY_CONTEXT(sequence_checker_); - base::RepeatingClosure address_callback_ - GUARDED_BY_CONTEXT(sequence_checker_); + base::RepeatingCallback + address_callback_ GUARDED_BY_CONTEXT(sequence_checker_); base::RepeatingClosure link_callback_ GUARDED_BY_CONTEXT(sequence_checker_); base::RepeatingClosure tunnel_callback_ GUARDED_BY_CONTEXT(sequence_checker_); diff --git a/naiveproxy/src/net/base/apple/url_conversions.mm b/naiveproxy/src/net/base/apple/url_conversions.mm index ddce941591..8f389795fa 100644 --- a/naiveproxy/src/net/base/apple/url_conversions.mm +++ b/naiveproxy/src/net/base/apple/url_conversions.mm @@ -25,9 +25,9 @@ NSURL* NSURLWithGURL(const GURL& url) { // ref. This function manually encodes those components, and then passes the // result to NSURL. GURL::Replacements replacements; - std::string escaped_path = base::EscapeNSURLPrecursor(url.path()); - std::string escaped_query = base::EscapeNSURLPrecursor(url.query()); - std::string escaped_ref = base::EscapeNSURLPrecursor(url.ref()); + std::string escaped_path = base::EscapeNSURLPrecursor(url.GetPath()); + std::string escaped_query = base::EscapeNSURLPrecursor(url.GetQuery()); + std::string escaped_ref = base::EscapeNSURLPrecursor(url.GetRef()); if (!escaped_path.empty()) { replacements.SetPathStr(escaped_path); } diff --git a/naiveproxy/src/net/base/directory_listing.cc b/naiveproxy/src/net/base/directory_listing.cc index 0e2c8d6de4..df211732e3 100644 --- a/naiveproxy/src/net/base/directory_listing.cc +++ b/naiveproxy/src/net/base/directory_listing.cc @@ -4,11 +4,14 @@ #include "net/base/directory_listing.h" +#include "base/byte_count.h" #include "base/i18n/time_formatting.h" #include "base/json/string_escape.h" #include "base/logging.h" #include "base/memory/ref_counted_memory.h" #include "base/strings/escape.h" +#include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/string_view_util.h" #include "base/strings/utf_string_conversions.h" @@ -18,6 +21,38 @@ namespace net { +namespace { + +constexpr auto kByteStringsUnlocalized = std::to_array({ + " B", + " kB", + " MB", + " GB", + " TB", + " PB", +}); + +std::string GetSizeString(base::ByteCount bytes) { + double unit_amount = bytes.InBytesF(); + size_t dimension = 0; + constexpr int kKilo = 1024; + while (unit_amount >= kKilo && + dimension < std::size(kByteStringsUnlocalized) - 1) { + unit_amount /= kKilo; + dimension++; + } + + if (!bytes.is_zero() && dimension > 0 && unit_amount < 100) { + return base::StrCat({base::NumberToStringWithFixedPrecision(unit_amount, 1), + kByteStringsUnlocalized[dimension]}); + } else { + return base::StrCat({base::NumberToStringWithFixedPrecision(unit_amount, 0), + kByteStringsUnlocalized[dimension]}); + } +} + +} // namespace + std::string GetDirectoryListingHeader(const std::u16string& title) { scoped_refptr header( NetModule::GetResource(IDR_DIR_HEADER_HTML)); @@ -39,7 +74,7 @@ std::string GetDirectoryListingHeader(const std::u16string& title) { std::string GetDirectoryListingEntry(const std::u16string& name, const std::string& raw_bytes, bool is_dir, - int64_t size, + base::ByteCount size, base::Time modified) { std::string result; result.append("\n"); return result; @@ -96,4 +129,8 @@ std::string GetParentDirectoryLink() { return std::string("\n"); } +std::string GetSizeStringForTesting(base::ByteCount size) { + return GetSizeString(size); +} + } // namespace net diff --git a/naiveproxy/src/net/base/directory_listing.h b/naiveproxy/src/net/base/directory_listing.h index 5cd073f850..572574ce72 100644 --- a/naiveproxy/src/net/base/directory_listing.h +++ b/naiveproxy/src/net/base/directory_listing.h @@ -6,8 +6,10 @@ #define NET_BASE_DIRECTORY_LISTING_H_ #include + #include +#include "base/byte_count.h" #include "net/base/net_export.h" namespace base { @@ -35,11 +37,14 @@ NET_EXPORT std::string GetDirectoryListingHeader(const std::u16string& title); NET_EXPORT std::string GetDirectoryListingEntry(const std::u16string& name, const std::string& raw_bytes, bool is_dir, - int64_t size, + base::ByteCount size, base::Time modified); NET_EXPORT std::string GetParentDirectoryLink(); +// Given a byte count, returns the size string used for listings. +NET_EXPORT std::string GetSizeStringForTesting(base::ByteCount size); + } // namespace net #endif // NET_BASE_DIRECTORY_LISTING_H_ diff --git a/naiveproxy/src/net/base/features.cc b/naiveproxy/src/net/base/features.cc index 91a1e8fbe4..fc8d889357 100644 --- a/naiveproxy/src/net/base/features.cc +++ b/naiveproxy/src/net/base/features.cc @@ -12,6 +12,7 @@ #include "net/base/cronet_buildflags.h" #include "net/disk_cache/buildflags.h" #include "net/net_buildflags.h" +#include "net/third_party/quiche/src/quiche/quic/core/quic_constants.h" #if BUILDFLAG(IS_WIN) #include "base/win/windows_version.h" @@ -19,18 +20,14 @@ namespace net::features { -BASE_FEATURE(kAlpsForHttp2, "AlpsForHttp2", base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kAlpsForHttp2, base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kAvoidH2Reprioritization, - "AvoidH2Reprioritization", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kAvoidH2Reprioritization, base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kCapReferrerToOriginOnCrossOrigin, - "CapReferrerToOriginOnCrossOrigin", base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kAsyncDns, - "AsyncDns", #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_ANDROID) || \ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) base::FEATURE_ENABLED_BY_DEFAULT @@ -39,9 +36,7 @@ BASE_FEATURE(kAsyncDns, #endif ); -BASE_FEATURE(kDnsTransactionDynamicTimeouts, - "DnsTransactionDynamicTimeouts", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kDnsTransactionDynamicTimeouts, base::FEATURE_DISABLED_BY_DEFAULT); const base::FeatureParam kDnsTransactionTimeoutMultiplier{ &kDnsTransactionDynamicTimeouts, "DnsTransactionTimeoutMultiplier", 7.5}; @@ -50,9 +45,7 @@ const base::FeatureParam kDnsMinTransactionTimeout{ &kDnsTransactionDynamicTimeouts, "DnsMinTransactionTimeout", base::Seconds(12)}; -BASE_FEATURE(kUseDnsHttpsSvcb, - "UseDnsHttpsSvcb", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kUseDnsHttpsSvcb, base::FEATURE_ENABLED_BY_DEFAULT); const base::FeatureParam kUseDnsHttpsSvcbEnforceSecureResponse{ &kUseDnsHttpsSvcb, "UseDnsHttpsSvcbEnforceSecureResponse", false}; @@ -79,33 +72,26 @@ const base::FeatureParam kUseDnsHttpsSvcbSecureExtraTimeMin{ &kUseDnsHttpsSvcb, "UseDnsHttpsSvcbSecureExtraTimeMin", base::Milliseconds(5)}; -BASE_FEATURE(kUseHostResolverCache, - "UseHostResolverCache", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kUseHostResolverCache, base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kHappyEyeballsV3, - "HappyEyeballsV3", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kHappyEyeballsV3, base::FEATURE_DISABLED_BY_DEFAULT); const base::FeatureParam kAlternativePortForGloballyReachableCheck{ &kUseAlternativePortForGloballyReachableCheck, "AlternativePortForGloballyReachableCheck", 443}; BASE_FEATURE(kUseAlternativePortForGloballyReachableCheck, - "UseAlternativePortForGloballyReachableCheck", base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kEnableIPv6ReachabilityOverride, - "EnableIPv6ReachabilityOverride", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kEnableTLS13EarlyData, - "EnableTLS13EarlyData", +BASE_FEATURE(kMaintainConnectionsOnIpv6TempAddrChange, base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kNetworkQualityEstimator, - "NetworkQualityEstimator", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kEnableTLS13EarlyData, base::FEATURE_DISABLED_BY_DEFAULT); + +BASE_FEATURE(kNetworkQualityEstimator, base::FEATURE_DISABLED_BY_DEFAULT); const base::FeatureParam kRecentHTTPThresholdInSeconds{ &kNetworkQualityEstimator, "RecentHTTPThresholdInSeconds", -1}; @@ -123,49 +109,37 @@ const base::FeatureParam "EffectiveConnectionTypeRecomputationInterval", base::Seconds(10)}; BASE_FEATURE(kSplitCacheByIncludeCredentials, - "SplitCacheByIncludeCredentials", base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kSplitCacheByNetworkIsolationKey, - "SplitCacheByNetworkIsolationKey", base::FEATURE_DISABLED_BY_DEFAULT); // Note: Use of this feature is gated on the HTTP cache itself being // partitioned, which is controlled by the kSplitCacheByNetworkIsolationKey // feature. BASE_FEATURE(kSplitCacheByCrossSiteMainFrameNavigationBoolean, - "SplitCacheByCrossSiteMainFrameNavigationBoolean", base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kSplitCodeCacheByNetworkIsolationKey, - "SplitCodeCacheByNetworkIsolationKey", base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kPartitionConnectionsByNetworkIsolationKey, - "PartitionConnectionsByNetworkIsolationKey", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kPrefixCookieHttp, - "PrefixCookieHttp", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kPrefixCookieHttp, base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kPrefixCookieHostHttp, - "PrefixCookieHostHttp", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kPrefixCookieHostHttp, base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kSearchEnginePreconnectInterval, - "SearchEnginePreconnectInterval", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kSearchEnginePreconnect2, - "SearchEnginePreconnect2", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kSearchEnginePreconnect2, base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE_PARAM(int, kIdleTimeoutInSeconds, &kSearchEnginePreconnect2, "IdleTimeoutInSeconds", - 120); + 30); BASE_FEATURE_PARAM(base::TimeDelta, kShortSessionThreshold, @@ -182,13 +156,13 @@ BASE_FEATURE_PARAM(int, kPingIntervalInSeconds, &kSearchEnginePreconnect2, "PingIntervalInSeconds", - 30); + 27); BASE_FEATURE_PARAM(std::string, kQuicConnectionOptions, &kSearchEnginePreconnect2, "QuicConnectionOptions", - ""); + "ECCP"); BASE_FEATURE_PARAM(bool, kFallbackInLowPowerMode, @@ -196,26 +170,14 @@ BASE_FEATURE_PARAM(bool, "FallbackInLowPowerMode", false); -BASE_FEATURE(kShortLaxAllowUnsafeThreshold, - "ShortLaxAllowUnsafeThreshold", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kConnectionKeepAliveForHttp2, base::FEATURE_DISABLED_BY_DEFAULT); + +BASE_FEATURE(kShortLaxAllowUnsafeThreshold, base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kSameSiteDefaultChecksMethodRigorously, - "SameSiteDefaultChecksMethodRigorously", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kLimitOpenUDPSockets, - "LimitOpenUDPSockets", - base::FEATURE_ENABLED_BY_DEFAULT); - -extern const base::FeatureParam kLimitOpenUDPSocketsMax( - &kLimitOpenUDPSockets, - "LimitOpenUDPSocketsMax", - 6000); - -BASE_FEATURE(kTimeoutTcpConnectAttempt, - "TimeoutTcpConnectAttempt", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kTimeoutTcpConnectAttempt, base::FEATURE_DISABLED_BY_DEFAULT); extern const base::FeatureParam kTimeoutTcpConnectAttemptRTTMultiplier( &kTimeoutTcpConnectAttempt, @@ -233,16 +195,12 @@ extern const base::FeatureParam kTimeoutTcpConnectAttemptMax( base::Seconds(30)); BASE_FEATURE(kCookieSameSiteConsidersRedirectChain, - "CookieSameSiteConsidersRedirectChain", base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kAllowSameSiteNoneCookiesInSandbox, - "AllowSameSiteNoneCookiesInSandbox", base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kWaitForFirstPartySetsInit, - "WaitForFirstPartySetsInit", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kWaitForFirstPartySetsInit, base::FEATURE_DISABLED_BY_DEFAULT); // Controls the maximum time duration an outermost frame navigation should be // deferred by RWS initialization. @@ -253,70 +211,42 @@ extern const base::FeatureParam base::Seconds(0)}; BASE_FEATURE(kRequestStorageAccessNoCorsRequired, - "RequestStorageAccessNoCorsRequired", base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kStorageAccessApiFollowsSameOriginPolicy, - "StorageAccessApiFollowsSameOriginPolicy", - base::FEATURE_DISABLED_BY_DEFAULT); - -BASE_FEATURE(kStaticKeyPinningEnforcement, - "StaticKeyPinningEnforcement", base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kCookieDomainRejectNonASCII, - "CookieDomainRejectNonASCII", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kStaticKeyPinningEnforcement, base::FEATURE_ENABLED_BY_DEFAULT); + +BASE_FEATURE(kCookieDomainRejectNonASCII, base::FEATURE_DISABLED_BY_DEFAULT); // Enables partitioning of third party storage (IndexedDB, CacheStorage, etc.) // by the top level site to reduce fingerprinting. -BASE_FEATURE(kThirdPartyStoragePartitioning, - "ThirdPartyStoragePartitioning", - base::FEATURE_ENABLED_BY_DEFAULT); - -BASE_FEATURE(kTopLevelTpcdOriginTrial, - "TopLevelTpcdOriginTrial", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kThirdPartyStoragePartitioning, base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kTpcdTrialSettings, "TpcdSupportSettings", base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kTopLevelTpcdTrialSettings, - "TopLevelTpcdSupportSettings", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kTpcdMetadataGrants, base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kTpcdMetadataGrants, - "TpcdMetadataGrants", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kTpcdMetadataStageControl, base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kTpcdMetadataStageControl, - "TpcdMetadataStageControl", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kAlpsParsing, base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kAlpsParsing, "AlpsParsing", base::FEATURE_ENABLED_BY_DEFAULT); - -BASE_FEATURE(kAlpsClientHintParsing, - "AlpsClientHintParsing", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kAlpsClientHintParsing, base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kShouldKillSessionOnAcceptChMalformed, - "ShouldKillSessionOnAcceptChMalformed", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kEnableWebsocketsOverHttp3, - "EnableWebsocketsOverHttp3", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kEnableWebsocketsOverHttp3, base::FEATURE_DISABLED_BY_DEFAULT); #if BUILDFLAG(IS_WIN) // Disabled because of https://crbug.com/1489696. BASE_FEATURE(kEnableGetNetworkConnectivityHintAPI, - "EnableGetNetworkConnectivityHintAPI", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kTcpPortRandomizationWin, - "TcpPortRandomizationWin", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kTcpPortRandomizationWin, base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE_PARAM(int, kTcpPortRandomizationWinVersionMinimum, @@ -324,18 +254,12 @@ BASE_FEATURE_PARAM(int, "TcpPortRandomizationWinVersionMinimum", static_cast(base::win::Version::WIN11_22H2)); -BASE_FEATURE(kTcpPortReuseMetricsWin, - "TcpPortReuseMetricsWin", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kTcpPortReuseMetricsWin, base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kTcpSocketIoCompletionPortWin, - "TcpSocketIoCompletionPortWin", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kTcpSocketIoCompletionPortWin, base::FEATURE_DISABLED_BY_DEFAULT); #endif -BASE_FEATURE(kAvoidEntryCreationForNoStore, - "AvoidEntryCreationForNoStore", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kAvoidEntryCreationForNoStore, base::FEATURE_DISABLED_BY_DEFAULT); const base::FeatureParam kAvoidEntryCreationForNoStoreCacheSize{ &kAvoidEntryCreationForNoStore, "AvoidEntryCreationForNoStoreCacheSize", 1000}; @@ -344,14 +268,11 @@ const base::FeatureParam kAvoidEntryCreationForNoStoreCacheSize{ // when Kerberos authentication in browser fails on ChromeOS. // b/260522530 #if BUILDFLAG(IS_CHROMEOS) -BASE_FEATURE(kKerberosInBrowserRedirect, - "KerberosInBrowserRedirect", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kKerberosInBrowserRedirect, base::FEATURE_ENABLED_BY_DEFAULT); #endif // A flag to use asynchronous session creation for new QUIC sessions. BASE_FEATURE(kAsyncQuicSession, - "AsyncQuicSession", #if BUILDFLAG(IS_WIN) base::FEATURE_ENABLED_BY_DEFAULT); #else @@ -360,7 +281,6 @@ BASE_FEATURE(kAsyncQuicSession, // A flag to make multiport context creation asynchronous. BASE_FEATURE(kAsyncMultiPortPath, - "AsyncMultiPortPath", #if !BUILDFLAG(CRONET_BUILD) && (BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID)) base::FEATURE_ENABLED_BY_DEFAULT); #else @@ -369,7 +289,6 @@ BASE_FEATURE(kAsyncMultiPortPath, // Probabilistic reveal tokens configuration settings BASE_FEATURE(kEnableProbabilisticRevealTokens, - "EnableProbabilisticRevealTokens", base::FEATURE_DISABLED_BY_DEFAULT); const base::FeatureParam kProbabilisticRevealTokenServer{ @@ -503,6 +422,10 @@ const base::FeatureParam kIpPrivacyTryGetAuthTokensBugBackoff{ &kEnableIpProtectionProxy, /*name=*/"IpPrivacyTryGetAuthTokensBugBackoff", /*default_value=*/base::Minutes(10)}; +const base::FeatureParam kIpPrivacyBackoffJitter{ + &kEnableIpProtectionProxy, /*name=*/"IpPrivacyBackoffJitter", + /*default_value=*/0.25}; + const base::FeatureParam kIpPrivacyRestrictTopLevelSiteSchemes{ &kEnableIpProtectionProxy, /*name=*/"IpPrivacyRestrictTopLevelSiteSchemes", @@ -518,6 +441,12 @@ const base::FeatureParam kIpPrivacyUseQuicProxiesOnly{ /*name=*/"IpPrivacyUseQuicProxiesOnly", /*default_value=*/false}; +const base::FeatureParam + kIpPrivacyUseQuicProxiesWithoutWaitingForConnectResponse{ + &kEnableIpProtectionProxy, + /*name=*/"IpPrivacyUseQuicProxiesWithoutWaitingForConnectResponse", + /*default_value=*/false}; + const base::FeatureParam kIpPrivacyFallbackToDirect{ &kEnableIpProtectionProxy, /*name=*/"IpPrivacyFallbackToDirect", @@ -555,11 +484,14 @@ const base::FeatureParam kIpPrivacyEnableIppInDevTools{ const base::FeatureParam kIpPrivacyEnableIppPanelInDevTools{ &kEnableIpProtectionProxy, - /*name=*/"kIpPrivacyEnableIppPanelInDevTools", + /*name=*/"IpPrivacyEnableIppPanelInDevTools", /*default_value=*/false}; +const base::FeatureParam kIpPrivacyUnconditionalProxyDomainList{ + &kEnableIpProtectionProxy, + /*name=*/"IpPrivacyUnconditionalProxyDomainList", /*default_value=*/""}; + BASE_FEATURE(kEnableIpPrivacyProxyAdvancedFallbackLogic, - "EnableIpPrivacyProxyAdvancedFallbackLogic", base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kExcludeLargeBodyReports, @@ -572,9 +504,7 @@ BASE_FEATURE_PARAM(size_t, "max_report_body_size_kb", 1024); -BASE_FEATURE(kRelatedWebsitePartitionAPI, - "RelatedWebsitePartitionAPI", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kRelatedWebsitePartitionAPI, base::FEATURE_DISABLED_BY_DEFAULT); // Network-change migration requires NetworkHandle support, which are currently // only supported on Android (see @@ -587,130 +517,116 @@ inline constexpr auto kMigrateSessionsOnNetworkChangeV2Default = base::FEATURE_DISABLED_BY_DEFAULT; #endif // BUILDFLAG(IS_ANDROID) BASE_FEATURE(kMigrateSessionsOnNetworkChangeV2, - "MigrateSessionsOnNetworkChangeV2", kMigrateSessionsOnNetworkChangeV2Default); -BASE_FEATURE(kDisableBlackholeOnNoNewNetwork, - "DisableBlackHoleOnNoNewNetwork", - base::FEATURE_DISABLED_BY_DEFAULT); - #if BUILDFLAG(IS_LINUX) -BASE_FEATURE(kAddressTrackerLinuxIsProxied, - "AddressTrackerLinuxIsProxied", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kAddressTrackerLinuxIsProxied, base::FEATURE_ENABLED_BY_DEFAULT); #endif // BUILDFLAG(IS_LINUX) // Enables binding of cookies to the port that originally set them by default. -BASE_FEATURE(kEnablePortBoundCookies, - "EnablePortBoundCookies", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kEnablePortBoundCookies, base::FEATURE_DISABLED_BY_DEFAULT); // Enables binding of cookies to the scheme that originally set them. NET_EXPORT BASE_DECLARE_FEATURE(kEnableSchemeBoundCookies); -BASE_FEATURE(kEnableSchemeBoundCookies, - "EnableSchemeBoundCookies", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kEnableSchemeBoundCookies, base::FEATURE_DISABLED_BY_DEFAULT); // Disallows cookies to have non ascii values in their name or value. NET_EXPORT BASE_DECLARE_FEATURE(kDisallowNonAsciiCookies); -BASE_FEATURE(kDisallowNonAsciiCookies, - "DisallowNonAsciiCookies", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kDisallowNonAsciiCookies, base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kTimeLimitedInsecureCookies, - "TimeLimitedInsecureCookies", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kTimeLimitedInsecureCookies, base::FEATURE_DISABLED_BY_DEFAULT); // Enable third-party cookie blocking from the command line. BASE_FEATURE(kForceThirdPartyCookieBlocking, "ForceThirdPartyCookieBlockingEnabled", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kEnableEarlyHintsOnHttp11, - "EnableEarlyHintsOnHttp11", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kEnableEarlyHintsOnHttp11, base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kEnableWebTransportDraft07, - "EnableWebTransportDraft07", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kEnableWebTransportDraft07, base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kWebTransportFineGrainedThrottling, - "WebTransportFineGrainedThrottling", base::FEATURE_DISABLED_BY_DEFAULT); // When enabled, partitioned storage will be allowed even if third-party cookies // are disabled by default. Partitioned storage will not be allowed if // third-party cookies are disabled due to a specific rule. BASE_FEATURE(kThirdPartyPartitionedStorageAllowedByDefault, - "ThirdPartyPartitionedStorageAllowedByDefault", base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kSpdyHeadersToHttpResponseUseBuilder, - "SpdyHeadersToHttpResponseUseBuilder", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kUseNewAlpsCodepointHttp2, - "UseNewAlpsCodepointHttp2", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kUseNewAlpsCodepointHttp2, base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kUseNewAlpsCodepointQUIC, - "UseNewAlpsCodepointQUIC", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kUseNewAlpsCodepointQUIC, base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kTruncateBodyToContentLength, - "TruncateBodyToContentLength", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kTruncateBodyToContentLength, base::FEATURE_ENABLED_BY_DEFAULT); #if BUILDFLAG(IS_MAC) BASE_FEATURE(kReduceIPAddressChangeNotification, - "ReduceIPAddressChangeNotification", base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kUseNetworkPathMonitorForNetworkChangeNotifier, + base::FEATURE_DISABLED_BY_DEFAULT); #endif // BUILDFLAG(IS_MAC) -BASE_FEATURE(kDeviceBoundSessions, - "DeviceBoundSessions", - base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kPersistDeviceBoundSessions, - "PersistDeviceBoundSessions", +BASE_FEATURE(kDeviceBoundSessions, base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kPersistDeviceBoundSessions, base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE_PARAM(bool, + kDeviceBoundSessionsRequireOriginTrialTokens, + &kDeviceBoundSessions, + "RequireOriginTrialTokens", + true); +BASE_FEATURE_PARAM(bool, + kDeviceBoundSessionsRefreshQuota, + &kDeviceBoundSessions, + "RefreshQuota", + true); +BASE_FEATURE_PARAM(bool, + kDeviceBoundSessionsCheckSubdomainRegistration, + &kDeviceBoundSessions, + "CheckSubdomainRegistration", + true); +BASE_FEATURE_PARAM(int, + kDeviceBoundSessionsSchemaVersion, + &kDeviceBoundSessions, + "SchemaVersion", + 2); +BASE_FEATURE_PARAM(bool, + kDeviceBoundSessionsOriginTrialFeedback, + &kDeviceBoundSessions, + "OriginTrialFeedback", + true); + +BASE_FEATURE(kDeviceBoundSessionsFederatedRegistration, base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE_PARAM(bool, - kDeviceBoundSessionsForceEnableForTesting, - &kDeviceBoundSessions, - "ForceEnableForTesting", - false); -BASE_FEATURE(kDeviceBoundSessionsRefreshQuota, - "DeviceBoundSessionsRefreshQuota", - base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kDeviceBoundSessionsOriginTrialFeedback, - "DeviceBoundSessionsOriginTrialFeedback", - base::FEATURE_DISABLED_BY_DEFAULT); + kDeviceBoundSessionsFederatedRegistrationCheckWellKnown, + &kDeviceBoundSessionsFederatedRegistration, + "CheckWellKnown", + true); -BASE_FEATURE(kPartitionProxyChains, - "PartitionProxyChains", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kDeviceBoundSessionProactiveRefresh, + base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE_PARAM(base::TimeDelta, + kDeviceBoundSessionProactiveRefreshThreshold, + &kDeviceBoundSessionProactiveRefresh, + "Threshold", + base::Seconds(120)); + +BASE_FEATURE(kDeviceBoundSessionSigningQuotaAndCaching, + base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kSpdySessionForProxyAdditionalChecks, - "SpdySessionForProxyAdditionalChecks", - base::FEATURE_ENABLED_BY_DEFAULT); - -BASE_FEATURE(kCompressionDictionaryTransportOverHttp1, - "CompressionDictionaryTransportOverHttp1", - base::FEATURE_ENABLED_BY_DEFAULT); - -BASE_FEATURE(kCompressionDictionaryTransportOverHttp2, - "CompressionDictionaryTransportOverHttp2", base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kCompressionDictionaryTransportRequireKnownRootCert, - "CompressionDictionaryTransportRequireKnownRootCert", base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kReportingApiEnableEnterpriseCookieIssues, - "ReportingApiEnableEnterpriseCookieIssues", base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kSimdutfBase64Support, - "SimdutfBase64Support", #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) base::FEATURE_ENABLED_BY_DEFAULT #else @@ -718,21 +634,14 @@ BASE_FEATURE(kSimdutfBase64Support, #endif ); -BASE_FEATURE(kFurtherOptimizeParsingDataUrls, - "FurtherOptimizeParsingDataUrls", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kFurtherOptimizeParsingDataUrls, base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kNoVarySearchIgnoreUnrecognizedKeys, - "NoVarySearchIgnoreUnrecognizedKeys", base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kEnableStaticCTAPIEnforcement, - "EnableStaticCTAPIEnforcement", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kEnableStaticCTAPIEnforcement, base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kDiskCacheBackendExperiment, - "DiskCacheBackendExperiment", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kDiskCacheBackendExperiment, base::FEATURE_DISABLED_BY_DEFAULT); constexpr base::FeatureParam::Option kDiskCacheBackendOptions[] = { {DiskCacheBackend::kDefault, "default"}, @@ -743,16 +652,45 @@ constexpr base::FeatureParam::Option #endif // ENABLE_DISK_CACHE_SQL_BACKEND }; const base::FeatureParam kDiskCacheBackendParam{ - &kDiskCacheBackendExperiment, "backend", DiskCacheBackend::kDefault, + &kDiskCacheBackendExperiment, "backend", +#if BUILDFLAG(ENABLE_DISK_CACHE_SQL_BACKEND) + DiskCacheBackend::kSql, +#else // ENABLE_DISK_CACHE_SQL_BACKEND + DiskCacheBackend::kDefault, +#endif // ENABLE_DISK_CACHE_SQL_BACKEND &kDiskCacheBackendOptions}; -BASE_FEATURE(kIgnoreHSTSForLocalhost, - "IgnoreHSTSForLocalhost", - base::FEATURE_ENABLED_BY_DEFAULT); +#if BUILDFLAG(ENABLE_DISK_CACHE_SQL_BACKEND) +BASE_FEATURE_PARAM(int, + kSqlDiskCacheForceCheckpointThreshold, + &kDiskCacheBackendExperiment, + "SqlDiskCacheForceCheckpointThreshold", + 20000); +BASE_FEATURE_PARAM(int, + kSqlDiskCacheIdleCheckpointThreshold, + &kDiskCacheBackendExperiment, + "SqlDiskCacheIdleCheckpointThreshold", + 1000); +BASE_FEATURE_PARAM(int, + kSqlDiskCacheOptimisticWriteBufferSize, + &kDiskCacheBackendExperiment, + "SqlDiskCacheOptimisticWriteBufferSize", + 32 * 1024 * 1024); +BASE_FEATURE_PARAM(bool, + kSqlDiskCacheSynchronousOff, + &kDiskCacheBackendExperiment, + "SqlDiskCacheSynchronousOff", + false); +BASE_FEATURE_PARAM(int, + kSqlDiskCacheShardCount, + &kDiskCacheBackendExperiment, + "SqlDiskCacheShardCount", + 3); +#endif // ENABLE_DISK_CACHE_SQL_BACKEND -BASE_FEATURE(kSimpleCachePrioritizedCaching, - "SimpleCachePrioritizedCaching", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kIgnoreHSTSForLocalhost, base::FEATURE_ENABLED_BY_DEFAULT); + +BASE_FEATURE(kSimpleCachePrioritizedCaching, base::FEATURE_ENABLED_BY_DEFAULT); const base::FeatureParam kSimpleCachePrioritizedCachingPrioritizationFactor{ @@ -766,26 +704,20 @@ const base::FeatureParam /*name=*/"SimpleCachePrioritizedCachingPrioritizationPeriod", /*default_value=*/base::Days(1)}; -#if BUILDFLAG(USE_NSS_CERTS) -// TODO(crbug.com/390333881): Remove this flag after a few milestones. -BASE_FEATURE(kNewClientCertPathBuilding, - "NewClientCertPathBuilding", - base::FEATURE_ENABLED_BY_DEFAULT); -#endif // BUILDFLAG(USE_NSS_CERTS) - -BASE_FEATURE(kHstsTopLevelNavigationsOnly, - "HstsTopLevelNavigationsOnly", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kHstsTopLevelNavigationsOnly, base::FEATURE_DISABLED_BY_DEFAULT); #if BUILDFLAG(IS_WIN) -BASE_FEATURE(kHttpCacheMappedFileFlushWin, - "HttpCacheMappedFileFlushWin", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kHttpCacheMappedFileFlushWin, base::FEATURE_DISABLED_BY_DEFAULT); #endif BASE_FEATURE(kHttpCacheNoVarySearch, - "HttpCacheNoVarySearch", - base::FEATURE_DISABLED_BY_DEFAULT); +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ + BUILDFLAG(IS_CHROMEOS) + base::FEATURE_ENABLED_BY_DEFAULT +#else + base::FEATURE_DISABLED_BY_DEFAULT +#endif +); BASE_FEATURE_PARAM(size_t, kHttpCacheNoVarySearchCacheMaxEntries, @@ -793,14 +725,6 @@ BASE_FEATURE_PARAM(size_t, "max_entries", 1000); -// TODO(crbug.com/433551601): Change the default to `true` once it has been -// verified working. -BASE_FEATURE_PARAM(bool, - kHttpCacheNoVarySearchApplyToExternalHits, - &kHttpCacheNoVarySearch, - "apply_to_external_hits", - false); - BASE_FEATURE_PARAM(bool, kHttpCacheNoVarySearchPersistenceEnabled, &kHttpCacheNoVarySearch, @@ -808,105 +732,176 @@ BASE_FEATURE_PARAM(bool, true); BASE_FEATURE_PARAM(bool, - kHttpCacheNoVarySearchFakePersistence, + kHttpCacheNoVarySearchKeepNotSuitable, &kHttpCacheNoVarySearch, - "fake_persistence", - false); + "keep_not_suitable", + true); -BASE_FEATURE(kReportingApiCorsOriginHeader, - "ReportingApiCorsOriginHeader", - base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kHttpNoVarySearchDataUseNewAreEquivalent, + base::FEATURE_DISABLED_BY_DEFAULT); + +BASE_FEATURE(kReportingApiCorsOriginHeader, base::FEATURE_ENABLED_BY_DEFAULT); #if BUILDFLAG(IS_ANDROID) BASE_FEATURE(kUseCertTransparencyAwareApiForOsCertVerify, - "UseCertTransparencyAwareApiForOsCertVerify", base::FEATURE_ENABLED_BY_DEFAULT); #endif // BUILDFLAG(IS_ANDROID) BASE_FEATURE(kSelfSignedLocalNetworkInterstitial, - "SelfSignedLocalNetworkInterstitial", base::FEATURE_DISABLED_BY_DEFAULT); #if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED) -BASE_FEATURE(kVerifyQWACs, "VerifyQWACs", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kVerifyQWACs, base::FEATURE_DISABLED_BY_DEFAULT); #endif // BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED) -#if BUILDFLAG(IS_MAC) -BASE_FEATURE(kIncludeDeprecatedClientCertLookup, - "IncludeDeprecatedClientCertLookup", - base::FEATURE_DISABLED_BY_DEFAULT); -#endif +BASE_FEATURE(kRestrictAbusePorts, base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kRestrictAbusePorts, - "RestrictAbusePorts", +BASE_FEATURE(kRestrictAbusePortsOnLocalhost, base::FEATURE_ENABLED_BY_DEFAULT); + +BASE_FEATURE(kTLSTrustAnchorIDs, base::FEATURE_DISABLED_BY_DEFAULT); + +BASE_FEATURE(kTcpSocketPoolLimitRandomization, base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kRestrictAbusePortsOnLocalhost, - "RestrictAbusePortsOnLocalhost", - base::FEATURE_ENABLED_BY_DEFAULT); - -BASE_FEATURE(kTLSTrustAnchorIDs, - "TLSTrustAnchorIDs", - base::FEATURE_DISABLED_BY_DEFAULT); - -BASE_FEATURE(kTcpConnectionPoolSizeTrial, - "TcpConnectionPoolSizeTrial", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE_PARAM(double, + kTcpSocketPoolLimitRandomizationBase, + &kTcpSocketPoolLimitRandomization, + "TcpSocketPoolLimitRandomizationBase", + 0.0); BASE_FEATURE_PARAM(int, - kTcpConnectionPoolSizeTrialNormal, - &kTcpConnectionPoolSizeTrial, - "TcpConnectionPoolSizeTrialNormal", - 256); + kTcpSocketPoolLimitRandomizationCapacity, + &kTcpSocketPoolLimitRandomization, + "TcpSocketPoolLimitRandomizationCapacity", + 0); -BASE_FEATURE_PARAM(int, - kTcpConnectionPoolSizeTrialWebSocket, - &kTcpConnectionPoolSizeTrial, - "TcpConnectionPoolSizeTrialWebSocket", - 256); +BASE_FEATURE_PARAM(double, + kTcpSocketPoolLimitRandomizationMinimum, + &kTcpSocketPoolLimitRandomization, + "TcpSocketPoolLimitRandomizationMinimum", + 0.0); -BASE_FEATURE(kNetTaskScheduler, - "NetTaskScheduler", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE_PARAM(double, + kTcpSocketPoolLimitRandomizationNoise, + &kTcpSocketPoolLimitRandomization, + "TcpSocketPoolLimitRandomizationNoise", + 0.0); + +BASE_FEATURE(kNetTaskScheduler, base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE_PARAM(bool, kNetTaskSchedulerHttpProxyConnectJob, &kNetTaskScheduler, "http_proxy_connect_job", - false); -BASE_FEATURE_PARAM(bool, - kNetTaskSchedulerHttpCacheTransaction, - &kNetTaskScheduler, - "http_cache_transaction", - false); + true); BASE_FEATURE_PARAM(bool, kNetTaskSchedulerHttpStreamFactoryJob, &kNetTaskScheduler, "http_stream_factory_job", - false); + true); BASE_FEATURE_PARAM(bool, kNetTaskSchedulerHttpStreamFactoryJobController, &kNetTaskScheduler, "http_stream_factory_job_controller", - false); + true); BASE_FEATURE_PARAM(bool, kNetTaskSchedulerURLRequestErrorJob, &kNetTaskScheduler, "url_request_error_job", - false); + true); BASE_FEATURE_PARAM(bool, kNetTaskSchedulerURLRequestHttpJob, &kNetTaskScheduler, "url_request_http_job", - false); + true); BASE_FEATURE_PARAM(bool, kNetTaskSchedulerURLRequestJob, &kNetTaskScheduler, "url_request_job", - false); + true); BASE_FEATURE_PARAM(bool, kNetTaskSchedulerURLRequestRedirectJob, &kNetTaskScheduler, "url_request_redirect_job", + true); + +BASE_FEATURE(kNetTaskScheduler2, base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE_PARAM(bool, + kNetTaskSchedulerHttpCache, + &kNetTaskScheduler2, + "http_cache", + false); +BASE_FEATURE_PARAM(bool, + kNetTaskSchedulerHttpCacheTransaction, + &kNetTaskScheduler2, + "http_cache_transaction", false); +BASE_FEATURE(kAdditionalDelayMainJob, base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE_PARAM(base::TimeDelta, + kAdditionalDelay, + &kAdditionalDelayMainJob, + "AdditionalDelay", + base::Milliseconds(0)); +BASE_FEATURE_PARAM(bool, + kDelayMainJobWithAvailableSpdySession, + &kAdditionalDelayMainJob, + "DelayMainJobWithAvailableSpdySession", + false); + +BASE_FEATURE(kExtendQuicHandshakeTimeout, base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE_PARAM(base::TimeDelta, + kQuicHandshakeTimeout, + &kExtendQuicHandshakeTimeout, + "QuicHandshakeTimeout", + base::Seconds(quic::kMaxTimeForCryptoHandshakeSecs)); +BASE_FEATURE_PARAM(base::TimeDelta, + kMaxIdleTimeBeforeCryptoHandshake, + &kExtendQuicHandshakeTimeout, + "MaxIdleTimeBeforeCryptoHandshake", + base::Seconds(quic::kInitialIdleTimeoutSecs)); + +BASE_FEATURE(kQuicLongerIdleConnectionTimeout, + base::FEATURE_DISABLED_BY_DEFAULT); + +BASE_FEATURE(kLowerQuicMaxPacketSize, base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE_PARAM(size_t, + kQuicMaxPacketSize, + &kLowerQuicMaxPacketSize, + "mtu", + quic::kDefaultMaxPacketSize); + +BASE_FEATURE(kConfigureQuicHints, base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE_PARAM(std::string, + kQuicHintHostPortPairs, + &kConfigureQuicHints, + /*name=*/"quic_hints", + /*default_value=*/""); +BASE_FEATURE_PARAM(std::string, + kWildcardQuicHintHostPortPairs, + &kConfigureQuicHints, + /*name=*/"wildcard_quic_hints", + /*default_value=*/""); + +BASE_FEATURE(kDnsFilteringDetails, base::FEATURE_DISABLED_BY_DEFAULT); + +BASE_FEATURE(kUpdateIsMainFrameOriginRecentlyAccessed, + base::FEATURE_DISABLED_BY_DEFAULT); + +BASE_FEATURE_PARAM(size_t, + kRecentlyAccessedOriginCacheSize, + &kUpdateIsMainFrameOriginRecentlyAccessed, + "cache_size", + 64); + +BASE_FEATURE(kTryQuicByDefault, base::FEATURE_DISABLED_BY_DEFAULT); + +BASE_FEATURE_PARAM(std::string, + kQuicOptions, + &kTryQuicByDefault, + "quic_options", + ""); + +BASE_FEATURE(kDnsResponseDiscardPartialQuestions, + base::FEATURE_ENABLED_BY_DEFAULT); + } // namespace net::features diff --git a/naiveproxy/src/net/base/features.h b/naiveproxy/src/net/base/features.h index 018f2d9bb1..7df1cbea4c 100644 --- a/naiveproxy/src/net/base/features.h +++ b/naiveproxy/src/net/base/features.h @@ -113,6 +113,10 @@ NET_EXPORT BASE_DECLARE_FEATURE(kUseAlternativePortForGloballyReachableCheck); // IP addresses. NET_EXPORT BASE_DECLARE_FEATURE(kEnableIPv6ReachabilityOverride); +// If enabled, avoids aborting connections in response to adding or removing an +// IPv6 temporary address. +NET_EXPORT BASE_DECLARE_FEATURE(kMaintainConnectionsOnIpv6TempAddrChange); + // Enables TLS 1.3 early data. NET_EXPORT BASE_DECLARE_FEATURE(kEnableTLS13EarlyData); @@ -214,6 +218,9 @@ NET_EXPORT BASE_DECLARE_FEATURE_PARAM(std::string, kQuicConnectionOptions); // power mode. NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, kFallbackInLowPowerMode); +// Enables Connection Keep-Alive feature for Http2 +NET_EXPORT BASE_DECLARE_FEATURE(kConnectionKeepAliveForHttp2); + // When enabled, the time threshold for Lax-allow-unsafe cookies will be lowered // from 2 minutes to 10 seconds. This time threshold refers to the age cutoff // for which cookies that default into SameSite=Lax, which are newer than the @@ -230,16 +237,6 @@ NET_EXPORT BASE_DECLARE_FEATURE(kShortLaxAllowUnsafeThreshold); // This only has an effect if the cookie defaults to SameSite=Lax. NET_EXPORT BASE_DECLARE_FEATURE(kSameSiteDefaultChecksMethodRigorously); -// Enables a process-wide limit on "open" UDP sockets. See -// udp_socket_global_limits.h for details on what constitutes an "open" socket. -NET_EXPORT BASE_DECLARE_FEATURE(kLimitOpenUDPSockets); - -// FeatureParams associated with kLimitOpenUDPSockets. - -// Sets the maximum allowed open UDP sockets. Provisioning more sockets than -// this will result in a failure (ERR_INSUFFICIENT_RESOURCES). -NET_EXPORT extern const base::FeatureParam kLimitOpenUDPSocketsMax; - // Enables a timeout on individual TCP connect attempts, based on // the parameter values. NET_EXPORT BASE_DECLARE_FEATURE(kTimeoutTcpConnectAttempt); @@ -306,15 +303,9 @@ NET_EXPORT BASE_DECLARE_FEATURE(kCookieDomainRejectNonASCII); NET_EXPORT BASE_DECLARE_FEATURE(kThirdPartyStoragePartitioning); -// Controls consideration of top-level 3PCD origin trial settings. -NET_EXPORT BASE_DECLARE_FEATURE(kTopLevelTpcdOriginTrial); - // Feature to enable consideration of 3PC deprecation trial settings. NET_EXPORT BASE_DECLARE_FEATURE(kTpcdTrialSettings); -// Feature to enable consideration of top-level 3PC deprecation trial settings. -NET_EXPORT BASE_DECLARE_FEATURE(kTopLevelTpcdTrialSettings); - // Whether to enable the use of 3PC based on 3PCD metadata grants delivered via // component updater. NET_EXPORT BASE_DECLARE_FEATURE(kTpcdMetadataGrants); @@ -341,6 +332,8 @@ NET_EXPORT BASE_DECLARE_FEATURE(kEnableGetNetworkConnectivityHintAPI); // Whether or not to enable TCP port randomization via SO_RANDOMIZE_PORT on // Windows for versions >= kTcpPortRandomizationWinVersionMinimum. // See crbug.com/40744069 for more details. +// This was launched in M141, but the finch flag was kept around in case it +// ever causes issues (as some may take time to detect due to rarity). NET_EXPORT BASE_DECLARE_FEATURE(kTcpPortRandomizationWin); NET_EXPORT BASE_DECLARE_FEATURE_PARAM(int, kTcpPortRandomizationWinVersionMinimum); @@ -530,6 +523,9 @@ NET_EXPORT extern const base::FeatureParam NET_EXPORT extern const base::FeatureParam kIpPrivacyTryGetAuthTokensBugBackoff; +// Jitter (as a percentage) to apply to backoff time calculations. +NET_EXPORT extern const base::FeatureParam kIpPrivacyBackoffJitter; + // If true, only proxy traffic when the top-level site uses the http:// or // https:// schemes. This prevents attempts to proxy from top-level sites with // chrome://, chrome-extension://, or other non-standard schemes, in addition to @@ -546,6 +542,12 @@ NET_EXPORT extern const base::FeatureParam kIpPrivacyUseQuicProxies; // functionality. NET_EXPORT extern const base::FeatureParam kIpPrivacyUseQuicProxiesOnly; +// If true, IP protection will not wait for a CONNECT-UDP response before +// sending datagrams. This will not do anything if kIpPrivacyUseQuicProxies is +// false. +NET_EXPORT extern const base::FeatureParam + kIpPrivacyUseQuicProxiesWithoutWaitingForConnectResponse; + // Fallback to direct when connections to IP protection proxies fail. This // defaults to true and is intended for development of the QUIC functionality. NET_EXPORT extern const base::FeatureParam kIpPrivacyFallbackToDirect; @@ -595,12 +597,20 @@ NET_EXPORT extern const base::FeatureParam NET_EXPORT extern const base::FeatureParam kIpPrivacyEnableIppInDevTools; // Enables the ability for IP protection features to be gated in the Privacy -// and Security Panel within DevTools. When this flag is disabled, the IP -// Protection section will not be shown in the DevTools panel, allowing testing -// and development of the IP Protection features before public release. +// and Security Panel within DevTools. When this flag is enabled, the IP +// Protection section will be shown in the Privacy and Security section of the +// DevTools panel allowing users to view proxied requests and bypass IP +// Protection locally. +// Do not remove or enable this flag for all users until crbug.com/442349180 +// is resolved. NET_EXPORT extern const base::FeatureParam kIpPrivacyEnableIppPanelInDevTools; +// A comma-separated list of domains (eTLD+1) for which all requests will be +// proxied. +NET_EXPORT extern const base::FeatureParam + kIpPrivacyUnconditionalProxyDomainList; + // Enables more advanced handling of IP Protection proxy request failures. NET_EXPORT BASE_DECLARE_FEATURE(kEnableIpPrivacyProxyAdvancedFallbackLogic); @@ -615,10 +625,6 @@ NET_EXPORT BASE_DECLARE_FEATURE_PARAM(size_t, kMaxReportBodySizeKB); // but not on WebView (until crbug.com/1430082 has been fixed). NET_EXPORT BASE_DECLARE_FEATURE(kMigrateSessionsOnNetworkChangeV2); -// Enables whether blackhole detector should be disabled during connection -// migration and there is no available network. -NET_EXPORT BASE_DECLARE_FEATURE(kDisableBlackholeOnNoNewNetwork); - #if BUILDFLAG(IS_LINUX) // AddressTrackerLinux will not run inside the network service in this // configuration, which will improve the Linux network service sandbox. @@ -672,6 +678,10 @@ NET_EXPORT BASE_DECLARE_FEATURE(kTruncateBodyToContentLength); // Reduces the frequency of IP address change notifications that result in // TCP and QUIC connection resets. NET_EXPORT BASE_DECLARE_FEATURE(kReduceIPAddressChangeNotification); + +// Uses the Network framework path monitor instead of SCNetworkReachability for +// connection type change detection on macOS. +NET_EXPORT BASE_DECLARE_FEATURE(kUseNetworkPathMonitorForNetworkChangeNotifier); #endif // BUILDFLAG(IS_MAC) // This feature will enable the Device Bound Session Credentials protocol to let @@ -691,23 +701,45 @@ NET_EXPORT BASE_DECLARE_FEATURE(kPersistDeviceBoundSessions); // the exact code we need to test. NET_EXPORT BASE_DECLARE_FEATURE_PARAM( bool, - kDeviceBoundSessionsForceEnableForTesting); + kDeviceBoundSessionsRequireOriginTrialTokens); // This feature enables the Device Bound Session Credentials refresh quota. // This behavior is expected by default; disabling it should only be for // testing purposes. -NET_EXPORT BASE_DECLARE_FEATURE(kDeviceBoundSessionsRefreshQuota); +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, kDeviceBoundSessionsRefreshQuota); +// This feature controls whether DBSC checks the .well-known for subdomain +// registration. +NET_EXPORT BASE_DECLARE_FEATURE_PARAM( + bool, + kDeviceBoundSessionsCheckSubdomainRegistration); +// This feature controls the database schema version for stored sessions. +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(int, kDeviceBoundSessionsSchemaVersion); // This feature will enable breaking changes to Device Bound Session // Credentials from after the Origin Trial started. This is disabled by // default to facilitate implementation of feedback from the Origin // Trial while still being able to get consistent metrics across Chrome // releases. -NET_EXPORT BASE_DECLARE_FEATURE(kDeviceBoundSessionsOriginTrialFeedback); +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, + kDeviceBoundSessionsOriginTrialFeedback); -// When enabled, all proxies in a proxy chain are partitioned by the NAK for the -// endpoint of the connection. When disabled, proxies carrying tunnels to other -// proxies (i.e., all proxies but the last one in the ProxyChain) are not -// partitioned, allowing greater connection re-use. -NET_EXPORT BASE_DECLARE_FEATURE(kPartitionProxyChains); +// This feature controls whether DBSC allows federated sessions. +NET_EXPORT BASE_DECLARE_FEATURE(kDeviceBoundSessionsFederatedRegistration); +// This param controls whether DBSC checks the .well-known for federated +// sessions. +NET_EXPORT BASE_DECLARE_FEATURE_PARAM( + bool, + kDeviceBoundSessionsFederatedRegistrationCheckWellKnown); + +// This feature controls whether to proactively trigger Device +// Bound Session refreshes when a cookie is soon to expire. +NET_EXPORT BASE_DECLARE_FEATURE(kDeviceBoundSessionProactiveRefresh); +// This controls the threshold for proactive refrehshes. +NET_EXPORT BASE_DECLARE_FEATURE_PARAM( + base::TimeDelta, + kDeviceBoundSessionProactiveRefreshThreshold); + +// This feature controls whether DBSC has a signing quota instead of a refresh +// quota, and has associated signing caching for refreshes. +NET_EXPORT BASE_DECLARE_FEATURE(kDeviceBoundSessionSigningQuotaAndCaching); // Enables more checks when creating a SpdySession for proxy. These checks are // already applied to non-proxy SpdySession creations. @@ -715,14 +747,6 @@ NET_EXPORT BASE_DECLARE_FEATURE(kPartitionProxyChains); // not causing any problems. NET_EXPORT BASE_DECLARE_FEATURE(kSpdySessionForProxyAdditionalChecks); -// When this feature is enabled, Chromium can use stored shared dictionaries -// even when the connection is using HTTP/1 for non-localhost requests. -NET_EXPORT BASE_DECLARE_FEATURE(kCompressionDictionaryTransportOverHttp1); - -// When this feature is enabled, Chromium can use stored shared dictionaries -// even when the connection is using HTTP/2 for non-localhost requests. -NET_EXPORT BASE_DECLARE_FEATURE(kCompressionDictionaryTransportOverHttp2); - // When this feature is enabled, Chromium will use stored shared dictionaries // only if the request URL is a localhost URL or the transport layer is using a // certificate rooted at a standard CA root. @@ -761,6 +785,26 @@ NET_EXPORT BASE_DECLARE_FEATURE(kDiskCacheBackendExperiment); NET_EXPORT extern const base::FeatureParam kDiskCacheBackendParam; +#if BUILDFLAG(ENABLE_DISK_CACHE_SQL_BACKEND) +// If the number of pages recorded in the WAL file of the SQL disk cache's DB +// exceeds this value, a checkpoint is executed on committing data. +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(int, + kSqlDiskCacheForceCheckpointThreshold); +// If the number of pages recorded in the WAL file of the SQL disk cache's DB +// exceeds this value and the browser is idle, a checkpoint is executed. +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(int, + kSqlDiskCacheIdleCheckpointThreshold); +// While the memory usage for the buffer doesn't exceed the number of bytes +// specified by this param, the SQL backend executes optimistic writes. +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(int, + kSqlDiskCacheOptimisticWriteBufferSize); +// Disables synchronous writes in the WAL file of the SQL disk cache's DB. +// This is faster but less safe. +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, kSqlDiskCacheSynchronousOff); +// The number of shards for the SQL disk cache. +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(int, kSqlDiskCacheShardCount); +#endif // ENABLE_DISK_CACHE_SQL_BACKEND + // If enabled, ignore Strict-Transport-Security for [*.]localhost hosts. NET_EXPORT BASE_DECLARE_FEATURE(kIgnoreHSTSForLocalhost); @@ -777,11 +821,6 @@ NET_EXPORT extern const base::FeatureParam NET_EXPORT extern const base::FeatureParam kSimpleCachePrioritizedCachingPrioritizationPeriod; -#if BUILDFLAG(USE_NSS_CERTS) -// If enabled, use new implementation of client cert path building. -NET_EXPORT BASE_DECLARE_FEATURE(kNewClientCertPathBuilding); -#endif // BUILDFLAG(USE_NSS_CERTS) - // When enabled HSTS upgrades will only apply to top-level navigations. NET_EXPORT BASE_DECLARE_FEATURE(kHstsTopLevelNavigationsOnly); @@ -796,23 +835,18 @@ NET_EXPORT BASE_DECLARE_FEATURE(kHttpCacheNoVarySearch); NET_EXPORT BASE_DECLARE_FEATURE_PARAM(size_t, kHttpCacheNoVarySearchCacheMaxEntries); -// Whether the NoVarySearchCache should be consulted in -// HttpCache::OnExternalCacheHit(). -NET_EXPORT BASE_DECLARE_FEATURE_PARAM( - bool, - kHttpCacheNoVarySearchApplyToExternalHits); - // Whether persistence is enabled in on-the-record profiles. True by default. NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, kHttpCacheNoVarySearchPersistenceEnabled); -// If true, the persisted files will be created with valid but empty contents at -// startup and after that closed and never used. Has no effect if -// "persistence_enabled" is false. Causes "HttpCache.NoVarySearch.LoadResult" to -// log "SnapshotLoadFailed" as there is no point in adding a new enum value for -// this temporary feature. +// If true, don't erase the NoVarySearchCache entry when simple cache in-memory +// hints indicate that the disk cache entry is not usable. NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, - kHttpCacheNoVarySearchFakePersistence); + kHttpCacheNoVarySearchKeepNotSuitable); + +// Whether to use the new implementation of +// HttpNoVarySearchData::AreEquivalent(). +NET_EXPORT BASE_DECLARE_FEATURE(kHttpNoVarySearchDataUseNewAreEquivalent); // Enables sending the CORS Origin header on the POST request for Reporting API // report uploads. @@ -844,15 +878,6 @@ NET_EXPORT BASE_DECLARE_FEATURE(kSelfSignedLocalNetworkInterstitial); NET_EXPORT BASE_DECLARE_FEATURE(kVerifyQWACs); #endif -#if BUILDFLAG(IS_MAC) -// If enabled, includes deprecated APIs for looking up client certificates on -// macOS. This is disabled by default and is available as an emergency kill -// switch. -// TODO(crbug.com/40233280): This will reach stable in M137 (May 2025). Remove -// this flag sometime after August 2025. -NET_EXPORT BASE_DECLARE_FEATURE(kIncludeDeprecatedClientCertLookup); -#endif - // Finch-controlled list of ports that should be blocked due to ongoing abuse. NET_EXPORT BASE_DECLARE_FEATURE(kRestrictAbusePorts); NET_EXPORT extern const base::FeatureParam @@ -869,19 +894,28 @@ NET_EXPORT BASE_DECLARE_FEATURE(kRestrictAbusePortsOnLocalhost); // trust. NET_EXPORT BASE_DECLARE_FEATURE(kTLSTrustAnchorIDs); -// Whether or not this client is participating in the TCP connection pool size -// experiment, and if so how big their pools should be. +// Indicates if the client is participating in the TCP socket pool limit +// randomization trial. The params below define the bounds for the probability. +// function we use when calculating the chance the state should flip between +// capped and uncapped. // See crbug.com/415691664 for more details. -NET_EXPORT BASE_DECLARE_FEATURE(kTcpConnectionPoolSizeTrial); -NET_EXPORT BASE_DECLARE_FEATURE_PARAM(int, kTcpConnectionPoolSizeTrialNormal); +NET_EXPORT BASE_DECLARE_FEATURE(kTcpSocketPoolLimitRandomization); +// The base of an exponent when calculating the probability. +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(double, + kTcpSocketPoolLimitRandomizationBase); +// The maximum amount of additional sockets to allow use of. NET_EXPORT BASE_DECLARE_FEATURE_PARAM(int, - kTcpConnectionPoolSizeTrialWebSocket); + kTcpSocketPoolLimitRandomizationCapacity); +// The minimum probability allowed to be returned. +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(double, + kTcpSocketPoolLimitRandomizationMinimum); +// The percentage of noise to add/subtract from the probability. +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(double, + kTcpSocketPoolLimitRandomizationNoise); // These parameters control whether the Network Service Task Scheduler is used // for specific classes. NET_EXPORT BASE_DECLARE_FEATURE(kNetTaskScheduler); -NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, - kNetTaskSchedulerHttpCacheTransaction); NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, kNetTaskSchedulerHttpProxyConnectJob); NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, @@ -896,6 +930,62 @@ NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, kNetTaskSchedulerURLRequestJob); NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, kNetTaskSchedulerURLRequestRedirectJob); +NET_EXPORT BASE_DECLARE_FEATURE(kNetTaskScheduler2); +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, kNetTaskSchedulerHttpCache); +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, + kNetTaskSchedulerHttpCacheTransaction); + +// If enabled, we will add an additional delay to the main job in +// HttpStreamFactoryJobController. +NET_EXPORT BASE_DECLARE_FEATURE(kAdditionalDelayMainJob); +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(base::TimeDelta, kAdditionalDelay); +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(bool, + kDelayMainJobWithAvailableSpdySession); + +// If enabled, we will extend the quic handshake timeout. +NET_EXPORT BASE_DECLARE_FEATURE(kExtendQuicHandshakeTimeout); +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(base::TimeDelta, kQuicHandshakeTimeout); +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(base::TimeDelta, + kMaxIdleTimeBeforeCryptoHandshake); + +// If enabled, we will use a longer idle timeout. +NET_EXPORT BASE_DECLARE_FEATURE(kQuicLongerIdleConnectionTimeout); + +// If enabled, we will use QUIC with a smaller MTU. +NET_EXPORT BASE_DECLARE_FEATURE(kLowerQuicMaxPacketSize); +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(size_t, kQuicMaxPacketSize); + +// When enabled, races QUIC connection attempts for the specified hostnames +// even when there is no available ALPN information. +NET_EXPORT BASE_DECLARE_FEATURE(kConfigureQuicHints); +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(std::string, kQuicHintHostPortPairs); +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(std::string, + kWildcardQuicHintHostPortPairs); + +// Enables support for Public Resolver Errors (PRE), based on Version 2 of the +// https://datatracker.ietf.org/doc/draft-nottingham-public-resolver-errors/02/ +// When enabled, clients will attempt to parse structured error information +// from the EXTRA-TEXT field of Extended DNS Errors. +NET_EXPORT BASE_DECLARE_FEATURE(kDnsFilteringDetails); + +// When enabled, the browser checks if a navigation URL is in any navigation +// entry. If so, it sets the +// `IS_MAIN_FRAME_ORIGIN_RECENTLY_ACCESSED` load flag. +// Note that this flag is only set for metric collection. +NET_EXPORT BASE_DECLARE_FEATURE(kUpdateIsMainFrameOriginRecentlyAccessed); +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(size_t, kRecentlyAccessedOriginCacheSize); + +// When enabled, the browser tries QUIC by default. +NET_EXPORT BASE_DECLARE_FEATURE(kTryQuicByDefault); + +// The QUIC connection options which will be sent to the server in order to +// enable certain QUIC features. This should be set using `QuicTag`s (32-bit +// value represented in ASCII equivalent e.g. EXMP). To set multiple features, +// separate the values with a comma (e.g. "ABCD,EFGH"). +NET_EXPORT BASE_DECLARE_FEATURE_PARAM(std::string, kQuicOptions); + +NET_EXPORT BASE_DECLARE_FEATURE(kDnsResponseDiscardPartialQuestions); + } // namespace net::features #endif // NET_BASE_FEATURES_H_ diff --git a/naiveproxy/src/net/base/filename_util.cc b/naiveproxy/src/net/base/filename_util.cc index f16d5dc2f1..772b72b77b 100644 --- a/naiveproxy/src/net/base/filename_util.cc +++ b/naiveproxy/src/net/base/filename_util.cc @@ -70,12 +70,12 @@ bool FileURLToFilePath(const GURL& url, base::FilePath* file_path) { #if BUILDFLAG(IS_WIN) std::string path; - std::string host = url.host(); + std::string host = url.GetHost(); if (host.empty()) { // URL contains no host, the path is the filename. In this case, the path // will probably be preceded with a slash, as in "/C:/foo.txt", so we // trim out that here. - path = url.path(); + path = url.GetPath(); size_t first_non_slash = path.find_first_not_of("/\\"); if (first_non_slash != std::string::npos && first_non_slash > 0) path.erase(0, first_non_slash); @@ -84,7 +84,7 @@ bool FileURLToFilePath(const GURL& url, base::FilePath* file_path) { // on the path. path = "\\\\"; path.append(host); - path.append(url.path()); + path.append(url.GetPath()); } std::replace(path.begin(), path.end(), '/', '\\'); #else // BUILDFLAG(IS_WIN) @@ -92,10 +92,10 @@ bool FileURLToFilePath(const GURL& url, base::FilePath* file_path) { // Usually, remote mounts are still mounted onto the local filesystem. // Therefore, we discard all URLs that are not obviously local to prevent // spoofing attacks using file:// URLs. See crbug.com/881675. - if (!url.host().empty() && !net::IsLocalhost(url)) { + if (!url.GetHost().empty() && !net::IsLocalhost(url)) { return false; } - std::string path = url.path(); + std::string path = url.GetPath(); #endif // !BUILDFLAG(IS_WIN) if (path.empty()) diff --git a/naiveproxy/src/net/base/filename_util_internal.cc b/naiveproxy/src/net/base/filename_util_internal.cc index e0962b5f3f..54f29d6e83 100644 --- a/naiveproxy/src/net/base/filename_util_internal.cc +++ b/naiveproxy/src/net/base/filename_util_internal.cc @@ -257,9 +257,9 @@ std::u16string GetSuggestedFilenameImpl( // |default_name|. Some schemes (e.g.: file:, about:, data:) do not have a // host name. if (filename.empty() && default_name.empty() && url.is_valid() && - !url.host().empty()) { + !url.GetHost().empty()) { // TODO(jungshik) : Decode a 'punycoded' IDN hostname. (bug 1264451) - filename = url.host(); + filename = url.GetHost(); } bool replace_trailing = false; diff --git a/naiveproxy/src/net/base/host_port_pair.cc b/naiveproxy/src/net/base/host_port_pair.cc index 1103287fc3..d5e879169b 100644 --- a/naiveproxy/src/net/base/host_port_pair.cc +++ b/naiveproxy/src/net/base/host_port_pair.cc @@ -31,12 +31,19 @@ constexpr std::string_view kValuePortKey = "port"; } // namespace HostPortPair::HostPortPair() : port_(0) {} + HostPortPair::HostPortPair(std::string_view in_host, uint16_t in_port) : port_(in_port), host_(in_host) {} +HostPortPair::HostPortPair(const char* in_host, uint16_t in_port) + : HostPortPair(std::string_view(in_host), in_port) {} + +HostPortPair::HostPortPair(std::string&& in_host, uint16_t in_port) + : port_(in_port), host_(std::move(in_host)) {} + // static HostPortPair HostPortPair::FromURL(const GURL& url) { - return HostPortPair(url.HostNoBrackets(), + return HostPortPair(url.HostNoBracketsPiece(), static_cast(url.EffectiveIntPort())); } diff --git a/naiveproxy/src/net/base/host_port_pair.h b/naiveproxy/src/net/base/host_port_pair.h index 2e26f5ac2e..f6ce27b5f8 100644 --- a/naiveproxy/src/net/base/host_port_pair.h +++ b/naiveproxy/src/net/base/host_port_pair.h @@ -30,6 +30,8 @@ class NET_EXPORT HostPortPair { HostPortPair(); // If |in_host| represents an IPv6 address, it should not bracket the address. HostPortPair(std::string_view in_host, uint16_t in_port); + HostPortPair(const char* in_host, uint16_t in_port); + HostPortPair(std::string&& in_host, uint16_t in_port); // Creates a HostPortPair for the origin of |url|. static HostPortPair FromURL(const GURL& url); @@ -60,9 +62,7 @@ class NET_EXPORT HostPortPair { uint16_t port() const { return port_; } - void set_host(const std::string& in_host) { - host_ = in_host; - } + void set_host(std::string_view in_host) { host_ = in_host; } void set_port(uint16_t in_port) { port_ = in_port; } diff --git a/naiveproxy/src/net/base/ip_address.cc b/naiveproxy/src/net/base/ip_address.cc index b8b2fbd7fd..00bbdcc778 100644 --- a/naiveproxy/src/net/base/ip_address.cc +++ b/naiveproxy/src/net/base/ip_address.cc @@ -334,9 +334,9 @@ std::string IPAddress::ToString() const { url::StdStringCanonOutput output(&str); if (IsIPv4()) { - url::AppendIPv4Address(ip_address_.span().data(), &output); + url::AppendIPv4Address(ip_address_.span(), &output); } else if (IsIPv6()) { - url::AppendIPv6Address(ip_address_.span().data(), &output); + url::AppendIPv6Address(ip_address_.span(), &output); } output.Complete(); diff --git a/naiveproxy/src/net/base/ip_address.h b/naiveproxy/src/net/base/ip_address.h index 153bafc223..0bf2ffc579 100644 --- a/naiveproxy/src/net/base/ip_address.h +++ b/naiveproxy/src/net/base/ip_address.h @@ -139,20 +139,17 @@ constexpr bool ParseIPLiteralToBytes(std::string_view ip_literal, host_with_brackets.push_back('['); host_with_brackets.append(ip_literal); host_with_brackets.push_back(']'); - url::Component host_comp(0, static_cast(host_with_brackets.size())); // Try parsing the hostname as an IPv6 literal. bytes->Resize(16); // 128 bits. - return url::IPv6AddressToNumber(host_with_brackets.data(), host_comp, - bytes->data()); + return url::IPv6AddressToNumber(host_with_brackets, bytes->span()); } // Otherwise the string is an IPv4 address. bytes->Resize(4); // 32 bits. - url::Component host_comp(0, static_cast(ip_literal.size())); int num_components; - url::CanonHostInfo::Family family = url::IPv4AddressToNumber( - ip_literal.data(), host_comp, bytes->data(), &num_components); + url::CanonHostInfo::Family family = + url::IPv4AddressToNumber(ip_literal, bytes->span(), &num_components); return family == url::CanonHostInfo::IPV4; } diff --git a/naiveproxy/src/net/base/ip_endpoint.cc b/naiveproxy/src/net/base/ip_endpoint.cc index 9396da7226..e6f265d0e2 100644 --- a/naiveproxy/src/net/base/ip_endpoint.cc +++ b/naiveproxy/src/net/base/ip_endpoint.cc @@ -89,7 +89,8 @@ base::Value IPEndPoint::ScopeIdToValue(std::optional scope_id) { char* name = nullptr; char buf[IF_NAMESIZE + 1] = {0}; if (index_to_name_func_for_testing_) { - name = index_to_name_func_for_testing_(scope_id.value(), buf); + name = index_to_name_func_for_testing_(scope_id.value(), + base::span(buf)); } else { name = if_indextoname(scope_id.value(), buf); } diff --git a/naiveproxy/src/net/base/ip_endpoint.h b/naiveproxy/src/net/base/ip_endpoint.h index 6ea6c3e63c..54031a8a75 100644 --- a/naiveproxy/src/net/base/ip_endpoint.h +++ b/naiveproxy/src/net/base/ip_endpoint.h @@ -11,6 +11,7 @@ #include #include +#include "base/containers/span.h" #include "base/values.h" #include "build/build_config.h" #include "net/base/address_family.h" @@ -41,7 +42,7 @@ class NET_EXPORT IPEndPoint { public: // Function signatures of if_nametoindex() and if_indextoname(). using NameToIndexFunc = uint32_t (*)(const char*); - using IndexToNameFunc = char* (*)(unsigned int, char*); + using IndexToNameFunc = char* (*)(unsigned int, base::span); // Set fake if_nametoindex() and if_indextoname() functions for testing. static void SetNameToIndexFuncForTesting(NameToIndexFunc func); diff --git a/naiveproxy/src/net/base/isolation_info.cc b/naiveproxy/src/net/base/isolation_info.cc index dbfa295add..aaf00cefe4 100644 --- a/naiveproxy/src/net/base/isolation_info.cc +++ b/naiveproxy/src/net/base/isolation_info.cc @@ -16,6 +16,7 @@ #include "net/base/network_isolation_partition.h" #include "net/base/proxy_server.h" #include "net/base/url_util.h" +#include "url/gurl.h" namespace net { diff --git a/naiveproxy/src/net/base/load_flags_list.h b/naiveproxy/src/net/base/load_flags_list.h index aeb79b46f5..c10df92f30 100644 --- a/naiveproxy/src/net/base/load_flags_list.h +++ b/naiveproxy/src/net/base/load_flags_list.h @@ -14,6 +14,10 @@ // Here we define the values using a macro LOAD_FLAG, so it can be // expanded differently in some places (for example, to automatically // map a load flag value to its symbolic name). +// +// Load flags can be provided by potentially compromised renderer processes. +// If adding new behavior that does not need to be triggered by a renderer, +// please prefer not to add a LoadFlag. LOAD_FLAG(NORMAL, 0) @@ -79,10 +83,6 @@ LOAD_FLAG(DO_NOT_USE_EMBEDDED_IDENTITY, 1 << 11) // QUIC connection migration is enabled. LOAD_FLAG(DISABLE_CONNECTION_MIGRATION_TO_CELLULAR, 1 << 12) -// Indicates that the cache should not check that the request matches the -// response's vary header. -LOAD_FLAG(SKIP_VARY_CHECK, 1 << 13) - // The creator of this URLRequest wishes to receive stale responses when allowed // by the "Cache-Control: stale-while-revalidate" directive and is able to issue // an async revalidation to update the cache. If the callee needs to revalidate @@ -91,27 +91,36 @@ LOAD_FLAG(SKIP_VARY_CHECK, 1 << 13) // resource by issuing a new request without this flag set. If the revalidation // does not complete in 60 seconds, the cache treat the stale resource as // invalid, as it did not specify stale-while-revalidate. -LOAD_FLAG(SUPPORT_ASYNC_REVALIDATION, 1 << 14) +LOAD_FLAG(SUPPORT_ASYNC_REVALIDATION, 1 << 13) // Indicates that a prefetch request's cached response should be restricted in // in terms of reuse. The cached response can only be reused by requests with // the LOAD_CAN_USE_RESTRICTED_PREFETCH_FOR_MAIN_FRAME load flag. -LOAD_FLAG(RESTRICTED_PREFETCH_FOR_MAIN_FRAME, 1 << 15) +LOAD_FLAG(RESTRICTED_PREFETCH_FOR_MAIN_FRAME, 1 << 14) // This flag must be set on requests that are allowed to reuse cache entries // that are marked as RESTRICTED_PREFETCH_FOR_MAIN_FRAME. Requests without this // flag cannot reuse restricted prefetch responses in the cache. Restricted // response reuse is considered privileged, and therefore this flag must only be // set from a trusted process. -LOAD_FLAG(CAN_USE_RESTRICTED_PREFETCH_FOR_MAIN_FRAME, 1 << 16) +LOAD_FLAG(CAN_USE_RESTRICTED_PREFETCH_FOR_MAIN_FRAME, 1 << 15) // Indicates that this load can use a shared dictionary. -LOAD_FLAG(CAN_USE_SHARED_DICTIONARY, 1 << 17) +LOAD_FLAG(CAN_USE_SHARED_DICTIONARY, 1 << 16) // Indicates that CAN_USE_SHARED_DICTIONARY must be disabled after a redirect to // another origin. -LOAD_FLAG(DISABLE_SHARED_DICTIONARY_AFTER_CROSS_ORIGIN_REDIRECT, 1 << 18) +LOAD_FLAG(DISABLE_SHARED_DICTIONARY_AFTER_CROSS_ORIGIN_REDIRECT, 1 << 17) // This flag is used to bypass HSTS upgrades. This flag must be set for AIA, // CRL, and OCSP requests in order to prevent circular dependencies. -LOAD_FLAG(SHOULD_BYPASS_HSTS, 1 << 19) +LOAD_FLAG(SHOULD_BYPASS_HSTS, 1 << 18) + +// Indicates that this request is loading resource from a page whose main +// frame's origin is accessible from some navigation entry. +// For now we use this flag to record some additional metrics from +// net/http/http_cache_transaction.cc, it will be cleaned up after that so the +// compromised renderer concern is acceptable. +LOAD_FLAG(IS_MAIN_FRAME_ORIGIN_RECENTLY_ACCESSED, 1 << 19) + +// See note at top of file about why adding LoadFlags is often a bad idea. diff --git a/naiveproxy/src/net/base/load_flags_to_string.h b/naiveproxy/src/net/base/load_flags_to_string.h index 713f6a4bd4..ee2b05a0ec 100644 --- a/naiveproxy/src/net/base/load_flags_to_string.h +++ b/naiveproxy/src/net/base/load_flags_to_string.h @@ -12,7 +12,7 @@ namespace net { // Convert `load_flags` to a string of the form "LOAD_ONLY_FROM_CACHE | -// LOAD_SKIP_VARY_CHECK". +// LOAD_PREFETCH". NET_EXPORT_PRIVATE std::string LoadFlagsToString(int load_flags); } // namespace net diff --git a/naiveproxy/src/net/base/load_timing_internal_info.h b/naiveproxy/src/net/base/load_timing_internal_info.h index 5de761386d..051b1aa416 100644 --- a/naiveproxy/src/net/base/load_timing_internal_info.h +++ b/naiveproxy/src/net/base/load_timing_internal_info.h @@ -7,11 +7,27 @@ #include +#include + #include "base/time/time.h" #include "net/base/net_export.h" +#include "net/http/alternate_protocol_usage.h" namespace net { +// Indicates whether a request used an existing H2/H3 session or not. +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +// LINT.IfChange(SessionSource) +enum class SessionSource { + // Used a newly established session. + kNew = 0, + // Used an existing session. + kExisting = 1, + kMaxValue = kExisting, +}; +// LINT.ThenChange(//tools/metrics/histograms/metadata/enums.xml:NetworkSessionSource) + // Structure containing internal load timing information. This is similar to // LoadTimingInfo, but contains extra information which shouldn't be exposed to // the web. We use this structure for internal measurements. @@ -30,6 +46,16 @@ struct NET_EXPORT LoadTimingInternalInfo { // The time taken for HTTP stream initialization to finish if the // initialization was blocked. base::TimeDelta initialize_stream_delay; + + // Indicates whether the request used an existing H2/H3 session or not. + std::optional session_source; + + // State of the advertised alternative service. + AdvertisedAltSvcState advertised_alt_svc_state = + AdvertisedAltSvcState::kUnknown; + + // Whether QUIC is enabled. + bool http_network_session_quic_enabled = false; }; } // namespace net diff --git a/naiveproxy/src/net/base/logging_network_change_observer.cc b/naiveproxy/src/net/base/logging_network_change_observer.cc index 5e6b4bde7e..8b25522411 100644 --- a/naiveproxy/src/net/base/logging_network_change_observer.cc +++ b/naiveproxy/src/net/base/logging_network_change_observer.cc @@ -76,8 +76,10 @@ LoggingNetworkChangeObserver::~LoggingNetworkChangeObserver() { NetworkChangeNotifier::RemoveNetworkObserver(this); } -void LoggingNetworkChangeObserver::OnIPAddressChanged() { - VLOG(1) << "Observed a change to the network IP addresses"; +void LoggingNetworkChangeObserver::OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) { + VLOG(1) << "Observed a change to the network IP addresses " + << NetworkChangeNotifier::IPAddressChangeTypeToString(change_type); net_log_.AddEvent(NetLogEventType::NETWORK_IP_ADDRESSES_CHANGED); } diff --git a/naiveproxy/src/net/base/logging_network_change_observer.h b/naiveproxy/src/net/base/logging_network_change_observer.h index c9abce6913..3e7dc3363c 100644 --- a/naiveproxy/src/net/base/logging_network_change_observer.h +++ b/naiveproxy/src/net/base/logging_network_change_observer.h @@ -33,7 +33,8 @@ class NET_EXPORT LoggingNetworkChangeObserver private: // NetworkChangeNotifier::IPAddressObserver implementation. - void OnIPAddressChanged() override; + void OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) override; // NetworkChangeNotifier::ConnectionTypeObserver implementation. void OnConnectionTypeChanged( diff --git a/naiveproxy/src/net/base/mime_sniffer.cc b/naiveproxy/src/net/base/mime_sniffer.cc index db379c9a2f..e746623e63 100644 --- a/naiveproxy/src/net/base/mime_sniffer.cc +++ b/naiveproxy/src/net/base/mime_sniffer.cc @@ -404,7 +404,7 @@ static bool SniffForOfficeDocs(std::string_view content, return false; OfficeDocType type = DOC_TYPE_NONE; - std::string_view url_path = url.path_piece(); + std::string_view url_path = url.path(); for (const auto& office_extension : kOfficeExtensionTypes) { if (base::EndsWith(url_path, office_extension.extension, base::CompareCase::INSENSITIVE_ASCII)) { @@ -645,7 +645,7 @@ static bool SniffCRX(std::string_view content, MAGIC_NUMBER("application/x-chrome-extension", "Cr24\x03\x00\x00\x00")}; // Only consider files that have the extension ".crx". - if (!url.path_piece().ends_with(".crx")) { + if (!url.path().ends_with(".crx")) { return false; } diff --git a/naiveproxy/src/net/base/mime_util.cc b/naiveproxy/src/net/base/mime_util.cc index 0347fffd0e..b6bcd7fdce 100644 --- a/naiveproxy/src/net/base/mime_util.cc +++ b/naiveproxy/src/net/base/mime_util.cc @@ -71,7 +71,7 @@ class MimeUtil : public PlatformMimeUtil { bool MatchesMimeType(std::string_view mime_type_pattern, std::string_view mime_type, - bool validate_mime_type) const; + MimeTypeValidationLevel level) const; bool ParseMimeTypeWithoutParameter(std::string_view type_string, std::string* top_level_type, @@ -183,7 +183,7 @@ static const MimeInfo kPrimaryMappings[] = { {"audio/x-m4a", "m4a"}, {"image/avif", "avif"}, {"image/gif", "gif"}, - {"image/jpeg", "jpeg,jpg"}, + {"image/jpeg", "jpeg,jpg,jpe"}, {"image/png", "png"}, {"image/apng", "png,apng"}, {"image/svg+xml", "svg,svgz"}, @@ -254,7 +254,7 @@ static const MimeInfo kSecondaryMappings[] = { {"text/vtt", "vtt"}, {"text/x-sh", "sh"}, {"text/xml", "xsl,xbl,xslt"}, - {"video/mpeg", "mpeg,mpg"}, + {"video/mpeg", "mpeg,mpg,mpe"}, }; // Finds mime type of |ext| from |mappings|. @@ -457,7 +457,7 @@ bool MatchesMimeTypeParameters(std::string_view mime_type_pattern, // in the tested type for a match to succeed. bool MimeUtil::MatchesMimeType(std::string_view mime_type_pattern, std::string_view mime_type, - bool validate_mime_type) const { + MimeTypeValidationLevel level) const { if (mime_type_pattern.empty()) return false; @@ -466,12 +466,18 @@ bool MimeUtil::MatchesMimeType(std::string_view mime_type_pattern, semicolon = mime_type.find(';'); const std::string_view base_type = mime_type.substr(0, semicolon); - // If validation is enabled and pattern contains wildcards, validate that - // the MIME type being matched has exactly one slash in the type/subtype - // portion. - if (validate_mime_type && base_pattern.find('*') != std::string::npos) { - if (std::ranges::count(base_type, '/') != 1u) { - return false; + if (level != MimeTypeValidationLevel::kNone && + base_pattern.find('*') != std::string::npos) { + if (level == MimeTypeValidationLevel::kWildcardSlashAndTokens) { + auto parts = base::SplitStringOnce(base_type, '/'); + if (!parts || !HttpUtil::IsToken(parts->first) || + !HttpUtil::IsToken(parts->second)) { + return false; + } + } else { // kWildcardSlashOnly + if (std::ranges::count(base_type, '/') != 1u) { + return false; + } } } @@ -686,9 +692,9 @@ bool GetPreferredExtensionForMimeType(std::string_view mime_type, bool MatchesMimeType(std::string_view mime_type_pattern, std::string_view mime_type, - bool validate_mime_type) { + MimeTypeValidationLevel validation_level) { return MimeUtil::Get().MatchesMimeType(mime_type_pattern, mime_type, - validate_mime_type); + validation_level); } bool ParseMimeTypeWithoutParameter(std::string_view type_string, diff --git a/naiveproxy/src/net/base/mime_util.h b/naiveproxy/src/net/base/mime_util.h index 669e66dc8b..33b1040b67 100644 --- a/naiveproxy/src/net/base/mime_util.h +++ b/naiveproxy/src/net/base/mime_util.h @@ -62,14 +62,24 @@ NET_EXPORT bool GetPreferredExtensionForMimeType( std::string_view mime_type, base::FilePath::StringType* extension); +// kNone: no extra checks. +// kWildcardSlashOnly: require exactly one '/' in the type/subtype. +// kWildcardSlashAndTokens: above + require type and subtype are HTTP tokens +// when the wildcard targets a structured suffix (e.g. *+json). +enum class MimeTypeValidationLevel { + kNone = 0, + kWildcardSlashOnly = 1, + kWildcardSlashAndTokens = 2, +}; + // Returns true if this the mime_type_pattern matches a given mime-type. // Checks for absolute matching and wildcards. MIME types are case insensitive. -// If `validate_mime_type` is true, MIME types in patterns containing wildcards -// are validated to ensure they have exactly one slash in the type/subtype -// portion (before any parameters). -NET_EXPORT bool MatchesMimeType(std::string_view mime_type_pattern, - std::string_view mime_type, - bool validate_mime_type = false); +// When the pattern contains a wildcard, `validation_level` can enforce +// slash/token rules. +NET_EXPORT bool MatchesMimeType( + std::string_view mime_type_pattern, + std::string_view mime_type, + MimeTypeValidationLevel validation_level = MimeTypeValidationLevel::kNone); // Parses |type_str| for |mime_type| and any |params|. Returns false if mime // cannot be parsed, and does not modify |mime_type| or |params|. diff --git a/naiveproxy/src/net/base/mock_proxy_delegate.cc b/naiveproxy/src/net/base/mock_proxy_delegate.cc new file mode 100644 index 0000000000..2b24810399 --- /dev/null +++ b/naiveproxy/src/net/base/mock_proxy_delegate.cc @@ -0,0 +1,13 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/base/mock_proxy_delegate.h" + +namespace net { + +MockProxyDelegate::MockProxyDelegate() = default; + +MockProxyDelegate::~MockProxyDelegate() = default; + +} // namespace net diff --git a/naiveproxy/src/net/base/mock_proxy_delegate.h b/naiveproxy/src/net/base/mock_proxy_delegate.h new file mode 100644 index 0000000000..11e1641971 --- /dev/null +++ b/naiveproxy/src/net/base/mock_proxy_delegate.h @@ -0,0 +1,81 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_BASE_MOCK_PROXY_DELEGATE_H_ +#define NET_BASE_MOCK_PROXY_DELEGATE_H_ + +#include + +#include "base/types/expected.h" +#include "net/base/completion_once_callback.h" +#include "net/base/net_errors.h" +#include "net/base/net_export.h" +#include "net/base/network_anonymization_key.h" +#include "net/base/proxy_chain.h" +#include "net/base/proxy_delegate.h" +#include "net/http/http_request_headers.h" +#include "net/proxy_resolution/proxy_retry_info.h" +#include "testing/gmock/include/gmock/gmock.h" + +class GURL; + +namespace net { + +class HttpRequestHeaders; +class HttpResponseHeaders; +class ProxyInfo; +class ProxyResolutionService; + +class MockProxyDelegate : public ProxyDelegate { + public: + MockProxyDelegate(); + ~MockProxyDelegate() override; + MOCK_METHOD(void, + OnResolveProxy, + (const GURL& url, + const NetworkAnonymizationKey& network_anonymization_key, + const std::string& method, + const ProxyRetryInfoMap& proxy_retry_info, + ProxyInfo* result), + (override)); + MOCK_METHOD(std::optional, + CanFalloverToNextProxyOverride, + (const ProxyChain& proxy_chain, int net_error), + (override)); + MOCK_METHOD(void, + OnFallback, + (const ProxyChain& bad_chain, int net_error), + (override)); + MOCK_METHOD(void, + OnSuccessfulRequestAfterFailures, + (const ProxyRetryInfoMap& proxy_retry_info), + (override)); + MOCK_METHOD((base::expected), + OnBeforeTunnelRequest, + (const ProxyChain& proxy_chain, + size_t proxy_index, + OnBeforeTunnelRequestCallback callback), + (override)); + MOCK_METHOD(Error, + OnTunnelHeadersReceived, + (const ProxyChain& proxy_chain, + size_t proxy_index, + const HttpResponseHeaders& response_headers, + CompletionOnceCallback callback), + (override)); + MOCK_METHOD(void, + SetProxyResolutionService, + (ProxyResolutionService * proxy_resolution_service), + (override)); + MOCK_METHOD(bool, + AliasRequiresProxyOverride, + (const std::string scheme, + const std::vector& dns_aliases, + const net::NetworkAnonymizationKey& network_anonymization_key), + (override)); +}; + +} // namespace net + +#endif // NET_BASE_MOCK_PROXY_DELEGATE_H_ diff --git a/naiveproxy/src/net/base/net_error_list.h b/naiveproxy/src/net/base/net_error_list.h index e9840288ec..6213af342d 100644 --- a/naiveproxy/src/net/base/net_error_list.h +++ b/naiveproxy/src/net/base/net_error_list.h @@ -23,6 +23,8 @@ // 800-899 DNS resolver errors // 900-999 Blob errors +// LINT.IfChange + // An asynchronous IO operation is not yet complete. This usually does not // indicate a fatal error. Typically this error will be generated as a // notification to wait for some external notification that the IO operation @@ -462,6 +464,15 @@ NET_ERROR(ECH_FALLBACK_CERTIFICATE_INVALID, -184) // proxy to be marked as bad. NET_ERROR(PROXY_UNABLE_TO_CONNECT_TO_DESTINATION, -186) +// Some implementations of ProxyDelegate query a separate entity to know whether +// it should cancel tunnel prior to: +// - The HTTP CONNECT requests being sent out +// - The HTTP CONNECT response being parsed by //net +// An example is CronetProxyDelegate: Cronet allows developers to decide whether +// the tunnel being established should be canceled. +NET_ERROR(PROXY_DELEGATE_CANCELED_CONNECT_REQUEST, -187) +NET_ERROR(PROXY_DELEGATE_CANCELED_CONNECT_RESPONSE, -188) + // Certificate error codes // // The values of certificate error codes must be consecutive. @@ -845,11 +856,10 @@ NET_ERROR(INCONSISTENT_IP_ADDRESS_SPACE, -383) // The IP address space of the cached remote endpoint is blocked by private // network access check. -NET_ERROR(CACHED_IP_ADDRESS_SPACE_BLOCKED_BY_PRIVATE_NETWORK_ACCESS_POLICY, - -384) +NET_ERROR(CACHED_IP_ADDRESS_SPACE_BLOCKED_BY_LOCAL_NETWORK_ACCESS_POLICY, -384) // The connection is blocked by private network access checks. -NET_ERROR(BLOCKED_BY_PRIVATE_NETWORK_ACCESS_CHECKS, -385) +NET_ERROR(BLOCKED_BY_LOCAL_NETWORK_ACCESS_CHECKS, -385) // Content decoding failed due to the zstd window size being too big (over 8MB). NET_ERROR(ZSTD_WINDOW_SIZE_TOO_BIG, -386) @@ -1055,6 +1065,10 @@ NET_ERROR(DNS_NO_MATCHING_SUPPORTED_ALPN, -811) // requested probe record either had no answer or was invalid. NET_ERROR(DNS_SECURE_PROBE_RECORD_INVALID, -814) +// Returned when DNS cache invalidation is in progress. This is a +// transient error. Callers may want to retry later. +NET_ERROR(DNS_CACHE_INVALIDATION_IN_PROGRESS, -815) + // The following errors are for mapped from a subset of invalid // storage::BlobStatus. @@ -1086,3 +1100,8 @@ NET_ERROR(BLOB_REFERENCED_FILE_UNAVAILABLE, -906) // CAUTION: Before adding errors here, please check the ranges of errors written // in the top of this file. + +// LINT.ThenChange( +// //tools/metrics/histograms/enums.xml:HTTPResponseAndNetErrorCodes, +// //tools/metrics/histograms/enums.xml:NetErrorCodes, +// ) diff --git a/naiveproxy/src/net/base/network_change_notifier.cc b/naiveproxy/src/net/base/network_change_notifier.cc index 854171a43c..3e57896f3e 100644 --- a/naiveproxy/src/net/base/network_change_notifier.cc +++ b/naiveproxy/src/net/base/network_change_notifier.cc @@ -122,7 +122,7 @@ class NetworkChangeNotifier::NetworkChangeCalculator } // NetworkChangeNotifier::IPAddressObserver implementation. - void OnIPAddressChanged() override { + void OnIPAddressChanged(IPAddressChangeType change_type) override { DCHECK(thread_checker_.CalledOnValidThread()); pending_connection_type_ = GetConnectionType(); base::TimeDelta delay = last_announced_connection_type_ == CONNECTION_NONE @@ -521,6 +521,22 @@ base::cstring_view NetworkChangeNotifier::ConnectionTypeToString( return kConnectionTypeNames[type]; } +// static +base::cstring_view NetworkChangeNotifier::IPAddressChangeTypeToString( + IPAddressChangeType type) { + static constexpr auto kChangeTypeNames = std::to_array({ + "IP_ADDRESS_CHANGE_NONE", + "IP_ADDRESS_CHANGE_NORMAL", + "IP_ADDRESS_CHANGE_IPV6_TEMPADDR", + }); + static_assert(std::size(kChangeTypeNames) == IP_ADDRESS_CHANGE_LAST + 1, + "IPAddressChangeType name count should match"); + if (type < IP_ADDRESS_CHANGE_NONE || type > IP_ADDRESS_CHANGE_LAST) { + NOTREACHED(); + } + return kChangeTypeNames[type]; +} + #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) // static AddressMapOwnerLinux* NetworkChangeNotifier::GetAddressMapOwner() { @@ -788,9 +804,11 @@ void NetworkChangeNotifier::TriggerNonSystemDnsChange() { } // static -void NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests() { +void NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests( + IPAddressChangeType change_type) { if (g_network_change_notifier) - g_network_change_notifier->NotifyObserversOfIPAddressChangeImpl(); + g_network_change_notifier->NotifyObserversOfIPAddressChangeImpl( + change_type); } // static @@ -939,10 +957,12 @@ bool NetworkChangeNotifier::IsDefaultNetworkActiveInternal() { } // static -void NetworkChangeNotifier::NotifyObserversOfIPAddressChange() { +void NetworkChangeNotifier::NotifyObserversOfIPAddressChange( + IPAddressChangeType change_type) { if (g_network_change_notifier && !NetworkChangeNotifier::test_notifications_only_) { - g_network_change_notifier->NotifyObserversOfIPAddressChangeImpl(); + g_network_change_notifier->NotifyObserversOfIPAddressChangeImpl( + change_type); } } @@ -1021,10 +1041,11 @@ void NetworkChangeNotifier::StopSystemDnsConfigNotifier() { system_dns_config_notifier_ = nullptr; } -void NetworkChangeNotifier::NotifyObserversOfIPAddressChangeImpl() { +void NetworkChangeNotifier::NotifyObserversOfIPAddressChangeImpl( + IPAddressChangeType change_type) { TRACE_EVENT_INSTANT("net", "NetworkChangeNotifier::IPAddressChange", track_); GetObserverList().ip_address_observer_list_->Notify( - FROM_HERE, &IPAddressObserver::OnIPAddressChanged); + FROM_HERE, &IPAddressObserver::OnIPAddressChanged, change_type); } void NetworkChangeNotifier::NotifyObserversOfConnectionTypeChangeImpl( diff --git a/naiveproxy/src/net/base/network_change_notifier.h b/naiveproxy/src/net/base/network_change_notifier.h index 8801c263de..f95b8240f9 100644 --- a/naiveproxy/src/net/base/network_change_notifier.h +++ b/naiveproxy/src/net/base/network_change_notifier.h @@ -123,6 +123,13 @@ class NET_EXPORT NetworkChangeNotifier { CONNECTION_COST_LAST }; + enum IPAddressChangeType { + IP_ADDRESS_CHANGE_NONE = 0, + IP_ADDRESS_CHANGE_NORMAL, + IP_ADDRESS_CHANGE_IPV6_TEMPADDR, + IP_ADDRESS_CHANGE_LAST = IP_ADDRESS_CHANGE_IPV6_TEMPADDR + }; + // DEPRECATED. Please use NetworkChangeObserver instead. crbug.com/754695. class NET_EXPORT IPAddressObserver { public: @@ -131,7 +138,7 @@ class NET_EXPORT NetworkChangeNotifier { // Will be called when the IP address of the primary interface changes. // This includes when the primary interface itself changes. - virtual void OnIPAddressChanged() = 0; + virtual void OnIPAddressChanged(IPAddressChangeType change_type) = 0; protected: IPAddressObserver(); @@ -537,7 +544,8 @@ class NET_EXPORT NetworkChangeNotifier { static void TriggerNonSystemDnsChange(); // Allows unit tests to trigger notifications. - static void NotifyObserversOfIPAddressChangeForTests(); + static void NotifyObserversOfIPAddressChangeForTests( + IPAddressChangeType = IP_ADDRESS_CHANGE_NORMAL); static void NotifyObserversOfConnectionTypeChangeForTests( ConnectionType type); static void NotifyObserversOfDNSChangeForTests(); @@ -561,6 +569,10 @@ class NET_EXPORT NetworkChangeNotifier { // Returns a string equivalent to |type|. static base::cstring_view ConnectionTypeToString(ConnectionType type); + // Returns a string equivalent to |type|. + static base::cstring_view IPAddressChangeTypeToString( + IPAddressChangeType type); + // Allows a second NetworkChangeNotifier to be created for unit testing, so // the test suite can create a MockNetworkChangeNotifier, but platform // specific NetworkChangeNotifiers can also be created for testing. To use, @@ -654,7 +666,8 @@ class NET_EXPORT NetworkChangeNotifier { // Broadcasts a notification to all registered observers. Note that this // happens asynchronously, even for observers on the current thread, even in // tests. - static void NotifyObserversOfIPAddressChange(); + static void NotifyObserversOfIPAddressChange( + IPAddressChangeType change_type = IP_ADDRESS_CHANGE_NORMAL); static void NotifyObserversOfConnectionTypeChange(); static void NotifyObserversOfDNSChange(); static void NotifyObserversOfNetworkChange(ConnectionType type); @@ -697,7 +710,7 @@ class NET_EXPORT NetworkChangeNotifier { static ObserverList& GetObserverList(); - void NotifyObserversOfIPAddressChangeImpl(); + void NotifyObserversOfIPAddressChangeImpl(IPAddressChangeType change_type); void NotifyObserversOfConnectionTypeChangeImpl(ConnectionType type); void NotifyObserversOfDNSChangeImpl(); void NotifyObserversOfNetworkChangeImpl(ConnectionType type); diff --git a/naiveproxy/src/net/base/network_change_notifier_apple.h b/naiveproxy/src/net/base/network_change_notifier_apple.h index 6f68837c25..ebf7138076 100644 --- a/naiveproxy/src/net/base/network_change_notifier_apple.h +++ b/naiveproxy/src/net/base/network_change_notifier_apple.h @@ -60,6 +60,9 @@ class NET_EXPORT_PRIVATE NetworkChangeNotifierApple private: friend class NetworkChangeNotifierAppleTest; +#if BUILDFLAG(IS_MAC) + friend class NetworkChangeNotifierApplePathMonitorTest; +#endif // Called on the main thread on startup, afterwards on the notifier thread. static ConnectionType CalculateConnectionType(SCNetworkConnectionFlags flags); @@ -80,6 +83,14 @@ class NET_EXPORT_PRIVATE NetworkChangeNotifierApple static NetworkChangeCalculatorParams NetworkChangeCalculatorParamsMac(); #if BUILDFLAG(IS_MAC) + struct NetworkPathMonitorStorage; + + bool ShouldUseNetworkPathMonitor() const; + bool EnsureNetworkPathMonitorStarted(); + void StopNetworkPathMonitor(); + void OnNetworkPathConnectionTypeChanged(ConnectionType new_type); + void ProcessConnectionTypeUpdate(ConnectionType new_type, bool should_notify); + void SetCallbacksForTest( base::OnceClosure initialized_callback, base::RepeatingCallback @@ -104,6 +115,7 @@ class NET_EXPORT_PRIVATE NetworkChangeNotifierApple #if BUILDFLAG(IS_MAC) const bool reduce_ip_address_change_notification_; + std::unique_ptr network_path_monitor_; base::apple::ScopedCFTypeRef store_; std::optional interfaces_for_network_change_check_; std::string ipv4_primary_interface_name_; diff --git a/naiveproxy/src/net/base/network_change_notifier_apple.mm b/naiveproxy/src/net/base/network_change_notifier_apple.mm index 3ea4f976fe..8c60e1af74 100644 --- a/naiveproxy/src/net/base/network_change_notifier_apple.mm +++ b/naiveproxy/src/net/base/network_change_notifier_apple.mm @@ -26,11 +26,31 @@ #include "net/dns/dns_config_service.h" #include "net/log/net_log.h" +#if BUILDFLAG(IS_MAC) +#include +#include +#endif + #if BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_IOS_TVOS) #import #endif namespace net { + +#if BUILDFLAG(IS_MAC) +struct NetworkChangeNotifierApple::NetworkPathMonitorStorage { + NetworkPathMonitorStorage() = default; + ~NetworkPathMonitorStorage() { + if (monitor) { + nw_path_monitor_cancel(monitor); + } + } + + nw_path_monitor_t __strong monitor; + dispatch_queue_t __strong queue; +}; +#endif // BUILDFLAG(IS_MAC) + namespace { // The maximum number of seconds to wait for the connection type to be // determined. @@ -173,6 +193,9 @@ NetworkChangeNotifierApple::NetworkChangeNotifierApple() } NetworkChangeNotifierApple::~NetworkChangeNotifierApple() { +#if BUILDFLAG(IS_MAC) + StopNetworkPathMonitor(); +#endif // BUILDFLAG(IS_MAC) ClearGlobalPointer(); // Delete the ConfigWatcher to join the notifier thread, ensuring that // StartReachabilityNotifications() has an opportunity to run to completion. @@ -263,7 +286,7 @@ NetworkChangeNotifierApple::CalculateConnectionType( CTRadioAccessTechnologyeHRPD, nil]; NSSet* technologies_4g = [NSSet setWithObjects:CTRadioAccessTechnologyLTE, nil]; - // TODO: Use constants from CoreTelephony once Cronet builds with XCode 12.1 + // TODO: Use constants from CoreTelephony once Cronet builds with Xcode 12.1 NSSet* technologies_5g = [NSSet setWithObjects:@"CTRadioAccessTechnologyNRNSA", @"CTRadioAccessTechnologyNR", nil]; @@ -336,6 +359,28 @@ void NetworkChangeNotifierApple::Forwarder::CleanUpOnNotifierThread() { void NetworkChangeNotifierApple::SetInitialConnectionType() { // Called on notifier thread. +#if BUILDFLAG(IS_MAC) + if (EnsureNetworkPathMonitorStarted()) { + { + base::AutoLock lock(connection_type_lock_); + if (!connection_type_initialized_) { + // Mirror the legacy SCNetworkReachability behaviour: wait briefly for + // the asynchronous path monitor callback so GetCurrentConnectionType() + // observes a deterministic value during early startup. + base::TimeTicks end_time = + base::TimeTicks::Now() + + base::Seconds(kMaxWaitForConnectionTypeInSeconds); + while (!connection_type_initialized_ && + base::TimeTicks::Now() < end_time) { + base::TimeDelta remaining = end_time - base::TimeTicks::Now(); + initial_connection_type_cv_.TimedWait(remaining); + } + } + } + return; + } +#endif // BUILDFLAG(IS_MAC) + // Try to reach 0.0.0.0. This is the approach taken by Firefox: // // http://mxr.mozilla.org/mozilla2.0/source/netwerk/system/mac/nsNetworkLinkService.mm @@ -367,6 +412,11 @@ void NetworkChangeNotifierApple::SetInitialConnectionType() { void NetworkChangeNotifierApple::StartReachabilityNotifications() { // Called on notifier thread. run_loop_.reset(CFRunLoopGetCurrent(), base::scoped_policy::RETAIN); +#if BUILDFLAG(IS_MAC) + if (EnsureNetworkPathMonitorStarted()) { + return; + } +#endif // BUILDFLAG(IS_MAC) DCHECK(reachability_); SCNetworkReachabilityContext reachability_context = { @@ -558,6 +608,130 @@ void NetworkChangeNotifierApple::ReachabilityCallback( } #if BUILDFLAG(IS_MAC) +bool NetworkChangeNotifierApple::ShouldUseNetworkPathMonitor() const { + return base::FeatureList::IsEnabled( + features::kUseNetworkPathMonitorForNetworkChangeNotifier); +} + +bool NetworkChangeNotifierApple::EnsureNetworkPathMonitorStarted() { + if (!ShouldUseNetworkPathMonitor()) { + return false; + } + if (!network_path_monitor_) { + network_path_monitor_ = std::make_unique(); + } + auto* storage = network_path_monitor_.get(); + if (storage->monitor) { + return true; + } + + storage->monitor = nw_path_monitor_create(); + if (!storage->monitor) { + network_path_monitor_.reset(); + return false; + } + + storage->queue = dispatch_queue_create( + "org.chromium.net.network_path_monitor", DISPATCH_QUEUE_SERIAL); + if (!storage->queue) { + // Tear down the partially constructed monitor before releasing storage. + network_path_monitor_.reset(); + return false; + } + + nw_path_monitor_set_update_handler(storage->monitor, ^(nw_path_t path) { + // SAFE: StopNetworkPathMonitor() cancels the monitor and synchronously + // drains this queue before destruction, so the captured raw pointer cannot + // outlive the notifier instance. + NetworkChangeNotifier::ConnectionType new_type = + NetworkChangeNotifier::CONNECTION_NONE; + switch (nw_path_get_status(path)) { + case nw_path_status_satisfied: + // A fully satisfied path means we can derive the connection type from + // the active interfaces. + new_type = ConnectionTypeFromInterfaces(); + break; + case nw_path_status_satisfiable: + // The path could become satisfied if the system performs extra work + // (for example, negotiating captive portals). Treat this as unknown + // rather than offline to avoid spurious "no connection" drops. + new_type = NetworkChangeNotifier::CONNECTION_UNKNOWN; + break; + case nw_path_status_unsatisfied: + case nw_path_status_invalid: + default: + // Treat invalid/unsatisfied as offline until better information + // arrives. + new_type = NetworkChangeNotifier::CONNECTION_NONE; + break; + } + OnNetworkPathConnectionTypeChanged(new_type); + }); + + nw_path_monitor_set_queue(storage->monitor, storage->queue); + nw_path_monitor_start(storage->monitor); + return true; +} + +void NetworkChangeNotifierApple::StopNetworkPathMonitor() { + if (!network_path_monitor_) { + return; + } + auto* storage = network_path_monitor_.get(); + dispatch_queue_t queue = storage->queue; + if (storage->monitor) { + nw_path_monitor_cancel(storage->monitor); + } + if (queue) { + // Flush pending callbacks so none outlive the notifier instance. + dispatch_sync(queue, ^{ + }); + } + // Resetting the storage runs NetworkPathMonitorStorage's destructor, which + // clears the Network.framework monitor and dispatch queue references. + network_path_monitor_.reset(); +} + +void NetworkChangeNotifierApple::OnNetworkPathConnectionTypeChanged( + ConnectionType new_type) { + if (run_loop_) { + CFRunLoopPerformBlock(run_loop_.get(), kCFRunLoopCommonModes, ^{ + ProcessConnectionTypeUpdate(new_type, /*should_notify=*/true); + }); + CFRunLoopWakeUp(run_loop_.get()); + return; + } + + ProcessConnectionTypeUpdate(new_type, /*should_notify=*/false); +} + +void NetworkChangeNotifierApple::ProcessConnectionTypeUpdate( + ConnectionType new_type, + bool should_notify) { + bool notify_change = false; + { + base::AutoLock lock(connection_type_lock_); + if (!connection_type_initialized_) { + connection_type_ = new_type; + connection_type_initialized_ = true; + initial_connection_type_cv_.Broadcast(); + } else if (connection_type_ != new_type) { + connection_type_ = new_type; + notify_change = true; + } + } + + if (!should_notify || !notify_change) { + return; + } + + NotifyObserversOfConnectionTypeChange(); + double max_bandwidth_mbps = + NetworkChangeNotifier::GetMaxBandwidthMbpsForConnectionSubtype( + new_type == CONNECTION_NONE ? SUBTYPE_NONE : SUBTYPE_UNKNOWN); + NotifyObserversOfMaxBandwidthChange(max_bandwidth_mbps, new_type); +} + void NetworkChangeNotifierApple::SetCallbacksForTest( base::OnceClosure initialized_callback, base::RepeatingCallback diff --git a/naiveproxy/src/net/base/network_change_notifier_linux.cc b/naiveproxy/src/net/base/network_change_notifier_linux.cc index 52220d2816..f4ad0ba406 100644 --- a/naiveproxy/src/net/base/network_change_notifier_linux.cc +++ b/naiveproxy/src/net/base/network_change_notifier_linux.cc @@ -41,7 +41,7 @@ class NetworkChangeNotifierLinux::BlockingThreadObjects { void InitForTesting(base::ScopedFD netlink_fd); // IN-TEST private: - void OnIPAddressChanged(); + void OnIPAddressChanged(IPAddressChangeType change_type); void OnLinkChanged(); // Used to detect online/offline state and IP address changes. internal::AddressTrackerLinux address_tracker_; @@ -74,8 +74,9 @@ void NetworkChangeNotifierLinux::BlockingThreadObjects::InitForTesting( last_type_ = GetCurrentConnectionType(); } -void NetworkChangeNotifierLinux::BlockingThreadObjects::OnIPAddressChanged() { - NetworkChangeNotifier::NotifyObserversOfIPAddressChange(); +void NetworkChangeNotifierLinux::BlockingThreadObjects::OnIPAddressChanged( + IPAddressChangeType change_type) { + NetworkChangeNotifier::NotifyObserversOfIPAddressChange(change_type); // When the IP address of a network interface is added/deleted, the // connection type may have changed. OnLinkChanged(); diff --git a/naiveproxy/src/net/base/network_change_notifier_passive.cc b/naiveproxy/src/net/base/network_change_notifier_passive.cc index 354deed83c..a5d54954ef 100644 --- a/naiveproxy/src/net/base/network_change_notifier_passive.cc +++ b/naiveproxy/src/net/base/network_change_notifier_passive.cc @@ -53,9 +53,10 @@ void NetworkChangeNotifierPassive::OnDNSChanged() { GetCurrentSystemDnsConfigNotifier()->RefreshConfig(); } -void NetworkChangeNotifierPassive::OnIPAddressChanged() { +void NetworkChangeNotifierPassive::OnIPAddressChanged( + IPAddressChangeType change_type) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - NetworkChangeNotifier::NotifyObserversOfIPAddressChange(); + NetworkChangeNotifier::NotifyObserversOfIPAddressChange(change_type); } void NetworkChangeNotifierPassive::OnConnectionChanged( diff --git a/naiveproxy/src/net/base/network_change_notifier_passive.h b/naiveproxy/src/net/base/network_change_notifier_passive.h index a9e9f7fa0d..d85d01e256 100644 --- a/naiveproxy/src/net/base/network_change_notifier_passive.h +++ b/naiveproxy/src/net/base/network_change_notifier_passive.h @@ -39,7 +39,7 @@ class NET_EXPORT NetworkChangeNotifierPassive : public NetworkChangeNotifier { // These methods are used to notify this object that a network property has // changed. These must be called from the thread that owns this object. void OnDNSChanged(); - void OnIPAddressChanged(); + void OnIPAddressChanged(IPAddressChangeType change_type); void OnConnectionChanged( NetworkChangeNotifier::ConnectionType connection_type); void OnConnectionSubtypeChanged( diff --git a/naiveproxy/src/net/base/network_isolation_key.h b/naiveproxy/src/net/base/network_isolation_key.h index 2bff7525d4..c4cb99b1da 100644 --- a/naiveproxy/src/net/base/network_isolation_key.h +++ b/naiveproxy/src/net/base/network_isolation_key.h @@ -157,6 +157,12 @@ class NET_EXPORT NetworkIsolationKey { bool IsEmpty() const; private: + template + friend H AbslHashValue(H h, const NetworkIsolationKey& key) { + return H::combine(std::move(h), key.top_frame_site_, key.frame_site_, + key.nonce_, key.network_isolation_partition_); + } + // Whether this key has opaque origins or a nonce. bool IsOpaque() const; diff --git a/naiveproxy/src/net/base/pickle_traits.h b/naiveproxy/src/net/base/pickle_traits.h index dabcd502b8..96f063e067 100644 --- a/naiveproxy/src/net/base/pickle_traits.h +++ b/naiveproxy/src/net/base/pickle_traits.h @@ -563,7 +563,7 @@ struct PickleTraits { } static constexpr std::make_index_sequence> - kIndexSequence; + kIndexSequence{}; }; // bool is treated specially by base::Pickle. diff --git a/naiveproxy/src/net/base/proxy_chain.cc b/naiveproxy/src/net/base/proxy_chain.cc index ede3c9bd9b..def04b87b6 100644 --- a/naiveproxy/src/net/base/proxy_chain.cc +++ b/naiveproxy/src/net/base/proxy_chain.cc @@ -11,6 +11,8 @@ #include "base/check.h" #include "base/no_destructor.h" #include "base/pickle.h" +#include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "build/buildflag.h" #include "net/base/proxy_server.h" @@ -163,6 +165,39 @@ std::string ProxyChain::ToDebugString() const { return debug_string; } +std::string ProxyChain::GetHistogramSuffix() const { + auto scheme_to_string = [](ProxyServer::Scheme scheme) { + switch (scheme) { + case ProxyServer::SCHEME_INVALID: + return "INVALID"; + case ProxyServer::SCHEME_HTTP: + return "HTTP"; + case ProxyServer::SCHEME_SOCKS4: + return "SOCKS4"; + case ProxyServer::SCHEME_SOCKS5: + return "SOCKS5"; + case ProxyServer::SCHEME_HTTPS: + return "HTTPS"; + case ProxyServer::SCHEME_QUIC: + return "QUIC"; + } + }; + + if (is_for_ip_protection()) { + return base::StrCat( + {"Chain", base::NumberToString(ip_protection_chain_id()), + is_direct() + ? "" + : base::StrCat({".", scheme_to_string(First().scheme())})}); + } + + if (is_direct()) { + return "Direct"; + } + + return scheme_to_string(First().scheme()); +} + ProxyChain::ProxyChain(std::vector proxy_server_list, int ip_protection_chain_id, std::optional opaque_data) diff --git a/naiveproxy/src/net/base/proxy_chain.h b/naiveproxy/src/net/base/proxy_chain.h index 8b8d3eefc4..3f3d20a68f 100644 --- a/naiveproxy/src/net/base/proxy_chain.h +++ b/naiveproxy/src/net/base/proxy_chain.h @@ -205,6 +205,20 @@ class NET_EXPORT ProxyChain { std::string ToDebugString() const; + // Returns a string suffix for histogram names. + // + // For IP Protection chains, the format is "Chain{ID}" for direct chains, and + // "Chain{ID}.{Protocol}" otherwise, where {ID} is the + // `ip_protection_chain_id()` and {Protocol} is the scheme of the first + // proxy. For example, "Chain0" or "Chain1.HTTPS". + // For other chains, the format is "Direct" for direct connections, or the + // scheme of the proxies in the chain for proxy connections. For example, + // "HTTPS" or "SOCKS5". + // + // This format should not be changed without updating the metrics that use + // this. + std::string GetHistogramSuffix() const; + private: explicit ProxyChain(std::vector proxy_server_list, int ip_protection_chain_id, @@ -236,10 +250,6 @@ class NET_EXPORT ProxyChain { NET_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, const ProxyChain& proxy_chain); -// A HostPortProxyPair holds a host/port destination and a ProxyChain describing -// how that destination is reached. -typedef std::pair HostPortProxyPair; - } // namespace net #endif // NET_BASE_PROXY_CHAIN_H_ diff --git a/naiveproxy/src/net/base/proxy_delegate.cc b/naiveproxy/src/net/base/proxy_delegate.cc new file mode 100644 index 0000000000..515426fe1e --- /dev/null +++ b/naiveproxy/src/net/base/proxy_delegate.cc @@ -0,0 +1,20 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/base/proxy_delegate.h" + +#include + +#include "net/base/proxy_chain.h" +#include "net/http/proxy_fallback.h" + +namespace net { + +std::optional ProxyDelegate::CanFalloverToNextProxyOverride( + const ProxyChain& proxy_chain, + int net_error) { + return std::nullopt; +} + +} // namespace net diff --git a/naiveproxy/src/net/base/proxy_delegate.h b/naiveproxy/src/net/base/proxy_delegate.h index fc64ab38ad..f8adf9d11c 100644 --- a/naiveproxy/src/net/base/proxy_delegate.h +++ b/naiveproxy/src/net/base/proxy_delegate.h @@ -7,6 +7,9 @@ #include +#include "base/types/expected.h" +#include "base/types/optional_ref.h" +#include "net/base/completion_once_callback.h" #include "net/base/net_errors.h" #include "net/base/net_export.h" #include "net/base/network_anonymization_key.h" @@ -42,6 +45,14 @@ class NET_EXPORT ProxyDelegate { const ProxyRetryInfoMap& proxy_retry_info, ProxyInfo* result) = 0; + // Called when use of a proxy chain failed due to `net_error`. Allows + // overriding whether the request should be retried using the next ProxyChain + // in the fallback list. If not implemented, or if this returns std::nullopt, + // no override will take place. + virtual std::optional CanFalloverToNextProxyOverride( + const ProxyChain& proxy_chain, + int net_error); + // Called when use of a proxy chain failed due to `net_error`, but another // proxy chain in the list succeeded. The failed proxy is within `bad_chain`, // but it is undefined at which proxy in that chain. `net_error` is the @@ -60,23 +71,40 @@ class NET_EXPORT ProxyDelegate { virtual void OnSuccessfulRequestAfterFailures( const ProxyRetryInfoMap& proxy_retry_info) = 0; + using OnBeforeTunnelRequestCallback = + base::OnceCallback)>; + // Called immediately before a proxy tunnel request is sent. Provides the - // embedder an opportunity to add extra request headers. Returning any value - // other than OK will cause the connection to fail with that error. - virtual Error OnBeforeTunnelRequest(const ProxyChain& proxy_chain, - size_t chain_index, - HttpRequestHeaders* extra_headers) = 0; + // embedder an opportunity to add extra request headers to the request. + // Returns: + // - The headers, if they could be computed without blocking. If no headers + // should be added, an empty HttpRequestHeaders should be returned. + // - ERR_IO_PENDING, if the implementor must block to compute the headers. + // - Any error code, other than ERR_IO_PENDING and OK, if something went + // wrong. + // If ERR_IO_PENDING is returned, `callback` will be called asynchronously. + // The value passed to `callback` is to be interpreted in the same way as the + // return value of this function. With the exception that ERR_IO_PENDING is + // no longer an acceptable error code. + // `proxy_index` identifies the proxy, within `proxy_chain`, to whom we will + // be sending the extra headers`. + virtual base::expected OnBeforeTunnelRequest( + const ProxyChain& proxy_chain, + size_t proxy_index, + OnBeforeTunnelRequestCallback callback) = 0; // Called when the response headers for the proxy tunnel request have been // received. Allows the delegate to override the net error code of the tunnel // request. Returning OK causes the standard tunnel response handling to be - // performed. Implementations should make sure they can trust the proxy server - // at position `chain_index` in `proxy_chain` before making decisions based on + // performed. `proxy_index` identifies the proxy, within `proxy_chain`, that + // we're receiving response headers from. Implementations should make sure + // they can trust said proxy before making decisions based on // `response_headers`. virtual Error OnTunnelHeadersReceived( const ProxyChain& proxy_chain, - size_t chain_index, - const HttpResponseHeaders& response_headers) = 0; + size_t proxy_index, + const HttpResponseHeaders& response_headers, + CompletionOnceCallback callback) = 0; // Associates a `ProxyResolutionService` with this `ProxyDelegate`. // `proxy_resolution_service` must outlive `this`. @@ -93,6 +121,13 @@ class NET_EXPORT ProxyDelegate { const std::string scheme, const std::vector& dns_aliases, const net::NetworkAnonymizationKey& network_anonymization_key) = 0; + + // Called after a stream creation succeeds or fails. `duration` indicates + // how long the attempt took, from when the jobs started to when the attempt + // succeeded or failed. + virtual void OnStreamCreationAttempted(const ProxyChain& proxy_chain, + base::TimeDelta duration, + base::optional_ref net_error) {} }; } // namespace net diff --git a/naiveproxy/src/net/base/proxy_server.cc b/naiveproxy/src/net/base/proxy_server.cc index f2ffc6ddbf..5a7f32bda8 100644 --- a/naiveproxy/src/net/base/proxy_server.cc +++ b/naiveproxy/src/net/base/proxy_server.cc @@ -98,7 +98,7 @@ ProxyServer ProxyServer::FromSchemeHostAndPort(Scheme scheme, url::StdStringCanonOutput canonicalized_output(&canonicalized_host); url::Component component_output; - if (!url::CanonicalizeHost(host.data(), url::Component(0, host.size()), + if (!url::CanonicalizeHost(host, url::Component(0, host.size()), &canonicalized_output, &component_output)) { return ProxyServer(); } diff --git a/naiveproxy/src/net/base/registry_controlled_domains/effective_tld_names.dat b/naiveproxy/src/net/base/registry_controlled_domains/effective_tld_names.dat index ec5414f74f..49ca2c6f10 100644 --- a/naiveproxy/src/net/base/registry_controlled_domains/effective_tld_names.dat +++ b/naiveproxy/src/net/base/registry_controlled_domains/effective_tld_names.dat @@ -207,6 +207,7 @@ musica.ar mutual.ar net.ar org.ar +seg.ar senasa.ar tur.ar @@ -239,7 +240,7 @@ or.at // au : https://www.iana.org/domains/root/db/au.html // https://www.auda.org.au/ -// Confirmed by registry 2024-11-17 +// Confirmed by registry 2025-07-16 au // 2LDs asn.au @@ -282,7 +283,7 @@ vic.gov.au wa.gov.au // 4LDs // education.tas.edu.au - Removed at the request of the Department of Education Tasmania -schools.nsw.edu.au +// schools.nsw.edu.au - Removed at the request of the New South Wales Department of Education. // aw : https://www.iana.org/domains/root/db/aw.html aw @@ -502,6 +503,7 @@ aju.br am.br anani.br aparecida.br +api.br app.br arq.br art.br @@ -587,6 +589,7 @@ se.gov.br sp.gov.br to.gov.br gru.br +ia.br imb.br ind.br inf.br @@ -647,6 +650,7 @@ seg.br sjc.br slg.br slz.br +social.br sorocaba.br srv.br taxi.br @@ -663,6 +667,7 @@ vet.br vix.br vlog.br wiki.br +xyz.br zlg.br // bs : http://www.nic.bs/rules.html @@ -924,7 +929,9 @@ pro.cy tm.cy // cz : https://www.iana.org/domains/root/db/cz.html +// Confirmed by registry 2025-08-06 cz +gov.cz // de : https://www.iana.org/domains/root/db/de.html // Confirmed by registry (with technical @@ -976,20 +983,59 @@ soc.dz tm.dz // ec : https://www.nic.ec/ -// Submitted by registry +// Submitted by registry ec +abg.ec +adm.ec +agron.ec +arqt.ec +art.ec +bar.ec +chef.ec com.ec +cont.ec +cpa.ec +cue.ec +dent.ec +dgn.ec +disco.ec +doc.ec edu.ec +eng.ec +esm.ec fin.ec +fot.ec +gal.ec gob.ec gov.ec +gye.ec +ibr.ec info.ec k12.ec +lat.ec +loj.ec med.ec mil.ec +mktg.ec +mon.ec net.ec +ntr.ec +odont.ec org.ec pro.ec +prof.ec +psic.ec +psiq.ec +pub.ec +rio.ec +rrpp.ec +sal.ec +tech.ec +tul.ec +tur.ec +uio.ec +vet.ec +xxx.ec // edu : https://www.iana.org/domains/root/db/edu.html edu @@ -1137,10 +1183,12 @@ org.gg // Although domains directly at second level are not possible at the moment, // they have been possible for some time and may come back. gh +biz.gh com.gh edu.gh gov.gh mil.gh +net.gh org.gh // gi : http://www.nic.gi/rules.html @@ -1344,6 +1392,7 @@ biz.id co.id desa.id go.id +kop.id mil.id my.id net.id @@ -6128,95 +6177,93 @@ cc.dc.us lib.dc.us cc.de.us cc.fl.us +lib.fl.us cc.ga.us +lib.ga.us cc.gu.us +lib.gu.us cc.hi.us +lib.hi.us cc.ia.us +lib.ia.us cc.id.us +lib.id.us cc.il.us +lib.il.us cc.in.us +lib.in.us cc.ks.us +lib.ks.us cc.ky.us +lib.ky.us cc.la.us +lib.la.us cc.ma.us +lib.ma.us cc.md.us +lib.md.us cc.me.us +lib.me.us cc.mi.us +lib.mi.us cc.mn.us +lib.mn.us cc.mo.us +lib.mo.us cc.ms.us cc.mt.us +lib.mt.us cc.nc.us +lib.nc.us cc.nd.us +lib.nd.us cc.ne.us +lib.ne.us cc.nh.us +lib.nh.us cc.nj.us +lib.nj.us cc.nm.us +lib.nm.us cc.nv.us +lib.nv.us cc.ny.us +lib.ny.us cc.oh.us +lib.oh.us cc.ok.us +lib.ok.us cc.or.us +lib.or.us cc.pa.us +lib.pa.us cc.pr.us +lib.pr.us cc.ri.us +lib.ri.us cc.sc.us +lib.sc.us cc.sd.us +lib.sd.us cc.tn.us +lib.tn.us cc.tx.us +lib.tx.us cc.ut.us +lib.ut.us cc.va.us +lib.va.us cc.vi.us +lib.vi.us cc.vt.us +lib.vt.us cc.wa.us +lib.wa.us cc.wi.us +lib.wi.us cc.wv.us cc.wy.us k12.wy.us -// lib.de.us - Issue #243 - Moved to Private section at request of Ed Moore -lib.fl.us -lib.ga.us -lib.gu.us -lib.hi.us -lib.ia.us -lib.id.us -lib.il.us -lib.in.us -lib.ks.us -lib.ky.us -lib.la.us -lib.ma.us -lib.md.us -lib.me.us -lib.mi.us -lib.mn.us -lib.mo.us -lib.ms.us -lib.mt.us -lib.nc.us -lib.nd.us -lib.ne.us -lib.nh.us -lib.nj.us -lib.nm.us -lib.nv.us -lib.ny.us -lib.oh.us -lib.ok.us -lib.or.us -lib.pa.us -lib.pr.us -lib.ri.us -lib.sc.us -lib.sd.us -lib.tn.us -lib.tx.us -lib.ut.us -lib.va.us -lib.vi.us -lib.vt.us -lib.wa.us -lib.wi.us // lib.wv.us - Bug 941670 - Removed at request of Larry W Arnold lib.wy.us // k12.ma.us contains school districts in Massachusetts. The 4LDs are @@ -6750,7 +6797,7 @@ org.zw // newGTLDs -// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2025-02-28T15:18:00Z +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2025-08-27T15:19:08Z // This list is auto-generated, don't edit it manually. // aaa : American Automobile Association, Inc. // https://www.iana.org/domains/root/db/aaa.html @@ -6964,7 +7011,7 @@ arab // https://www.iana.org/domains/root/db/aramco.html aramco -// archi : Identity Digital Limited +// archi : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/archi.html archi @@ -7132,10 +7179,6 @@ beauty // https://www.iana.org/domains/root/db/beer.html beer -// bentley : Bentley Motors Limited -// https://www.iana.org/domains/root/db/bentley.html -bentley - // berlin : dotBERLIN GmbH & Co. KG // https://www.iana.org/domains/root/db/berlin.html berlin @@ -7148,7 +7191,7 @@ best // https://www.iana.org/domains/root/db/bestbuy.html bestbuy -// bet : Identity Digital Limited +// bet : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/bet.html bet @@ -7176,11 +7219,11 @@ bing // https://www.iana.org/domains/root/db/bingo.html bingo -// bio : Identity Digital Limited +// bio : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/bio.html bio -// black : Identity Digital Limited +// black : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/black.html black @@ -7200,7 +7243,7 @@ blog // https://www.iana.org/domains/root/db/bloomberg.html bloomberg -// blue : Identity Digital Limited +// blue : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/blue.html blue @@ -7528,7 +7571,7 @@ claims // https://www.iana.org/domains/root/db/cleaning.html cleaning -// click : Internet Naming Company LLC +// click : Waterford Limited // https://www.iana.org/domains/root/db/click.html click @@ -8296,7 +8339,7 @@ glass // https://www.iana.org/domains/root/db/gle.html gle -// global : Identity Digital Limited +// global : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/global.html global @@ -8372,7 +8415,7 @@ graphics // https://www.iana.org/domains/root/db/gratis.html gratis -// green : Identity Digital Limited +// green : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/green.html green @@ -8532,6 +8575,10 @@ hosting // https://www.iana.org/domains/root/db/hot.html hot +// hotel : HOTEL Top-Level-Domain S.a.r.l +// https://www.iana.org/domains/root/db/hotel.html +hotel + // hotels : Booking.com B.V. // https://www.iana.org/domains/root/db/hotels.html hotels @@ -8776,7 +8823,7 @@ kia // https://www.iana.org/domains/root/db/kids.html kids -// kim : Identity Digital Limited +// kim : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/kim.html kim @@ -8840,10 +8887,6 @@ lamborghini // https://www.iana.org/domains/root/db/lamer.html lamer -// lancaster : LANCASTER -// https://www.iana.org/domains/root/db/lancaster.html -lancaster - // land : Binky Moon, LLC // https://www.iana.org/domains/root/db/land.html land @@ -8908,7 +8951,7 @@ lego // https://www.iana.org/domains/root/db/lexus.html lexus -// lgbt : Identity Digital Limited +// lgbt : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/lgbt.html lgbt @@ -8964,7 +9007,7 @@ live // https://www.iana.org/domains/root/db/living.html living -// llc : Identity Digital Limited +// llc : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/llc.html llc @@ -9000,7 +9043,7 @@ london // https://www.iana.org/domains/root/db/lotte.html lotte -// lotto : Identity Digital Limited +// lotto : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/lotto.html lotto @@ -9088,7 +9131,7 @@ marriott // https://www.iana.org/domains/root/db/marshalls.html marshalls -// mattel : Mattel Sites, Inc. +// mattel : Mattel IT Services, Inc. // https://www.iana.org/domains/root/db/mattel.html mattel @@ -9364,7 +9407,7 @@ nowruz // https://www.iana.org/domains/root/db/nowtv.html nowtv -// nra : NRA Holdings Company, INC. +// nra : National Rifle Association of America // https://www.iana.org/domains/root/db/nra.html nra @@ -9444,7 +9487,7 @@ oracle // https://www.iana.org/domains/root/db/orange.html orange -// organic : Identity Digital Limited +// organic : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/organic.html organic @@ -9504,7 +9547,7 @@ pay // https://www.iana.org/domains/root/db/pccw.html pccw -// pet : Identity Digital Limited +// pet : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/pet.html pet @@ -9548,7 +9591,7 @@ physio // https://www.iana.org/domains/root/db/pics.html pics -// pictet : Pictet Europe S.A. +// pictet : Banque Pictet & Cie SA // https://www.iana.org/domains/root/db/pictet.html pictet @@ -9568,7 +9611,7 @@ pin // https://www.iana.org/domains/root/db/ping.html ping -// pink : Identity Digital Limited +// pink : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/pink.html pink @@ -9608,7 +9651,7 @@ pnc // https://www.iana.org/domains/root/db/pohl.html pohl -// poker : Identity Digital Limited +// poker : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/poker.html poker @@ -9620,10 +9663,6 @@ politie // https://www.iana.org/domains/root/db/porn.html porn -// pramerica : Prudential Financial, Inc. -// https://www.iana.org/domains/root/db/pramerica.html -pramerica - // praxi : Praxi S.p.A. // https://www.iana.org/domains/root/db/praxi.html praxi @@ -9652,7 +9691,7 @@ prof // https://www.iana.org/domains/root/db/progressive.html progressive -// promo : Identity Digital Limited +// promo : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/promo.html promo @@ -9724,14 +9763,10 @@ realty // https://www.iana.org/domains/root/db/recipes.html recipes -// red : Identity Digital Limited +// red : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/red.html red -// redstone : Redstone Haute Couture Co., Ltd. -// https://www.iana.org/domains/root/db/redstone.html -redstone - // redumbrella : Travelers TLD, LLC // https://www.iana.org/domains/root/db/redumbrella.html redumbrella @@ -10040,7 +10075,7 @@ shell // https://www.iana.org/domains/root/db/shia.html shia -// shiksha : Identity Digital Limited +// shiksha : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/shiksha.html shiksha @@ -10080,7 +10115,7 @@ singles // https://www.iana.org/domains/root/db/site.html site -// ski : Identity Digital Limited +// ski : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/ski.html ski @@ -10652,7 +10687,7 @@ wanggou // https://www.iana.org/domains/root/db/watch.html watch -// watches : Identity Digital Limited +// watches : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/watches.html watches @@ -10832,7 +10867,7 @@ xin // https://www.iana.org/domains/root/db/xn--5tzm5g.html 网站 -// xn--6frz82g : Identity Digital Limited +// xn--6frz82g : Identity Digital Domains Limited // https://www.iana.org/domains/root/db/xn--6frz82g.html 移动 @@ -11222,10 +11257,6 @@ poznan.pl wroc.pl zakopane.pl -// .US -// Submitted by Ed Moore -lib.de.us - // 12CHARS : https://12chars.com // Submitted by Kenny Niehage 12chars.dev @@ -11238,7 +11269,7 @@ cc.ua inf.ua ltd.ua -// 611 blockchain domain name system : https://611project.net/ +// 611 blockchain domain name system : https://sixone.one/ 611.to // A2 Hosting @@ -11272,9 +11303,10 @@ adobeaemcloud.com aem.live hlx.live adobeaemcloud.net +aem.network aem.page hlx.page -hlx3.page +aem.reviews // Adobe Developer Platform : https://developer.adobe.com // Submitted by Jesse MacFadyen @@ -11396,7 +11428,7 @@ cloudfront.net // Amazon Cognito // Submitted by AWS Security -// Reference: cb38c251-c93d-4cda-81ec-e72c4f0fdb72 +// Reference: e7c02dc1-02f4-4a23-bde3-a8527c830127 auth.af-south-1.amazoncognito.com auth.ap-east-1.amazoncognito.com auth.ap-northeast-1.amazoncognito.com @@ -11408,6 +11440,8 @@ auth.ap-southeast-1.amazoncognito.com auth.ap-southeast-2.amazoncognito.com auth.ap-southeast-3.amazoncognito.com auth.ap-southeast-4.amazoncognito.com +auth.ap-southeast-5.amazoncognito.com +auth.ap-southeast-7.amazoncognito.com auth.ca-central-1.amazoncognito.com auth.ca-west-1.amazoncognito.com auth.eu-central-1.amazoncognito.com @@ -11421,11 +11455,13 @@ auth.eu-west-3.amazoncognito.com auth.il-central-1.amazoncognito.com auth.me-central-1.amazoncognito.com auth.me-south-1.amazoncognito.com +auth.mx-central-1.amazoncognito.com auth.sa-east-1.amazoncognito.com auth.us-east-1.amazoncognito.com auth-fips.us-east-1.amazoncognito.com auth.us-east-2.amazoncognito.com auth-fips.us-east-2.amazoncognito.com +auth-fips.us-gov-east-1.amazoncognito.com auth-fips.us-gov-west-1.amazoncognito.com auth.us-west-1.amazoncognito.com auth-fips.us-west-1.amazoncognito.com @@ -11545,9 +11581,41 @@ emrstudio-prod.us-west-2.amazonaws.com // Amazon Managed Workflows for Apache Airflow // Submitted by AWS Security -// Reference: f5ea5d0a-ec6a-4f23-ac1c-553fbff13f5c +// Reference: 2f697e23-58d6-4b97-be6b-77a26e811dad +*.airflow.af-south-1.on.aws +*.airflow.ap-east-1.on.aws +*.airflow.ap-northeast-1.on.aws +*.airflow.ap-northeast-2.on.aws +*.airflow.ap-northeast-3.on.aws +*.airflow.ap-south-1.on.aws +*.airflow.ap-south-2.on.aws +*.airflow.ap-southeast-1.on.aws +*.airflow.ap-southeast-2.on.aws +*.airflow.ap-southeast-3.on.aws +*.airflow.ap-southeast-4.on.aws +*.airflow.ap-southeast-5.on.aws +*.airflow.ca-central-1.on.aws +*.airflow.ca-west-1.on.aws +*.airflow.eu-central-1.on.aws +*.airflow.eu-central-2.on.aws +*.airflow.eu-north-1.on.aws +*.airflow.eu-south-1.on.aws +*.airflow.eu-south-2.on.aws +*.airflow.eu-west-1.on.aws +*.airflow.eu-west-2.on.aws +*.airflow.eu-west-3.on.aws +*.airflow.il-central-1.on.aws +*.airflow.me-central-1.on.aws +*.airflow.me-south-1.on.aws +*.airflow.sa-east-1.on.aws +*.airflow.us-east-1.on.aws +*.airflow.us-east-2.on.aws +*.airflow.us-west-1.on.aws +*.airflow.us-west-2.on.aws *.cn-north-1.airflow.amazonaws.com.cn *.cn-northwest-1.airflow.amazonaws.com.cn +*.airflow.cn-north-1.on.amazonwebservices.com.cn +*.airflow.cn-northwest-1.on.amazonwebservices.com.cn *.af-south-1.airflow.amazonaws.com *.ap-east-1.airflow.amazonaws.com *.ap-northeast-1.airflow.amazonaws.com @@ -11559,6 +11627,7 @@ emrstudio-prod.us-west-2.amazonaws.com *.ap-southeast-2.airflow.amazonaws.com *.ap-southeast-3.airflow.amazonaws.com *.ap-southeast-4.airflow.amazonaws.com +*.ap-southeast-5.airflow.amazonaws.com *.ca-central-1.airflow.amazonaws.com *.ca-west-1.airflow.amazonaws.com *.eu-central-1.airflow.amazonaws.com @@ -12136,16 +12205,43 @@ awsglobalaccelerator.com // AWS Transfer Family web apps // Submitted by AWS Security -// Reference: 67e9cfe6-ac57-49c7-b197-6652711c8e8d +// Reference: 57a658c4-8899-410c-aa24-5b01e4a178d2 +transfer-webapp.af-south-1.on.aws +transfer-webapp.ap-east-1.on.aws transfer-webapp.ap-northeast-1.on.aws +transfer-webapp.ap-northeast-2.on.aws +transfer-webapp.ap-northeast-3.on.aws +transfer-webapp.ap-south-1.on.aws +transfer-webapp.ap-south-2.on.aws transfer-webapp.ap-southeast-1.on.aws transfer-webapp.ap-southeast-2.on.aws +transfer-webapp.ap-southeast-3.on.aws +transfer-webapp.ap-southeast-4.on.aws +transfer-webapp.ap-southeast-5.on.aws +transfer-webapp.ca-central-1.on.aws +transfer-webapp.ca-west-1.on.aws transfer-webapp.eu-central-1.on.aws +transfer-webapp.eu-central-2.on.aws transfer-webapp.eu-north-1.on.aws +transfer-webapp.eu-south-1.on.aws +transfer-webapp.eu-south-2.on.aws transfer-webapp.eu-west-1.on.aws +transfer-webapp.eu-west-2.on.aws +transfer-webapp.eu-west-3.on.aws +transfer-webapp.il-central-1.on.aws +transfer-webapp.me-central-1.on.aws +transfer-webapp.me-south-1.on.aws +transfer-webapp.sa-east-1.on.aws transfer-webapp.us-east-1.on.aws transfer-webapp.us-east-2.on.aws +transfer-webapp.us-gov-east-1.on.aws +transfer-webapp-fips.us-gov-east-1.on.aws +transfer-webapp.us-gov-west-1.on.aws +transfer-webapp-fips.us-gov-west-1.on.aws +transfer-webapp.us-west-1.on.aws transfer-webapp.us-west-2.on.aws +transfer-webapp.cn-north-1.on.amazonwebservices.com.cn +transfer-webapp.cn-northwest-1.on.amazonwebservices.com.cn // eero // Submitted by Yue Kang @@ -12176,6 +12272,11 @@ appspaceusercontent.com // Submitted by Alexander Hochbaum appudo.net +// Appwrite : https://appwrite.io +// Submitted by Steven Nguyen +appwrite.global +*.appwrite.run + // Aptible : https://www.aptible.com/ // Submitted by Thomas Orozco on-aptible.com @@ -12322,6 +12423,7 @@ brave.io // Brendly : https://brendly.rs // Submitted by Dusan Radovanovic +shop.brendly.ba shop.brendly.hr shop.brendly.rs @@ -12352,9 +12454,9 @@ cafjs.com // Canva Pty Ltd : https://canva.com/ // Submitted by Joel Aquilina canva-apps.cn -*.my.canvasite.cn +my.canvasite.cn canva-apps.com -*.my.canva.site +my.canva.site // Carrd : https://carrd.co // Submitted by AJ @@ -12461,7 +12563,6 @@ cloudns.us // Submitted by Khash Sajadi c66.me cloud66.ws -cloud66.zone // CloudAccess.net : https://www.cloudaccess.net/ // Submitted by Pawel Panek @@ -12498,6 +12599,8 @@ cdn.cloudflareglobal.net cust.cloudscale.ch objects.lpg.cloudscale.ch objects.rma.cloudscale.ch +lpg.objectstorage.ch +rma.objectstorage.ch // Clovyr : https://clovyr.io // Submitted by Patrick Nielsen @@ -12531,6 +12634,10 @@ preview.csb.app co.nl co.no +// Cognition AI, Inc. : https://cognition.ai +// Submitted by Philip Papurt +*.devinapps.com + // Combell.com : https://www.combell.com // Submitted by Thomas Wouters webhosting.be @@ -12542,6 +12649,8 @@ ctfcloud.net // Convex : https://convex.dev/ // Submitted by James Cowling +convex.app +convex.cloud convex.site // Coordination Center for TLD RU and XN--P1AI : https://cctld.ru/en/domains/domens_ru/reserved/ @@ -12660,6 +12769,15 @@ dedyn.io deta.app deta.dev +// Dfinity Foundation: https://dfinity.org/ +// Submitted by Dfinity Team +icp0.io +*.raw.icp0.io +icp1.io +*.raw.icp1.io +*.icp.net +caffeine.site + // dhosting.pl Sp. z o.o. : https://dhosting.pl/ // Submitted by Michal Kokoszkiewicz dfirma.pl @@ -12676,7 +12794,10 @@ ondigitalocean.app // DigitalPlat : https://www.digitalplat.org/ // Submitted by Edward Hsing +qzz.io us.kg +xx.kg +dpdns.org // Discord Inc : https://discord.com // Submitted by Sahn Lam @@ -12712,10 +12833,6 @@ dreamhosters.com // Submitted by Infra Team durumis.com -// Drobo : http://www.drobo.com/ -// Submitted by Ricardo Padilha -mydrobo.com - // DuckDNS : http://www.duckdns.org/ // Submitted by Richard Harper duckdns.org @@ -13072,10 +13189,14 @@ en-root.fr mytuleap.com tuleap-partners.com -// Encoretivity AB : https://encore.dev -// Submitted by André Eriksson +// Encoretivity AB : https://encore.cloud +// Submitted by André Eriksson encr.app +frontend.encr.app encoreapi.com +lp.dev +api.lp.dev +objects.lp.dev // encoway GmbH : https://www.encoway.de // Submitted by Marcel Daus @@ -13296,6 +13417,11 @@ mydobiss.com // Submitted by Robin Naundorf fh-muenster.io +// Figma : https://www.figma.com +// Submitted by Nick Frost +figma.site +preview.site + // Filegear Inc. : https://www.filegear.com // Submitted by Jason Zhu filegear.me @@ -13327,6 +13453,10 @@ edgeapp.net forgeblocks.com id.forgerock.io +// FoundryLabs, Inc : https://e2b.dev/ +// Submitted by Jiri Sveceny +e2b.app + // Framer : https://www.framer.com // Submitted by Koen Rouwhorst framer.ai @@ -13428,6 +13558,7 @@ gsj.bz // GitHub, Inc. // Submitted by Patrick Toomey +github.app githubusercontent.com githubpreview.dev github.io @@ -13441,10 +13572,6 @@ gitlab.io gitapp.si gitpage.si -// Glitch, Inc : https://glitch.com -// Submitted by Mads Hartmann -glitch.me - // Global NOG Alliance : https://nogalliance.org/ // Submitted by Sander Steffann nog.community @@ -13576,6 +13703,7 @@ goip.de // Submitted by Shannon McCabe *.hosted.app *.run.app +*.mtls.run.app web.app *.0emm.com appspot.com @@ -13623,14 +13751,14 @@ grayjayleagues.com günstigbestellen.de günstigliefern.de +// Hackclub Nest : https://hackclub.app +// Submitted by Cyteon +hackclub.app + // Häkkinen.fi : https://www.häkkinen.fi/ // Submitted by Eero Häkkinen häkkinen.fi -// Harrison Network : https://hrsn.net -// Submitted by William Harrison -hrsn.dev - // Hashbang : https://hashbang.sh hashbang.sh @@ -13682,6 +13810,11 @@ ravendb.community development.run ravendb.run +// HiDNS : https://www.hidoha.net +// Submitted by ifeng +hidns.co +hidns.vip + // home.pl S.A. : https://home.pl // Submitted by Krzysztof Wolski homesklep.pl @@ -13699,7 +13832,6 @@ hoplix.shop // HOSTBIP REGISTRY : https://www.hostbip.com/ // Submitted by Atanunu Igbunuroghene orx.biz -biz.gl biz.ng co.biz.ng dl.biz.ng @@ -13713,10 +13845,6 @@ ltd.ng ngo.ng plc.ng -// HostFly : https://www.ie.ua -// Submitted by Bohdan Dub -ie.ua - // HostyHosting : https://hostyhosting.com hostyhosting.io @@ -13840,6 +13968,7 @@ botdash.xyz // Submitted by Henrik Willert apps-1and1.com live-website.com +webspace-host.com apps-1and1.net websitebuilder.online app-ionos.space @@ -13867,17 +13996,19 @@ ir.md is-a-good.dev // is-a.dev : https://is-a.dev -// Submitted by William Harrison +// Submitted by William Harrison is-a.dev // IServ GmbH : https://iserv.de -// Submitted by Mario Hoberg +// Submitted by Kim Brodowski iservschule.de mein-iserv.de +schuldock.de schulplattform.de schulserver.de test-iserv.de iserv.dev +iserv.host // Jelastic, Inc. : https://jelastic.com/ // Submitted by Ihor Kolodyuk @@ -13962,6 +14093,7 @@ myjino.ru // Jotelulu S.L. : https://jotelulu.com // Submitted by Daniel Fariña +jote.cloud jotelulu.cloud // JouwWeb B.V. : https://www.jouwweb.nl @@ -14018,9 +14150,16 @@ krellian.net // Submitted by DisposaBoy oya.to +// KV GmbH : https://www.nic.co.de +// Submitted by KV GmbH +// Abuse reports to +co.de + // Laravel Holdings, Inc. : https://laravel.com -// Submitted by André Valentin +// Submitted by André Valentin & James Brooks laravel.cloud +on-forge.com +on-vapor.com // LCube - Professional hosting e.K. : https://www.lcube-webhosting.de // Submitted by Lars Laehn @@ -14083,9 +14222,8 @@ ggff.net *.user.localcert.dev // LocalCert : https://localcert.net -// Submitted by William Harrison +// Submitted by William Harrison localcert.net -localhostcert.net // Localtonet : https://localtonet.com/ // Submitted by Burak Isleyici @@ -14113,14 +14251,12 @@ loginline.site // Submitted by Heiki Lõhmus lohmus.me -// Lokalized : https://lokalized.nl -// Submitted by Noah Taheij -servers.run - // Lovable : https://lovable.dev // Submitted by Fabian Hedin lovable.app lovableproject.com +lovable.run +lovable.sh // LubMAN UMCS Sp. z o.o : https://lubman.pl/ // Submitted by Ireneusz Maliszewski @@ -14170,6 +14306,15 @@ barsy.uk barsy.co.uk barsyonline.co.uk +// Lutra : https://lutra.ai +// Submitted by Joshua Newman +*.lutrausercontent.com + +// Luyani Inc. : https://luyani.com/ +// Submitted by Umut Gumeli +luyani.app +luyani.net + // Magento Commerce // Submitted by Damien Tournoud *.magentosite.cloud @@ -14278,6 +14423,11 @@ sn.mynetname.net routingthecloud.net routingthecloud.org +// Million Software, Inc : https://million.dev/ +// Submitted by Rayhan Noufal Arayilakath +same-app.com +same-preview.com + // minion.systems : http://minion.systems // Submitted by Robert Böttinger csx.cc @@ -14571,6 +14721,10 @@ simplesite.pl 123paginaweb.pt 123minsida.se +// ONID : https://get.onid.ca +// Submitted by ONID Engineering Team +onid.ca + // Open Domains : https://open-domains.net // Submitted by William Harrison is-a-fullstack.dev @@ -14583,6 +14737,10 @@ is-local.org // Submitted by Alexander Varwijk opensocial.site +// OpenAI : https://openai.com +// Submitted by Thomas Shadwell +*.oaiusercontent.com + // OpenCraft GmbH : http://opencraft.com/ // Submitted by Sven Marnach opencraft.hosting @@ -14742,22 +14900,21 @@ xen.prgmr.com priv.at // PROJECT ELIV : https://eliv.kr/ -// Submitted by ELIV Team +// Submitted by PROJECT ELIV Domain Team c01.kr +eliv-cdn.kr eliv-dns.kr +mmv.kr +vki.kr + +// project-study : https://project-study.com +// Submitted by yumenewa +dev.project-study.com // Protonet GmbH : http://protonet.io // Submitted by Martin Meier protonet.io -// PSL Sandbox : https://psl.hrsn.dev -// Submitted by William Harrison -sub.psl.hrsn.dev -*.wc.psl.hrsn.dev -!ignored.wc.psl.hrsn.dev -*.sub.wc.psl.hrsn.dev -!ignored.sub.wc.psl.hrsn.dev - // Publication Presse Communication SARL : https://ppcom.fr // Submitted by Yaacov Akiba Slama chirurgiens-dentistes-en-france.fr @@ -14802,6 +14959,11 @@ qualifioapp.com // Submitted by Vasyl Tsalko ladesk.com +// Qualy : https://qualyhq.com +// Submitted by Raphael Arias +*.qualyhqpartner.com +*.qualyhqportal.com + // QuickBackend : https://www.quickbackend.com // Submitted by Dani Biro qbuser.com @@ -14836,6 +14998,10 @@ in.net myrdbx.io site.rb-hosting.io +// Railway Corporation : https://railway.com +// Submitted by Phineas Walton +up.railway.app + // Rancher Labs, Inc : https://rancher.com // Submitted by Vincent Fiduccia *.on-rancher.cloud @@ -15038,32 +15204,53 @@ logoip.com logoip.de // Scaleway : https://www.scaleway.com/ -// Submitted by Rémy Léone +// Submitted by Scaleway PSL Maintainer fr-par-1.baremetal.scw.cloud fr-par-2.baremetal.scw.cloud nl-ams-1.baremetal.scw.cloud cockpit.fr-par.scw.cloud +ddl.fr-par.scw.cloud +dtwh.fr-par.scw.cloud fnc.fr-par.scw.cloud functions.fnc.fr-par.scw.cloud +ifr.fr-par.scw.cloud k8s.fr-par.scw.cloud nodes.k8s.fr-par.scw.cloud +kafk.fr-par.scw.cloud +mgdb.fr-par.scw.cloud +rdb.fr-par.scw.cloud s3.fr-par.scw.cloud s3-website.fr-par.scw.cloud +scbl.fr-par.scw.cloud whm.fr-par.scw.cloud priv.instances.scw.cloud pub.instances.scw.cloud k8s.scw.cloud cockpit.nl-ams.scw.cloud +ddl.nl-ams.scw.cloud +dtwh.nl-ams.scw.cloud +ifr.nl-ams.scw.cloud k8s.nl-ams.scw.cloud nodes.k8s.nl-ams.scw.cloud +kafk.nl-ams.scw.cloud +mgdb.nl-ams.scw.cloud +rdb.nl-ams.scw.cloud s3.nl-ams.scw.cloud s3-website.nl-ams.scw.cloud +scbl.nl-ams.scw.cloud whm.nl-ams.scw.cloud cockpit.pl-waw.scw.cloud +ddl.pl-waw.scw.cloud +dtwh.pl-waw.scw.cloud +ifr.pl-waw.scw.cloud k8s.pl-waw.scw.cloud nodes.k8s.pl-waw.scw.cloud +kafk.pl-waw.scw.cloud +mgdb.pl-waw.scw.cloud +rdb.pl-waw.scw.cloud s3.pl-waw.scw.cloud s3-website.pl-waw.scw.cloud +scbl.pl-waw.scw.cloud scalebook.scw.cloud smartlabeling.scw.cloud dedibox.fr @@ -15215,9 +15402,13 @@ srht.site apps.lair.io *.stolos.io -// SparrowHost : https://sparrowhost.in/ -// Submitted by Anant Pandey -ind.mom +// sourceWAY GmbH : https://sourceway.de +// Submitted by Richard Reiber +4.at +my.at +my.de +*.nxa.eu +nx.gw // SpeedPartner GmbH : https://www.speedpartner.de/ // Submitted by Stefan Neufeind @@ -15286,6 +15477,11 @@ researched.cx tests.cx surveys.so +// Storacha Network : https://storacha.network +// Submitted by Alan Shaw +ipfs.storacha.link +ipfs.w3s.link + // Storebase : https://www.storebase.io // Submitted by Tony Schirmer storebase.store @@ -15330,8 +15526,10 @@ utwente.io temp-dns.com // Supabase : https://supabase.io -// Submitted by Inian Parameshwaran +// Submitted by Supabase Security supabase.co +realtime.supabase.co +storage.supabase.co supabase.in supabase.net @@ -15368,6 +15566,11 @@ tabitorder.co.il // Submitted by Bjoern Henke taifun-dns.de +// Tailor Inc. : https://www.tailor.tech +// Submitted by Ryuzo Yamamoto +erp.dev +web.erp.dev + // Tailscale Inc. : https://www.tailscale.com // Submitted by David Anderson ts.net @@ -15389,6 +15592,10 @@ taveusercontent.com p.tawk.email p.tawkto.email +// Tche.br : https://tche.br +// Submitted by Bruno Lorensi +tche.br + // team.blue : https://team.blue // Submitted by Cedric Dubois site.tb-hosting.com @@ -15496,7 +15703,6 @@ pro.typeform.com // Uberspace : https://uberspace.de // Submitted by Moritz Werner -*.uberspace.de uber.space // UDR Limited : http://www.udr.hk.com @@ -15550,35 +15756,36 @@ dnsupdate.info // Submitted by Gavin Brown us.org -// V.UA Domain Administrator : https://domain.v.ua/ -// Submitted by Serhii Rostilo +// V.UA Domain Registry: https://www.v.ua/ +// Submitted by Serhii Rostilo v.ua // Val Town, Inc : https://val.town/ // Submitted by Tom MacWright -express.val.run +val.run web.val.run // Vercel, Inc : https://vercel.com/ -// Submitted by Max Leiter +// Submitted by Laurens Duijvesteijn vercel.app v0.build vercel.dev vusercontent.net +vercel.run now.sh // VeryPositive SIA : http://very.lv // Submitted by Danko Aleksejevs 2038.io -// Viprinet Europe GmbH : http://www.viprinet.com -// Submitted by Simon Kissel -router.management - // Virtual-Info : https://www.virtual-info.info/ // Submitted by Adnan RIHAN v-info.info +// VistaBlog : https://vistablog.ir/ +// Submitted by Hossein Piri +vistablog.ir + // Viva Republica, Inc. : https://toss.im/ // Submitted by Deus Team deus-canvas.com @@ -15595,6 +15802,10 @@ voorloper.cloud // Submitted by Masayuki Note wafflecell.com +// Walrus : https://walrus.xyz +// Submitted by Max Spector +wal.app + // Webflow, Inc. : https://www.webflow.com // Submitted by Webflow Security Team webflow.io @@ -15637,15 +15848,24 @@ box.ca // Submitted by Kidd Hustle pages.wiardweb.com -// Wikimedia Labs : https://wikitech.wikimedia.org -// Submitted by Arturo Borrero Gonzalez +// Wikimedia Foundation : https://wikitech.wikimedia.org +// Submitted by Timo Tijhof toolforge.org wmcloud.org +beta.wmcloud.org wmflabs.org // William Harrison : https://wharrison.com.au -// Submitted by William Harrison +// Submitted by William Harrison wdh.app +hrsn.au +vps.hrsn.au +hrsn.dev + +// Windsurf : https://windsurf.com +// Submitted by Douglas Chen +windsurf.app +windsurf.build // WISP : https://wisp.gg // Submitted by Stepan Fedotov @@ -15706,6 +15926,7 @@ xs4all.space yandexcloud.net storage.yandexcloud.net website.yandexcloud.net +sourcecraft.site // YesCourse Pty Ltd : https://yescourse.com // Submitted by Atul Bhouraskar @@ -15752,4 +15973,8 @@ enterprisecloud.nu // Submitted by Gx1.org zone.id +// ZoneABC : https://zoneabc.net +// Submitted by ZoneABC Team +zabc.net + // ===END PRIVATE DOMAINS=== \ No newline at end of file diff --git a/naiveproxy/src/net/base/registry_controlled_domains/effective_tld_names.gperf b/naiveproxy/src/net/base/registry_controlled_domains/effective_tld_names.gperf index 35c1a41b8f..fccb7363ec 100644 --- a/naiveproxy/src/net/base/registry_controlled_domains/effective_tld_names.gperf +++ b/naiveproxy/src/net/base/registry_controlled_domains/effective_tld_names.gperf @@ -57,6 +57,7 @@ struct DomainRule { 3.bg, 0 32-b.it, 4 3utilities.com, 4 +4.at, 4 4.azurestaticapps.net, 4 4.bg, 0 4lima.at, 4 @@ -94,6 +95,7 @@ abbvie, 0 abc, 0 abc.br, 0 abeno.osaka.jp, 0 +abg.ec, 0 abiko.chiba.jp, 0 abira.hokkaido.jp, 0 abkhazia.su, 4 @@ -175,6 +177,7 @@ adachi.tokyo.jp, 0 adaptable.app, 4 adimo.co.uk, 4 adm.br, 0 +adm.ec, 0 adobeaemcloud.com, 4 adobeaemcloud.net, 4 adobeio-static.net, 4 @@ -192,7 +195,9 @@ ae.org, 4 aeg, 0 aejrie.no, 0 aem.live, 4 +aem.network, 4 aem.page, 4 +aem.reviews, 4 aero, 0 aero.mv, 0 aerobatic.aero, 0 @@ -226,6 +231,7 @@ agrigento.it, 0 agro.bj, 0 agro.bo, 0 agro.pl, 0 +agron.ec, 0 aguni.okinawa.jp, 0 ah.cn, 0 ah.no, 0 @@ -246,6 +252,38 @@ air-surveillance.aero, 0 air-traffic-control.aero, 0 airbus, 0 aircraft.aero, 0 +airflow.af-south-1.on.aws, 6 +airflow.ap-east-1.on.aws, 6 +airflow.ap-northeast-1.on.aws, 6 +airflow.ap-northeast-2.on.aws, 6 +airflow.ap-northeast-3.on.aws, 6 +airflow.ap-south-1.on.aws, 6 +airflow.ap-south-2.on.aws, 6 +airflow.ap-southeast-1.on.aws, 6 +airflow.ap-southeast-2.on.aws, 6 +airflow.ap-southeast-3.on.aws, 6 +airflow.ap-southeast-4.on.aws, 6 +airflow.ap-southeast-5.on.aws, 6 +airflow.ca-central-1.on.aws, 6 +airflow.ca-west-1.on.aws, 6 +airflow.cn-north-1.on.amazonwebservices.com.cn, 6 +airflow.cn-northwest-1.on.amazonwebservices.com.cn, 6 +airflow.eu-central-1.on.aws, 6 +airflow.eu-central-2.on.aws, 6 +airflow.eu-north-1.on.aws, 6 +airflow.eu-south-1.on.aws, 6 +airflow.eu-south-2.on.aws, 6 +airflow.eu-west-1.on.aws, 6 +airflow.eu-west-2.on.aws, 6 +airflow.eu-west-3.on.aws, 6 +airflow.il-central-1.on.aws, 6 +airflow.me-central-1.on.aws, 6 +airflow.me-south-1.on.aws, 6 +airflow.sa-east-1.on.aws, 6 +airflow.us-east-1.on.aws, 6 +airflow.us-east-2.on.aws, 6 +airflow.us-west-1.on.aws, 6 +airflow.us-west-2.on.aws, 6 airforce, 0 airkitapps-au.com, 4 airkitapps.com, 4 @@ -410,6 +448,7 @@ ap-southeast-2.elasticbeanstalk.com, 4 ap-southeast-3.airflow.amazonaws.com, 6 ap-southeast-3.elasticbeanstalk.com, 4 ap-southeast-4.airflow.amazonaws.com, 6 +ap-southeast-5.airflow.amazonaws.com, 6 ap.gov.br, 0 ap.gov.pl, 0 ap.it, 0 @@ -417,7 +456,9 @@ ap.leg.br, 4 ap.ngrok.io, 4 aparecida.br, 0 apartments, 0 +api.br, 0 api.gov.uk, 4 +api.lp.dev, 4 api.stdlib.com, 4 apigee.io, 4 app, 0 @@ -438,6 +479,8 @@ appspacehosted.com, 4 appspaceusercontent.com, 4 appspot.com, 4 appudo.net, 4 +appwrite.global, 4 +appwrite.run, 6 aq, 0 aq.it, 0 aquarelle, 0 @@ -468,10 +511,12 @@ army, 0 arna.no, 0 arpa, 0 arq.br, 0 +arqt.ec, 0 art, 0 art.br, 0 art.do, 0 art.dz, 0 +art.ec, 0 art.ht, 0 art.ml, 0 art.pl, 4 @@ -571,6 +616,7 @@ austevoll.no, 0 austrheim.no, 0 auth-fips.us-east-1.amazoncognito.com, 4 auth-fips.us-east-2.amazoncognito.com, 4 +auth-fips.us-gov-east-1.amazoncognito.com, 4 auth-fips.us-gov-west-1.amazoncognito.com, 4 auth-fips.us-west-1.amazoncognito.com, 4 auth-fips.us-west-2.amazoncognito.com, 4 @@ -585,6 +631,8 @@ auth.ap-southeast-1.amazoncognito.com, 4 auth.ap-southeast-2.amazoncognito.com, 4 auth.ap-southeast-3.amazoncognito.com, 4 auth.ap-southeast-4.amazoncognito.com, 4 +auth.ap-southeast-5.amazoncognito.com, 4 +auth.ap-southeast-7.amazoncognito.com, 4 auth.ca-central-1.amazoncognito.com, 4 auth.ca-west-1.amazoncognito.com, 4 auth.eu-central-1.amazoncognito.com, 4 @@ -598,6 +646,7 @@ auth.eu-west-3.amazoncognito.com, 4 auth.il-central-1.amazoncognito.com, 4 auth.me-central-1.amazoncognito.com, 4 auth.me-south-1.amazoncognito.com, 4 +auth.mx-central-1.amazoncognito.com, 4 auth.sa-east-1.amazoncognito.com, 4 auth.us-east-1.amazoncognito.com, 4 auth.us-east-2.amazoncognito.com, 4 @@ -686,6 +735,7 @@ bandai.fukushima.jp, 0 bando.ibaraki.jp, 0 bank, 0 bar, 0 +bar.ec, 0 bar.pro, 0 barcelona, 0 barclaycard, 0 @@ -771,7 +821,6 @@ bel.tr, 0 belem.br, 0 belluno.it, 0 benevento.it, 0 -bentley, 0 bentre.vn, 0 beppu.oita.jp, 0 berg.no, 0 @@ -785,6 +834,7 @@ bestbuy, 0 bet, 0 bet.ar, 0 bet.br, 0 +beta.wmcloud.org, 4 better-than.tv, 4 bf, 0 bg, 0 @@ -834,7 +884,7 @@ biz.cy, 0 biz.dk, 4 biz.et, 0 biz.fj, 0 -biz.gl, 4 +biz.gh, 0 biz.id, 0 biz.in, 0 biz.ki, 0 @@ -1026,6 +1076,7 @@ caa.aero, 0 cab, 0 cable-modem.org, 4 cafe, 0 +caffeine.site, 4 cafjs.com, 4 cagliari.it, 0 cahcesuolo.no, 0 @@ -1197,6 +1248,7 @@ chase, 0 chat, 0 cheap, 0 cheap.jp, 4 +chef.ec, 0 cherkassy.ua, 0 cherkasy.ua, 0 chernigov.ua, 0 @@ -1300,7 +1352,6 @@ cloud.interhostsolutions.be, 4 cloud.metacentrum.cz, 6 cloud.nospamproxy.com, 4 cloud66.ws, 4 -cloud66.zone, 4 cloudaccess.host, 4 cloudaccess.net, 4 cloudapp.net, 4 @@ -1372,6 +1423,7 @@ co.cm, 0 co.com, 4 co.cr, 0 co.cz, 4 +co.de, 4 co.dk, 4 co.dm, 0 co.education, 4 @@ -1613,10 +1665,13 @@ consulado.st, 0 consultant.aero, 0 consulting, 0 consulting.aero, 0 +cont.ec, 0 contact, 0 contagem.br, 0 contractors, 0 control.aero, 0 +convex.app, 4 +convex.cloud, 4 convex.site, 4 cooking, 0 cool, 0 @@ -1643,6 +1698,7 @@ coupons, 0 courses, 0 coz.br, 0 cpa, 0 +cpa.ec, 0 cpa.pro, 0 cpanel.site, 4 cprapid.com, 4 @@ -1679,6 +1735,7 @@ ct.it, 0 ct.us, 0 ctfcloud.net, 4 cu, 0 +cue.ec, 0 cuiaba.br, 0 cuisinella, 0 cuneo.it, 0 @@ -1751,6 +1808,9 @@ dazaifu.fukuoka.jp, 0 dc.us, 0 dclk, 0 dd-dns.de, 4 +ddl.fr-par.scw.cloud, 4 +ddl.nl-ams.scw.cloud, 4 +ddl.pl-waw.scw.cloud, 4 ddns-ip.net, 4 ddns.me, 4 ddns.net, 4 @@ -1795,6 +1855,7 @@ demon.nl, 4 deno-staging.dev, 4 deno.dev, 4 deno.net, 4 +dent.ec, 0 dental, 0 dentist, 0 dep.no, 0 @@ -1813,13 +1874,16 @@ dev-builder.code.com, 6 dev-myqnapcloud.com, 4 dev.adobeaemcloud.com, 6 dev.br, 0 +dev.project-study.com, 4 developer.app, 6 development.run, 4 devices.resinstaging.io, 4 +devinapps.com, 6 df.gov.br, 0 df.leg.br, 4 dfirma.pl, 4 dgca.aero, 0 +dgn.ec, 0 dh.bytemark.co.uk, 4 dhl, 0 diadem.cloud, 4 @@ -1834,6 +1898,7 @@ direct, 0 direct.quickconnect.cn, 4 direct.quickconnect.to, 4 directory, 0 +disco.ec, 0 discordsays.com, 4 discordsez.com, 4 discount, 0 @@ -1879,6 +1944,7 @@ dnsup.net, 4 dnsupdate.info, 4 dnsupdater.de, 4 do, 0 +doc.ec, 0 docs, 0 doctor, 0 does-it.net, 4 @@ -1902,6 +1968,7 @@ dot, 0 dovre.no, 0 download, 0 dp.ua, 0 +dpdns.org, 4 dr.in, 0 dr.tr, 0 drammen.no, 0 @@ -1921,6 +1988,9 @@ dsmynas.net, 4 dsmynas.org, 4 dst.mi.us, 0 dtv, 0 +dtwh.fr-par.scw.cloud, 4 +dtwh.nl-ams.scw.cloud, 4 +dtwh.pl-waw.scw.cloud, 4 dubai, 0 duckdns.org, 4 dunlop, 0 @@ -1980,6 +2050,7 @@ e.bg, 0 e.se, 0 e12.ve, 0 e164.arpa, 0 +e2b.app, 4 e4.cz, 4 earth, 0 east-kazakhstan.su, 4 @@ -2177,6 +2248,7 @@ elb.amazonaws.com.cn, 6 elblag.pl, 0 elementor.cloud, 4 elementor.cool, 4 +eliv-cdn.kr, 4 eliv-dns.kr, 4 elk.pl, 0 elverum.no, 0 @@ -2303,6 +2375,7 @@ enebakk.no, 0 energy, 0 enf.br, 0 eng.br, 0 +eng.ec, 0 eng.jo, 0 eng.pro, 0 engerdal.no, 0 @@ -2328,6 +2401,7 @@ erimo.hokkaido.jp, 0 erni, 0 erotica.hu, 0 erotika.hu, 0 +erp.dev, 4 es, 0 es-1.axarnet.cloud, 4 es.eu.org, 4 @@ -2336,6 +2410,7 @@ es.kr, 0 es.leg.br, 4 esan.hokkaido.jp, 0 esashi.hokkaido.jp, 0 +esm.ec, 0 esp.br, 0 esq, 0 est-a-la-maison.com, 4 @@ -2432,7 +2507,6 @@ expo.app, 4 exposed, 0 express, 0 express.aero, 0 -express.val.run, 4 extraspace, 0 ezproxy.kuleuven.be, 4 f.bg, 0 @@ -2500,6 +2574,7 @@ fi.it, 0 fidelity, 0 fido, 0 fie.ee, 0 +figma.site, 4 filegear-sg.me, 4 filegear.me, 4 film, 0 @@ -2599,6 +2674,7 @@ forum.hu, 0 forumz.info, 4 fosnes.no, 0 fot.br, 0 +fot.ec, 0 foundation, 0 fox, 0 foz.br, 0 @@ -2703,6 +2779,7 @@ from-wv.com, 4 from-wy.com, 4 from.hr, 0 from.tv, 4 +frontend.encr.app, 4 frontier, 0 frosinone.it, 0 frosta.no, 0 @@ -2785,6 +2862,7 @@ ga, 0 ga.us, 0 gaivuotna.no, 0 gal, 0 +gal.ec, 0 gallery, 0 gallo, 0 gallup, 0 @@ -2865,6 +2943,7 @@ giske.no, 0 git-pages.rit.edu, 4 git-repos.de, 4 gitapp.si, 4 +github.app, 4 github.io, 4 githubpreview.dev, 4 githubusercontent.com, 4 @@ -2884,7 +2963,6 @@ glass, 0 gle, 0 gleeze.com, 4 gliding.aero, 0 -glitch.me, 4 gliwice.pl, 4 global, 0 global.prod.fastly.net, 4 @@ -3008,6 +3086,7 @@ gov.cn, 0 gov.co, 0 gov.cx, 0 gov.cy, 0 +gov.cz, 0 gov.dm, 0 gov.do, 0 gov.dz, 0 @@ -3201,6 +3280,7 @@ gw, 0 gwangju.kr, 0 gx.cn, 0 gy, 0 +gye.ec, 0 gyeongbuk.kr, 0 gyeonggi.kr, 0 gyeongnam.kr, 0 @@ -3218,6 +3298,7 @@ hachijo.tokyo.jp, 0 hachinohe.aomori.jp, 0 hachioji.tokyo.jp, 0 hachirogata.akita.jp, 0 +hackclub.app, 4 hacker.replit.dev, 4 hadano.kanagawa.jp, 0 hadsel.no, 0 @@ -3341,6 +3422,8 @@ hidaka.hokkaido.jp, 0 hidaka.kochi.jp, 0 hidaka.saitama.jp, 0 hidaka.wakayama.jp, 0 +hidns.co, 4 +hidns.vip, 4 higashi.fukuoka.jp, 0 higashi.fukushima.jp, 0 higashi.okinawa.jp, 0 @@ -3421,7 +3504,6 @@ hl.cn, 0 hl.no, 0 hlx.live, 4 hlx.page, 4 -hlx3.page, 4 hm, 0 hm.no, 0 hn, 0 @@ -3493,6 +3575,7 @@ hosting.myjino.ru, 6 hosting.ovh.net, 6 hostyhosting.io, 4 hot, 0 +hotel, 0 hotel.hu, 0 hotel.lk, 0 hotel.tz, 0 @@ -3506,6 +3589,7 @@ hoylandet.no, 0 hr, 0 hr.eu.org, 4 hra.health, 4 +hrsn.au, 4 hrsn.dev, 4 hs.kr, 0 hsbc, 0 @@ -3533,6 +3617,7 @@ i.ng, 0 i.ph, 0 i.se, 0 i234.me, 4 +ia.br, 0 ia.us, 0 iamallama.com, 4 ibara.okayama.jp, 0 @@ -3542,6 +3627,7 @@ ibaraki.osaka.jp, 0 ibestad.no, 0 ibigawa.gifu.jp, 0 ibm, 0 +ibr.ec, 0 ibxos.it, 4 ic.gov.pl, 0 icbc, 0 @@ -3556,6 +3642,9 @@ ichinohe.iwate.jp, 0 ichinomiya.aichi.jp, 0 ichinomiya.chiba.jp, 0 ichinoseki.iwate.jp, 0 +icp.net, 6 +icp0.io, 4 +icp1.io, 4 icu, 0 icurus.jp, 4 id, 0 @@ -3579,14 +3668,14 @@ idv.hk, 0 idv.tw, 0 ie, 0 ie.eu.org, 4 -ie.ua, 4 ieee, 0 if.ua, 0 ifm, 0 +ifr.fr-par.scw.cloud, 4 +ifr.nl-ams.scw.cloud, 4 +ifr.pl-waw.scw.cloud, 4 iglesias-carbonia.it, 0 iglesiascarbonia.it, 0 -ignored.sub.wc.psl.hrsn.dev, 5 -ignored.wc.psl.hrsn.dev, 5 iheya.okinawa.jp, 0 iida.nagano.jp, 0 iide.yamagata.jp, 0 @@ -3670,7 +3759,6 @@ ind.br, 0 ind.gt, 0 ind.in, 0 ind.kw, 0 -ind.mom, 4 ind.tn, 0 independent-commission.uk, 4 independent-inquest.uk, 4 @@ -3772,6 +3860,8 @@ ip-dynamic.org, 4 ip.linodeusercontent.com, 4 ip6.arpa, 0 ipfs.nftstorage.link, 4 +ipfs.storacha.link, 4 +ipfs.w3s.link, 4 ipifony.net, 4 ipiranga, 0 iq, 0 @@ -3878,6 +3968,7 @@ isehara.kanagawa.jp, 0 isen.kagoshima.jp, 0 isernia.it, 0 iserv.dev, 4 +iserv.host, 4 iservschule.de, 4 isesaki.gunma.jp, 0 ishigaki.okinawa.jp, 0 @@ -4013,6 +4104,7 @@ jor.br, 0 jorpeland.no, 0 joso.ibaraki.jp, 0 jot, 0 +jote.cloud, 4 jotelulu.cloud, 4 journal.aero, 0 journalist.aero, 0 @@ -4101,6 +4193,9 @@ kadena.okinawa.jp, 0 kadogawa.miyazaki.jp, 0 kadoma.osaka.jp, 0 kafjord.no, 0 +kafk.fr-par.scw.cloud, 4 +kafk.nl-ams.scw.cloud, 4 +kafk.pl-waw.scw.cloud, 4 kaga.ishikawa.jp, 0 kagami.kochi.jp, 0 kagamiishi.fukushima.jp, 0 @@ -4399,6 +4494,7 @@ kontum.vn, 0 konyvelo.hu, 0 koobin.events, 4 koori.fukushima.jp, 0 +kop.id, 0 kopervik.no, 0 koriyama.fukushima.jp, 0 koryo.nara.jp, 0 @@ -4554,7 +4650,6 @@ lamborghini, 0 lamdong.vn, 0 lamer, 0 lanbib.se, 0 -lancaster, 0 land, 0 land-4-sale.us, 4 landing.myjino.ru, 6 @@ -4571,6 +4666,7 @@ larvik.no, 0 lasalle, 0 laspezia.it, 0 lat, 0 +lat.ec, 0 latina.it, 0 latino, 0 latrobe, 0 @@ -4637,7 +4733,6 @@ lib.ca.us, 0 lib.co.us, 0 lib.ct.us, 0 lib.dc.us, 0 -lib.de.us, 4 lib.ee, 0 lib.fl.us, 0 lib.ga.us, 0 @@ -4656,7 +4751,6 @@ lib.me.us, 0 lib.mi.us, 0 lib.mn.us, 0 lib.mo.us, 0 -lib.ms.us, 0 lib.mt.us, 0 lib.nc.us, 0 lib.nd.us, 0 @@ -4730,7 +4824,6 @@ loabat.no, 0 loan, 0 loans, 0 localcert.net, 4 -localhostcert.net, 4 localplayer.dev, 4 localto.net, 6 localtonet.com, 4 @@ -4751,6 +4844,7 @@ logoip.com, 4 logoip.de, 4 lohmus.me, 4 loisirs.bj, 0 +loj.ec, 0 lol, 0 lolipop.io, 4 lolipopmc.jp, 4 @@ -4774,12 +4868,16 @@ loten.no, 0 lotte, 0 lotto, 0 lovable.app, 4 +lovable.run, 4 +lovable.sh, 4 lovableproject.com, 4 love, 0 lovepop.jp, 4 lovesick.jp, 4 lowicz.pl, 0 +lp.dev, 4 lpages.co, 4 +lpg.objectstorage.ch, 4 lpl, 0 lplfinancial, 0 lpusercontent.com, 4 @@ -4817,9 +4915,12 @@ lundbeck, 0 lunner.no, 0 luroy.no, 0 luster.no, 0 +lutrausercontent.com, 6 lutsk.ua, 0 luxe, 0 luxury, 0 +luyani.app, 4 +luyani.net, 4 lv, 0 lv.eu.org, 4 lv.ua, 0 @@ -5006,6 +5107,9 @@ mex.com, 4 mg, 0 mg.gov.br, 0 mg.leg.br, 4 +mgdb.fr-par.scw.cloud, 4 +mgdb.nl-ams.scw.cloud, 4 +mgdb.pl-waw.scw.cloud, 4 mh, 0 mi.it, 0 mi.th, 0 @@ -5198,6 +5302,7 @@ mjondalen.no, 0 mk, 0 mk.eu.org, 4 mk.ua, 0 +mktg.ec, 0 ml, 0 mlb, 0 mlbfan.org, 4 @@ -5205,6 +5310,7 @@ mls, 0 mm, 2 mma, 0 mmafan.biz, 4 +mmv.kr, 4 mn, 0 mn.it, 0 mn.us, 0 @@ -5242,6 +5348,7 @@ molde.no, 0 molise.it, 0 mom, 0 mombetsu.hokkaido.jp, 0 +mon.ec, 0 monash, 0 mond.jp, 4 money, 0 @@ -5307,6 +5414,7 @@ mt.gov.br, 0 mt.it, 0 mt.leg.br, 4 mt.us, 0 +mtls.run.app, 6 mtn, 0 mtr, 0 mu, 0 @@ -5350,8 +5458,10 @@ my-gateway.de, 4 my-router.de, 4 my-vigor.de, 4 my-wan.de, 4 -my.canva.site, 6 -my.canvasite.cn, 6 +my.at, 4 +my.canva.site, 4 +my.canvasite.cn, 4 +my.de, 4 my.eu.org, 4 my.id, 0 myactivedirectory.com, 4 @@ -5371,7 +5481,6 @@ mydns.jp, 4 mydns.tw, 4 mydns.vc, 4 mydobiss.com, 4 -mydrobo.com, 4 myds.me, 4 myeffect.net, 4 myfast.host, 4 @@ -5624,6 +5733,7 @@ net.fj, 0 net.fm, 0 net.ge, 0 net.gg, 0 +net.gh, 0 net.gl, 0 net.gn, 0 net.gp, 0 @@ -5974,6 +6084,7 @@ nt.no, 0 nt.ro, 0 ntdll.top, 4 ntr.br, 0 +ntr.ec, 0 ntt, 0 nu, 0 nu.ca, 0 @@ -5984,6 +6095,8 @@ numazu.shizuoka.jp, 0 nuoro.it, 0 nv.us, 0 nx.cn, 0 +nx.gw, 4 +nxa.eu, 6 ny-1.paas.massivegrid.net, 4 ny-2.paas.massivegrid.net, 4 ny.us, 0 @@ -6000,6 +6113,7 @@ o.bg, 0 o.se, 0 o0o0.jp, 4 o365.cloud.nospamproxy.com, 4 +oaiusercontent.com, 6 oamishirasato.chiba.jp, 0 oarai.ibaraki.jp, 0 obama.fukui.jp, 0 @@ -6009,6 +6123,7 @@ obi, 0 obihiro.hokkaido.jp, 0 obira.hokkaido.jp, 0 obj.ag, 4 +objects.lp.dev, 4 objects.lpg.cloudscale.ch, 4 objects.rma.cloudscale.ch, 4 obl.ong, 4 @@ -6030,6 +6145,7 @@ odesa.ua, 0 odessa.ua, 0 odo.br, 0 odo.replit.dev, 4 +odont.ec, 0 oe.yamagata.jp, 0 of.by, 0 of.je, 4 @@ -6130,10 +6246,12 @@ omuta.fukuoka.jp, 0 on-acorn.io, 6 on-aptible.com, 4 on-fleek.app, 4 +on-forge.com, 4 on-k3s.io, 6 on-rancher.cloud, 6 on-rio.io, 6 on-the-web.tv, 4 +on-vapor.com, 4 on-web.fr, 4 on.biz.ng, 4 on.ca, 0 @@ -6147,6 +6265,7 @@ onfabrica.com, 4 ong, 0 ong.br, 0 onga.fukuoka.jp, 0 +onid.ca, 4 oninferno.net, 4 onion, 0 onjuku.chiba.jp, 0 @@ -6656,7 +6775,6 @@ pr.it, 0 pr.leg.br, 4 pr.ml, 0 pr.us, 0 -pramerica, 0 prato.it, 0 praxi, 0 prd.fr, 0 @@ -6672,6 +6790,7 @@ press.se, 0 presse.km, 0 presse.ml, 0 preview.csb.app, 4 +preview.site, 4 pri.ee, 0 prime, 0 primetel.cloud, 4 @@ -6704,6 +6823,7 @@ prod, 0 production.aero, 0 productions, 0 prof, 0 +prof.ec, 0 prof.pr, 0 profesional.bo, 0 progressive, 0 @@ -6721,6 +6841,8 @@ przeworsk.pl, 0 ps, 0 psc.br, 0 psi.br, 0 +psic.ec, 0 +psiq.ec, 0 psp.gov.pl, 0 psse.gov.pl, 0 pstmn.io, 4 @@ -6729,6 +6851,7 @@ pt.eu.org, 4 pt.it, 0 pu.it, 0 pub, 0 +pub.ec, 0 pub.instances.scw.cloud, 4 pub.sa, 0 publ.cv, 0 @@ -6769,6 +6892,8 @@ qoto.io, 4 qpon, 0 qsl.br, 0 qualifioapp.com, 4 +qualyhqpartner.com, 6 +qualyhqportal.com, 6 quangbinh.vn, 0 quangnam.vn, 0 quangngai.vn, 0 @@ -6779,6 +6904,7 @@ quest, 0 quicksytes.com, 4 quipelements.com, 6 quizzes.cx, 4 +qzz.io, 4 r.appspot.com, 6 r.bg, 0 r.cdn77.net, 4 @@ -6817,8 +6943,13 @@ ravendb.community, 4 ravendb.run, 4 ravenna.it, 0 ravpage.co.il, 4 +raw.icp0.io, 6 +raw.icp1.io, 6 rawa-maz.pl, 0 rc.it, 0 +rdb.fr-par.scw.cloud, 4 +rdb.nl-ams.scw.cloud, 4 +rdb.pl-waw.scw.cloud, 4 rdy.jp, 4 re, 0 re.it, 0 @@ -6832,6 +6963,7 @@ readymade.jp, 4 realestate, 0 realestate.pl, 0 realm.cz, 4 +realtime.supabase.co, 4 realtor, 0 realty, 0 rebun.hokkaido.jp, 0 @@ -6846,7 +6978,6 @@ recreation.aero, 0 red, 0 red.sv, 0 redirectme.net, 4 -redstone, 0 redumbrella, 0 reed.replit.dev, 4 reg.dk, 4 @@ -6924,6 +7055,7 @@ ringerike.no, 0 ringsaker.no, 0 rio, 0 rio.br, 0 +rio.ec, 0 riobranco.br, 0 riopreto.br, 0 rip, 0 @@ -6937,6 +7069,7 @@ rj.gov.br, 0 rj.leg.br, 4 rl.no, 0 rm.it, 0 +rma.objectstorage.ch, 4 rn.gov.br, 0 rn.it, 0 rn.leg.br, 4 @@ -6961,7 +7094,6 @@ room, 0 roros.no, 0 rost.no, 0 rotorcraft.aero, 0 -router.management, 4 routingthecloud.com, 4 routingthecloud.net, 4 routingthecloud.org, 4 @@ -6972,6 +7104,7 @@ royken.no, 0 royrvik.no, 0 rr.gov.br, 0 rr.leg.br, 4 +rrpp.ec, 0 rs, 0 rs.ba, 4 rs.gov.br, 0 @@ -7377,6 +7510,7 @@ sakurai.nara.jp, 0 sakuratan.com, 4 sakuraweb.com, 4 sakyo.kyoto.jp, 0 +sal.ec, 0 salangen.no, 0 salat.no, 0 sale, 0 @@ -7386,6 +7520,8 @@ saloon.jp, 4 saltdal.no, 0 salud.bo, 0 salvador.br, 0 +same-app.com, 4 +same-preview.com, 4 samegawa.fukushima.jp, 0 samnanger.no, 0 sampa.br, 0 @@ -7460,6 +7596,9 @@ sc.ug, 0 sc.us, 0 scalebook.scw.cloud, 4 scb, 0 +scbl.fr-par.scw.cloud, 4 +scbl.nl-ams.scw.cloud, 4 +scbl.pl-waw.scw.cloud, 4 sch.ae, 0 sch.id, 0 sch.ir, 0 @@ -7483,7 +7622,7 @@ school.ge, 0 school.nz, 0 school.za, 0 schoolbus.jp, 4 -schools.nsw.edu.au, 0 +schuldock.de, 4 schule, 0 schulplattform.de, 4 schulserver.de, 4 @@ -7514,6 +7653,7 @@ secure, 0 security, 0 securitytactics.com, 4 seek, 0 +seg.ar, 0 seg.br, 0 seidat.net, 4 seihi.nagasaki.jp, 0 @@ -7575,7 +7715,6 @@ servepics.com, 4 servequake.com, 4 server-on.net, 4 servername.us, 4 -servers.run, 4 servesarcasm.com, 4 service.gov.scot, 4 service.gov.uk, 4 @@ -7699,6 +7838,7 @@ shonai.fukuoka.jp, 0 shonai.yamagata.jp, 0 shoo.okayama.jp, 0 shop, 0 +shop.brendly.ba, 4 shop.brendly.hr, 4 shop.brendly.rs, 4 shop.ht, 0 @@ -7813,6 +7953,7 @@ soc.srcf.net, 4 soccer, 0 sochi.su, 4 social, 0 +social.br, 0 soctrang.vn, 0 sodegaura.chiba.jp, 0 soeda.fukuoka.jp, 0 @@ -7853,6 +7994,7 @@ sos.pl, 0 sosa.chiba.jp, 0 sosnowiec.pl, 0 soundcast.me, 4 +sourcecraft.site, 4 sowa.ibaraki.jp, 0 soy, 0 sp.gov.br, 0 @@ -7934,6 +8076,7 @@ stokke.no, 0 stolos.io, 6 stor-elvdal.no, 0 storage, 0 +storage.supabase.co, 4 storage.yandexcloud.net, 4 stord.no, 0 stordal.no, 0 @@ -8000,8 +8143,6 @@ stufftoread.com, 4 style, 0 su, 0 sub.jp, 4 -sub.psl.hrsn.dev, 4 -sub.wc.psl.hrsn.dev, 6 subsc-pay.com, 4 subsc-pay.net, 4 sucks, 0 @@ -8195,6 +8336,7 @@ taxi.br, 0 tayninh.vn, 0 tc, 0 tc.br, 0 +tche.br, 4 tci, 0 tcp4.me, 4 td, 0 @@ -8208,6 +8350,7 @@ tec.br, 0 tec.mi.us, 0 tec.ve, 0 tech, 0 +tech.ec, 0 tech.orange, 4 technology, 0 tecnologia.bo, 0 @@ -8424,14 +8567,41 @@ trani-barletta-andria.it, 0 traniandriabarletta.it, 0 tranibarlettaandria.it, 0 tranoy.no, 0 +transfer-webapp-fips.us-gov-east-1.on.aws, 4 +transfer-webapp-fips.us-gov-west-1.on.aws, 4 +transfer-webapp.af-south-1.on.aws, 4 +transfer-webapp.ap-east-1.on.aws, 4 transfer-webapp.ap-northeast-1.on.aws, 4 +transfer-webapp.ap-northeast-2.on.aws, 4 +transfer-webapp.ap-northeast-3.on.aws, 4 +transfer-webapp.ap-south-1.on.aws, 4 +transfer-webapp.ap-south-2.on.aws, 4 transfer-webapp.ap-southeast-1.on.aws, 4 transfer-webapp.ap-southeast-2.on.aws, 4 +transfer-webapp.ap-southeast-3.on.aws, 4 +transfer-webapp.ap-southeast-4.on.aws, 4 +transfer-webapp.ap-southeast-5.on.aws, 4 +transfer-webapp.ca-central-1.on.aws, 4 +transfer-webapp.ca-west-1.on.aws, 4 +transfer-webapp.cn-north-1.on.amazonwebservices.com.cn, 4 +transfer-webapp.cn-northwest-1.on.amazonwebservices.com.cn, 4 transfer-webapp.eu-central-1.on.aws, 4 +transfer-webapp.eu-central-2.on.aws, 4 transfer-webapp.eu-north-1.on.aws, 4 +transfer-webapp.eu-south-1.on.aws, 4 +transfer-webapp.eu-south-2.on.aws, 4 transfer-webapp.eu-west-1.on.aws, 4 +transfer-webapp.eu-west-2.on.aws, 4 +transfer-webapp.eu-west-3.on.aws, 4 +transfer-webapp.il-central-1.on.aws, 4 +transfer-webapp.me-central-1.on.aws, 4 +transfer-webapp.me-south-1.on.aws, 4 +transfer-webapp.sa-east-1.on.aws, 4 transfer-webapp.us-east-1.on.aws, 4 transfer-webapp.us-east-2.on.aws, 4 +transfer-webapp.us-gov-east-1.on.aws, 4 +transfer-webapp.us-gov-west-1.on.aws, 4 +transfer-webapp.us-west-1.on.aws, 4 transfer-webapp.us-west-2.on.aws, 4 translate.goog, 4 translated.page, 4 @@ -8528,12 +8698,14 @@ tt.im, 0 tube, 0 tucker.replit.dev, 4 tui, 0 +tul.ec, 0 tula.su, 4 tuleap-partners.com, 4 tunes, 0 tunk.org, 4 tur.ar, 0 tur.br, 0 +tur.ec, 0 turek.pl, 0 turin.it, 0 turystyka.pl, 0 @@ -8580,7 +8752,6 @@ ua, 0 ubank, 0 ube.yamaguchi.jp, 0 uber.space, 4 -uberspace.de, 6 ubs, 0 uchihara.ibaraki.jp, 0 uchiko.ehime.jp, 0 @@ -8600,6 +8771,7 @@ ug.gov.pl, 0 ugim.gov.pl, 0 uh-oh.jp, 4 ui.nabu.casa, 4 +uio.ec, 0 uji.kyoto.jp, 0 ujiie.tochigi.jp, 0 ujitawara.kyoto.jp, 0 @@ -8644,6 +8816,7 @@ uol, 0 uonuma.niigata.jp, 0 uozu.toyama.jp, 0 up.in, 0 +up.railway.app, 4 upow.gov.pl, 0 upper.jp, 4 uppo.gov.pl, 0 @@ -8738,6 +8911,7 @@ vagsoy.no, 0 vaksdal.no, 0 val-d-aosta.it, 0 val-daosta.it, 0 +val.run, 4 vald-aosta.it, 0 valdaosta.it, 0 valer.hedmark.no, 0 @@ -8784,6 +8958,7 @@ ventures, 0 verbania.it, 0 vercel.app, 4 vercel.dev, 4 +vercel.run, 4 vercelli.it, 0 verdal.no, 0 verisign, 0 @@ -8799,6 +8974,7 @@ vestre-toten.no, 0 vestvagoy.no, 0 vet, 0 vet.br, 0 +vet.ec, 0 veterinaire.fr, 4 veterinaire.km, 0 vevelstad.no, 0 @@ -8859,11 +9035,13 @@ virtualserver.io, 4 virtualuser.de, 4 visa, 0 vision, 0 +vistablog.ir, 4 viterbo.it, 0 viva, 0 vivian.jp, 4 vivo, 0 vix.br, 0 +vki.kr, 4 vlaanderen, 0 vladikavkaz.ru, 4 vladikavkaz.su, 4 @@ -8890,6 +9068,7 @@ vp4.me, 4 vpndns.net, 4 vpnplus.to, 4 vps-host.net, 4 +vps.hrsn.au, 4 vps.mcdir.ru, 4 vps.myjino.ru, 6 vr.it, 0 @@ -8924,6 +9103,7 @@ wakayama.wakayama.jp, 0 wake.okayama.jp, 0 wakkanai.hokkaido.jp, 0 wakuya.miyagi.jp, 0 +wal.app, 4 walbrzych.pl, 0 wales, 0 walmart, 0 @@ -8945,7 +9125,6 @@ waw.pl, 0 wazuka.kyoto.jp, 0 wb.crm.dev, 6 wc.crm.dev, 6 -wc.psl.hrsn.dev, 6 wd.crm.dev, 6 wdh.app, 4 we.bs, 4 @@ -8955,6 +9134,7 @@ weatherchannel, 0 web.app, 4 web.bo, 0 web.do, 0 +web.erp.dev, 4 web.gu, 0 web.id, 0 web.in, 4 @@ -8986,6 +9166,7 @@ website, 0 website.yandexcloud.net, 4 websitebuilder.online, 4 websozai.jp, 4 +webspace-host.com, 4 webspace.rocks, 4 webspaceconfig.de, 4 webthings.io, 4 @@ -9061,6 +9242,8 @@ williamhill, 0 win, 0 winb.gov.pl, 0 windows, 0 +windsurf.app, 4 +windsurf.build, 4 wine, 0 winners, 0 wios.gov.pl, 0 @@ -9590,8 +9773,11 @@ xn--zf0avx.hk, 0 xn--zfr164b, 0 xnbay.com, 4 xs4all.space, 4 +xx.kg, 4 xxx, 0 +xxx.ec, 0 xyz, 0 +xyz.br, 0 xz.cn, 0 y.bg, 0 y.se, 0 @@ -9720,6 +9906,7 @@ za.bz, 4 za.com, 4 za.net, 4 za.org, 4 +zabc.net, 4 zachpomor.pl, 0 zagan.pl, 0 zakarpattia.ua, 0 diff --git a/naiveproxy/src/net/base/registry_controlled_domains/registry_controlled_domain.cc b/naiveproxy/src/net/base/registry_controlled_domains/registry_controlled_domain.cc index ffe8e296d6..dc7b7fda50 100644 --- a/naiveproxy/src/net/base/registry_controlled_domains/registry_controlled_domain.cc +++ b/naiveproxy/src/net/base/registry_controlled_domains/registry_controlled_domain.cc @@ -384,12 +384,10 @@ size_t DoPermissiveGetHostRegistryLength(T host, mapping.is_canonical = true; // Try to append the canonicalized version of this component. - int current_len = static_cast(current - begin); - if (!url::CanonicalizeHostSubstring( - host.data(), url::Component(static_cast(begin), current_len), - &canon_output)) { + T host_view = host.substr(begin, current - begin); + if (!url::CanonicalizeHostSubstring(host_view, &canon_output)) { // Failed to canonicalize this component; append as-is. - AppendInvalidString(host.substr(begin, current_len), &canon_output); + AppendInvalidString(host_view, &canon_output); mapping.is_canonical = false; } @@ -460,10 +458,7 @@ size_t DoPermissiveGetHostRegistryLength(T host, url::StdStringCanonOutput try_output(&try_string); if (!url::CanonicalizeHostSubstring( - host.data(), - url::Component( - current_try, - static_cast(mapping.original_end) - current_try), + host.substr(current_try, mapping.original_end - current_try), &try_output)) { continue; // Invalid substring, skip. } @@ -505,8 +500,7 @@ bool SameDomainOrHost(std::string_view host1, std::string GetDomainAndRegistry(const GURL& gurl, PrivateRegistryFilter filter) { - return std::string( - GetDomainAndRegistryAsStringPiece(gurl.host_piece(), filter)); + return std::string(GetDomainAndRegistryAsStringPiece(gurl.host(), filter)); } std::string GetDomainAndRegistry(const url::Origin& origin, @@ -533,7 +527,7 @@ std::string_view GetDomainAndRegistryAsStringPiece( bool SameDomainOrHost(const GURL& gurl1, const GURL& gurl2, PrivateRegistryFilter filter) { - return SameDomainOrHost(gurl1.host_piece(), gurl2.host_piece(), filter); + return SameDomainOrHost(gurl1.host(), gurl2.host(), filter); } bool SameDomainOrHost(const url::Origin& origin1, @@ -552,14 +546,13 @@ bool SameDomainOrHost(const url::Origin& origin1, bool SameDomainOrHost(const GURL& gurl, const url::Origin& origin, PrivateRegistryFilter filter) { - return SameDomainOrHost(gurl.host_piece(), origin.host(), filter); + return SameDomainOrHost(gurl.host(), origin.host(), filter); } size_t GetRegistryLength(const GURL& gurl, UnknownRegistryFilter unknown_filter, PrivateRegistryFilter private_filter) { - return GetRegistryLengthImpl(gurl.host_piece(), unknown_filter, - private_filter) + return GetRegistryLengthImpl(gurl.host(), unknown_filter, private_filter) .registry_length; } diff --git a/naiveproxy/src/net/base/request_priority.cc b/naiveproxy/src/net/base/request_priority.cc index 5e6918b6c1..92c7a7e8a0 100644 --- a/naiveproxy/src/net/base/request_priority.cc +++ b/naiveproxy/src/net/base/request_priority.cc @@ -8,6 +8,7 @@ namespace net { +// LINT.IfChange(RequestPriorityToString) const char* RequestPriorityToString(RequestPriority priority) { switch (priority) { case THROTTLED: @@ -25,5 +26,6 @@ const char* RequestPriorityToString(RequestPriority priority) { } NOTREACHED(); } +// LINT.ThenChange(//tools/metrics/histograms/metadata/network/histograms.xml:RequestPriority) } // namespace net diff --git a/naiveproxy/src/net/base/scheme_host_port_matcher_rule.cc b/naiveproxy/src/net/base/scheme_host_port_matcher_rule.cc index 0f7762e5f3..baaa9f9f63 100644 --- a/naiveproxy/src/net/base/scheme_host_port_matcher_rule.cc +++ b/naiveproxy/src/net/base/scheme_host_port_matcher_rule.cc @@ -12,6 +12,7 @@ #include "net/base/host_port_pair.h" #include "net/base/parse_number.h" #include "net/base/url_util.h" +#include "url/gurl.h" #include "url/url_util.h" namespace net { @@ -128,14 +129,14 @@ SchemeHostPortMatcherResult SchemeHostPortMatcherHostnamePatternRule::Evaluate( return SchemeHostPortMatcherResult::kNoMatch; } - if (!optional_scheme_.empty() && url.scheme() != optional_scheme_) { + if (!optional_scheme_.empty() && url.GetScheme() != optional_scheme_) { // Didn't match scheme expectation. return SchemeHostPortMatcherResult::kNoMatch; } // Note it is necessary to lower-case the host, since GURL uses capital // letters for percent-escaped characters. - return base::MatchPattern(url.host(), hostname_pattern_) + return base::MatchPattern(url.GetHost(), hostname_pattern_) ? SchemeHostPortMatcherResult::kInclude : SchemeHostPortMatcherResult::kNoMatch; } @@ -186,14 +187,14 @@ SchemeHostPortMatcherResult SchemeHostPortMatcherIPHostRule::Evaluate( return SchemeHostPortMatcherResult::kNoMatch; } - if (!optional_scheme_.empty() && url.scheme() != optional_scheme_) { + if (!optional_scheme_.empty() && url.GetScheme() != optional_scheme_) { // Didn't match scheme expectation. return SchemeHostPortMatcherResult::kNoMatch; } // Note it is necessary to lower-case the host, since GURL uses capital // letters for percent-escaped characters. - return base::MatchPattern(url.host(), ip_host_) + return base::MatchPattern(url.GetHost(), ip_host_) ? SchemeHostPortMatcherResult::kInclude : SchemeHostPortMatcherResult::kNoMatch; } @@ -230,7 +231,7 @@ SchemeHostPortMatcherResult SchemeHostPortMatcherIPBlockRule::Evaluate( if (!url.HostIsIPAddress()) return SchemeHostPortMatcherResult::kNoMatch; - if (!optional_scheme_.empty() && url.scheme() != optional_scheme_) { + if (!optional_scheme_.empty() && url.GetScheme() != optional_scheme_) { // Didn't match scheme expectation. return SchemeHostPortMatcherResult::kNoMatch; } diff --git a/naiveproxy/src/net/base/schemeful_site.h b/naiveproxy/src/net/base/schemeful_site.h index 1b49ae5656..939cacb742 100644 --- a/naiveproxy/src/net/base/schemeful_site.h +++ b/naiveproxy/src/net/base/schemeful_site.h @@ -162,6 +162,10 @@ class NET_EXPORT SchemefulSite { const SchemefulSite& right) = default; friend auto operator<=>(const SchemefulSite& left, const SchemefulSite& right) = default; + template + friend H AbslHashValue(H h, const SchemefulSite& site) { + return H::combine(std::move(h), site.site_as_origin_); + } private: // IPC serialization code needs to access internal origin. diff --git a/naiveproxy/src/net/base/sockaddr_util_posix.cc b/naiveproxy/src/net/base/sockaddr_util_posix.cc index c49fbbdd1c..9924ae36d4 100644 --- a/naiveproxy/src/net/base/sockaddr_util_posix.cc +++ b/naiveproxy/src/net/base/sockaddr_util_posix.cc @@ -2,72 +2,61 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/390223051): Remove C-library calls to fix the errors. -#pragma allow_unsafe_libc_calls -#endif - #include "net/base/sockaddr_util_posix.h" #include -#include #include #include -#include "base/compiler_specific.h" -#include "base/debug/crash_logging.h" -#include "base/debug/dump_without_crashing.h" +#include + +#include "base/containers/span.h" #include "build/build_config.h" #include "net/base/sockaddr_storage.h" namespace net { -bool FillUnixAddress(const std::string& socket_path, +bool FillUnixAddress(std::string_view socket_path, bool use_abstract_namespace, SockaddrStorage* address) { // Caller should provide a non-empty path for the socket address. - if (socket_path.empty()) + if (socket_path.empty()) { return false; + } + + struct sockaddr_un* socket_addr = + reinterpret_cast(&address->addr_storage); + // Location to write the path. + base::span path_dest = base::span(socket_addr->sun_path); + + // The length of the path, including the nul. + const size_t path_size = socket_path.size() + 1; - size_t path_max = address->addr_len - offsetof(struct sockaddr_un, sun_path); // Non abstract namespace pathname should be null-terminated. Abstract // namespace pathname must start with '\0'. So, the size is always greater // than socket_path size by 1. - size_t path_size = socket_path.size() + 1; - if (path_size > path_max) + if (path_size > path_dest.size()) { return false; - - struct sockaddr_un* socket_addr = - reinterpret_cast(address->addr()); - - // We want to change the behavior here to limit path size to the length of - // `sun_path`, rather than the current behavior. This is code is to test the - // viability of doing so. - // - // TODO(crbug.com/416481248): Remove this logic, and, if all goes well, change - // behavior of the code above. - if (path_size > sizeof(socket_addr->sun_path)) { - SCOPED_CRASH_KEY_NUMBER("crbug-416481248", "domain-socket-path-len", - path_size); - base::debug::DumpWithoutCrashing(); } - memset(socket_addr, 0, address->addr_len); + // Zero out the entire address struct. + address->addr_storage = {}; + socket_addr->sun_family = AF_UNIX; address->addr_len = path_size + offsetof(struct sockaddr_un, sun_path); if (!use_abstract_namespace) { - memcpy(socket_addr->sun_path, socket_path.c_str(), socket_path.size()); + // Copy the path, except the terminating terminating '\0'. `path_dest` was + // already filled with zeroes. + path_dest.copy_prefix_from(socket_path); return true; } #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) // Convert the path given into abstract socket name. It must start with - // the '\0' character, so we are adding it. |addr_len| must specify the - // length of the structure exactly, as potentially the socket name may - // have '\0' characters embedded (although we don't support this). - // Note that addr.sun_path is already zero initialized. - UNSAFE_TODO(memcpy(socket_addr->sun_path + 1, socket_path.c_str(), - socket_path.size());) + // the '\0' character, skip over it, as it should already be zero. `addr_len` + // must specify the length of the structure exactly, as potentially the socket + // name may have '\0' characters embedded (although we don't support this). + path_dest.subspan(1u).copy_prefix_from(socket_path); return true; #else return false; diff --git a/naiveproxy/src/net/base/sockaddr_util_posix.h b/naiveproxy/src/net/base/sockaddr_util_posix.h index 01eb72ec67..d302c08af5 100644 --- a/naiveproxy/src/net/base/sockaddr_util_posix.h +++ b/naiveproxy/src/net/base/sockaddr_util_posix.h @@ -5,7 +5,7 @@ #ifndef NET_BASE_SOCKADDR_UTIL_POSIX_H_ #define NET_BASE_SOCKADDR_UTIL_POSIX_H_ -#include +#include #include "net/base/net_export.h" @@ -15,7 +15,7 @@ struct SockaddrStorage; // Fills |address| with |socket_path| and its length. For Android or Linux // platform, this supports abstract namespaces. -NET_EXPORT bool FillUnixAddress(const std::string& socket_path, +NET_EXPORT bool FillUnixAddress(std::string_view socket_path, bool use_abstract_namespace, SockaddrStorage* address); diff --git a/naiveproxy/src/net/base/task/task_runner.cc b/naiveproxy/src/net/base/task/task_runner.cc index d230080ed0..66bde32b3f 100644 --- a/naiveproxy/src/net/base/task/task_runner.cc +++ b/naiveproxy/src/net/base/task/task_runner.cc @@ -24,10 +24,12 @@ const scoped_refptr& GetTaskRunner( if (GetMetricsSubSampler().ShouldSample(0.001)) { base::UmaHistogramEnumeration("Net.TaskRunner.RequestPriority", priority); } - if (priority == RequestPriority::HIGHEST && - internal::GetTaskRunnerGlobals().high_priority_task_runner) { - return internal::GetTaskRunnerGlobals().high_priority_task_runner; + + if (internal::GetTaskRunnerGlobals().task_runners[priority]) { + return internal::GetTaskRunnerGlobals().task_runners[priority]; } + // Fall back to the default task runner if the embedder does not inject one, + // for example, when the NetworkServiceTaskScheduler feature is disabled. return base::SingleThreadTaskRunner::GetCurrentDefault(); } diff --git a/naiveproxy/src/net/base/task/task_runner.h b/naiveproxy/src/net/base/task/task_runner.h index 434ad1217a..f84743e44c 100644 --- a/naiveproxy/src/net/base/task/task_runner.h +++ b/naiveproxy/src/net/base/task/task_runner.h @@ -5,6 +5,8 @@ #ifndef NET_BASE_TASK_TASK_RUNNER_H_ #define NET_BASE_TASK_TASK_RUNNER_H_ +#include + #include "base/memory/scoped_refptr.h" #include "base/task/single_thread_task_runner.h" #include "net/base/net_export.h" @@ -33,9 +35,10 @@ struct NET_EXPORT TaskRunnerGlobals { TaskRunnerGlobals(); ~TaskRunnerGlobals(); - // Task runner specifically for `net::RequestPriority::HIGHEST` tasks. + // Task runners for each `net::RequestPriority` level. // This is set by the embedder (e.g., NetworkServiceTaskScheduler). - scoped_refptr high_priority_task_runner; + std::array, NUM_PRIORITIES> + task_runners; }; NET_EXPORT TaskRunnerGlobals& GetTaskRunnerGlobals(); diff --git a/naiveproxy/src/net/base/test_proxy_delegate.cc b/naiveproxy/src/net/base/test_proxy_delegate.cc index 1bf09c0b4d..620a6df48f 100644 --- a/naiveproxy/src/net/base/test_proxy_delegate.cc +++ b/naiveproxy/src/net/base/test_proxy_delegate.cc @@ -8,6 +8,8 @@ #include #include +#include "base/types/expected.h" +#include "net/base/completion_once_callback.h" #include "net/base/net_errors.h" #include "net/base/proxy_chain.h" #include "net/base/proxy_server.h" @@ -47,9 +49,64 @@ void TestProxyDelegate::MakeOnTunnelHeadersReceivedFail(Error result) { on_tunnel_headers_received_result_ = result; } +void TestProxyDelegate::MaybeCreateOnBeforeTunnelRequestRunLoop() { + if (on_before_tunnel_request_run_loop_) { + return; + } + on_before_tunnel_request_run_loop_ = std::make_unique(); +} + +void TestProxyDelegate::MakeOnBeforeTunnelRequestCompleteAsync() { + CHECK(!on_before_tunnel_request_returns_async_); + on_before_tunnel_request_returns_async_ = true; +} + +void TestProxyDelegate::ResumeOnBeforeTunnelRequest() { + CHECK(on_before_tunnel_request_returns_async_); + CHECK(on_before_tunnel_request_callback_); + std::move(on_before_tunnel_request_callback_).Run(); +} + +void TestProxyDelegate::WaitForOnBeforeTunnelRequestAsyncCompletion() { + CHECK(on_before_tunnel_request_returns_async_); + // We don't know whether WaitForOnBeforeTunnelRequestAsyncCompletion or + // OnBeforeTunnelRequest will execute first. Allow creating the run loop in + // both places to account for that. + MaybeCreateOnBeforeTunnelRequestRunLoop(); + on_before_tunnel_request_run_loop_->Run(); + on_before_tunnel_request_run_loop_.reset(); +} + +void TestProxyDelegate::MaybeCreateOnTunnelHeadersReceivedRunLoop() { + if (on_tunnel_headers_received_run_loop_) { + return; + } + on_tunnel_headers_received_run_loop_ = std::make_unique(); +} + +void TestProxyDelegate::MakeOnTunnelHeadersReceivedCompleteAsync() { + CHECK(!on_tunnel_headers_received_returns_async_); + on_tunnel_headers_received_returns_async_ = true; +} +void TestProxyDelegate::ResumeOnTunnelHeadersReceived() { + CHECK(on_tunnel_headers_received_returns_async_); + CHECK(on_tunnel_headers_received_callback_); + std::move(on_tunnel_headers_received_callback_) + .Run(on_tunnel_headers_received_result_); +} +void TestProxyDelegate::WaitForOnTunnelHeadersReceivedAsyncCompletion() { + CHECK(on_tunnel_headers_received_returns_async_); + // We don't know whether WaitForOnTunnelHeadersReceivedAsyncCompletion or + // OnTunnelHeadersReceived will execute first. Allow creating the run loop in + // both places to account for that. + MaybeCreateOnTunnelHeadersReceivedRunLoop(); + on_tunnel_headers_received_run_loop_->Run(); + on_tunnel_headers_received_run_loop_.reset(); +} + void TestProxyDelegate::VerifyOnTunnelHeadersReceived( const ProxyChain& proxy_chain, - size_t chain_index, + size_t proxy_index, const std::string& response_header_name, const std::string& response_header_value, size_t call_index) const { @@ -61,7 +118,7 @@ void TestProxyDelegate::VerifyOnTunnelHeadersReceived( EXPECT_EQ(proxy_chain, on_tunnel_headers_received_proxy_chains_.at(call_index)); - EXPECT_EQ(chain_index, + EXPECT_EQ(proxy_index, on_tunnel_headers_received_chain_indices_.at(call_index)); scoped_refptr response_headers = @@ -88,6 +145,13 @@ void TestProxyDelegate::OnResolveProxy( void TestProxyDelegate::OnSuccessfulRequestAfterFailures( const ProxyRetryInfoMap& proxy_retry_info) {} +std::optional TestProxyDelegate::CanFalloverToNextProxyOverride( + const net::ProxyChain& proxy_chain, + int net_error) { + ++on_can_fallover_to_next_proxy_override_count_; + return std::nullopt; +} + void TestProxyDelegate::OnFallback(const ProxyChain& bad_chain, int net_error) { } @@ -97,31 +161,56 @@ std::string TestProxyDelegate::GetExtraHeaderValue( return ProxyServerToProxyUri(proxy_server); } -Error TestProxyDelegate::OnBeforeTunnelRequest( +base::expected +TestProxyDelegate::OnBeforeTunnelRequest( const ProxyChain& proxy_chain, - size_t chain_index, - HttpRequestHeaders* extra_headers) { + size_t proxy_index, + OnBeforeTunnelRequestCallback callback) { on_before_tunnel_request_call_count_++; + HttpRequestHeaders extra_headers; if (extra_header_name_) { - extra_headers->SetHeader( + extra_headers.SetHeader( *extra_header_name_, - GetExtraHeaderValue(proxy_chain.GetProxyServer(chain_index))); + GetExtraHeaderValue(proxy_chain.GetProxyServer(proxy_index))); } - return OK; + if (on_before_tunnel_request_returns_async_) { + // We don't know whether OnBeforeTunnelRequest or + // WaitForOnBeforeTunnelRequestAsyncCompletion will execute first. Allow + // creating the run loop in both places to account for that. + MaybeCreateOnBeforeTunnelRequestRunLoop(); + on_before_tunnel_request_run_loop_->Quit(); + on_before_tunnel_request_callback_ = + base::BindOnce(std::move(callback), std::move(extra_headers)); + return base::unexpected(ERR_IO_PENDING); + } + + return extra_headers; } Error TestProxyDelegate::OnTunnelHeadersReceived( const ProxyChain& proxy_chain, - size_t chain_index, - const HttpResponseHeaders& response_headers) { + size_t proxy_index, + const HttpResponseHeaders& response_headers, + CompletionOnceCallback callback) { on_tunnel_headers_received_headers_.push_back( base::MakeRefCounted( response_headers.raw_headers())); on_tunnel_headers_received_proxy_chains_.push_back(proxy_chain); - on_tunnel_headers_received_chain_indices_.push_back(chain_index); + on_tunnel_headers_received_chain_indices_.push_back(proxy_index); + + if (on_tunnel_headers_received_returns_async_) { + // We don't know whether OnBeforeTunnelRequest or + // WaitForOnBeforeTunnelRequestAsyncCompletion will execute first. Allow + // creating the run loop in both places to account for that. + MaybeCreateOnTunnelHeadersReceivedRunLoop(); + on_tunnel_headers_received_run_loop_->Quit(); + on_tunnel_headers_received_callback_ = std::move(callback); + return ERR_IO_PENDING; + } + return on_tunnel_headers_received_result_; } diff --git a/naiveproxy/src/net/base/test_proxy_delegate.h b/naiveproxy/src/net/base/test_proxy_delegate.h index 9d03b8beb2..a16389db72 100644 --- a/naiveproxy/src/net/base/test_proxy_delegate.h +++ b/naiveproxy/src/net/base/test_proxy_delegate.h @@ -11,6 +11,11 @@ #include #include "base/memory/scoped_refptr.h" +#include "base/run_loop.h" +#include "base/task/single_thread_task_runner.h" +#include "base/types/expected.h" +#include "net/base/completion_once_callback.h" +#include "net/base/net_errors.h" #include "net/base/proxy_chain.h" #include "net/base/proxy_delegate.h" #include "net/base/proxy_server.h" @@ -39,7 +44,7 @@ class TestProxyDelegate : public ProxyDelegate { // Setter for the name of a header to add to the tunnel request. The value of // the header will be based on the `OnBeforeTunnelRequest()` `proxy_chain` and - // `chain_index` parameters. If no extra header name is provided, no extra + // `proxy_index` parameters. If no extra header name is provided, no extra // header will be added to the tunnel request. void set_extra_header_name(std::string_view extra_header_name) { extra_header_name_ = extra_header_name; @@ -49,6 +54,11 @@ class TestProxyDelegate : public ProxyDelegate { // proxy server. For more info, see `set_extra_header_name()`. static std::string GetExtraHeaderValue(const ProxyServer& proxy_server); + // Returns the number of times `CanFalloverToNextProxyOverride()` was called. + size_t on_can_fallover_to_next_proxy_override_count() const { + return on_can_fallover_to_next_proxy_override_count_; + } + // Returns the number of times `OnBeforeTunnelRequest()` was called. size_t on_before_tunnel_request_call_count() const { return on_before_tunnel_request_call_count_; @@ -63,11 +73,37 @@ class TestProxyDelegate : public ProxyDelegate { // value. void MakeOnTunnelHeadersReceivedFail(Error result); + // Makes subsequent calls to `OnBeforeTunnelRequest()` return ERR_IO_PENDING. + // Test code should then call `ResumeOnBeforeTunnelRequest()` to continue from + // where it left off. + void MakeOnBeforeTunnelRequestCompleteAsync(); + // Resumes the execution of `OnBeforeTunnelRequest()` from where it was left + // off. Callers must have called `MakeOnBeforeTunnelRequestCompleteAsync()` + // first. + void ResumeOnBeforeTunnelRequest(); + // Allows blocking until the `OnBeforeTunnelRequest()` has completed + // asynchronously. Callers must have called + // `MakeOnBeforeTunnelRequestCompleteAsync` first. + void WaitForOnBeforeTunnelRequestAsyncCompletion(); + + // Makes subsequent calls to `OnTunnelHeadersReceived()` return + // ERR_IO_PENDING. Test code should then call + // `ResumeOnTunnelHeadersReceived()` to continue from where it left off. + void MakeOnTunnelHeadersReceivedCompleteAsync(); + // Resumes the execution of `OnTunnelHeadersReceived()` from where it was left + // off. Callers must have called `MakeOnTunnelHeadersReceivedCompleteAsync()` + // first. + void ResumeOnTunnelHeadersReceived(); + // Allows blocking until the `OnTunnelHeadersReceived()` has completed + // asynchronously. Callers must have called + // `MakeOnTunnelHeadersReceivedCompleteAsync()` first. + void WaitForOnTunnelHeadersReceivedAsyncCompletion(); + // Checks whether the provided proxy chain, chain index, response header name, // and response header value were passed to a given // `OnTunnelHeadersReceived()` call. void VerifyOnTunnelHeadersReceived(const ProxyChain& proxy_chain, - size_t chain_index, + size_t proxy_index, const std::string& response_header_name, const std::string& response_header_value, size_t call_index = 0) const; @@ -80,14 +116,18 @@ class TestProxyDelegate : public ProxyDelegate { ProxyInfo* result) override; void OnSuccessfulRequestAfterFailures( const ProxyRetryInfoMap& proxy_retry_info) override; + std::optional CanFalloverToNextProxyOverride( + const net::ProxyChain& proxy_chain, + int net_error) override; void OnFallback(const ProxyChain& bad_chain, int net_error) override; - Error OnBeforeTunnelRequest(const ProxyChain& proxy_chain, - size_t chain_index, - HttpRequestHeaders* extra_headers) override; - Error OnTunnelHeadersReceived( + base::expected OnBeforeTunnelRequest( const ProxyChain& proxy_chain, - size_t chain_index, - const HttpResponseHeaders& response_headers) override; + size_t proxy_index, + OnBeforeTunnelRequestCallback callback) override; + Error OnTunnelHeadersReceived(const ProxyChain& proxy_chain, + size_t proxy_index, + const HttpResponseHeaders& response_headers, + CompletionOnceCallback callback) override; void SetProxyResolutionService( ProxyResolutionService* proxy_resolution_service) override; bool AliasRequiresProxyOverride( @@ -96,10 +136,28 @@ class TestProxyDelegate : public ProxyDelegate { const net::NetworkAnonymizationKey& network_anonymization_key) override; private: + // Creates an internal run loop to allow waiting for the asynchronous + // completion of `OnBeforeTunnelCallback()`. Callers must have called + // `MakeOnBeforeTunnelRequestCompleteAsync()` first. We need to create the run + // loop multiple times to handle proxy chains: if multiple proxies are nested, + // `OnBeforeTunnelRequest()` will be called multiple times. As such, test code + // might want to wait for each of these calls. + void MaybeCreateOnBeforeTunnelRequestRunLoop(); + + // Creates an internal run loop to allow waiting for the asynchronous + // completion of `OnTunnelHeadersReceived()`. Callers must have called + // `MakeOnTunnelHeadersReceivedCompleteAsync()` first. We need to create the + // run loop multiple times to handle proxy chains: if multiple proxies are + // nested, `OnTunnelHeadersReceived()` will be called multiple times. As such, + // test code might want to wait for each of these calls. + void MaybeCreateOnTunnelHeadersReceivedRunLoop(); + std::optional proxy_chain_; std::optional proxy_list_; std::optional extra_header_name_; + size_t on_can_fallover_to_next_proxy_override_count_ = 0; + size_t on_before_tunnel_request_call_count_ = 0; Error on_tunnel_headers_received_result_ = OK; @@ -107,6 +165,14 @@ class TestProxyDelegate : public ProxyDelegate { std::vector on_tunnel_headers_received_chain_indices_; std::vector> on_tunnel_headers_received_headers_; + + bool on_before_tunnel_request_returns_async_ = false; + std::unique_ptr on_before_tunnel_request_run_loop_; + base::OnceClosure on_before_tunnel_request_callback_; + + bool on_tunnel_headers_received_returns_async_ = false; + std::unique_ptr on_tunnel_headers_received_run_loop_; + net::CompletionOnceCallback on_tunnel_headers_received_callback_; }; } // namespace net diff --git a/naiveproxy/src/net/base/upload_bytes_element_reader.cc b/naiveproxy/src/net/base/upload_bytes_element_reader.cc index e5f8c898f8..31fc893ab4 100644 --- a/naiveproxy/src/net/base/upload_bytes_element_reader.cc +++ b/naiveproxy/src/net/base/upload_bytes_element_reader.cc @@ -17,11 +17,6 @@ UploadBytesElementReader::UploadBytesElementReader( UploadBytesElementReader::~UploadBytesElementReader() = default; -const UploadBytesElementReader* -UploadBytesElementReader::AsBytesReader() const { - return this; -} - int UploadBytesElementReader::Init(CompletionOnceCallback callback) { offset_ = 0; return OK; diff --git a/naiveproxy/src/net/base/upload_bytes_element_reader.h b/naiveproxy/src/net/base/upload_bytes_element_reader.h index b31645b52d..669c048e54 100644 --- a/naiveproxy/src/net/base/upload_bytes_element_reader.h +++ b/naiveproxy/src/net/base/upload_bytes_element_reader.h @@ -31,7 +31,6 @@ class NET_EXPORT UploadBytesElementReader : public UploadElementReader { base::span bytes() const { return bytes_; } // UploadElementReader overrides: - const UploadBytesElementReader* AsBytesReader() const override; int Init(CompletionOnceCallback callback) override; uint64_t GetContentLength() const override; uint64_t BytesRemaining() const override; diff --git a/naiveproxy/src/net/base/upload_element_reader.cc b/naiveproxy/src/net/base/upload_element_reader.cc index bc45006989..f3ce117868 100644 --- a/naiveproxy/src/net/base/upload_element_reader.cc +++ b/naiveproxy/src/net/base/upload_element_reader.cc @@ -6,14 +6,6 @@ namespace net { -const UploadBytesElementReader* UploadElementReader::AsBytesReader() const { - return nullptr; -} - -const UploadFileElementReader* UploadElementReader::AsFileReader() const { - return nullptr; -} - bool UploadElementReader::IsInMemory() const { return false; } diff --git a/naiveproxy/src/net/base/upload_element_reader.h b/naiveproxy/src/net/base/upload_element_reader.h index 8877532f31..d96b628455 100644 --- a/naiveproxy/src/net/base/upload_element_reader.h +++ b/naiveproxy/src/net/base/upload_element_reader.h @@ -13,8 +13,6 @@ namespace net { class IOBuffer; -class UploadBytesElementReader; -class UploadFileElementReader; // An interface to read an upload data element. class NET_EXPORT UploadElementReader { @@ -24,14 +22,6 @@ class NET_EXPORT UploadElementReader { UploadElementReader& operator=(const UploadElementReader&) = delete; virtual ~UploadElementReader() = default; - // Returns this instance's pointer as UploadBytesElementReader when possible, - // otherwise returns NULL. - virtual const UploadBytesElementReader* AsBytesReader() const; - - // Returns this instance's pointer as UploadFileElementReader when possible, - // otherwise returns NULL. - virtual const UploadFileElementReader* AsFileReader() const; - // This function must be called before calling any other method. It is not // valid to call any method (other than the destructor) if Init() fails. // This method can be called multiple times. Calling this results in resetting diff --git a/naiveproxy/src/net/base/upload_file_element_reader.cc b/naiveproxy/src/net/base/upload_file_element_reader.cc index 190975446c..82c00f53be 100644 --- a/naiveproxy/src/net/base/upload_file_element_reader.cc +++ b/naiveproxy/src/net/base/upload_file_element_reader.cc @@ -57,10 +57,6 @@ UploadFileElementReader::UploadFileElementReader( UploadFileElementReader::~UploadFileElementReader() = default; -const UploadFileElementReader* UploadFileElementReader::AsFileReader() const { - return this; -} - int UploadFileElementReader::Init(CompletionOnceCallback callback) { DCHECK(!callback.is_null()); diff --git a/naiveproxy/src/net/base/upload_file_element_reader.h b/naiveproxy/src/net/base/upload_file_element_reader.h index a7784f2412..e598f120eb 100644 --- a/naiveproxy/src/net/base/upload_file_element_reader.h +++ b/naiveproxy/src/net/base/upload_file_element_reader.h @@ -66,7 +66,6 @@ class NET_EXPORT UploadFileElementReader : public UploadElementReader { } // UploadElementReader overrides: - const UploadFileElementReader* AsFileReader() const override; int Init(CompletionOnceCallback callback) override; uint64_t GetContentLength() const override; uint64_t BytesRemaining() const override; diff --git a/naiveproxy/src/net/base/url_search_params.h b/naiveproxy/src/net/base/url_search_params.h index 4e40aa5053..0bee44dc48 100644 --- a/naiveproxy/src/net/base/url_search_params.h +++ b/naiveproxy/src/net/base/url_search_params.h @@ -25,6 +25,9 @@ namespace net { // specified `keys` // - deletion of all `(key, values)` pairs except pairs for which `key` is part // of a set of specified `keys` +// +// See also UrlSearchParamsView, which is more efficient but unsuitable for +// long-term storage as it doesn't copy the values. class NET_EXPORT UrlSearchParams { public: explicit UrlSearchParams(const GURL& url); diff --git a/naiveproxy/src/net/base/url_search_params_view.cc b/naiveproxy/src/net/base/url_search_params_view.cc new file mode 100644 index 0000000000..d977048f5b --- /dev/null +++ b/naiveproxy/src/net/base/url_search_params_view.cc @@ -0,0 +1,141 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/base/url_search_params_view.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "base/check.h" +#include "base/containers/to_vector.h" +#include "base/strings/string_number_conversions.h" +#include "net/base/url_unescape_iterator.h" +#include "net/base/url_util.h" +#include "url/gurl.h" + +namespace net { + +namespace { + +std::string Unescape(std::string_view view) { + const auto unescaped_range = MakeUrlUnescapeRange(view); + std::string decoded(std::ranges::begin(unescaped_range), + std::ranges::end(unescaped_range)); + return decoded; +} + +// %-Escapes metacharacters in `utf8` and appends it to `output`. Only a minimal +// set of characters are escaped. +template + requires(std::convertible_to, char>) +void EscapeRangeAndAppendToString(const Range& utf8, std::string& output) { + for (char c : utf8) { + // The character comparisons are written in a simple way rather that using a + // base::flat_set or similar, because Clang optimizes this pattern really + // effectively. + const bool is_special_in_query = c == '&' || c == '='; + const bool is_url_escape_metacharacter = c == '%' || c == '+'; + const bool is_start_of_fragment = c == '#'; + const bool is_common_source_of_coding_errors = c == '\0'; + if (is_special_in_query || is_url_escape_metacharacter || + is_start_of_fragment || is_common_source_of_coding_errors) { + output.push_back('%'); + base::AppendHexEncodedByte(static_cast(c), output); + } else { + output.push_back(c); + } + } +} + +} // namespace + +UrlSearchParamsView::UrlSearchParamsView(const GURL& url) { + for (auto it = QueryIterator(url); !it.IsAtEnd(); it.Advance()) { + // Keys are actively unescaped and copied during construction. Values are + // not copied, and are lazily unescaped on use. + params_.emplace_back(Unescape(it.GetKey()), it.GetValue()); + } +} + +UrlSearchParamsView::~UrlSearchParamsView() = default; + +bool UrlSearchParamsView::operator==(const UrlSearchParamsView& other) const = + default; + +void UrlSearchParamsView::Sort() { + if (params_.size() <= 1u) { + // No sort needed, so avoid doing any work. + return; + } + + // Note: the standard specifies sorting by UTF-16 code unit. Here we are + // sorting by UTF-8 code unit, which will give a different order in some edge + // cases, but because we only care about normalizing the order, and not the + // actual order itself, it doesn't matter. + std::ranges::stable_sort(params_, std::less<>(), &KeyValue::unescaped_key); +} + +void UrlSearchParamsView::DeleteAllWithNames( + const base::flat_set& names) { + absl::erase_if(params_, [&names](const KeyValue& key_value) { + return names.contains(key_value.unescaped_key); + }); +} + +void UrlSearchParamsView::DeleteAllExceptWithNames( + const base::flat_set& names) { + absl::erase_if(params_, [&names](const KeyValue& key_value) { + return !names.contains(key_value.unescaped_key); + }); +} + +std::string UrlSearchParamsView::SerializeAsUtf8() const { + std::string output; + output.reserve(EstimateSerializedOutputSize()); + bool first = true; + for (const auto& [unescaped_key, escaped_value] : params_) { + if (first) { + first = false; + } else { + output.push_back('&'); + } + EscapeRangeAndAppendToString(unescaped_key, output); + output.push_back('='); + EscapeRangeAndAppendToString(MakeUrlUnescapeRange(escaped_value), output); + } + return output; +} + +std::vector> +UrlSearchParamsView::GetDecodedParamsForTesting() const { + return base::ToVector(params_, [](const KeyValue& key_value) { + return std::pair(key_value.unescaped_key, + Unescape(key_value.escaped_value)); + }); +} + +bool UrlSearchParamsView::KeyValue::operator==(const KeyValue& other) const { + return unescaped_key == other.unescaped_key && + EqualsAfterUrlDecoding(escaped_value, other.escaped_value); +} + +size_t UrlSearchParamsView::EstimateSerializedOutputSize() const { + if (params_.empty()) { + return 0u; + } + const size_t number_of_equals_signs = params_.size(); + const size_t number_of_ampersands = number_of_equals_signs - 1; + size_t estimate = number_of_equals_signs + number_of_ampersands; + for (const auto& [unescaped_key, escaped_value] : params_) { + estimate += unescaped_key.size() + escaped_value.size(); + } + return estimate; +} + +} // namespace net diff --git a/naiveproxy/src/net/base/url_search_params_view.h b/naiveproxy/src/net/base/url_search_params_view.h new file mode 100644 index 0000000000..cde86149f0 --- /dev/null +++ b/naiveproxy/src/net/base/url_search_params_view.h @@ -0,0 +1,116 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_BASE_URL_SEARCH_PARAMS_VIEW_H_ +#define NET_BASE_URL_SEARCH_PARAMS_VIEW_H_ + +#include + +#include +#include +#include +#include + +#include "base/compiler_specific.h" +#include "base/containers/flat_set.h" +#include "net/base/net_export.h" +#include "third_party/abseil-cpp/absl/container/inlined_vector.h" +#include "url/gurl.h" + +namespace net { + +// Class that exposes the following functionality to parse a UTF-8, percent +// encoded url's `query`, without copying the strings. +// - parse `query` parameters into a list of `(key,value)` pairs keeping the +// same order as in `query`. +// - stable sort of the `(key,value)` entries in the list based on the +// URL-decoded value of `key`. +// - deletion of all `(key,value)` pairs for which the URL-decoded value of +// `key` is part of a set of specified `keys` +// - deletion of all `(key, values)` pairs except pairs for which the +// URL-decoded value of `key` is part of a set of specified `keys`. +// +// This class avoids allocating memory where possible and uses lazy decoding of +// values for efficiency. +// +// This is similar to the class UrlSearchParams, but unlike that class doesn't +// take ownership of parameter values. As a result, this version is more +// efficient, but not suitable for long-term storage. +class NET_EXPORT UrlSearchParamsView final { + public: + // This object retains a reference to the query part of `url`, so should be + // destroyed before `url` is destroyed or modified. The LIFETIME_BOUND + // annotation permits the compiler to catch obvious mistakes like constructing + // the object from a temporary GURL. + explicit UrlSearchParamsView(const GURL& url LIFETIME_BOUND); + + UrlSearchParamsView(const UrlSearchParamsView&) = delete; + ~UrlSearchParamsView(); + UrlSearchParamsView& operator=(const UrlSearchParamsView&) = delete; + + // Returns true if all the keys and values in `other` are the same as in this + // object and in the same order. + bool operator==(const UrlSearchParamsView& other) const; + + // Runs a stable sort by URL-decoded key of all of the query search params. + // The stable sort will keep the order of query search params with the same + // key the same as in the original url. + void Sort(); + + // Deletes all query search params whose keys after URL-decoding match those + // in `names`. + void DeleteAllWithNames(const base::flat_set& names); + + // Deletes all query search params except the ones whose keys after + // URL-decoding match those in `names`. + void DeleteAllExceptWithNames(const base::flat_set& names); + + // Returns a serialized version of the query (not including the "?"), as a + // UTF-8 string. To save memory, only a small number of characters are + // %-escaped. In particular, top-bit-set characters are not %-escaped, so this + // is not directly valid in a URL, although GURL can parse and canonicalize it + // correctly. The output has the important property that `a.SerializeAsUtf8() + // == b.SerializeAsUtf8()` if and only if `a == b`, which allows it to be used + // as a hash key. + std::string SerializeAsUtf8() const; + + // Return a vector of name, value pairs. Not at all efficient; only for + // testing purposes. + std::vector> GetDecodedParamsForTesting() + const; + + private: + // The number of params to store inline in this object before allocating heap + // memory. + static constexpr size_t kInlineParamCount = 16u; + + struct KeyValue { + // The key is stored unescaped, as it needs to be read multiple times, and + // is often short enough for the short-string optimization to apply. + std::string unescaped_key; + + // The value is stored escaped, as it is only read 0 or 1 times, and often + // too long for the short-string optimization to apply. + std::string_view escaped_value; + + // Checks the the `unescaped_key` and `escaped_value` match after + // unescaping. + bool operator==(const KeyValue& other) const; + }; + + // Estimates the size of the return value of SerializeAsUtf8(). Precisely + // measuring the size of the output string would be costly. Allocating the + // maximum possible size would be wasteful. This gives a cheap estimate which + // is good enough to get the string to about the right size and limit the + // number of resizes that need to be performed. + size_t EstimateSerializedOutputSize() const; + + // Keeps track of all key-value pairs representing all query search params. + // The order from the original url is important. + absl::InlinedVector params_; +}; + +} // namespace net + +#endif // NET_BASE_URL_SEARCH_PARAMS_VIEW_H_ diff --git a/naiveproxy/src/net/base/url_unescape_iterator.cc b/naiveproxy/src/net/base/url_unescape_iterator.cc new file mode 100644 index 0000000000..913efe9164 --- /dev/null +++ b/naiveproxy/src/net/base/url_unescape_iterator.cc @@ -0,0 +1,131 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/base/url_unescape_iterator.h" + +#include + +#include "base/containers/span.h" +#include "base/strings/string_util.h" +#include "base/strings/utf_string_conversion_utils.h" +#include "base/third_party/icu/icu_utf.h" + +namespace net { + +namespace { + +// Returns true if `s` contains any characters whose interpretation may be +// changed by UrlUnescapeIterator. ASCII characters are passed through +// unchanged, except for '+' and '%'. +bool ContainsCharactersChangedByUnescaping(std::string_view s) { + return std::ranges::any_of( + s, [](char c) { return c == '+' || c == '%' || (c & 0x80) != 0; }); +} + +} // namespace + +void UrlUnescapeIterator::IncrementReplacementChar() { + value_ = kReplacementCharacterInUTF8[replacement_character_byte_]; + ++replacement_character_byte_; + if (replacement_character_byte_ == std::size(kReplacementCharacterInUTF8)) { + replacement_character_byte_ = 0; + } +} + +std::pair +UrlUnescapeIterator::DecodePercent(WrappedIterator next) { + if (next == end_) { + return {'%', next}; + } + const char most_sig_digit = *next; + if (!base::IsHexDigit(most_sig_digit)) { + return {'%', next}; + } + const auto next2 = std::next(next); + if (next2 == end_) { + return {'%', next}; + } + const char least_sig_digit = *next2; + if (!base::IsHexDigit(least_sig_digit)) { + return {'%', next}; + } + + const char value = + static_cast(base::HexDigitToInt(most_sig_digit) << 4 | + base::HexDigitToInt(least_sig_digit)); + return {value, std::next(next2)}; +} + +void UrlUnescapeIterator::CheckNonAscii() { + static constexpr size_t kMaxUtf8CharacterLength = 4u; + // It would be ideal to use base::StreamingUtf8Validator here, but + // unfortunately it is not compiled into Cronet builds. Instead, we determine + // the length of the UTF-8 character based on the first byte and then decode + // it into a temporary buffer so that we can use base::ReadUnicodeCharacter() + // to check it for validity. + std::array current_codepoint = {}; + size_t current_codepoint_size = 1u; + if ((value_ & 0xE0) == 0xC0) { + current_codepoint_size = 2u; + } else if ((value_ & 0xF0) == 0xE0) { + current_codepoint_size = 3u; + } else if ((value_ & 0xF8) == 0xF0) { + current_codepoint_size = 4u; + } else { + EmitReplacementCharacter(); + return; + } + current_codepoint[0] = value_; + // Since a byte in `current_codepoint` corresponds to 1 or 3 bytes in the + // input string, we need to keep track of where each byte was found. We don't + // keep track of the first byte, as we will never set `next_` to point to + // that, so iterators[0] points to current_codepoint[1] and so on. + std::array iterators = {next_}; + for (size_t i = 1u; i < current_codepoint_size; ++i) { + const auto current = iterators[i - 1]; + if (current == end_) { + // There may have been a bad byte already, so we still need to call + // ReadUnicodeCharacter() to ensure we emit the correct number of + // replacement characters. + break; + } + const auto [value, next] = DecodeAt(current); + current_codepoint[i] = value; + iterators[i] = next; + } + size_t char_index = 0; + base_icu::UChar32 code_point_out = 0; + const bool ok = base::ReadUnicodeCharacter(current_codepoint.data(), + current_codepoint_size, + &char_index, &code_point_out); + if (!ok) { + next_ = iterators[char_index]; + EmitReplacementCharacter(); + return; + } + + remaining_checked_output_bytes_ = current_codepoint_size - 1; +} + +void UrlUnescapeIterator::EmitReplacementCharacter() { + value_ = kReplacementCharacterInUTF8[0]; + replacement_character_byte_ = 1; +} + +bool EqualsAfterUrlDecoding(std::string_view a, std::string_view b) { + if (a == b) { + // UrlUnescapeIterator is deterministic, so if they are the same before + // decoding they will also be the same afterwards. + return true; + } + + if (!ContainsCharactersChangedByUnescaping(a) && + !ContainsCharactersChangedByUnescaping(b)) { + return false; + } + + return std::ranges::equal(MakeUrlUnescapeRange(a), MakeUrlUnescapeRange(b)); +} + +} // namespace net diff --git a/naiveproxy/src/net/base/url_unescape_iterator.h b/naiveproxy/src/net/base/url_unescape_iterator.h new file mode 100644 index 0000000000..5b2397baf3 --- /dev/null +++ b/naiveproxy/src/net/base/url_unescape_iterator.h @@ -0,0 +1,198 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_BASE_URL_UNESCAPE_ITERATOR_H_ +#define NET_BASE_URL_UNESCAPE_ITERATOR_H_ + +#include + +#include +#include +#include +#include +#include + +#include "base/check.h" +#include "base/compiler_specific.h" +#include "net/base/net_export.h" +#include "url/origin.h" + +namespace net { + +// An iterator that unescapes a URL-encoded std::string_view in exactly the same +// way as UnescapePercentEncodedUrl() but without needing to allocate space for +// the output. +class NET_EXPORT_PRIVATE UrlUnescapeIterator final { + public: + using WrappedIterator = std::string_view::const_iterator; + + using difference_type = + std::iterator_traits::difference_type; + using value_type = char; + using reference = char; + using iterator_category = std::forward_iterator_tag; + + // Only useful when you need to pre-declare the iterator for some reason. Not + // otherwise valid. + constexpr UrlUnescapeIterator() = default; + + // It's usually preferable to call MakeUrlUnescapeRange() (below) rather than + // use this constructor directly. + constexpr UrlUnescapeIterator(WrappedIterator start, WrappedIterator end) + : current_(start), next_(start), end_(end) { + DecodeNext(); + } + + constexpr UrlUnescapeIterator(const UrlUnescapeIterator&) = default; + + constexpr UrlUnescapeIterator& operator=(const UrlUnescapeIterator&) = + default; + + constexpr bool operator==(const UrlUnescapeIterator& rhs) const { + // There's no need to compare the other member variables. + return current_ == rhs.current_ && + replacement_character_byte_ == rhs.replacement_character_byte_; + } + + // Implements ++x. + constexpr UrlUnescapeIterator& operator++() { + CHECK(current_ != end_); + + if (replacement_character_byte_) [[unlikely]] { + IncrementReplacementChar(); + return *this; + } + + DecodeNext(); + return *this; + } + + // Implements x++. + constexpr UrlUnescapeIterator operator++(int) { + UrlUnescapeIterator previous_value = *this; + ++*this; + return previous_value; + } + + constexpr char operator*() const { + CHECK(current_ != end_); + return value_; + } + + private: + // The unicode replacement character U+FFFD, encoded as UTF-8. Used to replace + // invalid UTF-8 in the input. + static constexpr auto kReplacementCharacterInUTF8 = + std::to_array({static_cast(0xEF), static_cast(0xBF), + static_cast(0xBD)}); + + // Advances `current_` and `next_` and sets `value_`. + constexpr void DecodeNext() { + current_ = next_; + if (current_ == end_) { + value_ = 0; + return; + } + std::tie(value_, next_) = DecodeAt(current_); + if ((value_ & 0x80) == 0) { + // ASCII bytes need no further checking. + return; + } + if (remaining_checked_output_bytes_) { + // `value_` is one of the trailing bytes of a valid UTF-8 character and + // has already been checked. + --remaining_checked_output_bytes_; + return; + } + + // `value_` is the first byte of a UTF-8 character, or invalid. + CheckNonAscii(); + } + + // Decodes a single byte at `place`. Returns the decoded byte, and `place` + // advanced by one or three input bytes. + constexpr std::pair DecodeAt(WrappedIterator place) { + CHECK(place != end_); + const auto next = std::next(place); + if (*place == '+') { + return {' ', next}; + } else if (*place == '%') { + return DecodePercent(next); + } else { + return {*place, next}; + } + } + + // Sets `value_` to the `replacement_character_byte_` byte of + // `kReplacementCharacterInUTF8` and increments + // `replacement_character_byte_`. After setting `value_` to the last byte of + // `kReplacementCharacterInUTF8`, sets `replacement_character_byte_` to 0 so + // that normal iteration can proceed. + void IncrementReplacementChar(); + + // Attempts to decode a %-encoded byte. If `next` and `next + 1` are before + // `end_` and valid hexadecimal characters, returns the decoded byte and an + // iterator pointing to `next + 2`. Otherwise, returns '%' and `next`. + std::pair DecodePercent(WrappedIterator next); + + // Checks that `value_`, `*next_` and zero or more following bytes are a + // well-formed UTF-8 code-point. If they are, sets `prechecked_output_bytes_` + // to the number of well-formed UTF-8 bytes left to be read, and sets `next_` + // to the first byte after the UTF-8 code-point. If not, sets `value_` to the + // first byte of `kReplacementCharacterInUTF8` and + // `replacement_character_byte_` to 1 so that the other two bytes of + // `kReplacementCharacterInUTF8` will be output to follow. Sets `next_` to + // point to the first character that doesn't form part of a valid UTF-8 + // character prefix. + void CheckNonAscii(); + + // Sets `value_` to kReplacementCharacterInUTF8[0] and + // `replacement_character_byte_` to 1. + void EmitReplacementCharacter(); + + // The current position of the iterator in the underlying string_view. + WrappedIterator current_{}; + + // The start of the input for the next output byte, or the off-the-end + // iterator. This will be equal to `current_ + 3` if the current output byte + // was the result of decoding a %-encoded byte. + WrappedIterator next_{}; + + // The off-the-end iterator. As well as safety checks, this is needed to + // correctly handle '%' characters at the end of the string. + WrappedIterator end_{}; + + // The value that will be returned by `operator*`. This is cached by + // `operator++`. + char value_ = 0; + + // If this is non-zero, then `operator++` will set `value_` to the next byte + // of the UTF-8 replacement character and not advance `current_`. + size_t replacement_character_byte_ = 0; + + // If this is non-zero, then the next `remaining_checked_output_bytes_` bytes + // of output have already been checked for UTF-8 validity and should be output + // without further checking. + size_t remaining_checked_output_bytes_ = 0; +}; + +// Returns a range consisting of two UrlUnescapeIterator iterators. Iterating +// over the resulting range will give the decoded bytes. +constexpr std::ranges::subrange MakeUrlUnescapeRange( + std::string_view escaped_url_component LIFETIME_BOUND) { + const auto component_end = escaped_url_component.end(); + const UrlUnescapeIterator start(escaped_url_component.begin(), component_end); + const UrlUnescapeIterator end(component_end, component_end); + return {start, end}; +} + +// Returns true if `a` and `b` would be equal after decoding with +// UrlUnescapeIterator. Optimized to avoid actually performing decoding in +// common cases. +NET_EXPORT_PRIVATE bool EqualsAfterUrlDecoding(std::string_view a, + std::string_view b); + +} // namespace net + +#endif // NET_BASE_URL_UNESCAPE_ITERATOR_H_ diff --git a/naiveproxy/src/net/base/url_util.cc b/naiveproxy/src/net/base/url_util.cc index 493ae4ca73..97e11c8893 100644 --- a/naiveproxy/src/net/base/url_util.cc +++ b/naiveproxy/src/net/base/url_util.cc @@ -71,7 +71,7 @@ std::u16string UnescapeIdentityString(std::string_view escaped_text) { GURL AppendQueryParameter(const GURL& url, std::string_view name, std::string_view value) { - std::string query(url.query()); + std::string query(url.GetQuery()); if (!query.empty()) query += "&"; @@ -94,7 +94,7 @@ GURL AppendOrReplaceQueryParameter(const GURL& url, if (should_keep_param) param_value = base::EscapeQueryParamValue(value.value(), true); - const std::string_view input = url.query_piece(); + const std::string_view input = url.query(); url::Component cursor(0, input.size()); std::string output; url::Component key_range, value_range; @@ -238,8 +238,9 @@ bool ParseHostAndPort(std::string_view input, std::string* host, int* port) { // invalid. If it is an IPv6 literal then strip the brackets. if (hostname_component.len > 0 && input[hostname_component.begin] == '[') { if (input[hostname_component.end() - 1] == ']' && - url::IPv6AddressToNumber(input.data(), hostname_component, - tmp_ipv6_addr)) { + url::IPv6AddressToNumber( + hostname_component.as_string_view_on(input.data()), + tmp_ipv6_addr)) { // Strip the brackets. hostname_component.begin++; hostname_component.len -= 2; @@ -259,7 +260,7 @@ bool ParseHostAndPort(std::string_view input, std::string* host, int* port) { std::string GetHostAndPort(const GURL& url) { // For IPv6 literals, GURL::host() already includes the brackets so it is // safe to just append a colon. - return base::StringPrintf("%s:%d", url.host().c_str(), + return base::StringPrintf("%s:%d", url.GetHost().c_str(), url.EffectiveIntPort()); } @@ -267,8 +268,9 @@ std::string GetHostAndOptionalPort(const GURL& url) { // For IPv6 literals, GURL::host() already includes the brackets // so it is safe to just append a colon. if (url.has_port()) - return base::StringPrintf("%s:%s", url.host().c_str(), url.port().c_str()); - return url.host(); + return base::StringPrintf("%s:%s", url.GetHost().c_str(), + url.GetPort().c_str()); + return url.GetHost(); } NET_EXPORT std::string GetHostAndOptionalPort( @@ -291,7 +293,7 @@ std::string TrimEndingDot(std::string_view host) { } std::string GetHostOrSpecFromURL(const GURL& url) { - return url.has_host() ? TrimEndingDot(url.host_piece()) : url.spec(); + return url.has_host() ? TrimEndingDot(url.host()) : url.spec(); } std::string GetSuperdomain(std::string_view domain) { @@ -336,10 +338,10 @@ std::string CanonicalizeHost(std::string_view host, const int kCxxMaxStringBufferSizeWithoutMalloc = 22; canon_host_output.Resize(kCxxMaxStringBufferSizeWithoutMalloc); if (is_file_scheme) { - url::CanonicalizeFileHostVerbose(host.data(), raw_host_component, + url::CanonicalizeFileHostVerbose(host, raw_host_component, canon_host_output, *host_info); } else { - url::CanonicalizeSpecialHostVerbose(host.data(), raw_host_component, + url::CanonicalizeSpecialHostVerbose(host, raw_host_component, canon_host_output, *host_info); } @@ -489,6 +491,18 @@ GURL SimplifyUrlForRequest(const GURL& url) { return url.ReplaceComponents(replacements); } +GURL RemoveCredentialsFromUrl(const GURL& url) { + DCHECK(url.is_valid()); + // Fast path to avoid re-canonicalization via ReplaceComponents. + if (!url.has_username() && !url.has_password()) { + return url; + } + GURL::Replacements replacements; + replacements.ClearUsername(); + replacements.ClearPassword(); + return url.ReplaceComponents(replacements); +} + GURL ChangeWebSocketSchemeToHttpScheme(const GURL& url) { DCHECK(url.SchemeIsWSOrWSS()); GURL::Replacements replace_scheme; @@ -529,12 +543,12 @@ OriginRelation GetOriginRelation(const GURL& target_url, void GetIdentityFromURL(const GURL& url, std::u16string* username, std::u16string* password) { - *username = UnescapeIdentityString(url.username()); - *password = UnescapeIdentityString(url.password()); + *username = UnescapeIdentityString(url.GetUsername()); + *password = UnescapeIdentityString(url.GetPassword()); } bool HasGoogleHost(const GURL& url) { - return IsGoogleHost(url.host_piece()); + return IsGoogleHost(url.host()); } bool IsGoogleHost(std::string_view host) { diff --git a/naiveproxy/src/net/base/url_util.h b/naiveproxy/src/net/base/url_util.h index f88e5b417a..8a184a73eb 100644 --- a/naiveproxy/src/net/base/url_util.h +++ b/naiveproxy/src/net/base/url_util.h @@ -223,11 +223,14 @@ NET_EXPORT bool IsLocalhost(const GURL& url); // machine. NET_EXPORT bool HostStringIsLocalhost(std::string_view host); -// Strip the portions of |url| that aren't core to the network request. +// Strip the portions of `url` that aren't core to the network request. // - user name / password // - reference section NET_EXPORT GURL SimplifyUrlForRequest(const GURL& url); +// Remove the name / password from `url`, if it has them. Always duplicates URL. +NET_EXPORT GURL RemoveCredentialsFromUrl(const GURL& url); + // Changes scheme "ws" to "http" and "wss" to "https". This is useful for origin // checks and authentication, where WebSocket URLs are treated as if they were // HTTP. It is an error to call this function with a url with a scheme other diff --git a/naiveproxy/src/net/cert/cert_verifier.cc b/naiveproxy/src/net/cert/cert_verifier.cc index bbcbfa3fd2..e7c47bb9b1 100644 --- a/naiveproxy/src/net/cert/cert_verifier.cc +++ b/naiveproxy/src/net/cert/cert_verifier.cc @@ -101,8 +101,7 @@ CertVerifier::RequestParams::RequestParams( // sake. SHA256_CTX ctx; SHA256_Init(&ctx); - Sha256UpdateLengthPrefixed(&ctx, certificate_->cert_span()); - for (const auto& cert_handle : certificate_->intermediate_buffers()) { + for (const auto& cert_handle : certificate_->cert_buffers()) { Sha256UpdateLengthPrefixed( &ctx, x509_util::CryptoBufferAsSpan(cert_handle.get())); } diff --git a/naiveproxy/src/net/cert/cert_verify_proc.cc b/naiveproxy/src/net/cert/cert_verify_proc.cc index b9cc2e026b..f1d311391a 100644 --- a/naiveproxy/src/net/cert/cert_verify_proc.cc +++ b/naiveproxy/src/net/cert/cert_verify_proc.cc @@ -165,25 +165,21 @@ bool ExaminePublicKeys(const scoped_refptr& cert, cert->valid_start() >= kBaselineEffectiveDate && cert->valid_expiry() >= kBaselineKeysizeEffectiveDate; - X509Certificate::GetPublicKeyInfo(cert->cert_buffer(), &size_bits, &type); - if (should_histogram) { - RecordPublicKeyHistogram(kLeafCert, baseline_keysize_applies, size_bits, - type); - } - if (IsWeakKey(type, size_bits)) - weak_key = true; - - const std::vector>& intermediates = - cert->intermediate_buffers(); - for (size_t i = 0; i < intermediates.size(); ++i) { - X509Certificate::GetPublicKeyInfo(intermediates[i].get(), &size_bits, - &type); + const std::vector>& certs = + cert->cert_buffers(); + for (size_t i = 0; i < certs.size(); ++i) { + X509Certificate::GetPublicKeyInfo(certs[i].get(), &size_bits, &type); if (should_histogram) { - RecordPublicKeyHistogram( - (i < intermediates.size() - 1) ? kIntermediateCert : kRootCert, - baseline_keysize_applies, - size_bits, - type); + const char* chain_position; + if (i == 0) { + chain_position = kLeafCert; + } else if (i < certs.size() - 1) { + chain_position = kIntermediateCert; + } else { + chain_position = kRootCert; + } + RecordPublicKeyHistogram(chain_position, baseline_keysize_applies, + size_bits, type); } if (!weak_key && IsWeakKey(type, size_bits)) weak_key = true; @@ -336,29 +332,23 @@ void RecordTrustAnchorHistogram(const std::vector& spki_hashes, // in order to prevent such confusion. [[nodiscard]] bool InspectSignatureAlgorithmsInChain( CertVerifyResult* verify_result) { - const std::vector>& intermediates = - verify_result->verified_cert->intermediate_buffers(); - // If there are no intermediates, then the leaf is trusted or verification // failed. - if (intermediates.empty()) + if (verify_result->verified_cert->intermediate_buffers().empty()) { return true; + } DCHECK(!verify_result->has_sha1); - // Fill in hash algorithms for the leaf certificate. - if (!InspectSignatureAlgorithmForCert( - verify_result->verified_cert->cert_buffer(), verify_result)) { - return false; - } - - // Fill in hash algorithms for the intermediate cerificates, excluding the + // Fill in hash algorithms for the certificates, excluding the // final one (which is presumably the trust anchor; may be incorrect for // partial chains). - for (size_t i = 0; i + 1 < intermediates.size(); ++i) { - if (!InspectSignatureAlgorithmForCert(intermediates[i].get(), - verify_result)) + for (const auto& cert : + base::span(verify_result->verified_cert->cert_buffers()) + .first(verify_result->verified_cert->cert_buffers().size() - 1)) { + if (!InspectSignatureAlgorithmForCert(cert.get(), verify_result)) { return false; + } } return true; @@ -373,11 +363,11 @@ base::Value::Dict CertVerifyParams(X509Certificate* cert, base::Value::Dict dict; dict.Set("certificates", NetLogX509CertificateList(cert)); if (!ocsp_response.empty()) { - dict.Set("ocsp_response", + dict.Set("stapled_ocsp_response", bssl::PEMEncode(ocsp_response, "NETLOG OCSP RESPONSE")); } if (!sct_list.empty()) { - dict.Set("sct_list", bssl::PEMEncode(sct_list, "NETLOG SCT LIST")); + dict.Set("tls_sct_list", bssl::PEMEncode(sct_list, "NETLOG SCT LIST")); } dict.Set("host", NetLogStringValue(hostname)); dict.Set("verify_flags", flags); @@ -481,7 +471,7 @@ int CertVerifyProc::Verify(X509Certificate* cert, CHECK(verify_result->verified_cert); if (rv == OK) { - CHECK_EQ(verify_result->verified_cert->intermediate_buffers().size() + 1, + CHECK_EQ(verify_result->verified_cert->cert_buffers().size(), verify_result->public_key_hashes.size()); } @@ -642,26 +632,21 @@ void CertVerifyProc::LogNameNormalizationMetrics( return; } - std::vector der_certs; - der_certs.push_back(verified_cert->cert_buffer()); - for (const auto& buf : verified_cert->intermediate_buffers()) - der_certs.push_back(buf.get()); - bssl::ParseCertificateOptions options; options.allow_invalid_serial_numbers = true; std::vector subjects; std::vector issuers; - for (auto* buf : der_certs) { + for (const auto& buf : verified_cert->cert_buffers()) { bssl::der::Input tbs_certificate_tlv; bssl::der::Input signature_algorithm_tlv; bssl::der::BitString signature_value; bssl::ParsedTbsCertificate tbs; - if (!bssl::ParseCertificate( - bssl::der::Input(CRYPTO_BUFFER_data(buf), CRYPTO_BUFFER_len(buf)), - &tbs_certificate_tlv, &signature_algorithm_tlv, &signature_value, - nullptr /* errors*/) || + if (!bssl::ParseCertificate(bssl::der::Input(CRYPTO_BUFFER_data(buf.get()), + CRYPTO_BUFFER_len(buf.get())), + &tbs_certificate_tlv, &signature_algorithm_tlv, + &signature_value, nullptr /* errors*/) || !ParseTbsCertificate(tbs_certificate_tlv, options, &tbs, nullptr /*errors*/)) { LogNameNormalizationResult(histogram_suffix, @@ -758,7 +743,7 @@ bool CertVerifyProc::HasNameConstraintsViolation( // openssl x509 -noout -in .pem -pubkey | \ // openssl asn1parse -noout -inform pem -out - | \ // openssl dgst -sha256 -binary | xxd -i - static const struct PublicKeyDomainLimitation { + static constexpr struct PublicKeyDomainLimitation { SHA256HashValue public_key_hash; base::raw_span domains; } kLimits[] = { @@ -829,14 +814,48 @@ bool CertVerifyProc::HasTooLongValidity(const X509Certificate& cert) { // * Certificates issued on-or-after 1 March 2018: 825 days. // * Last possible expiry: 1 September 2020 + 825 days = 2022-12-05 // - // The current limit, from Chrome Root Certificate Policy: - // * Certificates issued on-or-after 1 September 2020: 398 days. + // No certificates issued under these older lifetime requirements could + // possibly still be accepted, so we don't need to check the older limits + // explicitly. base::TimeDelta validity_duration = cert.valid_expiry() - cert.valid_start(); - // No certificates issued before the latest lifetime requirement was enacted - // could possibly still be accepted, so we don't need to check the older - // limits explicitly. + // The current limits, from section 6.3.2 (Certificate operational periods + // and key pair usage periods) of CABF Baseline Requirements version 2.1.7. + // + // The "Last possible expiry" date indicates the date after which each + // condition is no longer relevant and can be removed. + + // datetime.datetime(2029,3,15,tzinfo=datetime.timezone.utc).timestamp()*1000 + static constexpr base::Time kTime_2029_03_15 = + base::Time::FromMillisecondsSinceUnixEpoch(1868227200000); + // datetime.datetime(2027,3,15,tzinfo=datetime.timezone.utc).timestamp()*1000 + static constexpr base::Time kTime_2027_03_15 = + base::Time::FromMillisecondsSinceUnixEpoch(1805068800000); + // datetime.datetime(2026,3,15,tzinfo=datetime.timezone.utc).timestamp()*1000 + static constexpr base::Time kTime_2026_03_15 = + base::Time::FromMillisecondsSinceUnixEpoch(1773532800000); + + // For certificates issued on-or-after March 15, 2029: 47 days. + if (start >= kTime_2029_03_15) { + return validity_duration > base::Days(47); + } + + // For certificates issued on-or-after March 15, 2027: 100 days. + // Last possible expiry: March 15, 2029 + 100 days = 2029-06-23 + if (start >= kTime_2027_03_15) { + return validity_duration > base::Days(100); + } + + // For certificates issued on-or-after March 15, 2026: 200 days. + // Last possible expiry: March 15, 2027 + 200 days = 2027-10-01 + if (start >= kTime_2026_03_15) { + return validity_duration > base::Days(200); + } + + // The current limit, from Chrome Root Certificate Policy: + // Certificates issued on-or-after 1 September 2020: 398 days. + // Last possible expiry: March 15, 2026 + 398 days = 2027-04-17 return validity_duration > base::Days(398); } diff --git a/naiveproxy/src/net/cert/cert_verify_proc.h b/naiveproxy/src/net/cert/cert_verify_proc.h index e98d860239..5c662e010f 100644 --- a/naiveproxy/src/net/cert/cert_verify_proc.h +++ b/naiveproxy/src/net/cert/cert_verify_proc.h @@ -268,7 +268,7 @@ class NET_EXPORT CertVerifyProc base::span tls_cert, const NetLogWithSource& net_log); - // TODO(crbug.com/392931070): remove this (make internal to + // TODO(crbug.com/436300895): remove this (make internal to // CertVerifyProcBuiltin), since it is only used internally by // Verify2QwacBinding. // Performs 2-QWAC verification, if implemented by the subclass. The default diff --git a/naiveproxy/src/net/cert/cert_verify_proc_android.cc b/naiveproxy/src/net/cert/cert_verify_proc_android.cc index 3c223d6aa9..f0d560b767 100644 --- a/naiveproxy/src/net/cert/cert_verify_proc_android.cc +++ b/naiveproxy/src/net/cert/cert_verify_proc_android.cc @@ -337,18 +337,15 @@ bool VerifyFromAndroidTrustManager( } // Reverse the hash list, to maintain the leaf->root ordering. - std::reverse(verify_result->public_key_hashes.begin(), - verify_result->public_key_hashes.end()); + std::ranges::reverse(verify_result->public_key_hashes); return true; } void GetChainDEREncodedBytes(X509Certificate* cert, std::vector* chain_bytes) { - chain_bytes->reserve(1 + cert->intermediate_buffers().size()); - chain_bytes->emplace_back( - net::x509_util::CryptoBufferAsStringPiece(cert->cert_buffer())); - for (const auto& handle : cert->intermediate_buffers()) { + chain_bytes->reserve(cert->cert_buffers().size()); + for (const auto& handle : cert->cert_buffers()) { chain_bytes->emplace_back( net::x509_util::CryptoBufferAsStringPiece(handle.get())); } diff --git a/naiveproxy/src/net/cert/cert_verify_proc_blocklist.inc b/naiveproxy/src/net/cert/cert_verify_proc_blocklist.inc index 3e6dcdb5d9..bbe9b585a3 100644 --- a/naiveproxy/src/net/cert/cert_verify_proc_blocklist.inc +++ b/naiveproxy/src/net/cert/cert_verify_proc_blocklist.inc @@ -6,7 +6,7 @@ // are stored within net/data/ssl/blocklist. Further details about the // rationale is documented in net/data/ssl/blocklist/README.md static constexpr uint8_t - kSPKIBlockList[][crypto::kSHA256Length] = { + kSPKIBlockList[][crypto::hash::kSha256Size] = { // 2740d956b1127b791aa1b3cc644a4dbedba76186a23638b95102351a834ea861.pem {0x04, 0xdd, 0xe9, 0xaa, 0x9a, 0x79, 0xf6, 0x14, 0x98, 0x68, 0x23, 0x25, 0xfa, 0x08, 0x70, 0x27, 0x67, 0x07, 0xfb, 0x9c, 0xa9, 0x53, @@ -399,7 +399,7 @@ static constexpr uint8_t // Hashes of SubjectPublicKeyInfos known to be used for interception by a // party other than the device or machine owner. -static constexpr uint8_t kKnownInterceptionList[][crypto::kSHA256Length] = { +static constexpr uint8_t kKnownInterceptionList[][crypto::hash::kSha256Size] = { // 1df696f021ab1c3ace9a376b07ed7256a40214cd3396d7934087614924e2d7ef.pem {0xb1, 0x3f, 0xa2, 0xe6, 0x13, 0x1a, 0x88, 0x8a, 0x01, 0xf3, 0xd6, 0x20, 0x56, 0xfb, 0x0e, 0xfb, 0xe9, 0x99, 0xeb, 0x6b, 0x6e, 0x14, 0x92, 0x76, diff --git a/naiveproxy/src/net/cert/cert_verify_proc_builtin.cc b/naiveproxy/src/net/cert/cert_verify_proc_builtin.cc index 6ff42c3492..9fc4fce606 100644 --- a/naiveproxy/src/net/cert/cert_verify_proc_builtin.cc +++ b/naiveproxy/src/net/cert/cert_verify_proc_builtin.cc @@ -15,6 +15,7 @@ #include "base/logging.h" #include "base/memory/raw_ptr.h" #include "base/metrics/histogram_functions.h" +#include "base/strings/strcat.h" #include "base/strings/string_util.h" #include "base/strings/string_view_util.h" #include "base/time/time.h" @@ -1666,13 +1667,18 @@ int CertVerifyProcBuiltin::VerifyInternal(X509Certificate* input_cert, #if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED) namespace { void NetLog2QwacBindingError(const NetLogWithSource& net_log, - std::string_view message) { + std::string_view message, + std::string_view details = {}) { net_log.EndEvent(NetLogEventType::CERT_VERIFY_PROC_2QWAC_BINDING, [&] { base::Value::Dict dict; // Including a net_error will cause the netlog-viewer to display this event // as an error. dict.Set("net_error", ERR_FAILED); - dict.Set("error_description", message); + if (details.empty()) { + dict.Set("error_description", message); + } else { + dict.Set("error_description", base::StrCat({message, ": ", details})); + } return dict; }); } @@ -1700,7 +1706,8 @@ scoped_refptr CertVerifyProcBuiltin::Verify2QwacBinding( auto parsed_binding = TwoQwacCertBinding::Parse(binding); if (!parsed_binding.has_value()) { HistogramVerify2QwacResult(Verify2QwacBindingResult::kBindingParsingError); - NetLog2QwacBindingError(net_log, "binding parsing error"); + NetLog2QwacBindingError(net_log, "binding parsing error", + parsed_binding.error()); return nullptr; } if (!parsed_binding->VerifySignature()) { @@ -1761,7 +1768,7 @@ int CertVerifyProcBuiltin::Verify2QwacInternal( const std::string& hostname, CertVerifyResult* verify_result, const NetLogWithSource& net_log) { - // TODO(crbug.com/392931070): EUTL anchor usage histograms + // TODO(crbug.com/436274250): EUTL anchor usage histograms LogChromeRootStoreVersion(net_log); @@ -1833,9 +1840,9 @@ int CertVerifyProcBuiltin::Verify2QwacInternal( TwoQwacPathBuilderDelegateImpl path_builder_delegate(net_log); - // TODO(crbug.com/392931070): try with both system time and time_tracker_? - // It's less important here since the failure mode is just that it doesn't get - // marked as a qwac. + // QWAC verification is only attempted using system time. If the system time + // is off but time_tracker_ can provide the correct time, 2-QWAC verification + // may fail. bssl::der::GeneralizedTime der_verification_system_time; if (!EncodeTimeAsGeneralizedTime(base::Time::Now(), &der_verification_system_time)) { @@ -1905,10 +1912,6 @@ int CertVerifyProcBuiltin::Verify2QwacInternal( return rv; } - // TODO(crbug.com/392931070): is there any point in setting this? This method - // only ever returns OK if it is a valid 2-qwac anyway. - verify_result->cert_status |= CERT_STATUS_IS_QWAC; - // No histogram result is recorded in the success case, as it is assumed // Verify2Qwac is only called by Verify2QwacBinding, which will record the // histogram result if Verify2Qwac succeeds. diff --git a/naiveproxy/src/net/cert/cert_verify_proc_ios.cc b/naiveproxy/src/net/cert/cert_verify_proc_ios.cc index 0ff2584b5d..9e85ff6c26 100644 --- a/naiveproxy/src/net/cert/cert_verify_proc_ios.cc +++ b/naiveproxy/src/net/cert/cert_verify_proc_ios.cc @@ -138,36 +138,15 @@ CertStatus CertStatusFromOSStatus(OSStatus status) { } } -// Creates a series of SecPolicyRefs to be added to a SecTrustRef used to -// validate a certificate for an SSL server. |hostname| contains the name of -// the SSL server that the certificate should be verified against. If -// successful, returns noErr, and stores the resultant array of SecPolicyRefs -// in |policies|. -OSStatus CreateTrustPolicies(ScopedCFTypeRef* policies) { - ScopedCFTypeRef local_policies( - CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks)); - if (!local_policies) - return errSecAllocate; - - base::apple::ScopedCFTypeRef ssl_policy( - SecPolicyCreateBasicX509()); - CFArrayAppendValue(local_policies.get(), ssl_policy.get()); - ssl_policy.reset(SecPolicyCreateSSL(/*server=*/true, /*hostname=*/nullptr)); - CFArrayAppendValue(local_policies.get(), ssl_policy.get()); - - *policies = std::move(local_policies); - return noErr; -} - // Builds and evaluates a SecTrustRef for the certificate chain contained -// in |cert_array|, using the verification policies in |trust_policies|. On +// in |cert_array|, using the verification policy in |trust_policy|. On // success, returns OK, and updates |trust_ref|, |is_trusted|, and // |trust_error|. On failure, no output parameters are modified. // // Note: An OK return does not mean that |cert_array| is trusted, merely that // verification was performed successfully. int BuildAndEvaluateSecTrustRef(CFArrayRef cert_array, - CFArrayRef trust_policies, + SecPolicyRef trust_policy, CFDataRef ocsp_response_ref, CFArrayRef sct_array_ref, ScopedCFTypeRef* trust_ref, @@ -175,7 +154,7 @@ int BuildAndEvaluateSecTrustRef(CFArrayRef cert_array, bool* is_trusted, ScopedCFTypeRef* trust_error) { ScopedCFTypeRef tmp_trust; - OSStatus status = SecTrustCreateWithCertificates(cert_array, trust_policies, + OSStatus status = SecTrustCreateWithCertificates(cert_array, trust_policy, tmp_trust.InitializeInto()); if (status) return NetErrorFromOSStatus(status); @@ -394,10 +373,11 @@ int CertVerifyProcIOS::VerifyInternal(X509Certificate* cert, int flags, CertVerifyResult* verify_result, const NetLogWithSource& net_log) { - ScopedCFTypeRef trust_policies; - OSStatus status = CreateTrustPolicies(&trust_policies); - if (status) - return NetErrorFromOSStatus(status); + ScopedCFTypeRef trust_policy( + SecPolicyCreateSSL(/*server=*/true, /*hostname=*/nullptr)); + if (!trust_policy) { + return NetErrorFromOSStatus(errSecAllocate); + } ScopedCFTypeRef cert_array( x509_util::CreateSecCertificateArrayForX509Certificate( @@ -445,7 +425,7 @@ int CertVerifyProcIOS::VerifyInternal(X509Certificate* cert, ScopedCFTypeRef trust_error; int err = BuildAndEvaluateSecTrustRef( - cert_array.get(), trust_policies.get(), ocsp_response_ref.get(), + cert_array.get(), trust_policy.get(), ocsp_response_ref.get(), sct_array_ref.get(), &trust_ref, &final_chain, &is_trusted, &trust_error); if (err) return err; @@ -462,7 +442,7 @@ int CertVerifyProcIOS::VerifyInternal(X509Certificate* cert, } else { #if !defined(__IPHONE_12_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_12_0 SecTrustResultType trust_result = kSecTrustResultInvalid; - status = SecTrustGetTrustResult(trust_ref.get(), &trust_result); + OSStatus status = SecTrustGetTrustResult(trust_ref.get(), &trust_result); if (status) return NetErrorFromOSStatus(status); switch (trust_result) { diff --git a/naiveproxy/src/net/cert/coalescing_cert_verifier.cc b/naiveproxy/src/net/cert/coalescing_cert_verifier.cc index 40e35af187..55da75aba2 100644 --- a/naiveproxy/src/net/cert/coalescing_cert_verifier.cc +++ b/naiveproxy/src/net/cert/coalescing_cert_verifier.cc @@ -77,11 +77,12 @@ base::Value::Dict CertVerifierParams( dict.Set("certificates", NetLogX509CertificateList(params.certificate().get())); if (!params.ocsp_response().empty()) { - dict.Set("ocsp_response", + dict.Set("stapled_ocsp_response", bssl::PEMEncode(params.ocsp_response(), "NETLOG OCSP RESPONSE")); } if (!params.sct_list().empty()) { - dict.Set("sct_list", bssl::PEMEncode(params.sct_list(), "NETLOG SCT LIST")); + dict.Set("tls_sct_list", + bssl::PEMEncode(params.sct_list(), "NETLOG SCT LIST")); } dict.Set("host", NetLogStringValue(params.hostname())); dict.Set("verifier_flags", params.flags()); diff --git a/naiveproxy/src/net/cert/crl_set.cc b/naiveproxy/src/net/cert/crl_set.cc index 673c67e9a2..e9344a2cc9 100644 --- a/naiveproxy/src/net/cert/crl_set.cc +++ b/naiveproxy/src/net/cert/crl_set.cc @@ -9,12 +9,13 @@ #include "base/base64.h" #include "base/containers/span.h" +#include "base/containers/to_vector.h" #include "base/json/json_reader.h" #include "base/strings/string_view_util.h" #include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "base/values.h" -#include "crypto/sha2.h" +#include "crypto/hash.h" #include "net/base/trace_constants.h" #include "third_party/boringssl/src/include/openssl/bytestring.h" #include "third_party/boringssl/src/include/openssl/mem.h" @@ -88,11 +89,13 @@ static const int kCurrentFileVersion = 0; bool ReadCRL(std::string_view* data, std::string* out_parent_spki_hash, - std::vector* out_serials) { - if (data->size() < crypto::kSHA256Length) + std::vector>* out_serials) { + if (data->size() < crypto::hash::kSha256Size) { return false; - *out_parent_spki_hash = std::string(data->substr(0, crypto::kSHA256Length)); - data->remove_prefix(crypto::kSHA256Length); + } + *out_parent_spki_hash = + std::string(data->substr(0, crypto::hash::kSha256Size)); + data->remove_prefix(crypto::hash::kSha256Size); uint32_t num_serials; if (data->size() < sizeof(num_serials)) @@ -117,8 +120,8 @@ bool ReadCRL(std::string_view* data, if (data->size() < serial_length) return false; - out_serials->push_back(std::string()); - out_serials->back() = std::string(data->substr(0, serial_length)); + out_serials->push_back( + base::ToVector(base::as_byte_span(data->substr(0, serial_length)))); data->remove_prefix(serial_length); } @@ -249,7 +252,7 @@ bool CRLSet::Parse(std::string_view data, scoped_refptr* out_crl_set) { while (!data.empty()) { std::string spki_hash; - std::vector blocked_serials; + std::vector> blocked_serials; if (!ReadCRL(&data, &spki_hash, &blocked_serials)) { return false; @@ -283,12 +286,12 @@ bool CRLSet::Parse(std::string_view data, scoped_refptr* out_crl_set) { #include "net/cert/cert_verify_proc_blocklist.inc" for (const auto& hash : kSPKIBlockList) { crl_set->blocked_spkis_.emplace_back(reinterpret_cast(hash), - crypto::kSHA256Length); + crypto::hash::kSha256Size); } for (const auto& hash : kKnownInterceptionList) { crl_set->known_interception_spkis_.emplace_back( - reinterpret_cast(hash), crypto::kSHA256Length); + reinterpret_cast(hash), crypto::hash::kSha256Size); } // Sort, as these will be std::binary_search()'d. @@ -309,7 +312,8 @@ CRLSet::Result CRLSet::CheckSPKI(std::string_view spki_hash) const { CRLSet::Result CRLSet::CheckSubject(std::string_view encoded_subject, std::string_view spki_hash) const { - const std::string digest(crypto::SHA256HashString(encoded_subject)); + const std::string digest( + base::as_string_view(crypto::hash::Sha256(encoded_subject))); const auto i = limited_subjects_.find(digest); if (i == limited_subjects_.end()) { return GOOD; @@ -324,9 +328,9 @@ CRLSet::Result CRLSet::CheckSubject(std::string_view encoded_subject, return REVOKED; } -CRLSet::Result CRLSet::CheckSerial(std::string_view serial_number, +CRLSet::Result CRLSet::CheckSerial(base::span serial_number, std::string_view issuer_spki_hash) const { - std::string_view serial(serial_number); + base::span serial(serial_number); if (!serial.empty() && (serial[0] & 0x80) != 0) { // This serial number is negative but the process which generates CRL sets @@ -335,8 +339,9 @@ CRLSet::Result CRLSet::CheckSerial(std::string_view serial_number, } // Remove any leading zero bytes. - while (serial.size() > 1 && serial[0] == 0x00) - serial.remove_prefix(1); + while (serial.size() > 1 && serial[0] == 0x00) { + serial = serial.subspan(1u); + } auto it = crls_.find(std::string(issuer_spki_hash)); if (it == crls_.end()) @@ -384,19 +389,19 @@ scoped_refptr CRLSet::BuiltinCRLSet() { // static scoped_refptr CRLSet::EmptyCRLSetForTesting() { - return ForTesting(false, nullptr, "", "", {}); + return ForTesting(false, nullptr, {}, "", {}); } // static scoped_refptr CRLSet::ExpiredCRLSetForTesting() { - return ForTesting(true, nullptr, "", "", {}); + return ForTesting(true, nullptr, {}, "", {}); } // static scoped_refptr CRLSet::ForTesting( bool is_expired, const SHA256HashValue* issuer_spki, - std::string_view serial_number, + base::span serial_number, std::string_view utf8_common_name, const std::vector& acceptable_spki_hashes_for_cn) { std::string subject_hash; @@ -423,8 +428,9 @@ scoped_refptr CRLSet::ForTesting( return nullptr; } - subject_hash.assign(crypto::SHA256HashString( - std::string_view(reinterpret_cast(x501_data), x501_len))); + // SAFETY: x501_data is a pointer to data that is x501_len bytes in length + subject_hash.assign(base::as_string_view( + crypto::hash::Sha256(UNSAFE_BUFFERS(base::span(x501_data, x501_len))))); OPENSSL_free(x501_data); } @@ -435,9 +441,9 @@ scoped_refptr CRLSet::ForTesting( if (issuer_spki) { std::string spki(base::as_string_view(*issuer_spki)); - std::vector serials; + std::vector> serials; if (!serial_number.empty()) { - serials.push_back(std::string(serial_number)); + serials.push_back(base::ToVector(serial_number)); // |serial_number| is in DER-encoded form, which means it may have a // leading 0x00 to indicate it is a positive INTEGER. CRLSets are stored // without these leading 0x00, as handled in CheckSerial(), so remove @@ -446,7 +452,7 @@ scoped_refptr CRLSet::ForTesting( // be one, and the next byte should have the high bit set. DCHECK_EQ(serials[0][0] & 0x80, 0); // Negative serials are not allowed. if (serials[0][0] == 0x00) { - serials[0].erase(0, 1); + serials[0] = base::ToVector(serial_number.subspan(1u)); // If there was a leading 0x00, then the high-bit of the next byte // should have been set. DCHECK(!serials[0].empty() && serials[0][0] & 0x80); diff --git a/naiveproxy/src/net/cert/crl_set.h b/naiveproxy/src/net/cert/crl_set.h index 7173424332..5787035d9a 100644 --- a/naiveproxy/src/net/cert/crl_set.h +++ b/naiveproxy/src/net/cert/crl_set.h @@ -46,7 +46,7 @@ class NET_EXPORT CRLSet : public base::RefCountedThreadSafe { // value // issuer_spki_hash: the SHA256 of the SubjectPublicKeyInfo of the CRL // signer - Result CheckSerial(std::string_view serial_number, + Result CheckSerial(base::span serial_number, std::string_view issuer_spki_hash) const; // CheckSubject returns the information contained in the set for a given, @@ -71,7 +71,8 @@ class NET_EXPORT CRLSet : public base::RefCountedThreadSafe { // CRLList contains a map of (issuer SPKI hash, revoked serial numbers) // pairs. - using CRLList = std::unordered_map>; + using CRLList = + std::unordered_map>>; // crls returns the internal state of this CRLSet. It should only be used in // testing. @@ -99,7 +100,7 @@ class NET_EXPORT CRLSet : public base::RefCountedThreadSafe { static scoped_refptr ForTesting( bool is_expired, const SHA256HashValue* issuer_spki, - std::string_view serial_number, + base::span serial_number, std::string_view utf8_common_name, const std::vector& acceptable_spki_hashes_for_cn); diff --git a/naiveproxy/src/net/cert/ct_log_verifier.cc b/naiveproxy/src/net/cert/ct_log_verifier.cc index 32e2f98c11..31d78a690a 100644 --- a/naiveproxy/src/net/cert/ct_log_verifier.cc +++ b/naiveproxy/src/net/cert/ct_log_verifier.cc @@ -4,18 +4,19 @@ #include "net/cert/ct_log_verifier.h" -#include +#include #include +#include #include #include -#include "base/compiler_specific.h" #include "base/logging.h" #include "base/notreached.h" +#include "base/strings/string_view_util.h" #include "crypto/evp.h" +#include "crypto/hash.h" #include "crypto/openssl_util.h" -#include "crypto/sha2.h" #include "net/cert/ct_log_verifier_util.h" #include "net/cert/ct_serialization.h" #include "net/cert/merkle_audit_proof.h" @@ -28,7 +29,7 @@ namespace net { namespace { // The SHA-256 hash of the empty string. -const unsigned char kSHA256EmptyStringHash[ct::kSthRootHashLength] = { +constexpr std::array kSHA256EmptyStringHash = { 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}; @@ -92,9 +93,7 @@ bool CTLogVerifier::VerifySignedTreeHead( if (signed_tree_head.tree_size == 0) { // Root hash must equate SHA256 hash of the empty string. - return UNSAFE_TODO(memcmp(signed_tree_head.sha256_root_hash, - kSHA256EmptyStringHash, - ct::kSthRootHashLength)) == 0; + return signed_tree_head.sha256_root_hash == kSHA256EmptyStringHash; } return true; @@ -273,7 +272,7 @@ bool CTLogVerifier::Init(std::string_view public_key) { return false; } - key_id_ = crypto::SHA256HashString(public_key); + key_id_ = base::as_string_view(crypto::hash::Sha256(public_key)); // Right now, only RSASSA-PKCS1v15 with SHA-256 and ECDSA with SHA-256 are // supported. diff --git a/naiveproxy/src/net/cert/ct_objects_extractor.cc b/naiveproxy/src/net/cert/ct_objects_extractor.cc index f1de10f72e..dfab91fda0 100644 --- a/naiveproxy/src/net/cert/ct_objects_extractor.cc +++ b/naiveproxy/src/net/cert/ct_objects_extractor.cc @@ -41,6 +41,10 @@ const uint8_t kSHA1Oid[] = {0x2b, 0x0e, 0x03, 0x02, 0x1a}; const uint8_t kSHA256Oid[] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01}; +base::span SpanFromCBS(const CBS& cbs) { + return bssl::Span(cbs); +} + bool StringEqualToCBS(const std::string& value1, const CBS* value2) { if (CBS_len(value2) != value1.size()) return false; @@ -172,7 +176,7 @@ bool ParseSCTListFromExtensions(const CBS& extensions, // |certStatus| field. bool FindMatchingSingleResponse(CBS* responses, const CRYPTO_BUFFER* issuer, - const std::string& cert_serial_number, + base::span cert_serial_number, CBS* out_single_response) { std::string_view issuer_spki; if (!asn1::ExtractSPKIFromDERCert( @@ -216,8 +220,9 @@ bool FindMatchingSingleResponse(CBS* responses, } // Check the serial number matches. - if (!StringEqualToCBS(cert_serial_number, &serial_number)) + if (cert_serial_number != SpanFromCBS(serial_number)) { continue; + } // Check if the issuer_key_hash matches. // TODO(ekasper): also use the issuer name hash in matching. @@ -347,10 +352,11 @@ bool GetX509SignedEntry(const CRYPTO_BUFFER* leaf, SignedEntryData* result) { return true; } -bool ExtractSCTListFromOCSPResponse(const CRYPTO_BUFFER* issuer, - const std::string& cert_serial_number, - std::string_view ocsp_response, - std::string* sct_list) { +bool ExtractSCTListFromOCSPResponse( + const CRYPTO_BUFFER* issuer, + base::span cert_serial_number, + std::string_view ocsp_response, + std::string* sct_list) { // The input is an bssl::OCSPResponse. See RFC2560, section 4.2.1. The SCT // list is in the extensions field of the SingleResponse which matches the // input certificate. diff --git a/naiveproxy/src/net/cert/ct_objects_extractor.h b/naiveproxy/src/net/cert/ct_objects_extractor.h index 2da6953da4..8780ebd580 100644 --- a/naiveproxy/src/net/cert/ct_objects_extractor.h +++ b/naiveproxy/src/net/cert/ct_objects_extractor.h @@ -56,7 +56,7 @@ NET_EXPORT_PRIVATE bool GetX509SignedEntry(const CRYPTO_BUFFER* leaf, // |*sct_list| can then be further decoded with ct::DecodeSCTList. NET_EXPORT_PRIVATE bool ExtractSCTListFromOCSPResponse( const CRYPTO_BUFFER* issuer, - const std::string& cert_serial_number, + base::span cert_serial_number, std::string_view ocsp_response, std::string* sct_list); diff --git a/naiveproxy/src/net/cert/ct_serialization.cc b/naiveproxy/src/net/cert/ct_serialization.cc index ab4d749677..62430d63a2 100644 --- a/naiveproxy/src/net/cert/ct_serialization.cc +++ b/naiveproxy/src/net/cert/ct_serialization.cc @@ -288,10 +288,8 @@ bool EncodeTreeHeadSignature(const SignedTreeHead& signed_tree_head, !CBB_add_u8(output_cbb.get(), TREE_HASH) || !WriteTimeSinceEpoch(signed_tree_head.timestamp, output_cbb.get()) || !CBB_add_u64(output_cbb.get(), signed_tree_head.tree_size) || - !CBB_add_bytes( - output_cbb.get(), - reinterpret_cast(signed_tree_head.sha256_root_hash), - kSthRootHashLength)) { + !CBB_add_bytes(output_cbb.get(), signed_tree_head.sha256_root_hash.data(), + signed_tree_head.sha256_root_hash.size())) { return false; } output->append(reinterpret_cast(CBB_data(output_cbb.get())), diff --git a/naiveproxy/src/net/cert/internal/cert_issuer_source_sync_unittest.h b/naiveproxy/src/net/cert/internal/cert_issuer_source_sync_unittest.h index 1ad26b86eb..dd2081d89c 100644 --- a/naiveproxy/src/net/cert/internal/cert_issuer_source_sync_unittest.h +++ b/naiveproxy/src/net/cert/internal/cert_issuer_source_sync_unittest.h @@ -10,42 +10,21 @@ #include "net/cert/internal/test_helpers.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/boringssl/src/include/openssl/pool.h" -#include "third_party/boringssl/src/pki/cert_errors.h" #include "third_party/boringssl/src/pki/cert_issuer_source.h" namespace net { namespace { -::testing::AssertionResult ReadTestPem(const std::string& file_name, - const std::string& block_name, - std::string* result) { - const PemBlockMapping mappings[] = { - {block_name.c_str(), result}, - }; - - return ReadTestDataFromPemFile(file_name, mappings); -} - ::testing::AssertionResult ReadTestCert( const std::string& file_name, std::shared_ptr* result) { - std::string der; - ::testing::AssertionResult r = - ReadTestPem("net/data/cert_issuer_source_static_unittest/" + file_name, - "CERTIFICATE", &der); - if (!r) { - return r; - } - bssl::CertErrors errors; - *result = bssl::ParsedCertificate::Create( - bssl::UniquePtr(CRYPTO_BUFFER_new( - reinterpret_cast(der.data()), der.size(), nullptr)), - {}, &errors); + const std::string path = + "net/data/cert_issuer_source_static_unittest/" + file_name; + *result = ReadCertFromFile(path); if (!*result) { return ::testing::AssertionFailure() - << "ParsedCertificate::Create() failed:\n" - << errors.ToDebugString(); + << "ReadCertFromFile(" << path << ") failed"; } return ::testing::AssertionSuccess(); } diff --git a/naiveproxy/src/net/cert/internal/revocation_checker.cc b/naiveproxy/src/net/cert/internal/revocation_checker.cc index a4525132c8..c190b9f79b 100644 --- a/naiveproxy/src/net/cert/internal/revocation_checker.cc +++ b/naiveproxy/src/net/cert/internal/revocation_checker.cc @@ -366,8 +366,8 @@ CRLSet::Result CheckChainRevocationUsingCRLSet( // Check for revocation using the certificate's serial number and issuer's // SPKI. if (result != CRLSet::REVOKED && !is_root) { - result = crl_set->CheckSerial(cert->tbs().serial_number.AsStringView(), - issuer_spki_hash); + result = + crl_set->CheckSerial(cert->tbs().serial_number, issuer_spki_hash); } // Prepare for the next iteration. diff --git a/naiveproxy/src/net/cert/internal/test_helpers.cc b/naiveproxy/src/net/cert/internal/test_helpers.cc index 54d672fee3..585bb5b664 100644 --- a/naiveproxy/src/net/cert/internal/test_helpers.cc +++ b/naiveproxy/src/net/cert/internal/test_helpers.cc @@ -15,53 +15,6 @@ #include "third_party/boringssl/src/pki/pem.h" namespace net { - -::testing::AssertionResult ReadTestDataFromPemFile( - const std::string& file_path_ascii, - base::span mappings) { - std::string file_data = ReadTestFileToString(file_path_ascii); - - // mappings_copy is used to keep track of which mappings have already been - // satisfied (by nulling the |value| field). This is used to track when - // blocks are multiply defined. - std::vector mappings_copy = base::ToVector(mappings); - - // Build the |pem_headers| vector needed for PEMTokenzier. - std::vector pem_headers; - for (const auto& mapping : mappings_copy) { - pem_headers.push_back(mapping.block_name); - } - - bssl::PEMTokenizer pem_tokenizer(file_data, pem_headers); - while (pem_tokenizer.GetNext()) { - for (auto& mapping : mappings_copy) { - // Find the mapping for this block type. - if (pem_tokenizer.block_type() == mapping.block_name) { - if (!mapping.value) { - return ::testing::AssertionFailure() - << "PEM block defined multiple times: " << mapping.block_name; - } - - // Copy the data to the result. - mapping.value->assign(pem_tokenizer.data()); - - // Mark the mapping as having been satisfied. - mapping.value = nullptr; - } - } - } - - // Ensure that all specified blocks were found. - for (const auto& mapping : mappings_copy) { - if (mapping.value && !mapping.optional) { - return ::testing::AssertionFailure() - << "PEM block missing: " << mapping.block_name; - } - } - - return ::testing::AssertionSuccess(); -} - bool ReadCertChainFromFile(const std::string& file_path_ascii, bssl::ParsedCertificateList* chain) { // Reset all the out parameters to their defaults. diff --git a/naiveproxy/src/net/cert/internal/test_helpers.h b/naiveproxy/src/net/cert/internal/test_helpers.h index 16cc2f400a..2b9f3b83ae 100644 --- a/naiveproxy/src/net/cert/internal/test_helpers.h +++ b/naiveproxy/src/net/cert/internal/test_helpers.h @@ -9,44 +9,11 @@ #include -#include "base/containers/span.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/boringssl/src/pki/parsed_certificate.h" namespace net { -// Helper structure that maps a PEM block header (for instance "CERTIFICATE") to -// the destination where the value for that block should be written. -struct PemBlockMapping { - // The name of the PEM header. Example "CERTIFICATE". - const char* block_name; - - // The destination where the read value should be written to. - std::string* value; - - // True to indicate that the block is not required to be present. If the - // block is optional and is not present, then |value| will not be modified. - bool optional = false; -}; - -// ReadTestDataFromPemFile() is a helper function that reads a PEM test file -// rooted in the "src/" directory. -// -// * file_path_ascii: -// The path to the PEM file, relative to src. For instance -// "net/data/verify_signed_data_unittest/foopy.pem" -// -// * mappings: -// An array of length |mappings_length| which maps the expected PEM -// headers to the destination to write its data. -// -// The function ensures that each of the chosen mappings is satisfied exactly -// once. In other words, the header must be present (unless marked as -// optional=true), have valid data, and appear no more than once. -::testing::AssertionResult ReadTestDataFromPemFile( - const std::string& file_path_ascii, - base::span mappings); - // Reads a certificate chain from |file_path_ascii| bool ReadCertChainFromFile(const std::string& file_path_ascii, bssl::ParsedCertificateList* chain); diff --git a/naiveproxy/src/net/cert/internal/trust_store_android.h b/naiveproxy/src/net/cert/internal/trust_store_android.h index 23f7cd4901..98f87e5d62 100644 --- a/naiveproxy/src/net/cert/internal/trust_store_android.h +++ b/naiveproxy/src/net/cert/internal/trust_store_android.h @@ -9,6 +9,7 @@ #include "base/memory/ptr_util.h" #include "base/memory/scoped_refptr.h" +#include "base/sequence_checker.h" #include "base/synchronization/lock.h" #include "net/base/net_export.h" #include "net/cert/cert_database.h" diff --git a/naiveproxy/src/net/cert/internal/trust_store_mac.cc b/naiveproxy/src/net/cert/internal/trust_store_mac.cc index 0c870fc7d3..935fea46cc 100644 --- a/naiveproxy/src/net/cert/internal/trust_store_mac.cc +++ b/naiveproxy/src/net/cert/internal/trust_store_mac.cc @@ -4,9 +4,9 @@ #include "net/cert/internal/trust_store_mac.h" -#include #include +#include #include #include #include @@ -26,8 +26,8 @@ #include "base/strings/strcat.h" #include "base/synchronization/lock.h" #include "base/timer/elapsed_timer.h" +#include "crypto/apple/security_framework_lock.h" #include "crypto/hash.h" -#include "crypto/mac_security_services_lock.h" #include "net/base/features.h" #include "net/base/hash_value.h" #include "net/base/network_notification_thread_mac.h" @@ -95,7 +95,7 @@ TrustStatus IsTrustDictionaryTrustedForPolicy( CFDictionaryRef trust_dict, bool is_self_issued, const CFStringRef target_policy_oid) { - crypto::GetMacSecurityServicesLock().AssertAcquired(); + crypto::apple::GetSecurityFrameworkLock().AssertAcquired(); // An empty trust dict should be interpreted as // kSecTrustSettingsResultTrustRoot. This is handled by falling through all @@ -213,7 +213,7 @@ TrustStatus IsSecCertificateTrustedForPolicyInDomain( const bool is_self_issued, const CFStringRef policy_oid, SecTrustSettingsDomain trust_domain) { - crypto::GetMacSecurityServicesLock().AssertAcquired(); + crypto::apple::GetSecurityFrameworkLock().AssertAcquired(); base::apple::ScopedCFTypeRef trust_settings; OSStatus err = SecTrustSettingsCopyTrustSettings( @@ -261,7 +261,7 @@ TrustStatus IsCertificateTrustedForPolicyInDomain( TrustStatus IsCertificateTrustedForPolicy(const bssl::ParsedCertificate* cert, SecCertificateRef cert_handle, const CFStringRef policy_oid) { - crypto::GetMacSecurityServicesLock().AssertAcquired(); + crypto::apple::GetSecurityFrameworkLock().AssertAcquired(); const bool is_self_issued = cert->normalized_subject() == cert->normalized_issuer(); @@ -347,7 +347,7 @@ class TrustDomainCacheFullCerts { base::apple::ScopedCFTypeRef cert_array; OSStatus rv; { - base::AutoLock lock(crypto::GetMacSecurityServicesLock()); + base::AutoLock lock(crypto::apple::GetSecurityFrameworkLock()); rv = SecTrustSettingsCopyCertificates(domain_, cert_array.InitializeInto()); } @@ -404,7 +404,7 @@ class TrustDomainCacheFullCerts { return cache_iter->second.trust_status; } - base::AutoLock lock(crypto::GetMacSecurityServicesLock()); + base::AutoLock lock(crypto::apple::GetSecurityFrameworkLock()); // Cert has trust settings but trust has not been calculated yet. // Calculate it now, insert into cache, and return. @@ -744,7 +744,7 @@ class TrustStoreMac::TrustImplDomainCacheFullCerts CFDictionarySetValue(query.get(), kSecReturnRef, kCFBooleanTrue); CFDictionarySetValue(query.get(), kSecMatchLimit, kSecMatchLimitAll); - base::AutoLock lock(crypto::GetMacSecurityServicesLock()); + base::AutoLock lock(crypto::apple::GetSecurityFrameworkLock()); base::apple::ScopedCFTypeRef scoped_alternate_keychain_search_list; @@ -938,7 +938,7 @@ class TrustStoreMac::TrustImplKeychainCacheFullCerts CFDictionarySetValue(query.get(), kSecReturnRef, kCFBooleanTrue); CFDictionarySetValue(query.get(), kSecMatchLimit, kSecMatchLimitAll); - base::AutoLock lock(crypto::GetMacSecurityServicesLock()); + base::AutoLock lock(crypto::apple::GetSecurityFrameworkLock()); base::apple::ScopedCFTypeRef scoped_alternate_keychain_search_list; diff --git a/naiveproxy/src/net/cert/internal/trust_store_nss.cc b/naiveproxy/src/net/cert/internal/trust_store_nss.cc index 13b3e6f833..12332c8759 100644 --- a/naiveproxy/src/net/cert/internal/trust_store_nss.cc +++ b/naiveproxy/src/net/cert/internal/trust_store_nss.cc @@ -219,13 +219,6 @@ void TrustStoreNSS::SyncGetIssuersOf(const bssl::ParsedCertificate* cert, } } -std::vector -TrustStoreNSS::ListCertsIgnoringNSSRoots() { - // In this path, the returned certs could include client certificates, so we - // should not skip the chaps module. - return ListCertsIgnoringNSSRootsImpl(/*ignore_chaps_module=*/false); -} - std::vector TrustStoreNSS::ListCertsIgnoringNSSRootsImpl(bool ignore_chaps_module) { crypto::EnsureNSSInit(); diff --git a/naiveproxy/src/net/cert/internal/trust_store_nss.h b/naiveproxy/src/net/cert/internal/trust_store_nss.h index 07fdc1c920..399b40b53a 100644 --- a/naiveproxy/src/net/cert/internal/trust_store_nss.h +++ b/naiveproxy/src/net/cert/internal/trust_store_nss.h @@ -34,6 +34,10 @@ class NET_EXPORT TrustStoreNSS : public PlatformTrustStore { // |user_slot_trust_setting| configures the use of trust from user slots: // * UseTrustFromAllUserSlots: all user slots will be allowed. // * PK11Slot: the specified slot will be allowed. Must not be nullptr. + // + // TODO(crbug.com/390333881): The PK11Slot variant is no longer used except + // by ServerCertificateDatabaseNSSMigrator. Once the migration code is + // removed, remove the |user_slot_trust_setting| option. explicit TrustStoreNSS(UserSlotTrustSetting user_slot_trust_setting); TrustStoreNSS(const TrustStoreNSS&) = delete; @@ -52,6 +56,7 @@ class NET_EXPORT TrustStoreNSS : public PlatformTrustStore { std::vector GetAllUserAddedCerts() override; + private: struct ListCertsResult { ListCertsResult(ScopedCERTCertificate cert, bssl::CertificateTrust trust); ~ListCertsResult(); @@ -61,9 +66,6 @@ class NET_EXPORT TrustStoreNSS : public PlatformTrustStore { ScopedCERTCertificate cert; bssl::CertificateTrust trust; }; - std::vector ListCertsIgnoringNSSRoots(); - - private: std::vector ListCertsIgnoringNSSRootsImpl( bool ignore_chaps_module); diff --git a/naiveproxy/src/net/cert/internal/trust_store_win.cc b/naiveproxy/src/net/cert/internal/trust_store_win.cc index 25f57d0c83..ec586a61fd 100644 --- a/naiveproxy/src/net/cert/internal/trust_store_win.cc +++ b/naiveproxy/src/net/cert/internal/trust_store_win.cc @@ -256,16 +256,19 @@ class TrustStoreWin::Impl { L"Disallowed"); // Auto-sync all of the cert stores to get updates to the cert store. - // Auto-syncing on all_certs_store seems to work to resync the nested - // stores, although the docs at - // https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certcontrolstore - // are somewhat unclear. If and when root store changes are linked to + // Auto-sync must be invoked on each individual store so that any future + // checks performed on the collection will ensure the individual stores + // within it are properly synchronized. However, the documentation at: + // https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certcontrolstore, + // is somewhat unclear. If and when root store changes are linked to // clearing various caches, this should be replaced with // CERT_STORE_CTRL_NOTIFY_CHANGE and CERT_STORE_CTRL_RESYNC. - if (!CertControlStore(stores.all.get(), 0, CERT_STORE_CTRL_AUTO_RESYNC, + if (!CertControlStore(stores.roots.get(), 0, CERT_STORE_CTRL_AUTO_RESYNC, 0) || !CertControlStore(stores.trusted_people.get(), 0, CERT_STORE_CTRL_AUTO_RESYNC, 0) || + !CertControlStore(stores.intermediates.get(), 0, + CERT_STORE_CTRL_AUTO_RESYNC, 0) || !CertControlStore(stores.disallowed.get(), 0, CERT_STORE_CTRL_AUTO_RESYNC, 0)) { PLOG(ERROR) << "Error enabling CERT_STORE_CTRL_AUTO_RESYNC"; diff --git a/naiveproxy/src/net/cert/nss_cert_database.cc b/naiveproxy/src/net/cert/nss_cert_database.cc index 318357ff88..d5c40d2e53 100644 --- a/naiveproxy/src/net/cert/nss_cert_database.cc +++ b/naiveproxy/src/net/cert/nss_cert_database.cc @@ -27,7 +27,6 @@ #include "crypto/scoped_nss_types.h" #include "net/base/net_errors.h" #include "net/cert/cert_database.h" -#include "net/cert/internal/trust_store_nss.h" #include "net/cert/x509_certificate.h" #include "net/cert/x509_util_nss.h" #include "net/third_party/mozilla_security_manager/nsNSSCertificateDB.h" @@ -75,34 +74,8 @@ class CertNotificationForwarder : public NSSCertDatabase::Observer { raw_ptr cert_db_; }; -// TODO(crbug.com/40890963): once the other IsUntrusted impl is deleted, -// rename this. -bool IsUntrustedUsingTrustStore(const CERTCertificate* cert, - bssl::CertificateTrust trust) { - if (trust.IsDistrusted()) { - return true; - } - - // Self-signed certificates that don't have any trust bits set are untrusted. - // Other certificates that don't have any trust bits set may still be trusted - // if they chain up to a trust anchor. - // TODO(mattm): this is weird, but just match the behavior of the existing - // IsUntrusted function for now. - if (SECITEM_CompareItem(&cert->derIssuer, &cert->derSubject) == SECEqual) { - return !trust.IsTrustAnchor(); - } - - return false; -} - } // namespace -NSSCertDatabase::CertInfo::CertInfo() = default; -NSSCertDatabase::CertInfo::CertInfo(CertInfo&& other) = default; -NSSCertDatabase::CertInfo::~CertInfo() = default; -NSSCertDatabase::CertInfo& NSSCertDatabase::CertInfo::operator=( - NSSCertDatabase::CertInfo&& other) = default; - NSSCertDatabase::ImportCertFailure::ImportCertFailure( ScopedCERTCertificate cert, int err) @@ -150,17 +123,6 @@ void NSSCertDatabase::ListCertsInSlot(ListCertsCallback callback, std::move(callback)); } -void NSSCertDatabase::ListCertsInfo(ListCertsInfoCallback callback, - NSSRootsHandling nss_roots_handling) { - base::ThreadPool::PostTaskAndReplyWithResult( - FROM_HERE, - {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, - base::BindOnce(&NSSCertDatabase::ListCertsInfoImpl, - /*slot=*/nullptr, - /*add_certs_info=*/true, nss_roots_handling), - std::move(callback)); -} - #if BUILDFLAG(IS_CHROMEOS) crypto::ScopedPK11Slot NSSCertDatabase::GetSystemSlot() const { return crypto::ScopedPK11Slot(); @@ -400,80 +362,6 @@ void NSSCertDatabase::DeleteCertAndKeyAsync(ScopedCERTCertificate cert, weak_factory_.GetWeakPtr(), std::move(callback))); } -// static -bool NSSCertDatabase::IsUntrusted(const CERTCertificate* cert) { - CERTCertTrust nsstrust; - SECStatus rv = CERT_GetCertTrust(cert, &nsstrust); - if (rv != SECSuccess) { - LOG(ERROR) << "CERT_GetCertTrust failed with error " << PORT_GetError(); - return false; - } - - // The CERTCertTrust structure contains three trust records: - // sslFlags, emailFlags, and objectSigningFlags. The three - // trust records are independent of each other. - // - // If the CERTDB_TERMINAL_RECORD bit in a trust record is set, - // then that trust record is a terminal record. A terminal - // record is used for explicit trust and distrust of an - // end-entity or intermediate CA cert. - // - // In a terminal record, if neither CERTDB_TRUSTED_CA nor - // CERTDB_TRUSTED is set, then the terminal record means - // explicit distrust. On the other hand, if the terminal - // record has either CERTDB_TRUSTED_CA or CERTDB_TRUSTED bit - // set, then the terminal record means explicit trust. - // - // For a root CA, the trust record does not have - // the CERTDB_TERMINAL_RECORD bit set. - - static const unsigned int kTrusted = CERTDB_TRUSTED_CA | CERTDB_TRUSTED; - if ((nsstrust.sslFlags & CERTDB_TERMINAL_RECORD) != 0 && - (nsstrust.sslFlags & kTrusted) == 0) { - return true; - } - if ((nsstrust.emailFlags & CERTDB_TERMINAL_RECORD) != 0 && - (nsstrust.emailFlags & kTrusted) == 0) { - return true; - } - if ((nsstrust.objectSigningFlags & CERTDB_TERMINAL_RECORD) != 0 && - (nsstrust.objectSigningFlags & kTrusted) == 0) { - return true; - } - - // Self-signed certificates that don't have any trust bits set are untrusted. - // Other certificates that don't have any trust bits set may still be trusted - // if they chain up to a trust anchor. - if (SECITEM_CompareItem(&cert->derIssuer, &cert->derSubject) == SECEqual) { - return (nsstrust.sslFlags & kTrusted) == 0 && - (nsstrust.emailFlags & kTrusted) == 0 && - (nsstrust.objectSigningFlags & kTrusted) == 0; - } - - return false; -} - -// static -bool NSSCertDatabase::IsWebTrustAnchor(const CERTCertificate* cert) { - CERTCertTrust nsstrust; - SECStatus rv = CERT_GetCertTrust(cert, &nsstrust); - if (rv != SECSuccess) { - LOG(ERROR) << "CERT_GetCertTrust failed with error " << PORT_GetError(); - return false; - } - - // Note: This should return true iff a net::TrustStoreNSS instantiated with - // SECTrustType trustSSL would classify |cert| as a trust anchor. - const unsigned int ssl_trust_flags = nsstrust.sslFlags; - - // Determine if the certificate is a trust anchor. - if ((ssl_trust_flags & CERTDB_TRUSTED_CA) == CERTDB_TRUSTED_CA) { - return true; - } - - return false; -} - // static bool NSSCertDatabase::IsReadOnly(const CERTCertificate* cert) { PK11SlotInfo* slot = cert->slot; @@ -517,32 +405,9 @@ void NSSCertDatabase::RemoveObserver(Observer* observer) { observer_list_->RemoveObserver(observer); } -// static -ScopedCERTCertificateList NSSCertDatabase::ExtractCertificates( - CertInfoList certs_info) { - ScopedCERTCertificateList certs; - certs.reserve(certs_info.size()); - - for (auto& cert_info : certs_info) - certs.push_back(std::move(cert_info.cert)); - - return certs; -} - // static ScopedCERTCertificateList NSSCertDatabase::ListCertsImpl( crypto::ScopedPK11Slot slot) { - CertInfoList certs_info = ListCertsInfoImpl( - std::move(slot), /*add_certs_info=*/false, NSSRootsHandling::kInclude); - - return ExtractCertificates(std::move(certs_info)); -} - -// static -NSSCertDatabase::CertInfoList NSSCertDatabase::ListCertsInfoImpl( - crypto::ScopedPK11Slot slot, - bool add_certs_info, - NSSRootsHandling nss_roots_handling) { // This method may acquire the NSS lock or reenter this code via extension // hooks (such as smart card UI). To ensure threads are not starved or // deadlocked, the base::ScopedBlockingCall below increments the thread pool @@ -550,66 +415,28 @@ NSSCertDatabase::CertInfoList NSSCertDatabase::ListCertsInfoImpl( base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); - if (nss_roots_handling == NSSRootsHandling::kExclude) { - // This assumes that using a new TrustStoreNSS instance on each - // ListCertsInfo call is not expensive. If that ever changes this might - // need to be rethought. - TrustStoreNSS trust_store_nss( - slot ? TrustStoreNSS::UserSlotTrustSetting( - crypto::ScopedPK11Slot(PK11_ReferenceSlot(slot.get()))) - : TrustStoreNSS::UseTrustFromAllUserSlots()); - - std::vector cert_list( - trust_store_nss.ListCertsIgnoringNSSRoots()); - - CertInfoList certs_info; - for (const auto& node : cert_list) { - CertInfo cert_info; - cert_info.cert = x509_util::DupCERTCertificate(node.cert.get()); - if (add_certs_info) { - cert_info.untrusted = - IsUntrustedUsingTrustStore(cert_info.cert.get(), node.trust); - cert_info.web_trust_anchor = node.trust.IsTrustAnchor(); - cert_info.on_read_only_slot = IsReadOnly(cert_info.cert.get()); - cert_info.hardware_backed = IsHardwareBacked(cert_info.cert.get()); - } - certs_info.push_back(std::move(cert_info)); - } - return certs_info; + ScopedCERTCertificateList certs; + crypto::ScopedCERTCertList cert_list = nullptr; + if (slot) { + cert_list.reset(PK11_ListCertsInSlot(slot.get())); } else { - CertInfoList certs_info; - crypto::ScopedCERTCertList cert_list = nullptr; - if (slot) { - cert_list.reset(PK11_ListCertsInSlot(slot.get())); - } else { - cert_list.reset(PK11_ListCerts(PK11CertListUnique, nullptr)); - } - // PK11_ListCerts[InSlot] can return nullptr, e.g. because the PKCS#11 token - // that was backing the specified slot is not available anymore. - // Treat it as no certificates being present on the slot. - if (!cert_list) { - LOG(WARNING) << (slot ? "PK11_ListCertsInSlot" : "PK11_ListCerts") - << " returned null"; - return certs_info; - } - - CERTCertListNode* node; - for (node = CERT_LIST_HEAD(cert_list); !CERT_LIST_END(node, cert_list); - node = CERT_LIST_NEXT(node)) { - CertInfo cert_info; - cert_info.cert = x509_util::DupCERTCertificate(node->cert); - - if (add_certs_info) { - cert_info.on_read_only_slot = IsReadOnly(cert_info.cert.get()); - cert_info.untrusted = IsUntrusted(cert_info.cert.get()); - cert_info.web_trust_anchor = IsWebTrustAnchor(cert_info.cert.get()); - cert_info.hardware_backed = IsHardwareBacked(cert_info.cert.get()); - } - - certs_info.push_back(std::move(cert_info)); - } - return certs_info; + cert_list.reset(PK11_ListCerts(PK11CertListUnique, nullptr)); } + // PK11_ListCerts[InSlot] can return nullptr, e.g. because the PKCS#11 token + // that was backing the specified slot is not available anymore. + // Treat it as no certificates being present on the slot. + if (!cert_list) { + LOG(WARNING) << (slot ? "PK11_ListCertsInSlot" : "PK11_ListCerts") + << " returned null"; + return certs; + } + + CERTCertListNode* node; + for (node = CERT_LIST_HEAD(cert_list); !CERT_LIST_END(node, cert_list); + node = CERT_LIST_NEXT(node)) { + certs.push_back(x509_util::DupCERTCertificate(node->cert)); + } + return certs; } void NSSCertDatabase::NotifyCertRemovalAndCallBack( diff --git a/naiveproxy/src/net/cert/nss_cert_database.h b/naiveproxy/src/net/cert/nss_cert_database.h index a99e5f9a61..a5ba8f3703 100644 --- a/naiveproxy/src/net/cert/nss_cert_database.h +++ b/naiveproxy/src/net/cert/nss_cert_database.h @@ -46,34 +46,6 @@ class NET_EXPORT NSSCertDatabase { Observer() = default; }; - // Holds an NSS certificate along with additional information. - struct CertInfo { - CertInfo(); - CertInfo(CertInfo&& other); - ~CertInfo(); - CertInfo& operator=(CertInfo&& other); - - // The certificate itself. - ScopedCERTCertificate cert; - - // The certificate is stored on a read-only slot. - bool on_read_only_slot = false; - - // The certificate is untrusted. - bool untrusted = false; - - // The certificate is trusted for web navigations according to the trust - // bits stored in the database. - bool web_trust_anchor = false; - - // The certificate is hardware-backed. - bool hardware_backed = false; - - // The certificate is device-wide. - // Note: can be true only on Chrome OS. - bool device_wide = false; - }; - // Stores per-certificate error codes for import failures. struct NET_EXPORT ImportCertFailure { public: @@ -112,11 +84,6 @@ class NET_EXPORT NSSCertDatabase { DISTRUSTED_OBJ_SIGN = 1 << 5, }; - using CertInfoList = std::vector; - - using ListCertsInfoCallback = - base::OnceCallback; - using ListCertsCallback = base::OnceCallback; @@ -150,22 +117,6 @@ class NET_EXPORT NSSCertDatabase { // asynchronously on a worker thread. virtual void ListCertsInSlot(ListCertsCallback callback, PK11SlotInfo* slot); - enum class NSSRootsHandling { - kInclude, - // TODO(crbug.com/390333881): kExclude is only used by the old cert - // manager. Remove this and any other no-longer needed NSSCertDatabase - // features once the new cert manager is fully launched. - kExclude, - }; - // Asynchronously get a list of certificates along with additional - // information. Note that the callback may be run even after the database is - // deleted. - // The `nss_roots_handling` parameter controls whether to include or exclude - // NSS built-in roots from the returned list. - // TODO(crbug.com/40890963): remove the `nss_roots_handling` parameter. - virtual void ListCertsInfo(ListCertsInfoCallback callback, - NSSRootsHandling nss_roots_handling); - #if BUILDFLAG(IS_CHROMEOS) // Get the slot for system-wide key data. May be NULL if the system token was // not enabled for this database. @@ -265,18 +216,6 @@ class NET_EXPORT NSSCertDatabase { void DeleteCertAndKeyAsync(ScopedCERTCertificate cert, DeleteCertCallback callback); - // IsUntrusted returns true if |cert| is specifically untrusted. These - // certificates are stored in the database for the specific purpose of - // rejecting them. - // TODO(mattm): that's not actually what this method does. (It also marks - // certs that are self-issued and don't have any specific trust as untrusted, - // which is wrong.) - static bool IsUntrusted(const CERTCertificate* cert); - - // IsWebTrustAnchor returns true if |cert| is explicitly trusted for web - // navigations according to the trust bits stored in the database. - static bool IsWebTrustAnchor(const CERTCertificate* cert); - // Check whether cert is stored in a readonly slot. // TODO(mattm): this is ill-defined if the cert exists on both readonly and // non-readonly slots. @@ -300,27 +239,11 @@ class NET_EXPORT NSSCertDatabase { void RemoveObserver(Observer* observer); protected: - // Returns a list of certificates extracted from |certs_info| list ignoring - // additional information. - static ScopedCERTCertificateList ExtractCertificates(CertInfoList certs_info); - // Certificate listing implementation used by |ListCerts*|. Static so it may // safely be used on the worker thread. If |slot| is nullptr, obtains the // certs of all slots, otherwise only of |slot|. static ScopedCERTCertificateList ListCertsImpl(crypto::ScopedPK11Slot slot); - // Implements the logic behind returning a list of certificates along with - // additional information about every certificate. - // If |add_certs_info| is false, doesn't compute the certificate additional - // information, the corresponding CertInfo struct fields will be left on their - // default values. - // Static so it may safely be used on the worker thread. If |slot| is nullptr, - // obtains the certs of all slots, otherwise only of |slot|. - // The |nss_roots_handling| parameter controls whether to include or exclude - // NSS built-in roots from the resulting cert list. - static CertInfoList ListCertsInfoImpl(crypto::ScopedPK11Slot slot, - bool add_certs_info, - NSSRootsHandling nss_roots_handling); // Broadcasts notifications to all registered observers. void NotifyObserversTrustStoreChanged(); diff --git a/naiveproxy/src/net/cert/nss_cert_database_chromeos.cc b/naiveproxy/src/net/cert/nss_cert_database_chromeos.cc index 9e140a0a4b..9aee43cd6a 100644 --- a/naiveproxy/src/net/cert/nss_cert_database_chromeos.cc +++ b/naiveproxy/src/net/cert/nss_cert_database_chromeos.cc @@ -49,18 +49,6 @@ void NSSCertDatabaseChromeOS::ListCerts( std::move(callback)); } -void NSSCertDatabaseChromeOS::ListCertsInfo( - ListCertsInfoCallback callback, - NSSRootsHandling nss_roots_handling) { - base::ThreadPool::PostTaskAndReplyWithResult( - FROM_HERE, - {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, - base::BindOnce(&NSSCertDatabaseChromeOS::ListCertsInfoImpl, - profile_filter_, /*slot=*/GetSystemSlot(), - /*add_certs_info=*/true, nss_roots_handling), - std::move(callback)); -} - crypto::ScopedPK11Slot NSSCertDatabaseChromeOS::GetSystemSlot() const { if (system_slot_) return crypto::ScopedPK11Slot(PK11_ReferenceSlot(system_slot_.get())); @@ -106,19 +94,6 @@ bool NSSCertDatabaseChromeOS::SetCertTrust(CERTCertificate* cert, // static ScopedCERTCertificateList NSSCertDatabaseChromeOS::ListCertsImpl( const NSSProfileFilterChromeOS& profile_filter) { - CertInfoList certs_info = - ListCertsInfoImpl(profile_filter, crypto::ScopedPK11Slot(), - /*add_certs_info=*/false, NSSRootsHandling::kInclude); - - return ExtractCertificates(std::move(certs_info)); -} - -// static -NSSCertDatabase::CertInfoList NSSCertDatabaseChromeOS::ListCertsInfoImpl( - const NSSProfileFilterChromeOS& profile_filter, - crypto::ScopedPK11Slot system_slot, - bool add_certs_info, - NSSRootsHandling nss_roots_handling) { // This method may acquire the NSS lock or reenter this code via extension // hooks (such as smart card UI). To ensure threads are not starved or // deadlocked, the base::ScopedBlockingCall below increments the thread pool @@ -126,22 +101,14 @@ NSSCertDatabase::CertInfoList NSSCertDatabaseChromeOS::ListCertsInfoImpl( base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); - CertInfoList certs_info(NSSCertDatabase::ListCertsInfoImpl( - crypto::ScopedPK11Slot(), add_certs_info, nss_roots_handling)); + ScopedCERTCertificateList certs_info( + NSSCertDatabase::ListCertsImpl(crypto::ScopedPK11Slot())); // Filter certificate information according to user profile. - std::erase_if(certs_info, [&profile_filter](CertInfo& cert_info) { - return !profile_filter.IsCertAllowed(cert_info.cert.get()); - }); - - if (add_certs_info) { - // Add Chrome OS specific information. - for (auto& cert_info : certs_info) { - cert_info.device_wide = - IsCertificateOnSlot(cert_info.cert.get(), system_slot.get()); - cert_info.hardware_backed = IsHardwareBacked(cert_info.cert.get()); - } - } + std::erase_if(certs_info, + [&profile_filter](ScopedCERTCertificate& cert_info) { + return !profile_filter.IsCertAllowed(cert_info.get()); + }); return certs_info; } diff --git a/naiveproxy/src/net/cert/nss_cert_database_chromeos.h b/naiveproxy/src/net/cert/nss_cert_database_chromeos.h index 5377f8c780..250dec1212 100644 --- a/naiveproxy/src/net/cert/nss_cert_database_chromeos.h +++ b/naiveproxy/src/net/cert/nss_cert_database_chromeos.h @@ -31,11 +31,6 @@ class NET_EXPORT NSSCertDatabaseChromeOS : public NSSCertDatabase { // NSSCertDatabase implementation. void ListCerts(NSSCertDatabase::ListCertsCallback callback) override; - // Uses NSSCertDatabase implementation and adds additional Chrome OS specific - // certificate information. - void ListCertsInfo(ListCertsInfoCallback callback, - NSSRootsHandling nss_roots_handling) override; - crypto::ScopedPK11Slot GetSystemSlot() const override; void ListModules(std::vector* modules, @@ -56,17 +51,6 @@ class NET_EXPORT NSSCertDatabaseChromeOS : public NSSCertDatabase { static ScopedCERTCertificateList ListCertsImpl( const NSSProfileFilterChromeOS& profile_filter); - // Certificate information listing implementation used by |ListCertsInfo|. - // The certificate list normally returned by - // NSSCertDatabase::ListCertsInfoImpl is additionally filtered by - // |profile_filter|. Also additional Chrome OS specific information is added. - // Static so it may safely be used on the worker thread. - static CertInfoList ListCertsInfoImpl( - const NSSProfileFilterChromeOS& profile_filter, - crypto::ScopedPK11Slot system_slot, - bool add_certs_info, - NSSRootsHandling nss_roots_handling); - NSSProfileFilterChromeOS profile_filter_; crypto::ScopedPK11Slot system_slot_; }; diff --git a/naiveproxy/src/net/cert/signed_tree_head.cc b/naiveproxy/src/net/cert/signed_tree_head.cc index 9ffc2cb44f..d6701632b5 100644 --- a/naiveproxy/src/net/cert/signed_tree_head.cc +++ b/naiveproxy/src/net/cert/signed_tree_head.cc @@ -5,6 +5,7 @@ #include "net/cert/signed_tree_head.h" #include +#include #include #include #include @@ -42,8 +43,7 @@ void PrintTo(const SignedTreeHead& sth, std::ostream* os) { << "\t\"version\": " << sth.version << ",\n" << "\t\"timestamp\": " << sth.timestamp << ",\n" << "\t\"tree_size\": " << sth.tree_size << ",\n" - << "\t\"sha256_root_hash\": \"" - << base::HexEncode(sth.sha256_root_hash, kSthRootHashLength) + << "\t\"sha256_root_hash\": \"" << base::HexEncode(sth.sha256_root_hash) << "\",\n\t\"log_id\": \"" << base::HexEncode(sth.log_id) << "\"\n" << "}"; } diff --git a/naiveproxy/src/net/cert/signed_tree_head.h b/naiveproxy/src/net/cert/signed_tree_head.h index 7fce78ea1d..45b2a2cf3b 100644 --- a/naiveproxy/src/net/cert/signed_tree_head.h +++ b/naiveproxy/src/net/cert/signed_tree_head.h @@ -7,6 +7,7 @@ #include +#include #include #include "base/containers/span.h" @@ -39,7 +40,7 @@ struct NET_EXPORT SignedTreeHead { Version version; base::Time timestamp; uint64_t tree_size; - char sha256_root_hash[kSthRootHashLength]; + std::array sha256_root_hash; DigitallySigned signature; // Added in RFC6962-bis, Appendix A. Needed to identify which log diff --git a/naiveproxy/src/net/cert/two_qwac.cc b/naiveproxy/src/net/cert/two_qwac.cc index 3cafa1bf7d..13e82408e1 100644 --- a/naiveproxy/src/net/cert/two_qwac.cc +++ b/naiveproxy/src/net/cert/two_qwac.cc @@ -9,6 +9,7 @@ #include "base/containers/contains.h" #include "base/json/json_reader.h" #include "base/strings/string_split.h" +#include "base/types/expected.h" #include "crypto/evp.h" #include "crypto/signature_verifier.h" #include "net/cert/asn1_util.h" @@ -25,7 +26,7 @@ Jades2QwacHeader::~Jades2QwacHeader() = default; namespace { -std::optional ParseJades2QwacHeader( +base::expected ParseJades2QwacHeader( std::string_view header_string) { Jades2QwacHeader parsed_header; // The header of a JWS is a JSON-encoded object (RFC 7515, section 4). @@ -38,8 +39,11 @@ std::optional ParseJades2QwacHeader( // a valid JSON object. std::optional header_value = base::JSONReader::Read(header_string, base::JSON_PARSE_RFC); - if (!header_value.has_value() || !header_value->is_dict()) { - return std::nullopt; + if (!header_value.has_value()) { + return base::unexpected("JSON parsing error"); + } + if (!header_value->is_dict()) { + return base::unexpected("JSON not a dict"); } // RFC 7515 section 5.2 (signature verification) step 4: If using the JWS // compact serialization (which we are), let the JOSE Header (the header @@ -79,7 +83,7 @@ std::optional ParseJades2QwacHeader( // and supported by crypto::SignatureVerifier. std::string* alg = header.FindString("alg"); if (!alg) { - return std::nullopt; + return base::unexpected("alg missing or not a string"); } else if (*alg == "RS256") { parsed_header.sig_alg = JwsSigAlg::kRsaPkcs1Sha256; } else if (*alg == "PS256") { @@ -87,7 +91,7 @@ std::optional ParseJades2QwacHeader( } else if (*alg == "ES256") { parsed_header.sig_alg = JwsSigAlg::kEcdsaP256Sha256; } else { - return std::nullopt; + return base::unexpected("unsupported alg"); } header.Remove("alg"); @@ -103,8 +107,11 @@ std::optional ParseJades2QwacHeader( // ETSI TS 119 411-5 V2.1.1 requires the "cty" parameter to be // "TLS-Certificate-Binding-v1". std::string* cty = header.FindString("cty"); - if (!cty || *cty != "TLS-Certificate-Binding-v1") { - return std::nullopt; + if (!cty) { + return base::unexpected("cty missing or not a string"); + } + if (*cty != "TLS-Certificate-Binding-v1") { + return base::unexpected("unsupported cty"); } header.Remove("cty"); @@ -121,7 +128,7 @@ std::optional ParseJades2QwacHeader( // "x5c" (X.509 Certificate Chain) header - RFC 7515 section 4.1.6 base::ListValue* x5c_list = header.FindList("x5c"); if (!x5c_list) { - return std::nullopt; + return base::unexpected("x5c missing or not a list"); } size_t i = 0; @@ -132,11 +139,11 @@ std::optional ParseJades2QwacHeader( // "Each string in the array is a base64-encoded (not base64url-encoded) DER // PKIX certificate value." if (!cert_value.is_string()) { - return std::nullopt; + return base::unexpected("x5c element not a string"); } auto cert_bytes = base::Base64Decode(cert_value.GetString()); if (!cert_bytes.has_value()) { - return std::nullopt; + return base::unexpected("x5c element base64 decode error"); } auto buf = x509_util::CreateCryptoBuffer(*cert_bytes); if (i == 0) { @@ -149,7 +156,7 @@ std::optional ParseJades2QwacHeader( parsed_header.two_qwac_cert = X509Certificate::CreateFromBuffer( std::move(leaf), std::move(intermediates)); if (!parsed_header.two_qwac_cert) { - return std::nullopt; + return base::unexpected("x5c cert parsing error"); } header.Remove("x5c"); @@ -187,14 +194,17 @@ std::optional ParseJades2QwacHeader( // JSON object and is required to be present. base::DictValue* sig_d = header.FindDict("sigD"); if (!sig_d) { - return std::nullopt; + return base::unexpected("sigD missing or not a dict"); } // The sigD header must have a "mId" (mechanism ID) of // "http://uri.etsi.org/19182/ObjectIdByURIHash". (ETSI TS 119 411-5 Annex B.) std::string* m_id = sig_d->FindString("mId"); - if (!m_id || *m_id != "http://uri.etsi.org/19182/ObjectIdByURIHash") { - return std::nullopt; + if (!m_id) { + return base::unexpected("sigD: mId missing or not a string"); + } + if (*m_id != "http://uri.etsi.org/19182/ObjectIdByURIHash") { + return base::unexpected("sigD: invalid mId"); } sig_d->Remove("mId"); @@ -203,12 +213,12 @@ std::optional ParseJades2QwacHeader( // "hashV". (ETSI 119 182-1 clause 5.2.8.) const base::ListValue* pars = sig_d->FindList("pars"); if (!pars) { - return std::nullopt; + return base::unexpected("sigD: pars missing or not a list"); } size_t bound_cert_count = pars->size(); for (const base::Value& par : *pars) { if (!par.is_string()) { - return std::nullopt; + return base::unexpected("sigD: pars element not a string"); } } sig_d->Remove("pars"); @@ -219,7 +229,7 @@ std::optional ParseJades2QwacHeader( // S384, and S512 be supported. std::string* hash_m = sig_d->FindString("hashM"); if (!hash_m) { - return std::nullopt; + return base::unexpected("sigD: hashM missing or not a string"); } if (*hash_m == "S256") { parsed_header.hash_alg = crypto::hash::kSha256; @@ -229,7 +239,7 @@ std::optional ParseJades2QwacHeader( parsed_header.hash_alg = crypto::hash::kSha512; } else { // Unsupported hashing algorithm. - return std::nullopt; + return base::unexpected("sigD: unsupported hashM"); } sig_d->Remove("hashM"); @@ -240,16 +250,16 @@ std::optional ParseJades2QwacHeader( // computed directly over the data object.) const base::ListValue* hash_v = sig_d->FindList("hashV"); if (!hash_v) { - return std::nullopt; + return base::unexpected("sigD: hashV missing or not a list"); } if (hash_v->size() != bound_cert_count) { - return std::nullopt; + return base::unexpected("sigD: hashV count doesn't match pars count"); } parsed_header.bound_cert_hashes.reserve(bound_cert_count); for (const base::Value& hash_value : *hash_v) { const std::string* hash_b64url = hash_value.GetIfString(); if (!hash_b64url) { - return std::nullopt; + return base::unexpected("sigD: hashV element not a string"); } // ETSI TS 119 182-1 fails to specify the definition of "base64url-encoded". // Given that other uses of base64url encoding come from the JWS spec, and @@ -258,7 +268,7 @@ std::optional ParseJades2QwacHeader( auto hash = base::Base64UrlDecode( *hash_b64url, base::Base64UrlDecodePolicy::DISALLOW_PADDING); if (!hash.has_value()) { - return std::nullopt; + return base::unexpected("sigD: hashV element base64 decode error"); } parsed_header.bound_cert_hashes.emplace_back(std::move(*hash)); } @@ -278,23 +288,23 @@ std::optional ParseJades2QwacHeader( const base::ListValue* ctys = sig_d->FindList("ctys"); if (ctys) { if (ctys->size() != bound_cert_count) { - return std::nullopt; + return base::unexpected("sigD: ctys count doesn't match pars count"); } for (const base::Value& cty_value : *ctys) { if (!cty_value.is_string()) { - return std::nullopt; + return base::unexpected("sigD: ctys element not a string"); } } } else if (sig_d->contains("ctys")) { // check that there isn't a "ctys" of the wrong type - return std::nullopt; + return base::unexpected("sigD: ctys not a list"); } sig_d->Remove("ctys"); // sigD has no other members than the aforementioned "mId", "pars", "hashM", // "hashV", and "ctys". (ETSI TS 119 182-1 clause 5.2.8.) if (!sig_d->empty()) { - return std::nullopt; + return base::unexpected("sigD has unexpected members"); } header.Remove("sigD"); @@ -311,11 +321,11 @@ std::optional ParseJades2QwacHeader( const auto* crit_value = header.Find("crit"); if (crit_value) { if (!crit_value->is_list()) { - return std::nullopt; + return base::unexpected("crit not a list"); } const auto& crit_list = crit_value->GetList(); if (crit_list.size() != 1 || !crit_list.contains("sigD")) { - return std::nullopt; + return base::unexpected("crit contains non sigD element(s)"); } } header.Remove("crit"); @@ -325,7 +335,7 @@ std::optional ParseJades2QwacHeader( // to support. This implementation rejects a JWS header that contains unknown // fields. if (!header.empty()) { - return std::nullopt; + return base::unexpected("header has unexpected members"); } return parsed_header; @@ -343,7 +353,7 @@ TwoQwacCertBinding::TwoQwacCertBinding(const TwoQwacCertBinding& other) = TwoQwacCertBinding::TwoQwacCertBinding(TwoQwacCertBinding&& other) = default; TwoQwacCertBinding::~TwoQwacCertBinding() = default; -std::optional TwoQwacCertBinding::Parse( +base::expected TwoQwacCertBinding::Parse( std::string_view jws) { // ETSI TS 119 411-5 V2.1.1 Annex B: The JAdES signatures shall be serialized // using JWS Compact Serialization as specified in IETF RFC 7515. @@ -358,7 +368,7 @@ std::optional TwoQwacCertBinding::Parse( jws, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); if (jws_components.size() != 3) { // Reject a JWS that does not consist of 3 components. - return std::nullopt; + return base::unexpected("wrong number of components"); } std::string_view header_b64 = jws_components[0]; std::string_view payload_b64 = jws_components[1]; @@ -374,21 +384,21 @@ std::optional TwoQwacCertBinding::Parse( if (!base::Base64UrlDecode(header_b64, base::Base64UrlDecodePolicy::DISALLOW_PADDING, &header_string)) { - return std::nullopt; + return base::unexpected("base64 decoding header error"); } // RFC 7515 section 5.2 (signature verification) step 7: base64url-decode the // encoded representation of the JWS Signature. std::optional> signature = base::Base64UrlDecode( signature_b64, base::Base64UrlDecodePolicy::DISALLOW_PADDING); if (!signature.has_value()) { - return std::nullopt; + return base::unexpected("base64 decoding signature error"); } // Parse the JWS/JAdES header. This function will perform steps 3-5 of RFC // 7515 section 5.2 (signature verification). auto header = ParseJades2QwacHeader(header_string); if (!header.has_value()) { - return std::nullopt; + return base::unexpected("header parsing error: " + header.error()); } // ETSI TS 119 411-5 V2.1.1 Annex B specifies a "sigD" header parameter. This @@ -403,7 +413,7 @@ std::optional TwoQwacCertBinding::Parse( // the empty payload, checking that the encoded representation is empty is // sufficient to decode and check that the JWS Payload is empty. if (!payload_b64.empty()) { - return std::nullopt; + return base::unexpected("payload is non-empty"); } return TwoQwacCertBinding(*header, std::string(header_b64), *signature); diff --git a/naiveproxy/src/net/cert/two_qwac.h b/naiveproxy/src/net/cert/two_qwac.h index 88307a1109..4ea8a916f5 100644 --- a/naiveproxy/src/net/cert/two_qwac.h +++ b/naiveproxy/src/net/cert/two_qwac.h @@ -8,10 +8,12 @@ #include #include +#include #include #include #include +#include "base/types/expected.h" #include "crypto/hash.h" #include "net/base/net_export.h" #include "net/cert/x509_certificate.h" @@ -84,7 +86,8 @@ class NET_EXPORT_PRIVATE TwoQwacCertBinding { // Parses a TLS Certificate Binding structure that contains a 2-QWAC // certificate chain. This function also performs steps 1-7 of RFC 7515 // section 5.2 (signature verification). - static std::optional Parse(std::string_view jws); + static base::expected Parse( + std::string_view jws); // This function verifies the signature in the TLS Certificate Binding, // performing steps 8-10 of RFC 7515 section 5.2 (signature verification). If diff --git a/naiveproxy/src/net/cert/x509_certificate.cc b/naiveproxy/src/net/cert/x509_certificate.cc index 789e8e69e2..e80d4ccde3 100644 --- a/naiveproxy/src/net/cert/x509_certificate.cc +++ b/naiveproxy/src/net/cert/x509_certificate.cc @@ -14,6 +14,7 @@ #include "base/containers/contains.h" #include "base/containers/span.h" +#include "base/containers/to_vector.h" #include "base/logging.h" #include "base/notreached.h" #include "base/numerics/safe_conversions.h" @@ -127,6 +128,17 @@ bssl::UniquePtr CreateCertBufferFromBytesWithSanityCheck( return x509_util::CreateCryptoBuffer(data); } +std::vector> CertBuffersFromCertAndIntermediates( + bssl::UniquePtr cert_buffer, + std::vector> intermediates) { + std::vector> result; + result.push_back(std::move(cert_buffer)); + for (auto& intermediate : intermediates) { + result.push_back(std::move(intermediate)); + } + return result; +} + } // namespace // static @@ -302,7 +314,7 @@ scoped_refptr X509Certificate::CloneWithDifferentIntermediates( // CRYPTO_BUFFERs, which is generally sufficient, but in some edge cases // buffers have equal contents but with different addresses. This is // acceptable as this is just an optimization. - if (intermediates == intermediate_ca_certs_) { + if (intermediates == intermediate_buffers()) { return this; } @@ -311,16 +323,13 @@ scoped_refptr X509Certificate::CloneWithDifferentIntermediates( } void X509Certificate::Persist(base::Pickle* pickle) const { - DCHECK(cert_buffer_); // This would be an absolutely insane number of intermediates. - if (intermediate_ca_certs_.size() > static_cast(INT_MAX) - 1) { + if (cert_buffers_.size() > static_cast(INT_MAX)) { NOTREACHED(); } - pickle->WriteInt(static_cast(intermediate_ca_certs_.size() + 1)); - pickle->WriteString(x509_util::CryptoBufferAsStringPiece(cert_buffer_.get())); - for (const auto& intermediate : intermediate_ca_certs_) { - pickle->WriteString( - x509_util::CryptoBufferAsStringPiece(intermediate.get())); + pickle->WriteInt(static_cast(cert_buffers_.size())); + for (const auto& cert : cert_buffers_) { + pickle->WriteString(x509_util::CryptoBufferAsStringPiece(cert.get())); } } @@ -384,18 +393,16 @@ bool X509Certificate::HasExpired() const { } bool X509Certificate::EqualsExcludingChain(const X509Certificate* other) const { - return x509_util::CryptoBufferEqual(cert_buffer_.get(), - other->cert_buffer_.get()); + return x509_util::CryptoBufferEqual(cert_buffer(), other->cert_buffer()); } bool X509Certificate::EqualsIncludingChain(const X509Certificate* other) const { - if (intermediate_ca_certs_.size() != other->intermediate_ca_certs_.size() || - !EqualsExcludingChain(other)) { + if (cert_buffers_.size() != other->cert_buffers_.size()) { return false; } - for (size_t i = 0; i < intermediate_ca_certs_.size(); ++i) { - if (!x509_util::CryptoBufferEqual(intermediate_ca_certs_[i].get(), - other->intermediate_ca_certs_[i].get())) { + for (size_t i = 0; i < cert_buffers_.size(); ++i) { + if (!x509_util::CryptoBufferEqual(cert_buffers_[i].get(), + other->cert_buffers_[i].get())) { return false; } } @@ -417,14 +424,10 @@ bool X509Certificate::IsIssuedByEncoded( } std::string normalized_cert_issuer; - if (!GetNormalizedCertIssuer(cert_buffer_.get(), &normalized_cert_issuer)) - return false; - if (base::Contains(normalized_issuers, normalized_cert_issuer)) - return true; - - for (const auto& intermediate : intermediate_ca_certs_) { - if (!GetNormalizedCertIssuer(intermediate.get(), &normalized_cert_issuer)) + for (const auto& cert : cert_buffers_) { + if (!GetNormalizedCertIssuer(cert.get(), &normalized_cert_issuer)) { return false; + } if (base::Contains(normalized_issuers, normalized_cert_issuer)) return true; } @@ -460,10 +463,8 @@ bool X509Certificate::VerifyHostname( // Fully handle all cases where |hostname| contains an IP address. if (host_info.IsIPAddress()) { - std::string_view ip_addr_string( - reinterpret_cast(host_info.address), - host_info.AddressLength()); - return base::Contains(cert_san_ip_addrs, ip_addr_string); + return base::Contains(cert_san_ip_addrs, + base::as_string_view(host_info.AddressSpan())); } // The host portion of a URL may support a variety of name resolution formats @@ -588,13 +589,11 @@ bool X509Certificate::GetPEMEncoded(const CRYPTO_BUFFER* cert_buffer, bool X509Certificate::GetPEMEncodedChain( std::vector* pem_encoded) const { std::vector encoded_chain; - std::string pem_data; - if (!GetPEMEncoded(cert_buffer(), &pem_data)) - return false; - encoded_chain.push_back(pem_data); - for (const auto& intermediate_ca_cert : intermediate_ca_certs_) { - if (!GetPEMEncoded(intermediate_ca_cert.get(), &pem_data)) + for (const auto& cert : cert_buffers_) { + std::string pem_data; + if (!GetPEMEncoded(cert.get(), &pem_data)) { return false; + } encoded_chain.push_back(pem_data); } pem_encoded->swap(encoded_chain); @@ -631,6 +630,15 @@ void X509Certificate::GetPublicKeyInfo(const CRYPTO_BUFFER* cert_buffer, *size_bits = base::saturated_cast(EVP_PKEY_bits(pkey.get())); } +std::vector> X509Certificate::CopyCertBuffers() + const { + std::vector> result; + for (const auto& buffer : cert_buffers_) { + result.push_back(bssl::UpRef(buffer)); + } + return result; +} + // static std::vector> X509Certificate::CreateCertBuffersFromBytes(base::span data, @@ -665,8 +673,7 @@ SHA256HashValue X509Certificate::CalculateFingerprint256( SHA256HashValue X509Certificate::CalculateChainFingerprint256() const { crypto::hash::Hasher hasher(crypto::hash::kSha256); - hasher.Update(x509_util::CryptoBufferAsSpan(cert_buffer_.get())); - for (const auto& cert : intermediate_ca_certs_) { + for (const auto& cert : cert_buffers_) { hasher.Update(x509_util::CryptoBufferAsSpan(cert.get())); } @@ -692,21 +699,27 @@ X509Certificate::X509Certificate( ParsedFields parsed, bssl::UniquePtr cert_buffer, std::vector> intermediates) - : parsed_(std::move(parsed)), - cert_buffer_(std::move(cert_buffer)), - intermediate_ca_certs_(std::move(intermediates)) {} + : // CertBuffersFromCertAndIntermediates will always return a vector with + // at least one element. + cert_buffers_( + CertBuffersFromCertAndIntermediates(std::move(cert_buffer), + std::move(intermediates))), + parsed_(std::move(parsed)) {} X509Certificate::X509Certificate( const X509Certificate& other, std::vector> intermediates) - : parsed_(other.parsed_), - cert_buffer_(bssl::UpRef(other.cert_buffer_)), - intermediate_ca_certs_(std::move(intermediates)) {} + : // CertBuffersFromCertAndIntermediates will always return a vector with + // at least one element. + cert_buffers_( + CertBuffersFromCertAndIntermediates(bssl::UpRef(other.cert_buffer()), + std::move(intermediates))), + parsed_(other.parsed_) {} X509Certificate::~X509Certificate() = default; base::span X509Certificate::cert_span() const { - return x509_util::CryptoBufferAsSpan(cert_buffer_.get()); + return x509_util::CryptoBufferAsSpan(cert_buffers_.front().get()); } X509Certificate::ParsedFields::ParsedFields() = default; @@ -749,7 +762,10 @@ bool X509Certificate::ParsedFields::Initialize( !GeneralizedTimeToTime(tbs.validity_not_after, &valid_expiry_)) { return false; } - serial_number_ = tbs.serial_number.AsString(); + // `tbs.serial_number` just references data inside `cert_buffer`, so it's + // okay to save it into a span even though `tbs` gets destroyed at the end of + // this method. + serial_number_ = tbs.serial_number; return true; } diff --git a/naiveproxy/src/net/cert/x509_certificate.h b/naiveproxy/src/net/cert/x509_certificate.h index eb20e40456..0b23f0f274 100644 --- a/naiveproxy/src/net/cert/x509_certificate.h +++ b/naiveproxy/src/net/cert/x509_certificate.h @@ -14,6 +14,7 @@ #include "base/containers/span.h" #include "base/gtest_prod_util.h" +#include "base/memory/raw_span.h" #include "base/memory/ref_counted.h" #include "base/time/time.h" #include "net/base/hash_value.h" @@ -157,7 +158,9 @@ class NET_EXPORT X509Certificate void Persist(base::Pickle* pickle) const; // The serial number, DER encoded, possibly including a leading 00 byte. - const std::string& serial_number() const { return parsed_.serial_number_; } + base::span serial_number() const { + return parsed_.serial_number_; + } // The subject of the certificate. For HTTPS server certificates, this // represents the web server. The common name of the subject should match @@ -247,18 +250,27 @@ class NET_EXPORT X509Certificate // object. // // To access the CRYPTO_BUFFER's bytes, use `cert_span()` above. - CRYPTO_BUFFER* cert_buffer() const { return cert_buffer_.get(); } + CRYPTO_BUFFER* cert_buffer() const { return cert_buffers_.front().get(); } // Returns the associated intermediate certificates that were specified // during creation of this object, if any. The intermediates are not // guaranteed to be valid DER or to encode valid Certificate objects. // Ownership follows the "get" rule: it is the caller's responsibility to // retain the elements of the result. - const std::vector>& intermediate_buffers() + const base::span> intermediate_buffers() const { - return intermediate_ca_certs_; + return base::span(cert_buffers_).subspan(1u); } + // Returns the full list of certificate buffers specified for this object. + // In other words, `cert_buffer()` followed by `intermediate_buffers()`. + const std::vector>& cert_buffers() const { + return cert_buffers_; + } + + // Returns a copy of the full list of certificate buffers. + std::vector> CopyCertBuffers() const; + // Creates all possible CRYPTO_BUFFERs from |data| encoded in a specific // |format|. Returns an empty collection on failure. static std::vector> CreateCertBuffersFromBytes( @@ -307,8 +319,9 @@ class NET_EXPORT X509Certificate // This certificate is not valid after |valid_expiry_| base::Time valid_expiry_; - // The serial number of this certificate, DER encoded. - std::string serial_number_; + // The serial number of this certificate, DER encoded. References data + // owned by `cert_buffer`. + base::raw_span serial_number_; }; // Construct an X509Certificate from a CRYPTO_BUFFER containing the @@ -335,15 +348,15 @@ class NET_EXPORT X509Certificate const std::vector& cert_san_dns_names, const std::vector& cert_san_ip_addrs); - // Fields that were parsed from |cert_buffer_|. + // Handles to the DER encoded certificate data. + // The first element is the certificate represented by this object with the + // following elements representing the intermediates/chain, if any. + const std::vector> cert_buffers_; + + // Fields that were parsed from `cert_buffers_.front()`. Needs to be after + // `cert_buffers_` as it references data owned by that, and thus needs + // to be destroyed first. const ParsedFields parsed_; - - // A handle to the DER encoded certificate data. - const bssl::UniquePtr cert_buffer_; - - // Untrusted intermediate certificates associated with this certificate - // that may be needed for chain building. - const std::vector> intermediate_ca_certs_; }; } // namespace net diff --git a/naiveproxy/src/net/cookies/OWNERS b/naiveproxy/src/net/cookies/OWNERS index 84afa0d139..ff8e99249f 100644 --- a/naiveproxy/src/net/cookies/OWNERS +++ b/naiveproxy/src/net/cookies/OWNERS @@ -3,6 +3,7 @@ chromium-cookie-reviews@google.com cfredric@chromium.org +chlily@chromium.org dylancutler@google.com mkwst@chromium.org morlovich@chromium.org diff --git a/naiveproxy/src/net/cookies/canonical_cookie.cc b/naiveproxy/src/net/cookies/canonical_cookie.cc index d51bb27abf..962b35c1e8 100644 --- a/naiveproxy/src/net/cookies/canonical_cookie.cc +++ b/naiveproxy/src/net/cookies/canonical_cookie.cc @@ -50,6 +50,7 @@ #include #include +#include "base/check_is_test.h" #include "base/compiler_specific.h" #include "base/containers/contains.h" #include "base/dcheck_is_on.h" @@ -86,6 +87,46 @@ namespace { static constexpr int kMinutesInTwelveHours = 12 * 60; static constexpr int kMinutesInTwentyFourHours = 24 * 60; +std::string_view CanonicalCookieFromStorageCallSiteToString( + CanonicalCookieFromStorageCallSite call_site) { + switch (call_site) { + case CanonicalCookieFromStorageCallSite::kAndroidCookiesFetcherRestoreUtil: + return "AndroidCookiesFetcherRestoreUtil"; + case CanonicalCookieFromStorageCallSite::kChromeOsCookieSyncConversions: + return "ChromeOsCookieSyncConversions"; + case CanonicalCookieFromStorageCallSite::kOauthMultiloginResult: + return "OauthMultiloginResult"; + case CanonicalCookieFromStorageCallSite::kIosSystemCookieUtil: + NOTREACHED(); + case CanonicalCookieFromStorageCallSite::kSqlitePersistentCookieStore: + return "SqlitePersistentCookieStore"; + case CanonicalCookieFromStorageCallSite::kCookieManager: + return "CookieManager"; + case CanonicalCookieFromStorageCallSite::kCookieManagerMojomTraits: + return "CookieManagerMojomTraits"; + case CanonicalCookieFromStorageCallSite::kRestrictedCookieManager: + return "RestrictedCookieManager"; + case CanonicalCookieFromStorageCallSite::kTests: + return "Tests"; + } +} + +void MaybeRecordFromStorageWithValidLengthHistogram( + CanonicalCookieFromStorageCallSite call_site, + bool valid) { + if (!base::ShouldRecordSubsampledMetric(kHistogramSampleProbability)) { + return; + } + if (call_site == CanonicalCookieFromStorageCallSite::kTests) { + CHECK_IS_TEST(); + } + base::UmaHistogramBoolean( + base::StrCat({"Cookie.FromStorageWithValidLength.", + CanonicalCookieFromStorageCallSiteToString(call_site), + ".Subsampled"}), + valid); +} + void AppendCookieLineEntry(const CanonicalCookie& cookie, std::string* cookie_line) { if (!cookie_line->empty()) @@ -585,7 +626,7 @@ std::unique_ptr CanonicalCookie::CreateSanitizedCookie( std::optional cookie_domain; // This validation step must happen before GetCookieDomainWithString, so it // doesn't fail DCHECKs. - if (!cookie_util::DomainIsHostOnly(url.host())) { + if (!cookie_util::DomainIsHostOnly(url.GetHost())) { status->AddExclusionReason( net::CookieInclusionStatus::ExclusionReason::EXCLUDE_INVALID_DOMAIN); } else if (cookie_domain = cookie_util::GetCookieDomainWithString( @@ -727,7 +768,8 @@ std::unique_ptr CanonicalCookie::FromStorage( std::optional partition_key, CookieSourceScheme source_scheme, int source_port, - CookieSourceType source_type) { + CookieSourceType source_type, + CanonicalCookieFromStorageCallSite call_site) { // We check source_port here because it could have concievably been // corrupted and changed to out of range. Eventually this would be caught by // IsCanonical*() but since the source_port is only used by metrics so far @@ -747,8 +789,19 @@ std::unique_ptr CanonicalCookie::FromStorage( // not have a valid name+value size length bool valid_cookie_name_value_pair = ParsedCookie::IsValidCookieNameValuePair(cc->Name(), cc->Value()); - UMA_HISTOGRAM_BOOLEAN("Cookie.FromStorageWithValidLength", - valid_cookie_name_value_pair); + // For this iOS code path, previous metrics have shown that + // `ParsedCookie::IsValidCookieNameValuePair` always returns true, so no + // need to record metrics for this code path (and we can begin enforcing the + // behavior we want which is to incorporate the new check into the + // "is canonical" check). + if (call_site == CanonicalCookieFromStorageCallSite::kIosSystemCookieUtil) { + if (valid_cookie_name_value_pair) { + return cc; + } + return nullptr; + } + MaybeRecordFromStorageWithValidLengthHistogram( + call_site, valid_cookie_name_value_pair); } else { return nullptr; } diff --git a/naiveproxy/src/net/cookies/canonical_cookie.h b/naiveproxy/src/net/cookies/canonical_cookie.h index 4a4be3d274..4e3eebc144 100644 --- a/naiveproxy/src/net/cookies/canonical_cookie.h +++ b/naiveproxy/src/net/cookies/canonical_cookie.h @@ -44,6 +44,23 @@ using CookieAndLineAccessResultList = std::vector; using CookieAccessResultList = std::vector; +// Represents the call sites of CanonicalCookie::FromStorage, used for metrics +// so we can better identify any callers that are not enforcing cookie name and +// value size limits as expected. +// LINT.IfChange(CanonicalCookieFromStorageCallSite) +enum class CanonicalCookieFromStorageCallSite { + kAndroidCookiesFetcherRestoreUtil, + kChromeOsCookieSyncConversions, + kOauthMultiloginResult, + kIosSystemCookieUtil, + kSqlitePersistentCookieStore, + kCookieManager, + kCookieManagerMojomTraits, + kRestrictedCookieManager, + kTests, +}; +// LINT.ThenChange(/tools/metrics/histograms/metadata/cookie/histograms.xml:CanonicalCookieFromStorageCallSite) + // Represents a real/concrete cookie, which may be sent on requests or set by a // response if the request context and attributes allow it. class NET_EXPORT CanonicalCookie : public CookieBase { @@ -213,7 +230,8 @@ class NET_EXPORT CanonicalCookie : public CookieBase { std::optional partition_key, CookieSourceScheme source_scheme, int source_port, - CookieSourceType source_type); + CookieSourceType source_type, + CanonicalCookieFromStorageCallSite call_site); // Create a CanonicalCookie that is not guaranteed to actually be Canonical // for tests. Use this only if you want to bypass parameter validation to diff --git a/naiveproxy/src/net/cookies/canonical_cookie_proto_converter.cc b/naiveproxy/src/net/cookies/canonical_cookie_proto_converter.cc index 5ce23e5326..0c7f336601 100644 --- a/naiveproxy/src/net/cookies/canonical_cookie_proto_converter.cc +++ b/naiveproxy/src/net/cookies/canonical_cookie_proto_converter.cc @@ -15,6 +15,7 @@ #include "net/cookies/cookie_constants.h" #include "net/cookies/cookie_util.h" #include "testing/libfuzzer/proto/url_proto_converter.h" +#include "url/gurl.h" namespace canonical_cookie_proto { diff --git a/naiveproxy/src/net/cookies/cookie_base.cc b/naiveproxy/src/net/cookies/cookie_base.cc index 0e05edeea2..c83ebc335f 100644 --- a/naiveproxy/src/net/cookies/cookie_base.cc +++ b/naiveproxy/src/net/cookies/cookie_base.cc @@ -16,6 +16,7 @@ #include "net/cookies/cookie_util.h" #include "net/cookies/ref_unique_cookie_key.h" #include "net/cookies/unique_cookie_key.h" +#include "url/gurl.h" namespace net { @@ -543,11 +544,11 @@ CookieAccessResult CookieBase::IsSetPermittedInContext( return access_result; } -bool CookieBase::IsOnPath(const std::string& url_path) const { +bool CookieBase::IsOnPath(const std::string_view url_path) const { return cookie_util::IsOnPath(path_, url_path); } -bool CookieBase::IsDomainMatch(const std::string& host) const { +bool CookieBase::IsDomainMatch(const std::string_view host) const { return cookie_util::IsDomainMatch(domain_, host); } diff --git a/naiveproxy/src/net/cookies/cookie_base.h b/naiveproxy/src/net/cookies/cookie_base.h index 78f2c8a534..eb485c07bc 100644 --- a/naiveproxy/src/net/cookies/cookie_base.h +++ b/naiveproxy/src/net/cookies/cookie_base.h @@ -59,7 +59,7 @@ class NET_EXPORT CookieBase { // Returns true if the given |url_path| path-matches this cookie's cookie-path // as described in section 5.1.4 in RFC 6265. This returns true if |path_| and // |url_path| are identical, or if |url_path| is a subdirectory of |path_|. - bool IsOnPath(const std::string& url_path) const; + bool IsOnPath(const std::string_view url_path) const; // This returns true if this cookie's |domain_| indicates that it can be // accessed by |host|. @@ -78,7 +78,7 @@ class NET_EXPORT CookieBase { // is identical (which reflects the intended behavior when the cookie has a // host-only-flag), whereas the RFC also treats them as domain-matching if // |domain_| is a subdomain of |host|. - bool IsDomainMatch(const std::string& host) const; + bool IsDomainMatch(const std::string_view host) const; const std::string& Name() const { return name_; } // We represent the cookie's host-only-flag as the absence of a leading dot in diff --git a/naiveproxy/src/net/cookies/cookie_change_dispatcher.h b/naiveproxy/src/net/cookies/cookie_change_dispatcher.h index 3cce48951d..0dc2c8f410 100644 --- a/naiveproxy/src/net/cookies/cookie_change_dispatcher.h +++ b/naiveproxy/src/net/cookies/cookie_change_dispatcher.h @@ -20,6 +20,7 @@ namespace net { class CanonicalCookie; // The publicly relevant reasons a cookie might be changed. +// LINT.IfChange(CookieChangeCause) enum class CookieChangeCause { // The cookie was inserted. INSERTED, @@ -39,7 +40,10 @@ enum class CookieChangeCause { // The newly inserted cookie overwrote a cookie but did not result in any // change. INSERTED_NO_CHANGE_OVERWRITE, + + kMaxValue = INSERTED_NO_CHANGE_OVERWRITE, }; +// LINT.ThenChange(//tools/metrics/histograms/metadata/navigation/enums.xml:CookieChangeCause) struct NET_EXPORT CookieChangeInfo { CookieChangeInfo(); diff --git a/naiveproxy/src/net/cookies/cookie_constants.cc b/naiveproxy/src/net/cookies/cookie_constants.cc index 9ebb6f46ec..6216d45f9d 100644 --- a/naiveproxy/src/net/cookies/cookie_constants.cc +++ b/naiveproxy/src/net/cookies/cookie_constants.cc @@ -13,6 +13,7 @@ #include "base/notreached.h" #include "base/rand_util.h" #include "base/strings/string_util.h" +#include "url/gurl.h" #include "url/url_constants.h" namespace net { diff --git a/naiveproxy/src/net/cookies/cookie_deletion_info.h b/naiveproxy/src/net/cookies/cookie_deletion_info.h index ddc5ea64b7..24244583ef 100644 --- a/naiveproxy/src/net/cookies/cookie_deletion_info.h +++ b/naiveproxy/src/net/cookies/cookie_deletion_info.h @@ -13,6 +13,7 @@ #include "net/cookies/canonical_cookie.h" #include "net/cookies/cookie_constants.h" #include "net/cookies/cookie_partition_key_collection.h" +#include "url/gurl.h" namespace net { diff --git a/naiveproxy/src/net/cookies/cookie_monster.cc b/naiveproxy/src/net/cookies/cookie_monster.cc index 227b2bed2b..1df40f07d9 100644 --- a/naiveproxy/src/net/cookies/cookie_monster.cc +++ b/naiveproxy/src/net/cookies/cookie_monster.cc @@ -775,7 +775,7 @@ void CookieMonster::GetCookieListWithOptions( // Retrieve the domain, check this domain to see if this is the first // time it is entering legacy mode, if it is delete all aliasing cookies // within this domain. - CheckAndActivateLegacyScopeBehavior(url.host_piece()); + CheckAndActivateLegacyScopeBehavior(url.host()); std::vector cookie_ptrs = FindCookiesForRegistryControlledHost(url); @@ -1288,7 +1288,7 @@ CookieMonster::FindCookiesForRegistryControlledHost( Time current_time = Time::Now(); // Retrieve all cookies for a given key - const std::string key(GetKey(url.host_piece())); + const std::string key(GetKey(url.host())); std::vector cookies; for (CookieMapItPair its = cookie_map->equal_range(key); @@ -2680,7 +2680,7 @@ bool CookieMonster::HasCookieableScheme(const GURL& url) { if (!is_cookieable) { // The scheme didn't match any in our allowed list. DVLOG(net::cookie_util::kVlogPerCookieMonster) - << "WARNING: Unsupported cookie scheme: " << url.scheme(); + << "WARNING: Unsupported cookie scheme: " << url.GetScheme(); } return is_cookieable; } @@ -2939,7 +2939,7 @@ void CookieMonster::RecordPeriodicFirstPartySetsStats( DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); if (!site.has_registrable_domain_or_host()) return acc; - return acc + cookies_.count(GetKey(site.GetURL().host())); + return acc + cookies_.count(GetKey(site.GetURL().GetHost())); }); base::UmaHistogramCustomCounts("Cookie.PerFirstPartySetCount", sample, 0, 4000, 50); @@ -2966,7 +2966,7 @@ void CookieMonster::DoCookieCallback(base::OnceClosure callback) { void CookieMonster::DoCookieCallbackForURL(base::OnceClosure callback, const GURL& url) { - DoCookieCallbackForHostOrDomain(std::move(callback), url.host_piece()); + DoCookieCallbackForHostOrDomain(std::move(callback), url.host()); } void CookieMonster::DoCookieCallbackForHostOrDomain( @@ -3023,7 +3023,7 @@ CookieMonster::IsCookieSentToSamePortThatSetIt( if (source_port == destination_port) return CookieSentToSamePort::kYes; - const std::string& destination_scheme = destination.scheme(); + const std::string& destination_scheme = destination.GetScheme(); bool destination_port_is_default = url::DefaultPortForScheme(destination_scheme) == destination_port; @@ -3049,7 +3049,7 @@ std::optional CookieMonster::SiteHasCookieInOtherPartition( const net::SchemefulSite& site, const CookiePartitionKey& partition_key) const { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - std::string domain = site.GetURL().host(); + std::string domain = site.GetURL().GetHost(); if (store_ && !finished_fetching_all_cookies_ && !keys_loaded_.count(domain)) { return std::nullopt; diff --git a/naiveproxy/src/net/cookies/cookie_partition_key.cc b/naiveproxy/src/net/cookies/cookie_partition_key.cc index a1447e5260..7af85cc442 100644 --- a/naiveproxy/src/net/cookies/cookie_partition_key.cc +++ b/naiveproxy/src/net/cookies/cookie_partition_key.cc @@ -19,6 +19,7 @@ #include "net/cookies/cookie_constants.h" #include "net/cookies/cookie_util.h" #include "net/cookies/site_for_cookies.h" +#include "url/gurl.h" #if !BUILDFLAG(CRONET_BUILD) #include "mojo/public/cpp/bindings/default_construct_tag.h" diff --git a/naiveproxy/src/net/cookies/cookie_store_change_unittest.h b/naiveproxy/src/net/cookies/cookie_store_change_unittest.h index 10459879d4..4b6e2a2680 100644 --- a/naiveproxy/src/net/cookies/cookie_store_change_unittest.h +++ b/naiveproxy/src/net/cookies/cookie_store_change_unittest.h @@ -168,7 +168,7 @@ TYPED_TEST_P(CookieStoreChangeGlobalTest, InsertOne) { ASSERT_EQ(1u, cookie_changes.size()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[0].cause)); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_EQ("A", cookie_changes[0].cookie.Name()); EXPECT_EQ("B", cookie_changes[0].cookie.Value()); @@ -200,13 +200,13 @@ TYPED_TEST_P(CookieStoreChangeGlobalTest, InsertMany) { ASSERT_LE(1u, cookie_changes.size()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[0].cause)); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_EQ("A", cookie_changes[0].cookie.Name()); EXPECT_EQ("B", cookie_changes[0].cookie.Value()); ASSERT_LE(2u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[1].cause)); @@ -214,7 +214,7 @@ TYPED_TEST_P(CookieStoreChangeGlobalTest, InsertMany) { EXPECT_EQ("D", cookie_changes[1].cookie.Value()); ASSERT_LE(3u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[2].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[2].cause)); @@ -222,7 +222,7 @@ TYPED_TEST_P(CookieStoreChangeGlobalTest, InsertMany) { EXPECT_EQ("F", cookie_changes[2].cookie.Value()); ASSERT_LE(4u, cookie_changes.size()); - EXPECT_EQ(this->http_bar_com_.url().host(), + EXPECT_EQ(this->http_bar_com_.url().GetHost(), cookie_changes[3].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[3].cause)); @@ -248,11 +248,11 @@ TYPED_TEST_P(CookieStoreChangeGlobalTest, DeleteOne) { cookie_changes.clear(); EXPECT_TRUE( - this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), "A")); + this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), "A")); this->DeliverChangeNotifications(); ASSERT_EQ(1u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::EXPLICIT, cookie_changes[0].cause)); @@ -279,9 +279,9 @@ TYPED_TEST_P(CookieStoreChangeGlobalTest, DeleteTwo) { cookie_changes.clear(); EXPECT_TRUE( - this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), "C")); + this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), "C")); EXPECT_TRUE( - this->FindAndDeleteCookie(cs, this->http_bar_com_.url().host(), "G")); + this->FindAndDeleteCookie(cs, this->http_bar_com_.url().GetHost(), "G")); this->DeliverChangeNotifications(); // Check that the cookie changes are dispatched before calling GetCookies. @@ -292,7 +292,7 @@ TYPED_TEST_P(CookieStoreChangeGlobalTest, DeleteTwo) { EXPECT_EQ("", this->GetCookies(cs, this->http_bar_com_.url())); ASSERT_LE(1u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::EXPLICIT, cookie_changes[0].cause)); @@ -300,7 +300,7 @@ TYPED_TEST_P(CookieStoreChangeGlobalTest, DeleteTwo) { EXPECT_EQ("D", cookie_changes[0].cookie.Value()); ASSERT_EQ(2u, cookie_changes.size()); - EXPECT_EQ(this->http_bar_com_.url().host(), + EXPECT_EQ(this->http_bar_com_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::EXPLICIT, cookie_changes[1].cause)); @@ -332,7 +332,7 @@ TYPED_TEST_P(CookieStoreChangeGlobalTest, Overwrite) { this->DeliverChangeNotifications(); ASSERT_LE(1u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE(this->MatchesCause(CookieChangeCause::OVERWRITE, cookie_changes[0].cause)); @@ -340,7 +340,7 @@ TYPED_TEST_P(CookieStoreChangeGlobalTest, Overwrite) { EXPECT_EQ("B", cookie_changes[0].cookie.Value()); ASSERT_LE(2u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[1].cause)); @@ -403,7 +403,7 @@ TYPED_TEST_P(CookieStoreChangeGlobalTest, OverwriteWithHttpOnly) { ASSERT_EQ(1u, cookie_changes.size()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[0].cause)); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_EQ("A", cookie_changes[0].cookie.Name()); EXPECT_EQ("B", cookie_changes[0].cookie.Value()); @@ -423,7 +423,7 @@ TYPED_TEST_P(CookieStoreChangeGlobalTest, OverwriteWithHttpOnly) { this->DeliverChangeNotifications(); ASSERT_LE(1u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE(this->MatchesCause(CookieChangeCause::OVERWRITE, cookie_changes[0].cause)); @@ -432,7 +432,7 @@ TYPED_TEST_P(CookieStoreChangeGlobalTest, OverwriteWithHttpOnly) { EXPECT_FALSE(cookie_changes[0].cookie.IsHttpOnly()); ASSERT_LE(2u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[1].cause)); @@ -829,7 +829,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, InsertOne) { EXPECT_EQ("A", cookie_changes[0].cookie.Name()); EXPECT_EQ("B", cookie_changes[0].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[0].cause)); @@ -855,13 +855,13 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, InsertMany) { ASSERT_LE(1u, cookie_changes.size()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[0].cause)); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_EQ("A", cookie_changes[0].cookie.Name()); EXPECT_EQ("B", cookie_changes[0].cookie.Value()); ASSERT_LE(2u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[1].cause)); @@ -869,7 +869,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, InsertMany) { EXPECT_EQ("D", cookie_changes[1].cookie.Value()); ASSERT_LE(3u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[2].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[2].cause)); @@ -908,7 +908,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, InsertFiltering) { EXPECT_EQ("A", cookie_changes[0].cookie.Name()); EXPECT_EQ("B", cookie_changes[0].cookie.Value()); EXPECT_EQ("/", cookie_changes[0].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[0].cause)); @@ -917,7 +917,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, InsertFiltering) { EXPECT_EQ("I", cookie_changes[1].cookie.Name()); EXPECT_EQ("J", cookie_changes[1].cookie.Value()); EXPECT_EQ("/foo", cookie_changes[1].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[1].cause)); @@ -951,13 +951,13 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, DeleteOne) { cookie_changes.clear(); EXPECT_TRUE( - this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), "A")); + this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), "A")); this->DeliverChangeNotifications(); ASSERT_EQ(1u, cookie_changes.size()); EXPECT_EQ("A", cookie_changes[0].cookie.Name()); EXPECT_EQ("B", cookie_changes[0].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); ASSERT_TRUE( this->MatchesCause(CookieChangeCause::EXPLICIT, cookie_changes[0].cause)); @@ -984,9 +984,9 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, DeleteTwo) { cookie_changes.clear(); EXPECT_TRUE( - this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), "C")); + this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), "C")); EXPECT_TRUE( - this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), "G")); + this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), "G")); this->DeliverChangeNotifications(); // Check that the cookie changes are dispatched before calling GetCookies. @@ -996,7 +996,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, DeleteTwo) { EXPECT_EQ("A=B; E=F", this->GetCookies(cs, this->http_www_foo_.url())); ASSERT_LE(1u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::EXPLICIT, cookie_changes[0].cause)); @@ -1004,7 +1004,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, DeleteTwo) { EXPECT_EQ("D", cookie_changes[0].cookie.Value()); ASSERT_EQ(2u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::EXPLICIT, cookie_changes[1].cause)); @@ -1037,15 +1037,15 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, DeleteFiltering) { cookie_changes.clear(); EXPECT_TRUE( - this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), "A")); + this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), "A")); EXPECT_TRUE( - this->FindAndDeleteCookie(cs, this->http_bar_com_.url().host(), "C")); + this->FindAndDeleteCookie(cs, this->http_bar_com_.url().GetHost(), "C")); EXPECT_TRUE( - this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), "E")); + this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), "E")); EXPECT_TRUE( - this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), "G")); + this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), "G")); EXPECT_TRUE( - this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), "I")); + this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), "I")); EXPECT_TRUE(this->FindAndDeleteCookie(cs, ".foo.com", "K")); this->DeliverChangeNotifications(); @@ -1053,7 +1053,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, DeleteFiltering) { EXPECT_EQ("A", cookie_changes[0].cookie.Name()); EXPECT_EQ("B", cookie_changes[0].cookie.Value()); EXPECT_EQ("/", cookie_changes[0].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::EXPLICIT, cookie_changes[0].cause)); @@ -1062,7 +1062,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, DeleteFiltering) { EXPECT_EQ("I", cookie_changes[1].cookie.Name()); EXPECT_EQ("J", cookie_changes[1].cookie.Value()); EXPECT_EQ("/foo", cookie_changes[1].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::EXPLICIT, cookie_changes[1].cause)); @@ -1104,7 +1104,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, Overwrite) { this->DeliverChangeNotifications(); ASSERT_LE(1u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE(this->MatchesCause(CookieChangeCause::OVERWRITE, cookie_changes[0].cause)); @@ -1112,7 +1112,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, Overwrite) { EXPECT_EQ("B", cookie_changes[0].cookie.Value()); ASSERT_LE(2u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[1].cause)); @@ -1200,7 +1200,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, OverwriteFiltering) { EXPECT_EQ("A", cookie_changes[0].cookie.Name()); EXPECT_EQ("B", cookie_changes[0].cookie.Value()); EXPECT_EQ("/", cookie_changes[0].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE(this->MatchesCause(CookieChangeCause::OVERWRITE, cookie_changes[0].cause)); @@ -1209,7 +1209,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, OverwriteFiltering) { EXPECT_EQ("A", cookie_changes[1].cookie.Name()); EXPECT_EQ("b", cookie_changes[1].cookie.Value()); EXPECT_EQ("/", cookie_changes[1].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_EQ(CookieChangeCause::INSERTED, cookie_changes[1].cause); EXPECT_TRUE( @@ -1219,7 +1219,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, OverwriteFiltering) { EXPECT_EQ("I", cookie_changes[2].cookie.Name()); EXPECT_EQ("J", cookie_changes[2].cookie.Value()); EXPECT_EQ("/foo", cookie_changes[2].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[2].cookie.Domain()); EXPECT_TRUE(this->MatchesCause(CookieChangeCause::OVERWRITE, cookie_changes[2].cause)); @@ -1228,7 +1228,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, OverwriteFiltering) { EXPECT_EQ("I", cookie_changes[3].cookie.Name()); EXPECT_EQ("j", cookie_changes[3].cookie.Value()); EXPECT_EQ("/foo", cookie_changes[3].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[3].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[3].cause)); @@ -1273,7 +1273,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, OverwriteWithHttpOnly) { ASSERT_EQ(1u, cookie_changes.size()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[0].cause)); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_EQ("A", cookie_changes[0].cookie.Name()); EXPECT_EQ("B", cookie_changes[0].cookie.Value()); @@ -1293,7 +1293,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, OverwriteWithHttpOnly) { this->DeliverChangeNotifications(); ASSERT_LE(1u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE(this->MatchesCause(CookieChangeCause::OVERWRITE, cookie_changes[0].cause)); @@ -1302,7 +1302,7 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, OverwriteWithHttpOnly) { EXPECT_FALSE(cookie_changes[0].cookie.IsHttpOnly()); ASSERT_LE(2u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[1].cause)); @@ -1573,13 +1573,13 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, DifferentSubscriptionsDisjoint) { ASSERT_EQ(1u, cookie_changes_1.size()); EXPECT_EQ("A", cookie_changes_1[0].cookie.Name()); EXPECT_EQ("B", cookie_changes_1[0].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_1[0].cookie.Domain()); ASSERT_EQ(1u, cookie_changes_2.size()); EXPECT_EQ("C", cookie_changes_2[0].cookie.Name()); EXPECT_EQ("D", cookie_changes_2[0].cookie.Value()); - EXPECT_EQ(this->http_bar_com_.url().host(), + EXPECT_EQ(this->http_bar_com_.url().GetHost(), cookie_changes_2[0].cookie.Domain()); } @@ -1617,13 +1617,13 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, DifferentSubscriptionsDomains) { ASSERT_EQ(1u, cookie_changes_1.size()); EXPECT_EQ("A", cookie_changes_1[0].cookie.Name()); EXPECT_EQ("B", cookie_changes_1[0].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_1[0].cookie.Domain()); ASSERT_EQ(1u, cookie_changes_2.size()); EXPECT_EQ("C", cookie_changes_2[0].cookie.Name()); EXPECT_EQ("D", cookie_changes_2[0].cookie.Value()); - EXPECT_EQ(this->http_bar_com_.url().host(), + EXPECT_EQ(this->http_bar_com_.url().GetHost(), cookie_changes_2[0].cookie.Domain()); } @@ -1662,21 +1662,21 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, DifferentSubscriptionsPaths) { EXPECT_EQ("A", cookie_changes_1[0].cookie.Name()); EXPECT_EQ("B", cookie_changes_1[0].cookie.Value()); EXPECT_EQ("/", cookie_changes_1[0].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_1[0].cookie.Domain()); ASSERT_LE(1u, cookie_changes_2.size()); EXPECT_EQ("A", cookie_changes_2[0].cookie.Name()); EXPECT_EQ("B", cookie_changes_2[0].cookie.Value()); EXPECT_EQ("/", cookie_changes_2[0].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_2[0].cookie.Domain()); ASSERT_LE(2u, cookie_changes_2.size()); EXPECT_EQ("C", cookie_changes_2[1].cookie.Name()); EXPECT_EQ("D", cookie_changes_2[1].cookie.Value()); EXPECT_EQ("/foo", cookie_changes_2[1].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_2[1].cookie.Domain()); EXPECT_EQ(2u, cookie_changes_2.size()); @@ -1731,14 +1731,14 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, DifferentSubscriptionsFiltering) { ASSERT_LE(1u, cookie_changes_1.size()); EXPECT_EQ("A", cookie_changes_1[0].cookie.Name()); EXPECT_EQ("B", cookie_changes_1[0].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_1[0].cookie.Domain()); EXPECT_EQ(1u, cookie_changes_1.size()); ASSERT_LE(1u, cookie_changes_2.size()); EXPECT_EQ("C", cookie_changes_2[0].cookie.Name()); EXPECT_EQ("D", cookie_changes_2[0].cookie.Value()); - EXPECT_EQ(this->http_bar_com_.url().host(), + EXPECT_EQ(this->http_bar_com_.url().GetHost(), cookie_changes_2[0].cookie.Domain()); EXPECT_EQ(1u, cookie_changes_2.size()); @@ -1746,14 +1746,14 @@ TYPED_TEST_P(CookieStoreChangeUrlTest, DifferentSubscriptionsFiltering) { EXPECT_EQ("A", cookie_changes_3[0].cookie.Name()); EXPECT_EQ("B", cookie_changes_3[0].cookie.Value()); EXPECT_EQ("/", cookie_changes_3[0].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_3[0].cookie.Domain()); ASSERT_LE(2u, cookie_changes_3.size()); EXPECT_EQ("E", cookie_changes_3[1].cookie.Name()); EXPECT_EQ("F", cookie_changes_3[1].cookie.Value()); EXPECT_EQ("/foo", cookie_changes_3[1].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_3[1].cookie.Domain()); EXPECT_EQ(2u, cookie_changes_3.size()); @@ -2000,7 +2000,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, InsertOne) { EXPECT_EQ("abc", cookie_changes[0].cookie.Name()); EXPECT_EQ("def", cookie_changes[0].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[0].cause)); @@ -2031,7 +2031,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, InsertTwo) { EXPECT_EQ("abc", cookie_changes[0].cookie.Name()); EXPECT_EQ("def", cookie_changes[0].cookie.Value()); EXPECT_EQ("/", cookie_changes[0].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[0].cause)); @@ -2040,7 +2040,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, InsertTwo) { EXPECT_EQ("abc", cookie_changes[1].cookie.Name()); EXPECT_EQ("hij", cookie_changes[1].cookie.Value()); EXPECT_EQ("/foo", cookie_changes[1].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[1].cause)); @@ -2083,7 +2083,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, InsertFiltering) { EXPECT_EQ("abc", cookie_changes[0].cookie.Name()); EXPECT_EQ("def", cookie_changes[0].cookie.Value()); EXPECT_EQ("/", cookie_changes[0].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[0].cause)); @@ -2092,7 +2092,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, InsertFiltering) { EXPECT_EQ("abc", cookie_changes[1].cookie.Name()); EXPECT_EQ("pqr", cookie_changes[1].cookie.Value()); EXPECT_EQ("/foo", cookie_changes[1].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[1].cause)); @@ -2126,14 +2126,14 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, DeleteOne) { EXPECT_EQ(1u, cookie_changes.size()); cookie_changes.clear(); - EXPECT_TRUE( - this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), "abc")); + EXPECT_TRUE(this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), + "abc")); this->DeliverChangeNotifications(); ASSERT_EQ(1u, cookie_changes.size()); EXPECT_EQ("abc", cookie_changes[0].cookie.Name()); EXPECT_EQ("def", cookie_changes[0].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::EXPLICIT, cookie_changes[0].cause)); @@ -2159,9 +2159,9 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, DeleteTwo) { EXPECT_EQ(2u, cookie_changes.size()); cookie_changes.clear(); - EXPECT_TRUE(this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), + EXPECT_TRUE(this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), "abc", "/")); - EXPECT_TRUE(this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), + EXPECT_TRUE(this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), "abc", "/foo")); this->DeliverChangeNotifications(); @@ -2169,7 +2169,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, DeleteTwo) { EXPECT_EQ("abc", cookie_changes[0].cookie.Name()); EXPECT_EQ("def", cookie_changes[0].cookie.Value()); EXPECT_EQ("/", cookie_changes[0].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::EXPLICIT, cookie_changes[0].cause)); @@ -2178,7 +2178,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, DeleteTwo) { EXPECT_EQ("abc", cookie_changes[1].cookie.Name()); EXPECT_EQ("hij", cookie_changes[1].cookie.Value()); EXPECT_EQ("/foo", cookie_changes[1].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::EXPLICIT, cookie_changes[1].cause)); @@ -2213,15 +2213,15 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, DeleteFiltering) { EXPECT_EQ(3u, cookie_changes.size()); cookie_changes.clear(); - EXPECT_TRUE( - this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), "xyz")); - EXPECT_TRUE( - this->FindAndDeleteCookie(cs, this->http_bar_com_.url().host(), "abc")); - EXPECT_TRUE(this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), + EXPECT_TRUE(this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), + "xyz")); + EXPECT_TRUE(this->FindAndDeleteCookie(cs, this->http_bar_com_.url().GetHost(), + "abc")); + EXPECT_TRUE(this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), "abc", "/foo/bar")); - EXPECT_TRUE(this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), + EXPECT_TRUE(this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), "abc", "/foo")); - EXPECT_TRUE(this->FindAndDeleteCookie(cs, this->http_www_foo_.url().host(), + EXPECT_TRUE(this->FindAndDeleteCookie(cs, this->http_www_foo_.url().GetHost(), "abc", "/")); EXPECT_TRUE(this->FindAndDeleteCookie(cs, ".foo.com", "abc", "/")); this->DeliverChangeNotifications(); @@ -2230,7 +2230,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, DeleteFiltering) { EXPECT_EQ("abc", cookie_changes[0].cookie.Name()); EXPECT_EQ("mno", cookie_changes[0].cookie.Value()); EXPECT_EQ("/foo", cookie_changes[0].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::EXPLICIT, cookie_changes[0].cause)); @@ -2239,7 +2239,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, DeleteFiltering) { EXPECT_EQ("abc", cookie_changes[1].cookie.Name()); EXPECT_EQ("pqr", cookie_changes[1].cookie.Value()); EXPECT_EQ("/", cookie_changes[1].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::EXPLICIT, cookie_changes[1].cause)); @@ -2284,7 +2284,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, Overwrite) { EXPECT_LE(1u, cookie_changes.size()); EXPECT_EQ("abc", cookie_changes[0].cookie.Name()); EXPECT_EQ("def", cookie_changes[0].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE(this->MatchesCause(CookieChangeCause::OVERWRITE, cookie_changes[0].cause)); @@ -2292,7 +2292,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, Overwrite) { EXPECT_LE(2u, cookie_changes.size()); EXPECT_EQ("abc", cookie_changes[1].cookie.Name()); EXPECT_EQ("ghi", cookie_changes[1].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[1].cause)); @@ -2393,7 +2393,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, OverwriteFiltering) { EXPECT_EQ("abc", cookie_changes[0].cookie.Name()); EXPECT_EQ("mno1", cookie_changes[0].cookie.Value()); EXPECT_EQ("/foo", cookie_changes[0].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE(this->MatchesCause(CookieChangeCause::OVERWRITE, cookie_changes[0].cause)); @@ -2402,7 +2402,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, OverwriteFiltering) { EXPECT_EQ("abc", cookie_changes[1].cookie.Name()); EXPECT_EQ("mno2", cookie_changes[1].cookie.Value()); EXPECT_EQ("/foo", cookie_changes[1].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[1].cause)); @@ -2411,7 +2411,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, OverwriteFiltering) { EXPECT_EQ("abc", cookie_changes[2].cookie.Name()); EXPECT_EQ("pqr1", cookie_changes[2].cookie.Value()); EXPECT_EQ("/", cookie_changes[2].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[2].cookie.Domain()); EXPECT_TRUE(this->MatchesCause(CookieChangeCause::OVERWRITE, cookie_changes[2].cause)); @@ -2420,7 +2420,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, OverwriteFiltering) { EXPECT_EQ("abc", cookie_changes[3].cookie.Name()); EXPECT_EQ("pqr2", cookie_changes[3].cookie.Value()); EXPECT_EQ("/", cookie_changes[3].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[3].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[3].cause)); @@ -2467,7 +2467,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, OverwriteWithHttpOnly) { ASSERT_EQ(1u, cookie_changes.size()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[0].cause)); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_EQ("abc", cookie_changes[0].cookie.Name()); EXPECT_EQ("def", cookie_changes[0].cookie.Value()); @@ -2487,7 +2487,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, OverwriteWithHttpOnly) { this->DeliverChangeNotifications(); ASSERT_LE(1u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[0].cookie.Domain()); EXPECT_TRUE(this->MatchesCause(CookieChangeCause::OVERWRITE, cookie_changes[0].cause)); @@ -2496,7 +2496,7 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, OverwriteWithHttpOnly) { EXPECT_FALSE(cookie_changes[0].cookie.IsHttpOnly()); ASSERT_LE(2u, cookie_changes.size()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes[1].cookie.Domain()); EXPECT_TRUE( this->MatchesCause(CookieChangeCause::INSERTED, cookie_changes[1].cause)); @@ -2794,13 +2794,13 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, DifferentSubscriptionsDisjoint) { ASSERT_EQ(1u, cookie_changes_1.size()); EXPECT_EQ("abc", cookie_changes_1[0].cookie.Name()); EXPECT_EQ("def", cookie_changes_1[0].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_1[0].cookie.Domain()); ASSERT_EQ(1u, cookie_changes_2.size()); EXPECT_EQ("ghi", cookie_changes_2[0].cookie.Name()); EXPECT_EQ("jkl", cookie_changes_2[0].cookie.Value()); - EXPECT_EQ(this->http_bar_com_.url().host(), + EXPECT_EQ(this->http_bar_com_.url().GetHost(), cookie_changes_2[0].cookie.Domain()); } @@ -2840,13 +2840,13 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, DifferentSubscriptionsDomains) { ASSERT_EQ(1u, cookie_changes_1.size()); EXPECT_EQ("abc", cookie_changes_1[0].cookie.Name()); EXPECT_EQ("def", cookie_changes_1[0].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_1[0].cookie.Domain()); ASSERT_EQ(1u, cookie_changes_2.size()); EXPECT_EQ("abc", cookie_changes_2[0].cookie.Name()); EXPECT_EQ("ghi", cookie_changes_2[0].cookie.Value()); - EXPECT_EQ(this->http_bar_com_.url().host(), + EXPECT_EQ(this->http_bar_com_.url().GetHost(), cookie_changes_2[0].cookie.Domain()); } @@ -2886,13 +2886,13 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, DifferentSubscriptionsNames) { ASSERT_EQ(1u, cookie_changes_1.size()); EXPECT_EQ("abc", cookie_changes_1[0].cookie.Name()); EXPECT_EQ("def", cookie_changes_1[0].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_1[0].cookie.Domain()); ASSERT_EQ(1u, cookie_changes_2.size()); EXPECT_EQ("ghi", cookie_changes_2[0].cookie.Name()); EXPECT_EQ("jkl", cookie_changes_2[0].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_2[0].cookie.Domain()); } @@ -2934,21 +2934,21 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, DifferentSubscriptionsPaths) { EXPECT_EQ("abc", cookie_changes_1[0].cookie.Name()); EXPECT_EQ("def", cookie_changes_1[0].cookie.Value()); EXPECT_EQ("/", cookie_changes_1[0].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_1[0].cookie.Domain()); ASSERT_LE(1u, cookie_changes_2.size()); EXPECT_EQ("abc", cookie_changes_2[0].cookie.Name()); EXPECT_EQ("def", cookie_changes_2[0].cookie.Value()); EXPECT_EQ("/", cookie_changes_2[0].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_2[0].cookie.Domain()); ASSERT_LE(2u, cookie_changes_2.size()); EXPECT_EQ("abc", cookie_changes_2[1].cookie.Name()); EXPECT_EQ("ghi", cookie_changes_2[1].cookie.Value()); EXPECT_EQ("/foo", cookie_changes_2[1].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_2[1].cookie.Domain()); EXPECT_EQ(2u, cookie_changes_2.size()); @@ -3027,21 +3027,21 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, DifferentSubscriptionsFiltering) { ASSERT_LE(1u, cookie_changes_1.size()); EXPECT_EQ("abc", cookie_changes_1[0].cookie.Name()); EXPECT_EQ("def", cookie_changes_1[0].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_1[0].cookie.Domain()); EXPECT_EQ(1u, cookie_changes_1.size()); ASSERT_LE(1u, cookie_changes_2.size()); EXPECT_EQ("hij", cookie_changes_2[0].cookie.Name()); EXPECT_EQ("mno", cookie_changes_2[0].cookie.Value()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_2[0].cookie.Domain()); EXPECT_EQ(1u, cookie_changes_2.size()); ASSERT_LE(1u, cookie_changes_3.size()); EXPECT_EQ("abc", cookie_changes_3[0].cookie.Name()); EXPECT_EQ("stu", cookie_changes_3[0].cookie.Value()); - EXPECT_EQ(this->http_bar_com_.url().host(), + EXPECT_EQ(this->http_bar_com_.url().GetHost(), cookie_changes_3[0].cookie.Domain()); EXPECT_EQ(1u, cookie_changes_3.size()); @@ -3049,14 +3049,14 @@ TYPED_TEST_P(CookieStoreChangeNamedTest, DifferentSubscriptionsFiltering) { EXPECT_EQ("abc", cookie_changes_4[0].cookie.Name()); EXPECT_EQ("def", cookie_changes_4[0].cookie.Value()); EXPECT_EQ("/", cookie_changes_4[0].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_4[0].cookie.Domain()); ASSERT_LE(2u, cookie_changes_4.size()); EXPECT_EQ("abc", cookie_changes_4[1].cookie.Name()); EXPECT_EQ("vwx", cookie_changes_4[1].cookie.Value()); EXPECT_EQ("/foo", cookie_changes_4[1].cookie.Path()); - EXPECT_EQ(this->http_www_foo_.url().host(), + EXPECT_EQ(this->http_www_foo_.url().GetHost(), cookie_changes_4[1].cookie.Domain()); EXPECT_EQ(2u, cookie_changes_4.size()); diff --git a/naiveproxy/src/net/cookies/cookie_store_test_helpers.cc b/naiveproxy/src/net/cookies/cookie_store_test_helpers.cc index fed0d61646..70dfe4b1c5 100644 --- a/naiveproxy/src/net/cookies/cookie_store_test_helpers.cc +++ b/naiveproxy/src/net/cookies/cookie_store_test_helpers.cc @@ -32,7 +32,7 @@ std::string GetRegistry(const GURL& url) { INCLUDE_PRIVATE_REGISTRIES); if (registry_length == 0) return std::string(); - return std::string(url.host(), url.host().length() - registry_length, + return std::string(url.GetHost(), url.GetHost().length() - registry_length, registry_length); } diff --git a/naiveproxy/src/net/cookies/cookie_store_test_helpers.h b/naiveproxy/src/net/cookies/cookie_store_test_helpers.h index 24862fc4e1..d81a37b5d7 100644 --- a/naiveproxy/src/net/cookies/cookie_store_test_helpers.h +++ b/naiveproxy/src/net/cookies/cookie_store_test_helpers.h @@ -11,6 +11,7 @@ #include #include "base/functional/callback_forward.h" +#include "base/memory/ref_counted.h" #include "base/synchronization/lock.h" #include "net/cookies/cookie_change_dispatcher.h" #include "net/cookies/cookie_monster.h" @@ -139,7 +140,7 @@ class CookieURLHelper { explicit CookieURLHelper(const std::string& url_string); const std::string& domain() const { return domain_and_registry_; } - std::string host() const { return url_.host(); } + std::string host() const { return url_.GetHost(); } const GURL& url() const { return url_; } const GURL AppendPath(const std::string& path) const; diff --git a/naiveproxy/src/net/cookies/cookie_store_unittest.h b/naiveproxy/src/net/cookies/cookie_store_unittest.h index d68677670d..b8cc9621c4 100644 --- a/naiveproxy/src/net/cookies/cookie_store_unittest.h +++ b/naiveproxy/src/net/cookies/cookie_store_unittest.h @@ -598,10 +598,10 @@ TYPED_TEST_P(CookieStoreTest, SetCanonicalCookieTest) { base::Time one_hour_ago = base::Time::Now() - base::Hours(1); base::Time one_hour_from_now = base::Time::Now() + base::Hours(1); - std::string foo_foo_host(this->www_foo_foo_.url().host()); + std::string foo_foo_host(this->www_foo_foo_.url().GetHost()); std::string foo_bar_domain(this->www_foo_bar_.domain()); - std::string http_foo_host(this->http_www_foo_.url().host()); - std::string https_foo_host(this->https_www_foo_.url().host()); + std::string http_foo_host(this->http_www_foo_.url().GetHost()); + std::string https_foo_host(this->https_www_foo_.url().GetHost()); EXPECT_TRUE(this->SetCanonicalCookie( cs, @@ -794,9 +794,9 @@ TYPED_TEST_P(CookieStoreTest, SetCanonicalCookieTest) { TYPED_TEST_P(CookieStoreTest, SecureEnforcement) { CookieStore* cs = this->GetCookieStore(); GURL http_url(this->http_www_foo_.url()); - std::string http_domain(http_url.host()); + std::string http_domain(http_url.GetHost()); GURL https_url(this->https_www_foo_.url()); - std::string https_domain(https_url.host()); + std::string https_domain(https_url.GetHost()); // Confirm that setting the secure attribute from an insecure source fails, // but the other combinations work. diff --git a/naiveproxy/src/net/cookies/cookie_util.cc b/naiveproxy/src/net/cookies/cookie_util.cc index a9e4e448f8..79c7e458bd 100644 --- a/naiveproxy/src/net/cookies/cookie_util.cc +++ b/naiveproxy/src/net/cookies/cookie_util.cc @@ -116,7 +116,7 @@ bool HasValidHostPrefixAttributes(const GURL& url, if (!HasValidSecurePrefixAttributes(url, secure) || path != "/") { return false; } - return domain.empty() || (url.HostIsIPAddress() && url.host() == domain); + return domain.empty() || (url.HostIsIPAddress() && url.GetHost() == domain); } // Tests that a cookie has the attributes for a valid __Http- prefix without @@ -346,18 +346,17 @@ void FireStorageAccessHistogram(StorageAccessResult result) { UMA_HISTOGRAM_ENUMERATION("API.StorageAccess.AllowedRequests4", result); } -bool DomainIsHostOnly(const std::string& domain_string) { +bool DomainIsHostOnly(std::string_view domain_string) { return (domain_string.empty() || domain_string[0] != '.'); } -std::string CookieDomainAsHost(const std::string& cookie_domain) { +std::string CookieDomainAsHost(std::string_view cookie_domain) { if (DomainIsHostOnly(cookie_domain)) - return cookie_domain; - return cookie_domain.substr(1); + return std::string(cookie_domain); + return std::string(cookie_domain.substr(1)); } -std::string GetEffectiveDomain(const std::string& scheme, - const std::string& host) { +std::string GetEffectiveDomain(std::string_view scheme, std::string_view host) { if (scheme == "http" || scheme == "https" || scheme == "ws" || scheme == "wss") { return registry_controlled_domains::GetDomainAndRegistry( @@ -383,7 +382,7 @@ std::optional GetCookieDomainWithString( CookieInclusionStatus::WarningReason::WARN_DOMAIN_NON_ASCII); } - const std::string url_host(url.host()); + const std::string url_host(url.GetHost()); // Disallow invalid hostnames containing multiple `.` at the end. // Httpbis-rfc6265bis draft-11, §5.1.2 says to convert the request host "into @@ -456,7 +455,7 @@ std::optional GetCookieDomainWithString( } // Ensure |url| and |cookie_domain| have the same domain+registry. - const std::string url_scheme(url.scheme()); + const std::string url_scheme(url.GetScheme()); const std::string url_domain_and_registry( GetEffectiveDomain(url_scheme, url_host)); if (url_domain_and_registry.empty()) { @@ -634,7 +633,7 @@ std::string CanonPathWithString(const GURL& url, std::string_view path_string) { // Set-Cookie response, up to, but not including, the // right-most /.""" // How would this work for a cookie on /? We will include it then. - const std::string& url_path = url.path(); + const std::string& url_path = url.GetPath(); size_t idx = url_path.find_last_of('/'); @@ -647,9 +646,9 @@ std::string CanonPathWithString(const GURL& url, std::string_view path_string) { return url_path.substr(0, idx); } -GURL CookieDomainAndPathToURL(const std::string& domain, - const std::string& path, - const std::string& source_scheme) { +GURL CookieDomainAndPathToURL(std::string_view domain, + std::string_view path, + std::string_view source_scheme) { // Note: domain_no_dot could be empty for e.g. file cookies. std::string domain_no_dot = CookieDomainAsHost(domain); if (domain_no_dot.empty() || source_scheme.empty()) @@ -658,27 +657,27 @@ GURL CookieDomainAndPathToURL(const std::string& domain, {source_scheme, url::kStandardSchemeSeparator, domain_no_dot, path})); } -GURL CookieDomainAndPathToURL(const std::string& domain, - const std::string& path, +GURL CookieDomainAndPathToURL(std::string_view domain, + std::string_view path, bool is_https) { return CookieDomainAndPathToURL( domain, path, std::string(is_https ? url::kHttpsScheme : url::kHttpScheme)); } -GURL CookieDomainAndPathToURL(const std::string& domain, - const std::string& path, +GURL CookieDomainAndPathToURL(std::string_view domain, + std::string_view path, CookieSourceScheme source_scheme) { return CookieDomainAndPathToURL(domain, path, source_scheme == CookieSourceScheme::kSecure); } -GURL CookieOriginToURL(const std::string& domain, bool is_https) { +GURL CookieOriginToURL(std::string_view domain, bool is_https) { return CookieDomainAndPathToURL(domain, "/", is_https); } GURL SimulatedCookieSource(const CanonicalCookie& cookie, - const std::string& source_scheme) { + std::string_view source_scheme) { return CookieDomainAndPathToURL(cookie.Domain(), cookie.Path(), source_scheme); } @@ -690,7 +689,7 @@ CookieAccessScheme ProvisionalAccessScheme(const GURL& source_url) { : CookieAccessScheme::kNonCryptographic; } -bool IsDomainMatch(const std::string& domain, const std::string& host) { +bool IsDomainMatch(const std::string_view domain, const std::string_view host) { // Can domain match in two ways; as a domain cookie (where the cookie // domain begins with ".") or as a host cookie (where it doesn't). @@ -723,7 +722,7 @@ bool IsDomainMatch(const std::string& domain, const std::string& host) { domain) == 0); } -bool IsOnPath(const std::string& cookie_path, const std::string& url_path) { +bool IsOnPath(const std::string_view cookie_path, const std::string_view url_path) { // A zero length would be unsafe for our trailing '/' checks, and // would also make no sense for our prefix match. The code that // creates a CanonicalCookie should make sure the path is never zero length, @@ -759,7 +758,7 @@ bool IsOnPath(const std::string& cookie_path, const std::string& url_path) { return true; } -CookiePrefix GetCookiePrefix(const std::string& name) { +CookiePrefix GetCookiePrefix(std::string_view name) { constexpr std::string_view kSecurePrefix("__Secure-"); constexpr std::string_view kHostPrefix("__Host-"); constexpr std::string_view kHttpPrefix("__Http-"); @@ -840,7 +839,7 @@ bool IsCookiePartitionedValid(const GURL& url, return result; } -void ParseRequestCookieLine(const std::string& header_value, +void ParseRequestCookieLine(std::string_view header_value, ParsedRequestCookies* parsed_cookies) { std::string::const_iterator i = header_value.begin(); while (i != header_value.end()) { @@ -895,7 +894,7 @@ std::string SerializeRequestCookieLine( } CookieOptions::SameSiteCookieContext ComputeSameSiteContextForRequest( - const std::string& http_method, + std::string_view http_method, const std::vector& url_chain, const SiteForCookies& site_for_cookies, const std::optional& initiator, @@ -1104,7 +1103,7 @@ ComputeFirstPartySetMetadataMaybeAsync( } CookieOptions::SameSiteCookieContext::ContextMetadata::HttpMethod -HttpMethodStringToEnum(const std::string& in) { +HttpMethodStringToEnum(std::string_view in) { using HttpMethod = CookieOptions::SameSiteCookieContext::ContextMetadata::HttpMethod; if (in == "GET") diff --git a/naiveproxy/src/net/cookies/cookie_util.h b/naiveproxy/src/net/cookies/cookie_util.h index cbb7365fb8..011e26e083 100644 --- a/naiveproxy/src/net/cookies/cookie_util.h +++ b/naiveproxy/src/net/cookies/cookie_util.h @@ -173,8 +173,8 @@ NET_EXPORT void FireStorageAccessHistogram(StorageAccessResult result); // Returns the effective TLD+1 for a given host. This only makes sense for http // and https schemes. For other schemes, the host will be returned unchanged // (minus any leading period). -NET_EXPORT std::string GetEffectiveDomain(const std::string& scheme, - const std::string& host); +NET_EXPORT std::string GetEffectiveDomain(std::string_view scheme, + std::string_view host); // Determine the actual cookie domain based on the domain string passed // (if any) and the URL from which the cookie came. @@ -190,14 +190,14 @@ NET_EXPORT std::optional GetCookieDomainWithString( // Returns true if a domain string represents a host-only cookie, // i.e. it doesn't begin with a leading '.' character. -NET_EXPORT bool DomainIsHostOnly(const std::string& domain_string); +NET_EXPORT bool DomainIsHostOnly(std::string_view domain_string); // If |cookie_domain| is nonempty and starts with a "." character, this returns // the substring of |cookie_domain| without the leading dot. (Note only one // leading dot is stripped, if there are multiple.) Otherwise it returns // |cookie_domain|. This is useful for converting from CanonicalCookie's // representation of a cookie domain to the RFC's notion of a cookie's domain. -NET_EXPORT std::string CookieDomainAsHost(const std::string& cookie_domain); +NET_EXPORT std::string CookieDomainAsHost(std::string_view cookie_domain); // Parses the string with the cookie expiration time (very forgivingly). // Returns the "null" time on failure. @@ -219,25 +219,25 @@ NET_EXPORT std::string CanonPathWithString(const GURL& url, // attribute per RFC6265bis. The GURL is constructed after stripping off any // leading dot. // Note: the GURL returned by this method is not guaranteed to be valid. -NET_EXPORT GURL CookieDomainAndPathToURL(const std::string& domain, - const std::string& path, - const std::string& source_scheme); -NET_EXPORT GURL CookieDomainAndPathToURL(const std::string& domain, - const std::string& path, +NET_EXPORT GURL CookieDomainAndPathToURL(std::string_view domain, + std::string_view path, + std::string_view source_scheme); +NET_EXPORT GURL CookieDomainAndPathToURL(std::string_view domain, + std::string_view path, bool is_https); -NET_EXPORT GURL CookieDomainAndPathToURL(const std::string& domain, - const std::string& path, +NET_EXPORT GURL CookieDomainAndPathToURL(std::string_view domain, + std::string_view path, CookieSourceScheme source_scheme); // Convenience for converting a cookie origin (domain and https pair) to a URL. -NET_EXPORT GURL CookieOriginToURL(const std::string& domain, bool is_https); +NET_EXPORT GURL CookieOriginToURL(std::string_view domain, bool is_https); // Returns a URL that could have been the cookie's source. // Not guaranteed to actually be the URL that set the cookie. Not guaranteed to // be a valid GURL. Intended as a shim for SetCanonicalCookieAsync calls, where // a source URL is required but only a source scheme may be available. NET_EXPORT GURL SimulatedCookieSource(const CanonicalCookie& cookie, - const std::string& source_scheme); + std::string_view source_scheme); // Provisional evaluation of acceptability of setting secure cookies on // `source_url` based only on the `source_url`'s scheme and whether it @@ -250,19 +250,19 @@ NET_EXPORT CookieAccessScheme ProvisionalAccessScheme(const GURL& source_url); // |domain| is the output of cookie.Domain() for some cookie. This returns true // if a |domain| indicates that the cookie can be accessed by |host|. // See comment on CanonicalCookie::IsDomainMatch(). -NET_EXPORT bool IsDomainMatch(const std::string& domain, - const std::string& host); +NET_EXPORT bool IsDomainMatch(const std::string_view domain, + const std::string_view host); // Returns true if the given |url_path| path-matches |cookie_path| // as described in section 5.1.4 in RFC 6265. This returns true if |cookie_path| // and |url_path| are identical, or if |url_path| is a subdirectory of // |cookie_path|. -NET_EXPORT bool IsOnPath(const std::string& cookie_path, - const std::string& url_path); +NET_EXPORT bool IsOnPath(const std::string_view cookie_path, + const std::string_view url_path); // Returns the CookiePrefix (or COOKIE_PREFIX_NONE if none) that // applies to the given cookie |name|. -CookiePrefix GetCookiePrefix(const std::string& name); +CookiePrefix GetCookiePrefix(std::string_view name); // Returns true if the cookie does not violate any constraints imposed // by the cookie name's prefix, as described in @@ -301,7 +301,7 @@ using ParsedRequestCookies = std::vector; // these will appear in |parsed_cookies| as well. The cookie header can be // written by non-Chromium consumers (such as extensions), so the header may not // be well-formed. -NET_EXPORT void ParseRequestCookieLine(const std::string& header_value, +NET_EXPORT void ParseRequestCookieLine(std::string_view header_value, ParsedRequestCookies* parsed_cookies); // Writes all cookies of |parsed_cookies| into a HTTP Request header value @@ -350,7 +350,7 @@ NET_EXPORT std::string SerializeRequestCookieLine( // lax same-site but not strict same-site, SameSite=lax cookies be only sent // when the method is "safe" in the RFC7231 section 4.2.1 sense. NET_EXPORT CookieOptions::SameSiteCookieContext -ComputeSameSiteContextForRequest(const std::string& http_method, +ComputeSameSiteContextForRequest(std::string_view http_method, const std::vector& url_chain, const SiteForCookies& site_for_cookies, const std::optional& initiator, @@ -432,7 +432,7 @@ ComputeFirstPartySetMetadataMaybeAsync( // Converts a string representing the http request method to its enum // representation. NET_EXPORT CookieOptions::SameSiteCookieContext::ContextMetadata::HttpMethod -HttpMethodStringToEnum(const std::string& in); +HttpMethodStringToEnum(std::string_view in); // Takes a CookieAccessResult and returns a bool, returning true if the // CookieInclusionStatus in CookieAccessResult was set to "include", else diff --git a/naiveproxy/src/net/cookies/parsed_cookie.cc b/naiveproxy/src/net/cookies/parsed_cookie.cc index 498b383cf2..a51750410c 100644 --- a/naiveproxy/src/net/cookies/parsed_cookie.cc +++ b/naiveproxy/src/net/cookies/parsed_cookie.cc @@ -44,6 +44,8 @@ #include "net/cookies/parsed_cookie.h" +#include +#include #include #include "base/metrics/histogram_macros.h" @@ -56,15 +58,15 @@ namespace { -const char kPathTokenName[] = "path"; -const char kDomainTokenName[] = "domain"; -const char kExpiresTokenName[] = "expires"; -const char kMaxAgeTokenName[] = "max-age"; -const char kSecureTokenName[] = "secure"; -const char kHttpOnlyTokenName[] = "httponly"; -const char kSameSiteTokenName[] = "samesite"; -const char kPriorityTokenName[] = "priority"; -const char kPartitionedTokenName[] = "partitioned"; +constexpr std::string_view kPathTokenName = "path"; +constexpr std::string_view kDomainTokenName = "domain"; +constexpr std::string_view kExpiresTokenName = "expires"; +constexpr std::string_view kMaxAgeTokenName = "max-age"; +constexpr std::string_view kSecureTokenName = "secure"; +constexpr std::string_view kHttpOnlyTokenName = "httponly"; +constexpr std::string_view kSameSiteTokenName = "samesite"; +constexpr std::string_view kPriorityTokenName = "priority"; +constexpr std::string_view kPartitionedTokenName = "partitioned"; constexpr char kTerminatorRawString[] = "\n\r\0"; constexpr std::string_view kTerminator(kTerminatorRawString, @@ -171,8 +173,9 @@ CookiePriority ParsedCookie::Priority() const { : StringToCookiePriority(pairs_[priority_index_].second); } -bool ParsedCookie::SetName(const std::string& name) { - const std::string& value = pairs_.empty() ? "" : pairs_[0].second; +bool ParsedCookie::SetName(std::string_view name) { + const std::string_view value = + pairs_.empty() ? std::string_view() : pairs_[0].second; // Ensure there are no invalid characters in `name`. This should be done // before calling ParseTokenString because we want terminating characters @@ -190,7 +193,7 @@ bool ParsedCookie::SetName(const std::string& name) { } // Use the same whitespace trimming code as the constructor. - const std::string& parsed_name = ParseTokenString(name); + const std::string_view parsed_name = ParseTokenString(name); if (!IsValidCookieNameValuePair(parsed_name, value)) { return false; @@ -203,8 +206,9 @@ bool ParsedCookie::SetName(const std::string& name) { return true; } -bool ParsedCookie::SetValue(const std::string& value) { - const std::string& name = pairs_.empty() ? "" : pairs_[0].first; +bool ParsedCookie::SetValue(std::string_view value) { + const std::string_view name = + pairs_.empty() ? std::string_view() : pairs_[0].first; // Ensure there are no invalid characters in `value`. This should be done // before calling ParseValueString because we want terminating characters @@ -222,7 +226,7 @@ bool ParsedCookie::SetValue(const std::string& value) { } // Use the same whitespace trimming code as the constructor. - const std::string& parsed_value = ParseValueString(value); + std::string_view parsed_value = ParseValueString(value); if (!IsValidCookieNameValuePair(name, parsed_value)) { return false; @@ -234,19 +238,19 @@ bool ParsedCookie::SetValue(const std::string& value) { return true; } -bool ParsedCookie::SetPath(const std::string& path) { +bool ParsedCookie::SetPath(std::string_view path) { return SetString(&path_index_, kPathTokenName, path); } -bool ParsedCookie::SetDomain(const std::string& domain) { +bool ParsedCookie::SetDomain(std::string_view domain) { return SetString(&domain_index_, kDomainTokenName, domain); } -bool ParsedCookie::SetExpires(const std::string& expires) { +bool ParsedCookie::SetExpires(std::string_view expires) { return SetString(&expires_index_, kExpiresTokenName, expires); } -bool ParsedCookie::SetMaxAge(const std::string& maxage) { +bool ParsedCookie::SetMaxAge(std::string_view maxage) { return SetString(&maxage_index_, kMaxAgeTokenName, maxage); } @@ -258,11 +262,11 @@ bool ParsedCookie::SetIsHttpOnly(bool is_http_only) { return SetBool(&httponly_index_, kHttpOnlyTokenName, is_http_only); } -bool ParsedCookie::SetSameSite(const std::string& same_site) { +bool ParsedCookie::SetSameSite(std::string_view same_site) { return SetString(&same_site_index_, kSameSiteTokenName, same_site); } -bool ParsedCookie::SetPriority(const std::string& priority) { +bool ParsedCookie::SetPriority(std::string_view priority) { return SetString(&priority_index_, kPriorityTokenName, priority); } @@ -368,23 +372,23 @@ void ParsedCookie::ParseValue(std::string_view::iterator* it, } // static -std::string ParsedCookie::ParseTokenString(std::string_view token) { +std::string_view ParsedCookie::ParseTokenString(std::string_view token) { std::string_view::iterator it = token.begin(); std::string_view::iterator end = FindFirstTerminator(token); std::string_view::iterator token_start, token_end; if (ParseToken(&it, end, &token_start, &token_end)) - return std::string(token_start, token_end); - return std::string(); + return std::string_view(token_start, token_end); + return std::string_view(); } // static -std::string ParsedCookie::ParseValueString(std::string_view value) { - return std::string(ValidStringPieceForValue(value)); +std::string_view ParsedCookie::ParseValueString(std::string_view value) { + return ValidStringPieceForValue(value); } // static -bool ParsedCookie::ValueMatchesParsedValue(const std::string& value) { +bool ParsedCookie::ValueMatchesParsedValue(std::string_view value) { // ValidStringPieceForValue() returns a valid substring of |value|. // If |value| can be fully parsed the result will have the same length // as |value|. @@ -392,7 +396,7 @@ bool ParsedCookie::ValueMatchesParsedValue(const std::string& value) { } // static -bool ParsedCookie::IsValidCookieName(const std::string& name) { +bool ParsedCookie::IsValidCookieName(std::string_view name) { // IsValidCookieName() returns whether a string matches the following // grammar: // @@ -418,7 +422,7 @@ bool ParsedCookie::IsValidCookieName(const std::string& name) { } // static -bool ParsedCookie::IsValidCookieValue(const std::string& value) { +bool ParsedCookie::IsValidCookieValue(std::string_view value) { // IsValidCookieValue() returns whether a string matches the following // grammar: // @@ -444,8 +448,7 @@ bool ParsedCookie::IsValidCookieValue(const std::string& value) { } // static -bool ParsedCookie::CookieAttributeValueHasValidCharSet( - const std::string& value) { +bool ParsedCookie::CookieAttributeValueHasValidCharSet(std::string_view value) { // A cookie attribute value has the same character set restrictions as cookie // values, so re-use the validation function for that. return IsValidCookieValue(value); @@ -458,8 +461,8 @@ bool ParsedCookie::CookieAttributeValueHasValidSize(std::string_view value) { // static bool ParsedCookie::IsValidCookieNameValuePair( - const std::string& name, - const std::string& value, + std::string_view name, + std::string_view value, CookieInclusionStatus* status_out) { // Ignore cookies with neither name nor value. if (name.empty() && value.empty()) { @@ -666,8 +669,8 @@ void ParsedCookie::SetupAttributes() { } bool ParsedCookie::SetString(size_t* index, - const std::string& key, - const std::string& untrusted_value) { + std::string_view key, + std::string_view untrusted_value) { // This function should do equivalent input validation to the // constructor. Otherwise, the Set* functions can put this ParsedCookie in a // state where parsing the output of ToCookieLine() produces a different @@ -685,7 +688,7 @@ bool ParsedCookie::SetString(size_t* index, return false; // Use the same whitespace trimming code as the constructor. - const std::string parsed_value = ParseValueString(untrusted_value); + std::string_view parsed_value = ParseValueString(untrusted_value); if (!CookieAttributeValueHasValidSize(parsed_value)) return false; @@ -698,7 +701,7 @@ bool ParsedCookie::SetString(size_t* index, } } -bool ParsedCookie::SetBool(size_t* index, const std::string& key, bool value) { +bool ParsedCookie::SetBool(size_t* index, std::string_view key, bool value) { if (!value) { ClearAttributePair(*index); return true; @@ -708,8 +711,8 @@ bool ParsedCookie::SetBool(size_t* index, const std::string& key, bool value) { } bool ParsedCookie::SetAttributePair(size_t* index, - const std::string& key, - const std::string& value) { + std::string_view key, + std::string_view value) { if (!HttpUtil::IsToken(key)) return false; if (!IsValid()) diff --git a/naiveproxy/src/net/cookies/parsed_cookie.h b/naiveproxy/src/net/cookies/parsed_cookie.h index d2e88d8c6d..71adc3ffd7 100644 --- a/naiveproxy/src/net/cookies/parsed_cookie.h +++ b/naiveproxy/src/net/cookies/parsed_cookie.h @@ -12,6 +12,7 @@ #include #include +#include "base/compiler_specific.h" #include "base/functional/function_ref.h" #include "net/base/net_export.h" #include "net/cookies/cookie_constants.h" @@ -47,11 +48,11 @@ class NET_EXPORT ParsedCookie { // class if !IsValid. bool IsValid() const; - const std::string& Name() const { return pairs_[0].first; } - const std::string& Token() const { return Name(); } - const std::string& Value() const { return pairs_[0].second; } + const std::string& Name() const LIFETIME_BOUND { return pairs_[0].first; } + const std::string& Token() const LIFETIME_BOUND { return Name(); } + const std::string& Value() const LIFETIME_BOUND { return pairs_[0].second; } - std::optional Path() const { + std::optional Path() const LIFETIME_BOUND { if (path_index_ == 0) { return std::nullopt; } @@ -60,19 +61,19 @@ class NET_EXPORT ParsedCookie { // Note that Domain() may return the empty string; in the case of cookie_line // "domain=", Domain().has_value() will return true (as the empty string is an // acceptable domain value), and Domain().value() will be an empty string. - std::optional Domain() const { + std::optional Domain() const LIFETIME_BOUND { if (domain_index_ == 0) { return std::nullopt; } return pairs_[domain_index_].second; } - std::optional Expires() const { + std::optional Expires() const LIFETIME_BOUND { if (expires_index_ == 0) { return std::nullopt; } return pairs_[expires_index_].second; } - std::optional MaxAge() const { + std::optional MaxAge() const LIFETIME_BOUND { if (maxage_index_ == 0) { return std::nullopt; } @@ -100,16 +101,16 @@ class NET_EXPORT ParsedCookie { // Set-Cookie string. The resulting ParsedCookie and its Set-Cookie string // should still go through the regular cookie parsing process before entering // the cookie jar. - bool SetName(const std::string& name); - bool SetValue(const std::string& value); - bool SetPath(const std::string& path); - bool SetDomain(const std::string& domain); - bool SetExpires(const std::string& expires); - bool SetMaxAge(const std::string& maxage); + bool SetName(std::string_view name); + bool SetValue(std::string_view value); + bool SetPath(std::string_view path); + bool SetDomain(std::string_view domain); + bool SetExpires(std::string_view expires); + bool SetMaxAge(std::string_view maxage); bool SetIsSecure(bool is_secure); bool SetIsHttpOnly(bool is_http_only); - bool SetSameSite(const std::string& same_site); - bool SetPriority(const std::string& priority); + bool SetSameSite(std::string_view same_site); + bool SetPriority(std::string_view priority); bool SetIsPartitioned(bool is_partitioned); // Returns the cookie description as it appears in a HTML response header. @@ -141,20 +142,20 @@ class NET_EXPORT ParsedCookie { // Same as the above functions, except the input is assumed to contain the // desired token/value and nothing else. - static std::string ParseTokenString(std::string_view token); - static std::string ParseValueString(std::string_view value); + static std::string_view ParseTokenString(std::string_view token); + static std::string_view ParseValueString(std::string_view value); // Returns |true| if the parsed version of |value| matches |value|. - static bool ValueMatchesParsedValue(const std::string& value); + static bool ValueMatchesParsedValue(std::string_view value); // Is the string valid as the name of the cookie or as an attribute name? - static bool IsValidCookieName(const std::string& name); + static bool IsValidCookieName(std::string_view name); // Is the string valid as the value of the cookie? - static bool IsValidCookieValue(const std::string& value); + static bool IsValidCookieValue(std::string_view value); // Is the string free of any characters not allowed in attribute values? - static bool CookieAttributeValueHasValidCharSet(const std::string& value); + static bool CookieAttributeValueHasValidCharSet(std::string_view value); // Is the string less than the size limits set for attribute values? static bool CookieAttributeValueHasValidSize(std::string_view value); @@ -164,8 +165,8 @@ class NET_EXPORT ParsedCookie { // respectively, in addition to checking that the sum of the two doesn't // exceed size limits specified in RFC6265bis. static bool IsValidCookieNameValuePair( - const std::string& name, - const std::string& value, + std::string_view name, + std::string_view value, CookieInclusionStatus* status_out = nullptr); // Synchronously calls `functor` with each attribute and value in the @@ -187,16 +188,14 @@ class NET_EXPORT ParsedCookie { // to the token matching |index|. If |value| contains invalid characters, the // cookie parameter is not changed and the function returns false. // If |value| is empty/false the key/value pair is removed. - bool SetString(size_t* index, - const std::string& key, - const std::string& value); - bool SetBool(size_t* index, const std::string& key, bool value); + bool SetString(size_t* index, std::string_view key, std::string_view value); + bool SetBool(size_t* index, std::string_view key, bool value); // Helper function for SetString and SetBool handling the case that the // key/value pair shall not be removed. bool SetAttributePair(size_t* index, - const std::string& key, - const std::string& value); + std::string_view key, + std::string_view value); // Removes the key/value pair from a cookie that is identified by |index|. // |index| refers to a position in |pairs_|. diff --git a/naiveproxy/src/net/cookies/site_for_cookies.cc b/naiveproxy/src/net/cookies/site_for_cookies.cc index 53a6cc20c1..dfd77262d4 100644 --- a/naiveproxy/src/net/cookies/site_for_cookies.cc +++ b/naiveproxy/src/net/cookies/site_for_cookies.cc @@ -10,6 +10,7 @@ #include "base/strings/string_util.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "net/cookies/cookie_util.h" +#include "url/gurl.h" namespace net { diff --git a/naiveproxy/src/net/data/ssl/chrome_root_store/OWNERS b/naiveproxy/src/net/data/ssl/chrome_root_store/OWNERS index 3b1c4b612c..64b5c80a7f 100644 --- a/naiveproxy/src/net/data/ssl/chrome_root_store/OWNERS +++ b/naiveproxy/src/net/data/ssl/chrome_root_store/OWNERS @@ -1,9 +1,5 @@ # For bot updates to Chrome Root Store -# TODO(crbug.com/40852071): Remove mdb.chrome-pki-metadata@google.com once the -# pod batch migration is complete. -per-file root_store.certs=mdb.chrome-pki-metadata@google.com -per-file root_store.textproto=mdb.chrome-pki-metadata@google.com - +per-file additional.certs=mdb.chrome-pki-metadata-release-jobs@google.com per-file root_store.certs=mdb.chrome-pki-metadata-release-jobs@google.com per-file root_store.textproto=mdb.chrome-pki-metadata-release-jobs@google.com per-file root_store.md=mdb.chrome-pki-metadata-release-jobs@google.com diff --git a/naiveproxy/src/net/data/ssl/chrome_root_store/additional.certs b/naiveproxy/src/net/data/ssl/chrome_root_store/additional.certs index 5008efb928..441ffcf642 100644 --- a/naiveproxy/src/net/data/ssl/chrome_root_store/additional.certs +++ b/naiveproxy/src/net/data/ssl/chrome_root_store/additional.certs @@ -4621,3 +4621,1040 @@ FefWrrnyAh2qVqkAd/lJ7oUjFuBEY/+eg7Bq8fuJa3coWa4kgPgp/7xfVOVnPt3P zJfmxHioB7EtWB8BOTY9ZFJZXGDNZqqM0IrIHDsbUJLwPeFJOrFCUVwVcscwh5FI c2IYWCY6wNpb4E8FkrY= -----END CERTIFICATE----- + +SHA-256 hash: b10b6f00e609509e8700f6d34687a2bfce38ea05a8fdf1cdc40c3a2a0d0d0e45 +Subject: "CN=WR1, O=Google Trust Services, C=US" +Issuer: "CN=GTS Root R1, O=Google Trust Services LLC, C=US" +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 7f:d9:e2:c2:d2:04:8a:04:74:b6:27:a2:6d:08:68:a7 + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R1 + Validity + Not Before: Dec 13 09:00:00 2023 GMT + Not After : Feb 20 14:00:00 2029 GMT + Subject: C=US, O=Google Trust Services, CN=WR1 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:cf:6e:36:16:8a:b7:2b:ee:46:98:03:1d:53:70: + 0f:77:ee:a3:4b:a0:72:be:8f:23:2d:c2:47:c6:8f: + 5c:8d:f9:3d:e6:1a:8e:ee:33:22:0d:c9:11:48:b8: + b0:62:ce:f4:69:0d:72:02:7d:de:d5:26:0f:c3:6e: + 9b:cf:7e:0e:d7:20:cf:c6:90:3b:a3:82:06:da:3a: + 9d:ff:6c:56:bf:dc:e9:61:94:45:e4:69:bc:4f:0f: + c9:13:c0:ad:61:44:72:20:81:d0:0f:2b:9e:68:6a: + 62:6a:8f:8a:22:57:79:69:2b:e2:24:33:7e:76:63: + 2c:5d:bc:51:69:7e:23:07:b1:ff:76:81:f1:ee:b8: + 58:b5:6b:35:15:ef:a1:e6:48:28:39:97:31:d9:07: + 1f:95:a7:9e:ae:cf:98:bc:9e:8d:8a:03:e1:b0:97: + 4d:50:6f:93:4c:4a:1f:f8:db:7d:f1:90:99:15:7f: + e3:96:ed:ee:31:81:ea:72:3d:52:1d:df:25:64:a5: + 0b:70:aa:9e:e8:a8:b9:47:c8:a7:5a:10:25:60:6f: + 42:e1:d7:3f:e7:8f:0c:f0:c2:83:46:33:20:e6:4b: + 77:04:76:a1:68:a7:5d:15:18:ef:d8:28:77:35:ad: + 0e:ad:46:e4:62:6e:e2:aa:f8:cc:ef:37:7e:0f:26: + b3:07 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + 66:69:49:D4:DE:2A:9C:91:03:CF:89:0E:24:B8:0E:30:03:6E:88:2E + X509v3 Authority Key Identifier: + keyid:E4:AF:2B:26:71:1A:2B:48:27:85:2F:52:66:2C:EF:F0:89:13:71:3E + + Authority Information Access: + CA Issuers - URI:http://i.pki.goog/r1.crt + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://c.pki.goog/r/r1.crl + + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + + Signature Algorithm: sha256WithRSAEncryption + 4e:e6:b3:08:11:20:91:60:27:f9:51:90:4d:02:18:ee:b8:c1: + 89:d5:22:84:97:e6:d6:df:e6:4e:3a:3b:29:04:7e:de:20:f1: + e2:8d:8b:d3:aa:1e:17:44:37:c2:92:98:a5:08:08:fd:37:8c: + a9:49:58:31:64:26:65:b5:8f:13:43:d7:f2:97:ec:54:01:39: + 13:9b:55:3a:38:77:e1:b3:40:27:00:cf:56:7b:19:54:9c:33: + 37:79:f0:e4:11:90:ee:cc:51:b2:91:73:21:c3:3f:a9:b6:d3: + a4:d7:97:7f:d2:08:e1:6b:24:db:e4:ef:e8:54:95:15:95:0b: + df:fd:2e:1e:b6:9d:6e:bb:83:5a:34:50:e0:86:7b:99:8a:8a: + 88:4a:a4:d3:c7:69:39:9f:93:98:1c:f0:ca:41:06:cb:5f:c8: + 5d:b7:ab:6f:a0:29:d5:24:a7:9f:6f:91:23:bb:7a:37:f7:ea: + 3c:2a:f0:c0:58:e9:f2:48:35:1b:a7:ad:44:04:c6:05:a3:d8: + 0b:1f:86:8c:93:05:3d:7f:a4:f7:b0:25:be:88:f7:ff:df:12: + be:a7:5e:80:b3:d8:10:f8:ef:c5:47:25:1e:98:8a:2c:3e:b7: + 34:c9:95:6a:b5:50:75:d2:0b:ea:43:af:4d:ee:64:d2:99:f1: + 46:74:7e:9a:77:46:1c:84:1c:ef:b4:cb:6d:c6:45:7a:36:b9: + e8:fc:a7:95:2a:a6:7a:be:7b:f1:ce:c2:06:b3:ea:a3:50:55: + 98:fc:96:50:af:af:ea:c1:ae:ce:ce:cc:ab:b4:10:6b:15:6c: + e3:bd:74:70:8f:cc:a4:fa:75:a2:fc:4c:56:dd:7b:10:d2:b1: + 2e:4d:f8:2e:91:0a:00:a5:66:ab:09:f3:6c:71:d1:8e:15:cd: + 78:20:bd:f3:85:c3:3b:02:c4:a7:42:b8:33:31:e5:f1:93:96: + 25:00:1a:90:27:55:94:50:be:3f:20:37:18:fd:89:5f:f4:0b: + a2:a5:8d:1c:6b:8d:f5:cf:6f:2c:e6:c3:84:75:6c:fc:bf:ba: + e4:37:be:39:d9:e7:8e:91:46:23:dc:71:b6:c3:72:46:cc:9a: + 1d:d1:40:7f:9c:fb:ba:53:a8:5c:35:e4:1c:20:9e:8f:f1:21: + b3:97:68:71:17:8d:b7:5e:96:db:16:c7:fc:40:6e:8a:b2:6b: + 3b:31:44:da:bb:40:2f:19:2c:97:54:dd:12:33:9f:20:a5:ce: + 25:f5:2a:41:e5:48:e7:e8:40:ed:5f:a7:d7:e0:3f:9f:b3:69: + 83:44:be:e4:e0:f2:b5:68:79:5d:6e:78:71:c3:75:76:b2:67: + 30:ae:78:b6:da:33:87:47 +-----BEGIN CERTIFICATE----- +MIIFCzCCAvOgAwIBAgIQf9niwtIEigR0tieibQhopzANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjMxMjEzMDkwMDAwWhcNMjkwMjIw +MTQwMDAwWjA7MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNl +cnZpY2VzMQwwCgYDVQQDEwNXUjEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDPbjYWircr7kaYAx1TcA937qNLoHK+jyMtwkfGj1yN+T3mGo7uMyINyRFI +uLBizvRpDXICfd7VJg/DbpvPfg7XIM/GkDujggbaOp3/bFa/3OlhlEXkabxPD8kT +wK1hRHIggdAPK55oamJqj4oiV3lpK+IkM352YyxdvFFpfiMHsf92gfHuuFi1azUV +76HmSCg5lzHZBx+Vp56uz5i8no2KA+Gwl01Qb5NMSh/4233xkJkVf+OW7e4xgepy +PVId3yVkpQtwqp7oqLlHyKdaECVgb0Lh1z/njwzwwoNGMyDmS3cEdqFop10VGO/Y +KHc1rQ6tRuRibuKq+MzvN34PJrMHAgMBAAGjgf4wgfswDgYDVR0PAQH/BAQDAgGG +MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/ +AgEAMB0GA1UdDgQWBBRmaUnU3iqckQPPiQ4kuA4wA26ILjAfBgNVHSMEGDAWgBTk +rysmcRorSCeFL1JmLO/wiRNxPjA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAKG +GGh0dHA6Ly9pLnBraS5nb29nL3IxLmNydDArBgNVHR8EJDAiMCCgHqAchhpodHRw +Oi8vYy5wa2kuZ29vZy9yL3IxLmNybDATBgNVHSAEDDAKMAgGBmeBDAECATANBgkq +hkiG9w0BAQsFAAOCAgEATuazCBEgkWAn+VGQTQIY7rjBidUihJfm1t/mTjo7KQR+ +3iDx4o2L06oeF0Q3wpKYpQgI/TeMqUlYMWQmZbWPE0PX8pfsVAE5E5tVOjh34bNA +JwDPVnsZVJwzN3nw5BGQ7sxRspFzIcM/qbbTpNeXf9II4Wsk2+Tv6FSVFZUL3/0u +HradbruDWjRQ4IZ7mYqKiEqk08dpOZ+TmBzwykEGy1/IXberb6Ap1SSnn2+RI7t6 +N/fqPCrwwFjp8kg1G6etRATGBaPYCx+GjJMFPX+k97Alvoj3/98SvqdegLPYEPjv +xUclHpiKLD63NMmVarVQddIL6kOvTe5k0pnxRnR+mndGHIQc77TLbcZFeja56Pyn +lSqmer578c7CBrPqo1BVmPyWUK+v6sGuzs7Mq7QQaxVs4710cI/MpPp1ovxMVt17 +ENKxLk34LpEKAKVmqwnzbHHRjhXNeCC984XDOwLEp0K4MzHl8ZOWJQAakCdVlFC+ +PyA3GP2JX/QLoqWNHGuN9c9vLObDhHVs/L+65De+OdnnjpFGI9xxtsNyRsyaHdFA +f5z7ulOoXDXkHCCej/Ehs5docReNt16W2xbH/EBuirJrOzFE2rtALxksl1TdEjOf +IKXOJfUqQeVI5+hA7V+n1+A/n7Npg0S+5ODytWh5XW54ccN1drJnMK54ttozh0c= +-----END CERTIFICATE----- + +SHA-256 hash: e6fe22bf45e4f0d3b85c59e02c0f495418e1eb8d3210f788d48cd5e1cb547cd4 +Subject: "CN=WR2, O=Google Trust Services, C=US" +Issuer: "CN=GTS Root R1, O=Google Trust Services LLC, C=US" +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 7f:f0:05:a0:7c:4c:de:d1:00:ad:9d:66:a5:10:7b:98 + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R1 + Validity + Not Before: Dec 13 09:00:00 2023 GMT + Not After : Feb 20 14:00:00 2029 GMT + Subject: C=US, O=Google Trust Services, CN=WR2 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:a9:ff:9c:7f:45:1e:70:a8:53:9f:ca:d9:e5:0d: + de:46:57:57:7d:bc:8f:9a:5a:ac:46:f1:84:9a:bb: + 91:db:c9:fb:2f:01:fb:92:09:00:16:5e:a0:1c:f8: + c1:ab:f9:78:2f:4a:cc:d8:85:a2:d8:59:3c:0e:d3: + 18:fb:b1:f5:24:0d:26:ee:b6:5b:64:76:7c:14:c7: + 2f:7a:ce:a8:4c:b7:f4:d9:08:fc:df:87:23:35:20: + a8:e2:69:e2:8c:4e:3f:b1:59:fa:60:a2:1e:b3:c9: + 20:53:19:82:ca:36:53:6d:60:4d:e9:00:91:fc:76: + 8d:5c:08:0f:0a:c2:dc:f1:73:6b:c5:13:6e:0a:4f: + 7a:c2:f2:02:1c:2e:b4:63:83:da:31:f6:2d:75:30: + b2:fb:ab:c2:6e:db:a9:c0:0e:b9:f9:67:d4:c3:25: + 57:74:eb:05:b4:e9:8e:b5:de:28:cd:cc:7a:14:e4: + 71:03:cb:4d:61:2e:61:57:c5:19:a9:0b:98:84:1a: + e8:79:29:d9:b2:8d:2f:ff:57:6a:66:e0:ce:ab:95: + a8:29:96:63:70:12:67:1e:3a:e1:db:b0:21:71:d7: + 7c:9e:fd:aa:17:6e:fe:2b:fb:38:17:14:d1:66:a7: + af:9a:b5:70:cc:c8:63:81:3a:8c:c0:2a:a9:76:37: + ce:e3 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + DE:1B:1E:ED:79:15:D4:3E:37:24:C3:21:BB:EC:34:39:6D:42:B2:30 + X509v3 Authority Key Identifier: + keyid:E4:AF:2B:26:71:1A:2B:48:27:85:2F:52:66:2C:EF:F0:89:13:71:3E + + Authority Information Access: + CA Issuers - URI:http://i.pki.goog/r1.crt + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://c.pki.goog/r/r1.crl + + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + + Signature Algorithm: sha256WithRSAEncryption + 45:75:8b:e5:1f:3b:44:13:96:1a:ab:58:f1:35:c9:6f:3d:d2: + d0:33:4a:86:33:ba:57:51:4f:ee:c4:34:da:16:12:4c:bf:13: + 9f:0d:d4:54:e9:48:79:c0:30:3c:94:25:f2:1a:f4:ba:32:94: + b6:33:72:0b:85:ee:09:11:25:34:94:e1:6f:42:db:82:9b:7b: + 7f:2a:9a:a9:ff:7f:a9:d2:de:4a:20:cb:b3:fb:03:03:b8:f8: + 07:05:da:59:92:2f:18:46:98:ce:af:72:be:24:26:b1:1e:00: + 4d:bd:08:ad:93:41:44:0a:bb:c7:d5:01:85:bf:93:57:e3:df: + 74:12:53:0e:11:25:d3:9b:dc:de:cb:27:6e:b3:c2:b9:33:62: + 39:c2:e0:35:e1:5b:a7:09:2e:19:cb:91:2a:76:5c:f1:df:ca: + 23:84:40:a5:6f:ff:9a:41:e0:b5:ef:32:d1:85:ae:af:25:09: + f0:62:c5:6e:c2:c8:6e:32:fd:b8:da:e2:ce:4a:91:4a:f3:85: + 55:4e:b1:75:d6:48:33:2f:6f:84:d9:12:5c:9f:d4:71:98:63: + 25:8d:69:5c:0a:6b:7d:f2:41:bd:e8:bb:8f:e4:22:d7:9d:65: + 45:e8:4c:0a:87:da:e9:60:66:88:0e:1f:c7:e1:4e:56:c5:76: + ff:b4:7a:57:69:f2:02:22:09:26:41:1d:da:74:a2:e5:29:f3: + c4:9a:e5:5d:d6:aa:7a:fd:e1:b7:2b:66:38:fb:e8:29:66:ba: + ef:a0:13:2f:f8:73:7e:f0:da:40:11:1c:5d:dd:8f:a6:fc:be: + db:be:56:f8:32:9c:1f:41:41:6d:7e:b6:c5:eb:c6:8b:36:b7: + 17:8c:9d:cf:19:7a:34:9f:21:93:c4:7e:74:35:d2:aa:fd:4c: + 6d:14:f5:c9:b0:79:5b:49:3c:f3:bf:17:48:e8:ef:9a:26:13: + 0c:87:f2:73:d6:9c:c5:52:6b:63:f7:32:90:78:a9:6b:eb:5e: + d6:93:a1:bf:bc:18:3d:8b:59:f6:8a:c6:05:5e:52:18:e2:66: + e0:da:c1:dc:ad:5a:25:aa:f4:45:fc:f1:0b:78:a4:af:b0:f2: + 73:a4:30:a8:34:c1:53:7f:42:96:e5:48:41:eb:90:46:0c:06: + dc:cb:92:c6:5e:f3:44:44:43:46:29:46:a0:a6:fc:b9:8e:39: + 27:39:b1:5a:e2:b1:ad:fc:13:ff:8e:fc:26:e1:d4:fe:84:f1: + 50:5a:8e:97:6b:2d:2a:79:fb:40:64:ea:f3:3d:bd:5b:e1:a0: + 04:b0:97:48:1c:42:f5:ea:5a:1c:cd:26:c8:51:ff:14:99:67: + 89:72:5f:1d:ec:ad:5a:dd +-----BEGIN CERTIFICATE----- +MIIFCzCCAvOgAwIBAgIQf/AFoHxM3tEArZ1mpRB7mDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjMxMjEzMDkwMDAwWhcNMjkwMjIw +MTQwMDAwWjA7MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNl +cnZpY2VzMQwwCgYDVQQDEwNXUjIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCp/5x/RR5wqFOfytnlDd5GV1d9vI+aWqxG8YSau5HbyfsvAfuSCQAWXqAc ++MGr+XgvSszYhaLYWTwO0xj7sfUkDSbutltkdnwUxy96zqhMt/TZCPzfhyM1IKji +aeKMTj+xWfpgoh6zySBTGYLKNlNtYE3pAJH8do1cCA8Kwtzxc2vFE24KT3rC8gIc +LrRjg9ox9i11MLL7q8Ju26nADrn5Z9TDJVd06wW06Y613ijNzHoU5HEDy01hLmFX +xRmpC5iEGuh5KdmyjS//V2pm4M6rlagplmNwEmceOuHbsCFx13ye/aoXbv4r+zgX +FNFmp6+atXDMyGOBOozAKql2N87jAgMBAAGjgf4wgfswDgYDVR0PAQH/BAQDAgGG +MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/ +AgEAMB0GA1UdDgQWBBTeGx7teRXUPjckwyG77DQ5bUKyMDAfBgNVHSMEGDAWgBTk +rysmcRorSCeFL1JmLO/wiRNxPjA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAKG +GGh0dHA6Ly9pLnBraS5nb29nL3IxLmNydDArBgNVHR8EJDAiMCCgHqAchhpodHRw +Oi8vYy5wa2kuZ29vZy9yL3IxLmNybDATBgNVHSAEDDAKMAgGBmeBDAECATANBgkq +hkiG9w0BAQsFAAOCAgEARXWL5R87RBOWGqtY8TXJbz3S0DNKhjO6V1FP7sQ02hYS +TL8Tnw3UVOlIecAwPJQl8hr0ujKUtjNyC4XuCRElNJThb0Lbgpt7fyqaqf9/qdLe +SiDLs/sDA7j4BwXaWZIvGEaYzq9yviQmsR4ATb0IrZNBRAq7x9UBhb+TV+PfdBJT +DhEl05vc3ssnbrPCuTNiOcLgNeFbpwkuGcuRKnZc8d/KI4RApW//mkHgte8y0YWu +ryUJ8GLFbsLIbjL9uNrizkqRSvOFVU6xddZIMy9vhNkSXJ/UcZhjJY1pXAprffJB +vei7j+Qi151lRehMCofa6WBmiA4fx+FOVsV2/7R6V2nyAiIJJkEd2nSi5SnzxJrl +Xdaqev3htytmOPvoKWa676ATL/hzfvDaQBEcXd2Ppvy+275W+DKcH0FBbX62xevG +iza3F4ydzxl6NJ8hk8R+dDXSqv1MbRT1ybB5W0k8878XSOjvmiYTDIfyc9acxVJr +Y/cykHipa+te1pOhv7wYPYtZ9orGBV5SGOJm4NrB3K1aJar0RfzxC3ikr7Dyc6Qw +qDTBU39CluVIQeuQRgwG3MuSxl7zRERDRilGoKb8uY45JzmxWuKxrfwT/478JuHU +/oTxUFqOl2stKnn7QGTq8z29W+GgBLCXSBxC9epaHM0myFH/FJlniXJfHeytWt0= +-----END CERTIFICATE----- + +SHA-256 hash: 2fe357db13751ff9160e87354975b3407498f41c9bd16a48657866e6e5a9b4c7 +Subject: "CN=WR3, O=Google Trust Services, C=US" +Issuer: "CN=GTS Root R1, O=Google Trust Services LLC, C=US" +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 7f:f0:05:a9:15:68:d6:3a:bc:22:86:16:84:aa:4b:5a + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R1 + Validity + Not Before: Dec 13 09:00:00 2023 GMT + Not After : Feb 20 14:00:00 2029 GMT + Subject: C=US, O=Google Trust Services, CN=WR3 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:8f:34:75:87:af:84:72:14:8d:07:10:91:6f:03: + ac:f1:d4:08:35:9a:19:f2:9b:18:89:34:6c:98:8f: + 7a:d4:dd:ea:05:e8:de:1b:7c:8c:54:12:ba:79:8a: + fb:18:0d:0d:7c:9c:f3:bd:38:e4:a8:5e:c6:33:cb: + 46:89:6f:46:a0:e9:37:63:8d:dc:cc:d5:97:4e:32: + ad:7b:1d:23:05:b9:f5:7b:49:43:98:d0:bc:57:c7: + 53:78:18:b1:ed:a7:54:b2:7c:86:be:f0:54:45:bc: + 87:ba:99:59:1d:f4:b8:db:00:fb:81:4f:46:2b:62: + 5e:b1:3a:a5:2a:17:23:ac:a2:be:c5:8e:e5:5e:fd: + 71:1e:7d:a4:b4:23:7d:04:52:b2:34:d2:df:99:ac: + 87:c6:4c:59:5f:f8:e6:4f:8e:75:92:c2:b2:30:46: + 92:d0:b6:0d:c7:e4:89:67:ff:3f:54:94:27:65:e3: + 01:c8:4a:2c:84:2f:65:5f:cd:ad:5c:fd:a6:ad:41: + 5b:dc:4c:3f:17:96:91:7d:a9:d8:3c:53:2a:1c:d0: + e6:d4:77:e6:43:4a:c2:b7:f8:48:a2:cd:ad:63:b5: + 25:6b:96:72:1d:81:45:6f:86:69:c4:e4:e6:78:4c: + 31:e6:a1:7f:a7:01:73:0a:87:ef:87:89:72:cc:d3: + c5:8d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + C7:81:F5:FD:8E:88:D9:00:3C:4D:63:A2:50:31:24:A0:CE:23:FE:23 + X509v3 Authority Key Identifier: + keyid:E4:AF:2B:26:71:1A:2B:48:27:85:2F:52:66:2C:EF:F0:89:13:71:3E + + Authority Information Access: + CA Issuers - URI:http://i.pki.goog/r1.crt + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://c.pki.goog/r/r1.crl + + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + + Signature Algorithm: sha256WithRSAEncryption + 9c:8d:43:94:94:33:48:a7:16:6f:25:d7:ac:94:ac:80:a3:28: + e8:a1:bb:e1:33:2a:86:cb:93:83:ae:da:d0:55:f4:db:be:76: + f9:e8:89:6f:96:2c:38:97:3c:0d:53:87:6a:5c:29:3a:f6:ee: + 3d:d9:79:06:e0:04:80:82:b8:55:ae:e5:f6:3d:c9:f4:cd:7f: + 12:37:96:8c:64:cc:dd:1a:2c:ce:60:49:1a:ef:36:a3:3e:84: + 5a:2e:6a:ef:9c:5e:17:ea:27:26:68:76:1e:6f:7c:6b:fc:89: + 00:8f:e6:38:35:ea:e4:ba:1f:61:c4:3d:01:f7:ca:3f:d6:4c: + 66:ef:98:c1:6f:bf:a8:7a:b2:5f:62:61:68:e9:ed:be:5e:e2: + f1:2f:a5:d5:8f:02:70:a1:2a:33:53:45:2b:8b:38:10:16:0f: + 44:58:d9:0d:ac:0e:1d:7e:df:49:c8:5b:48:c5:4f:9f:93:6e: + d3:89:6b:53:ac:6e:7e:e6:6a:46:8b:04:43:0d:a8:d1:40:32: + cc:3a:32:03:9d:8d:5f:32:53:5a:bd:46:d8:55:60:ff:40:3d: + 85:da:d0:ff:a7:de:f4:6d:f5:eb:bc:ca:c4:da:97:12:bb:3a: + 32:91:ed:b4:4a:2e:19:ba:66:d9:fb:73:ae:67:2f:ae:e6:31: + 4d:fc:5c:e0:6d:86:c0:18:b7:2c:52:e8:cc:da:72:d3:8d:a0: + 0d:f5:c1:cc:3c:a7:d6:cb:5a:5a:cc:bb:f9:09:f3:32:54:79: + f4:5c:fa:8c:13:a4:e5:1e:0b:4f:e9:9a:d3:e2:a3:9d:f4:61: + 32:1e:53:da:e7:26:eb:d1:e4:bc:d4:2d:0d:99:55:6b:5b:4b: + 52:5c:ec:d3:32:c4:75:04:9e:85:30:a3:67:a4:98:b0:6b:76: + 6c:c5:4a:e9:db:ed:c7:37:32:08:fd:10:0d:41:67:35:70:b0: + 83:0d:76:fa:61:92:90:0b:a3:e0:e4:62:f2:43:11:a6:72:fc: + 50:48:e4:35:b7:70:f4:a2:f5:79:86:c4:0b:70:f4:18:fb:9e: + d9:89:36:00:68:71:92:67:1d:9b:50:68:3a:9d:39:91:8c:3f: + 36:7a:a0:87:b4:15:f0:32:b2:05:35:07:6e:31:f4:a5:79:4b: + 88:eb:12:39:8f:82:2e:1d:5e:4c:cf:83:a3:aa:d2:8e:a1:a7: + 0d:07:94:5f:29:59:98:f0:a6:ba:f7:9a:c3:7f:08:56:70:5a: + 6b:a1:22:cf:aa:67:81:9d:6e:e8:e7:8e:ff:55:33:7e:19:b2: + 4e:6d:27:d0:6f:bd:25:9d:ca:4b:63:2a:d3:c8:ac:36:05:c7: + 2e:78:65:1c:96:a9:86:91 +-----BEGIN CERTIFICATE----- +MIIFCzCCAvOgAwIBAgIQf/AFqRVo1jq8IoYWhKpLWjANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjMxMjEzMDkwMDAwWhcNMjkwMjIw +MTQwMDAwWjA7MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNl +cnZpY2VzMQwwCgYDVQQDEwNXUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCPNHWHr4RyFI0HEJFvA6zx1Ag1mhnymxiJNGyYj3rU3eoF6N4bfIxUErp5 +ivsYDQ18nPO9OOSoXsYzy0aJb0ag6TdjjdzM1ZdOMq17HSMFufV7SUOY0LxXx1N4 +GLHtp1SyfIa+8FRFvIe6mVkd9LjbAPuBT0YrYl6xOqUqFyOsor7FjuVe/XEefaS0 +I30EUrI00t+ZrIfGTFlf+OZPjnWSwrIwRpLQtg3H5Iln/z9UlCdl4wHISiyEL2Vf +za1c/aatQVvcTD8XlpF9qdg8Uyoc0ObUd+ZDSsK3+Eiiza1jtSVrlnIdgUVvhmnE +5OZ4TDHmoX+nAXMKh++HiXLM08WNAgMBAAGjgf4wgfswDgYDVR0PAQH/BAQDAgGG +MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/ +AgEAMB0GA1UdDgQWBBTHgfX9jojZADxNY6JQMSSgziP+IzAfBgNVHSMEGDAWgBTk +rysmcRorSCeFL1JmLO/wiRNxPjA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAKG +GGh0dHA6Ly9pLnBraS5nb29nL3IxLmNydDArBgNVHR8EJDAiMCCgHqAchhpodHRw +Oi8vYy5wa2kuZ29vZy9yL3IxLmNybDATBgNVHSAEDDAKMAgGBmeBDAECATANBgkq +hkiG9w0BAQsFAAOCAgEAnI1DlJQzSKcWbyXXrJSsgKMo6KG74TMqhsuTg67a0FX0 +2752+eiJb5YsOJc8DVOHalwpOvbuPdl5BuAEgIK4Va7l9j3J9M1/EjeWjGTM3Ros +zmBJGu82oz6EWi5q75xeF+onJmh2Hm98a/yJAI/mODXq5LofYcQ9AffKP9ZMZu+Y +wW+/qHqyX2JhaOntvl7i8S+l1Y8CcKEqM1NFK4s4EBYPRFjZDawOHX7fSchbSMVP +n5Nu04lrU6xufuZqRosEQw2o0UAyzDoyA52NXzJTWr1G2FVg/0A9hdrQ/6fe9G31 +67zKxNqXErs6MpHttEouGbpm2ftzrmcvruYxTfxc4G2GwBi3LFLozNpy042gDfXB +zDyn1staWsy7+QnzMlR59Fz6jBOk5R4LT+ma0+KjnfRhMh5T2ucm69HkvNQtDZlV +a1tLUlzs0zLEdQSehTCjZ6SYsGt2bMVK6dvtxzcyCP0QDUFnNXCwgw12+mGSkAuj +4ORi8kMRpnL8UEjkNbdw9KL1eYbEC3D0GPue2Yk2AGhxkmcdm1BoOp05kYw/Nnqg +h7QV8DKyBTUHbjH0pXlLiOsSOY+CLh1eTM+Do6rSjqGnDQeUXylZmPCmuveaw38I +VnBaa6Eiz6pngZ1u6OeO/1UzfhmyTm0n0G+9JZ3KS2Mq08isNgXHLnhlHJaphpE= +-----END CERTIFICATE----- + +SHA-256 hash: dc9416c2f855126d6de977677538f2f967ff4998e90dfa435a17219be077fc06 +Subject: "CN=WR4, O=Google Trust Services, C=US" +Issuer: "CN=GTS Root R1, O=Google Trust Services LLC, C=US" +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 7f:f0:05:b4:da:75:b8:6a:5a:c6:1f:e4:30:77:13:cd + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R1 + Validity + Not Before: Dec 13 09:00:00 2023 GMT + Not After : Feb 20 14:00:00 2029 GMT + Subject: C=US, O=Google Trust Services, CN=WR4 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:af:4e:51:bf:ce:50:a4:eb:8e:3d:91:a5:bf:0c: + 2a:22:aa:8a:74:a4:8c:32:68:df:0a:40:66:ec:57: + 6d:2c:af:46:f8:db:d2:6b:44:c4:0b:25:3f:fb:b0: + 84:4b:b1:77:6b:55:c0:39:ef:be:55:f5:74:3f:16: + 55:4f:52:cc:85:41:a5:87:13:18:1a:41:a7:f6:3d: + 9c:4d:56:46:1f:4f:d4:93:e7:b6:bd:51:b5:7e:35: + 39:5d:72:79:b1:be:8a:0b:9a:98:70:fd:31:6f:96: + 7a:6a:da:b3:35:e7:29:47:8a:af:25:1a:a8:10:a5: + 1f:7f:e8:02:ee:a2:59:96:0d:53:8f:14:48:00:95: + 37:7d:42:81:16:f6:02:cc:b8:6d:e5:3b:7d:65:b6: + c7:a7:65:64:f5:94:24:12:d9:14:55:4b:15:e3:ed: + c4:77:da:55:e0:48:4b:24:d5:9c:f9:ed:e4:65:80: + 27:f2:7c:0b:d4:25:4b:4c:b7:df:36:b2:83:51:d9: + dc:ce:54:e2:a3:f7:39:62:78:5a:db:75:f0:59:87: + 16:47:42:7e:c8:26:e1:9c:71:d8:89:9c:a4:d3:79: + b0:63:c4:c8:54:71:41:e4:eb:6c:a5:3b:b8:1e:2e: + d6:f7:24:c5:1b:6e:7b:d2:60:3d:94:01:c9:60:ce: + bc:25 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + 9B:C8:11:BC:3D:AA:36:B9:31:8C:4E:8F:44:D5:57:32:2F:C3:C0:61 + X509v3 Authority Key Identifier: + keyid:E4:AF:2B:26:71:1A:2B:48:27:85:2F:52:66:2C:EF:F0:89:13:71:3E + + Authority Information Access: + CA Issuers - URI:http://i.pki.goog/r1.crt + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://c.pki.goog/r/r1.crl + + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + + Signature Algorithm: sha256WithRSAEncryption + 87:69:c3:f5:60:f9:b2:4c:d4:2c:0c:66:21:db:71:55:96:45: + f3:fe:70:b7:98:9f:20:c5:00:51:13:55:c1:97:0b:f6:eb:8e: + be:b3:53:ef:9a:55:87:2d:d8:e1:da:bd:3e:d0:43:c8:89:a0: + 4d:c2:17:ae:aa:7c:10:b9:50:1d:b3:06:47:6a:27:0b:5c:b9: + 85:18:a8:47:71:86:d4:9f:2a:18:17:b7:07:50:d0:ce:7d:2a: + a3:91:a4:af:1e:22:8a:3f:dd:ea:dc:a8:1b:17:f3:74:0b:ed: + 3d:14:3e:93:a3:da:5d:af:0b:59:d8:63:a5:2f:ff:58:58:0e: + e8:c5:ce:29:ee:aa:4e:27:15:9a:3e:b8:5d:8c:23:a0:34:18: + 36:e6:07:b4:25:8f:16:b5:bc:8a:60:9d:dd:1d:79:1f:ed:ca: + 94:29:cc:ec:5b:d0:c9:d3:6b:d3:82:cf:52:df:cb:60:cf:06: + 64:70:49:c9:4a:b5:a1:7b:c4:e5:12:96:92:8c:35:3e:d1:e9: + ba:6d:fd:f2:e1:b2:57:37:fe:be:ef:b4:d6:2f:e6:74:34:29: + b1:bf:c8:fc:f4:15:f4:10:09:8a:7f:44:d9:c7:d8:2e:50:2c: + 36:5f:55:69:4a:14:8a:0f:6a:ba:54:be:8e:49:dd:86:d3:92: + 41:c5:ad:c3:ad:98:2e:e1:a8:ff:22:3d:70:5e:14:63:8a:bd: + 95:68:0d:3b:b2:fd:21:55:47:42:8f:78:a0:2a:cb:d6:04:4c: + 28:03:6d:16:46:9c:2c:31:02:c0:0b:85:48:ab:ee:85:ae:c3: + 6a:76:3b:85:9e:d8:a8:5e:87:90:d9:49:cd:30:3a:63:d5:11: + 36:af:4c:c6:a2:61:31:e4:dd:91:e7:f3:fa:cd:40:77:f4:18: + d1:ed:8c:1c:68:1b:13:ea:0d:77:86:b0:4d:da:c4:c5:2d:81: + d8:4a:7b:c1:c4:a2:d6:80:37:e2:92:1a:26:04:2e:5a:ef:05: + ae:87:02:b3:3b:2a:73:ea:09:59:3a:f0:d9:54:20:7b:dc:60: + 51:95:0c:64:b4:56:6c:5e:23:dc:52:8f:b1:55:60:57:ee:e0: + f7:94:4d:12:31:a1:0b:53:3c:2d:ab:3c:c3:0e:53:fa:e0:4f: + 30:bb:12:42:4d:81:44:77:30:7f:20:d1:db:4f:76:24:59:5d: + 1a:e0:3c:31:40:2b:18:df:e7:1d:30:df:59:a6:0b:20:f0:94: + 87:00:61:a5:83:a3:2a:78:b8:78:f2:eb:69:da:bb:00:6d:90: + a0:65:6c:cd:9c:20:25:ea:8b:5c:90:5f:f8:8e:a7:cb:31:5d: + d9:ce:4e:5c:c1:ba:e4:d7 +-----BEGIN CERTIFICATE----- +MIIFCzCCAvOgAwIBAgIQf/AFtNp1uGpaxh/kMHcTzTANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjMxMjEzMDkwMDAwWhcNMjkwMjIw +MTQwMDAwWjA7MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNl +cnZpY2VzMQwwCgYDVQQDEwNXUjQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCvTlG/zlCk6449kaW/DCoiqop0pIwyaN8KQGbsV20sr0b429JrRMQLJT/7 +sIRLsXdrVcA5775V9XQ/FlVPUsyFQaWHExgaQaf2PZxNVkYfT9ST57a9UbV+NTld +cnmxvooLmphw/TFvlnpq2rM15ylHiq8lGqgQpR9/6ALuolmWDVOPFEgAlTd9QoEW +9gLMuG3lO31ltsenZWT1lCQS2RRVSxXj7cR32lXgSEsk1Zz57eRlgCfyfAvUJUtM +t982soNR2dzOVOKj9zlieFrbdfBZhxZHQn7IJuGccdiJnKTTebBjxMhUcUHk62yl +O7geLtb3JMUbbnvSYD2UAclgzrwlAgMBAAGjgf4wgfswDgYDVR0PAQH/BAQDAgGG +MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/ +AgEAMB0GA1UdDgQWBBSbyBG8Pao2uTGMTo9E1VcyL8PAYTAfBgNVHSMEGDAWgBTk +rysmcRorSCeFL1JmLO/wiRNxPjA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAKG +GGh0dHA6Ly9pLnBraS5nb29nL3IxLmNydDArBgNVHR8EJDAiMCCgHqAchhpodHRw +Oi8vYy5wa2kuZ29vZy9yL3IxLmNybDATBgNVHSAEDDAKMAgGBmeBDAECATANBgkq +hkiG9w0BAQsFAAOCAgEAh2nD9WD5skzULAxmIdtxVZZF8/5wt5ifIMUAURNVwZcL +9uuOvrNT75pVhy3Y4dq9PtBDyImgTcIXrqp8ELlQHbMGR2onC1y5hRioR3GG1J8q +GBe3B1DQzn0qo5Gkrx4iij/d6tyoGxfzdAvtPRQ+k6PaXa8LWdhjpS//WFgO6MXO +Ke6qTicVmj64XYwjoDQYNuYHtCWPFrW8imCd3R15H+3KlCnM7FvQydNr04LPUt/L +YM8GZHBJyUq1oXvE5RKWkow1PtHpum398uGyVzf+vu+01i/mdDQpsb/I/PQV9BAJ +in9E2cfYLlAsNl9VaUoUig9qulS+jkndhtOSQcWtw62YLuGo/yI9cF4UY4q9lWgN +O7L9IVVHQo94oCrL1gRMKANtFkacLDECwAuFSKvuha7DanY7hZ7YqF6HkNlJzTA6 +Y9URNq9MxqJhMeTdkefz+s1Ad/QY0e2MHGgbE+oNd4awTdrExS2B2Ep7wcSi1oA3 +4pIaJgQuWu8FrocCszsqc+oJWTrw2VQge9xgUZUMZLRWbF4j3FKPsVVgV+7g95RN +EjGhC1M8Las8ww5T+uBPMLsSQk2BRHcwfyDR2092JFldGuA8MUArGN/nHTDfWaYL +IPCUhwBhpYOjKni4ePLradq7AG2QoGVszZwgJeqLXJBf+I6nyzFd2c5OXMG65Nc= +-----END CERTIFICATE----- + +SHA-256 hash: ae0fc852280f1b87cedaf73cfb84cf106efec88e8294253af352ed4034460d7b +Subject: "CN=WR5, O=Google Trust Services, C=US" +Issuer: "CN=GTS Root R2, O=Google Trust Services LLC, C=US" +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 7f:f4:e5:c9:14:96:b0:f2:a1:89:05:ed:50:1e:62:a3 + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R2 + Validity + Not Before: Dec 13 09:00:00 2023 GMT + Not After : Feb 20 14:00:00 2029 GMT + Subject: C=US, O=Google Trust Services, CN=WR5 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:9b:d5:5c:98:85:c1:56:ed:4b:69:4e:a3:73:22: + 2c:ba:b4:e2:64:d2:62:6e:a5:cd:1d:27:2d:4f:77: + be:96:c1:e8:32:9b:e3:d9:6d:09:1e:f0:3f:60:9d: + 81:bd:da:86:2f:c0:62:b7:0c:a4:ed:c8:5c:bc:a9: + 5d:88:c5:60:16:2a:61:0d:5f:19:57:81:4c:13:eb: + 2e:b0:19:f6:e5:db:86:59:18:9b:21:14:3d:e8:fd: + 63:16:13:b6:e8:70:25:d5:4f:95:6f:46:f0:8c:46: + be:b7:23:80:35:90:52:ec:4e:45:0b:24:16:28:6b: + 9b:2e:5c:28:73:00:02:c7:74:2a:30:76:8f:89:ee: + b5:c2:f9:d2:4d:1a:11:d3:ba:f2:72:7f:3f:6a:7b: + 42:3c:6b:bc:a5:0d:b6:b4:16:20:f1:c3:30:12:a7: + 5d:1d:02:b4:99:7f:5b:31:3a:6c:b6:d5:3e:21:a2: + bc:68:93:de:9b:9f:67:36:8b:61:77:3f:17:96:b2: + 45:8b:4e:c9:f1:26:18:c1:eb:73:b0:aa:4b:b4:d6: + 40:bf:43:f1:c1:ca:c9:74:4c:55:3b:cc:54:80:f8: + 30:33:e1:14:c7:cb:bb:05:64:aa:d1:2e:bc:7c:28: + 89:78:83:06:e9:b7:02:48:e3:8b:a1:86:b9:55:a8: + 40:dd + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + 4C:5B:19:C2:8F:1A:7F:55:6F:AA:10:29:FA:02:8B:C7:3C:2A:22:3C + X509v3 Authority Key Identifier: + keyid:BB:FF:CA:8E:23:9F:4F:99:CA:DB:E2:68:A6:A5:15:27:17:1E:D9:0E + + Authority Information Access: + CA Issuers - URI:http://i.pki.goog/r2.crt + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://c.pki.goog/r/r2.crl + + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + + Signature Algorithm: sha256WithRSAEncryption + c1:c0:50:db:85:d8:49:34:e5:9e:84:35:1a:42:3b:89:b6:4c: + 8a:9a:9d:9a:44:3d:d1:4a:68:04:f1:f9:0e:ae:c4:9c:33:07: + 83:3d:bc:f8:06:82:12:3c:c7:1a:0f:38:ab:86:bb:0b:1f:e0: + 5f:e4:67:23:22:a6:a9:6f:4f:3c:00:63:11:87:d0:20:d6:b6: + e1:f0:0c:56:50:ea:e8:ec:14:3e:93:c3:5a:97:30:bf:4f:1b: + d4:a9:6b:5a:dc:ae:17:50:12:3b:1b:5c:e0:81:ed:dc:8b:b1: + be:4e:04:25:79:d1:90:85:41:82:2e:eb:b0:39:4a:a2:41:f5: + b0:70:a1:26:7b:0f:14:7e:03:ce:d5:46:dd:69:d5:38:5b:a3: + cb:a4:ad:48:43:1a:11:75:b1:8a:a7:f3:53:ee:14:e1:84:e0: + 7d:3a:e4:55:ec:59:18:74:5b:99:75:3e:4b:91:62:e9:53:f0: + 18:5b:cd:44:09:3c:82:8c:5c:bf:3a:c6:7a:87:c0:04:0a:4a: + a5:4d:43:aa:5f:9e:a8:b4:68:6c:90:07:51:ee:74:d1:57:d5: + 55:62:e2:7a:bd:8c:46:8c:4a:1e:7f:b2:ac:3b:77:14:6e:80: + 25:63:0f:92:e4:72:08:99:2e:7f:0a:02:39:0d:97:14:0c:92: + 68:c8:78:45:00:31:75:61:59:a9:51:a9:aa:8b:3b:37:ab:4c: + 76:f5:4f:cf:b4:ec:d3:87:18:54:13:ab:84:76:0e:74:5d:ba: + c8:80:c6:6f:f6:dc:8f:ba:50:7a:e8:51:81:8a:7e:b2:a6:6a: + fb:43:e8:3f:71:43:6f:07:3e:07:b5:96:d0:c0:6b:b0:a2:af: + 72:b5:7d:ca:0c:e4:47:c6:31:92:d0:3e:1a:6d:d4:25:3c:9c: + 17:45:1b:b3:81:c4:26:fe:a7:1c:16:b2:d0:80:c6:7c:b4:70: + 53:99:01:75:66:84:6e:63:f6:4c:4b:ca:1b:f3:a0:c6:37:09: + 6f:e8:44:a1:52:9d:fa:cb:3a:6e:e2:d7:d5:d7:bf:0e:f5:8c: + 76:31:4f:e5:ad:bb:3d:c0:93:de:0c:75:51:4d:37:76:31:19: + ff:b8:c5:9d:19:f0:39:e3:47:0a:d4:59:4d:79:19:dd:05:07: + 5b:1a:da:3b:d8:ad:e3:6d:06:f7:4d:46:be:8b:37:71:16:de: + 39:b0:94:b5:cb:a5:f7:f5:1b:f4:28:a5:a8:2d:fe:7d:84:be: + a5:0b:bc:ed:83:fc:62:60:a3:ce:86:26:fe:4d:12:c2:d7:e2: + 1c:95:c1:ae:de:6c:7a:05:a4:2b:30:f8:d0:de:46:f7:59:5f: + b6:77:b8:4f:5e:8f:ab:0b +-----BEGIN CERTIFICATE----- +MIIFCzCCAvOgAwIBAgIQf/TlyRSWsPKhiQXtUB5iozANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMjMxMjEzMDkwMDAwWhcNMjkwMjIw +MTQwMDAwWjA7MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNl +cnZpY2VzMQwwCgYDVQQDEwNXUjUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCb1VyYhcFW7UtpTqNzIiy6tOJk0mJupc0dJy1Pd76Wwegym+PZbQke8D9g +nYG92oYvwGK3DKTtyFy8qV2IxWAWKmENXxlXgUwT6y6wGfbl24ZZGJshFD3o/WMW +E7bocCXVT5VvRvCMRr63I4A1kFLsTkULJBYoa5suXChzAALHdCowdo+J7rXC+dJN +GhHTuvJyfz9qe0I8a7ylDba0FiDxwzASp10dArSZf1sxOmy21T4horxok96bn2c2 +i2F3PxeWskWLTsnxJhjB63Owqku01kC/Q/HBysl0TFU7zFSA+DAz4RTHy7sFZKrR +Lrx8KIl4gwbptwJI44uhhrlVqEDdAgMBAAGjgf4wgfswDgYDVR0PAQH/BAQDAgGG +MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/ +AgEAMB0GA1UdDgQWBBRMWxnCjxp/VW+qECn6AovHPCoiPDAfBgNVHSMEGDAWgBS7 +/8qOI59Pmcrb4mimpRUnFx7ZDjA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAKG +GGh0dHA6Ly9pLnBraS5nb29nL3IyLmNydDArBgNVHR8EJDAiMCCgHqAchhpodHRw +Oi8vYy5wa2kuZ29vZy9yL3IyLmNybDATBgNVHSAEDDAKMAgGBmeBDAECATANBgkq +hkiG9w0BAQsFAAOCAgEAwcBQ24XYSTTlnoQ1GkI7ibZMipqdmkQ90UpoBPH5Dq7E +nDMHgz28+AaCEjzHGg84q4a7Cx/gX+RnIyKmqW9PPABjEYfQINa24fAMVlDq6OwU +PpPDWpcwv08b1KlrWtyuF1ASOxtc4IHt3Iuxvk4EJXnRkIVBgi7rsDlKokH1sHCh +JnsPFH4DztVG3WnVOFujy6StSEMaEXWxiqfzU+4U4YTgfTrkVexZGHRbmXU+S5Fi +6VPwGFvNRAk8goxcvzrGeofABApKpU1Dql+eqLRobJAHUe500VfVVWLier2MRoxK +Hn+yrDt3FG6AJWMPkuRyCJkufwoCOQ2XFAySaMh4RQAxdWFZqVGpqos7N6tMdvVP +z7Ts04cYVBOrhHYOdF26yIDGb/bcj7pQeuhRgYp+sqZq+0PoP3FDbwc+B7WW0MBr +sKKvcrV9ygzkR8YxktA+Gm3UJTycF0Ubs4HEJv6nHBay0IDGfLRwU5kBdWaEbmP2 +TEvKG/OgxjcJb+hEoVKd+ss6buLX1de/DvWMdjFP5a27PcCT3gx1UU03djEZ/7jF +nRnwOeNHCtRZTXkZ3QUHWxraO9it420G901Gvos3cRbeObCUtcul9/Ub9CilqC3+ +fYS+pQu87YP8YmCjzoYm/k0SwtfiHJXBrt5segWkKzD40N5G91lftne4T16Pqws= +-----END CERTIFICATE----- + +SHA-256 hash: 1dfc1605fbad358d8bc844f76d15203fac9ca5c1a79fd4857ffaf2864fbebf96 +Subject: "CN=WE1, O=Google Trust Services, C=US" +Issuer: "CN=GTS Root R4, O=Google Trust Services LLC, C=US" +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 7f:f3:19:77:97:2c:22:4a:76:15:5d:13:b6:d6:85:e3 + Signature Algorithm: ecdsa-with-SHA384 + Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R4 + Validity + Not Before: Dec 13 09:00:00 2023 GMT + Not After : Feb 20 14:00:00 2029 GMT + Subject: C=US, O=Google Trust Services, CN=WE1 + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (256 bit) + pub: + 04:6f:cd:3a:fe:67:57:47:4c:21:03:85:40:c2:47: + 5d:bb:58:47:0f:40:c1:5c:17:85:c6:19:37:e7:d5: + 7c:ed:86:4b:9b:81:d9:d7:1a:13:a5:0a:03:f8:98: + c4:c6:e8:9e:ff:10:59:8f:2c:26:98:f5:e6:26:25: + bb:0f:02:fa:56 + ASN1 OID: prime256v1 + NIST CURVE: P-256 + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + 90:77:92:35:67:C4:FF:A8:CC:A9:E6:7B:D9:80:79:7B:CC:93:F9:38 + X509v3 Authority Key Identifier: + keyid:80:4C:D6:EB:74:FF:49:36:A3:D5:D8:FC:B5:3E:C5:6A:F0:94:1D:8C + + Authority Information Access: + CA Issuers - URI:http://i.pki.goog/r4.crt + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://c.pki.goog/r/r4.crl + + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + + Signature Algorithm: ecdsa-with-SHA384 + 30:65:02:31:00:e7:02:ab:51:d6:f7:43:95:ce:75:fe:d1:11: + 94:d5:cc:40:41:7a:26:be:d8:0c:f3:32:2d:3d:90:ae:15:0f: + 23:48:12:52:8f:3e:64:79:13:af:f5:a6:2c:02:6e:55:b1:02: + 30:26:89:cc:68:01:62:e7:89:ab:7e:17:e8:14:d6:44:7e:e3: + 4c:49:0e:bf:6c:80:62:34:b8:b2:a1:7e:3a:16:88:50:bc:a7: + 88:a0:9f:7d:73:1e:ec:52:41:4d:ee:e2:56 +-----BEGIN CERTIFICATE----- +MIICnzCCAiWgAwIBAgIQf/MZd5csIkp2FV0TttaF4zAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMjMxMjEzMDkwMDAwWhcNMjkwMjIwMTQw +MDAwWjA7MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNlcnZp +Y2VzMQwwCgYDVQQDEwNXRTEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARvzTr+ +Z1dHTCEDhUDCR127WEcPQMFcF4XGGTfn1XzthkubgdnXGhOlCgP4mMTG6J7/EFmP +LCaY9eYmJbsPAvpWo4H+MIH7MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggr +BgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU +kHeSNWfE/6jMqeZ72YB5e8yT+TgwHwYDVR0jBBgwFoAUgEzW63T/STaj1dj8tT7F +avCUHYwwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzAChhhodHRwOi8vaS5wa2ku +Z29vZy9yNC5jcnQwKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL2MucGtpLmdvb2cv +ci9yNC5jcmwwEwYDVR0gBAwwCjAIBgZngQwBAgEwCgYIKoZIzj0EAwMDaAAwZQIx +AOcCq1HW90OVznX+0RGU1cxAQXomvtgM8zItPZCuFQ8jSBJSjz5keROv9aYsAm5V +sQIwJonMaAFi54mrfhfoFNZEfuNMSQ6/bIBiNLiyoX46FohQvKeIoJ99cx7sUkFN +7uJW +-----END CERTIFICATE----- + +SHA-256 hash: 9c3f2fd11c57d7c649ad5a0932c0f0d29756f6a0a1c74c43e1e89a62d64cd320 +Subject: "CN=WE2, O=Google Trust Services, C=US" +Issuer: "CN=GTS Root R4, O=Google Trust Services LLC, C=US" +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 7f:f3:2d:6b:40:9d:15:d5:96:5b:05:87:3a:7c:72:e0 + Signature Algorithm: ecdsa-with-SHA384 + Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R4 + Validity + Not Before: Dec 13 09:00:00 2023 GMT + Not After : Feb 20 14:00:00 2029 GMT + Subject: C=US, O=Google Trust Services, CN=WE2 + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (256 bit) + pub: + 04:35:7e:1f:f2:14:ed:90:7d:e1:9e:2a:34:43:86: + c1:d5:96:e8:27:70:df:9e:04:cb:a9:ca:86:79:0b: + 08:4d:46:8a:c2:74:a4:bb:d9:bf:ee:fd:23:d7:38: + f3:4b:ef:54:17:e1:be:e7:ca:55:25:a8:0c:30:ac: + 2d:5d:4e:a1:51 + ASN1 OID: prime256v1 + NIST CURVE: P-256 + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + 75:BE:C4:77:AE:89:F6:44:37:7D:CF:B1:68:1F:1D:1A:EB:DC:34:59 + X509v3 Authority Key Identifier: + keyid:80:4C:D6:EB:74:FF:49:36:A3:D5:D8:FC:B5:3E:C5:6A:F0:94:1D:8C + + Authority Information Access: + CA Issuers - URI:http://i.pki.goog/r4.crt + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://c.pki.goog/r/r4.crl + + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + + Signature Algorithm: ecdsa-with-SHA384 + 30:64:02:30:0b:bd:b8:36:55:c8:35:a3:d2:d9:7d:39:73:d3: + f7:f7:82:b8:09:d1:81:6f:e5:64:45:db:de:aa:c0:0e:45:12: + 8f:ac:93:e8:1f:60:ec:2e:7e:44:2c:22:94:91:ec:ac:02:30: + 2f:df:0c:90:76:4c:2d:69:61:d5:4f:fd:98:98:18:84:db:34: + ea:98:ec:9b:cd:88:62:ff:d2:65:e5:33:6a:9a:0c:ed:23:49: + 38:2f:51:bf:91:d0:12:a2:c9:38:38:da +-----BEGIN CERTIFICATE----- +MIICnjCCAiWgAwIBAgIQf/Mta0CdFdWWWwWHOnxy4DAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMjMxMjEzMDkwMDAwWhcNMjkwMjIwMTQw +MDAwWjA7MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNlcnZp +Y2VzMQwwCgYDVQQDEwNXRTIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ1fh/y +FO2QfeGeKjRDhsHVlugncN+eBMupyoZ5CwhNRorCdKS72b/u/SPXOPNL71QX4b7n +ylUlqAwwrC1dTqFRo4H+MIH7MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggr +BgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU +db7Ed66J9kQ3fc+xaB8dGuvcNFkwHwYDVR0jBBgwFoAUgEzW63T/STaj1dj8tT7F +avCUHYwwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzAChhhodHRwOi8vaS5wa2ku +Z29vZy9yNC5jcnQwKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL2MucGtpLmdvb2cv +ci9yNC5jcmwwEwYDVR0gBAwwCjAIBgZngQwBAgEwCgYIKoZIzj0EAwMDZwAwZAIw +C724NlXINaPS2X05c9P394K4CdGBb+VkRdveqsAORRKPrJPoH2DsLn5ELCKUkeys +AjAv3wyQdkwtaWHVT/2YmBiE2zTqmOybzYhi/9Jl5TNqmgztI0k4L1G/kdASosk4 +ONo= +-----END CERTIFICATE----- + +SHA-256 hash: 9f819a4c876e12dc84e6fe0e37c1a69b137094b453fa98449398f4b71f4d0092 +Subject: "CN=WE3, O=Google Trust Services, C=US" +Issuer: "CN=GTS Root R4, O=Google Trust Services LLC, C=US" +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 7f:f3:2d:6d:bd:5e:dd:54:ca:4e:4b:67:95:72:91:43 + Signature Algorithm: ecdsa-with-SHA384 + Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R4 + Validity + Not Before: Dec 13 09:00:00 2023 GMT + Not After : Feb 20 14:00:00 2029 GMT + Subject: C=US, O=Google Trust Services, CN=WE3 + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (256 bit) + pub: + 04:8c:72:71:5c:66:e5:04:54:96:79:1b:c1:c2:81: + 65:90:33:36:73:3c:c0:2f:b4:b9:54:06:2a:5a:34: + 27:95:91:35:09:aa:7a:bf:92:c9:8d:18:e8:56:92: + e2:4f:aa:6d:67:5a:6d:41:51:ac:0a:c3:75:c6:27: + b2:02:b7:c5:42 + ASN1 OID: prime256v1 + NIST CURVE: P-256 + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + 36:B6:2C:CE:A3:B4:D0:40:90:45:F3:8B:45:81:C1:C8:E3:19:D4:6D + X509v3 Authority Key Identifier: + keyid:80:4C:D6:EB:74:FF:49:36:A3:D5:D8:FC:B5:3E:C5:6A:F0:94:1D:8C + + Authority Information Access: + CA Issuers - URI:http://i.pki.goog/r4.crt + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://c.pki.goog/r/r4.crl + + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + + Signature Algorithm: ecdsa-with-SHA384 + 30:65:02:31:00:82:6e:b7:32:b8:68:ec:a0:2b:98:c9:b4:5c: + cd:ad:70:5f:6c:c2:75:be:32:51:19:77:d3:d0:6e:18:ed:98: + 61:1a:c2:bc:f2:ce:a1:54:a0:42:35:99:cf:8f:3b:0c:db:02: + 30:43:ed:68:35:0d:4e:55:2d:ee:e5:0f:aa:a6:93:ac:6b:cf: + 1f:ef:3c:36:61:95:2e:33:37:27:3e:52:f7:a5:d8:30:40:e8: + b7:08:4f:0f:61:6a:26:fe:eb:0d:76:3f:ae +-----BEGIN CERTIFICATE----- +MIICnzCCAiWgAwIBAgIQf/Mtbb1e3VTKTktnlXKRQzAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMjMxMjEzMDkwMDAwWhcNMjkwMjIwMTQw +MDAwWjA7MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNlcnZp +Y2VzMQwwCgYDVQQDEwNXRTMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASMcnFc +ZuUEVJZ5G8HCgWWQMzZzPMAvtLlUBipaNCeVkTUJqnq/ksmNGOhWkuJPqm1nWm1B +UawKw3XGJ7ICt8VCo4H+MIH7MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggr +BgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU +NrYszqO00ECQRfOLRYHByOMZ1G0wHwYDVR0jBBgwFoAUgEzW63T/STaj1dj8tT7F +avCUHYwwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzAChhhodHRwOi8vaS5wa2ku +Z29vZy9yNC5jcnQwKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL2MucGtpLmdvb2cv +ci9yNC5jcmwwEwYDVR0gBAwwCjAIBgZngQwBAgEwCgYIKoZIzj0EAwMDaAAwZQIx +AIJutzK4aOygK5jJtFzNrXBfbMJ1vjJRGXfT0G4Y7ZhhGsK88s6hVKBCNZnPjzsM +2wIwQ+1oNQ1OVS3u5Q+qppOsa88f7zw2YZUuMzcnPlL3pdgwQOi3CE8PYWom/usN +dj+u +-----END CERTIFICATE----- + +SHA-256 hash: d0c97e56c7b0ba812d944ad771f7799b5d4144a2327a4e416554f7ee2aa0aeae +Subject: "CN=WE4, O=Google Trust Services, C=US" +Issuer: "CN=GTS Root R4, O=Google Trust Services LLC, C=US" +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 7f:f3:2d:70:bb:d1:a7:30:9b:57:32:50:0a:c9:9a:ae + Signature Algorithm: ecdsa-with-SHA384 + Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R4 + Validity + Not Before: Dec 13 09:00:00 2023 GMT + Not After : Feb 20 14:00:00 2029 GMT + Subject: C=US, O=Google Trust Services, CN=WE4 + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (256 bit) + pub: + 04:c1:aa:09:fd:3c:dc:18:36:3e:db:eb:69:ad:7f: + 75:72:47:a1:c8:6c:2c:fd:28:bb:f5:60:51:77:c1: + ab:bc:ec:d2:21:f6:35:d2:5e:70:24:59:dd:fc:5b: + 13:39:3d:d1:5f:3b:d0:fb:cc:90:1d:6a:97:ff:a8: + f4:85:53:10:6c + ASN1 OID: prime256v1 + NIST CURVE: P-256 + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + 6D:E7:D4:65:B4:38:57:56:95:CD:E5:B4:77:5A:36:0A:DE:7D:52:A6 + X509v3 Authority Key Identifier: + keyid:80:4C:D6:EB:74:FF:49:36:A3:D5:D8:FC:B5:3E:C5:6A:F0:94:1D:8C + + Authority Information Access: + CA Issuers - URI:http://i.pki.goog/r4.crt + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://c.pki.goog/r/r4.crl + + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + + Signature Algorithm: ecdsa-with-SHA384 + 30:64:02:30:37:cf:34:3e:33:c6:94:ca:07:f0:53:56:53:93: + c1:e5:bf:e5:69:a6:6a:47:01:b9:03:4b:08:b2:43:8c:ce:1c: + f3:6d:d8:b7:d1:85:24:09:e1:45:4d:f3:3d:15:42:94:02:30: + 46:76:60:39:6b:87:f8:09:da:d1:e9:71:40:91:b7:ee:51:7f: + d7:97:b7:78:e6:a1:aa:1d:98:3b:82:88:3a:2c:8e:7e:8c:34: + 35:71:dd:05:31:d3:ba:3f:59:0a:f2:5d +-----BEGIN CERTIFICATE----- +MIICnjCCAiWgAwIBAgIQf/MtcLvRpzCbVzJQCsmarjAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMjMxMjEzMDkwMDAwWhcNMjkwMjIwMTQw +MDAwWjA7MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNlcnZp +Y2VzMQwwCgYDVQQDEwNXRTQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATBqgn9 +PNwYNj7b62mtf3VyR6HIbCz9KLv1YFF3wau87NIh9jXSXnAkWd38WxM5PdFfO9D7 +zJAdapf/qPSFUxBso4H+MIH7MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggr +BgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU +befUZbQ4V1aVzeW0d1o2Ct59UqYwHwYDVR0jBBgwFoAUgEzW63T/STaj1dj8tT7F +avCUHYwwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzAChhhodHRwOi8vaS5wa2ku +Z29vZy9yNC5jcnQwKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL2MucGtpLmdvb2cv +ci9yNC5jcmwwEwYDVR0gBAwwCjAIBgZngQwBAgEwCgYIKoZIzj0EAwMDZwAwZAIw +N880PjPGlMoH8FNWU5PB5b/laaZqRwG5A0sIskOMzhzzbdi30YUkCeFFTfM9FUKU +AjBGdmA5a4f4CdrR6XFAkbfuUX/Xl7d45qGqHZg7gog6LI5+jDQ1cd0FMdO6P1kK +8l0= +-----END CERTIFICATE----- + +SHA-256 hash: 847409e63526f162753ac49f75218efaafa7d5c94ade9095ce72e7f6b6e3ac99 +Subject: "CN=WE5, O=Google Trust Services, C=US" +Issuer: "CN=GTS Root R3, O=Google Trust Services LLC, C=US" +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 7f:f4:e5:cb:ec:d9:81:f2:ad:fa:08:91:3c:ef:ab:14 + Signature Algorithm: ecdsa-with-SHA384 + Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R3 + Validity + Not Before: Dec 13 09:00:00 2023 GMT + Not After : Feb 20 14:00:00 2029 GMT + Subject: C=US, O=Google Trust Services, CN=WE5 + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (256 bit) + pub: + 04:88:0c:8d:e1:3a:e4:24:06:93:85:77:d6:1c:c0: + ec:1f:50:df:16:08:a4:90:a5:0e:3c:ca:ee:dc:e8: + 24:ed:0b:f3:83:88:3b:ae:75:eb:b7:e6:6f:1e:3b: + 4f:20:12:2b:b7:ec:b8:1e:ab:37:d7:fb:b5:ab:7e: + c7:5b:19:fe:a2 + ASN1 OID: prime256v1 + NIST CURVE: P-256 + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + D4:65:CB:38:C7:25:3C:28:6B:E9:7E:43:C3:A1:A1:B8:E4:4C:68:A0 + X509v3 Authority Key Identifier: + keyid:C1:F1:26:BA:A0:2D:AE:85:81:CF:D3:F1:2A:12:BD:B8:0A:67:FD:BC + + Authority Information Access: + CA Issuers - URI:http://i.pki.goog/r3.crt + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://c.pki.goog/r/r3.crl + + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + + Signature Algorithm: ecdsa-with-SHA384 + 30:65:02:30:42:38:89:c6:9e:b1:7a:6c:18:53:ae:87:ea:5f: + 46:98:f2:7f:35:7a:84:96:aa:79:03:34:f3:d2:f8:e2:8d:1c: + e9:c2:fa:13:a3:4e:ae:7a:f1:41:b3:e8:a9:e6:ff:c6:02:31: + 00:b0:9d:15:48:1a:6f:a8:25:08:ea:cb:40:18:ea:0e:5d:5d: + a1:af:d1:79:0e:8f:5d:e4:70:30:35:8f:9c:24:8a:1f:16:00: + 9b:5a:12:21:c1:12:fd:51:34:c5:c5:e5:74 +-----BEGIN CERTIFICATE----- +MIICnzCCAiWgAwIBAgIQf/Tly+zZgfKt+giRPO+rFDAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMjMxMjEzMDkwMDAwWhcNMjkwMjIwMTQw +MDAwWjA7MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNlcnZp +Y2VzMQwwCgYDVQQDEwNXRTUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASIDI3h +OuQkBpOFd9YcwOwfUN8WCKSQpQ48yu7c6CTtC/ODiDuudeu35m8eO08gEiu37Lge +qzfX+7WrfsdbGf6io4H+MIH7MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggr +BgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU +1GXLOMclPChr6X5Dw6GhuORMaKAwHwYDVR0jBBgwFoAUwfEmuqAtroWBz9PxKhK9 +uApn/bwwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzAChhhodHRwOi8vaS5wa2ku +Z29vZy9yMy5jcnQwKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL2MucGtpLmdvb2cv +ci9yMy5jcmwwEwYDVR0gBAwwCjAIBgZngQwBAgEwCgYIKoZIzj0EAwMDaAAwZQIw +QjiJxp6xemwYU66H6l9GmPJ/NXqElqp5AzTz0vjijRzpwvoTo06uevFBs+ip5v/G +AjEAsJ0VSBpvqCUI6stAGOoOXV2hr9F5Do9d5HAwNY+cJIofFgCbWhIhwRL9UTTF +xeV0 +-----END CERTIFICATE----- + +SHA-256 hash: 812c212e9e45dc5005c7f47411183f5fb2ff1baee184d3354b2e93d78c280164 +Subject: "CN=AE1, O=Google Trust Services, C=US" +Issuer: "CN=GTS Root R4, O=Google Trust Services LLC, C=US" +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 7f:f4:e5:ce:36:a6:a1:fa:5e:e1:91:6c:08:d3:9b:7c + Signature Algorithm: ecdsa-with-SHA384 + Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R4 + Validity + Not Before: Dec 13 09:00:00 2023 GMT + Not After : Feb 20 14:00:00 2029 GMT + Subject: C=US, O=Google Trust Services, CN=AE1 + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (256 bit) + pub: + 04:7d:0a:5c:db:19:c0:d9:0c:d2:79:bf:e2:68:fc: + 45:e2:17:fa:be:4d:59:1b:89:1d:ca:c0:39:6f:8c: + ed:c0:47:a1:2f:88:2b:f5:cc:34:86:f5:9b:51:8d: + 0c:30:57:f1:d8:01:64:db:94:60:b9:e0:56:a3:8b: + e6:49:80:6a:aa + ASN1 OID: prime256v1 + NIST CURVE: P-256 + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + 48:89:60:F9:A3:7D:0C:EA:00:24:A2:DC:9F:07:CE:46:88:A8:32:3A + X509v3 Authority Key Identifier: + keyid:80:4C:D6:EB:74:FF:49:36:A3:D5:D8:FC:B5:3E:C5:6A:F0:94:1D:8C + + Authority Information Access: + CA Issuers - URI:http://i.pki.goog/r4.crt + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://c.pki.goog/r/r4.crl + + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + + Signature Algorithm: ecdsa-with-SHA384 + 30:66:02:31:00:99:d3:28:77:7e:39:f3:e9:c1:1c:33:60:f0: + a3:43:6f:10:4a:db:b8:28:e5:43:e7:8d:16:e0:97:f4:30:78: + e0:20:5c:70:3c:84:5c:e8:09:83:29:f1:09:52:ce:3c:2b:02: + 31:00:f9:57:f6:d0:41:e5:28:16:27:3f:58:41:4b:3d:75:08: + 86:75:31:35:da:cd:5f:b0:10:bd:44:a7:8e:56:0d:1d:7f:3d: + bd:fe:43:32:db:be:2b:a3:91:ab:64:dc:c3:1e +-----BEGIN CERTIFICATE----- +MIICljCCAhugAwIBAgIQf/Tlzjamofpe4ZFsCNObfDAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMjMxMjEzMDkwMDAwWhcNMjkwMjIwMTQw +MDAwWjA7MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNlcnZp +Y2VzMQwwCgYDVQQDEwNBRTEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR9Clzb +GcDZDNJ5v+Jo/EXiF/q+TVkbiR3KwDlvjO3AR6EviCv1zDSG9ZtRjQwwV/HYAWTb +lGC54Faji+ZJgGqqo4H0MIHxMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggr +BgEFBQcDATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBRIiWD5o30M6gAk +otyfB85GiKgyOjAfBgNVHSMEGDAWgBSATNbrdP9JNqPV2Py1PsVq8JQdjDA0Bggr +BgEFBQcBAQQoMCYwJAYIKwYBBQUHMAKGGGh0dHA6Ly9pLnBraS5nb29nL3I0LmNy +dDArBgNVHR8EJDAiMCCgHqAchhpodHRwOi8vYy5wa2kuZ29vZy9yL3I0LmNybDAT +BgNVHSAEDDAKMAgGBmeBDAECATAKBggqhkjOPQQDAwNpADBmAjEAmdMod3458+nB +HDNg8KNDbxBK27go5UPnjRbgl/QweOAgXHA8hFzoCYMp8QlSzjwrAjEA+Vf20EHl +KBYnP1hBSz11CIZ1MTXazV+wEL1Ep45WDR1/Pb3+QzLbviujkatk3MMe +-----END CERTIFICATE----- diff --git a/naiveproxy/src/net/data/ssl/chrome_root_store/root_store.certs b/naiveproxy/src/net/data/ssl/chrome_root_store/root_store.certs index 9c73301e3f..817bbd44f5 100644 --- a/naiveproxy/src/net/data/ssl/chrome_root_store/root_store.certs +++ b/naiveproxy/src/net/data/ssl/chrome_root_store/root_store.certs @@ -3323,132 +3323,6 @@ eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m 0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- -# db3517d1f6732a2d5ab97c533ec70779ee3270a62fb4ac4238372460e6f01e88 -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - d9:b5:43:7f:af:a9:39:0f:00:00:00:00:55:65:ad:58 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, O = "Entrust, Inc.", OU = See www.entrust.net/legal-terms, OU = "(c) 2015 Entrust, Inc. - for authorized use only", CN = Entrust Root Certification Authority - G4 - Validity - Not Before: May 27 11:11:16 2015 GMT - Not After : Dec 27 11:41:16 2037 GMT - Subject: C = US, O = "Entrust, Inc.", OU = See www.entrust.net/legal-terms, OU = "(c) 2015 Entrust, Inc. - for authorized use only", CN = Entrust Root Certification Authority - G4 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (4096 bit) - Modulus: - 00:b1:ec:2c:42:ee:e2:d1:30:ff:a5:92:47:e2:2d: - c3:ba:64:97:6d:ca:f7:0d:b5:59:c1:b3:cb:a8:68: - 19:d8:af:84:6d:30:70:5d:7e:f3:2e:d2:53:99:e1: - fe:1f:5e:d9:48:af:5d:13:8d:db:ff:63:33:4d:d3: - 00:02:bc:c4:f8:d1:06:08:94:79:58:8a:15:de:29: - b3:fd:fd:c4:4f:e8:aa:e2:a0:3b:79:cd:bf:6b:43: - 32:dd:d9:74:10:b9:f7:f4:68:d4:bb:d0:87:d5:aa: - 4b:8a:2a:6f:2a:04:b5:b2:a6:c7:a0:7a:e6:48:ab: - d2:d1:59:cc:d6:7e:23:e6:97:6c:f0:42:e5:dc:51: - 4b:15:41:ed:49:4a:c9:de:10:97:d6:76:c1:ef:a5: - b5:36:14:97:35:d8:78:22:35:52:ef:43:bd:db:27: - db:61:56:82:34:dc:cb:88:60:0c:0b:5a:e5:2c:01: - c6:54:af:d7:aa:c1:10:7b:d2:05:5a:b8:40:9e:86: - a7:c3:90:86:02:56:52:09:7a:9c:d2:27:82:53:4a: - 65:52:6a:f5:3c:e7:a8:f2:9c:af:8b:bd:d3:0e:d4: - d4:5e:6e:87:9e:6a:3d:45:1d:d1:5d:1b:f4:e9:0a: - ac:60:99:fb:89:b4:ff:98:2c:cf:7c:1d:e9:02:aa: - 04:9a:1e:b8:dc:88:6e:25:b3:6c:66:f7:3c:90:f3: - 57:c1:b3:2f:f5:6d:f2:fb:ca:a1:f8:29:9d:46:8b: - b3:6a:f6:e6:67:07:be:2c:67:0a:2a:1f:5a:b2:3e: - 57:c4:d3:21:21:63:65:52:91:1b:b1:99:8e:79:7e: - e6:eb:8d:00:d9:5a:aa:ea:73:e8:a4:82:02:47:96: - fe:5b:8e:54:61:a3:eb:2f:4b:30:b0:8b:23:75:72: - 7c:21:3c:c8:f6:f1:74:d4:1c:7b:a3:05:55:ee:bb: - 4d:3b:32:be:9a:77:66:9e:ac:69:90:22:07:1f:61: - 3a:96:be:e5:9a:4f:cc:05:3c:28:59:d3:c1:0c:54: - a8:59:61:bd:c8:72:4c:e8:dc:9f:87:7f:bd:9c:48: - 36:5e:95:a3:0e:b9:38:24:55:fc:75:66:eb:02:e3: - 08:34:29:4a:c6:e3:2b:2f:33:a0:da:a3:86:a5:12: - 97:fd:80:2b:da:14:42:e3:92:bd:3e:f2:5d:5e:67: - 74:2e:1c:88:47:29:34:5f:e2:32:a8:9c:25:37:8c: - ba:98:00:97:8b:49:96:1e:fd:25:8a:ac:dc:da:d8: - 5d:74:6e:66:b0:ff:44:df:a1:18:c6:be:48:2f:37: - 94:78:f8:95:4a:3f:7f:13:5e:5d:59:fd:74:86:43: - 63:73:49 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - 9F:38:C4:56:23:C3:39:E8:A0:71:6C:E8:54:4C:E4:E8:3A:B1:BF:67 - Signature Algorithm: sha256WithRSAEncryption - 12:e5:42:a6:7b:8b:0f:0c:e4:46:a5:b6:60:40:87:8c:25:7e: - ad:b8:68:2e:5b:c6:40:76:3c:03:f8:c9:59:f4:f3:ab:62:ce: - 10:8d:b4:5a:64:8c:68:c0:b0:72:43:34:d2:1b:0b:f6:2c:53: - d2:ca:90:4b:86:66:fc:aa:83:22:f4:8b:1a:6f:26:48:ac:76: - 77:08:bf:c5:98:5c:f4:26:89:9e:7b:c3:b9:64:32:01:7f:d3: - c3:dd:58:6d:ec:b1:ab:84:55:74:77:84:04:27:52:6b:86:4c: - ce:dd:b9:65:ff:d6:c6:5e:9f:9a:10:99:4b:75:6a:fe:6a:e9: - 97:20:e4:e4:76:7a:c6:d0:24:aa:90:cd:20:90:ba:47:64:fb: - 7f:07:b3:53:78:b5:0a:62:f2:73:43:ce:41:2b:81:6a:2e:85: - 16:94:53:d4:6b:5f:72:22:ab:51:2d:42:d5:00:9c:99:bf:de: - bb:94:3b:57:fd:9a:f5:86:cb:56:3b:5b:88:01:e5:7c:28:4b: - 03:f9:49:83:7c:b2:7f:7c:e3:ed:8e:a1:7f:60:53:8e:55:9d: - 50:34:12:0f:b7:97:7b:6c:87:4a:44:e7:f5:6d:ec:80:37:f0: - 58:19:6e:4a:68:76:f0:1f:92:e4:ea:b5:92:d3:61:51:10:0b: - ad:a7:d9:5f:c7:5f:dc:1f:a3:5c:8c:a1:7e:9b:b7:9e:d3:56: - 6f:66:5e:07:96:20:ed:0b:74:fb:66:4e:8b:11:15:e9:81:49: - 7e:6f:b0:d4:50:7f:22:d7:5f:65:02:0d:a6:f4:85:1e:d8:ae: - 06:4b:4a:a7:d2:31:66:c2:f8:ce:e5:08:a6:a4:02:96:44:68: - 57:c4:d5:33:cf:19:2f:14:c4:94:1c:7b:a4:d9:f0:9f:0e:b1: - 80:e2:d1:9e:11:64:a9:88:11:3a:76:82:e5:62:c2:80:d8:a4: - 83:ed:93:ef:7c:2f:90:b0:32:4c:96:15:68:48:52:d4:99:08: - c0:24:e8:1c:e3:b3:a5:21:0e:92:c0:90:1f:cf:20:5f:ca:3b: - 38:c7:b7:6d:3a:f3:e6:44:b8:0e:31:6b:88:8e:70:eb:9c:17: - 52:a8:41:94:2e:87:b6:e7:a6:12:c5:75:df:5b:c0:0a:6e:7b: - a4:e4:5e:86:f9:36:94:df:77:c3:e9:0d:c0:39:f1:79:bb:46: - 8e:ab:43:59:27:b7:20:bb:23:e9:56:40:21:ec:31:3d:65:aa: - 43:f2:3d:df:70:44:e1:ba:4d:26:10:3b:98:9f:f3:c8:8e:1b: - 38:56:21:6a:51:93:d3:91:ca:46:da:89:b7:3d:53:83:2c:08: - 1f:8b:8f:53:dd:ff:ac:1f ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw -gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL -Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg -MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw -BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 -MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 -c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ -bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ -2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E -T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j -5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM -C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T -DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX -wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A -2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm -nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 -dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl -N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj -c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS -5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS -Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr -hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ -B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI -AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw -H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ -b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk -2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol -IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk -5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY -n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== ------END CERTIFICATE----- - # bfff8fd04433487d6a8aa60c1a29767a9fc2bbb05e420f713a13b992891d3893 Certificate: Data: diff --git a/naiveproxy/src/net/data/ssl/chrome_root_store/root_store.md b/naiveproxy/src/net/data/ssl/chrome_root_store/root_store.md index 698f00c3fa..510e1be3ab 100644 --- a/naiveproxy/src/net/data/ssl/chrome_root_store/root_store.md +++ b/naiveproxy/src/net/data/ssl/chrome_root_store/root_store.md @@ -1,7 +1,7 @@ # Chrome Root Store -Version: 23 +Version: 26 [TOC] @@ -17,8 +17,6 @@ e35d28419ed02025cfa69038cd623962458da5c695fbdea3c22b0bfb25897092 | CN=Amazon Roo b676f2eddae8775cd36cb0f63cd1d4603961f49e6265ba013a2f0307b6d0b804 | CN=Certum Trusted Network CA 2,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL | 2011-10-06 | 2046-10-06 f356bea244b7a91eb35d53ca9ad7864ace018e2d35d5f8f96ddf68a6f41aa474 | CN=Atos TrustedRoot 2011,O=Atos,C=DE | 2011-07-07 | 2030-12-31 57de0583efd2b26e0361da99da9df4648def7ee8441c3b728afa9bcde0f9b26a | CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES | 2014-09-23 | 2036-05-05 -9a114025197c5bb95d94e63d55cd43790847b646b23cdf11ada4a00eff15fb48 | CN=Buypass Class 2 Root CA,O=Buypass AS-983163327,C=NO | 2010-10-26 | 2040-10-26 -edf7ebbca27a2a384d387b7d4010c666e2edb4843e4c29b4ae1d5b9332e6b24d | CN=Buypass Class 3 Root CA,O=Buypass AS-983163327,C=NO | 2010-10-26 | 2040-10-26 657cfe2fa73faa38462571f332a2363a46fce7020951710702cdfbb6eeda3305 | OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO | 2017-02-06 | 2042-02-06 eaa962c4fa4a6bafebe415196d351ccd888d4f53f3fa8ae6d7c466a94e6042bb | OU=certSIGN ROOT CA,O=certSIGN,C=RO | 2006-07-04 | 2031-07-04 5cc3d78e4e1d5e45547a04e6873e64f90cf9536d1ccc2ef800f355c4c5fd70fd | CN=CFCA EV ROOT,O=China Financial Certification Authority,C=CN | 2012-08-08 | 2029-12-31 @@ -121,11 +119,12 @@ To learn more about constraints applied to certificates included in the Chrome R SHA 256 Hash | Subject | NotBefore | NotAfter ---|---|---|--- +9a114025197c5bb95d94e63d55cd43790847b646b23cdf11ada4a00eff15fb48 | CN=Buypass Class 2 Root CA,O=Buypass AS-983163327,C=NO | 2010-10-26 | 2040-10-26 +edf7ebbca27a2a384d387b7d4010c666e2edb4843e4c29b4ae1d5b9332e6b24d | CN=Buypass Class 3 Root CA,O=Buypass AS-983163327,C=NO | 2010-10-26 | 2040-10-26 c0a6f4dc63a24bfdcf54ef2a6a082a0a72de35803e2ff5ff527ae5d87206dfd5 | OU=ePKI Root Certification Authority,O=Chunghwa Telecom Co.\, Ltd.,C=TW | 2004-12-20 | 2034-12-20 02ed0eb28c14da45165c566791700d6451d7fb56f0b2ab1d3b8eb070e56edff5 | CN=Entrust Root Certification Authority - EC1,OU=See www.entrust.net/legal-terms+OU=(c) 2012 Entrust\, Inc. - for authorized use only,O=Entrust\, Inc.,C=US | 2012-12-18 | 2037-12-18 0376ab1d54c5f9803ce4b2e201a0ee7eef7b57b636e8a93c9b8d4860c96f5fa7 | CN=AffirmTrust Commercial,O=AffirmTrust,C=US | 2010-01-29 | 2030-12-31 43df5774b03e7fef5fe40d931a7bedf1bb2e6b42738c4e6d3841103d3aa7f339 | CN=Entrust Root Certification Authority - G2,OU=See www.entrust.net/legal-terms+OU=(c) 2009 Entrust\, Inc. - for authorized use only,O=Entrust\, Inc.,C=US | 2009-07-07 | 2030-12-07 73c176434f1bc6d5adf45b0e76e727287c8de57616c1e6e6141a2b2cbc7d8e4c | CN=Entrust Root Certification Authority,OU=www.entrust.net/CPS is incorporated by reference+OU=(c) 2006 Entrust\, Inc.,O=Entrust\, Inc.,C=US | 2006-11-27 | 2026-11-27 -db3517d1f6732a2d5ab97c533ec70779ee3270a62fb4ac4238372460e6f01e88 | CN=Entrust Root Certification Authority - G4,OU=See www.entrust.net/legal-terms+OU=(c) 2015 Entrust\, Inc. - for authorized use only,O=Entrust\, Inc.,C=US | 2015-05-27 | 2037-12-27 6c61dac3a2def031506be036d2a6fe401994fbd13df9c8d466599274c446ec98 | CN=NetLock Arany (Class Gold) Főtanúsítvány,OU=Tanúsítványkiadók (Certification Services),O=NetLock Kft.,L=Budapest,C=HU | 2008-12-11 | 2028-12-06 f015ce3cc239bfef064be9f1d2c417e1a0264a0a94be1f0c8d121864eb6949cc | CN=HiPKI Root CA - G1,O=Chunghwa Telecom Co.\, Ltd.,C=TW | 2019-02-22 | 2037-12-31 diff --git a/naiveproxy/src/net/data/ssl/chrome_root_store/root_store.textproto b/naiveproxy/src/net/data/ssl/chrome_root_store/root_store.textproto index e0689708a4..8ae6aa51c8 100644 --- a/naiveproxy/src/net/data/ssl/chrome_root_store/root_store.textproto +++ b/naiveproxy/src/net/data/ssl/chrome_root_store/root_store.textproto @@ -8,7 +8,7 @@ # Version # should always be incremented up whenever this (or any pem file that # it references) is changed. -version_major: 23 +version_major: 26 # CN=Actalis Authentication Root CA, O=Actalis S.p.A./03358520967, L=Milan, C=IT # https://ssltest-a.actalis.it:8443 @@ -71,15 +71,23 @@ trust_anchors { } # CN=Buypass Class 2 Root CA, O=Buypass AS-983163327, C=NO +# Constraint date and time (GMT): Friday, October 31, 2025 11:59:59 PM trust_anchors { sha256_hex: "9a114025197c5bb95d94e63d55cd43790847b646b23cdf11ada4a00eff15fb48" + constraints: { + sct_not_after_sec: 1761955199 + } } # CN=Buypass Class 3 Root CA, O=Buypass AS-983163327, C=NO # https://valid.evident.ca23.ssl.buypass.no/ +# Constraint date and time (GMT): Friday, October 31, 2025 11:59:59 PM trust_anchors { sha256_hex: "edf7ebbca27a2a384d387b7d4010c666e2edb4843e4c29b4ae1d5b9332e6b24d" ev_policy_oids: "2.23.140.1.1" + constraints: { + sct_not_after_sec: 1761955199 + } } # OU=certSIGN ROOT CA G2, O=CERTSIGN SA, C=RO @@ -279,21 +287,6 @@ trust_anchors { } } -# CN=Entrust Root Certification Authority - G4, OU=(c) 2015 Entrust, Inc. - for authorized use only, OU=See www.entrust.net/legal-terms, O=Entrust, Inc., C=US -# https://validg4.entrust.net -# Constraint date: Mon Nov 11, 2024 23:59:59 GMT+0000 -trust_anchors { - sha256_hex: "db3517d1f6732a2d5ab97c533ec70779ee3270a62fb4ac4238372460e6f01e88" - ev_policy_oids: "2.23.140.1.1" - constraints: { - sct_not_after_sec: 1731369599 - min_version: "131" - } - constraints: { - max_version_exclusive: "131" - } -} - # CN=GDCA TrustAUTH R5 ROOT, O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD., C=CN trust_anchors { sha256_hex: "bfff8fd04433487d6a8aa60c1a29767a9fc2bbb05e420f713a13b992891d3893" @@ -394,6 +387,7 @@ trust_anchors { # CN=ISRG Root X1, O=Internet Security Research Group, C=US trust_anchors { sha256_hex: "96bcec06264976f37460779acf28c5a7cfe8a3c0aae11a8ffcee05c0bddf08c6" + trust_anchor_id: "\x82\xdf\x13\x02\x01" # 44947.2.1 } # CN=Izenpe.com, O=IZENPE S.A., C=ES @@ -603,13 +597,17 @@ trust_anchors { } # CN=Certum EC-384 CA, OU=Certum Certification Authority, O=Asseco Data Systems S.A., C=PL +# https://valid-cec384ca.certificates.certum.pl/ trust_anchors { sha256_hex: "6b328085625318aa50d173c98d8bda09d57e27413d114cf787a0f5d06c030cf6" + ev_policy_oids: "2.23.140.1.1" } # CN=Certum Trusted Root CA, OU=Certum Certification Authority, O=Asseco Data Systems S.A., C=PL +# https://valid-ctrca.certificates.certum.pl/ trust_anchors { sha256_hex: "fe7696573855773e37a95e7ad4d9cc96c30157c15d31765ba9b15704e1ae78fd" + ev_policy_oids: "2.23.140.1.1" } # CN=D-TRUST BR Root CA 1 2020, O=D-Trust GmbH, C=DE @@ -664,6 +662,7 @@ trust_anchors { # CN=ISRG Root X2, O=Internet Security Research Group, C=US trust_anchors { sha256_hex: "69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" + trust_anchor_id: "\x82\xdf\x13\x02\x06" # 44947.2.6 } # CN=NAVER Global Root Certification Authority, O=NAVER BUSINESS PLATFORM Corp., C=KR @@ -1449,3 +1448,102 @@ additional_certs { sha256_hex: "fe95a24e7f94978e58d99350ab7ab789774a987cd25187c128c191d207523bb1" eutl: true } + +# "CN=WR1, O=Google Trust Services, C=US" +additional_certs { + sha256_hex: "b10b6f00e609509e8700f6d34687a2bfce38ea05a8fdf1cdc40c3a2a0d0d0e45" + enforce_anchor_constraints: true + enforce_anchor_expiry: true + tls_trust_anchor: true + trust_anchor_id: "\xd6\x79\x09\x05" # 11129.9.5 +} + +# "CN=WR2, O=Google Trust Services, C=US" +additional_certs { + sha256_hex: "e6fe22bf45e4f0d3b85c59e02c0f495418e1eb8d3210f788d48cd5e1cb547cd4" + enforce_anchor_constraints: true + enforce_anchor_expiry: true + tls_trust_anchor: true + trust_anchor_id: "\xd6\x79\x09\x06" # 11129.9.6 +} + +# "CN=WR3, O=Google Trust Services, C=US" +additional_certs { + sha256_hex: "2fe357db13751ff9160e87354975b3407498f41c9bd16a48657866e6e5a9b4c7" + enforce_anchor_constraints: true + enforce_anchor_expiry: true + tls_trust_anchor: true + trust_anchor_id: "\xd6\x79\x09\x07" # 11129.9.7 +} + +# "CN=WR4, O=Google Trust Services, C=US" +additional_certs { + sha256_hex: "dc9416c2f855126d6de977677538f2f967ff4998e90dfa435a17219be077fc06" + enforce_anchor_constraints: true + enforce_anchor_expiry: true + tls_trust_anchor: true + trust_anchor_id: "\xd6\x79\x09\x08" # 11129.9.8 +} + +# "CN=WR5, O=Google Trust Services, C=US" +additional_certs { + sha256_hex: "ae0fc852280f1b87cedaf73cfb84cf106efec88e8294253af352ed4034460d7b" + enforce_anchor_constraints: true + enforce_anchor_expiry: true + tls_trust_anchor: true + trust_anchor_id: "\xd6\x79\x09\x09" # 11129.9.9 +} + +# "CN=WE1, O=Google Trust Services, C=US" +additional_certs { + sha256_hex: "1dfc1605fbad358d8bc844f76d15203fac9ca5c1a79fd4857ffaf2864fbebf96" + enforce_anchor_constraints: true + enforce_anchor_expiry: true + tls_trust_anchor: true + trust_anchor_id: "\xd6\x79\x09\x0a" # 11129.9.10 +} + +# "CN=WE2, O=Google Trust Services, C=US" +additional_certs { + sha256_hex: "9c3f2fd11c57d7c649ad5a0932c0f0d29756f6a0a1c74c43e1e89a62d64cd320" + enforce_anchor_constraints: true + enforce_anchor_expiry: true + tls_trust_anchor: true + trust_anchor_id: "\xd6\x79\x09\x0b" # 11129.9.11 +} + +# "CN=WE3, O=Google Trust Services, C=US" +additional_certs { + sha256_hex: "9f819a4c876e12dc84e6fe0e37c1a69b137094b453fa98449398f4b71f4d0092" + enforce_anchor_constraints: true + enforce_anchor_expiry: true + tls_trust_anchor: true + trust_anchor_id: "\xd6\x79\x09\x0c" # 11129.9.12 +} + +# "CN=WE4, O=Google Trust Services, C=US" +additional_certs { + sha256_hex: "d0c97e56c7b0ba812d944ad771f7799b5d4144a2327a4e416554f7ee2aa0aeae" + enforce_anchor_constraints: true + enforce_anchor_expiry: true + tls_trust_anchor: true + trust_anchor_id: "\xd6\x79\x09\x0d" # 11129.9.13 +} + +# "CN=WE5, O=Google Trust Services, C=US" +additional_certs { + sha256_hex: "847409e63526f162753ac49f75218efaafa7d5c94ade9095ce72e7f6b6e3ac99" + enforce_anchor_constraints: true + enforce_anchor_expiry: true + tls_trust_anchor: true + trust_anchor_id: "\xd6\x79\x09\x0e" # 11129.9.14 +} + +# "CN=AE1, O=Google Trust Services, C=US" +additional_certs { + sha256_hex: "812c212e9e45dc5005c7f47411183f5fb2ff1baee184d3354b2e93d78c280164" + enforce_anchor_constraints: true + enforce_anchor_expiry: true + tls_trust_anchor: true + trust_anchor_id: "\xd6\x79\x09\x0f" # 11129.9.15 +} diff --git a/naiveproxy/src/net/device_bound_sessions/cookie_craving.cc b/naiveproxy/src/net/device_bound_sessions/cookie_craving.cc index 8e924eb756..90590770e1 100644 --- a/naiveproxy/src/net/device_bound_sessions/cookie_craving.cc +++ b/naiveproxy/src/net/device_bound_sessions/cookie_craving.cc @@ -6,16 +6,21 @@ #include +#include "base/check.h" #include "base/containers/contains.h" #include "base/containers/fixed_flat_set.h" +#include "base/debug/crash_logging.h" +#include "base/debug/dump_without_crashing.h" #include "base/strings/strcat.h" #include "net/base/url_util.h" #include "net/cookies/canonical_cookie.h" +#include "net/cookies/cookie_access_params.h" #include "net/cookies/cookie_constants.h" #include "net/cookies/cookie_inclusion_status.h" #include "net/cookies/cookie_util.h" #include "net/cookies/parsed_cookie.h" #include "net/device_bound_sessions/proto/storage.pb.h" +#include "net/device_bound_sessions/session_error.h" #include "net/url_request/url_request.h" #include "url/url_canon.h" @@ -81,19 +86,22 @@ CookieSourceScheme CookieSourceSchemeFromProtoEnum( } // namespace // static -std::optional CookieCraving::Create( +base::expected CookieCraving::Create( const GURL& url, const std::string& name, const std::string& attributes, base::Time creation_time) { - if (!url.is_valid() || creation_time.is_null()) { - return std::nullopt; + CHECK(url.is_valid()); + if (creation_time.is_null()) { + return base::unexpected( + SessionError{SessionError::kInvalidCredentialsCookieCreationTime}); } // Check the name first individually, otherwise the next step which cobbles // together a cookie line may mask issues with the name. if (!ParsedCookie::IsValidCookieName(name)) { - return std::nullopt; + return base::unexpected( + SessionError{SessionError::kInvalidCredentialsCookieName}); } // Construct an imitation "Set-Cookie" line to feed into ParsedCookie. @@ -105,7 +113,8 @@ std::optional CookieCraving::Create( ParsedCookie parsed_cookie(line_to_parse); if (!parsed_cookie.IsValid()) { - return std::nullopt; + return base::unexpected( + SessionError{SessionError::kInvalidCredentialsCookieParsing}); } static constexpr auto kPermittedAttributes = @@ -115,7 +124,8 @@ std::optional CookieCraving::Create( [](std::string_view attribute, std::string_view value) { return base::Contains(kPermittedAttributes, attribute); })) { - return std::nullopt; + return base::unexpected(SessionError{ + SessionError::kInvalidCredentialsCookieUnpermittedAttribute}); } // `domain` is the domain key for storing the CookieCraving, determined @@ -133,7 +143,8 @@ std::optional CookieCraving::Create( // domain is non-empty, which CanonicalCookie does not. See comment below in // IsValid(). if (!domain || domain->empty()) { - return std::nullopt; + return base::unexpected( + SessionError{SessionError::kInvalidCredentialsCookieInvalidDomain}); } std::string path = @@ -141,7 +152,8 @@ std::optional CookieCraving::Create( CookiePrefix prefix = cookie_util::GetCookiePrefix(name); if (!cookie_util::IsCookiePrefixValid(prefix, url, parsed_cookie)) { - return std::nullopt; + return base::unexpected( + SessionError{SessionError::kInvalidCredentialsCookiePrefix}); } // Note: This is a deviation from CanonicalCookie::Create(), which allows @@ -165,10 +177,25 @@ std::optional CookieCraving::Create( source_port}; CHECK(cookie_craving.IsValid()); + + CookieInclusionStatus status; + if (!cookie_craving.CreateCanonicalCookieForRequest(url, &status)) { + SCOPED_CRASH_KEY_STRING256("CookieCraving", "Create", + status.GetDebugString()); + base::debug::DumpWithoutCrashing(); + // If we're not able to create a canonical cookie here, then we likely won't + // be able to in `CookieCraving::ShouldIncludeForRequest` later, so there's + // no point in creating the craving. + // TODO(crbug.com/435221694): See related TODO below for plan for + // longer-term fix. + return base::unexpected( + SessionError{SessionError::kInvalidCredentialsCookie}); + } + return cookie_craving; } -// TODO(chlily): Much of this function is copied directly from CanonicalCookie. +// TODO(crbug.com/438792839): Much of this function is copied directly from CanonicalCookie. // Try to deduplicate it. bool CookieCraving::IsValid() const { if (ParsedCookie::ParseTokenString(Name()) != Name() || @@ -245,8 +272,8 @@ bool CookieCraving::IsSatisfiedBy( // cookie to come from the same URL (and the source host does not matter as // long as the Domain attribute value matches), so it doesn't make sense to // compare the source scheme and port either. - // TODO(chlily): Decide more carefully how nonced partition keys should be - // compared. + // TODO(crbug.com/353772143): Decide more carefully how nonced partition keys + // should be compared. auto make_required_members_tuple = [](const CookieBase& c) { return std::make_tuple(c.Name(), c.Domain(), c.Path(), c.SecureAttribute(), c.IsHttpOnly(), c.SameSite(), c.PartitionKey()); @@ -387,12 +414,70 @@ bool CookieCraving::ShouldIncludeForRequest( return false; } + CookieInclusionStatus status; + std::unique_ptr canonical_cookie = + CreateCanonicalCookieForRequest(request->url(), &status); + + if (!canonical_cookie) { + SCOPED_CRASH_KEY_STRING256("CookieCraving", "ShouldInclude", + status.GetDebugString()); + base::debug::DumpWithoutCrashing(); + // If we're not able to create a canonical cookie here, return false instead + // of crashing below. + // TODO(crbug.com/435221694): See related TODO below for plan for + // longer-term fix. + return false; + } + + CookieAccessResultList included_cravings; + included_cravings.emplace_back(std::move(*canonical_cookie)); + CookieAccessResultList excluded_cravings; + return request->network_delegate()->AnnotateAndMoveUserBlockedCookies( + *request, first_party_set_metadata, included_cravings, excluded_cravings); +} + +bool CookieCraving::CanSetBoundCookie( + const URLRequest& request, + const FirstPartySetMetadata& first_party_set_metadata, + CookieOptions* options) const { + // TODO(crbug.com/438783631): Refactor this. + // The below is all copied from + // UrlRequestHttpJob::SaveCookiesAndNotifyHeadersComplete. We should refactor + // it. + CookieInclusionStatus status; + std::unique_ptr canonical_cookie = + CreateCanonicalCookieForRequest(request.url(), &status); + if (!canonical_cookie || !status.IsInclude()) { + return false; + } + + if (!request.network_delegate()) { + return false; + } + + if (!request.network_delegate()->CanSetCookie( + request, *canonical_cookie, options, first_party_set_metadata, + &status)) { + return false; + } + + return IsSetPermittedInContext( + request.url(), *options, + CookieAccessParams(CookieAccessSemantics::UNKNOWN, + CookieScopeSemantics::UNKNOWN, + /* delegate_treats_url_as_trustworthy=*/false), + {"https", "http"}, std::nullopt) + .status.IsInclude(); +} + +std::unique_ptr CookieCraving::CreateCanonicalCookieForRequest( + const GURL& url, + CookieInclusionStatus* status) const { // The `NetworkDelegate` can also reject cookies for any reason // (e.g. user preferences). So we need to synthesize a // `CanonicalCookie` and make sure it would be included to check those // conditions too. base::Time now = base::Time::Now(); - CookieInclusionStatus status; std::string domain = Domain(); // This fix is needed because non-IP address __Host- prefix cookies are // considered invalid if they pass through a domain, but Domain() is defined @@ -401,24 +486,19 @@ bool CookieCraving::ShouldIncludeForRequest( // TODO(crbug.com/435221694): re-implement the way we call into // `AnnotateAndMoveUserBlockedCookies` so that it is not possible for a // validation to fail in this method. Some ideas: - // 1) Can we create a canonical cookie in the `CookieCraving` constructor - // with the original inputs? + // 1) Is it needed for `CookieCraving` creation validation and + // `CanonicalCookie` creation validation to be different in the first + // place? // 2) Can we refactor `AnnotateAndMoveUserBlockedCookies` to input a // `CookieBase` instead? - if (!request->url().HostIsIPAddress() && + if (!url.HostIsIPAddress() && cookie_util::GetCookiePrefix(Name()) == COOKIE_PREFIX_HOST) { domain = ""; } - std::unique_ptr canonical_cookie = - CanonicalCookie::CreateSanitizedCookie( - request->url(), Name(), /*value=*/"", domain, Path(), CreationDate(), - now + base::Days(1), now, IsSecure(), IsHttpOnly(), SameSite(), - COOKIE_PRIORITY_DEFAULT, PartitionKey(), &status); - CookieAccessResultList included_cravings; - included_cravings.emplace_back(std::move(*canonical_cookie)); - CookieAccessResultList excluded_cravings; - return request->network_delegate()->AnnotateAndMoveUserBlockedCookies( - *request, first_party_set_metadata, included_cravings, excluded_cravings); + return CanonicalCookie::CreateSanitizedCookie( + url, Name(), /*value=*/"", domain, Path(), CreationDate(), + now + base::Days(1), now, IsSecure(), IsHttpOnly(), SameSite(), + COOKIE_PRIORITY_DEFAULT, PartitionKey(), status); } } // namespace net::device_bound_sessions diff --git a/naiveproxy/src/net/device_bound_sessions/cookie_craving.h b/naiveproxy/src/net/device_bound_sessions/cookie_craving.h index 2b82a08ed2..396d6ebe3a 100644 --- a/naiveproxy/src/net/device_bound_sessions/cookie_craving.h +++ b/naiveproxy/src/net/device_bound_sessions/cookie_craving.h @@ -12,6 +12,7 @@ #include "net/base/net_export.h" #include "net/cookies/cookie_base.h" #include "net/cookies/cookie_constants.h" +#include "net/device_bound_sessions/session_error.h" namespace net { class URLRequest; @@ -63,9 +64,10 @@ class NET_EXPORT CookieCraving : public CookieBase { // Creates a new CookieCraving in the context of `url`, given a `name` and // associated cookie `attributes`. (Note that CookieCravings do not have a // "value".) `url` must be valid. `creation_time` may not be null. May return - // nullopt if an attribute value is invalid. If a CookieCraving is returned, - // it will satisfy IsValid(). If there is leading or trailing whitespace in - // `name`, it will get trimmed. + // a SessionError if the CookieCraving is invalid, such as if an attribute + // value is invalid. If a CookieCraving is returned, it will satisfy + // IsValid(). If there is leading or trailing whitespace in `name`, it will + // get trimmed. // // Partitioned cookies are not supported. Attempts to create a // partitioned CookieCraving will fail. @@ -92,10 +94,11 @@ class NET_EXPORT CookieCraving : public CookieBase { // secure source_scheme, if that cookie was Secure, on the basis that that // URL might be trustworthy when checked later. CookieCraving does not // allow this. - static std::optional Create(const GURL& url, - const std::string& name, - const std::string& attributes, - base::Time creation_time); + static base::expected Create( + const GURL& url, + const std::string& name, + const std::string& attributes, + base::Time creation_time); CookieCraving(const CookieCraving& other); CookieCraving(CookieCraving&& other); @@ -149,7 +152,20 @@ class NET_EXPORT CookieCraving : public CookieBase { const CookieOptions& options, const CookieAccessParams& params) const; + // Whether the craving could be modified by `request`, with other + // arguments providing context for the access. + bool CanSetBoundCookie(const URLRequest& request, + const FirstPartySetMetadata& first_party_set_metadata, + CookieOptions* options) const; + private: + // Creates a CanonicalCookie for this craving in the context of a request to + // `url`. Fills in `status` with any exclusion reasons, which answer why this + // function may return null. + std::unique_ptr CreateCanonicalCookieForRequest( + const GURL& url, + CookieInclusionStatus* status) const; + CookieCraving(); // Prefer Create() over this constructor. This may return non-valid instances. diff --git a/naiveproxy/src/net/device_bound_sessions/jwk_utils.cc b/naiveproxy/src/net/device_bound_sessions/jwk_utils.cc index 3a9e5669fd..3b0fa2ea9b 100644 --- a/naiveproxy/src/net/device_bound_sessions/jwk_utils.cc +++ b/naiveproxy/src/net/device_bound_sessions/jwk_utils.cc @@ -5,7 +5,11 @@ #include "net/device_bound_sessions/jwk_utils.h" #include "base/base64url.h" +#include "base/json/json_writer.h" +#include "base/notreached.h" #include "crypto/evp.h" +#include "crypto/keypair.h" +#include "crypto/sha2.h" #include "third_party/boringssl/src/include/openssl/bn.h" #include "third_party/boringssl/src/include/openssl/ec.h" #include "third_party/boringssl/src/include/openssl/evp.h" @@ -81,38 +85,22 @@ base::Value::Dict ConvertES256PkeySpkiToJwk( base::Value::Dict ConvertRS256PkeySpkiToJwk( base::span pkey_spki) { - bssl::UniquePtr pkey = crypto::evp::PublicKeyFromBytes(pkey_spki); - if (!pkey || EVP_PKEY_id(pkey.get()) != EVP_PKEY_RSA) { + std::optional key = + crypto::keypair::PublicKey::FromSubjectPublicKeyInfo(pkey_spki); + if (!key || !key->IsRsa()) { return base::Value::Dict(); } - RSA* rsa_key = EVP_PKEY_get0_RSA(pkey.get()); - if (!rsa_key) { - return base::Value::Dict(); - } - - const BIGNUM* n = RSA_get0_n(rsa_key); - const BIGNUM* e = RSA_get0_e(rsa_key); - if (!n || !e) { - return base::Value::Dict(); - } - - std::vector n_bytes(BN_num_bytes(n)); - std::vector e_bytes(BN_num_bytes(e)); - BN_bn2bin(n, n_bytes.data()); - BN_bn2bin(e, e_bytes.data()); - return base::Value::Dict() .Set(kKeyTypeParam, kRsaKeyType) - .Set(kRsaModulus, Base64UrlEncode(n_bytes)) - .Set(kRsaExponent, Base64UrlEncode(e_bytes)); + .Set(kRsaModulus, Base64UrlEncode(key->GetRsaModulus())) + .Set(kRsaExponent, Base64UrlEncode(key->GetRsaExponent())); } } // namespace base::Value::Dict ConvertPkeySpkiToJwk( crypto::SignatureVerifier::SignatureAlgorithm algorithm, base::span pkey_spki) { - // TODO(crbug.com/360756896): Support more algorithms. switch (algorithm) { case crypto::SignatureVerifier::SignatureAlgorithm::RSA_PKCS1_SHA256: return ConvertRS256PkeySpkiToJwk(pkey_spki); @@ -123,4 +111,41 @@ base::Value::Dict ConvertPkeySpkiToJwk( } } +std::string CreateJwkThumbprint( + crypto::SignatureVerifier::SignatureAlgorithm algorithm, + base::span pkey_spki) { + base::Value::Dict jwk = ConvertPkeySpkiToJwk(algorithm, pkey_spki); + if (jwk.empty()) { + return ""; + } + + // Move only the required fields from `jwk` to `canonical_jwk`. + base::Value::Dict canonical_jwk; + switch (algorithm) { + case crypto::SignatureVerifier::SignatureAlgorithm::RSA_PKCS1_SHA256: + canonical_jwk.Set(kKeyTypeParam, std::move(*jwk.Extract(kKeyTypeParam))); + canonical_jwk.Set(kRsaExponent, std::move(*jwk.Extract(kRsaExponent))); + canonical_jwk.Set(kRsaModulus, std::move(*jwk.Extract(kRsaModulus))); + break; + case crypto::SignatureVerifier::SignatureAlgorithm::ECDSA_SHA256: + canonical_jwk.Set(kKeyTypeParam, std::move(*jwk.Extract(kKeyTypeParam))); + canonical_jwk.Set(kEcCurve, std::move(*jwk.Extract(kEcCurve))); + canonical_jwk.Set(kEcCoordinateX, + std::move(*jwk.Extract(kEcCoordinateX))); + canonical_jwk.Set(kEcCoordinateY, + std::move(*jwk.Extract(kEcCoordinateY))); + break; + default: + NOTREACHED(); + } + + // The canonical representation of the JWK requires the keys to be sorted + // alphabetically. `base::Value::Dict` is already sorted. + std::string canonical_jwk_string; + CHECK(base::JSONWriter::Write(canonical_jwk, &canonical_jwk_string)); + + std::string thumbprint_hash = crypto::SHA256HashString(canonical_jwk_string); + return Base64UrlEncode(base::as_bytes(base::span(thumbprint_hash))); +} + } // namespace net::device_bound_sessions diff --git a/naiveproxy/src/net/device_bound_sessions/jwk_utils.h b/naiveproxy/src/net/device_bound_sessions/jwk_utils.h index 91ce2b9d1b..ec06259f2c 100644 --- a/naiveproxy/src/net/device_bound_sessions/jwk_utils.h +++ b/naiveproxy/src/net/device_bound_sessions/jwk_utils.h @@ -11,11 +11,19 @@ #include "net/base/net_export.h" namespace net::device_bound_sessions { + // Converts a public key in SPKI format to a JWK (JSON Web Key). Only supports // ES256 and RS256 keys. base::Value::Dict NET_EXPORT ConvertPkeySpkiToJwk(crypto::SignatureVerifier::SignatureAlgorithm algorithm, base::span pkey_spki); + +// Creates a JWK thumbprint as defined in RFC 7638. Returns an empty +// string for failure to create a JWK from `pkey_spki`. +std::string NET_EXPORT +CreateJwkThumbprint(crypto::SignatureVerifier::SignatureAlgorithm algorithm, + base::span pkey_spki); + } // namespace net::device_bound_sessions #endif // NET_DEVICE_BOUND_SESSIONS_JWK_UTILS_H_ diff --git a/naiveproxy/src/net/device_bound_sessions/mock_session_service.h b/naiveproxy/src/net/device_bound_sessions/mock_session_service.h index 06ed88c17a..e828bb767f 100644 --- a/naiveproxy/src/net/device_bound_sessions/mock_session_service.h +++ b/naiveproxy/src/net/device_bound_sessions/mock_session_service.h @@ -46,7 +46,8 @@ class SessionServiceMock : public SessionService { MOCK_METHOD(void, SetChallengeForBoundSession, (OnAccessCallback on_access_callback, - const GURL& request_url, + const URLRequest& request, + const FirstPartySetMetadata& first_party_set_metadata, const SessionChallengeParam& challenge_param), (override)); MOCK_METHOD( @@ -75,6 +76,34 @@ class SessionServiceMock : public SessionService { (const GURL& url, base::RepeatingCallback callback), (override)); + MOCK_METHOD(const Session*, + GetSession, + (const SessionKey& session_key), + (const override)); + MOCK_METHOD(void, + AddSession, + (const SchemefulSite& site, + SessionParams params, + base::span wrapped_key, + base::OnceCallback callback), + (override)); + MOCK_METHOD(const SignedRefreshChallenge*, + GetLatestSignedRefreshChallenge, + (const SessionKey& session_key), + (override)); + MOCK_METHOD(void, + SetLatestSignedRefreshChallenge, + (SessionKey session_key, + SignedRefreshChallenge signed_refresh_challenge), + (override)); + MOCK_METHOD(bool, + SigningQuotaExceeded, + (const SchemefulSite& site), + (override)); + MOCK_METHOD(void, + AddSigningOccurrence, + (const SchemefulSite& site), + (override)); }; } // namespace net::device_bound_sessions diff --git a/naiveproxy/src/net/device_bound_sessions/registration_fetcher.cc b/naiveproxy/src/net/device_bound_sessions/registration_fetcher.cc index d90ac8d086..a07496cd21 100644 --- a/naiveproxy/src/net/device_bound_sessions/registration_fetcher.cc +++ b/naiveproxy/src/net/device_bound_sessions/registration_fetcher.cc @@ -8,19 +8,23 @@ #include #include +#include "base/containers/contains.h" +#include "base/functional/callback.h" #include "base/functional/callback_helpers.h" #include "base/metrics/histogram_functions.h" #include "components/unexportable_keys/background_task_priority.h" #include "components/unexportable_keys/unexportable_key_service.h" -#include "net/base/io_buffer.h" +#include "net/base/features.h" #include "net/base/net_errors.h" +#include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "net/device_bound_sessions/registration_request_param.h" #include "net/device_bound_sessions/session_binding_utils.h" #include "net/device_bound_sessions/session_challenge_param.h" #include "net/device_bound_sessions/session_json_utils.h" +#include "net/device_bound_sessions/session_key.h" +#include "net/device_bound_sessions/url_fetcher.h" #include "net/log/net_log_event_type.h" #include "net/traffic_annotation/network_traffic_annotation.h" -#include "net/url_request/url_request.h" #include "net/url_request/url_request_context.h" #include "url/origin.h" @@ -28,42 +32,17 @@ namespace net::device_bound_sessions { namespace { -constexpr char kSessionIdHeaderName[] = "Sec-Session-Id"; -constexpr char kJwtSessionHeaderName[] = "Sec-Session-Response"; -constexpr net::NetworkTrafficAnnotationTag kRegistrationTrafficAnnotation = - net::DefineNetworkTrafficAnnotation("dbsc_registration", R"( - semantics { - sender: "Device Bound Session Credentials API" - description: - "Device Bound Session Credentials (DBSC) let a server create a " - "session with the local device. For more info see " - "https://github.com/WICG/dbsc." - trigger: - "Server sending a response with a Sec-Session-Registration header." - data: "A signed JWT with the new key created for this session." - destination: WEBSITE - last_reviewed: "2024-04-10" - user_data { - type: ACCESS_TOKEN - } - internal { - contacts { - email: "kristianm@chromium.org" - } - contacts { - email: "chrome-counter-abuse-alerts@google.com" - } - } - } - policy { - cookies_allowed: YES - cookies_store: "user" - setting: "There is no separate setting for this feature, but it will " - "follow the cookie settings." - policy_exception_justification: "Not implemented." - })"); +const char* GetSessionIdHeaderName() { + return net::features::kDeviceBoundSessionsOriginTrialFeedback.Get() + ? "Sec-Secure-Session-Id" + : "Sec-Session-Id"; +} -constexpr int kBufferSize = 4096; +const char* GetJwtSessionHeaderName() { + return net::features::kDeviceBoundSessionsOriginTrialFeedback.Get() + ? "Secure-Session-Response" + : "Sec-Session-Response"; +} // New session registration doesn't block the user and can be done with a delay. constexpr unexportable_keys::BackgroundTaskPriority kTaskPriority = @@ -80,11 +59,11 @@ void RecordHttpResponseOrErrorCode(const char* metric_name, void OnDataSigned( crypto::SignatureVerifier::SignatureAlgorithm algorithm, + const std::vector& pubkey, unexportable_keys::UnexportableKeyService& unexportable_key_service, std::string header_and_payload, - unexportable_keys::UnexportableKeyId key_id, - base::OnceCallback)> callback, + base::OnceCallback< + void(std::optional)> callback, unexportable_keys::ServiceErrorOr> result) { if (!result.has_value()) { std::move(callback).Run(std::nullopt); @@ -93,18 +72,13 @@ void OnDataSigned( const std::vector& signature = result.value(); std::optional registration_token = - AppendSignatureToHeaderAndPayload(header_and_payload, algorithm, + AppendSignatureToHeaderAndPayload(header_and_payload, algorithm, pubkey, signature); - if (!registration_token.has_value()) { - std::move(callback).Run(std::nullopt); - return; - } - - std::move(callback).Run(RegistrationFetcher::RegistrationTokenResult( - registration_token.value(), key_id)); + std::move(callback).Run(std::move(registration_token)); } void SignChallengeWithKey( + bool is_for_refresh, unexportable_keys::UnexportableKeyService& unexportable_key_service, unexportable_keys::UnexportableKeyId& key_id, const GURL& registration_url, @@ -112,132 +86,100 @@ void SignChallengeWithKey( std::optional authorization, std::optional session_identifier, base::OnceCallback< - void(std::optional)> - callback) { + void(std::optional)> callback) { auto expected_algorithm = unexportable_key_service.GetAlgorithm(key_id); + if (!expected_algorithm.has_value()) { + std::move(callback).Run(std::nullopt); + return; + } + auto expected_public_key = unexportable_key_service.GetSubjectPublicKeyInfo(key_id); - if (!expected_algorithm.has_value() || !expected_public_key.has_value()) { + if (!expected_public_key.has_value()) { std::move(callback).Run(std::nullopt); return; } - std::optional optional_header_and_payload = - CreateKeyRegistrationHeaderAndPayload( - challenge, registration_url, expected_algorithm.value(), - expected_public_key.value(), base::Time::Now(), - std::move(authorization), std::move(session_identifier)); + std::optional header_and_payload; + if (!features::kDeviceBoundSessionsOriginTrialFeedback.Get()) { + header_and_payload = CreateLegacyKeyRegistrationHeaderAndPayload( + challenge, registration_url, expected_algorithm.value(), + expected_public_key.value(), base::Time::Now(), + std::move(authorization), std::move(session_identifier)); + } else if (is_for_refresh) { + header_and_payload = + CreateKeyRefreshHeaderAndPayload(challenge, expected_algorithm.value()); + } else { + header_and_payload = CreateKeyRegistrationHeaderAndPayload( + challenge, expected_algorithm.value(), expected_public_key.value(), + std::move(authorization)); + } - if (!optional_header_and_payload.has_value()) { + if (!header_and_payload.has_value()) { std::move(callback).Run(std::nullopt); return; } - std::string header_and_payload = - std::move(optional_header_and_payload.value()); unexportable_key_service.SignSlowlyAsync( - key_id, base::as_byte_span(header_and_payload), kTaskPriority, - /*max_retries=*/0, + key_id, base::as_byte_span(*header_and_payload), kTaskPriority, base::BindOnce(&OnDataSigned, expected_algorithm.value(), - std::ref(unexportable_key_service), header_and_payload, - key_id, std::move(callback))); + std::move(expected_public_key).value(), + std::ref(unexportable_key_service), *header_and_payload, + std::move(callback))); +} + +// Returns the registrable origin label for `origin_str`, or empty if the origin +// is invalid or not registrable. +std::string GetOriginLabel(const std::string& origin_str) { + GURL url(origin_str); + if (!url.is_valid()) { + return ""; + } + + std::string domain = net::registry_controlled_domains::GetDomainAndRegistry( + url, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); + const std::string::size_type dot_index = domain.find('.'); + if (dot_index == std::string::npos) { + return ""; + } + + return domain.substr(0, dot_index); +} + +bool WithinOriginLabelLimit(const std::vector& relying_origins, + const std::string& target_origin) { + constexpr size_t kMaxLabels = 5; + base::flat_set labels_seen; + for (const std::string& origin_str : relying_origins) { + std::string label = GetOriginLabel(origin_str); + if (label.empty()) { + continue; + } + + if (!base::Contains(labels_seen, label)) { + if (labels_seen.size() >= kMaxLabels) { + continue; + } + + labels_seen.insert(std::move(label)); + } + + if (origin_str == target_origin) { + return true; + } + } + + return false; } RegistrationFetcher::FetcherType* g_mock_fetcher = nullptr; -class RegistrationFetcherImpl : public RegistrationFetcher, - URLRequest::Delegate { +class RegistrationFetcherImpl : public RegistrationFetcher { public: - // URLRequest::Delegate - - // TODO(kristianm): Look into if OnAuthRequired might need to be customize - // for DBSC - - // TODO(kristianm): Think about what to do for DBSC with - // OnCertificateRequested, leaning towards not supporting it but not sure. - - // Always cancel requests on SSL errors, this is the default implementation - // of OnSSLCertificateError. - - // This is always called unless the request is deleted before it is called. - void OnResponseStarted(URLRequest* request, int net_error) override { - HttpResponseHeaders* headers = request->response_headers(); - const int response_code = headers ? headers->response_code() : 0; - const char* histogram_name = - IsForRefreshRequest() - ? "Net.DeviceBoundSessions.Refresh.Network.Result" - : "Net.DeviceBoundSessions.Registration.Network.Result"; - RecordHttpResponseOrErrorCode(histogram_name, net_error, response_code); - - if (net_error != OK) { - OnResponseCompleted( - /*error_on_no_data=*/SessionError::ErrorType::kNetError); - // *this is deleted here - return; - } - - if (response_code == 401) { - auto challenge_params = - device_bound_sessions::SessionChallengeParam::CreateIfValid( - fetcher_endpoint_, headers); - OnChallengeNeeded(std::move(challenge_params)); - // *this is preserved here. - return; - } - - if (response_code < 200) { - OnResponseCompleted( - /*error_on_no_data=*/SessionError::ErrorType::kPersistentHttpError); - // *this is deleted here - return; - } else if (response_code == 407) { - // Proxy errors are treated as network errors - OnResponseCompleted( - /*error_on_no_data=*/SessionError::ErrorType::kNetError); - // *this is deleted here - return; - } else if (300 <= response_code && response_code < 500) { - OnResponseCompleted( - /*error_on_no_data=*/SessionError::ErrorType::kPersistentHttpError); - // *this is deleted here - return; - } else if (response_code >= 500) { - OnResponseCompleted( - /*error_on_no_data=*/SessionError::ErrorType::kTransientHttpError); - // *this is deleted here - return; - } - - // Initiate the first read. - int bytes_read = request->Read(buf_.get(), kBufferSize); - if (bytes_read >= 0) { - OnReadCompleted(request, bytes_read); - } else if (bytes_read != ERR_IO_PENDING) { - OnResponseCompleted( - /*error_on_no_data=*/SessionError::ErrorType::kNetError); - // *this is deleted here - } - } - - void OnReadCompleted(URLRequest* request, int bytes_read) override { - data_received_.append(buf_->data(), bytes_read); - while (bytes_read > 0) { - bytes_read = request->Read(buf_.get(), kBufferSize); - if (bytes_read > 0) { - data_received_.append(buf_->data(), bytes_read); - } - } - - if (bytes_read != ERR_IO_PENDING) { - OnResponseCompleted( - /*error_on_no_data=*/SessionError::ErrorType::kNetError); - // *this is deleted here - } - } - RegistrationFetcherImpl( const GURL& fetcher_endpoint, std::optional session_identifier, + SessionService& session_service, unexportable_keys::UnexportableKeyService& key_service, const URLRequestContext* context, const IsolationInfo& isolation_info, @@ -245,12 +187,12 @@ class RegistrationFetcherImpl : public RegistrationFetcher, const std::optional& original_request_initiator) : fetcher_endpoint_(fetcher_endpoint), session_identifier_(std::move(session_identifier)), + session_service_(session_service), key_service_(key_service), context_(context), isolation_info_(isolation_info), net_log_source_(std::move(net_log_source)), - original_request_initiator_(original_request_initiator), - buf_(base::MakeRefCounted(kBufferSize)) {} + original_request_initiator_(original_request_initiator) {} ~RegistrationFetcherImpl() override {} @@ -258,8 +200,7 @@ class RegistrationFetcherImpl : public RegistrationFetcher, unexportable_keys::ServiceErrorOr key_id) { if (!key_id.has_value()) { - RunCallback( - base::unexpected(SessionError{SessionError::ErrorType::kKeyError})); + RunCallback(RegistrationResult(SessionError{SessionError::kKeyError})); // `this` may be deleted. return; } @@ -278,10 +219,11 @@ class RegistrationFetcherImpl : public RegistrationFetcher, number_of_challenges_++; if (number_of_challenges_ < kMaxChallenges) { AttemptChallengeSigning(); + // `this` may be deleted. return; } else { - RunCallback(base::unexpected( - SessionError{SessionError::ErrorType::kTooManyChallenges})); + RunCallback( + RegistrationResult(SessionError{SessionError::kTooManyChallenges})); // `this` may be deleted. return; } @@ -291,8 +233,14 @@ class RegistrationFetcherImpl : public RegistrationFetcher, // `RegistrationRequestParam` constructors guarantee `session_identifier_` // is set when `challenge_` is missing. CHECK(IsForRefreshRequest()); - request_ = CreateBaseRequest(); - request_->Start(); + + url_fetcher_ = std::make_unique(context_, fetcher_endpoint_, + net_log_source_); + ConfigureRequest(url_fetcher_->request()); + // `this` owns `url_fetcher_`, so it's safe to use + // `base::Unretained` + url_fetcher_->Start(base::BindOnce( + &RegistrationFetcherImpl::OnRequestComplete, base::Unretained(this))); } base::WeakPtr GetWeakPtr() { @@ -306,7 +254,8 @@ class RegistrationFetcherImpl : public RegistrationFetcher, RegistrationCompleteCallback callback) override { // Using mock fetcher for testing. if (g_mock_fetcher) { - std::move(callback).Run(nullptr, g_mock_fetcher->Run()); + g_mock_fetcher->Run(std::move(callback)); + // `this` may be deleted. return; } @@ -320,138 +269,532 @@ class RegistrationFetcherImpl : public RegistrationFetcher, GetWeakPtr(), registration_params.TakeChallenge(), registration_params.TakeAuthorization()))); + // `this` may be deleted. } - void StartFetchWithExistingKey( + void StartFetchWithFederatedKey( RegistrationRequestParam& request_params, - unexportable_keys::ServiceErrorOr - key_id, + unexportable_keys::UnexportableKeyId key_id, + const GURL& provider_url, RegistrationCompleteCallback callback) override { // Using mock fetcher for testing. if (g_mock_fetcher) { - std::move(callback).Run(nullptr, g_mock_fetcher->Run()); - return; - } - - if (!key_id.has_value()) { - std::move(callback).Run( - nullptr, - base::unexpected(SessionError{SessionError::ErrorType::kKeyError})); + g_mock_fetcher->Run(std::move(callback)); + // `this` may be deleted. return; } CHECK(callback_.is_null()); callback_ = std::move(callback); - key_id_ = *key_id; + key_id_ = key_id; + provider_url_ = provider_url; + + if (!features::kDeviceBoundSessionsFederatedRegistrationCheckWellKnown + .Get()) { + StartFetch(request_params.TakeChallenge(), + request_params.TakeAuthorization()); + // `this` may be deleted. + return; + } + + GURL::Replacements replacements; + replacements.SetPathStr("/.well-known/device-bound-sessions"); + GURL well_known_url = provider_url_.ReplaceComponents(replacements); + url_fetcher_ = + std::make_unique(context_, well_known_url, net_log_source_); + url_fetcher_->request().set_method("GET"); + url_fetcher_->request().set_allow_credentials(false); + url_fetcher_->request().set_site_for_cookies( + isolation_info_.site_for_cookies()); + url_fetcher_->request().set_initiator(original_request_initiator_); + url_fetcher_->request().set_isolation_info(isolation_info_); + url_fetcher_->Start(base::BindOnce( + &RegistrationFetcherImpl::OnProviderWellKnownRequestComplete, + GetWeakPtr(), request_params.TakeChallenge(), + request_params.TakeAuthorization())); + } + + void StartFetchWithExistingKey( + RegistrationRequestParam& request_params, + unexportable_keys::UnexportableKeyId key_id, + RegistrationCompleteCallback callback) override { + // Using mock fetcher for testing. + if (g_mock_fetcher) { + g_mock_fetcher->Run(std::move(callback)); + // `this` may be deleted. + return; + } + + CHECK(callback_.is_null()); + callback_ = std::move(callback); + + key_id_ = key_id; StartFetch(request_params.TakeChallenge(), request_params.TakeAuthorization()); - } - - private: - static constexpr size_t kMaxSigningFailures = 2; - static constexpr size_t kMaxChallenges = 5; - - void AttemptChallengeSigning() { - SignChallengeWithKey( - *key_service_, *key_id_, fetcher_endpoint_, *current_challenge_, - current_authorization_, session_identifier_, - base::BindOnce(&RegistrationFetcherImpl::OnRegistrationTokenCreated, - GetWeakPtr())); - } - - void OnRegistrationTokenCreated( - std::optional result) { - if (!result) { - number_of_signing_failures_++; - if (number_of_signing_failures_ < kMaxSigningFailures) { - AttemptChallengeSigning(); - return; - } else { - RunCallback(base::unexpected( - SessionError{SessionError::ErrorType::kSigningError})); - // `this` may be deleted. - return; - } - } - - request_ = CreateBaseRequest(); - request_->SetExtraRequestHeaderByName( - kJwtSessionHeaderName, result->registration_token, /*overwrite*/ true); - request_->Start(); - } - - std::unique_ptr CreateBaseRequest() { - CHECK(IsSecure(fetcher_endpoint_)); - - std::unique_ptr request = context_->CreateRequest( - fetcher_endpoint_, IDLE, this, kRegistrationTrafficAnnotation, - /*is_for_websockets=*/false, net_log_source_); - request->set_method("POST"); - request->SetLoadFlags(LOAD_DISABLE_CACHE); - request->set_allow_credentials(true); - - request->set_site_for_cookies(isolation_info_.site_for_cookies()); - request->set_initiator(original_request_initiator_); - request->set_isolation_info(isolation_info_); - - if (IsForRefreshRequest()) { - request->SetExtraRequestHeaderByName( - kSessionIdHeaderName, *session_identifier_, /*overwrite*/ true); - } - - return request; - } - - void OnChallengeNeeded( - std::optional> challenge_params) { - if (!challenge_params || challenge_params->empty()) { - RunCallback(base::unexpected( - SessionError{SessionError::ErrorType::kInvalidChallenge})); - // `this` may be deleted. - return; - } - - // TODO(kristianm): Log if there is more than one challenge - // TODO(kristianm): Handle if session identifiers don't match - const std::string& challenge = (*challenge_params)[0].challenge(); - StartFetch(challenge, std::nullopt); - } - - void OnResponseCompleted(SessionError::ErrorType error_on_no_data) { - if (data_received_.empty()) { - RunCallback(base::unexpected(SessionError{error_on_no_data})); - // `this` may be deleted. - return; - } - - RunCallback(ParseSessionInstructionJson( - request_->url(), *key_id_, session_identifier_, data_received_)); // `this` may be deleted. } - void RunCallback( - base::expected params_or_error) { - AddNetLogResult(params_or_error); - std::move(callback_).Run(this, std::move(params_or_error)); + private: + void OnProviderWellKnownRequestComplete( + std::optional challenge, + std::optional authorization) { + SessionError::ErrorType error = + OnProviderWellKnownRequestCompleteInternal(); + if (error != SessionError::kSuccess) { + RunCallback(RegistrationResult(SessionError{error})); + // `this` may be deleted. + return; + } + + GURL::Replacements replacements; + replacements.SetPathStr("/.well-known/device-bound-sessions"); + GURL well_known_url = fetcher_endpoint_.ReplaceComponents(replacements); + url_fetcher_ = + std::make_unique(context_, well_known_url, net_log_source_); + url_fetcher_->request().set_method("GET"); + url_fetcher_->request().set_allow_credentials(false); + url_fetcher_->request().set_site_for_cookies( + isolation_info_.site_for_cookies()); + url_fetcher_->request().set_initiator(original_request_initiator_); + url_fetcher_->request().set_isolation_info(isolation_info_); + url_fetcher_->Start(base::BindOnce( + &RegistrationFetcherImpl::OnRelyingPartyWellKnownRequestComplete, + GetWeakPtr(), std::move(challenge), std::move(authorization))); } - void AddNetLogResult( - const base::expected& params_or_error) { - if (!request_) { + SessionError::ErrorType OnProviderWellKnownRequestCompleteInternal() { + HttpResponseHeaders* headers = url_fetcher_->request().response_headers(); + const int response_code = headers ? headers->response_code() : 0; + RecordHttpResponseOrErrorCode( + "Net.DeviceBoundSessions.ProviderWellKnown.Network.Result", + url_fetcher_->net_error(), response_code); + + if (url_fetcher_->net_error() != OK) { + return SessionError::kSessionProviderWellKnownUnavailable; + } + + if (!headers || headers->response_code() != 200) { + return SessionError::kSessionProviderWellKnownUnavailable; + } + + std::optional maybe_params = + ParseWellKnownJson(url_fetcher_->data_received()); + if (!maybe_params.has_value()) { + return SessionError::kSessionProviderWellKnownMalformed; + } + + if (maybe_params->provider_origin.has_value()) { + return SessionError::kSessionProviderWellKnownHasProviderOrigin; + } + + std::string target_origin = + url::Origin::Create(fetcher_endpoint_).Serialize(); + if (!maybe_params->relying_origins.has_value() || + !base::Contains(*maybe_params->relying_origins, target_origin)) { + return SessionError::kFederatedNotAuthorizedByProvider; + } + + if (!WithinOriginLabelLimit(*maybe_params->relying_origins, + target_origin)) { + return SessionError::kTooManyRelyingOriginLabels; + } + + return SessionError::kSuccess; + } + + void OnRelyingPartyWellKnownRequestComplete( + std::optional challenge, + std::optional authorization) { + SessionError::ErrorType error = + OnRelyingPartyWellKnownRequestCompleteInternal(); + if (error != SessionError::kSuccess) { + RunCallback(RegistrationResult(SessionError{error})); + // `this` may be deleted. + return; + } + + StartFetch(std::move(challenge), std::move(authorization)); + // `this` may be deleted. + } + + SessionError::ErrorType OnRelyingPartyWellKnownRequestCompleteInternal() { + HttpResponseHeaders* headers = url_fetcher_->request().response_headers(); + const int response_code = headers ? headers->response_code() : 0; + RecordHttpResponseOrErrorCode( + "Net.DeviceBoundSessions.RelyingPartyWellKnown.Network.Result", + url_fetcher_->net_error(), response_code); + + if (url_fetcher_->net_error() != OK) { + return SessionError::kRelyingPartyWellKnownUnavailable; + } + + if (!headers || headers->response_code() != 200) { + return SessionError::kRelyingPartyWellKnownUnavailable; + } + + std::optional maybe_params = + ParseWellKnownJson(url_fetcher_->data_received()); + if (!maybe_params.has_value()) { + return SessionError::kRelyingPartyWellKnownMalformed; + } + + if (maybe_params->relying_origins.has_value()) { + return SessionError::kRelyingPartyWellKnownHasRelyingOrigins; + } + + if (!maybe_params->provider_origin.has_value() || + url::Origin::Create(provider_url_).Serialize() != + *maybe_params->provider_origin) { + return SessionError::kFederatedNotAuthorizedByRelyingParty; + } + + return SessionError::kSuccess; + } + + static constexpr size_t kMaxChallenges = 5; + + void AttemptChallengeSigning() { + base::OnceCallback)> + callback = + base::BindOnce(&RegistrationFetcherImpl::OnRegistrationTokenCreated, + GetWeakPtr(), *current_challenge_, *key_id_); + + if (features::kDeviceBoundSessionsOriginTrialFeedback.Get() && + base::FeatureList::IsEnabled( + features::kDeviceBoundSessionSigningQuotaAndCaching)) { + SchemefulSite site = SchemefulSite(fetcher_endpoint_); + if (IsForRefreshRequest()) { + SessionKey session_key{site, Session::Id(*session_identifier_)}; + const SessionService::SignedRefreshChallenge* signed_refresh_challenge = + session_service_->GetLatestSignedRefreshChallenge(session_key); + // If we already have a matching signed refresh challenge, we can skip + // past the signing. + if (signed_refresh_challenge && + signed_refresh_challenge->challenge == *current_challenge_ && + signed_refresh_challenge->key_id == *key_id_) { + std::move(callback).Run(signed_refresh_challenge->signed_challenge); + // `this` may be deleted. + return; + } + } + + // Now, right before signing, we check whether the signing quota is + // exceeded. Note this callback is intentionally different from the one + // defined above. + if (session_service_->SigningQuotaExceeded(site)) { + RunCallback(RegistrationResult( + SessionError{SessionError::kSigningQuotaExceeded})); + // `this` may be deleted. + return; + } + // Track a new signing attempt. + session_service_->AddSigningOccurrence(site); + } + + SignChallengeWithKey(IsForRefreshRequest(), *key_service_, *key_id_, + fetcher_endpoint_, *current_challenge_, + current_authorization_, session_identifier_, + std::move(callback)); + // `this` may be deleted. + } + + void OnRegistrationTokenCreated( + std::string challenge, + unexportable_keys::UnexportableKeyId key_id, + std::optional + registration_token) { + if (!registration_token) { + RunCallback( + RegistrationResult(SessionError{SessionError::kSigningError})); + // `this` may be deleted. + return; + } + + url_fetcher_ = std::make_unique(context_, fetcher_endpoint_, + net_log_source_); + ConfigureRequest(url_fetcher_->request()); + url_fetcher_->request().SetExtraRequestHeaderByName( + GetJwtSessionHeaderName(), registration_token.value(), + /*overwrite*/ true); + + // Cache the signed refresh challenge in case the same challenge is + // attempted next time (e.g. if refresh transiently fails). + if (features::kDeviceBoundSessionsOriginTrialFeedback.Get() && + base::FeatureList::IsEnabled( + features::kDeviceBoundSessionSigningQuotaAndCaching) && + IsForRefreshRequest()) { + SessionKey session_key{SchemefulSite(fetcher_endpoint_), + Session::Id(*session_identifier_)}; + SessionService::SignedRefreshChallenge signed_refresh_challenge = { + .signed_challenge = std::move(registration_token.value()), + .challenge = std::move(challenge), + .key_id = key_id, + }; + session_service_->SetLatestSignedRefreshChallenge( + std::move(session_key), std::move(signed_refresh_challenge)); + } + + // `this` owns `url_fetcher_`, so it's safe to use + // `base::Unretained` + url_fetcher_->Start(base::BindOnce( + &RegistrationFetcherImpl::OnRequestComplete, base::Unretained(this))); + } + + void ConfigureRequest(URLRequest& request) { + CHECK(IsSecure(fetcher_endpoint_)); + request.set_method("POST"); + request.SetLoadFlags(LOAD_DISABLE_CACHE); + request.set_allow_credentials(true); + + request.set_site_for_cookies(isolation_info_.site_for_cookies()); + request.set_initiator(original_request_initiator_); + request.set_isolation_info(isolation_info_); + + if (IsForRefreshRequest()) { + request.SetExtraRequestHeaderByName( + GetSessionIdHeaderName(), *session_identifier_, /*overwrite*/ true); + } + } + + void OnChallengeNeeded() { + if (features::kDeviceBoundSessionsOriginTrialFeedback.Get()) { + if (!session_identifier_.has_value()) { + RunCallback(RegistrationResult( + SessionError{SessionError::kRegistrationAttemptedChallenge})); + // `this` may be deleted. + return; + } + const Session* session = session_service_->GetSession(SessionKey{ + SchemefulSite(fetcher_endpoint_), Session::Id(*session_identifier_)}); + if (!session || !session->cached_challenge().has_value()) { + RunCallback( + RegistrationResult(SessionError{SessionError::kInvalidChallenge})); + // `this` may be deleted. + return; + } + + StartFetch(*session->cached_challenge(), std::nullopt); + // `this` may be deleted. + } else { + auto challenge_params = + device_bound_sessions::SessionChallengeParam::CreateIfValid( + fetcher_endpoint_, url_fetcher_->request().response_headers()); + if (challenge_params.empty()) { + RunCallback( + RegistrationResult(SessionError{SessionError::kInvalidChallenge})); + // `this` may be deleted. + return; + } + + // TODO(crbug.com/438783634): Log if there is more than one challenge + // TODO(crbug.com/438783634): Handle if session identifiers don't match + const std::string& challenge = challenge_params[0].challenge(); + StartFetch(challenge, std::nullopt); + // `this` may be deleted. + } + } + + void OnRequestComplete() { + HttpResponseHeaders* headers = url_fetcher_->request().response_headers(); + const int response_code = headers ? headers->response_code() : 0; + const char* histogram_name = + IsForRefreshRequest() + ? "Net.DeviceBoundSessions.Refresh.Network.Result" + : "Net.DeviceBoundSessions.Registration.Network.Result"; + RecordHttpResponseOrErrorCode(histogram_name, url_fetcher_->net_error(), + response_code); + + if (url_fetcher_->net_error() != OK) { + RunCallback(RegistrationResult(SessionError{SessionError::kNetError})); + // `this` may be deleted. + return; + } + + if ((features::kDeviceBoundSessionsOriginTrialFeedback.Get() && + response_code == 403) || + (!features::kDeviceBoundSessionsOriginTrialFeedback.Get() && + response_code == 401)) { + OnChallengeNeeded(); + // `this` may be deleted. + return; + } + + if (response_code < 200) { + RunCallback( + RegistrationResult(SessionError{SessionError::kPersistentHttpError})); + // `this` may be deleted. + return; + } else if (response_code == 407) { + // Proxy errors are treated as network errors + RunCallback(RegistrationResult(SessionError{SessionError::kProxyError})); + // `this` may be deleted. + return; + } else if (300 <= response_code && response_code < 500) { + RunCallback( + RegistrationResult(SessionError{SessionError::kPersistentHttpError})); + // `this` may be deleted. + return; + } else if (response_code >= 500) { + RunCallback( + RegistrationResult(SessionError{SessionError::kTransientHttpError})); + // `this` may be deleted. + return; + } + + if (url_fetcher_->data_received().empty()) { + RunCallback( + RegistrationResult(RegistrationResult::NoSessionConfigChange(), + url_fetcher_->maybe_stored_cookies())); + // `this` may be deleted. + return; + } + + base::expected params_or_error = + ParseSessionInstructionJson(url_fetcher_->request().url(), *key_id_, + session_identifier_, + url_fetcher_->data_received()); + if (!params_or_error.has_value()) { + RunCallback(RegistrationResult(std::move(params_or_error).error())); + // `this` may be deleted. + return; + } + + base::expected, SessionError> session_or_error = + Session::CreateIfValid(params_or_error.value()); + if (!session_or_error.has_value()) { + RunCallback(RegistrationResult(std::move(session_or_error).error())); + // `this` may be deleted. + return; + } + + // Re-process challenge headers now that a session exists so that cached + // challenges work for the registration case as well. + auto challenge_params = + device_bound_sessions::SessionChallengeParam::CreateIfValid( + fetcher_endpoint_, headers); + for (const SessionChallengeParam& challenge_param : challenge_params) { + if (challenge_param.session_id() == *(*session_or_error)->id()) { + (*session_or_error)->set_cached_challenge(challenge_param.challenge()); + } + } + + // The registration endpoint is required to be same-site with the + // session. Therefore we don't need any FirstPartySetMetadata. + if (features::kDeviceBoundSessionsOriginTrialFeedback.Get() && + !(*session_or_error) + ->CanSetBoundCookie(url_fetcher_->request(), + FirstPartySetMetadata())) { + RunCallback(RegistrationResult{ + SessionError{SessionError::kBoundCookieSetForbidden}}); + // `this` may be deleted. + return; + } + + // Session::CreateIfValid confirms that the registration endpoint is + // same-site with the scope origin. But we still need to validate + // that this subdomain is allowed to register a session for the + // whole site. + if (features::kDeviceBoundSessionsCheckSubdomainRegistration.Get() && + features::kDeviceBoundSessionsOriginTrialFeedback.Get() && + !IsForRefreshRequest() && params_or_error->scope.include_site && + // Skip all validations if the fetcher endpoint is not a subdomain but + // rather the top-level site (which matches the origin when including + // the site). + fetcher_endpoint_.GetHost() != (*session_or_error)->origin().host()) { + GURL::Replacements replacements; + replacements.SetPathStr("/.well-known/device-bound-sessions"); + replacements.SetHostStr((*session_or_error)->origin().host()); + GURL well_known_url = + fetcher_endpoint_.ReplaceComponents(std::move(replacements)); + url_fetcher_ = std::make_unique(context_, well_known_url, + net_log_source_); + url_fetcher_->request().set_method("GET"); + url_fetcher_->request().set_allow_credentials(false); + url_fetcher_->request().set_site_for_cookies( + isolation_info_.site_for_cookies()); + url_fetcher_->request().set_initiator(original_request_initiator_); + url_fetcher_->request().set_isolation_info(isolation_info_); + url_fetcher_->Start( + base::BindOnce(&RegistrationFetcherImpl:: + OnSubdomainRegistrationWellKnownRequestComplete, + GetWeakPtr(), std::move(*session_or_error))); + return; + } + + RunCallback(RegistrationResult(std::move(session_or_error))); + // `this` may be deleted. + } + + void OnSubdomainRegistrationWellKnownRequestComplete( + std::unique_ptr session) { + RunCallback(OnSubdomainRegistrationWellKnownRequestCompleteInternal( + std::move(session))); + // `this` may be deleted. + } + + RegistrationResult OnSubdomainRegistrationWellKnownRequestCompleteInternal( + std::unique_ptr session) { + HttpResponseHeaders* headers = url_fetcher_->request().response_headers(); + const int response_code = headers ? headers->response_code() : 0; + RecordHttpResponseOrErrorCode( + "Net.DeviceBoundSessions.SubdomainWellKnown.Network.Result", + url_fetcher_->net_error(), response_code); + + if (url_fetcher_->net_error() != OK) { + return RegistrationResult(SessionError{ + SessionError::kSubdomainRegistrationWellKnownUnavailable}); + } + + if (!headers || headers->response_code() != 200) { + return RegistrationResult(SessionError{ + SessionError::kSubdomainRegistrationWellKnownUnavailable}); + } + + std::optional maybe_params = + ParseWellKnownJson(url_fetcher_->data_received()); + if (!maybe_params.has_value()) { + return RegistrationResult( + SessionError{SessionError::kSubdomainRegistrationWellKnownMalformed}); + } + + if (!maybe_params->registering_origins.has_value() || + !base::Contains(*maybe_params->registering_origins, + url::Origin::Create(fetcher_endpoint_).Serialize())) { + return RegistrationResult( + SessionError{SessionError::kSubdomainRegistrationUnauthorized}); + } + + return RegistrationResult(std::move(session)); + } + + void RunCallback(RegistrationResult registration_result) { + AddNetLogResult(registration_result); + if (IsForRefreshRequest()) { + base::UmaHistogramCounts100( + "Net.DeviceBoundSessions.RefreshChallengeCount", + number_of_challenges_); + } + std::move(callback_).Run(this, std::move(registration_result)); + // `this` may be deleted. + } + + void AddNetLogResult(const RegistrationResult& registration_result) { + if (!url_fetcher_) { return; } NetLogEventType result_event_type = IsForRefreshRequest() ? NetLogEventType::DBSC_REFRESH_RESULT : NetLogEventType::DBSC_REGISTRATION_RESULT; - request_->net_log().AddEvent(result_event_type, [&]() { + url_fetcher_->request().net_log().AddEvent(result_event_type, [&]() { std::string result; - if (params_or_error.has_value()) { + if (registration_result.is_session()) { result = IsForRefreshRequest() ? "refreshed" : "registered"; } else { - const SessionError& error = params_or_error.error(); - if (error.IsFatal()) { + const SessionError& error = registration_result.error(); + if (error.GetDeletionReason().has_value()) { result = "session_ended"; } else { result = "failed_continue"; @@ -474,6 +817,7 @@ class RegistrationFetcherImpl : public RegistrationFetcher, GURL fetcher_endpoint_; // Populated iff this is a refresh request (not a registration request). std::optional session_identifier_; + const raw_ref session_service_; const raw_ref key_service_; std::optional key_id_; raw_ptr context_; @@ -484,14 +828,11 @@ class RegistrationFetcherImpl : public RegistrationFetcher, // or not it was successful. RegistrationFetcher::RegistrationCompleteCallback callback_; - // Created to fetch data - std::unique_ptr request_; - scoped_refptr buf_; - std::string data_received_; + std::unique_ptr url_fetcher_; + GURL provider_url_; std::optional current_challenge_; std::optional current_authorization_; - size_t number_of_signing_failures_ = 0; size_t number_of_challenges_ = 0; base::WeakPtrFactory weak_ptr_factory_{this}; @@ -502,6 +843,7 @@ class RegistrationFetcherImpl : public RegistrationFetcher, // static std::unique_ptr RegistrationFetcher::CreateFetcher( RegistrationRequestParam& request_params, + SessionService& session_service, unexportable_keys::UnexportableKeyService& key_service, const URLRequestContext* context, const IsolationInfo& isolation_info, @@ -509,8 +851,8 @@ std::unique_ptr RegistrationFetcher::CreateFetcher( const std::optional& original_request_initiator) { return std::make_unique( request_params.TakeRegistrationEndpoint(), - request_params.TakeSessionIdentifier(), key_service, context, - isolation_info, net_log_source, original_request_initiator); + request_params.TakeSessionIdentifier(), session_service, key_service, + context, isolation_info, net_log_source, original_request_initiator); } void RegistrationFetcher::SetFetcherForTesting(FetcherType* func) { @@ -518,15 +860,13 @@ void RegistrationFetcher::SetFetcherForTesting(FetcherType* func) { g_mock_fetcher = func; } -void RegistrationFetcher::CreateTokenAsyncForTesting( +// static +void RegistrationFetcher::CreateRegistrationTokenAsyncForTesting( unexportable_keys::UnexportableKeyService& unexportable_key_service, std::string challenge, - const GURL& registration_url, std::optional authorization, - std::optional session_identifier, base::OnceCallback< - void(std::optional)> - callback) { + void(std::optional)> callback) { static constexpr crypto::SignatureVerifier::SignatureAlgorithm kSupportedAlgos[] = {crypto::SignatureVerifier::ECDSA_SHA256, crypto::SignatureVerifier::RSA_PKCS1_SHA256}; @@ -534,11 +874,10 @@ void RegistrationFetcher::CreateTokenAsyncForTesting( kSupportedAlgos, kTaskPriority, base::BindOnce( [](unexportable_keys::UnexportableKeyService& key_service, - const GURL& registration_url, const std::string& challenge, + const std::string& challenge, std::optional&& authorization, - std::optional&& session_identifier, base::OnceCallback)> + std::optional)> callback, unexportable_keys::ServiceErrorOr< unexportable_keys::UnexportableKeyId> key_result) { @@ -548,13 +887,12 @@ void RegistrationFetcher::CreateTokenAsyncForTesting( } SignChallengeWithKey( - key_service, key_result.value(), registration_url, challenge, - std::move(authorization), std::move(session_identifier), - std::move(callback)); + /*is_for_refresh=*/false, key_service, key_result.value(), + GURL(), challenge, std::move(authorization), + /*session_identifier=*/std::nullopt, std::move(callback)); }, - std::ref(unexportable_key_service), registration_url, - std::move(challenge), std::move(authorization), - std::move(session_identifier), std::move(callback))); + std::ref(unexportable_key_service), std::move(challenge), + std::move(authorization), std::move(callback))); } } // namespace net::device_bound_sessions diff --git a/naiveproxy/src/net/device_bound_sessions/registration_fetcher.h b/naiveproxy/src/net/device_bound_sessions/registration_fetcher.h index 6e9d6a0b99..ef0590d0ad 100644 --- a/naiveproxy/src/net/device_bound_sessions/registration_fetcher.h +++ b/naiveproxy/src/net/device_bound_sessions/registration_fetcher.h @@ -9,14 +9,14 @@ #include #include "base/functional/callback_forward.h" -#include "base/types/expected.h" #include "components/unexportable_keys/unexportable_key_service.h" #include "net/base/isolation_info.h" #include "net/base/net_errors.h" #include "net/base/net_export.h" #include "net/device_bound_sessions/registration_fetcher_param.h" +#include "net/device_bound_sessions/registration_result.h" +#include "net/device_bound_sessions/session.h" #include "net/device_bound_sessions/session_error.h" -#include "net/device_bound_sessions/session_params.h" #include "net/http/http_response_headers.h" #include "net/log/net_log_source.h" #include "url/gurl.h" @@ -31,30 +31,29 @@ class UnexportableKeyService; namespace net::device_bound_sessions { +class SessionService; class RegistrationRequestParam; // This class creates a new unexportable key, creates a registration JWT and // signs it with the new key, and makes the network request to the DBSC // registration endpoint with this signed JWT to get the registration -// instructions. It is also used for calling the refresh endpoint. +// instructions. It is also used for calling the refresh endpoint. It delegates +// most of the validation to `Session::CreateIfValid`, and returns a full +// `Session`, a request to leave the session config unchanged, or an error. class NET_EXPORT RegistrationFetcher { public: using RegistrationCompleteCallback = - base::OnceCallback)>; + base::OnceCallback; using FetcherType = - base::RepeatingCallback()>; + base::RepeatingCallback; - // TODO(kristianm): Add more parameters when the returned JSON is parsed. - struct NET_EXPORT RegistrationTokenResult { - std::string registration_token; - unexportable_keys::UnexportableKeyId key_id; - }; + using RegistrationToken = std::string; // Creates a fetcher that can be used to do registration or refresh. static std::unique_ptr CreateFetcher( RegistrationRequestParam& request_params, + SessionService& session_service, unexportable_keys::UnexportableKeyService& key_service, const URLRequestContext* context, const IsolationInfo& isolation_info, @@ -79,22 +78,26 @@ class NET_EXPORT RegistrationFetcher { // will be called with a std::nullopt. virtual void StartFetchWithExistingKey( RegistrationRequestParam& request_params, - unexportable_keys::ServiceErrorOr - key_id, + unexportable_keys::UnexportableKeyId key_id, + RegistrationCompleteCallback callback) = 0; + + // Starts the network request to the DBSC registration endpoint for a + // federated session. `callback` is called with the fetch results upon + // completion. + virtual void StartFetchWithFederatedKey( + RegistrationRequestParam& request_params, + unexportable_keys::UnexportableKeyId key_id, + const GURL& provider_url, RegistrationCompleteCallback callback) = 0; // Helper function for generating a new binding key and a registration token // to bind the key on the server. unexportable_key_service must outlive the // callback result - static void CreateTokenAsyncForTesting( + static void CreateRegistrationTokenAsyncForTesting( unexportable_keys::UnexportableKeyService& unexportable_key_service, std::string challenge, - const GURL& registration_url, std::optional authorization, - std::optional session_identifier, - base::OnceCallback< - void(std::optional)> - callback); + base::OnceCallback)> callback); static void SetFetcherForTesting(FetcherType* fetcher); diff --git a/naiveproxy/src/net/device_bound_sessions/registration_fetcher_param.cc b/naiveproxy/src/net/device_bound_sessions/registration_fetcher_param.cc index ddc22efa0a..4332e4e8fc 100644 --- a/naiveproxy/src/net/device_bound_sessions/registration_fetcher_param.cc +++ b/naiveproxy/src/net/device_bound_sessions/registration_fetcher_param.cc @@ -11,17 +11,25 @@ #include "base/strings/escape.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" +#include "net/base/features.h" #include "net/base/schemeful_site.h" +#include "net/device_bound_sessions/session.h" #include "net/device_bound_sessions/session_binding_utils.h" #include "net/http/structured_headers.h" namespace { -// TODO(kristianm): See if these can be used with -// services/network/sec_header_helpers.cc -constexpr char kRegistrationHeaderName[] = "Sec-Session-Registration"; +const char* GetRegistrationHeaderName() { + return net::features::kDeviceBoundSessionsOriginTrialFeedback.Get() + ? "Secure-Session-Registration" + : "Sec-Session-Registration"; +} + constexpr char kChallengeParamKey[] = "challenge"; constexpr char kPathParamKey[] = "path"; constexpr char kAuthCodeParamKey[] = "authorization"; +constexpr char kProviderKeyParamKey[] = "provider_key"; +constexpr char kProviderUrlParamKey[] = "provider_url"; +constexpr char kProviderSessionIdParamKey[] = "provider_session_id"; constexpr char kES256[] = "ES256"; constexpr char kRS256[] = "RS256"; @@ -54,11 +62,17 @@ RegistrationFetcherParam::RegistrationFetcherParam( GURL registration_endpoint, std::vector supported_algos, std::string challenge, - std::optional authorization) + std::optional authorization, + std::optional provider_key, + std::optional provider_url, + std::optional provider_session_id) : registration_endpoint_(std::move(registration_endpoint)), supported_algos_(std::move(supported_algos)), challenge_(std::move(challenge)), - authorization_(std::move(authorization)) {} + authorization_(std::move(authorization)), + provider_key_(std::move(provider_key)), + provider_url_(std::move(provider_url)), + provider_session_id_(std::move(provider_session_id)) {} std::optional RegistrationFetcherParam::ParseItem( const GURL& request_url, @@ -80,6 +94,9 @@ std::optional RegistrationFetcherParam::ParseItem( GURL registration_endpoint; std::string challenge; std::optional authorization; + std::optional provider_key; + std::optional provider_url; + std::optional provider_session_id; for (const auto& [key, value] : session_registration.params) { // The keys for the parameters are unique and must be lower case. // Quiche (https://quiche.googlesource.com/quiche), used here, @@ -88,7 +105,6 @@ std::optional RegistrationFetcherParam::ParseItem( if (!value.is_string()) { continue; } - // TODO(kristianm): Update this as same site requirements are solidified std::string unescaped_path = base::UnescapeURLComponent( value.GetString(), base::UnescapeRule::PATH_SEPARATORS | @@ -109,6 +125,12 @@ std::optional RegistrationFetcherParam::ParseItem( challenge = value.GetString(); } else if (key == kAuthCodeParamKey && value.is_string()) { authorization = value.GetString(); + } else if (key == kProviderKeyParamKey && value.is_string()) { + provider_key = value.GetString(); + } else if (key == kProviderUrlParamKey && value.is_string()) { + provider_url = GURL(value.GetString()); + } else if (key == kProviderSessionIdParamKey && value.is_string()) { + provider_session_id = Session::Id(value.GetString()); } // Other params are ignored @@ -118,9 +140,20 @@ std::optional RegistrationFetcherParam::ParseItem( return std::nullopt; } + if (provider_key.has_value() != provider_url.has_value() || + provider_key.has_value() != provider_session_id.has_value()) { + return std::nullopt; + } + + if (provider_url.has_value() && + (!provider_url->is_valid() || !IsSecure(*provider_url))) { + return std::nullopt; + } + return RegistrationFetcherParam( std::move(registration_endpoint), std::move(supported_algos), - std::move(challenge), std::move(authorization)); + std::move(challenge), std::move(authorization), std::move(provider_key), + std::move(provider_url), std::move(provider_session_id)); } std::vector RegistrationFetcherParam::CreateIfValid( @@ -135,7 +168,7 @@ std::vector RegistrationFetcherParam::CreateIfValid( return params; } std::optional header_value = - headers->GetNormalizedHeader(kRegistrationHeaderName); + headers->GetNormalizedHeader(GetRegistrationHeaderName()); if (!header_value) { return params; } @@ -164,10 +197,14 @@ RegistrationFetcherParam RegistrationFetcherParam::CreateInstanceForTesting( GURL registration_endpoint, std::vector supported_algos, std::string challenge, - std::optional authorization) { + std::optional authorization, + std::optional provider_key, + std::optional provider_url, + std::optional provider_session_id) { return RegistrationFetcherParam( std::move(registration_endpoint), std::move(supported_algos), - std::move(challenge), std::move(authorization)); + std::move(challenge), std::move(authorization), std::move(provider_key), + std::move(provider_url), std::move(provider_session_id)); } } // namespace net::device_bound_sessions diff --git a/naiveproxy/src/net/device_bound_sessions/registration_fetcher_param.h b/naiveproxy/src/net/device_bound_sessions/registration_fetcher_param.h index 6779ab8749..77c853a71e 100644 --- a/naiveproxy/src/net/device_bound_sessions/registration_fetcher_param.h +++ b/naiveproxy/src/net/device_bound_sessions/registration_fetcher_param.h @@ -11,13 +11,14 @@ #include "base/containers/span.h" #include "crypto/signature_verifier.h" #include "net/base/net_export.h" +#include "net/device_bound_sessions/session.h" #include "net/http/http_response_headers.h" #include "net/http/structured_headers.h" #include "url/gurl.h" namespace net::device_bound_sessions { -// Class to parse Sec-Session-Registration header. +// Class to parse Secure-Session-Registration header. // See explainer for details: // https://github.com/WICG/dbsc/blob/main/README.md#start-session // The header format for the session registration is a list of @@ -36,13 +37,12 @@ class NET_EXPORT RegistrationFetcherParam { RegistrationFetcherParam& operator=(const RegistrationFetcherParam&) = delete; ~RegistrationFetcherParam(); - // Checks `headers` for any Sec-Session-Registration headers. Parses any + // Checks `headers` for any Secure-Session-Registration headers. Parses any // valid ones that are found into `RegistrationFetcherParam` instances and // returns a vector of these. `request_url` corresponds to the request that // returned these headers; it is used to resolve any relative registration // endpoints in the response headers and to validate that the scheme is // appropriate. - // TODO(chlily): Get IsolationInfo from the request as well static std::vector CreateIfValid( const GURL& request_url, const HttpResponseHeaders* headers); @@ -53,7 +53,10 @@ class NET_EXPORT RegistrationFetcherParam { std::vector supported_algos, std::string challenge, - std::optional authorization); + std::optional authorization, + std::optional provider_key = std::nullopt, + std::optional provider_url = std::nullopt, + std::optional provider_session_id = std::nullopt); const GURL& registration_endpoint() const { return registration_endpoint_; } @@ -68,6 +71,16 @@ class NET_EXPORT RegistrationFetcherParam { return authorization_; } + const std::optional& provider_key() const { + return provider_key_; + } + + const std::optional& provider_url() const { return provider_url_; } + + const std::optional& provider_session_id() const { + return provider_session_id_; + } + GURL TakeRegistrationEndpoint() { return std::move(registration_endpoint_); } std::string TakeChallenge() { return std::move(challenge_); } @@ -82,18 +95,22 @@ class NET_EXPORT RegistrationFetcherParam { std::vector supported_algos, std::string challenge, - std::optional authorization); + std::optional authorization, + std::optional provider_key, + std::optional provider_url, + std::optional provider_session_id); static std::optional ParseItem( const GURL& request_url, const structured_headers::ParameterizedMember& session_registration); - // TODO(chlily): Store last-updated time and last-updated isolationinfo as - // needed. GURL registration_endpoint_; std::vector supported_algos_; std::string challenge_; std::optional authorization_; + std::optional provider_key_; + std::optional provider_url_; + std::optional provider_session_id_; }; } // namespace net::device_bound_sessions diff --git a/naiveproxy/src/net/device_bound_sessions/registration_result.cc b/naiveproxy/src/net/device_bound_sessions/registration_result.cc new file mode 100644 index 0000000000..a7243a6a69 --- /dev/null +++ b/naiveproxy/src/net/device_bound_sessions/registration_result.cc @@ -0,0 +1,62 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/device_bound_sessions/registration_result.h" + +#include "net/device_bound_sessions/session.h" + +namespace net::device_bound_sessions { + +RegistrationResult::RegistrationResult( + std::unique_ptr session, + CookieAndLineAccessResultList maybe_stored_cookies) + : storage_(std::move(session)), + maybe_stored_cookies_(std::move(maybe_stored_cookies)) {} +RegistrationResult::RegistrationResult( + NoSessionConfigChange no_change, + CookieAndLineAccessResultList maybe_stored_cookies) + : storage_(std::move(no_change)), + maybe_stored_cookies_(std::move(maybe_stored_cookies)) {} +RegistrationResult::RegistrationResult(SessionError error) + : storage_(std::move(error)) {} +RegistrationResult::RegistrationResult( + base::expected, SessionError> session_or_error) + : storage_( + session_or_error.has_value() + ? std::variant, + NoSessionConfigChange, + SessionError>(std::move(session_or_error).value()) + : std::move(session_or_error).error()) {} + +RegistrationResult::~RegistrationResult() = default; + +RegistrationResult::RegistrationResult(RegistrationResult&&) = default; +RegistrationResult& RegistrationResult::operator=(RegistrationResult&&) = + default; + +bool RegistrationResult::is_session() const { + return std::holds_alternative>(storage_); +} +bool RegistrationResult::is_no_session_config_change() const { + return std::holds_alternative(storage_); +} +bool RegistrationResult::is_error() const { + return std::holds_alternative(storage_); +} + +const Session& RegistrationResult::session() const { + return *std::get>(storage_); +} +const SessionError& RegistrationResult::error() const { + return std::get(storage_); +} + +std::unique_ptr RegistrationResult::TakeSession() { + return std::get>(std::move(storage_)); +} +SessionError RegistrationResult::TakeError() { + return std::get(std::move(storage_)); +} + +} // namespace net::device_bound_sessions diff --git a/naiveproxy/src/net/device_bound_sessions/registration_result.h b/naiveproxy/src/net/device_bound_sessions/registration_result.h new file mode 100644 index 0000000000..d91cd2baee --- /dev/null +++ b/naiveproxy/src/net/device_bound_sessions/registration_result.h @@ -0,0 +1,66 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_DEVICE_BOUND_SESSIONS_REGISTRATION_RESULT_H_ +#define NET_DEVICE_BOUND_SESSIONS_REGISTRATION_RESULT_H_ + +#include +#include + +#include "base/types/expected.h" +#include "net/base/net_export.h" +#include "net/cookies/canonical_cookie.h" +#include "net/device_bound_sessions/session_error.h" + +namespace net::device_bound_sessions { + +class Session; + +// This class represenets the outcome of a registration or refresh +// request. It's a convenience wrapper around a std::variant. +class NET_EXPORT RegistrationResult { + public: + // Trivial class used to indicate that no changes should be made to the + // session. + class NoSessionConfigChange {}; + + RegistrationResult(std::unique_ptr session, + CookieAndLineAccessResultList maybe_stored_cookies); + RegistrationResult(NoSessionConfigChange no_change, + CookieAndLineAccessResultList maybe_stored_cookies); + explicit RegistrationResult(SessionError session_error); + explicit RegistrationResult( + base::expected, SessionError> session_or_error); + + ~RegistrationResult(); + + RegistrationResult(const RegistrationResult&) = delete; + RegistrationResult& operator=(const RegistrationResult&) = delete; + + RegistrationResult(RegistrationResult&&); + RegistrationResult& operator=(RegistrationResult&&); + + bool is_session() const; + bool is_no_session_config_change() const; + bool is_error() const; + + const Session& session() const; + const SessionError& error() const; + + std::unique_ptr TakeSession(); + SessionError TakeError(); + + const CookieAndLineAccessResultList& maybe_stored_cookies() { + return maybe_stored_cookies_; + } + + private: + std::variant, NoSessionConfigChange, SessionError> + storage_; + CookieAndLineAccessResultList maybe_stored_cookies_; +}; + +} // namespace net::device_bound_sessions + +#endif // NET_DEVICE_BOUND_SESSIONS_REGISTRATION_RESULT_H_ diff --git a/naiveproxy/src/net/device_bound_sessions/session.cc b/naiveproxy/src/net/device_bound_sessions/session.cc index 21c3f467a5..9f4dddbf35 100644 --- a/naiveproxy/src/net/device_bound_sessions/session.cc +++ b/naiveproxy/src/net/device_bound_sessions/session.cc @@ -90,15 +90,9 @@ Session::~Session() = default; // static base::expected, SessionError> Session::CreateIfValid( const SessionParams& params) { + CHECK(!params.session_id.empty()); if (!params.fetcher_url.is_valid()) { - return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidFetcherUrl}); - } else if (params.refresh_url.empty()) { - return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidRefreshUrl}); - } else if (params.session_id.empty()) { - return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidSessionId}); + return base::unexpected(SessionError{SessionError::kInvalidFetcherUrl}); } // If there is an origin in the scope, verify it is valid. Default to the @@ -108,15 +102,26 @@ base::expected, SessionError> Session::CreateIfValid( : GURL(params.scope.origin); url::Origin scope_origin = url::Origin::Create(scope_origin_as_url); if (scope_origin.opaque()) { - return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidScopeOrigin}); + return base::unexpected(SessionError{SessionError::kInvalidScopeOrigin}); + } + + // If there is an origin in the scope, verify it has no path (including '/'). + if (features::kDeviceBoundSessionsOriginTrialFeedback.Get() && + !params.scope.origin.empty()) { + std::string_view origin_view = + base::TrimWhitespaceASCII(params.scope.origin, base::TRIM_ALL); + if ((scope_origin_as_url.has_path() && scope_origin_as_url.path() != "/") || + base::EndsWith(origin_view, "/")) { + return base::unexpected( + SessionError{SessionError::kScopeOriginContainsPath}); + } } // Check if the scope-origin is samesite with fetcher URL. if (net::SchemefulSite(scope_origin_as_url) != net::SchemefulSite(params.fetcher_url)) { return base::unexpected( - SessionError{SessionError::ErrorType::kScopeOriginSameSiteMismatch}); + SessionError{SessionError::kScopeOriginSameSiteMismatch}); } // The refresh endpoint can be a full URL (samesite with request origin) @@ -132,15 +137,14 @@ base::expected, SessionError> Session::CreateIfValid( // Check if the refresh URL is valid, secure. if (!candidate_refresh_endpoint.is_valid() || !IsSecure(candidate_refresh_endpoint)) { - return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidRefreshUrl}); + return base::unexpected(SessionError{SessionError::kInvalidRefreshUrl}); } // Check if the refresh URL is same-site with the fetcher URL. if (net::SchemefulSite(candidate_refresh_endpoint) != net::SchemefulSite(params.fetcher_url)) { return base::unexpected( - SessionError{SessionError::ErrorType::kRefreshUrlSameSiteMismatch}); + SessionError{SessionError::kRefreshUrlSameSiteMismatch}); } ASSIGN_OR_RETURN(SessionInclusionRules session_inclusion_rules, @@ -151,18 +155,12 @@ base::expected, SessionError> Session::CreateIfValid( candidate_refresh_endpoint)); for (const auto& cred : params.credentials) { - if (cred.name.empty()) { - return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidCredentials}); - } - - std::optional craving = CookieCraving::Create( + base::expected craving = CookieCraving::Create( params.fetcher_url, cred.name, cred.attributes, base::Time::Now()); - if (craving) { - session->cookie_cravings_.push_back(*craving); + if (craving.has_value()) { + session->cookie_cravings_.push_back(craving.value()); } else { - return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidCredentials}); + return base::unexpected(SessionError{std::move(craving.error())}); } } @@ -173,7 +171,7 @@ base::expected, SessionError> Session::CreateIfValid( for (const std::string& initiator : params.allowed_refresh_initiators) { if (!IsValidHostPattern(initiator)) { return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidRefreshInitiators}); + SessionError{SessionError::kRefreshInitiatorInvalidHostPattern}); } } session->set_allowed_refresh_initiators( @@ -265,13 +263,7 @@ proto::Session Session::ToProto() const { return session_proto; } -bool Session::ShouldDeferRequest( - URLRequest* request, - const net::FirstPartySetMetadata& first_party_set_metadata) const { - if (request->device_bound_session_usage() < SessionUsage::kNoUsage) { - request->set_device_bound_session_usage(SessionUsage::kNoUsage); - } - +bool Session::IsInScope(URLRequest* request) { if (!IncludesUrl(request->url())) { // Request is not in scope for this session. return false; @@ -302,8 +294,7 @@ bool Session::ShouldDeferRequest( return dict; }); - if (base::FeatureList::IsEnabled( - features::kDeviceBoundSessionsOriginTrialFeedback) && + if (features::kDeviceBoundSessionsOriginTrialFeedback.Get() && !AllowedToInitiateRefresh(request->initiator())) { request->net_log().AddEvent( net::NetLogEventType::CHECK_DBSC_REFRESH_REQUIRED, @@ -316,7 +307,13 @@ bool Session::ShouldDeferRequest( return false; } - // TODO(crbug.com/353766029): Refactor this. + return true; +} + +base::TimeDelta Session::MinimumBoundCookieLifetime( + URLRequest* request, + const FirstPartySetMetadata& first_party_set_metadata) { + // TODO(crbug.com/438783631): Refactor this. // The below is all copied from AddCookieHeaderAndStart. We should refactor // it. CookieStore* cookie_store = request->context()->cookie_store(); @@ -350,6 +347,8 @@ bool Session::ShouldDeferRequest( // The main logic. This checks every CookieCraving against every (real) // CanonicalCookie. + base::Time current_timestamp = base::Time::Now(); + base::TimeDelta minimum_remaining_lifetime = base::TimeDelta::Max(); for (const CookieCraving& cookie_craving : cookie_cravings_) { if (!cookie_craving.ShouldIncludeForRequest( request, first_party_set_metadata, options, params)) { @@ -371,10 +370,13 @@ bool Session::ShouldDeferRequest( // request is insecure, then the CookieCraving will be excluded, but the // CanonicalCookie will be included. DBSC only applies to secure context // but there might be similar cases. - // - // TODO: think about edge cases here... if (cookie_craving.IsSatisfiedBy(request_cookie.cookie)) { satisfied = true; + if (!request_cookie.cookie.ExpiryDate().is_null()) { + minimum_remaining_lifetime = + std::min(minimum_remaining_lifetime, + request_cookie.cookie.ExpiryDate() - current_timestamp); + } break; } } @@ -395,10 +397,14 @@ bool Session::ShouldDeferRequest( // There's an unsatisfied craving. Defer the request. request->set_device_bound_session_usage(SessionUsage::kDeferred); - return true; + return base::TimeDelta(); } } + last_proactive_refresh_opportunity_ = current_timestamp; + last_proactive_refresh_opportunity_minimum_cookie_lifetime_ = + minimum_remaining_lifetime; + request->net_log().AddEvent(net::NetLogEventType::CHECK_DBSC_REFRESH_REQUIRED, [&](NetLogCaptureMode capture_mode) { base::Value::Dict dict; @@ -408,7 +414,7 @@ bool Session::ShouldDeferRequest( }); // All cookiecravings satisfied. - return false; + return minimum_remaining_lifetime; } bool Session::IsEqualForTesting(const Session& other) const { @@ -462,7 +468,8 @@ bool Session::ShouldBackoff() const { return backoff_.ShouldRejectRequest(); } -void Session::InformOfRefreshResult(SessionError::ErrorType error_type) { +void Session::InformOfRefreshResult(bool was_proactive, + SessionError::ErrorType error_type) { using enum SessionError::ErrorType; switch (error_type) { @@ -475,7 +482,16 @@ void Session::InformOfRefreshResult(SessionError::ErrorType error_type) { case kServerRequestedTermination: case kInvalidConfigJson: case kInvalidSessionId: - case kInvalidCredentials: + case kInvalidCredentialsConfig: + case kInvalidCredentialsType: + case kInvalidCredentialsEmptyName: + case kInvalidCredentialsCookie: + case kInvalidCredentialsCookieCreationTime: + case kInvalidCredentialsCookieName: + case kInvalidCredentialsCookieParsing: + case kInvalidCredentialsCookieUnpermittedAttribute: + case kInvalidCredentialsCookieInvalidDomain: + case kInvalidCredentialsCookiePrefix: case kInvalidChallenge: case kTooManyChallenges: case kInvalidFetcherUrl: @@ -484,23 +500,124 @@ void Session::InformOfRefreshResult(SessionError::ErrorType error_type) { case kScopeOriginSameSiteMismatch: case kRefreshUrlSameSiteMismatch: case kInvalidScopeOrigin: + case kScopeOriginContainsPath: case kMismatchedSessionId: - case kInvalidRefreshInitiators: - case kInvalidScopeRule: + case kRefreshInitiatorNotString: + case kRefreshInitiatorInvalidHostPattern: + case kInvalidScopeRulePath: + case kInvalidScopeRuleHostPattern: + case kScopeRuleOriginScopedHostPatternMismatch: + case kScopeRuleSiteScopedHostPatternMismatch: + case kInvalidScopeSpecification: + case kMissingScopeSpecificationType: + case kEmptyScopeSpecificationDomain: + case kEmptyScopeSpecificationPath: + case kInvalidScopeSpecificationType: case kMissingScope: case kNoCredentials: case kInvalidScopeIncludeSite: + case kMissingScopeIncludeSite: + case kFederatedKeyThumbprintMismatch: + case kInvalidFederatedSessionUrl: + case kInvalidFederatedSessionProviderSessionMissing: + case kInvalidFederatedSessionWrongProviderOrigin: + case kInvalidFederatedKey: // We do not want to back off on many network connection errors // (e.g. internet disconnected), so we do not hit our maximum // backoff whenever the machine goes offline while the browser is - // running. + // running. Proxy errors (407) count as net errors. case kNetError: + case kProxyError: + break; + // There is no need to increment backoff because the signing quota + // prevents a network request. + case kSigningQuotaExceeded: break; case kTransientHttpError: + case kBoundCookieSetForbidden: backoff_.InformOfRequest(/*succeeded=*/false); break; + // Registration-only errors + case kSubdomainRegistrationWellKnownUnavailable: + case kSubdomainRegistrationUnauthorized: + case kSubdomainRegistrationWellKnownMalformed: + case kFederatedNotAuthorizedByProvider: + case kFederatedNotAuthorizedByRelyingParty: + case kSessionProviderWellKnownUnavailable: + case kSessionProviderWellKnownMalformed: + case kSessionProviderWellKnownHasProviderOrigin: + case kRelyingPartyWellKnownUnavailable: + case kRelyingPartyWellKnownMalformed: + case kRelyingPartyWellKnownHasRelyingOrigins: + case kTooManyRelyingOriginLabels: + case kEmptySessionConfig: + case kRegistrationAttemptedChallenge: + NOTREACHED(); + } + + if (error_type == kSuccess) { + attempted_proactive_refresh_since_last_success_ = false; + } + + if (was_proactive && error_type != kSuccess) { + attempted_proactive_refresh_since_last_success_ = true; } } +bool Session::CanSetBoundCookie( + const URLRequest& request, + const FirstPartySetMetadata& first_party_set_metadata) const { + // TODO(crbug.com/438783631): Refactor this. + // The below is all copied from + // UrlRequestHttpJob::SaveCookiesAndNotifyHeadersComplete. We should refactor + // it. + CookieStore* cookie_store = request.context()->cookie_store(); + if ((request.load_flags() & LOAD_DO_NOT_SAVE_COOKIES) || !cookie_store) { + return false; + } + + bool force_ignore_site_for_cookies = request.force_ignore_site_for_cookies(); + if (cookie_store->cookie_access_delegate() && + cookie_store->cookie_access_delegate()->ShouldIgnoreSameSiteRestrictions( + request.url(), request.site_for_cookies())) { + force_ignore_site_for_cookies = true; + } + bool is_main_frame_navigation = + IsolationInfo::RequestType::kMainFrame == + request.isolation_info().request_type() || + request.force_main_frame_for_same_site_cookies(); + CookieOptions::SameSiteCookieContext same_site_context = + cookie_util::ComputeSameSiteContextForResponse( + request.url_chain(), request.site_for_cookies(), request.initiator(), + is_main_frame_navigation, force_ignore_site_for_cookies); + + CookieOptions options; + options.set_return_excluded_cookies(); + options.set_include_httponly(); + options.set_same_site_cookie_context(same_site_context); + + for (const CookieCraving& cookie_craving : cookie_cravings_) { + if (cookie_craving.CanSetBoundCookie(request, first_party_set_metadata, + &options)) { + return true; + } + } + + return false; +} + +std::optional Session::TakeLastProactiveRefreshOpportunity() { + std::optional time = last_proactive_refresh_opportunity_; + last_proactive_refresh_opportunity_.reset(); + return time; +} +std::optional +Session::TakeLastProactiveRefreshOpportunityMinimumCookieLifetime() { + std::optional time_delta = + last_proactive_refresh_opportunity_minimum_cookie_lifetime_; + last_proactive_refresh_opportunity_minimum_cookie_lifetime_.reset(); + return time_delta; +} + } // namespace net::device_bound_sessions diff --git a/naiveproxy/src/net/device_bound_sessions/session.h b/naiveproxy/src/net/device_bound_sessions/session.h index 47a31e00bd..23efec0b53 100644 --- a/naiveproxy/src/net/device_bound_sessions/session.h +++ b/naiveproxy/src/net/device_bound_sessions/session.h @@ -61,9 +61,16 @@ class NET_EXPORT Session { const KeyIdOrError& unexportable_key_id() const { return key_id_or_error_; } - bool ShouldDeferRequest( + // Return whether `request` is in-scope for this session. + bool IsInScope(URLRequest* request); + + // Returns the minimum remaining lifetime over all the bound cookies + // on `request`. If any cookie is missing, the lifetime will be + // zero. If no cookies would be included on the request, the lifetime + // will be `base::TimeDelta::Max()` + base::TimeDelta MinimumBoundCookieLifetime( URLRequest* request, - const FirstPartySetMetadata& first_party_set_metadata) const; + const FirstPartySetMetadata& first_party_set_metadata); const Id& id() const { return id_; } @@ -81,6 +88,10 @@ class NET_EXPORT Session { const std::vector& cookies() const { return cookie_cravings_; } + bool attempted_proactive_refresh_since_last_success() const { + return attempted_proactive_refresh_since_last_success_; + } + bool IsEqualForTesting(const Session& other) const; void set_cached_challenge(std::string challenge) { @@ -107,8 +118,16 @@ class NET_EXPORT Session { bool ShouldBackoff() const; // Inform the session about a refresh so it can decide whether to - // enter backoff mode. - void InformOfRefreshResult(SessionError::ErrorType error_type); + // ignore future opportunities to refresh. + void InformOfRefreshResult(bool was_proactive, + SessionError::ErrorType error_type); + + // Returns whether `request` would be allowed to set any bound + // cookies. This is a prerequisite for certain kinds of changes to + // session config. + bool CanSetBoundCookie( + const URLRequest& request, + const FirstPartySetMetadata& first_party_set_metadata) const; const url::Origin& origin() const { return inclusion_rules_.origin(); } @@ -121,6 +140,11 @@ class NET_EXPORT Session { allowed_refresh_initiators_ = std::move(allowed_refresh_initiators); } + std::optional TakeLastProactiveRefreshOpportunity(); + + std::optional + TakeLastProactiveRefreshOpportunityMinimumCookieLifetime(); + private: Session(Id id, SessionInclusionRules inclusion_rules, GURL refresh); Session(Id id, @@ -173,6 +197,14 @@ class NET_EXPORT Session { net::BackoffEntry backoff_; // Host patterns for initiators allowed to trigger a refresh. std::vector allowed_refresh_initiators_; + + // Used for histogram logging related to the value of proactive + // refresh. + std::optional last_proactive_refresh_opportunity_; + std::optional + last_proactive_refresh_opportunity_minimum_cookie_lifetime_; + + bool attempted_proactive_refresh_since_last_success_ = false; }; } // namespace net::device_bound_sessions diff --git a/naiveproxy/src/net/device_bound_sessions/session_binding_utils.cc b/naiveproxy/src/net/device_bound_sessions/session_binding_utils.cc index c31ef97be6..8bc264bcdb 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_binding_utils.cc +++ b/naiveproxy/src/net/device_bound_sessions/session_binding_utils.cc @@ -15,6 +15,8 @@ #include "base/strings/string_view_util.h" #include "base/time/time.h" #include "base/values.h" +#include "crypto/ecdsa_utils.h" +#include "crypto/keypair.h" #include "crypto/sha2.h" #include "crypto/signature_verifier.h" #include "net/base/url_util.h" @@ -50,12 +52,9 @@ std::string Base64UrlEncode(std::string_view data) { return output; } -std::optional CreateHeaderAndPayloadWithCustomPayload( - crypto::SignatureVerifier::SignatureAlgorithm algorithm, +std::optional CombineHeaderAndPayload( + const base::Value::Dict& header, const base::Value::Dict& payload) { - auto header = base::Value::Dict() - .Set("alg", SignatureAlgorithmToString(algorithm)) - .Set("typ", "dbsc+jwt"); std::optional header_serialized = base::WriteJson(header); if (!header_serialized) { DVLOG(1) << "Unexpected JSONWriter error while serializing a registration " @@ -75,33 +74,31 @@ std::optional CreateHeaderAndPayloadWithCustomPayload( Base64UrlEncode(*payload_serialized)}); } -std::optional> ConvertDERSignatureToRaw( - base::span der_signature) { - bssl::UniquePtr ecdsa_sig( - ECDSA_SIG_from_bytes(der_signature.data(), der_signature.size())); - if (!ecdsa_sig) { - DVLOG(1) << "Failed to create ECDSA_SIG"; - return std::nullopt; +// Helper function for the shared functionality of refresh and +// registration JWTs. +std::optional CreateHeaderAndPayload( + std::string_view challenge, + crypto::SignatureVerifier::SignatureAlgorithm algorithm, + std::optional jwk, + const std::optional& authorization) { + auto header = base::Value::Dict() + .Set("alg", SignatureAlgorithmToString(algorithm)) + .Set("typ", "dbsc+jwt"); + if (jwk.has_value()) { + header.Set("jwk", std::move(*jwk)); } - // TODO(b/301888680): this implicitly depends on a curve used by - // `crypto::UnexportableKey`. Make this dependency more explicit. - const size_t kMaxBytesPerBN = 32; - std::vector jwt_signature(2 * kMaxBytesPerBN); - - if (!BN_bn2bin_padded(&jwt_signature[0], kMaxBytesPerBN, ecdsa_sig->r) || - !BN_bn2bin_padded(&jwt_signature[kMaxBytesPerBN], kMaxBytesPerBN, - ecdsa_sig->s)) { - DVLOG(1) << "Failed to serialize R and S to " << kMaxBytesPerBN << " bytes"; - return std::nullopt; + auto payload = base::Value::Dict().Set("jti", challenge); + if (authorization.has_value()) { + payload.Set("authorization", authorization.value()); } - return jwt_signature; + return CombineHeaderAndPayload(header, payload); } } // namespace -std::optional CreateKeyRegistrationHeaderAndPayload( +std::optional CreateLegacyKeyRegistrationHeaderAndPayload( std::string_view challenge, const GURL& registration_url, crypto::SignatureVerifier::SignatureAlgorithm algorithm, @@ -115,6 +112,9 @@ std::optional CreateKeyRegistrationHeaderAndPayload( return std::nullopt; } + auto header = base::Value::Dict() + .Set("alg", SignatureAlgorithmToString(algorithm)) + .Set("typ", "dbsc+jwt"); auto payload = base::Value::Dict() .Set("aud", registration_url.spec()) @@ -132,16 +132,45 @@ std::optional CreateKeyRegistrationHeaderAndPayload( if (session_id.has_value()) { payload.Set("sub", session_id.value()); } - return CreateHeaderAndPayloadWithCustomPayload(algorithm, payload); + return CombineHeaderAndPayload(header, payload); +} + +std::optional CreateKeyRegistrationHeaderAndPayload( + std::string_view challenge, + crypto::SignatureVerifier::SignatureAlgorithm algorithm, + base::span pubkey_spki, + std::optional authorization) { + base::Value::Dict jwk = ConvertPkeySpkiToJwk(algorithm, pubkey_spki); + if (jwk.empty()) { + DVLOG(1) << "Unexpected error when converting the SPKI to a JWK"; + return std::nullopt; + } + + return CreateHeaderAndPayload(challenge, algorithm, std::move(jwk), + std::move(authorization)); +} + +std::optional CreateKeyRefreshHeaderAndPayload( + std::string_view challenge, + crypto::SignatureVerifier::SignatureAlgorithm algorithm) { + return CreateHeaderAndPayload(challenge, algorithm, /*jwk=*/std::nullopt, + /*authorization=*/std::nullopt); } std::optional AppendSignatureToHeaderAndPayload( std::string_view header_and_payload, crypto::SignatureVerifier::SignatureAlgorithm algorithm, + base::span pubkey_spki, base::span signature) { std::optional> signature_holder; if (algorithm == crypto::SignatureVerifier::ECDSA_SHA256) { - signature_holder = ConvertDERSignatureToRaw(signature); + std::optional public_key = + crypto::keypair::PublicKey::FromSubjectPublicKeyInfo(pubkey_spki); + if (!public_key.has_value()) { + return std::nullopt; + } + signature_holder = + crypto::ConvertEcdsaDerSignatureToRaw(*public_key, signature); if (!signature_holder.has_value()) { return std::nullopt; } diff --git a/naiveproxy/src/net/device_bound_sessions/session_binding_utils.h b/naiveproxy/src/net/device_bound_sessions/session_binding_utils.h index 87d0add0aa..3780d84659 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_binding_utils.h +++ b/naiveproxy/src/net/device_bound_sessions/session_binding_utils.h @@ -21,8 +21,11 @@ class Time; namespace net::device_bound_sessions { -// Creates header and payload parts of a registration JWT. -std::optional NET_EXPORT CreateKeyRegistrationHeaderAndPayload( +// Creates header and payload parts of a legacy JWT before the feedback +// from our first Origin Trial. +// TODO(crbug.com/447104530): Remove support for this JWT schema. +std::optional NET_EXPORT +CreateLegacyKeyRegistrationHeaderAndPayload( std::string_view challenge, const GURL& registration_url, crypto::SignatureVerifier::SignatureAlgorithm algorithm, @@ -31,11 +34,24 @@ std::optional NET_EXPORT CreateKeyRegistrationHeaderAndPayload( std::optional authorization, std::optional session_identifier); +// Creates header and payload parts of a registration JWT. +std::optional NET_EXPORT CreateKeyRegistrationHeaderAndPayload( + std::string_view challenge, + crypto::SignatureVerifier::SignatureAlgorithm algorithm, + base::span pubkey_spki, + std::optional authorization); + +// Creates header and payload parts of a refresh JWT. +std::optional NET_EXPORT CreateKeyRefreshHeaderAndPayload( + std::string_view challenge, + crypto::SignatureVerifier::SignatureAlgorithm algorithm); + // Appends `signature` generated by `algorithm` to provided `header_and_payload` // to form a complete JWT. std::optional NET_EXPORT AppendSignatureToHeaderAndPayload( std::string_view header_and_payload, crypto::SignatureVerifier::SignatureAlgorithm algorithm, + base::span pubkey_spki, base::span signature); // Returns true if `url`'s scheme is cryptographic or if it's localhost. This diff --git a/naiveproxy/src/net/device_bound_sessions/session_challenge_param.cc b/naiveproxy/src/net/device_bound_sessions/session_challenge_param.cc index 3da57e4728..f61ba283a3 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_challenge_param.cc +++ b/naiveproxy/src/net/device_bound_sessions/session_challenge_param.cc @@ -6,13 +6,19 @@ #include +#include "net/base/features.h" #include "net/http/http_response_headers.h" #include "url/gurl.h" namespace { -// Sec-Session-Challenge header defined in +// Secure-Session-Challenge header defined in // https://github.com/WICG/dbsc/blob/main/README.md#high-level-overview -constexpr char kSessionChallengeHeaderName[] = "Sec-Session-Challenge"; +const char* GetSessionChallengeHeaderName() { + return net::features::kDeviceBoundSessionsOriginTrialFeedback.Get() + ? "Secure-Session-Challenge" + : "Sec-Session-Challenge"; +} + constexpr char kSessionIdKey[] = "id"; } // namespace @@ -81,7 +87,7 @@ std::vector SessionChallengeParam::CreateIfValid( return params; } std::optional header_value = - headers->GetNormalizedHeader(kSessionChallengeHeaderName); + headers->GetNormalizedHeader(GetSessionChallengeHeaderName()); if (!header_value) { return params; } diff --git a/naiveproxy/src/net/device_bound_sessions/session_challenge_param.h b/naiveproxy/src/net/device_bound_sessions/session_challenge_param.h index f5614a7217..81d965031a 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_challenge_param.h +++ b/naiveproxy/src/net/device_bound_sessions/session_challenge_param.h @@ -20,17 +20,17 @@ class HttpResponseHeaders; namespace net::device_bound_sessions { -// Class to parse Sec-Session-Challenge header. +// Class to parse Secure-Session-Challenge header. // See explainer for details: // https://github.com/WICG/dbsc/blob/main/README.md. // It is a RFC 8941 list of challenges for the associated DBSC sessions. // Example: -// Sec-Session-Challenge: "challenge";id="session_id". -// Sec-Session-Challenge: "challenge";id="session_id", "challenge1";id="id1". +// Secure-Session-Challenge: "challenge";id="session_id". +// Secure-Session-Challenge: "challenge";id="session_id", "challenge1";id="id1". // The session id may be unknown during the session registration, hence it can // be omitted: -// Sec-Session-Challenge: "challenge". -// It is possible to have multiple Sec-Session-Challenge headers in +// Secure-Session-Challenge: "challenge". +// It is possible to have multiple Secure-Session-Challenge headers in // one response. If multiple challenges are given for one specific session, // the last one will take effect. class NET_EXPORT SessionChallengeParam { @@ -42,7 +42,7 @@ class NET_EXPORT SessionChallengeParam { // Returns a vector of valid instances from the headers. - // Checks `headers` for any Sec-Session-Challenge headers. Parses any valid + // Checks `headers` for any Secure-Session-Challenge headers. Parses any valid // ones that are found into `SessionChallengeParam` instances and returns a // vector of these. `request_url` corresponds to the request that returned // these headers; it is used only to affirm that that URL is valid. diff --git a/naiveproxy/src/net/device_bound_sessions/session_error.cc b/naiveproxy/src/net/device_bound_sessions/session_error.cc index 82b09b9197..e3ac71dbfd 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_error.cc +++ b/naiveproxy/src/net/device_bound_sessions/session_error.cc @@ -4,6 +4,8 @@ #include "net/device_bound_sessions/session_error.h" +#include "base/notreached.h" + namespace net::device_bound_sessions { SessionError::SessionError(SessionError::ErrorType type) : type(type) {} @@ -13,53 +15,105 @@ SessionError::~SessionError() = default; SessionError::SessionError(SessionError&&) noexcept = default; SessionError& SessionError::operator=(SessionError&&) noexcept = default; -bool SessionError::IsFatal() const { - using enum ErrorType; - +std::optional SessionError::GetDeletionReason() const { switch (type) { case kSuccess: - return false; + return std::nullopt; + case kServerRequestedTermination: + return DeletionReason::kServerRequested; case kKeyError: case kSigningError: - case kServerRequestedTermination: - case kInvalidConfigJson: - case kInvalidSessionId: - case kInvalidCredentials: + case kPersistentHttpError: case kInvalidChallenge: case kTooManyChallenges: + return DeletionReason::kRefreshFatalError; + case kInvalidConfigJson: + case kInvalidSessionId: + case kInvalidCredentialsConfig: + case kInvalidCredentialsType: + case kInvalidCredentialsEmptyName: + case kInvalidCredentialsCookie: + case kInvalidCredentialsCookieCreationTime: + case kInvalidCredentialsCookieName: + case kInvalidCredentialsCookieParsing: + case kInvalidCredentialsCookieUnpermittedAttribute: + case kInvalidCredentialsCookieInvalidDomain: + case kInvalidCredentialsCookiePrefix: case kInvalidFetcherUrl: case kInvalidRefreshUrl: - case kPersistentHttpError: case kScopeOriginSameSiteMismatch: case kRefreshUrlSameSiteMismatch: case kInvalidScopeOrigin: + case kScopeOriginContainsPath: case kMismatchedSessionId: - case kInvalidRefreshInitiators: - case kInvalidScopeRule: + case kRefreshInitiatorNotString: + case kRefreshInitiatorInvalidHostPattern: + case kInvalidScopeRulePath: + case kInvalidScopeRuleHostPattern: + case kScopeRuleOriginScopedHostPatternMismatch: + case kScopeRuleSiteScopedHostPatternMismatch: + case kInvalidScopeSpecification: + case kMissingScopeSpecificationType: + case kEmptyScopeSpecificationDomain: + case kEmptyScopeSpecificationPath: + case kInvalidScopeSpecificationType: case kMissingScope: case kNoCredentials: case kInvalidScopeIncludeSite: - return true; - + case kMissingScopeIncludeSite: + return DeletionReason::kInvalidSessionParams; case kNetError: + case kProxyError: case kTransientHttpError: - return false; + case kBoundCookieSetForbidden: + case kSigningQuotaExceeded: + return std::nullopt; + // Registration-only errors never trigger session deletion. + case kSubdomainRegistrationWellKnownUnavailable: + case kSubdomainRegistrationUnauthorized: + case kSubdomainRegistrationWellKnownMalformed: + case kFederatedNotAuthorizedByProvider: + case kFederatedNotAuthorizedByRelyingParty: + case kSessionProviderWellKnownUnavailable: + case kSessionProviderWellKnownMalformed: + case kSessionProviderWellKnownHasProviderOrigin: + case kRelyingPartyWellKnownUnavailable: + case kRelyingPartyWellKnownMalformed: + case kRelyingPartyWellKnownHasRelyingOrigins: + case kFederatedKeyThumbprintMismatch: + case kInvalidFederatedSessionUrl: + case kInvalidFederatedSessionProviderSessionMissing: + case kInvalidFederatedSessionWrongProviderOrigin: + case kInvalidFederatedKey: + case kTooManyRelyingOriginLabels: + case kEmptySessionConfig: + case kRegistrationAttemptedChallenge: + NOTREACHED(); } } bool SessionError::IsServerError() const { - using enum ErrorType; - switch (type) { case kSuccess: case kKeyError: case kSigningError: case kNetError: + case kProxyError: + case kSigningQuotaExceeded: return false; case kServerRequestedTermination: case kInvalidConfigJson: case kInvalidSessionId: - case kInvalidCredentials: + case kInvalidCredentialsConfig: + case kInvalidCredentialsType: + case kInvalidCredentialsEmptyName: + case kInvalidCredentialsCookie: + case kInvalidCredentialsCookieCreationTime: + case kInvalidCredentialsCookieName: + case kInvalidCredentialsCookieParsing: + case kInvalidCredentialsCookieUnpermittedAttribute: + case kInvalidCredentialsCookieInvalidDomain: + case kInvalidCredentialsCookiePrefix: case kInvalidChallenge: case kTooManyChallenges: case kInvalidFetcherUrl: @@ -68,14 +122,47 @@ bool SessionError::IsServerError() const { case kScopeOriginSameSiteMismatch: case kRefreshUrlSameSiteMismatch: case kInvalidScopeOrigin: + case kScopeOriginContainsPath: case kTransientHttpError: case kMismatchedSessionId: - case kInvalidRefreshInitiators: - case kInvalidScopeRule: + case kRefreshInitiatorNotString: + case kRefreshInitiatorInvalidHostPattern: + case kInvalidScopeRulePath: + case kInvalidScopeRuleHostPattern: + case kScopeRuleOriginScopedHostPatternMismatch: + case kScopeRuleSiteScopedHostPatternMismatch: + case kInvalidScopeSpecification: + case kMissingScopeSpecificationType: + case kEmptyScopeSpecificationDomain: + case kEmptyScopeSpecificationPath: + case kInvalidScopeSpecificationType: case kMissingScope: case kNoCredentials: case kInvalidScopeIncludeSite: + case kMissingScopeIncludeSite: + case kBoundCookieSetForbidden: return true; + // Registration-only errors never get reported to the server. + case kSubdomainRegistrationWellKnownUnavailable: + case kSubdomainRegistrationUnauthorized: + case kSubdomainRegistrationWellKnownMalformed: + case kFederatedNotAuthorizedByProvider: + case kFederatedNotAuthorizedByRelyingParty: + case kSessionProviderWellKnownUnavailable: + case kSessionProviderWellKnownMalformed: + case kSessionProviderWellKnownHasProviderOrigin: + case kRelyingPartyWellKnownUnavailable: + case kRelyingPartyWellKnownMalformed: + case kRelyingPartyWellKnownHasRelyingOrigins: + case kFederatedKeyThumbprintMismatch: + case kInvalidFederatedSessionUrl: + case kInvalidFederatedSessionProviderSessionMissing: + case kInvalidFederatedSessionWrongProviderOrigin: + case kInvalidFederatedKey: + case kTooManyRelyingOriginLabels: + case kEmptySessionConfig: + case kRegistrationAttemptedChallenge: + NOTREACHED(); } } diff --git a/naiveproxy/src/net/device_bound_sessions/session_error.h b/naiveproxy/src/net/device_bound_sessions/session_error.h index 7cc6b129d3..c59c10458c 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_error.h +++ b/naiveproxy/src/net/device_bound_sessions/session_error.h @@ -6,6 +6,7 @@ #define NET_DEVICE_BOUND_SESSIONS_SESSION_ERROR_H_ #include "net/base/schemeful_site.h" +#include "net/device_bound_sessions/deletion_reason.h" namespace net::device_bound_sessions { @@ -18,31 +19,87 @@ struct NET_EXPORT SessionError { // this error type. kKeyError = 1, kSigningError = 2, - kNetError = 3, + // Deprecated: kNetError = 3, // Deprecated: kHttpError = 4, kServerRequestedTermination = 5, - kInvalidConfigJson = 6, + // Deprecated: kInvalidConfigJson = 6, kInvalidSessionId = 7, - kInvalidCredentials = 8, + // Deprecated: kInvalidCredentials = 8, kInvalidChallenge = 9, kTooManyChallenges = 10, kInvalidFetcherUrl = 11, kInvalidRefreshUrl = 12, kTransientHttpError = 13, - kPersistentHttpError = 14, + // Deprecated: kPersistentHttpError = 14, kScopeOriginSameSiteMismatch = 15, kRefreshUrlSameSiteMismatch = 16, - kInvalidScopeOrigin = 17, + // Deprecated: kInvalidScopeOrigin = 17, kMismatchedSessionId = 18, - kInvalidRefreshInitiators = 19, - kInvalidScopeRule = 20, + // Deprecated: kInvalidRefreshInitiators = 19, + // Deprecated: kInvalidScopeRule = 20, kMissingScope = 21, kNoCredentials = 22, - kInvalidScopeIncludeSite = 23, - kMaxValue = kInvalidScopeIncludeSite + // Deprecated: kInvalidScopeIncludeSite = 23, + kSubdomainRegistrationWellKnownUnavailable = 24, + kSubdomainRegistrationUnauthorized = 25, + kSubdomainRegistrationWellKnownMalformed = 26, + // Deprecated: kFederatedNotAuthorized = 27, + kSessionProviderWellKnownUnavailable = 28, + // Deprecated: kSessionProviderWellKnownMalformed = 29, + kRelyingPartyWellKnownUnavailable = 30, + // Deprecated: kRelyingPartyWellKnownMalformed = 31, + kFederatedKeyThumbprintMismatch = 32, + kInvalidFederatedSessionUrl = 33, + // Deprecated: kInvalidFederatedSession = 34, + kInvalidFederatedKey = 35, + kTooManyRelyingOriginLabels = 36, + kBoundCookieSetForbidden = 37, + kNetError = 38, + kProxyError = 39, + kInvalidConfigJson = 40, + kEmptySessionConfig = 41, + kInvalidCredentialsConfig = 42, + kInvalidCredentialsType = 43, + kInvalidCredentialsEmptyName = 44, + kInvalidCredentialsCookie = 45, + kPersistentHttpError = 46, + kRegistrationAttemptedChallenge = 47, + kInvalidScopeOrigin = 48, + kScopeOriginContainsPath = 49, + kRefreshInitiatorNotString = 50, + kRefreshInitiatorInvalidHostPattern = 51, + kInvalidScopeSpecification = 52, + kMissingScopeSpecificationType = 53, + kEmptyScopeSpecificationDomain = 54, + kEmptyScopeSpecificationPath = 55, + kInvalidScopeSpecificationType = 56, + kInvalidScopeIncludeSite = 57, + kMissingScopeIncludeSite = 58, + kFederatedNotAuthorizedByProvider = 59, + kFederatedNotAuthorizedByRelyingParty = 60, + kSessionProviderWellKnownMalformed = 61, + kSessionProviderWellKnownHasProviderOrigin = 62, + kRelyingPartyWellKnownMalformed = 63, + kRelyingPartyWellKnownHasRelyingOrigins = 64, + kInvalidFederatedSessionProviderSessionMissing = 65, + kInvalidFederatedSessionWrongProviderOrigin = 66, + kInvalidCredentialsCookieCreationTime = 67, + kInvalidCredentialsCookieName = 68, + kInvalidCredentialsCookieParsing = 69, + kInvalidCredentialsCookieUnpermittedAttribute = 70, + kInvalidCredentialsCookieInvalidDomain = 71, + kInvalidCredentialsCookiePrefix = 72, + kInvalidScopeRulePath = 73, + kInvalidScopeRuleHostPattern = 74, + kScopeRuleOriginScopedHostPatternMismatch = 75, + kScopeRuleSiteScopedHostPatternMismatch = 76, + kSigningQuotaExceeded = 77, + kMaxValue = kSigningQuotaExceeded, }; // LINT.ThenChange(//tools/metrics/histograms/metadata/net/enums.xml:DeviceBoundSessionError) + using enum ErrorType; + explicit SessionError(ErrorType type); ~SessionError(); @@ -52,7 +109,9 @@ struct NET_EXPORT SessionError { SessionError(SessionError&&) noexcept; SessionError& operator=(SessionError&&) noexcept; - bool IsFatal() const; + // If the error is non-fatal, returns `std::nullopt`. Otherwise + // returns the reason for deleting the session. + std::optional GetDeletionReason() const; // Whether the error is due to server-side behavior. bool IsServerError() const; diff --git a/naiveproxy/src/net/device_bound_sessions/session_inclusion_rules.cc b/naiveproxy/src/net/device_bound_sessions/session_inclusion_rules.cc index 62bd66662b..72e84719e0 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_inclusion_rules.cc +++ b/naiveproxy/src/net/device_bound_sessions/session_inclusion_rules.cc @@ -15,6 +15,7 @@ #include "net/device_bound_sessions/host_patterns.h" #include "net/device_bound_sessions/proto/storage.pb.h" #include "net/device_bound_sessions/session.h" +#include "net/device_bound_sessions/session_error.h" namespace net::device_bound_sessions { @@ -97,7 +98,7 @@ SessionInclusionRules::Create(const url::Origin& origin, if (scope_params.include_site && !rules.may_include_site_) { return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidScopeIncludeSite}); + SessionError{SessionError::kInvalidScopeIncludeSite}); } rules.SetIncludeSite(scope_params.include_site); @@ -107,9 +108,10 @@ SessionInclusionRules::Create(const url::Origin& origin, spec.type == SessionParams::Scope::Specification::Type::kExclude ? SessionInclusionRules::InclusionResult::kExclude : SessionInclusionRules::InclusionResult::kInclude; - if (!rules.AddUrlRuleIfValid(inclusion_result, spec.domain, spec.path)) { - return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidScopeRule}); + SessionError::ErrorType add_url_rule_result = + rules.AddUrlRuleIfValid(inclusion_result, spec.domain, spec.path); + if (add_url_rule_result != SessionError::kSuccess) { + return base::unexpected(SessionError{add_url_rule_result}); } } @@ -119,7 +121,8 @@ SessionInclusionRules::Create(const url::Origin& origin, // don't return an error if the rule is not valid or add a CHECK, because a // refresh URL is allowed to be outside an origin-scoped session. rules.AddUrlRuleIfValid(SessionInclusionRules::InclusionResult::kExclude, - refresh_endpoint.host(), refresh_endpoint.path()); + refresh_endpoint.GetHost(), + refresh_endpoint.GetPath()); } return rules; @@ -148,21 +151,22 @@ void SessionInclusionRules::SetIncludeSite(bool include_site) { include_site_ = SchemefulSite(origin_); } -bool SessionInclusionRules::AddUrlRuleIfValid(InclusionResult rule_type, - const std::string& host_pattern, - const std::string& path_prefix) { +SessionError::ErrorType SessionInclusionRules::AddUrlRuleIfValid( + InclusionResult rule_type, + const std::string& host_pattern, + const std::string& path_prefix) { if (path_prefix.empty() || path_prefix.front() != '/') { - return false; + return SessionError::kInvalidScopeRulePath; } if (!IsValidHostPattern(host_pattern)) { - return false; + return SessionError::kInvalidScopeRuleHostPattern; } // Return early if the rule can't match anything. For origin-scoped // sessions, the origin must match the host pattern. if (!include_site_ && !MatchesHostPattern(host_pattern, origin_.host())) { - return false; + return SessionError::kScopeRuleOriginScopedHostPatternMismatch; } // For site-scoped sessions, either the site itself matches the @@ -184,12 +188,12 @@ bool SessionInclusionRules::AddUrlRuleIfValid(InclusionResult rule_type, origin_, registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); if (hostlike_part_domain != domain_and_registry) { - return false; + return SessionError::kScopeRuleSiteScopedHostPatternMismatch; } } url_rules_.emplace_back(rule_type, host_pattern, path_prefix); - return true; + return SessionError::kSuccess; } SessionInclusionRules::InclusionResult @@ -209,8 +213,7 @@ SessionInclusionRules::EvaluateRequestUrl(const GURL& url) const { // port here, because in the !may_include_site_ case that's already covered // by being same-origin, and in the may_include_site_ case it's ok for the // port to differ. - if (rule.MatchesHostAndPath(url) && - url.scheme_piece() == origin_.scheme()) { + if (rule.MatchesHostAndPath(url) && url.scheme() == origin_.scheme()) { return rule.rule_type; } } @@ -232,11 +235,11 @@ bool SessionInclusionRules::AllowsRefreshForInitiator( } bool SessionInclusionRules::UrlRule::MatchesHostAndPath(const GURL& url) const { - if (!MatchesHostPattern(host_pattern, url.host())) { + if (!MatchesHostPattern(host_pattern, url.GetHost())) { return false; } - std::string_view url_path = url.path_piece(); + std::string_view url_path = url.path(); if (!url_path.starts_with(path_prefix)) { return false; } diff --git a/naiveproxy/src/net/device_bound_sessions/session_inclusion_rules.h b/naiveproxy/src/net/device_bound_sessions/session_inclusion_rules.h index 4fef4d74bc..9ff305ffca 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_inclusion_rules.h +++ b/naiveproxy/src/net/device_bound_sessions/session_inclusion_rules.h @@ -121,10 +121,11 @@ class NET_EXPORT SessionInclusionRules final { // wildcards, and will match paths that start with the same path // components. // - // Returns whether the specified rule was added. - bool AddUrlRuleIfValid(InclusionResult rule_type, - const std::string& host_pattern, - const std::string& path_prefix); + // If the specified rule was added, returns kSuccess. Otherwise, returns the + // error that prevented the rule from being added. + SessionError::ErrorType AddUrlRuleIfValid(InclusionResult rule_type, + const std::string& host_pattern, + const std::string& path_prefix); // The origin that created/set the session that this applies to. By default, // sessions are origin-scoped unless specified otherwise. diff --git a/naiveproxy/src/net/device_bound_sessions/session_json_utils.cc b/naiveproxy/src/net/device_bound_sessions/session_json_utils.cc index 556dc37525..905a66c722 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_json_utils.cc +++ b/naiveproxy/src/net/device_bound_sessions/session_json_utils.cc @@ -4,19 +4,40 @@ #include "net/device_bound_sessions/session_json_utils.h" +#include "base/feature_list.h" #include "base/json/json_reader.h" #include "base/types/expected_macros.h" +#include "net/base/features.h" namespace net::device_bound_sessions { namespace { +std::string FindStringWithDefault(const base::Value::Dict& dict, + std::string_view key, + std::string_view default_value) { + const std::string* value = dict.FindString(key); + if (value) { + return *value; + } + + return std::string(default_value); +} + base::expected ParseScope( const base::Value::Dict& scope_dict) { SessionParams::Scope scope; std::optional include_site = scope_dict.FindBool("include_site"); - scope.include_site = include_site.value_or(false); + if (features::kDeviceBoundSessionsOriginTrialFeedback.Get()) { + if (!include_site.has_value()) { + return base::unexpected{ + SessionError{SessionError::kMissingScopeIncludeSite}}; + } + scope.include_site = *include_site; + } else { + scope.include_site = include_site.value_or(false); + } const std::string* origin = scope_dict.FindString("origin"); scope.origin = origin ? *origin : ""; const base::Value::List* specifications_list = @@ -29,15 +50,24 @@ base::expected ParseScope( const base::Value::Dict* specification_dict = specification.GetIfDict(); if (!specification_dict) { return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidScopeRule}); + SessionError{SessionError::kInvalidScopeSpecification}); } const std::string* type = specification_dict->FindString("type"); - const std::string* domain = specification_dict->FindString("domain"); - const std::string* path = specification_dict->FindString("path"); - if (!type || !domain || domain->empty() || !path || path->empty()) { + if (!type) { return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidScopeRule}); + SessionError{SessionError::kMissingScopeSpecificationType}); + } + std::string domain = + FindStringWithDefault(*specification_dict, "domain", "*"); + if (domain.empty()) { + return base::unexpected( + SessionError{SessionError::kEmptyScopeSpecificationDomain}); + } + std::string path = FindStringWithDefault(*specification_dict, "path", "/"); + if (path.empty()) { + return base::unexpected( + SessionError{SessionError::kEmptyScopeSpecificationPath}); } SessionParams::Scope::Specification::Type rule_type = SessionParams::Scope::Specification::Type::kInclude; @@ -47,11 +77,11 @@ base::expected ParseScope( rule_type = SessionParams::Scope::Specification::Type::kExclude; } else { return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidScopeRule}); + SessionError{SessionError::kInvalidScopeSpecificationType}); } - scope.specifications.push_back( - SessionParams::Scope::Specification{rule_type, *domain, *path}); + scope.specifications.push_back(SessionParams::Scope::Specification{ + rule_type, std::move(domain), std::move(path)}); } return scope; @@ -65,21 +95,23 @@ ParseCredentials(const base::Value::List& credentials_list) { const base::Value::Dict* credential_dict = json_credential.GetIfDict(); if (!credential_dict) { return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidCredentials}); + SessionError{SessionError::kInvalidCredentialsConfig}); } const std::string* type = credential_dict->FindString("type"); if (!type || *type != "cookie") { return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidCredentials}); + SessionError{SessionError::kInvalidCredentialsType}); } const std::string* name = credential_dict->FindString("name"); - const std::string* attributes = credential_dict->FindString("attributes"); - if (!name || !attributes) { + if (!name || name->empty()) { return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidCredentials}); + SessionError{SessionError::kInvalidCredentialsEmptyName}); } + std::string attributes = + FindStringWithDefault(*credential_dict, "attributes", ""); - cookie_credentials.push_back(SessionParams::Credential{*name, *attributes}); + cookie_credentials.push_back( + SessionParams::Credential{*name, std::move(attributes)}); } return cookie_credentials; @@ -95,31 +127,27 @@ base::expected ParseSessionInstructionJson( std::optional maybe_root = base::JSONReader::ReadDict( response_json, base::JSON_PARSE_RFC, /*max_depth=*/5u); if (!maybe_root) { - return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidConfigJson}); + return base::unexpected(SessionError{SessionError::kInvalidConfigJson}); } std::string* session_id = maybe_root->FindString("session_identifier"); if (!session_id || session_id->empty()) { - return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidSessionId}); + return base::unexpected(SessionError{SessionError::kInvalidSessionId}); } if (expected_session_id.has_value() && *expected_session_id != *session_id) { - return base::unexpected( - SessionError{SessionError::ErrorType::kMismatchedSessionId}); + return base::unexpected(SessionError{SessionError::kMismatchedSessionId}); } std::optional continue_value = maybe_root->FindBool("continue"); if (continue_value.has_value() && *continue_value == false) { return base::unexpected( - SessionError{SessionError::ErrorType::kServerRequestedTermination}); + SessionError{SessionError::kServerRequestedTermination}); } base::Value::Dict* scope_dict = maybe_root->FindDict("scope"); if (!scope_dict) { - return base::unexpected( - SessionError{SessionError::ErrorType::kMissingScope}); + return base::unexpected(SessionError{SessionError::kMissingScope}); } ASSIGN_OR_RETURN(SessionParams::Scope scope, ParseScope(*scope_dict)); @@ -133,8 +161,7 @@ base::expected ParseSessionInstructionJson( } if (credentials.empty()) { - return base::unexpected( - SessionError{SessionError::ErrorType::kNoCredentials}); + return base::unexpected(SessionError{SessionError::kNoCredentials}); } std::vector allowed_refresh_initiators; @@ -144,7 +171,7 @@ base::expected ParseSessionInstructionJson( for (base::Value& initiator : *initiator_list) { if (!initiator.is_string()) { return base::unexpected( - SessionError{SessionError::ErrorType::kInvalidRefreshInitiators}); + SessionError{SessionError::kRefreshInitiatorNotString}); } allowed_refresh_initiators.emplace_back(std::move(initiator.GetString())); @@ -157,4 +184,67 @@ base::expected ParseSessionInstructionJson( std::move(allowed_refresh_initiators)); } +std::optional ParseWellKnownJson( + std::string_view response_json) { + std::optional maybe_root = base::JSONReader::ReadDict( + response_json, base::JSON_PARSE_RFC, /*max_depth=*/5u); + if (!maybe_root) { + return std::nullopt; + } + + WellKnownParams params; + const base::Value* registering_origins = + maybe_root->Find("registering_origins"); + if (registering_origins) { + const base::Value::List* registering_origins_list = + registering_origins->GetIfList(); + if (!registering_origins_list) { + return std::nullopt; + } + std::vector registering_origin_strings; + registering_origin_strings.reserve(registering_origins_list->size()); + for (const auto& registering_origin : *registering_origins_list) { + const std::string* registering_origin_string = + registering_origin.GetIfString(); + if (!registering_origin_string) { + return std::nullopt; + } + + registering_origin_strings.push_back(*registering_origin_string); + } + params.registering_origins = std::move(registering_origin_strings); + } + + const base::Value* relying_origins = maybe_root->Find("relying_origins"); + if (relying_origins) { + const base::Value::List* relying_origins_list = + relying_origins->GetIfList(); + if (!relying_origins_list) { + return std::nullopt; + } + std::vector relying_origin_strings; + relying_origin_strings.reserve(relying_origins_list->size()); + for (const auto& relying_origin : *relying_origins_list) { + const std::string* relying_origin_string = relying_origin.GetIfString(); + if (!relying_origin_string) { + return std::nullopt; + } + + relying_origin_strings.push_back(*relying_origin_string); + } + params.relying_origins = std::move(relying_origin_strings); + } + + const base::Value* provider_origin = maybe_root->Find("provider_origin"); + if (provider_origin) { + const std::string* provider_origin_string = provider_origin->GetIfString(); + if (!provider_origin_string) { + return std::nullopt; + } + params.provider_origin = *provider_origin_string; + } + + return params; +} + } // namespace net::device_bound_sessions diff --git a/naiveproxy/src/net/device_bound_sessions/session_json_utils.h b/naiveproxy/src/net/device_bound_sessions/session_json_utils.h index d550895866..73dddf9c2e 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_json_utils.h +++ b/naiveproxy/src/net/device_bound_sessions/session_json_utils.h @@ -29,6 +29,9 @@ base::expected ParseSessionInstructionJson( std::optional expected_session_id, std::string_view response_json); +std::optional ParseWellKnownJson( + std::string_view response_json); + } // namespace net::device_bound_sessions #endif // NET_DEVICE_BOUND_SESSIONS_SESSION_JSON_UTILS_H_ diff --git a/naiveproxy/src/net/device_bound_sessions/session_key.h b/naiveproxy/src/net/device_bound_sessions/session_key.h index fdcd28ab9d..468722b1a3 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_key.h +++ b/naiveproxy/src/net/device_bound_sessions/session_key.h @@ -5,6 +5,7 @@ #ifndef NET_DEVICE_BOUND_SESSIONS_SESSION_KEY_H_ #define NET_DEVICE_BOUND_SESSIONS_SESSION_KEY_H_ +#include "base/hash/hash.h" #include "base/types/strong_alias.h" #include "net/base/schemeful_site.h" diff --git a/naiveproxy/src/net/device_bound_sessions/session_params.cc b/naiveproxy/src/net/device_bound_sessions/session_params.cc index 8dcc4ad319..a3358c6631 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_params.cc +++ b/naiveproxy/src/net/device_bound_sessions/session_params.cc @@ -6,6 +6,8 @@ namespace net::device_bound_sessions { +SessionParams::SessionParams() = default; + SessionParams::SessionParams( std::string id, GURL fetcher_url, @@ -38,4 +40,10 @@ SessionParams::Scope& SessionParams::Scope::operator=( SessionParams::Scope::~Scope() = default; +WellKnownParams::WellKnownParams() = default; +WellKnownParams::~WellKnownParams() = default; +WellKnownParams::WellKnownParams(WellKnownParams&& other) noexcept = default; +WellKnownParams& WellKnownParams::operator=(WellKnownParams&& other) noexcept = + default; + } // namespace net::device_bound_sessions diff --git a/naiveproxy/src/net/device_bound_sessions/session_params.h b/naiveproxy/src/net/device_bound_sessions/session_params.h index 9f9d076cd5..5522d07b25 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_params.h +++ b/naiveproxy/src/net/device_bound_sessions/session_params.h @@ -15,6 +15,7 @@ namespace net::device_bound_sessions { +// LINT.IfChange(SessionParams) // Struct to contain the parameters from the session instruction JSON. // https://github.com/WICG/dbsc/blob/main/README.md#session-registration-instructions-json // This is sent on session creation and session refresh @@ -48,6 +49,7 @@ struct NET_EXPORT SessionParams final { std::string attributes; }; + SessionParams(); SessionParams(std::string id, GURL fetcher_url, std::string refresh_url, @@ -70,6 +72,19 @@ struct NET_EXPORT SessionParams final { unexportable_keys::UnexportableKeyId key_id; std::vector allowed_refresh_initiators; }; +// LINT.ThenChange(//services/network/public/mojom/device_bound_sessions.mojom:DeviceBoundSessionParams) + +// Struct to contain the parameters from the .well-known JSON. +struct NET_EXPORT WellKnownParams { + WellKnownParams(); + ~WellKnownParams(); + WellKnownParams(WellKnownParams&& other) noexcept; + WellKnownParams& operator=(WellKnownParams&& other) noexcept; + + std::optional> registering_origins; + std::optional> relying_origins; + std::optional provider_origin; +}; } // namespace net::device_bound_sessions diff --git a/naiveproxy/src/net/device_bound_sessions/session_service.h b/naiveproxy/src/net/device_bound_sessions/session_service.h index 9b5fd7a8fa..00bcbd18d5 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_service.h +++ b/naiveproxy/src/net/device_bound_sessions/session_service.h @@ -35,16 +35,23 @@ class NET_EXPORT SessionService { using OnAccessCallback = base::RepeatingCallback; // Records the outcome of an attempt to refresh. + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + // LINT.IfChange(DeviceBoundSessionRefreshResult) enum class RefreshResult { - kRefreshed, // Refresh was successful. - kInitializedService, // Service is now initialized, refresh may still be - // needed. - kUnreachable, // Refresh endpoint was unreachable. - kServerError, // Refresh endpoint served a transient error. - kQuotaExceeded, // Refresh quota exceeded. - kFatalError, // Refresh failed and session was terminated. No - // further refresh needed. + kRefreshed = 0, // Refresh was successful. + kInitializedService = 1, // Service is now initialized, refresh may still + // be needed. + kUnreachable = 2, // Refresh endpoint was unreachable. + kServerError = 3, // Refresh endpoint served a transient error. + kRefreshQuotaExceeded = 4, // Refresh quota exceeded. This is being + // replaced with `kSigningQuotaExceeded`. + kFatalError = 5, // Refresh failed and session was terminated. No + // further refresh needed. + kSigningQuotaExceeded = 6, // Signing quota exceeded. + kMaxValue = kSigningQuotaExceeded }; + // LINT.ThenChange(//tools/metrics/histograms/metadata/net/enums.xml:DeviceBoundSessionRefreshResult) using RefreshCompleteCallback = base::OnceCallback; // Indicates the reason for deferring. Exactly one of @@ -71,6 +78,19 @@ class NET_EXPORT SessionService { std::optional session_id; }; + // Stores a signed refresh challenge as well as the inputs used for the + // signing. This is an optimization to avoid redundant resigning, which is + // slow + resource-intensive, and could also cause issues like triggering the + // signing quota unnecessarily. + struct NET_EXPORT SignedRefreshChallenge { + // The signed challenge that was cached. + std::string signed_challenge; + // The challenge used to generate `signed_challenge`. + std::string challenge; + // The key_id used to generate `signed_challenge`. + unexportable_keys::UnexportableKeyId key_id; + }; + // Returns nullptr if unexportable key provider is not supported by the // platform or the device. static std::unique_ptr Create( @@ -81,17 +101,14 @@ class NET_EXPORT SessionService { virtual ~SessionService() = default; - // Called to register a new session after getting a Sec-Session-Registration - // header. - // Registration parameters to be used for creating the registration - // request. - // Isolation info to be used for registration request, this should be the - // same as was used for the response with the Sec-Session-Registration - // header. - // `net_log` is the log corresponding to the request receiving the - // Sec-Session-Registration header. - // 'original_request_initiator` was the initiator for the request that - // received the Sec-Session-Registration header. + // Called to register a new session after getting a + // Secure-Session-Registration header. Registration parameters to be used for + // creating the registration request. Isolation info to be used for + // registration request, this should be the same as was used for the response + // with the Secure-Session-Registration header. `net_log` is the log + // corresponding to the request receiving the Secure-Session-Registration + // header. 'original_request_initiator` was the initiator for the request that + // received the Secure-Session-Registration header. virtual void RegisterBoundSession( OnAccessCallback on_access_callback, RegistrationFetcherParam registration_params, @@ -128,10 +145,11 @@ class NET_EXPORT SessionService { RefreshCompleteCallback callback) = 0; // Set the challenge for a bound session after getting a - // Sec-Session-Challenge header. + // Secure-Session-Challenge header. virtual void SetChallengeForBoundSession( OnAccessCallback on_access_callback, - const GURL& request_url, + const URLRequest& request, + const FirstPartySetMetadata& first_party_set_metadata, const SessionChallengeParam& param) = 0; // Get all sessions. If sessions have not yet been loaded from disk, @@ -164,6 +182,33 @@ class NET_EXPORT SessionService { const GURL& url, base::RepeatingCallback callback) = 0; + // Get a session by key, or `nullptr` if no such session exists. + virtual const Session* GetSession(const SessionKey& session_key) const = 0; + + // Adds a session to the service for the site `site` and with session + // config from `params`. `params.key_id` is ignored in favor of + // importing `wrapped_key`. Calls `callback` when complete with a + // boolean indicating whether session addition was successful. + virtual void AddSession(const SchemefulSite& site, + SessionParams params, + base::span wrapped_key, + base::OnceCallback callback) = 0; + + // Finds the latest signed refresh challenge and relevant signing context for + // the `session_key`. If no challenge is found, returns nullptr. + virtual const SignedRefreshChallenge* GetLatestSignedRefreshChallenge( + const SessionKey& session_key) = 0; + // Sets the latest signed refresh challenge and relevant signing context for + // the `session_key`. + virtual void SetLatestSignedRefreshChallenge( + SessionKey session_key, + SignedRefreshChallenge signed_refresh_challenge) = 0; + + // Whether the `site` has exceeded its signing quota. + virtual bool SigningQuotaExceeded(const SchemefulSite& site) = 0; + // Increments signing usage for this `site`. + virtual void AddSigningOccurrence(const SchemefulSite& site) = 0; + protected: SessionService() = default; }; diff --git a/naiveproxy/src/net/device_bound_sessions/session_service_impl.cc b/naiveproxy/src/net/device_bound_sessions/session_service_impl.cc index 1cf6a08117..781fdaf46c 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_service_impl.cc +++ b/naiveproxy/src/net/device_bound_sessions/session_service_impl.cc @@ -12,6 +12,7 @@ #include "components/unexportable_keys/unexportable_key_service.h" #include "net/base/features.h" #include "net/base/schemeful_site.h" +#include "net/device_bound_sessions/jwk_utils.h" #include "net/device_bound_sessions/registration_request_param.h" #include "net/device_bound_sessions/session_store.h" #include "net/url_request/url_request.h" @@ -21,11 +22,18 @@ namespace net::device_bound_sessions { namespace { -// Parameters for the refresh quota. We currently allow 2 refreshes in 5 -// minutes. This allows sites to refresh every 5 minutes with some error -// tolerance (e.g. a failed refresh or user cookie clearing). -constexpr size_t kRefreshQuota = 2; -constexpr base::TimeDelta kRefreshQuotaInterval = base::Minutes(5); +// Parameters for the signing quota. We currently allow 6 signings in 9 +// minutes per site. Reasoning: +// 1. This allows sites to refresh on average every 5 minutes, accounting for +// proactive refreshes 2 minutes before expiry, and with some error tolerance +// (e.g. a failed refresh or user cookie clearing) and tolerance for new +// registration signings. +// 2. It's 6:9 instead of 2:3 to allow small bursts of login activity + new +// registrations. +// 3. The spec notes that user agents should include quotas on registration +// attempts to prevent identity linking for federated sessions. +constexpr size_t kSigningQuota = 6; +constexpr base::TimeDelta kSigningQuotaInterval = base::Minutes(9); bool SessionMatchesFilter( const SchemefulSite& site, @@ -68,7 +76,8 @@ class DebugHeaderBuilder { item = structured_headers::Item("server_error", structured_headers::Item::kTokenType); break; - case SessionService::RefreshResult::kQuotaExceeded: + case SessionService::RefreshResult::kRefreshQuotaExceeded: + case SessionService::RefreshResult::kSigningQuotaExceeded: item = structured_headers::Item("quota_exceeded", structured_headers::Item::kTokenType); break; @@ -91,12 +100,54 @@ class DebugHeaderBuilder { structured_headers::List skipped_sessions_; }; +bool IsProactiveRefreshCandidate( + Session& existing_session, + const Session& new_session, + const CookieAndLineAccessResultList& maybe_stored_cookies) { + // Get the shortest lifetime of a bound cookie set by the current + // refresh request. This assumes: + // 1. The current refresh sets all bound cookies + // 2. The proactive refresh would have set the same lifetimes + // These assumptions are good enough for histogram logging, but likely + // not true for all sites. + base::Time current_time = base::Time::Now(); + base::TimeDelta minimum_lifetime = base::TimeDelta::Max(); + for (const CookieCraving& cookie_craving : new_session.cookies()) { + for (const CookieAndLineWithAccessResult& cookie_and_line : + maybe_stored_cookies) { + if (cookie_and_line.cookie.has_value() && + cookie_craving.IsSatisfiedBy(cookie_and_line.cookie.value())) { + minimum_lifetime = + std::min(minimum_lifetime, + cookie_and_line.cookie->ExpiryDate() - current_time); + } + } + } + + base::UmaHistogramLongTimes100( + "Net.DeviceBoundSessions.MinimumBoundCookieLifetime", minimum_lifetime); + + std::optional last_proactive_refresh_opportunity = + existing_session.TakeLastProactiveRefreshOpportunity(); + + if (!last_proactive_refresh_opportunity.has_value()) { + return false; + } + + return minimum_lifetime >= current_time - *last_proactive_refresh_opportunity; +} + +void LogProactiveRefreshAttempt( + SessionServiceImpl::ProactiveRefreshAttempt attempt) { + base::UmaHistogramEnumeration( + "Net.DeviceBoundSessions.ProactiveRefreshAttempt", attempt); +} + } // namespace DeferredURLRequest::DeferredURLRequest( - const URLRequest* request, SessionService::RefreshCompleteCallback callback) - : request(request), callback(std::move(callback)) {} + : callback(std::move(callback)) {} DeferredURLRequest::DeferredURLRequest(DeferredURLRequest&& other) noexcept = default; @@ -114,8 +165,7 @@ SessionServiceImpl::SessionServiceImpl( key_service_(key_service), context_(request_context), session_store_(store) { - ignore_refresh_quota_ = - !base::FeatureList::IsEnabled(features::kDeviceBoundSessionsRefreshQuota); + ignore_refresh_quota_ = !features::kDeviceBoundSessionsRefreshQuota.Get(); CHECK(context_); } @@ -135,6 +185,30 @@ void SessionServiceImpl::RegisterBoundSession( const IsolationInfo& isolation_info, const NetLogWithSource& net_log, const std::optional& original_request_initiator) { + Session* federated_provider_session = nullptr; + bool is_google_subdomain_for_histograms = IsSubdomainOf( + registration_params.registration_endpoint().host(), "google.com"); + if (registration_params.provider_session_id().has_value()) { + if (!base::FeatureList::IsEnabled( + features::kDeviceBoundSessionsFederatedRegistration)) { + // Simply ignore headers with a provider_session_id if the flag + // isn't enabled. + return; + } + + base::expected provider_session_or_error = + GetFederatedProviderSessionIfValid(registration_params); + if (!provider_session_or_error.has_value()) { + OnRegistrationComplete( + std::move(on_access_callback), is_google_subdomain_for_histograms, + /*fetcher=*/nullptr, + RegistrationResult(std::move(provider_session_or_error.error()))); + return; + } + + federated_provider_session = provider_session_or_error.value(); + } + net::NetLogSource net_log_source_for_registration = net::NetLogSource( net::NetLogSourceType::URL_REQUEST, net::NetLog::Get()->NextID()); net_log.AddEventReferencingSource( @@ -142,21 +216,84 @@ void SessionServiceImpl::RegisterBoundSession( net_log_source_for_registration); const auto supported_algos = registration_params.supported_algos(); + std::optional provider_url = registration_params.provider_url(); RegistrationRequestParam request_params = RegistrationRequestParam::CreateForRegistration( std::move(registration_params)); - std::unique_ptr fetcher = RegistrationFetcher::CreateFetcher( - request_params, key_service_.get(), context_.get(), isolation_info, - net_log_source_for_registration, original_request_initiator); + request_params, *this, key_service_.get(), context_.get(), + isolation_info, net_log_source_for_registration, + original_request_initiator); RegistrationFetcher* fetcher_raw = fetcher.get(); registration_fetchers_.insert(std::move(fetcher)); - fetcher_raw->StartCreateTokenAndFetch( - request_params, supported_algos, - base::BindOnce(&SessionServiceImpl::OnRegistrationComplete, - weak_factory_.GetWeakPtr(), - std::move(on_access_callback))); + + auto callback = base::BindOnce( + &SessionServiceImpl::OnRegistrationComplete, weak_factory_.GetWeakPtr(), + std::move(on_access_callback), is_google_subdomain_for_histograms); + if (federated_provider_session) { + fetcher_raw->StartFetchWithFederatedKey( + request_params, *federated_provider_session->unexportable_key_id(), + *provider_url, std::move(callback)); + // `fetcher_raw` may be deleted. + } else { + fetcher_raw->StartCreateTokenAndFetch(request_params, supported_algos, + std::move(callback)); + // `fetcher_raw` may be deleted. + } +} + +base::expected +SessionServiceImpl::GetFederatedProviderSessionIfValid( + const RegistrationFetcherParam& registration_params) { + // This is a federated session registration. + GURL provider_url = *registration_params.provider_url(); + if (!provider_url.is_valid() || url::Origin::Create(provider_url).opaque()) { + return base::unexpected( + SessionError(SessionError::kInvalidFederatedSessionUrl)); + } + + SessionKey provider_key{SchemefulSite(provider_url), + *registration_params.provider_session_id()}; + Session* provider_session = GetSession(provider_key); + + if (!provider_session) { + // Provider session not found, fail the registration. + return base::unexpected(SessionError( + SessionError::kInvalidFederatedSessionProviderSessionMissing)); + } + + if (url::Origin::Create(provider_url) != provider_session->origin()) { + return base::unexpected(SessionError( + SessionError::kInvalidFederatedSessionWrongProviderOrigin)); + } + + if (!provider_session->unexportable_key_id().has_value()) { + return base::unexpected(SessionError(SessionError::kInvalidFederatedKey)); + } + + unexportable_keys::ServiceErrorOr< + crypto::SignatureVerifier::SignatureAlgorithm> + algorithm = + key_service_->GetAlgorithm(*provider_session->unexportable_key_id()); + if (!algorithm.has_value()) { + return base::unexpected(SessionError(SessionError::kInvalidFederatedKey)); + } + + unexportable_keys::ServiceErrorOr> pub_key = + key_service_->GetSubjectPublicKeyInfo( + *provider_session->unexportable_key_id()); + if (!pub_key.has_value()) { + return base::unexpected(SessionError(SessionError::kInvalidFederatedKey)); + } + + std::string thumbprint = CreateJwkThumbprint(*algorithm, *pub_key); + if (thumbprint != *registration_params.provider_key()) { + return base::unexpected( + SessionError(SessionError::kFederatedKeyThumbprintMismatch)); + } + + return provider_session; } SessionServiceImpl::Observer::Observer( @@ -183,10 +320,15 @@ void SessionServiceImpl::OnLoadSessionsComplete( void SessionServiceImpl::OnRegistrationComplete( OnAccessCallback on_access_callback, + bool is_google_subdomain_for_histograms, RegistrationFetcher* fetcher, - base::expected params_or_error) { + RegistrationResult registration_result) { + if (is_google_subdomain_for_histograms) { + base::UmaHistogramBoolean( + "Net.DeviceBoundSessions.GoogleRegistrationIsFromStandard", true); + } SessionError::ErrorType result = OnRegistrationCompleteInternal( - std::move(on_access_callback), fetcher, std::move(params_or_error)); + std::move(on_access_callback), fetcher, std::move(registration_result)); base::UmaHistogramEnumeration("Net.DeviceBoundSessions.RegistrationResult", result); } @@ -225,13 +367,24 @@ std::optional SessionServiceImpl::ShouldDefer( if (pending_initialization_) { return DeferralParams(); } + + if (request->device_bound_session_usage() < SessionUsage::kNoUsage) { + request->set_device_bound_session_usage(SessionUsage::kNoUsage); + } + SchemefulSite site(request->url()); DebugHeaderBuilder debug_header_builder; const base::flat_map& previous_deferrals = request->device_bound_session_deferrals(); for (const auto& [_, session] : GetSessionsForSite(site)) { - if (session->ShouldDeferRequest(request, first_party_set_metadata)) { - SessionKey session_key{site, session->id()}; + if (!session->IsInScope(request)) { + continue; + } + + SessionKey session_key{site, session->id()}; + base::TimeDelta minimum_lifetime = + session->MinimumBoundCookieLifetime(request, first_party_set_metadata); + if (minimum_lifetime.is_zero()) { auto previous_deferrals_it = previous_deferrals.find(session_key); if (previous_deferrals_it != previous_deferrals.end()) { debug_header_builder.AddSkippedSession(previous_deferrals_it->first, @@ -244,6 +397,9 @@ std::optional SessionServiceImpl::ShouldDefer( *session); return DeferralParams(session->id()); } + + MaybeStartProactiveRefresh(request->device_bound_session_access_callback(), + request, session_key, minimum_lifetime); } std::optional debug_header = debug_header_builder.Build(); @@ -273,9 +429,9 @@ void SessionServiceImpl::DeferRequestForRefresh( SessionKey session_key{SchemefulSite(request->url()), *deferral.session_id}; // For the first deferring request, create a new vector and add the request. - auto [it, inserted] = deferred_requests_.try_emplace(session_key.id); - // Add the request to the deferred list. - it->second.emplace_back(request, std::move(callback)); + auto [it, inserted] = deferred_requests_.try_emplace(session_key); + // Add the request callback to the deferred list. + it->second.emplace_back(std::move(callback)); auto* session = GetSession(session_key); CHECK(session, base::NotFatalUntil::M147); @@ -294,9 +450,12 @@ void SessionServiceImpl::DeferRequestForRefresh( if (!inserted) { return; } + if (proactive_requests_.find(session_key) != proactive_requests_.end()) { + return; + } if (RefreshQuotaExceeded(session_key.site)) { - UnblockDeferredRequests(session_key, RefreshResult::kQuotaExceeded); + UnblockDeferredRequests(session_key, RefreshResult::kRefreshQuotaExceeded); return; } @@ -312,7 +471,8 @@ void SessionServiceImpl::DeferRequestForRefresh( session_store_->RestoreSessionBindingKey( session_key, base::BindOnce(&SessionServiceImpl::OnSessionKeyRestored, - weak_factory_.GetWeakPtr(), request, session_key, + weak_factory_.GetWeakPtr(), request->GetWeakPtr(), + session_key, request->device_bound_session_access_callback())); } else { UnblockDeferredRequests(session_key, RefreshResult::kFatalError); @@ -323,32 +483,55 @@ void SessionServiceImpl::DeferRequestForRefresh( return; } - RefreshSessionInternal(request, session_key, session, *key_id); + RefreshSessionInternal(RefreshTrigger::kMissingCookie, request, session_key, + session, *key_id); } void SessionServiceImpl::OnRefreshRequestCompletion( + RefreshTrigger trigger, OnAccessCallback on_access_callback, SessionKey session_key, RegistrationFetcher* fetcher, - base::expected params_or_error) { + RegistrationResult registration_result) { SessionError::ErrorType result = OnRefreshRequestCompletionInternal( std::move(on_access_callback), session_key, fetcher, - std::move(params_or_error)); + std::move(registration_result)); Session* session = GetSession(session_key); if (session) { - session->InformOfRefreshResult(result); + session->InformOfRefreshResult( + /*was_proactive=*/trigger == RefreshTrigger::kProactive, result); } - base::UmaHistogramEnumeration("Net.DeviceBoundSessions.RefreshResult", - result); + std::string histogram_base = "Net.DeviceBoundSessions.RefreshResult"; + std::string suffix; + switch (trigger) { + case RefreshTrigger::kProactive: + suffix = ".Proactive"; + break; + case RefreshTrigger::kMissingCookie: + suffix = ".MissingCookie"; + break; + } + base::UmaHistogramEnumeration(histogram_base, result); + base::UmaHistogramEnumeration(histogram_base + suffix, result); } // Continue or restart all deferred requests for the session and remove the -// session_id key in the map. -void SessionServiceImpl::UnblockDeferredRequests(const SessionKey& session_key, - RefreshResult result) { - auto it = deferred_requests_.find(session_key.id); +// session key in the map. +void SessionServiceImpl::UnblockDeferredRequests( + const SessionKey& session_key, + RefreshResult result, + std::optional is_proactive_refresh_candidate, + std::optional minimum_proactive_refresh_threshold) { + if (auto it = proactive_requests_.find(session_key); + it != proactive_requests_.end()) { + base::UmaHistogramTimes("Net.DeviceBoundSessions.ProactiveRefreshDuration", + it->second.Elapsed()); + proactive_requests_.erase(it); + } + + auto it = deferred_requests_.find(session_key); if (it == deferred_requests_.end()) { return; } @@ -356,31 +539,106 @@ void SessionServiceImpl::UnblockDeferredRequests(const SessionKey& session_key, auto requests = std::move(it->second); deferred_requests_.erase(it); + base::UmaHistogramCounts100("Net.DeviceBoundSessions.RequestDeferredCount", + requests.size()); + + if (is_proactive_refresh_candidate.has_value() && + minimum_proactive_refresh_threshold.has_value()) { + base::UmaHistogramLongTimes100( + "Net.DeviceBoundSessions.MinimumProactiveRefreshThreshold", + *minimum_proactive_refresh_threshold); + if (*is_proactive_refresh_candidate) { + base::UmaHistogramLongTimes100( + "Net.DeviceBoundSessions.MinimumProactiveRefreshThreshold.Success", + *minimum_proactive_refresh_threshold); + } else { + base::UmaHistogramLongTimes100( + "Net.DeviceBoundSessions.MinimumProactiveRefreshThreshold.Failure", + *minimum_proactive_refresh_threshold); + } + + if (*is_proactive_refresh_candidate) { + if (*minimum_proactive_refresh_threshold <= base::Seconds(30)) { + base::UmaHistogramCounts100( + "Net.DeviceBoundSessions.ProactiveRefreshCandidateDeferredCount." + "ThirtySeconds", + requests.size()); + for (auto& request : requests) { + base::UmaHistogramTimes( + "Net.DeviceBoundSessions." + "ProactiveRefreshCandidateRequestDeferredDuration.ThirtySeconds", + request.timer.Elapsed()); + } + } + + if (*minimum_proactive_refresh_threshold <= base::Minutes(1)) { + base::UmaHistogramCounts100( + "Net.DeviceBoundSessions.ProactiveRefreshCandidateDeferredCount." + "OneMinute", + requests.size()); + for (auto& request : requests) { + base::UmaHistogramTimes( + "Net.DeviceBoundSessions." + "ProactiveRefreshCandidateRequestDeferredDuration.OneMinute", + request.timer.Elapsed()); + } + } + + if (*minimum_proactive_refresh_threshold <= base::Minutes(2)) { + base::UmaHistogramCounts100( + "Net.DeviceBoundSessions.ProactiveRefreshCandidateDeferredCount." + "TwoMinutes", + requests.size()); + for (auto& request : requests) { + base::UmaHistogramTimes( + "Net.DeviceBoundSessions." + "ProactiveRefreshCandidateRequestDeferredDuration.TwoMinutes", + request.timer.Elapsed()); + } + } + } + } + for (auto& request : requests) { base::UmaHistogramTimes("Net.DeviceBoundSessions.RequestDeferredDuration", request.timer.Elapsed()); + base::UmaHistogramEnumeration("Net.DeviceBoundSessions.DeferralResult", + result); + if (request.timer.Elapsed() <= base::Milliseconds(1)) { + base::UmaHistogramEnumeration( + "Net.DeviceBoundSessions.DeferralResult.Instant", result); + } else { + base::UmaHistogramEnumeration( + "Net.DeviceBoundSessions.DeferralResult.Slow", result); + } std::move(request.callback).Run(result); } } void SessionServiceImpl::SetChallengeForBoundSession( OnAccessCallback on_access_callback, - const GURL& request_url, + const URLRequest& request, + const FirstPartySetMetadata& first_party_set_metadata, const SessionChallengeParam& param) { if (!param.session_id()) { return; } - SchemefulSite site(request_url); - for (const auto& [_, session] : GetSessionsForSite(site)) { - if (session->id().value() == param.session_id()) { - NotifySessionAccess(on_access_callback, - SessionAccess::AccessType::kUpdate, - SessionKey{site, session->id()}, *session); - session->set_cached_challenge(param.challenge()); - return; - } + SessionKey session_key{SchemefulSite(request.url()), + Session::Id(*param.session_id())}; + Session* session = GetSession(session_key); + if (!session) { + return; } + + if (features::kDeviceBoundSessionsOriginTrialFeedback.Get() && + !session->CanSetBoundCookie(request, first_party_set_metadata)) { + return; + } + + NotifySessionAccess(on_access_callback, SessionAccess::AccessType::kUpdate, + session_key, *session); + session->set_cached_challenge(param.challenge()); } void SessionServiceImpl::GetAllSessionsAsync( @@ -411,7 +669,8 @@ void SessionServiceImpl::DeleteSessionAndNotify( DeleteSessionAndNotifyInternal(reason, it, per_request_callback); } -Session* SessionServiceImpl::GetSession(const SessionKey& session_key) const { +const Session* SessionServiceImpl::GetSession( + const SessionKey& session_key) const { auto it = unpartitioned_sessions_.find(session_key); if (it != unpartitioned_sessions_.end()) { return it->second.get(); @@ -419,14 +678,73 @@ Session* SessionServiceImpl::GetSession(const SessionKey& session_key) const { return nullptr; } +Session* SessionServiceImpl::GetSession(const SessionKey& session_key) { + return const_cast(std::as_const(*this).GetSession(session_key)); +} + +void SessionServiceImpl::AddSession(const SchemefulSite& site, + SessionParams params, + base::span wrapped_key, + base::OnceCallback callback) { + key_service_->FromWrappedSigningKeySlowlyAsync( + wrapped_key, unexportable_keys::BackgroundTaskPriority::kBestEffort, + base::BindOnce(&SessionServiceImpl::OnAddSessionKeyRestored, + weak_factory_.GetWeakPtr(), site, std::move(params), + std::move(callback))); +} + +const SessionService::SignedRefreshChallenge* +SessionServiceImpl::GetLatestSignedRefreshChallenge( + const SessionKey& session_key) { + auto signed_challenge_it = + latest_signed_refresh_challenges_.find(session_key); + if (signed_challenge_it == latest_signed_refresh_challenges_.end()) { + return nullptr; + } + return &signed_challenge_it->second; +} + +void SessionServiceImpl::SetLatestSignedRefreshChallenge( + SessionKey session_key, + SessionService::SignedRefreshChallenge signed_refresh_challenge) { + latest_signed_refresh_challenges_[std::move(session_key)] = + std::move(signed_refresh_challenge); +} + +void SessionServiceImpl::OnAddSessionKeyRestored( + const SchemefulSite& site, + SessionParams params, + base::OnceCallback callback, + unexportable_keys::ServiceErrorOr + key_or_error) { + if (!key_or_error.has_value()) { + std::move(callback).Run(false); + return; + } + + params.key_id = *key_or_error; + + base::expected, + net::device_bound_sessions::SessionError> + session_or_error = + net::device_bound_sessions::Session::CreateIfValid(params); + + if (!session_or_error.has_value()) { + std::move(callback).Run(false); + return; + } + + AddSession(site, std::move(session_or_error.value())); + std::move(callback).Run(true); +} + void SessionServiceImpl::AddSession(const SchemefulSite& site, std::unique_ptr session) { if (session_store_) { session_store_->SaveSession(site, *session); } - unpartitioned_sessions_.emplace(SessionKey{site, session->id()}, - std::move(session)); + unpartitioned_sessions_[SessionKey{site, session->id()}] = std::move(session); } void SessionServiceImpl::DeleteAllSessions( @@ -534,90 +852,105 @@ void SessionServiceImpl::RemoveObserver(net::SchemefulSite site, SessionError::ErrorType SessionServiceImpl::OnRegistrationCompleteInternal( OnAccessCallback on_access_callback, RegistrationFetcher* fetcher, - base::expected params_or_error) { + RegistrationResult registration_result) { RemoveFetcher(fetcher); - if (!params_or_error.has_value()) { + if (registration_result.is_error()) { // We failed to create a new session, so there's nothing to clean // up. - return params_or_error.error().type; + return registration_result.error().type; + } else if (registration_result.is_no_session_config_change()) { + // No config changes is not allowed at registration. + return SessionError::kInvalidConfigJson; } - const SessionParams& params = *params_or_error; - const SchemefulSite site(url::Origin::Create(GURL(params.fetcher_url))); - - auto session_or_error = Session::CreateIfValid(std::move(params)); - if (!session_or_error.has_value()) { - // The attempt to create a valid session failed. Since this specific - // registration request did not add a session, no cleanup is needed. - return session_or_error.error().type; - } - CHECK(*session_or_error); + std::unique_ptr session = registration_result.TakeSession(); + CHECK(session); + const SchemefulSite site(session->origin()); NotifySessionAccess(on_access_callback, SessionAccess::AccessType::kCreation, - SessionKey{site, (*session_or_error)->id()}, - **session_or_error); - AddSession(site, std::move(*session_or_error)); - return SessionError::ErrorType::kSuccess; + SessionKey{site, session->id()}, *session); + AddSession(site, std::move(session)); + return SessionError::kSuccess; } SessionError::ErrorType SessionServiceImpl::OnRefreshRequestCompletionInternal( OnAccessCallback on_access_callback, const SessionKey& session_key, RegistrationFetcher* fetcher, - base::expected params_or_error) { + RegistrationResult registration_result) { RemoveFetcher(fetcher); // If refresh succeeded: // 1. update the session by adding a new session, replacing the old one // 2. restart the deferred requests. - // - // Note that we notified `on_access_callback` about `session_key.id` already, - // so we only need to notify the callback about other sessions. - if (params_or_error.has_value()) { - auto session_or_error = Session::CreateIfValid(*params_or_error); - if (!session_or_error.has_value()) { - // New parameters are invalid, terminate the session. - DeleteSessionAndNotify(DeletionReason::kInvalidSessionParams, session_key, - on_access_callback); - UnblockDeferredRequests(session_key, RefreshResult::kFatalError); - return session_or_error.error().type; - } - - std::unique_ptr new_session = std::move(*session_or_error); + if (registration_result.is_session()) { + std::unique_ptr new_session = registration_result.TakeSession(); CHECK(new_session); CHECK_EQ(new_session->id(), session_key.id); - SchemefulSite new_site( - url::Origin::Create(GURL(params_or_error->fetcher_url))); - if (new_session->id() != session_key.id) { - NotifySessionAccess( - on_access_callback, SessionAccess::AccessType::kCreation, - SessionKey{new_site, new_session->id()}, *new_session); - } + Session* existing_session = GetSession(session_key); + CHECK(existing_session); + bool is_proactive_refresh_candidate = + IsProactiveRefreshCandidate(*existing_session, *new_session, + registration_result.maybe_stored_cookies()); + std::optional minimum_cookie_lifetime = + existing_session + ->TakeLastProactiveRefreshOpportunityMinimumCookieLifetime(); + + SchemefulSite new_site(new_session->origin()); AddSession(new_site, std::move(new_session)); // The session has been refreshed, restart the request. - UnblockDeferredRequests(session_key, RefreshResult::kRefreshed); - } else if (const SessionError& error = params_or_error.error(); - error.IsFatal()) { - DeleteSessionAndNotify(DeletionReason::kRefreshFatalError, session_key, - on_access_callback); + UnblockDeferredRequests(session_key, RefreshResult::kRefreshed, + is_proactive_refresh_candidate, + std::move(minimum_cookie_lifetime)); + } else if (registration_result.is_no_session_config_change()) { + Session* existing_session = GetSession(session_key); + CHECK(existing_session); + bool is_proactive_refresh_candidate = + IsProactiveRefreshCandidate(*existing_session, *existing_session, + registration_result.maybe_stored_cookies()); + + UnblockDeferredRequests( + session_key, RefreshResult::kRefreshed, is_proactive_refresh_candidate, + existing_session + ->TakeLastProactiveRefreshOpportunityMinimumCookieLifetime()); + } else if (std::optional deletion_reason = + registration_result.error().GetDeletionReason(); + deletion_reason.has_value()) { + DeleteSessionAndNotify(*deletion_reason, session_key, on_access_callback); UnblockDeferredRequests(session_key, RefreshResult::kFatalError); } else { + RefreshResult refresh_result; + if (registration_result.error().IsServerError()) { + refresh_result = RefreshResult::kServerError; + } else if (registration_result.error().type == + SessionError::kSigningQuotaExceeded) { + refresh_result = RefreshResult::kSigningQuotaExceeded; + } else { + refresh_result = RefreshResult::kUnreachable; + } // Transient error, unblock the request without cookies. - UnblockDeferredRequests(session_key, error.IsServerError() - ? RefreshResult::kServerError - : RefreshResult::kUnreachable); + UnblockDeferredRequests(session_key, refresh_result); } - return params_or_error.has_value() ? SessionError::ErrorType::kSuccess - : params_or_error.error().type; + refresh_last_result_.insert_or_assign( + session_key.site, SessionError(registration_result.is_error() + ? registration_result.error().type + : SessionError::kSuccess)); + + return registration_result.is_error() ? registration_result.error().type + : SessionError::kSuccess; } void SessionServiceImpl::OnSessionKeyRestored( - URLRequest* request, + base::WeakPtr request, const SessionKey& session_key, OnAccessCallback on_access_callback, Session::KeyIdOrError key_id_or_error) { + if (!request) { + return; + } + if (!key_id_or_error.has_value()) { UnblockDeferredRequests(session_key, RefreshResult::kFatalError); DeleteSessionAndNotify(DeletionReason::kFailedToUnwrapKey, session_key, @@ -633,10 +966,12 @@ void SessionServiceImpl::OnSessionKeyRestored( session->set_unexportable_key_id(key_id_or_error); - RefreshSessionInternal(request, session_key, session, *key_id_or_error); + RefreshSessionInternal(RefreshTrigger::kMissingCookie, request.get(), + session_key, session, *key_id_or_error); } void SessionServiceImpl::RefreshSessionInternal( + RefreshTrigger trigger, URLRequest* request, const SessionKey& session_key, Session* session, @@ -646,27 +981,38 @@ void SessionServiceImpl::RefreshSessionInternal( request->net_log().AddEventReferencingSource( net::NetLogEventType::DBSC_REFRESH_REQUEST, net_log_source_for_refresh); - refresh_times_[session_key.site].push_back(base::TimeTicks::Now()); + if (!features::kDeviceBoundSessionsOriginTrialFeedback.Get() || + !base::FeatureList::IsEnabled( + features::kDeviceBoundSessionSigningQuotaAndCaching)) { + refresh_times_[session_key.site].push_back(base::TimeTicks::Now()); + } auto registration_param = RegistrationRequestParam::CreateForRefresh(*session); auto callback = base::BindOnce( &SessionServiceImpl::OnRefreshRequestCompletion, - weak_factory_.GetWeakPtr(), + weak_factory_.GetWeakPtr(), trigger, request->device_bound_session_access_callback(), session_key); std::unique_ptr fetcher = RegistrationFetcher::CreateFetcher( - registration_param, key_service_.get(), context_.get(), + registration_param, *this, key_service_.get(), context_.get(), request->isolation_info(), net_log_source_for_refresh, request->initiator()); RegistrationFetcher* fetcher_raw = fetcher.get(); registration_fetchers_.insert(std::move(fetcher)); fetcher_raw->StartFetchWithExistingKey(registration_param, key_id, std::move(callback)); + // `fetcher_raw` may be deleted. } bool SessionServiceImpl::RefreshQuotaExceeded(const SchemefulSite& site) { + if (features::kDeviceBoundSessionsOriginTrialFeedback.Get() && + base::FeatureList::IsEnabled( + features::kDeviceBoundSessionSigningQuotaAndCaching)) { + return false; + } + if (ignore_refresh_quota_) { return false; } @@ -679,7 +1025,7 @@ bool SessionServiceImpl::RefreshQuotaExceeded(const SchemefulSite& site) { it->second.erase(std::remove_if(it->second.begin(), it->second.end(), [](base::TimeTicks time) { return base::TimeTicks::Now() - time >= - kRefreshQuotaInterval; + kSigningQuotaInterval; }), it->second.end()); @@ -688,7 +1034,56 @@ bool SessionServiceImpl::RefreshQuotaExceeded(const SchemefulSite& site) { refresh_times_.erase(it); } - return refresh_count >= kRefreshQuota; + if (auto result_it = refresh_last_result_.find(site); + refresh_count >= kSigningQuota && + result_it != refresh_last_result_.end()) { + base::UmaHistogramEnumeration( + "Net.DeviceBoundSessions.RefreshQuotaExceededLastResult", + result_it->second.type); + } + + return refresh_count >= kSigningQuota; +} + +bool SessionServiceImpl::SigningQuotaExceeded(const SchemefulSite& site) { + if (!features::kDeviceBoundSessionsOriginTrialFeedback.Get() || + !base::FeatureList::IsEnabled( + features::kDeviceBoundSessionSigningQuotaAndCaching)) { + return false; + } + + // TODO(crbug.com/457803903): Rename refresh quota feature to signing quota. + if (ignore_refresh_quota_) { + return false; + } + + auto it = signing_times_.find(site); + if (it == signing_times_.end()) { + return false; + } + + std::erase_if(it->second, [](base::TimeTicks time) { + return base::TimeTicks::Now() - time >= kSigningQuotaInterval; + }); + + size_t sign_count = it->second.size(); + if (sign_count == 0) { + signing_times_.erase(it); + } + + bool is_exceeded = sign_count >= kSigningQuota; + if (auto result_it = refresh_last_result_.find(site); + is_exceeded && result_it != refresh_last_result_.end()) { + base::UmaHistogramEnumeration( + "Net.DeviceBoundSessions.SigningQuotaExceededLastResult", + result_it->second.type); + } + + return is_exceeded; +} + +void SessionServiceImpl::AddSigningOccurrence(const SchemefulSite& site) { + signing_times_[site].push_back(base::TimeTicks::Now()); } void SessionServiceImpl::RemoveFetcher(RegistrationFetcher* fetcher) { @@ -702,4 +1097,75 @@ void SessionServiceImpl::RemoveFetcher(RegistrationFetcher* fetcher) { registration_fetchers_.erase(it); } +void SessionServiceImpl::MaybeStartProactiveRefresh( + SessionService::OnAccessCallback per_request_callback, + URLRequest* request, + const SessionKey& session_key, + base::TimeDelta minimum_cookie_lifetime) { + if (!base::FeatureList::IsEnabled( + features::kDeviceBoundSessionProactiveRefresh)) { + return; + } + + if (minimum_cookie_lifetime > + features::kDeviceBoundSessionProactiveRefreshThreshold.Get()) { + return; + } + + if (deferred_requests_.find(session_key) != deferred_requests_.end()) { + // It's not a proactive refresh if we're in the middle of a regular refresh. + LogProactiveRefreshAttempt( + ProactiveRefreshAttempt::kExistingDeferringRefresh); + return; + } + + auto* session = GetSession(session_key); + CHECK(session); + + if (RefreshQuotaExceeded(session_key.site)) { + LogProactiveRefreshAttempt(ProactiveRefreshAttempt::kSigningQuota); + return; + } + + if (session->ShouldBackoff()) { + LogProactiveRefreshAttempt(ProactiveRefreshAttempt::kBackoff); + return; + } + + if (session->attempted_proactive_refresh_since_last_success()) { + // We only do one proactive refresh attempt before a deferral. If we + // did not do this, every refresh due to missing cookies would be + // skipped due to the refresh quota. Instead, we allow the refresh + // due to missing cookies, which will communicate its reason for + // failure in the Secure-Session-Skipped header. + LogProactiveRefreshAttempt( + ProactiveRefreshAttempt::kPreviousFailedProactiveRefresh); + return; + } + + if (!session->unexportable_key_id().has_value()) { + // TODO(crbug.com/358137054): If we're otherwise ready for a proactive + // refresh, we could start restoring the key. This is lower priority + // than regular proactive refresh, since some amount of startup + // latency is unavoidable with DBSC. + LogProactiveRefreshAttempt(ProactiveRefreshAttempt::kMissingKey); + return; + } + + auto [_, inserted] = proactive_requests_.try_emplace(session_key); + if (!inserted) { + // Do not proactively refresh if we've already started one proactive + // refresh. + LogProactiveRefreshAttempt( + ProactiveRefreshAttempt::kExistingProactiveRefresh); + return; + } + + NotifySessionAccess(per_request_callback, SessionAccess::AccessType::kUpdate, + session_key, *session); + LogProactiveRefreshAttempt(ProactiveRefreshAttempt::kAttempted); + RefreshSessionInternal(RefreshTrigger::kProactive, request, session_key, + session, *session->unexportable_key_id()); +} + } // namespace net::device_bound_sessions diff --git a/naiveproxy/src/net/device_bound_sessions/session_service_impl.h b/naiveproxy/src/net/device_bound_sessions/session_service_impl.h index b1965ec8b0..bb5973badc 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_service_impl.h +++ b/naiveproxy/src/net/device_bound_sessions/session_service_impl.h @@ -39,21 +39,37 @@ namespace net::device_bound_sessions { class SessionStore; struct DeferredURLRequest { - DeferredURLRequest(const URLRequest* request, - SessionService::RefreshCompleteCallback callback); + explicit DeferredURLRequest(SessionService::RefreshCompleteCallback callback); DeferredURLRequest(DeferredURLRequest&& other) noexcept; DeferredURLRequest& operator=(DeferredURLRequest&& other) noexcept; ~DeferredURLRequest(); - raw_ptr request = nullptr; base::ElapsedTimer timer; SessionService::RefreshCompleteCallback callback; }; class NET_EXPORT SessionServiceImpl : public SessionService { public: + // Result of attempting to start a proactive refresh. This enum only + // covers reasons we don't start the refresh despite a cookie expiring + // soon. + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + // LINT.IfChange(ProactiveRefreshAttempt) + enum class ProactiveRefreshAttempt { + kExistingDeferringRefresh = 0, + kExistingProactiveRefresh = 1, + kMissingKey = 2, + kAttempted = 3, + kPreviousFailedProactiveRefresh = 4, + kSigningQuota = 5, + kBackoff = 6, + kMaxValue = kBackoff, + }; + // LINT.ThenChange(//tools/metrics/histograms/metadata/net/enums.xml:DeviceBoundSessionProactiveRefreshAttempt) + SessionServiceImpl(unexportable_keys::UnexportableKeyService& key_service, const URLRequestContext* request_context, SessionStore* store); @@ -79,9 +95,11 @@ class NET_EXPORT SessionServiceImpl : public SessionService { DeferralParams deferral, RefreshCompleteCallback callback) override; - void SetChallengeForBoundSession(OnAccessCallback on_access_callback, - const GURL& request_url, - const SessionChallengeParam& param) override; + void SetChallengeForBoundSession( + OnAccessCallback on_access_callback, + const URLRequest& request, + const FirstPartySetMetadata& first_party_set_metadata, + const SessionChallengeParam& param) override; void GetAllSessionsAsync( base::OnceCallback&)> callback) @@ -101,7 +119,22 @@ class NET_EXPORT SessionServiceImpl : public SessionService { base::ScopedClosureRunner AddObserver( const GURL& url, base::RepeatingCallback callback) override; - Session* GetSession(const SessionKey& session_key) const; + const Session* GetSession(const SessionKey& session_key) const override; + void AddSession(const SchemefulSite& site, + SessionParams params, + base::span wrapped_key, + base::OnceCallback callback) override; + const SignedRefreshChallenge* GetLatestSignedRefreshChallenge( + const SessionKey& session_key) override; + void SetLatestSignedRefreshChallenge( + SessionKey session_key, + SignedRefreshChallenge signed_refresh_challenge) override; + bool SigningQuotaExceeded(const SchemefulSite& site) override; + void AddSigningOccurrence(const SchemefulSite& site) override; + + // The `SessionService` implementation has a const-qualified accessor + // for sessions. This overload allows for non-const access as well. + Session* GetSession(const SessionKey& session_key); private: friend class SessionServiceImplWithStoreTest; @@ -110,8 +143,10 @@ class NET_EXPORT SessionServiceImpl : public SessionService { // session id. using SessionsMap = std::map>; using DeferredRequestsMap = - std::unordered_map>; + std::map>; + using ProactiveRefreshMap = std::map; + using LatestSignedRefreshChallengesMap = + std::map; struct Observer { Observer(const GURL& url, @@ -129,21 +164,32 @@ class NET_EXPORT SessionServiceImpl : public SessionService { using ObserverSet = std::set, base::UniquePtrComparator>; + enum class RefreshTrigger { + // Refresh due to a request missing a bound cookie. + kMissingCookie, + // Proactive refresh due to a soon-to-expire bound cookie. + kProactive, + }; + void OnLoadSessionsComplete(SessionsMap sessions); - void OnRegistrationComplete( - OnAccessCallback on_access_callback, - RegistrationFetcher* fetcher, - base::expected params_or_error); - void OnRefreshRequestCompletion( - OnAccessCallback on_access_callback, - SessionKey session_key, - RegistrationFetcher* fetcher, - base::expected params_or_error); + void OnRegistrationComplete(OnAccessCallback on_access_callback, + bool is_google_subdomain_for_histograms, + RegistrationFetcher* fetcher, + RegistrationResult result); + void OnRefreshRequestCompletion(RefreshTrigger trigger, + OnAccessCallback on_access_callback, + SessionKey session_key, + RegistrationFetcher* fetcher, + RegistrationResult result); void AddSession(const SchemefulSite& site, std::unique_ptr session); - void UnblockDeferredRequests(const SessionKey& session_key, - RefreshResult result); + void UnblockDeferredRequests( + const SessionKey& session_key, + RefreshResult result, + std::optional is_proactive_refresh_candidate = std::nullopt, + std::optional minimum_proactive_refresh_threshold = + std::nullopt); // Get all the unexpired sessions for a given site. This also removes // expired sessions for the site and extends the TTL of used sessions. @@ -174,25 +220,26 @@ class NET_EXPORT SessionServiceImpl : public SessionService { SessionError::ErrorType OnRegistrationCompleteInternal( OnAccessCallback on_access_callback, RegistrationFetcher* fetcher, - base::expected params_or_error); + RegistrationResult result); // Helper function encapsulating the processing of refresh SessionError::ErrorType OnRefreshRequestCompletionInternal( OnAccessCallback on_access_callback, const SessionKey& session_key, RegistrationFetcher* fetcher, - base::expected params_or_error); + RegistrationResult result); // Callback after unwrapping a session key. `on_access_callback` is // used to notify the browser that this request led to usage of a // session. - void OnSessionKeyRestored(URLRequest* request, + void OnSessionKeyRestored(base::WeakPtr request, const SessionKey& session_key, OnAccessCallback on_access_callback, Session::KeyIdOrError key_id_or_error); // Helper function for starting a refresh - void RefreshSessionInternal(URLRequest* request, + void RefreshSessionInternal(RefreshTrigger trigger, + URLRequest* request, const SessionKey& session_key, Session* session, unexportable_keys::UnexportableKeyId key_id); @@ -208,6 +255,26 @@ class NET_EXPORT SessionServiceImpl : public SessionService { // null, does nothing. void RemoveFetcher(RegistrationFetcher* fetcher); + // Get the federated provider session specified by + // `registration_params`, if allowed. + base::expected GetFederatedProviderSessionIfValid( + const RegistrationFetcherParam& registration_params); + + void OnAddSessionKeyRestored( + const SchemefulSite& site, + SessionParams params, + base::OnceCallback callback, + unexportable_keys::ServiceErrorOr + key_or_error); + + // If `minimum_cookie_lifetime` is small enough and there are no + // pending refreshes for `session_key`, start a proactive refresh. + void MaybeStartProactiveRefresh( + SessionService::OnAccessCallback per_request_callback, + URLRequest* request, + const SessionKey& session_key, + base::TimeDelta minimum_cookie_lifetime); + // Whether we are waiting on the initial load of saved sessions to complete. bool pending_initialization_ = false; // Functions to call once initialization completes. @@ -223,9 +290,12 @@ class NET_EXPORT SessionServiceImpl : public SessionService { // true for testing purposes. bool ignore_refresh_quota_ = false; - // Deferred requests are stored by session ID. + // Deferred requests are stored by session key. DeferredRequestsMap deferred_requests_; + // Proactive refresh requests, stored by session key. + ProactiveRefreshMap proactive_requests_; + // Storage is similar to how CookieMonster stores its cookies. SessionsMap unpartitioned_sessions_; @@ -234,8 +304,21 @@ class NET_EXPORT SessionServiceImpl : public SessionService { // Per-site session refresh quota. In order to be robust across // session parameter changes, we enforce refresh quota for a site. + // This functionality is being replaced with `signing_times_`. std::map> refresh_times_; + // Per-site record of the most recent refresh result. This is used + // for histograms. + std::map refresh_last_result_; + + // Per-site session signing quota. In order to be robust across + // session parameter changes, we enforce signing quota for a site. + // This is updated whenever a site triggers signing. + std::map> signing_times_; + + // The latest signed challenges per session. + LatestSignedRefreshChallengesMap latest_signed_refresh_challenges_; + // Holds all currently live registration fetchers. std::set, base::UniquePtrComparator> registration_fetchers_; diff --git a/naiveproxy/src/net/device_bound_sessions/session_store_impl.cc b/naiveproxy/src/net/device_bound_sessions/session_store_impl.cc index 777842bcaf..59734a3b18 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_store_impl.cc +++ b/naiveproxy/src/net/device_bound_sessions/session_store_impl.cc @@ -15,6 +15,7 @@ #include "components/unexportable_keys/service_error.h" #include "components/unexportable_keys/unexportable_key_id.h" #include "components/unexportable_keys/unexportable_key_service.h" +#include "net/base/features.h" #include "net/base/schemeful_site.h" #include "net/device_bound_sessions/proto/storage.pb.h" @@ -35,7 +36,6 @@ constexpr base::TaskTraits kDBTaskTraits = { base::MayBlock(), base::TaskPriority::USER_VISIBLE, base::TaskShutdownBehavior::BLOCK_SHUTDOWN}; -const int kCurrentSchemaVersion = 1; const char kSessionTableName[] = "dbsc_session_tbl"; const base::TimeDelta kFlushDelay = base::Seconds(2); @@ -48,8 +48,11 @@ SessionStoreImpl::DBStatus InitializeOnDbSequence( return SessionStoreImpl::DBStatus::kFailure; } + // Control the schema version with a feature param so that the database can be + // wiped between Origin Trials and going into the final release. table_manager->InitializeOnDbSequence( - db, std::vector{kSessionTableName}, kCurrentSchemaVersion); + db, std::vector{kSessionTableName}, + features::kDeviceBoundSessionsSchemaVersion.Get()); session_data->InitializeOnDBSequence(); return SessionStoreImpl::DBStatus::kSuccess; diff --git a/naiveproxy/src/net/device_bound_sessions/session_store_impl.h b/naiveproxy/src/net/device_bound_sessions/session_store_impl.h index 80db666782..d98513d7b8 100644 --- a/naiveproxy/src/net/device_bound_sessions/session_store_impl.h +++ b/naiveproxy/src/net/device_bound_sessions/session_store_impl.h @@ -13,6 +13,7 @@ #include "base/functional/callback_forward.h" #include "base/gtest_prod_util.h" #include "base/memory/scoped_refptr.h" +#include "base/sequence_checker.h" #include "base/timer/elapsed_timer.h" #include "components/sqlite_proto/key_value_data.h" #include "components/sqlite_proto/key_value_table.h" diff --git a/naiveproxy/src/net/device_bound_sessions/test_support.cc b/naiveproxy/src/net/device_bound_sessions/test_support.cc index 99e18a2a57..7909b3def7 100644 --- a/naiveproxy/src/net/device_bound_sessions/test_support.cc +++ b/naiveproxy/src/net/device_bound_sessions/test_support.cc @@ -10,6 +10,7 @@ #include "base/base64url.h" #include "base/compiler_specific.h" #include "base/containers/to_vector.h" +#include "base/feature_list.h" #include "base/json/json_reader.h" #include "base/json/json_writer.h" #include "base/numerics/byte_conversions.h" @@ -19,6 +20,7 @@ #include "base/values.h" #include "crypto/evp.h" #include "crypto/signature_verifier.h" +#include "net/base/features.h" #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" #include "testing/gtest/include/gtest/gtest.h" @@ -71,6 +73,15 @@ std::string GetOriginTrialToken(const GURL& base_url) { return base::Base64Encode(token); } +std::optional GetQueryParameter(GURL url, const std::string& key) { + std::string result; + bool found = net::GetValueForKeyInQuery(url, key, &result); + if (!found) { + return std::nullopt; + } + return result; +} + std::unique_ptr RequestHandler( const GURL& base_url, const net::test_server::HttpRequest& request) { @@ -82,14 +93,17 @@ std::unique_ptr RequestHandler( return response; } else if (request.relative_url == "/dbsc_required") { response->AddCustomHeader( - "Sec-Session-Registration", + net::features::kDeviceBoundSessionsOriginTrialFeedback.Get() + ? "Secure-Session-Registration" + : "Sec-Session-Registration", "(RS256 " "ES256);challenge=\"challenge_value\";path=\"dbsc_register_session\""); response->set_content_type("text/html"); return response; } else if (request.relative_url == "/dbsc_register_session" || request.relative_url == "/dbsc_refresh_session") { - response->AddCustomHeader("Set-Cookie", "auth_cookie=abcdef0123;"); + response->AddCustomHeader("Set-Cookie", + "auth_cookie=abcdef0123;SameSite=None;Secure"); const auto registration_response = base::Value::Dict() @@ -97,17 +111,19 @@ std::unique_ptr RequestHandler( .Set("refresh_url", base_url.Resolve("/dbsc_refresh_session").spec()) .Set("scope", base::Value::Dict() + .Set("include_site", false) .Set("scope_specification", base::Value::List().Append( base::Value::Dict() .Set("type", "exclude") - .Set("domain", base_url.host()) + .Set("domain", base_url.GetHost()) .Set("path", "/favicon.ico")))) .Set("credentials", - base::Value::List().Append(base::Value::Dict() - .Set("type", "cookie") - .Set("name", "auth_cookie") - .Set("attributes", ""))); + base::Value::List().Append( + base::Value::Dict() + .Set("type", "cookie") + .Set("name", "auth_cookie") + .Set("attributes", "SameSite=None; Secure"))); std::optional json = base::WriteJson(registration_response); EXPECT_TRUE(json.has_value()); @@ -120,7 +136,28 @@ std::unique_ptr RequestHandler( R"*()*", base_url.Resolve("/dbsc_required").spec())); return response; - } else if (request.relative_url == "/ensure_authenticated") { + } else if (request.relative_url.starts_with("/set_early_challenge")) { + std::string challenge = request.GetURL().GetQuery(); + CHECK(!challenge.empty()); + response->AddCustomHeader( + net::features::kDeviceBoundSessionsOriginTrialFeedback.Get() + ? "Secure-Session-Challenge" + : "Sec-Session-Challenge", + "\"" + challenge + "\";id=\"session_id\""); + response->set_content_type("text/html"); + return response; + } else if (request.relative_url.starts_with("/ensure_authenticated")) { + std::optional expected_debug_header = + GetQueryParameter(request.GetURL(), "debug_header"); + auto debug_header_it = request.headers.find("Secure-Session-Skipped"); + std::string actual_debug_header = debug_header_it == request.headers.end() + ? std::string() + : debug_header_it->second; + if (expected_debug_header.has_value()) { + EXPECT_EQ(actual_debug_header, expected_debug_header); + } else { + EXPECT_EQ(actual_debug_header, ""); + } // We do a very coarse-grained cookie check here rather than parsing // cookies. auto it = request.headers.find("Cookie"); @@ -277,8 +314,10 @@ bool VerifyEs256Jwt(std::string_view jwt) { const std::string& payload64 = jwt_sections[1]; const std::string& signature64 = jwt_sections[2]; - std::string payload, signature; + std::string header, payload, signature; if (!base::Base64UrlDecode( + header64, base::Base64UrlDecodePolicy::DISALLOW_PADDING, &header) || + !base::Base64UrlDecode( payload64, base::Base64UrlDecodePolicy::DISALLOW_PADDING, &payload) || !base::Base64UrlDecode(signature64, base::Base64UrlDecodePolicy::DISALLOW_PADDING, @@ -286,14 +325,22 @@ bool VerifyEs256Jwt(std::string_view jwt) { return false; } - // Extract the JWK. + const std::optional header_json = + base::JSONReader::ReadDict(header, base::JSON_PARSE_CHROMIUM_EXTENSIONS); + if (!header_json) { + return false; + } const std::optional payload_json = - base::JSONReader::ReadDict(payload); + base::JSONReader::ReadDict(payload, base::JSON_PARSE_CHROMIUM_EXTENSIONS); if (!payload_json) { return false; } - const base::Value::Dict* jwk = payload_json->FindDict("key"); + // Extract the JWK. + const base::Value::Dict* jwk = + net::features::kDeviceBoundSessionsOriginTrialFeedback.Get() + ? header_json->FindDict("jwk") + : payload_json->FindDict("key"); if (!jwk) { return false; } @@ -328,18 +375,21 @@ ScopedTestRegistrationFetcher ScopedTestRegistrationFetcher::CreateWithSuccess( std::string_view origin_string) { return ScopedTestRegistrationFetcher(base::BindRepeating( [](const std::string& session_id, const std::string& refresh_url_string, - const std::string& origin_string) { + const std::string& origin_string, + RegistrationFetcher::RegistrationCompleteCallback callback) { std::vector cookie_credentials; cookie_credentials.push_back( SessionParams::Credential{"test_cookie", "secure"}); SessionParams::Scope scope; scope.include_site = true; scope.origin = origin_string; - return base::expected(SessionParams( - session_id, GURL(refresh_url_string), refresh_url_string, - std::move(scope), std::move(cookie_credentials), - unexportable_keys::UnexportableKeyId(), - /*allowed_refresh_initiators=*/{})); + std::move(callback).Run( + nullptr, + RegistrationResult(Session::CreateIfValid(SessionParams( + session_id, GURL(refresh_url_string), refresh_url_string, + std::move(scope), std::move(cookie_credentials), + unexportable_keys::UnexportableKeyId(), + /*allowed_refresh_initiators=*/{})))); }, std::string(session_id), std::string(refresh_url_string), std::string(origin_string))); @@ -350,9 +400,10 @@ ScopedTestRegistrationFetcher ScopedTestRegistrationFetcher::CreateWithFailure( SessionError::ErrorType error_type, std::string_view refresh_url_string) { return ScopedTestRegistrationFetcher(base::BindRepeating( - [](SessionError::ErrorType error_type, const GURL& refresh_url) { - return base::expected( - base::unexpected(SessionError{error_type})); + [](SessionError::ErrorType error_type, const GURL& refresh_url, + RegistrationFetcher::RegistrationCompleteCallback callback) { + return std::move(callback).Run( + nullptr, RegistrationResult(SessionError{error_type})); }, error_type, GURL(refresh_url_string))); } @@ -363,10 +414,11 @@ ScopedTestRegistrationFetcher::CreateWithTermination( std::string_view session_id, std::string_view refresh_url_string) { return ScopedTestRegistrationFetcher(base::BindRepeating( - [](const std::string& session_id, const std::string& refresh_url_string) { - return base::expected( - base::unexpected(SessionError{ - SessionError::ErrorType::kServerRequestedTermination})); + [](const std::string& session_id, const std::string& refresh_url_string, + RegistrationFetcher::RegistrationCompleteCallback callback) { + return std::move(callback).Run( + nullptr, RegistrationResult(SessionError{ + SessionError::kServerRequestedTermination})); }, std::string(session_id), std::string(refresh_url_string))); } diff --git a/naiveproxy/src/net/device_bound_sessions/test_support.h b/naiveproxy/src/net/device_bound_sessions/test_support.h index 54a6c4fbe7..1b968b929e 100644 --- a/naiveproxy/src/net/device_bound_sessions/test_support.h +++ b/naiveproxy/src/net/device_bound_sessions/test_support.h @@ -31,8 +31,7 @@ extern const char kTestOriginTrialPublicKey[]; EmbeddedTestServer::HandleRequestCallback GetTestRequestHandler( const GURL& base_url); -// Verify the signature of a JWT using the ES256 JWK stored in the "key" claim -// in its payload. +// Verify the signature of a JWT using the ES256 JWK stored in it. bool VerifyEs256Jwt(std::string_view jwt); #if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS) diff --git a/naiveproxy/src/net/device_bound_sessions/unexportable_key_service_factory.cc b/naiveproxy/src/net/device_bound_sessions/unexportable_key_service_factory.cc index 3f2b3f2406..1cca8b6111 100644 --- a/naiveproxy/src/net/device_bound_sessions/unexportable_key_service_factory.cc +++ b/naiveproxy/src/net/device_bound_sessions/unexportable_key_service_factory.cc @@ -5,6 +5,7 @@ #include "net/device_bound_sessions/unexportable_key_service_factory.h" #include "base/logging.h" +#include "build/branding_buildflags.h" #include "components/unexportable_keys/unexportable_key_service.h" #include "components/unexportable_keys/unexportable_key_service_impl.h" #include "components/unexportable_keys/unexportable_key_task_manager.h" @@ -12,10 +13,18 @@ namespace { +// TODO: crbug.com/443932320 - Replace all usages of this class with //chrome's +// `UnexportableKeyServiceFactory`. This already uses the version constants. #if BUILDFLAG(IS_MAC) -// TODO(crbug.com/384055845): Use the correct value for Secure Enclave constexpr char kKeychainAccessGroup[] = - ".org.chromium.Chromium.unexportable-keys"; +// Ideally we'd just use `MAC_TEAM_IDENTIFIER_STRING` and +// `MAC_BUNDLE_IDENTIFIER_STRING`, but we can't depend on //chrome here. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + "EQHXZ8M8AV.com.google.Chrome" +#else + ".org.chromium.Chromium" +#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) + ".unexportable-keys"; #endif // BUILDFLAG(IS_MAC) // Returns a newly created task manager instance, or nullptr if unexportable diff --git a/naiveproxy/src/net/device_bound_sessions/url_fetcher.cc b/naiveproxy/src/net/device_bound_sessions/url_fetcher.cc new file mode 100644 index 0000000000..692d373c75 --- /dev/null +++ b/naiveproxy/src/net/device_bound_sessions/url_fetcher.cc @@ -0,0 +1,122 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/device_bound_sessions/url_fetcher.h" + +#include "net/base/io_buffer.h" +#include "net/device_bound_sessions/session_binding_utils.h" +#include "net/url_request/url_request_context.h" + +namespace net::device_bound_sessions { + +namespace { + +constexpr net::NetworkTrafficAnnotationTag kRegistrationTrafficAnnotation = + net::DefineNetworkTrafficAnnotation("dbsc_registration", R"( + semantics { + sender: "Device Bound Session Credentials API" + description: + "Device Bound Session Credentials (DBSC) let a server create a " + "session with the local device. For more info see " + "https://github.com/WICG/dbsc." + trigger: + "Server sending a response with a Sec-Session-Registration header." + data: "A signed JWT with the new key created for this session." + destination: WEBSITE + last_reviewed: "2024-04-10" + user_data { + type: ACCESS_TOKEN + } + internal { + contacts { + email: "kristianm@chromium.org" + } + contacts { + email: "chrome-counter-abuse-alerts@google.com" + } + } + } + policy { + cookies_allowed: YES + cookies_store: "user" + setting: "There is no separate setting for this feature, but it will " + "follow the cookie settings." + policy_exception_justification: "Not implemented." + })"); + +constexpr int kBufferSize = 4096; + +} // namespace + +URLFetcher::URLFetcher(const URLRequestContext* context, + GURL url, + std::optional net_log_source) + : request_(context->CreateRequest(url, + IDLE, + this, + kRegistrationTrafficAnnotation, + /*is_for_websockets=*/false, + net_log_source)), + buf_(base::MakeRefCounted(kBufferSize)) {} + +URLFetcher::~URLFetcher() = default; + +void URLFetcher::Start(base::OnceClosure complete_callback) { + callback_ = std::move(complete_callback); + request_->Start(); +} + +void URLFetcher::OnResponseStarted(URLRequest* request, int net_error) { + net_error_ = net_error; + if (net_error != OK) { + std::move(callback_).Run(); + // `this` may be deleted. + return; + } + + HttpResponseHeaders* headers = request->response_headers(); + const int response_code = headers ? headers->response_code() : 0; + + if (response_code < 200 || response_code >= 300) { + std::move(callback_).Run(); + // `this` may be deleted. + return; + } + + // Initiate the first read. + int bytes_read_or_error = request->Read(buf_.get(), kBufferSize); + if (bytes_read_or_error >= 0) { + OnReadCompleted(request, bytes_read_or_error); + // `this` may be deleted. + return; + } else if (bytes_read_or_error != ERR_IO_PENDING) { + net_error_ = bytes_read_or_error; + std::move(callback_).Run(); + // `this` may be deleted. + return; + } +} + +void URLFetcher::OnReadCompleted(URLRequest* request, int bytes_read_or_error) { + data_received_.append(buf_->data(), bytes_read_or_error); + + while (bytes_read_or_error > 0) { + bytes_read_or_error = request->Read(buf_.get(), kBufferSize); + if (bytes_read_or_error > 0) { + data_received_.append(buf_->data(), bytes_read_or_error); + } + } + + if (bytes_read_or_error < 0 && bytes_read_or_error != ERR_IO_PENDING) { + net_error_ = bytes_read_or_error; + } + + if (bytes_read_or_error != ERR_IO_PENDING) { + std::move(callback_).Run(); + // `this` may be deleted. + return; + } +} + +} // namespace net::device_bound_sessions diff --git a/naiveproxy/src/net/device_bound_sessions/url_fetcher.h b/naiveproxy/src/net/device_bound_sessions/url_fetcher.h new file mode 100644 index 0000000000..d59a617376 --- /dev/null +++ b/naiveproxy/src/net/device_bound_sessions/url_fetcher.h @@ -0,0 +1,58 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_DEVICE_BOUND_SESSIONS_URL_FETCHER_H_ +#define NET_DEVICE_BOUND_SESSIONS_URL_FETCHER_H_ + +#include "net/url_request/url_request.h" + +namespace net { +class URLRequestContext; +} + +namespace net::device_bound_sessions { + +class URLFetcher : public URLRequest::Delegate { + public: + URLFetcher(const URLRequestContext* context, + GURL url, + std::optional net_log_source); + ~URLFetcher() override; + + void Start(base::OnceClosure complete_callback); + + URLRequest& request() { return *request_; } + const std::string& data_received() const { return data_received_; } + int net_error() const { return net_error_; } + const CookieAndLineAccessResultList& maybe_stored_cookies() const { + return request_->maybe_stored_cookies(); + } + + private: + // URLRequest::Delegate + + // TODO(crbug.com/438783632): Look into if OnAuthRequired might need to be + // customize for DBSC + + // TODO(crbug.com/438783633): Think about what to do for DBSC with + // OnCertificateRequested, leaning towards not supporting it but not sure. + + // Always cancel requests on SSL errors, this is the default implementation + // of OnSSLCertificateError. + + // This is always called unless the request is deleted before it is called. + void OnResponseStarted(URLRequest* request, int net_error) override; + + void OnReadCompleted(URLRequest* request, int bytes_read_or_error) override; + + std::unique_ptr request_; + scoped_refptr buf_; + std::string data_received_; + int net_error_ = OK; + base::OnceClosure callback_; +}; + +} // namespace net::device_bound_sessions + +#endif // NET_DEVICE_BOUND_SESSIONS_URL_FETCHER_H_ diff --git a/naiveproxy/src/net/disk_cache/blockfile/backend_impl.cc b/naiveproxy/src/net/disk_cache/blockfile/backend_impl.cc index 60d40eac2e..9fe2648443 100644 --- a/naiveproxy/src/net/disk_cache/blockfile/backend_impl.cc +++ b/naiveproxy/src/net/disk_cache/blockfile/backend_impl.cc @@ -65,7 +65,6 @@ const int kBaseTableLen = 64 * 1024; const int kTrimDelay = 10; BASE_FEATURE(kBlockfileCacheBackendDumpWithoutCrashing, - "BlockfileCacheBackendDumpWithoutCrashing", base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE_PARAM(double, @@ -1475,7 +1474,7 @@ void BackendImpl::AdjustMaxCacheSize(int table_len) { DCHECK(!table_len || data_->header.magic); // The user is not setting the size, let's figure it out. - int64_t available = base::SysInfo::AmountOfFreeDiskSpace(path_); + int64_t available = base::SysInfo::AmountOfFreeDiskSpace(path_).value_or(-1); if (available < 0) { max_size_ = kDefaultCacheSize; return; @@ -2092,11 +2091,12 @@ int BackendImpl::MaxBuffersSize() { // then cache the result. static const int max_buffers_size = ([]() { constexpr uint64_t kMaxMaxBuffersSize = 30 * 1024 * 1024; - const uint64_t total_memory = base::SysInfo::AmountOfPhysicalMemory(); - if (total_memory == 0u) { + const base::ByteCount total_memory = + base::SysInfo::AmountOfPhysicalMemory(); + if (total_memory.is_zero()) { return int{kMaxMaxBuffersSize}; } - const uint64_t two_percent = total_memory * 2 / 100; + const uint64_t two_percent = total_memory.InBytes() * 2 / 100; return static_cast(std::min(two_percent, kMaxMaxBuffersSize)); })(); diff --git a/naiveproxy/src/net/disk_cache/blockfile/entry_impl.h b/naiveproxy/src/net/disk_cache/blockfile/entry_impl.h index ab4e458a5c..43981504f1 100644 --- a/naiveproxy/src/net/disk_cache/blockfile/entry_impl.h +++ b/naiveproxy/src/net/disk_cache/blockfile/entry_impl.h @@ -12,6 +12,7 @@ #include #include "base/containers/heap_array.h" +#include "base/memory/ref_counted.h" #include "net/base/net_export.h" #include "net/disk_cache/blockfile/disk_format.h" #include "net/disk_cache/blockfile/storage_block-inl.h" diff --git a/naiveproxy/src/net/disk_cache/blockfile/file_ios.cc b/naiveproxy/src/net/disk_cache/blockfile/file_ios.cc index 92ebaee91c..04a65446e2 100644 --- a/naiveproxy/src/net/disk_cache/blockfile/file_ios.cc +++ b/naiveproxy/src/net/disk_cache/blockfile/file_ios.cc @@ -69,8 +69,8 @@ class FileBackgroundIO : public disk_cache::BackgroundIO { raw_ptr callback_; - raw_ptr file_; - base::raw_span buffer_; + raw_ptr file_; + base::raw_span buffer_; size_t offset_; }; diff --git a/naiveproxy/src/net/disk_cache/disk_cache.cc b/naiveproxy/src/net/disk_cache/disk_cache.cc index 7d04b64893..cf3696d1eb 100644 --- a/naiveproxy/src/net/disk_cache/disk_cache.cc +++ b/naiveproxy/src/net/disk_cache/disk_cache.cc @@ -471,6 +471,8 @@ uint8_t Backend::GetEntryInMemoryData(const std::string& key) { void Backend::SetEntryInMemoryData(const std::string& key, uint8_t data) {} +void Backend::OnBrowserIdle() {} + EntryResult::EntryResult() = default; EntryResult::~EntryResult() = default; diff --git a/naiveproxy/src/net/disk_cache/disk_cache.h b/naiveproxy/src/net/disk_cache/disk_cache.h index fe34bd6199..d73a075e49 100644 --- a/naiveproxy/src/net/disk_cache/disk_cache.h +++ b/naiveproxy/src/net/disk_cache/disk_cache.h @@ -17,6 +17,7 @@ #include "base/files/file.h" #include "base/memory/ref_counted.h" +#include "base/sequence_checker.h" #include "base/strings/string_split.h" #include "base/task/sequenced_task_runner.h" #include "base/time/time.h" @@ -320,6 +321,9 @@ class NET_EXPORT Backend { // Returns the maximum length an individual stream can have. virtual int64_t MaxFileSize() const = 0; + // Called when the browser is detected to be idle. + virtual void OnBrowserIdle(); + private: const net::CacheType cache_type_; }; diff --git a/naiveproxy/src/net/disk_cache/disk_cache_test_base.cc b/naiveproxy/src/net/disk_cache/disk_cache_test_base.cc index e1497f5732..c74e4e415a 100644 --- a/naiveproxy/src/net/disk_cache/disk_cache_test_base.cc +++ b/naiveproxy/src/net/disk_cache/disk_cache_test_base.cc @@ -32,7 +32,9 @@ #include "testing/gtest/include/gtest/gtest.h" #if BUILDFLAG(ENABLE_DISK_CACHE_SQL_BACKEND) +#include "base/test/test_future.h" #include "net/disk_cache/sql/sql_backend_impl.h" +#include "net/disk_cache/sql/sql_persistent_store.h" #endif // ENABLE_DISK_CACHE_SQL_BACKEND using net::test::IsOk; @@ -141,6 +143,17 @@ void DiskCacheTestWithCache::SetTestMode() { cache_impl_->SetUnitTestMode(); } +#if BUILDFLAG(ENABLE_DISK_CACHE_SQL_BACKEND) +void DiskCacheTestWithCache::LoadInMemoryIndex() { + ASSERT_EQ(backend_to_test_, BackendToTest::kSql); + CHECK(sql_cache_impl_); + base::test::TestFuture future; + ASSERT_TRUE(sql_cache_impl_->GetSqlStoreForTest()->MaybeLoadInMemoryIndex( + future.GetCallback())); + ASSERT_EQ(future.Get(), disk_cache::SqlPersistentStore::Error::kOk); +} +#endif // ENABLE_DISK_CACHE_SQL_BACKEND + void DiskCacheTestWithCache::SetMaxSize(int64_t size) { size_ = size; // Cache size should not generally be changed dynamically; it takes @@ -393,18 +406,21 @@ void DiskCacheTestWithCache::TearDown() { void DiskCacheTestWithCache::ResetCaches() { #if BUILDFLAG(ENABLE_DISK_CACHE_SQL_BACKEND) - scoped_refptr background_task_runner; + std::vector> background_task_runners; if (sql_cache_impl_) { - background_task_runner = sql_cache_impl_->GetBackgroundTaskRunnerForTest(); + background_task_runners = + sql_cache_impl_->GetBackgroundTaskRunnersForTest(); } #endif // ENABLE_DISK_CACHE_SQL_BACKEND std::unique_ptr cache = TakeCache(); cache.reset(); #if BUILDFLAG(ENABLE_DISK_CACHE_SQL_BACKEND) - if (background_task_runner) { - base::RunLoop run_loop; - background_task_runner->PostTask(FROM_HERE, run_loop.QuitClosure()); - run_loop.Run(); + if (!background_task_runners.empty()) { + for (auto background_task_runner : background_task_runners) { + base::RunLoop run_loop; + background_task_runner->PostTask(FROM_HERE, run_loop.QuitClosure()); + run_loop.Run(); + } } #endif // ENABLE_DISK_CACHE_SQL_BACKEND } diff --git a/naiveproxy/src/net/disk_cache/disk_cache_test_base.h b/naiveproxy/src/net/disk_cache/disk_cache_test_base.h index 1dc8fbb098..6fcab30ecd 100644 --- a/naiveproxy/src/net/disk_cache/disk_cache_test_base.h +++ b/naiveproxy/src/net/disk_cache/disk_cache_test_base.h @@ -109,6 +109,9 @@ class DiskCacheTestWithCache : public DiskCacheTest { void InitCache(); void SimulateCrash(); void SetTestMode(); +#if BUILDFLAG(ENABLE_DISK_CACHE_SQL_BACKEND) + void LoadInMemoryIndex(); +#endif // ENABLE_DISK_CACHE_SQL_BACKEND void SetBackendToTest(BackendToTest backend_to_test) { backend_to_test_ = backend_to_test; diff --git a/naiveproxy/src/net/disk_cache/memory/mem_backend_impl.cc b/naiveproxy/src/net/disk_cache/memory/mem_backend_impl.cc index 91486fd0de..25e4fff5c7 100644 --- a/naiveproxy/src/net/disk_cache/memory/mem_backend_impl.cc +++ b/naiveproxy/src/net/disk_cache/memory/mem_backend_impl.cc @@ -45,10 +45,10 @@ base::LinkNode* NextSkippingChildren( MemBackendImpl::MemBackendImpl(net::NetLog* net_log) : Backend(net::MEMORY_CACHE), net_log_(net_log), - memory_pressure_listener_( + memory_pressure_listener_registration_( FROM_HERE, - base::BindRepeating(&MemBackendImpl::OnMemoryPressure, - base::Unretained(this))) {} + base::MemoryPressureListenerTag::kMemBackend, + this) {} MemBackendImpl::~MemBackendImpl() { while (!entries_.empty()) @@ -76,7 +76,7 @@ bool MemBackendImpl::Init() { if (max_size_) return true; - uint64_t total_memory = base::SysInfo::AmountOfPhysicalMemory(); + uint64_t total_memory = base::SysInfo::AmountOfPhysicalMemory().InBytes(); if (total_memory == 0) { max_size_ = kDefaultInMemoryCacheSize; @@ -337,14 +337,14 @@ void MemBackendImpl::EvictTill(int target_size) { } void MemBackendImpl::OnMemoryPressure( - base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { + base::MemoryPressureLevel memory_pressure_level) { switch (memory_pressure_level) { - case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE: + case base::MEMORY_PRESSURE_LEVEL_NONE: break; - case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE: + case base::MEMORY_PRESSURE_LEVEL_MODERATE: EvictTill(max_size_ / 2); break; - case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL: + case base::MEMORY_PRESSURE_LEVEL_CRITICAL: EvictTill(max_size_ / 10); break; } diff --git a/naiveproxy/src/net/disk_cache/memory/mem_backend_impl.h b/naiveproxy/src/net/disk_cache/memory/mem_backend_impl.h index e4529775ff..87b28520ff 100644 --- a/naiveproxy/src/net/disk_cache/memory/mem_backend_impl.h +++ b/naiveproxy/src/net/disk_cache/memory/mem_backend_impl.h @@ -36,7 +36,9 @@ namespace disk_cache { // This class implements the Backend interface. An object of this class handles // the operations of the cache without writing to disk. -class NET_EXPORT_PRIVATE MemBackendImpl final : public Backend { +class NET_EXPORT_PRIVATE MemBackendImpl final + : public Backend, + public base::MemoryPressureListener { public: explicit MemBackendImpl(net::NetLog* net_log); @@ -140,7 +142,7 @@ class NET_EXPORT_PRIVATE MemBackendImpl final : public Backend { // Called when we get low on memory. void OnMemoryPressure( - base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level); + base::MemoryPressureLevel memory_pressure_level) override; raw_ptr custom_clock_for_testing_ = nullptr; // usually nullptr. @@ -156,7 +158,8 @@ class NET_EXPORT_PRIVATE MemBackendImpl final : public Backend { raw_ptr net_log_; base::OnceClosure post_cleanup_callback_; - base::MemoryPressureListener memory_pressure_listener_; + base::AsyncMemoryPressureListenerRegistration + memory_pressure_listener_registration_; base::WeakPtrFactory weak_factory_{this}; }; diff --git a/naiveproxy/src/net/disk_cache/simple/simple_backend_impl.cc b/naiveproxy/src/net/disk_cache/simple/simple_backend_impl.cc index 730d05d27b..7b049de7cc 100644 --- a/naiveproxy/src/net/disk_cache/simple/simple_backend_impl.cc +++ b/naiveproxy/src/net/disk_cache/simple/simple_backend_impl.cc @@ -764,7 +764,8 @@ SimpleBackendImpl::DiskStatResult SimpleBackendImpl::InitCacheStructureOnDisk( } else { result.cache_dir_mtime = file_info->last_modified; if (!result.max_size) { - int64_t available = base::SysInfo::AmountOfFreeDiskSpace(path); + int64_t available = + base::SysInfo::AmountOfFreeDiskSpace(path).value_or(-1); result.max_size = disk_cache::PreferredCacheSize(available, cache_type); DCHECK(result.max_size); } diff --git a/naiveproxy/src/net/disk_cache/simple/simple_index.cc b/naiveproxy/src/net/disk_cache/simple/simple_index.cc index fd53e5e5c7..10bb662ad4 100644 --- a/naiveproxy/src/net/disk_cache/simple/simple_index.cc +++ b/naiveproxy/src/net/disk_cache/simple/simple_index.cc @@ -677,8 +677,8 @@ void SimpleIndex::MergeInitializingSet( if (load_result->flush_required) WriteToDisk(INDEX_WRITE_REASON_STARTUP_MERGE); - SIMPLE_CACHE_UMA(CUSTOM_COUNTS, "IndexNumEntriesOnInit", cache_type_, - entries_set_.size(), 0, 100000, 50); + SIMPLE_CACHE_UMA(CUSTOM_COUNTS, "IndexNumEntriesOnInit2", cache_type_, + entries_set_.size(), 0, 1000000, 50); SIMPLE_CACHE_UMA( MEMORY_MEDIUM_MB, "CacheSizeOnInit2", cache_type_, static_cast(cache_size_ / kBytesInMiB)); diff --git a/naiveproxy/src/net/disk_cache/simple/simple_util.cc b/naiveproxy/src/net/disk_cache/simple/simple_util.cc index ac20cba388..60cdcce3c2 100644 --- a/naiveproxy/src/net/disk_cache/simple/simple_util.cc +++ b/naiveproxy/src/net/disk_cache/simple/simple_util.cc @@ -113,6 +113,13 @@ uint32_t Crc32(const char* data, int length) { return crc32(empty_crc, reinterpret_cast(data), length); } +uint32_t IncrementalCrc32(uint32_t previous_crc, + base::span data) { + auto chars = base::as_chars(data); + return IncrementalCrc32(previous_crc, chars.data(), + base::checked_cast(data.size())); +} + uint32_t IncrementalCrc32(uint32_t previous_crc, const char* data, int length) { return crc32(previous_crc, reinterpret_cast(data), length); } diff --git a/naiveproxy/src/net/disk_cache/simple/simple_util.h b/naiveproxy/src/net/disk_cache/simple/simple_util.h index 5918394d34..add54ff214 100644 --- a/naiveproxy/src/net/disk_cache/simple/simple_util.h +++ b/naiveproxy/src/net/disk_cache/simple/simple_util.h @@ -78,9 +78,12 @@ NET_EXPORT_PRIVATE int GetFileIndexFromStreamIndex(int stream_index); NET_EXPORT_PRIVATE bool SimpleCacheDeleteFile(const base::FilePath& path); // Prefer span form for new code. -uint32_t Crc32(base::span data); +NET_EXPORT_PRIVATE uint32_t Crc32(base::span data); uint32_t Crc32(const char* data, int length); +// Prefer span form for new code. +NET_EXPORT_PRIVATE uint32_t IncrementalCrc32(uint32_t previous_crc, + base::span data); uint32_t IncrementalCrc32(uint32_t previous_crc, const char* data, int length); } // namespace disk_cache::simple_util diff --git a/naiveproxy/src/net/disk_cache/sql/DEPS b/naiveproxy/src/net/disk_cache/sql/DEPS index 9a8dc3ddbe..15d232f793 100644 --- a/naiveproxy/src/net/disk_cache/sql/DEPS +++ b/naiveproxy/src/net/disk_cache/sql/DEPS @@ -1,3 +1,5 @@ include_rules = [ + "+components/performance_manager/scenario_api/performance_scenarios.h", + "+components/performance_manager/scenario_api/performance_scenario_test_support.h", "+sql" ] diff --git a/naiveproxy/src/net/disk_cache/sql/cache_entry_key.cc b/naiveproxy/src/net/disk_cache/sql/cache_entry_key.cc index 575d114366..398f3ff1a0 100644 --- a/naiveproxy/src/net/disk_cache/sql/cache_entry_key.cc +++ b/naiveproxy/src/net/disk_cache/sql/cache_entry_key.cc @@ -5,11 +5,13 @@ #include "net/disk_cache/sql/cache_entry_key.h" #include "base/check.h" +#include "base/hash/hash.h" namespace disk_cache { CacheEntryKey::CacheEntryKey(std::string str) - : data_(base::MakeRefCounted(std::move(str))) {} + : data_(base::MakeRefCounted(std::move(str))), + hash_(static_cast(base::PersistentHash(string()))) {} CacheEntryKey::~CacheEntryKey() = default; @@ -23,7 +25,8 @@ bool CacheEntryKey::operator<(const CacheEntryKey& other) const { } bool CacheEntryKey::operator==(const CacheEntryKey& other) const { - return data_ == other.data_ || string() == other.string(); + return data_ == other.data_ || + (hash() == other.hash() && string() == other.string()); } const std::string& CacheEntryKey::string() const { diff --git a/naiveproxy/src/net/disk_cache/sql/cache_entry_key.h b/naiveproxy/src/net/disk_cache/sql/cache_entry_key.h index 97810b6fc3..d895ea9010 100644 --- a/naiveproxy/src/net/disk_cache/sql/cache_entry_key.h +++ b/naiveproxy/src/net/disk_cache/sql/cache_entry_key.h @@ -10,6 +10,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/ref_counted_memory.h" +#include "base/types/strong_alias.h" #include "net/base/net_export.h" namespace disk_cache { @@ -36,6 +37,8 @@ namespace disk_cache { // the main cache key string. class NET_EXPORT_PRIVATE CacheEntryKey { public: + using Hash = base::StrongAlias; + explicit CacheEntryKey(std::string str = ""); ~CacheEntryKey(); @@ -48,9 +51,11 @@ class NET_EXPORT_PRIVATE CacheEntryKey { bool operator==(const CacheEntryKey& other) const; const std::string& string() const; + Hash hash() const { return hash_; } private: scoped_refptr data_; + Hash hash_; }; } // namespace disk_cache @@ -62,7 +67,8 @@ namespace std { template <> struct hash { std::size_t operator()(const disk_cache::CacheEntryKey& k) const { - return std::hash{}(k.string()); + // Narrowing conversion happens when sizeof(std::size_t) is less than 64. + return k.hash().value(); } }; diff --git a/naiveproxy/src/net/disk_cache/sql/eviction_candidate_aggregator.cc b/naiveproxy/src/net/disk_cache/sql/eviction_candidate_aggregator.cc new file mode 100644 index 0000000000..2e08584ac3 --- /dev/null +++ b/naiveproxy/src/net/disk_cache/sql/eviction_candidate_aggregator.cc @@ -0,0 +1,136 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/disk_cache/sql/eviction_candidate_aggregator.h" + +#include +#include + +#include "base/functional/bind.h" +#include "base/task/sequenced_task_runner.h" + +namespace disk_cache { + +EvictionCandidateAggregator::EvictionCandidate::EvictionCandidate( + SqlPersistentStore::ResId res_id, + SqlPersistentStore::ShardId shard_id, + int64_t bytes_usage, + base::Time last_used) + : res_id(res_id), + shard_id(shard_id), + bytes_usage(bytes_usage), + last_used(last_used) {} +EvictionCandidateAggregator::EvictionCandidate::~EvictionCandidate() = default; +EvictionCandidateAggregator::EvictionCandidate::EvictionCandidate( + EvictionCandidate&&) = default; +EvictionCandidateAggregator::EvictionCandidate& +EvictionCandidateAggregator::EvictionCandidate::operator=(EvictionCandidate&&) = + default; + +EvictionCandidateAggregator::EvictionCandidateAggregator( + int64_t size_to_be_removed, + std::vector> task_runners) + : size_to_be_removed_(size_to_be_removed), + task_runners_(std::move(task_runners)), + selected_callbacks_(task_runners_.size()) { + candidates_per_shard_.reserve(task_runners_.size()); +} + +void EvictionCandidateAggregator::OnCandidate( + SqlPersistentStore::ShardId shard_id, + EvictionCandidateList candidate, + EvictionCandidateSelectedCallback selected_callback) { + CHECK(task_runners_[shard_id.value()]->RunsTasksInCurrentSequence()); + std::vector candidates_per_shard; + std::vector selected_callbacks; + if (!AddCandidates(shard_id, std::move(candidate), + std::move(selected_callback), candidates_per_shard, + selected_callbacks)) { + return; + } + AggregateCandidatesAndRunCallbacks(std::move(candidates_per_shard), + std::move(selected_callbacks), shard_id); +} + +EvictionCandidateAggregator::~EvictionCandidateAggregator() = default; + +bool EvictionCandidateAggregator::AddCandidates( + SqlPersistentStore::ShardId shard_id, + EvictionCandidateList new_candidates, + EvictionCandidateSelectedCallback new_selected_callback, + std::vector& candidates_per_shard_out, + std::vector& selected_callbacks_out) { + base::AutoLock auto_lock(lock_); + candidates_per_shard_.emplace_back(std::move(new_candidates)); + selected_callbacks_[shard_id.value()] = std::move(new_selected_callback); + if (candidates_per_shard_.size() != GetSizeOfShards()) { + return false; + } + candidates_per_shard_out = std::move(candidates_per_shard_); + selected_callbacks_out = std::move(selected_callbacks_); + return true; +} + +void EvictionCandidateAggregator::AggregateCandidatesAndRunCallbacks( + std::vector candidates_per_shard, + std::vector selected_callbacks, + SqlPersistentStore::ShardId last_shard_id) { + size_t all_candidate_count = 0; + for (const auto& candidates : candidates_per_shard) { + all_candidate_count += candidates.size(); + } + EvictionCandidateList all_candidates; + all_candidates.reserve(all_candidate_count); + for (auto& candidates : candidates_per_shard) { + all_candidates.insert(all_candidates.end(), + std::make_move_iterator(candidates.begin()), + std::make_move_iterator(candidates.end())); + } + // Sort candidates by last_used time, oldest first. + std::sort( + all_candidates.begin(), all_candidates.end(), + [](const auto& a, const auto& b) { return a.last_used < b.last_used; }); + + std::vector> + selected_res_ids_per_shard(GetSizeOfShards()); + std::vector bytes_usage_per_shard(GetSizeOfShards()); + int64_t removed_total_size = 0; + for (const EvictionCandidate& candidate : all_candidates) { + removed_total_size += candidate.bytes_usage; + bytes_usage_per_shard[candidate.shard_id.value()] += candidate.bytes_usage; + selected_res_ids_per_shard[candidate.shard_id.value()].emplace_back( + candidate.res_id); + if (removed_total_size > size_to_be_removed_) { + break; + } + } + + // Post the eviction tasks back to each shard. + for (size_t i = 0; i < GetSizeOfShards(); ++i) { + if (i == last_shard_id.value()) { + // The last shard's callback is run on the current thread, so we skip + // it here. + continue; + } + task_runners_[i]->PostTask( + FROM_HERE, + base::BindOnce(std::move(selected_callbacks[i]), + std::move(selected_res_ids_per_shard[i]), + bytes_usage_per_shard[i], base::TimeTicks::Now())); + } + + // Run the last shard's callback on the current thread to avoid an + // unnecessary thread hop. + DCHECK(task_runners_[last_shard_id.value()]->RunsTasksInCurrentSequence()); + std::move(selected_callbacks[last_shard_id.value()]) + .Run(std::move(selected_res_ids_per_shard[last_shard_id.value()]), + bytes_usage_per_shard[last_shard_id.value()], + base::TimeTicks::Now()); +} + +size_t EvictionCandidateAggregator::GetSizeOfShards() const { + return task_runners_.size(); +} + +} // namespace disk_cache diff --git a/naiveproxy/src/net/disk_cache/sql/eviction_candidate_aggregator.h b/naiveproxy/src/net/disk_cache/sql/eviction_candidate_aggregator.h new file mode 100644 index 0000000000..1e1603a73a --- /dev/null +++ b/naiveproxy/src/net/disk_cache/sql/eviction_candidate_aggregator.h @@ -0,0 +1,109 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_DISK_CACHE_SQL_EVICTION_CANDIDATE_AGGREGATOR_H_ +#define NET_DISK_CACHE_SQL_EVICTION_CANDIDATE_AGGREGATOR_H_ + +#include + +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" +#include "base/sequence_checker.h" +#include "base/synchronization/lock.h" +#include "base/task/sequenced_task_runner.h" +#include "net/base/net_export.h" +#include "net/disk_cache/sql/sql_persistent_store.h" + +namespace disk_cache { + +// `EvictionCandidateAggregator` is a thread-safe class responsible for +// collecting eviction candidates from multiple shards, aggregating them, and +// then selecting which entries to evict based on the least recently used +// policy. +class NET_EXPORT_PRIVATE EvictionCandidateAggregator + : public base::RefCountedThreadSafe { + public: + struct NET_EXPORT_PRIVATE EvictionCandidate { + EvictionCandidate(SqlPersistentStore::ResId res_id, + SqlPersistentStore::ShardId shard_id, + int64_t bytes_usage, + base::Time last_used); + ~EvictionCandidate(); + EvictionCandidate(EvictionCandidate&&); + EvictionCandidate& operator=(EvictionCandidate&&); + + SqlPersistentStore::ResId res_id; + SqlPersistentStore::ShardId shard_id; + int64_t bytes_usage; + base::Time last_used; + }; + + using EvictionCandidateList = std::vector; + using EvictionCandidateSelectedCallback = + base::OnceCallback, + int64_t bytes_usage, + base::TimeTicks post_task_time)>; + + explicit EvictionCandidateAggregator( + int64_t size_to_be_removed, + std::vector> task_runners); + + // Called by each shard to provide its list of eviction candidates on the task + // runner assigned to the shard. + // Once all shards have reported, this aggregates the candidates, selects + // entries for eviction, and invokes `selected_callback` for each shard on its + // corresponding SequencedTaskRunner from the `task_runners` vector passed to + // the constructor. The callback for the *last* reporting shard is run + // synchronously within this call, while others are posted as tasks. + void OnCandidate(SqlPersistentStore::ShardId shard_id, + EvictionCandidateList candidate, + EvictionCandidateSelectedCallback selected_callback); + + private: + friend class base::RefCountedThreadSafe; + ~EvictionCandidateAggregator(); + + // Safely adds a shard's candidates to the aggregation. Once all shards have + // reported, returns true and the collected candidates and callbacks are moved + // into `candidates_per_shard_out` and `selected_callbacks_out`. + bool AddCandidates( + SqlPersistentStore::ShardId shard_id, + EvictionCandidateList new_candidates, + EvictionCandidateSelectedCallback new_selected_callback, + std::vector& candidates_per_shard_out, + std::vector& selected_callbacks_out); + + // Aggregates candidates from all shards, sorts them by last-used time, + // selects entries for eviction, and then posts tasks back to each shard with + // the list of entries to be deleted. + void AggregateCandidatesAndRunCallbacks( + std::vector candidates_per_shard, + std::vector selected_callbacks, + SqlPersistentStore::ShardId last_shard_id); + + size_t GetSizeOfShards() const; + + // The total size of entries to be removed. + const int64_t size_to_be_removed_; + // The task runners for each shard, used to post back the eviction tasks. + const std::vector> task_runners_; + + // Protects access to `candidates_per_shard_` and `selected_callbacks_`. + base::Lock lock_; + + // A list of eviction candidates from each shard. This is not ordered by + // ShardID, but in the order that OnCandidate was called. + std::vector candidates_per_shard_ GUARDED_BY(lock_); + + // Callbacks to run on each shard after the eviction candidates have been + // selected. This is ordered by ShardId. + std::vector selected_callbacks_ + GUARDED_BY(lock_); + + SEQUENCE_CHECKER(sequence_checker_); +}; + +} // namespace disk_cache + +#endif // NET_DISK_CACHE_SQL_EVICTION_CANDIDATE_AGGREGATOR_H_ diff --git a/naiveproxy/src/net/disk_cache/sql/indexed_pair_set.h b/naiveproxy/src/net/disk_cache/sql/indexed_pair_set.h new file mode 100644 index 0000000000..2ac0565440 --- /dev/null +++ b/naiveproxy/src/net/disk_cache/sql/indexed_pair_set.h @@ -0,0 +1,176 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_DISK_CACHE_SQL_INDEXED_PAIR_SET_H_ +#define NET_DISK_CACHE_SQL_INDEXED_PAIR_SET_H_ + +#include + +#include "base/check.h" +#include "net/base/net_export.h" +#include "third_party/abseil-cpp/absl/container/flat_hash_map.h" +#include "third_party/abseil-cpp/absl/container/flat_hash_set.h" + +namespace disk_cache { + +// IndexedPairSet is a memory-efficient data structure that stores a set of +// unique (Key, Value) pairs. It is optimized for cases where keys typically +// have only one associated value, but it can accommodate multiple values per +// key. +// +// To conserve memory, this class avoids the overhead of a nested container +// (like absl::flat_hash_map>) for the +// common case of a single value per key. It achieves this by storing the first +// value for a key in a primary map (`primary_map_`). Subsequent, unique values +// for the same key are stored in a secondary map (`secondary_map_`) that maps +// keys to a set of additional values. +// +// This design enables a fast `Contains(key)` lookup, as it only requires +// checking the primary map. However, this optimization makes `Insert` and +// `Remove` operations more complex. For instance, if the representative value +// in the primary map is removed, a new value from the secondary map must be +// promoted to take its place, if one exists. +template +class NET_EXPORT_PRIVATE IndexedPairSet { + public: + IndexedPairSet() = default; + ~IndexedPairSet() = default; + + IndexedPairSet(const IndexedPairSet&) = delete; + IndexedPairSet& operator=(const IndexedPairSet&) = delete; + + IndexedPairSet(IndexedPairSet&& other) noexcept + : primary_map_(std::move(other.primary_map_)), + secondary_map_(std::move(other.secondary_map_)), + size_(other.size_) { + other.size_ = 0; + } + + IndexedPairSet& operator=(IndexedPairSet&& other) noexcept { + if (this == &other) { + return *this; + } + primary_map_ = std::move(other.primary_map_); + secondary_map_ = std::move(other.secondary_map_); + size_ = other.size_; + other.size_ = 0; + return *this; + } + + // Inserts a key-value pair if it does not already exist. + // Returns true if the pair was inserted, false if it already existed. + bool Insert(Key key, Value value) { + auto primary_it = primary_map_.find(key); + if (primary_it == primary_map_.end()) { + // Key is new, insert into primary_map. + primary_map_.insert({key, value}); + size_++; + return true; + } + + if (primary_it->second == value) { + // Exact pair already exists in primary_map. + return false; + } + auto insert_result = secondary_map_[key].insert(value); + if (insert_result.second) { + size_++; + return true; + } + // Exact pair already exists in secondary_map_. + return false; + } + + // Finds all values associated with a given key. + std::vector Find(Key key) const { + std::vector results; + auto primary_it = primary_map_.find(key); + if (primary_it == primary_map_.end()) { + return results; + } + + results.push_back(primary_it->second); + + auto secondary_it = secondary_map_.find(key); + if (secondary_it != secondary_map_.end()) { + results.insert(results.end(), secondary_it->second.begin(), + secondary_it->second.end()); + } + return results; + } + + // Removes a specific key-value pair. Returns true if the pair was found and + // removed, false otherwise. + bool Remove(Key key, Value value) { + auto primary_it = primary_map_.find(key); + if (primary_it == primary_map_.end()) { + return false; // Key does not exist. + } + + if (primary_it->second == value) { + // The value to remove is in the primary_map. + auto secondary_it = secondary_map_.find(key); + if (secondary_it != secondary_map_.end()) { + // Promote a value from secondary_map_. + CHECK(!secondary_it->second.empty()); + auto& secondary_set = secondary_it->second; + Value new_base_value = *secondary_set.begin(); + secondary_set.erase(secondary_set.begin()); + primary_it->second = new_base_value; + if (secondary_set.empty()) { + secondary_map_.erase(secondary_it); + } + } else { + // No additional values, just remove from primary_map. + primary_map_.erase(primary_it); + } + size_--; + return true; + } + + // The value to remove is not in primary_map, check secondary_map_. + auto secondary_it = secondary_map_.find(key); + if (secondary_it != secondary_map_.end()) { + if (secondary_it->second.erase(value) > 0) { + if (secondary_it->second.empty()) { + secondary_map_.erase(secondary_it); + } + size_--; + return true; + } + } + // Value not found. + return false; + } + + // Returns true if the given key exists. This is a fast lookup. + bool Contains(Key key) const { return primary_map_.contains(key); } + + // Returns the total number of elements in the set. + size_t size() const { return size_; } + + // Returns true if the set is empty. + bool empty() const { return size_ == 0; } + + // Removes all elements from the set. + void Clear() { + primary_map_.clear(); + secondary_map_.clear(); + size_ = 0; + } + + // Test-only methods + bool SecondaryMapContainsKeyForTesting(const Key& key) const { + return secondary_map_.contains(key); + } + + private: + absl::flat_hash_map primary_map_; + absl::flat_hash_map> secondary_map_; + size_t size_ = 0; +}; + +} // namespace disk_cache + +#endif // NET_DISK_CACHE_SQL_INDEXED_PAIR_SET_H_ diff --git a/naiveproxy/src/net/disk_cache/sql/sql_backend_constants.h b/naiveproxy/src/net/disk_cache/sql/sql_backend_constants.h index bfbcec974f..1441bda047 100644 --- a/naiveproxy/src/net/disk_cache/sql/sql_backend_constants.h +++ b/naiveproxy/src/net/disk_cache/sql/sql_backend_constants.h @@ -29,8 +29,12 @@ inline constexpr std::string_view kSqlBackendMetaTableKeyEntryCount = inline constexpr std::string_view kSqlBackendMetaTableKeyTotalSize = "TotalSize"; -inline constexpr base::FilePath::CharType kSqlBackendDatabaseFileName[] = - FILE_PATH_LITERAL("sqldb"); +// The file name prefix of the SQL backend database shards. +inline constexpr std::string_view kSqlBackendDatabaseFileNamePrefix = "sqldb"; + +// The file name of the first shard of the SQL backend database. +inline constexpr base::FilePath::CharType kSqlBackendDatabaseShard0FileName[] = + FILE_PATH_LITERAL("sqldb0"); // The name of the fake index file. This file is created to signal the presence // of the SQL backend and to prevent other backends from trying to use the same @@ -38,24 +42,45 @@ inline constexpr base::FilePath::CharType kSqlBackendDatabaseFileName[] = inline constexpr base::FilePath::CharType kSqlBackendFakeIndexFileName[] = FILE_PATH_LITERAL("index"); -// The magic number for the fake index file. This is "SQLCache" in -// little-endian. -inline constexpr uint64_t kSqlBackendFakeIndexMagicNumber = - UINT64_C(0x65686361434c5153); +// The prefix of the fake index file. +// The full content is the prefix followed by the number of shards. +inline constexpr std::string_view kSqlBackendFakeIndexPrefix = "SQLCache"; + +// ---------------------------------------------------------------------------- +// Database Scheme Version history: +// Version 1: Initial schema. The first field trial experiment started on +// Dev/Canary with this version. +// Version 2: https://crrev.com/c/6917159 added `cache_key_hash` column and an +// index on `(cache_key_hash, doomed)` to the `resources` table. +// Version 3: https://crrev.com/c/6940353 replaced `(token_high, token_low)` +// with `res_id` in `resources` and `blobs` tables. +// Version 4: https://crrev.com/c/7005549 changed the eviction logic to use +// `res_id` instead of `cache_key` and added a covering index on +// `(last_used, bytes_usage)` to the `resources` table. +// Version 5: https://crrev.com/c/7005917 changed how doomed entries are +// cleaned up. Instead of a delayed task, cleanup is now triggered +// during browser idle periods. Also, the index on `res_id` for +// doomed entries was removed as it's no longer needed. +// Version 6: https://crrev.com/c/7006231 changed the hash function for cache +// keys to base::PersistentHash, which uses a 32-bit hash. This is a +// breaking change as the previous version used a 64-bit hash. +// Version 7: https://crrev.com/c/7023771 added `check_sum` column in both of +// the `resources` table and the `blobs` table. +// ---------------------------------------------------------------------------- // The oldest database schema version that the current code can read. // A database with a version older than this will be razed as it's considered // obsolete and the code no longer supports migrating from it. -inline constexpr int kSqlBackendLowestSupportedDatabaseVersion = 1; +inline constexpr int kSqlBackendLowestSupportedDatabaseVersion = 7; // The current version of the database schema. This should be incremented for // any schema change. -inline constexpr int kSqlBackendCurrentDatabaseVersion = 1; +inline constexpr int kSqlBackendCurrentDatabaseVersion = 7; // The oldest application version that can use a database with the current // schema. If a schema change is not backward-compatible, this must be set to // the same value as `kSqlBackendCurrentDatabaseVersion`. -inline constexpr int kSqlBackendCompatibleDatabaseVersion = 1; +inline constexpr int kSqlBackendCompatibleDatabaseVersion = 7; // Estimated static size overhead for a resource entry in the database, // excluding the key and any blob data. This is a conservative estimate based on @@ -70,21 +95,29 @@ inline constexpr int kSqlBackendStaticResourceSize = 300; // The SQL backend only supports stream 0 and stream 1. static const int kSqlBackendStreamCount = 2; -// Divisor used to calculate the high and low watermarks for cache eviction. -// The high watermark is `max_size - (max_size / divisor)`, and the low -// watermark is `max_size - 2 * (max_size / divisor)`. Eviction is triggered -// when the cache size exceeds the high watermark and continues until it is -// below the low watermark. -inline constexpr int kSqlBackendEvictionMarginDivisor = 20; +// High watermark for cache eviction, in thousandths (permille) of the max size. +// Eviction is triggered when the cache size exceeds this. +inline constexpr int kSqlBackendEvictionHighWaterMarkPermille = 950; -// The delay after backend initialization before running a one-time cleanup task -// to delete doomed entries. This task removes entries that were doomed in a -// previous session but not fully deleted (e.g., due to a crash), ensuring -// that their disk space is reclaimed. -// Note: This value is set assuming use with HTTP Cache, but if the SQL backend -// is used with Cache Storage, it should be a shorter value. -inline constexpr base::TimeDelta kSqlBackendDeleteDoomedEntriesDelay = - base::Minutes(10); +// High watermark for cache eviction during idle time, in thousandths (permille) +// of the max size. This is lower than the regular high watermark to allow for +// more proactive eviction when the browser is not busy. +inline constexpr int kSqlBackendIdleTimeEvictionHighWaterMarkPermille = 925; + +// Low watermark for cache eviction, in thousandths (permille) of the max size. +// Eviction continues until the cache size is below this. +inline constexpr int kSqlBackendEvictionLowWaterMarkPermille = 900; + +// The delay after backend initialization before running post-initialization +// tasks. These tasks, such as cleaning up doomed entries from previous +// sessions and loading the in-memory index, are deferred to avoid impacting +// startup performance. +inline constexpr base::TimeDelta kSqlBackendPostInitializationTasksDelay = + base::Minutes(1); + +// The prefix for histograms related to the SQL disk cache backend. +inline constexpr std::string_view kSqlDiskCacheBackendHistogramPrefix = + "Net.SqlDiskCache.Backend."; } // namespace disk_cache diff --git a/naiveproxy/src/net/disk_cache/sql/sql_backend_impl.cc b/naiveproxy/src/net/disk_cache/sql/sql_backend_impl.cc index 0a279b37a3..ea80e6bde8 100644 --- a/naiveproxy/src/net/disk_cache/sql/sql_backend_impl.cc +++ b/naiveproxy/src/net/disk_cache/sql/sql_backend_impl.cc @@ -5,9 +5,12 @@ #include "net/disk_cache/sql/sql_backend_impl.h" #include +#include +#include #include #include "base/barrier_callback.h" +#include "base/barrier_closure.h" #include "base/containers/flat_set.h" #include "base/containers/span.h" #include "base/files/file.h" @@ -19,9 +22,12 @@ #include "base/metrics/histogram_functions.h" #include "base/notimplemented.h" #include "base/strings/string_number_conversions.h" +#include "base/task/bind_post_task.h" #include "base/task/task_runner.h" #include "base/task/thread_pool.h" #include "base/types/expected.h" +#include "components/performance_manager/scenario_api/performance_scenarios.h" +#include "net/base/features.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" #include "net/disk_cache/sql/sql_entry_impl.h" @@ -33,24 +39,31 @@ namespace { using FakeIndexFileError = SqlBackendImpl::FakeIndexFileError; +size_t GetShardCount() { + return std::max(std::min(net::features::kSqlDiskCacheShardCount.Get(), 255), + 1); +} + // Checks the fake index file, creating it if it doesn't exist. Returns an // error code if the file is corrupted or cannot be created. FakeIndexFileError CheckFakeIndexFileInternal(const base::FilePath& path) { + const std::string expected_contents = base::StrCat( + {kSqlBackendFakeIndexPrefix, base::NumberToString(GetShardCount())}); const base::FilePath file_path = path.Append(kSqlBackendFakeIndexFileName); const std::optional file_size = base::GetFileSize(file_path); if (file_size.has_value()) { - if (file_size != sizeof(kSqlBackendFakeIndexMagicNumber)) { + if (file_size != expected_contents.size()) { return FakeIndexFileError::kWrongFileSize; } base::File file(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ); if (!file.IsValid()) { return FakeIndexFileError::kOpenFileFailed; } - uint64_t magic_number = 0; - if (!file.ReadAndCheck(0, base::byte_span_from_ref(magic_number))) { + std::vector contents(expected_contents.size()); + if (!file.ReadAndCheck(0, contents)) { return FakeIndexFileError::kReadFileFailed; } - if (magic_number != kSqlBackendFakeIndexMagicNumber) { + if (base::span(contents) != base::span(expected_contents)) { return FakeIndexFileError::kWrongMagicNumber; } return FakeIndexFileError::kOkExisting; @@ -62,8 +75,7 @@ FakeIndexFileError CheckFakeIndexFileInternal(const base::FilePath& path) { if (!file.IsValid()) { return FakeIndexFileError::kCreateFileFailed; } - if (!file.WriteAndCheck( - 0, base::byte_span_from_ref(kSqlBackendFakeIndexMagicNumber))) { + if (!file.WriteAndCheck(0, base::as_byte_span(expected_contents))) { return FakeIndexFileError::kWriteFileFailed; } return FakeIndexFileError::kOkNew; @@ -77,12 +89,70 @@ bool CheckFakeIndexFile(const base::FilePath& path) { error == FakeIndexFileError::kOkExisting; } +// Checks if the browser is still idle. This is called within ShouldRunEviction. +// The purpose of this is to prevent operations from running if the browser is +// no longer idle in the time between SqlBackendImpl::OnBrowserIdle() being +// called and the actual processing. +bool IsBrowserIdle() { + return performance_scenarios::CurrentScenariosMatch( + performance_scenarios::ScenarioScope::kGlobal, + performance_scenarios::kDefaultIdleScenarios); +} + +// Determines whether cache eviction should run based on the urgency and timing. +// Eviction is triggered under three conditions: +// 1. Not needed: Eviction is skipped. +// 2. Idle time: Eviction runs only if it's an idle-time task and the browser +// is currently idle. +// 3. Needed: Eviction runs immediately, regardless of browser state. +bool ShouldRunEviction(SqlPersistentStore::EvictionUrgency eviction_urgency, + bool is_idle_time_eviction) { + switch (eviction_urgency) { + case SqlPersistentStore::EvictionUrgency::kNotNeeded: + return false; + case SqlPersistentStore::EvictionUrgency::kIdleTime: + return is_idle_time_eviction && IsBrowserIdle(); + case SqlPersistentStore::EvictionUrgency::kNeeded: + return true; + } +} + +// Wraps a OnceCallback. If the returned callback is destroyed without being +// run, the original callback is run with `abort_result`. +// This ensures that the callback is always run, even if the operation is +// cancelled or the owner is destroyed. +template +base::OnceCallback WrapCallbackWithAbortError( + base::OnceCallback callback, + ResultType abort_result) { + CHECK(callback); + auto [success_cb, failure_cb] = base::SplitOnceCallback(std::move(callback)); + + // The ScopedClosureRunner will run the `failure_cb` with `abort_result` if + // it's destroyed before being released. + auto runner = std::make_unique( + base::BindPostTaskToCurrentDefault( + base::BindOnce(std::move(failure_cb), abort_result))); + + // The returned callback represents the "success" path. + return base::BindOnce( + [](std::unique_ptr runner, + base::OnceCallback cb, ResultType result) { + // Release the runner to prevent the failure callback from running on + // destruction. + std::ignore = runner->Release(); + // Run the success callback with the provided result. + std::move(cb).Run(std::move(result)); + }, + std::move(runner), std::move(success_cb)); +} + // A helper to handle methods that may complete synchronously. // // This allows a caller to dispatch an async operation and immediately check if // it completed synchronously. If so, the result is returned directly. If not, // a provided callback is invoked later. -template +template > class SyncResultReceiver : public base::RefCounted> { public: using ResultCallback = base::OnceCallback; @@ -107,7 +177,7 @@ class SyncResultReceiver : public base::RefCounted> { // Checks for a synchronous result. If the operation already completed, // returns the result. Otherwise, returns nullopt and the original callback // will be run asynchronously. - std::optional FinishSyncCall() { + std::optional FinishSyncCall() { sync_call_finished_ = true; if (result_) { callback_.Reset(); @@ -133,19 +203,63 @@ class SyncResultReceiver : public base::RefCounted> { // The original callback, to be run on async completion. ResultCallback callback_; // Holds the result if it arrives synchronously. - std::optional result_; + std::optional result_; // Set to true when FinishSyncCall is called. bool sync_call_finished_ = false; }; -// Creates a `base::OnceClosure` that takes ownership of an `OperationHandle`. -// When the closure is run, the handle is destroyed, signaling the completion -// of the operation to the `ExclusiveOperationCoordinator`. This is typically -// used with `base::OnceCallback::Then()` to ensure the handle is released only -// after the primary callback has finished. -base::OnceClosure DoNothingWithBoundHandle( - std::unique_ptr handle) { - return base::OnceClosure(base::DoNothingWithBoundArgs(std::move(handle))); +// Creates a `base::OnceClosure` that takes ownership of `args`. When the +// closure is run, the `args` are destroyed. This is typically used with +// `base::OnceCallback::Then()` to ensure the handle is released only after the +// primary callback has finished. +template +base::OnceClosure OnceClosureWithBoundArgs(Args&&... args) { + return base::OnceClosure( + base::DoNothingWithBoundArgs(std::forward(args)...)); +} + +// Retrieves the `ResId` from `res_id_or_error` if it holds a `ResId` value. +// This function should only be called after the speculative entry creation has +// completed and `res_id_or_error->data` is populated. The call is sequenced +// by the ExclusiveOperationCoordinator, which ensures that this function runs +// only after the handle for the creation operation is released. +std::optional GetResId( + const scoped_refptr& res_id_or_error) { + CHECK(res_id_or_error); + CHECK(res_id_or_error->data.has_value()); + if (std::holds_alternative( + res_id_or_error->data.value())) { + return std::get(res_id_or_error->data.value()); + } + return std::nullopt; +} + +// Retrieves the `Error` from `res_id_or_error` if it holds an `Error` value. +// This function should only be called after the speculative entry creation has +// completed and `res_id_or_error->data` is populated. The call is sequenced +// by the ExclusiveOperationCoordinator, which ensures that this function runs +// only after the handle for the creation operation is released. +std::optional GetError( + const scoped_refptr& res_id_or_error) { + CHECK(res_id_or_error); + CHECK(res_id_or_error->data.has_value()); + if (std::holds_alternative( + res_id_or_error->data.value())) { + return std::get(res_id_or_error->data.value()); + } + return std::nullopt; +} + +std::vector> CreateTaskRunners() { + const size_t shard_count = GetShardCount(); + std::vector> runners; + runners.reserve(shard_count); + for (size_t i = 0; i < shard_count; ++i) { + runners.push_back(base::ThreadPool::CreateSequencedTaskRunner( + {base::MayBlock(), base::TaskPriority::USER_BLOCKING, + base::TaskShutdownBehavior::BLOCK_SHUTDOWN})); + } + return runners; } } // namespace @@ -184,22 +298,21 @@ class SqlBackendImpl::IteratorImpl : public Backend::Iterator { // `handle` is destroyed here, but `backend_` is null, so it's a no-op. return; } - // Request the next entry from the persistent store. `res_id_iterator_` - // keeps track of the last `res_id` returned, allowing the store to fetch - // entries older than that. - // `handle` will be destroyed after executing - // `OnOpenLatestEntryBeforeResIdFinished()`, may be triggering queued - // operations. - backend_->store_->OpenLatestEntryBeforeResId( - res_id_iterator_, - base::BindOnce(&IteratorImpl::OnOpenLatestEntryBeforeResIdFinished, + // Request the next entry from the persistent store. `entry_iterator_` keeps + // track of the last entry returned, allowing the store to fetch the next + // entry. + // `handle` will be destroyed after executing`OnOpenNextEntryFinished()`, + // may be triggering queued operations. + backend_->store_->OpenNextEntry( + entry_iterator_, + base::BindOnce(&IteratorImpl::OnOpenNextEntryFinished, weak_factory_.GetWeakPtr()) - .Then(DoNothingWithBoundHandle(std::move(handle)))); + .Then(OnceClosureWithBoundArgs(std::move(handle)))); } - // Callback for `SqlPersistentStore::OpenLatestEntryBeforeResId`. - void OnOpenLatestEntryBeforeResIdFinished( - SqlPersistentStore::OptionalEntryInfoWithIdAndKey result) { + // Callback for `SqlPersistentStore::OpenNextEntry`. + void OnOpenNextEntryFinished( + SqlPersistentStore::OptionalEntryInfoWithKeyAndIterator result) { CHECK(callback_); if (!backend_) { std::move(callback_).Run(EntryResult::MakeError(net::ERR_FAILED)); @@ -210,11 +323,11 @@ class SqlBackendImpl::IteratorImpl : public Backend::Iterator { std::move(callback_).Run(EntryResult::MakeError(net::ERR_FAILED)); return; } - SqlPersistentStore::EntryInfoWithIdAndKey& entry_info = *result; + SqlPersistentStore::EntryInfoWithKeyAndIterator& entry_info = *result; - // Update the iterator's cursor to the `res_id` of the current entry, - // so the next call to `OpenLatestEntryBeforeResId` starts from here. - res_id_iterator_ = entry_info.res_id; + // Update the `entry_iterator_` to the `iterator` of the result, so the next + // call to `OpenNextEntry` starts from here. + entry_iterator_ = entry_info.iterator; // Check if the entry is already active in `active_entries_`. If so, // reuse the existing `SqlEntryImpl` instance. @@ -229,15 +342,21 @@ class SqlBackendImpl::IteratorImpl : public Backend::Iterator { // maintained because iterator operations are "exclusive" and dooming // operations are "normal", and the `ExclusiveOperationCoordinator` // ensures they do not run concurrently. If a doom operation runs first, - // the entry is marked as doomed in the database and - // `OpenLatestEntryBeforeResId` will not return it. If the iterator - // operation runs first, any subsequent doom operation will be queued until - // the iteration step is complete. - DCHECK(std::none_of( - backend_->doomed_entries_.begin(), backend_->doomed_entries_.end(), - [&](const raw_ref& doomed_entry) { - return doomed_entry.get().token() == entry_info.info.token; - })); + // the entry is marked as doomed in the database and `OpenNextEntry` will + // not return it. If the iterator operation runs first, any subsequent doom + // operation will be queued until the iteration step is complete. + DCHECK(std::none_of(backend_->doomed_entries_.begin(), + backend_->doomed_entries_.end(), + [&](const raw_ref& doomed_entry) { + const auto optional_res_id = + GetResId(doomed_entry.get().res_id_or_error()); + return optional_res_id.has_value() && + backend_->store_->GetShardIdForHash( + doomed_entry.get().cache_key().hash()) == + backend_->store_->GetShardIdForHash( + entry_info.key.hash()) && + *optional_res_id == entry_info.info.res_id; + })); // Apply any in-flight modifications (e.g., last_used time updates, header // changes) that were queued for this entry while it was not active. @@ -245,7 +364,8 @@ class SqlBackendImpl::IteratorImpl : public Backend::Iterator { // If the entry is not active, create a new `SqlEntryImpl`. scoped_refptr new_entry = base::MakeRefCounted( - backend_, entry_info.key, entry_info.info.token, + backend_, entry_info.key, + base::MakeRefCounted(entry_info.info.res_id), entry_info.info.last_used, entry_info.info.body_end, entry_info.info.head); new_entry->AddRef(); @@ -259,9 +379,9 @@ class SqlBackendImpl::IteratorImpl : public Backend::Iterator { } base::WeakPtr backend_; - // The `res_id` of the last entry returned by the iterator. Used to fetch - // entries with smaller `res_id`s in subsequent calls. - int64_t res_id_iterator_ = std::numeric_limits::max(); + // The `entry_iterator` of the last entry returned by the iterator. Used to + // fetch the next entry in subsequent calls. + SqlPersistentStore::EntryIterator entry_iterator_; EntryResultCallback callback_; base::WeakPtrFactory weak_factory_{this}; }; @@ -271,13 +391,11 @@ SqlBackendImpl::SqlBackendImpl(const base::FilePath& path, net::CacheType cache_type) : Backend(cache_type), path_(path), - background_task_runner_(base::ThreadPool::CreateSequencedTaskRunner( - {base::MayBlock(), base::TaskPriority::USER_BLOCKING, - base::TaskShutdownBehavior::BLOCK_SHUTDOWN})), - store_(SqlPersistentStore::Create(path, - max_bytes > 0 ? max_bytes : 0, - GetCacheType(), - background_task_runner_)) { + background_task_runners_(CreateTaskRunners()), + store_(std::make_unique(path, + max_bytes > 0 ? max_bytes : 0, + GetCacheType(), + background_task_runners_)) { DVLOG(1) << "SqlBackendImpl::SqlBackendImpl " << path; } @@ -305,17 +423,30 @@ void SqlBackendImpl::OnInitialized(CompletionOnceCallback callback, const bool success = std::all_of(results.begin(), results.end(), [](bool result) { return result; }); if (success) { - // Schedule a one-time task to clean up doomed entries from previous - // sessions. This runs after a delay to avoid impacting startup performance. + // Schedule a one-time task to load in-memory index and clean up doomed + // entries from previous sessions. This runs after a delay to avoid + // impacting startup performance. This is especially important for Android + // WebView where Performance Scenario Detection doesn't work. See + // https://crbug.com/456009994 for more details. base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask( FROM_HERE, - base::BindOnce(&SqlBackendImpl::TriggerDeleteDoomedEntries, + base::BindOnce(&SqlBackendImpl::RunDelayedPostInitializationTasks, weak_factory_.GetWeakPtr()), - kSqlBackendDeleteDoomedEntriesDelay); + kSqlBackendPostInitializationTasksDelay); } std::move(callback).Run(success ? net::OK : net::ERR_FAILED); } +void SqlBackendImpl::RunDelayedPostInitializationTasks() { + store_->MaybeLoadInMemoryIndex(base::BindOnce( + [](base::WeakPtr self, SqlPersistentStore::Error result) { + if (self && result == SqlPersistentStore::Error::kOk) { + self->store_->MaybeRunCleanupDoomedEntries(base::DoNothing()); + } + }, + weak_factory_.GetWeakPtr())); +} + int64_t SqlBackendImpl::MaxFileSize() const { // Delegates to the persistent store to get the max file size. return store_->MaxFileSize(); @@ -323,8 +454,9 @@ int64_t SqlBackendImpl::MaxFileSize() const { int32_t SqlBackendImpl::GetEntryCount( net::Int32CompletionOnceCallback callback) const { - // Asynchronously retrieves the entry count from the persistent store. - store_->GetEntryCount(std::move(callback)); + // The entry count must be retrieved asynchronously to ensure that all + // pending database operations are reflected in the result. + store_->GetEntryCountAsync(std::move(callback)); return net::ERR_IO_PENDING; } @@ -383,6 +515,17 @@ void SqlBackendImpl::HandleOpenOrCreateEntryOperation( return; } + if (store_->GetIndexStateForHash(entry_key.hash()) == + SqlPersistentStore::IndexState::kHashNotFound) { + if (type == OpenOrCreateEntryOperationType::kOpenEntry) { + std::move(callback).Run(EntryResult::MakeError(net::ERR_FAILED)); + return; + } + std::move(callback).Run( + SpeculativeCreateEntry(entry_key, std::move(handle))); + return; + } + switch (type) { case OpenOrCreateEntryOperationType::kOpenOrCreateEntry: store_->OpenOrCreateEntry( @@ -399,9 +542,10 @@ void SqlBackendImpl::HandleOpenOrCreateEntryOperation( break; case OpenOrCreateEntryOperationType::kCreateEntry: store_->CreateEntry( - entry_key, base::BindOnce(&SqlBackendImpl::OnEntryOperationFinished, - base::Unretained(this), entry_key, - std::move(callback), std::move(handle))); + entry_key, base::Time::Now(), + base::BindOnce(&SqlBackendImpl::OnEntryOperationFinished, + base::Unretained(this), entry_key, std::move(callback), + std::move(handle))); break; } } @@ -414,25 +558,22 @@ SqlEntryImpl* SqlBackendImpl::GetActiveEntry(const CacheEntryKey& key) { return nullptr; } -void SqlBackendImpl::DoomActiveEntry(SqlEntryImpl& entry, - CompletionOnceCallback callback) { +void SqlBackendImpl::DoomActiveEntry(SqlEntryImpl& entry) { exclusive_operation_coordinator_.PostOrRunNormalOperation( entry.cache_key(), base::BindOnce(&SqlBackendImpl::HandleDoomActiveEntryOperation, weak_factory_.GetWeakPtr(), - scoped_refptr(&entry), std::move(callback))); + scoped_refptr(&entry))); } void SqlBackendImpl::HandleDoomActiveEntryOperation( scoped_refptr entry, - CompletionOnceCallback callback, std::unique_ptr handle) { if (entry->doomed()) { return; } - DoomActiveEntryInternal( - *entry, - std::move(callback).Then(DoNothingWithBoundHandle(std::move(handle)))); + DoomActiveEntryInternal(*entry, + base::DoNothingWithBoundArgs(std::move(handle))); } void SqlBackendImpl::DoomActiveEntryInternal(SqlEntryImpl& entry, @@ -443,9 +584,17 @@ void SqlBackendImpl::DoomActiveEntryInternal(SqlEntryImpl& entry, ReleaseActiveEntry(entry); doomed_entries_.emplace(entry); + const auto optional_res_id = GetResId(entry.res_id_or_error()); + if (!optional_res_id) { + // Fail the operation for entries that previously failed a speculative + // creation or optimistic write. + CHECK(GetError(entry.res_id_or_error()).has_value()); + std::move(callback).Run(net::ERR_FAILED); + return; + } // Ask the store to mark the entry as doomed in the database. store_->DoomEntry( - entry.cache_key(), entry.token(), + entry.cache_key(), *optional_res_id, base::BindOnce( [](base::WeakPtr weak_ptr, CompletionOnceCallback callback, SqlPersistentStore::Error error) { @@ -471,11 +620,16 @@ net::Error SqlBackendImpl::DoomEntry(const std::string& key, net::RequestPriority priority, CompletionOnceCallback callback) { const CacheEntryKey entry_key(key); + + auto sync_result_receiver = + base::MakeRefCounted>(std::move(callback)); exclusive_operation_coordinator_.PostOrRunNormalOperation( entry_key, base::BindOnce(&SqlBackendImpl::HandleDoomEntryOperation, weak_factory_.GetWeakPtr(), entry_key, priority, - std::move(callback))); - return net::ERR_IO_PENDING; + sync_result_receiver->GetCallback())); + auto sync_result = sync_result_receiver->FinishSyncCall(); + return sync_result ? static_cast(std::move(*sync_result)) + : net::ERR_IO_PENDING; } void SqlBackendImpl::HandleDoomEntryOperation( @@ -508,7 +662,7 @@ void SqlBackendImpl::HandleDoomEntryOperation( : net::ERR_FAILED); }, weak_factory_.GetWeakPtr(), std::move(callback)) - .Then(DoNothingWithBoundHandle(std::move(handle)))); + .Then(OnceClosureWithBoundArgs(std::move(handle)))); } net::Error SqlBackendImpl::DoomAllEntries(CompletionOnceCallback callback) { @@ -556,26 +710,28 @@ void SqlBackendImpl::HandleDoomEntriesBetweenOperation( : net::ERR_FAILED); }, std::move(callback)) - .Then(DoNothingWithBoundHandle(std::move(handle)))); + .Then(OnceClosureWithBoundArgs(std::move(handle)))); return; } - // Collect keys of active entries to exclude them from the store's + // Collect Ids of active entries to exclude them from the store's // DeleteLiveEntriesBetween operation, as they will be handled by dooming them // directly within this method. - std::vector excluded_keys_vec; - excluded_keys_vec.reserve(active_entries_.size()); + std::vector excluded_list; + excluded_list.reserve(active_entries_.size()); std::vector active_entries_to_be_doomed; for (auto& it : active_entries_) { - excluded_keys_vec.push_back(it.first); + const auto optional_res_id = GetResId(it.second->res_id_or_error()); + if (optional_res_id.has_value()) { + excluded_list.emplace_back(*optional_res_id, + store_->GetShardIdForHash(it.first.hash())); + } // Check if the active entry falls within the specified time range. const base::Time last_used_time = it.second->GetLastUsed(); if (last_used_time >= initial_time && last_used_time < end_time) { active_entries_to_be_doomed.push_back(&it.second.get()); } } - base::flat_set excluded_keys(base::sorted_unique, - std::move(excluded_keys_vec)); auto barrier_callback = base::BarrierCallback( active_entries_to_be_doomed.size() + // For active entries being doomed @@ -590,7 +746,7 @@ void SqlBackendImpl::HandleDoomEntriesBetweenOperation( } }, weak_factory_.GetWeakPtr(), std::move(callback)) - .Then(DoNothingWithBoundHandle(std::move(handle)))); + .Then(OnceClosureWithBoundArgs(std::move(handle)))); // Doom active entries that fall within the time range. for (auto* entry : active_entries_to_be_doomed) { @@ -602,7 +758,7 @@ void SqlBackendImpl::HandleDoomEntriesBetweenOperation( // pending) entries within the specified time range, excluding those already // handled. store_->DeleteLiveEntriesBetween( - initial_time, end_time, std::move(excluded_keys), + initial_time, end_time, std::move(excluded_list), base::BindOnce( [](CompletionOnceCallback callback, SqlPersistentStore::Error result) { @@ -631,19 +787,31 @@ int64_t SqlBackendImpl::CalculateSizeOfEntriesBetween( base::Time initial_time, base::Time end_time, Int64CompletionOnceCallback callback) { + exclusive_operation_coordinator_.PostOrRunExclusiveOperation(base::BindOnce( + &SqlBackendImpl::HandleCalculateSizeOfEntriesBetweenOperation, + weak_factory_.GetWeakPtr(), initial_time, end_time, std::move(callback))); + return net::ERR_IO_PENDING; +} + +void SqlBackendImpl::HandleCalculateSizeOfEntriesBetweenOperation( + base::Time initial_time, + base::Time end_time, + Int64CompletionOnceCallback callback, + std::unique_ptr handle) { store_->CalculateSizeOfEntriesBetween( initial_time, end_time, base::BindOnce( [](base::WeakPtr weak_ptr, Int64CompletionOnceCallback callback, + std::unique_ptr + handle, SqlPersistentStore::Int64OrError result) { if (weak_ptr) { std::move(callback).Run(result.has_value() ? result.value() : net::ERR_FAILED); } }, - weak_factory_.GetWeakPtr(), std::move(callback))); - return net::ERR_IO_PENDING; + weak_factory_.GetWeakPtr(), std::move(callback), std::move(handle))); } std::unique_ptr SqlBackendImpl::CreateIterator() { @@ -662,22 +830,32 @@ void SqlBackendImpl::OnExternalCacheHit(const std::string& key) { return; } const base::Time now = base::Time::Now(); - in_flight_entry_modifications_[entry_key].emplace_back( - base::UnguessableToken(), now); exclusive_operation_coordinator_.PostOrRunNormalOperation( entry_key, base::BindOnce(&SqlBackendImpl::HandleOnExternalCacheHitOperation, - weak_factory_.GetWeakPtr(), entry_key, now)); + weak_factory_.GetWeakPtr(), entry_key, now, + PushInFlightEntryModification( + entry_key, InFlightEntryModification(nullptr, now)))); } void SqlBackendImpl::HandleOnExternalCacheHitOperation( const CacheEntryKey& key, base::Time now, + PopInFlightEntryModificationRunner pop_in_flight_entry_modification, std::unique_ptr handle) { - store_->UpdateEntryLastUsed( + store_->UpdateEntryLastUsedByKey( key, now, - WrapErrorCallbackToPopInFlightEntryModification(key, base::DoNothing()) - .Then(DoNothingWithBoundHandle(std::move(handle)))); + base::BindOnce([](SqlPersistentStore::Error error) {}) + .Then(OnceClosureWithBoundArgs( + std::move(pop_in_flight_entry_modification))) + .Then(OnceClosureWithBoundArgs(std::move(handle)))); +} + +void SqlBackendImpl::OnBrowserIdle() { + store_->MaybeLoadInMemoryIndex(base::DoNothing()); + store_->MaybeRunCleanupDoomedEntries(base::DoNothing()); + store_->MaybeRunCheckpoint(base::DoNothing()); + MaybeTriggerEviction(/*is_idle_time_eviction=*/true); } void SqlBackendImpl::OnOptionalEntryOperationFinished( @@ -696,8 +874,9 @@ void SqlBackendImpl::OnOptionalEntryOperationFinished( // Create a new SqlEntryImpl instance. scoped_refptr new_entry = base::MakeRefCounted( - weak_factory_.GetWeakPtr(), key, entry_info.token, entry_info.last_used, - entry_info.body_end, entry_info.head); + weak_factory_.GetWeakPtr(), key, + base::MakeRefCounted(entry_info.res_id), + entry_info.last_used, entry_info.body_end, entry_info.head); // Add a reference for passing to the `callback`. new_entry->AddRef(); @@ -711,7 +890,7 @@ void SqlBackendImpl::OnOptionalEntryOperationFinished( ? EntryResult::MakeOpened(new_entry.get()) : EntryResult::MakeCreated(new_entry.get())); - MaybeTriggerEviction(); + MaybeTriggerEviction(/*is_idle_time_eviction=*/false); } void SqlBackendImpl::OnEntryOperationFinished( @@ -731,6 +910,46 @@ void SqlBackendImpl::OnEntryOperationFinished( } } +EntryResult SqlBackendImpl::SpeculativeCreateEntry( + const CacheEntryKey& entry_key, + std::unique_ptr handle) { + auto optional_res_id_or_error = + base::MakeRefCounted(std::nullopt); + const auto creation_time = base::Time::Now(); + store_->CreateEntry( + entry_key, creation_time, + base::BindOnce(&SqlBackendImpl::OnSpeculativeCreateEntryFinished, + base::Unretained(this), optional_res_id_or_error, + std::move(handle))); + + // Create a new SqlEntryImpl instance. + scoped_refptr new_entry = base::MakeRefCounted( + weak_factory_.GetWeakPtr(), entry_key, + std::move(optional_res_id_or_error), creation_time, /*body_end=*/0, + /*head=*/nullptr); + + // Add a reference for passing to the `callback`. + new_entry->AddRef(); + // Add the new entry to the active_entries_ map. + auto insert_result = active_entries_.insert( + std::make_pair(entry_key, raw_ref(*new_entry.get()))); + CHECK(insert_result.second); + + return EntryResult::MakeCreated(new_entry.get()); +} + +void SqlBackendImpl::OnSpeculativeCreateEntryFinished( + const scoped_refptr& res_id_or_error, + std::unique_ptr handle, + SqlPersistentStore::EntryInfoOrError result) { + if (result.has_value()) { + res_id_or_error->data = result->res_id; + } else { + res_id_or_error->data = result.error(); + } + MaybeTriggerEviction(/*is_idle_time_eviction=*/false); +} + void SqlBackendImpl::ReleaseActiveEntry(SqlEntryImpl& entry) { auto it = active_entries_.find(entry.cache_key()); // The entry must exist in the active_entries_ map. @@ -748,15 +967,21 @@ void SqlBackendImpl::ReleaseDoomedEntry(SqlEntryImpl& entry) { entry.cache_key(), base::BindOnce(&SqlBackendImpl::HandleDeleteDoomedEntry, weak_factory_.GetWeakPtr(), entry.cache_key(), - entry.token())); + entry.res_id_or_error())); } void SqlBackendImpl::HandleDeleteDoomedEntry( const CacheEntryKey& key, - const base::UnguessableToken& token, + const scoped_refptr& res_id_or_error, std::unique_ptr handle) { + const auto optional_res_id = GetResId(res_id_or_error); + if (!optional_res_id) { + // Fail the operation for entries that previously failed a speculative + // creation or optimistic write. + return; + } store_->DeleteDoomedEntry( - key, token, + key, *optional_res_id, base::BindOnce( [](std::unique_ptr handle, @@ -766,109 +991,280 @@ void SqlBackendImpl::HandleDeleteDoomedEntry( void SqlBackendImpl::UpdateEntryLastUsed( const CacheEntryKey& key, - const base::UnguessableToken& token, - base::Time last_used, - SqlPersistentStore::ErrorCallback callback) { - in_flight_entry_modifications_[key].emplace_back(token, last_used); + const scoped_refptr& res_id_or_error, + base::Time last_used) { exclusive_operation_coordinator_.PostOrRunNormalOperation( - key, base::BindOnce(&SqlBackendImpl::HandleUpdateEntryLastUsedOperation, - weak_factory_.GetWeakPtr(), key, token, last_used, - std::move(callback))); + key, + base::BindOnce( + &SqlBackendImpl::HandleUpdateEntryLastUsedOperation, + weak_factory_.GetWeakPtr(), key, res_id_or_error, last_used, + PushInFlightEntryModification( + key, InFlightEntryModification(res_id_or_error, last_used)))); } void SqlBackendImpl::HandleUpdateEntryLastUsedOperation( const CacheEntryKey& key, - const base::UnguessableToken& token, + const scoped_refptr& res_id_or_error, base::Time last_used, - SqlPersistentStore::ErrorCallback callback, + PopInFlightEntryModificationRunner pop_in_flight_entry_modification, std::unique_ptr handle) { - store_->UpdateEntryLastUsed( - key, last_used, - WrapErrorCallbackToPopInFlightEntryModification(key, std::move(callback)) - .Then(DoNothingWithBoundHandle(std::move(handle)))); + const auto optional_res_id = GetResId(res_id_or_error); + if (!optional_res_id) { + // Fail the operation for entries that previously failed a speculative + // creation or optimistic write. + return; + } + store_->UpdateEntryLastUsedByResId( + key, *optional_res_id, last_used, + base::BindOnce([](SqlPersistentStore::Error error) {}) + .Then(OnceClosureWithBoundArgs( + std::move(pop_in_flight_entry_modification))) + .Then(OnceClosureWithBoundArgs(std::move(handle)))); } void SqlBackendImpl::UpdateEntryHeaderAndLastUsed( const CacheEntryKey& key, - const base::UnguessableToken& token, + const scoped_refptr& res_id_or_error, base::Time last_used, scoped_refptr buffer, - int64_t header_size_delta, - SqlPersistentStore::ErrorCallback callback) { - in_flight_entry_modifications_[key].emplace_back(token, last_used, buffer); + int64_t header_size_delta) { exclusive_operation_coordinator_.PostOrRunNormalOperation( key, base::BindOnce( &SqlBackendImpl::HandleUpdateEntryHeaderAndLastUsedOperation, - weak_factory_.GetWeakPtr(), key, token, last_used, - std::move(buffer), header_size_delta, std::move(callback))); + weak_factory_.GetWeakPtr(), key, res_id_or_error, last_used, + std::move(buffer), header_size_delta, + PushInFlightEntryModification( + key, InFlightEntryModification(res_id_or_error, last_used, + buffer)))); } void SqlBackendImpl::HandleUpdateEntryHeaderAndLastUsedOperation( const CacheEntryKey& key, - const base::UnguessableToken& token, + const scoped_refptr& res_id_or_error, base::Time last_used, scoped_refptr buffer, int64_t header_size_delta, - SqlPersistentStore::ErrorCallback callback, + PopInFlightEntryModificationRunner pop_in_flight_entry_modification, std::unique_ptr handle) { + const auto optional_res_id = GetResId(res_id_or_error); + if (!optional_res_id) { + // Fail the operation for entries that previously failed a speculative + // creation or optimistic write. + const auto optional_error = GetError(res_id_or_error); + CHECK(optional_error.has_value()); + return; + } store_->UpdateEntryHeaderAndLastUsed( - key, token, last_used, std::move(buffer), header_size_delta, - WrapErrorCallbackToPopInFlightEntryModification(key, std::move(callback)) - .Then(DoNothingWithBoundHandle(std::move(handle)))); + key, *optional_res_id, last_used, std::move(buffer), header_size_delta, + base::BindOnce([](SqlPersistentStore::Error error) {}) + .Then(OnceClosureWithBoundArgs( + std::move(pop_in_flight_entry_modification))) + .Then(OnceClosureWithBoundArgs(std::move(handle)))); } -void SqlBackendImpl::WriteEntryData( +int SqlBackendImpl::WriteEntryData( const CacheEntryKey& key, - const base::UnguessableToken& token, + const scoped_refptr& res_id_or_error, int64_t old_body_end, int64_t body_end, int64_t offset, scoped_refptr buffer, int buf_len, bool truncate, - SqlPersistentStore::ErrorCallback callback) { - in_flight_entry_modifications_[key].emplace_back(token, body_end); + CompletionOnceCallback callback) { + if (res_id_or_error->data.has_value() && + std::holds_alternative( + res_id_or_error->data.value())) { + // Fail the operation for entries that previously failed a speculative + // creation or optimistic write. + return net::ERR_FAILED; + } + + // Perform optimistic writes as long as `optimistic_write_buffer_total_size_` + // does not exceed `kSqlDiskCacheOptimisticWriteBufferSize`. + const bool can_execute_optimistic_write = + optimistic_write_buffer_total_size_ + buf_len <= + net::features::kSqlDiskCacheOptimisticWriteBufferSize.Get(); + base::UmaHistogramBoolean("Net.SqlDiskCache.Write.IsOptimistic", + can_execute_optimistic_write); + if (can_execute_optimistic_write) { + optimistic_write_buffer_total_size_ += buf_len; + if (buffer) { + // Note: `buffer` can be nullptr. + buffer = base::MakeRefCounted( + buffer->span().first(static_cast(buf_len))); + } + // Callback to set an error on `res_id_or_error` when an error occurs or + // the backend is deleted. + auto maybe_update_res_id_or_error_callback = + WrapCallbackWithAbortError( + base::BindOnce( + [](const scoped_refptr& res_id_or_error, + SqlPersistentStore::Error result) { + base::UmaHistogramEnumeration( + "Net.SqlDiskCache.OptimisticWrite.Result", result); + if (result != SqlPersistentStore::Error::kOk) { + res_id_or_error->data = result; + } + }, + res_id_or_error), + SqlPersistentStore::Error::kAborted); + exclusive_operation_coordinator_.PostOrRunNormalOperation( + key, + base::BindOnce( + &SqlBackendImpl::HandleOptimisticWriteEntryDataOperation, + weak_factory_.GetWeakPtr(), key, res_id_or_error, old_body_end, + offset, std::move(buffer), buf_len, truncate, + std::move(maybe_update_res_id_or_error_callback), + PushInFlightEntryModification( + key, InFlightEntryModification(res_id_or_error, body_end)))); + return buf_len; + } + auto sync_result_receiver = + base::MakeRefCounted>(std::move(callback)); exclusive_operation_coordinator_.PostOrRunNormalOperation( - key, base::BindOnce(&SqlBackendImpl::HandleWriteEntryDataOperation, - weak_factory_.GetWeakPtr(), key, token, old_body_end, - offset, std::move(buffer), buf_len, truncate, - std::move(callback))); + key, + base::BindOnce( + &SqlBackendImpl::HandleWriteEntryDataOperation, + weak_factory_.GetWeakPtr(), key, res_id_or_error, old_body_end, + offset, std::move(buffer), buf_len, truncate, + base::BindOnce( + [](CompletionOnceCallback callback, int buf_len, + SqlPersistentStore::Error result) { + std::move(callback).Run(result == SqlPersistentStore::Error::kOk + ? buf_len + : net::ERR_FAILED); + }, + WrapCallbackWithAbortError( + sync_result_receiver->GetCallback(), net::ERR_ABORTED), + buf_len), + PushInFlightEntryModification( + key, InFlightEntryModification(res_id_or_error, body_end)))); + auto sync_result = sync_result_receiver->FinishSyncCall(); + return sync_result ? std::move(*sync_result) : net::ERR_IO_PENDING; } void SqlBackendImpl::HandleWriteEntryDataOperation( const CacheEntryKey& key, - const base::UnguessableToken& token, + const scoped_refptr& res_id_or_error, int64_t old_body_end, int64_t offset, scoped_refptr buffer, int buf_len, bool truncate, SqlPersistentStore::ErrorCallback callback, + PopInFlightEntryModificationRunner pop_in_flight_entry_modification, std::unique_ptr handle) { + const auto optional_res_id = GetResId(res_id_or_error); + if (!optional_res_id) { + // Fail the operation for entries that previously failed a speculative + // creation or optimistic write. + const auto optional_error = GetError(res_id_or_error); + CHECK(optional_error.has_value()); + std::move(callback).Run(*optional_error); + return; + } store_->WriteEntryData( - key, token, old_body_end, offset, std::move(buffer), buf_len, truncate, - WrapErrorCallbackToPopInFlightEntryModification(key, std::move(callback)) - .Then(DoNothingWithBoundHandle(std::move(handle)))); + key, *optional_res_id, old_body_end, offset, std::move(buffer), buf_len, + truncate, + std::move(callback) + .Then(OnceClosureWithBoundArgs( + std::move(pop_in_flight_entry_modification))) + .Then(OnceClosureWithBoundArgs(std::move(handle)))); } -void SqlBackendImpl::ReadEntryData( +void SqlBackendImpl::HandleOptimisticWriteEntryDataOperation( const CacheEntryKey& key, - const base::UnguessableToken& token, + const scoped_refptr& res_id_or_error, + int64_t old_body_end, + int64_t offset, + scoped_refptr buffer, + int buf_len, + bool truncate, + SqlPersistentStore::ErrorCallback maybe_update_res_id_or_error_callback, + PopInFlightEntryModificationRunner pop_in_flight_entry_modification, + std::unique_ptr handle) { + const auto optional_res_id = GetResId(res_id_or_error); + if (!optional_res_id) { + // Decrement the total size. + optimistic_write_buffer_total_size_ -= buf_len; + CHECK_GE(optimistic_write_buffer_total_size_, 0); + // Fail the operation for entries that previously failed a speculative + // creation or optimistic write. + const auto optional_error = GetError(res_id_or_error); + CHECK(optional_error.has_value()); + // Need to call `maybe_update_res_id_or_error_callback` here, otherwise + // `res_id_or_error` will be set to SqlPersistentStore::Error::kAborted. + std::move(maybe_update_res_id_or_error_callback).Run(*optional_error); + return; + } + store_->WriteEntryData( + key, *optional_res_id, old_body_end, offset, std::move(buffer), buf_len, + truncate, + base::BindOnce(&SqlBackendImpl::OnOptimisticWriteFinished, + weak_factory_.GetWeakPtr(), key, *optional_res_id, buf_len, + std::move(maybe_update_res_id_or_error_callback), + std::move(pop_in_flight_entry_modification), + std::move(handle))); +} + +void SqlBackendImpl::OnOptimisticWriteFinished( + const CacheEntryKey& key, + SqlPersistentStore::ResId res_id, + int buf_len, + SqlPersistentStore::ErrorCallback maybe_update_res_id_or_error_callback, + PopInFlightEntryModificationRunner pop_in_flight_entry_modification, + std::unique_ptr handle, + SqlPersistentStore::Error result) { + optimistic_write_buffer_total_size_ -= buf_len; + CHECK_GE(optimistic_write_buffer_total_size_, 0); + std::move(maybe_update_res_id_or_error_callback).Run(result); + + if (result == SqlPersistentStore::Error::kOk) { + return; + } + // If an optimistic write fails, `maybe_update_res_id_or_error_callback` has + // set an error value in the entry's `res_id_or_error`. This ensures that all + // subsequent operations on this entry will also fail. + // Since the user of the Sql backend can no longer delete the entry from + // storage, SqlBackendImpl takes responsibility for deleting it. + store_->DoomEntry(key, res_id, base::DoNothing()); + store_->DeleteDoomedEntry(key, res_id, + base::DoNothingWithBoundArgs(std::move(handle))); +} + +int SqlBackendImpl::ReadEntryData( + const CacheEntryKey& key, + const scoped_refptr& res_id_or_error, int64_t offset, scoped_refptr buffer, int buf_len, int64_t body_end, bool sparse_reading, - SqlPersistentStore::IntOrErrorCallback callback) { + CompletionOnceCallback callback) { + auto sync_result_receiver = + base::MakeRefCounted>(std::move(callback)); exclusive_operation_coordinator_.PostOrRunNormalOperation( - key, base::BindOnce(&SqlBackendImpl::HandleReadEntryDataOperation, - weak_factory_.GetWeakPtr(), token, offset, - std::move(buffer), buf_len, body_end, sparse_reading, - std::move(callback))); + key, + base::BindOnce( + &SqlBackendImpl::HandleReadEntryDataOperation, + weak_factory_.GetWeakPtr(), key, res_id_or_error, offset, + std::move(buffer), buf_len, body_end, sparse_reading, + base::BindOnce( + [](CompletionOnceCallback callback, + SqlPersistentStore::IntOrError result) { + std::move(callback).Run(result.value_or(net::ERR_FAILED)); + }, + WrapCallbackWithAbortError( + sync_result_receiver->GetCallback(), net::ERR_ABORTED)))); + + auto sync_result = sync_result_receiver->FinishSyncCall(); + return sync_result ? std::move(*sync_result) : net::ERR_IO_PENDING; } void SqlBackendImpl::HandleReadEntryDataOperation( - const base::UnguessableToken& token, + const CacheEntryKey& key, + const scoped_refptr& res_id_or_error, int64_t offset, scoped_refptr buffer, int buf_len, @@ -876,30 +1272,86 @@ void SqlBackendImpl::HandleReadEntryDataOperation( bool sparse_reading, SqlPersistentStore::IntOrErrorCallback callback, std::unique_ptr handle) { + const auto optional_res_id = GetResId(res_id_or_error); + if (!optional_res_id) { + // Fail the operation for entries that previously failed a speculative + // creation or optimistic write. + const auto optional_error = GetError(res_id_or_error); + CHECK(optional_error.has_value()); + std::move(callback).Run(net::ERR_FAILED); + return; + } store_->ReadEntryData( - token, offset, buffer, buf_len, body_end, sparse_reading, - std::move(callback).Then(DoNothingWithBoundHandle(std::move(handle)))); + key, *optional_res_id, offset, buffer, buf_len, body_end, sparse_reading, + std::move(callback).Then(OnceClosureWithBoundArgs(std::move(handle)))); } -void SqlBackendImpl::GetEntryAvailableRange(const CacheEntryKey& key, - const base::UnguessableToken& token, - int64_t offset, - int len, - RangeResultCallback callback) { +RangeResult SqlBackendImpl::GetEntryAvailableRange( + const CacheEntryKey& key, + const scoped_refptr& res_id_or_error, + int64_t offset, + int len, + RangeResultCallback callback) { + auto sync_result_receiver = + base::MakeRefCounted>( + std::move(callback)); exclusive_operation_coordinator_.PostOrRunNormalOperation( - key, - base::BindOnce(&SqlBackendImpl::HandleGetEntryAvailableRangeOperation, - weak_factory_.GetWeakPtr(), token, offset, len, - std::move(callback))); + key, base::BindOnce( + &SqlBackendImpl::HandleGetEntryAvailableRangeOperation, + weak_factory_.GetWeakPtr(), key, res_id_or_error, offset, len, + WrapCallbackWithAbortError( + sync_result_receiver->GetCallback(), + RangeResult(net::ERR_ABORTED)))); + auto sync_result = sync_result_receiver->FinishSyncCall(); + return sync_result ? std::move(*sync_result) + : RangeResult(net::ERR_IO_PENDING); } void SqlBackendImpl::HandleGetEntryAvailableRangeOperation( - const base::UnguessableToken& token, + const CacheEntryKey& key, + const scoped_refptr& res_id_or_error, int64_t offset, int len, RangeResultCallback callback, std::unique_ptr handle) { - store_->GetEntryAvailableRange(token, offset, len, std::move(callback)); + const auto optional_res_id = GetResId(res_id_or_error); + if (!optional_res_id) { + // Fail the operation for entries that previously failed a speculative + // creation or optimistic write. + const auto optional_error = GetError(res_id_or_error); + CHECK(optional_error.has_value()); + std::move(callback).Run(RangeResult(net::ERR_FAILED)); + return; + } + store_->GetEntryAvailableRange(key, *optional_res_id, offset, len, + std::move(callback)); +} + +SqlBackendImpl::PopInFlightEntryModificationRunner +SqlBackendImpl::PushInFlightEntryModification( + const CacheEntryKey& entry_key, + InFlightEntryModification in_flight_entry_modification) { + in_flight_entry_modifications_[entry_key].emplace_back( + std::move(in_flight_entry_modification)); + return PopInFlightEntryModificationRunner(base::ScopedClosureRunner( + base::BindOnce(&SqlBackendImpl::PopInFlightEntryModification, + weak_factory_.GetWeakPtr(), entry_key))); +} + +void SqlBackendImpl::PopInFlightEntryModification( + const CacheEntryKey& entry_key) { + // The in-flight modifications for a given key are queued and removed in FIFO + // order. This is safe because `exclusive_operation_coordinator_` serializes + // all normal operations for the same key. This guarantees that modifications + // are enqueued and the corresponding store operations are executed in the + // same order. + auto it = in_flight_entry_modifications_.find(entry_key); + CHECK(it != in_flight_entry_modifications_.end()); + CHECK(!it->second.empty()); + it->second.pop_front(); + if (it->second.empty()) { + in_flight_entry_modifications_.erase(it); + } } void SqlBackendImpl::ApplyInFlightEntryModifications( @@ -910,8 +1362,12 @@ void SqlBackendImpl::ApplyInFlightEntryModifications( return; } for (const auto& modification : it->second) { - if (modification.token.is_empty() || - modification.token == entry_info.token) { + std::optional optional_res_id = + modification.res_id_or_error ? GetResId(modification.res_id_or_error) + : std::nullopt; + if (!modification.res_id_or_error || + (optional_res_id.has_value() && + *optional_res_id == entry_info.res_id)) { if (modification.last_used.has_value()) { entry_info.last_used = *modification.last_used; } @@ -925,99 +1381,58 @@ void SqlBackendImpl::ApplyInFlightEntryModifications( } } -SqlPersistentStore::ErrorCallback -SqlBackendImpl::WrapErrorCallbackToPopInFlightEntryModification( - const CacheEntryKey& key, - SqlPersistentStore::ErrorCallback callback) { - return base::BindOnce( - [](base::WeakPtr weak_ptr, const CacheEntryKey& key, - SqlPersistentStore::ErrorCallback callback, - SqlPersistentStore::Error result) { - if (weak_ptr) { - // The in-flight modifications for a given key are queued and removed - // in FIFO order. This is safe because - // `exclusive_operation_coordinator_` serializes all normal operations - // for the same key. This guarantees that modifications are enqueued - // and the corresponding store operations are executed in the same - // order. - auto it = weak_ptr->in_flight_entry_modifications_.find(key); - CHECK(it != weak_ptr->in_flight_entry_modifications_.end()); - CHECK(!it->second.empty()); - it->second.pop_front(); - if (it->second.empty()) { - weak_ptr->in_flight_entry_modifications_.erase(it); - } - } - std::move(callback).Run(result); - }, - weak_factory_.GetWeakPtr(), key, std::move(callback)); -} - int SqlBackendImpl::FlushQueueForTest(CompletionOnceCallback callback) { exclusive_operation_coordinator_.PostOrRunExclusiveOperation(base::BindOnce( - [](scoped_refptr background_task_runner, + [](std::vector> + background_task_runners, CompletionOnceCallback callback, std::unique_ptr handle) { - background_task_runner->PostTaskAndReply( - // Post a no-op task to the background runner. - FROM_HERE, base::BindOnce([]() {}), + auto barrier_closure = base::BarrierClosure( + background_task_runners.size(), base::BindOnce(std::move(callback), net::OK) - .Then(DoNothingWithBoundHandle(std::move(handle)))); + .Then(OnceClosureWithBoundArgs(std::move(handle)))); + for (auto& runner : background_task_runners) { + runner->PostTaskAndReply( + // Post a no-op task to the background runner. + FROM_HERE, base::BindOnce([]() {}), barrier_closure); + } }, - background_task_runner_, std::move(callback))); + background_task_runners_, std::move(callback))); return net::ERR_IO_PENDING; } -void SqlBackendImpl::MaybeTriggerEviction() { - if (!store_->ShouldStartEviction() || eviction_operation_queued_) { +void SqlBackendImpl::MaybeTriggerEviction(bool is_idle_time_eviction) { + if (eviction_operation_queued_ || + !ShouldRunEviction(store_->GetEvictionUrgency(), is_idle_time_eviction)) { return; } eviction_operation_queued_ = true; exclusive_operation_coordinator_.PostOrRunExclusiveOperation(base::BindOnce( base::BindOnce(&SqlBackendImpl::HandleTriggerEvictionOperation, - weak_factory_.GetWeakPtr()))); + weak_factory_.GetWeakPtr(), is_idle_time_eviction))); } void SqlBackendImpl::HandleTriggerEvictionOperation( + bool is_idle_time_eviction, std::unique_ptr handle) { eviction_operation_queued_ = false; - if (!store_->ShouldStartEviction()) { + if (!ShouldRunEviction(store_->GetEvictionUrgency(), is_idle_time_eviction)) { return; } - std::vector excluded_keys_vec; - excluded_keys_vec.reserve(active_entries_.size()); - for (const auto& pair : active_entries_) { - excluded_keys_vec.push_back(pair.first); + std::vector excluded_list; + excluded_list.reserve(active_entries_.size()); + for (const auto& it : active_entries_) { + const auto optional_res_id = GetResId(it.second->res_id_or_error()); + if (optional_res_id.has_value()) { + excluded_list.emplace_back(*optional_res_id, + store_->GetShardIdForHash(it.first.hash())); + } } - base::flat_set excluded_keys(base::sorted_unique, - std::move(excluded_keys_vec)); - store_->StartEviction( - std::move(excluded_keys), - base::BindOnce([](SqlPersistentStore::Error result) {})); -} - -void SqlBackendImpl::TriggerDeleteDoomedEntries() { - exclusive_operation_coordinator_.PostOrRunExclusiveOperation(base::BindOnce( - base::BindOnce(&SqlBackendImpl::HandleDeleteDoomedEntriesOperation, - weak_factory_.GetWeakPtr()))); -} - -void SqlBackendImpl::HandleDeleteDoomedEntriesOperation( - std::unique_ptr handle) { - std::vector excluded_tokens_vec; - excluded_tokens_vec.reserve(doomed_entries_.size()); - for (const auto& entry : doomed_entries_) { - excluded_tokens_vec.push_back(entry->token()); - } - std::sort(excluded_tokens_vec.begin(), excluded_tokens_vec.end()); - base::flat_set excluded_tokens( - base::sorted_unique, std::move(excluded_tokens_vec)); - store_->DeleteDoomedEntries( - std::move(excluded_tokens), - base::BindOnce([](SqlPersistentStore::Error result) { - }).Then(DoNothingWithBoundHandle(std::move(handle)))); + store_->StartEviction(std::move(excluded_list), is_idle_time_eviction, + base::BindOnce([](SqlPersistentStore::Error result) { + }).Then(OnceClosureWithBoundArgs(std::move(handle)))); } void SqlBackendImpl::EnableStrictCorruptionCheckForTesting() { @@ -1025,18 +1440,20 @@ void SqlBackendImpl::EnableStrictCorruptionCheckForTesting() { } SqlBackendImpl::InFlightEntryModification::InFlightEntryModification( - const base::UnguessableToken& token, + const scoped_refptr& res_id_or_error, base::Time last_used) - : token(token), last_used(last_used) {} + : res_id_or_error(res_id_or_error), last_used(last_used) {} SqlBackendImpl::InFlightEntryModification::InFlightEntryModification( - const base::UnguessableToken& token, + const scoped_refptr& res_id_or_error, base::Time last_used, scoped_refptr head) - : token(token), last_used(last_used), head(std::move(head)) {} + : res_id_or_error(res_id_or_error), + last_used(last_used), + head(std::move(head)) {} SqlBackendImpl::InFlightEntryModification::InFlightEntryModification( - const base::UnguessableToken& token, + const scoped_refptr& res_id_or_error, int64_t body_end) - : token(token), body_end(body_end) {} + : res_id_or_error(res_id_or_error), body_end(body_end) {} SqlBackendImpl::InFlightEntryModification::~InFlightEntryModification() = default; SqlBackendImpl::InFlightEntryModification::InFlightEntryModification( diff --git a/naiveproxy/src/net/disk_cache/sql/sql_backend_impl.h b/naiveproxy/src/net/disk_cache/sql/sql_backend_impl.h index 649aa258da..a566e7c37b 100644 --- a/naiveproxy/src/net/disk_cache/sql/sql_backend_impl.h +++ b/naiveproxy/src/net/disk_cache/sql/sql_backend_impl.h @@ -9,18 +9,22 @@ #include #include #include +#include #include #include "base/files/file_path.h" #include "base/memory/raw_ref.h" +#include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" +#include "base/types/strong_alias.h" #include "net/base/net_export.h" #include "net/disk_cache/buildflags.h" #include "net/disk_cache/disk_cache.h" #include "net/disk_cache/sql/cache_entry_key.h" #include "net/disk_cache/sql/exclusive_operation_coordinator.h" #include "net/disk_cache/sql/sql_persistent_store.h" +#include "third_party/abseil-cpp/absl/container/flat_hash_map.h" // This backend is experimental and only available when the build flag is set. static_assert(BUILDFLAG(ENABLE_DISK_CACHE_SQL_BACKEND)); @@ -41,6 +45,15 @@ class SqlEntryImpl; // yet implemented, returning `net::ERR_NOT_IMPLEMENTED`. class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { public: + // For a speculatively created entry, this holds `std::nullopt` initially, and + // when the entry creation task is complete, it will hold either the `ResId` + // on success or an `Error` on failure. Otherwise, it just holds a `ResId`. + // Callbacks passed to `SqlBackendImpl::PostOrRunNormalOperation()` with the + // entry key can expect this to be populated with either a `ResId` or an + // `Error`. + using ResIdOrErrorHolder = base::RefCountedData>>; + // An enumeration of errors that can occur during the fake index file check. // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. @@ -105,6 +118,7 @@ class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { std::unique_ptr CreateIterator() override; void GetStats(base::StringPairs* stats) override; void OnExternalCacheHit(const std::string& key) override; + void OnBrowserIdle() override; // Called by SqlEntryImpl when it's being closed and is not doomed. // Removes the entry from `active_entries_`. @@ -114,66 +128,75 @@ class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { void ReleaseDoomedEntry(SqlEntryImpl& entry); // Marks an active entry as doomed and initiates its removal from the store. - // If `callback` is provided, it will be run upon completion. - void DoomActiveEntry(SqlEntryImpl& entry, CompletionOnceCallback callback); + void DoomActiveEntry(SqlEntryImpl& entry); // Updates the `last_used` timestamp for an entry. - void UpdateEntryLastUsed(const CacheEntryKey& key, - const base::UnguessableToken& token, - base::Time last_used, - SqlPersistentStore::ErrorCallback callback); + void UpdateEntryLastUsed( + const CacheEntryKey& key, + const scoped_refptr& res_id_or_error, + base::Time last_used); // Updates the header data and `last_used` timestamp for an entry. - void UpdateEntryHeaderAndLastUsed(const CacheEntryKey& key, - const base::UnguessableToken& token, - base::Time last_used, - scoped_refptr buffer, - int64_t header_size_delta, - SqlPersistentStore::ErrorCallback callback); + void UpdateEntryHeaderAndLastUsed( + const CacheEntryKey& key, + const scoped_refptr& res_id_or_error, + base::Time last_used, + scoped_refptr buffer, + int64_t header_size_delta); // Writes data to an entry's body (stream 1). This can be used to write new // data, overwrite existing data, or append to the entry. The operation is // scheduled via the `ExclusiveOperationCoordinator` to ensure proper // serialization. - void WriteEntryData(const CacheEntryKey& key, - const base::UnguessableToken& token, - int64_t old_body_end, - int64_t body_end, - int64_t offset, - scoped_refptr buffer, - int buf_len, - bool truncate, - SqlPersistentStore::ErrorCallback callback); + // If the backend is deleted during execution, the callback will be called + // with net::ERR_ABORTED. + int WriteEntryData(const CacheEntryKey& key, + const scoped_refptr& res_id_or_error, + int64_t old_body_end, + int64_t body_end, + int64_t offset, + scoped_refptr buffer, + int buf_len, + bool truncate, + CompletionOnceCallback callback); // Reads data from an entry's body (stream 1). The operation is scheduled via // the `ExclusiveOperationCoordinator`. `sparse_reading` controls whether // gaps in the data are filled with zeros or cause the read to stop. - void ReadEntryData(const CacheEntryKey& key, - const base::UnguessableToken& token, - int64_t offset, - scoped_refptr buffer, - int buf_len, - int64_t body_end, - bool sparse_reading, - SqlPersistentStore::IntOrErrorCallback callback); + // If the backend is deleted during execution, the callback will be called + // with net::ERR_ABORTED. + int ReadEntryData(const CacheEntryKey& key, + const scoped_refptr& res_id_or_error, + int64_t offset, + scoped_refptr buffer, + int buf_len, + int64_t body_end, + bool sparse_reading, + CompletionOnceCallback callback); // Finds the available contiguous range of data for a given entry. The // operation is scheduled via the `ExclusiveOperationCoordinator` to ensure // proper serialization. - void GetEntryAvailableRange(const CacheEntryKey& key, - const base::UnguessableToken& token, - int64_t offset, - int len, - RangeResultCallback callback); + // If the backend is deleted during execution, the callback will be called + // with net::ERR_ABORTED. + RangeResult GetEntryAvailableRange( + const CacheEntryKey& key, + const scoped_refptr& res_id_or_error, + int64_t offset, + int len, + RangeResultCallback callback); // Sends a dummy operation through the background task runner via the // operation coordinator, for unit tests. int FlushQueueForTest(CompletionOnceCallback callback); - scoped_refptr GetBackgroundTaskRunnerForTest() { - return background_task_runner_; + std::vector>& + GetBackgroundTaskRunnersForTest() { + return background_task_runners_; } + SqlPersistentStore* GetSqlStoreForTest() { return store_.get(); } + // Enables a strict corruption checking mode for testing purposes. When // enabled, any detected database corruption will cause an immediate crash // via a `CHECK` failure. This is primarily useful for fuzzers, which can more @@ -181,9 +204,27 @@ class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { // silently recovering. void EnableStrictCorruptionCheckForTesting(); + // Returns the current size of the `in_flight_entry_modifications_` map. + // This is for testing purposes only. + size_t GetSizeOfInFlightEntryModificationsMapForTesting() { + return in_flight_entry_modifications_.size(); + } + + int64_t GetOptimisticWriteBufferTotalSizeForTesting() { + return optimistic_write_buffer_total_size_; + } + private: class IteratorImpl; + // A RAII helper that ensures `PopInFlightEntryModification` is called when + // it goes out of scope. This guarantees that an in-flight modification is + // removed from `in_flight_entry_modifications_` once the associated operation + // completes or is aborted. + using PopInFlightEntryModificationRunner = + base::StrongAlias; + // Identifies the type of a entry operation. enum class OpenOrCreateEntryOperationType { kCreateEntry, @@ -195,17 +236,20 @@ class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { // last_used, header). These modifications are queued and applied when the // entry is re-activated by `Iterator::OpenNextEntry()`. struct InFlightEntryModification { - InFlightEntryModification(const base::UnguessableToken& token, - base::Time last_used); - InFlightEntryModification(const base::UnguessableToken& token, - base::Time last_used, - scoped_refptr head); - InFlightEntryModification(const base::UnguessableToken& token, - int64_t body_end); + InFlightEntryModification( + const scoped_refptr& res_id_or_error, + base::Time last_used); + InFlightEntryModification( + const scoped_refptr& res_id_or_error, + base::Time last_used, + scoped_refptr head); + InFlightEntryModification( + const scoped_refptr& res_id_or_error, + int64_t body_end); ~InFlightEntryModification(); InFlightEntryModification(InFlightEntryModification&&); - base::UnguessableToken token; + scoped_refptr res_id_or_error; std::optional last_used; std::optional> head; std::optional body_end; @@ -213,6 +257,7 @@ class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { void OnInitialized(CompletionOnceCallback callback, const std::vector& results); + void RunDelayedPostInitializationTasks(); SqlEntryImpl* GetActiveEntry(const CacheEntryKey& key); @@ -220,7 +265,7 @@ class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { // schedules an eviction task. This is typically called after operations that // might increase the cache size. The eviction itself is run as an exclusive // operation to prevent conflicts with other cache activities. - void MaybeTriggerEviction(); + void MaybeTriggerEviction(bool is_idle_time_eviction); // Internal helper for Open/Create/OpenOrCreate operations. It uses // `ExclusiveOperationCoordinator` to serialize operations on the same key and @@ -254,11 +299,23 @@ class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { std::unique_ptr handle, SqlPersistentStore::OptionalEntryInfoOrError result); + // Creates a new entry speculatively and returns it immediately. The actual + // database insertion is performed in the background. + EntryResult SpeculativeCreateEntry( + const CacheEntryKey& entry_key, + std::unique_ptr handle); + + // Called when the background database operation for a speculative entry + // creation is finished. + void OnSpeculativeCreateEntryFinished( + const scoped_refptr& res_id_or_error, + std::unique_ptr handle, + SqlPersistentStore::EntryInfoOrError result); + // Handles the backend logic for `DoomActiveEntry()`. This method is scheduled // as a normal operation via the `ExclusiveOperationCoordinator`. void HandleDoomActiveEntryOperation( scoped_refptr entry, - CompletionOnceCallback callback, std::unique_ptr handle); // Dooms an active entry. This method must be called while holding an @@ -271,7 +328,7 @@ class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { // scheduled as a normal operation via the `ExclusiveOperationCoordinator`. void HandleDeleteDoomedEntry( const CacheEntryKey& key, - const base::UnguessableToken& token, + const scoped_refptr& res_id_or_error, std::unique_ptr handle); // Handles the backend logic for `DoomEntry()`. This method is scheduled as a @@ -291,45 +348,82 @@ class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { CompletionOnceCallback callback, std::unique_ptr handle); + // Handles the backend logic for `CalculateSizeOfEntriesBetween()`. This + // method is scheduled as an exclusive operation via the + // `ExclusiveOperationCoordinator`. + void HandleCalculateSizeOfEntriesBetweenOperation( + base::Time initial_time, + base::Time end_time, + Int64CompletionOnceCallback callback, + std::unique_ptr handle); + // Handles the backend logic for `UpdateEntryLastUsed()`. This method is // scheduled as a normal operation via the `ExclusiveOperationCoordinator`. void HandleUpdateEntryLastUsedOperation( const CacheEntryKey& key, - const base::UnguessableToken& token, + const scoped_refptr& res_id_or_error, base::Time last_used, - SqlPersistentStore::ErrorCallback callback, + PopInFlightEntryModificationRunner pop_in_flight_entry_modification, std::unique_ptr handle); // Handles the backend logic for `UpdateEntryHeaderAndLastUsed()`. This method // is scheduled as a normal operation via the `ExclusiveOperationCoordinator`. void HandleUpdateEntryHeaderAndLastUsedOperation( const CacheEntryKey& key, - const base::UnguessableToken& token, + const scoped_refptr& res_id_or_error, base::Time last_used, scoped_refptr buffer, int64_t header_size_delta, - SqlPersistentStore::ErrorCallback callback, + PopInFlightEntryModificationRunner pop_in_flight_entry_modification, std::unique_ptr handle); - // Handles the backend logic for `WriteEntryData()`. This method is scheduled - // as a normal operation via the `ExclusiveOperationCoordinator` and forwards - // the call to the persistent store. + // Handles the backend logic for a non-optimistic write operation. This method + // is scheduled as a normal operation via the `ExclusiveOperationCoordinator` + // and forwards the call to the persistent store. void HandleWriteEntryDataOperation( const CacheEntryKey& key, - const base::UnguessableToken& token, + const scoped_refptr& res_id_or_error, int64_t old_body_end, int64_t offset, scoped_refptr buffer, int buf_len, bool truncate, SqlPersistentStore::ErrorCallback callback, + PopInFlightEntryModificationRunner pop_in_flight_entry_modification, std::unique_ptr handle); + // Handles the backend logic for an optimistic write operation. This method is + // scheduled as a normal operation via the `ExclusiveOperationCoordinator` and + // forwards the write to the persistent store. + void HandleOptimisticWriteEntryDataOperation( + const CacheEntryKey& key, + const scoped_refptr& res_id_or_error, + int64_t old_body_end, + int64_t offset, + scoped_refptr buffer, + int buf_len, + bool truncate, + SqlPersistentStore::ErrorCallback maybe_update_res_id_or_error_callback, + PopInFlightEntryModificationRunner pop_in_flight_entry_modification, + std::unique_ptr handle); + + // Called when an optimistic write is finished. `buf_len` is the memory usage + // consumed for the optimistic write. + void OnOptimisticWriteFinished( + const CacheEntryKey& key, + SqlPersistentStore::ResId res_id, + int buf_len, + SqlPersistentStore::ErrorCallback maybe_update_res_id_or_error_callback, + PopInFlightEntryModificationRunner pop_in_flight_entry_modification, + std::unique_ptr handle, + SqlPersistentStore::Error result); + // Handles the backend logic for `ReadEntryData()`. This method is scheduled // as a normal operation via the `ExclusiveOperationCoordinator` and forwards // the call to the persistent store. void HandleReadEntryDataOperation( - const base::UnguessableToken& token, + const CacheEntryKey& key, + const scoped_refptr& res_id_or_error, int64_t offset, scoped_refptr buffer, int buf_len, @@ -342,7 +436,8 @@ class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { // scheduled as a normal operation via the `ExclusiveOperationCoordinator` // and forwards the call to the persistent store. void HandleGetEntryAvailableRangeOperation( - const base::UnguessableToken& token, + const CacheEntryKey& key, + const scoped_refptr& res_id_or_error, int64_t offset, int len, RangeResultCallback callback, @@ -353,6 +448,7 @@ class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { // gathers the keys of all active entries to prevent them from being evicted // and then delegates the actual eviction logic to the persistent store. void HandleTriggerEvictionOperation( + bool is_idle_time_eviction, std::unique_ptr handle); // Handles the backend logic for `OnExternalCacheHit()`. This method is @@ -360,41 +456,43 @@ class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { void HandleOnExternalCacheHitOperation( const CacheEntryKey& key, base::Time now, + PopInFlightEntryModificationRunner pop_in_flight_entry_modification, std::unique_ptr handle); + // Adds an `InFlightEntryModification` to the queue for `entry_key` and + // returns a `PopInFlightEntryModificationRunner`. The returned runner ensures + // that the modification is removed from the queue when the runner goes out of + // scope, guaranteeing proper cleanup even in error paths. + PopInFlightEntryModificationRunner PushInFlightEntryModification( + const CacheEntryKey& entry_key, + InFlightEntryModification in_flight_entry_modification); + + // Removes the oldest `InFlightEntryModification` from the queue for + // `entry_key`. This is called by `PopInFlightEntryModificationRunner` when + // an operation completes or is aborted. + void PopInFlightEntryModification(const CacheEntryKey& entry_key); + // Applies in-flight modifications to an entry's info. void ApplyInFlightEntryModifications( const CacheEntryKey& key, SqlPersistentStore::EntryInfo& entry_info); - // Wraps an `ErrorCallback` to pop the oldest in-flight entry modification - // from `in_flight_entry_modifications_` once the callback is invoked. This - // ensures that the queue of in-flight modifications is managed correctly. - SqlPersistentStore::ErrorCallback - WrapErrorCallbackToPopInFlightEntryModification( - const CacheEntryKey& key, - SqlPersistentStore::ErrorCallback callback); - - // Schedules the `HandleDeleteDoomedEntriesOperation` task to run. This is the - // entry point for the one-time cleanup of entries that were doomed in a - // previous session. - void TriggerDeleteDoomedEntries(); - - // Physically deletes entries that were marked as "doomed" in previous - // sessions from the database. It excludes any currently active doomed entries - // to prevent data corruption. This method is executed as an exclusive - // operation to ensure it has sole access to the cache during cleanup. - void HandleDeleteDoomedEntriesOperation( - std::unique_ptr handle); - const base::FilePath path_; - // Task runner for all background SQLite operations. - scoped_refptr background_task_runner_; + // Task runners for background SQLite operations. + std::vector> + background_task_runners_; // The persistent store that manages the SQLite database. std::unique_ptr store_; + // Coordinates exclusive and normal operations to ensure that exclusive + // operations have exclusive access. This must be declared before + // `active_entries_` and `doomed_entries_` to ensure it is destroyed after + // them. This is critical because `exclusive_operation_coordinator_` may hold + // the last `scoped_refptr` to a `SqlEntryImpl`. + ExclusiveOperationCoordinator exclusive_operation_coordinator_; + // Map of cache keys to currently active (opened) entries. // `raw_ref` is used because the SqlEntryImpl objects are ref-counted and // their lifetime is managed by their ref_count. This map only holds @@ -405,10 +503,6 @@ class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { // (i.e., have outstanding references). std::set> doomed_entries_; - // Coordinates exclusive and normal operations to ensure that exclusive - // operations have exclusive access. - ExclusiveOperationCoordinator exclusive_operation_coordinator_; - // Queue of in-flight entry modifications that need to be applied. // These are typically updates to `last_used` or header data that occur // while an entry is not actively open. @@ -422,6 +516,11 @@ class NET_EXPORT_PRIVATE SqlBackendImpl final : public Backend { // task is pending, only one will be in the queue at any time. bool eviction_operation_queued_ = false; + // The memory usage consumed for optimistic writes. Optimistic writes are + // performed as long as this value does not exceed + // `kSqlDiskCacheOptimisticWriteBufferSize`. + int64_t optimistic_write_buffer_total_size_ = 0; + // Weak pointer factory for this class. base::WeakPtrFactory weak_factory_{this}; }; diff --git a/naiveproxy/src/net/disk_cache/sql/sql_entry_impl.cc b/naiveproxy/src/net/disk_cache/sql/sql_entry_impl.cc index e6e3fa60fc..c9e8abf475 100644 --- a/naiveproxy/src/net/disk_cache/sql/sql_entry_impl.cc +++ b/naiveproxy/src/net/disk_cache/sql/sql_entry_impl.cc @@ -4,56 +4,21 @@ #include "net/disk_cache/sql/sql_entry_impl.h" -#include "base/functional/callback_helpers.h" -#include "base/task/bind_post_task.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" #include "net/disk_cache/sql/sql_backend_impl.h" namespace disk_cache { -namespace { - -// Wraps a OnceCallback. If the returned callback is destroyed without being -// run, the original callback is run with `abort_result`. -// This ensures that the callback is always run, even if the operation is -// cancelled or the owner is destroyed. -template -base::OnceCallback WrapCallbackWithAbortError( - base::OnceCallback callback, - ResultType abort_result) { - CHECK(callback); - auto [success_cb, failure_cb] = base::SplitOnceCallback(std::move(callback)); - - // The ScopedClosureRunner will run the `failure_cb` with `abort_result` if - // it's destroyed before being released. - auto runner = std::make_unique( - base::BindPostTaskToCurrentDefault( - base::BindOnce(std::move(failure_cb), abort_result))); - - // The returned callback represents the "success" path. - return base::BindOnce( - [](std::unique_ptr runner, - base::OnceCallback cb, ResultType result) { - // Release the runner to prevent the failure callback from running on - // destruction. - std::ignore = runner->Release(); - // Run the success callback with the provided result. - std::move(cb).Run(std::move(result)); - }, - std::move(runner), std::move(success_cb)); -} - -} // namespace SqlEntryImpl::SqlEntryImpl(base::WeakPtr backend, CacheEntryKey key, - const base::UnguessableToken& token, + scoped_refptr res_id_or_error, base::Time last_used, int64_t body_end, scoped_refptr head) : backend_(backend), key_(key), - token_(token), + res_id_or_error_(std::move(res_id_or_error)), last_used_(last_used), body_end_(body_end), head_(head ? std::move(head) @@ -73,13 +38,11 @@ SqlEntryImpl::~SqlEntryImpl() { // store. const int64_t header_size_delta = static_cast(head_->size()) - *previous_header_size_in_storage_; - backend_->UpdateEntryHeaderAndLastUsed(key_, token_, last_used_, head_, - header_size_delta, - base::DoNothing()); + backend_->UpdateEntryHeaderAndLastUsed(key_, res_id_or_error_, last_used_, + head_, header_size_delta); } else if (last_used_modified_) { // Otherwise, if only last_used was modified, update just last_used. - backend_->UpdateEntryLastUsed(key_, token_, last_used_, - base::DoNothing()); + backend_->UpdateEntryLastUsed(key_, res_id_or_error_, last_used_); } backend_->ReleaseActiveEntry(*this); } @@ -89,7 +52,7 @@ void SqlEntryImpl::Doom() { if (doomed_ || !backend_) { return; } - backend_->DoomActiveEntry(*this, base::DoNothing()); + backend_->DoomActiveEntry(*this); } void SqlEntryImpl::Close() { @@ -168,16 +131,10 @@ int SqlEntryImpl::ReadDataInternal(int64_t offset, if (body_end_ <= offset) { return 0; } - backend_->ReadEntryData( - key_, token_, offset, buf, buf_len, body_end_, sparse_reading, - base::BindOnce( - [](CompletionOnceCallback callback, - SqlPersistentStore::IntOrError result) { - std::move(callback).Run(result.value_or(net::ERR_FAILED)); - }, - WrapCallbackWithAbortError(std::move(callback), - net::ERR_ABORTED))); - return net::ERR_IO_PENDING; + + return backend_->ReadEntryData(key_, res_id_or_error_, offset, buf, buf_len, + body_end_, sparse_reading, + std::move(callback)); } int SqlEntryImpl::WriteData(int index, @@ -270,22 +227,9 @@ int SqlEntryImpl::WriteDataInternal(int64_t offset, const auto old_body_end = body_end_; body_end_ = new_body_end; - // TODO(crbug.com/422065015): Consider implementing optimistic writes, similar - // to Simple Cache (see https://chromiumcodereview.appspot.com/13907009). This - // would allow returning synchronously if no other operations are pending. - backend_->WriteEntryData( - key_, token_, old_body_end, body_end_, offset, buf, buf_len, truncate, - base::BindOnce( - [](CompletionOnceCallback callback, int buf_len, - SqlPersistentStore::Error result) { - std::move(callback).Run(result == SqlPersistentStore::Error::kOk - ? buf_len - : net::ERR_FAILED); - }, - WrapCallbackWithAbortError(std::move(callback), - net::ERR_ABORTED), - buf_len)); - return net::ERR_IO_PENDING; + return backend_->WriteEntryData(key_, res_id_or_error_, old_body_end, + body_end_, offset, buf, buf_len, truncate, + std::move(callback)); } int SqlEntryImpl::ReadSparseData(int64_t offset, @@ -326,11 +270,8 @@ RangeResult SqlEntryImpl::GetAvailableRange(int64_t offset, return RangeResult(net::ERR_INVALID_ARGUMENT); } - backend_->GetEntryAvailableRange( - key_, token_, offset, len, - WrapCallbackWithAbortError( - std::move(callback), RangeResult(net::ERR_ABORTED))); - return RangeResult(net::ERR_IO_PENDING); + return backend_->GetEntryAvailableRange(key_, res_id_or_error_, offset, len, + std::move(callback)); } bool SqlEntryImpl::CouldBeSparse() const { diff --git a/naiveproxy/src/net/disk_cache/sql/sql_entry_impl.h b/naiveproxy/src/net/disk_cache/sql/sql_entry_impl.h index 7e03f2caa8..7ef323c689 100644 --- a/naiveproxy/src/net/disk_cache/sql/sql_entry_impl.h +++ b/naiveproxy/src/net/disk_cache/sql/sql_entry_impl.h @@ -10,7 +10,6 @@ #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" -#include "base/unguessable_token.h" #include "net/disk_cache/buildflags.h" #include "net/disk_cache/disk_cache.h" #include "net/disk_cache/sql/cache_entry_key.h" @@ -35,10 +34,16 @@ class NET_EXPORT_PRIVATE SqlEntryImpl final : public Entry, public base::RefCounted { public: + // For a speculatively created entry, this holds `std::nullopt` initially, and + // when the entry creation task is complete, it will hold either the `ResId` + // on success or an `Error` on failure. Otherwise, it just holds a `ResId`. + using ResIdOrErrorHolder = base::RefCountedData>>; + // Constructs a SqlEntryImpl. SqlEntryImpl(base::WeakPtr backend, CacheEntryKey key, - const base::UnguessableToken& token, + scoped_refptr res_id_or_error, base::Time last_used, int64_t body_end, scoped_refptr head); @@ -79,8 +84,10 @@ class NET_EXPORT_PRIVATE SqlEntryImpl final // Returns the cache key of the entry. const CacheEntryKey& cache_key() const { return key_; } - // Returns the unique token for this entry instance. - const base::UnguessableToken& token() const { return token_; } + // Returns the holder for the resource ID or an error. + const scoped_refptr& res_id_or_error() const { + return res_id_or_error_; + } // Marks the entry as doomed. This is called by the backend when an // active entry is doomed. @@ -118,10 +125,9 @@ class NET_EXPORT_PRIVATE SqlEntryImpl final // The key for this cache entry. const CacheEntryKey key_; - // A unique token identifying this specific instance of the entry. - // This is used to ensure that operations (like dooming or deleting) - // target the correct version of an entry if it's reopened. - const base::UnguessableToken token_; + // Holds the ResId of the entry or an error if the speculative creation + // failed. + const scoped_refptr res_id_or_error_; // The last time this entry was accessed. base::Time last_used_; diff --git a/naiveproxy/src/net/disk_cache/sql/sql_persistent_store.cc b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store.cc index 5a2ae5ede3..3287fd7153 100644 --- a/naiveproxy/src/net/disk_cache/sql/sql_persistent_store.cc +++ b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store.cc @@ -4,123 +4,52 @@ #include "net/disk_cache/sql/sql_persistent_store.h" -#include +#include #include -#include +#include +#include +#include +#include +#include "base/barrier_callback.h" +#include "base/check.h" #include "base/containers/flat_set.h" -#include "base/files/file_util.h" +#include "base/files/file_path.h" #include "base/functional/bind.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_functions.h" -#include "base/numerics/checked_math.h" #include "base/numerics/clamped_math.h" #include "base/numerics/safe_conversions.h" -#include "base/numerics/safe_math.h" -#include "base/system/sys_info.h" -#include "base/threading/sequence_bound.h" -#include "base/timer/elapsed_timer.h" -#include "base/trace_event/trace_event.h" +#include "base/strings/strcat.h" +#include "base/task/sequenced_task_runner.h" +#include "base/time/time.h" #include "base/types/expected.h" +#include "net/base/cache_type.h" #include "net/base/io_buffer.h" -#include "net/disk_cache/cache_util.h" +#include "net/disk_cache/sql/cache_entry_key.h" +#include "net/disk_cache/sql/eviction_candidate_aggregator.h" #include "net/disk_cache/sql/sql_backend_constants.h" -#include "net/disk_cache/sql/sql_persistent_store_queries.h" -#include "sql/database.h" -#include "sql/error_delegate_util.h" -#include "sql/meta_table.h" -#include "sql/sqlite_result_code_values.h" -#include "sql/statement.h" -#include "sql/transaction.h" -#include "third_party/perfetto/include/perfetto/tracing/track.h" +#include "net/disk_cache/sql/sql_persistent_store_backend_shard.h" namespace disk_cache { namespace { -constexpr std::string_view kHistogramPrefix = "Net.SqlDiskCache.Backend."; - -// Holds summary statistics about the cache store. -struct StoreStatus { - int32_t entry_count = 0; - int64_t total_size = 0; -}; - -// The result of a successful initialization. -struct InitResult { - explicit InitResult(int64_t max_bytes) : max_bytes(max_bytes) {} - ~InitResult() = default; - - int64_t max_bytes = 0; -}; - -// A helper struct to associate an IOBuffer with a starting offset. -struct BufferWithStart { - scoped_refptr buffer; - int64_t start; -}; - -using disk_cache_sql_queries::GetQuery; -using disk_cache_sql_queries::Query; - -using EntryInfo = SqlPersistentStore::EntryInfo; -using Error = SqlPersistentStore::Error; -using EntryInfoOrError = SqlPersistentStore::EntryInfoOrError; -using OptionalEntryInfoOrError = SqlPersistentStore::OptionalEntryInfoOrError; -using EntryInfoWithIdAndKey = SqlPersistentStore::EntryInfoWithIdAndKey; -using OptionalEntryInfoWithIdAndKey = - SqlPersistentStore::OptionalEntryInfoWithIdAndKey; -using IntOrError = SqlPersistentStore::IntOrError; -using InitResultOrError = base::expected; - -// A helper struct to bundle an operation's result with a flag indicating -// whether an eviction check is needed. This allows the background sequence, -// which has direct access to cache size information, to notify the main -// sequence that an eviction might be necessary without requiring an extra -// cross-sequence call to check the cache size. -template -struct ResultAndEvictionRequested { - ResultAndEvictionRequested(ResultType result, bool eviction_requested) - : result(std::move(result)), eviction_requested(eviction_requested) {} - ~ResultAndEvictionRequested() = default; - ResultAndEvictionRequested(ResultAndEvictionRequested&&) = default; - - // The actual result of the operation. - ResultType result; - - // True if the cache size has exceeded the high watermark, signaling that an - // eviction task should be considered. - bool eviction_requested; -}; - -using ErrorAndEvictionRequested = ResultAndEvictionRequested; -using EntryInfoOrErrorAndEvictionRequested = - ResultAndEvictionRequested; -using IntOrErrorAndEvictionRequested = ResultAndEvictionRequested; - -std::optional ToUnguessableToken(int64_t token_high, - int64_t token_low) { - // There is no `sql::Statement::ColumnUint64()` method. So we cast to - // uint64_t. - return base::UnguessableToken::Deserialize(static_cast(token_high), - static_cast(token_low)); -} - -int64_t TokenHigh(const base::UnguessableToken& token) { - return static_cast(token.GetHighForSerialization()); -} -int64_t TokenLow(const base::UnguessableToken& token) { - return static_cast(token.GetLowForSerialization()); -} - -bool IsBlobSizeValid(int64_t blob_start, - int64_t blob_end, - const base::span& blob) { - size_t blob_size; - if (!base::CheckSub(blob_end, blob_start).AssignIfValid(&blob_size)) { - return false; +std::vector> GroupResIdPerShardId( + std::vector excluded_list, + size_t size_of_shards) { + std::vector> res_id_lists( + size_of_shards); + for (const auto& res_id_and_shard_id : excluded_list) { + res_id_lists[res_id_and_shard_id.shard_id.value()].emplace_back( + res_id_and_shard_id.res_id); } - return blob.size() == blob_size; + std::vector> res_id_sets; + for (size_t i = 0; i < size_of_shards; ++i) { + std::sort(res_id_lists[i].begin(), res_id_lists[i].end()); + res_id_sets.emplace_back(base::sorted_unique, std::move(res_id_lists[i])); + } + return res_id_sets; } // Calculates the maximum size for a single cache entry's data. @@ -130,2363 +59,489 @@ int64_t CalculateMaxFileSize(int64_t max_bytes) { kSqlBackendMinFileSizeLimit); } -// Helper functions to populate Perfetto trace events with details. -void PopulateTraceDetails(int result, perfetto::TracedDictionary& dict) { - dict.Add("result", result); -} -void PopulateTraceDetails(Error error, perfetto::TracedDictionary& dict) { - dict.Add("error", static_cast(error)); -} -void PopulateTraceDetails(const StoreStatus& store_status, - perfetto::TracedDictionary& dict) { - dict.Add("entry_count", store_status.entry_count); - dict.Add("total_size", store_status.total_size); -} -void PopulateTraceDetails(const EntryInfo& entry_info, - perfetto::TracedDictionary& dict) { - dict.Add("token", entry_info.token.ToString()); - dict.Add("last_used", entry_info.last_used); - dict.Add("body_end", entry_info.body_end); - dict.Add("head_size", entry_info.head ? entry_info.head->size() : 0); - dict.Add("opened", entry_info.opened); -} -void PopulateTraceDetails(const std::optional& entry_info, - perfetto::TracedDictionary& dict) { - if (entry_info) { - PopulateTraceDetails(*entry_info, dict); - } else { - dict.Add("entry_info", "not found"); +} // namespace + +// static +std::vector> +SqlPersistentStore::CreateBackendShards( + const base::FilePath& path, + net::CacheType type, + std::vector> + background_task_runners) { + const size_t num_shards = background_task_runners.size(); + CHECK(num_shards < std::numeric_limits::max()); + std::vector> backend_shards; + backend_shards.reserve(num_shards); + for (size_t i = 0; i < num_shards; ++i) { + backend_shards.emplace_back(std::make_unique( + ShardId(i), path, type, background_task_runners[i])); } -} -void PopulateTraceDetails(const RangeResult& range_result, - perfetto::TracedDictionary& dict) { - dict.Add("range_start", range_result.start); - dict.Add("range_available_len", range_result.available_len); -} -void PopulateTraceDetails(const EntryInfoWithIdAndKey& result, - perfetto::TracedDictionary& dict) { - PopulateTraceDetails(result.info, dict); - dict.Add("res_id", result.res_id); - dict.Add("key", result.key.string()); -} -void PopulateTraceDetails( - const std::optional& entry_info, - perfetto::TracedDictionary& dict) { - if (entry_info) { - PopulateTraceDetails(*entry_info, dict); - } else { - dict.Add("entry_info", "not found"); - } -} -void PopulateTraceDetails(Error error, - const StoreStatus& store_status, - perfetto::TracedDictionary& dict) { - PopulateTraceDetails(error, dict); - PopulateTraceDetails(store_status, dict); -} -template -void PopulateTraceDetails(const base::expected& result, - const StoreStatus& store_status, - perfetto::TracedDictionary& dict) { - if (result.has_value()) { - PopulateTraceDetails(*result, dict); - } else { - PopulateTraceDetails(result.error(), dict); - } - PopulateTraceDetails(store_status, dict); + return backend_shards; } -// Records timing and result histograms for a backend method. This logs the -// method's duration to ".SuccessTime" or ".FailureTime" histograms and the -// `Error` code to a ".Result" histogram. -void RecordTimeAndErrorResultHistogram(std::string_view method_name, - base::TimeDelta time_delta, - Error error, - bool corruption_detected) { +SqlPersistentStore::SqlPersistentStore( + const base::FilePath& path, + int64_t max_bytes, + net::CacheType type, + std::vector> + background_task_runners) + : background_task_runners_(std::move(background_task_runners)), + backend_shards_( + CreateBackendShards(path, type, background_task_runners_)), + user_max_bytes_(max_bytes) {} +SqlPersistentStore::~SqlPersistentStore() = default; + +void SqlPersistentStore::Initialize(ErrorCallback callback) { + auto barrier_callback = base::BarrierCallback( + GetSizeOfShards(), + base::BindOnce(&SqlPersistentStore::OnInitializeFinished, + weak_factory_.GetWeakPtr(), std::move(callback))); + for (const auto& backend_shard : backend_shards_) { + backend_shard->Initialize(user_max_bytes_, barrier_callback); + } +} + +void SqlPersistentStore::OpenOrCreateEntry(const CacheEntryKey& key, + EntryInfoOrErrorCallback callback) { + GetShard(key).OpenOrCreateEntry(key, std::move(callback)); +} + +void SqlPersistentStore::OpenEntry(const CacheEntryKey& key, + OptionalEntryInfoOrErrorCallback callback) { + GetShard(key).OpenEntry(key, std::move(callback)); +} + +void SqlPersistentStore::CreateEntry(const CacheEntryKey& key, + base::Time creation_time, + EntryInfoOrErrorCallback callback) { + GetShard(key).CreateEntry(key, creation_time, std::move(callback)); +} + +void SqlPersistentStore::DoomEntry(const CacheEntryKey& key, + ResId res_id, + ErrorCallback callback) { + GetShard(key).DoomEntry(key, res_id, std::move(callback)); +} + +void SqlPersistentStore::DeleteDoomedEntry(const CacheEntryKey& key, + ResId res_id, + ErrorCallback callback) { + GetShard(key).DeleteDoomedEntry(key, res_id, std::move(callback)); +} + +void SqlPersistentStore::DeleteLiveEntry(const CacheEntryKey& key, + ErrorCallback callback) { + GetShard(key).DeleteLiveEntry(key, std::move(callback)); +} + +void SqlPersistentStore::DeleteAllEntries(ErrorCallback callback) { + auto barrier_callback = CreateBarrierErrorCallback(std::move(callback)); + for (const auto& backend_shard : backend_shards_) { + backend_shard->DeleteAllEntries(barrier_callback); + } +} + +void SqlPersistentStore::DeleteLiveEntriesBetween( + base::Time initial_time, + base::Time end_time, + std::vector excluded_list, + ErrorCallback callback) { + auto barrier_callback = CreateBarrierErrorCallback(std::move(callback)); + auto res_id_sets = + GroupResIdPerShardId(std::move(excluded_list), GetSizeOfShards()); + for (size_t i = 0; i < GetSizeOfShards(); ++i) { + backend_shards_[i]->DeleteLiveEntriesBetween( + initial_time, end_time, std::move(res_id_sets[i]), barrier_callback); + } +} + +void SqlPersistentStore::UpdateEntryLastUsedByKey(const CacheEntryKey& key, + base::Time last_used, + ErrorCallback callback) { + GetShard(key).UpdateEntryLastUsedByKey(key, last_used, std::move(callback)); +} + +void SqlPersistentStore::UpdateEntryLastUsedByResId(const CacheEntryKey& key, + ResId res_id, + base::Time last_used, + ErrorCallback callback) { + GetShard(key).UpdateEntryLastUsedByResId(res_id, last_used, + std::move(callback)); +} + +void SqlPersistentStore::UpdateEntryHeaderAndLastUsed( + const CacheEntryKey& key, + ResId res_id, + base::Time last_used, + scoped_refptr buffer, + int64_t header_size_delta, + ErrorCallback callback) { + GetShard(key).UpdateEntryHeaderAndLastUsed( + key, res_id, last_used, std::move(buffer), header_size_delta, + std::move(callback)); +} + +void SqlPersistentStore::WriteEntryData(const CacheEntryKey& key, + ResId res_id, + int64_t old_body_end, + int64_t offset, + scoped_refptr buffer, + int buf_len, + bool truncate, + ErrorCallback callback) { + GetShard(key).WriteEntryData(key, res_id, old_body_end, offset, + std::move(buffer), buf_len, truncate, + std::move(callback)); +} + +void SqlPersistentStore::ReadEntryData(const CacheEntryKey& key, + ResId res_id, + int64_t offset, + scoped_refptr buffer, + int buf_len, + int64_t body_end, + bool sparse_reading, + IntOrErrorCallback callback) { + GetShard(key).ReadEntryData(key, res_id, offset, std::move(buffer), buf_len, + body_end, sparse_reading, std::move(callback)); +} + +void SqlPersistentStore::GetEntryAvailableRange(const CacheEntryKey& key, + ResId res_id, + int64_t offset, + int len, + RangeResultCallback callback) { + GetShard(key).GetEntryAvailableRange(key, res_id, offset, len, + std::move(callback)); +} + +void SqlPersistentStore::CalculateSizeOfEntriesBetween( + base::Time initial_time, + base::Time end_time, + Int64OrErrorCallback callback) { + auto barrier_callback = base::BarrierCallback( + GetSizeOfShards(), + base::BindOnce( + [](Int64OrErrorCallback callback, std::vector results) { + int64_t total_size = 0; + for (const auto& result : results) { + if (!result.has_value()) { + std::move(callback).Run(base::unexpected(result.error())); + return; + } + total_size += result.value(); + } + std::move(callback).Run(total_size); + }, + std::move(callback))); + for (const auto& backend_shard : backend_shards_) { + backend_shard->CalculateSizeOfEntriesBetween(initial_time, end_time, + barrier_callback); + } +} + +void SqlPersistentStore::OpenNextEntry( + const EntryIterator& iterator, + OptionalEntryInfoWithKeyAndIteratorCallback callback) { + if (iterator.value().shard_id.value() >= GetSizeOfShards()) { + std::move(callback).Run(std::nullopt); + return; + } + backend_shards_[iterator.value().shard_id.value()]->OpenNextEntry( + iterator, + base::BindOnce( + [](base::WeakPtr weak_ptr, ShardId shard_id, + OptionalEntryInfoWithKeyAndIteratorCallback callback, + OptionalEntryInfoWithKeyAndIterator result) { + if (!weak_ptr) { + return; + } + if (result.has_value()) { + std::move(callback).Run(std::move(result)); + return; + } + EntryIterator new_iterator; + new_iterator.value().shard_id = ShardId(shard_id.value() + 1); + weak_ptr->OpenNextEntry(new_iterator, std::move(callback)); + }, + weak_factory_.GetWeakPtr(), iterator.value().shard_id, + std::move(callback))); +} + +SqlPersistentStore::EvictionUrgency SqlPersistentStore::GetEvictionUrgency() { + if (eviction_result_callback_) { + return EvictionUrgency::kNotNeeded; + } + // Checks if the total size of entries exceeds the high watermark and the + // database is open, to determine if eviction should be initiated. + const int64_t current_size = GetSizeOfAllEntries(); + if (current_size > high_watermark_) { + return EvictionUrgency::kNeeded; + } + if (current_size > idle_time_high_watermark_) { + return EvictionUrgency::kIdleTime; + } + return EvictionUrgency::kNotNeeded; +} + +void SqlPersistentStore::StartEviction( + std::vector excluded_list, + bool is_idle_time_eviction, + ErrorCallback callback) { + CHECK(!eviction_result_callback_); + CHECK(callback); + const int64_t size_to_be_removed = GetSizeOfAllEntries() - low_watermark_; + if (size_to_be_removed <= 0) { + std::move(callback).Run(Error::kOk); + return; + } + eviction_result_callback_ = std::move(callback); + auto barrier_callback = base::BarrierCallback( + GetSizeOfShards(), + base::BindOnce(&SqlPersistentStore::OnEvictionFinished, + weak_factory_.GetWeakPtr(), is_idle_time_eviction, + base::TimeTicks::Now())); + auto aggregator = base::MakeRefCounted( + size_to_be_removed, background_task_runners_); + auto res_id_sets = + GroupResIdPerShardId(std::move(excluded_list), GetSizeOfShards()); + for (size_t i = 0; i < GetSizeOfShards(); ++i) { + backend_shards_[i]->StartEviction( + size_to_be_removed, std::move(res_id_sets[i]), is_idle_time_eviction, + aggregator, barrier_callback); + } +} + +void SqlPersistentStore::OnEvictionFinished( + bool is_idle_time_eviction, + base::TimeTicks start_time, + std::vector results) { + Error error = Error::kOk; + size_t count = 0; + for (const auto& result : results) { + if (!result.has_value()) { + error = result.error(); + break; + } + count += result.value().size(); + } + const std::string_view kMethodName = + is_idle_time_eviction ? "RunEviction" : "RunEvictionOnIdleTime"; base::UmaHistogramMicrosecondsTimes( - base::StrCat({kHistogramPrefix, method_name, - error == Error::kOk ? ".SuccessTime" : ".FailureTime", - corruption_detected ? "WithCorruption" : ""}), - time_delta); + base::StrCat({kSqlDiskCacheBackendHistogramPrefix, kMethodName, + error == Error::kOk ? ".SuccessTime" : ".FailureTime"}), + base::TimeTicks::Now() - start_time); base::UmaHistogramEnumeration( - base::StrCat({kHistogramPrefix, method_name, - corruption_detected ? ".ResultWithCorruption" : ".Result"}), + base::StrCat( + {kSqlDiskCacheBackendHistogramPrefix, kMethodName, ".Result"}), error); + if (error == Error::kOk) { + base::UmaHistogramCounts1000( + base::StrCat( + {kSqlDiskCacheBackendHistogramPrefix, kMethodName, ".EntryCount"}), + count); + } + + CHECK(eviction_result_callback_); + auto callback = std::move(eviction_result_callback_); + eviction_result_callback_.Reset(); + std::move(callback).Run(error); } -// Sets up the database schema and indexes. -[[nodiscard]] bool InitSchema(sql::Database& db) { - if (!db.Execute(GetQuery(Query::kInitSchema_CreateTableResources)) || - !db.Execute(GetQuery(Query::kInitSchema_CreateTableBlobs)) || - !db.Execute(GetQuery(Query::kIndex_ResourcesToken)) || - !db.Execute(GetQuery(Query::kIndex_ResourcesCacheKeyDoomed)) || - !db.Execute(GetQuery(Query::kIndex_ResourcesDoomedLastUsed)) || - !db.Execute(GetQuery(Query::kIndex_ResourcesDoomedResId)) || - !db.Execute(GetQuery(Query::kIndex_BlobsTokenStart))) { +int64_t SqlPersistentStore::MaxFileSize() const { + return max_file_size_; +} + +int64_t SqlPersistentStore::MaxSize() const { + return max_bytes_; +} + +int32_t SqlPersistentStore::GetEntryCount() const { + base::ClampedNumeric result; + for (const auto& backend_shard : backend_shards_) { + result += backend_shard->GetEntryCount(); + } + return result; +} + +void SqlPersistentStore::GetEntryCountAsync(Int32Callback callback) const { + auto barrier_callback = base::BarrierCallback( + GetSizeOfShards(), + base::BindOnce( + [](Int32Callback callback, const std::vector& results) { + int32_t total_count = 0; + for (const auto& result : results) { + total_count += result; + } + std::move(callback).Run(total_count); + }, + std::move(callback))); + for (const auto& backend_shard : backend_shards_) { + backend_shard->GetEntryCountAsync(barrier_callback); + } +} + +int64_t SqlPersistentStore::GetSizeOfAllEntries() const { + base::ClampedNumeric result; + for (const auto& backend_shard : backend_shards_) { + result += backend_shard->GetSizeOfAllEntries(); + } + return result; +} + +bool SqlPersistentStore::MaybeLoadInMemoryIndex(ErrorCallback callback) { + if (in_memory_load_trigered_) { return false; } + in_memory_load_trigered_ = true; + auto barrier_callback = CreateBarrierErrorCallback(std::move(callback)); + for (const auto& backend_shard : backend_shards_) { + backend_shard->LoadInMemoryIndex(barrier_callback); + } return true; } -// Retrieves a value from the provided `sql::MetaTable` and initializes it if -// not found. -[[nodiscard]] bool GetOrInitializeMetaValue(sql::MetaTable& meta, - std::string_view key, - int64_t& value, - int64_t default_value) { - if (meta.GetValue(key, &value)) { - return true; - } - value = default_value; - return meta.SetValue(key, value); -} - -// The `Backend` class encapsulates all direct interaction with the SQLite -// database. It is designed to be owned by a `base::SequenceBound` and run on a -// dedicated background sequence to avoid blocking the network IO thread. -class Backend { - public: - Backend(const base::FilePath& path, int64_t max_bytes, net::CacheType type) - : path_(path), - max_bytes_( - // If the specified max_bytes is valid, use it. Otherwise, calculate - // a preferred size based on available disk space. - max_bytes > 0 - ? max_bytes - : PreferredCacheSize(base::SysInfo::AmountOfFreeDiskSpace(path), - type)), - high_watermark_(max_bytes_ - - max_bytes_ / kSqlBackendEvictionMarginDivisor), - low_watermark_(max_bytes_ - - 2 * (max_bytes_ / kSqlBackendEvictionMarginDivisor)), - db_(sql::DatabaseOptions() - .set_exclusive_locking(true) -#if BUILDFLAG(IS_WIN) - .set_exclusive_database_file_lock(true) -#endif // IS_WIN - .set_preload(true) - .set_wal_mode(true), - // Tag for metrics collection. - sql::Database::Tag("HttpCacheDiskCache")) { - } - - Backend(const Backend&) = delete; - Backend& operator=(const Backend&) = delete; - ~Backend() = default; - - // Initializes the database, including setting up the schema and reading - // metadata. Returns the cache status and max size on success. - InitResultOrError Initialize(); - - int32_t GetEntryCount() const { return store_status_.entry_count; } - int64_t GetSizeOfAllEntries() const { - base::ClampedNumeric result; - result = store_status_.entry_count; - result *= kSqlBackendStaticResourceSize; - result += store_status_.total_size; - return result; - } - - EntryInfoOrErrorAndEvictionRequested OpenOrCreateEntry( - const CacheEntryKey& key); - OptionalEntryInfoOrError OpenEntry(const CacheEntryKey& key); - EntryInfoOrErrorAndEvictionRequested CreateEntry(const CacheEntryKey& key); - - ErrorAndEvictionRequested DoomEntry(const CacheEntryKey& key, - const base::UnguessableToken& token); - ErrorAndEvictionRequested DeleteDoomedEntry( - const CacheEntryKey& key, - const base::UnguessableToken& token); - Error DeleteDoomedEntries( - base::flat_set excluded_tokens); - ErrorAndEvictionRequested DeleteLiveEntry(const CacheEntryKey& key); - - ErrorAndEvictionRequested DeleteAllEntries(); - ErrorAndEvictionRequested DeleteLiveEntriesBetween( - base::Time initial_time, - base::Time end_time, - base::flat_set excluded_keys); - Error UpdateEntryLastUsed(const CacheEntryKey& key, base::Time last_used); - ErrorAndEvictionRequested UpdateEntryHeaderAndLastUsed( - const CacheEntryKey& key, - const base::UnguessableToken& token, - base::Time last_used, - scoped_refptr buffer, - int64_t header_size_delta); - ErrorAndEvictionRequested WriteEntryData(const CacheEntryKey& key, - const base::UnguessableToken& token, - int64_t old_body_end, - int64_t offset, - scoped_refptr buffer, - int buf_len, - bool truncate); - IntOrError ReadEntryData(const base::UnguessableToken& token, - int64_t offset, - scoped_refptr buffer, - int buf_len, - int64_t body_end, - bool sparse_reading); - RangeResult GetEntryAvailableRange(const base::UnguessableToken& token, - int64_t offset, - int len); - int64_t CalculateSizeOfEntriesBetween(base::Time initial_time, - base::Time end_time); - OptionalEntryInfoWithIdAndKey OpenLatestEntryBeforeResId( - int64_t res_id_cursor); - ErrorAndEvictionRequested RunEviction( - base::flat_set excluded_keys); - - void EnableStrictCorruptionCheckForTesting() { - strict_corruption_check_enabled_ = true; - } - - private: - void DatabaseErrorCallback(int error, sql::Statement* statement); - - Error InitializeInternal(bool& corruption_detected); - EntryInfoOrError OpenOrCreateEntryInternal(const CacheEntryKey& key, - bool& corruption_detected); - OptionalEntryInfoOrError OpenEntryInternal(const CacheEntryKey& key, - bool& corruption_detected); - EntryInfoOrError CreateEntryInternal(const CacheEntryKey& key, - bool run_existance_check, - bool& corruption_detected); - Error DoomEntryInternal(const CacheEntryKey& key, - const base::UnguessableToken& token, - bool& corruption_detected); - Error DeleteDoomedEntryInternal(const CacheEntryKey& key, - const base::UnguessableToken& token, - bool& corruption_detected); - Error DeleteDoomedEntriesInternal( - const base::flat_set& excluded_tokens, - size_t& deleted_count, - bool& corruption_detected); - Error DeleteLiveEntryInternal(const CacheEntryKey& key, - bool& corruption_detected); - Error DeleteAllEntriesInternal(bool& corruption_detected); - Error DeleteLiveEntriesBetweenInternal( - base::Time initial_time, - base::Time end_time, - const base::flat_set& excluded_keys, - bool& corruption_detected); - Error UpdateEntryLastUsedInternal(const CacheEntryKey& key, - base::Time last_used); - Error UpdateEntryHeaderAndLastUsedInternal( - const CacheEntryKey& key, - const base::UnguessableToken& token, - base::Time last_used, - scoped_refptr buffer, - int64_t header_size_delta, - bool& corruption_detected); - Error WriteEntryDataInternal(const CacheEntryKey& key, - const base::UnguessableToken& token, - int64_t old_body_end, - int64_t offset, - scoped_refptr buffer, - int buf_len, - bool truncate, - bool& corruption_detected); - IntOrError ReadEntryDataInternal(const base::UnguessableToken& token, - int64_t offset, - scoped_refptr buffer, - int buf_len, - int64_t body_end, - bool sparse_reading, - bool& corruption_detected); - RangeResult GetEntryAvailableRangeInternal( - const base::UnguessableToken& token, - int64_t offset, - int len); - int64_t CalculateSizeOfEntriesBetweenInternal(base::Time initial_time, - base::Time end_time); - OptionalEntryInfoWithIdAndKey OpenLatestEntryBeforeResIdInternal( - int64_t res_id_cursor, - bool& corruption_detected); - Error RunEvictionInternal(const base::flat_set& excluded_keys, - bool& corruption_detected); - - // Trims blobs that overlap with the new write range [offset, end), and - // updates the total size delta. - Error TrimOverlappingBlobs( - const base::UnguessableToken& token, - int64_t offset, - int64_t end, - bool truncate, - base::CheckedNumeric& checked_total_size_delta, - bool& corruption_detected); - // Truncates data by deleting all blobs that start at or after the given - // offset. - Error TruncateBlobsAfter( - const base::UnguessableToken& token, - int64_t truncate_offset, - base::CheckedNumeric& checked_total_size_delta); - // Inserts a vector of new blobs into the database, and updates the total size - // delta. - Error InsertNewBlobs(const base::UnguessableToken& token, - const std::vector& new_blobs, - base::CheckedNumeric& checked_total_size_delta); - // Inserts a single new blob into the database, and updates the total size - // delta. - Error InsertNewBlob(const base::UnguessableToken& token, - int64_t start, - const scoped_refptr& buffer, - int buf_len, - base::CheckedNumeric& checked_total_size_delta); - // Deletes blobs by their IDs, and updates the total size delta. - Error DeleteBlobsById(const std::vector& blob_ids_to_be_removed, - base::CheckedNumeric& checked_total_size_delta, - bool& corruption_detected); - // Deletes a single blob by its ID, and updates the total size delta. - Error DeleteBlobById(int64_t blob_id, - base::CheckedNumeric& checked_total_size_delta, - bool& corruption_detected); - // Deletes all blobs associated with a given token. - Error DeleteBlobsByToken(const base::UnguessableToken& token); - // Deletes all blobs associated with a list of entry tokens. - Error DeleteBlobsByTokens(const std::vector& tokens); - // Deletes multiple resource entries from the `resources` table by their - // `res_id`s. - Error DeleteResourcesByResIds(const std::vector& res_ids); - - // Updates the in-memory `store_status_` by `entry_count_delta` and - // `total_size_delta`. If the update results in an overflow or a negative - // value, it recalculates the correct value from the database to recover from - // potential metadata corruption. - // It then updates the meta table values and attempts to commit the - // `transaction`. - // Returns Error::kOk on success, or an error code on failure. - Error UpdateStoreStatusAndCommitTransaction(sql::Transaction& transaction, - int64_t entry_count_delta, - int64_t total_size_delta, - bool& corruption_detected); - - // Recalculates the store's status (entry count and total size) directly from - // the database. This is a recovery mechanism used when metadata might be - // inconsistent, e.g., after a numerical overflow. - // Returns Error::kOk on success, or an error code on failure. - Error RecalculateStoreStatusAndCommitTransaction( - sql::Transaction& transaction); - - int64_t CalculateResourceEntryCount(); - int64_t CalculateTotalSize(); - - // A helper method for checking that the database initialization was - // successful before proceeding with any database operations. - void CheckDatabaseInitStatus() { - CHECK(db_init_status_.has_value()); - CHECK_EQ(*db_init_status_, Error::kOk); - } - - bool ShouldStartEviction() const { - return GetSizeOfAllEntries() > high_watermark_; - } - - void MaybeCrashIfCorrupted(bool corruption_detected) { - CHECK(!(corruption_detected && strict_corruption_check_enabled_)); - } - - const base::FilePath path_; - const int64_t max_bytes_; - const int64_t high_watermark_; - const int64_t low_watermark_; - sql::Database db_; - sql::MetaTable meta_table_; - std::optional db_init_status_; - StoreStatus store_status_; - bool strict_corruption_check_enabled_ = false; -}; - -InitResultOrError Backend::Initialize() { - TRACE_EVENT_BEGIN0("disk_cache", "SqlBackend.Initialize"); - base::ElapsedTimer timer; - CHECK(!db_init_status_.has_value()); - bool corruption_detected = false; - db_init_status_ = InitializeInternal(corruption_detected); - RecordTimeAndErrorResultHistogram("Initialize", timer.Elapsed(), - *db_init_status_, corruption_detected); - TRACE_EVENT_END1("disk_cache", "SqlBackend.Initialize", "result", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(*db_init_status_, store_status_, - dict); - }); - MaybeCrashIfCorrupted(corruption_detected); - return *db_init_status_ == Error::kOk - ? InitResultOrError(InitResult(max_bytes_)) - : base::unexpected(*db_init_status_); -} - -Error Backend::InitializeInternal(bool& corruption_detected) { - CHECK(!db_init_status_.has_value()); - - db_.set_error_callback(base::BindRepeating(&Backend::DatabaseErrorCallback, - base::Unretained(this))); - - base::FilePath db_file_path = path_.Append(kSqlBackendDatabaseFileName); - DVLOG(1) << "Backend::InitializeInternal db_file_path: " << db_file_path; - - base::FilePath directory = db_file_path.DirName(); - if (!base::DirectoryExists(directory) && !base::CreateDirectory(directory)) { - return Error::kFailedToCreateDirectory; - } - - if (!db_.Open(db_file_path)) { - return Error::kFailedToOpenDatabase; - } - - // Raze old incompatible databases. - if (sql::MetaTable::RazeIfIncompatible( - &db_, kSqlBackendLowestSupportedDatabaseVersion, - kSqlBackendCurrentDatabaseVersion) == - sql::RazeIfIncompatibleResult::kFailed) { - return Error::kFailedToRazeIncompatibleDatabase; - } - - // Ensures atomicity of initialization: either all schema setup and metadata - // writes succeed, or all are rolled back, preventing an inconsistent state. - sql::Transaction transaction(&db_); - if (!transaction.Begin()) { - return Error::kFailedToStartTransaction; - } - - // Initialize the meta table, which stores version info and other metadata. - if (!meta_table_.Init(&db_, kSqlBackendCurrentDatabaseVersion, - kSqlBackendCompatibleDatabaseVersion)) { - return Error::kFailedToInitializeMetaTable; - } - - // Initialize the database schema. - if (!InitSchema(db_)) { - return Error::kFailedToInitializeSchema; - } - - int64_t tmp_entry_count = 0; - if (!GetOrInitializeMetaValue(meta_table_, kSqlBackendMetaTableKeyEntryCount, - tmp_entry_count, - /*default_value=*/0)) { - return Error::kFailedToSetEntryCountMetadata; - } - if (!GetOrInitializeMetaValue(meta_table_, kSqlBackendMetaTableKeyTotalSize, - store_status_.total_size, - /*default_value=*/0)) { - return Error::kFailedToSetTotalSizeMetadata; - } - - if (tmp_entry_count < 0 || - !base::IsValueInRangeForNumericType(tmp_entry_count) || - store_status_.total_size < 0) { - corruption_detected = true; - return RecalculateStoreStatusAndCommitTransaction(transaction); - } - - store_status_.entry_count = static_cast(tmp_entry_count); - - return transaction.Commit() ? Error::kOk : Error::kFailedToCommitTransaction; -} - -void Backend::DatabaseErrorCallback(int error, sql::Statement* statement) { - TRACE_EVENT("disk_cache", "SqlBackend.Error", "error", error); - sql::UmaHistogramSqliteResult(base::StrCat({kHistogramPrefix, "SqliteError"}), - error); - if (sql::IsErrorCatastrophic(error) && db_.is_open()) { - // Normally this will poison the database, causing any subsequent operations - // to silently fail without any side effects. However, if RazeAndPoison() is - // called from the error callback in response to an error raised from within - // sql::Database::Open, opening the now-razed database will be retried. - db_.RazeAndPoison(); - } -} - -EntryInfoOrErrorAndEvictionRequested Backend::OpenOrCreateEntry( - const CacheEntryKey& key) { - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.OpenOrCreateEntry", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("key", key.string()); - PopulateTraceDetails(store_status_, dict); - }); - base::ElapsedTimer timer; - bool corruption_detected = false; - auto result = OpenOrCreateEntryInternal(key, corruption_detected); - RecordTimeAndErrorResultHistogram("OpenOrCreateEntry", timer.Elapsed(), - result.error_or(Error::kOk), - corruption_detected); - TRACE_EVENT_END1("disk_cache", "SqlBackend.OpenOrCreateEntry", "result", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, store_status_, dict); - }); - MaybeCrashIfCorrupted(corruption_detected); - return EntryInfoOrErrorAndEvictionRequested(std::move(result), - ShouldStartEviction()); -} - -EntryInfoOrError Backend::OpenOrCreateEntryInternal(const CacheEntryKey& key, - bool& corruption_detected) { - // Try to open first. - auto open_result = OpenEntryInternal(key, corruption_detected); - if (open_result.has_value() && open_result->has_value()) { - return std::move(*open_result.value()); - } - // If opening failed with an error, propagate that error. - if (!open_result.has_value()) { - return base::unexpected(open_result.error()); - } - // If the entry was not found, try to create a new one. - return CreateEntryInternal(key, /*run_existance_check=*/false, - corruption_detected); -} - -OptionalEntryInfoOrError Backend::OpenEntry(const CacheEntryKey& key) { - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.OpenEntry", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("key", key.string()); - PopulateTraceDetails(store_status_, dict); - }); - base::ElapsedTimer timer; - bool corruption_detected = false; - auto result = OpenEntryInternal(key, corruption_detected); - RecordTimeAndErrorResultHistogram("OpenEntry", timer.Elapsed(), - result.error_or(Error::kOk), - corruption_detected); - TRACE_EVENT_END1("disk_cache", "SqlBackend.OpenEntry", "result", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, store_status_, dict); - }); - MaybeCrashIfCorrupted(corruption_detected); - return result; -} - -OptionalEntryInfoOrError Backend::OpenEntryInternal(const CacheEntryKey& key, - bool& corruption_detected) { - CheckDatabaseInitStatus(); - - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, GetQuery(Query::kOpenEntry_SelectLiveResources))); - statement.BindString(0, key.string()); - if (!statement.Step()) { - // `Step()` returned false, which means either the query completed with no - // results, or an error occurred. - if (db_.GetErrorCode() == static_cast(sql::SqliteResultCode::kDone)) { - // The query completed successfully but found no matching entry. - return std::nullopt; - } - // An unexpected database error occurred. - return base::unexpected(Error::kFailedToExecute); - } - EntryInfo entry_info; - // Reconstruct the UnguessableToken from its two 64-bit parts. - auto maybe_token = - ToUnguessableToken(statement.ColumnInt64(0), statement.ColumnInt64(1)); - if (!maybe_token) { - // This indicates data corruption in the database. - // TODO(crbug.com/422065015): If this error is observed in UMA, implement - // recovery logic. - corruption_detected = true; - return base::unexpected(Error::kInvalidData); - } - entry_info.token = *maybe_token; - entry_info.last_used = statement.ColumnTime(2); - entry_info.body_end = statement.ColumnInt64(3); - base::span blob_span = statement.ColumnBlob(4); - entry_info.head = base::MakeRefCounted(); - CHECK(base::IsValueInRangeForNumericType(blob_span.size())); - entry_info.head->SetCapacity(blob_span.size()); - entry_info.head->span().copy_from_nonoverlapping(blob_span); - entry_info.opened = true; - return entry_info; -} - -EntryInfoOrErrorAndEvictionRequested Backend::CreateEntry( - const CacheEntryKey& key) { - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.CreateEntry", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("key", key.string()); - PopulateTraceDetails(store_status_, dict); - }); - base::ElapsedTimer timer; - bool corruption_detected = false; - auto result = CreateEntryInternal(key, /*run_existance_check=*/true, - corruption_detected); - RecordTimeAndErrorResultHistogram("CreateEntry", timer.Elapsed(), - result.error_or(Error::kOk), - corruption_detected); - TRACE_EVENT_END1("disk_cache", "SqlBackend.CreateEntry", "result", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, store_status_, dict); - }); - MaybeCrashIfCorrupted(corruption_detected); - return EntryInfoOrErrorAndEvictionRequested(std::move(result), - ShouldStartEviction()); -} - -EntryInfoOrError Backend::CreateEntryInternal(const CacheEntryKey& key, - bool run_existance_check, - bool& corruption_detected) { - CheckDatabaseInitStatus(); - sql::Transaction transaction(&db_); - if (!transaction.Begin()) { - return base::unexpected(Error::kFailedToStartTransaction); - } - if (run_existance_check) { - auto open_result = OpenEntryInternal(key, corruption_detected); - if (open_result.has_value() && open_result->has_value()) { - return base::unexpected(Error::kAlreadyExists); - } - // If opening failed with an error, propagate that error. - if (!open_result.has_value()) { - return base::unexpected(open_result.error()); +bool SqlPersistentStore::MaybeRunCleanupDoomedEntries(ErrorCallback callback) { + auto barrier_callback = CreateBarrierErrorCallback(std::move(callback)); + size_t sync_return_count = 0; + for (const auto& backend_shard : backend_shards_) { + if (!backend_shard->MaybeRunCleanupDoomedEntries(barrier_callback)) { + // If a shard completes synchronously, it returns false. Count how many do + // so. + ++sync_return_count; } } - EntryInfo entry_info; - entry_info.token = base::UnguessableToken::Create(); - entry_info.last_used = base::Time::Now(); - entry_info.body_end = 0; - entry_info.head = nullptr; - entry_info.opened = false; - // The size of an entry is set to the size of its key. This value will be - // updated as the header and body are written. - // The static size per entry, `kSqlBackendStaticResourceSize`, is added in - // `GetSizeOfAllEntries()`. - const int64_t bytes_usage = key.string().size(); - { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, - GetQuery( - disk_cache_sql_queries::Query::kCreateEntry_InsertIntoResources))); - statement.BindInt64(0, TokenHigh(entry_info.token)); - statement.BindInt64(1, TokenLow(entry_info.token)); - statement.BindTime(2, entry_info.last_used); - statement.BindInt64(3, entry_info.body_end); - statement.BindInt64(4, bytes_usage); - statement.BindString(5, key.string()); - if (!statement.Run()) { - return base::unexpected(Error::kFailedToExecute); - } + if (sync_return_count == GetSizeOfShards()) { + // If all shards completed synchronously, no cleanup task was scheduled. + return false; } - - // Update the store's status and commit the transaction. - // The entry count is increased by 1, and the total size by `bytes_usage`. - // This call will also handle updating the on-disk meta table. - if (const auto error = UpdateStoreStatusAndCommitTransaction( - transaction, - /*entry_count_delta=*/1, - /*total_size_delta=*/bytes_usage, corruption_detected); - error != Error::kOk) { - return base::unexpected(error); + for (size_t i = 0; i < sync_return_count; ++i) { + barrier_callback.Run(Error::kOk); } - - return entry_info; + // Reaching this point means at least one shard scheduled a task. + return true; } -ErrorAndEvictionRequested Backend::DoomEntry( - const CacheEntryKey& key, - const base::UnguessableToken& token) { - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.DoomEntry", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("key", key.string()); - dict.Add("token", token.ToString()); - PopulateTraceDetails(store_status_, dict); - }); - base::ElapsedTimer timer; - bool corruption_detected = false; - auto result = DoomEntryInternal(key, token, corruption_detected); - RecordTimeAndErrorResultHistogram("DoomEntry", timer.Elapsed(), result, - corruption_detected); - TRACE_EVENT_END1("disk_cache", "SqlBackend.DoomEntry", "result", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, store_status_, dict); - dict.Add("corruption_detected", corruption_detected); - }); - MaybeCrashIfCorrupted(corruption_detected); - return ErrorAndEvictionRequested(result, ShouldStartEviction()); +void SqlPersistentStore::MaybeRunCheckpoint( + base::OnceCallback callback) { + auto barrier_callback = base::BarrierCallback( + GetSizeOfShards(), base::BindOnce( + [](base::OnceCallback callback, + std::vector results) { + for (auto result : results) { + if (result) { + std::move(callback).Run(true); + return; + } + } + std::move(callback).Run(false); + }, + std::move(callback))); + for (const auto& backend_shard : backend_shards_) { + backend_shard->MaybeRunCheckpoint(barrier_callback); + } } -Error Backend::DoomEntryInternal(const CacheEntryKey& key, - const base::UnguessableToken& token, - bool& corruption_detected) { - CheckDatabaseInitStatus(); - sql::Transaction transaction(&db_); - if (!transaction.Begin()) { - return Error::kFailedToStartTransaction; +void SqlPersistentStore::EnableStrictCorruptionCheckForTesting() { + for (const auto& backend_shard : backend_shards_) { + backend_shard->EnableStrictCorruptionCheckForTesting(); // IN-TEST } - - int64_t doomed_count = 0; - // Use checked numerics to safely calculate the change in total size and - // detect potential metadata corruption from overflows. - base::CheckedNumeric total_size_delta = 0; - { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, GetQuery(Query::kDoomEntry_MarkDoomedResources))); - statement.BindString(0, key.string()); - statement.BindInt64(1, TokenHigh(token)); - statement.BindInt64(2, TokenLow(token)); - // Iterate through the rows returned by the RETURNING clause. - while (statement.Step()) { - // Since we're dooming an entry, its size is subtracted from the total. - total_size_delta -= statement.ColumnInt64(0); - // Count how many entries were actually updated. - ++doomed_count; - } - } - - if (doomed_count > 1) { - // The cache_key and token combination should uniquely identify a single - // non-doomed entry. - // TODO(crbug.com/422065015): If this error is observed in UMA, implement - // recovery logic. - corruption_detected = true; - } - - // If no rows were updated, it means the entry was not found (or the token - // was wrong), so we report kNotFound. - if (doomed_count == 0) { - return transaction.Commit() ? Error::kNotFound - : Error::kFailedToCommitTransaction; - } - - // If the `total_size_delta` calculation resulted in an overflow, it suggests - // that the `bytes_usage` value in the database was corrupt. In this case, we - // trigger a full recalculation of the store's status to recover to a - // consistent state. - if (!total_size_delta.IsValid()) { - corruption_detected = true; - return RecalculateStoreStatusAndCommitTransaction(transaction); - } - - return UpdateStoreStatusAndCommitTransaction( - transaction, - /*entry_count_delta=*/-doomed_count, - /*total_size_delta=*/total_size_delta.ValueOrDie(), corruption_detected); } -ErrorAndEvictionRequested Backend::DeleteDoomedEntry( - const CacheEntryKey& key, - const base::UnguessableToken& token) { - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.DeleteDoomedEntry", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("key", key.string()); - dict.Add("token", token.ToString()); - PopulateTraceDetails(store_status_, dict); - }); - base::ElapsedTimer timer; - bool corruption_detected = false; - auto result = DeleteDoomedEntryInternal(key, token, corruption_detected); - RecordTimeAndErrorResultHistogram("DeleteDoomedEntry", timer.Elapsed(), - result, corruption_detected); - TRACE_EVENT_END1("disk_cache", "SqlBackend.DeleteDoomedEntry", "result", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, store_status_, dict); - }); - MaybeCrashIfCorrupted(corruption_detected); - return ErrorAndEvictionRequested(result, ShouldStartEviction()); +void SqlPersistentStore::SetSimulateDbFailureForTesting(bool fail) { + for (const auto& backend_shard : backend_shards_) { + backend_shard->SetSimulateDbFailureForTesting(fail); // IN-TEST + } } -Error Backend::DeleteDoomedEntryInternal(const CacheEntryKey& key, - const base::UnguessableToken& token, - bool& corruption_detected) { - CheckDatabaseInitStatus(); - sql::Transaction transaction(&db_); - if (!transaction.Begin()) { - return Error::kFailedToStartTransaction; +void SqlPersistentStore::RazeAndPoisonForTesting() { + for (const auto& backend_shard : backend_shards_) { + backend_shard->RazeAndPoisonForTesting(); // IN-TEST } - - int64_t deleted_count = 0; - { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, - GetQuery(Query::kDeleteDoomedEntry_DeleteFromResources))); - statement.BindString(0, key.string()); - statement.BindInt64(1, TokenHigh(token)); - statement.BindInt64(2, TokenLow(token)); - if (!statement.Run()) { - return Error::kFailedToExecute; - } - deleted_count = db_.GetLastChangeCount(); - } - - if (deleted_count > 1) { - // The cache_key and token combination should uniquely identify a single - // non-doomed entry. - // TODO(crbug.com/422065015): If this error is observed in UMA, implement - // recovery logic. - corruption_detected = true; - } - - // If we didn't find any doomed entry matching the key and token, report it. - if (deleted_count == 0) { - return transaction.Commit() ? Error::kNotFound - : Error::kFailedToCommitTransaction; - } - - // Delete the associated blobs from the `blobs` table. - if (Error error = DeleteBlobsByToken(token); error != Error::kOk) { - return error; - } - - return transaction.Commit() ? Error::kOk : Error::kFailedToCommitTransaction; } -Error Backend::DeleteDoomedEntries( - base::flat_set excluded_tokens) { - TRACE_EVENT_BEGIN0("disk_cache", "SqlBackend.DeleteDoomedEntries"); - base::ElapsedTimer timer; - bool corruption_detected = false; - size_t deleted_count = 0; - auto result = DeleteDoomedEntriesInternal(excluded_tokens, deleted_count, - corruption_detected); - RecordTimeAndErrorResultHistogram("DeleteDoomedEntries", timer.Elapsed(), - result, corruption_detected); - base::UmaHistogramCounts100("Net.SqlDiskCache.DeleteDoomedEntriesCount", - deleted_count); - TRACE_EVENT_END1("disk_cache", "SqlBackend.DeleteDoomedEntries", "result", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, store_status_, dict); - dict.Add("deleted_count", deleted_count); - }); - MaybeCrashIfCorrupted(corruption_detected); - return result; +SqlPersistentStore::IndexState SqlPersistentStore::GetIndexStateForHash( + CacheEntryKey::Hash key_hash) const { + return GetShard(key_hash).GetIndexStateForHash(key_hash); } -Error Backend::DeleteDoomedEntriesInternal( - const base::flat_set& excluded_tokens, - size_t& deleted_count, - bool& corruption_detected) { - CheckDatabaseInitStatus(); - sql::Transaction transaction(&db_); - if (!transaction.Begin()) { - return Error::kFailedToStartTransaction; - } - - std::vector res_ids_to_delete; - std::vector tokens_for_blob_deletion; - - // 1. Select all doomed entries. - { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, - GetQuery(Query::kDeleteDoomedEntries_SelectDoomedResources))); - // 2. Collect entries to be deleted, skipping excluded ones. - while (statement.Step()) { - auto maybe_token = ToUnguessableToken(statement.ColumnInt64(1), - statement.ColumnInt64(2)); - if (!maybe_token) { - corruption_detected = true; - continue; - } - if (excluded_tokens.contains(*maybe_token)) { - continue; - } - res_ids_to_delete.push_back(statement.ColumnInt64(0)); - tokens_for_blob_deletion.push_back(*maybe_token); - } - } - - deleted_count = res_ids_to_delete.size(); - if (deleted_count == 0) { - // Nothing to delete, abort the transaction and return kOk; - return Error::kOk; - } - - // 3. Delete from `resources` table by `res_id`. - if (auto error = DeleteResourcesByResIds(res_ids_to_delete); - error != Error::kOk) { - return error; - } - - // 4. Delete corresponding blobs by token. - if (auto error = DeleteBlobsByTokens(tokens_for_blob_deletion); - error != Error::kOk) { - return error; - } - - // 5. Commit the transaction. - return transaction.Commit() ? Error::kOk : Error::kFailedToCommitTransaction; +SqlPersistentStore::ShardId SqlPersistentStore::GetShardIdForHash( + CacheEntryKey::Hash key_hash) const { + return ShardId(key_hash.value() % GetSizeOfShards()); } -ErrorAndEvictionRequested Backend::DeleteLiveEntry(const CacheEntryKey& key) { - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.DeleteLiveEntry", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("key", key.string()); - PopulateTraceDetails(store_status_, dict); - }); - base::ElapsedTimer timer; - bool corruption_detected = false; - auto result = DeleteLiveEntryInternal(key, corruption_detected); - RecordTimeAndErrorResultHistogram("DeleteLiveEntry", timer.Elapsed(), result, - corruption_detected); - TRACE_EVENT_END1("disk_cache", "SqlBackend.DeleteLiveEntry", "result", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, store_status_, dict); - dict.Add("corruption_detected", corruption_detected); - }); - MaybeCrashIfCorrupted(corruption_detected); - return ErrorAndEvictionRequested(result, ShouldStartEviction()); +void SqlPersistentStore::SetMaxSize(int64_t max_bytes) { + max_bytes_ = max_bytes; + high_watermark_ = max_bytes * kSqlBackendEvictionHighWaterMarkPermille / 1000; + idle_time_high_watermark_ = + max_bytes * kSqlBackendIdleTimeEvictionHighWaterMarkPermille / 1000; + low_watermark_ = max_bytes * kSqlBackendEvictionLowWaterMarkPermille / 1000; + max_file_size_ = CalculateMaxFileSize(max_bytes); } -Error Backend::DeleteLiveEntryInternal(const CacheEntryKey& key, - bool& corruption_detected) { - CheckDatabaseInitStatus(); - sql::Transaction transaction(&db_); - if (!transaction.Begin()) { - return Error::kFailedToStartTransaction; - } - - // We need to collect the tokens of deleted entries to later remove their - // corresponding data from the `blobs` table. - std::vector tokens_to_be_deleted; - // Use checked numerics to safely update the total cache size. - base::CheckedNumeric total_size_delta = 0; - int64_t deleted_count = 0; - { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, GetQuery(Query::kDeleteLiveEntry_DeleteFromResources))); - statement.BindString(0, key.string()); - while (statement.Step()) { - ++deleted_count; - auto maybe_token = ToUnguessableToken(statement.ColumnInt64(0), - statement.ColumnInt64(1)); - // If deserializing the token fails, it's a sign of data corruption. - if (!maybe_token) { - corruption_detected = true; - continue; - } - // The size of the deleted entry is subtracted from the total. - total_size_delta -= statement.ColumnInt64(2); - tokens_to_be_deleted.emplace_back(*maybe_token); - } - } - - // If no entries were deleted, the key wasn't found. - if (deleted_count == 0) { - return transaction.Commit() ? Error::kNotFound - : Error::kFailedToCommitTransaction; - } - - // Delete the blobs associated with the deleted entries. - if (Error delete_result = DeleteBlobsByTokens(tokens_to_be_deleted); - delete_result != Error::kOk) { - return delete_result; - } - - // If we detected corruption, or if the size update calculation overflowed, - // our metadata is suspect. We recover by recalculating everything from - // scratch. - if (corruption_detected || !total_size_delta.IsValid()) { - corruption_detected = true; - return RecalculateStoreStatusAndCommitTransaction(transaction); - } - - return UpdateStoreStatusAndCommitTransaction( - transaction, - /*entry_count_delta=*/ - -static_cast(tokens_to_be_deleted.size()), - /*total_size_delta=*/total_size_delta.ValueOrDie(), corruption_detected); -} - -ErrorAndEvictionRequested Backend::DeleteAllEntries() { - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.DeleteAllEntries", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(store_status_, dict); - }); - base::ElapsedTimer timer; - bool corruption_detected = false; - Error result = DeleteAllEntriesInternal(corruption_detected); - RecordTimeAndErrorResultHistogram("DeleteAllEntries", timer.Elapsed(), result, - corruption_detected); - TRACE_EVENT_END1("disk_cache", "SqlBackend.DeleteAllEntries", "result", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, store_status_, dict); - }); - MaybeCrashIfCorrupted(corruption_detected); - return ErrorAndEvictionRequested(result, ShouldStartEviction()); -} - -Error Backend::DeleteAllEntriesInternal(bool& corruption_detected) { - CheckDatabaseInitStatus(); - sql::Transaction transaction(&db_); - if (!transaction.Begin()) { - return Error::kFailedToStartTransaction; - } - - // Clear the main resources table. - { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, GetQuery(Query::kDeleteAllEntries_DeleteFromResources))); - if (!statement.Run()) { - return Error::kFailedToExecute; - } - } - - // Also clear the blobs table. - { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, GetQuery(Query::kDeleteAllEntries_DeleteFromBlobs))); - if (!statement.Run()) { - return Error::kFailedToExecute; - } - } - - // Update the store's status and commit the transaction. - // The entry count and the total size will be zero. - // This call will also handle updating the on-disk meta table. - return UpdateStoreStatusAndCommitTransaction( - transaction, - /*entry_count_delta=*/-store_status_.entry_count, - /*total_size_delta=*/-store_status_.total_size, corruption_detected); -} - -ErrorAndEvictionRequested Backend::DeleteLiveEntriesBetween( - base::Time initial_time, - base::Time end_time, - base::flat_set excluded_keys) { - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.DeleteLiveEntriesBetween", - "data", [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("initial_time", initial_time); - dict.Add("end_time", end_time); - dict.Add("excluded_keys_size", excluded_keys.size()); - PopulateTraceDetails(store_status_, dict); - }); - base::ElapsedTimer timer; - // Flag to indicate if we encounter signs of database corruption. In - // DeleteLiveEntriesBetween, database corruption is ignored. - bool corruption_detected = false; - Error result = DeleteLiveEntriesBetweenInternal( - initial_time, end_time, excluded_keys, corruption_detected); - RecordTimeAndErrorResultHistogram("DeleteLiveEntriesBetween", timer.Elapsed(), - result, corruption_detected); - TRACE_EVENT_END1("disk_cache", "SqlBackend.DeleteLiveEntriesBetween", - "result", [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, store_status_, dict); - }); - MaybeCrashIfCorrupted(corruption_detected); - return ErrorAndEvictionRequested(result, ShouldStartEviction()); -} - -Error Backend::DeleteLiveEntriesBetweenInternal( - base::Time initial_time, - base::Time end_time, - const base::flat_set& excluded_keys, - bool& corruption_detected) { - CheckDatabaseInitStatus(); - sql::Transaction transaction(&db_); - if (!transaction.Begin()) { - return Error::kFailedToStartTransaction; - } - - std::vector res_ids_to_be_deleted; - std::vector tokens_to_be_deleted; - int64_t entry_count_delta = 0; - base::CheckedNumeric total_size_delta = 0; - { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, - GetQuery(Query::kDeleteLiveEntriesBetween_SelectLiveResources))); - statement.BindTime(0, initial_time); - statement.BindTime(1, end_time); - while (statement.Step()) { - if (excluded_keys.contains(CacheEntryKey(statement.ColumnString(4)))) { - continue; - } - --entry_count_delta; - res_ids_to_be_deleted.push_back(statement.ColumnInt64(0)); - auto maybe_token = ToUnguessableToken(statement.ColumnInt64(1), - statement.ColumnInt64(2)); - if (maybe_token) { - tokens_to_be_deleted.push_back(*maybe_token); - total_size_delta -= statement.ColumnInt64(3); - } else { - corruption_detected = true; - } - } - } - - // Delete the blobs associated with the entries to be deleted. - if (auto error = DeleteBlobsByTokens(tokens_to_be_deleted); - error != Error::kOk) { - return error; - } - - // Delete the selected entries from the `resources` table. - if (auto error = DeleteResourcesByResIds(res_ids_to_be_deleted); - error != Error::kOk) { - return error; - } - - // If we detected corruption, or if the size update calculation overflowed, - // our metadata is suspect. We recover by recalculating everything from - // scratch. - if (corruption_detected || !total_size_delta.IsValid()) { - corruption_detected = true; - return RecalculateStoreStatusAndCommitTransaction(transaction); - } - - // Update the in-memory and on-disk store status (entry count and total size) - // and commit the transaction. - return UpdateStoreStatusAndCommitTransaction(transaction, entry_count_delta, - total_size_delta.ValueOrDie(), - corruption_detected); -} - -Error Backend::UpdateEntryLastUsed(const CacheEntryKey& key, - base::Time last_used) { - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.UpdateEntryLastUsed", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("key", key.string()); - dict.Add("last_used", last_used); - }); - base::ElapsedTimer timer; - auto result = UpdateEntryLastUsedInternal(key, last_used); - RecordTimeAndErrorResultHistogram("UpdateEntryLastUsed", timer.Elapsed(), - result, /*corruption_detected=*/false); - TRACE_EVENT_END1("disk_cache", "SqlBackend.UpdateEntryLastUsed", "result", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, dict); - }); - return result; -} - -Error Backend::UpdateEntryLastUsedInternal(const CacheEntryKey& key, - base::Time last_used) { - CheckDatabaseInitStatus(); - sql::Transaction transaction(&db_); - if (!transaction.Begin()) { - return Error::kFailedToStartTransaction; - } - int64_t change_count = 0; - { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, - GetQuery(Query::kUpdateEntryLastUsed_UpdateResourceLastUsed))); - statement.BindTime(0, last_used); - statement.BindString(1, key.string()); - if (!statement.Run()) { - return Error::kFailedToExecute; - } - change_count = db_.GetLastChangeCount(); - } - if (!transaction.Commit()) { - return Error::kFailedToCommitTransaction; - } - return change_count == 0 ? Error::kNotFound : Error::kOk; -} - -ErrorAndEvictionRequested Backend::UpdateEntryHeaderAndLastUsed( - const CacheEntryKey& key, - const base::UnguessableToken& token, - base::Time last_used, - scoped_refptr buffer, - int64_t header_size_delta) { - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.UpdateEntryHeaderAndLastUsed", - "data", [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("key", key.string()); - dict.Add("token", token.ToString()); - dict.Add("last_used", last_used); - dict.Add("header_size_delta", header_size_delta); - PopulateTraceDetails(store_status_, dict); - }); - base::ElapsedTimer timer; - bool corruption_detected = false; - auto result = UpdateEntryHeaderAndLastUsedInternal( - key, token, last_used, std::move(buffer), header_size_delta, - corruption_detected); - RecordTimeAndErrorResultHistogram("UpdateEntryHeaderAndLastUsed", - timer.Elapsed(), result, - corruption_detected); - TRACE_EVENT_END1("disk_cache", "SqlBackend.UpdateEntryHeaderAndLastUsed", - "result", [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, store_status_, dict); - }); - MaybeCrashIfCorrupted(corruption_detected); - return ErrorAndEvictionRequested(result, ShouldStartEviction()); -} - -Error Backend::UpdateEntryHeaderAndLastUsedInternal( - const CacheEntryKey& key, - const base::UnguessableToken& token, - base::Time last_used, - scoped_refptr buffer, - int64_t header_size_delta, - bool& corruption_detected) { - CHECK(buffer); - CheckDatabaseInitStatus(); - - sql::Transaction transaction(&db_); - if (!transaction.Begin()) { - return Error::kFailedToStartTransaction; - } - { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, - GetQuery(Query::kUpdateEntryHeaderAndLastUsed_UpdateResource))); - statement.BindTime(0, last_used); - statement.BindInt64(1, header_size_delta); - statement.BindBlob(2, buffer->span()); - statement.BindString(3, key.string()); - statement.BindInt64(4, TokenHigh(token)); - statement.BindInt64(5, TokenLow(token)); - if (statement.Step()) { - const int64_t bytes_usage = statement.ColumnInt64(0); - if (bytes_usage < static_cast(buffer->size()) + - static_cast(key.string().size())) { - // This indicates data corruption in the database. - // TODO(crbug.com/422065015): If this error is observed in UMA, - // implement recovery logic. - corruption_detected = true; - return Error::kInvalidData; - } - } else { - return Error::kNotFound; - } - } - return UpdateStoreStatusAndCommitTransaction( - transaction, - /*entry_count_delta=*/0, - /*total_size_delta=*/header_size_delta, corruption_detected); -} - -ErrorAndEvictionRequested Backend::WriteEntryData( - const CacheEntryKey& key, - const base::UnguessableToken& token, - int64_t old_body_end, - int64_t offset, - scoped_refptr buffer, - int buf_len, - bool truncate) { - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.WriteEntryData", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("key", key.string()); - dict.Add("token", token.ToString()); - dict.Add("old_body_end", old_body_end); - dict.Add("offset", offset); - dict.Add("buf_len", buf_len); - dict.Add("truncate", truncate); - PopulateTraceDetails(store_status_, dict); - }); - base::ElapsedTimer timer; - bool corruption_detected = false; - auto result = WriteEntryDataInternal(key, token, old_body_end, offset, - std::move(buffer), buf_len, truncate, - corruption_detected); - RecordTimeAndErrorResultHistogram("WriteEntryData", timer.Elapsed(), result, - corruption_detected); - TRACE_EVENT_END1("disk_cache", "SqlBackend.WriteEntryData", "result", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, store_status_, dict); - }); - MaybeCrashIfCorrupted(corruption_detected); - return ErrorAndEvictionRequested(result, ShouldStartEviction()); -} - -Error Backend::WriteEntryDataInternal(const CacheEntryKey& key, - const base::UnguessableToken& token, - int64_t old_body_end, - int64_t offset, - scoped_refptr buffer, - int buf_len, - bool truncate, - bool& corruption_detected) { - CheckDatabaseInitStatus(); - sql::Transaction transaction(&db_); - if (!transaction.Begin()) { - return Error::kFailedToStartTransaction; - } - - int64_t write_end; - if (old_body_end < 0 || offset < 0 || buf_len < 0 || - (!buffer && buf_len > 0) || (buffer && buf_len > buffer->size()) || - !base::CheckAdd(offset, buf_len).AssignIfValid(&write_end)) { - return Error::kInvalidArgument; - } - - const int64_t new_body_end = - truncate ? write_end : std::max(write_end, old_body_end); - // An overflow is not expected here, as both `new_body_end` and `old_body_end` - // are non-negative int64_t value. - const int64_t body_end_delta = new_body_end - old_body_end; - - base::CheckedNumeric checked_total_size_delta = 0; - - // If the write starts before the current end of the body, it might overlap - // with existing data. - if (offset < old_body_end) { - if (Error result = - TrimOverlappingBlobs(token, offset, write_end, truncate, - checked_total_size_delta, corruption_detected); - result != Error::kOk) { - return result; - } - } - - // If the new body size is smaller, existing blobs beyond the new end must be - // truncated. - if (body_end_delta < 0) { - CHECK(truncate); - if (Error result = - TruncateBlobsAfter(token, new_body_end, checked_total_size_delta); - result != Error::kOk) { - return result; - } - } - - // Insert the new data blob if there is data to write. - if (buf_len) { - if (Error result = InsertNewBlob(token, offset, buffer, buf_len, - checked_total_size_delta); - result != Error::kOk) { - return result; - } - } - - if (!checked_total_size_delta.IsValid()) { - // If the total size delta calculation resulted in an overflow, it suggests - // that the size values in the database were corrupt. - corruption_detected = true; - return Error::kInvalidData; - } - int64_t total_size_delta = checked_total_size_delta.ValueOrDie(); - - // Update the entry's metadata in the `resources` table if the body size - // changed or if the total size of blobs changed. - if (body_end_delta || total_size_delta) { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, GetQuery(Query::kWriteEntryData_UpdateResource))); - statement.BindInt64(0, body_end_delta); - statement.BindInt64(1, total_size_delta); - statement.BindString(2, key.string()); - statement.BindInt64(3, TokenHigh(token)); - statement.BindInt64(4, TokenLow(token)); - if (statement.Step()) { - // Consistency check: The `RETURNING` clause gives us the `body_end` value - // after the update. If this doesn't match our calculated `new_body_end`, - // it means the `body_end` in the database was not the `old_body_end` we - // expected. This indicates data corruption, so we return an error. - const int64_t returned_new_body_end = statement.ColumnInt64(0); - if (returned_new_body_end != new_body_end) { - corruption_detected = true; - return Error::kBodyEndMismatch; - } - // If the entry is doomed, its size is no longer tracked in the cache's - // total size, so we don't update the store status. - const bool doomed = statement.ColumnBool(1); - if (doomed) { - total_size_delta = 0; - } - } else { - // If no rows were updated, it means the entry was not found (or the - // token was wrong). - return Error::kNotFound; - } - } - - // Commit the transaction, which also updates the in-memory and on-disk store - // status. - return UpdateStoreStatusAndCommitTransaction( - transaction, - /*entry_count_delta=*/0, - /*total_size_delta=*/total_size_delta, corruption_detected); -} - -// This function handles writes that overlap with existing data blobs. It finds -// any blobs that intersect with the new write range `[offset, end)`, removes -// them, and recreates any non-overlapping portions as new, smaller blobs. This -// effectively "cuts out" the space for the new data. -Error Backend::TrimOverlappingBlobs( - const base::UnguessableToken& token, - int64_t offset, - int64_t end, - bool truncate, - base::CheckedNumeric& checked_total_size_delta, - bool& corruption_detected) { - TRACE_EVENT1("disk_cache", "SqlBackend.TrimOverlappingBlobs", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("token", token.ToString()); - dict.Add("offset", offset); - dict.Add("end", end); - }); - - // First, delete all blobs that are fully contained within the new write - // range. - // If the write has zero length, no blobs can be fully contained within it, so - // this can be skipped. - if (offset != end) { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, GetQuery(Query::kTrimOverlappingBlobs_DeleteContained))); - statement.BindInt64(0, TokenHigh(token)); - statement.BindInt64(1, TokenLow(token)); - statement.BindInt64(2, offset); - statement.BindInt64(3, end); - while (statement.Step()) { - const int64_t blob_start = statement.ColumnInt64(0); - const int64_t blob_end = statement.ColumnInt64(1); - checked_total_size_delta -= blob_end - blob_start; - } - } - - // Now, handle blobs that partially overlap with the write range. There should - // be at most two such blobs. - // The SQL condition `blob_start < end AND blob_end > offset` checks for - // overlap. Example of [offset, end) vs [blob_start, blob_end): - // [0, 2) vs [2, 6): Not hit. - // [0, 3) vs [2, 6): Hit. - // [5, 9) vs [2, 6): Hit. - // [6, 9) vs [2, 6): Not hit. - std::vector blob_ids_to_be_removed; - std::vector new_blobs; - // A zero-length, non-truncating write is a no-op. For all other writes, we - // must handle partially overlapping blobs. - if (!(offset == end && !truncate)) { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, - GetQuery(Query::kTrimOverlappingBlobs_SelectOverlapping))); - statement.BindInt64(0, TokenHigh(token)); - statement.BindInt64(1, TokenLow(token)); - statement.BindInt64(2, end); - statement.BindInt64(3, offset); - while (statement.Step()) { - const int64_t blob_id = statement.ColumnInt64(0); - const int64_t blob_start = statement.ColumnInt64(1); - const int64_t blob_end = statement.ColumnInt64(2); - base::span blob = statement.ColumnBlob(3); - // Consistency check: The blob's size should match its start and end - // offsets. - if (!IsBlobSizeValid(blob_start, blob_end, blob)) { - corruption_detected = true; - return Error::kInvalidData; - } - // Mark the overlapping blob for removal. - blob_ids_to_be_removed.push_back(blob_id); - // If the existing blob starts before the new write, create a new blob - // for the leading part that doesn't overlap. - if (blob_start < offset) { - new_blobs.push_back(BufferWithStart{ - base::MakeRefCounted( - blob.first(base::checked_cast(offset - blob_start))), - blob_start}); - } - // If the existing blob ends after the new write and we are not - // truncating, create a new blob for the trailing part that doesn't - // overlap. - if (!truncate && end < blob_end) { - new_blobs.push_back(BufferWithStart{ - base::MakeRefCounted( - blob.last(base::checked_cast(blob_end - end))), - end}); - } - } - } - - // Delete the old blobs. - if (Error error = - DeleteBlobsById(blob_ids_to_be_removed, checked_total_size_delta, - corruption_detected); - error != Error::kOk) { - return error; - } - - // Insert the new, smaller blobs that were preserved from the non-overlapping - // parts. - if (Error error = InsertNewBlobs(token, new_blobs, checked_total_size_delta); - error != Error::kOk) { - return error; - } - return Error::kOk; -} - -Error Backend::TruncateBlobsAfter( - const base::UnguessableToken& token, - int64_t truncate_offset, - base::CheckedNumeric& checked_total_size_delta) { - TRACE_EVENT1("disk_cache", "SqlBackend.TruncateBlobsAfter", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("token", token.ToString()); - dict.Add("truncate_offset", truncate_offset); - }); - // Delete all blobs that start at or after the truncation offset. - { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, GetQuery(Query::kTruncateBlobsAfter_DeleteAfter))); - statement.BindInt64(0, TokenHigh(token)); - statement.BindInt64(1, TokenLow(token)); - statement.BindInt64(2, truncate_offset); - while (statement.Step()) { - const int64_t blob_start = statement.ColumnInt64(0); - const int64_t blob_end = statement.ColumnInt64(1); - checked_total_size_delta -= blob_end - blob_start; - } - if (!statement.Succeeded()) { - return Error::kFailedToExecute; - } - } - return Error::kOk; -} - -// Inserts a vector of new blobs into the database. -Error Backend::InsertNewBlobs( - const base::UnguessableToken& token, - const std::vector& new_blobs, - base::CheckedNumeric& checked_total_size_delta) { - // Iterate through the provided blobs and insert each one. - for (const auto& new_blob : new_blobs) { - if (Error error = - InsertNewBlob(token, new_blob.start, new_blob.buffer, - new_blob.buffer->size(), checked_total_size_delta); - error != Error::kOk) { - return error; - } - } - return Error::kOk; -} - -// Inserts a single new blob into the database. -Error Backend::InsertNewBlob( - const base::UnguessableToken& token, - int64_t start, - const scoped_refptr& buffer, - int buf_len, - base::CheckedNumeric& checked_total_size_delta) { - TRACE_EVENT1("disk_cache", "SqlBackend.InsertNewBlob", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("token", token.ToString()); - dict.Add("start", start); - dict.Add("buf_len", buf_len); - }); - const int64_t end = - (base::CheckedNumeric(start) + buf_len).ValueOrDie(); - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, GetQuery(Query::kInsertNewBlob_InsertIntoBlobs))); - statement.BindInt64(0, TokenHigh(token)); - statement.BindInt64(1, TokenLow(token)); - statement.BindInt64(2, start); - statement.BindInt64(3, end); - statement.BindBlob(4, - buffer->span().first(base::checked_cast(buf_len))); - if (!statement.Run()) { - return Error::kFailedToExecute; - } - checked_total_size_delta += buf_len; - return Error::kOk; -} - -// A helper function to delete multiple blobs by their IDs. -Error Backend::DeleteBlobsById( - const std::vector& blob_ids_to_be_removed, - base::CheckedNumeric& checked_total_size_delta, - bool& corruption_detected) { - // Iterate through the provided blob IDs and delete each one. - for (auto blob_id : blob_ids_to_be_removed) { - if (Error error = DeleteBlobById(blob_id, checked_total_size_delta, - corruption_detected); - error != Error::kOk) { - return error; - } - } - return Error::kOk; -} - -// Deletes a single blob from the `blobs` table given its ID. It uses the -// `RETURNING` clause to get the size of the deleted blob to update the total. -Error Backend::DeleteBlobById( - int64_t blob_id, - base::CheckedNumeric& checked_total_size_delta, - bool& corruption_detected) { - TRACE_EVENT1("disk_cache", "SqlBackend.DeleteBlobById", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("blob_id", blob_id); - }); - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, GetQuery(Query::kDeleteBlobById_DeleteFromBlobs))); - statement.BindInt64(0, blob_id); - if (!statement.Step()) { - // `Step()` returned false, which means either the query completed with no - // hit, or an error occurred. - if (db_.GetErrorCode() == static_cast(sql::SqliteResultCode::kDone)) { - return Error::kNotFound; - } - // An unexpected database error occurred. - return Error::kFailedToExecute; - } - const int64_t start = statement.ColumnInt64(0); - const int64_t end = statement.ColumnInt64(1); - if (end <= start) { - corruption_detected = true; - return Error::kInvalidData; - } - // Subtract the size of the deleted blob from the total size delta. - checked_total_size_delta -= end - start; - return Error::kOk; -} - -// Deletes all blobs associated with a specific entry token. -Error Backend::DeleteBlobsByToken(const base::UnguessableToken& token) { - TRACE_EVENT1("disk_cache", "SqlBackend.DeleteBlobsByToken", "token", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("token", token.ToString()); - }); - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, GetQuery(Query::kDeleteBlobsByToken_DeleteFromBlobs))); - statement.BindInt64(0, TokenHigh(token)); - statement.BindInt64(1, TokenLow(token)); - if (!statement.Run()) { - return Error::kFailedToExecute; - } - return Error::kOk; -} - -Error Backend::DeleteBlobsByTokens( - const std::vector& tokens) { - TRACE_EVENT0("disk_cache", "SqlBackend.DeleteBlobsByTokens"); - for (const auto& token : tokens) { - if (auto error = DeleteBlobsByToken(token); error != Error::kOk) { - return error; - } - } - return Error::kOk; -} - -Error Backend::DeleteResourcesByResIds(const std::vector& res_ids) { - TRACE_EVENT0("disk_cache", "SqlBackend.DeleteResourcesByResIds"); - for (int64_t res_id : res_ids) { - sql::Statement delete_resource_stmt(db_.GetCachedStatement( - SQL_FROM_HERE, - GetQuery(Query::kDeleteResourcesByResIds_DeleteFromResources))); - delete_resource_stmt.BindInt64(0, res_id); - if (!delete_resource_stmt.Run()) { - return Error::kFailedToExecute; - } - } - return Error::kOk; -} - -IntOrError Backend::ReadEntryData(const base::UnguessableToken& token, - int64_t offset, - scoped_refptr buffer, - int buf_len, - int64_t body_end, - bool sparse_reading) { - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.ReadEntryData", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("token", token.ToString()); - dict.Add("offset", offset); - dict.Add("buf_len", buf_len); - dict.Add("body_end", body_end); - dict.Add("sparse_reading", sparse_reading); - PopulateTraceDetails(store_status_, dict); - }); - base::ElapsedTimer timer; - bool corruption_detected = false; - auto result = - ReadEntryDataInternal(token, offset, std::move(buffer), buf_len, body_end, - sparse_reading, corruption_detected); - RecordTimeAndErrorResultHistogram("ReadEntryData", timer.Elapsed(), - result.error_or(Error::kOk), - corruption_detected); - TRACE_EVENT_END1("disk_cache", "SqlBackend.ReadEntryData", "result", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, store_status_, dict); - }); - MaybeCrashIfCorrupted(corruption_detected); - return result; -} - -IntOrError Backend::ReadEntryDataInternal(const base::UnguessableToken& token, - int64_t offset, - scoped_refptr buffer, - int buf_len, - int64_t body_end, - bool sparse_reading, - bool& corruption_detected) { - CheckDatabaseInitStatus(); - - if (offset < 0 || buf_len < 0 || !buffer || buf_len > buffer->size()) { - return base::unexpected(Error::kInvalidArgument); - } - - // Truncate `buffer_len` to make sure that `offset + buffer_len` does not - // overflow. - int64_t buffer_len = std::min(static_cast(buf_len), - std::numeric_limits::max() - offset); - const int64_t read_end = - (base::CheckedNumeric(offset) + buffer_len).ValueOrDie(); - // Select all blobs that overlap with the read range [offset, read_end), - // ordered by their start offset. - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, GetQuery(Query::kReadEntryData_SelectOverlapping))); - statement.BindInt64(0, TokenHigh(token)); - statement.BindInt64(1, TokenLow(token)); - statement.BindInt64(2, read_end); - statement.BindInt64(3, offset); - - size_t written_bytes = 0; - while (statement.Step()) { - const int64_t blob_start = statement.ColumnInt64(0); - const int64_t blob_end = statement.ColumnInt64(1); - base::span blob = statement.ColumnBlob(2); - if (!IsBlobSizeValid(blob_start, blob_end, blob)) { - corruption_detected = true; - return base::unexpected(Error::kInvalidData); - } - // Determine the part of the blob that falls within the read request. - const int64_t copy_start = std::max(offset, blob_start); - const int64_t copy_end = std::min(read_end, blob_end); - const size_t copy_size = base::checked_cast(copy_end - copy_start); - const size_t pos_in_buffer = - base::checked_cast(copy_start - offset); - // If there's a gap between the last written byte and the start of the - // current blob, handle it based on `sparse_reading`. - if (written_bytes < pos_in_buffer) { - if (sparse_reading) { - // In sparse reading mode, we stop at the first gap. - // This might be before any data got read. - return written_bytes; - } - // In normal mode, fill the gap with zeros. - std::ranges::fill( - buffer->span().subspan(written_bytes, pos_in_buffer - written_bytes), - 0); - } - // Copy the relevant part of the blob into the output buffer. - buffer->span() - .subspan(pos_in_buffer, copy_size) - .copy_from_nonoverlapping(blob.subspan( - base::checked_cast(copy_start - blob_start), copy_size)); - written_bytes = copy_end - offset; - } - - if (sparse_reading) { - return written_bytes; - } - - // After processing all blobs, check if we need to zero-fill the rest of the - // buffer up to the logical end of the entry's body. - const size_t last_pos_in_buffer = - std::min(body_end - offset, static_cast(buffer_len)); - if (written_bytes < last_pos_in_buffer) { - std::ranges::fill(buffer->span().subspan( - written_bytes, last_pos_in_buffer - written_bytes), - 0); - written_bytes = last_pos_in_buffer; - } - - return written_bytes; -} - -RangeResult Backend::GetEntryAvailableRange(const base::UnguessableToken& token, - int64_t offset, - int len) { - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.GetEntryAvailableRange", "data", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("token", token.ToString()); - dict.Add("offset", offset); - dict.Add("len", len); - }); - base::ElapsedTimer timer; - auto result = GetEntryAvailableRangeInternal(token, offset, len); - RecordTimeAndErrorResultHistogram("GetEntryAvailableRange", timer.Elapsed(), - Error::kOk, /*corruption_detected=*/false); - TRACE_EVENT_END1("disk_cache", "SqlBackend.GetEntryAvailableRange", "result", - [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, dict); - }); - return result; -} - -RangeResult Backend::GetEntryAvailableRangeInternal( - const base::UnguessableToken& token, - int64_t offset, - int len) { - CheckDatabaseInitStatus(); - // Truncate `len` to make sure that `offset + len` does not overflow. - len = std::min(static_cast(len), - std::numeric_limits::max() - offset); - const int64_t end = offset + len; - std::optional available_start; - int64_t available_end = 0; - - // To finds the available contiguous range of data for a given entry. queries - // the `blobs` table for data chunks that overlap with the requested range - // [offset, end). - { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, - GetQuery(Query::kGetEntryAvailableRange_SelectOverlapping))); - statement.BindInt64(0, TokenHigh(token)); - statement.BindInt64(1, TokenLow(token)); - statement.BindInt64(2, end); - statement.BindInt64(3, offset); - while (statement.Step()) { - int64_t blob_start = statement.ColumnInt64(0); - int64_t blob_end = statement.ColumnInt64(1); - if (!available_start) { - // This is the first blob we've found in the requested range. Start - // tracking the contiguous available range from here. - available_start = std::max(blob_start, offset); - available_end = std::min(blob_end, end); - } else { - // We have already found a blob, check if this one is contiguous. - if (available_end == blob_start) { - // The next blob is contiguous with the previous one. Extend the - // available range. - available_end = std::min(blob_end, end); - } else { - // There's a gap in the data. Return the contiguous range found so - // far. - return RangeResult(*available_start, - available_end - *available_start); - } - } - } - } - // If we found any data, return the total contiguous range. - if (available_start) { - return RangeResult(*available_start, available_end - *available_start); - } - return RangeResult(offset, 0); -} - -int64_t Backend::CalculateSizeOfEntriesBetween(base::Time initial_time, - base::Time end_time) { - if (initial_time == base::Time::Min() && end_time == base::Time::Max()) { - return GetSizeOfAllEntries(); - } - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.CalculateSizeOfEntriesBetween", - "data", [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("initial_time", initial_time); - dict.Add("end_time", end_time); - }); - base::ElapsedTimer timer; - auto result = CalculateSizeOfEntriesBetweenInternal(initial_time, end_time); - RecordTimeAndErrorResultHistogram("CalculateSizeOfEntriesBetween", - timer.Elapsed(), Error::kOk, - /*corruption_detected=*/false); - TRACE_EVENT_END1("disk_cache", "SqlBackend.CalculateSizeOfEntriesBetween", - "result", result); - return result; -} - -int64_t Backend::CalculateSizeOfEntriesBetweenInternal(base::Time initial_time, - base::Time end_time) { - // To calculate the total size of all entries whose `last_used` time falls - // within the range [`initial_time`, `end_time`), sums up the `bytes_usage` - // from the `resources` table and adds a static overhead for each entry. - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, - GetQuery(Query::kCalculateSizeOfEntriesBetween_SelectLiveResources))); - statement.BindTime(0, initial_time); - statement.BindTime(1, end_time); - base::ClampedNumeric total_size = 0; - while (statement.Step()) { - // `bytes_usage` includes the size of the key, header, and body data. - total_size += statement.ColumnInt64(0); - // Add the static overhead for the entry's row in the database. - total_size += kSqlBackendStaticResourceSize; - } - return total_size; -} - -OptionalEntryInfoWithIdAndKey Backend::OpenLatestEntryBeforeResId( - int64_t res_id_cursor) { - TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.OpenLatestEntryBeforeResId", - "data", [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - dict.Add("res_id_cursor", res_id_cursor); - }); - base::ElapsedTimer timer; - bool corruption_detected = false; - auto result = - OpenLatestEntryBeforeResIdInternal(res_id_cursor, corruption_detected); - RecordTimeAndErrorResultHistogram("OpenLatestEntryBeforeResId", - timer.Elapsed(), Error::kOk, - corruption_detected); - TRACE_EVENT_END1("disk_cache", "SqlBackend.OpenLatestEntryBeforeResId", - "result", [&](perfetto::TracedValue trace_context) { - auto dict = std::move(trace_context).WriteDictionary(); - PopulateTraceDetails(result, dict); - }); - MaybeCrashIfCorrupted(corruption_detected); - return result; -} - -OptionalEntryInfoWithIdAndKey Backend::OpenLatestEntryBeforeResIdInternal( - int64_t res_id_cursor, - bool& corruption_detected) { - CheckDatabaseInitStatus(); - - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, - GetQuery(Query::kOpenLatestEntryBeforeResId_SelectLiveResources))); - statement.BindInt64(0, res_id_cursor); - while (statement.Step()) { - auto maybe_token = - ToUnguessableToken(statement.ColumnInt64(1), statement.ColumnInt64(2)); - if (!maybe_token) { - // If OpenNextEntry encounters invalid data, it records it in a histogram - // and ignores the data. - corruption_detected = true; - continue; - } - - EntryInfoWithIdAndKey result; - result.res_id = statement.ColumnInt64(0); - result.key = CacheEntryKey(statement.ColumnString(5)); - auto& entry_info = result.info; - entry_info.token = *maybe_token; - entry_info.last_used = statement.ColumnTime(3); - entry_info.body_end = statement.ColumnInt64(4); - base::span blob_span = statement.ColumnBlob(6); - if (blob_span.size() > std::numeric_limits::max()) { - // If OpenNextEntry encounters invalid data, it records it in a histogram - // and ignores the data. - corruption_detected = true; - continue; - } - entry_info.head = base::MakeRefCounted(); - entry_info.head->SetCapacity(blob_span.size()); - entry_info.head->span().copy_from_nonoverlapping(blob_span); - entry_info.opened = true; - return result; - } - return std::nullopt; -} - -ErrorAndEvictionRequested Backend::RunEviction( - base::flat_set excluded_keys) { - TRACE_EVENT0("disk_cache", "SqlBackend.RunEviction"); - base::ElapsedTimer timer; - bool corruption_detected = false; - auto result = - RunEvictionInternal(std::move(excluded_keys), corruption_detected); - RecordTimeAndErrorResultHistogram("RunEviction", timer.Elapsed(), result, - corruption_detected); - MaybeCrashIfCorrupted(corruption_detected); - return ErrorAndEvictionRequested(result, ShouldStartEviction()); -} - -Error Backend::RunEvictionInternal( - const base::flat_set& excluded_keys, - bool& corruption_detected) { - int64_t size_to_be_removed = GetSizeOfAllEntries() - low_watermark_; - sql::Transaction transaction(&db_); - if (!transaction.Begin()) { - return Error::kFailedToExecute; - } - - std::vector tokens_to_be_deleted; - int64_t entry_count_delta = 0; - // Use checked numerics to safely update the total cache size. - base::CheckedNumeric checked_total_size_delta = 0; - base::CheckedNumeric checked_removed_total_size = 0; - { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, GetQuery(Query::kRunEviction_SelectLiveResources))); - while (size_to_be_removed > checked_removed_total_size.ValueOrDie() && - statement.Step()) { - if (excluded_keys.contains(CacheEntryKey(statement.ColumnString(2)))) { - continue; - } - auto maybe_token = ToUnguessableToken(statement.ColumnInt64(0), - statement.ColumnInt64(1)); - if (!maybe_token) { - corruption_detected = true; - continue; - } - tokens_to_be_deleted.push_back(*maybe_token); - --entry_count_delta; - const int64_t bytes_usage = statement.ColumnInt64(3); - checked_total_size_delta -= bytes_usage; - checked_removed_total_size += bytes_usage; - checked_removed_total_size += kSqlBackendStaticResourceSize; - if (!checked_total_size_delta.IsValid() || - !checked_removed_total_size.IsValid()) { - corruption_detected = true; - return Error::kInvalidData; - } - } - } - - for (const auto& token_to_be_deleted : tokens_to_be_deleted) { - if (Error delete_result = DeleteBlobsByToken(token_to_be_deleted); - delete_result != Error::kOk) { - return delete_result; - } - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, GetQuery(Query::kRunEviction_DeleteFromResources))); - statement.BindInt64(0, TokenHigh(token_to_be_deleted)); - statement.BindInt64(1, TokenLow(token_to_be_deleted)); - if (!statement.Run()) { - return Error::kFailedToExecute; - } - } - return UpdateStoreStatusAndCommitTransaction( - transaction, entry_count_delta, checked_total_size_delta.ValueOrDie(), - corruption_detected); -} - -Error Backend::UpdateStoreStatusAndCommitTransaction( - sql::Transaction& transaction, - int64_t entry_count_delta, - int64_t total_size_delta, - bool& corruption_detected) { - const auto old_entry_count = store_status_.entry_count; - const auto old_total_size = store_status_.total_size; - if (entry_count_delta != 0) { - // If the addition overflows or results in a negative count, it implies - // corrupted metadata. In this case, log an error and recalculate the count - // directly from the database to recover. - if (!base::CheckAdd(store_status_.entry_count, entry_count_delta) - .AssignIfValid(&store_status_.entry_count) || - store_status_.entry_count < 0) { - corruption_detected = true; - store_status_.entry_count = CalculateResourceEntryCount(); - } - meta_table_.SetValue(kSqlBackendMetaTableKeyEntryCount, - store_status_.entry_count); - } - - if (total_size_delta != 0) { - // If the addition overflows or results in a negative size, it implies - // corrupted metadata. In this case, log an error and recalculate the size - // directly from the database to recover. - if (!base::CheckAdd(store_status_.total_size, total_size_delta) - .AssignIfValid(&store_status_.total_size) || - store_status_.total_size < 0) { - corruption_detected = true; - store_status_.total_size = CalculateTotalSize(); - } - meta_table_.SetValue(kSqlBackendMetaTableKeyTotalSize, - store_status_.total_size); - } - - // Intentionally DCHECK for performance. - // In debug builds, verify consistency by recalculating. - DCHECK_EQ(store_status_.entry_count, CalculateResourceEntryCount()); - DCHECK_EQ(store_status_.total_size, CalculateTotalSize()); - - // Attempt to commit the transaction. If it fails, revert the in-memory - // store status to its state before the updates. - // This ensures that the in-memory status always reflects the on-disk state. - if (!transaction.Commit()) { - store_status_.entry_count = old_entry_count; - store_status_.total_size = old_total_size; - return Error::kFailedToCommitTransaction; - } - return Error::kOk; -} - -Error Backend::RecalculateStoreStatusAndCommitTransaction( - sql::Transaction& transaction) { - store_status_.entry_count = CalculateResourceEntryCount(); - store_status_.total_size = CalculateTotalSize(); - meta_table_.SetValue(kSqlBackendMetaTableKeyEntryCount, - store_status_.entry_count); - meta_table_.SetValue(kSqlBackendMetaTableKeyTotalSize, - store_status_.total_size); - return transaction.Commit() ? Error::kOk : Error::kFailedToCommitTransaction; -} - -// Recalculates the number of non-doomed entries in the `resources` table. -int64_t Backend::CalculateResourceEntryCount() { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, - GetQuery( - Query::kCalculateResourceEntryCount_SelectCountFromLiveResources))); - int64_t result = 0; - if (statement.Step()) { - result = statement.ColumnInt64(0); - } - return result; -} - -// Recalculates the total size of all non-doomed entries. -int64_t Backend::CalculateTotalSize() { - sql::Statement statement(db_.GetCachedStatement( - SQL_FROM_HERE, - GetQuery(Query::kCalculateTotalSize_SelectTotalSizeFromLiveResources))); - int64_t result = 0; - if (statement.Step()) { - result = statement.ColumnInt64(0); - } - return result; -} - -// `SqlPersistentStoreImpl` is the concrete implementation of the -// `SqlPersistentStore` interface. It serves as the bridge between the caller -// (on the main sequence = network IO thread) and the `Backend` (on the -// background sequence). It uses `base::SequenceBound` to safely manage the -// thread-hopping. -class SqlPersistentStoreImpl : public SqlPersistentStore { - public: - SqlPersistentStoreImpl( - const base::FilePath& path, - int64_t max_bytes, - net::CacheType type, - const scoped_refptr& background_task_runner) - : backend_(background_task_runner, path, max_bytes, type) {} - ~SqlPersistentStoreImpl() override = default; - - // Kicks off the asynchronous initialization of the backend. - void Initialize(ErrorCallback callback) override { - backend_.AsyncCall(&Backend::Initialize) - .Then(base::BindOnce( - [](base::WeakPtr weak_ptr, - ErrorCallback callback, InitResultOrError result) { - if (weak_ptr) { - if (result.has_value()) { - weak_ptr->SetMaxSize(result->max_bytes); - } - std::move(callback).Run(result.has_value() ? Error::kOk - : result.error()); +base::RepeatingCallback +SqlPersistentStore::CreateBarrierErrorCallback(ErrorCallback callback) { + return base::BarrierCallback( + GetSizeOfShards(), + base::BindOnce( + [](ErrorCallback callback, const std::vector& errors) { + // Return the first error, or kOk if all succeeded. + for (const auto& error : errors) { + if (error != Error::kOk) { + std::move(callback).Run(error); + return; } - }, - weak_factory_.GetWeakPtr(), std::move(callback))); - } - void OpenOrCreateEntry(const CacheEntryKey& key, - EntryInfoOrErrorCallback callback) override { - backend_.AsyncCall(&Backend::OpenOrCreateEntry) - .WithArgs(key) - .Then(WrapCallbackWithEvictionRequested(std::move(callback))); - } - void OpenEntry(const CacheEntryKey& key, - OptionalEntryInfoOrErrorCallback callback) override { - backend_.AsyncCall(&Backend::OpenEntry) - .WithArgs(key) - .Then(WrapCallback(std::move(callback))); - } - void CreateEntry(const CacheEntryKey& key, - EntryInfoOrErrorCallback callback) override { - backend_.AsyncCall(&Backend::CreateEntry) - .WithArgs(key) - .Then(WrapCallbackWithEvictionRequested(std::move(callback))); - } - void DoomEntry(const CacheEntryKey& key, - const base::UnguessableToken& token, - ErrorCallback callback) override { - backend_.AsyncCall(&Backend::DoomEntry) - .WithArgs(key, token) - .Then(WrapCallbackWithEvictionRequested(std::move(callback))); - } - void DeleteDoomedEntry(const CacheEntryKey& key, - const base::UnguessableToken& token, - ErrorCallback callback) override { - backend_.AsyncCall(&Backend::DeleteDoomedEntry) - .WithArgs(key, token) - .Then(WrapCallbackWithEvictionRequested(std::move(callback))); - } - void DeleteDoomedEntries( - base::flat_set excluded_tokens, - ErrorCallback callback) override { - backend_.AsyncCall(&Backend::DeleteDoomedEntries) - .WithArgs(std::move(excluded_tokens)) - .Then(WrapCallback(std::move(callback))); - } - void DeleteLiveEntry(const CacheEntryKey& key, - ErrorCallback callback) override { - backend_.AsyncCall(&Backend::DeleteLiveEntry) - .WithArgs(key) - .Then(WrapCallbackWithEvictionRequested(std::move(callback))); - } - void DeleteAllEntries(ErrorCallback callback) override { - backend_.AsyncCall(&Backend::DeleteAllEntries) - .Then(WrapCallbackWithEvictionRequested(std::move(callback))); - } - void DeleteLiveEntriesBetween(base::Time initial_time, - base::Time end_time, - base::flat_set excluded_keys, - ErrorCallback callback) override { - backend_.AsyncCall(&Backend::DeleteLiveEntriesBetween) - .WithArgs(initial_time, end_time, std::move(excluded_keys)) - .Then(WrapCallbackWithEvictionRequested(std::move(callback))); - } - void UpdateEntryLastUsed(const CacheEntryKey& key, - base::Time last_used, - ErrorCallback callback) override { - backend_.AsyncCall(&Backend::UpdateEntryLastUsed) - .WithArgs(key, last_used) - .Then(WrapCallback(std::move(callback))); - } - void UpdateEntryHeaderAndLastUsed(const CacheEntryKey& key, - const base::UnguessableToken& token, - base::Time last_used, - scoped_refptr buffer, - int64_t header_size_delta, - ErrorCallback callback) override { - backend_.AsyncCall(&Backend::UpdateEntryHeaderAndLastUsed) - .WithArgs(key, token, last_used, std::move(buffer), header_size_delta) - .Then(WrapCallbackWithEvictionRequested(std::move(callback))); - } + } + std::move(callback).Run(Error::kOk); + }, + std::move(callback))); +} - void WriteEntryData(const CacheEntryKey& key, - const base::UnguessableToken& token, - int64_t old_body_end, - int64_t offset, - scoped_refptr buffer, - int buf_len, - bool truncate, - ErrorCallback callback) override { - backend_.AsyncCall(&Backend::WriteEntryData) - .WithArgs(key, token, old_body_end, offset, std::move(buffer), buf_len, - truncate) - .Then(WrapCallbackWithEvictionRequested(std::move(callback))); - } - void ReadEntryData(const base::UnguessableToken& token, - int64_t offset, - scoped_refptr buffer, - int buf_len, - int64_t body_end, - bool sparse_reading, - IntOrErrorCallback callback) override { - backend_.AsyncCall(&Backend::ReadEntryData) - .WithArgs(token, offset, std::move(buffer), buf_len, body_end, - sparse_reading) - .Then(WrapCallback(std::move(callback))); - } - void GetEntryAvailableRange(const base::UnguessableToken& token, - int64_t offset, - int len, - RangeResultCallback callback) override { - backend_.AsyncCall(&Backend::GetEntryAvailableRange) - .WithArgs(token, offset, len) - .Then(WrapCallback(std::move(callback))); - } - void CalculateSizeOfEntriesBetween(base::Time initial_time, - base::Time end_time, - Int64OrErrorCallback callback) override { - backend_.AsyncCall(&Backend::CalculateSizeOfEntriesBetween) - .WithArgs(initial_time, end_time) - .Then(WrapCallback(std::move(callback))); - } - void OpenLatestEntryBeforeResId( - int64_t res_id_cursor, - OptionalEntryInfoWithIdAndKeyCallback callback) override { - backend_.AsyncCall(&Backend::OpenLatestEntryBeforeResId) - .WithArgs(res_id_cursor) - .Then(WrapCallback(std::move(callback))); - } - bool ShouldStartEviction() override { - return !eviction_in_progress_ && eviction_requested_; - } - void StartEviction(base::flat_set excluded_keys, - ErrorCallback callback) override { - CHECK(!eviction_in_progress_); - eviction_in_progress_ = true; - backend_.AsyncCall(&Backend::RunEviction) - .WithArgs(std::move(excluded_keys)) - .Then(base::BindOnce( - [](base::WeakPtr weak_ptr, - ErrorCallback callback, ErrorAndEvictionRequested result) { - if (weak_ptr) { - weak_ptr->eviction_in_progress_ = false; - weak_ptr->eviction_requested_ = result.eviction_requested; - std::move(callback).Run(result.result); - } - }, - weak_factory_.GetWeakPtr(), std::move(callback))); - } +size_t SqlPersistentStore::GetSizeOfShards() const { + return background_task_runners_.size(); +} - int64_t MaxFileSize() const override { return max_file_size_; } - int64_t MaxSize() const override { return max_size_; } - void GetEntryCount(Int32Callback callback) const override { - backend_.AsyncCall(&Backend::GetEntryCount).Then(std::move(callback)); +SqlPersistentStore::BackendShard& SqlPersistentStore::GetShard( + CacheEntryKey::Hash hash) const { + return *backend_shards_[GetShardIdForHash(hash).value()]; +} + +SqlPersistentStore::BackendShard& SqlPersistentStore::GetShard( + const CacheEntryKey& key) const { + return GetShard(key.hash()); +} + +void SqlPersistentStore::OnInitializeFinished( + ErrorCallback callback, + std::vector results) { + CHECK_EQ(results.size(), GetSizeOfShards()); + int64_t total_database_size = 0; + for (const auto& result : results) { + if (!result.has_value()) { + std::move(callback).Run(result.error()); + return; + } } - void GetSizeOfAllEntries(Int64Callback callback) const override { - backend_.AsyncCall(&Backend::GetSizeOfAllEntries).Then(std::move(callback)); + for (const auto& result : results) { + // Only the result from the shard 0 has max_bytes. + if (result->max_bytes.has_value()) { + SetMaxSize(*result->max_bytes); + base::UmaHistogramMemoryLargeMB( + base::StrCat({kSqlDiskCacheBackendHistogramPrefix, "MaxSize"}), + *result->max_bytes / 1024 / 1024); + } + total_database_size += result->database_size; } - - void EnableStrictCorruptionCheckForTesting() override { - backend_.AsyncCall(&Backend::EnableStrictCorruptionCheckForTesting); - } - - private: - void SetMaxSize(int64_t max_bytes) { - max_size_ = max_bytes; - max_file_size_ = CalculateMaxFileSize(max_bytes); - } - - // Wraps a callback to ensure it is only run if the `SqlPersistentStoreImpl` - // is still alive. - template - base::OnceCallback WrapCallback( - base::OnceCallback callback) { - return base::BindOnce( - [](base::WeakPtr weak_ptr, - base::OnceCallback callback, ResultType result) { - if (weak_ptr) { - // We should not run the callback when `this` was deleted. - std::move(callback).Run(std::move(result)); - } - }, - weak_factory_.GetWeakPtr(), std::move(callback)); - } - - // Like `WrapCallback`, but also updates the `eviction_requested_` flag. - template - base::OnceCallback)> - WrapCallbackWithEvictionRequested( - base::OnceCallback callback) { - return base::BindOnce( - [](base::WeakPtr weak_ptr, - base::OnceCallback callback, - ResultAndEvictionRequested result) { - if (weak_ptr) { - weak_ptr->eviction_requested_ = result.eviction_requested; - // We should not run the callback when `this` was deleted. - std::move(callback).Run(std::move(result.result)); - } - }, - weak_factory_.GetWeakPtr(), std::move(callback)); - } - - base::SequenceBound backend_; - - int64_t max_size_ = 0; - int64_t max_file_size_ = 0; - bool eviction_in_progress_ = false; - bool eviction_requested_ = false; - - base::WeakPtrFactory weak_factory_{this}; -}; - -} // namespace - -// Factory function for creating a `SqlPersistentStore` instance. -std::unique_ptr SqlPersistentStore::Create( - const base::FilePath& path, - int64_t max_bytes, - net::CacheType type, - const scoped_refptr& background_task_runner) { - return std::make_unique(path, max_bytes, type, - background_task_runner); + base::UmaHistogramMemoryLargeMB( + base::StrCat({kSqlDiskCacheBackendHistogramPrefix, "DatabaseSize"}), + total_database_size / 1024 / 1024); + base::UmaHistogramCounts1M( + base::StrCat({kSqlDiskCacheBackendHistogramPrefix, "EntryCount"}), + GetEntryCount()); + base::UmaHistogramMemoryLargeMB( + base::StrCat({kSqlDiskCacheBackendHistogramPrefix, "TotalSize"}), + GetSizeOfAllEntries() / 1024 / 1024); + std::move(callback).Run(Error::kOk); } // Default constructor and move operations for EntryInfo. @@ -2496,12 +551,37 @@ SqlPersistentStore::EntryInfo::EntryInfo(EntryInfo&&) = default; SqlPersistentStore::EntryInfo& SqlPersistentStore::EntryInfo::operator=( EntryInfo&&) = default; -SqlPersistentStore::EntryInfoWithIdAndKey::EntryInfoWithIdAndKey() = default; -SqlPersistentStore::EntryInfoWithIdAndKey::~EntryInfoWithIdAndKey() = default; -SqlPersistentStore::EntryInfoWithIdAndKey::EntryInfoWithIdAndKey( - EntryInfoWithIdAndKey&&) = default; -SqlPersistentStore::EntryInfoWithIdAndKey& -SqlPersistentStore::EntryInfoWithIdAndKey::operator=(EntryInfoWithIdAndKey&&) = +SqlPersistentStore::ResIdAndShardId::ResIdAndShardId(ResId res_id, + ShardId shard_id) + : res_id(res_id), shard_id(shard_id) {} +SqlPersistentStore::ResIdAndShardId::ResIdAndShardId() = default; +SqlPersistentStore::ResIdAndShardId::~ResIdAndShardId() = default; +SqlPersistentStore::ResIdAndShardId::ResIdAndShardId(const ResIdAndShardId&) = default; +SqlPersistentStore::ResIdAndShardId& +SqlPersistentStore::ResIdAndShardId::operator=(const ResIdAndShardId&) = + default; +SqlPersistentStore::ResIdAndShardId::ResIdAndShardId(ResIdAndShardId&&) = + default; +SqlPersistentStore::ResIdAndShardId& +SqlPersistentStore::ResIdAndShardId::operator=(ResIdAndShardId&&) = default; + +SqlPersistentStore::EntryInfoWithKeyAndIterator::EntryInfoWithKeyAndIterator() = + default; +SqlPersistentStore::EntryInfoWithKeyAndIterator:: + ~EntryInfoWithKeyAndIterator() = default; +SqlPersistentStore::EntryInfoWithKeyAndIterator::EntryInfoWithKeyAndIterator( + EntryInfoWithKeyAndIterator&&) = default; +SqlPersistentStore::EntryInfoWithKeyAndIterator& +SqlPersistentStore::EntryInfoWithKeyAndIterator::operator=( + EntryInfoWithKeyAndIterator&&) = default; + +int64_t SqlPersistentStore::StoreStatus::GetEstimatedDiskUsage() const { + base::ClampedNumeric result; + result = entry_count; + result *= kSqlBackendStaticResourceSize; + result += total_size; + return result; +} } // namespace disk_cache diff --git a/naiveproxy/src/net/disk_cache/sql/sql_persistent_store.h b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store.h index 5bba62d0a6..895521778e 100644 --- a/naiveproxy/src/net/disk_cache/sql/sql_persistent_store.h +++ b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store.h @@ -13,7 +13,7 @@ #include "base/memory/scoped_refptr.h" #include "base/time/time.h" #include "base/types/expected.h" -#include "base/unguessable_token.h" +#include "base/types/strong_alias.h" #include "net/base/cache_type.h" #include "net/base/net_export.h" #include "net/disk_cache/buildflags.h" @@ -35,12 +35,23 @@ class IOBuffer; namespace disk_cache { -// This class manages the persistence layer for the SQL-based disk cache. -// It handles all database operations, including initialization, schema -// management, and data access. All database I/O is performed asynchronously on -// a provided background task runner. +// This class serves as the main entry point for the SQL-based disk cache's +// persistence layer. It manages multiple database shards to improve +// concurrency, distributing operations across them based on cache entry keys. +// All actual database I/O is performed asynchronously on background task +// runners, with each shard handling its own database file and operations. class NET_EXPORT_PRIVATE SqlPersistentStore { public: + class BackendShard; + class Backend; + + // The primary key for resources managed in the SqlPersistentStore's resources + // table. + using ResId = base::StrongAlias; + + // A unique identifier for a database shard. + using ShardId = base::StrongAlias; + // Represents the error of SqlPersistentStore operation. // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. @@ -63,10 +74,23 @@ class NET_EXPORT_PRIVATE SqlPersistentStore { kNotFound = 13, kInvalidArgument = 14, kBodyEndMismatch = 15, - kMaxValue = kBodyEndMismatch + kFailedForTesting = 16, + kAborted = 17, + kNotInitialized = 18, + kCheckSumError = 19, + kDatabaseClosed = 20, + kAbortedDueToBrowserActivity = 21, + kMaxValue = kAbortedDueToBrowserActivity }; // LINT.ThenChange(//tools/metrics/histograms/metadata/net/enums.xml:SqlDiskCacheStoreError) + // Represents the urgency of cache eviction. + enum class EvictionUrgency { + kNotNeeded, + kIdleTime, + kNeeded, + }; + // Holds information about a specific cache entry. struct NET_EXPORT_PRIVATE EntryInfo { EntryInfo(); @@ -75,7 +99,7 @@ class NET_EXPORT_PRIVATE SqlPersistentStore { EntryInfo& operator=(EntryInfo&&); // A unique identifier for this entry instance, used for safe data access. - base::UnguessableToken token; + ResId res_id; // The last time this entry was used. base::Time last_used; // The total size of the entry's body (all data streams). @@ -86,17 +110,90 @@ class NET_EXPORT_PRIVATE SqlPersistentStore { bool opened = false; }; - // Holds information about a specific cache entry, including its `res_id` and - // `key`. This is used when iterating through entries. - struct NET_EXPORT_PRIVATE EntryInfoWithIdAndKey { - EntryInfoWithIdAndKey(); - ~EntryInfoWithIdAndKey(); - EntryInfoWithIdAndKey(EntryInfoWithIdAndKey&&); - EntryInfoWithIdAndKey& operator=(EntryInfoWithIdAndKey&&); + // Holds a resource ID and the ID of the shard it belongs to. + struct NET_EXPORT_PRIVATE ResIdAndShardId { + ResIdAndShardId(ResId res_id, ShardId shard_id); + ResIdAndShardId(); + ~ResIdAndShardId(); + ResIdAndShardId(const ResIdAndShardId&); + ResIdAndShardId& operator=(const ResIdAndShardId&); + ResIdAndShardId(ResIdAndShardId&&); + ResIdAndShardId& operator=(ResIdAndShardId&&); + + // Initialized to the maximum value for convenience when iterating through + // entries. + ResId res_id = ResId(std::numeric_limits::max()); + ShardId shard_id = ShardId(0); + }; + + // Holds the position of an entry, used for iterating through entries. + using EntryIterator = + base::StrongAlias; + + // Holds information about a specific cache entry, including its `key` and + // an `iterator` which is used when iterating through entries. + struct NET_EXPORT_PRIVATE EntryInfoWithKeyAndIterator { + EntryInfoWithKeyAndIterator(); + ~EntryInfoWithKeyAndIterator(); + EntryInfoWithKeyAndIterator(EntryInfoWithKeyAndIterator&&); + EntryInfoWithKeyAndIterator& operator=(EntryInfoWithKeyAndIterator&&); EntryInfo info; - int64_t res_id; CacheEntryKey key; + EntryIterator iterator; + }; + + // Holds summary statistics about the cache store. + class StoreStatus { + public: + StoreStatus() = default; + ~StoreStatus() = default; + StoreStatus(const StoreStatus& other) = default; + StoreStatus& operator=(const StoreStatus& other) = default; + StoreStatus(StoreStatus&& other) = default; + StoreStatus& operator=(StoreStatus&& other) = default; + + int64_t GetEstimatedDiskUsage() const; + + int32_t entry_count = 0; + int64_t total_size = 0; + }; + + // The result of a successful initialization. + struct InitResult { + InitResult(std::optional max_bytes, + const StoreStatus& store_status, + int64_t database_size) + : max_bytes(max_bytes), + store_status(store_status), + database_size(database_size) {} + ~InitResult() = default; + InitResult(InitResult&& other) = default; + InitResult& operator=(InitResult&& other) = default; + + // max_bytes is set only on the first shard. + std::optional max_bytes; + StoreStatus store_status; + int64_t database_size; + }; + + // A helper struct to bundle an operation's result with a flag indicating + // whether an eviction check is needed. This allows the background sequence, + // which has direct access to cache size information, to notify the main + // sequence that an eviction might be necessary without requiring an extra + // cross-sequence call to check the cache size. + template + struct ResultAndStoreStatus { + ResultAndStoreStatus(ResultType result, const StoreStatus& store_status) + : result(std::move(result)), store_status(store_status) {} + ~ResultAndStoreStatus() = default; + ResultAndStoreStatus(ResultAndStoreStatus&&) = default; + + // The actual result of the operation. + ResultType result; + + // The store status. + StoreStatus store_status; }; using ErrorCallback = base::OnceCallback; @@ -108,117 +205,129 @@ class NET_EXPORT_PRIVATE SqlPersistentStore { base::expected, Error>; using OptionalEntryInfoOrErrorCallback = base::OnceCallback; - using OptionalEntryInfoWithIdAndKey = std::optional; - using OptionalEntryInfoWithIdAndKeyCallback = - base::OnceCallback; + using OptionalEntryInfoWithKeyAndIterator = + std::optional; + using OptionalEntryInfoWithKeyAndIteratorCallback = + base::OnceCallback; using IntOrError = base::expected; using IntOrErrorCallback = base::OnceCallback; using Int64OrError = base::expected; using Int64OrErrorCallback = base::OnceCallback; - // Creates a new instance of the persistent store. The returned object must be - // initialized by calling `Initialize()`. This function never returns a null - // pointer. - static std::unique_ptr Create( - const base::FilePath& path, - int64_t max_bytes, - net::CacheType type, - const scoped_refptr& background_task_runner); + using InitResultOrError = base::expected; + using InitResultOrErrorCallback = base::OnceCallback; + using ResIdList = std::vector; + using ResIdListOrError = base::expected; + using ResIdListOrErrorCallback = base::OnceCallback; - virtual ~SqlPersistentStore() = default; + using ErrorAndStoreStatus = ResultAndStoreStatus; + using EntryInfoOrErrorAndStoreStatus = ResultAndStoreStatus; + using IntOrErrorAndStoreStatus = ResultAndStoreStatus; + using ResIdListOrErrorAndStoreStatus = ResultAndStoreStatus; + using ResIdListOrErrorAndStoreStatusCallback = + base::OnceCallback; + + // Creates a new instance of the persistent store. The returned object must be + // initialized by calling `Initialize()`. + SqlPersistentStore(const base::FilePath& path, + int64_t max_bytes, + net::CacheType type, + std::vector> + background_task_runners); + ~SqlPersistentStore(); SqlPersistentStore(const SqlPersistentStore&) = delete; SqlPersistentStore& operator=(const SqlPersistentStore&) = delete; // Initializes the store. `callback` will be invoked upon completion. - virtual void Initialize(ErrorCallback callback) = 0; + void Initialize(ErrorCallback callback); // Opens an entry with the given `key`. If the entry does not exist, it is // created. `callback` is invoked with the entry information on success or // an error code on failure. - virtual void OpenOrCreateEntry(const CacheEntryKey& key, - EntryInfoOrErrorCallback callback) = 0; + void OpenOrCreateEntry(const CacheEntryKey& key, + EntryInfoOrErrorCallback callback); // Opens an existing entry with the given `key`. // The `callback` is invoked with the entry's information on success. If the - // entry does not exist, the `callback` is invoked with a `kNotFound` error. - virtual void OpenEntry(const CacheEntryKey& key, - OptionalEntryInfoOrErrorCallback callback) = 0; + // entry does not exist, the `callback` is invoked with `std::nullopt`. + void OpenEntry(const CacheEntryKey& key, + OptionalEntryInfoOrErrorCallback callback); - // Creates a new entry with the given `key`. + // Creates a new entry with the given `key`. `creation_time` is the time the + // entry is created and will be used as the initial `last_used` time. // The `callback` is invoked with the new entry's information on success. If // an entry with this key already exists, the callback is invoked with a // `kAlreadyExists` error. - virtual void CreateEntry(const CacheEntryKey& key, - EntryInfoOrErrorCallback callback) = 0; + void CreateEntry(const CacheEntryKey& key, + base::Time creation_time, + EntryInfoOrErrorCallback callback); // Marks an entry for future deletion. When an entry is "doomed", it is // immediately removed from the cache's entry count and total size, but its - // data remains on disk until `DeleteDoomedEntry()` is called. The `token` + // data remains on disk until `DeleteDoomedEntry()` is called. The `res_id` // ensures that only the correct instance of an entry is doomed. - virtual void DoomEntry(const CacheEntryKey& key, - const base::UnguessableToken& token, - ErrorCallback callback) = 0; + void DoomEntry(const CacheEntryKey& key, + ResId res_id, + ErrorCallback callback); // Physically deletes an entry that has been previously marked as doomed. This // operation completes the deletion process by removing the entry's data from - // the database. The `token` ensures that only a specific, doomed instance of + // the database. The `res_id` ensures that only a specific, doomed instance of // the entry is deleted. - virtual void DeleteDoomedEntry(const CacheEntryKey& key, - const base::UnguessableToken& token, - ErrorCallback callback) = 0; - - // Physically deletes all entries that have been marked as doomed, except for - // those whose tokens are in `excluded_tokens`. This is typically used for - // background cleanup of doomed entries that are no longer in use. `callback` - // is invoked upon completion. - virtual void DeleteDoomedEntries( - base::flat_set excluded_tokens, - ErrorCallback callback) = 0; + void DeleteDoomedEntry(const CacheEntryKey& key, + ResId res_id, + ErrorCallback callback); // Deletes a "live" entry, i.e., an entry whose `doomed` flag is not set. // This is for use for entries which are not open; open entries should have // `DoomEntry()` called, and then `DeleteDoomedEntry()` once they're no longer // in used. - virtual void DeleteLiveEntry(const CacheEntryKey& key, - ErrorCallback callback) = 0; + void DeleteLiveEntry(const CacheEntryKey& key, ErrorCallback callback); // Deletes all entries from the cache. `callback` is invoked on completion. - virtual void DeleteAllEntries(ErrorCallback callback) = 0; + void DeleteAllEntries(ErrorCallback callback); // Deletes all "live" (not doomed) entries whose `last_used` time falls // within the range [`initial_time`, `end_time`), excluding any entries whose - // keys are present in `excluded_keys`. `callback` is invoked on completion. - virtual void DeleteLiveEntriesBetween( - base::Time initial_time, - base::Time end_time, - base::flat_set excluded_keys, - ErrorCallback callback) = 0; + // IDs are present in `excluded_list`. `callback` is invoked on completion. + void DeleteLiveEntriesBetween(base::Time initial_time, + base::Time end_time, + std::vector excluded_list, + ErrorCallback callback); // Updates the `last_used` timestamp for the entry with the specified `key`. // `callback` is invoked with `kOk` on success, or `kNotFound` if the entry // does not exist or is already doomed. - virtual void UpdateEntryLastUsed(const CacheEntryKey& key, - base::Time last_used, - ErrorCallback callback) = 0; + void UpdateEntryLastUsedByKey(const CacheEntryKey& key, + base::Time last_used, + ErrorCallback callback); + + // Updates the `last_used` timestamp for the entry with the specified + // `res_id`. `callback` is invoked with `kOk` on success, or `kNotFound` if + // the entry does not exist or is already doomed. + void UpdateEntryLastUsedByResId(const CacheEntryKey& key, + ResId res_id, + base::Time last_used, + ErrorCallback callback); // Updates the header data (stream 0) and the `last_used` timestamp for a // specific cache entry. The `bytes_usage` for the entry is adjusted based // on `header_size_delta`. `callback` is invoked with `kOk` on success, - // `kNotFound` if the entry (matching `key` and `token`) is not found or is + // `kNotFound` if the entry (matching `key` and `res_id`) is not found or is // doomed, or `kInvalidData` if internal data consistency checks fail. // `buffer` must not be null. `header_size_delta` is the change in the size // of the header data. - virtual void UpdateEntryHeaderAndLastUsed(const CacheEntryKey& key, - const base::UnguessableToken& token, - base::Time last_used, - scoped_refptr buffer, - int64_t header_size_delta, - ErrorCallback callback) = 0; + void UpdateEntryHeaderAndLastUsed(const CacheEntryKey& key, + ResId res_id, + base::Time last_used, + scoped_refptr buffer, + int64_t header_size_delta, + ErrorCallback callback); // Writes data to an entry's body. This can be used to write new data, // overwrite existing data, or append to the entry. - // `key` and `token` identify the target entry. + // `key` and `res_id` identify the target entry. // `old_body_end` is the expected current size of the body. It is used to // determine whether to trim or truncate existing data, and for consistency // checks. @@ -229,17 +338,17 @@ class NET_EXPORT_PRIVATE SqlPersistentStore { // this write. Otherwise, the body size will grow if the write extends past // the current end. // `callback` is invoked upon completion with an error code. - virtual void WriteEntryData(const CacheEntryKey& key, - const base::UnguessableToken& token, - int64_t old_body_end, - int64_t offset, - scoped_refptr buffer, - int buf_len, - bool truncate, - ErrorCallback callback) = 0; + void WriteEntryData(const CacheEntryKey& key, + ResId res_id, + int64_t old_body_end, + int64_t offset, + scoped_refptr buffer, + int buf_len, + bool truncate, + ErrorCallback callback); // Reads data from an entry's body. - // `token` identifies the entry to read from. + // `res_id` identifies the entry to read from. // `offset` is the position within the entry's body to start reading. // `buffer` is the destination for the read data. // `buf_len` is the size of `buffer`. @@ -248,74 +357,157 @@ class NET_EXPORT_PRIVATE SqlPersistentStore { // stored data. If false, gaps will be filled with zeros. // `callback` is invoked with the number of bytes read on success, or an error // code on failure. - virtual void ReadEntryData(const base::UnguessableToken& token, - int64_t offset, - scoped_refptr buffer, - int buf_len, - int64_t body_end, - bool sparse_reading, - IntOrErrorCallback callback) = 0; + void ReadEntryData(const CacheEntryKey& key, + ResId res_id, + int64_t offset, + scoped_refptr buffer, + int buf_len, + int64_t body_end, + bool sparse_reading, + IntOrErrorCallback callback); // Finds the available contiguous range of data for a given entry. - // `token` identifies the entry. + // `res_id` identifies the entry. // `offset` is the starting position of the range to check. // `len` is the length of the range to check. // `callback` is invoked with the result. The `RangeResult` will contain the // starting offset and length of the first contiguous block of data found // within the requested range `[offset, offset + len)`. If no data is found // in the requested range, the `available_len` in the result will be 0. - virtual void GetEntryAvailableRange(const base::UnguessableToken& token, - int64_t offset, - int len, - RangeResultCallback callback) = 0; + void GetEntryAvailableRange(const CacheEntryKey& key, + ResId res_id, + int64_t offset, + int len, + RangeResultCallback callback); // Calculates the total size of all entries whose `last_used` time falls // within the range [`initial_time`, `end_time`). The size includes the key, // header, body data, and a static overhead per entry. `callback` is invoked // with the total size on success, or an error code on failure. - virtual void CalculateSizeOfEntriesBetween(base::Time initial_time, - base::Time end_time, - Int64OrErrorCallback callback) = 0; + void CalculateSizeOfEntriesBetween(base::Time initial_time, + base::Time end_time, + Int64OrErrorCallback callback); - // Opens the latest (highest `res_id`) cache entry that has a `res_id` less - // than `res_id_cursor`. This method is used for iterating through entries - // in reverse `res_id` order. To fetch all entries, start with - // `res_id_cursor` set to `std::numeric_limits::max()`. `callback` - // receives the entry (or `std::nullopt` if no more entries exist). - virtual void OpenLatestEntryBeforeResId( - int64_t res_id_cursor, - OptionalEntryInfoWithIdAndKeyCallback callback) = 0; + // Opens the next cache entry in reverse `res_id` order. This method is used + // for iterating through entries. To fetch all entries, start with a + // default-constructed `iterator`. `callback` receives the entry (or + // `std::nullopt` if no more entries exist). + void OpenNextEntry(const EntryIterator& iterator, + OptionalEntryInfoWithKeyAndIteratorCallback callback); // Checks if cache eviction should be initiated. This is typically called by - // the backend after an operation that increases the cache size. Returns true - // if the cache size has exceeded the high watermark and an eviction is not - // already in progress. - virtual bool ShouldStartEviction() = 0; + // the backend after an operation that increases the cache size. + EvictionUrgency GetEvictionUrgency(); // Starts the eviction process to reduce the cache size. This method removes // the least recently used entries until the total cache size is below the - // low watermark. Entries with keys in `excluded_keys` (typically active + // low watermark. Entries with ResId in `excluded_res_ids` (typically active // entries) will not be evicted. `callback` is invoked upon completion. - virtual void StartEviction(base::flat_set excluded_keys, - ErrorCallback callback) = 0; + void StartEviction(std::vector excluded_list, + bool is_idle_time_eviction, + ErrorCallback callback); // The maximum size of an individual cache entry's data stream. - virtual int64_t MaxFileSize() const = 0; + int64_t MaxFileSize() const; // The maximum total size of the cache. - virtual int64_t MaxSize() const = 0; + int64_t MaxSize() const; + + // Retrieves the count of entries. + // Note that this value may be stale, as it doesn't account for ongoing + // database operations. + int32_t GetEntryCount() const; // Asynchronously retrieves the count of entries. - virtual void GetEntryCount(Int32Callback callback) const = 0; + // Retrieves the entry count asynchronously, ensuring all pending database + // operations are complete. + void GetEntryCountAsync(Int32Callback callback) const; - // Asynchronously retrieves the total size of all entries. - virtual void GetSizeOfAllEntries(Int64Callback callback) const = 0; + // Retrieves the total size of all entries. + // Note that this value may be stale, as it doesn't account for ongoing + // database operations. + int64_t GetSizeOfAllEntries() const; + + // Loads the in-memory index. This is a no-op if the index has already been + // loaded or if a load is already in progress. Returns true if a load was + // initiated. + bool MaybeLoadInMemoryIndex(ErrorCallback callback); + + // If there are entries that were doomed in a previous session, this method + // triggers a task to delete them from the database. The cleanup is performed + // in the background. Returns true if a cleanup task was scheduled, and false + // otherwise. `callback` is invoked upon completion of the cleanup task. + bool MaybeRunCleanupDoomedEntries(ErrorCallback callback); + + // If the browser is idle and the number of pages recorded in the WAL exceeds + // kSqlDiskCacheIdleCheckpointThreshold, a checkpoint is executed. + void MaybeRunCheckpoint(base::OnceCallback callback); + + enum class IndexState { + // The in-memory index is not available (e.g., not yet loaded or + // invalidated). + kNotReady, + // The index is ready and the hash was found. This may be a false positive. + kHashFound, + // The index is ready, but the hash was not found. + kHashNotFound, + }; + + // Synchronously checks the state of a key hash against the in-memory index. + IndexState GetIndexStateForHash(CacheEntryKey::Hash key_hash) const; + + // Returns the shard ID for a given cache key hash. + ShardId GetShardIdForHash(CacheEntryKey::Hash key_hash) const; // Enables a strict corruption checking mode for testing purposes. - virtual void EnableStrictCorruptionCheckForTesting() = 0; + void EnableStrictCorruptionCheckForTesting(); - protected: - SqlPersistentStore() = default; + // Sets a flag to simulate database operation failures for testing. + void SetSimulateDbFailureForTesting(bool fail); + + // Raze the Database and the poison the database handle for testing. This is + // useful for testing the behavior after a catastrophic error. + void RazeAndPoisonForTesting(); + + private: + void SetMaxSize(int64_t max_bytes); + base::RepeatingCallback CreateBarrierErrorCallback( + ErrorCallback callback); + size_t GetSizeOfShards() const; + BackendShard& GetShard(CacheEntryKey::Hash hash) const; + BackendShard& GetShard(const CacheEntryKey& key) const; + + static std::vector> CreateBackendShards( + const base::FilePath& path, + net::CacheType type, + std::vector> + background_task_runners); + + void OnInitializeFinished(ErrorCallback callback, + std::vector results); + void OnEvictionFinished(bool is_idle_time_eviction, + base::TimeTicks start_time, + std::vector results); + + const std::vector> + background_task_runners_; + const std::vector> backend_shards_; + const int64_t user_max_bytes_; + + int64_t max_bytes_ = 0; + + int64_t high_watermark_ = 0; + int64_t idle_time_high_watermark_ = 0; + int64_t low_watermark_ = 0; + int64_t max_file_size_ = 0; + + // A callback to be called when the eviction is finished. + ErrorCallback eviction_result_callback_; + + // Whether loading of the in-memory index has been triggered. + bool in_memory_load_trigered_ = false; + + base::WeakPtrFactory weak_factory_{this}; }; } // namespace disk_cache diff --git a/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend.cc b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend.cc new file mode 100644 index 0000000000..64bd822b0c --- /dev/null +++ b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend.cc @@ -0,0 +1,2364 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/disk_cache/sql/sql_persistent_store_backend.h" + +#include +#include +#include +#include + +#include "base/containers/flat_set.h" +#include "base/files/file_util.h" +#include "base/functional/bind.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" +#include "base/metrics/histogram_functions.h" +#include "base/numerics/checked_math.h" +#include "base/numerics/clamped_math.h" +#include "base/numerics/safe_conversions.h" +#include "base/numerics/safe_math.h" +#include "base/sequence_checker.h" +#include "base/strings/string_number_conversions.h" +#include "base/sys_byteorder.h" +#include "base/system/sys_info.h" +#include "base/time/time.h" +#include "base/timer/elapsed_timer.h" +#include "base/trace_event/trace_event.h" +#include "base/types/expected.h" +#include "components/performance_manager/scenario_api/performance_scenarios.h" +#include "net/base/features.h" +#include "net/base/io_buffer.h" +#include "net/disk_cache/cache_util.h" +#include "net/disk_cache/simple/simple_util.h" +#include "net/disk_cache/sql/eviction_candidate_aggregator.h" +#include "net/disk_cache/sql/sql_backend_constants.h" +#include "net/disk_cache/sql/sql_persistent_store_in_memory_index.h" +#include "net/disk_cache/sql/sql_persistent_store_queries.h" +#include "sql/database.h" +#include "sql/error_delegate_util.h" +#include "sql/meta_table.h" +#include "sql/sqlite_result_code_values.h" +#include "sql/statement.h" +#include "sql/transaction.h" +#include "third_party/perfetto/include/perfetto/tracing/track.h" + +namespace disk_cache { + +using disk_cache_sql_queries::GetQuery; +using disk_cache_sql_queries::Query; + +using Error = SqlPersistentStore::Error; +using EntryInfo = SqlPersistentStore::EntryInfo; +using ResId = SqlPersistentStore::ResId; +using ResIdAndShardId = SqlPersistentStore::ResIdAndShardId; +using StoreStatus = SqlPersistentStore::StoreStatus; +using EntryInfoWithKeyAndIterator = + SqlPersistentStore::EntryInfoWithKeyAndIterator; +using ResIdList = SqlPersistentStore::ResIdList; +using EntryInfoOrError = SqlPersistentStore::EntryInfoOrError; +using EntryInfoOrErrorAndStoreStatus = + SqlPersistentStore::EntryInfoOrErrorAndStoreStatus; +using OptionalEntryInfoOrError = SqlPersistentStore::OptionalEntryInfoOrError; +using ErrorAndStoreStatus = SqlPersistentStore::ErrorAndStoreStatus; +using ResIdListOrErrorAndStoreStatus = + SqlPersistentStore::ResIdListOrErrorAndStoreStatus; +using ResIdListOrError = SqlPersistentStore::ResIdListOrError; +using IntOrError = SqlPersistentStore::IntOrError; +using Int64OrError = SqlPersistentStore::Int64OrError; +using OptionalEntryInfoWithKeyAndIterator = + SqlPersistentStore::OptionalEntryInfoWithKeyAndIterator; + +using InMemoryIndexAndDoomedResIds = + SqlPersistentStore::Backend::InMemoryIndexAndDoomedResIds; + +namespace { + +bool IsBlobSizeValid(int64_t blob_start, + int64_t blob_end, + const base::span& blob) { + size_t blob_size; + if (!base::CheckSub(blob_end, blob_start).AssignIfValid(&blob_size)) { + return false; + } + return blob.size() == blob_size; +} + +// Helper functions to populate Perfetto trace events with details. +void PopulateTraceDetails(int result, perfetto::TracedDictionary& dict) { + dict.Add("result", result); +} +void PopulateTraceDetails(Error error, perfetto::TracedDictionary& dict) { + dict.Add("error", static_cast(error)); +} +void PopulateTraceDetails(const StoreStatus& store_status, + perfetto::TracedDictionary& dict) { + dict.Add("entry_count", store_status.entry_count); + dict.Add("total_size", store_status.total_size); +} +void PopulateTraceDetails(const EntryInfo& entry_info, + perfetto::TracedDictionary& dict) { + dict.Add("res_id", entry_info.res_id.value()); + dict.Add("last_used", entry_info.last_used); + dict.Add("body_end", entry_info.body_end); + dict.Add("head_size", entry_info.head ? entry_info.head->size() : 0); + dict.Add("opened", entry_info.opened); +} +void PopulateTraceDetails(const std::optional& entry_info, + perfetto::TracedDictionary& dict) { + if (entry_info) { + PopulateTraceDetails(*entry_info, dict); + } else { + dict.Add("entry_info", "not found"); + } +} +void PopulateTraceDetails(const RangeResult& range_result, + perfetto::TracedDictionary& dict) { + dict.Add("range_start", range_result.start); + dict.Add("range_available_len", range_result.available_len); +} +void PopulateTraceDetails(const EntryInfoWithKeyAndIterator& result, + perfetto::TracedDictionary& dict) { + PopulateTraceDetails(result.info, dict); + dict.Add("iterator_res_id", result.iterator.value().res_id); + dict.Add("key", result.key.string()); +} +void PopulateTraceDetails( + const std::optional& entry_info, + perfetto::TracedDictionary& dict) { + if (entry_info) { + PopulateTraceDetails(*entry_info, dict); + } else { + dict.Add("entry_info", "not found"); + } +} +void PopulateTraceDetails(const ResIdList& result, + perfetto::TracedDictionary& dict) { + dict.Add("doomed_entry_count", result.size()); +} +void PopulateTraceDetails(const InMemoryIndexAndDoomedResIds& result, + perfetto::TracedDictionary& dict) { + dict.Add("index_size", result.index.size()); + dict.Add("doomed_entry_count", result.doomed_entry_res_ids.size()); +} +void PopulateTraceDetails(Error error, + const StoreStatus& store_status, + perfetto::TracedDictionary& dict) { + PopulateTraceDetails(error, dict); + PopulateTraceDetails(store_status, dict); +} +template +void PopulateTraceDetails(const base::expected& result, + const StoreStatus& store_status, + perfetto::TracedDictionary& dict) { + if (result.has_value()) { + PopulateTraceDetails(*result, dict); + } else { + PopulateTraceDetails(result.error(), dict); + } + PopulateTraceDetails(store_status, dict); +} + +// A helper function to record the time delay from posting a task to its +// execution. +void RecordPostingDelay(std::string_view method_name, + base::TimeDelta posting_delay) { + base::UmaHistogramMicrosecondsTimes( + base::StrCat( + {kSqlDiskCacheBackendHistogramPrefix, method_name, ".PostingDelay"}), + posting_delay); +} + +// Records timing and result histograms for a backend method. This logs the +// method's duration to ".SuccessTime" or ".FailureTime" histograms and the +// `Error` code to a ".Result" histogram. +void RecordTimeAndErrorResultHistogram(std::string_view method_name, + base::TimeDelta posting_delay, + base::TimeDelta time_delta, + Error error, + bool corruption_detected) { + RecordPostingDelay(method_name, posting_delay); + base::UmaHistogramMicrosecondsTimes( + base::StrCat({kSqlDiskCacheBackendHistogramPrefix, method_name, + error == Error::kOk ? ".SuccessTime" : ".FailureTime", + corruption_detected ? "WithCorruption" : ""}), + time_delta); + base::UmaHistogramEnumeration( + base::StrCat({kSqlDiskCacheBackendHistogramPrefix, method_name, + corruption_detected ? ".ResultWithCorruption" : ".Result"}), + error); +} + +int32_t CalculateCheckSum(base::span data, + CacheEntryKey::Hash key_hash) { + // Add key_hash in network order to the CRC calculation to ensure it can be + // read correctly on CPUs with different endianness. + uint32_t hash_value_net_order = + base::HostToNet32(static_cast(key_hash.value())); + uint32_t crc32_value = simple_util::IncrementalCrc32( + simple_util::Crc32(data), base::byte_span_from_ref(hash_value_net_order)); + return static_cast(crc32_value); +} + +// Sets up the database schema and indexes. +[[nodiscard]] bool InitSchema(sql::Database& db) { + if (!db.Execute(GetQuery(Query::kInitSchema_CreateTableResources)) || + !db.Execute(GetQuery(Query::kInitSchema_CreateTableBlobs)) || + !db.Execute(GetQuery(Query::kIndex_ResourcesCacheKeyHashDoomed)) || + !db.Execute(GetQuery(Query::kIndex_LiveResourcesLastUsed)) || + !db.Execute(GetQuery(Query::kIndex_BlobsResIdStart))) { + return false; + } + return true; +} + +// Retrieves a value from the provided `sql::MetaTable` and initializes it if +// not found. +[[nodiscard]] bool GetOrInitializeMetaValue(sql::MetaTable& meta, + std::string_view key, + int64_t& value, + int64_t default_value) { + if (meta.GetValue(key, &value)) { + return true; + } + value = default_value; + return meta.SetValue(key, value); +} + +bool IsBrowserIdle() { + return performance_scenarios::CurrentScenariosMatch( + performance_scenarios::ScenarioScope::kGlobal, + performance_scenarios::kDefaultIdleScenarios); +} + +} // namespace + +SqlPersistentStore::Backend::Backend(ShardId shard_id, + const base::FilePath& path, + net::CacheType type) + : shard_id_(shard_id), + path_(path), + type_(type), + db_(sql::DatabaseOptions() + .set_exclusive_locking(true) +#if BUILDFLAG(IS_WIN) + .set_exclusive_database_file_lock(true) +#endif // IS_WIN + .set_preload(true) + .set_wal_mode(true) + .set_no_sync_on_wal_mode( + net::features::kSqlDiskCacheSynchronousOff.Get()) + .set_wal_commit_callback(base::BindRepeating( + &Backend::OnCommitCallback, + // This callback is only called while the `db_` instance + // is alive, and never during destructor, so it's safe + // to use base::Unretained. + base::Unretained(this))), + // Tag for metrics collection. + sql::Database::Tag("HttpCacheDiskCache")) { +} + +SqlPersistentStore::Backend::~Backend() = default; + +Error SqlPersistentStore::Backend::CheckDatabaseStatus() { + if (simulate_db_failure_for_testing_) { + return Error::kFailedForTesting; + } + if (!db_init_status_.has_value() || *db_init_status_ != Error::kOk) { + return Error::kNotInitialized; + } + if (!db_.is_open()) { + // The database have been closed when a catastrophic error occurred and + // RazeAndPoison() was called. + return Error::kDatabaseClosed; + } + return Error::kOk; +} + +SqlPersistentStore::InitResultOrError SqlPersistentStore::Backend::Initialize( + int64_t user_max_bytes, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN0("disk_cache", "SqlBackend.Initialize"); + base::ElapsedTimer timer; + CHECK(!db_init_status_.has_value()); + bool corruption_detected = false; + SqlPersistentStoreInMemoryIndex index; + ResIdList doomed_entry_res_ids; + db_init_status_ = + InitializeInternal(corruption_detected, index, doomed_entry_res_ids); + + std::optional result_max_bytes; + // `max_bytes` of InitResult is set only for the first shard. + if (shard_id_ == ShardId(0)) { + // If the specified max_bytes is valid, use it. Otherwise, calculate a + // preferred size based on available disk space. + result_max_bytes = + user_max_bytes > 0 + ? user_max_bytes + : PreferredCacheSize( + base::SysInfo::AmountOfFreeDiskSpace(path_).value_or(-1), + type_); + } + RecordTimeAndErrorResultHistogram("Initialize", posting_delay, + timer.Elapsed(), *db_init_status_, + corruption_detected); + TRACE_EVENT_END1("disk_cache", "SqlBackend.Initialize", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(*db_init_status_, store_status_, + dict); + }); + MaybeCrashIfCorrupted(corruption_detected); + return *db_init_status_ == Error::kOk + ? InitResultOrError(InitResult( + result_max_bytes, store_status_, + base::GetFileSize(GetDatabaseFilePath()).value_or(0))) + : base::unexpected(*db_init_status_); +} + +Error SqlPersistentStore::Backend::InitializeInternal( + bool& corruption_detected, + SqlPersistentStoreInMemoryIndex& index, + ResIdList& doomed_entry_res_ids) { + if (simulate_db_failure_for_testing_) { + return Error::kFailedForTesting; + } + CHECK(!db_init_status_.has_value()); + + db_.set_error_callback(base::BindRepeating(&Backend::DatabaseErrorCallback, + base::Unretained(this))); + + base::FilePath db_file_path = GetDatabaseFilePath(); + DVLOG(1) << "Backend::InitializeInternal db_file_path: " << db_file_path; + + base::FilePath directory = db_file_path.DirName(); + if (!base::DirectoryExists(directory) && !base::CreateDirectory(directory)) { + return Error::kFailedToCreateDirectory; + } + + if (!db_.Open(db_file_path)) { + return Error::kFailedToOpenDatabase; + } + + // Raze old incompatible databases. + if (sql::MetaTable::RazeIfIncompatible( + &db_, kSqlBackendLowestSupportedDatabaseVersion, + kSqlBackendCurrentDatabaseVersion) == + sql::RazeIfIncompatibleResult::kFailed) { + return Error::kFailedToRazeIncompatibleDatabase; + } + + // Ensures atomicity of initialization: either all schema setup and metadata + // writes succeed, or all are rolled back, preventing an inconsistent state. + sql::Transaction transaction(&db_); + if (!transaction.Begin()) { + return Error::kFailedToStartTransaction; + } + + if (!sql::MetaTable::DoesTableExist(&db_)) { + // Initialize the database schema. + if (!InitSchema(db_)) { + return Error::kFailedToInitializeSchema; + } + } + + // Initialize the meta table, which stores version info and other metadata. + if (!meta_table_.Init(&db_, kSqlBackendCurrentDatabaseVersion, + kSqlBackendCompatibleDatabaseVersion)) { + return Error::kFailedToInitializeMetaTable; + } + + int64_t tmp_entry_count = 0; + if (!GetOrInitializeMetaValue(meta_table_, kSqlBackendMetaTableKeyEntryCount, + tmp_entry_count, + /*default_value=*/0)) { + return Error::kFailedToSetEntryCountMetadata; + } + if (!GetOrInitializeMetaValue(meta_table_, kSqlBackendMetaTableKeyTotalSize, + store_status_.total_size, + /*default_value=*/0)) { + return Error::kFailedToSetTotalSizeMetadata; + } + + if (tmp_entry_count < 0 || + !base::IsValueInRangeForNumericType(tmp_entry_count) || + store_status_.total_size < 0) { + corruption_detected = true; + return RecalculateStoreStatusAndCommitTransaction(transaction); + } + + store_status_.entry_count = static_cast(tmp_entry_count); + + return transaction.Commit() ? Error::kOk : Error::kFailedToCommitTransaction; +} + +void SqlPersistentStore::Backend::DatabaseErrorCallback( + int error, + sql::Statement* statement) { + TRACE_EVENT("disk_cache", "SqlBackend.Error", "error", error); + sql::UmaHistogramSqliteResult( + base::StrCat({kSqlDiskCacheBackendHistogramPrefix, "SqliteError"}), + error); + // For the HTTP Cache, a kFullDisk error is not recoverable and freeing up + // disk space is the best course of action. So, we treat it as a catastrophic + // error to raze the database. + if ((sql::IsErrorCatastrophic(error) || + error == static_cast(sql::SqliteErrorCode::kFullDisk)) && + db_.is_open()) { + // Normally this will poison the database, causing any subsequent operations + // to silently fail without any side effects. However, if RazeAndPoison() is + // called from the error callback in response to an error raised from within + // sql::Database::Open, opening the now-razed database will be retried. + db_.RazeAndPoison(); + store_status_ = StoreStatus(); + } +} + +int32_t SqlPersistentStore::Backend::GetEntryCount() const { + return store_status_.entry_count; +} + +EntryInfoOrErrorAndStoreStatus SqlPersistentStore::Backend::OpenOrCreateEntry( + const CacheEntryKey& key, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.OpenOrCreateEntry", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("key", key.string()); + PopulateTraceDetails(store_status_, dict); + }); + base::ElapsedTimer timer; + bool corruption_detected = false; + auto result = OpenOrCreateEntryInternal(key, corruption_detected); + RecordTimeAndErrorResultHistogram( + "OpenOrCreateEntry", posting_delay, timer.Elapsed(), + result.error_or(Error::kOk), corruption_detected); + TRACE_EVENT_END1("disk_cache", "SqlBackend.OpenOrCreateEntry", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + }); + MaybeCrashIfCorrupted(corruption_detected); + return EntryInfoOrErrorAndStoreStatus(std::move(result), store_status_); +} + +EntryInfoOrError SqlPersistentStore::Backend::OpenOrCreateEntryInternal( + const CacheEntryKey& key, + bool& corruption_detected) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return base::unexpected(db_error); + } + // Try to open first. + auto open_result = OpenEntryInternal(key); + if (open_result.has_value() && open_result->has_value()) { + return std::move(*open_result.value()); + } + // If opening failed with an error, propagate that error. + if (!open_result.has_value()) { + return base::unexpected(open_result.error()); + } + // If the entry was not found, try to create a new one. + return CreateEntryInternal(key, base::Time::Now(), + /*run_existance_check=*/false, + corruption_detected); +} + +OptionalEntryInfoOrError SqlPersistentStore::Backend::OpenEntry( + const CacheEntryKey& key, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.OpenEntry", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("key", key.string()); + PopulateTraceDetails(store_status_, dict); + }); + base::ElapsedTimer timer; + auto result = OpenEntryInternal(key); + RecordTimeAndErrorResultHistogram("OpenEntry", posting_delay, timer.Elapsed(), + result.error_or(Error::kOk), + /*corruption_detected=*/false); + TRACE_EVENT_END1("disk_cache", "SqlBackend.OpenEntry", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + }); + return result; +} + +OptionalEntryInfoOrError SqlPersistentStore::Backend::OpenEntryInternal( + const CacheEntryKey& key) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return base::unexpected(db_error); + } + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, GetQuery(Query::kOpenEntry_SelectLiveResources))); + statement.BindInt(0, key.hash().value()); + statement.BindString(1, key.string()); + if (!statement.Step()) { + // `Step()` returned false, which means either the query completed with no + // results, or an error occurred. + if (db_.GetErrorCode() == static_cast(sql::SqliteResultCode::kDone)) { + // The query completed successfully but found no matching entry. + return std::nullopt; + } + // An unexpected database error occurred. + return base::unexpected(Error::kFailedToExecute); + } + EntryInfo entry_info; + entry_info.res_id = ResId(statement.ColumnInt64(0)); + entry_info.last_used = statement.ColumnTime(1); + entry_info.body_end = statement.ColumnInt64(2); + int32_t check_sum = statement.ColumnInt(3); + base::span blob_span = statement.ColumnBlob(4); + if (CalculateCheckSum(blob_span, key.hash()) != check_sum) { + return base::unexpected(Error::kCheckSumError); + } + entry_info.head = base::MakeRefCounted(); + CHECK(base::IsValueInRangeForNumericType(blob_span.size())); + entry_info.head->SetCapacity(blob_span.size()); + entry_info.head->span().copy_from_nonoverlapping(blob_span); + entry_info.opened = true; + return entry_info; +} + +EntryInfoOrErrorAndStoreStatus SqlPersistentStore::Backend::CreateEntry( + const CacheEntryKey& key, + base::Time creation_time, + bool run_existance_check, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.CreateEntry", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("key", key.string()); + PopulateTraceDetails(store_status_, dict); + }); + base::ElapsedTimer timer; + bool corruption_detected = false; + auto result = CreateEntryInternal(key, creation_time, run_existance_check, + corruption_detected); + RecordTimeAndErrorResultHistogram( + "CreateEntry", posting_delay, timer.Elapsed(), + result.error_or(Error::kOk), corruption_detected); + TRACE_EVENT_END1("disk_cache", "SqlBackend.CreateEntry", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + }); + MaybeCrashIfCorrupted(corruption_detected); + return EntryInfoOrErrorAndStoreStatus(std::move(result), store_status_); +} + +EntryInfoOrError SqlPersistentStore::Backend::CreateEntryInternal( + const CacheEntryKey& key, + base::Time creation_time, + bool run_existance_check, + bool& corruption_detected) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return base::unexpected(db_error); + } + sql::Transaction transaction(&db_); + if (!transaction.Begin()) { + return base::unexpected(Error::kFailedToStartTransaction); + } + if (run_existance_check) { + auto open_result = OpenEntryInternal(key); + if (open_result.has_value() && open_result->has_value()) { + return base::unexpected(Error::kAlreadyExists); + } + // If opening failed with an error, propagate that error. + if (!open_result.has_value()) { + return base::unexpected(open_result.error()); + } + } + EntryInfo entry_info; + entry_info.last_used = creation_time; + entry_info.body_end = 0; + entry_info.head = nullptr; + entry_info.opened = false; + // The size of an entry is set to the size of its key. This value will be + // updated as the header and body are written. + // The static size per entry, `kSqlBackendStaticResourceSize`, is added in + // `GetSizeOfAllEntries()`. + const int64_t bytes_usage = key.string().size(); + { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, + GetQuery( + disk_cache_sql_queries::Query::kCreateEntry_InsertIntoResources))); + statement.BindTime(0, entry_info.last_used); + statement.BindInt64(1, entry_info.body_end); + statement.BindInt64(2, bytes_usage); + statement.BindInt(3, CalculateCheckSum({}, key.hash())); + statement.BindInt(4, key.hash().value()); + statement.BindString(5, key.string()); + if (!statement.Step()) { + return base::unexpected(Error::kFailedToExecute); + } + entry_info.res_id = ResId(statement.ColumnInt64(0)); + } + + // Update the store's status and commit the transaction. + // The entry count is increased by 1, and the total size by `bytes_usage`. + // This call will also handle updating the on-disk meta table. + if (const auto error = UpdateStoreStatusAndCommitTransaction( + transaction, + /*entry_count_delta=*/1, + /*total_size_delta=*/bytes_usage, corruption_detected); + error != Error::kOk) { + return base::unexpected(error); + } + + return entry_info; +} + +ErrorAndStoreStatus SqlPersistentStore::Backend::DoomEntry( + const CacheEntryKey& key, + ResId res_id, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.DoomEntry", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("key", key.string()); + dict.Add("res_id", res_id.value()); + PopulateTraceDetails(store_status_, dict); + }); + base::ElapsedTimer timer; + bool corruption_detected = false; + auto result = DoomEntryInternal(res_id, corruption_detected); + RecordTimeAndErrorResultHistogram("DoomEntry", posting_delay, timer.Elapsed(), + result, corruption_detected); + TRACE_EVENT_END1("disk_cache", "SqlBackend.DoomEntry", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + dict.Add("corruption_detected", corruption_detected); + }); + MaybeCrashIfCorrupted(corruption_detected); + return ErrorAndStoreStatus(result, store_status_); +} + +Error SqlPersistentStore::Backend::DoomEntryInternal( + ResId res_id, + bool& corruption_detected) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return db_error; + } + sql::Transaction transaction(&db_); + if (!transaction.Begin()) { + return Error::kFailedToStartTransaction; + } + + int64_t doomed_count = 0; + // Use checked numerics to safely calculate the change in total size and + // detect potential metadata corruption from overflows. + base::CheckedNumeric total_size_delta = 0; + { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, GetQuery(Query::kDoomEntry_MarkDoomedResources))); + statement.BindInt64(0, res_id.value()); + // Iterate through the rows returned by the RETURNING clause. + while (statement.Step()) { + // Since we're dooming an entry, its size is subtracted from the total. + total_size_delta -= statement.ColumnInt64(0); + // Count how many entries were actually updated. + ++doomed_count; + } + } + // The res_id should uniquely identify a single non-doomed entry. + CHECK_LE(doomed_count, 1); + + // If no rows were updated, it means the entry was not found, so we report + // kNotFound. + if (doomed_count == 0) { + return transaction.Commit() ? Error::kNotFound + : Error::kFailedToCommitTransaction; + } + + // If the `total_size_delta` calculation resulted in an overflow, it suggests + // that the `bytes_usage` value in the database was corrupt. In this case, we + // trigger a full recalculation of the store's status to recover to a + // consistent state. + if (!total_size_delta.IsValid()) { + corruption_detected = true; + return RecalculateStoreStatusAndCommitTransaction(transaction); + } + + return UpdateStoreStatusAndCommitTransaction( + transaction, + /*entry_count_delta=*/-doomed_count, + /*total_size_delta=*/total_size_delta.ValueOrDie(), corruption_detected); +} + +ErrorAndStoreStatus SqlPersistentStore::Backend::DeleteDoomedEntry( + const CacheEntryKey& key, + ResId res_id, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.DeleteDoomedEntry", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("key", key.string()); + dict.Add("res_id", res_id.value()); + PopulateTraceDetails(store_status_, dict); + }); + base::ElapsedTimer timer; + auto result = DeleteDoomedEntryInternal(res_id); + RecordTimeAndErrorResultHistogram("DeleteDoomedEntry", posting_delay, + timer.Elapsed(), result, + /*corruption_detected=*/false); + TRACE_EVENT_END1("disk_cache", "SqlBackend.DeleteDoomedEntry", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + }); + return ErrorAndStoreStatus(result, store_status_); +} + +Error SqlPersistentStore::Backend::DeleteDoomedEntryInternal(ResId res_id) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return db_error; + } + sql::Transaction transaction(&db_); + if (!transaction.Begin()) { + return Error::kFailedToStartTransaction; + } + + int64_t deleted_count = 0; + { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, + GetQuery(Query::kDeleteDoomedEntry_DeleteFromResources))); + statement.BindInt64(0, res_id.value()); + if (!statement.Run()) { + return Error::kFailedToExecute; + } + deleted_count = db_.GetLastChangeCount(); + } + // The res_id should uniquely identify a single doomed entry. + CHECK_LE(deleted_count, 1); + + // If we didn't find any doomed entry matching the res_id, report it. + if (deleted_count == 0) { + return transaction.Commit() ? Error::kNotFound + : Error::kFailedToCommitTransaction; + } + + // Delete the associated blobs from the `blobs` table. + if (Error error = DeleteBlobsByResId(res_id); error != Error::kOk) { + return error; + } + + return transaction.Commit() ? Error::kOk : Error::kFailedToCommitTransaction; +} + +Error SqlPersistentStore::Backend::DeleteDoomedEntries( + ResIdList res_ids_to_delete, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN0("disk_cache", "SqlBackend.DeleteDoomedEntries"); + base::ElapsedTimer timer; + bool corruption_detected = false; + auto result = + DeleteDoomedEntriesInternal(res_ids_to_delete, corruption_detected); + RecordTimeAndErrorResultHistogram("DeleteDoomedEntries", posting_delay, + timer.Elapsed(), result, + corruption_detected); + base::UmaHistogramCounts100("Net.SqlDiskCache.DeleteDoomedEntriesCount", + res_ids_to_delete.size()); + TRACE_EVENT_END1("disk_cache", "SqlBackend.DeleteDoomedEntries", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + dict.Add("deleted_count", res_ids_to_delete.size()); + }); + MaybeCrashIfCorrupted(corruption_detected); + return result; +} + +Error SqlPersistentStore::Backend::DeleteDoomedEntriesInternal( + const ResIdList& res_ids_to_delete, + bool& corruption_detected) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return db_error; + } + sql::Transaction transaction(&db_); + if (!transaction.Begin()) { + return Error::kFailedToStartTransaction; + } + + // 1. Delete from `resources` table by `res_id`. + if (auto error = DeleteResourcesByResIds(res_ids_to_delete); + error != Error::kOk) { + return error; + } + + // 2. Delete corresponding blobs by res_id. + if (auto error = DeleteBlobsByResIds(res_ids_to_delete); + error != Error::kOk) { + return error; + } + + // 3. Commit the transaction. + // Note: The entries for the res IDs passed to this method are assumed to be + // doomed, so store_status_'s entry_count and total_size are not updated. + return transaction.Commit() ? Error::kOk : Error::kFailedToCommitTransaction; +} + +ResIdListOrErrorAndStoreStatus SqlPersistentStore::Backend::DeleteLiveEntry( + const CacheEntryKey& key, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.DeleteLiveEntry", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("key", key.string()); + PopulateTraceDetails(store_status_, dict); + }); + base::ElapsedTimer timer; + bool corruption_detected = false; + auto result = DeleteLiveEntryInternal(key, corruption_detected); + RecordTimeAndErrorResultHistogram( + "DeleteLiveEntry", posting_delay, timer.Elapsed(), + result.error_or(Error::kOk), corruption_detected); + TRACE_EVENT_END1("disk_cache", "SqlBackend.DeleteLiveEntry", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + dict.Add("corruption_detected", corruption_detected); + }); + MaybeCrashIfCorrupted(corruption_detected); + return ResIdListOrErrorAndStoreStatus(std::move(result), store_status_); +} + +ResIdListOrError SqlPersistentStore::Backend::DeleteLiveEntryInternal( + const CacheEntryKey& key, + bool& corruption_detected) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return base::unexpected(db_error); + } + sql::Transaction transaction(&db_); + if (!transaction.Begin()) { + return base::unexpected(Error::kFailedToStartTransaction); + } + + // We need to collect the res_ids of deleted entries to later remove their + // corresponding data from the `blobs` table. + ResIdList res_ids_to_be_deleted; + // Use checked numerics to safely update the total cache size. + base::CheckedNumeric total_size_delta = 0; + { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, GetQuery(Query::kDeleteLiveEntry_DeleteFromResources))); + statement.BindInt(0, key.hash().value()); + statement.BindString(1, key.string()); + while (statement.Step()) { + const auto res_id = ResId(statement.ColumnInt64(0)); + res_ids_to_be_deleted.emplace_back(res_id); + // The size of the deleted entry is subtracted from the total. + total_size_delta -= statement.ColumnInt64(1); + } + } + + // If no entries were deleted, the key wasn't found. + if (res_ids_to_be_deleted.empty()) { + return transaction.Commit() + ? base::unexpected(Error::kNotFound) + : base::unexpected(Error::kFailedToCommitTransaction); + } + + // Delete the blobs associated with the deleted entries. + if (Error delete_result = DeleteBlobsByResIds(res_ids_to_be_deleted); + delete_result != Error::kOk) { + // If blob deletion fails, returns the error. The transaction will be + // rolled back. So no need to return `deleted_enties`. + return base::unexpected(delete_result); + } + + // If we detected corruption, or if the size update calculation overflowed, + // our metadata is suspect. We recover by recalculating everything from + // scratch. + if (corruption_detected || !total_size_delta.IsValid()) { + corruption_detected = true; + auto error = RecalculateStoreStatusAndCommitTransaction(transaction); + return error == Error::kOk + ? ResIdListOrError(std::move(res_ids_to_be_deleted)) + : base::unexpected(error); + } + + auto error = UpdateStoreStatusAndCommitTransaction( + transaction, + /*entry_count_delta=*/ + -static_cast(res_ids_to_be_deleted.size()), + /*total_size_delta=*/total_size_delta.ValueOrDie(), corruption_detected); + return error == Error::kOk + ? ResIdListOrError(std::move(res_ids_to_be_deleted)) + : base::unexpected(error); +} + +ErrorAndStoreStatus SqlPersistentStore::Backend::DeleteAllEntries( + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.DeleteAllEntries", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(store_status_, dict); + }); + base::ElapsedTimer timer; + bool corruption_detected = false; + Error result = DeleteAllEntriesInternal(corruption_detected); + RecordTimeAndErrorResultHistogram("DeleteAllEntries", posting_delay, + timer.Elapsed(), result, + corruption_detected); + TRACE_EVENT_END1("disk_cache", "SqlBackend.DeleteAllEntries", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + }); + MaybeCrashIfCorrupted(corruption_detected); + return ErrorAndStoreStatus(result, store_status_); +} + +Error SqlPersistentStore::Backend::DeleteAllEntriesInternal( + bool& corruption_detected) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return db_error; + } + sql::Transaction transaction(&db_); + if (!transaction.Begin()) { + return Error::kFailedToStartTransaction; + } + + // Clear the main resources table. + { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, GetQuery(Query::kDeleteAllEntries_DeleteFromResources))); + if (!statement.Run()) { + return Error::kFailedToExecute; + } + } + + // Also clear the blobs table. + { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, GetQuery(Query::kDeleteAllEntries_DeleteFromBlobs))); + if (!statement.Run()) { + return Error::kFailedToExecute; + } + } + + // Update the store's status and commit the transaction. + // The entry count and the total size will be zero. + // This call will also handle updating the on-disk meta table. + return UpdateStoreStatusAndCommitTransaction( + transaction, + /*entry_count_delta=*/-store_status_.entry_count, + /*total_size_delta=*/-store_status_.total_size, corruption_detected); +} + +ResIdListOrErrorAndStoreStatus +SqlPersistentStore::Backend::DeleteLiveEntriesBetween( + base::Time initial_time, + base::Time end_time, + base::flat_set excluded_res_ids, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.DeleteLiveEntriesBetween", + "data", [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("initial_time", initial_time); + dict.Add("end_time", end_time); + dict.Add("excluded_res_ids_size", + excluded_res_ids.size()); + PopulateTraceDetails(store_status_, dict); + }); + base::ElapsedTimer timer; + // Flag to indicate if we encounter signs of database corruption. In + // DeleteLiveEntriesBetween, database corruption is ignored. + bool corruption_detected = false; + auto result = DeleteLiveEntriesBetweenInternal( + initial_time, end_time, excluded_res_ids, corruption_detected); + RecordTimeAndErrorResultHistogram( + "DeleteLiveEntriesBetween", posting_delay, timer.Elapsed(), + result.error_or(Error::kOk), corruption_detected); + TRACE_EVENT_END1("disk_cache", "SqlBackend.DeleteLiveEntriesBetween", + "result", [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + }); + MaybeCrashIfCorrupted(corruption_detected); + return ResIdListOrErrorAndStoreStatus(std::move(result), store_status_); +} + +ResIdListOrError SqlPersistentStore::Backend::DeleteLiveEntriesBetweenInternal( + base::Time initial_time, + base::Time end_time, + const base::flat_set& excluded_res_ids, + bool& corruption_detected) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return base::unexpected(db_error); + } + sql::Transaction transaction(&db_); + if (!transaction.Begin()) { + return base::unexpected(Error::kFailedToStartTransaction); + } + + ResIdList res_ids_to_be_deleted; + base::CheckedNumeric total_size_delta = 0; + { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, + GetQuery(Query::kDeleteLiveEntriesBetween_SelectLiveResources))); + statement.BindTime(0, initial_time); + statement.BindTime(1, end_time); + while (statement.Step()) { + const auto res_id = ResId(statement.ColumnInt64(0)); + if (excluded_res_ids.contains(res_id)) { + continue; + } + res_ids_to_be_deleted.emplace_back(res_id); + total_size_delta -= statement.ColumnInt64(1); + } + } + + // Delete the blobs associated with the entries to be deleted. + if (auto error = DeleteBlobsByResIds(res_ids_to_be_deleted); + error != Error::kOk) { + return base::unexpected(error); + } + + // Delete the selected entries from the `resources` table. + if (auto error = DeleteResourcesByResIds(res_ids_to_be_deleted); + error != Error::kOk) { + return base::unexpected(error); + } + + // If we detected corruption, or if the size update calculation overflowed, + // our metadata is suspect. We recover by recalculating everything from + // scratch. + if (corruption_detected || !total_size_delta.IsValid()) { + corruption_detected = true; + auto error = RecalculateStoreStatusAndCommitTransaction(transaction); + return error == Error::kOk + ? ResIdListOrError(std::move(res_ids_to_be_deleted)) + : base::unexpected(error); + } + + // Update the in-memory and on-disk store status (entry count and total size) + // and commit the transaction. + auto error = UpdateStoreStatusAndCommitTransaction( + transaction, -static_cast(res_ids_to_be_deleted.size()), + total_size_delta.ValueOrDie(), corruption_detected); + return error == Error::kOk + ? ResIdListOrError(std::move(res_ids_to_be_deleted)) + : base::unexpected(error); +} + +Error SqlPersistentStore::Backend::UpdateEntryLastUsedByKey( + const CacheEntryKey& key, + base::Time last_used, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.UpdateEntryLastUsedByKey", + "data", [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("key", key.string()); + dict.Add("last_used", last_used); + }); + base::ElapsedTimer timer; + auto result = UpdateEntryLastUsedByKeyInternal(key, last_used); + RecordTimeAndErrorResultHistogram("UpdateEntryLastUsedByKey", posting_delay, + timer.Elapsed(), result, + /*corruption_detected=*/false); + TRACE_EVENT_END1("disk_cache", "SqlBackend.UpdateEntryLastUsedByKey", + "result", [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, dict); + }); + return result; +} + +Error SqlPersistentStore::Backend::UpdateEntryLastUsedByKeyInternal( + const CacheEntryKey& key, + base::Time last_used) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return db_error; + } + sql::Transaction transaction(&db_); + if (!transaction.Begin()) { + return Error::kFailedToStartTransaction; + } + int64_t change_count = 0; + { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, + GetQuery(Query::kUpdateEntryLastUsedByKey_UpdateResourceLastUsed))); + statement.BindTime(0, last_used); + statement.BindInt(1, key.hash().value()); + statement.BindString(2, key.string()); + if (!statement.Run()) { + return Error::kFailedToExecute; + } + change_count = db_.GetLastChangeCount(); + } + if (!transaction.Commit()) { + return Error::kFailedToCommitTransaction; + } + return change_count == 0 ? Error::kNotFound : Error::kOk; +} + +Error SqlPersistentStore::Backend::UpdateEntryLastUsedByResId( + ResId res_id, + base::Time last_used, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.UpdateEntryLastUsedByResId", + "data", [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("res_id", res_id.value()); + dict.Add("last_used", last_used); + }); + base::ElapsedTimer timer; + auto result = UpdateEntryLastUsedByResIdInternal(res_id, last_used); + RecordTimeAndErrorResultHistogram("UpdateEntryLastUsedByResId", posting_delay, + timer.Elapsed(), result, + /*corruption_detected=*/false); + TRACE_EVENT_END1("disk_cache", "SqlBackend.UpdateEntryLastUsedByResId", + "result", [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, dict); + }); + return result; +} + +Error SqlPersistentStore::Backend::UpdateEntryLastUsedByResIdInternal( + ResId res_id, + base::Time last_used) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return db_error; + } + sql::Transaction transaction(&db_); + if (!transaction.Begin()) { + return Error::kFailedToStartTransaction; + } + int64_t change_count = 0; + { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, + GetQuery(Query::kUpdateEntryLastUsedByResId_UpdateResourceLastUsed))); + statement.BindTime(0, last_used); + statement.BindInt64(1, res_id.value()); + if (!statement.Run()) { + return Error::kFailedToExecute; + } + change_count = db_.GetLastChangeCount(); + } + if (!transaction.Commit()) { + return Error::kFailedToCommitTransaction; + } + return change_count == 0 ? Error::kNotFound : Error::kOk; +} + +ErrorAndStoreStatus SqlPersistentStore::Backend::UpdateEntryHeaderAndLastUsed( + const CacheEntryKey& key, + ResId res_id, + base::Time last_used, + scoped_refptr buffer, + int64_t header_size_delta, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.UpdateEntryHeaderAndLastUsed", + "data", [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("key", key.string()); + dict.Add("res_id", res_id.value()); + dict.Add("last_used", last_used); + dict.Add("header_size_delta", header_size_delta); + PopulateTraceDetails(store_status_, dict); + }); + base::ElapsedTimer timer; + bool corruption_detected = false; + auto result = UpdateEntryHeaderAndLastUsedInternal( + key, res_id, last_used, std::move(buffer), header_size_delta, + corruption_detected); + RecordTimeAndErrorResultHistogram("UpdateEntryHeaderAndLastUsed", + posting_delay, timer.Elapsed(), result, + corruption_detected); + TRACE_EVENT_END1("disk_cache", "SqlBackend.UpdateEntryHeaderAndLastUsed", + "result", [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + }); + MaybeCrashIfCorrupted(corruption_detected); + return ErrorAndStoreStatus(result, store_status_); +} +Error SqlPersistentStore::Backend::UpdateEntryHeaderAndLastUsedInternal( + const CacheEntryKey& key, + ResId res_id, + base::Time last_used, + scoped_refptr buffer, + int64_t header_size_delta, + bool& corruption_detected) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return db_error; + } + CHECK(buffer); + + sql::Transaction transaction(&db_); + if (!transaction.Begin()) { + return Error::kFailedToStartTransaction; + } + { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, + GetQuery(Query::kUpdateEntryHeaderAndLastUsed_UpdateResource))); + statement.BindTime(0, last_used); + statement.BindInt64(1, header_size_delta); + statement.BindInt(2, CalculateCheckSum(buffer->span(), key.hash())); + statement.BindBlob(3, buffer->span()); + statement.BindInt64(4, res_id.value()); + if (statement.Step()) { + const int64_t bytes_usage = statement.ColumnInt64(0); + if (bytes_usage < static_cast(buffer->size()) + + static_cast(key.string().size())) { + // This indicates data corruption in the database. + // TODO(crbug.com/422065015): If this error is observed in UMA, + // implement recovery logic. + corruption_detected = true; + return Error::kInvalidData; + } + } else { + return Error::kNotFound; + } + } + return UpdateStoreStatusAndCommitTransaction( + transaction, + /*entry_count_delta=*/0, + /*total_size_delta=*/header_size_delta, corruption_detected); +} + +ErrorAndStoreStatus SqlPersistentStore::Backend::WriteEntryData( + const CacheEntryKey& key, + ResId res_id, + int64_t old_body_end, + int64_t offset, + scoped_refptr buffer, + int buf_len, + bool truncate, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.WriteEntryData", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("key", key.string()); + dict.Add("res_id", res_id.value()); + dict.Add("old_body_end", old_body_end); + dict.Add("offset", offset); + dict.Add("buf_len", buf_len); + dict.Add("truncate", truncate); + PopulateTraceDetails(store_status_, dict); + }); + base::ElapsedTimer timer; + bool corruption_detected = false; + auto result = WriteEntryDataInternal(key, res_id, old_body_end, offset, + std::move(buffer), buf_len, truncate, + corruption_detected); + RecordTimeAndErrorResultHistogram("WriteEntryData", posting_delay, + timer.Elapsed(), result, + corruption_detected); + TRACE_EVENT_END1("disk_cache", "SqlBackend.WriteEntryData", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + }); + MaybeCrashIfCorrupted(corruption_detected); + return ErrorAndStoreStatus(result, store_status_); +} + +Error SqlPersistentStore::Backend::WriteEntryDataInternal( + const CacheEntryKey& key, + ResId res_id, + int64_t old_body_end, + int64_t offset, + scoped_refptr buffer, + int buf_len, + bool truncate, + bool& corruption_detected) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return db_error; + } + sql::Transaction transaction(&db_); + if (!transaction.Begin()) { + return Error::kFailedToStartTransaction; + } + + int64_t write_end; + if (old_body_end < 0 || offset < 0 || buf_len < 0 || + (!buffer && buf_len > 0) || (buffer && buf_len > buffer->size()) || + !base::CheckAdd(offset, buf_len).AssignIfValid(&write_end)) { + return Error::kInvalidArgument; + } + + const int64_t new_body_end = + truncate ? write_end : std::max(write_end, old_body_end); + // An overflow is not expected here, as both `new_body_end` and `old_body_end` + // are non-negative int64_t value. + const int64_t body_end_delta = new_body_end - old_body_end; + + base::CheckedNumeric checked_total_size_delta = 0; + + // If the write starts before the current end of the body, it might overlap + // with existing data. + if (offset < old_body_end) { + if (Error result = + TrimOverlappingBlobs(key, res_id, offset, write_end, truncate, + checked_total_size_delta, corruption_detected); + result != Error::kOk) { + return result; + } + } + + // If the new body size is smaller, existing blobs beyond the new end must be + // truncated. + if (body_end_delta < 0) { + CHECK(truncate); + if (Error result = + TruncateBlobsAfter(res_id, new_body_end, checked_total_size_delta); + result != Error::kOk) { + return result; + } + } + + // Insert the new data blob if there is data to write. + if (buf_len) { + if (Error result = InsertNewBlob(key, res_id, offset, buffer, buf_len, + checked_total_size_delta); + result != Error::kOk) { + return result; + } + } + + if (!checked_total_size_delta.IsValid()) { + // If the total size delta calculation resulted in an overflow, it suggests + // that the size values in the database were corrupt. + corruption_detected = true; + return Error::kInvalidData; + } + int64_t total_size_delta = checked_total_size_delta.ValueOrDie(); + + // Update the entry's metadata in the `resources` table if the body size + // changed or if the total size of blobs changed. + if (body_end_delta || total_size_delta) { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, GetQuery(Query::kWriteEntryData_UpdateResource))); + statement.BindInt64(0, body_end_delta); + statement.BindInt64(1, total_size_delta); + statement.BindInt64(2, res_id.value()); + if (statement.Step()) { + // Consistency check: The `RETURNING` clause gives us the `body_end` value + // after the update. If this doesn't match our calculated `new_body_end`, + // it means the `body_end` in the database was not the `old_body_end` we + // expected. This indicates data corruption, so we return an error. + const int64_t returned_new_body_end = statement.ColumnInt64(0); + if (returned_new_body_end != new_body_end) { + corruption_detected = true; + return Error::kBodyEndMismatch; + } + // If the entry is doomed, its size is no longer tracked in the cache's + // total size, so we don't update the store status. + const bool doomed = statement.ColumnBool(1); + if (doomed) { + total_size_delta = 0; + } + } else { + // If no rows were updated, it means the entry was not found. + return Error::kNotFound; + } + } + + // Commit the transaction, which also updates the in-memory and on-disk store + // status. + return UpdateStoreStatusAndCommitTransaction( + transaction, + /*entry_count_delta=*/0, + /*total_size_delta=*/total_size_delta, corruption_detected); +} + +// This function handles writes that overlap with existing data blobs. It finds +// any blobs that intersect with the new write range `[offset, end)`, removes +// them, and recreates any non-overlapping portions as new, smaller blobs. This +// effectively "cuts out" the space for the new data. +Error SqlPersistentStore::Backend::TrimOverlappingBlobs( + const CacheEntryKey& key, + ResId res_id, + int64_t offset, + int64_t end, + bool truncate, + base::CheckedNumeric& checked_total_size_delta, + bool& corruption_detected) { + TRACE_EVENT1("disk_cache", "SqlBackend.TrimOverlappingBlobs", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("res_id", res_id.value()); + dict.Add("offset", offset); + dict.Add("end", end); + }); + + // First, delete all blobs that are fully contained within the new write + // range. + // If the write has zero length, no blobs can be fully contained within it, so + // this can be skipped. + if (offset != end) { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, GetQuery(Query::kTrimOverlappingBlobs_DeleteContained))); + statement.BindInt64(0, res_id.value()); + statement.BindInt64(1, offset); + statement.BindInt64(2, end); + while (statement.Step()) { + const int64_t blob_start = statement.ColumnInt64(0); + const int64_t blob_end = statement.ColumnInt64(1); + checked_total_size_delta -= blob_end - blob_start; + } + } + + // Now, handle blobs that partially overlap with the write range. There should + // be at most two such blobs. + // The SQL condition `blob_start < end AND blob_end > offset` checks for + // overlap. Example of [offset, end) vs [blob_start, blob_end): + // [0, 2) vs [2, 6): Not hit. + // [0, 3) vs [2, 6): Hit. + // [5, 9) vs [2, 6): Hit. + // [6, 9) vs [2, 6): Not hit. + std::vector blob_ids_to_be_removed; + std::vector new_blobs; + // A zero-length, non-truncating write is a no-op. For all other writes, we + // must handle partially overlapping blobs. + if (!(offset == end && !truncate)) { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, + GetQuery(Query::kTrimOverlappingBlobs_SelectOverlapping))); + statement.BindInt64(0, res_id.value()); + statement.BindInt64(1, end); + statement.BindInt64(2, offset); + while (statement.Step()) { + const int64_t blob_id = statement.ColumnInt64(0); + const int64_t blob_start = statement.ColumnInt64(1); + const int64_t blob_end = statement.ColumnInt64(2); + const int32_t check_sum = statement.ColumnInt(3); + base::span blob = statement.ColumnBlob(4); + // Consistency check: The blob's size should match its start and end + // offsets. + if (!IsBlobSizeValid(blob_start, blob_end, blob)) { + corruption_detected = true; + return Error::kInvalidData; + } + if (CalculateCheckSum(blob, key.hash()) != check_sum) { + corruption_detected = true; + return Error::kCheckSumError; + } + // Mark the overlapping blob for removal. + blob_ids_to_be_removed.push_back(blob_id); + // If the existing blob starts before the new write, create a new blob + // for the leading part that doesn't overlap. + if (blob_start < offset) { + new_blobs.emplace_back( + base::MakeRefCounted( + blob.first(base::checked_cast(offset - blob_start))), + blob_start); + } + // If the existing blob ends after the new write and we are not + // truncating, create a new blob for the trailing part that doesn't + // overlap. + if (!truncate && end < blob_end) { + new_blobs.emplace_back( + base::MakeRefCounted( + blob.last(base::checked_cast(blob_end - end))), + end); + } + } + } + + // Delete the old blobs. + if (Error error = + DeleteBlobsById(blob_ids_to_be_removed, checked_total_size_delta, + corruption_detected); + error != Error::kOk) { + return error; + } + + // Insert the new, smaller blobs that were preserved from the non-overlapping + // parts. + if (Error error = + InsertNewBlobs(key, res_id, new_blobs, checked_total_size_delta); + error != Error::kOk) { + return error; + } + return Error::kOk; +} + +Error SqlPersistentStore::Backend::TruncateBlobsAfter( + ResId res_id, + int64_t truncate_offset, + base::CheckedNumeric& checked_total_size_delta) { + TRACE_EVENT1("disk_cache", "SqlBackend.TruncateBlobsAfter", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("res_id", res_id.value()); + dict.Add("truncate_offset", truncate_offset); + }); + // Delete all blobs that start at or after the truncation offset. + { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, GetQuery(Query::kTruncateBlobsAfter_DeleteAfter))); + statement.BindInt64(0, res_id.value()); + statement.BindInt64(1, truncate_offset); + while (statement.Step()) { + const int64_t blob_start = statement.ColumnInt64(0); + const int64_t blob_end = statement.ColumnInt64(1); + checked_total_size_delta -= blob_end - blob_start; + } + if (!statement.Succeeded()) { + return Error::kFailedToExecute; + } + } + return Error::kOk; +} + +// Inserts a vector of new blobs into the database. +Error SqlPersistentStore::Backend::InsertNewBlobs( + const CacheEntryKey& key, + ResId res_id, + const std::vector& new_blobs, + base::CheckedNumeric& checked_total_size_delta) { + // Iterate through the provided blobs and insert each one. + for (const auto& new_blob : new_blobs) { + if (Error error = + InsertNewBlob(key, res_id, new_blob.start, new_blob.buffer, + new_blob.buffer->size(), checked_total_size_delta); + error != Error::kOk) { + return error; + } + } + return Error::kOk; +} + +// Inserts a single new blob into the database. +Error SqlPersistentStore::Backend::InsertNewBlob( + const CacheEntryKey& key, + ResId res_id, + int64_t start, + const scoped_refptr& buffer, + int buf_len, + base::CheckedNumeric& checked_total_size_delta) { + TRACE_EVENT1("disk_cache", "SqlBackend.InsertNewBlob", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("res_id", res_id.value()); + dict.Add("start", start); + dict.Add("buf_len", buf_len); + }); + const int64_t end = + (base::CheckedNumeric(start) + buf_len).ValueOrDie(); + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, GetQuery(Query::kInsertNewBlob_InsertIntoBlobs))); + statement.BindInt64(0, res_id.value()); + statement.BindInt64(1, start); + statement.BindInt64(2, end); + const auto new_blob = + buffer->span().first(base::checked_cast(buf_len)); + statement.BindInt(3, CalculateCheckSum(new_blob, key.hash())); + statement.BindBlob(4, new_blob); + if (!statement.Run()) { + return Error::kFailedToExecute; + } + checked_total_size_delta += buf_len; + return Error::kOk; +} + +// A helper function to delete multiple blobs by their IDs. +Error SqlPersistentStore::Backend::DeleteBlobsById( + const std::vector& blob_ids_to_be_removed, + base::CheckedNumeric& checked_total_size_delta, + bool& corruption_detected) { + // Iterate through the provided blob IDs and delete each one. + for (auto blob_id : blob_ids_to_be_removed) { + if (Error error = DeleteBlobById(blob_id, checked_total_size_delta, + corruption_detected); + error != Error::kOk) { + return error; + } + } + return Error::kOk; +} + +// Deletes a single blob from the `blobs` table given its ID. It uses the +// `RETURNING` clause to get the size of the deleted blob to update the total. +Error SqlPersistentStore::Backend::DeleteBlobById( + int64_t blob_id, + base::CheckedNumeric& checked_total_size_delta, + bool& corruption_detected) { + TRACE_EVENT1("disk_cache", "SqlBackend.DeleteBlobById", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("blob_id", blob_id); + }); + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, GetQuery(Query::kDeleteBlobById_DeleteFromBlobs))); + statement.BindInt64(0, blob_id); + if (!statement.Step()) { + // `Step()` returned false, which means either the query completed with no + // hit, or an error occurred. + if (db_.GetErrorCode() == static_cast(sql::SqliteResultCode::kDone)) { + return Error::kNotFound; + } + // An unexpected database error occurred. + return Error::kFailedToExecute; + } + const int64_t start = statement.ColumnInt64(0); + const int64_t end = statement.ColumnInt64(1); + if (end <= start) { + corruption_detected = true; + return Error::kInvalidData; + } + // Subtract the size of the deleted blob from the total size delta. + checked_total_size_delta -= end - start; + return Error::kOk; +} + +// Deletes all blobs associated with a specific entry res_id. +Error SqlPersistentStore::Backend::DeleteBlobsByResId(ResId res_id) { + TRACE_EVENT1("disk_cache", "SqlBackend.DeleteBlobsByResId", "res_id", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("res_id", res_id.value()); + }); + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, GetQuery(Query::kDeleteBlobsByResId_DeleteFromBlobs))); + statement.BindInt64(0, res_id.value()); + if (!statement.Run()) { + return Error::kFailedToExecute; + } + return Error::kOk; +} + +Error SqlPersistentStore::Backend::DeleteBlobsByResIds( + const std::vector& res_ids) { + TRACE_EVENT0("disk_cache", "SqlBackend.DeleteBlobsByResIds"); + for (const auto& res_id : res_ids) { + if (auto error = DeleteBlobsByResId(res_id); error != Error::kOk) { + return error; + } + } + return Error::kOk; +} + +Error SqlPersistentStore::Backend::DeleteResourceByResId(ResId res_id) { + TRACE_EVENT0("disk_cache", "SqlBackend.DeleteResourceByResId"); + sql::Statement delete_resource_stmt(db_.GetCachedStatement( + SQL_FROM_HERE, + GetQuery(Query::kDeleteResourceByResIds_DeleteFromResources))); + delete_resource_stmt.BindInt64(0, res_id.value()); + if (!delete_resource_stmt.Run()) { + return Error::kFailedToExecute; + } + return Error::kOk; +} + +Error SqlPersistentStore::Backend::DeleteResourcesByResIds( + const std::vector& res_ids) { + TRACE_EVENT0("disk_cache", "SqlBackend.DeleteResourcesByResIds"); + for (const auto& res_id : res_ids) { + if (auto error = DeleteResourceByResId(res_id); error != Error::kOk) { + return error; + } + } + return Error::kOk; +} + +IntOrError SqlPersistentStore::Backend::ReadEntryData( + const CacheEntryKey& key, + ResId res_id, + int64_t offset, + scoped_refptr buffer, + int buf_len, + int64_t body_end, + bool sparse_reading, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.ReadEntryData", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("res_id", res_id.value()); + dict.Add("offset", offset); + dict.Add("buf_len", buf_len); + dict.Add("body_end", body_end); + dict.Add("sparse_reading", sparse_reading); + PopulateTraceDetails(store_status_, dict); + }); + base::ElapsedTimer timer; + bool corruption_detected = false; + auto result = + ReadEntryDataInternal(key, res_id, offset, std::move(buffer), buf_len, + body_end, sparse_reading, corruption_detected); + RecordTimeAndErrorResultHistogram( + "ReadEntryData", posting_delay, timer.Elapsed(), + result.error_or(Error::kOk), corruption_detected); + TRACE_EVENT_END1("disk_cache", "SqlBackend.ReadEntryData", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + }); + MaybeCrashIfCorrupted(corruption_detected); + return result; +} + +IntOrError SqlPersistentStore::Backend::ReadEntryDataInternal( + const CacheEntryKey& key, + ResId res_id, + int64_t offset, + scoped_refptr buffer, + int buf_len, + int64_t body_end, + bool sparse_reading, + bool& corruption_detected) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return base::unexpected(db_error); + } + + if (offset < 0 || buf_len < 0 || !buffer || buf_len > buffer->size()) { + return base::unexpected(Error::kInvalidArgument); + } + + // Truncate `buffer_len` to make sure that `offset + buffer_len` does not + // overflow. + int64_t buffer_len = std::min(static_cast(buf_len), + std::numeric_limits::max() - offset); + const int64_t read_end = + (base::CheckedNumeric(offset) + buffer_len).ValueOrDie(); + // Select all blobs that overlap with the read range [offset, read_end), + // ordered by their start offset. + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, GetQuery(Query::kReadEntryData_SelectOverlapping))); + statement.BindInt64(0, res_id.value()); + statement.BindInt64(1, read_end); + statement.BindInt64(2, offset); + + size_t written_bytes = 0; + while (statement.Step()) { + const int64_t blob_start = statement.ColumnInt64(0); + const int64_t blob_end = statement.ColumnInt64(1); + int32_t check_sum = statement.ColumnInt(2); + base::span blob = statement.ColumnBlob(3); + if (!IsBlobSizeValid(blob_start, blob_end, blob)) { + corruption_detected = true; + return base::unexpected(Error::kInvalidData); + } + if (CalculateCheckSum(blob, key.hash()) != check_sum) { + corruption_detected = true; + return base::unexpected(Error::kCheckSumError); + } + // Determine the part of the blob that falls within the read request. + const int64_t copy_start = std::max(offset, blob_start); + const int64_t copy_end = std::min(read_end, blob_end); + const size_t copy_size = base::checked_cast(copy_end - copy_start); + const size_t pos_in_buffer = + base::checked_cast(copy_start - offset); + // If there's a gap between the last written byte and the start of the + // current blob, handle it based on `sparse_reading`. + if (written_bytes < pos_in_buffer) { + if (sparse_reading) { + // In sparse reading mode, we stop at the first gap. + // This might be before any data got read. + return written_bytes; + } + // In normal mode, fill the gap with zeros. + std::ranges::fill( + buffer->span().subspan(written_bytes, pos_in_buffer - written_bytes), + 0); + } + // Copy the relevant part of the blob into the output buffer. + buffer->span() + .subspan(pos_in_buffer, copy_size) + .copy_from_nonoverlapping(blob.subspan( + base::checked_cast(copy_start - blob_start), copy_size)); + written_bytes = copy_end - offset; + } + + if (sparse_reading) { + return written_bytes; + } + + // After processing all blobs, check if we need to zero-fill the rest of the + // buffer up to the logical end of the entry's body. + const size_t last_pos_in_buffer = + std::min(body_end - offset, static_cast(buffer_len)); + if (written_bytes < last_pos_in_buffer) { + std::ranges::fill(buffer->span().subspan( + written_bytes, last_pos_in_buffer - written_bytes), + 0); + written_bytes = last_pos_in_buffer; + } + + return written_bytes; +} + +RangeResult SqlPersistentStore::Backend::GetEntryAvailableRange( + ResId res_id, + int64_t offset, + int len, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.GetEntryAvailableRange", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("res_id", res_id.value()); + dict.Add("offset", offset); + dict.Add("len", len); + }); + base::ElapsedTimer timer; + auto result = GetEntryAvailableRangeInternal(res_id, offset, len); + RecordTimeAndErrorResultHistogram("GetEntryAvailableRange", posting_delay, + timer.Elapsed(), + result.error_or(Error::kOk), + /*corruption_detected=*/false); + TRACE_EVENT_END1("disk_cache", "SqlBackend.GetEntryAvailableRange", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + }); + return result.value_or(RangeResult(net::Error::ERR_FAILED)); +} + +SqlPersistentStore::Backend::RangeResultOrError +SqlPersistentStore::Backend::GetEntryAvailableRangeInternal(ResId res_id, + int64_t offset, + int len) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return base::unexpected(db_error); + } + // Truncate `len` to make sure that `offset + len` does not overflow. + len = std::min(static_cast(len), + std::numeric_limits::max() - offset); + const int64_t end = offset + len; + std::optional available_start; + int64_t available_end = 0; + + // To finds the available contiguous range of data for a given entry. queries + // the `blobs` table for data chunks that overlap with the requested range + // [offset, end). + { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, + GetQuery(Query::kGetEntryAvailableRange_SelectOverlapping))); + statement.BindInt64(0, res_id.value()); + statement.BindInt64(1, end); + statement.BindInt64(2, offset); + while (statement.Step()) { + int64_t blob_start = statement.ColumnInt64(0); + int64_t blob_end = statement.ColumnInt64(1); + if (!available_start) { + // This is the first blob we've found in the requested range. Start + // tracking the contiguous available range from here. + available_start = std::max(blob_start, offset); + available_end = std::min(blob_end, end); + } else { + // We have already found a blob, check if this one is contiguous. + if (available_end == blob_start) { + // The next blob is contiguous with the previous one. Extend the + // available range. + available_end = std::min(blob_end, end); + } else { + // There's a gap in the data. Return the contiguous range found so + // far. + return RangeResult(*available_start, + available_end - *available_start); + } + } + } + } + // If we found any data, return the total contiguous range. + if (available_start) { + return RangeResult(*available_start, available_end - *available_start); + } + return RangeResult(offset, 0); +} + +Int64OrError SqlPersistentStore::Backend::CalculateSizeOfEntriesBetween( + base::Time initial_time, + base::Time end_time, + base::TimeTicks start_time) { + if (initial_time == base::Time::Min() && end_time == base::Time::Max()) { + return store_status_.GetEstimatedDiskUsage(); + } + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.CalculateSizeOfEntriesBetween", + "data", [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("initial_time", initial_time); + dict.Add("end_time", end_time); + }); + base::ElapsedTimer timer; + auto result = CalculateSizeOfEntriesBetweenInternal(initial_time, end_time); + RecordTimeAndErrorResultHistogram("CalculateSizeOfEntriesBetween", + posting_delay, timer.Elapsed(), + result.error_or(Error::kOk), + /*corruption_detected=*/false); + TRACE_EVENT_END1("disk_cache", "SqlBackend.CalculateSizeOfEntriesBetween", + "result", [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + }); + return result; +} + +Int64OrError SqlPersistentStore::Backend::CalculateSizeOfEntriesBetweenInternal( + base::Time initial_time, + base::Time end_time) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return base::unexpected(db_error); + } + // To calculate the total size of all entries whose `last_used` time falls + // within the range [`initial_time`, `end_time`), sums up the `bytes_usage` + // from the `resources` table and adds a static overhead for each entry. + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, + GetQuery(Query::kCalculateSizeOfEntriesBetween_SelectLiveResources))); + statement.BindTime(0, initial_time); + statement.BindTime(1, end_time); + base::ClampedNumeric total_size = 0; + while (statement.Step()) { + // `bytes_usage` includes the size of the key, header, and body data. + total_size += statement.ColumnInt64(0); + // Add the static overhead for the entry's row in the database. + total_size += kSqlBackendStaticResourceSize; + } + return Int64OrError(total_size); +} + +OptionalEntryInfoWithKeyAndIterator SqlPersistentStore::Backend::OpenNextEntry( + const EntryIterator& iterator, + base::TimeTicks start_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - start_time; + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.OpenNextEntry", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("res_id_iterator", iterator.value().res_id); + }); + base::ElapsedTimer timer; + bool corruption_detected = false; + auto result = OpenNextEntryInternal(iterator, corruption_detected); + RecordTimeAndErrorResultHistogram( + "OpenNextEntry", posting_delay, timer.Elapsed(), + result.error_or(Error::kOk), corruption_detected); + TRACE_EVENT_END1("disk_cache", "SqlBackend.OpenNextEntry", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + }); + MaybeCrashIfCorrupted(corruption_detected); + if (!result.has_value()) { + return std::nullopt; + } + return std::move(*result); +} + +SqlPersistentStore::Backend::OptionalEntryInfoWithKeyAndIteratorOrError +SqlPersistentStore::Backend::OpenNextEntryInternal( + const EntryIterator& iterator, + bool& corruption_detected) { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return base::unexpected(db_error); + } + + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, GetQuery(Query::kOpenNextEntry_SelectLiveResources))); + statement.BindInt64(0, iterator.value().res_id.value()); + while (statement.Step()) { + const ResId res_id = ResId(statement.ColumnInt64(0)); + EntryInfoWithKeyAndIterator result; + result.iterator.value().res_id = res_id; + result.iterator.value().shard_id = shard_id_; + auto& entry_info = result.info; + entry_info.res_id = res_id; + entry_info.last_used = statement.ColumnTime(1); + entry_info.body_end = statement.ColumnInt64(2); + int32_t check_sum = statement.ColumnInt(3); + result.key = CacheEntryKey(statement.ColumnString(4)); + base::span blob_span = statement.ColumnBlob(5); + if (CalculateCheckSum(blob_span, result.key.hash()) != check_sum || + blob_span.size() > std::numeric_limits::max()) { + // If OpenNextEntry encounters invalid data, it records it in a histogram + // and ignores the data. + corruption_detected = true; + continue; + } + entry_info.head = base::MakeRefCounted(); + entry_info.head->SetCapacity(blob_span.size()); + entry_info.head->span().copy_from_nonoverlapping(blob_span); + entry_info.opened = true; + return result; + } + return std::nullopt; +} + +void SqlPersistentStore::Backend::StartEviction( + int64_t size_to_be_removed, + base::flat_set excluded_res_ids, + bool is_idle_time_eviction, + scoped_refptr aggregator, + ResIdListOrErrorAndStoreStatusCallback callback) { + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.StartEviction", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("size_to_be_removed", size_to_be_removed); + dict.Add("is_idle_time_eviction", is_idle_time_eviction); + }); + auto candidates = SelectEvictionCandidates( + size_to_be_removed, std::move(excluded_res_ids), is_idle_time_eviction); + TRACE_EVENT_END1("disk_cache", "SqlBackend.StartEviction", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("candidates_size", candidates.size()); + }); + aggregator->OnCandidate( + shard_id_, std::move(candidates), + base::BindOnce(&Backend::EvictEntries, weak_factory_.GetWeakPtr(), + std::move(callback), is_idle_time_eviction)); +} + +SqlPersistentStore::Backend::EvictionCandidateList +SqlPersistentStore::Backend::SelectEvictionCandidates( + int64_t size_to_be_removed, + base::flat_set excluded_res_ids, + bool is_idle_time_eviction) { + if (is_idle_time_eviction && !IsBrowserIdle()) { + return {}; + } + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return {}; + } + + base::ElapsedTimer timer; + // Create a list of eviction candidates in this shard until the + // `candidates_total_size` exceeds the `size_to_be_removed`. + // The EvictionCandidateAggregator merges and sorts eviction candidates from + // each shard. It then selects candidates until their total size exceeds + // 'size_to_be_removed', and passes the final list to EvictEntries(). + EvictionCandidateList candidates; + base::ClampedNumeric candidates_total_size = 0; + { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, GetQuery(Query::kStartEviction_SelectLiveResources))); + while (size_to_be_removed > candidates_total_size && statement.Step()) { + if (is_idle_time_eviction && !IsBrowserIdle()) { + return {}; + } + const ResId res_id = ResId(statement.ColumnInt64(0)); + const int64_t bytes_usage = statement.ColumnInt64(1); + const base::Time last_used = statement.ColumnTime(2); + if (excluded_res_ids.contains(res_id)) { + continue; + } + candidates_total_size += bytes_usage; + candidates_total_size += kSqlBackendStaticResourceSize; + candidates.emplace_back(res_id, shard_id_, bytes_usage, last_used); + } + } + base::UmaHistogramMicrosecondsTimes( + base::StrCat( + {kSqlDiskCacheBackendHistogramPrefix, + !is_idle_time_eviction ? "RunEviction" : "RunEvictionOnIdleTime", + ".TimeToSelectEntries"}), + timer.Elapsed()); + return candidates; +} + +void SqlPersistentStore::Backend::EvictEntries( + ResIdListOrErrorAndStoreStatusCallback callback, + bool is_idle_time_eviction, + ResIdList res_ids, + int64_t bytes_usage, + base::TimeTicks post_task_time) { + const base::TimeDelta posting_delay = base::TimeTicks::Now() - post_task_time; + // Checks that this method is called on the expected sequence when invoked via + // EvictionCandidateAggregator. + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + TRACE_EVENT_BEGIN1("disk_cache", "SqlBackend.EvictEntries", "data", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + dict.Add("res_ids_size", res_ids.size()); + }); + base::ElapsedTimer timer; + bool corruption_detected = false; + auto result = EvictEntriesInternal( + res_ids, bytes_usage, is_idle_time_eviction, corruption_detected); + RecordTimeAndErrorResultHistogram( + !is_idle_time_eviction ? "EvictEntries" : "EvictEntriesOnIdleTime", + posting_delay, timer.Elapsed(), result, corruption_detected); + TRACE_EVENT_END1("disk_cache", "SqlBackend.EvictEntries", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + }); + std::move(callback).Run(ResIdListOrErrorAndStoreStatus( + result == Error::kOk ? ResIdListOrError(std::move(res_ids)) + : base::unexpected(result), + store_status_)); +} + +Error SqlPersistentStore::Backend::EvictEntriesInternal( + const ResIdList& res_ids, + int64_t bytes_usage, + bool is_idle_time_eviction, + bool& corruption_detected) { + if (is_idle_time_eviction && !IsBrowserIdle()) { + return Error::kAbortedDueToBrowserActivity; + } + sql::Transaction transaction(&db_); + if (!transaction.Begin()) { + return Error::kFailedToExecute; + } + + for (const auto& res_id : res_ids) { + if (is_idle_time_eviction && !IsBrowserIdle()) { + return Error::kAbortedDueToBrowserActivity; + } + if (auto error = DeleteBlobsByResId(res_id); error != Error::kOk) { + return error; + } + if (auto error = DeleteResourceByResId(res_id); error != Error::kOk) { + return error; + } + } + return UpdateStoreStatusAndCommitTransaction( + transaction, -res_ids.size(), -bytes_usage, corruption_detected); +} + +Error SqlPersistentStore::Backend::UpdateStoreStatusAndCommitTransaction( + sql::Transaction& transaction, + int64_t entry_count_delta, + int64_t total_size_delta, + bool& corruption_detected) { + const auto old_entry_count = store_status_.entry_count; + const auto old_total_size = store_status_.total_size; + if (entry_count_delta != 0) { + // If the addition overflows or results in a negative count, it implies + // corrupted metadata. In this case, log an error and recalculate the count + // directly from the database to recover. + if (!base::CheckAdd(store_status_.entry_count, entry_count_delta) + .AssignIfValid(&store_status_.entry_count) || + store_status_.entry_count < 0) { + corruption_detected = true; + store_status_.entry_count = CalculateResourceEntryCount(); + } + meta_table_.SetValue(kSqlBackendMetaTableKeyEntryCount, + store_status_.entry_count); + } + + if (total_size_delta != 0) { + // If the addition overflows or results in a negative size, it implies + // corrupted metadata. In this case, log an error and recalculate the size + // directly from the database to recover. + if (!base::CheckAdd(store_status_.total_size, total_size_delta) + .AssignIfValid(&store_status_.total_size) || + store_status_.total_size < 0) { + corruption_detected = true; + store_status_.total_size = CalculateTotalSize(); + } + meta_table_.SetValue(kSqlBackendMetaTableKeyTotalSize, + store_status_.total_size); + } + + // Intentionally DCHECK for performance. + // In debug builds, verify consistency by recalculating. + DCHECK_EQ(store_status_.entry_count, CalculateResourceEntryCount()); + DCHECK_EQ(store_status_.total_size, CalculateTotalSize()); + + // Attempt to commit the transaction. If it fails, revert the in-memory + // store status to its state before the updates. + // This ensures that the in-memory status always reflects the on-disk state. + if (!transaction.Commit()) { + store_status_.entry_count = old_entry_count; + store_status_.total_size = old_total_size; + return Error::kFailedToCommitTransaction; + } + return Error::kOk; +} + +Error SqlPersistentStore::Backend::RecalculateStoreStatusAndCommitTransaction( + sql::Transaction& transaction) { + store_status_.entry_count = CalculateResourceEntryCount(); + store_status_.total_size = CalculateTotalSize(); + meta_table_.SetValue(kSqlBackendMetaTableKeyEntryCount, + store_status_.entry_count); + meta_table_.SetValue(kSqlBackendMetaTableKeyTotalSize, + store_status_.total_size); + return transaction.Commit() ? Error::kOk : Error::kFailedToCommitTransaction; +} + +// Recalculates the number of non-doomed entries in the `resources` table. +int64_t SqlPersistentStore::Backend::CalculateResourceEntryCount() { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, + GetQuery( + Query::kCalculateResourceEntryCount_SelectCountFromLiveResources))); + int64_t result = 0; + if (statement.Step()) { + result = statement.ColumnInt64(0); + } + return result; +} + +// Recalculates the total size of all non-doomed entries. +int64_t SqlPersistentStore::Backend::CalculateTotalSize() { + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, + GetQuery(Query::kCalculateTotalSize_SelectTotalSizeFromLiveResources))); + int64_t result = 0; + if (statement.Step()) { + result = statement.ColumnInt64(0); + } + return result; +} + +SqlPersistentStore::Backend::InMemoryIndexAndDoomedResIdsOrError +SqlPersistentStore::Backend::LoadInMemoryIndex() { + TRACE_EVENT_BEGIN("disk_cache", "SqlBackend.LoadInMemoryIndex"); + auto result = LoadInMemoryIndexInternal(); + TRACE_EVENT_END1("disk_cache", "SqlBackend.LoadInMemoryIndex", "result", + [&](perfetto::TracedValue trace_context) { + auto dict = std::move(trace_context).WriteDictionary(); + PopulateTraceDetails(result, store_status_, dict); + }); + return result; +} + +SqlPersistentStore::Backend::InMemoryIndexAndDoomedResIdsOrError +SqlPersistentStore::Backend::LoadInMemoryIndexInternal() { + if (auto db_error = CheckDatabaseStatus(); db_error != Error::kOk) { + return base::unexpected(db_error); + } + SqlPersistentStoreInMemoryIndex index; + ResIdList doomed_entry_res_ids; + base::ElapsedTimer timer; + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, + GetQuery(Query::kGetCacheKeyHashes_SelectCacheKeyHashFromLiveResources))); + while (statement.Step()) { + const auto res_id = ResId(statement.ColumnInt64(0)); + const auto key_hash = CacheEntryKey::Hash(statement.ColumnInt(1)); + const bool doomed = statement.ColumnBool(2); + if (doomed) { + doomed_entry_res_ids.emplace_back(res_id); + } else { + index.Insert(key_hash, res_id); + } + } + base::UmaHistogramMicrosecondsTimes( + base::StrCat( + {kSqlDiskCacheBackendHistogramPrefix, "LoadInMemoryIndexTime"}), + timer.Elapsed()); + return InMemoryIndexAndDoomedResIds(std::move(index), + std::move(doomed_entry_res_ids)); +} + +bool SqlPersistentStore::Backend::MaybeRunCheckpoint() { + TRACE_EVENT("disk_cache", "SqlBackend.MaybeRunCheckpoint"); + if (!db_.is_open()) { + // The database might have been closed if a catastrophic error occurred and + // RazeAndPoison() was called. + return false; + } + if (!IsBrowserIdle()) { + // Between the time when idle was detected in the browser process and the + // time when this backend was notified, the browser became non-idle. + return false; + } + if (wal_pages_ < net::features::kSqlDiskCacheIdleCheckpointThreshold.Get()) { + return false; + } + TRACE_EVENT("disk_cache", "SqlBackend.CheckpointDatabase", "pages", + wal_pages_); + base::ElapsedTimer timer; + bool checkpoint_result = db_.CheckpointDatabase(); + base::UmaHistogramMicrosecondsTimes( + base::StrCat({kSqlDiskCacheBackendHistogramPrefix, "IdleEventCheckpoint.", + checkpoint_result ? "Success" : "Failure", "Time"}), + timer.Elapsed()); + base::UmaHistogramCounts100000( + base::StrCat({kSqlDiskCacheBackendHistogramPrefix, "IdleEventCheckpoint.", + checkpoint_result ? "Success" : "Failure", "Pages"}), + wal_pages_); + wal_pages_ = 0; + return checkpoint_result; +} + +void SqlPersistentStore::Backend::MaybeCrashIfCorrupted( + bool corruption_detected) { + CHECK(!(corruption_detected && strict_corruption_check_enabled_)); +} + +void SqlPersistentStore::Backend::OnCommitCallback(int pages) { + TRACE_EVENT("disk_cache", "SqlBackend.OnCommitCallback"); + const bool is_idle = IsBrowserIdle(); + if (pages >= net::features::kSqlDiskCacheForceCheckpointThreshold.Get() || + (pages >= net::features::kSqlDiskCacheIdleCheckpointThreshold.Get() && + is_idle)) { + TRACE_EVENT("disk_cache", "SqlBackend.CheckpointDatabase", "pages", pages); + base::ElapsedTimer timer; + bool checkpoint_result = db_.CheckpointDatabase(); + base::UmaHistogramMicrosecondsTimes( + base::StrCat({kSqlDiskCacheBackendHistogramPrefix, + is_idle ? "Idle" : "Force", "Checkpoint.", + checkpoint_result ? "Success" : "Failure", "Time"}), + timer.Elapsed()); + base::UmaHistogramCounts100000( + base::StrCat({kSqlDiskCacheBackendHistogramPrefix, + is_idle ? "Idle" : "Force", "Checkpoint.", + checkpoint_result ? "Success" : "Failure", "Pages"}), + pages); + wal_pages_ = 0; + return; + } + wal_pages_ = pages; +} + +base::FilePath SqlPersistentStore::Backend::GetDatabaseFilePath() const { + return path_.AppendASCII( + base::StrCat({kSqlBackendDatabaseFileNamePrefix, + base::NumberToString(shard_id_.value())})); +} + +SqlPersistentStore::Backend::InMemoryIndexAndDoomedResIds:: + InMemoryIndexAndDoomedResIds( + SqlPersistentStoreInMemoryIndex&& index, + std::vector doomed_entry_res_ids) + : index(std::move(index)), + doomed_entry_res_ids(std::move(doomed_entry_res_ids)) {} +SqlPersistentStore::Backend::InMemoryIndexAndDoomedResIds:: + ~InMemoryIndexAndDoomedResIds() = default; +SqlPersistentStore::Backend::InMemoryIndexAndDoomedResIds:: + InMemoryIndexAndDoomedResIds(InMemoryIndexAndDoomedResIds&& other) = + default; +SqlPersistentStore::Backend::InMemoryIndexAndDoomedResIds& +SqlPersistentStore::Backend::InMemoryIndexAndDoomedResIds::operator=( + InMemoryIndexAndDoomedResIds&& other) = default; + +SqlPersistentStore::Backend::BufferWithStart::BufferWithStart( + scoped_refptr buffer, + int64_t start) + : buffer(std::move(buffer)), start(start) {} +SqlPersistentStore::Backend::BufferWithStart::~BufferWithStart() = default; +SqlPersistentStore::Backend::BufferWithStart::BufferWithStart( + BufferWithStart&& other) = default; +SqlPersistentStore::Backend::BufferWithStart& +SqlPersistentStore::Backend::BufferWithStart::operator=( + BufferWithStart&& other) = default; + +} // namespace disk_cache diff --git a/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend.h b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend.h new file mode 100644 index 0000000000..f778eb90f1 --- /dev/null +++ b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend.h @@ -0,0 +1,340 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_DISK_CACHE_SQL_SQL_PERSISTENT_STORE_BACKEND_H_ +#define NET_DISK_CACHE_SQL_SQL_PERSISTENT_STORE_BACKEND_H_ + +#include "base/memory/weak_ptr.h" +#include "net/disk_cache/sql/eviction_candidate_aggregator.h" +#include "net/disk_cache/sql/sql_persistent_store.h" +#include "net/disk_cache/sql/sql_persistent_store_in_memory_index.h" +#include "sql/database.h" +#include "sql/meta_table.h" + +namespace sql { +class Statement; +class Transaction; +} // namespace sql + +namespace disk_cache { + +// The `Backend` class encapsulates all direct interaction with the SQLite +// database. It is designed to be owned by a `base::SequenceBound` and run on a +// dedicated background sequence to avoid blocking the network IO thread. +class SqlPersistentStore::Backend { + public: + // A struct to hold the in-memory index and the list of doomed resource IDs. + // This is used to return both from the backend task that loads them. + struct InMemoryIndexAndDoomedResIds { + InMemoryIndexAndDoomedResIds( + SqlPersistentStoreInMemoryIndex&& index, + std::vector doomed_entry_res_ids); + ~InMemoryIndexAndDoomedResIds(); + InMemoryIndexAndDoomedResIds(InMemoryIndexAndDoomedResIds&& other); + InMemoryIndexAndDoomedResIds& operator=( + InMemoryIndexAndDoomedResIds&& other); + + SqlPersistentStoreInMemoryIndex index; + std::vector doomed_entry_res_ids; + }; + using InMemoryIndexAndDoomedResIdsOrError = + base::expected; + + Backend(ShardId shard_id, const base::FilePath& path, net::CacheType type); + Backend(const Backend&) = delete; + Backend& operator=(const Backend&) = delete; + ~Backend(); + + // Initializes the database, including setting up the schema and reading + // metadata. Returns the initialization result on success. + InitResultOrError Initialize(int64_t user_max_bytes, + base::TimeTicks start_time); + + int32_t GetEntryCount() const; + + EntryInfoOrErrorAndStoreStatus OpenOrCreateEntry(const CacheEntryKey& key, + base::TimeTicks start_time); + OptionalEntryInfoOrError OpenEntry(const CacheEntryKey& key, + base::TimeTicks start_time); + EntryInfoOrErrorAndStoreStatus CreateEntry(const CacheEntryKey& key, + base::Time creation_time, + bool run_existance_check, + base::TimeTicks start_time); + + ErrorAndStoreStatus DoomEntry(const CacheEntryKey& key, + ResId res_id, + base::TimeTicks start_time); + ErrorAndStoreStatus DeleteDoomedEntry(const CacheEntryKey& key, + ResId res_id, + base::TimeTicks start_time); + Error DeleteDoomedEntries(ResIdList res_ids_to_delete, + base::TimeTicks start_time); + ResIdListOrErrorAndStoreStatus DeleteLiveEntry(const CacheEntryKey& key, + base::TimeTicks start_time); + + ErrorAndStoreStatus DeleteAllEntries(base::TimeTicks start_time); + ResIdListOrErrorAndStoreStatus DeleteLiveEntriesBetween( + base::Time initial_time, + base::Time end_time, + base::flat_set excluded_res_ids, + base::TimeTicks start_time); + Error UpdateEntryLastUsedByKey(const CacheEntryKey& key, + base::Time last_used, + base::TimeTicks start_time); + Error UpdateEntryLastUsedByResId(ResId res_id, + base::Time last_used, + base::TimeTicks start_time); + ErrorAndStoreStatus UpdateEntryHeaderAndLastUsed( + const CacheEntryKey& key, + ResId res_id, + base::Time last_used, + scoped_refptr buffer, + int64_t header_size_delta, + base::TimeTicks start_time); + ErrorAndStoreStatus WriteEntryData(const CacheEntryKey& key, + ResId res_id, + int64_t old_body_end, + int64_t offset, + scoped_refptr buffer, + int buf_len, + bool truncate, + base::TimeTicks start_time); + IntOrError ReadEntryData(const CacheEntryKey& key, + ResId res_id, + int64_t offset, + scoped_refptr buffer, + int buf_len, + int64_t body_end, + bool sparse_reading, + base::TimeTicks start_time); + RangeResult GetEntryAvailableRange(ResId res_id, + int64_t offset, + int len, + base::TimeTicks start_time); + Int64OrError CalculateSizeOfEntriesBetween(base::Time initial_time, + base::Time end_time, + base::TimeTicks start_time); + OptionalEntryInfoWithKeyAndIterator OpenNextEntry( + const EntryIterator& iterator, + base::TimeTicks start_time); + void StartEviction(int64_t size_to_be_removed, + base::flat_set excluded_res_ids, + bool is_idle_time_eviction, + scoped_refptr aggregator, + ResIdListOrErrorAndStoreStatusCallback callback); + InMemoryIndexAndDoomedResIdsOrError LoadInMemoryIndex(); + bool MaybeRunCheckpoint(); + + void EnableStrictCorruptionCheckForTesting() { + strict_corruption_check_enabled_ = true; + } + + void SetSimulateDbFailureForTesting(bool fail) { + simulate_db_failure_for_testing_ = fail; + } + + void RazeAndPoisonForTesting() { + db_.RazeAndPoison(); + store_status_ = StoreStatus(); + } + + private: + using RangeResultOrError = base::expected; + using OptionalEntryInfoWithKeyAndIteratorOrError = + base::expected; + + using EvictionCandidateList = + EvictionCandidateAggregator::EvictionCandidateList; + + // A helper struct to associate an IOBuffer with a starting offset. + struct BufferWithStart { + BufferWithStart(scoped_refptr buffer, int64_t start); + ~BufferWithStart(); + BufferWithStart(BufferWithStart&& other); + BufferWithStart& operator=(BufferWithStart&& other); + + scoped_refptr buffer; + int64_t start; + }; + + void DatabaseErrorCallback(int error, sql::Statement* statement); + + Error InitializeInternal(bool& corruption_detected, + SqlPersistentStoreInMemoryIndex& index, + ResIdList& doomed_entry_res_ids); + EntryInfoOrError OpenOrCreateEntryInternal(const CacheEntryKey& key, + bool& corruption_detected); + OptionalEntryInfoOrError OpenEntryInternal(const CacheEntryKey& key); + EntryInfoOrError CreateEntryInternal(const CacheEntryKey& key, + base::Time creation_time, + bool run_existance_check, + bool& corruption_detected); + Error DoomEntryInternal(ResId res_id, bool& corruption_detected); + Error DeleteDoomedEntryInternal(ResId res_id); + Error DeleteDoomedEntriesInternal(const ResIdList& res_ids_to_delete, + bool& corruption_detected); + ResIdListOrError DeleteLiveEntryInternal(const CacheEntryKey& key, + bool& corruption_detected); + Error DeleteAllEntriesInternal(bool& corruption_detected); + ResIdListOrError DeleteLiveEntriesBetweenInternal( + base::Time initial_time, + base::Time end_time, + const base::flat_set& excluded_res_ids, + bool& corruption_detected); + Error UpdateEntryLastUsedByKeyInternal(const CacheEntryKey& key, + base::Time last_used); + Error UpdateEntryLastUsedByResIdInternal(ResId res_id, base::Time last_used); + Error UpdateEntryHeaderAndLastUsedInternal( + const CacheEntryKey& key, + ResId res_id, + base::Time last_used, + scoped_refptr buffer, + int64_t header_size_delta, + bool& corruption_detected); + Error WriteEntryDataInternal(const CacheEntryKey& key, + ResId res_id, + int64_t old_body_end, + int64_t offset, + scoped_refptr buffer, + int buf_len, + bool truncate, + bool& corruption_detected); + IntOrError ReadEntryDataInternal(const CacheEntryKey& key, + ResId res_id, + int64_t offset, + scoped_refptr buffer, + int buf_len, + int64_t body_end, + bool sparse_reading, + bool& corruption_detected); + RangeResultOrError GetEntryAvailableRangeInternal(ResId res_id, + int64_t offset, + int len); + Int64OrError CalculateSizeOfEntriesBetweenInternal(base::Time initial_time, + base::Time end_time); + OptionalEntryInfoWithKeyAndIteratorOrError OpenNextEntryInternal( + const EntryIterator& iterator, + bool& corruption_detected); + InMemoryIndexAndDoomedResIdsOrError LoadInMemoryIndexInternal(); + + // Trims blobs that overlap with the new write range [offset, end), and + // updates the total size delta. + Error TrimOverlappingBlobs( + const CacheEntryKey& key, + ResId res_id, + int64_t offset, + int64_t end, + bool truncate, + base::CheckedNumeric& checked_total_size_delta, + bool& corruption_detected); + // Truncates data by deleting all blobs that start at or after the given + // offset. + Error TruncateBlobsAfter( + ResId res_id, + int64_t truncate_offset, + base::CheckedNumeric& checked_total_size_delta); + // Inserts a vector of new blobs into the database, and updates the total size + // delta. + Error InsertNewBlobs(const CacheEntryKey& key, + ResId res_id, + const std::vector& new_blobs, + base::CheckedNumeric& checked_total_size_delta); + // Inserts a single new blob into the database, and updates the total size + // delta. + Error InsertNewBlob(const CacheEntryKey& key, + ResId res_id, + int64_t start, + const scoped_refptr& buffer, + int buf_len, + base::CheckedNumeric& checked_total_size_delta); + // Deletes blobs by their IDs, and updates the total size delta. + Error DeleteBlobsById(const std::vector& blob_ids_to_be_removed, + base::CheckedNumeric& checked_total_size_delta, + bool& corruption_detected); + // Deletes a single blob by its ID, and updates the total size delta. + Error DeleteBlobById(int64_t blob_id, + base::CheckedNumeric& checked_total_size_delta, + bool& corruption_detected); + // Deletes all blobs associated with a given res_id. + Error DeleteBlobsByResId(ResId res_id); + // Deletes all blobs associated with a list of entry res_ids. + Error DeleteBlobsByResIds(const std::vector& res_ids); + // Deletes a single resource entry from the `resources` table by its `res_id`. + Error DeleteResourceByResId(ResId res_id); + // Deletes multiple resource entries from the `resources` table by their + // `res_id`s. + Error DeleteResourcesByResIds(const std::vector& res_ids); + + // Selects a list of eviction candidates from the `resources` table, ordered + // by `last_used` time. + EvictionCandidateList SelectEvictionCandidates( + int64_t size_to_be_removed, + base::flat_set excluded_res_ids, + bool is_idle_time_eviction); + // Called by the `EvictionCandidateAggregator` to evict a list of selected + // entries. + void EvictEntries(ResIdListOrErrorAndStoreStatusCallback callback, + bool is_idle_time_eviction, + ResIdList res_ids, + int64_t bytes_usage, + base::TimeTicks post_task_time); + // The internal implementation of `EvictEntries`. Deletes the entries from the + // database and updates the store status. + Error EvictEntriesInternal(const ResIdList& res_ids, + int64_t bytes_usage, + bool is_idle_time_eviction, + bool& corruption_detected); + + // Updates the in-memory `store_status_` by `entry_count_delta` and + // `total_size_delta`. If the update results in an overflow or a negative + // value, it recalculates the correct value from the database to recover from + // potential metadata corruption. + // It then updates the meta table values and attempts to commit the + // `transaction`. + // Returns Error::kOk on success, or an error code on failure. + Error UpdateStoreStatusAndCommitTransaction(sql::Transaction& transaction, + int64_t entry_count_delta, + int64_t total_size_delta, + bool& corruption_detected); + + // Recalculates the store's status (entry count and total size) directly from + // the database. This is a recovery mechanism used when metadata might be + // inconsistent, e.g., after a numerical overflow. + // Returns Error::kOk on success, or an error code on failure. + Error RecalculateStoreStatusAndCommitTransaction( + sql::Transaction& transaction); + + int64_t CalculateResourceEntryCount(); + int64_t CalculateTotalSize(); + + // Checks the database status. Returns Error::kOk on success, or an error + // code if something is wrong. + Error CheckDatabaseStatus(); + + void MaybeCrashIfCorrupted(bool corruption_detected); + void OnCommitCallback(int pages); + + base::FilePath GetDatabaseFilePath() const; + + const ShardId shard_id_; + const base::FilePath path_; + const net::CacheType type_; + sql::Database db_; + sql::MetaTable meta_table_; + std::optional db_init_status_; + StoreStatus store_status_; + bool strict_corruption_check_enabled_ = false; + bool simulate_db_failure_for_testing_ = false; + // The number of pages in the write-ahead log file. This is updated by + // `OnCommitCallback` and reset to 0 after a checkpoint. + int wal_pages_ = 0; + + SEQUENCE_CHECKER(sequence_checker_); + + base::WeakPtrFactory weak_factory_{this}; +}; + +} // namespace disk_cache + +#endif // NET_DISK_CACHE_SQL_SQL_PERSISTENT_STORE_BACKEND_H_ diff --git a/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend_shard.cc b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend_shard.cc new file mode 100644 index 0000000000..c9eb5a5894 --- /dev/null +++ b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend_shard.cc @@ -0,0 +1,439 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/disk_cache/sql/sql_persistent_store_backend_shard.h" + +#include +#include + +#include "base/check.h" +#include "base/functional/bind.h" +#include "base/location.h" +#include "base/logging.h" +#include "base/memory/weak_ptr.h" +#include "base/metrics/histogram_functions.h" +#include "base/strings/strcat.h" +#include "base/task/bind_post_task.h" +#include "base/time/time.h" +#include "net/disk_cache/sql/eviction_candidate_aggregator.h" +#include "net/disk_cache/sql/sql_backend_constants.h" +#include "net/disk_cache/sql/sql_persistent_store_backend.h" + +namespace disk_cache { + +SqlPersistentStore::BackendShard::BackendShard( + ShardId shard_id, + const base::FilePath& path, + net::CacheType type, + scoped_refptr background_task_runner) + : backend_(background_task_runner, shard_id, path, type) {} + +SqlPersistentStore::BackendShard::~BackendShard() = default; + +// Kicks off the asynchronous initialization of the backend. +void SqlPersistentStore::BackendShard::Initialize( + int64_t user_max_bytes, + InitResultOrErrorCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::Initialize) + .WithArgs(user_max_bytes, base::TimeTicks::Now()) + .Then(base::BindOnce( + [](base::WeakPtr weak_ptr, + InitResultOrErrorCallback callback, InitResultOrError result) { + if (weak_ptr) { + if (result.has_value()) { + weak_ptr->store_status_ = result->store_status; + } + std::move(callback).Run(std::move(result)); + } + }, + weak_factory_.GetWeakPtr(), std::move(callback))); +} + +void SqlPersistentStore::BackendShard::OpenOrCreateEntry( + const CacheEntryKey& key, + EntryInfoOrErrorCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::OpenOrCreateEntry) + .WithArgs(key, base::TimeTicks::Now()) + .Then(WrapEntryInfoOrErrorCallback( + std::move(callback), key, IndexMismatchLocation::kOpenOrCreateEntry)); +} + +void SqlPersistentStore::BackendShard::OpenEntry( + const CacheEntryKey& key, + OptionalEntryInfoOrErrorCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::OpenEntry) + .WithArgs(key, base::TimeTicks::Now()) + .Then(WrapCallback(std::move(callback))); +} + +void SqlPersistentStore::BackendShard::CreateEntry( + const CacheEntryKey& key, + base::Time creation_time, + EntryInfoOrErrorCallback callback) { + bool run_existance_check = !index_ || index_->Contains(key.hash()); + backend_.AsyncCall(&SqlPersistentStore::Backend::CreateEntry) + .WithArgs(key, creation_time, run_existance_check, base::TimeTicks::Now()) + .Then(WrapEntryInfoOrErrorCallback(std::move(callback), key, + IndexMismatchLocation::kCreateEntry)); +} + +void SqlPersistentStore::BackendShard::DoomEntry(const CacheEntryKey& key, + ResId res_id, + ErrorCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::DoomEntry) + .WithArgs(key, res_id, base::TimeTicks::Now()) + .Then(base::BindOnce( + [](base::WeakPtr weak_ptr, CacheEntryKey::Hash key_hash, + ResId res_id, ErrorCallback callback, ErrorAndStoreStatus result) { + if (weak_ptr) { + if (result.result == Error::kOk && weak_ptr->index_.has_value()) { + if (!weak_ptr->index_->Remove(key_hash, res_id)) { + weak_ptr->RecordIndexMismatch( + IndexMismatchLocation::kDoomEntry); + } + } + weak_ptr->store_status_ = result.store_status; + // We should not run the callback when `this` was deleted. + std::move(callback).Run(std::move(result.result)); + } + }, + weak_factory_.GetWeakPtr(), key.hash(), res_id, std::move(callback))); +} + +void SqlPersistentStore::BackendShard::DeleteDoomedEntry( + const CacheEntryKey& key, + ResId res_id, + ErrorCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::DeleteDoomedEntry) + .WithArgs(key, res_id, base::TimeTicks::Now()) + .Then(WrapCallbackWithStoreStatus(std::move(callback))); +} + +void SqlPersistentStore::BackendShard::DeleteLiveEntry(const CacheEntryKey& key, + ErrorCallback callback) { + // If the entry is not in the in-memory index, we can skip the DB lookup. + if (GetIndexStateForHash(key.hash()) == IndexState::kHashNotFound) { + std::move(callback).Run(Error::kNotFound); + return; + } + backend_.AsyncCall(&SqlPersistentStore::Backend::DeleteLiveEntry) + .WithArgs(key, base::TimeTicks::Now()) + .Then(WrapErrorCallbackToRemoveFromIndex( + std::move(callback), IndexMismatchLocation::kDeleteLiveEntry)); +} + +void SqlPersistentStore::BackendShard::DeleteAllEntries( + ErrorCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::DeleteAllEntries) + .WithArgs(base::TimeTicks::Now()) + .Then(base::BindOnce( + [](base::WeakPtr weak_ptr, ErrorCallback callback, + ErrorAndStoreStatus result) { + if (weak_ptr) { + if (result.result == Error::kOk && weak_ptr->index_.has_value()) { + weak_ptr->index_->Clear(); + } + weak_ptr->store_status_ = result.store_status; + // We should not run the callback when `this` was deleted. + std::move(callback).Run(std::move(result.result)); + } + }, + weak_factory_.GetWeakPtr(), std::move(callback))); +} + +void SqlPersistentStore::BackendShard::DeleteLiveEntriesBetween( + base::Time initial_time, + base::Time end_time, + base::flat_set excluded_res_ids, + ErrorCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::DeleteLiveEntriesBetween) + .WithArgs(initial_time, end_time, std::move(excluded_res_ids), + base::TimeTicks::Now()) + .Then(WrapErrorCallbackToRemoveFromIndex( + std::move(callback), + IndexMismatchLocation::kDeleteLiveEntriesBetween)); +} + +void SqlPersistentStore::BackendShard::UpdateEntryLastUsedByKey( + const CacheEntryKey& key, + base::Time last_used, + ErrorCallback callback) { + // If the entry is not in the in-memory index, we can skip the DB lookup. + if (GetIndexStateForHash(key.hash()) == IndexState::kHashNotFound) { + std::move(callback).Run(Error::kNotFound); + return; + } + backend_.AsyncCall(&SqlPersistentStore::Backend::UpdateEntryLastUsedByKey) + .WithArgs(key, last_used, base::TimeTicks::Now()) + .Then(WrapCallback(std::move(callback))); +} + +void SqlPersistentStore::BackendShard::UpdateEntryLastUsedByResId( + ResId res_id, + base::Time last_used, + ErrorCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::UpdateEntryLastUsedByResId) + .WithArgs(res_id, last_used, base::TimeTicks::Now()) + .Then(WrapCallback(std::move(callback))); +} + +void SqlPersistentStore::BackendShard::UpdateEntryHeaderAndLastUsed( + const CacheEntryKey& key, + ResId res_id, + base::Time last_used, + scoped_refptr buffer, + int64_t header_size_delta, + ErrorCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::UpdateEntryHeaderAndLastUsed) + .WithArgs(key, res_id, last_used, std::move(buffer), header_size_delta, + base::TimeTicks::Now()) + .Then(WrapCallbackWithStoreStatus(std::move(callback))); +} + +void SqlPersistentStore::BackendShard::WriteEntryData( + const CacheEntryKey& key, + ResId res_id, + int64_t old_body_end, + int64_t offset, + scoped_refptr buffer, + int buf_len, + bool truncate, + ErrorCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::WriteEntryData) + .WithArgs(key, res_id, old_body_end, offset, std::move(buffer), buf_len, + truncate, base::TimeTicks::Now()) + .Then(WrapCallbackWithStoreStatus(std::move(callback))); +} + +void SqlPersistentStore::BackendShard::ReadEntryData( + const CacheEntryKey& key, + ResId res_id, + int64_t offset, + scoped_refptr buffer, + int buf_len, + int64_t body_end, + bool sparse_reading, + SqlPersistentStore::IntOrErrorCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::ReadEntryData) + .WithArgs(key, res_id, offset, std::move(buffer), buf_len, body_end, + sparse_reading, base::TimeTicks::Now()) + .Then(WrapCallback(std::move(callback))); +} + +void SqlPersistentStore::BackendShard::GetEntryAvailableRange( + const CacheEntryKey& key, + ResId res_id, + int64_t offset, + int len, + RangeResultCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::GetEntryAvailableRange) + .WithArgs(res_id, offset, len, base::TimeTicks::Now()) + .Then(WrapCallback(std::move(callback))); +} + +void SqlPersistentStore::BackendShard::CalculateSizeOfEntriesBetween( + base::Time initial_time, + base::Time end_time, + Int64OrErrorCallback callback) { + backend_ + .AsyncCall(&SqlPersistentStore::Backend::CalculateSizeOfEntriesBetween) + .WithArgs(initial_time, end_time, base::TimeTicks::Now()) + .Then(WrapCallback(std::move(callback))); +} + +void SqlPersistentStore::BackendShard::OpenNextEntry( + const EntryIterator& iterator, + OptionalEntryInfoWithKeyAndIteratorCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::OpenNextEntry) + .WithArgs(iterator, base::TimeTicks::Now()) + .Then(WrapCallback(std::move(callback))); +} + +void SqlPersistentStore::BackendShard::StartEviction( + int64_t size_to_be_removed, + base::flat_set excluded_res_ids, + bool is_idle_time_eviction, + scoped_refptr aggregator, + ResIdListOrErrorCallback callback) { + ResIdListOrErrorAndStoreStatusCallback result_callback = + base::BindPostTaskToCurrentDefault( + base::BindOnce(&BackendShard::OnEvictionFinished, + weak_factory_.GetWeakPtr(), std::move(callback))); + backend_.AsyncCall(&SqlPersistentStore::Backend::StartEviction) + .WithArgs(size_to_be_removed, std::move(excluded_res_ids), + is_idle_time_eviction, std::move(aggregator), + std::move(result_callback)); +} + +int32_t SqlPersistentStore::BackendShard::GetEntryCount() const { + return store_status_.entry_count; +} + +void SqlPersistentStore::BackendShard::GetEntryCountAsync( + Int32Callback callback) const { + backend_.AsyncCall(&SqlPersistentStore::Backend::GetEntryCount) + .Then(std::move(callback)); +} + +int64_t SqlPersistentStore::BackendShard::GetSizeOfAllEntries() const { + return store_status_.GetEstimatedDiskUsage(); +} + +void SqlPersistentStore::BackendShard::LoadInMemoryIndex( + ErrorCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::LoadInMemoryIndex) + .Then(base::BindOnce( + [](base::WeakPtr weak_ptr, ErrorCallback callback, + SqlPersistentStore::Backend::InMemoryIndexAndDoomedResIdsOrError + result) { + if (weak_ptr) { + if (result.has_value()) { + weak_ptr->index_ = std::move(result->index); + weak_ptr->to_be_deleted_res_ids_ = + std::move(result->doomed_entry_res_ids); + } + std::move(callback).Run(result.has_value() ? Error::kOk + : result.error()); + } + }, + weak_factory_.GetWeakPtr(), std::move(callback))); +} + +bool SqlPersistentStore::BackendShard::MaybeRunCleanupDoomedEntries( + ErrorCallback callback) { + if (to_be_deleted_res_ids_.empty()) { + return false; + } + backend_.AsyncCall(&SqlPersistentStore::Backend::DeleteDoomedEntries) + .WithArgs(std::move(to_be_deleted_res_ids_), base::TimeTicks::Now()) + .Then(WrapCallback(std::move(callback))); + return true; +} + +void SqlPersistentStore::BackendShard::MaybeRunCheckpoint( + base::OnceCallback callback) { + backend_.AsyncCall(&SqlPersistentStore::Backend::MaybeRunCheckpoint) + .Then(std::move(callback)); +} + +void SqlPersistentStore::BackendShard::EnableStrictCorruptionCheckForTesting() { + strict_corruption_check_enabled_ = true; + backend_.AsyncCall( + &SqlPersistentStore::Backend::EnableStrictCorruptionCheckForTesting); +} + +void SqlPersistentStore::BackendShard::SetSimulateDbFailureForTesting( + bool fail) { + backend_ + .AsyncCall(&SqlPersistentStore::Backend::SetSimulateDbFailureForTesting) + .WithArgs(fail); +} + +void SqlPersistentStore::BackendShard::RazeAndPoisonForTesting() { + backend_.AsyncCall(&SqlPersistentStore::Backend::RazeAndPoisonForTesting); +} + +SqlPersistentStore::IndexState +SqlPersistentStore::BackendShard::GetIndexStateForHash( + CacheEntryKey::Hash key_hash) const { + if (!index_.has_value()) { + return IndexState::kNotReady; + } + + if (index_->Contains(key_hash)) { + return IndexState::kHashFound; + } + return IndexState::kHashNotFound; +} + +// Like `WrapCallback`, but also updates the `store_status_`. +base::OnceCallback +SqlPersistentStore::BackendShard::WrapCallbackWithStoreStatus( + ErrorCallback callback) { + return base::BindOnce( + [](base::WeakPtr weak_ptr, ErrorCallback callback, + ErrorAndStoreStatus result) { + if (weak_ptr) { + weak_ptr->store_status_ = result.store_status; + // We should not run the callback when `this` was deleted. + std::move(callback).Run(std::move(result.result)); + } + }, + weak_factory_.GetWeakPtr(), std::move(callback)); +} + +base::OnceCallback +SqlPersistentStore::BackendShard::WrapEntryInfoOrErrorCallback( + EntryInfoOrErrorCallback callback, + const CacheEntryKey& key, + IndexMismatchLocation location) { + return base::BindOnce( + [](base::WeakPtr weak_ptr, + EntryInfoOrErrorCallback callback, CacheEntryKey::Hash key_hash, + IndexMismatchLocation location, + EntryInfoOrErrorAndStoreStatus result) { + if (weak_ptr) { + if (result.result.has_value() && weak_ptr->index_.has_value()) { + if (!result.result->opened) { + if (!weak_ptr->index_->Insert(key_hash, result.result->res_id)) { + weak_ptr->RecordIndexMismatch(location); + } + } + } + weak_ptr->store_status_ = result.store_status; + // We should not run the callback when `this` was deleted. + std::move(callback).Run(std::move(result.result)); + } + }, + weak_factory_.GetWeakPtr(), std::move(callback), key.hash(), location); +} + +base::OnceCallback +SqlPersistentStore::BackendShard::WrapErrorCallbackToRemoveFromIndex( + ErrorCallback callback, + IndexMismatchLocation location) { + return base::BindOnce( + [](base::WeakPtr weak_ptr, ErrorCallback callback, + IndexMismatchLocation location, + ResIdListOrErrorAndStoreStatus result) { + if (weak_ptr) { + if (result.result.has_value() && weak_ptr->index_.has_value()) { + for (ResId res_id : result.result.value()) { + if (!weak_ptr->index_->Remove(res_id)) { + weak_ptr->RecordIndexMismatch(location); + } + } + } + weak_ptr->store_status_ = result.store_status; + // We should not run the callback when `this` was deleted. + std::move(callback).Run( + std::move(result.result.error_or(Error::kOk))); + } + }, + weak_factory_.GetWeakPtr(), std::move(callback), location); +} + +void SqlPersistentStore::BackendShard::OnEvictionFinished( + ResIdListOrErrorCallback callback, + ResIdListOrErrorAndStoreStatus result) { + if (result.result.has_value() && index_.has_value()) { + for (ResId res_id : *result.result) { + if (!index_->Remove(res_id)) { + RecordIndexMismatch(IndexMismatchLocation::kStartEviction); + } + } + } + store_status_ = result.store_status; + std::move(callback).Run(std::move(result.result)); +} + +void SqlPersistentStore::BackendShard::RecordIndexMismatch( + IndexMismatchLocation location) { + base::UmaHistogramEnumeration( + base::StrCat({kSqlDiskCacheBackendHistogramPrefix, "IndexMismatch"}), + location); + CHECK(!strict_corruption_check_enabled_); +} + +} // namespace disk_cache diff --git a/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend_shard.h b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend_shard.h new file mode 100644 index 0000000000..bc2cf83d2f --- /dev/null +++ b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_backend_shard.h @@ -0,0 +1,194 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_DISK_CACHE_SQL_SQL_PERSISTENT_STORE_BACKEND_SHARD_H_ +#define NET_DISK_CACHE_SQL_SQL_PERSISTENT_STORE_BACKEND_SHARD_H_ + +#include + +#include "base/containers/flat_set.h" +#include "base/memory/scoped_refptr.h" +#include "base/threading/sequence_bound.h" +#include "net/base/cache_type.h" +#include "net/base/io_buffer.h" +#include "net/disk_cache/sql/sql_persistent_store.h" +#include "net/disk_cache/sql/sql_persistent_store_in_memory_index.h" + +namespace base { +class FilePath; +class SequencedTaskRunner; +} // namespace base + +namespace net { +class IOBuffer; +} // namespace net + +namespace disk_cache { + +class EvictionCandidateAggregator; + +// SqlPersistentStoreBackendShard` manages a single shard of the cache, +// including its own `Backend` instance and in-memory index. It forwards +// operations to the `Backend` on a dedicated background task runner. +class SqlPersistentStore::BackendShard { + public: + BackendShard(ShardId shard_id, + const base::FilePath& path, + net::CacheType type, + scoped_refptr background_task_runner); + ~BackendShard(); + + // Kicks off the asynchronous initialization of the backend. + void Initialize(int64_t user_max_bytes, InitResultOrErrorCallback callback); + void OpenOrCreateEntry(const CacheEntryKey& key, + EntryInfoOrErrorCallback callback); + void OpenEntry(const CacheEntryKey& key, + OptionalEntryInfoOrErrorCallback callback); + void CreateEntry(const CacheEntryKey& key, + base::Time creation_time, + EntryInfoOrErrorCallback callback); + void DoomEntry(const CacheEntryKey& key, + ResId res_id, + ErrorCallback callback); + void DeleteDoomedEntry(const CacheEntryKey& key, + ResId res_id, + ErrorCallback callback); + void DeleteLiveEntry(const CacheEntryKey& key, ErrorCallback callback); + void DeleteAllEntries(ErrorCallback callback); + void DeleteLiveEntriesBetween(base::Time initial_time, + base::Time end_time, + base::flat_set excluded_res_ids, + ErrorCallback callback); + void UpdateEntryLastUsedByKey(const CacheEntryKey& key, + base::Time last_used, + ErrorCallback callback); + void UpdateEntryLastUsedByResId(ResId res_id, + base::Time last_used, + ErrorCallback callback); + void UpdateEntryHeaderAndLastUsed(const CacheEntryKey& key, + ResId res_id, + base::Time last_used, + scoped_refptr buffer, + int64_t header_size_delta, + ErrorCallback callback); + void WriteEntryData(const CacheEntryKey& key, + ResId res_id, + int64_t old_body_end, + int64_t offset, + scoped_refptr buffer, + int buf_len, + bool truncate, + ErrorCallback callback); + void ReadEntryData(const CacheEntryKey& key, + ResId res_id, + int64_t offset, + scoped_refptr buffer, + int buf_len, + int64_t body_end, + bool sparse_reading, + SqlPersistentStore::IntOrErrorCallback callback); + void GetEntryAvailableRange(const CacheEntryKey& key, + ResId res_id, + int64_t offset, + int len, + RangeResultCallback callback); + void CalculateSizeOfEntriesBetween(base::Time initial_time, + base::Time end_time, + Int64OrErrorCallback callback); + void OpenNextEntry(const EntryIterator& iterator, + OptionalEntryInfoWithKeyAndIteratorCallback callback); + void StartEviction(int64_t size_to_be_removed, + base::flat_set excluded_res_ids, + bool is_idle_time_eviction, + scoped_refptr aggregator, + ResIdListOrErrorCallback callback); + + int32_t GetEntryCount() const; + void GetEntryCountAsync(Int32Callback callback) const; + int64_t GetSizeOfAllEntries() const; + + IndexState GetIndexStateForHash(CacheEntryKey::Hash key_hash) const; + + void LoadInMemoryIndex(ErrorCallback callback); + + // If there are entries that were doomed in a previous session, this method + // triggers a task to delete them from the database. The cleanup is performed + // in the background. Returns true if a cleanup task was scheduled, and false + // otherwise. `callback` is invoked upon completion of the cleanup task. + bool MaybeRunCleanupDoomedEntries(ErrorCallback callback); + + void MaybeRunCheckpoint(base::OnceCallback callback); + + void EnableStrictCorruptionCheckForTesting(); + void SetSimulateDbFailureForTesting(bool fail); + void RazeAndPoisonForTesting(); + + private: + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + // LINT.IfChange(IndexMismatchLocation) + enum class IndexMismatchLocation { + kOpenOrCreateEntry = 0, + kCreateEntry = 1, + kDoomEntry = 2, + kStartEviction = 3, + kDeleteLiveEntry = 4, + kDeleteLiveEntriesBetween = 5, + kMaxValue = kDeleteLiveEntriesBetween, + }; + // LINT.ThenChange(//tools/metrics/histograms/metadata/net/enums.xml:SqlDiskCacheIndexMismatchLocation) + + // Wraps a callback to ensure it is only run if the `BackendShard` is still + // alive. + template + base::OnceCallback WrapCallback( + base::OnceCallback callback) { + return base::BindOnce( + [](base::WeakPtr weak_ptr, + base::OnceCallback callback, ResultType result) { + if (weak_ptr) { + // We should not run the callback when `this` was deleted. + std::move(callback).Run(std::move(result)); + } + }, + weak_factory_.GetWeakPtr(), std::move(callback)); + } + + // Like `WrapCallback`, but also updates the `store_status_`. + base::OnceCallback WrapCallbackWithStoreStatus( + ErrorCallback callback); + + base::OnceCallback + WrapEntryInfoOrErrorCallback(EntryInfoOrErrorCallback callback, + const CacheEntryKey& key, + IndexMismatchLocation location); + + base::OnceCallback + WrapErrorCallbackToRemoveFromIndex(ErrorCallback callback, + IndexMismatchLocation location); + void OnEvictionFinished(ResIdListOrErrorCallback callback, + ResIdListOrErrorAndStoreStatus result); + void RecordIndexMismatch(IndexMismatchLocation location); + + base::SequenceBound backend_; + + // The in-memory summary of the store's status. + StoreStatus store_status_; + + // The in-memory index of cache entries. This is loaded asynchronously after + // MaybeLoadInMemoryIndex() is called. + std::optional index_; + + // A list of resource IDs for entries that were doomed in a previous session + // and are scheduled for deletion. + ResIdList to_be_deleted_res_ids_; + + bool strict_corruption_check_enabled_ = false; + + base::WeakPtrFactory weak_factory_{this}; +}; + +} // namespace disk_cache + +#endif // NET_DISK_CACHE_SQL_SQL_PERSISTENT_STORE_BACKEND_SHARD_H_ diff --git a/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_in_memory_index.cc b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_in_memory_index.cc new file mode 100644 index 0000000000..a1017e6f9d --- /dev/null +++ b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_in_memory_index.cc @@ -0,0 +1,80 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/disk_cache/sql/sql_persistent_store_in_memory_index.h" + +#include + +namespace disk_cache { + +using Hash = CacheEntryKey::Hash; +using ResId = SqlPersistentStore::ResId; + +SqlPersistentStoreInMemoryIndex::SqlPersistentStoreInMemoryIndex() = default; +SqlPersistentStoreInMemoryIndex::~SqlPersistentStoreInMemoryIndex() = default; + +SqlPersistentStoreInMemoryIndex::SqlPersistentStoreInMemoryIndex( + SqlPersistentStoreInMemoryIndex&& other) noexcept = default; +SqlPersistentStoreInMemoryIndex& SqlPersistentStoreInMemoryIndex::operator=( + SqlPersistentStoreInMemoryIndex&& other) noexcept = default; + +bool SqlPersistentStoreInMemoryIndex::Insert(Hash hash, ResId res_id) { + std::optional res_id_32 = ToResId32(res_id); + if (res_id_32.has_value()) { + return impl32_.Insert(hash, *res_id_32); + } + + if (!impl64_) { + impl64_.emplace(); + } + return impl64_->Insert(hash, res_id); +} + +bool SqlPersistentStoreInMemoryIndex::Contains(Hash hash) const { + if (impl32_.Contains(hash)) { + return true; + } + return impl64_ && impl64_->Contains(hash); +} + +bool SqlPersistentStoreInMemoryIndex::Remove(ResId res_id) { + std::optional res_id_32 = ToResId32(res_id); + if (res_id_32.has_value()) { + return impl32_.Remove(*res_id_32); + } + return impl64_ && impl64_->Remove(res_id); +} + +bool SqlPersistentStoreInMemoryIndex::Remove(Hash hash, ResId res_id) { + std::optional res_id_32 = ToResId32(res_id); + if (res_id_32.has_value()) { + return impl32_.Remove(hash, *res_id_32); + } + return impl64_ && impl64_->Remove(hash, res_id); +} + +void SqlPersistentStoreInMemoryIndex::Clear() { + impl32_.Clear(); + impl64_.reset(); +} + +// static +std::optional +SqlPersistentStoreInMemoryIndex::ToResId32(ResId res_id) { + if (res_id.value() < 0 || + res_id.value() > std::numeric_limits::max()) { + return std::nullopt; + } + return ResId32(static_cast(res_id.value())); +} + +size_t SqlPersistentStoreInMemoryIndex::size() const { + size_t size = impl32_.size(); + if (impl64_) { + size += impl64_->size(); + } + return size; +} + +} // namespace disk_cache diff --git a/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_in_memory_index.h b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_in_memory_index.h new file mode 100644 index 0000000000..02f24ee7f8 --- /dev/null +++ b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_in_memory_index.h @@ -0,0 +1,137 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_DISK_CACHE_SQL_SQL_PERSISTENT_STORE_IN_MEMORY_INDEX_H_ +#define NET_DISK_CACHE_SQL_SQL_PERSISTENT_STORE_IN_MEMORY_INDEX_H_ + +#include "base/check.h" +#include "base/types/strong_alias.h" +#include "net/base/net_export.h" +#include "net/disk_cache/sql/indexed_pair_set.h" +#include "net/disk_cache/sql/sql_persistent_store.h" + +namespace disk_cache { + +// A class that holds an in-memory index of the cache entries. It provides fast +// lookups of cache entries by their hash and resource ID. +// +// This class is optimized for memory usage. It maintains two maps: one from +// CacheEntryKey::Hash to ResId, and another from ResId to Hash. While +// SqlPersistentStore::ResId is a 64-bit integer, it is typically a database +// rowid that does not exceed the UINT32_MAX limit. +// +// On a 64-bit system, a std::pair consumes 16 bytes due to +// memory alignment. By using a unsigned 32-bit integer for the ResId by default +// (ResId32), the pair becomes , which consumes only 8 bytes. +// This effectively halves the memory footprint of the maps, which is +// significant as the index can contain over 100,000 entries. +// +// To handle the rare case of a ResId exceeding UINT32_MAX, this class uses two +// separate maps. +class NET_EXPORT_PRIVATE SqlPersistentStoreInMemoryIndex { + public: + SqlPersistentStoreInMemoryIndex(); + ~SqlPersistentStoreInMemoryIndex(); + + SqlPersistentStoreInMemoryIndex(const SqlPersistentStoreInMemoryIndex&) = + delete; + SqlPersistentStoreInMemoryIndex& operator=( + const SqlPersistentStoreInMemoryIndex&) = delete; + SqlPersistentStoreInMemoryIndex( + SqlPersistentStoreInMemoryIndex&& other) noexcept; + SqlPersistentStoreInMemoryIndex& operator=( + SqlPersistentStoreInMemoryIndex&& other) noexcept; + + bool Insert(CacheEntryKey::Hash hash, SqlPersistentStore::ResId res_id); + bool Contains(CacheEntryKey::Hash hash) const; + bool Remove(SqlPersistentStore::ResId res_id); + bool Remove(CacheEntryKey::Hash hash, SqlPersistentStore::ResId res_id); + void Clear(); + + size_t size() const; + + private: + using ResId32 = base::StrongAlias; + + template + class Impl { + public: + using ResIdToHashMap = absl::flat_hash_map; + + Impl() = default; + ~Impl() = default; + Impl(const Impl&) = delete; + Impl& operator=(const Impl&) = delete; + Impl(Impl&& other) noexcept = default; + Impl& operator=(Impl&& other) noexcept = default; + + bool Insert(CacheEntryKey::Hash hash, ResIdType res_id) { + if (res_id_to_hash_map_.contains(res_id)) { + return false; + } + if (hash_res_id_set_.Insert(hash, res_id)) { + res_id_to_hash_map_[res_id] = hash; + return true; + } + return false; + } + + bool Contains(CacheEntryKey::Hash hash) const { + return hash_res_id_set_.Contains(hash); + } + + bool Remove(ResIdType res_id) { + auto it = res_id_to_hash_map_.find(res_id); + if (it == res_id_to_hash_map_.end()) { + return false; + } + RemoveInternal(it); + return true; + } + + bool Remove(CacheEntryKey::Hash hash, ResIdType res_id) { + auto it = res_id_to_hash_map_.find(res_id); + if (it == res_id_to_hash_map_.end()) { + return false; + } + if (it->second != hash) { + return false; + } + RemoveInternal(it); + return true; + } + + void Clear() { + hash_res_id_set_.Clear(); + res_id_to_hash_map_.clear(); + } + + size_t size() const { return hash_res_id_set_.size(); } + + const ResIdToHashMap& res_id_to_hash_map() const { + return res_id_to_hash_map_; + } + + private: + using HashResIdSet = IndexedPairSet; + + void RemoveInternal(ResIdToHashMap::iterator it) { + DCHECK(it != res_id_to_hash_map_.end()); + CHECK(hash_res_id_set_.Remove(it->second, it->first)); + res_id_to_hash_map_.erase(it); + } + + HashResIdSet hash_res_id_set_; + ResIdToHashMap res_id_to_hash_map_; + }; + + static std::optional ToResId32(SqlPersistentStore::ResId res_id); + + Impl impl32_; + std::optional> impl64_; +}; + +} // namespace disk_cache + +#endif // NET_DISK_CACHE_SQL_SQL_PERSISTENT_STORE_IN_MEMORY_INDEX_H_ diff --git a/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_queries.h b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_queries.h index e7c7275c29..4492761df2 100644 --- a/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_queries.h +++ b/naiveproxy/src/net/disk_cache/sql/sql_persistent_store_queries.h @@ -20,13 +20,9 @@ namespace internal { // The `resources` table stores the main metadata for each cache entry. inline constexpr const char kInitSchema_CreateTableResources[] = // clang-format off - "CREATE TABLE IF NOT EXISTS resources(" + "CREATE TABLE resources(" // Unique ID for the resource "res_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," - // High part of an unguessable token - "token_high INTEGER NOT NULL," - // Low part of an unguessable token - "token_low INTEGER NOT NULL," // Timestamp for LRU "last_used INTEGER NOT NULL," // End offset of the body @@ -35,6 +31,10 @@ inline constexpr const char kInitSchema_CreateTableResources[] = "bytes_usage INTEGER NOT NULL," // Flag for entries pending deletion "doomed INTEGER NOT NULL," + // The checksum `crc32(head + cache_key_hash)`. + "check_sum INTEGER NOT NULL," + // The hash of `cache_key` created by simple_util::GetEntryHashKey() + "cache_key_hash INTEGER NOT NULL," // The cache key created by HttpCache::GenerateCacheKeyForRequest() "cache_key TEXT NOT NULL," // Serialized response headers @@ -44,73 +44,57 @@ inline constexpr const char kInitSchema_CreateTableResources[] = // The `blobs` table stores the data chunks of the cached body. inline constexpr const char kInitSchema_CreateTableBlobs[] = // clang-format off - "CREATE TABLE IF NOT EXISTS blobs(" + "CREATE TABLE blobs(" // Unique ID for the blob "blob_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," - // Foreign key to resources.token_high - "token_high INTEGER NOT NULL," - // Foreign key to resources.token_low - "token_low INTEGER NOT NULL," + // Foreign key to resources.res_id + "res_id INTEGER NOT NULL," // Start offset of this blob chunk "start INTEGER NOT NULL," // End offset of this blob chunk "end INTEGER NOT NULL," + // The checksum `crc32(blob + cache_key_hash)`. + "check_sum INTEGER NOT NULL," // The actual data chunk "blob BLOB NOT NULL)"; // clang-format on -// A unique index on the entry's token. This is used to quickly look up or -// update a resource entry using its unique token, which is essential for -// operations like `DoomEntry`, `UpdateEntryHeaderAndLastUsed`, and -// `WriteEntryData`. The `UNIQUE` constraint ensures data integrity by -// preventing duplicate tokens. -inline constexpr const char kIndex_ResourcesToken[] = - "CREATE UNIQUE INDEX IF NOT EXISTS index_resources_token ON " - "resources(token_high, token_low)"; - -// An index on `(cache_key, doomed)` to speed up lookups for live entries. This -// is frequently used in operations like `OpenEntry` to quickly find a +// An index on `(cache_key_hash, doomed)` to speed up lookups for live entries. +// This is frequently used in operations like `OpenEntry` to quickly find a // non-doomed entry for a given cache key. -inline constexpr const char kIndex_ResourcesCacheKeyDoomed[] = - "CREATE INDEX IF NOT EXISTS index_resources_cache_key_doomed ON " - "resources(cache_key, doomed)"; +inline constexpr const char kIndex_ResourcesCacheKeyHashDoomed[] = + "CREATE INDEX index_resources_cache_key_hash_doomed ON " + "resources(cache_key_hash, doomed)"; -// An index on `(doomed, last_used)` to optimize eviction logic. Eviction -// typically targets the least recently used (`last_used`) live (`doomed=false`) -// entries. This index significantly speeds up queries that select entries for -// eviction. -inline constexpr const char kIndex_ResourcesDoomedLastUsed[] = - "CREATE INDEX IF NOT EXISTS index_resources_doomed_last_used ON " - "resources(doomed, last_used)"; +// An index on `last_used` and `bytes_usage` for live entries (`doomed=0`). This +// is crucial for eviction logic, which targets the least recently used entries. +// To avoid looking at the actual resources table during eviction, this creates +// a covering index. +inline constexpr const char kIndex_LiveResourcesLastUsed[] = + "CREATE INDEX index_live_resources_last_used_bytes_usage ON " + "resources(last_used, bytes_usage) WHERE doomed=0"; -// An index on `(doomed, res_id)` to optimize iterating through entries while -// filtering for live (`doomed=false`) entries. `res_id` is a monotonically -// increasing primary key, making this index ideal for ordered traversals like -// in `OpenLatestEntryBeforeResId`. -inline constexpr const char kIndex_ResourcesDoomedResId[] = - "CREATE INDEX IF NOT EXISTS index_resources_doomed_res_id ON " - "resources(doomed, res_id)"; - -// A unique index on `(token_high, token_low, start)` in the `blobs` table. This -// is critical for quickly finding the correct data blobs for a given entry when -// reading or writing data at a specific offset. The `UNIQUE` constraint -// ensures that there are no overlapping blobs starting at the same offset for -// the same entry, which is important for data integrity. -inline constexpr const char kIndex_BlobsTokenStart[] = - "CREATE UNIQUE INDEX IF NOT EXISTS index_blobs_token_start ON " - "blobs(token_high, token_low, start)"; +// A unique index on `(res_id, start)` in the `blobs` table. This is critical +// for quickly finding the correct data blobs for a given entry when reading or +// writing data at a specific offset. The `UNIQUE` constraint ensures that +// there are no overlapping blobs starting at the same offset for the same +// entry, which is important for data integrity. +inline constexpr const char kIndex_BlobsResIdStart[] = + "CREATE UNIQUE INDEX index_blobs_res_id_start ON " + "blobs(res_id, start)"; inline constexpr const char kOpenEntry_SelectLiveResources[] = // clang-format off "SELECT " - "token_high," // 0 - "token_low," // 1 - "last_used," // 2 - "body_end," // 3 + "res_id," // 0 + "last_used," // 1 + "body_end," // 2 + "check_sum," // 3 "head " // 4 "FROM resources " "WHERE " - "cache_key=? AND " // 0 + "cache_key_hash=? AND " // 0 + "cache_key=? AND " // 1 "doomed=0 " "ORDER BY res_id DESC"; // clang-format on @@ -118,14 +102,15 @@ inline constexpr const char kOpenEntry_SelectLiveResources[] = inline constexpr const char kCreateEntry_InsertIntoResources[] = // clang-format off "INSERT INTO resources(" - "token_high," // 0 - "token_low," // 1 - "last_used," // 2 - "body_end," // 3 - "bytes_usage," // 4 + "last_used," // 0 + "body_end," // 1 + "bytes_usage," // 2 "doomed," - "cache_key) " // 5 - "VALUES(?,?,?,?,?,0,?)"; + "check_sum," // 3 + "cache_key_hash," // 4 + "cache_key) " // 5 + "VALUES(?,?,?,0,?,?,?) " + "RETURNING res_id"; // clang-format on inline constexpr const char kDoomEntry_MarkDoomedResources[] = @@ -134,9 +119,7 @@ inline constexpr const char kDoomEntry_MarkDoomedResources[] = "SET " "doomed=1 " "WHERE " - "cache_key=? AND " // 0 - "token_high=? AND " // 1 - "token_low=? AND " // 2 + "res_id=? AND " // 0 "doomed=0 " "RETURNING " "bytes_usage"; // 0 @@ -146,32 +129,20 @@ inline constexpr const char kDeleteDoomedEntry_DeleteFromResources[] = // clang-format off "DELETE FROM resources " "WHERE " - "cache_key=? AND " // 0 - "token_high=? AND " // 1 - "token_low=? AND " // 2 + "res_id=? AND " // 0 "doomed=1"; // clang-format on -inline constexpr const char kDeleteDoomedEntries_SelectDoomedResources[] = - // clang-format off - "SELECT " - "res_id," // 0 - "token_high," // 1 - "token_low " // 2 - "FROM resources " - "WHERE doomed=1"; -// clang-format on - inline constexpr const char kDeleteLiveEntry_DeleteFromResources[] = // clang-format off "DELETE FROM resources " "WHERE " - "cache_key=? AND " // 0 + "cache_key_hash=? AND " // 0 + "cache_key=? AND " // 1 "doomed=0 " "RETURNING " - "token_high," // 0 - "token_low," // 1 - "bytes_usage"; // 2 + "res_id," // 0 + "bytes_usage"; // 1 // clang-format on inline constexpr const char kDeleteAllEntries_DeleteFromResources[] = @@ -184,10 +155,7 @@ inline constexpr const char kDeleteLiveEntriesBetween_SelectLiveResources[] = // clang-format off "SELECT " "res_id," // 0 - "token_high," // 1 - "token_low," // 2 - "bytes_usage," // 3 - "cache_key " // 4 + "bytes_usage " // 1 "FROM resources " "WHERE " "last_used>=? AND " // 0 @@ -195,16 +163,28 @@ inline constexpr const char kDeleteLiveEntriesBetween_SelectLiveResources[] = "doomed=0"; // clang-format on -inline constexpr const char kDeleteResourcesByResIds_DeleteFromResources[] = +inline constexpr const char kDeleteResourceByResIds_DeleteFromResources[] = "DELETE FROM resources WHERE res_id=?"; -inline constexpr const char kUpdateEntryLastUsed_UpdateResourceLastUsed[] = +inline constexpr const char kUpdateEntryLastUsedByKey_UpdateResourceLastUsed[] = // clang-format off "UPDATE resources " + "SET " + "last_used=? " // 0 + "WHERE " + "cache_key_hash=? AND " // 1 + "cache_key=? AND " // 2 + "doomed=0"; +// clang-format on + +inline constexpr const char + kUpdateEntryLastUsedByResId_UpdateResourceLastUsed[] = + // clang-format off + "UPDATE resources " "SET " "last_used=? " // 0 "WHERE " - "cache_key=? AND " // 1 + "res_id=? AND " // 1 "doomed=0"; // clang-format on @@ -214,11 +194,10 @@ inline constexpr const char kUpdateEntryHeaderAndLastUsed_UpdateResource[] = "SET " "last_used=?, " // 0 "bytes_usage=bytes_usage+?, " // 1 - "head=? " // 2 + "check_sum=?, " // 2 + "head=? " // 3 "WHERE " - "cache_key=? AND " // 3 - "token_high=? AND " // 4 - "token_low=? AND " // 5 + "res_id=? AND " // 3 "doomed=0 " "RETURNING " "bytes_usage"; // 0 @@ -231,9 +210,7 @@ inline constexpr const char kWriteEntryData_UpdateResource[] = "body_end=body_end+?, " // 0 "bytes_usage=bytes_usage+? " // 1 "WHERE " - "cache_key=? AND " // 2 - "token_high=? AND " // 3 - "token_low=? " // 4 + "res_id=? " // 2 "RETURNING " "body_end," // 0 "doomed"; // 1 @@ -243,10 +220,9 @@ inline constexpr const char kTrimOverlappingBlobs_DeleteContained[] = // clang-format off "DELETE FROM blobs " "WHERE " - "token_high=? AND " // 0 - "token_low=? AND " // 1 - "start>=? AND " // 2 - "end<=? " // 3 + "res_id=? AND " // 0 + "start>=? AND " // 1 + "end<=? " // 2 "RETURNING " "start," // 0 "end"; // 1 @@ -258,22 +234,21 @@ inline constexpr const char kTrimOverlappingBlobs_SelectOverlapping[] = "blob_id," // 0 "start," // 1 "end," // 2 - "blob " // 3 + "check_sum," // 3 + "blob " // 4 "FROM blobs " "WHERE " - "token_high=? AND " // 0 - "token_low=? AND " // 1 - "start?"; // 3 + "res_id=? AND " // 0 + "start?"; // 2 // clang-format on inline constexpr const char kTruncateBlobsAfter_DeleteAfter[] = // clang-format off "DELETE FROM blobs " "WHERE " - "token_high=? AND " // 0 - "token_low=? AND " // 1 - "start>=? " // 2 + "res_id=? AND " // 0 + "start>=? " // 1 "RETURNING " "start," // 0 "end"; // 1 @@ -282,10 +257,10 @@ inline constexpr const char kTruncateBlobsAfter_DeleteAfter[] = inline constexpr const char kInsertNewBlob_InsertIntoBlobs[] = // clang-format off "INSERT INTO blobs(" - "token_high," // 0 - "token_low," // 1 - "start," // 2 - "end," // 3 + "res_id," // 0 + "start," // 1 + "end," // 2 + "check_sum," // 3 "blob) " // 4 "VALUES(?,?,?,?,?)"; // clang-format on @@ -300,12 +275,11 @@ inline constexpr const char kDeleteBlobById_DeleteFromBlobs[] = "end"; // 1 // clang-format on -inline constexpr const char kDeleteBlobsByToken_DeleteFromBlobs[] = +inline constexpr const char kDeleteBlobsByResId_DeleteFromBlobs[] = // clang-format off "DELETE FROM blobs " "WHERE " - "token_high=? AND " // 0 - "token_low=?"; // 1 + "res_id=?"; // 0 // clang-format on inline constexpr const char kReadEntryData_SelectOverlapping[] = @@ -313,13 +287,13 @@ inline constexpr const char kReadEntryData_SelectOverlapping[] = "SELECT " "start," // 0 "end," // 1 - "blob " // 2 + "check_sum," // 2 + "blob " // 3 "FROM blobs " "WHERE " - "token_high=? AND " // 0 - "token_low=? AND " // 1 - "start? " // 3 + "res_id=? AND " // 0 + "start? " // 2 "ORDER BY start"; // clang-format on @@ -330,10 +304,9 @@ inline constexpr const char kGetEntryAvailableRange_SelectOverlapping[] = "end " // 1 "FROM blobs " "WHERE " - "token_high=? AND " // 0 - "token_low=? AND " // 1 - "start? " // 3 + "res_id=? AND " // 0 + "start? " // 2 "ORDER BY start"; // clang-format on @@ -349,16 +322,15 @@ inline constexpr const char "doomed=0"; // clang-format on -inline constexpr const char kOpenLatestEntryBeforeResId_SelectLiveResources[] = +inline constexpr const char kOpenNextEntry_SelectLiveResources[] = // clang-format off "SELECT " "res_id," // 0 - "token_high," // 1 - "token_low," // 2 - "last_used," // 3 - "body_end," // 4 - "cache_key," // 5 - "head " // 6 + "last_used," // 1 + "body_end," // 2 + "check_sum," // 3 + "cache_key," // 4 + "head " // 5 "FROM resources " "WHERE " "res_id& endpoints, } } -void AddressSorterPosix::OnIPAddressChanged() { +void AddressSorterPosix::OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); source_map_.clear(); #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) diff --git a/naiveproxy/src/net/dns/address_sorter_posix.h b/naiveproxy/src/net/dns/address_sorter_posix.h index fe42d6c8ba..1df62570ec 100644 --- a/naiveproxy/src/net/dns/address_sorter_posix.h +++ b/naiveproxy/src/net/dns/address_sorter_posix.h @@ -76,7 +76,8 @@ class NET_EXPORT_PRIVATE AddressSorterPosix class SortContext; // NetworkChangeNotifier::IPAddressObserver: - void OnIPAddressChanged() override; + void OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) override; // Fills |info| with values for |address| from policy tables. void FillPolicy(const IPAddress& address, SourceAddressInfo* info) const; diff --git a/naiveproxy/src/net/dns/context_host_resolver.cc b/naiveproxy/src/net/dns/context_host_resolver.cc index b218795c38..c95c4d3456 100644 --- a/naiveproxy/src/net/dns/context_host_resolver.cc +++ b/naiveproxy/src/net/dns/context_host_resolver.cc @@ -77,6 +77,11 @@ ContextHostResolver::CreateRequest( return HostResolver::CreateFailingRequest(ERR_CONTEXT_SHUT_DOWN); } + if (manager_->InvalidationInProgress()) { + return HostResolver::CreateFailingRequest( + ERR_DNS_CACHE_INVALIDATION_IN_PROGRESS); + } + CHECK(resolve_context_); return manager_->CreateRequest( diff --git a/naiveproxy/src/net/dns/dns_alias_utility.cc b/naiveproxy/src/net/dns/dns_alias_utility.cc index 96f1ee81da..467d69daef 100644 --- a/naiveproxy/src/net/dns/dns_alias_utility.cc +++ b/naiveproxy/src/net/dns/dns_alias_utility.cc @@ -27,7 +27,7 @@ std::set FixUpDnsAliases(const std::set& aliases) { std::string canonicalized_alias; url::StdStringCanonOutput output(&canonicalized_alias); url::CanonHostInfo host_info; - url::CanonicalizeHostVerbose(alias.data(), url::Component(0, alias.size()), + url::CanonicalizeHostVerbose(alias, url::Component(0, alias.size()), &output, &host_info); if (host_info.family == url::CanonHostInfo::Family::BROKEN) { diff --git a/naiveproxy/src/net/dns/dns_client.cc b/naiveproxy/src/net/dns/dns_client.cc index 22d13cd373..d407abf077 100644 --- a/naiveproxy/src/net/dns/dns_client.cc +++ b/naiveproxy/src/net/dns/dns_client.cc @@ -37,6 +37,21 @@ namespace net { namespace { +DnsConfigLocalNameserverState GetDnsConfigLocalNameserverState( + bool has_loopback_nameserver, + bool has_local_non_loopback_nameserver) { + if (has_loopback_nameserver && has_local_non_loopback_nameserver) { + return DnsConfigLocalNameserverState::kLoopbackAndNonLoopback; + } + if (has_loopback_nameserver) { + return DnsConfigLocalNameserverState::kOnlyLoopback; + } + if (has_local_non_loopback_nameserver) { + return DnsConfigLocalNameserverState::kOnlyNonLoopbackLocal; + } + return DnsConfigLocalNameserverState::kNoLocal; +} + bool IsEqual(const std::optional& c1, const DnsConfig* c2) { if (!c1.has_value() && c2 == nullptr) return true; @@ -72,12 +87,30 @@ void UpdateConfigForDohUpgrade(DnsConfig* config) { } UMA_HISTOGRAM_BOOLEAN("Net.DNS.UpgradeConfig.HasPublicInsecureNameserver", !all_local); - config->doh_config = DnsOverHttpsConfig( GetDohUpgradeServersFromNameservers(config->nameservers)); has_doh_servers = !config->doh_config.servers().empty(); UMA_HISTOGRAM_BOOLEAN("Net.DNS.UpgradeConfig.InsecureUpgradeSucceeded", has_doh_servers); + + // We only emit these metrics if auto-upgrade fails. + // TODO: crbug.com/448683318 - add DoH fallback here. + if (!has_doh_servers) { + bool has_loopback_nameserver = false; + bool has_local_non_loopback_nameserver = false; + for (const auto& server : config->nameservers) { + if (server.address().IsLoopback()) { + has_loopback_nameserver = true; + } else if (!server.address().IsPubliclyRoutable()) { + has_local_non_loopback_nameserver = true; + } + } + + UMA_HISTOGRAM_ENUMERATION( + "Net.DNS.UpgradeConfigFailed.LocalNameserverState", + GetDnsConfigLocalNameserverState( + has_loopback_nameserver, has_local_non_loopback_nameserver)); + } } } else { UMA_HISTOGRAM_BOOLEAN("Net.DNS.UpgradeConfig.Ineligible.DohSpecified", diff --git a/naiveproxy/src/net/dns/dns_client.h b/naiveproxy/src/net/dns/dns_client.h index 4f29f45e3a..c19796e5bc 100644 --- a/naiveproxy/src/net/dns/dns_client.h +++ b/naiveproxy/src/net/dns/dns_client.h @@ -31,6 +31,16 @@ class DnsTransactionFactory; class NetLog; class ResolveContext; +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class DnsConfigLocalNameserverState { + kNoLocal = 0, + kOnlyLoopback = 1, + kOnlyNonLoopbackLocal = 2, + kLoopbackAndNonLoopback = 3, + kMaxValue = kLoopbackAndNonLoopback, +}; + // Entry point for HostResolverManager to interact with the built-in async // resolver, as implemented by DnsTransactionFactory. Manages configuration and // status of the resolver. diff --git a/naiveproxy/src/net/dns/dns_config_service_win.cc b/naiveproxy/src/net/dns/dns_config_service_win.cc index dbe99d692a..13580fbc95 100644 --- a/naiveproxy/src/net/dns/dns_config_service_win.cc +++ b/naiveproxy/src/net/dns/dns_config_service_win.cc @@ -559,7 +559,8 @@ class DnsConfigServiceWin::Watcher } // NetworkChangeNotifier::IPAddressObserver: - void OnIPAddressChanged() override { + void OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) override { // Need to update non-loopback IP of local host. OnHostsChanged(true); } diff --git a/naiveproxy/src/net/dns/dns_names_util.cc b/naiveproxy/src/net/dns/dns_names_util.cc index b839b9f378..dad6a27232 100644 --- a/naiveproxy/src/net/dns/dns_names_util.cc +++ b/naiveproxy/src/net/dns/dns_names_util.cc @@ -181,8 +181,8 @@ std::string UrlCanonicalizeNameIfAble(std::string_view name) { std::string canonicalized; url::StdStringCanonOutput output(&canonicalized); url::CanonHostInfo host_info; - url::CanonicalizeHostVerbose(name.data(), url::Component(0, name.size()), - &output, &host_info); + url::CanonicalizeHostVerbose(name, url::Component(0, name.size()), &output, + &host_info); if (host_info.family == url::CanonHostInfo::Family::BROKEN) { return std::string(name); diff --git a/naiveproxy/src/net/dns/dns_response.cc b/naiveproxy/src/net/dns/dns_response.cc index 8e60c2a977..8337d29349 100644 --- a/naiveproxy/src/net/dns/dns_response.cc +++ b/naiveproxy/src/net/dns/dns_response.cc @@ -17,12 +17,14 @@ #include "base/containers/span.h" #include "base/containers/span_reader.h" #include "base/containers/span_writer.h" +#include "base/feature_list.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "base/strings/string_util.h" #include "base/strings/string_view_util.h" #include "base/sys_byteorder.h" #include "base/types/optional_util.h" +#include "net/base/features.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" #include "net/dns/dns_names_util.h" @@ -486,15 +488,39 @@ bool DnsResponse::InitParseWithoutQuery(size_t nbytes) { DnsRecordParser(io_buffer_->first(nbytes), kHeaderSize, num_records); unsigned qdcount = base::NetToHost16(header()->qdcount); - for (unsigned i = 0; i < qdcount; ++i) { - std::string dotted_qname; - uint16_t qtype; - if (!parser_.ReadQuestion(dotted_qname, qtype)) { - parser_ = DnsRecordParser(); // Make parser invalid again. - return false; + + // TODO(crbug.com/448685357): Remove feature check when launched. + if (base::FeatureList::IsEnabled( + net::features::kDnsResponseDiscardPartialQuestions)) { + std::vector parsed_qnames; + std::vector parsed_qtypes; + parsed_qnames.reserve(qdcount); + parsed_qtypes.reserve(qdcount); + + for (unsigned i = 0; i < qdcount; ++i) { + std::string dotted_qname; + uint16_t qtype; + if (!parser_.ReadQuestion(dotted_qname, qtype)) { + parser_ = DnsRecordParser(); // Make parser invalid again. + return false; + } + parsed_qnames.push_back(std::move(dotted_qname)); + parsed_qtypes.push_back(qtype); + } + + dotted_qnames_ = std::move(parsed_qnames); + qtypes_ = std::move(parsed_qtypes); + } else { + for (unsigned i = 0; i < qdcount; ++i) { + std::string dotted_qname; + uint16_t qtype; + if (!parser_.ReadQuestion(dotted_qname, qtype)) { + parser_ = DnsRecordParser(); // Make parser invalid again. + return false; + } + dotted_qnames_.push_back(std::move(dotted_qname)); + qtypes_.push_back(qtype); } - dotted_qnames_.push_back(std::move(dotted_qname)); - qtypes_.push_back(qtype); } return true; diff --git a/naiveproxy/src/net/dns/dns_server_iterator.cc b/naiveproxy/src/net/dns/dns_server_iterator.cc index 0b6acfe398..a5006f403a 100644 --- a/naiveproxy/src/net/dns/dns_server_iterator.cc +++ b/naiveproxy/src/net/dns/dns_server_iterator.cc @@ -22,7 +22,9 @@ DnsServerIterator::DnsServerIterator(size_t nameservers_size, max_failures_(max_failures), resolve_context_(resolve_context), next_index_(starting_index), - session_(session) {} + session_(session) { + CHECK(starting_index < nameservers_size || nameservers_size == 0); +} DnsServerIterator::~DnsServerIterator() = default; diff --git a/naiveproxy/src/net/dns/dns_transaction.cc b/naiveproxy/src/net/dns/dns_transaction.cc index 8de1c66629..9bb113568a 100644 --- a/naiveproxy/src/net/dns/dns_transaction.cc +++ b/naiveproxy/src/net/dns/dns_transaction.cc @@ -17,6 +17,7 @@ #include #include "base/base64url.h" +#include "base/byte_count.h" #include "base/containers/circular_deque.h" #include "base/containers/span.h" #include "base/functional/bind.h" @@ -30,6 +31,7 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/numerics/byte_conversions.h" +#include "base/numerics/safe_conversions.h" #include "base/rand_util.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" @@ -119,7 +121,8 @@ const char kDnsOverHttpResponseContentType[] = "application/dns-message"; // The maximum size of the DNS message for DoH, per // https://datatracker.ietf.org/doc/html/rfc8484#section-6 -const int64_t kDnsOverHttpResponseMaximumSize = 65535; +constexpr base::ByteCount kDnsOverHttpResponseMaximumSize = + base::ByteCount(65535); // Count labels in the fully-qualified name in DNS format. int CountLabels(base::span name) { @@ -542,18 +545,18 @@ class DnsHTTPAttempt : public DnsAttempt, public URLRequest::Delegate { buffer_ = base::MakeRefCounted(); - if (request->response_headers()->HasHeader( - HttpRequestHeaders::kContentLength)) { - if (request_->response_headers()->GetContentLength() > - kDnsOverHttpResponseMaximumSize) { + std::optional content_length = + request_->response_headers()->GetContentLength(); + if (content_length.has_value()) { + if (content_length.value() > kDnsOverHttpResponseMaximumSize) { ResponseCompleted(ERR_DNS_MALFORMED_RESPONSE); return; } - - buffer_->SetCapacity(request_->response_headers()->GetContentLength() + - 1); + buffer_->SetCapacity( + base::checked_cast(content_length->InBytes() + 1)); } else { - buffer_->SetCapacity(kDnsOverHttpResponseMaximumSize + 1); + buffer_->SetCapacity(base::checked_cast( + kDnsOverHttpResponseMaximumSize.InBytes() + 1)); } DCHECK(buffer_->data()); @@ -588,7 +591,8 @@ class DnsHTTPAttempt : public DnsAttempt, public URLRequest::Delegate { DCHECK_GE(bytes_read, 0); if (bytes_read > 0) { - if (buffer_->offset() + bytes_read > kDnsOverHttpResponseMaximumSize) { + if (buffer_->offset() + bytes_read > + kDnsOverHttpResponseMaximumSize.InBytes()) { ResponseCompleted(ERR_DNS_MALFORMED_RESPONSE); return; } diff --git a/naiveproxy/src/net/dns/filtering_details_url_generator.cc b/naiveproxy/src/net/dns/filtering_details_url_generator.cc new file mode 100644 index 0000000000..41d1fd0690 --- /dev/null +++ b/naiveproxy/src/net/dns/filtering_details_url_generator.cc @@ -0,0 +1,46 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/dns/filtering_details_url_generator.h" + +#include +#include +#include + +#include "base/no_destructor.h" +#include "net/third_party/uri_template/uri_template.h" +#include "third_party/abseil-cpp/absl/container/flat_hash_map.h" + +namespace net { + +namespace { +const absl::flat_hash_map& GetBuiltInRegistry() { + static const base::NoDestructor> + kDefaultFilteringDetailsRegistry( + absl::flat_hash_map{}); + return *kDefaultFilteringDetailsRegistry; +} +} // namespace + +FilteringDetailsUrlGenerator::FilteringDetailsUrlGenerator( + const absl::flat_hash_map& registry) + : registry_(registry.empty() ? GetBuiltInRegistry() : registry) {} + +FilteringDetailsUrlGenerator::~FilteringDetailsUrlGenerator() = default; + +std::optional FilteringDetailsUrlGenerator::GenerateUrl( + std::string_view db, + std::string_view id) { + auto it = registry_.find(db); + if (it == registry_.end()) { + return std::nullopt; + } + std::unordered_map params = { + {"id", std::string(id)}}; + std::string url; + bool success = uri_template::Expand(it->second, params, &url); + return success ? std::optional(url) : std::nullopt; +} + +} // namespace net diff --git a/naiveproxy/src/net/dns/filtering_details_url_generator.h b/naiveproxy/src/net/dns/filtering_details_url_generator.h new file mode 100644 index 0000000000..bebf10f1a2 --- /dev/null +++ b/naiveproxy/src/net/dns/filtering_details_url_generator.h @@ -0,0 +1,37 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_DNS_FILTERING_DETAILS_URL_GENERATOR_H_ +#define NET_DNS_FILTERING_DETAILS_URL_GENERATOR_H_ + +#include +#include +#include + +#include "net/base/net_export.h" +#include "third_party/abseil-cpp/absl/container/flat_hash_map.h" + +namespace net { + +// Utility class for generating user-facing URLs for DNS Filtering Details. +// Based on Version 2 of the Public Resolver Errors draft: +// https://datatracker.ietf.org/doc/draft-nottingham-public-resolver-errors/02/ +class NET_EXPORT FilteringDetailsUrlGenerator { + public: + explicit FilteringDetailsUrlGenerator( + const absl::flat_hash_map& registry); + ~FilteringDetailsUrlGenerator(); + + std::optional GenerateUrl(std::string_view db, + std::string_view id); + + private: + // TODO(crbug.com/396483553): Populate this registry with at least one + // provider before enabling feature flag `kDnsFilteringDetails`. + absl::flat_hash_map registry_; +}; + +} // namespace net + +#endif // NET_DNS_FILTERING_DETAILS_URL_GENERATOR_H_ diff --git a/naiveproxy/src/net/dns/host_cache.cc b/naiveproxy/src/net/dns/host_cache.cc index e9043595ab..625c036283 100644 --- a/naiveproxy/src/net/dns/host_cache.cc +++ b/naiveproxy/src/net/dns/host_cache.cc @@ -496,8 +496,10 @@ HostCache::Entry HostCache::Entry::CopyWithDefaultPort(uint16_t port) const { } for (HostPortPair& hostname : copy.hostnames_) { + // Hostnames are mutable, unlike IPEndPoints, so can overwrite only the + // ports. if (hostname.port() == 0) { - hostname = HostPortPair(hostname.host(), port); + hostname.set_port(port); } } diff --git a/naiveproxy/src/net/dns/host_resolver.cc b/naiveproxy/src/net/dns/host_resolver.cc index a2576a1375..ddb4a250df 100644 --- a/naiveproxy/src/net/dns/host_resolver.cc +++ b/naiveproxy/src/net/dns/host_resolver.cc @@ -40,7 +40,7 @@ #include "url/scheme_host_port.h" #if BUILDFLAG(IS_ANDROID) -#include "base/android/build_info.h" +#include "base/android/android_info.h" #include "net/android/network_library.h" #endif // BUILDFLAG(IS_ANDROID) @@ -50,7 +50,6 @@ namespace { // The experiment settings of features::kUseDnsHttpsSvcb. See the comments in // net/base/features.h for more details. -const char kUseDnsHttpsSvcbEnable[] = "enable"; const char kUseDnsHttpsSvcbInsecureExtraTimeMax[] = "insecure_extra_time_max"; const char kUseDnsHttpsSvcbInsecureExtraTimePercent[] = "insecure_extra_time_percent"; @@ -254,8 +253,6 @@ HostResolver::HttpsSvcbOptions::~HttpsSvcbOptions() = default; HostResolver::HttpsSvcbOptions HostResolver::HttpsSvcbOptions::FromDict( const base::Value::Dict& dict) { net::HostResolver::HttpsSvcbOptions options; - options.enable = - dict.FindBool(kUseDnsHttpsSvcbEnable).value_or(options.enable); GetTimeDeltaFromDictString(dict, kUseDnsHttpsSvcbInsecureExtraTimeMax, &options.insecure_extra_time_max); @@ -280,7 +277,6 @@ HostResolver::HttpsSvcbOptions HostResolver::HttpsSvcbOptions::FromDict( // static HostResolver::HttpsSvcbOptions HostResolver::HttpsSvcbOptions::FromFeatures() { net::HostResolver::HttpsSvcbOptions options; - options.enable = base::FeatureList::IsEnabled(features::kUseDnsHttpsSvcb); options.insecure_extra_time_max = features::kUseDnsHttpsSvcbInsecureExtraTimeMax.Get(); options.insecure_extra_time_percent = @@ -486,8 +482,8 @@ HostResolver::CreateStandaloneNetworkBoundResolver( // Support the use of the built-in resolver when possible. bool is_builtin_resolver_supported = manager_options.insecure_dns_client_enabled && - base::android::BuildInfo::GetInstance()->sdk_int() >= - base::android::SDK_VERSION_P; + base::android::android_info::sdk_int() >= + base::android::android_info::SDK_VERSION_P; if (is_builtin_resolver_supported) { // Pre-existing DnsConfigOverrides is currently ignored, consider extending // if a use case arises. diff --git a/naiveproxy/src/net/dns/host_resolver.h b/naiveproxy/src/net/dns/host_resolver.h index 39aae1d3dc..1ffc7890ef 100644 --- a/naiveproxy/src/net/dns/host_resolver.h +++ b/naiveproxy/src/net/dns/host_resolver.h @@ -298,7 +298,6 @@ class NET_EXPORT HostResolver { static HttpsSvcbOptions FromDict(const base::Value::Dict& dict); static HttpsSvcbOptions FromFeatures(); - bool enable = false; base::TimeDelta insecure_extra_time_max; int insecure_extra_time_percent = 0; base::TimeDelta insecure_extra_time_min; diff --git a/naiveproxy/src/net/dns/host_resolver_cache.cc b/naiveproxy/src/net/dns/host_resolver_cache.cc index 93032e14bb..fbdc86061d 100644 --- a/naiveproxy/src/net/dns/host_resolver_cache.cc +++ b/naiveproxy/src/net/dns/host_resolver_cache.cc @@ -302,9 +302,8 @@ HostResolverCache::LookupInternal( url::StdStringCanonOutput output(&canonicalized); url::CanonHostInfo host_info; - url::CanonicalizeHostVerbose(domain_name.data(), - url::Component(0, domain_name.size()), &output, - &host_info); + url::CanonicalizeHostVerbose( + domain_name, url::Component(0, domain_name.size()), &output, &host_info); // For performance, when canonicalization can't canonicalize, minimize string // copies and just reuse the input std::string_view. This optimization diff --git a/naiveproxy/src/net/dns/host_resolver_dns_task.cc b/naiveproxy/src/net/dns/host_resolver_dns_task.cc index 7a32ae4337..4cb7683cb6 100644 --- a/naiveproxy/src/net/dns/host_resolver_dns_task.cc +++ b/naiveproxy/src/net/dns/host_resolver_dns_task.cc @@ -28,9 +28,7 @@ namespace net { // When enabled, query HTTPS RR first. -BASE_FEATURE(kPrioritizeHttpsResourceRecord, - "PrioritizeHttpsResourceRecord", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kPrioritizeHttpsResourceRecord, base::FEATURE_ENABLED_BY_DEFAULT); namespace { @@ -390,6 +388,7 @@ DnsQueryTypeSet HostResolverDnsTask::MaybeDisableAdditionalQueries( if (types.Has(DnsQueryType::HTTPS)) { if (!secure_ && !client_->CanQueryAdditionalTypesViaInsecureDns()) { + https_disabled_ = true; types.Remove(DnsQueryType::HTTPS); } else { DCHECK(!httpssvc_metrics_); @@ -1105,7 +1104,7 @@ void HostResolverDnsTask::MaybeStartTimeoutTimer() { base::TimeDelta timeout_min; if (AnyOfTypeTransactionsRemain({DnsQueryType::HTTPS})) { - DCHECK(https_svcb_options_.enable); + DCHECK(base::FeatureList::IsEnabled(features::kUseDnsHttpsSvcb)); if (secure_) { timeout_max = https_svcb_options_.secure_extra_time_max; diff --git a/naiveproxy/src/net/dns/host_resolver_dns_task.h b/naiveproxy/src/net/dns/host_resolver_dns_task.h index dcd03b40fc..218defc77b 100644 --- a/naiveproxy/src/net/dns/host_resolver_dns_task.h +++ b/naiveproxy/src/net/dns/host_resolver_dns_task.h @@ -115,6 +115,8 @@ class NET_EXPORT_PRIVATE HostResolverDnsTask final { bool secure() const { return secure_; } + bool https_disabled() const { return https_disabled_; } + void StartNextTransaction(); base::WeakPtr AsWeakPtr() { @@ -265,6 +267,9 @@ class NET_EXPORT_PRIVATE HostResolverDnsTask final { const HostResolver::HttpsSvcbOptions https_svcb_options_; + // Set to true when HTTPS query is disabled. + bool https_disabled_ = false; + base::WeakPtrFactory weak_ptr_factory_{this}; }; diff --git a/naiveproxy/src/net/dns/host_resolver_internal_result.cc b/naiveproxy/src/net/dns/host_resolver_internal_result.cc index afaf662c21..94d0b6b220 100644 --- a/naiveproxy/src/net/dns/host_resolver_internal_result.cc +++ b/naiveproxy/src/net/dns/host_resolver_internal_result.cc @@ -52,9 +52,8 @@ std::string MaybeCanonicalizeName(std::string domain_name) { url::StdStringCanonOutput output(&canonicalized); url::CanonHostInfo host_info; - url::CanonicalizeHostVerbose(domain_name.data(), - url::Component(0, domain_name.size()), &output, - &host_info); + url::CanonicalizeHostVerbose( + domain_name, url::Component(0, domain_name.size()), &output, &host_info); if (host_info.family == url::CanonHostInfo::Family::NEUTRAL) { output.Complete(); diff --git a/naiveproxy/src/net/dns/host_resolver_manager.cc b/naiveproxy/src/net/dns/host_resolver_manager.cc index e23ea3fe98..1bd1929b69 100644 --- a/naiveproxy/src/net/dns/host_resolver_manager.cc +++ b/naiveproxy/src/net/dns/host_resolver_manager.cc @@ -134,7 +134,6 @@ #include #include "net/base/sys_addrinfo.h" #if BUILDFLAG(IS_ANDROID) -#include "base/android/build_info.h" #else // !BUILDFLAG(IS_ANDROID) #include #endif // BUILDFLAG(IS_ANDROID) @@ -232,7 +231,7 @@ PrioritizedDispatcher::Limits GetDispatcherLimits( parsed.pop_back(); const size_t total_reserved_slots = - std::accumulate(parsed.begin(), parsed.end(), 0u); + std::accumulate(parsed.begin(), parsed.end(), size_t{0}); // There must be some unreserved slots available for the all priorities. if (total_reserved_slots > total_jobs || @@ -795,12 +794,9 @@ void HostResolverManager::InitializeJobKeyAndIPAddress( effective_types.Remove(DnsQueryType::AAAA); } - // Optimistically enable feature-controlled queries. These queries may be - // skipped at a later point. - - // `https_svcb_options_.enable` has precedence, so if enabled, ignore any - // other related features. - if (https_svcb_options_.enable && out_job_key.host.HasScheme()) { + // Optimistically enable HTTPS record. It may be skipped at a later point. + if (base::FeatureList::IsEnabled(features::kUseDnsHttpsSvcb) && + out_job_key.host.HasScheme()) { static constexpr std::string_view kSchemesForHttpsQuery[] = { url::kHttpScheme, url::kHttpsScheme, url::kWsScheme, url::kWssScheme}; if (base::Contains(kSchemesForHttpsQuery, out_job_key.host.GetScheme())) { @@ -1473,7 +1469,7 @@ bool RequestWillUseWiFi(handles::NetworkHandle network) { void HostResolverManager::FinishIPv6ReachabilityCheck( CompletionOnceCallback callback, int rv) { - SetLastIPv6ProbeResult((rv == OK) ? true : false); + SetLastIPv6ProbeResult(rv == OK); std::move(callback).Run(OK); if (!ipv6_request_callbacks_.empty()) { std::vector tmp_request_callbacks; @@ -1514,7 +1510,7 @@ int HostResolverManager::StartIPv6ReachabilityCheck( base::BindOnce(&HostResolverManager::FinishIPv6ReachabilityCheck, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); if (rv != ERR_IO_PENDING) { - SetLastIPv6ProbeResult((rv == OK) ? true : false); + SetLastIPv6ProbeResult(rv == OK); rv = OK; } cached = false; @@ -1683,7 +1679,8 @@ void HostResolverManager::TryServingAllJobsFromHosts() { } } -void HostResolverManager::OnIPAddressChanged() { +void HostResolverManager::OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) { DCHECK(!IsBoundToNetwork()); last_ipv6_probe_time_ = base::TimeTicks(); // Abandon all ProbeJobs. diff --git a/naiveproxy/src/net/dns/host_resolver_manager.h b/naiveproxy/src/net/dns/host_resolver_manager.h index 2dd74fd66b..a104476b6c 100644 --- a/naiveproxy/src/net/dns/host_resolver_manager.h +++ b/naiveproxy/src/net/dns/host_resolver_manager.h @@ -281,6 +281,8 @@ class NET_EXPORT HostResolverManager handles::NetworkHandle target_network, NetLog* net_log); + bool InvalidationInProgress() const { return invalidation_in_progress_; } + protected: // Callback from HaveOnlyLoopbackAddresses probe. void SetHaveOnlyLoopbackAddresses(bool result); @@ -508,7 +510,8 @@ class NET_EXPORT HostResolverManager void TryServingAllJobsFromHosts(); // NetworkChangeNotifier::IPAddressObserver: - void OnIPAddressChanged() override; + void OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) override; // NetworkChangeNotifier::ConnectionTypeObserver: void OnConnectionTypeChanged( @@ -597,6 +600,8 @@ class NET_EXPORT HostResolverManager true /* check_empty */, false /* allow_reentrancy */> registered_contexts_; + + // True while invalidating caches. bool invalidation_in_progress_ = false; // An experimental flag for features::kUseDnsHttpsSvcb. diff --git a/naiveproxy/src/net/dns/host_resolver_manager_job.cc b/naiveproxy/src/net/dns/host_resolver_manager_job.cc index 474becb878..06fd207593 100644 --- a/naiveproxy/src/net/dns/host_resolver_manager_job.cc +++ b/naiveproxy/src/net/dns/host_resolver_manager_job.cc @@ -85,14 +85,6 @@ base::Value::Dict NetLogJobAttachParams(const NetLogSource& source, return dict; } -bool IsSchemeHttpsOrWss(const HostResolver::Host& host) { - if (!host.HasScheme()) { - return false; - } - const std::string& scheme = host.GetScheme(); - return scheme == url::kHttpsScheme || scheme == url::kWssScheme; -} - } // namespace HostResolverManager::JobKey::JobKey(HostResolver::Host host, @@ -660,6 +652,7 @@ void HostResolverManager::Job::OnSystemTaskComplete( // This HostResolverSystemTask was a fallback resolution after a failed // insecure DnsTask. resolver_->OnFallbackResolve(dns_task_error_); + fallback_to_system_task_after_dns_task_ = true; } if (ContainsIcannNameCollisionIp(addr_list.endpoints())) { @@ -716,6 +709,7 @@ void HostResolverManager::Job::StartDnsTask(bool secure) { key_.query_types, &*key_.resolve_context, secure, key_.secure_dns_mode, this, net_log_, tick_clock_, !tasks_.empty() /* fallback_available */, https_svcb_options_); + dns_task_executed_ = true; if (resolver_->IsHappyEyeballsV3Enabled()) { dns_task_results_manager_ = std::make_unique( this, key_.host, key_.query_types, net_log_); @@ -750,18 +744,17 @@ void HostResolverManager::Job::OnDnsTaskFailure( bool secure) { DCHECK_NE(OK, failure_results.error()); - if (!secure) { - DCHECK_NE(key_.secure_dns_mode, SecureDnsMode::kSecure); - UMA_HISTOGRAM_LONG_TIMES_100("Net.DNS.InsecureDnsTask.FailureTime", - duration); - } + base::UmaHistogramLongTimes100( + base::StrCat( + {"Net.DNS.DnsTask.", secure ? "Secure" : "Insecure", ".FailureTime"}), + duration); if (!dns_task) { return; } - UMA_HISTOGRAM_LONG_TIMES_100("Net.DNS.JobQueueTime.Failure", - total_transaction_time_queued_); + base::UmaHistogramLongTimes100("Net.DNS.JobQueueTime.Failure", + total_transaction_time_queued_); // If one of the fallback tasks doesn't complete the request, store a result // to use during request completion. @@ -806,10 +799,15 @@ void HostResolverManager::Job::OnDnsTaskComplete( return; } - UMA_HISTOGRAM_LONG_TIMES_100("Net.DNS.DnsTask.SuccessTime", duration); + dns_task_https_disabled_ = dns_task_->https_disabled(); - UMA_HISTOGRAM_LONG_TIMES_100("Net.DNS.JobQueueTime.Success", - total_transaction_time_queued_); + base::UmaHistogramLongTimes100( + base::StrCat( + {"Net.DNS.DnsTask.", secure ? "Secure" : "Insecure", ".SuccessTime"}), + duration); + + base::UmaHistogramLongTimes100("Net.DNS.JobQueueTime.Success", + total_transaction_time_queued_); // Reset the insecure DNS failure counter if an insecure DnsTask completed // successfully. @@ -952,10 +950,18 @@ void HostResolverManager::Job::StartNat64Task() { weak_ptr_factory_.GetWeakPtr())); } -void HostResolverManager::Job::OnNat64TaskComplete() { - DCHECK(nat64_task_); - HostCache::Entry results = nat64_task_->GetResults(); - CompleteRequestsWithoutCache(results, std::nullopt /* stale_info */, +void HostResolverManager::Job::OnNat64TaskComplete( + std::unique_ptr result) { + CHECK(nat64_task_); + CHECK(result); + + std::set> results; + results.insert(std::move(result)); + HostCache::Entry legacy_results(results, base::Time::Now(), + tick_clock_->NowTicks(), + HostCache::Entry::SOURCE_UNKNOWN); + + CompleteRequestsWithoutCache(legacy_results, /*stale_info=*/std::nullopt, TaskType::NAT64); } @@ -1008,23 +1014,39 @@ void HostResolverManager::Job::RecordJobHistograms( base::UmaHistogramSparse("Net.DNS.ResolveError.Slow", std::abs(error)); } } +} - if (error == OK) { - DCHECK(task_type.has_value()); - // Record, for HTTPS-capable queries to a host known to serve HTTPS - // records, whether the HTTPS record was successfully received. - if (key_.query_types.Has(DnsQueryType::HTTPS) && - // Skip http- and ws-schemed hosts. Although they query HTTPS records, - // successful queries are reported as errors, which would skew the - // metrics. - IsSchemeHttpsOrWss(key_.host) && - IsGoogleHostWithAlpnH3(key_.host.GetHostnameWithoutBrackets())) { - bool has_metadata = !results.GetMetadatas().empty(); - base::UmaHistogramExactLinear( - "Net.DNS.H3SupportedGoogleHost.TaskTypeMetadataAvailability2", - static_cast(task_type.value()) * 2 + (has_metadata ? 1 : 0), - (static_cast(TaskType::kMaxValue) + 1) * 2); - } +void HostResolverManager::Job::RecordJobHttpsHistograms() { + const bool https_attempted = key_.query_types.Has(DnsQueryType::HTTPS) && + dns_task_executed_ && !dns_task_https_disabled_; + base::UmaHistogramBoolean("Net.DNS.JobAttemptedHttps", https_attempted); + + if (!https_attempted) { + auto calculate_reason = [&]() { + if (!base::FeatureList::IsEnabled(features::kUseDnsHttpsSvcb)) { + return HttpsNotAttemptedReason::kQueryingHttpsDisabled; + } + if (!base::FeatureList::IsEnabled(features::kAsyncDns)) { + return HttpsNotAttemptedReason::kBuiltInResolverDisabled; + } + if (!resolver_->dns_client_) { + return HttpsNotAttemptedReason::kNoDnsClient; + } + if (resolver_->dns_client_->FallbackFromInsecureTransactionPreferred()) { + return HttpsNotAttemptedReason:: + kFallbackFromInsecureTransactionPreferred; + } + if (dns_task_https_disabled_) { + return HttpsNotAttemptedReason::kInsecureDnsTaskDisabled; + } + if (fallback_to_system_task_after_dns_task_) { + return HttpsNotAttemptedReason::kFallbackToSystemTaskAfterDnsTask; + } + return HttpsNotAttemptedReason::kUnknown; + }; + + base::UmaHistogramEnumeration("Net.DNS.JobHttpsNotAttemptedReason", + calculate_reason()); } } @@ -1074,6 +1096,10 @@ void HostResolverManager::Job::CompleteRequests( } RecordJobHistograms(results, task_type); + if (results.error() == OK && had_non_speculative_request_ && + key_.source == HostResolverSource::ANY) { + RecordJobHttpsHistograms(); + } // Complete all of the requests that were attached to the job and // detach them. diff --git a/naiveproxy/src/net/dns/host_resolver_manager_job.h b/naiveproxy/src/net/dns/host_resolver_manager_job.h index 214e075e80..5da06cbf5c 100644 --- a/naiveproxy/src/net/dns/host_resolver_manager_job.h +++ b/naiveproxy/src/net/dns/host_resolver_manager_job.h @@ -33,6 +33,7 @@ namespace net { class ResolveContext; +class HostResolverInternalResult; class HostResolverMdnsTask; class HostResolverNat64Task; @@ -150,6 +151,31 @@ class HostResolverManager::Job : public PrioritizedDispatcher::Job, } private: + // Explains why a Job didn't attempt HTTPS query. + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + // + // LINT.IfChange(HttpsNotAttemptedReason) + enum class HttpsNotAttemptedReason { + // The reason is unknown. This is the last resort option and should be + // avoided as much as possible. + kUnknown = 0, + // Querying HTTPS is disabled. + kQueryingHttpsDisabled = 1, + // Built-in DNS resolver is disabled. + kBuiltInResolverDisabled = 2, + // No DnsClient. + kNoDnsClient = 3, + // DnsTask wasn't scheduled because it hadn't been working for a while. + kFallbackFromInsecureTransactionPreferred = 4, + // Insecure DnsTask was not allowed to query HTTPS. + kInsecureDnsTaskDisabled = 5, + // DnsTask was executed but fell back to the system task. + kFallbackToSystemTaskAfterDnsTask = 6, + kMaxValue = kFallbackToSystemTaskAfterDnsTask, + }; + // LINT.ThenChange(//tools/metrics/histograms/metadata/net/enums.xml:HttpsNotAttemptedReason) + // Keeps track of the highest priority. class PriorityTracker { public: @@ -256,11 +282,13 @@ class HostResolverManager::Job : public PrioritizedDispatcher::Job, void OnMdnsImmediateFailure(int rv); void StartNat64Task(); - void OnNat64TaskComplete(); + void OnNat64TaskComplete(std::unique_ptr result); void RecordJobHistograms(const HostCache::Entry& results, std::optional task_type); + void RecordJobHttpsHistograms(); + void MaybeCacheResult(const HostCache::Entry& results, base::TimeDelta ttl, bool secure); @@ -330,6 +358,13 @@ class HostResolverManager::Job : public PrioritizedDispatcher::Job, // Result of DnsTask. int dns_task_error_ = OK; + // Set to true when this Job executed DnsTask. + bool dns_task_executed_ = false; + + // Set to whether DnsTask disabled HTTPS query. Set only when DnsTask + // succeeds. + bool dns_task_https_disabled_ = false; + raw_ptr tick_clock_; base::TimeTicks start_time_; @@ -341,6 +376,9 @@ class HostResolverManager::Job : public PrioritizedDispatcher::Job, // for tests. std::unique_ptr system_task_; + // Set to true when this Job falls back to the system DNS task after DNS task. + bool fallback_to_system_task_after_dns_task_ = false; + // Resolves the host using a DnsTransaction. std::unique_ptr dns_task_; diff --git a/naiveproxy/src/net/dns/host_resolver_manager_request_impl.cc b/naiveproxy/src/net/dns/host_resolver_manager_request_impl.cc index ff3fe17763..bcbf84da6f 100644 --- a/naiveproxy/src/net/dns/host_resolver_manager_request_impl.cc +++ b/naiveproxy/src/net/dns/host_resolver_manager_request_impl.cc @@ -318,7 +318,7 @@ int HostResolverManager::RequestImpl::DoGetParameters() { int HostResolverManager::RequestImpl::DoGetParametersComplete(int rv) { next_state_ = STATE_RESOLVE_LOCALLY; - only_ipv6_reachable_ = (rv == ERR_FAILED) ? true : false; + only_ipv6_reachable_ = (rv == ERR_FAILED); return OK; } diff --git a/naiveproxy/src/net/dns/host_resolver_nat64_task.cc b/naiveproxy/src/net/dns/host_resolver_nat64_task.cc index d0acf79a45..ee4b0306bc 100644 --- a/naiveproxy/src/net/dns/host_resolver_nat64_task.cc +++ b/naiveproxy/src/net/dns/host_resolver_nat64_task.cc @@ -5,8 +5,11 @@ #include "net/dns/host_resolver_nat64_task.h" #include +#include +#include #include #include +#include #include "base/check_op.h" #include "base/functional/bind.h" @@ -16,10 +19,13 @@ #include "base/notreached.h" #include "base/strings/string_util.h" #include "base/task/sequenced_task_runner.h" +#include "base/time/time.h" #include "net/base/address_list.h" +#include "net/base/host_port_pair.h" #include "net/base/ip_endpoint.h" #include "net/base/net_errors.h" #include "net/dns/host_resolver.h" +#include "net/dns/host_resolver_internal_result.h" #include "net/dns/host_resolver_manager.h" #include "net/dns/public/dns_query_type.h" @@ -41,26 +47,24 @@ HostResolverNat64Task::~HostResolverNat64Task() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } -void HostResolverNat64Task::Start(base::OnceClosure completion_closure) { +void HostResolverNat64Task::Start(CallbackType completion_callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(!completion_closure_); + CHECK(!completion_callback_); + CHECK(!result_); + CHECK(completion_callback); - completion_closure_ = std::move(completion_closure); + completion_callback_ = std::move(completion_callback); next_state_ = State::kResolve; int rv = DoLoop(OK); if (rv != ERR_IO_PENDING) { + CHECK(result_); base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, std::move(completion_closure_)); + FROM_HERE, + base::BindOnce(std::move(completion_callback_), std::move(result_))); } } -HostCache::Entry HostResolverNat64Task::GetResults() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(!completion_closure_); - return results_; -} - int HostResolverNat64Task::DoLoop(int result) { DCHECK_NE(next_state_, State::kStateNone); int rv = result; @@ -110,10 +114,20 @@ int HostResolverNat64Task::DoResolveComplete(int result) { IPAddress ipv4_address; bool is_ip = ipv4_address.AssignFromIPLiteral(hostname_); DCHECK(is_ip); - std::set aliases; - results_ = - HostCache::Entry(OK, {IPEndPoint(ipv4_address, 0)}, std::move(aliases), - HostCache::Entry::SOURCE_UNKNOWN); + + // Use Now() for expiration times. HostResolverManager is not expected to + // try to cache Nat64 results, and there isn't a known TTL to use. From a + // practical perspective, because subsequent transformation is static, the + // important thing to cache is the "ipv4only.arpa" resolution that the + // resolver should already be caching if possible. + result_ = std::make_unique( + hostname_, DnsQueryType::UNSPECIFIED, + /*expiration=*/base::TimeTicks::Now(), + /*timed_expiration=*/base::Time::Now(), + HostResolverInternalResult::Source::kUnknown, + std::vector{IPEndPoint(ipv4_address, 0)}, + /*strings=*/std::vector{}, + /*hosts=*/std::vector{}); return OK; } @@ -147,22 +161,32 @@ int HostResolverNat64Task::DoSynthesizeToIpv6() { } } - std::set aliases; - if (converted_addresses.empty()) { converted_addresses = {IPEndPoint(ipv4_address, 0)}; } - results_ = - HostCache::Entry(OK, std::move(converted_addresses), std::move(aliases), - HostCache::Entry::SOURCE_UNKNOWN); + // Use Now() for expiration times. HostResolverManager is not expected to + // try to cache Nat64 results, and there isn't a known TTL to use. From a + // practical perspective, because subsequent transformation is static, the + // important thing to cache is the "ipv4only.arpa" resolution that the + // resolver should already be caching if possible. + result_ = std::make_unique( + hostname_, DnsQueryType::UNSPECIFIED, + /*expiration=*/base::TimeTicks::Now(), + /*timed_expiration=*/base::Time::Now(), + HostResolverInternalResult::Source::kUnknown, + std::move(converted_addresses), + /*strings=*/std::vector{}, + /*hosts=*/std::vector{}); return OK; } void HostResolverNat64Task::OnIOComplete(int result) { result = DoLoop(result); - if (result != ERR_IO_PENDING) - std::move(completion_closure_).Run(); + if (result != ERR_IO_PENDING) { + CHECK(result_); + std::move(completion_callback_).Run(std::move(result_)); + } } } // namespace net diff --git a/naiveproxy/src/net/dns/host_resolver_nat64_task.h b/naiveproxy/src/net/dns/host_resolver_nat64_task.h index e95bb3b00a..2127796e32 100644 --- a/naiveproxy/src/net/dns/host_resolver_nat64_task.h +++ b/naiveproxy/src/net/dns/host_resolver_nat64_task.h @@ -20,7 +20,7 @@ namespace net { -class HostCache; +class HostResolverInternalResult; // Representation of a single HostResolverImpl::Job task to convert an IPv4 // address literal to an IPv4-Embedded IPv6 according to rfc6052. @@ -29,6 +29,9 @@ class HostCache; // Destruction cancels the task and prevents any callbacks from being invoked. class HostResolverNat64Task { public: + using CallbackType = + base::OnceCallback)>; + HostResolverNat64Task(std::string_view hostname, NetworkAnonymizationKey network_anonymization_key, NetLogWithSource net_log, @@ -41,17 +44,14 @@ class HostResolverNat64Task { ~HostResolverNat64Task(); // Should only be called once. - void Start(base::OnceClosure completion_closure); - - // Results only available after invocation of the completion closure. - HostCache::Entry GetResults() const; + void Start(CallbackType completion_callback); private: const std::string hostname_; const NetworkAnonymizationKey network_anonymization_key_; NetLogWithSource net_log_; const raw_ptr resolve_context_; - base::OnceClosure completion_closure_; + CallbackType completion_callback_; base::WeakPtr resolver_; SEQUENCE_CHECKER(sequence_checker_); @@ -73,9 +73,8 @@ class HostResolverNat64Task { State next_state_ = State::kStateNone; std::unique_ptr request_ipv4onlyarpa_; + std::unique_ptr result_; - HostCache::Entry results_ = - HostCache::Entry(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); base::WeakPtrFactory weak_ptr_factory_{this}; }; diff --git a/naiveproxy/src/net/dns/host_resolver_system_task.cc b/naiveproxy/src/net/dns/host_resolver_system_task.cc index 85776a47c2..e0a87a6d87 100644 --- a/naiveproxy/src/net/dns/host_resolver_system_task.cc +++ b/naiveproxy/src/net/dns/host_resolver_system_task.cc @@ -41,6 +41,7 @@ #include "net/dns/dns_names_util.h" #include "net/dns/host_resolver_cache.h" #include "net/dns/host_resolver_internal_result.h" +#include "net/dns/public/dns_query_type.h" #include "net/dns/public/host_resolver_source.h" #if BUILDFLAG(IS_WIN) @@ -52,13 +53,6 @@ namespace net { namespace { -// System resolver results give no TTL, so a default caching time is needed. -// Pick 1 minute to match the minimum cache time for built-in resolver results -// because this is only serving as a secondary cache to the caching done by the -// system. Additionally, this matches the long-standing historical behavior from -// previous implementations of HostResolver caching. -constexpr base::TimeDelta kTtl = base::Minutes(1); - // Returns nullptr in the common case, or a task runner if the default has // been overridden. scoped_refptr& GetSystemDnsResolutionTaskRunnerOverride() { @@ -184,6 +178,41 @@ SystemDnsResolverOverrideCallback& GetSystemDnsResolverOverride() { return *dns_override; } +std::unique_ptr CreateEndpointsInternalResult( + std::string domain_name, + std::vector endpoints, + DnsQueryType query_type, + base::Time now, + base::TimeTicks now_ticks) { + if (endpoints.empty()) { + return std::make_unique( + std::move(domain_name), query_type, + now_ticks + HostResolverSystemTask::kTtl, + now + HostResolverSystemTask::kTtl, + HostResolverInternalResult::Source::kUnknown, ERR_NAME_NOT_RESOLVED); + } else { + return std::make_unique( + std::move(domain_name), query_type, + now_ticks + HostResolverSystemTask::kTtl, + now + HostResolverSystemTask::kTtl, + HostResolverInternalResult::Source::kUnknown, std::move(endpoints), + std::vector{}, std::vector{}); + } +} + +std::unique_ptr CreateAliasInternalResult( + std::string domain_name, + DnsQueryType query_type, + std::string target_name, + base::Time now, + base::TimeTicks now_ticks) { + return std::make_unique( + std::move(domain_name), query_type, + now_ticks + HostResolverSystemTask::kTtl, + now + HostResolverSystemTask::kTtl, + HostResolverInternalResult::Source::kUnknown, std::move(target_name)); +} + } // namespace void SetSystemDnsResolverOverride( @@ -297,6 +326,64 @@ void HostResolverSystemTask::Start(SystemDnsResultsCallback results_cb) { StartLookupAttempt(); } +// static +std::set> +HostResolverSystemTask::ConvertSystemResults(std::string_view domain_name, + DnsQueryTypeSet query_types, + const AddressList& address_list, + base::Time now, + base::TimeTicks now_ticks) { + query_types = + Intersection(query_types, {DnsQueryType::A, DnsQueryType::AAAA}); + CHECK(!query_types.empty()); + + // Split out IPv4 and IPv6 endpoints while keeping them in the received order. + std::vector ipv4; + std::vector ipv6; + for (const IPEndPoint& endpoint : address_list) { + switch (endpoint.GetFamily()) { + case ADDRESS_FAMILY_IPV4: + ipv4.push_back(endpoint); + break; + case ADDRESS_FAMILY_IPV6: + ipv6.push_back(endpoint); + break; + default: + // Expect only IPv4 and IPv6 endpoints from system resolver. + NOTREACHED(); + } + } + + std::set> results; + + if (!address_list.dns_aliases().empty()) { + // Expect at most one alias from system resolver. + CHECK_EQ(address_list.dns_aliases().size(), 1u); + + // Save one alias cache entry for each query type. + for (DnsQueryType query_type : query_types) { + results.insert(CreateAliasInternalResult( + std::string(domain_name), query_type, + address_list.dns_aliases().front(), now, now_ticks)); + } + + domain_name = address_list.dns_aliases().front(); + } + + if (query_types.Has(DnsQueryType::A)) { + results.insert( + CreateEndpointsInternalResult(std::string(domain_name), std::move(ipv4), + DnsQueryType::A, now, now_ticks)); + } + if (query_types.Has(DnsQueryType::AAAA)) { + results.insert( + CreateEndpointsInternalResult(std::string(domain_name), std::move(ipv6), + DnsQueryType::AAAA, now, now_ticks)); + } + + return results; +} + void HostResolverSystemTask::StartLookupAttempt() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!was_completed()); @@ -392,77 +479,39 @@ void HostResolverSystemTask::MaybeCacheResults( !base::FeatureList::IsEnabled(features::kUseHostResolverCache)) { return; } - CHECK(hostname_.has_value()); - // Split out IPv4 and IPv6 endpoints while keeping them in the received order. - std::vector ipv4; - std::vector ipv6; - for (const IPEndPoint& endpoint : address_list) { - switch (endpoint.GetFamily()) { - case ADDRESS_FAMILY_IPV4: - ipv4.push_back(endpoint); - break; - case ADDRESS_FAMILY_IPV6: - ipv6.push_back(endpoint); - break; - default: - // Expect only IPv4 and IPv6 endpoints from system resolver. - NOTREACHED(); - } - } - CHECK(!ipv4.empty() || !ipv6.empty()); - - std::string_view domain_name = hostname_.value(); - if (!address_list.dns_aliases().empty()) { - // Expect at most one alias from system resolver. - CHECK_EQ(address_list.dns_aliases().size(), 1u); - - // Save one alias cache entry for each query type. - CacheAlias(std::string(domain_name), DnsQueryType::A, - address_list.dns_aliases().front()); - CacheAlias(std::string(domain_name), DnsQueryType::AAAA, - address_list.dns_aliases().front()); - - domain_name = address_list.dns_aliases().front(); - } - - CacheEndpoints(std::string(domain_name), std::move(ipv4), DnsQueryType::A); - CacheEndpoints(std::string(domain_name), std::move(ipv6), DnsQueryType::AAAA); -} - -void HostResolverSystemTask::CacheEndpoints(std::string domain_name, - std::vector endpoints, - DnsQueryType query_type) { - if (endpoints.empty()) { - cache_params_.value().cache->Set( - std::make_unique( - std::move(domain_name), query_type, base::TimeTicks::Now() + kTtl, - base::Time::Now() + kTtl, - HostResolverInternalResult::Source::kUnknown, - ERR_NAME_NOT_RESOLVED), - cache_params_.value().network_anonymization_key, - HostResolverSource::SYSTEM, /*secure=*/false); + DnsQueryTypeSet query_types; + if (address_family_ == ADDRESS_FAMILY_UNSPECIFIED) { + query_types = {DnsQueryType::A, DnsQueryType::AAAA}; + } else if (address_family_ == ADDRESS_FAMILY_IPV4) { + query_types = {DnsQueryType::A}; } else { - cache_params_.value().cache->Set( - std::make_unique( - std::move(domain_name), query_type, base::TimeTicks::Now() + kTtl, - base::Time::Now() + kTtl, - HostResolverInternalResult::Source::kUnknown, std::move(endpoints), - std::vector{}, std::vector{}), - cache_params_.value().network_anonymization_key, - HostResolverSource::SYSTEM, /*secure=*/false); + CHECK_EQ(address_family_, ADDRESS_FAMILY_IPV6); + query_types = {DnsQueryType::AAAA}; } + + CHECK(hostname_.has_value()); + std::set> results = + ConvertSystemResults(hostname_.value(), query_types, address_list, + base::Time::Now(), base::TimeTicks::Now()); + + bool found_endpoints = false; + for (auto it = results.begin(); it != results.end();) { + if ((*it)->type() == HostResolverInternalResult::Type::kData) { + found_endpoints = true; + } + CacheResult(std::move(results.extract(it++).value())); + } + + // Expect to cache at least one address result because `address_list` is + // non-empty. + CHECK(found_endpoints); } -void HostResolverSystemTask::CacheAlias(std::string domain_name, - DnsQueryType query_type, - std::string target_name) { +void HostResolverSystemTask::CacheResult( + std::unique_ptr result) { cache_params_.value().cache->Set( - std::make_unique( - std::move(domain_name), query_type, base::TimeTicks::Now() + kTtl, - base::Time::Now() + kTtl, - HostResolverInternalResult::Source::kUnknown, std::move(target_name)), - cache_params_.value().network_anonymization_key, + std::move(result), cache_params_.value().network_anonymization_key, HostResolverSource::SYSTEM, /*secure=*/false); } diff --git a/naiveproxy/src/net/dns/host_resolver_system_task.h b/naiveproxy/src/net/dns/host_resolver_system_task.h index d0851558b8..4edde3e2b2 100644 --- a/naiveproxy/src/net/dns/host_resolver_system_task.h +++ b/naiveproxy/src/net/dns/host_resolver_system_task.h @@ -5,19 +5,25 @@ #ifndef NET_DNS_HOST_RESOLVER_SYSTEM_TASK_H_ #define NET_DNS_HOST_RESOLVER_SYSTEM_TASK_H_ +#include #include +#include #include +#include #include #include "base/functional/callback.h" #include "base/functional/callback_helpers.h" #include "base/memory/raw_ref.h" +#include "base/sequence_checker.h" #include "base/task/task_runner.h" +#include "base/time/time.h" #include "net/base/address_list.h" #include "net/base/ip_endpoint.h" #include "net/base/net_export.h" #include "net/base/network_anonymization_key.h" #include "net/base/network_handle.h" +#include "net/dns/host_resolver_internal_result.h" #include "net/dns/host_resolver_proc.h" #include "net/dns/public/dns_query_type.h" #include "net/log/net_log_with_source.h" @@ -126,6 +132,16 @@ class NET_EXPORT HostResolverSystemTask { const NetLogWithSource& job_net_log = NetLogWithSource(), handles::NetworkHandle network = handles::kInvalidNetworkHandle); + // Caching time used for entries cached by the task and for creation of + // results in ConvertSystemResults(). + // + // System resolver results give no TTL, so an arbitrary caching time is + // needed. Pick 1 minute to match the minimum cache time for built-in resolver + // results because this is only serving as a secondary cache to the caching + // done by the system. Additionally, this matches the long-standing historical + // behavior from previous implementations of HostResolver caching. + constexpr static base::TimeDelta kTtl = base::Minutes(1); + // If `hostname` is std::nullopt, resolves the result of GetHostName(). // Prefer using the above 2 static functions for constructing a // HostResolverSystemTask. @@ -156,6 +172,15 @@ class NET_EXPORT HostResolverSystemTask { return results_cb_.is_null(); } + // Helper to convert AddressList results as produced by HostResolverSystemTask + // into a HostResolverInternalResult set. + static std::set> + ConvertSystemResults(std::string_view domain_name, + DnsQueryTypeSet query_types, + const AddressList& address_list, + base::Time now, + base::TimeTicks now_ticks); + private: void StartLookupAttempt(); @@ -166,12 +191,7 @@ class NET_EXPORT HostResolverSystemTask { int error); void MaybeCacheResults(const AddressList& address_list); - void CacheEndpoints(std::string domain_name, - std::vector endpoints, - DnsQueryType query_type); - void CacheAlias(std::string domain_name, - DnsQueryType query_type, - std::string target_name); + void CacheResult(std::unique_ptr result); // If `hostname_` is std::nullopt, this class should resolve the result of // net::GetHostName() (the machine's own hostname). diff --git a/naiveproxy/src/net/dns/mapped_host_resolver.cc b/naiveproxy/src/net/dns/mapped_host_resolver.cc index 588fac6bc4..1c5cfaff06 100644 --- a/naiveproxy/src/net/dns/mapped_host_resolver.cc +++ b/naiveproxy/src/net/dns/mapped_host_resolver.cc @@ -43,7 +43,7 @@ MappedHostResolver::CreateRequest( switch (result) { case HostMappingRules::RewriteResult::kRewritten: DCHECK(rewritten_url.is_valid()); - DCHECK_NE(rewritten_url.host_piece(), "^NOTFOUND"); + DCHECK_NE(rewritten_url.host(), "^NOTFOUND"); return impl_->CreateRequest(url::SchemeHostPort(rewritten_url), std::move(network_anonymization_key), std::move(source_net_log), @@ -90,7 +90,7 @@ MappedHostResolver::CreateServiceEndpointRequest( switch (result) { case HostMappingRules::RewriteResult::kRewritten: DCHECK(rewritten_url.is_valid()); - DCHECK_NE(rewritten_url.host_piece(), "^NOTFOUND"); + DCHECK_NE(rewritten_url.host(), "^NOTFOUND"); return impl_->CreateServiceEndpointRequest( Host(url::SchemeHostPort(rewritten_url)), std::move(network_anonymization_key), std::move(net_log), diff --git a/naiveproxy/src/net/dns/mock_host_resolver.h b/naiveproxy/src/net/dns/mock_host_resolver.h index 761b1b41c5..6cbb1e46be 100644 --- a/naiveproxy/src/net/dns/mock_host_resolver.h +++ b/naiveproxy/src/net/dns/mock_host_resolver.h @@ -19,6 +19,7 @@ #include #include "base/memory/raw_ptr.h" +#include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/synchronization/lock.h" #include "base/synchronization/waitable_event.h" diff --git a/naiveproxy/src/net/dns/mock_mdns_socket_factory.cc b/naiveproxy/src/net/dns/mock_mdns_socket_factory.cc index a9cb108cbb..4793bdc13a 100644 --- a/naiveproxy/src/net/dns/mock_mdns_socket_factory.cc +++ b/naiveproxy/src/net/dns/mock_mdns_socket_factory.cc @@ -8,6 +8,7 @@ #include #include "base/compiler_specific.h" +#include "base/containers/span.h" #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" #include "base/location.h" @@ -95,13 +96,13 @@ void MockMDnsSocketFactory::CreateSocket( sockets->push_back(std::move(new_socket)); } -void MockMDnsSocketFactory::SimulateReceive(const uint8_t* packet, int size) { - DCHECK(recv_buffer_size_ >= size); +void MockMDnsSocketFactory::SimulateReceive(base::span packet) { + DCHECK_GE(recv_buffer_size_, static_cast(packet.size())); DCHECK(recv_buffer_.get()); DCHECK(!recv_callback_.is_null()); - UNSAFE_TODO(memcpy(recv_buffer_->data(), packet, size)); - std::move(recv_callback_).Run(size); + recv_buffer_->span().copy_prefix_from(packet); + std::move(recv_callback_).Run(packet.size()); } int MockMDnsSocketFactory::RecvFromInternal(IOBuffer* buffer, diff --git a/naiveproxy/src/net/dns/mock_mdns_socket_factory.h b/naiveproxy/src/net/dns/mock_mdns_socket_factory.h index b746dad95a..734bd399b9 100644 --- a/naiveproxy/src/net/dns/mock_mdns_socket_factory.h +++ b/naiveproxy/src/net/dns/mock_mdns_socket_factory.h @@ -11,6 +11,7 @@ #include #include +#include "base/containers/span.h" #include "net/base/completion_once_callback.h" #include "net/base/completion_repeating_callback.h" #include "net/dns/mdns_client_impl.h" @@ -100,7 +101,7 @@ class MockMDnsSocketFactory : public MDnsSocketFactory { void CreateSockets( std::vector>* sockets) override; - void SimulateReceive(const uint8_t* packet, int size); + void SimulateReceive(base::span packet); MOCK_METHOD1(OnSendTo, void(const std::string&)); diff --git a/naiveproxy/src/net/dns/opt_record_rdata.cc b/naiveproxy/src/net/dns/opt_record_rdata.cc index c0c43b309a..a86ad34f9c 100644 --- a/naiveproxy/src/net/dns/opt_record_rdata.cc +++ b/naiveproxy/src/net/dns/opt_record_rdata.cc @@ -7,8 +7,11 @@ #include #include #include +#include +#include #include #include +#include #include "base/big_endian.h" #include "base/check_is_test.h" @@ -16,11 +19,15 @@ #include "base/containers/span.h" #include "base/containers/span_reader.h" #include "base/containers/span_writer.h" +#include "base/json/json_reader.h" +#include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/numerics/safe_conversions.h" #include "base/strings/string_util.h" #include "base/strings/string_view_util.h" #include "base/types/optional_util.h" +#include "base/values.h" +#include "net/base/features.h" #include "net/dns/public/dns_protocol.h" namespace net { @@ -36,6 +43,50 @@ std::vector SerializeEdeOpt(uint16_t info_code, CHECK_EQ(writer.remaining(), 0u); return buf; } + +std::optional GetFilteringDetailsString( + const base::Value::Dict& dict, + std::string_view key) { + const std::string* val = dict.FindString(key); + if (!val) { + return std::nullopt; + } + if (!base::IsStringUTF8(*val)) { + return std::nullopt; + } + return *val; +} + +// Parses the Filtering Details (db and id from fdbs) from the EDE extra text. +std::vector ParseFilteringDetails( + std::string_view json) { + std::optional value = + base::JSONReader::Read(json, base::JSON_PARSE_RFC); + if (!value || !value->is_dict()) { + return {}; + } + const base::Value::Dict& dict = value->GetDict(); + const base::ListValue* dbs = dict.FindList("fdbs"); + if (!dbs) { + return {}; + } + std::vector filtering_details; + for (const auto& fdb : *dbs) { + if (!fdb.is_dict()) { + continue; + } + const base::Value::Dict& entry = fdb.GetDict(); + auto db = GetFilteringDetailsString(entry, "db"); + auto id = GetFilteringDetailsString(entry, "id"); + if (db && id) { + OptRecordRdata::EdeOpt::FilteringDetails meta; + meta.resolver_operator_id = std::move(*db); + meta.filtering_incident_id = std::move(*id); + filtering_details.push_back(std::move(meta)); + } + } + return filtering_details; +} } // namespace OptRecordRdata::Opt::~Opt() = default; @@ -59,6 +110,18 @@ OptRecordRdata::EdeOpt::EdeOpt(uint16_t info_code, std::string extra_text) extra_text_(std::move(extra_text)) { CHECK(base::IsStringUTF8(extra_text_)); } +OptRecordRdata::EdeOpt::FilteringDetails::FilteringDetails() = default; +OptRecordRdata::EdeOpt::FilteringDetails::~FilteringDetails() = default; +OptRecordRdata::EdeOpt::FilteringDetails::FilteringDetails( + const FilteringDetails&) = default; +OptRecordRdata::EdeOpt::FilteringDetails& +OptRecordRdata::EdeOpt::FilteringDetails::operator=(const FilteringDetails&) = + default; +OptRecordRdata::EdeOpt::FilteringDetails::FilteringDetails( + FilteringDetails&&) noexcept = default; +OptRecordRdata::EdeOpt::FilteringDetails& +OptRecordRdata::EdeOpt::FilteringDetails::operator=( + FilteringDetails&&) noexcept = default; OptRecordRdata::EdeOpt::~EdeOpt() = default; @@ -78,9 +141,12 @@ std::unique_ptr OptRecordRdata::EdeOpt::Create( if (!base::IsStringUTF8(base::as_string_view(extra_text))) { return nullptr; } - - return std::make_unique( + auto ede = std::make_unique( info_code, std::string(base::as_string_view(extra_text))); + if (base::FeatureList::IsEnabled(net::features::kDnsFilteringDetails)) { + ede->filtering_details_ = ParseFilteringDetails(ede->extra_text()); + } + return ede; } uint16_t OptRecordRdata::EdeOpt::GetCode() const { diff --git a/naiveproxy/src/net/dns/opt_record_rdata.h b/naiveproxy/src/net/dns/opt_record_rdata.h index 62271fdc5c..836e585be9 100644 --- a/naiveproxy/src/net/dns/opt_record_rdata.h +++ b/naiveproxy/src/net/dns/opt_record_rdata.h @@ -50,6 +50,21 @@ class NET_EXPORT_PRIVATE OptRecordRdata : public RecordRdata { class NET_EXPORT_PRIVATE EdeOpt : public Opt { public: + // Metadata for Filtering Details (ro/inc) are defined in Version 1 of + // https://datatracker.ietf.org/doc/draft-nottingham-public-resolver-errors/01/ + struct NET_EXPORT_PRIVATE FilteringDetails { + FilteringDetails(); + ~FilteringDetails(); + + FilteringDetails(const FilteringDetails&); + FilteringDetails& operator=(const FilteringDetails&); + FilteringDetails(FilteringDetails&&) noexcept; + FilteringDetails& operator=(FilteringDetails&&) noexcept; + + std::string resolver_operator_id; // "ro" + std::string filtering_incident_id; // "inc" + }; + static const uint16_t kOptCode = dns_protocol::kEdnsExtendedDnsError; // The following errors are defined by in the IANA registry. @@ -108,11 +123,16 @@ class NET_EXPORT_PRIVATE OptRecordRdata : public RecordRdata { // Convert a uint16_t to an EdeInfoCode enum. static EdeInfoCode GetEnumFromInfoCode(uint16_t info_code); + const std::vector& filtering_details() const { + return filtering_details_; + } + private: EdeOpt(); uint16_t info_code_; std::string extra_text_; + std::vector filtering_details_; }; class NET_EXPORT_PRIVATE PaddingOpt : public Opt { diff --git a/naiveproxy/src/net/dns/platform_dns_query_executor_android.cc b/naiveproxy/src/net/dns/platform_dns_query_executor_android.cc new file mode 100644 index 0000000000..e585166c07 --- /dev/null +++ b/naiveproxy/src/net/dns/platform_dns_query_executor_android.cc @@ -0,0 +1,192 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/dns/platform_dns_query_executor_android.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "base/check.h" +#include "base/containers/span.h" +#include "base/dcheck_is_on.h" +#include "base/feature_list.h" +#include "base/functional/bind.h" +#include "base/functional/callback.h" +#include "base/location.h" +#include "base/sequence_checker.h" +#include "base/task/current_thread.h" +#include "base/time/time.h" +#include "net/base/ip_address.h" +#include "net/base/ip_endpoint.h" +#include "net/base/net_errors.h" +#include "net/base/network_change_notifier.h" +#include "net/base/network_handle.h" +#include "net/dns/dns_names_util.h" +#include "net/dns/host_resolver_internal_result.h" +#include "net/dns/public/dns_query_type.h" + +namespace net { + +namespace { + +// TODO(https://crbug.com/449966580): This is a temporary throwaway parsing +// solution inspired by NativeDnsAsyncTest. Replace it with proper parsing. +constexpr int MAXPACKET = 8 * 1024; + +// TODO(https://crbug.com/452586797): Verify this conversion logic is correct. +net_handle_t MapNetworkHandle(handles::NetworkHandle network) { + if (network == handles::kInvalidNetworkHandle) { + return NETWORK_UNSPECIFIED; + } + return static_cast(network); +} + +// TODO(https://crbug.com/449966580): This is a temporary throwaway parsing +// solution inspired by NativeDnsAsyncTest. Replace it with proper parsing. +std::vector ExtractIpAddressAnswers(base::span buf, + int address_family) { + ns_msg handle; + if (ns_initparse(buf.data(), buf.size(), &handle) != 0) { + return {}; + } + const int ancount = ns_msg_count(handle, ns_s_an); + std::vector answers; + for (int i = 0; i < ancount; ++i) { + ns_rr rr; + if (ns_parserr(&handle, ns_s_an, i, &rr) < 0) { + continue; + } + std::array buffer; + if (inet_ntop(address_family, rr.rdata, buffer.data(), buffer.size())) { + answers.push_back(buffer.data()); + } + } + return answers; +} + +} // namespace + +PlatformDnsQueryExecutorAndroid::PlatformDnsQueryExecutorAndroid( + std::string hostname, + handles::NetworkHandle target_network) + : hostname_(std::move(hostname)), + target_network_(target_network), + read_fd_watcher_(FROM_HERE) { + // `hostname` must be a valid domain name, and it's the caller's + // responsibility to check it before calling this constructor. + DCHECK(dns_names_util::IsValidDnsName(hostname_)) + << "Invalid hostname: " << hostname_; +} + +PlatformDnsQueryExecutorAndroid::~PlatformDnsQueryExecutorAndroid() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); +} + +void PlatformDnsQueryExecutorAndroid::Start(ResultsCallback results_callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + CHECK(results_callback); + CHECK(!results_callback_); + results_callback_ = std::move(results_callback); + + int fd = android_res_nquery(MapNetworkHandle(target_network_), + hostname_.c_str(), ns_c_in, ns_t_a, 0); + if (fd < 0) { + OnLookupComplete(Results(), /*os_error=*/-fd, + /*net_error=*/MapSystemError(-fd)); + return; + } + + if (!base::CurrentIOThread::Get()->WatchFileDescriptor( + fd, /*persistent=*/false, base::MessagePumpForIO::WATCH_READ, + &read_fd_watcher_, this)) { + OnLookupComplete(Results(), /*os_error=*/0, + /*net_error=*/ERR_NAME_NOT_RESOLVED); + return; + } +} + +void PlatformDnsQueryExecutorAndroid::OnFileCanReadWithoutBlocking(int fd) { + // TODO(https://crbug.com/450545129): Investigate why this happens. + // This line is important to keep to avoid internal `MessagePumpEpoll` crash. + read_fd_watcher_.StopWatchingFileDescriptor(); + + ReadResponse(fd); +} + +void PlatformDnsQueryExecutorAndroid::ReadResponse(int fd) { + int rcode = -1; + std::vector answer_buf(MAXPACKET); + int rv = + android_res_nresult(fd, &rcode, answer_buf.data(), answer_buf.size()); + + if (rv < 0) { + OnLookupComplete(Results(), /*os_error=*/-rv, + /*net_error=*/MapSystemError(-rv)); + return; + } + + if (rcode != ns_r_noerror) { + // TODO(https://crbug.com/451557941): Map `rcode` to `net_error`. See the + // library's mapping. + OnLookupComplete(Results(), /*os_error=*/0, + /*net_error=*/ERR_NAME_NOT_RESOLVED); + return; + } + + Results results; + for (const auto& answer : ExtractIpAddressAnswers( + base::span(answer_buf).first(static_cast(rv)), AF_INET)) { + const auto ip_address = IPAddress::FromIPLiteral(answer); + CHECK(ip_address.has_value()) + << "android_res_nresult returned invalid IP address."; + + results.insert(std::make_unique( + hostname_, DnsQueryType::A, + /*expiration=*/base::TimeTicks(), + /*timed_expiration=*/base::Time(), + HostResolverInternalResult::Source::kDns, + /*endpoints=*/std::vector{IPEndPoint(*ip_address, 0)}, + /*strings=*/std::vector(), + /*hosts=*/std::vector())); + } + OnLookupComplete(std::move(results), /*os_error=*/0, /*net_error=*/OK); +} + +void PlatformDnsQueryExecutorAndroid::OnLookupComplete(Results results, + int os_error, + int net_error) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + CHECK(IsActive()); + + // If results are empty, we should return an error. + if (net_error == OK && results.empty()) { + net_error = ERR_NAME_NOT_RESOLVED; + } + + // This class mimics the `HostResolverSystemTask` API, and this logic is + // copied from there. `net_error` is part of the API because it's returned to + // the user in the `results_callback_`. + if (net_error != OK && NetworkChangeNotifier::IsOffline()) { + net_error = ERR_INTERNET_DISCONNECTED; + } + + std::move(results_callback_).Run(std::move(results), os_error, net_error); + // Running `results_callback_` can delete `this`. +} + +void PlatformDnsQueryExecutorAndroid::OnFileCanWriteWithoutBlocking(int fd) { + NOTREACHED() << "Unexpected write on file descriptor."; +} + +} // namespace net diff --git a/naiveproxy/src/net/dns/platform_dns_query_executor_android.h b/naiveproxy/src/net/dns/platform_dns_query_executor_android.h new file mode 100644 index 0000000000..82aa2083c9 --- /dev/null +++ b/naiveproxy/src/net/dns/platform_dns_query_executor_android.h @@ -0,0 +1,90 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_DNS_PLATFORM_DNS_QUERY_EXECUTOR_ANDROID_H_ +#define NET_DNS_PLATFORM_DNS_QUERY_EXECUTOR_ANDROID_H_ + +#include +#include +#include + +#include "base/functional/callback.h" +#include "base/message_loop/message_pump_for_io.h" +#include "base/sequence_checker.h" +#include "net/base/net_export.h" +#include "net/base/network_handle.h" +#include "net/dns/host_resolver_internal_result.h" + +namespace net { + +// Performs DNS resolution using Android specific APIs instead of +// getaddrinfo() +// +// This class be used only on Android 29+ +// (https://developer.android.com/ndk/reference/group/networking#android_res_nquery). +// +// This class is not thread-safe. +// +// TODO(https://crbug.com/448975408): This class is not production-ready, and is +// under active development. Once development is complete, this TODO will be +// removed. +class NET_EXPORT PlatformDnsQueryExecutorAndroid final + : private base::MessagePumpForIO::FdWatcher { + public: + using Results = std::set>; + using ResultsCallback = + base::OnceCallback; + + // `hostname` must be a valid domain name, and it's the caller's + // responsibility to check it before calling this constructor. + PlatformDnsQueryExecutorAndroid(std::string hostname, + handles::NetworkHandle target_network) + __INTRODUCED_IN(29); + + PlatformDnsQueryExecutorAndroid(const PlatformDnsQueryExecutorAndroid&) = + delete; + PlatformDnsQueryExecutorAndroid& operator=( + const PlatformDnsQueryExecutorAndroid&) = delete; + + // Cancels this executor. Any outstanding resolve + // attempts cannot be cancelled. + ~PlatformDnsQueryExecutorAndroid() override; + + // Starts the `hostname` resolution. `Start()` can be called only once per + // each instance of `PlatformDnsQueryExecutorAndroid`. Calling it multiple + // times will result in crash. `results_callback` will be invoked + // asynchronously on the thread that called `Start()` with the results of the + // resolution. `results_callback` can destroy `this`. + void Start(ResultsCallback results_callback) __INTRODUCED_IN(29); + + private: + // `base::MessagePumpForIO::FdWatcher` methods. + void OnFileCanReadWithoutBlocking(int fd) __INTRODUCED_IN(29) override; + void OnFileCanWriteWithoutBlocking(int fd) __INTRODUCED_IN(29) override; + + void ReadResponse(int fd) __INTRODUCED_IN(29); + + // Callback for when resolution completes. + void OnLookupComplete(Results results, int os_error, int net_error); + + bool IsActive() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + return !results_callback_.is_null(); + } + + const std::string hostname_; + + const handles::NetworkHandle target_network_; + + base::MessagePumpForIO::FdWatchController read_fd_watcher_; + + // The listener to the results of this executor. + ResultsCallback results_callback_; + + SEQUENCE_CHECKER(sequence_checker_); +}; + +} // namespace net + +#endif // NET_DNS_PLATFORM_DNS_QUERY_EXECUTOR_ANDROID_H_ diff --git a/naiveproxy/src/net/dns/public/dns_over_https_config.cc b/naiveproxy/src/net/dns/public/dns_over_https_config.cc index 3a209769b1..ac6ffb4fd6 100644 --- a/naiveproxy/src/net/dns/public/dns_over_https_config.cc +++ b/naiveproxy/src/net/dns/public/dns_over_https_config.cc @@ -60,7 +60,8 @@ std::optional FromValue(base::Value::Dict value) { } std::optional FromJson(std::string_view json) { - std::optional value = base::JSONReader::ReadDict(json); + std::optional value = + base::JSONReader::ReadDict(json, base::JSON_PARSE_CHROMIUM_EXTENSIONS); if (!value) { return std::nullopt; } diff --git a/naiveproxy/src/net/dns/public/dns_over_https_server_config.cc b/naiveproxy/src/net/dns/public/dns_over_https_server_config.cc index 22100b1764..72f7527a04 100644 --- a/naiveproxy/src/net/dns/public/dns_over_https_server_config.cc +++ b/naiveproxy/src/net/dns/public/dns_over_https_server_config.cc @@ -29,7 +29,7 @@ std::optional GetHttpsHost(const std::string& url) { url::StdStringCanonOutput output(&canonical); url::Parsed canonical_parsed; bool is_valid = - url::CanonicalizeStandardURL(url.data(), url::ParseStandardURL(url), + url::CanonicalizeStandardUrl(url, url::ParseStandardURL(url), url::SchemeType::SCHEME_WITH_HOST_AND_PORT, nullptr, &output, &canonical_parsed); if (!is_valid) diff --git a/naiveproxy/src/net/dns/resolve_context.cc b/naiveproxy/src/net/dns/resolve_context.cc index 958d38e185..85aca1a145 100644 --- a/naiveproxy/src/net/dns/resolve_context.cc +++ b/naiveproxy/src/net/dns/resolve_context.cc @@ -456,7 +456,8 @@ size_t ResolveContext::FirstServerIndex(bool doh_server, if (doh_server) return 0u; - size_t index = classic_server_index_; + size_t index = + classic_server_index_ % current_session_->config().nameservers.size(); if (current_session_->config().rotate) { classic_server_index_ = (classic_server_index_ + 1) % current_session_->config().nameservers.size(); diff --git a/naiveproxy/src/net/extras/preload_data/decoder.cc b/naiveproxy/src/net/extras/preload_data/decoder.cc index fc415ca72a..21d5011595 100644 --- a/naiveproxy/src/net/extras/preload_data/decoder.cc +++ b/naiveproxy/src/net/extras/preload_data/decoder.cc @@ -6,11 +6,13 @@ #include "base/check_op.h" #include "base/compiler_specific.h" +#include "base/containers/span.h" #include "base/notreached.h" namespace net::extras { -PreloadDecoder::BitReader::BitReader(const uint8_t* bytes, size_t num_bits) +PreloadDecoder::BitReader::BitReader(base::span bytes, + size_t num_bits) : bytes_(bytes), num_bits_(num_bits), num_bytes_((num_bits + 7) / 8) {} // Next sets |*out| to the next bit from the input. It returns false if no @@ -20,7 +22,7 @@ bool PreloadDecoder::BitReader::Next(bool* out) { if (current_byte_index_ >= num_bytes_) { return false; } - current_byte_ = UNSAFE_TODO(bytes_[current_byte_index_++]); + current_byte_ = bytes_[current_byte_index_++]; num_bits_used_ = 0; } @@ -137,18 +139,17 @@ bool PreloadDecoder::BitReader::Seek(size_t offset) { return false; } current_byte_index_ = offset / 8; - current_byte_ = UNSAFE_TODO(bytes_[current_byte_index_++]); + current_byte_ = bytes_[current_byte_index_++]; num_bits_used_ = offset % 8; return true; } -PreloadDecoder::HuffmanDecoder::HuffmanDecoder(const uint8_t* tree, - size_t tree_bytes) - : tree_(tree), tree_bytes_(tree_bytes) {} +PreloadDecoder::HuffmanDecoder::HuffmanDecoder(base::span tree) + : tree_(tree) {} bool PreloadDecoder::HuffmanDecoder::Decode(PreloadDecoder::BitReader* reader, char* out) const { - const uint8_t* current = UNSAFE_TODO(&tree_[tree_bytes_ - 2]); + base::span current = tree_.last<2>(); for (;;) { bool bit; @@ -156,37 +157,27 @@ bool PreloadDecoder::HuffmanDecoder::Decode(PreloadDecoder::BitReader* reader, return false; } - uint8_t b = UNSAFE_TODO(current[bit]); + uint8_t b = current[bit]; if (b & 0x80) { *out = static_cast(b & 0x7f); return true; } unsigned offset = static_cast(b) * 2; - DCHECK_LT(offset, tree_bytes_); - if (offset >= tree_bytes_) { + if (offset >= tree_.size()) { return false; } - current = UNSAFE_TODO(&tree_[offset]); + current = tree_.subspan(offset); } } -PreloadDecoder::PreloadDecoder(const uint8_t* huffman_tree, - size_t huffman_tree_size, - const uint8_t* trie, - size_t trie_bits, - size_t trie_root_position) - : huffman_decoder_(huffman_tree, huffman_tree_size), - bit_reader_(trie, trie_bits), - trie_root_position_(trie_root_position) {} - PreloadDecoder::PreloadDecoder(base::span huffman_tree, base::span trie, size_t trie_bits, size_t trie_root_position) - : huffman_decoder_(huffman_tree.data(), huffman_tree.size()), - bit_reader_(trie.data(), trie_bits), + : huffman_decoder_(huffman_tree), + bit_reader_(trie, trie_bits), trie_root_position_(trie_root_position) { CHECK_LE((trie_bits + 7) / 8, trie.size()); } diff --git a/naiveproxy/src/net/extras/preload_data/decoder.h b/naiveproxy/src/net/extras/preload_data/decoder.h index bdfddf5046..e0362469d6 100644 --- a/naiveproxy/src/net/extras/preload_data/decoder.h +++ b/naiveproxy/src/net/extras/preload_data/decoder.h @@ -11,6 +11,7 @@ #include "base/containers/span.h" #include "base/memory/raw_ptr.h" +#include "base/memory/raw_span.h" namespace net::extras { @@ -25,7 +26,7 @@ class PreloadDecoder { // BitReader is a class that allows a bytestring to be read bit-by-bit. class BitReader { public: - BitReader(const uint8_t* bytes, size_t num_bits); + BitReader(base::span bytes, size_t num_bits); BitReader(const BitReader&) = delete; BitReader& operator=(const BitReader&) = delete; @@ -76,7 +77,7 @@ class PreloadDecoder { bool Seek(size_t offset); private: - const raw_ptr bytes_; + const base::raw_span bytes_; const size_t num_bits_; const size_t num_bytes_; // current_byte_index_ contains the current byte offset in |bytes_|. @@ -98,7 +99,7 @@ class PreloadDecoder { // The tree is decoded by walking rather than a table-driven approach. class HuffmanDecoder { public: - HuffmanDecoder(const uint8_t* tree, size_t tree_bytes); + explicit HuffmanDecoder(base::span tree); HuffmanDecoder(const HuffmanDecoder&) = delete; HuffmanDecoder& operator=(const HuffmanDecoder&) = delete; @@ -106,16 +107,9 @@ class PreloadDecoder { bool Decode(PreloadDecoder::BitReader* reader, char* out) const; private: - const raw_ptr tree_; - const size_t tree_bytes_; + const base::raw_span tree_; }; - PreloadDecoder(const uint8_t* huffman_tree, - size_t huffman_tree_size, - const uint8_t* trie, - size_t trie_bits, - size_t trie_root_position); - PreloadDecoder(base::span huffman_tree, base::span trie, size_t trie_bits, diff --git a/naiveproxy/src/net/extras/shared_dictionary/shared_dictionary_info.h b/naiveproxy/src/net/extras/shared_dictionary/shared_dictionary_info.h index a6c64892a9..5c95a3edd0 100644 --- a/naiveproxy/src/net/extras/shared_dictionary/shared_dictionary_info.h +++ b/naiveproxy/src/net/extras/shared_dictionary/shared_dictionary_info.h @@ -64,6 +64,9 @@ class COMPONENT_EXPORT(NET_SHARED_DICTIONARY) SharedDictionaryInfo { primary_key_in_database_ = primary_key_in_database; } + void set_response_time(base::Time response_time) { + response_time_ = response_time; + } void set_last_fetch_time(base::Time last_fetch_time) { last_fetch_time_ = last_fetch_time; } @@ -80,7 +83,8 @@ class COMPONENT_EXPORT(NET_SHARED_DICTIONARY) SharedDictionaryInfo { // The time of when the dictionary was received from the network layer. base::Time last_fetch_time_; // The time of when the dictionary was received from the server. For cached - // responses, this time could be "far" in the past. + // responses, this time could be "far" in the past. If a dictionary is using + // an explicit "ttl" this will be the same as last_fetch_time_. base::Time response_time_; // The expiration time for the dictionary which was declared in // 'use-as-dictionary' response header's `expires` option in seconds. diff --git a/naiveproxy/src/net/extras/sqlite/sqlite_persistent_cookie_store.cc b/naiveproxy/src/net/extras/sqlite/sqlite_persistent_cookie_store.cc index 05bfa24c32..70191a2d4e 100644 --- a/naiveproxy/src/net/extras/sqlite/sqlite_persistent_cookie_store.cc +++ b/naiveproxy/src/net/extras/sqlite/sqlite_persistent_cookie_store.cc @@ -144,21 +144,6 @@ void HistogramCookieAge(const net::CanonicalCookie& cookie) { } } } else { - // We are studying the age of session cookies in active use. The record is - // split into two histograms to improve resolution. - if (!cookie.CreationDate().is_null()) { - const int session_cookie_age_in_hours = - (Time::Now() - cookie.CreationDate()).InHours(); - if (session_cookie_age_in_hours > kHoursInOneWeek) { - UMA_HISTOGRAM_CUSTOM_COUNTS("Cookie.SessionAgeInHoursGTOneWeek2", - session_cookie_age_in_hours, - kHoursInOneWeek + 1, kHoursInOneYear, 100); - } else { - UMA_HISTOGRAM_CUSTOM_COUNTS("Cookie.SessionAgeInHoursLTEOneWeek2", - session_cookie_age_in_hours, 1, - kHoursInOneWeek + 1, 100); - } - } // Similar to the above, except this metric tracks time since the cookie was // last updated and not just initial creation. if (!cookie.LastUpdateDate().is_null()) { @@ -197,14 +182,14 @@ namespace { // Version 21 - 2023/11/22 - https://crrev.com/c/5049032 // Version 20 - 2023/11/14 - https://crrev.com/c/5030577 // Version 19 - 2023/09/22 - https://crrev.com/c/4704672 -// Version 18 - 2022/04/19 - https://crrev.com/c/3594203 // // Versions older than two years should be removed and marked as unsupported. -// This was last done in February 2024. https://crrev.com/c/5300252 +// This was last done in September 2025. https://crrev.com/c/6819011 // Be sure to update SQLitePersistentCookieStoreTest.TestInvalidVersionRecovery // to test the latest unsupported version number. // // Unsupported versions: +// Version 18 - 2022/04/19 - https://crrev.com/c/3594203 // Version 17 - 2022/01/25 - https://crrev.com/c/3416230 // Version 16 - 2021/09/10 - https://crrev.com/c/3152897 // Version 15 - 2021/07/01 - https://crrev.com/c/3001822 @@ -960,32 +945,13 @@ bool SQLitePersistentCookieStore::Backend::LoadCookiesForDomains( } delete_statement.Assign(db()->GetCachedStatement( SQL_FROM_HERE, "DELETE FROM cookies WHERE host_key = ?")); - - sql::Statement delete_insecure_prefixed_statement; - delete_insecure_prefixed_statement.Assign(db()->GetCachedStatement( - SQL_FROM_HERE, - "DELETE FROM cookies WHERE " - "(LOWER(name) LIKE '__host-http-%' OR LOWER(name) LIKE '__http-%') " - "AND (is_httponly = 0 OR is_secure = 0)")); - - if (!smt.is_valid() || !delete_statement.is_valid() || - !delete_insecure_prefixed_statement.is_valid()) { + if (!smt.is_valid() || !delete_statement.is_valid()) { delete_statement.Clear(); - delete_insecure_prefixed_statement.Clear(); smt.Clear(); // Disconnect smt_ref from db_. Reset(); return false; } - // Delete cookies with __host-http- or __http- prefixes that are not httponly - // These cookies are potentially insecure and should be removed. - // Do this BEFORE loading cookies to ensure deleted cookies don't get loaded. - if (!delete_insecure_prefixed_statement.Run()) { - // Log the failure but don't treat it as fatal since this is a cleanup - // operation - RecordCookieLoadProblem(CookieLoadProblem::KRecoveryFailed); - } - std::vector> cookies; std::unordered_set top_frame_site_keys_to_delete; auto it = domains.begin(); @@ -1117,7 +1083,8 @@ bool SQLitePersistentCookieStore::Backend::MakeCookiesFromSQLStatement( /*source_port=*/statement.ColumnInt(16), // /*source_type=*/ DBCookieSourceTypeToCookieSourceType( - static_cast(statement.ColumnInt(18)))); // + static_cast(statement.ColumnInt(18))), // + CanonicalCookieFromStorageCallSite::kSqlitePersistentCookieStore); // if (cc) { DLOG_IF(WARNING, cc->CreationDate() > Time::Now()) << "CreationDate too recent"; @@ -1148,38 +1115,6 @@ std::optional SQLitePersistentCookieStore::Backend::DoMigrateDatabaseSchema() { int cur_version = meta_table()->GetVersionNumber(); - if (cur_version == 18) { - SCOPED_UMA_HISTOGRAM_TIMER("Cookie.TimeDatabaseMigrationToV19"); - - sql::Statement update_statement( - db()->GetCachedStatement(SQL_FROM_HERE, - "UPDATE cookies SET expires_utc = ? WHERE " - "has_expires = 1 AND expires_utc > ?")); - if (!update_statement.is_valid()) { - return std::nullopt; - } - - sql::Transaction transaction(db()); - if (!transaction.Begin()) { - return std::nullopt; - } - - base::Time expires_cap = base::Time::Now() + base::Days(400); - update_statement.BindTime(0, expires_cap); - update_statement.BindTime(1, expires_cap); - if (!update_statement.Run()) { - return std::nullopt; - } - - ++cur_version; - if (!meta_table()->SetVersionNumber(cur_version) || - !meta_table()->SetCompatibleVersionNumber( - std::min(cur_version, kCompatibleVersionNumber)) || - !transaction.Commit()) { - return std::nullopt; - } - } - if (cur_version == 19) { SCOPED_UMA_HISTOGRAM_TIMER("Cookie.TimeDatabaseMigrationToV20"); diff --git a/naiveproxy/src/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc b/naiveproxy/src/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc index 306daeb47c..bb8b126aaa 100644 --- a/naiveproxy/src/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc +++ b/naiveproxy/src/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc @@ -80,7 +80,8 @@ base::TaskPriority GetReportingAndNelStoreBackgroundSequencePriority() { [[nodiscard]] bool NetworkAnonymizationKeyFromString( std::string_view string, NetworkAnonymizationKey* out_network_anonymization_key) { - std::optional value = base::JSONReader::Read(string); + std::optional value = + base::JSONReader::Read(string, base::JSON_PARSE_CHROMIUM_EXTENSIONS); if (!value) return false; diff --git a/naiveproxy/src/net/extras/sqlite/sqlite_persistent_shared_dictionary_store.cc b/naiveproxy/src/net/extras/sqlite/sqlite_persistent_shared_dictionary_store.cc index b88d210837..3ae89d2daf 100644 --- a/naiveproxy/src/net/extras/sqlite/sqlite_persistent_shared_dictionary_store.cc +++ b/naiveproxy/src/net/extras/sqlite/sqlite_persistent_shared_dictionary_store.cc @@ -261,6 +261,8 @@ class SQLitePersistentSharedDictionaryStore::Backend DEFINE_CROSS_SEQUENCE_CALL_METHOD(GetAllDiskCacheKeyTokens) DEFINE_CROSS_SEQUENCE_CALL_METHOD(DeleteDictionariesByDiskCacheKeyTokens) DEFINE_CROSS_SEQUENCE_CALL_METHOD(UpdateDictionaryLastFetchTime) + DEFINE_CROSS_SEQUENCE_CALL_METHOD( + UpdateDictionaryResponseTimeAndLastFetchTime) #undef DEFINE_CROSS_SEQUENCE_CALL_METHOD void UpdateDictionaryLastUsedTime(int64_t primary_key_in_database, @@ -300,6 +302,9 @@ class SQLitePersistentSharedDictionaryStore::Backend const std::set& disk_cache_key_tokens); Error UpdateDictionaryLastFetchTimeImpl(const int64_t primary_key_in_database, const base::Time last_fetch_time); + Error UpdateDictionaryResponseTimeAndLastFetchTimeImpl( + const int64_t primary_key_in_database, + const base::Time new_time); // If a matching dictionary exists, populates 'size_out' and // 'disk_cache_key_out' with the dictionary's respective values and returns @@ -1526,6 +1531,31 @@ SQLitePersistentSharedDictionaryStore::Backend:: return Error::kOk; } +SQLitePersistentSharedDictionaryStore::Error +SQLitePersistentSharedDictionaryStore::Backend:: + UpdateDictionaryResponseTimeAndLastFetchTimeImpl( + int64_t primary_key_in_database, + base::Time new_time) { + if (!InitializeDatabase()) { + return Error::kFailedToInitializeDatabase; + } + static constexpr char kQuery[] = + "UPDATE dictionaries SET res_time=?, last_fetch_time=? WHERE " + "primary_key=?"; + + if (!db()->IsSQLValid(kQuery)) { + return Error::kInvalidSql; + } + sql::Statement statement(db()->GetCachedStatement(SQL_FROM_HERE, kQuery)); + statement.BindTime(0, new_time); + statement.BindTime(1, new_time); + statement.BindInt64(2, primary_key_in_database); + if (!statement.Run()) { + return Error::kFailedToExecuteSql; + } + return Error::kOk; +} + base::expected SQLitePersistentSharedDictionaryStore::Backend:: DeleteDictionaryByDiskCacheToken( @@ -1857,6 +1887,17 @@ void SQLitePersistentSharedDictionaryStore::UpdateDictionaryLastUsedTime( last_used_time); } +void SQLitePersistentSharedDictionaryStore:: + UpdateDictionaryResponseTimeAndLastFetchTime( + const int64_t primary_key_in_database, + const base::Time new_time, + base::OnceCallback callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + backend_->UpdateDictionaryResponseTimeAndLastFetchTime( + WrapCallbackWithWeakPtrCheck(GetWeakPtr(), std::move(callback)), + primary_key_in_database, new_time); +} + base::WeakPtr SQLitePersistentSharedDictionaryStore::GetWeakPtr() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); diff --git a/naiveproxy/src/net/extras/sqlite/sqlite_persistent_shared_dictionary_store.h b/naiveproxy/src/net/extras/sqlite/sqlite_persistent_shared_dictionary_store.h index e1c93977ac..0126defbb0 100644 --- a/naiveproxy/src/net/extras/sqlite/sqlite_persistent_shared_dictionary_store.h +++ b/naiveproxy/src/net/extras/sqlite/sqlite_persistent_shared_dictionary_store.h @@ -160,6 +160,10 @@ class COMPONENT_EXPORT(NET_EXTRAS) SQLitePersistentSharedDictionaryStore { base::OnceCallback callback); void UpdateDictionaryLastUsedTime(int64_t primary_key_in_database, base::Time last_used_time); + void UpdateDictionaryResponseTimeAndLastFetchTime( + const int64_t primary_key_in_database, + const base::Time new_time, + base::OnceCallback callback); base::WeakPtr GetWeakPtr(); diff --git a/naiveproxy/src/net/features.gni b/naiveproxy/src/net/features.gni index 654a167283..3272959e35 100644 --- a/naiveproxy/src/net/features.gni +++ b/naiveproxy/src/net/features.gni @@ -12,9 +12,9 @@ declare_args() { # Cronet does not support file URLs. disable_file_support = is_cronet_build - # WebSockets and socket stream code are not used when blink is not used - # and are optional in cronet. - enable_websockets = use_blink + # WebSockets and socket stream code are not used when: either, blink is not + # used; or, Cronet is being built. + enable_websockets = use_blink && !is_cronet_build # Enable Kerberos authentication. It is disabled by default on iOS, Fuchsia # and Chromecast, at least for now. This feature needs configuration @@ -42,7 +42,7 @@ declare_args() { # size footprint, this flag should not be disabled unless the embedder is # willing to take the responsibility to make sure that all important # connections use HTTPS. - include_transport_security_state_preload_list = true + include_transport_security_state_preload_list = !is_cronet_build # Platforms for which certificate verification can be performed either using # the builtin cert verifier with the Chrome Root Store, or with the platform diff --git a/naiveproxy/src/net/http/OWNERS b/naiveproxy/src/net/http/OWNERS index 37e74ce299..3b14a6f137 100644 --- a/naiveproxy/src/net/http/OWNERS +++ b/naiveproxy/src/net/http/OWNERS @@ -1,7 +1,8 @@ per-file http_cache_*=shivanisha@chromium.org -per-file transport_security_state_static.*=estark@chromium.org -per-file transport_security_state_static.*=cthomp@chromium.org -per-file transport_security_state_static.*=jdeblasio@chromium.org +per-file transport_security_state_static*=estark@chromium.org +per-file transport_security_state_static*=cthomp@chromium.org +per-file transport_security_state_static*=carlosil@chromium.org +per-file transport_security_state_static*=jdeblasio@chromium.org # For automated updates per-file transport_security_state_static.*=mdb.chrome-pki-metadata-release-jobs@google.com per-file transport_security_state_static_pins.json=mdb.chrome-pki-metadata-release-jobs@google.com diff --git a/naiveproxy/src/net/http/alternate_protocol_usage.h b/naiveproxy/src/net/http/alternate_protocol_usage.h index 9901856c51..b93f138d38 100644 --- a/naiveproxy/src/net/http/alternate_protocol_usage.h +++ b/naiveproxy/src/net/http/alternate_protocol_usage.h @@ -34,6 +34,21 @@ enum AlternateProtocolUsage { ALTERNATE_PROTOCOL_USAGE_MAX, }; +// The state of the advertised alternative service. +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +// LINT.IfChange(AdvertisedAltSvcState) +enum class AdvertisedAltSvcState { + // The state is unknown. + kUnknown = 0, + // QUIC is advertised and it's not broken. + kQuicNotBroken = 1, + // QUIC is advertised but it's broken. + kQuicBroken = 2, + kMaxValue = kQuicBroken, +}; +// LINT.ThenChange(//tools/metrics/histograms/metadata/page/enums.xml:AdvertisedAltSvcState) + } // namespace net #endif // NET_HTTP_ALTERNATE_PROTOCOL_USAGE_H_ diff --git a/naiveproxy/src/net/http/http_auth_controller.cc b/naiveproxy/src/net/http/http_auth_controller.cc index 9be2d83ebb..6ab9c6592f 100644 --- a/naiveproxy/src/net/http/http_auth_controller.cc +++ b/naiveproxy/src/net/http/http_auth_controller.cc @@ -22,6 +22,7 @@ #include "net/http/http_request_headers.h" #include "net/http/http_request_info.h" #include "net/http/http_response_headers.h" +#include "net/log/net_log_capture_mode.h" #include "net/log/net_log_event_type.h" #include "net/log/net_log_source.h" #include "net/log/net_log_source_type.h" @@ -32,12 +33,6 @@ namespace net { namespace { -enum AuthEvent { - AUTH_EVENT_START = 0, - AUTH_EVENT_REJECT, - AUTH_EVENT_MAX, -}; - enum AuthTarget { AUTH_TARGET_PROXY = 0, AUTH_TARGET_SECURE_PROXY, @@ -65,76 +60,12 @@ AuthTarget DetermineAuthTarget(const HttpAuthHandler* handler) { } } -// Records the number of authentication events per authentication scheme. -void HistogramAuthEvent(HttpAuthHandler* handler, AuthEvent auth_event) { -#if !defined(NDEBUG) - // Note: The on-same-thread check is intentionally not using a lock - // to protect access to first_thread. This method is meant to be only - // used on the same thread, in which case there are no race conditions. If - // there are race conditions (say, a read completes during a partial write), - // the DCHECK will correctly fail. - static base::PlatformThreadId first_thread = - base::PlatformThread::CurrentId(); - DCHECK_EQ(first_thread, base::PlatformThread::CurrentId()); -#endif - - HttpAuth::Scheme auth_scheme = handler->auth_scheme(); - DCHECK(auth_scheme >= 0 && auth_scheme < HttpAuth::AUTH_SCHEME_MAX); - - // Record start and rejection events for authentication. - // - // The results map to: - // Basic Start: 0 - // Basic Reject: 1 - // Digest Start: 2 - // Digest Reject: 3 - // NTLM Start: 4 - // NTLM Reject: 5 - // Negotiate Start: 6 - // Negotiate Reject: 7 - static constexpr int kEventBucketsEnd = - int{HttpAuth::AUTH_SCHEME_MAX} * AUTH_EVENT_MAX; - int event_bucket = int{auth_scheme} * AUTH_EVENT_MAX + auth_event; - DCHECK(event_bucket >= 0 && event_bucket < kEventBucketsEnd); - UMA_HISTOGRAM_ENUMERATION("Net.HttpAuthCount", event_bucket, - kEventBucketsEnd); - - // Record the target of the authentication. - // - // The results map to: - // Basic Proxy: 0 - // Basic Secure Proxy: 1 - // Basic Server: 2 - // Basic Secure Server: 3 - // Digest Proxy: 4 - // Digest Secure Proxy: 5 - // Digest Server: 6 - // Digest Secure Server: 7 - // NTLM Proxy: 8 - // NTLM Secure Proxy: 9 - // NTLM Server: 10 - // NTLM Secure Server: 11 - // Negotiate Proxy: 12 - // Negotiate Secure Proxy: 13 - // Negotiate Server: 14 - // Negotiate Secure Server: 15 - if (auth_event != AUTH_EVENT_START) { - return; - } - static constexpr int kTargetBucketsEnd = - int{HttpAuth::AUTH_SCHEME_MAX} * AUTH_TARGET_MAX; - AuthTarget auth_target = DetermineAuthTarget(handler); - int target_bucket = int{auth_scheme} * AUTH_TARGET_MAX + auth_target; - DCHECK(target_bucket >= 0 && target_bucket < kTargetBucketsEnd); - UMA_HISTOGRAM_ENUMERATION("Net.HttpAuthTarget", target_bucket, - kTargetBucketsEnd); -} - base::Value::Dict ControllerParamsToValue(HttpAuth::Target target, - const GURL& url) { + const GURL& url, + NetLogCaptureMode capture_mode) { base::Value::Dict params; params.Set("target", HttpAuth::GetAuthTargetString(target)); - params.Set("url", url.spec()); + params.Set("url", SanitizeUrlForNetLog(url, capture_mode)); return params; } @@ -150,7 +81,7 @@ HttpAuthController::HttpAuthController( : target_(target), auth_url_(auth_url), auth_scheme_host_port_(auth_url), - auth_path_(auth_url.path()), + auth_path_(auth_url.GetPath()), network_anonymization_key_(network_anonymization_key), http_auth_cache_(http_auth_cache), http_auth_handler_factory_(http_auth_handler_factory), @@ -170,9 +101,10 @@ void HttpAuthController::BindToCallingNetLog( if (!net_log_.source().IsValid()) { net_log_ = NetLogWithSource::Make(caller_net_log.net_log(), NetLogSourceType::HTTP_AUTH_CONTROLLER); - net_log_.BeginEvent(NetLogEventType::AUTH_CONTROLLER, [&] { - return ControllerParamsToValue(target_, auth_url_); - }); + net_log_.BeginEvent( + NetLogEventType::AUTH_CONTROLLER, [&](NetLogCaptureMode capture_mode) { + return ControllerParamsToValue(target_, auth_url_, capture_mode); + }); } caller_net_log.AddEventReferencingSource( NetLogEventType::AUTH_BOUND_TO_CONTROLLER, net_log_.source()); @@ -291,7 +223,7 @@ int HttpAuthController::HandleAuthChallenge( InvalidateCurrentHandler(INVALIDATE_HANDLER_AND_CACHED_CREDENTIALS); break; case HttpAuth::AUTHORIZATION_RESULT_REJECT: - HistogramAuthEvent(handler_.get(), AUTH_EVENT_REJECT); + HistogramAuthEvent(AUTH_EVENT_REJECT); InvalidateCurrentHandler(INVALIDATE_HANDLER_AND_CACHED_CREDENTIALS); break; case HttpAuth::AUTHORIZATION_RESULT_STALE: @@ -335,7 +267,7 @@ int HttpAuthController::HandleAuthChallenge( network_anonymization_key_, target_, auth_scheme_host_port_, disabled_schemes_, net_log_, host_resolver_, &handler_); if (handler_.get()) { - HistogramAuthEvent(handler_.get(), AUTH_EVENT_START); + HistogramAuthEvent(AUTH_EVENT_START); } } @@ -371,7 +303,7 @@ int HttpAuthController::HandleAuthChallenge( if (!handler_->AllowsExplicitCredentials()) { // If the handler doesn't accept explicit credentials, then we need to // choose a different auth scheme. - HistogramAuthEvent(handler_.get(), AUTH_EVENT_REJECT); + HistogramAuthEvent(AUTH_EVENT_REJECT); InvalidateCurrentHandler(INVALIDATE_HANDLER_AND_DISABLE_SCHEME); } else { // Pass the challenge information back to the client. @@ -635,6 +567,61 @@ void HttpAuthController::OnGenerateAuthTokenDone(int result) { } } +void HttpAuthController::HistogramAuthEvent(AuthEvent auth_event) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + + HttpAuth::Scheme auth_scheme = handler_->auth_scheme(); + DCHECK(auth_scheme >= 0 && auth_scheme < HttpAuth::AUTH_SCHEME_MAX); + + // Record start and rejection events for authentication. + // + // The results map to: + // Basic Start: 0 + // Basic Reject: 1 + // Digest Start: 2 + // Digest Reject: 3 + // NTLM Start: 4 + // NTLM Reject: 5 + // Negotiate Start: 6 + // Negotiate Reject: 7 + static constexpr int kEventBucketsEnd = + int{HttpAuth::AUTH_SCHEME_MAX} * AUTH_EVENT_MAX; + int event_bucket = int{auth_scheme} * AUTH_EVENT_MAX + auth_event; + DCHECK(event_bucket >= 0 && event_bucket < kEventBucketsEnd); + UMA_HISTOGRAM_ENUMERATION("Net.HttpAuthCount", event_bucket, + kEventBucketsEnd); + + // Record the target of the authentication. + // + // The results map to: + // Basic Proxy: 0 + // Basic Secure Proxy: 1 + // Basic Server: 2 + // Basic Secure Server: 3 + // Digest Proxy: 4 + // Digest Secure Proxy: 5 + // Digest Server: 6 + // Digest Secure Server: 7 + // NTLM Proxy: 8 + // NTLM Secure Proxy: 9 + // NTLM Server: 10 + // NTLM Secure Server: 11 + // Negotiate Proxy: 12 + // Negotiate Secure Proxy: 13 + // Negotiate Server: 14 + // Negotiate Secure Server: 15 + if (auth_event != AUTH_EVENT_START) { + return; + } + static constexpr int kTargetBucketsEnd = + int{HttpAuth::AUTH_SCHEME_MAX} * AUTH_TARGET_MAX; + AuthTarget auth_target = DetermineAuthTarget(handler_.get()); + int target_bucket = int{auth_scheme} * AUTH_TARGET_MAX + auth_target; + DCHECK(target_bucket >= 0 && target_bucket < kTargetBucketsEnd); + UMA_HISTOGRAM_ENUMERATION("Net.HttpAuthTarget", target_bucket, + kTargetBucketsEnd); +} + void HttpAuthController::TakeAuthInfo(std::optional* other) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); auth_info_.swap(*other); diff --git a/naiveproxy/src/net/http/http_auth_controller.h b/naiveproxy/src/net/http/http_auth_controller.h index d03fe4b79f..886647ffa3 100644 --- a/naiveproxy/src/net/http/http_auth_controller.h +++ b/naiveproxy/src/net/http/http_auth_controller.h @@ -190,6 +190,15 @@ class NET_EXPORT_PRIVATE HttpAuthController void OnGenerateAuthTokenDone(int result); + enum AuthEvent { + AUTH_EVENT_START = 0, + AUTH_EVENT_REJECT, + AUTH_EVENT_MAX, + }; + + // Records the number of authentication events per authentication scheme. + void HistogramAuthEvent(AuthEvent auth_event); + // Indicates if this handler is for Proxy auth or Server auth. HttpAuth::Target target_; diff --git a/naiveproxy/src/net/http/http_cache.cc b/naiveproxy/src/net/http/http_cache.cc index ffef1f51c8..a50e7a6fbd 100644 --- a/naiveproxy/src/net/http/http_cache.cc +++ b/naiveproxy/src/net/http/http_cache.cc @@ -9,6 +9,7 @@ #include #include +#include "base/byte_count.h" #include "base/compiler_specific.h" #include "base/containers/span.h" #include "base/feature_list.h" @@ -34,6 +35,7 @@ #include "base/task/single_thread_task_runner.h" #include "base/time/default_clock.h" #include "base/time/time.h" +#include "base/trace_event/trace_event.h" #include "build/build_config.h" #include "http_request_info.h" #include "net/base/cache_type.h" @@ -43,6 +45,7 @@ #include "net/base/net_errors.h" #include "net/base/network_anonymization_key.h" #include "net/base/network_isolation_key.h" +#include "net/base/task/task_runner.h" #include "net/base/upload_data_stream.h" #include "net/disk_cache/disk_cache.h" #include "net/http/http_cache_transaction.h" @@ -72,6 +75,24 @@ bool g_init_cache = false; // has been initialized. bool g_enable_split_cache = false; +// Helper function to find the highest priority in a container of transactions. +template +RequestPriority GetHighestPriority(const T& transactions) { + RequestPriority highest = RequestPriority::IDLE; + for (const auto tx : transactions) { + highest = std::max(highest, tx->priority()); + } + return highest; +} + +const scoped_refptr& TaskRunner( + net::RequestPriority priority) { + if (features::kNetTaskSchedulerHttpCache.Get()) { + return net::GetTaskRunner(priority); + } + return base::SingleThreadTaskRunner::GetCurrentDefault(); +} + } // namespace const char HttpCache::kDoubleKeyPrefix[] = "_dk_"; @@ -316,6 +337,21 @@ bool HttpCache::ActiveEntry::CanTransactionWriteResponseHeaders( return true; } +const scoped_refptr& +HttpCache::ActiveEntry::GetTaskRunner() const { + // Calculate the highest request priority among all transactions in the entry. + RequestPriority highest = std::max( + {RequestPriority::IDLE, GetHighestPriority(done_headers_queue_), + GetHighestPriority(add_to_entry_queue_), GetHighestPriority(readers_)}); + if (headers_transaction_) { + highest = std::max(highest, headers_transaction_->priority()); + } + if (writers_) { + highest = std::max(highest, writers_->priority()); + } + return TaskRunner(highest); +} + //----------------------------------------------------------------------------- // This structure keeps track of work items that are attempting to create or @@ -324,7 +360,7 @@ struct HttpCache::PendingOp { PendingOp() = default; ~PendingOp() = default; - raw_ptr entry = nullptr; + raw_ptr entry = nullptr; bool entry_opened = false; // rather than created. std::unique_ptr backend; @@ -412,10 +448,7 @@ HttpCache::HttpCache( if (base::FeatureList::IsEnabled(features::kHttpCacheNoVarySearch)) { size_t max_entries = features::kHttpCacheNoVarySearchCacheMaxEntries.Get(); if (max_entries) { - // TODO(https://crbug.com/382394774): Make - // kHttpCacheNoVarySearchCacheMaxEntries be a size_t param. - no_vary_search_cache_ = - std::make_unique(static_cast(max_entries)); + no_vary_search_cache_ = std::make_unique(max_entries); } } HttpNetworkSession* session = network_layer_->GetSession(); @@ -517,6 +550,8 @@ void HttpCache::OnExternalCacheHit( return; } + TRACE_EVENT("net", "HttpCache::OnExternalCacheHit"); + HttpRequestInfo request_info; request_info.url = url; request_info.method = http_method; @@ -539,8 +574,7 @@ void HttpCache::OnExternalCacheHit( OnExternalCacheHitForRequest(request_info); - if (no_vary_search_cache_ && - features::kHttpCacheNoVarySearchApplyToExternalHits.Get()) { + if (no_vary_search_cache_) { auto result = no_vary_search_cache_->Lookup(request_info); if (result) { // Do this in addition to, rather than instead of, the URL passed to the @@ -657,12 +691,12 @@ std::string HttpCache::GetResourceURLFromHttpCacheKey(const std::string& key) { } // static -bool HttpCache::CanGenerateCacheKeyForRequest(const HttpRequestInfo* request) { - // WARNING: If this function is changed to look at `request->url` in future, +bool HttpCache::CanGenerateCacheKeyForRequest(const HttpRequestInfo& request) { + // WARNING: If this function is changed to look at `request.url` in future, // it will break GenerateCacheKeyForRequestWithAlternateURL(). Add an extra // `url` parameter instead. if (IsSplitCacheEnabled()) { - if (request->network_isolation_key.IsTransient()) { + if (request.network_isolation_key.IsTransient()) { return false; } } @@ -679,7 +713,8 @@ std::string HttpCache::GenerateCacheKey( bool is_subframe_document_resource, bool is_mainframe_navigation, bool is_shared_resource, - std::optional initiator) { + std::optional initiator, + bool include_url) { // The first character of the key may vary depending on whether or not sending // credentials is permitted for this request. This only happens if the // SplitCacheByIncludeCredentials feature is enabled. @@ -717,6 +752,10 @@ std::string HttpCache::GenerateCacheKey( {kDoubleKeyPrefix, subframe_document_resource_prefix, is_cross_site_main_frame_navigation_prefix, *network_isolation_key.ToCacheKeyString(), kDoubleKeySeparator}); + if (!include_url) { + // Remove the final space (kDoubleKeySeparator). + isolation_key.pop_back(); + } } // The key format is: @@ -725,9 +764,10 @@ std::string HttpCache::GenerateCacheKey( // Strip out the reference, username, and password sections of the URL and // concatenate with the credential_key, the post_key, and the network // isolation key if we are splitting the cache. - return base::StringPrintf("%c/%" PRId64 "/%s%s", credential_key, - upload_data_identifier, isolation_key.c_str(), - HttpUtil::SpecForRequest(url).c_str()); + return base::StringPrintf( + "%c/%" PRId64 "/%s%s", credential_key, upload_data_identifier, + isolation_key.c_str(), + include_url ? HttpUtil::SpecForRequest(url).c_str() : ""); } // static @@ -737,24 +777,38 @@ std::optional HttpCache::GenerateCacheKeyForRequest( } // static -std::optional -HttpCache::GenerateCacheKeyForRequestWithAlternateURL( - const HttpRequestInfo* request, - const GURL& url) { - CHECK(request); - +std::optional HttpCache::GenerateCacheKeyInternal( + const HttpRequestInfo& request, + const GURL& url, + bool include_url) { if (!CanGenerateCacheKeyForRequest(request)) { return std::nullopt; } const int64_t upload_data_identifier = - request->upload_data_stream ? request->upload_data_stream->identifier() - : int64_t(0); + request.upload_data_stream ? request.upload_data_stream->identifier() + : int64_t{0}; return GenerateCacheKey( - url, request->load_flags, request->network_isolation_key, - upload_data_identifier, request->is_subframe_document_resource, - request->is_main_frame_navigation, request->is_shared_resource, - request->initiator); + url, request.load_flags, request.network_isolation_key, + upload_data_identifier, request.is_subframe_document_resource, + request.is_main_frame_navigation, request.is_shared_resource, + request.initiator, include_url); +} + +// static +std::optional +HttpCache::GenerateCacheKeyForRequestWithAlternateURL( + const HttpRequestInfo* request, + const GURL& url) { + CHECK(request); + return GenerateCacheKeyInternal(*request, url, /*include_url=*/true); +} + +// static +std::optional HttpCache::GenerateCachePartitionKeyForRequest( + const HttpRequestInfo& request) { + return GenerateCacheKeyInternal(request, request.url, + /*include_url=*/false); } // static @@ -1248,9 +1302,9 @@ void HttpCache::DoomEntryValidationNoMatch(scoped_refptr entry) { // for the transaction to not be found in this entry. for (HttpCache::Transaction* transaction : entry->add_to_entry_queue()) { transaction->ResetCachePendingState(); - base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, - base::BindOnce(transaction->cache_io_callback(), ERR_CACHE_RACE)); + TaskRunner(transaction->priority()) + ->PostTask(FROM_HERE, base::BindOnce(transaction->cache_io_callback(), + ERR_CACHE_RACE)); } entry->add_to_entry_queue().clear(); } @@ -1285,7 +1339,7 @@ void HttpCache::ProcessQueuedTransactions(scoped_refptr entry) { // Post a task instead of invoking the io callback of another transaction here // to avoid re-entrancy. - base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( + entry->GetTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&HttpCache::OnProcessQueuedTransactions, GetWeakPtr(), std::move(entry))); } @@ -1296,7 +1350,7 @@ void HttpCache::ProcessAddToEntryQueue(scoped_refptr entry) { // Post a task to put the AddTransactionToEntry handling at the back of // the task queue. This allows other tasks (like network IO) to jump // ahead and simulate different callback ordering for testing. - base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( + entry->GetTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&HttpCache::ProcessAddToEntryQueueImpl, GetWeakPtr(), std::move(entry))); } else { @@ -1319,10 +1373,13 @@ HttpCache::ParallelWritingPattern HttpCache::CanTransactionJoinExistingWriters( if (transaction->mode() == Transaction::READ) { return PARALLEL_WRITING_NOT_JOIN_READ_ONLY; } - if (transaction->GetResponseInfo()->headers && - transaction->GetResponseInfo()->headers->GetContentLength() > - disk_cache_->MaxFileSize()) { - return PARALLEL_WRITING_NOT_JOIN_TOO_BIG_FOR_CACHE; + if (transaction->GetResponseInfo()->headers) { + std::optional content_length = + transaction->GetResponseInfo()->headers->GetContentLength(); + if (content_length && + content_length->InBytes() > disk_cache_->MaxFileSize()) { + return PARALLEL_WRITING_NOT_JOIN_TOO_BIG_FOR_CACHE; + } } return PARALLEL_WRITING_JOIN; } @@ -1530,7 +1587,7 @@ void HttpCache::OnIOComplete(int result, PendingOp* pending_op) { pending_op->entry->Doom(); } - pending_op->entry->Close(); + pending_op->entry.ExtractAsDangling()->Close(); pending_op->entry = nullptr; try_restart_requests = true; } diff --git a/naiveproxy/src/net/http/http_cache.h b/naiveproxy/src/net/http/http_cache.h index a60ac8aa02..5629ca5629 100644 --- a/naiveproxy/src/net/http/http_cache.h +++ b/naiveproxy/src/net/http/http_cache.h @@ -31,6 +31,7 @@ #include "base/gtest_prod_util.h" #include "base/hash/sha1.h" #include "base/memory/raw_ptr.h" +#include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" @@ -294,6 +295,11 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory { const HttpRequestInfo* request, const GURL& url); + // Generates the cache partition key, which is the cache key not including the + // URL. This does include the upload data identifier when needed. + static std::optional GenerateCachePartitionKeyForRequest( + const HttpRequestInfo& request); + // Enable split cache feature if not already overridden in the feature list. // Should only be invoked during process initialization before the HTTP // cache is initialized. @@ -458,6 +464,10 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory { bool is_partial, bool is_match) const; + // Returns the priority-based task runner, considering request priority + // among all transactions. + const scoped_refptr& GetTaskRunner() const; + private: friend class base::RefCounted; @@ -524,7 +534,14 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory { // (when network state partitioning is enabled) or requests with an opaque // initiator (for HTTP cache experiment partition schemes that incorporate the // initiator into the cache key). - static bool CanGenerateCacheKeyForRequest(const HttpRequestInfo* request); + static bool CanGenerateCacheKeyForRequest(const HttpRequestInfo& request); + + // Returns the result of GenerateCacheKey() provided that + // CanGenerateCacheKeyForRequest() returned true. Otherwise returns nullopt. + static std::optional GenerateCacheKeyInternal( + const HttpRequestInfo& request, + const GURL& url, + bool include_url); // Generates a cache key given the various pieces used to construct the key. // Must not be called if a corresponding `CanGenerateCacheKeyForRequest` @@ -537,7 +554,8 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory { bool is_subframe_document_resource, bool is_mainframe_navigation, bool is_shared_resource, - std::optional initiator); + std::optional initiator, + bool include_url); // Generates a cache key for `request_info` and informs the backend it should // consider it used if it exists. diff --git a/naiveproxy/src/net/http/http_cache_transaction.cc b/naiveproxy/src/net/http/http_cache_transaction.cc index 369ec46120..20066b8b43 100644 --- a/naiveproxy/src/net/http/http_cache_transaction.cc +++ b/naiveproxy/src/net/http/http_cache_transaction.cc @@ -4,6 +4,7 @@ #include "net/http/http_cache_transaction.h" +#include "base/byte_count.h" #include "build/build_config.h" // For IS_POSIX #if BUILDFLAG(IS_POSIX) @@ -1141,9 +1142,25 @@ int HttpCache::Transaction::DoInitEntry() { // then for some reason the result was unusable. Record the time lost as a // result. See the histogram "HttpCache.NoVarySearch.UseResult" for // information about what went wrong. - base::UmaHistogramTimes( - "HttpCache.NoVarySearch.NotUsableLostTime2", - base::TimeTicks::Now() - first_nvs_cache_lookup_end_time_); + const base::TimeDelta elapsed = + base::TimeTicks::Now() - first_nvs_cache_lookup_end_time_; + + base::UmaHistogramTimes("HttpCache.NoVarySearch.NotUsableLostTime2", + elapsed); + if (no_vary_search_use_result_ == NoVarySearchUseResult::kNotSuitable) { + // In this case, we detected that the entry was unusable using in-memory + // hints, so we should have returned to this point extremely quickly. This + // histogram verifies that we did. + base::UmaHistogramCustomMicrosecondsTimes( + "HttpCache.NoVarySearch.NotUsableLostTime2.NotSuitable", elapsed, + base::Microseconds(1), base::Seconds(1), 50); + } + if ((effective_load_flags_ & LOAD_MAIN_FRAME_DEPRECATED) && + IsGoogleHostWithAlpnH3(request_->url.host())) { + base::UmaHistogramTimes( + "HttpCache.NoVarySearch.NotUsableLostTime2.GoogleHost.MainFrame", + elapsed); + } first_nvs_cache_lookup_end_time_ = base::TimeTicks(); } @@ -1179,8 +1196,14 @@ int HttpCache::Transaction::DoOpenOrCreateEntry() { cache_->GetCurrentBackend()->GetEntryInMemoryData(cache_key_); bool entry_not_suitable = false; if (MaybeRejectBasedOnEntryInMemoryData(in_memory_info)) { - cache_->GetCurrentBackend()->DoomEntry(cache_key_, priority_, - base::DoNothing()); + // If the URL was rewritten by the NoVarySearchCache we may want to use it + // again. The transaction will be restarted with the unmodified URL, so we + // don't need to delete the entry for correctness. + if (!(features::kHttpCacheNoVarySearchKeepNotSuitable.Get() && + IsUsingURLFromNoVarySearchCache())) { + cache_->GetCurrentBackend()->DoomEntry(cache_key_, priority_, + base::DoNothing()); + } entry_not_suitable = true; // Documents the case this applies in DCHECK_EQ(mode_, READ_WRITE); @@ -1294,11 +1317,16 @@ int HttpCache::Transaction::DoOpenOrCreateEntryComplete(int result) { // This handles the case where opening the disk cache entry failed, or it was // found to be unusable due to in-memory flags. if (IsUsingURLFromNoVarySearchCache()) { - return RestartWithoutNoVarySearchCache( - RestartCacheEntryAction::kErase, - result == ERR_CACHE_ENTRY_NOT_SUITABLE - ? NoVarySearchUseResult::kNotSuitable - : NoVarySearchUseResult::kNotOpenable); + if (result == ERR_CACHE_ENTRY_NOT_SUITABLE) { + return RestartWithoutNoVarySearchCache( + features::kHttpCacheNoVarySearchKeepNotSuitable.Get() + ? RestartCacheEntryAction::kDontErase + : RestartCacheEntryAction::kErase, + NoVarySearchUseResult::kNotSuitable); + } + + return RestartWithoutNoVarySearchCache(RestartCacheEntryAction::kErase, + NoVarySearchUseResult::kNotOpenable); } if (ShouldOpenOnlyMethods() || result == ERR_CACHE_ENTRY_NOT_SUITABLE) { @@ -1647,15 +1675,16 @@ int HttpCache::Transaction::DoCacheReadResponseComplete(int result) { return OnCacheReadError(result, true); } - // TODO(crbug.com/40516423) Only get data size if there is no other + // TODO(https://crbug.com/40516423): Only get data size if there is no other // transaction currently writing the response body due to the data race // mentioned in the associated bug. if (!entry_->IsWritingInProgress()) { int current_size = entry_->GetEntry()->GetDataSize(kResponseContentIndex); - int64_t full_response_length = response_.headers->GetContentLength(); + std::optional content_length = + response_.headers->GetContentLength(); // Some resources may have slipped in as truncated when they're not. - if (full_response_length == current_size) { + if (content_length && content_length->InBytes() == current_size) { truncated_ = false; } @@ -1664,11 +1693,11 @@ int HttpCache::Transaction::DoCacheReadResponseComplete(int result) { // sparse cache entry. While the state machine is reworked to resolve this, // the following logic is put in place to defer such requests to the // network. The cache should not be storing multi gigabyte resources. See - // http://crbug.com/89567. + // https://crbug.com/40598279. if ((truncated_ || response_.headers->response_code() == HTTP_PARTIAL_CONTENT) && - !range_requested_ && - full_response_length > std::numeric_limits::max()) { + !range_requested_ && content_length && + content_length->InBytes() > std::numeric_limits::max()) { DCHECK(!partial_); // Doom the entry so that no other transaction gets added to this entry @@ -2933,8 +2962,7 @@ ValidationType HttpCache::Transaction::RequiresValidation() { // - make sure we have a matching request method // - watch out for cached responses that depend on authentication - if (!(effective_load_flags_ & LOAD_SKIP_VARY_CHECK) && - response_.vary_data.is_valid() && + if (response_.vary_data.is_valid() && !response_.vary_data.MatchesRequest(*request_, *response_.headers.get())) { vary_mismatch_ = true; @@ -3116,7 +3144,21 @@ bool HttpCache::Transaction::MaybeRejectBasedOnEntryInMemoryData( uint8_t in_memory_info) { HttpCacheEntryRejectionStatus status = GetHttpCacheEntryRejectionStatus(in_memory_info); - base::UmaHistogramEnumeration("HttpCache.EntryRejectionStatus", status); + UMA_HISTOGRAM_ENUMERATION("HttpCache.EntryRejectionStatus", status); + if (base::FeatureList::IsEnabled( + features::kUpdateIsMainFrameOriginRecentlyAccessed)) { + if (effective_load_flags_ & LOAD_IS_MAIN_FRAME_ORIGIN_RECENTLY_ACCESSED) { + UMA_HISTOGRAM_ENUMERATION( + "HttpCache.EntryRejectionStatus." + "MainFrameOriginRecentlyAccessed", + status); + } else { + UMA_HISTOGRAM_ENUMERATION( + "HttpCache.EntryRejectionStatus." + "MainFrameOriginNotRecentlyAccessed", + status); + } + } return status == HttpCacheEntryRejectionStatus::kRejection; } @@ -3312,7 +3354,7 @@ int HttpCache::Transaction::DoConnectedCallback() { int HttpCache::Transaction::DoConnectedCallbackComplete(int result) { if (result != OK) { if (result == - ERR_CACHED_IP_ADDRESS_SPACE_BLOCKED_BY_PRIVATE_NETWORK_ACCESS_POLICY) { + ERR_CACHED_IP_ADDRESS_SPACE_BLOCKED_BY_LOCAL_NETWORK_ACCESS_POLICY) { DoomInconsistentEntry(); UpdateCacheEntryStatusToOther(OtherStatusReason::kBlockedByIpSpace); TransitionToState(reading_ ? STATE_SEND_REQUEST @@ -3717,7 +3759,9 @@ bool HttpCache::Transaction::CanResume(bool has_data) { // Note that if this is a 206, content-length was already fixed after calling // PartialData::ResponseHeadersOK(). - if (response_.headers->GetContentLength() <= 0 || + std::optional content_length = + response_.headers->GetContentLength(); + if (!content_length.has_value() || content_length->is_zero() || response_.headers->HasHeaderValue("Accept-Ranges", "none") || !response_.headers->HasStrongValidators()) { return false; @@ -3805,12 +3849,13 @@ void HttpCache::Transaction::RecordHistograms() { const bool is_no_store = response_headers && response_headers->HasHeaderValue( "cache-control", "no-store"); bool is_html = false; + const bool is_main_frame = effective_load_flags_ & LOAD_MAIN_FRAME_DEPRECATED; if (response_headers && response_headers->GetMimeType(&mime_type)) { // Record the cache pattern by resource type. The type is inferred by // response header mime type, which could be incorrect, so this is just an // estimate. is_html = (mime_type == "text/html"); - if (is_html && (effective_load_flags_ & LOAD_MAIN_FRAME_DEPRECATED)) { + if (is_html && is_main_frame) { CACHE_STATUS_HISTOGRAMS(".MainFrameHTML"); IS_NO_STORE_HISTOGRAMS(".MainFrameHTML", is_no_store); } else if (is_html) { @@ -3821,11 +3866,14 @@ void HttpCache::Transaction::RecordHistograms() { } CACHE_STATUS_HISTOGRAMS(".CSS"); } else if (mime_type.starts_with("image/")) { - int64_t content_length = response_headers->GetContentLength(); - if (content_length >= 0 && content_length < 100) { - CACHE_STATUS_HISTOGRAMS(".TinyImage"); - } else if (content_length >= 100) { - CACHE_STATUS_HISTOGRAMS(".NonTinyImage"); + std::optional content_length = + response_headers->GetContentLength(); + if (content_length) { + if (content_length->InBytes() >= 0 && content_length->InBytes() < 100) { + CACHE_STATUS_HISTOGRAMS(".TinyImage"); + } else if (content_length->InBytes() >= 100) { + CACHE_STATUS_HISTOGRAMS(".NonTinyImage"); + } } CACHE_STATUS_HISTOGRAMS(".Image"); } else if (mime_type.ends_with("javascript") || @@ -3849,11 +3897,30 @@ void HttpCache::Transaction::RecordHistograms() { CACHE_STATUS_HISTOGRAMS(""); IS_NO_STORE_HISTOGRAMS("", is_no_store); + const bool did_send_request = !send_request_since_.is_null(); + + if (no_vary_search_use_result_ == NoVarySearchUseResult::kUsed && + did_send_request) { + no_vary_search_use_result_ = + cache_entry_status_ == CacheEntryStatus::ENTRY_VALIDATED + ? NoVarySearchUseResult::kValidated + : NoVarySearchUseResult::kUpdated; + } + + UMA_HISTOGRAM_ENUMERATION("HttpCache.NoVarySearch.UseResult2", + no_vary_search_use_result_); + if (is_html && is_main_frame && + IsGoogleHostWithAlpnH3(request_->url.host())) { + base::UmaHistogramEnumeration( + "HttpCache.NoVarySearch.UseResult2.GoogleHost.MainFrameHTML", + no_vary_search_use_result_); + } + if (cache_entry_status_ == CacheEntryStatus::ENTRY_OTHER) { CHECK_NE(other_status_reason_, OtherStatusReason::kNoReason); UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern.NotCoveredReason", other_status_reason_); - if (is_html && (effective_load_flags_ & LOAD_MAIN_FRAME_DEPRECATED)) { + if (is_html && is_main_frame) { base::UmaHistogramEnumeration( "HttpCache.Pattern.NotCoveredReason.MainFrameHTML", other_status_reason_); @@ -3871,8 +3938,6 @@ void HttpCache::Transaction::RecordHistograms() { UMA_HISTOGRAM_CUSTOM_TIMES("HttpCache.AccessToDone2", total_time, base::Milliseconds(1), base::Seconds(30), 100); - bool did_send_request = !send_request_since_.is_null(); - // It's not clear why `did_send_request` can be true when status is // ENTRY_USED. See https://crbug.com/1409150. // TODO(ricea): Maybe remove ENTRY_USED from the `did_send_request` true @@ -3888,16 +3953,6 @@ void HttpCache::Transaction::RecordHistograms() { (cache_entry_status_ == CacheEntryStatus::ENTRY_USED || cache_entry_status_ == CacheEntryStatus::ENTRY_CANT_CONDITIONALIZE))); - if (no_vary_search_use_result_ == NoVarySearchUseResult::kUsed && - did_send_request) { - no_vary_search_use_result_ = - cache_entry_status_ == CacheEntryStatus::ENTRY_VALIDATED - ? NoVarySearchUseResult::kValidated - : NoVarySearchUseResult::kUpdated; - } - - UMA_HISTOGRAM_ENUMERATION("HttpCache.NoVarySearch.UseResult", - no_vary_search_use_result_); if (!did_send_request) { if (cache_entry_status_ == CacheEntryStatus::ENTRY_USED) { @@ -4129,11 +4184,48 @@ bool HttpCache::Transaction::IsUsingURLFromNoVarySearchCache() const { HttpCache::Transaction::NoVarySearchUseResult HttpCache::Transaction::LookupRequestInNoVarySearchCache() { + // In order to conditionally log HttpCache.NoVarySearch.LookupTime.{Hit,Miss}, + // this doesn't use the SCOPED_UMA_HISTOGRAM_TIMER_MICROS macro, but the + // bucket definitions are identical. + bool base_url_matched = false; + const auto start_time = base::Time::Now(); std::optional maybe_result = - cache_->no_vary_search_cache_->Lookup(*request_); + cache_->no_vary_search_cache_->Lookup(*request_, base_url_matched); + const auto elapsed = base::Time::Now() - start_time; + + const bool is_main_frame = effective_load_flags_ & LOAD_MAIN_FRAME_DEPRECATED; + // There are 12 similar histograms, so use macros to minimise copy-and-paste + // errors. + +#define UMA_HISTOGRAM_LOOKUP_TIME_SINGLE(full_suffix) \ + UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES( \ + "HttpCache.NoVarySearch.LookupTime" full_suffix, elapsed, \ + base::Microseconds(1), base::Seconds(1), 50) + +#define UMA_HISTOGRAM_LOOKUP_TIME_CHECKING_BASE_URL_MATCH(suffix) \ + if (base_url_matched) { \ + UMA_HISTOGRAM_LOOKUP_TIME_SINGLE(suffix ".BaseUrlMatched"); \ + } \ + UMA_HISTOGRAM_LOOKUP_TIME_SINGLE(suffix) + +#define UMA_HISTOGRAM_LOOKUP_TIME(suffix) \ + if (is_main_frame) { \ + UMA_HISTOGRAM_LOOKUP_TIME_CHECKING_BASE_URL_MATCH(suffix ".MainFrame"); \ + } \ + UMA_HISTOGRAM_LOOKUP_TIME_CHECKING_BASE_URL_MATCH(suffix) + + UMA_HISTOGRAM_LOOKUP_TIME(""); + if (!maybe_result) { + UMA_HISTOGRAM_LOOKUP_TIME(".Miss"); return NoVarySearchUseResult::kNoMatch; } + UMA_HISTOGRAM_LOOKUP_TIME(".Hit"); + +#undef UMA_HISTOGRAM_LOOKUP_TIME +#undef UMA_HISTOGRAM_LOOKUP_TIME_CHECKING_BASE_URL_MATCH +#undef UMA_HISTOGRAM_LOOKUP_TIME_SINGLE + if (maybe_result->original_url == request_->url) { return NoVarySearchUseResult::kURLUnchanged; } diff --git a/naiveproxy/src/net/http/http_cache_transaction.h b/naiveproxy/src/net/http/http_cache_transaction.h index d552394d66..46f112d1a6 100644 --- a/naiveproxy/src/net/http/http_cache_transaction.h +++ b/naiveproxy/src/net/http/http_cache_transaction.h @@ -705,7 +705,6 @@ class NET_EXPORT_PRIVATE HttpCache::Transaction : public HttpTransaction { std::string method_; RequestPriority priority_; NetLogWithSource net_log_; - HttpRequestHeaders request_headers_copy_; // If extra_headers specified a "if-modified-since" or "if-none-match", // `external_validation_` contains the value of those headers. std::optional external_validation_; diff --git a/naiveproxy/src/net/http/http_cache_writers.cc b/naiveproxy/src/net/http/http_cache_writers.cc index ac02766843..4c7e010fe0 100644 --- a/naiveproxy/src/net/http/http_cache_writers.cc +++ b/naiveproxy/src/net/http/http_cache_writers.cc @@ -290,7 +290,9 @@ bool HttpCache::Writers::ShouldTruncate() { // Check the response headers for strong validators. // Note that if this is a 206, content-length was already fixed after calling // PartialData::ResponseHeadersOK(). - if (response_info_truncation_.headers->GetContentLength() <= 0 || + std::optional content_length = + response_info_truncation_.headers->GetContentLength(); + if (!content_length.has_value() || content_length->is_zero() || response_info_truncation_.headers->HasHeaderValue("Accept-Ranges", "none") || !response_info_truncation_.headers->HasStrongValidators()) { @@ -310,9 +312,7 @@ bool HttpCache::Writers::ShouldTruncate() { return false; } - int64_t content_length = - response_info_truncation_.headers->GetContentLength(); - if (content_length >= 0 && content_length <= current_size) { + if (content_length->InBytes() <= current_size) { return false; } @@ -522,8 +522,9 @@ void HttpCache::Writers::OnDataReceived(int result) { DCHECK(network_transaction_); const HttpResponseInfo* response_info = network_transaction_->GetResponseInfo(); - int64_t content_length = response_info->headers->GetContentLength(); - if (content_length >= 0 && content_length > current_size) { + std::optional content_length = + response_info->headers->GetContentLength(); + if (content_length && content_length->InBytes() > current_size) { OnNetworkReadFailure(result); return; } diff --git a/naiveproxy/src/net/http/http_cache_writers.h b/naiveproxy/src/net/http/http_cache_writers.h index fefaac32a6..d6a0f152e0 100644 --- a/naiveproxy/src/net/http/http_cache_writers.h +++ b/naiveproxy/src/net/http/http_cache_writers.h @@ -150,6 +150,10 @@ class NET_EXPORT_PRIVATE HttpCache::Writers { int GetTransactionsCount() const { return all_writers_.size(); } + // Returns the current priority of the request. It is always the maximum of + // all the writer transactions. + RequestPriority priority() const { return priority_; } + private: friend class WritersTest; diff --git a/naiveproxy/src/net/http/http_network_session.cc b/naiveproxy/src/net/http/http_network_session.cc index d1711c3277..65b19ff3f3 100644 --- a/naiveproxy/src/net/http/http_network_session.cc +++ b/naiveproxy/src/net/http/http_network_session.cc @@ -85,12 +85,8 @@ spdy::SettingsMap AddDefaultHttp2Settings(spdy::SettingsMap http2_settings) { bool OriginToForceQuicOnInternal(const QuicParams& quic_params, const url::SchemeHostPort& destination) { - // TODO(crbug.com/40181080): Consider converting `origins_to_force_quic_on` to - // use url::SchemeHostPort. - return ( - base::Contains(quic_params.origins_to_force_quic_on, HostPortPair()) || - base::Contains(quic_params.origins_to_force_quic_on, - HostPortPair::FromSchemeHostPort(destination))); + return (quic_params.force_quic_everywhere || + base::Contains(quic_params.origins_to_force_quic_on, destination)); } } // unnamed namespace @@ -230,9 +226,10 @@ HttpNetworkSession::HttpNetworkSession(const HttpNetworkSessionParams& params, context.quic_context->params()->exponential_backoff_on_initial_delay); if (!params_.disable_idle_sockets_close_on_memory_pressure) { - memory_pressure_listener_ = std::make_unique( - FROM_HERE, base::BindRepeating(&HttpNetworkSession::OnMemoryPressure, - base::Unretained(this))); + memory_pressure_listener_registration_ = + std::make_unique( + FROM_HERE, base::MemoryPressureListenerTag::kHttpNetworkSession, + this); } http_stream_pool_ = std::make_unique( @@ -308,8 +305,12 @@ base::Value HttpNetworkSession::QuicInfoToValue() const { dict.Set("supported_versions", std::move(supported_versions)); base::Value::List origins_to_force_quic_on; - for (const auto& origin : quic_params->origins_to_force_quic_on) { - origins_to_force_quic_on.Append(origin.ToString()); + if (quic_params->force_quic_everywhere) { + origins_to_force_quic_on.Append(""); + } else { + for (const auto& origin : quic_params->origins_to_force_quic_on) { + origins_to_force_quic_on.Append(origin.Serialize()); + } } dict.Set("origins_to_force_quic_on", std::move(origins_to_force_quic_on)); @@ -461,15 +462,15 @@ ClientSocketPoolManager* HttpNetworkSession::GetSocketPoolManager( } void HttpNetworkSession::OnMemoryPressure( - base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { + base::MemoryPressureLevel memory_pressure_level) { DCHECK(!params_.disable_idle_sockets_close_on_memory_pressure); switch (memory_pressure_level) { - case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE: + case base::MEMORY_PRESSURE_LEVEL_NONE: break; - case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE: - case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL: + case base::MEMORY_PRESSURE_LEVEL_MODERATE: + case base::MEMORY_PRESSURE_LEVEL_CRITICAL: CloseIdleConnections("Low memory"); break; } diff --git a/naiveproxy/src/net/http/http_network_session.h b/naiveproxy/src/net/http/http_network_session.h index 9bc11bfb0f..2199452d20 100644 --- a/naiveproxy/src/net/http/http_network_session.h +++ b/naiveproxy/src/net/http/http_network_session.h @@ -25,7 +25,6 @@ #include "base/threading/thread_checker.h" #include "base/values.h" #include "build/buildflag.h" -#include "net/base/host_mapping_rules.h" #include "net/base/host_port_pair.h" #include "net/base/net_export.h" #include "net/http/http_auth_cache.h" @@ -82,7 +81,6 @@ struct NET_EXPORT HttpNetworkSessionParams { HttpNetworkSessionParams(const HttpNetworkSessionParams& other); ~HttpNetworkSessionParams(); - HostMappingRules host_mapping_rules; bool ignore_certificate_errors = false; uint16_t testing_fixed_http_port = 0; uint16_t testing_fixed_https_port = 0; @@ -204,7 +202,8 @@ struct NET_EXPORT HttpNetworkSessionContext { }; // This class holds session objects used by HttpNetworkTransaction objects. -class NET_EXPORT HttpNetworkSession : public base::PowerSuspendObserver { +class NET_EXPORT HttpNetworkSession : public base::PowerSuspendObserver, + public base::MemoryPressureListener { public: enum SocketPoolType { NORMAL_SOCKET_POOL, @@ -328,7 +327,7 @@ class NET_EXPORT HttpNetworkSession : public base::PowerSuspendObserver { // Flush sockets on low memory notifications callback. void OnMemoryPressure( - base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level); + base::MemoryPressureLevel memory_pressure_level) override; const raw_ptr net_log_; const raw_ptr http_server_properties_; @@ -368,7 +367,8 @@ class NET_EXPORT HttpNetworkSession : public base::PowerSuspendObserver { HttpNetworkSessionParams params_; HttpNetworkSessionContext context_; - std::unique_ptr memory_pressure_listener_; + std::unique_ptr + memory_pressure_listener_registration_; bool power_suspended_ = false; diff --git a/naiveproxy/src/net/http/http_network_transaction.cc b/naiveproxy/src/net/http/http_network_transaction.cc index 4593bdcc35..f77f41538f 100644 --- a/naiveproxy/src/net/http/http_network_transaction.cc +++ b/naiveproxy/src/net/http/http_network_transaction.cc @@ -25,6 +25,8 @@ #include "base/strings/string_util.h" #include "base/time/time.h" #include "base/timer/timer.h" +#include "base/trace_event/trace_event.h" +#include "base/tracing/protos/chrome_track_event.pbzero.h" #include "base/values.h" #include "build/build_config.h" #include "net/base/address_family.h" @@ -207,7 +209,7 @@ class DuplicateRequestLogger final { base::UmaHistogramTimes( base::JoinString({kBaseHistogramName, "MainFrame"}, "."), elapsed); } - if (IsGoogleHostWithAlpnH3(url.host_piece())) { + if (IsGoogleHostWithAlpnH3(url.host())) { base::UmaHistogramTimes( base::JoinString({kBaseHistogramName, "GoogleHost"}, "."), elapsed); if (is_main_frame_navigation) { @@ -314,9 +316,7 @@ void LogIfDuplicateRequest(const GURL& url, bool is_main_frame_navigation) { // When this feature is enabled, GET requests with identical URLs within 10 // seconds will result in the Net.NetworkTransaction.DuplicateRequestInterval // histogram being recorded. -BASE_FEATURE(kLogDuplicateRequests, - "LogDuplicateRequests", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kLogDuplicateRequests, base::FEATURE_DISABLED_BY_DEFAULT); } // namespace @@ -336,6 +336,15 @@ HttpNetworkTransaction::~HttpNetworkTransaction() { GenerateNetworkErrorLoggingReport(ERR_ABORTED); #endif // BUILDFLAG(ENABLE_REPORTING) + // If there's a live stream request and DoCreateStreamComplete() has not set + // `create_stream_end_time_` yet, record this as an abort, so metrics include + // users cancelling requests that take too long. + if (stream_request_ && !create_stream_start_time_.is_null() && + create_stream_end_time_.is_null()) { + create_stream_end_time_ = base::TimeTicks::Now(); + RecordStreamRequestResult(ERR_ABORTED); + } + if (stream_.get()) { // TODO(mbelshe): The stream_ should be able to compute whether or not the // stream should be kept alive. No reason to compute here @@ -537,13 +546,8 @@ void HttpNetworkTransaction::PrepareForAuthRestart(HttpAuth::Target target) { // Authorization schemes incompatible with HTTP/2 are unsupported for proxies. if (target == HttpAuth::AUTH_SERVER && auth_controllers_[target]->NeedsHTTP11()) { - // SetHTTP11Requited requires URLs be rewritten first, if there are any - // applicable rules. - GURL rewritten_url = request_->url; - session_->params().host_mapping_rules.RewriteUrl(rewritten_url); - session_->http_server_properties()->SetHTTP11Required( - url::SchemeHostPort(rewritten_url), network_anonymization_key_); + url::SchemeHostPort(request_->url), network_anonymization_key_); stream_->SetHTTP11Required(); } @@ -738,6 +742,16 @@ void HttpNetworkTransaction::PopulateLoadTimingInternalInfo( load_timing_internal_info->initialize_stream_delay = initialize_stream_end_time_ - initialize_stream_start_time_; } + + if (stream_request_completion_details_.has_value()) { + load_timing_internal_info->session_source = + stream_request_completion_details_->session_source; + load_timing_internal_info->advertised_alt_svc_state = + stream_request_completion_details_->advertised_alt_svc_state; + } + + load_timing_internal_info->http_network_session_quic_enabled = + session_->IsQuicEnabled(); } bool HttpNetworkTransaction::GetRemoteEndpoint(IPEndPoint* endpoint) const { @@ -921,7 +935,6 @@ void HttpNetworkTransaction::OnNeedsProxyAuth( establishing_tunnel_ = true; response_.headers = proxy_response.headers; response_.auth_challenge = proxy_response.auth_challenge; - response_.did_use_http_auth = proxy_response.did_use_http_auth; SetProxyInfoInResponse(used_proxy_info, &response_); if (!ContentEncodingsValid()) { @@ -1114,6 +1127,11 @@ int HttpNetworkTransaction::DoCreateStream() { enable_ip_based_pooling_for_h2_, enable_alternative_services_, net_log_); } else { + // TODO(crbug.com/414173943): Remove this histogram timer once we confirm + // that time consumed by this method is different or the same for the HEv3 + // and non-HEv3 paths. + base::ScopedUmaHistogramTimer histogram_timer( + "Net.NetworkTransaction.RequestStreamCpuTime"); stream_request_ = session_->http_stream_factory()->RequestStream( *request_, priority_, /*allowed_bad_certs=*/observed_bad_certs_, this, enable_ip_based_pooling_for_h2_, enable_alternative_services_, @@ -1125,33 +1143,19 @@ int HttpNetworkTransaction::DoCreateStream() { int HttpNetworkTransaction::DoCreateStreamComplete(int result) { CHECK(stream_request_); - TRACE_EVENT( - "net", "HttpNetworkTransaction::CreateStreamComplete", - NetLogWithSourceToFlow(net_log_), "result", result, "negotiated_protocol", - stream_request_->completed() ? stream_request_->negotiated_protocol() - : NextProto::kProtoUnknown); + TRACE_EVENT("net", "HttpNetworkTransaction::CreateStreamComplete", + NetLogWithSourceToFlow(net_log_), + [&](perfetto::EventContext ctx) { + AddTraceParamsForStreamRequestResult(std::move(ctx), result); + }); + + create_stream_end_time_ = base::TimeTicks::Now(); + stream_request_completion_details_ = stream_request_->completion_details(); RecordStreamRequestResult(result); CopyConnectionAttemptsFromStreamRequest(); if (result == OK) { - create_stream_end_time_ = base::TimeTicks::Now(); next_state_ = STATE_CONNECTED_CALLBACK; DCHECK(stream_.get()); - CHECK(!create_stream_start_time_.is_null()); - CHECK_LE(create_stream_start_time_, create_stream_end_time_); - base::UmaHistogramTimes( - base::StrCat( - {"Net.NetworkTransaction.Create", - (ForWebSocketHandshake() ? "WebSocketStreamTime." - : "HttpStreamTime."), - (IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : ""), - NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}), - create_stream_end_time_ - create_stream_start_time_); - if (!reset_connection_and_request_for_resend_start_time_.is_null()) { - base::UmaHistogramTimes( - "Net.NetworkTransaction.ResetConnectionAndResendRequestTime", - base::TimeTicks::Now() - - reset_connection_and_request_for_resend_start_time_); - } } else if (result == ERR_HTTP_1_1_REQUIRED || result == ERR_PROXY_HTTP_1_1_REQUIRED) { return HandleHttp11Required(result); @@ -1241,6 +1245,10 @@ int HttpNetworkTransaction::DoInitStream() { next_state_ = STATE_INIT_STREAM_COMPLETE; initialize_stream_start_time_ = base::TimeTicks::Now(); + // Reset `initialize_stream_end_time_` to prevent an inconsistent state in + // case that `DoInitStream()` is called multiple times. + initialize_stream_end_time_ = base::TimeTicks(); + int rv = stream_->InitializeStream(can_send_early_data_, priority_, net_log_, io_callback_); @@ -1251,10 +1259,9 @@ int HttpNetworkTransaction::DoInitStream() { blocked_initialize_stream_start_time_ = initialize_stream_start_time_; } base::UmaHistogramBoolean( - base::StrCat( - {"Net.NetworkTransaction.InitializeStreamBlocked", - IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : ".", - NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}), + base::StrCat({"Net.NetworkTransaction.InitializeStreamBlocked", + IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : ".", + NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}), blocked); return rv; } @@ -1270,7 +1277,7 @@ int HttpNetworkTransaction::DoInitStreamComplete(int result) { base::UmaHistogramTimes( base::StrCat( {"Net.NetworkTransaction.InitializeStreamBlockTime", - IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : ".", + IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : ".", NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}), initialize_stream_end_time_ - blocked_initialize_stream_start_time_); } @@ -1313,10 +1320,9 @@ int HttpNetworkTransaction::DoGenerateProxyAuthToken() { blocked_generate_proxy_auth_token_start_time_ = base::TimeTicks::Now(); } base::UmaHistogramBoolean( - base::StrCat( - {"Net.NetworkTransaction.GenerateProxyAuthTokenBlocked", - IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : ".", - NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}), + base::StrCat({"Net.NetworkTransaction.GenerateProxyAuthTokenBlocked", + IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : ".", + NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}), blocked); return rv; } @@ -1329,7 +1335,7 @@ int HttpNetworkTransaction::DoGenerateProxyAuthTokenComplete(int rv) { base::UmaHistogramTimes( base::StrCat( {"Net.NetworkTransaction.GenerateProxyAuthTokenBlockTime", - IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : ".", + IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : ".", NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}), base::TimeTicks::Now() - blocked_generate_proxy_auth_token_start_time_); } @@ -1360,10 +1366,9 @@ int HttpNetworkTransaction::DoGenerateServerAuthToken() { blocked_generate_server_auth_token_start_time_ = base::TimeTicks::Now(); } base::UmaHistogramBoolean( - base::StrCat( - {"Net.NetworkTransaction.GenerateServerAuthTokenBlocked", - IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : ".", - NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}), + base::StrCat({"Net.NetworkTransaction.GenerateServerAuthTokenBlocked", + IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : ".", + NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}), blocked); return rv; } @@ -1376,7 +1381,7 @@ int HttpNetworkTransaction::DoGenerateServerAuthTokenComplete(int rv) { base::UmaHistogramTimes( base::StrCat( {"Net.NetworkTransaction.GenerateServerAuthTokenBlockTime", - IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : ".", + IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : ".", NegotiatedProtocolToHistogramSuffix(negotiated_protocol_)}), base::TimeTicks::Now() - blocked_generate_server_auth_token_start_time_); @@ -1461,9 +1466,8 @@ int HttpNetworkTransaction::BuildRequestHeaders( modify_headers_callbacks_.Run(&request_headers_); } - response_.did_use_http_auth = - request_headers_.HasHeader(HttpRequestHeaders::kAuthorization) || - request_headers_.HasHeader(HttpRequestHeaders::kProxyAuthorization); + response_.did_use_server_http_auth = + request_headers_.HasHeader(HttpRequestHeaders::kAuthorization); return OK; } @@ -1725,11 +1729,13 @@ int HttpNetworkTransaction::DoReadHeadersComplete(int result) { // Note: This will report a success for a redirect even if an error is // encountered later while draining the body. int response_code = response_.headers->response_code(); + std::optional content_length = + response_.headers->GetContentLength(); if ((response_code >= 400 && response_code < 600) || response_code == HTTP_NO_CONTENT || response_code == HTTP_RESET_CONTENT || response_code == HTTP_NOT_MODIFIED || request_->method == "HEAD" || - response_.headers->GetContentLength() == 0 || - response_.headers->IsRedirect(nullptr /* location */)) { + (content_length && content_length->is_zero()) || + response_.headers->IsRedirect(/*location=*/nullptr)) { GenerateNetworkErrorLoggingReport(OK); } #endif // BUILDFLAG(ENABLE_REPORTING) @@ -2281,7 +2287,7 @@ void HttpNetworkTransaction::ResetConnectionAndRequestForResend( // TODO:(crbug.com/1495705): Remove this CHECK after fixing the bug. CHECK(request_); base::UmaHistogramEnumeration( - IsGoogleHostWithAlpnH3(url_.host_piece()) + IsGoogleHostWithAlpnH3(url_.host()) ? "Net.NetworkTransactionH3SupportedGoogleHost.RetryReason" : "Net.NetworkTransaction.RetryReason", retry_reason); @@ -2446,18 +2452,18 @@ void HttpNetworkTransaction::RecordStreamRequestResult(int result) { if (num_restarts_ == 0) { base::TimeDelta elapsed = base::TimeTicks::Now() - start_timeticks_; base::UmaHistogramTimes( - base::StrCat( - {"Net.NetworkTransaction.StreamRequestCompleteTime.", - IsGoogleHostWithAlpnH3(url_.host_piece()) ? "GoogleHost." : "", - result == OK ? "Success" : "Failure"}), + base::StrCat({"Net.NetworkTransaction.StreamRequestCompleteTime2.", + IsGoogleHostWithAlpnH3(url_.host()) ? "GoogleHost." : "", + result == OK ? "Success" : "Failure"}), elapsed); } if (result == OK) { + CHECK(stream_); base::UmaHistogramEnumeration( base::StrCat({ "Net.NetworkTransaction.NegotiatedProtocol", - IsGoogleHostWithAlpnH3(url_.host_piece()) ? ".GoogleHost" : "", + IsGoogleHostWithAlpnH3(url_.host()) ? ".GoogleHost" : "", }), negotiated_protocol_); @@ -2468,8 +2474,67 @@ void HttpNetworkTransaction::RecordStreamRequestResult(int result) { "Net.NetworkTransaction.StreamAddressFamily", endpoint.GetFamily(), static_cast(ADDRESS_FAMILY_LAST + 1)); } + + CHECK(!create_stream_start_time_.is_null()); + CHECK_LE(create_stream_start_time_, create_stream_end_time_); + base::TimeDelta create_time = + create_stream_end_time_ - create_stream_start_time_; + + const std::string_view histogram_base_name = + ForWebSocketHandshake() ? "CreateWebSocketStreamTime2" + : "CreateHttpStreamTime2"; + const std::string_view host_suffix = + IsGoogleHostWithAlpnH3(url_.host()) ? ".GoogleHost" : ""; + const std::string_view protocol_suffix = + NegotiatedProtocolToHistogramSuffixCoalesced(negotiated_protocol_); + std::string histogram_name = + base::StrCat({"Net.NetworkTransaction.", histogram_base_name, + host_suffix, ".", protocol_suffix}); + base::UmaHistogramTimes(histogram_name, create_time); + + const std::string_view address_suffix = + AddressFamilyToString(endpoint.GetFamily()); + base::UmaHistogramTimes(base::StrCat({histogram_name, ".", address_suffix}), + create_time); + + if (!reset_connection_and_request_for_resend_start_time_.is_null()) { + base::UmaHistogramTimes( + "Net.NetworkTransaction.ResetConnectionAndResendRequestTime", + base::TimeTicks::Now() - + reset_connection_and_request_for_resend_start_time_); + } + + CHECK(stream_request_completion_details_.has_value()); + if (stream_request_completion_details_->session_source.has_value()) { + base::UmaHistogramEnumeration( + base::StrCat( + {"Net.NetworkTransaction.SessionSource2.", protocol_suffix}), + *stream_request_completion_details_->session_source); + } + + // Record HttpStream creation time per new/existing stream/session. + // TODO(crbug.com/414173943): Remove these histograms after we confirm + // there is no difference between the HEv3 and the non-HEv3 paths. + if (!ForWebSocketHandshake()) { + auto is_existing = [&]() { + if (negotiated_protocol_ == NextProto::kProtoUnknown || + negotiated_protocol_ == NextProto::kProtoHTTP11) { + // For HTTP/1.1 streams, `IsConnectionReused()` actually means whether + // the underlying socket is idle (existing) or fresh (new). + return stream_->IsConnectionReused(); + } + CHECK(stream_request_completion_details_->session_source.has_value()); + return *stream_request_completion_details_->session_source == + SessionSource::kExisting; + }; + base::UmaHistogramTimes( + base::StrCat({"Net.NetworkTransaction.", protocol_suffix, + "StreamCreationTime.", + is_existing() ? "Existing" : "New"}), + create_time); + } } else { - base::UmaHistogramSparse("Net.NetworkTransaction.StreamRequestErrorCode", + base::UmaHistogramSparse("Net.NetworkTransaction.StreamRequestErrorCode2", -result); } } @@ -2486,6 +2551,36 @@ void HttpNetworkTransaction::ProcessAltSvcHeader() { } } +void HttpNetworkTransaction::AddTraceParamsForStreamRequestResult( + perfetto::EventContext ctx, + int result) { + auto* event = ctx.event(); + + auto* result_annotation = event->add_debug_annotations(); + result_annotation->set_name("result"); + result_annotation->set_int_value(result); + + if (!stream_request_->completed()) { + return; + } + + auto* negotiated_protocol_annotation = event->add_debug_annotations(); + negotiated_protocol_annotation->set_name("negotiated_protocol"); + negotiated_protocol_annotation->set_uint_value( + static_cast(stream_request_->negotiated_protocol())); + + const std::optional& details = + stream_request_->completion_details(); + CHECK(details.has_value()); + + if (details->session_source.has_value()) { + auto* session_source_annotation = event->add_debug_annotations(); + session_source_annotation->set_name("session_source"); + session_source_annotation->set_uint_value( + static_cast(*details->session_source)); + } +} + // static void HttpNetworkTransaction::SetProxyInfoInResponse( const ProxyInfo& proxy_info, diff --git a/naiveproxy/src/net/http/http_network_transaction.h b/naiveproxy/src/net/http/http_network_transaction.h index c40a6838c3..e75a473fad 100644 --- a/naiveproxy/src/net/http/http_network_transaction.h +++ b/naiveproxy/src/net/http/http_network_transaction.h @@ -17,6 +17,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" #include "base/time/time.h" +#include "base/trace_event/trace_event.h" #include "build/buildflag.h" #include "net/base/completion_once_callback.h" #include "net/base/completion_repeating_callback.h" @@ -345,6 +346,10 @@ class NET_EXPORT_PRIVATE HttpNetworkTransaction void RecordStreamRequestResult(int result); + // Called from DoCreateStreamComplete() to add trace event parameters. + void AddTraceParamsForStreamRequestResult(perfetto::EventContext ctx, + int result); + void ProcessAltSvcHeader(); // These values are persisted to logs. Entries should not be renumbered and @@ -394,6 +399,8 @@ class NET_EXPORT_PRIVATE HttpNetworkTransaction ProxyInfo proxy_info_; std::unique_ptr stream_request_; + std::optional + stream_request_completion_details_; std::unique_ptr stream_; // True if we've validated the headers that the stream parser has returned. diff --git a/naiveproxy/src/net/http/http_no_vary_search_data.cc b/naiveproxy/src/net/http/http_no_vary_search_data.cc index 67dd159c09..1e57021e11 100644 --- a/naiveproxy/src/net/http/http_no_vary_search_data.cc +++ b/naiveproxy/src/net/http/http_no_vary_search_data.cc @@ -9,12 +9,15 @@ #include "base/containers/contains.h" #include "base/containers/flat_set.h" +#include "base/debug/crash_logging.h" +#include "base/debug/dump_without_crashing.h" #include "base/feature_list.h" #include "base/metrics/histogram_macros.h" #include "base/types/expected.h" #include "net/base/features.h" #include "net/base/pickle.h" #include "net/base/url_search_params.h" +#include "net/base/url_search_params_view.h" #include "net/base/url_util.h" #include "net/http/http_response_headers.h" #include "net/http/structured_headers.h" @@ -38,8 +41,71 @@ std::optional> ParseStringList( return keys; } +template +void ApplyNoVarySearchRulesToParams(const HttpNoVarySearchData& rules, + ParamsType& params) { + // Ignore all the query search params that the URL is not varying on. + if (rules.vary_by_default()) { + params.DeleteAllWithNames(rules.affected_params()); + } else { + params.DeleteAllExceptWithNames(rules.affected_params()); + } + // Sort the params if the order of the search params in the query + // is ignored. + if (!rules.vary_on_key_order()) { + params.Sort(); + } +} + +template +void ApplyNoVarySearchRulesToBothParams(const HttpNoVarySearchData& rules, + ParamsType& params_a, + ParamsType& params_b) { + ApplyNoVarySearchRulesToParams(rules, params_a); + ApplyNoVarySearchRulesToParams(rules, params_b); +} + +// Extracts the "base URL" (everything before the query or fragment) from `url`. +// It relies on the fact that GURL canonicalizes http(s) URLs to not contain '?' +// or '#' before the start of the query. It's a lot faster than using +// GURL::Replacements to do the same thing, as no allocations or copies are +// needed. +std::string_view ExtractBaseUrl(const GURL& url) { + const std::string_view view(url.possibly_invalid_spec()); + size_t end_of_base = view.find_first_of("?#"); + // This returns the whole of `view` if `end_of_base` is std::string::npos. + return view.substr(0, end_of_base); +} + +std::optional& GetHttpNoVarySearchDataUseNewAreEquivalentOverride() { + static constinit std::optional override_value; + return override_value; +} + +bool IsHttpNoVarySearchDataUseNewAreEquivalentEnabled() { + if (GetHttpNoVarySearchDataUseNewAreEquivalentOverride().has_value()) { + return *GetHttpNoVarySearchDataUseNewAreEquivalentOverride(); + } + + static const bool kEnabled = base::FeatureList::IsEnabled( + features::kHttpNoVarySearchDataUseNewAreEquivalent); + + return kEnabled; +} + } // namespace +ScopedHttpNoVarySearchDataEquivalentImplementationOverrideForTesting:: + ScopedHttpNoVarySearchDataEquivalentImplementationOverrideForTesting( + bool use_new_implementation) { + GetHttpNoVarySearchDataUseNewAreEquivalentOverride() = use_new_implementation; +} + +ScopedHttpNoVarySearchDataEquivalentImplementationOverrideForTesting:: + ~ScopedHttpNoVarySearchDataEquivalentImplementationOverrideForTesting() { + GetHttpNoVarySearchDataUseNewAreEquivalentOverride() = std::nullopt; +} + HttpNoVarySearchData::HttpNoVarySearchData() = default; HttpNoVarySearchData::HttpNoVarySearchData(const HttpNoVarySearchData&) = default; @@ -51,46 +117,33 @@ HttpNoVarySearchData& HttpNoVarySearchData::operator=(HttpNoVarySearchData&&) = default; bool HttpNoVarySearchData::AreEquivalent(const GURL& a, const GURL& b) const { - // Check urls without query and reference (fragment) for equality first. - GURL::Replacements replacements; - replacements.ClearRef(); - replacements.ClearQuery(); - if (a.ReplaceComponents(replacements) != b.ReplaceComponents(replacements)) { - return false; + CHECK(a.is_valid()); + CHECK(b.is_valid()); + if (IsHttpNoVarySearchDataUseNewAreEquivalentEnabled()) { + return AreEquivalentNewImpl(a, b); } - // If equal, look at how HttpNoVarySearchData argument affects - // search params variance. - UrlSearchParams a_search_params(a); - UrlSearchParams b_search_params(b); - // Ignore all the query search params that the URL is not varying on. - if (vary_by_default()) { - a_search_params.DeleteAllWithNames(no_vary_params()); - b_search_params.DeleteAllWithNames(no_vary_params()); - } else { - a_search_params.DeleteAllExceptWithNames(vary_params()); - b_search_params.DeleteAllExceptWithNames(vary_params()); - } - // Sort the params if the order of the search params in the query - // is ignored. - if (!vary_on_key_order()) { - a_search_params.Sort(); - b_search_params.Sort(); - } - // Check Search Params for equality - // All search params, in order, need to have the same keys and the same - // values. - return a_search_params.params() == b_search_params.params(); + return AreEquivalentOldImpl(a, b); +} + +std::string HttpNoVarySearchData::CanonicalizeQuery(const GURL& url) const { + UrlSearchParamsView search_params(url); + ApplyNoVarySearchRulesToParams(*this, search_params); + + return search_params.SerializeAsUtf8(); } // static HttpNoVarySearchData HttpNoVarySearchData::CreateFromNoVaryParams( const std::vector& no_vary_params, bool vary_on_key_order) { + // Check that this call creates a non-default configuration. + CHECK(!vary_on_key_order || !no_vary_params.empty()); + HttpNoVarySearchData no_vary_search; no_vary_search.vary_on_key_order_ = vary_on_key_order; - no_vary_search.no_vary_params_.insert(no_vary_params.cbegin(), - no_vary_params.cend()); + no_vary_search.affected_params_.insert(no_vary_params.cbegin(), + no_vary_params.cend()); return no_vary_search; } @@ -101,7 +154,8 @@ HttpNoVarySearchData HttpNoVarySearchData::CreateFromVaryParams( HttpNoVarySearchData no_vary_search; no_vary_search.vary_on_key_order_ = vary_on_key_order; no_vary_search.vary_by_default_ = false; - no_vary_search.vary_params_.insert(vary_params.cbegin(), vary_params.cend()); + no_vary_search.affected_params_.insert(vary_params.cbegin(), + vary_params.cend()); return no_vary_search; } @@ -131,33 +185,26 @@ bool HttpNoVarySearchData::operator==(const HttpNoVarySearchData& rhs) const = std::strong_ordering HttpNoVarySearchData::operator<=>( const HttpNoVarySearchData& rhs) const = default; -const base::flat_set& HttpNoVarySearchData::no_vary_params() - const { - return no_vary_params_; +bool HttpNoVarySearchData::AreEquivalentOldImplForTesting(const GURL& a, + const GURL& b) const { + return AreEquivalentOldImpl(a, b); } -const base::flat_set& HttpNoVarySearchData::vary_params() const { - return vary_params_; -} - -bool HttpNoVarySearchData::vary_on_key_order() const { - return vary_on_key_order_; -} -bool HttpNoVarySearchData::vary_by_default() const { - return vary_by_default_; +bool HttpNoVarySearchData::AreEquivalentNewImplForTesting(const GURL& a, + const GURL& b) const { + return AreEquivalentNewImpl(a, b); } // static base::expected HttpNoVarySearchData::ParseNoVarySearchDictionary( const structured_headers::Dictionary& dict) { - static constexpr const char* kKeyOrder = "key-order"; - static constexpr const char* kParams = "params"; - static constexpr const char* kExcept = "except"; + static constexpr std::string_view kKeyOrder = "key-order"; + static constexpr std::string_view kParams = "params"; + static constexpr std::string_view kExcept = "except"; constexpr std::string_view kValidKeys[] = {kKeyOrder, kParams, kExcept}; - base::flat_set no_vary_params; - base::flat_set vary_params; + base::flat_set affected_params; bool vary_on_key_order = true; bool vary_by_default = true; @@ -175,8 +222,8 @@ HttpNoVarySearchData::ParseNoVarySearchDictionary( } // Populate `vary_on_key_order` based on the `key-order` key. - if (dict.contains(kKeyOrder)) { - const auto& key_order = dict.at(kKeyOrder); + if (auto keyorder_it = dict.find(kKeyOrder); keyorder_it != dict.end()) { + const auto& key_order = keyorder_it->second; if (key_order.member_is_inner_list || !key_order.member[0].item.is_boolean()) { return base::unexpected(ParseErrorEnum::kNonBooleanKeyOrder); @@ -184,15 +231,15 @@ HttpNoVarySearchData::ParseNoVarySearchDictionary( vary_on_key_order = !key_order.member[0].item.GetBoolean(); } - // Populate `no_vary_params` or `vary_by_default` based on the "params" key. - if (dict.contains(kParams)) { - const auto& params = dict.at(kParams); + // Populate `affected_params` or `vary_by_default` based on the "params" key. + if (auto params_it = dict.find(kParams); params_it != dict.end()) { + const auto& params = params_it->second; if (params.member_is_inner_list) { auto keys = ParseStringList(params.member); if (!keys.has_value()) { return base::unexpected(ParseErrorEnum::kParamsNotStringList); } - no_vary_params = std::move(*keys); + affected_params = std::move(*keys); } else if (params.member[0].item.is_boolean()) { vary_by_default = !params.member[0].item.GetBoolean(); } else { @@ -200,11 +247,11 @@ HttpNoVarySearchData::ParseNoVarySearchDictionary( } } - // Populate `vary_params` based on the "except" key. + // Populate `affected_params` based on the "except" key. // This should be present only if "params" was true // (i.e., params don't vary by default). - if (dict.contains(kExcept)) { - const auto& excepted_params = dict.at(kExcept); + if (auto except_it = dict.find(kExcept); except_it != dict.end()) { + const auto& excepted_params = except_it->second; if (vary_by_default) { return base::unexpected(ParseErrorEnum::kExceptWithoutTrueParams); } @@ -215,46 +262,75 @@ HttpNoVarySearchData::ParseNoVarySearchDictionary( if (!keys.has_value()) { return base::unexpected(ParseErrorEnum::kExceptNotStringList); } - vary_params = std::move(*keys); + affected_params = std::move(*keys); } - // "params" controls both `vary_by_default` and `no_vary_params`. Check to - // make sure that when "params" is a boolean, `no_vary_params` is empty. - if (!vary_by_default) - DCHECK(no_vary_params.empty()); - - if (no_vary_params.empty() && vary_params.empty() && vary_by_default && - vary_on_key_order) { + if (affected_params.empty() && vary_by_default && vary_on_key_order) { // If header is present but it's value is equivalent to only default values // then it is the same as if there were no header present. return base::unexpected(ParseErrorEnum::kDefaultValue); } HttpNoVarySearchData no_vary_search; - no_vary_search.no_vary_params_ = std::move(no_vary_params); - no_vary_search.vary_params_ = std::move(vary_params); + no_vary_search.affected_params_ = std::move(affected_params); no_vary_search.vary_on_key_order_ = vary_on_key_order; no_vary_search.vary_by_default_ = vary_by_default; return base::ok(no_vary_search); } +bool HttpNoVarySearchData::AreEquivalentOldImpl(const GURL& a, + const GURL& b) const { + // Check urls without query and reference (fragment) for equality first. + GURL::Replacements replacements; + replacements.ClearRef(); + replacements.ClearQuery(); + if (a.ReplaceComponents(replacements) != b.ReplaceComponents(replacements)) { + return false; + } + + // If equal, look at how HttpNoVarySearchData argument affects + // search params variance. + UrlSearchParams a_search_params(a); + UrlSearchParams b_search_params(b); + ApplyNoVarySearchRulesToBothParams(*this, a_search_params, b_search_params); + + // Check Search Params for equality + // All search params, in order, need to have the same keys and the same + // values. + return a_search_params.params() == b_search_params.params(); +} + +bool HttpNoVarySearchData::AreEquivalentNewImpl(const GURL& a, + const GURL& b) const { + if (ExtractBaseUrl(a) != ExtractBaseUrl(b)) { + return false; + } + + // If equal, look at how HttpNoVarySearchData argument affects + // search params variance. + UrlSearchParamsView a_search_params(a); + UrlSearchParamsView b_search_params(b); + ApplyNoVarySearchRulesToBothParams(*this, a_search_params, b_search_params); + + return a_search_params == b_search_params; +} + // LINT.IfChange(Serialization) void PickleTraits::Serialize( base::Pickle& pickle, const HttpNoVarySearchData& value) { WriteToPickle(pickle, HttpNoVarySearchData::kMagicNumber, - value.no_vary_params_, value.vary_params_, - value.vary_on_key_order_, value.vary_by_default_); + value.affected_params_, value.vary_on_key_order_, + value.vary_by_default_); } std::optional PickleTraits::Deserialize(base::PickleIterator& iter) { HttpNoVarySearchData result; uint32_t magic_number = 0u; - if (!ReadPickleInto(iter, magic_number, result.no_vary_params_, - result.vary_params_, result.vary_on_key_order_, - result.vary_by_default_)) { + if (!ReadPickleInto(iter, magic_number, result.affected_params_, + result.vary_on_key_order_, result.vary_by_default_)) { return std::nullopt; } @@ -262,20 +338,11 @@ PickleTraits::Deserialize(base::PickleIterator& iter) { return std::nullopt; } - if (result.vary_by_default_) { - if (result.vary_on_key_order_ && result.vary_params_.empty() && - result.no_vary_params_.empty()) { - // This is the default configuration in the absence of a No-Vary-Search - // header, and should never be stored in a HttpNoVarySearchData object. - return std::nullopt; - } - if (!result.vary_params_.empty()) { - return std::nullopt; - } - } else { - if (!result.no_vary_params_.empty()) { - return std::nullopt; - } + if (result.vary_by_default_ && result.vary_on_key_order_ && + result.affected_params_.empty()) { + // This is the default configuration in the absence of a No-Vary-Search + // header, and should never be stored in a HttpNoVarySearchData object. + return std::nullopt; } return result; @@ -284,8 +351,8 @@ PickleTraits::Deserialize(base::PickleIterator& iter) { size_t PickleTraits::PickleSize( const HttpNoVarySearchData& value) { return EstimatePickleSize(HttpNoVarySearchData::kMagicNumber, - value.no_vary_params_, value.vary_params_, - value.vary_on_key_order_, value.vary_by_default_); + value.affected_params_, value.vary_on_key_order_, + value.vary_by_default_); } // LINT.ThenChange(//net/http/http_no_vary_search_data.h:MagicNumber) diff --git a/naiveproxy/src/net/http/http_no_vary_search_data.h b/naiveproxy/src/net/http/http_no_vary_search_data.h index 9046ba44aa..cf35365420 100644 --- a/naiveproxy/src/net/http/http_no_vary_search_data.h +++ b/naiveproxy/src/net/http/http_no_vary_search_data.h @@ -44,9 +44,19 @@ class NET_EXPORT_PRIVATE HttpNoVarySearchData { HttpNoVarySearchData& operator=(const HttpNoVarySearchData&); HttpNoVarySearchData& operator=(HttpNoVarySearchData&&); + // Create an HttpNoVarySearchData object as if by a "No-Vary-Search: + // params=(`no_vary_params`)" header. If `vary_on_key_order` is false it is + // equivalent to including "key-order" in the header. Since an + // HttpNoVarySearchData object is required to have non-default behaviour, + // either `no_vary_params` must be non-empty or `vary_on_key_order` must be + // false. static HttpNoVarySearchData CreateFromNoVaryParams( const std::vector& no_vary_params, bool vary_on_key_order); + + // Create an HttpNoVarySearchData object as if by a "No-Vary-Search: params, + // except=(`vary_params`)" header. If `vary_on_key_order` is false it is + // equivalent to including "key-order" in the header. static HttpNoVarySearchData CreateFromVaryParams( const std::vector& vary_params, bool vary_on_key_order); @@ -65,44 +75,81 @@ class NET_EXPORT_PRIVATE HttpNoVarySearchData { // HttpNoVarySearchData objects can be used as a key in a map. std::strong_ordering operator<=>(const HttpNoVarySearchData& rhs) const; + // Returns true if urls `a` and `b` have the same base URL and their queries + // are equivalent according to the rules stored in this class. bool AreEquivalent(const GURL& a, const GURL& b) const; - const base::flat_set& no_vary_params() const; - const base::flat_set& vary_params() const; - bool vary_on_key_order() const; - bool vary_by_default() const; + // Returns a canonicalized version of the query part of `url` based on the + // rules stored in this class. This has the + // property that `AreEquivalent(a, b)` is true if and only if + // `RemoveQueryAndFragment(a) == RemoveQueryAndFragment(b)` and + // `CanonicalizeQuery(a) == CanonicalizeQuery(b)`. The return value is a + // UTF-8 string (not necessarily ASCII) and may end in significant whitespace. + std::string CanonicalizeQuery(const GURL& url) const; + + // Member accessor methods. + // TODO(crbug.com/455304285): Stop exposing internals in API. + const base::flat_set& affected_params() const { + return affected_params_; + } + bool vary_on_key_order() const { return vary_on_key_order_; } + bool vary_by_default() const { return vary_by_default_; } + + // Direct access to the two AreEquivalent() implementations for tests and + // benchmarking. + bool AreEquivalentOldImplForTesting(const GURL& a, const GURL& b) const; + bool AreEquivalentNewImplForTesting(const GURL& a, const GURL& b) const; private: friend struct PickleTraits; + // Permit HttpNoVarySearchData objects to be used as keys in Abseil maps. + template + friend H AbslHashValue(H h, const HttpNoVarySearchData& data) { + return H::combine(std::move(h), data.affected_params_, + data.vary_on_key_order_, data.vary_by_default_); + } + HttpNoVarySearchData(); static base::expected ParseNoVarySearchDictionary(const structured_headers::Dictionary& dict); + // The old implementation of AreEquivalent() using UrlSearchParams. + // TODO(https://crbug.com/444335347): Remove this. + bool AreEquivalentOldImpl(const GURL& a, const GURL& b) const; + + // The new implementation of AreEquivalent() using UrlSearchParamsView. + bool AreEquivalentNewImpl(const GURL& a, const GURL& b) const; + // LINT.IfChange(MagicNumber) // Magic number for serialization. This should be updated whenever the number // or types of member variables are changed. This will prevent accidental // misinterpretation of data from a previous version. // + // If member variables are added, AbslHashValue() above must also be changed. + // // Generated by the command: - // echo "HttpNoVarySearchData version 1" | md5sum | cut -b 1-8 - static constexpr uint32_t kMagicNumber = 0x652a610e; + // echo "HttpNoVarySearchData version 2" | md5sum | cut -b 1-8 + static constexpr uint32_t kMagicNumber = 0xfe1056f3; + + // The params that were listed in the No-Vary-Search header value. When + // `vary_by_default_` is true these parameters will be ignored when + // determining if two queries are equivalent. When `vary_by_default_` is + // false then only these headers will be checked when determining + // equivalence. When `vary_by_default_` and `vary_on_key_order_` are both + // true it is invalid for this set to be empty. + base::flat_set affected_params_; - // Query parameters which should be ignored when comparing a request - // to a cached response. This is empty if |vary_by_default_| is false. - base::flat_set no_vary_params_; - // Query parameters which should be respected when comparing a request - // to a cached response, even if |vary_by_default_| is false. This is empty - // if |vary_by_default_| is true. - base::flat_set vary_params_; // If false, parameters with distinct keys can be reordered in order to find a // cache hit. bool vary_on_key_order_ = true; - // If true, all parameters are significant except those in |no_vary_params_|. - // If false, only parameters in |vary_params_| are significant. + + // If true, parameters in `affected_params_` are ignored when checking + // equivalence. If false, only parameters in `affected_params_` are used when + // checking equivalence. bool vary_by_default_ = true; // LINT.ThenChange(//net/http/http_no_vary_search_data.cc:Serialization) @@ -121,6 +168,14 @@ struct NET_EXPORT_PRIVATE PickleTraits { static size_t PickleSize(const HttpNoVarySearchData& value); }; +class + NET_EXPORT_PRIVATE ScopedHttpNoVarySearchDataEquivalentImplementationOverrideForTesting { + public: + explicit ScopedHttpNoVarySearchDataEquivalentImplementationOverrideForTesting( + bool use_new_implementation); + ~ScopedHttpNoVarySearchDataEquivalentImplementationOverrideForTesting(); +}; + } // namespace net #endif // NET_HTTP_HTTP_NO_VARY_SEARCH_DATA_H_ diff --git a/naiveproxy/src/net/http/http_proxy_client_socket.cc b/naiveproxy/src/net/http/http_proxy_client_socket.cc index 9dc598bbac..2b864b051f 100644 --- a/naiveproxy/src/net/http/http_proxy_client_socket.cc +++ b/naiveproxy/src/net/http/http_proxy_client_socket.cc @@ -10,15 +10,20 @@ #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" #include "base/strings/string_util.h" +#include "base/types/expected.h" +#include "base/types/expected_macros.h" #include "base/values.h" #include "net/base/auth.h" +#include "net/base/completion_once_callback.h" #include "net/base/host_port_pair.h" #include "net/base/io_buffer.h" +#include "net/base/net_errors.h" #include "net/base/proxy_chain.h" #include "net/base/proxy_delegate.h" #include "net/http/http_basic_stream.h" #include "net/http/http_log_util.h" #include "net/http/http_network_session.h" +#include "net/http/http_request_headers.h" #include "net/http/http_request_info.h" #include "net/http/http_response_headers.h" #include "net/http/http_stream_parser.h" @@ -40,9 +45,7 @@ HttpProxyClientSocket::HttpProxyClientSocket( scoped_refptr http_auth_controller, ProxyDelegate* proxy_delegate, const NetworkTrafficAnnotationTag& traffic_annotation) - : io_callback_(base::BindRepeating(&HttpProxyClientSocket::OnIOComplete, - base::Unretained(this))), - user_agent_(user_agent), + : user_agent_(user_agent), socket_(std::move(socket)), endpoint_(endpoint), auth_(std::move(http_auth_controller)), @@ -238,6 +241,8 @@ int HttpProxyClientSocket::DidDrainBodyForAuthRestart() { http_stream_parser_.reset(); request_line_.clear(); request_headers_.Clear(); + authorization_headers_.Clear(); + proxy_delegate_headers_.Clear(); response_ = HttpResponseInfo(); return OK; } @@ -274,6 +279,13 @@ int HttpProxyClientSocket::DoLoop(int last_io_result) { case STATE_GENERATE_AUTH_TOKEN_COMPLETE: rv = DoGenerateAuthTokenComplete(rv); break; + case STATE_CALCULATE_HEADERS: + DCHECK_EQ(OK, rv); + rv = DoCalculateHeaders(); + break; + case STATE_CALCULATE_HEADERS_COMPLETE: + rv = DoCalculateHeadersComplete(rv); + break; case STATE_SEND_REQUEST: DCHECK_EQ(OK, rv); net_log_.BeginEvent( @@ -296,6 +308,17 @@ int HttpProxyClientSocket::DoLoop(int last_io_result) { net_log_.EndEventWithNetErrorCode( NetLogEventType::HTTP_TRANSACTION_TUNNEL_READ_HEADERS, rv); break; + case STATE_PROCESS_RESPONSE_HEADERS: + DCHECK_EQ(OK, rv); + rv = DoProcessResponseHeaders(); + break; + case STATE_PROCESS_RESPONSE_HEADERS_COMPLETE: + rv = DoProcessResponseHeadersComplete(rv); + break; + case STATE_PROCESS_RESPONSE_CODE: + DCHECK_EQ(OK, rv); + rv = DoProcessResponseCode(); + break; case STATE_DRAIN_BODY: DCHECK_EQ(OK, rv); rv = DoDrainBody(); @@ -315,13 +338,76 @@ int HttpProxyClientSocket::DoLoop(int last_io_result) { int HttpProxyClientSocket::DoGenerateAuthToken() { next_state_ = STATE_GENERATE_AUTH_TOKEN_COMPLETE; - return auth_->MaybeGenerateAuthToken(&request_, io_callback_, net_log_); + return auth_->MaybeGenerateAuthToken( + &request_, + base::BindOnce(&HttpProxyClientSocket::OnIOComplete, + weak_factory_.GetWeakPtr()), + net_log_); } int HttpProxyClientSocket::DoGenerateAuthTokenComplete(int result) { DCHECK_NE(ERR_IO_PENDING, result); - if (result == OK) + if (result == OK) { + next_state_ = STATE_CALCULATE_HEADERS; + } + return result; +} + +int HttpProxyClientSocket::DoCalculateHeaders() { + if (!request_line_.empty()) { next_state_ = STATE_SEND_REQUEST; + return OK; + } + next_state_ = STATE_CALCULATE_HEADERS_COMPLETE; + + authorization_headers_.Clear(); + proxy_delegate_headers_.Clear(); + + if (auth_->HaveAuth()) { + auth_->AddAuthorizationHeader(&authorization_headers_); + } + + if (proxy_delegate_) { + ASSIGN_OR_RETURN( + proxy_delegate_headers_, + proxy_delegate_->OnBeforeTunnelRequest( + proxy_chain_, proxy_chain_index_, + base::BindOnce( + &HttpProxyClientSocket::OnBeforeTunnelRequestComplete, + weak_factory_.GetWeakPtr())), + [](const auto& e) { + // Success should always be reported via a base::expected containing + // an HttpRequestHeaders, see ProxyDelegate::OnBeforeTunnelRequest. + CHECK_NE(OK, e); + return e; + }); + } + return OK; +} + +void HttpProxyClientSocket::OnBeforeTunnelRequestComplete( + base::expected result) { + if (result.has_value()) { + proxy_delegate_headers_ = std::move(result.value()); + OnIOComplete(OK); + } else { + // OnBeforeTunnelRequestComplete should never report ERR_IO_PENDING since + // it's used to signal that IO has completed. + CHECK_NE(ERR_IO_PENDING, result.error()); + // Success should always be reported via a base::expected containing an + // HttpRequestHeaders, see ProxyDelegate::OnBeforeTunnelRequest. + CHECK_NE(OK, result.error()); + OnIOComplete(result.error()); + } +} + +int HttpProxyClientSocket::DoCalculateHeadersComplete(int result) { + DCHECK_NE(ERR_IO_PENDING, result); + if (result != OK) { + return result; + } + next_state_ = STATE_SEND_REQUEST; + return result; } @@ -334,23 +420,8 @@ int HttpProxyClientSocket::DoSendRequest() { DCHECK(request_headers_.IsEmpty()); HttpRequestHeaders extra_headers; - if (auth_->HaveAuth()) - auth_->AddAuthorizationHeader(&extra_headers); - // AddAuthorizationHeader() might not have added the header even if - // HaveAuth(). - response_.did_use_http_auth = - extra_headers.HasHeader(HttpRequestHeaders::kProxyAuthorization); - - if (proxy_delegate_) { - HttpRequestHeaders proxy_delegate_headers; - int result = proxy_delegate_->OnBeforeTunnelRequest( - proxy_chain_, proxy_chain_index_, &proxy_delegate_headers); - if (result < 0) { - return result; - } - - extra_headers.MergeFrom(proxy_delegate_headers); - } + extra_headers.MergeFrom(authorization_headers_); + extra_headers.MergeFrom(proxy_delegate_headers_); BuildTunnelRequest(endpoint_, extra_headers, user_agent_, &request_line_, &request_headers_); @@ -364,9 +435,10 @@ int HttpProxyClientSocket::DoSendRequest() { http_stream_parser_ = std::make_unique( socket_.get(), is_reused_, request_.url, request_.method, /*upload_data_stream=*/nullptr, parser_buf_.get(), net_log_); - return http_stream_parser_->SendRequest(request_line_, request_headers_, - traffic_annotation_, &response_, - io_callback_); + return http_stream_parser_->SendRequest( + request_line_, request_headers_, traffic_annotation_, &response_, + base::BindOnce(&HttpProxyClientSocket::OnIOComplete, + base::Unretained(this))); } int HttpProxyClientSocket::DoSendRequestComplete(int result) { @@ -379,7 +451,8 @@ int HttpProxyClientSocket::DoSendRequestComplete(int result) { int HttpProxyClientSocket::DoReadHeaders() { next_state_ = STATE_READ_HEADERS_COMPLETE; - return http_stream_parser_->ReadResponseHeaders(io_callback_); + return http_stream_parser_->ReadResponseHeaders(base::BindOnce( + &HttpProxyClientSocket::OnIOComplete, base::Unretained(this))); } int HttpProxyClientSocket::DoReadHeadersComplete(int result) { @@ -390,19 +463,39 @@ int HttpProxyClientSocket::DoReadHeadersComplete(int result) { if (response_.headers->GetHttpVersion() < HttpVersion(1, 0)) return ERR_TUNNEL_CONNECTION_FAILED; + next_state_ = STATE_PROCESS_RESPONSE_HEADERS; + NetLogResponseHeaders( net_log_, NetLogEventType::HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, response_.headers.get()); + return OK; +} + +int HttpProxyClientSocket::DoProcessResponseHeaders() { + next_state_ = STATE_PROCESS_RESPONSE_HEADERS_COMPLETE; + if (proxy_delegate_) { - int rv = proxy_delegate_->OnTunnelHeadersReceived( - proxy_chain_, proxy_chain_index_, *response_.headers); - if (rv != OK) { - DCHECK_NE(ERR_IO_PENDING, rv); - return rv; - } + return proxy_delegate_->OnTunnelHeadersReceived( + proxy_chain_, proxy_chain_index_, *response_.headers, + base::BindOnce(&HttpProxyClientSocket::OnIOComplete, + weak_factory_.GetWeakPtr())); } + return OK; +} + +int HttpProxyClientSocket::DoProcessResponseHeadersComplete(int result) { + DCHECK_NE(ERR_IO_PENDING, result); + if (result != OK) { + return result; + } + + next_state_ = STATE_PROCESS_RESPONSE_CODE; + return OK; +} + +int HttpProxyClientSocket::DoProcessResponseCode() { switch (response_.headers->response_code()) { case 200: // OK if (http_stream_parser_->IsMoreDataBuffered()) @@ -442,7 +535,9 @@ int HttpProxyClientSocket::DoDrainBody() { DCHECK(drain_buf_.get()); next_state_ = STATE_DRAIN_BODY_COMPLETE; return http_stream_parser_->ReadResponseBody( - drain_buf_.get(), kDrainBodyBufferSize, io_callback_); + drain_buf_.get(), kDrainBodyBufferSize, + base::BindOnce(&HttpProxyClientSocket::OnIOComplete, + base::Unretained(this))); } int HttpProxyClientSocket::DoDrainBodyComplete(int result) { diff --git a/naiveproxy/src/net/http/http_proxy_client_socket.h b/naiveproxy/src/net/http/http_proxy_client_socket.h index b9dda34a7f..d7a7094eb8 100644 --- a/naiveproxy/src/net/http/http_proxy_client_socket.h +++ b/naiveproxy/src/net/http/http_proxy_client_socket.h @@ -12,6 +12,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" +#include "base/types/expected.h" #include "net/base/completion_once_callback.h" #include "net/base/completion_repeating_callback.h" #include "net/base/host_port_pair.h" @@ -97,10 +98,15 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocket : public ProxyClientSocket { STATE_NONE, STATE_GENERATE_AUTH_TOKEN, STATE_GENERATE_AUTH_TOKEN_COMPLETE, + STATE_CALCULATE_HEADERS, + STATE_CALCULATE_HEADERS_COMPLETE, STATE_SEND_REQUEST, STATE_SEND_REQUEST_COMPLETE, STATE_READ_HEADERS, STATE_READ_HEADERS_COMPLETE, + STATE_PROCESS_RESPONSE_HEADERS, + STATE_PROCESS_RESPONSE_HEADERS_COMPLETE, + STATE_PROCESS_RESPONSE_CODE, STATE_DRAIN_BODY, STATE_DRAIN_BODY_COMPLETE, STATE_DONE, @@ -117,20 +123,28 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocket : public ProxyClientSocket { void DoCallback(int result); void OnIOComplete(int result); + // Callback for proxy_delegate_->OnBeforeTunnelRequest(). + void OnBeforeTunnelRequestComplete( + base::expected result); + int DoLoop(int last_io_result); int DoGenerateAuthToken(); int DoGenerateAuthTokenComplete(int result); + int DoCalculateHeaders(); + int DoCalculateHeadersComplete(int result); int DoSendRequest(); int DoSendRequestComplete(int result); int DoReadHeaders(); int DoReadHeadersComplete(int result); + int DoProcessResponseHeaders(); + int DoProcessResponseHeadersComplete(int result); + int DoProcessResponseCode(); int DoDrainBody(); int DoDrainBodyComplete(int result); // Returns whether |next_state_| is STATE_DONE. bool CheckDone(); - CompletionRepeatingCallback io_callback_; State next_state_ = STATE_NONE; // Stores the callback provided by the caller of async operations. @@ -159,6 +173,9 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocket : public ProxyClientSocket { std::string request_line_; HttpRequestHeaders request_headers_; + HttpRequestHeaders authorization_headers_; + HttpRequestHeaders proxy_delegate_headers_; + const ProxyChain proxy_chain_; const size_t proxy_chain_index_; @@ -169,6 +186,8 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocket : public ProxyClientSocket { const NetworkTrafficAnnotationTag traffic_annotation_; const NetLogWithSource net_log_; + + base::WeakPtrFactory weak_factory_{this}; }; } // namespace net diff --git a/naiveproxy/src/net/http/http_proxy_connect_job.cc b/naiveproxy/src/net/http/http_proxy_connect_job.cc index b6c887d6cf..3c8b47326c 100644 --- a/naiveproxy/src/net/http/http_proxy_connect_job.cc +++ b/naiveproxy/src/net/http/http_proxy_connect_job.cc @@ -523,6 +523,7 @@ int HttpProxyConnectJob::DoTransportConnect() { common_connect_job_params()->spdy_session_pool->FindAvailableSession( CreateSpdySessionKey(), /*enable_ip_based_pooling_for_h2=*/false, /*is_websocket=*/false, net_log())) { + has_established_connection_ = true; next_state_ = STATE_SPDY_PROXY_CREATE_STREAM; return OK; } @@ -930,19 +931,13 @@ std::string HttpProxyConnectJob::GetUserAgent() const { SpdySessionKey HttpProxyConnectJob::CreateSpdySessionKey() const { // Construct the SpdySessionKey using a ProxyChain that corresponds to what we - // are sending the CONNECT to. For the first proxy server use - // `ProxyChain::Direct()`, and for the others use a proxy chain containing all + // are sending the CONNECT to. For the first proxy server use a direct proxy + // chain, and for the others use a proxy chain containing all // proxy servers that we have already connected through. - std::vector intermediate_proxy_servers; - for (size_t proxy_index = 0; proxy_index < params_->proxy_chain_index(); - ++proxy_index) { - intermediate_proxy_servers.push_back( - params_->proxy_chain().GetProxyServer(proxy_index)); - } - ProxyChain session_key_proxy_chain(std::move(intermediate_proxy_servers)); - if (params_->proxy_chain_index() == 0) { - DCHECK(session_key_proxy_chain.is_direct()); - } + ProxyChain session_key_proxy_chain = + params_->proxy_chain().Prefix(params_->proxy_chain_index()); + DCHECK(params_->proxy_chain_index() != 0 || + session_key_proxy_chain.is_direct()); // Note that `disable_cert_network_fetches` must be true for proxies to avoid // deadlock. See comment on diff --git a/naiveproxy/src/net/http/http_request_headers.cc b/naiveproxy/src/net/http/http_request_headers.cc index b292b19f2b..14e3752ec4 100644 --- a/naiveproxy/src/net/http/http_request_headers.cc +++ b/naiveproxy/src/net/http/http_request_headers.cc @@ -22,6 +22,7 @@ #include "net/log/net_log_capture_mode.h" #include "net/log/net_log_values.h" #include "third_party/abseil-cpp/absl/container/inlined_vector.h" +#include "url/gurl.h" namespace net { @@ -113,11 +114,21 @@ HttpRequestHeaders& HttpRequestHeaders::operator=( HttpRequestHeaders& HttpRequestHeaders::operator=(HttpRequestHeaders&& other) = default; +std::optional HttpRequestHeaders::GetHeaderView( + std::string_view key) const { + auto it = FindHeader(key); + if (it == headers_.end()) { + return std::nullopt; + } + return std::string_view(it->value); +} + std::optional HttpRequestHeaders::GetHeader( std::string_view key) const { auto it = FindHeader(key); - if (it == headers_.end()) + if (it == headers_.end()) { return std::nullopt; + } return it->value; } diff --git a/naiveproxy/src/net/http/http_request_headers.h b/naiveproxy/src/net/http/http_request_headers.h index 5b18919bcf..ee3a4ca47f 100644 --- a/naiveproxy/src/net/http/http_request_headers.h +++ b/naiveproxy/src/net/http/http_request_headers.h @@ -119,8 +119,9 @@ class NET_EXPORT HttpRequestHeaders { return FindHeader(key) != headers_.end(); } - // Gets the first header that matches |key|, if one exists. If none exist, + // Gets the first header that matches `key`, if one exists. If none exist, // returns std::nullopt. + std::optional GetHeaderView(std::string_view key) const; std::optional GetHeader(std::string_view key) const; // Clears all the headers. diff --git a/naiveproxy/src/net/http/http_response_headers.cc b/naiveproxy/src/net/http/http_response_headers.cc index 1354e5dd7e..998b9c2552 100644 --- a/naiveproxy/src/net/http/http_response_headers.cc +++ b/naiveproxy/src/net/http/http_response_headers.cc @@ -16,6 +16,7 @@ #include #include +#include "base/byte_count.h" #include "base/format_macros.h" #include "base/logging.h" #include "base/metrics/histogram_macros.h" @@ -1517,27 +1518,31 @@ bool HttpResponseHeaders::HasValidators() const { // From RFC 2616: // Content-Length = "Content-Length" ":" 1*DIGIT -int64_t HttpResponseHeaders::GetContentLength() const { - return GetInt64HeaderValue("content-length"); +std::optional HttpResponseHeaders::GetContentLength() const { + std::optional result = GetInt64HeaderValue("content-length"); + if (result.has_value()) { + return base::ByteCount(result.value()); + } + return std::nullopt; } -int64_t HttpResponseHeaders::GetInt64HeaderValue( - const std::string& header) const { +std::optional HttpResponseHeaders::GetInt64HeaderValue( + std::string_view header) const { size_t iter = 0; std::optional content_length = EnumerateHeader(&iter, header); if (!content_length || content_length->empty()) { - return -1; + return std::nullopt; } if ((*content_length)[0] == '+') { - return -1; + return std::nullopt; } int64_t result; bool ok = base::StringToInt64(*content_length, &result); if (!ok || result < 0) { - return -1; + return std::nullopt; } return result; diff --git a/naiveproxy/src/net/http/http_response_headers.h b/naiveproxy/src/net/http/http_response_headers.h index 0f59d653ed..f6014916af 100644 --- a/naiveproxy/src/net/http/http_response_headers.h +++ b/naiveproxy/src/net/http/http_response_headers.h @@ -14,6 +14,7 @@ #include #include +#include "base/byte_count.h" #include "base/check.h" #include "base/functional/callback.h" #include "base/memory/ref_counted.h" @@ -398,13 +399,13 @@ class NET_EXPORT HttpResponseHeaders // RFC 2616. bool HasValidators() const; - // Extracts the value of the Content-Length header or returns -1 if there is - // no such header in the response. - int64_t GetContentLength() const; - - // Extracts the value of the specified header or returns -1 if there is no + // Returns the value of the Content-Length header or nullopt if there is no // such header in the response. - int64_t GetInt64HeaderValue(const std::string& header) const; + std::optional GetContentLength() const; + + // Returns the value of the specified header or nullopt if there is no such + // header in the response. + std::optional GetInt64HeaderValue(std::string_view header) const; // Extracts the values in a Content-Range header and returns true if all three // values are present and valid for a 206 response; otherwise returns false. diff --git a/naiveproxy/src/net/http/http_response_headers_test_util.h b/naiveproxy/src/net/http/http_response_headers_test_util.h index a9efc85f9a..b7fcb69fdd 100644 --- a/naiveproxy/src/net/http/http_response_headers_test_util.h +++ b/naiveproxy/src/net/http/http_response_headers_test_util.h @@ -7,7 +7,7 @@ #include -#include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" namespace net { diff --git a/naiveproxy/src/net/http/http_response_info.cc b/naiveproxy/src/net/http/http_response_info.cc index bee263e2a1..ec1799edd0 100644 --- a/naiveproxy/src/net/http/http_response_info.cc +++ b/naiveproxy/src/net/http/http_response_info.cc @@ -93,7 +93,7 @@ enum { RESPONSE_INFO_HAS_CONNECTION_INFO = 1 << 18, // This bit is set if the request has http authentication. - RESPONSE_INFO_USE_HTTP_AUTHENTICATION = 1 << 19, + RESPONSE_INFO_USE_SERVER_HTTP_AUTHENTICATION = 1 << 19, // This bit is set if ssl_info has SCTs. RESPONSE_INFO_HAS_SIGNED_CERTIFICATE_TIMESTAMPS = 1 << 20, @@ -138,8 +138,8 @@ enum { // These values can be bit-wise combined to form the extra flags field of the // serialized HttpResponseInfo. enum { - // This bit is set if the request usd a shared dictionary for decoding its - // body. + // This bit was set if the request used a shared dictionary for decoding its + // body but is no longer persisted. RESPONSE_EXTRA_INFO_DID_USE_SHARED_DICTIONARY = 1, // This bit is set if the response has valid `proxy_chain`. @@ -318,7 +318,8 @@ bool HttpResponseInfo::InitFromPickle(const base::Pickle& pickle, *response_truncated = (flags & RESPONSE_INFO_TRUNCATED) != 0; - did_use_http_auth = (flags & RESPONSE_INFO_USE_HTTP_AUTHENTICATION) != 0; + did_use_server_http_auth = + (flags & RESPONSE_INFO_USE_SERVER_HTTP_AUTHENTICATION) != 0; unused_since_prefetch = (flags & RESPONSE_INFO_UNUSED_SINCE_PREFETCH) != 0; @@ -365,8 +366,10 @@ bool HttpResponseInfo::InitFromPickle(const base::Pickle& pickle, browser_run_id = std::make_optional(id); } - did_use_shared_dictionary = - (extra_flags & RESPONSE_EXTRA_INFO_DID_USE_SHARED_DICTIONARY) != 0; + // Do NOT restore the did_use_shared_dictionary flag since + // dictionary-compressed responses are decoded before being stored in cache. + // It is no longer persisted but old cache entries may have it set. + did_use_shared_dictionary = false; if (extra_flags & RESPONSE_EXTRA_INFO_HAS_PROXY_CHAIN) { std::optional unpickled_proxy_chain = @@ -416,8 +419,8 @@ std::unique_ptr HttpResponseInfo::MakePickle( if (connection_info != HttpConnectionInfo::kUNKNOWN) { flags |= RESPONSE_INFO_HAS_CONNECTION_INFO; } - if (did_use_http_auth) - flags |= RESPONSE_INFO_USE_HTTP_AUTHENTICATION; + if (did_use_server_http_auth) + flags |= RESPONSE_INFO_USE_SERVER_HTTP_AUTHENTICATION; if (unused_since_prefetch) flags |= RESPONSE_INFO_UNUSED_SINCE_PREFETCH; if (restricted_prefetch) @@ -434,10 +437,6 @@ std::unique_ptr HttpResponseInfo::MakePickle( if (browser_run_id.has_value()) flags |= RESPONSE_INFO_BROWSER_RUN_ID; - if (did_use_shared_dictionary) { - extra_flags |= RESPONSE_EXTRA_INFO_DID_USE_SHARED_DICTIONARY; - } - if (proxy_chain.IsValid()) { extra_flags |= RESPONSE_EXTRA_INFO_HAS_PROXY_CHAIN; } diff --git a/naiveproxy/src/net/http/http_response_info.h b/naiveproxy/src/net/http/http_response_info.h index 4757c67547..085af3ffd4 100644 --- a/naiveproxy/src/net/http/http_response_info.h +++ b/naiveproxy/src/net/http/http_response_info.h @@ -115,8 +115,8 @@ class NET_EXPORT HttpResponseInfo { // `InitFromPickle()`. bool was_mdl_match = false; - // Whether the request use http proxy or server authentication. - bool did_use_http_auth = false; + // Whether the request uses server authentication. + bool did_use_server_http_auth = false; // True if the resource was originally fetched for a prefetch and has not been // used since. @@ -204,6 +204,8 @@ class NET_EXPORT HttpResponseInfo { std::optional browser_run_id; // True if the response used a shared dictionary for decoding its body. + // This is always false for resources served from cache (where + // dictionary-compressed responses are stored uncompressed). bool did_use_shared_dictionary = false; }; diff --git a/naiveproxy/src/net/http/http_server_properties.cc b/naiveproxy/src/net/http/http_server_properties.cc index 885fae43e4..f367a6ffbc 100644 --- a/naiveproxy/src/net/http/http_server_properties.cc +++ b/naiveproxy/src/net/http/http_server_properties.cc @@ -11,6 +11,7 @@ #include "base/functional/bind.h" #include "base/location.h" #include "base/metrics/histogram_macros.h" +#include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/task/single_thread_task_runner.h" @@ -165,7 +166,10 @@ HttpServerProperties::HttpServerProperties( canonical_suffixes_({".ggpht.com", ".c.youtube.com", ".googlevideo.com", ".googleusercontent.com", ".gvt1.com"}), quic_server_info_map_(kDefaultMaxQuicServerEntries), - max_server_configs_stored_in_properties_(kDefaultMaxQuicServerEntries) {} + max_server_configs_stored_in_properties_(kDefaultMaxQuicServerEntries) { + // Identify known QUIC alternative services, if any. + MaybeProcessQuicHints(); +} HttpServerProperties::~HttpServerProperties() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); @@ -276,6 +280,11 @@ bool HttpServerProperties::RequiresHTTP11( const url::SchemeHostPort& server, const NetworkAnonymizationKey& network_anonymization_key) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + // Avoid overhead of copying the SchemeHostPort and the NAK in the very likely + // case the list of servers is empty. + if (servers_requiring_http_11_.empty()) { + return false; + } return RequiresHTTP11Internal(NormalizeSchemeHostPort(server), network_anonymization_key); } @@ -293,8 +302,12 @@ void HttpServerProperties::MaybeForceHTTP11( const NetworkAnonymizationKey& network_anonymization_key, SSLConfig* ssl_config) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - MaybeForceHTTP11Internal(NormalizeSchemeHostPort(server), - network_anonymization_key, ssl_config); + // No need for separate internal method here, since this can use + // RequiresHTTP11() to do the work normalizing `server`. + if (RequiresHTTP11(server, network_anonymization_key)) { + ssl_config->alpn_protos.clear(); + ssl_config->alpn_protos.push_back(NextProto::kProtoHTTP11); + } } AlternativeServiceInfoVector HttpServerProperties::GetAlternativeServiceInfos( @@ -345,6 +358,119 @@ void HttpServerProperties::SetAlternativeServices( alternative_service_info_vector); } +void HttpServerProperties::MaybeProcessQuicHints() { + if (!base::FeatureList::IsEnabled(features::kConfigureQuicHints)) { + return; + } + + // QUIC hints are in the format: host,port,alternate_port + const std::string comma_separated = features::kQuicHintHostPortPairs.Get(); + auto split = base::SplitStringPiece( + comma_separated, ",", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + + // Only process QUIC hints if they are present and well-formed + // i.e. every 3-tuple entry is complete + if (!split.empty() && split.size() % 3 == 0) { + for (size_t i = 0; i + 2 < split.size(); i += 3) { + ValidateAndMaybeAddQuicHint(split[i], split[i + 1], split[i + 2]); + } + } + + // Wildcard QUIC hints are in the format: .wildcard_suffix,port,alternate_port + // Note that a '*' is not included before the wildcard suffix to avoid + // needlessly removing it from the parameter. + const std::string comma_separated_wildcards = + features::kWildcardQuicHintHostPortPairs.Get(); + auto wildcards_split = + base::SplitStringPiece(comma_separated_wildcards, ",", + base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + if (!wildcards_split.empty() && wildcards_split.size() % 3 == 0) { + for (size_t i = 0; i + 2 < wildcards_split.size(); i += 3) { + ValidateAndMaybeAddQuicHint(wildcards_split[i], wildcards_split[i + 1], + wildcards_split[i + 2], /*is_suffix=*/true); + } + } +} + +void HttpServerProperties::ValidateAndMaybeAddQuicHint( + std::string_view host, + std::string_view port_string, + std::string_view alternate_port_string, + bool is_suffix) { + url::CanonHostInfo host_info; + std::string canon_host(net::CanonicalizeHost(host, &host_info)); + if (is_suffix) { + // Suffixes are required to start with "." to prevent unintentional matching + // i.e. "evil-example.com" with "example.com" + if (!base::StartsWith(canon_host, ".")) { + DLOG(ERROR) << "Invalid QUIC hint suffix: " << host; + return; + } + } else { + // IP addresses (e.g. DoH destinations) or well-formed hosts are valid + // QUIC hints + if (!host_info.IsIPAddress() && + !net::IsCanonicalizedHostCompliant(canon_host)) { + DLOG(ERROR) << "Invalid QUIC hint host: " << host; + return; + } + } + + int port = 0; + if (!base::StringToInt(port_string, &port)) { + DLOG(WARNING) << "Could not parse port number: " << port_string; + return; + } + if (port <= std::numeric_limits::min() || + port > std::numeric_limits::max()) { + DLOG(ERROR) << "Invalid QUIC hint port: " << port; + return; + } + + int alternate_port = 0; + if (!base::StringToInt(alternate_port_string, &alternate_port)) { + DLOG(WARNING) << "Could not parse alternate port number: " + << alternate_port_string; + return; + } + if (alternate_port <= std::numeric_limits::min() || + alternate_port > std::numeric_limits::max()) { + DLOG(ERROR) << "Invalid QUIC hint alternate port: " << alternate_port; + return; + } + + SetKnownQuicAlternativeService(canon_host, port, alternate_port, is_suffix); +} + +void HttpServerProperties::SetKnownQuicAlternativeService( + std::string_view canon_host, + int port, + int alternate_port, + bool is_suffix) { + if (!is_suffix) { + url::SchemeHostPort quic_server(url::kHttpsScheme, canon_host, port); + AlternativeService alternative_service( + net::NextProto::kProtoQUIC, canon_host, + static_cast(alternate_port)); + known_alternative_service_map_[quic_server] = + std::move(alternative_service); + return; + } + + // Wildcard suffixes are reversed and added to + // `reversed_known_alternative_service_suffixes_set_` to allow matching + // hostnames to use the corresponding known alternative service. + std::string reversed_host(canon_host); + std::ranges::reverse(reversed_host); + url::SchemeHostPort quic_server(url::kHttpsScheme, reversed_host, port); + AlternativeService alternative_service(net::NextProto::kProtoQUIC, + reversed_host, + static_cast(alternate_port)); + wildcard_known_alternative_service_map_[quic_server] = + std::move(alternative_service); + reversed_known_alternative_service_suffixes_set_.insert(reversed_host); +} + void HttpServerProperties::MarkAlternativeServiceBroken( const AlternativeService& alternative_service, const NetworkAnonymizationKey& network_anonymization_key) { @@ -587,8 +713,9 @@ void HttpServerProperties::SetMaxServerConfigsStoredInProperties( max_server_configs_stored_in_properties_ = max_server_configs_stored_in_properties; - // LRUCache doesn't allow the capacity of the cache to be changed. Thus create - // a new map with the new size and add current elements and swap the new map. + // LRUCache doesn't allow the capacity of the cache to be changed. Thus + // create a new map with the new size and add current elements and swap the + // new map. quic_server_info_map_.ShrinkToSize(max_server_configs_stored_in_properties_); QuicServerInfoMap temp_map(max_server_configs_stored_in_properties_); // Update the |canonical_server_info_map_| as well, so it stays in sync with @@ -671,10 +798,9 @@ bool HttpServerProperties::RequiresHTTP11Internal( if (server.host().empty()) return false; - auto spdy_info = server_info_map_.Get( + auto it = servers_requiring_http_11_.Get( CreateServerInfoKey(std::move(server), network_anonymization_key)); - return spdy_info != server_info_map_.end() && - spdy_info->second.requires_http11.value_or(false); + return it != servers_requiring_http_11_.end(); } void HttpServerProperties::SetHTTP11RequiredInternal( @@ -686,27 +812,12 @@ void HttpServerProperties::SetHTTP11RequiredInternal( if (server.host().empty()) return; - server_info_map_ - .GetOrPut( - CreateServerInfoKey(std::move(server), network_anonymization_key)) - ->second.requires_http11 = true; + servers_requiring_http_11_.Put( + CreateServerInfoKey(std::move(server), network_anonymization_key)); // No need to call MaybeQueueWriteProperties(), as this information is not // persisted to preferences. } -void HttpServerProperties::MaybeForceHTTP11Internal( - url::SchemeHostPort server, - const NetworkAnonymizationKey& network_anonymization_key, - SSLConfig* ssl_config) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK_NE(server.scheme(), url::kWsScheme); - DCHECK_NE(server.scheme(), url::kWssScheme); - if (RequiresHTTP11(std::move(server), network_anonymization_key)) { - ssl_config->alpn_protos.clear(); - ssl_config->alpn_protos.push_back(NextProto::kProtoHTTP11); - } -} - AlternativeServiceInfoVector HttpServerProperties::GetAlternativeServiceInfosInternal( const url::SchemeHostPort& origin, @@ -735,8 +846,8 @@ HttpServerProperties::GetAlternativeServiceInfosInternal( if (alternative_service.host.empty()) { alternative_service.host = origin.host(); } - // If the alternative service is equivalent to the origin (same host, same - // port, and both TCP), skip it. + // If the alternative service is equivalent to the origin (same host, + // same port, and both TCP), skip it. if (host_port_pair == alternative_service.GetHostPortPair() && alternative_service.protocol == NextProto::kProtoHTTP2) { ++it; @@ -761,6 +872,25 @@ HttpServerProperties::GetAlternativeServiceInfosInternal( return valid_alternative_service_infos; } + // If a more specific alternative service has not been found, look for + // preconfigured known alternative services. + std::optional known_alternative_service = + GetKnownAltSvcHost(origin); + if (known_alternative_service) { + // Update the host to use the full hostname instead of a possible wildcard + // suffix. + known_alternative_service->host = origin.host(); + if (known_alternative_service->protocol == NextProto::kProtoQUIC && + !IsAlternativeServiceBroken(*known_alternative_service, + network_anonymization_key)) { + valid_alternative_service_infos.push_back( + AlternativeServiceInfo::CreateQuicAlternativeServiceInfo( + *known_alternative_service, base::Time::Max(), + DefaultSupportedQuicVersions())); + return valid_alternative_service_infos; + } + } + auto canonical = GetCanonicalAltSvcHost(origin, network_anonymization_key); if (canonical == canonical_alt_svc_map_.end()) { return AlternativeServiceInfoVector(); @@ -845,8 +975,8 @@ void HttpServerProperties::SetAlternativeServicesInternal( need_update_pref = false; auto new_it = alternative_service_info_vector.begin(); for (const auto& old : *it->second.alternative_services) { - // Persist to disk immediately if new entry has different scheme, host, - // or port. + // Persist to disk immediately if new entry has different scheme, + // host, or port. if (old.alternative_service() != new_it->alternative_service()) { need_update_pref = true; break; @@ -860,8 +990,8 @@ void HttpServerProperties::SetAlternativeServicesInternal( need_update_pref = true; break; } - // Also persist to disk if new entry has a different list of advertised - // versions. + // Also persist to disk if new entry has a different list of + // advertised versions. if (old.advertised_versions() != new_it->advertised_versions()) { need_update_pref = true; break; @@ -1012,6 +1142,46 @@ HttpServerProperties::GetIteratorWithAlternativeServiceInfo( return server_info_map_.end(); } +std::optional HttpServerProperties::GetKnownAltSvcHost( + const url::SchemeHostPort& server) const { + const char* kKnownAltSvcScheme = url::kHttpsScheme; + if (server.scheme() != kKnownAltSvcScheme) { + return std::nullopt; + } + + auto it = known_alternative_service_map_.find(server); + if (it != known_alternative_service_map_.end()) { + return it->second; + } + std::string reversed_host = server.host(); + std::ranges::reverse(reversed_host); + const auto lower_bound_it = + reversed_known_alternative_service_suffixes_set_.lower_bound( + reversed_host); + // Exact matches cannot happen because wildcard suffixes are required to start + // with "." + if (lower_bound_it == + reversed_known_alternative_service_suffixes_set_.begin()) { + return std::nullopt; + } + // lower_bound_it points to the first element greater or equal to + // `reversed_host`. The last element that is less than + // `reversed_host` contains the most likely wildcard suffix match. + const auto possible_prefix_it = std::prev(lower_bound_it); + if (!reversed_host.starts_with(*possible_prefix_it)) { + return std::nullopt; + } + + url::SchemeHostPort suffix_server(kKnownAltSvcScheme, *possible_prefix_it, + server.port()); + auto suffix_it = wildcard_known_alternative_service_map_.find(suffix_server); + if (suffix_it != wildcard_known_alternative_service_map_.end()) { + return suffix_it->second; + } + + return std::nullopt; +} + HttpServerProperties::CanonicalMap::const_iterator HttpServerProperties::GetCanonicalAltSvcHost( const url::SchemeHostPort& server, @@ -1091,8 +1261,8 @@ void HttpServerProperties::OnPrefsLoaded( DCHECK(!is_initialized_); - // Either all of these are nullptr, or none of them are (except the broken alt - // service fields). + // Either all of these are nullptr, or none of them are (except the broken + // alt service fields). if (server_info_map) { OnServerInfoLoaded(std::move(server_info_map)); OnLastLocalAddressWhenQuicWorkedLoaded(last_local_address_when_quic_worked); @@ -1108,8 +1278,8 @@ void HttpServerProperties::OnPrefsLoaded( is_initialized_ = true; if (queue_write_on_load_) { - // Leaving this as true doesn't actually have any effect, but seems best to - // be safe. + // Leaving this as true doesn't actually have any effect, but seems best + // to be safe. queue_write_on_load_ = false; MaybeQueueWriteProperties(); } @@ -1150,11 +1320,6 @@ void HttpServerProperties::OnServerInfoLoaded( old_entry->second.alternative_services = server_info.alternative_services; if (!old_entry->second.server_network_stats.has_value()) old_entry->second.server_network_stats = server_info.server_network_stats; - - // |requires_http11| isn't saved to prefs, so the loaded entry should not - // have it set. Unconditionally copy it from the new entry. - DCHECK(!old_entry->second.requires_http11.has_value()); - old_entry->second.requires_http11 = server_info.requires_http11; } // Attempt to find canonical servers. Canonical suffix only apply to HTTPS. diff --git a/naiveproxy/src/net/http/http_server_properties.h b/naiveproxy/src/net/http/http_server_properties.h index 3938d42700..3e1f4bb683 100644 --- a/naiveproxy/src/net/http/http_server_properties.h +++ b/naiveproxy/src/net/http/http_server_properties.h @@ -96,6 +96,8 @@ class NET_EXPORT HttpServerProperties public: // Store at most 500 MRU ServerInfos in memory and disk. static const int kMaxServerInfoEntries = 500; + // Max number of servers that can be recorded as requiring HTTP/1.1. + static const int kMaxServersRequiringHttp11Entries = 100; // Provides an interface to interact with persistent preferences storage // implemented by the embedder. The prefs are assumed not to have been loaded @@ -148,10 +150,6 @@ class NET_EXPORT HttpServerProperties // priority over a not set value. std::optional supports_spdy; - // True if the server has previously indicated it required HTTP/1.1. Unlike - // other fields, not persisted to disk. - std::optional requires_http11; - std::optional alternative_services; std::optional server_network_stats; }; @@ -274,22 +272,16 @@ class NET_EXPORT HttpServerProperties // Returns true if |server| has required HTTP/1.1 via HTTP/2 error code, in // the context of |network_anonymization_key|. - // - // Any relevant HostMappingRules must already have been applied to `server`. bool RequiresHTTP11(const url::SchemeHostPort& server, const NetworkAnonymizationKey& network_anonymization_key); // Require HTTP/1.1 on subsequent connections, in the context of // |network_anonymization_key|. Not persisted. - // - // Any relevant HostMappingRules must already have been applied to `server`. void SetHTTP11Required( const url::SchemeHostPort& server, const NetworkAnonymizationKey& network_anonymization_key); // Modify SSLConfig to force HTTP/1.1 if necessary. - // - // Any relevant HostMappingRules must already have been applied to `server`. void MaybeForceHTTP11( const url::SchemeHostPort& server, const NetworkAnonymizationKey& network_anonymization_key, @@ -330,6 +322,25 @@ class NET_EXPORT HttpServerProperties const NetworkAnonymizationKey& network_anonymization_key, const AlternativeServiceInfoVector& alternative_service_info_vector); + // Process configured QUIC hints to identify known QUIC alternative services, + // if the kConfigureQuicHints feature is enabled. + void MaybeProcessQuicHints(); + + // Validates that the QUIC hint is well-formed and adds it as a known + // alternative service, if so. + // If `is_suffix` is true, `host` is matched as a wildcard suffix. + void ValidateAndMaybeAddQuicHint(std::string_view host, + std::string_view port_string, + std::string_view alternate_port_string, + bool is_suffix = false); + + // Sets a single known QUIC alternative service for `canon_host` and `port`, + // located at `canon_host` and `alternate_port`. + void SetKnownQuicAlternativeService(std::string_view canon_host, + int port, + int alternate_port, + bool is_suffix = false); + // Marks |alternative_service| as broken in the context of // |network_anonymization_key|. |alternative_service.host| must not be empty. void MarkAlternativeServiceBroken( @@ -502,10 +513,14 @@ class NET_EXPORT HttpServerProperties // friendness is no longer required. friend class HttpServerPropertiesPeer; - typedef base::flat_map CanonicalMap; - typedef base::flat_map - QuicCanonicalMap; - typedef std::vector CanonicalSuffixList; + using KnownAlternativeServiceMap = + base::flat_map; + using KnownAlternativeServiceSuffixSet = base::flat_set; + + using CanonicalMap = base::flat_map; + using QuicCanonicalMap = + base::flat_map; + using CanonicalSuffixList = std::vector; // Internal implementations of public methods. SchemeHostPort argument must be // normalized before calling (ws/wss replaced with http/https). Use wrapped @@ -520,10 +535,6 @@ class NET_EXPORT HttpServerProperties void SetHTTP11RequiredInternal( url::SchemeHostPort server, const NetworkAnonymizationKey& network_anonymization_key); - void MaybeForceHTTP11Internal( - url::SchemeHostPort server, - const NetworkAnonymizationKey& network_anonymization_key, - SSLConfig* ssl_config); AlternativeServiceInfoVector GetAlternativeServiceInfosInternal( const url::SchemeHostPort& origin, const NetworkAnonymizationKey& network_anonymization_key); @@ -559,6 +570,11 @@ class NET_EXPORT HttpServerProperties const url::SchemeHostPort& server, const NetworkAnonymizationKey& network_anonymization_key); + // Return the known alternative service host for |server|, or std::nullopt if + // none exists. + std::optional GetKnownAltSvcHost( + const url::SchemeHostPort& server) const; + // Return the canonical host for |server| in the context of // |network_anonymization_key|, or end if none exists. CanonicalMap::const_iterator GetCanonicalAltSvcHost( @@ -639,9 +655,33 @@ class NET_EXPORT HttpServerProperties ServerInfoMap server_info_map_; + // Set of servers that require HTTP/1.1. Not persisted to disk. This is + // separate from ServerInfoMap because it's generally empty, and has to be + // checked on every network request, rather than only when establishing + // connections. + base::LRUCacheSet servers_requiring_http_11_{ + kMaxServersRequiringHttp11Entries}; + BrokenAlternativeServices broken_alternative_services_; IPAddress last_local_address_when_quic_worked_; + + // Contains a map of servers which use a known alternative service. + // Map from a scheme/host/port to the AlternativeService + // with the known alternative service info. + KnownAlternativeServiceMap known_alternative_service_map_; + + // Contains a map of suffixes for servers which use a known alternative + // service. Map from a scheme/host/port to the AlternativeService + // with the known alternative service info. Hosts are reversed to allow for + // efficient comparison. + KnownAlternativeServiceMap wildcard_known_alternative_service_map_; + + // Contains list of suffixes of hostnames with known alternative + // services. Suffixes are reversed to allow for efficient comparison. + KnownAlternativeServiceSuffixSet + reversed_known_alternative_service_suffixes_set_; + // Contains a map of servers which could share the same alternate protocol. // Map from a Canonical scheme/host/port/NAK (host is some postfix of host // names) to an actual origin, which has a plausible alternate protocol diff --git a/naiveproxy/src/net/http/http_server_properties_manager.cc b/naiveproxy/src/net/http/http_server_properties_manager.cc index ebaa8e9a5e..9340c13447 100644 --- a/naiveproxy/src/net/http/http_server_properties_manager.cc +++ b/naiveproxy/src/net/http/http_server_properties_manager.cc @@ -183,7 +183,7 @@ std::optional QuicServerIdFromString( return std::nullopt; } std::optional privacy_mode = - PrivacyModeFromPathString(url.path_piece()); + PrivacyModeFromPathString(url.path()); if (!privacy_mode.has_value()) { return std::nullopt; } @@ -797,7 +797,7 @@ void HttpServerPropertiesManager::WriteToPrefs( servers_list.Append(std::move(server_dict)); } // Reverse `servers_list`. The least recently used item will be in the front. - std::reverse(servers_list.begin(), servers_list.end()); + std::ranges::reverse(servers_list); http_server_properties_dict.Set(kServersKey, std::move(servers_list)); diff --git a/naiveproxy/src/net/http/http_stream_factory.cc b/naiveproxy/src/net/http/http_stream_factory.cc index b506ce5289..699066ad2d 100644 --- a/naiveproxy/src/net/http/http_stream_factory.cc +++ b/naiveproxy/src/net/http/http_stream_factory.cc @@ -16,7 +16,6 @@ #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/time/time.h" -#include "net/base/host_mapping_rules.h" #include "net/base/host_port_pair.h" #include "net/base/load_flags.h" #include "net/base/network_anonymization_key.h" @@ -48,13 +47,11 @@ namespace net { namespace { const char kAlternativeServiceHeader[] = "Alt-Svc"; - } // namespace // static SpdySessionKey HttpStreamFactory::GetSpdySessionKey( const ProxyChain& proxy_chain, - const GURL& origin_url, const StreamRequestInfo& request_info) { // In the case that we'll be sending a GET request to the proxy, look for an // HTTP/2 proxy session *to* the proxy, instead of to the origin server. The @@ -63,7 +60,7 @@ SpdySessionKey HttpStreamFactory::GetSpdySessionKey( // SpdySession pool, and uses it directly (completely ignoring the result of // the ConnectJob, and in fact cancelling it). So we need to create the same // key used by the HttpProxyConnectJob for the last proxy in the chain. - if (IsGetToProxy(proxy_chain, origin_url)) { + if (IsGetToProxy(proxy_chain, request_info.url)) { // For this to work as expected, the whole chain should be HTTPS. for (const auto& proxy_server : proxy_chain.proxy_servers()) { CHECK(proxy_server.is_https()); @@ -81,8 +78,8 @@ SpdySessionKey HttpStreamFactory::GetSpdySessionKey( /*disable_cert_network_fetches=*/true); } return SpdySessionKey( - HostPortPair::FromURL(origin_url), request_info.privacy_mode, proxy_chain, - SessionUsage::kDestination, request_info.socket_tag, + HostPortPair::FromURL(request_info.url), request_info.privacy_mode, + proxy_chain, SessionUsage::kDestination, request_info.socket_tag, request_info.network_anonymization_key, request_info.secure_dns_policy, request_info.load_flags & LOAD_DISABLE_CERT_NETWORK_FETCHES); } @@ -100,7 +97,8 @@ HttpStreamFactory::StreamRequestInfo::StreamRequestInfo() = default; HttpStreamFactory::StreamRequestInfo::StreamRequestInfo( const HttpRequestInfo& http_request_info) - : method(http_request_info.method), + : url(RemoveCredentialsFromUrl(http_request_info.url)), + method(http_request_info.method), network_anonymization_key(http_request_info.network_anonymization_key), traffic_annotation(http_request_info.traffic_annotation), is_http1_allowed(!http_request_info.upload_data_stream || @@ -147,23 +145,13 @@ void HttpStreamFactory::ProcessAlternativeServices( } session->http_server_properties()->SetAlternativeServices( - RewriteHost(http_server), network_anonymization_key, + http_server, network_anonymization_key, net::ProcessAlternativeServices( alternative_service_vector, session->params().enable_http2, session->params().enable_quic, session->context().quic_context->params()->supported_versions)); } -url::SchemeHostPort HttpStreamFactory::RewriteHost( - const url::SchemeHostPort& server) { - HostPortPair host_port_pair(server.host(), server.port()); - const HostMappingRules* mapping_rules = GetHostMappingRules(); - if (mapping_rules) - mapping_rules->RewriteHost(&host_port_pair); - return url::SchemeHostPort(server.scheme(), host_port_pair.host(), - host_port_pair.port()); -} - std::unique_ptr HttpStreamFactory::RequestStream( const HttpRequestInfo& request_info, RequestPriority priority, @@ -247,13 +235,16 @@ std::unique_ptr HttpStreamFactory::RequestStreamInternal( } void HttpStreamFactory::PreconnectStreams(int num_streams, - HttpRequestInfo& request_info) { + HttpRequestInfo& request_info, + base::OnceClosure callback) { // Ignore invalid URLs. This matches the behavior of // URLRequestJobFactory::CreateJob(). Passing very long valid GURLs over Mojo // can result in invalid URLs, so can't rely on callers sending only valid // URLs. if (!request_info.url.is_valid()) { - OnPreconnectsCompleteInternal(); + if (callback) { + std::move(callback).Run(); + } return; } @@ -269,11 +260,7 @@ void HttpStreamFactory::PreconnectStreams(int num_streams, /*allowed_bad_certs=*/std::vector()); JobController* job_controller_raw_ptr = job_controller.get(); job_controller_set_.insert(std::move(job_controller)); - job_controller_raw_ptr->Preconnect(num_streams); -} - -const HostMappingRules* HttpStreamFactory::GetHostMappingRules() const { - return &session_->params().host_mapping_rules; + job_controller_raw_ptr->Preconnect(num_streams, std::move(callback)); } void HttpStreamFactory::OnJobControllerComplete(JobController* controller) { diff --git a/naiveproxy/src/net/http/http_stream_factory.h b/naiveproxy/src/net/http/http_stream_factory.h index 48eb850731..2ebf74adf4 100644 --- a/naiveproxy/src/net/http/http_stream_factory.h +++ b/naiveproxy/src/net/http/http_stream_factory.h @@ -14,6 +14,7 @@ #include #include "base/containers/unique_ptr_adapters.h" +#include "base/functional/callback_forward.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" #include "net/base/host_port_pair.h" @@ -38,7 +39,6 @@ namespace net { -class HostMappingRules; class HttpNetworkSession; class HttpResponseHeaders; @@ -83,6 +83,12 @@ class NET_EXPORT HttpStreamFactory { ~StreamRequestInfo(); + // At this layer and below, only PAC scripts need the full URL. Everything + // else wants, at most, the SchemeHostPort. The URL has its + // username/password fields removed, to protect against leaking user + // information when logging. + GURL url; + std::string method; NetworkAnonymizationKey network_anonymization_key; MutableNetworkTrafficAnnotationTag traffic_annotation; @@ -100,7 +106,6 @@ class NET_EXPORT HttpStreamFactory { // Calculates an appropriate SPDY session key for the given parameters. static SpdySessionKey GetSpdySessionKey( const ProxyChain& proxy_chain, - const GURL& origin_url, const StreamRequestInfo& request_info); // Returns whether an appropriate SPDY session would correspond to either a @@ -165,9 +170,12 @@ class NET_EXPORT HttpStreamFactory { // Requests that enough connections for |num_streams| be opened. // // TODO: Make this take StreamRequestInfo instead. - void PreconnectStreams(int num_streams, HttpRequestInfo& info); - - const HostMappingRules* GetHostMappingRules() const; + // TODO(crbug.com/crbug.com/40843081): Change `callback` to + // CompletionOnceCallback so that the caller can check the result. Currently + // TransportClientSocketPool doesn't plumb errors correctly. + void PreconnectStreams(int num_streams, + HttpRequestInfo& info, + base::OnceClosure callback); private: FRIEND_TEST_ALL_PREFIXES(HttpStreamRequestTest, SetPriority); @@ -177,8 +185,6 @@ class NET_EXPORT HttpStreamFactory { using JobControllerSet = std::set, base::UniquePtrComparator>; - url::SchemeHostPort RewriteHost(const url::SchemeHostPort& server); - // Values must not be changed or reused. Keep in sync with identically named // enum in histograms.xml. enum AlternativeServiceType { @@ -202,9 +208,6 @@ class NET_EXPORT HttpStreamFactory { bool enable_alternative_services, const NetLogWithSource& net_log); - // Called when the Preconnect completes. Used for testing. - virtual void OnPreconnectsCompleteInternal() {} - // Called when the JobController finishes service. Delete the JobController // from |job_controller_set_|. void OnJobControllerComplete(JobController* controller); diff --git a/naiveproxy/src/net/http/http_stream_factory_job.cc b/naiveproxy/src/net/http/http_stream_factory_job.cc index d2ff50d380..1e7c2bf349 100644 --- a/naiveproxy/src/net/http/http_stream_factory_job.cc +++ b/naiveproxy/src/net/http/http_stream_factory_job.cc @@ -13,9 +13,11 @@ #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/location.h" +#include "base/metrics/histogram_functions.h" #include "base/notreached.h" #include "base/strings/string_util.h" #include "base/task/single_thread_task_runner.h" +#include "base/time/time.h" #include "base/values.h" #include "net/base/host_port_pair.h" #include "net/base/load_flags.h" @@ -109,7 +111,6 @@ HttpStreamFactory::Job::Job( const ProxyInfo& proxy_info, const std::vector& allowed_bad_certs, url::SchemeHostPort destination, - GURL origin_url, NextProto alternative_protocol, quic::ParsedQuicVersion quic_version, bool is_websocket, @@ -127,17 +128,16 @@ HttpStreamFactory::Job::Job( connection_(std::make_unique()), session_(session), destination_(std::move(destination)), - origin_url_(std::move(origin_url)), is_websocket_(is_websocket), try_websocket_over_http2_(is_websocket_ && - origin_url_.SchemeIs(url::kWssScheme)), + request_info_.url.SchemeIs(url::kWssScheme)), // Only support IP-based pooling for non-proxied streams. enable_ip_based_pooling_for_h2_(enable_ip_based_pooling_for_h2 && proxy_info.is_direct()), delegate_(delegate), job_type_(job_type), - using_ssl_(origin_url_.SchemeIs(url::kHttpsScheme) || - origin_url_.SchemeIs(url::kWssScheme)), + using_ssl_(request_info_.url.SchemeIs(url::kHttpsScheme) || + request_info_.url.SchemeIs(url::kWssScheme)), using_quic_( alternative_protocol == NextProto::kProtoQUIC || session->ShouldForceQuic(destination_, proxy_info, is_websocket_) || @@ -146,11 +146,10 @@ HttpStreamFactory::Job::Job( expect_spdy_(alternative_protocol == NextProto::kProtoHTTP2 && !using_quic_), quic_request_(session_->quic_session_pool()), - spdy_session_key_(using_quic_ - ? SpdySessionKey() - : GetSpdySessionKey(proxy_info_.proxy_chain(), - origin_url_, - request_info_)), + spdy_session_key_( + using_quic_ + ? SpdySessionKey() + : GetSpdySessionKey(proxy_info_.proxy_chain(), request_info_)), management_config_(management_config) { // Websocket `destination` schemes should be converted to HTTP(S). DCHECK(base::EqualsCaseInsensitiveASCII(destination_.scheme(), @@ -185,7 +184,7 @@ HttpStreamFactory::Job::Job( } if (expect_spdy_) { - DCHECK(origin_url_.SchemeIs(url::kHttpsScheme)); + DCHECK(request_info_.url.SchemeIs(url::kHttpsScheme)); } if (using_quic_) { DCHECK(session_->IsQuicEnabled()); @@ -194,9 +193,9 @@ HttpStreamFactory::Job::Job( DCHECK(request_info_.socket_tag == SocketTag()); } if (is_websocket_) { - DCHECK(origin_url_.SchemeIsWSOrWSS()); + DCHECK(request_info_.url.SchemeIsWSOrWSS()); } else { - DCHECK(!origin_url_.SchemeIsWSOrWSS()); + DCHECK(!request_info_.url.SchemeIsWSOrWSS()); } } @@ -232,7 +231,7 @@ void HttpStreamFactory::Job::Start(HttpStreamRequest::StreamType stream_type) { source.AddToEventParameters(dict); } dict.Set("logical_destination", - url::SchemeHostPort(origin_url_).Serialize()); + url::SchemeHostPort(request_info_.url).Serialize()); dict.Set("destination", destination_.Serialize()); dict.Set("expect_spdy", expect_spdy_); dict.Set("using_quic", using_quic_); @@ -259,9 +258,9 @@ int HttpStreamFactory::Job::Preconnect(int num_streams) { bool connect_one_stream = base::FeatureList::IsEnabled(kLimitEarlyPreconnectsExperiment) && !http_server_properties->IsInitialized() && - origin_url_.SchemeIsCryptographic(); + request_info_.url.SchemeIsCryptographic(); if (connect_one_stream || http_server_properties->SupportsRequestPriority( - url::SchemeHostPort(origin_url_), + url::SchemeHostPort(request_info_.url), request_info_.network_anonymization_key)) { num_streams_ = 1; } else { @@ -335,10 +334,11 @@ bool HttpStreamFactory::Job::HasAvailableQuicSession() const { (job_type_ == DNS_ALPN_H3) || (job_type_ == PRECONNECT_DNS_ALPN_H3); QuicSessionKey quic_session_key( - HostPortPair::FromURL(origin_url_), request_info_.privacy_mode, + HostPortPair::FromURL(request_info_.url), request_info_.privacy_mode, proxy_info_.proxy_chain(), SessionUsage::kDestination, request_info_.socket_tag, request_info_.network_anonymization_key, - request_info_.secure_dns_policy, require_dns_https_alpn); + request_info_.secure_dns_policy, require_dns_https_alpn, + disable_cert_verification_network_fetches()); return session_->quic_session_pool()->CanUseExistingSession(quic_session_key, destination_); } @@ -399,7 +399,7 @@ bool HttpStreamFactory::Job::CanUseExistingSpdySession() const { DCHECK(!using_quic_); if (session_->http_server_properties()->RequiresHTTP11( - url::SchemeHostPort(origin_url_), + url::SchemeHostPort(request_info_.url), request_info_.network_anonymization_key)) { return false; } @@ -408,14 +408,14 @@ bool HttpStreamFactory::Job::CanUseExistingSpdySession() const { return try_websocket_over_http2_; } - DCHECK(origin_url_.SchemeIsHTTPOrHTTPS()); + DCHECK(request_info_.url.SchemeIsHTTPOrHTTPS()); // We need to make sure that if a HTTP/2 session was created for // https://somehost/ then we do not use that session for http://somehost:443/. // The only time we can use an existing session is if the request URL is // https (the normal case) or if we are connecting to an HTTPS proxy to make // a GET request for an HTTP destination. https://crbug.com/133176 - if (origin_url_.SchemeIs(url::kHttpsScheme)) { + if (request_info_.url.SchemeIs(url::kHttpsScheme)) { return true; } if (!proxy_info_.is_empty()) { @@ -428,12 +428,15 @@ bool HttpStreamFactory::Job::CanUseExistingSpdySession() const { return false; } -void HttpStreamFactory::Job::OnStreamReadyCallback() { +void HttpStreamFactory::Job::OnStreamReadyCallback( + base::TimeTicks stream_ready_time) { DCHECK(stream_.get()); DCHECK_NE(job_type_, PRECONNECT); DCHECK_NE(job_type_, PRECONNECT_DNS_ALPN_H3); DCHECK(!is_websocket_ || try_websocket_over_http2_); + base::UmaHistogramTimes("Net.HttpStreamFactory.OnStreamReadyCallbackDelay", + base::TimeTicks::Now() - stream_ready_time); MaybeCopyConnectionAttemptsFromHandle(); delegate_->OnStreamReady(this); @@ -590,8 +593,9 @@ void HttpStreamFactory::Job::RunLoop(int result) { } else { DCHECK(stream_.get()); TaskRunner(priority_)->PostTask( - FROM_HERE, base::BindOnce(&Job::OnStreamReadyCallback, - ptr_factory_.GetWeakPtr())); + FROM_HERE, + base::BindOnce(&Job::OnStreamReadyCallback, + ptr_factory_.GetWeakPtr(), base::TimeTicks::Now())); } return; @@ -655,7 +659,7 @@ int HttpStreamFactory::Job::StartInternal() { int HttpStreamFactory::Job::DoStart() { // Don't connect to restricted ports. if (!IsPortAllowedForScheme(destination_.port(), - origin_url_.scheme_piece())) { + request_info_.url.scheme())) { return ERR_UNSAFE_PORT; } @@ -716,13 +720,7 @@ int HttpStreamFactory::Job::DoInitConnectionImpl() { next_state_ = STATE_INIT_CONNECTION_COMPLETE; if (using_quic_) { - // TODO(mmenke): Clean this up. `disable_cert_verification_network_fetches` - // is enabled in ConnectJobFactory for H1/H2 connections. Also need to add - // it to the SpdySessionKey for H2 connections. - SSLConfig server_ssl_config; - server_ssl_config.disable_cert_verification_network_fetches = - disable_cert_verification_network_fetches(); - return DoInitConnectionImplQuic(server_ssl_config.GetCertVerifyFlags()); + return DoInitConnectionImplQuic(); } // Check first if there is a pushed stream matching the request, or an HTTP/2 @@ -769,6 +767,12 @@ int HttpStreamFactory::Job::DoInitConnectionImpl() { } } if (existing_spdy_session_) { + // If we have a session, and we have a connection management config, add + // it to the session pool. + if (management_config_.has_value()) { + session_->spdy_session_pool()->AddConnectionManagementConfig( + spdy_session_key_, management_config_.value()); + } // Stop watching for SpdySessions. spdy_session_request_.reset(); @@ -831,8 +835,7 @@ int HttpStreamFactory::Job::DoInitConnectionImpl() { proxy_auth_callback, /*fail_if_alias_requires_proxy_override_=*/false); } -int HttpStreamFactory::Job::DoInitConnectionImplQuic( - int server_cert_verifier_flags) { +int HttpStreamFactory::Job::DoInitConnectionImplQuic() { url::SchemeHostPort destination; bool require_dns_https_alpn = @@ -862,6 +865,11 @@ int HttpStreamFactory::Job::DoInitConnectionImplQuic( ? MultiplexedSessionCreationInitiator::kPreconnect : MultiplexedSessionCreationInitiator::kUnknown; + SSLConfig server_ssl_config; + server_ssl_config.disable_cert_verification_network_fetches = + disable_cert_verification_network_fetches(); + int server_cert_verifier_flags = server_ssl_config.GetCertVerifyFlags(); + // The QuicSessionRequest will take care of connecting to any proxies in the // proxy chain. int rv = quic_request_.Request( @@ -870,8 +878,8 @@ int HttpStreamFactory::Job::DoInitConnectionImplQuic( SessionUsage::kDestination, request_info_.privacy_mode, priority_, request_info_.socket_tag, request_info_.network_anonymization_key, request_info_.secure_dns_policy, require_dns_https_alpn, - server_cert_verifier_flags, origin_url_, net_log_, &net_error_details_, - initiator, management_config_, + server_cert_verifier_flags, request_info_.url, net_log_, + &net_error_details_, initiator, management_config_, base::BindOnce(&Job::OnFailedOnDefaultNetwork, ptr_factory_.GetWeakPtr()), io_callback_); if (rv == OK) { @@ -931,6 +939,22 @@ int HttpStreamFactory::Job::DoInitConnectionComplete(int result) { // established. spdy_session_request_.reset(); + if (!using_quic_ && management_config_.has_value()) { + // If `DoInitConnection` has completed successfully, we should have a + // session in the pool. Note that we cannot rely on `result`, since we would + // always get `OK` for preconnects in this situation. + if (session_->spdy_session_pool()->FindAvailableSession( + spdy_session_key_, enable_ip_based_pooling_for_h2_, is_websocket_, + net_log_)) { + session_->spdy_session_pool()->AddConnectionManagementConfig( + spdy_session_key_, management_config_.value()); + } else if (management_config_->connection_change_observer) { + // If we do not have a session, then we should notify the + // ConnectionChangeObserver that the connection establishment has failed. + management_config_->connection_change_observer->OnConnectionFailed(); + } + } + if ((job_type_ == PRECONNECT) || (job_type_ == PRECONNECT_DNS_ALPN_H3)) { if (using_quic_) { return result; @@ -965,7 +989,7 @@ int HttpStreamFactory::Job::DoInitConnectionComplete(int result) { // Only connections that use TLS (either to the origin or via a GET to a // secure proxy) can negotiate ALPN. bool get_to_secure_proxy = - IsGetToProxy(proxy_info_.proxy_chain(), origin_url_) && + IsGetToProxy(proxy_info_.proxy_chain(), request_info_.url) && proxy_info_.proxy_chain().Last().is_secure_http_like(); DCHECK(using_ssl_ || get_to_secure_proxy); negotiated_protocol_ = connection_->socket()->GetNegotiatedProtocol(); @@ -1069,6 +1093,8 @@ int HttpStreamFactory::Job::SetSpdyHttpStreamOrBidirectionalStreamImpl( auto dns_aliases = session_->spdy_session_pool()->GetDnsAliasesForSessionKey( spdy_session_key_); + used_existing_spdy_session_ = existing_spdy_session_ != nullptr; + if (is_websocket_) { DCHECK_NE(job_type_, PRECONNECT); DCHECK_NE(job_type_, PRECONNECT_DNS_ALPN_H3); @@ -1144,6 +1170,12 @@ int HttpStreamFactory::Job::DoCreateStream() { /* is_websocket = */ false, net_log_); } if (existing_spdy_session_) { + // If we have a session, and we have a connection management config, add + // it to the session pool. + if (management_config_.has_value()) { + session_->spdy_session_pool()->AddConnectionManagementConfig( + spdy_session_key_, management_config_.value()); + } // We picked up an existing session, so we don't need our socket. if (connection_->socket()) { connection_->socket()->Disconnect(); @@ -1171,7 +1203,8 @@ int HttpStreamFactory::Job::DoCreateStream() { int rv = session_->spdy_session_pool()->CreateAvailableSessionFromSocketHandle( spdy_session_key_, std::move(connection_), net_log_, initiator, - &spdy_session, SpdySessionInitiator::kHttpStreamFactoryJob); + &spdy_session, management_config_, + SpdySessionInitiator::kHttpStreamFactoryJob); if (rv != OK) { return rv; @@ -1200,6 +1233,10 @@ void HttpStreamFactory::Job::OnSpdySessionAvailable( base::WeakPtr spdy_session) { DCHECK(spdy_session); + net_log_.AddEventReferencingSource( + NetLogEventType::HTTP_STREAM_JOB_HTTP2_SESSION_AVAILABLE, + spdy_session->net_log().source()); + // No need for the connection any more, since |spdy_session| can be used // instead, and there's no benefit from keeping the old ConnectJob in the // socket pool. @@ -1226,15 +1263,17 @@ void HttpStreamFactory::Job::OnSpdySessionAvailable( existing_spdy_session_ = spdy_session; next_state_ = STATE_CREATE_STREAM; - // This will synchronously close |connection_|, so no need to worry about it - // calling back into |this|. + // This will synchronously close `connection_`, so no need to worry about it + // calling back into `this`. It will also immediately use + // `existing_spdy_session_`, so there are no concerns about it being destroyed + // before use. RunLoop(OK); } int HttpStreamFactory::Job::ReconsiderProxyAfterError(int error) { // Check if the error was a proxy failure. if (!CanFalloverToNextProxy(proxy_info_.proxy_chain(), error, &error, - proxy_info_.is_for_ip_protection())) { + session_->context().proxy_delegate)) { return error; } @@ -1265,7 +1304,6 @@ HttpStreamFactory::JobFactory::CreateJob( const ProxyInfo& proxy_info, const std::vector& allowed_bad_certs, url::SchemeHostPort destination, - GURL origin_url, bool is_websocket, bool enable_ip_based_pooling_for_h2, NetLog* net_log, @@ -1274,9 +1312,9 @@ HttpStreamFactory::JobFactory::CreateJob( std::optional management_config) { return std::make_unique( delegate, job_type, session, request_info, priority, proxy_info, - allowed_bad_certs, std::move(destination), origin_url, - alternative_protocol, quic_version, is_websocket, - enable_ip_based_pooling_for_h2, management_config, net_log); + allowed_bad_certs, std::move(destination), alternative_protocol, + quic_version, is_websocket, enable_ip_based_pooling_for_h2, + management_config, net_log); } bool HttpStreamFactory::Job::ShouldThrottleConnectForSpdy() const { diff --git a/naiveproxy/src/net/http/http_stream_factory_job.h b/naiveproxy/src/net/http/http_stream_factory_job.h index dd7236d86f..3191819289 100644 --- a/naiveproxy/src/net/http/http_stream_factory_job.h +++ b/naiveproxy/src/net/http/http_stream_factory_job.h @@ -131,21 +131,25 @@ class HttpStreamFactory::Job virtual void MaybeSetWaitTimeForMainJob(const base::TimeDelta& delay) = 0; }; - // Job is owned by |delegate|, hence |delegate| is valid for the lifetime of + // Job is owned by `delegate`, hence `delegate` is valid for the lifetime of // the Job. // - // |alternative_protocol| is the protocol required by Alternative Service, if + // `destination` is the host the job should connect to, and is laways HTTP or + // HTTPS. `request_info.url` contains the original scheme, hostname, and port, + // which are used for encryption purposes. + // + // `alternative_protocol` is the protocol required by Alternative Service, if // any: - // * |alternative_protocol == kProtoUnknown| means that the Job can pool to an + // * `alternative_protocol == kProtoUnknown` means that the Job can pool to an // existing SpdySession, or bind to a idle TCP socket that might use either // HTTP/1.1 or HTTP/2. - // * |alternative_protocol == kProtoHTTP2| means that the Job can pool to an + // * `alternative_protocol == kProtoHTTP2` means that the Job can pool to an // existing SpdySession, or bind to a idle TCP socket. In the latter case, // if the socket does not use HTTP/2, then the Job fails. - // * |alternative_protocol == kProtoQUIC| means that the Job can pool to an + // * `alternative_protocol == kProtoQUIC` means that the Job can pool to an // existing QUIC connection or open a new one. // Note that this can be overwritten by specifying a QUIC proxy in - // |proxy_info|, or by setting + // `proxy_info`, or by setting // HttpNetworkSession::Params::origins_to_force_quic_on. Job(Delegate* delegate, JobType job_type, @@ -155,7 +159,6 @@ class HttpStreamFactory::Job const ProxyInfo& proxy_info, const std::vector& allowed_bad_certs, url::SchemeHostPort destination, - GURL origin_url, NextProto alternative_protocol, quic::ParsedQuicVersion quic_version, bool is_websocket, @@ -201,7 +204,6 @@ class HttpStreamFactory::Job // exists for the job. This method is not supported for WebSocket and QUIC. bool TargettedSocketGroupHasActiveSocket() const; - const GURL& origin_url() const { return origin_url_; } RequestPriority priority() const { return priority_; } NextProto negotiated_protocol() const; const NetLogWithSource& net_log() const { return net_log_; } @@ -219,6 +221,13 @@ class HttpStreamFactory::Job JobType job_type() const { return job_type_; } + // Indicates whether this job used an existing SPDY session. Only valid after + // this created an HttpStream with SPDY. + bool used_existing_spdy_session() const { + DCHECK(used_existing_spdy_session_.has_value()); + return *used_existing_spdy_session_; + } + bool using_existing_quic_session() const { return using_existing_quic_session_; } @@ -266,7 +275,7 @@ class HttpStreamFactory::Job STATE_NONE, }; - void OnStreamReadyCallback(); + void OnStreamReadyCallback(base::TimeTicks stream_ready_time); void OnBidirectionalStreamImplReadyCallback(); void OnWebSocketHandshakeStreamReadyCallback(); // This callback function is called when a new SPDY session is created. @@ -286,10 +295,7 @@ class HttpStreamFactory::Job int DoLoop(int result); int StartInternal(); int DoInitConnectionImpl(); - // `server_cert_verifier_flags` are the cert verifier flags if connecting to a - // QUIC server. If making non-tunnelled requests to a QUIC proxy, they will be - // ignored. - int DoInitConnectionImplQuic(int server_cert_verifier_flags); + int DoInitConnectionImplQuic(); // If this is a QUIC alt job, then this function is called when host // resolution completes. It's called with the next result after host @@ -383,18 +389,12 @@ class HttpStreamFactory::Job bool started_ = false; - // The server we are trying to reach, could be that of the origin or of the - // alternative service (after applying host mapping rules). The scheme of this - // is always HTTP or HTTPS, even for websockets requests. + // The host we are going to connect to, could be that of the origin or of the + // alternative service. The scheme of this is always HTTP or HTTPS, even for + // websockets requests. The original destination can be found in + // `request_info_`, which is used for the purposes of encryption. const url::SchemeHostPort destination_; - // The origin url we're trying to reach. This url may be different from the - // original request when host mapping rules are set-up. It has the original - // scheme, so may be HTTP, HTTPS, WS, or WSS. It does not change when there's - // an alternate service, but it does take into account host mapping rules, - // unlike `request_info_.url`. - const GURL origin_url_; - // True if request is for Websocket. const bool is_websocket_; @@ -466,6 +466,10 @@ class HttpStreamFactory::Job // Initialized when we have an existing SpdySession. base::WeakPtr existing_spdy_session_; + // Indicates whether this job created an HttpStream using an existing SPDY + // session. Only valid when using SPDY. + std::optional used_existing_spdy_session_; + // Which SpdySessions in the pool to use. Note that, if requesting an HTTP URL // through an HTTPS proxy, this key corresponds to the last proxy in the proxy // chain and not the origin server. @@ -508,7 +512,6 @@ class HttpStreamFactory::JobFactory { const ProxyInfo& proxy_info, const std::vector& allowed_bad_certs, url::SchemeHostPort destination, - GURL origin_url, bool is_websocket, bool enable_ip_based_pooling_for_h2, NetLog* net_log, diff --git a/naiveproxy/src/net/http/http_stream_factory_job_controller.cc b/naiveproxy/src/net/http/http_stream_factory_job_controller.cc index a49e20c52c..0e85e3884f 100644 --- a/naiveproxy/src/net/http/http_stream_factory_job_controller.cc +++ b/naiveproxy/src/net/http/http_stream_factory_job_controller.cc @@ -14,19 +14,23 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/task/single_thread_task_runner.h" +#include "base/types/optional_ref.h" #include "base/values.h" #include "net/base/features.h" -#include "net/base/host_mapping_rules.h" #include "net/base/load_flags.h" +#include "net/base/load_timing_internal_info.h" #include "net/base/net_errors.h" #include "net/base/privacy_mode.h" #include "net/base/proxy_chain.h" +#include "net/base/proxy_delegate.h" #include "net/base/proxy_string_util.h" #include "net/base/session_usage.h" #include "net/base/task/task_runner.h" #include "net/base/url_util.h" +#include "net/http/alternate_protocol_usage.h" #include "net/http/alternative_service.h" #include "net/http/bidirectional_stream_impl.h" +#include "net/http/http_stream_factory.h" #include "net/http/http_stream_key.h" #include "net/http/http_stream_pool.h" #include "net/http/http_stream_pool_request_info.h" @@ -162,8 +166,6 @@ HttpStreamFactory::JobController::JobController( delay_main_job_with_available_spdy_session_( delay_main_job_with_available_spdy_session), management_config_(http_request_info.connection_management_config), - http_request_info_url_(http_request_info.url), - origin_url_(DuplicateUrlWithHostMappingRules(http_request_info.url)), request_info_(http_request_info), allowed_bad_certs_(allowed_bad_certs), net_log_(NetLogWithSource::Make( @@ -172,21 +174,12 @@ HttpStreamFactory::JobController::JobController( DCHECK(factory_); DCHECK(session_); DCHECK(job_factory_); - DCHECK(base::EqualsCaseInsensitiveASCII(origin_url_.scheme_piece(), - url::kHttpScheme) || - base::EqualsCaseInsensitiveASCII(origin_url_.scheme_piece(), - url::kHttpsScheme) || - base::EqualsCaseInsensitiveASCII(origin_url_.scheme_piece(), - url::kWsScheme) || - base::EqualsCaseInsensitiveASCII(origin_url_.scheme_piece(), - url::kWssScheme)); + DCHECK(request_info_.url.SchemeIsHTTPOrHTTPS() || + request_info_.url.SchemeIsWSOrWSS()); net_log_.BeginEvent(NetLogEventType::HTTP_STREAM_JOB_CONTROLLER, [&] { base::Value::Dict dict; - dict.Set("url", http_request_info.url.possibly_invalid_spec()); - if (origin_url_ != http_request_info.url) { - dict.Set("url_after_host_mapping", origin_url_.possibly_invalid_spec()); - } + dict.Set("url", request_info_.url.possibly_invalid_spec()); dict.Set("is_preconnect", is_preconnect_); dict.Set("privacy_mode", PrivacyModeToDebugString(request_info_.privacy_mode)); @@ -238,19 +231,23 @@ std::unique_ptr HttpStreamFactory::JobController::Start( source_net_log.source()); RunLoop(OK); + // `this` may be deleted at this point. return request; } -void HttpStreamFactory::JobController::Preconnect(int num_streams) { +void HttpStreamFactory::JobController::Preconnect(int num_streams, + base::OnceClosure callback) { DCHECK(!main_job_); DCHECK(!alternative_job_); DCHECK(is_preconnect_); stream_type_ = HttpStreamRequest::HTTP_STREAM; num_streams_ = num_streams; + preconnect_callback_ = std::move(callback); RunLoop(OK); + // `this` may be deleted at this point. } LoadState HttpStreamFactory::JobController::GetLoadState() const { @@ -334,6 +331,8 @@ void HttpStreamFactory::JobController::OnStreamReady(Job* job) { OnOrphanedJobComplete(job); return; } + + NotifyOnStreamCreationAttempted(std::nullopt); std::unique_ptr stream = job->ReleaseStream(); DCHECK(stream); @@ -410,7 +409,7 @@ void HttpStreamFactory::JobController::OnQuicHostResolution( if (!request_) { return; } - if (destination != url::SchemeHostPort(origin_url_)) { + if (destination != url::SchemeHostPort(request_info_.url)) { // Ignores different destination alternative job's DNS resolution time. return; } @@ -428,7 +427,7 @@ void HttpStreamFactory::JobController::OnStreamFailed(Job* job, int status) { main_job_net_error_ = status; } else if (job->job_type() == ALTERNATIVE) { DCHECK_EQ(alternative_job_.get(), job); - DCHECK_NE(NextProto::kProtoUnknown, alternative_service_info_.protocol()); + DCHECK_NE(NextProto::kProtoUnknown, advertised_alt_svc_.info.protocol()); alternative_job_net_error_ = status; } else { DCHECK_EQ(job->job_type(), DNS_ALPN_H3); @@ -472,6 +471,7 @@ void HttpStreamFactory::JobController::OnStreamFailed(Job* job, int status) { } } + NotifyOnStreamCreationAttempted(status); status = ReconsiderProxyAfterError(job, status); if (next_state_ == STATE_RESOLVE_PROXY_COMPLETE) { if (status == ERR_IO_PENDING) { @@ -479,6 +479,7 @@ void HttpStreamFactory::JobController::OnStreamFailed(Job* job, int status) { } DCHECK_EQ(OK, status); RunLoop(status); + // `this` may be deleted at this point. return; } @@ -584,7 +585,9 @@ void HttpStreamFactory::JobController::OnPreconnectsComplete(Job* job, main_job_.reset(); preconnect_backup_job_.reset(); ResetErrorStatusForJobs(); - factory_->OnPreconnectsCompleteInternal(); + if (preconnect_callback_) { + std::move(preconnect_callback_).Run(); + } MaybeNotifyFactoryOfCompletion(); } @@ -648,6 +651,11 @@ void HttpStreamFactory::JobController::ResetErrorStatusForJobs() { dns_alpn_h3_job_failed_on_default_network_ = false; } +bool HttpStreamFactory::JobController:: + disable_cert_verification_network_fetches() const { + return !!(request_info_.load_flags & LOAD_DISABLE_CERT_NETWORK_FETCHES); +} + void HttpStreamFactory::JobController::MaybeResumeMainJob( Job* job, const base::TimeDelta& delay) { @@ -751,6 +759,7 @@ HttpStreamFactory::JobController::websocket_handshake_stream_create_helper() { void HttpStreamFactory::JobController::OnIOComplete(int result) { RunLoop(result); + // `this` may be deleted at this point. } void HttpStreamFactory::JobController::RunLoop(int result) { @@ -758,6 +767,15 @@ void HttpStreamFactory::JobController::RunLoop(int result) { if (rv == ERR_IO_PENDING) { return; } + + if (switched_to_http_stream_pool_) { + // The request is handed over to the HttpStreamPool. Complete `this`. + DCHECK_EQ(rv, OK); + MaybeNotifyFactoryOfCompletion(); + // `this` is deleted. + return; + } + if (rv != OK) { // DoLoop can only fail during proxy resolution step which happens before // any jobs are created. Notify |request_| of the failure one message loop @@ -809,7 +827,7 @@ int HttpStreamFactory::JobController::DoResolveProxy() { CompletionOnceCallback io_callback = base::BindOnce(&JobController::OnIOComplete, base::Unretained(this)); return session_->proxy_resolution_service()->ResolveProxy( - origin_url_, request_info_.method, + request_info_.url, request_info_.method, request_info_.network_anonymization_key, &proxy_info_, std::move(io_callback), &proxy_resolve_request_, net_log_); } @@ -849,17 +867,18 @@ int HttpStreamFactory::JobController::DoResolveProxyComplete(int rv) { int HttpStreamFactory::JobController::DoCreateJobs() { DCHECK(!main_job_); DCHECK(!alternative_job_); - DCHECK(origin_url_.is_valid()); - DCHECK(origin_url_.IsStandard()); + DCHECK(request_info_.url.is_valid()); + DCHECK(request_info_.url.IsStandard()); + stream_creation_attempt_start_time_ = base::TimeTicks::Now(); - url::SchemeHostPort destination(origin_url_); + url::SchemeHostPort destination(request_info_.url); DCHECK(destination.IsValid()); ConvertWsToHttp(destination); // Create an alternative job if alternative service is set up for this domain. // This is applicable even if the connection will be made via a proxy. - alternative_service_info_ = GetAlternativeServiceInfoFor( - http_request_info_url_, request_info_, delegate_, stream_type_); + advertised_alt_svc_ = + GetAdvertisedAltSvcFor(request_info_, delegate_, stream_type_); if (session_->host_resolver()->IsHappyEyeballsV3Enabled() && proxy_info_.is_direct() && !is_websocket_) { @@ -868,9 +887,9 @@ int HttpStreamFactory::JobController::DoCreateJobs() { } quic::ParsedQuicVersion quic_version = quic::ParsedQuicVersion::Unsupported(); - if (alternative_service_info_.protocol() == NextProto::kProtoQUIC) { + if (advertised_alt_svc_.info.protocol() == NextProto::kProtoQUIC) { quic_version = - SelectQuicVersion(alternative_service_info_.advertised_versions()); + SelectQuicVersion(advertised_alt_svc_.info.advertised_versions()); DCHECK_NE(quic_version, quic::ParsedQuicVersion::Unsupported()); } @@ -881,11 +900,11 @@ int HttpStreamFactory::JobController::DoCreateJobs() { !session_->ShouldForceQuic(destination, proxy_info_, is_websocket_) && enable_alternative_services_ && session_->params().use_dns_https_svcb_alpn && - base::EqualsCaseInsensitiveASCII(origin_url_.scheme(), + base::EqualsCaseInsensitiveASCII(request_info_.url.GetScheme(), url::kHttpsScheme) && session_->IsQuicEnabled() && proxy_info_.is_direct() && !session_->http_server_properties()->IsAlternativeServiceBroken( - GetAlternativeServiceForDnsJob(origin_url_), + GetAlternativeServiceForDnsJob(request_info_.url), request_info_.network_anonymization_key); if (is_preconnect_) { @@ -901,17 +920,15 @@ int HttpStreamFactory::JobController::DoCreateJobs() { std::unique_ptr preconnect_job = job_factory_->CreateJob( this, dns_alpn_h3_job_enabled ? PRECONNECT_DNS_ALPN_H3 : PRECONNECT, session_, request_info_, IDLE, proxy_info_, allowed_bad_certs_, - destination, origin_url_, is_websocket_, - enable_ip_based_pooling_for_h2_, net_log_.net_log(), - NextProto::kProtoUnknown, quic::ParsedQuicVersion::Unsupported(), - management_config_); + destination, is_websocket_, enable_ip_based_pooling_for_h2_, + net_log_.net_log(), NextProto::kProtoUnknown, + quic::ParsedQuicVersion::Unsupported(), management_config_); // When there is an valid alternative service info, and `preconnect_job` // has no existing QUIC session, create a job for the alternative service. - if (alternative_service_info_.protocol() != NextProto::kProtoUnknown && + if (advertised_alt_svc_.info.protocol() != NextProto::kProtoUnknown && !preconnect_job->HasAvailableQuicSession()) { GURL alternative_url = CreateAltSvcUrl( - origin_url_, alternative_service_info_.GetHostPortPair()); - RewriteUrlWithHostMappingRules(alternative_url); + request_info_.url, advertised_alt_svc_.info.GetHostPortPair()); url::SchemeHostPort alternative_destination = url::SchemeHostPort(alternative_url); @@ -919,9 +936,9 @@ int HttpStreamFactory::JobController::DoCreateJobs() { main_job_ = job_factory_->CreateJob( this, PRECONNECT, session_, request_info_, IDLE, proxy_info_, - allowed_bad_certs_, std::move(alternative_destination), origin_url_, - is_websocket_, enable_ip_based_pooling_for_h2_, session_->net_log(), - alternative_service_info_.protocol(), quic_version, + allowed_bad_certs_, std::move(alternative_destination), is_websocket_, + enable_ip_based_pooling_for_h2_, session_->net_log(), + advertised_alt_svc_.info.protocol(), quic_version, management_config_); } else { main_job_ = std::move(preconnect_job); @@ -929,8 +946,8 @@ int HttpStreamFactory::JobController::DoCreateJobs() { if (dns_alpn_h3_job_enabled) { preconnect_backup_job_ = job_factory_->CreateJob( this, PRECONNECT, session_, request_info_, IDLE, proxy_info_, - allowed_bad_certs_, std::move(destination), origin_url_, - is_websocket_, enable_ip_based_pooling_for_h2_, net_log_.net_log(), + allowed_bad_certs_, std::move(destination), is_websocket_, + enable_ip_based_pooling_for_h2_, net_log_.net_log(), NextProto::kProtoUnknown, quic::ParsedQuicVersion::Unsupported(), management_config_); } @@ -940,7 +957,7 @@ int HttpStreamFactory::JobController::DoCreateJobs() { } main_job_ = job_factory_->CreateJob( this, MAIN, session_, request_info_, priority_, proxy_info_, - allowed_bad_certs_, std::move(destination), origin_url_, is_websocket_, + allowed_bad_certs_, std::move(destination), is_websocket_, enable_ip_based_pooling_for_h2_, net_log_.net_log(), NextProto::kProtoUnknown, quic::ParsedQuicVersion::Unsupported(), management_config_); @@ -950,18 +967,17 @@ int HttpStreamFactory::JobController::DoCreateJobs() { // The main job may use HTTP/3 if the origin is specified in // `--origin-to-force-quic-on` switch. In that case, do not create // `alternative_job_` and `dns_alpn_h3_job_`. - if ((alternative_service_info_.protocol() != NextProto::kProtoUnknown) && + if ((advertised_alt_svc_.info.protocol() != NextProto::kProtoUnknown) && !main_job_->using_quic()) { - DCHECK(origin_url_.SchemeIs(url::kHttpsScheme)); + DCHECK(request_info_.url.SchemeIs(url::kHttpsScheme)); DCHECK(!is_websocket_); DVLOG(1) << "Selected alternative service (host: " - << alternative_service_info_.GetHostPortPair().host() - << " port: " << alternative_service_info_.GetHostPortPair().port() + << advertised_alt_svc_.info.GetHostPortPair().host() + << " port: " << advertised_alt_svc_.info.GetHostPortPair().port() << " version: " << quic_version << ")"; GURL alternative_url = CreateAltSvcUrl( - origin_url_, alternative_service_info_.GetHostPortPair()); - RewriteUrlWithHostMappingRules(alternative_url); + request_info_.url, advertised_alt_svc_.info.GetHostPortPair()); url::SchemeHostPort alternative_destination = url::SchemeHostPort(alternative_url); @@ -969,19 +985,19 @@ int HttpStreamFactory::JobController::DoCreateJobs() { alternative_job_ = job_factory_->CreateJob( this, ALTERNATIVE, session_, request_info_, priority_, proxy_info_, - allowed_bad_certs_, std::move(alternative_destination), origin_url_, - is_websocket_, enable_ip_based_pooling_for_h2_, net_log_.net_log(), - alternative_service_info_.protocol(), quic_version, management_config_); + allowed_bad_certs_, std::move(alternative_destination), is_websocket_, + enable_ip_based_pooling_for_h2_, net_log_.net_log(), + advertised_alt_svc_.info.protocol(), quic_version, management_config_); } if (dns_alpn_h3_job_enabled && !main_job_->using_quic()) { DCHECK(!is_websocket_); url::SchemeHostPort dns_alpn_h3_destination = - url::SchemeHostPort(origin_url_); + url::SchemeHostPort(request_info_.url); dns_alpn_h3_job_ = job_factory_->CreateJob( this, DNS_ALPN_H3, session_, request_info_, priority_, proxy_info_, - allowed_bad_certs_, std::move(dns_alpn_h3_destination), origin_url_, - is_websocket_, enable_ip_based_pooling_for_h2_, net_log_.net_log(), + allowed_bad_certs_, std::move(dns_alpn_h3_destination), is_websocket_, + enable_ip_based_pooling_for_h2_, net_log_.net_log(), NextProto::kProtoUnknown, quic::ParsedQuicVersion::Unsupported(), management_config_); } @@ -1022,8 +1038,8 @@ void HttpStreamFactory::JobController::ClearInappropriateJobs() { if (alternative_job_ && dns_alpn_h3_job_ && (alternative_job_->HasAvailableQuicSession() || - (alternative_service_info_.alternative_service() == - GetAlternativeServiceForDnsJob(http_request_info_url_)))) { + (advertised_alt_svc_.info.alternative_service() == + GetAlternativeServiceForDnsJob(request_info_.url)))) { // Clear |dns_alpn_h3_job_|, when there is an active session available for // |alternative_job_| or |alternative_job_| was created for the same // destination. @@ -1048,6 +1064,9 @@ void HttpStreamFactory::JobController::BindJob(Job* job) { job->net_log().AddEventReferencingSource( NetLogEventType::HTTP_STREAM_JOB_BOUND_TO_REQUEST, request_->net_log().source()); + net_log_.AddEventReferencingSource( + NetLogEventType::HTTP_STREAM_JOB_BOUND_TO_REQUEST, + request_->net_log().source()); OrphanUnboundJob(); } @@ -1123,9 +1142,28 @@ void HttpStreamFactory::JobController::MarkRequestComplete(Job* job) { if (request_) { AlternateProtocolUsage alternate_protocol_usage = CalculateAlternateProtocolUsage(job); - request_->Complete(job->negotiated_protocol(), alternate_protocol_usage); + std::optional session_source = std::nullopt; + switch (job->negotiated_protocol()) { + case NextProto::kProtoUnknown: + case NextProto::kProtoHTTP11: + break; + case NextProto::kProtoHTTP2: + session_source = job->used_existing_spdy_session() + ? SessionSource::kExisting + : SessionSource::kNew; + break; + case NextProto::kProtoQUIC: + session_source = job->using_existing_quic_session() + ? SessionSource::kExisting + : SessionSource::kNew; + break; + } + request_->Complete({.negotiated_protocol = job->negotiated_protocol(), + .alternate_protocol_usage = alternate_protocol_usage, + .session_source = session_source, + .advertised_alt_svc_state = advertised_alt_svc_.state}); ReportAlternateProtocolUsage(alternate_protocol_usage, - HasGoogleHost(job->origin_url())); + HasGoogleHost(request_info_.url)); } } @@ -1163,7 +1201,7 @@ void HttpStreamFactory::JobController::MaybeReportBrokenAlternativeService( if (alt_job_net_error == ERR_NETWORK_CHANGED || alt_job_net_error == ERR_INTERNET_DISCONNECTED || (alt_job_net_error == ERR_NAME_NOT_RESOLVED && - http_request_info_url_.host() == alt_service.host)) { + request_info_.url.GetHost() == alt_service.host)) { // No need to mark alternative service as broken. return; } @@ -1190,12 +1228,12 @@ void HttpStreamFactory::JobController::MaybeNotifyFactoryOfCompletion() { // All jobs are gone. // Report brokenness for the alternate jobs if apply. MaybeReportBrokenAlternativeService( - alternative_service_info_.alternative_service(), + advertised_alt_svc_.info.alternative_service(), alternative_job_net_error_, alternative_job_failed_on_default_network_, "Net.AlternateServiceFailed"); // Report for the DNS alt job if apply. MaybeReportBrokenAlternativeService( - GetAlternativeServiceForDnsJob(http_request_info_url_), + GetAlternativeServiceForDnsJob(request_info_.url), dns_alpn_h3_job_net_error_, dns_alpn_h3_job_failed_on_default_network_, "Net.AlternateServiceForDnsAlpnH3Failed"); @@ -1218,44 +1256,31 @@ void HttpStreamFactory::JobController::NotifyRequestFailed(int rv) { ResolveErrorInfo()); } -void HttpStreamFactory::JobController::RewriteUrlWithHostMappingRules( - GURL& url) const { - session_->params().host_mapping_rules.RewriteUrl(url); -} - -GURL HttpStreamFactory::JobController::DuplicateUrlWithHostMappingRules( - const GURL& url) const { - GURL copy = url; - RewriteUrlWithHostMappingRules(copy); - return copy; -} - -AlternativeServiceInfo -HttpStreamFactory::JobController::GetAlternativeServiceInfoFor( - const GURL& http_request_info_url, +HttpStreamFactory::JobController::AdvertisedAlternativeService +HttpStreamFactory::JobController::GetAdvertisedAltSvcFor( const StreamRequestInfo& request_info, HttpStreamRequest::Delegate* delegate, HttpStreamRequest::StreamType stream_type) { if (!enable_alternative_services_) { - return AlternativeServiceInfo(); + return AdvertisedAlternativeService(); } - AlternativeServiceInfo alternative_service_info = - GetAlternativeServiceInfoInternal(http_request_info_url, request_info, - delegate, stream_type); + AdvertisedAlternativeService alternative_service_info = + GetAdvertisedAltSvcInternal(request_info, delegate, stream_type); AlternativeServiceType type; - if (alternative_service_info.protocol() == NextProto::kProtoUnknown) { + if (alternative_service_info.info.protocol() == NextProto::kProtoUnknown) { type = NO_ALTERNATIVE_SERVICE; - } else if (alternative_service_info.protocol() == NextProto::kProtoQUIC) { - if (http_request_info_url.host_piece() == - alternative_service_info.alternative_service().host) { + } else if (alternative_service_info.info.protocol() == + NextProto::kProtoQUIC) { + if (request_info.url.host() == + alternative_service_info.info.alternative_service().host) { type = QUIC_SAME_DESTINATION; } else { type = QUIC_DIFFERENT_DESTINATION; } } else { - if (http_request_info_url.host_piece() == - alternative_service_info.alternative_service().host) { + if (request_info.url.host() == + alternative_service_info.info.alternative_service().host) { type = NOT_QUIC_SAME_DESTINATION; } else { type = NOT_QUIC_DIFFERENT_DESTINATION; @@ -1266,26 +1291,23 @@ HttpStreamFactory::JobController::GetAlternativeServiceInfoFor( return alternative_service_info; } -AlternativeServiceInfo -HttpStreamFactory::JobController::GetAlternativeServiceInfoInternal( - const GURL& http_request_info_url, +HttpStreamFactory::JobController::AdvertisedAlternativeService +HttpStreamFactory::JobController::GetAdvertisedAltSvcInternal( const StreamRequestInfo& request_info, HttpStreamRequest::Delegate* delegate, HttpStreamRequest::StreamType stream_type) { - GURL original_url = http_request_info_url; - - if (!original_url.SchemeIs(url::kHttpsScheme)) { - return AlternativeServiceInfo(); + if (!request_info.url.SchemeIs(url::kHttpsScheme)) { + return AdvertisedAlternativeService(); } HttpServerProperties& http_server_properties = *session_->http_server_properties(); const AlternativeServiceInfoVector alternative_service_info_vector = http_server_properties.GetAlternativeServiceInfos( - url::SchemeHostPort(original_url), + url::SchemeHostPort(request_info.url), request_info.network_anonymization_key); if (alternative_service_info_vector.empty()) { - return AlternativeServiceInfo(); + return AdvertisedAlternativeService(); } bool quic_advertised = false; @@ -1314,7 +1336,7 @@ HttpStreamFactory::JobController::GetAlternativeServiceInfoInternal( // Only log the broken alternative service once per request. is_any_broken = true; HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_BROKEN, - HasGoogleHost(original_url)); + HasGoogleHost(request_info.url)); } continue; } @@ -1329,7 +1351,7 @@ HttpStreamFactory::JobController::GetAlternativeServiceInfoInternal( if (!session_->params().enable_user_alternate_protocol_ports && (alternative_service_info.alternative_service().port >= kUnrestrictedPort && - original_url.EffectiveIntPort() < kUnrestrictedPort)) { + request_info.url.EffectiveIntPort() < kUnrestrictedPort)) { continue; } @@ -1352,7 +1374,7 @@ HttpStreamFactory::JobController::GetAlternativeServiceInfoInternal( continue; } - if (!original_url.SchemeIs(url::kHttpsScheme)) { + if (!request_info.url.SchemeIs(url::kHttpsScheme)) { continue; } @@ -1364,28 +1386,26 @@ HttpStreamFactory::JobController::GetAlternativeServiceInfoInternal( } // Check whether there is an existing QUIC session to use for this origin. - GURL mapped_origin = original_url; - RewriteUrlWithHostMappingRules(mapped_origin); QuicSessionKey session_key( - HostPortPair::FromURL(mapped_origin), request_info.privacy_mode, + HostPortPair::FromURL(request_info.url), request_info.privacy_mode, proxy_info_.proxy_chain(), SessionUsage::kDestination, request_info.socket_tag, request_info.network_anonymization_key, - request_info.secure_dns_policy, /*require_dns_https_alpn=*/false); + request_info.secure_dns_policy, /*require_dns_https_alpn=*/false, + disable_cert_verification_network_fetches()); GURL destination = CreateAltSvcUrl( - original_url, alternative_service_info.GetHostPortPair()); - if (session_key.host() != destination.host_piece() && + request_info.url, alternative_service_info.GetHostPortPair()); + if (session_key.host() != destination.host() && !session_->context().quic_context->params()->allow_remote_alt_svc) { continue; } - RewriteUrlWithHostMappingRules(destination); if (session_->quic_session_pool()->CanUseExistingSession( session_key, url::SchemeHostPort(destination))) { - return alternative_service_info; + return {alternative_service_info, AdvertisedAltSvcState::kQuicNotBroken}; } - if (!IsQuicAllowedForHost(destination.host())) { + if (!IsQuicAllowedForHost(destination.GetHost())) { continue; } @@ -1400,7 +1420,16 @@ HttpStreamFactory::JobController::GetAlternativeServiceInfoInternal( delegate->OnQuicBroken(); } - return first_alternative_service_info; + AdvertisedAltSvcState state = AdvertisedAltSvcState::kUnknown; + if (quic_advertised) { + if (quic_all_broken) { + state = AdvertisedAltSvcState::kQuicBroken; + } else { + state = AdvertisedAltSvcState::kQuicNotBroken; + } + } + + return {first_alternative_service_info, state}; } quic::ParsedQuicVersion HttpStreamFactory::JobController::SelectQuicVersion( @@ -1514,28 +1543,27 @@ void HttpStreamFactory::JobController::SwitchToHttpStreamPool() { switched_to_http_stream_pool_ = true; bool disable_cert_network_fetches = - !!(request_info_.load_flags & LOAD_DISABLE_CERT_NETWORK_FETCHES); + disable_cert_verification_network_fetches(); NextProtoSet allowed_alpns = request_info_.is_http1_allowed ? NextProtoSet::All() : NextProtoSet{NextProto::kProtoHTTP2, NextProto::kProtoQUIC}; - url::SchemeHostPort destination(origin_url_); + url::SchemeHostPort destination(request_info_.url); session_->ApplyTestingFixedPort(destination); HttpStreamPoolRequestInfo pool_request_info( std::move(destination), request_info_.privacy_mode, request_info_.socket_tag, request_info_.network_anonymization_key, request_info_.secure_dns_policy, disable_cert_network_fetches, - alternative_service_info_, allowed_alpns, request_info_.load_flags, - proxy_info_, net_log_); + advertised_alt_svc_.info, advertised_alt_svc_.state, allowed_alpns, + request_info_.load_flags, proxy_info_, net_log_); if (is_preconnect_) { + auto split_callback = base::SplitOnceCallback( + base::IgnoreArgs(std::move(preconnect_callback_))); int rv = session_->http_stream_pool()->Preconnect( std::move(pool_request_info), num_streams_, - base::BindOnce(&JobController::OnPoolPreconnectsComplete, - ptr_factory_.GetWeakPtr())); - if (rv != ERR_IO_PENDING) { - TaskRunner(priority_)->PostTask( - FROM_HERE, base::BindOnce(&JobController::OnPoolPreconnectsComplete, - ptr_factory_.GetWeakPtr(), rv)); + std::move(split_callback.first)); + if (rv != ERR_IO_PENDING && split_callback.second) { + std::move(split_callback.second).Run(rv); } return; } @@ -1545,17 +1573,20 @@ void HttpStreamFactory::JobController::SwitchToHttpStreamPool() { std::exchange(request_, nullptr), std::exchange(delegate_, nullptr), std::move(pool_request_info), priority_, allowed_bad_certs_, enable_ip_based_pooling_for_h2_, enable_alternative_services_); - - // Delete `this` later as this method is called while running DoLoop(). - TaskRunner(priority_)->PostTask( - FROM_HERE, base::BindOnce(&JobController::MaybeNotifyFactoryOfCompletion, - ptr_factory_.GetWeakPtr())); } -void HttpStreamFactory::JobController::OnPoolPreconnectsComplete(int rv) { - CHECK(switched_to_http_stream_pool_); - factory_->OnPreconnectsCompleteInternal(); - MaybeNotifyFactoryOfCompletion(); +void HttpStreamFactory::JobController::NotifyOnStreamCreationAttempted( + base::optional_ref net_error) { + auto* proxy_delegate = session_->context().proxy_delegate.get(); + if (!proxy_delegate || proxy_info_.is_empty()) { + return; + } + + base::TimeDelta duration = + base::TimeTicks::Now() - stream_creation_attempt_start_time_; + + proxy_delegate->OnStreamCreationAttempted(proxy_info_.proxy_chain(), duration, + net_error); } } // namespace net diff --git a/naiveproxy/src/net/http/http_stream_factory_job_controller.h b/naiveproxy/src/net/http/http_stream_factory_job_controller.h index d30290fca9..a1aaf55b38 100644 --- a/naiveproxy/src/net/http/http_stream_factory_job_controller.h +++ b/naiveproxy/src/net/http/http_stream_factory_job_controller.h @@ -10,10 +10,14 @@ #include #include "base/cancelable_callback.h" +#include "base/functional/callback_forward.h" #include "base/memory/raw_ptr.h" #include "base/time/time.h" +#include "base/types/optional_ref.h" #include "net/base/host_port_pair.h" #include "net/base/net_errors.h" +#include "net/http/alternate_protocol_usage.h" +#include "net/http/alternative_service.h" #include "net/http/http_stream_factory_job.h" #include "net/http/http_stream_request.h" #include "net/spdy/spdy_session_pool.h" @@ -54,14 +58,6 @@ class HttpStreamFactory::JobController const Job* alternative_job() const { return alternative_job_.get(); } const Job* dns_alpn_h3_job() const { return dns_alpn_h3_job_.get(); } - // Modifies `url` in-place, applying any applicable HostMappingRules of - // `session_` to it. - void RewriteUrlWithHostMappingRules(GURL& url) const; - - // Same as RewriteUrlWithHostMappingRules(), but duplicates `url` instead of - // modifying it. - GURL DuplicateUrlWithHostMappingRules(const GURL& url) const; - // Methods below are called by HttpStreamFactory only. // Creates request and hands out to HttpStreamFactory, this will also create // Job(s) and start serving the created request. @@ -73,7 +69,7 @@ class HttpStreamFactory::JobController HttpStreamRequest::StreamType stream_type, RequestPriority priority); - void Preconnect(int num_streams); + void Preconnect(int num_streams, base::OnceClosure callback); // From HttpStreamRequest::Helper. // Returns the LoadState for Request. @@ -180,6 +176,12 @@ class HttpStreamFactory::JobController STATE_NONE }; + // Represents an alternative service and its state. + struct AdvertisedAlternativeService { + AlternativeServiceInfo info; + AdvertisedAltSvcState state = AdvertisedAltSvcState::kUnknown; + }; + void OnIOComplete(int result); void RunLoop(int result); @@ -244,14 +246,12 @@ class HttpStreamFactory::JobController // |dns_alpn_h3_job_failed_on_default_network_| to false. void ResetErrorStatusForJobs(); - AlternativeServiceInfo GetAlternativeServiceInfoFor( - const GURL& http_request_info_url, + AdvertisedAlternativeService GetAdvertisedAltSvcFor( const StreamRequestInfo& request_info, HttpStreamRequest::Delegate* delegate, HttpStreamRequest::StreamType stream_type); - AlternativeServiceInfo GetAlternativeServiceInfoInternal( - const GURL& http_request_info_url, + AdvertisedAlternativeService GetAdvertisedAltSvcInternal( const StreamRequestInfo& request_info, HttpStreamRequest::Delegate* delegate, HttpStreamRequest::StreamType stream_type); @@ -275,6 +275,8 @@ class HttpStreamFactory::JobController // when the reason is unknown. AlternateProtocolUsage CalculateAlternateProtocolUsage(Job* job) const; + void NotifyOnStreamCreationAttempted(base::optional_ref net_error); + // Called when a Job encountered a network error that could be resolved by // trying a new proxy configuration. If there is another proxy configuration // to try then this method sets |next_state_| appropriately and returns either @@ -297,9 +299,7 @@ class HttpStreamFactory::JobController // destroyed. void SwitchToHttpStreamPool(); - // Called when `this` asked the HttpStreamPool to handle a preconnect and - // the preconnect completed. Used to notify the factory of completion. - void OnPoolPreconnectsComplete(int rv); + bool disable_cert_verification_network_fetches() const; const raw_ptr factory_; const raw_ptr session_; @@ -341,9 +341,9 @@ class HttpStreamFactory::JobController std::unique_ptr preconnect_backup_job_; - // The alternative service used by |alternative_job_| - // (or by |main_job_| if |is_preconnect_|.) - AlternativeServiceInfo alternative_service_info_; + // The alternative service and its state used by `alternative_job_` + // (or by `main_job_` if `is_preconnect_`.) + AdvertisedAlternativeService advertised_alt_svc_; // Error status used for alternative service brokenness reporting. // Net error code of the main job. Set to OK by default. @@ -389,20 +389,17 @@ class HttpStreamFactory::JobController State next_state_ = STATE_RESOLVE_PROXY; std::unique_ptr proxy_resolve_request_; - // The URL from the input `http_request_info`. - // TODO(https://crbug.com/332724851): Remove this, and update code to use - // `origin_url_`. - const GURL http_request_info_url_; - // The same as `request_info_url_`, but with any applicable rules in - // HostMappingRules applied to it. - // TODO: Make this use SchemeHostPort instead, and rename it. - const GURL origin_url_; const StreamRequestInfo request_info_; ProxyInfo proxy_info_; const std::vector allowed_bad_certs_; int num_streams_ = 0; + base::OnceClosure preconnect_callback_; HttpStreamRequest::StreamType stream_type_; RequestPriority priority_ = IDLE; + + // Used to measure how long it takes to create a stream. + base::TimeTicks stream_creation_attempt_start_time_; + const NetLogWithSource net_log_; base::WeakPtrFactory ptr_factory_{this}; diff --git a/naiveproxy/src/net/http/http_stream_factory_test_util.cc b/naiveproxy/src/net/http/http_stream_factory_test_util.cc index 2f12fb104a..366e8159ae 100644 --- a/naiveproxy/src/net/http/http_stream_factory_test_util.cc +++ b/naiveproxy/src/net/http/http_stream_factory_test_util.cc @@ -4,18 +4,107 @@ #include "net/http/http_stream_factory_test_util.h" +#include +#include #include +#include "base/check.h" +#include "base/notreached.h" +#include "net/base/net_errors.h" +#include "net/http/bidirectional_stream_impl.h" +#include "net/http/http_stream.h" #include "net/proxy_resolution/proxy_info.h" +#include "net/websockets/websocket_handshake_stream_base.h" #include "url/scheme_host_port.h" using ::testing::_; namespace net { + MockHttpStreamRequestDelegate::MockHttpStreamRequestDelegate() = default; MockHttpStreamRequestDelegate::~MockHttpStreamRequestDelegate() = default; +void MockHttpStreamRequestDelegate::OnStreamReady( + const ProxyInfo& used_proxy_info, + std::unique_ptr stream) { + CHECK(!IsDone()); + + used_proxy_info_ = used_proxy_info; + http_stream_ = std::move(stream); + done_run_loop_.Quit(); +} + +void MockHttpStreamRequestDelegate::OnWebSocketHandshakeStreamReady( + const ProxyInfo& used_proxy_info, + std::unique_ptr stream) { + NOTREACHED(); +} + +void MockHttpStreamRequestDelegate::OnBidirectionalStreamImplReady( + const ProxyInfo& used_proxy_info, + std::unique_ptr stream) { + NOTREACHED(); +} + +void MockHttpStreamRequestDelegate::OnStreamFailed( + int status, + const NetErrorDetails& net_error_details, + const ProxyInfo& used_proxy_info, + ResolveErrorInfo resolve_error_info) { + CHECK(!IsDone()); + + net_error_ = status; + used_proxy_info_ = used_proxy_info; + done_run_loop_.Quit(); +} + +void MockHttpStreamRequestDelegate::OnCertificateError( + int status, + const SSLInfo& ssl_info) { + NOTREACHED(); +} + +void MockHttpStreamRequestDelegate::OnNeedsProxyAuth( + const HttpResponseInfo& proxy_response, + const ProxyInfo& used_proxy_info, + HttpAuthController* auth_controller) { + NOTREACHED(); +} + +void MockHttpStreamRequestDelegate::OnNeedsClientAuth( + SSLCertRequestInfo* cert_info) { + NOTREACHED(); +} + +void MockHttpStreamRequestDelegate::OnQuicBroken() { + CHECK(!IsDone()); +} + +std::unique_ptr MockHttpStreamRequestDelegate::WaitForHttpStream() { + done_run_loop_.Run(); + EXPECT_TRUE(http_stream_); + return std::move(http_stream_); +} + +int MockHttpStreamRequestDelegate::WaitForError() { + done_run_loop_.Run(); + if (!net_error_) { + ADD_FAILURE() << "StreamRequest unexpectedly succeeded"; + return ERR_UNEXPECTED; + } + return *net_error_; +} + +const ProxyInfo& MockHttpStreamRequestDelegate::used_proxy_info() const { + CHECK(used_proxy_info_); + return *used_proxy_info_; +} + +bool MockHttpStreamRequestDelegate::IsDone() { + return done_run_loop_.AnyQuitCalled(); +} + MockHttpStreamFactoryJob::MockHttpStreamFactoryJob( HttpStreamFactory::Job::Delegate* delegate, HttpStreamFactory::JobType job_type, @@ -25,7 +114,6 @@ MockHttpStreamFactoryJob::MockHttpStreamFactoryJob( ProxyInfo proxy_info, const std::vector& allowed_bad_certs, url::SchemeHostPort destination, - GURL origin_url, NextProto alternative_protocol, quic::ParsedQuicVersion quic_version, bool is_websocket, @@ -40,7 +128,6 @@ MockHttpStreamFactoryJob::MockHttpStreamFactoryJob( proxy_info, allowed_bad_certs, std::move(destination), - origin_url, alternative_protocol, quic_version, is_websocket, @@ -69,7 +156,6 @@ std::unique_ptr TestJobFactory::CreateJob( const ProxyInfo& proxy_info, const std::vector& allowed_bad_certs, url::SchemeHostPort destination, - GURL origin_url, bool is_websocket, bool enable_ip_based_pooling_for_h2, NetLog* net_log, @@ -78,11 +164,19 @@ std::unique_ptr TestJobFactory::CreateJob( quic::ParsedQuicVersion::Unsupported(), std::optional management_config = std::nullopt) { + if (use_real_jobs_) { + return std::make_unique( + delegate, job_type, session, request_info, priority, proxy_info, + allowed_bad_certs, std::move(destination), alternative_protocol, + quic_version, is_websocket, enable_ip_based_pooling_for_h2, + std::move(management_config), net_log); + } + auto job = std::make_unique( delegate, job_type, session, request_info, priority, proxy_info, - allowed_bad_certs, std::move(destination), origin_url, - alternative_protocol, quic_version, is_websocket, - enable_ip_based_pooling_for_h2, management_config, net_log); + allowed_bad_certs, std::move(destination), alternative_protocol, + quic_version, is_websocket, enable_ip_based_pooling_for_h2, + management_config, net_log); // Keep raw pointer to Job but pass ownership. switch (job_type) { diff --git a/naiveproxy/src/net/http/http_stream_factory_test_util.h b/naiveproxy/src/net/http/http_stream_factory_test_util.h index 53d62f72d0..58c61b7f4b 100644 --- a/naiveproxy/src/net/http/http_stream_factory_test_util.h +++ b/naiveproxy/src/net/http/http_stream_factory_test_util.h @@ -6,10 +6,12 @@ #define NET_HTTP_HTTP_STREAM_FACTORY_TEST_UTIL_H_ #include +#include #include #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" +#include "base/run_loop.h" #include "net/http/http_stream.h" #include "net/http/http_stream_factory.h" #include "net/http/http_stream_factory_job.h" @@ -22,10 +24,13 @@ #include "url/scheme_host_port.h" using testing::_; -using testing::Invoke; namespace net { +class HttpStream; +class WebSocketHandshakeStreamBase; +class BidirectionalStreamImpl; + class HttpStreamFactoryPeer { public: static void AddJobController( @@ -44,7 +49,9 @@ class HttpStreamFactoryPeer { } }; -// This delegate does nothing when called. +// Single-use HttpStreamRequest::Delegate that can wait for completion and +// records the results. CHECKs if there are multiple calls to methods signalling +// completion. class MockHttpStreamRequestDelegate : public HttpStreamRequest::Delegate { public: MockHttpStreamRequestDelegate(); @@ -55,41 +62,47 @@ class MockHttpStreamRequestDelegate : public HttpStreamRequest::Delegate { ~MockHttpStreamRequestDelegate() override; - // std::unique_ptr is not copyable and therefore cannot be mocked. - MOCK_METHOD2(OnStreamReadyImpl, - void(const ProxyInfo& used_proxy_info, HttpStream* stream)); - void OnStreamReady(const ProxyInfo& used_proxy_info, - std::unique_ptr stream) override { - OnStreamReadyImpl(used_proxy_info, stream.get()); - } - - // std::unique_ptr is not copyable and therefore cannot be mocked. - void OnBidirectionalStreamImplReady( - const ProxyInfo& used_proxy_info, - std::unique_ptr stream) override {} - - // std::unique_ptr is not copyable and therefore cannot be mocked. + std::unique_ptr stream) override; void OnWebSocketHandshakeStreamReady( const ProxyInfo& used_proxy_info, - std::unique_ptr stream) override {} + std::unique_ptr stream) override; + void OnBidirectionalStreamImplReady( + const ProxyInfo& used_proxy_info, + std::unique_ptr stream) override; + void OnStreamFailed(int status, + const NetErrorDetails& net_error_details, + const ProxyInfo& used_proxy_info, + ResolveErrorInfo resolve_error_info) override; + void OnCertificateError(int status, const SSLInfo& ssl_info) override; + void OnNeedsProxyAuth(const HttpResponseInfo& proxy_response, + const ProxyInfo& used_proxy_info, + HttpAuthController* auth_controller) override; + void OnNeedsClientAuth(SSLCertRequestInfo* cert_info) override; + void OnQuicBroken() override; - MOCK_METHOD4(OnStreamFailed, - void(int status, - const NetErrorDetails& net_error_details, - const ProxyInfo& used_proxy_info, - ResolveErrorInfo resolve_error_info)); + // Waits until the request is complete. Returns the HttpStream if one was + // received. Otherwise, returns nullptr and fails the current test. + std::unique_ptr WaitForHttpStream(); - MOCK_METHOD2(OnCertificateError, void(int status, const SSLInfo& ssl_info)); + // Waits until the request is complete. Returns the net Error if one was + // received. Otherwise, returns ERR_UNEXPECTED and fails the current test. + int WaitForError(); - MOCK_METHOD3(OnNeedsProxyAuth, - void(const HttpResponseInfo& proxy_response, - const ProxyInfo& used_proxy_info, - HttpAuthController* auth_controller)); + // Returns the proxy info received by a method signalling completion. CHECKs + // if no such method has been invoked yet. + const ProxyInfo& used_proxy_info() const; - MOCK_METHOD1(OnNeedsClientAuth, void(SSLCertRequestInfo* cert_info)); + // Returns true if `this` has already observed an event indicating completion + // - that is, one of the *Ready() methods or OnStreamFailed() has been + // invoked. + bool IsDone(); - MOCK_METHOD0(OnQuicBroken, void()); + private: + std::optional used_proxy_info_; + std::unique_ptr http_stream_; + std::optional net_error_; + base::RunLoop done_run_loop_; }; class MockHttpStreamFactoryJob : public HttpStreamFactory::Job { @@ -103,7 +116,6 @@ class MockHttpStreamFactoryJob : public HttpStreamFactory::Job { ProxyInfo proxy_info, const std::vector& allowed_bad_certs, url::SchemeHostPort destination, - GURL origin_url, NextProto alternative_protocol, quic::ParsedQuicVersion quic_version, bool is_websocket, @@ -135,7 +147,6 @@ class TestJobFactory : public HttpStreamFactory::JobFactory { const ProxyInfo& proxy_info, const std::vector& allowed_bad_certs, url::SchemeHostPort destination, - GURL origin_url, bool is_websocket, bool enable_ip_based_pooling_for_h2, NetLog* net_log, @@ -147,6 +158,8 @@ class TestJobFactory : public HttpStreamFactory::JobFactory { MockHttpStreamFactoryJob* alternative_job() const { return alternative_job_; } MockHttpStreamFactoryJob* dns_alpn_h3_job() const { return dns_alpn_h3_job_; } + void set_use_real_jobs() { use_real_jobs_ = true; } + private: raw_ptr main_job_ = nullptr; @@ -154,6 +167,9 @@ class TestJobFactory : public HttpStreamFactory::JobFactory { alternative_job_ = nullptr; raw_ptr dns_alpn_h3_job_ = nullptr; + + // When set to true, creates real jobs, and accessors don't work. + bool use_real_jobs_ = false; }; } // namespace net diff --git a/naiveproxy/src/net/http/http_stream_key.cc b/naiveproxy/src/net/http/http_stream_key.cc index 286ce166ee..632ea4166c 100644 --- a/naiveproxy/src/net/http/http_stream_key.cc +++ b/naiveproxy/src/net/http/http_stream_key.cc @@ -100,7 +100,7 @@ QuicSessionAliasKey HttpStreamKey::CalculateQuicSessionAliasKey( destination_.host(), destination_.port(), privacy_mode(), ProxyChain::Direct(), SessionUsage::kDestination, socket_tag(), network_anonymization_key(), secure_dns_policy(), - /*require_dns_https_alpn=*/false); + /*require_dns_https_alpn=*/false, disable_cert_network_fetches()); return QuicSessionAliasKey(std::move(destination_for_name_resolution), std::move(quic_session_key)); } diff --git a/naiveproxy/src/net/http/http_stream_parser.cc b/naiveproxy/src/net/http/http_stream_parser.cc index f9610cdda1..07818f9bea 100644 --- a/naiveproxy/src/net/http/http_stream_parser.cc +++ b/naiveproxy/src/net/http/http_stream_parser.cc @@ -9,6 +9,7 @@ #include #include +#include "base/byte_count.h" #include "base/check.h" #include "base/compiler_specific.h" #include "base/containers/span.h" @@ -1061,7 +1062,7 @@ int HttpStreamParser::ParseResponseHeaders(size_t end_offset) { return ERR_INVALID_HTTP_RESPONSE; } - std::string_view scheme = url_.scheme_piece(); + std::string_view scheme = url_.scheme(); if (url::DefaultPortForScheme(scheme) != url_.EffectiveIntPort()) { // If the port is not the default for the scheme, assume it's not a real // HTTP/0.9 response, and fail the request. @@ -1107,7 +1108,9 @@ int HttpStreamParser::ParseResponseHeaders(size_t end_offset) { response_->connection_info = HttpConnectionInfo::kHTTP1_1; } DVLOG(1) << __func__ << "() content_length = \"" - << response_->headers->GetContentLength() << "\n\"" + << response_->headers->GetContentLength().value_or( + base::ByteCount(-1)) + << "\n\"" << " headers = \"" << GetResponseHeaderLines(*response_->headers) << "\""; return OK; @@ -1157,7 +1160,9 @@ void HttpStreamParser::CalculateResponseBodySize() { if (response_->headers->IsChunkEncoded()) { chunked_decoder_ = std::make_unique(); } else { - response_body_length_ = response_->headers->GetContentLength(); + std::optional content_length = + response_->headers->GetContentLength(); + response_body_length_ = content_length ? content_length->InBytes() : -1; // If response_body_length_ is still -1, then we have to wait // for the server to close the connection. } diff --git a/naiveproxy/src/net/http/http_stream_pool.cc b/naiveproxy/src/net/http/http_stream_pool.cc index 798e377352..60108b3c5a 100644 --- a/naiveproxy/src/net/http/http_stream_pool.cc +++ b/naiveproxy/src/net/http/http_stream_pool.cc @@ -12,6 +12,7 @@ #include #include "base/containers/flat_set.h" +#include "base/debug/alias.h" #include "base/functional/bind.h" #include "base/memory/weak_ptr.h" #include "base/metrics/field_trial_params.h" @@ -28,6 +29,7 @@ #include "net/base/proxy_chain.h" #include "net/base/request_priority.h" #include "net/base/session_usage.h" +#include "net/base/task/task_runner.h" #include "net/http/alternative_service.h" #include "net/http/http_network_session.h" #include "net/http/http_stream_key.h" @@ -75,6 +77,10 @@ constexpr base::FeatureParam HttpStreamPool::kConnectionAttemptDelayParamName.data(), HttpStreamPool::kDefaultConnectionAttemptDelay}; +constexpr base::FeatureParam kEnablePriorityTaskRunner{ + &features::kHappyEyeballsV3, + HttpStreamPool::kEnablePriorityTaskRunnerParamName.data(), true}; + constexpr base::FeatureParam kTcpBasedAttemptDelayBehavior{ &features::kHappyEyeballsV3, @@ -123,6 +129,15 @@ std::ostream& operator<<(std::ostream& os, const StreamCounts& counts) { } // namespace +// static +const scoped_refptr HttpStreamPool::TaskRunner( + RequestPriority priority) { + if (kEnablePriorityTaskRunner.Get()) { + return GetTaskRunner(priority); + } + return base::SequencedTaskRunner::GetCurrentDefault(); +} + // static base::TimeDelta HttpStreamPool::GetConnectionAttemptDelay() { return kHttpStreamPoolConnectionAttemptDelay.Get(); @@ -260,7 +275,17 @@ void HttpStreamPool::DecrementTotalHandedOutStreamCount() { } void HttpStreamPool::IncrementTotalConnectingStreamCount() { - CHECK(EnsureTotalActiveStreamCountBelowLimit()); + // TODO(crbug.com/383606724): Change this `if` to CHECK() once we stabilize + // the implementation. + if (!EnsureTotalActiveStreamCountBelowLimit()) { + base::debug::Alias(&total_handed_out_stream_count_); + base::debug::Alias(&total_idle_stream_count_); + base::debug::Alias(&total_connecting_stream_count_); + NOTREACHED() << "handed_out=" << total_handed_out_stream_count_ + << ", idle=" << total_idle_stream_count_ + << ", connecting=" << total_connecting_stream_count_ + << ", limit=" << max_stream_sockets_per_pool_; + } ++total_connecting_stream_count_; TRACE_COUNTER("net.stream", "HttpStreamPoolTotalConnectingStreams", total_connecting_stream_count_); @@ -273,8 +298,17 @@ void HttpStreamPool::DecrementTotalConnectingStreamCount(size_t amount) { total_connecting_stream_count_); } -void HttpStreamPool::OnIPAddressChanged() { +void HttpStreamPool::OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) { CHECK(cleanup_on_ip_address_change_); + + // Ignore changes to randomly generated IPv6 temporary addresses. + if (base::FeatureList::IsEnabled( + net::features::kMaintainConnectionsOnIpv6TempAddrChange) && + change_type == NetworkChangeNotifier::IP_ADDRESS_CHANGE_IPV6_TEMPADDR) { + return; + } + for (const auto& group : groups_) { group.second->FlushWithError(ERR_NETWORK_CHANGED, StreamSocketCloseReason::kIpAddressChanged, @@ -369,7 +403,7 @@ void HttpStreamPool::ProcessPendingRequestsInGroups() { bool HttpStreamPool::RequiresHTTP11( const url::SchemeHostPort& destination, - const NetworkAnonymizationKey& network_anonymization_key) { + const NetworkAnonymizationKey& network_anonymization_key) const { return http_network_session()->http_server_properties()->RequiresHTTP11( destination, network_anonymization_key); } @@ -393,10 +427,12 @@ bool HttpStreamPool::CanUseQuic( /*is_websocket=*/false)) { return true; } + + // Note that this does not check RequiresHTTP11(), as despite its name, it + // only means H2 is not allowed. return http_network_session()->IsQuicEnabled() && enable_alternative_services && GURL::SchemeIsCryptographic(destination.scheme()) && - !RequiresHTTP11(destination, network_anonymization_key) && !IsQuicBroken(destination, network_anonymization_key); } @@ -531,26 +567,29 @@ base::WeakPtr HttpStreamPool::FindAvailableSpdySession( const SpdySessionKey& spdy_session_key, bool enable_ip_based_pooling_for_h2, const NetLogWithSource& net_log) { - if (!GURL::SchemeIsCryptographic(stream_key.destination().scheme())) { + // Only SSL origins may have H2 sessions. + // + // Also ignore any live H2 sessions for origins marked as requiring HTTP/1.1. + // Ideally such sessions would not exist, but that is a difficult invariant to + // enforce globally. + if (!GURL::SchemeIsCryptographic(stream_key.destination().scheme()) || + RequiresHTTP11(stream_key.destination(), + stream_key.network_anonymization_key())) { return nullptr; } - base::WeakPtr spdy_session = - http_network_session()->spdy_session_pool()->FindAvailableSession( - spdy_session_key, enable_ip_based_pooling_for_h2, - /*is_websocket=*/false, net_log); - if (spdy_session) { - CHECK(!RequiresHTTP11(stream_key.destination(), - stream_key.network_anonymization_key())); - } - return spdy_session; + return http_network_session()->spdy_session_pool()->FindAvailableSession( + spdy_session_key, enable_ip_based_pooling_for_h2, + /*is_websocket=*/false, net_log); } void HttpStreamPool::OnPreconnectComplete(JobController* job_controller, CompletionOnceCallback callback, int rv) { OnJobControllerComplete(job_controller); - std::move(callback).Run(rv); + if (callback) { + std::move(callback).Run(rv); + } } void HttpStreamPool::CheckConsistency() { @@ -601,7 +640,7 @@ void HttpStreamPool::CheckConsistency() { } } - base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask( + TaskRunner(IDLE)->PostDelayedTask( FROM_HERE, base::BindOnce(&HttpStreamPool::CheckConsistency, weak_ptr_factory_.GetWeakPtr()), diff --git a/naiveproxy/src/net/http/http_stream_pool.h b/naiveproxy/src/net/http/http_stream_pool.h index 798d99993b..253b0bfcda 100644 --- a/naiveproxy/src/net/http/http_stream_pool.h +++ b/naiveproxy/src/net/http/http_stream_pool.h @@ -54,6 +54,8 @@ class NET_EXPORT_PRIVATE HttpStreamPool // Specify when to start the TCP based attempt delay timer. enum class TcpBasedAttemptDelayBehavior { + // Starts the stream attempt delay timer on the first request or preconnect. + kStartTimerOnFirstJob, // Starts the stream attempt delay timer on the first service endpoint // update. kStartTimerOnFirstEndpointUpdate, @@ -101,13 +103,17 @@ class NET_EXPORT_PRIVATE HttpStreamPool static constexpr base::TimeDelta kDefaultConnectionAttemptDelay = base::Milliseconds(250); + // Sets of protocols for use in allowed ALPN fields of several classes. + // kProtoUnknown is not used, as it's an alias for all protocols, so causes + // issues when excluding one or more protocols. + static inline constexpr NextProtoSet kAllProtocols = { + NextProto::kProtoHTTP11, NextProto::kProtoHTTP2, NextProto::kProtoQUIC}; static inline constexpr NextProtoSet kTcpBasedProtocols = { - NextProto::kProtoUnknown, NextProto::kProtoHTTP11, - NextProto::kProtoHTTP2}; + NextProto::kProtoHTTP11, NextProto::kProtoHTTP2}; static inline constexpr NextProtoSet kHttp11Protocols = { - NextProto::kProtoUnknown, NextProto::kProtoHTTP11}; + NextProto::kProtoHTTP11}; static inline constexpr NextProtoSet kQuicBasedProtocols = { - NextProto::kProtoUnknown, NextProto::kProtoQUIC}; + NextProto::kProtoQUIC}; // Reasons for closing streams. static constexpr std::string_view kIpAddressChanged = "IP address changed"; @@ -135,6 +141,8 @@ class NET_EXPORT_PRIVATE HttpStreamPool "max_stream_per_group"; static constexpr std::string_view kConnectionAttemptDelayParamName = "connection_attempt_delay"; + static constexpr std::string_view kEnablePriorityTaskRunnerParamName = + "enable_priority_task_runner"; static constexpr std::string_view kTcpBasedAttemptDelayBehaviorParamName = "tcp_based_attempt_delay_behavior"; static constexpr std::string_view kVerboseNetLogParamName = "verbose_netlog"; @@ -146,7 +154,8 @@ class NET_EXPORT_PRIVATE HttpStreamPool {{TcpBasedAttemptDelayBehavior::kStartTimerOnFirstEndpointUpdate, "first_endpoint_update"}, {TcpBasedAttemptDelayBehavior::kStartTimerOnFirstQuicAttempt, - "first_quic_attempt"}}); + "first_quic_attempt"}, + {TcpBasedAttemptDelayBehavior::kStartTimerOnFirstJob, "first_job"}}); class NET_EXPORT_PRIVATE Job; class NET_EXPORT_PRIVATE JobController; @@ -154,6 +163,7 @@ class NET_EXPORT_PRIVATE HttpStreamPool class NET_EXPORT_PRIVATE AttemptManager; class NET_EXPORT_PRIVATE IPEndPointStateTracker; class NET_EXPORT_PRIVATE TcpBasedAttempt; + class NET_EXPORT_PRIVATE TcpBasedAttemptSlot; class NET_EXPORT_PRIVATE QuicAttempt; struct NET_EXPORT_PRIVATE QuicAttemptOutcome { explicit QuicAttemptOutcome(int result) : result(result) {} @@ -169,6 +179,9 @@ class NET_EXPORT_PRIVATE HttpStreamPool raw_ptr session; }; + static const scoped_refptr TaskRunner( + RequestPriority priority); + // The time to wait between connection attempts. static base::TimeDelta GetConnectionAttemptDelay(); @@ -242,7 +255,8 @@ class NET_EXPORT_PRIVATE HttpStreamPool bool IsPoolStalled(); // NetworkChangeNotifier::IPAddressObserver methods: - void OnIPAddressChanged() override; + void OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) override; // SSLClientContext::Observer methods. void OnSSLConfigChanged( @@ -262,8 +276,9 @@ class NET_EXPORT_PRIVATE HttpStreamPool void ProcessPendingRequestsInGroups(); // Returns true when HTTP/1.1 is required for `destination`. - bool RequiresHTTP11(const url::SchemeHostPort& destination, - const NetworkAnonymizationKey& network_anonymization_key); + bool RequiresHTTP11( + const url::SchemeHostPort& destination, + const NetworkAnonymizationKey& network_anonymization_key) const; // Returns true when QUIC is broken for `destination`. bool IsQuicBroken(const url::SchemeHostPort& destination, diff --git a/naiveproxy/src/net/http/http_stream_pool_attempt_manager.cc b/naiveproxy/src/net/http/http_stream_pool_attempt_manager.cc index 114bf914c1..62305a48f9 100644 --- a/naiveproxy/src/net/http/http_stream_pool_attempt_manager.cc +++ b/naiveproxy/src/net/http/http_stream_pool_attempt_manager.cc @@ -7,11 +7,13 @@ #include #include #include +#include #include #include "base/containers/contains.h" #include "base/containers/enum_set.h" #include "base/debug/alias.h" +#include "base/debug/dump_without_crashing.h" #include "base/functional/bind.h" #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_functions.h" @@ -25,6 +27,7 @@ #include "net/base/host_port_pair.h" #include "net/base/load_states.h" #include "net/base/load_timing_info.h" +#include "net/base/load_timing_internal_info.h" #include "net/base/net_error_details.h" #include "net/base/net_errors.h" #include "net/base/request_priority.h" @@ -79,6 +82,19 @@ base::Value::Dict GetServiceEndpointRequestAsValue( return dict; } +// Converts a NextProtoSet containing allowed ALPNs to a value usable in NetLog +// events - currently a std::string, though could make it a Value::List instead. +std::string AllowedAlpnsToValue(const NextProtoSet& allowed_alpns) { + std::string list; + for (const auto proto : allowed_alpns) { + if (!list.empty()) { + list.append(","); + } + list.append(NextProtoToString(proto)); + } + return list; +} + } // namespace // static @@ -146,14 +162,27 @@ HttpStreamPool::AttemptManager::AttemptManager(Group* group, NetLog* net_log) net_log, NetLogSourceType::HTTP_STREAM_POOL_ATTEMPT_MANAGER)), track_(base::trace_event::GetNextGlobalTraceId()), + flow_(perfetto::Flow::ProcessScoped( + base::trace_event::GetNextGlobalTraceId())), created_time_(base::TimeTicks::Now()), + is_using_tls_( + GURL::SchemeIsCryptographic(stream_key().destination().scheme())), + // This must be before the GetTcpBasedAttemptDelay() call, since it needs + // to know that QUIC is not allowed, or it will try to create an invalid + // QUIC destination and trigger a CHECK. + allowed_alpns_(is_using_tls_ ? kAllProtocols : kTcpBasedProtocols), request_jobs_(NUM_PRIORITIES), tcp_based_attempt_delay_(GetTcpBasedAttemptDelay()), should_block_tcp_based_attempt_(!tcp_based_attempt_delay_.is_zero()) { CHECK(group_); + // Since this is only one of two fixed values, seems not worth CHECKing. + DCHECK(!allowed_alpns_.Has(NextProto::kProtoUnknown)); + TRACE_EVENT_INSTANT("net.stream", "AttemptManagerStart", group_->track(), + group_->flow(), flow_); TRACE_EVENT_BEGIN("net.stream", "AttemptManager::AttemptManager", track_, - "destination", stream_key().destination().Serialize()); + flow_, "destination", + stream_key().destination().Serialize()); net_log_.BeginEvent( NetLogEventType::HTTP_STREAM_POOL_ATTEMPT_MANAGER_ALIVE, [&] { @@ -163,6 +192,7 @@ HttpStreamPool::AttemptManager::AttemptManager(Group* group, NetLog* net_log) static_cast(tcp_based_attempt_delay_.InMilliseconds())); dict.Set("should_block_tcp_based_attempt", should_block_tcp_based_attempt_); + dict.Set("supports_spdy", SupportsSpdy()); group_->net_log().source().AddToEventParameters(dict); return dict; }); @@ -172,7 +202,7 @@ HttpStreamPool::AttemptManager::AttemptManager(Group* group, NetLog* net_log) base::UmaHistogramTimes("Net.HttpStreamPool.TcpBasedAttemptDelay", tcp_based_attempt_delay_); - if (UsingTls()) { + if (is_using_tls_) { SSLConfig ssl_config; ssl_config.privacy_mode = stream_key().privacy_mode(); ssl_config.disable_cert_verification_network_fetches = @@ -202,12 +232,15 @@ HttpStreamPool::AttemptManager::~AttemptManager() { NetLogEventType::HTTP_STREAM_POOL_GROUP_ATTEMPT_MANAGER_DESTROYED, net_log_.source()); TRACE_EVENT_END("net.stream", track_); + TRACE_EVENT_INSTANT("net.stream", "AttemptManagerEnd", group_->track(), + group_->flow(), flow_); } void HttpStreamPool::AttemptManager::RequestStream(Job* job) { // JobController should check idle streams before starting a request Job. CHECK_EQ(group_->IdleStreamSocketCount(), 0u); + TRACE_EVENT("net.stream", "Job::RequestStream", job->flow()); TRACE_EVENT_INSTANT("net.stream", "AttemptManager::RequestStream", track_, NetLogWithSourceToFlow(job->request_net_log())); @@ -223,8 +256,7 @@ void HttpStreamPool::AttemptManager::RequestStream(Job* job) { dict.Set("allowed_bad_certs", std::move(allowed_bad_certs_list)); dict.Set("enable_ip_based_pooling_for_h2", job->enable_ip_based_pooling_for_h2()); - dict.Set("enable_alternative_services", - job->enable_alternative_services()); + dict.Set("allowed_alpns", AllowedAlpnsToValue(job->allowed_alpns())); dict.Set("quic_version", quic::ParsedQuicVersionToString(job->quic_version())); job->net_log().source().AddToEventParameters(dict); @@ -246,6 +278,7 @@ void HttpStreamPool::AttemptManager::Preconnect(Job* job) { CHECK(job->type() == JobType::kAltSvcQuicPreconnect || group_->ActiveStreamSocketCount() < job->num_streams()); + TRACE_EVENT("net.stream", "Job::Preconnect", job->flow()); TRACE_EVENT_INSTANT("net.stream", "AttemptManager::Preconnect", track_, NetLogWithSourceToFlow(job->request_net_log())); @@ -333,7 +366,7 @@ bool HttpStreamPool::AttemptManager::IsSvcbOptional() { CHECK(pool()->stream_attempt_params()->ssl_client_context); // Optional when the destination is not a SVCB-capable or ECH is disabled. - if (!UsingTls() || !IsEchEnabled()) { + if (!is_using_tls_ || !IsEchEnabled()) { return true; } @@ -348,9 +381,10 @@ bool HttpStreamPool::AttemptManager::HasEnoughTcpBasedAttemptsForSlowIPEndPoint( // TODO(crbug.com/383824591): Consider modifying the value of // IPEndPointStateMap to track the number of in-flight attempts per // IPEndPoint, if this loop is a bottlenek. - size_t num_attempts = std::ranges::count( - tcp_based_attempts_, ip_endpoint, - [](const auto& entry) { return entry->attempt()->ip_endpoint(); }); + size_t num_attempts = std::ranges::count_if( + tcp_based_attempt_slots_, [&ip_endpoint](const auto& slot) { + return slot->HasIPEndPoint(ip_endpoint); + }); return num_attempts >= std::max(request_jobs_.size(), CalculateMaxPreconnectCount()); @@ -421,17 +455,26 @@ void HttpStreamPool::AttemptManager::SetInitialAttemptState() { }); base::UmaHistogramEnumeration("Net.HttpStreamPool.InitialAttemptState2", *initial_attempt_state_); + base::UmaHistogramTimes("Net.HttpStreamPool.InitialAttemptStartTime", + base::TimeTicks::Now() - created_time_); } -base::expected -HttpStreamPool::AttemptManager::GetSSLConfig(const IPEndPoint& ip_endpoint) { +SSLConfig HttpStreamPool::AttemptManager::GetBaseSSLConfig() { + CHECK(is_using_tls_); + SSLConfig config = *base_ssl_config_; + // `enable_early_data` may change over the course of the HttpNetworkSession's + // lifetime, so we sample it for each TlsStreamAttempt. + config.early_data_enabled = + http_network_session()->params().enable_early_data; + return config; +} + +base::expected +HttpStreamPool::AttemptManager::GetServiceEndpoint( + const IPEndPoint& ip_endpoint) { CHECK(service_endpoint_request_); CHECK(service_endpoint_request_->EndpointsCryptoReady()); - SSLConfig ssl_config = *base_ssl_config_; - ssl_config.early_data_enabled = - http_network_session()->params().enable_early_data; - const bool svcb_optional = IsSvcbOptional(); for (auto& endpoint : service_endpoint_request_->GetEndpointResults()) { if (!IsEndpointUsableForTcpBasedAttempt(endpoint, svcb_optional)) { @@ -440,23 +483,13 @@ HttpStreamPool::AttemptManager::GetSSLConfig(const IPEndPoint& ip_endpoint) { const std::vector& ip_endpoints = ip_endpoint.address().IsIPv4() ? endpoint.ipv4_endpoints : endpoint.ipv6_endpoints; - if (base::Contains(ip_endpoints, ip_endpoint)) { - if (IsEchEnabled()) { - ssl_config.ech_config_list = endpoint.metadata.ech_config_list; - } - if (!endpoint.metadata.trust_anchor_ids.empty()) { - ssl_config.trust_anchor_ids = - SSLConfig::SelectTrustAnchorIDs(endpoint.metadata.trust_anchor_ids, - pool() - ->stream_attempt_params() - ->ssl_client_context->config() - .trust_anchor_ids); - } - return ssl_config; + if (!base::Contains(ip_endpoints, ip_endpoint)) { + continue; } + return endpoint; } - return base::unexpected(TlsStreamAttempt::GetSSLConfigError::kAbort); + return base::unexpected(TlsStreamAttempt::GetServiceEndpointError::kAbort); } void HttpStreamPool::AttemptManager::ProcessPendingJob() { @@ -476,42 +509,35 @@ void HttpStreamPool::AttemptManager::ProcessPendingJob() { } } - const size_t pending_job_count = PendingRequestJobCount(); - const size_t pending_preconnect_count = PendingPreconnectCount(); - - if (pending_job_count == 0 && pending_preconnect_count == 0) { - return; - } - DCHECK(!HasAvailableSpdySession()); - MaybeAttemptTcpBased(/*exclude_ip_endpoint=*/std::nullopt, - /*max_attempts=*/1); + MaybeAttemptTcpBased(); } void HttpStreamPool::AttemptManager::CancelTcpBasedAttempts( StreamSocketCloseReason reason) { - if (tcp_based_attempts_.empty()) { + if (tcp_based_attempt_slots_.empty()) { return; } - const size_t num_cancel_attempts = tcp_based_attempts_.size(); + const size_t num_cancel_slots = tcp_based_attempt_slots_.size(); + const size_t num_total_cancel_attempts = TotalTcpBasedAttemptCount(); const size_t num_total_connecting_before = pool()->TotalConnectingStreamCount(); - while (!tcp_based_attempts_.empty()) { - std::unique_ptr attempt = - ExtractTcpBasedAttempt(tcp_based_attempts_.begin()->get()); - attempt->SetCancelReason(reason); - attempt.reset(); + while (!tcp_based_attempt_slots_.empty()) { + CancelTcpBasedAttemptSlot(tcp_based_attempt_slots_.begin()->get(), reason); } CHECK_EQ(pool()->TotalConnectingStreamCount(), - num_total_connecting_before - num_cancel_attempts); - CHECK_EQ(slow_tcp_based_attempt_count_, 0u); + num_total_connecting_before - num_cancel_slots); base::UmaHistogramCounts100( - base::StrCat({"Net.HttpStreamPool.TcpBasedAttemptCancelCount.", + base::StrCat({"Net.HttpStreamPool.TcpBasedAttemptSlotCancelCount.", StreamSocketCloseReasonToString(reason)}), - num_cancel_attempts); + num_cancel_slots); + base::UmaHistogramCounts100( + base::StrCat({"Net.HttpStreamPool.TcpBasedAttemptTotalCancelCount.", + StreamSocketCloseReasonToString(reason)}), + num_total_cancel_attempts); ip_endpoint_state_tracker_.RemoveSlowAttemptingEndpoint(); @@ -523,31 +549,34 @@ void HttpStreamPool::AttemptManager::CancelTcpBasedAttempts( MaybeCompleteLater(); } -void HttpStreamPool::AttemptManager::OnJobComplete(Job* job) { - preconnect_jobs_.erase(job); - limit_ignoring_jobs_.erase(job); - ip_based_pooling_disabling_jobs_.erase(job); - alternative_service_disabling_jobs_.erase(job); - - auto notified_it = notified_jobs_.find(job); - if (notified_it != notified_jobs_.end()) { - notified_jobs_.erase(notified_it); +void HttpStreamPool::AttemptManager::OnJobCancelled(Job* job) { + if (job->is_preconnect()) { + preconnect_jobs_.erase(job); } else { - for (JobQueue::Pointer pointer = request_jobs_.FirstMax(); - !pointer.is_null(); - pointer = request_jobs_.GetNextTowardsLastMin(pointer)) { - if (pointer.value() == job) { - RemoveJobFromQueue(pointer); - MaybeStartDraining(); - break; - } - } + auto job_ptr = request_jobs_.FindIf(base::BindRepeating( + [](Job* job, raw_ptr other_job) { return other_job == job; }, + job)); + CHECK(!job_ptr.is_null()); + request_jobs_.Erase(job_ptr); } - MaybeCompleteLater(); + OnJobDone(job); } -void HttpStreamPool::AttemptManager::CancelJobs(int error) { +void HttpStreamPool::AttemptManager::CancelJobs( + int error, + StreamSocketCloseReason cancel_reason) { + std::string_view reason_suffix = + StreamSocketCloseReasonToString(cancel_reason); + base::UmaHistogramCounts100( + base::StrCat( + {"Net.HttpStreamPool.RequestJobCancelCount.", reason_suffix}), + request_jobs_.size()); + base::UmaHistogramCounts100( + base::StrCat( + {"Net.HttpStreamPool.PreconnectJobCancelCount.", reason_suffix}), + preconnect_jobs_.size()); + HandleFinalError(error); } @@ -558,24 +587,6 @@ void HttpStreamPool::AttemptManager::CancelQuicAttempt(int error) { } } -size_t HttpStreamPool::AttemptManager::PendingRequestJobCount() const { - return PendingCountInternal(request_jobs_.size()); -} - -size_t HttpStreamPool::AttemptManager::PendingPreconnectCount() const { - size_t num_streams = CalculateMaxPreconnectCount(); - // Pending preconnect count is treated as zero when the maximum preconnect - // socket count is less than or equal to the active stream socket count. - // This behavior is for compatibility with the non-HEv3 code path. See - // TransportClientSocketPool::RequestSockets(). - CHECK_GE(group_->ActiveStreamSocketCount(), slow_tcp_based_attempt_count_); - if (num_streams <= - group_->ActiveStreamSocketCount() - slow_tcp_based_attempt_count_) { - return 0; - } - return PendingCountInternal(num_streams); -} - const HttpStreamKey& HttpStreamPool::AttemptManager::stream_key() const { return group_->stream_key(); } @@ -619,10 +630,6 @@ const NetLogWithSource& HttpStreamPool::AttemptManager::net_log() { return net_log_; } -bool HttpStreamPool::AttemptManager::UsingTls() const { - return GURL::SchemeIsCryptographic(stream_key().destination().scheme()); -} - LoadState HttpStreamPool::AttemptManager::GetLoadState() const { if (group_->ReachedMaxStreamLimit()) { return LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET; @@ -635,9 +642,8 @@ LoadState HttpStreamPool::AttemptManager::GetLoadState() const { LoadState load_state = LOAD_STATE_IDLE; // When there are TCP based attempts, use most advanced one. - for (const auto& tcp_based_attempt : tcp_based_attempts_) { - load_state = - std::max(load_state, tcp_based_attempt->attempt()->GetLoadState()); + for (const auto& slot : tcp_based_attempt_slots_) { + load_state = std::max(load_state, slot->GetLoadState()); // There should not be a load state later than LOAD_STATE_SSL_HANDSHAKE. if (load_state == LOAD_STATE_SSL_HANDSHAKE) { break; @@ -683,7 +689,7 @@ bool HttpStreamPool::AttemptManager::IsStalledByPoolLimit() { } if (HasAvailableSpdySession()) { - CHECK_EQ(PendingPreconnectCount(), 0u); + CHECK(preconnect_jobs_.empty()); return false; } @@ -699,6 +705,19 @@ bool HttpStreamPool::AttemptManager::IsStalledByPoolLimit() { } } +size_t HttpStreamPool::AttemptManager::TotalTcpBasedAttemptCount() const { + size_t num_attempts = 0; + for (const auto& slot : tcp_based_attempt_slots_) { + if (slot->ipv4_attempt()) { + ++num_attempts; + } + if (slot->ipv6_attempt()) { + ++num_attempts; + } + } + return num_attempts; +} + void HttpStreamPool::AttemptManager::OnTcpBasedAttemptComplete( TcpBasedAttempt* raw_attempt, int rv) { @@ -708,7 +727,7 @@ void HttpStreamPool::AttemptManager::OnTcpBasedAttemptComplete( } std::unique_ptr tcp_based_attempt = - ExtractTcpBasedAttempt(raw_attempt); + ExtractTcpBasedAttempt(raw_attempt, rv); if (rv != OK) { HandleTcpBasedAttemptFailure(std::move(tcp_based_attempt), rv); @@ -748,7 +767,7 @@ void HttpStreamPool::AttemptManager::OnTcpBasedAttemptComplete( spdy_session_pool()->CreateAvailableSessionFromSocketHandle( spdy_session_key(), std::move(handle), net_log(), MultiplexedSessionCreationInitiator::kUnknown, &spdy_session, - SpdySessionInitiator::kHttpStreamPoolAttemptManager); + std::nullopt, SpdySessionInitiator::kHttpStreamPoolAttemptManager); if (create_result != OK) { HandleTcpBasedAttemptFailure(std::move(tcp_based_attempt), create_result); return; @@ -787,8 +806,6 @@ void HttpStreamPool::AttemptManager::OnTcpBasedAttemptComplete( void HttpStreamPool::AttemptManager::OnTcpBasedAttemptSlow( TcpBasedAttempt* raw_attempt) { CHECK(raw_attempt->is_slow()); - auto it = tcp_based_attempts_.find(raw_attempt); - CHECK(it != tcp_based_attempts_.end()); TRACE_EVENT_INSTANT("net.stream", "AttemptManager::OnTcpBasedAttemptSlow", track_, "ip_endpoint", @@ -800,11 +817,10 @@ void HttpStreamPool::AttemptManager::OnTcpBasedAttemptSlow( raw_attempt->ip_endpoint().ToString()); }); - ++slow_tcp_based_attempt_count_; ip_endpoint_state_tracker_.OnEndpointSlow(raw_attempt->ip_endpoint()); // Don't attempt the same IP endpoint. - MaybeAttemptTcpBased(/*exclude_ip_endpoint=*/raw_attempt->ip_endpoint()); + MaybeAttemptTcpBased(); } void HttpStreamPool::AttemptManager::OnQuicAttemptComplete( @@ -894,18 +910,12 @@ void HttpStreamPool::AttemptManager::OnQuicAttemptSlow() { base::Value::Dict HttpStreamPool::AttemptManager::GetInfoAsValue() const { base::Value::Dict dict; - dict.Set("request_job_count_all", static_cast(request_jobs_.size())); - dict.Set("request_job_count_pending", - static_cast(PendingRequestJobCount())); + dict.Set("request_job_count", static_cast(request_jobs_.size())); dict.Set("job_count_limit_ignoring", static_cast(limit_ignoring_jobs_.size())); - dict.Set("job_count_notified", static_cast(notified_jobs_.size())); - dict.Set("preconnect_count_all", static_cast(preconnect_jobs_.size())); - dict.Set("preconnect_count_pending", - static_cast(PendingPreconnectCount())); - dict.Set("tcp_based_attempt_count", static_cast(TcpBasedAttemptCount())); - dict.Set("slow_tcp_based_attempt_count", - static_cast(slow_tcp_based_attempt_count_)); + dict.Set("preconnect_count", static_cast(preconnect_jobs_.size())); + dict.Set("tcp_based_attempt_slot_count", + static_cast(TcpBasedAttemptSlotCount())); dict.Set("availability_state", static_cast(availability_state_)); if (final_error_to_notify_jobs_.has_value()) { dict.Set("final_error_to_notify_job", *final_error_to_notify_jobs_); @@ -932,19 +942,7 @@ base::Value::Dict HttpStreamPool::AttemptManager::GetInfoAsValue() const { static_cast(tcp_based_attempt_delay_.InMilliseconds())); dict.Set("should_block_tcp_based_attempt", should_block_tcp_based_attempt_); - int ssl_config_num_waiting_callbacks = 0; - if (!tcp_based_attempts_.empty()) { - base::Value::List tcp_based_attempts; - for (const auto& entry : tcp_based_attempts_) { - if (entry->IsWaitingSSLConfig()) { - ++ssl_config_num_waiting_callbacks; - } - tcp_based_attempts.Append(entry->GetInfoAsValue()); - } - dict.Set("tcp_based_attempts", std::move(tcp_based_attempts)); - } - dict.Set("ssl_config_num_waiting_callbacks", - ssl_config_num_waiting_callbacks); + dict.Set("tcp_based_attempt_slots", GetTcpBasedAttemptSlotsAsValue()); base::Value::List ip_endpoint_states = ip_endpoint_state_tracker_.GetInfoAsValue(); @@ -973,29 +971,30 @@ base::Value::Dict HttpStreamPool::AttemptManager::GetStatesAsNetLogParams() static_cast(group_->ActiveStreamSocketCount())); dict.Set("num_idle_sockets", static_cast(group_->IdleStreamSocketCount())); + dict.Set("num_handed_out_sockets", + static_cast(group_->HandedOutStreamSocketCount())); dict.Set("num_total_sockets", static_cast(group_->ActiveStreamSocketCount())); dict.Set("num_jobs", static_cast(request_jobs_.size())); - dict.Set("num_notified_jobs", static_cast(notified_jobs_.size())); dict.Set("num_preconnects", static_cast(preconnect_jobs_.size())); - dict.Set("num_tcp_based_attempts", - static_cast(tcp_based_attempts_.size())); - dict.Set("num_slow_attempts", - static_cast(slow_tcp_based_attempt_count_)); + dict.Set("num_tcp_based_attempt_slots", + static_cast(tcp_based_attempt_slots_.size())); dict.Set("enable_ip_based_pooling_for_h2", IsIpBasedPoolingEnabledForH2()); - dict.Set("enable_alternative_services", IsAlternativeServiceEnabled()); + dict.Set("allowed_alpns", AllowedAlpnsToValue(allowed_alpns_)); dict.Set("quic_attempt_alive", !!quic_attempt_); if (quic_attempt_result_.has_value()) { dict.Set("quic_attempt_result", *quic_attempt_result_); } + + dict.Set("tcp_based_attempt_slots", GetTcpBasedAttemptSlotsAsValue()); + return dict; } MultiplexedSessionCreationInitiator HttpStreamPool::AttemptManager::CalculateMultiplexedSessionCreationInitiator() { // Iff we only have preconnect jobs, return `kPreconnect`. - if (!preconnect_jobs_.empty() && request_jobs_.empty() && - notified_jobs_.empty()) { + if (!preconnect_jobs_.empty() && request_jobs_.empty()) { return MultiplexedSessionCreationInitiator::kPreconnect; } return MultiplexedSessionCreationInitiator::kUnknown; @@ -1031,11 +1030,8 @@ void HttpStreamPool::AttemptManager::StartInternal(Job* job) { ip_based_pooling_disabling_jobs_.emplace(job); } - if (!job->enable_alternative_services()) { - alternative_service_disabling_jobs_.emplace(job); - } - quic_version_ = job->quic_version(); + RestrictAllowedProtocols(job->allowed_alpns()); // JobController should check the existing QUIC/SPDY sessions before starting // a Job. @@ -1046,9 +1042,13 @@ void HttpStreamPool::AttemptManager::StartInternal(Job* job) { !HasAvailableSpdySession()); MaybeChangeServiceEndpointRequestPriority(); - RestrictAllowedProtocols(job->allowed_alpns()); UpdateTcpBasedAttemptState(); + if (GetTcpBasedAttemptDelayBehavior() == + TcpBasedAttemptDelayBehavior::kStartTimerOnFirstJob) { + MaybeRunTcpBasedAttemptDelayTimer(); + } + if (service_endpoint_request_ || service_endpoint_request_finished_) { MaybeAttemptQuic(); MaybeAttemptTcpBased(); @@ -1078,7 +1078,8 @@ void HttpStreamPool::AttemptManager::ResolveServiceEndpoint( void HttpStreamPool::AttemptManager::ResetServiceEndpointRequestLater() { CHECK(is_shutting_down()); - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + // Using IDLE since resetting ServiceEndpointRequest is not urgent. + TaskRunner(IDLE)->PostTask( FROM_HERE, base::BindOnce(&AttemptManager::ResetServiceEndpointRequest, weak_ptr_factory_.GetWeakPtr())); } @@ -1090,6 +1091,8 @@ void HttpStreamPool::AttemptManager::ResetServiceEndpointRequest() { void HttpStreamPool::AttemptManager::RestrictAllowedProtocols( NextProtoSet allowed_alpns) { + CHECK(!allowed_alpns.Has(NextProto::kProtoUnknown)); + allowed_alpns_ = base::Intersection(allowed_alpns_, allowed_alpns); CHECK(!allowed_alpns_.empty()); @@ -1122,7 +1125,7 @@ void HttpStreamPool::AttemptManager::ProcessServiceEndpointChanges() { // For plain HTTP request, we need to wait for HTTPS RR because we could // trigger HTTP -> HTTPS upgrade when HTTPS RR is received during the endpoint // resolution. - if (!UsingTls() && !service_endpoint_request_->EndpointsCryptoReady() && + if (!is_using_tls_ && !service_endpoint_request_->EndpointsCryptoReady() && !service_endpoint_request_finished_) { return; } @@ -1145,7 +1148,7 @@ void HttpStreamPool::AttemptManager::ProcessServiceEndpointChanges() { HandleQuicSessionReady(quic_session, StreamSocketCloseReason::kUsingExistingQuicSession); - CHECK(tcp_based_attempts_.empty()); + CHECK(tcp_based_attempt_slots_.empty()); return; } @@ -1167,7 +1170,7 @@ void HttpStreamPool::AttemptManager::ProcessServiceEndpointChanges() { HandleSpdySessionReady(spdy_session, StreamSocketCloseReason::kUsingExistingSpdySession); - CHECK(tcp_based_attempts_.empty()); + CHECK(tcp_based_attempt_slots_.empty()); return; } @@ -1211,7 +1214,7 @@ QuicChromiumClientSession* HttpStreamPool::AttemptManager:: base::WeakPtr HttpStreamPool::AttemptManager:: CanUseExistingSpdySessionAfterEndpointChanges() { - if (!IsIpBasedPoolingEnabledForH2() || !UsingTls() || + if (!IsIpBasedPoolingEnabledForH2() || !is_using_tls_ || !CanUseTcpBasedProtocols()) { return nullptr; } @@ -1254,11 +1257,8 @@ void HttpStreamPool::AttemptManager::MaybeNotifySSLConfigReady() { // Transferring callback ownership is important to avoid accessing TCP based // attempts that could be destroyed while invoking callbacks. std::vector callbacks; - for (const auto& attempt : tcp_based_attempts_) { - auto callback = attempt->MaybeTakeSSLConfigWaitingCallback(); - if (callback.has_value()) { - callbacks.emplace_back(std::move(*callback)); - } + for (const auto& slot : tcp_based_attempt_slots_) { + slot->MaybeTakeSSLConfigWaitingCallbacks(callbacks); } for (auto& callback : callbacks) { @@ -1296,9 +1296,7 @@ void HttpStreamPool::AttemptManager::MaybeAttemptQuic() { } } -void HttpStreamPool::AttemptManager::MaybeAttemptTcpBased( - std::optional exclude_ip_endpoint, - std::optional max_attempts) { +void HttpStreamPool::AttemptManager::MaybeAttemptTcpBased() { if (is_shutting_down()) { return; } @@ -1314,17 +1312,16 @@ void HttpStreamPool::AttemptManager::MaybeAttemptTcpBased( // There might be multiple pending jobs. Make attempts as much as needed // and allowed. - size_t num_attempts = 0; - const bool using_tls = UsingTls(); + const bool using_tls = is_using_tls_; while (IsTcpBasedAttemptReady()) { // TODO(crbug.com/346835898): Change to DCHECK once we stabilize the // implementation. CHECK(!HasAvailableSpdySession()); std::optional ip_endpoint = - ip_endpoint_state_tracker_.GetIPEndPointToAttemptTcpBased( - exclude_ip_endpoint); + ip_endpoint_state_tracker_.GetIPEndPointToAttemptTcpBased(); if (!ip_endpoint.has_value()) { - if (service_endpoint_request_finished_ && tcp_based_attempts_.empty()) { + if (service_endpoint_request_finished_ && + tcp_based_attempt_slots_.empty()) { tcp_based_attempt_state_ = TcpBasedAttemptState::kAllEndpointsFailed; } if (tcp_based_attempt_state_ == @@ -1337,26 +1334,66 @@ void HttpStreamPool::AttemptManager::MaybeAttemptTcpBased( return; } - if (tcp_based_attempt_state_ == TcpBasedAttemptState::kNotStarted) { - SetInitialAttemptState(); - tcp_based_attempt_state_ = TcpBasedAttemptState::kAttempting; + TcpBasedAttemptSlot* slot = FindTcpBasedAttemptSlot(*ip_endpoint); + // If there is no available slot for a new attempt, wait until existing + // attempts complete. + if (!slot) { + return; } - CHECK(!preconnect_jobs_.empty() || group_->IdleStreamSocketCount() == 0); + CreateAndStartTcpBasedAttempt(using_tls, *ip_endpoint, slot); + } +} - auto tcp_based_attempt = - std::make_unique(this, using_tls, *ip_endpoint); - auto [attempt_iterator, inserted] = - tcp_based_attempts_.emplace(std::move(tcp_based_attempt)); +void HttpStreamPool::AttemptManager::CreateAndStartTcpBasedAttempt( + bool using_tls, + IPEndPoint ip_endpoint, + TcpBasedAttemptSlot* slot) { + if (tcp_based_attempt_state_ == TcpBasedAttemptState::kNotStarted) { + SetInitialAttemptState(); + tcp_based_attempt_state_ = TcpBasedAttemptState::kAttempting; + } + + CHECK(!preconnect_jobs_.empty() || group_->IdleStreamSocketCount() == 0); + + auto attempt = + std::make_unique(this, slot, std::move(ip_endpoint)); + TcpBasedAttempt* raw_attempt = attempt.get(); + slot->AllocateAttempt(std::move(attempt)); + raw_attempt->Start(); +} + +HttpStreamPool::TcpBasedAttemptSlot* +HttpStreamPool::AttemptManager::FindTcpBasedAttemptSlot( + const IPEndPoint& ip_endpoint) { + // Prefer a new slot if there is a room for it. + if (!ShouldRespectLimits() || group_->ActiveStreamSocketCount() < + pool()->max_stream_sockets_per_group()) { + auto slot = std::make_unique(); + auto [it, inserted] = tcp_based_attempt_slots_.emplace(std::move(slot)); CHECK(inserted); pool()->IncrementTotalConnectingStreamCount(); + return it->get(); + } - (*attempt_iterator)->Start(); - - ++num_attempts; - if (max_attempts.has_value() && num_attempts >= *max_attempts) { - break; + for (auto& slot : tcp_based_attempt_slots_) { + if (ip_endpoint.address().IsIPv4() && !slot->ipv4_attempt()) { + return slot.get(); } + if (ip_endpoint.address().IsIPv6() && !slot->ipv6_attempt()) { + return slot.get(); + } + } + return nullptr; +} + +void HttpStreamPool::AttemptManager::CancelTcpBasedAttemptSlot( + TcpBasedAttemptSlot* raw_slot, + std::optional reason) { + std::unique_ptr slot = + ExtractTcpBasedAttemptSlot(raw_slot); + if (reason.has_value()) { + slot->SetCancelReason(*reason); } } @@ -1398,6 +1435,9 @@ bool HttpStreamPool::AttemptManager::IsTcpBasedAttemptReady() { } return false; case CanAttemptResult::kReachedGroupLimit: + if (CanStartFallbackTcpBasedAttempt()) { + return true; + } // TODO(crbug.com/346835898): Better to handle cases where we partially // attempted some connections. NotifyPreconnectsComplete(ERR_PRECONNECT_MAX_SOCKET_LIMIT); @@ -1418,11 +1458,33 @@ bool HttpStreamPool::AttemptManager::IsTcpBasedAttemptReady() { } } +bool HttpStreamPool::AttemptManager::CanStartFallbackTcpBasedAttempt() const { + for (const auto& slot : tcp_based_attempt_slots_) { + if (slot->ipv4_attempt() && slot->ipv4_attempt()->is_slow() && + !slot->ipv6_attempt()) { + return true; + } + if (slot->ipv6_attempt() && slot->ipv6_attempt()->is_slow() && + !slot->ipv4_attempt()) { + return true; + } + } + return false; +} + +size_t HttpStreamPool::AttemptManager::NonSlowTcpBasedAttemptCount() const { + return std::ranges::count_if( + tcp_based_attempt_slots_, + [](const std::unique_ptr& slot) { + return !slot->IsSlow(); + }); +} + HttpStreamPool::AttemptManager::CanAttemptResult HttpStreamPool::AttemptManager::CanAttemptConnection() const { - size_t pending_count = - std::max(PendingRequestJobCount(), PendingPreconnectCount()); - if (pending_count == 0) { + const size_t required_attempt_count = std::max( + request_jobs_.size(), CalculateRequiredTcpBasedAttemptForPreconnect()); + if (required_attempt_count <= NonSlowTcpBasedAttemptCount()) { return CanAttemptResult::kNoPendingJob; } @@ -1455,13 +1517,14 @@ bool HttpStreamPool::AttemptManager::IsIpBasedPoolingEnabledForH2() const { return ip_based_pooling_disabling_jobs_.empty(); } -bool HttpStreamPool::AttemptManager::IsAlternativeServiceEnabled() const { - return alternative_service_disabling_jobs_.empty(); -} - bool HttpStreamPool::AttemptManager::SupportsSpdy() const { - return http_network_session()->http_server_properties()->GetSupportsSpdy( - stream_key().destination(), stream_key().network_anonymization_key()); + if (!supports_spdy_.has_value()) { + supports_spdy_ = + http_network_session()->http_server_properties()->GetSupportsSpdy( + stream_key().destination(), + stream_key().network_anonymization_key()); + } + return *supports_spdy_; } bool HttpStreamPool::AttemptManager::ShouldThrottleAttemptForSpdy() const { @@ -1469,11 +1532,10 @@ bool HttpStreamPool::AttemptManager::ShouldThrottleAttemptForSpdy() const { return false; } - CHECK(UsingTls()); + CHECK(is_using_tls_); // If there are no non-slow attempts, don't throttle new attempts. - CHECK_GE(tcp_based_attempts_.size(), slow_tcp_based_attempt_count_); - if (tcp_based_attempts_.size() - slow_tcp_based_attempt_count_ == 0) { + if (NonSlowTcpBasedAttemptCount() == 0) { return false; } @@ -1493,18 +1555,18 @@ size_t HttpStreamPool::AttemptManager::CalculateMaxPreconnectCount() const { return num_streams; } -size_t HttpStreamPool::AttemptManager::PendingCountInternal( - size_t pending_count) const { - CHECK_GE(tcp_based_attempts_.size(), slow_tcp_based_attempt_count_); - const size_t non_slow_count = - tcp_based_attempts_.size() - slow_tcp_based_attempt_count_; - // The number of in-flight, non-slow attempts could be larger than the number - // of jobs (e.g. a job was cancelled in the middle of an attempt). - if (pending_count <= non_slow_count) { +size_t +HttpStreamPool::AttemptManager::CalculateRequiredTcpBasedAttemptForPreconnect() + const { + const size_t max_preconnect_count = CalculateMaxPreconnectCount(); + // Required preconnect count is treated as zero when the maximum preconnect + // count is less than or equals to the active stream socket count. This + // behavior is for compatibility with the non-HEv3 code path. See + // TransportClientSocketPool::RequestSockets(). + if (max_preconnect_count <= group_->ActiveStreamSocketCount()) { return 0; } - - return pending_count - non_slow_count; + return max_preconnect_count; } std::optional @@ -1562,7 +1624,7 @@ void HttpStreamPool::AttemptManager::HandleFinalError(int error) { NotifyPreconnectsComplete(final_error_to_notify_jobs()); NotifyJobOfFailure(); - CHECK(tcp_based_attempts_.empty()); + CHECK(tcp_based_attempt_slots_.empty()); CHECK(request_jobs_.empty()); CHECK(preconnect_jobs_.empty()); CHECK(!quic_attempt_); @@ -1629,9 +1691,7 @@ void HttpStreamPool::AttemptManager::NotifyJobOfFailure() { void HttpStreamPool::AttemptManager::NotifyPreconnectsComplete(int rv) { while (!preconnect_jobs_.empty()) { - raw_ptr job = - preconnect_jobs_.extract(preconnect_jobs_.begin()).value(); - NotifyJobOfPreconnectComplete(std::move(job), rv); + NotifyJobOfPreconnectComplete(preconnect_jobs_.begin(), rv); } // TODO(crbug.com/414173943): Start draining if there is no request/preconnect @@ -1645,20 +1705,16 @@ void HttpStreamPool::AttemptManager::NotifyPreconnectsComplete(int rv) { void HttpStreamPool::AttemptManager::ProcessPreconnectsAfterAttemptComplete( int rv, size_t active_stream_count) { - std::vector completed_jobs; - for (auto& job : preconnect_jobs_) { - if (job->num_streams() <= active_stream_count) { - completed_jobs.emplace_back(job.get()); + for (auto preconnect_it = preconnect_jobs_.begin(); + preconnect_it != preconnect_jobs_.end();) { + auto current_it = preconnect_it; + ++preconnect_it; + if ((*current_it)->num_streams() <= active_stream_count) { + // Since jobs complete asynchronously, this cannot modify `next`. + NotifyJobOfPreconnectComplete(current_it, rv); } } - for (auto* completed_job : completed_jobs) { - auto it = preconnect_jobs_.find(completed_job); - CHECK(it != preconnect_jobs_.end()); - raw_ptr job = preconnect_jobs_.extract(it).value(); - NotifyJobOfPreconnectComplete(std::move(job), rv); - } - // TODO(crbug.com/414173943): Start draining if there is no request/preconnect // jobs. @@ -1670,16 +1726,19 @@ void HttpStreamPool::AttemptManager::ProcessPreconnectsAfterAttemptComplete( } void HttpStreamPool::AttemptManager::NotifyJobOfPreconnectComplete( - raw_ptr job, + PreconnectJobs::iterator job_it, int rv) { - Job* raw_job = job.get(); - limit_ignoring_jobs_.erase(raw_job); - notified_jobs_.emplace(std::move(job)); + DCHECK(job_it != preconnect_jobs_.end()); + Job* raw_job = job_it->get(); + + TRACE_EVENT("net.stream", "Job::OnPreconnectComplete", raw_job->flow(), + "result", rv); TRACE_EVENT_INSTANT("net.stream", "AttemptManager::NotifyJobOfPreconnectComplete", track_, NetLogWithSourceToFlow(raw_job->request_net_log())); - // We don't need to call MaybeCompleteLater() here, since `job` will call - // OnJobComplete() later. + + preconnect_jobs_.erase(job_it); + OnJobDone(raw_job); raw_job->OnPreconnectComplete(rv); } @@ -1694,18 +1753,72 @@ void HttpStreamPool::AttemptManager::CreateTextBasedStreamAndNotify( std::unique_ptr http_stream = group_->CreateTextBasedStream( std::move(stream_socket), reuse_type, std::move(connect_timing)); - CHECK(!ShouldRespectLimits() || group_->ActiveStreamSocketCount() <= - pool()->max_stream_sockets_per_group()) - << "active=" << group_->ActiveStreamSocketCount() - << ", limit=" << pool()->max_stream_sockets_per_group(); + // TODO(crbug.com/383606724): Change this `if` to CHECK() once we stabilize + // the implementation. + if (ShouldRespectLimits() && group_->ActiveStreamSocketCount() > + pool()->max_stream_sockets_per_group()) { + const size_t active_count = group_->ActiveStreamSocketCount(); + const size_t handed_out_count = group_->HandedOutStreamSocketCount(); + const size_t connecting_count = group_->ConnectingStreamSocketCount(); + base::debug::Alias(&active_count); + base::debug::Alias(&handed_out_count); + base::debug::Alias(&connecting_count); + NOTREACHED() << "active=" << active_count + << ", handed_out=" << handed_out_count + << ", connecting=" << connecting_count + << ", limit=" << pool()->max_stream_sockets_per_group(); + } - NotifyStreamReady(std::move(http_stream), negotiated_protocol); + NotifyStreamReady(std::move(http_stream), negotiated_protocol, + /*session_source=*/std::nullopt); +} + +void HttpStreamPool::AttemptManager::OnJobDone(Job* job) { + // `job` should already have been removed from the main job lists. + DCHECK( + request_jobs_ + .FindIf(base::BindRepeating( + [](Job* job, raw_ptr other_job) { return other_job == job; }, + job)) + .is_null()); + DCHECK_EQ(preconnect_jobs_.count(job), 0u); + + limit_ignoring_jobs_.erase(job); + ip_based_pooling_disabling_jobs_.erase(job); + if (!job->is_preconnect()) { + // MaybeStartDraining() is only called for non-preconnects. That does mean + // slow QUIC attempts will never be cancelled at this layer unless there's a + // a Job that makes it to the AttemptManager (as opposed to using an already + // connected TCP stream). + MaybeStartDraining(); + } + MaybeCompleteLater(); } bool HttpStreamPool::AttemptManager::HasAvailableSpdySession() const { - return spdy_session_pool()->HasAvailableSession( - spdy_session_key(), IsIpBasedPoolingEnabledForH2(), - /*is_websocket=*/false); + if (!is_using_tls_) { + return false; + } + + // Check for an available session before checking if it can be used. It's + // rare for HTTP/1.1 to be required in general, and checking it is can be + // slow. Also, it's fairly rare for there to be a session available here + // (outside of the session aliasing case), since the Job already checked for + // one. + if (!spdy_session_pool()->HasAvailableSession(spdy_session_key(), + IsIpBasedPoolingEnabledForH2(), + /*is_websocket=*/false)) { + return false; + } + + // If the destination is marked as requiring HTTP/1.1, act as if there's no + // available SPDY session. This matches the behavior of + // HttpStreamPool::FindAvailableSpdySession(). + if (pool()->RequiresHTTP11(stream_key().destination(), + stream_key().network_anonymization_key())) { + return false; + } + return true; } void HttpStreamPool::AttemptManager::MaybeStartDraining() { @@ -1734,7 +1847,8 @@ void HttpStreamPool::AttemptManager::MaybeStartDraining() { } void HttpStreamPool::AttemptManager::MaybeCreateSpdyStreamAndNotify( - base::WeakPtr spdy_session) { + base::WeakPtr spdy_session, + SessionSource session_source) { if (request_jobs_.empty()) { return; } @@ -1759,14 +1873,16 @@ void HttpStreamPool::AttemptManager::MaybeCreateSpdyStreamAndNotify( while (!streams.empty()) { std::unique_ptr stream = std::move(streams.back()); streams.pop_back(); - NotifyStreamReady(std::move(stream), NextProto::kProtoHTTP2); + NotifyStreamReady(std::move(stream), NextProto::kProtoHTTP2, + session_source); CHECK(weak_this); } CHECK(request_jobs_.empty()); } void HttpStreamPool::AttemptManager::MaybeCreateQuicStreamAndNotify( - QuicChromiumClientSession* quic_session) { + QuicChromiumClientSession* quic_session, + SessionSource session_source) { if (request_jobs_.empty()) { return; } @@ -1789,7 +1905,7 @@ void HttpStreamPool::AttemptManager::MaybeCreateQuicStreamAndNotify( while (!streams.empty()) { std::unique_ptr stream = std::move(streams.back()); streams.pop_back(); - NotifyStreamReady(std::move(stream), NextProto::kProtoQUIC); + NotifyStreamReady(std::move(stream), NextProto::kProtoQUIC, session_source); CHECK(weak_this); } CHECK(request_jobs_.empty()); @@ -1797,14 +1913,16 @@ void HttpStreamPool::AttemptManager::MaybeCreateQuicStreamAndNotify( void HttpStreamPool::AttemptManager::NotifyStreamReady( std::unique_ptr stream, - NextProto negotiated_protocol) { + NextProto negotiated_protocol, + std::optional session_source) { Job* job = ExtractFirstJobToNotify(); CHECK(job); + TRACE_EVENT("net.stream", "Job::NotifyStreamReady", job->flow(), + "negotiated_protocol", negotiated_protocol); TRACE_EVENT_INSTANT("net.stream", "AttemptManager::NotifyStreamReady", track_, NetLogWithSourceToFlow(job->request_net_log()), "negotiated_protocol", negotiated_protocol); - job->OnStreamReady(std::move(stream), negotiated_protocol); - MaybeStartDraining(); + job->OnStreamReady(std::move(stream), negotiated_protocol, session_source); } void HttpStreamPool::AttemptManager::HandleSpdySessionReady( @@ -1819,7 +1937,15 @@ void HttpStreamPool::AttemptManager::HandleSpdySessionReady( group_->Refresh(kSwitchingToHttp2, refresh_group_reason); NotifyPreconnectsComplete(OK); - MaybeCreateSpdyStreamAndNotify(spdy_session); + + CHECK(refresh_group_reason == StreamSocketCloseReason::kSpdySessionCreated || + refresh_group_reason == + StreamSocketCloseReason::kUsingExistingSpdySession); + SessionSource session_source = + refresh_group_reason == StreamSocketCloseReason::kSpdySessionCreated + ? SessionSource::kNew + : SessionSource::kExisting; + MaybeCreateSpdyStreamAndNotify(spdy_session, session_source); } void HttpStreamPool::AttemptManager::HandleQuicSessionReady( @@ -1836,34 +1962,41 @@ void HttpStreamPool::AttemptManager::HandleQuicSessionReady( group_->Refresh(kSwitchingToHttp3, refresh_group_reason); NotifyPreconnectsComplete(OK); - MaybeCreateQuicStreamAndNotify(quic_session); + + CHECK(refresh_group_reason == StreamSocketCloseReason::kQuicSessionCreated || + refresh_group_reason == + StreamSocketCloseReason::kUsingExistingQuicSession); + SessionSource session_source = + refresh_group_reason == StreamSocketCloseReason::kQuicSessionCreated + ? SessionSource::kNew + : SessionSource::kExisting; + MaybeCreateQuicStreamAndNotify(quic_session, session_source); } HttpStreamPool::Job* HttpStreamPool::AttemptManager::ExtractFirstJobToNotify() { if (request_jobs_.empty()) { return nullptr; } - raw_ptr job = RemoveJobFromQueue(request_jobs_.FirstMax()); - Job* job_raw_ptr = job.get(); - notified_jobs_.emplace(std::move(job)); - return job_raw_ptr; + Job* job = RemoveJobFromQueue(request_jobs_.FirstMax()); + return job; } -raw_ptr HttpStreamPool::AttemptManager::RemoveJobFromQueue( +HttpStreamPool::Job* HttpStreamPool::AttemptManager::RemoveJobFromQueue( JobQueue::Pointer job_pointer) { // If the extracted job is the last job that ignores the limit, cancel // in-flight attempts until the active stream count goes down to the limit. - raw_ptr job = request_jobs_.Erase(job_pointer); + Job* job = request_jobs_.Erase(job_pointer).get(); limit_ignoring_jobs_.erase(job); if (ShouldRespectLimits()) { while (group_->ActiveStreamSocketCount() > pool()->max_stream_sockets_per_group() && - !tcp_based_attempts_.empty()) { - std::unique_ptr attempt = - ExtractTcpBasedAttempt(tcp_based_attempts_.begin()->get()); - attempt.reset(); + !tcp_based_attempt_slots_.empty()) { + CancelTcpBasedAttemptSlot(tcp_based_attempt_slots_.begin()->get()); } } + + // Remove Job from other lists as well. + OnJobDone(job); return job; } @@ -1885,18 +2018,28 @@ void HttpStreamPool::AttemptManager::SetJobPriority(Job* job, MaybeChangeServiceEndpointRequestPriority(); } +std::unique_ptr +HttpStreamPool::AttemptManager::ExtractTcpBasedAttemptSlot( + TcpBasedAttemptSlot* raw_slot) { + auto it = tcp_based_attempt_slots_.find(raw_slot); + std::unique_ptr slot = + std::move(tcp_based_attempt_slots_.extract(it).value()); + pool()->DecrementTotalConnectingStreamCount(); + return slot; +} + std::unique_ptr HttpStreamPool::AttemptManager::ExtractTcpBasedAttempt( - TcpBasedAttempt* raw_attempt) { - auto it = tcp_based_attempts_.find(raw_attempt); - CHECK(it != tcp_based_attempts_.end()); - std::unique_ptr attempt = - std::move(tcp_based_attempts_.extract(it).value()); + TcpBasedAttempt* raw_attempt, + int rv) { + TcpBasedAttemptSlot* slot = raw_attempt->slot(); + auto it = tcp_based_attempt_slots_.find(slot); + CHECK(it != tcp_based_attempt_slots_.end()); - pool()->DecrementTotalConnectingStreamCount(); - if (attempt->is_slow()) { - CHECK_GT(slow_tcp_based_attempt_count_, 0u); - --slow_tcp_based_attempt_count_; + std::unique_ptr attempt = slot->TakeAttempt(raw_attempt); + + if (rv == OK || slot->empty()) { + ExtractTcpBasedAttemptSlot(slot); } return attempt; @@ -1916,7 +2059,7 @@ void HttpStreamPool::AttemptManager::HandleTcpBasedAttemptFailure( return; } - // We already removed `tcp_based_attempt` from `tcp_based_attempts_` so + // We already removed `tcp_based_attempt` from `tcp_based_attempt_slots_` so // the active stream count is up-to-date. ProcessPreconnectsAfterAttemptComplete(rv, group_->ActiveStreamSocketCount()); @@ -1926,7 +2069,7 @@ void HttpStreamPool::AttemptManager::HandleTcpBasedAttemptFailure( } if (rv == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { - CHECK(UsingTls()); + CHECK(is_using_tls_); client_auth_cert_info_ = tcp_based_attempt->attempt()->GetCertRequestInfo(); tcp_based_attempt.reset(); HandleFinalError(rv); @@ -1936,7 +2079,7 @@ void HttpStreamPool::AttemptManager::HandleTcpBasedAttemptFailure( if (IsCertificateError(rv)) { // When a certificate error happened for an attempt, notifies all jobs of // the error. - CHECK(UsingTls()); + CHECK(is_using_tls_); CHECK(tcp_based_attempt->attempt()->stream_socket()); SSLInfo ssl_info; bool has_ssl_info = @@ -2017,16 +2160,15 @@ bool HttpStreamPool::AttemptManager::CanUseTcpBasedProtocols() { return allowed_alpns_.HasAny(kTcpBasedProtocols); } -bool HttpStreamPool::AttemptManager::CanUseQuic() { - return allowed_alpns_.HasAny(kQuicBasedProtocols) && - pool()->CanUseQuic(stream_key().destination(), - stream_key().network_anonymization_key(), - IsAlternativeServiceEnabled()); +bool HttpStreamPool::AttemptManager::CanUseQuic() const { + return allowed_alpns_.HasAny(kQuicBasedProtocols); } -bool HttpStreamPool::AttemptManager::CanUseExistingQuicSession() { - return pool()->CanUseExistingQuicSession(quic_session_alias_key(), - IsAlternativeServiceEnabled()); +bool HttpStreamPool::AttemptManager::CanUseExistingQuicSession() const { + const QuicSessionAliasKey& session_alias_key = quic_session_alias_key(); + return CanUseQuic() && + http_network_session()->quic_session_pool()->CanUseExistingSession( + session_alias_key.session_key(), session_alias_key.destination()); } bool HttpStreamPool::AttemptManager::IsEchEnabled() const { @@ -2065,10 +2207,25 @@ void HttpStreamPool::AttemptManager::MaybeMarkQuicBroken() { stream_key().network_anonymization_key()); } +base::Value::Dict +HttpStreamPool::AttemptManager::GetTcpBasedAttemptSlotsAsValue() const { + base::Value::Dict dict; + dict.Set("num_slots", static_cast(tcp_based_attempt_slots_.size())); + + if (!tcp_based_attempt_slots_.empty()) { + base::Value::List slots; + for (const auto& slot : tcp_based_attempt_slots_) { + slots.Append(slot->GetInfoAsValue()); + } + dict.Set("slots", std::move(slots)); + } + + return dict; +} + bool HttpStreamPool::AttemptManager::CanComplete() const { - return request_jobs_.empty() && notified_jobs_.empty() && - preconnect_jobs_.empty() && tcp_based_attempts_.empty() && - !quic_attempt_; + return request_jobs_.empty() && preconnect_jobs_.empty() && + tcp_based_attempt_slots_.empty() && !quic_attempt_; } void HttpStreamPool::AttemptManager::MaybeComplete() { @@ -2078,11 +2235,9 @@ void HttpStreamPool::AttemptManager::MaybeComplete() { CHECK(limit_ignoring_jobs_.empty()); CHECK(ip_based_pooling_disabling_jobs_.empty()); - CHECK(alternative_service_disabling_jobs_.empty()); if (on_complete_callback_for_testing_) { - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, std::move(on_complete_callback_for_testing_)); + std::move(on_complete_callback_for_testing_).Run(); } group_->OnAttemptManagerComplete(this); @@ -2091,9 +2246,10 @@ void HttpStreamPool::AttemptManager::MaybeComplete() { void HttpStreamPool::AttemptManager::MaybeCompleteLater() { if (CanComplete()) { - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(&AttemptManager::MaybeComplete, - weak_ptr_factory_.GetWeakPtr())); + // Using IDLE priority since completing `this` is not urgent. + TaskRunner(IDLE)->PostTask(FROM_HERE, + base::BindOnce(&AttemptManager::MaybeComplete, + weak_ptr_factory_.GetWeakPtr())); } } diff --git a/naiveproxy/src/net/http/http_stream_pool_attempt_manager.h b/naiveproxy/src/net/http/http_stream_pool_attempt_manager.h index 3f5fa4b42c..893ee036d6 100644 --- a/naiveproxy/src/net/http/http_stream_pool_attempt_manager.h +++ b/naiveproxy/src/net/http/http_stream_pool_attempt_manager.h @@ -23,6 +23,7 @@ #include "net/base/ip_endpoint.h" #include "net/base/load_states.h" #include "net/base/load_timing_info.h" +#include "net/base/load_timing_internal_info.h" #include "net/base/net_error_details.h" #include "net/base/net_export.h" #include "net/base/priority_queue.h" @@ -126,6 +127,10 @@ class HttpStreamPool::AttemptManager const perfetto::Track& track() const { return track_; } + base::TimeTicks created_time() const { return created_time_; } + + bool using_tls() const { return is_using_tls_; } + std::optional initial_attempt_state() const { return initial_attempt_state_; } @@ -144,8 +149,6 @@ class HttpStreamPool::AttemptManager return dns_resolution_end_time_; } - NextProtoSet allowed_alpns() const { return allowed_alpns_; } - const NetLogWithSource& net_log(); // Starts `job` for a stream request. Will call one of Job::Delegate methods @@ -178,31 +181,23 @@ class HttpStreamPool::AttemptManager // or failure. size_t RequestJobCount() const { return request_jobs_.size(); } - // Returns the number of request jobs that have already been notified success - // or failure. - size_t NotifiedRequestJobCount() const { return notified_jobs_.size(); } - - // Returns the number of in-flight TCP based attempts. - size_t TcpBasedAttemptCount() const { return tcp_based_attempts_.size(); } + // Returns the number of in-flight TCP based attempt slots. + size_t TcpBasedAttemptSlotCount() const { + return tcp_based_attempt_slots_.size(); + } // Cancels all in-flight TCP based attempts. void CancelTcpBasedAttempts(StreamSocketCloseReason reason); - // Called when `job` is going to be destroyed. - void OnJobComplete(Job* job); + // Called when `job` that has not completed is destroyed. + void OnJobCancelled(Job* job); // Cancels all jobs. - void CancelJobs(int error); + void CancelJobs(int error, StreamSocketCloseReason cancel_reason); // Cancels the QuicAttempt if it exists. void CancelQuicAttempt(int error); - // Returns the number of pending requests/preconnects. The number is - // calculated by subtracting the number of in-flight attempts (excluding slow - // attempts) from the number of total jobs. - size_t PendingRequestJobCount() const; - size_t PendingPreconnectCount() const; - // Returns the current load state. LoadState GetLoadState() const; @@ -216,13 +211,22 @@ class HttpStreamPool::AttemptManager // Returns true when `this` is blocked by the pool's stream limit. bool IsStalledByPoolLimit(); - base::expected GetSSLConfig( - const IPEndPoint& endpoint); + // Returns the SSLConfig to use for TLS connections, not incorporating any + // configuration based on the service endpoint. + SSLConfig GetBaseSSLConfig(); + + base::expected + GetServiceEndpoint(const IPEndPoint& endpoint); + + // Returns the total number of TCP based attempts. Calculated by adding up all + // attempts in `tcp_based_attempt_slots_`, so avoid calling this method from + // hot paths. + size_t TotalTcpBasedAttemptCount() const; void OnTcpBasedAttemptComplete(TcpBasedAttempt* raw_attempt, int rv); void OnTcpBasedAttemptSlow(TcpBasedAttempt* raw_attempt); - bool CanUseExistingQuicSession(); + bool CanUseExistingQuicSession() const; // Runs the TCP based attempt delay timer if TCP based attempts are blocked // and the timer is not running. TcpBasedAttemptDelayBehavior specifies when @@ -296,6 +300,7 @@ class HttpStreamPool::AttemptManager std::string_view InitialAttemptStateToString(InitialAttemptState state); using JobQueue = PriorityQueue>; + using PreconnectJobs = std::set>; static std::string_view CanAttemptResultToString(CanAttemptResult result); @@ -309,8 +314,6 @@ class HttpStreamPool::AttemptManager void SetInitialAttemptState(); InitialAttemptState CalculateInitialAttemptState(); - bool UsingTls() const; - void StartInternal(Job* job); void ResolveServiceEndpoint(RequestPriority initial_priority); @@ -347,12 +350,24 @@ class HttpStreamPool::AttemptManager void MaybeAttemptQuic(); // Attempts connections if there are pending jobs and IPEndPoints that - // haven't failed. If `exclude_ip_endpoint` is given, exclude the IPEndPoint - // from attempts. If `max_attempts` is given, attempts connections up to - // `max_attempts`. - void MaybeAttemptTcpBased( - std::optional exclude_ip_endpoint = std::nullopt, - std::optional max_attempts = std::nullopt); + // haven't failed. + void MaybeAttemptTcpBased(); + + // Creates and starts a TCP based attempt. + void CreateAndStartTcpBasedAttempt(bool using_tls, + IPEndPoint ip_endpoint, + TcpBasedAttemptSlot* slot); + + // Finds or allocates a TcpBasedAttemptSlot for `ip_endpoint`. If under the + // group limit, allocates a new slot. Otherwise, tries to find an existing + // slot that doesn't have an attempt for the same address family as + // `ip_endpoint`. Returns nullptr when there is no available slot. + TcpBasedAttemptSlot* FindTcpBasedAttemptSlot(const IPEndPoint& ip_endpoint); + + // Cancels `raw_slot` and removes it from `tcp_based_attempt_slots_`. + void CancelTcpBasedAttemptSlot( + TcpBasedAttemptSlot* raw_slot, + std::optional reason = std::nullopt); // Returns true if there are pending jobs and the pool and the group // haven't reached stream limits. If the pool reached the stream limit, may @@ -360,8 +375,17 @@ class HttpStreamPool::AttemptManager // `spdy_throttle_timer_`. bool IsTcpBasedAttemptReady(); + // When an attempt to one address faimily (e.g., IPv4) is slow, this allows a + // new attempt to the other address family (e.g. IPv6) to be started in + // parallel. This is allowed even if the group's stream limit has been reached + // because the new attempt reuses the same "slot" as the slow attempt. + // + // Returns true if there is a slow attempt for one address family and no + // corresponding attempt for the other has been started yet. + bool CanStartFallbackTcpBasedAttempt() const; + // Actual implementation of IsConnectionAttemptReady(), without having side - // effects. + // effects, other than populating `supports_spdy_`, if needed. CanAttemptResult CanAttemptConnection() const; // Returns true only when there are no jobs that ignore the pool and group @@ -372,11 +396,10 @@ class HttpStreamPool::AttemptManager // HTTP/2. Note that this does nothing with QUIC. bool IsIpBasedPoolingEnabledForH2() const; - // Returns true only when there are no jobs that disable alternative services. - bool IsAlternativeServiceEnabled() const; - - // Returns true when the destination is known to support HTTP/2. Note that - // this could return false while initializing HttpServerProperties. + // Returns true when the destination is known to support HTTP/2. The value is + // retrieved from HttpServerProperties and cached on first invocation, as + // calculating it can be expensive. If HttpServerProperties are still loading + // on startup, could be incorrectly set to false. bool SupportsSpdy() const; // Returns true when connection attempts should be throttled because there is @@ -387,8 +410,13 @@ class HttpStreamPool::AttemptManager // Calculates the maximum streams counts requested by preconnects. size_t CalculateMaxPreconnectCount() const; - // Helper method to calculate pending jobs. - size_t PendingCountInternal(size_t pending_count) const; + // Calculates the number of TCP based attempts required to satisfy + // preconnects. + size_t CalculateRequiredTcpBasedAttemptForPreconnect() const; + + // Returns the number of TCP based attempt slots that are not considered as + // slow. + size_t NonSlowTcpBasedAttemptCount() const; // Returns a QUIC endpoint to make a connection attempt. See the comments in // QuicSessionPool::SelectQuicVersion() for the criteria to select a QUIC @@ -417,7 +445,7 @@ class HttpStreamPool::AttemptManager size_t active_stream_count); // Notifies a job of preconnect completion. - void NotifyJobOfPreconnectComplete(raw_ptr job, int rv); + void NotifyJobOfPreconnectComplete(PreconnectJobs::iterator job_it, int rv); // Creates a text based stream and Notifies the highest priority job. void CreateTextBasedStreamAndNotify( @@ -429,12 +457,15 @@ class HttpStreamPool::AttemptManager void MaybeStartDraining(); - void MaybeCreateSpdyStreamAndNotify(base::WeakPtr spdy_session); + void MaybeCreateSpdyStreamAndNotify(base::WeakPtr spdy_session, + SessionSource session_source); - void MaybeCreateQuicStreamAndNotify(QuicChromiumClientSession* quic_session); + void MaybeCreateQuicStreamAndNotify(QuicChromiumClientSession* quic_session, + SessionSource session_source); void NotifyStreamReady(std::unique_ptr stream, - NextProto negotiated_protocol); + NextProto negotiated_protocol, + std::optional session_source); // Called when a SPDY session is ready to use. Cancels in-flight attempts. // Closes idle streams. Completes request/preconnect jobs. @@ -446,6 +477,12 @@ class HttpStreamPool::AttemptManager void HandleQuicSessionReady(QuicChromiumClientSession* quic_session, StreamSocketCloseReason refresh_group_reason); + // Called when a job is done, due to success, failure, or cancellation. `job` + // must have already been removed from `request_jobs_` and `preconnect_jobs_`, + // but may still be in other job lists (which this method will remove the job + // from). + void OnJobDone(Job* job); + // Extracts an entry from `request_jobs_` of which priority is highest. The // ownership of the entry is moved to `notified_jobs_`. Job* ExtractFirstJobToNotify(); @@ -454,11 +491,17 @@ class HttpStreamPool::AttemptManager // in-flight TCP based attempts when there are no limit ignoring jobs after // removing the job and in-flight TCP based attempts count is larger than the // limit. - raw_ptr RemoveJobFromQueue(JobQueue::Pointer job_pointer); + Job* RemoveJobFromQueue(JobQueue::Pointer job_pointer); - // Transfers the ownership of `raw_attempt` to the caller. + // Transfers the ownership of `raw_slot` to the caller. + std::unique_ptr ExtractTcpBasedAttemptSlot( + TcpBasedAttemptSlot* raw_slot); + + // Transfers the ownership of `raw_attempt` to the caller. If `rv` is OK, also + // removes the corresponding slot from `tcp_based_attempt_slots_`. std::unique_ptr ExtractTcpBasedAttempt( - TcpBasedAttempt* raw_attempt); + TcpBasedAttempt* raw_attempt, + int rv); void HandleTcpBasedAttemptFailure( std::unique_ptr tcp_based_attempt, @@ -481,7 +524,7 @@ class HttpStreamPool::AttemptManager bool CanUseTcpBasedProtocols(); - bool CanUseQuic(); + bool CanUseQuic() const; bool IsEchEnabled() const; @@ -489,6 +532,8 @@ class HttpStreamPool::AttemptManager // or not attempted. void MaybeMarkQuicBroken(); + base::Value::Dict GetTcpBasedAttemptSlotsAsValue() const; + // Returns true when this can complete. bool CanComplete() const; @@ -504,29 +549,31 @@ class HttpStreamPool::AttemptManager // For trace events. const perfetto::Track track_; + const perfetto::Flow flow_; const base::TimeTicks created_time_; + // Whether the destination is using TLS or not. + const bool is_using_tls_; + // Keeps the initial attempt state. Set when `this` attempts a TCP based // attempt for the first time. std::optional initial_attempt_state_; - NextProtoSet allowed_alpns_ = NextProtoSet::All(); + // List of allowed protocols. Excludes protocols when, e.g., one protocol or + // another is marked as broken or is disabled for one or more jobs. Never + // includes NextProto::kProtoUnknown, since that's an alias for any protocol. + NextProtoSet allowed_alpns_; // Holds request jobs that are waiting for notifications. JobQueue request_jobs_; // Holds preconnect jobs that are waiting for notifications. - std::set> preconnect_jobs_; - // Holds jobs that are already notified results. We need to keep them to avoid - // dangling pointers. - std::set> notified_jobs_; + PreconnectJobs preconnect_jobs_; base::flat_set> limit_ignoring_jobs_; base::flat_set> ip_based_pooling_disabling_jobs_; - base::flat_set> alternative_service_disabling_jobs_; - std::unique_ptr service_endpoint_request_; bool service_endpoint_request_finished_ = false; @@ -563,10 +610,8 @@ class HttpStreamPool::AttemptManager // from the newest job. std::optional base_ssl_config_; - std::set, base::UniquePtrComparator> - tcp_based_attempts_; - // The number of in-flight TCP based attempts that are treated as slow. - size_t slow_tcp_based_attempt_count_ = 0; + std::set, base::UniquePtrComparator> + tcp_based_attempt_slots_; base::OneShotTimer spdy_throttle_timer_; bool spdy_throttle_delay_passed_ = false; @@ -587,6 +632,16 @@ class HttpStreamPool::AttemptManager // Set when `quic_attempt_` is completed. std::optional quic_attempt_result_; + // Whether the host has previously been observed to support SPDY. Populated as + // needed, from HttpServerProperties. Set to false (without updating + // HttpServerProperties) if an HTTP/1.x connection is established. + // + // Mutable because setting it does not actually modify AttemptManager state, + // and it's read/population from methods that are otherwise const. + // + // To check the value, call SupportsSpdy(), which will populate it if needed. + mutable std::optional supports_spdy_; + // The delay for TCP based stream attempts in favor of QUIC. base::TimeDelta tcp_based_attempt_delay_; // Set to true when TCP based attempts should be blocked. diff --git a/naiveproxy/src/net/http/http_stream_pool_group.cc b/naiveproxy/src/net/http/http_stream_pool_group.cc index 2ce7086b6f..087f55bd64 100644 --- a/naiveproxy/src/net/http/http_stream_pool_group.cc +++ b/naiveproxy/src/net/http/http_stream_pool_group.cc @@ -5,6 +5,7 @@ #include "net/http/http_stream_pool_group.h" #include "base/task/sequenced_task_runner.h" +#include "base/trace_event/trace_id_helper.h" #include "base/types/expected.h" #include "net/base/completion_once_callback.h" #include "net/base/load_timing_info.h" @@ -91,7 +92,12 @@ HttpStreamPool::Group::Group( force_quic_( http_network_session()->ShouldForceQuic(stream_key_.destination(), ProxyInfo::Direct(), - /*is_websocket=*/false)) { + /*is_websocket=*/false)), + track_("HttpStreamPool::Group"), + flow_(perfetto::Flow::ProcessScoped( + base::trace_event::GetNextGlobalTraceId())) { + TRACE_EVENT_INSTANT("net.stream", "Group::Group", track_, flow_, + "destination", stream_key_.destination().Serialize()); net_log_.BeginEvent(NetLogEventType::HTTP_STREAM_POOL_GROUP_ALIVE, [&] { base::Value::Dict dict; dict.Set("stream_key", stream_key_.ToValue()); @@ -104,6 +110,7 @@ HttpStreamPool::Group::~Group() { // TODO(crbug.com/346835898): Ensure `pool_`'s total active stream counts // are consistent. net_log_.EndEvent(NetLogEventType::HTTP_STREAM_POOL_GROUP_ALIVE); + TRACE_EVENT_INSTANT("net.stream", "Group::~Group", track_, flow_); } std::unique_ptr HttpStreamPool::Group::CreateJob( @@ -115,15 +122,6 @@ std::unique_ptr HttpStreamPool::Group::CreateJob( expected_protocol, request_net_log); } -void HttpStreamPool::Group::OnJobComplete(Job* job) { - if (attempt_manager_) { - attempt_manager_->OnJobComplete(job); - // `this` may be deleted. - } else { - MaybeComplete(); - } -} - std::unique_ptr HttpStreamPool::Group::CreateHandle( std::unique_ptr socket, StreamSocketHandle::SocketReuseType reuse_type, @@ -131,6 +129,9 @@ std::unique_ptr HttpStreamPool::Group::CreateHandle( ++handed_out_stream_count_; pool_->IncrementTotalHandedOutStreamCount(); + TRACE_EVENT_INSTANT("net.stream", "Group::CreateHandle", track_, flow_, + "negotiated_protocol", socket->GetNegotiatedProtocol(), + "handed_out_stream_count", handed_out_stream_count_); net_log_.AddEvent(NetLogEventType::HTTP_STREAM_POOL_GROUP_HANDLE_CREATED, [&] { base::Value::Dict dict; @@ -178,6 +179,10 @@ void HttpStreamPool::Group::ReleaseStreamSocket( reusable = true; } + TRACE_EVENT_INSTANT("net.stream", "Group::ReleaseStreamSocket", track_, flow_, + "reusable", reusable, "handed_out_stream_count", + handed_out_stream_count_); + if (reusable) { AddIdleStreamSocket(std::move(socket)); } else { @@ -197,6 +202,10 @@ void HttpStreamPool::Group::AddIdleStreamSocket( idle_stream_sockets_.emplace_back(std::move(socket), base::TimeTicks::Now()); pool_->IncrementTotalIdleStreamCount(); CleanupIdleStreamSockets(CleanupMode::kTimeoutOnly, kIdleTimeLimitExpired); + + TRACE_EVENT_INSTANT("net.stream", "Group::AddIdleStreamSocket", track_, flow_, + "idle_stream_count", idle_stream_sockets_.size()); + ProcessPendingRequest(); } @@ -237,6 +246,9 @@ std::unique_ptr HttpStreamPool::Group::GetIdleStreamSocket() { idle_stream_sockets_.erase(idle_it); pool_->DecrementTotalIdleStreamCount(); + TRACE_EVENT_INSTANT("net.stream", "Group::GetIdleStreamSocket", track_, flow_, + "idle_stream_count", idle_stream_sockets_.size()); + return stream_socket; } @@ -264,7 +276,7 @@ bool HttpStreamPool::Group::CloseOneIdleStreamSocket() { } size_t HttpStreamPool::Group::ConnectingStreamSocketCount() const { - return attempt_manager_ ? attempt_manager_->TcpBasedAttemptCount() : 0; + return attempt_manager_ ? attempt_manager_->TcpBasedAttemptSlotCount() : 0; } size_t HttpStreamPool::Group::ActiveStreamSocketCount() const { @@ -292,11 +304,14 @@ void HttpStreamPool::Group::FlushWithError( StreamSocketCloseReason attempt_cancel_reason, std::string_view net_log_close_reason_utf8) { Refresh(net_log_close_reason_utf8, attempt_cancel_reason); - CancelJobs(error); + CancelJobs(error, attempt_cancel_reason); } void HttpStreamPool::Group::Refresh(std::string_view net_log_close_reason_utf8, StreamSocketCloseReason cancel_reason) { + TRACE_EVENT_INSTANT("net.stream", "Group::Refresh", track_, flow_, + "cancel_reason", static_cast(cancel_reason)); + ++generation_; if (attempt_manager_) { attempt_manager_->CancelTcpBasedAttempts(cancel_reason); @@ -309,9 +324,12 @@ void HttpStreamPool::Group::CloseIdleStreams( CleanupIdleStreamSockets(CleanupMode::kForce, net_log_close_reason_utf8); } -void HttpStreamPool::Group::CancelJobs(int error) { +void HttpStreamPool::Group::CancelJobs(int error, + StreamSocketCloseReason cancel_reason) { + TRACE_EVENT_INSTANT("net.stream", "Group::CancelJobs", track_, flow_, + "cancel_reason", static_cast(cancel_reason)); if (attempt_manager_) { - attempt_manager_->CancelJobs(error); + attempt_manager_->CancelJobs(error, cancel_reason); } } @@ -434,7 +452,8 @@ void HttpStreamPool::Group::MaybeComplete() { void HttpStreamPool::Group::MaybeCompleteLater() { if (CanComplete()) { - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + // Use IDLE priority since completing group is not urgent. + TaskRunner(IDLE)->PostTask( FROM_HERE, base::BindOnce(&Group::MaybeComplete, weak_ptr_factory_.GetWeakPtr())); } diff --git a/naiveproxy/src/net/http/http_stream_pool_group.h b/naiveproxy/src/net/http/http_stream_pool_group.h index 71e7fdc6f3..51fd3cdbfb 100644 --- a/naiveproxy/src/net/http/http_stream_pool_group.h +++ b/naiveproxy/src/net/http/http_stream_pool_group.h @@ -14,6 +14,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" +#include "base/trace_event/trace_event.h" #include "base/types/expected.h" #include "net/base/load_timing_info.h" #include "net/base/net_export.h" @@ -92,6 +93,9 @@ class HttpStreamPool::Group { bool force_quic() const { return force_quic_; } + const perfetto::Track& track() const { return track_; } + const perfetto::Flow& flow() const { return flow_; } + // Creates a Job to attempt connection(s). We have separate methods for // creating and starting a Job to ensure that the owner of the Job can // properly manage the lifetime of the Job, even when StartJob() synchronously @@ -173,7 +177,7 @@ class HttpStreamPool::Group { void CloseIdleStreams(std::string_view net_log_close_reason_utf8); // Cancels all on-going jobs. - void CancelJobs(int error); + void CancelJobs(int error, StreamSocketCloseReason cancel_reason); // Returns an active AttemptManager for `job`. AttemptManager* GetAttemptManagerForJob(Job* job); @@ -234,6 +238,8 @@ class HttpStreamPool::Group { const QuicSessionAliasKey quic_session_alias_key_; const NetLogWithSource net_log_; const bool force_quic_; + const perfetto::NamedTrack track_; + const perfetto::Flow flow_; size_t handed_out_stream_count_ = 0; int64_t generation_ = 0; diff --git a/naiveproxy/src/net/http/http_stream_pool_ip_endpoint_state_tracker.cc b/naiveproxy/src/net/http/http_stream_pool_ip_endpoint_state_tracker.cc index 1ab9f41981..d560ca9fd8 100644 --- a/naiveproxy/src/net/http/http_stream_pool_ip_endpoint_state_tracker.cc +++ b/naiveproxy/src/net/http/http_stream_pool_ip_endpoint_state_tracker.cc @@ -63,8 +63,7 @@ void HttpStreamPool::IPEndPointStateTracker::RemoveSlowAttemptingEndpoint() { } std::optional -HttpStreamPool::IPEndPointStateTracker::GetIPEndPointToAttemptTcpBased( - std::optional exclude_ip_endpoint) { +HttpStreamPool::IPEndPointStateTracker::GetIPEndPointToAttemptTcpBased() { // TODO(crbug.com/383824591): Add a trace event to see if this method is // time consuming. @@ -90,8 +89,7 @@ HttpStreamPool::IPEndPointStateTracker::GetIPEndPointToAttemptTcpBased( const std::vector& ip_endpoints = ip_v6 ? service_endpoint.ipv6_endpoints : service_endpoint.ipv4_endpoints; - FindBetterIPEndPoint(ip_endpoints, exclude_ip_endpoint, current_state, - current_endpoint); + FindBetterIPEndPoint(ip_endpoints, current_state, current_endpoint); if (current_endpoint.has_value() && !current_state.has_value()) { // This endpoint is fast or no connection attempt has been made to // it yet. @@ -106,15 +104,9 @@ HttpStreamPool::IPEndPointStateTracker::GetIPEndPointToAttemptTcpBased( void HttpStreamPool::IPEndPointStateTracker::FindBetterIPEndPoint( const std::vector& ip_endpoints, - std::optional exclude_ip_endpoint, std::optional& current_state, std::optional& current_endpoint) { for (const auto& ip_endpoint : ip_endpoints) { - if (exclude_ip_endpoint.has_value() && - ip_endpoint == *exclude_ip_endpoint) { - continue; - } - auto it = ip_endpoint_states_.find(ip_endpoint); if (it == ip_endpoint_states_.end()) { // If there is no state for the IP endpoint it means that we haven't tried diff --git a/naiveproxy/src/net/http/http_stream_pool_ip_endpoint_state_tracker.h b/naiveproxy/src/net/http/http_stream_pool_ip_endpoint_state_tracker.h index b991627b1e..04c6279221 100644 --- a/naiveproxy/src/net/http/http_stream_pool_ip_endpoint_state_tracker.h +++ b/naiveproxy/src/net/http/http_stream_pool_ip_endpoint_state_tracker.h @@ -90,22 +90,20 @@ class HttpStreamPool::IPEndPointStateTracker { // Removes all slow attempting endpoints. void RemoveSlowAttemptingEndpoint(); - // Returns an IPEndPoint to attempt a connection. If `exclude_ip_endpoint` is - // given, exclude the endpoint. Brief summary of the behavior are: + // Returns an IPEndPoint to attempt a connection. + // Brief summary of the behavior is: // * Try preferred address family first. // * Prioritize unattempted or fast endpoints. // * Fall back to slow but succeeded endpoints. // * Use slow and attempting endpoints as the last option. // * For a slow endpoint, skip the endpoint if there are enough attempts for // the endpoint. - std::optional GetIPEndPointToAttemptTcpBased( - std::optional exclude_ip_endpoint = std::nullopt); + std::optional GetIPEndPointToAttemptTcpBased(); base::Value::List GetInfoAsValue() const; private: void FindBetterIPEndPoint(const std::vector& ip_endpoints, - std::optional exclude_ip_endpoint, std::optional& current_state, std::optional& current_endpoint); diff --git a/naiveproxy/src/net/http/http_stream_pool_job.cc b/naiveproxy/src/net/http/http_stream_pool_job.cc index 477756d025..0fae4e388c 100644 --- a/naiveproxy/src/net/http/http_stream_pool_job.cc +++ b/naiveproxy/src/net/http/http_stream_pool_job.cc @@ -5,6 +5,7 @@ #include "net/http/http_stream_pool_job.h" #include +#include #include #include "base/memory/raw_ptr.h" @@ -15,6 +16,7 @@ #include "net/base/net_error_details.h" #include "net/base/net_errors.h" #include "net/base/net_export.h" +#include "net/base/request_priority.h" #include "net/dns/public/resolve_error_info.h" #include "net/http/http_network_session.h" #include "net/http/http_stream_pool.h" @@ -44,16 +46,26 @@ NextProtoSet CalculateAllowedAlpns(HttpStreamPool::Job::Delegate* delegate, } NextProtoSet allowed_alpns = expected_protocol == NextProto::kProtoUnknown - ? NextProtoSet::All() + ? HttpStreamPool::kAllProtocols : NextProtoSet({expected_protocol}); allowed_alpns = Intersection(allowed_alpns, delegate->allowed_alpns()); - if (!group->pool()->CanUseQuic( + // Remove QUIC from the list if QUIC cannot be used for some reason. + // + // Note that this does not check RequiresHTTP11(), as despite its name, it + // only means H2 is not allowed. + // + // Inlining this logic instead of calling HttpStreamPool::CanUseQuic() is an + // optimization, to avoid the extra ShouldForceQuic() call. + if (!group->http_network_session()->IsQuicEnabled() || + !delegate->enable_alternative_services() || + !GURL::SchemeIsCryptographic( + group->stream_key().destination().scheme()) || + group->pool()->IsQuicBroken( group->stream_key().destination(), - group->stream_key().network_anonymization_key(), - delegate->enable_alternative_services())) { - allowed_alpns.Remove(NextProto::kProtoQUIC); + group->stream_key().network_anonymization_key())) { + allowed_alpns.RemoveAll(HttpStreamPool::kQuicBasedProtocols); } CHECK(!allowed_alpns.empty()); @@ -115,42 +127,10 @@ HttpStreamPool::Job::Job(Delegate* delegate, } HttpStreamPool::Job::~Job() { - CHECK(attempt_manager_); - - // Record histograms only when `this` has a result. If `this` doesn't have a - // result that means JobController destroyed `this` since another job - // completed. - if (result_.has_value()) { - constexpr std::string_view kCompleteTimeHistogramName = - "Net.HttpStreamPool.JobCompleteTime3."; - base::TimeDelta complete_time = base::TimeTicks::Now() - create_time_; - if (*result_ == OK) { - const std::string_view protocol = NegotiatedProtocolToHistogramSuffix( - negotiated_protocol_.value_or(NextProto::kProtoUnknown)); - base::UmaHistogramLongTimes100( - base::StrCat({kCompleteTimeHistogramName, protocol}), complete_time); - } else { - base::UmaHistogramLongTimes100( - base::StrCat({kCompleteTimeHistogramName, "Failure"}), complete_time); - base::UmaHistogramSparse("Net.HttpStreamPool.JobErrorCode", -*result_); - } + if (attempt_manager_) { + attempt_manager_->OnJobCancelled(this); + OnDone(std::nullopt); } - - job_net_log_.EndEvent(NetLogEventType::HTTP_STREAM_POOL_JOB_ALIVE, [&] { - base::Value::Dict dict; - if (result_.has_value()) { - // Use "net_error" for the result as the NetLog viewer converts the value - // to a human-readable string. - dict.Set("net_error", *result_); - } - if (negotiated_protocol_.has_value()) { - dict.Set("negotiated_protocol", NextProtoToString(*negotiated_protocol_)); - } - return dict; - }); - - // `attempt_manager_` may be deleted after this call. - attempt_manager_.ExtractAsDangling()->OnJobComplete(this); } void HttpStreamPool::Job::Start() { @@ -188,14 +168,23 @@ void HttpStreamPool::Job::AddConnectionAttempts( } } -void HttpStreamPool::Job::OnStreamReady(std::unique_ptr stream, - NextProto negotiated_protocol) { +void HttpStreamPool::Job::OnStreamReady( + std::unique_ptr stream, + NextProto negotiated_protocol, + std::optional session_source) { CHECK(delegate_); CHECK(!result_.has_value()); CHECK(!negotiated_protocol_); CHECK(attempt_manager_); - if (!allowed_alpns_.Has(negotiated_protocol)) { + // `allowed_alpns_` never includes kProtoUnknown, which when making a request, + // can mean "any protocol", but when receiving a response means "not H2 and + // not H3", thus implying H1 (or some other protocol), so when comparing the + // protocol of the received stream, replace kProtoUnknown with kProtoHTTP11. + NextProto logical_protocol = (negotiated_protocol != NextProto::kProtoUnknown + ? negotiated_protocol + : NextProto::kProtoHTTP11); + if (!allowed_alpns_.Has(logical_protocol)) { OnStreamFailed(ERR_ALPN_NEGOTIATION_FAILED, NetErrorDetails(), ResolveErrorInfo()); return; @@ -206,7 +195,9 @@ void HttpStreamPool::Job::OnStreamReady(std::unique_ptr stream, ->http_network_session() ->proxy_resolution_service() ->ReportSuccess(delegate_->proxy_info()); - delegate_->OnStreamReady(this, std::move(stream), negotiated_protocol); + OnDone(OK); + delegate_->OnStreamReady(this, std::move(stream), negotiated_protocol, + session_source); } void HttpStreamPool::Job::OnStreamFailed( @@ -215,7 +206,7 @@ void HttpStreamPool::Job::OnStreamFailed( ResolveErrorInfo resolve_error_info) { CHECK(delegate_); CHECK(!result_.has_value()); - result_ = status; + OnDone(status); delegate_->OnStreamFailed(this, status, net_error_details, resolve_error_info); } @@ -224,28 +215,69 @@ void HttpStreamPool::Job::OnCertificateError(int status, const SSLInfo& ssl_info) { CHECK(delegate_); CHECK(!result_.has_value()); - result_ = status; + OnDone(status); delegate_->OnCertificateError(this, status, ssl_info); } void HttpStreamPool::Job::OnNeedsClientAuth(SSLCertRequestInfo* cert_info) { CHECK(delegate_); CHECK(!result_.has_value()); - result_ = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; + OnDone(ERR_SSL_CLIENT_AUTH_CERT_NEEDED); delegate_->OnNeedsClientAuth(this, cert_info); } void HttpStreamPool::Job::OnPreconnectComplete(int status) { CHECK(delegate_); CHECK(!result_.has_value()); - result_ = status; + OnDone(status); delegate_->OnPreconnectComplete(this, status); } void HttpStreamPool::Job::CallOnPreconnectCompleteLater(int status) { - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + // Currently the notification is only used for testing so using IDLE priority. + TaskRunner(IDLE)->PostTask( FROM_HERE, base::BindOnce(&Job::OnPreconnectComplete, weak_ptr_factory_.GetWeakPtr(), status)); } +void HttpStreamPool::Job::OnDone(std::optional result) { + CHECK(attempt_manager_); + attempt_manager_ = nullptr; + + result_ = result; + + // Record histograms only when `this` has a result. If `this` doesn't have a + // result that means JobController destroyed `this` since another job + // completed. + if (result_.has_value()) { + constexpr std::string_view kCompleteTimeHistogramName = + "Net.HttpStreamPool.JobCompleteTime4."; + base::TimeDelta complete_time = base::TimeTicks::Now() - create_time_; + if (*result_ == OK) { + const std::string_view protocol = + NegotiatedProtocolToHistogramSuffixCoalesced( + negotiated_protocol_.value_or(NextProto::kProtoUnknown)); + base::UmaHistogramLongTimes100( + base::StrCat({kCompleteTimeHistogramName, protocol}), complete_time); + } else { + base::UmaHistogramLongTimes100( + base::StrCat({kCompleteTimeHistogramName, "Failure"}), complete_time); + base::UmaHistogramSparse("Net.HttpStreamPool.JobErrorCode", -*result_); + } + } + + job_net_log_.EndEvent(NetLogEventType::HTTP_STREAM_POOL_JOB_ALIVE, [&] { + base::Value::Dict dict; + if (result_.has_value()) { + // Use "net_error" for the result as the NetLog viewer converts the value + // to a human-readable string. + dict.Set("net_error", *result_); + } + if (negotiated_protocol_.has_value()) { + dict.Set("negotiated_protocol", NextProtoToString(*negotiated_protocol_)); + } + return dict; + }); +} + } // namespace net diff --git a/naiveproxy/src/net/http/http_stream_pool_job.h b/naiveproxy/src/net/http/http_stream_pool_job.h index de9867ffa6..e922f3eff7 100644 --- a/naiveproxy/src/net/http/http_stream_pool_job.h +++ b/naiveproxy/src/net/http/http_stream_pool_job.h @@ -6,11 +6,13 @@ #define NET_HTTP_HTTP_STREAM_POOL_JOB_H_ #include +#include #include #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" +#include "net/base/load_timing_internal_info.h" #include "net/base/net_error_details.h" #include "net/base/net_export.h" #include "net/dns/public/resolve_error_info.h" @@ -63,11 +65,14 @@ class HttpStreamPool::Job { virtual const NetLogWithSource& net_log() const = 0; + virtual const perfetto::Flow& flow() const = 0; + // Callback methods: Only one of these methods will be called. // Called when a stream is ready. virtual void OnStreamReady(Job* job, std::unique_ptr stream, - NextProto negotiated_protocol) = 0; + NextProto negotiated_protocol, + std::optional session_source) = 0; // Called when stream attempts failed. virtual void OnStreamFailed(Job* job, int status, @@ -85,7 +90,10 @@ class HttpStreamPool::Job { }; // `delegate` must outlive `this`. For a stream request, `num_streams` must - // not be specified. For a preconnect, `num_streams` must be specified. + // not be specified. `group` must not be destroyed until either it has + // notified the Job of completion, or `this` has informed the Group's + // AttemptManager of cancellation. For a preconnect, `num_streams` must be + // specified. Job(Delegate* delegate, JobType type, Group* group, @@ -112,7 +120,8 @@ class HttpStreamPool::Job { // Called by the associated AttemptManager when a stream is ready. void OnStreamReady(std::unique_ptr stream, - NextProto negotiated_protocol); + NextProto negotiated_protocol, + std::optional session_source); // Called by the associated AttemptManager when stream attempts failed. void OnStreamFailed(int rv, @@ -143,10 +152,6 @@ class HttpStreamPool::Job { return delegate_->enable_ip_based_pooling_for_h2(); } - bool enable_alternative_services() const { - return delegate_->enable_alternative_services(); - } - const ProxyInfo& proxy_info() const { return delegate_->proxy_info(); } const std::vector& allowed_bad_certs() const { @@ -161,6 +166,8 @@ class HttpStreamPool::Job { const NetLogWithSource& request_net_log() const { return request_net_log_; } + const perfetto::Flow& flow() const { return delegate_->flow(); } + quic::ParsedQuicVersion quic_version() const { return quic_version_; } const NextProtoSet& allowed_alpns() const { return allowed_alpns_; } @@ -169,6 +176,8 @@ class HttpStreamPool::Job { JobType type() const { return type_; } + bool is_preconnect() const { return type_ != JobType::kRequest; } + const ConnectionAttempts& connection_attempts() const { return connection_attempts_; } @@ -176,8 +185,17 @@ class HttpStreamPool::Job { base::TimeTicks create_time() const { return create_time_; } private: + // Called when job is cancelled or completes. Sets `result_` (which is + // currently nullopt on cancelletation - should it be ERR_ABORTED instead?). + // Clears `attempt_manager_`. On cancellation, The AttemptManager must already + // have been notified of cancellation. + void OnDone(std::optional result); + const raw_ptr delegate_; const JobType type_; + + // The AttemptManager associated with `this`. Once `this` has been notified of + // success or failure, replaced with nullptr. raw_ptr attempt_manager_; const quic::ParsedQuicVersion quic_version_; diff --git a/naiveproxy/src/net/http/http_stream_pool_job_controller.cc b/naiveproxy/src/net/http/http_stream_pool_job_controller.cc index 2d8c93a5eb..01f5369cd9 100644 --- a/naiveproxy/src/net/http/http_stream_pool_job_controller.cc +++ b/naiveproxy/src/net/http/http_stream_pool_job_controller.cc @@ -9,12 +9,15 @@ #include #include "base/memory/raw_ptr.h" +#include "base/metrics/histogram_functions.h" #include "base/notreached.h" +#include "base/strings/strcat.h" #include "base/task/sequenced_task_runner.h" #include "base/time/time.h" #include "base/values.h" #include "net/base/load_flags.h" #include "net/base/load_states.h" +#include "net/base/load_timing_internal_info.h" #include "net/base/net_error_details.h" #include "net/base/net_errors.h" #include "net/base/port_util.h" @@ -29,6 +32,7 @@ #include "net/http/http_stream_pool_request_info.h" #include "net/http/http_stream_request.h" #include "net/log/net_log_event_type.h" +#include "net/log/net_log_util.h" #include "net/log/net_log_with_source.h" #include "net/quic/quic_chromium_client_session.h" #include "net/quic/quic_http_stream.h" @@ -42,12 +46,21 @@ namespace net { -HttpStreamPool::JobController::StreamWithProtocol::StreamWithProtocol( +HttpStreamPool::JobController::PendingStream::PendingStream( std::unique_ptr stream, - NextProto negotiated_protocol) - : stream(std::move(stream)), negotiated_protocol(negotiated_protocol) {} + NextProto negotiated_protocol, + std::optional session_source) + : stream(std::move(stream)), + negotiated_protocol(negotiated_protocol), + session_source(session_source) {} -HttpStreamPool::JobController::StreamWithProtocol::~StreamWithProtocol() = +HttpStreamPool::JobController::PendingStream::PendingStream(PendingStream&&) = + default; + +HttpStreamPool::JobController::PendingStream::~PendingStream() = default; + +HttpStreamPool::JobController::PendingStream& +HttpStreamPool::JobController::PendingStream::operator=(PendingStream&&) = default; // static @@ -116,6 +129,7 @@ HttpStreamPool::JobController::JobController( allowed_alpns_(request_info.allowed_alpns), proxy_info_(request_info.proxy_info), alternative_service_info_(request_info.alternative_service_info), + advertised_alt_svc_state_(request_info.advertised_alt_svc_state), origin_stream_key_(request_info.destination, request_info.privacy_mode, request_info.socket_tag, @@ -128,7 +142,10 @@ HttpStreamPool::JobController::JobController( request_info, enable_alternative_services_)), net_log_(request_info.factory_job_controller_net_log), + flow_(NetLogWithSourceToFlow(net_log_)), created_time_(base::TimeTicks::Now()) { + TRACE_EVENT("net.stream", "JobController::JobController", flow_, + "destination", request_info.destination.Serialize()); net_log_.BeginEvent( NetLogEventType::HTTP_STREAM_POOL_JOB_CONTROLLER_ALIVE, [&] { base::Value::Dict dict; @@ -154,6 +171,7 @@ HttpStreamPool::JobController::JobController( HttpStreamPool::JobController::~JobController() { net_log_.EndEvent(NetLogEventType::HTTP_STREAM_POOL_JOB_CONTROLLER_ALIVE); + TRACE_EVENT("net.stream", "JobController::~JobController", flow_); } void HttpStreamPool::JobController::HandleStreamRequest( @@ -162,6 +180,7 @@ void HttpStreamPool::JobController::HandleStreamRequest( CHECK(stream_request); CHECK(!delegate_); CHECK(!stream_request_); + TRACE_EVENT("net.stream", "JobController::HandleStreamRequest", flow_); stream_request->SetHelperForSwitchingToPool(this); delegate_ = delegate; @@ -173,7 +192,7 @@ void HttpStreamPool::JobController::HandleStreamRequest( if (!IsPortAllowedForScheme(origin_stream_key_.destination().port(), origin_stream_key_.destination().scheme())) { - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + TaskRunner(priority_)->PostTask( FROM_HERE, base::BindOnce(&HttpStreamPool::JobController::CallOnStreamFailed, weak_ptr_factory_.GetWeakPtr(), ERR_UNSAFE_PORT, @@ -181,19 +200,22 @@ void HttpStreamPool::JobController::HandleStreamRequest( return; } - auto stream_with_protocol = MaybeCreateStreamFromExistingSession(); - if (stream_with_protocol) { - if (stream_with_protocol->negotiated_protocol != NextProto::kProtoQUIC && + pending_stream_ = MaybeCreateStreamFromExistingSession(); + if (pending_stream_) { + TRACE_EVENT("net.stream", "JobController::CreateStreamFromExistingSession", + "negotiated_protocol", pending_stream_->negotiated_protocol); + + if (pending_stream_->negotiated_protocol != NextProto::kProtoQUIC && origin_quic_version_.IsKnown()) { StartAltSvcQuicPreconnect(); } - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + CHECK(!stream_ready_time_.has_value()); + stream_ready_time_ = base::TimeTicks::Now(); + TaskRunner(priority_)->PostTask( FROM_HERE, base::BindOnce( &HttpStreamPool::JobController::CallRequestCompleteAndStreamReady, - weak_ptr_factory_.GetWeakPtr(), - std::move(stream_with_protocol->stream), - stream_with_protocol->negotiated_protocol)); + weak_ptr_factory_.GetWeakPtr())); return; } @@ -216,6 +238,8 @@ void HttpStreamPool::JobController::HandleStreamRequest( int HttpStreamPool::JobController::Preconnect( size_t num_streams, CompletionOnceCallback callback) { + TRACE_EVENT("net.stream", "JobController::Preconnect", flow_); + num_streams = std::min(kDefaultMaxStreamSocketsPerGroup, num_streams); if (!IsPortAllowedForScheme(origin_stream_key_.destination().port(), @@ -306,19 +330,37 @@ const NetLogWithSource& HttpStreamPool::JobController::net_log() const { return net_log_; } +const perfetto::Flow& HttpStreamPool::JobController::flow() const { + return flow_; +} + void HttpStreamPool::JobController::OnStreamReady( Job* job, std::unique_ptr stream, - NextProto negotiated_protocol) { + NextProto negotiated_protocol, + std::optional session_source) { + TRACE_EVENT("net.stream", "JobController::OnStreamReady", flow_); + SetJobResult(job, OK); + + // If there's already a `pending_stream_` or the callback has already been + // invoked, nothing more to do. + if (pending_stream_) { + return; + } + + pending_stream_.emplace(std::move(stream), negotiated_protocol, + session_source); + CHECK(!stream_ready_time_.has_value()); + stream_ready_time_ = base::TimeTicks::Now(); + // Use PostTask to align the behavior with HttpStreamFactory::Job, see // https://crrev.com/2827533002. // TODO(crbug.com/346835898): Avoid using PostTask here if possible. - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + TaskRunner(priority_)->PostTask( FROM_HERE, base::BindOnce(&JobController::CallRequestCompleteAndStreamReady, - weak_ptr_factory_.GetWeakPtr(), std::move(stream), - negotiated_protocol)); + weak_ptr_factory_.GetWeakPtr())); } void HttpStreamPool::JobController::OnStreamFailed( @@ -326,13 +368,16 @@ void HttpStreamPool::JobController::OnStreamFailed( int status, const NetErrorDetails& net_error_details, ResolveErrorInfo resolve_error_info) { + TRACE_EVENT("net.stream", "JobController::OnStreamFailed", flow_, "result", + status); + stream_request_->AddConnectionAttempts(job->connection_attempts()); SetJobResult(job, status); if (AllJobsFinished()) { // Use PostTask to align the behavior with HttpStreamFactory::Job, see // https://crrev.com/2827533002. // TODO(crbug.com/346835898): Avoid using PostTask here if possible. - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + TaskRunner(priority_)->PostTask( FROM_HERE, base::BindOnce(&JobController::CallOnStreamFailed, weak_ptr_factory_.GetWeakPtr(), status, @@ -344,12 +389,15 @@ void HttpStreamPool::JobController::OnCertificateError( Job* job, int status, const SSLInfo& ssl_info) { + TRACE_EVENT("net.stream", "JobController::OnCertificateError", flow_, + "result", status); + stream_request_->AddConnectionAttempts(job->connection_attempts()); CancelOtherJob(job); // Use PostTask to align the behavior with HttpStreamFactory::Job, see // https://crrev.com/2827533002. // TODO(crbug.com/346835898): Avoid using PostTask here if possible. - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + TaskRunner(priority_)->PostTask( FROM_HERE, base::BindOnce(&JobController::CallOnCertificateError, weak_ptr_factory_.GetWeakPtr(), status, ssl_info)); @@ -358,19 +406,23 @@ void HttpStreamPool::JobController::OnCertificateError( void HttpStreamPool::JobController::OnNeedsClientAuth( Job* job, SSLCertRequestInfo* cert_info) { + TRACE_EVENT("net.stream", "JobController::OnNeedsClientAuth", flow_); + stream_request_->AddConnectionAttempts(job->connection_attempts()); CancelOtherJob(job); // Use PostTask to align the behavior with HttpStreamFactory::Job, see // https://crrev.com/2827533002. // TODO(crbug.com/346835898): Avoid using PostTask here if possible. - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + TaskRunner(priority_)->PostTask( FROM_HERE, base::BindOnce(&JobController::CallOnNeedsClientAuth, weak_ptr_factory_.GetWeakPtr(), base::RetainedRef(cert_info))); } void HttpStreamPool::JobController::OnPreconnectComplete(Job* job, int status) { - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + TRACE_EVENT("net.stream", "JobController::OnPreconnectComplete", flow_, + "result", status); + TaskRunner(priority_)->PostTask( FROM_HERE, base::BindOnce(&JobController::ResetJobAndInvokePreconnectCallback, weak_ptr_factory_.GetWeakPtr(), job, status)); @@ -436,7 +488,7 @@ SpdySessionPool* HttpStreamPool::JobController::spdy_session_pool() { return pool_->http_network_session()->spdy_session_pool(); } -std::optional +std::optional HttpStreamPool::JobController::MaybeCreateStreamFromExistingSession() { // Check QUIC session first. std::unique_ptr quic_http_stream = @@ -445,8 +497,9 @@ HttpStreamPool::JobController::MaybeCreateStreamFromExistingSession() { net_log_.AddEvent( NetLogEventType:: HTTP_STREAM_POOL_JOB_CONTROLLER_FOUND_EXISTING_QUIC_SESSION); - return std::optional( - std::in_place, std::move(quic_http_stream), NextProto::kProtoQUIC); + return std::optional( + std::in_place, std::move(quic_http_stream), NextProto::kProtoQUIC, + SessionSource::kExisting); } // Check SPDY session next. @@ -462,8 +515,9 @@ HttpStreamPool::JobController::MaybeCreateStreamFromExistingSession() { auto http_stream = std::make_unique( spdy_session, stream_request_->net_log().source(), spdy_session_pool()->GetDnsAliasesForSessionKey(spdy_session_key)); - return std::optional( - std::in_place, std::move(http_stream), NextProto::kProtoHTTP2); + return std::optional(std::in_place, std::move(http_stream), + NextProto::kProtoHTTP2, + SessionSource::kExisting); } // Check idle HTTP/1.1 stream. @@ -481,8 +535,9 @@ HttpStreamPool::JobController::MaybeCreateStreamFromExistingSession() { origin_group.CreateTextBasedStream(std::move(idle_stream_socket), reuse_type, LoadTimingInfo::ConnectTiming()); - return std::optional( - std::in_place, std::move(http_stream), negotiated_protocol); + return std::optional(std::in_place, std::move(http_stream), + negotiated_protocol, + /*session_source=*/std::nullopt); } return std::nullopt; @@ -566,14 +621,29 @@ void HttpStreamPool::JobController::StartAltSvcQuicPreconnect() { origin_job_->Start(); } -void HttpStreamPool::JobController::CallRequestCompleteAndStreamReady( - std::unique_ptr stream, - NextProto negotiated_protocol) { +void HttpStreamPool::JobController::CallRequestCompleteAndStreamReady() { CHECK(stream_request_); CHECK(delegate_); - stream_request_->Complete(negotiated_protocol, - ALTERNATE_PROTOCOL_USAGE_UNSPECIFIED_REASON); - delegate_->OnStreamReady(proxy_info_, std::move(stream)); + CHECK(pending_stream_); + CHECK(stream_ready_time_.has_value()); + + base::TimeTicks now = base::TimeTicks::Now(); + base::UmaHistogramLongTimes100( + base::StrCat({"Net.HttpStreamPool.JobControllerRequestCompleteTime2.", + NegotiatedProtocolToHistogramSuffixCoalesced( + pending_stream_->negotiated_protocol)}), + now - created_time_); + base::UmaHistogramTimes( + "Net.HttpStreamPool.JobControllerCallRequestCompleteDelay", + now - *stream_ready_time_); + + stream_request_->Complete({ + .negotiated_protocol = pending_stream_->negotiated_protocol, + .alternate_protocol_usage = ALTERNATE_PROTOCOL_USAGE_UNSPECIFIED_REASON, + .session_source = pending_stream_->session_source, + .advertised_alt_svc_state = advertised_alt_svc_state_, + }); + delegate_->OnStreamReady(proxy_info_, std::move(pending_stream_->stream)); } void HttpStreamPool::JobController::CallOnStreamFailed( @@ -600,9 +670,10 @@ void HttpStreamPool::JobController::ResetJobAndInvokePreconnectCallback( int status) { CHECK(!alternative_job_); CHECK_EQ(origin_job_.get(), job); - CHECK(preconnect_callback_); origin_job_.reset(); - std::move(preconnect_callback_).Run(status); + if (preconnect_callback_) { + std::move(preconnect_callback_).Run(status); + } } void HttpStreamPool::JobController::SetJobResult(Job* job, int status) { diff --git a/naiveproxy/src/net/http/http_stream_pool_job_controller.h b/naiveproxy/src/net/http/http_stream_pool_job_controller.h index 5a8d18009d..e7f7d2af80 100644 --- a/naiveproxy/src/net/http/http_stream_pool_job_controller.h +++ b/naiveproxy/src/net/http/http_stream_pool_job_controller.h @@ -12,8 +12,10 @@ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" +#include "base/trace_event/trace_event.h" #include "base/values.h" #include "net/base/load_states.h" +#include "net/base/load_timing_internal_info.h" #include "net/base/network_anonymization_key.h" #include "net/base/request_priority.h" #include "net/dns/public/resolve_error_info.h" @@ -70,9 +72,11 @@ class HttpStreamPool::JobController : public HttpStreamPool::Job::Delegate, NextProtoSet allowed_alpns() const override; const ProxyInfo& proxy_info() const override; const NetLogWithSource& net_log() const override; + const perfetto::Flow& flow() const override; void OnStreamReady(Job* job, std::unique_ptr stream, - NextProto negotiated_protocol) override; + NextProto negotiated_protocol, + std::optional session_source) override; void OnStreamFailed(Job* job, int status, const NetErrorDetails& net_error_details, @@ -101,13 +105,19 @@ class HttpStreamPool::JobController : public HttpStreamPool::Job::Delegate, QuicSessionAliasKey quic_key; }; - struct StreamWithProtocol { - StreamWithProtocol(std::unique_ptr stream, - NextProto negotiated_protocol); - ~StreamWithProtocol(); + // Stream that is ready to be used, along with some associated metadata. + struct PendingStream { + PendingStream(std::unique_ptr stream, + NextProto negotiated_protocol, + std::optional session_source); + PendingStream(PendingStream&&); + ~PendingStream(); + + PendingStream& operator=(PendingStream&&); std::unique_ptr stream; NextProto negotiated_protocol; + std::optional session_source; }; // Calculate an alternative endpoint for the request. @@ -123,7 +133,7 @@ class HttpStreamPool::JobController : public HttpStreamPool::Job::Delegate, // Returns an HttpStream and its negotiated protocol if there is an // existing session or an idle stream that can serve the request. Otherwise, // returns std::nullopt. - std::optional MaybeCreateStreamFromExistingSession(); + std::optional MaybeCreateStreamFromExistingSession(); // When there is a QUIC session that can serve an HttpStream for the request, // creates an HttpStream and returns it. @@ -142,11 +152,10 @@ class HttpStreamPool::JobController : public HttpStreamPool::Job::Delegate, // Alt-Svc but the current request is not using it. void StartAltSvcQuicPreconnect(); - // Calls the request's Complete() and tells the delegate that `stream` is - // ready. Used when there is an existing QUIC/SPDY session that can serve - // the request. - void CallRequestCompleteAndStreamReady(std::unique_ptr stream, - NextProto negotiated_protocol); + // Calls the request's Complete() and tells the delegate that a stream, now + // stored in `pending_stream_`, is ready. Used when there is an existing + // QUIC/SPDY session that can serve the request. + void CallRequestCompleteAndStreamReady(); // Calls the request's stream failed callback. void CallOnStreamFailed(int status, @@ -187,6 +196,7 @@ class HttpStreamPool::JobController : public HttpStreamPool::Job::Delegate, NextProtoSet allowed_alpns_; const ProxyInfo proxy_info_; const AlternativeServiceInfo alternative_service_info_; + const AdvertisedAltSvcState advertised_alt_svc_state_; const HttpStreamKey origin_stream_key_; const QuicSessionAliasKey origin_quic_key_; @@ -196,9 +206,12 @@ class HttpStreamPool::JobController : public HttpStreamPool::Job::Delegate, const std::optional alternative_; const NetLogWithSource net_log_; + const perfetto::Flow flow_; const base::TimeTicks created_time_; + std::optional stream_ready_time_; + // Fields specific to stream request. raw_ptr delegate_; raw_ptr stream_request_; @@ -213,6 +226,13 @@ class HttpStreamPool::JobController : public HttpStreamPool::Job::Delegate, // Set to `OK` when the alternative job is not needed. std::optional alternative_job_result_; + // Populated when a stream is successfully created. Stored as a field rather + // than bound to a callback so that on destruction, the stream is destroyed + // when the controller is. Otherwise, on destruction of the network stack, if + // the HttpStream has any posted asynchronous tasks, they'll trigger a UAF + // when they're run. + std::optional pending_stream_; + base::WeakPtrFactory weak_ptr_factory_{this}; }; diff --git a/naiveproxy/src/net/http/http_stream_pool_request_info.cc b/naiveproxy/src/net/http/http_stream_pool_request_info.cc index fb1688d7cc..4d6ca407ec 100644 --- a/naiveproxy/src/net/http/http_stream_pool_request_info.cc +++ b/naiveproxy/src/net/http/http_stream_pool_request_info.cc @@ -24,6 +24,7 @@ HttpStreamPoolRequestInfo::HttpStreamPoolRequestInfo( SecureDnsPolicy secure_dns_policy, bool disable_cert_network_fetches, AlternativeServiceInfo alternative_service_info, + AdvertisedAltSvcState advertised_alt_svc_state, NextProtoSet allowed_alpns, int load_flags, ProxyInfo proxy_info, @@ -37,6 +38,7 @@ HttpStreamPoolRequestInfo::HttpStreamPoolRequestInfo( secure_dns_policy(secure_dns_policy), disable_cert_network_fetches(disable_cert_network_fetches), alternative_service_info(std::move(alternative_service_info)), + advertised_alt_svc_state(advertised_alt_svc_state), allowed_alpns(allowed_alpns), load_flags(load_flags), proxy_info(std::move(proxy_info)), diff --git a/naiveproxy/src/net/http/http_stream_pool_request_info.h b/naiveproxy/src/net/http/http_stream_pool_request_info.h index 8ec644536e..66afcad969 100644 --- a/naiveproxy/src/net/http/http_stream_pool_request_info.h +++ b/naiveproxy/src/net/http/http_stream_pool_request_info.h @@ -9,6 +9,7 @@ #include "net/base/network_anonymization_key.h" #include "net/base/privacy_mode.h" #include "net/dns/public/secure_dns_policy.h" +#include "net/http/alternate_protocol_usage.h" #include "net/http/alternative_service.h" #include "net/log/net_log_with_source.h" #include "net/proxy_resolution/proxy_info.h" @@ -27,6 +28,7 @@ struct NET_EXPORT_PRIVATE HttpStreamPoolRequestInfo { SecureDnsPolicy secure_dns_policy, bool disable_cert_network_fetches, AlternativeServiceInfo alternative_service_info, + AdvertisedAltSvcState advertised_alt_svc_state, NextProtoSet allowed_alpns, int load_flags, ProxyInfo proxy_info, @@ -50,6 +52,8 @@ struct NET_EXPORT_PRIVATE HttpStreamPoolRequestInfo { bool disable_cert_network_fetches = false; AlternativeServiceInfo alternative_service_info; + AdvertisedAltSvcState advertised_alt_svc_state = + AdvertisedAltSvcState::kUnknown; NextProtoSet allowed_alpns; int load_flags = 0; diff --git a/naiveproxy/src/net/http/http_stream_pool_tcp_based_attempt.cc b/naiveproxy/src/net/http/http_stream_pool_tcp_based_attempt.cc index a37bea24e8..382b772d57 100644 --- a/naiveproxy/src/net/http/http_stream_pool_tcp_based_attempt.cc +++ b/naiveproxy/src/net/http/http_stream_pool_tcp_based_attempt.cc @@ -9,6 +9,8 @@ #include #include "base/metrics/histogram_functions.h" +#include "base/notreached.h" +#include "base/strings/strcat.h" #include "base/task/sequenced_task_runner.h" #include "base/time/time.h" #include "base/timer/timer.h" @@ -75,21 +77,23 @@ std::string_view GetHistogramSuffixForTcpBasedAttemptCancel( } // namespace HttpStreamPool::TcpBasedAttempt::TcpBasedAttempt(AttemptManager* manager, - bool using_tls, + TcpBasedAttemptSlot* slot, IPEndPoint ip_endpoint) : manager_(manager), track_(base::trace_event::GetNextGlobalTraceId()), flow_(perfetto::Flow::ProcessScoped( - base::trace_event::GetNextGlobalTraceId())) { + base::trace_event::GetNextGlobalTraceId())), + slot_(slot) { TRACE_EVENT_INSTANT("net.stream", "TcpBasedAttemptStart", manager_->track(), flow_); TRACE_EVENT_BEGIN("net.stream", "TcpBasedAttempt::TcpBasedAttempt", track_, flow_, "ip_endpoint", ip_endpoint.ToString()); - if (using_tls) { + if (manager_->using_tls()) { attempt_ = std::make_unique( manager_->pool()->stream_attempt_params(), std::move(ip_endpoint), track_, HostPortPair::FromSchemeHostPort(manager_->stream_key().destination()), + manager_->GetBaseSSLConfig(), /*delegate=*/this); } else { attempt_ = std::make_unique( @@ -105,6 +109,43 @@ HttpStreamPool::TcpBasedAttempt::~TcpBasedAttempt() { GetResultHistogramSuffix(result_)}), elapsed); + if (result_.has_value() && *result_ == OK) { + std::string_view suffix = manager_->using_tls() ? ".Tls" : ".Tcp"; + + base::UmaHistogramMediumTimes( + base::StrCat({"Net.HttpStreamPool.TcpBasedAttemptSuccessTime", suffix}), + elapsed); + base::UmaHistogramMediumTimes( + "Net.HttpStreamPool.TcpBasedAttemptStartDelay", + start_time_ - manager_->created_time()); + base::UmaHistogramTimes( + "Net.HttpStreamPool.TcpBasedAttemptServiceEndpointWaitTime", + service_endpoint_wait_end_time_ - service_endpoint_wait_start_time_); + + // Record time taken by TCP/TLS handshakes. `ConnectTiming.connect_end` + // corresponds to `connectEnd` in ResourceTiming API and indicates: + // - TCP handshake completion time for TCP attempt. + // - TLS handshake completion time for TLS attempt. + // See https://www.w3.org/TR/resource-timing/#attribute-descriptions. + constexpr std::string_view kTcpHandshakeTimeHistogramName = + "Net.HttpStreamPool.TcpHandshakeTime"; + const LoadTimingInfo::ConnectTiming& connect_timing = + attempt_->connect_timing(); + if (manager_->using_tls()) { + CHECK(!tcp_handshake_complete_time_for_tls_.is_null()); + base::UmaHistogramMediumTimes( + base::StrCat({kTcpHandshakeTimeHistogramName, suffix}), + tcp_handshake_complete_time_for_tls_ - connect_timing.connect_start); + base::UmaHistogramMediumTimes( + "Net.HttpStreamPool.TlsHandshakeTime", + connect_timing.connect_end - tcp_handshake_complete_time_for_tls_); + } else { + base::UmaHistogramMediumTimes( + base::StrCat({kTcpHandshakeTimeHistogramName, suffix}), + connect_timing.connect_end - connect_timing.connect_start); + } + } + if (cancel_reason_.has_value()) { base::UmaHistogramEnumeration( "Net.HttpStreamPool.TcpBasedAttemptCancelReason", *cancel_reason_); @@ -158,8 +199,9 @@ void HttpStreamPool::TcpBasedAttempt::Start() { base::BindOnce(&TcpBasedAttempt::OnAttemptSlow, base::Unretained(this))); } else { - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(&TcpBasedAttempt::OnAttemptComplete, + TaskRunner(manager_->GetPriority()) + ->PostTask(FROM_HERE, + base::BindOnce(&TcpBasedAttempt::OnAttemptComplete, weak_ptr_factory_.GetWeakPtr(), rv)); } } @@ -172,21 +214,20 @@ void HttpStreamPool::TcpBasedAttempt::SetCancelReason( } } -int HttpStreamPool::TcpBasedAttempt::WaitForSSLConfigReady( +int HttpStreamPool::TcpBasedAttempt::WaitForServiceEndpointReady( CompletionOnceCallback callback) { if (manager_->service_endpoint_request()->EndpointsCryptoReady()) { return OK; } - ssl_config_wait_start_time_ = base::TimeTicks::Now(); - ssl_config_waiting_callback_ = std::move(callback); + service_endpoint_wait_start_time_ = base::TimeTicks::Now(); + service_endpoint_waiting_callback_ = std::move(callback); return ERR_IO_PENDING; } -base::expected -HttpStreamPool::TcpBasedAttempt::GetSSLConfig() { - base::expected result = - manager_->GetSSLConfig(ip_endpoint()); +base::expected +HttpStreamPool::TcpBasedAttempt::GetServiceEndpoint() { + auto result = manager_->GetServiceEndpoint(ip_endpoint()); if (!result.has_value()) { is_aborted_ = true; } @@ -196,14 +237,11 @@ HttpStreamPool::TcpBasedAttempt::GetSSLConfig() { std::optional HttpStreamPool::TcpBasedAttempt::MaybeTakeSSLConfigWaitingCallback() { - if (ssl_config_waiting_callback_.is_null()) { + if (service_endpoint_waiting_callback_.is_null()) { return std::nullopt; } - CHECK(!ssl_config_wait_start_time_.is_null()); - base::UmaHistogramMediumTimes( - "Net.HttpStreamPool.TcpBasedAttemptSSLConfigWaitTime2", - base::TimeTicks::Now() - ssl_config_wait_start_time_); + CHECK(!service_endpoint_wait_start_time_.is_null()); if (!is_slow_ && !slow_timer_.IsRunning()) { // Resume the slow timer as `attempt_` will start a TLS handshake. @@ -215,7 +253,8 @@ HttpStreamPool::TcpBasedAttempt::MaybeTakeSSLConfigWaitingCallback() { base::Unretained(this))); } - return std::move(ssl_config_waiting_callback_); + service_endpoint_wait_end_time_ = base::TimeTicks::Now(); + return std::move(service_endpoint_waiting_callback_); } base::Value::Dict HttpStreamPool::TcpBasedAttempt::GetInfoAsValue() const { @@ -245,6 +284,7 @@ base::Value::Dict HttpStreamPool::TcpBasedAttempt::GetInfoAsValue() const { } void HttpStreamPool::TcpBasedAttempt::OnTcpHandshakeComplete() { + tcp_handshake_complete_time_for_tls_ = base::TimeTicks::Now(); // Pause the slow timer until `attempt_` starts a TLS handshake to exclude the // time spent waiting for SSLConfig from the time `this` is considered slow. slow_timer_.Stop(); @@ -253,6 +293,7 @@ void HttpStreamPool::TcpBasedAttempt::OnTcpHandshakeComplete() { void HttpStreamPool::TcpBasedAttempt::OnAttemptSlow() { CHECK(!is_slow_); is_slow_ = true; + slot()->UpdateIsSlow(); manager_->OnTcpBasedAttemptSlow(this); } @@ -260,7 +301,8 @@ void HttpStreamPool::TcpBasedAttempt::OnAttemptComplete(int rv) { manager_->net_log().AddEvent( NetLogEventType::HTTP_STREAM_POOL_TCP_BASED_ATTEMPT_END, [&] { base::Value::Dict dict = manager_->GetStatesAsNetLogParams(); - dict.Set("result", ErrorToString(rv)); + dict.Set("ip_endpoint", ip_endpoint().ToString()); + dict.Set("net_error", rv); attempt()->net_log().source().AddToEventParameters(dict); return dict; }); @@ -271,4 +313,140 @@ void HttpStreamPool::TcpBasedAttempt::OnAttemptComplete(int rv) { manager_->OnTcpBasedAttemptComplete(this, rv); } +// TcpBasedAttemptSlot + +HttpStreamPool::TcpBasedAttemptSlot::TcpBasedAttemptSlot() = default; + +HttpStreamPool::TcpBasedAttemptSlot::~TcpBasedAttemptSlot() = default; + +HttpStreamPool::TcpBasedAttemptSlot::TcpBasedAttemptSlot( + TcpBasedAttemptSlot&&) = default; + +HttpStreamPool::TcpBasedAttemptSlot& +HttpStreamPool::TcpBasedAttemptSlot::operator=(TcpBasedAttemptSlot&&) = default; + +void HttpStreamPool::TcpBasedAttemptSlot::AllocateAttempt( + std::unique_ptr attempt) { + // New attempts should typically not be slow, so could potentially + // unconditionally set `is_slow_` to false, but best to be safe. + if (!attempt->is_slow()) { + is_slow_ = false; + } + + if (attempt->ip_endpoint().address().IsIPv4()) { + CHECK(!ipv4_attempt_); + ipv4_attempt_ = std::move(attempt); + } else { + CHECK(attempt->ip_endpoint().address().IsIPv6()); + CHECK(!ipv6_attempt_); + ipv6_attempt_ = std::move(attempt); + } +} + +std::unique_ptr +HttpStreamPool::TcpBasedAttemptSlot::TakeAttempt(TcpBasedAttempt* raw_attempt) { + auto take_attempt = [&]() { + if (ipv4_attempt_.get() == raw_attempt) { + return std::move(ipv4_attempt_); + } + if (ipv6_attempt_.get() == raw_attempt) { + return std::move(ipv6_attempt_); + } + NOTREACHED(); + }; + + UpdateIsSlow(); + + std::unique_ptr attempt = take_attempt(); + // Reset slot to avoid dangling pointer. + attempt->ResetSlot(); + return attempt; +} + +LoadState HttpStreamPool::TcpBasedAttemptSlot::GetLoadState() const { + if (ipv4_attempt_ && ipv6_attempt_) { + CHECK(ipv4_attempt_->attempt()); + CHECK(ipv6_attempt_->attempt()); + return std::max(ipv4_attempt_->attempt()->GetLoadState(), + ipv6_attempt_->attempt()->GetLoadState()); + } + if (ipv4_attempt_) { + CHECK(ipv4_attempt_->attempt()); + return ipv4_attempt_->attempt()->GetLoadState(); + } + if (ipv6_attempt_) { + CHECK(ipv6_attempt_->attempt()); + return ipv6_attempt_->attempt()->GetLoadState(); + } + NOTREACHED(); +} + +void HttpStreamPool::TcpBasedAttemptSlot::MaybeTakeSSLConfigWaitingCallbacks( + std::vector& callbacks) { + auto take_callback = [&](TcpBasedAttempt* attempt) { + auto callback = attempt->MaybeTakeSSLConfigWaitingCallback(); + if (callback.has_value()) { + callbacks.emplace_back(std::move(*callback)); + } + }; + + if (ipv4_attempt_) { + take_callback(ipv4_attempt_.get()); + } + if (ipv6_attempt_) { + take_callback(ipv6_attempt_.get()); + } +} + +bool HttpStreamPool::TcpBasedAttemptSlot::IsSlow() const { + DCHECK_EQ(is_slow_, CalculateIsSlow()); + return is_slow_; +} + +bool HttpStreamPool::TcpBasedAttemptSlot::HasIPEndPoint( + const IPEndPoint& ip_endpoint) const { + if (ipv4_attempt_ && ipv4_attempt_->ip_endpoint() == ip_endpoint) { + return true; + } + if (ipv6_attempt_ && ipv6_attempt_->ip_endpoint() == ip_endpoint) { + return true; + } + return false; +} + +void HttpStreamPool::TcpBasedAttemptSlot::SetCancelReason( + StreamSocketCloseReason reason) { + if (ipv4_attempt_) { + ipv4_attempt_->SetCancelReason(reason); + } + if (ipv6_attempt_) { + ipv6_attempt_->SetCancelReason(reason); + } +} + +base::Value::Dict HttpStreamPool::TcpBasedAttemptSlot::GetInfoAsValue() const { + base::Value::Dict dict; + if (ipv4_attempt_) { + dict.Set("ipv4_attempt", ipv4_attempt_->GetInfoAsValue()); + } + if (ipv6_attempt_) { + dict.Set("ipv6_attempt", ipv6_attempt_->GetInfoAsValue()); + } + return dict; +} + +void HttpStreamPool::TcpBasedAttemptSlot::UpdateIsSlow() { + is_slow_ = CalculateIsSlow(); +} + +bool HttpStreamPool::TcpBasedAttemptSlot::CalculateIsSlow() const { + if (ipv4_attempt_ && !ipv4_attempt_->is_slow()) { + return false; + } + if (ipv6_attempt_ && !ipv6_attempt_->is_slow()) { + return false; + } + return true; +} + } // namespace net diff --git a/naiveproxy/src/net/http/http_stream_pool_tcp_based_attempt.h b/naiveproxy/src/net/http/http_stream_pool_tcp_based_attempt.h index 0e8b6d1406..614907f23d 100644 --- a/naiveproxy/src/net/http/http_stream_pool_tcp_based_attempt.h +++ b/naiveproxy/src/net/http/http_stream_pool_tcp_based_attempt.h @@ -26,7 +26,7 @@ namespace net { class HttpStreamPool::TcpBasedAttempt : public TlsStreamAttempt::Delegate { public: TcpBasedAttempt(AttemptManager* manager, - bool using_tls, + TcpBasedAttemptSlot* slot, IPEndPoint ip_endpoint); TcpBasedAttempt(const TcpBasedAttempt&) = delete; @@ -38,12 +38,13 @@ class HttpStreamPool::TcpBasedAttempt : public TlsStreamAttempt::Delegate { void SetCancelReason(StreamSocketCloseReason reason); + TcpBasedAttemptSlot* slot() const { return slot_; } + + void ResetSlot() { slot_ = nullptr; } + StreamAttempt* attempt() { return attempt_.get(); } base::TimeTicks start_time() const { return start_time_; } - base::TimeTicks ssl_config_wait_start_time() const { - return ssl_config_wait_start_time_; - } const IPEndPoint& ip_endpoint() const { return attempt_->ip_endpoint(); } @@ -55,12 +56,12 @@ class HttpStreamPool::TcpBasedAttempt : public TlsStreamAttempt::Delegate { // TlsStreamAttempt::Delegate implementation: void OnTcpHandshakeComplete() override; - int WaitForSSLConfigReady(CompletionOnceCallback callback) override; - base::expected GetSSLConfig() - override; + int WaitForServiceEndpointReady(CompletionOnceCallback callback) override; + base::expected + GetServiceEndpoint() override; - bool IsWaitingSSLConfig() const { - return !ssl_config_waiting_callback_.is_null(); + bool IsWaitingForServiceEndpointReady() const { + return !service_endpoint_waiting_callback_.is_null(); } // Transfers `ssl_config_waiting_callback_` when `this` is waiting for @@ -76,6 +77,7 @@ class HttpStreamPool::TcpBasedAttempt : public TlsStreamAttempt::Delegate { const raw_ptr manager_; const perfetto::Track track_; const perfetto::Flow flow_; + raw_ptr slot_; std::unique_ptr attempt_; base::TimeTicks start_time_; std::optional result_; @@ -88,12 +90,89 @@ class HttpStreamPool::TcpBasedAttempt : public TlsStreamAttempt::Delegate { // Set to true when `this` and `attempt_` should abort. Currently used to // handle ECH failure. bool is_aborted_ = false; - base::TimeTicks ssl_config_wait_start_time_; - CompletionOnceCallback ssl_config_waiting_callback_; + + // Set to the time `attempt_` completes the TCP handshake. Only set when the + // underlying attempt is TLS. Used for histogram recording. + base::TimeTicks tcp_handshake_complete_time_for_tls_; + + base::TimeTicks service_endpoint_wait_start_time_; + base::TimeTicks service_endpoint_wait_end_time_; + CompletionOnceCallback service_endpoint_waiting_callback_; base::WeakPtrFactory weak_ptr_factory_{this}; }; +// Groups at most two concurrent TCP-based attempts (one IPv4, one IPv6) into a +// single “slot” counted against pool limits. Used to work around cases where +// both address families are available but one is much slower than the other. In +// such cases, the slow attempt may time out, causing the whole pool to stall, +// even if the fast attempt would have succeeded. By grouping attempts by +// address family, we can ensure that at most one attempt per address family is +// in-flight at any time. +// TODO(crbug.com/383606724): Figure out a better solution by improving endpoint +// selection. +class HttpStreamPool::TcpBasedAttemptSlot { + public: + TcpBasedAttemptSlot(); + ~TcpBasedAttemptSlot(); + + TcpBasedAttemptSlot(const TcpBasedAttemptSlot&) = delete; + TcpBasedAttemptSlot& operator=(const TcpBasedAttemptSlot&) = delete; + TcpBasedAttemptSlot(TcpBasedAttemptSlot&&); + TcpBasedAttemptSlot& operator=(TcpBasedAttemptSlot&&); + + // Allocates `attempt` to either IPv4 or IPv6 attempt slot based on its IP + // address. + void AllocateAttempt(std::unique_ptr attempt); + + // Transfers ownership of the attempt matching `raw_attempt` to the caller. + std::unique_ptr TakeAttempt(TcpBasedAttempt* raw_attempt); + + TcpBasedAttempt* ipv4_attempt() const { return ipv4_attempt_.get(); } + TcpBasedAttempt* ipv6_attempt() const { return ipv6_attempt_.get(); } + + // Returns true if this slot has no attempts. + bool empty() const { return !ipv4_attempt() && !ipv6_attempt(); } + + // Returns the most advanced load state of the attempts in this slot. + LoadState GetLoadState() const; + + // Transfers SSLConfig waiting callbacks from attempts in this slot to + // `callbacks`, if attempts are waiting for SSLConfig. + void MaybeTakeSSLConfigWaitingCallbacks( + std::vector& callbacks); + + // Returns true when this slot is slow. A slot is considered slow all attempts + // it owns are slow. + bool IsSlow() const; + + // Returns true if either IPv4 or IPv6 attempt has the given `ip_endpoint`. + bool HasIPEndPoint(const IPEndPoint& ip_endpoint) const; + + // Sets the cancel reason of both attempts in this slot. + void SetCancelReason(StreamSocketCloseReason reason); + + // Updates `is_slow_` based on current state of `ipv4_attempt_` and + // `ipv6_attempt_`. Called when an attempt is added, removed, or marked as + // slow. + void UpdateIsSlow(); + + base::Value::Dict GetInfoAsValue() const; + + private: + // Re-calculates whether this slot is considered slow, without updating + // `is_slow_`. This is not inlined in UpdateIsSlow() so that it can be used in + // DCHECKs. + bool CalculateIsSlow() const; + + std::unique_ptr ipv4_attempt_; + std::unique_ptr ipv6_attempt_; + + // False if either of `ipv4_attempt_` or `ipv6_attempt_` is non-null and not + // slow. Cached to reduced pointer dereferencing overhead of IsSlow() calls. + bool is_slow_ = false; +}; + } // namespace net #endif // NET_HTTP_HTTP_STREAM_POOL_TCP_BASED_ATTEMPT_H_ diff --git a/naiveproxy/src/net/http/http_stream_pool_test_util.cc b/naiveproxy/src/net/http/http_stream_pool_test_util.cc index 32b7d56830..54d9b32d1b 100644 --- a/naiveproxy/src/net/http/http_stream_pool_test_util.cc +++ b/naiveproxy/src/net/http/http_stream_pool_test_util.cc @@ -4,14 +4,19 @@ #include "net/http/http_stream_pool_test_util.h" +#include "base/location.h" +#include "base/task/sequenced_task_runner.h" +#include "base/test/bind.h" #include "net/base/completion_once_callback.h" #include "net/base/connection_endpoint_metadata.h" #include "net/base/features.h" +#include "net/base/load_timing_internal_info.h" #include "net/base/net_errors.h" #include "net/http/http_stream_pool.h" #include "net/http/http_stream_pool_attempt_manager.h" #include "net/http/http_stream_pool_group.h" #include "net/http/http_stream_pool_job.h" +#include "net/log/net_log_util.h" #include "net/log/net_log_with_source.h" #include "net/socket/socket_test_util.h" #include "net/socket/stream_socket.h" @@ -24,7 +29,7 @@ namespace net { namespace { -IPEndPoint MakeIPEndPoint(std::string_view addr, uint16_t port = 80) { +IPEndPoint MakeIPEndPoint(std::string_view addr, uint16_t port) { return IPEndPoint(*IPAddress::FromIPLiteral(addr), port); } @@ -261,13 +266,13 @@ ServiceEndpointBuilder::~ServiceEndpointBuilder() = default; ServiceEndpointBuilder& ServiceEndpointBuilder::add_v4(std::string_view addr, uint16_t port) { - endpoint_.ipv4_endpoints.emplace_back(MakeIPEndPoint(addr)); + endpoint_.ipv4_endpoints.emplace_back(MakeIPEndPoint(addr, port)); return *this; } ServiceEndpointBuilder& ServiceEndpointBuilder::add_v6(std::string_view addr, uint16_t port) { - endpoint_.ipv6_endpoints.emplace_back(MakeIPEndPoint(addr)); + endpoint_.ipv6_endpoints.emplace_back(MakeIPEndPoint(addr, port)); return *this; } @@ -399,11 +404,17 @@ HttpStreamKey GroupIdToHttpStreamKey( void WaitForAttemptManagerComplete( HttpStreamPool::AttemptManager* attempt_manager) { base::RunLoop run_loop; - attempt_manager->SetOnCompleteCallbackForTesting(run_loop.QuitClosure()); + attempt_manager->SetOnCompleteCallbackForTesting( + base::BindLambdaForTesting([&]() { + // Add an extra PostTask to let any already posted tasks complete. + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, run_loop.QuitClosure()); + })); run_loop.Run(); } -TestJobDelegate::TestJobDelegate(std::optional stream_key) { +TestJobDelegate::TestJobDelegate(std::optional stream_key) + : flow_(NetLogWithSourceToFlow(net_log_)) { if (stream_key.has_value()) { key_builder_.from_key(*stream_key); } else { @@ -421,9 +432,11 @@ void TestJobDelegate::CreateAndStartJob(HttpStreamPool& pool) { job_->Start(); } -void TestJobDelegate::OnStreamReady(HttpStreamPool::Job* job, - std::unique_ptr stream, - NextProto negotiated_protocol) { +void TestJobDelegate::OnStreamReady( + HttpStreamPool::Job* job, + std::unique_ptr stream, + NextProto negotiated_protocol, + std::optional session_source) { negotiated_protocol_ = negotiated_protocol; SetResult(OK); } @@ -461,6 +474,10 @@ const NetLogWithSource& TestJobDelegate::net_log() const { return net_log_; } +const perfetto::Flow& TestJobDelegate::flow() const { + return flow_; +} + void TestJobDelegate::OnStreamFailed(HttpStreamPool::Job* job, int status, const NetErrorDetails& net_error_details, diff --git a/naiveproxy/src/net/http/http_stream_pool_test_util.h b/naiveproxy/src/net/http/http_stream_pool_test_util.h index 1f4fe941c7..1d11ace17e 100644 --- a/naiveproxy/src/net/http/http_stream_pool_test_util.h +++ b/naiveproxy/src/net/http/http_stream_pool_test_util.h @@ -15,6 +15,7 @@ #include "base/memory/weak_ptr.h" #include "base/test/test_future.h" #include "net/base/completion_once_callback.h" +#include "net/base/load_timing_internal_info.h" #include "net/base/net_errors.h" #include "net/base/request_priority.h" #include "net/dns/host_resolver.h" @@ -322,7 +323,8 @@ class TestJobDelegate : public HttpStreamPool::Job::Delegate { // HttpStreamPool::Job::Delegate implementations: void OnStreamReady(HttpStreamPool::Job* job, std::unique_ptr stream, - NextProto negotiated_protocol) override; + NextProto negotiated_protocol, + std::optional session_source) override; RequestPriority priority() const override; HttpStreamPool::RespectLimits respect_limits() const override; const std::vector& allowed_bad_certs() @@ -332,6 +334,7 @@ class TestJobDelegate : public HttpStreamPool::Job::Delegate { NextProtoSet allowed_alpns() const override; const ProxyInfo& proxy_info() const override; const NetLogWithSource& net_log() const override; + const perfetto::Flow& flow() const override; void OnStreamFailed(HttpStreamPool::Job* job, int status, const NetErrorDetails& net_error_details, @@ -358,6 +361,7 @@ class TestJobDelegate : public HttpStreamPool::Job::Delegate { std::vector allowed_bad_certs_; ProxyInfo proxy_info_ = ProxyInfo::Direct(); NetLogWithSource net_log_; + perfetto::Flow flow_; std::unique_ptr job_; diff --git a/naiveproxy/src/net/http/http_stream_request.cc b/naiveproxy/src/net/http/http_stream_request.cc index aeba78d10f..ecac54d45e 100644 --- a/naiveproxy/src/net/http/http_stream_request.cc +++ b/naiveproxy/src/net/http/http_stream_request.cc @@ -35,13 +35,9 @@ HttpStreamRequest::~HttpStreamRequest() { helper_.ExtractAsDangling()->OnRequestComplete(); // May delete `*helper_`; } -void HttpStreamRequest::Complete( - NextProto negotiated_protocol, - AlternateProtocolUsage alternate_protocol_usage) { - DCHECK(!completed_); - completed_ = true; - negotiated_protocol_ = negotiated_protocol; - alternate_protocol_usage_ = alternate_protocol_usage; +void HttpStreamRequest::Complete(CompletionDetails details) { + DCHECK(!completion_details_.has_value()); + completion_details_ = std::move(details); } int HttpStreamRequest::RestartTunnelWithProxyAuth() { @@ -57,13 +53,13 @@ LoadState HttpStreamRequest::GetLoadState() const { } NextProto HttpStreamRequest::negotiated_protocol() const { - DCHECK(completed_); - return negotiated_protocol_; + DCHECK(completion_details_.has_value()); + return completion_details_->negotiated_protocol; } AlternateProtocolUsage HttpStreamRequest::alternate_protocol_usage() const { - DCHECK(completed_); - return alternate_protocol_usage_; + DCHECK(completion_details_.has_value()); + return completion_details_->alternate_protocol_usage; } const ConnectionAttempts& HttpStreamRequest::connection_attempts() const { diff --git a/naiveproxy/src/net/http/http_stream_request.h b/naiveproxy/src/net/http/http_stream_request.h index c8a8fc67b2..250e08ae9d 100644 --- a/naiveproxy/src/net/http/http_stream_request.h +++ b/naiveproxy/src/net/http/http_stream_request.h @@ -9,9 +9,11 @@ #include "base/memory/raw_ptr.h" #include "net/base/load_states.h" +#include "net/base/load_timing_internal_info.h" #include "net/base/net_error_details.h" #include "net/base/net_export.h" #include "net/base/request_priority.h" +#include "net/http/alternate_protocol_usage.h" #include "net/http/alternative_service.h" #include "net/http/http_response_info.h" #include "net/log/net_log_source.h" @@ -129,6 +131,19 @@ class NET_EXPORT_PRIVATE HttpStreamRequest { virtual void SetPriority(RequestPriority priority) = 0; }; + struct CompletionDetails { + // Protocol negotiated with the server. + NextProto negotiated_protocol = NextProto::kProtoUnknown; + // The reason why Chrome uses a specific transport protocol for HTTP + // semantics. + AlternateProtocolUsage alternate_protocol_usage = + AlternateProtocolUsage::ALTERNATE_PROTOCOL_USAGE_UNSPECIFIED_REASON; + // Indicates whether the request is used an existing H2 or H3 session. + std::optional session_source; + // The state of the advertised alternative service. + AdvertisedAltSvcState advertised_alt_svc_state; + }; + // Request will notify `helper` when it's destructed. // Thus `helper` is valid for the lifetime of the `this` Request. HttpStreamRequest(Helper* helper, @@ -153,8 +168,7 @@ class NET_EXPORT_PRIVATE HttpStreamRequest { void SetPriority(RequestPriority priority); // Marks completion of the request. Must be called before OnStreamReady(). - void Complete(NextProto negotiated_protocol, - AlternateProtocolUsage alternate_protocol_usage); + void Complete(CompletionDetails details); // Called by |helper_| to record connection attempts made by the socket // layer in an attached Job for this stream request. @@ -170,6 +184,13 @@ class NET_EXPORT_PRIVATE HttpStreamRequest { // semantics. AlternateProtocolUsage alternate_protocol_usage() const; + // Details of the completion of this request. Should be called after one + // of the delegate callback methods. Returns std::nullopt when this didn't + // complete successfully. + const std::optional& completion_details() const { + return completion_details_; + } + // Returns socket-layer connection attempts made for this stream request. const ConnectionAttempts& connection_attempts() const; @@ -182,7 +203,7 @@ class NET_EXPORT_PRIVATE HttpStreamRequest { StreamType stream_type() const { return stream_type_; } - bool completed() const { return completed_; } + bool completed() const { return completion_details_.has_value(); } void SetDnsResolutionTimeOverrides( base::TimeTicks dns_resolution_start_time_override, @@ -218,13 +239,7 @@ class NET_EXPORT_PRIVATE HttpStreamRequest { websocket_handshake_stream_create_helper_; const NetLogWithSource net_log_; - bool completed_ = false; - // Protocol negotiated with the server. - NextProto negotiated_protocol_ = NextProto::kProtoUnknown; - // The reason why Chrome uses a specific transport protocol for HTTP - // semantics. - AlternateProtocolUsage alternate_protocol_usage_ = - AlternateProtocolUsage::ALTERNATE_PROTOCOL_USAGE_UNSPECIFIED_REASON; + std::optional completion_details_; ConnectionAttempts connection_attempts_; const StreamType stream_type_; diff --git a/naiveproxy/src/net/http/http_transaction_test_util.cc b/naiveproxy/src/net/http/http_transaction_test_util.cc index 5fabcecc18..e8d1077ff7 100644 --- a/naiveproxy/src/net/http/http_transaction_test_util.cc +++ b/naiveproxy/src/net/http/http_transaction_test_util.cc @@ -640,7 +640,9 @@ int MockNetworkTransaction::DoSendRequest() { response_.ssl_info.connection_status = t->ssl_connection_status; response_.dns_aliases = t->dns_aliases; data_ = std::vector(resp_data.begin(), resp_data.end()); - content_length_ = response_.headers->GetContentLength(); + std::optional content_length = + response_.headers->GetContentLength(); + content_length_ = content_length ? content_length->InBytes() : -1; if (net_log_.net_log()) { socket_log_id_ = net_log_.net_log()->NextID(); diff --git a/naiveproxy/src/net/http/http_util.cc b/naiveproxy/src/net/http/http_util.cc index aa30ea1872..5a7e9d8b5a 100644 --- a/naiveproxy/src/net/http/http_util.cc +++ b/naiveproxy/src/net/http/http_util.cc @@ -27,6 +27,7 @@ #include "net/base/parse_number.h" #include "net/base/url_util.h" #include "net/http/http_response_headers.h" +#include "url/gurl.h" namespace net { @@ -155,15 +156,15 @@ void HttpUtil::ParseContentType(std::string_view content_type_str, } // static -bool HttpUtil::ParseRangeHeader(const std::string& ranges_specifier, +bool HttpUtil::ParseRangeHeader(std::string_view ranges_specifier, std::vector* ranges) { size_t equal_char_offset = ranges_specifier.find('='); - if (equal_char_offset == std::string::npos) + if (equal_char_offset == std::string::npos) { return false; + } // Try to extract bytes-unit part. - std::string_view bytes_unit = - std::string_view(ranges_specifier).substr(0, equal_char_offset); + std::string_view bytes_unit = ranges_specifier.substr(0, equal_char_offset); // "bytes" unit identifier is not found. bytes_unit = TrimLWS(bytes_unit); @@ -171,19 +172,16 @@ bool HttpUtil::ParseRangeHeader(const std::string& ranges_specifier, return false; } - std::string::const_iterator byte_range_set_begin = - ranges_specifier.begin() + equal_char_offset + 1; - std::string::const_iterator byte_range_set_end = ranges_specifier.end(); - ValuesIterator byte_range_set_iterator( - std::string_view(byte_range_set_begin, byte_range_set_end), + ranges_specifier.substr(equal_char_offset + 1), /*delimiter=*/','); while (byte_range_set_iterator.GetNext()) { std::string_view value = byte_range_set_iterator.value(); size_t minus_char_offset = value.find('-'); // If '-' character is not found, reports failure. - if (minus_char_offset == std::string::npos) + if (minus_char_offset == std::string::npos) { return false; + } std::string_view first_byte_pos = value.substr(0, minus_char_offset); first_byte_pos = TrimLWS(first_byte_pos); @@ -192,8 +190,9 @@ bool HttpUtil::ParseRangeHeader(const std::string& ranges_specifier, // Try to obtain first-byte-pos. if (!first_byte_pos.empty()) { int64_t first_byte_position = -1; - if (!base::StringToInt64(first_byte_pos, &first_byte_position)) + if (!base::StringToInt64(first_byte_pos, &first_byte_position)) { return false; + } range.set_first_byte_position(first_byte_position); } @@ -203,19 +202,22 @@ bool HttpUtil::ParseRangeHeader(const std::string& ranges_specifier, // We have last-byte-pos or suffix-byte-range-spec in this case. if (!last_byte_pos.empty()) { int64_t last_byte_position; - if (!base::StringToInt64(last_byte_pos, &last_byte_position)) + if (!base::StringToInt64(last_byte_pos, &last_byte_position)) { return false; - if (range.HasFirstBytePosition()) + } + if (range.HasFirstBytePosition()) { range.set_last_byte_position(last_byte_position); - else + } else { range.set_suffix_length(last_byte_position); + } } else if (!range.HasFirstBytePosition()) { return false; } // Do a final check on the HttpByteRange object. - if (!range.IsValid()) + if (!range.IsValid()) { return false; + } ranges->push_back(range); } return !ranges->empty(); diff --git a/naiveproxy/src/net/http/http_util.h b/naiveproxy/src/net/http/http_util.h index 90eb040f82..43313f4646 100644 --- a/naiveproxy/src/net/http/http_util.h +++ b/naiveproxy/src/net/http/http_util.h @@ -69,7 +69,7 @@ class NET_EXPORT HttpUtil { // Parses the value of a "Range" header as defined in RFC 7233 Section 2.1. // https://tools.ietf.org/html/rfc7233#section-2.1 // Returns false on failure. - static bool ParseRangeHeader(const std::string& range_specifier, + static bool ParseRangeHeader(std::string_view range_specifier, std::vector* ranges); // Extracts the values in a Content-Range header and returns true if all three diff --git a/naiveproxy/src/net/http/http_vary_data.cc b/naiveproxy/src/net/http/http_vary_data.cc index 50722b8a43..12733ec825 100644 --- a/naiveproxy/src/net/http/http_vary_data.cc +++ b/naiveproxy/src/net/http/http_vary_data.cc @@ -6,9 +6,12 @@ #include #include +#include #include "base/pickle.h" #include "base/strings/string_util.h" +#include "crypto/hash.h" +#include "crypto/obsolete/md5.h" #include "net/http/http_request_headers.h" #include "net/http/http_request_info.h" #include "net/http/http_response_headers.h" @@ -20,80 +23,15 @@ crypto::obsolete::Md5 MakeMd5HasherForHttpVaryData() { return {}; } -HttpVaryData::HttpVaryData() = default; +namespace { -bool HttpVaryData::Init(const HttpRequestInfo& request_info, - const HttpResponseHeaders& response_headers) { - auto ctx = MakeMd5HasherForHttpVaryData(); +using HasherVariant = std::variant; - is_valid_ = false; - bool processed_header = false; - - // Feed the MD5 context in the order of the Vary header enumeration. If the - // Vary header repeats a header name, then that's OK. - // - // If the Vary header contains '*' then we can just notice it based on - // |cached_response_headers| in MatchesRequest(), and don't have to worry - // about the specific headers. We still want an HttpVaryData around, to let - // us handle this case. See section 4.1 of RFC 7234. - // - size_t iter = 0; - constexpr std::string_view name = "vary"; - std::optional request_header; - while ((request_header = response_headers.EnumerateHeader(&iter, name))) { - if (*request_header == "*") { - // What's in request_digest_ will never be looked at, but make it - // deterministic so we don't serialize out uninitialized memory content. - request_digest_.fill(0u); - return is_valid_ = true; - } - AddField(request_info, *request_header, ctx); - processed_header = true; - } - - if (!processed_header) - return false; - - ctx.Finish(request_digest_); - return is_valid_ = true; -} - -bool HttpVaryData::InitFromPickle(base::PickleIterator* iter) { - is_valid_ = false; - std::optional> bytes = - iter->ReadBytes(sizeof(request_digest_)); - if (bytes) { - base::span(request_digest_).copy_from(*bytes); - return is_valid_ = true; - } - return false; -} - -void HttpVaryData::Persist(base::Pickle* pickle) const { - DCHECK(is_valid()); - pickle->WriteBytes(request_digest_); -} - -bool HttpVaryData::MatchesRequest( - const HttpRequestInfo& request_info, - const HttpResponseHeaders& cached_response_headers) const { - // Vary: * never matches. - if (cached_response_headers.HasHeaderValue("vary", "*")) - return false; - - HttpVaryData new_vary_data; - if (!new_vary_data.Init(request_info, cached_response_headers)) { - // This case can happen if |this| was loaded from a cache that was populated - // by a build before crbug.com/469675 was fixed. - return false; - } - return new_vary_data.request_digest_ == request_digest_; -} - -// static -void HttpVaryData::AddField(const HttpRequestInfo& request_info, - std::string_view request_header, - crypto::obsolete::Md5& context) { +// Append to the given hash context for the given request header. +template +void AddField(const HttpRequestInfo& request_info, + std::string_view request_header, + Hasher& context) { std::string request_value = request_info.extra_headers.GetHeader(request_header) .value_or(std::string()); @@ -103,8 +41,159 @@ void HttpVaryData::AddField(const HttpRequestInfo& request_info, // look the same for a variety of values for the individual request headers. // For example, "foo: 12\nbar: 3" looks like "foo: 1\nbar: 23" otherwise. request_value.append(1, '\n'); - context.Update(request_value); } +// A helper to abstract away the hashing logic for different context types. +bool UpdateVaryContext(const HttpRequestInfo& request_info, + const HttpResponseHeaders& response_headers, + HasherVariant& context_variant) { + bool processed_header = false; + size_t iter = 0; + constexpr std::string_view name = "vary"; + std::optional request_header; + while ((request_header = response_headers.EnumerateHeader(&iter, name))) { + // The caller of this function is responsible for handling the "*" case. + DCHECK_NE("*", *request_header); + std::visit( + [&](auto& context) { + AddField(request_info, *request_header, context); + }, + context_variant); + processed_header = true; + } + return processed_header; +} +} // namespace + +HttpVaryData::HttpVaryData() = default; + +bool HttpVaryData::Init(const HttpRequestInfo& request_info, + const HttpResponseHeaders& response_headers, + HashType hash_type) { + is_valid_ = false; + + // If the Vary header contains '*' then we can just notice it based on + // |cached_response_headers| in MatchesRequest(), and don't have to worry + // about the specific headers. We still want an HttpVaryData around, to let + // us handle this case. See section 4.1 of RFC 7234. + // + + if (response_headers.HasHeaderValue("vary", "*")) { + // What's in request_digest_ will never be looked at, but make it + // deterministic so we don't serialize out uninitialized memory content. + hash_ = Sha256Hash{}; + return is_valid_ = true; + } + + HasherVariant context_variant = + (hash_type == HashType::kSHA256) + ? HasherVariant(std::in_place_type, + crypto::hash::HashKind::kSha256) + : HasherVariant(MakeMd5HasherForHttpVaryData()); + + if (!UpdateVaryContext(request_info, response_headers, context_variant)) { + return false; + } + + std::visit( + [this](auto& context) { + using T = std::decay_t; + if constexpr (std::is_same_v) { + Sha256Hash sha_hash; + context.Finish(sha_hash); + hash_ = sha_hash; + } else { + Md5Hash md5_hash; + context.Finish(md5_hash); + hash_ = md5_hash; + } + }, + context_variant); + + return is_valid_ = true; +} + +bool HttpVaryData::InitFromPickle(base::PickleIterator* iter) { + is_valid_ = false; + + // Create a copy of the iterator to probe for the old format. This avoids + // advancing `iter` before we know which format we are parsing. + base::PickleIterator probe_iter(*iter); + std::optional> bytes_for_probe = + probe_iter.ReadBytes(crypto::obsolete::Md5::kSize); + + // Support for old cache entries that stored a raw 16-byte MD5 digest. + // We detect 16-byte MD5 hash by checking if the pickle's total size is + // exactly 16 bytes. + if (bytes_for_probe && !probe_iter.ReadBytes(1).has_value()) { + // It's an old-style entry. Read the data from the original iterator to + // consume it. + std::optional> bytes = + iter->ReadBytes(crypto::obsolete::Md5::kSize); + Md5Hash md5_hash; + base::span(md5_hash).copy_from(*bytes); + hash_ = md5_hash; + return is_valid_ = true; + } + + // It's a new-style entry, so we parse it from the original `iter`. + // New format: HashType enum followed by the digest. + int read_hash_type; + if (!iter->ReadInt(&read_hash_type)) { + return false; + } + + if (read_hash_type == static_cast(HashType::kSHA256)) { + std::optional> bytes = + iter->ReadBytes(crypto::hash::kSha256Size); + if (!bytes) { + return false; + } + Sha256Hash sha_hash; + base::span(sha_hash).copy_from(*bytes); + hash_ = sha_hash; + } else if (read_hash_type == static_cast(HashType::kMD5)) { + std::optional> bytes = + iter->ReadBytes(crypto::obsolete::Md5::kSize); + if (!bytes) { + return false; + } + Md5Hash md5_hash; + base::span(md5_hash).copy_from(*bytes); + hash_ = md5_hash; + } else { + return false; // Invalid hash type. + } + + return is_valid_ = true; +} + +void HttpVaryData::Persist(base::Pickle* pickle) const { + DCHECK(is_valid()); + std::visit( + [&](const auto& hash) { + pickle->WriteInt(static_cast(hash_type())); + pickle->WriteBytes(hash); + }, + hash_); +} + +bool HttpVaryData::MatchesRequest( + const HttpRequestInfo& request_info, + const HttpResponseHeaders& cached_response_headers) const { + // Vary: * never matches. + if (cached_response_headers.HasHeaderValue("vary", "*")) { + return false; + } + + HttpVaryData new_vary_data; + if (!new_vary_data.Init(request_info, cached_response_headers, hash_type())) { + // This case can happen if |this| was loaded from a cache that was populated + // by a build before crbug.com/469675 was fixed. + return false; + } + return new_vary_data.hash_ == hash_; +} + } // namespace net diff --git a/naiveproxy/src/net/http/http_vary_data.h b/naiveproxy/src/net/http/http_vary_data.h index bea96f5d3c..8e3002c1e8 100644 --- a/naiveproxy/src/net/http/http_vary_data.h +++ b/naiveproxy/src/net/http/http_vary_data.h @@ -6,35 +6,52 @@ #define NET_HTTP_HTTP_VARY_DATA_H_ #include +#include #include +#include +#include "base/check.h" +#include "crypto/hash.h" #include "crypto/obsolete/md5.h" #include "net/base/net_export.h" namespace base { class Pickle; class PickleIterator; -} +} // namespace base namespace net { struct HttpRequestInfo; class HttpResponseHeaders; -// Used to implement the HTTP/1.1 Vary header. This class contains a MD5 hash -// over the request headers indicated by a Vary header. +using Md5Hash = std::array; +using Sha256Hash = std::array; + +// Used to implement the HTTP/1.1 Vary header. This class contains a +// cryptographic hash over the request headers indicated by a Vary header. // // While RFC 2616 requires strict request header comparisons, it is much -// cheaper to store a MD5 sum, which should be sufficient. Storing a hash also +// cheaper to store a hash, which should be sufficient. Storing a hash also // avoids messy privacy issues as some of the request headers could hold // sensitive data (e.g., cookies). // +// This class supports both SHA-256 and the legacy MD5 hash algorithms. New +// entries use SHA-256. + // NOTE: This class does not hold onto the contents of the Vary header. // Instead, it relies on the consumer to store that and to supply it again to // the MatchesRequest function for comparing against future HTTP requests. // class NET_EXPORT_PRIVATE HttpVaryData { public: + // The hash algorithm used for the digest. These values are persisted to disk + // and should not be changed. + enum class HashType { + kMD5 = 0, + kSHA256 = 1, + }; + HttpVaryData(); bool is_valid() const { return is_valid_; } @@ -45,9 +62,10 @@ class NET_EXPORT_PRIVATE HttpVaryData { // Vary header was not empty. Upon success, the object is also marked as valid // such that is_valid() will return true. Otherwise, false is returned to // indicate that this object is marked as invalid. - // + // New entries are created with SHA256. bool Init(const HttpRequestInfo& request_info, - const HttpResponseHeaders& response_headers); + const HttpResponseHeaders& response_headers, + HashType hash_type = HashType::kSHA256); // Initialize from a pickle that contains data generated by a call to the // vary data's Persist method. @@ -57,7 +75,6 @@ class NET_EXPORT_PRIVATE HttpVaryData { // that this object is marked as invalid. // bool InitFromPickle(base::PickleIterator* pickle_iter); - // Call this method to persist the vary data. Illegal to call this on an // invalid object. void Persist(base::Pickle* pickle) const; @@ -68,16 +85,18 @@ class NET_EXPORT_PRIVATE HttpVaryData { bool MatchesRequest(const HttpRequestInfo& request_info, const HttpResponseHeaders& cached_response_headers) const; + HashType hash_type() const { + if (std::holds_alternative(hash_)) { + return HashType::kMD5; + } + CHECK(std::holds_alternative(hash_)); + return HashType::kSHA256; + } + private: - // Append to the MD5 context for the given request header. - static void AddField(const HttpRequestInfo& request_info, - std::string_view request_header, - crypto::obsolete::Md5& context); - - // A digested version of the request headers corresponding to the Vary header. - std::array request_digest_; - - // True when request_digest_ contains meaningful data. + // A variant to hold either a SHA-256 or MD5 hash of the request headers. + std::variant hash_; + // True when `hash_` contains meaningful data. bool is_valid_ = false; }; diff --git a/naiveproxy/src/net/http/mock_http_cache.h b/naiveproxy/src/net/http/mock_http_cache.h index f9211fa3a1..f56e063113 100644 --- a/naiveproxy/src/net/http/mock_http_cache.h +++ b/naiveproxy/src/net/http/mock_http_cache.h @@ -20,6 +20,7 @@ #include #include "base/memory/raw_ptr.h" +#include "base/memory/ref_counted.h" #include "base/strings/string_split.h" #include "net/base/completion_once_callback.h" #include "net/base/request_priority.h" diff --git a/naiveproxy/src/net/http/no_vary_search_cache.cc b/naiveproxy/src/net/http/no_vary_search_cache.cc index e320a56bdc..4a73e5c488 100644 --- a/naiveproxy/src/net/http/no_vary_search_cache.cc +++ b/naiveproxy/src/net/http/no_vary_search_cache.cc @@ -5,21 +5,23 @@ #include "net/http/no_vary_search_cache.h" #include -#include -#include -#include #include +#include #include #include #include #include "base/check.h" #include "base/check_op.h" +#include "base/containers/map_util.h" #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_macros.h" #include "base/notreached.h" #include "base/numerics/safe_conversions.h" +#include "base/pickle.h" #include "base/time/time.h" +#include "base/trace_event/trace_event.h" +#include "base/types/expected_macros.h" #include "net/base/pickle.h" #include "net/base/pickle_base_types.h" #include "net/http/http_cache.h" @@ -96,12 +98,18 @@ void EmitNoVarySearchHeaderParseResultHistogram( // request, so we want to avoid allocating memory for a GURL in the case of a // cache miss. The return value points at memory owned by `url`, so should not // outlive it. -GURL ExtractBaseURL(const GURL& url) { +std::string_view ExtractBaseURL(const GURL& url) { CHECK(url.is_valid()); - GURL::Replacements replacements; - replacements.ClearQuery(); - replacements.ClearRef(); - return url.ReplaceComponents(replacements); + const std::string_view spec = url.spec(); + const size_t query_pos = spec.find('?'); + if (query_pos != std::string_view::npos) { + return spec.substr(0, query_pos); + } + const size_t ref_pos = spec.find('#'); + if (ref_pos != std::string_view::npos) { + return spec.substr(0, ref_pos); + } + return spec; } bool URLIsAcceptable(const GURL& url) { @@ -117,113 +125,64 @@ bool BaseURLIsAcceptable(const GURL& base_url) { // Given `base_url` and `query`, return the original URL that would have been // used to construct them. -GURL ReconstructOriginalURLFromQuery(const GURL& base_url, +GURL ReconstructOriginalURLFromQuery(std::string_view base_url, const std::optional& query) { if (!query.has_value()) { - return base_url; + return GURL(base_url); } - GURL::Replacements replacements; - replacements.SetQueryStr(query.value()); - return base_url.ReplaceComponents(replacements); + return GURL(base::StrCat({base_url, "?", query.value()})); } } // namespace -// base::LinkedList only supports having an object in a single linked list at a -// time. However, we need QueryString objects to be in two separate lists: -// * the least-recently-used (LRU) list, which has the most recently added or -// used entry at its head and the next entry to be evicted at its tail. This -// list contains every QueryString in the cache. -// * the list of cached QueryString objects for a particular base URL and -// No-Vary-Search parameter. These lists have the most recently inserted -// entry for this {base URL, NVS} pair at their heads. -// -// In order to work-around the limitation of base::LinkedList, QueryString has -// two base classes. LruNode represents its role as a member of the LRU list, -// and QueryStringListNode represents its role as a member of the -// QueryStringList list. By calling base::LinkNode methods via the appropriate -// base class it can control which list it is manipulating. -class NoVarySearchCache::LruNode : public base::LinkNode { - public: - // Not copyable or movable. - LruNode(const LruNode&) = delete; - LruNode& operator=(const LruNode&) = delete; - - // Every instance of LruNode is actually a QueryString. - QueryString* ToQueryString(); - - private: - friend class QueryString; - - LruNode() = default; - ~LruNode() = default; -}; - -class NoVarySearchCache::QueryStringListNode - : public base::LinkNode { - public: - // Not copyable or movable. - QueryStringListNode(const QueryStringListNode&) = delete; - QueryStringListNode& operator=(const QueryStringListNode&) = delete; - - // Every instance of QueryStringListNode is actually a QueryString. - QueryString* ToQueryString(); - - private: - friend class QueryString; - - QueryStringListNode() = default; - ~QueryStringListNode() = default; -}; - -// QueryString is the entry type for the cache. Its main purpose is to hold the +// Query is the leaf entry type for the cache. Its main purpose is to hold the // query string, ie. everything between the "?" and the "#" in the original URL. -// Together with the `base_url`, this can be used to reconstruct the original +// Combined with the `base_url`, this can be used to reconstruct the original // URL that was used to store the original request in the disk cache. -class NoVarySearchCache::QueryString final - : public NoVarySearchCache::LruNode, - public NoVarySearchCache::QueryStringListNode { +class NoVarySearchCache::Query final : public base::LinkNode { public: - // Creates a QueryString and adds it to `list` and `lru_list`. - static QueryString* CreateAndInsert(std::optional query, - QueryStringList& query_string_list, - base::LinkedList& lru_list, - base::Time update_time) { + using PassKey = base::PassKey; + + // Creates a Query and adds it to `lru_list`. + static std::unique_ptr CreateAndInsert( + std::optional query, + base::LinkedList& lru_list, + base::Time update_time, + const std::string* canonicalized_query, + Queries* queries) { DCHECK(!query || query->find('#') == std::string_view::npos) << "Query contained a '#' character, meaning that the URL reassembly " "will not work correctly because the '#' will be re-interpreted as " "the start of a fragment. This should not happen. Query was '" << query.value() << "'"; - // This use of bare new is needed because base::LinkedList does not have - // ownership semantics. - auto* query_string = new QueryString(query, query_string_list, update_time); - query_string->LruNode::InsertBefore(lru_list.head()); - query_string->QueryStringListNode::InsertBefore( - query_string_list.list.head()); - return query_string; + auto created = std::make_unique(PassKey(), query, update_time); + created->canonicalized_query_ = canonicalized_query; + created->queries_ = queries; + created->InsertBefore(lru_list.head()); + return created; } + Query(PassKey, std::optional query, base::Time update_time) + : query_(query), update_time_(update_time) {} + // Not copyable or movable. - QueryString(const QueryString&) = delete; - QueryString& operator=(const QueryString&) = delete; + Query(const Query&) = delete; + Query& operator=(const Query&) = delete; - // Removes this object from both lists and deletes it. - void RemoveAndDelete() { - // During deserialization a QueryString is not inserted into the `lru_` list + // Removes this object from the LRU list. + ~Query() { + // During deserialization a Query is not inserted into the `lru_` list // until the end. If deserialization fails before then, it can be deleted // without ever being inserted into the `lru_` list. - if (LruNode::next()) { - CHECK(LruNode::previous()); - LruNode::RemoveFromList(); + if (next()) { + CHECK(previous()); + RemoveFromList(); } - QueryStringListNode::RemoveFromList(); - delete this; } - // Moves this object to the head of `list`. - template - void MoveToHead(List& linked_list) { + // Moves this object to the head of `linked_list`. + void MoveToHead(base::LinkedList& linked_list) { auto* head = linked_list.head(); if (head != this) { MoveBeforeNode(linked_list.head()->value()); @@ -232,7 +191,11 @@ class NoVarySearchCache::QueryString final const std::optional& query() const { return query_; } - QueryStringList& query_string_list_ref() { return *query_string_list_ref_; } + const std::string& canonicalized_query() const { + return *canonicalized_query_; + } + + Queries& queries() const { return *queries_; } base::Time update_time() const { return update_time_; } @@ -241,7 +204,7 @@ class NoVarySearchCache::QueryString final // Return the original GURL that this entry was constructed from (not // including any fragment). It's important to use this method to correctly // reconstruct URLs that have an empty query (end in '?'). - GURL ReconstructOriginalURL(const GURL& base_url) { + GURL ReconstructOriginalURL(const std::string& base_url) const { return ReconstructOriginalURLFromQuery(base_url, query_); } @@ -249,34 +212,33 @@ class NoVarySearchCache::QueryString final return EraseHandle(weak_factory_.GetWeakPtr()); } - void set_query_string_list_ref( - base::PassKey, - QueryStringList* query_string_list) { - query_string_list_ref_ = query_string_list; + void set_canonicalized_query(const std::string* canonicalized_query) { + canonicalized_query_ = canonicalized_query; } + void set_queries(Queries* queries) { queries_ = queries; } + private: - friend struct PickleTraits; + friend struct PickleTraits>; - QueryString(std::optional query, - QueryStringList& query_string_list, - base::Time update_time) - : query_(query), - query_string_list_ref_(&query_string_list), - update_time_(update_time) {} - - // Must only be called from RemoveAndDelete(). - ~QueryString() = default; + // Deserialization is implemented here for easy access to the PassKey. + static std::optional> Deserialize( + base::PickleIterator& iter) { + std::optional query; + base::Time update_time; + if (!ReadPickleInto(iter, query, update_time)) { + return std::nullopt; + } + // The other fields will be filled in in a second pass while deserializing + // the top-level NoVarySearchCache object. + return std::make_unique(PassKey(), std::move(query), update_time); + } // Moves this object in front of `node`. - template - void MoveBeforeNode(NodeType* node) { - static_assert(std::same_as || - std::same_as, - "This assert is just documentation"); + void MoveBeforeNode(Query* node) { CHECK_NE(node, this); - NodeType::RemoveFromList(); - NodeType::InsertBefore(node); + RemoveFromList(); + InsertBefore(node); } // No-Vary-Search treats "http://www.example.com/" and @@ -286,37 +248,30 @@ class NoVarySearchCache::QueryString final // there was no `?` in the original URL, and `query_ == ""` means there was. const std::optional query_; - // `query_string_list_ref_` allows the keys for this entry to be located in - // the cache so that it can be erased efficiently. It is modified when a - // QueryStringList object is moved. - raw_ptr query_string_list_ref_ = nullptr; + // `canonicalized_query_` allows this entry to be located in the query_map so + // that it can be erased efficiently. The pointed-to std::string is this + // object's key in the map, so it is always deleted after this object. + raw_ptr canonicalized_query_ = nullptr; + + // `queries_` provides a pointer to the structure with the other pointers + // we need to find this entry in the cache. It is owned by the + // NVSDataToQueriesMap. This object is always deleted before `queries_` + // because this object is owned by the `query_map` inside Queries. + raw_ptr queries_ = nullptr; // `update_time_` breaks ties when there are multiple possible matches. The // most recent entry will be used as it is most likely to still exist in the // disk cache. base::Time update_time_; - // EraseHandle uses weak pointers to QueryString objects to enable an entry to + // EraseHandle uses weak pointers to Query objects to enable an entry to // be deleted from the cache if it is found not to be readable from the disk // cache. - base::WeakPtrFactory weak_factory_{this}; + base::WeakPtrFactory weak_factory_{this}; }; -// The two implementations of ToQueryString() are defined out-of-line so that -// the compiler has seen the definition of QueryString and so knows the correct -// offsets to apply to the `this` pointer. -NoVarySearchCache::QueryString* NoVarySearchCache::LruNode::ToQueryString() { - return static_cast(this); -} - -NoVarySearchCache::QueryString* -NoVarySearchCache::QueryStringListNode::ToQueryString() { - return static_cast(this); -} - -NoVarySearchCache::EraseHandle::EraseHandle( - base::WeakPtr query_string) - : query_string_(std::move(query_string)) {} +NoVarySearchCache::EraseHandle::EraseHandle(base::WeakPtr query) + : query_(std::move(query)) {} NoVarySearchCache::EraseHandle::~EraseHandle() = default; @@ -326,15 +281,20 @@ NoVarySearchCache::EraseHandle& NoVarySearchCache::EraseHandle::operator=( bool NoVarySearchCache::EraseHandle::EqualsForTesting( const EraseHandle& rhs) const { - return query_string_.get() == rhs.query_string_.get(); + return query_.get() == rhs.query_.get(); } bool NoVarySearchCache::EraseHandle::IsGoneForTesting() const { - return !query_string_; + return !query_; } NoVarySearchCache::Journal::~Journal() = default; +NoVarySearchCache::Queries::Queries() = default; +NoVarySearchCache::Queries::~Queries() = default; + +NoVarySearchCache::Queries::Queries(Queries&&) = default; + NoVarySearchCache::NoVarySearchCache(size_t max_size) : max_size_(max_size) { CHECK_GE(max_size_, 1u); // We can't serialize if `max_size` won't fit in an int. @@ -342,57 +302,77 @@ NoVarySearchCache::NoVarySearchCache(size_t max_size) : max_size_(max_size) { } NoVarySearchCache::NoVarySearchCache(NoVarySearchCache&& rhs) - : map_(std::move(rhs.map_)), + : partitions_(std::move(rhs.partitions_)), lru_(std::move(rhs.lru_)), size_(std::exchange(rhs.size_, 0u)), max_size_(rhs.max_size_) {} NoVarySearchCache::~NoVarySearchCache() { - map_.clear(); - // Clearing the map should have freed all the QueryString objects. + partitions_.clear(); + // Clearing the map should have freed all the Query objects. CHECK(lru_.empty()); } std::optional NoVarySearchCache::Lookup( const HttpRequestInfo& request) { - SCOPED_UMA_HISTOGRAM_TIMER_MICROS("HttpCache.NoVarySearch.LookupTime"); + bool unused = true; + return Lookup(request, /*out_base_url_matched=*/unused); +} + +std::optional NoVarySearchCache::Lookup( + const HttpRequestInfo& request, + bool& out_base_url_matched) { + out_base_url_matched = false; const GURL& url = request.url; if (!URLIsAcceptable(url)) { return std::nullopt; } - // TODO(https://crbug.com/388956603): Try to avoid allocating memory for the - // base url. - const GURL base_url = ExtractBaseURL(url); + + TRACE_EVENT("net", "NoVarySearchCache::Lookup"); + // TODO(https://crbug.com/388956603): This does a lot of allocations and // string copies. Try to reduce the amount of work done for a miss. - const std::optional maybe_cache_key = - HttpCache::GenerateCacheKeyForRequestWithAlternateURL(&request, base_url); - if (!maybe_cache_key) { + ASSIGN_OR_RETURN( + const std::string cache_partition_key, + HttpCache::GenerateCachePartitionKeyForRequest(request), + []() -> std::optional { return {}; }); + + const auto partition_it = partitions_.find(cache_partition_key); + if (partition_it == partitions_.end()) { return std::nullopt; } - const BaseURLCacheKey cache_key(maybe_cache_key.value()); - const auto it = map_.find(cache_key); - if (it == map_.end()) { + + auto& [cache_partition_key_ref, base_url_map] = *partition_it; + + const std::string_view base_url_view = ExtractBaseURL(url); + const auto base_url_map_it = base_url_map.find(base_url_view); + if (base_url_map_it == base_url_map.end()) { return std::nullopt; } - // We have a match, so we need to create a real URL now. - QueryString* best_match = nullptr; - GURL original_url; - for (auto& [nvs_data, query_strings] : it->second) { - auto result = FindQueryStringInList(query_strings, base_url, url, nvs_data); - if (result && (!best_match || - best_match->update_time() < result->match->update_time())) { - best_match = result->match; - original_url = result->original_url; + out_base_url_matched = true; + + auto& [base_url_ref, nvs_data_to_queries_map] = *base_url_map_it; + Query* best_match = nullptr; + + // `nvs_data_to_queries_map` should ideally only have one entry, but if the + // site has sent different No-Vary-Search header values for the same base URL + // we need to check them all. + for (auto& [nvs_data, queries] : nvs_data_to_queries_map) { + Query* result = FindQuery(queries.query_map, url, nvs_data); + if (result && + (!best_match || best_match->update_time() < result->update_time())) { + best_match = result; } } if (!best_match) { return std::nullopt; } - // Move to head of `lru_` list. + + // This is a hit. Move to head of `lru_` list. best_match->MoveToHead(lru_); - return LookupResult(original_url, best_match->CreateEraseHandle()); + return LookupResult(best_match->ReconstructOriginalURL(base_url_ref), + best_match->CreateEraseHandle()); } void NoVarySearchCache::MaybeInsert(const HttpRequestInfo& request, @@ -406,26 +386,20 @@ void NoVarySearchCache::MaybeInsert(const HttpRequestInfo& request, if (!maybe_nvs_data.has_value()) { return; } - const GURL base_url = ExtractBaseURL(url); + const std::string_view base_url = ExtractBaseURL(url); - std::optional query; - if (url.has_query()) { - query = url.query_piece(); - } + std::optional query = + url.has_query() ? std::make_optional(url.GetQuery()) : std::nullopt; - // Using lower_bound() followed by emplace_hint() allows us to avoid - // constructing a Key object if there is already a matching key in the map, - // and do only a single logN lookup. - const std::optional maybe_cache_key = - HttpCache::GenerateCacheKeyForRequestWithAlternateURL(&request, base_url); - if (!maybe_cache_key) { - return; - } + ASSIGN_OR_RETURN(const std::string cache_partition_key, + HttpCache::GenerateCachePartitionKeyForRequest(request), + [] { return; }); const base::Time update_time = base::Time::Now(); - DoInsert(url, base_url, std::move(maybe_cache_key.value()), - std::move(maybe_nvs_data.value()), query, update_time, journal_); + DoInsert(url, std::move(cache_partition_key), std::string(base_url), + std::move(maybe_nvs_data.value()), std::move(query), update_time, + journal_); } bool NoVarySearchCache::ClearData(UrlFilterType filter_type, @@ -433,37 +407,37 @@ bool NoVarySearchCache::ClearData(UrlFilterType filter_type, const base::flat_set& domains, base::Time delete_begin, base::Time delete_end) { - // For simplicity, first collect a list of matching QueryStrings to erase and + // For simplicity, first collect a list of matching Query objects to erase and // then erase them. // TODO(https://crbug.com/382394774): Make this algorithm more efficient. - std::vector pending_erase; - for (auto& [cache_key, data_map] : map_) { - const std::string base_url_string = - HttpCache::GetResourceURLFromHttpCacheKey(cache_key.value()); - const GURL base_url(base_url_string); - CHECK(base_url.is_valid()); - // DoesUrlMatchFilter() only looks at the origin of the URL, which is why we - // don't need to worry about reconstructing the full URL with query. - if (DoesUrlMatchFilter(filter_type, origins, domains, base_url)) { - FindQueryStringsInTimeRange(data_map, delete_begin, delete_end, - pending_erase); + std::vector pending_erase; + for (auto& [cache_partition_key, base_url_map] : partitions_) { + for (auto& [base_url_ref, nvs_data_to_queries_map] : base_url_map) { + const GURL base_url(base_url_ref); + CHECK(base_url.is_valid()); + // DoesUrlMatchFilter() only looks at the origin of the URL, which is why + // we don't need to worry about reconstructing the full URL with query. + if (DoesUrlMatchFilter(filter_type, origins, domains, base_url)) { + FindQuerysInTimeRange(nvs_data_to_queries_map, delete_begin, delete_end, + pending_erase); + } } } - for (QueryString* query_string : pending_erase) { - EraseQuery(query_string); + for (Query* query : pending_erase) { + EraseQuery(query); } return !pending_erase.empty(); } void NoVarySearchCache::Erase(EraseHandle handle) { - if (QueryString* query_string = handle.query_string_.get()) { + if (Query* query = handle.query_.get()) { if (journal_) { - auto& query_string_list = query_string->query_string_list_ref(); - journal_->OnErase(query_string_list.key_ref->value(), - *query_string_list.nvs_data_ref, query_string->query()); + const Queries& queries = query->queries(); + journal_->OnErase(*queries.cache_partition_key_ptr, *queries.base_url_ptr, + *queries.nvs_data_ptr, query->query()); } - EraseQuery(query_string); + EraseQuery(query); } } @@ -471,113 +445,97 @@ void NoVarySearchCache::SetJournal(Journal* journal) { journal_ = journal; } -void NoVarySearchCache::ReplayInsert(std::string base_url_cache_key, +void NoVarySearchCache::ReplayInsert(std::string partition_key, + std::string base_url, HttpNoVarySearchData nvs_data, std::optional query, base::Time update_time) { - const std::string base_url_string = - HttpCache::GetResourceURLFromHttpCacheKey(base_url_cache_key); - const GURL base_url(base_url_string); - if (!BaseURLIsAcceptable(base_url)) { + const GURL base_gurl(base_url); + if (!BaseURLIsAcceptable(base_gurl)) { return; } // The URL should have been stored in its canonical form. - if (base_url_string != base_url.possibly_invalid_spec()) { + if (base_url != base_gurl.spec()) { return; } + if (query && query->find('#') != std::string::npos) { return; } // To be extra careful to avoid re-entrancy, explicitly set `journal` to // nullptr so that no notification is fired for this insertion. - ReconstructURLAndDoInsert(base_url, std::move(base_url_cache_key), + ReconstructURLAndDoInsert(std::move(partition_key), std::move(base_url), std::move(nvs_data), std::move(query), update_time, /*journal=*/nullptr); } -void NoVarySearchCache::ReplayErase(const std::string& base_url_cache_key, +void NoVarySearchCache::ReplayErase(const std::string& partition_key, + const std::string& base_url, const HttpNoVarySearchData& nvs_data, const std::optional& query) { - const auto map_it = map_.find(BaseURLCacheKey(base_url_cache_key)); - if (map_it == map_.end()) { + const auto map_it = partitions_.find(partition_key); + if (map_it == partitions_.end()) { return; } - DataMapType& data_map = map_it->second; - const auto data_it = data_map.find(nvs_data); - if (data_it == data_map.end()) { + BaseUrlToNVSDataMap& base_url_map = map_it->second; + + const auto base_url_it = base_url_map.find(base_url); + if (base_url_it == base_url_map.end()) { return; } - QueryStringList& query_strings = data_it->second; - QueryString* query_string = nullptr; - ForEachQueryString(query_strings.list, - [&query_string, &query](QueryString* candidate) { - if (!query_string && candidate->query() == query) { - query_string = candidate; - } - }); - if (!query_string) { + NVSDataToQueriesMap& nvs_data_to_queries_map = base_url_it->second; + + const auto data_it = nvs_data_to_queries_map.find(nvs_data); + if (data_it == nvs_data_to_queries_map.end()) { return; } + Queries& queries = data_it->second; + const GURL original_url = ReconstructOriginalURLFromQuery(base_url, query); + // Since `base_url` was already in the map, it must have been valid. There is + // no value of `query` that GURL will not canonicalize. So the resulting URL + // is always valid (even if the query itself was corrupted). + CHECK(original_url.is_valid()); + + const std::string canonicalized_query = + nvs_data.CanonicalizeQuery(original_url); + const auto query_it = queries.query_map.find(canonicalized_query); + if (query_it == queries.query_map.end()) { + return; + } + + Query* query_ptr = query_it->second.get(); + // TODO(https://crbug.com/382394774): This could be made more efficient in the // case when the map keys need to be deleted since we have `map_it` and // `data_it` already available. - EraseQuery(query_string); + EraseQuery(query_ptr); } void NoVarySearchCache::MergeFrom(const NoVarySearchCache& newer) { - // We cannot use ForEachQueryString() here as we need to iterate through the + // We cannot use ForEachQuery() here as we need to iterate through the // `lru_` linked list in reverse order. const auto& newer_lru = newer.lru_; for (auto* node = newer_lru.tail(); node != newer_lru.end(); node = node->previous()) { - QueryString* query_string = node->value()->ToQueryString(); - const auto& query_string_list = query_string->query_string_list_ref(); - std::string base_url_cache_key(*query_string_list.key_ref); - const HttpNoVarySearchData& nvs_data = *query_string_list.nvs_data_ref; - const std::string base_url_string = - HttpCache::GetResourceURLFromHttpCacheKey(base_url_cache_key); - const GURL base_url(base_url_string); - CHECK(BaseURLIsAcceptable(base_url)); - std::optional query = query_string->query(); - CHECK(!query || query->find('#') == std::string::npos); + Query* query = node->value(); + const Queries& queries = query->queries(); + const std::string& base_url = *queries.base_url_ptr; + std::optional query_string = query->query(); + CHECK(!query_string || query_string->find('#') == std::string::npos); // Pass `journal_` so the merged entries are journalled as insertions. - ReconstructURLAndDoInsert(base_url, std::move(base_url_cache_key), nvs_data, - std::move(query), query_string->update_time(), - journal_); + ReconstructURLAndDoInsert(*queries.cache_partition_key_ptr, base_url, + *queries.nvs_data_ptr, std::move(query_string), + query->update_time(), journal_); } } bool NoVarySearchCache::IsTopLevelMapEmptyForTesting() const { - return map_.empty(); -} - -NoVarySearchCache::QueryStringList::QueryStringList(const BaseURLCacheKey& key) - : key_ref(&key) {} - -NoVarySearchCache::QueryStringList::QueryStringList() = default; - -NoVarySearchCache::QueryStringList::QueryStringList(QueryStringList&& rhs) - : list(std::move(rhs.list)) { - // We should not move a list after the key references have been assigned. - CHECK(!rhs.nvs_data_ref); - CHECK(!rhs.key_ref); - // We have to patch up all the references to `rhs` in our QueryString objects - // to point to us instead. - ForEachQueryString(list, [&](QueryString* query_string) { - query_string->set_query_string_list_ref(base::PassKey(), - this); - }); -} - -NoVarySearchCache::QueryStringList::~QueryStringList() { - while (!list.empty()) { - list.head()->value()->ToQueryString()->RemoveAndDelete(); - } + return partitions_.empty(); } void NoVarySearchCache::EvictIfOverfull() { @@ -585,235 +543,204 @@ void NoVarySearchCache::EvictIfOverfull() { if (size_ == max_size_ + 1) { // This happens when an entry is added when the cache is already full. // Remove an entry to make `size_` == `max_size_` again. - EraseQuery(lru_.tail()->value()->ToQueryString()); + EraseQuery(lru_.tail()->value()); } } -void NoVarySearchCache::EraseQuery(QueryString* query_string) { +void NoVarySearchCache::EraseQuery(Query* query) { CHECK_GT(size_, 0u); --size_; - const QueryStringList& query_strings = query_string->query_string_list_ref(); - query_string->RemoveAndDelete(); - if (query_strings.list.empty()) { - const HttpNoVarySearchData& nvs_data_ref = *query_strings.nvs_data_ref; - const BaseURLCacheKey& key_ref = *query_strings.key_ref; - const auto map_it = map_.find(key_ref); - CHECK(map_it != map_.end()); - const size_t removed_count = map_it->second.erase(nvs_data_ref); - CHECK_EQ(removed_count, 1u); - if (map_it->second.empty()) { - map_.erase(map_it); - } + Queries& queries = query->queries(); + const std::string& canonicalized_query = query->canonicalized_query(); + const auto query_map_it = queries.query_map.find(canonicalized_query); + CHECK(query_map_it != queries.query_map.end()); + queries.query_map.erase(query_map_it); + if (!queries.query_map.empty()) { + return; } + + // The Queries object is now empty, so we should delete it from its parent + // map. First we have to find its parent map. + const HttpNoVarySearchData& nvs_data = *queries.nvs_data_ptr; + const std::string& base_url = *queries.base_url_ptr; + const std::string& partition_key = *queries.cache_partition_key_ptr; + + const auto partition_it = partitions_.find(partition_key); + CHECK(partition_it != partitions_.end()); + auto& base_url_map = partition_it->second; + const auto base_url_it = base_url_map.find(base_url); + CHECK(base_url_it != base_url_map.end()); + NVSDataToQueriesMap& nvs_data_to_queries_map = base_url_it->second; + const auto data_it = nvs_data_to_queries_map.find(nvs_data); + CHECK(data_it != nvs_data_to_queries_map.end()); + + nvs_data_to_queries_map.erase(data_it); + if (!nvs_data_to_queries_map.empty()) { + return; + } + + base_url_map.erase(base_url_it); + if (!base_url_map.empty()) { + return; + } + + partitions_.erase(partition_it); } void NoVarySearchCache::DoInsert(const GURL& url, - const GURL& base_url, - std::string base_url_cache_key, + std::string partition_key, + std::string base_url, HttpNoVarySearchData nvs_data, - std::optional query, + std::optional query, base::Time update_time, Journal* journal) { - const BaseURLCacheKey cache_key(std::move(base_url_cache_key)); - const auto [it, _] = map_.try_emplace(std::move(cache_key)); - const BaseURLCacheKey& cache_key_ref = it->first; - DataMapType& data_map = it->second; - const auto [data_it, inserted] = - data_map.emplace(std::move(nvs_data), it->first); - const HttpNoVarySearchData& nvs_data_ref = data_it->first; - QueryStringList& query_strings = data_it->second; + auto [partition_it, partition_inserted] = + partitions_.try_emplace(std::move(partition_key), BaseUrlToNVSDataMap()); + auto& [cache_partition_key_ref, base_url_map] = *partition_it; + CHECK(partition_inserted || !base_url_map.empty()); - const auto call_journal = [journal, &cache_key_ref, &nvs_data_ref, - update_time](const QueryString* query_string) { + auto [base_url_it, base_url_inserted] = + base_url_map.try_emplace(std::move(base_url), NVSDataToQueriesMap()); + auto& [base_url_ref, nvs_data_to_queries_map] = *base_url_it; + CHECK(base_url_inserted || !nvs_data_to_queries_map.empty()); + + auto [nvs_data_it, nvs_data_inserted] = + nvs_data_to_queries_map.try_emplace(std::move(nvs_data), Queries()); + auto& [nvs_data_ref, queries] = *nvs_data_it; + if (nvs_data_inserted) { + queries.nvs_data_ptr = &nvs_data_ref; + queries.base_url_ptr = &base_url_ref; + queries.cache_partition_key_ptr = &cache_partition_key_ref; + } else { + CHECK(!queries.query_map.empty()); + CHECK_EQ(queries.nvs_data_ptr, &nvs_data_ref); + CHECK_EQ(queries.base_url_ptr, &base_url_ref); + CHECK_EQ(queries.cache_partition_key_ptr, &cache_partition_key_ref); + } + + auto call_journal = [&journal, &cache_partition_key_ref, &base_url_ref, + &nvs_data_ref, + update_time](const std::optional& query) { if (journal) { - journal->OnInsert(cache_key_ref.value(), nvs_data_ref, - query_string->query(), update_time); + journal->OnInsert(cache_partition_key_ref, base_url_ref, nvs_data_ref, + query, update_time); } }; + const std::string canonicalized_query = nvs_data_ref.CanonicalizeQuery(url); + auto [query_it, query_inserted] = + queries.query_map.try_emplace(canonicalized_query, nullptr); + if (!query_inserted) { + // There was already an entry for this `canonicalized_query`. We need + // to check if it is an exact match for the URL we're trying to insert. If + // it is, we don't need to replace it. + auto& query_ptr = query_it->second; + if (query_ptr->query() == query) { + // It's an exact match. Just mark as freshly updated and used. + query_ptr->set_update_time(update_time); + query_ptr->MoveToHead(lru_); - if (inserted) { - query_strings.nvs_data_ref = &nvs_data_ref; - } else { - // There was already an entry for this `nvs_data`. We need to check if it - // has a match for the URL we're trying to insert. If it does, we should - // update or replace the existing QueryString. - if (auto result = - FindQueryStringInList(query_strings, base_url, url, nvs_data_ref)) { - QueryString* match = result->match; - if (match->query() == query) { - // In the exact match case we can use the existing QueryString object. - match->set_update_time(update_time); - match->MoveToHead(query_strings.list); - match->MoveToHead(lru_); - call_journal(match); - return; - } + call_journal(query_ptr->query()); - // No-Vary-Search matches are transitive. Any future requests that might - // be a match for `match` are also a match for `url`. Since `url` is newer - // we will prefer it, and so `match` will never be used again and we can - // safely remove it from the cache. - --size_; - match->RemoveAndDelete(); + return; } + + // Otherwise, replace it with a newly-created Query. + query_ptr = nullptr; + CHECK_GT(size_, 0u); + --size_; } + auto& [canonicalized_query_ref, query_ptr] = *query_it; + query_ptr = Query::CreateAndInsert(std::move(query), lru_, update_time, + &canonicalized_query_ref, &queries); CHECK_LE(size_, max_size_); ++size_; - auto* query_string = - QueryString::CreateAndInsert(query, query_strings, lru_, update_time); - call_journal(query_string); + call_journal(query_ptr->query()); EvictIfOverfull(); } void NoVarySearchCache::ReconstructURLAndDoInsert( - const GURL& base_url, - std::string base_url_cache_key, + std::string partition_key, + std::string base_url, HttpNoVarySearchData nvs_data, std::optional query, base::Time update_time, Journal* journal) { const GURL url = ReconstructOriginalURLFromQuery(base_url, query); - DoInsert(url, base_url, std::move(base_url_cache_key), std::move(nvs_data), - std::move(query), update_time, journal); + DoInsert(url, std::move(partition_key), std::move(base_url), + std::move(nvs_data), std::move(query), update_time, journal); } // static -void NoVarySearchCache::FindQueryStringsInTimeRange( - DataMapType& data_map, +void NoVarySearchCache::FindQuerysInTimeRange( + NVSDataToQueriesMap& nvs_data_to_queries_map, base::Time delete_begin, base::Time delete_end, - std::vector& matches) { - for (auto& [_, query_string_list] : data_map) { - ForEachQueryString(query_string_list.list, [&](QueryString* query_string) { - const base::Time update_time = query_string->update_time(); + std::vector& matches) { + for (auto& [_, queries] : nvs_data_to_queries_map) { + ForEachQuery(queries, [&](Query* query) { + const base::Time update_time = query->update_time(); if ((delete_begin.is_null() || delete_begin <= update_time) && (delete_end.is_max() || delete_end > update_time)) { - matches.push_back(query_string); + matches.push_back(query); } }); } } // static -std::optional -NoVarySearchCache::FindQueryStringInList(QueryStringList& query_strings, - const GURL& base_url, - const GURL& url, - const HttpNoVarySearchData& nvs_data) { - for (auto* node = query_strings.list.head(); node != query_strings.list.end(); - node = node->next()) { - QueryString* query_string = node->value()->ToQueryString(); - // TODO(crbug.com/382394774): Stop allocating GURLs in a tight loop. - GURL node_url = query_string->ReconstructOriginalURL(base_url); - CHECK(node_url.is_valid()); - if (nvs_data.AreEquivalent(url, node_url)) { - return FindQueryStringResult(query_string, std::move(node_url)); - } - } - return std::nullopt; +NoVarySearchCache::Query* NoVarySearchCache::FindQuery( + CanonicalizedQueryToQueryMap& query_map, + const GURL& url, + const HttpNoVarySearchData& nvs_data) { + const std::string canonicalized_query = nvs_data.CanonicalizeQuery(url); + return base::FindPtrOrNull(query_map, std::move(canonicalized_query)); } // static -void NoVarySearchCache::ForEachQueryString( - base::LinkedList& list, - base::FunctionRef f) { - for (auto* node = list.head(); node != list.end(); node = node->next()) { - QueryString* query_string = node->value()->ToQueryString(); - f(query_string); - } -} - -// static -void NoVarySearchCache::ForEachQueryString( - const base::LinkedList& list, - base::FunctionRef f) { - for (auto* node = list.head(); node != list.end(); node = node->next()) { - const QueryString* query_string = node->value()->ToQueryString(); - f(query_string); +void NoVarySearchCache::ForEachQuery(Queries& queries, + base::FunctionRef f) { + for (auto& [_, query_ptr] : queries.query_map) { + f(query_ptr.get()); } } template <> -struct PickleTraits { - static void Serialize( - base::Pickle& pickle, - const NoVarySearchCache::QueryStringList& query_strings) { - // base::LinkedList doesn't keep an element count, so we need to count them - // ourselves. - size_t size = 0u; - for (auto* node = query_strings.list.head(); - node != query_strings.list.end(); node = node->next()) { - ++size; - } - WriteToPickle(pickle, base::checked_cast(size)); - NoVarySearchCache::ForEachQueryString( - query_strings.list, - [&](const NoVarySearchCache::QueryString* query_string) { - WriteToPickle(pickle, query_string->query_, - query_string->update_time_); - }); +struct PickleTraits> { + using Query = NoVarySearchCache::Query; + + static void Serialize(base::Pickle& pickle, + const std::unique_ptr& query) { + WriteToPickle(pickle, query->query(), query->update_time()); } - static std::optional Deserialize( + static std::optional> Deserialize( base::PickleIterator& iter) { - NoVarySearchCache::QueryStringList query_string_list; - size_t size = 0; - if (!iter.ReadLength(&size)) { - return std::nullopt; - } - for (size_t i = 0; i < size; ++i) { - // QueryString is not movable or copyable, so it won't work well with - // PickleTraits. Deserialize it inline instead. - auto result = - ReadValuesFromPickle, base::Time>(iter); - if (!result) { - return std::nullopt; - } - auto [query, update_time] = std::move(result).value(); - if (query && query->find('#') != std::string_view::npos) { - // A '#' character must not appear in the query. - return std::nullopt; - } - auto* query_string = new NoVarySearchCache::QueryString( - std::move(query), query_string_list, update_time); - // Serialization happens from head to tail, so to deserialize in the same - // order, we add elements at the tail of the list. - query_string_list.list.Append(query_string); - } - return query_string_list; + return Query::Deserialize(iter); } - static size_t PickleSize( - const NoVarySearchCache::QueryStringList& query_strings) { - size_t estimate = EstimatePickleSize(int{}); - NoVarySearchCache::ForEachQueryString( - query_strings.list, - [&](const NoVarySearchCache::QueryString* query_string) { - estimate += EstimatePickleSize(query_string->query_, - query_string->update_time_); - }); - return estimate; + static size_t PickleSize(const std::unique_ptr& query) { + return EstimatePickleSize(query->query(), query->update_time()); } }; template <> -struct PickleTraits { +struct PickleTraits { static void Serialize(base::Pickle& pickle, - const NoVarySearchCache::BaseURLCacheKey& key) { - WriteToPickle(pickle, *key); + const NoVarySearchCache::Queries& queries) { + WriteToPickle(pickle, queries.query_map); } - static std::optional Deserialize( + static std::optional Deserialize( base::PickleIterator& iter) { - NoVarySearchCache::BaseURLCacheKey key; - if (!ReadPickleInto(iter, *key)) { + NoVarySearchCache::Queries queries; + if (!ReadPickleInto(iter, queries.query_map)) { return std::nullopt; } - return key; + return queries; } - static size_t PickleSize(const NoVarySearchCache::BaseURLCacheKey& key) { - return EstimatePickleSize(*key); + static size_t PickleSize(const NoVarySearchCache::Queries& queries) { + return EstimatePickleSize(queries.query_map); } }; @@ -830,7 +757,7 @@ void PickleTraits::Serialize( // `lru_` is reconstructed during deserialization and so doesn't need to be // stored explicitly. - WriteToPickle(pickle, size_as_int, max_size_as_int, cache.map_); + WriteToPickle(pickle, size_as_int, max_size_as_int, cache.partitions_); } // static @@ -853,34 +780,37 @@ std::optional PickleTraits::Deserialize( NoVarySearchCache cache(max_size); cache.size_ = size; - if (!ReadPickleInto(iter, cache.map_)) { + if (!ReadPickleInto(iter, cache.partitions_)) { return std::nullopt; } - using QueryString = NoVarySearchCache::QueryString; - // Get a list of every QueryString object in the map so that we can sort + using Query = NoVarySearchCache::Query; + // Get a list of every Query object in the map so that we can sort // them to reconstruct the `lru_` list. std::multimap is used here as a // workaround for the excessive binary size cost of std::sort. - std::multimap all_query_strings; - for (auto& [base_url_cache_key, data_map] : cache.map_) { - for (auto& [nvs_data, query_string_list] : data_map) { - query_string_list.nvs_data_ref = &nvs_data; - query_string_list.key_ref = &base_url_cache_key; - NoVarySearchCache::ForEachQueryString( - query_string_list.list, [&](QueryString* query_string) { - all_query_strings.emplace(query_string->update_time(), - query_string); - }); + std::multimap all_queries; + for (auto& [cache_partition_key, base_url_map] : cache.partitions_) { + for (auto& [base_url_ref, nvs_data_to_queries_map] : base_url_map) { + for (auto& [nvs_data, queries] : nvs_data_to_queries_map) { + queries.nvs_data_ptr = &nvs_data; + queries.base_url_ptr = &base_url_ref; + queries.cache_partition_key_ptr = &cache_partition_key; + for (auto& [canonicalized_query, query_ptr] : queries.query_map) { + query_ptr->set_canonicalized_query(&canonicalized_query); + query_ptr->set_queries(&queries); + all_queries.emplace(query_ptr->update_time(), query_ptr.get()); + } + } } } - if (size != all_query_strings.size()) { + if (size != all_queries.size()) { return std::nullopt; } // Insert each entry at the head of the list, so that the oldest entry ends // up at the tail. - for (auto [_, qs] : all_query_strings) { - qs->LruNode::InsertBefore(cache.lru_.head()); + for (auto [_, qs] : all_queries) { + qs->InsertBefore(cache.lru_.head()); } return cache; @@ -890,7 +820,7 @@ std::optional PickleTraits::Deserialize( size_t PickleTraits::PickleSize( const NoVarySearchCache& cache) { // `size_` and `max_size_` are pickled as ints. - return EstimatePickleSize(int{}, int{}, cache.map_); + return EstimatePickleSize(int{}, int{}, cache.partitions_); } } // namespace net diff --git a/naiveproxy/src/net/http/no_vary_search_cache.h b/naiveproxy/src/net/http/no_vary_search_cache.h index 1f0c7f2bd0..d3e4a77cc0 100644 --- a/naiveproxy/src/net/http/no_vary_search_cache.h +++ b/naiveproxy/src/net/http/no_vary_search_cache.h @@ -7,8 +7,7 @@ #include -#include -#include +#include #include #include #include @@ -21,14 +20,18 @@ #include "base/memory/raw_ptr.h" #include "base/memory/stack_allocated.h" #include "base/memory/weak_ptr.h" -#include "base/types/strong_alias.h" #include "net/base/does_url_match_filter.h" #include "net/base/net_export.h" #include "net/base/pickle_traits.h" #include "net/http/http_no_vary_search_data.h" #include "net/http/http_request_info.h" +#include "third_party/abseil-cpp/absl/container/node_hash_map.h" #include "url/gurl.h" +namespace base { +class Time; +} + namespace net { class HttpResponseHeaders; @@ -42,16 +45,13 @@ class HttpResponseHeaders; // Owned by net::HttpCache. // // Ignoring eviction, the data structure is approximately equivalent to -// std::map, -// std::list>. -// -// BaseURLCacheKey is the output of the HttpCache key algorithm run on the base -// URL (everything before the "?"). So it incorporates the NetworkIsolationKey -// when split cache is enabled. +// std::map, +// std::unique_ptr>. class NET_EXPORT_PRIVATE NoVarySearchCache { private: // Declared here so that it can be mentioned in the definition of EraseHandle. - class QueryString; + class Query; public: // Opaque object that permits erasure of an item from the cache. @@ -74,11 +74,11 @@ class NET_EXPORT_PRIVATE NoVarySearchCache { private: friend class NoVarySearchCache; - friend class QueryString; + friend class Query; - explicit EraseHandle(base::WeakPtr query_string); + explicit EraseHandle(base::WeakPtr query_string); - base::WeakPtr query_string_; + base::WeakPtr query_; }; // An interface for receiving notifications about changes to the @@ -96,13 +96,15 @@ class NET_EXPORT_PRIVATE NoVarySearchCache { // Called when an entry is inserted or refreshed by the MaybeInsert() // method. Not called when MaybeInsert() results in no changes to the // database. Also called by MergeFrom() for each merged entry. - virtual void OnInsert(const std::string& base_url_cache_key, + virtual void OnInsert(const std::string& partition_key, + const std::string& base_url, const HttpNoVarySearchData& nvs_data, const std::optional& query, base::Time update_time) = 0; // Called when an entry is erased by the Erase() method. - virtual void OnErase(const std::string& base_url_cache_key, + virtual void OnErase(const std::string& partition_key, + const std::string& base_url, const HttpNoVarySearchData& nvs_data, const std::optional& query) = 0; @@ -137,6 +139,8 @@ class NET_EXPORT_PRIVATE NoVarySearchCache { // from this cache if it was not in the disk cache. Not const because it // updates the LRU linked list to mark the entry as recently used. std::optional Lookup(const HttpRequestInfo& request); + std::optional Lookup(const HttpRequestInfo& request, + bool& out_base_url_matched); // Inserts `url` into the cache if a non-default "No-Vary-Search" header was // found in `headers`. On insertion, will remove any existing matching entry @@ -173,15 +177,16 @@ class NET_EXPORT_PRIVATE NoVarySearchCache { // Adds the specified entry to the cache as if by MaybeInsert(), evicting an // older entry if the cache is full. The entry is treated as if newly used for // the purposes of eviction. For use when replaying journalled entries. The - // arguments are expected to match a previous call to Journal::OnInsert() - // from a different instance of NoVarySearchCache, but with the same settings - // for cache partitioning. It can also be called with other valid arguments - // for testing. If a valid base URL cannot be extracted from - // `base_url_cache_key`, or `query` contains an invalid character, the call is - // ignored. This will never happen if the arguments are unchanged from a call - // to Journal::OnInsert() with the same partitioning. A valid base URL does - // not contain a query or a fragment. Journal methods are not called. - void ReplayInsert(std::string base_url_cache_key, + // arguments are expected to match a previous call to Journal::OnInsert() from + // a different instance of NoVarySearchCache, but with the same settings for + // cache partitioning. It can also be called with other valid arguments for + // testing. If`base_url` is not a valid base URL, or `query` contains an + // invalid character, the call is ignored. This will never happen if the + // arguments are unchanged from a call to Journal::OnInsert() with the same + // partitioning. A valid base URL does not contain a query or a fragment. + // Journal methods are not called. + void ReplayInsert(std::string partition_key, + std::string base_url, HttpNoVarySearchData nvs_data, std::optional query, base::Time update_time); @@ -192,7 +197,8 @@ class NET_EXPORT_PRIVATE NoVarySearchCache { // NoVarySearchCache, with the same settings for cache partitioning // base::Features. If `query` is not found the call silently // does nothing. Journal methods are not called. - void ReplayErase(const std::string& base_url_cache_key, + void ReplayErase(const std::string& partition_key, + const std::string& base_url, const HttpNoVarySearchData& nvs_data, const std::optional& query); @@ -216,121 +222,115 @@ class NET_EXPORT_PRIVATE NoVarySearchCache { private: friend struct PickleTraits; + friend struct PickleTraits>; - struct QueryStringList; - friend struct PickleTraits; + // All the maps use absl::node_hash_map rather than absl::flat_hash_map + // because pointer stability for the keys is needed in order to be able to + // erase a Query object by its pointer. + using CanonicalizedQueryToQueryMap = + absl::node_hash_map>; + friend struct PickleTraits; - using BaseURLCacheKey = - base::StrongAlias; - friend struct PickleTraits; + struct Queries { + CanonicalizedQueryToQueryMap query_map; + // In order to erase a Query from the cache, we need to be able to + // find the map entries that contain it. To do this we have pointers back to + // the keys. + raw_ptr nvs_data_ptr = nullptr; + raw_ptr base_url_ptr = nullptr; + raw_ptr cache_partition_key_ptr = nullptr; - class LruNode; - class QueryStringListNode; + Queries(); + ~Queries(); - struct QueryStringList { - base::LinkedList list; - // nvs_data_ref can't be raw_ref because it needs to be lazily initialized - // after the QueryStringList has been added to the map. - raw_ptr nvs_data_ref = nullptr; + // `query_map` is not copyable because the values are unique_ptrs. + Queries(const Queries&) = delete; + Queries& operator=(const Queries&) = delete; - // key_ref can't be raw_ref because it needs to be added in a second pass - // during deserialization. - raw_ptr key_ref = nullptr; - - // The referent of this reference has to be the actual key in the map. It is - // not sufficient for the value to match, because the lifetime has to be the - // same. - explicit QueryStringList(const BaseURLCacheKey& key); - - // Needed during deserialization. - QueryStringList(); - - // Only used during deserialization. This is O(N) in the size of `list`. - QueryStringList(QueryStringList&&); - - // base::LinkedList<> does not do memory management, so make sure the - // contents of `list` are deleted on destruction. - ~QueryStringList(); + // It is movable. + Queries(Queries&&); + Queries& operator=(Queries&&) = default; }; + friend struct PickleTraits; - struct FindQueryStringResult { - STACK_ALLOCATED(); // `match` doesn't need to be raw_ptr. - - public: - QueryString* match; - GURL original_url; - }; - - // TODO(crbug.com/382394774): Investigate performance of different map types. - using DataMapType = std::map; - using OuterMapType = std::map>; + using NVSDataToQueriesMap = + absl::node_hash_map; + using BaseUrlToNVSDataMap = + absl::node_hash_map; + using CachePartitionKeyToBaseUrlMap = + absl::node_hash_map; // Erases an entry from the cache if `size_ > max_size_`. void EvictIfOverfull(); // Erases `query_string` from the cache. - void EraseQuery(QueryString* query_string); + void EraseQuery(Query* query_string); - // Inserts `query` or marks it as used in the cache. evicting an older entry + // Inserts `query` or marks it as used in the cache, evicting an older entry // if necessary to make space. `journal` is notified if set. void DoInsert(const GURL& url, - const GURL& base_url, - std::string base_url_cache_key, + std::string cache_partition_key, + std::string base_url, HttpNoVarySearchData nvs_data, - std::optional query, + std::optional query, base::Time update_time, Journal* journal); // A convenience method for callers that do not have the original URL handy. // Reconstructs the original URL and then calls DoInsert(). - void ReconstructURLAndDoInsert(const GURL& base_url, - std::string base_url_cache_key, + void ReconstructURLAndDoInsert(std::string partition_key, + std::string base_url, HttpNoVarySearchData nvs_data, std::optional query, base::Time update_time, Journal* journal); - // Scans all the QueryStrings in `data_map` to find ones in the range + // Scans all the Query objects in `data_map` to find ones in the range // [delete_begin, delete_end) and appends them to `matches`. `data_map` is - // mutable to reflect that it is returning mutable pointers to QueryString - // objects that it owns. The returned QueryString objects are mutable so the - // caller can erase them. - static void FindQueryStringsInTimeRange(DataMapType& data_map, - base::Time delete_begin, - base::Time delete_end, - std::vector& matches); + // mutable to reflect that it is returning mutable pointers to Query objects + // that it owns. The returned Query objects are mutable so the caller can + // erase them. + static void FindQuerysInTimeRange(NVSDataToQueriesMap& data_map, + base::Time delete_begin, + base::Time delete_end, + std::vector& matches); - static std::optional FindQueryStringInList( - QueryStringList& query_strings, - const GURL& base, - const GURL& url, - const HttpNoVarySearchData& nvs_data); + // Find a Query matching the query part of `url` based on the rules in + // `nvs_data` if one exists, or returns nullptr. + static Query* FindQuery(CanonicalizedQueryToQueryMap& query_map, + const GURL& url, + const HttpNoVarySearchData& nvs_data); - // Calls f(query_string_ptr) for every QueryString in `list`. - static void ForEachQueryString(base::LinkedList& list, - base::FunctionRef f); + // Calls f(query_string_ptr) for every Query in `queries`. + static void ForEachQuery(Queries& queries, base::FunctionRef f); - // Calls f(const_query_string_ptr) for every QueryString in `list`. - static void ForEachQueryString( - const base::LinkedList& list, - base::FunctionRef f); + // The main cache data structure. The key is the cache partition key as + // generated by HttpCache::GenerateCachePartitionKeyForRequest(). The value is + // a map with base URL stringified as keys. The value of that map is another + // map with NoVarySearchData objects as keys, and the value of that map is + // another map with canonicalized query strings as keys. That map has Query + // objects as keys. + // CachePartitionKey (std::string) -> + // Base URL (std::string) -> + // NVS data (NoVarySearchData) -> + // Canonicalized query (std::string) -> Query object + CachePartitionKeyToBaseUrlMap partitions_; - // The main cache data structure. - OuterMapType map_; + // lru_.tail() is the least-recently-used Query. + base::LinkedList lru_; - // lru_.tail() is the least-recently-used QueryString. - base::LinkedList lru_; - - // The number of QueryString objects in the cache. + // The number of Query objects in the cache. size_t size_ = 0u; - // QueryString objects will be evicted to avoid exceeding `max_size_`. + // Query objects will be evicted to avoid exceeding `max_size_`. const size_t max_size_; // An object to be notified about changes to this cache. raw_ptr journal_ = nullptr; }; +// Specialization of PickleTraits needed for serializing and deserializing +// NoVarySearchCache objects. template <> struct NET_EXPORT_PRIVATE PickleTraits { static void Serialize(base::Pickle& pickle, const NoVarySearchCache& cache); diff --git a/naiveproxy/src/net/http/no_vary_search_cache_storage.cc b/naiveproxy/src/net/http/no_vary_search_cache_storage.cc index fecb790498..d85b1f3649 100644 --- a/naiveproxy/src/net/http/no_vary_search_cache_storage.cc +++ b/naiveproxy/src/net/http/no_vary_search_cache_storage.cc @@ -25,7 +25,6 @@ #include "base/task/thread_pool.h" #include "base/time/time.h" #include "base/types/cxx23_to_underlying.h" -#include "net/base/features.h" #include "net/base/pickle.h" #include "net/base/pickle_base_types.h" #include "net/base/pickle_traits.h" @@ -357,11 +356,6 @@ class NoVarySearchCacheStorage::Loader final { return GiveUp(Result::kOperationsInitFailed); } - if (features::kHttpCacheNoVarySearchFakePersistence.Get()) { - std::ignore = StartFromScratch(Result::kSnapshotLoadFailed); - return base::unexpected(LoadFailed::kCannotJournal); - } - auto maybe_load_result = operations_->Load(kSnapshotFilename, kMaxFileSize); if (!maybe_load_result.has_value()) { base::UmaHistogramExactLinear("HttpCache.NoVarySearch.SnapshotLoadError", @@ -468,17 +462,18 @@ class NoVarySearchCacheStorage::Loader final { } switch (maybe_type.value()) { case JournalEntryType::kInsert: { - std::string base_url_cache_key; + std::string partition_key; + std::string base_url; auto nvs_data = CreateHttpNoVarySearchData(); std::optional query; base::Time update_time; - if (!ReadPickleInto(iter, base_url_cache_key, nvs_data, query, + if (!ReadPickleInto(iter, partition_key, base_url, nvs_data, query, update_time) || !iter.ReachedEnd()) { had_error = true; break; } - cache_->ReplayInsert(std::move(base_url_cache_key), + cache_->ReplayInsert(std::move(partition_key), std::move(base_url), std::move(nvs_data), std::move(query), update_time); ++replayed_journal_entries; @@ -486,15 +481,16 @@ class NoVarySearchCacheStorage::Loader final { } case JournalEntryType::kErase: { - std::string base_url_cache_key; + std::string partition_key; + std::string base_url; auto nvs_data = CreateHttpNoVarySearchData(); std::optional query; - if (!ReadPickleInto(iter, base_url_cache_key, nvs_data, query) || + if (!ReadPickleInto(iter, partition_key, base_url, nvs_data, query) || !iter.ReachedEnd()) { had_error = true; break; } - cache_->ReplayErase(base_url_cache_key, nvs_data, query); + cache_->ReplayErase(partition_key, base_url, nvs_data, query); ++replayed_journal_entries; break; } @@ -634,23 +630,25 @@ void NoVarySearchCacheStorage::TakeSnapshot() { base::Unretained(journal_.get()), std::move(pickle))); } -void NoVarySearchCacheStorage::OnInsert(const std::string& base_url_cache_key, +void NoVarySearchCacheStorage::OnInsert(const std::string& partition_key, + const std::string& base_url, const HttpNoVarySearchData& nvs_data, const std::optional& query, base::Time update_time) { base::Pickle pickle; - WriteToPickle(pickle, JournalEntryType::kInsert, base_url_cache_key, nvs_data, - query, update_time); + WriteToPickle(pickle, JournalEntryType::kInsert, partition_key, base_url, + nvs_data, query, update_time); AppendToJournal(std::move(pickle)); } void NoVarySearchCacheStorage::OnErase( - const std::string& base_url_cache_key, + const std::string& partition_key, + const std::string& base_url, const HttpNoVarySearchData& nvs_data, const std::optional& query) { base::Pickle pickle; - WriteToPickle(pickle, JournalEntryType::kErase, base_url_cache_key, nvs_data, - query); + WriteToPickle(pickle, JournalEntryType::kErase, partition_key, base_url, + nvs_data, query); AppendToJournal(std::move(pickle)); } diff --git a/naiveproxy/src/net/http/no_vary_search_cache_storage.h b/naiveproxy/src/net/http/no_vary_search_cache_storage.h index 61aeca7dba..aaad51e7ad 100644 --- a/naiveproxy/src/net/http/no_vary_search_cache_storage.h +++ b/naiveproxy/src/net/http/no_vary_search_cache_storage.h @@ -44,12 +44,12 @@ class NET_EXPORT_PRIVATE NoVarySearchCacheStorage final static constexpr std::string_view kJournalFilename = "journal.baj"; // Generated by the command: - // echo "snapshot.baf version 1" | md5sum | cut -b 1-8 - static constexpr uint32_t kSnapshotMagicNumber = 0x4b17c1ee; + // echo "snapshot.baf version 2" | md5sum | cut -b 1-8 + static constexpr uint32_t kSnapshotMagicNumber = 0x62f965ce; // Generated by the command: - // echo "journal.baj version 1" | md5sum | cut -b 1-8 - static constexpr uint32_t kJournalMagicNumber = 0x984b3c4d; + // echo "journal.baj version 2" | md5sum | cut -b 1-8 + static constexpr uint32_t kJournalMagicNumber = 0x24467e06; // Max file size. We won't try to load a file larger than this. We don't // expect the database to ever get this big. @@ -95,14 +95,16 @@ class NET_EXPORT_PRIVATE NoVarySearchCacheStorage final // Serializes the arguments and posts a task to `journal_` to append the // result to the journal. - void OnInsert(const std::string& base_url_cache_key, + void OnInsert(const std::string& partition_key, + const std::string& base_url, const HttpNoVarySearchData& nvs_data, const std::optional& query, base::Time update_time) override; // Serializes the arguments and posts a task to `journal_` to append to the // journal. - void OnErase(const std::string& base_url_cache_key, + void OnErase(const std::string& partition_key, + const std::string& base_url, const HttpNoVarySearchData& nvs_data, const std::optional& query) override; diff --git a/naiveproxy/src/net/http/no_vary_search_cache_test_utils.h b/naiveproxy/src/net/http/no_vary_search_cache_test_utils.h index 34e65d6e2b..15d60aecb4 100644 --- a/naiveproxy/src/net/http/no_vary_search_cache_test_utils.h +++ b/naiveproxy/src/net/http/no_vary_search_cache_test_utils.h @@ -51,7 +51,7 @@ void Insert(NoVarySearchCache& cache, std::string_view query, std::string_view no_vary_search); -// Returns true if a URL matching `query` was foind in `cache`. Marks the entry +// Returns true if a URL matching `query` was found in `cache`. Marks the entry // as recently used as a side-effect. bool Exists(NoVarySearchCache& cache, std::string_view query); diff --git a/naiveproxy/src/net/http/partial_data.cc b/naiveproxy/src/net/http/partial_data.cc index b115d7ceee..eeef3456b4 100644 --- a/naiveproxy/src/net/http/partial_data.cc +++ b/naiveproxy/src/net/http/partial_data.cc @@ -36,8 +36,8 @@ PartialData::PartialData() = default; PartialData::~PartialData() = default; bool PartialData::Init(const HttpRequestHeaders& headers) { - std::optional range_header = - headers.GetHeader(HttpRequestHeaders::kRange); + std::optional range_header = + headers.GetHeaderView(HttpRequestHeaders::kRange); if (!range_header) { range_requested_ = false; return false; @@ -188,17 +188,20 @@ bool PartialData::UpdateFromStoredHeaders(const HttpResponseHeaders* headers, DCHECK_EQ(headers->response_code(), 200); // We don't have the real length and the user may be trying to create a // sparse entry so let's not write to this entry. - if (byte_range_.IsValid()) + if (byte_range_.IsValid()) { return false; + } - if (!headers->HasStrongValidators()) + if (!headers->HasStrongValidators()) { return false; + } // Now we avoid resume if there is no content length, but that was not // always the case so double check here. - int64_t total_length = headers->GetContentLength(); - if (total_length <= 0) + std::optional total_length = headers->GetContentLength(); + if (!total_length || total_length->is_zero()) { return false; + } // In case we see a truncated entry, we first send a network request for // 1 byte range with If-Range: to probe server support for resumption. @@ -218,7 +221,7 @@ bool PartialData::UpdateFromStoredHeaders(const HttpResponseHeaders* headers, sparse_entry_ = false; int current_len = entry->GetDataSize(kDataStream); byte_range_.set_first_byte_position(current_len); - resource_size_ = total_length; + resource_size_ = total_length->InBytes(); current_range_start_ = current_len; cached_min_len_ = current_len; cached_start_ = current_len + 1; @@ -238,11 +241,13 @@ bool PartialData::UpdateFromStoredHeaders(const HttpResponseHeaders* headers, // it's for a particular range only); while GetDataSize would be unusable // since the data is stored using WriteSparseData, and not in the usual data // stream. - resource_size_ = headers->GetContentLength(); - if (resource_size_ <= 0) + std::optional content_length = headers->GetContentLength(); + resource_size_ = content_length ? content_length->InBytes() : -1; + if (resource_size_ <= 0) { return false; + } } else { - // If we can safely use GetDataSize, it's preferrable since it's usable for + // If we can safely use GetDataSize, it's preferable since it's usable for // things w/o Content-Length, such as chunked content. resource_size_ = entry->GetDataSize(kDataStream); } @@ -251,7 +256,7 @@ bool PartialData::UpdateFromStoredHeaders(const HttpResponseHeaders* headers, if (sparse_entry_) { // If our previous is a 206, we need strong validators as we may be - // stiching the cached data and network data together. + // stitching the cached data and network data together. if (!headers->HasStrongValidators()) return false; // Make sure that this is really a sparse entry. @@ -310,9 +315,11 @@ bool PartialData::ResponseHeadersOK(const HttpResponseHeaders* headers) { // A server should return a valid content length with a 206 (per the standard) // but relax the requirement because some servers don't do that. - int64_t content_length = headers->GetContentLength(); - if (content_length > 0 && content_length != end - start + 1) + std::optional content_length = headers->GetContentLength(); + if (content_length && content_length->is_positive() && + content_length->InBytes() != end - start + 1) { return false; + } if (!resource_size_) { // First response. Update our values with the ones provided by the server. @@ -321,8 +328,9 @@ bool PartialData::ResponseHeadersOK(const HttpResponseHeaders* headers) { byte_range_.set_first_byte_position(start); current_range_start_ = start; } - if (!byte_range_.HasLastBytePosition()) + if (!byte_range_.HasLastBytePosition()) { byte_range_.set_last_byte_position(end); + } } else if (resource_size_ != total_length) { return false; } diff --git a/naiveproxy/src/net/http/proxy_fallback.cc b/naiveproxy/src/net/http/proxy_fallback.cc index a8b1b48e9a..5b2b96722d 100644 --- a/naiveproxy/src/net/http/proxy_fallback.cc +++ b/naiveproxy/src/net/http/proxy_fallback.cc @@ -9,6 +9,7 @@ #include "base/strings/string_number_conversions.h" #include "net/base/net_errors.h" #include "net/base/proxy_chain.h" +#include "net/base/proxy_delegate.h" #include "net/base/proxy_server.h" namespace net { @@ -16,8 +17,16 @@ namespace net { NET_EXPORT bool CanFalloverToNextProxy(const ProxyChain& proxy_chain, int error, int* final_error, - bool is_for_ip_protection) { - if (is_for_ip_protection) { + ProxyDelegate* proxy_delegate) { + if (proxy_delegate) { + std::optional can_fallover = + proxy_delegate->CanFalloverToNextProxyOverride(proxy_chain, error); + if (can_fallover.has_value()) { + return *can_fallover; + } + } + + if (proxy_chain.is_for_ip_protection()) { // Log the error. // Useful to know if errors not handled below are passed to this function. if (const int chain_id = proxy_chain.ip_protection_chain_id(); @@ -75,6 +84,12 @@ NET_EXPORT bool CanFalloverToNextProxy(const ProxyChain& proxy_chain, // ERR_SSL_PROTOCOL_ERROR can happen when trying to talk SSL to a non-SSL // server (like a captive portal). case ERR_SSL_PROTOCOL_ERROR: + // ERR_PROXY_DELEGATE_CANCELED_CONNECT_{REQUEST, RESPONSE} are used by + // ProxyDelegates that rely on a separate entity to decide whether to cancel + // tunnels being established. In these scenarios the expectation is to + // always fall onto the next ProxyChain in the list. + case ERR_PROXY_DELEGATE_CANCELED_CONNECT_REQUEST: + case ERR_PROXY_DELEGATE_CANCELED_CONNECT_RESPONSE: return true; // A failure while establishing a tunnel through the proxy can fail for // reasons related to the request itself (for instance, failing to resolve @@ -92,7 +107,7 @@ NET_EXPORT bool CanFalloverToNextProxy(const ProxyChain& proxy_chain, // similarly don't fallback, and some client's PAC configurations rely on // this for some degree of content blocking. See https://crbug.com/680837 // for details. - return is_for_ip_protection; + return proxy_chain.is_for_ip_protection(); case ERR_SOCKS_CONNECTION_HOST_UNREACHABLE: // Remap the SOCKS-specific "host unreachable" error to a more diff --git a/naiveproxy/src/net/http/proxy_fallback.h b/naiveproxy/src/net/http/proxy_fallback.h index 100ab60c4d..ba44e595f0 100644 --- a/naiveproxy/src/net/http/proxy_fallback.h +++ b/naiveproxy/src/net/http/proxy_fallback.h @@ -47,6 +47,7 @@ namespace net { class ProxyChain; +class ProxyDelegate; // Returns true if a failed request issued through a proxy chain should be // re-tried using the next proxy chain in the fallback list. @@ -61,12 +62,13 @@ class ProxyChain; // - `final_error` is an out parameter that is set with the "final" error to // report to the caller. The error is only re-written in cases where // CanFalloverToNextProxy() returns false. -// - `is_for_ip_protection` is true if this request is to an IP Protection -// proxy. +// - `proxy_delegate` if present, is used to possibly override the return value +// of this function. See ProxyDelegate::CanFalloverToNextProxyOverride +// documentation. NET_EXPORT bool CanFalloverToNextProxy(const ProxyChain& proxy_chain, int error, int* final_error, - bool is_for_ip_protection = false); + net::ProxyDelegate* proxy_delegate); } // namespace net diff --git a/naiveproxy/src/net/http/transport_security_persister.cc b/naiveproxy/src/net/http/transport_security_persister.cc index 88553f5da3..377125a4ba 100644 --- a/naiveproxy/src/net/http/transport_security_persister.cc +++ b/naiveproxy/src/net/http/transport_security_persister.cc @@ -33,7 +33,6 @@ namespace net { BASE_FEATURE(kTransportSecurityFileWriterSchedule, - "TransportSecurityFileWriterSchedule", base::FEATURE_ENABLED_BY_DEFAULT); namespace { @@ -296,8 +295,8 @@ base::TimeDelta TransportSecurityPersister::GetCommitInterval() { void TransportSecurityPersister::Deserialize(const std::string& serialized, TransportSecurityState* state) { - std::optional value = - base::JSONReader::ReadDict(serialized); + std::optional value = base::JSONReader::ReadDict( + serialized, base::JSON_PARSE_CHROMIUM_EXTENSIONS); if (!value) { return; } diff --git a/naiveproxy/src/net/http/transport_security_state_static.pins b/naiveproxy/src/net/http/transport_security_state_static.pins index a7199ae49d..12fa021e10 100644 --- a/naiveproxy/src/net/http/transport_security_state_static.pins +++ b/naiveproxy/src/net/http/transport_security_state_static.pins @@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2025-09-07 12:54 UTC +# Last updated: 2025-12-06 12:56 UTC PinsListTimestamp -1757249642 +1765025792 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= @@ -439,78 +439,6 @@ HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm -----END CERTIFICATE----- -DigiCertEVRoot ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -DigiCertGlobalRoot ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -GlobalSignRootCA ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - GlobalSignExtendedValidationCA -----BEGIN CERTIFICATE----- MIIEmDCCA4CgAwIBAgILBAAAAAABIg08FMUwDQYJKoZIhvcNAQEFBQAwTDEgMB4G @@ -597,458 +525,3 @@ G6M7N97RP23ztpB2Haydb4RPJJQJduCdqE33TTePpC9fS0HkSRaXzHtsrxHKllQJ iyRRrl3tovG7UxBNl/oadwM= -----END CERTIFICATE----- -GlobalSignRootCA_R3 ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -GlobalSignRootCA_R6 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDE -gMB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2 -JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNM -zQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBS -NjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiI -wDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQ -ssgrRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuT -ToVBu1kZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSK -vGRMIRxDaNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n -16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9 -CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJ -Da38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiW -m05OWgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4 -UoQSwC+n+7o/hbguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQ -Ce24DWJfncBZ4nWUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFl -WQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZ -cIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjA -PBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToD -AfBgNVHSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFA -AOCAgEAgyXt6NH9lVLNnsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcW -c+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKP -rmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waN -rlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944 -Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl -+68KnyBr3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU -3/gKbaKxCXcPu9czc8FB10jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTO -wY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsVi -VO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9 -x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDf -LRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - - -GlobalSignRootR46 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAU -AMEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGg -YDVQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2M -DMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24g -bnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb -3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08 -EsCVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUl -ghYruQGvGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTq -a1VbkNud316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/O -rffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPT -Xhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTy -G/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0N -XfeD412lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JM -WKmIJ5jqSngiCNI/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+F -fy7dXxd7Pj2Fxzsx2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7 -/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKg -Gwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQ -H/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIh -vcNAQEMBQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048 -p9gkUbJUHJNOxO97k4VgJuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63b -EIaZHU1VNaL8FpO7XJqti2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6 -Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MV -enQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdk -LG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSy -BQ7N0H3qqJZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7f -XwgNNgyYMqIgXQBztSvwyeqiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJ -Mbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvd -kzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE -9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QE -UxeCp6 ------END CERTIFICATE----- - - -SymantecClass3EVG3 ------BEGIN CERTIFICATE----- -MIIFKzCCBBOgAwIBAgIQfuFKb2/v8tN/P61lTTratDANBgkqhkiG9w0BAQsFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMTMxMDMxMDAwMDAwWhcNMjMxMDMwMjM1OTU5WjB3MQsw -CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV -BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMTH1N5bWFudGVjIENs -YXNzIDMgRVYgU1NMIENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQDYoWV0I+grZOIy1zM3PY71NBZI3U9/hxz4RCMTjvsR2ERaGHGOYBYmkpv9 -FwvhcXBC/r/6HMCqo6e1cej/GIP23xAKE2LIPZyn3i4/DNkd5y77Ks7Imn+Hv9hM -BBUyydHMlXGgTihPhNk1++OGb5RT5nKKY2cuvmn2926OnGAE6yn6xEdC0niY4+wL -pZLct5q9gGQrOHw4CVtm9i2VeoayNC6FnpAOX7ddpFFyRnATv2fytqdNFB5suVPu -IxpOjUhVQ0GxiXVqQCjFfd3SbtICGS97JJRL6/EaqZvjI5rq+jOrCiy39GAI3Z8c -zd0tAWaAr7MvKR0juIrhoXAHDDQPAgMBAAGjggFdMIIBWTAvBggrBgEFBQcBAQQj -MCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9zMi5zeW1jYi5jb20wEgYDVR0TAQH/BAgw -BgEB/wIBADBlBgNVHSAEXjBcMFoGBFUdIAAwUjAmBggrBgEFBQcCARYaaHR0cDov -L3d3dy5zeW1hdXRoLmNvbS9jcHMwKAYIKwYBBQUHAgIwHBoaaHR0cDovL3d3dy5z -eW1hdXRoLmNvbS9ycGEwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3MxLnN5bWNi -LmNvbS9wY2EzLWc1LmNybDAOBgNVHQ8BAf8EBAMCAQYwKQYDVR0RBCIwIKQeMBwx -GjAYBgNVBAMTEVN5bWFudGVjUEtJLTEtNTMzMB0GA1UdDgQWBBQBWavn3ToLWaZk -Y9bPIAdX1ZHnajAfBgNVHSMEGDAWgBR/02Wnwt3su/AwCfNDOfoCrzMxMzANBgkq -hkiG9w0BAQsFAAOCAQEAQgFVe9AWGl1Y6LubqE3X89frE5SG1n8hC0e8V5uSXU8F -nzikEHzPg74GQ0aNCLxq1xCm+quvL2GoY/Jl339MiBKIT7Np2f8nwAqXkY9W+4nE -qLuSLRtzsMarNvSWbCAI7woeZiRFT2cAQMgHVHQzO6atuyOfZu2iRHA0+w7qAf3P -eHTfp61Vt19N9tY/4IbOJMdCqRMURDVLtt/JYKwMf9mTIUvunORJApjTYHtcvNUw -LwfORELEC5n+5p/8sHiGUW3RLJ3GlvuFgrsEL/digO9i2n/2DqyQuFa9eT/ygG6j -2bkPXToHHZGThkspTOHcteHgM52zyzaRS/6htO7w+Q== ------END CERTIFICATE----- - -DigiCertECCSecureServerCA ------BEGIN CERTIFICATE----- -MIIDrDCCApSgAwIBAgIQCssoukZe5TkIdnRw883GEjANBgkqhkiG9w0BAQwFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0xMzAzMDgxMjAwMDBaFw0yMzAzMDgxMjAwMDBaMEwxCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxJjAkBgNVBAMTHURpZ2lDZXJ0IEVDQyBT -ZWN1cmUgU2VydmVyIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE4ghC6nfYJN6g -LGSkE85AnCNyqQIKDjc/ITa4jVMU9tWRlUvzlgKNcR7E2Munn17voOZ/WpIRllNv -68DLP679Wz9HJOeaBy6Wvqgvu1cYr3GkvXg6HuhbPGtkESvMNCuMo4IBITCCAR0w -EgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwNAYIKwYBBQUHAQEE -KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQgYDVR0f -BDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xv -YmFsUm9vdENBLmNybDA9BgNVHSAENjA0MDIGBFUdIAAwKjAoBggrBgEFBQcCARYc -aHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAdBgNVHQ4EFgQUo53mH/naOU/A -buiRy5Wl2jHiCp8wHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJ -KoZIhvcNAQEMBQADggEBAMeKoENL7HTJxavVHzA1Nm6YVntIrAVjrnuaVyRXzG/6 -3qttnMe2uuzO58pzZNvfBDcKAEmzP58mrZGMIOgfiA4q+2Y3yDDo0sIkp0VILeoB -UEoxlBPfjV/aKrtJPGHzecicZpIalir0ezZYoyxBEHQa0+1IttK7igZFcTMQMHp6 -mCHdJLnsnLWSB62DxsRq+HfmNb4TDydkskO/g+l3VtsIh5RHFPVfKK+jaEyDj2D3 -loB5hWp2Jp2VDCADjT7ueihlZGak2YPqmXTNbk19HOuNssWvFhtOyPNV6og4ETQd -Ea8/B6hPatJ0ES8q/HO3X8IVQwVs1n3aAr0im0/T+Xc= ------END CERTIFICATE----- - -FacebookBackup ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtHIqUt4FvcdEZQZqucdY -UEWSMuSIZnRgs0vvyLqb0KmIz8n8WLwifrMzTnrk9ol8EMcuoe4kkntJ3kn4pRIm -2Sdw33nibWBzXJu3zuorFGFZ9fsZLfh1zHIrNAKbjQmjHnD+XJLfPyoRI/3eOcl4 -ArQwdqg5ymAmffy8Zapgrf3tSa6OsOxZF7+dLVfr+zzh2tawfH+kzzS3e0eXyO1x -aSSpcSsFjuB1/cBJDeS/0a1/eLK8KeCWZcb7ev7ge0WnRvkfo+0KxdzSFxTrfjg0 -uy8blcsjtFoq5lG5Ba1982Qzkmot+08ZZQi/QxZ+QARS16YL3KQgJRCb7y+UXmGa -PQIDAQAB ------END PUBLIC KEY----- - -ISRGRootX1 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - - -ISRGRootX2 ------BEGIN CERTIFICATE----- -MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw -CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg -R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 -MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT -ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW -+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 -ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI -zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW -tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 -/q4AaOeMSQ+2b1tbFfLn ------END CERTIFICATE----- - - -# DigiCert Global Root G2 -# https://www.digicert.com/CACerts/DigiCertGlobalRootG2.crt -DigiCertGlobalRootG2 ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# DigiCert Global Root G3 -# https://www.digicert.com/CACerts/DigiCertGlobalRootG3.crt -DigiCertGlobalRootG3 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# DigiCert Trusted Root G4 -# https://www.digicert.com/CACerts/DigiCertTrustedRootG4.crt -DigiCertTrustedRootG4 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -DigiCertTLSRSA4096RootG5 ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBN -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMT -HERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcN -NDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs -IEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS87IE+ -ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG0 -2C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgp -wgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM -pG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RD -nU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6Po -sMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDx -Zre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cd -Lvvyz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvX -KyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNe -XoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPL -tgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfTJc1paPKv -TiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN -AQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw -GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7H -PNtQOa27PShNlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLF -O4uJ+DQtpBflF+aZfTCIITfNMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQ -REtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/u4cnYiWB39yhL/btp/96j1EuMPik -AdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9GOUrYU9DzLjtxpdRv -/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh47a+ -p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilw -MUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF -qUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCK -ovfepEWFJqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+ ------END CERTIFICATE----- - - -DigiCertTLSECCP384RootG5 ------BEGIN CERTIFICATE----- -MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURp -Z2lDZXJ0IFRMUyBFQ0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2 -MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ -bmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNTB2MBAG -ByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1TzvdlHJS -7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp -0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICIS -B4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49 -BAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQ -LgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4 -DXZDjC5Ty3zfDBeWUA== ------END CERTIFICATE----- - - -UserTrustRSACertificationAuthority ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - - -UserTrustECCCertificationAuthority ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - - -ComodoRSACertificationAuthority ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - - -ComodoECCCertificationAuthority ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - - diff --git a/naiveproxy/src/net/http/transport_security_state_static_pins.json b/naiveproxy/src/net/http/transport_security_state_static_pins.json index 782993f614..06bf7a11fe 100644 --- a/naiveproxy/src/net/http/transport_security_state_static_pins.json +++ b/naiveproxy/src/net/http/transport_security_state_static_pins.json @@ -31,7 +31,7 @@ // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets' // refer to, and the timestamp at which the pins list was last updated. // -// Last updated: 2025-09-07 12:54 UTC +// Last updated: 2025-12-06 12:56 UTC // { "pinsets": [ @@ -67,31 +67,6 @@ "GlobalSignExtendedValidationCA_G2", "GlobalSignExtendedValidationCA_SHA256_G2" ] - }, - { - "name": "facebook", - "static_spki_hashes": [ - "ComodoRSACertificationAuthority", - "ComodoECCCertificationAuthority", - "UserTrustRSACertificationAuthority", - "UserTrustECCCertificationAuthority", - "DigiCertGlobalRoot", - "DigiCertGlobalRootG2", - "DigiCertGlobalRootG3", - "DigiCertEVRoot", - "DigiCertTrustedRootG4", - "DigiCertTLSRSA4096RootG5", - "DigiCertTLSECCP384RootG5", - "GlobalSignRootCA", - "GlobalSignRootCA_R3", - "GlobalSignRootCA_R6", - "GlobalSignRootR46", - "ISRGRootX1", - "ISRGRootX2", - "FacebookBackup", - "SymantecClass3EVG3", - "DigiCertECCSecureServerCA" - ] } ], "entries": [ @@ -1909,96 +1884,6 @@ "name": "ytimg.com", "include_subdomains": true, "pins": "google" - }, - { - "name": "facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "www.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "m.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "tablet.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "secure.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "pixel.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "apps.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "upload.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "developers.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "touch.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "mbasic.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "code.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "t.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "mtouch.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "business.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "research.facebook.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "messenger.com", - "include_subdomains": true, - "pins": "facebook" - }, - { - "name": "www.messenger.com", - "include_subdomains": true, - "pins": "facebook" } ] } \ No newline at end of file diff --git a/naiveproxy/src/net/http/transport_security_state_test_util.cc b/naiveproxy/src/net/http/transport_security_state_test_util.cc index 4b257eac45..008183e1ef 100644 --- a/naiveproxy/src/net/http/transport_security_state_test_util.cc +++ b/naiveproxy/src/net/http/transport_security_state_test_util.cc @@ -17,11 +17,6 @@ ScopedTransportSecurityStateSource::ScopedTransportSecurityStateSource() { SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource); } -ScopedTransportSecurityStateSource::ScopedTransportSecurityStateSource( - uint16_t reporting_port) { - SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource); -} - ScopedTransportSecurityStateSource::~ScopedTransportSecurityStateSource() { SetTransportSecurityStateSourceForTesting(nullptr); } diff --git a/naiveproxy/src/net/http/transport_security_state_test_util.h b/naiveproxy/src/net/http/transport_security_state_test_util.h index 446a6ada45..03dfade6b6 100644 --- a/naiveproxy/src/net/http/transport_security_state_test_util.h +++ b/naiveproxy/src/net/http/transport_security_state_test_util.h @@ -15,10 +15,6 @@ class ScopedTransportSecurityStateSource { // the transport_security_state_static_unittest_default source. ScopedTransportSecurityStateSource(); - // Deprecated interface, now does the same as the default constructor. - // TODO(crbug.com/41485778): remove this. - explicit ScopedTransportSecurityStateSource(uint16_t reporting_port); - ScopedTransportSecurityStateSource( const ScopedTransportSecurityStateSource&) = delete; ScopedTransportSecurityStateSource& operator=( diff --git a/naiveproxy/src/net/log/file_net_log_observer.cc b/naiveproxy/src/net/log/file_net_log_observer.cc index 198d0ee503..8cf497b4a9 100644 --- a/naiveproxy/src/net/log/file_net_log_observer.cc +++ b/naiveproxy/src/net/log/file_net_log_observer.cc @@ -761,8 +761,7 @@ void FileNetLogObserver::FileWriter::WritePolledDataToFile( // Write the polled data (if any). if (polled_data) { - std::string polled_data_json; - base::JSONWriter::Write(*polled_data, &polled_data_json); + std::string polled_data_json = base::WriteJson(*polled_data).value_or(""); if (!polled_data_json.empty()) WriteToFile(file, ",\n\"polledData\": ", polled_data_json, "\n"); } diff --git a/naiveproxy/src/net/log/net_log_capture_mode.cc b/naiveproxy/src/net/log/net_log_capture_mode.cc index 32851e2dff..3597721985 100644 --- a/naiveproxy/src/net/log/net_log_capture_mode.cc +++ b/naiveproxy/src/net/log/net_log_capture_mode.cc @@ -4,6 +4,11 @@ #include "net/log/net_log_capture_mode.h" +#include + +#include "net/base/url_util.h" +#include "url/gurl.h" + namespace net { bool NetLogCaptureIncludesSensitive(NetLogCaptureMode capture_mode) { @@ -14,4 +19,13 @@ bool NetLogCaptureIncludesSocketBytes(NetLogCaptureMode capture_mode) { return capture_mode == NetLogCaptureMode::kEverything; } +std::string SanitizeUrlForNetLog(const GURL& url, + NetLogCaptureMode capture_mode) { + if (!url.is_valid() || (!url.has_username() && !url.has_password()) || + NetLogCaptureIncludesSensitive(capture_mode)) { + return url.possibly_invalid_spec(); + } + return RemoveCredentialsFromUrl(url).spec() + " (credentials redacted)"; +} + } // namespace net diff --git a/naiveproxy/src/net/log/net_log_capture_mode.h b/naiveproxy/src/net/log/net_log_capture_mode.h index 3a1bb4e366..2d1753a2a5 100644 --- a/naiveproxy/src/net/log/net_log_capture_mode.h +++ b/naiveproxy/src/net/log/net_log_capture_mode.h @@ -7,8 +7,12 @@ #include +#include + #include "net/base/net_export.h" +class GURL; + namespace net { // NetLogCaptureMode specifies the logging level. @@ -94,6 +98,19 @@ NET_EXPORT bool NetLogCaptureIncludesSensitive(NetLogCaptureMode capture_mode); NET_EXPORT bool NetLogCaptureIncludesSocketBytes( NetLogCaptureMode capture_mode); +// Returns `url` as a string, with the username/password portions removed, if +// `capture_mode` mandates it. Always creates a copy of the passed in URL as a +// string, but since NetLog requires copies of strings be put in Value::Dicts +// anyways, using this method results in no extra copies over adding url.spec() +// to a dictionary directly. +// +// Should be used when logging the full input URL, which may contrain +// credentials. For layers that don't have access to it (e.g., anything below +// HttpNetworkTransaction), there's no need to use this function, though doing +// so should not significantly affect performance when logging. +NET_EXPORT std::string SanitizeUrlForNetLog(const GURL& url, + NetLogCaptureMode capture_mode); + } // namespace net #endif // NET_LOG_NET_LOG_CAPTURE_MODE_H_ diff --git a/naiveproxy/src/net/log/net_log_event_type_list.h b/naiveproxy/src/net/log/net_log_event_type_list.h index 77f9602d10..423ae43fcf 100644 --- a/naiveproxy/src/net/log/net_log_event_type_list.h +++ b/naiveproxy/src/net/log/net_log_event_type_list.h @@ -355,6 +355,14 @@ EVENT_TYPE(PROXY_RESOLUTION_SERVICE_WAITING_FOR_INIT_PAC) // { // "net_error": , // } +// +// In the case of Windows system-based proxy resolution, the event also includes +// WinHTTP status codes and Windows-specific error codes: +// { +// "winhttp_status": , +// "windows_error": , +// "proxy_info": , +// } EVENT_TYPE(PROXY_RESOLUTION_SERVICE_RESOLVED_PROXY_LIST) // This event is emitted after proxies marked as bad have been deprioritized. @@ -1035,8 +1043,9 @@ EVENT_TYPE(TCP_STREAM_ATTEMPT_CONNECT) // } EVENT_TYPE(TLS_STREAM_ATTEMPT_ALIVE) -// Measures the time TlsStreamAttempt was waiting SSLConfig to be ready. -EVENT_TYPE(TLS_STREAM_ATTEMPT_WAIT_FOR_SSL_CONFIG) +// Measures the time TlsStreamAttempt was waiting for the ServiceEndpoint to be +// ready. +EVENT_TYPE(TLS_STREAM_ATTEMPT_WAIT_FOR_SERVICE_ENDPOINT) // Measures the time TlsStreamAttempt took to connect (TLS handshake). // For the END phase, if there was an error, the following parameters are @@ -1365,7 +1374,16 @@ EVENT_TYPE(HTTP_STREAM_JOB_INIT_CONNECTION) // } EVENT_TYPE(HTTP_STREAM_REQUEST_BOUND_TO_JOB) +// This event indicates that while an HttpStreamFactory::Job was trying to +// establish a connection, a matching H2 became available, likely created +// by another HttpStreamFactory::Job(). The event parameters are: +// { +// "source_dependency": , +// } +EVENT_TYPE(HTTP_STREAM_JOB_HTTP2_SESSION_AVAILABLE) + // Identifies the NetLogSource() for the Request that the Job was attached to. +// Event is logged to both the Request and the JobController. // The event parameters are: // { // "source_dependency": , -// "url_after_host_mapping": , // "is_preconnect": , // "private_mode": , // } @@ -1516,8 +1532,9 @@ EVENT_TYPE(HTTP_STREAM_POOL_GROUP_HANDLE_CREATED) // { // "priority": , // "allowed_bad_certs": , -// "enable_ip_based_pooling": , +// "enable_ip_based_pooling_for_h2": , +// "allowed_alpns": , // "quic_version": , // "source_dependency": // } @@ -1562,6 +1579,10 @@ EVENT_TYPE(HTTP_STREAM_POOL_ATTEMPT_MANAGER_ALIVE) // Some HTTP_STREAM_POOL_ATTEMPT_MANAGER_* events have the following common // event parameters. // { +// "num_active_sockets": , +// "num_idle_sockets": , +// "num_handed_out_sockets": , +// "num_total_sockets": , // "num_jobs": , // "num_notified_jobs": , @@ -1569,6 +1590,11 @@ EVENT_TYPE(HTTP_STREAM_POOL_ATTEMPT_MANAGER_ALIVE) // "num_inflight_attempts": , // "num_slow_attempts": , +// "num_tcp_based_attempt_slots": , +// "allowed_alpns": , // "quic_attempt_alive": , // "quic_attempt_result": @@ -2277,11 +2303,16 @@ EVENT_TYPE(QUIC_SESSION_POOL_JOB_BOUND_TO) EVENT_TYPE(BOUND_TO_QUIC_SESSION_POOL_JOB) // Measures the time taken by a DirectJob to establish a QUIC connection. -// The event parameters are: +// The begin event parameters are: // { // "require_confirmation": // } +// +// The end event parameters are: +// { +// "net_error": , +// } EVENT_TYPE(QUIC_SESSION_POOL_JOB_CONNECT) // Measures the time taken by a ProxyJob to establish a connection to its @@ -3722,8 +3753,8 @@ EVENT_TYPE(CERT_VERIFIER_REQUEST) // being the certificate to verify and the remaining // being intermediate certificates to assist path // building.> -// "ocsp_response": -// "sct_list": +// "stapled_ocsp_response": +// "tls_sct_list": // "host": // "verifier_flags": // } @@ -3797,8 +3828,8 @@ EVENT_TYPE(CERT_VERIFY_PROC_CREATED) // "crlset_sequence": // "crlset_is_expired": -// "ocsp_response": -// "sct_list": +// "stapled_ocsp_response": +// "tls_sct_list": // "host": // "verify_flags": // } diff --git a/naiveproxy/src/net/log/net_log_util.cc b/naiveproxy/src/net/log/net_log_util.cc index 6bd306f192..b0ffdf7901 100644 --- a/naiveproxy/src/net/log/net_log_util.cc +++ b/naiveproxy/src/net/log/net_log_util.cc @@ -537,9 +537,15 @@ NET_EXPORT void CreateNetLogEntriesForActiveObjects( // Create fake events. for (auto* request : requests) { + // Use default capture mode for simplicity. Can't call capture_mode() on + // `observer` because this method is typically called just before it starts + // observing, so it would CHECK. The capture mode only affects inlined + // credentials in the URL, which are pretty rare, so simplest to always + // redact them here. Can change later if needed. NetLogEntry entry(NetLogEventType::REQUEST_ALIVE, request->net_log().source(), NetLogEventPhase::BEGIN, - request->creation_time(), request->GetStateAsValue()); + request->creation_time(), + request->GetStateAsValue(NetLogCaptureMode::kDefault)); observer->OnAddEntry(entry); } } diff --git a/naiveproxy/src/net/log/test_net_log.cc b/naiveproxy/src/net/log/test_net_log.cc index 0a4d666beb..21e0d4f3a2 100644 --- a/naiveproxy/src/net/log/test_net_log.cc +++ b/naiveproxy/src/net/log/test_net_log.cc @@ -4,6 +4,12 @@ #include "net/log/test_net_log.h" +#include +#include +#include + +#include "base/check.h" +#include "base/json/json_writer.h" #include "base/synchronization/lock.h" #include "base/values.h" #include "net/log/net_log_capture_mode.h" @@ -110,4 +116,15 @@ void RecordingNetLogObserver::SetThreadsafeAddEntryCallback( add_entry_callback_ = add_entry_callback; } +std::string RecordingNetLogObserver::GetJson() const { + base::Value::List list; + for (const auto& entry : entry_list_) { + list.Append(entry.ToDict()); + } + + std::optional out = base::WriteJson(list); + CHECK(out); + return std::move(out).value(); +} + } // namespace net diff --git a/naiveproxy/src/net/log/test_net_log.h b/naiveproxy/src/net/log/test_net_log.h index 9bbc697c1e..7416dd9d88 100644 --- a/naiveproxy/src/net/log/test_net_log.h +++ b/naiveproxy/src/net/log/test_net_log.h @@ -7,6 +7,7 @@ #include +#include #include #include "base/compiler_specific.h" @@ -69,6 +70,11 @@ class RecordingNetLogObserver : public NetLog::ThreadSafeObserver { // Clears the captured entry list. void Clear(); + // Returns all recorded entries as JSON string. Useful for testing that + // certain values do/do not appear in the output (e.g., when testing redacting + // information). + std::string GetJson() const; + private: mutable base::Lock lock_; std::vector entry_list_; diff --git a/naiveproxy/src/net/nqe/network_quality_estimator.cc b/naiveproxy/src/net/nqe/network_quality_estimator.cc index 7645667837..ba70289f71 100644 --- a/naiveproxy/src/net/nqe/network_quality_estimator.cc +++ b/naiveproxy/src/net/nqe/network_quality_estimator.cc @@ -46,8 +46,19 @@ namespace net { +BASE_FEATURE(kNetworkQualityEstimatorAsyncNotifyStartTransaction, + base::FEATURE_DISABLED_BY_DEFAULT); + namespace { +// If true, don't call NotifyStartTransaction asynchronously as a task but +// defers it until the next step like NotifyHeadersReceived. +BASE_FEATURE_PARAM(bool, + kDeferUntilNextStep, + &kNetworkQualityEstimatorAsyncNotifyStartTransaction, + "defer_until_next_step", + false); + #if BUILDFLAG(IS_CHROMEOS) // SequencedTaskRunner to get the network id. A SequencedTaskRunner is used // rather than parallel tasks to avoid having many threads getting the network @@ -248,9 +259,56 @@ NetworkQualityEstimator::~NetworkQualityEstimator() { NetworkChangeNotifier::RemoveConnectionTypeObserver(this); } -void NetworkQualityEstimator::NotifyStartTransaction( +void NetworkQualityEstimator::NotifyStartTransaction(URLRequest& request) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + const base::TimeTicks now = tick_clock_->NowTicks(); + if (base::FeatureList::IsEnabled( + kNetworkQualityEstimatorAsyncNotifyStartTransaction)) { + if (!kDeferUntilNextStep.Get()) { + base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, + base::BindOnce( + &NetworkQualityEstimator::NotifyStartTransactionInternalAsync, + weak_ptr_factory_.GetWeakPtr(), request.GetWeakPtr())); + } + waiting_async_notify_start_transactions_[&request] = now; + } else { + NotifyStartTransactionInternal(request, now); + } +} + +void NetworkQualityEstimator::NotifyStartTransactionInternalAsync( + base::WeakPtr request) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (!request) { + return; + } + WaitNotifyStartTransactionDone(*request); +} + +void NetworkQualityEstimator::WaitNotifyStartTransactionDone( const URLRequest& request) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + CHECK(base::FeatureList::IsEnabled( + kNetworkQualityEstimatorAsyncNotifyStartTransaction)); + + auto request_it = waiting_async_notify_start_transactions_.find(&request); + if (request_it == waiting_async_notify_start_transactions_.end()) { + // Already called. + return; + } + + NotifyStartTransactionInternal(*request_it->first, request_it->second); + CHECK_EQ(waiting_async_notify_start_transactions_.erase(&request), 1u); +} + +void NetworkQualityEstimator::NotifyStartTransactionInternal( + const URLRequest& request, + const base::TimeTicks& time) { + TRACE_EVENT(NetTracingCategory(), + "NetworkQualityEstimator::NotifyStartTransaction"); + SCOPED_UMA_HISTOGRAM_TIMER("NQE.Duration.NotifyStartTransaction"); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!RequestSchemeIsHTTPOrHTTPS(request)) return; @@ -261,7 +319,7 @@ void NetworkQualityEstimator::NotifyStartTransaction( } else { MaybeComputeEffectiveConnectionType(); } - throughput_analyzer_->NotifyStartTransaction(request); + throughput_analyzer_->NotifyStartTransaction(request, time); } bool NetworkQualityEstimator::IsHangingRequest( @@ -317,10 +375,16 @@ bool NetworkQualityEstimator::IsHangingRequest( void NetworkQualityEstimator::NotifyHeadersReceived( const URLRequest& request, int64_t prefilter_total_bytes_read) { - TRACE_EVENT0(NetTracingCategory(), - "NetworkQualityEstimator::NotifyHeadersReceived"); + TRACE_EVENT(NetTracingCategory(), + "NetworkQualityEstimator::NotifyHeadersReceived"); + SCOPED_UMA_HISTOGRAM_TIMER("NQE.Duration.NotifyHeadersReceived"); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (base::FeatureList::IsEnabled( + kNetworkQualityEstimatorAsyncNotifyStartTransaction)) { + WaitNotifyStartTransactionDone(request); + } + if (!RequestSchemeIsHTTPOrHTTPS(request) || !RequestProvidesRTTObservation(request)) { return; @@ -384,15 +448,26 @@ void NetworkQualityEstimator::NotifyHeadersReceived( void NetworkQualityEstimator::NotifyBytesRead( const URLRequest& request, int64_t prefilter_total_bytes_read) { + TRACE_EVENT(NetTracingCategory(), "NetworkQualityEstimator::NotifyBytesRead"); + SCOPED_UMA_HISTOGRAM_TIMER("NQE.Duration.NotifyBytesRead"); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (base::FeatureList::IsEnabled( + kNetworkQualityEstimatorAsyncNotifyStartTransaction)) { + WaitNotifyStartTransactionDone(request); + } throughput_analyzer_->NotifyBytesRead(request); } void NetworkQualityEstimator::NotifyRequestCompleted( const URLRequest& request) { - TRACE_EVENT0(NetTracingCategory(), - "NetworkQualityEstimator::NotifyRequestCompleted"); + TRACE_EVENT(NetTracingCategory(), + "NetworkQualityEstimator::NotifyRequestCompleted"); + SCOPED_UMA_HISTOGRAM_TIMER("NQE.Duration.NotifyRequestCompleted"); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (base::FeatureList::IsEnabled( + kNetworkQualityEstimatorAsyncNotifyStartTransaction)) { + WaitNotifyStartTransactionDone(request); + } if (!RequestSchemeIsHTTPOrHTTPS(request)) return; @@ -402,7 +477,14 @@ void NetworkQualityEstimator::NotifyRequestCompleted( void NetworkQualityEstimator::NotifyURLRequestDestroyed( const URLRequest& request) { + TRACE_EVENT(NetTracingCategory(), + "NetworkQualityEstimator::NotifyURLRequestDestroyed"); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + SCOPED_UMA_HISTOGRAM_TIMER("NQE.Duration.NotifyURLRequestDestroyed"); + if (base::FeatureList::IsEnabled( + kNetworkQualityEstimatorAsyncNotifyStartTransaction)) { + WaitNotifyStartTransactionDone(request); + } if (!RequestSchemeIsHTTPOrHTTPS(request)) return; diff --git a/naiveproxy/src/net/nqe/network_quality_estimator.h b/naiveproxy/src/net/nqe/network_quality_estimator.h index 0ac72d3da4..e03de895b2 100644 --- a/naiveproxy/src/net/nqe/network_quality_estimator.h +++ b/naiveproxy/src/net/nqe/network_quality_estimator.h @@ -11,8 +11,10 @@ #include #include #include +#include #include +#include "base/feature_list.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" @@ -185,7 +187,7 @@ class NET_EXPORT_PRIVATE NetworkQualityEstimator // Notifies NetworkQualityEstimator that the headers of |request| are about to // be sent. - void NotifyStartTransaction(const URLRequest& request); + void NotifyStartTransaction(URLRequest& request); // Notifies NetworkQualityEstimator that the response body of |request| has // been received. @@ -466,6 +468,21 @@ class NET_EXPORT_PRIVATE NetworkQualityEstimator // be computed. If so, it recomputes effective connection type. void MaybeComputeEffectiveConnectionType(); + // Notifies NetworkQualityEstimator that the headers of |request| are about to + // be sent. This is the internal implementation that is called either + // synchronously or asynchronously. + void NotifyStartTransactionInternal(const URLRequest& request, + const base::TimeTicks& time); + + // Asynchronously calls NotifyStartTransactionInternal. + void NotifyStartTransactionInternalAsync(base::WeakPtr request); + + // If NotifyStartTransaction was called asynchronously and not called yet, + // this function calls NotifyStartTransactionInternal() immediately. + // This is to ensure that the function is completed before other notifications + // for the same request. + void WaitNotifyStartTransactionDone(const URLRequest& request); + // Notifies observers of a change in effective connection type. void NotifyObserversOfEffectiveConnectionTypeChanged(); @@ -628,6 +645,12 @@ class NET_EXPORT_PRIVATE NetworkQualityEstimator bool force_report_wifi_as_slow_2g_for_testing_ = false; + // A map of URLRequests for which NotifyStartTransaction has been called + // asynchronously, but the asynchronous task has not yet completed. The value + // is the time at which NotifyStartTransaction was called. + std::unordered_map, base::TimeTicks> + waiting_async_notify_start_transactions_; + base::WeakPtrFactory weak_ptr_factory_{this}; }; diff --git a/naiveproxy/src/net/nqe/throughput_analyzer.cc b/naiveproxy/src/net/nqe/throughput_analyzer.cc index 2ece58808c..513f93f154 100644 --- a/naiveproxy/src/net/nqe/throughput_analyzer.cc +++ b/naiveproxy/src/net/nqe/throughput_analyzer.cc @@ -139,7 +139,8 @@ void ThroughputAnalyzer::UpdateResponseContentSize(const URLRequest* request, response_content_sizes_[request] = response_size; } -void ThroughputAnalyzer::NotifyStartTransaction(const URLRequest& request) { +void ThroughputAnalyzer::NotifyStartTransaction(const URLRequest& request, + const base::TimeTicks& time) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); UpdateResponseContentSize(&request, kDefaultContentSizeBytes); @@ -165,7 +166,7 @@ void ThroughputAnalyzer::NotifyStartTransaction(const URLRequest& request) { EraseHangingRequests(request); - requests_[&request] = tick_clock_->NowTicks(); + requests_[&request] = time; BoundRequestsSize(); MaybeStartThroughputObservationWindow(); } diff --git a/naiveproxy/src/net/nqe/throughput_analyzer.h b/naiveproxy/src/net/nqe/throughput_analyzer.h index 9192820a52..36a5639bbb 100644 --- a/naiveproxy/src/net/nqe/throughput_analyzer.h +++ b/naiveproxy/src/net/nqe/throughput_analyzer.h @@ -72,7 +72,8 @@ class NET_EXPORT_PRIVATE ThroughputAnalyzer { virtual ~ThroughputAnalyzer(); // Notifies |this| that the headers of |request| are about to be sent. - void NotifyStartTransaction(const URLRequest& request); + void NotifyStartTransaction(const URLRequest& request, + const base::TimeTicks& time); // Notifies |this| that unfiltered bytes have been read for |request|. void NotifyBytesRead(const URLRequest& request); diff --git a/naiveproxy/src/net/proxy_resolution/configured_proxy_resolution_service.cc b/naiveproxy/src/net/proxy_resolution/configured_proxy_resolution_service.cc index 82c6860602..a479677c25 100644 --- a/naiveproxy/src/net/proxy_resolution/configured_proxy_resolution_service.cc +++ b/naiveproxy/src/net/proxy_resolution/configured_proxy_resolution_service.cc @@ -11,6 +11,7 @@ #include "base/compiler_specific.h" #include "base/functional/bind.h" +#include "base/functional/callback.h" #include "base/functional/callback_helpers.h" #include "base/location.h" #include "base/logging.h" @@ -357,13 +358,6 @@ base::Value::Dict NetLogBadProxyListParams( return dict; } -// Returns NetLog parameters on a successful proxy resolution. -base::Value::Dict NetLogFinishedResolvingProxyParams(const ProxyInfo* result) { - base::Value::Dict dict; - dict.Set("proxy_info", result->ToDebugString()); - return dict; -} - // Returns a sanitized copy of |url| which is safe to pass on to a PAC script. // // PAC scripts are modelled as being controllable by a network-present @@ -823,13 +817,15 @@ ConfiguredProxyResolutionService::ConfiguredProxyResolutionService( std::unique_ptr config_service, std::unique_ptr resolver_factory, NetLog* net_log, - bool quick_check_enabled) + bool quick_check_enabled, + bool enable_pac_runtime_backoff) : config_service_(std::move(config_service)), resolver_factory_(std::move(resolver_factory)), net_log_(net_log), stall_proxy_auto_config_delay_( base::Milliseconds(kDelayAfterNetworkChangesMs)), - quick_check_enabled_(quick_check_enabled) { + quick_check_enabled_(quick_check_enabled), + enable_pac_runtime_backoff_(enable_pac_runtime_backoff) { NetworkChangeNotifier::AddIPAddressObserver(this); NetworkChangeNotifier::AddDNSObserver(this); config_service_->AddObserver(this); @@ -848,13 +844,11 @@ ConfiguredProxyResolutionService::CreateUsingSystemProxyResolver( return CreateWithoutProxyResolver(std::move(proxy_config_service), net_log); } - std::unique_ptr proxy_resolution_service = - std::make_unique( - std::move(proxy_config_service), - std::make_unique( - kDefaultNumPacThreads), - net_log, quick_check_enabled); - return proxy_resolution_service; + return std::make_unique( + std::move(proxy_config_service), + std::make_unique(kDefaultNumPacThreads), + net_log, quick_check_enabled, + /*enable_pac_runtime_backoff=*/true); } // static @@ -1033,8 +1027,23 @@ int ConfiguredProxyResolutionService::TryToCompleteSynchronously( return permanent_error_; } - if (config_->value().HasAutomaticSettings()) + // If using automatic settings and we are in a PAC runtime error backoff + // window, avoid invoking the resolver. This prevents repeated PAC + // evaluations (and re-fetches on some platforms) during the backoff period. + if (config_->value().HasAutomaticSettings()) { + if (enable_pac_runtime_backoff_ && + (pac_retry_throttler_.IsInBackoffWindow() || + pac_retry_throttler_.HasFailedDuringCurrentLoad())) { + if (config_->value().pac_mandatory()) { + return ERR_MANDATORY_PROXY_CONFIGURATION_FAILED; + } + result->UseDirect(); + result->set_traffic_annotation( + MutableNetworkTrafficAnnotationTag(config_->traffic_annotation())); + return OK; + } return ERR_IO_PENDING; // Must submit the request to the proxy resolver. + } // Use the manual proxy settings. config_->value().proxy_rules().Apply(url, result); @@ -1046,6 +1055,7 @@ int ConfiguredProxyResolutionService::TryToCompleteSynchronously( ConfiguredProxyResolutionService::~ConfiguredProxyResolutionService() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + in_destruction_ = true; NetworkChangeNotifier::RemoveIPAddressObserver(this); NetworkChangeNotifier::RemoveDNSObserver(this); config_service_->RemoveObserver(this); @@ -1175,28 +1185,9 @@ void ConfiguredProxyResolutionService::ReportSuccess(const ProxyInfo& result) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); const ProxyRetryInfoMap& new_retry_info = result.proxy_retry_info(); - if (new_retry_info.empty()) - return; - - if (proxy_delegate_) { - proxy_delegate_->OnSuccessfulRequestAfterFailures(new_retry_info); - } - - for (const auto& iter : new_retry_info) { - auto existing = proxy_retry_info_.find(iter.first); - if (existing == proxy_retry_info_.end()) { - proxy_retry_info_[iter.first] = iter.second; - if (proxy_delegate_) { - const ProxyChain& bad_proxy = iter.first; - DCHECK(!bad_proxy.is_direct()); - const ProxyRetryInfo& proxy_retry_info = iter.second; - proxy_delegate_->OnFallback(bad_proxy, proxy_retry_info.net_error); - } - } else if (existing->second.bad_until < iter.second.bad_until) { - existing->second.bad_until = iter.second.bad_until; - } - } - if (net_log_) { + ProxyResolutionService::ProcessProxyRetryInfo( + new_retry_info, proxy_retry_info_, proxy_delegate_); + if (!new_retry_info.empty() && net_log_) { net_log_->AddGlobalEntry(NetLogEventType::BAD_PROXY_LIST_REPORTED, [&] { return NetLogBadProxyListParams(&new_retry_info); }); @@ -1232,49 +1223,68 @@ int ConfiguredProxyResolutionService::DidFinishResolvingProxy( proxy_retry_info_, result); net_log.AddEvent( - NetLogEventType::PROXY_RESOLUTION_SERVICE_RESOLVED_PROXY_LIST, - [&] { return NetLogFinishedResolvingProxyParams(result); }); + NetLogEventType::PROXY_RESOLUTION_SERVICE_RESOLVED_PROXY_LIST, [&] { + base::Value::Dict dict; + dict.Set("proxy_info", result->ToDebugString()); + return dict; + }); - // This check is done to only log the NetLog event when necessary, it's - // not a performance optimization. - if (!proxy_retry_info_.empty()) { - result->DeprioritizeBadProxyChains(proxy_retry_info_); - net_log.AddEvent( - NetLogEventType::PROXY_RESOLUTION_SERVICE_DEPRIORITIZED_BAD_PROXIES, - [&] { return NetLogFinishedResolvingProxyParams(result); }); + DeprioritizeBadProxyChains(proxy_retry_info_, result, net_log); + // If we previously had PAC failures and now we have a successful + // resolution while using a PAC resolver, reset the throttler. + if (enable_pac_runtime_backoff_ && + !pac_retry_throttler_.HasFailedDuringCurrentLoad()) { + ResetPacRetryThrottler(); } } else { net_log.AddEventWithNetErrorCode( NetLogEventType::PROXY_RESOLUTION_SERVICE_RESOLVED_PROXY_LIST, result_code); - bool reset_config = result_code == ERR_PAC_SCRIPT_TERMINATED; - if (config_ && !config_->value().pac_mandatory()) { - // Fall-back to direct when the proxy resolver fails. This corresponds - // with a javascript runtime error in the PAC script. - // - // This implicit fall-back to direct matches Firefox 3.5 and - // Internet Explorer 8. For more information, see: - // - // http://www.chromium.org/developers/design-documents/proxy-settings-fallback - result->UseDirect(); - result_code = OK; + // Preserve the original resolver error for backoff/throttle decisions. + const int resolver_error = result_code; + bool reset_config = resolver_error == ERR_PAC_SCRIPT_TERMINATED; - // Allow the proxy delegate to interpose on the resolution decision, - // possibly modifying the ProxyInfo. - if (proxy_delegate_) - proxy_delegate_->OnResolveProxy(url, network_anonymization_key, method, - proxy_retry_info_, result); - } else { + // During destruction, treat aborted outstanding requests under automatic + // proxy configurations as mandatory failures so callers don't confuse + // teardown with a successful DIRECT fallback. + // + // This can be observed because the service destructor sets + // `in_destruction_ = true` and synchronously calls + // QueryComplete(ERR_ABORTED) on each pending request. QueryComplete + // synchronously calls QueryDidComplete, which in turn calls + // DidFinishResolvingProxy on this service before the request removes itself + // from `pending_requests_` and runs the user callback. + if (resolver_error == ERR_ABORTED && in_destruction_ && !config_) { result_code = ERR_MANDATORY_PROXY_CONFIGURATION_FAILED; + net_log.EndEvent(NetLogEventType::PROXY_RESOLUTION_SERVICE); + return result_code; } + + if (config_) { + if (!config_->value().pac_mandatory()) { + // Fall-back to direct for non-mandatory PAC runtime errors or other + // resolver failures. + result->UseDirect(); + result_code = OK; + if (proxy_delegate_) { + proxy_delegate_->OnResolveProxy(url, network_anonymization_key, + method, proxy_retry_info_, result); + } + } else { + // Mandatory PAC: surface mandatory failure (unless original was a + // crash that triggers reset; mapping still needed for callers). + result_code = ERR_MANDATORY_PROXY_CONFIGURATION_FAILED; + } + } + if (reset_config) { ResetProxyConfig(false); - // If the ProxyResolver crashed, force it to be re-initialized for the - // next request by resetting the proxy config. If there are other pending - // requests, trigger the recreation immediately so those requests retry. if (pending_requests_.size() > 1) ApplyProxyConfigIfAvailable(); + } else if (enable_pac_runtime_backoff_ && + resolver_error == ERR_PAC_SCRIPT_FAILED) { + HandlePacScriptLoadError(); } } @@ -1286,7 +1296,8 @@ void ConfiguredProxyResolutionService::SetPacFileFetchers( std::unique_ptr pac_file_fetcher, std::unique_ptr dhcp_pac_file_fetcher) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - State previous_state = ResetProxyConfig(false); + State previous_state = + ResetProxyConfig(false, ShouldResetPacRetryStateForNextReset()); pac_file_fetcher_ = std::move(pac_file_fetcher); dhcp_pac_file_fetcher_ = std::move(dhcp_pac_file_fetcher); if (previous_state != STATE_NONE) @@ -1340,7 +1351,8 @@ ProxyResolver* ConfiguredProxyResolutionService::GetProxyResolver() const { } ConfiguredProxyResolutionService::State -ConfiguredProxyResolutionService::ResetProxyConfig(bool reset_fetched_config) { +ConfiguredProxyResolutionService::ResetProxyConfig(bool reset_fetched_config, + bool reset_pac_retry_state) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); State previous_state = current_state_; @@ -1351,6 +1363,12 @@ ConfiguredProxyResolutionService::ResetProxyConfig(bool reset_fetched_config) { SuspendAllPendingRequests(); resolver_.reset(); config_ = std::nullopt; + if (reset_pac_retry_state) { + // Reset throttler on config reset (e.g., effective PAC URL/content changed + // or network environment changed). This avoids carrying backoff across + // different PAC scripts or configurations. + pac_retry_throttler_.ResetRetryState(); + } if (reset_fetched_config) fetched_config_ = std::nullopt; current_state_ = STATE_NONE; @@ -1358,9 +1376,69 @@ ConfiguredProxyResolutionService::ResetProxyConfig(bool reset_fetched_config) { return previous_state; } +bool ConfiguredProxyResolutionService::ShouldResetPacRetryStateForNextReset() { + if (!preserve_pac_retry_state_for_next_reset_) { + return true; + } + preserve_pac_retry_state_for_next_reset_ = false; + return false; +} + +void ConfiguredProxyResolutionService::HandlePacScriptLoadError() { + // Delegate scheduling to the throttler (clears per-load flag on timer fire + // and triggers ForceReloadProxyConfig via WeakPtr). + pac_retry_throttler_.OnRuntimeFailure(weak_ptr_factory_.GetWeakPtr()); +} + +void ConfiguredProxyResolutionService::ResetPacRetryThrottler() { + pac_retry_throttler_.ResetRetryState(); +} + +// Scheduling moved into PacRetryThrottler. +void ConfiguredProxyResolutionService::PacRetryThrottler::OnRuntimeFailure( + base::WeakPtr service) { + // Only schedule one backoff per resolver load until a success. + if (has_failed_during_current_load_) { + return; + } + has_failed_during_current_load_ = true; + MaybeScheduleScriptReloadWithDelay(std::move(service)); +} + +void ConfiguredProxyResolutionService::PacRetryThrottler:: + MaybeScheduleScriptReloadWithDelay( + base::WeakPtr service) { + base::TimeDelta delay = CalculateRetryDelay(); + IncrementRetryCount(); + next_retry_time_ = base::TimeTicks::Now() + delay; + + // Bind the reload step to the service's WeakPtr so the task naturally + // cancels if the service is destructed. The throttler clears its per-load + // failure flag when the timer fires, allowing new failures to schedule + // another retry. + retry_schedule_timer_.Start( + FROM_HERE, delay, + base::BindOnce( + &ConfiguredProxyResolutionService::OnRetryScheduleTimerFired, + std::move(service))); +} + +void ConfiguredProxyResolutionService::PacRetryThrottler:: + OnRetryScheduleTimerFired() { + // Clear the failure flag when timer fires to allow new requests/backoffs. + has_failed_during_current_load_ = false; + next_retry_time_ = base::TimeTicks(); +} + +void ConfiguredProxyResolutionService::OnRetryScheduleTimerFired() { + pac_retry_throttler_.OnRetryScheduleTimerFired(); + ForceReloadProxyConfig(); +} + void ConfiguredProxyResolutionService::ForceReloadProxyConfig() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - ResetProxyConfig(false); + preserve_pac_retry_state_for_next_reset_ = true; + ResetProxyConfig(false, /*reset_pac_retry_state=*/false); ApplyProxyConfigIfAvailable(); } @@ -1379,22 +1457,7 @@ base::Value::Dict ConfiguredProxyResolutionService::GetProxyNetLogValues() { } // Log Bad Proxies. - { - base::Value::List list; - - for (const auto& it : proxy_retry_info_) { - const std::string& proxy_chain_uri = it.first.ToDebugString(); - const ProxyRetryInfo& retry_info = it.second; - - base::Value::Dict dict; - dict.Set("proxy_chain_uri", proxy_chain_uri); - dict.Set("bad_until", NetLog::TickCountToString(retry_info.bad_until)); - - list.Append(base::Value(std::move(dict))); - } - - net_info_dict.Set(kNetInfoBadProxies, std::move(list)); - } + net_info_dict.Set(kNetInfoBadProxies, BuildBadProxiesList(proxy_retry_info_)); return net_info_dict; } @@ -1464,7 +1527,7 @@ bool ConfiguredProxyResolutionService::ApplyPacBypassRules(const GURL& url, } void ConfiguredProxyResolutionService::InitializeUsingLastFetchedConfig() { - ResetProxyConfig(false); + ResetProxyConfig(false, ShouldResetPacRetryStateForNextReset()); DCHECK(fetched_config_); if (!fetched_config_->value().HasAutomaticSettings()) { @@ -1500,7 +1563,7 @@ void ConfiguredProxyResolutionService::InitializeUsingDecidedConfig( DCHECK(fetched_config_); DCHECK(fetched_config_->value().HasAutomaticSettings()); - ResetProxyConfig(false); + ResetProxyConfig(false, ShouldResetPacRetryStateForNextReset()); current_state_ = STATE_WAITING_FOR_INIT_PROXY_RESOLVER; @@ -1516,7 +1579,8 @@ void ConfiguredProxyResolutionService::InitializeUsingDecidedConfig( OnInitProxyResolverComplete(rv); } -void ConfiguredProxyResolutionService::OnIPAddressChanged() { +void ConfiguredProxyResolutionService::OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) { // See the comment block by |kDelayAfterNetworkChangesMs| for info. stall_proxy_autoconfig_until_ = TimeTicks::Now() + stall_proxy_auto_config_delay_; @@ -1525,7 +1589,8 @@ void ConfiguredProxyResolutionService::OnIPAddressChanged() { // new connection may be essential for URL requests to work properly. Reset // the config to ensure new URL requests are blocked until the potential new // proxy configuration is loaded. - State previous_state = ResetProxyConfig(false); + State previous_state = + ResetProxyConfig(false, ShouldResetPacRetryStateForNextReset()); if (previous_state != STATE_NONE) ApplyProxyConfigIfAvailable(); } diff --git a/naiveproxy/src/net/proxy_resolution/configured_proxy_resolution_service.h b/naiveproxy/src/net/proxy_resolution/configured_proxy_resolution_service.h index 1b38ee4e27..80deb2b183 100644 --- a/naiveproxy/src/net/proxy_resolution/configured_proxy_resolution_service.h +++ b/naiveproxy/src/net/proxy_resolution/configured_proxy_resolution_service.h @@ -7,16 +7,22 @@ #include +#include +#include #include #include #include #include #include +#include "base/functional/callback_forward.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" +#include "base/memory/weak_ptr.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread_checker.h" +#include "base/time/time.h" +#include "base/timer/timer.h" #include "net/base/completion_once_callback.h" #include "net/base/load_states.h" #include "net/base/net_errors.h" @@ -101,11 +107,14 @@ class NET_EXPORT ConfiguredProxyResolutionService // |net_log| is a possibly nullptr destination to send log events to. It must // remain alive for the lifetime of this ConfiguredProxyResolutionService. + // |enable_pac_runtime_backoff| optionally enables runtime PAC error backoff + // (defaults to false; enabled by CreateUsingSystemProxyResolver()). ConfiguredProxyResolutionService( std::unique_ptr config_service, std::unique_ptr resolver_factory, NetLog* net_log, - bool quick_check_enabled); + bool quick_check_enabled, + bool enable_pac_runtime_backoff = false); ConfiguredProxyResolutionService(const ConfiguredProxyResolutionService&) = delete; @@ -243,6 +252,12 @@ class NET_EXPORT ConfiguredProxyResolutionService bool quick_check_enabled_for_testing() const { return quick_check_enabled_; } + // Test-only: enable or disable PAC runtime backoff gating. This is enabled + // by default only for system resolvers; tests may override it. + void set_enable_pac_runtime_backoff_for_testing(bool enabled) { + enable_pac_runtime_backoff_ = enabled; + } + private: friend class ConfiguredProxyResolutionRequest; FRIEND_TEST_ALL_PREFIXES(ProxyResolutionServiceTest, @@ -271,11 +286,15 @@ class NET_EXPORT ConfiguredProxyResolutionService // Resets all the variables associated with the current proxy configuration, // and rewinds the current state to |STATE_NONE|. Returns the previous value - // of |current_state_|. If |reset_fetched_config| is true then + // of |current_state_|. If |reset_fetched_config| is true then // |fetched_config_| will also be reset, otherwise it will be left as-is. // Resetting it means that we will have to re-fetch the configuration from // the ProxyConfigService later. - State ResetProxyConfig(bool reset_fetched_config); + // If |reset_pac_retry_state| is false, the PAC runtime backoff throttler is + // left unchanged (used when a forced reload was already scheduled by the + // throttler itself). + State ResetProxyConfig(bool reset_fetched_config, + bool reset_pac_retry_state = true); // Retrieves the current proxy configuration from the ProxyConfigService, and // starts initializing for it. @@ -326,7 +345,8 @@ class NET_EXPORT ConfiguredProxyResolutionService // NetworkChangeNotifier::IPAddressObserver // When this is called, we re-fetch PAC scripts and re-run WPAD. - void OnIPAddressChanged() override; + void OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) override; // NetworkChangeNotifier::DNSObserver // We respond as above. @@ -408,8 +428,98 @@ class NET_EXPORT ConfiguredProxyResolutionService raw_ptr proxy_delegate_ = nullptr; - // Flag used by |SetReady()| to check if |this| has been deleted by a - // synchronous callback. + // --- PAC runtime failure backoff handling --- + // We throttle repeated PAC evaluations after runtime/parse errors to avoid + // repeatedly invoking the resolver (e.g., WinHTTP) and re-fetching the PAC + // script aggressively. This backoff is separate from the fetch poller + // (PacFileDeciderPoller), which already schedules retries for initial fetch + // failures. + class PacRetryThrottler { + public: + PacRetryThrottler() = default; + + // Returns whether a retry is currently scheduled. + bool IsScheduled() const { return retry_schedule_timer_.IsRunning(); } + + bool IsInBackoffWindow() const { + return !next_retry_time_.is_null() && + base::TimeTicks::Now() < next_retry_time_; + } + + bool HasFailedDuringCurrentLoad() const { + return has_failed_during_current_load_; + } + + // Clears throttling and cancels any scheduled retry. + void ResetRetryState() { + retry_attempt_count_ = 0; + has_failed_during_current_load_ = false; + retry_schedule_timer_.Stop(); + next_retry_time_ = base::TimeTicks(); + } + + // Records a runtime PAC failure and schedules a delayed reload if one + // isn't already scheduled for the current resolver load cycle. + void OnRuntimeFailure( + base::WeakPtr service); + // Timer fires: allow new failures to schedule another retry and request a + // config reload via the owning service. + void OnRetryScheduleTimerFired(); + + private: + // Backoff cadence matches documented fetch failure policy; see docs: + // https://chromium.googlesource.com/chromium/src/+/HEAD/net/docs/proxy.md + // 8s -> 32s -> 2m -> 4h (then stay at 4h). + base::TimeDelta CalculateRetryDelay() const { + static constexpr std::array kRetryIntervals{ + base::Seconds(8), base::Seconds(32), base::Minutes(2), + base::Hours(4)}; + size_t idx = std::min(static_cast(retry_attempt_count_), + kRetryIntervals.size() - 1); + return kRetryIntervals[idx]; + } + + void IncrementRetryCount() { ++retry_attempt_count_; } + + void MaybeScheduleScriptReloadWithDelay( + base::WeakPtr service); + + int retry_attempt_count_ = 0; // Backoff steps applied. + bool has_failed_during_current_load_ = false; // Prevent double-scheduling. + base::OneShotTimer retry_schedule_timer_; // Schedules ForceReload. + base::TimeTicks next_retry_time_; + }; + + // Schedule throttled reload after a PAC runtime/parse error. + void HandlePacScriptLoadError(); + // Reset throttler after a successful PAC evaluation. + void ResetPacRetryThrottler(); + bool ShouldResetPacRetryStateForNextReset(); + void OnRetryScheduleTimerFired(); + + PacRetryThrottler pac_retry_throttler_; + + // When true, the next ResetProxyConfig invocation triggered as part of a + // throttled ForceReload should preserve the PAC retry state. Automatically + // cleared once consumed. + bool preserve_pac_retry_state_for_next_reset_ = false; + + // Enable runtime PAC backoff gating (used for system PAC evaluators, e.g., + // WinHTTP). Disabled by default and set true by + // CreateUsingSystemProxyResolver. + bool enable_pac_runtime_backoff_ = false; + + // Set during destruction to annotate the synchronous teardown path: + // the destructor aborts pending requests, which synchronously invoke + // QueryComplete(ERR_ABORTED), followed by QueryDidComplete and + // DidFinishResolvingProxy. + // When this is true and no current config is set, ERR_ABORTED is mapped to + // ERR_MANDATORY_PROXY_CONFIGURATION_FAILED to avoid interpreting teardown + // as a successful DIRECT fallback. + bool in_destruction_ = false; + + // WeakPtrFactory must be the last member. Used by SetReady() to detect + // deletion by synchronous callbacks. base::WeakPtrFactory weak_ptr_factory_{ this}; }; diff --git a/naiveproxy/src/net/proxy_resolution/mock_proxy_resolver.h b/naiveproxy/src/net/proxy_resolution/mock_proxy_resolver.h index 9f87f6fb67..cf602cdd86 100644 --- a/naiveproxy/src/net/proxy_resolution/mock_proxy_resolver.h +++ b/naiveproxy/src/net/proxy_resolution/mock_proxy_resolver.h @@ -9,6 +9,7 @@ #include #include "base/memory/raw_ptr.h" +#include "base/memory/ref_counted.h" #include "net/base/completion_once_callback.h" #include "net/base/net_errors.h" #include "net/base/network_anonymization_key.h" diff --git a/naiveproxy/src/net/proxy_resolution/pac_file_decider.cc b/naiveproxy/src/net/proxy_resolution/pac_file_decider.cc index 4e86b4e8df..ddc834f2a1 100644 --- a/naiveproxy/src/net/proxy_resolution/pac_file_decider.cc +++ b/naiveproxy/src/net/proxy_resolution/pac_file_decider.cc @@ -258,7 +258,7 @@ int PacFileDecider::DoQuickCheck() { return OK; } - std::string host = current_pac_source().url.host(); + std::string host = current_pac_source().url.GetHost(); HostResolver::ResolveHostParameters parameters; // We use HIGHEST here because proxy decision blocks doing any other requests. @@ -280,7 +280,7 @@ int PacFileDecider::DoQuickCheck() { HostResolver* host_resolver = pac_file_fetcher_->GetRequestContext()->host_resolver(); resolve_request_ = host_resolver->CreateRequest( - HostPortPair(host, 80), + HostPortPair(std::move(host), 80), pac_file_fetcher_->isolation_info().network_anonymization_key(), net_log_, parameters); diff --git a/naiveproxy/src/net/proxy_resolution/proxy_bypass_rules.cc b/naiveproxy/src/net/proxy_resolution/proxy_bypass_rules.cc index 06896ba05b..a460beda27 100644 --- a/naiveproxy/src/net/proxy_resolution/proxy_bypass_rules.cc +++ b/naiveproxy/src/net/proxy_resolution/proxy_bypass_rules.cc @@ -34,8 +34,7 @@ const char kBypassSimpleHostnames[] = ""; bool IsLinkLocalIP(const GURL& url) { // Quick fail if definitely not link-local, to avoid doing unnecessary work in // common case. - if (!(url.host_piece().starts_with("169.254.") || - url.host_piece().starts_with("["))) { + if (!(url.host().starts_with("169.254.") || url.host().starts_with("["))) { return false; } @@ -53,7 +52,7 @@ bool IsLinkLocalIP(const GURL& url) { // addresses. However for proxy resolving such URLs should bypass the use // of a PAC script, since the destination is local. bool IsIPv4MappedLoopback(const GURL& url) { - if (!url.host_piece().starts_with("[::ffff")) { + if (!url.host().starts_with("[::ffff")) { return false; } @@ -76,7 +75,7 @@ class BypassSimpleHostnamesRule : public SchemeHostPortMatcherRule { delete; SchemeHostPortMatcherResult Evaluate(const GURL& url) const override { - return ((url.host_piece().find('.') == std::string::npos) && + return ((url.host().find('.') == std::string::npos) && !url.HostIsIPAddress()) ? SchemeHostPortMatcherResult::kInclude : SchemeHostPortMatcherResult::kNoMatch; @@ -253,8 +252,7 @@ bool ProxyBypassRules::MatchesImplicitRules(const GURL& url) { IsLinkLocalIP(url) #if BUILDFLAG(IS_WIN) // See http://crbug.com/904889 - || (url.host_piece() == "loopback") || - (url.host_piece() == "loopback.") + || (url.host() == "loopback") || (url.host() == "loopback.") #endif ; } diff --git a/naiveproxy/src/net/proxy_resolution/proxy_config.cc b/naiveproxy/src/net/proxy_resolution/proxy_config.cc index fcc56a2aa7..0b887e8f41 100644 --- a/naiveproxy/src/net/proxy_resolution/proxy_config.cc +++ b/naiveproxy/src/net/proxy_resolution/proxy_config.cc @@ -74,7 +74,7 @@ void ProxyConfig::ProxyRules::Apply(const GURL& url, ProxyInfo* result) const { return; } case ProxyRules::Type::PROXY_LIST_PER_SCHEME: { - const ProxyList* entry = MapUrlSchemeToProxyList(url.scheme()); + const ProxyList* entry = MapUrlSchemeToProxyList(url.GetScheme()); if (entry) { result->UseProxyList(*entry); } else { diff --git a/naiveproxy/src/net/proxy_resolution/proxy_config_service_linux.cc b/naiveproxy/src/net/proxy_resolution/proxy_config_service_linux.cc index 6fb562a1e1..5d9b53b38a 100644 --- a/naiveproxy/src/net/proxy_resolution/proxy_config_service_linux.cc +++ b/naiveproxy/src/net/proxy_resolution/proxy_config_service_linux.cc @@ -590,7 +590,7 @@ class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter { // Reverses the order of paths to store them in ascending order of // priority - std::reverse(kde_config_dirs_.begin(), kde_config_dirs_.end()); + std::ranges::reverse(kde_config_dirs_); } } } diff --git a/naiveproxy/src/net/proxy_resolution/proxy_info.cc b/naiveproxy/src/net/proxy_resolution/proxy_info.cc index 237e0ed733..59a5c7184c 100644 --- a/naiveproxy/src/net/proxy_resolution/proxy_info.cc +++ b/naiveproxy/src/net/proxy_resolution/proxy_info.cc @@ -92,8 +92,10 @@ bool ProxyInfo::Fallback(int net_error, const NetLogWithSource& net_log) { } void ProxyInfo::DeprioritizeBadProxyChains( - const ProxyRetryInfoMap& proxy_retry_info) { - proxy_list_.DeprioritizeBadProxyChains(proxy_retry_info); + const ProxyRetryInfoMap& proxy_retry_info, + bool remove_bad_proxy_chains) { + proxy_list_.DeprioritizeBadProxyChains(proxy_retry_info, + remove_bad_proxy_chains); } void ProxyInfo::RemoveProxiesWithoutScheme(int scheme_bit_field) { diff --git a/naiveproxy/src/net/proxy_resolution/proxy_info.h b/naiveproxy/src/net/proxy_resolution/proxy_info.h index e537156d4c..c29b86f2e7 100644 --- a/naiveproxy/src/net/proxy_resolution/proxy_info.h +++ b/naiveproxy/src/net/proxy_resolution/proxy_info.h @@ -146,8 +146,11 @@ class NET_EXPORT ProxyInfo { bool Fallback(int net_error, const NetLogWithSource& net_log); // De-prioritizes the proxies that we have cached as not working, by moving - // them to the end of the proxy list. - void DeprioritizeBadProxyChains(const ProxyRetryInfoMap& proxy_retry_info); + // them to the end of the proxy list. If `remove_bad_proxy_chains` is true, + // bad proxy chains are removed from the list rather than just moved + // to the end. + void DeprioritizeBadProxyChains(const ProxyRetryInfoMap& proxy_retry_info, + bool remove_bad_proxy_chains = false); // Deletes any entry which doesn't have one of the specified proxy schemes. void RemoveProxiesWithoutScheme(int scheme_bit_field); diff --git a/naiveproxy/src/net/proxy_resolution/proxy_list.cc b/naiveproxy/src/net/proxy_resolution/proxy_list.cc index c9b645fd7c..5e4ebc4cb3 100644 --- a/naiveproxy/src/net/proxy_resolution/proxy_list.cc +++ b/naiveproxy/src/net/proxy_resolution/proxy_list.cc @@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include - #include "net/proxy_resolution/proxy_list.h" +#include + #include "base/check.h" #include "base/functional/callback.h" #include "base/notreached.h" @@ -41,59 +41,57 @@ void ProxyList::Set(const std::string& proxy_uri_list) { while (str_tok.GetNext()) { ProxyChain chain = ProxyUriToProxyChain(str_tok.token_piece(), ProxyServer::SCHEME_HTTP); - AddProxyChain(chain); + AddProxyChain(std::move(chain)); } } -void ProxyList::SetSingleProxyChain(const ProxyChain& proxy_chain) { +void ProxyList::SetSingleProxyChain(ProxyChain proxy_chain) { Clear(); - AddProxyChain(proxy_chain); + AddProxyChain(std::move(proxy_chain)); } -void ProxyList::SetSingleProxyServer(const ProxyServer& proxy_server) { +void ProxyList::SetSingleProxyServer(ProxyServer proxy_server) { Clear(); - AddProxyServer(proxy_server); + AddProxyServer(std::move(proxy_server)); } -void ProxyList::AddProxyChain(const ProxyChain& proxy_chain) { +void ProxyList::AddProxyChain(ProxyChain proxy_chain) { // Silently discard malformed inputs. if (proxy_chain.IsValid()) { - proxy_chains_.push_back(proxy_chain); + proxy_chains_.emplace_back(std::move(proxy_chain)); } } -void ProxyList::AddProxyServer(const ProxyServer& proxy_server) { - AddProxyChain(ProxyChain(proxy_server)); +void ProxyList::AddProxyServer(ProxyServer proxy_server) { + AddProxyChain(ProxyChain(std::move(proxy_server))); } void ProxyList::DeprioritizeBadProxyChains( - const ProxyRetryInfoMap& proxy_retry_info) { + const ProxyRetryInfoMap& proxy_retry_info, + bool remove_bad_proxy_chains) { // Partition the proxy list in two: // (1) the known bad proxy chains // (2) everything else std::vector good_chains; std::vector bad_chains_to_try; - std::vector::const_iterator iter = proxy_chains_.begin(); - for (; iter != proxy_chains_.end(); ++iter) { - auto bad_info = proxy_retry_info.find(*iter); - if (bad_info != proxy_retry_info.end()) { - // This proxy is bad. Check if it's time to retry. - if (bad_info->second.bad_until >= TimeTicks::Now()) { - // still invalid. - if (bad_info->second.try_while_bad) { - bad_chains_to_try.push_back(*iter); - } - continue; - } + for (const auto& proxy_chain : proxy_chains_) { + if (auto bad_info = proxy_retry_info.find(proxy_chain); + bad_info != proxy_retry_info.end() && + bad_info->second.bad_until >= TimeTicks::Now()) { + // This proxy is bad and it's not time to retry. + bad_chains_to_try.push_back(proxy_chain); + continue; } - good_chains.push_back(*iter); + good_chains.push_back(proxy_chain); } // "proxy_chains_ = good_chains + bad_proxies" proxy_chains_.swap(good_chains); - proxy_chains_.insert(proxy_chains_.end(), bad_chains_to_try.begin(), - bad_chains_to_try.end()); + if (!remove_bad_proxy_chains) { + proxy_chains_.insert(proxy_chains_.end(), bad_chains_to_try.begin(), + bad_chains_to_try.end()); + } } void ProxyList::RemoveProxiesWithoutScheme(int scheme_bit_field) { @@ -201,68 +199,29 @@ base::Value ProxyList::ToValue() const { bool ProxyList::Fallback(ProxyRetryInfoMap* proxy_retry_info, int net_error, const NetLogWithSource& net_log) { - if (proxy_chains_.empty()) { - NOTREACHED(); - } - // By default, proxy chains are not retried for 5 minutes. - UpdateRetryInfoOnFallback(proxy_retry_info, base::Minutes(5), true, - std::vector(), net_error, net_log); + CHECK(!proxy_chains_.empty()); - // Remove this proxy from our list. + auto first_chain = std::move(proxy_chains_.front()); proxy_chains_.erase(proxy_chains_.begin()); + + if (!first_chain.is_direct()) { + net_log.AddEventWithStringParams(NetLogEventType::PROXY_LIST_FALLBACK, + "bad_proxy_chain", + first_chain.ToDebugString()); + + // By default, proxy chains are not retried for 5 minutes. + static constexpr base::TimeDelta kDefaultRetryDelay = base::Minutes(5); + TimeTicks bad_until = TimeTicks::Now() + kDefaultRetryDelay; + auto iter = proxy_retry_info->find(first_chain); + if (iter == proxy_retry_info->end() || bad_until > iter->second.bad_until) { + ProxyRetryInfo retry_info; + retry_info.bad_until = bad_until; + retry_info.net_error = net_error; + (*proxy_retry_info)[std::move(first_chain)] = std::move(retry_info); + } + } + return !proxy_chains_.empty(); } -void ProxyList::AddProxyChainToRetryList( - ProxyRetryInfoMap* proxy_retry_info, - base::TimeDelta retry_delay, - bool try_while_bad, - const ProxyChain& proxy_chain_to_retry, - int net_error, - const NetLogWithSource& net_log) const { - // Mark this proxy chain as bad. - TimeTicks bad_until = TimeTicks::Now() + retry_delay; - auto iter = proxy_retry_info->find(proxy_chain_to_retry); - if (iter == proxy_retry_info->end() || bad_until > iter->second.bad_until) { - ProxyRetryInfo retry_info; - retry_info.current_delay = retry_delay; - retry_info.bad_until = bad_until; - retry_info.try_while_bad = try_while_bad; - retry_info.net_error = net_error; - (*proxy_retry_info)[proxy_chain_to_retry] = retry_info; - } - net_log.AddEventWithStringParams(NetLogEventType::PROXY_LIST_FALLBACK, - "bad_proxy_chain", - proxy_chain_to_retry.ToDebugString()); -} - -void ProxyList::UpdateRetryInfoOnFallback( - ProxyRetryInfoMap* proxy_retry_info, - base::TimeDelta retry_delay, - bool reconsider, - const std::vector& additional_proxies_to_bypass, - int net_error, - const NetLogWithSource& net_log) const { - DCHECK(!retry_delay.is_zero()); - - if (proxy_chains_.empty()) { - NOTREACHED(); - } - - auto& first_chain = proxy_chains_[0]; - if (!first_chain.is_direct()) { - AddProxyChainToRetryList(proxy_retry_info, retry_delay, reconsider, - first_chain, net_error, net_log); - // If any additional proxies to bypass are specified, add to the retry map - // as well. - for (const ProxyChain& additional_proxy_chain : - additional_proxies_to_bypass) { - AddProxyChainToRetryList( - proxy_retry_info, retry_delay, reconsider, - ProxyChain(additional_proxy_chain.proxy_servers()), net_error, - net_log); - } - } -} - } // namespace net diff --git a/naiveproxy/src/net/proxy_resolution/proxy_list.h b/naiveproxy/src/net/proxy_resolution/proxy_list.h index db427c86eb..e5ee0b42d1 100644 --- a/naiveproxy/src/net/proxy_resolution/proxy_list.h +++ b/naiveproxy/src/net/proxy_resolution/proxy_list.h @@ -17,7 +17,6 @@ #include "net/proxy_resolution/proxy_retry_info.h" namespace base { -class TimeDelta; class Value; } @@ -43,21 +42,24 @@ class NET_EXPORT_PRIVATE ProxyList { void Set(const std::string& proxy_uri_list); // Set the proxy list to a single entry, |proxy_chain|. - void SetSingleProxyChain(const ProxyChain& proxy_chain); + void SetSingleProxyChain(ProxyChain proxy_chain); // Set the proxy list to a single entry, a chain containing |proxy_server|. - void SetSingleProxyServer(const ProxyServer& proxy_server); + void SetSingleProxyServer(ProxyServer proxy_server); // Append a single proxy chain to the end of the proxy list. - void AddProxyChain(const ProxyChain& proxy_chain); + void AddProxyChain(ProxyChain proxy_chain); // Append a single proxy chain containing the given server to the end of the // proxy list. - void AddProxyServer(const ProxyServer& proxy_server); + void AddProxyServer(ProxyServer proxy_server); // De-prioritizes the proxy chains that are cached as not working but are // allowed to be reconsidered, by moving them to the end of the fallback list. - void DeprioritizeBadProxyChains(const ProxyRetryInfoMap& proxy_retry_info); + // If `remove_bad_proxy_chains` is true, bad proxy chains are removed + // from the list rather than just moved to the end. + void DeprioritizeBadProxyChains(const ProxyRetryInfoMap& proxy_retry_info, + bool remove_bad_proxy_chains = false); // Deletes all chains which don't exclusively consist of proxy servers with // the specified schemes. `scheme_bit_field` is a bunch of @@ -113,40 +115,14 @@ class NET_EXPORT_PRIVATE ProxyList { // tried, if any. If this fallback is not because of a network error, then // |OK| should be passed in (eg. for reasons such as local policy). Returns // true if there is another chain available in the list. + // + // When a proxy chain is marked as bad, it will be deprioritized by calls to + // `DeprioritizeBadProxyChains()` for five minutes. bool Fallback(ProxyRetryInfoMap* proxy_retry_info, int net_error, const NetLogWithSource& net_log); - // Updates |proxy_retry_info| to indicate that the first proxy chain in the - // list is bad. This is distinct from Fallback(), above, to allow updating - // proxy retry information without modifying a given transction's proxy list. - // Will retry after |retry_delay| if positive, and will use the default proxy - // retry duration otherwise. It may reconsider the proxy beforehand if - // |reconsider| is true. Additionally updates |proxy_retry_info| with - // |additional_proxies_to_bypass|. |net_error| should contain the network - // error countered when this proxy chain was tried, or OK if the proxy retry - // info is being updated for a non-network related reason (e.g. local policy). - void UpdateRetryInfoOnFallback( - ProxyRetryInfoMap* proxy_retry_info, - base::TimeDelta retry_delay, - bool reconsider, - const std::vector& additional_proxies_to_bypass, - int net_error, - const NetLogWithSource& net_log) const; - private: - // Updates |proxy_retry_info| to indicate that the |proxy_to_retry| in - // |proxies_| is bad for |retry_delay|, but may be reconsidered earlier if - // |try_while_bad| is true. |net_error| should contain the network error - // countered when this proxy was tried, or OK if the proxy retry info is - // being updated for a non-network related reason (e.g. local policy). - void AddProxyChainToRetryList(ProxyRetryInfoMap* proxy_retry_info, - base::TimeDelta retry_delay, - bool try_while_bad, - const ProxyChain& proxy_chain_to_retry, - int net_error, - const NetLogWithSource& net_log) const; - // List of proxy chains. std::vector proxy_chains_; }; diff --git a/naiveproxy/src/net/proxy_resolution/proxy_resolution_service.cc b/naiveproxy/src/net/proxy_resolution/proxy_resolution_service.cc new file mode 100644 index 0000000000..d0fd77450f --- /dev/null +++ b/naiveproxy/src/net/proxy_resolution/proxy_resolution_service.cc @@ -0,0 +1,74 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/proxy_resolution/proxy_resolution_service.h" + +#include + +#include "base/logging.h" +#include "net/base/proxy_chain.h" +#include "net/base/proxy_delegate.h" +#include "net/log/net_log.h" +#include "net/log/net_log_event_type.h" + +namespace net { + +// static +void ProxyResolutionService::ProcessProxyRetryInfo( + const ProxyRetryInfoMap& new_retry_info, + ProxyRetryInfoMap& proxy_retry_info, + ProxyDelegate* proxy_delegate) { + if (new_retry_info.empty()) { + return; + } + + if (proxy_delegate) { + proxy_delegate->OnSuccessfulRequestAfterFailures(new_retry_info); + } + + for (const auto& [proxy_chain, retry_info] : new_retry_info) { + auto [it, inserted] = proxy_retry_info.try_emplace(proxy_chain, retry_info); + + if (inserted) { + if (proxy_delegate) { + DCHECK(!proxy_chain.is_direct()); + proxy_delegate->OnFallback(proxy_chain, retry_info.net_error); + } + } else if (it->second.bad_until < retry_info.bad_until) { + it->second.bad_until = retry_info.bad_until; + } + } +} + +// static +base::Value::List ProxyResolutionService::BuildBadProxiesList( + const ProxyRetryInfoMap& proxy_retry_info) { + base::Value::List list; + list.reserve(proxy_retry_info.size()); + + for (const auto& [proxy_chain, retry_info] : proxy_retry_info) { + base::Value::Dict dict; + dict.Set("proxy_chain_uri", proxy_chain.ToDebugString()); + dict.Set("bad_until", NetLog::TickCountToString(retry_info.bad_until)); + + list.Append(base::Value(std::move(dict))); + } + return list; +} + +// static +void ProxyResolutionService::DeprioritizeBadProxyChains( + const ProxyRetryInfoMap& proxy_retry_info, + ProxyInfo* result, + const NetLogWithSource& net_log) { + // This check is done to only log the NetLog event when necessary, it's + // not a performance optimization. + if (!proxy_retry_info.empty()) { + result->DeprioritizeBadProxyChains(proxy_retry_info); + net_log.AddEvent( + NetLogEventType::PROXY_RESOLUTION_SERVICE_DEPRIORITIZED_BAD_PROXIES); + } +} + +} // namespace net diff --git a/naiveproxy/src/net/proxy_resolution/proxy_resolution_service.h b/naiveproxy/src/net/proxy_resolution/proxy_resolution_service.h index 80b4684a30..876523537f 100644 --- a/naiveproxy/src/net/proxy_resolution/proxy_resolution_service.h +++ b/naiveproxy/src/net/proxy_resolution/proxy_resolution_service.h @@ -9,12 +9,14 @@ #include #include "base/time/time.h" +#include "base/values.h" #include "net/base/completion_once_callback.h" #include "net/base/net_export.h" #include "net/base/network_anonymization_key.h" #include "net/base/proxy_server.h" #include "net/log/net_log_with_source.h" #include "net/proxy_resolution/proxy_info.h" +#include "net/proxy_resolution/proxy_retry_info.h" #include "url/gurl.h" namespace net { @@ -95,6 +97,27 @@ class NET_EXPORT ProxyResolutionService { [[nodiscard]] virtual bool CastToConfiguredProxyResolutionService( ConfiguredProxyResolutionService** configured_proxy_resolution_service) = 0; + + protected: + // Helper method to handle the common logic for ReportSuccess implementations. + // This method processes proxy retry information and delegates to proxy + // delegate callbacks. Derived classes can call this static method to reuse + // the core logic while providing their own logging or other customizations. + static void ProcessProxyRetryInfo(const ProxyRetryInfoMap& new_retry_info, + ProxyRetryInfoMap& proxy_retry_info, + ProxyDelegate* proxy_delegate); + + // Returns a list for bad proxies from the proxy retry info map. + static base::Value::List BuildBadProxiesList( + const ProxyRetryInfoMap& proxy_retry_info); + + // Helper method to deprioritize bad proxy chains and log the action. + // This handles the common pattern of checking if proxy_retry_info is not + // empty, calling DeprioritizeBadProxyChains, and logging the event. + static void DeprioritizeBadProxyChains( + const ProxyRetryInfoMap& proxy_retry_info, + ProxyInfo* result, + const NetLogWithSource& net_log); }; } // namespace net diff --git a/naiveproxy/src/net/proxy_resolution/proxy_resolver_apple.cc b/naiveproxy/src/net/proxy_resolution/proxy_resolver_apple.cc index ba3f4b9615..bf758a1004 100644 --- a/naiveproxy/src/net/proxy_resolution/proxy_resolver_apple.cc +++ b/naiveproxy/src/net/proxy_resolution/proxy_resolver_apple.cc @@ -334,10 +334,9 @@ int ProxyResolverApple::GetProxyForURL( ProxyChain proxy_chain = ProxyDictionaryToProxyChain(proxy_type, proxy_dictionary, kCFProxyHostNameKey, kCFProxyPortNumberKey); - if (!proxy_chain.IsValid()) { - continue; - } + // No need to check if `proxy_chain` is valid, as AddProxyChain() ignores + // invalid proxy chains. proxy_list.AddProxyChain(proxy_chain); } diff --git a/naiveproxy/src/net/proxy_resolution/proxy_retry_info.h b/naiveproxy/src/net/proxy_resolution/proxy_retry_info.h index b919c8c0ae..6c2e86f553 100644 --- a/naiveproxy/src/net/proxy_resolution/proxy_retry_info.h +++ b/naiveproxy/src/net/proxy_resolution/proxy_retry_info.h @@ -19,13 +19,6 @@ struct ProxyRetryInfo { // We should not retry until this time. base::TimeTicks bad_until; - // This is the current delay. If the proxy chain is still bad, we need to - // increase this delay. - base::TimeDelta current_delay; - - // True if this proxy chain should be considered even if still bad. - bool try_while_bad = true; - // The network error received when this proxy failed, or |OK| if the proxy // was added to the retry list for a non-network related reason. (e.g. local // policy). diff --git a/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_request.cc b/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_request.cc index 9716cf5286..7ea34d1e7a 100644 --- a/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_request.cc +++ b/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_request.cc @@ -6,7 +6,9 @@ #include +#include "base/metrics/histogram_functions.h" #include "net/base/net_errors.h" +#include "net/base/network_anonymization_key.h" #include "net/proxy_resolution/proxy_info.h" #include "net/proxy_resolution/proxy_list.h" #include "net/proxy_resolution/win/windows_system_proxy_resolution_service.h" @@ -50,6 +52,7 @@ WindowsSystemProxyResolutionRequest::WindowsSystemProxyResolutionRequest( WindowsSystemProxyResolutionService* service, const GURL& url, const std::string& method, + const NetworkAnonymizationKey& network_anonymization_key, ProxyInfo* results, CompletionOnceCallback user_callback, const NetLogWithSource& net_log, @@ -59,6 +62,7 @@ WindowsSystemProxyResolutionRequest::WindowsSystemProxyResolutionRequest( results_(results), url_(url), method_(method), + network_anonymization_key_(network_anonymization_key), net_log_(net_log), creation_time_(base::TimeTicks::Now()) { DCHECK(!user_callback_.is_null()); @@ -96,14 +100,19 @@ void WindowsSystemProxyResolutionRequest::ProxyResolutionComplete( int windows_error) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!was_completed()); - // TODO(crbug.com/40111093): Log Windows error |windows_error|. + + if (windows_error != 0) { + base::UmaHistogramSparse("Net.HttpProxy.WindowsSystemResolver.WinError", + windows_error); + } proxy_resolution_request_.reset(); results_->UseProxyList(proxy_list); // Note that DidFinishResolvingProxy might modify |results_|. - int net_error = service_->DidFinishResolvingProxy(url_, method_, results_, - winhttp_status, net_log_); + int net_error = service_->DidFinishResolvingProxy( + url_, method_, network_anonymization_key_, results_, winhttp_status, + windows_error, net_log_); // Make a note in the results which configuration was in use at the // time of the resolve. diff --git a/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_request.h b/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_request.h index bd1e800b34..608aa1e64c 100644 --- a/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_request.h +++ b/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_request.h @@ -13,6 +13,7 @@ #include "base/time/time.h" #include "net/base/completion_once_callback.h" #include "net/base/net_export.h" +#include "net/base/network_anonymization_key.h" #include "net/log/net_log_with_source.h" #include "net/proxy_resolution/proxy_resolution_request.h" #include "net/proxy_resolution/win/windows_system_proxy_resolver.h" @@ -40,6 +41,7 @@ class NET_EXPORT WindowsSystemProxyResolutionRequest WindowsSystemProxyResolutionService* service, const GURL& url, const std::string& method, + const NetworkAnonymizationKey& network_anonymization_key, ProxyInfo* results, const CompletionOnceCallback user_callback, const NetLogWithSource& net_log, @@ -84,6 +86,7 @@ class NET_EXPORT WindowsSystemProxyResolutionRequest raw_ptr results_; const GURL url_; const std::string method_; + const NetworkAnonymizationKey network_anonymization_key_; NetLogWithSource net_log_; // Time when the request was created. Stored here rather than in |results_| // because the time in |results_| will be cleared. diff --git a/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_service.cc b/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_service.cc index ba6e0b766a..443815fd09 100644 --- a/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_service.cc +++ b/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_service.cc @@ -11,6 +11,7 @@ #include "base/values.h" #include "base/win/windows_version.h" #include "net/base/net_errors.h" +#include "net/base/net_info_source_list.h" #include "net/log/net_log.h" #include "net/log/net_log_event_type.h" #include "net/log/net_log_with_source.h" @@ -82,8 +83,8 @@ int WindowsSystemProxyResolutionService::ResolveProxy( // Once it's created, the WindowsSystemProxyResolutionRequest immediately // kicks off proxy resolution in a separate process. auto req = std::make_unique( - this, url, method, results, std::move(callback), net_log, - windows_system_proxy_resolver_.get()); + this, url, method, network_anonymization_key, results, + std::move(callback), net_log, windows_system_proxy_resolver_.get()); DCHECK(!ContainsPendingRequest(req.get())); pending_requests_.insert(req.get()); @@ -96,13 +97,17 @@ int WindowsSystemProxyResolutionService::ResolveProxy( void WindowsSystemProxyResolutionService::ReportSuccess( const ProxyInfo& proxy_info) { - // TODO(crbug.com/40111093): Update proxy retry info with new proxy - // resolution data. + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + const ProxyRetryInfoMap& new_retry_info = proxy_info.proxy_retry_info(); + ProxyResolutionService::ProcessProxyRetryInfo( + new_retry_info, proxy_retry_info_, proxy_delegate_); } void WindowsSystemProxyResolutionService::SetProxyDelegate( ProxyDelegate* delegate) { - // TODO(crbug.com/40111093): Implement proxy delegates. + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(!proxy_delegate_ || !delegate); + proxy_delegate_ = delegate; } void WindowsSystemProxyResolutionService::OnShutdown() { @@ -121,8 +126,20 @@ const ProxyRetryInfoMap& WindowsSystemProxyResolutionService::proxy_retry_info() } base::Value::Dict WindowsSystemProxyResolutionService::GetProxyNetLogValues() { - // TODO (https://crbug.com/1032820): Implement net logs. - return base::Value::Dict(); + base::Value::Dict net_info_dict; + + // Log proxy settings - Windows system proxy uses the system configuration + { + base::Value::Dict dict; + dict.Set("source", "system"); + dict.Set("description", "Windows system proxy configuration"); + net_info_dict.Set(kNetInfoProxySettings, std::move(dict)); + } + + // Log Bad Proxies. + net_info_dict.Set(kNetInfoBadProxies, BuildBadProxiesList(proxy_retry_info_)); + + return net_info_dict; } bool WindowsSystemProxyResolutionService:: @@ -149,17 +166,35 @@ void WindowsSystemProxyResolutionService::RemovePendingRequest( int WindowsSystemProxyResolutionService::DidFinishResolvingProxy( const GURL& url, const std::string& method, + const NetworkAnonymizationKey& network_anonymization_key, ProxyInfo* result, WinHttpStatus winhttp_status, + int windows_error, const NetLogWithSource& net_log) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // TODO(crbug.com/40111093): Implement net logs. - // TODO(crbug.com/40111093): Implement proxy delegate. - // TODO(crbug.com/40111093): Implement proxy retry info. + // Log the diagnostic information about the WinHTTP resolution + net_log.AddEvent( + NetLogEventType::PROXY_RESOLUTION_SERVICE_RESOLVED_PROXY_LIST, [&] { + base::Value::Dict resolution_dict; + resolution_dict.Set("winhttp_status", static_cast(winhttp_status)); + resolution_dict.Set("windows_error", windows_error); + if (winhttp_status == WinHttpStatus::kOk) { + resolution_dict.Set("proxy_info", result->ToDebugString()); + } + return resolution_dict; + }); - if (winhttp_status != WinHttpStatus::kOk) + if (winhttp_status == WinHttpStatus::kOk) { + if (proxy_delegate_) { + proxy_delegate_->OnResolveProxy(url, network_anonymization_key, method, + proxy_retry_info_, result); + } + + DeprioritizeBadProxyChains(proxy_retry_info_, result, net_log); + } else { result->UseDirect(); + } net_log.EndEvent(NetLogEventType::PROXY_RESOLUTION_SERVICE); return OK; diff --git a/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_service.h b/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_service.h index 278e0f4fdf..e35be1981d 100644 --- a/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_service.h +++ b/naiveproxy/src/net/proxy_resolution/win/windows_system_proxy_resolution_service.h @@ -5,15 +5,15 @@ #ifndef NET_PROXY_RESOLUTION_WIN_WINDOWS_SYSTEM_PROXY_RESOLUTION_SERVICE_H_ #define NET_PROXY_RESOLUTION_WIN_WINDOWS_SYSTEM_PROXY_RESOLUTION_SERVICE_H_ -#include "base/memory/raw_ptr.h" -#include "net/proxy_resolution/proxy_resolution_service.h" - #include #include #include +#include "base/memory/raw_ptr.h" #include "base/sequence_checker.h" #include "net/base/net_export.h" +#include "net/base/proxy_delegate.h" +#include "net/proxy_resolution/proxy_resolution_service.h" #include "net/proxy_resolution/win/winhttp_status.h" namespace net { @@ -84,11 +84,14 @@ class NET_EXPORT WindowsSystemProxyResolutionService // Called when proxy resolution has completed (either synchronously or // asynchronously). Handles logging the result, and cleaning out // bad entries from the results list. - int DidFinishResolvingProxy(const GURL& url, - const std::string& method, - ProxyInfo* result, - WinHttpStatus winhttp_status, - const NetLogWithSource& net_log); + int DidFinishResolvingProxy( + const GURL& url, + const std::string& method, + const NetworkAnonymizationKey& network_anonymization_key, + ProxyInfo* result, + WinHttpStatus winhttp_status, + int windows_error, + const NetLogWithSource& net_log); // Map of the known bad proxies and the information about the retry time. ProxyRetryInfoMap proxy_retry_info_; @@ -104,6 +107,11 @@ class NET_EXPORT WindowsSystemProxyResolutionService // This is the log for any generated events. raw_ptr net_log_; + // Optional delegate for customizing proxy resolution behavior and receiving + // proxy-related callbacks. + raw_ptr proxy_delegate_ = nullptr; + + // Ensures all method calls are made on the same sequence. SEQUENCE_CHECKER(sequence_checker_); }; diff --git a/naiveproxy/src/net/proxy_resolution/win/winhttp_status.h b/naiveproxy/src/net/proxy_resolution/win/winhttp_status.h index 9111194169..3d52551d4e 100644 --- a/naiveproxy/src/net/proxy_resolution/win/winhttp_status.h +++ b/naiveproxy/src/net/proxy_resolution/win/winhttp_status.h @@ -11,7 +11,7 @@ namespace net { // into the proxy_resolver_win service. Further detail is additionally provided // by the Windows error code, which will be supplied alongside this enum. // -// Keep in sync with proxy_resolver_win.mojom.WinHttpStatus. +// Keep in sync with proxy_resolver.mojom.WinHttpStatus. // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. diff --git a/naiveproxy/src/net/quic/dedicated_web_transport_http3_client.cc b/naiveproxy/src/net/quic/dedicated_web_transport_http3_client.cc index fe8547b0ce..b7e45bfefa 100644 --- a/naiveproxy/src/net/quic/dedicated_web_transport_http3_client.cc +++ b/naiveproxy/src/net/quic/dedicated_web_transport_http3_client.cc @@ -45,9 +45,7 @@ constexpr int kCustomCertificateMaxValidityDays = 14; constexpr base::TimeDelta kMaxCloseTimeout = base::Seconds(2); // Enables custom congestion control for WebTransport over HTTP/3. -BASE_FEATURE(kWebTransportCongestionControl, - "WebTransportCongestionControl", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kWebTransportCongestionControl, base::FEATURE_DISABLED_BY_DEFAULT); constexpr base::FeatureParam::Option kWebTransportCongestionControlAlgorithms[] = { {quic::kCubicBytes, "CUBIC"}, @@ -61,10 +59,11 @@ constexpr base::FeatureParam /*default_value=*/quic::kCubicBytes, &kWebTransportCongestionControlAlgorithms}; -std::set HostsFromOrigins(std::set origins) { +std::set HostsFromSchemeHostPorts( + const std::set& scheme_host_ports) { std::set hosts; - for (const auto& origin : origins) { - hosts.insert(origin.host()); + for (const auto& scheme_host_port : scheme_host_ports) { + hosts.insert(scheme_host_port.host()); } return hosts; } @@ -93,9 +92,11 @@ std::unique_ptr CreateProofVerifier( URLRequestContext* context, const WebTransportParameters& parameters) { if (parameters.server_certificate_fingerprints.empty()) { - std::set hostnames_to_allow_unknown_roots = HostsFromOrigins( - context->quic_context()->params()->origins_to_force_quic_on); - if (context->quic_context()->params()->webtransport_developer_mode) { + std::set hostnames_to_allow_unknown_roots = + HostsFromSchemeHostPorts( + context->quic_context()->params()->origins_to_force_quic_on); + if (context->quic_context()->params()->force_quic_everywhere || + context->quic_context()->params()->webtransport_developer_mode) { hostnames_to_allow_unknown_roots.insert(""); } return std::make_unique( @@ -242,10 +243,11 @@ class DedicatedWebTransportHttp3ClientSession return stream_ptr; } - void OnDatagramProcessed(std::optional status) override { + void OnDatagramProcessed( + std::optional status) override { client_->OnDatagramProcessed( - status.has_value() ? std::optional(*status) - : std::optional()); + status.has_value() ? std::optional(*status) + : std::optional()); } private: @@ -470,6 +472,12 @@ void DedicatedWebTransportHttp3Client::DoLoop(int rv) { case CONNECT_STATE_RESOLVE_HOST_COMPLETE: rv = DoResolveHostComplete(rv); break; + case CONNECT_STATE_CHECK_LOCAL_NETWORK_ACCESS: + rv = DoLocalNetworkAccessCheck(); + break; + case CONNECT_STATE_CHECK_LOCAL_NETWORK_ACCESS_COMPLETE: + rv = DoLocalNetworkAccessCheckComplete(rv); + break; case CONNECT_STATE_CONNECT: DCHECK_EQ(rv, OK); rv = DoConnect(); @@ -502,11 +510,13 @@ void DedicatedWebTransportHttp3Client::DoLoop(int rv) { int DedicatedWebTransportHttp3Client::DoInit() { if (!url_.is_valid()) return ERR_INVALID_URL; - if (url_.scheme_piece() != url::kHttpsScheme) + if (url_.scheme() != url::kHttpsScheme) { return ERR_DISALLOWED_URL_SCHEME; + } - if (!IsPortAllowedForScheme(url_.EffectiveIntPort(), url_.scheme_piece())) + if (!IsPortAllowedForScheme(url_.EffectiveIntPort(), url_.scheme())) { return ERR_UNSAFE_PORT; + } if (!application_protocols_.empty() && !webtransport::ValidateSubprotocolList(application_protocols_)) { @@ -571,6 +581,26 @@ int DedicatedWebTransportHttp3Client::DoResolveHostComplete(int rv) { return rv; DCHECK(!resolve_host_request_->GetAddressResults().empty()); + next_connect_state_ = CONNECT_STATE_CHECK_LOCAL_NETWORK_ACCESS; + return OK; +} + +int DedicatedWebTransportHttp3Client::DoLocalNetworkAccessCheck() { + next_connect_state_ = CONNECT_STATE_CHECK_LOCAL_NETWORK_ACCESS_COMPLETE; + IPEndPoint server_address = + resolve_host_request_->GetAddressResults().front(); + visitor_->OnLocalNetworkAccessCheck( + server_address, base::BindOnce(&DedicatedWebTransportHttp3Client::DoLoop, + base::Unretained(this))); + return ERR_IO_PENDING; +} + +int DedicatedWebTransportHttp3Client::DoLocalNetworkAccessCheckComplete( + int rv) { + if (rv != OK) { + return rv; + } + next_connect_state_ = CONNECT_STATE_CONNECT; return OK; } @@ -620,8 +650,8 @@ void DedicatedWebTransportHttp3Client::CreateConnection() { session_ = std::make_unique( InitializeQuicConfig(*quic_context_->params()), supported_versions_, connection.release(), - quic::QuicServerId(url_.host(), url_.EffectiveIntPort()), &crypto_config_, - this); + quic::QuicServerId(url_.GetHost(), url_.EffectiveIntPort()), + &crypto_config_, this); if (!original_supported_versions_.empty()) { session_->set_client_original_supported_versions( original_supported_versions_); @@ -748,8 +778,8 @@ int DedicatedWebTransportHttp3Client::DoSendRequest() { } quiche::HttpHeaderBlock headers; - DCHECK_EQ(url_.scheme(), url::kHttpsScheme); - headers[":scheme"] = url_.scheme(); + DCHECK_EQ(url_.GetScheme(), url::kHttpsScheme); + headers[":scheme"] = url_.GetScheme(); headers[":method"] = "CONNECT"; headers[":authority"] = GetHostAndOptionalPort(url_); headers[":path"] = url_.PathForRequest(); @@ -992,7 +1022,7 @@ void DedicatedWebTransportHttp3Client::OnConnectionClosed( } void DedicatedWebTransportHttp3Client::OnDatagramProcessed( - std::optional status) { + std::optional status) { visitor_->OnDatagramProcessed(status); } diff --git a/naiveproxy/src/net/quic/dedicated_web_transport_http3_client.h b/naiveproxy/src/net/quic/dedicated_web_transport_http3_client.h index 516bef6c81..8458cd6176 100644 --- a/naiveproxy/src/net/quic/dedicated_web_transport_http3_client.h +++ b/naiveproxy/src/net/quic/dedicated_web_transport_http3_client.h @@ -73,7 +73,7 @@ class NET_EXPORT DedicatedWebTransportHttp3Client void OnConnectStreamAborted(); void OnConnectStreamDeleted(); void OnCloseTimeout(); - void OnDatagramProcessed(std::optional status); + void OnDatagramProcessed(std::optional status); // QuicTransportClientSession::ClientVisitor methods. void OnSessionReady() override; @@ -111,6 +111,8 @@ class NET_EXPORT DedicatedWebTransportHttp3Client CONNECT_STATE_CHECK_PROXY_COMPLETE, CONNECT_STATE_RESOLVE_HOST, CONNECT_STATE_RESOLVE_HOST_COMPLETE, + CONNECT_STATE_CHECK_LOCAL_NETWORK_ACCESS, + CONNECT_STATE_CHECK_LOCAL_NETWORK_ACCESS_COMPLETE, CONNECT_STATE_CONNECT, CONNECT_STATE_CONNECT_CONFIGURE, CONNECT_STATE_CONNECT_COMPLETE, @@ -130,6 +132,9 @@ class NET_EXPORT DedicatedWebTransportHttp3Client // Resolves the hostname in the URL. int DoResolveHost(); int DoResolveHostComplete(int rv); + // Run Local Network Access checks before initiating connection. + int DoLocalNetworkAccessCheck(); + int DoLocalNetworkAccessCheckComplete(int rv); // Establishes the QUIC connection. int DoConnect(); int DoConnectConfigure(int rv); diff --git a/naiveproxy/src/net/quic/network_connection.cc b/naiveproxy/src/net/quic/network_connection.cc index 1a510b3a59..f138c7389b 100644 --- a/naiveproxy/src/net/quic/network_connection.cc +++ b/naiveproxy/src/net/quic/network_connection.cc @@ -12,7 +12,7 @@ namespace net { NetworkConnection::NetworkConnection() { NetworkChangeNotifier::AddIPAddressObserver(this); NetworkChangeNotifier::AddConnectionTypeObserver(this); - OnIPAddressChanged(); + OnIPAddressChanged(NetworkChangeNotifier::IP_ADDRESS_CHANGE_NORMAL); } NetworkConnection::~NetworkConnection() { @@ -20,7 +20,8 @@ NetworkConnection::~NetworkConnection() { NetworkChangeNotifier::RemoveIPAddressObserver(this); } -void NetworkConnection::OnIPAddressChanged() { +void NetworkConnection::OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) { OnConnectionTypeChanged(NetworkChangeNotifier::GetConnectionType()); } diff --git a/naiveproxy/src/net/quic/network_connection.h b/naiveproxy/src/net/quic/network_connection.h index b3bf1f79de..559e3ee59f 100644 --- a/naiveproxy/src/net/quic/network_connection.h +++ b/naiveproxy/src/net/quic/network_connection.h @@ -40,7 +40,8 @@ class NET_EXPORT NetworkConnection const char* connection_description() { return connection_description_; } // NetworkChangeNotifier::IPAddressObserver methods: - void OnIPAddressChanged() override; + void OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) override; // NetworkChangeNotifier::ConnectionTypeObserver methods: void OnConnectionTypeChanged( diff --git a/naiveproxy/src/net/quic/quic_chromium_client_session.cc b/naiveproxy/src/net/quic/quic_chromium_client_session.cc index 6120cf9670..1439e7043c 100644 --- a/naiveproxy/src/net/quic/quic_chromium_client_session.cc +++ b/naiveproxy/src/net/quic/quic_chromium_client_session.cc @@ -66,6 +66,7 @@ #include "net/spdy/spdy_session.h" #include "net/ssl/ssl_connection_status_flags.h" #include "net/ssl/ssl_info.h" +#include "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h" #include "net/third_party/quiche/src/quiche/quic/core/quic_stream_priority.h" #include "net/third_party/quiche/src/quiche/quic/core/quic_types.h" #include "net/third_party/quiche/src/quiche/quic/core/quic_utils.h" @@ -1264,7 +1265,7 @@ void QuicChromiumClientSession::OnOriginFrame(const quic::OriginFrame& frame) { return; } GURL url(base::StrCat({origin_str, "/"})); - if (!url.is_valid() || url.path() != "/") { + if (!url.is_valid() || url.GetPath() != "/") { continue; } url::SchemeHostPort origin(url); @@ -1716,15 +1717,11 @@ quic::QuicSSLConfig QuicChromiumClientSession::GetSSLConfig() const { config.ech_config_list.assign(ech_config_list_.begin(), ech_config_list_.end()); } - if (base::FeatureList::IsEnabled(features::kTLSTrustAnchorIDs)) { - if (!trust_anchor_ids_.empty() && - !ssl_context_config.trust_anchor_ids.empty()) { - std::vector selected_trust_anchor_ids = - SSLConfig::SelectTrustAnchorIDs(trust_anchor_ids_, - ssl_context_config.trust_anchor_ids); - config.trust_anchor_ids = std::string(selected_trust_anchor_ids.begin(), - selected_trust_anchor_ids.end()); - } + if (!ssl_context_config.trust_anchor_ids.empty() && + base::FeatureList::IsEnabled(features::kTLSTrustAnchorIDs)) { + config.trust_anchor_ids = + base::as_string_view(SSLConfig::SelectTrustAnchorIDs( + trust_anchor_ids_, ssl_context_config.trust_anchor_ids)); } return config; } @@ -1769,6 +1766,10 @@ void QuicChromiumClientSession::RegisterQuicConnectionClosePayload() { features::kQuicRegisterConnectionClosePayload)) { return; } + // Cannot serialize ConnectionClosePacket before handshake is confirmed. + if (!connection()->IsHandshakeConfirmed()) { + return; + } std::unique_ptr connection_close_packet = connection()->SerializeLargePacketNumberConnectionClosePacket( quic::QUIC_CLIENT_LOST_NETWORK_ACCESS, @@ -2401,12 +2402,6 @@ void QuicChromiumClientSession::OnNoNewNetwork() { static_cast(connection()->writer()) ->set_force_write_blocked(true); - if (base::FeatureList::IsEnabled(features::kDisableBlackholeOnNoNewNetwork)) { - // Turn off the black hole detector since the writer is blocked. - // Blackhole will be re-enabled once a packet is sent again. - connection()->blackhole_detector().StopDetection(false); - } - // Post a task to maybe close the session if the alarm fires. task_runner_->PostDelayedTask( FROM_HERE, @@ -3941,11 +3936,6 @@ void QuicChromiumClientSession::Migrate(handles::NetworkHandle network, DVLOG(1) << "Force blocking the packet writer"; static_cast(connection()->writer()) ->set_force_write_blocked(true); - if (base::FeatureList::IsEnabled(features::kDisableBlackholeOnNoNewNetwork)) { - // Turn off the black hole detector since the writer is blocked. - // Blackhole will be re-enabled once a packet is sent again. - connection()->blackhole_detector().StopDetection(false); - } CompletionOnceCallback connect_callback = base::BindOnce( &QuicChromiumClientSession::FinishMigrate, weak_factory_.GetWeakPtr(), std::move(socket), peer_address, close_session_on_error, @@ -4168,7 +4158,7 @@ QuicChromiumClientSession::Handle::GetGuaranteedLargestMessagePayload() const { if (!session_) { return 0; } - return session_->GetGuaranteedLargestMessagePayload(); + return session_->GetGuaranteedLargestDatagramPayload(); } const ConnectionMigrationInformation diff --git a/naiveproxy/src/net/quic/quic_chromium_client_session_peer.cc b/naiveproxy/src/net/quic/quic_chromium_client_session_peer.cc index 0800beea81..dcbf2318ab 100644 --- a/naiveproxy/src/net/quic/quic_chromium_client_session_peer.cc +++ b/naiveproxy/src/net/quic/quic_chromium_client_session_peer.cc @@ -28,7 +28,8 @@ void QuicChromiumClientSessionPeer::SetHostname( session->session_key_.session_usage(), session->session_key_.socket_tag(), session->session_key_.network_anonymization_key(), session->session_key_.secure_dns_policy(), - session->session_key_.require_dns_https_alpn()); + session->session_key_.require_dns_https_alpn(), + session->session_key_.disable_cert_verification_network_fetches()); } // static diff --git a/naiveproxy/src/net/quic/quic_chromium_client_stream.cc b/naiveproxy/src/net/quic/quic_chromium_client_stream.cc index 1a267f5f48..7567aca83b 100644 --- a/naiveproxy/src/net/quic/quic_chromium_client_stream.cc +++ b/naiveproxy/src/net/quic/quic_chromium_client_stream.cc @@ -313,12 +313,13 @@ int QuicChromiumClientStream::Handle::WriteConnectUdpPayload( std::string http_payload = base::StrCat({std::string(1, '\0'), packet}); // Attempt to send the HTTP payload as a datagram over the stream. - quic::MessageStatus message_status = stream_->SendHttp3Datagram(http_payload); + quic::DatagramStatus message_status = + stream_->SendHttp3Datagram(http_payload); // If the attempt was successful or blocked (e.g., due to buffer // constraints), proceed to handle the I/O completion with an OK status. - if (message_status == quic::MessageStatus::MESSAGE_STATUS_SUCCESS || - message_status == quic::MessageStatus::MESSAGE_STATUS_BLOCKED) { + if (message_status == quic::DatagramStatus::DATAGRAM_STATUS_SUCCESS || + message_status == quic::DatagramStatus::DATAGRAM_STATUS_BLOCKED) { return HandleIOComplete(OK); } // If the attempt failed due to a unsupported feature, internal error, or @@ -327,8 +328,8 @@ int QuicChromiumClientStream::Handle::WriteConnectUdpPayload( else { // These two errors should not be possible here. DCHECK(message_status != - quic::MessageStatus::MESSAGE_STATUS_ENCRYPTION_NOT_ESTABLISHED); - DCHECK(message_status != quic::MessageStatus::MESSAGE_STATUS_TOO_LARGE); + quic::DatagramStatus::DATAGRAM_STATUS_ENCRYPTION_NOT_ESTABLISHED); + DCHECK(message_status != quic::DatagramStatus::DATAGRAM_STATUS_TOO_LARGE); DLOG(ERROR) << "Failed to send Http3 Datagram on " << stream_->id(); stream_->Reset(quic::QUIC_STREAM_CANCELLED); return ERR_CONNECTION_CLOSED; @@ -919,7 +920,7 @@ QuicChromiumClientStream::GetGuaranteedLargestMessagePayload() const { if (!session()) { return 0; } - return session()->GetGuaranteedLargestMessagePayload(); + return session()->GetGuaranteedLargestDatagramPayload(); } bool QuicChromiumClientStream::IsFirstStream() { diff --git a/naiveproxy/src/net/quic/quic_chromium_client_stream.h b/naiveproxy/src/net/quic/quic_chromium_client_stream.h index 4720afee6c..14992cdd48 100644 --- a/naiveproxy/src/net/quic/quic_chromium_client_stream.h +++ b/naiveproxy/src/net/quic/quic_chromium_client_stream.h @@ -170,6 +170,10 @@ class NET_EXPORT_PRIVATE QuicChromiumClientStream // session are closed. quic::QuicPacketLength GetGuaranteedLargestMessagePayload() const; + bool SupportsH3Datagram() const { + return stream_ && stream_->SupportsH3Datagram(); + } + private: friend class QuicChromiumClientStream; diff --git a/naiveproxy/src/net/quic/quic_connection_logger.cc b/naiveproxy/src/net/quic/quic_connection_logger.cc index df66fc74ad..23ef1d4eae 100644 --- a/naiveproxy/src/net/quic/quic_connection_logger.cc +++ b/naiveproxy/src/net/quic/quic_connection_logger.cc @@ -137,7 +137,7 @@ void QuicConnectionLogger::OnFrameAddedToPacket(const quic::QuicFrame& frame) { base::UmaHistogramSparse("Net.QuicSession.StopSendingErrorCodeClient", frame.stop_sending_frame.error_code); break; - case quic::MESSAGE_FRAME: + case quic::DATAGRAM_FRAME: break; case quic::CRYPTO_FRAME: break; @@ -437,8 +437,9 @@ void QuicConnectionLogger::OnRetireConnectionIdFrame( event_logger_.OnRetireConnectionIdFrame(frame); } -void QuicConnectionLogger::OnMessageFrame(const quic::QuicMessageFrame& frame) { - event_logger_.OnMessageFrame(frame); +void QuicConnectionLogger::OnDatagramFrame( + const quic::QuicDatagramFrame& frame) { + event_logger_.OnDatagramFrame(frame); } void QuicConnectionLogger::OnHandshakeDoneFrame( diff --git a/naiveproxy/src/net/quic/quic_connection_logger.h b/naiveproxy/src/net/quic/quic_connection_logger.h index 620d1afdab..c0082e51bc 100644 --- a/naiveproxy/src/net/quic/quic_connection_logger.h +++ b/naiveproxy/src/net/quic/quic_connection_logger.h @@ -104,7 +104,7 @@ class NET_EXPORT_PRIVATE QuicConnectionLogger void OnNewTokenFrame(const quic::QuicNewTokenFrame& frame) override; void OnRetireConnectionIdFrame( const quic::QuicRetireConnectionIdFrame& frame) override; - void OnMessageFrame(const quic::QuicMessageFrame& frame) override; + void OnDatagramFrame(const quic::QuicDatagramFrame& frame) override; void OnHandshakeDoneFrame(const quic::QuicHandshakeDoneFrame& frame) override; void OnCoalescedPacketSent(const quic::QuicCoalescedPacket& coalesced_packet, size_t length) override; diff --git a/naiveproxy/src/net/quic/quic_context.cc b/naiveproxy/src/net/quic/quic_context.cc index d2c44aaaf0..487e253e6e 100644 --- a/naiveproxy/src/net/quic/quic_context.cc +++ b/naiveproxy/src/net/quic/quic_context.cc @@ -5,6 +5,7 @@ #include "net/quic/quic_context.h" #include "base/containers/contains.h" +#include "net/base/features.h" #include "net/quic/platform/impl/quic_chromium_clock.h" #include "net/quic/quic_chromium_connection_helper.h" #include "net/ssl/cert_compression.h" @@ -24,6 +25,20 @@ const int32_t kQuicStreamMaxRecvWindowSize = 6 * 1024 * 1024; // 6 MB // Set the maximum number of undecryptable packets the connection will store. const int32_t kMaxUndecryptablePackets = 100; +base::TimeDelta GetQuicHandshakeTimeout(const QuicParams& params) { + if (base::FeatureList::IsEnabled(features::kExtendQuicHandshakeTimeout)) { + return features::kQuicHandshakeTimeout.Get(); + } + return params.max_time_before_crypto_handshake; +} + +base::TimeDelta GetMaxIdleTimeBeforeCryptoHandshake(const QuicParams& params) { + if (base::FeatureList::IsEnabled(features::kExtendQuicHandshakeTimeout)) { + return features::kMaxIdleTimeBeforeCryptoHandshake.Get(); + } + return params.max_idle_time_before_crypto_handshake; +} + } // namespace QuicParams::QuicParams() = default; @@ -71,10 +86,10 @@ quic::QuicConfig InitializeQuicConfig(const QuicParams& params) { params.idle_connection_timeout.InMicroseconds())); config.set_max_time_before_crypto_handshake( quic::QuicTime::Delta::FromMicroseconds( - params.max_time_before_crypto_handshake.InMicroseconds())); + GetQuicHandshakeTimeout(params).InMicroseconds())); config.set_max_idle_time_before_crypto_handshake( quic::QuicTime::Delta::FromMicroseconds( - params.max_idle_time_before_crypto_handshake.InMicroseconds())); + GetMaxIdleTimeBeforeCryptoHandshake(params).InMicroseconds())); config.SetConnectionOptionsToSend(params.connection_options); config.SetClientConnectionOptions(params.client_connection_options); config.set_max_undecryptable_packets(kMaxUndecryptablePackets); diff --git a/naiveproxy/src/net/quic/quic_context.h b/naiveproxy/src/net/quic/quic_context.h index 15a5eadff1..d4cc134b49 100644 --- a/naiveproxy/src/net/quic/quic_context.h +++ b/naiveproxy/src/net/quic/quic_context.h @@ -11,9 +11,9 @@ #include "base/feature_list.h" #include "base/time/time.h" #include "net/base/features.h" -#include "net/base/host_port_pair.h" #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.h" #include "net/third_party/quiche/src/quiche/quic/core/quic_connection.h" +#include "url/scheme_host_port.h" namespace net { @@ -64,8 +64,15 @@ AllSupportedQuicVersions() { return filtered_versions; } -// When a connection is idle for 30 seconds it will be closed. -inline constexpr base::TimeDelta kIdleConnectionTimeout = base::Seconds(30); +// The idle connection timeout. Defaults to 30 seconds, but can be overridden +// by a field trial. +inline base::TimeDelta GetIdleConnectionTimeout() { + if (base::FeatureList::IsEnabled( + net::features::kQuicLongerIdleConnectionTimeout)) { + return base::Seconds(300); + } + return base::Seconds(30); +} // Sessions can migrate if they have been idle for less than this period. constexpr base::TimeDelta kDefaultIdleSessionMigrationPeriod = @@ -119,8 +126,12 @@ struct NET_EXPORT QuicParams { // Maximum number of server configs that are to be stored in // HttpServerProperties, instead of the disk cache. size_t max_server_configs_stored_in_properties = 0u; + + // If trust, QUIC will be forced on all origins. + bool force_quic_everywhere = false; // QUIC will be used for all connections in this set. - std::set origins_to_force_quic_on; + std::set origins_to_force_quic_on; + // WebTransport developer mode disables the requirement that all QUIC // connections are anchored to a system certificate root, but only for // WebTransport connections. @@ -144,7 +155,7 @@ struct NET_EXPORT QuicParams { // changes. bool goaway_sessions_on_ip_change = false; // Specifies QUIC idle connection state lifetime. - base::TimeDelta idle_connection_timeout = kIdleConnectionTimeout; + base::TimeDelta idle_connection_timeout = GetIdleConnectionTimeout(); // Specifies the reduced ping timeout subsequent connections should use when // a connection was timed out with open streams. base::TimeDelta reduced_ping_timeout = base::Seconds(quic::kPingTimeoutSecs); diff --git a/naiveproxy/src/net/quic/quic_event_logger.cc b/naiveproxy/src/net/quic/quic_event_logger.cc index 2ae12ffaad..aa2563575d 100644 --- a/naiveproxy/src/net/quic/quic_event_logger.cc +++ b/naiveproxy/src/net/quic/quic_event_logger.cc @@ -272,8 +272,7 @@ base::Value::Dict NetLogQuicOnConnectionClosedParams( return base::Value::Dict() .Set("quic_error", static_cast(error)) .Set("details", error_details) - .Set("from_peer", - source == quic::ConnectionCloseSource::FROM_PEER ? true : false); + .Set("from_peer", source == quic::ConnectionCloseSource::FROM_PEER); } base::Value::Dict NetLogQuicCertificateVerifiedParams( @@ -456,10 +455,10 @@ void QuicEventLogger::OnFrameAddedToPacket(const quic::QuicFrame& frame) { return NetLogQuicStopSendingFrameParams(frame.stop_sending_frame); }); break; - case quic::MESSAGE_FRAME: + case quic::DATAGRAM_FRAME: net_log_.AddEventWithIntParams( NetLogEventType::QUIC_SESSION_MESSAGE_FRAME_SENT, "message_length", - frame.message_frame->message_length); + frame.datagram_frame->datagram_length); break; case quic::CRYPTO_FRAME: net_log_.AddEvent(NetLogEventType::QUIC_SESSION_CRYPTO_FRAME_SENT, [&] { @@ -693,10 +692,10 @@ void QuicEventLogger::OnRetireConnectionIdFrame( [&] { return NetLogQuicRetireConnectionIdFrameParams(&frame); }); } -void QuicEventLogger::OnMessageFrame(const quic::QuicMessageFrame& frame) { +void QuicEventLogger::OnDatagramFrame(const quic::QuicDatagramFrame& frame) { net_log_.AddEventWithIntParams( NetLogEventType::QUIC_SESSION_MESSAGE_FRAME_RECEIVED, "message_length", - frame.message_length); + frame.datagram_length); } void QuicEventLogger::OnHandshakeDoneFrame( diff --git a/naiveproxy/src/net/quic/quic_event_logger.h b/naiveproxy/src/net/quic/quic_event_logger.h index ce7a0c5749..80787389f6 100644 --- a/naiveproxy/src/net/quic/quic_event_logger.h +++ b/naiveproxy/src/net/quic/quic_event_logger.h @@ -86,7 +86,7 @@ class NET_EXPORT_PRIVATE QuicEventLogger void OnNewTokenFrame(const quic::QuicNewTokenFrame& frame) override; void OnRetireConnectionIdFrame( const quic::QuicRetireConnectionIdFrame& frame) override; - void OnMessageFrame(const quic::QuicMessageFrame& frame) override; + void OnDatagramFrame(const quic::QuicDatagramFrame& frame) override; void OnHandshakeDoneFrame(const quic::QuicHandshakeDoneFrame& frame) override; void OnCoalescedPacketSent(const quic::QuicCoalescedPacket& coalesced_packet, size_t length) override; diff --git a/naiveproxy/src/net/quic/quic_proxy_client_socket.cc b/naiveproxy/src/net/quic/quic_proxy_client_socket.cc index d0b886faa1..b08c4afa3b 100644 --- a/naiveproxy/src/net/quic/quic_proxy_client_socket.cc +++ b/naiveproxy/src/net/quic/quic_proxy_client_socket.cc @@ -10,7 +10,11 @@ #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" +#include "base/types/expected.h" +#include "base/types/expected_macros.h" #include "base/values.h" +#include "net/base/completion_once_callback.h" +#include "net/base/net_errors.h" #include "net/base/proxy_chain.h" #include "net/base/proxy_delegate.h" #include "net/http/http_auth_controller.h" @@ -288,6 +292,13 @@ int QuicProxyClientSocket::DoLoop(int last_io_result) { case STATE_GENERATE_AUTH_TOKEN_COMPLETE: rv = DoGenerateAuthTokenComplete(rv); break; + case STATE_CALCULATE_HEADERS: + DCHECK_EQ(OK, rv); + rv = DoCalculateHeaders(); + break; + case STATE_CALCULATE_HEADERS_COMPLETE: + rv = DoCalculateHeadersComplete(rv); + break; case STATE_SEND_REQUEST: DCHECK_EQ(OK, rv); net_log_.BeginEvent( @@ -317,6 +328,17 @@ int QuicProxyClientSocket::DoLoop(int last_io_result) { rv = ERR_IO_PENDING; } break; + case STATE_PROCESS_RESPONSE_HEADERS: + DCHECK_EQ(OK, rv); + rv = DoProcessResponseHeaders(); + break; + case STATE_PROCESS_RESPONSE_HEADERS_COMPLETE: + rv = DoProcessResponseHeadersComplete(rv); + break; + case STATE_PROCESS_RESPONSE_CODE: + DCHECK_EQ(OK, rv); + rv = DoProcessResponseCode(); + break; default: NOTREACHED() << "bad state"; } @@ -336,37 +358,61 @@ int QuicProxyClientSocket::DoGenerateAuthToken() { int QuicProxyClientSocket::DoGenerateAuthTokenComplete(int result) { DCHECK_NE(ERR_IO_PENDING, result); - if (result == OK) - next_state_ = STATE_SEND_REQUEST; + if (result == OK) { + next_state_ = STATE_CALCULATE_HEADERS; + } + return result; +} + +int QuicProxyClientSocket::DoCalculateHeaders() { + next_state_ = STATE_CALCULATE_HEADERS_COMPLETE; + + authorization_headers_.Clear(); + proxy_delegate_headers_.Clear(); + + // Add Proxy-Authentication header if necessary. + if (auth_->HaveAuth()) { + auth_->AddAuthorizationHeader(&authorization_headers_); + } + + if (proxy_delegate_) { + ASSIGN_OR_RETURN( + proxy_delegate_headers_, + proxy_delegate_->OnBeforeTunnelRequest( + proxy_chain_, proxy_chain_index_, + base::BindOnce( + &QuicProxyClientSocket::OnBeforeTunnelRequestComplete, + weak_factory_.GetWeakPtr())), + [](const auto& e) { + // Success should always be reported via a base::expected containing + // an HttpRequestHeaders, see ProxyDelegate::OnBeforeTunnelRequest. + CHECK_NE(OK, e); + return e; + }); + } + return OK; +} + +int QuicProxyClientSocket::DoCalculateHeadersComplete(int result) { + DCHECK_NE(ERR_IO_PENDING, result); + if (result != OK) { + return result; + } + next_state_ = STATE_SEND_REQUEST; + if (proxy_delegate_headers_.HasHeader("fastopen")) { + proxy_delegate_headers_.RemoveHeader("fastopen"); + // TODO(klzgrad): look into why Fast Open does not work. + use_fastopen_ = true; + } + request_.extra_headers.MergeFrom(proxy_delegate_headers_); return result; } int QuicProxyClientSocket::DoSendRequest() { next_state_ = STATE_SEND_REQUEST_COMPLETE; - // Add Proxy-Authentication header if necessary. - HttpRequestHeaders authorization_headers; - if (auth_->HaveAuth()) { - auth_->AddAuthorizationHeader(&authorization_headers); - } - - if (proxy_delegate_) { - HttpRequestHeaders proxy_delegate_headers; - int result = proxy_delegate_->OnBeforeTunnelRequest( - proxy_chain_, proxy_chain_index_, &proxy_delegate_headers); - if (result < 0) { - return result; - } - if (proxy_delegate_headers.HasHeader("fastopen")) { - proxy_delegate_headers.RemoveHeader("fastopen"); - // TODO(klzgrad): look into why Fast Open does not work. - use_fastopen_ = true; - } - request_.extra_headers.MergeFrom(proxy_delegate_headers); - } - std::string request_line; - BuildTunnelRequest(endpoint_, authorization_headers, user_agent_, + BuildTunnelRequest(endpoint_, authorization_headers_, user_agent_, &request_line, &request_.extra_headers); NetLogRequestHeaders(net_log_, @@ -423,19 +469,39 @@ int QuicProxyClientSocket::DoReadReplyComplete(int result) { if (response_.headers->GetHttpVersion() < HttpVersion(1, 0)) return ERR_TUNNEL_CONNECTION_FAILED; + next_state_ = STATE_PROCESS_RESPONSE_HEADERS; + NetLogResponseHeaders( net_log_, NetLogEventType::HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, response_.headers.get()); + return OK; +} + +int QuicProxyClientSocket::DoProcessResponseHeaders() { + next_state_ = STATE_PROCESS_RESPONSE_HEADERS_COMPLETE; + if (proxy_delegate_) { - int rv = proxy_delegate_->OnTunnelHeadersReceived( - proxy_chain_, proxy_chain_index_, *response_.headers); - if (rv != OK) { - DCHECK_NE(ERR_IO_PENDING, rv); - return rv; - } + return proxy_delegate_->OnTunnelHeadersReceived( + proxy_chain_, proxy_chain_index_, *response_.headers, + base::BindOnce(&QuicProxyClientSocket::OnIOComplete, + weak_factory_.GetWeakPtr())); } + return OK; +} + +int QuicProxyClientSocket::DoProcessResponseHeadersComplete(int result) { + DCHECK_NE(ERR_IO_PENDING, result); + if (result != OK) { + return result; + } + + next_state_ = STATE_PROCESS_RESPONSE_CODE; + return OK; +} + +int QuicProxyClientSocket::DoProcessResponseCode() { switch (response_.headers->response_code()) { case 200: // OK next_state_ = STATE_CONNECT_COMPLETE; @@ -478,4 +544,20 @@ int QuicProxyClientSocket::ProcessResponseHeaders( return OK; } +void QuicProxyClientSocket::OnBeforeTunnelRequestComplete( + base::expected result) { + if (result.has_value()) { + proxy_delegate_headers_ = std::move(result.value()); + OnIOComplete(OK); + } else { + // OnBeforeTunnelRequestComplete should never report ERR_IO_PENDING since + // it's used to signal that IO has completed. + CHECK_NE(ERR_IO_PENDING, result.error()); + // Success should always be reported via a base::expected containing an + // HttpRequestHeaders, see ProxyDelegate::OnBeforeTunnelRequest. + CHECK_NE(OK, result.error()); + OnIOComplete(result.error()); + } +} + } // namespace net diff --git a/naiveproxy/src/net/quic/quic_proxy_client_socket.h b/naiveproxy/src/net/quic/quic_proxy_client_socket.h index 8b4fd198f6..df9cde7aab 100644 --- a/naiveproxy/src/net/quic/quic_proxy_client_socket.h +++ b/naiveproxy/src/net/quic/quic_proxy_client_socket.h @@ -10,6 +10,7 @@ #include #include "base/memory/raw_ptr.h" +#include "base/types/expected.h" #include "net/base/completion_once_callback.h" #include "net/base/proxy_chain.h" #include "net/http/proxy_client_socket.h" @@ -85,10 +86,15 @@ class NET_EXPORT_PRIVATE QuicProxyClientSocket : public ProxyClientSocket { STATE_DISCONNECTED, STATE_GENERATE_AUTH_TOKEN, STATE_GENERATE_AUTH_TOKEN_COMPLETE, + STATE_CALCULATE_HEADERS, + STATE_CALCULATE_HEADERS_COMPLETE, STATE_SEND_REQUEST, STATE_SEND_REQUEST_COMPLETE, STATE_READ_REPLY, STATE_READ_REPLY_COMPLETE, + STATE_PROCESS_RESPONSE_HEADERS, + STATE_PROCESS_RESPONSE_HEADERS_COMPLETE, + STATE_PROCESS_RESPONSE_CODE, STATE_CONNECT_COMPLETE }; @@ -100,13 +106,22 @@ class NET_EXPORT_PRIVATE QuicProxyClientSocket : public ProxyClientSocket { void OnReadResponseHeadersComplete(int result); int ProcessResponseHeaders(const quiche::HttpHeaderBlock& headers); + // Callback for proxy_delegate_->OnBeforeTunnelRequest(). + void OnBeforeTunnelRequestComplete( + base::expected result); + int DoLoop(int last_io_result); int DoGenerateAuthToken(); int DoGenerateAuthTokenComplete(int result); + int DoCalculateHeaders(); + int DoCalculateHeadersComplete(int result); int DoSendRequest(); int DoSendRequestComplete(int result); int DoReadReply(); int DoReadReplyComplete(int result); + int DoProcessResponseHeaders(); + int DoProcessResponseHeadersComplete(int result); + int DoProcessResponseCode(); State next_state_ = STATE_DISCONNECTED; @@ -131,6 +146,9 @@ class NET_EXPORT_PRIVATE QuicProxyClientSocket : public ProxyClientSocket { HttpRequestInfo request_; HttpResponseInfo response_; + HttpRequestHeaders authorization_headers_; + HttpRequestHeaders proxy_delegate_headers_; + quiche::HttpHeaderBlock response_header_block_; // The hostname and port of the endpoint. This is not necessarily the one diff --git a/naiveproxy/src/net/quic/quic_proxy_client_socket_test_base.cc b/naiveproxy/src/net/quic/quic_proxy_client_socket_test_base.cc index 8ffc973763..051ae113f7 100644 --- a/naiveproxy/src/net/quic/quic_proxy_client_socket_test_base.cc +++ b/naiveproxy/src/net/quic/quic_proxy_client_socket_test_base.cc @@ -177,7 +177,8 @@ void QuicProxyClientSocketTestBase::InitializeSession() { QuicSessionKey("mail.example.org", 80, PRIVACY_MODE_DISABLED, proxy_chain_, SessionUsage::kDestination, SocketTag(), NetworkAnonymizationKey(), SecureDnsPolicy::kAllow, - /*require_dns_https_alpn=*/false)), + /*require_dns_https_alpn=*/false, + /*disable_cert_verification_network_fetches=*/false)), /*require_confirmation=*/false, /*migrate_session_early_v2=*/false, /*migrate_session_on_network_change_v2=*/false, diff --git a/naiveproxy/src/net/quic/quic_proxy_datagram_client_socket.cc b/naiveproxy/src/net/quic/quic_proxy_datagram_client_socket.cc index 73c3b1b523..0c414cf250 100644 --- a/naiveproxy/src/net/quic/quic_proxy_datagram_client_socket.cc +++ b/naiveproxy/src/net/quic/quic_proxy_datagram_client_socket.cc @@ -9,11 +9,16 @@ #include "base/functional/callback_helpers.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" +#include "base/types/expected.h" +#include "base/types/expected_macros.h" #include "base/values.h" +#include "net/base/completion_once_callback.h" +#include "net/base/features.h" #include "net/base/net_errors.h" #include "net/base/proxy_chain.h" #include "net/base/proxy_delegate.h" #include "net/http/http_log_util.h" +#include "net/http/http_request_headers.h" #include "net/http/http_response_headers.h" #include "net/log/net_log_source.h" #include "net/log/net_log_source_type.h" @@ -52,7 +57,7 @@ const HttpResponseInfo* QuicProxyDatagramClientSocket::GetConnectResponseInfo() return response_.headers.get() ? &response_ : nullptr; } -bool QuicProxyDatagramClientSocket::IsConnected() const { +bool QuicProxyDatagramClientSocket::IsConnectedForTesting() const { return next_state_ == STATE_CONNECT_COMPLETE && stream_handle_->IsOpen(); } @@ -76,7 +81,7 @@ int QuicProxyDatagramClientSocket::ConnectViaStream( datagram_visitor_registered_ = true; DCHECK_EQ(STATE_DISCONNECTED, next_state_); - next_state_ = STATE_SEND_REQUEST; + next_state_ = STATE_CALCULATE_HEADERS; int rv = DoLoop(OK); if (rv == ERR_IO_PENDING) { @@ -131,6 +136,10 @@ void QuicProxyDatagramClientSocket::Close() { stream_handle_->UnregisterHttp3DatagramVisitor(); datagram_visitor_registered_ = false; } + + connect_request_sent_ = false; + awaiting_connect_response_ = false; + stream_handle_->Reset(quic::QUIC_STREAM_CANCELLED); } @@ -301,7 +310,7 @@ int QuicProxyDatagramClientSocket::Write( const NetworkTrafficAnnotationTag& traffic_annotation) { DCHECK(connect_callback_.is_null()); - if (next_state_ != STATE_CONNECT_COMPLETE) { + if (!connect_request_sent_) { return ERR_SOCKET_NOT_CONNECTED; } @@ -318,11 +327,23 @@ int QuicProxyDatagramClientSocket::Write( void QuicProxyDatagramClientSocket::OnIOComplete(int result) { DCHECK_NE(STATE_DISCONNECTED, next_state_); + + // If the client didn't wait for a connect response so that it could + // immediately start writing, get it ready to resume the full process of + // tunnel establishment. + if (awaiting_connect_response_) { + next_state_ = STATE_READ_REPLY; + awaiting_connect_response_ = false; + } + int rv = DoLoop(result); if (rv != ERR_IO_PENDING) { - // Connect() finished (successfully or unsuccessfully). - DCHECK(!connect_callback_.is_null()); - std::move(connect_callback_).Run(rv); + // Connect() finished (successfully or unsuccessfully) but we may not have + // a connect_callback if we didn't wait for the response before considering + // the connection established. + if (!connect_callback_.is_null()) { + std::move(connect_callback_).Run(rv); + } } } @@ -335,6 +356,13 @@ int QuicProxyDatagramClientSocket::DoLoop(int last_io_result) { // TODO(crbug.com/326437102): Add support for generate auth token request // and complete states. switch (state) { + case STATE_CALCULATE_HEADERS: + DCHECK_EQ(OK, rv); + rv = DoCalculateHeaders(); + break; + case STATE_CALCULATE_HEADERS_COMPLETE: + rv = DoCalculateHeadersComplete(rv); + break; case STATE_SEND_REQUEST: DCHECK_EQ(OK, rv); net_log_.BeginEvent( @@ -354,6 +382,17 @@ int QuicProxyDatagramClientSocket::DoLoop(int last_io_result) { net_log_.EndEventWithNetErrorCode( NetLogEventType::HTTP_TRANSACTION_TUNNEL_READ_HEADERS, rv); break; + case STATE_PROCESS_RESPONSE_HEADERS: + DCHECK_EQ(OK, rv); + rv = DoProcessResponseHeaders(); + break; + case STATE_PROCESS_RESPONSE_HEADERS_COMPLETE: + rv = DoProcessResponseHeadersComplete(rv); + break; + case STATE_PROCESS_RESPONSE_CODE: + DCHECK_EQ(OK, rv); + rv = DoProcessResponseCode(); + break; default: NOTREACHED() << "bad state"; } @@ -362,32 +401,57 @@ int QuicProxyDatagramClientSocket::DoLoop(int last_io_result) { return rv; } +int QuicProxyDatagramClientSocket::DoCalculateHeaders() { + next_state_ = STATE_CALCULATE_HEADERS_COMPLETE; + + proxy_delegate_headers_.Clear(); + + if (proxy_delegate_) { + ASSIGN_OR_RETURN( + proxy_delegate_headers_, + proxy_delegate_->OnBeforeTunnelRequest( + proxy_chain_, proxy_chain_index(), + base::BindOnce( + &QuicProxyDatagramClientSocket::OnBeforeTunnelRequestComplete, + weak_factory_.GetWeakPtr())), + [](const auto& e) { + // Success should always be reported via a base::expected containing + // an HttpRequestHeaders, see ProxyDelegate::OnBeforeTunnelRequest. + CHECK_NE(OK, e); + return e; + }); + } + return OK; +} + +int QuicProxyDatagramClientSocket::DoCalculateHeadersComplete(int result) { + DCHECK_NE(ERR_IO_PENDING, result); + if (result != OK) { + return result; + } + next_state_ = STATE_SEND_REQUEST; + + // TODO(crbug.com/326437102): Add Proxy-Authentication headers. + + request_.extra_headers.MergeFrom(proxy_delegate_headers_); + + return result; +} + int QuicProxyDatagramClientSocket::DoSendRequest() { next_state_ = STATE_SEND_REQUEST_COMPLETE; if (!url_.has_host()) { return ERR_ADDRESS_INVALID; } - std::string host = url_.host(); + std::string host = url_.GetHost(); int port = url_.IntPort(); std::string host_and_port = url_.has_port() ? base::StrCat({host, ":", base::NumberToString(port)}) : std::move(host); request_.extra_headers.SetHeader(HttpRequestHeaders::kHost, host_and_port); - HttpRequestHeaders authorization_headers; - // TODO(crbug.com/326437102): Add Proxy-Authentication headers. - request_.extra_headers.MergeFrom(authorization_headers); - if (proxy_delegate_) { - HttpRequestHeaders proxy_delegate_headers; - int result = proxy_delegate_->OnBeforeTunnelRequest( - proxy_chain(), proxy_chain_index(), &proxy_delegate_headers); - if (result < 0) { - return result; - } - request_.extra_headers.MergeFrom(proxy_delegate_headers); - } if (!user_agent_.empty()) { request_.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, @@ -398,7 +462,7 @@ int QuicProxyDatagramClientSocket::DoSendRequest() { // Generate a fake request line for logging purposes. std::string request_line = - base::StringPrintf("CONNECT-UDP %s HTTP/3\r\n", url_.path().c_str()); + base::StringPrintf("CONNECT-UDP %s HTTP/3\r\n", url_.GetPath().c_str()); NetLogRequestHeaders(net_log_, NetLogEventType::HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, request_line, &request_.extra_headers); @@ -408,7 +472,10 @@ int QuicProxyDatagramClientSocket::DoSendRequest() { request_, /*priority=*/std::nullopt, "connect-udp", request_.extra_headers, &headers); - return stream_handle_->WriteHeaders(std::move(headers), false, nullptr); + int result = stream_handle_->WriteHeaders(std::move(headers), /*fin=*/false, + /*ack_notifier_delegate=*/nullptr); + connect_request_sent_ = true; + return result; } int QuicProxyDatagramClientSocket::DoSendRequestComplete(int result) { @@ -434,7 +501,20 @@ int QuicProxyDatagramClientSocket::DoReadReply() { base::BindOnce( &QuicProxyDatagramClientSocket::OnReadResponseHeadersComplete, weak_factory_.GetWeakPtr())); + if (rv == ERR_IO_PENDING) { + // If the feature is enabled, the stream supports H3 datagrams and we + // haven't received a response to the CONNECT-UDP request yet, bypass + // processing response headers and consider tunnel "established" so + // datagrams can be sent and traffic is not blocked. + if (net::features::kIpPrivacyUseQuicProxiesWithoutWaitingForConnectResponse + .Get() && + stream_handle_->SupportsH3Datagram()) { + next_state_ = STATE_CONNECT_COMPLETE; + awaiting_connect_response_ = true; + return OK; + } + return ERR_IO_PENDING; } if (rv < 0) { @@ -449,20 +529,41 @@ int QuicProxyDatagramClientSocket::DoReadReplyComplete(int result) { return result; } + next_state_ = STATE_PROCESS_RESPONSE_HEADERS; + NetLogResponseHeaders( net_log_, NetLogEventType::HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, response_.headers.get()); + return OK; +} + +int QuicProxyDatagramClientSocket::DoProcessResponseHeaders() { + next_state_ = STATE_PROCESS_RESPONSE_HEADERS_COMPLETE; + // TODO(crbug.com/326437102): Add case for Proxy Authentication. if (proxy_delegate_) { - int rv = proxy_delegate_->OnTunnelHeadersReceived( - proxy_chain(), proxy_chain_index(), *response_.headers); - if (rv != OK) { - CHECK_NE(ERR_IO_PENDING, rv); - return rv; - } + return proxy_delegate_->OnTunnelHeadersReceived( + proxy_chain(), proxy_chain_index(), *response_.headers, + base::BindOnce(&QuicProxyDatagramClientSocket::OnIOComplete, + weak_factory_.GetWeakPtr())); } + return OK; +} + +int QuicProxyDatagramClientSocket::DoProcessResponseHeadersComplete( + int result) { + DCHECK_NE(ERR_IO_PENDING, result); + if (result != OK) { + return result; + } + + next_state_ = STATE_PROCESS_RESPONSE_CODE; + return OK; +} + +int QuicProxyDatagramClientSocket::DoProcessResponseCode() { switch (response_.headers->response_code()) { case 200: // OK next_state_ = STATE_CONNECT_COMPLETE; @@ -495,4 +596,20 @@ int QuicProxyDatagramClientSocket::ProcessResponseHeaders( return OK; } +void QuicProxyDatagramClientSocket::OnBeforeTunnelRequestComplete( + base::expected result) { + if (result.has_value()) { + proxy_delegate_headers_ = std::move(result.value()); + OnIOComplete(OK); + } else { + // OnBeforeTunnelRequestComplete should never report ERR_IO_PENDING since + // it's used to signal that IO has completed. + CHECK_NE(ERR_IO_PENDING, result.error()); + // Success should always be reported via a base::expected containing an + // HttpRequestHeaders, see ProxyDelegate::OnBeforeTunnelRequest. + CHECK_NE(OK, result.error()); + OnIOComplete(result.error()); + } +} + } // namespace net diff --git a/naiveproxy/src/net/quic/quic_proxy_datagram_client_socket.h b/naiveproxy/src/net/quic/quic_proxy_datagram_client_socket.h index fe9714dba8..4c7fad9155 100644 --- a/naiveproxy/src/net/quic/quic_proxy_datagram_client_socket.h +++ b/naiveproxy/src/net/quic/quic_proxy_datagram_client_socket.h @@ -10,6 +10,7 @@ #include #include +#include "net/base/completion_once_callback.h" #include "net/base/ip_endpoint.h" #include "net/base/net_export.h" #include "net/log/net_log.h" @@ -117,7 +118,7 @@ class NET_EXPORT_PRIVATE QuicProxyDatagramClientSocket const quiche::UnknownCapsule& capsule) override; const HttpResponseInfo* GetConnectResponseInfo() const; - bool IsConnected() const; + bool IsConnectedForTesting() const; const std::queue& GetDatagramsForTesting() { return datagrams_; } @@ -130,10 +131,15 @@ class NET_EXPORT_PRIVATE QuicProxyDatagramClientSocket private: enum State { STATE_DISCONNECTED, + STATE_CALCULATE_HEADERS, + STATE_CALCULATE_HEADERS_COMPLETE, STATE_SEND_REQUEST, STATE_SEND_REQUEST_COMPLETE, STATE_READ_REPLY, STATE_READ_REPLY_COMPLETE, + STATE_PROCESS_RESPONSE_HEADERS, + STATE_PROCESS_RESPONSE_HEADERS_COMPLETE, + STATE_PROCESS_RESPONSE_CODE, STATE_CONNECT_COMPLETE }; @@ -144,11 +150,20 @@ class NET_EXPORT_PRIVATE QuicProxyDatagramClientSocket void OnReadResponseHeadersComplete(int result); int ProcessResponseHeaders(const quiche::HttpHeaderBlock& headers); + // Callback for proxy_delegate_->OnBeforeTunnelRequest(). + void OnBeforeTunnelRequestComplete( + base::expected result); + int DoLoop(int last_io_result); + int DoCalculateHeaders(); + int DoCalculateHeadersComplete(int result); int DoSendRequest(); int DoSendRequestComplete(int result); int DoReadReply(); int DoReadReplyComplete(int result); + int DoProcessResponseHeaders(); + int DoProcessResponseHeadersComplete(int result); + int DoProcessResponseCode(); // ProxyDelegate operates in terms of a full proxy chain and an // index into that chain identifying the "current" proxy. Emulate @@ -178,10 +193,21 @@ class NET_EXPORT_PRIVATE QuicProxyDatagramClientSocket // Visitor on stream is registered to receive HTTP/3 datagrams. bool datagram_visitor_registered_ = false; + // Tracks whether the CONNECT-UDP request has been sent (even if response not + // received yet). + bool connect_request_sent_ = false; + + // True if the response from the CONNECT-UDP request has not been received or + // processed yet. Will only be true if the client isn't waiting for the + // response before performing writes. + bool awaiting_connect_response_ = false; + // CONNECT request and response. HttpRequestInfo request_; HttpResponseInfo response_; + HttpRequestHeaders proxy_delegate_headers_; + quiche::HttpHeaderBlock response_header_block_; // Local address of socket. diff --git a/naiveproxy/src/net/quic/quic_session_attempt.cc b/naiveproxy/src/net/quic/quic_session_attempt.cc index 99863150f1..7660e21b27 100644 --- a/naiveproxy/src/net/quic/quic_session_attempt.cc +++ b/naiveproxy/src/net/quic/quic_session_attempt.cc @@ -279,7 +279,8 @@ int QuicSessionAttempt::DoCryptoConnect(int rv) { int QuicSessionAttempt::DoConfirmConnection(int rv) { UMA_HISTOGRAM_TIMES("Net.QuicSession.TimeFromResolveHostToConfirmConnection", base::TimeTicks::Now() - dns_resolution_start_time_); - net_log().EndEvent(NetLogEventType::QUIC_SESSION_POOL_JOB_CONNECT); + net_log().EndEventWithNetErrorCode( + NetLogEventType::QUIC_SESSION_POOL_JOB_CONNECT, rv); if (was_alternative_service_recently_broken_) { UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.ConnectAfterBroken", rv == OK); diff --git a/naiveproxy/src/net/quic/quic_session_key.cc b/naiveproxy/src/net/quic/quic_session_key.cc index 3c390ebc0e..aff374eb45 100644 --- a/naiveproxy/src/net/quic/quic_session_key.cc +++ b/naiveproxy/src/net/quic/quic_session_key.cc @@ -4,6 +4,7 @@ #include "net/quic/quic_session_key.h" +#include #include #include "net/base/host_port_pair.h" @@ -27,7 +28,8 @@ QuicSessionKey::QuicSessionKey( const SocketTag& socket_tag, const NetworkAnonymizationKey& network_anonymization_key, SecureDnsPolicy secure_dns_policy, - bool require_dns_https_alpn) + bool require_dns_https_alpn, + bool disable_cert_verification_network_fetches) : QuicSessionKey(host_port_pair.host(), host_port_pair.port(), privacy_mode, @@ -36,7 +38,8 @@ QuicSessionKey::QuicSessionKey( socket_tag, network_anonymization_key, secure_dns_policy, - require_dns_https_alpn) {} + require_dns_https_alpn, + disable_cert_verification_network_fetches) {} QuicSessionKey::QuicSessionKey( std::string host, @@ -47,7 +50,8 @@ QuicSessionKey::QuicSessionKey( const SocketTag& socket_tag, const NetworkAnonymizationKey& network_anonymization_key, SecureDnsPolicy secure_dns_policy, - bool require_dns_https_alpn) + bool require_dns_https_alpn, + bool disable_cert_verification_network_fetches) : QuicSessionKey(quic::QuicServerId(std::move(host), port), privacy_mode, proxy_chain, @@ -55,7 +59,8 @@ QuicSessionKey::QuicSessionKey( socket_tag, network_anonymization_key, secure_dns_policy, - require_dns_https_alpn) {} + require_dns_https_alpn, + disable_cert_verification_network_fetches) {} QuicSessionKey::QuicSessionKey( const quic::QuicServerId& server_id, @@ -65,7 +70,8 @@ QuicSessionKey::QuicSessionKey( const SocketTag& socket_tag, const NetworkAnonymizationKey& network_anonymization_key, SecureDnsPolicy secure_dns_policy, - bool require_dns_https_alpn) + bool require_dns_https_alpn, + bool disable_cert_verification_network_fetches) : server_id_(server_id), privacy_mode_(privacy_mode), proxy_chain_(proxy_chain), @@ -76,7 +82,9 @@ QuicSessionKey::QuicSessionKey( ? network_anonymization_key : NetworkAnonymizationKey()), secure_dns_policy_(secure_dns_policy), - require_dns_https_alpn_(require_dns_https_alpn) {} + require_dns_https_alpn_(require_dns_https_alpn), + disable_cert_verification_network_fetches_( + disable_cert_verification_network_fetches) {} QuicSessionKey::QuicSessionKey(const QuicSessionKey& other) = default; QuicSessionKey::QuicSessionKey(QuicSessionKey&& other) = default; @@ -89,11 +97,13 @@ bool QuicSessionKey::operator<(const QuicSessionKey& other) const { const uint16_t other_port = other.server_id_.port(); return std::tie(port, server_id_.host(), privacy_mode_, proxy_chain_, session_usage_, socket_tag_, network_anonymization_key_, - secure_dns_policy_, require_dns_https_alpn_) < + secure_dns_policy_, require_dns_https_alpn_, + disable_cert_verification_network_fetches_) < std::tie(other_port, other.server_id_.host(), other.privacy_mode_, other.proxy_chain_, other.session_usage_, other.socket_tag_, other.network_anonymization_key_, other.secure_dns_policy_, - other.require_dns_https_alpn_); + other.require_dns_https_alpn_, + other.disable_cert_verification_network_fetches_); } bool QuicSessionKey::operator==(const QuicSessionKey& other) const { return server_id_.port() == other.server_id_.port() && @@ -104,7 +114,9 @@ bool QuicSessionKey::operator==(const QuicSessionKey& other) const { socket_tag_ == other.socket_tag_ && network_anonymization_key_ == other.network_anonymization_key_ && secure_dns_policy_ == other.secure_dns_policy_ && - require_dns_https_alpn_ == other.require_dns_https_alpn_; + require_dns_https_alpn_ == other.require_dns_https_alpn_ && + disable_cert_verification_network_fetches_ == + other.disable_cert_verification_network_fetches_; } bool QuicSessionKey::CanUseForAliasing(const QuicSessionKey& other) const { @@ -114,7 +126,23 @@ bool QuicSessionKey::CanUseForAliasing(const QuicSessionKey& other) const { session_usage_ == other.session_usage_ && network_anonymization_key_ == other.network_anonymization_key_ && secure_dns_policy_ == other.secure_dns_policy_ && - require_dns_https_alpn_ == other.require_dns_https_alpn_; + require_dns_https_alpn_ == other.require_dns_https_alpn_ && + disable_cert_verification_network_fetches_ == + other.disable_cert_verification_network_fetches_; +} + +std::ostream& operator<<(std::ostream& os, const QuicSessionKey& key) { + os << "{server_id: " << key.server_id().ToHostPortString() + << ", privacy_mode: " << static_cast(key.privacy_mode()) + << ", proxy_chain: " << key.proxy_chain() + << ", session_usage: " << static_cast(key.session_usage()) + << ", socket_tag: " << key.socket_tag() + << ", network_anonymization_key: " << key.network_anonymization_key() + << ", secure_dns_policy: " << static_cast(key.secure_dns_policy()) + << ", require_dns_https_alpn: " << key.require_dns_https_alpn() + << ", disable_cert_verification_network_fetches: " + << key.disable_cert_verification_network_fetches() << "}"; + return os; } } // namespace net diff --git a/naiveproxy/src/net/quic/quic_session_key.h b/naiveproxy/src/net/quic/quic_session_key.h index 8415070713..c61b3ba4f1 100644 --- a/naiveproxy/src/net/quic/quic_session_key.h +++ b/naiveproxy/src/net/quic/quic_session_key.h @@ -5,6 +5,8 @@ #ifndef NET_QUIC_QUIC_SESSION_KEY_H_ #define NET_QUIC_QUIC_SESSION_KEY_H_ +#include + #include "net/base/host_port_pair.h" #include "net/base/network_anonymization_key.h" #include "net/base/privacy_mode.h" @@ -28,7 +30,8 @@ class NET_EXPORT_PRIVATE QuicSessionKey { const SocketTag& socket_tag, const NetworkAnonymizationKey& network_anonymization_key, SecureDnsPolicy secure_dns_policy, - bool require_dns_https_alpn); + bool require_dns_https_alpn, + bool disable_cert_verification_network_fetches); QuicSessionKey(std::string host, uint16_t port, PrivacyMode privacy_mode, @@ -37,7 +40,8 @@ class NET_EXPORT_PRIVATE QuicSessionKey { const SocketTag& socket_tag, const NetworkAnonymizationKey& network_anonymization_key, SecureDnsPolicy secure_dns_policy, - bool require_dns_https_alpn); + bool require_dns_https_alpn, + bool disable_cert_verification_network_fetches); QuicSessionKey(const quic::QuicServerId& server_id, PrivacyMode privacy_mode, const ProxyChain& proxy_chain, @@ -45,7 +49,8 @@ class NET_EXPORT_PRIVATE QuicSessionKey { const SocketTag& socket_tag, const NetworkAnonymizationKey& network_anonymization_key, SecureDnsPolicy secure_dns_policy, - bool require_dns_https_alpn); + bool require_dns_https_alpn, + bool disable_cert_verification_network_fetches); QuicSessionKey(const QuicSessionKey& other); QuicSessionKey(QuicSessionKey&& other); QuicSessionKey& operator=(const QuicSessionKey& other); @@ -86,6 +91,10 @@ class NET_EXPORT_PRIVATE QuicSessionKey { bool require_dns_https_alpn() const { return require_dns_https_alpn_; } + bool disable_cert_verification_network_fetches() const { + return disable_cert_verification_network_fetches_; + } + private: quic::QuicServerId server_id_; PrivacyMode privacy_mode_ = PRIVACY_MODE_DISABLED; @@ -96,8 +105,12 @@ class NET_EXPORT_PRIVATE QuicSessionKey { NetworkAnonymizationKey network_anonymization_key_; SecureDnsPolicy secure_dns_policy_ = SecureDnsPolicy::kAllow; bool require_dns_https_alpn_ = false; + bool disable_cert_verification_network_fetches_ = false; }; +NET_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, + const QuicSessionKey& key); + } // namespace net #endif // NET_QUIC_QUIC_SESSION_KEY_H_ diff --git a/naiveproxy/src/net/quic/quic_session_pool.cc b/naiveproxy/src/net/quic/quic_session_pool.cc index fd239e0b51..fb479b568e 100644 --- a/naiveproxy/src/net/quic/quic_session_pool.cc +++ b/naiveproxy/src/net/quic/quic_session_pool.cc @@ -11,6 +11,7 @@ #include #include #include +#include #include "base/containers/contains.h" #include "base/feature_list.h" @@ -75,6 +76,7 @@ #include "net/socket/socket_performance_watcher_factory.h" #include "net/socket/udp_client_socket.h" #include "net/spdy/multiplexed_session_creation_initiator.h" +#include "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h" #include "net/third_party/quiche/src/quiche/quic/core/crypto/null_decrypter.h" #include "net/third_party/quiche/src/quiche/quic/core/crypto/proof_verifier.h" #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_random.h" @@ -86,6 +88,7 @@ #include "net/third_party/quiche/src/quiche/quic/platform/api/quic_flags.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "third_party/boringssl/src/include/openssl/aead.h" +#include "third_party/boringssl/src/include/openssl/ssl.h" #include "url/gurl.h" #include "url/scheme_host_port.h" #include "url/url_constants.h" @@ -280,10 +283,11 @@ class ServerIdOriginFilter const base::RepeatingCallback origin_filter_; }; -std::set HostsFromOrigins(std::set origins) { +std::set HostsFromSchemeHostPorts( + const std::set& scheme_host_ports) { std::set hosts; - for (const auto& origin : origins) { - hosts.insert(origin.host()); + for (const auto& scheme_host_port : scheme_host_ports) { + hosts.insert(scheme_host_port.host()); } return hosts; } @@ -370,6 +374,10 @@ void LogSessionKeyMismatch(QuicSessionKeyPartialMatchResult result, } } +base::TimeDelta GetAdditionalDelayForMainJob() { + return features::kAdditionalDelay.Get(); +} + } // namespace QuicSessionRequest::QuicSessionRequest(QuicSessionPool* pool) : pool_(pool) {} @@ -411,11 +419,18 @@ int QuicSessionRequest::Request( failed_on_default_network_callback_ = std::move(failed_on_default_network_callback); - session_key_ = - QuicSessionKey(HostPortPair::FromURL(url), privacy_mode, proxy_chain, - session_usage, socket_tag, network_anonymization_key, - secure_dns_policy, require_dns_https_alpn); - bool use_dns_aliases = session_usage == SessionUsage::kProxy ? false : true; + // Note that `disable_cert_verification_network_fetches` must be true for + // proxies to avoid deadlock. See comment on + // `SSLConfig::disable_cert_verification_network_fetches`. + bool disable_cert_verification_network_fetches = + !!(cert_verify_flags & CertVerifier::VERIFY_DISABLE_NETWORK_FETCHES); + CHECK(session_usage != SessionUsage::kProxy || + disable_cert_verification_network_fetches); + session_key_ = QuicSessionKey( + HostPortPair::FromURL(url), privacy_mode, proxy_chain, session_usage, + socket_tag, network_anonymization_key, secure_dns_policy, + require_dns_https_alpn, disable_cert_verification_network_fetches); + bool use_dns_aliases = session_usage != SessionUsage::kProxy; int rv = pool_->RequestSession( session_key_, std::move(destination), quic_version, @@ -529,22 +544,30 @@ QuicSessionPool::QuicCryptoClientConfigOwner::QuicCryptoClientConfigOwner( clock_(base::DefaultClock::GetInstance()), quic_session_pool_(quic_session_pool) { DCHECK(quic_session_pool_); - memory_pressure_listener_ = std::make_unique( - FROM_HERE, - base::BindRepeating(&QuicCryptoClientConfigOwner::OnMemoryPressure, - base::Unretained(this))); + memory_pressure_listener_registration_ = + std::make_unique( + FROM_HERE, base::MemoryPressureListenerTag::kQuicSessionPool, this); + config_.set_preferred_groups( + quic_session_pool_->ssl_config_service_->GetSSLContextConfig() + .GetSupportedGroups()); + if (std::vector client_key_shares = + quic_session_pool_->ssl_config_service_->GetSSLContextConfig() + .GetSupportedGroups(/*key_shares_only=*/true); + !client_key_shares.empty()) { + config_.set_client_key_shares(std::move(client_key_shares)); + } if (quic_session_pool_->ssl_config_service_->GetSSLContextConfig() - .post_quantum_key_agreement_enabled) { - config_.set_preferred_groups({SSL_GROUP_X25519_MLKEM768, SSL_GROUP_X25519, - SSL_GROUP_SECP256R1, SSL_GROUP_SECP384R1}); + .tls13_cipher_prefer_aes_256) { + config_.set_ssl_compliance_policy(ssl_compliance_policy_cnsa_202407); } } + QuicSessionPool::QuicCryptoClientConfigOwner::~QuicCryptoClientConfigOwner() { DCHECK_EQ(num_refs_, 0); } void QuicSessionPool::QuicCryptoClientConfigOwner::OnMemoryPressure( - base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { + base::MemoryPressureLevel memory_pressure_level) { quic::SessionCache* session_cache = config_.session_cache(); if (!session_cache) { return; @@ -555,13 +578,13 @@ void QuicSessionPool::QuicCryptoClientConfigOwner::OnMemoryPressure( now_u64 = static_cast(now); } switch (memory_pressure_level) { - case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE: + case base::MEMORY_PRESSURE_LEVEL_NONE: break; - case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE: + case base::MEMORY_PRESSURE_LEVEL_MODERATE: session_cache->RemoveExpiredEntries( quic::QuicWallTime::FromUNIXSeconds(now_u64)); break; - case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL: + case base::MEMORY_PRESSURE_LEVEL_CRITICAL: session_cache->Clear(); break; } @@ -1286,7 +1309,8 @@ std::unique_ptr QuicSessionPool::CreateSocket( return socket; } -void QuicSessionPool::OnIPAddressChanged() { +void QuicSessionPool::OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) { net_log_.AddEvent(NetLogEventType::QUIC_SESSION_POOL_ON_IP_ADDRESS_CHANGED); CollectDataOnPlatformNotification(NETWORK_IP_ADDRESS_CHANGED, handles::kInvalidNetworkHandle); @@ -1295,6 +1319,13 @@ void QuicSessionPool::OnIPAddressChanged() { return; } + // Ignore changes to randomly generated IPv6 temporary addresses. + if (!base::FeatureList::IsEnabled( + net::features::kMaintainConnectionsOnIpv6TempAddrChange) && + change_type == NetworkChangeNotifier::IP_ADDRESS_CHANGE_IPV6_TEMPADDR) { + return; + } + connectivity_monitor_.OnIPAddressChanged(); set_has_quic_ever_worked_on_current_network(false); @@ -1468,7 +1499,7 @@ base::TimeDelta QuicSessionPool::GetTimeDelayForWaitingJob( if (!srtt) { srtt = kDefaultRTT; } - return base::Microseconds(srtt); + return base::Microseconds(srtt) + GetAdditionalDelayForMainJob(); } const std::set& QuicSessionPool::GetDnsAliasesForSessionKey( @@ -1974,6 +2005,11 @@ QuicSessionPool::CreateSessionHelper( ConfigureInitialRttEstimate( server_id, key.session_key().network_anonymization_key(), &config); + if (base::FeatureList::IsEnabled(features::kTryQuicByDefault)) { + config.AddConnectionOptionsToSend( + quic::ParseQuicTagVector(features::kQuicOptions.Get())); + } + auto keep_alive_timeout = ping_timeout_; bool enabled_connection_keep_alive = false; if (connection_management_config.has_value() && @@ -2365,13 +2401,19 @@ QuicSessionPool::CreateCryptoConfigHandle(QuicCryptoClientConfigKey key) { return std::make_unique(map_iterator); } + std::set hostnames_to_allow_unknown_roots = + HostsFromSchemeHostPorts(params_.origins_to_force_quic_on); + if (params_.force_quic_everywhere) { + hostnames_to_allow_unknown_roots.insert(""); + } + // Otherwise, create a new QuicCryptoClientConfigOwner and add it to // |active_crypto_config_map_|. std::unique_ptr crypto_config_owner = std::make_unique( std::make_unique( cert_verifier_, transport_security_state_, sct_auditing_delegate_, - HostsFromOrigins(params_.origins_to_force_quic_on), + std::move(hostnames_to_allow_unknown_roots), key.network_anonymization_key), std::make_unique(), this); diff --git a/naiveproxy/src/net/quic/quic_session_pool.h b/naiveproxy/src/net/quic/quic_session_pool.h index 2068d398fe..40cded2aef 100644 --- a/naiveproxy/src/net/quic/quic_session_pool.h +++ b/naiveproxy/src/net/quic/quic_session_pool.h @@ -470,7 +470,8 @@ class NET_EXPORT_PRIVATE QuicSessionPool // Until the servers support roaming, close all connections when the local // IP address changes. - void OnIPAddressChanged() override; + void OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) override; // NetworkChangeNotifier::NetworkObserver methods: void OnNetworkConnected(handles::NetworkHandle network) override; @@ -932,7 +933,8 @@ class NET_EXPORT_PRIVATE QuicSessionPool // consumers are using it currently. When the last reference is freed, the // QuicCryptoClientConfigHandle informs the owning QuicSessionPool, moves it // into an MRU cache. -class QuicSessionPool::QuicCryptoClientConfigOwner { +class QuicSessionPool::QuicCryptoClientConfigOwner + : public base::MemoryPressureListener { public: QuicCryptoClientConfigOwner( std::unique_ptr proof_verifier, @@ -943,7 +945,7 @@ class QuicSessionPool::QuicCryptoClientConfigOwner { QuicCryptoClientConfigOwner& operator=(const QuicCryptoClientConfigOwner&) = delete; - ~QuicCryptoClientConfigOwner(); + ~QuicCryptoClientConfigOwner() override; quic::QuicCryptoClientConfig* config() { return &config_; } @@ -952,7 +954,7 @@ class QuicSessionPool::QuicCryptoClientConfigOwner { QuicSessionPool* quic_session_pool() { return quic_session_pool_; } void OnMemoryPressure( - base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level); + base::MemoryPressureLevel memory_pressure_level) override; private: friend class CryptoClientConfigHandle; @@ -972,7 +974,8 @@ class QuicSessionPool::QuicCryptoClientConfigOwner { int num_refs_ = 0; quic::QuicCryptoClientConfig config_; raw_ptr clock_; - std::unique_ptr memory_pressure_listener_; + std::unique_ptr + memory_pressure_listener_registration_; const raw_ptr quic_session_pool_; }; diff --git a/naiveproxy/src/net/quic/quic_session_pool_peer.cc b/naiveproxy/src/net/quic/quic_session_pool_peer.cc index 90ce1a9e1f..bcfa69c614 100644 --- a/naiveproxy/src/net/quic/quic_session_pool_peer.cc +++ b/naiveproxy/src/net/quic/quic_session_pool_peer.cc @@ -52,11 +52,12 @@ bool QuicSessionPoolPeer::HasActiveSession( const NetworkAnonymizationKey& network_anonymization_key, const ProxyChain& proxy_chain, SessionUsage session_usage, - bool require_dns_https_alpn) { - return pool->HasActiveSession( - QuicSessionKey(server_id, privacy_mode, proxy_chain, session_usage, - SocketTag(), network_anonymization_key, - SecureDnsPolicy::kAllow, require_dns_https_alpn)); + bool require_dns_https_alpn, + bool disable_cert_verification_network_fetches) { + return pool->HasActiveSession(QuicSessionKey( + server_id, privacy_mode, proxy_chain, session_usage, SocketTag(), + network_anonymization_key, SecureDnsPolicy::kAllow, + require_dns_https_alpn, disable_cert_verification_network_fetches)); } bool QuicSessionPoolPeer::HasActiveJob(QuicSessionPool* pool, @@ -66,7 +67,8 @@ bool QuicSessionPoolPeer::HasActiveJob(QuicSessionPool* pool, return pool->HasActiveJob(QuicSessionKey( server_id, privacy_mode, ProxyChain::Direct(), SessionUsage::kDestination, SocketTag(), NetworkAnonymizationKey(), SecureDnsPolicy::kAllow, - require_dns_https_alpn)); + require_dns_https_alpn, + /*disable_cert_verification_network_fetches=*/false)); } // static @@ -75,10 +77,11 @@ QuicChromiumClientSession* QuicSessionPoolPeer::GetPendingSession( const quic::QuicServerId& server_id, PrivacyMode privacy_mode, url::SchemeHostPort destination) { - QuicSessionKey session_key(server_id, privacy_mode, ProxyChain::Direct(), - SessionUsage::kDestination, SocketTag(), - NetworkAnonymizationKey(), SecureDnsPolicy::kAllow, - /*require_dns_https_alpn=*/false); + QuicSessionKey session_key( + server_id, privacy_mode, ProxyChain::Direct(), SessionUsage::kDestination, + SocketTag(), NetworkAnonymizationKey(), SecureDnsPolicy::kAllow, + /*require_dns_https_alpn=*/false, + /*disable_cert_verification_network_fetches=*/false); QuicSessionAliasKey key(std::move(destination), session_key); DCHECK(pool->HasActiveJob(session_key)); DCHECK_EQ(pool->all_sessions_.size(), 1u); @@ -94,11 +97,12 @@ QuicChromiumClientSession* QuicSessionPoolPeer::GetActiveSession( const NetworkAnonymizationKey& network_anonymization_key, const ProxyChain& proxy_chain, SessionUsage session_usage, - bool require_dns_https_alpn) { - QuicSessionKey session_key(server_id, privacy_mode, proxy_chain, - session_usage, SocketTag(), - network_anonymization_key, SecureDnsPolicy::kAllow, - require_dns_https_alpn); + bool require_dns_https_alpn, + bool disable_cert_verification_network_fetches) { + QuicSessionKey session_key( + server_id, privacy_mode, proxy_chain, session_usage, SocketTag(), + network_anonymization_key, SecureDnsPolicy::kAllow, + require_dns_https_alpn, disable_cert_verification_network_fetches); DCHECK(pool->HasActiveSession(session_key)); return pool->active_sessions_[session_key]; } diff --git a/naiveproxy/src/net/quic/quic_session_pool_peer.h b/naiveproxy/src/net/quic/quic_session_pool_peer.h index a04405d3a0..41b137a812 100644 --- a/naiveproxy/src/net/quic/quic_session_pool_peer.h +++ b/naiveproxy/src/net/quic/quic_session_pool_peer.h @@ -54,7 +54,8 @@ class QuicSessionPoolPeer { const NetworkAnonymizationKey& network_anonymization_key, const ProxyChain& proxy_chain = ProxyChain::Direct(), SessionUsage session_usage = SessionUsage::kDestination, - bool require_dns_https_alpn = false); + bool require_dns_https_alpn = false, + bool disable_cert_verification_network_fetches = false); static bool HasActiveJob(QuicSessionPool* factory, const quic::QuicServerId& server_id, @@ -75,7 +76,8 @@ class QuicSessionPoolPeer { NetworkAnonymizationKey(), const ProxyChain& proxy_chain = ProxyChain::Direct(), SessionUsage session_usage = SessionUsage::kDestination, - bool require_dns_https_alpn = false); + bool require_dns_https_alpn = false, + bool disable_cert_verification_network_fetches = false); static bool IsLiveSession(QuicSessionPool* pool, QuicChromiumClientSession* session); diff --git a/naiveproxy/src/net/quic/quic_session_pool_proxy_job.cc b/naiveproxy/src/net/quic/quic_session_pool_proxy_job.cc index 1ba7016c35..572b496e86 100644 --- a/naiveproxy/src/net/quic/quic_session_pool_proxy_job.cc +++ b/naiveproxy/src/net/quic/quic_session_pool_proxy_job.cc @@ -174,11 +174,12 @@ int QuicSessionPool::ProxyJob::DoCreateProxySession() { // [proxy1, proxy2, proxy3], the connections to proxy1 and proxy2 need not be // partitioned and can use an empty NAK. This situation is identified by the // session usage of the tunneled connection being kProxy. - bool use_empty_nak = false; - if (!base::FeatureList::IsEnabled(net::features::kPartitionProxyChains) && - session_key.session_usage() == SessionUsage::kProxy) { - use_empty_nak = true; - } + bool use_empty_nak = session_key.session_usage() == SessionUsage::kProxy; + + // Disable cert verification network fetches since those network requests may + // need to go through the proxy chain too. + const int proxy_server_cert_verify_flags = + cert_verify_flags_ | CertVerifier::VERIFY_DISABLE_NETWORK_FETCHES; proxy_session_request_ = std::make_unique(pool_); return proxy_session_request_->Request( @@ -188,8 +189,8 @@ int QuicSessionPool::ProxyJob::DoCreateProxySession() { use_empty_nak ? NetworkAnonymizationKey() : session_key.network_anonymization_key(), session_key.secure_dns_policy(), session_key.require_dns_https_alpn(), - cert_verify_flags_, GURL("https://" + last_server.ToString()), net_log(), - &net_error_details_, session_creation_initiator_, + proxy_server_cert_verify_flags, GURL("https://" + last_server.ToString()), + net_log(), &net_error_details_, session_creation_initiator_, connection_management_config_, /*failed_on_default_network_callback=*/CompletionOnceCallback(), io_callback_); diff --git a/naiveproxy/src/net/quic/quic_session_pool_test_base.cc b/naiveproxy/src/net/quic/quic_session_pool_test_base.cc index 73e98cc23a..ca270141c2 100644 --- a/naiveproxy/src/net/quic/quic_session_pool_test_base.cc +++ b/naiveproxy/src/net/quic/quic_session_pool_test_base.cc @@ -232,12 +232,14 @@ bool QuicSessionPoolTestBase::HasActiveSession( const NetworkAnonymizationKey& network_anonymization_key, const ProxyChain& proxy_chain, SessionUsage session_usage, - bool require_dns_https_alpn) { + bool require_dns_https_alpn, + bool disable_cert_verification_network_fetches) { quic::QuicServerId server_id(scheme_host_port.host(), scheme_host_port.port()); return QuicSessionPoolPeer::HasActiveSession( pool_.get(), server_id, privacy_mode, network_anonymization_key, - proxy_chain, session_usage, require_dns_https_alpn); + proxy_chain, session_usage, require_dns_https_alpn, + disable_cert_verification_network_fetches); } bool QuicSessionPoolTestBase::HasActiveJob( @@ -265,12 +267,14 @@ QuicChromiumClientSession* QuicSessionPoolTestBase::GetActiveSession( const NetworkAnonymizationKey& network_anonymization_key, const ProxyChain& proxy_chain, SessionUsage session_usage, - bool require_dns_https_alpn) { + bool require_dns_https_alpn, + bool disable_cert_verification_network_fetches) { quic::QuicServerId server_id(scheme_host_port.host(), scheme_host_port.port()); return QuicSessionPoolPeer::GetActiveSession( pool_.get(), server_id, privacy_mode, network_anonymization_key, - proxy_chain, session_usage, require_dns_https_alpn); + proxy_chain, session_usage, require_dns_https_alpn, + disable_cert_verification_network_fetches); } int QuicSessionPoolTestBase::GetSourcePortForNewSessionAndGoAway( diff --git a/naiveproxy/src/net/quic/quic_session_pool_test_base.h b/naiveproxy/src/net/quic/quic_session_pool_test_base.h index 4bb047fa37..b7c3cea9c8 100644 --- a/naiveproxy/src/net/quic/quic_session_pool_test_base.h +++ b/naiveproxy/src/net/quic/quic_session_pool_test_base.h @@ -165,7 +165,8 @@ class QuicSessionPoolTestBase : public WithTaskEnvironment { NetworkAnonymizationKey(), const ProxyChain& proxy_chain = ProxyChain::Direct(), SessionUsage session_usage = SessionUsage::kDestination, - bool require_dns_https_alpn = false); + bool require_dns_https_alpn = false, + bool disable_cert_verification_network_fetches = false); bool HasActiveJob(const url::SchemeHostPort& scheme_host_port, const PrivacyMode privacy_mode, bool require_dns_https_alpn = false); @@ -180,7 +181,8 @@ class QuicSessionPoolTestBase : public WithTaskEnvironment { NetworkAnonymizationKey(), const ProxyChain& proxy_chain = ProxyChain::Direct(), SessionUsage session_usage = SessionUsage::kDestination, - bool require_dns_https_alpn = false); + bool require_dns_https_alpn = false, + bool disable_cert_verification_network_fetches = false); int GetSourcePortForNewSessionAndGoAway( const url::SchemeHostPort& destination); diff --git a/naiveproxy/src/net/quic/quic_test_packet_maker.cc b/naiveproxy/src/net/quic/quic_test_packet_maker.cc index 3336b9c889..b60806c807 100644 --- a/naiveproxy/src/net/quic/quic_test_packet_maker.cc +++ b/naiveproxy/src/net/quic/quic_test_packet_maker.cc @@ -4,10 +4,10 @@ #include "net/quic/quic_test_packet_maker.h" +#include #include #include -#include "base/compiler_specific.h" #include "base/functional/callback.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" @@ -74,12 +74,12 @@ quic::QuicFrames CloneFrames(const quic::QuicFrames& frames) { new quic::QuicRetireConnectionIdFrame( *frame.retire_connection_id_frame); break; - case quic::MESSAGE_FRAME: - frame.message_frame = new quic::QuicMessageFrame( - frame.message_frame->message_id, + case quic::DATAGRAM_FRAME: + frame.datagram_frame = new quic::QuicDatagramFrame( + frame.datagram_frame->datagram_id, quiche::QuicheMemSlice(quiche::QuicheBuffer::Copy( quiche::SimpleBufferAllocator::Get(), - frame.message_frame->message_data.data()->AsStringView()))); + frame.datagram_frame->datagram_data.data()->AsStringView()))); break; case quic::CRYPTO_FRAME: frame.crypto_frame = new quic::QuicCryptoFrame(*frame.crypto_frame); @@ -392,15 +392,15 @@ QuicTestPacketMaker::MakeStatelessResetPacket() { void QuicTestPacketMaker::RemoveSavedStreamFrames( quic::QuicStreamId stream_id) { for (auto& kv : connection_state_.saved_frames) { - auto* it = kv.second.begin(); - while (it != kv.second.end()) { - if (it->type == quic::STREAM_FRAME && - it->stream_frame.stream_id == stream_id) { - it = kv.second.erase(it); - } else { - UNSAFE_TODO(++it); - } - } + // Since this is an absl::InlinedVector, it doesn't support erase_if(). + // Instead, have to use erase() and remove_if(). + kv.second.erase(std::remove_if(kv.second.begin(), kv.second.end(), + [stream_id](const quic::QuicFrame& frame) { + return frame.type == quic::STREAM_FRAME && + frame.stream_frame.stream_id == + stream_id; + }), + kv.second.end()); } } @@ -708,9 +708,9 @@ QuicTestPacketBuilder& QuicTestPacketBuilder::AddAckFrame( QuicTestPacketBuilder& QuicTestPacketBuilder::AddMessageFrame( std::string_view data) { - auto* message_frame = new quic::QuicMessageFrame( - /*message_id=*/0, quiche::QuicheMemSlice(quiche::QuicheBuffer::Copy( - quiche::SimpleBufferAllocator::Get(), data))); + auto* message_frame = new quic::QuicDatagramFrame( + /*datagram_id=*/0, quiche::QuicheMemSlice(quiche::QuicheBuffer::Copy( + quiche::SimpleBufferAllocator::Get(), data))); AddFrame(quic::QuicFrame(message_frame)); return *this; } diff --git a/naiveproxy/src/net/quic/quic_test_packet_printer.cc b/naiveproxy/src/net/quic/quic_test_packet_printer.cc index b431658fca..fcd2fa58ec 100644 --- a/naiveproxy/src/net/quic/quic_test_packet_printer.cc +++ b/naiveproxy/src/net/quic/quic_test_packet_printer.cc @@ -197,12 +197,12 @@ class QuicPacketPrinter : public QuicFramerVisitorInterface { *output_ << "OnBlockedFrame: " << frame; return true; } - bool OnMessageFrame(const QuicMessageFrame& frame) override { + bool OnDatagramFrame(const QuicDatagramFrame& frame) override { *output_ << "OnMessageFrame: " << frame; // In a test context, `frame.data` should always be set. CHECK(frame.data); *output_ << " data: { " - << base::HexEncode(frame.data, frame.message_length) << " }\n"; + << base::HexEncode(frame.data, frame.datagram_length) << " }\n"; return true; } bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override { diff --git a/naiveproxy/src/net/quic/web_transport_client.cc b/naiveproxy/src/net/quic/web_transport_client.cc index c4d443d80b..19ec9a83bc 100644 --- a/naiveproxy/src/net/quic/web_transport_client.cc +++ b/naiveproxy/src/net/quic/web_transport_client.cc @@ -86,7 +86,7 @@ std::unique_ptr CreateWebTransportClient( const NetworkAnonymizationKey& anonymization_key, URLRequestContext* context, const WebTransportParameters& parameters) { - if (url.scheme() == url::kHttpsScheme) { + if (url.GetScheme() == url::kHttpsScheme) { if (!parameters.enable_web_transport_http3) { return std::make_unique( ERR_DISALLOWED_URL_SCHEME, visitor); diff --git a/naiveproxy/src/net/quic/web_transport_client.h b/naiveproxy/src/net/quic/web_transport_client.h index d67e90ff16..e4b2ef7711 100644 --- a/naiveproxy/src/net/quic/web_transport_client.h +++ b/naiveproxy/src/net/quic/web_transport_client.h @@ -10,6 +10,7 @@ #include #include "base/memory/scoped_refptr.h" +#include "net/base/completion_once_callback.h" #include "net/base/network_anonymization_key.h" #include "net/quic/web_transport_error.h" #include "net/third_party/quiche/src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.h" @@ -74,6 +75,12 @@ class NET_EXPORT WebTransportClientVisitor { public: virtual ~WebTransportClientVisitor(); + // Delegating the Local Network Access check to the visitor. + // + // See https://wicg.github.io/local-network-access/ + virtual void OnLocalNetworkAccessCheck(const IPEndPoint& server_address, + CompletionOnceCallback callback) = 0; + // State change notifiers. // CONNECTING -> CONNECTED virtual void OnBeforeConnect(const IPEndPoint& server_address) = 0; @@ -93,7 +100,7 @@ class NET_EXPORT WebTransportClientVisitor { virtual void OnCanCreateNewOutgoingBidirectionalStream() = 0; virtual void OnCanCreateNewOutgoingUnidirectionalStream() = 0; virtual void OnDatagramProcessed( - std::optional status) = 0; + std::optional status) = 0; }; // Parameters that determine the way WebTransport session is established. diff --git a/naiveproxy/src/net/reporting/reporting_cache_impl.cc b/naiveproxy/src/net/reporting/reporting_cache_impl.cc index 346d5490a3..e640913d99 100644 --- a/naiveproxy/src/net/reporting/reporting_cache_impl.cc +++ b/naiveproxy/src/net/reporting/reporting_cache_impl.cc @@ -201,12 +201,12 @@ std::vector FilterEndpointsByOrigin( const std::map>& document_endpoints, const url::Origin& origin) { - std::set group_names; + std::set group_names; std::vector result; for (const auto& token_and_endpoints : document_endpoints) { for (const auto& endpoint : token_and_endpoints.second) { if (endpoint.group_key.origin == origin) { - if (group_names.insert(endpoint.group_key.group_name).second) { + if (group_names.emplace(endpoint.group_key.group_name).second) { // Push the endpoint only when the insertion succeeds. result.push_back(endpoint); } @@ -219,7 +219,8 @@ std::vector FilterEndpointsByOrigin( base::flat_map> ReportingCacheImpl::GetV1ReportingEndpointsByOrigin() const { base::flat_map> result; - base::flat_map> group_name_helper; + base::flat_map> + group_name_helper; for (const auto& token_and_endpoints : document_endpoints_) { for (const auto& endpoint : token_and_endpoints.second) { // Document endpoints should have an origin. @@ -227,7 +228,7 @@ ReportingCacheImpl::GetV1ReportingEndpointsByOrigin() const { auto origin = endpoint.group_key.origin.value(); if (result.count(origin)) { if (group_name_helper.at(origin) - .insert(endpoint.group_key.group_name) + .emplace(endpoint.group_key.group_name) .second) { // Push the endpoint only when the insertion succeeds. result.at(origin).push_back(endpoint); @@ -237,8 +238,8 @@ ReportingCacheImpl::GetV1ReportingEndpointsByOrigin() const { endpoints_for_origin.push_back(endpoint); result.emplace(origin, endpoints_for_origin); - base::flat_set group_names; - group_names.insert(endpoint.group_key.group_name); + base::flat_set group_names; + group_names.emplace(endpoint.group_key.group_name); group_name_helper.emplace(origin, group_names); } } diff --git a/naiveproxy/src/net/reporting/reporting_delivery_agent.cc b/naiveproxy/src/net/reporting/reporting_delivery_agent.cc index 7c4cf3cad1..43fa877d25 100644 --- a/naiveproxy/src/net/reporting/reporting_delivery_agent.cc +++ b/naiveproxy/src/net/reporting/reporting_delivery_agent.cc @@ -187,7 +187,7 @@ class Delivery { // Report origin is equal to, or a subdomain of, the endpoint // configuration's origin. DCHECK(IsSubdomainOf( - (*report_it)->url.host_piece() /* subdomain */, + (*report_it)->url.host() /* subdomain */, endpoint.group_key.origin.value().host() /* superdomain */)); DCHECK_EQ((*report_it)->target_type, target_.target_type); } diff --git a/naiveproxy/src/net/reporting/reporting_test_util.cc b/naiveproxy/src/net/reporting/reporting_test_util.cc index ccc19a7abe..eb54e001d7 100644 --- a/naiveproxy/src/net/reporting/reporting_test_util.cc +++ b/naiveproxy/src/net/reporting/reporting_test_util.cc @@ -59,7 +59,7 @@ class PendingUploadImpl : public TestReportingUploader::PendingUpload { const GURL& url() const override { return url_; } const std::string& json() const override { return json_; } std::optional GetValue() const override { - return base::JSONReader::Read(json_); + return base::JSONReader::Read(json_, base::JSON_PARSE_CHROMIUM_EXTENSIONS); } void Complete(ReportingUploader::Outcome outcome) override { diff --git a/naiveproxy/src/net/server/web_socket.cc b/naiveproxy/src/net/server/web_socket.cc index b574c9e366..360cff7e01 100644 --- a/naiveproxy/src/net/server/web_socket.cc +++ b/naiveproxy/src/net/server/web_socket.cc @@ -21,6 +21,7 @@ #include "net/server/web_socket_encoder.h" #include "net/websockets/websocket_deflate_parameters.h" #include "net/websockets/websocket_extension.h" +#include "net/websockets/websocket_handshake_challenge.h" #include "net/websockets/websocket_handshake_constants.h" namespace net { @@ -75,8 +76,7 @@ void WebSocket::Accept(const HttpServerRequestInfo& request, traffic_annotation); return; } - std::string encoded_hash = base::Base64Encode( - base::SHA1HashString(key + websockets::kWebSocketGuid)); + std::string encoded_hash = ComputeSecWebSocketAccept(key); std::vector response_extensions; auto i = request.headers.find("sec-websocket-extensions"); diff --git a/naiveproxy/src/net/shared_dictionary/shared_dictionary_network_transaction.cc b/naiveproxy/src/net/shared_dictionary/shared_dictionary_network_transaction.cc index 891541af3f..2b64b490f0 100644 --- a/naiveproxy/src/net/shared_dictionary/shared_dictionary_network_transaction.cc +++ b/naiveproxy/src/net/shared_dictionary/shared_dictionary_network_transaction.cc @@ -191,21 +191,6 @@ void SharedDictionaryNetworkTransaction::ModifyRequestHeaders( return; } - if (!IsLocalhost(request_url)) { - if (!base::FeatureList::IsEnabled( - features::kCompressionDictionaryTransportOverHttp1) && - negotiated_protocol_ != NextProto::kProtoHTTP2 && - negotiated_protocol_ != NextProto::kProtoQUIC) { - shared_dictionary_.reset(); - return; - } - if (!base::FeatureList::IsEnabled( - features::kCompressionDictionaryTransportOverHttp2) && - negotiated_protocol_ == NextProto::kProtoHTTP2) { - shared_dictionary_.reset(); - return; - } - } if (base::FeatureList::IsEnabled( features::kCompressionDictionaryTransportRequireKnownRootCert) && !cert_is_issued_by_known_root_ && !IsLocalhost(request_url)) { diff --git a/naiveproxy/src/net/socket/client_socket_pool_manager.cc b/naiveproxy/src/net/socket/client_socket_pool_manager.cc index a0022e1cd3..3f94c3ba65 100644 --- a/naiveproxy/src/net/socket/client_socket_pool_manager.cc +++ b/naiveproxy/src/net/socket/client_socket_pool_manager.cc @@ -12,7 +12,6 @@ #include "base/check_op.h" #include "base/metrics/field_trial_params.h" #include "build/build_config.h" -#include "net/base/features.h" #include "net/base/load_flags.h" #include "net/base/net_export.h" #include "net/base/proxy_chain.h" @@ -32,37 +31,17 @@ namespace net { namespace { -// This returns the correct socket pool size information for the given context, -// but should not be used directly as it constructs a new array each time. -// Call `GlobalMaxSocketsPerPool` instead to allow caching and save time. -const std::array -GlobalMaxSocketsPerPoolImpl() { - // See crbug.com/415691664 for more details on the connection pool size trial. - if (base::FeatureList::IsEnabled(features::kTcpConnectionPoolSizeTrial)) { - // TODO(crbug.com/415691664): If we run out of file descriptors due to the - // new pool size and see a spike in errors, that should be addressed. - return std::to_array({ - features::kTcpConnectionPoolSizeTrialNormal - .Get(), // NORMAL_SOCKET_POOL - features::kTcpConnectionPoolSizeTrialWebSocket - .Get() // WEBSOCKET_SOCKET_POOL - }); - } - return std::to_array({ - 256, // NORMAL_SOCKET_POOL - 256 // WEBSOCKET_SOCKET_POOL - }); -} +// The limit for active sockets per pool for this network process. This may be +// modified by set_max_sockets_per_pool in tests, but should otherwise be as +// stated below. +auto g_max_sockets_per_pool = std::to_array({ + 256, // NORMAL_SOCKET_POOL + 256 // WEBSOCKET_SOCKET_POOL +}); -// Returns the limit for active sockets across all socket pools for this network -// process. This may be modified by set_max_sockets_per_pool in tests, but -// should otherwise align with `GlobalMaxSocketsPerPoolImpl`. -std::array& -GlobalMaxSocketsPerPool() { - static std::array - g_max_sockets_per_pool = GlobalMaxSocketsPerPoolImpl(); - return g_max_sockets_per_pool; -} +static_assert(std::size(g_max_sockets_per_pool) == + HttpNetworkSession::NUM_SOCKET_POOL_TYPES, + "max sockets per pool length mismatch"); // Default to allow up to 6 connections per host. Experiment and tuning may // try other values (greater than 0). Too large may cause many problems, such @@ -168,7 +147,7 @@ ClientSocketPoolManager::~ClientSocketPoolManager() = default; int ClientSocketPoolManager::max_sockets_per_pool( HttpNetworkSession::SocketPoolType pool_type) { DCHECK_LT(pool_type, HttpNetworkSession::NUM_SOCKET_POOL_TYPES); - return GlobalMaxSocketsPerPool()[pool_type]; + return g_max_sockets_per_pool[pool_type]; } // static @@ -177,8 +156,8 @@ void ClientSocketPoolManager::set_max_sockets_per_pool( int socket_count) { DCHECK_LT(0, socket_count); // At least one socket must be allowed. DCHECK_LT(pool_type, HttpNetworkSession::NUM_SOCKET_POOL_TYPES); - GlobalMaxSocketsPerPool()[pool_type] = socket_count; - DCHECK_GE(GlobalMaxSocketsPerPool()[pool_type], + g_max_sockets_per_pool[pool_type] = socket_count; + DCHECK_GE(g_max_sockets_per_pool[pool_type], g_max_sockets_per_group[pool_type]); } @@ -197,7 +176,7 @@ void ClientSocketPoolManager::set_max_sockets_per_group( DCHECK_LT(pool_type, HttpNetworkSession::NUM_SOCKET_POOL_TYPES); g_max_sockets_per_group[pool_type] = socket_count; - DCHECK_GE(GlobalMaxSocketsPerPool()[pool_type], + DCHECK_GE(g_max_sockets_per_pool[pool_type], g_max_sockets_per_group[pool_type]); DCHECK_GE(g_max_sockets_per_proxy_chain[pool_type], g_max_sockets_per_group[pool_type]); diff --git a/naiveproxy/src/net/socket/connect_job_params_factory.cc b/naiveproxy/src/net/socket/connect_job_params_factory.cc index dfc00da79d..e975e09a16 100644 --- a/naiveproxy/src/net/socket/connect_job_params_factory.cc +++ b/naiveproxy/src/net/socket/connect_job_params_factory.cc @@ -175,9 +175,8 @@ ConnectJobParams CreateProxyParams( // it need not be partitioned based on the ultimate destination's NAK. If the // session is to the destination, then partition using that destination's NAK. // This allows sharing of connections to proxies in multi-server proxy chains. - bool use_empty_nak = - !base::FeatureList::IsEnabled(net::features::kPartitionProxyChains) && - proxy_chain_index < proxy_chain.length() - 1; + bool use_empty_nak = proxy_chain_index < proxy_chain.length() - 1; + // Note that C++ extends the lifetime of this value such that the reference // remains valid as long as the reference. const NetworkAnonymizationKey& network_anonymization_key = diff --git a/naiveproxy/src/net/socket/next_proto.cc b/naiveproxy/src/net/socket/next_proto.cc index 0b0a6d6ba3..fafb9d4181 100644 --- a/naiveproxy/src/net/socket/next_proto.cc +++ b/naiveproxy/src/net/socket/next_proto.cc @@ -50,4 +50,17 @@ const std::string_view NegotiatedProtocolToHistogramSuffix( } } +const std::string_view NegotiatedProtocolToHistogramSuffixCoalesced( + NextProto next_proto) { + switch (next_proto) { + case NextProto::kProtoHTTP11: + case NextProto::kProtoUnknown: + return "H1"; + case NextProto::kProtoHTTP2: + return "H2"; + case NextProto::kProtoQUIC: + return "H3"; + } +} + } // namespace net diff --git a/naiveproxy/src/net/socket/next_proto.h b/naiveproxy/src/net/socket/next_proto.h index 233bdfaabe..4910811f0e 100644 --- a/naiveproxy/src/net/socket/next_proto.h +++ b/naiveproxy/src/net/socket/next_proto.h @@ -42,6 +42,11 @@ NET_EXPORT_PRIVATE const char* NextProtoToString(NextProto next_proto); NET_EXPORT_PRIVATE const std::string_view NegotiatedProtocolToHistogramSuffix( NextProto next_proto); +// Similar to NegotiatedProtocolToHistogramSuffix, but `kProtoUnknown` is +// treated as HTTP/1.1. +NET_EXPORT_PRIVATE const std::string_view +NegotiatedProtocolToHistogramSuffixCoalesced(NextProto next_proto); + } // namespace net #endif // NET_SOCKET_NEXT_PROTO_H_ diff --git a/naiveproxy/src/net/socket/socket_apple.cc b/naiveproxy/src/net/socket/socket_apple.cc new file mode 100644 index 0000000000..c3c7290170 --- /dev/null +++ b/naiveproxy/src/net/socket/socket_apple.cc @@ -0,0 +1,118 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/socket/socket_apple.h" + +#if defined(WORK_AROUND_CRBUG_40064248) + +#include +#include + +#if BUILDFLAG(IS_MAC) +#include "base/mac/mac_util.h" +#elif BUILDFLAG(IS_IOS) +#include "base/system/sys_info.h" +#endif + +namespace net { +namespace { + +bool OSVersionIsAffected() { +#if BUILDFLAG(IS_MAC) + // FB19384824 was introduced in macOS 13.3 and will be fixed in macOS 26.1. + const int os_version = base::mac::MacOSVersion(); + return os_version >= 13'03'00 && os_version < 26'01'00; +#elif BUILDFLAG(IS_IOS) + // These iOS version numbers that correspond to the macOS version numbers + // above. + int32_t major, minor, bugfix; + base::SysInfo::OperatingSystemVersionNumbers(&major, &minor, &bugfix); + const int os_version = major * 1'00'00 + minor * 1'00 + bugfix; + return os_version >= 16'03'00 && os_version < 26'01'00; +#endif +} + +// A 2-integer struct to give access to the secondary return value, normally +// hidden, that the kernel sets for every system call return. +struct ReturnPair { + ssize_t primary; // x0, rax + uintptr_t secondary; // x1, rdx +}; + +// A declaration of `sendto` with a ReturnPair return value in place of ssize_t. +// asm("_sendto") is like an alias: it means that calls to `sendto_returnpair` +// will actually emit calls to `sendto`. +extern "C" ReturnPair sendto_returnpair(int, + void const*, + size_t, + int, + sockaddr const*, + socklen_t) asm("_sendto"); + +} // namespace + +ssize_t SendtoAndDetectBogusReturnValue(int const fd, + void const* const buffer, + size_t const size, + int const flags, + sockaddr const* const address, + socklen_t const address_size) { + static const bool os_version_is_affected = OSVersionIsAffected(); + if (!os_version_is_affected) { + return sendto(fd, buffer, size, flags, address, address_size); + } + + ReturnPair const rp = + sendto_returnpair(fd, buffer, size, flags, address, address_size); + +#if defined(ARCH_CPU_ARM64) + uintptr_t const param_shared_with_secondary = + reinterpret_cast(buffer); + constexpr ssize_t kSuspiciousRv_x86_64 = 0; +#elif defined(ARCH_CPU_X86_64) + uintptr_t const param_shared_with_secondary = size; + constexpr ssize_t kSuspiciousRv_x86_64 = (2 << 24) | SYS_sendto; // 0x2000085 +#endif // ARCH_CPU_* + + // When the bug occurs, the apparent (primary) return value will not be + // negative, so check rp.primary first. + // + // For a successful return when the bug hasn’t occurred, rp.secondary will be + // set to 0. If rp.secondary is not 0 on a successful return, the bug has + // definitely occurred. + // + // It’s possible that rp.secondary will be 0 on a successful return even when + // the bug has occurred, if the register shared with rp.secondary, + // param_shared_with_secondary, contained 0 on system call entry. In that + // case, `size` must be 0. (arm64: param_shared_with_secondary is `buffer`, + // and the use of a null pointer here can only be tolerated if `size` is 0; + // x86_64: param_shared_with_secondary is `size` itself.) The bug can’t occur + // for a meaningless 0-byte TCP send but it can occur for a meaningful 0-byte + // UDP send. Since `size` is 0, the bug’s occurrence can be detected by + // comparing rp.primary to the known suspicious return value. + // + // The suspicious return value is `fd` on arm64 kernels and + // kSuspiciousRv_x86_64 on x86_64 kernels. Since x86_64 user code can run atop + // an arm64 kernel via Rosetta binary translation, check rp.primary against + // `fd` regardless of architecture. + // + // Since the suspicious return value is `fd` on arm64 kernels, it’s not + // possible to detect the bug’s occurrence with a 0-byte UDP send to file + // descriptor 0. But this isn’t expected to ever occur practically, as 0 is + // STDIN_FILENO, and this code isn’t likely to operate on standard streams, + // and is even less likely to attempt to send to an input stream. + if (rp.primary != -1 && + (rp.secondary != 0 || + (param_shared_with_secondary == 0 && + ((rp.primary == fd && fd != 0) || + (kSuspiciousRv_x86_64 != 0 && rp.primary == kSuspiciousRv_x86_64))))) { + return kSendBogusReturnValueDetected; + } + + return rp.primary; +} + +} // namespace net + +#endif // WORK_AROUND_CRBUG_40064248 diff --git a/naiveproxy/src/net/socket/socket_apple.h b/naiveproxy/src/net/socket/socket_apple.h new file mode 100644 index 0000000000..c829199bd4 --- /dev/null +++ b/naiveproxy/src/net/socket/socket_apple.h @@ -0,0 +1,227 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_SOCKET_SOCKET_APPLE_H_ +#define NET_SOCKET_SOCKET_APPLE_H_ + +#include +#include +#include + +#include "build/build_config.h" + +// This is a workaround for https://crbug.com/40064248. See also: b/283787255, +// FB12198214, and FB19384824. +// +// In this bug, the `sendto` and `write` system calls, and the `send` wrapper +// around `sendto`, appear to return bogus values under certain conditions. This +// has been observed when writing to established IPv6 (AF_INET6) sockets, both +// TCP (SOCK_STREAM) and UDP (SOCK_DGRAM), following certain network +// reconfigurations on the system. It occurs when bringing up a utun-based VPN, +// when data sent via the socket would become subject to the tunnel. The bug +// occurs on macOS 13.3 22E252 (2023-03-27) and later OS versions, and will be +// fixed in macOS 26.1. +// +// This discussion focuses on `sendto` but the bug is identical for `send`, as +// `send` is a thin C wrapper tail-calling the `sendto` system call; for +// `write`, substitute SYS_write = 4 for SYS_sendto = 133. +// +// ssize_t sendto(int fd, void const* buffer, size_t size, int flags, sockaddr +// const* address, socklen_t address_size) +// +// `size` contains the number of bytes in `buffer` to be sent via the socket +// whose file descriptor is `fd`. +// +// The ssize_t return value (rv) should be: +// - rv = -1 for an error, with errno set appropriately; or +// - 0 ≤ rv ≤ size on success. rv contains the number of bytes accepted by the +// kernel, conveying the portion of `buffer` that was either sent or queued +// for sending. This may be equal to `size` if the entire buffer was +// accepted, or it may be less than `size` if the kernel did not accept the +// entire buffer (a “short write”). +// +// When the bug occurs, `sendto` appears to return successfully (not -1) but +// reports a bogus value in place of the number of bytes accepted. +// - On arm64 (including x86_64-on-arm64 via Rosetta translation), the bogus +// return value is the value of `fd` passed to `sendto`. +// - On x86_64 (without binary translation), the bogus return value is the +// system call class (SYSCALL_CLASS_UNIX = 2) and number (SYS_sendto = 133), +// packed into a single integer: 0x2000085. +// +// The characteristics of the bogus return value impact how easy it is to detect +// the bug’s occurrence with a defensive return value checking technique. +// - rv > size: The bug has unambiguously occurred. This would mean that the +// kernel has accepted more data than was provided in `buffer`, which is +// impossible. This is easy to detect. 0x2000085 (32MB + 133) is almost +// always larger than the buffer size, so these unambiguous returns occur +// frequently when the bug occurs on x86_64. +// - rv ≤ size: This is indistinguishable from a normal successful return. File +// descriptor numbers are normally small, so these ambiguous return values +// appear frequently when the bug occurs on arm64. +// +// The mechanics of the bug are specific to the kernel’s architecture, largely +// following each architecture’s standard function call ABI, with an extra +// register dedicated to selecting the system call, and an architectural flag +// bit used to distinguish successful from error returns. +// - On arm64, the system call number (SYS_sendto = 133) is stored in x16. +// Arguments are presented in w0 (the low 32 bits of x0) = fd, x1 = buffer, +// x2 = size, w3 = flags, x4 = address, and w5 = address_size. x0 is used for +// the return value or error number. cpsr.c (the carry flag of “nzcv”) is set +// for an error return, and clear for a successful return. +// - On x86_64, the system call class and number (0x2000085) is stored in eax +// (the low 32 bits of rax). Arguments are presented in edi = fd, rsi = +// buffer, rdx = size, ecx = flags, r8 = address, and r9d = address_size. rax +// is used for the return value or error number. rflags.cf (the carry flag) +// is set for an error return, and clear for a successful return. +// +// The bug occurs when the EJUSTRETURN path is incorrectly taken in the kernel +// on system call return. xnu source code references are to xnu-11417.121.6, +// which shipped with macOS 15.5 24F74 (2025-05-12): +// - https://github.com/apple-oss-distributions/xnu/blob/xnu-11417.121.6/bsd/dev/arm/systemcalls.c#L504 +// - https://github.com/apple-oss-distributions/xnu/blob/xnu-11417.121.6/bsd/dev/i386/systemcalls.c#L411 +// +// The EJUSTRETURN path exists at this level primarily for the use of the +// `sigreturn` system call, which returns from a user-space signal handler +// function back to the interrupted user thread via the kernel. `sigreturn` +// restores the interrupted thread context, and has no return to its caller +// proper, so EJUSTRETURN exists to suppress the normal register manipulation +// done during any other system call return. +// +// There are also kernel-internal uses of EJUSTRETURN, but aside from +// `sigreturn`, none should “leak” to system call return. Socket code and other +// networking code in the kernel use EJUSTRETURN internally, at that layer +// generally meaning that no further processing should be performed. The bug is +// caused when one of these internal uses of EJUSTRETURN, xnu bsd/net/pf_ioctl.c +// `pf_inet6_hook`, is not handled properly within the networking layer and +// instead propagates from that layer to become `sendto`’s return, improperly +// “leaking” to the system call return level where it takes on a different +// meaning. +// +// When the bug occurs and the EJUSTRETURN path is taken for a return from +// `sendto`, the user-bound return value (uthread->uu_rval[0]) does not make it +// into the register state to be restored on user return (x0 via ss64->x[0], rax +// via regs->rax), leaving the return value register’s previous contents from +// system call entry intact. x0 will still contain the file descriptor number, +// and rax will still contain the system call selector. The carry flag will have +// been optimistically cleared, so the bug’s occurrence is always observed as a +// successful return in the user program. +// +// To provide more robust detection of even the ambiguous case, this workaround +// leverages the fact that all successful system call returns set a secondary +// return register in addition to the primary return value in x0 and rax. The +// secondary return registers are x1 and rdx, identical to each architecture’s +// ABI for a return of a struct containing 2 integers. For the vast majority of +// system calls (only `fork` and `pipe` are exceptions), the secondary return +// register is cleared. Thus, if the secondary return register is nonzero on +// system call entry, and it remains nonzero on system call return, it can be +// taken as a signal that the bug occurred unambiguously. +// +// By architecture: +// - On arm64, x1 = buffer. x1 can be consulted to detect the bug unambiguously +// as long as buffer != nullptr. If buffer == nullptr and size > 0, the call +// would have resulted in an error return (EFAULT) so the bug would not have +// been observed. +// - On x86_64, rdx = size. rdx can be consulted to detect the bug +// unambiguously as long as size != 0. +// +// For slightly different reasons on each architecture, it is possible for the +// secondary return value mechanism to fail to detect the bug’s occurrence when +// size == 0. The bug cannot occur for a `sendto` on a TCP socket with size == +// 0, because sending 0 bytes via TCP is a no-op, and an early-return path is +// taken in the kernel without the bogus return value appearing. Thus, for any +// TCP socket, the secondary return value alone provides robust and unambiguous +// detection of the bug’s occurrence. +// +// A 0-byte `sendto` on a UDP socket is valid (it sends or queues a packet with +// no data payload beyond the UDP header), so for a 0-byte `sendto`, the +// secondary return register does not indicate the bug’s occurrence. Leveraging +// the fact that a 0-byte successful `sendto` can only validly return 0, the +// primary return value being nonzero can provide unambiguous detection of the +// bug’s occurrence on x86_64. On arm64, there’s a small amount of potential +// confusion in that w0 = fd, and 0 is valid as a file descriptor. Fortunately, +// as a file descriptor, 0 is STDIN_FILENO, and this code is not likely to +// manipulate a socket on the standard input stream, and even less likely to +// `sendto` via an input stream (although this is by convention, not strict +// requirement). +// +// The workaround is implemented in a bug-detecting wrapper around `sendto`. +// Substitute the SendtoAndDetectBogusReturnValue wrapper for a call to +// `sendto`, or SendAndDetectBogusReturnValue wrapper for a call to `send`, and +// when the bug occurs and is detected, its return value will be +// kSendBogusReturnValueDetected. In all other respects, the wrappers behave +// identically to `sendto` and `send`. +// +// Assuming that `send` tail-calls `sendto`, and a successful `sendto` returns +// immediately from the system call to its caller without modifying any +// registers, this detection mechanism will be valid. These assumptions hold +// empirically, as well as through a read of all of the source code on both the +// user and kernel sides of the system call boundary, at all relevant OS +// versions. However, there’s no guarantee that it must hold into the future, +// and it’s possible that a future OS version might invalidate these +// assumptions. In that case, this technique of detecting the bug’s occurrence +// via x1 and rdx might be jeopardized. This workaround is only attempted on +// OS versions where it’s known to be necessary. +// +// Note that these assumptions are not valid for an error return from the system +// call, and the secondary return register is not set during an error return +// either, so the bug-detecting wrapper takes care to only attempt detection +// during apparent successful returns. + +// The assumptions above aren’t valid for certain sanitizers. Under Address +// Sanitizer, some system calls are intercepted via interposition, so +// libclang_rt.asan_osx_dynamic.dylib’s `wrap_sendto`, which does pre- and +// post-processing around a call to `sendto`, will appear when the program +// expects to call `sendto` directly. ASan’s interceptors exist between the +// wrapping that this workaround implements and the underlying system call; the +// basis of implementation for the ones relevant to this workaround is llvm +// compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc. Unaware +// of the normally hidden secondary system call return register, ASan’s +// interceptors may clobber it before this workaround’s wrapper has an +// opportunity to examine it. Address Sanitizer and Thread Sanitizer’s runtime +// libraries both expose `wrap_sendto`, so don’t attempt this workaround in ASan +// or TSan builds. +// +// FB19384824 will be fixed in macOS 26.1 and iOS 26.1 (the fix is present as of +// 26.1b2). When the minimum runtime OS version is at or beyond this, disable +// the workaround entirely at compile time. +#if !defined(ADDRESS_SANITIZER) && !defined(THREAD_SANITIZER) && \ + ((BUILDFLAG(IS_MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED < 26'01'00) || \ + (BUILDFLAG(IS_IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED < 26'01'00)) +#define WORK_AROUND_CRBUG_40064248 1 + +namespace net { + +// A return value used to signal the bug’s occurrence in-band. This must be +// negative to avoid being confused with any possible successful return value, +// and it must not be -1 to avoid being confused with a normal errno-setting +// error return. In-band signaling makes things easier for callers, because +// `send` and `sendto` can be swapped out easily in favor of their wrappers, +// which can be used equally well with HANDLE_EINTR as appropriate. +inline constexpr ssize_t kSendBogusReturnValueDetected = -2; +static_assert(kSendBogusReturnValueDetected < 0 && + kSendBogusReturnValueDetected != -1); + +// Wrap `sendto`, returning kSendBogusReturnValueDetected when the bug’s +// occurrence is detected. +ssize_t SendtoAndDetectBogusReturnValue(int fd, + void const* buffer, + size_t size, + int flags, + sockaddr const* address, + socklen_t address_size); + +// `send` is the same as `sendto` with the final two arguments zeroed. +inline ssize_t SendAndDetectBogusReturnValue(int const fd, + void const* const buffer, + size_t const size, + int const flags) { + return SendtoAndDetectBogusReturnValue(fd, buffer, size, flags, nullptr, 0); +} + +} // namespace net + +#endif // !ADDRESS_SANITIZER && !THREAD_SANITIZER && ((MAC && DT < 26.1) || + // (IOS && DT < 26.1)) + +#endif // NET_SOCKET_SOCKET_APPLE_H_ diff --git a/naiveproxy/src/net/socket/socket_bio_adapter.cc b/naiveproxy/src/net/socket/socket_bio_adapter.cc index 31d3eaba42..1306a0f574 100644 --- a/naiveproxy/src/net/socket/socket_bio_adapter.cc +++ b/naiveproxy/src/net/socket/socket_bio_adapter.cc @@ -294,33 +294,14 @@ int SocketBIOAdapter::BIOWrite(base::span in) { void SocketBIOAdapter::SocketWrite() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); while (write_error_ == OK && write_buffer_used_ > 0) { - const size_t write_buffer_used_old = write_buffer_used_; const auto write_size = static_cast(std::min( write_buffer_used_, base::checked_cast(write_buffer_->RemainingCapacity()))); - // TODO(crbug.com/40064248): Remove this once the crash is resolved. - char debug[128]; - snprintf(debug, sizeof(debug), - "offset=%d;remaining=%d;used=%zu;write_size=%d", - write_buffer_->offset(), write_buffer_->RemainingCapacity(), - write_buffer_used_, write_size); - base::debug::Alias(debug); - write_error_ = ERR_IO_PENDING; int result = socket_->Write(write_buffer_.get(), write_size, write_callback_, kTrafficAnnotation); - // TODO(crbug.com/40064248): Remove this once the crash is resolved. - char debug2[32]; - snprintf(debug2, sizeof(debug2), "result=%d", result); - base::debug::Alias(debug2); - - // If `write_buffer_used_` changed across a call to the underlying socket, - // something went very wrong. - // - // TODO(crbug.com/40064248): Remove this once the crash is resolved. - CHECK_EQ(write_buffer_used_old, write_buffer_used_); if (result != ERR_IO_PENDING) { // `HandleSocketWriteResult` will update `write_error_` based on `result. HandleSocketWriteResult(result); diff --git a/naiveproxy/src/net/socket/socket_posix.cc b/naiveproxy/src/net/socket/socket_posix.cc index f5bfb7a52a..9e9f1b431f 100644 --- a/naiveproxy/src/net/socket/socket_posix.cc +++ b/naiveproxy/src/net/socket/socket_posix.cc @@ -28,114 +28,19 @@ #include "net/base/trace_constants.h" #include "net/traffic_annotation/network_traffic_annotation.h" -// TODO(crbug.com/40064248): Remove this once sufficient information is -// collected. -#include "base/debug/crash_logging.h" - #if BUILDFLAG(IS_FUCHSIA) #include #include #endif // BUILDFLAG(IS_FUCHSIA) -#if defined(DEBUG_CRBUG_40064248_STATISTICS) - -// TODO(crbug.com/40064248): Remove this once the crash is resolved. - #if BUILDFLAG(IS_APPLE) -#include -#include -#include -#include +#include "net/socket/socket_apple.h" #endif // BUILDFLAG(IS_APPLE) -#include "base/no_destructor.h" -#include "base/strings/stringprintf.h" -#include "base/synchronization/lock.h" - -#endif // DEBUG_CRBUG_40064248_STATISTICS - namespace net { namespace { -#if defined(DEBUG_CRBUG_40064248_STATISTICS) - -// TODO(crbug.com/40064248): Remove this once the crash is resolved. - -#if BUILDFLAG(IS_APPLE) - -timespec TimespecSubtract(const timespec& minuend, const timespec& subtrahend) { - constexpr int kNanosecondsPerSecond = 1e9; - - timespec difference{ - .tv_sec = minuend.tv_sec - subtrahend.tv_sec, - .tv_nsec = minuend.tv_nsec - subtrahend.tv_nsec, - }; - if (difference.tv_nsec < 0) { - --difference.tv_sec; - difference.tv_nsec += kNanosecondsPerSecond; - } - return difference; -} - -// Returns the start time of the process, on the CLOCK_MONOTONIC_RAW time base. -timespec ProcessStartTimeMonotonic() { - timespec now_real; - if (clock_gettime(CLOCK_REALTIME, &now_real) != 0) { - return {.tv_sec = -1, .tv_nsec = -1 - errno}; - } - - timespec now_monotonic; - if (clock_gettime(CLOCK_MONOTONIC_RAW, &now_monotonic) != 0) { - return {.tv_sec = -2, .tv_nsec = -1 - errno}; - } - - timespec monotonic_real_offset(TimespecSubtract(now_real, now_monotonic)); - if (monotonic_real_offset.tv_sec < 0) { - return {.tv_sec = -3, .tv_nsec = -1}; - } - - kinfo_proc kern_proc_info; - int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()}; - size_t len = sizeof(kern_proc_info); - if (sysctl(mib, std::size(mib), &kern_proc_info, &len, nullptr, 0) != 0) { - return {.tv_sec = -4, .tv_nsec = -1 - errno}; - } - - timespec start_real; - TIMEVAL_TO_TIMESPEC(&kern_proc_info.kp_proc.p_starttime, &start_real); - - return TimespecSubtract(start_real, monotonic_real_offset); -} - -#endif // BUILDFLAG(IS_APPLE) - -// Returns a string representation of `time`, taken relative to `start_time`. -// The times must be on the same timebase, such as CLOCK_MONOTONIC_RAW. -std::string ProcessTimeString(const timespec& time, - const timespec& start_time) { - if (time.tv_sec == -1 && time.tv_nsec < 0) { - return base::StringPrintf("(time_errno=%d)", -1 - time.tv_nsec); - } - - std::string s; - timespec print_time; - if (start_time.tv_sec <= -1 && start_time.tv_sec >= -4 && - start_time.tv_nsec < 0) { - s.assign(base::StringPrintf("(start_time_errno=%d,%d)", -start_time.tv_sec, - -1 - start_time.tv_nsec)); - print_time = time; - } else { - print_time = TimespecSubtract(time, start_time); - } - - base::StringAppendF(&s, "%d.%09d", print_time.tv_sec, print_time.tv_nsec); - - return s; -} - -#endif // DEBUG_CRBUG_40064248_STATISTICS - int MapAcceptError(int os_error) { switch (os_error) { // If the client aborts the connection before the server calls accept, @@ -616,77 +521,25 @@ void SocketPosix::ReadCompleted() { } int SocketPosix::DoWrite(IOBuffer* buf, int buf_len) { - const char* data = buf->data(); - const int flags = MSG_NOSIGNAL; +#if defined(WORK_AROUND_CRBUG_40064248) + ssize_t send_rv = HANDLE_EINTR(SendAndDetectBogusReturnValue( + socket_fd_, buf->data(), buf_len, MSG_NOSIGNAL)); + if (send_rv == kSendBogusReturnValueDetected) { + // https://crbug.com/40064248 is known to occur as a result of certain + // network configuration changes. + return ERR_NETWORK_CHANGED; + } +#else // WORK_AROUND_CRBUG_40064248 + ssize_t send_rv = + HANDLE_EINTR(send(socket_fd_, buf->data(), buf_len, MSG_NOSIGNAL)); +#endif // WORK_AROUND_CRBUG_40064248 - // TODO(crbug.com/40064248): Remove this once the crash is resolved. - char debug3[128]; - snprintf(debug3, sizeof(debug3), - "socket_fd_=%d,data=%p,buf_len=%d,flags=0x%x", socket_fd_, data, - buf_len, flags); - base::debug::Alias(debug3); - - ssize_t send_rv = HANDLE_EINTR(send(socket_fd_, buf->data(), buf_len, flags)); - int send_errno = errno; - -#if defined(DEBUG_CRBUG_40064248_STATISTICS) - // TODO(crbug.com/40064248): Remove this once the crash is resolved. - - // Do this once, as close to process start as is reasonably practical, - // because the OS records the start time on the CLOCK_REALTIME timebase, - // which can only drift (or even move backwards) relative to the - // CLOCK_MONOTONIC_RAW timebase as time elapses. - static timespec start_time(ProcessStartTimeMonotonic()); - - timespec now; - if (clock_gettime(CLOCK_MONOTONIC_RAW, &now) != 0) { - now.tv_sec = -1; - now.tv_nsec = -errno; + if (send_rv < 0) { + return MapSystemError(errno); } - static Statistics g_statistics; - - // A single SocketPosix shouldn’t have DoWrite called on more than one thread, - // checked by its thread_checker_. Thus, access to its own statistics_ need - // not be thread-safe. It’s less certain that access to the global - // g_statistics can afford to not be thread-safe, because it’s conceivable - // (although unlikely) that different SocketPosix objects operate on different - // threads. Use a mutex to protect g_statistics and, incidentally, all - // SocketPosix::statistics_ objects. The mutex is not likely to be contended, - // and in any case, the critical section executes quickly. - static base::NoDestructor statistics_lock; - base::ReleasableAutoLock statistics_auto_lock(statistics_lock.get()); - - statistics_.Update(socket_fd_, send_rv, send_errno, now); - g_statistics.Update(socket_fd_, send_rv, send_errno, now); -#endif // DEBUG_CRBUG_40064248_STATISTICS - - if (send_rv >= 0) { - if (send_rv > buf_len) { - // TODO(crbug.com/40064248): Remove this once the crash is resolved. - char debug4[64]; - snprintf(debug4, sizeof(debug4), "send_rv=%zd,send_errno=%d", send_rv, - send_rv < 0 ? send_errno : 0); - base::debug::Alias(debug4); - -#if defined(DEBUG_CRBUG_40064248_STATISTICS) - char debug5[4096]; - snprintf(debug5, sizeof(debug5), "statistics_={%s},g_statistics={%s}", - statistics_.DebugInfo(start_time).c_str(), - g_statistics.DebugInfo(start_time).c_str()); - base::debug::Alias(debug5); - statistics_auto_lock.Release(); -#endif // DEBUG_CRBUG_40064248_STATISTICS - - // This duplicates the CHECK_LE below. Keep it here so that the aliased - // debug buffers are in scope when the process crashes. - CHECK_LE(send_rv, buf_len); - } - - CHECK_LE(send_rv, buf_len); - } - - return send_rv >= 0 ? send_rv : MapSystemError(send_errno); + CHECK_LE(send_rv, buf_len); + return send_rv; } void SocketPosix::WriteCompleted() { @@ -742,145 +595,4 @@ void SocketPosix::StopWatchingAndCleanUp(bool close_socket) { peer_address_.reset(); } -#if defined(DEBUG_CRBUG_40064248_STATISTICS) - -// TODO(crbug.com/40064248): Remove this once the crash is resolved. - -SocketPosix::Statistics::Statistics() = default; - -void SocketPosix::Statistics::Update(const int socket_fd, - const ssize_t send_rv, - const int send_errno, - const timespec& now) { - if (send_rv < 0) { - if (sends_error_++ == 0) { - first_send_errno_ = send_errno; - first_send_error_time_ = now; - } - last_send_errno_ = send_errno; - last_send_error_time_ = now; - if (sends_error_consecutive_++ == 0) { - first_send_error_consecutive_time_ = now; - } - - sends_suspicious_consecutive_ = 0; - send_bytes_suspicious_consecutive_ = 0; - first_send_suspicious_consecutive_time_ = {}; - } else { - // Suspicious return values for `send` are those that are produced when the - // `sendto` system call returns from the kernel to user space without - // setting the return value register, leaving whatever contents had - // previously been there on the call into the kernel. The return value - // register is x0 on arm64 and rax on x86-64. When the `sendto` system call - // is made, user space places the first argument, the file descriptor - // number, in r0 (thus x0) on arm64, and the UNIX system call class (2) and - // `sendto` system call number (133) in eax (thus rax) on x86_64. - // - // A suspicious return isn’t necessarily a problem: it’s possible that only - // that many bytes were sent (or consumed from the buffer and queued to be - // sent). But it could also be an indication of https://crbug.com/40064248 - // occurring before it’s unambiguously detectable as a bug. - // - // Suspicious returns become unambiguously detectable when they exceed the - // size of the buffer passed to `send`. - // - // This classifies returns into suspicious and not-suspicious, so that the - // extent of the bug can be understood better. -#if BUILDFLAG(IS_APPLE) -#if defined(ARCH_CPU_ARM64) - const ssize_t suspicious_rv = socket_fd; -#elif defined(ARCH_CPU_X86_FAMILY) - // Definitions from xnu osfmk/mach/i386/syscall_sw.h, as used in its - // SYSCALL_CONSTRUCT_UNIX. - constexpr uint32_t SYSCALL_CLASS_SHIFT = 24; - constexpr uint32_t SYSCALL_CLASS_MASK = 0xff << SYSCALL_CLASS_SHIFT; - constexpr uint32_t SYSCALL_NUMBER_MASK = ~SYSCALL_CLASS_MASK; - constexpr uint32_t SYSCALL_CLASS_UNIX = 2; - - const ssize_t suspicious_rv = - ((SYSCALL_CLASS_UNIX << SYSCALL_CLASS_SHIFT) & SYSCALL_CLASS_MASK) | - (SYS_sendto & SYSCALL_NUMBER_MASK); // ((2 << 24) | 133) = 0x2000085 -#endif -#endif // BUILDFLAG(IS_APPLE) - const bool suspicious = send_rv == suspicious_rv; - - if (!suspicious) { - if (sends_ok_++ == 0) { - first_send_ok_time_ = now; - } - send_bytes_ok_ += send_rv; - last_send_ok_time_ = now; - - sends_suspicious_consecutive_ = 0; - send_bytes_suspicious_consecutive_ = 0; - first_send_suspicious_consecutive_time_ = {}; - } else { - if (sends_suspicious_++ == 0) { - first_send_suspicious_time_ = now; - } - send_bytes_suspicious_ += send_rv; - last_send_suspicious_time_ = now; - - if (sends_suspicious_consecutive_++ == 0) { - first_send_suspicious_consecutive_time_ = now; - } - send_bytes_suspicious_consecutive_ += send_rv; - } - - sends_error_consecutive_ = 0; - first_send_error_consecutive_time_ = {}; - } -} - -std::string SocketPosix::Statistics::DebugInfo( - const timespec& start_time) const { - std::string s(base::StringPrintf( - "sends_ok_=%u,sends_suspicious_=%u,sends_suspicious_consecutive_=%u," - "sends_error_=%u,sends_error_consecutive_=%u,send_bytes_ok_=%u," - "send_bytes_suspicious_=%u,send_bytes_suspicious_consecutive_=%u", - sends_ok_, sends_suspicious_, sends_suspicious_consecutive_, sends_error_, - sends_error_consecutive_, send_bytes_ok_, send_bytes_suspicious_, - send_bytes_suspicious_consecutive_)); - - if (sends_ok_) { - base::StringAppendF(&s, ",first_send_ok_time_=%s,last_send_ok_time_=%s", - ProcessTimeString(first_send_ok_time_, start_time), - ProcessTimeString(last_send_ok_time_, start_time)); - } - - if (sends_suspicious_) { - base::StringAppendF( - &s, ",first_send_suspicious_time_=%s,last_send_suspicious_time_=%s", - ProcessTimeString(first_send_suspicious_time_, start_time), - ProcessTimeString(last_send_suspicious_time_, start_time)); - - if (sends_suspicious_consecutive_) { - base::StringAppendF( - &s, ",first_send_suspicious_consecutive_time_=%s", - ProcessTimeString(first_send_suspicious_consecutive_time_, - start_time)); - } - } - - if (sends_error_) { - base::StringAppendF( - &s, - ",first_send_errno_=%d,last_send_errno_=%d,first_send_error_time_=%s," - "last_send_error_time_=%s", - first_send_errno_, last_send_errno_, - ProcessTimeString(first_send_error_time_, start_time), - ProcessTimeString(last_send_error_time_, start_time)); - - if (sends_error_consecutive_) { - base::StringAppendF( - &s, ",first_send_error_consecutive_time_=%s", - ProcessTimeString(first_send_error_consecutive_time_, start_time)); - } - } - - return s; -} - -#endif // DEBUG_CRBUG_40064248_STATISTICS - } // namespace net diff --git a/naiveproxy/src/net/socket/socket_posix.h b/naiveproxy/src/net/socket/socket_posix.h index 3c7c22cb3f..f7155cab06 100644 --- a/naiveproxy/src/net/socket/socket_posix.h +++ b/naiveproxy/src/net/socket/socket_posix.h @@ -17,15 +17,6 @@ #include "net/socket/socket_descriptor.h" #include "net/traffic_annotation/network_traffic_annotation.h" -#if BUILDFLAG(IS_MAC) -#define DEBUG_CRBUG_40064248_STATISTICS 1 -#include -#include -#include - -#include -#endif // BUILDFLAG(IS_MAC) - namespace net { class IOBuffer; @@ -116,51 +107,6 @@ class NET_EXPORT_PRIVATE SocketPosix SocketDescriptor socket_fd() const { return socket_fd_; } private: -#if defined(DEBUG_CRBUG_40064248_STATISTICS) - // TODO(crbug.com/40064248): Remove this once the crash is resolved. - class Statistics { - public: - Statistics(); - - // Update statistics with the result of a send. - void Update(int socket_fd, - ssize_t send_rv, - int send_errno, - const timespec& now); - - // Return a string form of the collected statistics. Times are represented - // relative to start_time, if possible. - std::string DebugInfo(const timespec& start_time) const; - - private: - // *_errno_ and other *_error_* members track `send` reporting an error by - // returning -1. They don’t track the occurrence of - // https://crbug.com/40064248. *_suspicious_* tracks possible occurrences of - // that bug, and a CHECK failure records a definite occurrence. - int first_send_errno_ = 0; - int last_send_errno_ = 0; - - uint64_t sends_ok_ = 0; - uint64_t sends_suspicious_ = 0; - uint64_t sends_suspicious_consecutive_ = 0; - uint64_t sends_error_ = 0; - uint64_t sends_error_consecutive_ = 0; - uint64_t send_bytes_ok_ = 0; - uint64_t send_bytes_suspicious_ = 0; - uint64_t send_bytes_suspicious_consecutive_ = 0; - - // Times are recorded relative to CLOCK_MONOTONIC_RAW. - timespec first_send_ok_time_ = {}; - timespec last_send_ok_time_ = {}; - timespec first_send_suspicious_time_ = {}; - timespec last_send_suspicious_time_ = {}; - timespec first_send_suspicious_consecutive_time_ = {}; - timespec first_send_error_time_ = {}; - timespec last_send_error_time_ = {}; - timespec first_send_error_consecutive_time_ = {}; - }; -#endif // DEBUG_CRBUG_40064248_STATISTICS - // base::MessagePumpForIO::FdWatcher methods. void OnFileCanReadWithoutBlocking(int fd) override; void OnFileCanWriteWithoutBlocking(int fd) override; @@ -210,10 +156,6 @@ class NET_EXPORT_PRIVATE SocketPosix std::unique_ptr peer_address_; base::ThreadChecker thread_checker_; - -#if defined(DEBUG_CRBUG_40064248_STATISTICS) - Statistics statistics_; -#endif // DEBUG_CRBUG_40064248_STATISTICS }; } // namespace net diff --git a/naiveproxy/src/net/socket/socket_tag.cc b/naiveproxy/src/net/socket/socket_tag.cc index 1a2713c9e4..6a2fef1bc7 100644 --- a/naiveproxy/src/net/socket/socket_tag.cc +++ b/naiveproxy/src/net/socket/socket_tag.cc @@ -4,6 +4,7 @@ #include "net/socket/socket_tag.h" +#include #include #include "base/notreached.h" @@ -59,4 +60,13 @@ void SocketTag::Apply(SocketDescriptor socket) const { #endif // BUILDFLAG(IS_ANDROID) } +std::ostream& operator<<(std::ostream& os, const SocketTag& tag) { +#if BUILDFLAG(IS_ANDROID) + os << "uid: " << tag.uid() << ", tag: " << tag.traffic_stats_tag(); +#else + os << "SocketTag()"; +#endif // BUILDFLAG(IS_ANDROID) + return os; +} + } // namespace net diff --git a/naiveproxy/src/net/socket/socket_tag.h b/naiveproxy/src/net/socket/socket_tag.h index e2c004e58e..250c78234a 100644 --- a/naiveproxy/src/net/socket/socket_tag.h +++ b/naiveproxy/src/net/socket/socket_tag.h @@ -5,6 +5,8 @@ #ifndef NET_SOCKET_SOCKET_TAG_H_ #define NET_SOCKET_SOCKET_TAG_H_ +#include + #include "build/build_config.h" #include "net/base/net_export.h" #include "net/socket/socket_descriptor.h" @@ -62,6 +64,9 @@ class NET_EXPORT SocketTag { // Copying and assignment are allowed. }; +// Allows for logging of SocketTag. +NET_EXPORT std::ostream& operator<<(std::ostream& os, const SocketTag& tag); + } // namespace net #endif // NET_SOCKET_SOCKET_TAG_H_ diff --git a/naiveproxy/src/net/socket/socket_test_util.cc b/naiveproxy/src/net/socket/socket_test_util.cc index aa41c05a5c..0d0198e1d1 100644 --- a/naiveproxy/src/net/socket/socket_test_util.cc +++ b/naiveproxy/src/net/socket/socket_test_util.cc @@ -60,7 +60,7 @@ #include "third_party/abseil-cpp/absl/strings/ascii.h" #if BUILDFLAG(IS_ANDROID) -#include "base/android/build_info.h" +#include "base/android/android_info.h" #endif #define NET_TRACE(level, s) VLOG(level) << s << __FUNCTION__ << "() " @@ -148,9 +148,12 @@ MockConnectCompleter::MockConnectCompleter() = default; MockConnectCompleter::~MockConnectCompleter() = default; -void MockConnectCompleter::SetCallback(CompletionOnceCallback callback) { - CHECK(!callback_); - callback_ = std::move(callback); +void MockConnectCompleter::WaitForConnect() { + // This class is single use - so either the RunLoop should already have been + // quit, or `connect_` is null (but not both). + CHECK(!callback_ || run_loop_.AnyQuitCalled()); + CHECK(callback_ || !run_loop_.AnyQuitCalled()); + run_loop_.Run(); } void MockConnectCompleter::Complete(int result) { @@ -158,6 +161,17 @@ void MockConnectCompleter::Complete(int result) { std::move(callback_).Run(result); } +void MockConnectCompleter::WaitForConnectAndComplete(int result) { + WaitForConnect(); + Complete(result); +} + +void MockConnectCompleter::SetCallback(CompletionOnceCallback callback) { + CHECK(!callback_); + callback_ = std::move(callback); + run_loop_.Quit(); +} + MockConnect::MockConnect() : mode(ASYNC), result(OK) { peer_addr = IPEndPoint(IPAddress(192, 0, 2, 33), 0); } @@ -359,6 +373,13 @@ void StaticSocketDataProvider::Resume() { paused_ = false; } +void StaticSocketDataProvider::ExpectAllReadDataConsumed() const { + helper_.ExpectAllReadDataConsumed(printer_.get()); +} +void StaticSocketDataProvider::ExpectAllWriteDataConsumed() const { + helper_.ExpectAllWriteDataConsumed(printer_.get()); +} + MockRead StaticSocketDataProvider::OnRead() { if (AllReadDataConsumed()) { const net::MockRead pending_read(net::SYNCHRONOUS, net::ERR_IO_PENDING); @@ -959,6 +980,9 @@ std::unique_ptr MockClientSocketFactory::CreateSSLClientSocket( EXPECT_EQ(*next_ssl_data->expected_trust_anchor_ids, ssl_config.trust_anchor_ids); } + if (next_ssl_data->expect_no_trust_anchor_ids) { + EXPECT_EQ(std::nullopt, ssl_config.trust_anchor_ids); + } return std::make_unique( std::move(stream_socket), host_and_port, ssl_config, next_ssl_data); } @@ -2327,8 +2351,8 @@ bool CanGetTaggedBytes() { // statistics for local traffic, only mobile and WiFi traffic, so it would not // work in tests that spin up a local server. So for now, GetTaggedBytes is // only supported on Android releases older than P. - return base::android::BuildInfo::GetInstance()->sdk_int() < - base::android::SDK_VERSION_P; + return base::android::android_info::sdk_int() < + base::android::android_info::SDK_VERSION_P; } uint64_t GetTaggedBytes(int32_t expected_tag) { diff --git a/naiveproxy/src/net/socket/socket_test_util.h b/naiveproxy/src/net/socket/socket_test_util.h index c15cd5d299..a1488b54a6 100644 --- a/naiveproxy/src/net/socket/socket_test_util.h +++ b/naiveproxy/src/net/socket/socket_test_util.h @@ -26,6 +26,7 @@ #include "base/memory/raw_span.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" +#include "base/run_loop.h" #include "base/strings/string_view_util.h" #include "build/build_config.h" #include "net/base/address_list.h" @@ -116,9 +117,15 @@ class MockConnectCompleter { ~MockConnectCompleter(); + // Wait for a connection attempt. + void WaitForConnect(); + // Completes Connect() with `result`. void Complete(int result); + // Convenience function that combines WaitForConnect() and Complete(). + void WaitForConnectAndComplete(int result); + private: friend class MockTCPClientSocket; friend class MockSSLClientSocket; @@ -129,6 +136,7 @@ class MockConnectCompleter { void SetCallback(CompletionOnceCallback callback); CompletionOnceCallback callback_; + base::RunLoop run_loop_; }; struct MockConnect { @@ -551,6 +559,10 @@ class StaticSocketDataProvider : public SocketDataProvider { void Pause(); void Resume(); + // EXPECTs that all data has been consumed, printing any un-consumed data. + void ExpectAllReadDataConsumed() const; + void ExpectAllWriteDataConsumed() const; + // From SocketDataProvider: MockRead OnRead() override; MockWriteResult OnWrite(const std::string& data) override; @@ -633,7 +645,12 @@ struct SSLSocketDataProvider { std::optional expected_ignore_certificate_errors; std::optional expected_network_anonymization_key; std::optional> expected_ech_config_list; + // If not nullopt, expects a (possibly empty) trust anchors extension with the + // specified value. std::optional> expected_trust_anchor_ids; + // Expects no trust anchors extension. This is a separate field to avoid a + // confusing double-optional. + bool expect_no_trust_anchor_ids = false; bool is_connect_data_consumed = false; bool is_confirm_data_consumed = false; diff --git a/naiveproxy/src/net/socket/ssl_client_socket.cc b/naiveproxy/src/net/socket/ssl_client_socket.cc index ddc7021c11..db33b4723c 100644 --- a/naiveproxy/src/net/socket/ssl_client_socket.cc +++ b/naiveproxy/src/net/socket/ssl_client_socket.cc @@ -12,6 +12,7 @@ #include "base/metrics/histogram_macros.h" #include "base/observer_list.h" #include "base/values.h" +#include "net/base/features.h" #include "net/cert/x509_certificate_net_log_param.h" #include "net/log/net_log.h" #include "net/log/net_log_event_type.h" @@ -79,6 +80,7 @@ void SSLClientSocket::RecordSSLConnectResult( bool trust_anchor_ids_from_dns, bool retried_with_trust_anchor_ids, const LoadTimingInfo::ConnectTiming& connect_timing) { + const bool is_ok = result == OK; if (is_ech_capable && ech_enabled) { // These values are persisted to logs. Entries should not be renumbered // and numeric values should never be reused. @@ -98,7 +100,6 @@ void SSLClientSocket::RecordSSLConnectResult( kErrorRollback = 5, kMaxValue = kErrorRollback, }; - const bool is_ok = result == OK; ECHResult ech_result; if (!ech_retry_configs.has_value()) { ech_result = @@ -112,18 +113,25 @@ void SSLClientSocket::RecordSSLConnectResult( base::UmaHistogramEnumeration("Net.SSL.ECHResult", ech_result); } + TrustAnchorIDsResult tai_result; if (trust_anchor_ids_from_dns) { - const bool is_ok = result == OK; - TrustAnchorIDsResult tai_result; if (retried_with_trust_anchor_ids) { - tai_result = is_ok ? TrustAnchorIDsResult::kSuccessRetry - : TrustAnchorIDsResult::kErrorRetry; + tai_result = is_ok ? TrustAnchorIDsResult::kDnsSuccessRetry + : TrustAnchorIDsResult::kDnsErrorRetry; } else { - tai_result = is_ok ? TrustAnchorIDsResult::kSuccessInitial - : TrustAnchorIDsResult::kErrorInitial; + tai_result = is_ok ? TrustAnchorIDsResult::kDnsSuccessInitial + : TrustAnchorIDsResult::kDnsErrorInitial; + } + } else { + if (retried_with_trust_anchor_ids) { + tai_result = is_ok ? TrustAnchorIDsResult::kNoDnsSuccessRetry + : TrustAnchorIDsResult::kNoDnsErrorRetry; + } else { + tai_result = is_ok ? TrustAnchorIDsResult::kNoDnsSuccessInitial + : TrustAnchorIDsResult::kNoDnsErrorInitial; } - base::UmaHistogramEnumeration("Net.SSL.TrustAnchorIDsResult", tai_result); } + base::UmaHistogramEnumeration("Net.SSL.TrustAnchorIDsResult", tai_result); if (result == OK) { DCHECK(!connect_timing.ssl_start.is_null()); @@ -132,11 +140,6 @@ void SSLClientSocket::RecordSSLConnectResult( connect_timing.ssl_end - connect_timing.ssl_start; UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_2", connect_duration, base::Milliseconds(1), base::Minutes(1), 100); - if (is_ech_capable) { - UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_ECH", - connect_duration, base::Milliseconds(1), - base::Minutes(1), 100); - } if (trust_anchor_ids_from_dns) { base::UmaHistogramCustomTimes("Net.SSL_Connection_Latency_TrustAnchorIDs", connect_duration, base::Milliseconds(1), @@ -163,9 +166,6 @@ void SSLClientSocket::RecordSSLConnectResult( } base::UmaHistogramSparse("Net.SSL_Connection_Error", std::abs(result)); - if (is_ech_capable) { - base::UmaHistogramSparse("Net.SSL_Connection_Error_ECH", std::abs(result)); - } if (trust_anchor_ids_from_dns) { base::UmaHistogramSparse("Net.SSL_Connection_Error_TrustAnchorIDs", std::abs(result)); @@ -303,6 +303,9 @@ void SSLClientContext::OnTrustStoreChanged() { void SSLClientContext::OnClientCertStoreChanged() { base::flat_set servers = ssl_client_auth_cache_.GetCachedServers(); + if (servers.empty()) { + return; + } ssl_client_auth_cache_.Clear(); if (ssl_client_session_cache_) { ssl_client_session_cache_->FlushForServers(servers); diff --git a/naiveproxy/src/net/socket/ssl_client_socket.h b/naiveproxy/src/net/socket/ssl_client_socket.h index 1ee5a8d630..8ed97016ed 100644 --- a/naiveproxy/src/net/socket/ssl_client_socket.h +++ b/naiveproxy/src/net/socket/ssl_client_socket.h @@ -54,15 +54,31 @@ class NET_EXPORT SSLClientSocket : public SSLSocket { // These values are persisted to logs. Entries should not be renumbered // and numeric values should never be reused. enum class TrustAnchorIDsResult { - // The connection succeeded on the initial connection. - kSuccessInitial = 0, - // The connection failed on the initial connection, without retrying. - kErrorInitial = 1, - // The connection succeeded after retrying with fresh Trust Anchor IDs. - kSuccessRetry = 2, - // The connection failed after retrying with fresh Trust Anchor IDs. - kErrorRetry = 3, - kMaxValue = kErrorRetry, + // There was a DNS hint, and the connection succeeded on the initial + // connection. + kDnsSuccessInitial = 0, + // There was a DNS hint, and the connection failed on the initial + // connection, without retrying. + kDnsErrorInitial = 1, + // There was a DNS hint, and the connection succeeded after retrying with + // fresh Trust Anchor IDs. + kDnsSuccessRetry = 2, + // There was a DNS hint, and the connection failed after retrying with fresh + // Trust Anchor IDs. + kDnsErrorRetry = 3, + // There was no DNS hint, and the connection succeeded on the initial + // connection. + kNoDnsSuccessInitial = 4, + // There was no DNS hint, and the connection failed on the initial + // connection, without retrying. + kNoDnsErrorInitial = 5, + // There was no DNS hint, and the connection succeeded after retrying with + // fresh Trust Anchor IDs. + kNoDnsSuccessRetry = 6, + // There was no DNS hint, and the connection failed after retrying with + // fresh Trust Anchor IDs. + kNoDnsErrorRetry = 7, + kMaxValue = kNoDnsErrorRetry, }; SSLClientSocket(); diff --git a/naiveproxy/src/net/socket/ssl_client_socket_impl.cc b/naiveproxy/src/net/socket/ssl_client_socket_impl.cc index b5a8d4ef53..9cb2c324e9 100644 --- a/naiveproxy/src/net/socket/ssl_client_socket_impl.cc +++ b/naiveproxy/src/net/socket/ssl_client_socket_impl.cc @@ -676,15 +676,24 @@ int SSLClientSocketImpl::Init() { return ERR_UNEXPECTED; } - if (context_->config().post_quantum_key_agreement_enabled) { - const uint16_t kGroups[] = {SSL_GROUP_X25519_MLKEM768, SSL_GROUP_X25519, - SSL_GROUP_SECP256R1, SSL_GROUP_SECP384R1}; - if (!SSL_set1_group_ids(ssl_.get(), kGroups, std::size(kGroups))) { - return ERR_UNEXPECTED; - } + const std::vector supported_groups = + context_->config().GetSupportedGroups(); + if (!SSL_set1_group_ids(ssl_.get(), supported_groups.data(), + supported_groups.size())) { + return ERR_UNEXPECTED; + } + const std::vector key_shares = + context_->config().GetSupportedGroups(/*key_shares_only=*/true); + if (!key_shares.empty() && + !SSL_set1_client_key_shares(ssl_.get(), key_shares.data(), + key_shares.size())) { + return ERR_UNEXPECTED; } if (IsCachingEnabled()) { + initial_session_cache_generation_number_ = + context_->ssl_client_session_cache()->generation_number(); + bssl::UniquePtr session = context_->ssl_client_session_cache()->Lookup( GetSessionCacheKey(/*dest_ip_addr=*/std::nullopt)); @@ -729,27 +738,12 @@ int SSLClientSocketImpl::Init() { SSL_set_early_data_enabled(ssl_.get(), ssl_config_.early_data_enabled); - // OpenSSL defaults some options to on, others to off. To avoid ambiguity, - // set everything we care about to an absolute value. - SslSetClearMask options; - options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true); + // TODO(crbug.com/41393419): Make this option not a no-op in BoringSSL and + // then disable it. + SSL_set_options(ssl_.get(), SSL_OP_LEGACY_SERVER_CONNECT); - // TODO(joth): Set this conditionally, see http://crbug.com/55410 - options.ConfigureFlag(SSL_OP_LEGACY_SERVER_CONNECT, true); - - SSL_set_options(ssl_.get(), options.set_mask); - SSL_clear_options(ssl_.get(), options.clear_mask); - - // Same as above, this time for the SSL mode. - SslSetClearMask mode; - - mode.ConfigureFlag(SSL_MODE_RELEASE_BUFFERS, true); - mode.ConfigureFlag(SSL_MODE_CBC_RECORD_SPLITTING, true); - - mode.ConfigureFlag(SSL_MODE_ENABLE_FALSE_START, true); - - SSL_set_mode(ssl_.get(), mode.set_mask); - SSL_clear_mode(ssl_.get(), mode.clear_mask); + SSL_set_mode(ssl_.get(), + SSL_MODE_CBC_RECORD_SPLITTING | SSL_MODE_ENABLE_FALSE_START); // Use BoringSSL defaults, but disable 3DES and HMAC-SHA1 ciphers in ECDSA. // These are the remaining CBC-mode ECDSA ciphers. @@ -851,12 +845,19 @@ int SSLClientSocketImpl::Init() { SSL_set_permute_extensions(ssl_.get(), 1); // Configure BoringSSL to send Trust Anchor IDs, if provided. - if (!ssl_config_.trust_anchor_ids.empty()) { - if (!SSL_set1_requested_trust_anchors( - ssl_.get(), ssl_config_.trust_anchor_ids.data(), - ssl_config_.trust_anchor_ids.size())) { - return ERR_UNEXPECTED; - } + if (ssl_config_.trust_anchor_ids.has_value() && + !SSL_set1_requested_trust_anchors(ssl_.get(), + ssl_config_.trust_anchor_ids->data(), + ssl_config_.trust_anchor_ids->size())) { + return ERR_UNEXPECTED; + } + + // The compliance policy must be the last thing configured in order to have + // defined behavior. + if (context_->config().tls13_cipher_prefer_aes_256 && + !SSL_set_compliance_policy(ssl_.get(), + ssl_compliance_policy_cnsa_202407)) { + return ERR_UNEXPECTED; } return OK; @@ -1560,8 +1561,7 @@ int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) { net_log_.AddEventWithIntParams( NetLogEventType::SSL_CLIENT_CERT_PROVIDED, "cert_count", - base::checked_cast(1 + - client_cert_->intermediate_buffers().size())); + base::checked_cast(client_cert_->cert_buffers().size())); return 1; } #endif // !BUILDFLAG(ENABLE_CLIENT_CERTIFICATES) @@ -1592,7 +1592,8 @@ int SSLClientSocketImpl::NewSessionCallback(SSL_SESSION* session) { // OpenSSL optionally passes ownership of |session|. Returning one signals // that this function has claimed it. context_->ssl_client_session_cache()->Insert( - GetSessionCacheKey(ip_addr), bssl::UniquePtr(session)); + initial_session_cache_generation_number_, GetSessionCacheKey(ip_addr), + bssl::UniquePtr(session)); return 1; } diff --git a/naiveproxy/src/net/socket/ssl_client_socket_impl.h b/naiveproxy/src/net/socket/ssl_client_socket_impl.h index e8055bbedd..536607686c 100644 --- a/naiveproxy/src/net/socket/ssl_client_socket_impl.h +++ b/naiveproxy/src/net/socket/ssl_client_socket_impl.h @@ -252,6 +252,10 @@ class NET_EXPORT_PRIVATE SSLClientSocketImpl const raw_ptr context_; + // Stores the value of SSLClientSessionCache's generation number at the time + // this socket was initialized. + uint64_t initial_session_cache_generation_number_ = 0; + std::unique_ptr cert_verifier_request_; // Result from Cert Verifier. diff --git a/naiveproxy/src/net/socket/ssl_connect_job.cc b/naiveproxy/src/net/socket/ssl_connect_job.cc index 56773ecc0d..54dc58a037 100644 --- a/naiveproxy/src/net/socket/ssl_connect_job.cc +++ b/naiveproxy/src/net/socket/ssl_connect_job.cc @@ -389,11 +389,15 @@ int SSLConnectJob::DoSSLConnect() { !ssl_client_context()->config().trust_anchor_ids.empty()) { if (!trust_anchor_ids_for_retry_.empty()) { ssl_config.trust_anchor_ids = trust_anchor_ids_for_retry_; - } else if (endpoint_result_ && - !endpoint_result_->metadata.trust_anchor_ids.empty()) { + } else if (endpoint_result_) { ssl_config.trust_anchor_ids = SSLConfig::SelectTrustAnchorIDs( endpoint_result_->metadata.trust_anchor_ids, ssl_client_context()->config().trust_anchor_ids); + } else { + // Send an empty trust_anchors extension to signal we support the + // extension and can trigger the retry flow if the server picked a + // certificate wrong. + ssl_config.trust_anchor_ids.emplace(); } } diff --git a/naiveproxy/src/net/socket/ssl_connect_job.h b/naiveproxy/src/net/socket/ssl_connect_job.h index 606b0457f7..8bfde6c493 100644 --- a/naiveproxy/src/net/socket/ssl_connect_job.h +++ b/naiveproxy/src/net/socket/ssl_connect_job.h @@ -209,7 +209,7 @@ class NET_EXPORT_PRIVATE SSLConnectJob : public ConnectJob, // Any DNS aliases for the remote endpoint. Includes all known aliases, e.g. // from A, AAAA, or HTTPS, not just from the address used for the connection, // in no particular order. Stored because `nested_connect_job_` has a limited - // lifetime and the aliases can no longer be retrieved from there by by the + // lifetime and the aliases can no longer be retrieved from there by the // time that the aliases are needed to be passed in SetSocket. std::set dns_aliases_; diff --git a/naiveproxy/src/net/socket/ssl_server_socket.h b/naiveproxy/src/net/socket/ssl_server_socket.h index 9729614f1c..c90d073e1b 100644 --- a/naiveproxy/src/net/socket/ssl_server_socket.h +++ b/naiveproxy/src/net/socket/ssl_server_socket.h @@ -17,6 +17,7 @@ #define NET_SOCKET_SSL_SERVER_SOCKET_H_ #include +#include #include "net/base/completion_once_callback.h" #include "net/base/net_export.h" @@ -24,14 +25,10 @@ #include "net/socket/stream_socket.h" #include "third_party/boringssl/src/include/openssl/base.h" -namespace crypto { -class RSAPrivateKey; -} // namespace crypto - namespace net { struct SSLServerConfig; -class SSLPrivateKey; +struct SSLServerCredential; class X509Certificate; // A server socket that uses SSL as the transport layer. @@ -66,28 +63,17 @@ class SSLServerContext { // The caller must provide the server certificate and private key to use. // It takes a reference to |certificate| and |pkey|. // The |ssl_config| parameter is copied. +NET_EXPORT std::unique_ptr CreateSSLServerContext( + X509Certificate* certificate, + EVP_PKEY* pkey, + const SSLServerConfig& ssl_config); + +// Creates an SSL server socket context supporting multiple credentials. // +// The `credentials` are specified in order from highest to lowest priority, +// and must be non-empty. NET_EXPORT std::unique_ptr CreateSSLServerContext( - X509Certificate* certificate, - EVP_PKEY* pkey, - const SSLServerConfig& ssl_config); - -NET_EXPORT std::unique_ptr CreateSSLServerContext( - base::span> cert_chain, - EVP_PKEY* pkey, - const SSLServerConfig& ssl_config); - -// As above, but takes an RSAPrivateKey object. Deprecated, use the EVP_PKEY -// version instead. -// TODO(mattm): convert existing callers and remove this function. -NET_EXPORT std::unique_ptr CreateSSLServerContext( - X509Certificate* certificate, - const crypto::RSAPrivateKey& key, - const SSLServerConfig& ssl_config); - -NET_EXPORT std::unique_ptr CreateSSLServerContext( - X509Certificate* certificate, - scoped_refptr key, + std::vector credentials, const SSLServerConfig& ssl_config); } // namespace net diff --git a/naiveproxy/src/net/socket/ssl_server_socket_impl.cc b/naiveproxy/src/net/socket/ssl_server_socket_impl.cc index 0e4ef3efd3..59e2c4de99 100644 --- a/naiveproxy/src/net/socket/ssl_server_socket_impl.cc +++ b/naiveproxy/src/net/socket/ssl_server_socket_impl.cc @@ -4,10 +4,12 @@ #include "net/socket/ssl_server_socket_impl.h" +#include #include #include #include #include +#include #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" @@ -17,7 +19,6 @@ #include "base/notimplemented.h" #include "base/strings/string_util.h" #include "crypto/openssl_util.h" -#include "crypto/rsa_private_key.h" #include "net/base/completion_once_callback.h" #include "net/base/net_errors.h" #include "net/cert/cert_verify_result.h" @@ -29,7 +30,6 @@ #include "net/ssl/openssl_ssl_util.h" #include "net/ssl/ssl_connection_status_flags.h" #include "net/ssl/ssl_info.h" -#include "net/ssl/ssl_private_key.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "third_party/boringssl/src/include/openssl/bytestring.h" #include "third_party/boringssl/src/include/openssl/err.h" @@ -40,25 +40,6 @@ namespace net { -namespace { - -// This constant can be any non-negative/non-zero value (eg: it does not -// overlap with any value of the net::Error range, including net::OK). -const int kSSLServerSocketNoPendingResult = 1; - -std::vector> ChainFromX509Certificate( - X509Certificate* cert) { - std::vector> cert_chain; - cert_chain.reserve(1 + cert->intermediate_buffers().size()); - cert_chain.push_back(bssl::UpRef(cert->cert_buffer())); - for (const auto& handle : cert->intermediate_buffers()) { - cert_chain.push_back(bssl::UpRef(handle.get())); - } - return cert_chain; -} - -} // namespace - class SSLServerContextImpl::SocketImpl : public SSLServerSocket, public SocketBIOAdapter::Delegate { public: @@ -113,32 +94,6 @@ class SSLServerContextImpl::SocketImpl : public SSLServerSocket, static ssl_verify_result_t CertVerifyCallback(SSL* ssl, uint8_t* out_alert); ssl_verify_result_t CertVerifyCallbackImpl(uint8_t* out_alert); - static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod; - static ssl_private_key_result_t PrivateKeySignCallback(SSL* ssl, - uint8_t* out, - size_t* out_len, - size_t max_out, - uint16_t algorithm, - const uint8_t* in, - size_t in_len); - static ssl_private_key_result_t PrivateKeyDecryptCallback(SSL* ssl, - uint8_t* out, - size_t* out_len, - size_t max_out, - const uint8_t* in, - size_t in_len); - static ssl_private_key_result_t PrivateKeyCompleteCallback(SSL* ssl, - uint8_t* out, - size_t* out_len, - size_t max_out); - - ssl_private_key_result_t PrivateKeySignCallback( - uint16_t algorithm, - base::span input); - ssl_private_key_result_t PrivateKeyCompleteCallback(base::span buf, - size_t* out_len); - void OnPrivateKeyComplete(Error error, const std::vector& signature); - static int ALPNSelectCallback(SSL* ssl, const uint8_t** out, uint8_t* out_len, @@ -181,10 +136,6 @@ class SSLServerContextImpl::SocketImpl : public SSLServerSocket, CompletionOnceCallback user_read_callback_; CompletionOnceCallback user_write_callback_; - // SSLPrivateKey signature. - int signature_result_; - std::vector signature_; - // Used by Read function. scoped_refptr user_read_buf_; int user_read_buf_len_ = 0; @@ -217,9 +168,7 @@ class SSLServerContextImpl::SocketImpl : public SSLServerSocket, SSLServerContextImpl::SocketImpl::SocketImpl( SSLServerContextImpl* context, std::unique_ptr transport_socket) - : context_(context), - signature_result_(kSSLServerSocketNoPendingResult), - transport_socket_(std::move(transport_socket)) {} + : context_(context), transport_socket_(std::move(transport_socket)) {} SSLServerContextImpl::SocketImpl::~SocketImpl() { if (ssl_) { @@ -230,104 +179,6 @@ SSLServerContextImpl::SocketImpl::~SocketImpl() { } } -// static -const SSL_PRIVATE_KEY_METHOD - SSLServerContextImpl::SocketImpl::kPrivateKeyMethod = { - &SSLServerContextImpl::SocketImpl::PrivateKeySignCallback, - &SSLServerContextImpl::SocketImpl::PrivateKeyDecryptCallback, - &SSLServerContextImpl::SocketImpl::PrivateKeyCompleteCallback, -}; - -// static -ssl_private_key_result_t -SSLServerContextImpl::SocketImpl::PrivateKeySignCallback(SSL* ssl, - uint8_t* out, - size_t* out_len, - size_t max_out, - uint16_t algorithm, - const uint8_t* in, - size_t in_len) { - return FromSSL(ssl)->PrivateKeySignCallback( - algorithm, - // SAFETY: - // https://commondatastorage.googleapis.com/chromium-boringssl-docs/ssl.h.html#ssl_private_key_method_st - // `ssl_private_key_method_st::sign` implies that the value of `in_len` - // is equal to the actual size of `in`. - UNSAFE_BUFFERS(base::span(in, in_len))); -} - -// static -ssl_private_key_result_t -SSLServerContextImpl::SocketImpl::PrivateKeyDecryptCallback(SSL* ssl, - uint8_t* out, - size_t* out_len, - size_t max_out, - const uint8_t* in, - size_t in_len) { - // Decrypt is not supported. - return ssl_private_key_failure; -} - -// static -ssl_private_key_result_t -SSLServerContextImpl::SocketImpl::PrivateKeyCompleteCallback(SSL* ssl, - uint8_t* out, - size_t* out_len, - size_t max_out) { - return FromSSL(ssl)->PrivateKeyCompleteCallback( - // SAFETY: - // https://commondatastorage.googleapis.com/chromium-boringssl-docs/ssl.h.html#ssl_private_key_method_st - // The comment of `ssl_private_key_method_st::complete` indicates that - // `max_out` is the actual size of the buffer. - UNSAFE_BUFFERS(base::span(out, max_out)), out_len); -} - -ssl_private_key_result_t -SSLServerContextImpl::SocketImpl::PrivateKeySignCallback( - uint16_t algorithm, - base::span input) { - DCHECK(context_); - DCHECK(context_->private_key_); - signature_result_ = ERR_IO_PENDING; - context_->private_key_->Sign( - algorithm, input, - base::BindOnce(&SSLServerContextImpl::SocketImpl::OnPrivateKeyComplete, - weak_factory_.GetWeakPtr())); - return ssl_private_key_retry; -} - -ssl_private_key_result_t -SSLServerContextImpl::SocketImpl::PrivateKeyCompleteCallback( - base::span buf, - size_t* out_len) { - if (signature_result_ == ERR_IO_PENDING) - return ssl_private_key_retry; - if (signature_result_ != OK) { - OpenSSLPutNetError(FROM_HERE, signature_result_); - return ssl_private_key_failure; - } - if (signature_.size() > buf.size()) { - OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); - return ssl_private_key_failure; - } - buf.copy_prefix_from(signature_); - *out_len = signature_.size(); - signature_.clear(); - return ssl_private_key_success; -} - -void SSLServerContextImpl::SocketImpl::OnPrivateKeyComplete( - Error error, - const std::vector& signature) { - DCHECK_EQ(ERR_IO_PENDING, signature_result_); - DCHECK(signature_.empty()); - - signature_result_ = error; - if (signature_result_ == OK) - signature_ = signature; - OnHandshakeIOComplete(ERR_IO_PENDING); -} - // static int SSLServerContextImpl::SocketImpl::ALPNSelectCallback(SSL* ssl, const uint8_t** out, @@ -755,12 +606,6 @@ int SSLServerContextImpl::SocketImpl::DoHandshake() { } else { int ssl_error = SSL_get_error(ssl_.get(), rv); - if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) { - DCHECK(context_->private_key_); - GotoState(STATE_HANDSHAKE); - return ERR_IO_PENDING; - } - OpenSSLErrorInfo error_info; net_error = MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info); @@ -820,55 +665,28 @@ int SSLServerContextImpl::SocketImpl::Init() { SSL_set_shed_handshake_config(ssl_.get(), 1); - std::vector signing_algorithm_prefs; - if (context_->ssl_server_config_.signature_algorithm_for_testing - .has_value()) { - signing_algorithm_prefs.emplace_back( - *context_->ssl_server_config_.signature_algorithm_for_testing); - } else if (context_->private_key_) { - signing_algorithm_prefs = context_->private_key_->GetAlgorithmPreferences(); - } + for (const SSLServerCredential& credential : context_->credentials_) { + std::vector signing_algorithm_prefs; + if (credential.signature_algorithm_for_testing.has_value()) { + signing_algorithm_prefs.emplace_back( + *credential.signature_algorithm_for_testing); + } + std::vector chain_raw = + GetCertChainRawVector(credential.cert_chain); + ConfigureSSLCredentialParams params{ + .cert_chain = chain_raw, + .private_key = credential.pkey.get(), + .signing_algorithm_prefs = signing_algorithm_prefs, + .ocsp_response = credential.ocsp_response, + .signed_cert_timestamp_list = credential.signed_cert_timestamp_list, + .trust_anchor_id = credential.trust_anchor_id, + }; - ConfigureSSLCredentialParams params{ - .private_key = context_->pkey_ - ? ConfigureSSLCredentialParams::PrivateKeyVariant( - context_->pkey_.get()) - : ConfigureSSLCredentialParams::PrivateKeyVariant( - &kPrivateKeyMethod), - .signing_algorithm_prefs = signing_algorithm_prefs, - .ocsp_response = context_->ssl_server_config_.ocsp_response, - .signed_cert_timestamp_list = - context_->ssl_server_config_.signed_cert_timestamp_list, - }; - - // If a Trust Anchor ID for the intermediate certificate was provided, - // configure an alternative, shorter chain that omits the intermediate. - if (!context_->ssl_server_config_.intermediate_trust_anchor_id.empty()) { - // The current Trust Anchor IDs API only allows configuring a Trust Anchor - // ID for a single intermediate certificate. - DCHECK_EQ(context_->cert_chain_.size(), 2u); - - std::vector elided_chain = {context_->cert_chain_[0].get()}; - - ConfigureSSLCredentialParams params_with_trust_anchor_id = params; - params_with_trust_anchor_id.cert_chain = elided_chain; - params_with_trust_anchor_id.trust_anchor_id = - context_->ssl_server_config_.intermediate_trust_anchor_id; - - if (!ConfigureSSLCredential(ssl_.get(), params_with_trust_anchor_id)) { + if (!ConfigureSSLCredential(ssl_.get(), params)) { return ERR_UNEXPECTED; } } - // Set the full (un-elided) certificate chain and private key. - std::vector chain_raw = - GetCertChainRawVector(context_->cert_chain_); - params.cert_chain = chain_raw; - - if (!ConfigureSSLCredential(ssl_.get(), params)) { - return ERR_UNEXPECTED; - } - const std::vector& curves = context_->ssl_server_config_.curves_for_testing; if (!curves.empty()) { @@ -936,65 +754,28 @@ std::unique_ptr CreateSSLServerContext( X509Certificate* certificate, EVP_PKEY* pkey, const SSLServerConfig& ssl_server_config) { - return std::make_unique(certificate, pkey, + SSLServerCredential credential; + credential.cert_chain = certificate->CopyCertBuffers(); + credential.pkey = bssl::UpRef(pkey); + std::vector credentials; + credentials.push_back(std::move(credential)); + return std::make_unique(std::move(credentials), ssl_server_config); } -std::unique_ptr CreateSSLServerContext( - base::span> cert_chain, - EVP_PKEY* pkey, - const SSLServerConfig& ssl_server_config) { - std::vector> copied_cert_chain; - copied_cert_chain.reserve(cert_chain.size()); - for (const auto& handle : cert_chain) { - copied_cert_chain.push_back(bssl::UpRef(handle.get())); - } - return std::make_unique(std::move(copied_cert_chain), - pkey, ssl_server_config); -} - -std::unique_ptr CreateSSLServerContext( - X509Certificate* certificate, - const crypto::RSAPrivateKey& key, - const SSLServerConfig& ssl_server_config) { - return std::make_unique(certificate, key.key(), - ssl_server_config); -} - -std::unique_ptr CreateSSLServerContext( - X509Certificate* certificate, - scoped_refptr key, +NET_EXPORT std::unique_ptr CreateSSLServerContext( + std::vector credentials, const SSLServerConfig& ssl_config) { - return std::make_unique(certificate, key, ssl_config); + return std::make_unique(std::move(credentials), + ssl_config); } SSLServerContextImpl::SSLServerContextImpl( - X509Certificate* certificate, - scoped_refptr key, + std::vector credentials, const SSLServerConfig& ssl_server_config) : ssl_server_config_(ssl_server_config), - cert_chain_(ChainFromX509Certificate(certificate)), - private_key_(key) { - CHECK(private_key_); - Init(); -} - -SSLServerContextImpl::SSLServerContextImpl( - X509Certificate* certificate, - EVP_PKEY* pkey, - const SSLServerConfig& ssl_server_config) - : SSLServerContextImpl(ChainFromX509Certificate(certificate), - pkey, - ssl_server_config) {} - -SSLServerContextImpl::SSLServerContextImpl( - std::vector> cert_chain, - EVP_PKEY* pkey, - const SSLServerConfig& ssl_server_config) - : ssl_server_config_(ssl_server_config), - cert_chain_(std::move(cert_chain)) { - CHECK(pkey); - pkey_ = bssl::UpRef(pkey); + credentials_(std::move(credentials)) { + CHECK(!credentials_.empty()); Init(); } @@ -1031,22 +812,6 @@ void SSLServerContextImpl::Init() { CHECK(SSL_CTX_set_max_proto_version(ssl_ctx_.get(), ssl_server_config_.version_max)); - // OpenSSL defaults some options to on, others to off. To avoid ambiguity, - // set everything we care about to an absolute value. - SslSetClearMask options; - options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true); - - SSL_CTX_set_options(ssl_ctx_.get(), options.set_mask); - SSL_CTX_clear_options(ssl_ctx_.get(), options.clear_mask); - - // Same as above, this time for the SSL mode. - SslSetClearMask mode; - - mode.ConfigureFlag(SSL_MODE_RELEASE_BUFFERS, true); - - SSL_CTX_set_mode(ssl_ctx_.get(), mode.set_mask); - SSL_CTX_clear_mode(ssl_ctx_.get(), mode.clear_mask); - if (ssl_server_config_.cipher_suite_for_testing.has_value()) { const SSL_CIPHER* cipher = SSL_get_cipher_by_value(*ssl_server_config_.cipher_suite_for_testing); @@ -1058,9 +823,9 @@ void SSLServerContextImpl::Init() { // These are the remaining CBC-mode ECDSA ciphers. std::string command("ALL:!aPSK:!ECDSA+SHA1:!3DES"); - // SSLPrivateKey only supports ECDHE-based ciphers because it lacks decrypt. - if (ssl_server_config_.require_ecdhe || (!pkey_ && private_key_)) + if (ssl_server_config_.require_ecdhe) { command.append(":!kRSA"); + } // Remove any disabled ciphers. for (uint16_t id : ssl_server_config_.disabled_cipher_suites) { @@ -1097,18 +862,6 @@ void SSLServerContextImpl::Init() { SSL_CTX_set_alpn_select_cb(ssl_ctx_.get(), &SocketImpl::ALPNSelectCallback, nullptr); - if (!ssl_server_config_.ocsp_response.empty()) { - SSL_CTX_set_ocsp_response(ssl_ctx_.get(), - ssl_server_config_.ocsp_response.data(), - ssl_server_config_.ocsp_response.size()); - } - - if (!ssl_server_config_.signed_cert_timestamp_list.empty()) { - SSL_CTX_set_signed_cert_timestamp_list( - ssl_ctx_.get(), ssl_server_config_.signed_cert_timestamp_list.data(), - ssl_server_config_.signed_cert_timestamp_list.size()); - } - if (ssl_server_config_.ech_keys) { CHECK(SSL_CTX_set1_ech_keys(ssl_ctx_.get(), ssl_server_config_.ech_keys.get())); diff --git a/naiveproxy/src/net/socket/ssl_server_socket_impl.h b/naiveproxy/src/net/socket/ssl_server_socket_impl.h index c7c3c96533..2e1dd66927 100644 --- a/naiveproxy/src/net/socket/ssl_server_socket_impl.h +++ b/naiveproxy/src/net/socket/ssl_server_socket_impl.h @@ -8,6 +8,7 @@ #include #include +#include #include "net/base/io_buffer.h" #include "net/socket/ssl_server_socket.h" @@ -18,14 +19,7 @@ namespace net { class SSLServerContextImpl : public SSLServerContext { public: - SSLServerContextImpl(std::vector> cert_chain, - EVP_PKEY* pkey, - const SSLServerConfig& ssl_server_config); - SSLServerContextImpl(X509Certificate* certificate, - EVP_PKEY* pkey, - const SSLServerConfig& ssl_server_config); - SSLServerContextImpl(X509Certificate* certificate, - scoped_refptr key, + SSLServerContextImpl(std::vector credentials, const SSLServerConfig& ssl_server_config); ~SSLServerContextImpl() override; @@ -42,13 +36,8 @@ class SSLServerContextImpl : public SSLServerContext { // Options for the SSL socket. SSLServerConfig ssl_server_config_; - // Certificate chain for the server. - std::vector> cert_chain_; - - // Private key used by the server. - // Only one representation should be set at any time. - bssl::UniquePtr pkey_; - const scoped_refptr private_key_; + // Credentials for the server, in order from highest to lowest priority. + std::vector credentials_; }; } // namespace net diff --git a/naiveproxy/src/net/socket/stream_socket_close_reason.h b/naiveproxy/src/net/socket/stream_socket_close_reason.h index 58b90cba33..43c14d37af 100644 --- a/naiveproxy/src/net/socket/stream_socket_close_reason.h +++ b/naiveproxy/src/net/socket/stream_socket_close_reason.h @@ -28,7 +28,7 @@ enum class StreamSocketCloseReason { kAttemptManagerDraining = 10, kMaxValue = kAttemptManagerDraining, }; -// LINT.ThenChange(//tools/metrics/histograms/metadata/net/enums.xml:StreamSocketCloseReason) +// LINT.ThenChange(//tools/metrics/histograms/metadata/net/enums.xml:StreamSocketCloseReason,tools/metrics/histograms/metadata/net/histograms.xml:StreamSocketCloseReason) std::string_view StreamSocketCloseReasonToString( StreamSocketCloseReason reason); diff --git a/naiveproxy/src/net/socket/tcp_socket_posix.cc b/naiveproxy/src/net/socket/tcp_socket_posix.cc index 28147c2633..d7a1dcefd2 100644 --- a/naiveproxy/src/net/socket/tcp_socket_posix.cc +++ b/naiveproxy/src/net/socket/tcp_socket_posix.cc @@ -11,7 +11,6 @@ #include #include -#include "base/atomicops.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/functional/bind.h" diff --git a/naiveproxy/src/net/socket/tcp_socket_win.h b/naiveproxy/src/net/socket/tcp_socket_win.h index 1ab0c5d1a9..12497e802d 100644 --- a/naiveproxy/src/net/socket/tcp_socket_win.h +++ b/naiveproxy/src/net/socket/tcp_socket_win.h @@ -13,6 +13,7 @@ #include "base/check_deref.h" #include "base/memory/raw_ptr.h" +#include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" #include "base/threading/thread_checker.h" #include "base/win/object_watcher.h" @@ -59,14 +60,14 @@ class NET_EXPORT TCPSocketWin : public base::win::ObjectWatcher::Delegate { // Takes ownership of `socket`, which is known to already be connected to the // given peer address. However, peer address may be the empty address, for // compatibility. The given peer address will be returned by GetPeerAddress. - // `socket` must support overlapped I/O operations operations. + // `socket` must support overlapped I/O operations. int AdoptConnectedSocket(SocketDescriptor socket, const IPEndPoint& peer_address); // Takes ownership of |socket|, which may or may not be open, bound, or // listening. The caller must determine the state of the socket based on its // provenance and act accordingly. The socket may have connections waiting to // be accepted, but must not be actually connected. `socket` must support - // overlapped I/O operations operations. + // overlapped I/O operations. int AdoptUnconnectedSocket(SocketDescriptor socket); int Bind(const IPEndPoint& address); diff --git a/naiveproxy/src/net/socket/tls_stream_attempt.cc b/naiveproxy/src/net/socket/tls_stream_attempt.cc index b7aab6c1a0..946267529b 100644 --- a/naiveproxy/src/net/socket/tls_stream_attempt.cc +++ b/naiveproxy/src/net/socket/tls_stream_attempt.cc @@ -15,6 +15,7 @@ #include "net/base/features.h" #include "net/base/host_port_pair.h" #include "net/base/net_errors.h" +#include "net/dns/public/host_resolver_results.h" #include "net/socket/client_socket_factory.h" #include "net/socket/tcp_stream_attempt.h" #include "net/ssl/ssl_cert_request_info.h" @@ -41,6 +42,7 @@ TlsStreamAttempt::TlsStreamAttempt(const StreamAttemptParams* params, IPEndPoint ip_endpoint, perfetto::Track track, HostPortPair host_port_pair, + SSLConfig base_ssl_config, Delegate* delegate) : StreamAttempt(params, ip_endpoint, @@ -48,7 +50,12 @@ TlsStreamAttempt::TlsStreamAttempt(const StreamAttemptParams* params, NetLogSourceType::TLS_STREAM_ATTEMPT, NetLogEventType::TLS_STREAM_ATTEMPT_ALIVE), host_port_pair_(std::move(host_port_pair)), - delegate_(delegate) {} + base_ssl_config_(std::move(base_ssl_config)), + delegate_(delegate) { + // ECH and trust anchor IDs are configured via DNS after GetServiceEndpoint(). + DCHECK(base_ssl_config_.ech_config_list.empty()); + DCHECK(!base_ssl_config_.trust_anchor_ids.has_value()); +} TlsStreamAttempt::~TlsStreamAttempt() { MaybeRecordTlsHandshakeEnd(ERR_ABORTED); @@ -151,7 +158,8 @@ int TlsStreamAttempt::DoTcpAttemptComplete(int rv) { return rv; } - net_log().BeginEvent(NetLogEventType::TLS_STREAM_ATTEMPT_WAIT_FOR_SSL_CONFIG); + net_log().BeginEvent( + NetLogEventType::TLS_STREAM_ATTEMPT_WAIT_FOR_SERVICE_ENDPOINT); next_state_ = State::kTlsAttempt; @@ -161,41 +169,47 @@ int TlsStreamAttempt::DoTcpAttemptComplete(int rv) { return OK; } - int ssl_config_ready_result = delegate_->WaitForSSLConfigReady(base::BindOnce( + int wait_result = delegate_->WaitForServiceEndpointReady(base::BindOnce( &TlsStreamAttempt::OnIOComplete, weak_ptr_factory_.GetWeakPtr())); - if (ssl_config_ready_result == ERR_IO_PENDING) { - TRACE_EVENT_INSTANT("net.stream", "WaitForSSLConfig", track()); + if (wait_result == ERR_IO_PENDING) { + TRACE_EVENT_INSTANT("net.stream", "WaitForServiceEndpointReady", track()); } - return ssl_config_ready_result; + return wait_result; } int TlsStreamAttempt::DoTlsAttempt(int rv) { CHECK_EQ(rv, OK); - net_log().EndEvent(NetLogEventType::TLS_STREAM_ATTEMPT_WAIT_FOR_SSL_CONFIG); + net_log().EndEvent( + NetLogEventType::TLS_STREAM_ATTEMPT_WAIT_FOR_SERVICE_ENDPOINT); next_state_ = State::kTlsAttemptComplete; std::unique_ptr nested_socket = nested_attempt_->ReleaseStreamSocket(); if (!ssl_config_) { - auto get_config_result = delegate_->GetSSLConfig(); - - if (get_config_result.has_value()) { - ssl_config_ = *get_config_result; - // For metrics, we want to know whether the server advertised Trust Anchor - // IDs in DNS (i.e., whether the client could use Trust Anchor IDs with - // this server, regardless of whether the feature was enabled). But we - // don't want to actually configure the Trust Anchor IDs on the connection - // if the feature flag isn't enabled. - trust_anchor_ids_from_dns_ = !ssl_config_->trust_anchor_ids.empty(); - if (!base::FeatureList::IsEnabled(features::kTLSTrustAnchorIDs)) { - ssl_config_->trust_anchor_ids.clear(); - } - } else { - CHECK_EQ(get_config_result.error(), GetSSLConfigError::kAbort); + auto endpoint = delegate_->GetServiceEndpoint(); + if (!endpoint.has_value()) { + CHECK_EQ(endpoint.error(), GetServiceEndpointError::kAbort); return ERR_ABORTED; } + + is_ech_capable_ = !endpoint->metadata.ech_config_list.empty(); + trust_anchor_ids_from_dns_ = !endpoint->metadata.trust_anchor_ids.empty(); + + // Configure ServiceEndpoint-specific TLS settings. + const SSLContextConfig& ssl_context_config = + params().ssl_client_context->config(); + ssl_config_ = base_ssl_config_; + if (!ssl_context_config.trust_anchor_ids.empty() && + base::FeatureList::IsEnabled(features::kTLSTrustAnchorIDs)) { + ssl_config_->trust_anchor_ids = + SSLConfig::SelectTrustAnchorIDs(endpoint->metadata.trust_anchor_ids, + ssl_context_config.trust_anchor_ids); + } + if (ssl_context_config.ech_enabled) { + ssl_config_->ech_config_list = endpoint->metadata.ech_config_list; + } } nested_attempt_.reset(); @@ -281,10 +295,8 @@ int TlsStreamAttempt::DoTlsAttemptComplete(int rv) { } } - const bool is_ech_capable = - ssl_config_ && !ssl_config_->ech_config_list.empty(); SSLClientSocket::RecordSSLConnectResult( - ssl_socket_.get(), rv, is_ech_capable, ech_enabled, ech_retry_configs_, + ssl_socket_.get(), rv, is_ech_capable_, ech_enabled, ech_retry_configs_, trust_anchor_ids_from_dns_, retried_for_trust_anchor_ids_, connect_timing()); diff --git a/naiveproxy/src/net/socket/tls_stream_attempt.h b/naiveproxy/src/net/socket/tls_stream_attempt.h index 286591b6e8..d6a7773aca 100644 --- a/naiveproxy/src/net/socket/tls_stream_attempt.h +++ b/naiveproxy/src/net/socket/tls_stream_attempt.h @@ -26,8 +26,9 @@ namespace net { -class TcpStreamAttempt; +struct ServiceEndpoint; class SSLClientSocket; +class TcpStreamAttempt; // Represents a single TLS connection attempt. class NET_EXPORT_PRIVATE TlsStreamAttempt final : public StreamAttempt { @@ -36,7 +37,7 @@ class NET_EXPORT_PRIVATE TlsStreamAttempt final : public StreamAttempt { static constexpr base::TimeDelta kTlsHandshakeTimeout = base::Seconds(30); // Represents an error of getting a SSLConfig for an attempt. - enum class GetSSLConfigError { + enum class GetServiceEndpointError { // The attempt should abort. Currently this happens when we start an attempt // without waiting for HTTPS RR and the DNS resolution resulted in making // the attempt SVCB-reliant. @@ -55,21 +56,27 @@ class NET_EXPORT_PRIVATE TlsStreamAttempt final : public StreamAttempt { // Called when TCP handshake completes. virtual void OnTcpHandshakeComplete() = 0; - // Returns OK when a SSLConfig is immediately available. `callback` is never - // invoked. Otherwise, returns ERR_IO_PENDING when `this` can't provide a - // SSLConfig immediately. `callback` is invoked when a SSLConfig is ready. - virtual int WaitForSSLConfigReady(CompletionOnceCallback callback) = 0; + // Returns `OK` and ignores `callback` when a ServiceEndpoint is immediately + // available. Otherwise, returns `ERR_IO_PENDING` when `this` can't provide + // a ServiceEndpoint immediately. `callback` is invoked when a SSLConfig is + // ready. + virtual int WaitForServiceEndpointReady( + CompletionOnceCallback callback) = 0; - // Returns a SSLConfig. Should be called only after WaitForSSLConfigReady() - // returns OK or the callback is invoked. - virtual base::expected GetSSLConfig() = 0; + // Returns a ServiceEndpoint. Should be called only after + // WaitForServiceEndpointReady() returns `OK` or the callback is invoked. + virtual base::expected + GetServiceEndpoint() = 0; }; - // `params` and `ssl_config_provider` must outlive `this`. + // `params` must outlive `this`. `base_ssl_config` contains the base SSL + // configuration. Some additional configuration (things that depend on + // ServiceEndpoint) is applied within TlsStreamAttempt. TlsStreamAttempt(const StreamAttemptParams* params, IPEndPoint ip_endpoint, perfetto::Track track, HostPortPair host_port_pair, + SSLConfig base_ssl_config, Delegate* delegate); TlsStreamAttempt(const TlsStreamAttempt&) = delete; @@ -117,6 +124,7 @@ class NET_EXPORT_PRIVATE TlsStreamAttempt final : public StreamAttempt { State next_state_ = State::kNone; const HostPortPair host_port_pair_; + const SSLConfig base_ssl_config_; const raw_ptr delegate_; std::unique_ptr nested_attempt_; @@ -134,8 +142,10 @@ class NET_EXPORT_PRIVATE TlsStreamAttempt final : public StreamAttempt { // only retry once per connection attempt. bool retried_for_trust_anchor_ids_ = false; // Used for metrics. Set to true when the initial connection attempt used a - // DNS endpoint that advertised TLS Trust Anchor IDs. + // service endpoint that advertised trust anchor IDs and ECH, respectively, + // whether or not sufficient features were enabled to use them. bool trust_anchor_ids_from_dns_ = false; + bool is_ech_capable_ = false; base::WeakPtrFactory weak_ptr_factory_{this}; }; diff --git a/naiveproxy/src/net/socket/transport_client_socket_pool.cc b/naiveproxy/src/net/socket/transport_client_socket_pool.cc index 1653381ae5..28e440d478 100644 --- a/naiveproxy/src/net/socket/transport_client_socket_pool.cc +++ b/naiveproxy/src/net/socket/transport_client_socket_pool.cc @@ -25,6 +25,7 @@ #include "base/task/single_thread_task_runner.h" #include "base/time/time.h" #include "base/values.h" +#include "net/base/features.h" #include "net/base/host_port_pair.h" #include "net/base/net_errors.h" #include "net/base/proxy_chain.h" @@ -956,7 +957,7 @@ void TransportClientSocketPool::CleanupIdleSocketsInGroup( reason_for_closing_socket = kIdleTimeLimitExpired; } - // Usability errors take precedence over over other errors. + // Usability errors take precedence over other errors. if (!idle_socket_it->IsUsable(&reason_for_closing_socket)) should_clean_up = true; @@ -1135,8 +1136,17 @@ bool TransportClientSocketPool::FindTopStalledGroup(Group** group, return has_stalled_group; } -void TransportClientSocketPool::OnIPAddressChanged() { +void TransportClientSocketPool::OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) { DCHECK(cleanup_on_ip_address_change_); + + // Ignore changes to randomly generated IPv6 temporary addresses. + if (base::FeatureList::IsEnabled( + net::features::kMaintainConnectionsOnIpv6TempAddrChange) && + change_type == NetworkChangeNotifier::IP_ADDRESS_CHANGE_IPV6_TEMPADDR) { + return; + } + FlushWithError(ERR_NETWORK_CHANGED, kNetworkChanged); } diff --git a/naiveproxy/src/net/socket/transport_client_socket_pool.h b/naiveproxy/src/net/socket/transport_client_socket_pool.h index 6d087edc87..d5db66531b 100644 --- a/naiveproxy/src/net/socket/transport_client_socket_pool.h +++ b/naiveproxy/src/net/socket/transport_client_socket_pool.h @@ -18,6 +18,7 @@ #include #include "base/memory/raw_ptr.h" +#include "base/memory/safety_checks.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" @@ -87,6 +88,9 @@ class NET_EXPORT_PRIVATE TransportClientSocketPool }; class NET_EXPORT_PRIVATE Request { + // TODO(crbug.com/422046500): Remove this macro once the bug gets fixed. + ADVANCED_MEMORY_SAFETY_CHECKS(); + public: // If |proxy_auth_callback| is null, proxy auth challenges will // result in an error. @@ -267,7 +271,8 @@ class NET_EXPORT_PRIVATE TransportClientSocketPool static bool set_connect_backup_jobs_enabled(bool enabled); // NetworkChangeNotifier::IPAddressObserver methods: - void OnIPAddressChanged() override; + void OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) override; // SSLClientContext::Observer methods. void OnSSLConfigChanged( diff --git a/naiveproxy/src/net/socket/udp_socket_global_limits.cc b/naiveproxy/src/net/socket/udp_socket_global_limits.cc index 4039c8d452..31749d39b7 100644 --- a/naiveproxy/src/net/socket/udp_socket_global_limits.cc +++ b/naiveproxy/src/net/socket/udp_socket_global_limits.cc @@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "net/socket/udp_socket_global_limits.h" + #include #include "base/atomic_ref_count.h" #include "base/no_destructor.h" -#include "net/base/features.h" -#include "net/socket/udp_socket_global_limits.h" namespace net { @@ -26,8 +26,8 @@ class GlobalUDPSocketCounts { } [[nodiscard]] bool TryAcquireSocket() { - int previous = count_.Increment(1); - if (previous >= GetMax()) { + size_t previous = count_.Increment(1); + if (previous >= OwnedUDPSocketCount::kMaxUdpSockets) { count_.Increment(-1); return false; } @@ -35,13 +35,6 @@ class GlobalUDPSocketCounts { return true; } - int GetMax() { - if (base::FeatureList::IsEnabled(features::kLimitOpenUDPSockets)) - return features::kLimitOpenUDPSocketsMax.Get(); - - return std::numeric_limits::max(); - } - void ReleaseSocket() { count_.Increment(-1); } int GetCountForTesting() { return count_.SubtleRefCountForDebug(); } @@ -52,7 +45,7 @@ class GlobalUDPSocketCounts { } // namespace -OwnedUDPSocketCount::OwnedUDPSocketCount() : OwnedUDPSocketCount(true) {} +OwnedUDPSocketCount::OwnedUDPSocketCount() {} OwnedUDPSocketCount::OwnedUDPSocketCount(OwnedUDPSocketCount&& other) { *this = std::move(other); diff --git a/naiveproxy/src/net/socket/udp_socket_global_limits.h b/naiveproxy/src/net/socket/udp_socket_global_limits.h index d28bf565a8..ad59d0b894 100644 --- a/naiveproxy/src/net/socket/udp_socket_global_limits.h +++ b/naiveproxy/src/net/socket/udp_socket_global_limits.h @@ -18,6 +18,8 @@ namespace net { // returned to the global counter. class NET_EXPORT OwnedUDPSocketCount { public: + static constexpr int kMaxUdpSockets = 6000; + // The default constructor builds an empty OwnedUDPSocketCount (does not own a // count). OwnedUDPSocketCount(); @@ -48,7 +50,7 @@ class NET_EXPORT OwnedUDPSocketCount { friend NET_EXPORT OwnedUDPSocketCount TryAcquireGlobalUDPSocketCount(); explicit OwnedUDPSocketCount(bool empty); - bool empty_; + bool empty_ = true; }; // Attempts to increase the global "open UDP socket" [1] count. diff --git a/naiveproxy/src/net/socket/udp_socket_posix.cc b/naiveproxy/src/net/socket/udp_socket_posix.cc index d2e57d6365..fc9041dc55 100644 --- a/naiveproxy/src/net/socket/udp_socket_posix.cc +++ b/naiveproxy/src/net/socket/udp_socket_posix.cc @@ -25,6 +25,8 @@ #include #include "base/debug/alias.h" +#include "base/debug/crash_logging.h" +#include "base/debug/dump_without_crashing.h" #include "base/files/file_util.h" #include "base/functional/bind.h" #include "base/functional/callback.h" @@ -61,6 +63,7 @@ #if BUILDFLAG(IS_APPLE) #include "net/base/apple/guarded_fd.h" +#include "net/socket/socket_apple.h" #endif // BUILDFLAG(IS_APPLE) #if BUILDFLAG(IS_MAC) @@ -152,7 +155,9 @@ int UDPSocketPosix::AdoptOpenedSocket(AddressFamily address_family, int UDPSocketPosix::ConfigureOpenedSocket() { #if BUILDFLAG(IS_APPLE) && !BUILDFLAG(CRONET_BUILD) && !BUILDFLAG(IS_IOS_TVOS) // https://crbug.com/41271555: Guard against a file descriptor being closed - // out from underneath the socket. + // out from underneath the socket. The change_fdguard_np() and related APIs + // are undocumented, except for comments in the Darwin kernel source code: + // http://fxr.watson.org/fxr/source/bsd/kern/kern_guarded.c?v=xnu-8792;im=10#L451 guardid_t guardid = reinterpret_cast(this); PCHECK(change_fdguard_np(socket_, nullptr, 0, &guardid, GUARD_CLOSE | GUARD_DUP, nullptr) == 0); @@ -208,6 +213,8 @@ void UDPSocketPosix::Close() { // https://crbug.com/41271555: Guard against a file descriptor being closed // out from underneath the socket. guardid_t guardid = reinterpret_cast(this); + // See the comment in ConfigureOpenedSocket(), above, for information about + // guarded_close_np(). if (IGNORE_EINTR(guarded_close_np(socket_, &guardid)) != 0) { // There is a bug in the Mac OS kernel that it can return an ENOTCONN or // EPROTOTYPE error. In this case we don't know whether the file descriptor @@ -215,7 +222,26 @@ void UDPSocketPosix::Close() { // because it may have been reused by another thread in the meantime. We may // leak file handles here and cause a crash indirectly later. See // https://crbug.com/40732798. - PCHECK(errno == ENOTCONN || errno == EPROTOTYPE); + + // Temporary workaround to investigate EINVAL return values. + // TODO(https://crbug.com/437414746): Remove this or update it once we have + // information. + if (errno == EINVAL) { + int fdflags = 0; + // This call should be a successful no-op. If it fails, we know the state + // of the filehandle is not what we're expecting. + const int retval = HANDLE_EINTR( + change_fdguard_np(socket_, &guardid, GUARD_CLOSE | GUARD_DUP, + &guardid, GUARD_CLOSE | GUARD_DUP, &fdflags)); + SCOPED_CRASH_KEY_NUMBER("UdpSocketPosix", "change_fdguard_retval", + retval); + SCOPED_CRASH_KEY_NUMBER("UdpSocketPosix", "change_fdguard_errno", errno); + SCOPED_CRASH_KEY_NUMBER("UdpSocketPosix", "change_fdguard_fdflags", + fdflags); + base::debug::DumpWithoutCrashing(); + } else if (errno != ENOTCONN && errno != EPROTOTYPE) { + PLOG(FATAL) << "Unexpected errno from guarded_close_np"; + } } #else PCHECK(IGNORE_EINTR(close(socket_)) == 0); @@ -815,12 +841,26 @@ int UDPSocketPosix::InternalSendTo(IOBuffer* buf, } } - int result = HANDLE_EINTR(sendto(socket_, buf->data(), buf_len, sendto_flags_, - addr, storage.addr_len)); - if (result < 0) +#if !defined(WORK_AROUND_CRBUG_40064248) + ssize_t result = HANDLE_EINTR(sendto(socket_, buf->data(), buf_len, + sendto_flags_, addr, storage.addr_len)); +#else // !WORK_AROUND_CRBUG_40064248 + ssize_t result = HANDLE_EINTR(SendtoAndDetectBogusReturnValue( + socket_, buf->data(), buf_len, sendto_flags_, addr, storage.addr_len)); + if (result == kSendBogusReturnValueDetected) { + // https://crbug.com/40064248 is known to occur as a result of certain + // network configuration changes. + result = ERR_NETWORK_CHANGED; + } else +#endif // !WORK_AROUND_CRBUG_40064248 + if (result < 0) { result = MapSystemError(errno); - if (result != ERR_IO_PENDING) + } else { + CHECK_LE(result, buf_len); + } + if (result != ERR_IO_PENDING) { LogWrite(result, buf->data(), address); + } return result; } diff --git a/naiveproxy/src/net/spdy/spdy_http_utils.cc b/naiveproxy/src/net/spdy/spdy_http_utils.cc index 989d4cfee8..e72e2cfc04 100644 --- a/naiveproxy/src/net/spdy/spdy_http_utils.cc +++ b/naiveproxy/src/net/spdy/spdy_http_utils.cc @@ -205,7 +205,7 @@ void CreateSpdyHeadersFromHttpRequest(const HttpRequestInfo& info, } else { headers->insert( {spdy::kHttp2AuthorityHeader, GetHostAndOptionalPort(info.url)}); - headers->insert({spdy::kHttp2SchemeHeader, info.url.scheme()}); + headers->insert({spdy::kHttp2SchemeHeader, info.url.GetScheme()}); headers->insert({spdy::kHttp2PathHeader, info.url.PathForRequest()}); } @@ -246,7 +246,7 @@ void CreateSpdyHeadersFromHttpRequestForExtendedConnect( // Extended CONNECT, unlike CONNECT, requires scheme and path, and uses the // default port in the authority header. - headers->insert({spdy::kHttp2SchemeHeader, info.url.scheme()}); + headers->insert({spdy::kHttp2SchemeHeader, info.url.GetScheme()}); headers->insert({spdy::kHttp2PathHeader, info.url.PathForRequest()}); headers->insert({spdy::kHttp2ProtocolHeader, ext_connect_protocol}); diff --git a/naiveproxy/src/net/spdy/spdy_http_utils.h b/naiveproxy/src/net/spdy/spdy_http_utils.h index 3c78ceab91..e6f829bc5a 100644 --- a/naiveproxy/src/net/spdy/spdy_http_utils.h +++ b/naiveproxy/src/net/spdy/spdy_http_utils.h @@ -7,7 +7,7 @@ #include -#include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" #include "base/types/expected.h" #include "net/base/net_export.h" #include "net/base/request_priority.h" diff --git a/naiveproxy/src/net/spdy/spdy_proxy_client_socket.cc b/naiveproxy/src/net/spdy/spdy_proxy_client_socket.cc index 44df2a258e..d34f2146bb 100644 --- a/naiveproxy/src/net/spdy/spdy_proxy_client_socket.cc +++ b/naiveproxy/src/net/spdy/spdy_proxy_client_socket.cc @@ -15,9 +15,13 @@ #include "base/notreached.h" #include "base/strings/string_util.h" #include "base/task/single_thread_task_runner.h" +#include "base/types/expected.h" +#include "base/types/expected_macros.h" #include "base/values.h" #include "net/base/auth.h" +#include "net/base/completion_once_callback.h" #include "net/base/io_buffer.h" +#include "net/base/net_errors.h" #include "net/base/proxy_chain.h" #include "net/base/proxy_delegate.h" #include "net/http/http_auth_cache.h" @@ -300,6 +304,22 @@ void SpdyProxyClientSocket::OnIOComplete(int result) { } } +void SpdyProxyClientSocket::OnBeforeTunnelRequestComplete( + base::expected result) { + if (result.has_value()) { + proxy_delegate_headers_ = std::move(result.value()); + OnIOComplete(OK); + } else { + // OnBeforeTunnelRequestComplete should never report ERR_IO_PENDING since + // it's used to signal that IO has completed. + CHECK_NE(ERR_IO_PENDING, result.error()); + // Success should always be reported via a base::expected containing an + // HttpRequestHeaders, see ProxyDelegate::OnBeforeTunnelRequest. + CHECK_NE(OK, result.error()); + OnIOComplete(result.error()); + } +} + int SpdyProxyClientSocket::DoLoop(int last_io_result) { DCHECK_NE(next_state_, STATE_DISCONNECTED); int rv = last_io_result; @@ -314,6 +334,13 @@ int SpdyProxyClientSocket::DoLoop(int last_io_result) { case STATE_GENERATE_AUTH_TOKEN_COMPLETE: rv = DoGenerateAuthTokenComplete(rv); break; + case STATE_CALCULATE_HEADERS: + DCHECK_EQ(OK, rv); + rv = DoCalculateHeaders(); + break; + case STATE_CALCULATE_HEADERS_COMPLETE: + rv = DoCalculateHeadersComplete(rv); + break; case STATE_SEND_REQUEST: DCHECK_EQ(OK, rv); net_log_.BeginEvent( @@ -350,6 +377,17 @@ int SpdyProxyClientSocket::DoLoop(int last_io_result) { } } break; + case STATE_PROCESS_RESPONSE_HEADERS: + DCHECK_EQ(OK, rv); + rv = DoProcessResponseHeaders(); + break; + case STATE_PROCESS_RESPONSE_HEADERS_COMPLETE: + rv = DoProcessResponseHeadersComplete(rv); + break; + case STATE_PROCESS_RESPONSE_CODE: + DCHECK_EQ(OK, rv); + rv = DoProcessResponseCode(); + break; default: NOTREACHED() << "bad state"; } @@ -369,36 +407,60 @@ int SpdyProxyClientSocket::DoGenerateAuthToken() { int SpdyProxyClientSocket::DoGenerateAuthTokenComplete(int result) { DCHECK_NE(ERR_IO_PENDING, result); - if (result == OK) - next_state_ = STATE_SEND_REQUEST; + if (result == OK) { + next_state_ = STATE_CALCULATE_HEADERS; + } + return result; +} + +int SpdyProxyClientSocket::DoCalculateHeaders() { + next_state_ = STATE_CALCULATE_HEADERS_COMPLETE; + + authorization_headers_.Clear(); + proxy_delegate_headers_.Clear(); + + // Add Proxy-Authentication header if necessary. + if (auth_->HaveAuth()) { + auth_->AddAuthorizationHeader(&authorization_headers_); + } + + if (proxy_delegate_) { + ASSIGN_OR_RETURN( + proxy_delegate_headers_, + proxy_delegate_->OnBeforeTunnelRequest( + proxy_chain_, proxy_chain_index_, + base::BindOnce( + &SpdyProxyClientSocket::OnBeforeTunnelRequestComplete, + weak_factory_.GetWeakPtr())), + [](const auto& e) { + // Success should always be reported via a base::expected containing + // an HttpRequestHeaders, see ProxyDelegate::OnBeforeTunnelRequest. + CHECK_NE(OK, e); + return e; + }); + } + return OK; +} + +int SpdyProxyClientSocket::DoCalculateHeadersComplete(int result) { + DCHECK_NE(ERR_IO_PENDING, result); + if (result != OK) { + return result; + } + next_state_ = STATE_SEND_REQUEST; + if (proxy_delegate_headers_.HasHeader("fastopen")) { + proxy_delegate_headers_.RemoveHeader("fastopen"); + use_fastopen_ = true; + } + request_.extra_headers.MergeFrom(proxy_delegate_headers_); return result; } int SpdyProxyClientSocket::DoSendRequest() { next_state_ = STATE_SEND_REQUEST_COMPLETE; - // Add Proxy-Authentication header if necessary. - HttpRequestHeaders authorization_headers; - if (auth_->HaveAuth()) { - auth_->AddAuthorizationHeader(&authorization_headers); - } - - if (proxy_delegate_) { - HttpRequestHeaders proxy_delegate_headers; - int result = proxy_delegate_->OnBeforeTunnelRequest( - proxy_chain_, proxy_chain_index_, &proxy_delegate_headers); - if (result < 0) { - return result; - } - if (proxy_delegate_headers.HasHeader("fastopen")) { - proxy_delegate_headers.RemoveHeader("fastopen"); - use_fastopen_ = true; - } - request_.extra_headers.MergeFrom(proxy_delegate_headers); - } - std::string request_line; - BuildTunnelRequest(endpoint_, authorization_headers, user_agent_, + BuildTunnelRequest(endpoint_, authorization_headers_, user_agent_, &request_line, &request_.extra_headers); NetLogRequestHeaders(net_log_, @@ -439,19 +501,39 @@ int SpdyProxyClientSocket::DoReadReplyComplete(int result) { if (response_.headers->GetHttpVersion() < HttpVersion(1, 0)) return ERR_TUNNEL_CONNECTION_FAILED; + next_state_ = STATE_PROCESS_RESPONSE_HEADERS; + NetLogResponseHeaders( net_log_, NetLogEventType::HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, response_.headers.get()); + return OK; +} + +int SpdyProxyClientSocket::DoProcessResponseHeaders() { + next_state_ = STATE_PROCESS_RESPONSE_HEADERS_COMPLETE; + if (proxy_delegate_) { - int rv = proxy_delegate_->OnTunnelHeadersReceived( - proxy_chain_, proxy_chain_index_, *response_.headers); - if (rv != OK) { - DCHECK_NE(ERR_IO_PENDING, rv); - return rv; - } + return proxy_delegate_->OnTunnelHeadersReceived( + proxy_chain_, proxy_chain_index_, *response_.headers, + base::BindOnce(&SpdyProxyClientSocket::OnIOComplete, + weak_factory_.GetWeakPtr())); } + return OK; +} + +int SpdyProxyClientSocket::DoProcessResponseHeadersComplete(int result) { + DCHECK_NE(ERR_IO_PENDING, result); + if (result != OK) { + return result; + } + + next_state_ = STATE_PROCESS_RESPONSE_CODE; + return OK; +} + +int SpdyProxyClientSocket::DoProcessResponseCode() { switch (response_.headers->response_code()) { case 200: // OK next_state_ = STATE_OPEN; diff --git a/naiveproxy/src/net/spdy/spdy_proxy_client_socket.h b/naiveproxy/src/net/spdy/spdy_proxy_client_socket.h index 0b1d96ea5b..aca80e455b 100644 --- a/naiveproxy/src/net/spdy/spdy_proxy_client_socket.h +++ b/naiveproxy/src/net/spdy/spdy_proxy_client_socket.h @@ -115,9 +115,14 @@ class NET_EXPORT_PRIVATE SpdyProxyClientSocket : public ProxyClientSocket, STATE_DISCONNECTED, STATE_GENERATE_AUTH_TOKEN, STATE_GENERATE_AUTH_TOKEN_COMPLETE, + STATE_CALCULATE_HEADERS, + STATE_CALCULATE_HEADERS_COMPLETE, STATE_SEND_REQUEST, STATE_SEND_REQUEST_COMPLETE, STATE_READ_REPLY_COMPLETE, + STATE_PROCESS_RESPONSE_HEADERS, + STATE_PROCESS_RESPONSE_HEADERS_COMPLETE, + STATE_PROCESS_RESPONSE_CODE, STATE_OPEN, STATE_CLOSED }; @@ -128,12 +133,21 @@ class NET_EXPORT_PRIVATE SpdyProxyClientSocket : public ProxyClientSocket, void OnIOComplete(int result); + // Callback for proxy_delegate_->OnBeforeTunnelRequest(). + void OnBeforeTunnelRequestComplete( + base::expected result); + int DoLoop(int last_io_result); int DoGenerateAuthToken(); int DoGenerateAuthTokenComplete(int result); + int DoCalculateHeaders(); + int DoCalculateHeadersComplete(int result); int DoSendRequest(); int DoSendRequestComplete(int result); int DoReadReplyComplete(int result); + int DoProcessResponseHeaders(); + int DoProcessResponseHeadersComplete(int result); + int DoProcessResponseCode(); // Populates `data` with as much read data as possible // and returns the number of bytes read. @@ -157,6 +171,9 @@ class NET_EXPORT_PRIVATE SpdyProxyClientSocket : public ProxyClientSocket, HttpRequestInfo request_; HttpResponseInfo response_; + HttpRequestHeaders authorization_headers_; + HttpRequestHeaders proxy_delegate_headers_; + // The hostname and port of the endpoint. This is not necessarily the one // specified by the URL, due to Alternate-Protocol or fixed testing ports. const HostPortPair endpoint_; diff --git a/naiveproxy/src/net/spdy/spdy_session.cc b/naiveproxy/src/net/spdy/spdy_session.cc index e8e8705c09..6f7e0ad3ad 100644 --- a/naiveproxy/src/net/spdy/spdy_session.cc +++ b/naiveproxy/src/net/spdy/spdy_session.cc @@ -233,11 +233,6 @@ base::Value::Dict NetLogSpdySessionCloseParams(int net_error, .Set("description", description); } -base::Value::Dict NetLogSpdySessionParams(const HostPortProxyPair& host_pair) { - return base::Value::Dict() - .Set("host", host_pair.first.ToString()) - .Set("proxy", host_pair.second.ToDebugString()); -} base::Value::Dict NetLogSpdyInitializedParams(NetLogSource source) { base::Value::Dict dict; @@ -846,8 +841,10 @@ SpdySession::SpdySession( network_quality_estimator_(network_quality_estimator), session_creation_initiator_(session_creation_initiator), spdy_session_initiator_(spdy_session_initiator) { - net_log_.BeginEvent(NetLogEventType::HTTP2_SESSION, [&] { - return NetLogSpdySessionParams(host_port_proxy_pair()); + net_log_.BeginEvent(NetLogEventType::HTTP2_SESSION, [&]() { + return base::Value::Dict() + .Set("host", host_port_pair().ToString()) + .Set("proxy", spdy_session_key_.proxy_chain().ToDebugString()); }); DCHECK(base::Contains(initial_settings_, spdy::SETTINGS_HEADER_TABLE_SIZE)); @@ -1399,7 +1396,7 @@ base::Value::Dict SpdySession::GetInfoAsValue() const { base::Value::Dict() .Set("source_id", static_cast(net_log_.source().id)) .Set("host_port_pair", host_port_pair().ToString()) - .Set("proxy", host_port_proxy_pair().second.ToDebugString()) + .Set("proxy", spdy_session_key_.proxy_chain().ToDebugString()) .Set("network_anonymization_key", spdy_session_key_.network_anonymization_key().ToDebugString()) .Set("active_streams", static_cast(active_streams_.size())) @@ -3114,8 +3111,9 @@ void SpdySession::OnAltSvc( if (origin.empty()) return; const GURL gurl(origin); - if (!gurl.is_valid() || gurl.host().empty()) + if (!gurl.is_valid() || gurl.GetHost().empty()) { return; + } if (!gurl.SchemeIs(url::kHttpsScheme)) return; SSLInfo ssl_info; @@ -3123,7 +3121,7 @@ void SpdySession::OnAltSvc( return; } if (!CanPool(transport_security_state_, ssl_info, *ssl_config_service_, - host_port_pair().host(), gurl.host_piece())) { + host_port_pair().host(), gurl.host())) { return; } scheme_host_port = url::SchemeHostPort(gurl); diff --git a/naiveproxy/src/net/spdy/spdy_session.h b/naiveproxy/src/net/spdy/spdy_session.h index b9583aa6f2..7e1adc583e 100644 --- a/naiveproxy/src/net/spdy/spdy_session.h +++ b/naiveproxy/src/net/spdy/spdy_session.h @@ -351,10 +351,7 @@ class NET_EXPORT SpdySession ~SpdySession() override; const HostPortPair& host_port_pair() const { - return spdy_session_key_.host_port_proxy_pair().first; - } - const HostPortProxyPair& host_port_proxy_pair() const { - return spdy_session_key_.host_port_proxy_pair(); + return spdy_session_key_.host_port_pair(); } const SpdySessionKey& spdy_session_key() const { return spdy_session_key_; } diff --git a/naiveproxy/src/net/spdy/spdy_session_key.cc b/naiveproxy/src/net/spdy/spdy_session_key.cc index 44e466b113..a6b0cc7f3b 100644 --- a/naiveproxy/src/net/spdy/spdy_session_key.cc +++ b/naiveproxy/src/net/spdy/spdy_session_key.cc @@ -4,6 +4,7 @@ #include "net/spdy/spdy_session_key.h" +#include #include #include @@ -16,6 +17,7 @@ #include "net/base/proxy_string_util.h" #include "net/base/session_usage.h" #include "net/dns/public/secure_dns_policy.h" +#include "net/socket/socket_tag.h" namespace net { @@ -30,8 +32,9 @@ SpdySessionKey::SpdySessionKey( const NetworkAnonymizationKey& network_anonymization_key, SecureDnsPolicy secure_dns_policy, bool disable_cert_verification_network_fetches) - : host_port_proxy_pair_(host_port_pair, proxy_chain), + : host_port_pair_(host_port_pair), privacy_mode_(privacy_mode), + proxy_chain_(proxy_chain), session_usage_(session_usage), socket_tag_(socket_tag), network_anonymization_key_( @@ -41,8 +44,6 @@ SpdySessionKey::SpdySessionKey( secure_dns_policy_(secure_dns_policy), disable_cert_verification_network_fetches_( disable_cert_verification_network_fetches) { - DVLOG(1) << "SpdySessionKey(host=" << host_port_pair.ToString() - << ", proxy_chain=" << proxy_chain << ", privacy=" << privacy_mode; DCHECK(disable_cert_verification_network_fetches_ || session_usage_ != SessionUsage::kProxy); DCHECK(privacy_mode_ == PRIVACY_MODE_DISABLED || @@ -54,12 +55,12 @@ SpdySessionKey::SpdySessionKey(const SpdySessionKey& other) = default; SpdySessionKey::~SpdySessionKey() = default; bool SpdySessionKey::operator<(const SpdySessionKey& other) const { - return std::tie(privacy_mode_, host_port_proxy_pair_, session_usage_, + return std::tie(host_port_pair_, privacy_mode_, proxy_chain_, session_usage_, network_anonymization_key_, secure_dns_policy_, disable_cert_verification_network_fetches_, socket_tag_) < - std::tie(other.privacy_mode_, other.host_port_proxy_pair_, - other.session_usage_, other.network_anonymization_key_, - other.secure_dns_policy_, + std::tie(other.host_port_pair_, other.privacy_mode_, + other.proxy_chain_, other.session_usage_, + other.network_anonymization_key_, other.secure_dns_policy_, other.disable_cert_verification_network_fetches_, other.socket_tag_); } @@ -69,7 +70,7 @@ SpdySessionKey::CompareForAliasingResult SpdySessionKey::CompareForAliasing( CompareForAliasingResult result; result.is_potentially_aliasable = (privacy_mode_ == other.privacy_mode_ && - host_port_proxy_pair_.second == other.host_port_proxy_pair_.second && + proxy_chain_ == other.proxy_chain_ && session_usage_ == other.session_usage_ && network_anonymization_key_ == other.network_anonymization_key_ && secure_dns_policy_ == other.secure_dns_policy_ && @@ -79,4 +80,17 @@ SpdySessionKey::CompareForAliasingResult SpdySessionKey::CompareForAliasing( return result; } +std::ostream& operator<<(std::ostream& os, const SpdySessionKey& key) { + os << "{host_port_pair: " << key.host_port_pair().ToString() + << ", privacy_mode: " << static_cast(key.privacy_mode()) + << ", proxy_chain: " << key.proxy_chain() + << ", session_usage: " << static_cast(key.session_usage()) + << ", socket_tag: " << key.socket_tag() + << ", network_anonymization_key: " << key.network_anonymization_key() + << ", secure_dns_policy: " << static_cast(key.secure_dns_policy()) + << ", disable_cert_verification_network_fetches: " + << key.disable_cert_verification_network_fetches() << "}"; + return os; +} + } // namespace net diff --git a/naiveproxy/src/net/spdy/spdy_session_key.h b/naiveproxy/src/net/spdy/spdy_session_key.h index 7aa0bbea04..04bbeb6e86 100644 --- a/naiveproxy/src/net/spdy/spdy_session_key.h +++ b/naiveproxy/src/net/spdy/spdy_session_key.h @@ -5,6 +5,7 @@ #ifndef NET_SPDY_SPDY_SESSION_KEY_H_ #define NET_SPDY_SPDY_SESSION_KEY_H_ +#include #include #include "net/base/net_export.h" @@ -15,6 +16,7 @@ #include "net/base/session_usage.h" #include "net/dns/public/secure_dns_policy.h" #include "net/socket/socket_tag.h" + namespace net { // SpdySessionKey is used as unique index for SpdySessionPool. @@ -67,20 +69,14 @@ class NET_EXPORT_PRIVATE SpdySessionKey { CompareForAliasingResult CompareForAliasing( const SpdySessionKey& other) const; - const HostPortProxyPair& host_port_proxy_pair() const { - return host_port_proxy_pair_; - } - - const HostPortPair& host_port_pair() const { - return host_port_proxy_pair_.first; - } - - const ProxyChain& proxy_chain() const { return host_port_proxy_pair_.second; } + const HostPortPair& host_port_pair() const { return host_port_pair_; } PrivacyMode privacy_mode() const { return privacy_mode_; } + const ProxyChain& proxy_chain() const { return proxy_chain_; } + SessionUsage session_usage() const { return session_usage_; } const SocketTag& socket_tag() const { return socket_tag_; } @@ -96,9 +92,10 @@ class NET_EXPORT_PRIVATE SpdySessionKey { } private: - HostPortProxyPair host_port_proxy_pair_; + HostPortPair host_port_pair_; // If enabled, then session cannot be tracked by the server. PrivacyMode privacy_mode_ = PRIVACY_MODE_DISABLED; + ProxyChain proxy_chain_; SessionUsage session_usage_ = SessionUsage::kDestination; SocketTag socket_tag_; // Used to separate requests made in different contexts. If network state @@ -108,6 +105,9 @@ class NET_EXPORT_PRIVATE SpdySessionKey { bool disable_cert_verification_network_fetches_ = false; }; +NET_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, + const SpdySessionKey& key); + } // namespace net #endif // NET_SPDY_SPDY_SESSION_KEY_H_ diff --git a/naiveproxy/src/net/spdy/spdy_session_pool.cc b/naiveproxy/src/net/spdy/spdy_session_pool.cc index c80a770279..6d82b39811 100644 --- a/naiveproxy/src/net/spdy/spdy_session_pool.cc +++ b/naiveproxy/src/net/spdy/spdy_session_pool.cc @@ -12,6 +12,7 @@ #include "base/containers/contains.h" #include "base/functional/bind.h" #include "base/metrics/histogram_macros.h" +#include "base/notimplemented.h" #include "base/task/single_thread_task_runner.h" #include "base/trace_event/trace_event.h" #include "base/types/expected.h" @@ -154,13 +155,14 @@ int SpdySessionPool::CreateAvailableSessionFromSocketHandle( const NetLogWithSource& net_log, const MultiplexedSessionCreationInitiator session_creation_initiator, base::WeakPtr* session, + std::optional connection_management_config, SpdySessionInitiator spdy_session_initiator) { TRACE_EVENT0(NetTracingCategory(), "SpdySessionPool::CreateAvailableSessionFromSocketHandle"); std::unique_ptr new_session = CreateSession(key, net_log.net_log(), session_creation_initiator, - spdy_session_initiator); + spdy_session_initiator, connection_management_config); std::set dns_aliases = stream_socket_handle->socket()->GetDnsAliases(); @@ -189,7 +191,7 @@ SpdySessionPool::CreateAvailableSessionFromSocket( std::unique_ptr new_session = CreateSession( key, net_log.net_log(), MultiplexedSessionCreationInitiator::kUnknown, - spdy_session_initiator); + spdy_session_initiator, std::nullopt); std::set dns_aliases = socket_stream->GetDnsAliases(); new_session->InitializeWithSocket(std::move(socket_stream), connect_timing, @@ -486,6 +488,8 @@ void SpdySessionPool::RemoveUnavailableSession( CHECK(it != sessions_.end()); std::unique_ptr owned_session(*it); sessions_.erase(it); + + NotifyOnSessionClosed(owned_session->spdy_session_key()); } // Make a copy of |sessions_| in the Close* functions below to avoid @@ -536,8 +540,17 @@ std::unique_ptr SpdySessionPool::SpdySessionPoolInfoToValue() return std::make_unique(std::move(list)); } -void SpdySessionPool::OnIPAddressChanged() { +void SpdySessionPool::OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) { DCHECK(cleanup_sessions_on_ip_address_changed_); + + // Ignore changes to randomly generated IPv6 temporary addresses. + if (base::FeatureList::IsEnabled( + net::features::kMaintainConnectionsOnIpv6TempAddrChange) && + change_type == NetworkChangeNotifier::IP_ADDRESS_CHANGE_IPV6_TEMPADDR) { + return; + } + if (go_away_on_ip_change_) { MakeCurrentSessionsGoingAway(ERR_NETWORK_CHANGED); } else { @@ -701,6 +714,7 @@ void SpdySessionPool::CloseCurrentSessionsHelper(Error error, session->CloseSessionOnError(error, description); + NotifyOnSessionClosed(session->spdy_session_key()); DCHECK(!IsSessionAvailable(session)); DCHECK(!session || session->IsDraining()); } @@ -710,7 +724,8 @@ std::unique_ptr SpdySessionPool::CreateSession( const SpdySessionKey& key, NetLog* net_log, const MultiplexedSessionCreationInitiator session_creation_initiator, - SpdySessionInitiator spdy_session_initiator) { + SpdySessionInitiator spdy_session_initiator, + std::optional connection_management_config) { UMA_HISTOGRAM_ENUMERATION("Net.SpdySessionGet", IMPORTED_FROM_SOCKET, SPDY_SESSION_GET_MAX); @@ -728,6 +743,12 @@ std::unique_ptr SpdySessionPool::CreateSession( RemoveAliases(key); } + // We only want to use the connection management config for the session if the + // feature is enabled. + if (connection_management_config.has_value()) { + AddConnectionManagementConfig(key, connection_management_config.value()); + } + return std::make_unique( key, http_server_properties_, transport_security_state_, ssl_client_context_ ? ssl_client_context_->ssl_config_service() : nullptr, @@ -777,6 +798,7 @@ base::expected, int> SpdySessionPool::InsertSession( if (!available_session->HasAcceptableTransportSecurity()) { available_session->CloseSessionOnError( ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY, ""); + NotifyOnConnectionFailure(key); return base::unexpected(ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY); } @@ -784,6 +806,7 @@ base::expected, int> SpdySessionPool::InsertSession( if (rv != OK) { DCHECK_NE(ERR_IO_PENDING, rv); // ParseAlps() already closed the connection on error. + NotifyOnConnectionFailure(key); return base::unexpected(rv); } @@ -913,4 +936,48 @@ base::WeakPtr SpdySessionPool::FindMatchingIpSession( return nullptr; } +void SpdySessionPool::AddConnectionManagementConfig( + const SpdySessionKey& key, + ConnectionManagementConfig& connection_management_config) { + if (!base::FeatureList::IsEnabled( + net::features::kConnectionKeepAliveForHttp2)) { + return; + } + + // We only want to use the connection management config for the session if the + // feature is enabled. + if (connection_management_config.connection_change_observer) { + if (!base::Contains(connection_change_notifier_map_, key)) { + connection_change_notifier_map_[key] = + std::make_unique(); + } + connection_change_notifier_map_[key]->AddObserver( + connection_management_config.connection_change_observer); + } +} + +void SpdySessionPool::NotifyOnNetworkEvent(net::NetworkChangeEvent event) { + // TODO(crbug.com/453308537): We currently do not support + // `NotifyOnNetworkEvent` since `SpdySessionPool` does not observe + // `NetworkObserver`. We should add support, but for the time being, we can + // get similar behavior via the `IPAddressObserver`, which would close the + // connection on network changes. + NOTIMPLEMENTED() << "SpdySessionPool does not support NotifyOnNetworkEvent"; +} + +void SpdySessionPool::NotifyOnSessionClosed(const SpdySessionKey& session_key) { + auto notifier = connection_change_notifier_map_.find(session_key); + if (notifier != connection_change_notifier_map_.end()) { + notifier->second->OnSessionClosed(); + } +} + +void SpdySessionPool::NotifyOnConnectionFailure( + const SpdySessionKey& session_key) { + auto notifier = connection_change_notifier_map_.find(session_key); + if (notifier != connection_change_notifier_map_.end()) { + notifier->second->OnConnectionFailed(); + } +} + } // namespace net diff --git a/naiveproxy/src/net/spdy/spdy_session_pool.h b/naiveproxy/src/net/spdy/spdy_session_pool.h index 13aeb3f6c1..3375b0d51f 100644 --- a/naiveproxy/src/net/spdy/spdy_session_pool.h +++ b/naiveproxy/src/net/spdy/spdy_session_pool.h @@ -25,6 +25,7 @@ #include "net/base/net_export.h" #include "net/base/network_change_notifier.h" #include "net/base/proxy_server.h" +#include "net/base/reconnect_notifier.h" #include "net/dns/public/host_resolver_results.h" #include "net/log/net_log_source.h" #include "net/proxy_resolution/proxy_config.h" @@ -189,6 +190,7 @@ class NET_EXPORT SpdySessionPool const NetLogWithSource& net_log, const MultiplexedSessionCreationInitiator session_creation_initiator, base::WeakPtr* session, + std::optional connection_management_config, SpdySessionInitiator spdy_session_initiator = SpdySessionInitiator::kUnknown); @@ -222,6 +224,12 @@ class NET_EXPORT SpdySessionPool bool is_websocket, const NetLogWithSource& net_log); + using AvailableSessionMap = + std::map>; + const AvailableSessionMap& available_sessions_for_testing() const { + return available_sessions_; + } + // Returns an available session if there is active session for `key` and the // session can be used for IP addresses in `service_endpoint`. Should be // called only when IP-based pooling is enabled. @@ -326,7 +334,8 @@ class NET_EXPORT SpdySessionPool // We flush all idle sessions and release references to the active ones so // they won't get re-used. The active ones will either complete successfully // or error out due to the IP address change. - void OnIPAddressChanged() override; + void OnIPAddressChanged( + NetworkChangeNotifier::IPAddressChangeType change_type) override; // SSLClientContext::Observer methods: @@ -349,13 +358,16 @@ class NET_EXPORT SpdySessionPool std::set GetDnsAliasesForSessionKey( const SpdySessionKey& key) const; + // Adds the connection management config to + // the given session key. + void AddConnectionManagementConfig(const SpdySessionKey& key, + ConnectionManagementConfig& observer); + private: friend class SpdySessionPoolPeer; // For testing. using SessionSet = std::set>; using WeakSessionList = std::vector>; - using AvailableSessionMap = - std::map>; using AliasMap = std::multimap; using DnsAliasesBySessionKeyMap = std::map>; @@ -421,7 +433,8 @@ class NET_EXPORT SpdySessionPool const SpdySessionKey& key, NetLog* net_log, const MultiplexedSessionCreationInitiator session_creation_initiator, - SpdySessionInitiator spdy_session_initiator); + SpdySessionInitiator spdy_session_initiator, + std::optional connection_management_config); // Adds a new session previously created with CreateSession to the pool. // |source_net_log| is the NetLog for the object that created the session. base::expected, int> InsertSession( @@ -455,6 +468,14 @@ class NET_EXPORT SpdySessionPool const std::vector& ip_endpoints, const std::set& dns_aliases); + // Methods to notify the ConnectionChangeObserver about connection changing + // events. `NotifyOnNetworkEvent` will notify all of the notifiers on network + // change events, since it affects all of the connections. Otherwise, the + // events are specific to each connection. + void NotifyOnNetworkEvent(net::NetworkChangeEvent event); + void NotifyOnSessionClosed(const SpdySessionKey& session_key); + void NotifyOnConnectionFailure(const SpdySessionKey& session_key); + raw_ptr http_server_properties_; raw_ptr transport_security_state_; @@ -530,6 +551,9 @@ class NET_EXPORT SpdySessionPool // (instead of being closed). const bool go_away_on_ip_change_; + std::map> + connection_change_notifier_map_; + SpdySessionRequestMap spdy_session_request_map_; TimeFunc time_func_; diff --git a/naiveproxy/src/net/spdy/spdy_stream.cc b/naiveproxy/src/net/spdy/spdy_stream.cc index f7280e1f56..b585e82f06 100644 --- a/naiveproxy/src/net/spdy/spdy_stream.cc +++ b/naiveproxy/src/net/spdy/spdy_stream.cc @@ -388,6 +388,8 @@ void SpdyStream::OnHeadersReceived( if (io_state_ == STATE_IDLE) { const std::string error("Response received before request sent."); LogStreamError(ERR_HTTP2_PROTOCOL_ERROR, error); + DVLOG(1) << "Response received before request sent, possibly " + "crbug.com/41180906"; session_->ResetStream(stream_id_, ERR_HTTP2_PROTOCOL_ERROR, error); return; } diff --git a/naiveproxy/src/net/spdy/spdy_test_util_common.cc b/naiveproxy/src/net/spdy/spdy_test_util_common.cc index b776eec3d0..0e7d8b0675 100644 --- a/naiveproxy/src/net/spdy/spdy_test_util_common.cc +++ b/naiveproxy/src/net/spdy/spdy_test_util_common.cc @@ -75,11 +75,11 @@ void ParseUrl(std::string_view url, std::string* path) { GURL gurl(url); path->assign(gurl.PathForRequest()); - scheme->assign(gurl.scheme()); - host->assign(gurl.host()); + scheme->assign(gurl.GetScheme()); + host->assign(gurl.GetHost()); if (gurl.has_port()) { host->append(":"); - host->append(gurl.port()); + host->append(gurl.GetPort()); } } @@ -355,10 +355,10 @@ SpdySessionDependencies::SpdyCreateSessionWithSocketFactory( HttpNetworkSessionParams SpdySessionDependencies::CreateSessionParams( SpdySessionDependencies* session_deps) { HttpNetworkSessionParams params; - params.host_mapping_rules = session_deps->host_mapping_rules; params.enable_spdy_ping_based_connection_checking = session_deps->enable_ping; params.enable_user_alternate_protocol_ports = session_deps->enable_user_alternate_protocol_ports; + params.enable_http2 = session_deps->enable_http2; params.enable_quic = session_deps->enable_quic; params.spdy_session_max_recv_window_size = session_deps->session_max_recv_window_size; @@ -475,7 +475,8 @@ base::WeakPtr CreateSpdySessionHelper( rv = http_session->spdy_session_pool()->CreateAvailableSessionFromSocketHandle( key, std::move(connection), net_log, - MultiplexedSessionCreationInitiator::kUnknown, &spdy_session); + MultiplexedSessionCreationInitiator::kUnknown, &spdy_session, + std::nullopt); // Failure is reported asynchronously. EXPECT_THAT(rv, IsOk()); EXPECT_TRUE(spdy_session); @@ -567,7 +568,8 @@ base::WeakPtr CreateFakeSpdySession(SpdySessionPool* pool, base::WeakPtr spdy_session; int rv = pool->CreateAvailableSessionFromSocketHandle( key, std::move(handle), NetLogWithSource(), - MultiplexedSessionCreationInitiator::kUnknown, &spdy_session); + MultiplexedSessionCreationInitiator::kUnknown, &spdy_session, + std::nullopt); // Failure is reported asynchronously. EXPECT_THAT(rv, IsOk()); EXPECT_TRUE(spdy_session); @@ -1002,4 +1004,22 @@ SHA256HashValue GetTestHashValue(uint8_t label) { } } // namespace test + +TestConnectionChangeObserver::TestConnectionChangeObserver() = default; +TestConnectionChangeObserver::~TestConnectionChangeObserver() = default; + +void TestConnectionChangeObserver::OnSessionClosed() { + session_closed_++; +} + +void TestConnectionChangeObserver::OnConnectionFailed() { + connection_failed_++; +} + +void TestConnectionChangeObserver::OnNetworkEvent( + net::NetworkChangeEvent event) { + network_event_++; + last_network_event_ = event; +} + } // namespace net diff --git a/naiveproxy/src/net/spdy/spdy_test_util_common.h b/naiveproxy/src/net/spdy/spdy_test_util_common.h index a3e17c9572..4b4c907153 100644 --- a/naiveproxy/src/net/spdy/spdy_test_util_common.h +++ b/naiveproxy/src/net/spdy/spdy_test_util_common.h @@ -17,8 +17,8 @@ #include "base/containers/span.h" #include "base/memory/raw_ptr.h" #include "net/base/completion_once_callback.h" -#include "net/base/host_mapping_rules.h" #include "net/base/proxy_server.h" +#include "net/base/reconnect_notifier.h" #include "net/base/request_priority.h" #include "net/base/test_completion_callback.h" #include "net/cert/mock_cert_verifier.h" @@ -196,11 +196,11 @@ struct SpdySessionDependencies { std::unique_ptr reporting_service; std::unique_ptr network_error_logging_service; #endif - HostMappingRules host_mapping_rules; bool enable_ip_pooling = true; bool enable_ping = false; bool enable_user_alternate_protocol_ports = false; bool enable_quic = false; + bool enable_http2 = true; bool enable_server_push_cancellation = false; size_t session_max_recv_window_size = kDefaultInitialWindowSize; int session_max_queued_capped_frames = kSpdySessionMaxQueuedCappedFrames; @@ -498,6 +498,32 @@ namespace test { SHA256HashValue GetTestHashValue(uint8_t label); } // namespace test + +class TestConnectionChangeObserver : public ConnectionChangeNotifier::Observer { + public: + TestConnectionChangeObserver(); + ~TestConnectionChangeObserver() override; + + void OnSessionClosed() override; + + void OnConnectionFailed() override; + + void OnNetworkEvent(net::NetworkChangeEvent event) override; + + int session_closed() const { return session_closed_; } + int connection_failed() const { return connection_failed_; } + int network_event() const { return network_event_; } + std::optional last_network_event() const { + return last_network_event_; + } + + private: + int session_closed_ = 0; + int connection_failed_ = 0; + int network_event_ = 0; + std::optional last_network_event_; +}; + } // namespace net #endif // NET_SPDY_SPDY_TEST_UTIL_COMMON_H_ diff --git a/naiveproxy/src/net/ssl/client_cert_store_empty.cc b/naiveproxy/src/net/ssl/client_cert_store_empty.cc new file mode 100644 index 0000000000..bebb357383 --- /dev/null +++ b/naiveproxy/src/net/ssl/client_cert_store_empty.cc @@ -0,0 +1,24 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/ssl/client_cert_store_empty.h" + +#include + +#include "net/cert/x509_certificate.h" +#include "net/ssl/ssl_private_key.h" + +namespace net { + +ClientCertStoreEmpty::ClientCertStoreEmpty() = default; + +ClientCertStoreEmpty::~ClientCertStoreEmpty() = default; + +void ClientCertStoreEmpty::GetClientCerts( + scoped_refptr cert_request_info, + ClientCertListCallback callback) { + std::move(callback).Run(ClientCertIdentityList()); +} + +} // namespace net diff --git a/naiveproxy/src/net/ssl/client_cert_store_empty.h b/naiveproxy/src/net/ssl/client_cert_store_empty.h new file mode 100644 index 0000000000..c5d0d39c48 --- /dev/null +++ b/naiveproxy/src/net/ssl/client_cert_store_empty.h @@ -0,0 +1,37 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_SSL_CLIENT_CERT_STORE_EMPTY_H_ +#define NET_SSL_CLIENT_CERT_STORE_EMPTY_H_ + +#include "base/functional/callback.h" +#include "base/memory/scoped_refptr.h" +#include "net/base/net_export.h" +#include "net/ssl/client_cert_store.h" +#include "net/ssl/ssl_cert_request_info.h" + +namespace net { + +// ClientCertStore implementation that always returns an empty list. The +// CertificateProvisioningService implementation expects to wrap a platform +// cert store, but sometimes we only want to get results from the provisioning +// service itself, so instead of a platform cert store we pass an +// implementation that always returns an empty result when queried. +class NET_EXPORT ClientCertStoreEmpty : public ClientCertStore { + public: + ClientCertStoreEmpty(); + + ClientCertStoreEmpty(const ClientCertStoreEmpty&) = delete; + ClientCertStoreEmpty& operator=(const ClientCertStoreEmpty&) = delete; + + ~ClientCertStoreEmpty() override; + + // ClientCertStore: + void GetClientCerts(scoped_refptr cert_request_info, + ClientCertListCallback callback) override; +}; + +} // namespace net + +#endif // NET_SSL_CLIENT_CERT_STORE_EMPTY_H_ diff --git a/naiveproxy/src/net/ssl/client_cert_store_mac.cc b/naiveproxy/src/net/ssl/client_cert_store_mac.cc index d02d05b446..c92d91d72d 100644 --- a/naiveproxy/src/net/ssl/client_cert_store_mac.cc +++ b/naiveproxy/src/net/ssl/client_cert_store_mac.cc @@ -19,15 +19,13 @@ #include "base/apple/osstatus_logging.h" #include "base/apple/scoped_cftyperef.h" -#include "base/feature_list.h" #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/functional/callback_helpers.h" #include "base/logging.h" #include "base/strings/sys_string_conversions.h" #include "base/synchronization/lock.h" -#include "crypto/mac_security_services_lock.h" -#include "net/base/features.h" +#include "crypto/apple/security_framework_lock.h" #include "net/base/host_port_pair.h" #include "net/cert/x509_util.h" #include "net/cert/x509_util_apple.h" @@ -68,7 +66,7 @@ OSStatus CopyCertChain( OSStatus result; SecTrustRef trust_ref = nullptr; { - base::AutoLock lock(crypto::GetMacSecurityServicesLock()); + base::AutoLock lock(crypto::apple::GetSecurityFrameworkLock()); result = SecTrustCreateWithCertificates(input_certs.get(), ssl_policy.get(), &trust_ref); } @@ -78,7 +76,7 @@ OSStatus CopyCertChain( // Evaluate trust, which creates the cert chain. { - base::AutoLock lock(crypto::GetMacSecurityServicesLock()); + base::AutoLock lock(crypto::apple::GetSecurityFrameworkLock()); // The return value is intentionally ignored since we only care about // building a cert chain, not whether it is trusted (the server is the // only one that can decide that.) @@ -315,63 +313,13 @@ ClientCertIdentityList GetClientCertsOnBackgroundThread( // libsecurity_keychain, specifically // _SecIdentityCopyPreferenceMatchingName(). { - base::AutoLock lock(crypto::GetMacSecurityServicesLock()); + base::AutoLock lock(crypto::apple::GetSecurityFrameworkLock()); preferred_sec_identity.reset( SecIdentityCopyPreferred(domain_str.get(), nullptr, nullptr)); } } // Now enumerate the identities in the available keychains. - std::unique_ptr preferred_identity; - ClientCertIdentityMacList regular_identities; - - // macOS provides two ways to search for identities, SecItemCopyMatching() and - // SecIdentitySearchCreate(). SecIdentitySearchCreate() is deprecated, as it - // relies on CSSM_KEYUSE_SIGN (part of the deprecated CDSM/CSSA - // implementation). At one point, we merged the results of the old and new - // APIs, to account for any identities that were not returned by - // SecItemCopyMatching(), particularly smartcard-based identities. It is - // unclear whether such identities still exist, but the APIs have been - // deprecated since 10.7. - // - // TODO(crbug.com/40233280): The SecIdentitySearchCreate() codepath is now - // disabled by default, but can be re-enabled via field trials if there are - // still issues. This will reach stable in M137 (May 2025). Remove this branch - // sometime after August 2025. - if (base::FeatureList::IsEnabled( - features::kIncludeDeprecatedClientCertLookup)) { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - SecIdentitySearchRef search = nullptr; - OSStatus err; - { - base::AutoLock lock(crypto::GetMacSecurityServicesLock()); - err = SecIdentitySearchCreate(nullptr, CSSM_KEYUSE_SIGN, &search); - } - if (err) { - return ClientCertIdentityList(); - } - ScopedCFTypeRef scoped_search(search); - while (!err) { - ScopedCFTypeRef sec_identity; - { - base::AutoLock lock(crypto::GetMacSecurityServicesLock()); - err = SecIdentitySearchCopyNext(search, sec_identity.InitializeInto()); - } - if (err) { - break; - } - AddIdentity(std::move(sec_identity), preferred_sec_identity.get(), - ®ular_identities, &preferred_identity); - } - - if (err != errSecItemNotFound) { - OSSTATUS_LOG(ERROR, err) << "SecIdentitySearch error"; - return ClientCertIdentityList(); - } -#pragma clang diagnostic pop // "-Wdeprecated-declarations" - } - static const void* kKeys[] = { kSecClass, kSecMatchLimit, kSecReturnRef, kSecAttrCanSign, }; @@ -384,10 +332,12 @@ ClientCertIdentityList GetClientCertsOnBackgroundThread( ScopedCFTypeRef result; OSStatus err; { - base::AutoLock lock(crypto::GetMacSecurityServicesLock()); + base::AutoLock lock(crypto::apple::GetSecurityFrameworkLock()); err = SecItemCopyMatching( query.get(), reinterpret_cast(result.InitializeInto())); } + std::unique_ptr preferred_identity; + ClientCertIdentityMacList regular_identities; if (!err) { for (CFIndex i = 0; i < CFArrayGetCount(result.get()); i++) { SecIdentityRef item = reinterpret_cast( diff --git a/naiveproxy/src/net/ssl/client_cert_store_nss.cc b/naiveproxy/src/net/ssl/client_cert_store_nss.cc index 7bfbd6f5ac..049a61fefb 100644 --- a/naiveproxy/src/net/ssl/client_cert_store_nss.cc +++ b/naiveproxy/src/net/ssl/client_cert_store_nss.cc @@ -22,7 +22,6 @@ #include "crypto/nss_crypto_module_delegate.h" #include "crypto/nss_util.h" #include "crypto/scoped_nss_types.h" -#include "net/base/features.h" #include "net/cert/scoped_nss_types.h" #include "net/cert/x509_util.h" #include "net/cert/x509_util_nss.h" @@ -30,7 +29,6 @@ #include "net/ssl/ssl_cert_request_info.h" #include "net/ssl/ssl_platform_key_nss.h" #include "net/ssl/threaded_ssl_private_key.h" -#include "net/third_party/nss/ssl/cmpcert.h" #include "third_party/boringssl/src/include/openssl/pool.h" namespace net { @@ -130,59 +128,9 @@ void ClientCertStoreNSS::OnClientCertsResponse( void ClientCertStoreNSS::FilterCertsOnWorkerThread( ClientCertIdentityList* identities, const SSLCertRequestInfo& request) { - if (base::FeatureList::IsEnabled(features::kNewClientCertPathBuilding)) { - ClientCertIssuerSourceCollection sources; - sources.push_back(std::make_unique()); - FilterMatchingClientCertIdentities(identities, request, sources); - } else { - size_t num_raw = 0; - - auto keep_iter = identities->begin(); - - base::Time now = base::Time::Now(); - - for (auto examine_iter = identities->begin(); - examine_iter != identities->end(); ++examine_iter) { - ++num_raw; - - X509Certificate* cert = (*examine_iter)->certificate(); - - // Only offer unexpired certificates. - if (now < cert->valid_start() || now > cert->valid_expiry()) { - continue; - } - - ScopedCERTCertificateList nss_intermediates; - if (!MatchClientCertificateIssuers(cert, request.cert_authorities, - &nss_intermediates)) { - continue; - } - - std::vector> intermediates; - intermediates.reserve(nss_intermediates.size()); - for (const ScopedCERTCertificate& nss_intermediate : nss_intermediates) { - intermediates.push_back(x509_util::CreateCryptoBuffer( - x509_util::CERTCertificateAsSpan(nss_intermediate.get()))); - } - - // Retain a copy of the intermediates. Some deployments expect the client - // to supply intermediates out of the local store. See - // https://crbug.com/548631. - (*examine_iter)->SetIntermediates(std::move(intermediates)); - - if (examine_iter == keep_iter) { - ++keep_iter; - } else { - *keep_iter++ = std::move(*examine_iter); - } - } - identities->erase(keep_iter, identities->end()); - - DVLOG(2) << "num_raw:" << num_raw << " num_filtered:" << identities->size(); - - std::sort(identities->begin(), identities->end(), - ClientCertIdentitySorter()); - } + ClientCertIssuerSourceCollection sources; + sources.push_back(std::make_unique()); + FilterMatchingClientCertIdentities(identities, request, sources); } // static diff --git a/naiveproxy/src/net/ssl/openssl_ssl_util.cc b/naiveproxy/src/net/ssl/openssl_ssl_util.cc index 214b43dd3e..8a3648947e 100644 --- a/naiveproxy/src/net/ssl/openssl_ssl_util.cc +++ b/naiveproxy/src/net/ssl/openssl_ssl_util.cc @@ -24,14 +24,6 @@ namespace net { -SslSetClearMask::SslSetClearMask() = default; - -void SslSetClearMask::ConfigureFlag(long flag, bool state) { - (state ? set_mask : clear_mask) |= flag; - // Make sure we haven't got any intersection in the set & clear options. - DCHECK_EQ(0, set_mask & clear_mask) << flag << ":" << state; -} - namespace { class OpenSSLNetErrorLibSingleton { @@ -231,9 +223,8 @@ int GetNetSSLVersion(SSL* ssl) { std::vector GetCertChainRawVector(X509Certificate& cert) { std::vector chain_raw; - chain_raw.reserve(1 + cert.intermediate_buffers().size()); - chain_raw.push_back(cert.cert_buffer()); - for (const auto& handle : cert.intermediate_buffers()) { + chain_raw.reserve(cert.cert_buffers().size()); + for (const auto& handle : cert.cert_buffers()) { chain_raw.push_back(handle.get()); } return chain_raw; diff --git a/naiveproxy/src/net/ssl/openssl_ssl_util.h b/naiveproxy/src/net/ssl/openssl_ssl_util.h index 20eabaeb4c..fe02f6ca41 100644 --- a/naiveproxy/src/net/ssl/openssl_ssl_util.h +++ b/naiveproxy/src/net/ssl/openssl_ssl_util.h @@ -33,16 +33,6 @@ class NetLogWithSource; // extracted from |posted_from|. The function code of the error is left as 0. void OpenSSLPutNetError(const base::Location& posted_from, int err); -// Utility to construct the appropriate set & clear masks for use the OpenSSL -// options and mode configuration functions. (SSL_set_options etc) -struct SslSetClearMask { - SslSetClearMask(); - void ConfigureFlag(long flag, bool state); - - long set_mask = 0; - long clear_mask = 0; -}; - // Converts an OpenSSL error code into a net error code, walking the OpenSSL // error stack if needed. // diff --git a/naiveproxy/src/net/ssl/ssl_client_session_cache.cc b/naiveproxy/src/net/ssl/ssl_client_session_cache.cc index a47166ca19..f890f54812 100644 --- a/naiveproxy/src/net/ssl/ssl_client_session_cache.cc +++ b/naiveproxy/src/net/ssl/ssl_client_session_cache.cc @@ -47,9 +47,10 @@ SSLClientSessionCache::SSLClientSessionCache(const Config& config) : clock_(base::DefaultClock::GetInstance()), config_(config), cache_(config.max_entries) { - memory_pressure_listener_ = std::make_unique( - FROM_HERE, base::BindRepeating(&SSLClientSessionCache::OnMemoryPressure, - base::Unretained(this))); + memory_pressure_listener_registration_ = + std::make_unique( + FROM_HERE, base::MemoryPressureListenerTag::kSSLClientSessionCache, + this); } SSLClientSessionCache::~SSLClientSessionCache() { @@ -84,8 +85,12 @@ bssl::UniquePtr SSLClientSessionCache::Lookup( return session; } -void SSLClientSessionCache::Insert(const Key& cache_key, +void SSLClientSessionCache::Insert(uint64_t generation_number, + const Key& cache_key, bssl::UniquePtr session) { + if (generation_number != generation_number_) { + return; + } auto iter = cache_.Get(cache_key); if (iter == cache_.end()) iter = cache_.Put(cache_key, Entry()); @@ -105,6 +110,15 @@ void SSLClientSessionCache::ClearEarlyData(const Key& cache_key) { void SSLClientSessionCache::FlushForServers( const base::flat_set& servers) { + // The generation number is incremented here, which affects all hosts, even + // though this flush only applies to those matching `servers`. Only the + // sessions related to `servers` are cleared, so any other already cached + // sessions will remain valid despite the generation number changing. It + // could prevent sessions unrelated to `servers` that are in-flight at the + // time of this flush from being cached. That is not optimal but is a + // trade-off for implementation simplicity. + ++generation_number_; + auto iter = cache_.begin(); while (iter != cache_.end()) { if (servers.contains(iter->first.server)) { @@ -116,6 +130,7 @@ void SSLClientSessionCache::FlushForServers( } void SSLClientSessionCache::Flush() { + ++generation_number_; cache_.Clear(); } @@ -188,14 +203,14 @@ void SSLClientSessionCache::FlushExpiredSessions() { } void SSLClientSessionCache::OnMemoryPressure( - base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { + base::MemoryPressureLevel memory_pressure_level) { switch (memory_pressure_level) { - case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE: + case base::MEMORY_PRESSURE_LEVEL_NONE: break; - case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE: + case base::MEMORY_PRESSURE_LEVEL_MODERATE: FlushExpiredSessions(); break; - case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL: + case base::MEMORY_PRESSURE_LEVEL_CRITICAL: Flush(); break; } diff --git a/naiveproxy/src/net/ssl/ssl_client_session_cache.h b/naiveproxy/src/net/ssl/ssl_client_session_cache.h index 6d0fa3b61c..607dbb45e6 100644 --- a/naiveproxy/src/net/ssl/ssl_client_session_cache.h +++ b/naiveproxy/src/net/ssl/ssl_client_session_cache.h @@ -32,7 +32,7 @@ class Clock; namespace net { -class NET_EXPORT SSLClientSessionCache { +class NET_EXPORT SSLClientSessionCache : public base::MemoryPressureListener { public: struct Config { // The maximum number of entries in the cache. @@ -66,21 +66,30 @@ class NET_EXPORT SSLClientSessionCache { SSLClientSessionCache(const SSLClientSessionCache&) = delete; SSLClientSessionCache& operator=(const SSLClientSessionCache&) = delete; - ~SSLClientSessionCache(); + ~SSLClientSessionCache() override; // Returns true if |entry| is expired as of |now|. static bool IsExpired(SSL_SESSION* session, time_t now); size_t size() const; + // Returns the current generation number. When a new socket is initialized, + // the `generation_number()` at the time should be recorded and used when + // inserting the session into the cache, which will ensure that sessions + // created with stale configs don't get cached. + uint64_t generation_number() const { return generation_number_; } + // Returns the session associated with |cache_key| and moves it to the front // of the MRU list. Returns nullptr if there is none. bssl::UniquePtr Lookup(const Key& cache_key); // Inserts |session| into the cache at |cache_key|. If there is an existing // one, it is released. Every |expiration_check_count| calls, the cache is - // checked for stale entries. - void Insert(const Key& cache_key, bssl::UniquePtr session); + // checked for stale entries. If |generation_number| does not match the + // current |generation_number_|, the insert will be ignored. + void Insert(uint64_t generation_number, + const Key& cache_key, + bssl::UniquePtr session); // Clears early data support for all current sessions associated with // |cache_key|. This may be used after a 0-RTT reject to avoid unnecessarily @@ -90,7 +99,8 @@ class NET_EXPORT SSLClientSessionCache { // Removes all entries associated with items in |servers|. void FlushForServers(const base::flat_set& servers); - // Removes all entries from the cache. + // Removes all entries from the cache and updates the generation number. + // Future insertions will be ignored unless they match the new generation. void Flush(); void SetClockForTesting(base::Clock* clock); @@ -121,13 +131,15 @@ class NET_EXPORT SSLClientSessionCache { // Clear cache on low memory notifications callback. void OnMemoryPressure( - base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level); + base::MemoryPressureLevel memory_pressure_level) override; raw_ptr clock_; + uint64_t generation_number_ = 0; Config config_; base::LRUCache cache_; size_t lookups_since_flush_ = 0; - std::unique_ptr memory_pressure_listener_; + std::unique_ptr + memory_pressure_listener_registration_; }; } // namespace net diff --git a/naiveproxy/src/net/ssl/ssl_config.cc b/naiveproxy/src/net/ssl/ssl_config.cc index 26bbe321f2..b460005af0 100644 --- a/naiveproxy/src/net/ssl/ssl_config.cc +++ b/naiveproxy/src/net/ssl/ssl_config.cc @@ -21,10 +21,11 @@ SSLConfig::CertAndStatus::CertAndStatus(const CertAndStatus& other) = default; SSLConfig::CertAndStatus::~CertAndStatus() = default; SSLConfig::SSLConfig() = default; - SSLConfig::SSLConfig(const SSLConfig& other) = default; - +SSLConfig::SSLConfig(SSLConfig&& other) = default; SSLConfig::~SSLConfig() = default; +SSLConfig& SSLConfig::operator=(const SSLConfig&) = default; +SSLConfig& SSLConfig::operator=(SSLConfig&&) = default; bool SSLConfig::IsAllowedBadCert(X509Certificate* cert, CertStatus* cert_status) const { diff --git a/naiveproxy/src/net/ssl/ssl_config.h b/naiveproxy/src/net/ssl/ssl_config.h index 2f38ab7f97..7722001f0c 100644 --- a/naiveproxy/src/net/ssl/ssl_config.h +++ b/naiveproxy/src/net/ssl/ssl_config.h @@ -39,10 +39,12 @@ NET_EXPORT extern const uint16_t kDefaultSSLVersionMax; struct NET_EXPORT SSLConfig { using ApplicationSettings = base::flat_map>; - // Default to revocation checking. SSLConfig(); SSLConfig(const SSLConfig& other); + SSLConfig(SSLConfig&& other); ~SSLConfig(); + SSLConfig& operator=(const SSLConfig&); + SSLConfig& operator=(SSLConfig&&); // Returns true if |cert| is one of the certs in |allowed_bad_certs|. // The expected cert status is written to |cert_status|. |*cert_status| can @@ -175,12 +177,17 @@ struct NET_EXPORT SSLConfig { // proxy as an endpoint from connections to that same proxy as a proxy. SessionUsage session_usage = SessionUsage::kDestination; - // If non-empty, a list of TLS Trust Anchor IDs in wire format + // If not nullopt, a list of TLS Trust Anchor IDs in wire format // (https://tlswg.org/tls-trust-anchor-ids/draft-ietf-tls-trust-anchor-ids.html#name-tls-extension), - // i.e. a series of non-empty, 8-bit length-prefixed strings. If non-empty, - // these trust anchor IDs will be sent on the TLS ClientHello message to help - // the server select a certificate that the client will accept. - std::vector trust_anchor_ids; + // i.e. a series of non-empty, 8-bit length-prefixed strings. These trust + // anchor IDs will be sent on the TLS ClientHello message to help the server + // select a certificate that the client will accept. + // + // If an empty vector, the Trust Anchor IDs extension will be sent, but with + // no trust anchors. This will signal to the server that the client is new + // enough to implement the extension and can process the server's list of + // available trust anchors. + std::optional> trust_anchor_ids; }; } // namespace net diff --git a/naiveproxy/src/net/ssl/ssl_config_service.cc b/naiveproxy/src/net/ssl/ssl_config_service.cc index 3e4b0c6966..5ea21db9da 100644 --- a/naiveproxy/src/net/ssl/ssl_config_service.cc +++ b/naiveproxy/src/net/ssl/ssl_config_service.cc @@ -10,10 +10,37 @@ #include "base/observer_list.h" #include "net/base/features.h" #include "net/ssl/ssl_config_service_defaults.h" +#include "third_party/boringssl/src/include/openssl/ssl.h" namespace net { -SSLContextConfig::SSLContextConfig() = default; +namespace { + +// The default NamedGroups supported by Chromium. +// This default list matches the result of prepending our preferred post-quantum +// group (X25519MLKEM768) to BoringSSL's kDefaultSupportedGroupIds and +// evaluating BoringSSL's default logic for selecting key shares. +const SSLNamedGroupInfo kDefaultSSLSupportedGroups[] = { + {.group_id = SSL_GROUP_X25519_MLKEM768, .send_key_share = true}, + {.group_id = SSL_GROUP_X25519, .send_key_share = true}, + {.group_id = SSL_GROUP_SECP256R1, .send_key_share = false}, + {.group_id = SSL_GROUP_SECP384R1, .send_key_share = false}, +}; + +} // namespace + +// This function should be kept updated to include all the post-quantum groups +// that //net and callers know about and may configure. +bool SSLNamedGroupInfo::IsPostQuantum() const { + return group_id == SSL_GROUP_X25519_MLKEM768 || + group_id == SSL_GROUP_MLKEM1024; +} + +SSLContextConfig::SSLContextConfig() { + supported_named_groups.assign(std::begin(kDefaultSSLSupportedGroups), + std::end(kDefaultSSLSupportedGroups)); +} + SSLContextConfig::SSLContextConfig(const SSLContextConfig&) = default; SSLContextConfig::SSLContextConfig(SSLContextConfig&&) = default; SSLContextConfig::~SSLContextConfig() = default; @@ -22,6 +49,17 @@ SSLContextConfig& SSLContextConfig::operator=(const SSLContextConfig&) = SSLContextConfig& SSLContextConfig::operator=(SSLContextConfig&&) = default; bool SSLContextConfig::operator==(const SSLContextConfig&) const = default; +std::vector SSLContextConfig::GetSupportedGroups( + bool key_shares_only) const { + std::vector groups_out; + for (const SSLNamedGroupInfo& group : supported_named_groups) { + if (!key_shares_only || group.send_key_share) { + groups_out.push_back(group.group_id); + } + } + return groups_out; +} + SSLConfigService::SSLConfigService() : observer_list_(base::ObserverListPolicy::EXISTING_ONLY) {} diff --git a/naiveproxy/src/net/ssl/ssl_config_service.h b/naiveproxy/src/net/ssl/ssl_config_service.h index 14f90c7525..ae22e047cf 100644 --- a/naiveproxy/src/net/ssl/ssl_config_service.h +++ b/naiveproxy/src/net/ssl/ssl_config_service.h @@ -16,6 +16,22 @@ namespace net { +// Represents a given named group in TLS, used in supported_groups and +// key_share. +struct NET_EXPORT SSLNamedGroupInfo { + // NamedGroup enum codepoint for the group, from + // https://datatracker.ietf.org/doc/html/rfc8446#section-4.2.7. + uint16_t group_id = 0u; + // Whether the group should be sent in the key_share extension for the + // initial ClientHello. + bool send_key_share = false; + + bool operator==(const SSLNamedGroupInfo&) const = default; + + bool IsPostQuantum() const; +}; + +// Configuration options for SSL connections. struct NET_EXPORT SSLContextConfig { SSLContextConfig(); SSLContextConfig(const SSLContextConfig&); @@ -26,6 +42,14 @@ struct NET_EXPORT SSLContextConfig { bool operator==(const SSLContextConfig&) const; + // Returns a copy of the list of group IDs given by `supported_named_groups`. + // If `key_shares_only` is false, the returned vector is the list of groups to + // include in the supported_groups extension. If `key_shares_only` is true, + // only the groups that have `send_key_share == true` are included in the + // returned vector, which will be the list of groups to include in the + // key_share extension. + std::vector GetSupportedGroups(bool key_shares_only = false) const; + // The minimum and maximum protocol versions that are enabled. // (Use the SSL_PROTOCOL_VERSION_xxx enumerators defined in ssl_config.h.) // SSL 2.0/3.0 and TLS 1.0/1.1 are not supported. If version_max < @@ -43,8 +67,14 @@ struct NET_EXPORT SSLContextConfig { // disable TLS_ECDH_ECDSA_WITH_RC4_128_SHA, specify 0xC002. std::vector disabled_cipher_suites; - // Controls whether post-quantum key agreement in TLS connections is allowed. - bool post_quantum_key_agreement_enabled = true; + // This configures a compliance policy that sets the cipher order for + // TLS 1.3 to prefer AES-256-GCM over AES-128-GCM over ChaCha20-Poly1305. + bool tls13_cipher_prefer_aes_256 = false; + + // Ordered list of NamedGroups that are supported, used to configure + // supported_groups and key_share. Set to `kDefaultSSLSupportedGroups` by + // default. + std::vector supported_named_groups; // Controls whether ECH is enabled. bool ech_enabled = true; diff --git a/naiveproxy/src/net/ssl/ssl_platform_key_android.cc b/naiveproxy/src/net/ssl/ssl_platform_key_android.cc index f8a4e8d77a..ac86051bc6 100644 --- a/naiveproxy/src/net/ssl/ssl_platform_key_android.cc +++ b/naiveproxy/src/net/ssl/ssl_platform_key_android.cc @@ -167,9 +167,15 @@ scoped_refptr WrapJavaPrivateKey( const X509Certificate* certificate, const JavaRef& key) { bssl::UniquePtr pubkey = GetClientCertPublicKey(certificate); - if (!pubkey) - return nullptr; + return WrapJavaPrivateKey(std::move(pubkey), key); +} +scoped_refptr WrapJavaPrivateKey( + bssl::UniquePtr pubkey, + const JavaRef& key) { + if (!pubkey) { + return nullptr; + } return base::MakeRefCounted( std::make_unique(std::move(pubkey), key), GetSSLPlatformKeyTaskRunner()); diff --git a/naiveproxy/src/net/ssl/ssl_platform_key_android.h b/naiveproxy/src/net/ssl/ssl_platform_key_android.h index 109134bbfc..5a9ad4f490 100644 --- a/naiveproxy/src/net/ssl/ssl_platform_key_android.h +++ b/naiveproxy/src/net/ssl/ssl_platform_key_android.h @@ -14,6 +14,7 @@ #include "base/containers/span.h" #include "base/memory/scoped_refptr.h" #include "net/base/net_export.h" +#include "third_party/boringssl/src/include/openssl/evp.h" namespace net { @@ -27,6 +28,13 @@ NET_EXPORT scoped_refptr WrapJavaPrivateKey( const X509Certificate* cert, const base::android::JavaRef& key); +// Returns a new SSLPrivateKey for `pubkey` which uses `key` for signing +// operations or nullptr on error. `key` must be a java.security.PrivateKey +// object. +NET_EXPORT scoped_refptr WrapJavaPrivateKey( + bssl::UniquePtr pubkey, + const base::android::JavaRef& key); + // Converts `algorithms` to a list of strings containing Java key types, // suitable for use with android.security.KeyChain.choosePrivateKeyAlias. NET_EXPORT std::vector SignatureAlgorithmsToJavaKeyTypes( diff --git a/naiveproxy/src/net/ssl/ssl_platform_key_util.h b/naiveproxy/src/net/ssl/ssl_platform_key_util.h index 0d0793473e..2b2634c688 100644 --- a/naiveproxy/src/net/ssl/ssl_platform_key_util.h +++ b/naiveproxy/src/net/ssl/ssl_platform_key_util.h @@ -29,7 +29,7 @@ NET_EXPORT_PRIVATE scoped_refptr GetSSLPlatformKeyTaskRunner(); // Returns the public key of |certificate| as an |EVP_PKEY| or nullptr on error. -bssl::UniquePtr GetClientCertPublicKey( +NET_EXPORT_PRIVATE bssl::UniquePtr GetClientCertPublicKey( const X509Certificate* certificate); // Determines the key type and maximum signature length of |certificate|'s diff --git a/naiveproxy/src/net/ssl/ssl_platform_key_win.cc b/naiveproxy/src/net/ssl/ssl_platform_key_win.cc index 56f7928681..27bf9b0f17 100644 --- a/naiveproxy/src/net/ssl/ssl_platform_key_win.cc +++ b/naiveproxy/src/net/ssl/ssl_platform_key_win.cc @@ -171,7 +171,7 @@ class SSLPlatformKeyCAPI : public ThreadedSSLPrivateKey::Delegate { signature->resize(signature_len); // CryptoAPI signs in little-endian, so reverse it. - std::reverse(signature->begin(), signature->end()); + std::ranges::reverse(*signature); return OK; } diff --git a/naiveproxy/src/net/ssl/ssl_server_config.cc b/naiveproxy/src/net/ssl/ssl_server_config.cc index ee7465cfaa..aa2e749745 100644 --- a/naiveproxy/src/net/ssl/ssl_server_config.cc +++ b/naiveproxy/src/net/ssl/ssl_server_config.cc @@ -10,6 +10,12 @@ namespace net { +SSLServerCredential::SSLServerCredential() = default; +SSLServerCredential::SSLServerCredential(SSLServerCredential&& other) = default; +SSLServerCredential& SSLServerCredential::operator=( + SSLServerCredential&& other) = default; +SSLServerCredential::~SSLServerCredential() = default; + SSLServerConfig::SSLServerConfig() = default; SSLServerConfig::SSLServerConfig(const SSLServerConfig& other) = default; diff --git a/naiveproxy/src/net/ssl/ssl_server_config.h b/naiveproxy/src/net/ssl/ssl_server_config.h index 55b024b48d..a9fb48e1c0 100644 --- a/naiveproxy/src/net/ssl/ssl_server_config.h +++ b/naiveproxy/src/net/ssl/ssl_server_config.h @@ -23,6 +23,36 @@ namespace net { class ClientCertVerifier; +struct NET_EXPORT SSLServerCredential { + SSLServerCredential(); + SSLServerCredential(SSLServerCredential&& other); + SSLServerCredential& operator=(SSLServerCredential&& other); + ~SSLServerCredential(); + + // Certificate chain for this credential. + std::vector> cert_chain; + + // Private key used by this credential. + bssl::UniquePtr pkey; + + // signature_algorithm_for_testing, if set, causes the server to only support + // the specified signature algorithm in TLS 1.2 and below. This should only be + // used in unit tests. + std::optional signature_algorithm_for_testing; + + // If non-empty, the DER-encoded OCSP response to staple. + std::vector ocsp_response; + + // If non-empty, the serialized SignedCertificateTimestampList to send in the + // handshake. + std::vector signed_cert_timestamp_list; + + // If non-empty, the TLS Trust Anchor Identifier of this credential. If + // specified, this credential will only be used if the client advertised + // a matching id. + std::vector trust_anchor_id; +}; + // A collection of server-side SSL-related configuration settings. struct NET_EXPORT SSLServerConfig { enum ClientCertType { @@ -65,11 +95,6 @@ struct NET_EXPORT SSLServerConfig { // unit tests. std::optional cipher_suite_for_testing; - // signature_algorithm_for_testing, if set, causes the server to only support - // the specified signature algorithm in TLS 1.2 and below. This should only be - // used in unit tests. - std::optional signature_algorithm_for_testing; - // curves_for_testing, if not empty, specifies the list of NID values (e.g. // NID_X25519) to configure as supported curves for the TLS connection. std::vector curves_for_testing; @@ -104,13 +129,6 @@ struct NET_EXPORT SSLServerConfig { // Data might be empty. base::flat_map> application_settings; - // If non-empty, the DER-encoded OCSP response to staple. - std::vector ocsp_response; - - // If non-empty, the serialized SignedCertificateTimestampList to send in the - // handshake. - std::vector signed_cert_timestamp_list; - // If specified, called at the start of each connection with the ClientHello. // Returns true to continue the handshake and false to fail it. base::RepeatingCallback @@ -145,18 +163,6 @@ struct NET_EXPORT SSLServerConfig { // If not nullptr, an ECH configuration to use on the server. ECHKeysContainer ech_keys; - - // If non-empty, the intermediate certificate will be elided when possible - // via TLS Trust Anchor Identifiers. That is, the server will be configured - // to serve not just the full chain with which it is configured, but also a - // shorter version of that chain formed by eliding the intermediate - // certificate. If the client signals that it trusts this intermediate via - // the TLS Trust Anchor IDs extension, then the server will serve the - // corresponding elided chain instead of the full chain. - // - // It is an error if this is non-empty when the server certificate chain does - // not have exactly one intermediate. - std::vector intermediate_trust_anchor_id; }; } // namespace net diff --git a/naiveproxy/src/net/test/ct_test_util.cc b/naiveproxy/src/net/test/ct_test_util.cc index 74da91a102..e482b6b5af 100644 --- a/naiveproxy/src/net/test/ct_test_util.cc +++ b/naiveproxy/src/net/test/ct_test_util.cc @@ -7,11 +7,12 @@ #include #include +#include #include #include #include "base/base64.h" -#include "base/compiler_specific.h" +#include "base/containers/span.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" @@ -28,7 +29,7 @@ namespace { // The following test vectors are from // http://code.google.com/p/certificate-transparency -const char kDefaultDerCert[] = +constexpr char kDefaultDerCert[] = "308202ca30820233a003020102020106300d06092a864886f70d01010505003055310b3009" "06035504061302474231243022060355040a131b4365727469666963617465205472616e73" "706172656e6379204341310e300c0603550408130557616c65733110300e06035504071307" @@ -50,10 +51,10 @@ const char kDefaultDerCert[] = "f667256cd6a1647b5e13203bb8582de7d6696f656d1c60b95f456b7fcf338571908f1c6972" "7d24c4fccd249295795814d1dac0e6"; -const char kDefaultIssuerKeyHash[] = +constexpr char kDefaultIssuerKeyHash[] = "02adddca08b8bf9861f035940c940156d8350fdff899a6239c6bd77255b8f8fc"; -const char kDefaultDerTbsCert[] = +constexpr char kDefaultDerTbsCert[] = "30820233a003020102020107300d06092a864886f70d01010505003055310b300906035504" "061302474231243022060355040a131b4365727469666963617465205472616e7370617265" "6e6379204341310e300c0603550408130557616c65733110300e0603550407130745727720" @@ -71,34 +72,34 @@ const char kDefaultDerTbsCert[] = "41310e300c0603550408130557616c65733110300e060355040713074572772057656e8201" "0030090603551d1304023000"; -const char kDefaultExtensions[] = "666f6f626172"; // "foobar" +constexpr char kDefaultExtensions[] = "666f6f626172"; // "foobar" -const char kTestDigitallySigned[] = +constexpr char kTestDigitallySigned[] = "0403004730450220606e10ae5c2d5a1b0aed49dc4937f48de71a4e9784e9c208dfbfe9ef53" "6cf7f2022100beb29c72d7d06d61d06bdb38a069469aa86fe12e18bb7cc45689a2c0187ef5" "a5"; -const char kTestSignedCertificateTimestamp[] = +constexpr char kTestSignedCertificateTimestamp[] = "00df1c2ec11500945247a96168325ddc5c7959e8f7c6d388fc002e0bbd3f74d7640000013d" "db27ded900000403004730450220606e10ae5c2d5a1b0aed49dc4937f48de71a4e9784e9c2" "08dfbfe9ef536cf7f2022100beb29c72d7d06d61d06bdb38a069469aa86fe12e18bb7cc456" "89a2c0187ef5a5"; -const char kEcP256PublicKey[] = +constexpr char kEcP256PublicKey[] = "3059301306072a8648ce3d020106082a8648ce3d0301070342000499783cb14533c0161a5a" "b45bf95d08a29cd0ea8dd4c84274e2be59ad15c676960cf0afa1074a57ac644b23479e5b3f" "b7b245eb4b420ef370210371a944beaceb"; -const char kTestKeyId[] = +constexpr char kTestKeyId[] = "df1c2ec11500945247a96168325ddc5c7959e8f7c6d388fc002e0bbd3f74d764"; -const int64_t kTestTimestamp = INT64_C(1396877277237); +constexpr int64_t kTestTimestamp = INT64_C(1396877277237); -const char kTestSCTSignatureData[] = +constexpr char kTestSCTSignatureData[] = "30450220606e10ae5c2d5a1b0aed49dc4937f48de71a4e9784e9c208dfbfe9ef536cf7f202" "2100beb29c72d7d06d61d06bdb38a069469aa86fe12e18bb7cc45689a2c0187ef5a5"; -const char kTestSCTPrecertSignatureData[] = +constexpr char kTestSCTPrecertSignatureData[] = "30450220482f6751af35dba65436be1fd6640f3dbf9a41429495924530288fa3e5e23e0602" "2100e4edc0db3ac572b1e2f5e8ab6a680653987dcf41027dfeffa105519d89edbf08"; @@ -106,7 +107,7 @@ const char kTestSCTPrecertSignatureData[] = // http://code.google.com/p/certificate-transparency, does not pertain to any // of the test certs here, and is only used to test extracting the extension // contents from the response. -const char kFakeOCSPResponse[] = +constexpr char kFakeOCSPResponse[] = "3082016e0a0100a08201673082016306092b060105050730010104820154308201503081ba" "a21604144edfdf5ff9c90ffacfca66e7fbc436bc39ee3fc7180f3230313030313031303630" "3030305a30818e30818b3049300906052b0e03021a050004141833a1e6a4f09577cca0e64c" @@ -116,10 +117,10 @@ const char kFakeOCSPResponse[] = "74300d06092a864886f70d0101050500038181003586ffcf0794e64eb643d52a3d570a1c93" "836395986a2f792dd4e9c70b05161186c55c1658e0607dc9ec0d0924ac37fb99506c870579" "634be1de62ba2fced5f61f3b428f959fcee9bddf6f268c8e14c14fdf3b447786e638a5c8cc" - "b610893df17a60e4cff30f4780aeffe0086ef19910f0d9cd7414bc93d1945686f88ad0a3c3" - ; + "b610893df17a60e4cff30f4780aeffe0086ef19910f0d9cd7414bc93d1945686f88ad0a3c" + "3"; -const char kFakeOCSPResponseCert[] = +constexpr char kFakeOCSPResponseCert[] = "3082022930820192a003020102021001aef99bdee0bb58c6f2b816bc3ae02f300d06092a86" "4886f70d01010505003015311330110603550403130a54657374696e67204341301e170d31" "30303130313036303030305a170d3332313230313036303030305a30373112301006035504" @@ -137,7 +138,7 @@ const char kFakeOCSPResponseCert[] = "83203425fd706b4fc5e797002af3d88151be5901eef56ec30aacdfc404be1bd35865ff1943" "2516"; -const char kFakeOCSPResponseIssuerCert[] = +constexpr char kFakeOCSPResponseIssuerCert[] = "308201d13082013aa003020102020101300d06092a864886f70d0101050500301531133011" "0603550403130a54657374696e67204341301e170d3130303130313036303030305a170d33" "32313230313036303030305a3015311330110603550403130a54657374696e672043413081" @@ -152,16 +153,18 @@ const char kFakeOCSPResponseIssuerCert[] = "3ea1e11df2ccb357a5fed5220f9c6239e8946b9b7517707631d51ab996833d58a022cff5a6" "2169ac9258ec110efee78da9ab4a641e3b3c9ee5e8bd291460"; -const char kFakeOCSPExtensionValue[] = "74657374"; // "test" +constexpr char kFakeOCSPExtensionValue[] = "74657374"; // "test" // For the sample STH -const char kSampleSTHSHA256RootHash[] = - "726467216167397babca293dca398e4ce6b621b18b9bc42f30c900d1f92ac1e4"; -const char kSampleSTHTreeHeadSignature[] = +constexpr std::array kSampleSTHSHA256RootHash = { + 0x72, 0x64, 0x67, 0x21, 0x61, 0x67, 0x39, 0x7b, 0xab, 0xca, 0x29, + 0x3d, 0xca, 0x39, 0x8e, 0x4c, 0xe6, 0xb6, 0x21, 0xb1, 0x8b, 0x9b, + 0xc4, 0x2f, 0x30, 0xc9, 0x00, 0xd1, 0xf9, 0x2a, 0xc1, 0xe4}; +constexpr char kSampleSTHTreeHeadSignature[] = "0403004730450220365a91a2a88f2b9332f41d8959fa7086da7e6d634b7b089bc9da066426" "6c7a20022100e38464f3c0fd066257b982074f7ac87655e0c8f714768a050b4be9a7b441cb" "d3"; -size_t kSampleSTHTreeSize = 21u; +constexpr size_t kSampleSTHTreeSize = 21u; } // namespace @@ -270,9 +273,7 @@ bool GetSampleSignedTreeHead(SignedTreeHead* sth) { sth->version = SignedTreeHead::V1; sth->timestamp = base::Time::UnixEpoch() + base::Milliseconds(kTestTimestamp); sth->tree_size = kSampleSTHTreeSize; - std::string sha256_root_hash = GetSampleSTHSHA256RootHash(); - UNSAFE_TODO(memcpy(sth->sha256_root_hash, sha256_root_hash.c_str(), - kSthRootHashLength)); + sth->sha256_root_hash = GetSampleSTHSHA256RootHash(); sth->log_id = GetTestPublicKeyId(); return GetSampleSTHTreeHeadDecodedSignature(&(sth->signature)); @@ -283,10 +284,11 @@ bool GetSampleEmptySignedTreeHead(SignedTreeHead* sth) { sth->timestamp = base::Time::UnixEpoch() + base::Milliseconds(INT64_C(1450443594920)); sth->tree_size = 0; - std::string empty_root_hash = HexDecode( - "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); - UNSAFE_TODO(memcpy(sth->sha256_root_hash, empty_root_hash.c_str(), - kSthRootHashLength)); + const std::array kEmptySTHSHA256RootHash = { + {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, + 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, + 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}}; + sth->sha256_root_hash = kEmptySTHSHA256RootHash; sth->log_id = GetTestPublicKeyId(); std::string tree_head_signature = HexDecode( @@ -302,7 +304,7 @@ bool GetBadEmptySignedTreeHead(SignedTreeHead* sth) { sth->timestamp = base::Time::UnixEpoch() + base::Milliseconds(INT64_C(1450870952897)); sth->tree_size = 0; - UNSAFE_TODO(memset(sth->sha256_root_hash, 'f', kSthRootHashLength)); + sth->sha256_root_hash.fill('f'); sth->log_id = GetTestPublicKeyId(); std::string tree_head_signature = HexDecode( @@ -313,8 +315,8 @@ bool GetBadEmptySignedTreeHead(SignedTreeHead* sth) { return DecodeDigitallySigned(&sp, &(sth->signature)) && sp.empty(); } -std::string GetSampleSTHSHA256RootHash() { - return HexDecode(kSampleSTHSHA256RootHash); +const std::array& GetSampleSTHSHA256RootHash() { + return kSampleSTHSHA256RootHash; } std::string GetSampleSTHTreeHeadSignature() { @@ -333,10 +335,11 @@ std::string GetSampleSTHAsJson() { GetSampleSTHTreeHeadSignature()); } -std::string CreateSignedTreeHeadJsonString(size_t tree_size, - int64_t timestamp, - std::string sha256_root_hash, - std::string tree_head_signature) { +std::string CreateSignedTreeHeadJsonString( + size_t tree_size, + int64_t timestamp, + base::span sha256_root_hash, + std::string_view tree_head_signature) { std::string sth_json = std::string("{\"tree_size\":") + base::NumberToString(tree_size) + std::string(",\"timestamp\":") + base::NumberToString(timestamp); diff --git a/naiveproxy/src/net/test/ct_test_util.h b/naiveproxy/src/net/test/ct_test_util.h index 622cf34892..5f5741dbcc 100644 --- a/naiveproxy/src/net/test/ct_test_util.h +++ b/naiveproxy/src/net/test/ct_test_util.h @@ -8,12 +8,15 @@ #include #include +#include #include #include +#include "base/containers/span.h" #include "base/memory/scoped_refptr.h" #include "net/cert/signed_certificate_timestamp.h" #include "net/cert/signed_certificate_timestamp_and_status.h" +#include "net/cert/signed_tree_head.h" namespace net::ct { @@ -86,7 +89,7 @@ bool GetSampleEmptySignedTreeHead(SignedTreeHead* sth); bool GetBadEmptySignedTreeHead(SignedTreeHead* sth); // The SHA256 root hash for the sample STH. -std::string GetSampleSTHSHA256RootHash(); +const std::array& GetSampleSTHSHA256RootHash(); // The tree head signature for the sample STH. std::string GetSampleSTHTreeHeadSignature(); @@ -99,10 +102,11 @@ std::string GetSampleSTHAsJson(); // Assembles, and returns, a sample STH in JSON format using // the provided parameters. -std::string CreateSignedTreeHeadJsonString(size_t tree_size, - int64_t timestamp, - std::string sha256_root_hash, - std::string tree_head_signature); +std::string CreateSignedTreeHeadJsonString( + size_t tree_size, + int64_t timestamp, + base::span sha256_root_hash, + std::string_view tree_head_signature); // Assembles, and returns, a sample consistency proof in JSON format using // the provided raw nodes (i.e. the raw nodes will be base64-encoded). diff --git a/naiveproxy/src/net/test/embedded_test_server/android/embedded_test_server_android.cc b/naiveproxy/src/net/test/embedded_test_server/android/embedded_test_server_android.cc index 7ad04c8de9..328f99ef95 100644 --- a/naiveproxy/src/net/test/embedded_test_server/android/embedded_test_server_android.cc +++ b/naiveproxy/src/net/test/embedded_test_server/android/embedded_test_server_android.cc @@ -40,9 +40,6 @@ void EmbeddedTestServerAndroid::ConnectionListener::ReadFromSocket( test_server_android_->ReadFromSocket(static_cast(&socket)); } -void EmbeddedTestServerAndroid::ConnectionListener:: - OnResponseCompletedSuccessfully(std::unique_ptr socket) {} - EmbeddedTestServerAndroid::EmbeddedTestServerAndroid( JNIEnv* env, const JavaRef& jobj, diff --git a/naiveproxy/src/net/test/embedded_test_server/android/embedded_test_server_android.h b/naiveproxy/src/net/test/embedded_test_server/android/embedded_test_server_android.h index 043ac51d86..299bc4342f 100644 --- a/naiveproxy/src/net/test/embedded_test_server/android/embedded_test_server_android.h +++ b/naiveproxy/src/net/test/embedded_test_server/android/embedded_test_server_android.h @@ -78,8 +78,6 @@ class EmbeddedTestServerAndroid { std::unique_ptr AcceptedSocket( std::unique_ptr socket) override; void ReadFromSocket(const StreamSocket& socket, int rv) override; - void OnResponseCompletedSuccessfully( - std::unique_ptr socket) override; private: raw_ptr test_server_android_; diff --git a/naiveproxy/src/net/test/embedded_test_server/default_handlers.cc b/naiveproxy/src/net/test/embedded_test_server/default_handlers.cc index f46cfda6fb..64198b550b 100644 --- a/naiveproxy/src/net/test/embedded_test_server/default_handlers.cc +++ b/naiveproxy/src/net/test/embedded_test_server/default_handlers.cc @@ -224,10 +224,10 @@ std::unique_ptr HandleEchoAll(const HttpRequest& request) { http_response->set_content_type("text/html"); http_response->set_content(body); - if (request.GetURL().path_piece().ends_with("/nocache")) { + if (request.GetURL().path().ends_with("/nocache")) { http_response->AddCustomHeader("Cache-Control", "no-cache, no-store, must-revalidate"); - } else if (request.GetURL().path_piece().ends_with("/cache")) { + } else if (request.GetURL().path().ends_with("/cache")) { http_response->AddCustomHeader("Cache-Control", "max-age=3600"); } @@ -237,7 +237,7 @@ std::unique_ptr HandleEchoAll(const HttpRequest& request) { // /echo-raw // Returns the query string as the raw response (no HTTP headers). std::unique_ptr HandleEchoRaw(const HttpRequest& request) { - return std::make_unique("", request.GetURL().query()); + return std::make_unique("", request.GetURL().GetQuery()); } // /set-cookie?COOKIES @@ -248,8 +248,9 @@ std::unique_ptr HandleSetCookie(const HttpRequest& request) { std::string content; GURL request_url = request.GetURL(); if (request_url.has_query()) { - std::vector cookies = base::SplitString( - request_url.query(), "&", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + std::vector cookies = + base::SplitString(request_url.GetQuery(), "&", base::KEEP_WHITESPACE, + base::SPLIT_WANT_ALL); for (const auto& cookie : cookies) { http_response->AddCustomHeader("Set-Cookie", cookie); content += cookie; @@ -394,7 +395,7 @@ std::unique_ptr HandleSetHeaderWithFile( base::FilePath server_root; base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &server_root); base::FilePath file_path = - server_root.AppendASCII(request_url.path().substr(prefix.size() + 1)); + server_root.AppendASCII(request_url.GetPath().substr(prefix.size() + 1)); std::string file_content; CHECK(base::ReadFileToString(file_path, &file_content)); http_response->set_content(file_content); @@ -419,7 +420,7 @@ std::unique_ptr HandleIframe(const HttpRequest& request) { GURL iframe_url("about:blank"); if (request_url.has_query()) { - iframe_url = GURL(base::UnescapeBinaryURLComponent(request_url.query())); + iframe_url = GURL(base::UnescapeBinaryURLComponent(request_url.GetQuery())); } http_response->set_content(base::StringPrintf( @@ -648,8 +649,7 @@ std::unique_ptr HandleServerRedirect(HttpStatusCode redirect_code, bool allow_cors, const HttpRequest& request) { GURL request_url = request.GetURL(); - std::string dest = - base::UnescapeBinaryURLComponent(request_url.query_piece()); + std::string dest = base::UnescapeBinaryURLComponent(request_url.query()); RequestQuery query = ParseQuery(request_url); if (request.method == METHOD_OPTIONS) { @@ -680,8 +680,7 @@ std::unique_ptr HandleServerRedirectWithCookie( HttpStatusCode redirect_code, const HttpRequest& request) { GURL request_url = request.GetURL(); - std::string dest = - base::UnescapeBinaryURLComponent(request_url.query_piece()); + std::string dest = base::UnescapeBinaryURLComponent(request_url.query()); RequestQuery query = ParseQuery(request_url); auto http_response = std::make_unique(); @@ -701,8 +700,7 @@ std::unique_ptr HandleServerRedirectWithSecureCookie( HttpStatusCode redirect_code, const HttpRequest& request) { GURL request_url = request.GetURL(); - std::string dest = - base::UnescapeBinaryURLComponent(request_url.query_piece()); + std::string dest = base::UnescapeBinaryURLComponent(request_url.query()); RequestQuery query = ParseQuery(request_url); auto http_response = std::make_unique(); @@ -752,8 +750,7 @@ std::unique_ptr HandleCrossSiteRedirect( // Returns a meta redirect to URL. std::unique_ptr HandleClientRedirect(const HttpRequest& request) { GURL request_url = request.GetURL(); - std::string dest = - base::UnescapeBinaryURLComponent(request_url.query_piece()); + std::string dest = base::UnescapeBinaryURLComponent(request_url.query()); auto http_response = std::make_unique(); http_response->set_content_type("text/html"); @@ -782,7 +779,7 @@ std::unique_ptr HandleSlowServer(const HttpRequest& request) { GURL request_url = request.GetURL(); if (request_url.has_query()) - delay = std::atof(request_url.query().c_str()); + delay = std::atof(request_url.GetQuery().c_str()); auto http_response = std::make_unique(base::Seconds(delay)); @@ -851,7 +848,7 @@ std::unique_ptr HandleExabyteResponse( // Returns a response with a gzipped body of "". Attempts to allocate // enough memory to contain the body, but DCHECKs if that fails. std::unique_ptr HandleGzipBody(const HttpRequest& request) { - std::string uncompressed_body = request.GetURL().query(); + std::string uncompressed_body = request.GetURL().GetQuery(); auto compressed_body = CompressGzip(uncompressed_body); auto http_response = std::make_unique(); diff --git a/naiveproxy/src/net/test/embedded_test_server/embedded_test_server.cc b/naiveproxy/src/net/test/embedded_test_server/embedded_test_server.cc index 80d0f7c615..71e213a779 100644 --- a/naiveproxy/src/net/test/embedded_test_server/embedded_test_server.cc +++ b/naiveproxy/src/net/test/embedded_test_server/embedded_test_server.cc @@ -10,8 +10,10 @@ #include #include #include +#include #include "base/containers/span.h" +#include "base/containers/to_vector.h" #include "base/files/file_path.h" #include "base/functional/bind.h" #include "base/functional/callback_forward.h" @@ -30,7 +32,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/test/bind.h" #include "base/threading/thread_restrictions.h" -#include "crypto/rsa_private_key.h" #include "net/base/hex_utils.h" #include "net/base/ip_address.h" #include "net/base/ip_endpoint.h" @@ -69,8 +70,9 @@ std::unique_ptr ServeResponseForPath( const std::string& content_type, const std::string& content, const HttpRequest& request) { - if (request.GetURL().path() != expected_path) + if (request.GetURL().GetPath() != expected_path) { return nullptr; + } auto http_response = std::make_unique(); http_response->set_code(status_code); @@ -87,8 +89,8 @@ std::unique_ptr ServeResponseForSubPaths( const std::string& content_type, const std::string& content, const HttpRequest& request) { - if (request.GetURL().path() != expected_path && - !request.GetURL().path().starts_with(expected_path + "/")) { + if (request.GetURL().GetPath() != expected_path && + !request.GetURL().GetPath().starts_with(expected_path + "/")) { return nullptr; } @@ -281,6 +283,12 @@ EmbeddedTestServer::ServerCertificateConfig& EmbeddedTestServer::ServerCertificateConfig::operator=( ServerCertificateConfig&&) = default; +EmbeddedTestServer::Credential::Credential() = default; +EmbeddedTestServer::Credential::Credential(Credential&& other) = default; +EmbeddedTestServer::Credential::~Credential() = default; +EmbeddedTestServer::Credential& EmbeddedTestServer::Credential::operator=( + Credential&& other) = default; + EmbeddedTestServer::EmbeddedTestServer() : EmbeddedTestServer(TYPE_HTTP) {} EmbeddedTestServer::EmbeddedTestServer(Type type, @@ -396,36 +404,82 @@ bool EmbeddedTestServer::UsingStaticCert() const { return !GetCertificateName().empty(); } -bool EmbeddedTestServer::InitializeCertAndKeyFromFile() { +std::vector +EmbeddedTestServer::InitializeCertAndKeyFromFile() { base::ScopedAllowBlockingForTesting allow_blocking; base::FilePath certs_dir(GetTestCertsDirectory()); std::string cert_name = GetCertificateName(); - if (cert_name.empty()) - return false; + if (cert_name.empty()) { + return {}; + } - x509_cert_ = CreateCertificateChainFromFile(certs_dir, cert_name, - X509Certificate::FORMAT_AUTO); - if (!x509_cert_) - return false; + Credential credential; + SSLServerCredential ssl_server_credential; - private_key_ = + credential.x509_cert = CreateCertificateChainFromFile( + certs_dir, cert_name, X509Certificate::FORMAT_AUTO); + if (!credential.x509_cert) { + return {}; + } + + ssl_server_credential.cert_chain = credential.x509_cert->CopyCertBuffers(); + + ssl_server_credential.pkey = key_util::LoadEVP_PKEYFromPEM(certs_dir.AppendASCII(cert_name)); - return !!private_key_; + + if (!ssl_server_credential.pkey) { + return {}; + } + + credentials_.clear(); + credentials_.push_back(std::move(credential)); + + std::vector ssl_server_credentials; + ssl_server_credentials.push_back(std::move(ssl_server_credential)); + return ssl_server_credentials; } -bool EmbeddedTestServer::GenerateCertAndKey() { +std::vector EmbeddedTestServer::GenerateCertAndKeys() { + std::vector ssl_server_credentials; + // Create AIA server and start listening. Need to have the socket initialized // so the URL can be put in the AIA records of the generated certs. aia_http_server_ = std::make_unique(TYPE_HTTP); - if (!aia_http_server_->InitializeAndListen()) - return false; + if (!aia_http_server_->InitializeAndListen()) { + return {}; + } + credentials_.clear(); + for (const auto& config : cert_configs_) { + std::optional credential = GenerateCertAndKey(config); + if (!credential.has_value()) { + return {}; + } + credentials_.push_back(std::move(credential->credential)); + ssl_server_credentials.push_back(std::move(credential->ssl_credential)); + } + + // If this server is already accepting connections but is being reconfigured, + // start the new AIA server now. Otherwise, wait until + // `StartAcceptingConnections` so that this server and the AIA server start + // at the same time. (If the test only called InitializeAndListen they expect + // no threads to be created yet.) + if (io_thread_) { + aia_http_server_->StartAcceptingConnections(); + } + + return ssl_server_credentials; +} + +std::optional +EmbeddedTestServer::GenerateCertAndKey( + const ServerCertificateConfig& cert_config) { base::ScopedAllowBlockingForTesting allow_blocking; base::FilePath certs_dir(GetTestCertsDirectory()); auto now = base::Time::Now(); std::unique_ptr root; - switch (cert_config_.root) { + switch (cert_config.root) { case RootType::kTestRootCa: root = CertBuilder::FromStaticCertFile( certs_dir.AppendASCII("root_ca_cert.pem")); @@ -436,17 +490,17 @@ bool EmbeddedTestServer::GenerateCertAndKey() { root->SetBasicConstraints(/*is_ca=*/true, /*path_len=*/-1); root->SetKeyUsages( {bssl::KEY_USAGE_BIT_KEY_CERT_SIGN, bssl::KEY_USAGE_BIT_CRL_SIGN}); - if (!cert_config_.root_dns_names.empty()) { - root->SetSubjectAltNames(cert_config_.root_dns_names, {}); + if (!cert_config.root_dns_names.empty()) { + root->SetSubjectAltNames(cert_config.root_dns_names, {}); } break; } - // Will be nullptr if cert_config_.intermediate == kNone. + // Will be nullptr if cert_config.intermediate == kNone. std::unique_ptr intermediate; std::unique_ptr leaf; - if (cert_config_.intermediate != IntermediateType::kNone) { + if (cert_config.intermediate != IntermediateType::kNone) { intermediate = std::make_unique(nullptr, root.get()); intermediate->SetValidity(now - base::Days(100), now + base::Days(1000)); intermediate->SetBasicConstraints(/*is_ca=*/true, /*path_len=*/-1); @@ -461,37 +515,37 @@ bool EmbeddedTestServer::GenerateCertAndKey() { std::vector leaf_ocsp_urls; leaf->SetValidity(now - base::Days(1), now + base::Days(20)); - leaf->SetBasicConstraints(/*is_ca=*/cert_config_.leaf_is_ca, /*path_len=*/-1); + leaf->SetBasicConstraints(/*is_ca=*/cert_config.leaf_is_ca, /*path_len=*/-1); leaf->SetExtendedKeyUsages({bssl::der::Input(bssl::kServerAuth)}); - if (!cert_config_.subject_tlv.empty()) { - leaf->SetSubjectTLV(cert_config_.subject_tlv); + if (!cert_config.subject_tlv.empty()) { + leaf->SetSubjectTLV(cert_config.subject_tlv); } - if (!cert_config_.policy_oids.empty()) { - leaf->SetCertificatePolicies(cert_config_.policy_oids); + if (!cert_config.policy_oids.empty()) { + leaf->SetCertificatePolicies(cert_config.policy_oids); if (intermediate) - intermediate->SetCertificatePolicies(cert_config_.policy_oids); + intermediate->SetCertificatePolicies(cert_config.policy_oids); } - if (!cert_config_.qwac_qc_types.empty()) { - leaf->SetQwacQcStatements(cert_config_.qwac_qc_types); + if (!cert_config.qwac_qc_types.empty()) { + leaf->SetQwacQcStatements(cert_config.qwac_qc_types); } - if (!cert_config_.dns_names.empty() || !cert_config_.ip_addresses.empty()) { - leaf->SetSubjectAltNames(cert_config_.dns_names, cert_config_.ip_addresses); + if (!cert_config.dns_names.empty() || !cert_config.ip_addresses.empty()) { + leaf->SetSubjectAltNames(cert_config.dns_names, cert_config.ip_addresses); } else { leaf->SetSubjectAltNames({}, {net::IPAddress::IPv4Localhost()}); } - if (!cert_config_.key_usages.empty()) { - leaf->SetKeyUsages(cert_config_.key_usages); + if (!cert_config.key_usages.empty()) { + leaf->SetKeyUsages(cert_config.key_usages); } else { leaf->SetKeyUsages({bssl::KEY_USAGE_BIT_DIGITAL_SIGNATURE}); } - if (!cert_config_.embedded_scts.empty()) { - leaf->SetSctConfig(cert_config_.embedded_scts); + if (!cert_config.embedded_scts.empty()) { + leaf->SetSctConfig(cert_config.embedded_scts); } const std::string leaf_serial_text = @@ -500,9 +554,9 @@ bool EmbeddedTestServer::GenerateCertAndKey() { intermediate ? base::NumberToString(intermediate->GetSerialNumber()) : ""; std::string ocsp_response; - if (!MaybeCreateOCSPResponse(leaf.get(), cert_config_.ocsp_config, + if (!MaybeCreateOCSPResponse(leaf.get(), cert_config.ocsp_config, &ocsp_response)) { - return false; + return std::nullopt; } if (!ocsp_response.empty()) { std::string ocsp_path = "/ocsp/" + leaf_serial_text; @@ -513,20 +567,16 @@ bool EmbeddedTestServer::GenerateCertAndKey() { } std::string stapled_ocsp_response; - if (!MaybeCreateOCSPResponse(leaf.get(), cert_config_.stapled_ocsp_config, + if (!MaybeCreateOCSPResponse(leaf.get(), cert_config.stapled_ocsp_config, &stapled_ocsp_response)) { - return false; - } - if (!stapled_ocsp_response.empty()) { - ssl_config_.ocsp_response = std::vector( - stapled_ocsp_response.begin(), stapled_ocsp_response.end()); + return std::nullopt; } std::string intermediate_ocsp_response; if (!MaybeCreateOCSPResponse(intermediate.get(), - cert_config_.intermediate_ocsp_config, + cert_config.intermediate_ocsp_config, &intermediate_ocsp_response)) { - return false; + return std::nullopt; } if (!intermediate_ocsp_response.empty()) { std::string intermediate_ocsp_path = "/ocsp/" + intermediate_serial_text; @@ -537,7 +587,7 @@ bool EmbeddedTestServer::GenerateCertAndKey() { "application/ocsp-response", intermediate_ocsp_response)); } - if (cert_config_.intermediate == IntermediateType::kByAIA) { + if (cert_config.intermediate == IntermediateType::kByAIA) { std::string ca_issuers_path = "/ca_issuers/" + intermediate_serial_text; leaf_ca_issuers_urls.push_back(aia_http_server_->GetURL(ca_issuers_path)); @@ -551,43 +601,53 @@ bool EmbeddedTestServer::GenerateCertAndKey() { leaf->SetCaIssuersAndOCSPUrls(leaf_ca_issuers_urls, leaf_ocsp_urls); } - cert_chain_.push_back(leaf->DupCertBuffer()); - if (cert_config_.intermediate == IntermediateType::kInHandshake) { + Credential credential; + SSLServerCredential ssl_server_credential; + + if (!stapled_ocsp_response.empty()) { + ssl_server_credential.ocsp_response = + base::ToVector(base::as_byte_span(stapled_ocsp_response)); + } + + ssl_server_credential.trust_anchor_id = cert_config.trust_anchor_id; + ssl_server_credential.signed_cert_timestamp_list = + cert_config.tls_signed_cert_timestamp_list; + ssl_server_credential.signature_algorithm_for_testing = + cert_config.signature_algorithm_for_testing; + + ssl_server_credential.cert_chain.push_back(leaf->DupCertBuffer()); + if (cert_config.intermediate == IntermediateType::kInHandshake) { // Server certificate chain will include the intermediate. - x509_cert_ = leaf->GetX509CertificateChain(); - cert_chain_.push_back(intermediate->DupCertBuffer()); + credential.x509_cert = leaf->GetX509CertificateChain(); + ssl_server_credential.cert_chain.push_back(intermediate->DupCertBuffer()); } else { // Server certificate chain does not include the intermediate (if any). - x509_cert_ = leaf->GetX509Certificate(); + credential.x509_cert = leaf->GetX509Certificate(); } if (intermediate) { - intermediate_ = intermediate->GetX509Certificate(); + credential.intermediate = intermediate->GetX509Certificate(); } - root_ = root->GetX509Certificate(); + credential.root = root->GetX509Certificate(); - private_key_ = bssl::UpRef(leaf->GetKey()); + ssl_server_credential.pkey = bssl::UpRef(leaf->GetKey()); - // If this server is already accepting connections but is being reconfigured, - // start the new AIA server now. Otherwise, wait until - // StartAcceptingConnections so that this server and the AIA server start at - // the same time. (If the test only called InitializeAndListen they expect no - // threads to be created yet.) - if (io_thread_) - aia_http_server_->StartAcceptingConnections(); - - return true; + return CredentialPair{.credential = std::move(credential), + .ssl_credential = std::move(ssl_server_credential)}; } bool EmbeddedTestServer::InitializeSSLServerContext() { + std::vector ssl_server_credentials; if (UsingStaticCert()) { - if (!InitializeCertAndKeyFromFile()) { + ssl_server_credentials = InitializeCertAndKeyFromFile(); + if (ssl_server_credentials.empty()) { LOG(ERROR) << "Unable to initialize cert and key from file"; return false; } } else { - if (!GenerateCertAndKey()) { + ssl_server_credentials = GenerateCertAndKeys(); + if (ssl_server_credentials.empty()) { LOG(ERROR) << "Unable to generate cert and key"; return false; } @@ -650,13 +710,8 @@ bool EmbeddedTestServer::InitializeSSLServerContext() { } } - if (!cert_chain_.empty()) { - context_ = - CreateSSLServerContext(cert_chain_, private_key_.get(), ssl_config_); - } else { - context_ = CreateSSLServerContext(x509_cert_.get(), private_key_.get(), - ssl_config_); - } + context_ = + CreateSSLServerContext(std::move(ssl_server_credentials), ssl_config_); return true; } @@ -839,35 +894,45 @@ std::string EmbeddedTestServer::GetIPLiteralString() const { void EmbeddedTestServer::SetSSLConfigInternal( ServerCertificate cert, - const ServerCertificateConfig* cert_config, + base::span cert_configs, const SSLServerConfig& ssl_config) { DCHECK(!Started()); cert_ = cert; - DCHECK(!cert_config || cert == CERT_AUTO); - cert_config_ = cert_config ? *cert_config : ServerCertificateConfig(); - x509_cert_ = nullptr; - private_key_ = nullptr; + DCHECK(cert_configs.empty() || cert == CERT_AUTO); + if (!cert_configs.empty()) { + cert_configs_ = base::ToVector(cert_configs); + } else { + cert_configs_ = {ServerCertificateConfig()}; + } + credentials_.clear(); ssl_config_ = ssl_config; } void EmbeddedTestServer::SetSSLConfig(ServerCertificate cert, const SSLServerConfig& ssl_config) { - SetSSLConfigInternal(cert, /*cert_config=*/nullptr, ssl_config); + SetSSLConfigInternal(cert, /*cert_configs=*/{}, ssl_config); } void EmbeddedTestServer::SetSSLConfig(ServerCertificate cert) { - SetSSLConfigInternal(cert, /*cert_config=*/nullptr, SSLServerConfig()); + SetSSLConfigInternal(cert, /*cert_configs=*/{}, SSLServerConfig()); } void EmbeddedTestServer::SetSSLConfig( const ServerCertificateConfig& cert_config, const SSLServerConfig& ssl_config) { - SetSSLConfigInternal(CERT_AUTO, &cert_config, ssl_config); + SetSSLConfigInternal(CERT_AUTO, base::span_from_ref(cert_config), ssl_config); } void EmbeddedTestServer::SetSSLConfig( const ServerCertificateConfig& cert_config) { - SetSSLConfigInternal(CERT_AUTO, &cert_config, SSLServerConfig()); + SetSSLConfigInternal(CERT_AUTO, base::span_from_ref(cert_config), + SSLServerConfig()); +} + +void EmbeddedTestServer::SetSSLConfig( + base::span cert_configs, + const SSLServerConfig& ssl_config) { + SetSSLConfigInternal(CERT_AUTO, cert_configs, ssl_config); } void EmbeddedTestServer::SetCertHostnames(std::vector hostnames) { @@ -881,7 +946,7 @@ bool EmbeddedTestServer::ResetSSLConfigOnIOThread( ServerCertificate cert, const SSLServerConfig& ssl_config) { cert_ = cert; - cert_config_ = ServerCertificateConfig(); + cert_configs_ = {ServerCertificateConfig()}; ssl_config_ = ssl_config; connections_.clear(); return InitializeSSLServerContext(); @@ -927,9 +992,10 @@ std::string EmbeddedTestServer::GetCertificateName() const { return "ok_cert.pem"; } -scoped_refptr EmbeddedTestServer::GetCertificate() { +scoped_refptr EmbeddedTestServer::GetCertificate( + size_t credential_num) { DCHECK(is_using_ssl_); - if (!x509_cert_) { + if (credentials_.empty()) { // Some tests want to get the certificate before the server has been // initialized, so load it now if necessary. This is only possible if using // a static certificate. @@ -938,20 +1004,31 @@ scoped_refptr EmbeddedTestServer::GetCertificate() { CHECK(UsingStaticCert()); // TODO(mattm): change contract to return nullptr on error instead of // CHECKing, update callers. - CHECK(InitializeCertAndKeyFromFile()); + CHECK(!InitializeCertAndKeyFromFile().empty()); } - return x509_cert_; + if (credential_num >= credentials_.size()) { + return nullptr; + } + return credentials_[credential_num].x509_cert; } -scoped_refptr EmbeddedTestServer::GetGeneratedIntermediate() { +scoped_refptr EmbeddedTestServer::GetGeneratedIntermediate( + size_t credential_num) { DCHECK(is_using_ssl_); DCHECK(!UsingStaticCert()); - return intermediate_; + if (credential_num >= credentials_.size()) { + return nullptr; + } + return credentials_[credential_num].intermediate; } -scoped_refptr EmbeddedTestServer::GetRoot() { +scoped_refptr EmbeddedTestServer::GetRoot( + size_t credential_num) { DCHECK(is_using_ssl_); - return root_; + if (credential_num >= credentials_.size()) { + return nullptr; + } + return credentials_[credential_num].root; } void EmbeddedTestServer::ServeFilesFromDirectory( @@ -1128,16 +1205,9 @@ HttpConnection* EmbeddedTestServer::AddConnection( void EmbeddedTestServer::RemoveConnection( HttpConnection* connection, EmbeddedTestServerConnectionListener* listener) { - DCHECK(io_thread_->task_runner()->BelongsToCurrentThread()); - DCHECK(connection); - DCHECK_EQ(1u, connections_.count(connection->Socket())); - - StreamSocket* raw_socket = connection->Socket(); - std::unique_ptr socket = connection->TakeSocket(); - connections_.erase(raw_socket); - - if (listener && socket && socket->IsConnected()) - listener->OnResponseCompletedSuccessfully(std::move(socket)); + CHECK(io_thread_->task_runner()->BelongsToCurrentThread()); + CHECK(connection); + CHECK_EQ(1u, connections_.erase(connection->Socket())); } bool EmbeddedTestServer::PostTaskToIOThreadAndWait(base::OnceClosure closure) { diff --git a/naiveproxy/src/net/test/embedded_test_server/embedded_test_server.h b/naiveproxy/src/net/test/embedded_test_server/embedded_test_server.h index be088a375c..19817592a2 100644 --- a/naiveproxy/src/net/test/embedded_test_server/embedded_test_server.h +++ b/naiveproxy/src/net/test/embedded_test_server/embedded_test_server.h @@ -355,12 +355,27 @@ class EmbeddedTestServer { // Generate embedded SCTList in the certificate for the specified logs. std::vector embedded_scts; + // If non-empty, the serialized SignedCertificateTimestampList to send in + // the handshake. (This isn't particularly useful, but is only used by one + // low-level test. If we wanted to test the TLS SCT support that can + // actually verify successfully, we could use SctConfigs here too?) + std::vector tls_signed_cert_timestamp_list; + // If non-empty, raw bytes to use as the leaf subject. If empty, a random // valid subject will be generated. // (This can be used for testing behavior with invalid or weird encodings, // if we need tests to set specific subjects for more normal cases, we // should consider adding a more ergonomic API for that.) std::vector subject_tlv; + + // If non-empty, the TLS Trust Anchor Identifier of this credential. If + // specified, this credential will only be used if the client requested + // a matching id. + std::vector trust_anchor_id; + + // If set, causes the server to only support the specified signature + // algorithm for this credential in TLS 1.2 and below. + std::optional signature_algorithm_for_testing; }; using UpgradeResultOrHttpResponse = @@ -501,6 +516,8 @@ class EmbeddedTestServer { void SetSSLConfig(const ServerCertificateConfig& cert_config, const SSLServerConfig& ssl_config); void SetSSLConfig(const ServerCertificateConfig& cert_config); + void SetSSLConfig(base::span cert_configs, + const SSLServerConfig& ssl_config); // TODO(mattm): make this [[nodiscard]] bool ResetSSLConfig(ServerCertificate cert, @@ -515,19 +532,21 @@ class EmbeddedTestServer { /// up a full config using SetSSLConfig(). void SetCertHostnames(std::vector hostnames); - // Returns the certificate that the server is using. + // Returns the certificate that the server is using. Includes intermediates + // that are served in the handshake, if any. // If using a generated ServerCertificate type, this must not be called before // InitializeAndListen() has been called. - scoped_refptr GetCertificate(); + scoped_refptr GetCertificate(size_t credential_num = 0); // Returns any generated intermediates that the server may be using. May // return null if no intermediate is generated. Must not be called before // InitializeAndListen(). - scoped_refptr GetGeneratedIntermediate(); + scoped_refptr GetGeneratedIntermediate( + size_t credential_num = 0); // Returns the root certificate that issued the certificate the server is // using. Must not be called before InitializeAndListen(). - scoped_refptr GetRoot(); + scoped_refptr GetRoot(size_t credential_num = 0); // Registers request handler which serves files from |directory|. // For instance, a request to "/foo.html" is served by "foo.html" under @@ -631,6 +650,25 @@ class EmbeddedTestServer { base::OnceClosure closure); private: + struct Credential { + Credential(); + Credential(Credential&& other); + Credential& operator=(Credential&& other); + ~Credential(); + + // The certificate chain that will be served for this credential. Includes + // the leaf, and the intermediate if there is an intermediate being served + // in the handshake. + // May be null if the generated leaf certificate cannot be parsed as an + // X509Certificate. + scoped_refptr x509_cert; + + // May be null if no intermediate is generated. + scoped_refptr intermediate; + + scoped_refptr root; + }; + // Returns the file name of the certificate the server is using. The test // certificates can be found in net/data/ssl/certificates/. std::string GetCertificateName() const; @@ -639,10 +677,11 @@ class EmbeddedTestServer { void ShutdownOnIOThread(); // Sets the SSL configuration for the server. It is invalid for |cert_config| - // to be non-null if |cert| is not CERT_AUTO. - void SetSSLConfigInternal(ServerCertificate cert, - const ServerCertificateConfig* cert_config, - const SSLServerConfig& ssl_config); + // to be non-empty if |cert| is not CERT_AUTO. + void SetSSLConfigInternal( + ServerCertificate cert, + base::span cert_configs, + const SSLServerConfig& ssl_config); // Resets the SSLServerConfig on the IO thread. bool ResetSSLConfigOnIOThread(ServerCertificate cert, @@ -679,12 +718,22 @@ class EmbeddedTestServer { bool UsingStaticCert() const; // Reads server certificate and private key from file. May only be called if - // |cert_| refers to a file-based cert & key. - [[nodiscard]] bool InitializeCertAndKeyFromFile(); + // |cert_| refers to a file-based cert & key. Returns empty vector on error. + [[nodiscard]] + std::vector InitializeCertAndKeyFromFile(); - // Generate server certificate and private key. May only be called if |cert_| - // refers to a generated cert & key. - [[nodiscard]] bool GenerateCertAndKey(); + // Generate all server certificates and private keys. May only be called if + // |cert_| refers to a generated cert & key. Returns empty vector on error. + [[nodiscard]] + std::vector GenerateCertAndKeys(); + + // Generate and return a single credential for the given certificate config. + struct CredentialPair { + Credential credential; + SSLServerCredential ssl_credential; + }; + std::optional GenerateCertAndKey( + const ServerCertificateConfig& cert_config); // Initializes the SSLServerContext so that SSLServerSocket connections may // share the same cache @@ -735,14 +784,8 @@ class EmbeddedTestServer { ScopedTestRoot scoped_test_root_; net::SSLServerConfig ssl_config_; ServerCertificate cert_ = CERT_OK; - ServerCertificateConfig cert_config_; - // If non-empty, will be used instead of `x509_cert_`. - std::vector> cert_chain_; - scoped_refptr x509_cert_; - // May be null if no intermediate is generated. - scoped_refptr intermediate_; - scoped_refptr root_; - bssl::UniquePtr private_key_; + std::vector cert_configs_; + std::vector credentials_; base::flat_map alps_accept_ch_; std::unique_ptr context_; diff --git a/naiveproxy/src/net/test/embedded_test_server/embedded_test_server_connection_listener.cc b/naiveproxy/src/net/test/embedded_test_server/embedded_test_server_connection_listener.cc index 1d7af2a93e..ad7f895c7c 100644 --- a/naiveproxy/src/net/test/embedded_test_server/embedded_test_server_connection_listener.cc +++ b/naiveproxy/src/net/test/embedded_test_server/embedded_test_server_connection_listener.cc @@ -4,11 +4,12 @@ #include "net/test/embedded_test_server/embedded_test_server_connection_listener.h" -#include "net/socket/stream_socket.h" - namespace net::test_server { -void EmbeddedTestServerConnectionListener::OnResponseCompletedSuccessfully( - std::unique_ptr socket) {} +EmbeddedTestServerConnectionListener::EmbeddedTestServerConnectionListener() = + default; + +EmbeddedTestServerConnectionListener::~EmbeddedTestServerConnectionListener() = + default; } // namespace net::test_server diff --git a/naiveproxy/src/net/test/embedded_test_server/embedded_test_server_connection_listener.h b/naiveproxy/src/net/test/embedded_test_server/embedded_test_server_connection_listener.h index e1f624394a..0a24d13002 100644 --- a/naiveproxy/src/net/test/embedded_test_server/embedded_test_server_connection_listener.h +++ b/naiveproxy/src/net/test/embedded_test_server/embedded_test_server_connection_listener.h @@ -24,22 +24,10 @@ class EmbeddedTestServerConnectionListener { // Notified when a socket was read from by the EmbeddedTestServer. virtual void ReadFromSocket(const StreamSocket& socket, int rv) = 0; - // Notified when the EmbeddedTestServer has completed a request and response - // successfully on |socket|. The listener can take |socket| to manually handle - // further traffic on it (for example, if doing a proxy tunnel). Not called if - // the socket has already been closed by the remote side, since it can't be - // used to convey data if that happens. - // - // Note: Connection and stream management on HTTP/2 is separated from this - // request/response concept, and as such this event is NOT supported for - // HTTP/2 connections/negotiated sockets. - virtual void OnResponseCompletedSuccessfully( - std::unique_ptr socket); - protected: - EmbeddedTestServerConnectionListener() = default; + EmbeddedTestServerConnectionListener(); - virtual ~EmbeddedTestServerConnectionListener() = default; + virtual ~EmbeddedTestServerConnectionListener(); }; } // namespace test_server diff --git a/naiveproxy/src/net/test/embedded_test_server/request_handler_util.cc b/naiveproxy/src/net/test/embedded_test_server/request_handler_util.cc index 6a2fc54a85..31bf901cc8 100644 --- a/naiveproxy/src/net/test/embedded_test_server/request_handler_util.cc +++ b/naiveproxy/src/net/test/embedded_test_server/request_handler_util.cc @@ -84,7 +84,8 @@ bool ShouldHandle(const HttpRequest& request, const std::string& path_prefix) { } GURL url = request.GetURL(); - return url.path() == path_prefix || url.path().starts_with(path_prefix + "/"); + return url.GetPath() == path_prefix || + url.GetPath().starts_with(path_prefix + "/"); } std::unique_ptr HandlePrefixedRequest( @@ -164,7 +165,7 @@ std::unique_ptr HandleFileRequest( // A proxy request will have an absolute path. Simulate the proxy by stripping // the scheme, host, and port. GURL request_url = request.GetURL(); - std::string relative_path(request_url.path()); + std::string relative_path(request_url.GetPath()); std::string_view post_prefix("/post/"); if (relative_path.starts_with(post_prefix)) { diff --git a/naiveproxy/src/net/test/embedded_test_server/simple_connection_listener.cc b/naiveproxy/src/net/test/embedded_test_server/simple_connection_listener.cc index 835b843d4b..9c5ff87322 100644 --- a/naiveproxy/src/net/test/embedded_test_server/simple_connection_listener.cc +++ b/naiveproxy/src/net/test/embedded_test_server/simple_connection_listener.cc @@ -35,7 +35,4 @@ void SimpleConnectionListener::WaitForConnections() { run_loop_.Run(); } -void SimpleConnectionListener::OnResponseCompletedSuccessfully( - std::unique_ptr socket) {} - } // namespace net::test_server diff --git a/naiveproxy/src/net/test/embedded_test_server/simple_connection_listener.h b/naiveproxy/src/net/test/embedded_test_server/simple_connection_listener.h index 177df1c433..b7df0c8c06 100644 --- a/naiveproxy/src/net/test/embedded_test_server/simple_connection_listener.h +++ b/naiveproxy/src/net/test/embedded_test_server/simple_connection_listener.h @@ -42,8 +42,6 @@ class SimpleConnectionListener : public EmbeddedTestServerConnectionListener { std::unique_ptr AcceptedSocket( std::unique_ptr socket) override; void ReadFromSocket(const StreamSocket& socket, int rv) override; - void OnResponseCompletedSuccessfully( - std::unique_ptr socket) override; // Wait until the expected number of connections have been seen. void WaitForConnections(); diff --git a/naiveproxy/src/net/test/embedded_test_server/websocket_connection.h b/naiveproxy/src/net/test/embedded_test_server/websocket_connection.h index ed121b7d41..fd53919f8d 100644 --- a/naiveproxy/src/net/test/embedded_test_server/websocket_connection.h +++ b/naiveproxy/src/net/test/embedded_test_server/websocket_connection.h @@ -14,6 +14,7 @@ #include #include "base/containers/span.h" +#include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" #include "base/sequence_checker.h" #include "net/base/io_buffer.h" diff --git a/naiveproxy/src/net/test/net_test_suite.cc b/naiveproxy/src/net/test/net_test_suite.cc index e2860b72ea..33089c9937 100644 --- a/naiveproxy/src/net/test/net_test_suite.cc +++ b/naiveproxy/src/net/test/net_test_suite.cc @@ -5,6 +5,7 @@ #include "net/test/net_test_suite.h" #include "base/check_op.h" +#include "base/command_line.h" #include "net/base/network_change_notifier.h" #include "net/http/http_stream_factory.h" #include "net/quic/platform/impl/quic_test_flags_utils.h" @@ -12,6 +13,14 @@ #include "testing/gtest/include/gtest/gtest.h" namespace { + +// See kRunManualTestsFlag in "content_switches.cc". +const char kManualTestPrefix[] = "MANUAL_"; + +// This is the same as switches::kRunManualTestsFlag, but defined here to avoid +// a dependency on //content. +const char kRunManualTestsFlag[] = "run-manual"; + class NetUnitTestEventListener : public testing::EmptyTestEventListener { public: NetUnitTestEventListener() = default; @@ -23,6 +32,12 @@ class NetUnitTestEventListener : public testing::EmptyTestEventListener { QuicFlagChecker checker; DCHECK(!quic_flags_saver_); quic_flags_saver_ = std::make_unique(); + if (base::StartsWith(test_info.name(), kManualTestPrefix, + base::CompareCase::SENSITIVE) && + !base::CommandLine::ForCurrentProcess()->HasSwitch( + kRunManualTestsFlag)) { + GTEST_SKIP(); + } } void OnTestEnd(const testing::TestInfo& test_info) override { diff --git a/naiveproxy/src/net/test/test_doh_server.cc b/naiveproxy/src/net/test/test_doh_server.cc index 63b012c6d0..0ff9adbbd8 100644 --- a/naiveproxy/src/net/test/test_doh_server.cc +++ b/naiveproxy/src/net/test/test_doh_server.cc @@ -149,7 +149,7 @@ int TestDohServer::QueriesServedForSubdomains(std::string_view domain) { std::unique_ptr TestDohServer::HandleRequest( const test_server::HttpRequest& request) { GURL request_url = request.GetURL(); - if (request_url.path_piece() != kPath) { + if (request_url.path() != kPath) { return nullptr; } diff --git a/naiveproxy/src/net/test/url_request/url_request_mock_http_job.cc b/naiveproxy/src/net/test/url_request/url_request_mock_http_job.cc index 2073d54e81..79d3a9d872 100644 --- a/naiveproxy/src/net/test/url_request/url_request_mock_http_job.cc +++ b/naiveproxy/src/net/test/url_request/url_request_mock_http_job.cc @@ -59,7 +59,7 @@ class MockJobInterceptor : public URLRequestInterceptor { // So first we convert base FilePath to a URL, then append the URL // path to that, and convert the final URL back to a FilePath. GURL file_url(FilePathToFileURL(base_path_)); - std::string url = file_url.spec() + request->url().path(); + std::string url = file_url.spec() + request->url().GetPath(); base::FilePath file_path; FileURLToFilePath(GURL(url), &file_path); return file_path; diff --git a/naiveproxy/src/net/test/url_request/url_request_test_job_backed_by_file.cc b/naiveproxy/src/net/test/url_request/url_request_test_job_backed_by_file.cc index ec78ddf65e..b167a5cd37 100644 --- a/naiveproxy/src/net/test/url_request/url_request_test_job_backed_by_file.cc +++ b/naiveproxy/src/net/test/url_request/url_request_test_job_backed_by_file.cc @@ -106,8 +106,8 @@ bool URLRequestTestJobBackedByFile::GetMimeType(std::string* mime_type) const { void URLRequestTestJobBackedByFile::SetExtraRequestHeaders( const HttpRequestHeaders& headers) { - std::optional range_header = - headers.GetHeader(HttpRequestHeaders::kRange); + std::optional range_header = + headers.GetHeaderView(HttpRequestHeaders::kRange); if (range_header) { // This job only cares about the Range header. This method stashes the value // for later use in DidOpen(), which is responsible for some of the range diff --git a/naiveproxy/src/net/third_party/mozilla_security_manager/README.chromium b/naiveproxy/src/net/third_party/mozilla_security_manager/README.chromium index 2d29da4524..6d218ed5f5 100644 --- a/naiveproxy/src/net/third_party/mozilla_security_manager/README.chromium +++ b/naiveproxy/src/net/third_party/mozilla_security_manager/README.chromium @@ -2,6 +2,7 @@ Name: Mozilla Personal Security Manager URL: https://dxr.mozilla.org/mozilla1.9.2/source/security/manager/ InfoURL: http://www.mozilla.org/ Version: Mozilla 1.9.2 +Update Mechanism: Manual License: MPL-1.1 License File: LICENSE Shipped: yes diff --git a/naiveproxy/src/net/third_party/mozilla_win/README.chromium b/naiveproxy/src/net/third_party/mozilla_win/README.chromium index 5bc90d1a73..bb90e47e3f 100644 --- a/naiveproxy/src/net/third_party/mozilla_win/README.chromium +++ b/naiveproxy/src/net/third_party/mozilla_win/README.chromium @@ -3,6 +3,7 @@ Short Name: N/A URL: https://searchfox.org/mozilla-central/rev/0fec57c05d3996cc00c55a66f20dd5793a9bfb5d/security/manager/ssl/EnterpriseRoots.cpp Version: N/A Revision: 0fec57c05d3996cc00c55a66f20dd5793a9bfb5d +Update Mechanism: Static (https://crbug.com/422332085) Security Critical: Yes Shipped: yes License: MPL-2.0 diff --git a/naiveproxy/src/net/third_party/nss/DIR_METADATA b/naiveproxy/src/net/third_party/nss/DIR_METADATA deleted file mode 100644 index 7120730774..0000000000 --- a/naiveproxy/src/net/third_party/nss/DIR_METADATA +++ /dev/null @@ -1,7 +0,0 @@ -monorail: { - component: "Internals>Network>SSL" -} -team_email: "trusty-transport@chromium.org" -buganizer_public: { - component_id: 1456816 -} diff --git a/naiveproxy/src/net/third_party/nss/LICENSE b/naiveproxy/src/net/third_party/nss/LICENSE deleted file mode 100644 index 212af5bb2e..0000000000 --- a/naiveproxy/src/net/third_party/nss/LICENSE +++ /dev/null @@ -1,403 +0,0 @@ -NSS is available under the Mozilla Public License, version 2, a copy of which -is below. - -Note on GPL Compatibility -------------------------- - -The MPL 2, section 3.3, permits you to combine NSS with code under the GNU -General Public License (GPL) version 2, or any later version of that -license, to make a Larger Work, and distribute the result under the GPL. -The only condition is that you must also make NSS, and any changes you -have made to it, available to recipients under the terms of the MPL 2 also. - -Anyone who receives the combined code from you does not have to continue -to dual licence in this way, and may, if they wish, distribute under the -terms of either of the two licences - either the MPL alone or the GPL -alone. However, we discourage people from distributing copies of NSS under -the GPL alone, because it means that any improvements they make cannot be -reincorporated into the main version of NSS. There is never a need to do -this for license compatibility reasons. - -Note on LGPL Compatibility --------------------------- - -The above also applies to combining MPLed code in a single library with -code under the GNU Lesser General Public License (LGPL) version 2.1, or -any later version of that license. If the LGPLed code and the MPLed code -are not in the same library, then the copyleft coverage of the two -licences does not overlap, so no issues arise. - - -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/naiveproxy/src/net/third_party/nss/OWNERS b/naiveproxy/src/net/third_party/nss/OWNERS deleted file mode 100644 index f02af8df73..0000000000 --- a/naiveproxy/src/net/third_party/nss/OWNERS +++ /dev/null @@ -1,3 +0,0 @@ -agl@chromium.org -davidben@chromium.org -wtc@google.com diff --git a/naiveproxy/src/net/third_party/nss/README.chromium b/naiveproxy/src/net/third_party/nss/README.chromium deleted file mode 100644 index 7be464c028..0000000000 --- a/naiveproxy/src/net/third_party/nss/README.chromium +++ /dev/null @@ -1,19 +0,0 @@ -Name: Network Security Services (NSS) -URL: http://www.mozilla.org/projects/security/pki/nss/ -Version: 3.23 RTM -Update Mechanism: Manual -Security Critical: Yes -Shipped: yes -License: MPL-2.0 -License File: LICENSE - -This directory includes a single function that was historically derived from -NSS's libssl, from the hg repo at hg tag NSS_3_23_RTM: - https://hg.mozilla.org/projects/nss - -The CPEPrefix field is intentionally omitted because this code no longer shares -fate with NSS. This is derived code, not than a vendored dependency. - -Local Modifications: -The function has been rewritten using Chromium's libraries and Chromium's -certificate verifier. diff --git a/naiveproxy/src/net/third_party/nss/ssl/cmpcert.cc b/naiveproxy/src/net/third_party/nss/ssl/cmpcert.cc deleted file mode 100644 index d86f31a35c..0000000000 --- a/naiveproxy/src/net/third_party/nss/ssl/cmpcert.cc +++ /dev/null @@ -1,108 +0,0 @@ -/* - * NSS utility functions - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "net/third_party/nss/ssl/cmpcert.h" - -#include -#include - -#include "net/cert/x509_certificate.h" -#include "net/cert/x509_util.h" -#include "third_party/boringssl/src/include/openssl/pool.h" -#include "third_party/boringssl/src/pki/parse_certificate.h" -#include "third_party/boringssl/src/pki/parser.h" - -namespace net { - -namespace { - -bool GetIssuerAndSubject(CERTCertificate* cert, - bssl::der::Input* issuer, - bssl::der::Input* subject) { - *issuer = bssl::der::Input(cert->derIssuer.data, cert->derIssuer.len); - *subject = bssl::der::Input(cert->derSubject.data, cert->derSubject.len); - return true; -} - -bool GetIssuerAndSubject(X509Certificate* cert, - bssl::der::Input* issuer, - bssl::der::Input* subject) { - bssl::der::Input tbs_certificate_tlv; - bssl::der::Input signature_algorithm_tlv; - bssl::der::BitString signature_value; - if (!bssl::ParseCertificate( - bssl::der::Input(CRYPTO_BUFFER_data(cert->cert_buffer()), - CRYPTO_BUFFER_len(cert->cert_buffer())), - &tbs_certificate_tlv, &signature_algorithm_tlv, &signature_value, - nullptr)) { - return false; - } - bssl::ParsedTbsCertificate tbs; - if (!ParseTbsCertificate(tbs_certificate_tlv, - x509_util::DefaultParseCertificateOptions(), &tbs, - nullptr)) { - return false; - } - - *issuer = tbs.issuer_tlv; - *subject = tbs.subject_tlv; - return true; -} - -} // namespace - -bool MatchClientCertificateIssuers( - X509Certificate* cert, - const std::vector& cert_authorities, - ScopedCERTCertificateList* intermediates) { - // Bound how many iterations to try. - static const int kMaxDepth = 20; - - intermediates->clear(); - - // If no authorities are supplied, everything matches. - if (cert_authorities.empty()) - return true; - - // DER encoded issuer and subject name of current certificate. - bssl::der::Input issuer; - bssl::der::Input subject; - - if (!GetIssuerAndSubject(cert, &issuer, &subject)) - return false; - - while (intermediates->size() < kMaxDepth) { - // Check if current cert is issued by a valid CA. - for (const std::string& ca : cert_authorities) { - if (issuer == bssl::der::Input(ca)) { - return true; - } - } - - // Stop at self-issued certificates. - if (issuer == subject) - return false; - - // Look the parent up in the database and keep searching. - SECItem issuer_item; - issuer_item.len = issuer.size(); - issuer_item.data = const_cast(issuer.data()); - ScopedCERTCertificate nextcert( - CERT_FindCertByName(CERT_GetDefaultCertDB(), &issuer_item)); - if (!nextcert) - return false; - - if (!GetIssuerAndSubject(nextcert.get(), &issuer, &subject)) - return false; - - intermediates->push_back(std::move(nextcert)); - } - - return false; -} - -} // namespace net diff --git a/naiveproxy/src/net/third_party/nss/ssl/cmpcert.h b/naiveproxy/src/net/third_party/nss/ssl/cmpcert.h deleted file mode 100644 index 931ecba7f0..0000000000 --- a/naiveproxy/src/net/third_party/nss/ssl/cmpcert.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * NSS utility functions - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef NET_THIRD_PARTY_NSS_SSL_CMPCERT_H_ -#define NET_THIRD_PARTY_NSS_SSL_CMPCERT_H_ - -#include - -#include -#include - -#include "net/cert/scoped_nss_types.h" - -namespace net { - -class X509Certificate; - -// Checks if |cert| matches |cert_authorities|. If so, it sets |*intermediates| -// to a list of intermediates to send and returns true. Otherwise, it returns -// false. -bool MatchClientCertificateIssuers( - X509Certificate* cert, - const std::vector& cert_authorities, - ScopedCERTCertificateList* intermediates); - -} // namespace net - -#endif // NET_THIRD_PARTY_NSS_SSL_CMPCERT_H_ diff --git a/naiveproxy/src/net/third_party/quiche/BUILD.gn b/naiveproxy/src/net/third_party/quiche/BUILD.gn index dfc46ec144..627b6544f6 100644 --- a/naiveproxy/src/net/third_party/quiche/BUILD.gn +++ b/naiveproxy/src/net/third_party/quiche/BUILD.gn @@ -35,6 +35,10 @@ config("quiche_internal_config") { "-Wno-deprecated-declarations", ] } + + # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and + # enable the diagnostic by removing this line. + configs = [ "//build/config/compiler:no_exit_time_destructors" ] } config("quiche_config") { @@ -87,10 +91,6 @@ component("quiche") { ] defines = [ "IS_QUICHE_IMPL" ] - - # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and - # enable the diagnostic by removing this line. - configs += [ "//build/config/compiler:no_exit_time_destructors" ] } proto_library("net_quic_proto") { diff --git a/naiveproxy/src/net/third_party/quiche/README.chromium b/naiveproxy/src/net/third_party/quiche/README.chromium index 78833ecd7c..f5d5c9ff1e 100644 --- a/naiveproxy/src/net/third_party/quiche/README.chromium +++ b/naiveproxy/src/net/third_party/quiche/README.chromium @@ -1,6 +1,7 @@ Name: QUICHE URL: https://quiche.googlesource.com/quiche Version: git +Update Mechanism: Manual License: BSD-3-Clause License File: src/LICENSE Security Critical: yes diff --git a/naiveproxy/src/net/third_party/quiche/overrides/quiche_platform_impl/quiche_client_stats_impl.h b/naiveproxy/src/net/third_party/quiche/overrides/quiche_platform_impl/quiche_client_stats_impl.h index ed28da18f6..286af04824 100644 --- a/naiveproxy/src/net/third_party/quiche/overrides/quiche_platform_impl/quiche_client_stats_impl.h +++ b/naiveproxy/src/net/third_party/quiche/overrides/quiche_platform_impl/quiche_client_stats_impl.h @@ -5,6 +5,8 @@ #ifndef NET_THIRD_PARTY_QUICHE_OVERRIDES_QUICHE_PLATFORM_IMPL_QUICHE_CLIENT_STATS_IMPL_H_ #define NET_THIRD_PARTY_QUICHE_OVERRIDES_QUICHE_PLATFORM_IMPL_QUICHE_CLIENT_STATS_IMPL_H_ +#include + #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" @@ -32,8 +34,7 @@ namespace quiche { UMA_HISTOGRAM_CUSTOM_COUNTS(QUICHE_HISTOGRAM_NAME(name), sample, min, max, \ bucket_count) -inline void QuicheClientSparseHistogramImpl(const std::string& name, - int sample) { +inline void QuicheClientSparseHistogramImpl(std::string_view name, int sample) { base::UmaHistogramSparse(name, sample); } diff --git a/naiveproxy/src/net/third_party/quiche/src/.bazelrc b/naiveproxy/src/net/third_party/quiche/src/.bazelrc index 497497d3f1..7a09307b88 100644 --- a/naiveproxy/src/net/third_party/quiche/src/.bazelrc +++ b/naiveproxy/src/net/third_party/quiche/src/.bazelrc @@ -3,6 +3,8 @@ common --enable_platform_specific_config build --cxxopt=-std=c++20 build --cxxopt=-fno-rtti +build --cxxopt=-Wno-nullability-completeness +build --cxxopt=-Wno-deprecated-declarations # Enable Abseil/Googletest integration build --define absl=1 diff --git a/naiveproxy/src/net/third_party/quiche/src/.bazelversion b/naiveproxy/src/net/third_party/quiche/src/.bazelversion index 66ce77b7ea..2b0aa21219 100644 --- a/naiveproxy/src/net/third_party/quiche/src/.bazelversion +++ b/naiveproxy/src/net/third_party/quiche/src/.bazelversion @@ -1 +1 @@ -7.0.0 +8.2.1 diff --git a/naiveproxy/src/net/third_party/quiche/src/MODULE.bazel b/naiveproxy/src/net/third_party/quiche/src/MODULE.bazel index 65ba315446..a4e04bf93f 100644 --- a/naiveproxy/src/net/third_party/quiche/src/MODULE.bazel +++ b/naiveproxy/src/net/third_party/quiche/src/MODULE.bazel @@ -4,14 +4,14 @@ module(name = "quiche") -# Last updated 2025-02-25 -bazel_dep(name = "bazel_skylib", version = "1.7.1") +# Last updated 2025-09-09 +bazel_dep(name = "bazel_skylib", version = "1.8.1") -# Last updated 2025-02-25 -bazel_dep(name = "rules_cc", version = "0.1.1") +# Last updated 2025-09-09 +bazel_dep(name = "rules_cc", version = "0.2.4") -# Last updated 2025-05-29 -bazel_dep(name = "abseil-cpp", version = "20250512.0", repo_name = "com_google_absl") +# Last updated 2025-09-09 +bazel_dep(name = "abseil-cpp", version = "20250814.0", repo_name = "com_google_absl") # Last updated 2025-05-29 bazel_dep(name = "protobuf", version = "31.1", repo_name = "com_google_protobuf") @@ -28,8 +28,9 @@ bazel_dep(name = "re2", version = "2024-07-02.bcr.1") # Last updated 2025-02-25 bazel_dep(name = "zlib", version = "1.3.1.bcr.5") -# Last updated 2025-06-06 -bazel_dep(name = "fuzztest", version = "20250214.0") +# Last updated 2025-09-09 +bazel_dep(name = "fuzztest", version = "20250805.0") + # Prevent fuzztest from pulling in a version of riegeli with compilation errors # (riegeli version "0.0.0-20240606-973b6f0"). bazel_dep(name = "riegeli", version = "0.0.0-20241218-3385e3c") @@ -38,9 +39,9 @@ http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "ht http_archive( name = "com_google_quic_trace", - sha256 = "ba01a041ae37b423fb8d555c53e545dcc914ad1a9a03832f266c0107d4433b08", # Last updated 2025-02-25 - strip_prefix = "quic-trace-ed3deb8a056b260c59f2fd42af6dfa3db48a8cad", - urls = ["https://github.com/google/quic-trace/archive/ed3deb8a056b260c59f2fd42af6dfa3db48a8cad.tar.gz"], + sha256 = "b61b1e0f6fbfd531ca9831267930308a0697e3f1df8ec442b09a487602038562", # Last updated 2025-10-14 + strip_prefix = "quic-trace-ad07bb1957d47b596654f4a7003eec80166372af", + urls = ["https://github.com/google/quic-trace/archive/ad07bb1957d47b596654f4a7003eec80166372af.tar.gz"], ) http_archive( diff --git a/naiveproxy/src/net/third_party/quiche/src/MODULE.bazel.lock b/naiveproxy/src/net/third_party/quiche/src/MODULE.bazel.lock index 6975bd3af6..838e953633 100644 --- a/naiveproxy/src/net/third_party/quiche/src/MODULE.bazel.lock +++ b/naiveproxy/src/net/third_party/quiche/src/MODULE.bazel.lock @@ -1,3082 +1,887 @@ { - "lockFileVersion": 3, - "moduleFileHash": "e165c6ad0d6e6748ab4eb4219116fd9ccfad8f559bd8581fa079316d5b54c179", - "flags": { - "cmdRegistries": [ - "https://bcr.bazel.build/" - ], - "cmdModuleOverrides": {}, - "allowedYankedVersions": [], - "envVarAllowedYankedVersions": "", - "ignoreDevDependency": false, - "directDependenciesMode": "WARNING", - "compatibilityMode": "ERROR" + "lockFileVersion": 18, + "registryFileHashes": { + "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", + "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", + "https://bcr.bazel.build/modules/abseil-cpp/20220623.1/MODULE.bazel": "73ae41b6818d423a11fd79d95aedef1258f304448193d4db4ff90e5e7a0f076c", + "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.0/MODULE.bazel": "98dc378d64c12a4e4741ad3362f87fb737ee6a0886b2d90c3cdbb4d93ea3e0bf", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", + "https://bcr.bazel.build/modules/abseil-cpp/20240722.0/MODULE.bazel": "88668a07647adbdc14cb3a7cd116fb23c9dda37a90a1681590b6c9d8339a5b84", + "https://bcr.bazel.build/modules/abseil-cpp/20250127.0/MODULE.bazel": "d1086e248cda6576862b4b3fe9ad76a214e08c189af5b42557a6e1888812c5d5", + "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", + "https://bcr.bazel.build/modules/abseil-cpp/20250512.0/MODULE.bazel": "c4d02dd22cd87458516655a45512060246ee2a4732f1fbe948a5bd9eb614e626", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.0/MODULE.bazel": "c43c16ca2c432566cdb78913964497259903ebe8fb7d9b57b38e9f1425b427b8", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.0/source.json": "b88bff599ceaf0f56c264c749b1606f8485cec3b8c38ba30f88a4df9af142861", + "https://bcr.bazel.build/modules/abseil-py/2.1.0/MODULE.bazel": "5ebe5bf853769c65707e5c28f216798f7a4b1042015e6a36e6d03094d94bec8a", + "https://bcr.bazel.build/modules/abseil-py/2.1.0/source.json": "0e8fc4f088ce07099c1cd6594c20c7ddbb48b4b3c0849b7d94ba94be88ff042b", + "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", + "https://bcr.bazel.build/modules/apple_support/1.13.0/MODULE.bazel": "7c8cdea7e031b7f9f67f0b497adf6d2c6a2675e9304ca93a9af6ed84eef5a524", + "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", + "https://bcr.bazel.build/modules/apple_support/1.17.1/MODULE.bazel": "655c922ab1209978a94ef6ca7d9d43e940cd97d9c172fb55f94d91ac53f8610b", + "https://bcr.bazel.build/modules/apple_support/1.17.1/source.json": "6b2b8c74d14e8d485528a938e44bdb72a5ba17632b9e14ef6e68a5ee96c8347f", + "https://bcr.bazel.build/modules/aspect_bazel_lib/1.31.2/MODULE.bazel": "7bee702b4862612f29333590f4b658a5832d433d6f8e4395f090e8f4e85d442f", + "https://bcr.bazel.build/modules/aspect_bazel_lib/1.38.0/MODULE.bazel": "6307fec451ba9962c1c969eb516ebfe1e46528f7fa92e1c9ac8646bef4cdaa3f", + "https://bcr.bazel.build/modules/aspect_bazel_lib/1.40.3/MODULE.bazel": "668e6bcb4d957fc0e284316dba546b705c8d43c857f87119619ee83c4555b859", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.11.0/MODULE.bazel": "cb1ba9f9999ed0bc08600c221f532c1ddd8d217686b32ba7d45b0713b5131452", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.11.0/source.json": "92494d5aa43b96665397dd13ee16023097470fa85e276b93674d62a244de47ee", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.7.7/MODULE.bazel": "491f8681205e31bb57892d67442ce448cda4f472a8e6b3dc062865e29a64f89c", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.8.1/MODULE.bazel": "812d2dd42f65dca362152101fbec418029cc8fd34cbad1a2fde905383d705838", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.9.3/MODULE.bazel": "66baf724dbae7aff4787bf2245cc188d50cb08e07789769730151c0943587c14", + "https://bcr.bazel.build/modules/aspect_rules_esbuild/0.21.0/MODULE.bazel": "77dc393c43ad79398b05865444c5200c6f1aae6765615544f2c7730b5858d533", + "https://bcr.bazel.build/modules/aspect_rules_esbuild/0.21.0/source.json": "062b1d3dba8adcfeb28fe60c185647f5a53ec0487ffe93cf0ae91566596e4b49", + "https://bcr.bazel.build/modules/aspect_rules_js/1.33.1/MODULE.bazel": "db3e7f16e471cf6827059d03af7c21859e7a0d2bc65429a3a11f005d46fc501b", + "https://bcr.bazel.build/modules/aspect_rules_js/1.39.0/MODULE.bazel": "aece421d479e3c31dc3e5f6d49a12acc2700457c03c556650ec7a0ff23fc0d95", + "https://bcr.bazel.build/modules/aspect_rules_js/2.0.0/MODULE.bazel": "b45b507574aa60a92796e3e13c195cd5744b3b8aff516a9c0cb5ae6a048161c5", + "https://bcr.bazel.build/modules/aspect_rules_js/2.1.3/MODULE.bazel": "47cc48eec374d69dced3cf9b9e5926beac2f927441acfb1a3568bbb709b25666", + "https://bcr.bazel.build/modules/aspect_rules_js/2.1.3/source.json": "6b0fe67780c101430be087381b7a79d75eeebe1a1eae6a2cee937713603634ac", + "https://bcr.bazel.build/modules/aspect_rules_lint/0.12.0/MODULE.bazel": "e767c5dbfeb254ec03275a7701b5cfde2c4d2873676804bc7cb27ddff3728fed", + "https://bcr.bazel.build/modules/aspect_rules_ts/3.4.0/MODULE.bazel": "5b554d5de90d96ee14117527c0519037713dd33884f3212eae391beccb2e94ff", + "https://bcr.bazel.build/modules/aspect_rules_ts/3.4.0/source.json": "9ada3722b716853b6dccdb7b650d8e776a23bc8a190de0c59bd15f21afea6f8a", + "https://bcr.bazel.build/modules/bazel_features/0.1.0/MODULE.bazel": "47011d645b0f949f42ee67f2e8775188a9cf4a0a1528aa2fa4952f2fd00906fd", + "https://bcr.bazel.build/modules/bazel_features/1.1.0/MODULE.bazel": "cfd42ff3b815a5f39554d97182657f8c4b9719568eb7fded2b9135f084bf760b", + "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", + "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", + "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", + "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", + "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", + "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", + "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", + "https://bcr.bazel.build/modules/bazel_features/1.28.0/source.json": "16a3fc5b4483cb307643791f5a4b7365fa98d2e70da7c378cdbde55f0c0b32cf", + "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", + "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", + "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", + "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", + "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", + "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", + "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/source.json": "7ebaefba0b03efe59cac88ed5bbc67bcf59a3eff33af937345ede2a38b2d368a", + "https://bcr.bazel.build/modules/boringssl/0.0.0-20211025-d4f1ab9/MODULE.bazel": "6ee6353f8b1a701fe2178e1d925034294971350b6d3ac37e67e5a7d463267834", + "https://bcr.bazel.build/modules/boringssl/0.0.0-20230215-5c22014/MODULE.bazel": "4b03dc0d04375fa0271174badcd202ed249870c8e895b26664fd7298abea7282", + "https://bcr.bazel.build/modules/boringssl/0.0.0-20240530-2db0eb3/MODULE.bazel": "d0405b762c5e87cd445b7015f2b8da5400ef9a8dbca0bfefa6c1cea79d528a97", + "https://bcr.bazel.build/modules/boringssl/0.20240913.0/MODULE.bazel": "fcaa7503a5213290831a91ed1eb538551cf11ac0bc3a6ad92d0fef92c5bd25fb", + "https://bcr.bazel.build/modules/boringssl/0.20241024.0/MODULE.bazel": "b540cff73d948cb79cb0bc108d7cef391d2098a25adabfda5043e4ef548dbc87", + "https://bcr.bazel.build/modules/boringssl/0.20250415.0/MODULE.bazel": "db800eec7f06173c8faf04f63df45e2200cb1060eaaeb85b246f99bcc5e86425", + "https://bcr.bazel.build/modules/boringssl/0.20250415.0/source.json": "9f5919b6b55e54e72cf04d5f5c543afda9c3a2760e3b226796302dbf7dad0b5e", + "https://bcr.bazel.build/modules/brotli/1.1.0/MODULE.bazel": "3b5b90488995183419c4b5c9b063a164f6c0bc4d0d6b40550a612a5e860cc0fe", + "https://bcr.bazel.build/modules/brotli/1.1.0/source.json": "098a4fd315527166e8dfe1fd1537c96a737a83764be38fc43f4da231d600f3d0", + "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", + "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", + "https://bcr.bazel.build/modules/bzip2/1.0.8/MODULE.bazel": "83ee443b286b0b91566e5ee77e74ba6445895f3135467893871560f9e4ebc159", + "https://bcr.bazel.build/modules/bzip2/1.0.8/source.json": "b64f3a2f973749cf5f6ee32b3d804af56a35a746228a7845ed5daa31c8cc8af1", + "https://bcr.bazel.build/modules/c-ares/1.15.0/MODULE.bazel": "ba0a78360fdc83f02f437a9e7df0532ad1fbaa59b722f6e715c11effebaa0166", + "https://bcr.bazel.build/modules/c-ares/1.15.0/source.json": "5e3ed991616c5ec4cc09b0893b29a19232de4a1830eb78c567121bfea87453f7", + "https://bcr.bazel.build/modules/cel-spec/0.15.0/MODULE.bazel": "e1eed53d233acbdcf024b4b0bc1528116d92c29713251b5154078ab1348cb600", + "https://bcr.bazel.build/modules/cel-spec/0.15.0/source.json": "ab7dccdf21ea2261c0f809b5a5221a4d7f8b580309f285fdf1444baaca75d44a", + "https://bcr.bazel.build/modules/civetweb/1.16/MODULE.bazel": "46a38f9daeb57392e3827fce7d40926be0c802bd23cdd6bfd3a96c804de42fae", + "https://bcr.bazel.build/modules/civetweb/1.16/source.json": "ba8b9585adb8355cb51b999d57172fd05e7a762c56b8d4bac6db42c99de3beb7", + "https://bcr.bazel.build/modules/curl/8.4.0/MODULE.bazel": "0bc250aa1cb69590049383df7a9537c809591fcf876c620f5f097c58fdc9bc10", + "https://bcr.bazel.build/modules/curl/8.7.1/MODULE.bazel": "088221c35a2939c555e6e47cb31a81c15f8b59f4daa8009b1e9271a502d33485", + "https://bcr.bazel.build/modules/curl/8.7.1/source.json": "bf9890e809717445b10a3ddc323b6d25c46631589c693a232df8310a25964484", + "https://bcr.bazel.build/modules/cython/3.0.11-1/MODULE.bazel": "868b3f5c956c3657420d2302004c6bb92606bfa47e314bab7f2ba0630c7c966c", + "https://bcr.bazel.build/modules/cython/3.0.11-1/source.json": "da318be900b8ca9c3d1018839d3bebc5a8e1645620d0848fa2c696d4ecf7c296", + "https://bcr.bazel.build/modules/envoy_api/0.0.0-20241214-918efc9/MODULE.bazel": "24e05f6f52f37be63a795192848555a2c8c855e7814dbc1ed419fb04a7005464", + "https://bcr.bazel.build/modules/envoy_api/0.0.0-20241214-918efc9/source.json": "212043ab69d87f7a04aa4f627f725b540cff5e145a3a31a9403d8b6ec2e920c9", + "https://bcr.bazel.build/modules/flatbuffers/25.2.10/MODULE.bazel": "dab15cafe8512d2c4a8daa44c2d7968c5c79f01e220d40076cdc260bf58605e2", + "https://bcr.bazel.build/modules/flatbuffers/25.2.10/source.json": "7eae7ea3eb913b9802426e4d5df11d6c6072a3573a548f8cabf1e965f5cca4d0", + "https://bcr.bazel.build/modules/fuzztest/20250805.0/MODULE.bazel": "a1149725e0dfff4464079b0c0ae64c1f88dc1b2d17190f567c7390afb3788e22", + "https://bcr.bazel.build/modules/fuzztest/20250805.0/source.json": "a18dbbd78a59238982e1e309526d7d1afe2b654d57f32be0a309aa588795d259", + "https://bcr.bazel.build/modules/gazelle/0.27.0/MODULE.bazel": "3446abd608295de6d90b4a8a118ed64a9ce11dcb3dda2dc3290a22056bd20996", + "https://bcr.bazel.build/modules/gazelle/0.30.0/MODULE.bazel": "f888a1effe338491f35f0e0e85003b47bb9d8295ccba73c37e07702d8d31c65b", + "https://bcr.bazel.build/modules/gazelle/0.32.0/MODULE.bazel": "b499f58a5d0d3537f3cf5b76d8ada18242f64ec474d8391247438bf04f58c7b8", + "https://bcr.bazel.build/modules/gazelle/0.33.0/MODULE.bazel": "a13a0f279b462b784fb8dd52a4074526c4a2afe70e114c7d09066097a46b3350", + "https://bcr.bazel.build/modules/gazelle/0.34.0/MODULE.bazel": "abdd8ce4d70978933209db92e436deb3a8b737859e9354fb5fd11fb5c2004c8a", + "https://bcr.bazel.build/modules/gazelle/0.36.0/MODULE.bazel": "e375d5d6e9a6ca59b0cb38b0540bc9a05b6aa926d322f2de268ad267a2ee74c0", + "https://bcr.bazel.build/modules/gazelle/0.36.0/source.json": "0823f097b127e0201ae55d85647c94095edfe27db0431a7ae880dcab08dfaa04", + "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", + "https://bcr.bazel.build/modules/google_benchmark/1.8.4/MODULE.bazel": "c6d54a11dcf64ee63545f42561eda3fd94c1b5f5ebe1357011de63ae33739d5e", + "https://bcr.bazel.build/modules/google_benchmark/1.8.4/source.json": "84590f7bc5a1fd99e1ef274ee16bb41c214f705e62847b42e705010dfa81fe53", + "https://bcr.bazel.build/modules/googleapis/0.0.0-20240326-1c8d509c5/MODULE.bazel": "a4b7e46393c1cdcc5a00e6f85524467c48c565256b22b5fae20f84ab4a999a68", + "https://bcr.bazel.build/modules/googleapis/0.0.0-20240819-fe8ba054a/MODULE.bazel": "117b7c7be7327ed5d6c482274533f2dbd78631313f607094d4625c28203cacdf", + "https://bcr.bazel.build/modules/googleapis/0.0.0-20240819-fe8ba054a/source.json": "b31fc7eb283a83f71d2e5bfc3d1c562d2994198fa1278409fbe8caec3afc1d3e", + "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", + "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", + "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", + "https://bcr.bazel.build/modules/googletest/1.16.0/MODULE.bazel": "a175623c69e94fca4ca7acbc12031e637b0c489318cd4805606981d4d7adb34a", + "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", + "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", + "https://bcr.bazel.build/modules/grpc-java/1.62.2/MODULE.bazel": "99b8771e8c7cacb130170fed2a10c9e8fed26334a93e73b42d2953250885a158", + "https://bcr.bazel.build/modules/grpc-java/1.66.0/MODULE.bazel": "86ff26209fac846adb89db11f3714b3dc0090fb2fb81575673cc74880cda4e7e", + "https://bcr.bazel.build/modules/grpc-java/1.66.0/source.json": "f841b339ff8516c86c3a5272cd053194dd0cb2fdd63157123835e1157a28328d", + "https://bcr.bazel.build/modules/grpc-proto/0.0.0-20240627-ec30f58/MODULE.bazel": "88de79051e668a04726e9ea94a481ec6f1692086735fd6f488ab908b3b909238", + "https://bcr.bazel.build/modules/grpc-proto/0.0.0-20240627-ec30f58/source.json": "5035d379c61042930244ab59e750106d893ec440add92ec0df6a0098ca7f131d", + "https://bcr.bazel.build/modules/grpc/1.41.0/MODULE.bazel": "5bcbfc2b274dabea628f0649dc50c90cf36543b1cfc31624832538644ad1aae8", + "https://bcr.bazel.build/modules/grpc/1.56.3.bcr.1/MODULE.bazel": "cd5b1eb276b806ec5ab85032921f24acc51735a69ace781be586880af20ab33f", + "https://bcr.bazel.build/modules/grpc/1.62.1/MODULE.bazel": "2998211594b8a79a6b459c4e797cfa19f0fb8b3be3149760ec7b8c99abfd426f", + "https://bcr.bazel.build/modules/grpc/1.66.0.bcr.2/MODULE.bazel": "0fa2b0fd028ce354febf0fe90f1ed8fecfbfc33118cddd95ac0418cc283333a0", + "https://bcr.bazel.build/modules/grpc/1.66.0.bcr.3/MODULE.bazel": "f6047e89faf488f5e3e65cb2594c6f5e86992abec7487163ff6b623526e543b0", + "https://bcr.bazel.build/modules/grpc/1.70.1/MODULE.bazel": "b800cd8e3e7555c1e61cba2e02d3a2fcf0e91f66e800db286d965d3b7a6a721a", + "https://bcr.bazel.build/modules/grpc/1.70.1/source.json": "e2977ea6cf9f2755418934d4ae134a6569713dd200fd7aded86a4b7f1b86efc9", + "https://bcr.bazel.build/modules/highwayhash/0.0.0-20240305-5ad3bf8/MODULE.bazel": "5c7f29d5bd70feff14b0f65b39584957e18e4a8d555e5a29a4c36019afbb44b9", + "https://bcr.bazel.build/modules/highwayhash/0.0.0-20240305-5ad3bf8/source.json": "211c0937ef5f537da6c3c135d12e60927c71b380642e207e4a02b86d29c55e85", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000", + "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/libpfm/4.11.0/source.json": "caaffb3ac2b59b8aac456917a4ecf3167d40478ee79f15ab7a877ec9273937c9", + "https://bcr.bazel.build/modules/lz4/1.9.4/MODULE.bazel": "e3d307b1d354d70f6c809167eafecf5d622c3f27e3971ab7273410f429c7f83a", + "https://bcr.bazel.build/modules/lz4/1.9.4/source.json": "233f0bdfc21f254e3dda14683ddc487ca68c6a3a83b7d5db904c503f85bd089b", + "https://bcr.bazel.build/modules/mbedtls/3.6.0/MODULE.bazel": "8e380e4698107c5f8766264d4df92e36766248447858db28187151d884995a09", + "https://bcr.bazel.build/modules/mbedtls/3.6.0/source.json": "1dbe7eb5258050afcc3806b9d43050f71c6f539ce0175535c670df606790b30c", + "https://bcr.bazel.build/modules/nlohmann_json/3.11.3/MODULE.bazel": "87023db2f55fc3a9949c7b08dc711fae4d4be339a80a99d04453c4bb3998eefc", + "https://bcr.bazel.build/modules/nlohmann_json/3.11.3/source.json": "296c63a90c6813e53b3812d24245711981fc7e563d98fe15625f55181494488a", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", + "https://bcr.bazel.build/modules/opencensus-cpp/0.0.0-20230502-50eb5de/MODULE.bazel": "02201d2921dadb4ec90c4980eca4b2a02904eddcf6fa02f3da7594fb7b0d821c", + "https://bcr.bazel.build/modules/opencensus-cpp/0.0.0-20230502-50eb5de/source.json": "f50efc07822f5425bd1d3e40e977484f9c0142463052717d40ec85cd6744243e", + "https://bcr.bazel.build/modules/opencensus-proto/0.4.1/MODULE.bazel": "4a2e8b4d0b544002502474d611a5a183aa282251e14f6a01afe841c0c1b10372", + "https://bcr.bazel.build/modules/opencensus-proto/0.4.1/source.json": "a7d956700a85b833c43fc61455c0e111ab75bab40768ed17a206ee18a2bbe38f", + "https://bcr.bazel.build/modules/opentelemetry-cpp/1.14.2/MODULE.bazel": "089a5613c2a159c7dfde098dabfc61e966889c7d6a81a98422a84c51535ed17d", + "https://bcr.bazel.build/modules/opentelemetry-cpp/1.16.0/MODULE.bazel": "b7379a140f538cea3f749179a2d481ed81942cc6f7b05a6113723eb34ac3b3e7", + "https://bcr.bazel.build/modules/opentelemetry-cpp/1.16.0/source.json": "da0cf667713b1e48d7f8912b100b4e0a8284c8a95717af5eb8c830d699e61cf5", + "https://bcr.bazel.build/modules/opentelemetry-proto/1.1.0/MODULE.bazel": "a49f406e99bf05ab43ed4f5b3322fbd33adfd484b6546948929d1316299b68bf", + "https://bcr.bazel.build/modules/opentelemetry-proto/1.3.1/MODULE.bazel": "0141a50e989576ee064c11ce8dd5ec89993525bd9f9a09c5618e4dacc8df9352", + "https://bcr.bazel.build/modules/opentelemetry-proto/1.4.0.bcr.1/MODULE.bazel": "5ceaf25e11170d22eded4c8032728b4a3f273765fccda32f9e94f463755c4167", + "https://bcr.bazel.build/modules/opentelemetry-proto/1.4.0.bcr.1/source.json": "fb9e01517460cfad8bafab082f2e1508d3cc2b7ed700cff19f3c7c84b146e5eb", + "https://bcr.bazel.build/modules/opentracing-cpp/1.6.0/MODULE.bazel": "b3925269f63561b8b880ae7cf62ccf81f6ece55b62cd791eda9925147ae116ec", + "https://bcr.bazel.build/modules/opentracing-cpp/1.6.0/source.json": "da1cb1add160f5e5074b7272e9db6fd8f1b3336c15032cd0a653af9d2f484aed", + "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", + "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", + "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", + "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", + "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", + "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", + "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", + "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", + "https://bcr.bazel.build/modules/platforms/1.0.0/source.json": "f4ff1fd412e0246fd38c82328eb209130ead81d62dcd5a9e40910f867f733d96", + "https://bcr.bazel.build/modules/prometheus-cpp/1.2.4/MODULE.bazel": "0fbe5dcff66311947a3f6b86ebc6a6d9328e31a28413ca864debc4a043f371e5", + "https://bcr.bazel.build/modules/prometheus-cpp/1.3.0/MODULE.bazel": "ce82e086bbc0b60267e970f6a54b2ca6d0f22d3eb6633e00e2cc2899c700f3d8", + "https://bcr.bazel.build/modules/prometheus-cpp/1.3.0/source.json": "8cb66b4e535afc718e9d104a3db96ccb71a42ee816a100e50fd0d5ac843c0606", + "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/23.1/MODULE.bazel": "88b393b3eb4101d18129e5db51847cd40a5517a53e81216144a8c32dfeeca52a", + "https://bcr.bazel.build/modules/protobuf/24.4/MODULE.bazel": "7bc7ce5f2abf36b3b7b7c8218d3acdebb9426aeb35c2257c96445756f970eb12", + "https://bcr.bazel.build/modules/protobuf/26.0.bcr.1/MODULE.bazel": "8f04d38c2da40a3715ff6bdce4d32c5981e6432557571482d43a62c31a24c2cf", + "https://bcr.bazel.build/modules/protobuf/26.0.bcr.2/MODULE.bazel": "62e0b84ca727bdeb55a6fe1ef180e6b191bbe548a58305ea1426c158067be534", + "https://bcr.bazel.build/modules/protobuf/26.0/MODULE.bazel": "8402da964092af40097f4a205eec2a33fd4a7748dc43632b7d1629bfd9a2b856", + "https://bcr.bazel.build/modules/protobuf/27.0-rc2/MODULE.bazel": "b2b0dbafd57b6bec0ca9b251da02e628c357dab53a097570aa7d79d020f107cf", + "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", + "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", + "https://bcr.bazel.build/modules/protobuf/28.3/MODULE.bazel": "2b3764bbab2e46703412bd3b859efcf0322638ed015e88432df3bb740507a1e9", + "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", + "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", + "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e", + "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", + "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/3.19.2/MODULE.bazel": "532ffe5f2186b69fdde039efe6df13ba726ff338c6bc82275ad433013fa10573", + "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", + "https://bcr.bazel.build/modules/protobuf/31.1/MODULE.bazel": "379a389bb330b7b8c1cdf331cc90bf3e13de5614799b3b52cdb7c6f389f6b38e", + "https://bcr.bazel.build/modules/protobuf/31.1/source.json": "25af5d0219da0c0fc4d1191a24ce438e6ca7f49d2e1a94f354efeba6ef10426f", + "https://bcr.bazel.build/modules/protoc-gen-validate/1.0.4.bcr.2/MODULE.bazel": "c4bd2c850211ff5b7dadf9d2d0496c1c922fdedc303c775b01dfd3b3efc907ed", + "https://bcr.bazel.build/modules/protoc-gen-validate/1.0.4.bcr.2/source.json": "4cc97f70b521890798058600a927ce4b0def8ee84ff2a5aa632aabcb4234aa0b", + "https://bcr.bazel.build/modules/protoc-gen-validate/1.0.4/MODULE.bazel": "b8913c154b16177990f6126d2d2477d187f9ddc568e95ee3e2d50fc65d2c494a", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", + "https://bcr.bazel.build/modules/rapidjson/1.1.0.bcr.20241007/MODULE.bazel": "82fbcb2e42f9e0040e76ccc74c06c3e46dfd33c64ca359293f8b84df0e6dff4c", + "https://bcr.bazel.build/modules/rapidjson/1.1.0.bcr.20241007/source.json": "5c42389ad0e21fc06b95ad7c0b730008271624a2fa3292e0eab5f30e15adeee3", + "https://bcr.bazel.build/modules/re2/2021-09-01/MODULE.bazel": "bcb6b96f3b071e6fe2d8bed9cc8ada137a105f9d2c5912e91d27528b3d123833", + "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", + "https://bcr.bazel.build/modules/re2/2024-05-01/MODULE.bazel": "55a3f059538f381107824e7d00df5df6d061ba1fb80e874e4909c0f0549e8f3e", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", + "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", + "https://bcr.bazel.build/modules/riegeli/0.0.0-20241218-3385e3c/MODULE.bazel": "14bbe297ac80b30b689bde824d823f53bd87cd504ec3f82de72a730e7b02d526", + "https://bcr.bazel.build/modules/riegeli/0.0.0-20250706-c4d1f27/MODULE.bazel": "b8b7309fb00c6b545fafcdfc3bf8cba168a61d37d841b9d90bacf7e70ae6627c", + "https://bcr.bazel.build/modules/riegeli/0.0.0-20250706-c4d1f27/source.json": "af3e2998bdf2f0ca3695816695c079f885d1e5b838e1d05ca82450aba4941762", + "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", + "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", + "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", + "https://bcr.bazel.build/modules/rules_apple/3.16.0/source.json": "d8b5fe461272018cc07cfafce11fe369c7525330804c37eec5a82f84cd475366", + "https://bcr.bazel.build/modules/rules_apple/3.5.1/MODULE.bazel": "3d1bbf65ad3692003d36d8a29eff54d4e5c1c5f4bfb60f79e28646a924d9101c", + "https://bcr.bazel.build/modules/rules_buf/0.1.1/MODULE.bazel": "6189aec18a4f7caff599ad41b851ab7645d4f1e114aa6431acf9b0666eb92162", + "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", + "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", + "https://bcr.bazel.build/modules/rules_cc/0.0.14/MODULE.bazel": "5e343a3aac88b8d7af3b1b6d2093b55c347b8eefc2e7d1442f7a02dc8fea48ac", + "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", + "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", + "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", + "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", + "https://bcr.bazel.build/modules/rules_cc/0.0.5/MODULE.bazel": "be41f87587998fe8890cd82ea4e848ed8eb799e053c224f78f3ff7fe1a1d9b74", + "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", + "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", + "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", + "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", + "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", + "https://bcr.bazel.build/modules/rules_cc/0.2.4/source.json": "2bd87ef9b41d4753eadf65175745737135cba0e70b479bdc204ef0c67404d0c4", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.10.1/MODULE.bazel": "b9527010e5fef060af92b6724edb3691970a5b1f76f74b21d39f7d433641be60", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.10.1/source.json": "9300e71df0cdde0952f10afff1401fa664e9fc5d9ae6204660ba1b158d90d6a6", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", + "https://bcr.bazel.build/modules/rules_go/0.33.0/MODULE.bazel": "a2b11b64cd24bf94f57454f53288a5dacfe6cb86453eee7761b7637728c1910c", + "https://bcr.bazel.build/modules/rules_go/0.38.1/MODULE.bazel": "fb8e73dd3b6fc4ff9d260ceacd830114891d49904f5bda1c16bc147bcc254f71", + "https://bcr.bazel.build/modules/rules_go/0.39.1/MODULE.bazel": "d34fb2a249403a5f4339c754f1e63dc9e5ad70b47c5e97faee1441fc6636cd61", + "https://bcr.bazel.build/modules/rules_go/0.41.0/MODULE.bazel": "55861d8e8bb0e62cbd2896f60ff303f62ffcb0eddb74ecb0e5c0cbe36fc292c8", + "https://bcr.bazel.build/modules/rules_go/0.42.0/MODULE.bazel": "8cfa875b9aa8c6fce2b2e5925e73c1388173ea3c32a0db4d2b4804b453c14270", + "https://bcr.bazel.build/modules/rules_go/0.45.1/MODULE.bazel": "6d7884f0edf890024eba8ab31a621faa98714df0ec9d512389519f0edff0281a", + "https://bcr.bazel.build/modules/rules_go/0.46.0/MODULE.bazel": "3477df8bdcc49e698b9d25f734c4f3a9f5931ff34ee48a2c662be168f5f2d3fd", + "https://bcr.bazel.build/modules/rules_go/0.48.0/MODULE.bazel": "d00ebcae0908ee3f5e6d53f68677a303d6d59a77beef879598700049c3980a03", + "https://bcr.bazel.build/modules/rules_go/0.50.1/MODULE.bazel": "b91a308dc5782bb0a8021ad4330c81fea5bda77f96b9e4c117b9b9c8f6665ee0", + "https://bcr.bazel.build/modules/rules_go/0.50.1/source.json": "205765fd30216c70321f84c9a967267684bdc74350af3f3c46c857d9f80a4fa2", + "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", + "https://bcr.bazel.build/modules/rules_java/5.1.0/MODULE.bazel": "324b6478b0343a3ce7a9add8586ad75d24076d6d43d2f622990b9c1cfd8a1b15", + "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", + "https://bcr.bazel.build/modules/rules_java/5.5.0/MODULE.bazel": "486ad1aa15cdc881af632b4b1448b0136c76025a1fe1ad1b65c5899376b83a50", + "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", + "https://bcr.bazel.build/modules/rules_java/6.3.0/MODULE.bazel": "a97c7678c19f236a956ad260d59c86e10a463badb7eb2eda787490f4c969b963", + "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6", + "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", + "https://bcr.bazel.build/modules/rules_java/7.1.0/MODULE.bazel": "30d9135a2b6561c761bd67bd4990da591e6bdc128790ce3e7afd6a3558b2fb64", + "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", + "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", + "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", + "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", + "https://bcr.bazel.build/modules/rules_java/7.4.0/MODULE.bazel": "a592852f8a3dd539e82ee6542013bf2cadfc4c6946be8941e189d224500a8934", + "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", + "https://bcr.bazel.build/modules/rules_java/8.11.0/MODULE.bazel": "c3d280bc5ff1038dcb3bacb95d3f6b83da8dd27bba57820ec89ea4085da767ad", + "https://bcr.bazel.build/modules/rules_java/8.11.0/source.json": "302b52a39259a85aa06ca3addb9787864ca3e03b432a5f964ea68244397e7544", + "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", + "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", + "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", + "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", + "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", + "https://bcr.bazel.build/modules/rules_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d", + "https://bcr.bazel.build/modules/rules_jvm_external/6.0/MODULE.bazel": "37c93a5a78d32e895d52f86a8d0416176e915daabd029ccb5594db422e87c495", + "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", + "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", + "https://bcr.bazel.build/modules/rules_license/0.0.8/MODULE.bazel": "5669c6fe49b5134dbf534db681ad3d67a2d49cfc197e4a95f1ca2fd7f3aebe96", + "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", + "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", + "https://bcr.bazel.build/modules/rules_nodejs/5.8.2/MODULE.bazel": "6bc03c8f37f69401b888023bf511cb6ee4781433b0cb56236b2e55a21e3a026a", + "https://bcr.bazel.build/modules/rules_nodejs/6.2.0/MODULE.bazel": "ec27907f55eb34705adb4e8257952162a2d4c3ed0f0b3b4c3c1aad1fac7be35e", + "https://bcr.bazel.build/modules/rules_nodejs/6.3.0/MODULE.bazel": "45345e4aba35dd6e4701c1eebf5a4e67af4ed708def9ebcdc6027585b34ee52d", + "https://bcr.bazel.build/modules/rules_nodejs/6.3.3/MODULE.bazel": "b66eadebd10f1f1b25f52f95ab5213a57e82c37c3f656fcd9a57ad04d2264ce7", + "https://bcr.bazel.build/modules/rules_nodejs/6.3.3/source.json": "45bd343155bdfed2543f0e39b80ff3f6840efc31975da4b5795797f4c94147ad", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", + "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", + "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", + "https://bcr.bazel.build/modules/rules_proto/6.0.0/MODULE.bazel": "b531d7f09f58dce456cd61b4579ce8c86b38544da75184eadaf0a7cb7966453f", + "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", + "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", + "https://bcr.bazel.build/modules/rules_python/0.20.0/MODULE.bazel": "bfe14d17f20e3fe900b9588f526f52c967a6f281e47a1d6b988679bd15082286", + "https://bcr.bazel.build/modules/rules_python/0.22.0/MODULE.bazel": "b8057bafa11a9e0f4b08fc3b7cd7bee0dcbccea209ac6fc9a3ff051cd03e19e9", + "https://bcr.bazel.build/modules/rules_python/0.22.1/MODULE.bazel": "26114f0c0b5e93018c0c066d6673f1a2c3737c7e90af95eff30cfee38d0bbac7", + "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", + "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", + "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", + "https://bcr.bazel.build/modules/rules_python/0.29.0/MODULE.bazel": "2ac8cd70524b4b9ec49a0b8284c79e4cd86199296f82f6e0d5da3f783d660c82", + "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", + "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", + "https://bcr.bazel.build/modules/rules_python/0.36.0/MODULE.bazel": "a4ce1ccea92b9106c7d16ab9ee51c6183107e78ba4a37aa65055227b80cd480c", + "https://bcr.bazel.build/modules/rules_python/0.37.1/MODULE.bazel": "3faeb2d9fa0a81f8980643ee33f212308f4d93eea4b9ce6f36d0b742e71e9500", + "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", + "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", + "https://bcr.bazel.build/modules/rules_python/1.0.0/MODULE.bazel": "898a3d999c22caa585eb062b600f88654bf92efb204fa346fb55f6f8edffca43", + "https://bcr.bazel.build/modules/rules_python/1.0.0/source.json": "b0162a65c6312e45e7912e39abd1a7f8856c2c7e41ecc9b6dc688a6f6400a917", + "https://bcr.bazel.build/modules/rules_rust/0.45.1/MODULE.bazel": "a69d0db3a958fab2c6520961e1b2287afcc8b36690fd31bbc4f6f7391397150d", + "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/source.json": "c55ed591aa5009401ddf80ded9762ac32c358d2517ee7820be981e2de9756cf3", + "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", + "https://bcr.bazel.build/modules/rules_swift/1.18.0/MODULE.bazel": "a6aba73625d0dc64c7b4a1e831549b6e375fbddb9d2dde9d80c9de6ec45b24c9", + "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", + "https://bcr.bazel.build/modules/rules_swift/2.1.1/source.json": "40fc69dfaac64deddbb75bd99cdac55f4427d9ca0afbe408576a65428427a186", + "https://bcr.bazel.build/modules/snappy/1.2.0/MODULE.bazel": "cc7a727b46089c7fdae0ede21b1fd65bdb14d01823da118ef5c48044f40b6b27", + "https://bcr.bazel.build/modules/snappy/1.2.0/source.json": "17f5527e15d30a9d9eebf79ed73b280b56cac44f8c8fea696666d99943f84c33", + "https://bcr.bazel.build/modules/stardoc/0.5.0/MODULE.bazel": "f9f1f46ba8d9c3362648eea571c6f9100680efc44913618811b58cc9c02cd678", + "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", + "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", + "https://bcr.bazel.build/modules/stardoc/0.5.4/MODULE.bazel": "6569966df04610b8520957cb8e97cf2e9faac2c0309657c537ab51c16c18a2a4", + "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", + "https://bcr.bazel.build/modules/stardoc/0.6.2/MODULE.bazel": "7060193196395f5dd668eda046ccbeacebfd98efc77fed418dbe2b82ffaa39fd", + "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", + "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", + "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", + "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/source.json": "32bd87e5f4d7acc57c5b2ff7c325ae3061d5e242c0c4c214ae87e0f1c13e54cb", + "https://bcr.bazel.build/modules/upb/0.0.0-20211020-160625a/MODULE.bazel": "6cced416be2dc5b9c05efd5b997049ba795e5e4e6fafbe1624f4587767638928", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/upb/0.0.0-20230516-61a97ef/MODULE.bazel": "c0df5e35ad55e264160417fd0875932ee3c9dda63d9fccace35ac62f45e1b6f9", + "https://bcr.bazel.build/modules/upb/0.0.0-20230907-e7430e6/MODULE.bazel": "3a7dedadf70346e678dc059dbe44d05cbf3ab17f1ce43a1c7a42edc7cbf93fd9", + "https://bcr.bazel.build/modules/xds/0.0.0-20240423-555b57e/MODULE.bazel": "cea509976a77e34131411684ef05a1d6ad194dd71a8d5816643bc5b0af16dc0f", + "https://bcr.bazel.build/modules/xds/0.0.0-20240423-555b57e/source.json": "7227e1fcad55f3f3cab1a08691ecd753cb29cc6380a47bc650851be9f9ad6d20", + "https://bcr.bazel.build/modules/xz/5.4.5.bcr.1/MODULE.bazel": "c037f75fa1b7e1ff15fbd15d807a8ce545e9b02f02df0a9777aa9aa7d8b268bb", + "https://bcr.bazel.build/modules/xz/5.4.5.bcr.1/source.json": "766f28499a16fa9ed8dc94382d50e80ceda0d0ab80b79b7b104a67074ab10e1f", + "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.2.12/MODULE.bazel": "3b1a8834ada2a883674be8cbd36ede1b6ec481477ada359cd2d3ddc562340b27", + "https://bcr.bazel.build/modules/zlib/1.2.13/MODULE.bazel": "aa6deb1b83c18ffecd940c4119aff9567cd0a671d7bba756741cb2ef043a29d5", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.1/MODULE.bazel": "6a9fe6e3fc865715a7be9823ce694ceb01e364c35f7a846bf0d2b34762bc066b", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/MODULE.bazel": "af322bc08976524477c79d1e45e241b6efbeb918c497e8840b8ab116802dda79", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198", + "https://bcr.bazel.build/modules/zlib/1.3/MODULE.bazel": "6a9c02f19a24dcedb05572b2381446e27c272cd383aed11d41d99da9e3167a72", + "https://bcr.bazel.build/modules/zstd/1.5.6/MODULE.bazel": "471ebe7d3cdd8c6469390fcf623eb4779ff55fbee0a87f1dc57a1def468b96d4", + "https://bcr.bazel.build/modules/zstd/1.5.6/source.json": "02010c3333fc89b44fe861db049968decb6e688411f7f9d4f6791d74f9adfb51" }, - "localOverrideHashes": { - "bazel_tools": "922ea6752dc9105de5af957f7a99a6933c0a6a712d23df6aad16a9c399f7e787" - }, - "moduleDepGraph": { - "": { - "name": "quiche", - "version": "", - "key": "", - "repoName": "quiche", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [ - { - "extensionBzlFile": "//:MODULE.bazel", - "extensionName": "_repo_rules", - "usingModule": "", - "location": { - "file": "@@//:MODULE.bazel", - "line": 0, - "column": 0 + "selectedYankedVersions": {}, + "moduleExtensions": { + "@@apple_support+//crosstool:setup.bzl%apple_cc_configure_extension": { + "general": { + "bzlTransitiveDigest": "m3fZqd+xd3/Pi9m1Qh9HuzJhy5jFhctBLfI3CVXOidQ=", + "usagesDigest": "39X2JjPCOAk6sThDALGv1L4q85GNjda2yfszm/phxxw=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "local_config_apple_cc_toolchains": { + "repoRuleId": "@@apple_support+//crosstool:setup.bzl%_apple_cc_autoconf_toolchains", + "attributes": {} }, - "imports": { - "com_google_quic_trace": "com_google_quic_trace", - "com_google_googleurl": "com_google_googleurl" - }, - "devImports": [], - "tags": [ - { - "tagName": "@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributeValues": { - "sha256": "ba01a041ae37b423fb8d555c53e545dcc914ad1a9a03832f266c0107d4433b08", - "strip_prefix": "quic-trace-ed3deb8a056b260c59f2fd42af6dfa3db48a8cad", - "urls": [ - "https://github.com/google/quic-trace/archive/ed3deb8a056b260c59f2fd42af6dfa3db48a8cad.tar.gz" - ], - "name": "com_google_quic_trace" - }, - "devDependency": false, - "location": { - "file": "@@//:MODULE.bazel", - "line": 33, - "column": 13 - } - }, - { - "tagName": "@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributeValues": { - "sha256": "1d2c507cc31e109ecb41ba1fe766f5ff0f5974c3ba8d0919b3d22668f7e89305", - "urls": [ - "https://storage.googleapis.com/quiche-envoy-integration/googleurl-5573f9aa120f3fbd378ca1b2565bbf7d223cd542.tar.gz" - ], - "name": "com_google_googleurl" - }, - "devDependency": false, - "location": { - "file": "@@//:MODULE.bazel", - "line": 40, - "column": 13 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "bazel_skylib": "bazel_skylib@1.7.1", - "rules_cc": "rules_cc@0.1.1", - "com_google_absl": "abseil-cpp@20250127.0", - "com_google_protobuf": "protobuf@29.3", - "boringssl": "boringssl@0.20250415.0", - "com_google_googletest": "googletest@1.16.0", - "re2": "re2@2024-07-02.bcr.1", - "zlib": "zlib@1.3.1.bcr.5", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - } - }, - "bazel_skylib@1.7.1": { - "name": "bazel_skylib", - "version": "1.7.1", - "key": "bazel_skylib@1.7.1", - "repoName": "bazel_skylib", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "//toolchains/unittest:cmd_toolchain", - "//toolchains/unittest:bash_toolchain" - ], - "extensionUsages": [], - "deps": { - "platforms": "platforms@0.0.11", - "rules_license": "rules_license@1.0.0", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "bazel_skylib~1.7.1", - "urls": [ - "https://github.com/bazelbuild/bazel-skylib/releases/download/1.7.1/bazel-skylib-1.7.1.tar.gz" - ], - "integrity": "sha256-vCg8381SalLDIBJ5zaS8KYZS76iYsQtNsIN9xRZSdW8=", - "strip_prefix": "", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "rules_cc@0.1.1": { - "name": "rules_cc", - "version": "0.1.1", - "key": "rules_cc@0.1.1", - "repoName": "rules_cc", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "@local_config_cc_toolchains//:all" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@rules_cc//cc:extensions.bzl", - "extensionName": "cc_configure_extension", - "usingModule": "rules_cc@0.1.1", - "location": { - "file": "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel", - "line": 12, - "column": 29 - }, - "imports": { - "local_config_cc": "local_config_cc", - "local_config_cc_toolchains": "local_config_cc_toolchains" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "bazel_features": "bazel_features@1.19.0", - "bazel_skylib": "bazel_skylib@1.7.1", - "platforms": "platforms@0.0.11", - "com_google_protobuf": "protobuf@29.3", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_cc~0.1.1", - "urls": [ - "https://github.com/bazelbuild/rules_cc/releases/download/0.1.1/rules_cc-0.1.1.tar.gz" - ], - "integrity": "sha256-cS13hosxUt1hjE1k+q3e/MWWX5D13m5t0dXdzQvoLUI=", - "strip_prefix": "rules_cc-0.1.1", - "remote_patches": { - "https://bcr.bazel.build/modules/rules_cc/0.1.1/patches/module_dot_bazel_version.patch": "sha256-2WyM/DEOM/Dj9MQU0Jl79eQ0Ju3QHGsgIuLO1OIwdt4=" - }, - "remote_patch_strip": 1 - } - } - }, - "abseil-cpp@20250127.0": { - "name": "abseil-cpp", - "version": "20250127.0", - "key": "abseil-cpp@20250127.0", - "repoName": "abseil-cpp", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "rules_cc": "rules_cc@0.1.1", - "bazel_skylib": "bazel_skylib@1.7.1", - "platforms": "platforms@0.0.11", - "googletest": "googletest@1.16.0", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "abseil-cpp~20250127.0", - "urls": [ - "https://github.com/abseil/abseil-cpp/releases/download/20250127.0/abseil-cpp-20250127.0.tar.gz" - ], - "integrity": "sha256-FiQvOUJFYn5Qjsa7KWtDPJD42RT3O5wCb925BeJydug=", - "strip_prefix": "abseil-cpp-20250127.0", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "protobuf@29.3": { - "name": "protobuf", - "version": "29.3", - "key": "protobuf@29.3", - "repoName": "com_google_protobuf", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "//bazel/private/toolchains:all" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@rules_python//python/extensions:python.bzl", - "extensionName": "python", - "usingModule": "protobuf@29.3", - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel", - "line": 103, - "column": 23 - }, - "imports": { - "system_python": "python_3_12" - }, - "devImports": [], - "tags": [ - { - "tagName": "toolchain", - "attributeValues": { - "is_default": false, - "python_version": "3.8" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel", - "line": 106, - "column": 21 - } - }, - { - "tagName": "toolchain", - "attributeValues": { - "is_default": false, - "python_version": "3.9" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel", - "line": 106, - "column": 21 - } - }, - { - "tagName": "toolchain", - "attributeValues": { - "is_default": false, - "python_version": "3.10" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel", - "line": 106, - "column": 21 - } - }, - { - "tagName": "toolchain", - "attributeValues": { - "is_default": false, - "python_version": "3.11" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel", - "line": 106, - "column": 21 - } - }, - { - "tagName": "toolchain", - "attributeValues": { - "is_default": true, - "python_version": "3.12" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel", - "line": 106, - "column": 21 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true + "local_config_apple_cc": { + "repoRuleId": "@@apple_support+//crosstool:setup.bzl%_apple_cc_autoconf", + "attributes": {} + } }, - { - "extensionBzlFile": "@rules_python//python/extensions:pip.bzl", - "extensionName": "pip", - "usingModule": "protobuf@29.3", - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel", - "line": 118, - "column": 20 - }, - "imports": { - "pip_deps": "pip_deps" - }, - "devImports": [], - "tags": [ - { - "tagName": "parse", - "attributeValues": { - "hub_name": "pip_deps", - "python_version": "3.8", - "requirements_lock": "//python:requirements.txt" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel", - "line": 121, - "column": 14 - } - }, - { - "tagName": "parse", - "attributeValues": { - "hub_name": "pip_deps", - "python_version": "3.9", - "requirements_lock": "//python:requirements.txt" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel", - "line": 121, - "column": 14 - } - }, - { - "tagName": "parse", - "attributeValues": { - "hub_name": "pip_deps", - "python_version": "3.10", - "requirements_lock": "//python:requirements.txt" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel", - "line": 121, - "column": 14 - } - }, - { - "tagName": "parse", - "attributeValues": { - "hub_name": "pip_deps", - "python_version": "3.11", - "requirements_lock": "//python:requirements.txt" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel", - "line": 121, - "column": 14 - } - }, - { - "tagName": "parse", - "attributeValues": { - "hub_name": "pip_deps", - "python_version": "3.12", - "requirements_lock": "//python:requirements.txt" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel", - "line": 121, - "column": 14 - } - } + "recordedRepoMappingEntries": [ + [ + "apple_support+", + "bazel_tools", + "bazel_tools" ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true + [ + "bazel_tools", + "rules_cc", + "rules_cc+" + ] + ] + } + }, + "@@aspect_rules_esbuild+//esbuild:extensions.bzl%esbuild": { + "general": { + "bzlTransitiveDigest": "sCHEKLUzL/knUyFXUmzsIORGC5fGP2nV5lyg0zV6nhY=", + "usagesDigest": "sj4kz7yaVclWMuWhUhSLq0bVH7+HrkWyMdODMeA7Zhw=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "esbuild_darwin-x64": { + "repoRuleId": "@@aspect_rules_esbuild+//esbuild:repositories.bzl%esbuild_repositories", + "attributes": { + "esbuild_version": "0.19.9", + "platform": "darwin-x64" + } + }, + "esbuild_darwin-arm64": { + "repoRuleId": "@@aspect_rules_esbuild+//esbuild:repositories.bzl%esbuild_repositories", + "attributes": { + "esbuild_version": "0.19.9", + "platform": "darwin-arm64" + } + }, + "esbuild_linux-x64": { + "repoRuleId": "@@aspect_rules_esbuild+//esbuild:repositories.bzl%esbuild_repositories", + "attributes": { + "esbuild_version": "0.19.9", + "platform": "linux-x64" + } + }, + "esbuild_linux-arm64": { + "repoRuleId": "@@aspect_rules_esbuild+//esbuild:repositories.bzl%esbuild_repositories", + "attributes": { + "esbuild_version": "0.19.9", + "platform": "linux-arm64" + } + }, + "esbuild_win32-x64": { + "repoRuleId": "@@aspect_rules_esbuild+//esbuild:repositories.bzl%esbuild_repositories", + "attributes": { + "esbuild_version": "0.19.9", + "platform": "win32-x64" + } + }, + "esbuild_toolchains": { + "repoRuleId": "@@aspect_rules_esbuild+//esbuild/private:toolchains_repo.bzl%toolchains_repo", + "attributes": { + "esbuild_version": "0.19.9", + "user_repository_name": "esbuild" + } + }, + "npm__esbuild_0.19.9": { + "repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_rule", + "attributes": { + "package": "esbuild", + "version": "0.19.9", + "root_package": "", + "link_workspace": "", + "link_packages": {}, + "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", + "url": "", + "commit": "", + "patch_args": [ + "-p0" + ], + "patches": [], + "custom_postinstall": "", + "npm_auth": "", + "npm_auth_basic": "", + "npm_auth_username": "", + "npm_auth_password": "", + "lifecycle_hooks": [], + "extra_build_content": "", + "generate_bzl_library_targets": false, + "extract_full_archive": false, + "system_tar": "auto" + } + }, + "npm__esbuild_0.19.9__links": { + "repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_links", + "attributes": { + "package": "esbuild", + "version": "0.19.9", + "dev": false, + "root_package": "", + "link_packages": {}, + "deps": {}, + "transitive_closure": {}, + "lifecycle_build_target": false, + "lifecycle_hooks_env": [], + "lifecycle_hooks_execution_requirements": [ + "no-sandbox" + ], + "lifecycle_hooks_use_default_shell_env": false, + "bins": {}, + "package_visibility": [ + "//visibility:public" + ], + "replace_package": "" + } + } }, - { - "extensionBzlFile": "@rules_jvm_external//:extensions.bzl", - "extensionName": "maven", - "usingModule": "protobuf@29.3", - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel", - "line": 131, - "column": 22 + "recordedRepoMappingEntries": [ + [ + "aspect_bazel_lib+", + "bazel_skylib", + "bazel_skylib+" + ], + [ + "aspect_bazel_lib+", + "bazel_tools", + "bazel_tools" + ], + [ + "aspect_rules_esbuild+", + "aspect_rules_js", + "aspect_rules_js+" + ], + [ + "aspect_rules_esbuild+", + "bazel_skylib", + "bazel_skylib+" + ], + [ + "aspect_rules_js+", + "aspect_bazel_lib", + "aspect_bazel_lib+" + ], + [ + "aspect_rules_js+", + "bazel_skylib", + "bazel_skylib+" + ], + [ + "aspect_rules_js+", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_foreign_cc+//foreign_cc:extensions.bzl%tools": { + "general": { + "bzlTransitiveDigest": "FApcIcVN43WOEs7g8eg7Cy1hrfRbVNEoUu8IiF+8WOc=", + "usagesDigest": "9LXdVp01HkdYQT8gYPjYLO6VLVJHo9uFfxWaU1ymiRE=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "rules_foreign_cc_framework_toolchain_linux": { + "repoRuleId": "@@rules_foreign_cc+//foreign_cc/private/framework:toolchain.bzl%framework_toolchain_repository", + "attributes": { + "commands_src": "@rules_foreign_cc//foreign_cc/private/framework/toolchains:linux_commands.bzl", + "exec_compatible_with": [ + "@platforms//os:linux" + ] + } }, - "imports": { - "protobuf_maven": "protobuf_maven" + "rules_foreign_cc_framework_toolchain_freebsd": { + "repoRuleId": "@@rules_foreign_cc+//foreign_cc/private/framework:toolchain.bzl%framework_toolchain_repository", + "attributes": { + "commands_src": "@rules_foreign_cc//foreign_cc/private/framework/toolchains:freebsd_commands.bzl", + "exec_compatible_with": [ + "@platforms//os:freebsd" + ] + } }, - "devImports": [], - "tags": [ - { - "tagName": "install", - "attributeValues": { - "name": "protobuf_maven", - "artifacts": [ - "com.google.caliper:caliper:1.0-beta-3", - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.code.gson:gson:2.8.9", - "com.google.errorprone:error_prone_annotations:2.5.1", - "com.google.j2objc:j2objc-annotations:2.8", - "com.google.guava:guava:32.0.1-jre", - "com.google.guava:guava-testlib:32.0.1-jre", - "com.google.truth:truth:1.1.2", - "junit:junit:4.13.2", - "org.mockito:mockito-core:4.3.1", - "biz.aQute.bnd:biz.aQute.bndlib:6.4.0", - "info.picocli:picocli:4.6.3" + "rules_foreign_cc_framework_toolchain_windows": { + "repoRuleId": "@@rules_foreign_cc+//foreign_cc/private/framework:toolchain.bzl%framework_toolchain_repository", + "attributes": { + "commands_src": "@rules_foreign_cc//foreign_cc/private/framework/toolchains:windows_commands.bzl", + "exec_compatible_with": [ + "@platforms//os:windows" + ] + } + }, + "rules_foreign_cc_framework_toolchain_macos": { + "repoRuleId": "@@rules_foreign_cc+//foreign_cc/private/framework:toolchain.bzl%framework_toolchain_repository", + "attributes": { + "commands_src": "@rules_foreign_cc//foreign_cc/private/framework/toolchains:macos_commands.bzl", + "exec_compatible_with": [ + "@platforms//os:macos" + ] + } + }, + "rules_foreign_cc_framework_toolchains": { + "repoRuleId": "@@rules_foreign_cc+//foreign_cc/private/framework:toolchain.bzl%framework_toolchain_repository_hub", + "attributes": {} + }, + "cmake_src": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "build_file_content": "filegroup(\n name = \"all_srcs\",\n srcs = glob([\"**\"]),\n visibility = [\"//visibility:public\"],\n)\n", + "sha256": "f316b40053466f9a416adf981efda41b160ca859e97f6a484b447ea299ff26aa", + "strip_prefix": "cmake-3.23.2", + "urls": [ + "https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2.tar.gz" + ] + } + }, + "gnumake_src": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "build_file_content": "filegroup(\n name = \"all_srcs\",\n srcs = glob([\"**\"]),\n visibility = [\"//visibility:public\"],\n)\n", + "sha256": "581f4d4e872da74b3941c874215898a7d35802f03732bdccee1d4a7979105d18", + "strip_prefix": "make-4.4", + "urls": [ + "https://mirror.bazel.build/ftpmirror.gnu.org/gnu/make/make-4.4.tar.gz", + "http://ftpmirror.gnu.org/gnu/make/make-4.4.tar.gz" + ] + } + }, + "ninja_build_src": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "build_file_content": "filegroup(\n name = \"all_srcs\",\n srcs = glob([\"**\"]),\n visibility = [\"//visibility:public\"],\n)\n", + "sha256": "31747ae633213f1eda3842686f83c2aa1412e0f5691d1c14dbbcc67fe7400cea", + "strip_prefix": "ninja-1.11.1", + "urls": [ + "https://github.com/ninja-build/ninja/archive/v1.11.1.tar.gz" + ] + } + }, + "meson_src": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "build_file_content": "exports_files([\"meson.py\"])\n\nfilegroup(\n name = \"runtime\",\n srcs = glob([\"mesonbuild/**\"]),\n visibility = [\"//visibility:public\"],\n)\n", + "strip_prefix": "meson-1.1.1", + "url": "https://github.com/mesonbuild/meson/releases/download/1.1.1/meson-1.1.1.tar.gz" + } + }, + "glib_dev": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "build_file_content": "\nload(\"@rules_cc//cc:defs.bzl\", \"cc_library\")\n\ncc_import(\n name = \"glib_dev\",\n hdrs = glob([\"include/**\"]),\n shared_library = \"@glib_runtime//:bin/libglib-2.0-0.dll\",\n visibility = [\"//visibility:public\"],\n)\n ", + "sha256": "bdf18506df304d38be98a4b3f18055b8b8cca81beabecad0eece6ce95319c369", + "urls": [ + "https://download.gnome.org/binaries/win64/glib/2.26/glib-dev_2.26.1-1_win64.zip" + ] + } + }, + "glib_src": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "build_file_content": "\ncc_import(\n name = \"msvc_hdr\",\n hdrs = [\"msvc_recommended_pragmas.h\"],\n visibility = [\"//visibility:public\"],\n)\n ", + "sha256": "bc96f63112823b7d6c9f06572d2ad626ddac7eb452c04d762592197f6e07898e", + "strip_prefix": "glib-2.26.1", + "urls": [ + "https://download.gnome.org/sources/glib/2.26/glib-2.26.1.tar.gz" + ] + } + }, + "glib_runtime": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "build_file_content": "\nexports_files(\n [\n \"bin/libgio-2.0-0.dll\",\n \"bin/libglib-2.0-0.dll\",\n \"bin/libgmodule-2.0-0.dll\",\n \"bin/libgobject-2.0-0.dll\",\n \"bin/libgthread-2.0-0.dll\",\n ],\n visibility = [\"//visibility:public\"],\n)\n ", + "sha256": "88d857087e86f16a9be651ee7021880b3f7ba050d34a1ed9f06113b8799cb973", + "urls": [ + "https://download.gnome.org/binaries/win64/glib/2.26/glib_2.26.1-1_win64.zip" + ] + } + }, + "gettext_runtime": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "build_file_content": "\ncc_import(\n name = \"gettext_runtime\",\n shared_library = \"bin/libintl-8.dll\",\n visibility = [\"//visibility:public\"],\n)\n ", + "sha256": "1f4269c0e021076d60a54e98da6f978a3195013f6de21674ba0edbc339c5b079", + "urls": [ + "https://download.gnome.org/binaries/win64/dependencies/gettext-runtime_0.18.1.1-2_win64.zip" + ] + } + }, + "pkgconfig_src": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "build_file_content": "filegroup(\n name = \"all_srcs\",\n srcs = glob([\"**\"]),\n visibility = [\"//visibility:public\"],\n)\n", + "sha256": "6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591", + "strip_prefix": "pkg-config-0.29.2", + "patches": [ + "@@rules_foreign_cc+//toolchains:pkgconfig-detectenv.patch", + "@@rules_foreign_cc+//toolchains:pkgconfig-makefile-vc.patch" + ], + "urls": [ + "https://pkgconfig.freedesktop.org/releases/pkg-config-0.29.2.tar.gz" + ] + } + }, + "bazel_skylib": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "urls": [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.2.1/bazel-skylib-1.2.1.tar.gz", + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.2.1/bazel-skylib-1.2.1.tar.gz" + ], + "sha256": "f7be3474d42aae265405a592bb7da8e171919d74c16f082a5457840f06054728" + } + }, + "rules_python": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "sha256": "84aec9e21cc56fbc7f1335035a71c850d1b9b5cc6ff497306f84cced9a769841", + "strip_prefix": "rules_python-0.23.1", + "url": "https://github.com/bazelbuild/rules_python/archive/refs/tags/0.23.1.tar.gz" + } + }, + "cmake-3.23.2-linux-aarch64": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "urls": [ + "https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2-linux-aarch64.tar.gz" + ], + "sha256": "f2654bf780b53f170bbbec44d8ac67d401d24788e590faa53036a89476efa91e", + "strip_prefix": "cmake-3.23.2-linux-aarch64", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"cmake_data\",\n srcs = glob(\n [\n \"**\",\n ],\n exclude = [\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n \"BUILD\",\n \"BUILD.bazel\",\n ],\n ),\n)\n\nnative_tool_toolchain(\n name = \"cmake_tool\",\n path = \"bin/cmake\",\n target = \":cmake_data\",\n)\n" + } + }, + "cmake-3.23.2-linux-x86_64": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "urls": [ + "https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2-linux-x86_64.tar.gz" + ], + "sha256": "aaced6f745b86ce853661a595bdac6c5314a60f8181b6912a0a4920acfa32708", + "strip_prefix": "cmake-3.23.2-linux-x86_64", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"cmake_data\",\n srcs = glob(\n [\n \"**\",\n ],\n exclude = [\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n \"BUILD\",\n \"BUILD.bazel\",\n ],\n ),\n)\n\nnative_tool_toolchain(\n name = \"cmake_tool\",\n path = \"bin/cmake\",\n target = \":cmake_data\",\n)\n" + } + }, + "cmake-3.23.2-macos-universal": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "urls": [ + "https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2-macos-universal.tar.gz" + ], + "sha256": "853a0f9af148c5ef47282ffffee06c4c9f257be2635936755f39ca13c3286c88", + "strip_prefix": "cmake-3.23.2-macos-universal/CMake.app/Contents", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"cmake_data\",\n srcs = glob(\n [\n \"**\",\n ],\n exclude = [\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n \"BUILD\",\n \"BUILD.bazel\",\n ],\n ),\n)\n\nnative_tool_toolchain(\n name = \"cmake_tool\",\n path = \"bin/cmake\",\n target = \":cmake_data\",\n)\n" + } + }, + "cmake-3.23.2-windows-i386": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "urls": [ + "https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2-windows-i386.zip" + ], + "sha256": "6a4fcd6a2315b93cb23c93507efccacc30c449c2bf98f14d6032bb226c582e07", + "strip_prefix": "cmake-3.23.2-windows-i386", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"cmake_data\",\n srcs = glob(\n [\n \"**\",\n ],\n exclude = [\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n \"BUILD\",\n \"BUILD.bazel\",\n ],\n ),\n)\n\nnative_tool_toolchain(\n name = \"cmake_tool\",\n path = \"bin/cmake.exe\",\n target = \":cmake_data\",\n)\n" + } + }, + "cmake-3.23.2-windows-x86_64": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "urls": [ + "https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2-windows-x86_64.zip" + ], + "sha256": "2329387f3166b84c25091c86389fb891193967740c9bcf01e7f6d3306f7ffda0", + "strip_prefix": "cmake-3.23.2-windows-x86_64", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"cmake_data\",\n srcs = glob(\n [\n \"**\",\n ],\n exclude = [\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n \"BUILD\",\n \"BUILD.bazel\",\n ],\n ),\n)\n\nnative_tool_toolchain(\n name = \"cmake_tool\",\n path = \"bin/cmake.exe\",\n target = \":cmake_data\",\n)\n" + } + }, + "cmake_3.23.2_toolchains": { + "repoRuleId": "@@rules_foreign_cc+//toolchains:prebuilt_toolchains_repository.bzl%prebuilt_toolchains_repository", + "attributes": { + "repos": { + "cmake-3.23.2-linux-aarch64": [ + "@platforms//cpu:aarch64", + "@platforms//os:linux" ], - "repositories": [ - "https://repo1.maven.org/maven2", - "https://repo.maven.apache.org/maven2" + "cmake-3.23.2-linux-x86_64": [ + "@platforms//cpu:x86_64", + "@platforms//os:linux" + ], + "cmake-3.23.2-macos-universal": [ + "@platforms//os:macos" + ], + "cmake-3.23.2-windows-i386": [ + "@platforms//cpu:x86_32", + "@platforms//os:windows" + ], + "cmake-3.23.2-windows-x86_64": [ + "@platforms//cpu:x86_64", + "@platforms//os:windows" ] }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel", - "line": 133, - "column": 14 - } + "tool": "cmake" } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "com_google_absl": "abseil-cpp@20250127.0", - "bazel_skylib": "bazel_skylib@1.7.1", - "jsoncpp": "jsoncpp@1.9.5", - "rules_cc": "rules_cc@0.1.1", - "rules_fuzzing": "rules_fuzzing@0.5.2", - "rules_java": "rules_java@7.12.2", - "rules_jvm_external": "rules_jvm_external@6.3", - "rules_kotlin": "rules_kotlin@1.9.6", - "rules_license": "rules_license@1.0.0", - "rules_pkg": "rules_pkg@1.0.1", - "rules_python": "rules_python@0.33.2", - "platforms": "platforms@0.0.11", - "zlib": "zlib@1.3.1.bcr.5", - "proto_bazel_features": "bazel_features@1.19.0", - "rules_shell": "rules_shell@0.2.0", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "protobuf~29.3", - "urls": [ - "https://github.com/protocolbuffers/protobuf/releases/download/v29.3/protobuf-29.3.zip" - ], - "integrity": "sha256-6bmsGRCxBBBlg5hQYDyvNuKdPT0jDd9SvRN3jdMbkEY=", - "strip_prefix": "protobuf-29.3", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "boringssl@0.20250415.0": { - "name": "boringssl", - "version": "0.20250415.0", - "key": "boringssl@0.20250415.0", - "repoName": "boringssl", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "googletest": "googletest@1.16.0", - "platforms": "platforms@0.0.11", - "rules_cc": "rules_cc@0.1.1", - "rules_license": "rules_license@1.0.0", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "boringssl~0.20250415.0", - "urls": [ - "https://github.com/google/boringssl/releases/download/0.20250415.0/boringssl-0.20250415.0.tar.gz" - ], - "integrity": "sha256-stZMTVLFBdYLD7hoM1aNxHYkRZENendX/5sXLlVWywE=", - "strip_prefix": "boringssl-0.20250415.0/", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "googletest@1.16.0": { - "name": "googletest", - "version": "1.16.0", - "key": "googletest@1.16.0", - "repoName": "googletest", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [ - { - "extensionBzlFile": "@googletest//:fake_fuchsia_sdk.bzl", - "extensionName": "fuchsia_sdk", - "usingModule": "googletest@1.16.0", - "location": { - "file": "https://bcr.bazel.build/modules/googletest/1.16.0/MODULE.bazel", - "line": 74, - "column": 28 }, - "imports": { - "fuchsia_sdk": "fuchsia_sdk" - }, - "devImports": [], - "tags": [ - { - "tagName": "create_fake", - "attributeValues": {}, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/googletest/1.16.0/MODULE.bazel", - "line": 75, - "column": 24 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "abseil-cpp": "abseil-cpp@20250127.0", - "platforms": "platforms@0.0.11", - "re2": "re2@2024-07-02.bcr.1", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "googletest~1.16.0", - "urls": [ - "https://github.com/google/googletest/releases/download/v1.16.0/googletest-1.16.0.tar.gz" - ], - "integrity": "sha256-eMZ2/GOIFSm/l7+dRZSNkFpmgz+/pTGOos10eMuY85k=", - "strip_prefix": "googletest-1.16.0", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "re2@2024-07-02.bcr.1": { - "name": "re2", - "version": "2024-07-02.bcr.1", - "key": "re2@2024-07-02.bcr.1", - "repoName": "re2", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "platforms": "platforms@0.0.11", - "apple_support": "apple_support@1.15.1", - "rules_cc": "rules_cc@0.1.1", - "abseil-cpp": "abseil-cpp@20250127.0", - "rules_python": "rules_python@0.33.2", - "pybind11_bazel": "pybind11_bazel@2.12.0", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "re2~2024-07-02.bcr.1", - "urls": [ - "https://github.com/google/re2/releases/download/2024-07-02/re2-2024-07-02.zip" - ], - "integrity": "sha256-qDX+Vfvc2OgPOFhKsi0IQGYsZ/L+s2vWeUAtqWQdxx4=", - "strip_prefix": "re2-2024-07-02", - "remote_patches": { - "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/patches/module_dot_bazel.patch": "sha256-qacD5PFevrt/ZkvLjKCocyCICqh/pVrb5J1Ho+tTsoc=" - }, - "remote_patch_strip": 0 - } - } - }, - "zlib@1.3.1.bcr.5": { - "name": "zlib", - "version": "1.3.1.bcr.5", - "key": "zlib@1.3.1.bcr.5", - "repoName": "zlib", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "platforms": "platforms@0.0.11", - "rules_cc": "rules_cc@0.1.1", - "rules_license": "rules_license@1.0.0", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "zlib~1.3.1.bcr.5", - "urls": [ - "https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.gz" - ], - "integrity": "sha256-mpOyt9/ax3zrpaVYpYDnRmfdb+3kWFuR7vtg8Dty3yM=", - "strip_prefix": "zlib-1.3.1", - "remote_patches": { - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/patches/add_build_file.patch": "sha256-SdbiiqOKN9dcerx8E+mFC2Pd/Q2KuL67/3+50WxCJLc=", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/patches/module_dot_bazel.patch": "sha256-ln6iWXu370RclA0exBzU2YboB6sDIn76lsAzkNXWuvk=" - }, - "remote_patch_strip": 0 - } - } - }, - "bazel_tools@_": { - "name": "bazel_tools", - "version": "", - "key": "bazel_tools@_", - "repoName": "bazel_tools", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "@local_config_cc_toolchains//:all", - "@local_config_sh//:local_sh_toolchain" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@bazel_tools//tools/cpp:cc_configure.bzl", - "extensionName": "cc_configure_extension", - "usingModule": "bazel_tools@_", - "location": { - "file": "@@bazel_tools//:MODULE.bazel", - "line": 17, - "column": 29 - }, - "imports": { - "local_config_cc": "local_config_cc", - "local_config_cc_toolchains": "local_config_cc_toolchains" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@bazel_tools//tools/osx:xcode_configure.bzl", - "extensionName": "xcode_configure_extension", - "usingModule": "bazel_tools@_", - "location": { - "file": "@@bazel_tools//:MODULE.bazel", - "line": 21, - "column": 32 - }, - "imports": { - "local_config_xcode": "local_config_xcode" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@rules_java//java:extensions.bzl", - "extensionName": "toolchains", - "usingModule": "bazel_tools@_", - "location": { - "file": "@@bazel_tools//:MODULE.bazel", - "line": 24, - "column": 32 - }, - "imports": { - "local_jdk": "local_jdk", - "remote_java_tools": "remote_java_tools", - "remote_java_tools_linux": "remote_java_tools_linux", - "remote_java_tools_windows": "remote_java_tools_windows", - "remote_java_tools_darwin_x86_64": "remote_java_tools_darwin_x86_64", - "remote_java_tools_darwin_arm64": "remote_java_tools_darwin_arm64" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@bazel_tools//tools/sh:sh_configure.bzl", - "extensionName": "sh_configure_extension", - "usingModule": "bazel_tools@_", - "location": { - "file": "@@bazel_tools//:MODULE.bazel", - "line": 35, - "column": 39 - }, - "imports": { - "local_config_sh": "local_config_sh" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@bazel_tools//tools/test:extensions.bzl", - "extensionName": "remote_coverage_tools_extension", - "usingModule": "bazel_tools@_", - "location": { - "file": "@@bazel_tools//:MODULE.bazel", - "line": 39, - "column": 48 - }, - "imports": { - "remote_coverage_tools": "remote_coverage_tools" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@bazel_tools//tools/android:android_extensions.bzl", - "extensionName": "remote_android_tools_extensions", - "usingModule": "bazel_tools@_", - "location": { - "file": "@@bazel_tools//:MODULE.bazel", - "line": 42, - "column": 42 - }, - "imports": { - "android_gmaven_r8": "android_gmaven_r8", - "android_tools": "android_tools" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "rules_cc": "rules_cc@0.1.1", - "rules_java": "rules_java@7.12.2", - "rules_license": "rules_license@1.0.0", - "rules_proto": "rules_proto@6.0.2", - "rules_python": "rules_python@0.33.2", - "platforms": "platforms@0.0.11", - "com_google_protobuf": "protobuf@29.3", - "zlib": "zlib@1.3.1.bcr.5", - "build_bazel_apple_support": "apple_support@1.15.1", - "local_config_platform": "local_config_platform@_" - } - }, - "local_config_platform@_": { - "name": "local_config_platform", - "version": "", - "key": "local_config_platform@_", - "repoName": "local_config_platform", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "platforms": "platforms@0.0.11", - "bazel_tools": "bazel_tools@_" - } - }, - "platforms@0.0.11": { - "name": "platforms", - "version": "0.0.11", - "key": "platforms@0.0.11", - "repoName": "platforms", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [ - { - "extensionBzlFile": "@platforms//host:extension.bzl", - "extensionName": "host_platform", - "usingModule": "platforms@0.0.11", - "location": { - "file": "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel", - "line": 9, - "column": 30 - }, - "imports": { - "host_platform": "host_platform" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "rules_license": "rules_license@1.0.0", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "platforms", - "urls": [ - "https://github.com/bazelbuild/platforms/releases/download/0.0.11/platforms-0.0.11.tar.gz" - ], - "integrity": "sha256-KXQuhydYCbXlmNwvBNhpYMx6VbMGfZciHJq7yZJr/w8=", - "strip_prefix": "", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "rules_license@1.0.0": { - "name": "rules_license", - "version": "1.0.0", - "key": "rules_license@1.0.0", - "repoName": "rules_license", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_license~1.0.0", - "urls": [ - "https://github.com/bazelbuild/rules_license/releases/download/1.0.0/rules_license-1.0.0.tar.gz" - ], - "integrity": "sha256-JtQCH2iY4juC75UweDid1JrCtWGKxWSt5O+HzO0Uezg=", - "strip_prefix": "", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "bazel_features@1.19.0": { - "name": "bazel_features", - "version": "1.19.0", - "key": "bazel_features@1.19.0", - "repoName": "bazel_features", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [ - { - "extensionBzlFile": "@bazel_features//private:extensions.bzl", - "extensionName": "version_extension", - "usingModule": "bazel_features@1.19.0", - "location": { - "file": "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel", - "line": 15, - "column": 24 - }, - "imports": { - "bazel_features_globals": "bazel_features_globals", - "bazel_features_version": "bazel_features_version" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "bazel_skylib": "bazel_skylib@1.7.1", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "bazel_features~1.19.0", - "urls": [ - "https://github.com/bazel-contrib/bazel_features/releases/download/v1.19.0/bazel_features-v1.19.0.tar.gz" - ], - "integrity": "sha256-Nkb/1Ed1NJC3fSOA+mP01V3Zci5WXYTf2gFTa0jhg9o=", - "strip_prefix": "bazel_features-1.19.0", - "remote_patches": { - "https://bcr.bazel.build/modules/bazel_features/1.19.0/patches/module_dot_bazel_version.patch": "sha256-PYPpjeCJB6UPdLGFi3WQTUZg3QcWYGizPZCv0UydI8M=" - }, - "remote_patch_strip": 1 - } - } - }, - "jsoncpp@1.9.5": { - "name": "jsoncpp", - "version": "1.9.5", - "key": "jsoncpp@1.9.5", - "repoName": "jsoncpp", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "jsoncpp~1.9.5", - "urls": [ - "https://github.com/open-source-parsers/jsoncpp/archive/refs/tags/1.9.5.tar.gz" - ], - "integrity": "sha256-9AmFblkgwY0ML7hSduJO5gfSoJtefV8KNxNokDwnXaI=", - "strip_prefix": "jsoncpp-1.9.5", - "remote_patches": { - "https://bcr.bazel.build/modules/jsoncpp/1.9.5/patches/build_dot_bazel.patch": "sha256-Vj8diXSWps8I8h5cdEqBDYmKBA2ulvWxMZBEQlIgcpU=", - "https://bcr.bazel.build/modules/jsoncpp/1.9.5/patches/module_dot_bazel.patch": "sha256-7RC7fS8N11vcyeDEaUZ05yBqr0YY7OzuzqaWz5W2XDo=" - }, - "remote_patch_strip": 1 - } - } - }, - "rules_fuzzing@0.5.2": { - "name": "rules_fuzzing", - "version": "0.5.2", - "key": "rules_fuzzing@0.5.2", - "repoName": "rules_fuzzing", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [ - { - "extensionBzlFile": "@rules_fuzzing//fuzzing/private:extensions.bzl", - "extensionName": "non_module_dependencies", - "usingModule": "rules_fuzzing@0.5.2", - "location": { - "file": "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel", - "line": 30, - "column": 40 - }, - "imports": { - "honggfuzz": "honggfuzz", - "rules_fuzzing_jazzer": "rules_fuzzing_jazzer", - "rules_fuzzing_jazzer_api": "rules_fuzzing_jazzer_api", - "rules_fuzzing_oss_fuzz": "rules_fuzzing_oss_fuzz" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@rules_python//python/extensions:python.bzl", - "extensionName": "python", - "usingModule": "rules_fuzzing@0.5.2", - "location": { - "file": "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel", - "line": 47, - "column": 23 - }, - "imports": {}, - "devImports": [], - "tags": [ - { - "tagName": "toolchain", - "attributeValues": { - "ignore_root_user_error": true, - "is_default": false, - "python_version": "3.8" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel", - "line": 50, - "column": 21 - } - }, - { - "tagName": "toolchain", - "attributeValues": { - "ignore_root_user_error": true, - "is_default": false, - "python_version": "3.9" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel", - "line": 50, - "column": 21 - } - }, - { - "tagName": "toolchain", - "attributeValues": { - "ignore_root_user_error": true, - "is_default": false, - "python_version": "3.10" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel", - "line": 50, - "column": 21 - } - }, - { - "tagName": "toolchain", - "attributeValues": { - "ignore_root_user_error": true, - "is_default": false, - "python_version": "3.11" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel", - "line": 50, - "column": 21 - } - }, - { - "tagName": "toolchain", - "attributeValues": { - "ignore_root_user_error": true, - "is_default": true, - "python_version": "3.12" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel", - "line": 50, - "column": 21 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@rules_python//python/extensions:pip.bzl", - "extensionName": "pip", - "usingModule": "rules_fuzzing@0.5.2", - "location": { - "file": "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel", - "line": 59, - "column": 20 - }, - "imports": { - "fuzzing_py_deps": "rules_fuzzing_py_deps" - }, - "devImports": [], - "tags": [ - { - "tagName": "parse", - "attributeValues": { - "extra_pip_args": [ - "--require-hashes" - ], - "hub_name": "rules_fuzzing_py_deps", - "python_version": "3.8", - "requirements_lock": "//fuzzing:requirements.txt" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel", - "line": 62, - "column": 14 - } - }, - { - "tagName": "parse", - "attributeValues": { - "extra_pip_args": [ - "--require-hashes" - ], - "hub_name": "rules_fuzzing_py_deps", - "python_version": "3.9", - "requirements_lock": "//fuzzing:requirements.txt" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel", - "line": 62, - "column": 14 - } - }, - { - "tagName": "parse", - "attributeValues": { - "extra_pip_args": [ - "--require-hashes" - ], - "hub_name": "rules_fuzzing_py_deps", - "python_version": "3.10", - "requirements_lock": "//fuzzing:requirements.txt" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel", - "line": 62, - "column": 14 - } - }, - { - "tagName": "parse", - "attributeValues": { - "extra_pip_args": [ - "--require-hashes" - ], - "hub_name": "rules_fuzzing_py_deps", - "python_version": "3.11", - "requirements_lock": "//fuzzing:requirements.txt" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel", - "line": 62, - "column": 14 - } - }, - { - "tagName": "parse", - "attributeValues": { - "extra_pip_args": [ - "--require-hashes" - ], - "hub_name": "rules_fuzzing_py_deps", - "python_version": "3.12", - "requirements_lock": "//fuzzing:requirements.txt" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel", - "line": 62, - "column": 14 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@rules_java//java:extensions.bzl", - "extensionName": "toolchains", - "usingModule": "rules_fuzzing@0.5.2", - "location": { - "file": "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel", - "line": 73, - "column": 32 - }, - "imports": { - "local_jdk": "local_jdk" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "com_google_absl": "abseil-cpp@20250127.0", - "bazel_skylib": "bazel_skylib@1.7.1", - "platforms": "platforms@0.0.11", - "rules_python": "rules_python@0.33.2", - "rules_java": "rules_java@7.12.2", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_fuzzing~0.5.2", - "urls": [ - "https://github.com/bazelbuild/rules_fuzzing/releases/download/v0.5.2/rules_fuzzing-0.5.2.zip" - ], - "integrity": "sha256-5rwhm/rJ4fg7Mn3QkPcoqflz7pm5tdjloYSicy7whiM=", - "strip_prefix": "rules_fuzzing-0.5.2", - "remote_patches": { - "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/patches/module_dot_bazel.patch": "sha256-+S/1nXWYEzeyvZeC9Zpgmt6bmmStrSBG99b33+dTmXc=" - }, - "remote_patch_strip": 0 - } - } - }, - "rules_java@7.12.2": { - "name": "rules_java", - "version": "7.12.2", - "key": "rules_java@7.12.2", - "repoName": "rules_java", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "//toolchains:all", - "@local_jdk//:runtime_toolchain_definition", - "@local_jdk//:bootstrap_runtime_toolchain_definition", - "@remote_jdk8_linux_toolchain_config_repo//:all", - "@remote_jdk8_linux_aarch64_toolchain_config_repo//:all", - "@remote_jdk8_linux_s390x_toolchain_config_repo//:all", - "@remote_jdk8_macos_toolchain_config_repo//:all", - "@remote_jdk8_macos_aarch64_toolchain_config_repo//:all", - "@remote_jdk8_windows_toolchain_config_repo//:all", - "@remotejdk11_linux_toolchain_config_repo//:all", - "@remotejdk11_linux_aarch64_toolchain_config_repo//:all", - "@remotejdk11_linux_ppc64le_toolchain_config_repo//:all", - "@remotejdk11_linux_s390x_toolchain_config_repo//:all", - "@remotejdk11_macos_toolchain_config_repo//:all", - "@remotejdk11_macos_aarch64_toolchain_config_repo//:all", - "@remotejdk11_win_toolchain_config_repo//:all", - "@remotejdk11_win_arm64_toolchain_config_repo//:all", - "@remotejdk17_linux_toolchain_config_repo//:all", - "@remotejdk17_linux_aarch64_toolchain_config_repo//:all", - "@remotejdk17_linux_ppc64le_toolchain_config_repo//:all", - "@remotejdk17_linux_s390x_toolchain_config_repo//:all", - "@remotejdk17_macos_toolchain_config_repo//:all", - "@remotejdk17_macos_aarch64_toolchain_config_repo//:all", - "@remotejdk17_win_toolchain_config_repo//:all", - "@remotejdk17_win_arm64_toolchain_config_repo//:all", - "@remotejdk21_linux_toolchain_config_repo//:all", - "@remotejdk21_linux_aarch64_toolchain_config_repo//:all", - "@remotejdk21_linux_ppc64le_toolchain_config_repo//:all", - "@remotejdk21_linux_s390x_toolchain_config_repo//:all", - "@remotejdk21_macos_toolchain_config_repo//:all", - "@remotejdk21_macos_aarch64_toolchain_config_repo//:all", - "@remotejdk21_win_toolchain_config_repo//:all", - "@remotejdk21_win_arm64_toolchain_config_repo//:all" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@rules_java//java:extensions.bzl", - "extensionName": "toolchains", - "usingModule": "rules_java@7.12.2", - "location": { - "file": "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel", - "line": 20, - "column": 27 - }, - "imports": { - "remote_java_tools": "remote_java_tools", - "remote_java_tools_linux": "remote_java_tools_linux", - "remote_java_tools_windows": "remote_java_tools_windows", - "remote_java_tools_darwin_x86_64": "remote_java_tools_darwin_x86_64", - "remote_java_tools_darwin_arm64": "remote_java_tools_darwin_arm64", - "local_jdk": "local_jdk", - "remote_jdk8_linux_toolchain_config_repo": "remote_jdk8_linux_toolchain_config_repo", - "remote_jdk8_linux_aarch64_toolchain_config_repo": "remote_jdk8_linux_aarch64_toolchain_config_repo", - "remote_jdk8_linux_s390x_toolchain_config_repo": "remote_jdk8_linux_s390x_toolchain_config_repo", - "remote_jdk8_macos_toolchain_config_repo": "remote_jdk8_macos_toolchain_config_repo", - "remote_jdk8_macos_aarch64_toolchain_config_repo": "remote_jdk8_macos_aarch64_toolchain_config_repo", - "remote_jdk8_windows_toolchain_config_repo": "remote_jdk8_windows_toolchain_config_repo", - "remotejdk11_linux_toolchain_config_repo": "remotejdk11_linux_toolchain_config_repo", - "remotejdk11_linux_aarch64_toolchain_config_repo": "remotejdk11_linux_aarch64_toolchain_config_repo", - "remotejdk11_linux_ppc64le_toolchain_config_repo": "remotejdk11_linux_ppc64le_toolchain_config_repo", - "remotejdk11_linux_s390x_toolchain_config_repo": "remotejdk11_linux_s390x_toolchain_config_repo", - "remotejdk11_macos_toolchain_config_repo": "remotejdk11_macos_toolchain_config_repo", - "remotejdk11_macos_aarch64_toolchain_config_repo": "remotejdk11_macos_aarch64_toolchain_config_repo", - "remotejdk11_win_toolchain_config_repo": "remotejdk11_win_toolchain_config_repo", - "remotejdk11_win_arm64_toolchain_config_repo": "remotejdk11_win_arm64_toolchain_config_repo", - "remotejdk17_linux_toolchain_config_repo": "remotejdk17_linux_toolchain_config_repo", - "remotejdk17_linux_aarch64_toolchain_config_repo": "remotejdk17_linux_aarch64_toolchain_config_repo", - "remotejdk17_linux_ppc64le_toolchain_config_repo": "remotejdk17_linux_ppc64le_toolchain_config_repo", - "remotejdk17_linux_s390x_toolchain_config_repo": "remotejdk17_linux_s390x_toolchain_config_repo", - "remotejdk17_macos_toolchain_config_repo": "remotejdk17_macos_toolchain_config_repo", - "remotejdk17_macos_aarch64_toolchain_config_repo": "remotejdk17_macos_aarch64_toolchain_config_repo", - "remotejdk17_win_toolchain_config_repo": "remotejdk17_win_toolchain_config_repo", - "remotejdk17_win_arm64_toolchain_config_repo": "remotejdk17_win_arm64_toolchain_config_repo", - "remotejdk21_linux_toolchain_config_repo": "remotejdk21_linux_toolchain_config_repo", - "remotejdk21_linux_aarch64_toolchain_config_repo": "remotejdk21_linux_aarch64_toolchain_config_repo", - "remotejdk21_linux_ppc64le_toolchain_config_repo": "remotejdk21_linux_ppc64le_toolchain_config_repo", - "remotejdk21_linux_s390x_toolchain_config_repo": "remotejdk21_linux_s390x_toolchain_config_repo", - "remotejdk21_macos_toolchain_config_repo": "remotejdk21_macos_toolchain_config_repo", - "remotejdk21_macos_aarch64_toolchain_config_repo": "remotejdk21_macos_aarch64_toolchain_config_repo", - "remotejdk21_win_toolchain_config_repo": "remotejdk21_win_toolchain_config_repo", - "remotejdk21_win_arm64_toolchain_config_repo": "remotejdk21_win_arm64_toolchain_config_repo" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "platforms": "platforms@0.0.11", - "rules_cc": "rules_cc@0.1.1", - "bazel_features": "bazel_features@1.19.0", - "bazel_skylib": "bazel_skylib@1.7.1", - "rules_proto": "rules_proto@6.0.2", - "rules_license": "rules_license@1.0.0", - "com_google_absl": "abseil-cpp@20250127.0", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2", - "urls": [ - "https://github.com/bazelbuild/rules_java/releases/download/7.12.2/rules_java-7.12.2.tar.gz" - ], - "integrity": "sha256-qWkLwAxTgkaIDVyDwjPk3rg/6IX1TCG7RF64EWoYC4M=", - "strip_prefix": "", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "rules_jvm_external@6.3": { - "name": "rules_jvm_external", - "version": "6.3", - "key": "rules_jvm_external@6.3", - "repoName": "rules_jvm_external", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [ - { - "extensionBzlFile": "@bazel_tools//tools/android:android_extensions.bzl", - "extensionName": "remote_android_tools_extensions", - "usingModule": "rules_jvm_external@6.3", - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 44, - "column": 42 - }, - "imports": { - "android_gmaven_r8": "android_gmaven_r8", - "android_tools": "android_tools" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": ":extensions.bzl", - "extensionName": "maven", - "usingModule": "rules_jvm_external@6.3", - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 47, - "column": 22 - }, - "imports": { - "rules_jvm_external_deps": "rules_jvm_external_deps", - "unpinned_rules_jvm_external_deps": "unpinned_rules_jvm_external_deps" - }, - "devImports": [], - "tags": [ - { - "tagName": "install", - "attributeValues": { - "name": "rules_jvm_external_deps", - "artifacts": [ - "com.google.auth:google-auth-library-credentials:1.23.0", - "com.google.auth:google-auth-library-oauth2-http:1.23.0", - "com.google.cloud:google-cloud-core:2.40.0", - "com.google.cloud:google-cloud-storage:2.40.1", - "com.google.code.gson:gson:2.11.0", - "com.google.googlejavaformat:google-java-format:1.22.0", - "com.google.guava:guava:33.2.1-jre", - "org.apache.maven:maven-artifact:3.9.8", - "org.apache.maven:maven-core:3.9.8", - "org.apache.maven:maven-model:3.9.8", - "org.apache.maven:maven-model-builder:3.9.8", - "org.apache.maven:maven-settings:3.9.8", - "org.apache.maven:maven-settings-builder:3.9.8", - "org.apache.maven:maven-resolver-provider:3.9.8", - "org.apache.maven.resolver:maven-resolver-api:1.9.20", - "org.apache.maven.resolver:maven-resolver-impl:1.9.20", - "org.apache.maven.resolver:maven-resolver-connector-basic:1.9.20", - "org.apache.maven.resolver:maven-resolver-spi:1.9.20", - "org.apache.maven.resolver:maven-resolver-transport-file:1.9.20", - "org.apache.maven.resolver:maven-resolver-transport-http:1.9.20", - "org.apache.maven.resolver:maven-resolver-util:1.9.20", - "org.codehaus.plexus:plexus-cipher:2.1.0", - "org.codehaus.plexus:plexus-sec-dispatcher:2.0", - "org.codehaus.plexus:plexus-utils:3.5.1", - "org.fusesource.jansi:jansi:2.4.1", - "org.slf4j:jul-to-slf4j:2.0.12", - "org.slf4j:log4j-over-slf4j:2.0.12", - "org.slf4j:slf4j-simple:2.0.12", - "software.amazon.awssdk:s3:2.26.12", - "org.bouncycastle:bcprov-jdk15on:1.68", - "org.bouncycastle:bcpg-jdk15on:1.68" - ], - "fail_if_repin_required": true, - "fetch_sources": true, - "lock_file": "//:rules_jvm_external_deps_install.json", - "strict_visibility": true - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 55, - "column": 14 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "//:MODULE.bazel", - "extensionName": "_repo_rules", - "usingModule": "rules_jvm_external@6.3", - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 0, - "column": 0 - }, - "imports": { - "coursier_cli": "coursier_cli", - "buildifier-linux-arm64": "buildifier-linux-arm64", - "buildifier-linux-x86_64": "buildifier-linux-x86_64", - "buildifier-macos-arm64": "buildifier-macos-arm64", - "buildifier-macos-x86_64": "buildifier-macos-x86_64", - "com.google.ar.sceneform_rendering": "com.google.ar.sceneform_rendering", - "hamcrest_core_for_test": "hamcrest_core_for_test", - "hamcrest_core_srcs_for_test": "hamcrest_core_srcs_for_test", - "gson_for_test": "gson_for_test", - "junit_platform_commons_for_test": "junit_platform_commons_for_test", - "google_api_services_compute_javadoc_for_test": "google_api_services_compute_javadoc_for_test", - "lombok_for_test": "lombok_for_test" - }, - "devImports": [], - "tags": [ - { - "tagName": "@bazel_tools//tools/build_defs/repo:http.bzl%http_file", - "attributeValues": { - "sha256": "2b78bfdd3ef13fd1f42f158de0f029d7cbb1f4f652d51773445cf2b6f7918a87", - "urls": [ - "https://github.com/coursier/coursier/releases/download/v2.1.8/coursier.jar" - ], - "name": "coursier_cli" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 114, - "column": 10 - } - }, - { - "tagName": "@bazel_tools//tools/build_defs/repo:http.bzl%http_file", - "attributeValues": { - "sha256": "c22a44eee37b8927167ee6ee67573303f4e31171e7ec3a8ea021a6a660040437", - "urls": [ - "https://github.com/bazelbuild/buildtools/releases/download/v7.1.2/buildifier-linux-arm64" - ], - "name": "buildifier-linux-arm64" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 120, - "column": 10 - } - }, - { - "tagName": "@bazel_tools//tools/build_defs/repo:http.bzl%http_file", - "attributeValues": { - "sha256": "28285fe7e39ed23dc1a3a525dfcdccbc96c0034ff1d4277905d2672a71b38f13", - "urls": [ - "https://github.com/bazelbuild/buildtools/releases/download/v7.1.2/buildifier-linux-amd64" - ], - "name": "buildifier-linux-x86_64" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 126, - "column": 10 - } - }, - { - "tagName": "@bazel_tools//tools/build_defs/repo:http.bzl%http_file", - "attributeValues": { - "sha256": "d0909b645496608fd6dfc67f95d9d3b01d90736d7b8c8ec41e802cb0b7ceae7c", - "urls": [ - "https://github.com/bazelbuild/buildtools/releases/download/v7.1.2/buildifier-darwin-arm64" - ], - "name": "buildifier-macos-arm64" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 132, - "column": 10 - } - }, - { - "tagName": "@bazel_tools//tools/build_defs/repo:http.bzl%http_file", - "attributeValues": { - "sha256": "687c49c318fb655970cf716eed3c7bfc9caeea4f2931a2fd36593c458de0c537", - "urls": [ - "https://github.com/bazelbuild/buildtools/releases/download/v7.1.2/buildifier-darwin-amd64" - ], - "name": "buildifier-macos-x86_64" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 138, - "column": 10 - } - }, - { - "tagName": "@bazel_tools//tools/build_defs/repo:http.bzl%http_file", - "attributeValues": { - "downloaded_file_path": "rendering-1.10.0.aar", - "sha256": "d2f6cd1d54eee0d5557518d1edcf77a3ba37494ae94f9bb862e570ee426a3431", - "urls": [ - "https://dl.google.com/android/maven2/com/google/ar/sceneform/rendering/1.10.0/rendering-1.10.0.aar" - ], - "name": "com.google.ar.sceneform_rendering" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 830, - "column": 10 - } - }, - { - "tagName": "@bazel_tools//tools/build_defs/repo:http.bzl%http_file", - "attributeValues": { - "downloaded_file_path": "hamcrest-core-1.3.jar", - "sha256": "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9", - "urls": [ - "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar" - ], - "name": "hamcrest_core_for_test" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 839, - "column": 10 - } - }, - { - "tagName": "@bazel_tools//tools/build_defs/repo:http.bzl%http_file", - "attributeValues": { - "downloaded_file_path": "hamcrest-core-1.3-sources.jar", - "sha256": "e223d2d8fbafd66057a8848cc94222d63c3cedd652cc48eddc0ab5c39c0f84df", - "urls": [ - "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar" - ], - "name": "hamcrest_core_srcs_for_test" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 848, - "column": 10 - } - }, - { - "tagName": "@bazel_tools//tools/build_defs/repo:http.bzl%http_file", - "attributeValues": { - "downloaded_file_path": "gson-2.9.0.jar", - "sha256": "c96d60551331a196dac54b745aa642cd078ef89b6f267146b705f2c2cbef052d", - "urls": [ - "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar" - ], - "name": "gson_for_test" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 857, - "column": 10 - } - }, - { - "tagName": "@bazel_tools//tools/build_defs/repo:http.bzl%http_file", - "attributeValues": { - "downloaded_file_path": "junit-platform-commons-1.8.2.jar", - "sha256": "d2e015fca7130e79af2f4608dc54415e4b10b592d77333decb4b1a274c185050", - "urls": [ - "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.8.2/junit-platform-commons-1.8.2.jar" - ], - "name": "junit_platform_commons_for_test" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 866, - "column": 10 - } - }, - { - "tagName": "@bazel_tools//tools/build_defs/repo:http.bzl%http_file", - "attributeValues": { - "downloaded_file_path": "google-api-services-compute-v1-rev235-1.25.0-javadoc.jar", - "sha256": "b03be5ee8effba3bfbaae53891a9c01d70e2e3bd82ad8889d78e641b22bd76c2", - "urls": [ - "https://repo1.maven.org/maven2/com/google/apis/google-api-services-compute/v1-rev235-1.25.0/google-api-services-compute-v1-rev235-1.25.0-javadoc.jar" - ], - "name": "google_api_services_compute_javadoc_for_test" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 876, - "column": 10 - } - }, - { - "tagName": "@bazel_tools//tools/build_defs/repo:http.bzl%http_file", - "attributeValues": { - "downloaded_file_path": "lombok-1.18.22.jar", - "sha256": "ecef1581411d7a82cc04281667ee0bac5d7c0a5aae74cfc38430396c91c31831", - "urls": [ - "https://repo1.maven.org/maven2/org/projectlombok/lombok/1.18.22/lombok-1.18.22.jar" - ], - "name": "lombok_for_test" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel", - "line": 885, - "column": 10 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "rules_android": "rules_android@0.1.1", - "bazel_features": "bazel_features@1.19.0", - "bazel_skylib": "bazel_skylib@1.7.1", - "platforms": "platforms@0.0.11", - "rules_license": "rules_license@1.0.0", - "rules_java": "rules_java@7.12.2", - "rules_kotlin": "rules_kotlin@1.9.6", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_jvm_external~6.3", - "urls": [ - "https://github.com/bazelbuild/rules_jvm_external/releases/download/6.3/rules_jvm_external-6.3.tar.gz" - ], - "integrity": "sha256-wYpp14S82FG+lYl8oOygtX3Ia7AuYkAvFXNt9EFg6wI=", - "strip_prefix": "rules_jvm_external-6.3", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "rules_kotlin@1.9.6": { - "name": "rules_kotlin", - "version": "1.9.6", - "key": "rules_kotlin@1.9.6", - "repoName": "rules_kotlin", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "//kotlin/internal:default_toolchain" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@rules_kotlin//src/main/starlark/core/repositories:bzlmod_setup.bzl", - "extensionName": "rules_kotlin_extensions", - "usingModule": "rules_kotlin@1.9.6", - "location": { - "file": "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel", - "line": 14, - "column": 40 - }, - "imports": { - "com_github_google_ksp": "com_github_google_ksp", - "com_github_jetbrains_kotlin": "com_github_jetbrains_kotlin", - "com_github_pinterest_ktlint": "com_github_pinterest_ktlint", - "rules_android": "rules_android" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@bazel_tools//tools/android:android_extensions.bzl", - "extensionName": "remote_android_tools_extensions", - "usingModule": "rules_kotlin@1.9.6", - "location": { - "file": "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel", - "line": 29, - "column": 42 - }, - "imports": { - "android_gmaven_r8": "android_gmaven_r8", - "android_tools": "android_tools" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "platforms": "platforms@0.0.11", - "bazel_skylib": "bazel_skylib@1.7.1", - "rules_java": "rules_java@7.12.2", - "rules_python": "rules_python@0.33.2", - "rules_cc": "rules_cc@0.1.1", - "rules_proto": "rules_proto@6.0.2", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_kotlin~1.9.6", - "urls": [ - "https://github.com/bazelbuild/rules_kotlin/releases/download/v1.9.6/rules_kotlin-v1.9.6.tar.gz" - ], - "integrity": "sha256-O3cpdv7Hvc2h2EudObF2WJQkwEfrIXW+0JqsYw5Qr0M=", - "strip_prefix": "", - "remote_patches": { - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/patches/module_dot_bazel_version.patch": "sha256-DzcJ53CqDqD+AiboAl8Tq2/fKJRXn0g5O2g4UQfLrbE=" - }, - "remote_patch_strip": 1 - } - } - }, - "rules_pkg@1.0.1": { - "name": "rules_pkg", - "version": "1.0.1", - "key": "rules_pkg@1.0.1", - "repoName": "rules_pkg", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "rules_license": "rules_license@1.0.0", - "rules_python": "rules_python@0.33.2", - "bazel_skylib": "bazel_skylib@1.7.1", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_pkg~1.0.1", - "urls": [ - "https://github.com/bazelbuild/rules_pkg/releases/download/1.0.1/rules_pkg-1.0.1.tar.gz" - ], - "integrity": "sha256-0gyVGWDtd8t7NBwqWUiFNOSU1a0dMMSBjHNtV3cqn+8=", - "strip_prefix": "", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "rules_python@0.33.2": { - "name": "rules_python", - "version": "0.33.2", - "key": "rules_python@0.33.2", - "repoName": "rules_python", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "@pythons_hub//:all" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@rules_python//python/private/bzlmod:internal_deps.bzl", - "extensionName": "internal_deps", - "usingModule": "rules_python@0.33.2", - "location": { - "file": "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel", - "line": 16, - "column": 30 - }, - "imports": { - "rules_python_internal": "rules_python_internal", - "pypi__build": "pypi__build", - "pypi__click": "pypi__click", - "pypi__colorama": "pypi__colorama", - "pypi__importlib_metadata": "pypi__importlib_metadata", - "pypi__installer": "pypi__installer", - "pypi__more_itertools": "pypi__more_itertools", - "pypi__packaging": "pypi__packaging", - "pypi__pep517": "pypi__pep517", - "pypi__pip": "pypi__pip", - "pypi__pip_tools": "pypi__pip_tools", - "pypi__pyproject_hooks": "pypi__pyproject_hooks", - "pypi__setuptools": "pypi__setuptools", - "pypi__tomli": "pypi__tomli", - "pypi__wheel": "pypi__wheel", - "pypi__zipp": "pypi__zipp" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@rules_python//python/extensions:python.bzl", - "extensionName": "python", - "usingModule": "rules_python@0.33.2", - "location": { - "file": "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel", - "line": 41, - "column": 23 - }, - "imports": { - "python_3_11": "python_3_11", - "python_versions": "python_versions", - "pythons_hub": "pythons_hub" - }, - "devImports": [], - "tags": [ - { - "tagName": "toolchain", - "attributeValues": { - "is_default": true, - "python_version": "3.11" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel", - "line": 47, - "column": 17 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@rules_python//python/private/bzlmod:pip.bzl", - "extensionName": "pip_internal", - "usingModule": "rules_python@0.33.2", - "location": { - "file": "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel", - "line": 59, - "column": 20 - }, - "imports": { - "rules_python_publish_deps": "rules_python_publish_deps" - }, - "devImports": [], - "tags": [ - { - "tagName": "parse", - "attributeValues": { - "hub_name": "rules_python_publish_deps", - "python_version": "3.11", - "requirements_by_platform": { - "//tools/publish:requirements.txt": "linux_*", - "//tools/publish:requirements_darwin.txt": "osx_*", - "//tools/publish:requirements_windows.txt": "windows_*" - } - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel", - "line": 60, - "column": 10 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "bazel_features": "bazel_features@1.19.0", - "bazel_skylib": "bazel_skylib@1.7.1", - "rules_cc": "rules_cc@0.1.1", - "platforms": "platforms@0.0.11", - "rules_proto": "rules_proto@6.0.2", - "com_google_protobuf": "protobuf@29.3", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2", - "urls": [ - "https://github.com/bazelbuild/rules_python/releases/download/0.33.2/rules_python-0.33.2.tar.gz" - ], - "integrity": "sha256-4/HMegTZsJY1r7MTBzHtgrX1jq3IIz1O+1mUTZL/wG8=", - "strip_prefix": "rules_python-0.33.2", - "remote_patches": { - "https://bcr.bazel.build/modules/rules_python/0.33.2/patches/module_dot_bazel_version.patch": "sha256-wokeU3ERM8RdlVsrp+N1uJwaaoRyKbE1Q3JqP3ChJjQ=" - }, - "remote_patch_strip": 1 - } - } - }, - "rules_shell@0.2.0": { - "name": "rules_shell", - "version": "0.2.0", - "key": "rules_shell@0.2.0", - "repoName": "rules_shell", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "@local_config_shell//:all" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@rules_shell//shell/private/extensions:sh_configure.bzl", - "extensionName": "sh_configure", - "usingModule": "rules_shell@0.2.0", - "location": { - "file": "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel", - "line": 10, - "column": 29 - }, - "imports": { - "local_config_shell": "local_config_shell" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "bazel_features": "bazel_features@1.19.0", - "bazel_skylib": "bazel_skylib@1.7.1", - "platforms": "platforms@0.0.11", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_shell~0.2.0", - "urls": [ - "https://github.com/bazelbuild/rules_shell/releases/download/v0.2.0/rules_shell-v0.2.0.tar.gz" - ], - "integrity": "sha256-QQ6P8y4Bi579J0NQfnWVwm4mKFZ8QiJEEf9TO1fSfCg=", - "strip_prefix": "rules_shell-0.2.0", - "remote_patches": { - "https://bcr.bazel.build/modules/rules_shell/0.2.0/patches/module_dot_bazel_version.patch": "sha256-bv3DFdWeINNaHKWkywFQPg7aVmCHZI2OZccz4nhABkw=" - }, - "remote_patch_strip": 1 - } - } - }, - "apple_support@1.15.1": { - "name": "apple_support", - "version": "1.15.1", - "key": "apple_support@1.15.1", - "repoName": "build_bazel_apple_support", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "@local_config_apple_cc_toolchains//:all" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@build_bazel_apple_support//crosstool:setup.bzl", - "extensionName": "apple_cc_configure_extension", - "usingModule": "apple_support@1.15.1", - "location": { - "file": "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel", - "line": 19, - "column": 35 - }, - "imports": { - "local_config_apple_cc": "local_config_apple_cc", - "local_config_apple_cc_toolchains": "local_config_apple_cc_toolchains" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "bazel_skylib": "bazel_skylib@1.7.1", - "platforms": "platforms@0.0.11", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "apple_support~1.15.1", - "urls": [ - "https://github.com/bazelbuild/apple_support/releases/download/1.15.1/apple_support.1.15.1.tar.gz" - ], - "integrity": "sha256-xLsrc2fEhDgjAK7nW+WYuS+EeJb7MbvSLzojRq32aoA=", - "strip_prefix": "", - "remote_patches": { - "https://bcr.bazel.build/modules/apple_support/1.15.1/patches/module_dot_bazel_version.patch": "sha256-FvMGp1f0FT1IT38LFbWGUqe5fukTvEyug2Puhimca74=" - }, - "remote_patch_strip": 1 - } - } - }, - "pybind11_bazel@2.12.0": { - "name": "pybind11_bazel", - "version": "2.12.0", - "key": "pybind11_bazel@2.12.0", - "repoName": "pybind11_bazel", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [ - { - "extensionBzlFile": "@pybind11_bazel//:internal_configure.bzl", - "extensionName": "internal_configure_extension", - "usingModule": "pybind11_bazel@2.12.0", - "location": { - "file": "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel", - "line": 12, - "column": 35 - }, - "imports": { - "pybind11": "pybind11" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "bazel_skylib": "bazel_skylib@1.7.1", - "platforms": "platforms@0.0.11", - "rules_cc": "rules_cc@0.1.1", - "rules_python": "rules_python@0.33.2", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "pybind11_bazel~2.12.0", - "urls": [ - "https://github.com/pybind/pybind11_bazel/releases/download/v2.12.0/pybind11_bazel-2.12.0.zip" - ], - "integrity": "sha256-pYwlxf4GOnAFf6IMuOFfO9oZsQMDBby1M68eRfNqSlU=", - "strip_prefix": "pybind11_bazel-2.12.0", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "rules_proto@6.0.2": { - "name": "rules_proto", - "version": "6.0.2", - "key": "rules_proto@6.0.2", - "repoName": "rules_proto", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_features": "bazel_features@1.19.0", - "bazel_skylib": "bazel_skylib@1.7.1", - "rules_cc": "rules_cc@0.1.1", - "rules_license": "rules_license@1.0.0", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_proto~6.0.2", - "urls": [ - "https://github.com/bazelbuild/rules_proto/releases/download/6.0.2/rules_proto-6.0.2.tar.gz" - ], - "integrity": "sha256-b7Z2fRvvU1MQVH4DJH91GLA0h3QMEbbGrbeVIDP+EpU=", - "strip_prefix": "rules_proto-6.0.2", - "remote_patches": { - "https://bcr.bazel.build/modules/rules_proto/6.0.2/patches/module_dot_bazel_version.patch": "sha256-mSkx6yiEGJElbRauESSW2YIUz1r8vRqmVAYOhV/Sjwc=" - }, - "remote_patch_strip": 1 - } - } - }, - "rules_android@0.1.1": { - "name": "rules_android", - "version": "0.1.1", - "key": "rules_android@0.1.1", - "repoName": "rules_android", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_android~0.1.1", - "urls": [ - "https://github.com/bazelbuild/rules_android/archive/refs/tags/v0.1.1.tar.gz" - ], - "integrity": "sha256-ZGHBxXREQrOU9GZFlX1r00IOsbQhkI/mPKoDCRsbNlU=", - "strip_prefix": "rules_android-0.1.1", - "remote_patches": { - "https://bcr.bazel.build/modules/rules_android/0.1.1/patches/module_dot_bazel.patch": "sha256-X/ORvZyYKdY8sYMMPZpolwCWsC1Xj93OmYUkLGATpHU=" - }, - "remote_patch_strip": 0 - } - } - } - }, - "moduleExtensions": { - "//:MODULE.bazel%_repo_rules": { - "general": { - "bzlTransitiveDigest": "5N51b9xEpf2bMJAN5rd4XedkyF3mkBazoyfbR0iSAoA=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "com_google_quic_trace": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", + "ninja_1.11.1_linux": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "sha256": "ba01a041ae37b423fb8d555c53e545dcc914ad1a9a03832f266c0107d4433b08", - "strip_prefix": "quic-trace-ed3deb8a056b260c59f2fd42af6dfa3db48a8cad", "urls": [ - "https://github.com/google/quic-trace/archive/ed3deb8a056b260c59f2fd42af6dfa3db48a8cad.tar.gz" + "https://github.com/ninja-build/ninja/releases/download/v1.11.1/ninja-linux.zip" ], - "name": "_main~_repo_rules~com_google_quic_trace" + "sha256": "b901ba96e486dce377f9a070ed4ef3f79deb45f4ffe2938f8e7ddc69cfb3df77", + "strip_prefix": "", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"ninja_bin\",\n srcs = [\"ninja\"],\n)\n\nnative_tool_toolchain(\n name = \"ninja_tool\",\n env = {\"NINJA\": \"$(execpath :ninja_bin)\"},\n path = \"$(execpath :ninja_bin)\",\n target = \":ninja_bin\",\n)\n" } }, - "com_google_googleurl": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", + "ninja_1.11.1_mac": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "sha256": "1d2c507cc31e109ecb41ba1fe766f5ff0f5974c3ba8d0919b3d22668f7e89305", "urls": [ - "https://storage.googleapis.com/quiche-envoy-integration/googleurl-5573f9aa120f3fbd378ca1b2565bbf7d223cd542.tar.gz" + "https://github.com/ninja-build/ninja/releases/download/v1.11.1/ninja-mac.zip" ], - "name": "_main~_repo_rules~com_google_googleurl" - } - } - } - } - }, - "@@apple_support~1.15.1//crosstool:setup.bzl%apple_cc_configure_extension": { - "general": { - "bzlTransitiveDigest": "RyR+EbN4fAzxxZSQKwXXrxEtMVrezn79MOR/2mmcmYk=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "local_config_apple_cc": { - "bzlFile": "@@apple_support~1.15.1//crosstool:setup.bzl", - "ruleClassName": "_apple_cc_autoconf", - "attributes": { - "name": "apple_support~1.15.1~apple_cc_configure_extension~local_config_apple_cc" + "sha256": "482ecb23c59ae3d4f158029112de172dd96bb0e97549c4b1ca32d8fad11f873e", + "strip_prefix": "", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"ninja_bin\",\n srcs = [\"ninja\"],\n)\n\nnative_tool_toolchain(\n name = \"ninja_tool\",\n env = {\"NINJA\": \"$(execpath :ninja_bin)\"},\n path = \"$(execpath :ninja_bin)\",\n target = \":ninja_bin\",\n)\n" } }, - "local_config_apple_cc_toolchains": { - "bzlFile": "@@apple_support~1.15.1//crosstool:setup.bzl", - "ruleClassName": "_apple_cc_autoconf_toolchains", + "ninja_1.11.1_win": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "name": "apple_support~1.15.1~apple_cc_configure_extension~local_config_apple_cc_toolchains" - } - } - } - } - }, - "@@bazel_features~1.19.0//private:extensions.bzl%version_extension": { - "general": { - "bzlTransitiveDigest": "/vJOb4IBPnuxjLO8/iEqHTGFZi8aA7E5PheUA6nMtMk=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "bazel_features_version": { - "bzlFile": "@@bazel_features~1.19.0//private:version_repo.bzl", - "ruleClassName": "version_repo", - "attributes": { - "name": "bazel_features~1.19.0~version_extension~bazel_features_version" + "urls": [ + "https://github.com/ninja-build/ninja/releases/download/v1.11.1/ninja-win.zip" + ], + "sha256": "524b344a1a9a55005eaf868d991e090ab8ce07fa109f1820d40e74642e289abc", + "strip_prefix": "", + "build_file_content": "load(\"@rules_foreign_cc//toolchains/native_tools:native_tools_toolchain.bzl\", \"native_tool_toolchain\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nfilegroup(\n name = \"ninja_bin\",\n srcs = [\"ninja.exe\"],\n)\n\nnative_tool_toolchain(\n name = \"ninja_tool\",\n env = {\"NINJA\": \"$(execpath :ninja_bin)\"},\n path = \"$(execpath :ninja_bin)\",\n target = \":ninja_bin\",\n)\n" } }, - "bazel_features_globals": { - "bzlFile": "@@bazel_features~1.19.0//private:globals_repo.bzl", - "ruleClassName": "globals_repo", + "ninja_1.11.1_toolchains": { + "repoRuleId": "@@rules_foreign_cc+//toolchains:prebuilt_toolchains_repository.bzl%prebuilt_toolchains_repository", "attributes": { - "name": "bazel_features~1.19.0~version_extension~bazel_features_globals", - "globals": { - "CcSharedLibraryInfo": "6.0.0-pre.20220630.1", - "CcSharedLibraryHintInfo": "7.0.0-pre.20230316.2", - "PackageSpecificationInfo": "6.4.0", - "RunEnvironmentInfo": "5.3.0", - "DefaultInfo": "0.0.1", - "__TestingOnly_NeverAvailable": "1000000000.0.0" + "repos": { + "ninja_1.11.1_linux": [ + "@platforms//cpu:x86_64", + "@platforms//os:linux" + ], + "ninja_1.11.1_mac": [ + "@platforms//cpu:x86_64", + "@platforms//os:macos" + ], + "ninja_1.11.1_win": [ + "@platforms//cpu:x86_64", + "@platforms//os:windows" + ] }, - "legacy_globals": { - "JavaInfo": "8.0.0", - "JavaPluginInfo": "8.0.0", - "ProtoInfo": "8.0.0", - "PyCcLinkParamsProvider": "8.0.0", - "PyInfo": "8.0.0", - "PyRuntimeInfo": "8.0.0" - } + "tool": "ninja" } } }, - "moduleExtensionMetadata": { - "useAllRepos": "DEV" - } + "recordedRepoMappingEntries": [ + [ + "rules_foreign_cc+", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_foreign_cc+", + "rules_foreign_cc", + "rules_foreign_cc+" + ] + ] } }, - "@@bazel_tools//tools/cpp:cc_configure.bzl%cc_configure_extension": { + "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { "general": { - "bzlTransitiveDigest": "O9sf6ilKWU9Veed02jG9o2HM/xgV/UAyciuFBuxrFRY=", - "accumulatedFileDigests": {}, + "bzlTransitiveDigest": "sFhcgPbDQehmbD1EOXzX4H1q/CD5df8zwG4kp4jbvr8=", + "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, "envVariables": {}, "generatedRepoSpecs": { - "local_config_cc": { - "bzlFile": "@@bazel_tools//tools/cpp:cc_configure.bzl", - "ruleClassName": "cc_autoconf", + "com_github_jetbrains_kotlin_git": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_compiler_git_repository", "attributes": { - "name": "bazel_tools~cc_configure_extension~local_config_cc" - } - }, - "local_config_cc_toolchains": { - "bzlFile": "@@bazel_tools//tools/cpp:cc_configure.bzl", - "ruleClassName": "cc_autoconf_toolchains", - "attributes": { - "name": "bazel_tools~cc_configure_extension~local_config_cc_toolchains" - } - } - } - } - }, - "@@bazel_tools//tools/osx:xcode_configure.bzl%xcode_configure_extension": { - "general": { - "bzlTransitiveDigest": "Qh2bWTU6QW6wkrd87qrU4YeY+SG37Nvw3A0PR4Y0L2Y=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "local_config_xcode": { - "bzlFile": "@@bazel_tools//tools/osx:xcode_configure.bzl", - "ruleClassName": "xcode_autoconf", - "attributes": { - "name": "bazel_tools~xcode_configure_extension~local_config_xcode", - "xcode_locator": "@bazel_tools//tools/osx:xcode_locator.m", - "remote_xcode": "" - } - } - } - } - }, - "@@bazel_tools//tools/sh:sh_configure.bzl%sh_configure_extension": { - "general": { - "bzlTransitiveDigest": "hp4NgmNjEg5+xgvzfh6L83bt9/aiiWETuNpwNuF1MSU=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "local_config_sh": { - "bzlFile": "@@bazel_tools//tools/sh:sh_configure.bzl", - "ruleClassName": "sh_config", - "attributes": { - "name": "bazel_tools~sh_configure_extension~local_config_sh" - } - } - } - } - }, - "@@platforms//host:extension.bzl%host_platform": { - "general": { - "bzlTransitiveDigest": "V/6tpbc8Kd+rXTEYg8ra/p0s4Qi0bh64yzYL8Fz1NRQ=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "host_platform": { - "bzlFile": "@@platforms//host:extension.bzl", - "ruleClassName": "host_platform_repo", - "attributes": { - "name": "platforms~host_platform~host_platform" - } - } - } - } - }, - "@@rules_cc~0.1.1//cc:extensions.bzl%cc_configure_extension": { - "general": { - "bzlTransitiveDigest": "33hxBSTLYzFLvXVyUVKi95CX5dRKsn1qf5HEF8Ax7nQ=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "local_config_cc": { - "bzlFile": "@@rules_cc~0.1.1//cc/private/toolchain:cc_configure.bzl", - "ruleClassName": "cc_autoconf", - "attributes": { - "name": "rules_cc~0.1.1~cc_configure_extension~local_config_cc" - } - }, - "local_config_cc_toolchains": { - "bzlFile": "@@rules_cc~0.1.1//cc/private/toolchain:cc_configure.bzl", - "ruleClassName": "cc_autoconf_toolchains", - "attributes": { - "name": "rules_cc~0.1.1~cc_configure_extension~local_config_cc_toolchains" - } - } - } - } - }, - "@@rules_java~7.12.2//java:extensions.bzl%toolchains": { - "general": { - "bzlTransitiveDigest": "4nfVrv081+BHgCrGsGCLiVepHLcQs4I6ystG7R0KGLw=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "remotejdk17_linux_s390x_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_linux_s390x_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:s390x\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux_s390x//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:s390x\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux_s390x//:jdk\",\n)\n" - } - }, - "remotejdk21_macos_aarch64_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_macos_aarch64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_21\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"21\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk21_macos_aarch64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk21_macos_aarch64//:jdk\",\n)\n" - } - }, - "remotejdk17_linux_aarch64_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_linux_aarch64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux_aarch64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux_aarch64//:jdk\",\n)\n" - } - }, - "remotejdk17_linux_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_linux_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux//:jdk\",\n)\n" - } - }, - "remote_java_tools_windows": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_java_tools_windows", - "sha256": "6a17ac1921d60af5dca780f4200fd0f9963441bd7afff53b9efad6e7156c699d", "urls": [ - "https://mirror.bazel.build/bazel_java_tools/releases/java/v13.9/java_tools_windows-v13.9.zip", - "https://github.com/bazelbuild/java_tools/releases/download/java_v13.9/java_tools_windows-v13.9.zip" - ] + "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" + ], + "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" } }, - "remotejdk11_win_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", + "com_github_jetbrains_kotlin": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_capabilities_repository", "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_win_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_win//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_win//:jdk\",\n)\n" + "git_repository_name": "com_github_jetbrains_kotlin_git", + "compiler_version": "1.9.23" } }, - "remotejdk21_linux_ppc64le": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", + "com_github_google_ksp": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:ksp.bzl%ksp_compiler_plugin_repository", "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_linux_ppc64le", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n", - "sha256": "c208cd0fb90560644a90f928667d2f53bfe408c957a5e36206585ad874427761", - "strip_prefix": "jdk-21.0.4+7", "urls": [ - "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.4+7/OpenJDK21U-jdk_ppc64le_linux_hotspot_21.0.4_7.tar.gz", - "https://mirror.bazel.build/github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.4+7/OpenJDK21U-jdk_ppc64le_linux_hotspot_21.0.4_7.tar.gz" - ] - } - }, - "remotejdk11_linux_aarch64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_linux_aarch64", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", - "sha256": "be7d7574253c893eb58f66e985c75adf48558c41885827d1f02f827e109530e0", - "strip_prefix": "zulu11.72.19-ca-jdk11.0.23-linux_aarch64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-linux_aarch64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-linux_aarch64.tar.gz" - ] - } - }, - "remotejdk17_linux": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_linux", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", - "sha256": "a1e8ac9ae5804b84dc07cf9d8ebe1b18247d70c92c1e0de97ea10109563f4379", - "strip_prefix": "zulu17.50.19-ca-jdk17.0.11-linux_x64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-linux_x64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-linux_x64.tar.gz" - ] - } - }, - "remotejdk11_linux_s390x_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_linux_s390x_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:s390x\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_s390x//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:s390x\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_s390x//:jdk\",\n)\n" - } - }, - "remotejdk17_macos": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_macos", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", - "sha256": "b384991e93af39abe5229c7f5efbe912a7c5a6480674a6e773f3a9128f96a764", - "strip_prefix": "zulu17.50.19-ca-jdk17.0.11-macosx_x64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-macosx_x64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-macosx_x64.tar.gz" - ] - } - }, - "remotejdk21_macos_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_macos_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_21\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"21\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk21_macos//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk21_macos//:jdk\",\n)\n" - } - }, - "remotejdk17_win": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_win", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", - "sha256": "43f0f1bdecf48ba9763d46ee7784554c95b442ffdd39ebd62dc8b297cc82e116", - "strip_prefix": "zulu17.50.19-ca-jdk17.0.11-win_x64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-win_x64.zip", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-win_x64.zip" - ] - } - }, - "remote_jdk8_linux_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_jdk8_linux_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_8\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"8\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remote_jdk8_linux//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remote_jdk8_linux//:jdk\",\n)\n" - } - }, - "remotejdk11_linux_ppc64le_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_linux_ppc64le_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:ppc\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_ppc64le//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:ppc\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_ppc64le//:jdk\",\n)\n" - } - }, - "remote_jdk8_windows": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_jdk8_windows", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 8,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 8,\n)\n", - "sha256": "ca5499c301d5b42604d8535b8c40a7f928a796247b8c66a600333dd799798ff7", - "strip_prefix": "zulu8.78.0.19-ca-jdk8.0.412-win_x64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-win_x64.zip", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-win_x64.zip" - ] - } - }, - "remote_jdk8_macos_aarch64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_jdk8_macos_aarch64", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 8,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 8,\n)\n", - "sha256": "35bc35808379400e4a70e1f7ee379778881799b93c2cc9fe1ae515c03c2fb057", - "strip_prefix": "zulu8.78.0.19-ca-jdk8.0.412-macosx_aarch64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-macosx_aarch64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-macosx_aarch64.tar.gz" - ] - } - }, - "remote_jdk8_linux_s390x": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_jdk8_linux_s390x", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 8,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 8,\n)\n", - "sha256": "276a431c79b7e94bc1b1b4fd88523383ae2d635ea67114dfc8a6174267f8fb2c", - "strip_prefix": "jdk8u292-b10", - "urls": [ - "https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_s390x_linux_hotspot_8u292b10.tar.gz", - "https://mirror.bazel.build/github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_s390x_linux_hotspot_8u292b10.tar.gz" - ] - } - }, - "remotejdk17_win_arm64_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_win_arm64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:arm64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_win_arm64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:arm64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_win_arm64//:jdk\",\n)\n" - } - }, - "remotejdk11_linux": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_linux", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", - "sha256": "0a4d1bfc7a96a7f9f5329b72b9801b3c53366417b4753f1b658fa240204c7347", - "strip_prefix": "zulu11.72.19-ca-jdk11.0.23-linux_x64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-linux_x64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-linux_x64.tar.gz" - ] - } - }, - "remotejdk11_macos_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_macos_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_macos//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_macos//:jdk\",\n)\n" - } - }, - "remotejdk17_win_arm64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_win_arm64", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", - "sha256": "b8833d272eb31f54f8c881139807a28a74de9deae07d2cc37688ff72043e32c9", - "strip_prefix": "zulu17.50.19-ca-jdk17.0.11-win_aarch64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-win_aarch64.zip", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-win_aarch64.zip" - ] - } - }, - "remotejdk17_linux_ppc64le": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_linux_ppc64le", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", - "sha256": "00a4c07603d0218cd678461b5b3b7e25b3253102da4022d31fc35907f21a2efd", - "strip_prefix": "jdk-17.0.8.1+1", - "urls": [ - "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8.1+1/OpenJDK17U-jdk_ppc64le_linux_hotspot_17.0.8.1_1.tar.gz", - "https://mirror.bazel.build/github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8.1+1/OpenJDK17U-jdk_ppc64le_linux_hotspot_17.0.8.1_1.tar.gz" - ] - } - }, - "remotejdk21_win_arm64_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_win_arm64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_21\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"21\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:arm64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk21_win_arm64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:arm64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk21_win_arm64//:jdk\",\n)\n" - } - }, - "remote_jdk8_macos": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_jdk8_macos", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 8,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 8,\n)\n", - "sha256": "2bfa0506196962bddb21a604eaa2b0b39eaf3383d0bdad08bdbe7f42f25d8928", - "strip_prefix": "zulu8.78.0.19-ca-jdk8.0.412-macosx_x64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-macosx_x64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-macosx_x64.tar.gz" - ] - } - }, - "remotejdk21_linux_s390x_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_linux_s390x_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_21\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"21\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:s390x\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk21_linux_s390x//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:s390x\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk21_linux_s390x//:jdk\",\n)\n" - } - }, - "local_jdk": { - "bzlFile": "@@rules_java~7.12.2//toolchains:local_java_repository.bzl", - "ruleClassName": "_local_java_repository_rule", - "attributes": { - "name": "rules_java~7.12.2~toolchains~local_jdk", - "runtime_name": "local_jdk", - "java_home": "", - "version": "", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = {RUNTIME_VERSION},\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = {RUNTIME_VERSION},\n)\n" - } - }, - "remote_java_tools_darwin_x86_64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_java_tools_darwin_x86_64", - "sha256": "802bfb5085cec0ac5745a637ae2e7a7152c54230ba542d093a10bd48ba29ba6f", - "urls": [ - "https://mirror.bazel.build/bazel_java_tools/releases/java/v13.9/java_tools_darwin_x86_64-v13.9.zip", - "https://github.com/bazelbuild/java_tools/releases/download/java_v13.9/java_tools_darwin_x86_64-v13.9.zip" - ] - } - }, - "remote_jdk8_macos_aarch64_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_jdk8_macos_aarch64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_8\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"8\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remote_jdk8_macos_aarch64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remote_jdk8_macos_aarch64//:jdk\",\n)\n" - } - }, - "remote_java_tools": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_java_tools", - "sha256": "3b92e0c1884ac0e9683e87c3c49e1098cff91faeacdb76cc90d92efb0df861cf", - "urls": [ - "https://mirror.bazel.build/bazel_java_tools/releases/java/v13.9/java_tools-v13.9.zip", - "https://github.com/bazelbuild/java_tools/releases/download/java_v13.9/java_tools-v13.9.zip" - ] - } - }, - "remotejdk17_win_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_win_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_win//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_win//:jdk\",\n)\n" - } - }, - "remotejdk21_linux_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_linux_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_21\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"21\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk21_linux//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk21_linux//:jdk\",\n)\n" - } - }, - "remotejdk17_macos_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_macos_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_macos//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_macos//:jdk\",\n)\n" - } - }, - "remote_jdk8_macos_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_jdk8_macos_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_8\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"8\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remote_jdk8_macos//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remote_jdk8_macos//:jdk\",\n)\n" - } - }, - "remotejdk21_macos_aarch64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_macos_aarch64", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n", - "sha256": "bc2750f81a166cc6e9c30ae8aaba54f253a8c8ec9d8cfc04a555fe20712c7bff", - "strip_prefix": "zulu21.36.17-ca-jdk21.0.4-macosx_aarch64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu21.36.17-ca-jdk21.0.4-macosx_aarch64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.36.17-ca-jdk21.0.4-macosx_aarch64.tar.gz" - ] - } - }, - "remote_jdk8_linux_s390x_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_jdk8_linux_s390x_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_8\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"8\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:s390x\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remote_jdk8_linux_s390x//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:s390x\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remote_jdk8_linux_s390x//:jdk\",\n)\n" - } - }, - "remotejdk17_macos_aarch64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_macos_aarch64", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", - "sha256": "dd1a82d57e80cdefb045066e5c28b5bd41e57eea9c57303ec7e012b57230bb9c", - "strip_prefix": "zulu17.50.19-ca-jdk17.0.11-macosx_aarch64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-macosx_aarch64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-macosx_aarch64.tar.gz" - ] - } - }, - "remote_jdk8_linux_aarch64_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_jdk8_linux_aarch64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_8\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"8\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remote_jdk8_linux_aarch64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remote_jdk8_linux_aarch64//:jdk\",\n)\n" - } - }, - "remotejdk11_win": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_win", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", - "sha256": "1295b2affe498018c45f6f15187b58c4456d51dce5eb608ee73ef7665d4566d2", - "strip_prefix": "zulu11.72.19-ca-jdk11.0.23-win_x64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-win_x64.zip", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-win_x64.zip" - ] - } - }, - "remote_jdk8_linux": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_jdk8_linux", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 8,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 8,\n)\n", - "sha256": "9c0ac5ebffa61520fee78ead52add0f4edd3b1b54b01b6a17429b719515caf90", - "strip_prefix": "zulu8.78.0.19-ca-jdk8.0.412-linux_x64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-linux_x64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-linux_x64.tar.gz" - ] - } - }, - "remotejdk11_linux_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_linux_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux//:jdk\",\n)\n" - } - }, - "remotejdk11_macos": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_macos", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", - "sha256": "e5b19b82045826ae09c9d17742691bc9e40312c44be7bd7598ae418a3d4edb1c", - "strip_prefix": "zulu11.72.19-ca-jdk11.0.23-macosx_x64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-macosx_x64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-macosx_x64.tar.gz" - ] - } - }, - "remotejdk11_win_arm64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_win_arm64", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", - "sha256": "b8a28e6e767d90acf793ea6f5bed0bb595ba0ba5ebdf8b99f395266161e53ec2", - "strip_prefix": "jdk-11.0.13+8", - "urls": [ - "https://aka.ms/download-jdk/microsoft-jdk-11.0.13.8.1-windows-aarch64.zip", - "https://mirror.bazel.build/aka.ms/download-jdk/microsoft-jdk-11.0.13.8.1-windows-aarch64.zip" - ] - } - }, - "remotejdk21_macos": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_macos", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n", - "sha256": "5ce75a6a247c7029b74c4ca7cf6f60fd2b2d68ce1e8956fb448d2984316b5fea", - "strip_prefix": "zulu21.36.17-ca-jdk21.0.4-macosx_x64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu21.36.17-ca-jdk21.0.4-macosx_x64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.36.17-ca-jdk21.0.4-macosx_x64.tar.gz" - ] - } - }, - "remotejdk17_macos_aarch64_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_macos_aarch64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_macos_aarch64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_macos_aarch64//:jdk\",\n)\n" - } - }, - "remote_jdk8_linux_aarch64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_jdk8_linux_aarch64", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 8,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 8,\n)\n", - "sha256": "82c46c65d57e187ef68fdd125ef760eaeb52ebfe1be1a6a251cf5b43cbebc78a", - "strip_prefix": "zulu8.78.0.19-ca-jdk8.0.412-linux_aarch64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-linux_aarch64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-linux_aarch64.tar.gz" - ] - } - }, - "remotejdk11_macos_aarch64_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_macos_aarch64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_macos_aarch64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_macos_aarch64//:jdk\",\n)\n" - } - }, - "remotejdk21_linux": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_linux", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n", - "sha256": "318d0c2ed3c876fb7ea2c952945cdcf7decfb5264ca51aece159e635ac53d544", - "strip_prefix": "zulu21.36.17-ca-jdk21.0.4-linux_x64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu21.36.17-ca-jdk21.0.4-linux_x64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.36.17-ca-jdk21.0.4-linux_x64.tar.gz" - ] - } - }, - "remote_java_tools_linux": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_java_tools_linux", - "sha256": "7a3d7b1cd080efdf49ab2a3818177799416734acf2bd23040aa9037141287548", - "urls": [ - "https://mirror.bazel.build/bazel_java_tools/releases/java/v13.9/java_tools_linux-v13.9.zip", - "https://github.com/bazelbuild/java_tools/releases/download/java_v13.9/java_tools_linux-v13.9.zip" - ] - } - }, - "remotejdk21_win": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_win", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n", - "sha256": "d771dad10d3f0b440c3686d1f3d2b68b320802ac97b212d87671af3f2eef8848", - "strip_prefix": "zulu21.36.17-ca-jdk21.0.4-win_x64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu21.36.17-ca-jdk21.0.4-win_x64.zip", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.36.17-ca-jdk21.0.4-win_x64.zip" - ] - } - }, - "remotejdk21_linux_aarch64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_linux_aarch64", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n", - "sha256": "da3c2d7db33670bcf66532441aeb7f33dcf0d227c8dafe7ce35cee67f6829c4c", - "strip_prefix": "zulu21.36.17-ca-jdk21.0.4-linux_aarch64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu21.36.17-ca-jdk21.0.4-linux_aarch64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.36.17-ca-jdk21.0.4-linux_aarch64.tar.gz" - ] - } - }, - "remotejdk11_linux_aarch64_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_linux_aarch64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_aarch64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_aarch64//:jdk\",\n)\n" - } - }, - "remotejdk11_linux_s390x": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_linux_s390x", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", - "sha256": "a58fc0361966af0a5d5a31a2d8a208e3c9bb0f54f345596fd80b99ea9a39788b", - "strip_prefix": "jdk-11.0.15+10", - "urls": [ - "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_s390x_linux_hotspot_11.0.15_10.tar.gz", - "https://mirror.bazel.build/github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_s390x_linux_hotspot_11.0.15_10.tar.gz" - ] - } - }, - "remotejdk17_linux_aarch64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_linux_aarch64", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", - "sha256": "518cc455c0c7b49c0ae7d809c0bb87ab371bb850d46abb8efad5010c6a06faec", - "strip_prefix": "zulu17.50.19-ca-jdk17.0.11-linux_aarch64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-linux_aarch64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-linux_aarch64.tar.gz" - ] - } - }, - "remotejdk21_win_arm64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_win_arm64", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n", - "sha256": "9f873eccf030b1d3dc879ec1eb0ff5e11bf76002dc81c5c644c3462bf6c5146b", - "strip_prefix": "zulu21.36.17-ca-jdk21.0.4-win_aarch64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu21.36.17-ca-jdk21.0.4-win_aarch64.zip", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.36.17-ca-jdk21.0.4-win_aarch64.zip" - ] - } - }, - "remotejdk21_linux_s390x": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_linux_s390x", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n", - "sha256": "c900c8d64fab1e53274974fa4a4c736a5a3754485a5c56f4947281480773658a", - "strip_prefix": "jdk-21.0.4+7", - "urls": [ - "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.4+7/OpenJDK21U-jdk_s390x_linux_hotspot_21.0.4_7.tar.gz", - "https://mirror.bazel.build/github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.4+7/OpenJDK21U-jdk_s390x_linux_hotspot_21.0.4_7.tar.gz" - ] - } - }, - "remotejdk17_linux_ppc64le_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_linux_ppc64le_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:ppc\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux_ppc64le//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:ppc\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux_ppc64le//:jdk\",\n)\n" - } - }, - "remote_java_tools_darwin_arm64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_java_tools_darwin_arm64", - "sha256": "9fa400a43153b048ae5a785e3ee533d675ed6a994ab3c763f50bd15a28544c10", - "urls": [ - "https://mirror.bazel.build/bazel_java_tools/releases/java/v13.9/java_tools_darwin_arm64-v13.9.zip", - "https://github.com/bazelbuild/java_tools/releases/download/java_v13.9/java_tools_darwin_arm64-v13.9.zip" - ] - } - }, - "remotejdk21_linux_ppc64le_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_linux_ppc64le_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_21\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"21\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:ppc\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk21_linux_ppc64le//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:ppc\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk21_linux_ppc64le//:jdk\",\n)\n" - } - }, - "remotejdk21_linux_aarch64_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_linux_aarch64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_21\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"21\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk21_linux_aarch64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk21_linux_aarch64//:jdk\",\n)\n" - } - }, - "remotejdk11_win_arm64_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_win_arm64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:arm64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_win_arm64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:arm64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_win_arm64//:jdk\",\n)\n" - } - }, - "remote_jdk8_windows_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remote_jdk8_windows_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_8\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"8\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remote_jdk8_windows//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remote_jdk8_windows//:jdk\",\n)\n" - } - }, - "remotejdk17_linux_s390x": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk17_linux_s390x", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", - "sha256": "ffacba69c6843d7ca70d572489d6cc7ab7ae52c60f0852cedf4cf0d248b6fc37", - "strip_prefix": "jdk-17.0.8.1+1", - "urls": [ - "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8.1+1/OpenJDK17U-jdk_s390x_linux_hotspot_17.0.8.1_1.tar.gz", - "https://mirror.bazel.build/github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8.1+1/OpenJDK17U-jdk_s390x_linux_hotspot_17.0.8.1_1.tar.gz" - ] - } - }, - "remotejdk11_macos_aarch64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_macos_aarch64", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", - "sha256": "40fb1918385e03814b67b7608c908c7f945ccbeddbbf5ed062cdfb2602e21c83", - "strip_prefix": "zulu11.72.19-ca-jdk11.0.23-macosx_aarch64", - "urls": [ - "https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-macosx_aarch64.tar.gz", - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-macosx_aarch64.tar.gz" - ] - } - }, - "remotejdk11_linux_ppc64le": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk11_linux_ppc64le", - "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n\nfilegroup(\n name = \"jdk-jmods\",\n srcs = glob(\n [\"jmods/**\"],\n allow_empty = True,\n ),\n)\n\njava_runtime(\n name = \"jdk-with-jmods\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jdk-jmods\",\n \":jre\",\n ],\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", - "sha256": "a8fba686f6eb8ae1d1a9566821dbd5a85a1108b96ad857fdbac5c1e4649fc56f", - "strip_prefix": "jdk-11.0.15+10", - "urls": [ - "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.15_10.tar.gz", - "https://mirror.bazel.build/github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.15_10.tar.gz" - ] - } - }, - "remotejdk21_win_toolchain_config_repo": { - "bzlFile": "@@rules_java~7.12.2//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~7.12.2~toolchains~remotejdk21_win_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_21\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"21\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk21_win//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@rules_java//toolchains:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk21_win//:jdk\",\n)\n" - } - } - } - } - }, - "@@rules_kotlin~1.9.6//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { - "general": { - "bzlTransitiveDigest": "n/WSS9Wuf6O9uJeYf4X0jb+RES6XAZSpmL8d2qDw46k=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "rules_android": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_kotlin~1.9.6~rules_kotlin_extensions~rules_android", - "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", - "strip_prefix": "rules_android-0.1.1", - "urls": [ - "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" - ] + "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" + ], + "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", + "strip_version": "1.9.23-1.0.20" } }, "com_github_pinterest_ktlint": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", "attributes": { - "name": "rules_kotlin~1.9.6~rules_kotlin_extensions~com_github_pinterest_ktlint", "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", "urls": [ "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" @@ -3084,1101 +889,145 @@ "executable": true } }, - "com_github_jetbrains_kotlin": { - "bzlFile": "@@rules_kotlin~1.9.6//src/main/starlark/core/repositories:compiler.bzl", - "ruleClassName": "kotlin_capabilities_repository", + "rules_android": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "name": "rules_kotlin~1.9.6~rules_kotlin_extensions~com_github_jetbrains_kotlin", - "git_repository_name": "com_github_jetbrains_kotlin_git", - "compiler_version": "1.9.23" - } - }, - "com_github_jetbrains_kotlin_git": { - "bzlFile": "@@rules_kotlin~1.9.6//src/main/starlark/core/repositories:compiler.bzl", - "ruleClassName": "kotlin_compiler_git_repository", - "attributes": { - "name": "rules_kotlin~1.9.6~rules_kotlin_extensions~com_github_jetbrains_kotlin_git", + "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", + "strip_prefix": "rules_android-0.1.1", "urls": [ - "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" - ], - "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" - } - }, - "com_github_google_ksp": { - "bzlFile": "@@rules_kotlin~1.9.6//src/main/starlark/core/repositories:ksp.bzl", - "ruleClassName": "ksp_compiler_plugin_repository", - "attributes": { - "name": "rules_kotlin~1.9.6~rules_kotlin_extensions~com_github_google_ksp", - "urls": [ - "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" - ], - "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", - "strip_version": "1.9.23-1.0.20" - } - } - } - } - }, - "@@rules_python~0.33.2//python/extensions:python.bzl%python": { - "general": { - "bzlTransitiveDigest": "2yCkhoxFQywJhF/ZomV8mXnIw1ZbmZCYzdNvXLKVQdk=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "python_3_11_s390x-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_11_s390x-unknown-linux-gnu", - "sha256": "3f7a0dd64fa292977c4da09e865ee504a48e55dbc2dbfd9ff4b991af891e4446", - "patches": [], - "platform": "s390x-unknown-linux-gnu", - "python_version": "3.11.9", - "release_filename": "20240415/cpython-3.11.9+20240415-s390x-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.11.9+20240415-s390x-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_8_aarch64-apple-darwin": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_8_aarch64-apple-darwin", - "sha256": "eae09ed83ee66353c0cee435ea2d3e4868bd0537214803fb256a1a2928710bc0", - "patches": [], - "platform": "aarch64-apple-darwin", - "python_version": "3.8.19", - "release_filename": "20240415/cpython-3.8.19+20240415-aarch64-apple-darwin-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.8.19+20240415-aarch64-apple-darwin-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_10_aarch64-apple-darwin": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_10_aarch64-apple-darwin", - "sha256": "389da793b7666e9310908b4fe3ddcf0a20b55727fcb384c7c49b01bb21716f89", - "patches": [], - "platform": "aarch64-apple-darwin", - "python_version": "3.10.14", - "release_filename": "20240415/cpython-3.10.14+20240415-aarch64-apple-darwin-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.10.14+20240415-aarch64-apple-darwin-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_10_x86_64-apple-darwin": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_10_x86_64-apple-darwin", - "sha256": "8e27ec6f27b3a27be892c7a9db1e278c858acd9d90c1114013fe5587cd6fc5e6", - "patches": [], - "platform": "x86_64-apple-darwin", - "python_version": "3.10.14", - "release_filename": "20240415/cpython-3.10.14+20240415-x86_64-apple-darwin-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.10.14+20240415-x86_64-apple-darwin-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_11_aarch64-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_11_aarch64-unknown-linux-gnu", - "sha256": "b3a7199ac2615d75fb906e5ba556432efcf24baf8651fc70370d9f052d4069ee", - "patches": [], - "platform": "aarch64-unknown-linux-gnu", - "python_version": "3.11.9", - "release_filename": "20240415/cpython-3.11.9+20240415-aarch64-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.11.9+20240415-aarch64-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_10_ppc64le-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_10_ppc64le-unknown-linux-gnu", - "sha256": "9f178c19850567391188c2f9de87ce3c9fce698a23f5f3470be03745a03d1daa", - "patches": [], - "platform": "ppc64le-unknown-linux-gnu", - "python_version": "3.10.14", - "release_filename": "20240415/cpython-3.10.14+20240415-ppc64le-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.10.14+20240415-ppc64le-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_10_x86_64-pc-windows-msvc": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_10_x86_64-pc-windows-msvc", - "sha256": "186b5632fb2fa5b5e6eee4110ce9bbb0349f52bb2163d2a1f5188b1d8eb1b5f3", - "patches": [], - "platform": "x86_64-pc-windows-msvc", - "python_version": "3.10.14", - "release_filename": "20240415/cpython-3.10.14+20240415-x86_64-pc-windows-msvc-shared-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.10.14+20240415-x86_64-pc-windows-msvc-shared-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "pythons_hub": { - "bzlFile": "@@rules_python~0.33.2//python/private/bzlmod:pythons_hub.bzl", - "ruleClassName": "hub_repo", - "attributes": { - "name": "rules_python~0.33.2~python~pythons_hub", - "default_python_version": "3.11", - "toolchain_prefixes": [ - "_0000_python_3_8_", - "_0001_python_3_9_", - "_0002_python_3_10_", - "_0003_python_3_12_", - "_0004_python_3_11_" - ], - "toolchain_python_versions": [ - "3.8", - "3.9", - "3.10", - "3.12", - "3.11" - ], - "toolchain_set_python_version_constraints": [ - "True", - "True", - "True", - "True", - "False" - ], - "toolchain_user_repository_names": [ - "python_3_8", - "python_3_9", - "python_3_10", - "python_3_12", - "python_3_11" + "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" ] } - }, - "python_3_12_x86_64-pc-windows-msvc": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_12_x86_64-pc-windows-msvc", - "sha256": "f7cfa4ad072feb4578c8afca5ba9a54ad591d665a441dd0d63aa366edbe19279", - "patches": [], - "platform": "x86_64-pc-windows-msvc", - "python_version": "3.12.3", - "release_filename": "20240415/cpython-3.12.3+20240415-x86_64-pc-windows-msvc-shared-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.12.3+20240415-x86_64-pc-windows-msvc-shared-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_12_x86_64-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_12_x86_64-unknown-linux-gnu", - "sha256": "a73ba777b5d55ca89edef709e6b8521e3f3d4289581f174c8699adfb608d09d6", - "patches": [], - "platform": "x86_64-unknown-linux-gnu", - "python_version": "3.12.3", - "release_filename": "20240415/cpython-3.12.3+20240415-x86_64-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.12.3+20240415-x86_64-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_9_host": { - "bzlFile": "@@rules_python~0.33.2//python/private:toolchains_repo.bzl", - "ruleClassName": "host_toolchain", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_9_host", - "python_version": "3.9.19", - "user_repository_name": "python_3_9", - "platforms": [ - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu", - "ppc64le-unknown-linux-gnu", - "s390x-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-pc-windows-msvc", - "x86_64-unknown-linux-gnu" - ] - } - }, - "python_3_12_aarch64-apple-darwin": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_12_aarch64-apple-darwin", - "sha256": "ccc40e5af329ef2af81350db2a88bbd6c17b56676e82d62048c15d548401519e", - "patches": [], - "platform": "aarch64-apple-darwin", - "python_version": "3.12.3", - "release_filename": "20240415/cpython-3.12.3+20240415-aarch64-apple-darwin-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.12.3+20240415-aarch64-apple-darwin-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_8_x86_64-pc-windows-msvc": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_8_x86_64-pc-windows-msvc", - "sha256": "ee95c27e5d9de165e77c280ad4d7b51b0dab9567e7e233fc3acf72363870a168", - "patches": [], - "platform": "x86_64-pc-windows-msvc", - "python_version": "3.8.19", - "release_filename": "20240415/cpython-3.8.19+20240415-x86_64-pc-windows-msvc-shared-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.8.19+20240415-x86_64-pc-windows-msvc-shared-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_9_ppc64le-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_9_ppc64le-unknown-linux-gnu", - "sha256": "2521ebe9eef273ab718670ed6c6c11760214cdc2e34b7609674179629659a6cd", - "patches": [], - "platform": "ppc64le-unknown-linux-gnu", - "python_version": "3.9.19", - "release_filename": "20240415/cpython-3.9.19+20240415-ppc64le-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.9.19+20240415-ppc64le-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_12_s390x-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_12_s390x-unknown-linux-gnu", - "sha256": "872fc321363b8cdd826fd2cb1adfd1ceb813bc1281f9d410c1c2c4e177e8df86", - "patches": [], - "platform": "s390x-unknown-linux-gnu", - "python_version": "3.12.3", - "release_filename": "20240415/cpython-3.12.3+20240415-s390x-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.12.3+20240415-s390x-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_12_aarch64-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_12_aarch64-unknown-linux-gnu", - "sha256": "ec8126de97945e629cca9aedc80a29c4ae2992c9d69f2655e27ae73906ba187d", - "patches": [], - "platform": "aarch64-unknown-linux-gnu", - "python_version": "3.12.3", - "release_filename": "20240415/cpython-3.12.3+20240415-aarch64-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.12.3+20240415-aarch64-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_11_ppc64le-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_11_ppc64le-unknown-linux-gnu", - "sha256": "03f62d1e2d400c9662cdd12ae33a6f328c34ae8e2b872f8563a144834742bd6a", - "patches": [], - "platform": "ppc64le-unknown-linux-gnu", - "python_version": "3.11.9", - "release_filename": "20240415/cpython-3.11.9+20240415-ppc64le-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.11.9+20240415-ppc64le-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_9_x86_64-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_9_x86_64-unknown-linux-gnu", - "sha256": "00f698873804863dedc0e2b2c2cc4303b49ab0703af2e5883e11340cb8079d0f", - "patches": [], - "platform": "x86_64-unknown-linux-gnu", - "python_version": "3.9.19", - "release_filename": "20240415/cpython-3.9.19+20240415-x86_64-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.9.19+20240415-x86_64-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_12_host": { - "bzlFile": "@@rules_python~0.33.2//python/private:toolchains_repo.bzl", - "ruleClassName": "host_toolchain", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_12_host", - "python_version": "3.12.3", - "user_repository_name": "python_3_12", - "platforms": [ - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu", - "ppc64le-unknown-linux-gnu", - "s390x-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-pc-windows-msvc", - "x86_64-unknown-linux-gnu" - ] - } - }, - "python_3_9_s390x-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_9_s390x-unknown-linux-gnu", - "sha256": "8f83b8f357031cd6788ca253b1ac29020b73c8b41d0e5fb09a554d0d6c04ae83", - "patches": [], - "platform": "s390x-unknown-linux-gnu", - "python_version": "3.9.19", - "release_filename": "20240415/cpython-3.9.19+20240415-s390x-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.9.19+20240415-s390x-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_8_x86_64-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_8_x86_64-unknown-linux-gnu", - "sha256": "b33feb5ce0d7f9c4aca8621a9d231dfd9d2f6e26eccb56b63f07041ff573d5a5", - "patches": [], - "platform": "x86_64-unknown-linux-gnu", - "python_version": "3.8.19", - "release_filename": "20240415/cpython-3.8.19+20240415-x86_64-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.8.19+20240415-x86_64-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_8_host": { - "bzlFile": "@@rules_python~0.33.2//python/private:toolchains_repo.bzl", - "ruleClassName": "host_toolchain", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_8_host", - "python_version": "3.8.19", - "user_repository_name": "python_3_8", - "platforms": [ - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-pc-windows-msvc", - "x86_64-unknown-linux-gnu" - ] - } - }, - "python_3_11_host": { - "bzlFile": "@@rules_python~0.33.2//python/private:toolchains_repo.bzl", - "ruleClassName": "host_toolchain", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_11_host", - "python_version": "3.11.9", - "user_repository_name": "python_3_11", - "platforms": [ - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu", - "ppc64le-unknown-linux-gnu", - "s390x-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-pc-windows-msvc", - "x86_64-unknown-linux-gnu" - ] - } - }, - "python_3_9": { - "bzlFile": "@@rules_python~0.33.2//python/private:toolchains_repo.bzl", - "ruleClassName": "toolchain_aliases", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_9", - "python_version": "3.9.19", - "user_repository_name": "python_3_9", - "platforms": [ - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu", - "ppc64le-unknown-linux-gnu", - "s390x-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-pc-windows-msvc", - "x86_64-unknown-linux-gnu" - ] - } - }, - "python_3_11_aarch64-apple-darwin": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_11_aarch64-apple-darwin", - "sha256": "7af7058f7c268b4d87ed7e08c2c7844ef8460863b3e679db3afdce8bb1eedfae", - "patches": [], - "platform": "aarch64-apple-darwin", - "python_version": "3.11.9", - "release_filename": "20240415/cpython-3.11.9+20240415-aarch64-apple-darwin-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.11.9+20240415-aarch64-apple-darwin-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_8_aarch64-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_8_aarch64-unknown-linux-gnu", - "sha256": "5bde36c53a9a511a1618f159abed77264392eb054edeb57bb5740f6335db34a3", - "patches": [], - "platform": "aarch64-unknown-linux-gnu", - "python_version": "3.8.19", - "release_filename": "20240415/cpython-3.8.19+20240415-aarch64-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.8.19+20240415-aarch64-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_8": { - "bzlFile": "@@rules_python~0.33.2//python/private:toolchains_repo.bzl", - "ruleClassName": "toolchain_aliases", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_8", - "python_version": "3.8.19", - "user_repository_name": "python_3_8", - "platforms": [ - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-pc-windows-msvc", - "x86_64-unknown-linux-gnu" - ] - } - }, - "python_3_11_x86_64-pc-windows-msvc": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_11_x86_64-pc-windows-msvc", - "sha256": "368474c69f476e7de4adaf50b61d9fcf6ec8b4db88cc43c5f71c860b3cd29c69", - "patches": [], - "platform": "x86_64-pc-windows-msvc", - "python_version": "3.11.9", - "release_filename": "20240415/cpython-3.11.9+20240415-x86_64-pc-windows-msvc-shared-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.11.9+20240415-x86_64-pc-windows-msvc-shared-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_9_aarch64-apple-darwin": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_9_aarch64-apple-darwin", - "sha256": "2671bb4ffd036f03076c8aa41e3828c4c16a602e93e2249a8e7b28fd83fdde51", - "patches": [], - "platform": "aarch64-apple-darwin", - "python_version": "3.9.19", - "release_filename": "20240415/cpython-3.9.19+20240415-aarch64-apple-darwin-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.9.19+20240415-aarch64-apple-darwin-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_8_x86_64-apple-darwin": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_8_x86_64-apple-darwin", - "sha256": "05f0c488d84f7590afb6f5d192f071df80584339dda581b6186effc6cd690f6b", - "patches": [], - "platform": "x86_64-apple-darwin", - "python_version": "3.8.19", - "release_filename": "20240415/cpython-3.8.19+20240415-x86_64-apple-darwin-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.8.19+20240415-x86_64-apple-darwin-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_9_x86_64-pc-windows-msvc": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_9_x86_64-pc-windows-msvc", - "sha256": "9b46faee13e37d8bfa4c02de3775ca3d5dec9378697d755b750fd37788179286", - "patches": [], - "platform": "x86_64-pc-windows-msvc", - "python_version": "3.9.19", - "release_filename": "20240415/cpython-3.9.19+20240415-x86_64-pc-windows-msvc-shared-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.9.19+20240415-x86_64-pc-windows-msvc-shared-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_12": { - "bzlFile": "@@rules_python~0.33.2//python/private:toolchains_repo.bzl", - "ruleClassName": "toolchain_aliases", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_12", - "python_version": "3.12.3", - "user_repository_name": "python_3_12", - "platforms": [ - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu", - "ppc64le-unknown-linux-gnu", - "s390x-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-pc-windows-msvc", - "x86_64-unknown-linux-gnu" - ] - } - }, - "python_3_12_x86_64-apple-darwin": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_12_x86_64-apple-darwin", - "sha256": "c37a22fca8f57d4471e3708de6d13097668c5f160067f264bb2b18f524c890c8", - "patches": [], - "platform": "x86_64-apple-darwin", - "python_version": "3.12.3", - "release_filename": "20240415/cpython-3.12.3+20240415-x86_64-apple-darwin-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.12.3+20240415-x86_64-apple-darwin-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_9_aarch64-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_9_aarch64-unknown-linux-gnu", - "sha256": "b18ad819f04c5b2cff6ffa95dd59263d00dcd6f5633d11e43685b4017469cb1c", - "patches": [], - "platform": "aarch64-unknown-linux-gnu", - "python_version": "3.9.19", - "release_filename": "20240415/cpython-3.9.19+20240415-aarch64-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.9.19+20240415-aarch64-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_10_aarch64-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_10_aarch64-unknown-linux-gnu", - "sha256": "2f9f26c430df19d6d2a25ac3f2a8e74106d32b9951b85f95218ceeb13d52e952", - "patches": [], - "platform": "aarch64-unknown-linux-gnu", - "python_version": "3.10.14", - "release_filename": "20240415/cpython-3.10.14+20240415-aarch64-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.10.14+20240415-aarch64-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_11": { - "bzlFile": "@@rules_python~0.33.2//python/private:toolchains_repo.bzl", - "ruleClassName": "toolchain_aliases", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_11", - "python_version": "3.11.9", - "user_repository_name": "python_3_11", - "platforms": [ - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu", - "ppc64le-unknown-linux-gnu", - "s390x-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-pc-windows-msvc", - "x86_64-unknown-linux-gnu" - ] - } - }, - "python_3_10_s390x-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_10_s390x-unknown-linux-gnu", - "sha256": "648aa520de74ee426231e4a5349598990abe42a97c347ce6240b166f23ee5903", - "patches": [], - "platform": "s390x-unknown-linux-gnu", - "python_version": "3.10.14", - "release_filename": "20240415/cpython-3.10.14+20240415-s390x-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.10.14+20240415-s390x-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_10": { - "bzlFile": "@@rules_python~0.33.2//python/private:toolchains_repo.bzl", - "ruleClassName": "toolchain_aliases", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_10", - "python_version": "3.10.14", - "user_repository_name": "python_3_10", - "platforms": [ - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu", - "ppc64le-unknown-linux-gnu", - "s390x-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-pc-windows-msvc", - "x86_64-unknown-linux-gnu" - ] - } - }, - "python_3_11_x86_64-apple-darwin": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_11_x86_64-apple-darwin", - "sha256": "9afd734f63a23783cf0257bef25c9231ffc80e7747486dc54cf72f325213fd15", - "patches": [], - "platform": "x86_64-apple-darwin", - "python_version": "3.11.9", - "release_filename": "20240415/cpython-3.11.9+20240415-x86_64-apple-darwin-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.11.9+20240415-x86_64-apple-darwin-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_versions": { - "bzlFile": "@@rules_python~0.33.2//python/private:toolchains_repo.bzl", - "ruleClassName": "multi_toolchain_aliases", - "attributes": { - "name": "rules_python~0.33.2~python~python_versions", - "python_versions": { - "3.8": "python_3_8", - "3.9": "python_3_9", - "3.10": "python_3_10", - "3.11": "python_3_11", - "3.12": "python_3_12" - } - } - }, - "python_3_9_x86_64-apple-darwin": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_9_x86_64-apple-darwin", - "sha256": "627d903588c0e69ed8b941ba9f91e070e38105a627c5b8c730267744760dca84", - "patches": [], - "platform": "x86_64-apple-darwin", - "python_version": "3.9.19", - "release_filename": "20240415/cpython-3.9.19+20240415-x86_64-apple-darwin-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.9.19+20240415-x86_64-apple-darwin-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_10_x86_64-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_10_x86_64-unknown-linux-gnu", - "sha256": "c83c5485659250ef4e4fedb8e7f7b97bc99cc8cf5a1b11d0d1a98d347a43411d", - "patches": [], - "platform": "x86_64-unknown-linux-gnu", - "python_version": "3.10.14", - "release_filename": "20240415/cpython-3.10.14+20240415-x86_64-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.10.14+20240415-x86_64-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_12_ppc64le-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_12_ppc64le-unknown-linux-gnu", - "sha256": "c5dcf08b8077e617d949bda23027c49712f583120b3ed744f9b143da1d580572", - "patches": [], - "platform": "ppc64le-unknown-linux-gnu", - "python_version": "3.12.3", - "release_filename": "20240415/cpython-3.12.3+20240415-ppc64le-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.12.3+20240415-ppc64le-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_10_host": { - "bzlFile": "@@rules_python~0.33.2//python/private:toolchains_repo.bzl", - "ruleClassName": "host_toolchain", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_10_host", - "python_version": "3.10.14", - "user_repository_name": "python_3_10", - "platforms": [ - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu", - "ppc64le-unknown-linux-gnu", - "s390x-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-pc-windows-msvc", - "x86_64-unknown-linux-gnu" - ] - } - }, - "python_3_11_x86_64-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.33.2//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.33.2~python~python_3_11_x86_64-unknown-linux-gnu", - "sha256": "78b1c16a9fd032997ba92a60f46a64f795cd18ff335659dfdf6096df277b24d5", - "patches": [], - "platform": "x86_64-unknown-linux-gnu", - "python_version": "3.11.9", - "release_filename": "20240415/cpython-3.11.9+20240415-x86_64-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-3.11.9+20240415-x86_64-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - } - } - } - }, - "@@rules_python~0.33.2//python/private/bzlmod:internal_deps.bzl%internal_deps": { - "general": { - "bzlTransitiveDigest": "FRwqSbc8lJfoyffS6rQ/A7/T50hhWugS8E6dHrCt6ZY=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "pypi__wheel": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__wheel", - "url": "https://files.pythonhosted.org/packages/7d/cd/d7460c9a869b16c3dd4e1e403cce337df165368c71d6af229a74699622ce/wheel-0.43.0-py3-none-any.whl", - "sha256": "55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__click": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__click", - "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", - "sha256": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__importlib_metadata": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__importlib_metadata", - "url": "https://files.pythonhosted.org/packages/2d/0a/679461c511447ffaf176567d5c496d1de27cbe34a87df6677d7171b2fbd4/importlib_metadata-7.1.0-py3-none-any.whl", - "sha256": "30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__pyproject_hooks": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__pyproject_hooks", - "url": "https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl", - "sha256": "7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__pep517": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__pep517", - "url": "https://files.pythonhosted.org/packages/25/6e/ca4a5434eb0e502210f591b97537d322546e4833dcb4d470a48c375c5540/pep517-0.13.1-py3-none-any.whl", - "sha256": "31b206f67165b3536dd577c5c3f1518e8fbaf38cbc57efff8369a392feff1721", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__packaging": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__packaging", - "url": "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl", - "sha256": "2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__pip_tools": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__pip_tools", - "url": "https://files.pythonhosted.org/packages/0d/dc/38f4ce065e92c66f058ea7a368a9c5de4e702272b479c0992059f7693941/pip_tools-7.4.1-py3-none-any.whl", - "sha256": "4c690e5fbae2f21e87843e89c26191f0d9454f362d8acdbd695716493ec8b3a9", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__setuptools": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__setuptools", - "url": "https://files.pythonhosted.org/packages/de/88/70c5767a0e43eb4451c2200f07d042a4bcd7639276003a9c54a68cfcc1f8/setuptools-70.0.0-py3-none-any.whl", - "sha256": "54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__zipp": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__zipp", - "url": "https://files.pythonhosted.org/packages/da/55/a03fd7240714916507e1fcf7ae355bd9d9ed2e6db492595f1a67f61681be/zipp-3.18.2-py3-none-any.whl", - "sha256": "dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__colorama": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__colorama", - "url": "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", - "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__build": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__build", - "url": "https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl", - "sha256": "75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "rules_python_internal": { - "bzlFile": "@@rules_python~0.33.2//python/private:internal_config_repo.bzl", - "ruleClassName": "internal_config_repo", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~rules_python_internal" - } - }, - "pypi__pip": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__pip", - "url": "https://files.pythonhosted.org/packages/8a/6a/19e9fe04fca059ccf770861c7d5721ab4c2aebc539889e97c7977528a53b/pip-24.0-py3-none-any.whl", - "sha256": "ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__installer": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__installer", - "url": "https://files.pythonhosted.org/packages/e5/ca/1172b6638d52f2d6caa2dd262ec4c811ba59eee96d54a7701930726bce18/installer-0.7.0-py3-none-any.whl", - "sha256": "05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__more_itertools": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__more_itertools", - "url": "https://files.pythonhosted.org/packages/50/e2/8e10e465ee3987bb7c9ab69efb91d867d93959095f4807db102d07995d94/more_itertools-10.2.0-py3-none-any.whl", - "sha256": "686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__tomli": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.33.2~internal_deps~pypi__tomli", - "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", - "sha256": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } } }, - "moduleExtensionMetadata": { - "useAllRepos": "DEV" - } + "recordedRepoMappingEntries": [ + [ + "rules_kotlin+", + "bazel_tools", + "bazel_tools" + ] + ] } }, - "@@rules_shell~0.2.0//shell/private/extensions:sh_configure.bzl%sh_configure": { + "@@rules_nodejs+//nodejs:extensions.bzl%node": { "general": { - "bzlTransitiveDigest": "GiQdaEdSaKIKKFfskWOKLq3N1O5Xg3JMTvUnNjF3b0E=", - "accumulatedFileDigests": {}, + "bzlTransitiveDigest": "q44Ox2Nwogn6OsO0Xw5lhjkd/xmxkvvpwVOn5P4pmHQ=", + "usagesDigest": "dvgU19GDxAlbrGXe5JgEKoA1nd2xlYAmM4vziobHaSE=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, "envVariables": {}, "generatedRepoSpecs": { - "local_config_shell": { - "bzlFile": "@@rules_shell~0.2.0//shell/private/repositories:sh_config.bzl", - "ruleClassName": "sh_config", + "nodejs_linux_amd64": { + "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { - "name": "rules_shell~0.2.0~sh_configure~local_config_shell" + "node_download_auth": {}, + "node_repositories": {}, + "node_urls": [ + "https://nodejs.org/dist/v{version}/{filename}" + ], + "node_version": "18.20.5", + "include_headers": false, + "platform": "linux_amd64" + } + }, + "nodejs_linux_arm64": { + "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", + "attributes": { + "node_download_auth": {}, + "node_repositories": {}, + "node_urls": [ + "https://nodejs.org/dist/v{version}/{filename}" + ], + "node_version": "18.20.5", + "include_headers": false, + "platform": "linux_arm64" + } + }, + "nodejs_linux_s390x": { + "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", + "attributes": { + "node_download_auth": {}, + "node_repositories": {}, + "node_urls": [ + "https://nodejs.org/dist/v{version}/{filename}" + ], + "node_version": "18.20.5", + "include_headers": false, + "platform": "linux_s390x" + } + }, + "nodejs_linux_ppc64le": { + "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", + "attributes": { + "node_download_auth": {}, + "node_repositories": {}, + "node_urls": [ + "https://nodejs.org/dist/v{version}/{filename}" + ], + "node_version": "18.20.5", + "include_headers": false, + "platform": "linux_ppc64le" + } + }, + "nodejs_darwin_amd64": { + "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", + "attributes": { + "node_download_auth": {}, + "node_repositories": {}, + "node_urls": [ + "https://nodejs.org/dist/v{version}/{filename}" + ], + "node_version": "18.20.5", + "include_headers": false, + "platform": "darwin_amd64" + } + }, + "nodejs_darwin_arm64": { + "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", + "attributes": { + "node_download_auth": {}, + "node_repositories": {}, + "node_urls": [ + "https://nodejs.org/dist/v{version}/{filename}" + ], + "node_version": "18.20.5", + "include_headers": false, + "platform": "darwin_arm64" + } + }, + "nodejs_windows_amd64": { + "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", + "attributes": { + "node_download_auth": {}, + "node_repositories": {}, + "node_urls": [ + "https://nodejs.org/dist/v{version}/{filename}" + ], + "node_version": "18.20.5", + "include_headers": false, + "platform": "windows_amd64" + } + }, + "nodejs": { + "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", + "attributes": { + "user_node_repository_name": "nodejs" + } + }, + "nodejs_host": { + "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", + "attributes": { + "user_node_repository_name": "nodejs" + } + }, + "nodejs_toolchains": { + "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_toolchains_repo.bzl%nodejs_toolchains_repo", + "attributes": { + "user_node_repository_name": "nodejs" } } - } + }, + "recordedRepoMappingEntries": [] } } } diff --git a/naiveproxy/src/net/third_party/quiche/src/README.md b/naiveproxy/src/net/third_party/quiche/src/README.md index 0da8b06613..3b4f9b607b 100644 --- a/naiveproxy/src/net/third_party/quiche/src/README.md +++ b/naiveproxy/src/net/third_party/quiche/src/README.md @@ -26,3 +26,55 @@ To contribute to QUICHE, follow instructions at [CONTRIBUTING.md](CONTRIBUTING.md). QUICHE is only supported on little-endian platforms. + +## Build and run standalone QUICHE + +QUICHE has binaries that can run on Linux platforms. + +Follow the [instructions](https://bazel.build/install) to install Bazel. + +``` +sudo apt install libicu-dev clang lld +cd +git clone https://github.com/google/quiche.git +cd quiche +CC=clang bazel build -c opt //... +./bazel-bin/quiche/ +``` + +There are several targets that can be built and then run. Full usage +instructions are available using the `--helpfull` flag on any binary. + +* quic_packet_printer: from a provided packet, parses and prints out the + contents that are accessible without decryption. + +Usage: `quic_packet_printer server|client ` + +* crypto_message_printer: dumps the contents of a QUIC crypto handshake + message in a human readable format. + +Usage: `crypto_message_printer_bin ` + +* quic_client: connects to a host using QUIC and HTTP/3, sends a request to + the provided URL, and displays the response. + +Usage: `quic_client ` + +* quic_server: listens forever on --port (default 6121) until halted via + ctrl-c. + +* masque_client: tunnels to a URL via an identified proxy (See RFC 9298). + +Usage: `masque_client [options] ` + +* masque_server: a MASQUE tunnel proxy that defaults to port 9661. + +Usage: `masque_server` + +* web_transport_test_server: a server that clients can connect to via + WebTransport. + +* moqt_relay: a relay for the Media Over QUIC transport for publishers and + subscribers can connect to. + +Usage: `moqt_relay` diff --git a/naiveproxy/src/net/third_party/quiche/src/build/source_list.bzl b/naiveproxy/src/net/third_party/quiche/src/build/source_list.bzl index 2c9819717f..f1b9339e2b 100644 --- a/naiveproxy/src/net/third_party/quiche/src/build/source_list.bzl +++ b/naiveproxy/src/net/third_party/quiche/src/build/source_list.bzl @@ -227,13 +227,13 @@ quiche_core_hdrs = [ "quic/core/frames/quic_blocked_frame.h", "quic/core/frames/quic_connection_close_frame.h", "quic/core/frames/quic_crypto_frame.h", + "quic/core/frames/quic_datagram_frame.h", "quic/core/frames/quic_frame.h", "quic/core/frames/quic_goaway_frame.h", "quic/core/frames/quic_handshake_done_frame.h", "quic/core/frames/quic_immediate_ack_frame.h", "quic/core/frames/quic_inlined_frame.h", "quic/core/frames/quic_max_streams_frame.h", - "quic/core/frames/quic_message_frame.h", "quic/core/frames/quic_mtu_discovery_frame.h", "quic/core/frames/quic_new_connection_id_frame.h", "quic/core/frames/quic_new_token_frame.h", @@ -255,6 +255,7 @@ quiche_core_hdrs = [ "quic/core/http/http_encoder.h", "quic/core/http/http_frames.h", "quic/core/http/metadata_decoder.h", + "quic/core/http/quic_connection_migration_manager.h", "quic/core/http/quic_header_list.h", "quic/core/http/quic_headers_stream.h", "quic/core/http/quic_receive_control_stream.h", @@ -263,6 +264,7 @@ quiche_core_hdrs = [ "quic/core/http/quic_server_session_base.h", "quic/core/http/quic_spdy_client_session.h", "quic/core/http/quic_spdy_client_session_base.h", + "quic/core/http/quic_spdy_client_session_with_migration.h", "quic/core/http/quic_spdy_client_stream.h", "quic/core/http/quic_spdy_server_stream_base.h", "quic/core/http/quic_spdy_session.h", @@ -333,6 +335,7 @@ quiche_core_hdrs = [ "quic/core/quic_dispatcher_stats.h", "quic/core/quic_error_codes.h", "quic/core/quic_flow_controller.h", + "quic/core/quic_force_blockable_packet_writer.h", "quic/core/quic_framer.h", "quic/core/quic_generic_session.h", "quic/core/quic_idle_network_detector.h", @@ -349,6 +352,7 @@ quiche_core_hdrs = [ "quic/core/quic_packet_writer.h", "quic/core/quic_packet_writer_wrapper.h", "quic/core/quic_packets.h", + "quic/core/quic_path_context_factory.h", "quic/core/quic_path_validator.h", "quic/core/quic_ping_manager.h", "quic/core/quic_process_packet_interface.h", @@ -576,12 +580,12 @@ quiche_core_srcs = [ "quic/core/frames/quic_blocked_frame.cc", "quic/core/frames/quic_connection_close_frame.cc", "quic/core/frames/quic_crypto_frame.cc", + "quic/core/frames/quic_datagram_frame.cc", "quic/core/frames/quic_frame.cc", "quic/core/frames/quic_goaway_frame.cc", "quic/core/frames/quic_handshake_done_frame.cc", "quic/core/frames/quic_immediate_ack_frame.cc", "quic/core/frames/quic_max_streams_frame.cc", - "quic/core/frames/quic_message_frame.cc", "quic/core/frames/quic_new_connection_id_frame.cc", "quic/core/frames/quic_new_token_frame.cc", "quic/core/frames/quic_padding_frame.cc", @@ -600,6 +604,7 @@ quiche_core_srcs = [ "quic/core/http/http_decoder.cc", "quic/core/http/http_encoder.cc", "quic/core/http/metadata_decoder.cc", + "quic/core/http/quic_connection_migration_manager.cc", "quic/core/http/quic_header_list.cc", "quic/core/http/quic_headers_stream.cc", "quic/core/http/quic_receive_control_stream.cc", @@ -608,6 +613,7 @@ quiche_core_srcs = [ "quic/core/http/quic_server_session_base.cc", "quic/core/http/quic_spdy_client_session.cc", "quic/core/http/quic_spdy_client_session_base.cc", + "quic/core/http/quic_spdy_client_session_with_migration.cc", "quic/core/http/quic_spdy_client_stream.cc", "quic/core/http/quic_spdy_server_stream_base.cc", "quic/core/http/quic_spdy_session.cc", @@ -666,6 +672,7 @@ quiche_core_srcs = [ "quic/core/quic_dispatcher_stats.cc", "quic/core/quic_error_codes.cc", "quic/core/quic_flow_controller.cc", + "quic/core/quic_force_blockable_packet_writer.cc", "quic/core/quic_framer.cc", "quic/core/quic_generic_session.cc", "quic/core/quic_idle_network_detector.cc", @@ -1104,6 +1111,7 @@ quiche_tests_srcs = [ "common/lifetime_tracking_test.cc", "common/masque/connect_ip_datagram_payload_test.cc", "common/masque/connect_udp_datagram_payload_test.cc", + "common/platform/api/quiche_client_stats_test.cc", "common/platform/api/quiche_file_utils_test.cc", "common/platform/api/quiche_hostname_utils_test.cc", "common/platform/api/quiche_lower_case_string_test.cc", @@ -1116,6 +1124,7 @@ quiche_tests_srcs = [ "common/quiche_callbacks_test.cc", "common/quiche_circular_deque_test.cc", "common/quiche_data_reader_test.cc", + "common/quiche_data_writer_fuzz_test.cc", "common/quiche_data_writer_test.cc", "common/quiche_endian_test.cc", "common/quiche_intrusive_list_test.cc", @@ -1357,6 +1366,7 @@ quiche_tests_srcs = [ "quic/core/uber_quic_stream_id_manager_test.cc", "quic/core/uber_received_packet_manager_test.cc", "quic/core/web_transport_write_blocked_list_test.cc", + "quic/moqt/test_tools/moqt_simulator_test.cc", "quic/test_tools/crypto_test_utils_test.cc", "quic/test_tools/quic_test_utils_test.cc", "quic/test_tools/simple_session_notifier_test.cc", @@ -1378,6 +1388,7 @@ io_tests_hdrs = [ io_tests_srcs = [ "quic/core/chlo_extractor_test.cc", "quic/core/http/end_to_end_test.cc", + "quic/core/http/quic_connection_migration_manager_test.cc", "quic/core/http/quic_spdy_client_session_test.cc", "quic/core/http/quic_spdy_client_stream_test.cc", "quic/core/http/quic_spdy_server_stream_base_test.cc", @@ -1420,6 +1431,11 @@ cli_tools_srcs = [ "quic/masque/masque_server_bin.cc", "quic/masque/masque_tcp_client_bin.cc", "quic/masque/masque_tcp_server_bin.cc", + "quic/moqt/tools/chat_client_bin.cc", + "quic/moqt/tools/chat_server_bin.cc", + "quic/moqt/tools/moqt_ingestion_server_bin.cc", + "quic/moqt/tools/moqt_relay_bin.cc", + "quic/moqt/tools/moqt_simulator_bin.cc", "quic/tools/crypto_message_printer_bin.cc", "quic/tools/interactive_cli_demo_bin.cc", "quic/tools/qpack_offline_decoder_bin.cc", @@ -1541,76 +1557,98 @@ load_balancer_srcs = [ ] moqt_hdrs = [ "quic/moqt/moqt_bitrate_adjuster.h", - "quic/moqt/moqt_cached_object.h", - "quic/moqt/moqt_failed_fetch.h", + "quic/moqt/moqt_fetch_task.h", "quic/moqt/moqt_framer.h", "quic/moqt/moqt_known_track_publisher.h", "quic/moqt/moqt_live_relay_queue.h", "quic/moqt/moqt_messages.h", + "quic/moqt/moqt_object.h", "quic/moqt/moqt_outgoing_queue.h", "quic/moqt/moqt_parser.h", "quic/moqt/moqt_priority.h", "quic/moqt/moqt_probe_manager.h", "quic/moqt/moqt_publisher.h", + "quic/moqt/moqt_relay_publisher.h", + "quic/moqt/moqt_relay_track_publisher.h", "quic/moqt/moqt_session.h", "quic/moqt/moqt_session_callbacks.h", "quic/moqt/moqt_session_interface.h", "quic/moqt/moqt_subscribe_windows.h", + "quic/moqt/moqt_trace_recorder.h", "quic/moqt/moqt_track.h", - "quic/moqt/test_tools/moqt_framer_utils.h", - "quic/moqt/test_tools/moqt_parser_test_visitor.h", - "quic/moqt/test_tools/moqt_session_peer.h", - "quic/moqt/test_tools/moqt_simulator_harness.h", - "quic/moqt/test_tools/moqt_test_message.h", + "quic/moqt/relay_namespace_tree.h", + "quic/moqt/session_namespace_tree.h", "quic/moqt/tools/chat_client.h", "quic/moqt/tools/chat_server.h", "quic/moqt/tools/moq_chat.h", "quic/moqt/tools/moqt_client.h", - "quic/moqt/tools/moqt_mock_visitor.h", + "quic/moqt/tools/moqt_relay.h", "quic/moqt/tools/moqt_server.h", ] moqt_srcs = [ "quic/moqt/moqt_bitrate_adjuster.cc", - "quic/moqt/moqt_bitrate_adjuster_test.cc", - "quic/moqt/moqt_cached_object.cc", "quic/moqt/moqt_framer.cc", - "quic/moqt/moqt_framer_test.cc", - "quic/moqt/moqt_integration_test.cc", "quic/moqt/moqt_known_track_publisher.cc", "quic/moqt/moqt_live_relay_queue.cc", - "quic/moqt/moqt_live_relay_queue_test.cc", "quic/moqt/moqt_messages.cc", - "quic/moqt/moqt_messages_test.cc", + "quic/moqt/moqt_object.cc", "quic/moqt/moqt_outgoing_queue.cc", - "quic/moqt/moqt_outgoing_queue_test.cc", "quic/moqt/moqt_parser.cc", + "quic/moqt/moqt_priority.cc", + "quic/moqt/moqt_probe_manager.cc", + "quic/moqt/moqt_relay_publisher.cc", + "quic/moqt/moqt_relay_track_publisher.cc", + "quic/moqt/moqt_session.cc", + "quic/moqt/moqt_subscribe_windows.cc", + "quic/moqt/moqt_trace_recorder.cc", + "quic/moqt/moqt_track.cc", + "quic/moqt/tools/chat_client.cc", + "quic/moqt/tools/chat_server.cc", + "quic/moqt/tools/moq_chat.cc", + "quic/moqt/tools/moqt_client.cc", + "quic/moqt/tools/moqt_relay.cc", + "quic/moqt/tools/moqt_server.cc", +] +moqt_test_hdrs = [ +] +moqt_test_srcs = [ + "quic/moqt/moqt_bitrate_adjuster_test.cc", + "quic/moqt/moqt_framer_test.cc", + "quic/moqt/moqt_integration_test.cc", + "quic/moqt/moqt_live_relay_queue_test.cc", + "quic/moqt/moqt_messages_test.cc", + "quic/moqt/moqt_outgoing_queue_test.cc", "quic/moqt/moqt_parser_fuzz_test.cc", "quic/moqt/moqt_parser_test.cc", - "quic/moqt/moqt_priority.cc", "quic/moqt/moqt_priority_test.cc", - "quic/moqt/moqt_probe_manager.cc", "quic/moqt/moqt_probe_manager_test.cc", - "quic/moqt/moqt_session.cc", + "quic/moqt/moqt_relay_publisher_test.cc", + "quic/moqt/moqt_relay_track_publisher_test.cc", "quic/moqt/moqt_session_test.cc", - "quic/moqt/moqt_subscribe_windows.cc", "quic/moqt/moqt_subscribe_windows_test.cc", - "quic/moqt/moqt_track.cc", "quic/moqt/moqt_track_test.cc", - "quic/moqt/test_tools/moqt_framer_utils.cc", - "quic/moqt/test_tools/moqt_simulator_harness.cc", - "quic/moqt/tools/chat_client.cc", - "quic/moqt/tools/chat_client_bin.cc", - "quic/moqt/tools/chat_server.cc", - "quic/moqt/tools/chat_server_bin.cc", - "quic/moqt/tools/moq_chat.cc", + "quic/moqt/relay_namespace_tree_test.cc", + "quic/moqt/session_namespace_tree_test.cc", "quic/moqt/tools/moq_chat_end_to_end_test.cc", "quic/moqt/tools/moq_chat_test.cc", - "quic/moqt/tools/moqt_client.cc", "quic/moqt/tools/moqt_end_to_end_test.cc", - "quic/moqt/tools/moqt_ingestion_server_bin.cc", - "quic/moqt/tools/moqt_server.cc", + "quic/moqt/tools/moqt_relay_test.cc", "quic/moqt/tools/moqt_server_test.cc", - "quic/moqt/tools/moqt_simulator_bin.cc", +] +moqt_test_support_hdrs = [ + "quic/moqt/test_tools/mock_moqt_session.h", + "quic/moqt/test_tools/moqt_framer_utils.h", + "quic/moqt/test_tools/moqt_mock_visitor.h", + "quic/moqt/test_tools/moqt_parser_test_visitor.h", + "quic/moqt/test_tools/moqt_session_peer.h", + "quic/moqt/test_tools/moqt_simulator.h", + "quic/moqt/test_tools/moqt_simulator_harness.h", + "quic/moqt/test_tools/moqt_test_message.h", +] +moqt_test_support_srcs = [ + "quic/moqt/test_tools/moqt_framer_utils.cc", + "quic/moqt/test_tools/moqt_simulator.cc", + "quic/moqt/test_tools/moqt_simulator_harness.cc", ] binary_http_hdrs = [ "binary_http/binary_http_message.h", @@ -1621,6 +1659,8 @@ binary_http_srcs = [ oblivious_http_hdrs = [ "oblivious_http/buffers/oblivious_http_request.h", "oblivious_http/buffers/oblivious_http_response.h", + "oblivious_http/common/oblivious_http_chunk_handler.h", + "oblivious_http/common/oblivious_http_definitions.h", "oblivious_http/common/oblivious_http_header_key_config.h", "oblivious_http/oblivious_http_client.h", "oblivious_http/oblivious_http_gateway.h", @@ -1713,7 +1753,10 @@ blind_sign_auth_hdrs = [ "blind_sign_auth/blind_sign_auth_test_data.h", "blind_sign_auth/blind_sign_message_interface.h", "blind_sign_auth/blind_sign_message_response.h", + "blind_sign_auth/blind_sign_tracing_hooks.h", "blind_sign_auth/cached_blind_sign_auth.h", + "blind_sign_auth/direct_task_bundle.h", + "blind_sign_auth/task_bundle.h", "blind_sign_auth/test_tools/mock_blind_sign_auth_interface.h", "blind_sign_auth/test_tools/mock_blind_sign_message_interface.h", ] @@ -1722,6 +1765,7 @@ blind_sign_auth_srcs = [ "blind_sign_auth/blind_sign_auth_test_data.cc", "blind_sign_auth/blind_sign_message_response.cc", "blind_sign_auth/cached_blind_sign_auth.cc", + "blind_sign_auth/direct_task_bundle.cc", ] blind_sign_auth_tests_hdrs = [ ] diff --git a/naiveproxy/src/net/third_party/quiche/src/build/source_list.gni b/naiveproxy/src/net/third_party/quiche/src/build/source_list.gni index 6be36a6fd2..ad9e46d0c3 100644 --- a/naiveproxy/src/net/third_party/quiche/src/build/source_list.gni +++ b/naiveproxy/src/net/third_party/quiche/src/build/source_list.gni @@ -227,13 +227,13 @@ quiche_core_hdrs = [ "src/quiche/quic/core/frames/quic_blocked_frame.h", "src/quiche/quic/core/frames/quic_connection_close_frame.h", "src/quiche/quic/core/frames/quic_crypto_frame.h", + "src/quiche/quic/core/frames/quic_datagram_frame.h", "src/quiche/quic/core/frames/quic_frame.h", "src/quiche/quic/core/frames/quic_goaway_frame.h", "src/quiche/quic/core/frames/quic_handshake_done_frame.h", "src/quiche/quic/core/frames/quic_immediate_ack_frame.h", "src/quiche/quic/core/frames/quic_inlined_frame.h", "src/quiche/quic/core/frames/quic_max_streams_frame.h", - "src/quiche/quic/core/frames/quic_message_frame.h", "src/quiche/quic/core/frames/quic_mtu_discovery_frame.h", "src/quiche/quic/core/frames/quic_new_connection_id_frame.h", "src/quiche/quic/core/frames/quic_new_token_frame.h", @@ -255,6 +255,7 @@ quiche_core_hdrs = [ "src/quiche/quic/core/http/http_encoder.h", "src/quiche/quic/core/http/http_frames.h", "src/quiche/quic/core/http/metadata_decoder.h", + "src/quiche/quic/core/http/quic_connection_migration_manager.h", "src/quiche/quic/core/http/quic_header_list.h", "src/quiche/quic/core/http/quic_headers_stream.h", "src/quiche/quic/core/http/quic_receive_control_stream.h", @@ -263,6 +264,7 @@ quiche_core_hdrs = [ "src/quiche/quic/core/http/quic_server_session_base.h", "src/quiche/quic/core/http/quic_spdy_client_session.h", "src/quiche/quic/core/http/quic_spdy_client_session_base.h", + "src/quiche/quic/core/http/quic_spdy_client_session_with_migration.h", "src/quiche/quic/core/http/quic_spdy_client_stream.h", "src/quiche/quic/core/http/quic_spdy_server_stream_base.h", "src/quiche/quic/core/http/quic_spdy_session.h", @@ -333,6 +335,7 @@ quiche_core_hdrs = [ "src/quiche/quic/core/quic_dispatcher_stats.h", "src/quiche/quic/core/quic_error_codes.h", "src/quiche/quic/core/quic_flow_controller.h", + "src/quiche/quic/core/quic_force_blockable_packet_writer.h", "src/quiche/quic/core/quic_framer.h", "src/quiche/quic/core/quic_generic_session.h", "src/quiche/quic/core/quic_idle_network_detector.h", @@ -349,6 +352,7 @@ quiche_core_hdrs = [ "src/quiche/quic/core/quic_packet_writer.h", "src/quiche/quic/core/quic_packet_writer_wrapper.h", "src/quiche/quic/core/quic_packets.h", + "src/quiche/quic/core/quic_path_context_factory.h", "src/quiche/quic/core/quic_path_validator.h", "src/quiche/quic/core/quic_ping_manager.h", "src/quiche/quic/core/quic_process_packet_interface.h", @@ -576,12 +580,12 @@ quiche_core_srcs = [ "src/quiche/quic/core/frames/quic_blocked_frame.cc", "src/quiche/quic/core/frames/quic_connection_close_frame.cc", "src/quiche/quic/core/frames/quic_crypto_frame.cc", + "src/quiche/quic/core/frames/quic_datagram_frame.cc", "src/quiche/quic/core/frames/quic_frame.cc", "src/quiche/quic/core/frames/quic_goaway_frame.cc", "src/quiche/quic/core/frames/quic_handshake_done_frame.cc", "src/quiche/quic/core/frames/quic_immediate_ack_frame.cc", "src/quiche/quic/core/frames/quic_max_streams_frame.cc", - "src/quiche/quic/core/frames/quic_message_frame.cc", "src/quiche/quic/core/frames/quic_new_connection_id_frame.cc", "src/quiche/quic/core/frames/quic_new_token_frame.cc", "src/quiche/quic/core/frames/quic_padding_frame.cc", @@ -600,6 +604,7 @@ quiche_core_srcs = [ "src/quiche/quic/core/http/http_decoder.cc", "src/quiche/quic/core/http/http_encoder.cc", "src/quiche/quic/core/http/metadata_decoder.cc", + "src/quiche/quic/core/http/quic_connection_migration_manager.cc", "src/quiche/quic/core/http/quic_header_list.cc", "src/quiche/quic/core/http/quic_headers_stream.cc", "src/quiche/quic/core/http/quic_receive_control_stream.cc", @@ -608,6 +613,7 @@ quiche_core_srcs = [ "src/quiche/quic/core/http/quic_server_session_base.cc", "src/quiche/quic/core/http/quic_spdy_client_session.cc", "src/quiche/quic/core/http/quic_spdy_client_session_base.cc", + "src/quiche/quic/core/http/quic_spdy_client_session_with_migration.cc", "src/quiche/quic/core/http/quic_spdy_client_stream.cc", "src/quiche/quic/core/http/quic_spdy_server_stream_base.cc", "src/quiche/quic/core/http/quic_spdy_session.cc", @@ -666,6 +672,7 @@ quiche_core_srcs = [ "src/quiche/quic/core/quic_dispatcher_stats.cc", "src/quiche/quic/core/quic_error_codes.cc", "src/quiche/quic/core/quic_flow_controller.cc", + "src/quiche/quic/core/quic_force_blockable_packet_writer.cc", "src/quiche/quic/core/quic_framer.cc", "src/quiche/quic/core/quic_generic_session.cc", "src/quiche/quic/core/quic_idle_network_detector.cc", @@ -1105,6 +1112,7 @@ quiche_tests_srcs = [ "src/quiche/common/lifetime_tracking_test.cc", "src/quiche/common/masque/connect_ip_datagram_payload_test.cc", "src/quiche/common/masque/connect_udp_datagram_payload_test.cc", + "src/quiche/common/platform/api/quiche_client_stats_test.cc", "src/quiche/common/platform/api/quiche_file_utils_test.cc", "src/quiche/common/platform/api/quiche_hostname_utils_test.cc", "src/quiche/common/platform/api/quiche_lower_case_string_test.cc", @@ -1117,6 +1125,7 @@ quiche_tests_srcs = [ "src/quiche/common/quiche_callbacks_test.cc", "src/quiche/common/quiche_circular_deque_test.cc", "src/quiche/common/quiche_data_reader_test.cc", + "src/quiche/common/quiche_data_writer_fuzz_test.cc", "src/quiche/common/quiche_data_writer_test.cc", "src/quiche/common/quiche_endian_test.cc", "src/quiche/common/quiche_intrusive_list_test.cc", @@ -1358,6 +1367,7 @@ quiche_tests_srcs = [ "src/quiche/quic/core/uber_quic_stream_id_manager_test.cc", "src/quiche/quic/core/uber_received_packet_manager_test.cc", "src/quiche/quic/core/web_transport_write_blocked_list_test.cc", + "src/quiche/quic/moqt/test_tools/moqt_simulator_test.cc", "src/quiche/quic/test_tools/crypto_test_utils_test.cc", "src/quiche/quic/test_tools/quic_test_utils_test.cc", "src/quiche/quic/test_tools/simple_session_notifier_test.cc", @@ -1380,6 +1390,7 @@ io_tests_hdrs = [ io_tests_srcs = [ "src/quiche/quic/core/chlo_extractor_test.cc", "src/quiche/quic/core/http/end_to_end_test.cc", + "src/quiche/quic/core/http/quic_connection_migration_manager_test.cc", "src/quiche/quic/core/http/quic_spdy_client_session_test.cc", "src/quiche/quic/core/http/quic_spdy_client_stream_test.cc", "src/quiche/quic/core/http/quic_spdy_server_stream_base_test.cc", @@ -1423,6 +1434,11 @@ cli_tools_srcs = [ "src/quiche/quic/masque/masque_server_bin.cc", "src/quiche/quic/masque/masque_tcp_client_bin.cc", "src/quiche/quic/masque/masque_tcp_server_bin.cc", + "src/quiche/quic/moqt/tools/chat_client_bin.cc", + "src/quiche/quic/moqt/tools/chat_server_bin.cc", + "src/quiche/quic/moqt/tools/moqt_ingestion_server_bin.cc", + "src/quiche/quic/moqt/tools/moqt_relay_bin.cc", + "src/quiche/quic/moqt/tools/moqt_simulator_bin.cc", "src/quiche/quic/tools/crypto_message_printer_bin.cc", "src/quiche/quic/tools/interactive_cli_demo_bin.cc", "src/quiche/quic/tools/qpack_offline_decoder_bin.cc", @@ -1545,76 +1561,99 @@ load_balancer_srcs = [ ] moqt_hdrs = [ "src/quiche/quic/moqt/moqt_bitrate_adjuster.h", - "src/quiche/quic/moqt/moqt_cached_object.h", - "src/quiche/quic/moqt/moqt_failed_fetch.h", + "src/quiche/quic/moqt/moqt_fetch_task.h", "src/quiche/quic/moqt/moqt_framer.h", "src/quiche/quic/moqt/moqt_known_track_publisher.h", "src/quiche/quic/moqt/moqt_live_relay_queue.h", "src/quiche/quic/moqt/moqt_messages.h", + "src/quiche/quic/moqt/moqt_object.h", "src/quiche/quic/moqt/moqt_outgoing_queue.h", "src/quiche/quic/moqt/moqt_parser.h", "src/quiche/quic/moqt/moqt_priority.h", "src/quiche/quic/moqt/moqt_probe_manager.h", "src/quiche/quic/moqt/moqt_publisher.h", + "src/quiche/quic/moqt/moqt_relay_publisher.h", + "src/quiche/quic/moqt/moqt_relay_track_publisher.h", "src/quiche/quic/moqt/moqt_session.h", "src/quiche/quic/moqt/moqt_session_callbacks.h", "src/quiche/quic/moqt/moqt_session_interface.h", "src/quiche/quic/moqt/moqt_subscribe_windows.h", + "src/quiche/quic/moqt/moqt_trace_recorder.h", "src/quiche/quic/moqt/moqt_track.h", - "src/quiche/quic/moqt/test_tools/moqt_framer_utils.h", - "src/quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h", - "src/quiche/quic/moqt/test_tools/moqt_session_peer.h", - "src/quiche/quic/moqt/test_tools/moqt_simulator_harness.h", - "src/quiche/quic/moqt/test_tools/moqt_test_message.h", + "src/quiche/quic/moqt/relay_namespace_tree.h", + "src/quiche/quic/moqt/session_namespace_tree.h", "src/quiche/quic/moqt/tools/chat_client.h", "src/quiche/quic/moqt/tools/chat_server.h", "src/quiche/quic/moqt/tools/moq_chat.h", "src/quiche/quic/moqt/tools/moqt_client.h", - "src/quiche/quic/moqt/tools/moqt_mock_visitor.h", + "src/quiche/quic/moqt/tools/moqt_relay.h", "src/quiche/quic/moqt/tools/moqt_server.h", ] moqt_srcs = [ "src/quiche/quic/moqt/moqt_bitrate_adjuster.cc", - "src/quiche/quic/moqt/moqt_bitrate_adjuster_test.cc", - "src/quiche/quic/moqt/moqt_cached_object.cc", "src/quiche/quic/moqt/moqt_framer.cc", - "src/quiche/quic/moqt/moqt_framer_test.cc", - "src/quiche/quic/moqt/moqt_integration_test.cc", "src/quiche/quic/moqt/moqt_known_track_publisher.cc", "src/quiche/quic/moqt/moqt_live_relay_queue.cc", - "src/quiche/quic/moqt/moqt_live_relay_queue_test.cc", "src/quiche/quic/moqt/moqt_messages.cc", - "src/quiche/quic/moqt/moqt_messages_test.cc", + "src/quiche/quic/moqt/moqt_object.cc", "src/quiche/quic/moqt/moqt_outgoing_queue.cc", - "src/quiche/quic/moqt/moqt_outgoing_queue_test.cc", "src/quiche/quic/moqt/moqt_parser.cc", + "src/quiche/quic/moqt/moqt_priority.cc", + "src/quiche/quic/moqt/moqt_probe_manager.cc", + "src/quiche/quic/moqt/moqt_relay_publisher.cc", + "src/quiche/quic/moqt/moqt_relay_track_publisher.cc", + "src/quiche/quic/moqt/moqt_session.cc", + "src/quiche/quic/moqt/moqt_subscribe_windows.cc", + "src/quiche/quic/moqt/moqt_trace_recorder.cc", + "src/quiche/quic/moqt/moqt_track.cc", + "src/quiche/quic/moqt/tools/chat_client.cc", + "src/quiche/quic/moqt/tools/chat_server.cc", + "src/quiche/quic/moqt/tools/moq_chat.cc", + "src/quiche/quic/moqt/tools/moqt_client.cc", + "src/quiche/quic/moqt/tools/moqt_relay.cc", + "src/quiche/quic/moqt/tools/moqt_server.cc", +] +moqt_test_hdrs = [ + +] +moqt_test_srcs = [ + "src/quiche/quic/moqt/moqt_bitrate_adjuster_test.cc", + "src/quiche/quic/moqt/moqt_framer_test.cc", + "src/quiche/quic/moqt/moqt_integration_test.cc", + "src/quiche/quic/moqt/moqt_live_relay_queue_test.cc", + "src/quiche/quic/moqt/moqt_messages_test.cc", + "src/quiche/quic/moqt/moqt_outgoing_queue_test.cc", "src/quiche/quic/moqt/moqt_parser_fuzz_test.cc", "src/quiche/quic/moqt/moqt_parser_test.cc", - "src/quiche/quic/moqt/moqt_priority.cc", "src/quiche/quic/moqt/moqt_priority_test.cc", - "src/quiche/quic/moqt/moqt_probe_manager.cc", "src/quiche/quic/moqt/moqt_probe_manager_test.cc", - "src/quiche/quic/moqt/moqt_session.cc", + "src/quiche/quic/moqt/moqt_relay_publisher_test.cc", + "src/quiche/quic/moqt/moqt_relay_track_publisher_test.cc", "src/quiche/quic/moqt/moqt_session_test.cc", - "src/quiche/quic/moqt/moqt_subscribe_windows.cc", "src/quiche/quic/moqt/moqt_subscribe_windows_test.cc", - "src/quiche/quic/moqt/moqt_track.cc", "src/quiche/quic/moqt/moqt_track_test.cc", - "src/quiche/quic/moqt/test_tools/moqt_framer_utils.cc", - "src/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc", - "src/quiche/quic/moqt/tools/chat_client.cc", - "src/quiche/quic/moqt/tools/chat_client_bin.cc", - "src/quiche/quic/moqt/tools/chat_server.cc", - "src/quiche/quic/moqt/tools/chat_server_bin.cc", - "src/quiche/quic/moqt/tools/moq_chat.cc", + "src/quiche/quic/moqt/relay_namespace_tree_test.cc", + "src/quiche/quic/moqt/session_namespace_tree_test.cc", "src/quiche/quic/moqt/tools/moq_chat_end_to_end_test.cc", "src/quiche/quic/moqt/tools/moq_chat_test.cc", - "src/quiche/quic/moqt/tools/moqt_client.cc", "src/quiche/quic/moqt/tools/moqt_end_to_end_test.cc", - "src/quiche/quic/moqt/tools/moqt_ingestion_server_bin.cc", - "src/quiche/quic/moqt/tools/moqt_server.cc", + "src/quiche/quic/moqt/tools/moqt_relay_test.cc", "src/quiche/quic/moqt/tools/moqt_server_test.cc", - "src/quiche/quic/moqt/tools/moqt_simulator_bin.cc", +] +moqt_test_support_hdrs = [ + "src/quiche/quic/moqt/test_tools/mock_moqt_session.h", + "src/quiche/quic/moqt/test_tools/moqt_framer_utils.h", + "src/quiche/quic/moqt/test_tools/moqt_mock_visitor.h", + "src/quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h", + "src/quiche/quic/moqt/test_tools/moqt_session_peer.h", + "src/quiche/quic/moqt/test_tools/moqt_simulator.h", + "src/quiche/quic/moqt/test_tools/moqt_simulator_harness.h", + "src/quiche/quic/moqt/test_tools/moqt_test_message.h", +] +moqt_test_support_srcs = [ + "src/quiche/quic/moqt/test_tools/moqt_framer_utils.cc", + "src/quiche/quic/moqt/test_tools/moqt_simulator.cc", + "src/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc", ] binary_http_hdrs = [ "src/quiche/binary_http/binary_http_message.h", @@ -1625,6 +1664,8 @@ binary_http_srcs = [ oblivious_http_hdrs = [ "src/quiche/oblivious_http/buffers/oblivious_http_request.h", "src/quiche/oblivious_http/buffers/oblivious_http_response.h", + "src/quiche/oblivious_http/common/oblivious_http_chunk_handler.h", + "src/quiche/oblivious_http/common/oblivious_http_definitions.h", "src/quiche/oblivious_http/common/oblivious_http_header_key_config.h", "src/quiche/oblivious_http/oblivious_http_client.h", "src/quiche/oblivious_http/oblivious_http_gateway.h", @@ -1717,7 +1758,10 @@ blind_sign_auth_hdrs = [ "src/quiche/blind_sign_auth/blind_sign_auth_test_data.h", "src/quiche/blind_sign_auth/blind_sign_message_interface.h", "src/quiche/blind_sign_auth/blind_sign_message_response.h", + "src/quiche/blind_sign_auth/blind_sign_tracing_hooks.h", "src/quiche/blind_sign_auth/cached_blind_sign_auth.h", + "src/quiche/blind_sign_auth/direct_task_bundle.h", + "src/quiche/blind_sign_auth/task_bundle.h", "src/quiche/blind_sign_auth/test_tools/mock_blind_sign_auth_interface.h", "src/quiche/blind_sign_auth/test_tools/mock_blind_sign_message_interface.h", ] @@ -1726,6 +1770,7 @@ blind_sign_auth_srcs = [ "src/quiche/blind_sign_auth/blind_sign_auth_test_data.cc", "src/quiche/blind_sign_auth/blind_sign_message_response.cc", "src/quiche/blind_sign_auth/cached_blind_sign_auth.cc", + "src/quiche/blind_sign_auth/direct_task_bundle.cc", ] blind_sign_auth_tests_hdrs = [ diff --git a/naiveproxy/src/net/third_party/quiche/src/build/source_list.json b/naiveproxy/src/net/third_party/quiche/src/build/source_list.json index 19b4cdfca8..bbeb1f7af0 100644 --- a/naiveproxy/src/net/third_party/quiche/src/build/source_list.json +++ b/naiveproxy/src/net/third_party/quiche/src/build/source_list.json @@ -226,13 +226,13 @@ "quiche/quic/core/frames/quic_blocked_frame.h", "quiche/quic/core/frames/quic_connection_close_frame.h", "quiche/quic/core/frames/quic_crypto_frame.h", + "quiche/quic/core/frames/quic_datagram_frame.h", "quiche/quic/core/frames/quic_frame.h", "quiche/quic/core/frames/quic_goaway_frame.h", "quiche/quic/core/frames/quic_handshake_done_frame.h", "quiche/quic/core/frames/quic_immediate_ack_frame.h", "quiche/quic/core/frames/quic_inlined_frame.h", "quiche/quic/core/frames/quic_max_streams_frame.h", - "quiche/quic/core/frames/quic_message_frame.h", "quiche/quic/core/frames/quic_mtu_discovery_frame.h", "quiche/quic/core/frames/quic_new_connection_id_frame.h", "quiche/quic/core/frames/quic_new_token_frame.h", @@ -254,6 +254,7 @@ "quiche/quic/core/http/http_encoder.h", "quiche/quic/core/http/http_frames.h", "quiche/quic/core/http/metadata_decoder.h", + "quiche/quic/core/http/quic_connection_migration_manager.h", "quiche/quic/core/http/quic_header_list.h", "quiche/quic/core/http/quic_headers_stream.h", "quiche/quic/core/http/quic_receive_control_stream.h", @@ -262,6 +263,7 @@ "quiche/quic/core/http/quic_server_session_base.h", "quiche/quic/core/http/quic_spdy_client_session.h", "quiche/quic/core/http/quic_spdy_client_session_base.h", + "quiche/quic/core/http/quic_spdy_client_session_with_migration.h", "quiche/quic/core/http/quic_spdy_client_stream.h", "quiche/quic/core/http/quic_spdy_server_stream_base.h", "quiche/quic/core/http/quic_spdy_session.h", @@ -332,6 +334,7 @@ "quiche/quic/core/quic_dispatcher_stats.h", "quiche/quic/core/quic_error_codes.h", "quiche/quic/core/quic_flow_controller.h", + "quiche/quic/core/quic_force_blockable_packet_writer.h", "quiche/quic/core/quic_framer.h", "quiche/quic/core/quic_generic_session.h", "quiche/quic/core/quic_idle_network_detector.h", @@ -348,6 +351,7 @@ "quiche/quic/core/quic_packet_writer.h", "quiche/quic/core/quic_packet_writer_wrapper.h", "quiche/quic/core/quic_packets.h", + "quiche/quic/core/quic_path_context_factory.h", "quiche/quic/core/quic_path_validator.h", "quiche/quic/core/quic_ping_manager.h", "quiche/quic/core/quic_process_packet_interface.h", @@ -575,12 +579,12 @@ "quiche/quic/core/frames/quic_blocked_frame.cc", "quiche/quic/core/frames/quic_connection_close_frame.cc", "quiche/quic/core/frames/quic_crypto_frame.cc", + "quiche/quic/core/frames/quic_datagram_frame.cc", "quiche/quic/core/frames/quic_frame.cc", "quiche/quic/core/frames/quic_goaway_frame.cc", "quiche/quic/core/frames/quic_handshake_done_frame.cc", "quiche/quic/core/frames/quic_immediate_ack_frame.cc", "quiche/quic/core/frames/quic_max_streams_frame.cc", - "quiche/quic/core/frames/quic_message_frame.cc", "quiche/quic/core/frames/quic_new_connection_id_frame.cc", "quiche/quic/core/frames/quic_new_token_frame.cc", "quiche/quic/core/frames/quic_padding_frame.cc", @@ -599,6 +603,7 @@ "quiche/quic/core/http/http_decoder.cc", "quiche/quic/core/http/http_encoder.cc", "quiche/quic/core/http/metadata_decoder.cc", + "quiche/quic/core/http/quic_connection_migration_manager.cc", "quiche/quic/core/http/quic_header_list.cc", "quiche/quic/core/http/quic_headers_stream.cc", "quiche/quic/core/http/quic_receive_control_stream.cc", @@ -607,6 +612,7 @@ "quiche/quic/core/http/quic_server_session_base.cc", "quiche/quic/core/http/quic_spdy_client_session.cc", "quiche/quic/core/http/quic_spdy_client_session_base.cc", + "quiche/quic/core/http/quic_spdy_client_session_with_migration.cc", "quiche/quic/core/http/quic_spdy_client_stream.cc", "quiche/quic/core/http/quic_spdy_server_stream_base.cc", "quiche/quic/core/http/quic_spdy_session.cc", @@ -665,6 +671,7 @@ "quiche/quic/core/quic_dispatcher_stats.cc", "quiche/quic/core/quic_error_codes.cc", "quiche/quic/core/quic_flow_controller.cc", + "quiche/quic/core/quic_force_blockable_packet_writer.cc", "quiche/quic/core/quic_framer.cc", "quiche/quic/core/quic_generic_session.cc", "quiche/quic/core/quic_idle_network_detector.cc", @@ -1104,6 +1111,7 @@ "quiche/common/lifetime_tracking_test.cc", "quiche/common/masque/connect_ip_datagram_payload_test.cc", "quiche/common/masque/connect_udp_datagram_payload_test.cc", + "quiche/common/platform/api/quiche_client_stats_test.cc", "quiche/common/platform/api/quiche_file_utils_test.cc", "quiche/common/platform/api/quiche_hostname_utils_test.cc", "quiche/common/platform/api/quiche_lower_case_string_test.cc", @@ -1116,6 +1124,7 @@ "quiche/common/quiche_callbacks_test.cc", "quiche/common/quiche_circular_deque_test.cc", "quiche/common/quiche_data_reader_test.cc", + "quiche/common/quiche_data_writer_fuzz_test.cc", "quiche/common/quiche_data_writer_test.cc", "quiche/common/quiche_endian_test.cc", "quiche/common/quiche_intrusive_list_test.cc", @@ -1357,6 +1366,7 @@ "quiche/quic/core/uber_quic_stream_id_manager_test.cc", "quiche/quic/core/uber_received_packet_manager_test.cc", "quiche/quic/core/web_transport_write_blocked_list_test.cc", + "quiche/quic/moqt/test_tools/moqt_simulator_test.cc", "quiche/quic/test_tools/crypto_test_utils_test.cc", "quiche/quic/test_tools/quic_test_utils_test.cc", "quiche/quic/test_tools/simple_session_notifier_test.cc", @@ -1379,6 +1389,7 @@ "io_tests_srcs": [ "quiche/quic/core/chlo_extractor_test.cc", "quiche/quic/core/http/end_to_end_test.cc", + "quiche/quic/core/http/quic_connection_migration_manager_test.cc", "quiche/quic/core/http/quic_spdy_client_session_test.cc", "quiche/quic/core/http/quic_spdy_client_stream_test.cc", "quiche/quic/core/http/quic_spdy_server_stream_base_test.cc", @@ -1422,6 +1433,11 @@ "quiche/quic/masque/masque_server_bin.cc", "quiche/quic/masque/masque_tcp_client_bin.cc", "quiche/quic/masque/masque_tcp_server_bin.cc", + "quiche/quic/moqt/tools/chat_client_bin.cc", + "quiche/quic/moqt/tools/chat_server_bin.cc", + "quiche/quic/moqt/tools/moqt_ingestion_server_bin.cc", + "quiche/quic/moqt/tools/moqt_relay_bin.cc", + "quiche/quic/moqt/tools/moqt_simulator_bin.cc", "quiche/quic/tools/crypto_message_printer_bin.cc", "quiche/quic/tools/interactive_cli_demo_bin.cc", "quiche/quic/tools/qpack_offline_decoder_bin.cc", @@ -1544,76 +1560,99 @@ ], "moqt_hdrs": [ "quiche/quic/moqt/moqt_bitrate_adjuster.h", - "quiche/quic/moqt/moqt_cached_object.h", - "quiche/quic/moqt/moqt_failed_fetch.h", + "quiche/quic/moqt/moqt_fetch_task.h", "quiche/quic/moqt/moqt_framer.h", "quiche/quic/moqt/moqt_known_track_publisher.h", "quiche/quic/moqt/moqt_live_relay_queue.h", "quiche/quic/moqt/moqt_messages.h", + "quiche/quic/moqt/moqt_object.h", "quiche/quic/moqt/moqt_outgoing_queue.h", "quiche/quic/moqt/moqt_parser.h", "quiche/quic/moqt/moqt_priority.h", "quiche/quic/moqt/moqt_probe_manager.h", "quiche/quic/moqt/moqt_publisher.h", + "quiche/quic/moqt/moqt_relay_publisher.h", + "quiche/quic/moqt/moqt_relay_track_publisher.h", "quiche/quic/moqt/moqt_session.h", "quiche/quic/moqt/moqt_session_callbacks.h", "quiche/quic/moqt/moqt_session_interface.h", "quiche/quic/moqt/moqt_subscribe_windows.h", + "quiche/quic/moqt/moqt_trace_recorder.h", "quiche/quic/moqt/moqt_track.h", - "quiche/quic/moqt/test_tools/moqt_framer_utils.h", - "quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h", - "quiche/quic/moqt/test_tools/moqt_session_peer.h", - "quiche/quic/moqt/test_tools/moqt_simulator_harness.h", - "quiche/quic/moqt/test_tools/moqt_test_message.h", + "quiche/quic/moqt/relay_namespace_tree.h", + "quiche/quic/moqt/session_namespace_tree.h", "quiche/quic/moqt/tools/chat_client.h", "quiche/quic/moqt/tools/chat_server.h", "quiche/quic/moqt/tools/moq_chat.h", "quiche/quic/moqt/tools/moqt_client.h", - "quiche/quic/moqt/tools/moqt_mock_visitor.h", + "quiche/quic/moqt/tools/moqt_relay.h", "quiche/quic/moqt/tools/moqt_server.h" ], "moqt_srcs": [ "quiche/quic/moqt/moqt_bitrate_adjuster.cc", - "quiche/quic/moqt/moqt_bitrate_adjuster_test.cc", - "quiche/quic/moqt/moqt_cached_object.cc", "quiche/quic/moqt/moqt_framer.cc", - "quiche/quic/moqt/moqt_framer_test.cc", - "quiche/quic/moqt/moqt_integration_test.cc", "quiche/quic/moqt/moqt_known_track_publisher.cc", "quiche/quic/moqt/moqt_live_relay_queue.cc", - "quiche/quic/moqt/moqt_live_relay_queue_test.cc", "quiche/quic/moqt/moqt_messages.cc", - "quiche/quic/moqt/moqt_messages_test.cc", + "quiche/quic/moqt/moqt_object.cc", "quiche/quic/moqt/moqt_outgoing_queue.cc", - "quiche/quic/moqt/moqt_outgoing_queue_test.cc", "quiche/quic/moqt/moqt_parser.cc", + "quiche/quic/moqt/moqt_priority.cc", + "quiche/quic/moqt/moqt_probe_manager.cc", + "quiche/quic/moqt/moqt_relay_publisher.cc", + "quiche/quic/moqt/moqt_relay_track_publisher.cc", + "quiche/quic/moqt/moqt_session.cc", + "quiche/quic/moqt/moqt_subscribe_windows.cc", + "quiche/quic/moqt/moqt_trace_recorder.cc", + "quiche/quic/moqt/moqt_track.cc", + "quiche/quic/moqt/tools/chat_client.cc", + "quiche/quic/moqt/tools/chat_server.cc", + "quiche/quic/moqt/tools/moq_chat.cc", + "quiche/quic/moqt/tools/moqt_client.cc", + "quiche/quic/moqt/tools/moqt_relay.cc", + "quiche/quic/moqt/tools/moqt_server.cc" + ], + "moqt_test_hdrs": [ + + ], + "moqt_test_srcs": [ + "quiche/quic/moqt/moqt_bitrate_adjuster_test.cc", + "quiche/quic/moqt/moqt_framer_test.cc", + "quiche/quic/moqt/moqt_integration_test.cc", + "quiche/quic/moqt/moqt_live_relay_queue_test.cc", + "quiche/quic/moqt/moqt_messages_test.cc", + "quiche/quic/moqt/moqt_outgoing_queue_test.cc", "quiche/quic/moqt/moqt_parser_fuzz_test.cc", "quiche/quic/moqt/moqt_parser_test.cc", - "quiche/quic/moqt/moqt_priority.cc", "quiche/quic/moqt/moqt_priority_test.cc", - "quiche/quic/moqt/moqt_probe_manager.cc", "quiche/quic/moqt/moqt_probe_manager_test.cc", - "quiche/quic/moqt/moqt_session.cc", + "quiche/quic/moqt/moqt_relay_publisher_test.cc", + "quiche/quic/moqt/moqt_relay_track_publisher_test.cc", "quiche/quic/moqt/moqt_session_test.cc", - "quiche/quic/moqt/moqt_subscribe_windows.cc", "quiche/quic/moqt/moqt_subscribe_windows_test.cc", - "quiche/quic/moqt/moqt_track.cc", "quiche/quic/moqt/moqt_track_test.cc", - "quiche/quic/moqt/test_tools/moqt_framer_utils.cc", - "quiche/quic/moqt/test_tools/moqt_simulator_harness.cc", - "quiche/quic/moqt/tools/chat_client.cc", - "quiche/quic/moqt/tools/chat_client_bin.cc", - "quiche/quic/moqt/tools/chat_server.cc", - "quiche/quic/moqt/tools/chat_server_bin.cc", - "quiche/quic/moqt/tools/moq_chat.cc", + "quiche/quic/moqt/relay_namespace_tree_test.cc", + "quiche/quic/moqt/session_namespace_tree_test.cc", "quiche/quic/moqt/tools/moq_chat_end_to_end_test.cc", "quiche/quic/moqt/tools/moq_chat_test.cc", - "quiche/quic/moqt/tools/moqt_client.cc", "quiche/quic/moqt/tools/moqt_end_to_end_test.cc", - "quiche/quic/moqt/tools/moqt_ingestion_server_bin.cc", - "quiche/quic/moqt/tools/moqt_server.cc", - "quiche/quic/moqt/tools/moqt_server_test.cc", - "quiche/quic/moqt/tools/moqt_simulator_bin.cc" + "quiche/quic/moqt/tools/moqt_relay_test.cc", + "quiche/quic/moqt/tools/moqt_server_test.cc" + ], + "moqt_test_support_hdrs": [ + "quiche/quic/moqt/test_tools/mock_moqt_session.h", + "quiche/quic/moqt/test_tools/moqt_framer_utils.h", + "quiche/quic/moqt/test_tools/moqt_mock_visitor.h", + "quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h", + "quiche/quic/moqt/test_tools/moqt_session_peer.h", + "quiche/quic/moqt/test_tools/moqt_simulator.h", + "quiche/quic/moqt/test_tools/moqt_simulator_harness.h", + "quiche/quic/moqt/test_tools/moqt_test_message.h" + ], + "moqt_test_support_srcs": [ + "quiche/quic/moqt/test_tools/moqt_framer_utils.cc", + "quiche/quic/moqt/test_tools/moqt_simulator.cc", + "quiche/quic/moqt/test_tools/moqt_simulator_harness.cc" ], "binary_http_hdrs": [ "quiche/binary_http/binary_http_message.h" @@ -1624,6 +1663,8 @@ "oblivious_http_hdrs": [ "quiche/oblivious_http/buffers/oblivious_http_request.h", "quiche/oblivious_http/buffers/oblivious_http_response.h", + "quiche/oblivious_http/common/oblivious_http_chunk_handler.h", + "quiche/oblivious_http/common/oblivious_http_definitions.h", "quiche/oblivious_http/common/oblivious_http_header_key_config.h", "quiche/oblivious_http/oblivious_http_client.h", "quiche/oblivious_http/oblivious_http_gateway.h" @@ -1716,7 +1757,10 @@ "quiche/blind_sign_auth/blind_sign_auth_test_data.h", "quiche/blind_sign_auth/blind_sign_message_interface.h", "quiche/blind_sign_auth/blind_sign_message_response.h", + "quiche/blind_sign_auth/blind_sign_tracing_hooks.h", "quiche/blind_sign_auth/cached_blind_sign_auth.h", + "quiche/blind_sign_auth/direct_task_bundle.h", + "quiche/blind_sign_auth/task_bundle.h", "quiche/blind_sign_auth/test_tools/mock_blind_sign_auth_interface.h", "quiche/blind_sign_auth/test_tools/mock_blind_sign_message_interface.h" ], @@ -1724,7 +1768,8 @@ "quiche/blind_sign_auth/blind_sign_auth.cc", "quiche/blind_sign_auth/blind_sign_auth_test_data.cc", "quiche/blind_sign_auth/blind_sign_message_response.cc", - "quiche/blind_sign_auth/cached_blind_sign_auth.cc" + "quiche/blind_sign_auth/cached_blind_sign_auth.cc", + "quiche/blind_sign_auth/direct_task_bundle.cc" ], "blind_sign_auth_tests_hdrs": [ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/BUILD.bazel b/naiveproxy/src/net/third_party/quiche/src/quiche/BUILD.bazel index ad7dbd2fc2..c3668295c1 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/BUILD.bazel +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/BUILD.bazel @@ -21,6 +21,11 @@ load( "io_tool_support_srcs", "masque_support_hdrs", "masque_support_srcs", + "moqt_hdrs", + "moqt_srcs", + "moqt_test_srcs", + "moqt_test_support_hdrs", + "moqt_test_support_srcs", "oblivious_http_hdrs", "oblivious_http_srcs", "quiche_core_hdrs", @@ -63,6 +68,7 @@ cc_library( "@com_google_absl//absl/status:statusor", "@com_google_absl//absl/strings", "@com_google_absl//absl/strings:str_format", + "@com_google_absl//absl/types:span", ], ) @@ -138,6 +144,7 @@ cc_library( "@com_google_absl//absl/flags:flag", "@com_google_absl//absl/functional:any_invocable", "@com_google_absl//absl/functional:function_ref", + "@com_google_absl//absl/functional:overload", "@com_google_absl//absl/hash", "@com_google_absl//absl/log:absl_check", "@com_google_absl//absl/log:absl_log", @@ -219,6 +226,7 @@ cc_library( "@boringssl//:crypto", "@boringssl//:ssl", "@com_google_absl//absl/base:core_headers", + "@com_google_absl//absl/base:nullability", "@com_google_absl//absl/container:flat_hash_map", "@com_google_absl//absl/container:flat_hash_set", "@com_google_absl//absl/flags:flag", @@ -311,6 +319,7 @@ test_suite_from_source_list( "@com_google_absl//absl/container:node_hash_map", "@com_google_absl//absl/flags:flag", "@com_google_absl//absl/functional:bind_front", + "@com_google_absl//absl/functional:overload", "@com_google_absl//absl/hash", "@com_google_absl//absl/memory", "@com_google_absl//absl/numeric:int128", @@ -379,6 +388,38 @@ cc_library( ], ) +cc_library( + name = "moqt_core", + srcs = moqt_srcs, + hdrs = moqt_hdrs, + deps = [ + ":io_tool_support", + ":quiche_core", + ":quiche_tool_support", + "@com_google_absl//absl/algorithm:container", + "@com_google_absl//absl/base", + "@com_google_absl//absl/base:core_headers", + "@com_google_absl//absl/base:nullability", + "@com_google_absl//absl/cleanup", + "@com_google_absl//absl/container:btree", + "@com_google_absl//absl/container:fixed_array", + "@com_google_absl//absl/container:flat_hash_map", + "@com_google_absl//absl/container:flat_hash_set", + "@com_google_absl//absl/container:inlined_vector", + "@com_google_absl//absl/container:node_hash_map", + "@com_google_absl//absl/functional:bind_front", + "@com_google_absl//absl/memory", + "@com_google_absl//absl/status", + "@com_google_absl//absl/status:statusor", + "@com_google_absl//absl/strings", + "@com_google_absl//absl/strings:str_format", + "@com_google_absl//absl/time", + "@com_google_absl//absl/types:span", + "@com_google_absl//absl/types:variant", + "@com_google_quic_trace//quic_trace:quic_trace_cc_proto", + ], +) + cc_library( name = "io_test_support", testonly = 1, @@ -447,6 +488,43 @@ test_suite_from_source_list( ], ) +cc_library( + name = "moqt_test_support", + testonly = 1, + srcs = moqt_test_support_srcs, + hdrs = moqt_test_support_hdrs, + deps = [ + ":moqt_core", + ":quiche_core", + ":quiche_test_support", + "@com_google_absl//absl/status", + "@com_google_absl//absl/strings", + "@com_google_absl//absl/types:span", + ], +) + +test_suite_from_source_list( + name = "moqt_tests", + srcs = moqt_test_srcs, + deps = [ + ":io_tool_support", + ":moqt_core", + ":moqt_test_support", + ":quiche_core", + ":quiche_test_support", + ":quiche_tool_support", + "@com_google_absl//absl/functional:bind_front", + "@com_google_absl//absl/hash", + "@com_google_absl//absl/memory", + "@com_google_absl//absl/status", + "@com_google_absl//absl/status:statusor", + "@com_google_absl//absl/strings", + "@com_google_absl//absl/types:span", + "@com_google_googletest//:gtest_main", + "@com_google_quic_trace//quic_trace:quic_trace_cc_proto", + ], +) + # TODO(vasilvv): make a rule that generates cc_binary rules for all _bin targets. cc_binary( name = "quic_packet_printer", @@ -533,6 +611,17 @@ cc_binary( ], ) +cc_binary( + name = "moqt_relay", + srcs = ["quic/moqt/tools/moqt_relay_bin.cc"], + deps = [ + ":moqt_core", + ":quiche_core", + ":quiche_tool_support", + "@com_google_absl//absl/strings", + ], +) + # Indicate that QUICHE APIs are explicitly unstable by providing only # appropriately named aliases as publicly visible targets. alias( diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_enums.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_enums.cc index 42b9e417a3..f54600a6a4 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_enums.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_enums.cc @@ -62,6 +62,10 @@ const char* BalsaFrameEnums::ErrorCodeToString( return "INVALID_WS_IN_STATUS_LINE"; case INVALID_WS_IN_REQUEST_LINE: return "INVALID_WS_IN_REQUEST_LINE"; + case MULTIPLE_SPACES_IN_STATUS_LINE: + return "MULTIPLE_SPACES_IN_STATUS_LINE"; + case MULTIPLE_SPACES_IN_REQUEST_LINE: + return "MULTIPLE_SPACES_IN_REQUEST_LINE"; case OBS_FOLD_IN_HEADERS: return "OBS_FOLD_IN_HEADERS"; case FAILED_CONVERTING_STATUS_CODE_TO_INT: diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_enums.h b/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_enums.h index f6cce3facd..2967550b4f 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_enums.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_enums.h @@ -66,6 +66,8 @@ struct QUICHE_EXPORT BalsaFrameEnums { FAILED_TO_FIND_NL_AFTER_REQUEST_HTTP_VERSION, // | firstline_c INVALID_WS_IN_STATUS_LINE, INVALID_WS_IN_REQUEST_LINE, + MULTIPLE_SPACES_IN_STATUS_LINE, + MULTIPLE_SPACES_IN_REQUEST_LINE, OBS_FOLD_IN_HEADERS, FAILED_CONVERTING_STATUS_CODE_TO_INT, diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_frame.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_frame.cc index 9c356420eb..652d509502 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_frame.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_frame.cc @@ -162,7 +162,8 @@ inline char* ParseOneIsland(char* current, char* begin, char* end, bool ParseHTTPFirstLine(char* begin, char* end, bool is_request, BalsaHeaders* headers, BalsaFrameEnums::ErrorCode* error_code, - FirstLineValidationOption whitespace_option) { + FirstLineValidationOption whitespace_option, + FirstLineValidationOption multiple_spaces_option) { while (begin < end && (end[-1] == '\n' || end[-1] == '\r')) { --end; } @@ -249,6 +250,27 @@ bool ParseHTTPFirstLine(char* begin, char* end, bool is_request, } } + if (multiple_spaces_option != FirstLineValidationOption::NONE && + absl::StrContains(headers->first_line(), " ")) { + if (multiple_spaces_option == FirstLineValidationOption::REJECT) { + *error_code = is_request + ? BalsaFrameEnums::MULTIPLE_SPACES_IN_REQUEST_LINE + : BalsaFrameEnums::MULTIPLE_SPACES_IN_STATUS_LINE; + return false; + } + const absl::string_view part1( + begin + headers->non_whitespace_1_idx_, + headers->whitespace_2_idx_ - headers->non_whitespace_1_idx_); + const absl::string_view part2( + begin + headers->non_whitespace_2_idx_, + headers->whitespace_3_idx_ - headers->non_whitespace_2_idx_); + const absl::string_view part3( + begin + headers->non_whitespace_3_idx_, + headers->whitespace_4_idx_ - headers->non_whitespace_3_idx_); + + headers->SetRequestFirstlineFromStringPieces(part1, part2, part3); + } + return true; } @@ -354,7 +376,8 @@ void BalsaFrame::ProcessFirstLine(char* begin, char* end) { BalsaFrameEnums::ErrorCode previous_error = last_error_; if (!ParseHTTPFirstLine( begin, end, is_request_, headers_, &last_error_, - http_validation_policy().sanitize_cr_tab_in_first_line)) { + http_validation_policy().sanitize_cr_tab_in_first_line, + http_validation_policy().sanitize_firstline_spaces)) { parse_state_ = BalsaFrameEnums::ERROR; HandleError(last_error_); return; @@ -435,7 +458,8 @@ void BalsaFrame::CleanUpKeyValueWhitespace( bool BalsaFrame::FindColonsAndParseIntoKeyValue(const Lines& lines, bool is_trailer, - BalsaHeaders* headers) { + BalsaHeaders* headers, + bool* has_continuation_lines) { QUICHE_DCHECK(!lines.empty()); const char* stream_begin = headers->OriginalHeaderStreamBegin(); // The last line is always just a newline (and is uninteresting). @@ -455,9 +479,9 @@ bool BalsaFrame::FindColonsAndParseIntoKeyValue(const Lines& lines, const char* line_begin = stream_begin + lines[i].first; // Here we handle possible continuations. Note that we do not replace - // the '\n' in the line before a continuation (at least, as of now), - // which implies that any code which looks for a value must deal with - // "\r\n", etc -within- the line (and not just at the end of it). + // the '\n' in the line before a continuation, but we do mark the line as + // having continuation lines so that the caller can deal with it later. + bool header_has_continuation_line = false; for (++i; i < lines_size_m1; ++i) { const char c = *(stream_begin + lines[i].first); if (CHAR_GT(c, ' ')) { @@ -481,9 +505,10 @@ bool BalsaFrame::FindColonsAndParseIntoKeyValue(const Lines& lines, // continuation) and continuation is allowed. HandleWarning(is_trailer ? BalsaFrameEnums::OBS_FOLD_IN_TRAILERS : BalsaFrameEnums::OBS_FOLD_IN_HEADERS); - - // If disallow_header_continuation_lines() is false, we neither reject nor - // normalize continuation lines, in violation of RFC7230. + if (http_validation_policy().sanitize_obs_fold_in_header_values) { + *has_continuation_lines = true; + header_has_continuation_line = true; + } } const char* line_end = stream_begin + lines[i - 1].second; QUICHE_DCHECK_LT(line_begin - stream_begin, line_end - stream_begin); @@ -509,6 +534,8 @@ bool BalsaFrame::FindColonsAndParseIntoKeyValue(const Lines& lines, headers->header_lines_.push_back(HeaderLineDescription( line_begin - stream_begin, line_end - stream_begin, line_end - stream_begin, line_end - stream_begin, 0)); + headers->header_lines_.back().has_continuation_line = + header_has_continuation_line; if (current >= line_end) { if (http_validation_policy().require_header_colon) { HandleError(is_trailer ? BalsaFrameEnums::TRAILER_MISSING_COLON @@ -715,10 +742,16 @@ void BalsaFrame::ProcessHeaderLines(const Lines& lines, bool is_trailer, HeaderLines::size_type content_length_idx = 0; HeaderLines::size_type transfer_encoding_idx = 0; const char* stream_begin = headers->OriginalHeaderStreamBegin(); + bool has_continuation_lines = false; // Parse the rest of the header or trailer data into key-value pairs. - if (!FindColonsAndParseIntoKeyValue(lines, is_trailer, headers)) { + if (!FindColonsAndParseIntoKeyValue(lines, is_trailer, headers, + &has_continuation_lines)) { return; } + if (http_validation_policy().sanitize_obs_fold_in_header_values && + has_continuation_lines) { + headers->FoldContinuationLines(); + } // At this point, we've parsed all of the headers/trailers. Time to look // for those headers which we require for framing or for format errors. const HeaderLines::size_type lines_size = headers->header_lines_.size(); @@ -931,11 +964,14 @@ size_t BalsaFrame::ProcessHeaders(const char* message_start, return message_current - original_message_start; } } + // Determine if this is the end of the headers. const size_t chars_since_last_slash_n = (message_current_idx - last_slash_n_idx_); last_slash_n_idx_ = message_current_idx; if (chars_since_last_slash_n > 2) { - // false positive. + // Optimization: if the line is longer than 2 characters, it must + // contain content and cannot be the terminating blank line. The loop + // continues to search for the next line. ++message_current; continue; } @@ -1345,7 +1381,7 @@ size_t BalsaFrame::ProcessInput(const char* input, size_t size) { const char c = *current; const int32_t framing_found = HeaderFramingFound(c); if (framing_found != 0) { - // TODO(b/433557986) remove these code counts + // TODO(b/434893483) remove these code counts if (framing_found == kValidTerm1 && is_request_) { QUICHE_CODE_COUNT(balsa_frame_framing_found_valid_term1_request); } else if (framing_found == kValidTerm1 && !is_request_) { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_frame.h b/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_frame.h index 4902ab8481..c61bcb3a15 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_frame.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_frame.h @@ -259,7 +259,8 @@ class QUICHE_EXPORT BalsaFrame : public FramerInterface { // Calls HandleError() and returns false on error. bool FindColonsAndParseIntoKeyValue(const Lines& lines, bool is_trailer, - BalsaHeaders* headers); + BalsaHeaders* headers, + bool* has_continuation_lines); void HandleError(BalsaFrameEnums::ErrorCode error_code); void HandleWarning(BalsaFrameEnums::ErrorCode error_code); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_headers.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_headers.cc index 1747609c33..ae4ce40dd9 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_headers.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_headers.cc @@ -6,6 +6,7 @@ #include +#include #include #include #include @@ -677,6 +678,25 @@ void BalsaHeaders::RemoveAllHeadersWithPrefix(absl::string_view prefix) { } } +void BalsaHeaders::RemoveHeadersIf( + std::function + predicate) { + for (HeaderLines::size_type i = 0; i < header_lines_.size(); ++i) { + if (header_lines_[i].skip) { + continue; + } + + HeaderLineDescription& line = header_lines_[i]; + const absl::string_view key( + GetPtr(line.buffer_base_idx) + line.first_char_idx, + line.key_end_idx - line.first_char_idx); + const absl::string_view value = GetValueFromHeaderLineDescription(line); + if (predicate(key, value)) { + line.skip = true; + } + } +} + bool BalsaHeaders::HasHeadersWithPrefix(absl::string_view prefix) const { for (HeaderLines::size_type i = 0; i < header_lines_.size(); ++i) { if (header_lines_[i].skip) { @@ -893,6 +913,43 @@ bool BalsaHeaders::ForEachHeader( return true; } +// Folds header lines that are marked as having continuation lines (and then +// unmarks them as having continuation lines). We can assume that any \r\n and +// any \n is being continued since it wouldn't show up as one header line +// otherwise. We therefore need to replace any \r\n and any \n with spaces, and +// any subsequent spaces or tabs with spaces. +// +// See: https://tools.ietf.org/html/rfc7230#section-3.2.4 +void BalsaHeaders::FoldContinuationLines() { + const int header_lines_size = header_lines_.size(); + for (int i = 0; i < header_lines_size; ++i) { + HeaderLineDescription& desc = header_lines_[i]; + if (!desc.skip && desc.has_continuation_line) { + bool processing_continuation = false; + const char* begin = GetPtr(desc.buffer_base_idx) + desc.value_begin_idx; + const char* end = GetPtr(desc.buffer_base_idx) + desc.last_char_idx; + for (char* c = const_cast(begin); c < end; ++c) { + if (processing_continuation && (*c == '\t' || *c == ' ')) { + *c = ' '; + continue; + } + if (*c == '\n') { + // We can safely assume the next character is a space or a tab because + // we wouldn't have included \n in the header line otherwise. + *c = ' '; + if (c != begin && *(c - 1) == '\r') { + *(c - 1) = ' '; + } + processing_continuation = true; + continue; + } + processing_continuation = false; + } + desc.has_continuation_line = false; + } + } +} + void BalsaHeaders::DumpToPrefixedString(const char* spaces, std::string* str) const { const absl::string_view firstline = first_line(); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_headers.h b/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_headers.h index 2e06d1ba8c..cfbdd5d53d 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_headers.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/balsa_headers.h @@ -404,6 +404,7 @@ class QUICHE_EXPORT BalsaHeaders : public HeaderApi { size_t last_char_idx; BalsaBuffer::Blocks::size_type buffer_base_idx; bool skip; + bool has_continuation_line = false; }; using HeaderTokenList = std::vector; @@ -647,6 +648,11 @@ class QUICHE_EXPORT BalsaHeaders : public HeaderApi { // Removes all headers starting with 'key' [case insensitive] void RemoveAllHeadersWithPrefix(absl::string_view prefix) override; + // Removes all headers that satisfy the predicate. + void RemoveHeadersIf( + std::function + predicate); + // Returns true if we have at least one header with given prefix // [case insensitive]. Currently for test use only. bool HasHeadersWithPrefix(absl::string_view prefix) const override; @@ -825,7 +831,7 @@ class QUICHE_EXPORT BalsaHeaders : public HeaderApi { } } - // Dump the textural representation of the header object to a string, which + // Dump the textual representation of the header object to a string, which // is suitable for writing out to logs. All CRLF will be printed out as \n. // This function can be called on a header object in any state. Raw header // data will be printed out if the header object is not completely parsed, @@ -841,6 +847,8 @@ class QUICHE_EXPORT BalsaHeaders : public HeaderApi { const absl::string_view value)> fn) const override; + void FoldContinuationLines(); + void DumpToPrefixedString(const char* spaces, std::string* str) const; absl::string_view first_line() const { @@ -1048,7 +1056,8 @@ class QUICHE_EXPORT BalsaHeaders : public HeaderApi { friend bool ParseHTTPFirstLine( char* begin, char* end, bool is_request, BalsaHeaders* headers, BalsaFrameEnums::ErrorCode* error_code, - HttpValidationPolicy::FirstLineValidationOption whitespace_option); + HttpValidationPolicy::FirstLineValidationOption whitespace_option, + HttpValidationPolicy::FirstLineValidationOption multiple_spaces_option); // Reverse iterators have been removed for lack of use, refer to // cl/30618773 in case they are needed. diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/http_validation_policy.h b/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/http_validation_policy.h index 80e0aec7e1..829a994207 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/http_validation_policy.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/balsa/http_validation_policy.h @@ -91,6 +91,16 @@ struct QUICHE_EXPORT HttpValidationPolicy { // If true, the parser rejects chunked messages that don't end with // CR_LF_CR_LF. bool require_chunked_body_end_with_crlf_crlf = false; + + // If SANITIZE, the parser will replace multiple consecutive spaces with + // a single space in the HTTP/1 first line. If REJECT, a first line + // containing multiple consecutive spaces will be rejected. + FirstLineValidationOption sanitize_firstline_spaces = + FirstLineValidationOption::NONE; + + // If true, the parser will replace obs-fold in header field values with one + // or more space characters. + bool sanitize_obs_fold_in_header_values = false; }; } // namespace quiche diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/binary_http/binary_http_message.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/binary_http/binary_http_message.cc index bc7a9b0867..4224cfc318 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/binary_http/binary_http_message.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/binary_http/binary_http_message.cc @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -19,6 +20,7 @@ #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" #include "absl/strings/string_view.h" +#include "absl/types/span.h" #include "quiche/common/quiche_callbacks.h" #include "quiche/common/quiche_data_reader.h" #include "quiche/common/quiche_data_writer.h" @@ -29,15 +31,9 @@ namespace { constexpr uint64_t kKnownLengthRequestFraming = 0; constexpr uint64_t kKnownLengthResponseFraming = 1; constexpr uint64_t kIndeterminateLengthRequestFraming = 2; +constexpr uint64_t kIndeterminateLengthResponseFraming = 3; constexpr uint64_t kContentTerminator = 0; -// A view of a field name and value. Used to pass around a field without owning -// or copying the backing data. -struct FieldView { - absl::string_view name; - absl::string_view value; -}; - bool ReadStringValue(quiche::QuicheDataReader& reader, std::string& data) { absl::string_view data_view; if (!reader.ReadStringPieceVarInt62(&data_view)) { @@ -72,8 +68,8 @@ absl::StatusOr DecodeControlData( // Decodes a header/trailer name and value. This takes a length which represents // only the name length. -absl::StatusOr DecodeField(QuicheDataReader& reader, - uint64_t name_length) { +absl::StatusOr DecodeField( + QuicheDataReader& reader, uint64_t name_length) { absl::string_view name; if (!reader.ReadStringPiece(&name, name_length)) { return absl::OutOfRangeError("Not enough data to read field name."); @@ -82,7 +78,7 @@ absl::StatusOr DecodeField(QuicheDataReader& reader, if (!reader.ReadStringPieceVarInt62(&value)) { return absl::OutOfRangeError("Not enough data to read field value."); } - return FieldView{name, value}; + return BinaryHttpMessage::FieldView{name, value}; } absl::Status DecodeFields(quiche::QuicheDataReader& reader, @@ -444,7 +440,12 @@ BinaryHttpRequest::IndeterminateLengthDecoder::DecodeContentTerminatedSection( if (!field.ok()) { return field.status(); } - message_section_handler_.OnHeader(field->name, field->value); + const absl::Status section_status = + message_section_handler_.OnHeader(field->name, field->value); + if (!section_status.ok()) { + return absl::InternalError(absl::StrCat("Failed to handle header: ", + section_status.message())); + } break; } case MessageSection::kBody: { @@ -453,7 +454,12 @@ BinaryHttpRequest::IndeterminateLengthDecoder::DecodeContentTerminatedSection( length_or_content_terminator)) { return absl::OutOfRangeError("Failed to read body chunk."); } - message_section_handler_.OnBodyChunk(body_chunk); + const absl::Status section_status = + message_section_handler_.OnBodyChunk(body_chunk); + if (!section_status.ok()) { + return absl::InternalError(absl::StrCat( + "Failed to handle body chunk: ", section_status.message())); + } break; } case MessageSection::kTrailer: { @@ -462,7 +468,12 @@ BinaryHttpRequest::IndeterminateLengthDecoder::DecodeContentTerminatedSection( if (!field.ok()) { return field.status(); } - message_section_handler_.OnTrailer(field->name, field->value); + const absl::Status section_status = + message_section_handler_.OnTrailer(field->name, field->value); + if (!section_status.ok()) { + return absl::InternalError(absl::StrCat( + "Failed to handle trailer: ", section_status.message())); + } break; } default: @@ -504,7 +515,12 @@ BinaryHttpRequest::IndeterminateLengthDecoder::DecodeCheckpointData( return absl::OutOfRangeError("Failed to read control data."); } - message_section_handler_.OnControlData(control_data.value()); + const absl::Status section_status = + message_section_handler_.OnControlData(control_data.value()); + if (!section_status.ok()) { + return absl::InternalError(absl::StrCat( + "Failed to handle control data: ", section_status.message())); + } SaveCheckpoint(reader); current_section_ = MessageSection::kHeader; } @@ -514,7 +530,12 @@ BinaryHttpRequest::IndeterminateLengthDecoder::DecodeCheckpointData( if (!status.ok()) { return status; } - message_section_handler_.OnHeadersDone(); + const absl::Status section_status = + message_section_handler_.OnHeadersDone(); + if (!section_status.ok()) { + return absl::InternalError(absl::StrCat( + "Failed to handle headers done: ", section_status.message())); + } current_section_ = MessageSection::kBody; } ABSL_FALLTHROUGH_INTENDED; @@ -526,16 +547,29 @@ BinaryHttpRequest::IndeterminateLengthDecoder::DecodeCheckpointData( // 1. There is no data to read after the headers section. // 2. This is signaled as the last piece of data (end_stream). if (maybe_truncated_ && end_stream) { - message_section_handler_.OnBodyChunksDone(); - message_section_handler_.OnTrailersDone(); + absl::Status section_status = + message_section_handler_.OnBodyChunksDone(); + if (!section_status.ok()) { + return absl::InternalError(absl::StrCat( + "Failed to handle body chunks done: ", section_status.message())); + } + section_status = message_section_handler_.OnTrailersDone(); + if (!section_status.ok()) { + return absl::InternalError(absl::StrCat( + "Failed to handle trailers done: ", section_status.message())); + } return absl::OkStatus(); } - const absl::Status status = DecodeContentTerminatedSection(reader); - if (!status.ok()) { - return status; + absl::Status section_status = DecodeContentTerminatedSection(reader); + if (!section_status.ok()) { + return section_status; + } + section_status = message_section_handler_.OnBodyChunksDone(); + if (!section_status.ok()) { + return absl::InternalError(absl::StrCat( + "Failed to handle body chunks done: ", section_status.message())); } - message_section_handler_.OnBodyChunksDone(); current_section_ = MessageSection::kTrailer; // Reset the truncation flag before entering the trailers section. maybe_truncated_ = true; @@ -549,15 +583,24 @@ BinaryHttpRequest::IndeterminateLengthDecoder::DecodeCheckpointData( // 1. There is no data to read after the body section. // 2. This is signaled as the last piece of data (end_stream). if (maybe_truncated_ && end_stream) { - message_section_handler_.OnTrailersDone(); + const absl::Status section_status = + message_section_handler_.OnTrailersDone(); + if (!section_status.ok()) { + return absl::InternalError(absl::StrCat( + "Failed to handle trailers done: ", section_status.message())); + } return absl::OkStatus(); } - const absl::Status status = DecodeContentTerminatedSection(reader); - if (!status.ok()) { - return status; + absl::Status section_status = DecodeContentTerminatedSection(reader); + if (!section_status.ok()) { + return section_status; + } + section_status = message_section_handler_.OnTrailersDone(); + if (!section_status.ok()) { + return absl::InternalError(absl::StrCat( + "Failed to handle trailers done: ", section_status.message())); } - message_section_handler_.OnTrailersDone(); current_section_ = MessageSection::kPadding; } ABSL_FALLTHROUGH_INTENDED; @@ -592,6 +635,11 @@ absl::Status BinaryHttpRequest::IndeterminateLengthDecoder::Decode( if (end_stream) { current_section_ = MessageSection::kEnd; buffer_.clear(); + // Out of range errors shall be treated as invalid argument errors when the + // stream is ending. + if (absl::IsOutOfRange(status)) { + return absl::InvalidArgumentError(status.message()); + } return status; } if (absl::IsOutOfRange(status)) { @@ -620,6 +668,191 @@ absl::StatusOr BinaryHttpResponse::Create( absl::StrCat("Unsupported framing type ", framing)); } +absl::StatusOr +BinaryHttpResponse::IndeterminateLengthEncoder::EncodeFieldSection( + std::optional status_code, absl::Span fields) { + uint64_t total_length = 0; + if (!framing_indicator_encoded_) { + total_length += quiche::QuicheDataWriter::GetVarInt62Len( + kIndeterminateLengthResponseFraming); + } + if (status_code.has_value()) { + total_length += QuicheDataWriter::GetVarInt62Len(*status_code); + } + for (const auto& field : fields) { + uint8_t length = QuicheDataWriter::GetVarInt62Len(field.name.size()); + if (length == 0) { + return absl::InvalidArgumentError("Field name exceeds maximum length."); + } + total_length += length + field.name.size(); + + length = QuicheDataWriter::GetVarInt62Len(field.value.size()); + if (length == 0) { + return absl::InvalidArgumentError("Field value exceeds maximum length."); + } + total_length += length + field.value.size(); + } + total_length += quiche::QuicheDataWriter::GetVarInt62Len(kContentTerminator); + + std::string data(total_length, '\0'); + QuicheDataWriter writer(total_length, data.data()); + + if (!framing_indicator_encoded_) { + if (!writer.WriteVarInt62(kIndeterminateLengthResponseFraming)) { + return absl::InternalError("Failed to write framing indicator."); + } + framing_indicator_encoded_ = true; + } + if (status_code.has_value() && !writer.WriteVarInt62(*status_code)) { + return absl::InternalError("Failed to write status code."); + } + for (const auto& field : fields) { + if (!writer.WriteStringPieceVarInt62(absl::AsciiStrToLower(field.name))) { + return absl::InternalError("Failed to write field name."); + } + if (!writer.WriteStringPieceVarInt62(field.value)) { + return absl::InternalError("Failed to write field value."); + } + } + if (!writer.WriteVarInt62(kContentTerminator)) { + return absl::InternalError("Failed to write content terminator."); + } + if (writer.remaining() != 0) { + return absl::InternalError("Failed to write all data."); + } + return data; +} + +std::string +BinaryHttpResponse::IndeterminateLengthEncoder::GetMessageSectionString( + MessageSection section) const { + switch (section) { + case MessageSection::kInformationalResponseOrHeader: + return "InformationalResponseOrHeader"; + case MessageSection::kBody: + return "Body"; + case MessageSection::kTrailer: + return "Trailer"; + case MessageSection::kEnd: + return "End"; + default: + return "Unknown"; + } +} + +absl::StatusOr +BinaryHttpResponse::IndeterminateLengthEncoder::EncodeInformationalResponse( + uint16_t status_code, absl::Span fields) { + if (current_section_ != MessageSection::kInformationalResponseOrHeader) { + current_section_ = MessageSection::kEnd; + return absl::InvalidArgumentError(absl::StrCat( + "EncodeInformationalResponse called in incorrect section: ", + GetMessageSectionString(current_section_))); + } + if (status_code < 100 || status_code > 199) { + current_section_ = MessageSection::kEnd; + return absl::InvalidArgumentError(absl::StrCat( + "Invalid informational response status code: ", status_code)); + } + + absl::StatusOr data = EncodeFieldSection(status_code, fields); + if (!data.ok()) { + current_section_ = MessageSection::kEnd; + } + + return data; +} + +absl::StatusOr +BinaryHttpResponse::IndeterminateLengthEncoder::EncodeHeaders( + uint16_t status_code, absl::Span headers) { + if (current_section_ != MessageSection::kInformationalResponseOrHeader) { + current_section_ = MessageSection::kEnd; + return absl::InvalidArgumentError( + absl::StrCat("EncodeHeaders called in incorrect section: ", + GetMessageSectionString(current_section_))); + } + if (status_code < 200 || status_code > 599) { + current_section_ = MessageSection::kEnd; + return absl::InvalidArgumentError( + absl::StrCat("Invalid response status code: ", status_code)); + } + + absl::StatusOr data = EncodeFieldSection(status_code, headers); + if (!data.ok()) { + current_section_ = MessageSection::kEnd; + return data; + } + current_section_ = MessageSection::kBody; + return data; +} + +absl::StatusOr +BinaryHttpResponse::IndeterminateLengthEncoder::EncodeBodyChunks( + absl::Span body_chunks, bool body_chunks_done) { + if (current_section_ != MessageSection::kBody) { + current_section_ = MessageSection::kEnd; + return absl::InvalidArgumentError( + absl::StrCat("EncodeBodyChunks called in incorrect section: ", + GetMessageSectionString(current_section_))); + } + uint64_t total_length = 0; + for (const auto& body_chunk : body_chunks) { + uint8_t body_chunk_var_int_length = + QuicheDataWriter::GetVarInt62Len(body_chunk.size()); + if (body_chunk_var_int_length == 0) { + current_section_ = MessageSection::kEnd; + return absl::InvalidArgumentError( + "Body chunk size exceeds maximum length."); + } + total_length += body_chunk_var_int_length + body_chunk.size(); + } + if (body_chunks_done) { + total_length += + quiche::QuicheDataWriter::GetVarInt62Len(kContentTerminator); + } + + std::string data(total_length, '\0'); + QuicheDataWriter writer(total_length, data.data()); + + for (const auto& body_chunk : body_chunks) { + if (!writer.WriteStringPieceVarInt62(body_chunk)) { + current_section_ = MessageSection::kEnd; + return absl::InternalError("Failed to write body chunk."); + } + } + if (body_chunks_done) { + if (!writer.WriteVarInt62(kContentTerminator)) { + current_section_ = MessageSection::kEnd; + return absl::InternalError("Failed to write content terminator."); + } + current_section_ = MessageSection::kTrailer; + } + + if (writer.remaining() != 0) { + current_section_ = MessageSection::kEnd; + return absl::InternalError("Failed to write all data."); + } + return data; +} + +absl::StatusOr +BinaryHttpResponse::IndeterminateLengthEncoder::EncodeTrailers( + absl::Span trailers) { + if (current_section_ != MessageSection::kTrailer) { + current_section_ = MessageSection::kEnd; + return absl::InvalidArgumentError( + absl::StrCat("EncodeTrailers called in incorrect section: ", + GetMessageSectionString(current_section_))); + } + + absl::StatusOr data = + EncodeFieldSection(/*status_code=*/std::nullopt, trailers); + + current_section_ = MessageSection::kEnd; + return data; +} + std::string BinaryHttpMessage::DebugString() const { std::vector headers; for (const auto& field : GetHeaderFields()) { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/binary_http/binary_http_message.h b/naiveproxy/src/net/third_party/quiche/src/quiche/binary_http/binary_http_message.h index 0a28e0a1fd..fd75c7054f 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/binary_http/binary_http_message.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/binary_http/binary_http_message.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -14,6 +15,7 @@ #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/string_view.h" +#include "absl/types/span.h" #include "quiche/common/platform/api/quiche_export.h" #include "quiche/common/quiche_data_reader.h" #include "quiche/common/quiche_data_writer.h" @@ -25,6 +27,12 @@ namespace quiche { // https://www.ietf.org/archive/id/draft-ietf-httpbis-binary-message-06.html class QUICHE_EXPORT BinaryHttpMessage { public: + // A view of a field name and value. Used to pass around a field without + // owning or copying the backing data. + struct QUICHE_EXPORT FieldView { + absl::string_view name; + absl::string_view value; + }; // Name value pair of either a header or trailer field. struct QUICHE_EXPORT Field { std::string name; @@ -178,19 +186,21 @@ class QUICHE_EXPORT BinaryHttpRequest : public BinaryHttpMessage { // its corresponding section is successfully decoded. class QUICHE_EXPORT IndeterminateLengthDecoder { public: - // The handler to invoke when a section is decoded successfully. - class MessageSectionHandler { + // The handler to invoke when a section is decoded successfully. The + // handler can return an error if the decoded data cannot be processed + // successfully. + class QUICHE_EXPORT MessageSectionHandler { public: virtual ~MessageSectionHandler() = default; - virtual void OnControlData(const ControlData& control_data) = 0; - virtual void OnHeader(absl::string_view name, - absl::string_view value) = 0; - virtual void OnHeadersDone() = 0; - virtual void OnBodyChunk(absl::string_view body_chunk) = 0; - virtual void OnBodyChunksDone() = 0; - virtual void OnTrailer(absl::string_view name, - absl::string_view value) = 0; - virtual void OnTrailersDone() = 0; + virtual absl::Status OnControlData(const ControlData& control_data) = 0; + virtual absl::Status OnHeader(absl::string_view name, + absl::string_view value) = 0; + virtual absl::Status OnHeadersDone() = 0; + virtual absl::Status OnBodyChunk(absl::string_view body_chunk) = 0; + virtual absl::Status OnBodyChunksDone() = 0; + virtual absl::Status OnTrailer(absl::string_view name, + absl::string_view value) = 0; + virtual absl::Status OnTrailersDone() = 0; }; explicit IndeterminateLengthDecoder( @@ -364,6 +374,42 @@ class QUICHE_EXPORT BinaryHttpResponse : public BinaryHttpMessage { return !(*this == rhs); } + // Provides encoding methods for an Indeterminate-Length BHTTP response. The + // encoder keeps track of what has been encoded so far to ensure sections are + // encoded in the correct order, this means it can only be used for a single + // BHTTP response message. + class QUICHE_EXPORT IndeterminateLengthEncoder { + public: + // Encodes the specified informational response status code, fields, and its + // content terminator. + absl::StatusOr EncodeInformationalResponse( + uint16_t status_code, absl::Span fields); + // Encodes the specified status code, headers, and its content terminator. + absl::StatusOr EncodeHeaders(uint16_t status_code, + absl::Span headers); + // Encodes the specified body chunks. If 'body_chunks_done' is true, the + // encoded body chunks are followed by the content terminator. + absl::StatusOr EncodeBodyChunks( + absl::Span body_chunks, bool body_chunks_done); + // Encodes the specified trailers and its content terminator. + absl::StatusOr EncodeTrailers(absl::Span trailers); + + private: + enum class MessageSection { + kInformationalResponseOrHeader, + kBody, + kTrailer, + kEnd, + }; + absl::StatusOr EncodeFieldSection( + std::optional status_code, absl::Span fields); + std::string GetMessageSectionString(MessageSection section) const; + + MessageSection current_section_ = + MessageSection::kInformationalResponseOrHeader; + bool framing_indicator_encoded_ = false; + }; + private: // Returns Binary Http known length request formatted response. absl::StatusOr EncodeAsKnownLength() const; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_auth.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_auth.cc index 8d4c6b7502..bcf584f5b4 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_auth.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_auth.cc @@ -4,6 +4,7 @@ #include "quiche/blind_sign_auth/blind_sign_auth.h" +#include #include #include #include @@ -14,6 +15,7 @@ #include #include "absl/algorithm/container.h" +#include "absl/cleanup/cleanup.h" #include "absl/functional/bind_front.h" #include "absl/status/status.h" #include "absl/status/statusor.h" @@ -31,6 +33,7 @@ #include "quiche/blind_sign_auth/blind_sign_auth_protos.h" #include "quiche/blind_sign_auth/blind_sign_message_interface.h" #include "quiche/blind_sign_auth/blind_sign_message_response.h" +#include "quiche/blind_sign_auth/blind_sign_tracing_hooks.h" #include "quiche/common/platform/api/quiche_logging.h" #include "quiche/common/quiche_random.h" @@ -81,7 +84,11 @@ using anonymous_tokens::ValidateExtensionsOrderAndValues; void BlindSignAuth::GetTokens(std::optional oauth_token, int num_tokens, ProxyLayer proxy_layer, BlindSignAuthServiceType service_type, - SignedTokenCallback callback) { + SignedTokenCallback callback, + std::unique_ptr hooks) { + if (hooks != nullptr) { + hooks->OnGetInitialDataStart(); + } // Create GetInitialData RPC. GetInitialDataRequest request; request.set_use_attestation(false); @@ -96,7 +103,7 @@ void BlindSignAuth::GetTokens(std::optional oauth_token, std::string body_bytes = request.SerializeAsString(); BlindSignMessageCallback initial_data_callback = absl::bind_front( &BlindSignAuth::GetInitialDataCallback, this, oauth_token, num_tokens, - proxy_layer, service_type, std::move(callback)); + proxy_layer, service_type, std::move(callback), std::move(hooks)); fetcher_->DoRequest(BlindSignMessageRequestType::kGetInitialData, oauth_token, body_bytes, std::move(initial_data_callback)); } @@ -104,8 +111,11 @@ void BlindSignAuth::GetTokens(std::optional oauth_token, void BlindSignAuth::GetInitialDataCallback( std::optional oauth_token, int num_tokens, ProxyLayer proxy_layer, BlindSignAuthServiceType service_type, - SignedTokenCallback callback, + SignedTokenCallback callback, std::unique_ptr hooks, absl::StatusOr response) { + if (hooks != nullptr) { + hooks->OnGetInitialDataEnd(); + } absl::StatusOr initial_data_response = ParseGetInitialDataResponseMessage(response); if (!initial_data_response.ok()) { @@ -122,7 +132,7 @@ void BlindSignAuth::GetInitialDataCallback( QUICHE_DVLOG(1) << "Using Privacy Pass client"; GeneratePrivacyPassTokens(*initial_data_response, std::move(oauth_token), num_tokens, proxy_layer, service_type, - std::move(callback)); + std::move(callback), std::move(hooks)); } else { QUICHE_LOG(ERROR) << "Non-Privacy Pass tokens are no longer supported"; std::move(callback)(absl::UnimplementedError( @@ -135,7 +145,8 @@ void BlindSignAuth::GeneratePrivacyPassTokens( privacy::ppn::GetInitialDataResponse initial_data_response, std::optional oauth_token, int num_tokens, ProxyLayer proxy_layer, BlindSignAuthServiceType service_type, - SignedTokenCallback callback) { + SignedTokenCallback callback, + std::unique_ptr hooks) { absl::StatusOr pp_context = CreatePrivacyPassContext(initial_data_response); if (!pp_context.ok()) { @@ -156,10 +167,16 @@ void BlindSignAuth::GeneratePrivacyPassTokens( return; } + if (hooks != nullptr) { + hooks->OnGenerateBlindedTokenRequestsStart(); + } absl::StatusOr token_requests_data = GenerateBlindedTokenRequests(num_tokens, *pp_context->rsa_public_key, *token_challenge, pp_context->token_key_id, pp_context->extensions); + if (hooks != nullptr) { + hooks->OnGenerateBlindedTokenRequestsEnd(); + } if (!token_requests_data.ok()) { std::move(callback)(token_requests_data.status()); return; @@ -179,11 +196,14 @@ void BlindSignAuth::GeneratePrivacyPassTokens( sign_request.set_do_not_use_rsa_public_exponent(true); sign_request.set_proxy_layer(QuicheProxyLayerToPpnProxyLayer(proxy_layer)); + if (hooks != nullptr) { + hooks->OnAuthAndSignStart(); + } BlindSignMessageCallback auth_and_sign_callback = absl::bind_front(&BlindSignAuth::PrivacyPassAuthAndSignCallback, this, *std::move(pp_context), std::move(token_requests_data->privacy_pass_clients), - std::move(callback)); + std::move(callback), std::move(hooks)); // TODO(b/304811277): remove other usages of string.data() fetcher_->DoRequest(BlindSignMessageRequestType::kAuthAndSign, oauth_token, sign_request.SerializeAsString(), @@ -195,20 +215,22 @@ void BlindSignAuth::PrivacyPassAuthAndSignCallback( std::vector> privacy_pass_clients, - SignedTokenCallback callback, + SignedTokenCallback callback, std::unique_ptr hooks, absl::StatusOr response) { + if (hooks != nullptr) { + hooks->OnAuthAndSignEnd(); + } // Validate response. if (!response.ok()) { QUICHE_LOG(WARNING) << "AuthAndSign failed: " << response.status(); - std::move(callback)( - absl::InvalidArgumentError("AuthAndSign failed: invalid response")); + std::move(callback)(absl::Status(response.status().code(), + "AuthAndSign failed: invalid response")); return; } absl::StatusCode code = response->status_code(); if (code != absl::StatusCode::kOk) { - std::string message = absl::StrCat("AuthAndSign failed with code: ", code); - QUICHE_LOG(WARNING) << message; - std::move(callback)(absl::InvalidArgumentError(message)); + QUICHE_LOG(WARNING) << "AuthAndSign failed with code: " << code; + std::move(callback)(absl::Status(code, "AuthAndSign failed")); return; } @@ -230,44 +252,58 @@ void BlindSignAuth::PrivacyPassAuthAndSignCallback( return; } + if (hooks != nullptr) { + hooks->OnUnblindTokensStart(); + } + absl::Cleanup unblind_tokens_end = [hooks = std::move(hooks)]() { + if (hooks != nullptr) { + hooks->OnUnblindTokensEnd(); + } + }; + // Create tokens using blinded signatures. std::vector tokens_vec; + tokens_vec.resize(sign_response.blinded_token_signature_size()); for (int i = 0; i < sign_response.blinded_token_signature_size(); i++) { - std::string unescaped_blinded_sig; - if (!absl::Base64Unescape(sign_response.blinded_token_signature()[i], - &unescaped_blinded_sig)) { - QUICHE_LOG(WARNING) << "Failed to unescape blinded signature"; - std::move(callback)( - absl::InternalError("Failed to unescape blinded signature")); - return; - } + task_bundle_->Add([&, i]() { + std::string unescaped_blinded_sig; + if (!absl::Base64Unescape(sign_response.blinded_token_signature()[i], + &unescaped_blinded_sig)) { + QUICHE_LOG(WARNING) << "Failed to unescape blinded signature"; + return absl::InternalError("Failed to unescape blinded signature"); + } - absl::StatusOr token = - privacy_pass_clients[i]->FinalizeToken(unescaped_blinded_sig); - if (!token.ok()) { - QUICHE_LOG(WARNING) << "Failed to finalize token: " << token.status(); - std::move(callback)(absl::InternalError("Failed to finalize token")); - return; - } + absl::StatusOr token = + privacy_pass_clients[i]->FinalizeToken(unescaped_blinded_sig); + if (!token.ok()) { + QUICHE_LOG(WARNING) << "Failed to finalize token: " << token.status(); + return absl::InternalError("Failed to finalize token"); + } - absl::StatusOr marshaled_token = MarshalToken(*token); - if (!marshaled_token.ok()) { - QUICHE_LOG(WARNING) << "Failed to marshal token: " - << marshaled_token.status(); - std::move(callback)(absl::InternalError("Failed to marshal token")); - return; - } + absl::StatusOr marshaled_token = MarshalToken(*token); + if (!marshaled_token.ok()) { + QUICHE_LOG(WARNING) + << "Failed to marshal token: " << marshaled_token.status(); + return absl::InternalError("Failed to marshal token"); + } - PrivacyPassTokenData privacy_pass_token_data; - privacy_pass_token_data.mutable_token()->assign( - ConvertBase64ToWebSafeBase64(absl::Base64Escape(*marshaled_token))); - privacy_pass_token_data.mutable_encoded_extensions()->assign( - ConvertBase64ToWebSafeBase64( - absl::Base64Escape(pp_context.public_metadata_extensions_str))); - privacy_pass_token_data.set_use_case_override(pp_context.use_case); - tokens_vec.push_back(BlindSignToken{ - privacy_pass_token_data.SerializeAsString(), - pp_context.public_metadata_expiry_time, pp_context.geo_hint}); + PrivacyPassTokenData privacy_pass_token_data; + privacy_pass_token_data.mutable_token()->assign( + ConvertBase64ToWebSafeBase64(absl::Base64Escape(*marshaled_token))); + privacy_pass_token_data.mutable_encoded_extensions()->assign( + ConvertBase64ToWebSafeBase64( + absl::Base64Escape(pp_context.public_metadata_extensions_str))); + privacy_pass_token_data.set_use_case_override(pp_context.use_case); + tokens_vec[i] = BlindSignToken{ + privacy_pass_token_data.SerializeAsString(), + pp_context.public_metadata_expiry_time, pp_context.geo_hint}; + return absl::OkStatus(); + }); + } + absl::Status status = task_bundle_->Join(); + if (!status.ok()) { + std::move(callback)(status); + return; } std::move(callback)(absl::Span(tokens_vec)); @@ -337,8 +373,9 @@ void BlindSignAuth::GetAttestationTokensCallback( void BlindSignAuth::AttestAndSign( int num_tokens, privacy::ppn::GetInitialDataResponse initial_data_response, - SignedTokenCallback callback, absl::StatusOr attestation_data, - std::optional token_challenge) { + SignedTokenCallback callback, + absl::StatusOr> attestation_data, + std::optional token_challenge) { absl::StatusOr pp_context = CreatePrivacyPassContext(initial_data_response); if (!pp_context.ok()) { @@ -381,7 +418,14 @@ void BlindSignAuth::AttestAndSign( std::move(callback)(attestation_data.status()); return; } - android_attestation_data.add_hardware_backed_certs(*attestation_data); + if (attestation_data->empty()) { + std::move(callback)( + absl::InvalidArgumentError("Attestation data is empty")); + return; + } + for (absl::string_view cert : *attestation_data) { + android_attestation_data.add_hardware_backed_certs(cert); + } Any attestation_data_proto_any; attestation_data_proto_any.set_type_url(kAttestationProtoTypeUrl); @@ -426,16 +470,14 @@ void BlindSignAuth::AttestAndSignCallback( // Validate response. if (!response.ok()) { QUICHE_LOG(WARNING) << "AttestAndSign failed: " << response.status(); - std::move(callback)( - absl::InvalidArgumentError("AttestAndSign failed: invalid response")); + std::move(callback)(absl::Status(response.status().code(), + "AttestAndSign failed: invalid response")); return; } absl::StatusCode code = response->status_code(); if (code != absl::StatusCode::kOk) { - std::string message = - absl::StrCat("AttestAndSign failed with code: ", code); - QUICHE_LOG(WARNING) << message; - std::move(callback)(absl::InvalidArgumentError(message)); + QUICHE_LOG(WARNING) << "AttestAndSign failed with code: " << code; + std::move(callback)(absl::Status(code, "AttestAndSign failed")); return; } @@ -459,44 +501,48 @@ void BlindSignAuth::AttestAndSignCallback( // Create tokens using blinded signatures. std::vector tokens_vec; + tokens_vec.resize(sign_response.blinded_token_signatures_size()); for (int i = 0; i < sign_response.blinded_token_signatures_size(); i++) { - std::string unescaped_blinded_sig; - if (!absl::Base64Unescape(sign_response.blinded_token_signatures()[i], - &unescaped_blinded_sig)) { - QUICHE_LOG(WARNING) << "Failed to unescape blinded signature"; - std::move(callback)( - absl::InternalError("Failed to unescape blinded signature")); - return; - } + task_bundle_->Add([&, i]() { + std::string unescaped_blinded_sig; + if (!absl::Base64Unescape(sign_response.blinded_token_signatures()[i], + &unescaped_blinded_sig)) { + QUICHE_LOG(WARNING) << "Failed to unescape blinded signature"; + return absl::InternalError("Failed to unescape blinded signature"); + } - absl::StatusOr token = - privacy_pass_clients[i]->FinalizeToken(unescaped_blinded_sig); - if (!token.ok()) { - QUICHE_LOG(WARNING) << "Failed to finalize token: " << token.status(); - std::move(callback)(absl::InternalError("Failed to finalize token")); - return; - } + absl::StatusOr token = + privacy_pass_clients[i]->FinalizeToken(unescaped_blinded_sig); + if (!token.ok()) { + QUICHE_LOG(WARNING) << "Failed to finalize token: " << token.status(); + return absl::InternalError("Failed to finalize token"); + } - absl::StatusOr marshaled_token = MarshalToken(*token); - if (!marshaled_token.ok()) { - QUICHE_LOG(WARNING) << "Failed to marshal token: " - << marshaled_token.status(); - std::move(callback)(absl::InternalError("Failed to marshal token")); - return; - } + absl::StatusOr marshaled_token = MarshalToken(*token); + if (!marshaled_token.ok()) { + QUICHE_LOG(WARNING) + << "Failed to marshal token: " << marshaled_token.status(); + return absl::InternalError("Failed to marshal token"); + } - PrivacyPassTokenData privacy_pass_token_data; - privacy_pass_token_data.mutable_token()->assign( - ConvertBase64ToWebSafeBase64(absl::Base64Escape(*marshaled_token))); - privacy_pass_token_data.mutable_encoded_extensions()->assign( - ConvertBase64ToWebSafeBase64( - absl::Base64Escape(pp_context.public_metadata_extensions_str))); - privacy_pass_token_data.set_use_case_override(pp_context.use_case); - tokens_vec.push_back(BlindSignToken{ - privacy_pass_token_data.SerializeAsString(), - pp_context.public_metadata_expiry_time, pp_context.geo_hint}); + PrivacyPassTokenData privacy_pass_token_data; + privacy_pass_token_data.mutable_token()->assign( + ConvertBase64ToWebSafeBase64(absl::Base64Escape(*marshaled_token))); + privacy_pass_token_data.mutable_encoded_extensions()->assign( + ConvertBase64ToWebSafeBase64( + absl::Base64Escape(pp_context.public_metadata_extensions_str))); + privacy_pass_token_data.set_use_case_override(pp_context.use_case); + tokens_vec[i] = BlindSignToken{ + privacy_pass_token_data.SerializeAsString(), + pp_context.public_metadata_expiry_time, pp_context.geo_hint}; + return absl::OkStatus(); + }); + } + absl::Status status = task_bundle_->Join(); + if (!status.ok()) { + std::move(callback)(status); + return; } - std::move(callback)(absl::Span(tokens_vec)); } @@ -506,15 +552,13 @@ BlindSignAuth::ParseGetInitialDataResponseMessage( if (!response.ok()) { QUICHE_LOG(WARNING) << "GetInitialDataRequest failed: " << response.status(); - return absl::InvalidArgumentError( - "GetInitialDataRequest failed: invalid response"); + return absl::Status(response.status().code(), + "GetInitialDataRequest failed: invalid response"); } if (absl::StatusCode code = response->status_code(); code != absl::StatusCode::kOk) { - std::string message = - absl::StrCat("GetInitialDataRequest failed with code: ", code); - QUICHE_LOG(WARNING) << message; - return absl::InvalidArgumentError(message); + QUICHE_LOG(WARNING) << "GetInitialDataRequest failed with code: " << code; + return absl::Status(code, "GetInitialDataRequest failed"); } // Parse GetInitialDataResponse. GetInitialDataResponse initial_data_response; @@ -606,33 +650,40 @@ BlindSignAuth::GenerateBlindedTokenRequests( absl::string_view token_challenge_str, absl::string_view token_key_id, const anonymous_tokens::Extensions& extensions) { GeneratedTokenRequests result; - result.privacy_pass_clients.reserve(num_tokens); - result.privacy_pass_blinded_tokens_b64.reserve(num_tokens); + result.privacy_pass_clients.resize(num_tokens); + result.privacy_pass_blinded_tokens_b64.resize(num_tokens); QuicheRandom* random = QuicheRandom::GetInstance(); for (int i = 0; i < num_tokens; i++) { - absl::StatusOr> - client = PrivacyPassRsaBssaPublicMetadataClient::Create(rsa_public_key); - if (!client.ok()) { - return absl::InternalError( - absl::StrCat("Failed to create Privacy Pass client: ", - client.status().ToString())); - } + task_bundle_->Add([&, i]() { + auto client = + PrivacyPassRsaBssaPublicMetadataClient::Create(rsa_public_key); + if (!client.ok()) { + return absl::InternalError( + absl::StrCat("Failed to create Privacy Pass client: ", + client.status().ToString())); + } - std::string nonce_rand(32, '\0'); - random->RandBytes(nonce_rand.data(), nonce_rand.size()); + std::string nonce_rand(32, '\0'); + random->RandBytes(nonce_rand.data(), nonce_rand.size()); - absl::StatusOr extended_token_request = - (*client)->CreateTokenRequest(token_challenge_str, nonce_rand, - token_key_id, extensions); - if (!extended_token_request.ok()) { - return absl::InternalError( - absl::StrCat("Failed to create ExtendedTokenRequest: ", - extended_token_request.status().ToString())); - } - result.privacy_pass_clients.push_back(*std::move(client)); - result.privacy_pass_blinded_tokens_b64.push_back(absl::Base64Escape( - extended_token_request->request.blinded_token_request)); + absl::StatusOr extended_token_request = + (*client)->CreateTokenRequest(token_challenge_str, nonce_rand, + token_key_id, extensions); + if (!extended_token_request.ok()) { + return absl::InternalError( + absl::StrCat("Failed to create ExtendedTokenRequest: ", + extended_token_request.status().ToString())); + } + result.privacy_pass_clients[i] = *std::move(client); + result.privacy_pass_blinded_tokens_b64[i] = absl::Base64Escape( + extended_token_request->request.blinded_token_request); + return absl::OkStatus(); + }); + } + absl::Status status = task_bundle_->Join(); + if (!status.ok()) { + return status; } return result; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_auth.h b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_auth.h index d1398d7a96..15accf7d42 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_auth.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_auth.h @@ -5,18 +5,26 @@ #ifndef QUICHE_BLIND_SIGN_AUTH_BLIND_SIGN_AUTH_H_ #define QUICHE_BLIND_SIGN_AUTH_BLIND_SIGN_AUTH_H_ +#include #include #include #include +#include +#include #include "absl/status/statusor.h" +#include "absl/strings/string_view.h" #include "absl/time/time.h" +#include "absl/types/span.h" #include "anonymous_tokens/cpp/privacy_pass/rsa_bssa_public_metadata_client.h" #include "anonymous_tokens/cpp/privacy_pass/token_encodings.h" #include "quiche/blind_sign_auth/blind_sign_auth_interface.h" #include "quiche/blind_sign_auth/blind_sign_auth_protos.h" #include "quiche/blind_sign_auth/blind_sign_message_interface.h" #include "quiche/blind_sign_auth/blind_sign_message_response.h" +#include "quiche/blind_sign_auth/blind_sign_tracing_hooks.h" +#include "quiche/blind_sign_auth/direct_task_bundle.h" +#include "quiche/blind_sign_auth/task_bundle.h" #include "quiche/common/platform/api/quiche_export.h" namespace quiche { @@ -24,9 +32,25 @@ namespace quiche { // BlindSignAuth provides signed, unblinded tokens to callers. class QUICHE_EXPORT BlindSignAuth : public BlindSignAuthInterface { public: + explicit BlindSignAuth(std::unique_ptr fetcher, + privacy::ppn::BlindSignAuthOptions auth_options, + std::unique_ptr task_bundle = + std::make_unique()) + : owned_fetcher_(std::move(fetcher)), + task_bundle_(std::move(task_bundle)), + auth_options_(std::move(auth_options)) { + fetcher_ = owned_fetcher_.get(); + } + + // TODO: b/441077019 - Remove once IpProtectionTokenDirectFetcher updates to + // transfer pointer ownership. explicit BlindSignAuth(BlindSignMessageInterface* fetcher, - privacy::ppn::BlindSignAuthOptions auth_options) - : fetcher_(fetcher), auth_options_(std::move(auth_options)) {} + privacy::ppn::BlindSignAuthOptions auth_options, + std::unique_ptr task_bundle = + std::make_unique()) + : fetcher_(fetcher), + task_bundle_(std::move(task_bundle)), + auth_options_(std::move(auth_options)) {} // Returns signed unblinded tokens, their expiration time, and their geo in a // callback. @@ -36,7 +60,17 @@ class QUICHE_EXPORT BlindSignAuth : public BlindSignAuthInterface { // Callers can make multiple concurrent requests to GetTokens. void GetTokens(std::optional oauth_token, int num_tokens, ProxyLayer proxy_layer, BlindSignAuthServiceType service_type, - SignedTokenCallback callback) override; + SignedTokenCallback callback) override { + GetTokens(oauth_token, num_tokens, proxy_layer, service_type, + std::move(callback), /*hooks=*/nullptr); + } + + // Same as above, but allows passing tracing hooks which will be used to trace + // this invocation. The hooks will be destroyed after the callback is called. + void GetTokens(std::optional oauth_token, int num_tokens, + ProxyLayer proxy_layer, BlindSignAuthServiceType service_type, + SignedTokenCallback callback, + std::unique_ptr hooks) override; // Returns signed unblinded tokens and their expiration time in a // SignedTokenCallback. Errors will be returned in the SignedTokenCallback @@ -78,13 +112,15 @@ class QUICHE_EXPORT BlindSignAuth : public BlindSignAuthInterface { std::optional oauth_token, int num_tokens, ProxyLayer proxy_layer, BlindSignAuthServiceType service_type, SignedTokenCallback callback, + std::unique_ptr hooks, absl::StatusOr response); void GeneratePrivacyPassTokens( privacy::ppn::GetInitialDataResponse initial_data_response, std::optional oauth_token, int num_tokens, ProxyLayer proxy_layer, BlindSignAuthServiceType service_type, - SignedTokenCallback callback); + SignedTokenCallback callback, + std::unique_ptr hooks); void PrivacyPassAuthAndSignCallback( const PrivacyPassContext& pp_context, @@ -92,6 +128,7 @@ class QUICHE_EXPORT BlindSignAuth : public BlindSignAuthInterface { PrivacyPassRsaBssaPublicMetadataClient>> privacy_pass_clients, SignedTokenCallback callback, + std::unique_ptr hooks, absl::StatusOr response); // Helper functions for GetAttestationTokens flow. @@ -99,11 +136,12 @@ class QUICHE_EXPORT BlindSignAuth : public BlindSignAuthInterface { int num_tokens, AttestationDataCallback attestation_data_callback, SignedTokenCallback token_callback, absl::StatusOr response); - void AttestAndSign(int num_tokens, - privacy::ppn::GetInitialDataResponse initial_data_response, - SignedTokenCallback callback, - absl::StatusOr attestation_data, - std::optional token_challenge); + void AttestAndSign( + int num_tokens, + privacy::ppn::GetInitialDataResponse initial_data_response, + SignedTokenCallback callback, + absl::StatusOr> attestation_data, + std::optional token_challenge); void AttestAndSignCallback( PrivacyPassContext pp_context, const std::vector owned_fetcher_; + std::unique_ptr task_bundle_; privacy::ppn::BlindSignAuthOptions auth_options_; }; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_auth_interface.h b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_auth_interface.h index 59b2cdc9df..c69ecb2cb9 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_auth_interface.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_auth_interface.h @@ -5,14 +5,17 @@ #ifndef QUICHE_BLIND_SIGN_AUTH_BLIND_SIGN_AUTH_INTERFACE_H_ #define QUICHE_BLIND_SIGN_AUTH_BLIND_SIGN_AUTH_INTERFACE_H_ +#include #include #include +#include #include "absl/status/statusor.h" #include "absl/strings/string_view.h" #include "absl/time/time.h" #include "absl/types/span.h" #include "anonymous_tokens/cpp/privacy_pass/token_encodings.h" +#include "quiche/blind_sign_auth/blind_sign_tracing_hooks.h" #include "quiche/common/platform/api/quiche_export.h" #include "quiche/common/quiche_callbacks.h" @@ -50,8 +53,9 @@ using SignedTokenCallback = // This callback is used by the caller to return generated // attestation data and a token challenge to the BlindSignAuth library. -using AttestAndSignCallback = SingleUseCallback, std::optional)>; +using AttestAndSignCallback = + SingleUseCallback>, + std::optional)>; // AttestationDataCallback returns a serialized // privacy::ppn::PrepareAttestationData proto, which contains an attestation @@ -75,6 +79,14 @@ class QUICHE_EXPORT BlindSignAuthInterface { ProxyLayer proxy_layer, BlindSignAuthServiceType service_type, SignedTokenCallback callback) = 0; + virtual void GetTokens(std::optional oauth_token, int num_tokens, + ProxyLayer proxy_layer, + BlindSignAuthServiceType service_type, + SignedTokenCallback callback, + std::unique_ptr /*hooks*/) { + GetTokens(oauth_token, num_tokens, proxy_layer, service_type, + std::move(callback)); + } // Returns signed unblinded tokens and their expiration time in a // SignedTokenCallback. Errors will be returned in the SignedTokenCallback diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_message_response.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_message_response.cc index 5e7d9ce083..8904f29a91 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_message_response.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_message_response.cc @@ -3,9 +3,6 @@ namespace quiche { absl::StatusCode BlindSignMessageResponse::HttpCodeToStatusCode(int http_code) { - // copybara:strip_begin(golink) - // This mapping is from go/http-canonical-mapping - // copybara:strip_end if (http_code >= 200 && http_code < 300) { return absl::StatusCode::kOk; } else if (http_code >= 300 && http_code < 400) { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_tracing_hooks.h b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_tracing_hooks.h new file mode 100644 index 0000000000..de0a4817ef --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/blind_sign_tracing_hooks.h @@ -0,0 +1,33 @@ +#ifndef QUICHE_BLIND_SIGN_AUTH_BLIND_SIGN_TRACING_HOOKS_H_ +#define QUICHE_BLIND_SIGN_AUTH_BLIND_SIGN_TRACING_HOOKS_H_ + +#include "quiche/common/platform/api/quiche_export.h" + +namespace quiche { + +// Interface for performance tracing hooks. +class QUICHE_EXPORT BlindSignTracingHooks { + public: + virtual ~BlindSignTracingHooks() = default; + + // Called before (resp. after) the GetInitialData RPC. + virtual void OnGetInitialDataStart() = 0; + virtual void OnGetInitialDataEnd() = 0; + + // Called before (resp. after) initializing a batch of Privacy Pass clients + // and generating blinded token requests. + virtual void OnGenerateBlindedTokenRequestsStart() = 0; + virtual void OnGenerateBlindedTokenRequestsEnd() = 0; + + // Called before (resp. after) the AuthAndSign RPC. + virtual void OnAuthAndSignStart() = 0; + virtual void OnAuthAndSignEnd() = 0; + + // Called before (resp. after) finalizing a batch of tokens. + virtual void OnUnblindTokensStart() = 0; + virtual void OnUnblindTokensEnd() = 0; +}; + +} // namespace quiche + +#endif // QUICHE_BLIND_SIGN_AUTH_BLIND_SIGN_TRACING_HOOKS_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/direct_task_bundle.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/direct_task_bundle.cc new file mode 100644 index 0000000000..48f2978a96 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/direct_task_bundle.cc @@ -0,0 +1,36 @@ +// Copyright (c) 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "quiche/blind_sign_auth/direct_task_bundle.h" + +#include + +#include "absl/status/status.h" +#include "quiche/common/platform/api/quiche_logging.h" +#include "quiche/common/quiche_callbacks.h" + +namespace quiche { + +DirectTaskBundle::~DirectTaskBundle() { + QUICHE_DCHECK(tasks_.empty()) + << "DirectTaskBundle destroyed with pending tasks"; +} + +void DirectTaskBundle::Add(SingleUseCallback task) { + tasks_.push_back(std::move(task)); +} + +absl::Status DirectTaskBundle::Join() { + absl::Status status = absl::OkStatus(); + for (auto& task : tasks_) { + status = std::move(task)(); + if (!status.ok()) { + break; + } + } + tasks_.clear(); + return status; +} + +} // namespace quiche diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/direct_task_bundle.h b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/direct_task_bundle.h new file mode 100644 index 0000000000..a55079d8e4 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/direct_task_bundle.h @@ -0,0 +1,32 @@ +// Copyright (c) 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_BLIND_SIGN_AUTH_DIRECT_TASK_BUNDLE_H_ +#define QUICHE_BLIND_SIGN_AUTH_DIRECT_TASK_BUNDLE_H_ + +#include + +#include "absl/status/status.h" +#include "quiche/blind_sign_auth/task_bundle.h" +#include "quiche/common/platform/api/quiche_export.h" +#include "quiche/common/quiche_callbacks.h" + +namespace quiche { + +// A TaskBundle that executes tasks directly on the calling thread in the order +// they were added. +class QUICHE_EXPORT DirectTaskBundle : public TaskBundle { + public: + ~DirectTaskBundle() override; + + void Add(SingleUseCallback task) override; + absl::Status Join() override; + + private: + std::vector> tasks_; +}; + +} // namespace quiche + +#endif // QUICHE_BLIND_SIGN_AUTH_DIRECT_TASK_BUNDLE_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/task_bundle.h b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/task_bundle.h new file mode 100644 index 0000000000..a5e8371b92 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/blind_sign_auth/task_bundle.h @@ -0,0 +1,30 @@ +// Copyright (c) 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_BLIND_SIGN_AUTH_TASK_BUNDLE_H_ +#define QUICHE_BLIND_SIGN_AUTH_TASK_BUNDLE_H_ + +#include "absl/status/status.h" +#include "quiche/common/platform/api/quiche_export.h" +#include "quiche/common/quiche_callbacks.h" + +namespace quiche { + +// Interface for executing multiple independent tasks, possibly in parallel. +class QUICHE_EXPORT TaskBundle { + public: + virtual ~TaskBundle() = default; + + // Enqueues a task to be executed. + virtual void Add(SingleUseCallback task) = 0; + + // Blocks until all added tasks have completed. + // Returns OK if all tasks completed successfully, or the first error + // encountered otherwise. + virtual absl::Status Join() = 0; +}; + +} // namespace quiche + +#endif // QUICHE_BLIND_SIGN_AUTH_TASK_BUNDLE_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/api/quiche_client_stats.h b/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/api/quiche_client_stats.h index 5b1b08c2a6..ecec95253e 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/api/quiche_client_stats.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/api/quiche_client_stats.h @@ -5,8 +5,7 @@ #ifndef QUICHE_COMMON_PLATFORM_API_QUICHE_CLIENT_STATS_H_ #define QUICHE_COMMON_PLATFORM_API_QUICHE_CLIENT_STATS_H_ -#include - +#include "absl/strings/string_view.h" #include "quiche_platform_impl/quiche_client_stats_impl.h" namespace quiche { @@ -79,7 +78,7 @@ namespace quiche { QUICHE_CLIENT_HISTOGRAM_COUNTS_IMPL(name, sample, min, max, bucket_count, \ docstring) -inline void QuicheClientSparseHistogram(const std::string& name, int sample) { +inline void QuicheClientSparseHistogram(absl::string_view name, int sample) { QuicheClientSparseHistogramImpl(name, sample); } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/api/quiche_reference_counted.h b/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/api/quiche_reference_counted.h index dc161663cc..0aa49651fd 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/api/quiche_reference_counted.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/api/quiche_reference_counted.h @@ -54,6 +54,9 @@ class QUICHE_EXPORT QuicheReferenceCounted : public QuicheReferenceCountedImpl { template class QUICHE_NO_EXPORT QuicheReferenceCountedPointer { public: + // For compatibility with googletest's `Pointee` matcher. + using element_type = T; + QuicheReferenceCountedPointer() = default; // Constructor from raw pointer |p|. This guarantees that the reference count diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/api/quiche_server_stats.h b/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/api/quiche_server_stats.h index e8ad499cd9..aad8fd4a4a 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/api/quiche_server_stats.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/api/quiche_server_stats.h @@ -49,7 +49,7 @@ namespace quiche { // Sample usage: // QUICHE_SERVER_HISTOGRAM_TIMES("Very.Long.Timing.Histogram", time_delta, -// QuicTime::Delta::FromSeconds(1), QuicTime::Delta::FromSecond(3600 * +// QuicTime::Delta::FromSeconds(1), QuicTime::Delta::FromSeconds(3600 * // 24), 100, "Time spent in doing operation."); #define QUICHE_SERVER_HISTOGRAM_TIMES(name, sample, min, max, bucket_count, \ docstring) \ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_client_stats_impl.h b/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_client_stats_impl.h index fde75f78e0..484bdf743e 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_client_stats_impl.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_client_stats_impl.h @@ -5,40 +5,89 @@ #ifndef QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUICHE_CLIENT_STATS_IMPL_H_ #define QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUICHE_CLIENT_STATS_IMPL_H_ -#include +#include +#include + +#include + +#include "absl/strings/string_view.h" +#include "quiche/common/platform/api/quiche_export.h" namespace quiche { +// Force `name` to be a string constant by applying C-preprocessor +// concatenation. +#define QUICHE_REQUIRE_STRING_CONSTANT(name) "" name + +// The implementations in this file are no-ops at runtime, but force type +// checking of the arguments at compile-time so that the code will still compile +// when merged to Chromium. + // Use namespace qualifier in case the macro is used outside the quiche // namespace. #define QUICHE_CLIENT_HISTOGRAM_ENUM_IMPL(name, sample, enum_size, docstring) \ - do { \ - quiche::QuicheClientSparseHistogramImpl(name, static_cast(sample)); \ - } while (0) + quiche::QuicheClientHistogramEnumerationTypeChecker( \ + QUICHE_REQUIRE_STRING_CONSTANT(name), sample, enum_size) #define QUICHE_CLIENT_HISTOGRAM_BOOL_IMPL(name, sample, docstring) \ - do { \ - (void)sample; /* Workaround for -Wunused-variable. */ \ - } while (0) + quiche::QuicheClientHistogramBoolTypeChecker( \ + QUICHE_REQUIRE_STRING_CONSTANT(name), sample) #define QUICHE_CLIENT_HISTOGRAM_TIMES_IMPL(name, sample, min, max, \ num_buckets, docstring) \ - do { \ - (void)sample; /* Workaround for -Wunused-variable. */ \ - } while (0) + quiche::QuicheClientHistogramTimesTypeChecker( \ + QUICHE_REQUIRE_STRING_CONSTANT(name), sample, min, max, num_buckets) #define QUICHE_CLIENT_HISTOGRAM_COUNTS_IMPL(name, sample, min, max, \ num_buckets, docstring) \ - do { \ - quiche::QuicheClientSparseHistogramImpl(name, sample); \ - } while (0) + quiche::QuicheClientHistogramCountsTypeChecker( \ + QUICHE_REQUIRE_STRING_CONSTANT(name), sample, min, max, num_buckets) -inline void QuicheClientSparseHistogramImpl(const std::string& /*name*/, +// This object's constructor enforces the restriction that the argument must be +// a string constant. +struct QUICHE_NO_EXPORT QuicheRequireStringConstant { + template + consteval QuicheRequireStringConstant(const char (& /*name*/)[N]) {} +}; + +inline void QuicheClientSparseHistogramImpl(absl::string_view /*name*/, int /*sample*/) { // No-op. } +// Enforce type checks on enums so that errors can be caught before rolling to +// Chromium. +template +inline void QuicheClientHistogramEnumerationTypeChecker( + QuicheRequireStringConstant /*name*/, SampleType /*sample*/, + EnumSizeType /*enum_size*/) { + // These are equivalent to the type checks done by Chromium's + // UMA_HISTOGRAM_ENUMERATION macro. + static_assert(!std::is_enum_v || std::is_enum_v, + "Unexpected: |enum_size| is enum, but |sample| is not."); + static_assert( + !std::is_enum_v || std::is_same_v, + "|sample| and |boundary| shouldn't be of different enums"); +} + +inline void QuicheClientHistogramBoolTypeChecker( + QuicheRequireStringConstant /*name*/, bool /*sample*/) {} + +template +inline void QuicheClientHistogramTimesTypeChecker( + QuicheRequireStringConstant /*name*/, TimeDelta sample, TimeDelta /*min*/, + TimeDelta /*max*/, int /*num_buckets*/) { + static_assert( + std::is_convertible_v, + "The value passed to QUICHE_CLIENT_HISTOGRAM_TIMES must have a " + "ToMicroseconds() method that returns a value convertible to int64_t."); +} + +inline void QuicheClientHistogramCountsTypeChecker( + QuicheRequireStringConstant /*name*/, int32_t /*sample*/, int32_t /*min*/, + int32_t /*max*/, size_t /*num_buckets*/) {} + } // namespace quiche #endif // QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUICHE_CLIENT_STATS_IMPL_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_data_writer.h b/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_data_writer.h index 7af29b0c81..31b9210eb9 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_data_writer.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_data_writer.h @@ -89,18 +89,19 @@ class QUICHE_EXPORT QuicheDataWriter { // Write a 62-bit unsigned integer using RFC 9000 Variable Length Integer // encoding. Returns false if the value is out of range or if there is no room - // in the buffer. + // in the buffer. Requires that the endianness is NETWORK_BYTE_ORDER. bool WriteVarInt62(uint64_t value); // Same as WriteVarInt62(uint64_t), but forces an encoding size to write to. // This is not as optimized as WriteVarInt62(uint64_t). Returns false if the // value does not fit in the specified write_length or if there is no room in - // the buffer. + // the buffer. Requires that the endianness is NETWORK_BYTE_ORDER. bool WriteVarInt62WithForcedLength( uint64_t value, QuicheVariableLengthIntegerLength write_length); - // Writes a string piece as a consecutive length/content pair. The - // length uses RFC 9000 Variable Length Integer encoding. + // Writes a string piece as a consecutive length/content pair. The length uses + // RFC 9000 Variable Length Integer encoding. Requires that the endianness is + // NETWORK_BYTE_ORDER. bool WriteStringPieceVarInt62(const absl::string_view& string_piece); // Utility function to return the number of bytes needed to encode diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_endian.h b/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_endian.h index 2aaa478317..ee5999fb29 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_endian.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_endian.h @@ -6,6 +6,7 @@ #define QUICHE_COMMON_QUICHE_ENDIAN_H_ #include +#include #include #include @@ -68,6 +69,13 @@ enum QuicheVariableLengthIntegerLength : uint8_t { kQuicheDefaultLongHeaderLengthLength = VARIABLE_LENGTH_INTEGER_LENGTH_2, }; +constexpr std::array + kAllQuicheVariableLengthIntegerLengths = { + VARIABLE_LENGTH_INTEGER_LENGTH_0, VARIABLE_LENGTH_INTEGER_LENGTH_1, + VARIABLE_LENGTH_INTEGER_LENGTH_2, VARIABLE_LENGTH_INTEGER_LENGTH_4, + VARIABLE_LENGTH_INTEGER_LENGTH_8, +}; + } // namespace quiche #endif // QUICHE_COMMON_QUICHE_ENDIAN_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_feature_flags_list.h b/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_feature_flags_list.h index 17eed4a269..427f4730b6 100755 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_feature_flags_list.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_feature_flags_list.h @@ -9,20 +9,23 @@ #if defined(QUICHE_FLAG) QUICHE_FLAG(bool, quiche_reloadable_flag_enable_h3_origin_frame, false, true, "If true, enables support for parsing HTTP/3 ORIGIN frames.") -QUICHE_FLAG(bool, quiche_reloadable_flag_enable_tls_trust_anchor_ids, true, true, "When true, QUIC client and server will support TLS Trust Anchor IDs.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_act_upon_invalid_header, true, true, "If true, reject or send error response code upon receiving invalid request or response headers.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_add_stream_info_to_idle_close_detail, false, true, "If true, include stream information in idle timeout connection close detail.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_allow_client_enabled_2x_initial_cwnd, true, true, "Doubles the initial congestion window for QUIC connections when initiated by the client") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_allow_client_enabled_bbr_v2, true, true, "If true, allow client to enable BBRv2 on server via connection option 'B2ON'.") +QUICHE_FLAG(bool, quiche_reloadable_flag_quic_allow_flow_label_blackhole_avoidance_on_server, true, true, "Change the flow label on the server side and attempt repathing to avoid blackhole.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_bbr2_extra_acked_window, false, true, "When true, the BBR4 copt sets the extra_acked window to 20 RTTs and BBR5 sets it to 40 RTTs.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_bbr2_probe_two_rounds, true, true, "When true, the BB2U copt causes BBR2 to wait two rounds with out draining the queue before exiting PROBE_UP and BB2S has the same effect in STARTUP.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_bbr2_simplify_inflight_hi, true, true, "When true, the BBHI copt causes QUIC BBRv2 to use a simpler algorithm for raising inflight_hi in PROBE_UP.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_block_until_settings_received_copt, true, true, "If enabled and a BSUS connection is received, blocks server connections until SETTINGS frame is received.") +QUICHE_FLAG(bool, quiche_reloadable_flag_quic_client_check_blockage_before_on_can_write, false, false, "If true, quic clients will only call OnCanWrite() upon write events if the writer is unblocked.") +QUICHE_FLAG(bool, quiche_reloadable_flag_quic_client_default_enable_new_alps_codepoint, false, true, "If true, default-enable quic client to use new ALPS codepoint.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_conservative_bursts, false, false, "If true, set burst token to 2 in cwnd bootstrapping experiment.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_conservative_cwnd_and_pacing_gains, false, false, "If true, uses conservative cwnd gain and pacing gain when cwnd gets bootstrapped.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_default_enable_5rto_blackhole_detection2, true, true, "If true, default-enable 5RTO blachole detection.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_default_to_bbr, true, false, "When true, defaults to BBR congestion control instead of Cubic.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_default_to_bbr_v2, false, false, "If true, use BBRv2 as the default congestion controller. Takes precedence over --quic_default_to_bbr.") +QUICHE_FLAG(bool, quiche_reloadable_flag_quic_delay_connection_close_on_invalid_sni, false, false, "Delay closing the connection on invalid SNI in client hello till after the transport parameters are parsed.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_deliver_stop_sending_to_zombie_streams, true, true, "If true, deliver STOP_SENDING to zombie streams.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_disable_batch_write, false, false, "If true, round-robin stream writes instead of batching in QuicWriteBlockedList.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_disable_server_blackhole_detection, false, false, "If true, disable blackhole detection on server side.") @@ -30,16 +33,19 @@ QUICHE_FLAG(bool, quiche_reloadable_flag_quic_disable_version_draft_29, false, f QUICHE_FLAG(bool, quiche_reloadable_flag_quic_disable_version_q046, false, true, "If true, disable QUIC version Q046.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_disable_version_rfcv1, false, false, "If true, disable QUIC version h3 (RFCv1).") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_discard_initial_packet_with_key_dropped, false, true, "If true, discard INITIAL packet if the key has been dropped.") +QUICHE_FLAG(bool, quiche_reloadable_flag_quic_disconnect_early_exit, false, false, "If true, does not update ack state if the connection has been closed.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_enable_disable_resumption, true, true, "If true, disable resumption when receiving NRES connection option.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_enable_mtu_discovery_at_server, false, false, "If true, QUIC will default enable MTU discovery at server, with a target of 1450 bytes.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_enable_server_on_wire_ping, true, true, "If true, enable server retransmittable on wire PING.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_enable_version_rfcv2, false, false, "When true, support RFC9369.") -QUICHE_FLAG(bool, quiche_reloadable_flag_quic_enobufs_blocked, false, false, "If true, ENOBUFS socket errors are reported as socket blocked instead of socket failure.") +QUICHE_FLAG(bool, quiche_reloadable_flag_quic_enobufs_blocked, true, true, "If true, ENOBUFS socket errors are reported as socket blocked instead of socket failure.") +QUICHE_FLAG(bool, quiche_reloadable_flag_quic_fail_on_empty_ack, true, true, "If true, closes the connection if there are no packets in the ack frame. This is always the result of a protocol violation by the peer.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_fin_before_completed_http_headers, false, true, "If true, close the connection with error if FIN is received before finish receiving the whole HTTP headers.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_fix_timeouts, true, true, "If true, postpone setting handshake timeout to infinite to handshake complete.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_ignore_gquic_probing, true, true, "If true, QUIC server will not respond to gQUIC probing packet(PING + PADDING) but treat it as a regular packet.") -QUICHE_FLAG(bool, quiche_reloadable_flag_quic_least_unacked_plus_1, false, false, "If true, sets peer_least_packet_awaiting_ack to one more than the highest confirmed acknowledgment to fix an off-by-one error.") +QUICHE_FLAG(bool, quiche_reloadable_flag_quic_least_unacked_plus_1, true, true, "If true, sets peer_least_packet_awaiting_ack to one more than the highest confirmed acknowledgment to fix an off-by-one error.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_limit_new_streams_per_loop_2, true, true, "If true, when the peer sends connection options \\\'SLP1\\\', \\\'SLP2\\\' and \\\'SLPF\\\', internet facing GFEs will only allow a limited number of new requests to be processed per event loop, and postpone the rest to the following event loops. Also guard QuicConnection to iterate through all decrypters at each encryption level to get cipher id for a request.") +QUICHE_FLAG(bool, quiche_reloadable_flag_quic_neuter_packets_on_migration, false, false, "If ture, QuicSentPacketManager::OnConnectionMigration will call old_send_algorithm->OnPacketNeutered on all inflight packets.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_no_path_degrading_before_handshake_confirmed, true, true, "If true, an endpoint does not detect path degrading or blackholing until handshake gets confirmed.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_no_write_control_frame_upon_connection_close, false, true, "If trrue, early return before write control frame in OnCanWrite() if the connection is already closed.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_no_write_control_frame_upon_connection_close2, false, true, "If true, QuicSession will block outgoing control frames when the connection is closed.") @@ -55,7 +61,7 @@ QUICHE_FLAG(bool, quiche_reloadable_flag_quic_require_handshake_confirmation, tr QUICHE_FLAG(bool, quiche_reloadable_flag_quic_test_peer_addr_change_after_normalize, false, false, "If true, QuicConnection::ProcessValidatedPacket will use normalized address to test peer address changes.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_testonly_default_false, false, false, "A testonly reloadable flag that will always default to false.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_testonly_default_true, true, true, "A testonly reloadable flag that will always default to true.") -QUICHE_FLAG(bool, quiche_reloadable_flag_quic_use_inlining_send_buffer2, false, false, "Uses an inlining version of QuicSendStreamBuffer.") +QUICHE_FLAG(bool, quiche_reloadable_flag_quic_use_inlining_send_buffer2, true, true, "Uses an inlining version of QuicSendStreamBuffer.") QUICHE_FLAG(bool, quiche_reloadable_flag_quic_use_received_client_addresses_cache, true, true, "If true, use a LRU cache to record client addresses of packets received on server's original address.") QUICHE_FLAG(bool, quiche_restart_flag_quic_support_release_time_for_gso, false, false, "If true, QuicGsoBatchWriter will support release time if it is available and the process has the permission to do so.") QUICHE_FLAG(bool, quiche_restart_flag_quic_testonly_default_false, false, false, "A testonly restart flag that will always default to false.") diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_weak_ptr.h b/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_weak_ptr.h index c3005f08c9..128ee7fa06 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_weak_ptr.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/common/quiche_weak_ptr.h @@ -44,7 +44,8 @@ template class QuicheWeakPtrFactory; // QuicheWeakPtr contains a pointer to an object that may or may not be alive, -// or nullptr. +// or nullptr. Two non-null weak pointers are equal if both of them were +// originally created from the same factory object, even if that object is gone. template class QUICHE_NO_EXPORT QuicheWeakPtr final { public: @@ -62,6 +63,16 @@ class QUICHE_NO_EXPORT QuicheWeakPtr final { return control_block_ != nullptr ? control_block_->IsValid() : false; } + // Two weak pointers are equal if they point to the same control block. + bool operator==(const QuicheWeakPtr&) const = default; + bool operator!=(const QuicheWeakPtr&) const = default; + + // Hashing matches the operator== semantics. + template + friend H AbslHashValue(H h, const QuicheWeakPtr& ptr) { + return H::combine(std::move(h), ptr.control_block_.get()); + } + private: friend class QuicheWeakPtrFactory; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.cc index 321eca6a53..aafafa5b3b 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.cc @@ -31,41 +31,41 @@ std::unique_ptr OgHttp2Adapter::Create( OgHttp2Adapter::~OgHttp2Adapter() {} bool OgHttp2Adapter::IsServerSession() const { - return session_->IsServerSession(); + return session_.IsServerSession(); } int64_t OgHttp2Adapter::ProcessBytes(absl::string_view bytes) { - return session_->ProcessBytes(bytes); + return session_.ProcessBytes(bytes); } void OgHttp2Adapter::SubmitSettings(absl::Span settings) { - session_->SubmitSettings(settings); + session_.SubmitSettings(settings); } void OgHttp2Adapter::SubmitPriorityForStream(Http2StreamId stream_id, Http2StreamId parent_stream_id, int weight, bool exclusive) { - session_->EnqueueFrame(std::make_unique( + session_.EnqueueFrame(std::make_unique( stream_id, parent_stream_id, weight, exclusive)); } void OgHttp2Adapter::SubmitPing(Http2PingId ping_id) { - session_->EnqueueFrame(std::make_unique(ping_id)); + session_.EnqueueFrame(std::make_unique(ping_id)); } void OgHttp2Adapter::SubmitShutdownNotice() { - session_->StartGracefulShutdown(); + session_.StartGracefulShutdown(); } void OgHttp2Adapter::SubmitGoAway(Http2StreamId last_accepted_stream_id, Http2ErrorCode error_code, absl::string_view opaque_data) { - session_->SubmitGoAway(last_accepted_stream_id, error_code, opaque_data); + session_.SubmitGoAway(last_accepted_stream_id, error_code, opaque_data); } void OgHttp2Adapter::SubmitWindowUpdate(Http2StreamId stream_id, int window_increment) { - session_->EnqueueFrame( + session_.EnqueueFrame( std::make_unique(stream_id, window_increment)); } @@ -74,7 +74,7 @@ void OgHttp2Adapter::SubmitMetadata(Http2StreamId stream_id, std::unique_ptr source) { // Not necessary to pass max_frame_size along, since OgHttp2Session tracks the // peer's advertised max frame size. - session_->SubmitMetadata(stream_id, std::move(source)); + session_.SubmitMetadata(stream_id, std::move(source)); } void OgHttp2Adapter::SubmitMetadata(Http2StreamId stream_id, @@ -83,94 +83,93 @@ void OgHttp2Adapter::SubmitMetadata(Http2StreamId stream_id, // peer's advertised max frame size. Not necessary to pass the number of // frames along, since OgHttp2Session will invoke the visitor method until it // is done packing the payload. - session_->SubmitMetadata(stream_id); + session_.SubmitMetadata(stream_id); } -int OgHttp2Adapter::Send() { return session_->Send(); } +int OgHttp2Adapter::Send() { return session_.Send(); } int OgHttp2Adapter::GetSendWindowSize() const { - return session_->GetRemoteWindowSize(); + return session_.GetRemoteWindowSize(); } int OgHttp2Adapter::GetStreamSendWindowSize(Http2StreamId stream_id) const { - return session_->GetStreamSendWindowSize(stream_id); + return session_.GetStreamSendWindowSize(stream_id); } int OgHttp2Adapter::GetStreamReceiveWindowLimit(Http2StreamId stream_id) const { - return session_->GetStreamReceiveWindowLimit(stream_id); + return session_.GetStreamReceiveWindowLimit(stream_id); } int OgHttp2Adapter::GetStreamReceiveWindowSize(Http2StreamId stream_id) const { - return session_->GetStreamReceiveWindowSize(stream_id); + return session_.GetStreamReceiveWindowSize(stream_id); } int OgHttp2Adapter::GetReceiveWindowSize() const { - return session_->GetReceiveWindowSize(); + return session_.GetReceiveWindowSize(); } int OgHttp2Adapter::GetHpackEncoderDynamicTableSize() const { - return session_->GetHpackEncoderDynamicTableSize(); + return session_.GetHpackEncoderDynamicTableSize(); } int OgHttp2Adapter::GetHpackEncoderDynamicTableCapacity() const { - return session_->GetHpackEncoderDynamicTableCapacity(); + return session_.GetHpackEncoderDynamicTableCapacity(); } int OgHttp2Adapter::GetHpackDecoderDynamicTableSize() const { - return session_->GetHpackDecoderDynamicTableSize(); + return session_.GetHpackDecoderDynamicTableSize(); } int OgHttp2Adapter::GetHpackDecoderSizeLimit() const { - return session_->GetHpackDecoderSizeLimit(); + return session_.GetHpackDecoderSizeLimit(); } Http2StreamId OgHttp2Adapter::GetHighestReceivedStreamId() const { - return session_->GetHighestReceivedStreamId(); + return session_.GetHighestReceivedStreamId(); } void OgHttp2Adapter::MarkDataConsumedForStream(Http2StreamId stream_id, size_t num_bytes) { - session_->Consume(stream_id, num_bytes); + session_.Consume(stream_id, num_bytes); } void OgHttp2Adapter::SubmitRst(Http2StreamId stream_id, Http2ErrorCode error_code) { - session_->EnqueueFrame(std::make_unique( + session_.EnqueueFrame(std::make_unique( stream_id, TranslateErrorCode(error_code))); } int32_t OgHttp2Adapter::SubmitRequest(absl::Span headers, bool end_stream, void* user_data) { - return session_->SubmitRequest(headers, end_stream, user_data); + return session_.SubmitRequest(headers, end_stream, user_data); } int OgHttp2Adapter::SubmitResponse(Http2StreamId stream_id, absl::Span headers, bool end_stream) { - return session_->SubmitResponse(stream_id, headers, end_stream); + return session_.SubmitResponse(stream_id, headers, end_stream); } int OgHttp2Adapter::SubmitTrailer(Http2StreamId stream_id, absl::Span trailers) { - return session_->SubmitTrailer(stream_id, trailers); + return session_.SubmitTrailer(stream_id, trailers); } void OgHttp2Adapter::SetStreamUserData(Http2StreamId stream_id, void* user_data) { - session_->SetStreamUserData(stream_id, user_data); + session_.SetStreamUserData(stream_id, user_data); } void* OgHttp2Adapter::GetStreamUserData(Http2StreamId stream_id) { - return session_->GetStreamUserData(stream_id); + return session_.GetStreamUserData(stream_id); } bool OgHttp2Adapter::ResumeStream(Http2StreamId stream_id) { - return session_->ResumeStream(stream_id); + return session_.ResumeStream(stream_id); } OgHttp2Adapter::OgHttp2Adapter(Http2VisitorInterface& visitor, Options options) - : Http2Adapter(visitor), - session_(std::make_unique(visitor, std::move(options))) {} + : Http2Adapter(visitor), session_(visitor, std::move(options)) {} } // namespace adapter } // namespace http2 diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.h b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.h index 2af239f5df..6671b47c72 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.h @@ -22,8 +22,8 @@ class QUICHE_EXPORT OgHttp2Adapter : public Http2Adapter { // From Http2Adapter. bool IsServerSession() const override; - bool want_read() const override { return session_->want_read(); } - bool want_write() const override { return session_->want_write(); } + bool want_read() const override { return session_.want_read(); } + bool want_write() const override { return session_.want_write(); } int64_t ProcessBytes(absl::string_view bytes) override; void SubmitSettings(absl::Span settings) override; void SubmitPriorityForStream(Http2StreamId stream_id, @@ -72,7 +72,7 @@ class QUICHE_EXPORT OgHttp2Adapter : public Http2Adapter { private: OgHttp2Adapter(Http2VisitorInterface& visitor, Options options); - std::unique_ptr session_; + OgHttp2Session session_; }; } // namespace adapter diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc index f757a2ca90..7266ef233e 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc @@ -875,7 +875,7 @@ OgHttp2Session::SendResult OgHttp2Session::WriteForStream( spdy::SpdySerializedFrame header = spdy::SpdyFramer::SerializeDataFrameHeaderWithPaddingLengthField( data); - QUICHE_DCHECK(buffered_data_.Empty() && frames_.empty()); + QUICHE_DCHECK(buffered_data_.Empty()); data.Visit(&send_logger_); const bool success = SendDataFrame(stream_id, absl::string_view(header), info.payload_length, state); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder.cc index 41edf54248..701e315538 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_entry_decoder.cc @@ -65,6 +65,14 @@ DecodeStatus HpackEntryDecoder::Start(DecodeBuffer* db, DecodeStatus status = entry_type_decoder_.Start(db); switch (status) { case DecodeStatus::kDecodeDone: + if (entry_type_decoder_.varint() > std::numeric_limits::max()) { + QUICHE_VLOG(2) + << "Invalid varint for index: " << entry_type_decoder_.varint() + << ". The index should be representable using 4 bytes as the max " + "table size is negotiated using a 4 bytes SETTING"; + error_ = HpackDecodingError::kIndexVarintError; + return DecodeStatus::kDecodeError; + } // The type of the entry and its varint fit into the current decode // buffer. if (entry_type_decoder_.entry_type() == HpackEntryType::kIndexedHeader) { @@ -120,6 +128,15 @@ DecodeStatus HpackEntryDecoder::Resume(DecodeBuffer* db, // entry_type_decoder_ returned kDecodeDone, now need to decide how // to proceed. QUICHE_DVLOG(1) << "kDecodedType: db->Remaining=" << db->Remaining(); + if (entry_type_decoder_.varint() > + std::numeric_limits::max()) { + error_ = HpackDecodingError::kIndexVarintError; + QUICHE_VLOG(2) + << "Invalid varint for index: " << entry_type_decoder_.varint() + << ". The index should be representable using 4 bytes as the max " + "table size is negotiated using a 4 bytes SETTING"; + return DecodeStatus::kDecodeError; + } if (DispatchOnType(listener)) { // All done. return DecodeStatus::kDecodeDone; @@ -223,6 +240,7 @@ DecodeStatus HpackEntryDecoder::Resume(DecodeBuffer* db, bool HpackEntryDecoder::DispatchOnType(HpackEntryDecoderListener* listener) { const HpackEntryType entry_type = entry_type_decoder_.entry_type(); const uint32_t varint = static_cast(entry_type_decoder_.varint()); + QUICHE_DCHECK(varint == entry_type_decoder_.varint()); switch (entry_type) { case HpackEntryType::kIndexedHeader: // The entry consists solely of the entry type and varint. See: diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder.h b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder.h index 897ce761a2..210d3c91f2 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/decoder/hpack_string_decoder.h @@ -20,6 +20,7 @@ #include "quiche/http2/decoder/decode_status.h" #include "quiche/http2/hpack/varint/hpack_varint_decoder.h" #include "quiche/common/platform/api/quiche_export.h" +#include "quiche/common/platform/api/quiche_flags.h" #include "quiche/common/platform/api/quiche_logging.h" namespace http2 { @@ -135,8 +136,7 @@ class QUICHE_EXPORT HpackStringDecoder { huffman_encoded_ = (h_and_prefix & 0x80) == 0x80; *status = length_decoder_.Start(h_and_prefix, 7, db); if (*status == DecodeStatus::kDecodeDone) { - OnStringStart(cb, status); - return true; + return OnStringStart(cb, status); } // Set the state to cover the DecodeStatus::kDecodeInProgress case. // Won't be needed if the status is kDecodeError. @@ -156,8 +156,7 @@ class QUICHE_EXPORT HpackStringDecoder { *status = length_decoder_.Resume(db); if (*status == DecodeStatus::kDecodeDone) { state_ = kDecodingString; - OnStringStart(cb, status); - return true; + return OnStringStart(cb, status); } return false; } @@ -165,11 +164,19 @@ class QUICHE_EXPORT HpackStringDecoder { // Returns true if the listener wants the decoding to continue, and // false otherwise, in which case status set. template - void OnStringStart(Listener* cb, DecodeStatus* /*status*/) { - // TODO(vasilvv): fail explicitly in case of truncation. + bool OnStringStart(Listener* cb, DecodeStatus* status) { + if (length_decoder_.value() > std::numeric_limits::max()) { + // Upper layer decoder is even more strict about the string length. But + // for simplicity, and to avoid the possibility of integer overflow on + // 32-bit platforms, strings with lengths greater than 2^32 are rejected. + *status = DecodeStatus::kDecodeError; + return false; + } remaining_ = static_cast(length_decoder_.value()); + QUICHE_DCHECK_EQ(remaining_, length_decoder_.value()); // Make callback so consumer knows what is coming. cb->OnStringStart(huffman_encoded_, remaining_); + return true; } // Passes the available portion of the string to the listener, and signals diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/hpack_encoder.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/hpack_encoder.cc index 643784b83d..e9707a7b15 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/hpack_encoder.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/hpack_encoder.cc @@ -45,7 +45,7 @@ class HpackEncoder::RepresentationIterator { return pseudo_begin_ != pseudo_end_ || regular_begin_ != regular_end_; } - const Representation Next() { + Representation Next() { if (pseudo_begin_ != pseudo_end_) { return *pseudo_begin_++; } else { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/hpack_header_table.h b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/hpack_header_table.h index b6c23859db..24aeaa3903 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/hpack_header_table.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/hpack/hpack_header_table.h @@ -71,7 +71,8 @@ class QUICHE_EXPORT HpackHeaderTable { size_t GetByNameAndValue(absl::string_view name, absl::string_view value); // Sets the maximum size of the header table, evicting entries if - // necessary as described in 5.2. + // necessary as described in 5.2. The value of `max_size` must not exceed + // `settings_size_bound()`. void SetMaxSize(size_t max_size); // Sets the SETTINGS_HEADER_TABLE_SIZE bound of the table. Will call diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/test_tools/hpack_entry_collector.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/test_tools/hpack_entry_collector.cc index 3a3d1b5d73..850719593b 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/test_tools/hpack_entry_collector.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/test_tools/hpack_entry_collector.cc @@ -152,11 +152,11 @@ bool HpackEntryCollector::LiteralValueExpected() const { } } AssertionResult HpackEntryCollector::ValidateIndexedHeader( - size_t expected_index) const { + uint64_t expected_index) const { HTTP2_VERIFY_TRUE(started_); HTTP2_VERIFY_TRUE(ended_); HTTP2_VERIFY_EQ(HpackEntryType::kIndexedHeader, header_type_); - HTTP2_VERIFY_EQ(expected_index, index_); + HTTP2_VERIFY_EQ(expected_index, static_cast(index_)); return ::testing::AssertionSuccess(); } AssertionResult HpackEntryCollector::ValidateLiteralValueHeader( diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/test_tools/hpack_entry_collector.h b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/test_tools/hpack_entry_collector.h index 93ad860453..35db7aee6d 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/test_tools/hpack_entry_collector.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/test_tools/hpack_entry_collector.h @@ -73,7 +73,8 @@ class QUICHE_NO_EXPORT HpackEntryCollector : public HpackEntryDecoderListener { // Returns success if collected an Indexed Header (i.e. OnIndexedHeader was // called). - ::testing::AssertionResult ValidateIndexedHeader(size_t expected_index) const; + ::testing::AssertionResult ValidateIndexedHeader( + uint64_t expected_index) const; // Returns success if collected a Header with an indexed name and literal // value (i.e. OnStartLiteralHeader was called with a non-zero index for diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/test_tools/random_decoder_test_base.h b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/test_tools/random_decoder_test_base.h index bdd0273084..b0739b6dfc 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/http2/test_tools/random_decoder_test_base.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/http2/test_tools/random_decoder_test_base.h @@ -235,6 +235,24 @@ class QUICHE_NO_EXPORT RandomDecoderTest : public quiche::test::QuicheTest { return ValidateDoneAndOffset(offset, NoArgValidator()); } + static Validator ValidateError() { + return [](const DecodeBuffer& /*input*/, + DecodeStatus status) -> AssertionResult { + HTTP2_VERIFY_EQ(status, DecodeStatus::kDecodeError); + return ::testing::AssertionSuccess(); + }; + } + + static Validator ValidateInProgressAndOffset(uint32_t offset) { + return [offset](const DecodeBuffer& input, + DecodeStatus status) -> AssertionResult { + HTTP2_VERIFY_EQ(status, DecodeStatus::kDecodeInProgress); + HTTP2_VERIFY_EQ(offset, input.Offset()) + << "\nRemaining=" << input.Remaining(); + return ::testing::AssertionSuccess(); + }; + } + // Expose |random_| as Http2Random so callers don't have to care about which // sub-class of Http2Random is used, nor can they rely on the specific // sub-class that RandomDecoderTest uses. diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_request.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_request.cc index 6a8536b04f..562833f0c6 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_request.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_request.cc @@ -11,12 +11,16 @@ #include "absl/memory/memory.h" #include "absl/status/status.h" #include "absl/status/statusor.h" +#include "absl/strings/escaping.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "openssl/hpke.h" #include "quiche/common/platform/api/quiche_bug_tracker.h" #include "quiche/common/platform/api/quiche_logging.h" #include "quiche/common/quiche_crypto_logging.h" +#include "quiche/common/quiche_data_reader.h" +#include "quiche/oblivious_http/common/oblivious_http_definitions.h" +#include "quiche/oblivious_http/common/oblivious_http_header_key_config.h" namespace quiche { // Ctor. @@ -42,39 +46,12 @@ ObliviousHttpRequest::CreateServerObliviousRequest( absl::string_view encrypted_data, const EVP_HPKE_KEY& gateway_key, const ObliviousHttpHeaderKeyConfig& ohttp_key_config, absl::string_view request_label) { - if (EVP_HPKE_KEY_kem(&gateway_key) == nullptr) { - return absl::InvalidArgumentError( - "Invalid input param. Failed to import gateway_key."); - } - bssl::UniquePtr gateway_ctx(EVP_HPKE_CTX_new()); - if (gateway_ctx == nullptr) { - return SslErrorAsStatus("Failed to initialize Gateway/Server's Context."); - } - QuicheDataReader reader(encrypted_data); - - auto is_hdr_ok = ohttp_key_config.ParseOhttpPayloadHeader(reader); - if (!is_hdr_ok.ok()) { - return is_hdr_ok; - } - - size_t enc_key_len = EVP_HPKE_KEM_enc_len(EVP_HPKE_KEY_kem(&gateway_key)); - - absl::string_view enc_key_received; - if (!reader.ReadStringPiece(&enc_key_received, enc_key_len)) { - return absl::FailedPreconditionError(absl::StrCat( - "Failed to extract encapsulation key of expected len=", enc_key_len, - "from payload.")); - } - std::string info = - ohttp_key_config.SerializeRecipientContextInfo(request_label); - if (!EVP_HPKE_CTX_setup_recipient( - gateway_ctx.get(), &gateway_key, ohttp_key_config.GetHpkeKdf(), - ohttp_key_config.GetHpkeAead(), - reinterpret_cast(enc_key_received.data()), - enc_key_received.size(), - reinterpret_cast(info.data()), info.size())) { - return SslErrorAsStatus("Failed to setup recipient context"); + absl::StatusOr gateway_context = + ObliviousHttpRequest::DecodeEncapsulatedRequestHeader( + reader, gateway_key, ohttp_key_config, request_label); + if (!gateway_context.ok()) { + return gateway_context.status(); } absl::string_view ciphertext_received = reader.ReadRemainingPayload(); @@ -82,8 +59,9 @@ ObliviousHttpRequest::CreateServerObliviousRequest( std::string decrypted(ciphertext_received.size(), '\0'); size_t decrypted_len; if (!EVP_HPKE_CTX_open( - gateway_ctx.get(), reinterpret_cast(decrypted.data()), - &decrypted_len, decrypted.size(), + gateway_context->hpke_context_.get(), + reinterpret_cast(decrypted.data()), &decrypted_len, + decrypted.size(), reinterpret_cast(ciphertext_received.data()), ciphertext_received.size(), nullptr, 0)) { return SslErrorAsStatus("Failed to decrypt.", @@ -91,7 +69,8 @@ ObliviousHttpRequest::CreateServerObliviousRequest( } decrypted.resize(decrypted_len); return ObliviousHttpRequest( - std::move(gateway_ctx), std::string(enc_key_received), ohttp_key_config, + std::move(gateway_context->hpke_context_), + std::string(gateway_context->encapsulated_key_), ohttp_key_config, std::string(ciphertext_received), std::move(decrypted)); } @@ -211,4 +190,70 @@ absl::string_view ObliviousHttpRequest::GetPlaintextData() const { return request_plaintext_; } +absl::StatusOr +ObliviousHttpRequest::DecodeEncapsulatedRequestHeader( + QuicheDataReader& reader, const EVP_HPKE_KEY& gateway_key, + const ObliviousHttpHeaderKeyConfig& ohttp_key_config, + absl::string_view request_label) { + if (EVP_HPKE_KEY_kem(&gateway_key) == nullptr) { + return absl::InvalidArgumentError( + "Invalid input param. Failed to import gateway_key."); + } + bssl::UniquePtr gateway_ctx(EVP_HPKE_CTX_new()); + if (gateway_ctx == nullptr) { + return SslErrorAsStatus("Failed to initialize Gateway/Server's Context."); + } + + auto is_hdr_ok = ohttp_key_config.ParseOhttpPayloadHeader(reader); + if (!is_hdr_ok.ok()) { + return is_hdr_ok; + } + + size_t enc_key_len = EVP_HPKE_KEM_enc_len(EVP_HPKE_KEY_kem(&gateway_key)); + + absl::string_view enc_key_received; + if (!reader.ReadStringPiece(&enc_key_received, enc_key_len)) { + return absl::FailedPreconditionError(absl::StrCat( + "Failed to extract encapsulation key of expected len=", enc_key_len, + "from payload.")); + } + std::string info = + ohttp_key_config.SerializeRecipientContextInfo(request_label); + if (!EVP_HPKE_CTX_setup_recipient( + gateway_ctx.get(), &gateway_key, ohttp_key_config.GetHpkeKdf(), + ohttp_key_config.GetHpkeAead(), + reinterpret_cast(enc_key_received.data()), + enc_key_received.size(), + reinterpret_cast(info.data()), info.size())) { + return SslErrorAsStatus("Failed to setup recipient context"); + } + + return Context(std::move(gateway_ctx), std::string(enc_key_received)); +} + +absl::StatusOr ObliviousHttpRequest::DecryptChunk( + Context& context, absl::string_view encrypted_chunk, bool is_final_chunk) { + uint8_t* ad = nullptr; + size_t ad_len = 0; + std::string final_ad_bytes; + if (is_final_chunk) { + ad = const_cast(kFinalAdBytes); + ad_len = sizeof(kFinalAdBytes); + } + + std::string decrypted(encrypted_chunk.size(), '\0'); + size_t decrypted_len; + if (!EVP_HPKE_CTX_open( + context.hpke_context_.get(), + reinterpret_cast(decrypted.data()), &decrypted_len, + decrypted.size(), + reinterpret_cast(encrypted_chunk.data()), + encrypted_chunk.size(), ad, ad_len)) { + return SslErrorAsStatus("Failed to decrypt.", + absl::StatusCode::kInvalidArgument); + } + decrypted.resize(decrypted_len); + return decrypted; +} + } // namespace quiche diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_request.h b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_request.h index d65c00d04d..3293e4add8 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_request.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_request.h @@ -1,13 +1,15 @@ #ifndef QUICHE_OBLIVIOUS_HTTP_BUFFERS_OBLIVIOUS_HTTP_REQUEST_H_ #define QUICHE_OBLIVIOUS_HTTP_BUFFERS_OBLIVIOUS_HTTP_REQUEST_H_ -#include #include #include +#include #include "absl/status/statusor.h" #include "absl/strings/string_view.h" #include "openssl/hpke.h" +#include "quiche/common/platform/api/quiche_export.h" +#include "quiche/common/quiche_data_reader.h" #include "quiche/oblivious_http/common/oblivious_http_header_key_config.h" namespace quiche { @@ -103,6 +105,17 @@ class QUICHE_EXPORT ObliviousHttpRequest { return std::move(oblivious_http_request_context_.value()); } + // Reads the OHTTP request header from the given `reader`. + // On success, attempts to setup and return the Gateway Context. + static absl::StatusOr DecodeEncapsulatedRequestHeader( + QuicheDataReader& reader, const EVP_HPKE_KEY& gateway_key, + const ObliviousHttpHeaderKeyConfig& ohttp_key_config, + absl::string_view request_label); + + // Decrypts an encrypted chunk. + static absl::StatusOr DecryptChunk( + Context& context, absl::string_view encrypted_chunk, bool is_final_chunk); + private: explicit ObliviousHttpRequest( bssl::UniquePtr hpke_context, std::string encapsulated_key, diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_response.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_response.cc index fbf7052972..321415bfe5 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_response.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_response.cc @@ -18,6 +18,8 @@ #include "quiche/common/platform/api/quiche_bug_tracker.h" #include "quiche/common/quiche_crypto_logging.h" #include "quiche/common/quiche_random.h" +#include "quiche/oblivious_http/buffers/oblivious_http_request.h" +#include "quiche/oblivious_http/common/oblivious_http_definitions.h" #include "quiche/oblivious_http/common/oblivious_http_header_key_config.h" namespace quiche { @@ -49,19 +51,6 @@ ObliviousHttpResponse::CreateClientObliviousResponse( std::string encrypted_data, ObliviousHttpRequest::Context& oblivious_http_request_context, absl::string_view resp_label) { - if (oblivious_http_request_context.hpke_context_ == nullptr) { - return absl::FailedPreconditionError( - "HPKE context wasn't initialized before proceeding with this Response " - "Decapsulation on Client-side."); - } - size_t expected_key_len = EVP_HPKE_KEM_enc_len( - EVP_HPKE_CTX_kem(oblivious_http_request_context.hpke_context_.get())); - if (oblivious_http_request_context.encapsulated_key_.size() != - expected_key_len) { - return absl::InvalidArgumentError(absl::StrCat( - "Invalid len for encapsulated_key arg. Expected:", expected_key_len, - " Actual:", oblivious_http_request_context.encapsulated_key_.size())); - } if (encrypted_data.empty()) { return absl::InvalidArgumentError("Empty encrypted_data input param."); } @@ -132,19 +121,6 @@ ObliviousHttpResponse::CreateServerObliviousResponse( std::string plaintext_payload, ObliviousHttpRequest::Context& oblivious_http_request_context, absl::string_view response_label, QuicheRandom* quiche_random) { - if (oblivious_http_request_context.hpke_context_ == nullptr) { - return absl::FailedPreconditionError( - "HPKE context wasn't initialized before proceeding with this Response " - "Encapsulation on Server-side."); - } - size_t expected_key_len = EVP_HPKE_KEM_enc_len( - EVP_HPKE_CTX_kem(oblivious_http_request_context.hpke_context_.get())); - if (oblivious_http_request_context.encapsulated_key_.size() != - expected_key_len) { - return absl::InvalidArgumentError(absl::StrCat( - "Invalid len for encapsulated_key arg. Expected:", expected_key_len, - " Actual:", oblivious_http_request_context.encapsulated_key_.size())); - } if (plaintext_payload.empty()) { return absl::InvalidArgumentError("Empty plaintext_payload input param."); } @@ -220,6 +196,19 @@ const std::string& ObliviousHttpResponse::GetPlaintextData() const { absl::StatusOr ObliviousHttpResponse::GetCommonAeadParams( ObliviousHttpRequest::Context& oblivious_http_request_context) { + if (oblivious_http_request_context.hpke_context_ == nullptr) { + return absl::FailedPreconditionError( + "HPKE context wasn't initialized before proceeding with this Response"); + } + size_t expected_key_len = EVP_HPKE_KEM_enc_len( + EVP_HPKE_CTX_kem(oblivious_http_request_context.hpke_context_.get())); + if (oblivious_http_request_context.encapsulated_key_.size() != + expected_key_len) { + return absl::InvalidArgumentError(absl::StrCat( + "Invalid len for encapsulated_key arg. Expected:", expected_key_len, + " Actual:", oblivious_http_request_context.encapsulated_key_.size())); + } + const EVP_AEAD* evp_hpke_aead = EVP_HPKE_AEAD_aead( EVP_HPKE_CTX_aead(oblivious_http_request_context.hpke_context_.get())); if (evp_hpke_aead == nullptr) { @@ -348,4 +337,106 @@ ObliviousHttpResponse::CommonOperationsToEncapDecap( return result; } +absl::StatusOr +ObliviousHttpResponse::GetAeadContextData( + ObliviousHttpRequest::Context& oblivious_http_request_context, + CommonAeadParamsResult& aead_params, absl::string_view response_label, + absl::string_view response_nonce) { + // Steps (1, 3 to 5) + AEAD context SetUp before 6th step is performed in + // CommonOperations. + // https://www.rfc-editor.org/rfc/rfc9458.html#section-4.4-3 + auto common_ops_st = CommonOperationsToEncapDecap( + response_nonce, oblivious_http_request_context, response_label, + aead_params.aead_key_len, aead_params.aead_nonce_len, + aead_params.secret_len); + if (!common_ops_st.ok()) { + return common_ops_st.status(); + } + return AeadContextData{std::move(common_ops_st.value().aead_ctx), + std::move(common_ops_st.value().aead_nonce)}; +} + +// Encrypts the chunk following +// https://www.ietf.org/archive/id/draft-ietf-ohai-chunked-ohttp-05.html#section-6.1 +// The plaintext payload can only be empty if this is the final chunk. The chunk +// nonce cannot be empty. If the operation succeeds then the returned encrypted +// data is guaranteed to be non-empty. +absl::StatusOr ObliviousHttpResponse::EncryptChunk( + ObliviousHttpRequest::Context& oblivious_http_request_context, + const AeadContextData& aead_context_data, + absl::string_view plaintext_payload, absl::string_view chunk_nonce, + bool is_final_chunk) { + // Empty plaintext_payload is only allowed for the final chunk. + if (!is_final_chunk && plaintext_payload.empty()) { + return absl::InvalidArgumentError( + "Payload cannot be empty for non-final chunks."); + } + if (chunk_nonce.empty()) { + return absl::InvalidArgumentError("Chunk nonce cannot be empty."); + } + + uint8_t* ad = nullptr; + size_t ad_len = 0; + if (is_final_chunk) { + ad = const_cast(kFinalAdBytes); + ad_len = sizeof(kFinalAdBytes); + } + + const size_t max_encrypted_data_size = + plaintext_payload.size() + + EVP_AEAD_max_overhead(EVP_HPKE_AEAD_aead(EVP_HPKE_CTX_aead( + oblivious_http_request_context.hpke_context_.get()))); + std::string encrypted_data(max_encrypted_data_size, '\0'); + size_t ciphertext_len; + + if (!EVP_AEAD_CTX_seal( + aead_context_data.aead_ctx.get(), + reinterpret_cast(encrypted_data.data()), &ciphertext_len, + encrypted_data.size(), + reinterpret_cast(chunk_nonce.data()), + aead_context_data.aead_nonce.size(), + reinterpret_cast(plaintext_payload.data()), + plaintext_payload.size(), ad, ad_len)) { + return SslErrorAsStatus( + "Failed to encrypt the payload with derived AEAD key."); + } + encrypted_data.resize(ciphertext_len); + if (ciphertext_len == 0) { + return absl::InternalError("Generated Encrypted payload cannot be empty."); + } + return encrypted_data; +} + +absl::StatusOr +ObliviousHttpResponse::ChunkCounter::Create(std::string nonce) { + if (nonce.empty()) { + return absl::InvalidArgumentError("Nonce must not be empty."); + } + return ObliviousHttpResponse::ChunkCounter(std::move(nonce)); +} + +ObliviousHttpResponse::ChunkCounter::ChunkCounter(std::string nonce) + : nonce_(std::move(nonce)), encoded_counter_(nonce_.size(), '\0') {} + +void ObliviousHttpResponse::ChunkCounter::Increment() { + uint64_t pos = nonce_.size(); + // Start with the least significant byte and increment it by 1, if it wraps + // then proceed to the next byte and repeat. + do { + pos--; + encoded_counter_[pos] += static_cast(1); + } while (pos != 0 && encoded_counter_[pos] == '\0'); + if (pos == 0 && encoded_counter_[pos] == '\0') { + // Counter has wrapped. + limit_exceeded_ = true; + } +} + +std::string ObliviousHttpResponse::ChunkCounter::GetChunkNonce() const { + std::string chunk_nonce(nonce_.size(), '\0'); + for (size_t i = 0; i < chunk_nonce.size(); i++) { + chunk_nonce[i] = nonce_[i] ^ encoded_counter_[i]; + } + return chunk_nonce; +} } // namespace quiche diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_response.h b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_response.h index 2bc7cafe0c..29b6763a0a 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_response.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_response.h @@ -4,9 +4,11 @@ #include #include +#include #include "absl/status/statusor.h" #include "absl/strings/string_view.h" +#include "openssl/base.h" #include "quiche/common/quiche_random.h" #include "quiche/oblivious_http/buffers/oblivious_http_request.h" #include "quiche/oblivious_http/common/oblivious_http_header_key_config.h" @@ -15,6 +17,41 @@ namespace quiche { class QUICHE_EXPORT ObliviousHttpResponse { public: + // A counter of the number of chunks sent/received in the response, used to + // get the appropriate chunk nonce for encryption/decryption. See + // (https://datatracker.ietf.org/doc/html/draft-ietf-ohai-chunked-ohttp-05#section-6.2). + class QUICHE_EXPORT ChunkCounter { + public: + static absl::StatusOr Create(std::string nonce); + // Returns true if the counter has exceeded the maximum allowed value. + bool LimitExceeded() const { return limit_exceeded_; } + // Increments the chunk counter. + void Increment(); + // XORs the nonce with the encoded counter to get the chunk nonce. + std::string GetChunkNonce() const; + + private: + explicit ChunkCounter(std::string nonce); + // The nonce used to initialize the counter. + const std::string nonce_; + // Represents the counter value encoded to `Nn` bytes in network + // byte order. + std::string encoded_counter_; + bool limit_exceeded_ = false; + }; + + // Common AEAD context data used for sealing/opening response chunks. + struct QUICHE_EXPORT AeadContextData { + bssl::UniquePtr aead_ctx; + const std::string aead_nonce; + }; + struct QUICHE_EXPORT CommonAeadParamsResult { + const EVP_AEAD* evp_hpke_aead; + const size_t aead_key_len; + const size_t aead_nonce_len; + const size_t secret_len; + }; + // Parse and decrypt the OHttp response using ObliviousHttpContext context obj // that was returned from `CreateClientObliviousRequest` method. On success, // returns obj that callers will use to `GetDecryptedMessage`. @@ -57,6 +94,18 @@ class QUICHE_EXPORT ObliviousHttpResponse { ~ObliviousHttpResponse() = default; + // Generates the AEAD context data from the response nonce. + static absl::StatusOr GetAeadContextData( + ObliviousHttpRequest::Context& oblivious_http_request_context, + CommonAeadParamsResult& aead_params, absl::string_view response_label, + absl::string_view response_nonce); + + static absl::StatusOr EncryptChunk( + ObliviousHttpRequest::Context& oblivious_http_request_context, + const AeadContextData& aead_context_data, + absl::string_view plaintext_payload, absl::string_view chunk_nonce, + bool is_final_chunk); + // Generic Usecase : server-side calls this method in the context of Response // to serialize OHTTP response that will be returned to client-side. // Returns serialized OHTTP response bytestring. @@ -67,14 +116,12 @@ class QUICHE_EXPORT ObliviousHttpResponse { return std::move(response_plaintext_); } - private: - struct CommonAeadParamsResult { - const EVP_AEAD* evp_hpke_aead; - const size_t aead_key_len; - const size_t aead_nonce_len; - const size_t secret_len; - }; + // Determines AEAD key len(Nk), AEAD nonce len(Nn) based on HPKE context, and + // further estimates secret_len = std::max(Nk, Nn) + static absl::StatusOr GetCommonAeadParams( + ObliviousHttpRequest::Context& oblivious_http_request_context); + private: struct CommonOperationsResult { bssl::UniquePtr aead_ctx; const std::string aead_nonce; @@ -83,10 +130,6 @@ class QUICHE_EXPORT ObliviousHttpResponse { explicit ObliviousHttpResponse(std::string encrypted_data, std::string resp_plaintext); - // Determines AEAD key len(Nk), AEAD nonce len(Nn) based on HPKE context and - // further estimates secret_len = std::max(Nk, Nn) - static absl::StatusOr GetCommonAeadParams( - ObliviousHttpRequest::Context& oblivious_http_request_context); // Performs operations related to response handling that are common between // client and server. static absl::StatusOr CommonOperationsToEncapDecap( diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_chunk_handler.h b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_chunk_handler.h new file mode 100644 index 0000000000..7c7bd778a6 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_chunk_handler.h @@ -0,0 +1,25 @@ +#ifndef QUICHE_OBLIVIOUS_HTTP_COMMON_CHUNK_HANDLER_H_ +#define QUICHE_OBLIVIOUS_HTTP_COMMON_CHUNK_HANDLER_H_ + +#include "absl/status/status.h" +#include "absl/strings/string_view.h" +#include "quiche/common/platform/api/quiche_export.h" + +namespace quiche { + +// Methods to be invoked upon decryption of request/response OHTTP chunks. +class QUICHE_EXPORT ObliviousHttpChunkHandler { + public: + virtual ~ObliviousHttpChunkHandler() = default; + // This method is invoked once a chunk of data has been decrypted. It returns + // a Status to allow the implementation to signal a potential error, such as a + // decoding issue with the decrypted data. + virtual absl::Status OnDecryptedChunk(absl::string_view decrypted_chunk) = 0; + // This method is invoked once all chunks have been decrypted. It returns + // a Status to allow the implementation to signal a potential error. + virtual absl::Status OnChunksDone() = 0; +}; + +} // namespace quiche + +#endif // QUICHE_OBLIVIOUS_HTTP_COMMON_CHUNK_HANDLER_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_definitions.h b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_definitions.h new file mode 100644 index 0000000000..6403feeac9 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_definitions.h @@ -0,0 +1,14 @@ +#ifndef QUICHE_OBLIVIOUS_HTTP_COMMON_OBLIVIOUS_HTTP_DEFINITIONS_H_ +#define QUICHE_OBLIVIOUS_HTTP_COMMON_OBLIVIOUS_HTTP_DEFINITIONS_H_ + +#include + +namespace quiche { +// This 5-byte array represents the string "final", which is used as AD when +// encrypting/decrypting the final OHTTP chunk. See sections 6.1 and 6.2 of +// https://www.ietf.org/archive/id/draft-ietf-ohai-chunked-ohttp-05.html +constexpr uint8_t kFinalAdBytes[] = {0x66, 0x69, 0x6E, 0x61, 0x6C}; + +} // namespace quiche + +#endif // QUICHE_OBLIVIOUS_HTTP_COMMON_OBLIVIOUS_HTTP_DEFINITIONS_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_header_key_config.h b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_header_key_config.h index f57efbd0e6..9e4833686e 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_header_key_config.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_header_key_config.h @@ -25,6 +25,10 @@ class QUICHE_EXPORT ObliviousHttpHeaderKeyConfig { "message/bhttp request"; static constexpr absl::string_view kOhttpResponseLabel = "message/bhttp response"; + static constexpr absl::string_view kChunkedOhttpRequestLabel = + "message/bhttp chunked request"; + static constexpr absl::string_view kChunkedOhttpResponseLabel = + "message/bhttp chunked response"; // Length of the Oblivious HTTP header. static constexpr uint32_t kHeaderLength = sizeof(uint8_t) + (3 * sizeof(uint16_t)); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/oblivious_http_gateway.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/oblivious_http_gateway.cc index e788369a0e..5cb7b20cfc 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/oblivious_http_gateway.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/oblivious_http_gateway.cc @@ -6,14 +6,28 @@ #include #include +#include "absl/base/attributes.h" #include "absl/memory/memory.h" #include "absl/status/status.h" #include "absl/status/statusor.h" +#include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" +#include "openssl/aead.h" +#include "openssl/base.h" +#include "openssl/hpke.h" #include "quiche/common/quiche_crypto_logging.h" +#include "quiche/common/quiche_data_reader.h" +#include "quiche/common/quiche_data_writer.h" +#include "quiche/common/quiche_endian.h" #include "quiche/common/quiche_random.h" +#include "quiche/oblivious_http/buffers/oblivious_http_request.h" +#include "quiche/oblivious_http/common/oblivious_http_chunk_handler.h" +#include "quiche/oblivious_http/common/oblivious_http_header_key_config.h" namespace quiche { +namespace { +constexpr uint64_t kFinalChunkIndicator = 0; +} // Constructor. ObliviousHttpGateway::ObliviousHttpGateway( @@ -24,11 +38,9 @@ ObliviousHttpGateway::ObliviousHttpGateway( ohttp_key_config_(ohttp_key_config), quiche_random_(quiche_random) {} -// Initialize ObliviousHttpGateway(Recipient/Server) context. -absl::StatusOr ObliviousHttpGateway::Create( +absl::StatusOr> CreateServerRecipientKey( absl::string_view hpke_private_key, - const ObliviousHttpHeaderKeyConfig& ohttp_key_config, - QuicheRandom* quiche_random) { + const ObliviousHttpHeaderKeyConfig& ohttp_key_config) { if (hpke_private_key.empty()) { return absl::InvalidArgumentError("Invalid/Empty HPKE private key."); } @@ -44,8 +56,21 @@ absl::StatusOr ObliviousHttpGateway::Create( hpke_private_key.size())) { return SslErrorAsStatus("Failed to import HPKE private key."); } + return recipient_key; +} + +// Initialize ObliviousHttpGateway(Recipient/Server) context. +absl::StatusOr ObliviousHttpGateway::Create( + absl::string_view hpke_private_key, + const ObliviousHttpHeaderKeyConfig& ohttp_key_config, + QuicheRandom* quiche_random) { + absl::StatusOr> recipient_key = + CreateServerRecipientKey(hpke_private_key, ohttp_key_config); + if (!recipient_key.ok()) { + return recipient_key.status(); + } if (quiche_random == nullptr) quiche_random = QuicheRandom::GetInstance(); - return ObliviousHttpGateway(std::move(recipient_key), ohttp_key_config, + return ObliviousHttpGateway(std::move(*recipient_key), ohttp_key_config, quiche_random); } @@ -66,4 +91,276 @@ ObliviousHttpGateway::CreateObliviousHttpResponse( quiche_random_); } +// Constructor. +ChunkedObliviousHttpGateway::ChunkedObliviousHttpGateway( + bssl::UniquePtr recipient_key, + const ObliviousHttpHeaderKeyConfig& ohttp_key_config, + ObliviousHttpChunkHandler& chunk_handler, QuicheRandom* quiche_random) + : server_hpke_key_(std::move(recipient_key)), + ohttp_key_config_(ohttp_key_config), + chunk_handler_(chunk_handler), + quiche_random_(quiche_random) {} + +absl::StatusOr ChunkedObliviousHttpGateway::Create( + absl::string_view hpke_private_key, + const ObliviousHttpHeaderKeyConfig& ohttp_key_config, + ObliviousHttpChunkHandler& chunk_handler, QuicheRandom* quiche_random) { + absl::StatusOr> recipient_key = + CreateServerRecipientKey(hpke_private_key, ohttp_key_config); + if (!recipient_key.ok()) { + return recipient_key.status(); + } + if (quiche_random == nullptr) { + quiche_random = QuicheRandom::GetInstance(); + } + return ChunkedObliviousHttpGateway(std::move(*recipient_key), + ohttp_key_config, chunk_handler, + quiche_random); +} + +void ChunkedObliviousHttpGateway::InitializeRequestCheckpoint( + absl::string_view data) { + request_checkpoint_view_ = data; + // Prepend buffered data if present. This is the data from a previous call to + // DecryptRequest that could not finish because it needed this new data. + if (!request_buffer_.empty()) { + if (!data.empty()) { + absl::StrAppend(&request_buffer_, data); + } + request_checkpoint_view_ = request_buffer_; + } +} + +absl::Status ChunkedObliviousHttpGateway::DecryptRequestCheckpoint( + bool end_stream) { + QuicheDataReader reader(request_checkpoint_view_); + switch (request_current_section_) { + case RequestMessageSection::kEnd: + return absl::InternalError("Request is invalid."); + case RequestMessageSection::kHeader: { + // Check there is enough data for the chunked request header. + // https://www.ietf.org/archive/id/draft-ietf-ohai-chunked-ohttp-05.html#name-request-format + if (reader.PeekRemainingPayload().size() < + ObliviousHttpHeaderKeyConfig::kHeaderLength + + EVP_HPKE_KEM_enc_len(EVP_HPKE_KEY_kem(server_hpke_key_.get()))) { + return absl::OutOfRangeError("Not enough data to read header."); + } + absl::StatusOr context = + ObliviousHttpRequest::DecodeEncapsulatedRequestHeader( + reader, *server_hpke_key_, ohttp_key_config_, + ObliviousHttpHeaderKeyConfig::kChunkedOhttpRequestLabel); + if (!context.ok()) { + return context.status(); + } + + oblivious_http_request_context_ = std::move(*context); + SaveCheckpoint(reader); + request_current_section_ = RequestMessageSection::kChunk; + } + ABSL_FALLTHROUGH_INTENDED; + case RequestMessageSection::kChunk: { + uint64_t length_or_final_chunk_indicator; + do { + if (!reader.ReadVarInt62(&length_or_final_chunk_indicator)) { + return absl::OutOfRangeError("Not enough data to read chunk length."); + } + absl::string_view chunk; + if (length_or_final_chunk_indicator != kFinalChunkIndicator) { + if (!reader.ReadStringPiece(&chunk, + length_or_final_chunk_indicator)) { + return absl::OutOfRangeError("Not enough data to read chunk."); + } + if (!oblivious_http_request_context_.has_value()) { + return absl::InternalError( + "HPKE context has not been derived from an encrypted request."); + } + absl::StatusOr decrypted_chunk = + ObliviousHttpRequest::DecryptChunk( + *oblivious_http_request_context_, chunk, + /*is_final_chunk=*/false); + if (!decrypted_chunk.ok()) { + return decrypted_chunk.status(); + } + absl::Status handle_chunk_status = + chunk_handler_.OnDecryptedChunk(*decrypted_chunk); + if (!handle_chunk_status.ok()) { + return handle_chunk_status; + } + } + + SaveCheckpoint(reader); + } while (length_or_final_chunk_indicator != kFinalChunkIndicator); + + request_current_section_ = RequestMessageSection::kFinalChunk; + } + ABSL_FALLTHROUGH_INTENDED; + case RequestMessageSection::kFinalChunk: { + if (!end_stream) { + return absl::OutOfRangeError("Not enough data to read final chunk."); + } + if (!oblivious_http_request_context_.has_value()) { + return absl::InternalError( + "HPKE context has not been derived from an encrypted request."); + } + absl::StatusOr decrypted_chunk = + ObliviousHttpRequest::DecryptChunk(*oblivious_http_request_context_, + reader.PeekRemainingPayload(), + /*is_final_chunk=*/true); + if (!decrypted_chunk.ok()) { + return decrypted_chunk.status(); + } + absl::Status handle_chunk_status = + chunk_handler_.OnDecryptedChunk(*decrypted_chunk); + if (!handle_chunk_status.ok()) { + return handle_chunk_status; + } + handle_chunk_status = chunk_handler_.OnChunksDone(); + if (!handle_chunk_status.ok()) { + return handle_chunk_status; + } + } + } + return absl::OkStatus(); +} + +absl::Status ChunkedObliviousHttpGateway::DecryptRequest(absl::string_view data, + bool end_stream) { + if (request_current_section_ == RequestMessageSection::kEnd) { + return absl::InternalError("Decrypting is marked as invalid."); + } + InitializeRequestCheckpoint(data); + absl::Status status = DecryptRequestCheckpoint(end_stream); + if (end_stream) { + request_current_section_ = RequestMessageSection::kEnd; + if (absl::IsOutOfRange(status)) { + // OutOfRange only used internally for buffering, so return + // InvalidArgument if this is the end of the stream. + status = absl::InvalidArgumentError(status.message()); + } + return status; + } + if (absl::IsOutOfRange(status)) { + BufferRequestCheckpoint(); + return absl::OkStatus(); + } + if (!status.ok()) { + request_current_section_ = RequestMessageSection::kEnd; + } + + request_buffer_.clear(); + return status; +} + +absl::StatusOr ChunkedObliviousHttpGateway::EncryptResponse( + absl::string_view plaintext_payload, bool is_final_chunk) { + if (response_current_section_ == ResponseMessageSection::kEnd) { + return absl::InvalidArgumentError("Encrypting is marked as invalid."); + } + absl::StatusOr response_chunk = + EncryptResponseChunk(plaintext_payload, is_final_chunk); + if (!response_chunk.ok()) { + response_current_section_ = ResponseMessageSection::kEnd; + } + return response_chunk; +} + +absl::StatusOr ChunkedObliviousHttpGateway::EncryptResponseChunk( + absl::string_view plaintext_payload, bool is_final_chunk) { + if (response_chunk_counter_.has_value() && + response_chunk_counter_->LimitExceeded()) { + return absl::InternalError( + "Response chunk counter has exceeded the maximum allowed value."); + } + if (!oblivious_http_request_context_.has_value()) { + return absl::InternalError( + "HPKE context has not been derived from an encrypted request."); + } + + if (!aead_context_data_.has_value()) { + absl::StatusOr aead_params = + ObliviousHttpResponse::GetCommonAeadParams( + *oblivious_http_request_context_); + if (!aead_params.ok()) { + return aead_params.status(); + } + + // secret_len represents max(Nn, Nk)) + response_nonce_ = std::string(aead_params->secret_len, '\0'); + quiche_random_->RandBytes(response_nonce_.data(), response_nonce_.size()); + + auto aead_context_data = ObliviousHttpResponse::GetAeadContextData( + *oblivious_http_request_context_, *aead_params, + ObliviousHttpHeaderKeyConfig::kChunkedOhttpResponseLabel, + response_nonce_); + if (!aead_context_data.ok()) { + return aead_context_data.status(); + } + aead_context_data_.emplace(std::move(*aead_context_data)); + + auto response_chunk_counter = ObliviousHttpResponse::ChunkCounter::Create( + aead_context_data_->aead_nonce); + if (!response_chunk_counter.ok()) { + return response_chunk_counter.status(); + } + response_chunk_counter_.emplace(std::move(*response_chunk_counter)); + } + + if (!response_chunk_counter_.has_value()) { + return absl::InternalError( + "Response chunk counter has not been initialized."); + } + + absl::StatusOr encrypted_data = + ObliviousHttpResponse::EncryptChunk( + *oblivious_http_request_context_, *aead_context_data_, + plaintext_payload, response_chunk_counter_->GetChunkNonce(), + is_final_chunk); + if (!encrypted_data.ok()) { + return encrypted_data.status(); + } + + absl::string_view maybe_nonce; + if (response_current_section_ == ResponseMessageSection::kNonce) { + maybe_nonce = response_nonce_; + response_current_section_ = ResponseMessageSection::kChunk; + } + + uint8_t chunk_var_int_length = + QuicheDataWriter::GetVarInt62Len(encrypted_data->size()); + uint64_t chunk_var_int = encrypted_data->size(); + if (is_final_chunk) { + response_current_section_ = ResponseMessageSection::kEnd; + chunk_var_int_length = + QuicheDataWriter::GetVarInt62Len(kFinalChunkIndicator); + // encrypted_data is guaranteed to be non-empty, so chunk_var_int_length + // should never be 0. + if (chunk_var_int_length == 0) { + return absl::InvalidArgumentError( + "Encrypted data is too large to be represented as a varint."); + } + chunk_var_int = kFinalChunkIndicator; + } + + std::string response_buffer( + maybe_nonce.size() + chunk_var_int_length + encrypted_data->size(), '\0'); + QuicheDataWriter writer(response_buffer.size(), response_buffer.data()); + + if (!writer.WriteStringPiece(maybe_nonce)) { + return absl::InternalError("Failed to write response nonce to buffer."); + } + if (!writer.WriteVarInt62(chunk_var_int)) { + return absl::InternalError("Failed to write chunk to buffer."); + } + if (!writer.WriteStringPiece(*encrypted_data)) { + return absl::InternalError("Failed to write encrypted data to buffer."); + } + + if (writer.remaining() != 0) { + return absl::InternalError("Failed to write all data."); + } + + response_chunk_counter_->Increment(); + return response_buffer; +} + } // namespace quiche diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/oblivious_http_gateway.h b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/oblivious_http_gateway.h index fce1f04664..5023ebed55 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/oblivious_http_gateway.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/oblivious_http/oblivious_http_gateway.h @@ -1,17 +1,23 @@ #ifndef QUICHE_OBLIVIOUS_HTTP_OBLIVIOUS_HTTP_GATEWAY_H_ #define QUICHE_OBLIVIOUS_HTTP_OBLIVIOUS_HTTP_GATEWAY_H_ +#include #include +#include #include +#include +#include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/string_view.h" #include "openssl/base.h" #include "openssl/hpke.h" #include "quiche/common/platform/api/quiche_export.h" +#include "quiche/common/quiche_data_reader.h" #include "quiche/common/quiche_random.h" #include "quiche/oblivious_http/buffers/oblivious_http_request.h" #include "quiche/oblivious_http/buffers/oblivious_http_response.h" +#include "quiche/oblivious_http/common/oblivious_http_chunk_handler.h" #include "quiche/oblivious_http/common/oblivious_http_header_key_config.h" namespace quiche { @@ -82,6 +88,114 @@ class QUICHE_EXPORT ObliviousHttpGateway { QuicheRandom* quiche_random_; }; +// Manages a chunked Oblivious HTTP request and response. +// It's designed to process incoming request data in chunks, decrypting each one +// as it arrives and passing it to a handler function. It then continuously +// encrypts and sends back response chunks. This object maintains an internal +// state, so it can only be used for one complete request-response cycle. +class QUICHE_EXPORT ChunkedObliviousHttpGateway { + public: + // Creates a ChunkedObliviousHttpGateway. Like `ObliviousHttpGateway`, + // `hpke_private_key` must outlive the gateway. `quiche_random` can be + // initialized to nullptr, in which case the default + // `QuicheRandom::GetInstance()` will be used. + static absl::StatusOr Create( + absl::string_view hpke_private_key, + const ObliviousHttpHeaderKeyConfig& ohttp_key_config, + ObliviousHttpChunkHandler& chunk_handler, + QuicheRandom* quiche_random = nullptr); + + // only Movable (due to `UniquePtr server_hpke_key_`). + ChunkedObliviousHttpGateway(ChunkedObliviousHttpGateway&& other) = default; + + ~ChunkedObliviousHttpGateway() = default; + + // Parses the data into the corresponding chunks and decrypts them. This can + // be invoked multiple times as data arrives, incomplete chunks will be + // buffered. The first time it is called it will also decode the HPKE header. + // On successful decryption, the chunk handler will be invoked. The + // `end_stream` parameter must be set to true if the data contains the final + // portion of the final chunk. + absl::Status DecryptRequest(absl::string_view data, bool end_stream); + + // Encrypts the data as a single chunk. If `is_final_chunk` is true, the + // response will be encoded with the final chunk indicator. + absl::StatusOr EncryptResponse( + absl::string_view plaintext_payload, bool is_final_chunk); + + private: + enum class RequestMessageSection { + kHeader, + kChunk, + kFinalChunk, + // Set by end_stream or if there is an error. + kEnd, + }; + enum class ResponseMessageSection { + kNonce, + kChunk, + // Set after the final chunk is encrypted or if there is an error. + kEnd, + }; + + explicit ChunkedObliviousHttpGateway( + bssl::UniquePtr recipient_key, + const ObliviousHttpHeaderKeyConfig& ohttp_key_config, + ObliviousHttpChunkHandler& chunk_handler, QuicheRandom* quiche_random); + + // Initializes the checkpoint with the provided data and any buffered data. + void InitializeRequestCheckpoint(absl::string_view data); + // Carries out the decrypting logic from the checkpoint. Returns + // OutOfRangeError if there is not enough data to process the current + // section. When a section is fully processed, the checkpoint is updated. + absl::Status DecryptRequestCheckpoint(bool end_stream); + // Saves the checkpoint based on the current position of the reader. + void SaveCheckpoint(const QuicheDataReader& reader) { + request_checkpoint_view_ = reader.PeekRemainingPayload(); + } + // Buffers the request checkpoint. + void BufferRequestCheckpoint() { + if (request_buffer_ != request_checkpoint_view_) { + request_buffer_ = std::string(request_checkpoint_view_); + } + } + absl::StatusOr EncryptResponseChunk( + absl::string_view plaintext_payload, bool is_final_chunk); + + bssl::UniquePtr server_hpke_key_; + // Holds server's keyID and HPKE related IDs that's published under HPKE + // public Key configuration. + // https://www.rfc-editor.org/rfc/rfc9458.html#section-3 + ObliviousHttpHeaderKeyConfig ohttp_key_config_; + // The handler to invoke when a chunk is decrypted successfully. + ObliviousHttpChunkHandler& chunk_handler_; + QuicheRandom* quiche_random_; + + std::string request_buffer_; + // Tracks the remaining data to be processed or buffered. + // When decoding fails due to missing data, we buffer based on this + // checkpoint and return. When decoding succeeds, we update the checkpoint + // to not buffer the already processed data. + absl::string_view request_checkpoint_view_; + RequestMessageSection request_current_section_ = + RequestMessageSection::kHeader; + ResponseMessageSection response_current_section_ = + ResponseMessageSection::kNonce; + + // HPKE data derived from successfully decoding the chunked + // request header when calling `DecryptRequest`. + std::optional oblivious_http_request_context_; + // The nonce for the response. + std::string response_nonce_; + // AEAD context data for the response. This is derived from the request HPKE + // context data and response nonce. + std::optional aead_context_data_; + + // Counter to keep track of the number of response chunks generated and to + // generate the corresponding chunk nonce. + std::optional response_chunk_counter_; +}; + } // namespace quiche #endif // QUICHE_OBLIVIOUS_HTTP_OBLIVIOUS_HTTP_GATEWAY_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/chlo_extractor.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/chlo_extractor.cc index 1a105c5e47..169deed695 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/chlo_extractor.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/chlo_extractor.cc @@ -80,7 +80,7 @@ class ChloFramerVisitor : public QuicFramerVisitorInterface, bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override; bool OnBlockedFrame(const QuicBlockedFrame& frame) override; bool OnPaddingFrame(const QuicPaddingFrame& frame) override; - bool OnMessageFrame(const QuicMessageFrame& frame) override; + bool OnDatagramFrame(const QuicDatagramFrame& frame) override; bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override; bool OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame) override; bool OnImmediateAckFrame(const QuicImmediateAckFrame& frame) override; @@ -299,7 +299,7 @@ bool ChloFramerVisitor::OnPaddingFrame(const QuicPaddingFrame& /*frame*/) { return true; } -bool ChloFramerVisitor::OnMessageFrame(const QuicMessageFrame& /*frame*/) { +bool ChloFramerVisitor::OnDatagramFrame(const QuicDatagramFrame& /*frame*/) { return true; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc index c2bafd2ae7..7aab8ed062 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc @@ -156,11 +156,6 @@ void Bbr2NetworkModel::OnCongestionEventStart( congestion_event->prior_bytes_in_flight - congestion_event->bytes_acked - congestion_event->bytes_lost; } else { - QUIC_LOG(ERROR) << "prior_bytes_in_flight:" - << congestion_event->prior_bytes_in_flight - << " is smaller than the sum of bytes_acked:" - << congestion_event->bytes_acked - << " and bytes_lost:" << congestion_event->bytes_lost; congestion_event->bytes_in_flight = 0; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_interface.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_interface.h index 568d72a34c..1c886ae94a 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_interface.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_interface.h @@ -40,14 +40,22 @@ class QUICHE_EXPORT SendAlgorithmInterface { rtt(rtt), allow_cwnd_to_decrease(allow_cwnd_to_decrease) {} - bool operator==(const NetworkParams& other) const { - return bandwidth == other.bandwidth && rtt == other.rtt && - max_initial_congestion_window == - other.max_initial_congestion_window && - allow_cwnd_to_decrease == other.allow_cwnd_to_decrease && - is_rtt_trusted == other.is_rtt_trusted; + template + friend void AbslStringify(Sink& sink, const NetworkParams& params) { + absl::Format(&sink, + "NetworkParams { " + "bandwidth: %v, " + "rtt: %v, " + "max_initial_congestion_window: %v, " + "allow_cwnd_to_decrease: %v, " + "is_rtt_trusted: %v }", + params.bandwidth, params.rtt, + params.max_initial_congestion_window, + params.allow_cwnd_to_decrease, params.is_rtt_trusted); } + bool operator==(const NetworkParams& other) const = default; + QuicBandwidth bandwidth = QuicBandwidth::Zero(); QuicTime::Delta rtt = QuicTime::Delta::Zero(); int max_initial_congestion_window = 0; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h index c8dd332f34..d956d32908 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h @@ -479,6 +479,9 @@ DEFINE_STATIC_QUIC_TAG(ACH0); DEFINE_STATIC_QUIC_TAG(NOIP); DEFINE_STATIC_QUIC_TAG(NIPA); // Aggressively skip IP matching +// Experiment for sending new ORIGIN frame. +DEFINE_STATIC_QUIC_TAG(ORIG); + // Rejection tags DEFINE_STATIC_QUIC_TAG(RREJ); // Reasons for server sending @@ -535,9 +538,12 @@ DEFINE_STATIC_QUIC_TAG(PDE2); // 2 PTOs for path degradation. DEFINE_STATIC_QUIC_TAG(PDE3); // 3 PTOs for path degradation. DEFINE_STATIC_QUIC_TAG(PDE5); // 5 PTOs for path degradation. DEFINE_STATIC_QUIC_TAG(MPR1); // Probe for multi-port path on RTO. +// TODO: b/433537286 - Remove this tag once the experiment is complete. +DEFINE_STATIC_QUIC_TAG(CFLS); // Enable flow-label-based blackhole avoidance on + // the server side when the client sends CFLS. -// Experiment for explicit connection close packet for silent idle timeout from -// server. +// Experiment for explicit connection close packet for silent idle timeout +// from server. DEFINE_STATIC_QUIC_TAG(ECCP); #undef DEFINE_STATIC_QUIC_TAG diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/crypto_secret_boxer.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/crypto_secret_boxer.cc index bdc87e0594..badb722202 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/crypto_secret_boxer.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/crypto_secret_boxer.cc @@ -68,7 +68,7 @@ bool CryptoSecretBoxer::SetKeys(const std::vector& keys) { new_state->ctxs.push_back(std::move(ctx)); } - absl::WriterMutexLock l(&lock_); + absl::WriterMutexLock l(lock_); state_ = std::move(new_state); return true; } @@ -95,7 +95,7 @@ std::string CryptoSecretBoxer::Box(QuicRandom* rand, size_t bytes_written; { - absl::ReaderMutexLock l(&lock_); + absl::ReaderMutexLock l(lock_); if (!EVP_AEAD_CTX_seal(state_->ctxs[0].get(), out, &bytes_written, out_len, nonce, kSIVNonceSize, reinterpret_cast(plaintext.data()), @@ -126,7 +126,7 @@ bool CryptoSecretBoxer::Unbox(absl::string_view in_ciphertext, bool ok = false; { - absl::ReaderMutexLock l(&lock_); + absl::ReaderMutexLock l(lock_); for (const bssl::UniquePtr& ctx : state_->ctxs) { size_t bytes_written; if (EVP_AEAD_CTX_open( diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/proof_source.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/proof_source.cc index ff489c141e..ee3970bac5 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/proof_source.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/proof_source.cc @@ -4,11 +4,19 @@ #include "quiche/quic/core/crypto/proof_source.h" +#include +#include #include #include #include +#include "openssl/base.h" +#include "openssl/pool.h" +#include "openssl/ssl.h" +#include "quiche/quic/core/crypto/certificate_view.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" +#include "quiche/quic/platform/api/quic_socket_address.h" +#include "quiche/common/platform/api/quiche_reference_counted.h" namespace quic { @@ -19,8 +27,10 @@ CryptoBuffers::~CryptoBuffers() { } ProofSource::Chain::Chain(const std::vector& certs, - const std::string& trust_anchor_id) - : certs(certs), trust_anchor_id(trust_anchor_id) {} + const std::string& trust_anchor_id, bool matches_sni) + : certs(certs), + trust_anchor_id(trust_anchor_id), + matches_sni(matches_sni) {} ProofSource::Chain::~Chain() {} @@ -61,4 +71,18 @@ bool ValidateCertAndKey( void ProofSource::OnNewSslCtx(SSL_CTX*) {} +std::vector> +ProofSource::GetCertChains(const QuicSocketAddress& server_address, + const QuicSocketAddress& client_address, + const std::string& hostname) { + bool cert_matched_sni; + quiche::QuicheReferenceCountedPointer chain = + GetCertChain(server_address, client_address, hostname, &cert_matched_sni); + if (chain == nullptr) { + return {}; + } + chain->matches_sni = cert_matched_sni; + return {chain}; +} + } // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/proof_source.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/proof_source.h index 21276ed384..7213eb759f 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/proof_source.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/proof_source.h @@ -7,13 +7,13 @@ #include #include -#include #include #include #include #include #include +#include "absl/base/nullability.h" #include "absl/status/status.h" #include "absl/strings/string_view.h" #include "openssl/base.h" @@ -54,7 +54,7 @@ class QUICHE_EXPORT ProofSource { // certificates. struct QUICHE_EXPORT Chain : public quiche::QuicheReferenceCounted { Chain(const std::vector& certs, - const std::string& trust_anchor_id = ""); + const std::string& trust_anchor_id = "", bool matches_sni = false); Chain(const Chain&) = delete; Chain& operator=(const Chain&) = delete; @@ -65,6 +65,10 @@ class QUICHE_EXPORT ProofSource { // trust anchor ID will be set. const std::string trust_anchor_id; + // Indicates whether the leaf certificate matches the SNI hostname. Note + // that this field is NOT set by `ProofSource::GetCertChain()`. + bool matches_sni; + protected: ~Chain() override; }; @@ -170,11 +174,30 @@ class QUICHE_EXPORT ProofSource { // // Sets *cert_matched_sni to true if the certificate matched the given // hostname, false if a default cert not matching the hostname was used. + // + // Does not set `Chain::matches_sni` on the returned chain. + // + // TODO: b/450539617 - Update all implementations to set `Chain::matches_sni` + // on the returned chain. virtual quiche::QuicheReferenceCountedPointer GetCertChain( const QuicSocketAddress& server_address, const QuicSocketAddress& client_address, const std::string& hostname, bool* cert_matched_sni) = 0; + // Returns zero or more certificate chains for `hostname`. Chains are returned + // in decreasing order of preference, so earlier chains are preferred over + // later chains. Within each chain, certificates are in leaf-first order. + // Each chain's `Chain::matches_sni` field is set to true iff the leaf + // certificate matches `hostname`. None of the returned chains are nullptr. + // + // The default implementation returns a vector of zero or one elements based + // on the result of `GetCertChain()`. If `GetCertChain()` returns nullptr, + // this method returns the empty vector. + virtual std::vector> + GetCertChains(const QuicSocketAddress& server_address, + const QuicSocketAddress& client_address, + const std::string& hostname); + // Computes a signature using the private key of the certificate for // |hostname|. The value in |in| is signed using the algorithm specified by // |signature_algorithm|, which is an |SSL_SIGN_*| value (as defined in TLS @@ -263,7 +286,11 @@ class QUICHE_EXPORT ProofSourceHandleCallback { // Configuration to use for configuring the SSL object when handshaking // locally. struct LocalSSLConfig { - const ProofSource::Chain* chain; + LocalSSLConfig(const ProofSource::Chain* absl_nullable chain, + QuicDelayedSSLConfig delayed_ssl_config) + : chain(chain), delayed_ssl_config(delayed_ssl_config) {} + + const ProofSource::Chain* absl_nullable chain = nullptr; QuicDelayedSSLConfig delayed_ssl_config; }; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.cc index 773f92e5e0..0e37e2d773 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.cc @@ -5,35 +5,49 @@ #include "quiche/quic/core/crypto/quic_crypto_client_config.h" #include +#include +#include +#include #include #include #include #include #include "absl/base/macros.h" +#include "absl/base/nullability.h" #include "absl/memory/memory.h" #include "absl/strings/match.h" #include "absl/strings/string_view.h" +#include "openssl/aead.h" #include "openssl/ssl.h" #include "quiche/quic/core/crypto/cert_compressor.h" -#include "quiche/quic/core/crypto/chacha20_poly1305_encrypter.h" +#include "quiche/quic/core/crypto/client_proof_source.h" #include "quiche/quic/core/crypto/crypto_framer.h" +#include "quiche/quic/core/crypto/crypto_handshake.h" #include "quiche/quic/core/crypto/crypto_protocol.h" #include "quiche/quic/core/crypto/crypto_utils.h" #include "quiche/quic/core/crypto/curve25519_key_exchange.h" #include "quiche/quic/core/crypto/key_exchange.h" #include "quiche/quic/core/crypto/p256_key_exchange.h" #include "quiche/quic/core/crypto/proof_verifier.h" -#include "quiche/quic/core/crypto/quic_encrypter.h" #include "quiche/quic/core/crypto/quic_random.h" #include "quiche/quic/core/crypto/tls_client_connection.h" #include "quiche/quic/core/quic_connection_id.h" +#include "quiche/quic/core/quic_constants.h" +#include "quiche/quic/core/quic_error_codes.h" +#include "quiche/quic/core/quic_server_id.h" +#include "quiche/quic/core/quic_tag.h" +#include "quiche/quic/core/quic_time.h" #include "quiche/quic/core/quic_types.h" #include "quiche/quic/core/quic_utils.h" +#include "quiche/quic/core/quic_versions.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" #include "quiche/quic/platform/api/quic_client_stats.h" +#include "quiche/quic/platform/api/quic_flags.h" #include "quiche/quic/platform/api/quic_hostname_utils.h" #include "quiche/quic/platform/api/quic_logging.h" +#include "quiche/common/platform/api/quiche_logging.h" +#include "quiche/common/platform/api/quiche_reference_counted.h" namespace quic { @@ -307,7 +321,7 @@ uint64_t QuicCryptoClientConfig::CachedState::generation_counter() const { return generation_counter_; } -const ProofVerifyDetails* +const ProofVerifyDetails* absl_nullable QuicCryptoClientConfig::CachedState::proof_verify_details() const { return proof_verify_details_.get(); } @@ -323,8 +337,8 @@ void QuicCryptoClientConfig::CachedState::set_cert_sct( } void QuicCryptoClientConfig::CachedState::SetProofVerifyDetails( - ProofVerifyDetails* details) { - proof_verify_details_.reset(details); + std::unique_ptr details) { + proof_verify_details_ = std::move(details); } void QuicCryptoClientConfig::CachedState::InitializeFrom( diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.h index 60202948f9..1c7b285356 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.h @@ -8,7 +8,9 @@ #include #include #include +#include #include +#include #include #include "absl/strings/string_view.h" @@ -16,12 +18,17 @@ #include "openssl/ssl.h" #include "quiche/quic/core/crypto/client_proof_source.h" #include "quiche/quic/core/crypto/crypto_handshake.h" -#include "quiche/quic/core/crypto/crypto_protocol.h" #include "quiche/quic/core/crypto/quic_random.h" #include "quiche/quic/core/crypto/transport_parameters.h" -#include "quiche/quic/core/quic_packets.h" +#include "quiche/quic/core/quic_connection_id.h" +#include "quiche/quic/core/quic_error_codes.h" #include "quiche/quic/core/quic_server_id.h" -#include "quiche/quic/platform/api/quic_export.h" +#include "quiche/quic/core/quic_time.h" +#include "quiche/quic/core/quic_types.h" +#include "quiche/quic/core/quic_versions.h" +#include "quiche/quic/platform/api/quic_flags.h" +#include "quiche/common/platform/api/quiche_export.h" +#include "quiche/common/platform/api/quiche_logging.h" #include "quiche/common/platform/api/quiche_reference_counted.h" namespace quic { @@ -186,8 +193,7 @@ class QUICHE_EXPORT QuicCryptoClientConfig : public QuicCryptoConfig { void set_cert_sct(absl::string_view cert_sct); - // SetProofVerifyDetails takes ownership of |details|. - void SetProofVerifyDetails(ProofVerifyDetails* details); + void SetProofVerifyDetails(std::unique_ptr details); // Copy the |server_config_|, |source_address_token_|, |certs_|, // |expiration_time_|, |cert_sct_|, |chlo_hash_| and |server_config_sig_| @@ -360,6 +366,11 @@ class QUICHE_EXPORT QuicCryptoClientConfig : public QuicCryptoConfig { return preferred_groups_; } + // If non-empty, the groups for which to send key shares in the TLS handshake. + const std::vector& client_key_shares() const { + return client_key_shares_; + } + // Sets the preferred groups that will be used in the TLS handshake. Values // in the |preferred_groups| vector are NamedGroup enum codepoints from // https://datatracker.ietf.org/doc/html/rfc8446#section-4.2.7. @@ -367,6 +378,13 @@ class QUICHE_EXPORT QuicCryptoClientConfig : public QuicCryptoConfig { preferred_groups_ = preferred_groups; } + // Sets the groups for which to send key shares in the TLS handshake. Values + // in the |key_shares| vector are NamedGroup enum codepoints from + // https://datatracker.ietf.org/doc/html/rfc8446#section-4.2.7. + void set_client_key_shares(const std::vector& key_shares) { + client_key_shares_ = key_shares; + } + // Saves the |user_agent_id| that will be passed in QUIC's CHLO message. void set_user_agent_id(const std::string& user_agent_id) { user_agent_id_ = user_agent_id; @@ -408,6 +426,18 @@ class QUICHE_EXPORT QuicCryptoClientConfig : public QuicCryptoConfig { alps_use_new_codepoint_ = new_value; } + std::optional ssl_compliance_policy() const { + return ssl_compliance_policy_; + } + + void set_ssl_compliance_policy(ssl_compliance_policy_t policy) { + QUICHE_DCHECK_NE(ssl_compliance_policy_none, policy) + << "ssl_compliance_policy_none is not a valid policy to set."; + if (policy != ssl_compliance_policy_none) { + ssl_compliance_policy_.emplace(policy); + } + } + const QuicSSLConfig& ssl_config() const { return ssl_config_; } QuicSSLConfig& ssl_config() { return ssl_config_; } @@ -455,6 +485,10 @@ class QUICHE_EXPORT QuicCryptoClientConfig : public QuicCryptoConfig { // The groups to use for key exchange in the TLS handshake. std::vector preferred_groups_; + // If non-empty, the groups for which to send key shares in the initial + // ClientHello of the TLS handshake. + std::vector client_key_shares_; + // The |user_agent_id_| passed in QUIC's CHLO message. std::string user_agent_id_; @@ -484,7 +518,13 @@ class QUICHE_EXPORT QuicCryptoClientConfig : public QuicCryptoConfig { bool pad_full_hello_ = true; // Set whether ALPS uses the new codepoint or not. - bool alps_use_new_codepoint_ = false; + bool alps_use_new_codepoint_ = + GetQuicReloadableFlag(quic_client_default_enable_new_alps_codepoint); + + // If not nullopt, the SSL compliance policy to use. See documentation for + // ssl_compliance_policy_t values in BoringSSL: + // https://commondatastorage.googleapis.com/chromium-boringssl-docs/ssl.h.html#Compliance-policy-configurations + std::optional ssl_compliance_policy_ = std::nullopt; // Configs applied to BoringSSL's SSL object. TLS only. QuicSSLConfig ssl_config_; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.cc index fa85ce17bb..b6c176c3f1 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.cc @@ -31,6 +31,7 @@ #include "quiche/quic/core/crypto/key_exchange.h" #include "quiche/quic/core/crypto/p256_key_exchange.h" #include "quiche/quic/core/crypto/proof_source.h" +#include "quiche/quic/core/crypto/proof_verifier.h" #include "quiche/quic/core/crypto/quic_decrypter.h" #include "quiche/quic/core/crypto/quic_encrypter.h" #include "quiche/quic/core/crypto/quic_hkdf.h" @@ -273,13 +274,15 @@ void QuicCryptoServerConfig::ProcessClientHelloContext::Succeed( QuicCryptoServerConfig::QuicCryptoServerConfig( absl::string_view source_address_token_secret, QuicRandom* server_nonce_entropy, std::unique_ptr proof_source, - std::unique_ptr key_exchange_source) + std::unique_ptr key_exchange_source, + std::unique_ptr proof_verifier) : replay_protection_(true), chlo_multiplier_(kMultiplier), configs_lock_(), primary_config_(nullptr), next_config_promotion_time_(QuicWallTime::Zero()), proof_source_(std::move(proof_source)), + proof_verifier_(std::move(proof_verifier)), key_exchange_source_(std::move(key_exchange_source)), ssl_ctx_(TlsServerConnection::CreateSslCtx(proof_source_.get())), source_address_token_future_secs_(3600), @@ -438,7 +441,7 @@ std::unique_ptr QuicCryptoServerConfig::AddConfig( } { - absl::WriterMutexLock locked(&configs_lock_); + absl::WriterMutexLock locked(configs_lock_); if (configs_.find(config->id) != configs_.end()) { QUIC_LOG(WARNING) << "Failed to add config because another with the same " "server config id already exists: " @@ -501,7 +504,7 @@ bool QuicCryptoServerConfig::SetConfigs( QUIC_LOG(INFO) << "Updating configs:"; - absl::WriterMutexLock locked(&configs_lock_); + absl::WriterMutexLock locked(configs_lock_); ConfigMap new_configs; for (const quiche::QuicheReferenceCountedPointer& config : @@ -552,7 +555,7 @@ void QuicCryptoServerConfig::SetSourceAddressTokenKeys( } std::vector QuicCryptoServerConfig::GetConfigIds() const { - absl::ReaderMutexLock locked(&configs_lock_); + absl::ReaderMutexLock locked(configs_lock_); std::vector scids; for (auto it = configs_.begin(); it != configs_.end(); ++it) { scids.push_back(it->first); @@ -1123,21 +1126,21 @@ bool QuicCryptoServerConfig::GetCurrentConfigs( const QuicWallTime& now, absl::string_view requested_scid, quiche::QuicheReferenceCountedPointer old_primary_config, Configs* configs) const { - absl::ReaderMutexLock locked(&configs_lock_); + absl::ReaderMutexLock locked(configs_lock_); if (!primary_config_) { return false; } if (IsNextConfigReady(now)) { - configs_lock_.ReaderUnlock(); - configs_lock_.WriterLock(); + configs_lock_.unlock_shared(); + configs_lock_.lock(); SelectNewPrimaryConfig(now); QUICHE_DCHECK(primary_config_.get()); QUICHE_DCHECK_EQ(configs_.find(primary_config_->id)->second.get(), primary_config_.get()); - configs_lock_.WriterUnlock(); - configs_lock_.ReaderLock(); + configs_lock_.unlock(); + configs_lock_.lock_shared(); } if (old_primary_config != nullptr) { @@ -1359,7 +1362,7 @@ void QuicCryptoServerConfig::BuildServerConfigUpdateMessage( std::string serialized; std::string source_address_token; { - absl::ReaderMutexLock locked(&configs_lock_); + absl::ReaderMutexLock locked(configs_lock_); serialized = primary_config_->serialized; source_address_token = NewSourceAddressToken( *primary_config_->source_address_token_boxer, @@ -1717,7 +1720,7 @@ void QuicCryptoServerConfig::set_enable_serving_sct(bool enable_serving_sct) { void QuicCryptoServerConfig::AcquirePrimaryConfigChangedCb( std::unique_ptr cb) { - absl::WriterMutexLock locked(&configs_lock_); + absl::WriterMutexLock locked(configs_lock_); primary_config_changed_cb_ = std::move(cb); } @@ -1758,7 +1761,7 @@ std::string QuicCryptoServerConfig::NewSourceAddressToken( } int QuicCryptoServerConfig::NumberOfConfigs() const { - absl::ReaderMutexLock locked(&configs_lock_); + absl::ReaderMutexLock locked(configs_lock_); return configs_.size(); } @@ -1766,6 +1769,10 @@ ProofSource* QuicCryptoServerConfig::proof_source() const { return proof_source_.get(); } +ProofVerifier* QuicCryptoServerConfig::proof_verifier() const { + return proof_verifier_.get(); +} + SSL_CTX* QuicCryptoServerConfig::ssl_ctx() const { return ssl_ctx_.get(); } HandshakeFailureReason QuicCryptoServerConfig::ParseSourceAddressToken( diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.h index 1692cea6a3..42f9ef3b7d 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.h @@ -12,6 +12,7 @@ #include #include +#include "absl/base/nullability.h" #include "absl/base/thread_annotations.h" #include "absl/strings/string_view.h" #include "absl/synchronization/mutex.h" @@ -22,6 +23,7 @@ #include "quiche/quic/core/crypto/crypto_secret_boxer.h" #include "quiche/quic/core/crypto/key_exchange.h" #include "quiche/quic/core/crypto/proof_source.h" +#include "quiche/quic/core/crypto/proof_verifier.h" #include "quiche/quic/core/crypto/quic_compressed_certs_cache.h" #include "quiche/quic/core/crypto/quic_crypto_proof.h" #include "quiche/quic/core/crypto/quic_random.h" @@ -36,6 +38,7 @@ namespace quic { class CryptoHandshakeMessage; class ProofSource; +class ProofVerifier; class QuicClock; class QuicServerConfigProtobuf; struct QuicSignedServerConfig; @@ -213,7 +216,8 @@ class QUICHE_EXPORT QuicCryptoServerConfig { absl::string_view source_address_token_secret, QuicRandom* server_nonce_entropy, std::unique_ptr proof_source, - std::unique_ptr key_exchange_source); + std::unique_ptr key_exchange_source, + std::unique_ptr proof_verifier = nullptr); QuicCryptoServerConfig(const QuicCryptoServerConfig&) = delete; QuicCryptoServerConfig& operator=(const QuicCryptoServerConfig&) = delete; ~QuicCryptoServerConfig(); @@ -437,6 +441,7 @@ class QUICHE_EXPORT QuicCryptoServerConfig { } ProofSource* proof_source() const; + ProofVerifier* absl_nullable proof_verifier() const; SSL_CTX* ssl_ctx() const; @@ -903,6 +908,12 @@ class QUICHE_EXPORT QuicCryptoServerConfig { // signatures. std::unique_ptr proof_source_; + // proof_verifier_ is an optional object that can verify a client's + // certificate chain. Crypto server stream implementations can use this when + // verifying a client's certificate chain, but must be able to handle the case + // where this is null. + std::unique_ptr proof_verifier_; + // key_exchange_source_ contains an object that can provide key exchange // objects. std::unique_ptr key_exchange_source_; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/tls_server_connection.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/tls_server_connection.cc index 80a3aa79d2..d6dc35f928 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/tls_server_connection.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/tls_server_connection.cc @@ -73,37 +73,27 @@ absl::Status TlsServerConnection::ConfigureSSL( TlsServerConnection::kPrivateKeyMethod); } -void TlsServerConnection::SetCertChain( +void TlsServerConnection::AddCertChain( const std::vector& cert_chain, - const std::string& trust_anchor_id) { - if (GetQuicReloadableFlag(enable_tls_trust_anchor_ids)) { - QUIC_RELOADABLE_FLAG_COUNT_N(enable_tls_trust_anchor_ids, 1, 2); - bssl::UniquePtr credential(SSL_CREDENTIAL_new_x509()); - SSL_CREDENTIAL_set1_cert_chain(credential.get(), cert_chain.data(), - cert_chain.size()); - if (ssl_config().signing_algorithm_prefs.has_value()) { - SSL_CREDENTIAL_set1_signing_algorithm_prefs( - credential.get(), ssl_config().signing_algorithm_prefs->data(), - ssl_config().signing_algorithm_prefs->size()); - } - SSL_CREDENTIAL_set_private_key_method( - credential.get(), &TlsServerConnection::kPrivateKeyMethod); -#if defined(BORINGSSL_API_VERSION) && BORINGSSL_API_VERSION >= 36 - if (!trust_anchor_id.empty()) { - SSL_CREDENTIAL_set1_trust_anchor_id( - credential.get(), - reinterpret_cast(trust_anchor_id.data()), - trust_anchor_id.size()); - SSL_CREDENTIAL_set_must_match_issuer(credential.get(), 1); - } -#else - (void)trust_anchor_id; // Suppress unused parameter error. -#endif - SSL_add1_credential(ssl(), credential.get()); - } else { - SSL_set_chain_and_key(ssl(), cert_chain.data(), cert_chain.size(), nullptr, - &TlsServerConnection::kPrivateKeyMethod); + absl::string_view trust_anchor_id) { + bssl::UniquePtr credential(SSL_CREDENTIAL_new_x509()); + SSL_CREDENTIAL_set1_cert_chain(credential.get(), cert_chain.data(), + cert_chain.size()); + if (ssl_config().signing_algorithm_prefs.has_value()) { + SSL_CREDENTIAL_set1_signing_algorithm_prefs( + credential.get(), ssl_config().signing_algorithm_prefs->data(), + ssl_config().signing_algorithm_prefs->size()); } + SSL_CREDENTIAL_set_private_key_method( + credential.get(), &TlsServerConnection::kPrivateKeyMethod); + if (!trust_anchor_id.empty()) { + SSL_CREDENTIAL_set1_trust_anchor_id( + credential.get(), + reinterpret_cast(trust_anchor_id.data()), + trust_anchor_id.size()); + SSL_CREDENTIAL_set_must_match_issuer(credential.get(), 1); + } + SSL_add1_credential(ssl(), credential.get()); } void TlsServerConnection::SetClientCertMode(ClientCertMode client_cert_mode) { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/tls_server_connection.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/tls_server_connection.h index dc8a0a5b0a..9e4fedeb17 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/tls_server_connection.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/tls_server_connection.h @@ -133,12 +133,14 @@ class QUICHE_EXPORT TlsServerConnection : public TlsConnection { absl::Status ConfigureSSL( ProofSourceHandleCallback::ConfigureSSLFunc configure_ssl); - // If |trust_anchor_id| is non-empty, it will be configured as the - // trust anchor ID for |cert_chain|, and BoringSSL will be - // configured to enforce issuer matching on this certificate. See + // Adds a certificate chain to `ssl()` with `SSL_add1_credential()`. Call this + // method with cert chains in decreasing order of preference. If + // `trust_anchor_id` is non-empty, it will be configured as the trust anchor + // ID for `cert_chain`, and BoringSSL will be configured to enforce issuer + // matching on this certificate. See // https://tlswg.org/tls-trust-anchor-ids/draft-ietf-tls-trust-anchor-ids.html#section-4.1. - void SetCertChain(const std::vector& cert_chain, - const std::string& trust_anchor_id); + void AddCertChain(const std::vector& cert_chain, + absl::string_view trust_anchor_id); // Set the client cert mode to be used on this connection. This should be // called right after cert selection at the latest, otherwise it is too late diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc index bdbae3b5fb..d8235e2575 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc @@ -35,6 +35,19 @@ namespace quic { +namespace { +std::string ObfuscateSni(const absl::string_view& input) { + static constexpr char kObfuscationKey[] = {0x42, 0x7b, 0x40, 0x63, 0x11, 0x2a, + 0x6f, 0x05, 0x58, 0x1f, 0x7f, 0x33, + 0x32, 0x4d, 0x64, 0x16}; + std::string output = std::string(input); + for (size_t i = 0; i < output.size(); ++i) { + output[i] ^= kObfuscationKey[i % sizeof(kObfuscationKey)]; + } + return output; +} +} // namespace + // Values of the TransportParameterId enum as defined in the // "Transport Parameter Encoding" section of draft-ietf-quic-transport. // When parameters are encoded, one of these enum values is used to indicate @@ -65,6 +78,7 @@ enum TransportParameters::TransportParameterId : uint64_t { kDiscard = 0x173E, kGoogleHandshakeMessage = 0x26ab, + kDebuggingSni = 0x219bbcd0, kInitialRoundTripTime = 0x3127, kGoogleConnectionOptions = 0x3128, @@ -142,6 +156,8 @@ std::string TransportParameterIdToString( return "discard"; case TransportParameters::kGoogleHandshakeMessage: return "google_handshake_message"; + case TransportParameters::kDebuggingSni: + return "debugging_sni"; case TransportParameters::kInitialRoundTripTime: return "initial_round_trip_time"; case TransportParameters::kGoogleConnectionOptions: @@ -223,6 +239,7 @@ bool TransportParameterIdIsKnown( case TransportParameters::kMaxDatagramFrameSize: case TransportParameters::kDiscard: case TransportParameters::kGoogleHandshakeMessage: + case TransportParameters::kDebuggingSni: case TransportParameters::kInitialRoundTripTime: case TransportParameters::kGoogleConnectionOptions: case TransportParameters::kGoogleQuicVersion: @@ -478,6 +495,10 @@ std::string TransportParameters::ToString() const { TransportParameterIdToString(kGoogleHandshakeMessage), " length: ", google_handshake_message->length()); } + if (debugging_sni.has_value()) { + absl::StrAppend(&rv, " ", TransportParameterIdToString(kDebuggingSni), + " value: ", *debugging_sni); + } rv += initial_round_trip_time_us.ToString(/*for_use_in_list=*/true); if (google_connection_options.has_value()) { rv += " " + TransportParameterIdToString(kGoogleConnectionOptions) + " "; @@ -566,6 +587,7 @@ TransportParameters::TransportParameters(const TransportParameters& other) initial_round_trip_time_us(other.initial_round_trip_time_us), discard_length(other.discard_length), google_handshake_message(other.google_handshake_message), + debugging_sni(other.debugging_sni), google_connection_options(other.google_connection_options), custom_parameters(other.custom_parameters) { if (other.preferred_address) { @@ -609,6 +631,7 @@ bool TransportParameters::operator==(const TransportParameters& rhs) const { rhs.initial_round_trip_time_us.value() && discard_length == rhs.discard_length && google_handshake_message == rhs.google_handshake_message && + debugging_sni == rhs.debugging_sni && google_connection_options == rhs.google_connection_options && custom_parameters == rhs.custom_parameters)) { return false; @@ -684,6 +707,10 @@ bool TransportParameters::AreValid(std::string* error_details) const { *error_details = "Server cannot send google_handshake_message"; return false; } + if (perspective == Perspective::IS_SERVER && debugging_sni.has_value()) { + *error_details = "Server cannot send debugging_sni"; + return false; + } if (perspective == Perspective::IS_SERVER && initial_round_trip_time_us.value() > 0) { *error_details = "Server cannot send initial round trip time"; @@ -804,6 +831,7 @@ bool SerializeTransportParameters(const TransportParameters& in, kIntegerParameterLength + // initial_round_trip_time_us kTypeAndValueLength + // discard kTypeAndValueLength + // google_handshake_message + kTypeAndValueLength + // debugging_sni kTypeAndValueLength + // google_connection_options kTypeAndValueLength; // google-version @@ -826,6 +854,7 @@ bool SerializeTransportParameters(const TransportParameters& in, TransportParameters::kReliableStreamReset, TransportParameters::kDiscard, TransportParameters::kGoogleHandshakeMessage, + TransportParameters::kDebuggingSni, TransportParameters::kInitialRoundTripTime, TransportParameters::kDisableActiveMigration, TransportParameters::kPreferredAddress, @@ -866,6 +895,10 @@ bool SerializeTransportParameters(const TransportParameters& in, if (in.google_handshake_message.has_value()) { max_transport_param_length += in.google_handshake_message->length(); } + // debugging_sni. + if (in.debugging_sni.has_value()) { + max_transport_param_length += in.debugging_sni->length(); + } // Add a random GREASE transport parameter, as defined in the // "Reserved Transport Parameters" section of RFC 9000. @@ -1078,6 +1111,21 @@ bool SerializeTransportParameters(const TransportParameters& in, } } } break; + // debugging_sni. + case TransportParameters::kDebuggingSni: { + if (in.debugging_sni.has_value()) { + QUICHE_DCHECK_EQ(Perspective::IS_CLIENT, in.perspective); + // Obfuscate the SNI before writing it to the transport parameters. + std::string obfuscated_sni = ObfuscateSni(*in.debugging_sni); + if (!writer.WriteVarInt62(TransportParameters::kDebuggingSni) || + !writer.WriteStringPieceVarInt62(obfuscated_sni)) { + QUIC_BUG(failed_to_write_debugging_sni) + << "Failed to write debugging_sni: " << *in.debugging_sni + << " obfuscated to: " << obfuscated_sni << " for " << in; + return false; + } + } + } break; // initial_round_trip_time_us case TransportParameters::kInitialRoundTripTime: { if (!in.initial_round_trip_time_us.Write(&writer)) { @@ -1526,6 +1574,14 @@ bool ParseTransportParameters(ParsedQuicVersion version, out->google_handshake_message = std::string(value_reader.ReadRemainingPayload()); break; + case TransportParameters::kDebuggingSni: + if (out->debugging_sni.has_value()) { + *error_details = "Received a second debugging_sni"; + return false; + } + // Deobfuscate the SNI and store it in the transport parameters. + out->debugging_sni = ObfuscateSni(value_reader.ReadRemainingPayload()); + break; case TransportParameters::kInitialRoundTripTime: parse_success = out->initial_round_trip_time_us.Read(&value_reader, error_details); @@ -1762,5 +1818,4 @@ void DegreaseTransportParameters(TransportParameters& parameters) { parameters.version_information->other_versions = std::move(clean_versions); } } - } // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.h index 7467814ff7..e82a42b67f 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.h @@ -265,6 +265,10 @@ struct QUICHE_EXPORT TransportParameters { // Google internal handshake message. std::optional google_handshake_message; + // Debugging Server Name Indication. This is used to send the obfuscated SNI + // in the transport parameters to the server for debugging purposes only. + std::optional debugging_sni; + // Google-specific connection options. std::optional google_connection_options; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_datagram_frame.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_datagram_frame.cc new file mode 100644 index 0000000000..6b5589898e --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_datagram_frame.cc @@ -0,0 +1,45 @@ +// Copyright (c) 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "quiche/quic/core/frames/quic_datagram_frame.h" + +#include +#include + +#include "quiche/quic/core/quic_constants.h" +#include "quiche/quic/platform/api/quic_logging.h" +#include "quiche/common/quiche_mem_slice.h" + +namespace quic { + +QuicDatagramFrame::QuicDatagramFrame(QuicDatagramId datagram_id) + : datagram_id(datagram_id), data(nullptr), datagram_length(0) {} + +QuicDatagramFrame::QuicDatagramFrame(QuicDatagramId datagram_id, + absl::Span span) + : datagram_id(datagram_id), data(nullptr), datagram_length(0) { + for (quiche::QuicheMemSlice& slice : span) { + if (slice.empty()) { + continue; + } + datagram_length += slice.length(); + datagram_data.push_back(std::move(slice)); + } +} +QuicDatagramFrame::QuicDatagramFrame(QuicDatagramId datagram_id, + quiche::QuicheMemSlice slice) + : QuicDatagramFrame(datagram_id, absl::MakeSpan(&slice, 1)) {} + +QuicDatagramFrame::QuicDatagramFrame(const char* data, QuicPacketLength length) + : datagram_id(0), data(data), datagram_length(length) {} + +QuicDatagramFrame::~QuicDatagramFrame() {} + +std::ostream& operator<<(std::ostream& os, const QuicDatagramFrame& s) { + os << " datagram_id: " << s.datagram_id + << ", datagram_length: " << s.datagram_length << " }\n"; + return os; +} + +} // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_datagram_frame.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_datagram_frame.h new file mode 100644 index 0000000000..f19a743b7e --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_datagram_frame.h @@ -0,0 +1,51 @@ +// Copyright (c) 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_CORE_FRAMES_QUIC_DATAGRAM_FRAME_H_ +#define QUICHE_QUIC_CORE_FRAMES_QUIC_DATAGRAM_FRAME_H_ + +#include "absl/container/inlined_vector.h" +#include "absl/types/span.h" +#include "quiche/quic/core/quic_types.h" +#include "quiche/quic/platform/api/quic_export.h" +#include "quiche/common/quiche_mem_slice.h" + +namespace quic { + +using QuicDatagramData = absl::InlinedVector; + +struct QUICHE_EXPORT QuicDatagramFrame { + QuicDatagramFrame() = default; + explicit QuicDatagramFrame(QuicDatagramId datagram_id); + QuicDatagramFrame(QuicDatagramId datagram_id, + absl::Span span); + QuicDatagramFrame(QuicDatagramId datagram_id, quiche::QuicheMemSlice slice); + QuicDatagramFrame(const char* data, QuicPacketLength length); + + QuicDatagramFrame(const QuicDatagramFrame& other) = delete; + QuicDatagramFrame& operator=(const QuicDatagramFrame& other) = delete; + + QuicDatagramFrame(QuicDatagramFrame&& other) = default; + QuicDatagramFrame& operator=(QuicDatagramFrame&& other) = default; + + ~QuicDatagramFrame(); + + friend QUICHE_EXPORT std::ostream& operator<<(std::ostream& os, + const QuicDatagramFrame& s); + + // datagram_id is only used on the sender side and does not get serialized on + // wire. + QuicDatagramId datagram_id = 0; + // Not owned, only used on read path. + const char* data = nullptr; + // Total length of datagram_data, must be fit into one packet. + QuicPacketLength datagram_length = 0; + + // The actual datagram data which is reference counted, used on write path. + QuicDatagramData datagram_data; +}; + +} // namespace quic + +#endif // QUICHE_QUIC_CORE_FRAMES_QUIC_DATAGRAM_FRAME_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_frame.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_frame.cc index 0c4c411a16..8451bb9210 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_frame.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_frame.cc @@ -79,8 +79,8 @@ QuicFrame::QuicFrame(QuicPathChallengeFrame frame) QuicFrame::QuicFrame(QuicStopSendingFrame frame) : stop_sending_frame(frame) {} -QuicFrame::QuicFrame(QuicMessageFrame* frame) - : type(MESSAGE_FRAME), message_frame(frame) {} +QuicFrame::QuicFrame(QuicDatagramFrame* frame) + : type(DATAGRAM_FRAME), datagram_frame(frame) {} QuicFrame::QuicFrame(QuicNewTokenFrame* frame) : type(NEW_TOKEN_FRAME), new_token_frame(frame) {} @@ -152,8 +152,8 @@ void DeleteFrame(QuicFrame* frame) { case RETIRE_CONNECTION_ID_FRAME: delete frame->retire_connection_id_frame; break; - case MESSAGE_FRAME: - delete frame->message_frame; + case DATAGRAM_FRAME: + delete frame->datagram_frame; break; case CRYPTO_FRAME: delete frame->crypto_frame; @@ -183,9 +183,9 @@ void RemoveFramesForStream(QuicFrames* frames, QuicStreamId stream_id) { } } -bool HasMessageFrame(const QuicFrames& frames) { +bool HasDatagramFrame(const QuicFrames& frames) { for (const QuicFrame& frame : frames) { - if (frame.type == MESSAGE_FRAME) { + if (frame.type == DATAGRAM_FRAME) { return true; } } @@ -417,14 +417,16 @@ QuicFrame CopyQuicFrame(quiche::QuicheBufferAllocator* allocator, case STOP_SENDING_FRAME: copy = QuicFrame(QuicStopSendingFrame(frame.stop_sending_frame)); break; - case MESSAGE_FRAME: - copy = QuicFrame(new QuicMessageFrame(frame.message_frame->message_id)); - copy.message_frame->data = frame.message_frame->data; - copy.message_frame->message_length = frame.message_frame->message_length; - for (const auto& slice : frame.message_frame->message_data) { + case DATAGRAM_FRAME: + copy = + QuicFrame(new QuicDatagramFrame(frame.datagram_frame->datagram_id)); + copy.datagram_frame->data = frame.datagram_frame->data; + copy.datagram_frame->datagram_length = + frame.datagram_frame->datagram_length; + for (const auto& slice : frame.datagram_frame->datagram_data) { quiche::QuicheBuffer buffer = quiche::QuicheBuffer::Copy(allocator, slice.AsStringView()); - copy.message_frame->message_data.push_back( + copy.datagram_frame->datagram_data.push_back( quiche::QuicheMemSlice(std::move(buffer))); } break; @@ -539,8 +541,8 @@ std::ostream& operator<<(std::ostream& os, const QuicFrame& frame) { case STOP_SENDING_FRAME: os << "type { STOP_SENDING } " << frame.stop_sending_frame; break; - case MESSAGE_FRAME: - os << "type { MESSAGE_FRAME }" << *(frame.message_frame); + case DATAGRAM_FRAME: + os << "type { DATAGRAM_FRAME }" << *(frame.datagram_frame); break; case NEW_TOKEN_FRAME: os << "type { NEW_TOKEN_FRAME }" << *(frame.new_token_frame); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_frame.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_frame.h index 3485e4e808..a9eb9d7827 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_frame.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_frame.h @@ -16,11 +16,11 @@ #include "quiche/quic/core/frames/quic_blocked_frame.h" #include "quiche/quic/core/frames/quic_connection_close_frame.h" #include "quiche/quic/core/frames/quic_crypto_frame.h" +#include "quiche/quic/core/frames/quic_datagram_frame.h" #include "quiche/quic/core/frames/quic_goaway_frame.h" #include "quiche/quic/core/frames/quic_handshake_done_frame.h" #include "quiche/quic/core/frames/quic_immediate_ack_frame.h" #include "quiche/quic/core/frames/quic_max_streams_frame.h" -#include "quiche/quic/core/frames/quic_message_frame.h" #include "quiche/quic/core/frames/quic_mtu_discovery_frame.h" #include "quiche/quic/core/frames/quic_new_connection_id_frame.h" #include "quiche/quic/core/frames/quic_new_token_frame.h" @@ -75,7 +75,7 @@ struct QUICHE_EXPORT QuicFrame { explicit QuicFrame(QuicNewConnectionIdFrame* frame); explicit QuicFrame(QuicRetireConnectionIdFrame* frame); explicit QuicFrame(QuicNewTokenFrame* frame); - explicit QuicFrame(QuicMessageFrame* message_frame); + explicit QuicFrame(QuicDatagramFrame* datagram_frame); explicit QuicFrame(QuicCryptoFrame* crypto_frame); explicit QuicFrame(QuicAckFrequencyFrame* ack_frequency_frame); explicit QuicFrame(QuicResetStreamAtFrame* reset_stream_at_frame); @@ -118,7 +118,7 @@ struct QUICHE_EXPORT QuicFrame { QuicGoAwayFrame* goaway_frame; QuicNewConnectionIdFrame* new_connection_id_frame; QuicRetireConnectionIdFrame* retire_connection_id_frame; - QuicMessageFrame* message_frame; + QuicDatagramFrame* datagram_frame; QuicCryptoFrame* crypto_frame; QuicAckFrequencyFrame* ack_frequency_frame; QuicNewTokenFrame* new_token_frame; @@ -150,7 +150,7 @@ QUICHE_EXPORT void RemoveFramesForStream(QuicFrames* frames, QuicStreamId stream_id); // Returns true if |frames| contains at least one message frame. -QUICHE_EXPORT bool HasMessageFrame(const QuicFrames& frames); +QUICHE_EXPORT bool HasDatagramFrame(const QuicFrames& frames); // Returns true if |type| is a retransmittable control frame. QUICHE_EXPORT bool IsControlFrame(QuicFrameType type); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_message_frame.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_message_frame.cc deleted file mode 100644 index 6e6bd56c9f..0000000000 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_message_frame.cc +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "quiche/quic/core/frames/quic_message_frame.h" - -#include -#include - -#include "quiche/quic/core/quic_constants.h" -#include "quiche/quic/platform/api/quic_logging.h" -#include "quiche/common/quiche_mem_slice.h" - -namespace quic { - -QuicMessageFrame::QuicMessageFrame(QuicMessageId message_id) - : message_id(message_id), data(nullptr), message_length(0) {} - -QuicMessageFrame::QuicMessageFrame(QuicMessageId message_id, - absl::Span span) - : message_id(message_id), data(nullptr), message_length(0) { - for (quiche::QuicheMemSlice& slice : span) { - if (slice.empty()) { - continue; - } - message_length += slice.length(); - message_data.push_back(std::move(slice)); - } -} -QuicMessageFrame::QuicMessageFrame(QuicMessageId message_id, - quiche::QuicheMemSlice slice) - : QuicMessageFrame(message_id, absl::MakeSpan(&slice, 1)) {} - -QuicMessageFrame::QuicMessageFrame(const char* data, QuicPacketLength length) - : message_id(0), data(data), message_length(length) {} - -QuicMessageFrame::~QuicMessageFrame() {} - -std::ostream& operator<<(std::ostream& os, const QuicMessageFrame& s) { - os << " message_id: " << s.message_id - << ", message_length: " << s.message_length << " }\n"; - return os; -} - -} // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_message_frame.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_message_frame.h deleted file mode 100644 index 3afb18e280..0000000000 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/frames/quic_message_frame.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef QUICHE_QUIC_CORE_FRAMES_QUIC_MESSAGE_FRAME_H_ -#define QUICHE_QUIC_CORE_FRAMES_QUIC_MESSAGE_FRAME_H_ - -#include "absl/container/inlined_vector.h" -#include "absl/types/span.h" -#include "quiche/quic/core/quic_types.h" -#include "quiche/quic/platform/api/quic_export.h" -#include "quiche/common/quiche_mem_slice.h" - -namespace quic { - -using QuicMessageData = absl::InlinedVector; - -struct QUICHE_EXPORT QuicMessageFrame { - QuicMessageFrame() = default; - explicit QuicMessageFrame(QuicMessageId message_id); - QuicMessageFrame(QuicMessageId message_id, - absl::Span span); - QuicMessageFrame(QuicMessageId message_id, quiche::QuicheMemSlice slice); - QuicMessageFrame(const char* data, QuicPacketLength length); - - QuicMessageFrame(const QuicMessageFrame& other) = delete; - QuicMessageFrame& operator=(const QuicMessageFrame& other) = delete; - - QuicMessageFrame(QuicMessageFrame&& other) = default; - QuicMessageFrame& operator=(QuicMessageFrame&& other) = default; - - ~QuicMessageFrame(); - - friend QUICHE_EXPORT std::ostream& operator<<(std::ostream& os, - const QuicMessageFrame& s); - - // message_id is only used on the sender side and does not get serialized on - // wire. - QuicMessageId message_id = 0; - // Not owned, only used on read path. - const char* data = nullptr; - // Total length of message_data, must be fit into one packet. - QuicPacketLength message_length = 0; - - // The actual message data which is reference counted, used on write path. - QuicMessageData message_data; -}; - -} // namespace quic - -#endif // QUICHE_QUIC_CORE_FRAMES_QUIC_MESSAGE_FRAME_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_connection_migration_manager.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_connection_migration_manager.cc new file mode 100644 index 0000000000..bf116f6b4e --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_connection_migration_manager.cc @@ -0,0 +1,1529 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "quiche/quic/core/http/quic_connection_migration_manager.h" + +#include +#include +#include +#include +#include +#include + +#include "absl/base/nullability.h" +#include "absl/strings/str_format.h" +#include "absl/strings/string_view.h" +#include "quiche/quic/core/http/quic_spdy_client_session_with_migration.h" +#include "quiche/quic/core/quic_alarm.h" +#include "quiche/quic/core/quic_clock.h" +#include "quiche/quic/core/quic_config.h" +#include "quiche/quic/core/quic_connection_context.h" +#include "quiche/quic/core/quic_error_codes.h" +#include "quiche/quic/core/quic_force_blockable_packet_writer.h" +#include "quiche/quic/core/quic_packet_writer.h" +#include "quiche/quic/core/quic_path_context_factory.h" +#include "quiche/quic/core/quic_path_validator.h" +#include "quiche/quic/core/quic_time.h" +#include "quiche/quic/core/quic_types.h" +#include "quiche/quic/platform/api/quic_client_stats.h" +#include "quiche/quic/platform/api/quic_logging.h" +#include "quiche/quic/platform/api/quic_socket_address.h" +#include "quiche/common/platform/api/quiche_client_stats.h" +#include "quiche/common/platform/api/quiche_logging.h" +#include "quiche/common/quiche_callbacks.h" + +namespace quic { + +namespace { +// Time to wait (in seconds) when no networks are available and +// migrating sessions need to wait for a new network to connect. +constexpr int kWaitTimeForNewNetworkSecs = 10; +// Minimum time to wait (in seconds) when retrying to migrate back to the +// default network. +constexpr int kMinRetryTimeForDefaultNetworkSecs = 1; + +class WaitForMigrationDelegate : public QuicAlarm::Delegate { + public: + explicit WaitForMigrationDelegate( + QuicConnectionMigrationManager* absl_nonnull migration_manager, + QuicConnectionContext* absl_nullable context) + : migration_manager_(migration_manager), context_(context) {} + WaitForMigrationDelegate(const WaitForMigrationDelegate&) = delete; + WaitForMigrationDelegate& operator=(const WaitForMigrationDelegate&) = delete; + QuicConnectionContext* GetConnectionContext() override { return context_; } + void OnAlarm() override { migration_manager_->OnMigrationTimeout(); } + + private: + QuicConnectionMigrationManager* absl_nonnull migration_manager_; + QuicConnectionContext* absl_nullable context_; +}; + +class MigrateBackToDefaultNetworkDelegate : public QuicAlarm::Delegate { + public: + MigrateBackToDefaultNetworkDelegate( + QuicConnectionMigrationManager* absl_nonnull migration_manager, + QuicConnectionContext* absl_nullable context) + : migration_manager_(migration_manager), context_(context) {} + MigrateBackToDefaultNetworkDelegate( + const MigrateBackToDefaultNetworkDelegate&) = delete; + MigrateBackToDefaultNetworkDelegate& operator=( + const MigrateBackToDefaultNetworkDelegate&) = delete; + QuicConnectionContext* GetConnectionContext() override { return context_; } + void OnAlarm() override { + migration_manager_->MaybeRetryMigrateBackToDefaultNetwork(); + } + + private: + QuicConnectionMigrationManager* absl_nonnull migration_manager_; + QuicConnectionContext* absl_nullable context_; +}; + +class RunPendingCallbackDelegate : public QuicAlarm::Delegate { + public: + RunPendingCallbackDelegate( + QuicConnectionMigrationManager* absl_nonnull migration_manager, + QuicConnectionContext* absl_nullable context) + : migration_manager_(migration_manager), context_(context) {} + RunPendingCallbackDelegate(const RunPendingCallbackDelegate&) = delete; + RunPendingCallbackDelegate& operator=(const RunPendingCallbackDelegate&) = + delete; + QuicConnectionContext* GetConnectionContext() override { return context_; } + void OnAlarm() override { migration_manager_->RunPendingCallbacks(); } + + private: + QuicConnectionMigrationManager* absl_nonnull migration_manager_; + QuicConnectionContext* absl_nullable context_; +}; + +// This class handles path validation results associated with connection +// migration which depends on probing. +class ConnectionMigrationValidationResultDelegate + : public quic::QuicPathValidator::ResultDelegate { + public: + // `migration_manager` should out live this instance. + explicit ConnectionMigrationValidationResultDelegate( + QuicConnectionMigrationManager* absl_nonnull migration_manager) + : migration_manager_(migration_manager) {} + void OnPathValidationSuccess( + std::unique_ptr context, + quic::QuicTime start_time) override { + migration_manager_->OnConnectionMigrationProbeSucceeded(std::move(context), + start_time); + } + void OnPathValidationFailure( + std::unique_ptr context) override { + migration_manager_->OnProbeFailed(std::move(context)); + } + + private: + // `migration_manager_` should out live |this|. + QuicConnectionMigrationManager* absl_nonnull migration_manager_; +}; + +// This class handles path validation results associated with port migration. +class PortMigrationValidationResultDelegate + : public quic::QuicPathValidator::ResultDelegate { + public: + // `migration_manager` should out live this instance. + explicit PortMigrationValidationResultDelegate( + QuicConnectionMigrationManager* absl_nonnull migration_manager) + : migration_manager_(migration_manager) {} + void OnPathValidationSuccess( + std::unique_ptr context, + quic::QuicTime start_time) override { + migration_manager_->OnPortMigrationProbeSucceeded(std::move(context), + start_time); + } + void OnPathValidationFailure( + std::unique_ptr context) override { + migration_manager_->OnProbeFailed(std::move(context)); + } + + private: + // `migration_manager_` should out live |this|. + QuicConnectionMigrationManager* absl_nonnull migration_manager_; +}; + +// This class handles path validation results associated with migrating to +// server preferred address. +class ServerPreferredAddressValidationResultDelegate + : public quic::QuicPathValidator::ResultDelegate { + public: + // `migration_manager` should out live this instance. + explicit ServerPreferredAddressValidationResultDelegate( + QuicConnectionMigrationManager* absl_nonnull migration_manager) + : migration_manager_(migration_manager) {} + void OnPathValidationSuccess( + std::unique_ptr context, + quic::QuicTime start_time) override { + migration_manager_->OnServerPreferredAddressProbeSucceeded( + std::move(context), start_time); + } + void OnPathValidationFailure( + std::unique_ptr context) override { + migration_manager_->OnProbeFailed(std::move(context)); + } + + private: + QuicConnectionMigrationManager* absl_nonnull migration_manager_; +}; + +std::string MigrationCauseToString(MigrationCause cause) { + switch (cause) { + case MigrationCause::UNKNOWN_CAUSE: + return "Unknown"; + case MigrationCause::ON_NETWORK_CONNECTED: + return "OnNetworkConnected"; + case MigrationCause::ON_NETWORK_DISCONNECTED: + return "OnNetworkDisconnected"; + case MigrationCause::ON_WRITE_ERROR: + return "OnWriteError"; + case MigrationCause::ON_NETWORK_MADE_DEFAULT: + return "OnNetworkMadeDefault"; + case MigrationCause::ON_MIGRATE_BACK_TO_DEFAULT_NETWORK: + return "OnMigrateBackToDefaultNetwork"; + case MigrationCause::CHANGE_NETWORK_ON_PATH_DEGRADING: + return "OnPathDegrading"; + case MigrationCause::CHANGE_PORT_ON_PATH_DEGRADING: + return "ChangePortOnPathDegrading"; + case MigrationCause::NEW_NETWORK_CONNECTED_POST_PATH_DEGRADING: + return "NewNetworkConnectedPostPathDegrading"; + case MigrationCause::ON_SERVER_PREFERRED_ADDRESS_AVAILABLE: + return "OnServerPreferredAddressAvailable"; + default: + QUICHE_NOTREACHED(); + break; + } + return "InvalidCause"; +} + +} // namespace + +QuicConnectionMigrationManager::QuicConnectionMigrationManager( + QuicSpdyClientSessionWithMigration* absl_nonnull session, + const quic::QuicClock* absl_nonnull clock, + QuicNetworkHandle default_network, QuicNetworkHandle current_network, + QuicPathContextFactory* absl_nullable path_context_factory, + const QuicConnectionMigrationConfig& config) + : session_(session), + connection_(session->connection()), + clock_(clock), + default_network_(default_network), + current_network_(current_network), + path_context_factory_(path_context_factory), + config_(config), + migrate_back_to_default_timer_(connection_->alarm_factory()->CreateAlarm( + new MigrateBackToDefaultNetworkDelegate(this, + connection_->context()))), + wait_for_migration_alarm_(connection_->alarm_factory()->CreateAlarm( + new WaitForMigrationDelegate(this, connection_->context()))), + run_pending_callbacks_alarm_(connection_->alarm_factory()->CreateAlarm( + new RunPendingCallbackDelegate(this, connection_->context()))) { + QUICHE_BUG_IF(gquic_session_created_on_non_default_network, + default_network_ != current_network_ && + !session_->version().HasIetfQuicFrames()); + QUICHE_BUG_IF(inconsistent_migrate_session_config, + config_.migrate_session_early && + !config_.migrate_session_on_network_change) + << "migrate_session_early must be false if " + "migrate_session_on_network_change is false."; +} + +QuicConnectionMigrationManager::~QuicConnectionMigrationManager() { + wait_for_migration_alarm_->PermanentCancel(); + migrate_back_to_default_timer_->PermanentCancel(); + run_pending_callbacks_alarm_->PermanentCancel(); +} + +void QuicConnectionMigrationManager::OnNetworkConnected( + QuicNetworkHandle network) { + if (!session_->version().HasIetfQuicFrames()) { + return; + } + if (connection_->IsPathDegrading()) { + quic::QuicTimeDelta duration = + clock_->Now() - most_recent_path_degrading_timestamp_; + QUICHE_CLIENT_HISTOGRAM_TIMES( + "QuicNetworkDegradingDurationTillConnected", duration, + quic::QuicTimeDelta::FromMilliseconds(1), + quic::QuicTimeDelta::FromSeconds(10 * 60), 50, + "Time elapsed since last network degrading detected."); + } + if (debug_visitor_) { + debug_visitor_->OnNetworkConnected(network); + } + if (!config_.migrate_session_on_network_change) { + return; + } + // If there was no migration waiting for new network and the path is not + // degrading, ignore this signal. + if (!wait_for_new_network_ && !connection_->IsPathDegrading()) { + return; + } + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationAfterNetworkConnected(network); + } + if (connection_->IsPathDegrading()) { + current_migration_cause_ = + MigrationCause::NEW_NETWORK_CONNECTED_POST_PATH_DEGRADING; + } + if (wait_for_new_network_) { + wait_for_new_network_ = false; + if (debug_visitor_) { + debug_visitor_->OnWaitingForNewNetworkSucceeded(network); + } + if (current_migration_cause_ == MigrationCause::ON_WRITE_ERROR) { + ++current_migrations_to_non_default_network_on_write_error_; + } + // `wait_for_new_network_` is true, there was no working network previously. + // `network` is now the only possible candidate, migrate immediately. + MigrateNetworkImmediately(network); + } else { + // The connection is path degrading. + QUICHE_DCHECK(connection_->IsPathDegrading()); + MaybeProbeAndMigrateToAlternateNetworkOnPathDegrading(); + } +} + +void QuicConnectionMigrationManager::OnNetworkDisconnected( + QuicNetworkHandle disconnected_network) { + RecordMetricsOnNetworkDisconnected(); + if (debug_visitor_) { + debug_visitor_->OnNetworkDisconnected(disconnected_network); + } + if (!session_->version().HasIetfQuicFrames()) { + return; + } + if (!config_.migrate_session_on_network_change) { + return; + } + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationAfterNetworkDisconnected( + disconnected_network); + } + // Stop probing the disconnected network if there is one. + QuicPathValidationContext* context = connection_->GetPathValidationContext(); + if (context && context->network() == disconnected_network && + context->peer_address() == connection_->peer_address()) { + connection_->CancelPathValidation(); + } + + if (disconnected_network == default_network_) { + QUIC_DLOG(INFO) << "Default network: " << default_network_ + << " is disconnected."; + default_network_ = kInvalidNetworkHandle; + current_migrations_to_non_default_network_on_write_error_ = 0; + } + // Ignore the signal if the current active network is not affected. + if (current_network() != disconnected_network) { + QUIC_DVLOG(1) << "Client's current default network is not affected by the " + << "disconnected one."; + return; + } + if (pending_migrate_session_on_write_error_) { + QUIC_DVLOG(1) + << "Ignoring a network disconnection signal because a " + "connection migration is happening due to a previous write error."; + return; + } + if (config_.ignore_disconnect_signal_during_probing && + current_migration_cause_ == MigrationCause::ON_NETWORK_MADE_DEFAULT) { + QUIC_DVLOG(1) + << "Ignoring a network disconnection signal because a " + "connection migration is happening on the default network."; + return; + } + current_migration_cause_ = MigrationCause::ON_NETWORK_DISCONNECTED; + RecordHandshakeStatusOnMigrationSignal(); + if (!session_->OneRttKeysAvailable()) { + // Close the connection if handshake has not completed. Migration before + // that is not allowed. + // TODO(danzh): the current behavior aligns with Chrome. But according to + // IETF spec, check handshake confirmed instead. + session_->OnConnectionToBeClosedDueToMigrationError( + current_migration_cause_, + QUIC_CONNECTION_MIGRATION_HANDSHAKE_UNCONFIRMED); + connection_->CloseConnection( + QUIC_CONNECTION_MIGRATION_HANDSHAKE_UNCONFIRMED, + "Network disconnected before handshake complete.", + ConnectionCloseBehavior::SILENT_CLOSE); + return; + } + // Attempt to find alternative network. + QuicNetworkHandle new_network = + session_->FindAlternateNetwork(disconnected_network); + if (new_network == kInvalidNetworkHandle) { + OnNoNewNetwork(); + return; + } + // Current network is being disconnected, migrate immediately to the + // alternative network. + MigrateNetworkImmediately(new_network); +} + +void QuicConnectionMigrationManager::MigrateNetworkImmediately( + QuicNetworkHandle network) { + // There is no choice but to migrate to |network|. If any error encountered, + // close the session. When migration succeeds: + // - if no longer on the default network, start timer to migrate back; + // - otherwise, it's brought to default network, cancel the running timer to + // migrate back. + QUICHE_DCHECK(config_.migrate_session_on_network_change); + if (MaybeCloseIdleSession(/*has_write_error=*/false, + ConnectionCloseBehavior::SILENT_CLOSE)) { + return; + } + // Do not migrate if connection migration is disabled. + if (migration_disabled_) { + session_->OnConnectionToBeClosedDueToMigrationError( + current_migration_cause_, QUIC_CONNECTION_MIGRATION_DISABLED_BY_CONFIG); + connection_->CloseConnection(QUIC_CONNECTION_MIGRATION_DISABLED_BY_CONFIG, + "Migration disabled by config", + ConnectionCloseBehavior::SILENT_CLOSE); + OnMigrationFailure( + QuicConnectionMigrationStatus::MIGRATION_STATUS_DISABLED_BY_CONFIG, + "Migration disabled by config"); + return; + } + if (network == current_network()) { + OnMigrationFailure( + QuicConnectionMigrationStatus::MIGRATION_STATUS_ALREADY_MIGRATED, + "Already bound to new network"); + return; + } + // Cancel probing on |network| if there is any. + QuicPathValidationContext* context = connection_->GetPathValidationContext(); + if (context && context->network() == network && + context->peer_address() == connection_->peer_address()) { + connection_->CancelPathValidation(); + } + pending_migrate_network_immediately_ = true; + Migrate(network, connection_->peer_address(), + /*close_session_on_error=*/true, + [this](QuicNetworkHandle network, MigrationResult result) { + FinishMigrateNetworkImmediately(network, result); + }); +} + +QuicConnectionMigrationManager:: + PathContextCreationResultDelegateForImmediateMigration:: + PathContextCreationResultDelegateForImmediateMigration( + QuicConnectionMigrationManager* absl_nonnull migration_manager, + bool close_session_on_error, MigrationCallback migration_callback) + : migration_manager_(migration_manager), + close_session_on_error_(close_session_on_error), + migration_callback_(std::move(migration_callback)) {} + +void QuicConnectionMigrationManager:: + PathContextCreationResultDelegateForImmediateMigration::OnCreationSucceeded( + std::unique_ptr context) { + migration_manager_->FinishMigrate(std::move(context), close_session_on_error_, + std::move(migration_callback_)); +} + +void QuicConnectionMigrationManager:: + PathContextCreationResultDelegateForImmediateMigration::OnCreationFailed( + QuicNetworkHandle network, absl::string_view error) { + migration_manager_->session_->writer()->ForceWriteBlocked(false); + std::move(migration_callback_)(network, MigrationResult::FAILURE); + if (close_session_on_error_) { + migration_manager_->session_->OnConnectionToBeClosedDueToMigrationError( + migration_manager_->current_migration_cause_, + QUIC_CONNECTION_MIGRATION_INTERNAL_ERROR); + migration_manager_->session_->connection()->CloseConnection( + QUIC_CONNECTION_MIGRATION_INTERNAL_ERROR, + "Failed to create a path context", + ConnectionCloseBehavior::SILENT_CLOSE); + } + migration_manager_->OnMigrationFailure( + QuicConnectionMigrationStatus::MIGRATION_STATUS_INTERNAL_ERROR, error); +} + +QuicConnectionMigrationManager::PathContextCreationResultDelegateForProbing:: + PathContextCreationResultDelegateForProbing( + QuicConnectionMigrationManager* absl_nonnull migration_manager, + StartProbingCallback probing_callback) + : migration_manager_(migration_manager), + probing_callback_(std::move(probing_callback)) {} + +void QuicConnectionMigrationManager:: + PathContextCreationResultDelegateForProbing::OnCreationSucceeded( + std::unique_ptr context) { + migration_manager_->FinishStartProbing(std::move(probing_callback_), + std::move(context)); +} + +void QuicConnectionMigrationManager:: + PathContextCreationResultDelegateForProbing::OnCreationFailed( + QuicNetworkHandle /*network*/, absl::string_view error) { + migration_manager_->OnMigrationFailure( + QuicConnectionMigrationStatus::MIGRATION_STATUS_INTERNAL_ERROR, error); + if (probing_callback_) { + std::move(probing_callback_)(ProbingResult::INTERNAL_ERROR); + } +} + +void QuicConnectionMigrationManager::Migrate( + QuicNetworkHandle network, QuicSocketAddress peer_address, + bool close_session_on_error, MigrationCallback migration_callback) { + migration_attempted_ = true; + migration_successful_ = false; + if (!path_context_factory_) { + std::move(migration_callback)(network, MigrationResult::FAILURE); + return; + } + if (network != kInvalidNetworkHandle) { + // This is a migration attempt from connection migration. + session_->ResetNonMigratableStreams(); + if (!config_.migrate_idle_session && !session_->HasActiveRequestStreams()) { + std::move(migration_callback)(network, MigrationResult::FAILURE); + // If idle sessions can not be migrated, close the session if needed. + if (close_session_on_error) { + session_->OnConnectionToBeClosedDueToMigrationError( + current_migration_cause_, + QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS); + connection_->CloseConnection( + QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS, + "Migrating idle session is disabled.", + ConnectionCloseBehavior::SILENT_CLOSE); + } + return; + } + } else { + // TODO(b/430345640): remove the if condition if the historgram is not hit + // at all in production. + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.MigratingToInvalidNetwork", true, + "Connection is migrating with an invalid network handle."); + } + QUIC_DVLOG(1) << "Force blocking the current packet writer"; + session_->writer()->ForceWriteBlocked(true); + if (config_.disable_blackhole_detection_on_immediate_migrate) { + // Turn off the black hole detector since the writer is blocked. + // Blackhole will be re-enabled once a packet is sent again. + connection_->blackhole_detector().StopDetection(false); + } + path_context_factory_->CreatePathValidationContext( + network, peer_address, + std::make_unique( + this, close_session_on_error, std::move(migration_callback))); +} + +void QuicConnectionMigrationManager::FinishMigrateNetworkImmediately( + QuicNetworkHandle network, MigrationResult result) { + pending_migrate_network_immediately_ = false; + if (result == MigrationResult::FAILURE) { + QUIC_DVLOG(1) << "Failed to migrate network immediately"; + return; + } + if (network == default_network_) { + CancelMigrateBackToDefaultNetworkTimer(); + return; + } + // We are forced to migrate to |network|, probably |default_network_| is + // not working, start to migrate back to default network after 1 secs. + StartMigrateBackToDefaultNetworkTimer( + QuicTimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs)); +} + +void QuicConnectionMigrationManager::FinishMigrate( + std::unique_ptr path_context, + bool close_session_on_error, MigrationCallback callback) { + // Migrate to the new socket. + MigrationCause current_migration_cause = current_migration_cause_; + QuicNetworkHandle network = path_context->network(); + if (!session_->MigrateToNewPath(std::move(path_context))) { + session_->writer()->ForceWriteBlocked(false); + std::move(callback)(network, MigrationResult::FAILURE); + if (close_session_on_error) { + session_->OnConnectionToBeClosedDueToMigrationError( + current_migration_cause, QUIC_CONNECTION_MIGRATION_INTERNAL_ERROR); + connection_->CloseConnection(QUIC_CONNECTION_MIGRATION_INTERNAL_ERROR, + "Session failed to migrate to new path.", + ConnectionCloseBehavior::SILENT_CLOSE); + } + return; + } + current_network_ = network; + wait_for_migration_alarm_->Cancel(); + migration_successful_ = true; + OnMigrationSuccess(); + std::move(callback)(network, MigrationResult::SUCCESS); +} + +void QuicConnectionMigrationManager::OnNoNewNetwork() { + QUICHE_DCHECK(session_->OneRttKeysAvailable()); + wait_for_new_network_ = true; + if (debug_visitor_) { + debug_visitor_->OnWaitingForNewNetworkToMigrate(); + } + QUIC_DVLOG(1) << "Force blocking the packet writer while waiting for new " + "netowrk for migraion cause " + << MigrationCauseToString(current_migration_cause_); + // Force blocking the packet writer to avoid any writes since there is no + // alternate network available. + session_->writer()->ForceWriteBlocked(true); + if (config_.disable_blackhole_detection_on_immediate_migrate) { + // Turn off the black hole detector since the writer is blocked. + // Blackhole will be re-enabled once a packet is sent again. + connection_->blackhole_detector().StopDetection(false); + } + session_->OnNoNewNetworkForMigration(); + // Set an alarm to close the session if not being able to migrate to a new + // network soon. + if (!wait_for_migration_alarm_->IsSet()) { + wait_for_migration_alarm_->Set( + clock_->ApproximateNow() + + QuicTimeDelta::FromSeconds(kWaitTimeForNewNetworkSecs)); + } +} + +void QuicConnectionMigrationManager::OnMigrationTimeout() { + if (debug_visitor_) { + debug_visitor_->OnWaitForNetworkFailed(); + } + MigrationCause current_migration_cause = current_migration_cause_; + // |current_migration_cause_| will be reset after logging. + ResetMigrationCauseAndLogResult( + QuicConnectionMigrationStatus::MIGRATION_STATUS_TIMEOUT); + session_->OnConnectionToBeClosedDueToMigrationError( + current_migration_cause, QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK); + connection_->CloseConnection( + QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK, + absl::StrFormat("Migration for cause %s timed out", + MigrationCauseToString(current_migration_cause)), + ConnectionCloseBehavior::SILENT_CLOSE); +} + +void QuicConnectionMigrationManager::StartMigrateBackToDefaultNetworkTimer( + QuicTimeDelta delay) { + if (current_migration_cause_ != MigrationCause::ON_NETWORK_MADE_DEFAULT) { + current_migration_cause_ = + MigrationCause::ON_MIGRATE_BACK_TO_DEFAULT_NETWORK; + } + CancelMigrateBackToDefaultNetworkTimer(); + // Try migrate back to default network after |delay|. + migrate_back_to_default_timer_->Set(clock_->ApproximateNow() + delay); +} + +void QuicConnectionMigrationManager::CancelMigrateBackToDefaultNetworkTimer() { + retry_migrate_back_count_ = 0; + migrate_back_to_default_timer_->Cancel(); +} + +bool QuicConnectionMigrationManager::MaybeStartMigrateSessionOnWriteError( + int error_code) { + if (!session_->version().HasIetfQuicFrames()) { + return false; + } + QuicClientSparseHistogram("QuicSession.WriteError", -error_code); + if (session_->OneRttKeysAvailable()) { + QuicClientSparseHistogram("QuicSession.WriteError.HandshakeConfirmed", + -error_code); + } + // Proxied sessions cannot presently encounter write errors, but in case that + // changes, those sessions should not attempt migration when such an error + // occurs. The underlying connection to the proxy server may still migrate. + if (session_->IsSessionProxied()) { + return false; + } + std::optional msg_too_big_error = + connection_->writer()->MessageTooBigErrorCode(); + if ((msg_too_big_error.has_value() && error_code == *msg_too_big_error) || + !path_context_factory_ || !config_.migrate_session_on_network_change || + !session_->OneRttKeysAvailable()) { + return false; + } + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationAfterWriteError(current_network_); + } + most_recent_write_error_timestamp_ = clock_->ApproximateNow(); + most_recent_write_error_ = error_code; + // Migrate the session onto a new network in the next event loop. + RunCallbackInNextLoop([this, writer = connection_->writer()]() { + StartMigrateSessionOnWriteError(writer); + }); + return true; +} + +void QuicConnectionMigrationManager::StartMigrateSessionOnWriteError( + quic::QuicPacketWriter* writer) { + QUICHE_DCHECK(config_.migrate_session_on_network_change); + // If `writer` is no longer actively in use, or a parallel connection + // migration has started from MigrateNetworkImmediately, abort this migration + // attempt. + if (writer != connection_->writer() || pending_migrate_network_immediately_) { + return; + } + current_migration_cause_ = MigrationCause::ON_WRITE_ERROR; + RecordHandshakeStatusOnMigrationSignal(); + if (MaybeCloseIdleSession(/*has_write_error=*/true, + ConnectionCloseBehavior::SILENT_CLOSE)) { + return; + } + // Do not migrate if connection migration is disabled. + if (migration_disabled_) { + OnMigrationFailure( + QuicConnectionMigrationStatus::MIGRATION_STATUS_DISABLED_BY_CONFIG, + "Migration disabled by config"); + // Close the connection since migration was disabled. Do not cause a + // connection close packet to be sent since socket may be borked. + connection_->CloseConnection(QUIC_CONNECTION_MIGRATION_DISABLED_BY_CONFIG, + "Unrecoverable write error", + quic::ConnectionCloseBehavior::SILENT_CLOSE); + return; + } + QuicNetworkHandle new_network = + session_->FindAlternateNetwork(current_network()); + if (new_network == kInvalidNetworkHandle) { + OnNoNewNetwork(); + return; + } + if (current_network() == default_network_) { + if (current_migrations_to_non_default_network_on_write_error_ >= + config_.max_migrations_to_non_default_network_on_write_error) { + OnMigrationFailure(QuicConnectionMigrationStatus:: + MIGRATION_STATUS_ON_WRITE_ERROR_DISABLED, + "Exceeds maximum number of migrations on write error"); + // Close the connection if migration failed. Do not cause a + // connection close packet to be sent since socket may be borked. + connection_->CloseConnection( + QUIC_PACKET_WRITE_ERROR, + "Too many migrations for write error for the same network", + ConnectionCloseBehavior::SILENT_CLOSE); + return; + } + ++current_migrations_to_non_default_network_on_write_error_; + } + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationStartingAfterEvent("WriteError"); + } + pending_migrate_session_on_write_error_ = true; + Migrate(new_network, connection_->peer_address(), + /*close_session_on_error=*/false, + [this](QuicNetworkHandle new_network, MigrationResult rv) { + FinishMigrateSessionOnWriteError(new_network, rv); + }); + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationStarted(); + } +} + +void QuicConnectionMigrationManager::FinishMigrateSessionOnWriteError( + QuicNetworkHandle new_network, MigrationResult result) { + pending_migrate_session_on_write_error_ = false; + if (result == MigrationResult::FAILURE) { + // Close the connection if migration failed. Do not cause a + // connection close packet to be sent since socket may be borked. + connection_->CloseConnection(QUIC_PACKET_WRITE_ERROR, + "Write and subsequent migration failed", + ConnectionCloseBehavior::SILENT_CLOSE); + return; + } + if (new_network != default_network_) { + StartMigrateBackToDefaultNetworkTimer( + QuicTimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs)); + } else { + CancelMigrateBackToDefaultNetworkTimer(); + } +} + +void QuicConnectionMigrationManager::RunCallbackInNextLoop( + quiche::SingleUseCallback callback) { + if (callback == nullptr) { + return; + } + pending_callbacks_.push_back(std::move(callback)); + if (pending_callbacks_.size() == 1u) { + run_pending_callbacks_alarm_->Set(clock_->ApproximateNow()); + } +} + +void QuicConnectionMigrationManager::RunPendingCallbacks() { + std::list> pending_callbacks = + std::move(pending_callbacks_); + while (!pending_callbacks.empty()) { + std::move(pending_callbacks.front())(); + pending_callbacks.pop_front(); + } +} + +void QuicConnectionMigrationManager::OnPathDegrading() { + if (!session_->version().HasIetfQuicFrames()) { + return; + } + if (!most_recent_path_degrading_timestamp_.IsInitialized()) { + most_recent_path_degrading_timestamp_ = clock_->ApproximateNow(); + } + // Proxied sessions should not attempt migration when the path degrades, as + // there is nowhere for such a session to migrate to. If the degradation is + // due to degradation of the underlying session, then that session may attempt + // migration. + if (session_->IsSessionProxied()) { + return; + } + if (!path_context_factory_ || connection_->multi_port_stats()) { + return; + } + const bool migrate_session_early = config_.migrate_session_early && + config_.migrate_session_on_network_change; + current_migration_cause_ = + (config_.allow_port_migration && !migrate_session_early) + ? MigrationCause::CHANGE_PORT_ON_PATH_DEGRADING + : MigrationCause::CHANGE_NETWORK_ON_PATH_DEGRADING; + RecordHandshakeStatusOnMigrationSignal(); + if (!connection_->IsHandshakeConfirmed()) { + OnMigrationFailure( + QuicConnectionMigrationStatus:: + MIGRATION_STATUS_PATH_DEGRADING_BEFORE_HANDSHAKE_CONFIRMED, + "Path degrading before handshake confirmed"); + return; + } + if (migration_disabled_) { + QUICHE_DVLOG(1) + << "Client disables probing network with connection migration " + << "disabled by config"; + OnMigrationFailure( + QuicConnectionMigrationStatus::MIGRATION_STATUS_DISABLED_BY_CONFIG, + "Migration disabled by config"); + return; + } + if (current_migration_cause_ == + MigrationCause::CHANGE_PORT_ON_PATH_DEGRADING) { + if (current_migrations_to_different_port_on_path_degrading_ >= + config_.max_port_migrations_per_session) { + // Note that Chrome implementation hasn't limited the number of port + // migrations if config_.migrate_session_on_network_change is true and + // config_.migrate_session_early is false. + OnMigrationFailure( + QuicConnectionMigrationStatus::MIGRATION_STATUS_TOO_MANY_CHANGES, + "Too many changes"); + return; + } + + QUICHE_DLOG(INFO) << "Start probing a different port on path degrading."; + if (debug_visitor_) { + debug_visitor_->OnPortMigrationStarting(); + } + // Probe a different port, session will migrate to the probed port on + // success. + StartProbing(nullptr, default_network_, connection_->peer_address()); + if (debug_visitor_) { + debug_visitor_->OnPortMigrationStarted(); + } + return; + } + if (!migrate_session_early) { + OnMigrationFailure(QuicConnectionMigrationStatus:: + MIGRATION_STATUS_PATH_DEGRADING_NOT_ENABLED, + "Migration on path degrading not enabled"); + return; + } + MaybeProbeAndMigrateToAlternateNetworkOnPathDegrading(); +} + +void QuicConnectionMigrationManager:: + MaybeProbeAndMigrateToAlternateNetworkOnPathDegrading() { + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationStartingAfterEvent("PathDegrading"); + } + if (current_network() == default_network_ && + current_migrations_to_non_default_network_on_path_degrading_ >= + config_.max_migrations_to_non_default_network_on_path_degrading) { + OnMigrationFailure( + QuicConnectionMigrationStatus:: + MIGRATION_STATUS_ON_PATH_DEGRADING_DISABLED, + "Exceeds maximum number of migrations on path degrading"); + return; + } + QuicNetworkHandle alternate_network = + session_->FindAlternateNetwork(current_network()); + if (alternate_network == kInvalidNetworkHandle) { + OnMigrationFailure( + QuicConnectionMigrationStatus::MIGRATION_STATUS_NO_ALTERNATE_NETWORK, + "No alternative network on path degrading"); + return; + } + if (MaybeCloseIdleSession( + /*has_write_error=*/false, + ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET)) { + return; + } + // Probe the alternative network, session will migrate to the probed + // network and decide whether it wants to migrate back to the default + // network on success. Null is passed in for `start_probing_callback` as the + // return value of StartProbing is not needed. + StartProbing(nullptr, alternate_network, connection_->peer_address()); + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationStarted(); + } +} + +void QuicConnectionMigrationManager::MaybeRetryMigrateBackToDefaultNetwork() { + // Exponentially backoff the retry timeout. + QuicTimeDelta retry_migrate_back_timeout = + QuicTimeDelta::FromSeconds(UINT64_C(1) << retry_migrate_back_count_); + if (pending_migrate_session_on_write_error_ || + pending_migrate_network_immediately_) { + // Another more pressing migration (without probing) is in progress, which + // might migrate the session back to the default network. Wait for it to + // finish before retrying to migrate back to default network with probing. + StartMigrateBackToDefaultNetworkTimer(QuicTimeDelta::FromSeconds(0)); + return; + } + if (retry_migrate_back_timeout > config_.max_time_on_non_default_network) { + // Mark session as going away to accept no more streams. + session_->StartDraining(); + return; + } + TryMigrateBackToDefaultNetwork(retry_migrate_back_timeout); +} + +void QuicConnectionMigrationManager::TryMigrateBackToDefaultNetwork( + QuicTimeDelta next_try_timeout) { + if (default_network_ == kInvalidNetworkHandle) { + QUICHE_DVLOG(1) << "Default network is not connected"; + return; + } + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationBackToDefaultNetwork( + retry_migrate_back_count_); + } + if (!path_context_factory_) { + FinishTryMigrateBackToDefaultNetwork( + next_try_timeout, ProbingResult::DISABLED_WITH_IDLE_SESSION); + return; + } + if (MaybeCloseIdleSession( + /*has_write_error=*/false, + ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET)) { + FinishTryMigrateBackToDefaultNetwork( + next_try_timeout, ProbingResult::DISABLED_WITH_IDLE_SESSION); + return; + } + if (migration_disabled_) { + QUIC_DVLOG(1) + << "Client disables probing network with connection migration " + << "disabled by config"; + OnMigrationFailure( + QuicConnectionMigrationStatus::MIGRATION_STATUS_DISABLED_BY_CONFIG, + "Migration disabled by config"); + FinishTryMigrateBackToDefaultNetwork(next_try_timeout, + ProbingResult::DISABLED_BY_CONFIG); + return; + } + // Start probe default network immediately, if this observer is probing + // the same network, this will be a no-op. Otherwise, previous probe + // will be cancelled and it starts to probe |default_network_| + // immediately. + StartProbing( + [this, next_try_timeout](ProbingResult rv) { + FinishTryMigrateBackToDefaultNetwork(next_try_timeout, rv); + }, + default_network_, connection_->peer_address()); +} + +void QuicConnectionMigrationManager::FinishTryMigrateBackToDefaultNetwork( + QuicTimeDelta next_try_timeout, ProbingResult result) { + if (result != ProbingResult::PENDING) { + // Session is not allowed to migrate, mark session as going away, cancel + // migrate back to default timer. + session_->StartDraining(); + CancelMigrateBackToDefaultNetworkTimer(); + return; + } + ++retry_migrate_back_count_; + migrate_back_to_default_timer_->Set(clock_->ApproximateNow() + + next_try_timeout); +} + +void QuicConnectionMigrationManager::StartProbing( + StartProbingCallback probing_callback, QuicNetworkHandle network, + const quic::QuicSocketAddress& peer_address) { + // Check if probing manager is probing the same path. + QuicPathValidationContext* existing_context = + connection_->GetPathValidationContext(); + if (existing_context && existing_context->network() == network && + existing_context->peer_address() == peer_address) { + if (probing_callback) { + QUIC_DVLOG(1) << "On-going probing of peer address " << peer_address + << " on network " << network << " hasn't finished."; + std::move(probing_callback)(ProbingResult::DISABLED_BY_CONFIG); + } + return; + } + path_context_factory_->CreatePathValidationContext( + network, peer_address, + std::make_unique( + this, std::move(probing_callback))); +} + +void QuicConnectionMigrationManager::FinishStartProbing( + StartProbingCallback probing_callback, + std::unique_ptr path_context) { + session_->PrepareForProbingOnPath(*path_context); + switch (current_migration_cause_) { + case MigrationCause::CHANGE_PORT_ON_PATH_DEGRADING: + connection_->ValidatePath( + std::move(path_context), + std::make_unique(this), + quic::PathValidationReason::kPortMigration); + break; + case MigrationCause::ON_SERVER_PREFERRED_ADDRESS_AVAILABLE: + connection_->ValidatePath( + std::move(path_context), + std::make_unique( + this), + quic::PathValidationReason::kServerPreferredAddressMigration); + break; + default: + connection_->ValidatePath( + std::move(path_context), + std::make_unique(this), + quic::PathValidationReason::kConnectionMigration); + break; + } + if (probing_callback) { + std::move(probing_callback)(ProbingResult::PENDING); + } +} + +void QuicConnectionMigrationManager::OnProbeFailed( + std::unique_ptr path_context) { + connection_->OnPathValidationFailureAtClient( + /*is_multi_port=*/false, *path_context); + QuicNetworkHandle network = path_context->network(); + if (debug_visitor_) { + debug_visitor_->OnProbeResult(network, connection_->peer_address(), + /*success=*/false); + } + RecordProbeResultToHistogram(current_migration_cause_, false); + QuicPathValidationContext* context = connection_->GetPathValidationContext(); + if (!context) { + return; + } + if (context->network() == network && + context->peer_address() == connection_->peer_address()) { + connection_->CancelPathValidation(); + } + if (network != kInvalidNetworkHandle) { + // Probing failure can be ignored. + QUICHE_DVLOG(1) << "Connectivity probing failed on peer_address().ToString() << ">."; + QUICHE_DVLOG_IF( + 1, network == default_network_ && current_network() != default_network_) + << "Client probing failed on the default network, still using " + "non-default network."; + } +} + +void QuicConnectionMigrationManager::OnConnectionMigrationProbeSucceeded( + std::unique_ptr path_context, + quic::QuicTime /*start_time*/) { + QuicNetworkHandle network = path_context->network(); + if (debug_visitor_) { + debug_visitor_->OnProbeResult(network, connection_->peer_address(), + /*success*/ true); + } + RecordProbeResultToHistogram(current_migration_cause_, true); + // Close streams that are not migratable to the probed |network|. + session_->ResetNonMigratableStreams(); + if (MaybeCloseIdleSession( + /*has_write_error=*/false, + ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET)) { + return; + } + // Migrate to the probed socket immediately. + if (!session_->MigrateToNewPath( + std::unique_ptr( + static_cast( + path_context.release())))) { + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationFailedAfterProbe(); + } + return; + } + OnMigrationSuccess(); + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationSucceededAfterProbe(network); + } + current_network_ = network; + if (network == default_network_) { + QUIC_DVLOG(1) << "Client successfully migrated to default network: " + << default_network_; + CancelMigrateBackToDefaultNetworkTimer(); + return; + } + QUIC_DVLOG(1) << "Client successfully got off default network after " + << "successful probing network: " << network << "."; + ++current_migrations_to_non_default_network_on_path_degrading_; + if (!migrate_back_to_default_timer_->IsSet()) { + current_migration_cause_ = + MigrationCause::ON_MIGRATE_BACK_TO_DEFAULT_NETWORK; + // Session gets off the |default_network|, stay on |network| for now but + // try to migrate back to default network after 1 second. + StartMigrateBackToDefaultNetworkTimer( + QuicTimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs)); + } +} + +void QuicConnectionMigrationManager::OnPortMigrationProbeSucceeded( + std::unique_ptr path_context, + quic::QuicTime /*start_time*/) { + QuicNetworkHandle network = path_context->network(); + if (debug_visitor_) { + debug_visitor_->OnProbeResult(network, connection_->peer_address(), + /*success=*/true); + } + RecordProbeResultToHistogram(current_migration_cause_, true); + if (MaybeCloseIdleSession( + /*has_write_error=*/false, + ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET)) { + return; + } + // Migrate to the probed socket immediately. + if (!session_->MigrateToNewPath( + std::unique_ptr( + static_cast( + path_context.release())))) { + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationFailedAfterProbe(); + } + return; + } + ++current_migrations_to_different_port_on_path_degrading_; + OnMigrationSuccess(); +} + +void QuicConnectionMigrationManager::OnServerPreferredAddressProbeSucceeded( + std::unique_ptr path_context, + quic::QuicTime /*start_time*/) { + QuicNetworkHandle network = path_context->network(); + if (debug_visitor_) { + debug_visitor_->OnProbeResult(network, connection_->peer_address(), + /*success*/ true); + } + RecordProbeResultToHistogram(current_migration_cause_, true); + connection_->mutable_stats().server_preferred_address_validated = true; + // Migrate to the probed socket immediately. + if (!session_->MigrateToNewPath( + std::unique_ptr( + static_cast( + path_context.release())))) { + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationFailedAfterProbe(); + } + return; + } + OnMigrationSuccess(); +} + +void QuicConnectionMigrationManager:: + MaybeStartMigrateSessionToServerPreferredAddress( + const quic::QuicSocketAddress& server_preferred_address) { + // If this is a proxied connection, we cannot perform any migration, so + // ignore the server preferred address. + if (session_->IsSessionProxied()) { + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationFailed( + MigrationCause::UNKNOWN_CAUSE, connection_->connection_id(), + "Ignored server preferred address received via proxied connection"); + } + return; + } + if (!config_.allow_server_preferred_address) { + return; + } + current_migration_cause_ = + MigrationCause::ON_SERVER_PREFERRED_ADDRESS_AVAILABLE; + if (!path_context_factory_) { + return; + } + if (debug_visitor_) { + debug_visitor_->OnProbingServerPreferredAddressStarting(); + } + StartProbing(nullptr, default_network_, server_preferred_address); + if (debug_visitor_) { + debug_visitor_->OnProbingServerPreferredAddressStarted(); + } +} + +void QuicConnectionMigrationManager::OnNetworkMadeDefault( + QuicNetworkHandle new_network) { + if (!session_->version().HasIetfQuicFrames()) { + return; + } + RecordMetricsOnNetworkMadeDefault(); + if (debug_visitor_) { + debug_visitor_->OnNetworkMadeDefault(new_network); + } + if (!config_.migrate_session_on_network_change || + session_->IsSessionProxied()) { + return; + } + QUICHE_DCHECK_NE(kInvalidNetworkHandle, new_network); + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationAfterNewDefaultNetwork(new_network); + } + if (new_network == default_network_) { + return; + } + QUICHE_DVLOG(1) << "Network: " << new_network + << " becomes default, old default: " << default_network_ + << " current_network " << current_network(); + default_network_ = new_network; + current_migration_cause_ = MigrationCause::ON_NETWORK_MADE_DEFAULT; + current_migrations_to_non_default_network_on_write_error_ = 0; + current_migrations_to_non_default_network_on_path_degrading_ = 0; + // Simply cancel the timer to migrate back to the default network if session + // is already on the default network. + if (current_network() == new_network) { + CancelMigrateBackToDefaultNetworkTimer(); + OnMigrationFailure( + QuicConnectionMigrationStatus::MIGRATION_STATUS_ALREADY_MIGRATED, + "Already migrated on the new network"); + return; + } + RecordHandshakeStatusOnMigrationSignal(); + // Stay on the current network. Try to migrate back to default network + // without any delay, which will start probing the new default network and + // migrate to the new network immediately on success. + StartMigrateBackToDefaultNetworkTimer(QuicTimeDelta::Zero()); +} + +void QuicConnectionMigrationManager::RecordMetricsOnNetworkMadeDefault() { + if (most_recent_path_degrading_timestamp_.IsInitialized()) { + if (most_recent_network_disconnected_timestamp_.IsInitialized()) { + // NetworkDisconnected happens before NetworkMadeDefault, the platform + // is dropping WiFi. + QuicTime now = clock_->ApproximateNow(); + QuicTimeDelta disconnection_duration = + now - most_recent_network_disconnected_timestamp_; + QuicTimeDelta degrading_duration = + now - most_recent_path_degrading_timestamp_; + QUIC_CLIENT_HISTOGRAM_TIMES("QuicNetworkDisconnectionDuration", + disconnection_duration, + QuicTimeDelta::FromMilliseconds(1), + QuicTimeDelta::FromSeconds(10 * 60), 100, ""); + QUIC_CLIENT_HISTOGRAM_TIMES( + "QuicNetworkDegradingDurationTillNewNetworkMadeDefault", + degrading_duration, QuicTimeDelta::FromMilliseconds(1), + QuicTimeDelta::FromSeconds(10 * 60), 100, ""); + most_recent_network_disconnected_timestamp_ = QuicTime::Zero(); + } + most_recent_path_degrading_timestamp_ = QuicTime::Zero(); + } +} + +void QuicConnectionMigrationManager::RecordMetricsOnNetworkDisconnected() { + most_recent_network_disconnected_timestamp_ = clock_->ApproximateNow(); + if (most_recent_path_degrading_timestamp_.IsInitialized()) { + QuicTimeDelta degrading_duration = + most_recent_network_disconnected_timestamp_ - + most_recent_path_degrading_timestamp_; + QUIC_CLIENT_HISTOGRAM_TIMES("QuicNetworkDegradingDurationTillDisconnected", + degrading_duration, + QuicTimeDelta::FromMilliseconds(1), + QuicTimeDelta::FromSeconds(10 * 60), 100, ""); + } + if (most_recent_write_error_timestamp_.IsInitialized()) { + QuicTimeDelta write_error_to_disconnection_gap = + most_recent_network_disconnected_timestamp_ - + most_recent_write_error_timestamp_; + QUIC_CLIENT_HISTOGRAM_TIMES( + "QuicNetworkGapBetweenWriteErrorAndDisconnection", + write_error_to_disconnection_gap, QuicTimeDelta::FromMilliseconds(1), + QuicTimeDelta::FromSeconds(10 * 60), 100, ""); + QuicClientSparseHistogram("QuicSession.WriteError.NetworkDisconnected", + -most_recent_write_error_); + most_recent_write_error_ = 0; + most_recent_write_error_timestamp_ = QuicTime::Zero(); + } +} + +bool QuicConnectionMigrationManager::MaybeCloseIdleSession( + bool has_write_error, ConnectionCloseBehavior close_behavior) { + if (session_->HasActiveRequestStreams()) { + return false; + } + if (!config_.migrate_idle_session) { + // Close the idle session. + if (!has_write_error) { + session_->OnConnectionToBeClosedDueToMigrationError( + current_migration_cause_, + QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS); + connection_->CloseConnection( + QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS, + "Migrating idle session is disabled.", close_behavior); + } else { + connection_->CloseConnection(QUIC_PACKET_WRITE_ERROR, + "Write error for non-migratable session", + close_behavior); + } + OnMigrationFailure( + QuicConnectionMigrationStatus::MIGRATION_STATUS_NO_MIGRATABLE_STREAMS, + "No active streams"); + return true; + } + // There are no active/drainning streams, check the last stream's finish time. + if (session_->TimeSinceLastStreamClose() < config_.idle_migration_period) { + // Still within the idle migration period. + return false; + } + if (!has_write_error) { + session_->OnConnectionToBeClosedDueToMigrationError( + current_migration_cause_, QUIC_NETWORK_IDLE_TIMEOUT); + connection_->CloseConnection( + QUIC_NETWORK_IDLE_TIMEOUT, + "Idle session exceeds configured idle migration period", + ConnectionCloseBehavior::SILENT_CLOSE); + } else { + connection_->CloseConnection(QUIC_PACKET_WRITE_ERROR, + "Write error for idle session", + close_behavior); + } + OnMigrationFailure( + QuicConnectionMigrationStatus::MIGRATION_STATUS_IDLE_MIGRATION_TIMEOUT, + "Idle migration period exceeded"); + return true; +} + +void QuicConnectionMigrationManager::OnHandshakeCompleted( + const QuicConfig& negotiated_config) { + migration_disabled_ = negotiated_config.DisableConnectionMigration(); + // Attempt to migrate back to the default network after handshake has been + // completed if the session is not created on the default network. + if (config_.migrate_session_on_network_change && + default_network_ != kInvalidNetworkHandle && + current_network() != default_network_) { + QUICHE_DCHECK(session_->version().HasIetfQuicFrames()); + current_migration_cause_ = + MigrationCause::ON_MIGRATE_BACK_TO_DEFAULT_NETWORK; + StartMigrateBackToDefaultNetworkTimer( + QuicTimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs)); + } +} + +// TODO(fayang): Remove this when necessary data is collected. +void QuicConnectionMigrationManager::RecordProbeResultToHistogram( + MigrationCause cause, bool success) { + QUIC_CLIENT_HISTOGRAM_BOOL("QuicSession.PathValidationSuccess", success, ""); + switch (cause) { + case MigrationCause::UNKNOWN_CAUSE: + QUIC_CLIENT_HISTOGRAM_BOOL("QuicSession.PathValidationSuccess.Unknown", + success, ""); + return; + case MigrationCause::ON_NETWORK_CONNECTED: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.PathValidationSuccess.OnNetworkConnected", success, ""); + return; + case MigrationCause::ON_NETWORK_DISCONNECTED: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.PathValidationSuccess.OnNetworkDisconnected", success, + ""); + return; + case MigrationCause::ON_WRITE_ERROR: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.PathValidationSuccess.OnWriteError", success, ""); + return; + case MigrationCause::ON_NETWORK_MADE_DEFAULT: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.PathValidationSuccess.OnNetworkMadeDefault", success, + ""); + return; + case MigrationCause::ON_MIGRATE_BACK_TO_DEFAULT_NETWORK: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.PathValidationSuccess.OnMigrateBackToDefaultNetwork", + success, ""); + return; + case MigrationCause::CHANGE_NETWORK_ON_PATH_DEGRADING: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.PathValidationSuccess.OnPathDegrading", success, ""); + return; + case MigrationCause::NEW_NETWORK_CONNECTED_POST_PATH_DEGRADING: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.PathValidationSuccess." + "NewNetworkConnectedPostPathDegrading", + success, ""); + return; + case MigrationCause::CHANGE_PORT_ON_PATH_DEGRADING: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.PathValidationSuccess.PortMigration", success, ""); + return; + case MigrationCause::ON_SERVER_PREFERRED_ADDRESS_AVAILABLE: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.PathValidationSuccess." + "OnServerPreferredAddressAvailable", + success, ""); + return; + } +} + +void QuicConnectionMigrationManager::ResetMigrationCauseAndLogResult( + QuicConnectionMigrationStatus status) { + if (current_migration_cause_ == + MigrationCause::CHANGE_PORT_ON_PATH_DEGRADING) { + QUIC_CLIENT_HISTOGRAM_ENUM( + "QuicSession.PortMigration", status, + QuicConnectionMigrationStatus::MIGRATION_STATUS_MAX, ""); + current_migration_cause_ = MigrationCause::UNKNOWN_CAUSE; + return; + } + if (current_migration_cause_ == + MigrationCause::ON_SERVER_PREFERRED_ADDRESS_AVAILABLE) { + QUIC_CLIENT_HISTOGRAM_ENUM( + "QuicSession.OnServerPreferredAddressAvailable", status, + QuicConnectionMigrationStatus::MIGRATION_STATUS_MAX, ""); + current_migration_cause_ = MigrationCause::UNKNOWN_CAUSE; + return; + } + QUIC_CLIENT_HISTOGRAM_ENUM( + "QuicSession.ConnectionMigration", status, + QuicConnectionMigrationStatus::MIGRATION_STATUS_MAX, ""); + // Log the connection migraiton result to different histograms based on the + // cause of the connection migration. + switch (current_migration_cause_) { + case MigrationCause::UNKNOWN_CAUSE: + QUIC_CLIENT_HISTOGRAM_ENUM( + "QuicSession.ConnectionMigration.Unknown", status, + QuicConnectionMigrationStatus::MIGRATION_STATUS_MAX, ""); + break; + case MigrationCause::ON_NETWORK_CONNECTED: + QUIC_CLIENT_HISTOGRAM_ENUM( + "QuicSession.ConnectionMigration.OnNetworkConnected", status, + QuicConnectionMigrationStatus::MIGRATION_STATUS_MAX, ""); + break; + case MigrationCause::ON_NETWORK_DISCONNECTED: + QUIC_CLIENT_HISTOGRAM_ENUM( + "QuicSession.ConnectionMigration.OnNetworkDisconnected", status, + QuicConnectionMigrationStatus::MIGRATION_STATUS_MAX, ""); + break; + case MigrationCause::ON_WRITE_ERROR: + QUIC_CLIENT_HISTOGRAM_ENUM( + "QuicSession.ConnectionMigration.OnWriteError", status, + QuicConnectionMigrationStatus::MIGRATION_STATUS_MAX, ""); + break; + case MigrationCause::ON_NETWORK_MADE_DEFAULT: + QUIC_CLIENT_HISTOGRAM_ENUM( + "QuicSession.ConnectionMigration.OnNetworkMadeDefault", status, + QuicConnectionMigrationStatus::MIGRATION_STATUS_MAX, ""); + break; + case MigrationCause::ON_MIGRATE_BACK_TO_DEFAULT_NETWORK: + QUIC_CLIENT_HISTOGRAM_ENUM( + "QuicSession.ConnectionMigration.OnMigrateBackToDefaultNetwork", + status, QuicConnectionMigrationStatus::MIGRATION_STATUS_MAX, ""); + break; + case MigrationCause::CHANGE_NETWORK_ON_PATH_DEGRADING: + QUIC_CLIENT_HISTOGRAM_ENUM( + "QuicSession.ConnectionMigration.OnPathDegrading", status, + QuicConnectionMigrationStatus::MIGRATION_STATUS_MAX, ""); + break; + case MigrationCause::NEW_NETWORK_CONNECTED_POST_PATH_DEGRADING: + QUIC_CLIENT_HISTOGRAM_ENUM( + "QuicSession.ConnectionMigration." + "NewNetworkConnectedPostPathDegrading", + status, QuicConnectionMigrationStatus::MIGRATION_STATUS_MAX, ""); + break; + case MigrationCause::CHANGE_PORT_ON_PATH_DEGRADING: + case MigrationCause::ON_SERVER_PREFERRED_ADDRESS_AVAILABLE: + // Already has been handled above. + break; + } + current_migration_cause_ = MigrationCause::UNKNOWN_CAUSE; +} + +void QuicConnectionMigrationManager::RecordHandshakeStatusOnMigrationSignal() + const { + const bool handshake_confirmed = session_->OneRttKeysAvailable(); + if (current_migration_cause_ == + MigrationCause::CHANGE_PORT_ON_PATH_DEGRADING) { + QUIC_CLIENT_HISTOGRAM_BOOL("QuicSession.HandshakeStatusOnPortMigration", + handshake_confirmed, ""); + return; + } + if (current_migration_cause_ == + MigrationCause::ON_SERVER_PREFERRED_ADDRESS_AVAILABLE) { + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.HandshakeStatusOnMigratingToServerPreferredAddress", + handshake_confirmed, ""); + return; + } + QUIC_CLIENT_HISTOGRAM_BOOL("QuicSession.HandshakeStatusOnConnectionMigration", + handshake_confirmed, ""); + switch (current_migration_cause_) { + case MigrationCause::UNKNOWN_CAUSE: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.HandshakeStatusOnConnectionMigration.Unknown", + handshake_confirmed, ""); + break; + case MigrationCause::ON_NETWORK_CONNECTED: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.HandshakeStatusOnConnectionMigration." + "OnNetworkConnected", + handshake_confirmed, ""); + break; + case MigrationCause::ON_NETWORK_DISCONNECTED: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.HandshakeStatusOnConnectionMigration." + "OnNetworkDisconnected", + handshake_confirmed, ""); + break; + case MigrationCause::ON_WRITE_ERROR: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.HandshakeStatusOnConnectionMigration.OnWriteError", + handshake_confirmed, ""); + break; + case MigrationCause::ON_NETWORK_MADE_DEFAULT: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.HandshakeStatusOnConnectionMigration." + "OnNetworkMadeDefault", + handshake_confirmed, ""); + break; + case MigrationCause::ON_MIGRATE_BACK_TO_DEFAULT_NETWORK: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.HandshakeStatusOnConnectionMigration." + "OnMigrateBackToDefaultNetwork", + handshake_confirmed, ""); + break; + case MigrationCause::CHANGE_NETWORK_ON_PATH_DEGRADING: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.HandshakeStatusOnConnectionMigration." + "OnPathDegrading", + handshake_confirmed, ""); + break; + case MigrationCause::NEW_NETWORK_CONNECTED_POST_PATH_DEGRADING: + QUIC_CLIENT_HISTOGRAM_BOOL( + "QuicSession.HandshakeStatusOnConnectionMigration." + "NewNetworkConnectedPostPathDegrading", + handshake_confirmed, ""); + break; + case MigrationCause::CHANGE_PORT_ON_PATH_DEGRADING: + case MigrationCause::ON_SERVER_PREFERRED_ADDRESS_AVAILABLE: + // Already has been handled above. + break; + } +} + +void QuicConnectionMigrationManager::OnMigrationFailure( + QuicConnectionMigrationStatus status, absl::string_view reason) { + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationFailed( + current_migration_cause_, connection_->connection_id(), reason); + } + // |current_migration_cause_| will be reset afterwards. + ResetMigrationCauseAndLogResult(status); +} + +void QuicConnectionMigrationManager::OnMigrationSuccess() { + if (debug_visitor_) { + debug_visitor_->OnConnectionMigrationSuccess(current_migration_cause_, + connection_->connection_id()); + } + // |current_migration_cause_| will be reset afterwards. + ResetMigrationCauseAndLogResult( + QuicConnectionMigrationStatus::MIGRATION_STATUS_SUCCESS); +} + +} // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_connection_migration_manager.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_connection_migration_manager.h new file mode 100644 index 0000000000..4a29328be8 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_connection_migration_manager.h @@ -0,0 +1,409 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_CORE_HTTP_QUIC_CONNECTION_MIGRATION_MANAGER_H_ +#define QUICHE_QUIC_CORE_HTTP_QUIC_CONNECTION_MIGRATION_MANAGER_H_ + +#include +#include +#include + +#include "absl/base/nullability.h" +#include "absl/strings/string_view.h" +#include "quiche/quic/core/quic_alarm.h" +#include "quiche/quic/core/quic_clock.h" +#include "quiche/quic/core/quic_config.h" +#include "quiche/quic/core/quic_connection_id.h" +#include "quiche/quic/core/quic_packet_writer.h" +#include "quiche/quic/core/quic_path_context_factory.h" +#include "quiche/quic/core/quic_time.h" +#include "quiche/quic/core/quic_types.h" +#include "quiche/quic/platform/api/quic_socket_address.h" +#include "quiche/common/platform/api/quiche_export.h" +#include "quiche/common/quiche_callbacks.h" + +namespace quic { + +namespace test { +class QuicConnectionMigrationManagerPeer; +} // namespace test + +class QuicSpdyClientSessionWithMigration; + +// Result of a session migration attempt. +enum class MigrationResult { + SUCCESS, // Migration succeeded. + NO_NEW_NETWORK, // Migration failed since no new network was found. + FAILURE, // Migration failed for other reasons. +}; + +// Cause of a migration. +enum class MigrationCause { + UNKNOWN_CAUSE, // Not migrating. + ON_NETWORK_CONNECTED, // No probing. + ON_NETWORK_DISCONNECTED, // No probing. + ON_WRITE_ERROR, // No probing. + ON_NETWORK_MADE_DEFAULT, // With probing. + ON_MIGRATE_BACK_TO_DEFAULT_NETWORK, // With probing. + CHANGE_NETWORK_ON_PATH_DEGRADING, // With probing. + CHANGE_PORT_ON_PATH_DEGRADING, // With probing. + NEW_NETWORK_CONNECTED_POST_PATH_DEGRADING, // With probing. + ON_SERVER_PREFERRED_ADDRESS_AVAILABLE, // With probing. +}; + +// Result of connection migration. +enum class QuicConnectionMigrationStatus { + MIGRATION_STATUS_SUCCESS, + MIGRATION_STATUS_NO_MIGRATABLE_STREAMS, + MIGRATION_STATUS_ALREADY_MIGRATED, + MIGRATION_STATUS_INTERNAL_ERROR, + MIGRATION_STATUS_TOO_MANY_CHANGES, + MIGRATION_STATUS_NON_MIGRATABLE_STREAM, + MIGRATION_STATUS_NOT_ENABLED, + MIGRATION_STATUS_NO_ALTERNATE_NETWORK, + MIGRATION_STATUS_ON_PATH_DEGRADING_DISABLED, + MIGRATION_STATUS_DISABLED_BY_CONFIG, + MIGRATION_STATUS_PATH_DEGRADING_NOT_ENABLED, + MIGRATION_STATUS_TIMEOUT, + MIGRATION_STATUS_ON_WRITE_ERROR_DISABLED, + MIGRATION_STATUS_PATH_DEGRADING_BEFORE_HANDSHAKE_CONFIRMED, + MIGRATION_STATUS_IDLE_MIGRATION_TIMEOUT, + MIGRATION_STATUS_NO_UNUSED_CONNECTION_ID, + MIGRATION_STATUS_MAX +}; + +// Result of a connectivity probing attempt. +enum class ProbingResult { + PENDING, // Probing started, pending result. + DISABLED_WITH_IDLE_SESSION, // Probing disabled with idle session. + DISABLED_BY_CONFIG, // Probing disabled by config. + DISABLED_BY_NON_MIGRABLE_STREAM, // Probing disabled by special stream. + INTERNAL_ERROR, // Probing failed for internal reason. +}; + +struct QUICHE_NO_EXPORT QuicConnectionMigrationConfig { + // Whether to probe and migrate to a different network upon path degrading in + // addition to the underlying platform's network change signals and write + // error which usually come later. If migrate_session_on_network_change is + // false, this must be false. + bool migrate_session_early = false; + // Whether to probe and migrate to a different port when migrating to a + // different network is not allowed upon path degrading. + bool allow_port_migration = false; + // Whether to migrate a session with no in-flight requests to a different + // network or port. + bool migrate_idle_session = false; + // Session can be migrated if its idle time is within this period. + QuicTimeDelta idle_migration_period = QuicTimeDelta::FromSeconds(30); + // Maximum time a connection is allowed to stay on a non-default network + // before migrating back to the default network. + QuicTimeDelta max_time_on_non_default_network = + QuicTimeDelta::FromSeconds(128); + // Maximum allowed number of migrations to non-default network triggered by + // packet write error per default network. + int max_migrations_to_non_default_network_on_write_error = 5; + // Maximum allowed number of migrations to non-default network triggered by + // path degrading per default network. + int max_migrations_to_non_default_network_on_path_degrading = 5; + // Maximum number of port migrations allowed per QUIC session. + int max_port_migrations_per_session = 4; + // Whether to migrate to a different network upon the underlying platform's + // network change signals and write error. + bool migrate_session_on_network_change = false; + + // Below are optional experimental features. + bool ignore_disconnect_signal_during_probing = true; + bool disable_blackhole_detection_on_immediate_migrate = true; + bool allow_server_preferred_address = true; +}; + +class QUICHE_EXPORT QuicConnectionMigrationDebugVisitor { + public: + virtual ~QuicConnectionMigrationDebugVisitor() = default; + + virtual void OnNetworkConnected(QuicNetworkHandle network) = 0; + virtual void OnConnectionMigrationAfterNetworkConnected( + QuicNetworkHandle network) = 0; + virtual void OnWaitingForNewNetworkToMigrate() = 0; + virtual void OnWaitingForNewNetworkSucceeded(QuicNetworkHandle network) = 0; + virtual void OnWaitForNetworkFailed() = 0; + virtual void OnNetworkDisconnected( + QuicNetworkHandle disconnected_network) = 0; + virtual void OnConnectionMigrationAfterNetworkDisconnected( + QuicNetworkHandle disconnected_network) = 0; + virtual void OnConnectionMigrationAfterWriteError( + QuicNetworkHandle current_network) = 0; + virtual void OnConnectionMigrationStartingAfterEvent( + absl::string_view event_name) = 0; + virtual void OnConnectionMigrationStarted() = 0; + virtual void OnPortMigrationStarting() = 0; + virtual void OnPortMigrationStarted() = 0; + virtual void OnConnectionMigrationBackToDefaultNetwork( + int num_migration_back_retries) = 0; + virtual void OnProbeResult(QuicNetworkHandle probed_network, + QuicSocketAddress peer_address, bool success) = 0; + virtual void OnConnectionMigrationFailedAfterProbe() = 0; + virtual void OnConnectionMigrationSucceededAfterProbe( + QuicNetworkHandle probed_network) = 0; + virtual void OnConnectionMigrationFailed(MigrationCause migration_cause, + QuicConnectionId connection_id, + absl::string_view details) = 0; + virtual void OnProbingServerPreferredAddressStarting() = 0; + virtual void OnProbingServerPreferredAddressStarted() = 0; + virtual void OnNetworkMadeDefault(QuicNetworkHandle network) = 0; + virtual void OnConnectionMigrationAfterNewDefaultNetwork( + QuicNetworkHandle network) = 0; + virtual void OnConnectionMigrationSuccess(MigrationCause migration_cause, + QuicConnectionId connection_id) = 0; +}; + +using MigrationCallback = + quiche::SingleUseCallback; +using StartProbingCallback = quiche::SingleUseCallback; + +// This class receives network change signals from the device and events +// reported by the connection, like path degrading and write error, to make +// decision about whether and how to migrate the connection to a different +// network or port. +class QUICHE_EXPORT QuicConnectionMigrationManager { + public: + // `path_context_factory` can be nullptr, in which case no migration will be + // performed regardless of the migration `config`. + QuicConnectionMigrationManager( + QuicSpdyClientSessionWithMigration* absl_nonnull session, + const quic::QuicClock* absl_nonnull clock, + QuicNetworkHandle default_network, QuicNetworkHandle current_network, + QuicPathContextFactory* absl_nullable path_context_factory, + const QuicConnectionMigrationConfig& config); + + ~QuicConnectionMigrationManager(); + + // Called when the platform detects a newly connected network. Migrates this + // session to the newly connected network if the session has previously + // attempted to migrate off the current network for various reasons but failed + // because there was no alternate network available at the time. + void OnNetworkConnected(QuicNetworkHandle network); + + // Called when the platform detects the given network to be disconnected. + void OnNetworkDisconnected(QuicNetworkHandle disconnected_network); + + // Called when the platform chooses the given network as the default network. + // Migrates this session to it if appropriate. + void OnNetworkMadeDefault(QuicNetworkHandle new_network); + + // Maybe start migrating the session to a different port or a different + // network. + void OnPathDegrading(); + + // Called by the session when write error occurs to attempt switching to a + // different network. + // Returns true to tell the caller to ignore this writer error. + bool MaybeStartMigrateSessionOnWriteError(int error_code); + + // Called by the session when the handshake gets completed to attempt + // switching to the platform's default network asynchronously if not on it + // yet. |config| is the negotiated QUIC configuration. + void OnHandshakeCompleted(const QuicConfig& negotiated_config); + + // Called by the session after receiving server's preferred address. + void MaybeStartMigrateSessionToServerPreferredAddress( + const quic::QuicSocketAddress& server_preferred_address); + + void OnMigrationFailure(QuicConnectionMigrationStatus status, + absl::string_view reason); + + // Called when migration alarm fires. If migration has not occurred + // since alarm was set, closes session with error. + void OnMigrationTimeout(); + // Called when there are pending callbacks to be executed. + void RunPendingCallbacks(); + // Called when migrating to default network timer fires. + void MaybeRetryMigrateBackToDefaultNetwork(); + + // Called when probing alternative network for connection migration succeeds. + void OnConnectionMigrationProbeSucceeded( + std::unique_ptr path_context, + quic::QuicTime start_time); + // Called when probing a different port succeeds. + void OnPortMigrationProbeSucceeded( + std::unique_ptr path_context, + quic::QuicTime start_time); + // Called when probing the server's preferred address from a different port + // succeeds. + void OnServerPreferredAddressProbeSucceeded( + std::unique_ptr path_context, + quic::QuicTime start_time); + + // Called when any type of probing failed. + void OnProbeFailed(std::unique_ptr path_context); + + void set_debug_visitor( + QuicConnectionMigrationDebugVisitor* absl_nullable visitor) { + debug_visitor_ = visitor; + } + + const QuicConnectionMigrationConfig& config() const { return config_; } + + // Returns the network interface that is currently used to send packets. + QuicNetworkHandle current_network() const { return current_network_; } + + // Returns the network interface that is picked as default by the platform. + QuicNetworkHandle default_network() const { return default_network_; } + + bool migration_attempted() const { return migration_attempted_; } + + bool migration_successful() const { return migration_successful_; } + + private: + friend class test::QuicConnectionMigrationManagerPeer; + + class PathContextCreationResultDelegateForImmediateMigration + : public QuicPathContextFactory::CreationResultDelegate { + public: + // |migration_manager| should out live this instance. + PathContextCreationResultDelegateForImmediateMigration( + QuicConnectionMigrationManager* absl_nonnull migration_manager, + bool close_session_on_error, MigrationCallback migration_callback); + + void OnCreationSucceeded( + std::unique_ptr context) override; + + void OnCreationFailed(QuicNetworkHandle network, + absl::string_view error) override; + + private: + QuicConnectionMigrationManager* absl_nonnull migration_manager_; + const bool close_session_on_error_; + MigrationCallback migration_callback_; + }; + + // A callback implementation for creating a path context object used for + // probing. + class PathContextCreationResultDelegateForProbing + : public QuicPathContextFactory::CreationResultDelegate { + public: + // `migration_manager` should out live this instance. + PathContextCreationResultDelegateForProbing( + QuicConnectionMigrationManager* absl_nonnull migration_manager, + StartProbingCallback probing_callback); + + void OnCreationSucceeded( + std::unique_ptr context) override; + + void OnCreationFailed(QuicNetworkHandle network, + absl::string_view error) override; + + private: + QuicConnectionMigrationManager* absl_nonnull migration_manager_; + StartProbingCallback probing_callback_; + }; + + // Schedules a migration alarm to wait for a new network. + void OnNoNewNetwork(); + + // Called when there is only one possible working network: |network|, if any + // error is encountered, this session will be closed. + // When the migration succeeds: + // - If no longer on the default network, set timer to migrate back to the + // default network; + // - If now on the default network, cancel timer to migrate back to default + // network. + void MigrateNetworkImmediately(QuicNetworkHandle network); + + void FinishMigrateNetworkImmediately(QuicNetworkHandle network, + MigrationResult result); + + // Migrates session over to use |peer_address| and |network|. + // If |network| is kInvalidNetworkHandle, default network is used. If + // the migration fails and |close_session_on_error| is true, session will be + // closed. + void Migrate(QuicNetworkHandle network, QuicSocketAddress peer_address, + bool close_session_on_error, + MigrationCallback migration_callback); + // Helper to finish session migration once the |path_context| is provided. + void FinishMigrate( + std::unique_ptr path_context, + bool close_session_on_error, MigrationCallback callback); + + void StartMigrateBackToDefaultNetworkTimer(QuicTimeDelta delay); + void CancelMigrateBackToDefaultNetworkTimer(); + + void TryMigrateBackToDefaultNetwork(QuicTimeDelta next_try_timeout); + + void FinishTryMigrateBackToDefaultNetwork(QuicTimeDelta next_try_timeout, + ProbingResult result); + + // Migration might happen asynchronously (async socket creation or no new + // network). + void StartMigrateSessionOnWriteError(QuicPacketWriter* writer); + + void FinishMigrateSessionOnWriteError(QuicNetworkHandle new_network, + MigrationResult result); + + void MaybeProbeAndMigrateToAlternateNetworkOnPathDegrading(); + + void StartProbing(StartProbingCallback probing_callback, + QuicNetworkHandle network, + const QuicSocketAddress& peer_address); + void FinishStartProbing( + StartProbingCallback probing_callback, + std::unique_ptr path_context); + + bool MaybeCloseIdleSession(bool has_write_error, + ConnectionCloseBehavior close_behavior); + + void RunCallbackInNextLoop(quiche::SingleUseCallback); + void RecordMetricsOnNetworkMadeDefault(); + void RecordMetricsOnNetworkDisconnected(); + void RecordHandshakeStatusOnMigrationSignal() const; + void RecordProbeResultToHistogram(MigrationCause cause, bool success); + void OnMigrationSuccess(); + void ResetMigrationCauseAndLogResult(QuicConnectionMigrationStatus status); + + QuicSpdyClientSessionWithMigration* absl_nonnull session_; + QuicConnection* absl_nonnull connection_; + const quic::QuicClock* absl_nonnull clock_; // Unowned. + // Stores the latest default network platform marks if migration is enabled. + // Otherwise, stores the network interface that is currently used by the + // connection (same as `current_network_`). + QuicNetworkHandle default_network_; + // Stores the network interface that is currently used by the connection. + QuicNetworkHandle current_network_; + // Nullptr if no migration is allowed. + QuicPathContextFactory* absl_nullable path_context_factory_; + // Not owned. + QuicConnectionMigrationDebugVisitor* absl_nullable debug_visitor_ = nullptr; + const QuicConnectionMigrationConfig config_; + bool migration_disabled_ = false; + + // True when session migration has started from + // `StartMigrateSessionOnWriteError`. + bool pending_migrate_session_on_write_error_ = false; + // True when a session migration starts from `MigrateNetworkImmediately`. + bool pending_migrate_network_immediately_ = false; + int retry_migrate_back_count_ = 0; + MigrationCause current_migration_cause_ = MigrationCause::UNKNOWN_CAUSE; + // True if migration is triggered, and there is no alternate network to + // migrate to. + bool wait_for_new_network_ = false; + int current_migrations_to_non_default_network_on_write_error_ = 0; + int current_migrations_to_non_default_network_on_path_degrading_ = 0; + int current_migrations_to_different_port_on_path_degrading_ = 0; + quic::QuicTime most_recent_path_degrading_timestamp_ = quic::QuicTime::Zero(); + quic::QuicTime most_recent_network_disconnected_timestamp_ = + quic::QuicTime::Zero(); + int most_recent_write_error_; + quic::QuicTime most_recent_write_error_timestamp_ = quic::QuicTime::Zero(); + bool migration_attempted_ = false; + bool migration_successful_ = false; + + std::unique_ptr migrate_back_to_default_timer_; + std::unique_ptr wait_for_migration_alarm_; + std::unique_ptr run_pending_callbacks_alarm_; + std::list> pending_callbacks_; +}; + +} // namespace quic + +#endif // QUICHE_QUIC_CORE_HTTP_QUIC_CONNECTION_MIGRATION_MANAGER_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc index e7fc445944..18dda1ca62 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc @@ -36,12 +36,12 @@ QuicServerSessionBase::QuicServerSessionBase( QuicPriorityType priority_type) : QuicSpdySession(connection, visitor, config, supported_versions, priority_type), - crypto_config_(crypto_config), - compressed_certs_cache_(compressed_certs_cache), - helper_(helper), bandwidth_resumption_enabled_(false), + compressed_certs_cache_(compressed_certs_cache), bandwidth_estimate_sent_to_client_(QuicBandwidth::Zero()), - last_scup_time_(QuicTime::Zero()) {} + crypto_config_(crypto_config), + last_scup_time_(QuicTime::Zero()), + helper_(helper) {} QuicServerSessionBase::~QuicServerSessionBase() {} diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.h index c38c6152ae..9e688907db 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.h @@ -111,35 +111,35 @@ class QUICHE_EXPORT QuicServerSessionBase : public QuicSpdySession { // data. void SendSettingsToCryptoStream(); - const QuicCryptoServerConfig* crypto_config_; + std::unique_ptr crypto_stream_; + + // Whether bandwidth resumption is enabled for this connection. + bool bandwidth_resumption_enabled_; // The cache which contains most recently compressed certs. // Owned by QuicDispatcher. QuicCompressedCertsCache* compressed_certs_cache_; - std::unique_ptr crypto_stream_; + // The most recent bandwidth estimate sent to the client. + QuicBandwidth bandwidth_estimate_sent_to_client_; + + const QuicCryptoServerConfig* crypto_config_; + + // Time at which we send the last SCUP to the client. + QuicTime last_scup_time_; // Pointer to the helper used to create crypto server streams. Must outlive // streams created via CreateQuicCryptoServerStream. QuicCryptoServerStreamBase::Helper* helper_; - // Whether bandwidth resumption is enabled for this connection. - bool bandwidth_resumption_enabled_; - - // The most recent bandwidth estimate sent to the client. - QuicBandwidth bandwidth_estimate_sent_to_client_; + // Number of packets sent to the peer, at the time we last sent a SCUP. + QuicPacketNumber last_scup_packet_number_; // Text describing server location. Sent to the client as part of the // bandwidth estimate in the source-address token. Optional, can be left // empty. std::string serving_region_; - // Time at which we send the last SCUP to the client. - QuicTime last_scup_time_; - - // Number of packets sent to the peer, at the time we last sent a SCUP. - QuicPacketNumber last_scup_packet_number_; - // Converts QuicBandwidth to an int32 bytes/second that can be // stored in CachedNetworkParameters. TODO(jokulik): This function // should go away once we fix http://b//27897982 diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc index 901dbd4b25..ffbf98413f 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc @@ -34,17 +34,40 @@ QuicSpdyClientSession::QuicSpdyClientSession( QuicConnection* connection, QuicSession::Visitor* visitor, const QuicServerId& server_id, QuicCryptoClientConfig* crypto_config, QuicPriorityType priority_type) - : QuicSpdyClientSessionBase(connection, visitor, config, supported_versions, - priority_type), + : QuicSpdyClientSession(config, supported_versions, connection, visitor, + /*writer=*/nullptr, /*migration_helper=*/nullptr, + QuicConnectionMigrationConfig{ + .allow_server_preferred_address = false}, + server_id, crypto_config, priority_type) {} + +QuicSpdyClientSession::QuicSpdyClientSession( + const QuicConfig& config, const ParsedQuicVersionVector& supported_versions, + QuicConnection* connection, QuicSession::Visitor* visitor, + QuicForceBlockablePacketWriter* absl_nullable writer, + QuicMigrationHelper* absl_nullable migration_helper, + const QuicConnectionMigrationConfig& migration_config, + const QuicServerId& server_id, QuicCryptoClientConfig* crypto_config, + QuicPriorityType priority_type) + : QuicSpdyClientSessionWithMigration( + connection, writer, visitor, config, supported_versions, + (migration_helper == nullptr ? kInvalidNetworkHandle + : migration_helper->GetDefaultNetwork()), + (migration_helper == nullptr ? kInvalidNetworkHandle + : migration_helper->GetCurrentNetwork()), + (migration_helper == nullptr + ? nullptr + : migration_helper->CreateQuicPathContextFactory()), + migration_config, priority_type), server_id_(server_id), crypto_config_(crypto_config), + migration_helper_(migration_helper), respect_goaway_(true) {} QuicSpdyClientSession::~QuicSpdyClientSession() = default; void QuicSpdyClientSession::Initialize() { crypto_stream_ = CreateQuicCryptoStream(); - QuicSpdyClientSessionBase::Initialize(); + QuicSpdyClientSessionWithMigration::Initialize(); } void QuicSpdyClientSession::OnProofValid( @@ -198,4 +221,29 @@ QuicSpdyClientSession::CreateQuicCryptoStream() { this, /*has_application_state = */ version().UsesHttp3()); } +QuicNetworkHandle QuicSpdyClientSession::FindAlternateNetwork( + QuicNetworkHandle network) { + QUICHE_BUG_IF(migration_helper_not_initialized1, + migration_helper_ == nullptr); + return migration_helper_->FindAlternateNetwork(network); +} + +void QuicSpdyClientSession::PrepareForProbingOnPath( + QuicPathValidationContext& context) { + QUIC_DVLOG(1) << "About to probe path " << context; +} + +bool QuicSpdyClientSession::PrepareForMigrationToPath( + QuicClientPathValidationContext& context) { + QUIC_DVLOG(1) << "About to migrate to path " << context; + return true; +} + +void QuicSpdyClientSession::OnMigrationToPathDone( + std::unique_ptr context, bool success) { + QUICHE_BUG_IF(migration_helper_not_initialized2, + migration_helper_ == nullptr); + migration_helper_->OnMigrationToPathDone(std::move(context), success); +} + } // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.h index fc9838ab1b..2969f47faa 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.h @@ -10,7 +10,7 @@ #include #include -#include "quiche/quic/core/http/quic_spdy_client_session_base.h" +#include "quiche/quic/core/http/quic_spdy_client_session_with_migration.h" #include "quiche/quic/core/http/quic_spdy_client_stream.h" #include "quiche/quic/core/quic_crypto_client_stream.h" #include "quiche/quic/core/quic_packets.h" @@ -20,7 +20,28 @@ namespace quic { class QuicConnection; class QuicServerId; -class QUICHE_EXPORT QuicSpdyClientSession : public QuicSpdyClientSessionBase { +// An interface that provides migration related functionalities to the session: +// network retrieval and path context creation. +class QUIC_NO_EXPORT QuicMigrationHelper { + public: + virtual ~QuicMigrationHelper() = default; + + virtual QuicNetworkHandle FindAlternateNetwork(QuicNetworkHandle network) = 0; + + virtual std::unique_ptr + CreateQuicPathContextFactory() = 0; + + virtual void OnMigrationToPathDone( + std::unique_ptr context, + bool success) = 0; + + virtual QuicNetworkHandle GetDefaultNetwork() = 0; + + virtual QuicNetworkHandle GetCurrentNetwork() = 0; +}; + +class QUICHE_EXPORT QuicSpdyClientSession + : public QuicSpdyClientSessionWithMigration { public: // Takes ownership of |connection|. QuicSpdyClientSession( @@ -37,6 +58,20 @@ class QUICHE_EXPORT QuicSpdyClientSession : public QuicSpdyClientSessionBase { const QuicServerId& server_id, QuicCryptoClientConfig* crypto_config, QuicPriorityType priority_type = QuicPriorityType::kHttp); + // `writer` and `migration_helper` can be nullptr. However, if + // `migration_helper` is not nullptr, the session will support connection + // migration and port migration and `writer` must be the current writer of the + // `connection`. + QuicSpdyClientSession( + const QuicConfig& config, + const ParsedQuicVersionVector& supported_versions, + QuicConnection* connection, QuicSession::Visitor* visitor, + QuicForceBlockablePacketWriter* absl_nullable writer, + QuicMigrationHelper* absl_nullable migration_helper, + const QuicConnectionMigrationConfig& migration_config, + const QuicServerId& server_id, QuicCryptoClientConfig* crypto_config, + QuicPriorityType priority_type = QuicPriorityType::kHttp); + QuicSpdyClientSession(const QuicSpdyClientSession&) = delete; QuicSpdyClientSession& operator=(const QuicSpdyClientSession&) = delete; ~QuicSpdyClientSession() override; @@ -53,6 +88,18 @@ class QUICHE_EXPORT QuicSpdyClientSession : public QuicSpdyClientSessionBase { void OnProofVerifyDetailsAvailable( const ProofVerifyDetails& verify_details) override; + // QuicSpdyClientSessionWithMigration methods: + void OnConnectionToBeClosedDueToMigrationError( + MigrationCause /*migration_cause*/, + QuicErrorCode /*quic_error*/) override {} + void ResetNonMigratableStreams() override {} + void OnNoNewNetworkForMigration() override {} + void StartDraining() override {} + void PrepareForProbingOnPath(QuicPathValidationContext& context) override; + bool IsSessionProxied() const override { return false; } + QuicNetworkHandle FindAlternateNetwork( + quic::QuicNetworkHandle network) override; + // Performs a crypto handshake with the server. virtual void CryptoConnect(); @@ -118,9 +165,17 @@ class QUICHE_EXPORT QuicSpdyClientSession : public QuicSpdyClientSessionBase { QuicCryptoClientConfig* crypto_config() { return crypto_config_; } private: + // QuicSpdyClientSessionWithMigration methods: + bool PrepareForMigrationToPath( + QuicClientPathValidationContext& context) override; + void OnMigrationToPathDone( + std::unique_ptr context, + bool success) override; + std::unique_ptr crypto_stream_; QuicServerId server_id_; QuicCryptoClientConfig* crypto_config_; + QuicMigrationHelper* absl_nullable migration_helper_; // If this is set to false, the client will ignore server GOAWAYs and allow // the creation of streams regardless of the high chance they will fail. diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_with_migration.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_with_migration.cc new file mode 100644 index 0000000000..08c2c6741a --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_with_migration.cc @@ -0,0 +1,137 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "quiche/quic/core/http/quic_spdy_client_session_with_migration.h" + +#include "quiche/quic/core/quic_force_blockable_packet_writer.h" +#include "quiche/quic/core/quic_types.h" + +namespace quic { + +QuicSpdyClientSessionWithMigration::QuicSpdyClientSessionWithMigration( + QuicConnection* connection, QuicForceBlockablePacketWriter* writer, + QuicSession::Visitor* visitor, const QuicConfig& config, + const ParsedQuicVersionVector& supported_versions, + QuicNetworkHandle default_network, QuicNetworkHandle current_network, + std::unique_ptr path_context_factory, + const QuicConnectionMigrationConfig& migration_config, + QuicPriorityType priority_type) + : QuicSpdyClientSessionBase(connection, visitor, config, supported_versions, + priority_type), + path_context_factory_(std::move(path_context_factory)), + migration_manager_(this, connection->clock(), default_network, + current_network, path_context_factory_.get(), + migration_config), + writer_(writer), + most_recent_stream_close_time_(connection->clock()->ApproximateNow()) { + QUICHE_DCHECK(writer_ == nullptr || writer_ == connection->writer()) + << "Writer is should be either null or the connection writer"; + if (migration_config.migrate_session_on_network_change || + migration_config.allow_port_migration || + migration_config.allow_server_preferred_address) { + QUICHE_DCHECK_EQ(writer_, connection->writer()) + << "Writer is not the connection writer"; + } +} + +QuicSpdyClientSessionWithMigration::~QuicSpdyClientSessionWithMigration() = + default; + +void QuicSpdyClientSessionWithMigration::OnPathDegrading() { + QuicSpdyClientSessionBase::OnPathDegrading(); + migration_manager_.OnPathDegrading(); +} + +void QuicSpdyClientSessionWithMigration::OnTlsHandshakeComplete() { + QuicSpdyClientSessionBase::OnTlsHandshakeComplete(); + migration_manager_.OnHandshakeCompleted(*config()); +} + +void QuicSpdyClientSessionWithMigration::SetDefaultEncryptionLevel( + EncryptionLevel level) { + QuicSpdyClientSessionBase::SetDefaultEncryptionLevel(level); + if (level == ENCRYPTION_FORWARD_SECURE) { + migration_manager_.OnHandshakeCompleted(*config()); + } +} + +bool QuicSpdyClientSessionWithMigration::MigrateToNewPath( + std::unique_ptr path_context) { + if (!PrepareForMigrationToPath(*path_context)) { + QUIC_CLIENT_HISTOGRAM_BOOL("QuicSession.PrepareForMigrationToPath", false, + ""); + return false; + } + const bool success = MigratePath( + path_context->self_address(), path_context->peer_address(), + path_context->WriterToUse(), path_context->ShouldConnectionOwnWriter()); + + if (!success) { + migration_manager_.OnMigrationFailure( + QuicConnectionMigrationStatus::MIGRATION_STATUS_NO_UNUSED_CONNECTION_ID, + "No unused server connection ID"); + QUIC_DVLOG(1) << "MigratePath fails as there is no CID available"; + } + writer_ = path_context->ForceBlockableWriterToUse(); + QUICHE_DCHECK_EQ(writer_, connection()->writer()); + OnMigrationToPathDone(std::move(path_context), success); + return success; +} + +void QuicSpdyClientSessionWithMigration::OnServerPreferredAddressAvailable( + const QuicSocketAddress& server_preferred_address) { + QUICHE_DCHECK(version().HasIetfQuicFrames()); + QuicSpdyClientSessionBase::OnServerPreferredAddressAvailable( + server_preferred_address); + migration_manager_.MaybeStartMigrateSessionToServerPreferredAddress( + server_preferred_address); +} + +void QuicSpdyClientSessionWithMigration::SetMigrationDebugVisitor( + QuicConnectionMigrationDebugVisitor* visitor) { + migration_manager_.set_debug_visitor(visitor); +} + +const QuicConnectionMigrationConfig& +QuicSpdyClientSessionWithMigration::GetConnectionMigrationConfig() const { + return migration_manager_.config(); +} + +void QuicSpdyClientSessionWithMigration::OnStreamClosed( + QuicStreamId stream_id) { + most_recent_stream_close_time_ = connection()->clock()->ApproximateNow(); + QuicSpdyClientSessionBase::OnStreamClosed(stream_id); +} + +QuicTimeDelta QuicSpdyClientSessionWithMigration::TimeSinceLastStreamClose() { + return connection()->clock()->ApproximateNow() - + most_recent_stream_close_time_; +} + +bool QuicSpdyClientSessionWithMigration::MaybeMitigateWriteError( + const WriteResult& write_result) { + if (write_result.status == WRITE_STATUS_ERROR) { + // Only mitigate `WRITE_STATUS_ERROR`. `WRITE_STATUS_MSG_TOO_BIG` won't + // cause connection close. And `WRITE_STATUS_FAILED_TO_COALESCE_PACKET` is + // not caused by network issues. + if (migration_manager_.MaybeStartMigrateSessionOnWriteError( + write_result.error_code)) { + QUICHE_DCHECK( + GetConnectionMigrationConfig().migrate_session_on_network_change); + QUIC_DVLOG(1) << "Starting migration to mitigate write error"; + // Since the migration is asynchronous. Force blocking the packet writer + // to avoid any more writes before switching to a new network. + writer_->ForceWriteBlocked(true); + return true; + } + } else if (write_result.status != WRITE_STATUS_MSG_TOO_BIG && + write_result.status != WRITE_STATUS_FAILED_TO_COALESCE_PACKET) { + // If this gets hit, consider if the new error status should be mitigated. + QUICHE_BUG(unhandled_write_error_status) + << "Unhandled write error status: " << write_result.status; + } + return false; +} + +} // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_with_migration.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_with_migration.h new file mode 100644 index 0000000000..0956c76c46 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_with_migration.h @@ -0,0 +1,126 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_CORE_HTTP_QUIC_SPDY_CLIENT_SESSION_WITH_MIGRATION_H_ +#define QUICHE_QUIC_CORE_HTTP_QUIC_SPDY_CLIENT_SESSION_WITH_MIGRATION_H_ + +#include + +#include "quiche/quic/core/http/quic_connection_migration_manager.h" +#include "quiche/quic/core/http/quic_spdy_client_session_base.h" +#include "quiche/quic/core/quic_config.h" +#include "quiche/quic/core/quic_connection.h" +#include "quiche/quic/core/quic_error_codes.h" +#include "quiche/quic/core/quic_force_blockable_packet_writer.h" +#include "quiche/quic/core/quic_path_context_factory.h" +#include "quiche/quic/core/quic_session.h" +#include "quiche/quic/core/quic_time.h" +#include "quiche/quic/core/quic_types.h" +#include "quiche/quic/core/quic_versions.h" +#include "quiche/quic/platform/api/quic_socket_address.h" +#include "quiche/common/platform/api/quiche_export.h" + +namespace quic { + +// A client session implementation that supports connection migration upon these +// events under IETF versions: +// 1. platform's network change signals +// 2. packetwrite error +// 3. QuicConnection detected path degrading +// 4. received server preferred address +// 5. handshake completion on a non-default network. +// TODO(danzh): Rename this class to be something more like a base class. +class QUICHE_EXPORT QuicSpdyClientSessionWithMigration + : public QuicSpdyClientSessionBase { + public: + // `writer` must be the same as the connection's writer if any type of + // migration is enabled. Otherwise, it can also be nullptr. + QuicSpdyClientSessionWithMigration( + QuicConnection* connection, QuicForceBlockablePacketWriter* writer, + QuicSession::Visitor* visitor, const QuicConfig& config, + const ParsedQuicVersionVector& supported_versions, + QuicNetworkHandle default_network, QuicNetworkHandle current_network, + std::unique_ptr path_context_factory, + const QuicConnectionMigrationConfig& migration_config, + QuicPriorityType priority_type); + + ~QuicSpdyClientSessionWithMigration() override; + + // Called before connection gets closed upon a migration failure. + virtual void OnConnectionToBeClosedDueToMigrationError( + MigrationCause migration_cause, QuicErrorCode quic_error) = 0; + + // Returns a network handle which is different from the given |network|; + virtual QuicNetworkHandle FindAlternateNetwork(QuicNetworkHandle network) = 0; + + // Close non-migratable streams in both directions by sending reset stream to + // peer when connection migration attempts to migrate to the alternate + // network. + virtual void ResetNonMigratableStreams() = 0; + + // Called when there is no new network available to migrate to upon write + // error or network disconnect. + virtual void OnNoNewNetworkForMigration() = 0; + + // Mark the session draining to not accept any new requests. + virtual void StartDraining() = 0; + + // Called before using the given |context| to probe a path. + virtual void PrepareForProbingOnPath(QuicPathValidationContext& context) = 0; + + virtual bool IsSessionProxied() const = 0; + + // Returns the time elapsed since the latest stream closure. + quic::QuicTimeDelta TimeSinceLastStreamClose(); + + // QuicSpdyClientSessionBase + void OnPathDegrading() override; + void OnTlsHandshakeComplete() override; + void SetDefaultEncryptionLevel(EncryptionLevel level) override; + void OnServerPreferredAddressAvailable( + const quic::QuicSocketAddress& server_preferred_address) override; + bool MaybeMitigateWriteError(const WriteResult& write_result) override; + void OnStreamClosed(QuicStreamId stream_id) override; + + // Migrates session onto the new path, i.e. changing the default writer and + // network. + // Returns true on successful migration. + bool MigrateToNewPath( + std::unique_ptr path_context); + + void SetMigrationDebugVisitor( + quic::QuicConnectionMigrationDebugVisitor* visitor); + + const QuicConnectionMigrationConfig& GetConnectionMigrationConfig() const; + + QuicConnectionMigrationManager& migration_manager() { + return migration_manager_; + } + + const QuicConnectionMigrationManager& migration_manager() const { + return migration_manager_; + } + + QuicForceBlockablePacketWriter* writer() { return writer_; } + + private: + // Called in MigrateToNewPath() prior to calling MigratePath(). + // Return false if MigratePath() should be skipped. + virtual bool PrepareForMigrationToPath( + QuicClientPathValidationContext& context) = 0; + + // Called in MigrateToNewPath() after MigratePath() for clean up. + virtual void OnMigrationToPathDone( + std::unique_ptr context, + bool success) = 0; + + std::unique_ptr path_context_factory_; + QuicConnectionMigrationManager migration_manager_; + QuicForceBlockablePacketWriter* writer_; + QuicTime most_recent_stream_close_time_; +}; + +} // namespace quic + +#endif // QUICHE_QUIC_CORE_HTTP_QUIC_SPDY_CLIENT_SESSION_WITH_MIGRATION_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc index 91f81750ab..da91c57cb5 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc @@ -542,28 +542,28 @@ QuicSpdySession::QuicSpdySession( kHttp3StaticUnidirectionalStreamCount) : 0u, std::make_unique(this), priority_type), - send_control_stream_(nullptr), - receive_control_stream_(nullptr), - qpack_encoder_receive_stream_(nullptr), - qpack_decoder_receive_stream_(nullptr), - qpack_encoder_send_stream_(nullptr), - qpack_decoder_send_stream_(nullptr), + fin_(false), + allow_extended_connect_(perspective() == Perspective::IS_SERVER && + VersionUsesHttp3(transport_version())), + force_buffer_requests_until_settings_(false), + destruction_indicator_(123456789), + stream_id_( + QuicUtils::GetInvalidStreamId(connection->transport_version())), + debug_visitor_(nullptr), + frame_len_(0), qpack_maximum_dynamic_table_capacity_( GetDefaultQpackMaximumDynamicTableCapacity(perspective())), qpack_maximum_blocked_streams_(kDefaultMaximumBlockedStreams), + receive_control_stream_(nullptr), max_inbound_header_list_size_(kDefaultMaxUncompressedHeaderSize), + send_control_stream_(nullptr), + qpack_decoder_receive_stream_(nullptr), + qpack_encoder_receive_stream_(nullptr), + qpack_encoder_send_stream_(nullptr), max_outbound_header_list_size_(std::numeric_limits::max()), - stream_id_( - QuicUtils::GetInvalidStreamId(connection->transport_version())), - frame_len_(0), - fin_(false), - spdy_framer_(SpdyFramer::ENABLE_COMPRESSION), spdy_framer_visitor_(new SpdyFramerVisitor(this)), - debug_visitor_(nullptr), - destruction_indicator_(123456789), - allow_extended_connect_(perspective() == Perspective::IS_SERVER && - VersionUsesHttp3(transport_version())), - force_buffer_requests_until_settings_(false) { + qpack_decoder_send_stream_(nullptr), + spdy_framer_(SpdyFramer::ENABLE_COMPRESSION) { h2_deframer_.set_visitor(spdy_framer_visitor_.get()); h2_deframer_.set_debug_visitor(spdy_framer_visitor_.get()); spdy_framer_.set_debug_visitor(spdy_framer_visitor_.get()); @@ -1764,20 +1764,20 @@ void QuicSpdySession::LogHeaderCompressionRatioHistogram( } } -MessageStatus QuicSpdySession::SendHttp3Datagram(QuicStreamId stream_id, - absl::string_view payload) { +DatagramStatus QuicSpdySession::SendHttp3Datagram(QuicStreamId stream_id, + absl::string_view payload) { if (!SupportsH3Datagram()) { if (LocalHttpDatagramSupport() == HttpDatagramSupport::kNone) { QUIC_BUG(http datagram disabled locally) << "Cannot send HTTP Datagram when disabled locally"; - return MESSAGE_STATUS_UNSUPPORTED; + return DATAGRAM_STATUS_UNSUPPORTED; } else if (!settings_received_) { QUIC_DLOG(INFO) << "Refusing to send HTTP Datagram before SETTINGS received"; - return MESSAGE_STATUS_SETTINGS_NOT_RECEIVED; + return DATAGRAM_STATUS_SETTINGS_NOT_RECEIVED; } else { QUIC_DLOG(INFO) << "Refusing to send HTTP Datagram without peer support"; - return MESSAGE_STATUS_UNSUPPORTED; + return DATAGRAM_STATUS_UNSUPPORTED; } } // Stream ID is sent divided by four as per the specification. @@ -1790,12 +1790,12 @@ MessageStatus QuicSpdySession::SendHttp3Datagram(QuicStreamId stream_id, if (!writer.WriteVarInt62(stream_id_to_write)) { QUIC_BUG(h3 datagram stream ID write fail) << "Failed to write HTTP/3 datagram stream ID"; - return MESSAGE_STATUS_INTERNAL_ERROR; + return DATAGRAM_STATUS_INTERNAL_ERROR; } if (!writer.WriteBytes(payload.data(), payload.length())) { QUIC_BUG(h3 datagram payload write fail) << "Failed to write HTTP/3 datagram payload"; - return MESSAGE_STATUS_INTERNAL_ERROR; + return DATAGRAM_STATUS_INTERNAL_ERROR; } quiche::QuicheMemSlice slice(std::move(buffer)); @@ -1809,13 +1809,13 @@ void QuicSpdySession::SetMaxDatagramTimeInQueueForStreamId( datagram_queue()->SetMaxTimeInQueue(max_time_in_queue); } -void QuicSpdySession::OnMessageReceived(absl::string_view message) { - QuicSession::OnMessageReceived(message); +void QuicSpdySession::OnDatagramReceived(absl::string_view datagram) { + QuicSession::OnDatagramReceived(datagram); if (!SupportsH3Datagram()) { QUIC_DLOG(INFO) << "Ignoring unexpected received HTTP/3 datagram"; return; } - QuicDataReader reader(message); + QuicDataReader reader(datagram); uint64_t stream_id64; if (!reader.ReadVarInt62(&stream_id64)) { QUIC_DLOG(ERROR) << "Failed to parse stream ID in received HTTP/3 datagram"; @@ -1980,12 +1980,12 @@ QuicSpdyStream* QuicSpdySession::CreateOutgoingBidirectionalWebTransportStream( } void QuicSpdySession::OnDatagramProcessed( - std::optional /*status*/) { + std::optional /*status*/) { // TODO(b/184598230): make this work with multiple datagram flows. } void QuicSpdySession::DatagramObserver::OnDatagramProcessed( - std::optional status) { + std::optional status) { session_->OnDatagramProcessed(status); } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.h index e303c4d97a..6560cd36d6 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.h @@ -403,14 +403,14 @@ class QUICHE_EXPORT QuicSpdySession } // This must not be used except by QuicSpdyStream::SendHttp3Datagram. - MessageStatus SendHttp3Datagram(QuicStreamId stream_id, - absl::string_view payload); + DatagramStatus SendHttp3Datagram(QuicStreamId stream_id, + absl::string_view payload); // This must not be used except by QuicSpdyStream::SetMaxDatagramTimeInQueue. void SetMaxDatagramTimeInQueueForStreamId(QuicStreamId stream_id, QuicTime::Delta max_time_in_queue); // Override from QuicSession to support HTTP/3 datagrams. - void OnMessageReceived(absl::string_view message) override; + void OnDatagramReceived(absl::string_view datagram) override; // Indicates whether the HTTP/3 session supports WebTransport. bool SupportsWebTransport(); @@ -554,7 +554,7 @@ class QUICHE_EXPORT QuicSpdySession void MaybeBundleOpportunistically() override; // Called whenever a datagram is dequeued or dropped from datagram_queue(). - virtual void OnDatagramProcessed(std::optional status); + virtual void OnDatagramProcessed(std::optional status); // Returns which version of the HTTP/3 datagram extension we should advertise // in settings and accept remote settings for. @@ -594,7 +594,7 @@ class QUICHE_EXPORT QuicSpdySession class QUICHE_EXPORT DatagramObserver : public QuicDatagramQueue::Observer { public: explicit DatagramObserver(QuicSpdySession* session) : session_(session) {} - void OnDatagramProcessed(std::optional status) override; + void OnDatagramProcessed(std::optional status) override; private: QuicSpdySession* session_; // not owned @@ -632,26 +632,42 @@ class QUICHE_EXPORT QuicSpdySession bool ValidateWebTransportSettingsConsistency(); - HuffmanEncoding huffman_encoding_ = HuffmanEncoding::kEnabled; - CookieCrumbling cookie_crumbling_ = CookieCrumbling::kEnabled; - std::unique_ptr qpack_encoder_; std::unique_ptr qpack_decoder_; + http2::Http2DecoderAdapter h2_deframer_; + bool fin_; + // Whether the SETTINGS frame has been received on the control stream. + bool settings_received_ = false; + + // Whether both this endpoint and our peer support HTTP datagrams and which + // draft is in use for this session. + HttpDatagramSupport http_datagram_support_ = HttpDatagramSupport::kNone; + + // On the server side, if true, advertise and accept extended CONNECT method. + // On the client side, true if the peer advertised extended CONNECT. + bool allow_extended_connect_; + // Allows forcing ShouldBufferRequestsUntilSettings() to true via + // a connection option. + bool force_buffer_requests_until_settings_; + + // WebTransport protocol versions supported by the peer. + WebTransportHttp3VersionSet peer_web_transport_versions_; + CookieCrumbling cookie_crumbling_ = CookieCrumbling::kEnabled; + // An integer used for live check. The indicator is assigned a value in + // constructor. As long as it is not the assigned value, that would indicate + // an use-after-free. + int32_t destruction_indicator_; + HuffmanEncoding huffman_encoding_ = HuffmanEncoding::kEnabled; + + // Data about the stream whose headers are being processed. + QuicStreamId stream_id_; // Pointer to the header stream in stream_map_. QuicHeadersStream* headers_stream_; - // HTTP/3 control streams. They are owned by QuicSession inside - // stream map, and can be accessed by those unowned pointers below. - QuicSendControlStream* send_control_stream_; - QuicReceiveControlStream* receive_control_stream_; + // Not owned by the session. + Http3DebugVisitor* debug_visitor_; - // Pointers to HTTP/3 QPACK streams in stream map. - QpackReceiveStream* qpack_encoder_receive_stream_; - QpackReceiveStream* qpack_decoder_receive_stream_; - QpackSendStream* qpack_encoder_send_stream_; - QpackSendStream* qpack_decoder_send_stream_; - - SettingsFrame settings_; + size_t frame_len_; // Maximum dynamic table capacity as defined at // https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#maximum-dynamic-table-capacity @@ -667,68 +683,56 @@ class QUICHE_EXPORT QuicSpdySession // for the decoding context. Value will be sent via // SETTINGS_QPACK_BLOCKED_STREAMS. uint64_t qpack_maximum_blocked_streams_; - + QuicReceiveControlStream* receive_control_stream_; // The maximum size of a header block that will be accepted from the peer, // defined per spec as key + value + overhead per field (uncompressed). // Value will be sent via SETTINGS_MAX_HEADER_LIST_SIZE. size_t max_inbound_header_list_size_; + // HTTP/3 control streams. They are owned by QuicSession inside + // stream map, and can be accessed by those unowned pointers below. + QuicSendControlStream* send_control_stream_; + std::unique_ptr qpack_encoder_; + QpackReceiveStream* qpack_decoder_receive_stream_; + + // Pointers to HTTP/3 QPACK streams in stream map. + QpackReceiveStream* qpack_encoder_receive_stream_; + + QpackSendStream* qpack_encoder_send_stream_; + // The maximum size of a header block that can be sent to the peer. This field // is informed and set by the peer via SETTINGS frame. // TODO(b/148616439): Honor this field when sending headers. size_t max_outbound_header_list_size_; - // Data about the stream whose headers are being processed. - QuicStreamId stream_id_; - size_t frame_len_; - bool fin_; - - spdy::SpdyFramer spdy_framer_; - http2::Http2DecoderAdapter h2_deframer_; std::unique_ptr spdy_framer_visitor_; + QpackSendStream* qpack_decoder_send_stream_; - // Not owned by the session. - Http3DebugVisitor* debug_visitor_; - - // Priority values received in PRIORITY_UPDATE frames for streams that are not - // open yet. - absl::flat_hash_map - buffered_stream_priorities_; - - // An integer used for live check. The indicator is assigned a value in - // constructor. As long as it is not the assigned value, that would indicate - // an use-after-free. - int32_t destruction_indicator_; - - // The identifier in the most recently received GOAWAY frame. Unset if no - // GOAWAY frame has been received yet. - std::optional last_received_http3_goaway_id_; // The identifier in the most recently sent GOAWAY frame. Unset if no GOAWAY // frame has been sent yet. std::optional last_sent_http3_goaway_id_; - // Whether both this endpoint and our peer support HTTP datagrams and which - // draft is in use for this session. - HttpDatagramSupport http_datagram_support_ = HttpDatagramSupport::kNone; - - // WebTransport protocol versions supported by the peer. - WebTransportHttp3VersionSet peer_web_transport_versions_; - - // Whether the SETTINGS frame has been received on the control stream. - bool settings_received_ = false; - - // If ShouldBufferRequestsUntilSettings() is true, all streams that are - // blocked by that are tracked here. - absl::flat_hash_set streams_waiting_for_settings_; + // The identifier in the most recently received GOAWAY frame. Unset if no + // GOAWAY frame has been received yet. + std::optional last_received_http3_goaway_id_; // WebTransport streams that do not have a session associated with them. // Limited to kMaxUnassociatedWebTransportStreams; when the list is full, // oldest streams are evicated first. std::list buffered_streams_; - // On the server side, if true, advertise and accept extended CONNECT method. - // On the client side, true if the peer advertised extended CONNECT. - bool allow_extended_connect_; + spdy::SpdyFramer spdy_framer_; + + // Priority values received in PRIORITY_UPDATE frames for streams that are not + // open yet. + absl::flat_hash_map + buffered_stream_priorities_; + + SettingsFrame settings_; + + // If ShouldBufferRequestsUntilSettings() is true, all streams that are + // blocked by that are tracked here. + absl::flat_hash_set streams_waiting_for_settings_; // Since WebTransport is versioned by renumbering // SETTINGS_WEBTRANSPORT_MAX_SESSIONS, the max sessions value depends on the @@ -736,10 +740,6 @@ class QUICHE_EXPORT QuicSpdySession // server cannot initiate WebTransport sessions. absl::flat_hash_map max_webtransport_sessions_; - - // Allows forcing ShouldBufferRequestsUntilSettings() to true via - // a connection option. - bool force_buffer_requests_until_settings_; }; } // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc index f3b07ed6cf..2aefeab221 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc @@ -1671,7 +1671,7 @@ void QuicSpdyStream::WriteGreaseCapsule() { WriteCapsule(capsule, /*fin=*/false); } -MessageStatus QuicSpdyStream::SendHttp3Datagram(absl::string_view payload) { +DatagramStatus QuicSpdyStream::SendHttp3Datagram(absl::string_view payload) { return spdy_session_->SendHttp3Datagram(id(), payload); } @@ -1833,10 +1833,11 @@ QuicByteCount QuicSpdyStream::GetMaxDatagramSize() const { } QuicByteCount max_datagram_size = - session()->GetGuaranteedLargestMessagePayload(); + session()->GetGuaranteedLargestDatagramPayload(); if (max_datagram_size < prefix_size) { QUIC_BUG(max_datagram_size smaller than prefix_size) - << "GetGuaranteedLargestMessagePayload() returned a datagram size that " + << "GetGuaranteedLargestDatagramPayload() returned a datagram size " + "that " "is not sufficient to fit stream ID into it."; return 0; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.h index fab54412b3..8d44e07539 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.h @@ -305,7 +305,7 @@ class QUICHE_EXPORT QuicSpdyStream // Sends an HTTP/3 datagram. The stream ID is not part of |payload|. Virtual // to allow mocking in tests. - virtual MessageStatus SendHttp3Datagram(absl::string_view payload); + virtual DatagramStatus SendHttp3Datagram(absl::string_view payload); // Registers |visitor| to receive HTTP/3 datagrams and enables Capsule // Protocol by registering a CapsuleParser. |visitor| must be valid until a diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc index e2d1466589..bfb5e4a7bf 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc @@ -273,7 +273,7 @@ webtransport::Stream* WebTransportHttp3::GetStreamById( webtransport::DatagramStatus WebTransportHttp3::SendOrQueueDatagram( absl::string_view datagram) { - return MessageStatusToWebTransportStatus( + return DatagramStatusToWebTransportStatus( connect_stream_->SendHttp3Datagram(datagram)); } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_decoder.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_decoder.cc index f2ac768df6..91e324ec80 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_decoder.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_decoder.cc @@ -10,6 +10,7 @@ #include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" +#include "quiche/quic/platform/api/quic_flags.h" #include "quiche/quic/platform/api/quic_logging.h" namespace quic { @@ -241,11 +242,11 @@ bool QpackInstructionDecoder::DoVarintDone() { return true; } - string_length_ = varint_decoder_.value(); - if (string_length_ > kStringLiteralLengthLimit) { - OnError(ErrorCode::STRING_LITERAL_TOO_LONG, "String literal too long."); - return false; - } + if (varint_decoder_.value() > kStringLiteralLengthLimit) { + OnError(ErrorCode::STRING_LITERAL_TOO_LONG, "String literal too long."); + return false; + } + string_length_ = varint_decoder_.value(); std::string* const string = (field_->type == QpackInstructionFieldType::kName) ? &name_ : &value_; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_config.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_config.cc index d44cad44c6..222b3adb94 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_config.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_config.cc @@ -13,21 +13,25 @@ #include #include -#include "absl/base/attributes.h" #include "absl/strings/string_view.h" #include "quiche/quic/core/crypto/crypto_handshake_message.h" #include "quiche/quic/core/crypto/crypto_protocol.h" +#include "quiche/quic/core/crypto/transport_parameters.h" #include "quiche/quic/core/quic_connection_id.h" #include "quiche/quic/core/quic_constants.h" #include "quiche/quic/core/quic_error_codes.h" #include "quiche/quic/core/quic_socket_address_coder.h" +#include "quiche/quic/core/quic_tag.h" +#include "quiche/quic/core/quic_time.h" #include "quiche/quic/core/quic_types.h" -#include "quiche/quic/core/quic_utils.h" +#include "quiche/quic/core/quic_versions.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" -#include "quiche/quic/platform/api/quic_flag_utils.h" #include "quiche/quic/platform/api/quic_flags.h" #include "quiche/quic/platform/api/quic_logging.h" #include "quiche/quic/platform/api/quic_socket_address.h" +#include "quiche/common/platform/api/quiche_logging.h" +#include "quiche/common/quiche_data_writer.h" +#include "quiche/common/quiche_ip_address_family.h" namespace quic { @@ -503,6 +507,14 @@ QuicConfig::GetReceivedGoogleHandshakeMessage() const { return received_google_handshake_message_; } +void QuicConfig::SetDebuggingSniToSend(const std::string& debugging_sni) { + debugging_sni_to_send_ = debugging_sni; +} + +const std::optional& QuicConfig::GetReceivedDebuggingSni() const { + return received_debugging_sni_; +} + void QuicConfig::SetDiscardLengthToSend(int32_t discard_length) { discard_length_to_send_ = discard_length; } @@ -555,15 +567,15 @@ bool QuicConfig::HasClientRequestedIndependentOption( const QuicTagVector& QuicConfig::ClientRequestedIndependentOptions( Perspective perspective) const { - static const QuicTagVector* no_options = new QuicTagVector; + static constexpr QuicTagVector no_options; if (perspective == Perspective::IS_SERVER) { return HasReceivedConnectionOptions() ? ReceivedConnectionOptions() - : *no_options; + : no_options; } return client_connection_options_.HasSendValues() ? client_connection_options_.GetSendValues() - : *no_options; + : no_options; } void QuicConfig::SetIdleNetworkTimeout(QuicTime::Delta idle_network_timeout) { @@ -1288,6 +1300,9 @@ bool QuicConfig::FillTransportParameters(TransportParameters* params) const { if (google_handshake_message_to_send_.has_value()) { params->google_handshake_message = google_handshake_message_to_send_; } + if (debugging_sni_to_send_.has_value()) { + params->debugging_sni = debugging_sni_to_send_; + } params->discard_length = discard_length_to_send_; @@ -1425,6 +1440,9 @@ QuicErrorCode QuicConfig::ProcessTransportParameters( if (params.google_handshake_message.has_value()) { received_google_handshake_message_ = params.google_handshake_message; } + if (params.debugging_sni.has_value()) { + received_debugging_sni_ = params.debugging_sni; + } received_custom_transport_parameters_ = params.custom_parameters; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_config.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_config.h index 90974b07a4..05908ae57e 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_config.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_config.h @@ -9,13 +9,18 @@ #include #include #include +#include #include "quiche/quic/core/crypto/transport_parameters.h" #include "quiche/quic/core/quic_connection_id.h" -#include "quiche/quic/core/quic_packets.h" +#include "quiche/quic/core/quic_error_codes.h" +#include "quiche/quic/core/quic_tag.h" #include "quiche/quic/core/quic_time.h" #include "quiche/quic/core/quic_types.h" -#include "quiche/quic/platform/api/quic_export.h" +#include "quiche/quic/core/quic_versions.h" +#include "quiche/quic/platform/api/quic_socket_address.h" +#include "quiche/common/platform/api/quiche_export.h" +#include "quiche/common/quiche_ip_address_family.h" namespace quic { @@ -261,6 +266,10 @@ class QUICHE_EXPORT QuicConfig { const std::optional& GetReceivedGoogleHandshakeMessage() const; + void SetDebuggingSniToSend(const std::string& debugging_sni); + + const std::optional& GetReceivedDebuggingSni() const; + // Sets initial received connection options. All received connection options // will be initialized with these fields. Initial received options may only be // set once per config, prior to the setting of any other options. If options @@ -519,6 +528,13 @@ class QUICHE_EXPORT QuicConfig { bool HasReceivedRetrySourceConnectionId() const; QuicConnectionId ReceivedRetrySourceConnectionId() const; + uint64_t peer_reordering_threshold() const { + return peer_reordering_threshold_; + } + void set_peer_reordering_threshold(uint64_t peer_reordering_threshold) { + peer_reordering_threshold_ = peer_reordering_threshold; + } + bool negotiated() const; void SetCreateSessionTagIndicators(QuicTagVector tags); @@ -724,10 +740,20 @@ class QUICHE_EXPORT QuicConfig { // values means 'discard' data not received. int32_t discard_length_received_ = -1; + // A hardcoded value for reordering threshold, as if the peer had sent an + // ACK_FREQUENCY frame with that value. + uint64_t peer_reordering_threshold_ = 1; + // Google internal handshake message. std::optional google_handshake_message_to_send_; std::optional received_google_handshake_message_; + // Debugging Server Name Indication. These fields are used to send and get the + // SNI in the transport parameters from client to the server for + // debugging purposes only. + std::optional debugging_sni_to_send_; + std::optional received_debugging_sni_; + // Support for RESET_STREAM_AT frame. bool reliable_stream_reset_; }; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection.cc index 7b40eda90d..45af08ec54 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection.cc @@ -42,12 +42,12 @@ #include "quiche/quic/core/frames/quic_blocked_frame.h" #include "quiche/quic/core/frames/quic_connection_close_frame.h" #include "quiche/quic/core/frames/quic_crypto_frame.h" +#include "quiche/quic/core/frames/quic_datagram_frame.h" #include "quiche/quic/core/frames/quic_frame.h" #include "quiche/quic/core/frames/quic_goaway_frame.h" #include "quiche/quic/core/frames/quic_handshake_done_frame.h" #include "quiche/quic/core/frames/quic_immediate_ack_frame.h" #include "quiche/quic/core/frames/quic_max_streams_frame.h" -#include "quiche/quic/core/frames/quic_message_frame.h" #include "quiche/quic/core/frames/quic_new_connection_id_frame.h" #include "quiche/quic/core/frames/quic_new_token_frame.h" #include "quiche/quic/core/frames/quic_padding_frame.h" @@ -494,6 +494,7 @@ void QuicConnection::SetFromConfig(const QuicConfig& config) { blackhole_detection_disabled_ = true; } if (config.HasClientSentConnectionOption(kNBHD, perspective_)) { + QUIC_CODE_COUNT(quic_no_blackhole_detection); blackhole_detection_disabled_ = true; } } @@ -625,6 +626,15 @@ void QuicConnection::SetFromConfig(const QuicConfig& config) { } } + if (perspective_ == Perspective::IS_SERVER && version().HasIetfQuicFrames() && + config.HasClientSentConnectionOption(kCFLS, perspective_) && + GetQuicReloadableFlag( + quic_allow_flow_label_blackhole_avoidance_on_server)) { + QUIC_RELOADABLE_FLAG_COUNT( + quic_allow_flow_label_blackhole_avoidance_on_server); + EnableBlackholeAvoidanceViaFlowLabel(); + } + if (config.HasMinAckDelayDraft10ToSend()) { if (config.GetMinAckDelayDraft10ToSendMs() <= config.GetMaxAckDelayToSendMs()) { // MinAckDelay is valid. @@ -638,6 +648,14 @@ void QuicConnection::SetFromConfig(const QuicConfig& config) { } framer_.set_process_reset_stream_at(config.SupportsReliableStreamReset()); + + if (config.peer_reordering_threshold() != 1 && + perspective_ == Perspective::IS_CLIENT && version().UsesTls() && + !config.HasMinAckDelayDraft10ToSend()) { + QuicAckFrequencyFrame frame; + frame.reordering_threshold = config.peer_reordering_threshold(); + uber_received_packet_manager_.OnAckFrequencyFrame(frame); + } } void QuicConnection::AddDispatcherSentPackets( @@ -1672,11 +1690,19 @@ class ReversePathValidationContext : public QuicPathValidationContext { const QuicSocketAddress& effective_peer_address, QuicConnection* connection) : QuicPathValidationContext(self_address, peer_address, - effective_peer_address), + effective_peer_address, /*network=*/-1), connection_(connection) {} QuicPacketWriter* WriterToUse() override { return connection_->writer(); } + // Reverse path validation always re-uses the original writer. So this method + // will not be called and the return value here doesn't matter. + bool ShouldConnectionOwnWriter() const override { + QUIC_BUG(client_only_writer_interface_used_in_server_side) + << "Reverse path validation shouldn't call this interface."; + return false; + } + private: QuicConnection* connection_; }; @@ -2049,24 +2075,24 @@ bool QuicConnection::OnNewTokenFrame(const QuicNewTokenFrame& frame) { return true; } -bool QuicConnection::OnMessageFrame(const QuicMessageFrame& frame) { +bool QuicConnection::OnDatagramFrame(const QuicDatagramFrame& frame) { QUIC_BUG_IF(quic_bug_12714_16, !connected_) - << "Processing MESSAGE frame when connection is closed. Received packet " + << "Processing DATAGRAM frame when connection is closed. Received packet " "info: " << last_received_packet_info_; - // Since a message frame was received, this is not a connectivity probe. + // Since a datagram frame was received, this is not a connectivity probe. // A probe only contains a PING and full padding. - if (!UpdatePacketContent(MESSAGE_FRAME)) { + if (!UpdatePacketContent(DATAGRAM_FRAME)) { return false; } if (debug_visitor_ != nullptr) { - debug_visitor_->OnMessageFrame(frame); + debug_visitor_->OnDatagramFrame(frame); } MaybeUpdateAckTimeout(); - visitor_->OnMessageReceived( - absl::string_view(frame.data, frame.message_length)); + visitor_->OnDatagramReceived( + absl::string_view(frame.data, frame.datagram_length)); return connected_; } @@ -2405,10 +2431,6 @@ const QuicFrame QuicConnection::GetUpdatedAckFrame() { clock_->ApproximateNow()); } -QuicPacketNumber QuicConnection::GetLeastUnacked() const { - return sent_packet_manager_.GetLeastUnacked(); -} - bool QuicConnection::HandleWriteBlocked() { if (!writer_->IsWriteBlocked()) { return false; @@ -3178,14 +3200,20 @@ void QuicConnection::WriteQueuedPackets() { continue; } if (IsWriteError(result.status)) { - OnWriteError(result.error_code); - break; + if (perspective_ == Perspective::IS_CLIENT && + visitor_->MaybeMitigateWriteError(result)) { + result.status = WRITE_STATUS_BLOCKED; + } else { + OnWriteError(result.error_code); + break; + } } if (result.status == WRITE_STATUS_OK || result.status == WRITE_STATUS_BLOCKED_DATA_BUFFERED) { buffered_packets_.pop_front(); } if (IsWriteBlockedStatus(result.status)) { + QUICHE_DCHECK(writer_->IsWriteBlocked()); visitor_->OnWriteBlocked(); break; } @@ -3584,6 +3612,11 @@ bool QuicConnection::WritePacket(SerializedPacket* packet) { WRITE_STATUS_NUM_VALUES, "Status code returned by writer_->WritePacket() in QuicConnection."); + if (IsWriteError(result.status) && perspective_ == Perspective::IS_CLIENT && + visitor_->MaybeMitigateWriteError(result)) { + QUIC_DLOG(INFO) << "Write error mitigated. Treat it as write blocked."; + result.status = WRITE_STATUS_BLOCKED; + } if (IsWriteBlockedStatus(result.status)) { // Ensure the writer is still write blocked, otherwise QUIC may continue // trying to write when it will not be able to. @@ -5817,6 +5850,26 @@ void QuicConnection::PostProcessAfterAckFrame(bool acked_new_packet) { uber_received_packet_manager_.DontWaitForPacketsBefore( last_received_packet_info_.decrypted_level, largest_packet_peer_knows_is_acked); + if (uber_received_packet_manager_.IsAckFrameEmpty( + QuicUtils::GetPacketNumberSpace( + last_received_packet_info_.decrypted_level)) && + GetQuicReloadableFlag(quic_fail_on_empty_ack)) { + QUIC_RELOADABLE_FLAG_COUNT(quic_fail_on_empty_ack); + // A packet N arrived from the peer, and was ACKed. Then a packet M < N + // arrived acknowledging the locally generated ACK. This implies that + // the packet numbers are not increasing. Or, M was sent with an + // "Optimistic ACK" for packets it hadn't received, and M was delayed in + // flight to arrive after N. + // Either case causes DontWaitForPacketsBefore to empty the ACK frame, + // which is a symptom of a protocol violation. + // Avoid sending an ACK in CONNECTION_CLOSE, which would be malformed. + uber_received_packet_manager_.ResetAckStates( + last_received_packet_info_.decrypted_level); + CloseConnection(IETF_QUIC_PROTOCOL_VIOLATION, + "Opportunistic ACK received", + ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); + return; + } } // Always reset the retransmission alarm when an ack comes in, since we now // have a better estimate of the current rtt than when it was set. @@ -5867,25 +5920,25 @@ void QuicConnection::ResetAckStates() { uber_received_packet_manager_.ResetAckStates(encryption_level_); } -MessageStatus QuicConnection::SendMessage( - QuicMessageId message_id, absl::Span message, +DatagramStatus QuicConnection::SendDatagram( + QuicDatagramId datagram_id, absl::Span datagram, bool flush) { - if (MemSliceSpanTotalSize(message) > GetCurrentLargestMessagePayload()) { - return MESSAGE_STATUS_TOO_LARGE; + if (MemSliceSpanTotalSize(datagram) > GetCurrentLargestDatagramPayload()) { + return DATAGRAM_STATUS_TOO_LARGE; } if (!connected_ || (!flush && !CanWrite(HAS_RETRANSMITTABLE_DATA))) { - return MESSAGE_STATUS_BLOCKED; + return DATAGRAM_STATUS_BLOCKED; } ScopedPacketFlusher flusher(this); - return packet_creator_.AddMessageFrame(message_id, message); + return packet_creator_.AddDatagramFrame(datagram_id, datagram); } -QuicPacketLength QuicConnection::GetCurrentLargestMessagePayload() const { - return packet_creator_.GetCurrentLargestMessagePayload(); +QuicPacketLength QuicConnection::GetCurrentLargestDatagramPayload() const { + return packet_creator_.GetCurrentLargestDatagramPayload(); } -QuicPacketLength QuicConnection::GetGuaranteedLargestMessagePayload() const { - return packet_creator_.GetGuaranteedLargestMessagePayload(); +QuicPacketLength QuicConnection::GetGuaranteedLargestDatagramPayload() const { + return packet_creator_.GetGuaranteedLargestDatagramPayload(); } uint32_t QuicConnection::cipher_id() const { @@ -6031,6 +6084,11 @@ void QuicConnection::SendAllPendingAcks() { } ResetAckStates(); } + if (GetQuicReloadableFlag(quic_disconnect_early_exit) && !connected_) { + // FlushAckFrame can result in a closed connection. If so, avoid updating + // ack state that could trigger QUICHE_BUGs. + return; + } const QuicTime timeout = uber_received_packet_manager_.GetEarliestAckTimeout(); @@ -6158,10 +6216,16 @@ bool QuicConnection::FlushCoalescedPacket() { coalesced_packet_.peer_address(), writer_, coalesced_packet_.ecn_codepoint(), coalesced_packet_.flow_label()); if (IsWriteError(result.status)) { - OnWriteError(result.error_code); - return false; + if (perspective_ == Perspective::IS_CLIENT && + visitor_->MaybeMitigateWriteError(result)) { + result.status = WRITE_STATUS_BLOCKED; + } else { + OnWriteError(result.error_code); + return false; + } } if (IsWriteBlockedStatus(result.status)) { + QUICHE_DCHECK(writer_->IsWriteBlocked()); visitor_->OnWriteBlocked(); if (result.status != WRITE_STATUS_BLOCKED_DATA_BUFFERED) { QUIC_DVLOG(1) << ENDPOINT diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection.h index c9ebfe3c1a..c79ae6e459 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection.h @@ -43,12 +43,12 @@ #include "quiche/quic/core/frames/quic_blocked_frame.h" #include "quiche/quic/core/frames/quic_connection_close_frame.h" #include "quiche/quic/core/frames/quic_crypto_frame.h" +#include "quiche/quic/core/frames/quic_datagram_frame.h" #include "quiche/quic/core/frames/quic_frame.h" #include "quiche/quic/core/frames/quic_goaway_frame.h" #include "quiche/quic/core/frames/quic_handshake_done_frame.h" #include "quiche/quic/core/frames/quic_immediate_ack_frame.h" #include "quiche/quic/core/frames/quic_max_streams_frame.h" -#include "quiche/quic/core/frames/quic_message_frame.h" #include "quiche/quic/core/frames/quic_new_connection_id_frame.h" #include "quiche/quic/core/frames/quic_new_token_frame.h" #include "quiche/quic/core/frames/quic_padding_frame.h" @@ -151,7 +151,7 @@ class QUICHE_EXPORT QuicConnectionVisitorInterface { virtual void OnGoAway(const QuicGoAwayFrame& frame) = 0; // Called when |message| has been received. - virtual void OnMessageReceived(absl::string_view message) = 0; + virtual void OnDatagramReceived(absl::string_view datagram) = 0; // Called when a HANDSHAKE_DONE frame has been received. virtual void OnHandshakeDoneReceived() = 0; @@ -310,6 +310,11 @@ class QUICHE_EXPORT QuicConnectionVisitorInterface { // Get from session the flow control send window for stream |id|. virtual QuicByteCount GetFlowControlSendWindowSize(QuicStreamId id) = 0; + + // Called when the client encounters a write error. + // Returns true if the error can be mitigated by migrating to a different + // network. + virtual bool MaybeMitigateWriteError(const WriteResult& write_result) = 0; }; // Interface which gets callbacks from the QuicConnection at interesting @@ -415,8 +420,8 @@ class QUICHE_EXPORT QuicConnectionDebugVisitor // Called when a NewTokenFrame has been parsed. virtual void OnNewTokenFrame(const QuicNewTokenFrame& /*frame*/) {} - // Called when a MessageFrame has been parsed. - virtual void OnMessageFrame(const QuicMessageFrame& /*frame*/) {} + // Called when a DatagramFrame has been parsed. + virtual void OnDatagramFrame(const QuicDatagramFrame& /*frame*/) {} // Called when a HandshakeDoneFrame has been parsed. virtual void OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& /*frame*/) {} @@ -625,8 +630,6 @@ class QUICHE_EXPORT QuicConnection // information. void AdjustNetworkParameters( const SendAlgorithmInterface::NetworkParams& params); - void AdjustNetworkParameters(QuicBandwidth bandwidth, QuicTime::Delta rtt, - bool allow_cwnd_to_decrease); // Install a loss detection tuner. Must be called before OnConfigNegotiated. void SetLossDetectionTuner( @@ -790,7 +793,7 @@ class QUICHE_EXPORT QuicConnection bool OnRetireConnectionIdFrame( const QuicRetireConnectionIdFrame& frame) override; bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override; - bool OnMessageFrame(const QuicMessageFrame& frame) override; + bool OnDatagramFrame(const QuicDatagramFrame& frame) override; bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override; bool OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame) override; bool OnImmediateAckFrame(const QuicImmediateAckFrame& frame) override; @@ -1110,20 +1113,20 @@ class QUICHE_EXPORT QuicConnection void SetTransmissionType(TransmissionType type); // Tries to send |message| and returns the message status. - // If |flush| is false, this will return a MESSAGE_STATUS_BLOCKED + // If |flush| is false, this will return a DATAGRAM_STATUS_BLOCKED // when the connection is deemed unwritable. - virtual MessageStatus SendMessage(QuicMessageId message_id, - absl::Span message, - bool flush); + virtual DatagramStatus SendDatagram( + QuicDatagramId datagram_id, absl::Span datagram, + bool flush); - // Returns the largest payload that will fit into a single MESSAGE frame. + // Returns the largest payload that will fit into a single DATAGRAM frame. // Because overhead can vary during a connection, this method should be - // checked for every message. - QuicPacketLength GetCurrentLargestMessagePayload() const; - // Returns the largest payload that will fit into a single MESSAGE frame at + // checked for every datagram. + QuicPacketLength GetCurrentLargestDatagramPayload() const; + // Returns the largest payload that will fit into a single DATAGRAM frame at // any point during the connection. This assumes the version and // connection ID lengths do not change. - QuicPacketLength GetGuaranteedLargestMessagePayload() const; + QuicPacketLength GetGuaranteedLargestDatagramPayload() const; void SetUnackedMapInitialCapacity(); @@ -1376,6 +1379,8 @@ class QUICHE_EXPORT QuicConnection void SetSourceAddressTokenToSend(absl::string_view token); + // Used by Chromium clients to send PING frames when there are no outstanding + // requests. TODO(ianswett): Consider removing this functionality. void SendPing() { SendPingAtLevel(framer().GetEncryptionLevelToSendApplicationData()); } @@ -1395,7 +1400,6 @@ class QUICHE_EXPORT QuicConnection void QuicBugIfHasPendingFrames(QuicStreamId id) const; QuicConnectionContext* context() override { return &context_; } - const QuicConnectionContext* context() const { return &context_; } void set_context_listener( std::unique_ptr listener) { @@ -1561,9 +1565,6 @@ class QUICHE_EXPORT QuicConnection // change. virtual QuicSocketAddress GetEffectivePeerAddressFromCurrentPacket() const; - // Returns the current per-packet options for the connection. - PerPacketOptions* per_packet_options() { return per_packet_options_; } - AddressChangeType active_effective_peer_migration_type() const { return active_effective_peer_migration_type_; } @@ -1630,11 +1631,6 @@ class QUICHE_EXPORT QuicConnection kMaxValue, }; - struct QUICHE_EXPORT PendingPathChallenge { - QuicPathFrameBuffer received_path_challenge; - QuicSocketAddress peer_address; - }; - struct QUICHE_EXPORT PathState { PathState() = default; @@ -1933,10 +1929,6 @@ class QUICHE_EXPORT QuicConnection // acks and pending writes if an ack opened the congestion window. void MaybeSendInResponseToPacket(); - // Gets the least unacked packet number, which is the next packet number to be - // sent if there are no outstanding packets. - QuicPacketNumber GetLeastUnacked() const; - // Sets the ping alarm to the appropriate value, if any. void SetPingAlarm(); @@ -1989,11 +1981,6 @@ class QUICHE_EXPORT QuicConnection // Updates the release time into the future. void UpdateReleaseTimeIntoFuture(); - // Sends generic path probe packet to the peer. If we are not IETF QUIC, will - // always send a padded ping, regardless of whether this is a request or not. - bool SendGenericPathProbePacket(QuicPacketWriter* probing_writer, - const QuicSocketAddress& peer_address); - // Called when an ACK is about to send. Resets ACK related internal states, // e.g., cancels ack_alarm_, resets // num_retransmittable_packets_received_since_last_ack_sent_ etc. @@ -2263,9 +2250,6 @@ class QUICHE_EXPORT QuicConnection // number spaces. QuicPacketNumber largest_seen_packets_with_ack_[NUM_PACKET_NUMBER_SPACES]; - // Largest packet number sent by the peer which had a stop waiting frame. - QuicPacketNumber largest_seen_packet_with_stop_waiting_; - // Collection of packets which were received before encryption was // established, but which could not be decrypted. We buffer these on // the assumption that they could not be processed because they were @@ -2350,15 +2334,6 @@ class QUICHE_EXPORT QuicConnection // Time this connection can release packets into the future. QuicTime::Delta release_time_into_future_; - // Payloads that were received in the most recent probe. This needs to be a - // Deque because the peer might no be using this implementation, and others - // might send a packet with more than one PATH_CHALLENGE, so all need to be - // saved and responded to. - // TODO(danzh) deprecate this field when deprecating - // --quic_send_path_response. - quiche::QuicheCircularDeque - received_path_challenge_payloads_; - // When we receive a RETRY packet or some INITIAL packets, we replace // |server_connection_id_| with the value from that packet and save off the // original value of |server_connection_id_| into @@ -2449,9 +2424,6 @@ class QUICHE_EXPORT QuicConnection // from the peer. uint32_t last_flow_label_received_ = 0; - // Id of latest sent control frame. 0 if no control frame has been sent. - QuicControlFrameId last_control_frame_id_ = kInvalidControlFrameId; - RetransmittableOnWireBehavior retransmittable_on_wire_behavior_ = DEFAULT; // TODO(danzh) remove `current_packet_content_` and diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection_alarms.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection_alarms.cc index 2ccbe4250c..d1361d946f 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection_alarms.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection_alarms.cc @@ -45,110 +45,6 @@ class QuicConnectionAlarmDelegate : public QuicAlarm::Delegate { QuicConnectionAlarmsDelegate* connection_; }; -// An alarm that is scheduled to send an ack if a timeout occurs. -class AckAlarmDelegate : public QuicConnectionAlarmDelegate { - public: - using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - - void OnAlarm() override { connection_->OnAckAlarm(); } -}; - -// This alarm will be scheduled any time a data-bearing packet is sent out. -// When the alarm goes off, the connection checks to see if the oldest packets -// have been acked, and retransmit them if they have not. -class RetransmissionAlarmDelegate : public QuicConnectionAlarmDelegate { - public: - using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - - void OnAlarm() override { connection_->OnRetransmissionAlarm(); } -}; - -// An alarm that is scheduled when the SentPacketManager requires a delay -// before sending packets and fires when the packet may be sent. -class SendAlarmDelegate : public QuicConnectionAlarmDelegate { - public: - using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - - void OnAlarm() override { connection_->OnSendAlarm(); } -}; - -class MtuDiscoveryAlarmDelegate : public QuicConnectionAlarmDelegate { - public: - using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - - void OnAlarm() override { connection_->OnMtuDiscoveryAlarm(); } -}; - -class ProcessUndecryptablePacketsAlarmDelegate - : public QuicConnectionAlarmDelegate { - public: - using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - - void OnAlarm() override { connection_->OnProcessUndecryptablePacketsAlarm(); } -}; - -class DiscardPreviousOneRttKeysAlarmDelegate - : public QuicConnectionAlarmDelegate { - public: - using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - - void OnAlarm() override { connection_->OnDiscardPreviousOneRttKeysAlarm(); } -}; - -class DiscardZeroRttDecryptionKeysAlarmDelegate - : public QuicConnectionAlarmDelegate { - public: - using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - - void OnAlarm() override { - connection_->OnDiscardZeroRttDecryptionKeysAlarm(); - } -}; - -class MultiPortProbingAlarmDelegate : public QuicConnectionAlarmDelegate { - public: - using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - - void OnAlarm() override { - QUIC_DLOG(INFO) << "Alternative path probing alarm fired"; - connection_->MaybeProbeMultiPortPath(); - } -}; - -class IdleDetectorAlarmDelegate : public QuicConnectionAlarmDelegate { - public: - using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - - IdleDetectorAlarmDelegate(const IdleDetectorAlarmDelegate&) = delete; - IdleDetectorAlarmDelegate& operator=(const IdleDetectorAlarmDelegate&) = - delete; - - void OnAlarm() override { connection_->OnIdleDetectorAlarm(); } -}; - -class NetworkBlackholeDetectorAlarmDelegate - : public QuicConnectionAlarmDelegate { - public: - using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - - NetworkBlackholeDetectorAlarmDelegate( - const NetworkBlackholeDetectorAlarmDelegate&) = delete; - NetworkBlackholeDetectorAlarmDelegate& operator=( - const NetworkBlackholeDetectorAlarmDelegate&) = delete; - - void OnAlarm() override { connection_->OnNetworkBlackholeDetectorAlarm(); } -}; - -class PingAlarmDelegate : public QuicConnectionAlarmDelegate { - public: - using QuicConnectionAlarmDelegate::QuicConnectionAlarmDelegate; - - PingAlarmDelegate(const PingAlarmDelegate&) = delete; - PingAlarmDelegate& operator=(const PingAlarmDelegate&) = delete; - - void OnAlarm() override { connection_->OnPingAlarm(); } -}; - class MultiplexerAlarmDelegate : public QuicAlarm::Delegate { public: explicit MultiplexerAlarmDelegate(QuicAlarmMultiplexer* multiplexer) diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc index 74d3a515ae..0d8ed48d8a 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc @@ -235,6 +235,7 @@ bool QuicPeerIssuedConnectionIdManager::IsConnectionIdActive( std::vector QuicPeerIssuedConnectionIdManager:: ConsumeToBeRetiredConnectionIdSequenceNumbers() { std::vector result; + result.reserve(to_be_retired_connection_id_data_.size()); for (auto const& cid_data : to_be_retired_connection_id_data_) { result.push_back(cid_data.sequence_number); } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker.cc index 9cf4e6a3ad..b4170d919f 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker.cc @@ -4,17 +4,35 @@ #include "quiche/quic/core/quic_crypto_client_handshaker.h" +#include +#include #include #include #include #include "absl/strings/str_cat.h" +#include "absl/strings/string_view.h" +#include "openssl/ssl.h" +#include "quiche/quic/core/crypto/crypto_handshake.h" +#include "quiche/quic/core/crypto/crypto_handshake_message.h" +#include "quiche/quic/core/crypto/crypto_message_parser.h" #include "quiche/quic/core/crypto/crypto_protocol.h" #include "quiche/quic/core/crypto/crypto_utils.h" +#include "quiche/quic/core/crypto/proof_verifier.h" +#include "quiche/quic/core/crypto/quic_crypto_client_config.h" +#include "quiche/quic/core/crypto/quic_decrypter.h" +#include "quiche/quic/core/crypto/quic_encrypter.h" +#include "quiche/quic/core/quic_config.h" +#include "quiche/quic/core/quic_crypto_client_stream.h" +#include "quiche/quic/core/quic_crypto_handshaker.h" +#include "quiche/quic/core/quic_error_codes.h" +#include "quiche/quic/core/quic_server_id.h" #include "quiche/quic/core/quic_session.h" +#include "quiche/quic/core/quic_tag.h" +#include "quiche/quic/core/quic_time.h" #include "quiche/quic/core/quic_types.h" +#include "quiche/quic/platform/api/quic_bug_tracker.h" #include "quiche/quic/platform/api/quic_client_stats.h" -#include "quiche/quic/platform/api/quic_flags.h" #include "quiche/quic/platform/api/quic_logging.h" #include "quiche/common/platform/api/quiche_logging.h" @@ -532,7 +550,7 @@ void QuicCryptoClientHandshaker::DoVerifyProofComplete( next_state_ = STATE_VERIFY_PROOF; } else { SetCachedProofValid(cached); - cached->SetProofVerifyDetails(verify_details_.release()); + cached->SetProofVerifyDetails(std::move(verify_details_)); if (!one_rtt_keys_available()) { next_state_ = STATE_SEND_CHLO; } else { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker.h index e4dc402a8d..d3bc204e08 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_handshaker.h @@ -5,8 +5,10 @@ #ifndef QUICHE_QUIC_CORE_QUIC_CRYPTO_CLIENT_HANDSHAKER_H_ #define QUICHE_QUIC_CORE_QUIC_CRYPTO_CLIENT_HANDSHAKER_H_ +#include #include +#include "openssl/ssl.h" #include "quiche/quic/core/crypto/proof_verifier.h" #include "quiche/quic/core/crypto/quic_crypto_client_config.h" #include "quiche/quic/core/quic_crypto_client_stream.h" @@ -76,6 +78,10 @@ class QUICHE_EXPORT QuicCryptoClientHandshaker return false; } bool MatchedTrustAnchorIdForTesting() const override { return false; } + std::optional SslCompliancePolicyForTesting() + const override { + return std::nullopt; + } // From QuicCryptoHandshaker void OnHandshakeMessage(const CryptoHandshakeMessage& message) override; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream.cc index 6b1abf7184..a008a60574 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream.cc @@ -5,9 +5,11 @@ #include "quiche/quic/core/quic_crypto_client_stream.h" #include +#include #include #include +#include "openssl/ssl.h" #include "quiche/quic/core/crypto/crypto_protocol.h" #include "quiche/quic/core/crypto/crypto_utils.h" #include "quiche/quic/core/crypto/null_encrypter.h" @@ -141,6 +143,11 @@ bool QuicCryptoClientStream::MatchedTrustAnchorIdForTesting() const { return handshaker_->MatchedTrustAnchorIdForTesting(); } +std::optional +QuicCryptoClientStream::SslCompliancePolicyForTesting() const { + return handshaker_->SslCompliancePolicyForTesting(); +} + void QuicCryptoClientStream::OnOneRttPacketAcknowledged() { handshaker_->OnOneRttPacketAcknowledged(); } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream.h index ca7a39e435..2aaa58c7ca 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream.h @@ -7,8 +7,10 @@ #include #include +#include #include +#include "openssl/ssl.h" #include "quiche/quic/core/crypto/proof_verifier.h" #include "quiche/quic/core/crypto/quic_crypto_client_config.h" #include "quiche/quic/core/proto/cached_network_parameters_proto.h" @@ -241,6 +243,10 @@ class QUICHE_EXPORT QuicCryptoClientStream : public QuicCryptoClientStreamBase { // anchor IDs // (https://tlswg.org/tls-trust-anchor-ids/draft-ietf-tls-trust-anchor-ids.html#name-overview). virtual bool MatchedTrustAnchorIdForTesting() const = 0; + + // Returns the SSL compliance policy configured for the connection, if any. + virtual std::optional + SslCompliancePolicyForTesting() const = 0; }; // ProofHandler is an interface that handles callbacks from the crypto @@ -314,6 +320,7 @@ class QUICHE_EXPORT QuicCryptoClientStream : public QuicCryptoClientStreamBase { std::string chlo_hash() const; bool MatchedTrustAnchorIdForTesting() const; + std::optional SslCompliancePolicyForTesting() const; protected: void set_handshaker(std::unique_ptr handshaker) { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_datagram_queue.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_datagram_queue.cc index 6fac3e09e3..4b2cc55b8d 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_datagram_queue.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_datagram_queue.cc @@ -29,15 +29,15 @@ QuicDatagramQueue::QuicDatagramQueue(QuicSession* session, clock_(session->connection()->clock()), observer_(std::move(observer)) {} -MessageStatus QuicDatagramQueue::SendOrQueueDatagram( +DatagramStatus QuicDatagramQueue::SendOrQueueDatagram( quiche::QuicheMemSlice datagram) { // If the queue is non-empty, always queue the daragram. This ensures that // the datagrams are sent in the same order that they were sent by the // application. if (queue_.empty()) { - MessageResult result = session_->SendMessage(absl::MakeSpan(&datagram, 1), - /*flush=*/force_flush_); - if (result.status != MESSAGE_STATUS_BLOCKED) { + DatagramResult result = session_->SendDatagram(absl::MakeSpan(&datagram, 1), + /*flush=*/force_flush_); + if (result.status != DATAGRAM_STATUS_BLOCKED) { if (observer_) { observer_->OnDatagramProcessed(result.status); } @@ -47,18 +47,18 @@ MessageStatus QuicDatagramQueue::SendOrQueueDatagram( queue_.emplace_back(Datagram{std::move(datagram), clock_->ApproximateNow() + GetMaxTimeInQueue()}); - return MESSAGE_STATUS_BLOCKED; + return DATAGRAM_STATUS_BLOCKED; } -std::optional QuicDatagramQueue::TrySendingNextDatagram() { +std::optional QuicDatagramQueue::TrySendingNextDatagram() { RemoveExpiredDatagrams(); if (queue_.empty()) { return std::nullopt; } - MessageResult result = - session_->SendMessage(absl::MakeSpan(&queue_.front().datagram, 1)); - if (result.status != MESSAGE_STATUS_BLOCKED) { + DatagramResult result = + session_->SendDatagram(absl::MakeSpan(&queue_.front().datagram, 1)); + if (result.status != DATAGRAM_STATUS_BLOCKED) { queue_.pop_front(); if (observer_) { observer_->OnDatagramProcessed(result.status); @@ -70,11 +70,11 @@ std::optional QuicDatagramQueue::TrySendingNextDatagram() { size_t QuicDatagramQueue::SendDatagrams() { size_t num_datagrams = 0; for (;;) { - std::optional status = TrySendingNextDatagram(); + std::optional status = TrySendingNextDatagram(); if (!status.has_value()) { break; } - if (*status == MESSAGE_STATUS_BLOCKED) { + if (*status == DATAGRAM_STATUS_BLOCKED) { break; } num_datagrams++; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_datagram_queue.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_datagram_queue.h index fa4c30813a..6e3bb8ffcc 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_datagram_queue.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_datagram_queue.h @@ -34,7 +34,7 @@ class QUICHE_EXPORT QuicDatagramQueue { // This function is called synchronously in `QuicDatagramQueue` methods. // `status` is nullopt when the datagram is dropped due to being in the // queue for too long. - virtual void OnDatagramProcessed(std::optional status) = 0; + virtual void OnDatagramProcessed(std::optional status) = 0; }; // |session| is not owned and must outlive this object. @@ -44,12 +44,12 @@ class QUICHE_EXPORT QuicDatagramQueue { QuicDatagramQueue(QuicSession* session, std::unique_ptr observer); // Adds the datagram to the end of the queue. May send it immediately; if - // not, MESSAGE_STATUS_BLOCKED is returned. - MessageStatus SendOrQueueDatagram(quiche::QuicheMemSlice datagram); + // not, DATAGRAM_STATUS_BLOCKED is returned. + DatagramStatus SendOrQueueDatagram(quiche::QuicheMemSlice datagram); // Attempts to send a single datagram from the queue. Returns the result of - // SendMessage(), or nullopt if there were no unexpired datagrams to send. - std::optional TrySendingNextDatagram(); + // SendDatagram(), or nullopt if there were no unexpired datagrams to send. + std::optional TrySendingNextDatagram(); // Sends all of the unexpired datagrams until either the connection becomes // write-blocked or the queue is empty. Returns the number of datagrams sent. diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc index 3863584921..3353f46086 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc @@ -188,7 +188,7 @@ const char* QuicErrorCodeToString(QuicErrorCode error) { RETURN_STRING_LITERAL(QUIC_INVALID_PATH_RESPONSE_DATA); RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_HANDSHAKE_UNCONFIRMED); RETURN_STRING_LITERAL(QUIC_PEER_PORT_CHANGE_HANDSHAKE_UNCONFIRMED); - RETURN_STRING_LITERAL(QUIC_INVALID_MESSAGE_DATA); + RETURN_STRING_LITERAL(QUIC_INVALID_DATAGRAM_DATA); RETURN_STRING_LITERAL(IETF_QUIC_PROTOCOL_VIOLATION); RETURN_STRING_LITERAL(QUIC_INVALID_NEW_TOKEN); RETURN_STRING_LITERAL(QUIC_DATA_RECEIVED_ON_WRITE_UNIDIRECTIONAL_STREAM); @@ -391,7 +391,7 @@ QuicErrorCodeToIetfMapping QuicErrorCodeToTransportErrorCode( return {true, static_cast(INTERNAL_ERROR)}; case QUIC_INVALID_ACK_DATA: return {true, static_cast(FRAME_ENCODING_ERROR)}; - case QUIC_INVALID_MESSAGE_DATA: + case QUIC_INVALID_DATAGRAM_DATA: return {true, static_cast(FRAME_ENCODING_ERROR)}; case QUIC_INVALID_VERSION_NEGOTIATION_PACKET: return {true, static_cast(PROTOCOL_VIOLATION)}; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.h index 64a3fbbe07..415e79f7c6 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.h @@ -169,7 +169,7 @@ enum QuicErrorCode : uint32_t { // ACK frame data is malformed. QUIC_INVALID_ACK_DATA = 9, // Message frame data is malformed. - QUIC_INVALID_MESSAGE_DATA = 112, + QUIC_INVALID_DATAGRAM_DATA = 112, // Version negotiation packet is malformed. QUIC_INVALID_VERSION_NEGOTIATION_PACKET = 10, diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_force_blockable_packet_writer.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_force_blockable_packet_writer.cc new file mode 100644 index 0000000000..10655d33ee --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_force_blockable_packet_writer.cc @@ -0,0 +1,18 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "quiche/quic/core/quic_force_blockable_packet_writer.h" + +namespace quic { + +void QuicForceBlockablePacketWriter::ForceWriteBlocked( + bool enforce_write_block) { + enforce_write_block_ = enforce_write_block; +} + +bool QuicForceBlockablePacketWriter::IsWriteBlocked() const { + return enforce_write_block_ || QuicPacketWriterWrapper::IsWriteBlocked(); +} + +} // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_force_blockable_packet_writer.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_force_blockable_packet_writer.h new file mode 100644 index 0000000000..677490f53a --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_force_blockable_packet_writer.h @@ -0,0 +1,32 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_CORE_QUIC_FORCE_BLOCKABLE_PACKET_WRITER_H_ +#define QUICHE_QUIC_CORE_QUIC_FORCE_BLOCKABLE_PACKET_WRITER_H_ + +#include "quiche/quic/core/quic_packet_writer_wrapper.h" + +namespace quic { + +// A QuicPacketWriterWrapper implementation that can be forced to be write +// blocked. +class QUICHE_EXPORT QuicForceBlockablePacketWriter + : public QuicPacketWriterWrapper { + public: + // If `enforce_write_block` is true, IsWriteBlocked() will always return true + // regardless of whether SetWritable() is called or not until + // this method is called again with `enforce_write_block` false. + // If `enforce_write_block` is false, SetWritable() may still be needed to + // make IsWriteBlocked() to return true. + void ForceWriteBlocked(bool enforce_write_block); + + bool IsWriteBlocked() const override; + + private: + bool enforce_write_block_ = false; +}; + +} // namespace quic + +#endif // QUICHE_QUIC_CORE_QUIC_FORCE_BLOCKABLE_PACKET_WRITER_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_framer.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_framer.cc index 977082a50a..2b34775ff7 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_framer.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_framer.cc @@ -36,6 +36,7 @@ #include "quiche/quic/core/crypto/quic_encrypter.h" #include "quiche/quic/core/crypto/quic_random.h" #include "quiche/quic/core/frames/quic_ack_frequency_frame.h" +#include "quiche/quic/core/frames/quic_datagram_frame.h" #include "quiche/quic/core/frames/quic_immediate_ack_frame.h" #include "quiche/quic/core/frames/quic_reset_stream_at_frame.h" #include "quiche/quic/core/quic_connection_id.h" @@ -460,8 +461,8 @@ size_t QuicFramer::GetMinCryptoFrameSize(QuicStreamOffset offset, } // static -size_t QuicFramer::GetMessageFrameSize(bool last_frame_in_packet, - QuicByteCount length) { +size_t QuicFramer::GetDatagramFrameSize(bool last_frame_in_packet, + QuicByteCount length) { return kQuicFrameTypeSize + (last_frame_in_packet ? 0 : QuicDataWriter::GetVarInt62Len(length)) + length; @@ -708,7 +709,7 @@ size_t QuicFramer::GetRetransmittableControlFrameSize( case STOP_WAITING_FRAME: case MTU_DISCOVERY_FRAME: case PADDING_FRAME: - case MESSAGE_FRAME: + case DATAGRAM_FRAME: case CRYPTO_FRAME: case NUM_FRAME_TYPES: QUICHE_DCHECK(false); @@ -1004,10 +1005,10 @@ size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, set_detailed_error( "Attempt to append STOP_SENDING frame and not in IETF QUIC."); return RaiseError(QUIC_INTERNAL_ERROR); - case MESSAGE_FRAME: - if (!AppendMessageFrameAndTypeByte(*frame.message_frame, - last_frame_in_packet, &writer)) { - QUIC_BUG(quic_bug_10850_27) << "AppendMessageFrame failed"; + case DATAGRAM_FRAME: + if (!AppendDatagramFrameAndTypeByte(*frame.datagram_frame, + last_frame_in_packet, &writer)) { + QUIC_BUG(quic_bug_10850_27) << "AppendDatagramFrame failed"; return 0; } break; @@ -1192,11 +1193,11 @@ size_t QuicFramer::AppendIetfFrames(const QuicFrames& frames, return 0; } break; - case MESSAGE_FRAME: - if (!AppendMessageFrameAndTypeByte(*frame.message_frame, - last_frame_in_packet, writer)) { + case DATAGRAM_FRAME: + if (!AppendDatagramFrameAndTypeByte(*frame.datagram_frame, + last_frame_in_packet, writer)) { QUIC_BUG(quic_bug_10850_49) - << "AppendMessageFrame failed: " << detailed_error(); + << "AppendDatagramFrame failed: " << detailed_error(); return 0; } break; @@ -2703,19 +2704,19 @@ bool QuicFramer::ProcessFrameData(QuicDataReader* reader, QUIC_DVLOG(2) << ENDPOINT << "Processing ping frame " << ping_frame; continue; } - case IETF_EXTENSION_MESSAGE_NO_LENGTH: + case IETF_EXTENSION_DATAGRAM_NO_LENGTH: ABSL_FALLTHROUGH_INTENDED; - case IETF_EXTENSION_MESSAGE: { - QUIC_CODE_COUNT(quic_legacy_message_frame_codepoint_read); - QuicMessageFrame message_frame; - if (!ProcessMessageFrame(reader, - frame_type == IETF_EXTENSION_MESSAGE_NO_LENGTH, - &message_frame)) { - return RaiseError(QUIC_INVALID_MESSAGE_DATA); + case IETF_EXTENSION_DATAGRAM: { + QUIC_CODE_COUNT(quic_legacy_datagram_frame_codepoint_read); + QuicDatagramFrame datagram_frame; + if (!ProcessDatagramFrame( + reader, frame_type == IETF_EXTENSION_DATAGRAM_NO_LENGTH, + &datagram_frame)) { + return RaiseError(QUIC_INVALID_DATAGRAM_DATA); } - QUIC_DVLOG(2) << ENDPOINT << "Processing message frame " - << message_frame; - if (!visitor_->OnMessageFrame(message_frame)) { + QUIC_DVLOG(2) << ENDPOINT << "Processing datagram frame " + << datagram_frame; + if (!visitor_->OnDatagramFrame(datagram_frame)) { QUIC_DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; // Returning true since there was no parsing error. @@ -3098,18 +3099,18 @@ bool QuicFramer::ProcessIetfFrameData(QuicDataReader* reader, } break; } - case IETF_EXTENSION_MESSAGE_NO_LENGTH_V99: + case IETF_EXTENSION_DATAGRAM_NO_LENGTH_V99: ABSL_FALLTHROUGH_INTENDED; - case IETF_EXTENSION_MESSAGE_V99: { - QuicMessageFrame message_frame; - if (!ProcessMessageFrame( - reader, frame_type == IETF_EXTENSION_MESSAGE_NO_LENGTH_V99, - &message_frame)) { - return RaiseError(QUIC_INVALID_MESSAGE_DATA); + case IETF_EXTENSION_DATAGRAM_V99: { + QuicDatagramFrame datagram_frame; + if (!ProcessDatagramFrame( + reader, frame_type == IETF_EXTENSION_DATAGRAM_NO_LENGTH_V99, + &datagram_frame)) { + return RaiseError(QUIC_INVALID_DATAGRAM_DATA); } - QUIC_DVLOG(2) << ENDPOINT << "Processing IETF message frame " - << message_frame; - if (!visitor_->OnMessageFrame(message_frame)) { + QUIC_DVLOG(2) << ENDPOINT << "Processing IETF datagram frame " + << datagram_frame; + if (!visitor_->OnDatagramFrame(datagram_frame)) { QUIC_DVLOG(1) << ENDPOINT << "Visitor asked to stop further processing."; // Returning true since there was no parsing error. @@ -4014,30 +4015,30 @@ void QuicFramer::ProcessPaddingFrame(QuicDataReader* reader, } } -bool QuicFramer::ProcessMessageFrame(QuicDataReader* reader, - bool no_message_length, - QuicMessageFrame* frame) { - if (no_message_length) { +bool QuicFramer::ProcessDatagramFrame(QuicDataReader* reader, + bool no_datagram_length, + QuicDatagramFrame* frame) { + if (no_datagram_length) { absl::string_view remaining(reader->ReadRemainingPayload()); frame->data = remaining.data(); - frame->message_length = remaining.length(); + frame->datagram_length = remaining.length(); return true; } - uint64_t message_length; - if (!reader->ReadVarInt62(&message_length)) { - set_detailed_error("Unable to read message length"); + uint64_t datagram_length; + if (!reader->ReadVarInt62(&datagram_length)) { + set_detailed_error("Unable to read datagram length"); return false; } - absl::string_view message_piece; - if (!reader->ReadStringPiece(&message_piece, message_length)) { - set_detailed_error("Unable to read message data"); + absl::string_view datagram_piece; + if (!reader->ReadStringPiece(&datagram_piece, datagram_length)) { + set_detailed_error("Unable to read datagram data"); return false; } - frame->data = message_piece.data(); - frame->message_length = message_length; + frame->data = datagram_piece.data(); + frame->datagram_length = datagram_length; return true; } @@ -4826,9 +4827,9 @@ size_t QuicFramer::ComputeFrameLength( case MTU_DISCOVERY_FRAME: // MTU discovery frames are serialized as ping frames. return kQuicFrameTypeSize; - case MESSAGE_FRAME: - return GetMessageFrameSize(last_frame_in_packet, - frame.message_frame->message_length); + case DATAGRAM_FRAME: + return GetDatagramFrameSize(last_frame_in_packet, + frame.datagram_frame->datagram_length); case PADDING_FRAME: QUICHE_DCHECK(false); return 0; @@ -4887,7 +4888,7 @@ bool QuicFramer::AppendTypeByte(const QuicFrame& frame, set_detailed_error( "Attempt to append STOP_SENDING frame and not in IETF QUIC."); return RaiseError(QUIC_INTERNAL_ERROR); - case MESSAGE_FRAME: + case DATAGRAM_FRAME: return true; default: @@ -4997,7 +4998,7 @@ bool QuicFramer::AppendIetfFrameType(const QuicFrame& frame, case STOP_SENDING_FRAME: type_byte = IETF_STOP_SENDING; break; - case MESSAGE_FRAME: + case DATAGRAM_FRAME: return true; case CRYPTO_FRAME: type_byte = IETF_CRYPTO; @@ -5882,25 +5883,25 @@ bool QuicFramer::AppendPaddingFrame(const QuicPaddingFrame& frame, return writer->WritePaddingBytes(frame.num_padding_bytes - 1); } -bool QuicFramer::AppendMessageFrameAndTypeByte(const QuicMessageFrame& frame, - bool last_frame_in_packet, - QuicDataWriter* writer) { +bool QuicFramer::AppendDatagramFrameAndTypeByte(const QuicDatagramFrame& frame, + bool last_frame_in_packet, + QuicDataWriter* writer) { uint8_t type_byte; if (VersionHasIetfQuicFrames(version_.transport_version)) { - type_byte = last_frame_in_packet ? IETF_EXTENSION_MESSAGE_NO_LENGTH_V99 - : IETF_EXTENSION_MESSAGE_V99; + type_byte = last_frame_in_packet ? IETF_EXTENSION_DATAGRAM_NO_LENGTH_V99 + : IETF_EXTENSION_DATAGRAM_V99; } else { - QUIC_CODE_COUNT(quic_legacy_message_frame_codepoint_write); - type_byte = last_frame_in_packet ? IETF_EXTENSION_MESSAGE_NO_LENGTH - : IETF_EXTENSION_MESSAGE; + QUIC_CODE_COUNT(quic_legacy_datagram_frame_codepoint_write); + type_byte = last_frame_in_packet ? IETF_EXTENSION_DATAGRAM_NO_LENGTH + : IETF_EXTENSION_DATAGRAM; } if (!writer->WriteUInt8(type_byte)) { return false; } - if (!last_frame_in_packet && !writer->WriteVarInt62(frame.message_length)) { + if (!last_frame_in_packet && !writer->WriteVarInt62(frame.datagram_length)) { return false; } - for (const auto& slice : frame.message_data) { + for (const auto& slice : frame.datagram_data) { if (!writer->WriteBytes(slice.data(), slice.length())) { return false; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_framer.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_framer.h index 7cacc3f4da..91d67d5d20 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_framer.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_framer.h @@ -16,6 +16,7 @@ #include "quiche/quic/core/crypto/quic_decrypter.h" #include "quiche/quic/core/crypto/quic_encrypter.h" #include "quiche/quic/core/crypto/quic_random.h" +#include "quiche/quic/core/frames/quic_datagram_frame.h" #include "quiche/quic/core/frames/quic_immediate_ack_frame.h" #include "quiche/quic/core/frames/quic_reset_stream_at_frame.h" #include "quiche/quic/core/quic_connection_id.h" @@ -217,8 +218,8 @@ class QUICHE_EXPORT QuicFramerVisitorInterface { // Called when a NewTokenFrame has been parsed. virtual bool OnNewTokenFrame(const QuicNewTokenFrame& frame) = 0; - // Called when a message frame has been parsed. - virtual bool OnMessageFrame(const QuicMessageFrame& frame) = 0; + // Called when a Datagrame frame has been parsed. + virtual bool OnDatagramFrame(const QuicDatagramFrame& frame) = 0; // Called when a handshake done frame has been parsed. virtual bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) = 0; @@ -361,8 +362,8 @@ class QUICHE_EXPORT QuicFramer { // data length provided, but not counting the size of the data payload. static size_t GetMinCryptoFrameSize(QuicStreamOffset offset, QuicPacketLength data_length); - static size_t GetMessageFrameSize(bool last_frame_in_packet, - QuicByteCount length); + static size_t GetDatagramFrameSize(bool last_frame_in_packet, + QuicByteCount length); // Size in bytes of all ack frame fields without the missing packets or ack // blocks. static size_t GetMinAckFrameSize(QuicTransportVersion version, @@ -905,8 +906,8 @@ class QUICHE_EXPORT QuicFramer { QuicWindowUpdateFrame* frame); bool ProcessBlockedFrame(QuicDataReader* reader, QuicBlockedFrame* frame); void ProcessPaddingFrame(QuicDataReader* reader, QuicPaddingFrame* frame); - bool ProcessMessageFrame(QuicDataReader* reader, bool no_message_length, - QuicMessageFrame* frame); + bool ProcessDatagramFrame(QuicDataReader* reader, bool no_datagram_length, + QuicDatagramFrame* frame); bool DecryptPayload(size_t udp_packet_length, absl::string_view encrypted, absl::string_view associated_data, @@ -1000,9 +1001,9 @@ class QUICHE_EXPORT QuicFramer { QuicDataWriter* writer); bool AppendPaddingFrame(const QuicPaddingFrame& frame, QuicDataWriter* writer); - bool AppendMessageFrameAndTypeByte(const QuicMessageFrame& frame, - bool last_frame_in_packet, - QuicDataWriter* writer); + bool AppendDatagramFrameAndTypeByte(const QuicDatagramFrame& frame, + bool last_frame_in_packet, + QuicDataWriter* writer); // IETF frame processing methods. bool ProcessIetfStreamFrame(QuicDataReader* reader, uint8_t frame_type, diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_generic_session.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_generic_session.cc index f0edb3f07f..a687f742bc 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_generic_session.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_generic_session.cc @@ -68,6 +68,11 @@ class QUICHE_EXPORT QuicGenericStream : public QuicStream { // QuicSession method implementations. void OnDataAvailable() override { adapter_.OnDataAvailable(); } void OnCanWriteNewData() override { adapter_.OnCanWriteNewData(); } + void OnWriteSideInDataRecvdState() override { + if (adapter_.visitor() != nullptr) { + adapter_.visitor()->OnWriteSideInDataRecvdState(); + } + } private: WebTransportStreamAdapter adapter_; @@ -173,8 +178,8 @@ QuicGenericStream* QuicGenericSessionBase::CreateStream(QuicStreamId id) { return stream_ptr; } -void QuicGenericSessionBase::OnMessageReceived(absl::string_view message) { - visitor_->OnDatagramReceived(message); +void QuicGenericSessionBase::OnDatagramReceived(absl::string_view datagram) { + visitor_->OnDatagramReceived(datagram); } void QuicGenericSessionBase::OnCanCreateNewOutgoingStream(bool unidirectional) { @@ -198,7 +203,7 @@ webtransport::DatagramStatus QuicGenericSessionBase::SendOrQueueDatagram( absl::string_view datagram) { quiche::QuicheBuffer buffer = quiche::QuicheBuffer::Copy( quiche::SimpleBufferAllocator::Get(), datagram); - return MessageStatusToWebTransportStatus( + return DatagramStatusToWebTransportStatus( datagram_queue()->SendOrQueueDatagram( quiche::QuicheMemSlice(std::move(buffer)))); } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_generic_session.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_generic_session.h index a3e7a0c324..aea69ad15d 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_generic_session.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_generic_session.h @@ -80,7 +80,7 @@ class QUICHE_EXPORT QuicGenericSessionBase : public QuicSession, } void OnTlsHandshakeComplete() override; - void OnMessageReceived(absl::string_view message) override; + void OnDatagramReceived(absl::string_view datagram) override; // webtransport::Session implementation. webtransport::Stream* AcceptIncomingBidirectionalStream() override; @@ -123,7 +123,7 @@ class QUICHE_EXPORT QuicGenericSessionBase : public QuicSession, } QuicByteCount GetMaxDatagramSize() const override { - return GetGuaranteedLargestMessagePayload(); + return GetGuaranteedLargestDatagramPayload(); } private: diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_interval_deque.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_interval_deque.h index f4de0485fd..9324b06a05 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_interval_deque.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_interval_deque.h @@ -64,8 +64,8 @@ class QuicIntervalDequePeer; // // An example class to be stored inside the Interval Deque. // struct IntervalVal { // const int32_t val; -// const size_t interval_begin, interval_end; -// QuicInterval interval(); +// const uint64_t interval_begin, interval_end; +// QuicInterval interval(); // }; // typedef IntervalVal IV; // QuicIntervialDeque deque; @@ -155,13 +155,13 @@ class QUICHE_NO_EXPORT QuicIntervalDeque { // at |deque_.size()| and any attempt to increment above that will be // ignored. Once an iterator has iterated all elements the |cached_index_| // will be reset. - Iterator(std::size_t index, QuicIntervalDeque* deque) + Iterator(uint64_t index, QuicIntervalDeque* deque) : index_(index), deque_(deque) {} // Only the ++ operator attempts to update the cached index. Other operators // are used by |lower_bound| to binary search. Iterator& operator++() { // Don't increment when we are at the end. - const std::size_t container_size = deque_->container_.size(); + const uint64_t container_size = deque_->container_.size(); if (index_ >= container_size) { QUIC_BUG(QuicIntervalDeque_operator_plus_plus_iterator_out_of_bounds) << "Iterator out of bounds."; @@ -169,7 +169,7 @@ class QUICHE_NO_EXPORT QuicIntervalDeque { } index_++; if (deque_->cached_index_.has_value()) { - const std::size_t cached_index = *deque_->cached_index_; + const uint64_t cached_index = *deque_->cached_index_; // If all items are iterated then reset the |cached_index_| if (index_ == container_size) { deque_->cached_index_.reset(); @@ -223,7 +223,7 @@ class QUICHE_NO_EXPORT QuicIntervalDeque { private: // |index_| is the index of the item in |*deque_|. - std::size_t index_; + uint64_t index_; // |deque_| is a pointer to the container the iterator came from. QuicIntervalDeque* deque_; @@ -246,16 +246,16 @@ class QUICHE_NO_EXPORT QuicIntervalDeque { Iterator DataEnd(); // Returns an iterator pointing to the item in |interval_begin|. The iterator // will move the |cached_index_| as the iterator moves. - Iterator DataAt(const std::size_t interval_begin); + Iterator DataAt(const uint64_t interval_begin); // Returns the number of items contained inside the structure. - std::size_t Size() const; + uint64_t Size() const; // Returns whether the structure is empty. bool Empty() const; private: struct QUICHE_NO_EXPORT IntervalCompare { - bool operator()(const T& item, std::size_t interval_begin) const { + bool operator()(const T& item, uint64_t interval_begin) const { return item.interval().max() <= interval_begin; } }; @@ -263,14 +263,14 @@ class QUICHE_NO_EXPORT QuicIntervalDeque { template void PushBackUniversal(U&& item); - Iterator Search(const std::size_t interval_begin, - const std::size_t begin_index, const std::size_t end_index); + Iterator Search(const uint64_t interval_begin, const uint64_t begin_index, + const uint64_t end_index); // For accessing the |cached_index_| friend class test::QuicIntervalDequePeer; C container_; - std::optional cached_index_; + std::optional cached_index_; }; template @@ -315,16 +315,16 @@ typename QuicIntervalDeque::Iterator QuicIntervalDeque::DataEnd() { template typename QuicIntervalDeque::Iterator QuicIntervalDeque::DataAt( - const std::size_t interval_begin) { + const uint64_t interval_begin) { // No |cached_index_| value means all items can be searched. if (!cached_index_.has_value()) { return Search(interval_begin, 0, container_.size()); } - const std::size_t cached_index = *cached_index_; + const uint64_t cached_index = *cached_index_; QUICHE_DCHECK(cached_index < container_.size()); - const QuicInterval cached_interval = + const QuicInterval cached_interval = container_[cached_index].interval(); // Does our cached index point directly to what we want? if (cached_interval.Contains(interval_begin)) { @@ -332,7 +332,7 @@ typename QuicIntervalDeque::Iterator QuicIntervalDeque::DataAt( } // Are we off-by-one? - const std::size_t next_index = cached_index + 1; + const uint64_t next_index = cached_index + 1; if (next_index < container_.size()) { if (container_[next_index].interval().Contains(interval_begin)) { cached_index_ = next_index; @@ -342,10 +342,10 @@ typename QuicIntervalDeque::Iterator QuicIntervalDeque::DataAt( // Small optimization: // Determine if we should binary search above or below the cached interval. - const std::size_t cached_begin = cached_interval.min(); + const uint64_t cached_begin = cached_interval.min(); bool looking_below = interval_begin < cached_begin; - const std::size_t lower = looking_below ? 0 : cached_index + 1; - const std::size_t upper = looking_below ? cached_index : container_.size(); + const uint64_t lower = looking_below ? 0 : cached_index + 1; + const uint64_t upper = looking_below ? cached_index : container_.size(); Iterator ret = Search(interval_begin, lower, upper); if (ret == DataEnd()) { return ret; @@ -358,7 +358,7 @@ typename QuicIntervalDeque::Iterator QuicIntervalDeque::DataAt( } template -std::size_t QuicIntervalDeque::Size() const { +uint64_t QuicIntervalDeque::Size() const { return container_.size(); } @@ -370,7 +370,7 @@ bool QuicIntervalDeque::Empty() const { template template void QuicIntervalDeque::PushBackUniversal(U&& item) { - QuicInterval interval = item.interval(); + QuicInterval interval = item.interval(); // Adding an empty interval is a bug. if (interval.Empty()) { QUIC_BUG(QuicIntervalDeque_PushBackUniversal_empty) @@ -385,8 +385,8 @@ void QuicIntervalDeque::PushBackUniversal(U&& item) { template typename QuicIntervalDeque::Iterator QuicIntervalDeque::Search( - const std::size_t interval_begin, const std::size_t begin_index, - const std::size_t end_index) { + const uint64_t interval_begin, const uint64_t begin_index, + const uint64_t end_index) { auto begin = container_.begin() + begin_index; auto end = container_.begin() + end_index; auto res = std::lower_bound(begin, end, interval_begin, IntervalCompare()); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc index 67ea97fe4d..e81d548a73 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc @@ -360,20 +360,20 @@ bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id, return BytesFree() > min_stream_frame_size; } -bool QuicPacketCreator::HasRoomForMessageFrame(QuicByteCount length) { - const size_t message_frame_size = - QuicFramer::GetMessageFrameSize(/*last_frame_in_packet=*/true, length); - if (static_cast(message_frame_size) > +bool QuicPacketCreator::HasRoomForDatagramFrame(QuicByteCount length) { + const size_t datagram_frame_size = + QuicFramer::GetDatagramFrameSize(/*last_frame_in_packet=*/true, length); + if (static_cast(datagram_frame_size) > max_datagram_frame_size_) { return false; } - if (BytesFree() >= message_frame_size) { + if (BytesFree() >= datagram_frame_size) { return true; } if (!RemoveSoftMaxPacketLength()) { return false; } - return BytesFree() >= message_frame_size; + return BytesFree() >= datagram_frame_size; } // static @@ -498,7 +498,7 @@ void QuicPacketCreator::ClearPacket() { packet_.encrypted_buffer = nullptr; packet_.encrypted_length = 0; packet_.has_ack_frequency = false; - packet_.has_message = false; + packet_.has_datagram = false; packet_.fate = SEND_TO_WRITER; QUIC_BUG_IF(quic_bug_12398_6, packet_.release_encrypted_buffer != nullptr) << ENDPOINT << "packet_.release_encrypted_buffer should be empty"; @@ -722,8 +722,8 @@ bool QuicPacketCreator::HasPendingStreamFramesOfStream(QuicStreamId id) const { } size_t QuicPacketCreator::ExpansionOnNewFrame() const { - // If the last frame in the packet is a message frame, then it will expand to - // include the varint message length when a new frame is added. + // If the last frame in the packet is a datagram frame, then it will expand to + // include the varint datagram length when a new frame is added. if (queued_frames_.empty()) { return 0; } @@ -734,9 +734,9 @@ size_t QuicPacketCreator::ExpansionOnNewFrame() const { // static size_t QuicPacketCreator::ExpansionOnNewFrameWithLastFrame( const QuicFrame& last_frame, QuicTransportVersion version) { - if (last_frame.type == MESSAGE_FRAME) { + if (last_frame.type == DATAGRAM_FRAME) { return QuicDataWriter::GetVarInt62Len( - last_frame.message_frame->message_length); + last_frame.datagram_frame->datagram_length); } if (last_frame.type != STREAM_FRAME) { return 0; @@ -1825,31 +1825,31 @@ void QuicPacketCreator::SetTransmissionType(TransmissionType type) { next_transmission_type_ = type; } -MessageStatus QuicPacketCreator::AddMessageFrame( - QuicMessageId message_id, absl::Span message) { +DatagramStatus QuicPacketCreator::AddDatagramFrame( + QuicDatagramId datagram_id, absl::Span datagram) { QUIC_BUG_IF(quic_bug_10752_33, !flusher_attached_) << ENDPOINT << "Packet flusher is not attached when " - "generator tries to add message frame."; + "generator tries to add datagram frame."; MaybeBundleOpportunistically(); - const QuicByteCount message_length = MemSliceSpanTotalSize(message); - if (message_length > GetCurrentLargestMessagePayload()) { - return MESSAGE_STATUS_TOO_LARGE; + const QuicByteCount datagram_length = MemSliceSpanTotalSize(datagram); + if (datagram_length > GetCurrentLargestDatagramPayload()) { + return DATAGRAM_STATUS_TOO_LARGE; } - if (!HasRoomForMessageFrame(message_length)) { + if (!HasRoomForDatagramFrame(datagram_length)) { FlushCurrentPacket(); } - QuicMessageFrame* frame = new QuicMessageFrame(message_id, message); + QuicDatagramFrame* frame = new QuicDatagramFrame(datagram_id, datagram); const bool success = AddFrame(QuicFrame(frame), next_transmission_type_); if (!success) { QUIC_BUG(quic_bug_10752_34) - << ENDPOINT << "Failed to send message " << message_id; + << ENDPOINT << "Failed to send datagram " << datagram_id; delete frame; - return MESSAGE_STATUS_INTERNAL_ERROR; + return DATAGRAM_STATUS_INTERNAL_ERROR; } - QUICHE_DCHECK_EQ(MemSliceSpanTotalSize(message), + QUICHE_DCHECK_EQ(MemSliceSpanTotalSize(datagram), 0u); // Ensure the old slices are empty. - return MESSAGE_STATUS_SUCCESS; + return DATAGRAM_STATUS_SUCCESS; } quiche::QuicheVariableLengthIntegerLength QuicPacketCreator::GetLengthLength() @@ -1951,7 +1951,7 @@ bool QuicPacketCreator::AddFrame(const QuicFrame& frame, frame.type != MAX_STREAMS_FRAME && frame.type != STREAMS_BLOCKED_FRAME && frame.type != PATH_RESPONSE_FRAME && frame.type != PATH_CHALLENGE_FRAME && frame.type != STOP_SENDING_FRAME && - frame.type != MESSAGE_FRAME && frame.type != NEW_TOKEN_FRAME && + frame.type != DATAGRAM_FRAME && frame.type != NEW_TOKEN_FRAME && frame.type != RETIRE_CONNECTION_ID_FRAME && frame.type != ACK_FREQUENCY_FRAME)) << ENDPOINT << frame.type << " not allowed at " @@ -2023,8 +2023,8 @@ bool QuicPacketCreator::AddFrame(const QuicFrame& frame, packet_.has_stop_waiting = true; } else if (frame.type == ACK_FREQUENCY_FRAME) { packet_.has_ack_frequency = true; - } else if (frame.type == MESSAGE_FRAME) { - packet_.has_message = true; + } else if (frame.type == DATAGRAM_FRAME) { + packet_.has_datagram = true; } if (debug_delegate_ != nullptr) { debug_delegate_->OnFrameAddedToPacket(frame); @@ -2216,14 +2216,14 @@ void QuicPacketCreator::SetClientConnectionId( client_connection_id_ = client_connection_id; } -QuicPacketLength QuicPacketCreator::GetCurrentLargestMessagePayload() const { +QuicPacketLength QuicPacketCreator::GetCurrentLargestDatagramPayload() const { const size_t packet_header_size = GetPacketHeaderSize( framer_->transport_version(), GetDestinationConnectionIdLength(), GetSourceConnectionIdLength(), IncludeVersionInHeader(), IncludeNonceInPublicHeader(), GetPacketNumberLength(), // No Retry token on packets containing application data. quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, GetLengthLength()); - // This is the largest possible message payload when the length field is + // This is the largest possible datagram payload when the length field is // omitted. size_t max_plaintext_size = latched_hard_max_packet_length_ == 0 @@ -2237,7 +2237,8 @@ QuicPacketLength QuicPacketCreator::GetCurrentLargestMessagePayload() const { return largest_frame - std::min(largest_frame, kQuicFrameTypeSize); } -QuicPacketLength QuicPacketCreator::GetGuaranteedLargestMessagePayload() const { +QuicPacketLength QuicPacketCreator::GetGuaranteedLargestDatagramPayload() + const { // QUIC Crypto server packets may include a diversification nonce. const bool may_include_nonce = framer_->version().handshake_protocol == PROTOCOL_QUIC_CRYPTO && @@ -2258,7 +2259,7 @@ QuicPacketLength QuicPacketCreator::GetGuaranteedLargestMessagePayload() const { PACKET_4BYTE_PACKET_NUMBER, // No Retry token on packets containing application data. quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, length_length); - // This is the largest possible message payload when the length field is + // This is the largest possible datagram payload when the length field is // omitted. size_t max_plaintext_size = latched_hard_max_packet_length_ == 0 @@ -2271,8 +2272,8 @@ QuicPacketLength QuicPacketCreator::GetGuaranteedLargestMessagePayload() const { } const QuicPacketLength largest_payload = largest_frame - std::min(largest_frame, kQuicFrameTypeSize); - // This must always be less than or equal to GetCurrentLargestMessagePayload. - QUICHE_DCHECK_LE(largest_payload, GetCurrentLargestMessagePayload()) + // This must always be less than or equal to GetCurrentLargestDatagramPayload. + QUICHE_DCHECK_LE(largest_payload, GetCurrentLargestDatagramPayload()) << ENDPOINT; return largest_payload; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.h index d4ca9b88bd..c07dd8d8ab 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.h @@ -175,10 +175,10 @@ class QUICHE_EXPORT QuicPacketCreator { bool HasRoomForStreamFrame(QuicStreamId id, QuicStreamOffset offset, size_t data_size); - // Returns true if current open packet can accommodate a message frame of + // Returns true if current open packet can accommodate a datagram frame of // |length|. // TODO(fayang): mark this const by moving RemoveSoftMaxPacketLength out. - bool HasRoomForMessageFrame(QuicByteCount length); + bool HasRoomForDatagramFrame(QuicByteCount length); // Serializes all added frames into a single packet and invokes the delegate_ // to further process the SerializedPacket. @@ -354,7 +354,7 @@ class QUICHE_EXPORT QuicPacketCreator { // Sets the maximum packet length. void SetMaxPacketLength(QuicByteCount length); - // Sets the maximum DATAGRAM/MESSAGE frame size we can send. + // Sets the maximum DATAGRAM frame size we can send. void SetMaxDatagramFrameSize(QuicByteCount max_datagram_frame_size); // Set a soft maximum packet length in the creator. If a packet cannot be @@ -425,16 +425,16 @@ class QUICHE_EXPORT QuicPacketCreator { // Set transmission type of next constructed packets. void SetTransmissionType(TransmissionType type); - // Tries to add a message frame containing |message| and returns the status. - MessageStatus AddMessageFrame(QuicMessageId message_id, - absl::Span message); + // Tries to add a datagram frame containing |datagram| and returns the status. + DatagramStatus AddDatagramFrame(QuicDatagramId datagram_id, + absl::Span datagram); - // Returns the largest payload that will fit into a single MESSAGE frame. - QuicPacketLength GetCurrentLargestMessagePayload() const; - // Returns the largest payload that will fit into a single MESSAGE frame at + // Returns the largest payload that will fit into a single DATAGRAM frame. + QuicPacketLength GetCurrentLargestDatagramPayload() const; + // Returns the largest payload that will fit into a single DATAGRAM frame at // any point during the connection. This assumes the version and // connection ID lengths do not change. - QuicPacketLength GetGuaranteedLargestMessagePayload() const; + QuicPacketLength GetGuaranteedLargestDatagramPayload() const; // Packet number of next created packet. QuicPacketNumber NextSendingPacketNumber() const; @@ -717,7 +717,7 @@ class QUICHE_EXPORT QuicPacketCreator { // set to a soft value. QuicByteCount latched_hard_max_packet_length_; - // The maximum length of a MESSAGE/DATAGRAM frame that our peer is willing to + // The maximum length of a DATAGRAM frame that our peer is willing to // accept. There is no limit for QUIC_CRYPTO connections, but QUIC+TLS // negotiates this during the handshake. QuicByteCount max_datagram_frame_size_; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packets.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packets.cc index 0346ae1036..1ed9ab87f2 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packets.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packets.cc @@ -447,7 +447,7 @@ SerializedPacket::SerializedPacket(QuicPacketNumber packet_number, transmission_type(NOT_RETRANSMISSION), has_ack_frame_copy(false), has_ack_frequency(false), - has_message(false), + has_datagram(false), fate(SEND_TO_WRITER) {} SerializedPacket::SerializedPacket(SerializedPacket&& other) @@ -462,7 +462,7 @@ SerializedPacket::SerializedPacket(SerializedPacket&& other) largest_acked(other.largest_acked), has_ack_frame_copy(other.has_ack_frame_copy), has_ack_frequency(other.has_ack_frequency), - has_message(other.has_message), + has_datagram(other.has_datagram), fate(other.fate), peer_address(other.peer_address), bytes_not_retransmitted(other.bytes_not_retransmitted), @@ -510,7 +510,7 @@ SerializedPacket* CopySerializedPacket(const SerializedPacket& serialized, copy->transmission_type = serialized.transmission_type; copy->largest_acked = serialized.largest_acked; copy->has_ack_frequency = serialized.has_ack_frequency; - copy->has_message = serialized.has_message; + copy->has_datagram = serialized.has_datagram; copy->fate = serialized.fate; copy->peer_address = serialized.peer_address; copy->bytes_not_retransmitted = serialized.bytes_not_retransmitted; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packets.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packets.h index ccac3feae3..df121b130b 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packets.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_packets.h @@ -425,7 +425,7 @@ struct QUICHE_EXPORT SerializedPacket { // nonretransmittable_frames. bool has_ack_frame_copy; bool has_ack_frequency; - bool has_message; + bool has_datagram; SerializedPacketFate fate; QuicSocketAddress peer_address; // Sum of bytes from frames that are not retransmissions. This field is only diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_path_context_factory.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_path_context_factory.h new file mode 100644 index 0000000000..5fa5c2d5ec --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_path_context_factory.h @@ -0,0 +1,77 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_CORE_QUIC_PATH_CONTEXT_FACTORY_H_ +#define QUICHE_QUIC_CORE_QUIC_PATH_CONTEXT_FACTORY_H_ + +#include + +#include "absl/strings/string_view.h" +#include "quiche/quic/core/quic_force_blockable_packet_writer.h" +#include "quiche/quic/core/quic_path_validator.h" +#include "quiche/quic/platform/api/quic_socket_address.h" +#include "quiche/common/platform/api/quiche_export.h" + +namespace quic { + +// A client side interface that enforces the writer to be force blockable. +class QUICHE_EXPORT QuicClientPathValidationContext + : public QuicPathValidationContext { + public: + QuicClientPathValidationContext(const QuicSocketAddress& self_address, + const QuicSocketAddress& peer_address, + QuicNetworkHandle network) + : QuicClientPathValidationContext(self_address, peer_address, + peer_address, network) {} + + QuicClientPathValidationContext( + const QuicSocketAddress& self_address, + const QuicSocketAddress& peer_address, + const QuicSocketAddress& effective_peer_address, + QuicNetworkHandle network) + : QuicPathValidationContext(self_address, peer_address, + effective_peer_address, network) {} + + QuicPacketWriter* WriterToUse() override { + return ForceBlockableWriterToUse(); + } + + virtual QuicForceBlockablePacketWriter* ForceBlockableWriterToUse() = 0; +}; + +// An interface for creating QuicClientPathValidationContext objects used for +// probing and migrating path. +class QUICHE_EXPORT QuicPathContextFactory { + public: + // An interface to handle creation success and failure given the creation + // might be asynchronous. + class CreationResultDelegate { + public: + virtual ~CreationResultDelegate() = default; + + // Called when the manager successfully created a path context. + // |context| must not be nullptr. + virtual void OnCreationSucceeded( + std::unique_ptr context) = 0; + + // Called when the manager fails to create a path context on |network|. + // |error| will be populated with details. + virtual void OnCreationFailed(QuicNetworkHandle network, + absl::string_view error) = 0; + }; + + virtual ~QuicPathContextFactory() = default; + + // Create a QuicPathValidationContext instance on the given |network| + // connecting to |peer_address|. + // |result_delegate| can be called either in the current call stack or + // asynchronously. + virtual void CreatePathValidationContext( + QuicNetworkHandle network, QuicSocketAddress peer_address, + std::unique_ptr result_delegate) = 0; +}; + +} // namespace quic + +#endif // QUICHE_QUIC_CORE_QUIC_PATH_CONTEXT_FACTORY_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_path_validator.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_path_validator.h index 37faca3f4b..6b15cd2f44 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_path_validator.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_path_validator.h @@ -40,26 +40,52 @@ enum class PathValidationReason { kMaxValue, }; +// Opaque handle for device-wide connection to a particular network. +// For example an association with a particular WiFi network with a particular +// SSID or a connection to particular cellular network. The meaning of this +// handle is target-dependent. On Android QuicNetworkHandles are equivalent to: +// On Lollipop, the framework's concept of NetIDs (e.g. Network.netId), and +// On Marshmallow and newer releases, network handle (e.g. +// Network.getNetworkHandle()). +using QuicNetworkHandle = int64_t; + +// An invalid NetworkHandle. +// Used on platforms which do not support network handles or to represent an +// unusable network. +inline constexpr QuicNetworkHandle kInvalidNetworkHandle = -1; + // Interface to provide the information of the path to be validated. class QUICHE_EXPORT QuicPathValidationContext { public: QuicPathValidationContext(const QuicSocketAddress& self_address, const QuicSocketAddress& peer_address) - : self_address_(self_address), - peer_address_(peer_address), - effective_peer_address_(peer_address) {} + : QuicPathValidationContext(self_address, peer_address, + kInvalidNetworkHandle) {} QuicPathValidationContext(const QuicSocketAddress& self_address, const QuicSocketAddress& peer_address, - const QuicSocketAddress& effective_peer_address) + QuicNetworkHandle network) + : QuicPathValidationContext(self_address, peer_address, peer_address, + network) {} + + QuicPathValidationContext(const QuicSocketAddress& self_address, + const QuicSocketAddress& peer_address, + const QuicSocketAddress& effective_peer_address, + QuicNetworkHandle network) : self_address_(self_address), peer_address_(peer_address), - effective_peer_address_(effective_peer_address) {} + effective_peer_address_(effective_peer_address), + network_handle_(network) {} virtual ~QuicPathValidationContext() = default; virtual QuicPacketWriter* WriterToUse() = 0; + // Returns true if the writer should be owned by the QUIC connection. + // TODO(danzh): make it a pure virtual interface once + // EnvoyQuicPathValidationContext implements it. + virtual bool ShouldConnectionOwnWriter() const { return true; } + QuicNetworkHandle network() const { return network_handle_; } const QuicSocketAddress& self_address() const { return self_address_; } const QuicSocketAddress& peer_address() const { return peer_address_; } const QuicSocketAddress& effective_peer_address() const { @@ -73,9 +99,13 @@ class QUICHE_EXPORT QuicPathValidationContext { QuicSocketAddress self_address_; // The address to send PATH_CHALLENGE. QuicSocketAddress peer_address_; - // The actual peer address which is different from |peer_address_| if the peer + // The actual peer address which is different from `peer_address_` if the peer // is behind a proxy. QuicSocketAddress effective_peer_address_; + // See comments above for QuicNetworkHandle. + // `kInvalidNetworkHandle`, if the platform doesn't expose handles for + // networks, e.g. iOS and Linux. It shouldn't referred to in such case. + QuicNetworkHandle network_handle_; }; // Used to validate a path by sending up to 3 PATH_CHALLENGE frames before diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc index 52a5cd4101..7797a35850 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc @@ -115,8 +115,6 @@ void QuicPingManager::UpdateDeadlines(QuicTime now, bool should_keep_alive, static_cast(num_ptos_for_retransmittable_on_wire_timeout_) * pto_delay; } else { - QUICHE_DCHECK_LT(initial_retransmittable_on_wire_timeout_, - keep_alive_timeout_); retransmittable_on_wire_timeout = initial_retransmittable_on_wire_timeout_; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc index ef8b7a9160..6d11224132 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc @@ -749,13 +749,13 @@ bool QuicSentPacketManager::OnPacketSent( has_retransmittable_data); } - // Deallocate message data in QuicMessageFrame immediately after packet + // Deallocate datagram data in QuicDatagramFrame immediately after packet // sent. - if (packet.has_message) { + if (packet.has_datagram) { for (auto& frame : mutable_packet->retransmittable_frames) { - if (frame.type == MESSAGE_FRAME) { - frame.message_frame->message_data.clear(); - frame.message_frame->message_length = 0; + if (frame.type == DATAGRAM_FRAME) { + frame.datagram_frame->datagram_data.clear(); + frame.datagram_frame->datagram_length = 0; } } } @@ -1270,6 +1270,10 @@ QuicSentPacketManager::OnConnectionMigration(bool reset_send_algorithm) { MarkForRetransmission(packet_number, PATH_RETRANSMISSION); QUICHE_DCHECK_EQ(it->state, NOT_CONTRIBUTING_RTT); } + if (neuter_packets_on_migration_) { + QUIC_RELOADABLE_FLAG_COUNT(quic_neuter_packets_on_migration); + old_send_algorithm->OnPacketNeutered(packet_number); + } } it->state = NOT_CONTRIBUTING_RTT; } @@ -1705,8 +1709,8 @@ void QuicSentPacketManager::UpdateOverheadMeasurements( if (frame.type == QuicFrameType::STREAM_FRAME) { overhead_good_bytes_ += frame.stream_frame.data_length; } - if (frame.type == QuicFrameType::MESSAGE_FRAME) { - overhead_good_bytes_ += frame.message_frame->message_length; + if (frame.type == QuicFrameType::DATAGRAM_FRAME) { + overhead_good_bytes_ += frame.datagram_frame->datagram_length; } } } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.h index f17c386644..b51d804724 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.h @@ -31,6 +31,7 @@ #include "quiche/quic/core/quic_types.h" #include "quiche/quic/core/quic_unacked_packet_map.h" #include "quiche/quic/core/session_notifier_interface.h" +#include "quiche/quic/platform/api/quic_flags.h" #include "quiche/common/platform/api/quiche_export.h" #include "quiche/common/platform/api/quiche_logging.h" #include "quiche/common/quiche_circular_deque.h" @@ -771,6 +772,9 @@ class QUICHE_EXPORT QuicSentPacketManager { // used to prevent the execution of ECN-specific code unless flag-protected // code has explicitly enabled it. bool ecn_queried_ = false; + + const bool neuter_packets_on_migration_ = + GetQuicReloadableFlag(quic_neuter_packets_on_migration); }; } // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_session.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_session.cc index e3e5e708e3..0c4c9b0c4e 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_session.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_session.cc @@ -117,47 +117,47 @@ QuicSession::QuicSession( QuicStreamCount num_expected_unidirectional_static_streams, std::unique_ptr datagram_observer, QuicPriorityType priority_type) - : connection_(connection), + : num_draining_streams_(0), + connection_(connection), perspective_(connection->perspective()), - visitor_(owner), write_blocked_streams_(CreateWriteBlockedList(priority_type)), - config_(config), - stream_id_manager_(perspective(), connection->transport_version(), - kDefaultMaxStreamsPerConnection, - config_.GetMaxBidirectionalStreamsToSend()), - ietf_streamid_manager_(perspective(), connection->version(), this, 0, - num_expected_unidirectional_static_streams, - config_.GetMaxBidirectionalStreamsToSend(), - config_.GetMaxUnidirectionalStreamsToSend() + - num_expected_unidirectional_static_streams), - num_draining_streams_(0), - num_outgoing_draining_streams_(0), - num_static_streams_(0), num_zombie_streams_(0), + num_static_streams_(0), flow_controller_( this, QuicUtils::GetInvalidStreamId(connection->transport_version()), /*is_connection_flow_controller*/ true, connection->version().AllowsLowFlowControlLimits() ? 0 : kMinimumFlowControlSendWindow, - config_.GetInitialSessionFlowControlWindowToSend(), + config.GetInitialSessionFlowControlWindowToSend(), kSessionReceiveWindowLimit, perspective() == Perspective::IS_SERVER, nullptr), - currently_writing_stream_id_(0), - transport_goaway_sent_(false), - transport_goaway_received_(false), control_frame_manager_(this), - last_message_id_(0), datagram_queue_(this, std::move(datagram_observer)), - closed_streams_clean_up_alarm_(nullptr), - supported_versions_(supported_versions), is_configured_(false), was_zero_rtt_rejected_(false), + priority_type_(priority_type), + transport_goaway_sent_(false), + transport_goaway_received_(false), liveness_testing_in_progress_(false), + last_datagram_id_(0), + currently_writing_stream_id_(0), + num_outgoing_draining_streams_(0), + closed_streams_clean_up_alarm_(nullptr), + visitor_(owner), stream_count_reset_alarm_( absl::WrapUnique(connection->alarm_factory()->CreateAlarm( new StreamCountResetAlarmDelegate(this)))), - priority_type_(priority_type) { + supported_versions_(supported_versions), + stream_id_manager_(perspective(), connection->transport_version(), + kDefaultMaxStreamsPerConnection, + config.GetMaxBidirectionalStreamsToSend()), + ietf_streamid_manager_(perspective(), connection->version(), this, 0, + num_expected_unidirectional_static_streams, + config.GetMaxBidirectionalStreamsToSend(), + config.GetMaxUnidirectionalStreamsToSend() + + num_expected_unidirectional_static_streams), + config_(config) { closed_streams_clean_up_alarm_ = absl::WrapUnique(connection_->alarm_factory()->CreateAlarm( new ClosedStreamsCleanUpDelegate(this))); @@ -542,12 +542,12 @@ void QuicSession::OnGoAway(const QuicGoAwayFrame& /*frame*/) { transport_goaway_received_ = true; } -void QuicSession::OnMessageReceived(absl::string_view message) { - QUIC_DVLOG(1) << ENDPOINT << "Received message of length " - << message.length(); - QUIC_DVLOG(2) << ENDPOINT << "Contents of message of length " - << message.length() << ":" << std::endl - << quiche::QuicheTextUtils::HexDump(message); +void QuicSession::OnDatagramReceived(absl::string_view datagram) { + QUIC_DVLOG(1) << ENDPOINT << "Received datagram of length " + << datagram.length(); + QUIC_DVLOG(2) << ENDPOINT << "Contents of datagram of length " + << datagram.length() << ":" << std::endl + << quiche::QuicheTextUtils::HexDump(datagram); } void QuicSession::OnHandshakeDoneReceived() { @@ -2483,8 +2483,8 @@ bool QuicSession::OnFrameAcked(const QuicFrame& frame, QuicTime::Delta ack_delay_time, QuicTime receive_timestamp, bool is_retransmission) { - if (frame.type == MESSAGE_FRAME) { - OnMessageAcked(frame.message_frame->message_id, receive_timestamp); + if (frame.type == DATAGRAM_FRAME) { + OnDatagramAcked(frame.datagram_frame->datagram_id, receive_timestamp); return true; } if (frame.type == CRYPTO_FRAME) { @@ -2533,9 +2533,9 @@ void QuicSession::OnStreamFrameRetransmitted(const QuicStreamFrame& frame) { } void QuicSession::OnFrameLost(const QuicFrame& frame) { - if (frame.type == MESSAGE_FRAME) { + if (frame.type == DATAGRAM_FRAME) { ++total_datagrams_lost_; - OnMessageLost(frame.message_frame->message_id); + OnDatagramLost(frame.datagram_frame->datagram_id); return; } if (frame.type == CRYPTO_FRAME) { @@ -2565,8 +2565,8 @@ bool QuicSession::RetransmitFrames(const QuicFrames& frames, TransmissionType type) { QuicConnection::ScopedPacketFlusher retransmission_flusher(connection_); for (const QuicFrame& frame : frames) { - if (frame.type == MESSAGE_FRAME) { - // Do not retransmit MESSAGE frames. + if (frame.type == DATAGRAM_FRAME) { + // Do not retransmit DATAGRAM frames. continue; } if (frame.type == CRYPTO_FRAME) { @@ -2593,7 +2593,7 @@ bool QuicSession::RetransmitFrames(const QuicFrames& frames, } bool QuicSession::IsFrameOutstanding(const QuicFrame& frame) const { - if (frame.type == MESSAGE_FRAME) { + if (frame.type == DATAGRAM_FRAME) { return false; } if (frame.type == CRYPTO_FRAME) { @@ -2758,50 +2758,50 @@ void QuicSession::SetTransmissionType(TransmissionType type) { connection_->SetTransmissionType(type); } -MessageResult QuicSession::SendMessage( - absl::Span message) { - return SendMessage(message, /*flush=*/false); +DatagramResult QuicSession::SendDatagram( + absl::Span datagram) { + return SendDatagram(datagram, /*flush=*/false); } -MessageResult QuicSession::SendMessage(quiche::QuicheMemSlice message) { - return SendMessage(absl::MakeSpan(&message, 1), /*flush=*/false); +DatagramResult QuicSession::SendDatagram(quiche::QuicheMemSlice datagram) { + return SendDatagram(absl::MakeSpan(&datagram, 1), /*flush=*/false); } -MessageResult QuicSession::SendMessage( - absl::Span message, bool flush) { +DatagramResult QuicSession::SendDatagram( + absl::Span datagram, bool flush) { QUICHE_DCHECK(connection_->connected()) - << ENDPOINT << "Try to write messages when connection is closed."; + << ENDPOINT << "Try to write datagrams when connection is closed."; if (!IsEncryptionEstablished()) { - return {MESSAGE_STATUS_ENCRYPTION_NOT_ESTABLISHED, 0}; + return {DATAGRAM_STATUS_ENCRYPTION_NOT_ESTABLISHED, 0}; } QuicConnection::ScopedEncryptionLevelContext context( connection(), GetEncryptionLevelToSendApplicationData()); - MessageStatus result = - connection_->SendMessage(last_message_id_ + 1, message, flush); - if (result == MESSAGE_STATUS_SUCCESS) { - return {result, ++last_message_id_}; + DatagramStatus result = + connection_->SendDatagram(last_datagram_id_ + 1, datagram, flush); + if (result == DATAGRAM_STATUS_SUCCESS) { + return {result, ++last_datagram_id_}; } return {result, 0}; } -void QuicSession::OnMessageAcked(QuicMessageId message_id, - QuicTime /*receive_timestamp*/) { - QUIC_DVLOG(1) << ENDPOINT << "message " << message_id << " gets acked."; +void QuicSession::OnDatagramAcked(QuicDatagramId datagram_id, + QuicTime /*receive_timestamp*/) { + QUIC_DVLOG(1) << ENDPOINT << "datagram " << datagram_id << " gets acked."; } -void QuicSession::OnMessageLost(QuicMessageId message_id) { - QUIC_DVLOG(1) << ENDPOINT << "message " << message_id +void QuicSession::OnDatagramLost(QuicDatagramId datagram_id) { + QUIC_DVLOG(1) << ENDPOINT << "datagram " << datagram_id << " is considered lost"; } void QuicSession::CleanUpClosedStreams() { closed_streams_.clear(); } -QuicPacketLength QuicSession::GetCurrentLargestMessagePayload() const { - return connection_->GetCurrentLargestMessagePayload(); +QuicPacketLength QuicSession::GetCurrentLargestDatagramPayload() const { + return connection_->GetCurrentLargestDatagramPayload(); } -QuicPacketLength QuicSession::GetGuaranteedLargestMessagePayload() const { - return connection_->GetGuaranteedLargestMessagePayload(); +QuicPacketLength QuicSession::GetGuaranteedLargestDatagramPayload() const { + return connection_->GetGuaranteedLargestDatagramPayload(); } QuicStreamId QuicSession::next_outgoing_bidirectional_stream_id() const { @@ -2983,6 +2983,11 @@ void QuicSession::OnServerPreferredAddressAvailable( } } +bool QuicSession::MaybeMitigateWriteError(const WriteResult& /*write_result*/) { + QUICHE_DCHECK_EQ(perspective_, Perspective::IS_CLIENT); + return false; +} + QuicStream* QuicSession::ProcessPendingStream(PendingStream* pending) { QUICHE_DCHECK(VersionUsesHttp3(transport_version())); QUICHE_DCHECK(connection()->connected()); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_session.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_session.h index a4bd1fbaaf..2a27f4b865 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_session.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_session.h @@ -139,7 +139,7 @@ class QUICHE_EXPORT QuicSession void OnRstStream(const QuicRstStreamFrame& frame) override; void OnResetStreamAt(const QuicResetStreamAtFrame& frame) override; void OnGoAway(const QuicGoAwayFrame& frame) override; - void OnMessageReceived(absl::string_view message) override; + void OnDatagramReceived(absl::string_view datagram) override; void OnHandshakeDoneReceived() override; void OnNewTokenReceived(absl::string_view token) override; void OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override; @@ -198,6 +198,7 @@ class QUICHE_EXPORT QuicSession const QuicSocketAddress& /*server_preferred_address*/) override; void MaybeBundleOpportunistically() override {} QuicByteCount GetFlowControlSendWindowSize(QuicStreamId id) override; + bool MaybeMitigateWriteError(const WriteResult& write_result) override; // QuicStreamFrameDataProducer WriteStreamDataResult WriteStreamData(QuicStreamId id, @@ -234,47 +235,48 @@ class QUICHE_EXPORT QuicSession const QuicSocketAddress& peer_address, const QuicReceivedPacket& packet); - // Sends |message| as a QUIC DATAGRAM frame (QUIC MESSAGE frame in gQUIC). + // Sends |datagram| as a QUIC DATAGRAM frame. // See for // more details. // - // Returns a MessageResult struct which includes the status of the write - // operation and a message ID. The message ID (not sent on the wire) can be - // used to track the message; OnMessageAcked and OnMessageLost are called when - // a specific message gets acked or lost. + // Returns a DatagramResult struct which includes the status of the write + // operation and a datagram ID. The datagram ID (not sent on the wire) can be + // used to track the datagram; OnDatagramAcked and OnDatagramLost are called + // when a specific datagram gets acked or lost. // - // If the write operation is successful, all of the slices in |message| are - // consumed, leaving them empty. If MESSAGE_STATUS_INTERNAL_ERROR is + // If the write operation is successful, all of the slices in |datagram| are + // consumed, leaving them empty. If DATAGRAM_STATUS_INTERNAL_ERROR is // returned, the slices in question may or may not be consumed; it is no - // longer safe to access those. For all other status codes, |message| is kept - // intact. + // longer safe to access those. For all other status codes, |datagram| is + // kept intact. // - // Note that SendMessage will fail with status = MESSAGE_STATUS_BLOCKED + // Note that SendDatagram will fail with status = DATAGRAM_STATUS_BLOCKED // if the connection is congestion control blocked or the underlying socket is - // write blocked. In this case the caller can retry sending message again when - // connection becomes available, for example after getting OnCanWrite() + // write blocked. In this case the caller can retry sending datagram again + // when connection becomes available, for example after getting OnCanWrite() // callback. // - // SendMessage flushes the current packet even it is not full; if the + // SendDatagram flushes the current packet even it is not full; if the // application needs to bundle other data in the same packet, consider using // QuicConnection::ScopedPacketFlusher around the relevant write operations. - MessageResult SendMessage(absl::Span message); + DatagramResult SendDatagram(absl::Span datagram); - // Same as above SendMessage, except caller can specify if the given |message| - // should be flushed even if the underlying connection is deemed unwritable. - MessageResult SendMessage(absl::Span message, - bool flush); + // Same as above SendDatagram, except caller can specify if the given + // |datagram| should be flushed even if the underlying connection is deemed + // unwritable. + DatagramResult SendDatagram(absl::Span datagram, + bool flush); - // Single-slice version of SendMessage(). Unlike the version above, this + // Single-slice version of SendDatagram(). Unlike the version above, this // version always takes ownership of the slice. - MessageResult SendMessage(quiche::QuicheMemSlice message); + DatagramResult SendDatagram(quiche::QuicheMemSlice datagram); - // Called when message with |message_id| gets acked. - virtual void OnMessageAcked(QuicMessageId message_id, - QuicTime receive_timestamp); + // Called when datagram with |datagram_id| gets acked. + virtual void OnDatagramAcked(QuicDatagramId datagram_id, + QuicTime receive_timestamp); - // Called when message with |message_id| is considered as lost. - virtual void OnMessageLost(QuicMessageId message_id); + // Called when datagram with |datagram_id| is considered as lost. + virtual void OnDatagramLost(QuicDatagramId datagram_id); // QuicControlFrameManager::DelegateInterface // Close the connection on error. @@ -497,15 +499,15 @@ class QUICHE_EXPORT QuicSession const QuicSocketAddress& peer_address, QuicPacketWriter* writer, bool owns_writer); - // Returns the largest payload that will fit into a single MESSAGE frame. + // Returns the largest payload that will fit into a single DATAGRAM frame. // Because overhead can vary during a connection, this method should be - // checked for every message. - QuicPacketLength GetCurrentLargestMessagePayload() const; + // checked for every datagram. + QuicPacketLength GetCurrentLargestDatagramPayload() const; - // Returns the largest payload that will fit into a single MESSAGE frame at + // Returns the largest payload that will fit into a single DATAGRAM frame at // any point during the connection. This assumes the version and // connection ID lengths do not change. - QuicPacketLength GetGuaranteedLargestMessagePayload() const; + QuicPacketLength GetGuaranteedLargestDatagramPayload() const; bool transport_goaway_sent() const { return transport_goaway_sent_; } @@ -999,10 +1001,9 @@ class QUICHE_EXPORT QuicSession void PerformActionOnNonStaticStreams( quiche::UnretainedCallback action); - // Keep track of highest received byte offset of locally closed streams, while - // waiting for a definitive final highest offset from the peer. - absl::flat_hash_map - locally_closed_streams_highest_offset_; + // A counter for streams which have sent and received FIN but waiting for + // application to consume data. + size_t num_draining_streams_; QuicConnection* connection_; @@ -1010,24 +1011,119 @@ class QUICHE_EXPORT QuicSession // during our destructor when connection_ may have already been destroyed. Perspective perspective_; - // May be null. - Visitor* visitor_; - // A list of streams which need to write more data. Stream register // themselves in their constructor, and unregisterm themselves in their - // destructors, so the write blocked list must outlive all streams. + // destructors, so the write blocked list must outlive all streams. Don't + // reorder write_blocked_streams_ after stream_map_ for the correct + // destruction order. std::unique_ptr write_blocked_streams_; - ClosedStreams closed_streams_; - - QuicConfig config_; - // Map from StreamId to pointers to streams. Owns the streams. StreamMap stream_map_; + // A counter for streams which have done reading and writing, but are waiting + // for acks. + size_t num_zombie_streams_; + + // A counter for static streams which are in stream_map_. + size_t num_static_streams_; + + // TODO(fayang): switch to linked_hash_set when chromium supports it. The bool + // is not used here. + // List of streams with pending retransmissions. + quiche::QuicheLinkedHashMap + streams_with_pending_retransmission_; + + // Used for connection-level flow control. + QuicFlowController flow_controller_; + + QuicControlFrameManager control_frame_manager_; + + // The buffer used to queue the DATAGRAM frames. + QuicDatagramQueue datagram_queue_; + + // Initialized to false. Set to true when the session has been properly + // configured and is ready for general operation. + bool is_configured_; + + // Whether the session has received a 0-RTT rejection (QUIC+TLS only). + bool was_zero_rtt_rejected_; + + QuicPriorityType priority_type_; + + const bool enable_stop_sending_for_zombie_streams_ = + GetQuicReloadableFlag(quic_deliver_stop_sending_to_zombie_streams); + + // Whether a transport layer GOAWAY frame has been sent. + // Such a frame only exists in Google QUIC, therefore |transport_goaway_sent_| + // is always false when using IETF QUIC. + bool transport_goaway_sent_; + const bool notify_stream_soon_to_destroy_ = + GetQuicReloadableFlag(quic_notify_stream_soon_to_destroy); + + // Whether a transport layer GOAWAY frame has been received. + // Such a frame only exists in Google QUIC, therefore + // |transport_goaway_received_| is always false when using IETF QUIC. + bool transport_goaway_received_; + + // This indicates a liveness testing is in progress, and push back the + // creation of new outgoing bidirectional streams. + bool liveness_testing_in_progress_; + + // Default to max stream count so that there is no stream creation limit per + // event loop. + QuicStreamCount max_streams_accepted_per_loop_ = kMaxQuicStreamCount; + + // The counter for newly created non-static incoming streams in the current + // event loop and gets reset for each event loop. + QuicStreamCount new_incoming_streams_in_current_loop_ = 0u; + + // Id of latest successfully sent datagram. + QuicDatagramId last_datagram_id_; + + // The stream id which was last popped in OnCanWrite, or 0, if not under the + // call stack of OnCanWrite. + QuicStreamId currently_writing_stream_id_; + + // A counter for self initiated streams which have sent and received FIN but + // waiting for application to consume data. + size_t num_outgoing_draining_streams_; + + std::optional connection_close_source_; + + // Clean up closed_streams_ when this alarm fires. + std::unique_ptr closed_streams_clean_up_alarm_; + + // May be null. + Visitor* visitor_; + + // Total number of datagram frames declared lost within the session. + uint64_t total_datagrams_lost_ = 0; + + std::unique_ptr stream_count_reset_alarm_; + + // Only non-empty on the client after receiving a version negotiation packet, + // contains the configured versions from the original session before version + // negotiation was received. + ParsedQuicVersionVector client_original_supported_versions_; + + ClosedStreams closed_streams_; + + // Supported version list used by the crypto handshake only. Please note, this + // list may be a superset of the connection framer's supported versions. + ParsedQuicVersionVector supported_versions_; + + std::optional user_agent_id_; + + // Keep track of highest received byte offset of locally closed streams, while + // waiting for a definitive final highest offset from the peer. + absl::flat_hash_map + locally_closed_streams_highest_offset_; // Map from StreamId to PendingStreams for peer-created unidirectional streams // which are waiting for the first byte of payload to arrive. PendingStreamMap pending_stream_map_; + // Received information for a connection close. + QuicConnectionCloseFrame on_closed_frame_; // TODO(fayang): Consider moving LegacyQuicStreamIdManager into // UberQuicStreamIdManager. @@ -1037,99 +1133,7 @@ class QUICHE_EXPORT QuicSession // Manages stream IDs for version99/IETF QUIC UberQuicStreamIdManager ietf_streamid_manager_; - // A counter for streams which have sent and received FIN but waiting for - // application to consume data. - size_t num_draining_streams_; - - // A counter for self initiated streams which have sent and received FIN but - // waiting for application to consume data. - size_t num_outgoing_draining_streams_; - - // A counter for static streams which are in stream_map_. - size_t num_static_streams_; - - // A counter for streams which have done reading and writing, but are waiting - // for acks. - size_t num_zombie_streams_; - - // Received information for a connection close. - QuicConnectionCloseFrame on_closed_frame_; - std::optional connection_close_source_; - - // Used for connection-level flow control. - QuicFlowController flow_controller_; - - // The stream id which was last popped in OnCanWrite, or 0, if not under the - // call stack of OnCanWrite. - QuicStreamId currently_writing_stream_id_; - - // Whether a transport layer GOAWAY frame has been sent. - // Such a frame only exists in Google QUIC, therefore |transport_goaway_sent_| - // is always false when using IETF QUIC. - bool transport_goaway_sent_; - - // Whether a transport layer GOAWAY frame has been received. - // Such a frame only exists in Google QUIC, therefore - // |transport_goaway_received_| is always false when using IETF QUIC. - bool transport_goaway_received_; - - QuicControlFrameManager control_frame_manager_; - - // Id of latest successfully sent message. - QuicMessageId last_message_id_; - - // The buffer used to queue the DATAGRAM frames. - QuicDatagramQueue datagram_queue_; - - // Total number of datagram frames declared lost within the session. - uint64_t total_datagrams_lost_ = 0; - - // TODO(fayang): switch to linked_hash_set when chromium supports it. The bool - // is not used here. - // List of streams with pending retransmissions. - quiche::QuicheLinkedHashMap - streams_with_pending_retransmission_; - - // Clean up closed_streams_ when this alarm fires. - std::unique_ptr closed_streams_clean_up_alarm_; - - // Supported version list used by the crypto handshake only. Please note, this - // list may be a superset of the connection framer's supported versions. - ParsedQuicVersionVector supported_versions_; - - // Only non-empty on the client after receiving a version negotiation packet, - // contains the configured versions from the original session before version - // negotiation was received. - ParsedQuicVersionVector client_original_supported_versions_; - - std::optional user_agent_id_; - - // Initialized to false. Set to true when the session has been properly - // configured and is ready for general operation. - bool is_configured_; - - // Whether the session has received a 0-RTT rejection (QUIC+TLS only). - bool was_zero_rtt_rejected_; - - // This indicates a liveness testing is in progress, and push back the - // creation of new outgoing bidirectional streams. - bool liveness_testing_in_progress_; - - // The counter for newly created non-static incoming streams in the current - // event loop and gets reset for each event loop. - QuicStreamCount new_incoming_streams_in_current_loop_ = 0u; - // Default to max stream count so that there is no stream creation limit per - // event loop. - QuicStreamCount max_streams_accepted_per_loop_ = kMaxQuicStreamCount; - std::unique_ptr stream_count_reset_alarm_; - - QuicPriorityType priority_type_; - - const bool enable_stop_sending_for_zombie_streams_ = - GetQuicReloadableFlag(quic_deliver_stop_sending_to_zombie_streams); - - const bool notify_stream_soon_to_destroy_ = - GetQuicReloadableFlag(quic_notify_stream_soon_to_destroy); + QuicConfig config_; }; } // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer.cc index ad78782500..a1b9779df0 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer.cc @@ -44,9 +44,9 @@ BufferedSlice& BufferedSlice::operator=(BufferedSlice&& other) = default; BufferedSlice::~BufferedSlice() {} -QuicInterval BufferedSlice::interval() const { - const std::size_t length = slice.length(); - return QuicInterval(offset, offset + length); +QuicInterval BufferedSlice::interval() const { + const uint64_t length = slice.length(); + return QuicInterval(offset, offset + length); } QuicStreamSendBuffer::QuicStreamSendBuffer( diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer.h index d9b25c3a86..85caec6d1c 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer.h @@ -40,7 +40,7 @@ struct QUICHE_EXPORT BufferedSlice { ~BufferedSlice(); // Return an interval representing the offset and length. - QuicInterval interval() const; + QuicInterval interval() const; // Stream data of this data slice. quiche::QuicheMemSlice slice; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer_inlining.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer_inlining.cc index bd4924e44a..0889dd214d 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer_inlining.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer_inlining.cc @@ -51,9 +51,9 @@ BufferedSliceInlining& BufferedSliceInlining::operator=( BufferedSliceInlining::~BufferedSliceInlining() {} -QuicInterval BufferedSliceInlining::interval() const { - const std::size_t length = slice.size(); - return QuicInterval(offset, offset + length); +QuicInterval BufferedSliceInlining::interval() const { + const uint64_t length = slice.size(); + return QuicInterval(offset, offset + length); } QuicStreamSendBufferInlining::QuicStreamSendBufferInlining( diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer_inlining.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer_inlining.h index 6cb0f952ed..c3a61e9b48 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer_inlining.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_stream_send_buffer_inlining.h @@ -46,7 +46,7 @@ struct QUICHE_EXPORT BufferedSliceInlining { ~BufferedSliceInlining(); // Return an interval representing the offset and length. - QuicInterval interval() const; + QuicInterval interval() const; // Stream data of this data slice. QuicInlinedStringView slice; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_time.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_time.cc index afbca5bf2d..655ac6d123 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_time.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_time.cc @@ -4,7 +4,7 @@ #include "quiche/quic/core/quic_time.h" -#include +#include #include #include #include diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_time.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_time.h index 2aaf7aa711..b6d6e8950b 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_time.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_time.h @@ -6,13 +6,17 @@ #define QUICHE_QUIC_CORE_QUIC_TIME_H_ #include +#include +#include #include #include +#include #include #include +#include "absl/base/optimization.h" #include "absl/time/time.h" -#include "quiche/quic/platform/api/quic_export.h" +#include "quiche/common/platform/api/quiche_export.h" namespace quic { @@ -51,6 +55,17 @@ class QUICHE_EXPORT QuicTimeDelta { return QuicTimeDelta(ms * 1000); } + // Converts a number of milliseconds to a time offset. Returns std::nullopt if + // the conversion would overflow. + static constexpr std::optional TryFromMilliseconds( + int64_t ms) { + if (ms > std::numeric_limits::max() / 1000 || + ms < std::numeric_limits::min() / 1000) { + return std::nullopt; + } + return QuicTimeDelta(ms * 1000); + } + // Converts a number of microseconds to a time offset. static constexpr QuicTimeDelta FromMicroseconds(int64_t us) { return QuicTimeDelta(us); @@ -84,9 +99,11 @@ class QUICHE_EXPORT QuicTimeDelta { sink.Append(delta.ToDebuggingValue()); } + std::strong_ordering operator<=>(const QuicTimeDelta& other) const = default; + private: - friend inline bool operator==(QuicTimeDelta lhs, QuicTimeDelta rhs); - friend inline bool operator<(QuicTimeDelta lhs, QuicTimeDelta rhs); + friend class QuicTime; + friend inline QuicTimeDelta operator<<(QuicTimeDelta lhs, size_t rhs); friend inline QuicTimeDelta operator>>(QuicTimeDelta lhs, size_t rhs); @@ -108,8 +125,8 @@ class QUICHE_EXPORT QuicTimeDelta { explicit constexpr QuicTimeDelta(int64_t time_offset) : time_offset_(time_offset) {} + // IMPORTANT: The defaulted comparisons automatically use all data members. int64_t time_offset_; - friend class QuicTime; }; // A microsecond precision timestamp returned by a QuicClock. It is @@ -144,17 +161,18 @@ class QUICHE_EXPORT QuicTime { bool IsInitialized() const { return 0 != time_; } + std::strong_ordering operator<=>(const QuicTime& other) const = default; + private: friend class QuicClock; - friend inline bool operator==(QuicTime lhs, QuicTime rhs); - friend inline bool operator<(QuicTime lhs, QuicTime rhs); friend inline QuicTime operator+(QuicTime lhs, QuicTimeDelta rhs); friend inline QuicTime operator-(QuicTime lhs, QuicTimeDelta rhs); friend inline QuicTimeDelta operator-(QuicTime lhs, QuicTime rhs); explicit constexpr QuicTime(int64_t time) : time_(time) {} + // IMPORTANT: The defaulted comparisons automatically use all data members. int64_t time_; }; @@ -200,9 +218,7 @@ class QUICHE_EXPORT QuicWallTime { // minus |delta|. [[nodiscard]] QuicWallTime Subtract(QuicTimeDelta delta) const; - bool operator==(const QuicWallTime& other) const { - return microseconds_ == other.microseconds_; - } + bool operator==(const QuicWallTime& other) const = default; QuicTimeDelta operator-(const QuicWallTime& rhs) const { return QuicTimeDelta::FromMicroseconds(microseconds_ - rhs.microseconds_); @@ -212,28 +228,11 @@ class QUICHE_EXPORT QuicWallTime { explicit constexpr QuicWallTime(uint64_t microseconds) : microseconds_(microseconds) {} + // IMPORTANT: The defaulted comparisons automatically use all data members. uint64_t microseconds_; }; // Non-member relational operators for QuicTimeDelta. -inline bool operator==(QuicTimeDelta lhs, QuicTimeDelta rhs) { - return lhs.time_offset_ == rhs.time_offset_; -} -inline bool operator!=(QuicTimeDelta lhs, QuicTimeDelta rhs) { - return !(lhs == rhs); -} -inline bool operator<(QuicTimeDelta lhs, QuicTimeDelta rhs) { - return lhs.time_offset_ < rhs.time_offset_; -} -inline bool operator>(QuicTimeDelta lhs, QuicTimeDelta rhs) { - return rhs < lhs; -} -inline bool operator<=(QuicTimeDelta lhs, QuicTimeDelta rhs) { - return !(rhs < lhs); -} -inline bool operator>=(QuicTimeDelta lhs, QuicTimeDelta rhs) { - return !(lhs < rhs); -} inline QuicTimeDelta operator<<(QuicTimeDelta lhs, size_t rhs) { return QuicTimeDelta(lhs.time_offset_ << rhs); } @@ -241,17 +240,6 @@ inline QuicTimeDelta operator>>(QuicTimeDelta lhs, size_t rhs) { return QuicTimeDelta(lhs.time_offset_ >> rhs); } -// Non-member relational operators for QuicTime. -inline bool operator==(QuicTime lhs, QuicTime rhs) { - return lhs.time_ == rhs.time_; -} -inline bool operator!=(QuicTime lhs, QuicTime rhs) { return !(lhs == rhs); } -inline bool operator<(QuicTime lhs, QuicTime rhs) { - return lhs.time_ < rhs.time_; -} -inline bool operator>(QuicTime lhs, QuicTime rhs) { return rhs < lhs; } -inline bool operator<=(QuicTime lhs, QuicTime rhs) { return !(rhs < lhs); } -inline bool operator>=(QuicTime lhs, QuicTime rhs) { return !(lhs < rhs); } // Override stream output operator for gtest or QUICHE_CHECK macros. inline std::ostream& operator<<(std::ostream& output, const QuicTime t) { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_trace_visitor.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_trace_visitor.cc index 4644e0d79a..3b5131a703 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_trace_visitor.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_trace_visitor.cc @@ -92,7 +92,7 @@ void QuicTraceVisitor::OnPacketSent( case PATH_RESPONSE_FRAME: case PATH_CHALLENGE_FRAME: case STOP_SENDING_FRAME: - case MESSAGE_FRAME: + case DATAGRAM_FRAME: case CRYPTO_FRAME: case NEW_TOKEN_FRAME: case RESET_STREAM_AT_FRAME: @@ -224,7 +224,7 @@ void QuicTraceVisitor::PopulateFrameInfo(const QuicFrame& frame, case PATH_RESPONSE_FRAME: case PATH_CHALLENGE_FRAME: case STOP_SENDING_FRAME: - case MESSAGE_FRAME: + case DATAGRAM_FRAME: case CRYPTO_FRAME: case NEW_TOKEN_FRAME: case ACK_FREQUENCY_FRAME: diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_types.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_types.cc index a974c40d01..e4988ddad8 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_types.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_types.cc @@ -128,8 +128,9 @@ std::ostream& operator<<(std::ostream& os, const WriteResult& s) { return os; } -MessageResult::MessageResult(MessageStatus status, QuicMessageId message_id) - : status(status), message_id(message_id) {} +DatagramResult::DatagramResult(DatagramStatus status, + QuicDatagramId datagram_id) + : status(status), datagram_id(datagram_id) {} #define RETURN_STRING_LITERAL(x) \ case x: \ @@ -156,7 +157,7 @@ std::string QuicFrameTypeToString(QuicFrameType t) { RETURN_STRING_LITERAL(PATH_RESPONSE_FRAME) RETURN_STRING_LITERAL(PATH_CHALLENGE_FRAME) RETURN_STRING_LITERAL(STOP_SENDING_FRAME) - RETURN_STRING_LITERAL(MESSAGE_FRAME) + RETURN_STRING_LITERAL(DATAGRAM_FRAME) RETURN_STRING_LITERAL(NEW_TOKEN_FRAME) RETURN_STRING_LITERAL(RETIRE_CONNECTION_ID_FRAME) RETURN_STRING_LITERAL(ACK_FREQUENCY_FRAME) @@ -200,10 +201,10 @@ std::string QuicIetfFrameTypeString(QuicIetfFrameType t) { RETURN_STRING_LITERAL(IETF_PATH_RESPONSE); RETURN_STRING_LITERAL(IETF_CONNECTION_CLOSE); RETURN_STRING_LITERAL(IETF_APPLICATION_CLOSE); - RETURN_STRING_LITERAL(IETF_EXTENSION_MESSAGE_NO_LENGTH); - RETURN_STRING_LITERAL(IETF_EXTENSION_MESSAGE); - RETURN_STRING_LITERAL(IETF_EXTENSION_MESSAGE_NO_LENGTH_V99); - RETURN_STRING_LITERAL(IETF_EXTENSION_MESSAGE_V99); + RETURN_STRING_LITERAL(IETF_EXTENSION_DATAGRAM_NO_LENGTH); + RETURN_STRING_LITERAL(IETF_EXTENSION_DATAGRAM); + RETURN_STRING_LITERAL(IETF_EXTENSION_DATAGRAM_NO_LENGTH_V99); + RETURN_STRING_LITERAL(IETF_EXTENSION_DATAGRAM_V99); default: return absl::StrCat("Private value (", t, ")"); } @@ -259,30 +260,31 @@ std::string QuicLongHeaderTypeToString(QuicLongHeaderType type) { } } -std::string MessageStatusToString(MessageStatus message_status) { +std::string DatagramStatusToString(DatagramStatus message_status) { switch (message_status) { - RETURN_STRING_LITERAL(MESSAGE_STATUS_SUCCESS); - RETURN_STRING_LITERAL(MESSAGE_STATUS_ENCRYPTION_NOT_ESTABLISHED); - RETURN_STRING_LITERAL(MESSAGE_STATUS_UNSUPPORTED); - RETURN_STRING_LITERAL(MESSAGE_STATUS_BLOCKED); - RETURN_STRING_LITERAL(MESSAGE_STATUS_TOO_LARGE); - RETURN_STRING_LITERAL(MESSAGE_STATUS_SETTINGS_NOT_RECEIVED); - RETURN_STRING_LITERAL(MESSAGE_STATUS_INTERNAL_ERROR); + RETURN_STRING_LITERAL(DATAGRAM_STATUS_SUCCESS); + RETURN_STRING_LITERAL(DATAGRAM_STATUS_ENCRYPTION_NOT_ESTABLISHED); + RETURN_STRING_LITERAL(DATAGRAM_STATUS_UNSUPPORTED); + RETURN_STRING_LITERAL(DATAGRAM_STATUS_BLOCKED); + RETURN_STRING_LITERAL(DATAGRAM_STATUS_TOO_LARGE); + RETURN_STRING_LITERAL(DATAGRAM_STATUS_SETTINGS_NOT_RECEIVED); + RETURN_STRING_LITERAL(DATAGRAM_STATUS_INTERNAL_ERROR); default: return absl::StrCat("Unknown(", static_cast(message_status), ")"); } } -std::string MessageResultToString(MessageResult message_result) { - if (message_result.status != MESSAGE_STATUS_SUCCESS) { - return absl::StrCat("{", MessageStatusToString(message_result.status), "}"); +std::string DatagramResultToString(DatagramResult datagram_result) { + if (datagram_result.status != DATAGRAM_STATUS_SUCCESS) { + return absl::StrCat("{", DatagramStatusToString(datagram_result.status), + "}"); } - return absl::StrCat("{MESSAGE_STATUS_SUCCESS,id=", message_result.message_id, - "}"); + return absl::StrCat( + "{DATAGRAM_STATUS_SUCCESS,id=", datagram_result.datagram_id, "}"); } -std::ostream& operator<<(std::ostream& os, const MessageResult& mr) { - os << MessageResultToString(mr); +std::ostream& operator<<(std::ostream& os, const DatagramResult& mr) { + os << DatagramResultToString(mr); return os; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_types.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_types.h index dbe7464774..f6213073ba 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_types.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_types.h @@ -30,7 +30,7 @@ namespace quic { using QuicPacketLength = uint16_t; using QuicControlFrameId = uint32_t; -using QuicMessageId = uint32_t; +using QuicDatagramId = uint32_t; // IMPORTANT: IETF QUIC defines stream IDs and stream counts as being unsigned // 62-bit numbers. However, we have decided to only support up to 2^32-1 streams @@ -272,7 +272,7 @@ enum QuicFrameType : uint8_t { PATH_RESPONSE_FRAME, PATH_CHALLENGE_FRAME, STOP_SENDING_FRAME, - MESSAGE_FRAME, + DATAGRAM_FRAME, NEW_TOKEN_FRAME, RETIRE_CONNECTION_ID_FRAME, ACK_FREQUENCY_FRAME, @@ -340,10 +340,10 @@ enum QuicIetfFrameType : uint64_t { // The MESSAGE frame type has not yet been fully standardized. // QUIC versions starting with 46 and before 99 use 0x20-0x21. // IETF QUIC (v99) uses 0x30-0x31, see draft-pauly-quic-datagram. - IETF_EXTENSION_MESSAGE_NO_LENGTH = 0x20, - IETF_EXTENSION_MESSAGE = 0x21, - IETF_EXTENSION_MESSAGE_NO_LENGTH_V99 = 0x30, - IETF_EXTENSION_MESSAGE_V99 = 0x31, + IETF_EXTENSION_DATAGRAM_NO_LENGTH = 0x20, + IETF_EXTENSION_DATAGRAM = 0x21, + IETF_EXTENSION_DATAGRAM_NO_LENGTH_V99 = 0x30, + IETF_EXTENSION_DATAGRAM_V99 = 0x31, // An QUIC extension frame for sender control of acknowledgement delays IETF_ACK_FREQUENCY = 0xaf, @@ -653,44 +653,45 @@ enum QuicPacketHeaderTypeFlags : uint8_t { FLAGS_LONG_HEADER = 1 << 7, }; -enum MessageStatus { - MESSAGE_STATUS_SUCCESS, - MESSAGE_STATUS_ENCRYPTION_NOT_ESTABLISHED, // Failed to send message because - // encryption is not established - // yet. - MESSAGE_STATUS_UNSUPPORTED, // Failed to send message because MESSAGE frame - // is not supported by the connection. - MESSAGE_STATUS_BLOCKED, // Failed to send message because connection is - // congestion control blocked or underlying socket is - // write blocked. - MESSAGE_STATUS_TOO_LARGE, // Failed to send message because the message is - // too large to fit into a single packet. - MESSAGE_STATUS_SETTINGS_NOT_RECEIVED, // Failed to send message because - // SETTINGS frame has not been received - // yet. - MESSAGE_STATUS_INTERNAL_ERROR, // Failed to send message because connection - // reaches an invalid state. +enum DatagramStatus { + DATAGRAM_STATUS_SUCCESS, + DATAGRAM_STATUS_ENCRYPTION_NOT_ESTABLISHED, // Failed to send message because + // encryption is not established + // yet. + DATAGRAM_STATUS_UNSUPPORTED, // Failed to send message because MESSAGE frame + // is not supported by the connection. + DATAGRAM_STATUS_BLOCKED, // Failed to send message because connection is + // congestion control blocked or underlying socket + // is write blocked. + DATAGRAM_STATUS_TOO_LARGE, // Failed to send message because the message is + // too large to fit into a single packet. + DATAGRAM_STATUS_SETTINGS_NOT_RECEIVED, // Failed to send message because + // SETTINGS frame has not been + // received yet. + DATAGRAM_STATUS_INTERNAL_ERROR, // Failed to send message because connection + // reaches an invalid state. }; -QUICHE_EXPORT std::string MessageStatusToString(MessageStatus message_status); +QUICHE_EXPORT std::string DatagramStatusToString(DatagramStatus message_status); -// Used to return the result of SendMessage calls -struct QUICHE_EXPORT MessageResult { - MessageResult(MessageStatus status, QuicMessageId message_id); +// Used to return the result of SendDatagram calls +struct QUICHE_EXPORT DatagramResult { + DatagramResult(DatagramStatus status, QuicDatagramId datagram_id); - bool operator==(const MessageResult& other) const { - return status == other.status && message_id == other.message_id; + bool operator==(const DatagramResult& other) const { + return status == other.status && datagram_id == other.datagram_id; } QUICHE_EXPORT friend std::ostream& operator<<(std::ostream& os, - const MessageResult& mr); + const DatagramResult& mr); - MessageStatus status; - // Only valid when status is MESSAGE_STATUS_SUCCESS. - QuicMessageId message_id; + DatagramStatus status; + // Only valid when status is DATAGRAM_STATUS_SUCCESS. + QuicDatagramId datagram_id; }; -QUICHE_EXPORT std::string MessageResultToString(MessageResult message_result); +QUICHE_EXPORT std::string DatagramResultToString( + DatagramResult datagram_result); enum WriteStreamDataResult { WRITE_SUCCESS, @@ -876,12 +877,13 @@ struct QUICHE_EXPORT QuicSSLConfig { // As a client, whether ECH GREASE is enabled. If `ech_config_list` is // not empty, this value does nothing. bool ech_grease_enabled = false; - // If non-empty, the TLS Trust Anchor IDs to send in the TLS handshake. (See + // If not nullopt, the TLS Trust Anchor IDs to send in the TLS handshake. (See // https://tlswg.org/tls-trust-anchor-ids/draft-ietf-tls-trust-anchor-ids.html.) // The value should be a series of Trust Anchor IDs in wire format (a series - // of non-empty, 8-bit length-prefixed strings). If empty, the Trust Anchor - // IDs extension will not be sent. - std::string trust_anchor_ids; + // of non-empty, 8-bit length-prefixed strings). The list may be empty to + // signal support for the extension without advertising particular trust + // anchors. If nullopt, the Trust Anchor IDs extension will not be sent. + std::optional trust_anchor_ids; }; QUICHE_EXPORT bool operator==(const QuicSSLConfig& lhs, diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_unacked_packet_map.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_unacked_packet_map.cc index 419982ba0f..80401dd017 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_unacked_packet_map.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/quic_unacked_packet_map.cc @@ -54,7 +54,7 @@ enum QuicFrameTypeBitfield : uint32_t { kPathResponseFrameBitfield = 1 << 16, kPathChallengeFrameBitfield = 1 << 17, kStopSendingFrameBitfield = 1 << 18, - kMessageFrameBitfield = 1 << 19, + kDatagramFrameBitfield = 1 << 19, kNewTokenFrameBitfield = 1 << 20, kRetireConnectionIdFrameBitfield = 1 << 21, kAckFrequencyFrameBitfield = 1 << 22, @@ -102,8 +102,8 @@ QuicFrameTypeBitfield GetFrameTypeBitfield(QuicFrameType type) { return kPathChallengeFrameBitfield; case STOP_SENDING_FRAME: return kStopSendingFrameBitfield; - case MESSAGE_FRAME: - return kMessageFrameBitfield; + case DATAGRAM_FRAME: + return kDatagramFrameBitfield; case NEW_TOKEN_FRAME: return kNewTokenFrameBitfield; case RETIRE_CONNECTION_ID_FRAME: @@ -506,7 +506,8 @@ bool QuicUnackedPacketMap::NotifyFramesAcked(QuicPacketNumber packet_number, const QuicFrames* frames = &info->retransmittable_frames; quiche::SimpleBufferAllocator allocator; std::optional frames_copy; - const bool use_copied_frames = !HasMessageFrame(info->retransmittable_frames); + const bool use_copied_frames = + !HasDatagramFrame(info->retransmittable_frames); if (use_copied_frames) { frames = &frames_copy.emplace( @@ -550,7 +551,8 @@ void QuicUnackedPacketMap::MaybeAggregateAckedStreamFrame( const QuicFrames* frames = &info->retransmittable_frames; quiche::SimpleBufferAllocator allocator; std::optional frames_copy; - const bool use_copied_frames = !HasMessageFrame(info->retransmittable_frames); + const bool use_copied_frames = + !HasDatagramFrame(info->retransmittable_frames); if (use_copied_frames) { frames = &frames_copy.emplace( diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.h index f24da4587e..aeef76e92d 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.h @@ -175,7 +175,7 @@ class QUICHE_EXPORT TlsChloExtractor bool OnPaddingFrame(const QuicPaddingFrame& /*frame*/) override { return true; } - bool OnMessageFrame(const QuicMessageFrame& /*frame*/) override { + bool OnDatagramFrame(const QuicDatagramFrame& /*frame*/) override { return true; } bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& /*frame*/) override { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc index 6dc4ef9f2c..7008e25780 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -44,7 +45,8 @@ TlsClientHandshaker::TlsClientHandshaker( pre_shared_key_(crypto_config->pre_shared_key()), crypto_negotiated_params_(new QuicCryptoNegotiatedParameters), has_application_state_(has_application_state), - tls_connection_(crypto_config->ssl_ctx(), this, session->GetSSLConfig()) { + tls_connection_(crypto_config->ssl_ctx(), this, session->GetSSLConfig()), + ssl_compliance_policy_(crypto_config->ssl_compliance_policy()) { if (crypto_config->tls_signature_algorithms().has_value()) { SSL_set1_sigalgs_list(ssl(), crypto_config->tls_signature_algorithms()->c_str()); @@ -62,6 +64,12 @@ TlsClientHandshaker::TlsClientHandshaker( SSL_set1_group_ids(ssl(), crypto_config->preferred_groups().data(), crypto_config->preferred_groups().size()); } +#if BORINGSSL_API_VERSION >= 37 + if (!crypto_config->client_key_shares().empty()) { + SSL_set1_client_key_shares(ssl(), crypto_config->client_key_shares().data(), + crypto_config->client_key_shares().size()); + } +#endif // Make sure we use the right ALPS codepoint. SSL_set_alps_use_new_codepoint(ssl(), @@ -89,10 +97,8 @@ bool TlsClientHandshaker::CryptoConnect() { // TODO(b/193650832) Add SetFromConfig to QUIC handshakers and remove reliance // on session pointer. -#if BORINGSSL_API_VERSION >= 16 // Ask BoringSSL to randomize the order of TLS extensions. SSL_set_permute_extensions(ssl(), true); -#endif // BORINGSSL_API_VERSION // Set the SNI to send, if any. SSL_set_connect_state(ssl()); @@ -154,21 +160,22 @@ bool TlsClientHandshaker::CryptoConnect() { // Configure TLS Trust Anchor IDs // (https://tlswg.org/tls-trust-anchor-ids/draft-ietf-tls-trust-anchor-ids.html), // if set. - if (GetQuicReloadableFlag(enable_tls_trust_anchor_ids)) { - QUIC_RELOADABLE_FLAG_COUNT_N(enable_tls_trust_anchor_ids, 2, 2); -#if defined(BORINGSSL_API_VERSION) && BORINGSSL_API_VERSION >= 36 - if (!tls_connection_.ssl_config().trust_anchor_ids.empty()) { - if (!SSL_set1_requested_trust_anchors( - ssl(), - reinterpret_cast( - tls_connection_.ssl_config().trust_anchor_ids.data()), - tls_connection_.ssl_config().trust_anchor_ids.size())) { - CloseConnection(QUIC_HANDSHAKE_FAILED, - "Client failed to set TLS Trust Anchor IDs"); - return false; - } + if (tls_connection_.ssl_config().trust_anchor_ids.has_value()) { + if (!SSL_set1_requested_trust_anchors( + ssl(), + reinterpret_cast( + tls_connection_.ssl_config().trust_anchor_ids->data()), + tls_connection_.ssl_config().trust_anchor_ids->size())) { + CloseConnection(QUIC_HANDSHAKE_FAILED, + "Client failed to set TLS Trust Anchor IDs"); + return false; } -#endif + } + + // The compliance policy must be the last thing configured before the + // handshake in order to have defined behavior. + if (ssl_compliance_policy_.has_value()) { + SSL_set_compliance_policy(ssl(), ssl_compliance_policy_.value()); } // Start the handshake. @@ -409,6 +416,11 @@ bool TlsClientHandshaker::MatchedTrustAnchorIdForTesting() const { return matched_trust_anchor_id_; } +std::optional +TlsClientHandshaker::SslCompliancePolicyForTesting() const { + return ssl_compliance_policy_; +} + bool TlsClientHandshaker::encryption_established() const { return encryption_established_; } @@ -527,9 +539,7 @@ QuicAsyncStatus TlsClientHandshaker::VerifyCertChain( const std::vector& certs, std::string* error_details, std::unique_ptr* details, uint8_t* out_alert, std::unique_ptr callback) { -#if defined(BORINGSSL_API_VERSION) && BORINGSSL_API_VERSION >= 36 matched_trust_anchor_id_ = SSL_peer_matched_trust_anchor(ssl()); -#endif const uint8_t* ocsp_response_raw; size_t ocsp_response_len; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.h index 6aab270825..07b0966777 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.h @@ -7,6 +7,7 @@ #include #include +#include #include #include "absl/strings/string_view.h" @@ -53,6 +54,8 @@ class QUICHE_EXPORT TlsClientHandshaker bool ExportKeyingMaterial(absl::string_view label, absl::string_view context, size_t result_len, std::string* result) override; bool MatchedTrustAnchorIdForTesting() const override; + std::optional SslCompliancePolicyForTesting() + const override; // From QuicCryptoClientStream::HandshakerInterface and TlsHandshaker bool encryption_established() const override; @@ -174,6 +177,11 @@ class QUICHE_EXPORT TlsClientHandshaker // certificate which matched a Trust Anchor ID sent by the client. This value // is needed only for testing. bool matched_trust_anchor_id_ = false; + + // If not nullopt, the SSL compliance policy to use. See documentation for + // ssl_compliance_policy_t values in BoringSSL: + // https://commondatastorage.googleapis.com/chromium-boringssl-docs/ssl.h.html#Compliance-policy-configurations + std::optional ssl_compliance_policy_ = std::nullopt; }; } // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.cc index f59f7bff04..e8ebdde5f5 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.cc @@ -14,6 +14,7 @@ #include #include +#include "absl/base/nullability.h" #include "absl/status/status.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" @@ -54,6 +55,8 @@ #include "quiche/quic/platform/api/quic_logging.h" #include "quiche/quic/platform/api/quic_server_stats.h" #include "quiche/quic/platform/api/quic_socket_address.h" +#include "quiche/common/platform/api/quiche_logging.h" +#include "quiche/common/platform/api/quiche_reference_counted.h" #define RECORD_LATENCY_IN_US(stat_name, latency, comment) \ do { \ @@ -73,8 +76,12 @@ uint16_t kDefaultPort = 443; } // namespace TlsServerHandshaker::DefaultProofSourceHandle::DefaultProofSourceHandle( - TlsServerHandshaker* handshaker, ProofSource* proof_source) - : handshaker_(handshaker), proof_source_(proof_source) {} + TlsServerHandshaker* absl_nonnull handshaker, + ProofSource* absl_nonnull proof_source) + : handshaker_(handshaker), proof_source_(proof_source) { + QUICHE_DCHECK(handshaker_); + QUICHE_DCHECK(proof_source_); +} TlsServerHandshaker::DefaultProofSourceHandle::~DefaultProofSourceHandle() { CloseHandle(); @@ -213,6 +220,7 @@ TlsServerHandshaker::TlsServerHandshaker( : TlsHandshaker(this, session), QuicCryptoServerStreamBase(session), proof_source_(crypto_config->proof_source()), + proof_verifier_(crypto_config->proof_verifier()), pre_shared_key_(crypto_config->pre_shared_key()), crypto_negotiated_params_(new QuicCryptoNegotiatedParameters), tls_connection_(crypto_config->ssl_ctx(), this, session->GetSSLConfig()), @@ -290,6 +298,7 @@ void TlsServerHandshaker::InfoCallback(int type, int value) { std::unique_ptr TlsServerHandshaker::MaybeCreateProofSourceHandle() { + QUICHE_DCHECK(proof_source_); return std::make_unique(this, proof_source_); } @@ -477,10 +486,9 @@ bool TlsServerHandshaker::ProcessTransportParameters( size_t params_bytes_len; // Make sure we use the right TLS extension codepoint. - uint16_t extension_type = TLSEXT_TYPE_quic_transport_parameters_standard; - if (session()->version().UsesLegacyTlsExtension()) { - extension_type = TLSEXT_TYPE_quic_transport_parameters_legacy; - } + uint16_t extension_type = session()->version().UsesLegacyTlsExtension() + ? TLSEXT_TYPE_quic_transport_parameters_legacy + : TLSEXT_TYPE_quic_transport_parameters; // When using early select cert callback, SSL_get_peer_quic_transport_params // can not be used to retrieve the client's transport parameters, but we can // use SSL_early_callback_ctx_extension_get to do that. @@ -675,15 +683,22 @@ void TlsServerHandshaker::FinishHandshake() { // appropriate time. } +// VerifyCertChain is called to verify the client's certificate chain. If the +// proof verifier is not set, the method will assume the certificate chain is +// valid and return QUIC_SUCCESS. QuicAsyncStatus TlsServerHandshaker::VerifyCertChain( - const std::vector& /*certs*/, std::string* /*error_details*/, - std::unique_ptr* /*details*/, uint8_t* /*out_alert*/, - std::unique_ptr /*callback*/) { - QUIC_DVLOG(1) << "VerifyCertChain returning success"; + const std::vector& certs, std::string* error_details, + std::unique_ptr* details, uint8_t* out_alert, + std::unique_ptr callback) { + if (proof_verifier_ == nullptr) { + QUIC_DVLOG(1) << "Proof verifier is not set, skipping cert verification"; + return QUIC_SUCCESS; + } - // No real verification here. A subclass can override this function to verify - // the client cert if needed. - return QUIC_SUCCESS; + return proof_verifier_->VerifyCertChain( + /*hostname=*/"", /*port=*/0, certs, /*ocsp_response=*/"", /*cert_sct=*/"", + /*context=*/nullptr, error_details, details, out_alert, + std::move(callback)); } void TlsServerHandshaker::OnProofVerifyDetailsAvailable( @@ -928,7 +943,6 @@ ssl_select_cert_result_t TlsServerHandshaker::EarlySelectCertCallback( int use_alps_new_codepoint = 0; -#if BORINGSSL_API_VERSION >= 27 alps_new_codepoint_received_ = SSL_early_callback_ctx_extension_get( client_hello, TLSEXT_TYPE_application_settings, &unused_extension_bytes, &unused_extension_len); @@ -939,7 +953,6 @@ ssl_select_cert_result_t TlsServerHandshaker::EarlySelectCertCallback( } QUIC_DLOG(INFO) << "ALPS use new codepoint: " << use_alps_new_codepoint; SSL_set_alps_use_new_codepoint(ssl(), use_alps_new_codepoint); -#endif // BORINGSSL_API_VERSION if (use_alps_new_codepoint == 0) { QUIC_CODE_COUNT(quic_gfe_alps_use_old_codepoint); @@ -960,8 +973,18 @@ ssl_select_cert_result_t TlsServerHandshaker::EarlySelectCertCallback( crypto_negotiated_params_->sni = QuicHostnameUtils::NormalizeHostname(hostname); if (!ValidateHostname(hostname)) { + if (GetQuicReloadableFlag(quic_delay_connection_close_on_invalid_sni)) { + std::string error_details; + const bool success = + ProcessTransportParameters(client_hello, &error_details); + if (success) { + QUIC_CODE_COUNT(quic_tls_server_invalid_hostname_but_tp_succeeded); + } else { + QUIC_CODE_COUNT(quic_tls_server_invalid_hostname_and_tp_failed); + } + } CloseConnection(QUIC_HANDSHAKE_FAILED_INVALID_HOSTNAME, - "invalid hostname"); + absl::StrCat("Invalid SNI provided: ", hostname)); return ssl_select_cert_error; } if (hostname != crypto_negotiated_params_->sni) { @@ -1097,7 +1120,7 @@ void TlsServerHandshaker::OnSelectCertificateDone( if (auto* local_config = std::get_if(&ssl_config); local_config != nullptr) { if (local_config->chain && !local_config->chain->certs.empty()) { - tls_connection_.SetCertChain( + tls_connection_.AddCertChain( local_config->chain->ToCryptoBuffers().value, local_config->chain->trust_anchor_id); select_cert_status_ = QUIC_SUCCESS; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.h index a2b2bd2e36..806fd20e0f 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.h @@ -13,6 +13,7 @@ #include #include +#include "absl/base/nullability.h" #include "absl/strings/string_view.h" #include "absl/types/span.h" #include "openssl/base.h" @@ -39,6 +40,8 @@ #include "quiche/quic/core/quic_types.h" #include "quiche/quic/core/tls_handshaker.h" #include "quiche/quic/platform/api/quic_socket_address.h" +#include "quiche/common/platform/api/quiche_export.h" +#include "quiche/common/platform/api/quiche_reference_counted.h" namespace quic { @@ -239,8 +242,8 @@ class QUICHE_EXPORT TlsServerHandshaker : public TlsHandshaker, // source. class QUICHE_EXPORT DefaultProofSourceHandle : public ProofSourceHandle { public: - DefaultProofSourceHandle(TlsServerHandshaker* handshaker, - ProofSource* proof_source); + DefaultProofSourceHandle(TlsServerHandshaker* absl_nonnull handshaker, + ProofSource* absl_nonnull proof_source); ~DefaultProofSourceHandle() override; @@ -270,7 +273,9 @@ class QUICHE_EXPORT TlsServerHandshaker : public TlsHandshaker, size_t max_signature_size) override; protected: - ProofSourceHandleCallback* callback() override { return handshaker_; } + ProofSourceHandleCallback* absl_nullable callback() override { + return handshaker_; + } private: class QUICHE_EXPORT DefaultSignatureCallback @@ -308,9 +313,9 @@ class QUICHE_EXPORT TlsServerHandshaker : public TlsHandshaker, }; // Not nullptr on construction. Set to nullptr when cancelled. - TlsServerHandshaker* handshaker_; // Not owned. - ProofSource* proof_source_; // Not owned. - DefaultSignatureCallback* signature_callback_ = nullptr; + TlsServerHandshaker* absl_nullable handshaker_; // Not owned. + ProofSource* absl_nullable proof_source_; // Not owned. + DefaultSignatureCallback* absl_nullable signature_callback_ = nullptr; }; struct QUICHE_EXPORT SetTransportParametersResult { @@ -348,7 +353,12 @@ class QUICHE_EXPORT TlsServerHandshaker : public TlsHandshaker, } std::unique_ptr proof_source_handle_; - ProofSource* proof_source_; + ProofSource* absl_nullable proof_source_; + + // proof_verifier_ is an optional object that can verify a client's + // certificate chain. If this is null, then client certificates will always be + // considered valid. + ProofVerifier* absl_nullable proof_verifier_; // State to handle potentially asynchronous session ticket decryption. // |ticket_decryption_callback_| points to the non-owned callback that was diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/web_transport_interface.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/web_transport_interface.h index d3a6a12922..a47f2393f9 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/web_transport_interface.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/core/web_transport_interface.h @@ -22,31 +22,31 @@ using WebTransportStream = webtransport::Stream; using WebTransportVisitor = webtransport::SessionVisitor; using WebTransportSession = webtransport::Session; -inline webtransport::DatagramStatus MessageStatusToWebTransportStatus( - MessageStatus status) { +inline webtransport::DatagramStatus DatagramStatusToWebTransportStatus( + DatagramStatus status) { switch (status) { - case MESSAGE_STATUS_SUCCESS: + case DATAGRAM_STATUS_SUCCESS: return webtransport::DatagramStatus( webtransport::DatagramStatusCode::kSuccess, ""); - case MESSAGE_STATUS_BLOCKED: + case DATAGRAM_STATUS_BLOCKED: return webtransport::DatagramStatus( webtransport::DatagramStatusCode::kBlocked, "QUIC connection write-blocked"); - case MESSAGE_STATUS_TOO_LARGE: + case DATAGRAM_STATUS_TOO_LARGE: return webtransport::DatagramStatus( webtransport::DatagramStatusCode::kTooBig, "Datagram payload exceeded maximum allowed size"); - case MESSAGE_STATUS_ENCRYPTION_NOT_ESTABLISHED: - case MESSAGE_STATUS_INTERNAL_ERROR: - case MESSAGE_STATUS_UNSUPPORTED: - case MESSAGE_STATUS_SETTINGS_NOT_RECEIVED: + case DATAGRAM_STATUS_ENCRYPTION_NOT_ESTABLISHED: + case DATAGRAM_STATUS_INTERNAL_ERROR: + case DATAGRAM_STATUS_UNSUPPORTED: + case DATAGRAM_STATUS_SETTINGS_NOT_RECEIVED: return webtransport::DatagramStatus( webtransport::DatagramStatusCode::kInternalError, - absl::StrCat("Internal error: ", MessageStatusToString(status))); + absl::StrCat("Internal error: ", DatagramStatusToString(status))); default: return webtransport::DatagramStatus( webtransport::DatagramStatusCode::kInternalError, - absl::StrCat("Unknown status: ", MessageStatusToString(status))); + absl::StrCat("Unknown status: ", DatagramStatusToString(status))); } } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client.cc index da6611e76a..af142277a5 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client.cc @@ -11,6 +11,7 @@ #include "absl/memory/memory.h" #include "absl/strings/str_cat.h" +#include "quiche/quic/core/crypto/client_proof_source.h" #include "quiche/quic/core/crypto/proof_verifier.h" #include "quiche/quic/core/io/quic_event_loop.h" #include "quiche/quic/core/quic_connection.h" @@ -91,7 +92,8 @@ std::string MasqueClient::authority() const { // static std::unique_ptr MasqueClient::Create( const std::string& uri_template, MasqueMode masque_mode, - QuicEventLoop* event_loop, std::unique_ptr proof_verifier) { + QuicEventLoop* event_loop, std::unique_ptr proof_verifier, + std::unique_ptr proof_source) { QuicUrl url(uri_template); std::string host = url.host(); if (host.empty()) { @@ -118,6 +120,9 @@ std::unique_ptr MasqueClient::Create( QUIC_LOG(ERROR) << "Failed to create masque_client"; return nullptr; } + if (proof_source != nullptr) { + masque_client->crypto_config()->set_proof_source(std::move(proof_source)); + } if (!masque_client->Prepare(kDefaultMaxPacketSizeForTunnels)) { QUIC_LOG(ERROR) << "Failed to prepare MASQUE client to " << host << ":" << port; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client.h index c0f5b7654b..5b8e0c1232 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client.h @@ -8,6 +8,7 @@ #include #include +#include "quiche/quic/core/crypto/client_proof_source.h" #include "quiche/quic/core/crypto/proof_verifier.h" #include "quiche/quic/core/io/quic_event_loop.h" #include "quiche/quic/core/quic_connection.h" @@ -32,7 +33,8 @@ class QUIC_NO_EXPORT MasqueClient : public QuicDefaultClient, // lookup. static std::unique_ptr Create( const std::string& uri_template, MasqueMode masque_mode, - QuicEventLoop* event_loop, std::unique_ptr proof_verifier); + QuicEventLoop* event_loop, std::unique_ptr proof_verifier, + std::unique_ptr proof_source); // From QuicClient. std::unique_ptr CreateQuicClientSession( diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client_bin.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client_bin.cc index 0bd8eecd8e..c7a4b3d166 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client_bin.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client_bin.cc @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -21,6 +22,8 @@ #include "absl/strings/str_split.h" #include "absl/strings/string_view.h" #include "openssl/curve25519.h" +#include "quiche/quic/core/crypto/certificate_view.h" +#include "quiche/quic/core/crypto/client_proof_source.h" #include "quiche/quic/core/crypto/proof_verifier.h" #include "quiche/quic/core/http/quic_spdy_client_stream.h" #include "quiche/quic/core/io/quic_default_event_loop.h" @@ -42,6 +45,7 @@ #include "quiche/common/platform/api/quiche_command_line_flags.h" #include "quiche/common/platform/api/quiche_googleurl.h" #include "quiche/common/platform/api/quiche_logging.h" +#include "quiche/common/platform/api/quiche_reference_counted.h" #include "quiche/common/platform/api/quiche_system_event_loop.h" DEFINE_QUICHE_COMMAND_LINE_FLAG( @@ -89,6 +93,14 @@ DEFINE_QUICHE_COMMAND_LINE_FLAG( "If set to true, no URLs need to be specified and instead a TAP device " "is brought up for a MASQUE CONNECT-ETHERNET session."); +DEFINE_QUICHE_COMMAND_LINE_FLAG( + std::string, client_cert_file, "", + "Path to the PEM-encoded client certificate chain."); + +DEFINE_QUICHE_COMMAND_LINE_FLAG( + std::string, client_cert_key_file, "", + "Path to the PEM/PKCS8-encoded client certificate private key."); + namespace quic { namespace { @@ -246,6 +258,43 @@ class MasqueTapSession int fd_ = -1; }; +std::unique_ptr CreateClientProofSource( + const std::string& client_cert_file, + const std::string& client_cert_key_file) { + if (client_cert_file.empty() || client_cert_key_file.empty()) { + std::cerr << "Both client cert and client cert key need to be set." + << std::endl; + return nullptr; + } + std::ifstream cert_stream(client_cert_file, std::ios::binary); + std::vector certs = + CertificateView::LoadPemFromStream(&cert_stream); + if (certs.empty()) { + std::cerr << "Failed to load client certs." << std::endl; + return nullptr; + } + + std::ifstream key_stream(client_cert_key_file, std::ios::binary); + std::unique_ptr private_key = + CertificatePrivateKey::LoadPemFromStream(&key_stream); + if (private_key == nullptr) { + std::cerr << "Failed to load client cert key." << std::endl; + return nullptr; + } + + auto proof_source = std::make_unique(); + if (!proof_source->AddCertAndKey( + {"*"}, + quiche::QuicheReferenceCountedPointer( + new ClientProofSource::Chain(certs)), + std::move(*private_key))) { + std::cerr << "Failed to add client cert and key." << std::endl; + return nullptr; + } + + return proof_source; +} + int RunMasqueClient(int argc, char* argv[]) { const char* usage = "Usage: masque_client [options] ..\n" @@ -384,6 +433,10 @@ int RunMasqueClient(int argc, char* argv[]) { } const bool dns_on_client = quiche::GetQuicheCommandLineFlag(FLAGS_dns_on_client); + std::string client_cert_file = + quiche::GetQuicheCommandLineFlag(FLAGS_client_cert_file); + std::string client_cert_key_file = + quiche::GetQuicheCommandLineFlag(FLAGS_client_cert_key_file); std::unique_ptr event_loop = GetDefaultEventLoop()->Create(QuicDefaultClock::Get()); @@ -411,15 +464,26 @@ int RunMasqueClient(int argc, char* argv[]) { if (masque_clients.empty()) { std::string host = uri_template.substr(parsed_uri_template.host.begin, parsed_uri_template.host.len); + std::unique_ptr proof_verifier; if (disable_certificate_verification) { proof_verifier = std::make_unique(); } else { proof_verifier = CreateDefaultProofVerifier(host); } - masque_client = - MasqueClient::Create(uri_template, masque_mode, event_loop.get(), - std::move(proof_verifier)); + + std::unique_ptr proof_source; + if (!client_cert_file.empty() || !client_cert_key_file.empty()) { + proof_source = + CreateClientProofSource(client_cert_file, client_cert_key_file); + if (proof_source == nullptr) { + return 1; + } + } + + masque_client = MasqueClient::Create( + uri_template, masque_mode, event_loop.get(), + std::move(proof_verifier), std::move(proof_source)); } else { masque_client = tools::CreateAndConnectMasqueEncapsulatedClient( diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client_session.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client_session.cc index dbef24e6d1..98f3bdd62d 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client_session.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client_session.cc @@ -87,13 +87,13 @@ MasqueClientSession::MasqueClientSession( crypto_config), owner_(owner) {} -void MasqueClientSession::OnMessageAcked(QuicMessageId message_id, - QuicTime /*receive_timestamp*/) { - QUIC_DVLOG(1) << "Received ack for DATAGRAM frame " << message_id; +void MasqueClientSession::OnDatagramAcked(QuicDatagramId datagram_id, + QuicTime /*receive_timestamp*/) { + QUIC_DVLOG(1) << "Received ack for DATAGRAM frame " << datagram_id; } -void MasqueClientSession::OnMessageLost(QuicMessageId message_id) { - QUIC_DVLOG(1) << "We believe DATAGRAM frame " << message_id << " was lost"; +void MasqueClientSession::OnDatagramLost(QuicDatagramId datagram_id) { + QUIC_DVLOG(1) << "We believe DATAGRAM frame " << datagram_id << " was lost"; } MasqueClientSession::ConnectUdpClientState* @@ -354,13 +354,13 @@ void MasqueClientSession::SendIpPacket( QUIC_BUG(IP packet write fail) << "Failed to write CONNECT-IP packet"; return; } - MessageStatus message_status = + DatagramStatus message_status = SendHttp3Datagram(connect_ip->stream()->id(), http_payload); QUIC_DVLOG(1) << "Sent encapsulated IP packet of length " << packet.size() << " with stream ID " << connect_ip->stream()->id() << " and got message status " - << MessageStatusToString(message_status); + << DatagramStatusToString(message_status); } void MasqueClientSession::SendEthernetFrame( @@ -387,13 +387,13 @@ void MasqueClientSession::SendEthernetFrame( QUIC_BUG(IP packet write fail) << "Failed to write CONNECT-ETHERNET frame"; return; } - MessageStatus message_status = + DatagramStatus message_status = SendHttp3Datagram(connect_ethernet->stream()->id(), http_payload); QUIC_DVLOG(1) << "Sent encapsulated Ethernet frame of length " << frame.size() << " with stream ID " << connect_ethernet->stream()->id() << " and got message status " - << MessageStatusToString(message_status); + << DatagramStatusToString(message_status); } void MasqueClientSession::SendConnectUdpBindPacket( @@ -433,13 +433,13 @@ void MasqueClientSession::SendPacket( http_payload.resize(1 + packet.size()); http_payload[0] = 0; memcpy(&http_payload[1], packet.data(), packet.size()); - MessageStatus message_status = + DatagramStatus message_status = SendHttp3Datagram(connect_udp->stream()->id(), http_payload); QUIC_DVLOG(1) << "Sent packet to " << target_server_address << " compressed with stream ID " << connect_udp->stream()->id() << " and got message status " - << MessageStatusToString(message_status); + << DatagramStatusToString(message_status); QUIC_DVLOG(2) << "Contents of outgoing HTTP Datagram of length " << http_payload.size() << ":" << std::endl << quiche::QuicheTextUtils::HexDump(http_payload); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client_session.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client_session.h index 6c6fe36585..acf1f9f3f6 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client_session.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_client_session.h @@ -128,9 +128,9 @@ class QUIC_NO_EXPORT MasqueClientSession : public QuicSpdyClientSession, MasqueClientSession& operator=(const MasqueClientSession&) = delete; // From QuicSession. - void OnMessageAcked(QuicMessageId message_id, - QuicTime receive_timestamp) override; - void OnMessageLost(QuicMessageId message_id) override; + void OnDatagramAcked(QuicDatagramId datagram_id, + QuicTime receive_timestamp) override; + void OnDatagramLost(QuicDatagramId datagram_id) override; void OnConnectionClosed(const QuicConnectionCloseFrame& frame, ConnectionCloseSource source) override; void OnStreamClosed(QuicStreamId stream_id) override; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_encapsulated_client.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_encapsulated_client.cc index f68f92e29c..addffd9a69 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_encapsulated_client.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_encapsulated_client.cc @@ -341,7 +341,7 @@ QuicByteCount MaxPacketSizeForEncapsulatedConnections( MasqueClient* underlying_masque_client) { QuicByteCount max_packet_size = underlying_masque_client->masque_client_session() - ->GetGuaranteedLargestMessagePayload() - + ->GetGuaranteedLargestDatagramPayload() - /* max length of quarter stream ID */ sizeof(QuicStreamId) - /* context ID set to zero */ sizeof(uint8_t); QUICHE_CHECK_GE(max_packet_size, 1200u) diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_ohttp_client_bin.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_ohttp_client_bin.cc index f7185de821..9fa78682d8 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_ohttp_client_bin.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_ohttp_client_bin.cc @@ -129,7 +129,8 @@ class MasqueOhttpClient : public MasqueConnectionPool::Visitor { BinaryHttpResponse::Create(ohttp_response->GetPlaintextData()); if (binary_response.ok()) { QUICHE_LOG(INFO) << "Successfully decoded OHTTP response:"; - for (const quiche::BinaryHttpMessage::Field &field : + QUICHE_LOG(INFO) << "Status: " << binary_response->status_code(); + for (const quiche::BinaryHttpMessage::Field& field : binary_response->GetHeaderFields()) { QUICHE_LOG(INFO) << field.name << ": " << field.value; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_server.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_server.cc index 96d47aa983..7741789eea 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_server.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_server.cc @@ -19,8 +19,8 @@ namespace quic { MasqueServer::MasqueServer(MasqueMode masque_mode, MasqueServerBackend* masque_server_backend) - : QuicServer(CreateDefaultProofSource(), masque_server_backend, - MasqueSupportedVersions()), + : QuicServer(CreateDefaultProofSource(), /*proof_verifier=*/nullptr, + masque_server_backend, MasqueSupportedVersions()), masque_mode_(masque_mode), masque_server_backend_(masque_server_backend) {} diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.cc index d42df91c2f..643484cc3e 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.cc @@ -172,13 +172,13 @@ MasqueServerSession::MasqueServerSession( (void)masque_mode_; } -void MasqueServerSession::OnMessageAcked(QuicMessageId message_id, - QuicTime /*receive_timestamp*/) { - QUIC_DVLOG(1) << "Received ack for DATAGRAM frame " << message_id; +void MasqueServerSession::OnDatagramAcked(QuicDatagramId datagram_id, + QuicTime /*receive_timestamp*/) { + QUIC_DVLOG(1) << "Received ack for DATAGRAM frame " << datagram_id; } -void MasqueServerSession::OnMessageLost(QuicMessageId message_id) { - QUIC_DVLOG(1) << "We believe DATAGRAM frame " << message_id << " was lost"; +void MasqueServerSession::OnDatagramLost(QuicDatagramId datagram_id) { + QUIC_DVLOG(1) << "We believe DATAGRAM frame " << datagram_id << " was lost"; } void MasqueServerSession::OnConnectionClosed( @@ -860,12 +860,12 @@ bool MasqueServerSession::HandleConnectUdpSocketEvent( absl::string_view message( udp_payload_read_pos - final_header_length, read_result.packet_buffer.buffer_len + final_header_length); - MessageStatus message_status = it->stream()->SendHttp3Datagram(message); + DatagramStatus message_status = it->stream()->SendHttp3Datagram(message); QUIC_DVLOG(1) << "Sent UDP packet from " << expected_target_server_address << " of length " << read_result.packet_buffer.buffer_len << " with stream ID " << it->stream()->id() << " and got message status " - << MessageStatusToString(message_status) + << DatagramStatusToString(message_status) << " message size with header: " << message.size(); QUIC_DVLOG(2) << "Contents of outgoing HTTP Datagram of length " << message.size() << ":" << std::endl @@ -892,12 +892,12 @@ bool MasqueServerSession::HandleConnectIpSocketEvent( if (read_size < 0) { break; } - MessageStatus message_status = it->stream()->SendHttp3Datagram( + DatagramStatus message_status = it->stream()->SendHttp3Datagram( absl::string_view(datagram, 1 + read_size)); QUIC_DVLOG(1) << "Encapsulated IP packet of length " << read_size << " with stream ID " << it->stream()->id() << " and got message status " - << MessageStatusToString(message_status); + << DatagramStatusToString(message_status); } return true; } @@ -921,12 +921,12 @@ bool MasqueServerSession::HandleConnectEthernetSocketEvent( if (read_size < 0) { break; } - MessageStatus message_status = it->stream()->SendHttp3Datagram( + DatagramStatus message_status = it->stream()->SendHttp3Datagram( absl::string_view(datagram, 1 + read_size)); QUIC_DVLOG(1) << "Encapsulated Ethernet frame of length " << read_size << " with stream ID " << it->stream()->id() << " and got message status " - << MessageStatusToString(message_status); + << DatagramStatusToString(message_status); } return true; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.h index 1091fdb96c..d6b79c39b5 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.h @@ -65,9 +65,9 @@ class QUIC_NO_EXPORT MasqueServerSession MasqueServerSession& operator=(const MasqueServerSession&) = delete; // From QuicSession. - void OnMessageAcked(QuicMessageId message_id, - QuicTime receive_timestamp) override; - void OnMessageLost(QuicMessageId message_id) override; + void OnDatagramAcked(QuicDatagramId datagram_id, + QuicTime receive_timestamp) override; + void OnDatagramLost(QuicDatagramId datagram_id) override; void OnConnectionClosed(const QuicConnectionCloseFrame& frame, ConnectionCloseSource source) override; void OnStreamClosed(QuicStreamId stream_id) override; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_cached_object.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_cached_object.h deleted file mode 100644 index ef5566a33a..0000000000 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_cached_object.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2024 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef QUICHE_QUIC_MOQT_MOQT_CACHED_OBJECT_H_ -#define QUICHE_QUIC_MOQT_MOQT_CACHED_OBJECT_H_ - -#include - -#include "quiche/quic/moqt/moqt_publisher.h" -#include "quiche/common/quiche_mem_slice.h" - -namespace moqt { - -// CachedObject is a version of PublishedObject with a reference counted -// payload. -struct CachedObject { - PublishedObjectMetadata metadata; - std::shared_ptr payload; - bool fin_after_this; // This is the last object before FIN. -}; - -// Transforms a CachedObject into a PublishedObject. -PublishedObject CachedObjectToPublishedObject(const CachedObject& object); - -} // namespace moqt - -#endif // QUICHE_QUIC_MOQT_MOQT_CACHED_OBJECT_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_failed_fetch.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_failed_fetch.h deleted file mode 100644 index c9718974ea..0000000000 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_failed_fetch.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2024 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef QUICHE_QUIC_MOQT_MOQT_FAILED_FETCH_H_ -#define QUICHE_QUIC_MOQT_MOQT_FAILED_FETCH_H_ - -#include - -#include "absl/status/status.h" -#include "quiche/quic/moqt/moqt_messages.h" -#include "quiche/quic/moqt/moqt_publisher.h" - -namespace moqt { - -// A fetch that starts out in the failed state. -class MoqtFailedFetch : public MoqtFetchTask { - public: - explicit MoqtFailedFetch(absl::Status status) : status_(std::move(status)) {} - - GetNextObjectResult GetNextObject(PublishedObject&) override { - return kError; - } - absl::Status GetStatus() override { return status_; } - void SetObjectAvailableCallback( - ObjectsAvailableCallback /*callback*/) override {} - void SetFetchResponseCallback(FetchResponseCallback callback) { - MoqtFetchError error; - error.request_id = 0; - error.error_code = StatusToRequestErrorCode(status_); - error.error_reason = status_.message(); - std::move(callback)(error); - } - - private: - absl::Status status_; -}; - -} // namespace moqt - -#endif // QUICHE_QUIC_MOQT_MOQT_FAILED_FETCH_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_fetch_task.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_fetch_task.h new file mode 100644 index 0000000000..b77068465e --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_fetch_task.h @@ -0,0 +1,90 @@ +// Copyright 2024 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_MOQT_MOQT_FETCH_TASK_H_ +#define QUICHE_QUIC_MOQT_MOQT_FETCH_TASK_H_ + +#include +#include + +#include "absl/status/status.h" +#include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" +#include "quiche/common/quiche_callbacks.h" + +namespace moqt { + +// A handle representing a fetch in progress. The fetch in question can be +// cancelled by deleting the object. +class MoqtFetchTask { + public: + using ObjectsAvailableCallback = quiche::MultiUseCallback; + // The request_id field will be ignored. + using FetchResponseCallback = quiche::SingleUseCallback)>; + + virtual ~MoqtFetchTask() = default; + + // Potential results of a GetNextObject() call. + enum GetNextObjectResult { + // The next object is available, and is placed into the reference specified + // by the caller. + kSuccess, + // The next object is not yet available (equivalent of EAGAIN). + kPending, + // The end of fetch has been reached. + kEof, + // The fetch has failed; the error is available via GetStatus(). + kError, + }; + + // Returns the next object received via the fetch, if available. MUST NOT + // return an object with status kObjectDoesNotExist. + virtual GetNextObjectResult GetNextObject(PublishedObject& output) = 0; + + // Sets the callback that is called when GetNextObject() has previously + // returned kPending, but now a new object (or potentially an error or an + // end-of-fetch) is available. The application is responsible for calling + // GetNextObject() until it gets kPending; no further callback will occur + // until then. + // If an object is available immediately, the callback will be called + // immediately. + virtual void SetObjectAvailableCallback( + ObjectsAvailableCallback callback) = 0; + // One of these callbacks is called as soon as the data publisher has enough + // information for either FETCH_OK or FETCH_ERROR. + // If the appropriate response is already available, the callback will be + // called immediately. + virtual void SetFetchResponseCallback(FetchResponseCallback callback) = 0; + + // Returns the error if fetch has completely failed, and OK otherwise. + virtual absl::Status GetStatus() = 0; +}; + +// A fetch that starts out in the failed state. +class MoqtFailedFetch : public MoqtFetchTask { + public: + explicit MoqtFailedFetch(absl::Status status) : status_(std::move(status)) {} + + GetNextObjectResult GetNextObject(PublishedObject&) override { + return kError; + } + absl::Status GetStatus() override { return status_; } + void SetObjectAvailableCallback( + ObjectsAvailableCallback /*callback*/) override {} + void SetFetchResponseCallback(FetchResponseCallback callback) { + MoqtFetchError error; + error.request_id = 0; + error.error_code = StatusToRequestErrorCode(status_); + error.error_reason = status_.message(); + std::move(callback)(error); + } + + private: + absl::Status status_; +}; + +} // namespace moqt + +#endif // QUICHE_QUIC_MOQT_MOQT_FETCH_TASK_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_framer.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_framer.cc index 6f0d6abd16..6c3260c875 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_framer.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_framer.cc @@ -220,7 +220,10 @@ void SessionParametersToKeyValuePairList( if (!parameters.using_webtrans && parameters.perspective == quic::Perspective::IS_CLIENT) { out.insert(SetupParameter::kPath, parameters.path); + out.insert(SetupParameter::kAuthority, parameters.authority); } + out.insert(SetupParameter::kMoqtImplementation, + parameters.moqt_implementation); if (parameters.max_request_id > 0) { out.insert(SetupParameter::kMaxRequestId, parameters.max_request_id); } @@ -270,12 +273,13 @@ void VersionSpecificParametersToKeyValuePairList( quiche::QuicheBuffer MoqtFramer::SerializeObjectHeader( const MoqtObject& message, MoqtDataStreamType message_type, - bool is_first_in_stream) { + std::optional previous_object_in_stream) { if (!ValidateObjectMetadata(message, /*is_datagram=*/false)) { QUICHE_BUG(QUICHE_BUG_serialize_object_header_01) << "Object metadata is invalid"; return quiche::QuicheBuffer(); } + bool is_first_in_stream = !previous_object_in_stream.has_value(); // Not all fields will be written to the wire. Keep optional ones in // std::optional so that they can be excluded. // Three fields are always optional. @@ -300,11 +304,23 @@ quiche::QuicheBuffer MoqtFramer::SerializeObjectHeader( WireVarInt62(message.payload_length), WireOptional(object_status)); } + if (previous_object_in_stream.has_value() && + message.object_id <= *previous_object_in_stream) { + QUICHE_BUG(QUICHE_BUG_serialize_object_header_02) + << "Object ID is not increasing"; + return quiche::QuicheBuffer(); + } // Subgroup headers have more optional fields. QUICHE_CHECK(message_type.IsSubgroup()); std::optional group_id = - is_first_in_stream ? std::optional(message.group_id) - : std::nullopt; + previous_object_in_stream.has_value() + ? std::nullopt + : std::optional(message.group_id); + uint64_t object_id = message.object_id; + if (!is_first_in_stream) { + // The value is actually an object ID delta, not the absolute object ID. + object_id -= (*previous_object_in_stream + 1); + } std::optional subgroup_id = (is_first_in_stream && message_type.IsSubgroupPresent()) ? std::optional(message.subgroup_id) @@ -321,8 +337,7 @@ quiche::QuicheBuffer MoqtFramer::SerializeObjectHeader( WireOptional(track_alias), WireOptional(group_id), WireOptional(subgroup_id), - WireOptional(publisher_priority), - WireVarInt62(message.object_id), + WireOptional(publisher_priority), WireVarInt62(object_id), WireOptional(extension_headers), WireVarInt62(message.payload_length), WireOptional(object_status)); @@ -340,8 +355,13 @@ quiche::QuicheBuffer MoqtFramer::SerializeObjectDatagram( << "Payload length does not match payload"; return quiche::QuicheBuffer(); } - MoqtDatagramType datagram_type(/*has_status=*/payload.empty(), - !message.extension_headers.empty()); + MoqtDatagramType datagram_type( + !payload.empty(), !message.extension_headers.empty(), + message.object_status == MoqtObjectStatus::kEndOfGroup, + message.object_id == 0); + std::optional object_id = + datagram_type.has_object_id() ? std::optional(message.object_id) + : std::nullopt; std::optional extensions = datagram_type.has_extension() ? std::optional(message.extension_headers) @@ -355,7 +375,7 @@ quiche::QuicheBuffer MoqtFramer::SerializeObjectDatagram( : std::optional(payload); return Serialize( WireVarInt62(datagram_type.value()), WireVarInt62(message.track_alias), - WireVarInt62(message.group_id), WireVarInt62(message.object_id), + WireVarInt62(message.group_id), WireOptional(object_id), WireUint8(message.publisher_priority), WireOptional(extensions), WireOptional(object_status), @@ -397,7 +417,7 @@ quiche::QuicheBuffer MoqtFramer::SerializeServerSetup( } quiche::QuicheBuffer MoqtFramer::SerializeSubscribe( - const MoqtSubscribe& message) { + const MoqtSubscribe& message, MoqtMessageType message_type) { KeyValuePairList parameters; VersionSpecificParametersToKeyValuePairList(message.parameters, parameters); if (!ValidateVersionSpecificParameters(parameters, @@ -432,7 +452,7 @@ quiche::QuicheBuffer MoqtFramer::SerializeSubscribe( return quiche::QuicheBuffer(); } return SerializeControlMessage( - MoqtMessageType::kSubscribe, WireVarInt62(message.request_id), + message_type, WireVarInt62(message.request_id), WireFullTrackName(message.full_track_name), WireUint8(message.subscriber_priority), WireDeliveryOrder(message.group_order), WireBoolean(message.forward), @@ -443,7 +463,7 @@ quiche::QuicheBuffer MoqtFramer::SerializeSubscribe( } quiche::QuicheBuffer MoqtFramer::SerializeSubscribeOk( - const MoqtSubscribeOk& message) { + const MoqtSubscribeOk& message, MoqtMessageType message_type) { KeyValuePairList parameters; VersionSpecificParametersToKeyValuePairList(message.parameters, parameters); if (!ValidateVersionSpecificParameters(parameters, @@ -454,26 +474,28 @@ quiche::QuicheBuffer MoqtFramer::SerializeSubscribeOk( } if (message.largest_location.has_value()) { return SerializeControlMessage( - MoqtMessageType::kSubscribeOk, WireVarInt62(message.request_id), + message_type, WireVarInt62(message.request_id), WireVarInt62(message.track_alias), - WireVarInt62(message.expires.ToMilliseconds()), + WireVarInt62(message.expires.IsInfinite() + ? 0 + : message.expires.ToMilliseconds()), WireDeliveryOrder(message.group_order), WireUint8(1), WireVarInt62(message.largest_location->group), WireVarInt62(message.largest_location->object), WireKeyValuePairList(parameters)); } - return SerializeControlMessage( - MoqtMessageType::kSubscribeOk, WireVarInt62(message.request_id), - WireVarInt62(message.track_alias), - WireVarInt62(message.expires.ToMilliseconds()), - WireDeliveryOrder(message.group_order), WireUint8(0), - WireKeyValuePairList(parameters)); + return SerializeControlMessage(message_type, WireVarInt62(message.request_id), + WireVarInt62(message.track_alias), + WireVarInt62(message.expires.ToMilliseconds()), + WireDeliveryOrder(message.group_order), + WireUint8(0), + WireKeyValuePairList(parameters)); } quiche::QuicheBuffer MoqtFramer::SerializeSubscribeError( - const MoqtSubscribeError& message) { + const MoqtSubscribeError& message, MoqtMessageType message_type) { return SerializeControlMessage( - MoqtMessageType::kSubscribeError, WireVarInt62(message.request_id), + message_type, WireVarInt62(message.request_id), WireVarInt62(message.error_code), WireStringWithVarInt62Length(message.reason_phrase)); } @@ -484,10 +506,10 @@ quiche::QuicheBuffer MoqtFramer::SerializeUnsubscribe( WireVarInt62(message.request_id)); } -quiche::QuicheBuffer MoqtFramer::SerializeSubscribeDone( - const MoqtSubscribeDone& message) { +quiche::QuicheBuffer MoqtFramer::SerializePublishDone( + const MoqtPublishDone& message) { return SerializeControlMessage( - MoqtMessageType::kSubscribeDone, WireVarInt62(message.request_id), + MoqtMessageType::kPublishDone, WireVarInt62(message.request_id), WireVarInt62(message.status_code), WireVarInt62(message.stream_count), WireStringWithVarInt62Length(message.error_reason)); } @@ -511,83 +533,64 @@ quiche::QuicheBuffer MoqtFramer::SerializeSubscribeUpdate( WireBoolean(message.forward), WireKeyValuePairList(parameters)); } -quiche::QuicheBuffer MoqtFramer::SerializeAnnounce( - const MoqtAnnounce& message) { +quiche::QuicheBuffer MoqtFramer::SerializePublishNamespace( + const MoqtPublishNamespace& message) { KeyValuePairList parameters; VersionSpecificParametersToKeyValuePairList(message.parameters, parameters); if (!ValidateVersionSpecificParameters(parameters, - MoqtMessageType::kAnnounce)) { + MoqtMessageType::kPublishNamespace)) { QUICHE_BUG(QUICHE_BUG_invalid_parameters) << "Serializing invalid MoQT parameters"; return quiche::QuicheBuffer(); } - return SerializeControlMessage(MoqtMessageType::kAnnounce, + return SerializeControlMessage(MoqtMessageType::kPublishNamespace, WireVarInt62(message.request_id), WireTrackNamespace(message.track_namespace), WireKeyValuePairList(parameters)); } -quiche::QuicheBuffer MoqtFramer::SerializeAnnounceOk( - const MoqtAnnounceOk& message) { - return SerializeControlMessage(MoqtMessageType::kAnnounceOk, +quiche::QuicheBuffer MoqtFramer::SerializePublishNamespaceOk( + const MoqtPublishNamespaceOk& message) { + return SerializeControlMessage(MoqtMessageType::kPublishNamespaceOk, WireVarInt62(message.request_id)); } -quiche::QuicheBuffer MoqtFramer::SerializeAnnounceError( - const MoqtAnnounceError& message) { +quiche::QuicheBuffer MoqtFramer::SerializePublishNamespaceError( + const MoqtPublishNamespaceError& message) { return SerializeControlMessage( - MoqtMessageType::kAnnounceError, WireVarInt62(message.request_id), + MoqtMessageType::kPublishNamespaceError, WireVarInt62(message.request_id), WireVarInt62(message.error_code), WireStringWithVarInt62Length(message.error_reason)); } -quiche::QuicheBuffer MoqtFramer::SerializeUnannounce( - const MoqtUnannounce& message) { - return SerializeControlMessage(MoqtMessageType::kUnannounce, +quiche::QuicheBuffer MoqtFramer::SerializePublishNamespaceDone( + const MoqtPublishNamespaceDone& message) { + return SerializeControlMessage(MoqtMessageType::kPublishNamespaceDone, WireTrackNamespace(message.track_namespace)); } -quiche::QuicheBuffer MoqtFramer::SerializeAnnounceCancel( - const MoqtAnnounceCancel& message) { +quiche::QuicheBuffer MoqtFramer::SerializePublishNamespaceCancel( + const MoqtPublishNamespaceCancel& message) { return SerializeControlMessage( - MoqtMessageType::kAnnounceCancel, + MoqtMessageType::kPublishNamespaceCancel, WireTrackNamespace(message.track_namespace), WireVarInt62(message.error_code), WireStringWithVarInt62Length(message.error_reason)); } -quiche::QuicheBuffer MoqtFramer::SerializeTrackStatusRequest( - const MoqtTrackStatusRequest& message) { - KeyValuePairList parameters; - VersionSpecificParametersToKeyValuePairList(message.parameters, parameters); - if (!ValidateVersionSpecificParameters( - parameters, MoqtMessageType::kTrackStatusRequest)) { - QUICHE_BUG(QUICHE_BUG_invalid_parameters) - << "Serializing invalid MoQT parameters"; - return quiche::QuicheBuffer(); - } - return SerializeControlMessage(MoqtMessageType::kTrackStatusRequest, - WireVarInt62(message.request_id), - WireFullTrackName(message.full_track_name), - WireKeyValuePairList(parameters)); -} - quiche::QuicheBuffer MoqtFramer::SerializeTrackStatus( const MoqtTrackStatus& message) { - KeyValuePairList parameters; - VersionSpecificParametersToKeyValuePairList(message.parameters, parameters); - if (!ValidateVersionSpecificParameters(parameters, - MoqtMessageType::kTrackStatus)) { - QUICHE_BUG(QUICHE_BUG_invalid_parameters) - << "Serializing invalid MoQT parameters"; - return quiche::QuicheBuffer(); - } - return SerializeControlMessage(MoqtMessageType::kTrackStatus, - WireVarInt62(message.request_id), - WireVarInt62(message.status_code), - WireVarInt62(message.largest_location.group), - WireVarInt62(message.largest_location.object), - WireKeyValuePairList(parameters)); + return SerializeSubscribe(message, MoqtMessageType::kTrackStatus); +} + +quiche::QuicheBuffer MoqtFramer::SerializeTrackStatusOk( + const MoqtTrackStatusOk& message) { + return SerializeSubscribeOk(message, MoqtMessageType::kTrackStatusOk); +} + +quiche::QuicheBuffer MoqtFramer::SerializeTrackStatusError( + const MoqtTrackStatusError& message) { + return SerializeSubscribeError(message, MoqtMessageType::kTrackStatusError); } quiche::QuicheBuffer MoqtFramer::SerializeGoAway(const MoqtGoAway& message) { @@ -596,39 +599,39 @@ quiche::QuicheBuffer MoqtFramer::SerializeGoAway(const MoqtGoAway& message) { WireStringWithVarInt62Length(message.new_session_uri)); } -quiche::QuicheBuffer MoqtFramer::SerializeSubscribeAnnounces( - const MoqtSubscribeAnnounces& message) { +quiche::QuicheBuffer MoqtFramer::SerializeSubscribeNamespace( + const MoqtSubscribeNamespace& message) { KeyValuePairList parameters; VersionSpecificParametersToKeyValuePairList(message.parameters, parameters); if (!ValidateVersionSpecificParameters( - parameters, MoqtMessageType::kSubscribeAnnounces)) { + parameters, MoqtMessageType::kSubscribeNamespace)) { QUICHE_BUG(QUICHE_BUG_invalid_parameters) << "Serializing invalid MoQT parameters"; return quiche::QuicheBuffer(); } - return SerializeControlMessage(MoqtMessageType::kSubscribeAnnounces, + return SerializeControlMessage(MoqtMessageType::kSubscribeNamespace, WireVarInt62(message.request_id), WireTrackNamespace(message.track_namespace), WireKeyValuePairList(parameters)); } -quiche::QuicheBuffer MoqtFramer::SerializeSubscribeAnnouncesOk( - const MoqtSubscribeAnnouncesOk& message) { - return SerializeControlMessage(MoqtMessageType::kSubscribeAnnouncesOk, +quiche::QuicheBuffer MoqtFramer::SerializeSubscribeNamespaceOk( + const MoqtSubscribeNamespaceOk& message) { + return SerializeControlMessage(MoqtMessageType::kSubscribeNamespaceOk, WireVarInt62(message.request_id)); } -quiche::QuicheBuffer MoqtFramer::SerializeSubscribeAnnouncesError( - const MoqtSubscribeAnnouncesError& message) { +quiche::QuicheBuffer MoqtFramer::SerializeSubscribeNamespaceError( + const MoqtSubscribeNamespaceError& message) { return SerializeControlMessage( - MoqtMessageType::kSubscribeAnnouncesError, + MoqtMessageType::kSubscribeNamespaceError, WireVarInt62(message.request_id), WireVarInt62(message.error_code), WireStringWithVarInt62Length(message.error_reason)); } -quiche::QuicheBuffer MoqtFramer::SerializeUnsubscribeAnnounces( - const MoqtUnsubscribeAnnounces& message) { - return SerializeControlMessage(MoqtMessageType::kUnsubscribeAnnounces, +quiche::QuicheBuffer MoqtFramer::SerializeUnsubscribeNamespace( + const MoqtUnsubscribeNamespace& message) { + return SerializeControlMessage(MoqtMessageType::kUnsubscribeNamespace, WireTrackNamespace(message.track_namespace)); } @@ -642,10 +645,7 @@ quiche::QuicheBuffer MoqtFramer::SerializeFetch(const MoqtFetch& message) { if (std::holds_alternative(message.fetch)) { const StandaloneFetch& standalone_fetch = std::get(message.fetch); - if (standalone_fetch.end_group < standalone_fetch.start_object.group || - (standalone_fetch.end_group == standalone_fetch.start_object.group && - standalone_fetch.end_object.has_value() && - *standalone_fetch.end_object < standalone_fetch.start_object.object)) { + if (standalone_fetch.end_location < standalone_fetch.start_location) { QUICHE_BUG(MoqtFramer_invalid_fetch) << "Invalid FETCH object range"; return quiche::QuicheBuffer(); } @@ -666,32 +666,31 @@ quiche::QuicheBuffer MoqtFramer::SerializeFetch(const MoqtFetch& message) { WireDeliveryOrder(message.group_order), WireVarInt62(FetchType::kStandalone), WireFullTrackName(standalone_fetch.full_track_name), - WireVarInt62(standalone_fetch.start_object.group), - WireVarInt62(standalone_fetch.start_object.object), - WireVarInt62(standalone_fetch.end_group), - WireVarInt62(standalone_fetch.end_object.has_value() - ? *standalone_fetch.end_object + 1 - : 0), + WireVarInt62(standalone_fetch.start_location.group), + WireVarInt62(standalone_fetch.start_location.object), + WireVarInt62(standalone_fetch.end_location.group), + WireVarInt62(standalone_fetch.end_location.object == kMaxObjectId + ? 0 + : standalone_fetch.end_location.object + 1), WireKeyValuePairList(parameters)); } - uint64_t subscribe_id; - uint64_t joining_start; + uint64_t request_id, joining_start; if (std::holds_alternative(message.fetch)) { const JoiningFetchRelative& joining_fetch = std::get(message.fetch); - subscribe_id = joining_fetch.joining_subscribe_id; + request_id = joining_fetch.joining_request_id; joining_start = joining_fetch.joining_start; } else { const JoiningFetchAbsolute& joining_fetch = std::get(message.fetch); - subscribe_id = joining_fetch.joining_subscribe_id; + request_id = joining_fetch.joining_request_id; joining_start = joining_fetch.joining_start; } return SerializeControlMessage( MoqtMessageType::kFetch, WireVarInt62(message.request_id), WireUint8(message.subscriber_priority), WireDeliveryOrder(message.group_order), - WireVarInt62(message.fetch.index() + 1), WireVarInt62(subscribe_id), + WireVarInt62(message.fetch.index() + 1), WireVarInt62(request_id), WireVarInt62(joining_start), WireKeyValuePairList(parameters)); } @@ -708,7 +707,9 @@ quiche::QuicheBuffer MoqtFramer::SerializeFetchOk(const MoqtFetchOk& message) { MoqtMessageType::kFetchOk, WireVarInt62(message.request_id), WireDeliveryOrder(message.group_order), WireBoolean(message.end_of_track), WireVarInt62(message.end_location.group), - WireVarInt62(message.end_location.object), + WireVarInt62(message.end_location.object == kMaxObjectId + ? 0 + : (message.end_location.object + 1)), WireKeyValuePairList(parameters)); } @@ -829,6 +830,7 @@ quiche::QuicheBuffer MoqtFramer::SerializeObjectAck( bool MoqtFramer::ValidateObjectMetadata(const MoqtObject& object, bool is_datagram) { if (object.object_status != MoqtObjectStatus::kNormal && + object.object_status != MoqtObjectStatus::kEndOfGroup && object.payload_length > 0) { return false; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_framer.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_framer.h index 8310736c3f..e5a4a52179 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_framer.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_framer.h @@ -5,6 +5,9 @@ #ifndef QUICHE_QUIC_MOQT_MOQT_FRAMER_H_ #define QUICHE_QUIC_MOQT_MOQT_FRAMER_H_ +#include +#include + #include "absl/strings/string_view.h" #include "quiche/quic/moqt/moqt_messages.h" #include "quiche/common/platform/api/quiche_export.h" @@ -28,43 +31,54 @@ class QUICHE_EXPORT MoqtFramer { // Serialize functions. Takes structured data and serializes it into a // QuicheBuffer for delivery to the stream. - // Serializes the header for an object, including the appropriate stream - // header if `is_first_in_stream` is set to true. - quiche::QuicheBuffer SerializeObjectHeader(const MoqtObject& message, - MoqtDataStreamType message_type, - bool is_first_in_stream); + // Serializes the header for an object, |previous_object_in_stream| is nullopt + // if this is the first object in the stream, the object ID of the previous + // one otherwise. + quiche::QuicheBuffer SerializeObjectHeader( + const MoqtObject& message, MoqtDataStreamType message_type, + std::optional previous_object_in_stream); // Serializes both OBJECT and OBJECT_STATUS datagrams. quiche::QuicheBuffer SerializeObjectDatagram(const MoqtObject& message, absl::string_view payload); quiche::QuicheBuffer SerializeClientSetup(const MoqtClientSetup& message); quiche::QuicheBuffer SerializeServerSetup(const MoqtServerSetup& message); // Returns an empty buffer if there is an illegal combination of locations. - quiche::QuicheBuffer SerializeSubscribe(const MoqtSubscribe& message); - quiche::QuicheBuffer SerializeSubscribeOk(const MoqtSubscribeOk& message); + quiche::QuicheBuffer SerializeSubscribe( + const MoqtSubscribe& message, + MoqtMessageType message_type = MoqtMessageType::kSubscribe); + quiche::QuicheBuffer SerializeSubscribeOk( + const MoqtSubscribeOk& message, + MoqtMessageType message_type = MoqtMessageType::kSubscribeOk); quiche::QuicheBuffer SerializeSubscribeError( - const MoqtSubscribeError& message); + const MoqtSubscribeError& message, + MoqtMessageType message_type = MoqtMessageType::kSubscribeError); quiche::QuicheBuffer SerializeUnsubscribe(const MoqtUnsubscribe& message); - quiche::QuicheBuffer SerializeSubscribeDone(const MoqtSubscribeDone& message); + quiche::QuicheBuffer SerializePublishDone(const MoqtPublishDone& message); quiche::QuicheBuffer SerializeSubscribeUpdate( const MoqtSubscribeUpdate& message); - quiche::QuicheBuffer SerializeAnnounce(const MoqtAnnounce& message); - quiche::QuicheBuffer SerializeAnnounceOk(const MoqtAnnounceOk& message); - quiche::QuicheBuffer SerializeAnnounceError(const MoqtAnnounceError& message); - quiche::QuicheBuffer SerializeUnannounce(const MoqtUnannounce& message); - quiche::QuicheBuffer SerializeAnnounceCancel( - const MoqtAnnounceCancel& message); - quiche::QuicheBuffer SerializeTrackStatusRequest( - const MoqtTrackStatusRequest& message); + quiche::QuicheBuffer SerializePublishNamespace( + const MoqtPublishNamespace& message); + quiche::QuicheBuffer SerializePublishNamespaceOk( + const MoqtPublishNamespaceOk& message); + quiche::QuicheBuffer SerializePublishNamespaceError( + const MoqtPublishNamespaceError& message); + quiche::QuicheBuffer SerializePublishNamespaceDone( + const MoqtPublishNamespaceDone& message); + quiche::QuicheBuffer SerializePublishNamespaceCancel( + const MoqtPublishNamespaceCancel& message); quiche::QuicheBuffer SerializeTrackStatus(const MoqtTrackStatus& message); + quiche::QuicheBuffer SerializeTrackStatusOk(const MoqtTrackStatusOk& message); + quiche::QuicheBuffer SerializeTrackStatusError( + const MoqtTrackStatusError& message); quiche::QuicheBuffer SerializeGoAway(const MoqtGoAway& message); - quiche::QuicheBuffer SerializeSubscribeAnnounces( - const MoqtSubscribeAnnounces& message); - quiche::QuicheBuffer SerializeSubscribeAnnouncesOk( - const MoqtSubscribeAnnouncesOk& message); - quiche::QuicheBuffer SerializeSubscribeAnnouncesError( - const MoqtSubscribeAnnouncesError& message); - quiche::QuicheBuffer SerializeUnsubscribeAnnounces( - const MoqtUnsubscribeAnnounces& message); + quiche::QuicheBuffer SerializeSubscribeNamespace( + const MoqtSubscribeNamespace& message); + quiche::QuicheBuffer SerializeSubscribeNamespaceOk( + const MoqtSubscribeNamespaceOk& message); + quiche::QuicheBuffer SerializeSubscribeNamespaceError( + const MoqtSubscribeNamespaceError& message); + quiche::QuicheBuffer SerializeUnsubscribeNamespace( + const MoqtUnsubscribeNamespace& message); quiche::QuicheBuffer SerializeMaxRequestId(const MoqtMaxRequestId& message); quiche::QuicheBuffer SerializeFetch(const MoqtFetch& message); quiche::QuicheBuffer SerializeFetchCancel(const MoqtFetchCancel& message); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_known_track_publisher.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_known_track_publisher.cc index 60150cf7de..309d65be68 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_known_track_publisher.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_known_track_publisher.cc @@ -6,19 +6,18 @@ #include -#include "absl/status/status.h" -#include "absl/status/statusor.h" +#include "absl/base/nullability.h" #include "quiche/quic/moqt/moqt_messages.h" #include "quiche/quic/moqt/moqt_publisher.h" #include "quiche/common/platform/api/quiche_bug_tracker.h" namespace moqt { -absl::StatusOr> +absl_nullable std::shared_ptr MoqtKnownTrackPublisher::GetTrack(const FullTrackName& track_name) { auto it = tracks_.find(track_name); if (it == tracks_.end()) { - return absl::NotFoundError("Requested track not found"); + return nullptr; } return it->second; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_known_track_publisher.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_known_track_publisher.h index 59a22a0d95..726ee6ff7f 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_known_track_publisher.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_known_track_publisher.h @@ -7,8 +7,8 @@ #include +#include "absl/base/nullability.h" #include "absl/container/flat_hash_map.h" -#include "absl/status/statusor.h" #include "quiche/quic/moqt/moqt_messages.h" #include "quiche/quic/moqt/moqt_publisher.h" @@ -24,8 +24,10 @@ class MoqtKnownTrackPublisher : public MoqtPublisher { MoqtKnownTrackPublisher& operator=(const MoqtKnownTrackPublisher&) = delete; MoqtKnownTrackPublisher& operator=(MoqtKnownTrackPublisher&&) = delete; - absl::StatusOr> GetTrack( + // MoqtPublisher implementation. + absl_nullable std::shared_ptr GetTrack( const FullTrackName& track_name) override; + void Add(std::shared_ptr track_publisher); void Delete(const FullTrackName& track_name); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_live_relay_queue.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_live_relay_queue.cc index 3468192fe6..0e145cd4cf 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_live_relay_queue.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_live_relay_queue.cc @@ -7,16 +7,12 @@ #include #include #include -#include #include "absl/base/attributes.h" -#include "absl/status/statusor.h" #include "absl/strings/string_view.h" -#include "quiche/quic/moqt/moqt_cached_object.h" #include "quiche/quic/moqt/moqt_messages.h" -#include "quiche/quic/moqt/moqt_priority.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_publisher.h" -#include "quiche/quic/moqt/moqt_subscribe_windows.h" #include "quiche/common/platform/api/quiche_logging.h" #include "quiche/common/quiche_buffer_allocator.h" #include "quiche/common/quiche_callbacks.h" @@ -27,11 +23,9 @@ namespace moqt { bool MoqtLiveRelayQueue::AddFin(Location sequence, uint64_t subgroup) { - switch (forwarding_preference_) { - case MoqtForwardingPreference::kDatagram: - return false; - case MoqtForwardingPreference::kSubgroup: - break; + if (!forwarding_preference_.has_value() || + *forwarding_preference_ == MoqtForwardingPreference::kDatagram) { + return false; } auto group_it = queue_.find(sequence.group); if (group_it == queue_.end()) { @@ -39,8 +33,7 @@ bool MoqtLiveRelayQueue::AddFin(Location sequence, uint64_t subgroup) { return false; } Group& group = group_it->second; - auto subgroup_it = - group.subgroups.find(SubgroupPriority{publisher_priority_, subgroup}); + auto subgroup_it = group.subgroups.find(subgroup); if (subgroup_it == group.subgroups.end()) { // Subgroup does not exist. return false; @@ -61,29 +54,27 @@ bool MoqtLiveRelayQueue::AddFin(Location sequence, uint64_t subgroup) { } bool MoqtLiveRelayQueue::OnStreamReset( - Location sequence, uint64_t subgroup_id, + uint64_t group_id, uint64_t subgroup_id, webtransport::StreamErrorCode error_code) { - switch (forwarding_preference_) { - case MoqtForwardingPreference::kDatagram: - return false; - case MoqtForwardingPreference::kSubgroup: - break; + if (!forwarding_preference_.has_value() || + *forwarding_preference_ == MoqtForwardingPreference::kDatagram) { + return false; } - auto group_it = queue_.find(sequence.group); + auto group_it = queue_.find(group_id); if (group_it == queue_.end()) { // Group does not exist. return false; } Group& group = group_it->second; - auto subgroup_it = - group.subgroups.find(SubgroupPriority{publisher_priority_, subgroup_id}); + auto subgroup_it = group.subgroups.find(subgroup_id); if (subgroup_it == group.subgroups.end()) { // Subgroup does not exist. return false; } for (MoqtObjectListener* listener : listeners_) { - listener->OnSubgroupAbandoned(sequence.group, subgroup_id, error_code); + listener->OnSubgroupAbandoned(group_id, subgroup_id, error_code); } + group.subgroups.erase(subgroup_id); return true; } @@ -134,12 +125,15 @@ bool MoqtLiveRelayQueue::AddObject(const PublishedObjectMetadata& metadata, return false; } } - // TODO: use `metadata.publisher_priority` instead. - auto subgroup_it = group.subgroups.try_emplace( - SubgroupPriority{publisher_priority_, metadata.subgroup}); + auto subgroup_it = group.subgroups.try_emplace(metadata.subgroup); auto& subgroup = subgroup_it.first->second; if (!subgroup.empty()) { // Check if the new object is valid CachedObject& last_object = subgroup.rbegin()->second; + if (last_object.metadata.publisher_priority != + metadata.publisher_priority) { + QUICHE_DLOG(INFO) << "Publisher priority changing in a subgroup"; + return false; + } if (last_object.fin_after_this) { QUICHE_DLOG(INFO) << "Skipping object because it is after the end of the " << "subgroup"; @@ -184,21 +178,21 @@ bool MoqtLiveRelayQueue::AddObject(const PublishedObjectMetadata& metadata, subgroup.emplace(sequence.object, CachedObject{metadata, slice, last_object_in_stream}); for (MoqtObjectListener* listener : listeners_) { - listener->OnNewObjectAvailable(sequence, metadata.subgroup); + listener->OnNewObjectAvailable(sequence, metadata.subgroup, + metadata.publisher_priority); } return true; } std::optional MoqtLiveRelayQueue::GetCachedObject( - uint64_t group_id, uint64_t subgroup_id, uint64_t object_id) const { + uint64_t group_id, uint64_t subgroup_id, uint64_t min_object_id) const { auto group_it = queue_.find(group_id); if (group_it == queue_.end()) { // Group does not exist. return std::nullopt; } const Group& group = group_it->second; - auto subgroup_it = - group.subgroups.find(SubgroupPriority{publisher_priority_, subgroup_id}); + auto subgroup_it = group.subgroups.find(subgroup_id); if (subgroup_it == group.subgroups.end()) { // Subgroup does not exist. return std::nullopt; @@ -207,8 +201,8 @@ std::optional MoqtLiveRelayQueue::GetCachedObject( if (subgroup.empty()) { return std::nullopt; // There are no objects. } - // Find an object with ID of at least sequence.object. - auto object_it = subgroup.lower_bound(object_id); + // Find an object with ID of at least min_object_id. + auto object_it = subgroup.lower_bound(min_object_id); if (object_it == subgroup.end()) { // No object after the last one received. return std::nullopt; @@ -227,18 +221,10 @@ void MoqtLiveRelayQueue::ForAllObjects( } } -absl::StatusOr MoqtLiveRelayQueue::GetTrackStatus() const { - if (end_of_track_.has_value()) { - return MoqtTrackStatusCode::kFinished; - } +std::optional MoqtLiveRelayQueue::largest_location() const { if (queue_.empty()) { - // TODO(martinduke): Retrieve the track status from upstream. - return MoqtTrackStatusCode::kNotYetBegun; + return std::nullopt; } - return MoqtTrackStatusCode::kInProgress; -} - -Location MoqtLiveRelayQueue::GetLargestLocation() const { return Location{next_sequence_.group, next_sequence_.object - 1}; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_live_relay_queue.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_live_relay_queue.h index 60ef82875d..1baf993d0f 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_live_relay_queue.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_live_relay_queue.h @@ -14,13 +14,13 @@ #include "absl/container/btree_map.h" #include "absl/container/flat_hash_set.h" #include "absl/status/status.h" -#include "absl/status/statusor.h" #include "absl/strings/string_view.h" #include "quiche/quic/core/quic_clock.h" #include "quiche/quic/core/quic_default_clock.h" -#include "quiche/quic/moqt/moqt_cached_object.h" -#include "quiche/quic/moqt/moqt_failed_fetch.h" +#include "quiche/quic/core/quic_time.h" +#include "quiche/quic/moqt/moqt_fetch_task.h" #include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_priority.h" #include "quiche/quic/moqt/moqt_publisher.h" #include "quiche/common/quiche_callbacks.h" @@ -41,11 +41,16 @@ namespace moqt { class MoqtLiveRelayQueue : public MoqtTrackPublisher { public: MoqtLiveRelayQueue( - FullTrackName track, MoqtForwardingPreference forwarding_preference, + FullTrackName track, + std::optional forwarding_preference, + std::optional delivery_order, + std::optional expiration = quic::QuicTime::Infinite(), const quic::QuicClock* clock = quic::QuicDefaultClock::Get()) : clock_(clock), track_(std::move(track)), forwarding_preference_(forwarding_preference), + delivery_order_(delivery_order), + expiration_(expiration), next_sequence_(0, 0) {} MoqtLiveRelayQueue(const MoqtLiveRelayQueue&) = delete; @@ -83,16 +88,15 @@ class MoqtLiveRelayQueue : public MoqtTrackPublisher { return AddObject(metadata, object, fin); } - // Record a received FIN that did not come with the last object. + // Record a received FIN from upstream that did not come with the last object. // If the forwarding preference is kDatagram or kTrack, |sequence| is ignored. // Otherwise, |sequence| is used to determine which stream is being FINed. If // the object ID does not match the last object ID in the stream, no action // is taken. bool AddFin(Location sequence, uint64_t subgroup_id); - // Record a received RESET_STREAM. |sequence| encodes the group and subgroup - // of the stream that is being reset. Returns false on datagram tracks, or if - // the stream does not exist. - bool OnStreamReset(Location sequence, uint64_t subgroup_id, + // Record a received RESET_STREAM from upstream. Returns false on datagram + // tracks, or if the stream does not exist. + bool OnStreamReset(uint64_t group_id, uint64_t subgroup_id, webtransport::StreamErrorCode error_code); // MoqtTrackPublisher implementation. @@ -107,21 +111,41 @@ class MoqtLiveRelayQueue : public MoqtTrackPublisher { void RemoveObjectListener(MoqtObjectListener* listener) override { listeners_.erase(listener); } - absl::StatusOr GetTrackStatus() const override; - Location GetLargestLocation() const override; - MoqtForwardingPreference GetForwardingPreference() const override { + std::optional largest_location() const override; + std::optional forwarding_preference() + const override { return forwarding_preference_; } - MoqtPriority GetPublisherPriority() const override { - return publisher_priority_; - } - MoqtDeliveryOrder GetDeliveryOrder() const override { + std::optional delivery_order() const override { return delivery_order_; } - std::unique_ptr Fetch(Location /*start*/, - uint64_t /*end_group*/, - std::optional /*end_object*/, - MoqtDeliveryOrder /*order*/) override { + std::optional expiration() const override { + if (!expiration_.has_value()) { + return std::nullopt; + } + if (expiration_ == quic::QuicTime::Infinite()) { + return quic::QuicTimeDelta::Zero(); + } + if (expiration_ < clock_->Now()) { + // TODO(martinduke): Tear everything down; the track is expired. + return quic::QuicTimeDelta::Zero(); + } + return clock_->Now() - *expiration_; + } + std::unique_ptr StandaloneFetch( + Location /*start*/, Location /*end*/, + std::optional /*order*/) override { + return std::make_unique( + absl::UnimplementedError("Fetch not implemented")); + } + std::unique_ptr RelativeFetch( + uint64_t /*group_diff*/, + std::optional /*order*/) override { + return std::make_unique( + absl::UnimplementedError("Fetch not implemented")); + } + std::unique_ptr AbsoluteFetch( + uint64_t /*group*/, std::optional /*order*/) override { return std::make_unique( absl::UnimplementedError("Fetch not implemented")); } @@ -150,14 +174,14 @@ class MoqtLiveRelayQueue : public MoqtTrackPublisher { struct Group { uint64_t next_object = 0; bool complete = false; // If true, kEndOfGroup has been received. - absl::btree_map subgroups; + absl::btree_map subgroups; // Ordered by subgroup id. }; const quic::QuicClock* clock_; FullTrackName track_; - MoqtForwardingPreference forwarding_preference_; - MoqtPriority publisher_priority_ = 128; - MoqtDeliveryOrder delivery_order_ = MoqtDeliveryOrder::kAscending; + std::optional forwarding_preference_; + std::optional delivery_order_; + std::optional expiration_; absl::btree_map queue_; // Ordered by group id. absl::flat_hash_set listeners_; std::optional end_of_track_; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_messages.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_messages.cc index 993fa2d755..af3cba90cc 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_messages.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_messages.cc @@ -105,7 +105,7 @@ RequestErrorCode StatusToRequestErrorCode(absl::Status status) { case absl::StatusCode::kOutOfRange: return RequestErrorCode::kInvalidRange; case absl::StatusCode::kInvalidArgument: - return RequestErrorCode::kInvalidJoiningSubscribeId; + return RequestErrorCode::kInvalidJoiningRequestId; case absl::StatusCode::kUnauthenticated: return RequestErrorCode::kExpiredAuthToken; default: @@ -132,7 +132,7 @@ absl::StatusCode RequestErrorCodeToStatusCode(RequestErrorCode error_code) { case RequestErrorCode::kNoObjects: // Equivalently, kRetryTrackAlias. return absl::StatusCode::kNotFound; - case RequestErrorCode::kInvalidJoiningSubscribeId: + case RequestErrorCode::kInvalidJoiningRequestId: case RequestErrorCode::kMalformedAuthToken: return absl::StatusCode::kInvalidArgument; case RequestErrorCode::kExpiredAuthToken: @@ -161,6 +161,11 @@ MoqtError ValidateSetupParameters(const KeyValuePairList& parameters, // Only non-webtrans servers should receive kPath. return MoqtError::kInvalidPath; } + if ((webtrans || perspective == quic::Perspective::IS_CLIENT) && + parameters.contains(SetupParameter::kAuthority)) { + // Only non-webtrans servers should receive kAuthority. + return MoqtError::kInvalidAuthority; + } if (!parameters.contains(SetupParameter::kSupportObjectAcks)) { return MoqtError::kNoError; } @@ -173,17 +178,23 @@ MoqtError ValidateSetupParameters(const KeyValuePairList& parameters, return MoqtError::kNoError; } -const std::array kAllowsAuthorization = { - MoqtMessageType::kClientSetup, MoqtMessageType::kServerSetup, - MoqtMessageType::kSubscribe, MoqtMessageType::kSubscribeAnnounces, - MoqtMessageType::kAnnounce, MoqtMessageType::kTrackStatusRequest, - MoqtMessageType::kFetch, MoqtMessageType::kPublish}; -const std::array kAllowsDeliveryTimeout = { - MoqtMessageType::kSubscribe, MoqtMessageType::kSubscribeOk, - MoqtMessageType::kSubscribeUpdate, MoqtMessageType::kTrackStatus, - MoqtMessageType::kPublish, MoqtMessageType::kPublishOk}; +const std::array kAllowsAuthorization = { + MoqtMessageType::kClientSetup, + MoqtMessageType::kServerSetup, + MoqtMessageType::kPublish, + MoqtMessageType::kSubscribe, + MoqtMessageType::kSubscribeUpdate, + MoqtMessageType::kSubscribeNamespace, + MoqtMessageType::kPublishNamespace, + MoqtMessageType::kTrackStatus, + MoqtMessageType::kFetch}; +const std::array kAllowsDeliveryTimeout = { + MoqtMessageType::kTrackStatus, MoqtMessageType::kTrackStatusOk, + MoqtMessageType::kPublish, MoqtMessageType::kPublishOk, + MoqtMessageType::kSubscribe, MoqtMessageType::kSubscribeOk, + MoqtMessageType::kSubscribeUpdate}; const std::array kAllowsMaxCacheDuration = { - MoqtMessageType::kSubscribeOk, MoqtMessageType::kTrackStatus, + MoqtMessageType::kSubscribeOk, MoqtMessageType::kTrackStatusOk, MoqtMessageType::kFetchOk, MoqtMessageType::kPublish}; bool ValidateVersionSpecificParameters(const KeyValuePairList& parameters, MoqtMessageType message_type) { @@ -226,33 +237,35 @@ std::string MoqtMessageTypeToString(const MoqtMessageType message_type) { return "SUBSCRIBE_ERROR"; case MoqtMessageType::kUnsubscribe: return "UNSUBSCRIBE"; - case MoqtMessageType::kSubscribeDone: + case MoqtMessageType::kPublishDone: return "SUBSCRIBE_DONE"; case MoqtMessageType::kSubscribeUpdate: return "SUBSCRIBE_UPDATE"; - case MoqtMessageType::kAnnounceCancel: - return "ANNOUNCE_CANCEL"; - case MoqtMessageType::kTrackStatusRequest: - return "TRACK_STATUS_REQUEST"; + case MoqtMessageType::kPublishNamespaceCancel: + return "PUBLISH_NAMESPACE_CANCEL"; case MoqtMessageType::kTrackStatus: return "TRACK_STATUS"; - case MoqtMessageType::kAnnounce: - return "ANNOUNCE"; - case MoqtMessageType::kAnnounceOk: - return "ANNOUNCE_OK"; - case MoqtMessageType::kAnnounceError: - return "ANNOUNCE_ERROR"; - case MoqtMessageType::kUnannounce: - return "UNANNOUNCE"; + case MoqtMessageType::kTrackStatusOk: + return "TRACK_STATUS_OK"; + case MoqtMessageType::kTrackStatusError: + return "TRACK_STATUS_ERROR"; + case MoqtMessageType::kPublishNamespace: + return "PUBLISH_NAMESPACE"; + case MoqtMessageType::kPublishNamespaceOk: + return "PUBLISH_NAMESPACE_OK"; + case MoqtMessageType::kPublishNamespaceError: + return "PUBLISH_NAMESPACE_ERROR"; + case MoqtMessageType::kPublishNamespaceDone: + return "PUBLISH_NAMESPACE_DONE"; case MoqtMessageType::kGoAway: return "GOAWAY"; - case MoqtMessageType::kSubscribeAnnounces: + case MoqtMessageType::kSubscribeNamespace: return "SUBSCRIBE_NAMESPACE"; - case MoqtMessageType::kSubscribeAnnouncesOk: + case MoqtMessageType::kSubscribeNamespaceOk: return "SUBSCRIBE_NAMESPACE_OK"; - case MoqtMessageType::kSubscribeAnnouncesError: + case MoqtMessageType::kSubscribeNamespaceError: return "SUBSCRIBE_NAMESPACE_ERROR"; - case MoqtMessageType::kUnsubscribeAnnounces: + case MoqtMessageType::kUnsubscribeNamespace: return "UNSUBSCRIBE_NAMESPACE"; case MoqtMessageType::kMaxRequestId: return "MAX_REQUEST_ID"; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_messages.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_messages.h index d1979be0f8..6e6439459d 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_messages.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_messages.h @@ -29,7 +29,9 @@ #include "quiche/quic/moqt/moqt_priority.h" #include "quiche/common/platform/api/quiche_bug_tracker.h" #include "quiche/common/platform/api/quiche_export.h" +#include "quiche/common/platform/api/quiche_logging.h" #include "quiche/common/quiche_callbacks.h" +#include "quiche/common/quiche_data_writer.h" #include "quiche/web_transport/web_transport.h" namespace moqt { @@ -39,17 +41,18 @@ inline constexpr quic::ParsedQuicVersionVector GetMoqtSupportedQuicVersions() { } enum class MoqtVersion : uint64_t { - kDraft12 = 0xff00000c, + kDraft14 = 0xff00000e, kUnrecognizedVersionForTests = 0xfe0000ff, }; -inline constexpr MoqtVersion kDefaultMoqtVersion = MoqtVersion::kDraft12; +inline constexpr MoqtVersion kDefaultMoqtVersion = MoqtVersion::kDraft14; inline constexpr uint64_t kDefaultInitialMaxRequestId = 100; // TODO(martinduke): Implement an auth token cache. inline constexpr uint64_t kDefaultMaxAuthTokenCacheSize = 0; inline constexpr uint64_t kMinNamespaceElements = 1; inline constexpr uint64_t kMaxNamespaceElements = 32; inline constexpr size_t kMaxFullTrackNameSize = 1024; +inline constexpr uint64_t kMaxObjectId = quiche::kVarInt62MaxValue; enum AuthTokenType : uint64_t { kOutOfBand = 0x0, @@ -80,16 +83,19 @@ struct QUICHE_EXPORT MoqtSessionParameters { MoqtSessionParameters() = default; explicit MoqtSessionParameters(quic::Perspective perspective) : perspective(perspective), using_webtrans(true) {} - MoqtSessionParameters(quic::Perspective perspective, std::string path) + MoqtSessionParameters(quic::Perspective perspective, std::string path, + std::string authority) : perspective(perspective), using_webtrans(false), - path(std::move(path)) {} + path(std::move(path)), + authority(std::move(authority)) {} MoqtSessionParameters(quic::Perspective perspective, std::string path, - uint64_t max_request_id) + std::string authority, uint64_t max_request_id) : perspective(perspective), using_webtrans(true), path(std::move(path)), - max_request_id(max_request_id) {} + max_request_id(max_request_id), + authority(std::move(authority)) {} MoqtSessionParameters(quic::Perspective perspective, uint64_t max_request_id) : perspective(perspective), max_request_id(max_request_id) {} bool operator==(const MoqtSessionParameters& other) const = default; @@ -98,12 +104,14 @@ struct QUICHE_EXPORT MoqtSessionParameters { bool deliver_partial_objects = false; quic::Perspective perspective = quic::Perspective::IS_SERVER; bool using_webtrans = true; - std::string path = ""; + std::string path; uint64_t max_request_id = kDefaultInitialMaxRequestId; uint64_t max_auth_token_cache_size = kDefaultMaxAuthTokenCacheSize; bool support_object_acks = false; // TODO(martinduke): Turn authorization_token into structured data. std::vector authorization_token; + std::string authority; + std::string moqt_implementation = "Google QUICHE MOQT draft 14"; }; // The maximum length of a message, excluding any OBJECT payload. This prevents @@ -113,102 +121,129 @@ inline constexpr size_t kMaxMessageHeaderSize = 2048; class QUICHE_EXPORT MoqtDataStreamType { public: + static constexpr uint64_t kFetch = 0x05; + static constexpr uint64_t kPadding = 0x26d3; + static constexpr uint64_t kSubgroupFlag = 0x10; + static constexpr uint64_t kExtensionFlag = 0x01; + static constexpr uint64_t kEndOfGroupFlag = 0x08; + // These two cannot simultaneously be true; + static constexpr uint64_t kFirstObjectIdFlag = 0x02; + static constexpr uint64_t kSubgroupIdFlag = 0x04; + // Factory functions. static std::optional FromValue(uint64_t value) { - MoqtDataStreamType stream_type(static_cast(value)); + MoqtDataStreamType stream_type(value); if (stream_type.IsFetch() || stream_type.IsPadding() || - stream_type.IsSubgroup()) { + (!((value & kSubgroupIdFlag) && (value & kFirstObjectIdFlag)) && + stream_type.IsSubgroup())) { return stream_type; } return std::nullopt; } - static MoqtDataStreamType Fetch() { - return MoqtDataStreamType(StreamType::kFetch); - } - static MoqtDataStreamType Padding() { - return MoqtDataStreamType(StreamType::kPadding); - } + static MoqtDataStreamType Fetch() { return MoqtDataStreamType(kFetch); } + static MoqtDataStreamType Padding() { return MoqtDataStreamType(kPadding); } static MoqtDataStreamType Subgroup(uint64_t subgroup_id, uint64_t first_object_id, - bool no_extension_headers) { + bool no_extension_headers, + bool end_of_group = false) { + uint64_t value = kSubgroupFlag; + if (!no_extension_headers) { + value |= kExtensionFlag; + } + if (end_of_group) { + value |= kEndOfGroupFlag; + } if (subgroup_id == 0) { - return MoqtDataStreamType( - no_extension_headers ? StreamType::kSubgroup0NoExtensionHeaders - : StreamType::kSubgroup0WithExtensionHeaders); + return MoqtDataStreamType(value); } if (subgroup_id == first_object_id) { - return MoqtDataStreamType( - no_extension_headers - ? StreamType::kSubgroupFirstObjectNoExtensionHeaders - : StreamType::kSubgroupFirstObjectWithExtensionHeaders); + value |= kFirstObjectIdFlag; + } else { + value |= kSubgroupIdFlag; } - return MoqtDataStreamType( - no_extension_headers - ? StreamType::kSubgroupExplicitNoExtensionHeaders - : StreamType::kSubgroupExplicitWithExtensionHeaders); + return MoqtDataStreamType(value); } MoqtDataStreamType(const MoqtDataStreamType& other) = default; - bool IsFetch() const { return value_ == StreamType::kFetch; } - bool IsPadding() const { return value_ == StreamType::kPadding; } + bool IsFetch() const { return value_ == kFetch; } + bool IsPadding() const { return value_ == kPadding; } bool IsSubgroup() const { - return value_ >= StreamType::kSubgroup0NoExtensionHeaders && - value_ <= StreamType::kSubgroupExplicitWithExtensionHeaders; + QUICHE_CHECK( + !((value_ & kSubgroupIdFlag) && (value_ & kFirstObjectIdFlag))); + return (value_ & kSubgroupFlag) && (value_ & ~0x1f) == 0; } bool IsSubgroupPresent() const { - return value_ == StreamType::kSubgroupExplicitNoExtensionHeaders || - value_ == StreamType::kSubgroupExplicitWithExtensionHeaders; + return IsSubgroup() && (value_ & kSubgroupIdFlag); } bool SubgroupIsZero() const { - return value_ == StreamType::kSubgroup0NoExtensionHeaders || - value_ == StreamType::kSubgroup0WithExtensionHeaders; + return IsSubgroup() && !(value_ & kSubgroupIdFlag) && + !(value_ & kFirstObjectIdFlag); } bool SubgroupIsFirstObjectId() const { - return value_ == StreamType::kSubgroupFirstObjectNoExtensionHeaders || - value_ == StreamType::kSubgroupFirstObjectWithExtensionHeaders; + return IsSubgroup() && (value_ & kFirstObjectIdFlag); } bool AreExtensionHeadersPresent() const { - return value_ == StreamType::kSubgroup0WithExtensionHeaders || - value_ == StreamType::kSubgroupFirstObjectWithExtensionHeaders || - value_ == StreamType::kSubgroupExplicitWithExtensionHeaders; + return IsSubgroup() && (value_ & kExtensionFlag); } - uint64_t value() const { return static_cast(value_); } + bool EndOfGroupInStream() const { + return IsSubgroup() && (value_ & kEndOfGroupFlag); + } + + uint64_t value() const { return value_; } bool operator==(const MoqtDataStreamType& other) const = default; - enum class StreamType : uint64_t { - kFetch = 0x05, - kSubgroup0NoExtensionHeaders = 0x08, - kSubgroup0WithExtensionHeaders = 0x09, - kSubgroupFirstObjectNoExtensionHeaders = 0x0a, - kSubgroupFirstObjectWithExtensionHeaders = 0x0b, - kSubgroupExplicitNoExtensionHeaders = 0x0c, - kSubgroupExplicitWithExtensionHeaders = 0x0d, - kPadding = 0x26d3, - }; private: - explicit MoqtDataStreamType(StreamType value) : value_(value) {} - const StreamType value_; + explicit MoqtDataStreamType(uint64_t value) : value_(value) {} + const uint64_t value_; }; class QUICHE_EXPORT MoqtDatagramType { public: - MoqtDatagramType(bool has_status, bool has_extension) : value_(0) { - if (has_status) { + // The arguments here are properties of the object. The constructor creates + // the appropriate type given those properties and the spec restrictions. + MoqtDatagramType(bool payload, bool extension, bool end_of_group, + bool zero_object_id) + : value_(0) { + // Avoid illegal types. Status cannot coexist with the zero-object-id flag + // or the end-of-group flag. + if (!payload && !end_of_group) { + // The only way to express non-normal, non-end-of-group with no payload is + // with an explicit status, so we cannot utilize object ID compression. + zero_object_id = false; + } else if (zero_object_id) { + // zero-object-id saves a byte; no-payload does not. + payload = true; + } else if (!payload) { + // If it's an empty end-of-group object, use the explict status because + // it's more readable. + end_of_group = false; + } + if (extension) { + value_ |= 0x01; + } + if (end_of_group) { value_ |= 0x02; } - if (has_extension) { - value_ |= 0x01; + if (zero_object_id) { + value_ |= 0x04; + } + if (!payload) { + value_ |= 0x20; } } static std::optional FromValue(uint64_t value) { - if (value <= 3) { + if (value <= 7 || value == 0x20 || value == 0x21) { return MoqtDatagramType(value); } return std::nullopt; } - bool has_status() const { return value_ & 0x02; } + bool has_status() const { return value_ & 0x20; } + bool has_object_id() const { return !(value_ & 0x04); } + bool end_of_group() const { return value_ & 0x02; } bool has_extension() const { return value_ & 0x01; } uint64_t value() const { return value_; } + bool operator==(const MoqtDatagramType& other) const = default; + private: uint64_t value_; explicit MoqtDatagramType(uint64_t value) : value_(value) {} @@ -219,20 +254,21 @@ enum class QUICHE_EXPORT MoqtMessageType : uint64_t { kSubscribe = 0x03, kSubscribeOk = 0x04, kSubscribeError = 0x05, - kAnnounce = 0x06, - kAnnounceOk = 0x7, - kAnnounceError = 0x08, - kUnannounce = 0x09, + kPublishNamespace = 0x06, + kPublishNamespaceOk = 0x7, + kPublishNamespaceError = 0x08, + kPublishNamespaceDone = 0x09, kUnsubscribe = 0x0a, - kSubscribeDone = 0x0b, - kAnnounceCancel = 0x0c, - kTrackStatusRequest = 0x0d, - kTrackStatus = 0x0e, + kPublishDone = 0x0b, + kPublishNamespaceCancel = 0x0c, + kTrackStatus = 0x0d, + kTrackStatusOk = 0x0e, + kTrackStatusError = 0x0f, kGoAway = 0x10, - kSubscribeAnnounces = 0x11, - kSubscribeAnnouncesOk = 0x12, - kSubscribeAnnouncesError = 0x13, - kUnsubscribeAnnounces = 0x14, + kSubscribeNamespace = 0x11, + kSubscribeNamespaceOk = 0x12, + kSubscribeNamespaceError = 0x13, + kUnsubscribeNamespace = 0x14, kMaxRequestId = 0x15, kFetch = 0x16, kFetchCancel = 0x17, @@ -269,6 +305,11 @@ enum class QUICHE_EXPORT MoqtError : uint64_t { kAuthTokenCacheOverflow = 0x13, kDuplicateAuthTokenAlias = 0x14, kVersionNegotiationFailed = 0x15, + kMalformedAuthToken = 0x16, + kUnknownAuthTokenAlias = 0x17, + kExpiredAuthToken = 0x18, + kInvalidAuthority = 0x19, + kMalformedAuthority = 0x1a, }; // Error codes used by MoQT to reset streams. @@ -285,6 +326,8 @@ enum class QUICHE_EXPORT SetupParameter : uint64_t { kMaxRequestId = 0x2, kAuthorizationToken = 0x3, kMaxAuthTokenCacheSize = 0x4, + kAuthority = 0x5, + kMoqtImplementation = 0x7, // QUICHE-specific extensions. // Indicates support for OACK messages. @@ -309,7 +352,7 @@ struct VersionSpecificParameters { max_cache_duration(max_cache_duration) {} VersionSpecificParameters(AuthTokenType token_type, absl::string_view token) { authorization_token.emplace_back(token_type, token); - }; + } VersionSpecificParameters(quic::QuicTimeDelta delivery_timeout, AuthTokenType token_type, absl::string_view token) : delivery_timeout(delivery_timeout) { @@ -325,29 +368,34 @@ struct VersionSpecificParameters { bool operator==(const VersionSpecificParameters& other) const = default; }; -// Used for SUBSCRIBE_ERROR, ANNOUNCE_ERROR, ANNOUNCE_CANCEL, -// SUBSCRIBE_ANNOUNCES_ERROR, and FETCH_ERROR. +// Used for SUBSCRIBE_ERROR, PUBLISH_NAMESPACE_ERROR, PUBLISH_NAMESPACE_CANCEL, +// SUBSCRIBE_NAMESPACE_ERROR, and FETCH_ERROR. enum class QUICHE_EXPORT RequestErrorCode : uint64_t { kInternalError = 0x0, kUnauthorized = 0x1, kTimeout = 0x2, kNotSupported = 0x3, - kTrackDoesNotExist = 0x4, // SUBSCRIBE_ERROR and FETCH_ERROR only. - kUninterested = 0x4, // ANNOUNCE_ERROR and ANNOUNCE_CANCEL only. - kNamespacePrefixUnknown = 0x4, // SUBSCRIBE_ANNOUNCES_ERROR only. - kInvalidRange = 0x5, // SUBSCRIBE_ERROR and FETCH_ERROR only. - kNamespacePrefixOverlap = 0x5, // SUBSCRIBE_ANNOUNCES_ERROR only. - kNoObjects = 0x6, // FETCH_ERROR only. - kInvalidJoiningSubscribeId = 0x7, // FETCH_ERROR only. + kTrackDoesNotExist = 0x4, // SUBSCRIBE_ERROR and FETCH_ERROR only. + kUninterested = + 0x4, // PUBLISH_NAMESPACE_ERROR and PUBLISH_NAMESPACE_CANCEL only. + kNamespacePrefixUnknown = 0x4, // SUBSCRIBE_NAMESPACE_ERROR only. + kInvalidRange = 0x5, // SUBSCRIBE_ERROR and FETCH_ERROR only. + kNamespacePrefixOverlap = 0x5, // SUBSCRIBE_NAMESPACE_ERROR only. + kNoObjects = 0x6, // FETCH_ERROR only. + kInvalidJoiningRequestId = 0x7, // FETCH_ERROR only. + kUnknownStatusInRange = 0x8, // FETCH_ERROR only. + kMalformedTrack = 0x9, kMalformedAuthToken = 0x10, kExpiredAuthToken = 0x12, }; -struct MoqtSubscribeErrorReason { +struct MoqtRequestError { RequestErrorCode error_code; std::string reason_phrase; }; -using MoqtAnnounceErrorReason = MoqtSubscribeErrorReason; +// TODO(martinduke): These are deprecated. Replace them in the code. +using MoqtSubscribeErrorReason = MoqtRequestError; +using MoqtPublishNamespaceErrorReason = MoqtSubscribeErrorReason; class TrackNamespace { public: @@ -371,6 +419,14 @@ class TrackNamespace { length_ + element.length() <= kMaxFullTrackNameSize); } void AddElement(absl::string_view element); + bool PopElement() { + if (tuple_.size() == 1) { + return false; + } + length_ -= tuple_.back().length(); + tuple_.pop_back(); + return true; + } std::string ToString() const; // Returns the number of elements in the tuple. size_t number_of_elements() const { return tuple_.size(); } @@ -462,7 +518,15 @@ struct Location { // https://moq-wg.github.io/moq-transport/draft-ietf-moq-transport.html#location-structure auto operator<=>(const Location&) const = default; - Location next() const { return Location(group, object + 1); } + Location Next() const { + if (object == kMaxObjectId) { + if (group == kMaxObjectId) { + return Location(0, 0); + } + return Location(group + 1, 0); + } + return Location(group, object + 1); + } template friend H AbslHashValue(H h, const Location& m); @@ -473,6 +537,25 @@ struct Location { } }; +// A tuple uniquely identifying a WebTransport data stream associated with a +// subscription. By convention, if a DataStreamIndex is necessary for a datagram +// track, `subgroup` is set to zero. +struct DataStreamIndex { + uint64_t group = 0; + uint64_t subgroup = 0; + + DataStreamIndex() = default; + DataStreamIndex(uint64_t group, uint64_t subgroup) + : group(group), subgroup(subgroup) {} + + auto operator<=>(const DataStreamIndex&) const = default; + + template + friend H AbslHashValue(H h, const DataStreamIndex& index) { + return H::combine(std::move(h), index.group, index.subgroup); + } +}; + struct SubgroupPriority { uint8_t publisher_priority = 0xf0; uint64_t subgroup_id = 0; @@ -648,7 +731,7 @@ struct QUICHE_EXPORT MoqtUnsubscribe { uint64_t request_id; }; -enum class QUICHE_EXPORT SubscribeDoneCode : uint64_t { +enum class QUICHE_EXPORT PublishDoneCode : uint64_t { kInternalError = 0x0, kUnauthorized = 0x1, kTrackEnded = 0x2, @@ -659,9 +742,9 @@ enum class QUICHE_EXPORT SubscribeDoneCode : uint64_t { kMalformedTrack = 0x7, }; -struct QUICHE_EXPORT MoqtSubscribeDone { +struct QUICHE_EXPORT MoqtPublishDone { uint64_t request_id; - SubscribeDoneCode status_code; + PublishDoneCode status_code; uint64_t stream_count; std::string error_reason; }; @@ -675,87 +758,70 @@ struct QUICHE_EXPORT MoqtSubscribeUpdate { VersionSpecificParameters parameters; }; -struct QUICHE_EXPORT MoqtAnnounce { +struct QUICHE_EXPORT MoqtPublishNamespace { uint64_t request_id; TrackNamespace track_namespace; VersionSpecificParameters parameters; }; -struct QUICHE_EXPORT MoqtAnnounceOk { +struct QUICHE_EXPORT MoqtPublishNamespaceOk { uint64_t request_id; }; -struct QUICHE_EXPORT MoqtAnnounceError { +struct QUICHE_EXPORT MoqtPublishNamespaceError { uint64_t request_id; RequestErrorCode error_code; std::string error_reason; }; -struct QUICHE_EXPORT MoqtUnannounce { +struct QUICHE_EXPORT MoqtPublishNamespaceDone { TrackNamespace track_namespace; }; -struct QUICHE_EXPORT MoqtAnnounceCancel { +struct QUICHE_EXPORT MoqtPublishNamespaceCancel { TrackNamespace track_namespace; RequestErrorCode error_code; std::string error_reason; }; -enum class QUICHE_EXPORT MoqtTrackStatusCode : uint64_t { - kInProgress = 0x0, - kDoesNotExist = 0x1, - kNotYetBegun = 0x2, - kFinished = 0x3, - kStatusNotAvailable = 0x4, +struct QUICHE_EXPORT MoqtTrackStatus : public MoqtSubscribe { + MoqtTrackStatus() = default; + MoqtTrackStatus(MoqtSubscribe subscribe) : MoqtSubscribe(subscribe) {} }; -inline bool DoesTrackStatusImplyHavingData(MoqtTrackStatusCode code) { - switch (code) { - case MoqtTrackStatusCode::kInProgress: - case MoqtTrackStatusCode::kFinished: - return true; - case MoqtTrackStatusCode::kDoesNotExist: - case MoqtTrackStatusCode::kNotYetBegun: - case MoqtTrackStatusCode::kStatusNotAvailable: - return false; - } - return false; -} - -struct QUICHE_EXPORT MoqtTrackStatusRequest { - uint64_t request_id; - FullTrackName full_track_name; - VersionSpecificParameters parameters; +struct QUICHE_EXPORT MoqtTrackStatusOk : public MoqtSubscribeOk { + MoqtTrackStatusOk() = default; + MoqtTrackStatusOk(MoqtSubscribeOk subscribe_ok) + : MoqtSubscribeOk(subscribe_ok) {} }; -struct QUICHE_EXPORT MoqtTrackStatus { - uint64_t request_id; - MoqtTrackStatusCode status_code; - Location largest_location; - VersionSpecificParameters parameters; +struct QUICHE_EXPORT MoqtTrackStatusError : public MoqtSubscribeError { + MoqtTrackStatusError() = default; + MoqtTrackStatusError(MoqtSubscribeError subscribe_error) + : MoqtSubscribeError(subscribe_error) {} }; struct QUICHE_EXPORT MoqtGoAway { std::string new_session_uri; }; -struct QUICHE_EXPORT MoqtSubscribeAnnounces { +struct QUICHE_EXPORT MoqtSubscribeNamespace { uint64_t request_id; TrackNamespace track_namespace; VersionSpecificParameters parameters; }; -struct QUICHE_EXPORT MoqtSubscribeAnnouncesOk { +struct QUICHE_EXPORT MoqtSubscribeNamespaceOk { uint64_t request_id; }; -struct QUICHE_EXPORT MoqtSubscribeAnnouncesError { +struct QUICHE_EXPORT MoqtSubscribeNamespaceError { uint64_t request_id; RequestErrorCode error_code; std::string error_reason; }; -struct QUICHE_EXPORT MoqtUnsubscribeAnnounces { +struct QUICHE_EXPORT MoqtUnsubscribeNamespace { TrackNamespace track_namespace; }; @@ -771,20 +837,18 @@ enum class QUICHE_EXPORT FetchType : uint64_t { struct StandaloneFetch { StandaloneFetch() = default; - StandaloneFetch(FullTrackName full_track_name, Location start_object, - uint64_t end_group, std::optional end_object) + StandaloneFetch(FullTrackName full_track_name, Location start_location, + Location end_location) : full_track_name(full_track_name), - start_object(start_object), - end_group(end_group), - end_object(end_object) {} + start_location(start_location), + end_location(end_location) {} FullTrackName full_track_name; - Location start_object; // subgroup is ignored - uint64_t end_group; - std::optional end_object; + Location start_location; + Location end_location; bool operator==(const StandaloneFetch& other) const { return full_track_name == other.full_track_name && - start_object == other.start_object && end_group == other.end_group && - end_object == other.end_object; + start_location == other.start_location && + end_location == other.end_location; } bool operator!=(const StandaloneFetch& other) const { return !(*this == other); @@ -792,13 +856,12 @@ struct StandaloneFetch { }; struct JoiningFetchRelative { - JoiningFetchRelative(uint64_t joining_subscribe_id, uint64_t joining_start) - : joining_subscribe_id(joining_subscribe_id), - joining_start(joining_start) {} - uint64_t joining_subscribe_id; + JoiningFetchRelative(uint64_t joining_request_id, uint64_t joining_start) + : joining_request_id(joining_request_id), joining_start(joining_start) {} + uint64_t joining_request_id; uint64_t joining_start; bool operator==(const JoiningFetchRelative& other) const { - return joining_subscribe_id == other.joining_subscribe_id && + return joining_request_id == other.joining_request_id && joining_start == other.joining_start; } bool operator!=(const JoiningFetchRelative& other) const { @@ -807,13 +870,12 @@ struct JoiningFetchRelative { }; struct JoiningFetchAbsolute { - JoiningFetchAbsolute(uint64_t joining_subscribe_id, uint64_t joining_start) - : joining_subscribe_id(joining_subscribe_id), - joining_start(joining_start) {} - uint64_t joining_subscribe_id; + JoiningFetchAbsolute(uint64_t joining_request_id, uint64_t joining_start) + : joining_request_id(joining_request_id), joining_start(joining_start) {} + uint64_t joining_request_id; uint64_t joining_start; bool operator==(const JoiningFetchAbsolute& other) const { - return joining_subscribe_id == other.joining_subscribe_id && + return joining_request_id == other.joining_request_id && joining_start == other.joining_start; } bool operator!=(const JoiningFetchAbsolute& other) const { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_cached_object.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_object.cc similarity index 88% rename from naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_cached_object.cc rename to naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_object.cc index df71f1c345..3ee1a72bd3 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_cached_object.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_object.cc @@ -2,10 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "quiche/quic/moqt/moqt_cached_object.h" +#include "quiche/quic/moqt/moqt_object.h" #include "absl/strings/string_view.h" -#include "quiche/quic/moqt/moqt_publisher.h" #include "quiche/common/quiche_mem_slice.h" namespace moqt { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_object.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_object.h new file mode 100644 index 0000000000..13130d9413 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_object.h @@ -0,0 +1,49 @@ +// Copyright 2024 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_MOQT_MOQT_OBJECT_H_ +#define QUICHE_QUIC_MOQT_MOQT_OBJECT_H_ + +#include +#include +#include + +#include "quiche/quic/core/quic_time.h" +#include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_priority.h" +#include "quiche/common/quiche_mem_slice.h" + +namespace moqt { + +struct PublishedObjectMetadata { + Location location; + uint64_t subgroup; // Equal to object_id for datagrams. + std::string extensions; + MoqtObjectStatus status; + MoqtPriority publisher_priority; + quic::QuicTime arrival_time = quic::QuicTime::Zero(); +}; + +// PublishedObject is a description of an object that is sufficient to publish +// it on a given track. +struct PublishedObject { + PublishedObjectMetadata metadata; + quiche::QuicheMemSlice payload; + bool fin_after_this = false; +}; + +// CachedObject is a version of PublishedObject with a reference counted +// payload. +struct CachedObject { + PublishedObjectMetadata metadata; + std::shared_ptr payload; + bool fin_after_this; // This is the last object before FIN. +}; + +// Transforms a CachedObject into a PublishedObject. +PublishedObject CachedObjectToPublishedObject(const CachedObject& object); + +} // namespace moqt + +#endif // QUICHE_QUIC_MOQT_MOQT_OBJECT_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_outgoing_queue.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_outgoing_queue.cc index 324fa67d12..7ef08c1860 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_outgoing_queue.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_outgoing_queue.cc @@ -6,7 +6,6 @@ #include #include -#include #include #include #include @@ -15,9 +14,9 @@ #include "absl/algorithm/container.h" #include "absl/status/status.h" #include "absl/status/statusor.h" -#include "quiche/quic/moqt/moqt_cached_object.h" -#include "quiche/quic/moqt/moqt_failed_fetch.h" +#include "quiche/quic/moqt/moqt_fetch_task.h" #include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_priority.h" #include "quiche/quic/moqt/moqt_publisher.h" #include "quiche/quic/moqt/moqt_subscribe_windows.h" @@ -26,6 +25,19 @@ namespace moqt { +namespace { +void ObjectsInDescendingOrder(std::vector& objects) { + absl::c_reverse(objects); + for (auto it = objects.begin(); it != objects.end();) { + auto start_it = it; + while (it != objects.end() && it->group == start_it->group) { + ++it; + } + std::reverse(start_it, it); + } +} +} // namespace + void MoqtOutgoingQueue::AddObject(quiche::QuicheMemSlice payload, bool key) { if (queue_.empty() && !key) { QUICHE_BUG(MoqtOutgoingQueue_AddObject_first_object_not_key) @@ -66,11 +78,12 @@ void MoqtOutgoingQueue::AddRawObject(MoqtObjectStatus status, bool fin = forwarding_preference_ == MoqtForwardingPreference::kSubgroup && status == MoqtObjectStatus::kEndOfGroup; queue_.back().push_back(CachedObject{ - PublishedObjectMetadata{sequence, 0, status, publisher_priority_, + PublishedObjectMetadata{sequence, 0, "", status, publisher_priority_, clock_->ApproximateNow()}, std::make_shared(std::move(payload)), fin}); for (MoqtObjectListener* listener : listeners_) { - listener->OnNewObjectAvailable(sequence, /*subgroup=*/0); + listener->OnNewObjectAvailable(sequence, /*subgroup=*/0, + publisher_priority_); } } @@ -80,7 +93,7 @@ std::optional MoqtOutgoingQueue::GetCachedObject( if (group < first_group_in_queue()) { if (object == 0) { return PublishedObject{PublishedObjectMetadata{ - Location(group, object), /*subgroup=*/0, + Location(group, object), /*subgroup=*/0, "", MoqtObjectStatus::kEndOfGroup, publisher_priority_, clock_->ApproximateNow()}, quiche::QuicheMemSlice{}}; @@ -103,7 +116,7 @@ std::optional MoqtOutgoingQueue::GetCachedObject( std::vector MoqtOutgoingQueue::GetCachedObjectsInRange( Location start, Location end) const { std::vector sequences; - SubscribeWindow window(start, end.group, end.object); + SubscribeWindow window(start, end); for (const Group& group : queue_) { for (const CachedObject& object : group) { if (window.InWindow(object.metadata.location)) { @@ -114,35 +127,20 @@ std::vector MoqtOutgoingQueue::GetCachedObjectsInRange( return sequences; } -absl::StatusOr MoqtOutgoingQueue::GetTrackStatus() const { - if (closed_) { - return MoqtTrackStatusCode::kFinished; - } +std::optional MoqtOutgoingQueue::largest_location() const { if (queue_.empty()) { - return MoqtTrackStatusCode::kNotYetBegun; - } - return MoqtTrackStatusCode::kInProgress; -} - -Location MoqtOutgoingQueue::GetLargestLocation() const { - if (queue_.empty()) { - QUICHE_BUG(MoqtOutgoingQueue_GetLargestLocation_not_begun) - << "Calling GetLargestLocation() on a track that hasn't begun"; - return Location{0, 0}; + return std::nullopt; } return Location{current_group_id_, queue_.back().size() - 1}; } -std::unique_ptr MoqtOutgoingQueue::Fetch( - Location start, uint64_t end_group, std::optional end_object, - MoqtDeliveryOrder order) { +std::unique_ptr MoqtOutgoingQueue::StandaloneFetch( + Location start, Location end, std::optional order) { if (queue_.empty()) { return std::make_unique( absl::NotFoundError("No objects available on the track")); } - Location end = Location( - end_group, end_object.value_or(std::numeric_limits::max())); Location first_available_object = Location(first_group_in_queue(), 0); Location last_available_object = Location(current_group_id_, queue_.back().size() - 1); @@ -160,15 +158,51 @@ std::unique_ptr MoqtOutgoingQueue::Fetch( Location adjusted_end = std::min(end, last_available_object); std::vector objects = GetCachedObjectsInRange(adjusted_start, adjusted_end); + // Default to ascending order. if (order == MoqtDeliveryOrder::kDescending) { - absl::c_reverse(objects); - for (auto it = objects.begin(); it != objects.end();) { - auto start_it = it; - while (it != objects.end() && it->group == start_it->group) { - ++it; - } - std::reverse(start_it, it); - } + ObjectsInDescendingOrder(objects); + } + return std::make_unique(this, std::move(objects)); +} + +std::unique_ptr MoqtOutgoingQueue::RelativeFetch( + uint64_t group_diff, std::optional order) { + if (queue_.empty()) { + return std::make_unique( + absl::NotFoundError("No objects available on the track")); + } + + uint64_t start_group = (group_diff > first_group_in_queue()) + ? 0 + : current_group_id_ - group_diff; + start_group = std::max(start_group, first_group_in_queue()); + Location start = Location(start_group, 0); + Location end = Location(current_group_id_, queue_.back().size() - 1); + + std::vector objects = GetCachedObjectsInRange(start, end); + if (order == MoqtDeliveryOrder::kDescending) { + ObjectsInDescendingOrder(objects); + } + return std::make_unique(this, std::move(objects)); +} + +std::unique_ptr MoqtOutgoingQueue::AbsoluteFetch( + uint64_t group, std::optional order) { + if (queue_.empty()) { + return std::make_unique( + absl::NotFoundError("No objects available on the track")); + } + + Location start(std::max(group, first_group_in_queue()), 0); + Location end = Location(current_group_id_, queue_.back().size() - 1); + if (start > end) { + return std::make_unique( + absl::NotFoundError("All of the requested objects are in the future")); + } + + std::vector objects = GetCachedObjectsInRange(start, end); + if (order == MoqtDeliveryOrder::kDescending) { + ObjectsInDescendingOrder(objects); } return std::make_unique(this, std::move(objects)); } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_outgoing_queue.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_outgoing_queue.h index c61b22002f..5aa0b80714 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_outgoing_queue.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_outgoing_queue.h @@ -15,11 +15,11 @@ #include "absl/container/flat_hash_set.h" #include "absl/container/inlined_vector.h" #include "absl/status/status.h" -#include "absl/status/statusor.h" #include "quiche/quic/core/quic_clock.h" #include "quiche/quic/core/quic_default_clock.h" -#include "quiche/quic/moqt/moqt_cached_object.h" +#include "quiche/quic/core/quic_time.h" #include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_priority.h" #include "quiche/quic/moqt/moqt_publisher.h" #include "quiche/common/quiche_circular_deque.h" @@ -63,20 +63,26 @@ class MoqtOutgoingQueue : public MoqtTrackPublisher { void RemoveObjectListener(MoqtObjectListener* listener) override { listeners_.erase(listener); } - absl::StatusOr GetTrackStatus() const override; - Location GetLargestLocation() const override; - MoqtForwardingPreference GetForwardingPreference() const override { + + std::optional largest_location() const override; + std::optional forwarding_preference() + const override { return forwarding_preference_; } - MoqtPriority GetPublisherPriority() const override { - return publisher_priority_; - } - MoqtDeliveryOrder GetDeliveryOrder() const override { + std::optional delivery_order() const override { return delivery_order_; } - std::unique_ptr Fetch(Location start, uint64_t end_group, - std::optional end_object, - MoqtDeliveryOrder order) override; + std::optional expiration() const override { + return quic::QuicTimeDelta::Zero(); + } + + std::unique_ptr StandaloneFetch( + Location start, Location end, + std::optional order) override; + std::unique_ptr RelativeFetch( + uint64_t group_diff, std::optional order) override; + std::unique_ptr AbsoluteFetch( + uint64_t group, std::optional order) override; bool HasSubscribers() const { return !listeners_.empty(); } void SetDeliveryOrder(MoqtDeliveryOrder order) { @@ -99,6 +105,9 @@ class MoqtOutgoingQueue : public MoqtTrackPublisher { std::vector GetCachedObjectsInRange(Location start, Location end) const; + protected: + MoqtPriority publisher_priority() const { return publisher_priority_; } + private: // The number of recent groups to keep around for newly joined subscribers. static constexpr size_t kMaxQueuedGroups = 3; @@ -141,7 +150,7 @@ class MoqtOutgoingQueue : public MoqtTrackPublisher { ok.end_location = *(objects_.cbegin()); } ok.end_of_track = - queue_->closed_ && ok.end_location == queue_->GetLargestLocation(); + queue_->closed_ && ok.end_location == queue_->largest_location(); std::move(callback)(ok); } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_parser.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_parser.cc index 498ea148fe..3c1fc9f055 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_parser.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_parser.cc @@ -20,6 +20,7 @@ #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "absl/types/span.h" +#include "quiche/http2/adapter/header_validator.h" #include "quiche/quic/core/quic_data_reader.h" #include "quiche/quic/core/quic_time.h" #include "quiche/quic/core/quic_types.h" @@ -231,47 +232,50 @@ size_t MoqtControlParser::ProcessMessage(absl::string_view data, case MoqtMessageType::kUnsubscribe: bytes_read = ProcessUnsubscribe(reader); break; - case MoqtMessageType::kSubscribeDone: - bytes_read = ProcessSubscribeDone(reader); + case MoqtMessageType::kPublishDone: + bytes_read = ProcessPublishDone(reader); break; case MoqtMessageType::kSubscribeUpdate: bytes_read = ProcessSubscribeUpdate(reader); break; - case MoqtMessageType::kAnnounce: - bytes_read = ProcessAnnounce(reader); + case MoqtMessageType::kPublishNamespace: + bytes_read = ProcessPublishNamespace(reader); break; - case MoqtMessageType::kAnnounceOk: - bytes_read = ProcessAnnounceOk(reader); + case MoqtMessageType::kPublishNamespaceOk: + bytes_read = ProcessPublishNamespaceOk(reader); break; - case MoqtMessageType::kAnnounceError: - bytes_read = ProcessAnnounceError(reader); + case MoqtMessageType::kPublishNamespaceError: + bytes_read = ProcessPublishNamespaceError(reader); break; - case MoqtMessageType::kAnnounceCancel: - bytes_read = ProcessAnnounceCancel(reader); + case MoqtMessageType::kPublishNamespaceDone: + bytes_read = ProcessPublishNamespaceDone(reader); break; - case MoqtMessageType::kTrackStatusRequest: - bytes_read = ProcessTrackStatusRequest(reader); - break; - case MoqtMessageType::kUnannounce: - bytes_read = ProcessUnannounce(reader); + case MoqtMessageType::kPublishNamespaceCancel: + bytes_read = ProcessPublishNamespaceCancel(reader); break; case MoqtMessageType::kTrackStatus: bytes_read = ProcessTrackStatus(reader); break; + case MoqtMessageType::kTrackStatusOk: + bytes_read = ProcessTrackStatusOk(reader); + break; + case MoqtMessageType::kTrackStatusError: + bytes_read = ProcessTrackStatusError(reader); + break; case MoqtMessageType::kGoAway: bytes_read = ProcessGoAway(reader); break; - case MoqtMessageType::kSubscribeAnnounces: - bytes_read = ProcessSubscribeAnnounces(reader); + case MoqtMessageType::kSubscribeNamespace: + bytes_read = ProcessSubscribeNamespace(reader); break; - case MoqtMessageType::kSubscribeAnnouncesOk: - bytes_read = ProcessSubscribeAnnouncesOk(reader); + case MoqtMessageType::kSubscribeNamespaceOk: + bytes_read = ProcessSubscribeNamespaceOk(reader); break; - case MoqtMessageType::kSubscribeAnnouncesError: - bytes_read = ProcessSubscribeAnnouncesError(reader); + case MoqtMessageType::kSubscribeNamespaceError: + bytes_read = ProcessSubscribeNamespaceError(reader); break; - case MoqtMessageType::kUnsubscribeAnnounces: - bytes_read = ProcessUnsubscribeAnnounces(reader); + case MoqtMessageType::kUnsubscribeNamespace: + bytes_read = ProcessUnsubscribeNamespace(reader); break; case MoqtMessageType::kMaxRequestId: bytes_read = ProcessMaxRequestId(reader); @@ -374,7 +378,8 @@ size_t MoqtControlParser::ProcessServerSetup(quic::QuicDataReader& reader) { return reader.PreviouslyReadPayload().length(); } -size_t MoqtControlParser::ProcessSubscribe(quic::QuicDataReader& reader) { +size_t MoqtControlParser::ProcessSubscribe(quic::QuicDataReader& reader, + MoqtMessageType message_type) { MoqtSubscribe subscribe; uint64_t filter, group, object; uint8_t group_order, forward; @@ -434,11 +439,16 @@ size_t MoqtControlParser::ProcessSubscribe(quic::QuicDataReader& reader) { subscribe.parameters)) { return 0; } - visitor_.OnSubscribeMessage(subscribe); + if (message_type == MoqtMessageType::kTrackStatus) { + visitor_.OnTrackStatusMessage(subscribe); + } else { + visitor_.OnSubscribeMessage(subscribe); + } return reader.PreviouslyReadPayload().length(); } -size_t MoqtControlParser::ProcessSubscribeOk(quic::QuicDataReader& reader) { +size_t MoqtControlParser::ProcessSubscribeOk(quic::QuicDataReader& reader, + MoqtMessageType message_type) { MoqtSubscribeOk subscribe_ok; uint64_t milliseconds; uint8_t group_order; @@ -449,6 +459,8 @@ size_t MoqtControlParser::ProcessSubscribeOk(quic::QuicDataReader& reader) { !reader.ReadUInt8(&content_exists)) { return 0; } + // TODO(martinduke): If track_alias > 0 is an error for TrackStatusOk, then + // throw an error here. if (content_exists > 1) { ParseError("SUBSCRIBE_OK ContentExists has invalid value"); return 0; @@ -457,7 +469,12 @@ size_t MoqtControlParser::ProcessSubscribeOk(quic::QuicDataReader& reader) { ParseError("Invalid group order value in SUBSCRIBE_OK"); return 0; } - subscribe_ok.expires = quic::QuicTimeDelta::FromMilliseconds(milliseconds); + subscribe_ok.expires = + (milliseconds == 0 + ? std::nullopt + : quic::QuicTimeDelta::TryFromMilliseconds(milliseconds)) + .value_or(quic::QuicTimeDelta::Infinite()); + subscribe_ok.group_order = static_cast(group_order); if (content_exists) { subscribe_ok.largest_location = Location(); @@ -479,11 +496,16 @@ size_t MoqtControlParser::ProcessSubscribeOk(quic::QuicDataReader& reader) { subscribe_ok.parameters)) { return 0; } - visitor_.OnSubscribeOkMessage(subscribe_ok); + if (message_type == MoqtMessageType::kTrackStatusOk) { + visitor_.OnTrackStatusOkMessage(subscribe_ok); + } else { + visitor_.OnSubscribeOkMessage(subscribe_ok); + } return reader.PreviouslyReadPayload().length(); } -size_t MoqtControlParser::ProcessSubscribeError(quic::QuicDataReader& reader) { +size_t MoqtControlParser::ProcessSubscribeError(quic::QuicDataReader& reader, + MoqtMessageType message_type) { MoqtSubscribeError subscribe_error; uint64_t error_code; if (!reader.ReadVarInt62(&subscribe_error.request_id) || @@ -492,7 +514,11 @@ size_t MoqtControlParser::ProcessSubscribeError(quic::QuicDataReader& reader) { return 0; } subscribe_error.error_code = static_cast(error_code); - visitor_.OnSubscribeErrorMessage(subscribe_error); + if (message_type == MoqtMessageType::kTrackStatusError) { + visitor_.OnTrackStatusErrorMessage(subscribe_error); + } else { + visitor_.OnSubscribeErrorMessage(subscribe_error); + } return reader.PreviouslyReadPayload().length(); } @@ -505,8 +531,8 @@ size_t MoqtControlParser::ProcessUnsubscribe(quic::QuicDataReader& reader) { return reader.PreviouslyReadPayload().length(); } -size_t MoqtControlParser::ProcessSubscribeDone(quic::QuicDataReader& reader) { - MoqtSubscribeDone subscribe_done; +size_t MoqtControlParser::ProcessPublishDone(quic::QuicDataReader& reader) { + MoqtPublishDone subscribe_done; uint64_t value; if (!reader.ReadVarInt62(&subscribe_done.request_id) || !reader.ReadVarInt62(&value) || @@ -514,8 +540,8 @@ size_t MoqtControlParser::ProcessSubscribeDone(quic::QuicDataReader& reader) { !reader.ReadStringVarInt62(subscribe_done.error_reason)) { return 0; } - subscribe_done.status_code = static_cast(value); - visitor_.OnSubscribeDoneMessage(subscribe_done); + subscribe_done.status_code = static_cast(value); + visitor_.OnPublishDoneMessage(subscribe_done); return reader.PreviouslyReadPayload().length(); } @@ -560,10 +586,11 @@ size_t MoqtControlParser::ProcessSubscribeUpdate(quic::QuicDataReader& reader) { return reader.PreviouslyReadPayload().length(); } -size_t MoqtControlParser::ProcessAnnounce(quic::QuicDataReader& reader) { - MoqtAnnounce announce; - if (!reader.ReadVarInt62(&announce.request_id) || - !ReadTrackNamespace(reader, announce.track_namespace)) { +size_t MoqtControlParser::ProcessPublishNamespace( + quic::QuicDataReader& reader) { + MoqtPublishNamespace publish_namespace; + if (!reader.ReadVarInt62(&publish_namespace.request_id) || + !ReadTrackNamespace(reader, publish_namespace.track_namespace)) { return 0; } KeyValuePairList parameters; @@ -571,115 +598,81 @@ size_t MoqtControlParser::ProcessAnnounce(quic::QuicDataReader& reader) { return 0; } if (!ValidateVersionSpecificParameters(parameters, - MoqtMessageType::kAnnounce)) { - ParseError("ANNOUNCE contains invalid parameters"); + MoqtMessageType::kPublishNamespace)) { + ParseError("PUBLISH_NAMESPACE contains invalid parameters"); return 0; } - if (!KeyValuePairListToVersionSpecificParameters(parameters, - announce.parameters)) { + if (!KeyValuePairListToVersionSpecificParameters( + parameters, publish_namespace.parameters)) { return 0; } - visitor_.OnAnnounceMessage(announce); + visitor_.OnPublishNamespaceMessage(publish_namespace); return reader.PreviouslyReadPayload().length(); } -size_t MoqtControlParser::ProcessAnnounceOk(quic::QuicDataReader& reader) { - MoqtAnnounceOk announce_ok; - if (!reader.ReadVarInt62(&announce_ok.request_id)) { +size_t MoqtControlParser::ProcessPublishNamespaceOk( + quic::QuicDataReader& reader) { + MoqtPublishNamespaceOk publish_namespace_ok; + if (!reader.ReadVarInt62(&publish_namespace_ok.request_id)) { return 0; } - visitor_.OnAnnounceOkMessage(announce_ok); + visitor_.OnPublishNamespaceOkMessage(publish_namespace_ok); return reader.PreviouslyReadPayload().length(); } -size_t MoqtControlParser::ProcessAnnounceError(quic::QuicDataReader& reader) { - MoqtAnnounceError announce_error; +size_t MoqtControlParser::ProcessPublishNamespaceError( + quic::QuicDataReader& reader) { + MoqtPublishNamespaceError publish_namespace_error; uint64_t error_code; - if (!reader.ReadVarInt62(&announce_error.request_id) || + if (!reader.ReadVarInt62(&publish_namespace_error.request_id) || !reader.ReadVarInt62(&error_code) || - !reader.ReadStringVarInt62(announce_error.error_reason)) { + !reader.ReadStringVarInt62(publish_namespace_error.error_reason)) { return 0; } - announce_error.error_code = static_cast(error_code); - visitor_.OnAnnounceErrorMessage(announce_error); + publish_namespace_error.error_code = + static_cast(error_code); + visitor_.OnPublishNamespaceErrorMessage(publish_namespace_error); return reader.PreviouslyReadPayload().length(); } -size_t MoqtControlParser::ProcessAnnounceCancel(quic::QuicDataReader& reader) { - MoqtAnnounceCancel announce_cancel; - if (!ReadTrackNamespace(reader, announce_cancel.track_namespace)) { +size_t MoqtControlParser::ProcessPublishNamespaceDone( + quic::QuicDataReader& reader) { + MoqtPublishNamespaceDone unpublish_namespace; + if (!ReadTrackNamespace(reader, unpublish_namespace.track_namespace)) { + return 0; + } + visitor_.OnPublishNamespaceDoneMessage(unpublish_namespace); + return reader.PreviouslyReadPayload().length(); +} + +size_t MoqtControlParser::ProcessPublishNamespaceCancel( + quic::QuicDataReader& reader) { + MoqtPublishNamespaceCancel publish_namespace_cancel; + if (!ReadTrackNamespace(reader, publish_namespace_cancel.track_namespace)) { return 0; } uint64_t error_code; if (!reader.ReadVarInt62(&error_code) || - !reader.ReadStringVarInt62(announce_cancel.error_reason)) { + !reader.ReadStringVarInt62(publish_namespace_cancel.error_reason)) { return 0; } - announce_cancel.error_code = static_cast(error_code); - visitor_.OnAnnounceCancelMessage(announce_cancel); - return reader.PreviouslyReadPayload().length(); -} - -size_t MoqtControlParser::ProcessTrackStatusRequest( - quic::QuicDataReader& reader) { - MoqtTrackStatusRequest track_status_request; - if (!reader.ReadVarInt62(&track_status_request.request_id)) { - return 0; - } - if (!ReadFullTrackName(reader, track_status_request.full_track_name)) { - return 0; - } - KeyValuePairList parameters; - if (!ParseKeyValuePairList(reader, parameters)) { - return 0; - } - if (!ValidateVersionSpecificParameters( - parameters, MoqtMessageType::kTrackStatusRequest)) { - ParseError("TRACK_STATUS_REQUEST message contains invalid parameters"); - return 0; - } - if (!KeyValuePairListToVersionSpecificParameters( - parameters, track_status_request.parameters)) { - return 0; - } - visitor_.OnTrackStatusRequestMessage(track_status_request); - return reader.PreviouslyReadPayload().length(); -} - -size_t MoqtControlParser::ProcessUnannounce(quic::QuicDataReader& reader) { - MoqtUnannounce unannounce; - if (!ReadTrackNamespace(reader, unannounce.track_namespace)) { - return 0; - } - visitor_.OnUnannounceMessage(unannounce); + publish_namespace_cancel.error_code = + static_cast(error_code); + visitor_.OnPublishNamespaceCancelMessage(publish_namespace_cancel); return reader.PreviouslyReadPayload().length(); } size_t MoqtControlParser::ProcessTrackStatus(quic::QuicDataReader& reader) { - MoqtTrackStatus track_status; - uint64_t status_code; - if (!reader.ReadVarInt62(&track_status.request_id) || - !reader.ReadVarInt62(&status_code) || - !reader.ReadVarInt62(&track_status.largest_location.group) || - !reader.ReadVarInt62(&track_status.largest_location.object)) { - return 0; - } - track_status.status_code = static_cast(status_code); - KeyValuePairList parameters; - if (!ParseKeyValuePairList(reader, parameters)) { - return 0; - } - if (!ValidateVersionSpecificParameters(parameters, - MoqtMessageType::kTrackStatus)) { - ParseError("TRACK_STATUS message contains invalid parameters"); - return 0; - } - if (!KeyValuePairListToVersionSpecificParameters(parameters, - track_status.parameters)) { - return 0; - } - visitor_.OnTrackStatusMessage(track_status); - return reader.PreviouslyReadPayload().length(); + return ProcessSubscribe(reader, MoqtMessageType::kTrackStatus); +} + +size_t MoqtControlParser::ProcessTrackStatusOk(quic::QuicDataReader& reader) { + return ProcessSubscribeOk(reader, MoqtMessageType::kTrackStatusOk); +} + +size_t MoqtControlParser::ProcessTrackStatusError( + quic::QuicDataReader& reader) { + return ProcessSubscribeError(reader, MoqtMessageType::kTrackStatusError); } size_t MoqtControlParser::ProcessGoAway(quic::QuicDataReader& reader) { @@ -691,11 +684,11 @@ size_t MoqtControlParser::ProcessGoAway(quic::QuicDataReader& reader) { return reader.PreviouslyReadPayload().length(); } -size_t MoqtControlParser::ProcessSubscribeAnnounces( +size_t MoqtControlParser::ProcessSubscribeNamespace( quic::QuicDataReader& reader) { - MoqtSubscribeAnnounces subscribe_announces; - if (!reader.ReadVarInt62(&subscribe_announces.request_id) || - !ReadTrackNamespace(reader, subscribe_announces.track_namespace)) { + MoqtSubscribeNamespace subscribe_namespace; + if (!reader.ReadVarInt62(&subscribe_namespace.request_id) || + !ReadTrackNamespace(reader, subscribe_namespace.track_namespace)) { return 0; } KeyValuePairList parameters; @@ -703,31 +696,31 @@ size_t MoqtControlParser::ProcessSubscribeAnnounces( return 0; } if (!ValidateVersionSpecificParameters( - parameters, MoqtMessageType::kSubscribeAnnounces)) { - ParseError("SUBSCRIBE_ANNOUNCES message contains invalid parameters"); + parameters, MoqtMessageType::kSubscribeNamespace)) { + ParseError("SUBSCRIBE_NAMESPACE message contains invalid parameters"); return 0; } if (!KeyValuePairListToVersionSpecificParameters( - parameters, subscribe_announces.parameters)) { + parameters, subscribe_namespace.parameters)) { return 0; } - visitor_.OnSubscribeAnnouncesMessage(subscribe_announces); + visitor_.OnSubscribeNamespaceMessage(subscribe_namespace); return reader.PreviouslyReadPayload().length(); } -size_t MoqtControlParser::ProcessSubscribeAnnouncesOk( +size_t MoqtControlParser::ProcessSubscribeNamespaceOk( quic::QuicDataReader& reader) { - MoqtSubscribeAnnouncesOk subscribe_namespace_ok; + MoqtSubscribeNamespaceOk subscribe_namespace_ok; if (!reader.ReadVarInt62(&subscribe_namespace_ok.request_id)) { return 0; } - visitor_.OnSubscribeAnnouncesOkMessage(subscribe_namespace_ok); + visitor_.OnSubscribeNamespaceOkMessage(subscribe_namespace_ok); return reader.PreviouslyReadPayload().length(); } -size_t MoqtControlParser::ProcessSubscribeAnnouncesError( +size_t MoqtControlParser::ProcessSubscribeNamespaceError( quic::QuicDataReader& reader) { - MoqtSubscribeAnnouncesError subscribe_namespace_error; + MoqtSubscribeNamespaceError subscribe_namespace_error; uint64_t error_code; if (!reader.ReadVarInt62(&subscribe_namespace_error.request_id) || !reader.ReadVarInt62(&error_code) || @@ -736,17 +729,17 @@ size_t MoqtControlParser::ProcessSubscribeAnnouncesError( } subscribe_namespace_error.error_code = static_cast(error_code); - visitor_.OnSubscribeAnnouncesErrorMessage(subscribe_namespace_error); + visitor_.OnSubscribeNamespaceErrorMessage(subscribe_namespace_error); return reader.PreviouslyReadPayload().length(); } -size_t MoqtControlParser::ProcessUnsubscribeAnnounces( +size_t MoqtControlParser::ProcessUnsubscribeNamespace( quic::QuicDataReader& reader) { - MoqtUnsubscribeAnnounces unsubscribe_namespace; + MoqtUnsubscribeNamespace unsubscribe_namespace; if (!ReadTrackNamespace(reader, unsubscribe_namespace.track_namespace)) { return 0; } - visitor_.OnUnsubscribeAnnouncesMessage(unsubscribe_namespace); + visitor_.OnUnsubscribeNamespaceMessage(unsubscribe_namespace); return reader.PreviouslyReadPayload().length(); } @@ -774,44 +767,42 @@ size_t MoqtControlParser::ProcessFetch(quic::QuicDataReader& reader) { } switch (static_cast(type)) { case FetchType::kAbsoluteJoining: { - uint64_t joining_subscribe_id; + uint64_t joining_request_id; uint64_t joining_start; - if (!reader.ReadVarInt62(&joining_subscribe_id) || + if (!reader.ReadVarInt62(&joining_request_id) || !reader.ReadVarInt62(&joining_start)) { return 0; } - fetch.fetch = JoiningFetchAbsolute{joining_subscribe_id, joining_start}; + fetch.fetch = JoiningFetchAbsolute{joining_request_id, joining_start}; break; } case FetchType::kRelativeJoining: { - uint64_t joining_subscribe_id; + uint64_t joining_request_id; uint64_t joining_start; - if (!reader.ReadVarInt62(&joining_subscribe_id) || + if (!reader.ReadVarInt62(&joining_request_id) || !reader.ReadVarInt62(&joining_start)) { return 0; } - fetch.fetch = JoiningFetchRelative{joining_subscribe_id, joining_start}; + fetch.fetch = JoiningFetchRelative{joining_request_id, joining_start}; break; } case FetchType::kStandalone: { fetch.fetch = StandaloneFetch(); StandaloneFetch& standalone_fetch = std::get(fetch.fetch); - uint64_t end_object; if (!ReadFullTrackName(reader, standalone_fetch.full_track_name) || - !reader.ReadVarInt62(&standalone_fetch.start_object.group) || - !reader.ReadVarInt62(&standalone_fetch.start_object.object) || - !reader.ReadVarInt62(&standalone_fetch.end_group) || - !reader.ReadVarInt62(&end_object)) { + !reader.ReadVarInt62(&standalone_fetch.start_location.group) || + !reader.ReadVarInt62(&standalone_fetch.start_location.object) || + !reader.ReadVarInt62(&standalone_fetch.end_location.group) || + !reader.ReadVarInt62(&standalone_fetch.end_location.object)) { return 0; } - standalone_fetch.end_object = - end_object == 0 ? std::optional() : (end_object - 1); - if (standalone_fetch.end_group < standalone_fetch.start_object.group || - (standalone_fetch.end_group == standalone_fetch.start_object.group && - standalone_fetch.end_object.has_value() && - *standalone_fetch.end_object < - standalone_fetch.start_object.object)) { + if (standalone_fetch.end_location.object == 0) { + standalone_fetch.end_location.object = kMaxObjectId; + } else { + --standalone_fetch.end_location.object; + } + if (standalone_fetch.end_location < standalone_fetch.start_location) { ParseError("End object comes before start object in FETCH"); return 0; } @@ -861,6 +852,11 @@ size_t MoqtControlParser::ProcessFetchOk(quic::QuicDataReader& reader) { ParseError("FETCH_OK message contains invalid parameters"); return 0; } + if (fetch_ok.end_location.object == 0) { + fetch_ok.end_location.object = kMaxObjectId; + } else { + --fetch_ok.end_location.object; + } fetch_ok.group_order = static_cast(group_order); fetch_ok.end_of_track = end_of_track == 1; if (!KeyValuePairListToVersionSpecificParameters(parameters, @@ -1130,6 +1126,11 @@ bool MoqtControlParser::KeyValuePairListToMoqtSessionParameters( SetupParameter parameter = static_cast(key); switch (parameter) { case SetupParameter::kPath: + if (!http2::adapter::HeaderValidator::IsValidPath( + value, /*allow_fragment=*/false)) { + ParseError(MoqtError::kMalformedPath, "Malformed path"); + return false; + } out.path = value; break; case SetupParameter::kAuthorizationToken: @@ -1137,6 +1138,16 @@ bool MoqtControlParser::KeyValuePairListToMoqtSessionParameters( return false; } break; + case SetupParameter::kAuthority: + if (!http2::adapter::HeaderValidator::IsValidAuthority(value)) { + ParseError(MoqtError::kMalformedAuthority, "Malformed authority"); + return false; + } + out.authority = value; + break; + case SetupParameter::kMoqtImplementation: + QUICHE_LOG(INFO) << "Peer MOQT implementation: " << value; + break; default: break; } @@ -1153,11 +1164,14 @@ bool MoqtControlParser::KeyValuePairListToVersionSpecificParameters( static_cast(key); switch (parameter) { case VersionSpecificParameter::kDeliveryTimeout: - out.delivery_timeout = quic::QuicTimeDelta::FromMilliseconds(value); + out.delivery_timeout = + quic::QuicTimeDelta::TryFromMilliseconds(value).value_or( + quic::QuicTimeDelta::Infinite()); break; case VersionSpecificParameter::kMaxCacheDuration: out.max_cache_duration = - quic::QuicTimeDelta::FromMilliseconds(value); + quic::QuicTimeDelta::TryFromMilliseconds(value).value_or( + quic::QuicTimeDelta::Infinite()); break; case VersionSpecificParameter::kOackWindowSize: out.oack_window_size = quic::QuicTimeDelta::FromMicroseconds(value); @@ -1286,17 +1300,36 @@ std::optional ParseDatagram(absl::string_view data, object_metadata = MoqtObject(); if (!reader.ReadVarInt62(&type_raw) || !reader.ReadVarInt62(&object_metadata.track_alias) || - !reader.ReadVarInt62(&object_metadata.group_id) || - !reader.ReadVarInt62(&object_metadata.object_id) || - !reader.ReadUInt8(&object_metadata.publisher_priority)) { + !reader.ReadVarInt62(&object_metadata.group_id)) { return std::nullopt; } - object_metadata.subgroup_id = object_metadata.object_id; + std::optional datagram_type = MoqtDatagramType::FromValue(type_raw); if (!datagram_type.has_value()) { return std::nullopt; } + if (datagram_type->end_of_group()) { + object_metadata.object_status = MoqtObjectStatus::kEndOfGroup; + if (datagram_type->has_status()) { + QUICHE_BUG(Moqt_invalid_datagram_type) + << "Invalid datagram type: " << type_raw; + return std::nullopt; + } + } else { + object_metadata.object_status = MoqtObjectStatus::kNormal; + } + if (datagram_type->has_object_id()) { + if (!reader.ReadVarInt62(&object_metadata.object_id)) { + return std::nullopt; + } + } else { + object_metadata.object_id = 0; + } + object_metadata.subgroup_id = object_metadata.object_id; + if (!reader.ReadUInt8(&object_metadata.publisher_priority)) { + return std::nullopt; + } if (datagram_type->has_extension()) { if (!reader.ReadStringPieceVarInt62(&extensions)) { return std::nullopt; @@ -1316,7 +1349,6 @@ std::optional ParseDatagram(absl::string_view data, return ""; } absl::string_view payload = reader.ReadRemainingPayload(); - object_metadata.object_status = MoqtObjectStatus::kNormal; object_metadata.payload_length = payload.length(); return payload; } @@ -1409,6 +1441,7 @@ void MoqtDataParser::AdvanceParserState() { break; case kStatus: case kData: + case kAwaitingNextByte: next_input_ = type_->IsFetch() ? kGroupId : kObjectId; break; case kExtensionSize: // Either kExtensionBody or @@ -1442,6 +1475,9 @@ void MoqtDataParser::ParseNextItemFromStream() { next_input_ = kPadding; return; } + if (type_->EndOfGroupInStream()) { + contains_end_of_group_ = true; + } AdvanceParserState(); return; } @@ -1485,7 +1521,13 @@ void MoqtDataParser::ParseNextItemFromStream() { case kObjectId: { std::optional value_read = ReadVarInt62NoFin(); if (value_read.has_value()) { - metadata_.object_id = *value_read; + if (type_.has_value() && type_->IsSubgroup() && + last_object_id_.has_value()) { + metadata_.object_id = *value_read + *last_object_id_ + 1; + } else { + metadata_.object_id = *value_read; + } + last_object_id_ = metadata_.object_id; AdvanceParserState(); } return; @@ -1528,10 +1570,17 @@ void MoqtDataParser::ParseNextItemFromStream() { } ++num_objects_read_; + // TODO(martinduke): If contains_end_of_group_ && fin_read, the track is + // malformed. There is no API to signal this to the session yet, but the + // contains_end_of_group_ logic is likely to substantially change in the + // spec. Don't bother to signal this for now; just ignore that the + // stream was supposed to conclude with kEndOfGroup and end it with the + // encoded status instead. visitor_.OnObjectMessage(metadata_, "", /*end_of_message=*/true); AdvanceParserState(); } if (fin_read) { + visitor_.OnFin(); no_more_data_ = true; return; } @@ -1551,16 +1600,39 @@ void MoqtDataParser::ParseNextItemFromStream() { payload_length_remaining_ -= chunk_size; bool done = payload_length_remaining_ == 0; if (next_input_ == kData) { - visitor_.OnObjectMessage( - metadata_, peek_result.peeked_data.substr(0, chunk_size), done); - no_more_data_ = stream_.SkipBytes(chunk_size); - if (done) { - ++num_objects_read_; - AdvanceParserState(); - } else if (no_more_data_) { + no_more_data_ = peek_result.all_data_received && + chunk_size == stream_.ReadableBytes(); + if (!done && no_more_data_) { ParseError("FIN received at an unexpected point in the stream"); return; } + if (contains_end_of_group_) { + if (no_more_data_) { + metadata_.object_status = MoqtObjectStatus::kEndOfGroup; + } else if (done) { + // Don't signal done until the next byte arrives. + next_input_ = kAwaitingNextByte; + done = false; + } + } + visitor_.OnObjectMessage( + metadata_, peek_result.peeked_data.substr(0, chunk_size), done); + if (done) { + if (no_more_data_) { + visitor_.OnFin(); + } + ++num_objects_read_; + AdvanceParserState(); + } + if (stream_.SkipBytes(chunk_size) && !no_more_data_) { + // Although there was no FIN, SkipBytes() can return true if the + // stream is reset, probably because OnObjectMessage() caused + // something to happen to the stream or the session. + no_more_data_ = true; + if (!done) { + ParseError("FIN received at an unexpected point in the stream"); + } + } } else { absl::StrAppend(&metadata_.extension_headers, peek_result.peeked_data.substr(0, chunk_size)); @@ -1577,6 +1649,11 @@ void MoqtDataParser::ParseNextItemFromStream() { return; } + case kAwaitingNextByte: { + QUICHE_NOTREACHED(); // CheckForFinWithoutData() should have handled it. + return; + } + case kPadding: no_more_data_ |= stream_.SkipBytes(stream_.ReadableBytes()); return; @@ -1607,6 +1684,11 @@ void MoqtDataParser::ReadAtMostOneObject() { bool MoqtDataParser::CheckForFinWithoutData() { if (!stream_.PeekNextReadableRegion().fin_next) { + if (next_input_ == kAwaitingNextByte) { + // Data arrived; the last object was not EndOfGroup. + visitor_.OnObjectMessage(metadata_, "", /*end_of_message=*/true); + AdvanceParserState(); + } return false; } no_more_data_ = true; @@ -1618,6 +1700,11 @@ bool MoqtDataParser::CheckForFinWithoutData() { ParseError("FIN received at an unexpected point in the stream"); return true; } + if (next_input_ == kAwaitingNextByte) { + metadata_.object_status = MoqtObjectStatus::kEndOfGroup; + visitor_.OnObjectMessage(metadata_, "", /*end_of_message=*/true); + } + visitor_.OnFin(); return stream_.SkipBytes(0); } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_parser.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_parser.h index 2df5cdf3b2..1ea2ca9ec7 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_parser.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_parser.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include "absl/strings/string_view.h" @@ -38,25 +39,31 @@ class QUICHE_EXPORT MoqtControlParserVisitor { virtual void OnSubscribeOkMessage(const MoqtSubscribeOk& message) = 0; virtual void OnSubscribeErrorMessage(const MoqtSubscribeError& message) = 0; virtual void OnUnsubscribeMessage(const MoqtUnsubscribe& message) = 0; - virtual void OnSubscribeDoneMessage(const MoqtSubscribeDone& message) = 0; + virtual void OnPublishDoneMessage(const MoqtPublishDone& message) = 0; virtual void OnSubscribeUpdateMessage(const MoqtSubscribeUpdate& message) = 0; - virtual void OnAnnounceMessage(const MoqtAnnounce& message) = 0; - virtual void OnAnnounceOkMessage(const MoqtAnnounceOk& message) = 0; - virtual void OnAnnounceErrorMessage(const MoqtAnnounceError& message) = 0; - virtual void OnAnnounceCancelMessage(const MoqtAnnounceCancel& message) = 0; - virtual void OnTrackStatusRequestMessage( - const MoqtTrackStatusRequest& message) = 0; - virtual void OnUnannounceMessage(const MoqtUnannounce& message) = 0; + virtual void OnPublishNamespaceMessage( + const MoqtPublishNamespace& message) = 0; + virtual void OnPublishNamespaceOkMessage( + const MoqtPublishNamespaceOk& message) = 0; + virtual void OnPublishNamespaceErrorMessage( + const MoqtPublishNamespaceError& message) = 0; + virtual void OnPublishNamespaceDoneMessage( + const MoqtPublishNamespaceDone& message) = 0; + virtual void OnPublishNamespaceCancelMessage( + const MoqtPublishNamespaceCancel& message) = 0; virtual void OnTrackStatusMessage(const MoqtTrackStatus& message) = 0; + virtual void OnTrackStatusOkMessage(const MoqtTrackStatusOk& message) = 0; + virtual void OnTrackStatusErrorMessage( + const MoqtTrackStatusError& message) = 0; virtual void OnGoAwayMessage(const MoqtGoAway& message) = 0; - virtual void OnSubscribeAnnouncesMessage( - const MoqtSubscribeAnnounces& message) = 0; - virtual void OnSubscribeAnnouncesOkMessage( - const MoqtSubscribeAnnouncesOk& message) = 0; - virtual void OnSubscribeAnnouncesErrorMessage( - const MoqtSubscribeAnnouncesError& message) = 0; - virtual void OnUnsubscribeAnnouncesMessage( - const MoqtUnsubscribeAnnounces& message) = 0; + virtual void OnSubscribeNamespaceMessage( + const MoqtSubscribeNamespace& message) = 0; + virtual void OnSubscribeNamespaceOkMessage( + const MoqtSubscribeNamespaceOk& message) = 0; + virtual void OnSubscribeNamespaceErrorMessage( + const MoqtSubscribeNamespaceError& message) = 0; + virtual void OnUnsubscribeNamespaceMessage( + const MoqtUnsubscribeNamespace& message) = 0; virtual void OnMaxRequestIdMessage(const MoqtMaxRequestId& message) = 0; virtual void OnFetchMessage(const MoqtFetch& message) = 0; virtual void OnFetchCancelMessage(const MoqtFetchCancel& message) = 0; @@ -79,9 +86,12 @@ class MoqtDataParserVisitor { // OBJECT payload. If not, there will be subsequent calls with further payload // data. The parser retains ownership of |message| and |payload|, so the // visitor needs to copy anything it wants to retain. + // If `message.object_status` == `kNormal`, the status must not be used until + // `end_of_message` is true, since a FIN can change the status. virtual void OnObjectMessage(const MoqtObject& message, absl::string_view payload, bool end_of_message) = 0; + virtual void OnFin() = 0; virtual void OnParsingError(MoqtError code, absl::string_view reason) = 0; }; @@ -110,24 +120,33 @@ class QUICHE_EXPORT MoqtControlParser { // otherwise. size_t ProcessClientSetup(quic::QuicDataReader& reader); size_t ProcessServerSetup(quic::QuicDataReader& reader); - size_t ProcessSubscribe(quic::QuicDataReader& reader); - size_t ProcessSubscribeOk(quic::QuicDataReader& reader); - size_t ProcessSubscribeError(quic::QuicDataReader& reader); + // Subscribe formats are used for TrackStatus as well, so take the message + // type as an argument, defaulting to the subscribe version. + size_t ProcessSubscribe( + quic::QuicDataReader& reader, + MoqtMessageType message_type = MoqtMessageType::kSubscribe); + size_t ProcessSubscribeOk( + quic::QuicDataReader& reader, + MoqtMessageType message_type = MoqtMessageType::kSubscribeOk); + size_t ProcessSubscribeError( + quic::QuicDataReader& reader, + MoqtMessageType message_type = MoqtMessageType::kSubscribeError); size_t ProcessUnsubscribe(quic::QuicDataReader& reader); - size_t ProcessSubscribeDone(quic::QuicDataReader& reader); + size_t ProcessPublishDone(quic::QuicDataReader& reader); size_t ProcessSubscribeUpdate(quic::QuicDataReader& reader); - size_t ProcessAnnounce(quic::QuicDataReader& reader); - size_t ProcessAnnounceOk(quic::QuicDataReader& reader); - size_t ProcessAnnounceError(quic::QuicDataReader& reader); - size_t ProcessAnnounceCancel(quic::QuicDataReader& reader); - size_t ProcessTrackStatusRequest(quic::QuicDataReader& reader); - size_t ProcessUnannounce(quic::QuicDataReader& reader); + size_t ProcessPublishNamespace(quic::QuicDataReader& reader); + size_t ProcessPublishNamespaceOk(quic::QuicDataReader& reader); + size_t ProcessPublishNamespaceError(quic::QuicDataReader& reader); + size_t ProcessPublishNamespaceDone(quic::QuicDataReader& reader); + size_t ProcessPublishNamespaceCancel(quic::QuicDataReader& reader); size_t ProcessTrackStatus(quic::QuicDataReader& reader); + size_t ProcessTrackStatusOk(quic::QuicDataReader& reader); + size_t ProcessTrackStatusError(quic::QuicDataReader& reader); size_t ProcessGoAway(quic::QuicDataReader& reader); - size_t ProcessSubscribeAnnounces(quic::QuicDataReader& reader); - size_t ProcessSubscribeAnnouncesOk(quic::QuicDataReader& reader); - size_t ProcessSubscribeAnnouncesError(quic::QuicDataReader& reader); - size_t ProcessUnsubscribeAnnounces(quic::QuicDataReader& reader); + size_t ProcessSubscribeNamespace(quic::QuicDataReader& reader); + size_t ProcessSubscribeNamespaceOk(quic::QuicDataReader& reader); + size_t ProcessSubscribeNamespaceError(quic::QuicDataReader& reader); + size_t ProcessUnsubscribeNamespace(quic::QuicDataReader& reader); size_t ProcessMaxRequestId(quic::QuicDataReader& reader); size_t ProcessFetch(quic::QuicDataReader& reader); size_t ProcessFetchCancel(quic::QuicDataReader& reader); @@ -224,6 +243,7 @@ class QUICHE_EXPORT MoqtDataParser { kObjectPayloadLength, kStatus, kData, + kAwaitingNextByte, // Can't determine status until the next byte arrives. kPadding, kFailed, }; @@ -263,12 +283,15 @@ class QUICHE_EXPORT MoqtDataParser { bool no_more_data_ = false; // Fatal error or fin. No more parsing. bool parsing_error_ = false; + bool contains_end_of_group_ = false; // True if the stream contains an + // implied END_OF_GROUP object. std::string buffered_message_; std::optional type_ = std::nullopt; NextInput next_input_ = kStreamType; MoqtObject metadata_; + std::optional last_object_id_; size_t payload_length_remaining_ = 0; size_t num_objects_read_ = 0; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_probe_manager.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_probe_manager.cc index 2ad86dfebb..3ff5bcc80f 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_probe_manager.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_probe_manager.cc @@ -42,6 +42,7 @@ std::optional MoqtProbeManager::StartProbe( if (stream == nullptr) { return std::nullopt; } + trace_recorder_->RecordProbeStreamCreated(stream->GetStreamId(), id); probe_ = PendingProbe{ id, clock_->ApproximateNow(), clock_->ApproximateNow() + timeout, diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_probe_manager.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_probe_manager.h index 0458a921f1..f2d8639b7e 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_probe_manager.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_probe_manager.h @@ -14,6 +14,7 @@ #include "quiche/quic/core/quic_clock.h" #include "quiche/quic/core/quic_time.h" #include "quiche/quic/core/quic_types.h" +#include "quiche/quic/moqt/moqt_trace_recorder.h" #include "quiche/common/quiche_callbacks.h" #include "quiche/web_transport/web_transport.h" @@ -68,9 +69,11 @@ class MoqtProbeManager : public MoqtProbeManagerInterface { public: explicit MoqtProbeManager(webtransport::Session* session, const quic::QuicClock* clock, - quic::QuicAlarmFactory& alarm_factory) + quic::QuicAlarmFactory& alarm_factory, + MoqtTraceRecorder* trace_recorder) : session_(session), clock_(clock), + trace_recorder_(trace_recorder), timeout_alarm_(alarm_factory.CreateAlarm(new AlarmDelegate(this))) {} // MoqtProbeManagerInterface implementation. @@ -140,6 +143,7 @@ class MoqtProbeManager : public MoqtProbeManagerInterface { std::optional probe_; webtransport::Session* session_; const quic::QuicClock* clock_; + MoqtTraceRecorder* trace_recorder_; std::unique_ptr timeout_alarm_; ProbeId next_probe_id_ = 0; }; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_publisher.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_publisher.h index ec7c121e3e..109e8143b2 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_publisher.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_publisher.h @@ -8,35 +8,17 @@ #include #include #include -#include -#include "absl/status/status.h" -#include "absl/status/statusor.h" +#include "absl/base/nullability.h" #include "quiche/quic/core/quic_time.h" +#include "quiche/quic/moqt/moqt_fetch_task.h" #include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_priority.h" -#include "quiche/common/quiche_callbacks.h" -#include "quiche/common/quiche_mem_slice.h" #include "quiche/web_transport/web_transport.h" namespace moqt { -struct PublishedObjectMetadata { - Location location; - uint64_t subgroup; // Equal to object_id for datagrams. - MoqtObjectStatus status; - MoqtPriority publisher_priority; - quic::QuicTime arrival_time = quic::QuicTime::Zero(); -}; - -// PublishedObject is a description of an object that is sufficient to publish -// it on a given track. -struct PublishedObject { - PublishedObjectMetadata metadata; - quiche::QuicheMemSlice payload; - bool fin_after_this = false; -}; - // MoqtObjectListener is an interface for any entity that is listening for // incoming objects for a given track. class MoqtObjectListener { @@ -49,14 +31,13 @@ class MoqtObjectListener { virtual void OnSubscribeAccepted() = 0; // Called when the publisher is sure that it cannot serve the subscription. // This could happen synchronously or asynchronously. - virtual void OnSubscribeRejected( - MoqtSubscribeErrorReason reason, - std::optional track_alias = std::nullopt) = 0; + virtual void OnSubscribeRejected(MoqtSubscribeErrorReason reason) = 0; // Notifies that a new object is available on the track. The object payload // itself may be retrieved via GetCachedObject method of the associated track // publisher. - virtual void OnNewObjectAvailable(Location sequence, uint64_t subgroup) = 0; + virtual void OnNewObjectAvailable(Location sequence, uint64_t subgroup, + MoqtPriority publisher_priority) = 0; // Notifies that a pure FIN has arrived following |sequence|. Should not be // called unless all objects have already been delivered. If not delivered, // instead set the fin_after_this flag in the PublishedObject. @@ -77,54 +58,6 @@ class MoqtObjectListener { virtual void OnTrackPublisherGone() = 0; }; -// A handle representing a fetch in progress. The fetch in question can be -// cancelled by deleting the object. -class MoqtFetchTask { - public: - using ObjectsAvailableCallback = quiche::MultiUseCallback; - // If the fields are not correct (e.g. end_of_track is less than start) it - // will result in QUICHE_BUG. The request_id field will be ignored. - using FetchResponseCallback = quiche::SingleUseCallback)>; - - virtual ~MoqtFetchTask() = default; - - // Potential results of a GetNextObject() call. - enum GetNextObjectResult { - // The next object is available, and is placed into the reference specified - // by the caller. - kSuccess, - // The next object is not yet available (equivalent of EAGAIN). - kPending, - // The end of fetch has been reached. - kEof, - // The fetch has failed; the error is available via GetStatus(). - kError, - }; - - // Returns the next object received via the fetch, if available. MUST NOT - // return an object with status kObjectDoesNotExist. - virtual GetNextObjectResult GetNextObject(PublishedObject& output) = 0; - - // Sets the callback that is called when GetNextObject() has previously - // returned kPending, but now a new object (or potentially an error or an - // end-of-fetch) is available. The application is responsible for calling - // GetNextObject() until it gets kPending; no further callback will occur - // until then. - // If an object is available immediately, the callback will be called - // immediately. - virtual void SetObjectAvailableCallback( - ObjectsAvailableCallback callback) = 0; - // One of these callbacks is called as soon as the data publisher has enough - // information for either FETCH_OK or FETCH_ERROR. - // If the appropriate response is already available, the callback will be - // called immediately. - virtual void SetFetchResponseCallback(FetchResponseCallback callback) = 0; - - // Returns the error if fetch has completely failed, and OK otherwise. - virtual absl::Status GetStatus() = 0; -}; - // MoqtTrackPublisher is an application-side API for an MoQT publisher // of a single individual track. class MoqtTrackPublisher { @@ -159,28 +92,24 @@ class MoqtTrackPublisher { virtual void AddObjectListener(MoqtObjectListener* listener) = 0; virtual void RemoveObjectListener(MoqtObjectListener* listener) = 0; - virtual absl::StatusOr GetTrackStatus() const = 0; - - // Returns the largest (group, object) pair that has been published so far. - // This method may only be called if - // DoesTrackStatusImplyHavingData(GetTrackStatus()) is true. - virtual Location GetLargestLocation() const = 0; - - // Returns the forwarding preference of the track. - // This method may only be called if - // DoesTrackStatusImplyHavingData(GetTrackStatus()) is true. - virtual MoqtForwardingPreference GetForwardingPreference() const = 0; - - // Returns the current forwarding priority of the track. - virtual MoqtPriority GetPublisherPriority() const = 0; - - // Returns the publisher-preferred delivery order for the track. - virtual MoqtDeliveryOrder GetDeliveryOrder() const = 0; + // Methods to return various track properties. Returns nullopt if the value is + // not yet available. Guaranteed to be non-null if an object is available + // and/or OnSubscribeAccepted() has been called. + // Track alias is not present because MoqtSession always uses locally + // generated values. + virtual std::optional largest_location() const = 0; + virtual std::optional forwarding_preference() + const = 0; + virtual std::optional delivery_order() const = 0; + virtual std::optional expiration() const = 0; // Performs a fetch for the specified range of objects. - virtual std::unique_ptr Fetch( - Location start, uint64_t end_group, std::optional end_object, - MoqtDeliveryOrder order) = 0; + virtual std::unique_ptr StandaloneFetch( + Location start, Location end, std::optional order) = 0; + virtual std::unique_ptr RelativeFetch( + uint64_t group_diff, std::optional order) = 0; + virtual std::unique_ptr AbsoluteFetch( + uint64_t group, std::optional order) = 0; }; // MoqtPublisher is an interface to a publisher that allows it to publish @@ -189,7 +118,8 @@ class MoqtPublisher { public: virtual ~MoqtPublisher() = default; - virtual absl::StatusOr> GetTrack( + // Called by MoqtSession based on messages arriving on the wire. + virtual absl_nullable std::shared_ptr GetTrack( const FullTrackName& track_name) = 0; }; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_publisher.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_publisher.cc new file mode 100644 index 0000000000..32ac1d46bc --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_publisher.cc @@ -0,0 +1,98 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "quiche/quic/moqt/moqt_relay_publisher.h" + +#include +#include +#include + +#include "absl/base/nullability.h" +#include "absl/container/flat_hash_map.h" +#include "absl/strings/string_view.h" +#include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_publisher.h" +#include "quiche/quic/moqt/moqt_relay_track_publisher.h" +#include "quiche/quic/moqt/moqt_session_callbacks.h" +#include "quiche/quic/moqt/moqt_session_interface.h" +#include "quiche/common/quiche_weak_ptr.h" + +namespace moqt { + +using quiche::QuicheWeakPtr; + +absl_nullable std::shared_ptr MoqtRelayPublisher::GetTrack( + const FullTrackName& track_name) { + auto it = tracks_.find(track_name); + if (it != tracks_.end()) { + return it->second; + } + // Make a copy, because this namespace might be truncated. + TrackNamespace track_namespace = track_name.track_namespace(); + MoqtSessionInterface* upstream = GetUpstream(track_namespace); + if (upstream == nullptr) { + return nullptr; + } + auto track_publisher = std::make_shared( + track_name, upstream->GetWeakPtr(), + [this, track_name] { tracks_.erase(track_name); }, std::nullopt, + std::nullopt); + tracks_[track_name] = track_publisher; + return track_publisher; +} + +void MoqtRelayPublisher::SetDefaultUpstreamSession( + MoqtSessionInterface* default_upstream_session) { + MoqtSessionInterface* old_session = + default_upstream_session_.GetIfAvailable(); + if (old_session != nullptr) { + // The Publisher no longer cares if the old session is terminated. + old_session->callbacks().session_terminated_callback = + [](absl::string_view) {}; + } + // Update callbacks. + // goaway_received_callback has already been set by MoqtClient. It will + // handle connecting to new URI and calling AddDefaultUpstreamSession() again + // when that session is ready. + default_upstream_session->callbacks().session_terminated_callback = + [this](absl::string_view error_message) { + QUICHE_LOG(INFO) << "Default upstream session terminated, error = " + << error_message; + default_upstream_session_ = QuicheWeakPtr(); + }; + default_upstream_session_ = default_upstream_session->GetWeakPtr(); +} + +void MoqtRelayPublisher::OnPublishNamespace( + const TrackNamespace& track_namespace, + const VersionSpecificParameters& /*parameters*/, + MoqtSessionInterface* session, MoqtResponseCallback callback) { + if (session == nullptr) { + return; + } + // TODO(martinduke): Handle parameters. + namespace_publishers_.AddPublisher(track_namespace, session); + // TODO(martinduke): Notify subscribers listening for this namespace. + // Send PUBLISH_NAMESPACE_OK. + std::move(callback)(std::nullopt); +} + +void MoqtRelayPublisher::OnPublishNamespaceDone( + const TrackNamespace& track_namespace, MoqtSessionInterface* session) { + if (session == nullptr) { + return; + } + namespace_publishers_.RemovePublisher(track_namespace, session); + // TODO(martinduke): Notify subscribers listening for this namespace. +} + +MoqtSessionInterface* MoqtRelayPublisher::GetUpstream( + TrackNamespace& track_namespace) { + MoqtSessionInterface* upstream = + namespace_publishers_.GetValidPublisher(track_namespace); + return (upstream == nullptr) ? default_upstream_session_.GetIfAvailable() + : upstream; +} + +} // namespace moqt diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_publisher.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_publisher.h new file mode 100644 index 0000000000..66cb094a26 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_publisher.h @@ -0,0 +1,81 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_MOQT_MOQT_RELAY_PUBLISHER_H_ +#define QUICHE_QUIC_MOQT_MOQT_RELAY_PUBLISHER_H_ + +#include + +#include "absl/base/nullability.h" +#include "absl/container/flat_hash_map.h" +#include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_publisher.h" +#include "quiche/quic/moqt/moqt_relay_track_publisher.h" +#include "quiche/quic/moqt/moqt_session_callbacks.h" +#include "quiche/quic/moqt/moqt_session_interface.h" +#include "quiche/quic/moqt/relay_namespace_tree.h" +#include "quiche/common/quiche_weak_ptr.h" + +namespace moqt { + +// MoqtRelayPublisher is a publisher that connects sessions that request objects +// and namespaces with upstream sessions that can deliver those things. +class MoqtRelayPublisher : public MoqtPublisher { + public: + MoqtRelayPublisher() = default; + MoqtRelayPublisher(const MoqtRelayPublisher&) = delete; + MoqtRelayPublisher(MoqtRelayPublisher&&) = delete; + MoqtRelayPublisher& operator=(const MoqtRelayPublisher&) = delete; + MoqtRelayPublisher& operator=(MoqtRelayPublisher&&) = delete; + + // MoqtPublisher implementation. + absl_nullable std::shared_ptr GetTrack( + const FullTrackName& track_name) override; + + void AddNamespaceSubscriber(const TrackNamespace& track_namespace, + MoqtSessionInterface* session) { + namespace_publishers_.AddSubscriber(track_namespace, session); + } + void RemoveNamespaceSubscriber(const TrackNamespace& track_namespace, + MoqtSessionInterface* session) { + namespace_publishers_.RemoveSubscriber(track_namespace, session); + } + + // There is a new default upstream session. When there is no other namespace + // information, requests will route here. + void SetDefaultUpstreamSession( + MoqtSessionInterface* default_upstream_session); + + // Returns the default upstream session. + quiche::QuicheWeakPtr& GetDefaultUpstreamSession() { + return default_upstream_session_; + } + + void OnPublishNamespace(const TrackNamespace& track_namespace, + const VersionSpecificParameters& parameters, + MoqtSessionInterface* session, + MoqtResponseCallback callback); + + void OnPublishNamespaceDone(const TrackNamespace& track_namespace, + MoqtSessionInterface* session); + + private: + MoqtSessionInterface* GetUpstream(TrackNamespace& track_namespace); + + absl::flat_hash_map> + tracks_; + + // An indexed map of namespace to a map of sessions. The key to the inner map + // is indexed by a raw pointer, to make it easier to find entries when + // deleting. + RelayNamespaceTree namespace_publishers_; + + // TODO(martinduke): Add a map of Namespaces to namespace listeners. + + quiche::QuicheWeakPtr default_upstream_session_; +}; + +} // namespace moqt + +#endif // QUICHE_QUIC_MOQT_MOQT_RELAY_PUBLISHER_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_track_publisher.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_track_publisher.cc new file mode 100644 index 0000000000..73c61a1b9e --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_track_publisher.cc @@ -0,0 +1,303 @@ +// Copyright 2024 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "quiche/quic/moqt/moqt_relay_track_publisher.h" + +#include +#include +#include +#include +#include + +#include "absl/base/attributes.h" +#include "absl/strings/string_view.h" +#include "quiche/quic/core/quic_time.h" +#include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" +#include "quiche/quic/moqt/moqt_publisher.h" +#include "quiche/quic/moqt/moqt_session_interface.h" +#include "quiche/common/platform/api/quiche_logging.h" +#include "quiche/common/quiche_callbacks.h" +#include "quiche/common/quiche_mem_slice.h" + +namespace moqt { + +void MoqtRelayTrackPublisher::OnReply( + const FullTrackName&, + std::variant response) { + if (std::holds_alternative(response)) { + auto request_error = std::get(response); + for (MoqtObjectListener* listener : listeners_) { + listener->OnSubscribeRejected(request_error); + } + DeleteTrack(); + return; + } + SubscribeOkData ok_data = std::get(response); + if (ok_data.expires.IsInfinite()) { + expiration_ = quic::QuicTime::Infinite(); + } else { + expiration_ = clock_->Now() + ok_data.expires; + } + delivery_order_ = ok_data.delivery_order; + next_location_ = ok_data.largest_location.has_value() + ? ok_data.largest_location->Next() + : Location(0, 0); + // TODO(martinduke): Handle parameters. + for (MoqtObjectListener* listener : listeners_) { + listener->OnSubscribeAccepted(); + } +} + +void MoqtRelayTrackPublisher::OnObjectFragment( + const FullTrackName& full_track_name, + const PublishedObjectMetadata& metadata, absl::string_view object, + bool end_of_message) { + if (!end_of_message) { + QUICHE_BUG(moqt_relay_track_publisher_got_fragment) + << "Received a fragment of an object."; + return; + } + bool last_object_in_stream = false; + if (full_track_name != track_) { + QUICHE_BUG(moqt_got_wrong_track) << "Received object for wrong track."; + return; + } + if (queue_.size() == kMaxQueuedGroups) { + if (queue_.begin()->first > metadata.location.group) { + QUICHE_DLOG(INFO) << "Skipping object from group " + << metadata.location.group << " because it is too old."; + return; + } + if (queue_.find(metadata.location.group) == queue_.end()) { + // Erase the oldest group. + for (MoqtObjectListener* listener : listeners_) { + listener->OnGroupAbandoned(queue_.begin()->first); + } + queue_.erase(queue_.begin()); + } + } + // Validate the input given previously received markers. + if (end_of_track_.has_value() && metadata.location > *end_of_track_) { + QUICHE_DLOG(INFO) << "Skipping object because it is after the end of the " + << "track"; + OnMalformedTrack(full_track_name); + return; + } + if (metadata.status == MoqtObjectStatus::kEndOfTrack) { + if (metadata.location < next_location_) { + QUICHE_DLOG(INFO) << "EndOfTrack is too early."; + OnMalformedTrack(full_track_name); + return; + } + // TODO(martinduke): Check that EndOfTrack has normal IDs. + end_of_track_ = metadata.location; + } + auto group_it = queue_.try_emplace(metadata.location.group); + Group& group = group_it.first->second; + if (!group_it.second) { // Group already exists. + if (group.complete && metadata.location.object >= group.next_object) { + QUICHE_DLOG(INFO) << "Skipping object because it is after the end of the " + << "group"; + OnMalformedTrack(full_track_name); + return; + } + if (metadata.status == MoqtObjectStatus::kEndOfGroup && + metadata.location.object < group.next_object) { + QUICHE_DLOG(INFO) << "Skipping EndOfGroup because it is not the last " + << "object in the group."; + OnMalformedTrack(full_track_name); + return; + } + } + auto subgroup_it = group.subgroups.try_emplace(metadata.subgroup); + auto& subgroup = subgroup_it.first->second; + if (!subgroup.empty()) { // Check if the new object is valid + CachedObject& last_object = subgroup.rbegin()->second; + if (last_object.metadata.publisher_priority != + metadata.publisher_priority) { + QUICHE_DLOG(INFO) << "Publisher priority changing in a subgroup"; + OnMalformedTrack(full_track_name); + return; + } + if (last_object.fin_after_this) { + QUICHE_DLOG(INFO) << "Skipping object because it is after the end of the " + << "subgroup"; + OnMalformedTrack(full_track_name); + return; + } + // If last_object has stream-ending status, it should have been caught by + // the fin_after_this check above. + QUICHE_DCHECK( + last_object.metadata.status != MoqtObjectStatus::kEndOfGroup && + last_object.metadata.status != MoqtObjectStatus::kEndOfTrack); + if (last_object.metadata.location.object >= metadata.location.object) { + QUICHE_DLOG(INFO) << "Skipping object because it does not increase the " + << "object ID monotonically in the subgroup."; + return; + } + } + // Object is valid. Update state. + if (next_location_ <= metadata.location) { + next_location_ = metadata.location.Next(); + } + if (metadata.location.object >= group.next_object) { + group.next_object = metadata.location.object + 1; + } + // Anticipate stream FIN with most non-normal objects. + switch (metadata.status) { + case MoqtObjectStatus::kEndOfTrack: + end_of_track_ = metadata.location; + last_object_in_stream = true; + ABSL_FALLTHROUGH_INTENDED; + case MoqtObjectStatus::kEndOfGroup: + group.complete = true; + last_object_in_stream = true; + break; + default: + break; + } + std::shared_ptr slice; + if (!object.empty()) { + slice = std::make_shared( + quiche::QuicheMemSlice::Copy(object)); + } + subgroup.emplace(metadata.location.object, + CachedObject{metadata, slice, last_object_in_stream}); + for (MoqtObjectListener* listener : listeners_) { + listener->OnNewObjectAvailable(metadata.location, metadata.subgroup, + metadata.publisher_priority); + if (last_object_in_stream) { + listener->OnNewFinAvailable(metadata.location, metadata.subgroup); + } + } +} + +void MoqtRelayTrackPublisher::OnStreamFin(const FullTrackName&, + DataStreamIndex stream) { + auto group_it = queue_.find(stream.group); + if (group_it == queue_.end()) { + return; + } + auto subgroup_it = group_it->second.subgroups.find(stream.subgroup); + if (subgroup_it == group_it->second.subgroups.end()) { + return; + } + if (subgroup_it->second.empty()) { + QUICHE_LOG(INFO) << "got a FIN for an empty subgroup"; + return; + } + CachedObject& last_object = subgroup_it->second.rbegin()->second; + last_object.fin_after_this = true; + for (MoqtObjectListener* listener : listeners_) { + listener->OnNewFinAvailable(last_object.metadata.location, stream.subgroup); + } +} + +void MoqtRelayTrackPublisher::OnStreamReset(const FullTrackName&, + DataStreamIndex stream) { + for (MoqtObjectListener* listener : listeners_) { + listener->OnSubgroupAbandoned(stream.group, stream.subgroup, + kResetCodeCanceled); + } +} + +std::optional MoqtRelayTrackPublisher::GetCachedObject( + uint64_t group_id, uint64_t subgroup_id, uint64_t min_object_id) const { + auto group_it = queue_.find(group_id); + if (group_it == queue_.end()) { + // Group does not exist. + return std::nullopt; + } + const Group& group = group_it->second; + auto subgroup_it = group.subgroups.find(subgroup_id); + if (subgroup_it == group.subgroups.end()) { + // Subgroup does not exist. + return std::nullopt; + } + const Subgroup& subgroup = subgroup_it->second; + if (subgroup.empty()) { + return std::nullopt; // There are no objects. + } + // Find an object with ID of at least min_object_id. + auto object_it = subgroup.lower_bound(min_object_id); + if (object_it == subgroup.end()) { + // No object after the last one received. + return std::nullopt; + } + return CachedObjectToPublishedObject(object_it->second); +} + +void MoqtRelayTrackPublisher::AddObjectListener(MoqtObjectListener* listener) { + if (listeners_.empty()) { + MoqtSessionInterface* session = upstream_.GetIfAvailable(); + if (session == nullptr) { + // upstream went away, reject the subscribe. + listener->OnSubscribeRejected(MoqtRequestError{ + RequestErrorCode::kInternalError, + "The upstream session was closed before a subscription could be " + "established."}); + DeleteTrack(); + return; + } + session->SubscribeCurrentObject(track_, this, VersionSpecificParameters()); + } + listeners_.insert(listener); +} + +void MoqtRelayTrackPublisher::RemoveObjectListener( + MoqtObjectListener* listener) { + listeners_.erase(listener); + if (listeners_.empty()) { + DeleteTrack(); + } + // No class access below this line! +} + +void MoqtRelayTrackPublisher::ForAllObjects( + quiche::UnretainedCallback callback) { + for (auto& group_it : queue_) { + for (auto& subgroup_it : group_it.second.subgroups) { + for (auto& object_it : subgroup_it.second) { + callback(object_it.second); + } + } + } +} + +std::optional MoqtRelayTrackPublisher::largest_location() const { + if (next_location_ == Location(0, 0)) { + // Nothing observed or reported. + return std::nullopt; + } + return Location{next_location_.group, next_location_.object - 1}; +} + +std::optional MoqtRelayTrackPublisher::expiration() const { + if (!expiration_.has_value()) { + return std::nullopt; + } + if (expiration_ == quic::QuicTime::Infinite()) { + return quic::QuicTimeDelta::Infinite(); + } + quic::QuicTime now = clock_->Now(); + if (expiration_ < now) { + // TODO(martinduke): Tear everything down; the track is expired. + return quic::QuicTimeDelta::Zero(); + } + return *expiration_ - now; +} + +void MoqtRelayTrackPublisher::DeleteTrack() { + for (MoqtObjectListener* listener : listeners_) { + listener->OnTrackPublisherGone(); + } + MoqtSessionInterface* session = upstream_.GetIfAvailable(); + if (session != nullptr) { + session->Unsubscribe(track_); + } + std::move(delete_track_callback_)(); +} + +} // namespace moqt diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_track_publisher.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_track_publisher.h new file mode 100644 index 0000000000..e41da4a3cb --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_relay_track_publisher.h @@ -0,0 +1,155 @@ +// Copyright 2024 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_MOQT_MOQT_RELAY_TRACK_PUBLISHER_H_ +#define QUICHE_QUIC_MOQT_MOQT_RELAY_TRACK_PUBLISHER_H_ + +#include +#include +#include +#include +#include +#include + +#include "absl/container/btree_map.h" +#include "absl/container/flat_hash_set.h" +#include "absl/status/status.h" +#include "absl/strings/string_view.h" +#include "quiche/quic/core/quic_clock.h" +#include "quiche/quic/core/quic_default_clock.h" +#include "quiche/quic/core/quic_time.h" +#include "quiche/quic/moqt/moqt_fetch_task.h" +#include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" +#include "quiche/quic/moqt/moqt_priority.h" +#include "quiche/quic/moqt/moqt_publisher.h" +#include "quiche/quic/moqt/moqt_session_interface.h" +#include "quiche/common/quiche_callbacks.h" +#include "quiche/common/quiche_weak_ptr.h" + +namespace moqt { + +using DeleteTrackCallback = quiche::SingleUseCallback; + +// MoqtRelayTrackPublisher lets the user send objects by providing the contents +// of the object and the object metadata. It will store these by location +// number. When called on to provide a range of objects, it will fill in any +// missing objects and groups. +// +// The queue will maintain a buffer of three most recent groups that will be +// provided to subscribers automatically. +// +// This class is primarily meant to be used by live relays to buffer the +// frames that arrive for a short time. +class MoqtRelayTrackPublisher : public MoqtTrackPublisher, + public SubscribeVisitor { + public: + MoqtRelayTrackPublisher( + FullTrackName track, quiche::QuicheWeakPtr upstream, + DeleteTrackCallback delete_track_callback, + std::optional forwarding_preference, + std::optional delivery_order, + std::optional expiration = quic::QuicTime::Infinite(), + const quic::QuicClock* clock = quic::QuicDefaultClock::Get()) + : clock_(clock), + track_(std::move(track)), + upstream_(std::move(upstream)), + delete_track_callback_(std::move(delete_track_callback)), + forwarding_preference_(forwarding_preference), + delivery_order_(delivery_order), + expiration_(expiration), + next_location_(0, 0) {} + + MoqtRelayTrackPublisher(const MoqtRelayTrackPublisher&) = delete; + MoqtRelayTrackPublisher(MoqtRelayTrackPublisher&&) = default; + MoqtRelayTrackPublisher& operator=(const MoqtRelayTrackPublisher&) = delete; + MoqtRelayTrackPublisher& operator=(MoqtRelayTrackPublisher&&) = default; + + // SubscribeVisitor implementation. + void OnReply( + const FullTrackName& full_track_name, + std::variant response) override; + // TODO(vasilvv): Implement this if we want to support Object Acks across + // relays. + void OnCanAckObjects(MoqtObjectAckFunction /*ack_function*/) override {} + void OnObjectFragment(const FullTrackName& full_track_name, + const PublishedObjectMetadata& metadata, + absl::string_view object, bool end_of_message) override; + void OnPublishDone(FullTrackName /*full_track_name*/) override {} + void OnMalformedTrack(const FullTrackName& /*full_track_name*/) override { + DeleteTrack(); + } + void OnStreamFin(const FullTrackName&, DataStreamIndex stream) override; + void OnStreamReset(const FullTrackName&, DataStreamIndex stream) override; + + // MoqtTrackPublisher implementation. + const FullTrackName& GetTrackName() const override { return track_; } + std::optional GetCachedObject( + uint64_t group_id, uint64_t subgroup_id, + uint64_t min_object) const override; + void AddObjectListener(MoqtObjectListener* listener) override; + void RemoveObjectListener(MoqtObjectListener* listener) override; + std::optional largest_location() const override; + std::optional forwarding_preference() + const override { + return forwarding_preference_; + } + std::optional delivery_order() const override { + return delivery_order_; + } + std::optional expiration() const override; + std::unique_ptr StandaloneFetch( + Location /*start*/, Location /*end*/, + std::optional /*order*/) override { + return std::make_unique( + absl::UnimplementedError("Fetch not implemented")); + } + std::unique_ptr RelativeFetch( + uint64_t /*group_diff*/, + std::optional /*order*/) override { + return std::make_unique( + absl::UnimplementedError("Fetch not implemented")); + } + std::unique_ptr AbsoluteFetch( + uint64_t /*group*/, std::optional /*order*/) override { + return std::make_unique( + absl::UnimplementedError("Fetch not implemented")); + } + + void ForAllObjects( + quiche::UnretainedCallback callback); + + private: + // The number of recent groups to keep around for newly joined subscribers. + static constexpr size_t kMaxQueuedGroups = 3; + + void DeleteTrack(); + + // Ordered by object id. + using Subgroup = absl::btree_map; + + struct Group { + uint64_t next_object = 0; + bool complete = false; // If true, kEndOfGroup has been received. + absl::btree_map subgroups; // Ordered by subgroup id. + }; + + const quic::QuicClock* clock_; + FullTrackName track_; + quiche::QuicheWeakPtr upstream_; + DeleteTrackCallback delete_track_callback_; + std::optional forwarding_preference_; + std::optional delivery_order_; + // TODO(martinduke): This publisher should destroy itself when the expiration + // time passes. + std::optional expiration_; + absl::btree_map queue_; // Ordered by group id. + absl::flat_hash_set listeners_; + std::optional end_of_track_; + Location next_location_; +}; + +} // namespace moqt + +#endif // QUICHE_QUIC_MOQT_MOQT_RELAY_TRACK_PUBLISHER_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session.cc index 5128ed3c0a..82e1563df1 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session.cc @@ -6,7 +6,6 @@ #include #include -#include #include #include #include @@ -17,6 +16,7 @@ #include "absl/algorithm/container.h" +#include "absl/base/nullability.h" #include "absl/container/btree_map.h" #include "absl/container/flat_hash_map.h" #include "absl/container/flat_hash_set.h" @@ -24,15 +24,16 @@ #include "absl/functional/bind_front.h" #include "absl/memory/memory.h" #include "absl/status/status.h" -#include "absl/status/statusor.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "absl/types/span.h" #include "quiche/quic/core/quic_alarm_factory.h" #include "quiche/quic/core/quic_time.h" #include "quiche/quic/core/quic_types.h" +#include "quiche/quic/moqt/moqt_fetch_task.h" #include "quiche/quic/moqt/moqt_framer.h" #include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_parser.h" #include "quiche/quic/moqt/moqt_priority.h" #include "quiche/quic/moqt/moqt_publisher.h" @@ -46,6 +47,7 @@ #include "quiche/common/quiche_buffer_allocator.h" #include "quiche/common/quiche_mem_slice.h" #include "quiche/common/quiche_stream.h" +#include "quiche/common/quiche_weak_ptr.h" #include "quiche/common/simple_buffer_allocator.h" #include "quiche/web_transport/web_transport.h" @@ -63,11 +65,6 @@ using ::quic::Perspective; // send group is always the same. constexpr webtransport::SendGroupId kMoqtSendGroupId = 0; -bool PublisherHasData(const MoqtTrackPublisher& publisher) { - absl::StatusOr status = publisher.GetTrackStatus(); - return status.ok() && DoesTrackStatusImplyHavingData(*status); -} - std::optional SubscribeMessageToWindow( const MoqtSubscribe& subscribe) { if (!subscribe.forward || @@ -88,10 +85,11 @@ class DefaultPublisher : public MoqtPublisher { return instance; } - absl::StatusOr> GetTrack( + // MoqtPublisher implementation. + absl_nullable std::shared_ptr GetTrack( const FullTrackName& track_name) override { QUICHE_DCHECK(track_name.IsValid()); - return absl::NotFoundError("No tracks published"); + return nullptr; } }; } // namespace @@ -107,6 +105,7 @@ MoqtSession::MoqtSession(webtransport::Session* session, publisher_(DefaultPublisher::GetInstance()), local_max_request_id_(parameters.max_request_id), alarm_factory_(std::move(alarm_factory)), + weak_ptr_factory_(this), liveness_token_(std::make_shared()) { if (parameters_.using_webtrans) { session_->SetOnDraining([this]() { @@ -227,7 +226,7 @@ void MoqtSession::OnDatagramReceived(absl::string_view datagram) { return; } QUICHE_CHECK(!track->is_fetch()); - SubscribeRemoteTrack::Visitor* visitor = track->visitor(); + SubscribeVisitor* visitor = track->visitor(); if (visitor != nullptr) { // TODO(martinduke): Handle extension headers. PublishedObjectMetadata metadata; @@ -253,14 +252,14 @@ void MoqtSession::Error(MoqtError code, absl::string_view error) { std::move(callbacks_.session_terminated_callback)(error); } -bool MoqtSession::SubscribeAnnounces( +bool MoqtSession::SubscribeNamespace( TrackNamespace track_namespace, - MoqtOutgoingSubscribeAnnouncesCallback callback, + MoqtOutgoingSubscribeNamespaceCallback callback, VersionSpecificParameters parameters) { QUICHE_DCHECK(track_namespace.IsValid()); if (received_goaway_ || sent_goaway_) { QUIC_DLOG(INFO) << ENDPOINT - << "Tried to send SUBSCRIBE_ANNOUNCES after GOAWAY"; + << "Tried to send SUBSCRIBE_NAMESPACE after GOAWAY"; return false; } if (next_request_id_ >= peer_max_request_id_) { @@ -271,55 +270,57 @@ bool MoqtSession::SubscribeAnnounces( SendControlMessage(framer_.SerializeRequestsBlocked(requests_blocked)); last_requests_blocked_sent_ = peer_max_request_id_; } - QUIC_DLOG(INFO) << ENDPOINT << "Tried to send SUBSCRIBE_ANNOUNCES with ID " + QUIC_DLOG(INFO) << ENDPOINT << "Tried to send SUBSCRIBE_NAMESPACE with ID " << next_request_id_ << " which is greater than the maximum ID " << peer_max_request_id_; return false; } - if (outgoing_subscribe_announces_.contains(track_namespace)) { + if (outgoing_subscribe_namespaces_.contains(track_namespace)) { std::move(callback)( track_namespace, RequestErrorCode::kInternalError, - "SUBSCRIBE_ANNOUNCES already outstanding for namespace"); + "SUBSCRIBE_NAMESPACE already outstanding for namespace"); return false; } - MoqtSubscribeAnnounces message; + MoqtSubscribeNamespace message; message.request_id = next_request_id_; next_request_id_ += 2; message.track_namespace = track_namespace; message.parameters = parameters; - SendControlMessage(framer_.SerializeSubscribeAnnounces(message)); - QUIC_DLOG(INFO) << ENDPOINT << "Sent SUBSCRIBE_ANNOUNCES message for " + SendControlMessage(framer_.SerializeSubscribeNamespace(message)); + QUIC_DLOG(INFO) << ENDPOINT << "Sent SUBSCRIBE_NAMESPACE message for " << message.track_namespace; - pending_outgoing_subscribe_announces_[message.request_id] = - PendingSubscribeAnnouncesData{track_namespace, std::move(callback)}; - outgoing_subscribe_announces_.emplace(track_namespace); + pending_outgoing_subscribe_namespaces_[message.request_id] = + PendingSubscribeNamespaceData{track_namespace, std::move(callback)}; + outgoing_subscribe_namespaces_.emplace(track_namespace); return true; } -bool MoqtSession::UnsubscribeAnnounces(TrackNamespace track_namespace) { +bool MoqtSession::UnsubscribeNamespace(TrackNamespace track_namespace) { QUICHE_DCHECK(track_namespace.IsValid()); - if (!outgoing_subscribe_announces_.contains(track_namespace)) { + if (!outgoing_subscribe_namespaces_.contains(track_namespace)) { return false; } - MoqtUnsubscribeAnnounces message; + MoqtUnsubscribeNamespace message; message.track_namespace = track_namespace; - SendControlMessage(framer_.SerializeUnsubscribeAnnounces(message)); - QUIC_DLOG(INFO) << ENDPOINT << "Sent UNSUBSCRIBE_ANNOUNCES message for " + SendControlMessage(framer_.SerializeUnsubscribeNamespace(message)); + QUIC_DLOG(INFO) << ENDPOINT << "Sent UNSUBSCRIBE_NAMESPACE message for " << message.track_namespace; - outgoing_subscribe_announces_.erase(track_namespace); + outgoing_subscribe_namespaces_.erase(track_namespace); return true; } -void MoqtSession::Announce(TrackNamespace track_namespace, - MoqtOutgoingAnnounceCallback announce_callback, - VersionSpecificParameters parameters) { +void MoqtSession::PublishNamespace( + TrackNamespace track_namespace, + MoqtOutgoingPublishNamespaceCallback callback, + VersionSpecificParameters parameters) { QUICHE_DCHECK(track_namespace.IsValid()); - if (outgoing_announces_.contains(track_namespace)) { - std::move(announce_callback)( + if (outgoing_publish_namespaces_.contains(track_namespace)) { + std::move(callback)( track_namespace, - MoqtAnnounceErrorReason{RequestErrorCode::kInternalError, - "ANNOUNCE already outstanding for namespace"}); + MoqtRequestError{ + RequestErrorCode::kInternalError, + "PUBLISH_NAMESPACE already outstanding for namespace"}); return; } if (next_request_id_ >= peer_max_request_id_) { @@ -330,57 +331,60 @@ void MoqtSession::Announce(TrackNamespace track_namespace, SendControlMessage(framer_.SerializeRequestsBlocked(requests_blocked)); last_requests_blocked_sent_ = peer_max_request_id_; } - QUIC_DLOG(INFO) << ENDPOINT << "Tried to send ANNOUNCE with ID " + QUIC_DLOG(INFO) << ENDPOINT << "Tried to send PUBLISH_NAMESPACE with ID " << next_request_id_ << " which is greater than the maximum ID " << peer_max_request_id_; return; } if (received_goaway_ || sent_goaway_) { - QUIC_DLOG(INFO) << ENDPOINT << "Tried to send ANNOUNCE after GOAWAY"; + QUIC_DLOG(INFO) << ENDPOINT + << "Tried to send PUBLISH_NAMESPACE after GOAWAY"; return; } - MoqtAnnounce message; + MoqtPublishNamespace message; message.request_id = next_request_id_; next_request_id_ += 2; message.track_namespace = track_namespace; message.parameters = parameters; - SendControlMessage(framer_.SerializeAnnounce(message)); - QUIC_DLOG(INFO) << ENDPOINT << "Sent ANNOUNCE message for " + SendControlMessage(framer_.SerializePublishNamespace(message)); + QUIC_DLOG(INFO) << ENDPOINT << "Sent PUBLISH_NAMESPACE message for " << message.track_namespace; - pending_outgoing_announces_[message.request_id] = track_namespace; - outgoing_announces_[track_namespace] = std::move(announce_callback); + pending_outgoing_publish_namespaces_[message.request_id] = track_namespace; + outgoing_publish_namespaces_[track_namespace] = std::move(callback); } -bool MoqtSession::Unannounce(TrackNamespace track_namespace) { +bool MoqtSession::PublishNamespaceDone(TrackNamespace track_namespace) { QUICHE_DCHECK(track_namespace.IsValid()); - auto it = outgoing_announces_.find(track_namespace); - if (it == outgoing_announces_.end()) { - return false; // Could have been destroyed by ANNOUNCE_CANCEL. + auto it = outgoing_publish_namespaces_.find(track_namespace); + if (it == outgoing_publish_namespaces_.end()) { + return false; // Could have been destroyed by PUBLISH_NAMESPACE_CANCEL. } - MoqtUnannounce message; + MoqtPublishNamespaceDone message; message.track_namespace = track_namespace; - SendControlMessage(framer_.SerializeUnannounce(message)); - QUIC_DLOG(INFO) << ENDPOINT << "Sent UNANNOUNCE message for " + SendControlMessage(framer_.SerializePublishNamespaceDone(message)); + QUIC_DLOG(INFO) << ENDPOINT << "Sent PUBLISH_NAMESPACE_DONE message for " << message.track_namespace; - outgoing_announces_.erase(it); + outgoing_publish_namespaces_.erase(it); return true; } -void MoqtSession::CancelAnnounce(TrackNamespace track_namespace, - RequestErrorCode code, - absl::string_view reason) { +void MoqtSession::CancelPublishNamespace(TrackNamespace track_namespace, + RequestErrorCode code, + absl::string_view reason) { QUICHE_DCHECK(track_namespace.IsValid()); - MoqtAnnounceCancel message{track_namespace, code, std::string(reason)}; + MoqtPublishNamespaceCancel message{track_namespace, code, + std::string(reason)}; - SendControlMessage(framer_.SerializeAnnounceCancel(message)); - QUIC_DLOG(INFO) << ENDPOINT << "Sent ANNOUNCE_CANCEL message for " + incoming_publish_namespaces_.erase(track_namespace); + SendControlMessage(framer_.SerializePublishNamespaceCancel(message)); + QUIC_DLOG(INFO) << ENDPOINT << "Sent PUBLISH_NAMESPACE_CANCEL message for " << message.track_namespace << " with reason " << reason; } bool MoqtSession::SubscribeAbsolute(const FullTrackName& name, uint64_t start_group, uint64_t start_object, - SubscribeRemoteTrack::Visitor* visitor, + SubscribeVisitor* visitor, VersionSpecificParameters parameters) { QUICHE_DCHECK(name.IsValid()); MoqtSubscribe message; @@ -398,7 +402,7 @@ bool MoqtSession::SubscribeAbsolute(const FullTrackName& name, bool MoqtSession::SubscribeAbsolute(const FullTrackName& name, uint64_t start_group, uint64_t start_object, uint64_t end_group, - SubscribeRemoteTrack::Visitor* visitor, + SubscribeVisitor* visitor, VersionSpecificParameters parameters) { QUICHE_DCHECK(name.IsValid()); if (end_group < start_group) { @@ -418,7 +422,7 @@ bool MoqtSession::SubscribeAbsolute(const FullTrackName& name, } bool MoqtSession::SubscribeCurrentObject(const FullTrackName& name, - SubscribeRemoteTrack::Visitor* visitor, + SubscribeVisitor* visitor, VersionSpecificParameters parameters) { QUICHE_DCHECK(name.IsValid()); MoqtSubscribe message; @@ -434,7 +438,7 @@ bool MoqtSession::SubscribeCurrentObject(const FullTrackName& name, } bool MoqtSession::SubscribeNextGroup(const FullTrackName& name, - SubscribeRemoteTrack::Visitor* visitor, + SubscribeVisitor* visitor, VersionSpecificParameters parameters) { QUICHE_DCHECK(name.IsValid()); MoqtSubscribe message; @@ -523,7 +527,10 @@ bool MoqtSession::Fetch(const FullTrackName& name, return false; } MoqtFetch message; - message.fetch = StandaloneFetch(name, start, end_group, end_object); + Location end_location = end_object.has_value() + ? Location(end_group, *end_object) + : Location(end_group, kMaxObjectId); + message.fetch = StandaloneFetch(name, start, end_location); message.request_id = next_request_id_; next_request_id_ += 2; message.subscriber_priority = priority; @@ -538,7 +545,7 @@ bool MoqtSession::Fetch(const FullTrackName& name, } bool MoqtSession::RelativeJoiningFetch(const FullTrackName& name, - SubscribeRemoteTrack::Visitor* visitor, + SubscribeVisitor* visitor, uint64_t num_previous_groups, VersionSpecificParameters parameters) { QUICHE_DCHECK(name.IsValid()); @@ -560,7 +567,7 @@ bool MoqtSession::RelativeJoiningFetch(const FullTrackName& name, } bool MoqtSession::RelativeJoiningFetch( - const FullTrackName& name, SubscribeRemoteTrack::Visitor* visitor, + const FullTrackName& name, SubscribeVisitor* visitor, FetchResponseCallback callback, uint64_t num_previous_groups, MoqtPriority priority, std::optional delivery_order, VersionSpecificParameters parameters) { @@ -584,6 +591,7 @@ bool MoqtSession::RelativeJoiningFetch( if (!Subscribe(subscribe, visitor)) { return false; } + MoqtFetch fetch; fetch.request_id = next_request_id_; next_request_id_ += 2; @@ -591,6 +599,7 @@ bool MoqtSession::RelativeJoiningFetch( fetch.group_order = delivery_order; fetch.fetch = JoiningFetchRelative{subscribe.request_id, num_previous_groups}; fetch.parameters = parameters; + fetch.parameters.delivery_timeout = quic::QuicTimeDelta::Infinite(); SendControlMessage(framer_.SerializeFetch(fetch)); QUIC_DLOG(INFO) << ENDPOINT << "Sent Joining FETCH message for " << name; auto upstream_fetch = @@ -639,7 +648,9 @@ void MoqtSession::PublishedFetch::FetchStreamVisitor::OnCanWrite() { if (fetch->session_->WriteObjectToStream( stream_, fetch->request_id(), object.metadata, std::move(object.payload), MoqtDataStreamType::Fetch(), - !stream_header_written_, + // last Object ID doesn't matter for FETCH, just use zero. + stream_header_written_ ? std::optional(0) + : std::nullopt, /*fin=*/false)) { stream_header_written_ = true; } @@ -667,8 +678,8 @@ void MoqtSession::GoAwayTimeoutDelegate::OnAlarm() { "Peer did not close session after GOAWAY"); } -bool MoqtSession::SubscribeIsDone(uint64_t request_id, SubscribeDoneCode code, - absl::string_view error_reason) { +bool MoqtSession::PublishIsDone(uint64_t request_id, PublishDoneCode code, + absl::string_view error_reason) { auto it = published_subscriptions_.find(request_id); if (it == published_subscriptions_.end()) { return false; @@ -678,12 +689,12 @@ bool MoqtSession::SubscribeIsDone(uint64_t request_id, SubscribeDoneCode code, std::vector streams_to_reset = subscription.GetAllStreams(); - MoqtSubscribeDone subscribe_done; + MoqtPublishDone subscribe_done; subscribe_done.request_id = request_id; subscribe_done.status_code = code; subscribe_done.stream_count = subscription.streams_opened(); subscribe_done.error_reason = error_reason; - SendControlMessage(framer_.SerializeSubscribeDone(subscribe_done)); + SendControlMessage(framer_.SerializePublishDone(subscribe_done)); QUIC_DLOG(INFO) << ENDPOINT << "Sent SUBSCRIBE_DONE message for " << subscription.publisher().GetTrackName(); // Clean up the subscription @@ -705,15 +716,14 @@ void MoqtSession::MaybeDestroySubscription(SubscribeRemoteTrack* subscribe) { } void MoqtSession::DestroySubscription(SubscribeRemoteTrack* subscribe) { - subscribe->visitor()->OnSubscribeDone(subscribe->full_track_name()); + subscribe->visitor()->OnPublishDone(subscribe->full_track_name()); subscribe_by_name_.erase(subscribe->full_track_name()); if (subscribe->track_alias().has_value()) { subscribe_by_alias_.erase(*subscribe->track_alias()); } } -bool MoqtSession::Subscribe(MoqtSubscribe& message, - SubscribeRemoteTrack::Visitor* visitor) { +bool MoqtSession::Subscribe(MoqtSubscribe& message, SubscribeVisitor* visitor) { // TODO(martinduke): support authorization info if (next_request_id_ >= peer_max_request_id_) { if (!last_requests_blocked_sent_.has_value() || @@ -926,6 +936,7 @@ MoqtSession::ControlStream::ControlStream(MoqtSession* session, stream_->SetPriority( webtransport::StreamPriority{/*send_group_id=*/kMoqtSendGroupId, /*send_order=*/kMoqtControlStreamSendOrder}); + session->trace_recorder_.RecordControlStreamCreated(stream->GetStreamId()); } void MoqtSession::ControlStream::OnCanRead() { @@ -1038,14 +1049,13 @@ void MoqtSession::ControlStream::OnSubscribeMessage( return; } const FullTrackName& track_name = message.full_track_name; - absl::StatusOr> track_publisher = + std::shared_ptr track_publisher = session_->publisher_->GetTrack(track_name); - if (!track_publisher.ok()) { + if (track_publisher == nullptr) { QUIC_DLOG(INFO) << ENDPOINT << "SUBSCRIBE for " << track_name - << " rejected by the application: " - << track_publisher.status(); + << " rejected by the application: does not exist"; SendSubscribeError(message.request_id, RequestErrorCode::kTrackDoesNotExist, - track_publisher.status().message()); + "not found"); return; } @@ -1058,9 +1068,9 @@ void MoqtSession::ControlStream::OnSubscribeMessage( session_->monitoring_interfaces_for_published_tracks_.erase(monitoring_it); } - MoqtTrackPublisher* track_publisher_ptr = track_publisher->get(); + MoqtTrackPublisher* track_publisher_ptr = track_publisher.get(); auto subscription = std::make_unique( - session_, *std::move(track_publisher), message, monitoring); + session_, track_publisher, message, monitoring); subscription->set_delivery_timeout(message.parameters.delivery_timeout); MoqtSession::PublishedSubscription* subscription_ptr = subscription.get(); auto [it, success] = session_->published_subscriptions_.emplace( @@ -1107,11 +1117,13 @@ void MoqtSession::ControlStream::OnSubscribeOkMessage( subscribe->set_track_alias(message.track_alias); // TODO(martinduke): Handle expires field. if (message.largest_location.has_value()) { - subscribe->TruncateStart(message.largest_location->next()); + subscribe->TruncateStart(message.largest_location->Next()); } if (subscribe->visitor() != nullptr) { - subscribe->visitor()->OnReply(track->full_track_name(), - message.largest_location, std::nullopt); + subscribe->visitor()->OnReply( + track->full_track_name(), + SubscribeOkData{message.expires, message.group_order, + message.largest_location, message.parameters}); } } @@ -1146,8 +1158,9 @@ void MoqtSession::ControlStream::OnSubscribeErrorMessage( // subscribe will be deleted after calling Subscribe(). session_->subscribe_by_name_.erase(subscribe->full_track_name()); if (subscribe->visitor() != nullptr) { - subscribe->visitor()->OnReply(subscribe->full_track_name(), std::nullopt, - message.reason_phrase); + subscribe->visitor()->OnReply( + subscribe->full_track_name(), + MoqtRequestError{message.error_code, message.reason_phrase}); } session_->upstream_by_id_.erase(subscribe->request_id()); } @@ -1163,8 +1176,8 @@ void MoqtSession::ControlStream::OnUnsubscribeMessage( session_->published_subscriptions_.erase(it); } -void MoqtSession::ControlStream::OnSubscribeDoneMessage( - const MoqtSubscribeDone& message) { +void MoqtSession::ControlStream::OnPublishDoneMessage( + const MoqtPublishDone& message) { auto it = session_->upstream_by_id_.find(message.request_id); if (it == session_->upstream_by_id_.end()) { return; @@ -1172,10 +1185,10 @@ void MoqtSession::ControlStream::OnSubscribeDoneMessage( auto* subscribe = static_cast(it->second.get()); QUIC_DLOG(INFO) << ENDPOINT << "Received a SUBSCRIBE_DONE for " << it->second->full_track_name(); - subscribe->OnSubscribeDone( + subscribe->OnPublishDone( message.stream_count, session_->callbacks_.clock, absl::WrapUnique(session_->alarm_factory_->CreateAlarm( - new SubscribeDoneDelegate(session_, subscribe)))); + new PublishDoneDelegate(session_, subscribe)))); session_->MaybeDestroySubscription(subscribe); } @@ -1190,126 +1203,146 @@ void MoqtSession::ControlStream::OnSubscribeUpdateMessage( it->second->set_delivery_timeout(message.parameters.delivery_timeout); } -void MoqtSession::ControlStream::OnAnnounceMessage( - const MoqtAnnounce& message) { +void MoqtSession::ControlStream::OnPublishNamespaceMessage( + const MoqtPublishNamespace& message) { if (!session_->ValidateRequestId(message.request_id)) { return; } if (session_->sent_goaway_) { - QUIC_DLOG(INFO) << ENDPOINT << "Received an ANNOUNCE after GOAWAY"; - MoqtAnnounceError error; + QUIC_DLOG(INFO) << ENDPOINT << "Received a PUBLISH_NAMESPACE after GOAWAY"; + MoqtPublishNamespaceError error; error.request_id = message.request_id; error.error_code = RequestErrorCode::kUnauthorized; - error.error_reason = "ANNOUNCE after GOAWAY"; - SendOrBufferMessage(session_->framer_.SerializeAnnounceError(error)); + error.error_reason = "PUBLISH_NAMESPACE after GOAWAY"; + SendOrBufferMessage( + session_->framer_.SerializePublishNamespaceError(error)); return; } - std::optional error = - session_->callbacks_.incoming_announce_callback(message.track_namespace, - message.parameters); - if (error.has_value()) { - MoqtAnnounceError reply; - reply.request_id = message.request_id; - reply.error_code = error->error_code; - reply.error_reason = error->reason_phrase; - SendOrBufferMessage(session_->framer_.SerializeAnnounceError(reply)); - return; - } - MoqtAnnounceOk ok; - ok.request_id = message.request_id; - SendOrBufferMessage(session_->framer_.SerializeAnnounceOk(ok)); + QUIC_DLOG(INFO) << ENDPOINT << "Received a PUBLISH_NAMESPACE for " + << message.track_namespace; + quiche::QuicheWeakPtr session_weakptr = + session_->GetWeakPtr(); + session_->callbacks_.incoming_publish_namespace_callback( + message.track_namespace, message.parameters, + [&](std::optional error) { + MoqtSession* session = + static_cast(session_weakptr.GetIfAvailable()); + if (session == nullptr) { + return; + } + if (error.has_value()) { + MoqtPublishNamespaceError reply; + reply.request_id = message.request_id; + reply.error_code = error->error_code; + reply.error_reason = error->reason_phrase; + SendOrBufferMessage( + session->framer_.SerializePublishNamespaceError(reply)); + } else { + MoqtPublishNamespaceOk ok; + ok.request_id = message.request_id; + SendOrBufferMessage(session->framer_.SerializePublishNamespaceOk(ok)); + session->incoming_publish_namespaces_.insert(message.track_namespace); + } + }); } -// Do not enforce that there is only one of OK or ERROR per ANNOUNCE. Upon -// ERROR, we immediately destroy the state. -void MoqtSession::ControlStream::OnAnnounceOkMessage( - const MoqtAnnounceOk& message) { - auto it = session_->pending_outgoing_announces_.find(message.request_id); - if (it == session_->pending_outgoing_announces_.end()) { +// Do not enforce that there is only one of OK or ERROR per PUBLISH_NAMESPACE. +// Upon ERROR, we immediately destroy the state. +void MoqtSession::ControlStream::OnPublishNamespaceOkMessage( + const MoqtPublishNamespaceOk& message) { + auto it = + session_->pending_outgoing_publish_namespaces_.find(message.request_id); + if (it == session_->pending_outgoing_publish_namespaces_.end()) { session_->Error(MoqtError::kProtocolViolation, - "Received ANNOUNCE_OK for unknown request_id"); + "Received PUBLISH_NAMESPACE_OK for unknown request_id"); return; } TrackNamespace track_namespace = it->second; - session_->pending_outgoing_announces_.erase(it); - auto callback_it = session_->outgoing_announces_.find(track_namespace); - if (callback_it == session_->outgoing_announces_.end()) { - // It might have already been destroyed due to UNANNOUNCE. + session_->pending_outgoing_publish_namespaces_.erase(it); + auto callback_it = + session_->outgoing_publish_namespaces_.find(track_namespace); + if (callback_it == session_->outgoing_publish_namespaces_.end()) { + // It might have already been destroyed due to PUBLISH_NAMESPACE_DONE. return; } std::move(callback_it->second)(track_namespace, std::nullopt); } -void MoqtSession::ControlStream::OnAnnounceErrorMessage( - const MoqtAnnounceError& message) { - auto it = session_->pending_outgoing_announces_.find(message.request_id); - if (it == session_->pending_outgoing_announces_.end()) { +void MoqtSession::ControlStream::OnPublishNamespaceErrorMessage( + const MoqtPublishNamespaceError& message) { + auto it = + session_->pending_outgoing_publish_namespaces_.find(message.request_id); + if (it == session_->pending_outgoing_publish_namespaces_.end()) { session_->Error(MoqtError::kProtocolViolation, - "Received ANNOUNCE_ERROR for unknown request_id"); + "Received PUBLISH_NAMESPACE_ERROR for unknown request_id"); return; } TrackNamespace track_namespace = it->second; - session_->pending_outgoing_announces_.erase(it); - auto it2 = session_->outgoing_announces_.find(track_namespace); - if (it2 == session_->outgoing_announces_.end()) { - return; // State might have been destroyed due to UNANNOUNCE. + session_->pending_outgoing_publish_namespaces_.erase(it); + auto it2 = session_->outgoing_publish_namespaces_.find(track_namespace); + if (it2 == session_->outgoing_publish_namespaces_.end()) { + return; // State might have been destroyed due to PUBLISH_NAMESPACE_DONE. } std::move(it2->second)( track_namespace, - MoqtAnnounceErrorReason{message.error_code, - std::string(message.error_reason)}); - session_->outgoing_announces_.erase(it2); + MoqtRequestError{message.error_code, std::string(message.error_reason)}); + session_->outgoing_publish_namespaces_.erase(it2); } -void MoqtSession::ControlStream::OnAnnounceCancelMessage( - const MoqtAnnounceCancel& message) { +void MoqtSession::ControlStream::OnPublishNamespaceDoneMessage( + const MoqtPublishNamespaceDone& message) { + session_->incoming_publish_namespaces_.erase(message.track_namespace); + session_->callbacks_.incoming_publish_namespace_callback( + message.track_namespace, std::nullopt, nullptr); +} + +void MoqtSession::ControlStream::OnPublishNamespaceCancelMessage( + const MoqtPublishNamespaceCancel& message) { // The spec currently says that if a later SUBSCRIBE arrives for this // namespace, that SHOULD be a session error. I'm hoping that via Issue #557, // this will go away. Regardless, a SHOULD will not compel the session to keep // state forever, so there is no support for this requirement. - auto it = session_->outgoing_announces_.find(message.track_namespace); - if (it == session_->outgoing_announces_.end()) { - return; // State might have been destroyed due to UNANNOUNCE. + auto it = + session_->outgoing_publish_namespaces_.find(message.track_namespace); + if (it == session_->outgoing_publish_namespaces_.end()) { + return; // State might have been destroyed due to PUBLISH_NAMESPACE_DONE. } std::move(it->second)( message.track_namespace, - MoqtAnnounceErrorReason{message.error_code, - std::string(message.error_reason)}); - session_->outgoing_announces_.erase(it); + MoqtRequestError{message.error_code, std::string(message.error_reason)}); + session_->outgoing_publish_namespaces_.erase(it); } -void MoqtSession::ControlStream::OnTrackStatusRequestMessage( - const MoqtTrackStatusRequest& message) { +void MoqtSession::ControlStream::OnTrackStatusMessage( + const MoqtTrackStatus& message) { if (!session_->ValidateRequestId(message.request_id)) { return; } if (session_->sent_goaway_) { QUIC_DLOG(INFO) << ENDPOINT << "Received a TRACK_STATUS_REQUEST after GOAWAY"; - SendOrBufferMessage(session_->framer_.SerializeTrackStatus( - MoqtTrackStatus(message.request_id, MoqtTrackStatusCode::kDoesNotExist, - Location(0, 0)))); + MoqtTrackStatusError error; + error.request_id = message.request_id; + error.error_code = RequestErrorCode::kUnauthorized; + error.reason_phrase = "TRACK_STATUS_REQUEST after GOAWAY"; + SendOrBufferMessage(session_->framer_.SerializeTrackStatusError(error)); return; } // TODO(martinduke): Handle authentication. - absl::StatusOr> track = + std::shared_ptr track = session_->publisher_->GetTrack(message.full_track_name); - if (!track.ok()) { - SendOrBufferMessage(session_->framer_.SerializeTrackStatus( - MoqtTrackStatus(message.request_id, MoqtTrackStatusCode::kDoesNotExist, - Location(0, 0)))); + if (track == nullptr) { + MoqtTrackStatusError error; + error.request_id = message.request_id; + error.error_code = RequestErrorCode::kTrackDoesNotExist; + error.reason_phrase = "Track does not exist"; + SendOrBufferMessage(session_->framer_.SerializeTrackStatusError(error)); return; } - session_->incoming_track_status_.emplace( - std::pair( - message.request_id, - DownstreamTrackStatus(message.request_id, session_, track->get()))); -} - -void MoqtSession::ControlStream::OnUnannounceMessage( - const MoqtUnannounce& message) { - session_->callbacks_.incoming_announce_callback(message.track_namespace, - std::nullopt); + auto [it, inserted] = session_->incoming_track_status_.emplace( + message.request_id, std::make_unique( + message.request_id, session_, track.get())); + track->AddObjectListener(it->second.get()); } void MoqtSession::ControlStream::OnGoAwayMessage(const MoqtGoAway& message) { @@ -1331,75 +1364,93 @@ void MoqtSession::ControlStream::OnGoAwayMessage(const MoqtGoAway& message) { } } -void MoqtSession::ControlStream::OnSubscribeAnnouncesMessage( - const MoqtSubscribeAnnounces& message) { +void MoqtSession::ControlStream::OnSubscribeNamespaceMessage( + const MoqtSubscribeNamespace& message) { if (!session_->ValidateRequestId(message.request_id)) { return; } // TODO(martinduke): Handle authentication. if (session_->sent_goaway_) { QUIC_DLOG(INFO) << ENDPOINT - << "Received a SUBSCRIBE_ANNOUNCES after GOAWAY"; - MoqtSubscribeAnnouncesError error; + << "Received a SUBSCRIBE_NAMESPACE after GOAWAY"; + MoqtSubscribeNamespaceError error; error.request_id = message.request_id; error.error_code = RequestErrorCode::kUnauthorized; - error.error_reason = "SUBSCRIBE_ANNOUNCES after GOAWAY"; + error.error_reason = "SUBSCRIBE_NAMESPACE after GOAWAY"; SendOrBufferMessage( - session_->framer_.SerializeSubscribeAnnouncesError(error)); + session_->framer_.SerializeSubscribeNamespaceError(error)); return; } - std::optional result = - session_->callbacks_.incoming_subscribe_announces_callback( - message.track_namespace, message.parameters); - if (result.has_value()) { - MoqtSubscribeAnnouncesError error; + if (!session_->incoming_subscribe_namespace_.SubscribeNamespace( + message.track_namespace)) { + QUIC_DLOG(INFO) << ENDPOINT << "Received a SUBSCRIBE_NAMESPACE for " + << message.track_namespace + << " that is already subscribed to"; + MoqtSubscribeNamespaceError error; error.request_id = message.request_id; - error.error_code = result->error_code; - error.error_reason = result->reason_phrase; + error.error_code = RequestErrorCode::kNamespacePrefixOverlap; + error.error_reason = "SUBSCRIBE_NAMESPACE for similar subscribed namespace"; SendOrBufferMessage( - session_->framer_.SerializeSubscribeAnnouncesError(error)); + session_->framer_.SerializeSubscribeNamespaceError(error)); return; } - MoqtSubscribeAnnouncesOk ok; - ok.request_id = message.request_id; - SendOrBufferMessage(session_->framer_.SerializeSubscribeAnnouncesOk(ok)); + (session_->callbacks_.incoming_subscribe_namespace_callback)( + message.track_namespace, message.parameters, + [&](std::optional error) { + if (error.has_value()) { + MoqtSubscribeNamespaceError reply; + reply.request_id = message.request_id; + reply.error_code = error->error_code; + reply.error_reason = error->reason_phrase; + SendOrBufferMessage( + session_->framer_.SerializeSubscribeNamespaceError(reply)); + session_->incoming_subscribe_namespace_.UnsubscribeNamespace( + message.track_namespace); + } else { + MoqtSubscribeNamespaceOk ok; + ok.request_id = message.request_id; + SendOrBufferMessage( + session_->framer_.SerializeSubscribeNamespaceOk(ok)); + } + }); } -void MoqtSession::ControlStream::OnSubscribeAnnouncesOkMessage( - const MoqtSubscribeAnnouncesOk& message) { +void MoqtSession::ControlStream::OnSubscribeNamespaceOkMessage( + const MoqtSubscribeNamespaceOk& message) { auto it = - session_->pending_outgoing_subscribe_announces_.find(message.request_id); - if (it == session_->pending_outgoing_subscribe_announces_.end()) { + session_->pending_outgoing_subscribe_namespaces_.find(message.request_id); + if (it == session_->pending_outgoing_subscribe_namespaces_.end()) { session_->Error(MoqtError::kProtocolViolation, - "Received SUBSCRIBE_ANNOUNCES_OK for unknown request_id"); - return; // UNSUBSCRIBE_ANNOUNCES may already have deleted the entry. + "Received SUBSCRIBE_NAMESPACE_OK for unknown request_id"); + return; // UNSUBSCRIBE_NAMESPACE may already have deleted the entry. } std::move(it->second.callback)(it->second.track_namespace, std::nullopt, ""); - session_->pending_outgoing_subscribe_announces_.erase(it); + session_->pending_outgoing_subscribe_namespaces_.erase(it); } -void MoqtSession::ControlStream::OnSubscribeAnnouncesErrorMessage( - const MoqtSubscribeAnnouncesError& message) { +void MoqtSession::ControlStream::OnSubscribeNamespaceErrorMessage( + const MoqtSubscribeNamespaceError& message) { auto it = - session_->pending_outgoing_subscribe_announces_.find(message.request_id); - if (it == session_->pending_outgoing_subscribe_announces_.end()) { + session_->pending_outgoing_subscribe_namespaces_.find(message.request_id); + if (it == session_->pending_outgoing_subscribe_namespaces_.end()) { session_->Error( MoqtError::kProtocolViolation, - "Received SUBSCRIBE_ANNOUNCES_ERROR for unknown request_id"); - return; // UNSUBSCRIBE_ANNOUNCES may already have deleted the entry. + "Received SUBSCRIBE_NAMESPACE_ERROR for unknown request_id"); + return; // UNSUBSCRIBE_NAMESPACE may already have deleted the entry. } std::move(it->second.callback)(it->second.track_namespace, message.error_code, absl::string_view(message.error_reason)); - session_->outgoing_subscribe_announces_.erase(it->second.track_namespace); - session_->pending_outgoing_subscribe_announces_.erase(it); + session_->outgoing_subscribe_namespaces_.erase(it->second.track_namespace); + session_->pending_outgoing_subscribe_namespaces_.erase(it); } -void MoqtSession::ControlStream::OnUnsubscribeAnnouncesMessage( - const MoqtUnsubscribeAnnounces& message) { +void MoqtSession::ControlStream::OnUnsubscribeNamespaceMessage( + const MoqtUnsubscribeNamespace& message) { // MoqtSession keeps no state here, so just tell the application. - std::optional result = - session_->callbacks_.incoming_subscribe_announces_callback( - message.track_namespace, std::nullopt); + session_->incoming_subscribe_namespace_.UnsubscribeNamespace( + message.track_namespace); + session_->callbacks_.incoming_subscribe_namespace_callback( + message.track_namespace, std::nullopt, nullptr); } void MoqtSession::ControlStream::OnMaxRequestIdMessage( @@ -1425,31 +1476,42 @@ void MoqtSession::ControlStream::OnFetchMessage(const MoqtFetch& message) { "FETCH after GOAWAY"); return; } + std::unique_ptr fetch; FullTrackName track_name; - Location start_object; - uint64_t end_group; - std::optional end_object; if (std::holds_alternative(message.fetch)) { const StandaloneFetch& standalone_fetch = std::get(message.fetch); track_name = standalone_fetch.full_track_name; - start_object = standalone_fetch.start_object; - end_group = standalone_fetch.end_group; - end_object = standalone_fetch.end_object; + std::shared_ptr track_publisher = + session_->publisher_->GetTrack(track_name); + if (track_publisher == nullptr) { + QUIC_DLOG(INFO) << ENDPOINT << "FETCH for " << track_name + << " rejected by the application: not found"; + SendFetchError(message.request_id, RequestErrorCode::kTrackDoesNotExist, + "not found"); + } + QUIC_DLOG(INFO) << ENDPOINT << "Received a StandaloneFETCH for " + << track_name; + // The check for end_object < start_object is done in + // MoqtTrackPublisher::Fetch(). + fetch = track_publisher->StandaloneFetch(standalone_fetch.start_location, + standalone_fetch.end_location, + message.group_order); } else { - uint64_t joining_subscribe_id = + // Joining Fetch processing. + uint64_t joining_request_id = std::holds_alternative(message.fetch) ? std::get(message.fetch) - .joining_subscribe_id - : std::get(message.fetch) - .joining_subscribe_id; - auto it = session_->published_subscriptions_.find(joining_subscribe_id); + .joining_request_id + : std::get(message.fetch).joining_request_id; + auto it = session_->published_subscriptions_.find(joining_request_id); if (it == session_->published_subscriptions_.end()) { QUIC_DLOG(INFO) << ENDPOINT << "Received a JOINING_FETCH for " - << "subscribe_id " << joining_subscribe_id + << "request_id " << joining_request_id << " that does not exist"; - SendFetchError(message.request_id, RequestErrorCode::kTrackDoesNotExist, - "Joining Fetch for non-existent subscribe"); + SendFetchError(message.request_id, + RequestErrorCode::kInvalidJoiningRequestId, + "Joining Fetch for non-existent request"); return; } if (it->second->filter_type() != MoqtFilterType::kLatestObject) { @@ -1457,50 +1519,29 @@ void MoqtSession::ControlStream::OnFetchMessage(const MoqtFetch& message) { // LatestObject and AbsoluteStart with object ID > 0, but accept // JoiningFetch for AbsoluteStart. QUIC_DLOG(INFO) << ENDPOINT << "Received a JOINING_FETCH for " - << "subscribe_id " << joining_subscribe_id + << "joining_request_id " << joining_request_id << " that is not a LatestObject"; session_->Error(MoqtError::kProtocolViolation, "Joining Fetch for non-LatestObject subscribe"); return; } track_name = it->second->publisher().GetTrackName(); - Location fetch_end = it->second->GetWindowStart(); if (std::holds_alternative(message.fetch)) { const JoiningFetchRelative& relative_fetch = std::get(message.fetch); - if (relative_fetch.joining_start > fetch_end.group) { - start_object = Location(0, 0); - } else { - start_object = - Location(fetch_end.group - relative_fetch.joining_start, 0); - } + QUIC_DLOG(INFO) << ENDPOINT << "Received a Relative Joining FETCH for " + << track_name; + fetch = it->second->publisher().RelativeFetch( + relative_fetch.joining_start, message.group_order); } else { const JoiningFetchAbsolute& absolute_fetch = std::get(message.fetch); - start_object = - Location(fetch_end.group - absolute_fetch.joining_start, 0); + QUIC_DLOG(INFO) << ENDPOINT << "Received a Absolute Joining FETCH for " + << track_name; + fetch = it->second->publisher().AbsoluteFetch( + absolute_fetch.joining_start, message.group_order); } - end_group = fetch_end.group; - end_object = fetch_end.object - 1; } - // The check for end_object < start_object is done in - // MoqtTrackPublisher::Fetch(). - QUIC_DLOG(INFO) << ENDPOINT << "Received a FETCH for " << track_name; - absl::StatusOr> track_publisher = - session_->publisher_->GetTrack(track_name); - if (!track_publisher.ok()) { - QUIC_DLOG(INFO) << ENDPOINT << "FETCH for " << track_name - << " rejected by the application: " - << track_publisher.status(); - SendFetchError(message.request_id, RequestErrorCode::kTrackDoesNotExist, - track_publisher.status().message()); - return; - } - std::unique_ptr fetch = - (*track_publisher) - ->Fetch(start_object, end_group, end_object, - message.group_order.value_or( - (*track_publisher)->GetDeliveryOrder())); if (!fetch->GetStatus().ok()) { QUIC_DLOG(INFO) << ENDPOINT << "FETCH for " << track_name << " could not initialize the task"; @@ -1520,8 +1561,7 @@ void MoqtSession::ControlStream::OnFetchMessage(const MoqtFetch& message) { } MoqtFetchTask* fetch_task = result.first->second->fetch_task(); fetch_task->SetFetchResponseCallback( - [this, request_id = message.request_id, fetch_start = start_object, - fetch_end = Location(end_group, end_object.value_or(UINT64_MAX))]( + [this, request_id = message.request_id]( std::variant message) { if (!session_->incoming_fetches_.contains(request_id)) { return; // FETCH was cancelled. @@ -1529,15 +1569,6 @@ void MoqtSession::ControlStream::OnFetchMessage(const MoqtFetch& message) { if (std::holds_alternative(message)) { MoqtFetchOk& fetch_ok = std::get(message); fetch_ok.request_id = request_id; - if (fetch_ok.end_location < fetch_start || - fetch_ok.end_location > fetch_end) { - // TODO(martinduke): Add end_of_track to fetch_ok and check it's - // larger than end_location. - QUIC_BUG(quic_bug_fetch_ok_status_error) - << "FETCH_OK end or end_of_track is invalid"; - session_->Error(MoqtError::kInternalError, "FETCH_OK status error"); - return; - } SendOrBufferMessage(session_->framer_.SerializeFetchOk(fetch_ok)); return; } @@ -1676,6 +1707,9 @@ void MoqtSession::IncomingDataStream::OnObjectMessage(const MoqtObject& message, << " priority " << message.publisher_priority << " length " << payload.size() << " length " << message.payload_length << (end_of_message ? "F" : ""); + if (!index_.has_value()) { + index_ = DataStreamIndex(message.group_id, message.subgroup_id); + } if (!session_->parameters_.deliver_partial_objects) { if (!end_of_message) { // Buffer partial object. if (partial_object_.empty()) { @@ -1725,10 +1759,6 @@ void MoqtSession::IncomingDataStream::OnObjectMessage(const MoqtObject& message, session_->OnMalformedTrack(track); return; } - if (message.object_id < next_object_id_) { - session_->OnMalformedTrack(track); - return; - } if (end_of_message) { next_object_id_ = message.object_id + 1; if (message.object_status == MoqtObjectStatus::kEndOfTrack || @@ -1742,10 +1772,10 @@ void MoqtSession::IncomingDataStream::OnObjectMessage(const MoqtObject& message, return; } if (subscribe->visitor() != nullptr) { - // TODO(martinduke): Send extension headers. PublishedObjectMetadata metadata; metadata.location = Location(message.group_id, message.object_id); metadata.subgroup = message.subgroup_id; + metadata.extensions = message.extension_headers; metadata.status = message.object_status; metadata.publisher_priority = message.publisher_priority; metadata.arrival_time = session_->callbacks_.clock->Now(); @@ -1798,7 +1828,7 @@ MoqtSession::IncomingDataStream::~IncomingDataStream() { if (subscribe == nullptr) { return; } - subscribe->OnStreamClosed(); + subscribe->OnStreamClosed(fin_received_, index_); session_->MaybeDestroySubscription(subscribe); } @@ -1837,6 +1867,10 @@ void MoqtSession::IncomingDataStream::OnCanRead() { return; } } + if (parser_.stream_type()->IsPadding()) { + (void)stream_->SkipBytes(stream_->ReadableBytes()); + return; + } bool knew_track_alias = parser_.track_alias().has_value(); if (parser_.stream_type()->IsSubgroup()) { parser_.ReadAllData(); @@ -1929,8 +1963,7 @@ SendStreamMap& MoqtSession::PublishedSubscription::stream_map() { // knowing the forwarding preference in advance, and it might not be known // when the subscription is first created. if (!lazily_initialized_stream_map_.has_value()) { - QUICHE_DCHECK( - DoesTrackStatusImplyHavingData(*track_publisher_->GetTrackStatus())); + QUICHE_DCHECK(track_publisher_->largest_location().has_value()); lazily_initialized_stream_map_.emplace(); } return *lazily_initialized_stream_map_; @@ -1976,13 +2009,12 @@ void MoqtSession::PublishedSubscription::set_subscriber_priority( void MoqtSession::PublishedSubscription::OnSubscribeAccepted() { std::optional largest_location; ControlStream* stream = session_->GetControlStream(); - if (PublisherHasData(*track_publisher_)) { - largest_location = track_publisher_->GetLargestLocation(); - QUICHE_CHECK(largest_location.has_value()); + largest_location = track_publisher_->largest_location(); + if (largest_location.has_value()) { if (forward_) { switch (filter_type_) { case MoqtFilterType::kLatestObject: - window_ = SubscribeWindow(largest_location->next()); + window_ = SubscribeWindow(largest_location->Next()); break; case MoqtFilterType::kNextGroupStart: window_ = SubscribeWindow(Location(largest_location->group + 1, 0)); @@ -1999,23 +2031,29 @@ void MoqtSession::PublishedSubscription::OnSubscribeAccepted() { MoqtSubscribeOk subscribe_ok; subscribe_ok.request_id = request_id_; subscribe_ok.track_alias = session_->next_local_track_alias_++; - subscribe_ok.group_order = track_publisher_->GetDeliveryOrder(); + QUICHE_BUG_IF(quic_bug_subscribe_ok_no_expiration, + !track_publisher_->expiration().has_value()) + << "Request accepted without expiration"; + subscribe_ok.expires = + track_publisher_->expiration().value_or(quic::QuicTimeDelta::Zero()); + QUICHE_BUG_IF(quic_bug_subscribe_ok_no_delivery_order, + !track_publisher_->delivery_order().has_value()) + << "Request accepted without delivery order"; + subscribe_ok.group_order = track_publisher_->delivery_order().value_or( + MoqtDeliveryOrder::kAscending); subscribe_ok.largest_location = largest_location; track_alias_.emplace(subscribe_ok.track_alias); // TODO(martinduke): Support sending DELIVERY_TIMEOUT parameter as the // publisher. stream->SendOrBufferMessage( session_->framer_.SerializeSubscribeOk(subscribe_ok)); - if (!PublisherHasData(*track_publisher_)) { - return; - } // TODO(martinduke): If we buffer objects that arrived previously, the arrival // of the track alias disambiguates what subscription they belong to. Send // them. } void MoqtSession::PublishedSubscription::OnSubscribeRejected( - MoqtSubscribeErrorReason reason, std::optional track_alias) { + MoqtSubscribeErrorReason reason) { session_->GetControlStream()->SendSubscribeError( request_id_, reason.error_code, reason.reason_phrase); session_->published_subscriptions_.erase(request_id_); @@ -2023,20 +2061,20 @@ void MoqtSession::PublishedSubscription::OnSubscribeRejected( } void MoqtSession::PublishedSubscription::OnNewObjectAvailable( - Location sequence, uint64_t subgroup) { - if (!InWindow(sequence)) { + Location location, uint64_t subgroup, MoqtPriority publisher_priority) { + if (!InWindow(location)) { return; } - DataStreamIndex index(sequence.group, subgroup); + DataStreamIndex index(location.group, subgroup); if (reset_subgroups_.contains(index)) { // This subgroup has already been reset, ignore. return; } if (session_->alternate_delivery_timeout_ && !delivery_timeout_.IsInfinite() && largest_sent_.has_value() && - sequence.group >= largest_sent_->group) { + location.group >= largest_sent_->group) { // Start the delivery timeout timer on all previous groups. - for (uint64_t group = first_active_group_; group < sequence.group; + for (uint64_t group = first_active_group_; group < location.group; ++group) { for (webtransport::StreamId stream_id : stream_map().GetStreamsForGroup(group)) { @@ -2052,12 +2090,15 @@ void MoqtSession::PublishedSubscription::OnNewObjectAvailable( } } } - QUICHE_DCHECK_GE(sequence.group, first_active_group_); + QUICHE_DCHECK_GE(location.group, first_active_group_); - MoqtForwardingPreference forwarding_preference = - track_publisher_->GetForwardingPreference(); - if (forwarding_preference == MoqtForwardingPreference::kDatagram) { - SendDatagram(sequence); + std::optional forwarding_preference = + track_publisher_->forwarding_preference(); + if (!forwarding_preference.has_value()) { + return; + } + if (*forwarding_preference == MoqtForwardingPreference::kDatagram) { + SendDatagram(location); return; } @@ -2068,8 +2109,8 @@ void MoqtSession::PublishedSubscription::OnNewObjectAvailable( raw_stream = session_->session_->GetStreamById(*stream_id); } else { raw_stream = session_->OpenOrQueueDataStream( - request_id_, - NewStreamParameters(sequence.group, subgroup, sequence.object)); + request_id_, NewStreamParameters(location.group, subgroup, + location.object, publisher_priority)); } if (raw_stream == nullptr) { return; @@ -2081,8 +2122,8 @@ void MoqtSession::PublishedSubscription::OnNewObjectAvailable( } void MoqtSession::PublishedSubscription::OnTrackPublisherGone() { - session_->SubscribeIsDone(request_id_, SubscribeDoneCode::kGoingAway, - "Publisher is gone"); + session_->PublishIsDone(request_id_, PublishDoneCode::kGoingAway, + "Publisher is gone"); } // TODO(martinduke): Revise to check if the last object has been delivered. @@ -2147,8 +2188,7 @@ void MoqtSession::PublishedSubscription::OnGroupAbandoned(uint64_t group_id) { stream_map().GetStreamsForGroup(group_id); if (delivery_timeout_.IsInfinite() && largest_sent_.has_value() && largest_sent_->group <= group_id) { - session_->SubscribeIsDone(request_id_, SubscribeDoneCode::kTooFarBehind, - ""); + session_->PublishIsDone(request_id_, PublishDoneCode::kTooFarBehind, ""); // No class access below this line! return; } @@ -2177,13 +2217,20 @@ MoqtSession::PublishedSubscription::GetAllStreams() const { } webtransport::SendOrder MoqtSession::PublishedSubscription::GetSendOrder( - Location sequence, uint64_t subgroup) const { + Location sequence, uint64_t subgroup, + MoqtPriority publisher_priority) const { + QUICHE_BUG_IF(GetSendOrder_no_forwarding_preference, + !track_publisher_->forwarding_preference().has_value()) + << "No forwarding preference"; MoqtForwardingPreference forwarding_preference = - track_publisher_->GetForwardingPreference(); - - MoqtPriority publisher_priority = track_publisher_->GetPublisherPriority(); - MoqtDeliveryOrder delivery_order = subscriber_delivery_order().value_or( - track_publisher_->GetDeliveryOrder()); + track_publisher_->forwarding_preference().value_or( + MoqtForwardingPreference::kSubgroup); + QUICHE_BUG_IF(GetSendOrder_no_delivery_order, + !track_publisher_->delivery_order().has_value()) + << "No delivery order"; + MoqtDeliveryOrder delivery_order = + track_publisher_->delivery_order().value_or( + MoqtDeliveryOrder::kAscending); if (forwarding_preference == MoqtForwardingPreference::kDatagram) { return SendOrderForDatagram(subscriber_priority_, publisher_priority, sequence.group, sequence.object, @@ -2202,7 +2249,7 @@ void MoqtSession::PublishedSubscription::AddQueuedOutgoingDataStream( : queued_outgoing_data_streams_.rbegin()->first; webtransport::SendOrder send_order = GetSendOrder(Location(parameters.index.group, parameters.first_object), - parameters.index.subgroup); + parameters.index.subgroup, parameters.publisher_priority); // Zero out the subscriber priority bits, since these will be added when // updating the session. queued_outgoing_data_streams_.emplace( @@ -2222,7 +2269,7 @@ MoqtSession::PublishedSubscription::NextQueuedOutgoingDataStream() { QUICHE_BUG(NextQueuedOutgoingDataStream_no_stream) << "NextQueuedOutgoingDataStream called when there are no streams " "pending."; - return NewStreamParameters(0, 0, 0); + return NewStreamParameters(0, 0, 0, 0); } auto it = queued_outgoing_data_streams_.rbegin(); webtransport::SendOrder old_send_order = FinalizeSendOrder(it->first); @@ -2269,13 +2316,18 @@ MoqtSession::OutgoingDataStream::OutgoingDataStream( stream_(stream), subscription_id_(subscription.request_id()), index_(parameters.index), + publisher_priority_(parameters.publisher_priority), // Always include extension header length, because it's difficult to know // a priori if they're going to appear on a stream. stream_type_(MoqtDataStreamType::Subgroup( - index_.subgroup, parameters.first_object, false)), + index_.subgroup, parameters.first_object, false, false)), next_object_(parameters.first_object), session_liveness_(session->liveness_token_) { UpdateSendOrder(subscription); + if (subscription.track_alias().has_value()) { + session->trace_recorder_.RecordSubgroupStreamCreated( + stream->GetStreamId(), *subscription.track_alias(), parameters.index); + } } MoqtSession::OutgoingDataStream::~OutgoingDataStream() { @@ -2324,14 +2376,8 @@ MoqtSession::OutgoingDataStream::GetSubscriptionIfValid() { } PublishedSubscription* subscription = it->second.get(); - MoqtTrackPublisher& publisher = subscription->publisher(); - absl::StatusOr status = publisher.GetTrackStatus(); - if (!status.ok()) { - // TODO: clean up the subscription. - return nullptr; - } - if (!DoesTrackStatusImplyHavingData(*status)) { - QUICHE_BUG(GetSubscriptionIfValid_InvalidTrackStatus) + if (!subscription->publisher().largest_location().has_value()) { + QUICHE_BUG(GetSubscriptionIfValid_InvalidTrackStatusOk) << "The track publisher returned a status indicating that no objects " "are available, but a stream for those objects exists."; session_->Error(MoqtError::kInternalError, @@ -2356,7 +2402,7 @@ void MoqtSession::OutgoingDataStream::SendObjects( QUICHE_DCHECK_EQ(object->metadata.location.group, index_.group); QUICHE_DCHECK(object->metadata.subgroup == index_.subgroup); - QUICHE_DCHECK(subscription.publisher().GetForwardingPreference() == + QUICHE_DCHECK(subscription.publisher().forwarding_preference() == MoqtForwardingPreference::kSubgroup); if (!subscription.InWindow(object->metadata.location)) { // It is possible that the next object became irrelevant due to a @@ -2378,14 +2424,14 @@ void MoqtSession::OutgoingDataStream::SendObjects( } if (!session_->WriteObjectToStream( stream_, *subscription.track_alias(), object->metadata, - std::move(object->payload), stream_type_, !stream_header_written_, + std::move(object->payload), stream_type_, last_object_id_, object->fin_after_this)) { // WriteObjectToStream() closes the connection on error, meaning that // there is no need to process the stream any further. return; } ++next_object_; - stream_header_written_ = true; + last_object_id_ = object->metadata.location.object; subscription.OnObjectSent(object->metadata.location); if (object->fin_after_this && !delivery_timeout.IsInfinite() && @@ -2420,7 +2466,8 @@ bool MoqtSession::WriteObjectToStream(webtransport::Stream* stream, uint64_t id, const PublishedObjectMetadata& metadata, quiche::QuicheMemSlice payload, MoqtDataStreamType type, - bool is_first_on_stream, bool fin) { + std::optional last_id, + bool fin) { QUICHE_DCHECK(stream->CanWrite()); MoqtObject header; header.track_alias = id; @@ -2428,11 +2475,12 @@ bool MoqtSession::WriteObjectToStream(webtransport::Stream* stream, uint64_t id, header.subgroup_id = metadata.subgroup; header.object_id = metadata.location.object; header.publisher_priority = metadata.publisher_priority; + header.extension_headers = metadata.extensions; header.object_status = metadata.status; header.payload_length = payload.length(); quiche::QuicheBuffer serialized_header = - framer_.SerializeObjectHeader(header, type, is_first_on_stream); + framer_.SerializeObjectHeader(header, type, last_id); // TODO(vasilvv): add a version of WebTransport write API that accepts // memslices so that we can avoid a copy here. std::array write_vector = { @@ -2506,6 +2554,7 @@ void MoqtSession::PublishedSubscription::SendDatagram(Location sequence) { header.group_id = object->metadata.location.group; header.object_id = object->metadata.location.object; header.publisher_priority = object->metadata.publisher_priority; + header.extension_headers = object->metadata.extensions; header.object_status = object->metadata.status; header.subgroup_id = header.object_id; header.payload_length = object->payload.length(); @@ -2520,7 +2569,7 @@ void MoqtSession::OutgoingDataStream::UpdateSendOrder( stream_->SetPriority(webtransport::StreamPriority{ /*send_group_id=*/kMoqtSendGroupId, subscription.GetSendOrder(Location(index_.group, next_object_), - index_.subgroup)}); + index_.subgroup, publisher_priority_)}); } void MoqtSession::OutgoingDataStream::CreateAndSetAlarm( @@ -2533,4 +2582,13 @@ void MoqtSession::OutgoingDataStream::CreateAndSetAlarm( delivery_timeout_alarm_->Set(deadline); } +MoqtSession::PublishedFetch::FetchStreamVisitor::FetchStreamVisitor( + std::shared_ptr fetch, webtransport::Stream* stream) + : fetch_(fetch), stream_(stream) { + fetch->fetch_task()->SetObjectAvailableCallback( + [this]() { this->OnCanWrite(); }); + fetch->session()->trace_recorder_.RecordFetchStreamCreated( + stream->GetStreamId()); +} + } // namespace moqt diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session.h index 3bb2f3d49f..40b7a70588 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session.h @@ -18,7 +18,6 @@ #include "absl/container/btree_set.h" #include "absl/container/flat_hash_map.h" #include "absl/container/flat_hash_set.h" -#include "absl/status/statusor.h" #include "absl/strings/string_view.h" #include "quiche/quic/core/quic_alarm.h" #include "quiche/quic/core/quic_alarm_factory.h" @@ -32,8 +31,11 @@ #include "quiche/quic/moqt/moqt_session_callbacks.h" #include "quiche/quic/moqt/moqt_session_interface.h" #include "quiche/quic/moqt/moqt_subscribe_windows.h" +#include "quiche/quic/moqt/moqt_trace_recorder.h" #include "quiche/quic/moqt/moqt_track.h" +#include "quiche/quic/moqt/session_namespace_tree.h" #include "quiche/common/platform/api/quiche_export.h" +#include "quiche/common/platform/api/quiche_logging.h" #include "quiche/common/quiche_buffer_allocator.h" #include "quiche/common/quiche_mem_slice.h" #include "quiche/common/quiche_weak_ptr.h" @@ -79,6 +81,15 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, if (goaway_timeout_alarm_ != nullptr) { goaway_timeout_alarm_->PermanentCancel(); } + for (const TrackNamespace& track_namespace : + incoming_subscribe_namespace_.GetSubscribedNamespaces()) { + callbacks_.incoming_subscribe_namespace_callback(track_namespace, + std::nullopt, nullptr); + } + for (const TrackNamespace& track_namespace : incoming_publish_namespaces_) { + callbacks_.incoming_publish_namespace_callback(track_namespace, + std::nullopt, nullptr); + } std::move(callbacks_.session_deleted_callback)(); } @@ -92,91 +103,70 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, void OnCanCreateNewOutgoingBidirectionalStream() override {} void OnCanCreateNewOutgoingUnidirectionalStream() override; - void Error(MoqtError code, absl::string_view error) override; - quic::Perspective perspective() const { return parameters_.perspective; } // Returns true if message was sent. - bool SubscribeAnnounces(TrackNamespace track_namespace, - MoqtOutgoingSubscribeAnnouncesCallback callback, + bool SubscribeNamespace(TrackNamespace track_namespace, + MoqtOutgoingSubscribeNamespaceCallback callback, VersionSpecificParameters parameters); - bool UnsubscribeAnnounces(TrackNamespace track_namespace); + bool UnsubscribeNamespace(TrackNamespace track_namespace); - // Send an ANNOUNCE message for |track_namespace|, and call - // |announce_callback| when the response arrives. Will fail immediately if - // there is already an unresolved ANNOUNCE for that namespace. - void Announce(TrackNamespace track_namespace, - MoqtOutgoingAnnounceCallback announce_callback, - VersionSpecificParameters parameters); - // Returns true if message was sent, false if there is no ANNOUNCE to cancel. - bool Unannounce(TrackNamespace track_namespace); // Allows the subscriber to declare it will not subscribe to |track_namespace| // anymore. - void CancelAnnounce(TrackNamespace track_namespace, RequestErrorCode code, - absl::string_view reason_phrase); + void CancelPublishNamespace(TrackNamespace track_namespace, + RequestErrorCode code, + absl::string_view reason_phrase); - // Returns true if SUBSCRIBE was sent. If there is already a subscription to - // the track, the message will still be sent. However, the visitor will be - // ignored. If |visitor| is nullptr, forward will be set to false. - // Subscribe from (start_group, start_object) to the end of the track. + // MoqtSessionInterface implementation. + MoqtSessionCallbacks& callbacks() override { return callbacks_; } + void Error(MoqtError code, absl::string_view error) override; bool SubscribeAbsolute(const FullTrackName& name, uint64_t start_group, - uint64_t start_object, - SubscribeRemoteTrack::Visitor* visitor, + uint64_t start_object, SubscribeVisitor* visitor, VersionSpecificParameters parameters) override; - // Subscribe from (start_group, start_object) to the end of end_group. bool SubscribeAbsolute(const FullTrackName& name, uint64_t start_group, uint64_t start_object, uint64_t end_group, - SubscribeRemoteTrack::Visitor* visitor, + SubscribeVisitor* visitor, VersionSpecificParameters parameters) override; bool SubscribeCurrentObject(const FullTrackName& name, - SubscribeRemoteTrack::Visitor* visitor, + SubscribeVisitor* visitor, VersionSpecificParameters parameters) override; - bool SubscribeNextGroup(const FullTrackName& name, - SubscribeRemoteTrack::Visitor* visitor, + bool SubscribeNextGroup(const FullTrackName& name, SubscribeVisitor* visitor, VersionSpecificParameters parameters) override; bool SubscribeUpdate(const FullTrackName& name, std::optional start, std::optional end_group, std::optional subscriber_priority, std::optional forward, VersionSpecificParameters parameters) override; - // Returns false if the subscription is not found. The session immediately - // destroys all subscription state. - void Unsubscribe(const FullTrackName& name); - // |callback| will be called when FETCH_OK or FETCH_ERROR is received, and - // delivers a pointer to MoqtFetchTask for application use. The callback - // transfers ownership of MoqtFetchTask to the application. - // To cancel a FETCH, simply destroy the FetchTask. + void Unsubscribe(const FullTrackName& name) override; bool Fetch(const FullTrackName& name, FetchResponseCallback callback, Location start, uint64_t end_group, std::optional end_object, MoqtPriority priority, std::optional delivery_order, VersionSpecificParameters parameters) override; - // Sends both a SUBSCRIBE and a joining FETCH, beginning |num_previous_groups| - // groups before the current group. The Fetch will not be flow controlled, - // instead using |visitor| to deliver fetched objects when they arrive. Gaps - // in the FETCH will not be filled by with ObjectDoesNotExist. If the FETCH - // fails for any reason, the application will not receive a notification; it - // will just appear to be missing objects. bool RelativeJoiningFetch(const FullTrackName& name, - SubscribeRemoteTrack::Visitor* visitor, + SubscribeVisitor* visitor, uint64_t num_previous_groups, VersionSpecificParameters parameters) override; - // Sends both a SUBSCRIBE and a joining FETCH, beginning |num_previous_groups| - // groups before the current group. The application provides |callback| to - // fully control acceptance of Fetched objects. bool RelativeJoiningFetch(const FullTrackName& name, - SubscribeRemoteTrack::Visitor* visitor, + SubscribeVisitor* visitor, FetchResponseCallback callback, uint64_t num_previous_groups, MoqtPriority priority, std::optional delivery_order, VersionSpecificParameters parameters) override; + void PublishNamespace(TrackNamespace track_namespace, + MoqtOutgoingPublishNamespaceCallback callback, + VersionSpecificParameters parameters) override; + bool PublishNamespaceDone(TrackNamespace track_namespace) override; + quiche::QuicheWeakPtr GetWeakPtr() override { + return weak_ptr_factory_.Create(); + } // Send a GOAWAY message to the peer. |new_session_uri| must be empty if // called by the client. void GoAway(absl::string_view new_session_uri); webtransport::Session* session() { return session_; } - MoqtSessionCallbacks& callbacks() override { return callbacks_; } + MoqtPublisher* publisher() { return publisher_; } void set_publisher(MoqtPublisher* publisher) { publisher_ = publisher; } bool support_object_acks() const { return parameters_.support_object_acks; } @@ -210,6 +200,8 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, void UseAlternateDeliveryTimeout() { alternate_delivery_timeout_ = true; } + MoqtTraceRecorder& trace_recorder() { return trace_recorder_; } + private: friend class test::MoqtSessionPeer; @@ -218,10 +210,13 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, struct NewStreamParameters { DataStreamIndex index; uint64_t first_object; + MoqtPriority publisher_priority; NewStreamParameters(uint64_t group, uint64_t subgroup, - uint64_t first_object) - : index(group, subgroup), first_object(first_object) {} + uint64_t first_object, MoqtPriority publisher_priority) + : index(group, subgroup), + first_object(first_object), + publisher_priority(publisher_priority) {} }; class QUICHE_EXPORT ControlStream : public webtransport::StreamVisitor, @@ -244,34 +239,41 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, void OnSubscribeErrorMessage(const MoqtSubscribeError& message) override; void OnUnsubscribeMessage(const MoqtUnsubscribe& message) override; // There is no state to update for SUBSCRIBE_DONE. - void OnSubscribeDoneMessage(const MoqtSubscribeDone& /*message*/) override; + void OnPublishDoneMessage(const MoqtPublishDone& /*message*/) override; void OnSubscribeUpdateMessage(const MoqtSubscribeUpdate& message) override; - void OnAnnounceMessage(const MoqtAnnounce& message) override; - void OnAnnounceOkMessage(const MoqtAnnounceOk& message) override; - void OnAnnounceErrorMessage(const MoqtAnnounceError& message) override; - void OnAnnounceCancelMessage(const MoqtAnnounceCancel& message) override; - void OnTrackStatusRequestMessage( - const MoqtTrackStatusRequest& message) override; - void OnUnannounceMessage(const MoqtUnannounce& /*message*/) override; - void OnTrackStatusMessage(const MoqtTrackStatus& message) override {} + void OnPublishNamespaceMessage( + const MoqtPublishNamespace& message) override; + void OnPublishNamespaceOkMessage( + const MoqtPublishNamespaceOk& message) override; + void OnPublishNamespaceErrorMessage( + const MoqtPublishNamespaceError& message) override; + void OnPublishNamespaceDoneMessage( + const MoqtPublishNamespaceDone& /*message*/) override; + void OnPublishNamespaceCancelMessage( + const MoqtPublishNamespaceCancel& message) override; + void OnTrackStatusMessage(const MoqtTrackStatus& message) override; + void OnTrackStatusOkMessage(const MoqtTrackStatusOk& /*message*/) override { + } + void OnTrackStatusErrorMessage( + const MoqtTrackStatusError& /*message*/) override {} void OnGoAwayMessage(const MoqtGoAway& /*message*/) override; - void OnSubscribeAnnouncesMessage( - const MoqtSubscribeAnnounces& message) override; - void OnSubscribeAnnouncesOkMessage( - const MoqtSubscribeAnnouncesOk& message) override; - void OnSubscribeAnnouncesErrorMessage( - const MoqtSubscribeAnnouncesError& message) override; - void OnUnsubscribeAnnouncesMessage( - const MoqtUnsubscribeAnnounces& message) override; + void OnSubscribeNamespaceMessage( + const MoqtSubscribeNamespace& message) override; + void OnSubscribeNamespaceOkMessage( + const MoqtSubscribeNamespaceOk& message) override; + void OnSubscribeNamespaceErrorMessage( + const MoqtSubscribeNamespaceError& message) override; + void OnUnsubscribeNamespaceMessage( + const MoqtUnsubscribeNamespace& message) override; void OnMaxRequestIdMessage(const MoqtMaxRequestId& message) override; void OnFetchMessage(const MoqtFetch& message) override; - void OnFetchCancelMessage(const MoqtFetchCancel& message) override {} + void OnFetchCancelMessage(const MoqtFetchCancel& /*message*/) override {} void OnFetchOkMessage(const MoqtFetchOk& message) override; void OnFetchErrorMessage(const MoqtFetchError& message) override; void OnRequestsBlockedMessage(const MoqtRequestsBlocked& message) override; void OnPublishMessage(const MoqtPublish& message) override; - void OnPublishOkMessage(const MoqtPublishOk& message) override {}; - void OnPublishErrorMessage(const MoqtPublishError& message) override {}; + void OnPublishOkMessage(const MoqtPublishOk& /*message*/) override {} + void OnPublishErrorMessage(const MoqtPublishError& /*message*/) override {} void OnObjectAckMessage(const MoqtObjectAck& message) override { auto subscription_it = session_->published_subscriptions_.find(message.subscribe_id); @@ -315,14 +317,16 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, // webtransport::StreamVisitor implementation. void OnCanRead() override; void OnCanWrite() override {} - void OnResetStreamReceived(webtransport::StreamErrorCode error) override {} - void OnStopSendingReceived(webtransport::StreamErrorCode error) override {} + void OnResetStreamReceived(webtransport::StreamErrorCode) override {} + void OnStopSendingReceived( + webtransport::StreamErrorCode /*error*/) override {} void OnWriteSideInDataRecvdState() override {} // MoqtParserVisitor implementation. // TODO: Handle a stream FIN. void OnObjectMessage(const MoqtObject& message, absl::string_view payload, bool end_of_message) override; + void OnFin() override { fin_received_ = true; } void OnParsingError(MoqtError error_code, absl::string_view reason) override; @@ -340,6 +344,8 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, uint64_t next_object_id_ = 0; bool no_more_objects_ = false; // EndOfGroup or EndOfTrack was received. + std::optional index_; // Only set for subscribe. + bool fin_received_ = false; MoqtSession* session_; webtransport::Stream* stream_; // Once the subscribe ID is identified, set it here. @@ -375,11 +381,10 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, // MoqtObjectListener implementation. void OnSubscribeAccepted() override; - void OnSubscribeRejected( - MoqtSubscribeErrorReason reason, - std::optional track_alias = std::nullopt) override; + void OnSubscribeRejected(MoqtSubscribeErrorReason reason) override; // This is only called for objects that have just arrived. - void OnNewObjectAvailable(Location location, uint64_t subgroup) override; + void OnNewObjectAvailable(Location location, uint64_t subgroup, + MoqtPriority publisher_priority) override; void OnTrackPublisherGone() override; void OnNewFinAvailable(Location location, uint64_t subgroup) override; void OnSubgroupAbandoned(uint64_t group, uint64_t subgroup, @@ -408,7 +413,7 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, QUICHE_CHECK(window_.has_value()); return window_->start(); } - MoqtFilterType filter_type() const { return filter_type_; }; + MoqtFilterType filter_type() const { return filter_type_; } void OnDataStreamCreated(webtransport::StreamId id, DataStreamIndex start_sequence); @@ -418,8 +423,8 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, std::vector GetAllStreams() const; - webtransport::SendOrder GetSendOrder(Location sequence, - uint64_t subgroup) const; + webtransport::SendOrder GetSendOrder(Location sequence, uint64_t subgroup, + MoqtPriority publisher_priority) const; void AddQueuedOutgoingDataStream(const NewStreamParameters& parameters); // Pops the pending outgoing data stream, with the highest send order. @@ -506,8 +511,10 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, // webtransport::StreamVisitor implementation. void OnCanRead() override {} void OnCanWrite() override; - void OnResetStreamReceived(webtransport::StreamErrorCode error) override {} - void OnStopSendingReceived(webtransport::StreamErrorCode error) override {} + void OnResetStreamReceived( + webtransport::StreamErrorCode /*error*/) override {} + void OnStopSendingReceived( + webtransport::StreamErrorCode /*error*/) override {} void OnWriteSideInDataRecvdState() override {} class DeliveryTimeoutDelegate @@ -552,12 +559,15 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, webtransport::Stream* stream_; uint64_t subscription_id_; DataStreamIndex index_; + const MoqtPriority publisher_priority_; MoqtDataStreamType stream_type_; // Minimum object ID that should go out next. The session doesn't know the // exact ID of the next object in the stream because the next object could // be in a different subgroup or simply be skipped. uint64_t next_object_; - bool stream_header_written_ = false; + // Used in subgroup streams to compute the object ID diff. If nullopt, the + // stream header has not been written yet. + std::optional last_object_id_; // If this data stream is for SUBSCRIBE, reset it if an object has been // excessively delayed per Section 7.1.1.2. std::unique_ptr delivery_timeout_alarm_; @@ -577,11 +587,7 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, class FetchStreamVisitor : public webtransport::StreamVisitor { public: FetchStreamVisitor(std::shared_ptr fetch, - webtransport::Stream* stream) - : fetch_(fetch), stream_(stream) { - fetch->fetch_task()->SetObjectAvailableCallback( - [this]() { this->OnCanWrite(); }); - } + webtransport::Stream* stream); ~FetchStreamVisitor() { std::shared_ptr fetch = fetch_.lock(); if (fetch != nullptr) { @@ -591,10 +597,11 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, // webtransport::StreamVisitor implementation. void OnCanRead() override {} // Write-only stream. void OnCanWrite() override; - void OnResetStreamReceived(webtransport::StreamErrorCode error) override { + void OnResetStreamReceived( + webtransport::StreamErrorCode /*error*/) override { } // Write-only stream - void OnStopSendingReceived(webtransport::StreamErrorCode error) override { - } + void OnStopSendingReceived( + webtransport::StreamErrorCode /*error*/) override {} void OnWriteSideInDataRecvdState() override {} private: @@ -621,57 +628,63 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, DownstreamTrackStatus(uint64_t request_id, MoqtSession* absl_nonnull session, MoqtTrackPublisher* absl_nonnull publisher) - : request_id_(request_id), session_(session), publisher_(publisher) { - publisher_->AddObjectListener(this); - } + : request_id_(request_id), session_(session), publisher_(publisher) {} ~DownstreamTrackStatus() { if (publisher_ != nullptr) { publisher_->RemoveObjectListener(this); } } + DownstreamTrackStatus(const DownstreamTrackStatus&) = delete; + DownstreamTrackStatus(DownstreamTrackStatus&&) = delete; void OnSubscribeAccepted() override { - MoqtTrackStatus track_status; - track_status.request_id = request_id_; - QUICHE_CHECK(publisher_ != nullptr); - absl::StatusOr status = publisher_->GetTrackStatus(); - if (!status.ok()) { - session_->Error(MoqtError::kInternalError, - "Failed to get track status"); + if (publisher_ == nullptr) { + QUICHE_NOTREACHED(); return; } - track_status.status_code = *status; - if (*status != MoqtTrackStatusCode::kDoesNotExist && - *status != MoqtTrackStatusCode::kNotYetBegun) { - track_status.largest_location = publisher_->GetLargestLocation(); - } // Else, leave it at (0,0). + MoqtTrackStatusOk track_status_ok; + track_status_ok.request_id = request_id_; + track_status_ok.track_alias = 0; + QUICHE_BUG_IF(quic_bug_track_status_ok_no_expiration, + !publisher_->expiration().has_value()) + << "Request accepted without expiration"; + track_status_ok.expires = + publisher_->expiration().value_or(quic::QuicTimeDelta::Zero()); + QUICHE_BUG_IF(quic_bug_track_status_ok_no_delivery_order, + !publisher_->delivery_order().has_value()) + << "Request accepted without delivery order"; + track_status_ok.group_order = + publisher_->delivery_order().value_or(MoqtDeliveryOrder::kAscending); + track_status_ok.largest_location = publisher_->largest_location(); session_->SendControlMessage( - session_->framer_.SerializeTrackStatus(track_status)); + session_->framer_.SerializeTrackStatusOk(track_status_ok)); session_->incoming_track_status_.erase(request_id_); // No class access below this line! } - // TODO(martinduke): In draft-13, this will trigger TRACK_STATUS_ERROR. - void OnSubscribeRejected(MoqtSubscribeErrorReason /*error_code*/, - std::optional /*track_alias*/) override { - OnSubscribeAccepted(); + void OnSubscribeRejected(MoqtSubscribeErrorReason error_reason) override { + MoqtTrackStatusError track_status_error; + track_status_error.request_id = request_id_; + track_status_error.error_code = error_reason.error_code; + track_status_error.reason_phrase = error_reason.reason_phrase; + session_->SendControlMessage( + session_->framer_.SerializeTrackStatusError(track_status_error)); + session_->incoming_track_status_.erase(request_id_); + // No class access below this line! } - void OnNewObjectAvailable(Location sequence, uint64_t subgroup) override {} - void OnNewFinAvailable(Location location, uint64_t subgroup) override {} + void OnNewObjectAvailable(Location /*sequence*/, uint64_t /*subgroup*/, + MoqtPriority /*publisher_priority*/) override {} + void OnNewFinAvailable(Location /*location*/, + uint64_t /*subgroup*/) override {} void OnSubgroupAbandoned( - uint64_t group, uint64_t subgroup, - webtransport::StreamErrorCode error_code) override {} - void OnGroupAbandoned(uint64_t group_id) override {} + uint64_t /*group*/, uint64_t /*subgroup*/, + webtransport::StreamErrorCode /*error_code*/) override {} + void OnGroupAbandoned(uint64_t /*group_id*/) override {} void OnTrackPublisherGone() override { publisher_ = nullptr; - MoqtTrackStatus track_status; - track_status.request_id = request_id_; - track_status.status_code = MoqtTrackStatusCode::kDoesNotExist; - track_status.largest_location = Location(0, 0); - session_->SendControlMessage( - session_->framer_.SerializeTrackStatus(track_status)); - session_->incoming_track_status_.erase(request_id_); + OnSubscribeRejected(MoqtSubscribeErrorReason( + RequestErrorCode::kTrackDoesNotExist, "Track publisher gone")); } private: @@ -689,9 +702,9 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, MoqtSession* session_; }; - class SubscribeDoneDelegate : public quic::QuicAlarm::DelegateWithoutContext { + class PublishDoneDelegate : public quic::QuicAlarm::DelegateWithoutContext { public: - SubscribeDoneDelegate(MoqtSession* session, SubscribeRemoteTrack* subscribe) + PublishDoneDelegate(MoqtSession* session, SubscribeRemoteTrack* subscribe) : session_(session), subscribe_(subscribe) {} void OnAlarm() override { session_->DestroySubscription(subscribe_); } @@ -703,8 +716,8 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, // Private members of MoqtSession. // Returns true if SUBSCRIBE_DONE was sent. - bool SubscribeIsDone(uint64_t request_id, SubscribeDoneCode code, - absl::string_view error_reason); + bool PublishIsDone(uint64_t request_id, PublishDoneCode code, + absl::string_view error_reason); void MaybeDestroySubscription(SubscribeRemoteTrack* subscribe); void DestroySubscription(SubscribeRemoteTrack* subscribe); @@ -715,8 +728,7 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, void SendControlMessage(quiche::QuicheBuffer message); // Returns false if the SUBSCRIBE isn't sent. - bool Subscribe(MoqtSubscribe& message, - SubscribeRemoteTrack::Visitor* visitor); + bool Subscribe(MoqtSubscribe& message, SubscribeVisitor* visitor); // Opens a new data stream, or queues it if the session is flow control // blocked. @@ -744,8 +756,8 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, bool WriteObjectToStream(webtransport::Stream* stream, uint64_t id, const PublishedObjectMetadata& metadata, quiche::QuicheMemSlice payload, - MoqtDataStreamType type, bool is_first_on_stream, - bool fin); + MoqtDataStreamType type, + std::optional last_id, bool fin); void CancelFetch(uint64_t request_id); @@ -775,7 +787,6 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, void OnMalformedTrack(RemoteTrack* track); bool is_closing_ = false; - webtransport::Session* session_; MoqtSessionParameters parameters_; MoqtSessionCallbacks callbacks_; @@ -824,29 +835,34 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, absl::flat_hash_map> incoming_fetches_; - absl::flat_hash_map incoming_track_status_; + absl::flat_hash_map> + incoming_track_status_; // Monitoring interfaces for expected incoming subscriptions. absl::flat_hash_map monitoring_interfaces_for_published_tracks_; - // Outgoing ANNOUNCE for which no OK or ERROR has been received. - absl::flat_hash_map pending_outgoing_announces_; - // All outgoing ANNOUNCE. - absl::flat_hash_map - outgoing_announces_; + // Outgoing PUBLISH_NAMESPACE for which no OK or ERROR has been received. + absl::flat_hash_map + pending_outgoing_publish_namespaces_; + // All outgoing PUBLISH_NAMESPACE. + absl::flat_hash_map + outgoing_publish_namespaces_; + absl::flat_hash_set incoming_publish_namespaces_; // The value is nullptr after OK or ERROR is received. The entry is deleted - // when sending UNSUBSCRIBE_ANNOUNCES, to make sure the application doesn't - // unsubscribe from something that it isn't subscribed to. ANNOUNCEs that - // result from this subscription use incoming_announce_callback. - struct PendingSubscribeAnnouncesData { + // when sending UNSUBSCRIBE_NAMESPACE, to make sure the application doesn't + // unsubscribe from something that it isn't subscribed to. PUBLISH_NAMESPACEs + // that result from this subscription use incoming_publish_namespace_callback. + struct PendingSubscribeNamespaceData { TrackNamespace track_namespace; - MoqtOutgoingSubscribeAnnouncesCallback callback; + MoqtOutgoingSubscribeNamespaceCallback callback; }; - absl::flat_hash_map - pending_outgoing_subscribe_announces_; - absl::flat_hash_set outgoing_subscribe_announces_; + absl::flat_hash_map + pending_outgoing_subscribe_namespaces_; + absl::flat_hash_set outgoing_subscribe_namespaces_; + // It's an error if the namespaces overlap, so keep track of them. + SessionNamespaceTree incoming_subscribe_namespace_; // The minimum request ID the peer can use that is monotonically increasing. uint64_t next_incoming_request_id_ = 0; @@ -863,6 +879,10 @@ class QUICHE_EXPORT MoqtSession : public MoqtSessionInterface, // the first object of group n+1 arrives. bool alternate_delivery_timeout_ = false; + MoqtTraceRecorder trace_recorder_; + + quiche::QuicheWeakPtrFactory weak_ptr_factory_; + // Must be last. Token used to make sure that the streams do not call into // the session when the session has already been destroyed. diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session_callbacks.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session_callbacks.h index 447bc007dc..e8a238d606 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session_callbacks.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session_callbacks.h @@ -6,6 +6,7 @@ #define QUICHE_QUIC_MOQT_MOQT_SESSION_CALLBACKS_H_ #include +#include #include "absl/strings/string_view.h" #include "quiche/quic/core/quic_clock.h" @@ -15,6 +16,12 @@ namespace moqt { +// The callback we'll use for all request types going forward. Can only be used +// once; if the argument is nullopt, an OK response was received. Otherwise, an +// ERROR response was received. +using MoqtResponseCallback = + quiche::SingleUseCallback)>; + // Called when the SETUP message from the peer is received. using MoqtSessionEstablishedCallback = quiche::SingleUseCallback; @@ -29,38 +36,38 @@ using MoqtSessionTerminatedCallback = // Called from the session destructor. using MoqtSessionDeletedCallback = quiche::SingleUseCallback; -// Called whenever an ANNOUNCE or UNANNOUNCE message is received from the peer. -// ANNOUNCE sets a value for |parameters|, UNANNOUNCE does not. -using MoqtIncomingAnnounceCallback = - quiche::MultiUseCallback( - const TrackNamespace& track_namespace, - const std::optional& parameters)>; +// Called whenever a PUBLISH_NAMESPACE or PUBLISH_NAMESPACE_DONE message is +// received from the peer. PUBLISH_NAMESPACE sets a value for |parameters|, +// PUBLISH_NAMESPACE_DONE does not.. +using MoqtIncomingPublishNamespaceCallback = quiche::MultiUseCallback& parameters, + MoqtResponseCallback callback)>; -// Called whenever SUBSCRIBE_ANNOUNCES or UNSUBSCRIBE_ANNOUNCES is received from -// the peer. For SUBSCRIBE_ANNOUNCES, the return value indicates whether to -// return an OK or an ERROR; for UNSUBSCRIBE_ANNOUNCES, the return value is -// ignored. SUBSCRIBE_ANNOUNCES sets a value for |parameters|, -// UNSUBSCRIBE_ANNOUNCES does not. -using MoqtIncomingSubscribeAnnouncesCallback = - quiche::MultiUseCallback( - const TrackNamespace& track_namespace, - std::optional parameters)>; +// Called whenever SUBSCRIBE_NAMESPACE or UNSUBSCRIBE_NAMESPACE is received from +// the peer. SUBSCRIBE_NAMESPACE sets a value for |parameters|, +// UNSUBSCRIBE_NAMESPACE does not. For UNSUBSCRIBE_NAMESPACE, |callback| is +// null. +using MoqtIncomingSubscribeNamespaceCallback = quiche::MultiUseCallback parameters, + MoqtResponseCallback callback)>; -inline std::optional DefaultIncomingAnnounceCallback( - const TrackNamespace& /*track_namespace*/, - std::optional /*parameters*/) { - return std::optional(MoqtAnnounceErrorReason{ +inline void DefaultIncomingPublishNamespaceCallback( + const TrackNamespace&, const std::optional&, + MoqtResponseCallback callback) { + if (callback == nullptr) { + return; + } + return std::move(callback)(MoqtRequestError{ RequestErrorCode::kNotSupported, - "This endpoint does not accept incoming ANNOUNCE messages"}); + "This endpoint does not support incoming SUBSCRIBE_NAMESPACE messages"}); }; -inline std::optional -DefaultIncomingSubscribeAnnouncesCallback( +inline void DefaultIncomingSubscribeNamespaceCallback( const TrackNamespace& track_namespace, - std::optional /*parameters*/) { - return MoqtSubscribeErrorReason{ - RequestErrorCode::kNotSupported, - "This endpoint does not support incoming SUBSCRIBE_ANNOUNCES messages"}; + std::optional, MoqtResponseCallback callback) { + std::move(callback)(std::nullopt); } // Callbacks for session-level events. @@ -72,10 +79,10 @@ struct MoqtSessionCallbacks { +[](absl::string_view) {}; MoqtSessionDeletedCallback session_deleted_callback = +[] {}; - MoqtIncomingAnnounceCallback incoming_announce_callback = - DefaultIncomingAnnounceCallback; - MoqtIncomingSubscribeAnnouncesCallback incoming_subscribe_announces_callback = - DefaultIncomingSubscribeAnnouncesCallback; + MoqtIncomingPublishNamespaceCallback incoming_publish_namespace_callback = + DefaultIncomingPublishNamespaceCallback; + MoqtIncomingSubscribeNamespaceCallback incoming_subscribe_namespace_callback = + DefaultIncomingSubscribeNamespaceCallback; const quic::QuicClock* clock = quic::QuicDefaultClock::Get(); }; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session_interface.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session_interface.h index 6846c96523..677ba6127e 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session_interface.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_session_interface.h @@ -6,27 +6,84 @@ #define QUICHE_QUIC_MOQT_MOQT_SESSION_INTERFACE_H_ #include +#include #include +#include #include "absl/strings/string_view.h" +#include "quiche/quic/core/quic_time.h" +#include "quiche/quic/moqt/moqt_fetch_task.h" #include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_priority.h" #include "quiche/quic/moqt/moqt_session_callbacks.h" -#include "quiche/quic/moqt/moqt_track.h" #include "quiche/common/quiche_callbacks.h" +#include "quiche/common/quiche_weak_ptr.h" namespace moqt { -// If |error_message| is nullopt, this is triggered by an ANNOUNCE_OK. -// Otherwise, it is triggered by ANNOUNCE_ERROR or ANNOUNCE_CANCEL. For -// ERROR or CANCEL, MoqtSession is deleting all ANNOUNCE state immediately -// after calling this callback. Alternatively, the application can call -// Unannounce() to delete the state. -using MoqtOutgoingAnnounceCallback = quiche::MultiUseCallback error)>; +using MoqtObjectAckFunction = + quiche::MultiUseCallback; -using MoqtOutgoingSubscribeAnnouncesCallback = quiche::SingleUseCallback largest_location; + VersionSpecificParameters parameters = VersionSpecificParameters(); +}; + +class SubscribeVisitor { + public: + virtual ~SubscribeVisitor() = default; + // Called when the session receives a response to the SUBSCRIBE, unless it's + // a SUBSCRIBE_ERROR with a new track_alias. In that case, the session will + // automatically retry. + virtual void OnReply( + const FullTrackName& full_track_name, + std::variant response) = 0; + // Called when the subscription process is far enough that it is possible to + // send OBJECT_ACK messages; provides a callback to do so. The callback is + // valid for as long as the session is valid. + virtual void OnCanAckObjects(MoqtObjectAckFunction ack_function) = 0; + // Called when an object fragment (or an entire object) is received. + virtual void OnObjectFragment(const FullTrackName& full_track_name, + const PublishedObjectMetadata& metadata, + absl::string_view object, + bool end_of_message) = 0; + virtual void OnPublishDone(FullTrackName full_track_name) = 0; + // Called when the track is malformed per Section 2.5 of + // draft-ietf-moqt-moq-transport-12. If the application is a relay, it MUST + // terminate downstream delivery of the track. + virtual void OnMalformedTrack(const FullTrackName& full_track_name) = 0; + + // End user applications might not care about stream state, but relays will. + virtual void OnStreamFin(const FullTrackName& full_track_name, + DataStreamIndex stream) = 0; + virtual void OnStreamReset(const FullTrackName& full_track_name, + DataStreamIndex stream) = 0; +}; + +// MoqtSession calls this when a FETCH_OK or FETCH_ERROR is received. The +// destination of the callback owns |fetch_task| and MoqtSession will react +// safely if the owner destroys it. +using FetchResponseCallback = + quiche::SingleUseCallback fetch_task)>; + +// TODO(martinduke): MoqtOutgoingPublishNamespaceCallback and +// MoqtOutgoingSubscribeNamespaceCallback are deprecated. Remove. + +// If |error| is nullopt, this is triggered by a PUBLISH_NAMESPACE_OK. +// Otherwise, it is triggered by PUBLISH_NAMESPACE_ERROR or +// PUBLISH_NAMESPACE_CANCEL. For ERROR or CANCEL, MoqtSession is deleting all +// PUBLISH_NAMESPACE state immediately after calling this callback. +// Alternatively, the application can call PublishNamespaceDone() to delete the +// state. +using MoqtOutgoingPublishNamespaceCallback = + quiche::MultiUseCallback error)>; + +using MoqtOutgoingSubscribeNamespaceCallback = quiche::SingleUseCallback error, absl::string_view reason)>; @@ -34,7 +91,7 @@ class MoqtSessionInterface { public: virtual ~MoqtSessionInterface() = default; - // TODO: move ANNOUNCE logic here. + // TODO: move PUBLISH_NAMESPACE logic here. // Callbacks for session-level events. virtual MoqtSessionCallbacks& callbacks() = 0; @@ -48,22 +105,21 @@ class MoqtSessionInterface { // Subscribe from (start_group, start_object) to the end of the track. virtual bool SubscribeAbsolute(const FullTrackName& name, uint64_t start_group, uint64_t start_object, - SubscribeRemoteTrack::Visitor* visitor, + SubscribeVisitor* visitor, VersionSpecificParameters parameters) = 0; // Subscribe from (start_group, start_object) to the end of end_group. virtual bool SubscribeAbsolute(const FullTrackName& name, uint64_t start_group, uint64_t start_object, - uint64_t end_group, - SubscribeRemoteTrack::Visitor* visitor, + uint64_t end_group, SubscribeVisitor* visitor, VersionSpecificParameters parameters) = 0; // Subscribe to all objects that are larger than the current Largest // Group/Object ID. virtual bool SubscribeCurrentObject(const FullTrackName& name, - SubscribeRemoteTrack::Visitor* visitor, + SubscribeVisitor* visitor, VersionSpecificParameters parameters) = 0; // Start with the first group after the current Largest Group/Object ID. virtual bool SubscribeNextGroup(const FullTrackName& name, - SubscribeRemoteTrack::Visitor* visitor, + SubscribeVisitor* visitor, VersionSpecificParameters parameters) = 0; // If an argument is nullopt, there is no change to the current value. @@ -95,7 +151,7 @@ class MoqtSessionInterface { // fails for any reason, the application will not receive a notification; it // will just appear to be missing objects. virtual bool RelativeJoiningFetch(const FullTrackName& name, - SubscribeRemoteTrack::Visitor* visitor, + SubscribeVisitor* visitor, uint64_t num_previous_groups, VersionSpecificParameters parameters) = 0; @@ -103,18 +159,29 @@ class MoqtSessionInterface { // groups before the current group. `callback` acts the same way as the // callback for the regular Fetch() call. virtual bool RelativeJoiningFetch( - const FullTrackName& name, SubscribeRemoteTrack::Visitor* visitor, + const FullTrackName& name, SubscribeVisitor* visitor, FetchResponseCallback callback, uint64_t num_previous_groups, MoqtPriority priority, std::optional delivery_order, VersionSpecificParameters parameters) = 0; + // Send a PUBLISH_NAMESPACE message for |track_namespace|, and call + // |publish_namespace_callback| when the response arrives. Will fail + // immediately if there is already an unresolved PUBLISH_NAMESPACE for that + // namespace. + virtual void PublishNamespace(TrackNamespace track_namespace, + MoqtOutgoingPublishNamespaceCallback callback, + VersionSpecificParameters parameters) = 0; + // Returns true if message was sent, false if there is no PUBLISH_NAMESPACE to + // cancel. + virtual bool PublishNamespaceDone(TrackNamespace track_namespace) = 0; // TODO(martinduke): Add an API for absolute joining fetch. - // TODO: Add SubscribeAnnounces, UnsubscribeAnnounces method. - // TODO: Add Announce, Unannounce method. - // TODO: Add AnnounceCancel method. + // TODO: Add SubscribeNamespace, UnsubscribeNamespace method. + // TODO: Add PublishNamespaceCancel method. // TODO: Add TrackStatusRequest method. - // TODO: Add SubscribeUpdate, SubscribeDone method. + // TODO: Add SubscribeUpdate, PublishDone method. + + virtual quiche::QuicheWeakPtr GetWeakPtr() = 0; }; } // namespace moqt diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_subscribe_windows.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_subscribe_windows.h index 0348044f8a..ce37936d5c 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_subscribe_windows.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_subscribe_windows.h @@ -10,9 +10,7 @@ #include #include "absl/container/btree_map.h" -#include "quiche/quic/core/quic_interval.h" #include "quiche/quic/moqt/moqt_messages.h" -#include "quiche/quic/moqt/moqt_publisher.h" #include "quiche/common/platform/api/quiche_export.h" #include "quiche/web_transport/web_transport.h" @@ -31,10 +29,7 @@ class QUICHE_EXPORT SubscribeWindow { : start_(start), end_(Location(end_group.value_or(UINT64_MAX), UINT64_MAX)) {} // For FETCH with end object - SubscribeWindow(Location start, uint64_t end_group, - std::optional end_object) - : start_(start), - end_(Location(end_group, end_object.value_or(UINT64_MAX))) {} + SubscribeWindow(Location start, Location end) : start_(start), end_(end) {} bool InWindow(const Location& seq) const { return start_ <= seq && seq <= end_; @@ -58,28 +53,6 @@ class QUICHE_EXPORT SubscribeWindow { Location end_ = Location(UINT64_MAX, UINT64_MAX); }; -// A tuple uniquely identifying a WebTransport data stream associated with a -// subscription. By convention, if a DataStreamIndex is necessary for a datagram -// track, `subgroup` is set to zero. -struct DataStreamIndex { - uint64_t group = 0; - uint64_t subgroup = 0; - - DataStreamIndex() = default; - DataStreamIndex(uint64_t group, uint64_t subgroup) - : group(group), subgroup(subgroup) {} - explicit DataStreamIndex(const PublishedObject& object) - : group(object.metadata.location.group), - subgroup(object.metadata.subgroup) {} - - auto operator<=>(const DataStreamIndex&) const = default; - - template - friend H AbslHashValue(H h, const DataStreamIndex& index) { - return H::combine(std::move(h), index.group, index.subgroup); - } -}; - // A map of outgoing data streams indexed by object sequence numbers. class QUICHE_EXPORT SendStreamMap { public: diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_trace_recorder.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_trace_recorder.cc new file mode 100644 index 0000000000..549d6ac7d2 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_trace_recorder.cc @@ -0,0 +1,58 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "quiche/quic/moqt/moqt_trace_recorder.h" + +#include + +#include "quiche/quic/moqt/moqt_messages.h" +#include "quic_trace/quic_trace.pb.h" +#include "quiche/web_transport/web_transport.h" + +namespace moqt { + +void MoqtTraceRecorder::RecordControlStreamCreated( + webtransport::StreamId stream_id) { + if (trace_ == nullptr) { + return; + } + quic_trace::StreamAnnotation* annotation = trace_->add_stream_annotations(); + annotation->set_stream_id(stream_id); + annotation->set_moqt_control_stream(true); +} + +void MoqtTraceRecorder::RecordSubgroupStreamCreated( + webtransport::StreamId stream_id, uint64_t track_alias, + DataStreamIndex index) { + if (trace_ == nullptr) { + return; + } + quic_trace::StreamAnnotation* annotation = trace_->add_stream_annotations(); + annotation->set_stream_id(stream_id); + annotation->mutable_moqt_subgroup_stream()->set_track_alias(track_alias); + annotation->mutable_moqt_subgroup_stream()->set_group_id(index.group); + annotation->mutable_moqt_subgroup_stream()->set_subgroup_id(index.subgroup); +} + +void MoqtTraceRecorder::RecordFetchStreamCreated( + webtransport::StreamId stream_id) { + if (trace_ == nullptr) { + return; + } + quic_trace::StreamAnnotation* annotation = trace_->add_stream_annotations(); + annotation->set_stream_id(stream_id); + annotation->mutable_moqt_fetch_stream(); +} + +void MoqtTraceRecorder::RecordProbeStreamCreated( + webtransport::StreamId stream_id, uint64_t probe_id) { + if (trace_ == nullptr) { + return; + } + quic_trace::StreamAnnotation* annotation = trace_->add_stream_annotations(); + annotation->set_stream_id(stream_id); + annotation->mutable_moqt_probe_stream()->set_probe_id(probe_id); +} + +} // namespace moqt diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_trace_recorder.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_trace_recorder.h new file mode 100644 index 0000000000..80c84bb425 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_trace_recorder.h @@ -0,0 +1,52 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_MOQT_MOQT_TRACE_RECORDER_H_ +#define QUICHE_QUIC_MOQT_MOQT_TRACE_RECORDER_H_ + +#include + +#include "absl/base/nullability.h" +#include "quiche/quic/moqt/moqt_messages.h" +#include "quic_trace/quic_trace.pb.h" +#include "quiche/web_transport/web_transport.h" + +namespace moqt { + +// Records MOQT-specific information into the provided QUIC trace proto. The +// wrapped trace can be nullptr, in which case no recording takes place. +class MoqtTraceRecorder { + public: + MoqtTraceRecorder() : trace_(nullptr) {} + explicit MoqtTraceRecorder(quic_trace::Trace* absl_nullable trace) + : trace_(trace) {} + + MoqtTraceRecorder(const MoqtTraceRecorder&) = delete; + MoqtTraceRecorder(MoqtTraceRecorder&&) = delete; + MoqtTraceRecorder& operator=(const MoqtTraceRecorder&) = delete; + MoqtTraceRecorder& operator=(MoqtTraceRecorder&&) = delete; + + void set_trace(quic_trace::Trace* absl_nullable trace) { trace_ = trace; } + + // Annotates the specified stream as the MOQT control stream. + void RecordControlStreamCreated(webtransport::StreamId stream_id); + + // Annotates the specified stream as an MOQT subgroup data stream. + void RecordSubgroupStreamCreated(webtransport::StreamId stream_id, + uint64_t track_alias, DataStreamIndex index); + + // Annotates the specified stream as an MOQT fetch data stream. + void RecordFetchStreamCreated(webtransport::StreamId stream_id); + + // Annotates the specified stream as an MOQT probe stream. + void RecordProbeStreamCreated(webtransport::StreamId stream_id, + uint64_t probe_id); + + private: + quic_trace::Trace* absl_nullable trace_; +}; + +} // namespace moqt + +#endif // QUICHE_QUIC_MOQT_MOQT_TRACE_RECORDER_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_track.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_track.cc index 5deee1cf50..01be11b14d 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_track.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_track.cc @@ -16,10 +16,10 @@ #include "quiche/quic/core/quic_alarm.h" #include "quiche/quic/core/quic_clock.h" #include "quiche/quic/core/quic_time.h" -#include "quiche/quic/moqt/moqt_failed_fetch.h" +#include "quiche/quic/moqt/moqt_fetch_task.h" #include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_priority.h" -#include "quiche/quic/moqt/moqt_publisher.h" #include "quiche/common/platform/api/quiche_bug_tracker.h" #include "quiche/common/quiche_buffer_allocator.h" #include "quiche/common/quiche_mem_slice.h" @@ -30,9 +30,9 @@ namespace moqt { namespace { -constexpr quic::QuicTimeDelta kMinSubscribeDoneTimeout = +constexpr quic::QuicTimeDelta kMinPublishDoneTimeout = quic::QuicTimeDelta::FromSeconds(1); -constexpr quic::QuicTimeDelta kMaxSubscribeDoneTimeout = +constexpr quic::QuicTimeDelta kMaxPublishDoneTimeout = quic::QuicTimeDelta::FromSeconds(10); } // namespace @@ -54,31 +54,40 @@ void SubscribeRemoteTrack::OnStreamOpened() { } } -void SubscribeRemoteTrack::OnStreamClosed() { +void SubscribeRemoteTrack::OnStreamClosed( + bool fin_received, std::optional index) { ++streams_closed_; --currently_open_streams_; QUICHE_DCHECK_GE(currently_open_streams_, -1); + if (index.has_value()) { + // If index is nullopt, there was not an object received on the stream. + if (fin_received) { + visitor_->OnStreamFin(full_track_name(), *index); + } else { + visitor_->OnStreamReset(full_track_name(), *index); + } + } if (subscribe_done_alarm_ == nullptr) { return; } - MaybeSetSubscribeDoneAlarm(); + MaybeSetPublishDoneAlarm(); } -void SubscribeRemoteTrack::OnSubscribeDone( +void SubscribeRemoteTrack::OnPublishDone( uint64_t stream_count, const quic::QuicClock* clock, std::unique_ptr subscribe_done_alarm) { total_streams_ = stream_count; clock_ = clock; subscribe_done_alarm_ = std::move(subscribe_done_alarm); - MaybeSetSubscribeDoneAlarm(); + MaybeSetPublishDoneAlarm(); } -void SubscribeRemoteTrack::MaybeSetSubscribeDoneAlarm() { +void SubscribeRemoteTrack::MaybeSetPublishDoneAlarm() { if (currently_open_streams_ == 0 && total_streams_.has_value() && clock_ != nullptr) { quic::QuicTimeDelta timeout = - std::min(delivery_timeout_, kMaxSubscribeDoneTimeout); - timeout = std::max(timeout, kMinSubscribeDoneTimeout); + std::min(delivery_timeout_, kMaxPublishDoneTimeout); + timeout = std::max(timeout, kMinPublishDoneTimeout); subscribe_done_alarm_->Set(clock_->ApproximateNow() + timeout); } } @@ -169,11 +178,20 @@ void UpstreamFetch::OnStreamOpened(CanReadCallback can_read_callback) { bool UpstreamFetch::LocationIsValid(Location location, MoqtObjectStatus status, bool end_of_message) { - if (no_more_objects_) { - return false; + if (end_of_track_.has_value()) { + // Cannot exceed or change end_of_track_. + if (location > end_of_track_) { + return false; + } + if (status == MoqtObjectStatus::kEndOfTrack && location != *end_of_track_) { + return false; + } } if (end_of_message && status == MoqtObjectStatus::kEndOfTrack) { - no_more_objects_ = true; + if (highest_location_.has_value() && location < *highest_location_) { + return false; + } + end_of_track_ = location; } bool last_group_is_finished = last_group_is_finished_; last_group_is_finished_ = @@ -181,6 +199,11 @@ bool UpstreamFetch::LocationIsValid(Location location, MoqtObjectStatus status, std::optional last_location = last_location_; if (end_of_message) { last_location_ = location; + if (!highest_location_.has_value()) { + highest_location_ = location; + } else { + highest_location_ = std::max(*highest_location_, location); + } } if (!last_location.has_value()) { return true; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_track.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_track.h index d2bfc187d0..d87d44b53a 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_track.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/moqt_track.h @@ -14,9 +14,11 @@ #include "absl/strings/string_view.h" #include "quiche/quic/core/quic_alarm.h" #include "quiche/quic/core/quic_time.h" +#include "quiche/quic/moqt/moqt_fetch_task.h" #include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_priority.h" -#include "quiche/quic/moqt/moqt_publisher.h" +#include "quiche/quic/moqt/moqt_session_interface.h" #include "quiche/quic/moqt/moqt_subscribe_windows.h" #include "quiche/common/quiche_buffer_allocator.h" #include "quiche/common/quiche_callbacks.h" @@ -30,10 +32,6 @@ class MoqtSessionPeer; class SubscribeRemoteTrackPeer; } // namespace test -using MoqtObjectAckFunction = - quiche::MultiUseCallback; - // State common to both SUBSCRIBE and FETCH upstream. class RemoteTrack { public: @@ -92,34 +90,8 @@ class RemoteTrack { // A track on the peer to which the session has subscribed. class SubscribeRemoteTrack : public RemoteTrack { public: - // TODO: Separate this out (as it's used by the application) and give it a - // name like MoqtTrackSubscriber, - class Visitor { - public: - virtual ~Visitor() = default; - // Called when the session receives a response to the SUBSCRIBE, unless it's - // a SUBSCRIBE_ERROR with a new track_alias. In that case, the session will - // automatically retry. - virtual void OnReply( - const FullTrackName& full_track_name, - std::optional largest_location, - std::optional error_reason_phrase) = 0; - // Called when the subscription process is far enough that it is possible to - // send OBJECT_ACK messages; provides a callback to do so. The callback is - // valid for as long as the session is valid. - virtual void OnCanAckObjects(MoqtObjectAckFunction ack_function) = 0; - // Called when an object fragment (or an entire object) is received. - virtual void OnObjectFragment(const FullTrackName& full_track_name, - const PublishedObjectMetadata& metadata, - absl::string_view object, - bool end_of_message) = 0; - virtual void OnSubscribeDone(FullTrackName full_track_name) = 0; - // Called when the track is malformed per Section 2.5 of - // draft-ietf-moqt-moq-transport-12. If the application is a relay, it MUST - // terminate downstream delivery of the track. - virtual void OnMalformedTrack(const FullTrackName& full_track_name) = 0; - }; - SubscribeRemoteTrack(const MoqtSubscribe& subscribe, Visitor* visitor) + SubscribeRemoteTrack(const MoqtSubscribe& subscribe, + SubscribeVisitor* visitor) : RemoteTrack(subscribe.full_track_name, subscribe.request_id, SubscribeWindow(subscribe.start.value_or(Location()), subscribe.end_group), @@ -140,7 +112,7 @@ class SubscribeRemoteTrack : public RemoteTrack { void set_track_alias(uint64_t track_alias) { track_alias_.emplace(track_alias); } - Visitor* visitor() { return visitor_; } + SubscribeVisitor* visitor() { return visitor_; } // Returns false if the forwarding preference is changing on the track. bool OnObject(bool is_datagram) { @@ -160,9 +132,9 @@ class SubscribeRemoteTrack : public RemoteTrack { return window_mutable().TruncateEnd(end_group); } void OnStreamOpened(); - void OnStreamClosed(); - void OnSubscribeDone(uint64_t stream_count, const quic::QuicClock* clock, - std::unique_ptr subscribe_done_alarm); + void OnStreamClosed(bool fin_received, std::optional index); + void OnPublishDone(uint64_t stream_count, const quic::QuicClock* clock, + std::unique_ptr subscribe_done_alarm); bool all_streams_closed() const { return total_streams_.has_value() && *total_streams_ == streams_closed_; } @@ -182,14 +154,14 @@ class SubscribeRemoteTrack : public RemoteTrack { friend class test::MoqtSessionPeer; friend class test::SubscribeRemoteTrackPeer; - void MaybeSetSubscribeDoneAlarm(); + void MaybeSetPublishDoneAlarm(); void FetchObjects(); std::unique_ptr fetch_task_; std::optional track_alias_; bool forward_; - Visitor* visitor_; + SubscribeVisitor* visitor_; std::optional is_datagram_; int currently_open_streams_ = 0; // Every stream that has received FIN or RESET_STREAM. @@ -203,12 +175,6 @@ class SubscribeRemoteTrack : public RemoteTrack { const quic::QuicClock* clock_ = nullptr; }; -// MoqtSession calls this when a FETCH_OK or FETCH_ERROR is received. The -// destination of the callback owns |fetch_task| and MoqtSession will react -// safely if the owner destroys it. -using FetchResponseCallback = - quiche::SingleUseCallback fetch_task)>; - // This is a callback to MoqtSession::IncomingDataStream. Called when the // FetchTask has its object cache empty, on creation, and whenever the // application reads it. @@ -227,8 +193,7 @@ class UpstreamFetch : public RemoteTrack { FetchResponseCallback callback) : RemoteTrack( standalone.full_track_name, fetch.request_id, - SubscribeWindow(standalone.start_object, standalone.end_group, - standalone.end_object), + SubscribeWindow(standalone.start_location, standalone.end_location), fetch.subscriber_priority), ok_callback_(std::move(callback)) {} // Relative Joining Fetch constructor @@ -350,9 +315,12 @@ class UpstreamFetch : public RemoteTrack { private: std::optional group_order_; // nullopt if not yet known. + // The last object received on the stream. std::optional last_location_; + // The highest location received on the stream. + std::optional highest_location_; bool last_group_is_finished_ = false; // Received EndOfGroup. - bool no_more_objects_ = false; // Received EndOfTrack + std::optional end_of_track_; // Received EndOfTrack quiche::QuicheWeakPtr task_; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/relay_namespace_tree.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/relay_namespace_tree.h new file mode 100644 index 0000000000..504741867e --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/relay_namespace_tree.h @@ -0,0 +1,228 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_MOQT_RELAY_NAMESPACE_TREE_H_ +#define QUICHE_QUIC_MOQT_RELAY_NAMESPACE_TREE_H_ + +#include +#include +#include +#include + +#include "absl/base/nullability.h" +#include "absl/container/flat_hash_map.h" +#include "absl/container/flat_hash_set.h" +#include "absl/strings/string_view.h" +#include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_session_interface.h" +#include "quiche/common/quiche_weak_ptr.h" + +namespace moqt { + +// A data structure for all namespaces an MOQT relay is aware of. +// For any given namespace, it stores all publishers, subscribers, and published +// tracks in that namespace. +// A subscriber must be notified of any publish in a child namespace, and a +// new PUBLISH(_NAMESPACE) has to find subscribers to parent namespaces. +// Therefore, this is a tree structure to easily and scalably move up and down +// the hierarchy to find parents or children. +class RelayNamespaceTree { + public: + // Adds a publisher to the namespace tree. The caller is responsible to call + // RemovePublisher if it goes away. |session| is stored as a WeakPtr. + void AddPublisher(const TrackNamespace& track_namespace, + MoqtSessionInterface* absl_nonnull session) { + Node* node = FindOrCreateNode(track_namespace); + if (node->publishers.empty()) { + NotifyAllParents(track_namespace, /*adding=*/true); + } + node->publishers.emplace(session->GetWeakPtr()); + } + + void RemovePublisher(const TrackNamespace& track_namespace, + MoqtSessionInterface* absl_nonnull session) { + Node* node = FindNode(track_namespace); + if (node == nullptr) { + return; + } + node->publishers.erase(session->GetWeakPtr()); + // Tell all the namespace listeners. + if (node->publishers.empty()) { + TrackNamespace mutable_namespace = track_namespace; + NotifyAllParents(track_namespace, /*adding=*/false); + MaybePrune(node, mutable_namespace); + } + } + + // The caller is responsible to call RemoveNamespaceListener if it goes away. + // Thus, it is safe to store it as a raw pointer. + void AddSubscriber(const TrackNamespace& track_namespace, + MoqtSessionInterface* absl_nonnull subscriber) { + Node* node = FindOrCreateNode(track_namespace); + node->subscribers.insert(subscriber->GetWeakPtr()); + // Notify the listener of every published namespace and track in this + // namespace. + TrackNamespace mutable_namespace = track_namespace; + NotifyOfAllChildren(node, mutable_namespace, subscriber); + } + + void RemoveSubscriber(const TrackNamespace& track_namespace, + MoqtSessionInterface* absl_nonnull subscriber) { + Node* node = FindNode(track_namespace); + if (node == nullptr) { + return; + } + node->subscribers.erase(subscriber->GetWeakPtr()); + TrackNamespace mutable_namespace = track_namespace; + MaybePrune(node, mutable_namespace); + } + + // Returns a raw pointer to the session that publishes the smallest namespace + // that contains |track_namespace|. If a WeakPtr is found to be invalid, + // deletes them from the tree. + MoqtSessionInterface* GetValidPublisher( + const TrackNamespace& track_namespace) const { + Node* node = FindNode(track_namespace); + TrackNamespace mutable_namespace = track_namespace; + while ((node == nullptr || node->publishers.empty()) && + mutable_namespace.PopElement()) { + node = FindNode(mutable_namespace); + } + if (node == nullptr || node->publishers.empty()) { + return nullptr; + } + MoqtSessionInterface* upstream = node->publishers.begin()->GetIfAvailable(); + if (!upstream) { + QUICHE_BUG(publisher_is_invalid) + << "Publisher WeakPtr is invalid but not removed from the set"; + return nullptr; + } + return upstream; + } + + protected: + uint64_t NumNamespaces() const { return nodes_.size(); } + + private: + struct Node { + explicit Node(absl::string_view element) : element(element) {} + + const std::string element; + absl::flat_hash_set children; + + // Publishers of this namespace. + absl::flat_hash_set> publishers; + // Just store the track name. Additional information will be in the + // TrackPublisher. + absl::flat_hash_set published_tracks; + absl::flat_hash_set> + subscribers; + bool CanPrune() const { + return children.empty() && publishers.empty() && + published_tracks.empty() && subscribers.empty(); + } + }; + + Node* FindNode(const TrackNamespace& track_namespace) const { + auto it = nodes_.find(track_namespace); + if (it == nodes_.end()) { + return nullptr; + } + return it->second.get(); + } + + Node* FindOrCreateNode(const TrackNamespace& track_namespace) { + auto [it, inserted] = + nodes_.emplace(track_namespace, + std::make_unique(track_namespace.tuple().back())); + if (!inserted) { + return it->second.get(); + } + Node* node = it->second.get(); // store it in case it moves. + TrackNamespace mutable_namespace = track_namespace; + if (mutable_namespace.PopElement()) { + Node* parent = FindOrCreateNode(mutable_namespace); + parent->children.insert(node); + } + return node; + } + + // Recursive function to notify |listener| of all published namespaces and + // tracks in and below |node|. + void NotifyOfAllChildren(Node* node, TrackNamespace& track_namespace, + MoqtSessionInterface* subscriber) { + // TODO(martinduke): Publish everything in node->published_tracks. + if (!node->publishers.empty()) { + subscriber->PublishNamespace( + track_namespace, + [](const TrackNamespace&, std::optional) {}, + // TODO(martinduke): Add parameters. + VersionSpecificParameters()); + } + for (auto child = node->children.begin(); child != node->children.end(); + ++child) { + track_namespace.AddElement((*child)->element); + NotifyOfAllChildren(*child, track_namespace, subscriber); + track_namespace.PopElement(); + } + } + + // If |adding| is true, sends PUBLISH_NAMESPACE to all subscribers to a + // parent namespace. If |adding| is false, sends PUBLISH_NAMESPACE_DONE. + void NotifyAllParents(const TrackNamespace& track_namespace, bool adding) { + TrackNamespace mutable_namespace = track_namespace; + do { + Node* node = FindNode(mutable_namespace); + if (node == nullptr) { + continue; + } + for (const quiche::QuicheWeakPtr& subscriber_ptr : + node->subscribers) { + MoqtSessionInterface* subscriber = subscriber_ptr.GetIfAvailable(); + if (subscriber == nullptr) { + QUICHE_BUG(subscriber_is_invalid) + << "Subscriber WeakPtr is invalid but not removed from the set"; + continue; + } + if (adding) { + subscriber->PublishNamespace( + track_namespace, + [](const TrackNamespace&, std::optional) {}, + // TODO(martinduke): Add parameters. + VersionSpecificParameters()); + } else { + subscriber->PublishNamespaceDone(track_namespace); + } + } + } while (mutable_namespace.PopElement()); + } + + // If a node has no children, publishers, or subscribers, remove it and see + // if the same applies to its parent. + void MaybePrune(Node* node, TrackNamespace& track_namespace) { + if (node == nullptr || !node->CanPrune()) { + return; + } + Node* child = node; // Save the pointer before erasing. + nodes_.erase(track_namespace); + // child is now gone, do not dereference! + if (track_namespace.PopElement()) { + Node* parent = FindNode(track_namespace); + QUICHE_BUG_IF(quiche_bug_no_parent_namespace, parent == nullptr) + << "Parent namespace not found for " << track_namespace; + if (parent != nullptr) { + parent->children.erase(child); + MaybePrune(parent, track_namespace); + } + } + } + + // A map that allows quick access to any namespace without traversing the + // tree. Use unique_ptr so that it's pointer stable. + absl::flat_hash_map> nodes_; +}; + +} // namespace moqt + +#endif // QUICHE_QUIC_MOQT_RELAY_NAMESPACE_TREE_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/session_namespace_tree.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/session_namespace_tree.h new file mode 100644 index 0000000000..b68f3826cb --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/session_namespace_tree.h @@ -0,0 +1,84 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_MOQT_SESSION_NAMESPACE_TREE_H_ +#define QUICHE_QUIC_MOQT_SESSION_NAMESPACE_TREE_H_ + +#include + +#include "absl/container/flat_hash_map.h" +#include "absl/container/flat_hash_set.h" +#include "quiche/quic/moqt/moqt_messages.h" + +namespace moqt { + +// Publishers MUST respond with an error if a SUBSCRIBE_NAMESPACE arrives that +// in any way intersects with an existing SUBSCRIBE_NAMESPACE. This requires a +// fairly complex data structure where each part of the tuple is a node. If a +// node has no children, it indicates a complete namespace, and there can be no +// other complete namespaces as direct ancestors or descendants. +// For example, if a/b/c and a/b/d are in the tree, then a/b/e is allowed, but +// a/b and a/b/c/d would not be. +class SessionNamespaceTree { + public: + SessionNamespaceTree() = default; + ~SessionNamespaceTree() {} + + // Returns false if the namespace was not subscribed. + bool SubscribeNamespace(const TrackNamespace& track_namespace) { + if (prohibited_namespaces_.contains(track_namespace)) { + return false; + } + TrackNamespace higher_namespace = track_namespace; + do { + if (subscribed_namespaces_.contains(higher_namespace)) { + return false; + } + } while (higher_namespace.PopElement()); + subscribed_namespaces_.insert(track_namespace); + // Add a reference to every higher namespace to block future subscriptions. + higher_namespace = track_namespace; + while (higher_namespace.PopElement()) { + ++prohibited_namespaces_[higher_namespace]; + } + return true; + } + + void UnsubscribeNamespace(const TrackNamespace& track_namespace) { + if (subscribed_namespaces_.erase(track_namespace) == 0) { + return; + } + // Delete one ref from prohibited_namespaces_. + TrackNamespace higher_namespace = track_namespace; + while (higher_namespace.PopElement()) { + auto it2 = prohibited_namespaces_.find(higher_namespace); + if (it2 == prohibited_namespaces_.end()) { + continue; + } + if (it2->second == 1) { + prohibited_namespaces_.erase(it2); + } else { + --it2->second; + } + } + } + + // Used only when the SessionNamespaceTree is being destroyed. + const absl::flat_hash_set& GetSubscribedNamespaces() const { + return subscribed_namespaces_; + } + + protected: + uint64_t NumSubscriptions() const { return subscribed_namespaces_.size(); } + + private: + absl::flat_hash_set subscribed_namespaces_; + // Namespaces that cannot be subscribed to because they intersect with an + // existing subscription. The value is a ref count. + absl::flat_hash_map prohibited_namespaces_; +}; + +} // namespace moqt + +#endif // QUICHE_QUIC_MOQT_SESSION_NAMESPACE_TREE_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/mock_moqt_session.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/mock_moqt_session.h new file mode 100644 index 0000000000..b52940fe1c --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/mock_moqt_session.h @@ -0,0 +1,89 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_MOQT_TOOLS_MOCK_MOQT_SESSION_H_ +#define QUICHE_QUIC_MOQT_TOOLS_MOCK_MOQT_SESSION_H_ + +#include +#include + +#include "absl/strings/string_view.h" +#include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_priority.h" +#include "quiche/quic/moqt/moqt_session_callbacks.h" +#include "quiche/quic/moqt/moqt_session_interface.h" +#include "quiche/common/platform/api/quiche_test.h" +#include "quiche/common/quiche_weak_ptr.h" + +namespace moqt { +namespace test { + +class MockMoqtSession : public MoqtSessionInterface { + public: + MOCK_METHOD(MoqtSessionCallbacks&, callbacks, (), (override)); + MOCK_METHOD(void, Error, (MoqtError code, absl::string_view error), + (override)); + MOCK_METHOD(bool, SubscribeAbsolute, + (const FullTrackName& name, uint64_t start_group, + uint64_t start_object, SubscribeVisitor* visitor, + VersionSpecificParameters parameters), + (override)); + MOCK_METHOD(bool, SubscribeAbsolute, + (const FullTrackName& name, uint64_t start_group, + uint64_t start_object, uint64_t end_group, + SubscribeVisitor* visitor, VersionSpecificParameters parameters), + (override)); + MOCK_METHOD(bool, SubscribeCurrentObject, + (const FullTrackName& name, SubscribeVisitor* visitor, + VersionSpecificParameters parameters), + (override)); + MOCK_METHOD(bool, SubscribeNextGroup, + (const FullTrackName& name, SubscribeVisitor* visitor, + VersionSpecificParameters parameters), + (override)); + MOCK_METHOD(bool, SubscribeUpdate, + (const FullTrackName& name, std::optional start, + std::optional end_group, + std::optional subscriber_priority, + std::optional forward, + VersionSpecificParameters parameters), + (override)); + MOCK_METHOD(void, Unsubscribe, (const FullTrackName& name), (override)); + MOCK_METHOD(bool, Fetch, + (const FullTrackName& name, FetchResponseCallback callback, + Location start, uint64_t end_group, + std::optional end_object, MoqtPriority priority, + std::optional delivery_order, + VersionSpecificParameters parameters), + (override)); + MOCK_METHOD(bool, RelativeJoiningFetch, + (const FullTrackName& name, SubscribeVisitor* visitor, + uint64_t num_previous_groups, + VersionSpecificParameters parameters), + (override)); + MOCK_METHOD(bool, RelativeJoiningFetch, + (const FullTrackName& name, SubscribeVisitor* visitor, + FetchResponseCallback callback, uint64_t num_previous_groups, + MoqtPriority priority, + std::optional delivery_order, + VersionSpecificParameters parameters), + (override)); + MOCK_METHOD(void, PublishNamespace, + (TrackNamespace track_namespace, + MoqtOutgoingPublishNamespaceCallback callback, + VersionSpecificParameters parameters), + (override)); + MOCK_METHOD(bool, PublishNamespaceDone, (TrackNamespace track_namespace), + (override)); + + quiche::QuicheWeakPtr GetWeakPtr() override { + return weak_factory_.Create(); + } + quiche::QuicheWeakPtrFactory weak_factory_{this}; +}; + +} // namespace test +} // namespace moqt + +#endif // QUICHE_QUIC_MOQT_TOOLS_MOCK_MOQT_SESSION_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_framer_utils.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_framer_utils.cc index bc979d4bc7..6073b87163 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_framer_utils.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_framer_utils.cc @@ -25,99 +25,6 @@ namespace moqt::test { namespace { -struct TypeVisitor { - MoqtMessageType operator()(const MoqtClientSetup&) { - return MoqtMessageType::kClientSetup; - } - MoqtMessageType operator()(const MoqtServerSetup&) { - return MoqtMessageType::kServerSetup; - } - MoqtMessageType operator()(const MoqtSubscribe&) { - return MoqtMessageType::kSubscribe; - } - MoqtMessageType operator()(const MoqtSubscribeOk&) { - return MoqtMessageType::kSubscribeOk; - } - MoqtMessageType operator()(const MoqtSubscribeError&) { - return MoqtMessageType::kSubscribeError; - } - MoqtMessageType operator()(const MoqtUnsubscribe&) { - return MoqtMessageType::kUnsubscribe; - } - MoqtMessageType operator()(const MoqtSubscribeDone&) { - return MoqtMessageType::kSubscribeDone; - } - MoqtMessageType operator()(const MoqtSubscribeUpdate&) { - return MoqtMessageType::kSubscribeUpdate; - } - MoqtMessageType operator()(const MoqtAnnounce&) { - return MoqtMessageType::kAnnounce; - } - MoqtMessageType operator()(const MoqtAnnounceOk&) { - return MoqtMessageType::kAnnounceOk; - } - MoqtMessageType operator()(const MoqtAnnounceError&) { - return MoqtMessageType::kAnnounceError; - } - MoqtMessageType operator()(const MoqtAnnounceCancel&) { - return MoqtMessageType::kAnnounceCancel; - } - MoqtMessageType operator()(const MoqtTrackStatusRequest&) { - return MoqtMessageType::kTrackStatusRequest; - } - MoqtMessageType operator()(const MoqtUnannounce&) { - return MoqtMessageType::kUnannounce; - } - MoqtMessageType operator()(const MoqtTrackStatus&) { - return MoqtMessageType::kTrackStatus; - } - MoqtMessageType operator()(const MoqtGoAway&) { - return MoqtMessageType::kGoAway; - } - MoqtMessageType operator()(const MoqtSubscribeAnnounces&) { - return MoqtMessageType::kSubscribeAnnounces; - } - MoqtMessageType operator()(const MoqtSubscribeAnnouncesOk&) { - return MoqtMessageType::kSubscribeAnnouncesOk; - } - MoqtMessageType operator()(const MoqtSubscribeAnnouncesError&) { - return MoqtMessageType::kSubscribeAnnouncesError; - } - MoqtMessageType operator()(const MoqtUnsubscribeAnnounces&) { - return MoqtMessageType::kUnsubscribeAnnounces; - } - MoqtMessageType operator()(const MoqtMaxRequestId&) { - return MoqtMessageType::kMaxRequestId; - } - MoqtMessageType operator()(const MoqtFetch&) { - return MoqtMessageType::kFetch; - } - MoqtMessageType operator()(const MoqtFetchCancel&) { - return MoqtMessageType::kFetchCancel; - } - MoqtMessageType operator()(const MoqtFetchOk&) { - return MoqtMessageType::kFetchOk; - } - MoqtMessageType operator()(const MoqtFetchError&) { - return MoqtMessageType::kFetchError; - } - MoqtMessageType operator()(const MoqtRequestsBlocked&) { - return MoqtMessageType::kRequestsBlocked; - } - MoqtMessageType operator()(const MoqtPublish&) { - return MoqtMessageType::kPublish; - } - MoqtMessageType operator()(const MoqtPublishOk&) { - return MoqtMessageType::kPublishOk; - } - MoqtMessageType operator()(const MoqtPublishError&) { - return MoqtMessageType::kPublishError; - } - MoqtMessageType operator()(const MoqtObjectAck&) { - return MoqtMessageType::kObjectAck; - } -}; - struct FramingVisitor { quiche::QuicheBuffer operator()(const MoqtClientSetup& message) { return framer.SerializeClientSetup(message); @@ -137,47 +44,50 @@ struct FramingVisitor { quiche::QuicheBuffer operator()(const MoqtUnsubscribe& message) { return framer.SerializeUnsubscribe(message); } - quiche::QuicheBuffer operator()(const MoqtSubscribeDone& message) { - return framer.SerializeSubscribeDone(message); + quiche::QuicheBuffer operator()(const MoqtPublishDone& message) { + return framer.SerializePublishDone(message); } quiche::QuicheBuffer operator()(const MoqtSubscribeUpdate& message) { return framer.SerializeSubscribeUpdate(message); } - quiche::QuicheBuffer operator()(const MoqtAnnounce& message) { - return framer.SerializeAnnounce(message); + quiche::QuicheBuffer operator()(const MoqtPublishNamespace& message) { + return framer.SerializePublishNamespace(message); } - quiche::QuicheBuffer operator()(const MoqtAnnounceOk& message) { - return framer.SerializeAnnounceOk(message); + quiche::QuicheBuffer operator()(const MoqtPublishNamespaceOk& message) { + return framer.SerializePublishNamespaceOk(message); } - quiche::QuicheBuffer operator()(const MoqtAnnounceError& message) { - return framer.SerializeAnnounceError(message); + quiche::QuicheBuffer operator()(const MoqtPublishNamespaceError& message) { + return framer.SerializePublishNamespaceError(message); } - quiche::QuicheBuffer operator()(const MoqtAnnounceCancel& message) { - return framer.SerializeAnnounceCancel(message); + quiche::QuicheBuffer operator()(const MoqtPublishNamespaceDone& message) { + return framer.SerializePublishNamespaceDone(message); } - quiche::QuicheBuffer operator()(const MoqtTrackStatusRequest& message) { - return framer.SerializeTrackStatusRequest(message); - } - quiche::QuicheBuffer operator()(const MoqtUnannounce& message) { - return framer.SerializeUnannounce(message); + quiche::QuicheBuffer operator()(const MoqtPublishNamespaceCancel& message) { + return framer.SerializePublishNamespaceCancel(message); } quiche::QuicheBuffer operator()(const MoqtTrackStatus& message) { return framer.SerializeTrackStatus(message); } + quiche::QuicheBuffer operator()(const MoqtTrackStatusOk& message) { + return framer.SerializeTrackStatusOk(message); + } + quiche::QuicheBuffer operator()(const MoqtTrackStatusError& message) { + return framer.SerializeTrackStatusError(message); + } quiche::QuicheBuffer operator()(const MoqtGoAway& message) { return framer.SerializeGoAway(message); } - quiche::QuicheBuffer operator()(const MoqtSubscribeAnnounces& message) { - return framer.SerializeSubscribeAnnounces(message); + quiche::QuicheBuffer operator()(const MoqtSubscribeNamespace& message) { + return framer.SerializeSubscribeNamespace(message); } - quiche::QuicheBuffer operator()(const MoqtSubscribeAnnouncesOk& message) { - return framer.SerializeSubscribeAnnouncesOk(message); + quiche::QuicheBuffer operator()(const MoqtSubscribeNamespaceOk& message) { + return framer.SerializeSubscribeNamespaceOk(message); } - quiche::QuicheBuffer operator()(const MoqtSubscribeAnnouncesError& message) { - return framer.SerializeSubscribeAnnouncesError(message); + quiche::QuicheBuffer operator()(const MoqtSubscribeNamespaceError& message) { + return framer.SerializeSubscribeNamespaceError(message); } - quiche::QuicheBuffer operator()(const MoqtUnsubscribeAnnounces& message) { - return framer.SerializeUnsubscribeAnnounces(message); + quiche::QuicheBuffer operator()(const MoqtUnsubscribeNamespace& message) { + return framer.SerializeUnsubscribeNamespace(message); } quiche::QuicheBuffer operator()(const MoqtMaxRequestId& message) { return framer.SerializeMaxRequestId(message); @@ -211,6 +121,7 @@ struct FramingVisitor { } MoqtFramer& framer; + bool is_track_status; }; class GenericMessageParseVisitor : public MoqtControlParserVisitor { @@ -236,47 +147,52 @@ class GenericMessageParseVisitor : public MoqtControlParserVisitor { void OnUnsubscribeMessage(const MoqtUnsubscribe& message) { frames_.push_back(message); } - void OnSubscribeDoneMessage(const MoqtSubscribeDone& message) { + void OnPublishDoneMessage(const MoqtPublishDone& message) { frames_.push_back(message); } void OnSubscribeUpdateMessage(const MoqtSubscribeUpdate& message) { frames_.push_back(message); } - void OnAnnounceMessage(const MoqtAnnounce& message) { + void OnPublishNamespaceMessage(const MoqtPublishNamespace& message) { frames_.push_back(message); } - void OnAnnounceOkMessage(const MoqtAnnounceOk& message) { + void OnPublishNamespaceOkMessage(const MoqtPublishNamespaceOk& message) { frames_.push_back(message); } - void OnAnnounceErrorMessage(const MoqtAnnounceError& message) { + void OnPublishNamespaceErrorMessage( + const MoqtPublishNamespaceError& message) { frames_.push_back(message); } - void OnAnnounceCancelMessage(const MoqtAnnounceCancel& message) { + void OnPublishNamespaceDoneMessage(const MoqtPublishNamespaceDone& message) { frames_.push_back(message); } - void OnTrackStatusRequestMessage(const MoqtTrackStatusRequest& message) { - frames_.push_back(message); - } - void OnUnannounceMessage(const MoqtUnannounce& message) { + void OnPublishNamespaceCancelMessage( + const MoqtPublishNamespaceCancel& message) { frames_.push_back(message); } void OnTrackStatusMessage(const MoqtTrackStatus& message) { frames_.push_back(message); } + void OnTrackStatusOkMessage(const MoqtTrackStatusOk& message) { + frames_.push_back(message); + } + void OnTrackStatusErrorMessage(const MoqtTrackStatusError& message) { + frames_.push_back(message); + } void OnGoAwayMessage(const MoqtGoAway& message) { frames_.push_back(message); } - void OnSubscribeAnnouncesMessage(const MoqtSubscribeAnnounces& message) { + void OnSubscribeNamespaceMessage(const MoqtSubscribeNamespace& message) { frames_.push_back(message); } - void OnSubscribeAnnouncesOkMessage(const MoqtSubscribeAnnouncesOk& message) { + void OnSubscribeNamespaceOkMessage(const MoqtSubscribeNamespaceOk& message) { frames_.push_back(message); } - void OnSubscribeAnnouncesErrorMessage( - const MoqtSubscribeAnnouncesError& message) { + void OnSubscribeNamespaceErrorMessage( + const MoqtSubscribeNamespaceError& message) { frames_.push_back(message); } - void OnUnsubscribeAnnouncesMessage(const MoqtUnsubscribeAnnounces& message) { + void OnUnsubscribeNamespaceMessage(const MoqtUnsubscribeNamespace& message) { frames_.push_back(message); } void OnMaxRequestIdMessage(const MoqtMaxRequestId& message) { @@ -324,10 +240,6 @@ std::string SerializeGenericMessage(const MoqtGenericFrame& frame, return std::string(std::visit(FramingVisitor{framer}, frame).AsStringView()); } -MoqtMessageType MessageTypeForGenericMessage(const MoqtGenericFrame& frame) { - return std::visit(TypeVisitor(), frame); -} - std::vector ParseGenericMessage(absl::string_view body) { std::vector result; GenericMessageParseVisitor visitor(&result); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_framer_utils.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_framer_utils.h index 1b6e996fb0..57e0d5b45d 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_framer_utils.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_framer_utils.h @@ -25,19 +25,16 @@ namespace moqt::test { // TODO: remove MoqtObject from TestMessageBase::MessageStructuredData and merge // those two types. -using MoqtGenericFrame = - std::variant; - -MoqtMessageType MessageTypeForGenericMessage(const MoqtGenericFrame& frame); +using MoqtGenericFrame = std::variant< + MoqtClientSetup, MoqtServerSetup, MoqtSubscribe, MoqtSubscribeOk, + MoqtSubscribeError, MoqtUnsubscribe, MoqtPublishDone, MoqtSubscribeUpdate, + MoqtPublishNamespace, MoqtPublishNamespaceOk, MoqtPublishNamespaceError, + MoqtPublishNamespaceDone, MoqtPublishNamespaceCancel, MoqtTrackStatus, + MoqtTrackStatusOk, MoqtTrackStatusError, MoqtGoAway, MoqtSubscribeNamespace, + MoqtSubscribeNamespaceOk, MoqtSubscribeNamespaceError, + MoqtUnsubscribeNamespace, MoqtMaxRequestId, MoqtFetch, MoqtFetchCancel, + MoqtFetchOk, MoqtFetchError, MoqtRequestsBlocked, MoqtPublish, + MoqtPublishOk, MoqtPublishError, MoqtObjectAck>; std::string SerializeGenericMessage(const MoqtGenericFrame& frame, bool use_webtrans = false); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_mock_visitor.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_mock_visitor.h similarity index 64% rename from naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_mock_visitor.h rename to naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_mock_visitor.h index ab2943c0d3..afddd232e3 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_mock_visitor.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_mock_visitor.h @@ -12,15 +12,17 @@ #include #include "absl/status/status.h" -#include "absl/status/statusor.h" #include "absl/strings/string_view.h" #include "quiche/quic/core/quic_time.h" #include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_priority.h" #include "quiche/quic/moqt/moqt_publisher.h" #include "quiche/quic/moqt/moqt_session.h" -#include "quiche/quic/moqt/moqt_track.h" +#include "quiche/quic/moqt/moqt_session_callbacks.h" +#include "quiche/quic/moqt/moqt_session_interface.h" #include "quiche/common/platform/api/quiche_test.h" +#include "quiche/web_transport/web_transport.h" namespace moqt::test { @@ -29,18 +31,20 @@ struct MockSessionCallbacks { testing::MockFunction goaway_received_callback; testing::MockFunction session_terminated_callback; testing::MockFunction session_deleted_callback; - testing::MockFunction( - const TrackNamespace&, std::optional)> - incoming_announce_callback; - testing::MockFunction( - TrackNamespace, std::optional)> - incoming_subscribe_announces_callback; + testing::MockFunction, + MoqtResponseCallback)> + incoming_publish_namespace_callback; + testing::MockFunction, + MoqtResponseCallback)> + incoming_subscribe_namespace_callback; MockSessionCallbacks() { - ON_CALL(incoming_announce_callback, Call(testing::_, testing::_)) - .WillByDefault(DefaultIncomingAnnounceCallback); - ON_CALL(incoming_subscribe_announces_callback, Call(testing::_, testing::_)) - .WillByDefault(DefaultIncomingSubscribeAnnouncesCallback); + ON_CALL(incoming_publish_namespace_callback, Call) + .WillByDefault(DefaultIncomingPublishNamespaceCallback); + ON_CALL(incoming_subscribe_namespace_callback, Call) + .WillByDefault(DefaultIncomingSubscribeNamespaceCallback); } MoqtSessionCallbacks AsSessionCallbacks() { @@ -49,8 +53,8 @@ struct MockSessionCallbacks { goaway_received_callback.AsStdFunction(), session_terminated_callback.AsStdFunction(), session_deleted_callback.AsStdFunction(), - incoming_announce_callback.AsStdFunction(), - incoming_subscribe_announces_callback.AsStdFunction()}; + incoming_publish_namespace_callback.AsStdFunction(), + incoming_subscribe_namespace_callback.AsStdFunction()}; } }; @@ -58,7 +62,7 @@ class MockTrackPublisher : public MoqtTrackPublisher { public: explicit MockTrackPublisher(FullTrackName name) : track_name_(std::move(name)) { - ON_CALL(*this, GetDeliveryOrder()) + ON_CALL(*this, delivery_order()) .WillByDefault(testing::Return(MoqtDeliveryOrder::kAscending)); } const FullTrackName& GetTrackName() const override { return track_name_; } @@ -69,27 +73,31 @@ class MockTrackPublisher : public MoqtTrackPublisher { (override)); MOCK_METHOD(void, RemoveObjectListener, (MoqtObjectListener * listener), (override)); - MOCK_METHOD(absl::StatusOr, GetTrackStatus, (), + MOCK_METHOD(std::optional, largest_location, (), (const, override)); + MOCK_METHOD(std::optional, forwarding_preference, + (), (const, override)); + MOCK_METHOD(std::optional, delivery_order, (), (const, override)); - MOCK_METHOD(Location, GetLargestLocation, (), (const, override)); - MOCK_METHOD(MoqtForwardingPreference, GetForwardingPreference, (), + MOCK_METHOD(std::optional, expiration, (), (const, override)); - MOCK_METHOD(MoqtPriority, GetPublisherPriority, (), (const, override)); - MOCK_METHOD(MoqtDeliveryOrder, GetDeliveryOrder, (), (const, override)); - MOCK_METHOD(std::unique_ptr, Fetch, - (Location, uint64_t, std::optional, MoqtDeliveryOrder), + MOCK_METHOD(std::unique_ptr, StandaloneFetch, + (Location, Location, std::optional), (override)); + MOCK_METHOD(std::unique_ptr, RelativeFetch, + (uint64_t, std::optional), (override)); + MOCK_METHOD(std::unique_ptr, AbsoluteFetch, + (uint64_t, std::optional), (override)); private: FullTrackName track_name_; }; -class MockSubscribeRemoteTrackVisitor : public SubscribeRemoteTrack::Visitor { +// TODO(martinduke): Rename to MockSubscribeVisitor. +class MockSubscribeRemoteTrackVisitor : public SubscribeVisitor { public: MOCK_METHOD(void, OnReply, (const FullTrackName& full_track_name, - std::optional largest_id, - std::optional error_reason_phrase), + (std::variant response)), (override)); MOCK_METHOD(void, OnCanAckObjects, (MoqtObjectAckFunction ack_function), (override)); @@ -98,10 +106,15 @@ class MockSubscribeRemoteTrackVisitor : public SubscribeRemoteTrack::Visitor { const PublishedObjectMetadata& metadata, absl::string_view object, bool end_of_message), (override)); - MOCK_METHOD(void, OnSubscribeDone, (FullTrackName full_track_name), - (override)); + MOCK_METHOD(void, OnPublishDone, (FullTrackName full_track_name), (override)); MOCK_METHOD(void, OnMalformedTrack, (const FullTrackName& full_track_name), (override)); + MOCK_METHOD(void, OnStreamFin, + (const FullTrackName& full_track_name, DataStreamIndex stream), + (override)); + MOCK_METHOD(void, OnStreamReset, + (const FullTrackName& full_track_name, DataStreamIndex stream), + (override)); }; class MockPublishingMonitorInterface : public MoqtPublishingMonitorInterface { @@ -168,6 +181,19 @@ class MockFetchTask : public MoqtFetchTask { bool synchronous_object_available_ = false; }; +class MockMoqtObjectListener : public MoqtObjectListener { + public: + MOCK_METHOD(void, OnSubscribeAccepted, (), (override)); + MOCK_METHOD(void, OnSubscribeRejected, (MoqtRequestError), (override)); + MOCK_METHOD(void, OnNewObjectAvailable, (Location, uint64_t, MoqtPriority), + (override)); + MOCK_METHOD(void, OnNewFinAvailable, (Location, uint64_t), (override)); + MOCK_METHOD(void, OnSubgroupAbandoned, + (uint64_t, uint64_t, webtransport::StreamErrorCode), (override)); + MOCK_METHOD(void, OnGroupAbandoned, (uint64_t), (override)); + MOCK_METHOD(void, OnTrackPublisherGone, (), (override)); +}; + } // namespace moqt::test #endif // QUICHE_QUIC_MOQT_TOOLS_MOQT_MOCK_VISITOR_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h index 71ff1b3a51..c4fce88395 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h @@ -36,6 +36,7 @@ class MoqtParserTestVisitor : public MoqtControlParserVisitor, } last_message_ = TestMessageBase::MessageStructuredData(object); } + void OnFin() override { fin_received_ = true; } template void OnControlMessage(const Message& message) { end_of_message_ = true; @@ -63,48 +64,54 @@ class MoqtParserTestVisitor : public MoqtControlParserVisitor, void OnUnsubscribeMessage(const MoqtUnsubscribe& message) override { OnControlMessage(message); } - void OnSubscribeDoneMessage(const MoqtSubscribeDone& message) override { + void OnPublishDoneMessage(const MoqtPublishDone& message) override { OnControlMessage(message); } - void OnAnnounceMessage(const MoqtAnnounce& message) override { + void OnPublishNamespaceMessage(const MoqtPublishNamespace& message) override { OnControlMessage(message); } - void OnAnnounceOkMessage(const MoqtAnnounceOk& message) override { + void OnPublishNamespaceOkMessage( + const MoqtPublishNamespaceOk& message) override { OnControlMessage(message); } - void OnAnnounceErrorMessage(const MoqtAnnounceError& message) override { + void OnPublishNamespaceErrorMessage( + const MoqtPublishNamespaceError& message) override { OnControlMessage(message); } - void OnAnnounceCancelMessage(const MoqtAnnounceCancel& message) override { + void OnPublishNamespaceDoneMessage( + const MoqtPublishNamespaceDone& message) override { OnControlMessage(message); } - void OnTrackStatusRequestMessage( - const MoqtTrackStatusRequest& message) override { - OnControlMessage(message); - } - void OnUnannounceMessage(const MoqtUnannounce& message) override { + void OnPublishNamespaceCancelMessage( + const MoqtPublishNamespaceCancel& message) override { OnControlMessage(message); } void OnTrackStatusMessage(const MoqtTrackStatus& message) override { OnControlMessage(message); } + void OnTrackStatusOkMessage(const MoqtTrackStatusOk& message) override { + OnControlMessage(message); + } + void OnTrackStatusErrorMessage(const MoqtTrackStatusError& message) override { + OnControlMessage(message); + } void OnGoAwayMessage(const MoqtGoAway& message) override { OnControlMessage(message); } - void OnSubscribeAnnouncesMessage( - const MoqtSubscribeAnnounces& message) override { + void OnSubscribeNamespaceMessage( + const MoqtSubscribeNamespace& message) override { OnControlMessage(message); } - void OnSubscribeAnnouncesOkMessage( - const MoqtSubscribeAnnouncesOk& message) override { + void OnSubscribeNamespaceOkMessage( + const MoqtSubscribeNamespaceOk& message) override { OnControlMessage(message); } - void OnSubscribeAnnouncesErrorMessage( - const MoqtSubscribeAnnouncesError& message) override { + void OnSubscribeNamespaceErrorMessage( + const MoqtSubscribeNamespaceError& message) override { OnControlMessage(message); } - void OnUnsubscribeAnnouncesMessage( - const MoqtUnsubscribeAnnounces& message) override { + void OnUnsubscribeNamespaceMessage( + const MoqtUnsubscribeNamespace& message) override { OnControlMessage(message); } void OnMaxRequestIdMessage(const MoqtMaxRequestId& message) override { @@ -148,6 +155,7 @@ class MoqtParserTestVisitor : public MoqtControlParserVisitor, bool enable_logging_ = true; std::vector object_payloads_; bool end_of_message_ = false; + bool fin_received_ = false; std::optional parsing_error_; MoqtError parsing_error_code_; uint64_t messages_received_ = 0; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_session_peer.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_session_peer.h index 4064ed3a8d..ed1ac8e1aa 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_session_peer.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_session_peer.h @@ -15,14 +15,13 @@ #include "quiche/quic/core/quic_alarm.h" #include "quiche/quic/core/quic_alarm_factory.h" #include "quiche/quic/core/quic_time.h" +#include "quiche/quic/moqt/moqt_fetch_task.h" #include "quiche/quic/moqt/moqt_messages.h" #include "quiche/quic/moqt/moqt_parser.h" #include "quiche/quic/moqt/moqt_priority.h" #include "quiche/quic/moqt/moqt_publisher.h" #include "quiche/quic/moqt/moqt_session.h" -#include "quiche/quic/moqt/moqt_subscribe_windows.h" #include "quiche/quic/moqt/moqt_track.h" -#include "quiche/quic/moqt/tools/moqt_mock_visitor.h" #include "quiche/web_transport/test_tools/mock_web_transport.h" #include "quiche/web_transport/web_transport.h" @@ -87,7 +86,7 @@ class MoqtSessionPeer { static void CreateRemoteTrack(MoqtSession* session, const MoqtSubscribe& subscribe, const std::optional track_alias, - SubscribeRemoteTrack::Visitor* visitor) { + SubscribeVisitor* visitor) { auto track = std::make_unique(subscribe, visitor); if (track_alias.has_value()) { track->set_track_alias(*track_alias); @@ -188,8 +187,8 @@ class MoqtSessionPeer { 0, 128, std::nullopt, - StandaloneFetch(FullTrackName{"foo", "bar"}, Location{0, 0}, 4, - std::nullopt), + StandaloneFetch(FullTrackName{"foo", "bar"}, Location{0, 0}, + Location{4, kMaxObjectId}), VersionSpecificParameters(), }; std::unique_ptr task; @@ -230,7 +229,7 @@ class MoqtSessionPeer { ->delivery_timeout_alarm_.get(); } - static quic::QuicAlarm* GetSubscribeDoneAlarm( + static quic::QuicAlarm* GetPublishDoneAlarm( SubscribeRemoteTrack* subscription) { return subscription->subscribe_done_alarm_.get(); } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_simulator.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_simulator.cc new file mode 100644 index 0000000000..c3ba87be37 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_simulator.cc @@ -0,0 +1,386 @@ +// Copyright 2024 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "quiche/quic/moqt/test_tools/moqt_simulator.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/algorithm/container.h" +#include "absl/base/casts.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/str_format.h" +#include "absl/strings/str_join.h" +#include "absl/strings/str_replace.h" +#include "absl/strings/string_view.h" +#include "absl/time/time.h" +#include "quiche/quic/core/crypto/quic_random.h" +#include "quiche/quic/core/quic_bandwidth.h" +#include "quiche/quic/core/quic_clock.h" +#include "quiche/quic/core/quic_time.h" +#include "quiche/quic/core/quic_types.h" +#include "quiche/quic/moqt/moqt_bitrate_adjuster.h" +#include "quiche/quic/moqt/moqt_known_track_publisher.h" +#include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" +#include "quiche/quic/moqt/moqt_outgoing_queue.h" +#include "quiche/quic/moqt/moqt_session.h" +#include "quiche/quic/moqt/moqt_session_interface.h" +#include "quiche/quic/moqt/moqt_trace_recorder.h" +#include "quiche/quic/moqt/test_tools/moqt_simulator_harness.h" +#include "quiche/quic/test_tools/simulator/actor.h" +#include "quiche/quic/test_tools/simulator/link.h" +#include "quiche/quic/test_tools/simulator/port.h" +#include "quiche/quic/test_tools/simulator/simulator.h" +#include "quiche/quic/test_tools/simulator/switch.h" +#include "quiche/common/platform/api/quiche_logging.h" +#include "quiche/common/quiche_buffer_allocator.h" +#include "quiche/common/quiche_data_reader.h" +#include "quiche/common/quiche_data_writer.h" +#include "quiche/common/quiche_mem_slice.h" +#include "quiche/common/simple_buffer_allocator.h" + +namespace moqt::test { +namespace { + +using ::quiche::QuicheBuffer; +using ::quiche::QuicheMemSlice; + +using ::quic::QuicBandwidth; +using ::quic::QuicByteCount; +using ::quic::QuicTime; +using ::quic::QuicTimeDelta; + +using ::quic::simulator::Endpoint; +using ::quic::simulator::Simulator; + +// In the simulation, the server link is supposed to be the bottleneck, so this +// value just has to be sufficiently larger than the server link bandwidth. +constexpr QuicBandwidth kClientLinkBandwidth = + QuicBandwidth::FromBitsPerSecond(10.0e6); +constexpr MoqtVersion kMoqtVersion = kDefaultMoqtVersion; + +// Track name used by the simulator. +FullTrackName TrackName() { return FullTrackName("test", "track"); } + +std::string FormatPercentage(size_t n, size_t total) { + float percentage = 100.0f * n / total; + return absl::StrFormat("%d / %d (%.2f%%)", n, total, percentage); +} + +using OutputField = std::pair; + +OutputField OutputFraction(absl::string_view key, size_t n, size_t total) { + float fraction = static_cast(n) / total; + return OutputField(key, absl::StrCat(fraction)); +} + +float RandFloat(quic::QuicRandom& rng) { + uint32_t number; + rng.RandBytes(&number, sizeof(number)); + return absl::bit_cast((number & 0x7fffff) | 0x3f800000) - 1.0f; +} + +} // namespace + +ModificationBox::ModificationBox(Endpoint* wrapped_endpoint, + const SimulationParameters& parameters) + : Endpoint(wrapped_endpoint->simulator(), + absl::StrCat(wrapped_endpoint->name(), " (modification box)")), + wrapped_endpoint_(*wrapped_endpoint), + parameters_(parameters) {} + +void ModificationBox::OnBeforeSimulationStart() { + if (!parameters_.blackhole_duration.IsZero()) { + float offset = 0.5f + RandFloat(*simulator()->GetRandomGenerator()) * 0.2f; + blackhole_start_time_ = + simulator()->GetClock()->Now() + offset * parameters_.duration; + } +} + +void ModificationBox::AcceptPacket( + std::unique_ptr packet) { + quic::QuicRandom* const rng = simulator()->GetRandomGenerator(); + const quic::QuicTime now = simulator()->GetClock()->Now(); + bool drop = false; + if (parameters_.packet_loss_rate > 0) { + if (RandFloat(*rng) < parameters_.packet_loss_rate) { + drop = true; + } + } + if (blackhole_start_time_.has_value()) { + quic::QuicTime blackhole_end_time = + *blackhole_start_time_ + parameters_.blackhole_duration; + if (now >= blackhole_start_time_ && now < blackhole_end_time) { + drop = true; + } + } + if (!drop) { + wrapped_endpoint_.GetRxPort()->AcceptPacket(std::move(packet)); + } +} + +ObjectGenerator::ObjectGenerator(quic::simulator::Simulator* simulator, + const std::string& actor_name, + MoqtSession* session, FullTrackName track_name, + int keyframe_interval, int fps, + float i_to_p_ratio, + quic::QuicBandwidth bitrate) + : Actor(simulator, actor_name), + queue_(std::make_shared( + track_name, MoqtForwardingPreference::kSubgroup, + simulator->GetClock())), + keyframe_interval_(keyframe_interval), + time_between_frames_(QuicTimeDelta::FromMicroseconds(1.0e6 / fps)), + i_to_p_ratio_(i_to_p_ratio), + bitrate_(bitrate), + bitrate_history_({bitrate}) {} + +void ObjectGenerator::Act() { + ++frame_number_; + bool i_frame = (frame_number_ % keyframe_interval_) == 0; + size_t size = GetFrameSize(i_frame); + + QuicheBuffer buffer(quiche::SimpleBufferAllocator::Get(), size); + memset(buffer.data(), 0, buffer.size()); + quiche::QuicheDataWriter writer(size, buffer.data()); + bool success = writer.WriteUInt64(clock_->Now().ToDebuggingValue()); + QUICHE_CHECK(success); + + queue_->AddObject(QuicheMemSlice(std::move(buffer)), i_frame); + Schedule(clock_->Now() + time_between_frames_); +} + +size_t ObjectGenerator::GetFrameSize(bool i_frame) const { + int p_frame_count = keyframe_interval_ - 1; + // Compute the frame sizes as a fraction of the total group size. + float i_frame_fraction = i_to_p_ratio_ / (i_to_p_ratio_ + p_frame_count); + float p_frame_fraction = 1.0 / (i_to_p_ratio_ + p_frame_count); + float frame_fraction = i_frame ? i_frame_fraction : p_frame_fraction; + + QuicTimeDelta group_duration = time_between_frames_ * keyframe_interval_; + QuicByteCount group_byte_count = group_duration * bitrate_; + size_t frame_size = std::ceil(frame_fraction * group_byte_count); + QUICHE_CHECK_GE(frame_size, 8u) << "Frame size is too small for a timestamp"; + return frame_size; +} + +void ObjectGenerator::ConsiderAdjustingBitrate(quic::QuicBandwidth bandwidth, + BitrateAdjustmentType type) { + if (moqt::ShouldIgnoreBitrateAdjustment(bandwidth, type, bitrate_, + /*min_change=*/0.01)) { + return; + } + bitrate_ = bandwidth; + bitrate_history_.push_back(bandwidth); +} + +std::string ObjectGenerator::FormatBitrateHistory() const { + std::vector bits; + bits.reserve(bitrate_history_.size()); + for (QuicBandwidth bandwidth : bitrate_history_) { + bits.push_back(absl::StrCat(bandwidth)); + } + return absl::StrJoin(bits, " -> "); +} + +void ObjectReceiver::OnReply( + const FullTrackName& full_track_name, + std::variant response) { + QUICHE_CHECK(full_track_name == TrackName()); + if (std::holds_alternative(response)) { + MoqtRequestError error = std::get(response); + QUICHE_CHECK(!error.reason_phrase.empty()) << error.reason_phrase; + } +} + +void ObjectReceiver::OnObjectFragment(const FullTrackName& full_track_name, + const PublishedObjectMetadata& metadata, + absl::string_view object, + bool end_of_message) { + QUICHE_DCHECK(full_track_name == TrackName()); + if (metadata.status != MoqtObjectStatus::kNormal) { + QUICHE_DCHECK(end_of_message); + return; + } + if (!end_of_message) { + QUICHE_LOG(DFATAL) << "Partial receiving of objects wasn't enabled"; + return; + } + OnFullObject(metadata.location, object); +} + +void ObjectReceiver::OnFullObject(Location sequence, + absl::string_view payload) { + QUICHE_CHECK_GE(payload.size(), 8u); + quiche::QuicheDataReader reader(payload); + uint64_t time_us; + reader.ReadUInt64(&time_us); + QuicTime time = QuicTime::Zero() + QuicTimeDelta::FromMicroseconds(time_us); + QuicTimeDelta delay = clock_->Now() - time; + QUICHE_CHECK_GT(delay, QuicTimeDelta::Zero()); + QUICHE_DCHECK(absl::c_all_of(reader.ReadRemainingPayload(), + [](char c) { return c == 0; })); + ++full_objects_received_; + if (delay > deadline_) { + ++full_objects_received_late_; + } else { + ++full_objects_received_on_time_; + total_bytes_received_on_time_ += payload.size(); + } + if (object_ack_function_) { + object_ack_function_(sequence.group, sequence.object, deadline_ - delay); + } +} + +// Computes the size of the network queue on the switch. +constexpr QuicByteCount AdjustedQueueSize( + const SimulationParameters& parameters) { + if (parameters.network_queue_size > 0) { + return parameters.network_queue_size; + } + QuicByteCount bdp = parameters.bandwidth * parameters.min_rtt; + return 2 * bdp; +} + +MoqtSimulator::MoqtSimulator(const SimulationParameters& parameters) + : simulator_(quic::QuicRandom::GetInstance()), + client_endpoint_(&simulator_, "Client", "Server", kMoqtVersion), + server_endpoint_(&simulator_, "Server", "Client", kMoqtVersion), + switch_(&simulator_, "Switch", 8, AdjustedQueueSize(parameters)), + modification_box_(switch_.port(1), parameters), + client_link_(&client_endpoint_, &modification_box_, kClientLinkBandwidth, + parameters.min_rtt * 0.25), + server_link_(&server_endpoint_, switch_.port(2), parameters.bandwidth, + parameters.min_rtt * 0.25), + generator_(&simulator_, "Client generator", client_endpoint_.session(), + TrackName(), parameters.keyframe_interval, parameters.fps, + parameters.i_to_p_ratio, parameters.bitrate), + receiver_(simulator_.GetClock(), parameters.deadline), + adjuster_(simulator_.GetClock(), client_endpoint_.session()->session(), + &generator_), + parameters_(parameters) { + if (parameters.aggregation_threshold > 0) { + QuicTimeDelta timeout = parameters.aggregation_timeout; + if (timeout.IsZero()) { + timeout = parameters.min_rtt * 0.25; + } + switch_.port_queue(2)->EnableAggregation(parameters.aggregation_threshold, + timeout); + } + client_endpoint_.RecordTrace(); + QUICHE_DCHECK(client_endpoint_.trace_visitor() != nullptr); + client_endpoint_.session()->trace_recorder().set_trace( + client_endpoint_.trace_visitor()->trace()); +} + +std::string MoqtSimulator::GetClientSessionCongestionControl() { + return quic::CongestionControlTypeToString(client_endpoint_.quic_session() + ->connection() + ->sent_packet_manager() + .GetSendAlgorithm() + ->GetCongestionControlType()); +} + +void MoqtSimulator::Run() { + // Perform the QUIC and the MoQT handshake. + client_session()->set_support_object_acks(true); + server_session()->set_support_object_acks(true); + RunHandshakeOrDie(simulator_, client_endpoint_, server_endpoint_); + + generator_.queue()->SetDeliveryOrder(parameters_.delivery_order); + client_session()->set_publisher(&publisher_); + if (parameters_.bitrate_adaptation) { + client_session()->SetMonitoringInterfaceForTrack(TrackName(), &adjuster_); + } + if (parameters_.alternative_timeout) { + client_session()->UseAlternateDeliveryTimeout(); + } + publisher_.Add(generator_.queue()); + modification_box_.OnBeforeSimulationStart(); + + // The simulation is started as follows. At t=0: + // (1) The server issues a subscribe request. + // (2) The client starts immediately generating data. At this point, the + // server does not yet have an active subscription, so the client has + // some catching up to do. + generator_.Start(); + VersionSpecificParameters subscription_parameters; + if (parameters_.bitrate_adaptation) { + subscription_parameters.oack_window_size = parameters_.deadline; + } + if (!parameters_.delivery_timeout.IsInfinite()) { + subscription_parameters.delivery_timeout = parameters_.delivery_timeout; + } + server_session()->RelativeJoiningFetch(TrackName(), &receiver_, 0, + subscription_parameters); + simulator_.RunFor(parameters_.duration); + + // At the end, we wait for eight RTTs until the connection settles down. + generator_.Stop(); + wait_at_the_end_ = + 8 * client_endpoint_.quic_session()->GetSessionStats().smoothed_rtt; + simulator_.RunFor(QuicTimeDelta(wait_at_the_end_)); +} + +void MoqtSimulator::HumanReadableOutput() { + const QuicTimeDelta total_time = + parameters_.duration + QuicTimeDelta(wait_at_the_end_); + absl::PrintF("Ran simulation for %v + %.1fms\n", parameters_.duration, + absl::ToDoubleMilliseconds(wait_at_the_end_)); + absl::PrintF("Congestion control used: %s\n", + GetClientSessionCongestionControl()); + + size_t total_sent = generator_.total_objects_sent(); + size_t missing_objects = + generator_.total_objects_sent() - receiver_.full_objects_received(); + absl::PrintF("Objects received: %s\n", + FormatPercentage(receiver_.full_objects_received(), total_sent)); + absl::PrintF( + " on time: %s\n", + FormatPercentage(receiver_.full_objects_received_on_time(), total_sent)); + absl::PrintF( + " late: %s\n", + FormatPercentage(receiver_.full_objects_received_late(), total_sent)); + absl::PrintF(" never: %s\n", + FormatPercentage(missing_objects, total_sent)); + absl::PrintF("\n"); + absl::PrintF("Average on-time goodput: %v\n", + QuicBandwidth::FromBytesAndTimeDelta( + receiver_.total_bytes_received_on_time(), total_time)); + absl::PrintF("Bitrates: %s\n", generator_.FormatBitrateHistory()); +} + +void MoqtSimulator::CustomOutput(absl::string_view format) { + size_t total_sent = generator_.total_objects_sent(); + std::vector fields; + fields.push_back(OutputFraction("{on_time_fraction}", + receiver_.full_objects_received_on_time(), + total_sent)); + fields.push_back(OutputFraction( + "{late_fraction}", receiver_.full_objects_received_late(), total_sent)); + size_t missing_objects = + generator_.total_objects_sent() - receiver_.full_objects_received(); + fields.push_back( + OutputFraction("{missing_fraction}", missing_objects, total_sent)); + std::string output = absl::StrReplaceAll(format, fields); + std::cout << output << std::endl; +} + +float MoqtSimulator::received_on_time_fraction() const { + QUICHE_DCHECK_GE(generator_.total_objects_sent(), 0); + return static_cast(receiver_.full_objects_received_on_time()) / + generator_.total_objects_sent(); +} + +} // namespace moqt::test diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_simulator.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_simulator.h new file mode 100644 index 0000000000..a9452da077 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_simulator.h @@ -0,0 +1,241 @@ +// Copyright 2024 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_MOQT_TEST_TOOLS_MOQT_SIMULATOR_H_ +#define QUICHE_QUIC_MOQT_TEST_TOOLS_MOQT_SIMULATOR_H_ + +#include +#include +#include +#include +#include +#include +#include + +#include "absl/container/flat_hash_map.h" +#include "absl/strings/string_view.h" +#include "absl/time/time.h" +#include "quiche/quic/core/quic_bandwidth.h" +#include "quiche/quic/core/quic_time.h" +#include "quiche/quic/core/quic_types.h" +#include "quiche/quic/moqt/moqt_bitrate_adjuster.h" +#include "quiche/quic/moqt/moqt_known_track_publisher.h" +#include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" +#include "quiche/quic/moqt/moqt_outgoing_queue.h" +#include "quiche/quic/moqt/moqt_priority.h" +#include "quiche/quic/moqt/moqt_session.h" +#include "quiche/quic/moqt/moqt_session_interface.h" +#include "quiche/quic/moqt/test_tools/moqt_simulator_harness.h" +#include "quiche/quic/test_tools/simulator/actor.h" +#include "quiche/quic/test_tools/simulator/link.h" +#include "quiche/quic/test_tools/simulator/port.h" +#include "quiche/quic/test_tools/simulator/switch.h" + +namespace moqt::test { + +// Parameters describing the scenario being simulated. +struct SimulationParameters { + // Bottleneck bandwidth of the simulated scenario. + quic::QuicBandwidth bandwidth = quic::QuicBandwidth::FromBitsPerSecond(2.0e6); + // Intended RTT (as computed from propagation delay alone) between the client + // and the server. + quic::QuicTimeDelta min_rtt = quic::QuicTimeDelta::FromMilliseconds(20); + // The size of the network queue; if zero, assumed to be twice the BDP. + quic::QuicByteCount network_queue_size = 0; + // Duration for which the simulation is run. + quic::QuicTimeDelta duration = quic::QuicTimeDelta::FromSeconds(60); + // Packet aggregation timeout. If zero, this will be set to the quarter of + // min RTT. + quic::QuicTimeDelta aggregation_timeout = quic::QuicTimeDelta::Zero(); + // Packet aggregation threshold. If zero, packet aggregation is disabled. + quic::QuicByteCount aggregation_threshold = 0; + + // Count frames as useful only if they were received `deadline` after which + // they were generated. + quic::QuicTimeDelta deadline = quic::QuicTimeDelta::FromSeconds(2); + // Delivery order used by the publisher. + MoqtDeliveryOrder delivery_order = MoqtDeliveryOrder::kDescending; + // Delivery timeout for the subscription. This is mechanically independent + // from `deadline`, which is an accounting-only parameter (in practice, those + // should probably be close). + quic::QuicTimeDelta delivery_timeout = quic::QuicTimeDelta::Infinite(); + // Whether MoqtBitrateAdjuster is enabled. + bool bitrate_adaptation = true; + // Use alternative delivery timeout design. + bool alternative_timeout = false; + + // Number of frames in an individual group. + int keyframe_interval = 30 * 2; + // Number of frames generated per second. + int fps = 30; + // The ratio by which an I-frame is bigger than a P-frame. + float i_to_p_ratio = 2 / 1; + // The target bitrate of the data being exchanged. + quic::QuicBandwidth bitrate = quic::QuicBandwidth::FromBitsPerSecond(1.0e6); + + // Adds random packet loss rate, as a fraction. + float packet_loss_rate = 0.0f; + + // If non-zero, makes the traffic disappear in the middle of the connection + // for the specified duration. + quic::QuicTimeDelta blackhole_duration = quic::QuicTimeDelta::Zero(); +}; + +// Box that enacts MoQT simulator specific modifications to the traffic. +class ModificationBox : public quic::simulator::Endpoint, + public quic::simulator::UnconstrainedPortInterface { + public: + ModificationBox(Endpoint* wrapped_endpoint, + const SimulationParameters& parameters); + + void OnBeforeSimulationStart(); + + // Endpoint implementation. + void Act() override {} + quic::simulator::UnconstrainedPortInterface* GetRxPort() override { + return this; + } + void SetTxPort(quic::simulator::ConstrainedPortInterface* port) override { + return wrapped_endpoint_.SetTxPort(port); + } + + // UnconstrainedPortInterface implementation. + void AcceptPacket(std::unique_ptr packet) override; + + private: + Endpoint& wrapped_endpoint_; + SimulationParameters parameters_; + std::optional blackhole_start_time_; +}; + +// Generates test objects at a constant rate. The first eight bytes of every +// object generated is a timestamp, the rest is all zeroes. The first object in +// the group can be made bigger than the rest, to simulate the profile of real +// video bitstreams. +class ObjectGenerator : public quic::simulator::Actor, + public moqt::BitrateAdjustable { + public: + ObjectGenerator(quic::simulator::Simulator* simulator, + const std::string& actor_name, MoqtSession* session, + FullTrackName track_name, int keyframe_interval, int fps, + float i_to_p_ratio, quic::QuicBandwidth bitrate); + + void Act() override; + + void Start() { Schedule(clock_->Now()); } + void Stop() { Unschedule(); } + + std::shared_ptr queue() { return queue_; } + size_t total_objects_sent() const { return frame_number_ + 1; } + + size_t GetFrameSize(bool i_frame) const; + + quic::QuicBandwidth GetCurrentBitrate() const override { return bitrate_; } + bool CouldUseExtraBandwidth() override { return true; } + void ConsiderAdjustingBitrate(quic::QuicBandwidth bandwidth, + BitrateAdjustmentType type) override; + std::string FormatBitrateHistory() const; + + private: + std::shared_ptr queue_; + int keyframe_interval_; + quic::QuicTimeDelta time_between_frames_; + float i_to_p_ratio_; + quic::QuicBandwidth bitrate_; + int frame_number_ = -1; + std::vector bitrate_history_; +}; + +class ObjectReceiver : public SubscribeVisitor { + public: + explicit ObjectReceiver(const quic::QuicClock* clock, + quic::QuicTimeDelta deadline) + : clock_(clock), deadline_(deadline) {} + + void OnReply( + const FullTrackName& full_track_name, + std::variant response) override; + + void OnCanAckObjects(MoqtObjectAckFunction ack_function) override { + object_ack_function_ = std::move(ack_function); + } + + void OnObjectFragment(const FullTrackName& full_track_name, + const PublishedObjectMetadata& metadata, + absl::string_view object, bool end_of_message) override; + + void OnPublishDone(FullTrackName /*full_track_name*/) override {} + void OnMalformedTrack(const FullTrackName& /*full_track_name*/) override {} + void OnStreamFin(const FullTrackName&, DataStreamIndex) override {} + void OnStreamReset(const FullTrackName&, DataStreamIndex) override {} + + void OnFullObject(Location sequence, absl::string_view payload); + + size_t full_objects_received() const { return full_objects_received_; } + size_t full_objects_received_on_time() const { + return full_objects_received_on_time_; + } + size_t full_objects_received_late() const { + return full_objects_received_late_; + } + size_t total_bytes_received_on_time() const { + return total_bytes_received_on_time_; + } + + private: + const quic::QuicClock* clock_ = nullptr; + // TODO: figure out when partial objects should be discarded. + absl::flat_hash_map partial_objects_; + MoqtObjectAckFunction object_ack_function_ = nullptr; + + size_t full_objects_received_ = 0; + + quic::QuicTimeDelta deadline_; + size_t full_objects_received_on_time_ = 0; + size_t full_objects_received_late_ = 0; + size_t total_bytes_received_on_time_ = 0; +}; + +// Simulates the performance of MoQT transfer under the specified network +// conditions. +class MoqtSimulator { + public: + explicit MoqtSimulator(const SimulationParameters& parameters); + + MoqtSession* client_session() { return client_endpoint_.session(); } + MoqtSession* server_session() { return server_endpoint_.session(); } + + std::string GetClientSessionCongestionControl(); + + // Runs the simulation and outputs the results to stdout. + void Run(); + + // The fraction of objects received on time. + float received_on_time_fraction() const; + + // Outputs the results of the simulation to stdout. + void HumanReadableOutput(); + void CustomOutput(absl::string_view format); + + private: + quic::simulator::Simulator simulator_; + MoqtClientEndpoint client_endpoint_; + MoqtServerEndpoint server_endpoint_; + quic::simulator::Switch switch_; + ModificationBox modification_box_; + quic::simulator::SymmetricLink client_link_; + quic::simulator::SymmetricLink server_link_; + MoqtKnownTrackPublisher publisher_; + ObjectGenerator generator_; + ObjectReceiver receiver_; + MoqtBitrateAdjuster adjuster_; + SimulationParameters parameters_; + + absl::Duration wait_at_the_end_; +}; + +} // namespace moqt::test + +#endif // QUICHE_QUIC_MOQT_TEST_TOOLS_MOQT_SIMULATOR_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc index d954f18d8f..b124720e31 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc @@ -30,7 +30,7 @@ namespace moqt::test { namespace { MoqtSessionParameters CreateParameters(quic::Perspective perspective, MoqtVersion version) { - MoqtSessionParameters parameters(perspective, ""); + MoqtSessionParameters parameters(perspective, "", ""); parameters.version = version; parameters.deliver_partial_objects = false; return parameters; @@ -39,8 +39,8 @@ MoqtSessionParameters CreateParameters(quic::Perspective perspective, MoqtSessionCallbacks CreateCallbacks(quic::simulator::Simulator* simulator) { return MoqtSessionCallbacks( +[] {}, +[](absl::string_view) {}, +[](absl::string_view) {}, +[] {}, - DefaultIncomingAnnounceCallback, - DefaultIncomingSubscribeAnnouncesCallback, simulator->GetClock()); + DefaultIncomingPublishNamespaceCallback, + DefaultIncomingSubscribeNamespaceCallback, simulator->GetClock()); } } // namespace diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_test_message.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_test_message.h index b558c38d4e..2af6e2b953 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_test_message.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/test_tools/moqt_test_message.h @@ -32,23 +32,35 @@ namespace moqt::test { inline constexpr absl::string_view kDefaultExtensionBlob( "\x00\x0c\x01\x03\x66\x6f\x6f", 7); -const MoqtDatagramType kMoqtDatagramTypes[] = { - MoqtDatagramType(false, false), - MoqtDatagramType(false, true), - MoqtDatagramType(true, false), - MoqtDatagramType(true, true), -}; +inline std::vector AllMoqtDatagramTypes() { + std::vector types; + for (bool payload : {false, true}) { + for (bool extension : {false, true}) { + for (bool end_of_group : {false, true}) { + for (bool zero_object_id : {false, true}) { + types.push_back(MoqtDatagramType(payload, extension, end_of_group, + zero_object_id)); + } + } + } + } + return types; +} -const MoqtDataStreamType kMoqtDataStreamTypes[] = { - MoqtDataStreamType::Fetch(), - MoqtDataStreamType::Subgroup(0, 1, true), - MoqtDataStreamType::Subgroup(0, 1, false), - MoqtDataStreamType::Subgroup(1, 1, true), - MoqtDataStreamType::Subgroup(1, 1, false), - MoqtDataStreamType::Subgroup(2, 1, true), - MoqtDataStreamType::Subgroup(2, 1, false), - // Padding omitted. -}; +inline std::vector AllMoqtDataStreamTypes() { + std::vector types; + types.push_back(MoqtDataStreamType::Fetch()); + uint64_t first_object_id = 1; + for (uint64_t subgroup_id : {0, 1, 2}) { + for (bool no_extension_headers : {true, false}) { + for (bool end_of_group : {false, true}) { + types.push_back(MoqtDataStreamType::Subgroup( + subgroup_id, first_object_id, no_extension_headers, end_of_group)); + } + } + } + return types; +} // Base class containing a wire image and the corresponding structured // representation of an example of each message. It allows parser and framer @@ -60,11 +72,12 @@ class QUICHE_NO_EXPORT TestMessageBase { using MessageStructuredData = std::variant; @@ -104,11 +117,15 @@ class QUICHE_NO_EXPORT TestMessageBase { set_wire_image_size(wire_image_size_ + 1); } + // Objects might need a different status if at the end of the stream. + virtual void MakeObjectEndOfStream() {} + protected: void SetWireImage(uint8_t* wire_image, size_t wire_image_size) { memcpy(wire_image_, wire_image, wire_image_size); wire_image_size_ = wire_image_size; } + void SetByte(size_t offset, char value) { wire_image_[offset] = value; } // Expands all the varints in the message, alternating between making them 2, // 4, and 8 bytes long. Updates length fields accordingly. @@ -236,24 +253,28 @@ class QUICHE_NO_EXPORT ObjectDatagramMessage : public ObjectMessage { public: ObjectDatagramMessage(MoqtDatagramType datagram_type) : ObjectMessage(), datagram_type_(datagram_type) { - object_.subgroup_id = object_.object_id; // Update ObjectMessage::object_ to match the datagram type. if (datagram_type.has_status()) { - object_.object_status = MoqtObjectStatus::kEndOfGroup; + object_.object_status = MoqtObjectStatus::kObjectDoesNotExist; object_.payload_length = 0; } else { - object_.object_status = MoqtObjectStatus::kNormal; + object_.object_status = datagram_type.end_of_group() + ? MoqtObjectStatus::kEndOfGroup + : MoqtObjectStatus::kNormal; object_.payload_length = 3; } - if (datagram_type.has_extension()) { - object_.extension_headers = std::string(kDefaultExtensionBlob); - } else { - object_.extension_headers = ""; - } + object_.extension_headers = + datagram_type.has_extension() ? std::string(kDefaultExtensionBlob) : ""; + object_.object_id = datagram_type.has_object_id() ? 6 : 0; + object_.subgroup_id = object_.object_id; quic::QuicDataWriter writer(sizeof(raw_packet_), reinterpret_cast(raw_packet_)); EXPECT_TRUE(writer.WriteVarInt62(datagram_type.value())); - EXPECT_TRUE(writer.WriteStringPiece(kRawVarints)); + EXPECT_TRUE(writer.WriteStringPiece(kRawAliasGroup)); + if (datagram_type.has_object_id()) { + EXPECT_TRUE(writer.WriteStringPiece(kRawObject)); + } + EXPECT_TRUE(writer.WriteStringPiece(kRawPriority)); if (datagram_type.has_extension()) { EXPECT_TRUE(writer.WriteStringPiece(kRawExtensions)); } @@ -268,25 +289,26 @@ class QUICHE_NO_EXPORT ObjectDatagramMessage : public ObjectMessage { } void ExpandVarints() override { - if (datagram_type_.has_extension()) { - if (datagram_type_.has_status()) { - ExpandVarintsImpl("vvvv-v-------v", false); - } else { - ExpandVarintsImpl("vvvv-v----------", false); - } - } else { - if (datagram_type_.has_status()) { - ExpandVarintsImpl("vvvv-v", false); - } else { - ExpandVarintsImpl("vvvv----", false); - } + std::string varints = "vvv"; + if (datagram_type_.has_object_id()) { + varints += "v"; } + varints += "-"; // priority + if (datagram_type_.has_extension()) { + varints += "v-------"; + } + if (datagram_type_.has_status()) { + varints += "v"; + } + ExpandVarintsImpl(varints, false); } private: uint8_t raw_packet_[17]; MoqtDatagramType datagram_type_; - static constexpr absl::string_view kRawVarints = "\x04\x05\x06\x07"; + static constexpr absl::string_view kRawAliasGroup = "\x04\x05"; + static constexpr absl::string_view kRawObject = "\x06"; + static constexpr absl::string_view kRawPriority = "\x07"; static constexpr absl::string_view kRawExtensions{ "\x07\x00\x0c\x01\x03\x66\x6f\x6f", 8}; // see kDefaultExtensionBlob static constexpr absl::string_view kRawPayload = "foo"; @@ -355,6 +377,12 @@ class QUICHE_NO_EXPORT StreamHeaderSubgroupMessage : public ObjectMessage { return true; } + void MakeObjectEndOfStream() override { + if (type_.EndOfGroupInStream()) { + object_.object_status = MoqtObjectStatus::kEndOfGroup; + } + } + private: MoqtDataStreamType type_; static constexpr absl::string_view kRawBeginning = "\x04\x05"; @@ -381,7 +409,7 @@ class QUICHE_NO_EXPORT StreamMiddlerSubgroupMessage : public ObjectMessage { } object_.object_id = 9; quic::QuicDataWriter writer(sizeof(raw_packet_), raw_packet_); - EXPECT_TRUE(writer.WriteVarInt62(object_.object_id)); + EXPECT_TRUE(writer.WriteVarInt62(2)); // Object ID delta - 1 if (type.AreExtensionHeadersPresent()) { EXPECT_TRUE( writer.WriteBytes(kRawExtensions.data(), kRawExtensions.length())); @@ -467,11 +495,14 @@ class QUICHE_NO_EXPORT ClientSetupMessage : public TestMessageBase { explicit ClientSetupMessage(bool webtrans) : TestMessageBase() { client_setup_.parameters.using_webtrans = webtrans; if (webtrans) { - // Should not send PATH. + // Should not send PATH or AUTHORITY. client_setup_.parameters.path = ""; - raw_packet_[2] = 0x06; // adjust payload length (-5) - raw_packet_[6] = 0x01; // only one parameter - SetWireImage(raw_packet_, sizeof(raw_packet_) - 5); + client_setup_.parameters.authority = ""; + raw_packet_[2] = 0x23; // adjust payload length (-17) + raw_packet_[6] = 0x02; // only two parameters + // Move MoqtImplementation up in the packet. + memmove(raw_packet_ + 9, raw_packet_ + 26, 29); + SetWireImage(raw_packet_, sizeof(raw_packet_) - 17); } else { SetWireImage(raw_packet_, sizeof(raw_packet_)); } @@ -500,9 +531,9 @@ class QUICHE_NO_EXPORT ClientSetupMessage : public TestMessageBase { void ExpandVarints() override { if (!client_setup_.parameters.path.empty()) { - ExpandVarintsImpl("vvvvvvvv---"); + ExpandVarintsImpl("vvvvvvvv----vv---------vv---------------------------"); } else { - ExpandVarintsImpl("vvvvvv"); + ExpandVarintsImpl("vvvvvvvv---------------------------"); } } @@ -511,17 +542,27 @@ class QUICHE_NO_EXPORT ClientSetupMessage : public TestMessageBase { } private: - uint8_t raw_packet_[14] = { - 0x20, 0x00, 0x0b, // type - 0x02, 0x01, 0x02, // versions - 0x02, // 2 parameters - 0x02, 0x32, // max_request_id = 50 - 0x01, 0x03, 0x66, 0x6f, 0x6f, // path = "foo" - }; + // The framer serializes all the integer parameters in order, then all the + // string parameters in order. Unfortunately, this means that + // kMoqtImplementation goes last even though it is always present, while + // kPath and KAuthority aren't. + uint8_t raw_packet_[55] = { + 0x20, 0x00, 0x34, // type, length + 0x02, 0x01, 0x02, // versions + 0x04, // 4 parameters + 0x02, 0x32, // max_request_id = 50 + 0x01, 0x04, 0x70, 0x61, 0x74, 0x68, // path = "path" + 0x05, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x79, // authority = "authority" + // moqt_implementation: + 0x07, 0x1b, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x51, 0x55, 0x49, + 0x43, 0x48, 0x45, 0x20, 0x4d, 0x4f, 0x51, 0x54, 0x20, 0x64, 0x72, 0x61, + 0x66, 0x74, 0x20, 0x31, 0x34}; MoqtClientSetup client_setup_ = { /*supported_versions=*/std::vector( {static_cast(1), static_cast(2)}), - MoqtSessionParameters(quic::Perspective::IS_CLIENT, "foo", 50), + MoqtSessionParameters(quic::Perspective::IS_CLIENT, "path", "authority", + 50), }; }; @@ -548,11 +589,17 @@ class QUICHE_NO_EXPORT ServerSetupMessage : public TestMessageBase { } private: - uint8_t raw_packet_[7] = { - 0x21, 0x00, 0x04, // type - 0x01, 0x01, // version, one parameter - 0x02, 0x32, // max_subscribe_id = 50 - }; + uint8_t raw_packet_[36] = {0x21, 0x00, + 0x21, // type + 0x01, + 0x02, // version, two parameters + 0x02, + 0x32, // max_subscribe_id = 50 + // moqt_implementation: + 0x07, 0x1b, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x20, 0x51, 0x55, 0x49, 0x43, 0x48, 0x45, 0x20, + 0x4d, 0x4f, 0x51, 0x54, 0x20, 0x64, 0x72, 0x61, + 0x66, 0x74, 0x20, 0x31, 0x34}; MoqtServerSetup server_setup_ = { /*selected_version=*/static_cast(1), MoqtSessionParameters(quic::Perspective::IS_SERVER, 50), @@ -614,6 +661,20 @@ class QUICHE_NO_EXPORT SubscribeMessage : public TestMessageBase { return TestMessageBase::MessageStructuredData(subscribe_); } + protected: + MoqtSubscribe subscribe_ = { + /*request_id=*/1, + FullTrackName("foo", "abcd"), + /*subscriber_priority=*/0x20, + /*group_order=*/MoqtDeliveryOrder::kDescending, + /*forward=*/true, + /*filter_type=*/MoqtFilterType::kAbsoluteStart, + /*start=*/Location(4, 1), + /*end_group=*/std::nullopt, + VersionSpecificParameters(quic::QuicTimeDelta::FromMilliseconds(10000), + AuthTokenType::kOutOfBand, "bar"), + }; + private: uint8_t raw_packet_[31] = { 0x03, @@ -649,19 +710,6 @@ class QUICHE_NO_EXPORT SubscribeMessage : public TestMessageBase { 0x61, 0x72, // authorization_tag = "bar" }; - - MoqtSubscribe subscribe_ = { - /*request_id=*/1, - FullTrackName("foo", "abcd"), - /*subscriber_priority=*/0x20, - /*group_order=*/MoqtDeliveryOrder::kDescending, - /*forward=*/true, - /*filter_type=*/MoqtFilterType::kAbsoluteStart, - /*start=*/Location(4, 1), - /*end_group=*/std::nullopt, - VersionSpecificParameters(quic::QuicTimeDelta::FromMilliseconds(10000), - AuthTokenType::kOutOfBand, "bar"), - }; }; class QUICHE_NO_EXPORT SubscribeOkMessage : public TestMessageBase { @@ -715,16 +763,8 @@ class QUICHE_NO_EXPORT SubscribeOkMessage : public TestMessageBase { SetWireImage(raw_packet_, sizeof(raw_packet_)); } - private: - uint8_t raw_packet_[17] = { - 0x04, 0x00, 0x0e, 0x01, 0x02, 0x03, // request_id, alias, expires - 0x02, 0x01, // group_order = 2, content exists - 0x0c, 0x14, // largest_location = (12, 20) - 0x02, // 2 parameters - 0x02, 0x67, 0x10, // delivery_timeout = 10000 - 0x04, 0x67, 0x10, // max_cache_duration = 10000 - }; - + protected: + // This is protected so that TrackStatusOk can edit the fields. MoqtSubscribeOk subscribe_ok_ = { /*request_id=*/1, /*track_alias=*/2, @@ -734,6 +774,16 @@ class QUICHE_NO_EXPORT SubscribeOkMessage : public TestMessageBase { VersionSpecificParameters(quic::QuicTimeDelta::FromMilliseconds(10000), quic::QuicTimeDelta::FromMilliseconds(10000)), }; + + private: + uint8_t raw_packet_[17] = { + 0x04, 0x00, 0x0e, 0x01, 0x02, 0x03, // request_id, alias, expires + 0x02, 0x01, // group_order = 2, content exists + 0x0c, 0x14, // largest_location = (12, 20) + 0x02, // 2 parameters + 0x02, 0x67, 0x10, // delivery_timeout = 10000 + 0x04, 0x67, 0x10, // max_cache_duration = 10000 + }; }; class QUICHE_NO_EXPORT SubscribeErrorMessage : public TestMessageBase { @@ -765,6 +815,13 @@ class QUICHE_NO_EXPORT SubscribeErrorMessage : public TestMessageBase { return TestMessageBase::MessageStructuredData(subscribe_error_); } + protected: + MoqtSubscribeError subscribe_error_ = { + /*request_id=*/2, + /*error_code=*/RequestErrorCode::kInvalidRange, + /*reason_phrase=*/"bar", + }; + private: uint8_t raw_packet_[9] = { 0x05, 0x00, 0x06, @@ -772,12 +829,6 @@ class QUICHE_NO_EXPORT SubscribeErrorMessage : public TestMessageBase { 0x05, // error_code = 5 0x03, 0x62, 0x61, 0x72, // reason_phrase = "bar" }; - - MoqtSubscribeError subscribe_error_ = { - /*request_id=*/2, - /*error_code=*/RequestErrorCode::kInvalidRange, - /*reason_phrase=*/"bar", - }; }; class QUICHE_NO_EXPORT UnsubscribeMessage : public TestMessageBase { @@ -811,14 +862,14 @@ class QUICHE_NO_EXPORT UnsubscribeMessage : public TestMessageBase { }; }; -class QUICHE_NO_EXPORT SubscribeDoneMessage : public TestMessageBase { +class QUICHE_NO_EXPORT PublishDoneMessage : public TestMessageBase { public: - SubscribeDoneMessage() : TestMessageBase() { + PublishDoneMessage() : TestMessageBase() { SetWireImage(raw_packet_, sizeof(raw_packet_)); } bool EqualFieldValues(MessageStructuredData& values) const override { - auto cast = std::get(values); + auto cast = std::get(values); if (cast.request_id != subscribe_done_.request_id) { QUIC_LOG(INFO) << "SUBSCRIBE_DONE request ID mismatch"; return false; @@ -852,9 +903,9 @@ class QUICHE_NO_EXPORT SubscribeDoneMessage : public TestMessageBase { 0x02, 0x68, 0x69, // error_reason = "hi" }; - MoqtSubscribeDone subscribe_done_ = { + MoqtPublishDone subscribe_done_ = { /*request_id=*/2, - /*error_code=*/SubscribeDoneCode::kTrackEnded, + /*error_code=*/PublishDoneCode::kTrackEnded, /*stream_count=*/5, /*error_reason=*/"hi", }; @@ -920,24 +971,24 @@ class QUICHE_NO_EXPORT SubscribeUpdateMessage : public TestMessageBase { }; }; -class QUICHE_NO_EXPORT AnnounceMessage : public TestMessageBase { +class QUICHE_NO_EXPORT PublishNamespaceMessage : public TestMessageBase { public: - AnnounceMessage() : TestMessageBase() { + PublishNamespaceMessage() : TestMessageBase() { SetWireImage(raw_packet_, sizeof(raw_packet_)); } bool EqualFieldValues(MessageStructuredData& values) const override { - auto cast = std::get(values); - if (cast.request_id != announce_.request_id) { - QUIC_LOG(INFO) << "ANNOUNCE request ID mismatch"; + auto cast = std::get(values); + if (cast.request_id != publish_namespace_.request_id) { + QUIC_LOG(INFO) << "PUBLISH_NAMESPACE request ID mismatch"; return false; } - if (cast.track_namespace != announce_.track_namespace) { - QUIC_LOG(INFO) << "ANNOUNCE track namespace mismatch"; + if (cast.track_namespace != publish_namespace_.track_namespace) { + QUIC_LOG(INFO) << "PUBLISH_NAMESPACE track namespace mismatch"; return false; } - if (cast.parameters != announce_.parameters) { - QUIC_LOG(INFO) << "ANNOUNCE parameter mismatch"; + if (cast.parameters != publish_namespace_.parameters) { + QUIC_LOG(INFO) << "PUBLISH_NAMESPACE parameter mismatch"; return false; } return true; @@ -946,7 +997,7 @@ class QUICHE_NO_EXPORT AnnounceMessage : public TestMessageBase { void ExpandVarints() override { ExpandVarintsImpl("vvv---vvv-----"); } MessageStructuredData structured_data() const override { - return TestMessageBase::MessageStructuredData(announce_); + return TestMessageBase::MessageStructuredData(publish_namespace_); } private: @@ -957,23 +1008,23 @@ class QUICHE_NO_EXPORT AnnounceMessage : public TestMessageBase { 0x03, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72, // authorization_tag = "bar" }; - MoqtAnnounce announce_ = { + MoqtPublishNamespace publish_namespace_ = { /*request_id=*/2, TrackNamespace{"foo"}, VersionSpecificParameters(AuthTokenType::kOutOfBand, "bar"), }; }; -class QUICHE_NO_EXPORT AnnounceOkMessage : public TestMessageBase { +class QUICHE_NO_EXPORT PublishNamespaceOkMessage : public TestMessageBase { public: - AnnounceOkMessage() : TestMessageBase() { + PublishNamespaceOkMessage() : TestMessageBase() { SetWireImage(raw_packet_, sizeof(raw_packet_)); } bool EqualFieldValues(MessageStructuredData& values) const override { - auto cast = std::get(values); - if (cast.request_id != announce_ok_.request_id) { - QUIC_LOG(INFO) << "ANNOUNCE OK MESSAGE request ID mismatch"; + auto cast = std::get(values); + if (cast.request_id != publish_namespace_ok_.request_id) { + QUIC_LOG(INFO) << "PUBLISH_NAMESPACE OK MESSAGE request ID mismatch"; return false; } return true; @@ -982,7 +1033,7 @@ class QUICHE_NO_EXPORT AnnounceOkMessage : public TestMessageBase { void ExpandVarints() override { ExpandVarintsImpl("v"); } MessageStructuredData structured_data() const override { - return TestMessageBase::MessageStructuredData(announce_ok_); + return TestMessageBase::MessageStructuredData(publish_namespace_ok_); } private: @@ -990,29 +1041,29 @@ class QUICHE_NO_EXPORT AnnounceOkMessage : public TestMessageBase { 0x07, 0x00, 0x01, 0x01, // request_id = 1 }; - MoqtAnnounceOk announce_ok_ = { + MoqtPublishNamespaceOk publish_namespace_ok_ = { /*request_id=*/1, }; }; -class QUICHE_NO_EXPORT AnnounceErrorMessage : public TestMessageBase { +class QUICHE_NO_EXPORT PublishNamespaceErrorMessage : public TestMessageBase { public: - AnnounceErrorMessage() : TestMessageBase() { + PublishNamespaceErrorMessage() : TestMessageBase() { SetWireImage(raw_packet_, sizeof(raw_packet_)); } bool EqualFieldValues(MessageStructuredData& values) const override { - auto cast = std::get(values); - if (cast.request_id != announce_error_.request_id) { - QUIC_LOG(INFO) << "ANNOUNCE_ERROR request ID mismatch"; + auto cast = std::get(values); + if (cast.request_id != publish_namespace_error_.request_id) { + QUIC_LOG(INFO) << "PUBLISH_NAMESPACE_ERROR request ID mismatch"; return false; } - if (cast.error_code != announce_error_.error_code) { - QUIC_LOG(INFO) << "ANNOUNCE_ERROR error code mismatch"; + if (cast.error_code != publish_namespace_error_.error_code) { + QUIC_LOG(INFO) << "PUBLISH_NAMESPACE_ERROR error code mismatch"; return false; } - if (cast.error_reason != announce_error_.error_reason) { - QUIC_LOG(INFO) << "ANNOUNCE_ERROR error reason mismatch"; + if (cast.error_reason != publish_namespace_error_.error_reason) { + QUIC_LOG(INFO) << "PUBLISH_NAMESPACE_ERROR error reason mismatch"; return false; } return true; @@ -1021,7 +1072,7 @@ class QUICHE_NO_EXPORT AnnounceErrorMessage : public TestMessageBase { void ExpandVarints() override { ExpandVarintsImpl("vvv---"); } MessageStructuredData structured_data() const override { - return TestMessageBase::MessageStructuredData(announce_error_); + return TestMessageBase::MessageStructuredData(publish_namespace_error_); } private: @@ -1031,31 +1082,62 @@ class QUICHE_NO_EXPORT AnnounceErrorMessage : public TestMessageBase { 0x03, 0x62, 0x61, 0x72, // reason_phrase = "bar" }; - MoqtAnnounceError announce_error_ = { + MoqtPublishNamespaceError publish_namespace_error_ = { /*request_id=*/1, RequestErrorCode::kNotSupported, /*reason_phrase=*/"bar", }; }; -class QUICHE_NO_EXPORT AnnounceCancelMessage : public TestMessageBase { +class QUICHE_NO_EXPORT PublishNamespaceDoneMessage : public TestMessageBase { public: - AnnounceCancelMessage() : TestMessageBase() { + PublishNamespaceDoneMessage() : TestMessageBase() { SetWireImage(raw_packet_, sizeof(raw_packet_)); } bool EqualFieldValues(MessageStructuredData& values) const override { - auto cast = std::get(values); - if (cast.track_namespace != announce_cancel_.track_namespace) { - QUIC_LOG(INFO) << "ANNOUNCE CANCEL track namespace mismatch"; + auto cast = std::get(values); + if (cast.track_namespace != publish_namespace_done_.track_namespace) { + QUIC_LOG(INFO) << "PUBLISH_NAMESPACE_DONE track namespace mismatch"; return false; } - if (cast.error_code != announce_cancel_.error_code) { - QUIC_LOG(INFO) << "ANNOUNCE CANCEL error code mismatch"; + return true; + } + + void ExpandVarints() override { ExpandVarintsImpl("vv---"); } + + MessageStructuredData structured_data() const override { + return TestMessageBase::MessageStructuredData(publish_namespace_done_); + } + + private: + uint8_t raw_packet_[8] = { + 0x09, 0x00, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f, // track_namespace + }; + + MoqtPublishNamespaceDone publish_namespace_done_ = { + TrackNamespace("foo"), + }; +}; + +class QUICHE_NO_EXPORT PublishNamespaceCancelMessage : public TestMessageBase { + public: + PublishNamespaceCancelMessage() : TestMessageBase() { + SetWireImage(raw_packet_, sizeof(raw_packet_)); + } + + bool EqualFieldValues(MessageStructuredData& values) const override { + auto cast = std::get(values); + if (cast.track_namespace != publish_namespace_cancel_.track_namespace) { + QUIC_LOG(INFO) << "PUBLISH_NAMESPACE CANCEL track namespace mismatch"; return false; } - if (cast.error_reason != announce_cancel_.error_reason) { - QUIC_LOG(INFO) << "ANNOUNCE CANCEL reason phrase mismatch"; + if (cast.error_code != publish_namespace_cancel_.error_code) { + QUIC_LOG(INFO) << "PUBLISH_NAMESPACE CANCEL error code mismatch"; + return false; + } + if (cast.error_reason != publish_namespace_cancel_.error_reason) { + QUIC_LOG(INFO) << "PUBLISH_NAMESPACE CANCEL reason phrase mismatch"; return false; } return true; @@ -1064,7 +1146,7 @@ class QUICHE_NO_EXPORT AnnounceCancelMessage : public TestMessageBase { void ExpandVarints() override { ExpandVarintsImpl("vv---vv---"); } MessageStructuredData structured_data() const override { - return TestMessageBase::MessageStructuredData(announce_cancel_); + return TestMessageBase::MessageStructuredData(publish_namespace_cancel_); } private: @@ -1075,138 +1157,73 @@ class QUICHE_NO_EXPORT AnnounceCancelMessage : public TestMessageBase { 0x03, 0x62, 0x61, 0x72, // error_reason = "bar" }; - MoqtAnnounceCancel announce_cancel_ = { + MoqtPublishNamespaceCancel publish_namespace_cancel_ = { TrackNamespace("foo"), RequestErrorCode::kNotSupported, /*error_reason=*/"bar", }; }; -class QUICHE_NO_EXPORT TrackStatusRequestMessage : public TestMessageBase { +class QUICHE_NO_EXPORT TrackStatusMessage : public SubscribeMessage { public: - TrackStatusRequestMessage() : TestMessageBase() { - SetWireImage(raw_packet_, sizeof(raw_packet_)); + TrackStatusMessage() : SubscribeMessage() { + SetByte(0, static_cast(MoqtMessageType::kTrackStatus)); } bool EqualFieldValues(MessageStructuredData& values) const override { - auto cast = std::get(values); - if (cast.request_id != track_status_request_.request_id) { - QUIC_LOG(INFO) << "TRACK STATUS REQUEST request ID mismatch"; - return false; - } - if (cast.full_track_name != track_status_request_.full_track_name) { - QUIC_LOG(INFO) << "TRACK STATUS REQUEST track name mismatch"; - return false; - } - if (cast.parameters != track_status_request_.parameters) { - QUIC_LOG(INFO) << "TRACK STATUS REQUEST parameter mismatch"; - return false; - } - return true; + auto value = std::get(values); + auto* subscribe = reinterpret_cast(&value); + MessageStructuredData structured_data = + TestMessageBase::MessageStructuredData(*subscribe); + return SubscribeMessage::EqualFieldValues(structured_data); } - void ExpandVarints() override { ExpandVarintsImpl("vvv---v----vvv-----"); } - MessageStructuredData structured_data() const override { - return TestMessageBase::MessageStructuredData(track_status_request_); + return TestMessageBase::MessageStructuredData(MoqtTrackStatus(subscribe_)); } - - private: - uint8_t raw_packet_[22] = { - 0x0d, 0x00, 0x13, 0x02, // request_id = 2 - 0x01, 0x03, 0x66, 0x6f, 0x6f, // track_namespace = "foo" - 0x04, 0x61, 0x62, 0x63, 0x64, // track_name = "abcd" - 0x01, // 1 parameter - 0x03, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72, // authorization_tag = "bar" - }; - - MoqtTrackStatusRequest track_status_request_ = { - /*request_id=*/2, - FullTrackName("foo", "abcd"), - VersionSpecificParameters(AuthTokenType::kOutOfBand, "bar"), - }; }; -class QUICHE_NO_EXPORT UnannounceMessage : public TestMessageBase { +class QUICHE_NO_EXPORT TrackStatusOkMessage : public SubscribeOkMessage { public: - UnannounceMessage() : TestMessageBase() { - SetWireImage(raw_packet_, sizeof(raw_packet_)); + TrackStatusOkMessage() : SubscribeOkMessage() { + SetByte(0, static_cast(MoqtMessageType::kTrackStatusOk)); + // Track alias is zero. + SetByte(4, 0x00); + subscribe_ok_.track_alias = 0; } bool EqualFieldValues(MessageStructuredData& values) const override { - auto cast = std::get(values); - if (cast.track_namespace != unannounce_.track_namespace) { - QUIC_LOG(INFO) << "UNANNOUNCE track namespace mismatch"; - return false; - } - return true; + auto value = std::get(values); + auto* subscribe = reinterpret_cast(&value); + MessageStructuredData structured_data = + TestMessageBase::MessageStructuredData(*subscribe); + return SubscribeOkMessage::EqualFieldValues(structured_data); } - void ExpandVarints() override { ExpandVarintsImpl("vv---"); } - MessageStructuredData structured_data() const override { - return TestMessageBase::MessageStructuredData(unannounce_); + return TestMessageBase::MessageStructuredData( + MoqtTrackStatusOk(subscribe_ok_)); } - - private: - uint8_t raw_packet_[8] = { - 0x09, 0x00, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f, // track_namespace - }; - - MoqtUnannounce unannounce_ = { - TrackNamespace("foo"), - }; }; -class QUICHE_NO_EXPORT TrackStatusMessage : public TestMessageBase { +class QUICHE_NO_EXPORT TrackStatusErrorMessage : public SubscribeErrorMessage { public: - TrackStatusMessage() : TestMessageBase() { - SetWireImage(raw_packet_, sizeof(raw_packet_)); + TrackStatusErrorMessage() : SubscribeErrorMessage() { + SetByte(0, static_cast(MoqtMessageType::kTrackStatusError)); } bool EqualFieldValues(MessageStructuredData& values) const override { - auto cast = std::get(values); - if (cast.request_id != track_status_.request_id) { - QUIC_LOG(INFO) << "TRACK STATUS request ID mismatch"; - return false; - } - if (cast.status_code != track_status_.status_code) { - QUIC_LOG(INFO) << "TRACK STATUS code mismatch"; - return false; - } - if (cast.largest_location != track_status_.largest_location) { - QUIC_LOG(INFO) << "TRACK STATUS largest location mismatch"; - return false; - } - if (cast.parameters != track_status_.parameters) { - QUIC_LOG(INFO) << "TRACK STATUS parameters mismatch"; - return false; - } - return true; + auto value = std::get(values); + auto* subscribe = reinterpret_cast(&value); + MessageStructuredData structured_data = + TestMessageBase::MessageStructuredData(*subscribe); + return SubscribeErrorMessage::EqualFieldValues(structured_data); } - void ExpandVarints() override { ExpandVarintsImpl("v-vvvv--v--"); } - MessageStructuredData structured_data() const override { - return TestMessageBase::MessageStructuredData(track_status_); + return TestMessageBase::MessageStructuredData( + MoqtTrackStatusError(subscribe_error_)); } - - private: - uint8_t raw_packet_[14] = { - 0x0e, 0x00, 0x0b, 0x02, // request_id = 2 - 0x00, 0x0c, 0x14, // status, last_group, last_object - 0x02, // 2 parameters - 0x02, 0x67, 0x10, // Delivery Timeout = 10000 - 0x04, 0x67, 0x10, // Max Cache Duration = 10000 - }; - - MoqtTrackStatus track_status_ = { - /*request_id=*/2, - /*status_code=*/MoqtTrackStatusCode::kInProgress, - /*largest_location=*/Location(12, 20), - VersionSpecificParameters(quic::QuicTimeDelta::FromMilliseconds(10000), - quic::QuicTimeDelta::FromMilliseconds(10000)), - }; }; class QUICHE_NO_EXPORT GoAwayMessage : public TestMessageBase { @@ -1240,14 +1257,14 @@ class QUICHE_NO_EXPORT GoAwayMessage : public TestMessageBase { }; }; -class QUICHE_NO_EXPORT SubscribeAnnouncesMessage : public TestMessageBase { +class QUICHE_NO_EXPORT SubscribeNamespaceMessage : public TestMessageBase { public: - SubscribeAnnouncesMessage() : TestMessageBase() { + SubscribeNamespaceMessage() : TestMessageBase() { SetWireImage(raw_packet_, sizeof(raw_packet_)); } bool EqualFieldValues(MessageStructuredData& values) const override { - auto cast = std::get(values); + auto cast = std::get(values); if (cast.request_id != subscribe_namespace_.request_id) { QUIC_LOG(INFO) << "SUBSCRIBE_NAMESPACE request_id mismatch"; return false; @@ -1277,21 +1294,21 @@ class QUICHE_NO_EXPORT SubscribeAnnouncesMessage : public TestMessageBase { 0x03, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72, // authorization_tag = "bar" }; - MoqtSubscribeAnnounces subscribe_namespace_ = { + MoqtSubscribeNamespace subscribe_namespace_ = { /*request_id=*/1, TrackNamespace("foo"), VersionSpecificParameters(AuthTokenType::kOutOfBand, "bar"), }; }; -class QUICHE_NO_EXPORT SubscribeAnnouncesOkMessage : public TestMessageBase { +class QUICHE_NO_EXPORT SubscribeNamespaceOkMessage : public TestMessageBase { public: - SubscribeAnnouncesOkMessage() : TestMessageBase() { + SubscribeNamespaceOkMessage() : TestMessageBase() { SetWireImage(raw_packet_, sizeof(raw_packet_)); } bool EqualFieldValues(MessageStructuredData& values) const override { - auto cast = std::get(values); + auto cast = std::get(values); if (cast.request_id != subscribe_namespace_ok_.request_id) { QUIC_LOG(INFO) << "SUBSCRIBE_NAMESPACE_OK request_id mismatch"; return false; @@ -1310,19 +1327,19 @@ class QUICHE_NO_EXPORT SubscribeAnnouncesOkMessage : public TestMessageBase { 0x12, 0x00, 0x01, 0x01, // request_id = 1 }; - MoqtSubscribeAnnouncesOk subscribe_namespace_ok_ = { + MoqtSubscribeNamespaceOk subscribe_namespace_ok_ = { /*request_id=*/1, }; }; -class QUICHE_NO_EXPORT SubscribeAnnouncesErrorMessage : public TestMessageBase { +class QUICHE_NO_EXPORT SubscribeNamespaceErrorMessage : public TestMessageBase { public: - SubscribeAnnouncesErrorMessage() : TestMessageBase() { + SubscribeNamespaceErrorMessage() : TestMessageBase() { SetWireImage(raw_packet_, sizeof(raw_packet_)); } bool EqualFieldValues(MessageStructuredData& values) const override { - auto cast = std::get(values); + auto cast = std::get(values); if (cast.request_id != subscribe_namespace_error_.request_id) { QUIC_LOG(INFO) << "SUBSCRIBE_NAMESPACE_ERROR request_id mismatch"; return false; @@ -1351,21 +1368,21 @@ class QUICHE_NO_EXPORT SubscribeAnnouncesErrorMessage : public TestMessageBase { 0x03, 0x62, 0x61, 0x72, // error_reason = "bar" }; - MoqtSubscribeAnnouncesError subscribe_namespace_error_ = { + MoqtSubscribeNamespaceError subscribe_namespace_error_ = { /*request_id=*/1, /*error_code=*/RequestErrorCode::kUnauthorized, /*error_reason=*/"bar", }; }; -class QUICHE_NO_EXPORT UnsubscribeAnnouncesMessage : public TestMessageBase { +class QUICHE_NO_EXPORT UnsubscribeNamespaceMessage : public TestMessageBase { public: - UnsubscribeAnnouncesMessage() : TestMessageBase() { + UnsubscribeNamespaceMessage() : TestMessageBase() { SetWireImage(raw_packet_, sizeof(raw_packet_)); } bool EqualFieldValues(MessageStructuredData& values) const override { - auto cast = std::get(values); + auto cast = std::get(values); if (cast.track_namespace != unsubscribe_namespace_.track_namespace) { QUIC_LOG(INFO) << "UNSUBSCRIBE_NAMESPACE track namespace mismatch"; return false; @@ -1384,7 +1401,7 @@ class QUICHE_NO_EXPORT UnsubscribeAnnouncesMessage : public TestMessageBase { 0x14, 0x00, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f, // track_namespace }; - MoqtUnsubscribeAnnounces unsubscribe_namespace_ = { + MoqtUnsubscribeNamespace unsubscribe_namespace_ = { TrackNamespace("foo"), }; }; @@ -1465,8 +1482,9 @@ class QUICHE_NO_EXPORT FetchMessage : public TestMessageBase { // Avoid varint nonsense. QUICHE_CHECK(group < 64); QUICHE_CHECK(!object.has_value() || *object < 64); - std::get(fetch_.fetch).end_group = group; - std::get(fetch_.fetch).end_object = object; + std::get(fetch_.fetch).end_location.group = group; + std::get(fetch_.fetch).end_location.object = + object.has_value() ? *object : kMaxObjectId; raw_packet_[18] = group; raw_packet_[19] = object.has_value() ? (*object + 1) : 0; SetWireImage(raw_packet_, sizeof(raw_packet_)); @@ -1486,8 +1504,8 @@ class QUICHE_NO_EXPORT FetchMessage : public TestMessageBase { 0x01, // type = kStandalone 0x01, 0x03, 0x66, 0x6f, 0x6f, // track_namespace = "foo" 0x03, 0x62, 0x61, 0x72, // track_name = "bar" - 0x01, 0x02, // start_object = 1, 2 - 0x05, 0x07, // end_object = 5, 6 + 0x01, 0x02, // start_location = 1, 2 + 0x05, 0x07, // end_location = 5, 6 0x01, 0x03, 0x05, 0x03, 0x00, 0x62, 0x61, 0x7a, // parameters = "baz" }; @@ -1498,9 +1516,8 @@ class QUICHE_NO_EXPORT FetchMessage : public TestMessageBase { /*fetch =*/ StandaloneFetch{ FullTrackName("foo", "bar"), - /*start_object=*/Location{1, 2}, - /*end_group=*/5, - /*end_object=*/6, + /*start_location=*/Location{1, 2}, + /*end_location=*/Location{5, 6}, }, VersionSpecificParameters(AuthTokenType::kOutOfBand, "baz"), }; @@ -1558,7 +1575,7 @@ class QUICHE_NO_EXPORT RelativeJoiningFetchMessage : public TestMessageBase { 0x02, // priority = kHigh 0x01, // group_order = kAscending 0x02, // type = kRelativeJoining - 0x02, 0x02, // joining_subscribe_id = 2, 2 groups + 0x02, 0x02, // joining_request_id = 2, 2 groups 0x01, 0x03, 0x05, 0x03, 0x00, 0x62, 0x61, 0x7a, // parameters = "baz" }; @@ -1623,7 +1640,7 @@ class QUICHE_NO_EXPORT AbsoluteJoiningFetchMessage : public TestMessageBase { 0x02, // priority = kHigh 0x01, // group_order = kAscending 0x03, // type = kAbsoluteJoining - 0x02, 0x02, // joining_subscribe_id = 2, group_id = 2 + 0x02, 0x02, // joining_request_id = 2, group_id = 2 0x01, 0x03, 0x05, 0x03, 0x00, 0x62, 0x61, 0x7a, // parameters = "baz" }; @@ -1678,7 +1695,7 @@ class QUICHE_NO_EXPORT FetchOkMessage : public TestMessageBase { 0x01, // request_id = 1 0x01, // group_order = kAscending 0x00, // end_of_track = false - 0x05, 0x04, // end_location = 5, 4 + 0x05, 0x04, // end_location = 5, 3 0x01, 0x04, 0x67, 0x10, // MaxCacheDuration = 10000 }; @@ -1686,7 +1703,7 @@ class QUICHE_NO_EXPORT FetchOkMessage : public TestMessageBase { /*request_id =*/1, /*group_order=*/MoqtDeliveryOrder::kAscending, /*end_of_track=*/false, - /*end_location=*/Location{5, 4}, + /*end_location=*/Location{5, 3}, VersionSpecificParameters(quic::QuicTimeDelta::Infinite(), quic::QuicTimeDelta::FromMilliseconds(10000)), }; @@ -2042,34 +2059,36 @@ static inline std::unique_ptr CreateTestMessage( return std::make_unique(); case MoqtMessageType::kUnsubscribe: return std::make_unique(); - case MoqtMessageType::kSubscribeDone: - return std::make_unique(); + case MoqtMessageType::kPublishDone: + return std::make_unique(); case MoqtMessageType::kSubscribeUpdate: return std::make_unique(); - case MoqtMessageType::kAnnounce: - return std::make_unique(); - case MoqtMessageType::kAnnounceOk: - return std::make_unique(); - case MoqtMessageType::kAnnounceError: - return std::make_unique(); - case MoqtMessageType::kAnnounceCancel: - return std::make_unique(); - case MoqtMessageType::kTrackStatusRequest: - return std::make_unique(); - case MoqtMessageType::kUnannounce: - return std::make_unique(); + case MoqtMessageType::kPublishNamespace: + return std::make_unique(); + case MoqtMessageType::kPublishNamespaceOk: + return std::make_unique(); + case MoqtMessageType::kPublishNamespaceError: + return std::make_unique(); + case MoqtMessageType::kPublishNamespaceDone: + return std::make_unique(); + case MoqtMessageType::kPublishNamespaceCancel: + return std::make_unique(); case MoqtMessageType::kTrackStatus: return std::make_unique(); + case MoqtMessageType::kTrackStatusOk: + return std::make_unique(); + case MoqtMessageType::kTrackStatusError: + return std::make_unique(); case MoqtMessageType::kGoAway: return std::make_unique(); - case MoqtMessageType::kSubscribeAnnounces: - return std::make_unique(); - case MoqtMessageType::kSubscribeAnnouncesOk: - return std::make_unique(); - case MoqtMessageType::kSubscribeAnnouncesError: - return std::make_unique(); - case MoqtMessageType::kUnsubscribeAnnounces: - return std::make_unique(); + case MoqtMessageType::kSubscribeNamespace: + return std::make_unique(); + case MoqtMessageType::kSubscribeNamespaceOk: + return std::make_unique(); + case MoqtMessageType::kSubscribeNamespaceError: + return std::make_unique(); + case MoqtMessageType::kUnsubscribeNamespace: + return std::make_unique(); case MoqtMessageType::kMaxRequestId: return std::make_unique(); case MoqtMessageType::kFetch: diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_client.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_client.cc index 26525da204..9fe3ba9bf7 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_client.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_client.cc @@ -12,6 +12,7 @@ #include #include #include +#include #include "absl/container/flat_hash_map.h" #include "absl/functional/bind_front.h" @@ -23,10 +24,11 @@ #include "quiche/quic/core/quic_server_id.h" #include "quiche/quic/moqt/moqt_known_track_publisher.h" #include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_outgoing_queue.h" -#include "quiche/quic/moqt/moqt_priority.h" -#include "quiche/quic/moqt/moqt_publisher.h" #include "quiche/quic/moqt/moqt_session.h" +#include "quiche/quic/moqt/moqt_session_callbacks.h" +#include "quiche/quic/moqt/moqt_session_interface.h" #include "quiche/quic/moqt/tools/moq_chat.h" #include "quiche/quic/moqt/tools/moqt_client.h" #include "quiche/quic/platform/api/quic_default_proof_providers.h" @@ -39,37 +41,46 @@ namespace moqt::moq_chat { -std::optional ChatClient::OnIncomingAnnounce( +void ChatClient::OnIncomingPublishNamespace( const moqt::TrackNamespace& track_namespace, - std::optional parameters) { + std::optional parameters, + moqt::MoqtResponseCallback callback) { + if (!session_is_open_) { + return; + } if (track_namespace == GetUserNamespace(my_track_name_)) { - // Ignore ANNOUNCE for my own track. - return std::optional(); + // Ignore PUBLISH_NAMESPACE for my own track. + std::move(callback)(std::nullopt); + return; } std::optional track_name = ConstructTrackNameFromNamespace( track_namespace, GetChatId(my_track_name_)); if (!parameters.has_value()) { - std::cout << "UNANNOUNCE for " << track_namespace.ToString() << "\n"; + std::cout << "PUBLISH_NAMESPACE_DONE for " << track_namespace.ToString() + << "\n"; if (track_name.has_value() && other_users_.contains(*track_name)) { session_->Unsubscribe(*track_name); other_users_.erase(*track_name); } - return std::nullopt; + return; } - std::cout << "ANNOUNCE for " << track_namespace.ToString() << "\n"; + std::cout << "PUBLISH_NAMESPACE for " << track_namespace.ToString() << "\n"; if (!track_name.has_value()) { - std::cout << "ANNOUNCE rejected, invalid namespace\n"; - return std::make_optional( - RequestErrorCode::kTrackDoesNotExist, "Not a subscribed namespace"); + std::cout << "PUBLISH_NAMESPACE rejected, invalid namespace\n"; + std::move(callback)(std::make_optional( + RequestErrorCode::kTrackDoesNotExist, "Not a subscribed namespace")); + return; } if (other_users_.contains(*track_name)) { - std::cout << "Duplicate ANNOUNCE, send OK and ignore\n"; - return std::nullopt; + std::cout << "Duplicate PUBLISH_NAMESPACE, send OK and ignore\n"; + std::move(callback)(std::nullopt); + return; } if (GetUsername(my_track_name_) == GetUsername(*track_name)) { - std::cout << "ANNOUNCE for a previous instance of my track, " + std::cout << "PUBLISH_NAMESPACE for a previous instance of my track, " "do not subscribe\n"; - return std::nullopt; + std::move(callback)(std::nullopt); + return; } VersionSpecificParameters subscribe_parameters( AuthTokenType::kOutOfBand, std::string(GetUsername(my_track_name_))); @@ -78,7 +89,7 @@ std::optional ChatClient::OnIncomingAnnounce( ++subscribes_to_make_; other_users_.emplace(*track_name); } - return std::nullopt; // Send ANNOUNCE_OK. + std::move(callback)(std::nullopt); // Send PUBLISH_NAMESPACE_OK. } ChatClient::ChatClient(const quic::QuicServerId& server_id, @@ -88,8 +99,8 @@ ChatClient::ChatClient(const quic::QuicServerId& server_id, absl::string_view localhost, quic::QuicEventLoop* event_loop) : my_track_name_(ConstructTrackName(chat_id, username, localhost)), - event_loop_(event_loop), remote_track_visitor_(this), + event_loop_(event_loop), interface_(std::move(interface)) { if (event_loop_ == nullptr) { quic::QuicDefaultClock* clock = quic::QuicDefaultClock::Get(); @@ -128,8 +139,8 @@ ChatClient::ChatClient(const quic::QuicServerId& server_id, session_callbacks_.session_deleted_callback = [this]() { session_ = nullptr; }; - session_callbacks_.incoming_announce_callback = - absl::bind_front(&ChatClient::OnIncomingAnnounce, this); + session_callbacks_.incoming_publish_namespace_callback = + absl::bind_front(&ChatClient::OnIncomingPublishNamespace, this); interface_->Initialize( [this](absl::string_view input_message) { OnTerminalLineInput(input_message); @@ -150,9 +161,9 @@ void ChatClient::OnTerminalLineInput(absl::string_view input_message) { return; } if (input_message == "/exit") { - // Clean teardown of SUBSCRIBE_ANNOUNCES, ANNOUNCE, SUBSCRIBE. - session_->UnsubscribeAnnounces(GetChatNamespace(my_track_name_)); - session_->Unannounce(GetUserNamespace(my_track_name_)); + // Clean teardown of SUBSCRIBE_NAMESPACE, PUBLISH_NAMESPACE, SUBSCRIBE. + session_->UnsubscribeNamespace(GetChatNamespace(my_track_name_)); + session_->PublishNamespaceDone(GetUserNamespace(my_track_name_)); for (const auto& track_name : other_users_) { session_->Unsubscribe(track_name); } @@ -167,8 +178,7 @@ void ChatClient::OnTerminalLineInput(absl::string_view input_message) { void ChatClient::RemoteTrackVisitor::OnReply( const FullTrackName& full_track_name, - std::optional /*largest_id*/, - std::optional reason_phrase) { + std::variant response) { auto it = client_->other_users_.find(full_track_name); if (it == client_->other_users_.end()) { std::cout << "Error: received reply for unknown user " @@ -177,11 +187,13 @@ void ChatClient::RemoteTrackVisitor::OnReply( } --client_->subscribes_to_make_; std::cout << "Subscription to user " << GetUsername(*it) << " "; - if (reason_phrase.has_value()) { - std::cout << "REJECTED, reason = " << *reason_phrase << "\n"; - client_->other_users_.erase(it); - } else { + if (std::holds_alternative(response)) { std::cout << "ACCEPTED\n"; + } else { + auto request_error = std::get(response); + std::cout << "REJECTED, reason = " + << std::get(response).reason_phrase << "\n"; + client_->other_users_.erase(it); } } @@ -205,7 +217,7 @@ void ChatClient::RemoteTrackVisitor::OnObjectFragment( client_->WriteToOutput(GetUsername(*it), object); } -bool ChatClient::AnnounceAndSubscribeAnnounces() { +bool ChatClient::PublishNamespaceAndSubscribeNamespace() { session_ = client_->session(); if (session_ == nullptr) { std::cout << "Failed to connect.\n"; @@ -217,42 +229,45 @@ bool ChatClient::AnnounceAndSubscribeAnnounces() { my_track_name_, MoqtForwardingPreference::kSubgroup); publisher_.Add(queue_); session_->set_publisher(&publisher_); - MoqtOutgoingAnnounceCallback announce_callback = + MoqtOutgoingPublishNamespaceCallback publish_namespace_callback = [this](TrackNamespace track_namespace, - std::optional reason) { + std::optional reason) { if (reason.has_value()) { - std::cout << "ANNOUNCE rejected, " << reason->reason_phrase << "\n"; - session_->Error(MoqtError::kInternalError, "Local ANNOUNCE rejected"); + std::cout << "PUBLISH_NAMESPACE rejected, " << reason->reason_phrase + << "\n"; + session_->Error(MoqtError::kInternalError, + "Local PUBLISH_NAMESPACE rejected"); return; } - std::cout << "ANNOUNCE for " << track_namespace.ToString() + std::cout << "PUBLISH_NAMESPACE for " << track_namespace.ToString() << " accepted\n"; return; }; std::cout << "Announcing " << GetUserNamespace(my_track_name_).ToString() << "\n"; - session_->Announce(GetUserNamespace(my_track_name_), - std::move(announce_callback), VersionSpecificParameters()); + session_->PublishNamespace(GetUserNamespace(my_track_name_), + std::move(publish_namespace_callback), + VersionSpecificParameters()); - // Send SUBSCRIBE_ANNOUNCE. Pop 3 levels of namespace to get to {moq-chat, - // chat-id} - MoqtOutgoingSubscribeAnnouncesCallback subscribe_announces_callback = + // Send SUBSCRIBE_NAMESPACE. Pop 3 levels of namespace to get to + // {moq-chat, chat-id} + MoqtOutgoingSubscribeNamespaceCallback subscribe_namespace_callback = [this](TrackNamespace track_namespace, std::optional error, absl::string_view reason) { if (error.has_value()) { - std::cout << "SUBSCRIBE_ANNOUNCES rejected, " << reason << "\n"; + std::cout << "SUBSCRIBE_NAMESPACE rejected, " << reason << "\n"; session_->Error(MoqtError::kInternalError, - "Local SUBSCRIBE_ANNOUNCES rejected"); + "Local SUBSCRIBE_NAMESPACE rejected"); return; } - std::cout << "SUBSCRIBE_ANNOUNCES for " << track_namespace.ToString() + std::cout << "SUBSCRIBE_NAMESPACE for " << track_namespace.ToString() << " accepted\n"; return; }; VersionSpecificParameters parameters( AuthTokenType::kOutOfBand, std::string(GetUsername(my_track_name_))); - session_->SubscribeAnnounces(GetChatNamespace(my_track_name_), - std::move(subscribe_announces_callback), + session_->SubscribeNamespace(GetChatNamespace(my_track_name_), + std::move(subscribe_namespace_callback), parameters); while (session_is_open_ && is_syncing()) { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_client.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_client.h index bf15fa781c..e8a5a3568f 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_client.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_client.h @@ -7,6 +7,7 @@ #include #include +#include #include "absl/container/flat_hash_set.h" #include "absl/strings/string_view.h" @@ -15,11 +16,11 @@ #include "quiche/quic/core/quic_time.h" #include "quiche/quic/moqt/moqt_known_track_publisher.h" #include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_outgoing_queue.h" -#include "quiche/quic/moqt/moqt_priority.h" -#include "quiche/quic/moqt/moqt_publisher.h" #include "quiche/quic/moqt/moqt_session.h" -#include "quiche/quic/moqt/moqt_track.h" +#include "quiche/quic/moqt/moqt_session_callbacks.h" +#include "quiche/quic/moqt/moqt_session_interface.h" #include "quiche/quic/moqt/tools/moqt_client.h" #include "quiche/common/platform/api/quiche_export.h" #include "quiche/common/quiche_callbacks.h" @@ -60,6 +61,7 @@ class ChatClient { absl::string_view localhost, quic::QuicEventLoop* event_loop = nullptr); ~ChatClient() { + session_is_open_ = false; if (session_ != nullptr) { session_->Close(); session_ = nullptr; @@ -87,14 +89,13 @@ class ChatClient { quic::QuicEventLoop* event_loop() { return event_loop_; } - class QUICHE_EXPORT RemoteTrackVisitor - : public moqt::SubscribeRemoteTrack::Visitor { + class QUICHE_EXPORT RemoteTrackVisitor : public moqt::SubscribeVisitor { public: RemoteTrackVisitor(ChatClient* client) : client_(client) {} - void OnReply(const moqt::FullTrackName& full_track_name, - std::optional largest_id, - std::optional reason_phrase) override; + void OnReply( + const moqt::FullTrackName& full_track_name, + std::variant response) override; void OnCanAckObjects(MoqtObjectAckFunction) override {} @@ -103,17 +104,20 @@ class ChatClient { absl::string_view object, bool end_of_message) override; - void OnSubscribeDone(FullTrackName /*full_track_name*/) override {} + void OnPublishDone(FullTrackName /*full_track_name*/) override {} // TODO(martinduke): Implement this. void OnMalformedTrack(const FullTrackName& /*full_track_name*/) override {} + void OnStreamFin(const FullTrackName&, DataStreamIndex) override {} + void OnStreamReset(const FullTrackName&, DataStreamIndex) override {} + private: ChatClient* client_; }; // Returns false on error. - bool AnnounceAndSubscribeAnnounces(); + bool PublishNamespaceAndSubscribeNamespace(); bool session_is_open() const { return session_is_open_; } @@ -127,14 +131,19 @@ class ChatClient { private: void RunEventLoop() { event_loop_->RunEventLoopOnce(kChatEventLoopDuration); } - // Callback for incoming announces. - std::optional OnIncomingAnnounce( + // Callback for incoming publish_namespaces. + void OnIncomingPublishNamespace( const moqt::TrackNamespace& track_namespace, - std::optional parameters); + std::optional parameters, + moqt::MoqtResponseCallback callback); // Basic session information FullTrackName my_track_name_; + // Related to subscriptions/publish_namespaces + // TODO: One for each subscribe + RemoteTrackVisitor remote_track_visitor_; + // General state variables // The event loop to use for this client. quic::QuicEventLoop* event_loop_; @@ -151,9 +160,6 @@ class ChatClient { absl::flat_hash_set other_users_; int subscribes_to_make_ = 0; - // Related to subscriptions/announces - // TODO: One for each subscribe - RemoteTrackVisitor remote_track_visitor_; // Handling outgoing messages std::shared_ptr queue_; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_client_bin.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_client_bin.cc index 5e9125cffd..c391c8c83a 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_client_bin.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_client_bin.cc @@ -152,7 +152,7 @@ int main(int argc, char* argv[]) { if (!client.Connect(path)) { return 1; } - if (!client.AnnounceAndSubscribeAnnounces()) { + if (!client.PublishNamespaceAndSubscribeNamespace()) { return 1; } client.IoLoop(); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_server.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_server.cc index 268c912fb0..fea8b36609 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_server.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_server.cc @@ -9,60 +9,68 @@ #include #include #include +#include #include "absl/functional/bind_front.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/string_view.h" #include "quiche/quic/core/crypto/proof_source.h" +#include "quiche/quic/core/quic_time.h" #include "quiche/quic/moqt/moqt_live_relay_queue.h" #include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_priority.h" -#include "quiche/quic/moqt/moqt_publisher.h" #include "quiche/quic/moqt/moqt_session.h" +#include "quiche/quic/moqt/moqt_session_callbacks.h" +#include "quiche/quic/moqt/moqt_session_interface.h" #include "quiche/quic/moqt/tools/moq_chat.h" #include "quiche/quic/moqt/tools/moqt_server.h" namespace moqt::moq_chat { -std::optional -ChatServer::ChatServerSessionHandler::OnIncomingAnnounce( +void ChatServer::ChatServerSessionHandler::OnIncomingPublishNamespace( const moqt::TrackNamespace& track_namespace, - std::optional parameters) { + std::optional parameters, + MoqtResponseCallback callback) { if (track_name_.has_value() && GetUserNamespace(*track_name_) != track_namespace) { // ChatServer only supports one track per client session at a time. Return - // ANNOUNCE_OK and exit. - return std::nullopt; + // PUBLISH_NAMESPACE_OK and exit. + std::move(callback)(std::nullopt); + return; } - // Accept the ANNOUNCE regardless of the chat_id. + // Accept the PUBLISH_NAMESPACE regardless of the chat_id. track_name_ = ConstructTrackNameFromNamespace(track_namespace, GetChatId(track_namespace)); if (!track_name_.has_value()) { - std::cout << "Malformed ANNOUNCE namespace\n"; - return MoqtAnnounceErrorReason(RequestErrorCode::kTrackDoesNotExist, - "Not a valid namespace for this chat."); + std::cout << "Malformed PUBLISH_NAMESPACE namespace\n"; + std::move(callback)(MoqtPublishNamespaceErrorReason( + RequestErrorCode::kTrackDoesNotExist, + "Not a valid namespace for this chat.")); + return; } if (!parameters.has_value()) { - std::cout << "Received UNANNOUNCE for " << track_namespace.ToString() - << "\n"; + std::cout << "Received PUBLISH_NAMESPACE_DONE for " + << track_namespace.ToString() << "\n"; server_->DeleteUser(*track_name_); track_name_.reset(); - return std::nullopt; + return; } - std::cout << "Received ANNOUNCE for " << track_namespace.ToString() << "\n"; + std::cout << "Received PUBLISH_NAMESPACE for " << track_namespace.ToString() + << "\n"; session_->SubscribeCurrentObject(*track_name_, server_->remote_track_visitor(), moqt::VersionSpecificParameters()); server_->AddUser(*track_name_); - return std::nullopt; + std::move(callback)(std::nullopt); } -void ChatServer::ChatServerSessionHandler::OnOutgoingAnnounceReply( +void ChatServer::ChatServerSessionHandler::OnOutgoingPublishNamespaceReply( TrackNamespace track_namespace, - std::optional error_message) { + std::optional error_message) { // Log the result; the server doesn't really care. - std::cout << "ANNOUNCE for " << track_namespace.ToString(); + std::cout << "PUBLISH_NAMESPACE for " << track_namespace.ToString(); if (error_message.has_value()) { std::cout << " failed with error: " << error_message->reason_phrase << "\n"; } else { @@ -73,8 +81,8 @@ void ChatServer::ChatServerSessionHandler::OnOutgoingAnnounceReply( ChatServer::ChatServerSessionHandler::ChatServerSessionHandler( MoqtSession* session, ChatServer* server) : session_(session), server_(server) { - session_->callbacks().incoming_announce_callback = absl::bind_front( - &ChatServer::ChatServerSessionHandler::OnIncomingAnnounce, this); + session_->callbacks().incoming_publish_namespace_callback = absl::bind_front( + &ChatServer::ChatServerSessionHandler::OnIncomingPublishNamespace, this); session_->callbacks().session_terminated_callback = [this](absl::string_view error_message) { std::cout << "Session terminated, reason = " << error_message << "\n"; @@ -83,43 +91,45 @@ ChatServer::ChatServerSessionHandler::ChatServerSessionHandler( server_->DeleteUser(*track_name_); } }; - session_->callbacks().incoming_subscribe_announces_callback = + session_->callbacks().incoming_subscribe_namespace_callback = [this](const moqt::TrackNamespace& chat_namespace, - std::optional parameters) { + std::optional parameters, + MoqtResponseCallback callback) { if (parameters.has_value()) { subscribed_namespaces_.insert(chat_namespace); - std::cout << "Received SUBSCRIBE_ANNOUNCES for "; + std::cout << "Received SUBSCRIBE_NAMESPACE for "; } else { subscribed_namespaces_.erase(chat_namespace); - std::cout << "Received UNSUBSCRIBE_ANNOUNCES for "; + std::cout << "Received UNSUBSCRIBE_NAMESPACE for "; } std::cout << chat_namespace.ToString() << "\n"; if (!IsValidChatNamespace(chat_namespace)) { std::cout << "Not a valid moq-chat namespace.\n"; - return std::make_optional( - MoqtSubscribeErrorReason{RequestErrorCode::kTrackDoesNotExist, - "Not a valid namespace for this chat."}); + std::move(callback)( + MoqtRequestError{RequestErrorCode::kTrackDoesNotExist, + "Not a valid namespace for this chat."}); + return; } - if (!parameters.has_value()) { - return std::optional(); + if (!parameters.has_value()) { // UNSUBSCRIBE_NAMESPACE + return; } - // Send all ANNOUNCE. + // Send all PUBLISH_NAMESPACE. for (auto& [track_name, queue] : server_->user_queues_) { - std::cout << "Sending ANNOUNCE for " + std::cout << "Sending PUBLISH_NAMESPACE for " << GetUserNamespace(track_name).ToString() << "\n"; if (track_name_.has_value() && GetUsername(*track_name_) == GetUsername(track_name)) { - // Don't ANNOUNCE a client to itself. + // Don't PUBLISH_NAMESPACE a client to itself. continue; } - session_->Announce( + session_->PublishNamespace( GetUserNamespace(track_name), absl::bind_front(&ChatServer::ChatServerSessionHandler:: - OnOutgoingAnnounceReply, + OnOutgoingPublishNamespaceReply, this), moqt::VersionSpecificParameters()); } - return std::optional(); + std::move(callback)(std::nullopt); }; session_->set_publisher(server_->publisher()); } @@ -138,11 +148,11 @@ ChatServer::RemoteTrackVisitor::RemoteTrackVisitor(ChatServer* server) void ChatServer::RemoteTrackVisitor::OnReply( const moqt::FullTrackName& full_track_name, - std::optional /*largest_id*/, - std::optional reason_phrase) { + std::variant response) { std::cout << "Subscription to " << full_track_name.ToString(); - if (reason_phrase.has_value()) { - std::cout << " REJECTED, reason = " << *reason_phrase << "\n"; + if (std::holds_alternative(response)) { + std::cout << " REJECTED, reason = " + << std::get(response).reason_phrase << "\n"; server_->DeleteUser(full_track_name); } else { std::cout << " ACCEPTED\n"; @@ -197,10 +207,11 @@ ChatServer::~ChatServer() { void ChatServer::AddUser(FullTrackName track_name) { // Add a local track. user_queues_[track_name] = std::make_shared( - track_name, MoqtForwardingPreference::kSubgroup); + track_name, MoqtForwardingPreference::kSubgroup, + MoqtDeliveryOrder::kAscending, quic::QuicTime::Infinite()); publisher_.Add(user_queues_[track_name]); for (auto& session : sessions_) { - session.AnnounceIfSubscribed(track_name.track_namespace()); + session.PublishNamespaceIfSubscribed(track_name.track_namespace()); } } @@ -214,7 +225,7 @@ void ChatServer::DeleteUser(FullTrackName track_name) { publisher_.Delete(track_name); TrackNamespace track_namespace = GetUserNamespace(track_name); for (auto& session : sessions_) { - session.UnannounceIfSubscribed(track_namespace); + session.PublishNamespaceDoneIfSubscribed(track_namespace); } if (user_queues_.empty()) { std::cout << "No more users!\n"; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_server.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_server.h index 352b2ebf28..5273cb51a5 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_server.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/chat_server.h @@ -10,6 +10,7 @@ #include #include #include +#include #include "absl/container/flat_hash_map.h" #include "absl/container/flat_hash_set.h" @@ -20,10 +21,11 @@ #include "quiche/quic/moqt/moqt_known_track_publisher.h" #include "quiche/quic/moqt/moqt_live_relay_queue.h" #include "quiche/quic/moqt/moqt_messages.h" -#include "quiche/quic/moqt/moqt_priority.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_publisher.h" #include "quiche/quic/moqt/moqt_session.h" -#include "quiche/quic/moqt/moqt_track.h" +#include "quiche/quic/moqt/moqt_session_callbacks.h" +#include "quiche/quic/moqt/moqt_session_interface.h" #include "quiche/quic/moqt/tools/moqt_server.h" namespace moqt { @@ -35,20 +37,23 @@ class ChatServer { absl::string_view output_file); ~ChatServer(); - class RemoteTrackVisitor : public SubscribeRemoteTrack::Visitor { + class RemoteTrackVisitor : public SubscribeVisitor { public: explicit RemoteTrackVisitor(ChatServer* server); - void OnReply(const moqt::FullTrackName& full_track_name, - std::optional largest_id, - std::optional reason_phrase) override; + void OnReply( + const moqt::FullTrackName& full_track_name, + std::variant response) override; void OnCanAckObjects(MoqtObjectAckFunction) override {} void OnObjectFragment(const moqt::FullTrackName& full_track_name, const PublishedObjectMetadata& metadata, absl::string_view object, bool end_of_message) override; - void OnSubscribeDone(FullTrackName /*full_track_name*/) override {} + void OnPublishDone(FullTrackName) override {} // TODO(martinduke): Implement this. - void OnMalformedTrack(const FullTrackName& full_track_name) override {} + void OnMalformedTrack(const FullTrackName&) override {} + + void OnStreamFin(const FullTrackName&, DataStreamIndex) override {} + void OnStreamReset(const FullTrackName&, DataStreamIndex) override {} private: ChatServer* server_; @@ -64,14 +69,14 @@ class ChatServer { it_ = it; } - void AnnounceIfSubscribed(TrackNamespace track_namespace) { + void PublishNamespaceIfSubscribed(TrackNamespace track_namespace) { for (const TrackNamespace& subscribed_namespace : subscribed_namespaces_) { if (track_namespace.InNamespace(subscribed_namespace)) { - session_->Announce( + session_->PublishNamespace( track_namespace, absl::bind_front(&ChatServer::ChatServerSessionHandler:: - OnOutgoingAnnounceReply, + OnOutgoingPublishNamespaceReply, this), VersionSpecificParameters()); return; @@ -79,24 +84,25 @@ class ChatServer { } } - void UnannounceIfSubscribed(TrackNamespace track_namespace) { + void PublishNamespaceDoneIfSubscribed(TrackNamespace track_namespace) { for (const TrackNamespace& subscribed_namespace : subscribed_namespaces_) { if (track_namespace.InNamespace(subscribed_namespace)) { - session_->Unannounce(track_namespace); + session_->PublishNamespaceDone(track_namespace); return; } } } private: - // Callback for incoming announces. - std::optional OnIncomingAnnounce( - const moqt::TrackNamespace& track_namespace, - std::optional parameters); - void OnOutgoingAnnounceReply( + // Callback for incoming publish_namespaces. + void OnIncomingPublishNamespace( + const TrackNamespace& track_namespace, + std::optional parameters, + MoqtResponseCallback callback); + void OnOutgoingPublishNamespaceReply( TrackNamespace track_namespace, - std::optional error_message); + std::optional error_message); MoqtSession* session_; // Not owned. // This design assumes that each server has exactly one username, although diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moq_chat.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moq_chat.h index 3478b8b649..ea40a84152 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moq_chat.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moq_chat.h @@ -44,10 +44,10 @@ FullTrackName ConstructTrackName(absl::string_view chat_id, std::optional ConstructTrackNameFromNamespace( const TrackNamespace& track_namespace, absl::string_view chat_id); -// Strips "chat" from the end of |track_name| to use in ANNOUNCE. +// Strips "chat" from the end of |track_name| to use in PUBLISH_NAMESPACE. const TrackNamespace& GetUserNamespace(const FullTrackName& track_name); -// Returns {"moq-chat", chat-id}, useful for SUBSCRIBE_ANNOUNCES. +// Returns {"moq-chat", chat-id}, useful for SUBSCRIBE_NAMESPACE. TrackNamespace GetChatNamespace(const TrackNamespace& track_name); TrackNamespace GetChatNamespace(const FullTrackName& track_name); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_ingestion_server_bin.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_ingestion_server_bin.cc index 416f13328c..d75cdb1df8 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_ingestion_server_bin.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_ingestion_server_bin.cc @@ -3,7 +3,7 @@ // found in the LICENSE file. // moqt_ingestion_server is a simple command-line utility that accepts incoming -// ANNOUNCE messages and records them into a file. +// PUBLISH_NAMESPACE messages and records them into a file. #include @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "absl/algorithm/container.h" @@ -29,12 +30,11 @@ #include "absl/time/clock.h" #include "absl/time/time.h" #include "quiche/quic/moqt/moqt_messages.h" -#include "quiche/quic/moqt/moqt_priority.h" -#include "quiche/quic/moqt/moqt_publisher.h" +#include "quiche/quic/moqt/moqt_object.h" #include "quiche/quic/moqt/moqt_session.h" -#include "quiche/quic/moqt/moqt_track.h" +#include "quiche/quic/moqt/moqt_session_callbacks.h" +#include "quiche/quic/moqt/moqt_session_interface.h" #include "quiche/quic/moqt/tools/moqt_server.h" -#include "quiche/quic/platform/api/quic_ip_address.h" #include "quiche/quic/platform/api/quic_socket_address.h" #include "quiche/common/platform/api/quiche_command_line_flags.h" #include "quiche/common/platform/api/quiche_default_proof_providers.h" @@ -112,23 +112,27 @@ class MoqtIngestionHandler { explicit MoqtIngestionHandler(MoqtSession* session, absl::string_view output_root) : session_(session), output_root_(output_root) { - session_->callbacks().incoming_announce_callback = - absl::bind_front(&MoqtIngestionHandler::OnAnnounceReceived, this); + session_->callbacks().incoming_publish_namespace_callback = + absl::bind_front(&MoqtIngestionHandler::OnPublishNamespaceReceived, + this); } - // TODO(martinduke): Handle when |announce| is false (UNANNOUNCE). - std::optional OnAnnounceReceived( - TrackNamespace track_namespace, - std::optional /*parameters*/) { + // TODO(martinduke): Handle when |publish_namespace| is false + // (PUBLISH_NAMESPACE_DONE). + void OnPublishNamespaceReceived(TrackNamespace track_namespace, + std::optional, + MoqtResponseCallback callback) { if (!IsValidTrackNamespace(track_namespace) && !quiche::GetQuicheCommandLineFlag( FLAGS_allow_invalid_track_namespaces)) { - QUICHE_DLOG(WARNING) << "Rejected remote announce as it contained " - "disallowed characters; namespace: " - << track_namespace; - return MoqtAnnounceErrorReason{ + QUICHE_DLOG(WARNING) + << "Rejected remote publish_namespace as it contained " + "disallowed characters; namespace: " + << track_namespace; + std::move(callback)(MoqtPublishNamespaceErrorReason{ RequestErrorCode::kInternalError, - "Track namespace contains disallowed characters"}; + "Track namespace contains disallowed characters"}); + return; } std::string directory_name = absl::StrCat( @@ -139,15 +143,18 @@ class MoqtIngestionHandler { track_namespace, NamespaceHandler(directory_path)); if (!added) { // Received before; should be handled by already existing subscriptions. - return std::nullopt; + std::move(callback)(std::nullopt); + return; } if (absl::Status status = MakeDirectory(directory_path); !status.ok()) { subscribed_namespaces_.erase(it); QUICHE_LOG(ERROR) << "Failed to create directory " << directory_path << "; " << status; - return MoqtAnnounceErrorReason{RequestErrorCode::kInternalError, - "Failed to create output directory"}; + std::move(callback)( + MoqtPublishNamespaceErrorReason{RequestErrorCode::kInternalError, + "Failed to create output directory"}); + return; } std::string track_list = quiche::GetQuicheCommandLineFlag(FLAGS_tracks); @@ -158,23 +165,22 @@ class MoqtIngestionHandler { session_->RelativeJoiningFetch(full_track_name, &it->second, 0, VersionSpecificParameters()); } - - return std::nullopt; + std::move(callback)(std::nullopt); } private: - class NamespaceHandler : public SubscribeRemoteTrack::Visitor { + class NamespaceHandler : public SubscribeVisitor { public: explicit NamespaceHandler(absl::string_view directory) : directory_(directory) {} void OnReply( const FullTrackName& full_track_name, - std::optional /*largest_id*/, - std::optional error_reason_phrase) override { - if (error_reason_phrase.has_value()) { + std::variant response) override { + if (std::holds_alternative(response)) { QUICHE_LOG(ERROR) << "Failed to subscribe to the peer track " - << full_track_name << ": " << *error_reason_phrase; + << full_track_name << ": " + << std::get(response).reason_phrase; } } @@ -193,8 +199,10 @@ class MoqtIngestionHandler { output.close(); } - void OnSubscribeDone(FullTrackName /*full_track_name*/) override {} + void OnPublishDone(FullTrackName /*full_track_name*/) override {} void OnMalformedTrack(const FullTrackName& /*full_track_name*/) override {} + void OnStreamFin(const FullTrackName&, DataStreamIndex) override {} + void OnStreamReset(const FullTrackName&, DataStreamIndex) override {} private: std::string directory_; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_relay.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_relay.cc new file mode 100644 index 0000000000..43f365b1b7 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_relay.cc @@ -0,0 +1,146 @@ +// Copyright (c) 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "quiche/quic/moqt/tools/moqt_relay.h" + +#include +#include +#include +#include +#include + +#include "absl/status/statusor.h" +#include "absl/strings/string_view.h" +#include "quiche/quic/core/crypto/proof_source.h" +#include "quiche/quic/core/crypto/proof_verifier.h" +#include "quiche/quic/core/io/quic_event_loop.h" +#include "quiche/quic/core/quic_server_id.h" +#include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_session.h" +#include "quiche/quic/moqt/moqt_session_callbacks.h" +#include "quiche/quic/moqt/moqt_session_interface.h" +#include "quiche/quic/moqt/tools/moqt_client.h" +#include "quiche/quic/moqt/tools/moqt_server.h" +#include "quiche/quic/platform/api/quic_default_proof_providers.h" +#include "quiche/quic/platform/api/quic_socket_address.h" +#include "quiche/quic/tools/fake_proof_verifier.h" +#include "quiche/quic/tools/quic_name_lookup.h" +#include "quiche/quic/tools/quic_url.h" +#include "quiche/common/platform/api/quiche_logging.h" +#include "quiche/common/quiche_ip_address.h" + +namespace moqt { + +MoqtRelay::MoqtRelay(std::unique_ptr proof_source, + std::string bind_address, uint16_t bind_port, + absl::string_view default_upstream, + bool ignore_certificate) + : MoqtRelay(std::move(proof_source), bind_address, bind_port, + default_upstream, ignore_certificate, nullptr) {} + +// protected members. +MoqtRelay::MoqtRelay(std::unique_ptr proof_source, + std::string bind_address, uint16_t bind_port, + absl::string_view default_upstream, + bool ignore_certificate, + quic::QuicEventLoop* client_event_loop) + : ignore_certificate_(ignore_certificate), + client_event_loop_(client_event_loop), + // TODO(martinduke): Extend MoqtServer so that partial objects can be + // received. + server_(std::make_unique(std::move(proof_source), + [this](absl::string_view path) { + return IncomingSessionHandler( + path); + })) { + quiche::QuicheIpAddress bind_ip_address; + QUICHE_CHECK(bind_ip_address.FromString(bind_address)); + // CreateUDPSocketAndListen() creates the event loop that we will pass to + // MoqtClient. + server_->quic_server().CreateUDPSocketAndListen( + quic::QuicSocketAddress(bind_ip_address, bind_port)); + if (!default_upstream.empty()) { + quic::QuicUrl url(default_upstream, "https"); + if (client_event_loop == nullptr) { + client_event_loop = server_->quic_server().event_loop(); + } + default_upstream_client_ = + CreateClient(url, ignore_certificate, client_event_loop_); + default_upstream_client_->Connect(url.PathParamsQuery(), + CreateClientCallbacks()); + } +} + +// private members. +std::unique_ptr MoqtRelay::CreateClient( + quic::QuicUrl url, bool ignore_certificate, + quic::QuicEventLoop* event_loop) { + quic::QuicServerId server_id(url.host(), url.port()); + quic::QuicSocketAddress peer_address = + quic::tools::LookupAddress(AF_UNSPEC, server_id); + std::unique_ptr verifier; + if (ignore_certificate) { + verifier = std::make_unique(); + } else { + verifier = quic::CreateDefaultProofVerifier(server_id.host()); + } + return std::make_unique(peer_address, server_id, + std::move(verifier), event_loop); +} + +MoqtSessionCallbacks MoqtRelay::CreateClientCallbacks() { + MoqtSessionCallbacks callbacks; + callbacks.session_established_callback = [this]() { + MoqtSession* session = default_upstream_client_->session(); + session->set_publisher(&publisher_); + publisher_.SetDefaultUpstreamSession(session); + SetNamespaceCallbacks(session); + }; + callbacks.goaway_received_callback = [](absl::string_view new_session_uri) { + QUICHE_LOG(INFO) << "GoAway received, new session uri = " + << new_session_uri; + // There's no asynchronous means today to connect to a new URL. + // Therefore, just ignore GOAWAY. + }; + return callbacks; +} + +void MoqtRelay::SetNamespaceCallbacks(MoqtSessionInterface* session) { + session->callbacks().incoming_publish_namespace_callback = + [this, session]( + const TrackNamespace& track_namespace, + const std::optional& parameters, + MoqtResponseCallback callback) { + if (parameters.has_value()) { + return publisher_.OnPublishNamespace(track_namespace, *parameters, + session, std::move(callback)); + } else { + return publisher_.OnPublishNamespaceDone(track_namespace, session); + } + }; + session->callbacks().incoming_subscribe_namespace_callback = + [this, session]( + const TrackNamespace& track_namespace, + const std::optional& parameters, + MoqtResponseCallback callback) { + if (parameters.has_value()) { + publisher_.AddNamespaceSubscriber(track_namespace, session); + std::move(callback)(std::nullopt); + } else { + publisher_.RemoveNamespaceSubscriber(track_namespace, session); + } + }; +} + +absl::StatusOr MoqtRelay::IncomingSessionHandler( + absl::string_view /*path*/) { + return [this](MoqtSession* session) { + session->callbacks().session_established_callback = [this, session]() { + session->set_publisher(&publisher_); + }; + SetNamespaceCallbacks(session); + }; +} + +} // namespace moqt diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_relay.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_relay.h new file mode 100644 index 0000000000..ca6fe45117 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_relay.h @@ -0,0 +1,81 @@ +// Copyright (c) 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_MOQT_TOOLS_MOQT_RELAY_H_ +#define QUICHE_QUIC_MOQT_TOOLS_MOQT_RELAY_H_ + +#include +#include +#include + +#include "absl/status/statusor.h" +#include "absl/strings/string_view.h" +#include "quiche/quic/core/crypto/proof_source.h" +#include "quiche/quic/core/io/quic_event_loop.h" +#include "quiche/quic/moqt/moqt_relay_publisher.h" +#include "quiche/quic/moqt/moqt_session_callbacks.h" +#include "quiche/quic/moqt/moqt_session_interface.h" +#include "quiche/quic/moqt/tools/moqt_client.h" +#include "quiche/quic/moqt/tools/moqt_server.h" +#include "quiche/quic/tools/quic_url.h" + +namespace moqt { + +// Implements a pure MoqtRelay. It binds to |bind_address| and |bind_port| to +// listen for sessions, and optionally connects to |default_upstream| on +// startup that serves as a default route for requests. +// Requests for a track are forwarded to whatever session has published the +// relevant namespace, or the default route if not published. +// Incoming namespace subscriptions are stored locally. +// Incoming PUBLISH_NAMESPACE are forwarded to all adjacent sessions if +// broadcast_mode is true, otherwise only to sessions that have subscribed. +class MoqtRelay { + public: + // If |default_upstream| is empty, no default upstream session is created. + MoqtRelay(std::unique_ptr proof_source, + std::string bind_address, uint16_t bind_port, + absl::string_view default_upstream, bool ignore_certificate); + virtual ~MoqtRelay() = default; + + void HandleEventsForever() { server_->quic_server().HandleEventsForever(); } + + protected: // Constructor for MoqtTestRelay. + // If |client_event_loop| is null, the event loop from |server_| is used. For + // test relays, it is not null, and the provided event loop is used for the + // client. It will be the same event loop as the remote server, rather than + // the local server. + MoqtRelay(std::unique_ptr proof_source, + std::string bind_address, uint16_t bind_port, + absl::string_view default_upstream, bool ignore_certificate, + quic::QuicEventLoop* client_event_loop); + // Other functions for MoqtTestRelay. + MoqtServer* server() { return server_.get(); } + MoqtClient* client() { return default_upstream_client_.get(); } + MoqtRelayPublisher* publisher() { return &publisher_; } + + virtual void SetNamespaceCallbacks(MoqtSessionInterface* session); + + private: + std::unique_ptr CreateClient( + quic::QuicUrl url, bool ignore_certificate, + quic::QuicEventLoop* event_loop); + + MoqtSessionCallbacks CreateClientCallbacks(); + + absl::StatusOr IncomingSessionHandler( + absl::string_view path); + + const bool ignore_certificate_; + quic::QuicEventLoop* client_event_loop_; + + MoqtRelayPublisher publisher_; + + // Pointer to a client that has received GOAWAY. + std::unique_ptr default_upstream_client_; + std::unique_ptr server_; +}; + +} // namespace moqt + +#endif // QUICHE_QUIC_MOQT_TOOLS_MOQT_RELAY_H_ diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_relay_bin.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_relay_bin.cc new file mode 100644 index 0000000000..241a74d9d9 --- /dev/null +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_relay_bin.cc @@ -0,0 +1,53 @@ +// Copyright (c) 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include + +#include +#include +#include + +#include "absl/strings/string_view.h" +#include "quiche/quic/moqt/tools/moqt_relay.h" +#include "quiche/common/platform/api/quiche_command_line_flags.h" +#include "quiche/common/platform/api/quiche_default_proof_providers.h" + +DEFINE_QUICHE_COMMAND_LINE_FLAG( + bool, disable_certificate_verification, false, + "If true, don't verify the server certificate."); + +DEFINE_QUICHE_COMMAND_LINE_FLAG(std::string, bind_address, "127.0.0.1", + "Local IP address to bind to"); + +DEFINE_QUICHE_COMMAND_LINE_FLAG(uint16_t, port, 9667, + "Port for the server to listen on"); + +DEFINE_QUICHE_COMMAND_LINE_FLAG( + std::string, default_upstream, "", + "If set, connect to the upstream URL and forward all requests there if " + "there is no explicitly advertised source."); + +// A pure MoQT relay. Accepts connections. Will try to route requests from a +// session to a different appropriate upstream session. If the namespace for the +// request has not been advertised, it will reject the request. If +// |default_upstream| is set, it connects on startup to that hosts, and forwards +// such requests there instead. +int main(int argc, char* argv[]) { + const char* usage = "Usage: moqt_relay [options]"; + std::vector args = + quiche::QuicheParseCommandLineFlags(usage, argc, argv); + if (!args.empty()) { + quiche::QuichePrintCommandLineFlagHelp(usage); + return 1; + } + moqt::MoqtRelay relay( + quiche::CreateDefaultProofSource(), + quiche::GetQuicheCommandLineFlag(FLAGS_bind_address), + quiche::GetQuicheCommandLineFlag(FLAGS_port), + quiche::GetQuicheCommandLineFlag(FLAGS_default_upstream), + quiche::GetQuicheCommandLineFlag(FLAGS_disable_certificate_verification)); + relay.HandleEventsForever(); + return 0; +} diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_server.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_server.cc index 80efc0da7e..b919cd4b80 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_server.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_server.cc @@ -41,6 +41,6 @@ quic::WebTransportRequestCallback CreateWebTransportCallback( MoqtServer::MoqtServer(std::unique_ptr proof_source, MoqtIncomingSessionCallback callback) : backend_(CreateWebTransportCallback(std::move(callback), &server_)), - server_(std::move(proof_source), &backend_) {} + server_(std::move(proof_source), /*proof_verifier=*/nullptr, &backend_) {} } // namespace moqt diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_simulator_bin.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_simulator_bin.cc index 9fbaeb9c1b..8bf887471e 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_simulator_bin.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/moqt/tools/moqt_simulator_bin.cc @@ -5,532 +5,27 @@ // moqt_simulator simulates the behavior of MoQ Transport under various network // conditions and application settings. -#include -#include #include -#include #include -#include -#include -#include #include -#include -#include -#include "absl/algorithm/container.h" -#include "absl/base/casts.h" -#include "absl/container/flat_hash_map.h" #include "absl/strings/ascii.h" -#include "absl/strings/str_cat.h" -#include "absl/strings/str_format.h" -#include "absl/strings/str_join.h" -#include "absl/strings/str_replace.h" #include "absl/strings/string_view.h" #include "absl/time/time.h" -#include "quiche/quic/core/crypto/quic_random.h" #include "quiche/quic/core/quic_bandwidth.h" -#include "quiche/quic/core/quic_clock.h" #include "quiche/quic/core/quic_time.h" #include "quiche/quic/core/quic_types.h" -#include "quiche/quic/moqt/moqt_bitrate_adjuster.h" -#include "quiche/quic/moqt/moqt_known_track_publisher.h" -#include "quiche/quic/moqt/moqt_messages.h" -#include "quiche/quic/moqt/moqt_outgoing_queue.h" #include "quiche/quic/moqt/moqt_priority.h" -#include "quiche/quic/moqt/moqt_publisher.h" -#include "quiche/quic/moqt/moqt_session.h" -#include "quiche/quic/moqt/moqt_track.h" -#include "quiche/quic/moqt/test_tools/moqt_simulator_harness.h" -#include "quiche/quic/test_tools/simulator/actor.h" -#include "quiche/quic/test_tools/simulator/link.h" -#include "quiche/quic/test_tools/simulator/port.h" -#include "quiche/quic/test_tools/simulator/simulator.h" -#include "quiche/quic/test_tools/simulator/switch.h" +#include "quiche/quic/moqt/test_tools/moqt_simulator.h" #include "quiche/common/platform/api/quiche_command_line_flags.h" -#include "quiche/common/platform/api/quiche_logging.h" -#include "quiche/common/quiche_buffer_allocator.h" -#include "quiche/common/quiche_data_reader.h" -#include "quiche/common/quiche_data_writer.h" -#include "quiche/common/quiche_mem_slice.h" -#include "quiche/common/simple_buffer_allocator.h" -namespace moqt::test { namespace { -using ::quiche::QuicheBuffer; -using ::quiche::QuicheMemSlice; - using ::quic::QuicBandwidth; using ::quic::QuicByteCount; -using ::quic::QuicClock; -using ::quic::QuicTime; using ::quic::QuicTimeDelta; -using ::quic::simulator::Endpoint; -using ::quic::simulator::Simulator; - -// In the simulation, the server link is supposed to be the bottleneck, so this -// value just has to be sufficiently larger than the server link bandwidth. -constexpr QuicBandwidth kClientLinkBandwidth = - QuicBandwidth::FromBitsPerSecond(10.0e6); -constexpr MoqtVersion kMoqtVersion = kDefaultMoqtVersion; - -// Track name used by the simulator. -FullTrackName TrackName() { return FullTrackName("test", "track"); } - -// Parameters describing the scenario being simulated. -struct SimulationParameters { - // Bottleneck bandwidth of the simulated scenario. - QuicBandwidth bandwidth = QuicBandwidth::FromBitsPerSecond(2.0e6); - // Intended RTT (as computed from propagation delay alone) between the client - // and the server. - QuicTimeDelta min_rtt = QuicTimeDelta::FromMilliseconds(20); - // The size of the network queue; if zero, assumed to be twice the BDP. - QuicByteCount network_queue_size = 0; - // Duration for which the simulation is run. - QuicTimeDelta duration = QuicTimeDelta::FromSeconds(60); - // Packet aggregation timeout. If zero, this will be set to the quarter of - // min RTT. - QuicTimeDelta aggregation_timeout = QuicTimeDelta::Zero(); - // Packet aggregation threshold. If zero, packet aggregation is disabled. - QuicByteCount aggregation_threshold = 0; - - // Count frames as useful only if they were received `deadline` after which - // they were generated. - QuicTimeDelta deadline = QuicTimeDelta::FromSeconds(2); - // Delivery order used by the publisher. - MoqtDeliveryOrder delivery_order = MoqtDeliveryOrder::kDescending; - // Delivery timeout for the subscription. This is mechanically independent - // from `deadline`, which is an accounting-only parameter (in practice, those - // should probably be close). - QuicTimeDelta delivery_timeout = QuicTimeDelta::Infinite(); - // Whether MoqtBitrateAdjuster is enabled. - bool bitrate_adaptation = true; - // Use alternative delivery timeout design. - bool alternative_timeout = false; - - // Number of frames in an individual group. - int keyframe_interval = 30 * 2; - // Number of frames generated per second. - int fps = 30; - // The ratio by which an I-frame is bigger than a P-frame. - float i_to_p_ratio = 2 / 1; - // The target bitrate of the data being exchanged. - QuicBandwidth bitrate = QuicBandwidth::FromBitsPerSecond(1.0e6); - - // Adds random packet loss rate, as a fraction. - float packet_loss_rate = 0.0f; - - // If non-zero, makes the traffic disappear in the middle of the connection - // for the specified duration. - quic::QuicTimeDelta blackhole_duration = QuicTimeDelta::Zero(); -}; - -std::string FormatPercentage(size_t n, size_t total) { - float percentage = 100.0f * n / total; - return absl::StrFormat("%d / %d (%.2f%%)", n, total, percentage); -} - -using OutputField = std::pair; - -OutputField OutputFraction(absl::string_view key, size_t n, size_t total) { - float fraction = static_cast(n) / total; - return OutputField(key, absl::StrCat(fraction)); -} - -float RandFloat(quic::QuicRandom& rng) { - uint32_t number; - rng.RandBytes(&number, sizeof(number)); - return absl::bit_cast((number & 0x7fffff) | 0x3f800000) - 1.0f; -} - -// Box that enacts MoQT simulator specific modifications to the traffic. -class ModificationBox : public Endpoint, - public quic::simulator::UnconstrainedPortInterface { - public: - ModificationBox(Endpoint* wrapped_endpoint, - const SimulationParameters& parameters) - : Endpoint( - wrapped_endpoint->simulator(), - absl::StrCat(wrapped_endpoint->name(), " (moedification box)")), - wrapped_endpoint_(*wrapped_endpoint), - parameters_(parameters) {} - - void OnBeforeSimulationStart() { - if (!parameters_.blackhole_duration.IsZero()) { - float offset = - 0.5f + RandFloat(*simulator()->GetRandomGenerator()) * 0.2f; - blackhole_start_time_ = - simulator()->GetClock()->Now() + offset * parameters_.duration; - } - } - - // Endpoint implementation. - void Act() override {} - quic::simulator::UnconstrainedPortInterface* GetRxPort() override { - return this; - } - void SetTxPort(quic::simulator::ConstrainedPortInterface* port) override { - return wrapped_endpoint_.SetTxPort(port); - } - - // UnconstrainedPortInterface implementation. - void AcceptPacket(std::unique_ptr packet) { - quic::QuicRandom* const rng = simulator()->GetRandomGenerator(); - const quic::QuicTime now = simulator()->GetClock()->Now(); - bool drop = false; - if (parameters_.packet_loss_rate > 0) { - if (RandFloat(*rng) < parameters_.packet_loss_rate) { - drop = true; - } - } - if (blackhole_start_time_.has_value()) { - quic::QuicTime blackhole_end_time = - *blackhole_start_time_ + parameters_.blackhole_duration; - if (now >= blackhole_start_time_ && now < blackhole_end_time) { - drop = true; - } - } - if (!drop) { - wrapped_endpoint_.GetRxPort()->AcceptPacket(std::move(packet)); - } - } - - private: - Endpoint& wrapped_endpoint_; - SimulationParameters parameters_; - std::optional blackhole_start_time_; -}; - -// Generates test objects at a constant rate. The first eight bytes of every -// object generated is a timestamp, the rest is all zeroes. The first object in -// the group can be made bigger than the rest, to simulate the profile of real -// video bitstreams. -class ObjectGenerator : public quic::simulator::Actor, - public moqt::BitrateAdjustable { - public: - ObjectGenerator(Simulator* simulator, const std::string& actor_name, - MoqtSession* session, FullTrackName track_name, - int keyframe_interval, int fps, float i_to_p_ratio, - QuicBandwidth bitrate) - : Actor(simulator, actor_name), - queue_(std::make_shared( - track_name, MoqtForwardingPreference::kSubgroup, - simulator->GetClock())), - keyframe_interval_(keyframe_interval), - time_between_frames_(QuicTimeDelta::FromMicroseconds(1.0e6 / fps)), - i_to_p_ratio_(i_to_p_ratio), - bitrate_(bitrate), - bitrate_history_({bitrate}) {} - - void Act() override { - ++frame_number_; - bool i_frame = (frame_number_ % keyframe_interval_) == 0; - size_t size = GetFrameSize(i_frame); - - QuicheBuffer buffer(quiche::SimpleBufferAllocator::Get(), size); - memset(buffer.data(), 0, buffer.size()); - quiche::QuicheDataWriter writer(size, buffer.data()); - bool success = writer.WriteUInt64(clock_->Now().ToDebuggingValue()); - QUICHE_CHECK(success); - - queue_->AddObject(QuicheMemSlice(std::move(buffer)), i_frame); - Schedule(clock_->Now() + time_between_frames_); - } - - void Start() { Schedule(clock_->Now()); } - void Stop() { Unschedule(); } - - std::shared_ptr queue() { return queue_; } - size_t total_objects_sent() const { return frame_number_ + 1; } - - size_t GetFrameSize(bool i_frame) const { - int p_frame_count = keyframe_interval_ - 1; - // Compute the frame sizes as a fraction of the total group size. - float i_frame_fraction = i_to_p_ratio_ / (i_to_p_ratio_ + p_frame_count); - float p_frame_fraction = 1.0 / (i_to_p_ratio_ + p_frame_count); - float frame_fraction = i_frame ? i_frame_fraction : p_frame_fraction; - - QuicTimeDelta group_duration = time_between_frames_ * keyframe_interval_; - QuicByteCount group_byte_count = group_duration * bitrate_; - size_t frame_size = std::ceil(frame_fraction * group_byte_count); - QUICHE_CHECK_GE(frame_size, 8u) - << "Frame size is too small for a timestamp"; - return frame_size; - } - - quic::QuicBandwidth GetCurrentBitrate() const override { return bitrate_; } - bool CouldUseExtraBandwidth() override { return true; } - void ConsiderAdjustingBitrate(quic::QuicBandwidth bandwidth, - BitrateAdjustmentType type) override { - if (moqt::ShouldIgnoreBitrateAdjustment(bandwidth, type, bitrate_, - /*min_change=*/0.01)) { - return; - } - bitrate_ = bandwidth; - bitrate_history_.push_back(bandwidth); - } - std::string FormatBitrateHistory() const { - std::vector bits; - bits.reserve(bitrate_history_.size()); - for (QuicBandwidth bandwidth : bitrate_history_) { - bits.push_back(absl::StrCat(bandwidth)); - } - return absl::StrJoin(bits, " -> "); - } - - private: - std::shared_ptr queue_; - int keyframe_interval_; - QuicTimeDelta time_between_frames_; - float i_to_p_ratio_; - QuicBandwidth bitrate_; - int frame_number_ = -1; - std::vector bitrate_history_; -}; - -class ObjectReceiver : public SubscribeRemoteTrack::Visitor { - public: - explicit ObjectReceiver(const QuicClock* clock, QuicTimeDelta deadline) - : clock_(clock), deadline_(deadline) {} - - void OnReply(const FullTrackName& full_track_name, - std::optional /*largest_id*/, - std::optional error_reason_phrase) override { - QUICHE_CHECK(full_track_name == TrackName()); - QUICHE_CHECK(!error_reason_phrase.has_value()) << *error_reason_phrase; - } - - void OnCanAckObjects(MoqtObjectAckFunction ack_function) override { - object_ack_function_ = std::move(ack_function); - } - - void OnObjectFragment(const FullTrackName& full_track_name, - const PublishedObjectMetadata& metadata, - absl::string_view object, - bool end_of_message) override { - QUICHE_DCHECK(full_track_name == TrackName()); - if (metadata.status != MoqtObjectStatus::kNormal) { - QUICHE_DCHECK(end_of_message); - return; - } - if (!end_of_message) { - QUICHE_LOG(DFATAL) << "Partial receiving of objects wasn't enabled"; - return; - } - OnFullObject(metadata.location, object); - } - - void OnSubscribeDone(FullTrackName /*full_track_name*/) override {} - void OnMalformedTrack(const FullTrackName& /*full_track_name*/) override {} - - void OnFullObject(Location sequence, absl::string_view payload) { - QUICHE_CHECK_GE(payload.size(), 8u); - quiche::QuicheDataReader reader(payload); - uint64_t time_us; - reader.ReadUInt64(&time_us); - QuicTime time = QuicTime::Zero() + QuicTimeDelta::FromMicroseconds(time_us); - QuicTimeDelta delay = clock_->Now() - time; - QUICHE_CHECK_GT(delay, QuicTimeDelta::Zero()); - QUICHE_DCHECK(absl::c_all_of(reader.ReadRemainingPayload(), - [](char c) { return c == 0; })); - ++full_objects_received_; - if (delay > deadline_) { - ++full_objects_received_late_; - } else { - ++full_objects_received_on_time_; - total_bytes_received_on_time_ += payload.size(); - } - if (object_ack_function_) { - object_ack_function_(sequence.group, sequence.object, deadline_ - delay); - } - } - - size_t full_objects_received() const { return full_objects_received_; } - size_t full_objects_received_on_time() const { - return full_objects_received_on_time_; - } - size_t full_objects_received_late() const { - return full_objects_received_late_; - } - size_t total_bytes_received_on_time() const { - return total_bytes_received_on_time_; - } - - private: - const QuicClock* clock_ = nullptr; - // TODO: figure out when partial objects should be discarded. - absl::flat_hash_map partial_objects_; - MoqtObjectAckFunction object_ack_function_ = nullptr; - - size_t full_objects_received_ = 0; - - QuicTimeDelta deadline_; - size_t full_objects_received_on_time_ = 0; - size_t full_objects_received_late_ = 0; - size_t total_bytes_received_on_time_ = 0; -}; - -// Computes the size of the network queue on the switch. -constexpr QuicByteCount AdjustedQueueSize( - const SimulationParameters& parameters) { - if (parameters.network_queue_size > 0) { - return parameters.network_queue_size; - } - QuicByteCount bdp = parameters.bandwidth * parameters.min_rtt; - return 2 * bdp; -} - -// Simulates the performance of MoQT transfer under the specified network -// conditions. -class MoqtSimulator { - public: - explicit MoqtSimulator(const SimulationParameters& parameters) - : simulator_(quic::QuicRandom::GetInstance()), - client_endpoint_(&simulator_, "Client", "Server", kMoqtVersion), - server_endpoint_(&simulator_, "Server", "Client", kMoqtVersion), - switch_(&simulator_, "Switch", 8, AdjustedQueueSize(parameters)), - modification_box_(switch_.port(1), parameters), - client_link_(&client_endpoint_, &modification_box_, - kClientLinkBandwidth, parameters.min_rtt * 0.25), - server_link_(&server_endpoint_, switch_.port(2), parameters.bandwidth, - parameters.min_rtt * 0.25), - generator_(&simulator_, "Client generator", client_endpoint_.session(), - TrackName(), parameters.keyframe_interval, parameters.fps, - parameters.i_to_p_ratio, parameters.bitrate), - receiver_(simulator_.GetClock(), parameters.deadline), - adjuster_(simulator_.GetClock(), client_endpoint_.session()->session(), - &generator_), - parameters_(parameters) { - if (parameters.aggregation_threshold > 0) { - QuicTimeDelta timeout = parameters.aggregation_timeout; - if (timeout.IsZero()) { - timeout = parameters.min_rtt * 0.25; - } - switch_.port_queue(2)->EnableAggregation(parameters.aggregation_threshold, - timeout); - } - client_endpoint_.RecordTrace(); - } - - MoqtSession* client_session() { return client_endpoint_.session(); } - MoqtSession* server_session() { return server_endpoint_.session(); } - - std::string GetClientSessionCongestionControl() { - return quic::CongestionControlTypeToString( - client_endpoint_.quic_session() - ->connection() - ->sent_packet_manager() - .GetSendAlgorithm() - ->GetCongestionControlType()); - } - - // Runs the simulation and outputs the results to stdout. - void Run() { - // Perform the QUIC and the MoQT handshake. - client_session()->set_support_object_acks(true); - server_session()->set_support_object_acks(true); - RunHandshakeOrDie(simulator_, client_endpoint_, server_endpoint_); - - generator_.queue()->SetDeliveryOrder(parameters_.delivery_order); - client_session()->set_publisher(&publisher_); - if (parameters_.bitrate_adaptation) { - client_session()->SetMonitoringInterfaceForTrack(TrackName(), &adjuster_); - } - if (parameters_.alternative_timeout) { - client_session()->UseAlternateDeliveryTimeout(); - } - publisher_.Add(generator_.queue()); - modification_box_.OnBeforeSimulationStart(); - - // The simulation is started as follows. At t=0: - // (1) The server issues a subscribe request. - // (2) The client starts immediately generating data. At this point, the - // server does not yet have an active subscription, so the client has - // some catching up to do. - generator_.Start(); - VersionSpecificParameters subscription_parameters; - if (parameters_.bitrate_adaptation) { - subscription_parameters.oack_window_size = parameters_.deadline; - } - if (!parameters_.delivery_timeout.IsInfinite()) { - subscription_parameters.delivery_timeout = parameters_.delivery_timeout; - } - server_session()->RelativeJoiningFetch(TrackName(), &receiver_, 0, - subscription_parameters); - simulator_.RunFor(parameters_.duration); - - // At the end, we wait for eight RTTs until the connection settles down. - generator_.Stop(); - wait_at_the_end_ = - 8 * client_endpoint_.quic_session()->GetSessionStats().smoothed_rtt; - simulator_.RunFor(QuicTimeDelta(wait_at_the_end_)); - } - - void HumanReadableOutput() { - const QuicTimeDelta total_time = - parameters_.duration + QuicTimeDelta(wait_at_the_end_); - absl::PrintF("Ran simulation for %v + %.1fms\n", parameters_.duration, - absl::ToDoubleMilliseconds(wait_at_the_end_)); - absl::PrintF("Congestion control used: %s\n", - GetClientSessionCongestionControl()); - - size_t total_sent = generator_.total_objects_sent(); - size_t missing_objects = - generator_.total_objects_sent() - receiver_.full_objects_received(); - absl::PrintF( - "Objects received: %s\n", - FormatPercentage(receiver_.full_objects_received(), total_sent)); - absl::PrintF(" on time: %s\n", - FormatPercentage(receiver_.full_objects_received_on_time(), - total_sent)); - absl::PrintF( - " late: %s\n", - FormatPercentage(receiver_.full_objects_received_late(), total_sent)); - absl::PrintF(" never: %s\n", - FormatPercentage(missing_objects, total_sent)); - absl::PrintF("\n"); - absl::PrintF("Average on-time goodput: %v\n", - QuicBandwidth::FromBytesAndTimeDelta( - receiver_.total_bytes_received_on_time(), total_time)); - absl::PrintF("Bitrates: %s\n", generator_.FormatBitrateHistory()); - } - - void CustomOutput(absl::string_view format) { - size_t total_sent = generator_.total_objects_sent(); - std::vector fields; - fields.push_back(OutputFraction("{on_time_fraction}", - receiver_.full_objects_received_on_time(), - total_sent)); - fields.push_back(OutputFraction( - "{late_fraction}", receiver_.full_objects_received_late(), total_sent)); - size_t missing_objects = - generator_.total_objects_sent() - receiver_.full_objects_received(); - fields.push_back( - OutputFraction("{missing_fraction}", missing_objects, total_sent)); - std::string output = absl::StrReplaceAll(format, fields); - std::cout << output << std::endl; - } - - private: - Simulator simulator_; - MoqtClientEndpoint client_endpoint_; - MoqtServerEndpoint server_endpoint_; - quic::simulator::Switch switch_; - ModificationBox modification_box_; - quic::simulator::SymmetricLink client_link_; - quic::simulator::SymmetricLink server_link_; - MoqtKnownTrackPublisher publisher_; - ObjectGenerator generator_; - ObjectReceiver receiver_; - MoqtBitrateAdjuster adjuster_; - SimulationParameters parameters_; - - absl::Duration wait_at_the_end_; -}; - } // namespace -} // namespace moqt::test DEFINE_QUICHE_COMMAND_LINE_FLAG( uint64_t, bandwidth, diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/platform/api/quic_client_stats.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/platform/api/quic_client_stats.h index d18d6142ac..ce6f8b1116 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/platform/api/quic_client_stats.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/platform/api/quic_client_stats.h @@ -5,8 +5,7 @@ #ifndef QUICHE_QUIC_PLATFORM_API_QUIC_CLIENT_STATS_H_ #define QUICHE_QUIC_PLATFORM_API_QUIC_CLIENT_STATS_H_ -#include - +#include "absl/strings/string_view.h" #include "quiche/common/platform/api/quiche_client_stats.h" namespace quic { @@ -78,7 +77,7 @@ namespace quic { QUICHE_CLIENT_HISTOGRAM_COUNTS(name, sample, min, max, bucket_count, \ docstring) -inline void QuicClientSparseHistogram(const std::string& name, int sample) { +inline void QuicClientSparseHistogram(absl::string_view name, int sample) { quiche::QuicheClientSparseHistogram(name, sample); } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_control_stream.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_control_stream.cc index 18f8f030d4..38ef9f8511 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_control_stream.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_control_stream.cc @@ -56,7 +56,7 @@ void QboneControlStreamBase::OnDataAvailable() { } } -bool QboneControlStreamBase::SendMessage(const proto2::Message& proto) { +bool QboneControlStreamBase::SendDatagram(const proto2::Message& proto) { std::string tmp; if (!proto.SerializeToString(&tmp)) { QUIC_BUG(quic_bug_11023_1) << "Failed to serialize QboneControlRequest"; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_control_stream.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_control_stream.h index 379d735b49..26d6a84ad9 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_control_stream.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_control_stream.h @@ -24,7 +24,7 @@ class QUIC_EXPORT_PRIVATE QboneControlStreamBase : public QuicStream { protected: virtual void OnMessage(const std::string& data) = 0; - bool SendMessage(const proto2::Message& proto); + bool SendDatagram(const proto2::Message& proto); private: uint16_t pending_message_size_; @@ -51,7 +51,7 @@ class QUIC_EXPORT_PRIVATE QboneControlStream : public QboneControlStreamBase { Handler* handler) : QboneControlStreamBase(pending, session), handler_(handler) {} - bool SendRequest(const Outgoing& request) { return SendMessage(request); } + bool SendRequest(const Outgoing& request) { return SendDatagram(request); } protected: void OnMessage(const std::string& data) override { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_session_base.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_session_base.cc index 14da427e9a..7704aa7ac7 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_session_base.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_session_base.cc @@ -85,9 +85,9 @@ void QboneSessionBase::OnStreamFrame(const QuicStreamFrame& frame) { QuicSession::OnStreamFrame(frame); } -void QboneSessionBase::OnMessageReceived(absl::string_view message) { - ++num_message_packets_; - ProcessPacketFromPeer(message); +void QboneSessionBase::OnDatagramReceived(absl::string_view datagram) { + ++num_datagram_packets_; + ProcessPacketFromPeer(datagram); } QuicStream* QboneSessionBase::CreateIncomingStream(QuicStreamId id) { @@ -137,13 +137,13 @@ void QboneSessionBase::SendPacketToPeer(absl::string_view packet) { return; } - if (send_packets_as_messages_) { + if (send_packets_as_datagrams_) { quiche::QuicheMemSlice slice(quiche::QuicheBuffer::Copy( connection()->helper()->GetStreamSendBufferAllocator(), packet)); - switch (SendMessage(absl::MakeSpan(&slice, 1), /*flush=*/true).status) { - case MESSAGE_STATUS_SUCCESS: + switch (SendDatagram(absl::MakeSpan(&slice, 1), /*flush=*/true).status) { + case DATAGRAM_STATUS_SUCCESS: break; - case MESSAGE_STATUS_TOO_LARGE: { + case DATAGRAM_STATUS_TOO_LARGE: { if (packet.size() < sizeof(ip6_hdr)) { QUIC_BUG(quic_bug_10987_2) << "Dropped malformed packet: IPv6 header too short"; @@ -153,7 +153,7 @@ void QboneSessionBase::SendPacketToPeer(absl::string_view packet) { icmp6_hdr icmp_header{}; icmp_header.icmp6_type = ICMP6_PACKET_TOO_BIG; icmp_header.icmp6_mtu = - connection()->GetGuaranteedLargestMessagePayload(); + connection()->GetGuaranteedLargestDatagramPayload(); CreateIcmpPacket(header->ip6_dst, header->ip6_src, icmp_header, packet, [this](absl::string_view icmp_packet) { @@ -162,21 +162,21 @@ void QboneSessionBase::SendPacketToPeer(absl::string_view packet) { }); break; } - case MESSAGE_STATUS_ENCRYPTION_NOT_ESTABLISHED: + case DATAGRAM_STATUS_ENCRYPTION_NOT_ESTABLISHED: QUIC_BUG(quic_bug_10987_3) - << "MESSAGE_STATUS_ENCRYPTION_NOT_ESTABLISHED"; + << "DATAGRAM_STATUS_ENCRYPTION_NOT_ESTABLISHED"; break; - case MESSAGE_STATUS_UNSUPPORTED: - QUIC_BUG(quic_bug_10987_4) << "MESSAGE_STATUS_UNSUPPORTED"; + case DATAGRAM_STATUS_UNSUPPORTED: + QUIC_BUG(quic_bug_10987_4) << "DATAGRAM_STATUS_UNSUPPORTED"; break; - case MESSAGE_STATUS_BLOCKED: - QUIC_BUG(quic_bug_10987_5) << "MESSAGE_STATUS_BLOCKED"; + case DATAGRAM_STATUS_BLOCKED: + QUIC_BUG(quic_bug_10987_5) << "DATAGRAM_STATUS_BLOCKED"; break; - case MESSAGE_STATUS_SETTINGS_NOT_RECEIVED: - QUIC_BUG(quic_bug_10987_8) << "MESSAGE_STATUS_SETTINGS_NOT_RECEIVED"; + case DATAGRAM_STATUS_SETTINGS_NOT_RECEIVED: + QUIC_BUG(quic_bug_10987_8) << "DATAGRAM_STATUS_SETTINGS_NOT_RECEIVED"; break; - case MESSAGE_STATUS_INTERNAL_ERROR: - QUIC_BUG(quic_bug_10987_6) << "MESSAGE_STATUS_INTERNAL_ERROR"; + case DATAGRAM_STATUS_INTERNAL_ERROR: + QUIC_BUG(quic_bug_10987_6) << "DATAGRAM_STATUS_INTERNAL_ERROR"; break; } return; @@ -202,8 +202,8 @@ uint64_t QboneSessionBase::GetNumStreamedPackets() const { return num_streamed_packets_; } -uint64_t QboneSessionBase::GetNumMessagePackets() const { - return num_message_packets_; +uint64_t QboneSessionBase::GetNumDatagramPackets() const { + return num_datagram_packets_; } uint64_t QboneSessionBase::GetNumFallbackToStream() const { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_session_base.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_session_base.h index e643f0d942..ab0481a546 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_session_base.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/qbone/qbone_session_base.h @@ -31,8 +31,8 @@ class QUIC_EXPORT_PRIVATE QboneSessionBase : public QuicSession { void Initialize() override; // This will check if the packet is wholly contained. void OnStreamFrame(const QuicStreamFrame& frame) override; - // Called whenever a MESSAGE frame is received. - void OnMessageReceived(absl::string_view message) override; + // Called whenever a DATAGRAM frame is received. + void OnDatagramReceived(absl::string_view datagram) override; virtual void ProcessPacketFromNetwork(absl::string_view packet) = 0; virtual void ProcessPacketFromPeer(absl::string_view packet) = 0; @@ -47,16 +47,16 @@ class QUIC_EXPORT_PRIVATE QboneSessionBase : public QuicSession { uint64_t GetNumStreamedPackets() const; // Returns the number of QBONE network packets that were received using QUIC - // MESSAGE frame. - uint64_t GetNumMessagePackets() const; + // DATAGRAM frame. + uint64_t GetNumDatagramPackets() const; - // Returns the number of times sending a MESSAGE frame failed, and the session - // used an ephemeral stream instead. + // Returns the number of times sending a DATAGRAM frame failed, and the + // session used an ephemeral stream instead. uint64_t GetNumFallbackToStream() const; void set_writer(QbonePacketWriter* writer); - void set_send_packets_as_messages(bool send_packets_as_messages) { - send_packets_as_messages_ = send_packets_as_messages; + void set_send_packets_as_datagrams(bool send_packets_as_datagrams) { + send_packets_as_datagrams_ = send_packets_as_datagrams; } protected: @@ -88,9 +88,9 @@ class QUIC_EXPORT_PRIVATE QboneSessionBase : public QuicSession { QbonePacketWriter* writer_; - // If true, send QUIC DATAGRAM (aka MESSAGE) frames instead of ephemeral + // If true, send QUIC DATAGRAM (aka DATAGRAM) frames instead of ephemeral // streams. Note that receiving DATAGRAM frames is always supported. - bool send_packets_as_messages_ = true; + bool send_packets_as_datagrams_ = true; private: // Used for the crypto handshake. @@ -98,10 +98,10 @@ class QUIC_EXPORT_PRIVATE QboneSessionBase : public QuicSession { // Statistics for the packets received by the session. uint64_t num_ephemeral_packets_ = 0; - uint64_t num_message_packets_ = 0; + uint64_t num_datagram_packets_ = 0; uint64_t num_streamed_packets_ = 0; - // Number of times the connection has failed to send packets as MESSAGE frame + // Number of times the connection has failed to send packets as DATAGRAM frame // and used streams as a fallback. uint64_t num_fallback_to_stream_ = 0; }; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/fake_proof_source_handle.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/fake_proof_source_handle.cc index 63527f60d0..3ae09f581a 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/fake_proof_source_handle.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/fake_proof_source_handle.cc @@ -12,7 +12,9 @@ #include #include +#include "absl/base/nullability.h" #include "absl/strings/string_view.h" +#include "openssl/base.h" #include "quiche/quic/core/crypto/proof_source.h" #include "quiche/quic/core/quic_connection_id.h" #include "quiche/quic/core/quic_types.h" @@ -49,11 +51,11 @@ class ResultSavingSignatureCallback : public ProofSource::SignatureCallback { }; ComputeSignatureResult ComputeSignatureNow( - ProofSource* delegate, const QuicSocketAddress& server_address, + ProofSource& delegate, const QuicSocketAddress& server_address, const QuicSocketAddress& client_address, const std::string& hostname, uint16_t signature_algorithm, absl::string_view in) { std::optional result; - delegate->ComputeTlsSignature( + delegate.ComputeTlsSignature( server_address, client_address, hostname, signature_algorithm, in, std::make_unique(&result)); QUICHE_CHECK(result.has_value()) @@ -64,14 +66,17 @@ ComputeSignatureResult ComputeSignatureNow( } // namespace FakeProofSourceHandle::FakeProofSourceHandle( - ProofSource* delegate, ProofSourceHandleCallback* callback, - Action select_cert_action, Action compute_signature_action, - QuicDelayedSSLConfig delayed_ssl_config) + ProofSource* absl_nonnull delegate, + ProofSourceHandleCallback* absl_nonnull callback, Action select_cert_action, + Action compute_signature_action, QuicDelayedSSLConfig delayed_ssl_config) : delegate_(delegate), callback_(callback), select_cert_action_(select_cert_action), compute_signature_action_(compute_signature_action), - delayed_ssl_config_(delayed_ssl_config) {} + delayed_ssl_config_(delayed_ssl_config) { + QUICHE_CHECK(delegate); + QUICHE_CHECK(callback); +} void FakeProofSourceHandle::CloseHandle() { select_cert_op_.reset(); @@ -157,7 +162,7 @@ QuicAsyncStatus FakeProofSourceHandle::ComputeSignature( QUICHE_DCHECK(compute_signature_action_ == Action::DELEGATE_SYNC); ComputeSignatureResult result = - ComputeSignatureNow(delegate_, server_address, client_address, hostname, + ComputeSignatureNow(*delegate_, server_address, client_address, hostname, signature_algorithm, in); callback_->OnComputeSignatureDone( result.ok, /*is_sync=*/true, result.signature, std::move(result.details)); @@ -235,7 +240,7 @@ void FakeProofSourceHandle::ComputeSignatureOperation::Run() { /*signature=*/"", /*details=*/nullptr); } else if (action_ == Action::DELEGATE_ASYNC) { ComputeSignatureResult result = ComputeSignatureNow( - delegate_, args_.server_address, args_.client_address, args_.hostname, + *delegate_, args_.server_address, args_.client_address, args_.hostname, args_.signature_algorithm, args_.in); callback_->OnComputeSignatureDone(result.ok, /*is_sync=*/false, result.signature, diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/fake_proof_source_handle.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/fake_proof_source_handle.h index 05faebe977..b9903ad79b 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/fake_proof_source_handle.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/fake_proof_source_handle.h @@ -5,8 +5,19 @@ #ifndef QUICHE_QUIC_TEST_TOOLS_FAKE_PROOF_SOURCE_HANDLE_H_ #define QUICHE_QUIC_TEST_TOOLS_FAKE_PROOF_SOURCE_HANDLE_H_ +#include +#include +#include +#include +#include + +#include "absl/base/nullability.h" +#include "absl/strings/string_view.h" +#include "openssl/base.h" #include "quiche/quic/core/crypto/proof_source.h" #include "quiche/quic/core/quic_connection_id.h" +#include "quiche/quic/core/quic_types.h" +#include "quiche/quic/platform/api/quic_socket_address.h" namespace quic { namespace test { @@ -33,7 +44,8 @@ class FakeProofSourceHandle : public ProofSourceHandle { // |delegate| must do cert selection and signature synchronously. // |delayed_ssl_config| is the config passed to OnSelectCertificateDone. FakeProofSourceHandle( - ProofSource* delegate, ProofSourceHandleCallback* callback, + ProofSource* absl_nonnull delegate, + ProofSourceHandleCallback* absl_nonnull callback, Action select_cert_action, Action compute_signature_action, QuicDelayedSSLConfig delayed_ssl_config = QuicDelayedSSLConfig()); @@ -174,8 +186,8 @@ class FakeProofSourceHandle : public ProofSourceHandle { int NumPendingOperations() const; bool closed_ = false; - ProofSource* delegate_; - ProofSourceHandleCallback* callback_; + ProofSource* absl_nonnull delegate_; + ProofSourceHandleCallback* absl_nonnull callback_; // Action for the next select cert operation. Action select_cert_action_ = Action::DELEGATE_SYNC; // Action for the next compute signature operation. diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.cc index c0d713a42e..8e51697faa 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.cc @@ -4,6 +4,7 @@ #include "quiche/quic/test_tools/quic_connection_peer.h" +#include #include #include @@ -13,6 +14,7 @@ #include "quiche/quic/core/quic_connection_alarms.h" #include "quiche/quic/core/quic_packet_writer.h" #include "quiche/quic/core/quic_received_packet_manager.h" +#include "quiche/quic/core/quic_types.h" #include "quiche/quic/platform/api/quic_flags.h" #include "quiche/quic/platform/api/quic_socket_address.h" #include "quiche/quic/test_tools/quic_connection_id_manager_peer.h" @@ -614,5 +616,18 @@ uint8_t QuicConnectionPeer::GetNumPtosForRetransmittableOnWireTimeout( .num_ptos_for_retransmittable_on_wire_timeout_; } +// static +uint64_t QuicConnectionPeer::GetPeerReorderingThreshold( + QuicConnection* connection) { + if (!connection->version().UsesTls()) { + return connection->uber_received_packet_manager_ + .received_packet_managers_[0] + .reordering_threshold_; + } + return connection->uber_received_packet_manager_ + .received_packet_managers_[APPLICATION_DATA] + .reordering_threshold_; +} + } // namespace test } // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.h index c1477a8cf1..2b284fa0cc 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.h @@ -256,6 +256,8 @@ class QuicConnectionPeer { static uint8_t GetNumPtosForRetransmittableOnWireTimeout( const QuicConnection* connection); + + static uint64_t GetPeerReorderingThreshold(QuicConnection* connection); }; } // namespace test diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.cc index 1d95f8c310..5160675e0d 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.cc @@ -108,12 +108,12 @@ class RecordingProofVerifier : public ProofVerifier { } // Extract the CN field - X509_NAME* subject = X509_get_subject_name(cert.get()); + const X509_NAME* subject = X509_get_subject_name(cert.get()); const int index = X509_NAME_get_index_by_NID(subject, NID_commonName, -1); if (index < 0) { return QUIC_FAILURE; } - ASN1_STRING* name_data = + const ASN1_STRING* name_data = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subject, index)); if (name_data == nullptr) { return QUIC_FAILURE; @@ -168,7 +168,10 @@ MockableQuicClientDefaultNetworkHelper::CreateQuicPacketWriter() { return writer; } test_writer_->set_writer(writer); - return test_writer_; + QuicPacketWriterWrapper* test_writer = test_writer_; + // Reset the `test_writer_` so that it can't be used again. + test_writer_ = nullptr; + return test_writer; } void MockableQuicClientDefaultNetworkHelper::set_socket_fd_configurator( @@ -252,6 +255,13 @@ QuicConnectionId MockableQuicClient::GetClientConnectionId() { return QuicDefaultClient::GetClientConnectionId(); } +std::unique_ptr +MockableQuicClient::CreateQuicMigrationHelper() { + auto migration_helper = std::make_unique(*this); + migration_helper_ = migration_helper.get(); + return migration_helper; +} + void MockableQuicClient::UseClientConnectionIdLength( int client_connection_id_length) { override_client_connection_id_length_ = client_connection_id_length; @@ -262,12 +272,39 @@ void MockableQuicClient::UseWriter(QuicPacketWriterWrapper* writer) { } void MockableQuicClient::set_peer_address(const QuicSocketAddress& address) { - mockable_network_helper()->set_peer_address(address); if (client_session() != nullptr) { client_session()->connection()->AddKnownServerAddress(address); + static_cast(writer())->set_peer_address(address); + } else { + mockable_network_helper()->set_peer_address(address); } } +void MockableQuicClient::QuicTestMigrationHelper::AddNewNetwork( + QuicNetworkHandle network, QuicIpAddress address) { + network_to_address_map_[network] = address; +} + +QuicIpAddress MockableQuicClient::QuicTestMigrationHelper::GetAddressForNetwork( + QuicNetworkHandle network) const { + QUICHE_DCHECK(network_to_address_map_.contains(network)) + << "Network " << network << " not found in network_to_address_map_."; + return network_to_address_map_.at(network); +} + +QuicNetworkHandle +MockableQuicClient::QuicTestMigrationHelper::FindAlternateNetwork( + QuicNetworkHandle network) { + for (const auto& [key, value] : network_to_address_map_) { + if (key != network) { + QUICHE_DLOG(INFO) << "Found alternate network " << key << " with address " + << value.ToString(); + return key; + } + } + return kInvalidNetworkHandle; +} + QuicTestClient::QuicTestClient( QuicSocketAddress server_address, const std::string& server_hostname, const ParsedQuicVersionVector& supported_versions) @@ -454,6 +491,14 @@ int64_t QuicTestClient::SendData( bool QuicTestClient::response_complete() const { return response_complete_; } +QuicTime QuicTestClient::request_start_time() const { + return request_start_time_; +} + +QuicTime QuicTestClient::response_end_time() const { + return response_end_time_; +} + int64_t QuicTestClient::response_body_size() const { return response_body_size_; } @@ -518,6 +563,8 @@ QuicSpdyClientStream* QuicTestClient::GetOrCreateStream() { if (!latest_created_stream_) { SetLatestCreatedStream(client_->CreateClientStream()); if (latest_created_stream_) { + request_start_time_ = + client()->client_session()->connection()->clock()->Now(); latest_created_stream_->SetPriority(QuicStreamPriority( HttpStreamPriority{priority_, /* incremental = */ false})); } @@ -548,6 +595,10 @@ const QuicTagValueMap& QuicTestClient::GetServerConfig() const { return handshake_msg->tag_value_map(); } +const QuicConnectionStats& QuicTestClient::GetConnectionStats() const { + return client_->client_session()->connection()->GetStats(); +} + bool QuicTestClient::connected() const { return client_->connected(); } void QuicTestClient::Connect() { @@ -810,6 +861,10 @@ void QuicTestClient::ReadNextResponse() { stream_error_ = state.stream_error; response_ = state.response; response_complete_ = state.response_complete; + if (response_complete_) { + response_end_time_ = + client()->client_session()->connection()->clock()->Now(); + } response_headers_complete_ = state.response_headers_complete; response_headers_ = state.response_headers.Clone(); response_trailers_ = state.response_trailers.Clone(); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.h index a0e99f61fe..c7c1b7d52c 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.h @@ -60,6 +60,38 @@ class MockableQuicClientDefaultNetworkHelper // A quic client which allows mocking out reads and writes. class MockableQuicClient : public QuicDefaultClient { public: + // A test implementation that supports network handle and caches multiple of + // them. + class QuicTestMigrationHelper : public QuicDefaultMigrationHelper { + public: + explicit QuicTestMigrationHelper(MockableQuicClient& client) + : QuicDefaultMigrationHelper(client) {} + + // Overridden to return a different cached network handle from the given + // one. Returns `kInvalidNetworkHandle` if none is found. + QuicNetworkHandle FindAlternateNetwork(QuicNetworkHandle network) override; + + QuicNetworkHandle GetDefaultNetwork() override { + return kInvalidNetworkHandle; + } + QuicNetworkHandle GetCurrentNetwork() override { + return kInvalidNetworkHandle; + } + + // Adds a new network handle with a specific address to the cached map. + void AddNewNetwork(QuicNetworkHandle network, QuicIpAddress address); + + // Overridden to search the cached map for the address. + // Invariant: `network` must have been cached via `AddNewNetwork()`. + QuicIpAddress GetAddressForNetwork( + QuicNetworkHandle network) const override; + + private: + // Cached map of network handles to addresses. + absl::flat_hash_map + network_to_address_map_; + }; + MockableQuicClient(QuicSocketAddress server_address, const QuicServerId& server_id, const ParsedQuicVersionVector& supported_versions, @@ -88,11 +120,19 @@ class MockableQuicClient : public QuicDefaultClient { ~MockableQuicClient() override; QuicConnectionId GetClientConnectionId() override; + std::unique_ptr CreateQuicMigrationHelper() override; void UseClientConnectionIdLength(int client_connection_id_length); void UseWriter(QuicPacketWriterWrapper* writer); void set_peer_address(const QuicSocketAddress& address); + // Must be called after `Initialize()`. + void AddNewNetwork(QuicNetworkHandle network, QuicIpAddress address) { + QUICHE_DCHECK(migration_helper_ != nullptr) + << "use_migration_helper_ must be set to true."; + migration_helper_->AddNewNetwork(network, address); + } + // Casts the network helper to a MockableQuicClientDefaultNetworkHelper. MockableQuicClientDefaultNetworkHelper* mockable_network_helper(); const MockableQuicClientDefaultNetworkHelper* mockable_network_helper() const; @@ -104,6 +144,8 @@ class MockableQuicClient : public QuicDefaultClient { bool client_connection_id_overridden_; int override_client_connection_id_length_ = -1; CachedNetworkParameters cached_network_paramaters_; + // Owned by the base class. + QuicTestMigrationHelper* migration_helper_ = nullptr; }; // A toy QUIC client used for testing. @@ -196,6 +238,8 @@ class QuicTestClient : public QuicSpdyStream::Visitor { // received. const quiche::HttpHeaderBlock& response_trailers() const; bool response_complete() const; + QuicTime request_start_time() const; + QuicTime response_end_time() const; int64_t response_body_size() const; const std::string& response_body() const; // Getters for stream state that return state of the oldest active stream that @@ -295,6 +339,8 @@ class QuicTestClient : public QuicSpdyStream::Visitor { // Get the server config map. Server config must exist. const QuicTagValueMap& GetServerConfig() const; + const QuicConnectionStats& GetConnectionStats() const; + void set_auto_reconnect(bool reconnect) { auto_reconnect_ = reconnect; } void set_priority(spdy::SpdyPriority priority) { priority_ = priority; } @@ -397,6 +443,8 @@ class QuicTestClient : public QuicSpdyStream::Visitor { QuicRstStreamErrorCode stream_error_; bool response_complete_; + QuicTime request_start_time_ = QuicTime::Zero(); + QuicTime response_end_time_ = QuicTime::Zero(); bool response_headers_complete_; mutable quiche::HttpHeaderBlock response_headers_; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.cc index 09795f7023..d5c364d10b 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.cc @@ -162,7 +162,8 @@ class QuicTestDispatcher : public QuicSimpleDispatcher { QuicTestServer::QuicTestServer( std::unique_ptr proof_source, QuicSimpleServerBackend* quic_simple_server_backend) - : QuicServer(std::move(proof_source), quic_simple_server_backend) {} + : QuicServer(std::move(proof_source), /*proof_verifier=*/nullptr, + quic_simple_server_backend) {} QuicTestServer::QuicTestServer( std::unique_ptr proof_source, const QuicConfig& config, @@ -177,7 +178,7 @@ QuicTestServer::QuicTestServer( const ParsedQuicVersionVector& supported_versions, QuicSimpleServerBackend* quic_simple_server_backend, uint8_t expected_server_connection_id_length) - : QuicServer(std::move(proof_source), config, + : QuicServer(std::move(proof_source), /*proof_verifier=*/nullptr, config, QuicCryptoServerConfig::ConfigOptions(), supported_versions, quic_simple_server_backend, expected_server_connection_id_length) {} diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.cc index 47304be72a..3d1eefeb1b 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.cc @@ -429,7 +429,7 @@ bool NoOpFramerVisitor::OnBlockedFrame(const QuicBlockedFrame& /*frame*/) { return true; } -bool NoOpFramerVisitor::OnMessageFrame(const QuicMessageFrame& /*frame*/) { +bool NoOpFramerVisitor::OnDatagramFrame(const QuicDatagramFrame& /*frame*/) { return true; } @@ -972,9 +972,10 @@ QuicEncryptedPacket* ConstructEncryptedPacket( return new QuicEncryptedPacket(buffer, encrypted_length, true); } -std::unique_ptr GetUndecryptableEarlyPacket( +std::unique_ptr MakeLongHeaderPacket( const ParsedQuicVersion& version, - const QuicConnectionId& server_connection_id) { + const QuicConnectionId& server_connection_id, const QuicFrames& frames, + QuicLongHeaderType long_header_type, EncryptionLevel encryption_level) { QuicPacketHeader header; header.destination_connection_id = server_connection_id; header.destination_connection_id_included = CONNECTION_ID_PRESENT; @@ -987,30 +988,28 @@ std::unique_ptr GetUndecryptableEarlyPacket( header.reset_flag = false; header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER; header.packet_number = QuicPacketNumber(33); - header.long_packet_type = ZERO_RTT_PROTECTED; + header.long_packet_type = long_header_type; if (version.HasLongHeaderLengths()) { header.retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1; header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2; } - QuicFrames frames; - frames.push_back(QuicFrame(QuicPingFrame())); - frames.push_back(QuicFrame(QuicPaddingFrame(100))); QuicFramer framer({version}, QuicTime::Zero(), Perspective::IS_CLIENT, kQuicDefaultConnectionIdLength); framer.SetInitialObfuscators(server_connection_id); - framer.SetEncrypter(ENCRYPTION_ZERO_RTT, - std::make_unique(ENCRYPTION_ZERO_RTT)); + if (long_header_type != INITIAL) { + framer.SetEncrypter(encryption_level, + std::make_unique(encryption_level)); + } std::unique_ptr packet( BuildUnsizedDataPacket(&framer, header, frames)); EXPECT_TRUE(packet != nullptr); char* buffer = new char[kMaxOutgoingPacketSize]; size_t encrypted_length = - framer.EncryptPayload(ENCRYPTION_ZERO_RTT, header.packet_number, *packet, + framer.EncryptPayload(encryption_level, header.packet_number, *packet, buffer, kMaxOutgoingPacketSize); EXPECT_NE(0u, encrypted_length); - DeleteFrames(&frames); return std::make_unique(buffer, encrypted_length, /*owns_buffer=*/true); } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h index 2bc5c12067..64d32a6cc2 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h @@ -21,6 +21,7 @@ #include "quiche/quic/core/congestion_control/loss_detection_interface.h" #include "quiche/quic/core/congestion_control/send_algorithm_interface.h" #include "quiche/quic/core/crypto/transport_parameters.h" +#include "quiche/quic/core/frames/quic_frame.h" #include "quiche/quic/core/frames/quic_immediate_ack_frame.h" #include "quiche/quic/core/frames/quic_reset_stream_at_frame.h" #include "quiche/quic/core/http/http_decoder.h" @@ -160,10 +161,11 @@ QuicEncryptedPacket* ConstructEncryptedPacket( QuicConnectionId source_connection_id, bool version_flag, bool reset_flag, uint64_t packet_number, const std::string& data); -// Creates a client-to-server ZERO-RTT packet that will fail to decrypt. -std::unique_ptr GetUndecryptableEarlyPacket( +// Creates a long header packet for testing. +std::unique_ptr MakeLongHeaderPacket( const ParsedQuicVersion& version, - const QuicConnectionId& server_connection_id); + const QuicConnectionId& server_connection_id, const QuicFrames& frames, + QuicLongHeaderType long_header_type, EncryptionLevel encryption_level); // Constructs a received packet for testing. The caller must take ownership // of the returned pointer. @@ -352,7 +354,7 @@ class MockFramerVisitor : public QuicFramerVisitorInterface { (override)); MOCK_METHOD(bool, OnBlockedFrame, (const QuicBlockedFrame& frame), (override)); - MOCK_METHOD(bool, OnMessageFrame, (const QuicMessageFrame& frame), + MOCK_METHOD(bool, OnDatagramFrame, (const QuicDatagramFrame& frame), (override)); MOCK_METHOD(bool, OnHandshakeDoneFrame, (const QuicHandshakeDoneFrame& frame), (override)); @@ -426,7 +428,7 @@ class NoOpFramerVisitor : public QuicFramerVisitorInterface { bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) override; bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override; bool OnBlockedFrame(const QuicBlockedFrame& frame) override; - bool OnMessageFrame(const QuicMessageFrame& frame) override; + bool OnDatagramFrame(const QuicDatagramFrame& frame) override; bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override; bool OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame) override; bool OnImmediateAckFrame(const QuicImmediateAckFrame& frame) override; @@ -465,7 +467,8 @@ class MockQuicConnectionVisitor : public QuicConnectionVisitorInterface { MOCK_METHOD(void, OnResetStreamAt, (const QuicResetStreamAtFrame& frame), (override)); MOCK_METHOD(void, OnGoAway, (const QuicGoAwayFrame& frame), (override)); - MOCK_METHOD(void, OnMessageReceived, (absl::string_view message), (override)); + MOCK_METHOD(void, OnDatagramReceived, (absl::string_view datagram), + (override)); MOCK_METHOD(void, OnHandshakeDoneReceived, (), (override)); MOCK_METHOD(void, OnNewTokenReceived, (absl::string_view token), (override)); MOCK_METHOD(void, OnConnectionClosed, @@ -529,6 +532,7 @@ class MockQuicConnectionVisitor : public QuicConnectionVisitorInterface { MOCK_METHOD(void, MaybeBundleOpportunistically, (), (override)); MOCK_METHOD(QuicByteCount, GetFlowControlSendWindowSize, (QuicStreamId), (override)); + MOCK_METHOD(bool, MaybeMitigateWriteError, (const WriteResult&), (override)); }; class MockQuicConnectionHelper : public QuicConnectionHelperInterface { @@ -664,8 +668,8 @@ class MockQuicConnection : public QuicConnection { MOCK_METHOD(void, OnStreamReset, (QuicStreamId, QuicRstStreamErrorCode), (override)); MOCK_METHOD(bool, SendControlFrame, (const QuicFrame& frame), (override)); - MOCK_METHOD(MessageStatus, SendMessage, - (QuicMessageId, absl::Span, bool), + MOCK_METHOD(DatagramStatus, SendDatagram, + (QuicDatagramId, absl::Span, bool), (override)); MOCK_METHOD(bool, SendPathChallenge, (const QuicPathFrameBuffer&, const QuicSocketAddress&, @@ -1370,7 +1374,7 @@ class MockQuicConnectionDebugVisitor : public QuicConnectionDebugVisitor { MOCK_METHOD(void, OnNewTokenFrame, (const QuicNewTokenFrame&), (override)); - MOCK_METHOD(void, OnMessageFrame, (const QuicMessageFrame&), (override)); + MOCK_METHOD(void, OnDatagramFrame, (const QuicDatagramFrame&), (override)); MOCK_METHOD(void, OnStopSendingFrame, (const QuicStopSendingFrame&), (override)); @@ -1459,7 +1463,7 @@ class MockQuicPathValidationContext : public QuicPathValidationContext { const QuicSocketAddress& effective_peer_address, QuicPacketWriter* writer) : QuicPathValidationContext(self_address, peer_address, - effective_peer_address), + effective_peer_address, /*network=*/-1), writer_(writer) {} QuicPacketWriter* WriterToUse() override { return writer_; } @@ -1939,8 +1943,8 @@ class TestPacketWriter : public QuicPacketWriter { return framer_.ping_frames(); } - const std::vector& message_frames() const { - return framer_.message_frames(); + const std::vector& datagram_frames() const { + return framer_.datagram_frames(); } const std::vector& window_update_frames() const { @@ -2144,19 +2148,17 @@ bool WriteServerVersionNegotiationProbeResponse( class SavingHttp3DatagramVisitor : public QuicSpdyStream::Http3DatagramVisitor { public: struct SavedHttp3Datagram { + bool operator==(const SavedHttp3Datagram&) const = default; + QuicStreamId stream_id; std::string payload; - bool operator==(const SavedHttp3Datagram& o) const { - return stream_id == o.stream_id && payload == o.payload; - } }; struct SavedUnknownCapsule { + bool operator==(const SavedUnknownCapsule&) const = default; + QuicStreamId stream_id; uint64_t type; std::string payload; - bool operator==(const SavedUnknownCapsule& o) const { - return stream_id == o.stream_id && type == o.type && payload == o.payload; - } }; const std::vector& received_h3_datagrams() const { return received_h3_datagrams_; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simple_quic_framer.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simple_quic_framer.cc index 90b75e8f9f..00e1c133c6 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simple_quic_framer.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simple_quic_framer.cc @@ -222,9 +222,9 @@ class SimpleFramerVisitor : public QuicFramerVisitorInterface { return true; } - bool OnMessageFrame(const QuicMessageFrame& frame) override { - message_frames_.emplace_back(frame.data, frame.message_length); - frame_types_.push_back(MESSAGE_FRAME); + bool OnDatagramFrame(const QuicDatagramFrame& frame) override { + datagram_frames_.emplace_back(frame.data, frame.datagram_length); + frame_types_.push_back(DATAGRAM_FRAME); return true; } @@ -303,8 +303,8 @@ class SimpleFramerVisitor : public QuicFramerVisitorInterface { return stop_waiting_frames_; } const std::vector& ping_frames() const { return ping_frames_; } - const std::vector& message_frames() const { - return message_frames_; + const std::vector& datagram_frames() const { + return datagram_frames_; } const std::vector& window_update_frames() const { return window_update_frames_; @@ -352,7 +352,7 @@ class SimpleFramerVisitor : public QuicFramerVisitorInterface { std::vector new_connection_id_frames_; std::vector retire_connection_id_frames_; std::vector new_token_frames_; - std::vector message_frames_; + std::vector datagram_frames_; std::vector handshake_done_frames_; std::vector ack_frequency_frames_; std::vector immediate_ack_frames_; @@ -445,8 +445,9 @@ const std::vector& SimpleQuicFramer::ping_frames() const { return visitor_->ping_frames(); } -const std::vector& SimpleQuicFramer::message_frames() const { - return visitor_->message_frames(); +const std::vector& SimpleQuicFramer::datagram_frames() + const { + return visitor_->datagram_frames(); } const std::vector& diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simple_quic_framer.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simple_quic_framer.h index 53f883e461..49a3a924d3 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simple_quic_framer.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simple_quic_framer.h @@ -42,7 +42,7 @@ class SimpleQuicFramer { const std::vector& path_challenge_frames() const; const std::vector& path_response_frames() const; const std::vector& ping_frames() const; - const std::vector& message_frames() const; + const std::vector& datagram_frames() const; const std::vector& window_update_frames() const; const std::vector& goaway_frames() const; const std::vector& rst_stream_frames() const; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint.h index f74718a404..210e4a89de 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint.h @@ -56,7 +56,7 @@ class QuicEndpoint : public QuicEndpointBase, void OnRstStream(const QuicRstStreamFrame& /*frame*/) override {} void OnResetStreamAt(const QuicResetStreamAtFrame& /*frame*/) override {} void OnGoAway(const QuicGoAwayFrame& /*frame*/) override {} - void OnMessageReceived(absl::string_view /*message*/) override {} + void OnDatagramReceived(absl::string_view /*datagram*/) override {} void OnHandshakeDoneReceived() override {} void OnNewTokenReceived(absl::string_view /*token*/) override {} void OnConnectionClosed(const QuicConnectionCloseFrame& /*frame*/, @@ -118,6 +118,9 @@ class QuicEndpoint : public QuicEndpointBase, QuicByteCount GetFlowControlSendWindowSize(QuicStreamId /*id*/) override { return std::numeric_limits::max(); } + bool MaybeMitigateWriteError(const WriteResult& /*write_result*/) override { + return false; + } // End QuicConnectionVisitorInterface implementation. diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint_base.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint_base.h index 336b2f90cf..797bfd6dd8 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint_base.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint_base.h @@ -7,6 +7,7 @@ #include +#include "absl/base/nullability.h" #include "absl/container/flat_hash_map.h" #include "quiche/quic/core/crypto/null_decrypter.h" #include "quiche/quic/core/crypto/null_encrypter.h" @@ -69,6 +70,11 @@ class QuicEndpointBase : public Endpoint, // Queue::ListenerInterface method. void OnPacketDequeued() override; + // Returns the trace visitor associated with the connection. + QuicTraceVisitor* absl_nullable trace_visitor() { + return trace_visitor_.get(); + } + protected: // A Writer object that writes into the |nic_tx_queue_|. class Writer : public QuicPacketWriter { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.cc index 39c43ad9f2..d2450e0d00 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.cc @@ -18,6 +18,7 @@ #include "quiche/quic/core/quic_constants.h" #include "quiche/quic/core/quic_crypto_client_stream.h" #include "quiche/quic/core/quic_error_codes.h" +#include "quiche/quic/core/quic_force_blockable_packet_writer.h" #include "quiche/quic/core/quic_packet_writer.h" #include "quiche/quic/core/quic_path_validator.h" #include "quiche/quic/core/quic_server_id.h" @@ -193,7 +194,18 @@ bool QuicClientBase::Connect() { void QuicClientBase::StartConnect() { QUICHE_DCHECK(initialized_); QUICHE_DCHECK(!connected()); - QuicPacketWriter* writer = network_helper_->CreateQuicPacketWriter(); + QuicPacketWriter* writer = nullptr; + if (!handle_migration_in_session_) { + writer = network_helper_->CreateQuicPacketWriter(); + } else { + // To support connection/port migration using migration manager, the writer + // needs to be force blockable. + auto* force_blockable_writer = new QuicForceBlockablePacketWriter(); + // Owns `inner_writer`. + force_blockable_writer->set_writer( + network_helper_->CreateQuicPacketWriter()); + writer = force_blockable_writer; + } ParsedQuicVersion mutual_version = UnsupportedQuicVersion(); const bool can_reconnect_with_different_version = CanReconnectWithDifferentVersion(&mutual_version); diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.h index 2b9176e3fe..9f59c960e5 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.h @@ -39,6 +39,7 @@ class QUIC_EXPORT_PRIVATE PathMigrationContext alternative_writer_(std::move(writer)) {} QuicPacketWriter* WriterToUse() override { return alternative_writer_.get(); } + bool ShouldConnectionOwnWriter() const override { return false; } QuicPacketWriter* ReleaseWriter() { return alternative_writer_.release(); } @@ -350,6 +351,11 @@ class QuicClientBase : public QuicSession::Visitor { virtual void OnSocketMigrationProbingFailure() {} + // Must be called before the initial Connect() call. + void set_handle_migration_in_session(bool handle_migration_in_session) { + handle_migration_in_session_ = handle_migration_in_session; + } + protected: // TODO(rch): Move GetNumSentClientHellosFromSession and // GetNumReceivedServerConfigUpdatesFromSession into a new/better @@ -395,6 +401,10 @@ class QuicClientBase : public QuicSession::Visitor { // Allows derived classes to access this when creating connections. ConnectionIdGeneratorInterface& connection_id_generator(); + bool handle_migration_in_session() const { + return handle_migration_in_session_; + } + private: // Returns true and set |version| if client can reconnect with a different // version. @@ -492,6 +502,9 @@ class QuicClientBase : public QuicSession::Visitor { bool allow_port_migration_{false}; uint32_t num_path_degrading_handled_{0}; + // If true, the migration will be handled in the session instead of the + // client. + bool handle_migration_in_session_{false}; }; } // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.cc index 0fac1e573b..539b02c9c7 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.cc @@ -16,6 +16,7 @@ #include "quiche/quic/core/quic_packets.h" #include "quiche/quic/core/quic_types.h" #include "quiche/quic/core/quic_udp_socket.h" +#include "quiche/quic/platform/api/quic_flag_utils.h" #include "quiche/quic/platform/api/quic_logging.h" #include "quiche/quic/platform/api/quic_socket_address.h" #include "quiche/common/platform/api/quiche_logging.h" @@ -176,7 +177,15 @@ void QuicClientDefaultNetworkHelper::OnSocketEvent( } if (client_->connected() && (events & kSocketEventWritable)) { client_->writer()->SetWritable(); - client_->session()->connection()->OnCanWrite(); + if (GetQuicReloadableFlag(quic_client_check_blockage_before_on_can_write)) { + QUIC_RELOADABLE_FLAG_COUNT( + quic_client_check_blockage_before_on_can_write); + // SetWritable() may not unblock the writer if it's forcefully blocked for + // migration. + client_->session()->connection()->WriteIfNotBlocked(); + } else { + client_->session()->connection()->OnCanWrite(); + } } } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.cc index 1a202a8cde..9ddc291ceb 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.cc @@ -7,14 +7,127 @@ #include #include +#include "absl/container/flat_hash_map.h" +#include "absl/memory/memory.h" +#include "quiche/quic/core/crypto/proof_verifier.h" +#include "quiche/quic/core/crypto/quic_crypto_client_config.h" +#include "quiche/quic/core/http/quic_connection_migration_manager.h" +#include "quiche/quic/core/io/quic_event_loop.h" #include "quiche/quic/core/quic_connection.h" #include "quiche/quic/core/quic_default_connection_helper.h" +#include "quiche/quic/core/quic_packet_writer.h" +#include "quiche/quic/core/quic_path_context_factory.h" +#include "quiche/quic/core/quic_path_validator.h" #include "quiche/quic/core/quic_server_id.h" +#include "quiche/quic/core/quic_session.h" +#include "quiche/quic/core/quic_versions.h" +#include "quiche/quic/platform/api/quic_ip_address.h" #include "quiche/quic/platform/api/quic_socket_address.h" +#include "quiche/quic/tools/quic_client_base.h" +#include "quiche/quic/tools/quic_client_default_network_helper.h" #include "quiche/quic/tools/quic_simple_client_session.h" +#include "quiche/quic/tools/quic_spdy_client_base.h" +#include "quiche/common/platform/api/quiche_bug_tracker.h" +#include "quiche/common/platform/api/quiche_logging.h" namespace quic { +// A path context which owns the writer. +class QUIC_EXPORT_PRIVATE PathValidationContextForMigrationManager + : public QuicClientPathValidationContext { + public: + PathValidationContextForMigrationManager( + std::unique_ptr writer, + const QuicSocketAddress& self_address, + const QuicSocketAddress& peer_address, QuicNetworkHandle network) + : QuicClientPathValidationContext(self_address, peer_address, network), + alternative_writer_(std::move(writer)) {} + + QuicForceBlockablePacketWriter* ForceBlockableWriterToUse() override { + return alternative_writer_.get(); + } + bool ShouldConnectionOwnWriter() const override { return false; } + + QuicPacketWriter* ReleaseWriter() { return alternative_writer_.release(); } + + private: + std::unique_ptr alternative_writer_; +}; + +class QuicDefaultPathContextFactory : public QuicPathContextFactory { + public: + QuicDefaultPathContextFactory( + QuicDefaultClient::QuicDefaultMigrationHelper& migration_helper, + QuicClientBase::NetworkHelper* network_helper) + : migration_helper_(migration_helper), network_helper_(network_helper) {} + + void CreatePathValidationContext( + QuicNetworkHandle network, QuicSocketAddress peer_address, + std::unique_ptr result_delegate) override { + QuicIpAddress self_address = + migration_helper_.GetAddressForNetwork(network); + if (network_helper_ == nullptr || !network_helper_->CreateUDPSocketAndBind( + peer_address, self_address, 0)) { + result_delegate->OnCreationFailed(network, + "Failed to create UDP socket."); + QUICHE_LOG(ERROR) << "Failed to create UDP socket."; + return; + } + QuicPacketWriter* writer = network_helper_->CreateQuicPacketWriter(); + if (writer == nullptr) { + result_delegate->OnCreationFailed(network, + "Failed to create QuicPacketWriter."); + QUICHE_LOG(ERROR) << "Failed to create QuicPacketWriter."; + return; + } + auto force_blockable_writer = + std::make_unique(); + force_blockable_writer->set_writer(writer); + return result_delegate->OnCreationSucceeded( + std::make_unique( + std::move(force_blockable_writer), + network_helper_->GetLatestClientAddress(), peer_address, network)); + } + + private: + QuicDefaultClient::QuicDefaultMigrationHelper& migration_helper_; + QuicClientBase::NetworkHelper* network_helper_; +}; + +std::unique_ptr +QuicDefaultClient::QuicDefaultMigrationHelper::CreateQuicPathContextFactory() { + return std::make_unique( + *this, client_.network_helper()); +} + +void QuicDefaultClient::QuicDefaultMigrationHelper::OnMigrationToPathDone( + std::unique_ptr context, bool success) { + if (success) { + auto migration_context = + absl::WrapUnique(static_cast( + context.release())); + client_.set_writer(migration_context->ReleaseWriter()); + } else { + QUICHE_LOG(ERROR) << "Failed to migrate to path."; + } +} + +QuicIpAddress +QuicDefaultClient::QuicDefaultMigrationHelper::GetAddressForNetwork( + QuicNetworkHandle network) const { + QUICHE_BUG_IF(network_handle_not_supported, network != kInvalidNetworkHandle) + << "network handle is not supported on this"; + return client_.session()->connection()->self_address().host(); +} + +QuicNetworkHandle +QuicDefaultClient::QuicDefaultMigrationHelper::FindAlternateNetwork( + QuicNetworkHandle /*network*/) { + QUICHE_BUG(alternative_network_not_supported) + << "Alternative network interface is not supported on this client."; + return kInvalidNetworkHandle; +} + QuicDefaultClient::QuicDefaultClient( QuicSocketAddress server_address, const QuicServerId& server_id, const ParsedQuicVersionVector& supported_versions, @@ -81,11 +194,43 @@ QuicDefaultClient::QuicDefaultClient( set_server_address(server_address); } +void QuicDefaultClient::OnServerPreferredAddressAvailable( + const QuicSocketAddress& server_preferred_address) { + if (!handle_migration_in_session()) { + QuicSpdyClientBase::OnServerPreferredAddressAvailable( + server_preferred_address); + } +} + +void QuicDefaultClient::OnPathDegrading() { + if (!handle_migration_in_session()) { + QuicSpdyClientBase::OnPathDegrading(); + } +} + QuicDefaultClient::~QuicDefaultClient() = default; +bool QuicDefaultClient::Initialize() { + migration_helper_ = CreateQuicMigrationHelper(); + return QuicSpdyClientBase::Initialize(); +} + +std::unique_ptr +QuicDefaultClient::CreateQuicMigrationHelper() { + return std::make_unique(*this); +} + std::unique_ptr QuicDefaultClient::CreateQuicClientSession( const ParsedQuicVersionVector& supported_versions, QuicConnection* connection) { + if (handle_migration_in_session()) { + return std::make_unique( + *config(), supported_versions, connection, this, + static_cast(connection->writer()), + migration_helper_.get(), migration_config_, network_helper(), + server_id(), crypto_config(), drop_response_body(), + enable_web_transport()); + } return std::make_unique( *config(), supported_versions, connection, this, network_helper(), server_id(), crypto_config(), drop_response_body(), diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.h index 8ef170db80..867e311244 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.h @@ -12,9 +12,18 @@ #include #include +#include "absl/container/flat_hash_map.h" #include "quiche/quic/core/io/quic_event_loop.h" #include "quiche/quic/core/quic_config.h" +#include "quiche/quic/core/quic_connection.h" +#include "quiche/quic/core/quic_path_context_factory.h" +#include "quiche/quic/core/quic_path_validator.h" +#include "quiche/quic/core/quic_session.h" +#include "quiche/quic/core/quic_versions.h" +#include "quiche/quic/platform/api/quic_ip_address.h" +#include "quiche/quic/platform/api/quic_socket_address.h" #include "quiche/quic/tools/quic_client_default_network_helper.h" +#include "quiche/quic/tools/quic_simple_client_session.h" #include "quiche/quic/tools/quic_spdy_client_base.h" namespace quic { @@ -27,6 +36,37 @@ class QuicDefaultClientPeer; class QuicDefaultClient : public QuicSpdyClientBase { public: + // An implementation that only creates path validation contexts but does not + // support network handles or alternative networks. + class QuicDefaultMigrationHelper : public QuicMigrationHelper { + public: + explicit QuicDefaultMigrationHelper(QuicDefaultClient& client) + : client_(client) {} + + void OnMigrationToPathDone( + std::unique_ptr context, + bool success) override; + + std::unique_ptr CreateQuicPathContextFactory() + override; + + QuicNetworkHandle FindAlternateNetwork(QuicNetworkHandle network) override; + + QuicNetworkHandle GetDefaultNetwork() override { + return kInvalidNetworkHandle; + } + + QuicNetworkHandle GetCurrentNetwork() override { + return kInvalidNetworkHandle; + } + + // Returns a specific address for a given network handle. + virtual QuicIpAddress GetAddressForNetwork(QuicNetworkHandle network) const; + + private: + QuicDefaultClient& client_; + }; + // These will create their own QuicClientDefaultNetworkHelper. QuicDefaultClient(QuicSocketAddress server_address, const QuicServerId& server_id, @@ -71,6 +111,7 @@ class QuicDefaultClient : public QuicSpdyClientBase { ~QuicDefaultClient() override; // QuicSpdyClientBase overrides. + bool Initialize() override; std::unique_ptr CreateQuicClientSession( const ParsedQuicVersionVector& supported_versions, QuicConnection* connection) override; @@ -80,6 +121,27 @@ class QuicDefaultClient : public QuicSpdyClientBase { QuicClientDefaultNetworkHelper* default_network_helper(); const QuicClientDefaultNetworkHelper* default_network_helper() const; + + // Overridden to skip handling server preferred address and path degrading + // if the migration manager has already handled them according to the + // migration config. + void OnServerPreferredAddressAvailable( + const QuicSocketAddress& server_preferred_address) override; + void OnPathDegrading() override; + + // Must be called before `Connect()`. + void set_migration_config( + const QuicConnectionMigrationConfig& migration_config) { + migration_config_ = migration_config; + } + + protected: + // Called during Initialize() to create the migration helper. + virtual std::unique_ptr CreateQuicMigrationHelper(); + + private: + std::unique_ptr migration_helper_; + QuicConnectionMigrationConfig migration_config_; }; } // namespace quic diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.cc index 1f6956f770..037971b460 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.cc @@ -129,7 +129,7 @@ void QuicMemoryCacheBackend::ResourceFile::HandleXOriginalUrl() { const QuicBackendResponse* QuicMemoryCacheBackend::GetResponse( absl::string_view host, absl::string_view path) const { - absl::WriterMutexLock lock(&response_mutex_); + absl::WriterMutexLock lock(response_mutex_); auto it = responses_.find(GetKey(host, path)); if (it == responses_.end()) { @@ -164,7 +164,7 @@ void QuicMemoryCacheBackend::AddSimpleResponse(absl::string_view host, } void QuicMemoryCacheBackend::AddDefaultResponse(QuicBackendResponse* response) { - absl::WriterMutexLock lock(&response_mutex_); + absl::WriterMutexLock lock(response_mutex_); default_response_.reset(response); } @@ -191,7 +191,7 @@ void QuicMemoryCacheBackend::AddResponse(absl::string_view host, bool QuicMemoryCacheBackend::SetResponseDelay(absl::string_view host, absl::string_view path, QuicTime::Delta delay) { - absl::WriterMutexLock lock(&response_mutex_); + absl::WriterMutexLock lock(response_mutex_); auto it = responses_.find(GetKey(host, path)); if (it == responses_.end()) return false; @@ -269,7 +269,7 @@ bool QuicMemoryCacheBackend::InitializeBackend( } void QuicMemoryCacheBackend::GenerateDynamicResponses() { - absl::WriterMutexLock lock(&response_mutex_); + absl::WriterMutexLock lock(response_mutex_); // Add a generate bytes response. quiche::HttpHeaderBlock response_headers; response_headers[":status"] = "200"; @@ -360,7 +360,7 @@ QuicMemoryCacheBackend::ProcessWebTransportRequest( QuicMemoryCacheBackend::~QuicMemoryCacheBackend() { { - absl::WriterMutexLock lock(&response_mutex_); + absl::WriterMutexLock lock(response_mutex_); responses_.clear(); } } @@ -370,7 +370,7 @@ void QuicMemoryCacheBackend::AddResponseImpl( SpecialResponseType response_type, HttpHeaderBlock response_headers, absl::string_view response_body, HttpHeaderBlock response_trailers, const std::vector& early_hints) { - absl::WriterMutexLock lock(&response_mutex_); + absl::WriterMutexLock lock(response_mutex_); QUICHE_DCHECK(!host.empty()) << "Host must be populated, e.g. \"www.google.com\""; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_packet_printer_bin.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_packet_printer_bin.cc index 9aad0aa826..fd7cb15d41 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_packet_printer_bin.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_packet_printer_bin.cc @@ -203,8 +203,8 @@ class QuicPacketPrinter : public QuicFramerVisitorInterface { std::cerr << "OnBlockedFrame: " << frame; return true; } - bool OnMessageFrame(const QuicMessageFrame& frame) override { - std::cerr << "OnMessageFrame: " << frame; + bool OnDatagramFrame(const QuicDatagramFrame& frame) override { + std::cerr << "OnDatagramFrame: " << frame; return true; } bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_server.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_server.cc index 1578161b08..1d82f62f07 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_server.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_server.cc @@ -48,19 +48,23 @@ const char kSourceAddressTokenSecret[] = "secret"; } // namespace QuicServer::QuicServer(std::unique_ptr proof_source, + std::unique_ptr proof_verifier, QuicSimpleServerBackend* quic_simple_server_backend) - : QuicServer(std::move(proof_source), quic_simple_server_backend, - AllSupportedVersions()) {} + : QuicServer(std::move(proof_source), std::move(proof_verifier), + quic_simple_server_backend, AllSupportedVersions()) {} QuicServer::QuicServer(std::unique_ptr proof_source, + std::unique_ptr proof_verifier, QuicSimpleServerBackend* quic_simple_server_backend, const ParsedQuicVersionVector& supported_versions) - : QuicServer(std::move(proof_source), QuicConfig(), - QuicCryptoServerConfig::ConfigOptions(), supported_versions, - quic_simple_server_backend, kQuicDefaultConnectionIdLength) {} + : QuicServer(std::move(proof_source), std::move(proof_verifier), + QuicConfig(), QuicCryptoServerConfig::ConfigOptions(), + supported_versions, quic_simple_server_backend, + kQuicDefaultConnectionIdLength) {} QuicServer::QuicServer( - std::unique_ptr proof_source, const QuicConfig& config, + std::unique_ptr proof_source, + std::unique_ptr proof_verifier, const QuicConfig& config, const QuicCryptoServerConfig::ConfigOptions& crypto_config_options, const ParsedQuicVersionVector& supported_versions, QuicSimpleServerBackend* quic_simple_server_backend, @@ -68,7 +72,8 @@ QuicServer::QuicServer( : silent_close_(false), config_(config), crypto_config_(kSourceAddressTokenSecret, QuicRandom::GetInstance(), - std::move(proof_source), KeyExchangeSource::Default()), + std::move(proof_source), KeyExchangeSource::Default(), + std::move(proof_verifier)), crypto_config_options_(crypto_config_options), version_manager_(supported_versions), quic_simple_server_backend_(quic_simple_server_backend), diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_server.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_server.h index 15d02808d2..56fb4616f8 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_server.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_server.h @@ -17,6 +17,7 @@ #include "absl/strings/string_view.h" #include "quiche/quic/core/connection_id_generator.h" +#include "quiche/quic/core/crypto/proof_verifier.h" #include "quiche/quic/core/crypto/quic_crypto_server_config.h" #include "quiche/quic/core/deterministic_connection_id_generator.h" #include "quiche/quic/core/io/quic_event_loop.h" @@ -46,11 +47,14 @@ class QuicServer : public QuicSpdyServerBase { public: // `quic_simple_server_backend` must outlive the created QuicServer. QuicServer(std::unique_ptr proof_source, + std::unique_ptr proof_verifier, QuicSimpleServerBackend* quic_simple_server_backend); QuicServer(std::unique_ptr proof_source, + std::unique_ptr proof_verifier, QuicSimpleServerBackend* quic_simple_server_backend, const ParsedQuicVersionVector& supported_versions); QuicServer(std::unique_ptr proof_source, + std::unique_ptr proof_verifier, const QuicConfig& config, const QuicCryptoServerConfig::ConfigOptions& crypto_config_options, const ParsedQuicVersionVector& supported_versions, diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_server_factory.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_server_factory.cc index c044c21e43..3c5644049a 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_server_factory.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_server_factory.cc @@ -15,7 +15,8 @@ std::unique_ptr QuicServerFactory::CreateServer( quic::QuicSimpleServerBackend* backend, std::unique_ptr proof_source, const quic::ParsedQuicVersionVector& supported_versions) { - return std::make_unique(std::move(proof_source), backend, + return std::make_unique(std::move(proof_source), + /*proof_verifier=*/nullptr, backend, supported_versions); } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.cc index b776ac0e3e..7d0e50ebfd 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.cc @@ -7,6 +7,7 @@ #include #include +#include "quiche/quic/core/http/quic_spdy_client_session.h" #include "quiche/quic/core/quic_path_validator.h" #include "quiche/quic/core/quic_types.h" #include "quiche/common/http/http_header_block.h" @@ -29,11 +30,28 @@ QuicSimpleClientSession::QuicSimpleClientSession( QuicClientBase::NetworkHelper* network_helper, const QuicServerId& server_id, QuicCryptoClientConfig* crypto_config, bool drop_response_body, bool enable_web_transport) - : QuicSpdyClientSession(config, supported_versions, connection, visitor, - server_id, crypto_config, - enable_web_transport - ? QuicPriorityType::kWebTransport - : QuicPriorityType::kHttp), + : QuicSimpleClientSession(config, supported_versions, connection, visitor, + /*writer=*/nullptr, + /*migration_helper=*/nullptr, + QuicConnectionMigrationConfig{ + .allow_server_preferred_address = false}, + network_helper, server_id, crypto_config, + drop_response_body, enable_web_transport) {} + +QuicSimpleClientSession::QuicSimpleClientSession( + const QuicConfig& config, const ParsedQuicVersionVector& supported_versions, + QuicConnection* connection, QuicSession::Visitor* visitor, + QuicForceBlockablePacketWriter* absl_nullable writer, + QuicMigrationHelper* absl_nullable migration_helper, + const QuicConnectionMigrationConfig& migration_config, + QuicClientBase::NetworkHelper* network_helper, + const QuicServerId& server_id, QuicCryptoClientConfig* crypto_config, + bool drop_response_body, bool enable_web_transport) + : QuicSpdyClientSession( + config, supported_versions, connection, visitor, writer, + migration_helper, migration_config, server_id, crypto_config, + enable_web_transport ? QuicPriorityType::kWebTransport + : QuicPriorityType::kHttp), network_helper_(network_helper), drop_response_body_(drop_response_body), enable_web_transport_(enable_web_transport) {} diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.h b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.h index 1e9c524e1b..41bd52a8c2 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.h @@ -35,6 +35,18 @@ class QuicSimpleClientSession : public QuicSpdyClientSession { QuicCryptoClientConfig* crypto_config, bool drop_response_body, bool enable_web_transport); + QuicSimpleClientSession(const QuicConfig& config, + const ParsedQuicVersionVector& supported_versions, + QuicConnection* connection, + QuicSession::Visitor* visitor, + QuicForceBlockablePacketWriter* absl_nullable writer, + QuicMigrationHelper* absl_nullable migration_helper, + const QuicConnectionMigrationConfig& migration_config, + QuicClientBase::NetworkHelper* network_helper, + const QuicServerId& server_id, + QuicCryptoClientConfig* crypto_config, + bool drop_response_body, bool enable_web_transport); + std::unique_ptr CreateClientStream() override; WebTransportHttp3VersionSet LocallySupportedWebTransportVersions() const override; diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_toy_client.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_toy_client.cc index 1857025f77..4d366f7a2e 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_toy_client.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_toy_client.cc @@ -235,11 +235,14 @@ std::unique_ptr CreateTestClientProofSource( } auto proof_source = std::make_unique(); - proof_source->AddCertAndKey( - {"*"}, - quiche::QuicheReferenceCountedPointer( - new ClientProofSource::Chain(certs)), - std::move(*private_key)); + if (!proof_source->AddCertAndKey( + {"*"}, + quiche::QuicheReferenceCountedPointer( + new ClientProofSource::Chain(certs)), + std::move(*private_key))) { + std::cerr << "Failed to add client cert and key." << std::endl; + return nullptr; + } return proof_source; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_url.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_url.cc index 7eaa8c0ac5..de026efdff 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_url.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/quic_url.cc @@ -48,12 +48,11 @@ std::string QuicUrl::HostPort() const { return ""; } - std::string host = url_.host(); int port = url_.IntPort(); if (port == url::PORT_UNSPECIFIED) { - return host; + return std::string(url_.host()); } - return absl::StrCat(host, ":", port); + return absl::StrCat(url_.host(), ":", port); } std::string QuicUrl::PathParamsQuery() const { @@ -69,7 +68,7 @@ std::string QuicUrl::scheme() const { return ""; } - return url_.scheme(); + return std::string(url_.scheme()); } std::string QuicUrl::host() const { @@ -85,7 +84,7 @@ std::string QuicUrl::path() const { return ""; } - return url_.path(); + return std::string(url_.path()); } uint16_t QuicUrl::port() const { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/web_transport_test_server.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/web_transport_test_server.cc index 359021e5b5..c1f07073d4 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/web_transport_test_server.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/quic/tools/web_transport_test_server.cc @@ -44,7 +44,7 @@ absl::StatusOr> ProcessRequest( int count = 1; DeviousBatonValue initial_value = quiche::QuicheRandom::GetInstance()->RandUint64() % 256; - std::string query = url.query(); + std::string query = std::string(url.query()); url::Component query_component, key_component, value_component; query_component.begin = 0; query_component.len = query.size(); @@ -83,7 +83,8 @@ int Main(int argc, char** argv) { quiche::QuicheParseCommandLineFlags(usage, argc, argv); WebTransportOnlyBackend backend(ProcessRequest); - QuicServer server(quiche::CreateDefaultProofSource(), &backend); + QuicServer server(quiche::CreateDefaultProofSource(), + /*proof_verifier=*/nullptr, &backend); quic::QuicSocketAddress addr(quic::QuicIpAddress::Any6(), quiche::GetQuicheCommandLineFlag(FLAGS_port)); if (!server.CreateUDPSocketAndListen(addr)) { diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/web_transport/test_tools/in_memory_stream.cc b/naiveproxy/src/net/third_party/quiche/src/quiche/web_transport/test_tools/in_memory_stream.cc index 724f4f8791..3b28a6023e 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/web_transport/test_tools/in_memory_stream.cc +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/web_transport/test_tools/in_memory_stream.cc @@ -43,6 +43,9 @@ quiche::ReadStream::PeekResult InMemoryStream::PeekNextReadableRegion() const { return PeekResult{"", fin_received_, fin_received_}; } absl::string_view next_chunk = *buffer_.Chunks().begin(); + if (peek_one_byte_at_a_time_) { + return PeekResult{next_chunk.substr(0, 1), false, fin_received_}; + } return PeekResult{next_chunk, false, fin_received_}; } diff --git a/naiveproxy/src/net/third_party/quiche/src/quiche/web_transport/test_tools/in_memory_stream.h b/naiveproxy/src/net/third_party/quiche/src/quiche/web_transport/test_tools/in_memory_stream.h index 078ca948d3..50fa7a605e 100644 --- a/naiveproxy/src/net/third_party/quiche/src/quiche/web_transport/test_tools/in_memory_stream.h +++ b/naiveproxy/src/net/third_party/quiche/src/quiche/web_transport/test_tools/in_memory_stream.h @@ -70,6 +70,12 @@ class QUICHE_NO_EXPORT InMemoryStream : public Stream { // and executing the visitor callback. void Receive(absl::string_view data, bool fin = false); + // If set to true, PeekNextReadableRegion() will return a single one-byte + // readable region at a time. + void set_peek_one_byte_at_a_time(bool peek_one_byte_at_a_time) { + peek_one_byte_at_a_time_ = peek_one_byte_at_a_time; + } + private: void Terminate(); @@ -79,6 +85,7 @@ class QUICHE_NO_EXPORT InMemoryStream : public Stream { absl::Cord buffer_; bool fin_received_ = false; bool abruptly_terminated_ = false; + bool peek_one_byte_at_a_time_ = false; }; } // namespace webtransport::test diff --git a/naiveproxy/src/net/third_party/uri_template/README.chromium b/naiveproxy/src/net/third_party/uri_template/README.chromium index c0411061ec..badef8cffe 100644 --- a/naiveproxy/src/net/third_party/uri_template/README.chromium +++ b/naiveproxy/src/net/third_party/uri_template/README.chromium @@ -3,10 +3,11 @@ Short Name: uri_template URL: https://github.com/google/google-api-cpp-client/ Revision: d0bbe169d81a50936ec5fcea4e6dbcfb97303f13 Update Mechanism: Manual -Date: August 6, 2018 +Date: 2018-08-06 License: Apache-2.0 License File: LICENSE Shipped: yes +Security Critical: yes Description: This code is derived from the URI template parsing code in the Google API C++ diff --git a/naiveproxy/src/net/tools/dump_cache/dump_cache.cc b/naiveproxy/src/net/tools/dump_cache/dump_cache.cc index dd217842e6..367b4f6c2d 100644 --- a/naiveproxy/src/net/tools/dump_cache/dump_cache.cc +++ b/naiveproxy/src/net/tools/dump_cache/dump_cache.cc @@ -47,7 +47,7 @@ const char kDumpFile[] = "file"; int Help() { printf("dump_cache path_to_files [options]\n"); - printf("Dumps internal cache structures.\n"); + printf("Dumps internal cache structures for blockfile cache.\n"); printf("warning: input files may be modified by this tool\n\n"); printf("--dump-headers: show file headers\n"); printf("--dump-contents [-v] [--full-key] [--csv]: list all entries\n"); diff --git a/naiveproxy/src/net/tools/naive/naive_config.cc b/naiveproxy/src/net/tools/naive/naive_config.cc index e34dd5bfae..74a3d38d65 100644 --- a/naiveproxy/src/net/tools/naive/naive_config.cc +++ b/naiveproxy/src/net/tools/naive/naive_config.cc @@ -6,7 +6,6 @@ #include #include -#include "base/environment.h" #include "base/strings/escape.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_tokenizer.h" @@ -175,7 +174,7 @@ bool NaiveConfig::Parse(const base::Value::Dict& value) { << std::endl; return false; } - origins_to_force_quic_on.insert(HostPortPair::FromURL(url)); + origins_to_force_quic_on.insert(url::SchemeHostPort(url)); } else if (last.is_https() || last.is_http() || last.is_socks()) { seen_tcp = true; } else { @@ -286,39 +285,6 @@ bool NaiveConfig::Parse(const base::Value::Dict& value) { no_post_quantum = true; } - if (const base::Value* v = value.Find("env")) { - std::vector env_strs; - if (const std::string* str = v->GetIfString(); str && !str->empty()) { - env_strs.push_back(*str); - } else if (const base::Value::List* strs = v->GetIfList()) { - for (const auto& str_e : *strs) { - if (const std::string* s = str_e.GetIfString(); s && !s->empty()) { - env_strs.push_back(*s); - } else { - std::cerr << "Invalid env element" << std::endl; - return false; - } - } - } else { - std::cerr << "Invalid env argument" << std::endl; - return false; - } - auto env = base::Environment::Create(); - for (const std::string& str : env_strs) { - size_t equal_pos = str.find_first_of('='); - if (equal_pos != std::string::npos && equal_pos > 0 && - equal_pos + 1 < str.size()) { - std::string env_name = str.substr(0, equal_pos); - std::string env_value = str.substr(equal_pos + 1); - if (!env->SetVar(env_name, env_value)) { - std::cerr << "Invalid env element " << str << std::endl; - } - } else { - std::cerr << "Invalid env element " << str << std::endl; - } - } - } - return true; } diff --git a/naiveproxy/src/net/tools/naive/naive_config.h b/naiveproxy/src/net/tools/naive/naive_config.h index 2dd8bd2778..171a4a1238 100644 --- a/naiveproxy/src/net/tools/naive/naive_config.h +++ b/naiveproxy/src/net/tools/naive/naive_config.h @@ -45,7 +45,7 @@ struct NaiveConfig { // The last server is assumed to be Naive. std::vector proxy_chains; - std::set origins_to_force_quic_on; + std::set origins_to_force_quic_on; std::map auth_store; std::string host_resolver_rules; diff --git a/naiveproxy/src/net/tools/naive/naive_proxy_bin.cc b/naiveproxy/src/net/tools/naive/naive_proxy_bin.cc index c54ce735fc..f6dd22503f 100644 --- a/naiveproxy/src/net/tools/naive/naive_proxy_bin.cc +++ b/naiveproxy/src/net/tools/naive/naive_proxy_bin.cc @@ -13,7 +13,6 @@ #include "base/at_exit.h" #include "base/check.h" #include "base/command_line.h" -#include "base/environment.h" #include "base/feature_list.h" #include "base/files/file_path.h" #include "base/json/json_file_value_serializer.h" @@ -86,6 +85,12 @@ #include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h" #endif +#if BUILDFLAG(IS_APPLE) +#if PA_BUILDFLAG(USE_ALLOCATOR_SHIM) +#include "partition_alloc/shim/allocator_shim.h" +#endif +#endif // BUILDFLAG(IS_MAC) + namespace { constexpr int kListenBackLog = 512; @@ -246,7 +251,6 @@ std::unique_ptr BuildURLRequestContext( struct NoPostQuantum : public SSLConfigService { SSLContextConfig GetSSLContextConfig() override { SSLContextConfig config; - config.post_quantum_key_agreement_enabled = false; return config; } @@ -534,7 +538,7 @@ int main(int argc, char* argv[]) { naive_proxies.push_back(std::move(naive_proxy)); } - if (base::Environment::Create()->HasVar("TEST_MARK_STARTUP")) { + if (getenv("TEST_MARK_STARTUP") != nullptr) { LOG(INFO) << "TEST_MARK_STARTUP"; } base::RunLoop().Run(); diff --git a/naiveproxy/src/net/tools/naive/naive_proxy_delegate.cc b/naiveproxy/src/net/tools/naive/naive_proxy_delegate.cc index 806934bb8a..9efd1aaae2 100644 --- a/naiveproxy/src/net/tools/naive/naive_proxy_delegate.cc +++ b/naiveproxy/src/net/tools/naive/naive_proxy_delegate.cc @@ -69,36 +69,38 @@ NaiveProxyDelegate::NaiveProxyDelegate( NaiveProxyDelegate::~NaiveProxyDelegate() = default; -Error NaiveProxyDelegate::OnBeforeTunnelRequest( +base::expected +NaiveProxyDelegate::OnBeforeTunnelRequest( const ProxyChain& proxy_chain, size_t chain_index, - HttpRequestHeaders* extra_headers) { + OnBeforeTunnelRequestCallback callback) { + HttpRequestHeaders extra_headers; // Not possible to negotiate padding capability given the underlying // protocols. if (proxy_chain.is_direct()) - return OK; + return extra_headers; const ProxyServer& proxy_server = proxy_chain.GetProxyServer(chain_index); if (proxy_server.is_socks()) - return OK; + return extra_headers; // Only the last server is attempted for padding // because proxy chaining will corrupt the padding. if (chain_index != proxy_chain.length() - 1) - return OK; + return extra_headers; // Sends client-side padding header regardless of server support std::string padding(base::RandInt(16, 32), '~'); FillNonindexHeaderValue(base::RandUint64(), &padding[0], padding.size()); - extra_headers->SetHeader(kPaddingHeader, padding); + extra_headers.SetHeader(kPaddingHeader, padding); // Enables Fast Open in H2/H3 proxy client socket once the state of server // padding support is known. if (padding_type_by_server_[proxy_server].has_value()) { - extra_headers->SetHeader("fastopen", "1"); + extra_headers.SetHeader("fastopen", "1"); } - extra_headers->MergeFrom(extra_headers_); + extra_headers.MergeFrom(extra_headers_); - return OK; + return extra_headers; } std::optional NaiveProxyDelegate::ParsePaddingHeaders( @@ -127,7 +129,8 @@ std::optional NaiveProxyDelegate::ParsePaddingHeaders( Error NaiveProxyDelegate::OnTunnelHeadersReceived( const ProxyChain& proxy_chain, size_t chain_index, - const HttpResponseHeaders& response_headers) { + const HttpResponseHeaders& response_headers, + CompletionOnceCallback callback) { // Not possible to negotiate padding capability given the underlying // protocols. if (proxy_chain.is_direct()) diff --git a/naiveproxy/src/net/tools/naive/naive_proxy_delegate.h b/naiveproxy/src/net/tools/naive/naive_proxy_delegate.h index bbc87b839a..9a70b4c9d7 100644 --- a/naiveproxy/src/net/tools/naive/naive_proxy_delegate.h +++ b/naiveproxy/src/net/tools/naive/naive_proxy_delegate.h @@ -42,14 +42,15 @@ class NaiveProxyDelegate : public ProxyDelegate { const ProxyRetryInfoMap& proxy_retry_info) override {} // This only affects h2 proxy client socket. - Error OnBeforeTunnelRequest(const ProxyChain& proxy_chain, - size_t chain_index, - HttpRequestHeaders* extra_headers) override; - - Error OnTunnelHeadersReceived( + base::expected OnBeforeTunnelRequest( const ProxyChain& proxy_chain, size_t chain_index, - const HttpResponseHeaders& response_headers) override; + OnBeforeTunnelRequestCallback callback) override; + + Error OnTunnelHeadersReceived(const ProxyChain& proxy_chain, + size_t chain_index, + const HttpResponseHeaders& response_headers, + CompletionOnceCallback callback) override; void SetProxyResolutionService( ProxyResolutionService* proxy_resolution_service) override {} diff --git a/naiveproxy/src/net/tools/net_watcher/net_watcher.cc b/naiveproxy/src/net/tools/net_watcher/net_watcher.cc index df8aaed9c6..35a1407bb5 100644 --- a/naiveproxy/src/net/tools/net_watcher/net_watcher.cc +++ b/naiveproxy/src/net/tools/net_watcher/net_watcher.cc @@ -75,11 +75,22 @@ const char* ConnectionTypeToString( } } +const char* IPAddressChangeTypeToString( + net::NetworkChangeNotifier::IPAddressChangeType type) { + switch (type) { + case net::NetworkChangeNotifier::IP_ADDRESS_CHANGE_NONE: + return "IP_ADDRESS_CHANGE_NONE"; + case net::NetworkChangeNotifier::IP_ADDRESS_CHANGE_NORMAL: + return "IP_ADDRESS_CHANGE_NORMAL"; + case net::NetworkChangeNotifier::IP_ADDRESS_CHANGE_IPV6_TEMPADDR: + return "IP_ADDRESS_CHANGE_IPV6_TEMPADDR"; + default: + return "IP_ADDRESS_CHANGE_UNEXPECTED"; + } +} + std::string ProxyConfigToString(const net::ProxyConfig& config) { - base::Value config_value = config.ToValue(); - std::string str; - base::JSONWriter::Write(config_value, &str); - return str; + return base::WriteJson(config.ToValue()).value_or(""); } const char* ConfigAvailabilityToString( @@ -112,7 +123,12 @@ class NetWatcher : ~NetWatcher() override = default; // net::NetworkChangeNotifier::IPAddressObserver implementation. - void OnIPAddressChanged() override { LOG(INFO) << "OnIPAddressChanged()"; } + void OnIPAddressChanged( + net::NetworkChangeNotifier::IPAddressChangeType change_type = + net::NetworkChangeNotifier::IP_ADDRESS_CHANGE_NORMAL) override { + LOG(INFO) << "OnIPAddressChanged(" + << IPAddressChangeTypeToString(change_type) << ")"; + } // net::NetworkChangeNotifier::ConnectionTypeObserver implementation. void OnConnectionTypeChanged( diff --git a/naiveproxy/src/net/tools/root_store_tool/root_store_tool.cc b/naiveproxy/src/net/tools/root_store_tool/root_store_tool.cc index 4187d4f052..172eb9e9d4 100644 --- a/naiveproxy/src/net/tools/root_store_tool/root_store_tool.cc +++ b/naiveproxy/src/net/tools/root_store_tool/root_store_tool.cc @@ -71,15 +71,16 @@ std::optional> DecodeCerts( bssl::UniquePtr scoped_name(name); bssl::UniquePtr scoped_header(header); bssl::UniquePtr scoped_data(data); - if (UNSAFE_TODO(strcmp(name, "CERTIFICATE")) != 0) { + if (std::string_view(name) != "CERTIFICATE") { LOG(ERROR) << "Found PEM block of type " << name << " instead of CERTIFICATE"; return std::nullopt; } - std::string sha256_hex = - base::ToLowerASCII(base::HexEncode(crypto::hash::Sha256( - UNSAFE_TODO(base::span(data, base::checked_cast(len)))))); - certs[sha256_hex] = std::string(data, UNSAFE_TODO(data + len)); + std::string_view cert_view(reinterpret_cast(data), + base::checked_cast(len)); + const std::string sha256_hex = + base::ToLowerASCII(base::HexEncode(crypto::hash::Sha256(cert_view))); + certs[sha256_hex] = std::string(cert_view); } return std::move(certs); } diff --git a/naiveproxy/src/net/tools/transport_security_state_generator/BUILD.gn b/naiveproxy/src/net/tools/transport_security_state_generator/BUILD.gn index 5e4921447d..09668ceddb 100644 --- a/naiveproxy/src/net/tools/transport_security_state_generator/BUILD.gn +++ b/naiveproxy/src/net/tools/transport_security_state_generator/BUILD.gn @@ -23,7 +23,6 @@ source_set("transport_security_state_generator_sources") { ] deps = [ "//base", - "//crypto", "//net/tools/huffman_trie:huffman_trie_generator_sources", "//third_party/boringssl", ] @@ -34,7 +33,6 @@ executable("transport_security_state_generator") { deps = [ ":transport_security_state_generator_sources", "//base", - "//crypto", "//third_party/boringssl", ] } diff --git a/naiveproxy/src/net/tools/transport_security_state_generator/cert_util.cc b/naiveproxy/src/net/tools/transport_security_state_generator/cert_util.cc index ac7e836fad..b73f14d974 100644 --- a/naiveproxy/src/net/tools/transport_security_state_generator/cert_util.cc +++ b/naiveproxy/src/net/tools/transport_security_state_generator/cert_util.cc @@ -8,11 +8,12 @@ #include #include "base/base64.h" +#include "base/compiler_specific.h" #include "base/files/file_util.h" #include "base/numerics/clamped_math.h" +#include "base/numerics/safe_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" -#include "crypto/evp.h" #include "net/tools/transport_security_state_generator/spki_hash.h" #include "third_party/boringssl/src/include/openssl/crypto.h" @@ -125,13 +126,17 @@ bool ExtractSubjectNameFromCertificate(X509* certificate, std::string* name) { bool CalculateSPKIHashFromCertificate(X509* certificate, SPKIHash* out_hash) { DCHECK(certificate); - bssl::UniquePtr key(X509_get_pubkey(certificate)); - if (!key) { + const X509_PUBKEY* pubkey = X509_get_X509_PUBKEY(certificate); + uint8_t *spki = nullptr; + int spki_len = i2d_X509_PUBKEY(pubkey, &spki); + if (spki_len < 0) { return false; } - - std::vector spki_der = crypto::evp::PublicKeyToBytes(key.get()); - out_hash->CalculateFromBytes(spki_der); + bssl::UniquePtr spki_deleter(spki); + // SAFETY: `i2d_X509_PUBKEY`, on success, sets `spki` to a buffer of length + // `spki_len`. + out_hash->CalculateFromBytes( + UNSAFE_BUFFERS(base::span(spki, base::checked_cast(spki_len)))); return true; } diff --git a/naiveproxy/src/net/tools/transport_security_state_generator/input_file_parsers.cc b/naiveproxy/src/net/tools/transport_security_state_generator/input_file_parsers.cc index 5e6526e473..e131f1f3e1 100644 --- a/naiveproxy/src/net/tools/transport_security_state_generator/input_file_parsers.cc +++ b/naiveproxy/src/net/tools/transport_security_state_generator/input_file_parsers.cc @@ -339,15 +339,15 @@ bool ParseJSON(std::string_view hsts_json, "test", "public-suffix", "google", "custom", "bulk-legacy", "bulk-18-weeks", "bulk-1-year", "public-suffix-requested"}; - std::optional hsts_dict = - base::JSONReader::ReadDict(hsts_json); + std::optional hsts_dict = base::JSONReader::ReadDict( + hsts_json, base::JSON_PARSE_CHROMIUM_EXTENSIONS); if (!hsts_dict) { LOG(ERROR) << "Could not parse the input HSTS JSON file"; return false; } - std::optional pins_dict = - base::JSONReader::ReadDict(pins_json); + std::optional pins_dict = base::JSONReader::ReadDict( + pins_json, base::JSON_PARSE_CHROMIUM_EXTENSIONS); if (!pins_dict) { LOG(ERROR) << "Could not parse the input pins JSON file"; return false; diff --git a/naiveproxy/src/net/tools/transport_security_state_generator/spki_hash.cc b/naiveproxy/src/net/tools/transport_security_state_generator/spki_hash.cc index b098da769e..9bba8185d2 100644 --- a/naiveproxy/src/net/tools/transport_security_state_generator/spki_hash.cc +++ b/naiveproxy/src/net/tools/transport_security_state_generator/spki_hash.cc @@ -4,12 +4,14 @@ #include "net/tools/transport_security_state_generator/spki_hash.h" +#include #include #include +#include #include "base/base64.h" #include "base/strings/string_util.h" -#include "third_party/boringssl/src/include/openssl/sha.h" +#include "third_party/boringssl/src/include/openssl/sha2.h" namespace net::transport_security_state { @@ -18,29 +20,24 @@ SPKIHash::SPKIHash() = default; SPKIHash::~SPKIHash() = default; bool SPKIHash::FromString(std::string_view hash_string) { - std::string_view base64_string; - - if (!base::StartsWith(hash_string, "sha256/", - base::CompareCase::INSENSITIVE_ASCII)) { - return false; - } - base64_string = hash_string.substr(7); - - std::string decoded; - if (!base::Base64Decode(base64_string, &decoded)) { + std::optional base64_string = base::RemovePrefix( + hash_string, "sha256/", base::CompareCase::INSENSITIVE_ASCII); + if (!base64_string) { return false; } - if (decoded.size() != size()) { + std::optional> decoded = + base::Base64Decode(*base64_string); + if (!decoded || decoded->size() != size()) { return false; } - base::span(data_).copy_from(base::as_byte_span(decoded)); + base::span(data_).copy_from(*decoded); return true; } void SPKIHash::CalculateFromBytes(base::span bytes) { - data_ = crypto::hash::Sha256(bytes); + SHA256(bytes.data(), bytes.size(), data_.data()); } } // namespace net::transport_security_state diff --git a/naiveproxy/src/net/tools/transport_security_state_generator/spki_hash.h b/naiveproxy/src/net/tools/transport_security_state_generator/spki_hash.h index 1cbc4077dd..7f01b4ff0f 100644 --- a/naiveproxy/src/net/tools/transport_security_state_generator/spki_hash.h +++ b/naiveproxy/src/net/tools/transport_security_state_generator/spki_hash.h @@ -8,9 +8,11 @@ #include #include +#include #include -#include "crypto/hash.h" +#include "base/containers/span.h" +#include "third_party/boringssl/src/include/openssl/sha2.h" namespace net::transport_security_state { @@ -36,7 +38,7 @@ class SPKIHash { base::span span() const { return data_; } private: - std::array data_; + std::array data_; }; } // namespace net::transport_security_state diff --git a/naiveproxy/src/net/tools/transport_security_state_generator/transport_security_state_generator.cc b/naiveproxy/src/net/tools/transport_security_state_generator/transport_security_state_generator.cc index 536bde8879..114273c8da 100644 --- a/naiveproxy/src/net/tools/transport_security_state_generator/transport_security_state_generator.cc +++ b/naiveproxy/src/net/tools/transport_security_state_generator/transport_security_state_generator.cc @@ -23,9 +23,9 @@ #include "net/tools/transport_security_state_generator/preloaded_state_generator.h" #include "net/tools/transport_security_state_generator/transport_security_state_entry.h" -using net::transport_security_state::TransportSecurityStateEntries; using net::transport_security_state::Pinsets; using net::transport_security_state::PreloadedStateGenerator; +using net::transport_security_state::TransportSecurityStateEntries; namespace { @@ -38,25 +38,24 @@ void PrintHelp() { // Checks if there are pins with the same name or the same hash. bool CheckForDuplicatePins(const Pinsets& pinsets) { - std::set seen_names; - std::map seen_hashes; + std::set seen_names; + std::map seen_hashes; for (const auto& pin : pinsets.spki_hashes()) { if (seen_names.find(pin.first) != seen_names.cend()) { LOG(ERROR) << "Duplicate pin name " << pin.first << " in pins file"; return false; } - seen_names.insert(pin.first); + seen_names.emplace(pin.first); - const std::string hash = - std::string(base::as_string_view(pin.second.span())); + const std::string_view hash = base::as_string_view(pin.second.span()); auto it = seen_hashes.find(hash); if (it != seen_hashes.cend()) { LOG(ERROR) << "Duplicate pin hash for " << pin.first << ", already seen as " << it->second; return false; } - seen_hashes.insert(std::pair(hash, pin.first)); + seen_hashes.emplace(hash, pin.first); } return true; @@ -65,43 +64,44 @@ bool CheckForDuplicatePins(const Pinsets& pinsets) { // Checks if there are pinsets that reference non-existing pins, if two // pinsets share the same name, or if there are unused pins. bool CheckCertificatesInPinsets(const Pinsets& pinsets) { - std::set pin_names; + std::set pin_names; for (const auto& pin : pinsets.spki_hashes()) { - pin_names.insert(pin.first); + pin_names.emplace(pin.first); } - std::set used_pin_names; - std::set pinset_names; + std::set used_pin_names; + std::set pinset_names; for (const auto& pinset : pinsets.pinsets()) { if (pinset_names.find(pinset.second->name()) != pinset_names.cend()) { LOG(ERROR) << "Duplicate pinset name " << pinset.second->name(); return false; } - pinset_names.insert(pinset.second->name()); + pinset_names.emplace(pinset.second->name()); const std::vector& good_hashes = pinset.second->static_spki_hashes(); const std::vector& bad_hashes = pinset.second->bad_static_spki_hashes(); - std::vector all_pin_names; - all_pin_names.reserve(good_hashes.size() + bad_hashes.size()); - all_pin_names.insert(all_pin_names.end(), good_hashes.begin(), - good_hashes.end()); - all_pin_names.insert(all_pin_names.end(), bad_hashes.begin(), - bad_hashes.end()); - - for (const auto& pin_name : all_pin_names) { + for (const auto& pin_name : good_hashes) { if (pin_names.find(pin_name) == pin_names.cend()) { LOG(ERROR) << "Pinset " << pinset.second->name() << " references pin " + pin_name << " which doesn't exist"; return false; } - used_pin_names.insert(pin_name); + used_pin_names.emplace(pin_name); + } + for (const auto& pin_name : bad_hashes) { + if (pin_names.find(pin_name) == pin_names.cend()) { + LOG(ERROR) << "Pinset " << pinset.second->name() + << " references pin " + pin_name << " which doesn't exist"; + return false; + } + used_pin_names.emplace(pin_name); } } - for (const auto& pin_name : pin_names) { + for (const std::string_view pin_name : pin_names) { if (used_pin_names.find(pin_name) == used_pin_names.cend()) { LOG(ERROR) << "Pin " << pin_name << " is unused."; return false; @@ -113,14 +113,14 @@ bool CheckCertificatesInPinsets(const Pinsets& pinsets) { // Checks if there are two or more entries for the same hostname. bool CheckDuplicateEntries(const TransportSecurityStateEntries& entries) { - std::set seen_entries; + std::set seen_entries; bool has_duplicates = false; for (const auto& entry : entries) { if (seen_entries.find(entry->hostname) != seen_entries.cend()) { LOG(ERROR) << "Duplicate entry for " << entry->hostname; has_duplicates = true; } - seen_entries.insert(entry->hostname); + seen_entries.emplace(entry->hostname); } return !has_duplicates; } diff --git a/naiveproxy/src/net/traffic_annotation/network_traffic_annotation.h b/naiveproxy/src/net/traffic_annotation/network_traffic_annotation.h index f1bd58fdb7..8d76ca4684 100644 --- a/naiveproxy/src/net/traffic_annotation/network_traffic_annotation.h +++ b/naiveproxy/src/net/traffic_annotation/network_traffic_annotation.h @@ -20,33 +20,35 @@ #include "base/android/scoped_java_ref.h" #endif -namespace { +namespace net::internal { -// Recursively compute hash code of the given string as a constant expression. -template -constexpr uint32_t recursive_hash(const char* str) { - return (recursive_hash(str) * 31u + - static_cast(str[N - 1])) % - 138003713u; +template +consteval int32_t ComputeAnnotationHash(const char (&str)[N]) { + uint32_t ret = 0; + // - 1 to not include NUL + for (size_t i = 0; i < N - 1; ++i) { + ret = (ret * 31u + static_cast(str[i])) % 138003713u; + } + return static_cast(ret); } -// Recursion stopper for the above function. Note that string of size 0 will -// result in compile error. -template <> -constexpr uint32_t recursive_hash<1>(const char* str) { - return static_cast(*str); -} +// NOLINTBEGIN(google-explicit-constructor) +struct StringLiteralToHash { + int32_t hash_value; -// Entry point to function that computes hash as constant expression. -#define COMPUTE_NETWORK_TRAFFIC_ANNOTATION_ID_HASH(S) \ - static_cast(recursive_hash(S)) + template + consteval StringLiteralToHash(const char (&str)[N]) { + hash_value = ComputeAnnotationHash(str); + } +}; +// NOLINTEND(google-explicit-constructor) constexpr int TRAFFIC_ANNOTATION_UNINITIALIZED = -1; - -} // namespace +constexpr int32_t TEST_PARTIAL_HASH = ComputeAnnotationHash("test_partial"); +constexpr int32_t UNDEFINED_HASH = ComputeAnnotationHash("undefined"); +} // namespace net::internal namespace net { - struct PartialNetworkTrafficAnnotationTag; // Defined types for network traffic annotation tags. @@ -61,23 +63,21 @@ struct NetworkTrafficAnnotationTag { // These functions are wrappers around the (private) constructor, so we can // easily find the constructor's call-sites with a script. - template friend constexpr NetworkTrafficAnnotationTag DefineNetworkTrafficAnnotation( - const char (&unique_id)[N1], - const char (&proto)[N2]); + internal::StringLiteralToHash unique_id, + const char* proto); - template friend NetworkTrafficAnnotationTag CompleteNetworkTrafficAnnotation( - const char (&unique_id)[N1], + internal::StringLiteralToHash unique_id, const PartialNetworkTrafficAnnotationTag& partial_annotation, - const char (&proto)[N2]); + const char* proto); - template - friend NetworkTrafficAnnotationTag BranchedCompleteNetworkTrafficAnnotation( - const char (&unique_id)[N1], - const char (&group_id)[N2], + friend constexpr NetworkTrafficAnnotationTag + BranchedCompleteNetworkTrafficAnnotation( + internal::StringLiteralToHash unique_id, + internal::StringLiteralToHash group_id, const PartialNetworkTrafficAnnotationTag& partial_annotation, - const char (&proto)[N3]); + const char* proto); #if BUILDFLAG(IS_ANDROID) // Allows C++ methods to receive a Java NetworkTrafficAnnotationTag via JNI, @@ -110,11 +110,11 @@ struct PartialNetworkTrafficAnnotationTag { // This function is a wrapper around the (private) constructor, so we can // easily find the constructor's call-sites with a script. - template friend constexpr PartialNetworkTrafficAnnotationTag - DefinePartialNetworkTrafficAnnotation(const char (&unique_id)[N1], - const char (&completing_id)[N2], - const char (&proto)[N3]); + DefinePartialNetworkTrafficAnnotation( + internal::StringLiteralToHash unique_id, + internal::StringLiteralToHash completing_id, + const char* proto); friend struct MutablePartialNetworkTrafficAnnotationTag; @@ -150,12 +150,10 @@ struct PartialNetworkTrafficAnnotationTag { // tools/traffic_annotation/sample_traffic_annotation.cc. // TODO(crbug.com/40505662): Add tools to check annotation text's format during // presubmit checks. -template -constexpr NetworkTrafficAnnotationTag DefineNetworkTrafficAnnotation( - const char (&unique_id)[N1], - const char (&proto)[N2]) { - return NetworkTrafficAnnotationTag( - COMPUTE_NETWORK_TRAFFIC_ANNOTATION_ID_HASH(unique_id)); +inline constexpr NetworkTrafficAnnotationTag DefineNetworkTrafficAnnotation( + internal::StringLiteralToHash unique_id, + const char* proto) { + return NetworkTrafficAnnotationTag(unique_id.hash_value); } // There are cases where the network traffic annotation cannot be fully @@ -174,18 +172,16 @@ constexpr NetworkTrafficAnnotationTag DefineNetworkTrafficAnnotation( // annotation that will complete it. In the case of // BranchedCompleteNetworkTrafficAnnotation, |completing_id| is the group id // of the completing annotations. -template constexpr PartialNetworkTrafficAnnotationTag -DefinePartialNetworkTrafficAnnotation(const char (&unique_id)[N1], - const char (&completing_id)[N2], - const char (&proto)[N3]) { +DefinePartialNetworkTrafficAnnotation( + internal::StringLiteralToHash unique_id, + internal::StringLiteralToHash completing_id, + const char* proto) { #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) - return PartialNetworkTrafficAnnotationTag( - COMPUTE_NETWORK_TRAFFIC_ANNOTATION_ID_HASH(unique_id), - COMPUTE_NETWORK_TRAFFIC_ANNOTATION_ID_HASH(completing_id)); + return PartialNetworkTrafficAnnotationTag(unique_id.hash_value, + completing_id.hash_value); #else - return PartialNetworkTrafficAnnotationTag( - COMPUTE_NETWORK_TRAFFIC_ANNOTATION_ID_HASH(unique_id)); + return PartialNetworkTrafficAnnotationTag(unique_id.hash_value); #endif } @@ -193,18 +189,15 @@ DefinePartialNetworkTrafficAnnotation(const char (&unique_id)[N1], // annotation adds details to another annotation that is defined before. // |partial_annotation| is the PartialNetworkTrafficAnnotationTag returned // by a call to DefinePartialNetworkTrafficAnnotation(). -template -NetworkTrafficAnnotationTag CompleteNetworkTrafficAnnotation( - const char (&unique_id)[N1], +inline NetworkTrafficAnnotationTag CompleteNetworkTrafficAnnotation( + internal::StringLiteralToHash unique_id, const PartialNetworkTrafficAnnotationTag& partial_annotation, - const char (&proto)[N2]) { + const char* proto) { #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) - DCHECK(partial_annotation.completing_id_hash_code == - COMPUTE_NETWORK_TRAFFIC_ANNOTATION_ID_HASH(unique_id) || + DCHECK(partial_annotation.completing_id_hash_code == unique_id.hash_value || partial_annotation.unique_id_hash_code == - COMPUTE_NETWORK_TRAFFIC_ANNOTATION_ID_HASH("test_partial") || - partial_annotation.unique_id_hash_code == - COMPUTE_NETWORK_TRAFFIC_ANNOTATION_ID_HASH("undefined")); + internal::TEST_PARTIAL_HASH || + partial_annotation.unique_id_hash_code == internal::UNDEFINED_HASH); #endif return NetworkTrafficAnnotationTag(partial_annotation.unique_id_hash_code); } @@ -213,22 +206,19 @@ NetworkTrafficAnnotationTag CompleteNetworkTrafficAnnotation( // branched into several annotations. In this case, |group_id| is a common id // that is used by all members of the branch and referenced by partial // annotation that is completed by them. -template -NetworkTrafficAnnotationTag BranchedCompleteNetworkTrafficAnnotation( - const char (&unique_id)[N1], - const char (&group_id)[N2], +constexpr inline NetworkTrafficAnnotationTag +BranchedCompleteNetworkTrafficAnnotation( + internal::StringLiteralToHash unique_id, + internal::StringLiteralToHash group_id, const PartialNetworkTrafficAnnotationTag& partial_annotation, - const char (&proto)[N3]) { + const char* proto) { #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) - DCHECK(partial_annotation.completing_id_hash_code == - COMPUTE_NETWORK_TRAFFIC_ANNOTATION_ID_HASH(group_id) || + DCHECK(partial_annotation.completing_id_hash_code == group_id.hash_value || partial_annotation.unique_id_hash_code == - COMPUTE_NETWORK_TRAFFIC_ANNOTATION_ID_HASH("test_partial") || - partial_annotation.unique_id_hash_code == - COMPUTE_NETWORK_TRAFFIC_ANNOTATION_ID_HASH("undefined")); + internal::TEST_PARTIAL_HASH || + partial_annotation.unique_id_hash_code == internal::UNDEFINED_HASH); #endif - return NetworkTrafficAnnotationTag( - COMPUTE_NETWORK_TRAFFIC_ANNOTATION_ID_HASH(unique_id)); + return NetworkTrafficAnnotationTag(unique_id.hash_value); } // Example for joining N x 1 partial annotations: @@ -284,7 +274,7 @@ NetworkTrafficAnnotationTag BranchedCompleteNetworkTrafficAnnotation( // '/services/network/public/mojom'. struct MutableNetworkTrafficAnnotationTag { MutableNetworkTrafficAnnotationTag() - : unique_id_hash_code(TRAFFIC_ANNOTATION_UNINITIALIZED) {} + : unique_id_hash_code(internal::TRAFFIC_ANNOTATION_UNINITIALIZED) {} explicit MutableNetworkTrafficAnnotationTag( const NetworkTrafficAnnotationTag& traffic_annotation) : unique_id_hash_code(traffic_annotation.unique_id_hash_code) {} @@ -301,10 +291,12 @@ struct MutableNetworkTrafficAnnotationTag { } bool is_valid() const { - return unique_id_hash_code != TRAFFIC_ANNOTATION_UNINITIALIZED; + return unique_id_hash_code != internal::TRAFFIC_ANNOTATION_UNINITIALIZED; } - void reset() { unique_id_hash_code = TRAFFIC_ANNOTATION_UNINITIALIZED; } + void reset() { + unique_id_hash_code = internal::TRAFFIC_ANNOTATION_UNINITIALIZED; + } // This function is a wrapper around the private constructor, so we can easily // find the constructor's call-sites with a script. @@ -324,8 +316,8 @@ CreateMutableNetworkTrafficAnnotationTag(int32_t unique_id_hash_code) { struct MutablePartialNetworkTrafficAnnotationTag { #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) MutablePartialNetworkTrafficAnnotationTag() - : unique_id_hash_code(TRAFFIC_ANNOTATION_UNINITIALIZED), - completing_id_hash_code(TRAFFIC_ANNOTATION_UNINITIALIZED) {} + : unique_id_hash_code(internal::TRAFFIC_ANNOTATION_UNINITIALIZED), + completing_id_hash_code(internal::TRAFFIC_ANNOTATION_UNINITIALIZED) {} explicit MutablePartialNetworkTrafficAnnotationTag( const PartialNetworkTrafficAnnotationTag& partial_traffic_annotation) : unique_id_hash_code(partial_traffic_annotation.unique_id_hash_code), @@ -342,17 +334,18 @@ struct MutablePartialNetworkTrafficAnnotationTag { } bool is_valid() const { - return unique_id_hash_code != TRAFFIC_ANNOTATION_UNINITIALIZED && - completing_id_hash_code != TRAFFIC_ANNOTATION_UNINITIALIZED; + return unique_id_hash_code != internal::TRAFFIC_ANNOTATION_UNINITIALIZED && + completing_id_hash_code != + internal::TRAFFIC_ANNOTATION_UNINITIALIZED; } void reset() { - unique_id_hash_code = TRAFFIC_ANNOTATION_UNINITIALIZED; - completing_id_hash_code = TRAFFIC_ANNOTATION_UNINITIALIZED; + unique_id_hash_code = internal::TRAFFIC_ANNOTATION_UNINITIALIZED; + completing_id_hash_code = internal::TRAFFIC_ANNOTATION_UNINITIALIZED; } #else MutablePartialNetworkTrafficAnnotationTag() - : unique_id_hash_code(TRAFFIC_ANNOTATION_UNINITIALIZED) {} + : unique_id_hash_code(internal::TRAFFIC_ANNOTATION_UNINITIALIZED) {} explicit MutablePartialNetworkTrafficAnnotationTag( const PartialNetworkTrafficAnnotationTag& partial_traffic_annotation) : unique_id_hash_code(partial_traffic_annotation.unique_id_hash_code) {} @@ -364,10 +357,12 @@ struct MutablePartialNetworkTrafficAnnotationTag { } bool is_valid() const { - return unique_id_hash_code != TRAFFIC_ANNOTATION_UNINITIALIZED; + return unique_id_hash_code != internal::TRAFFIC_ANNOTATION_UNINITIALIZED; } - void reset() { unique_id_hash_code = TRAFFIC_ANNOTATION_UNINITIALIZED; } + void reset() { + unique_id_hash_code = internal::TRAFFIC_ANNOTATION_UNINITIALIZED; + } #endif // !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) }; diff --git a/naiveproxy/src/net/url_request/redirect_info.cc b/naiveproxy/src/net/url_request/redirect_info.cc index 037df288c5..b07dc07d85 100644 --- a/naiveproxy/src/net/url_request/redirect_info.cc +++ b/naiveproxy/src/net/url_request/redirect_info.cc @@ -93,7 +93,7 @@ RedirectInfo RedirectInfo::ComputeRedirectInfo( GURL::Replacements replacements; // Reference the |ref| directly out of the original URL to avoid a // malloc. - replacements.SetRefStr(original_url.ref_piece()); + replacements.SetRefStr(original_url.ref()); redirect_info.new_url = new_location.ReplaceComponents(replacements); } else { redirect_info.new_url = new_location; diff --git a/naiveproxy/src/net/url_request/url_request.cc b/naiveproxy/src/net/url_request/url_request.cc index 6d0a14d213..77a58a0bc1 100644 --- a/naiveproxy/src/net/url_request/url_request.cc +++ b/naiveproxy/src/net/url_request/url_request.cc @@ -234,10 +234,6 @@ void URLRequest::set_upload(std::unique_ptr upload) { upload_data_stream_ = std::move(upload); } -const UploadDataStream* URLRequest::get_upload_for_testing() const { - return upload_data_stream_.get(); -} - bool URLRequest::has_upload() const { return upload_data_stream_.get() != nullptr; } @@ -307,9 +303,10 @@ LoadStateWithParam URLRequest::GetLoadState() const { std::u16string()); } -base::Value::Dict URLRequest::GetStateAsValue() const { +base::Value::Dict URLRequest::GetStateAsValue( + NetLogCaptureMode capture_mode) const { base::Value::Dict dict; - dict.Set("url", original_url().possibly_invalid_spec()); + dict.Set("url", SanitizeUrlForNetLog(original_url(), capture_mode)); if (url_chain_.size() > 1) { base::Value::List list; @@ -654,10 +651,11 @@ URLRequest::URLRequest(base::PassKey pass_key, DCHECK(base::SingleThreadTaskRunner::HasCurrentDefault()); context->url_requests()->insert(this); - net_log_.BeginEvent(NetLogEventType::REQUEST_ALIVE, [&] { - return NetLogURLRequestConstructorParams(url, priority_, - traffic_annotation_); - }); + net_log_.BeginEvent(NetLogEventType::REQUEST_ALIVE, + [&](NetLogCaptureMode capture_mode) { + return NetLogURLRequestConstructorParams( + url, priority_, traffic_annotation_, capture_mode); + }); } void URLRequest::BeforeRequestComplete(int error) { @@ -695,12 +693,15 @@ void URLRequest::StartJob(std::unique_ptr job) { DCHECK(!allow_credentials_); } - net_log_.BeginEvent(NetLogEventType::URL_REQUEST_START_JOB, [&] { - return NetLogURLRequestStartParams( - url(), method_, load_flags(), isolation_info_, site_for_cookies_, - initiator_, - upload_data_stream_ ? upload_data_stream_->identifier() : -1); - }); + net_log_.BeginEvent( + NetLogEventType::URL_REQUEST_START_JOB, + [&](NetLogCaptureMode capture_mode) { + return NetLogURLRequestStartParams( + url(), method_, load_flags(), isolation_info_, site_for_cookies_, + initiator_, + upload_data_stream_ ? upload_data_stream_->identifier() : -1, + capture_mode); + }); job_ = std::move(job); job_->SetExtraRequestHeaders(extra_request_headers_); diff --git a/naiveproxy/src/net/url_request/url_request.h b/naiveproxy/src/net/url_request/url_request.h index ca68860c36..8ad980d8e8 100644 --- a/naiveproxy/src/net/url_request/url_request.h +++ b/naiveproxy/src/net/url_request/url_request.h @@ -50,6 +50,7 @@ #include "net/http/http_request_headers.h" #include "net/http/http_response_headers.h" #include "net/http/http_response_info.h" +#include "net/log/net_log_capture_mode.h" #include "net/log/net_log_event_type.h" #include "net/log/net_log_source.h" #include "net/log/net_log_with_source.h" @@ -88,12 +89,12 @@ struct SessionAccess; } //----------------------------------------------------------------------------- -// A class representing the asynchronous load of a data stream from an URL. +// A class representing the asynchronous load of a data stream from a URL. // // The lifetime of an instance of this class is completely controlled by the // consumer, and the instance is not required to live on the heap or be -// allocated in any special way. It is also valid to delete an URLRequest -// object during the handling of a callback to its delegate. Of course, once +// allocated in any special way. It is also valid to delete a URLRequest +// object during the handling of a callback to its delegate. Of course, once // the URLRequest is deleted, no further callbacks to its delegate will occur. // // NOTE: All usage of all instances of this class should be on the same thread. @@ -152,53 +153,52 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { const TransportInfo& info, CompletionOnceCallback callback); - // Called upon receiving a redirect. The delegate may call the request's - // Cancel method to prevent the redirect from being followed. Since there + // Called upon receiving a redirect. The delegate may call the request's + // Cancel method to prevent the redirect from being followed. Since there // may be multiple chained redirects, there may also be more than one // redirect call. // // When this function is called, the request will still contain the - // original URL, the destination of the redirect is provided in - // |redirect_info.new_url|. If the delegate does not cancel the request + // original URL; the destination of the redirect is provided in + // |redirect_info.new_url|. If the delegate does not cancel the request // and |*defer_redirect| is false, then the redirect will be followed, and - // the request's URL will be changed to the new URL. Otherwise if the + // the request's URL will be changed to the new URL. Otherwise, if the // delegate does not cancel the request and |*defer_redirect| is true, then // the redirect will be followed once FollowDeferredRedirect is called // on the URLRequest. // // The caller must set |*defer_redirect| to false, so that delegates do not // need to set it if they are happy with the default behavior of not - // deferring redirect. + // deferring the redirect. virtual void OnReceivedRedirect(URLRequest* request, const RedirectInfo& redirect_info, bool* defer_redirect); - // Called when we receive an authentication failure. The delegate should + // Called when we receive an authentication failure. The delegate should // call request->SetAuth() with the user's credentials once it obtains them, // or request->CancelAuth() to cancel the login and display the error page. // When it does so, the request will be reissued, restarting the sequence // of On* callbacks. // // NOTE: If auth_info.scheme is AUTH_SCHEME_NEGOTIATE on ChromeOS, this - // method should not call SetAuth(). Instead, it should show ChromeOS - // specific UI and cancel the request. (See b/260522530). + // method should not call SetAuth(). Instead, it should show + // ChromeOS-specific UI and cancel the request. (See b/260522530). virtual void OnAuthRequired(URLRequest* request, const AuthChallengeInfo& auth_info); // Called when we receive an SSL CertificateRequest message for client - // authentication. The delegate should call + // authentication. The delegate should call // request->ContinueWithCertificate() with the client certificate the user // selected and its private key, or request->ContinueWithCertificate(NULL, - // NULL) - // to continue the SSL handshake without a client certificate. + // NULL) to continue the SSL handshake without a client certificate. virtual void OnCertificateRequested(URLRequest* request, SSLCertRequestInfo* cert_request_info); // Called when using SSL and the server responds with a certificate with // an error, for example, whose common name does not match the common name - // we were expecting for that host. The delegate should either do the + // we were expecting for that host. The delegate should either do the // safe thing and Cancel() the request or decide to proceed by calling - // ContinueDespiteLastError(). cert_error is a ERR_* error code + // ContinueDespiteLastError(). cert_error is a ERR_* error code // indicating what's wrong with the certificate. // If |fatal| is true then the host in question demands a higher level // of security (due e.g. to HTTP Strict Transport Security, user @@ -211,13 +211,13 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // After calling Start(), the delegate will receive an OnResponseStarted // callback when the request has completed. |net_error| will be set to OK - // or an actual net error. On success, all redirects have been - // followed and the final response is beginning to arrive. At this point, - // meta data about the response is available, including for example HTTP - // response headers if this is a request for a HTTP resource. + // or an actual net error. On success, all redirects have been + // followed and the final response is beginning to arrive. At this point, + // metadata about the response is available, including for example HTTP + // response headers if this is a request for an HTTP resource. virtual void OnResponseStarted(URLRequest* request, int net_error); - // Called when the a Read of the response body is completed after an + // Called when a Read of the response body is completed after an // IO_PENDING status from a Read() call. // The data read is filled into the buffer which the caller passed // to Read() previously. @@ -255,20 +255,20 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // started. Once it was set to block all cookies, it cannot be changed back. static void SetDefaultCookiePolicyToBlock(); - // The original url is the url used to initialize the request, and it may - // differ from the url if the request was redirected. + // The original URL is the URL used to initialize the request, and it may + // differ from the URL if the request was redirected. const GURL& original_url() const { return url_chain_.front(); } - // The chain of urls traversed by this request. If the request had no + // The chain of URLs traversed by this request. If the request had no // redirects, this vector will contain one element. const std::vector& url_chain() const { return url_chain_; } const GURL& url() const { return url_chain_.back(); } - // Explicitly set the URL chain for this request. This can be used to + // Explicitly set the URL chain for this request. This can be used to // indicate a chain of redirects that happen at a layer above the network // service; e.g. navigation redirects. // - // Note, the last entry in the new `url_chain` will be ignored. Instead - // the request will preserve its current URL. This is done since the higher + // Note, the last entry in the new `url_chain` will be ignored. Instead + // the request will preserve its current URL. This is done since the higher // layer providing the explicit `url_chain` may not be aware of modifications // to the request URL by throttles. // @@ -311,7 +311,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { std::optional redirect_info_new_url = std::nullopt); // This will convert the passed NetworkAnonymizationKey to an IsolationInfo. - // This IsolationInfo mmay be assigned an inaccurate frame origin because the + // This IsolationInfo may be assigned an inaccurate frame origin because the // NetworkAnonymizationKey might not contain all the information to populate // it. Additionally the NetworkAnonymizationKey uses sites which will be // converted to origins when set on the IsolationInfo. If using this method it @@ -338,7 +338,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { } // Indicates if the request should be treated as a main frame navigation for - // SameSite cookie computations. This flag overrides the IsolationInfo + // SameSite cookie computations. This flag overrides the IsolationInfo // request type associated with fetches from a service worker context. bool force_main_frame_for_same_site_cookies() const { return force_main_frame_for_same_site_cookies_; @@ -360,7 +360,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { return cookie_setting_overrides_; } - // The first-party URL policy to apply when updating the first party URL + // The first-party URL policy to apply when updating the first-party URL // during redirects. The first-party URL policy may only be changed before // Start() is called. RedirectInfo::FirstPartyURLPolicy first_party_url_policy() const { @@ -386,14 +386,14 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // This value is used to perform the cross-origin check specified in Section // 4.3 of https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site. // - // Note: the initiator can be null for browser-initiated top level + // Note: the initiator can be null for browser-initiated top-level // navigations. This is different from a unique Origin (e.g. in sandboxed // iframes). const std::optional& initiator() const { return initiator_; } // This method may only be called before Start(). void set_initiator(const std::optional& initiator); - // The request method. "GET" is the default value. The request method may + // The request method. "GET" is the default value. The request method may // only be changed before Start() is called. Request methods are // case-sensitive, so standard HTTP methods like GET or POST should be // specified in uppercase. @@ -443,13 +443,10 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // Sets the upload data. void set_upload(std::unique_ptr upload); - // Gets the upload data. - const UploadDataStream* get_upload_for_testing() const; - // Returns true if the request has a non-empty message body to upload. bool has_upload() const; - // Set or remove a extra request header. These methods may only be called + // Set or remove an extra request header. These methods may only be called // before Start() is called, or between receiving a redirect and trying to // follow it. void SetExtraRequestHeaderByName(std::string_view name, @@ -457,9 +454,9 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { bool overwrite); void RemoveRequestHeaderByName(std::string_view name); - // Sets all extra request headers. Any extra request headers set by other - // methods are overwritten by this method. This method may only be called - // before Start() is called. It is an error to call it later. + // Sets all extra request headers. Any extra request headers set by other + // methods are overwritten by this method. This method may only be called + // before Start() is called. It is an error to call it later. void SetExtraRequestHeaders(const HttpRequestHeaders& headers); const HttpRequestHeaders& extra_request_headers() const { @@ -468,14 +465,14 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // Gets the total amount of data received from network after SSL decoding and // proxy handling. Pertains only to the last URLRequestJob issued by this - // URLRequest, i.e. reset on redirects, but not reset when multiple roundtrips - // are used for range requests or auth. + // URLRequest, i.e., reset on redirects, but not reset when multiple round + // trips are used for range requests or auth. int64_t GetTotalReceivedBytes() const; // Gets the total amount of data sent over the network before SSL encoding and // proxy handling. Pertains only to the last URLRequestJob issued by this - // URLRequest, i.e. reset on redirects, but not reset when multiple roundtrips - // are used for range requests or auth. + // URLRequest, i.e., reset on redirects, but not reset when multiple round + // trips are used for range requests or auth. int64_t GetTotalSentBytes() const; // The size of the response body before removing any content encodings. @@ -491,17 +488,17 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // Returns a partial representation of the request's state as a value, for // debugging. - base::Value::Dict GetStateAsValue() const; + base::Value::Dict GetStateAsValue(NetLogCaptureMode capture_mode) const; - // Logs information about the what external object currently blocking the - // request. LogUnblocked must be called before resuming the request. This + // Logs information about what external object currently blocking the + // request. LogUnblocked must be called before resuming the request. This // can be called multiple times in a row either with or without calling - // LogUnblocked between calls. |blocked_by| must not be empty. + // LogUnblocked between calls. |blocked_by| must not be empty. void LogBlockedBy(std::string_view blocked_by); // Just like LogBlockedBy, but also makes GetLoadState return source as the - // |param| in the value returned by GetLoadState. Calling LogUnblocked or - // LogBlockedBy will clear the load param. |blocked_by| must not be empty. + // |param| in the value returned by GetLoadState. Calling LogUnblocked or + // LogBlockedBy will clear the load param. |blocked_by| must not be empty. void LogAndReportBlockedBy(std::string_view blocked_by); // Logs that the request is no longer blocked by the last caller to @@ -512,21 +509,21 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // chunked, size is set to zero, but position will not be. UploadProgress GetUploadProgress() const; - // Get response header(s) by name. This method may only be called - // once the delegate's OnResponseStarted method has been called. Headers + // Get response header(s) by name. This method may only be called + // once the delegate's OnResponseStarted method has been called. Headers // that appear more than once in the response are coalesced, with values // separated by commas (per RFC 2616). This will not work with cookies since - // comma can be used in cookie values. + // a comma can be used in cookie values. std::string GetResponseHeaderByName(std::string_view name) const; // The time when |this| was constructed. base::TimeTicks creation_time() const { return creation_time_; } - // The time at which the returned response was requested. For cached + // The time at which the returned response was requested. For cached // responses, this is the last time the cache entry was validated. base::Time request_time() const { return response_info_.request_time; } - // The time at which the returned response was generated. For cached + // The time at which the returned response was generated. For cached // responses, this is the last time the cache entry was validated. base::Time response_time() const { return response_info_.response_time; } @@ -535,7 +532,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { return response_info_.original_response_time; } - // Indicate if this response was fetched from disk cache. + // Indicates if this response was fetched from disk cache. bool was_cached() const { return response_info_.was_cached; } // Returns true if the URLRequest was delivered over SPDY. @@ -543,11 +540,11 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { return response_info_.was_fetched_via_spdy; } - // Returns the host and port that the content was fetched from. See + // Returns the host and port that the content was fetched from. See // http_response_info.h for caveats relating to cached content. IPEndPoint GetResponseRemoteEndpoint() const; - // Get all response headers, as a HttpResponseHeaders object. See comments + // Get all response headers, as a HttpResponseHeaders object. See comments // in HttpResponseHeaders class as to the format of the data. HttpResponseHeaders* response_headers() const; @@ -556,8 +553,8 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { const std::optional& auth_challenge_info() const; - // Gets timing information related to the request. Events that have not yet - // occurred are left uninitialized. After a second request starts, due to + // Gets timing information related to the request. Events that have not yet + // occurred are left uninitialized. After a second request starts, due to // a redirect or authentication, values will be reset. // // LoadTimingInfo only contains ConnectTiming information and socket IDs for @@ -568,7 +565,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // occurred are left uninitialized. LoadTimingInternalInfo GetLoadTimingInternalInfo() const; - // Gets the networkd error details of the most recent origin that the network + // Gets the network error details of the most recent origin that the network // stack makes the request to. void PopulateNetErrorDetails(NetErrorDetails* details) const; @@ -585,15 +582,15 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // false and leaves |endpoint| unchanged if it is unavailable. bool GetTransactionRemoteEndpoint(IPEndPoint* endpoint) const; - // Get the mime type. This method may only be called once the delegate's + // Gets the mime type. This method may only be called once the delegate's // OnResponseStarted method has been called. void GetMimeType(std::string* mime_type) const; - // Get the charset (character encoding). This method may only be called once + // Gets the charset (character encoding). This method may only be called once // the delegate's OnResponseStarted method has been called. void GetCharset(std::string* charset) const; - // Get the content encoding types (e.g., gzip, deflate) that were specified + // Gets the content encoding types (e.g., gzip, deflate) that were specified // in the Content-Encoding response header but not decoded by the net stack, // indicating how the response body needs to be decoded on the client side. // This method may only be called once the delegate's OnResponseStarted @@ -601,9 +598,9 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { void GetClientSideContentDecodingTypes( std::vector* types) const; - // Returns the HTTP response code (e.g., 200, 404, and so on). This method + // Returns the HTTP response code (e.g., 200, 404, and so on). This method // may only be called once the delegate's OnResponseStarted method has been - // called. For non-HTTP requests, this method returns -1. + // called. For non-HTTP requests, this method returns -1. int GetResponseCode() const; // Get the HTTP response info in its entirety. @@ -629,8 +626,8 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // or flagged. They are cleared on redirects and other request restarts that // cause sent cookies to be recomputed / new cookies to potentially be // received (such as calling SetAuth() to send HTTP auth credentials, but not - // calling ContinueWithCertification() to respond to client cert challenges), - // and only contain the cookies relevant to the most recent roundtrip. + // calling ContinueWithCertificate() to respond to client cert challenges), + // and only contain the cookies relevant to the most recent round trip. // Populated while the http request is being built. const CookieAccessResultList& maybe_sent_cookies() const { @@ -661,16 +658,16 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // URL but has not yet initiated the new request. bool is_redirecting() const { return is_redirecting_; } - // This method is called to start the request. The delegate will receive - // a OnResponseStarted callback when the request is started. The request + // This method is called to start the request. The delegate will receive + // an OnResponseStarted callback when the request is started. The request // must have a delegate set before this method is called. void Start(); // This method may be called at any time after Start() has been called to - // cancel the request. This method may be called many times, and it has - // no effect once the response has completed. It is guaranteed that no + // cancel the request. This method may be called many times, and it has + // no effect once the response has completed. It is guaranteed that no // methods of the delegate will be called after the request has been - // cancelled, except that this may call the delegate's OnReadCompleted() + // canceled, except that this may call the delegate's OnReadCompleted() // during the call to Cancel itself. Returns |ERR_ABORTED| or other net error // if there was one. int Cancel(); @@ -681,7 +678,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { int CancelWithError(int error); // Cancels the request and sets the error to |error| (see net_error_list.h - // for values) and attaches |ssl_info| as the SSLInfo for that request. This + // for values) and attaches |ssl_info| as the SSLInfo for that request. This // is useful to attach a certificate and certificate error to a canceled // request. void CancelWithSSLError(int error, const SSLInfo& ssl_info); @@ -691,12 +688,12 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // data is available, length and the data will be returned immediately. If the // request has failed, an error code will be returned. If data is not yet // available, Read returns net::ERR_IO_PENDING, and the Delegate's - // OnReadComplete method will be called asynchronously with the result of the + // OnReadCompleted method will be called asynchronously with the result of the // read, unless the URLRequest is canceled. // // The |buf| parameter is a buffer to receive the data. If the operation // completes asynchronously, the implementation will reference the buffer - // until OnReadComplete is called. The buffer must be at least |max_bytes| in + // until OnReadCompleted is called. The buffer must be at least |max_bytes| in // length. // // The |max_bytes| parameter is the maximum number of bytes to read. @@ -719,12 +716,12 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // This method can be called after the user selects a client certificate to // instruct this URLRequest to continue with the request with the - // certificate. Pass NULL if the user doesn't have a client certificate. + // certificate. Pass NULL if the user doesn't have a client certificate. void ContinueWithCertificate(scoped_refptr client_cert, scoped_refptr client_private_key); // This method can be called after some error notifications to instruct this - // URLRequest to ignore the current error and continue with the request. To + // URLRequest to ignore the current error and continue with the request. To // cancel the request instead, call Cancel(). void ContinueDespiteLastError(); @@ -831,8 +828,8 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { void SetIsSharedDictionaryReadAllowedCallback( base::RepeatingCallback callback); - // Set a callback that will be invoked each time a device bound - // session is accessed as part of this URL request. Because device + // Set a callback that will be invoked each time a device-bound + // session is accessed as part of this URL request. Because device- // bound sessions can be accessed asynchronously after this request // completes, this callback must be able to safely outlive `this`. void SetDeviceBoundSessionAccessCallback( @@ -844,11 +841,11 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { } // Sets socket tag to be applied to all sockets used to execute this request. - // Must be set before Start() is called. Only currently supported for HTTP + // Must be set before Start() is called. Only currently supported for HTTP // and HTTPS requests on Android; UID tagging requires // MODIFY_NETWORK_ACCOUNTING permission. // NOTE(pauljensen): Setting a tag disallows sharing of sockets with requests - // with other tags, which may adversely effect performance by prohibiting + // with other tags, which may adversely affect performance by prohibiting // connection sharing. In other words use of multiplexed sockets (e.g. HTTP/2 // and QUIC) will only be allowed if all requests have the same socket tag. void set_socket_tag(const SocketTag& socket_tag); @@ -931,7 +928,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { base::WeakPtr GetWeakPtr(); - // Whether Device Bound Session registration and challenge are allowed + // Whether device-bound session registration and challenge are allowed // for this request (e.g. by Origin Trial) bool allows_device_bound_session_registration() const { return allows_device_bound_session_registration_; @@ -942,7 +939,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { allows_device_bound_session_registration; } - // Whether this request was in the scope of any device bound session, + // Whether this request was in the scope of any device-bound session, // even if it did not need to be deferred. device_bound_sessions::SessionUsage device_bound_session_usage() const { return device_bound_session_usage_; @@ -952,7 +949,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { device_bound_session_usage_ = usage; } - // Returns all the device bound sessions that have deferred this + // Returns all the device-bound sessions that have deferred this // request. const base::flat_map& @@ -965,6 +962,9 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { device_bound_session_deferrals_[deferral] = result; } + // Returns true if the request failed or was canceled. + bool failed() const; + protected: // Allow the URLRequestJob class to control the is_pending() flag. void set_is_pending(bool value) { is_pending_ = value; } @@ -974,9 +974,6 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { int status() const { return status_; } void set_status(int status); - // Returns true if the request failed or was cancelled. - bool failed() const; - // Returns the error status of the request. // Allow the URLRequestJob to redirect this request. If non-null, @@ -1011,11 +1008,11 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { void StartJob(std::unique_ptr job); // Restarting involves replacing the current job with a new one such as what - // happens when following a HTTP redirect. + // happens when following an HTTP redirect. void RestartWithJob(std::unique_ptr job); void PrepareToRestart(); - // Cancels the request and set the error and ssl info for this request to the + // Cancels the request and sets the error and ssl info for this request to the // passed values. Returns the error that was set. int DoCancel(int error, const SSLInfo& ssl_info); @@ -1024,7 +1021,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { void OnHeadersComplete(); // Notifies the network delegate that the request has been completed. - // This does not imply a successful completion. Also a canceled request is + // This does not imply a successful completion. Also, a canceled request is // considered completed. void NotifyRequestCompleted(); @@ -1032,7 +1029,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // occurs. void NotifyResponseStarted(int net_error); - // These functions delegate to |delegate_|. See URLRequest::Delegate for the + // These functions delegate to |delegate_|. See URLRequest::Delegate for the // meaning of these functions. int NotifyConnected(const TransportInfo& info, CompletionOnceCallback callback); @@ -1055,7 +1052,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // should be the delegate's event type, // e.g. NetLogEventType::NETWORK_DELEGATE_AUTH_REQUIRED. void OnCallToDelegate(NetLogEventType type); - // Called when the delegate lets a request continue. Also called on + // Called when the delegate lets a request continue. Also called on // cancellation. `error` is an optional error code associated with // completion. It's only for logging purposes, and will not directly cancel // the request if it's a value other than OK. @@ -1068,7 +1065,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { void RecordReferrerGranularityMetrics(bool request_is_same_origin) const; // Creates a partial IsolationInfo with the information accessible from the - // NetworkAnonymiationKey. + // NetworkAnonymizationKey. net::IsolationInfo CreateIsolationInfoFromNetworkAnonymizationKey( const NetworkAnonymizationKey& network_anonymization_key); @@ -1090,9 +1087,9 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // The cookie partition key for the request. Partitioned cookies should be set // using this key and only partitioned cookies with this partition key should - // be sent. The cookie partition key is optional(nullopt) if cookie - // partitioning is not enabled, if the NIK has no top-frame site, or the NIK - // has a non-general NetworkIsolationPartition. + // be sent. The cookie partition key is nullopt if cookie partitioning is not + // enabled, if the NIK has no top-frame site, or the NIK has a non-general + // NetworkIsolationPartition. // // Unpartitioned cookies are unaffected by this field. std::optional cookie_partition_key_ = std::nullopt; @@ -1112,7 +1109,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { RedirectInfo::FirstPartyURLPolicy::NEVER_CHANGE_URL; HttpRequestHeaders extra_request_headers_; // Flags indicating the request type for the load. Expected values are LOAD_* - // enums above. + // enums in load_flags.h. int partial_load_flags_ = LOAD_NORMAL; // Load flags that only apply to a single hop in the redirect chain. int per_hop_load_flags_ = LOAD_NORMAL; @@ -1138,7 +1135,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // Current error status of the job, as a net::Error code. When the job is // busy, it is ERR_IO_PENDING. When the job is idle (either completed, or // awaiting a call from the URLRequestDelegate before continuing the request), - // it is OK. If the request has been cancelled without a specific error, it is + // it is OK. If the request has been canceled without a specific error, it is // ERR_ABORTED. And on failure, it's the corresponding error code for that // error. // @@ -1159,7 +1156,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { bool is_pending_ = false; // Indicates if the request is in the process of redirecting to a new - // location. It is true from the time the headers complete until a + // location. It is true from the time the headers complete until a // new request begins. bool is_redirecting_ = false; @@ -1167,7 +1164,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // checks are performed, so this field must not be modified. std::optional deferred_redirect_info_; - // Number of times we're willing to redirect. Used to guard against + // Number of times we're willing to redirect. Used to guard against // infinite redirects. int redirect_limit_; @@ -1175,7 +1172,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { // first transaction in a request involving redirects. UploadProgress final_upload_progress_; - // The priority level for this request. Objects like + // The priority level for this request. Objects like // ClientSocketPool use this to determine which URLRequest to // allocate sockets to first. RequestPriority priority_; @@ -1200,7 +1197,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { bool use_blocked_by_as_load_param_ = false; // Safe-guard to ensure that we do not send multiple "I am completed" - // messages to network delegate. + // messages to the network delegate. // TODO(battre): Remove this. http://crbug.com/89049 bool has_notified_completion_ = false; @@ -1208,7 +1205,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { base::TimeTicks creation_time_; - // Timing information for the most recent request. Its start times are + // Timing information for the most recent request. Its start times are // populated during Start(), and the rest are populated in OnResponseReceived. LoadTimingInfo load_timing_info_; @@ -1254,12 +1251,12 @@ class NET_EXPORT URLRequest : public base::SupportsUserData { base::RepeatingCallback device_bound_session_access_callback_; - // Whether the request is allowed to register new device bound sessions + // Whether the request is allowed to register new device-bound sessions bool allows_device_bound_session_registration_ = false; - // How existing device bound sessions interacted with this request + // How existing device-bound sessions interacted with this request device_bound_sessions::SessionUsage device_bound_session_usage_ = device_bound_sessions::SessionUsage::kUnknown; - // Which device bound sessions have deferred this request, and the + // Which device-bound sessions have deferred this request, and the // result of that refresh. base::flat_map diff --git a/naiveproxy/src/net/url_request/url_request_filter.cc b/naiveproxy/src/net/url_request/url_request_filter.cc index ec04875056..8405d9eca9 100644 --- a/naiveproxy/src/net/url_request/url_request_filter.cc +++ b/naiveproxy/src/net/url_request/url_request_filter.cc @@ -57,7 +57,8 @@ void URLRequestFilter::AddHostnameInterceptor( // Check to see if we're masking URLs in the url_interceptor_map_. for (const auto& [url_spec, _] : url_interceptor_map_) { const GURL url(url_spec); - DCHECK(!hostname_interceptor_map_.contains({url.scheme(), url.host()})); + DCHECK( + !hostname_interceptor_map_.contains({url.GetScheme(), url.GetHost()})); } #endif // !NDEBUG } @@ -79,8 +80,8 @@ bool URLRequestFilter::AddUrlInterceptor( url_interceptor_map_[url.spec()] = std::move(interceptor); // Check to see if this URL is masked by a hostname handler. - DCHECK_EQ( - 0u, hostname_interceptor_map_.count(std::pair(url.scheme(), url.host()))); + DCHECK_EQ(0u, hostname_interceptor_map_.count( + std::pair(url.GetScheme(), url.GetHost()))); return true; } @@ -107,8 +108,8 @@ std::unique_ptr URLRequestFilter::MaybeInterceptRequest( std::unique_ptr job; // Check the hostname map first. - const std::string hostname = request->url().host(); - const std::string scheme = request->url().scheme(); + const std::string hostname = request->url().GetHost(); + const std::string scheme = request->url().GetScheme(); { auto it = hostname_interceptor_map_.find(std::pair(scheme, hostname)); diff --git a/naiveproxy/src/net/url_request/url_request_http_job.cc b/naiveproxy/src/net/url_request/url_request_http_job.cc index f25e19b68c..f02b9cc766 100644 --- a/naiveproxy/src/net/url_request/url_request_http_job.cc +++ b/naiveproxy/src/net/url_request/url_request_http_job.cc @@ -162,12 +162,15 @@ base::Value::Dict CookieInclusionStatusNetLogParams( dict.Set("operation", operation); dict.Set("status", status.GetDebugString()); if (NetLogCaptureIncludesSensitive(capture_mode)) { - if (!cookie_name.empty()) + if (!cookie_name.empty()) { dict.Set("name", cookie_name); - if (!cookie_domain.empty()) + } + if (!cookie_domain.empty()) { dict.Set("domain", cookie_domain); - if (!cookie_path.empty()) + } + if (!cookie_path.empty()) { dict.Set("path", cookie_path); + } } // The partition key is not sensitive, since it is fully determined by the // structure of the page. The cookie may either be partitioned or not, but @@ -195,14 +198,16 @@ void LogTrustAnchor(const std::vector& spki_hashes) { // Don't record metrics if there are no hashes; this is true if the HTTP // load did not come from an active network connection, such as the disk // cache or a synthesized response. - if (spki_hashes.empty()) + if (spki_hashes.empty()) { return; + } int32_t id = 0; for (const auto& hash : spki_hashes) { id = GetNetTrustAnchorHistogramIdForSPKI(hash); - if (id != 0) + if (id != 0) { break; + } } base::UmaHistogramSparse("Net.Certificate.TrustAnchor.Request", id); } @@ -378,7 +383,7 @@ std::unique_ptr URLRequestHttpJob::Create(URLRequest* request) { if (TransportSecurityState* hsts = request->context()->transport_security_state()) { upgrade_decision = hsts->GetSSLUpgradeDecision( - url.host(), + url.GetHost(), /*is_top_level_nav=*/ request->isolation_info().IsOutermostMainFrameRequest(), request->net_log()); @@ -412,7 +417,7 @@ std::unique_ptr URLRequestHttpJob::Create(URLRequest* request) { // Check whether the app allows cleartext traffic to this host, and return // ERR_CLEARTEXT_NOT_PERMITTED if not. if (request->context()->check_cleartext_permitted() && - !android::IsCleartextPermitted(url.host_piece())) { + !android::IsCleartextPermitted(url.host())) { RecordSTSHistograms(SSLUpgradeDecision::kNoUpgrade, /*is_secure=*/false, request->load_flags()); return std::make_unique(request, @@ -443,8 +448,9 @@ URLRequestHttpJob::~URLRequestHttpJob() { void URLRequestHttpJob::SetPriority(RequestPriority priority) { priority_ = priority; - if (transaction_) + if (transaction_) { transaction_->SetPriority(priority_); + } } void URLRequestHttpJob::Start() { @@ -547,8 +553,8 @@ void URLRequestHttpJob::OnGotFirstPartySetMetadata( request_info_.extra_headers.SetHeaderIfMissing( HttpRequestHeaders::kUserAgent, - http_user_agent_settings_ ? - http_user_agent_settings_->GetUserAgent() : std::string()); + http_user_agent_settings_ ? http_user_agent_settings_->GetUserAgent() + : std::string()); AddExtraHeaders(); @@ -561,14 +567,16 @@ void URLRequestHttpJob::OnGotFirstPartySetMetadata( void URLRequestHttpJob::Kill() { weak_factory_.InvalidateWeakPtrs(); - if (transaction_) + if (transaction_) { DestroyTransaction(); + } URLRequestJob::Kill(); } ConnectionAttempts URLRequestHttpJob::GetConnectionAttempts() const { - if (transaction_) + if (transaction_) { return transaction_->GetConnectionAttempts(); + } return {}; } @@ -682,8 +690,9 @@ void URLRequestHttpJob::StartTransaction() { weak_factory_.GetWeakPtr())); // If an extension blocks the request, we rely on the callback to // MaybeStartTransactionInternal(). - if (rv == ERR_IO_PENDING) + if (rv == ERR_IO_PENDING) { return; + } MaybeStartTransactionInternal(rv); return; } @@ -696,8 +705,9 @@ void URLRequestHttpJob::NotifyBeforeStartTransactionCallback( // The request should not have been cancelled or have already completed. DCHECK(!is_done()); - if (headers) + if (headers) { request_info_.extra_headers = headers.value(); + } MaybeStartTransactionInternal(result); } @@ -728,8 +738,9 @@ void URLRequestHttpJob::StartTransactionInternal() { // Notify NetworkQualityEstimator. NetworkQualityEstimator* network_quality_estimator = request()->context()->network_quality_estimator(); - if (network_quality_estimator) + if (network_quality_estimator) { network_quality_estimator->NotifyStartTransaction(*request_); + } if (transaction_.get()) { rv = transaction_->RestartWithAuth( @@ -781,8 +792,9 @@ void URLRequestHttpJob::StartTransactionInternal() { } } - if (rv == ERR_IO_PENDING) + if (rv == ERR_IO_PENDING) { return; + } // The transaction started synchronously, but we need to notify the // URLRequest delegate via the message loop. @@ -804,8 +816,7 @@ void URLRequestHttpJob::AddExtraHeaders() { http_user_agent_settings_->GetAcceptLanguage(); if (!accept_language.empty()) { request_info_.extra_headers.SetHeaderIfMissing( - HttpRequestHeaders::kAcceptLanguage, - accept_language); + HttpRequestHeaders::kAcceptLanguage, accept_language); } } } @@ -994,7 +1005,7 @@ void URLRequestHttpJob::SetCookieHeaderAndStart( base::UmaHistogramCounts100("Net.DeviceBoundSessions.RequestDeferralCount", device_bound_session_deferral_count_); base::UmaHistogramEnumeration( - "Net.DeviceBoundSessions.RequestDeferralDecision", + "Net.DeviceBoundSessions.RequestDeferralDecision2", request_->device_bound_session_usage()); if (device_bound_session_deferral_count_ > 0) { base::UmaHistogramTimes( @@ -1105,6 +1116,12 @@ void URLRequestHttpJob::SaveCookiesAndNotifyHeadersComplete(int result) { request_->cookie_partition_key(), CookieSourceType::kHTTP, &returned_status); + // Log if the resulting cookie is partitioned, if a cookie was created. + if (cookie) { + base::UmaHistogramBoolean("Cookie.SetCookieContainsPartitioned", + cookie->IsPartitioned()); + } + std::optional cookie_to_return = std::nullopt; if (returned_status.IsInclude()) { DCHECK(cookie); @@ -1144,8 +1161,9 @@ void URLRequestHttpJob::SaveCookiesAndNotifyHeadersComplete(int result) { // loop has been exited. num_cookie_lines_left_--; - if (num_cookie_lines_left_ == 0) + if (num_cookie_lines_left_ == 0) { NotifyHeadersComplete(); + } } void URLRequestHttpJob::OnSetCookieResult(const CookieOptions& options, @@ -1157,7 +1175,8 @@ void URLRequestHttpJob::OnSetCookieResult(const CookieOptions& options, NetLogEventType::COOKIE_INCLUSION_STATUS, [&](NetLogCaptureMode capture_mode) { return CookieInclusionStatusNetLogParams( - cookie && cookie->IsExpired(base::Time::Now()) ? "expire" : "store", + cookie && cookie->IsExpired(base::Time::Now()) ? "expire" + : "store", cookie ? cookie.value().Name() : "", cookie ? cookie.value().Domain() : "", cookie ? cookie.value().Path() : "", @@ -1174,8 +1193,9 @@ void URLRequestHttpJob::OnSetCookieResult(const CookieOptions& options, // If all the cookie lines have been handled, |set_cookie_access_result_list_| // now reflects the result of all Set-Cookie lines, and the request can be // continued. - if (num_cookie_lines_left_ == 0) + if (num_cookie_lines_left_ == 0) { NotifyHeadersComplete(); + } } #if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS) @@ -1193,7 +1213,7 @@ void URLRequestHttpJob::ProcessDeviceBoundSessionsHeader() { // appropriately, trigger a registration request per header value to attempt // to create a new session. if (request_->allows_device_bound_session_registration() || - features::kDeviceBoundSessionsForceEnableForTesting.Get()) { + !features::kDeviceBoundSessionsRequireOriginTrialTokens.Get()) { std::vector params = device_bound_sessions::RegistrationFetcherParam::CreateIfValid( request_url, headers); @@ -1214,8 +1234,8 @@ void URLRequestHttpJob::ProcessDeviceBoundSessionsHeader() { headers); for (auto& param : challenge_params) { service->SetChallengeForBoundSession( - request_->device_bound_session_access_callback(), request_url, - std::move(param)); + request_->device_bound_session_access_callback(), *request_, + first_party_set_metadata_, std::move(param)); } } #endif // BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS) @@ -1234,11 +1254,12 @@ void URLRequestHttpJob::ProcessStrictTransportSecurityHeader() { } // Don't accept HSTS headers when the hostname is an IP address. - if (request_info_.url.HostIsIPAddress()) + if (request_info_.url.HostIsIPAddress()) { return; + } // Don't accept HSTS headers for localhost. (crbug.com/41251622) - if (IsLocalHostname(request_info_.url.host()) && + if (IsLocalHostname(request_info_.url.GetHost()) && base::FeatureList::IsEnabled(features::kIgnoreHSTSForLocalhost)) { return; } @@ -1252,7 +1273,7 @@ void URLRequestHttpJob::ProcessStrictTransportSecurityHeader() { std::optional value; if ((value = headers->EnumerateHeader(nullptr, "Strict-Transport-Security"))) { - security_state->AddHSTSHeader(request_info_.url.host(), *value); + security_state->AddHSTSHeader(request_info_.url.GetHost(), *value); } } @@ -1262,8 +1283,9 @@ void URLRequestHttpJob::OnStartCompleted(int result) { // If the job is done (due to cancellation), can just ignore this // notification. - if (done_) + if (done_) { return; + } receive_headers_end_ = base::TimeTicks::Now(); @@ -1291,8 +1313,9 @@ void URLRequestHttpJob::OnStartCompleted(int result) { OnCallToDelegate(NetLogEventType::NETWORK_DELEGATE_HEADERS_RECEIVED); preserve_fragment_on_redirect_url_ = std::nullopt; IPEndPoint endpoint; - if (transaction_) + if (transaction_) { transaction_->GetRemoteEndpoint(&endpoint); + } // The NetworkDelegate must watch for OnRequestDestroyed and not modify // any of the arguments after it's called. // TODO(mattm): change the API to remove the out-params and take the @@ -1323,7 +1346,7 @@ void URLRequestHttpJob::OnStartCompleted(int result) { TransportSecurityState* state = context->transport_security_state(); NotifySSLCertificateError( result, transaction_->GetResponseInfo()->ssl_info, - state->ShouldSSLErrorsBeFatal(request_info_.url.host()) && + state->ShouldSSLErrorsBeFatal(request_info_.url.GetHost()) && result != ERR_CERT_KNOWN_INTERCEPTION_BLOCKED); } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { NotifyCertificateRequested( @@ -1354,8 +1377,9 @@ void URLRequestHttpJob::OnStartCompleted(int result) { } else { // Even on an error, there may be useful information in the response // info (e.g. whether there's a cached copy). - if (transaction_.get()) + if (transaction_.get()) { response_info_ = transaction_->GetResponseInfo(); + } NotifyStartError(result); } } @@ -1375,12 +1399,14 @@ void URLRequestHttpJob::OnReadCompleted(int result) { DCHECK_NE(ERR_IO_PENDING, result); - if (ShouldFixMismatchedContentLength(result)) + if (ShouldFixMismatchedContentLength(result)) { result = OK; + } // EOF or error, done with this job. - if (result <= 0) + if (result <= 0) { DoneWithRequest(FINISHED); + } ReadRawDataComplete(result); } @@ -1452,27 +1478,29 @@ void URLRequestHttpJob::SetExtraRequestHeaders( } LoadState URLRequestHttpJob::GetLoadState() const { - return transaction_.get() ? - transaction_->GetLoadState() : LOAD_STATE_IDLE; + return transaction_.get() ? transaction_->GetLoadState() : LOAD_STATE_IDLE; } bool URLRequestHttpJob::GetMimeType(std::string* mime_type) const { DCHECK(transaction_.get() || override_response_info_); - if (!response_info_) + if (!response_info_) { return false; + } HttpResponseHeaders* headers = GetResponseHeaders(); - if (!headers) + if (!headers) { return false; + } return headers->GetMimeType(mime_type); } bool URLRequestHttpJob::GetCharset(std::string* charset) { DCHECK(transaction_.get() || override_response_info_); - if (!response_info_) + if (!response_info_) { return false; + } return GetResponseHeaders()->GetCharset(charset); } @@ -1494,8 +1522,9 @@ void URLRequestHttpJob::GetResponseInfo(HttpResponseInfo* info) { DCHECK(transaction_.get()); *info = *response_info_; - if (override_response_headers_.get()) + if (override_response_headers_.get()) { info->headers = override_response_headers_; + } } } @@ -1503,10 +1532,12 @@ void URLRequestHttpJob::GetLoadTimingInfo( LoadTimingInfo* load_timing_info) const { // If haven't made it far enough to receive any headers, don't return // anything. This makes for more consistent behavior in the case of errors. - if (!transaction_ || receive_headers_end_.is_null()) + if (!transaction_ || receive_headers_end_.is_null()) { return; - if (transaction_->GetLoadTimingInfo(load_timing_info)) + } + if (transaction_->GetLoadTimingInfo(load_timing_info)) { load_timing_info->receive_headers_end = receive_headers_end_; + } } void URLRequestHttpJob::PopulateLoadTimingInternalInfo( @@ -1518,8 +1549,9 @@ void URLRequestHttpJob::PopulateLoadTimingInternalInfo( bool URLRequestHttpJob::GetTransactionRemoteEndpoint( IPEndPoint* endpoint) const { - if (!transaction_) + if (!transaction_) { return false; + } return transaction_->GetRemoteEndpoint(endpoint); } @@ -1527,23 +1559,26 @@ bool URLRequestHttpJob::GetTransactionRemoteEndpoint( int URLRequestHttpJob::GetResponseCode() const { DCHECK(transaction_.get()); - if (!response_info_) + if (!response_info_) { return -1; + } return GetResponseHeaders()->response_code(); } void URLRequestHttpJob::PopulateNetErrorDetails( NetErrorDetails* details) const { - if (!transaction_) + if (!transaction_) { return; + } return transaction_->PopulateNetErrorDetails(details); } std::unique_ptr URLRequestHttpJob::SetUpSourceStream() { DCHECK(transaction_.get()); - if (!response_info_) + if (!response_info_) { return nullptr; + } std::unique_ptr upstream = URLRequestJob::SetUpSourceStream(); @@ -1587,13 +1622,13 @@ bool URLRequestHttpJob::IsSafeRedirect(const GURL& location) { // HTTP is always safe. // TODO(pauljensen): Remove once crbug.com/146591 is fixed. if (location.is_valid() && - (location.scheme() == "http" || location.scheme() == "https")) { + (location.GetScheme() == "http" || location.GetScheme() == "https")) { return true; } // Query URLRequestJobFactory as to whether |location| would be safe to // redirect to. return request_->context()->job_factory() && - request_->context()->job_factory()->IsSafeRedirectTarget(location); + request_->context()->job_factory()->IsSafeRedirectTarget(location); } bool URLRequestHttpJob::NeedsAuth() { @@ -1603,20 +1638,23 @@ bool URLRequestHttpJob::NeedsAuth() { return false; } int code = GetResponseCode(); - if (code == -1) + if (code == -1) { return false; + } // Check if we need either Proxy or WWW Authentication. This could happen // because we either provided no auth info, or provided incorrect info. switch (code) { case 407: - if (proxy_auth_state_ == AUTH_STATE_CANCELED) + if (proxy_auth_state_ == AUTH_STATE_CANCELED) { return false; + } proxy_auth_state_ = AUTH_STATE_NEED_AUTH; return true; case 401: - if (server_auth_state_ == AUTH_STATE_CANCELED) + if (server_auth_state_ == AUTH_STATE_CANCELED) { return false; + } server_auth_state_ = AUTH_STATE_NEED_AUTH; return true; } @@ -1675,8 +1713,9 @@ std::unique_ptr URLRequestHttpJob::GetAuthChallengeInfo() { (GetResponseHeaders()->response_code() == HTTP_PROXY_AUTHENTICATION_REQUIRED)); - if (!response_info_->auth_challenge.has_value()) + if (!response_info_->auth_challenge.has_value()) { return nullptr; + } return std::make_unique( response_info_->auth_challenge.value()); } @@ -1732,8 +1771,9 @@ void URLRequestHttpJob::ContinueWithCertificate( std::move(client_cert), std::move(client_private_key), base::BindOnce(&URLRequestHttpJob::OnStartCompleted, base::Unretained(this))); - if (rv == ERR_IO_PENDING) + if (rv == ERR_IO_PENDING) { return; + } // The transaction started synchronously, but we need to notify the // URLRequest delegate via the message loop. @@ -1744,8 +1784,9 @@ void URLRequestHttpJob::ContinueWithCertificate( void URLRequestHttpJob::ContinueDespiteLastError() { // If the transaction was destroyed, then the job was cancelled. - if (!transaction_.get()) + if (!transaction_.get()) { return; + } DCHECK(!response_info_) << "should not have a response yet"; DCHECK(!override_response_headers_); @@ -1755,8 +1796,9 @@ void URLRequestHttpJob::ContinueDespiteLastError() { int rv = transaction_->RestartIgnoringLastError(base::BindOnce( &URLRequestHttpJob::OnStartCompleted, base::Unretained(this))); - if (rv == ERR_IO_PENDING) + if (rv == ERR_IO_PENDING) { return; + } // The transaction started synchronously, but we need to notify the // URLRequest delegate via the message loop. @@ -1773,8 +1815,9 @@ bool URLRequestHttpJob::ShouldFixMismatchedContentLength(int rv) const { if (rv == ERR_CONTENT_LENGTH_MISMATCH || rv == ERR_INCOMPLETE_CHUNKED_ENCODING) { if (request_->response_headers()) { - int64_t expected_length = + std::optional content_length = request_->response_headers()->GetContentLength(); + int expected_length = content_length ? content_length->InBytes() : -1; VLOG(1) << __func__ << "() \"" << request_->url().spec() << "\"" << " content-length = " << expected_length << " pre total = " << prefilter_bytes_read() @@ -1797,14 +1840,17 @@ int URLRequestHttpJob::ReadRawData(IOBuffer* buf, int buf_size) { base::BindOnce(&URLRequestHttpJob::OnReadCompleted, base::Unretained(this))); - if (ShouldFixMismatchedContentLength(rv)) + if (ShouldFixMismatchedContentLength(rv)) { rv = OK; + } - if (rv == 0 || (rv < 0 && rv != ERR_IO_PENDING)) + if (rv == 0 || (rv < 0 && rv != ERR_IO_PENDING)) { DoneWithRequest(FINISHED); + } - if (rv == ERR_IO_PENDING) + if (rv == ERR_IO_PENDING) { read_in_progress_ = true; + } return rv; } @@ -1812,15 +1858,17 @@ int URLRequestHttpJob::ReadRawData(IOBuffer* buf, int buf_size) { int64_t URLRequestHttpJob::GetTotalReceivedBytes() const { int64_t total_received_bytes = total_received_bytes_from_previous_transactions_; - if (transaction_) + if (transaction_) { total_received_bytes += transaction_->GetTotalReceivedBytes(); + } return total_received_bytes; } int64_t URLRequestHttpJob::GetTotalSentBytes() const { int64_t total_sent_bytes = total_sent_bytes_from_previous_transactions_; - if (transaction_) + if (transaction_) { total_sent_bytes += transaction_->GetTotalSentBytes(); + } return total_sent_bytes; } @@ -1932,8 +1980,9 @@ void URLRequestHttpJob::SetResponseHeadersCallback( } void URLRequestHttpJob::RecordCompletionHistograms(CompletionCause reason) { - if (start_time_.is_null()) + if (start_time_.is_null()) { return; + } base::TimeDelta total_time = base::TimeTicks::Now() - start_time_; base::UmaHistogramTimes("Net.HttpJob.TotalTime", total_time); @@ -2019,10 +2068,6 @@ void URLRequestHttpJob::RecordCompletionHistograms(CompletionCause reason) { } else { base::UmaHistogramTimes("Net.HttpJob.TotalTimeNotCached", total_time); if (response_info_->was_mdl_match) { - base::UmaHistogramCustomCounts( - "Net.HttpJob.IpProtection.AllowListMatch.BytesSent", - GetTotalSentBytes(), 1, 50000000, 50); - base::UmaHistogramCustomCounts( "Net.HttpJob.IpProtection.AllowListMatch.PrefilterBytesRead.Net", prefilter_bytes_read(), 1, 50000000, 50); @@ -2031,13 +2076,8 @@ void URLRequestHttpJob::RecordCompletionHistograms(CompletionCause reason) { auto& proxy_chain = response_info_->proxy_chain; bool direct_only = features::kIpPrivacyDirectOnly.Get(); if (proxy_chain.is_for_ip_protection()) { - base::UmaHistogramTimes("Net.HttpJob.IpProtection.TotalTimeNotCached2", + base::UmaHistogramTimes("Net.HttpJob.IpProtection.TotalTimeNotCached3", total_time); - base::UmaHistogramTimes( - base::StrCat( - {"Net.HttpJob.IpProtection.TotalTimeNotCached2.Chain", - base::NumberToString(proxy_chain.ip_protection_chain_id())}), - total_time); base::UmaHistogramCustomCounts("Net.HttpJob.IpProtection.BytesSent2", GetTotalSentBytes(), 1, 50000000, 50); base::UmaHistogramCustomCounts( @@ -2050,9 +2090,10 @@ void URLRequestHttpJob::RecordCompletionHistograms(CompletionCause reason) { // true. When it is false, we only care about traffic that actually went // through the IP Protection proxies, so a direct chain must be a // fallback. - // Note that these histograms don't log anything when IP Protection fails - // and we fall back to direct. That makes them unsuitable for measuring - // the success of experiments. Use the *2 variants above for that. + // Note that the non-chain-specific histograms don't log anything when IP + // Protection fails and we fall back to direct. That makes them unsuitable + // for measuring the success of experiments. Use the *2 variants above for + // that. bool protection_success = proxy_chain.is_for_ip_protection() && (!proxy_chain.is_direct() || direct_only); if (protection_success) { @@ -2096,12 +2137,7 @@ void URLRequestHttpJob::RecordCompletionHistograms(CompletionCause reason) { } else { ipp_result = IpProtectionJobResult::kDirectFallback; base::UmaHistogramTimes( - "Net.HttpJob.IpProtection.Fallback.TotalTimeNotCached", - total_time); - base::UmaHistogramTimes( - base::StrCat( - {"Net.HttpJob.IpProtection.Fallback.TotalTimeNotCached.Chain", - base::NumberToString(proxy_chain.ip_protection_chain_id())}), + "Net.HttpJob.IpProtection.Fallback.TotalTimeNotCached2", total_time); base::UmaHistogramCustomCounts( "Net.HttpJob.IpProtection.Fallback.BytesSent", @@ -2123,12 +2159,21 @@ void URLRequestHttpJob::RecordCompletionHistograms(CompletionCause reason) { } } + for (const auto& [_, result] : request_->device_bound_session_deferrals()) { + base::UmaHistogramEnumeration( + request_->failed() + ? "Net.DeviceBoundSessions.DeferralResultByOutcome.Failure" + : "Net.DeviceBoundSessions.DeferralResultByOutcome.Success", + result); + } + start_time_ = base::TimeTicks(); } void URLRequestHttpJob::DoneWithRequest(CompletionCause reason) { - if (done_) + if (done_) { return; + } done_ = true; // Notify NetworkQualityEstimator. @@ -2151,9 +2196,9 @@ HttpResponseHeaders* URLRequestHttpJob::GetResponseHeaders() const { DCHECK(transaction_.get()); DCHECK(transaction_->GetResponseInfo()); - return override_response_headers_.get() ? - override_response_headers_.get() : - transaction_->GetResponseInfo()->headers.get(); + return override_response_headers_.get() + ? override_response_headers_.get() + : transaction_->GetResponseInfo()->headers.get(); } void URLRequestHttpJob::NotifyURLRequestDestroyed() { @@ -2162,8 +2207,9 @@ void URLRequestHttpJob::NotifyURLRequestDestroyed() { // Notify NetworkQualityEstimator. NetworkQualityEstimator* network_quality_estimator = request()->context()->network_quality_estimator(); - if (network_quality_estimator) + if (network_quality_estimator) { network_quality_estimator->NotifyURLRequestDestroyed(*request()); + } } bool URLRequestHttpJob::ShouldAddCookieHeader() const { diff --git a/naiveproxy/src/net/url_request/url_request_job.cc b/naiveproxy/src/net/url_request/url_request_job.cc index ff36f3719d..f65b7e6ecc 100644 --- a/naiveproxy/src/net/url_request/url_request_job.cc +++ b/naiveproxy/src/net/url_request/url_request_job.cc @@ -517,10 +517,12 @@ void URLRequestJob::NotifyFinalHeadersReceived() { // headers, and the response body is not compressed, try to get the // expected content size from the headers. if (expected_content_size_ == -1 && request_->response_headers()) { - // This sets |expected_content_size_| to its previous value of -1 if - // there's no Content-Length header. - expected_content_size_ = + // This keeps |expected_content_size_| at its value of -1 if there's no + // Content-Length header. + std::optional content_length = request_->response_headers()->GetContentLength(); + expected_content_size_ = + content_length ? content_length->InBytes() : -1; } } else { request_->net_log().AddEvent( diff --git a/naiveproxy/src/net/url_request/url_request_job_factory.cc b/naiveproxy/src/net/url_request/url_request_job_factory.cc index 68b4dae4b2..d47fa04c47 100644 --- a/naiveproxy/src/net/url_request/url_request_job_factory.cc +++ b/naiveproxy/src/net/url_request/url_request_job_factory.cc @@ -107,7 +107,7 @@ std::unique_ptr URLRequestJobFactory::CreateJob( return job; } - auto it = protocol_handler_map_.find(request->url().scheme()); + auto it = protocol_handler_map_.find(request->url().GetScheme()); if (it == protocol_handler_map_.end()) { return std::make_unique(request, ERR_UNKNOWN_URL_SCHEME); @@ -122,7 +122,7 @@ bool URLRequestJobFactory::IsSafeRedirectTarget(const GURL& location) const { // Error cases are safely handled. return true; } - auto it = protocol_handler_map_.find(location.scheme()); + auto it = protocol_handler_map_.find(location.GetScheme()); if (it == protocol_handler_map_.end()) { // Unhandled cases are safely handled. return true; diff --git a/naiveproxy/src/net/url_request/url_request_netlog_params.cc b/naiveproxy/src/net/url_request/url_request_netlog_params.cc index 6299134a9f..89884df2dc 100644 --- a/naiveproxy/src/net/url_request/url_request_netlog_params.cc +++ b/naiveproxy/src/net/url_request/url_request_netlog_params.cc @@ -19,9 +19,10 @@ namespace net { base::Value::Dict NetLogURLRequestConstructorParams( const GURL& url, RequestPriority priority, - NetworkTrafficAnnotationTag traffic_annotation) { + NetworkTrafficAnnotationTag traffic_annotation, + NetLogCaptureMode capture_mode) { base::Value::Dict dict; - dict.Set("url", url.possibly_invalid_spec()); + dict.Set("url", SanitizeUrlForNetLog(url, capture_mode)); dict.Set("priority", RequestPriorityToString(priority)); dict.Set("traffic_annotation", traffic_annotation.unique_id_hash_code); return dict; @@ -34,9 +35,10 @@ base::Value::Dict NetLogURLRequestStartParams( const IsolationInfo& isolation_info, const SiteForCookies& site_for_cookies, const std::optional& initiator, - int64_t upload_id) { + int64_t upload_id, + NetLogCaptureMode capture_mode) { base::Value::Dict dict; - dict.Set("url", url.possibly_invalid_spec()); + dict.Set("url", SanitizeUrlForNetLog(url, capture_mode)); dict.Set("method", method); dict.Set("load_flags", load_flags); dict.Set("network_isolation_key", diff --git a/naiveproxy/src/net/url_request/url_request_netlog_params.h b/naiveproxy/src/net/url_request/url_request_netlog_params.h index c11a068f4e..8c4feae06e 100644 --- a/naiveproxy/src/net/url_request/url_request_netlog_params.h +++ b/naiveproxy/src/net/url_request/url_request_netlog_params.h @@ -33,7 +33,8 @@ class SiteForCookies; NET_EXPORT base::Value::Dict NetLogURLRequestConstructorParams( const GURL& url, RequestPriority priority, - NetworkTrafficAnnotationTag traffic_annotation); + NetworkTrafficAnnotationTag traffic_annotation, + NetLogCaptureMode capture_mode); // Returns a Value containing NetLog parameters for starting a URLRequest. NET_EXPORT base::Value::Dict NetLogURLRequestStartParams( @@ -43,7 +44,8 @@ NET_EXPORT base::Value::Dict NetLogURLRequestStartParams( const IsolationInfo& isolation_info, const SiteForCookies& site_for_cookies, const std::optional& initiator, - int64_t upload_id); + int64_t upload_id, + NetLogCaptureMode capture_mode); } // namespace net diff --git a/naiveproxy/src/net/websockets/websocket_basic_handshake_stream.cc b/naiveproxy/src/net/websockets/websocket_basic_handshake_stream.cc index 4003429181..8553931c0c 100644 --- a/naiveproxy/src/net/websockets/websocket_basic_handshake_stream.cc +++ b/naiveproxy/src/net/websockets/websocket_basic_handshake_stream.cc @@ -73,7 +73,7 @@ enum GetHeaderResult { GET_HEADER_MULTIPLE, }; -std::string MissingHeaderMessage(const std::string& header_name) { +std::string MissingHeaderMessage(std::string_view header_name) { return base::StrCat({"'", header_name, "' header is missing"}); } @@ -100,7 +100,7 @@ GetHeaderResult GetSingleHeaderValue(const HttpResponseHeaders* headers, } bool ValidateHeaderHasSingleValue(GetHeaderResult result, - const std::string& header_name, + std::string_view header_name, std::string* failure_message) { if (result == GET_HEADER_MISSING) { *failure_message = MissingHeaderMessage(header_name); diff --git a/naiveproxy/src/net/websockets/websocket_channel.cc b/naiveproxy/src/net/websockets/websocket_channel.cc index 4386152625..576e57de2f 100644 --- a/naiveproxy/src/net/websockets/websocket_channel.cc +++ b/naiveproxy/src/net/websockets/websocket_channel.cc @@ -188,9 +188,10 @@ class WebSocketChannel::ConnectDelegate creator_->OnCreateURLRequest(request); } - void OnURLRequestConnected(URLRequest* request, - const TransportInfo& info) override { - creator_->OnURLRequestConnected(request, info); + int OnURLRequestConnected(URLRequest* request, + const TransportInfo& info, + CompletionOnceCallback callback) override { + return creator_->OnURLRequestConnected(request, info, std::move(callback)); } void OnSuccess( @@ -443,9 +444,11 @@ void WebSocketChannel::OnCreateURLRequest(URLRequest* request) { event_interface_->OnCreateURLRequest(request); } -void WebSocketChannel::OnURLRequestConnected(URLRequest* request, - const TransportInfo& info) { - event_interface_->OnURLRequestConnected(request, info); +int WebSocketChannel::OnURLRequestConnected(URLRequest* request, + const TransportInfo& info, + CompletionOnceCallback callback) { + return event_interface_->OnURLRequestConnected(request, info, + std::move(callback)); } void WebSocketChannel::OnConnectSuccess( diff --git a/naiveproxy/src/net/websockets/websocket_channel.h b/naiveproxy/src/net/websockets/websocket_channel.h index 28d12edae5..ce6bf430b9 100644 --- a/naiveproxy/src/net/websockets/websocket_channel.h +++ b/naiveproxy/src/net/websockets/websocket_channel.h @@ -205,7 +205,9 @@ class NET_EXPORT WebSocketChannel { // Called when a URLRequest's OnConnected is called. Forwards the call to the // |event_interface_| - void OnURLRequestConnected(URLRequest* request, const TransportInfo& info); + int OnURLRequestConnected(URLRequest* request, + const TransportInfo& info, + CompletionOnceCallback callback); // Success callback from WebSocketStream::CreateAndConnectStream(). Reports // success to the event interface. May delete |this|. diff --git a/naiveproxy/src/net/websockets/websocket_event_interface.h b/naiveproxy/src/net/websockets/websocket_event_interface.h index a7dd53cf3c..fb2da15663 100644 --- a/naiveproxy/src/net/websockets/websocket_event_interface.h +++ b/naiveproxy/src/net/websockets/websocket_event_interface.h @@ -15,6 +15,7 @@ #include "base/containers/span.h" #include "base/functional/callback_forward.h" #include "base/memory/scoped_refptr.h" +#include "net/base/completion_once_callback.h" #include "net/base/net_export.h" class GURL; @@ -46,8 +47,9 @@ class NET_EXPORT WebSocketEventInterface { virtual void OnCreateURLRequest(URLRequest* request) = 0; // Called when OnConnected is called on the URLRequest for handshaking. - virtual void OnURLRequestConnected(URLRequest* request, - const TransportInfo& info) = 0; + virtual int OnURLRequestConnected(URLRequest* request, + const TransportInfo& info, + CompletionOnceCallback callback) = 0; // Called in response to an AddChannelRequest. This means that a response has // been received from the remote server. diff --git a/naiveproxy/src/net/websockets/websocket_handshake_challenge.cc b/naiveproxy/src/net/websockets/websocket_handshake_challenge.cc index e3b2b8df3d..c532290622 100644 --- a/naiveproxy/src/net/websockets/websocket_handshake_challenge.cc +++ b/naiveproxy/src/net/websockets/websocket_handshake_challenge.cc @@ -6,12 +6,14 @@ #include "base/base64.h" #include "base/hash/sha1.h" +#include "base/strings/strcat.h" #include "net/websockets/websocket_handshake_constants.h" namespace net { -std::string ComputeSecWebSocketAccept(const std::string& key) { - std::string hash = base::SHA1HashString(key + websockets::kWebSocketGuid); +std::string ComputeSecWebSocketAccept(std::string_view key) { + std::string hash = + base::SHA1HashString(base::StrCat({key, websockets::kWebSocketGuid})); return base::Base64Encode(hash); } diff --git a/naiveproxy/src/net/websockets/websocket_handshake_challenge.h b/naiveproxy/src/net/websockets/websocket_handshake_challenge.h index 5ff3192355..b2d53e31a1 100644 --- a/naiveproxy/src/net/websockets/websocket_handshake_challenge.h +++ b/naiveproxy/src/net/websockets/websocket_handshake_challenge.h @@ -5,7 +5,7 @@ #ifndef NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_CHALLENGE_H_ #define NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_CHALLENGE_H_ -#include +#include #include "net/base/net_export.h" @@ -13,8 +13,7 @@ namespace net { // Given a WebSocket handshake challenge, compute the value that the server // should return in the Sec-WebSocket-Accept header. -NET_EXPORT_PRIVATE std::string ComputeSecWebSocketAccept( - const std::string& key); +NET_EXPORT std::string ComputeSecWebSocketAccept(std::string_view key); } // namespace net diff --git a/naiveproxy/src/net/websockets/websocket_handshake_constants.cc b/naiveproxy/src/net/websockets/websocket_handshake_constants.cc deleted file mode 100644 index 49744a7c8c..0000000000 --- a/naiveproxy/src/net/websockets/websocket_handshake_constants.cc +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2013 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/websockets/websocket_handshake_constants.h" - -namespace net::websockets { - -const char kHttpProtocolVersion[] = "HTTP/1.1"; - -const char kSecWebSocketProtocol[] = "Sec-WebSocket-Protocol"; -const char kSecWebSocketExtensions[] = "Sec-WebSocket-Extensions"; -const char kSecWebSocketKey[] = "Sec-WebSocket-Key"; -const char kSecWebSocketAccept[] = "Sec-WebSocket-Accept"; -const char kSecWebSocketVersion[] = "Sec-WebSocket-Version"; - -const char kSupportedVersion[] = "13"; - -const char kUpgrade[] = "Upgrade"; -const char kWebSocketGuid[] = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; - -const char kWebSocketLowercase[] = "websocket"; - -} // namespace net::websockets diff --git a/naiveproxy/src/net/websockets/websocket_handshake_constants.h b/naiveproxy/src/net/websockets/websocket_handshake_constants.h index 971b129d5e..0f058f8f18 100644 --- a/naiveproxy/src/net/websockets/websocket_handshake_constants.h +++ b/naiveproxy/src/net/websockets/websocket_handshake_constants.h @@ -14,8 +14,6 @@ #include -#include "net/base/net_export.h" - // This file plases constants inside the ::net::websockets namespace to avoid // risk of collisions with other symbols in libnet. namespace net::websockets { @@ -23,41 +21,41 @@ namespace net::websockets { // "HTTP/1.1" // RFC6455 only requires HTTP/1.1 "or better" but in practice an HTTP version // other than 1.1 should not occur in a WebSocket handshake. -extern const char kHttpProtocolVersion[]; +inline constexpr char kHttpProtocolVersion[] = "HTTP/1.1"; // The Sec-WebSockey-Key challenge is 16 random bytes, base64 encoded. inline constexpr size_t kRawChallengeLength = 16; // "Sec-WebSocket-Protocol" -extern const char kSecWebSocketProtocol[]; +inline constexpr char kSecWebSocketProtocol[] = "Sec-WebSocket-Protocol"; // "Sec-WebSocket-Extensions" -extern const char kSecWebSocketExtensions[]; +inline constexpr char kSecWebSocketExtensions[] = "Sec-WebSocket-Extensions"; // "Sec-WebSocket-Key" -extern const char kSecWebSocketKey[]; +inline constexpr char kSecWebSocketKey[] = "Sec-WebSocket-Key"; // "Sec-WebSocket-Accept" -extern const char kSecWebSocketAccept[]; +inline constexpr char kSecWebSocketAccept[] = "Sec-WebSocket-Accept"; // "Sec-WebSocket-Version" -extern const char kSecWebSocketVersion[]; +inline constexpr char kSecWebSocketVersion[] = "Sec-WebSocket-Version"; // This implementation only supports one version of the WebSocket protocol, // "13", as specified in RFC6455. If support for multiple versions is added in // future, it will probably no longer be worth having a constant for this. -extern const char kSupportedVersion[]; +inline constexpr char kSupportedVersion[] = "13"; // "Upgrade" -extern const char kUpgrade[]; +inline constexpr char kUpgrade[] = "Upgrade"; // "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" as defined in section 4.1 of // RFC6455. -extern const char NET_EXPORT kWebSocketGuid[]; +inline constexpr char kWebSocketGuid[] = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; // "websocket", as used in the "Upgrade:" header. This is always lowercase // (except in obsolete versions of the protocol). -extern const char kWebSocketLowercase[]; +inline constexpr char kWebSocketLowercase[] = "websocket"; } // namespace net::websockets diff --git a/naiveproxy/src/net/websockets/websocket_handshake_stream_base.cc b/naiveproxy/src/net/websockets/websocket_handshake_stream_base.cc index ba3bf6c771..e7b9802f2b 100644 --- a/naiveproxy/src/net/websockets/websocket_handshake_stream_base.cc +++ b/naiveproxy/src/net/websockets/websocket_handshake_stream_base.cc @@ -20,7 +20,7 @@ namespace net { namespace { -size_t AddVectorHeaderIfNonEmpty(const char* name, +size_t AddVectorHeaderIfNonEmpty(std::string_view name, const std::vector& value, HttpRequestHeaders* headers) { if (value.empty()) { @@ -36,7 +36,7 @@ size_t AddVectorHeaderIfNonEmpty(const char* name, // static std::string WebSocketHandshakeStreamBase::MultipleHeaderValuesMessage( - const std::string& header_name) { + std::string_view header_name) { return base::StrCat( {"'", header_name, "' header must not appear more than once in a response"}); diff --git a/naiveproxy/src/net/websockets/websocket_handshake_stream_base.h b/naiveproxy/src/net/websockets/websocket_handshake_stream_base.h index e2978795da..f3afb1d5e2 100644 --- a/naiveproxy/src/net/websockets/websocket_handshake_stream_base.h +++ b/naiveproxy/src/net/websockets/websocket_handshake_stream_base.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include "base/memory/weak_ptr.h" @@ -151,8 +152,7 @@ class NET_EXPORT WebSocketHandshakeStreamBase : public HttpStream { void SetRequestHeadersCallback(RequestHeadersCallback callback) override {} - static std::string MultipleHeaderValuesMessage( - const std::string& header_name); + static std::string MultipleHeaderValuesMessage(std::string_view header_name); // Subclasses need to implement this method so that the resulting weak // pointers are invalidated as soon as the derived class is destroyed. diff --git a/naiveproxy/src/net/websockets/websocket_stream.cc b/naiveproxy/src/net/websockets/websocket_stream.cc index 174a8b1b97..b7fc307c7b 100644 --- a/naiveproxy/src/net/websockets/websocket_stream.cc +++ b/naiveproxy/src/net/websockets/websocket_stream.cc @@ -373,8 +373,8 @@ class SSLErrorCallbacks : public WebSocketEventInterface::SSLErrorCallbacks { int Delegate::OnConnected(URLRequest* request, const TransportInfo& info, CompletionOnceCallback callback) { - owner_->connect_delegate()->OnURLRequestConnected(request, info); - return OK; + return owner_->connect_delegate()->OnURLRequestConnected(request, info, + std::move(callback)); } void Delegate::OnReceivedRedirect(URLRequest* request, diff --git a/naiveproxy/src/net/websockets/websocket_stream.h b/naiveproxy/src/net/websockets/websocket_stream.h index 433bbfc199..24f045c29d 100644 --- a/naiveproxy/src/net/websockets/websocket_stream.h +++ b/naiveproxy/src/net/websockets/websocket_stream.h @@ -106,8 +106,9 @@ class NET_EXPORT_PRIVATE WebSocketStream { virtual void OnCreateRequest(URLRequest* url_request) = 0; // Called when the URLRequest::OnConnected() is called. - virtual void OnURLRequestConnected(URLRequest* request, - const TransportInfo& info) = 0; + virtual int OnURLRequestConnected(URLRequest* request, + const TransportInfo& info, + CompletionOnceCallback callback) = 0; // Called on successful connection. The parameter is an object derived from // WebSocketStream. diff --git a/naiveproxy/src/net/websockets/websocket_stream_create_test_base.cc b/naiveproxy/src/net/websockets/websocket_stream_create_test_base.cc index 73ef4d96ff..1958ceee51 100644 --- a/naiveproxy/src/net/websockets/websocket_stream_create_test_base.cc +++ b/naiveproxy/src/net/websockets/websocket_stream_create_test_base.cc @@ -45,8 +45,13 @@ class WebSocketStreamCreateTestBase::TestConnectDelegate owner_->url_request_ = request; } - void OnURLRequestConnected(URLRequest* request, - const TransportInfo& info) override {} + int OnURLRequestConnected(URLRequest* request, + const TransportInfo& info, + CompletionOnceCallback callback) override { + owner_->on_url_request_connected_callback_ = std::move(callback); + owner_->run_loop_waiting_on_url_request_connected_.Quit(); + return owner_->on_url_request_connected_rv_; + } void OnSuccess( std::unique_ptr stream, @@ -156,6 +161,10 @@ void WebSocketStreamCreateTestBase::WaitUntilOnAuthRequired() { run_loop_waiting_for_on_auth_required_.Run(); } +void WebSocketStreamCreateTestBase::WaitUntilOnURLRequestConnected() { + run_loop_waiting_on_url_request_connected_.Run(); +} + std::vector WebSocketStreamCreateTestBase::NoSubProtocols() { return std::vector(); } diff --git a/naiveproxy/src/net/websockets/websocket_stream_create_test_base.h b/naiveproxy/src/net/websockets/websocket_stream_create_test_base.h index 619b50d961..f410124aeb 100644 --- a/naiveproxy/src/net/websockets/websocket_stream_create_test_base.h +++ b/naiveproxy/src/net/websockets/websocket_stream_create_test_base.h @@ -86,6 +86,10 @@ class WebSocketStreamCreateTestBase : public WithTaskEnvironment { // called. void WaitUntilOnAuthRequired(); + // Runs |run_loop_waiting_on_url_request_connected_| until + // OnURLRequestConnected() is called. + void WaitUntilOnURLRequestConnected(); + // A simple function to make the tests more readable. std::vector NoSubProtocols(); @@ -113,6 +117,12 @@ class WebSocketStreamCreateTestBase : public WithTaskEnvironment { // OnAuthRequired returns this value. int on_auth_required_rv_ = OK; + // Used to control the behaviour of OnURLRequestConnected() + CompletionOnceCallback on_url_request_connected_callback_; + int on_url_request_connected_rv_ = OK; + + base::RunLoop run_loop_waiting_on_url_request_connected_; + base::RunLoop connect_run_loop_; base::RunLoop run_loop_waiting_for_on_auth_required_; diff --git a/naiveproxy/src/net/websockets/websocket_test_util.cc b/naiveproxy/src/net/websockets/websocket_test_util.cc index 7156400392..6d9c4c6eef 100644 --- a/naiveproxy/src/net/websockets/websocket_test_util.cc +++ b/naiveproxy/src/net/websockets/websocket_test_util.cc @@ -94,19 +94,20 @@ std::string WebSocketStandardRequestWithCookies( std::stringstream request_headers; request_headers << base::StringPrintf("GET %s HTTP/1.1\r\n", path.c_str()); - headers.SetHeader("Host", host); - headers.SetHeader("Connection", "Upgrade"); - headers.SetHeader("Pragma", "no-cache"); - headers.SetHeader("Cache-Control", "no-cache"); + headers.SetHeader(net::HttpRequestHeaders::kHost, host); + headers.SetHeader(net::HttpRequestHeaders::kConnection, "Upgrade"); + headers.SetHeader(net::HttpRequestHeaders::kPragma, "no-cache"); + headers.SetHeader(net::HttpRequestHeaders::kCacheControl, "no-cache"); for (const auto& [key, value] : send_additional_request_headers) headers.SetHeader(key, value); headers.SetHeader("Upgrade", "websocket"); - headers.SetHeader("Origin", origin.Serialize()); + headers.SetHeader(net::HttpRequestHeaders::kOrigin, origin.Serialize()); headers.SetHeader("Sec-WebSocket-Version", "13"); - if (!headers.HasHeader("User-Agent")) - headers.SetHeader("User-Agent", ""); - headers.SetHeader("Accept-Encoding", "gzip, deflate"); - headers.SetHeader("Accept-Language", "en-us,fr"); + if (!headers.HasHeader(net::HttpRequestHeaders::kUserAgent)) { + headers.SetHeader(net::HttpRequestHeaders::kUserAgent, ""); + } + headers.SetHeader(net::HttpRequestHeaders::kAcceptEncoding, "gzip, deflate"); + headers.SetHeader(net::HttpRequestHeaders::kAcceptLanguage, "en-us,fr"); for (const auto& [key, value] : cookies) headers.SetHeader(key, value); headers.SetHeader("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ=="); @@ -130,16 +131,19 @@ std::string WebSocketStandardResponse(const std::string& extra_headers) { HttpRequestHeaders WebSocketCommonTestHeaders() { HttpRequestHeaders request_headers; - request_headers.SetHeader("Host", "www.example.org"); - request_headers.SetHeader("Connection", "Upgrade"); - request_headers.SetHeader("Pragma", "no-cache"); - request_headers.SetHeader("Cache-Control", "no-cache"); + request_headers.SetHeader(net::HttpRequestHeaders::kHost, "www.example.org"); + request_headers.SetHeader(net::HttpRequestHeaders::kConnection, "Upgrade"); + request_headers.SetHeader(net::HttpRequestHeaders::kPragma, "no-cache"); + request_headers.SetHeader(net::HttpRequestHeaders::kCacheControl, "no-cache"); request_headers.SetHeader("Upgrade", "websocket"); - request_headers.SetHeader("Origin", "http://origin.example.org"); + request_headers.SetHeader(net::HttpRequestHeaders::kOrigin, + "http://origin.example.org"); request_headers.SetHeader("Sec-WebSocket-Version", "13"); - request_headers.SetHeader("User-Agent", ""); - request_headers.SetHeader("Accept-Encoding", "gzip, deflate"); - request_headers.SetHeader("Accept-Language", "en-us,fr"); + request_headers.SetHeader(net::HttpRequestHeaders::kUserAgent, ""); + request_headers.SetHeader(net::HttpRequestHeaders::kAcceptEncoding, + "gzip, deflate"); + request_headers.SetHeader(net::HttpRequestHeaders::kAcceptLanguage, + "en-us,fr"); return request_headers; } @@ -270,8 +274,12 @@ void WebSocketTestURLRequestContextHost::SetProxyConfig( std::move(proxy_resolution_service)); } -void DummyConnectDelegate::OnURLRequestConnected(URLRequest* request, - const TransportInfo& info) {} +int DummyConnectDelegate::OnURLRequestConnected( + URLRequest* request, + const TransportInfo& info, + CompletionOnceCallback callback) { + return OK; +} int DummyConnectDelegate::OnAuthRequired( const AuthChallengeInfo& auth_info, diff --git a/naiveproxy/src/net/websockets/websocket_test_util.h b/naiveproxy/src/net/websockets/websocket_test_util.h index f865edaf3d..5df57f30f6 100644 --- a/naiveproxy/src/net/websockets/websocket_test_util.h +++ b/naiveproxy/src/net/websockets/websocket_test_util.h @@ -204,8 +204,9 @@ class DummyConnectDelegate : public WebSocketStream::ConnectDelegate { public: DummyConnectDelegate() = default; ~DummyConnectDelegate() override = default; - void OnURLRequestConnected(URLRequest* request, - const TransportInfo& info) override; + int OnURLRequestConnected(URLRequest* request, + const TransportInfo& info, + CompletionOnceCallback callback) override; void OnCreateRequest(URLRequest* url_request) override {} void OnSuccess( std::unique_ptr stream, diff --git a/naiveproxy/src/third_party/abseil-cpp/BUILD.gn b/naiveproxy/src/third_party/abseil-cpp/BUILD.gn index f227c8344d..f7d178952f 100644 --- a/naiveproxy/src/third_party/abseil-cpp/BUILD.gn +++ b/naiveproxy/src/third_party/abseil-cpp/BUILD.gn @@ -7,6 +7,7 @@ # without these options will be part of the same program. import("//build/config/c++/c++.gni") +import("//build/config/compiler/compiler.gni") import("//build/config/sanitizers/sanitizers.gni") import("//build/toolchain/toolchain.gni") import("//build_overrides/build.gni") @@ -22,33 +23,31 @@ component("absl") { public_configs = [ ":absl_component_build" ] if (is_win && is_clang) { - if (current_cpu == "x64") { - if (is_debug) { - sources = [ "symbols_x64_dbg.def" ] - } else { - if (is_asan) { - sources = [ "symbols_x64_rel_asan.def" ] - } else { - sources = [ "symbols_x64_rel.def" ] - } - } + file = "symbols_${current_cpu}" + if (is_debug) { + file = "${file}_dbg" + } else { + file = "${file}_rel" } - if (current_cpu == "x86") { - if (is_debug) { - sources = [ "symbols_x86_dbg.def" ] - } else { - sources = [ "symbols_x86_rel.def" ] - } + if (!is_debug && current_cpu == "x64" && is_asan) { + file = "${file}_asan" } - if (current_cpu == "arm64") { - if (is_debug) { - sources = [ "symbols_arm64_dbg.def" ] - } else { - sources = [ "symbols_arm64_rel.def" ] - } + if (use_cxx23) { + file = "${file}_cxx23" } + file = "${file}.def" + sources = [ file ] } } + if (is_win) { + all_dependent_configs = [ "//tools/win/DebugVisualizers:absl" ] + inputs = [ + # absl.natvis listed as an input here instead of in + # //tools/win/DebugVisualizers:absl to prevent unnecessary size increase + # in generated build files. + "//tools/win/DebugVisualizers/absl.natvis", + ] + } } group("absl_component_deps") { @@ -131,6 +130,13 @@ group("absl_component_deps") { visibility = [ ":absl" ] } +# Abseil testing utilities should only be included in test binaries. +component("test_support") { + testonly = true + public_deps = [ "//third_party/abseil-cpp/absl/hash:hash_testing" ] + deps = [ ":absl" ] +} + # Some third-party libraries use additional parts of absl that are banned in # Chrome (e.g. flags generates static initializers that are undesirable in # non-test binaries). These third-party libraries can depend on `absl_full` @@ -248,13 +254,18 @@ if (absl_build_tests) { "absl/algorithm:algorithm_test", "absl/algorithm:container_test", "absl/base:attributes_test", + "absl/base:casts_test", "absl/base:config_test", "absl/base:iterator_traits_test", "absl/base:no_destructor_test", "absl/base:nullability_default_nonnull_test", "absl/base:nullability_test", + "absl/base:nullability_traits_test", "absl/base:poison_test", "absl/base:prefetch_test", + "absl/base:raw_logging_test", + "absl/base:sysinfo_test", + "absl/base:thread_identity_test", "absl/base:tracing_internal_strong_test", "absl/base:tracing_internal_weak_test", "absl/cleanup:cleanup_test", @@ -336,6 +347,7 @@ if (absl_build_tests) { "absl/strings:has_absl_stringify_test", "absl/strings:has_ostream_operator_test", "absl/strings:match_test", + "absl/strings:resize_and_overwrite_test", "absl/strings:str_cat_test", "absl/strings:str_format_arg_test", "absl/strings:str_format_bind_test", diff --git a/naiveproxy/src/third_party/abseil-cpp/CMake/AbseilDll.cmake b/naiveproxy/src/third_party/abseil-cpp/CMake/AbseilDll.cmake index be5aaa9c63..e09afa7c30 100644 --- a/naiveproxy/src/third_party/abseil-cpp/CMake/AbseilDll.cmake +++ b/naiveproxy/src/third_party/abseil-cpp/CMake/AbseilDll.cmake @@ -19,11 +19,11 @@ set(ABSL_INTERNAL_DLL_FILES "base/internal/endian.h" "base/internal/errno_saver.h" "base/internal/hide_ptr.h" - "base/internal/identity.h" "base/internal/iterator_traits.h" "base/internal/low_level_alloc.cc" "base/internal/low_level_alloc.h" "base/internal/low_level_scheduling.h" + "base/internal/nullability_traits.h" "base/internal/per_thread_tls.h" "base/internal/poison.cc" "base/internal/poison.h" @@ -200,6 +200,7 @@ set(ABSL_INTERNAL_DLL_FILES "log/initialize.cc" "log/initialize.h" "log/log.h" + "log/log_entry.cc" "log/log_entry.h" "log/log_sink.cc" "log/log_sink.h" @@ -372,6 +373,7 @@ set(ABSL_INTERNAL_DLL_FILES "strings/internal/str_split_internal.h" "strings/internal/utf8.cc" "strings/internal/utf8.h" + "strings/resize_and_overwrite.h" "synchronization/barrier.cc" "synchronization/barrier.h" "synchronization/blocking_counter.cc" @@ -827,6 +829,9 @@ function(absl_make_dll) ${_dll_libs} ${ABSL_DEFAULT_LINKOPTS} $<$:-llog> + $<$:-ladvapi32> + $<$:-ldbghelp> + $<$:-lbcrypt> ) set_target_properties(${_dll} PROPERTIES LINKER_LANGUAGE "CXX" diff --git a/naiveproxy/src/third_party/abseil-cpp/MODULE.bazel b/naiveproxy/src/third_party/abseil-cpp/MODULE.bazel index 29e624af49..f8aed64d5f 100644 --- a/naiveproxy/src/third_party/abseil-cpp/MODULE.bazel +++ b/naiveproxy/src/third_party/abseil-cpp/MODULE.bazel @@ -25,13 +25,13 @@ cc_configure = use_extension("@rules_cc//cc:extensions.bzl", dev_dependency = True) use_repo(cc_configure, "local_config_cc") -bazel_dep(name = "rules_cc", version = "0.1.1") -bazel_dep(name = "bazel_skylib", version = "1.7.1") -bazel_dep(name = "platforms", version = "0.0.11") +bazel_dep(name = "rules_cc", version = "0.2.9") +bazel_dep(name = "bazel_skylib", version = "1.8.1") +bazel_dep(name = "platforms", version = "1.0.0") bazel_dep( name = "google_benchmark", - version = "1.9.2", + version = "1.9.4", dev_dependency = True, ) diff --git a/naiveproxy/src/third_party/abseil-cpp/README.chromium b/naiveproxy/src/third_party/abseil-cpp/README.chromium index e3aa983b7c..7f20f33a65 100644 --- a/naiveproxy/src/third_party/abseil-cpp/README.chromium +++ b/naiveproxy/src/third_party/abseil-cpp/README.chromium @@ -4,7 +4,7 @@ URL: https://github.com/abseil/abseil-cpp License: Apache-2.0 License File: LICENSE Version: N/A -Revision: 56945519b5d17dcec0982ac6cdf4b6420f03c9c3 +Revision: 215d8a0e75848cec2734f1b70f55862096072f52 Update Mechanism: Manual Security Critical: yes Shipped: yes diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/BUILD.bazel b/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/BUILD.bazel index 0446a0cea3..7d8350c73e 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/BUILD.bazel +++ b/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/BUILD.bazel @@ -69,7 +69,6 @@ cc_library( ":algorithm", "//absl/base:config", "//absl/base:core_headers", - "//absl/base:nullability", "//absl/meta:type_traits", ], ) diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/BUILD.gn b/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/BUILD.gn index bbbb01d055..22f48199bb 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/BUILD.gn +++ b/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/BUILD.gn @@ -15,7 +15,6 @@ absl_source_set("container") { ":algorithm", "//third_party/abseil-cpp/absl/base:config", "//third_party/abseil-cpp/absl/base:core_headers", - "//third_party/abseil-cpp/absl/base:nullability", "//third_party/abseil-cpp/absl/meta:type_traits", ] } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/CMakeLists.txt b/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/CMakeLists.txt index f3dd138a2b..cdd5d14609 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/CMakeLists.txt +++ b/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/CMakeLists.txt @@ -51,7 +51,6 @@ absl_cc_library( absl::config absl::core_headers absl::meta - absl::nullability PUBLIC ) @@ -64,7 +63,6 @@ absl_cc_test( ${ABSL_TEST_COPTS} DEPS absl::algorithm_container - absl::base absl::config absl::core_headers absl::memory diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/container.h b/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/container.h index 6f9c1938fa..c0b8a10ae2 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/container.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/algorithm/container.h @@ -53,7 +53,6 @@ #include "absl/algorithm/algorithm.h" #include "absl/base/config.h" #include "absl/base/macros.h" -#include "absl/base/nullability.h" #include "absl/meta/type_traits.h" namespace absl { @@ -522,7 +521,8 @@ ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 // Container-based version of the `std::copy()` function to copy a // container's elements into an iterator. template -OutputIterator c_copy(const InputSequence& input, OutputIterator output) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_copy(const InputSequence& input, OutputIterator output) { return std::copy(container_algorithm_internal::c_begin(input), container_algorithm_internal::c_end(input), output); } @@ -532,7 +532,8 @@ OutputIterator c_copy(const InputSequence& input, OutputIterator output) { // Container-based version of the `std::copy_n()` function to copy a // container's first N elements into an iterator. template -OutputIterator c_copy_n(const C& input, Size n, OutputIterator output) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_copy_n(const C& input, Size n, OutputIterator output) { return std::copy_n(container_algorithm_internal::c_begin(input), n, output); } @@ -541,8 +542,8 @@ OutputIterator c_copy_n(const C& input, Size n, OutputIterator output) { // Container-based version of the `std::copy_if()` function to copy // a container's elements satisfying some condition into an iterator. template -OutputIterator c_copy_if(const InputSequence& input, OutputIterator output, - Pred&& pred) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_copy_if(const InputSequence& input, OutputIterator output, Pred&& pred) { return std::copy_if(container_algorithm_internal::c_begin(input), container_algorithm_internal::c_end(input), output, std::forward(pred)); @@ -553,8 +554,8 @@ OutputIterator c_copy_if(const InputSequence& input, OutputIterator output, // Container-based version of the `std::copy_backward()` function to // copy a container's elements in reverse order into an iterator. template -BidirectionalIterator c_copy_backward(const C& src, - BidirectionalIterator dest) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 BidirectionalIterator +c_copy_backward(const C& src, BidirectionalIterator dest) { return std::copy_backward(container_algorithm_internal::c_begin(src), container_algorithm_internal::c_end(src), dest); } @@ -564,7 +565,8 @@ BidirectionalIterator c_copy_backward(const C& src, // Container-based version of the `std::move()` function to move // a container's elements into an iterator. template -OutputIterator c_move(C&& src, OutputIterator dest) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator c_move(C&& src, + OutputIterator dest) { return std::move(container_algorithm_internal::c_begin(src), container_algorithm_internal::c_end(src), dest); } @@ -574,7 +576,8 @@ OutputIterator c_move(C&& src, OutputIterator dest) { // Container-based version of the `std::move_backward()` function to // move a container's elements into an iterator in reverse order. template -BidirectionalIterator c_move_backward(C&& src, BidirectionalIterator dest) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 BidirectionalIterator +c_move_backward(C&& src, BidirectionalIterator dest) { return std::move_backward(container_algorithm_internal::c_begin(src), container_algorithm_internal::c_end(src), dest); } @@ -585,7 +588,9 @@ BidirectionalIterator c_move_backward(C&& src, BidirectionalIterator dest) { // swap a container's elements with another container's elements. Swaps the // first N elements of `c1` and `c2`, where N = min(size(c1), size(c2)). template -container_algorithm_internal::ContainerIter c_swap_ranges(C1& c1, C2& c2) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_swap_ranges(C1& c1, C2& c2) { auto first1 = container_algorithm_internal::c_begin(c1); auto last1 = container_algorithm_internal::c_end(c1); auto first2 = container_algorithm_internal::c_begin(c2); @@ -605,8 +610,8 @@ container_algorithm_internal::ContainerIter c_swap_ranges(C1& c1, C2& c2) { // result in an iterator pointing to the last transformed element in the output // range. template -OutputIterator c_transform(const InputSequence& input, OutputIterator output, - UnaryOp&& unary_op) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator c_transform( + const InputSequence& input, OutputIterator output, UnaryOp&& unary_op) { return std::transform(container_algorithm_internal::c_begin(input), container_algorithm_internal::c_end(input), output, std::forward(unary_op)); @@ -617,9 +622,9 @@ OutputIterator c_transform(const InputSequence& input, OutputIterator output, // where N = min(size(c1), size(c2)). template -OutputIterator c_transform(const InputSequence1& input1, - const InputSequence2& input2, OutputIterator output, - BinaryOp&& binary_op) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_transform(const InputSequence1& input1, const InputSequence2& input2, + OutputIterator output, BinaryOp&& binary_op) { auto first1 = container_algorithm_internal::c_begin(input1); auto last1 = container_algorithm_internal::c_end(input1); auto first2 = container_algorithm_internal::c_begin(input2); @@ -638,7 +643,9 @@ OutputIterator c_transform(const InputSequence1& input1, // replace a container's elements of some value with a new value. The container // is modified in place. template -void c_replace(Sequence& sequence, const T& old_value, const T& new_value) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_replace(Sequence& sequence, + const T& old_value, + const T& new_value) { std::replace(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), old_value, new_value); @@ -650,7 +657,8 @@ void c_replace(Sequence& sequence, const T& old_value, const T& new_value) { // replace a container's elements of some value with a new value based on some // condition. The container is modified in place. template -void c_replace_if(C& c, Pred&& pred, T&& new_value) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_replace_if(C& c, Pred&& pred, + T&& new_value) { std::replace_if(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), std::forward(pred), std::forward(new_value)); @@ -662,8 +670,8 @@ void c_replace_if(C& c, Pred&& pred, T&& new_value) { // replace a container's elements of some value with a new value and return the // results within an iterator. template -OutputIterator c_replace_copy(const C& c, OutputIterator result, T&& old_value, - T&& new_value) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator c_replace_copy( + const C& c, OutputIterator result, T&& old_value, T&& new_value) { return std::replace_copy(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), result, std::forward(old_value), @@ -676,8 +684,8 @@ OutputIterator c_replace_copy(const C& c, OutputIterator result, T&& old_value, // to replace a container's elements of some value with a new value based on // some condition, and return the results within an iterator. template -OutputIterator c_replace_copy_if(const C& c, OutputIterator result, Pred&& pred, - const T& new_value) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator c_replace_copy_if( + const C& c, OutputIterator result, Pred&& pred, const T& new_value) { return std::replace_copy_if(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), result, std::forward(pred), new_value); @@ -688,7 +696,7 @@ OutputIterator c_replace_copy_if(const C& c, OutputIterator result, Pred&& pred, // Container-based version of the `std::fill()` function to fill a // container with some value. template -void c_fill(C& c, const T& value) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_fill(C& c, const T& value) { std::fill(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), value); } @@ -698,7 +706,8 @@ void c_fill(C& c, const T& value) { // Container-based version of the `std::fill_n()` function to fill // the first N elements in a container with some value. template -void c_fill_n(C& c, Size n, const T& value) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_fill_n(C& c, Size n, + const T& value) { std::fill_n(container_algorithm_internal::c_begin(c), n, value); } @@ -707,7 +716,7 @@ void c_fill_n(C& c, Size n, const T& value) { // Container-based version of the `std::generate()` function to // assign a container's elements to the values provided by the given generator. template -void c_generate(C& c, Generator&& gen) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_generate(C& c, Generator&& gen) { std::generate(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), std::forward(gen)); @@ -719,8 +728,9 @@ void c_generate(C& c, Generator&& gen) { // assign a container's first N elements to the values provided by the given // generator. template -container_algorithm_internal::ContainerIter c_generate_n(C& c, Size n, - Generator&& gen) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_generate_n(C& c, Size n, Generator&& gen) { return std::generate_n(container_algorithm_internal::c_begin(c), n, std::forward(gen)); } @@ -736,8 +746,8 @@ container_algorithm_internal::ContainerIter c_generate_n(C& c, Size n, // copy a container's elements while removing any elements matching the given // `value`. template -OutputIterator c_remove_copy(const C& c, OutputIterator result, - const T& value) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_remove_copy(const C& c, OutputIterator result, const T& value) { return std::remove_copy(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), result, value); @@ -749,8 +759,8 @@ OutputIterator c_remove_copy(const C& c, OutputIterator result, // to copy a container's elements while removing any elements matching the given // condition. template -OutputIterator c_remove_copy_if(const C& c, OutputIterator result, - Pred&& pred) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_remove_copy_if(const C& c, OutputIterator result, Pred&& pred) { return std::remove_copy_if(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), result, std::forward(pred)); @@ -762,7 +772,8 @@ OutputIterator c_remove_copy_if(const C& c, OutputIterator result, // copy a container's elements while removing any elements containing duplicate // values. template -OutputIterator c_unique_copy(const C& c, OutputIterator result) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_unique_copy(const C& c, OutputIterator result) { return std::unique_copy(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), result); } @@ -770,8 +781,8 @@ OutputIterator c_unique_copy(const C& c, OutputIterator result) { // Overload of c_unique_copy() for using a predicate evaluation other than // `==` for comparing uniqueness of the element values. template -OutputIterator c_unique_copy(const C& c, OutputIterator result, - BinaryPredicate&& pred) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_unique_copy(const C& c, OutputIterator result, BinaryPredicate&& pred) { return std::unique_copy(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), result, std::forward(pred)); @@ -782,7 +793,7 @@ OutputIterator c_unique_copy(const C& c, OutputIterator result, // Container-based version of the `std::reverse()` function to // reverse a container's elements. template -void c_reverse(Sequence& sequence) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_reverse(Sequence& sequence) { std::reverse(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence)); } @@ -792,7 +803,8 @@ void c_reverse(Sequence& sequence) { // Container-based version of the `std::reverse()` function to // reverse a container's elements and write them to an iterator range. template -OutputIterator c_reverse_copy(const C& sequence, OutputIterator result) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_reverse_copy(const C& sequence, OutputIterator result) { return std::reverse_copy(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), result); @@ -805,7 +817,8 @@ OutputIterator c_reverse_copy(const C& sequence, OutputIterator result) { // the first element in the container. template > -Iterator c_rotate(C& sequence, Iterator middle) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 Iterator c_rotate(C& sequence, + Iterator middle) { return absl::rotate(container_algorithm_internal::c_begin(sequence), middle, container_algorithm_internal::c_end(sequence)); } @@ -816,10 +829,10 @@ Iterator c_rotate(C& sequence, Iterator middle) { // shift a container's elements leftward such that the `middle` element becomes // the first element in a new iterator range. template -OutputIterator c_rotate_copy( - const C& sequence, - container_algorithm_internal::ContainerIter middle, - OutputIterator result) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_rotate_copy(const C& sequence, + container_algorithm_internal::ContainerIter middle, + OutputIterator result) { return std::rotate_copy(container_algorithm_internal::c_begin(sequence), middle, container_algorithm_internal::c_end(sequence), result); @@ -861,7 +874,8 @@ OutputIterator c_sample(const C& c, OutputIterator result, Distance n, // to test whether all elements in the container for which `pred` returns `true` // precede those for which `pred` is `false`. template -bool c_is_partitioned(const C& c, Pred&& pred) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_is_partitioned(const C& c, + Pred&& pred) { return std::is_partitioned(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), std::forward(pred)); @@ -874,7 +888,9 @@ bool c_is_partitioned(const C& c, Pred&& pred) { // which `pred` returns `true` precede all those for which it returns `false`, // returning an iterator to the first element of the second group. template -container_algorithm_internal::ContainerIter c_partition(C& c, Pred&& pred) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_partition(C& c, Pred&& pred) { return std::partition(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), std::forward(pred)); @@ -903,9 +919,9 @@ container_algorithm_internal::ContainerIter c_stable_partition(C& c, template -std::pair c_partition_copy( - const C& c, OutputIterator1 out_true, OutputIterator2 out_false, - Pred&& pred) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 std::pair +c_partition_copy(const C& c, OutputIterator1 out_true, + OutputIterator2 out_false, Pred&& pred) { return std::partition_copy(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), out_true, out_false, std::forward(pred)); @@ -917,8 +933,9 @@ std::pair c_partition_copy( // to return the first element of an already partitioned container for which // the given `pred` is not `true`. template -container_algorithm_internal::ContainerIter c_partition_point(C& c, - Pred&& pred) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_partition_point(C& c, Pred&& pred) { return std::partition_point(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), std::forward(pred)); @@ -933,7 +950,7 @@ container_algorithm_internal::ContainerIter c_partition_point(C& c, // Container-based version of the `std::sort()` function // to sort elements in ascending order of their values. template -void c_sort(C& c) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_sort(C& c) { std::sort(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c)); } @@ -941,7 +958,7 @@ void c_sort(C& c) { // Overload of c_sort() for performing a `comp` comparison other than the // default `operator<`. template -void c_sort(C& c, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_sort(C& c, LessThan&& comp) { std::sort(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), std::forward(comp)); @@ -972,7 +989,7 @@ void c_stable_sort(C& c, LessThan&& comp) { // Container-based version of the `std::is_sorted()` function // to evaluate whether the given container is sorted in ascending order. template -bool c_is_sorted(const C& c) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_is_sorted(const C& c) { return std::is_sorted(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c)); } @@ -980,7 +997,8 @@ bool c_is_sorted(const C& c) { // c_is_sorted() overload for performing a `comp` comparison other than the // default `operator<`. template -bool c_is_sorted(const C& c, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_is_sorted(const C& c, + LessThan&& comp) { return std::is_sorted(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), std::forward(comp)); @@ -992,7 +1010,7 @@ bool c_is_sorted(const C& c, LessThan&& comp) { // to rearrange elements within a container such that elements before `middle` // are sorted in ascending order. template -void c_partial_sort( +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_partial_sort( RandomAccessContainer& sequence, container_algorithm_internal::ContainerIter middle) { std::partial_sort(container_algorithm_internal::c_begin(sequence), middle, @@ -1002,7 +1020,7 @@ void c_partial_sort( // Overload of c_partial_sort() for performing a `comp` comparison other than // the default `operator<`. template -void c_partial_sort( +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_partial_sort( RandomAccessContainer& sequence, container_algorithm_internal::ContainerIter middle, LessThan&& comp) { @@ -1019,8 +1037,9 @@ void c_partial_sort( // At most min(result.last - result.first, sequence.last - sequence.first) // elements from the sequence will be stored in the result. template -container_algorithm_internal::ContainerIter -c_partial_sort_copy(const C& sequence, RandomAccessContainer& result) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_partial_sort_copy(const C& sequence, RandomAccessContainer& result) { return std::partial_sort_copy(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), container_algorithm_internal::c_begin(result), @@ -1030,9 +1049,10 @@ c_partial_sort_copy(const C& sequence, RandomAccessContainer& result) { // Overload of c_partial_sort_copy() for performing a `comp` comparison other // than the default `operator<`. template -container_algorithm_internal::ContainerIter -c_partial_sort_copy(const C& sequence, RandomAccessContainer& result, - LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_partial_sort_copy(const C& sequence, RandomAccessContainer& result, + LessThan&& comp) { return std::partial_sort_copy(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), container_algorithm_internal::c_begin(result), @@ -1046,7 +1066,9 @@ c_partial_sort_copy(const C& sequence, RandomAccessContainer& result, // to return the first element within a container that is not sorted in // ascending order as an iterator. template -container_algorithm_internal::ContainerIter c_is_sorted_until(C& c) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_is_sorted_until(C& c) { return std::is_sorted_until(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c)); } @@ -1054,8 +1076,9 @@ container_algorithm_internal::ContainerIter c_is_sorted_until(C& c) { // Overload of c_is_sorted_until() for performing a `comp` comparison other than // the default `operator<`. template -container_algorithm_internal::ContainerIter c_is_sorted_until( - C& c, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_is_sorted_until(C& c, LessThan&& comp) { return std::is_sorted_until(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), std::forward(comp)); @@ -1069,7 +1092,7 @@ container_algorithm_internal::ContainerIter c_is_sorted_until( // any order, except that all preceding `nth` will be less than that element, // and all following `nth` will be greater than that element. template -void c_nth_element( +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_nth_element( RandomAccessContainer& sequence, container_algorithm_internal::ContainerIter nth) { std::nth_element(container_algorithm_internal::c_begin(sequence), nth, @@ -1079,7 +1102,7 @@ void c_nth_element( // Overload of c_nth_element() for performing a `comp` comparison other than // the default `operator<`. template -void c_nth_element( +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_nth_element( RandomAccessContainer& sequence, container_algorithm_internal::ContainerIter nth, LessThan&& comp) { @@ -1098,8 +1121,9 @@ void c_nth_element( // to return an iterator pointing to the first element in a sorted container // which does not compare less than `value`. template -container_algorithm_internal::ContainerIter c_lower_bound( - Sequence& sequence, const T& value) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_lower_bound(Sequence& sequence, const T& value) { return std::lower_bound(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), value); } @@ -1107,8 +1131,9 @@ container_algorithm_internal::ContainerIter c_lower_bound( // Overload of c_lower_bound() for performing a `comp` comparison other than // the default `operator<`. template -container_algorithm_internal::ContainerIter c_lower_bound( - Sequence& sequence, const T& value, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_lower_bound(Sequence& sequence, const T& value, LessThan&& comp) { return std::lower_bound(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), value, std::forward(comp)); @@ -1120,8 +1145,9 @@ container_algorithm_internal::ContainerIter c_lower_bound( // to return an iterator pointing to the first element in a sorted container // which is greater than `value`. template -container_algorithm_internal::ContainerIter c_upper_bound( - Sequence& sequence, const T& value) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_upper_bound(Sequence& sequence, const T& value) { return std::upper_bound(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), value); } @@ -1129,8 +1155,9 @@ container_algorithm_internal::ContainerIter c_upper_bound( // Overload of c_upper_bound() for performing a `comp` comparison other than // the default `operator<`. template -container_algorithm_internal::ContainerIter c_upper_bound( - Sequence& sequence, const T& value, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_upper_bound(Sequence& sequence, const T& value, LessThan&& comp) { return std::upper_bound(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), value, std::forward(comp)); @@ -1142,8 +1169,9 @@ container_algorithm_internal::ContainerIter c_upper_bound( // to return an iterator pair pointing to the first and last elements in a // sorted container which compare equal to `value`. template -container_algorithm_internal::ContainerIterPairType -c_equal_range(Sequence& sequence, const T& value) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIterPairType + c_equal_range(Sequence& sequence, const T& value) { return std::equal_range(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), value); } @@ -1151,8 +1179,9 @@ c_equal_range(Sequence& sequence, const T& value) { // Overload of c_equal_range() for performing a `comp` comparison other than // the default `operator<`. template -container_algorithm_internal::ContainerIterPairType -c_equal_range(Sequence& sequence, const T& value, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIterPairType + c_equal_range(Sequence& sequence, const T& value, LessThan&& comp) { return std::equal_range(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), value, std::forward(comp)); @@ -1164,7 +1193,8 @@ c_equal_range(Sequence& sequence, const T& value, LessThan&& comp) { // to test if any element in the sorted container contains a value equivalent to // 'value'. template -bool c_binary_search(const Sequence& sequence, const T& value) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_binary_search( + const Sequence& sequence, const T& value) { return std::binary_search(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), value); @@ -1173,8 +1203,8 @@ bool c_binary_search(const Sequence& sequence, const T& value) { // Overload of c_binary_search() for performing a `comp` comparison other than // the default `operator<`. template -bool c_binary_search(const Sequence& sequence, const T& value, - LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_binary_search( + const Sequence& sequence, const T& value, LessThan&& comp) { return std::binary_search(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), value, std::forward(comp)); @@ -1189,7 +1219,8 @@ bool c_binary_search(const Sequence& sequence, const T& value, // Container-based version of the `std::merge()` function // to merge two sorted containers into a single sorted iterator. template -OutputIterator c_merge(const C1& c1, const C2& c2, OutputIterator result) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_merge(const C1& c1, const C2& c2, OutputIterator result) { return std::merge(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), @@ -1199,8 +1230,8 @@ OutputIterator c_merge(const C1& c1, const C2& c2, OutputIterator result) { // Overload of c_merge() for performing a `comp` comparison other than // the default `operator<`. template -OutputIterator c_merge(const C1& c1, const C2& c2, OutputIterator result, - LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_merge(const C1& c1, const C2& c2, OutputIterator result, LessThan&& comp) { return std::merge(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), @@ -1236,7 +1267,8 @@ void c_inplace_merge(C& c, // to test whether a sorted container `c1` entirely contains another sorted // container `c2`. template -bool c_includes(const C1& c1, const C2& c2) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_includes(const C1& c1, + const C2& c2) { return std::includes(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), @@ -1246,7 +1278,8 @@ bool c_includes(const C1& c1, const C2& c2) { // Overload of c_includes() for performing a merge using a `comp` other than // `operator<`. template -bool c_includes(const C1& c1, const C2& c2, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_includes(const C1& c1, const C2& c2, + LessThan&& comp) { return std::includes(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), @@ -1266,7 +1299,8 @@ template ::value, void>::type> -OutputIterator c_set_union(const C1& c1, const C2& c2, OutputIterator output) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_set_union(const C1& c1, const C2& c2, OutputIterator output) { return std::set_union(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), @@ -1282,8 +1316,8 @@ template ::value, void>::type> -OutputIterator c_set_union(const C1& c1, const C2& c2, OutputIterator output, - LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator c_set_union( + const C1& c1, const C2& c2, OutputIterator output, LessThan&& comp) { return std::set_union(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), @@ -1302,13 +1336,13 @@ template ::value, void>::type> -OutputIterator c_set_intersection(const C1& c1, const C2& c2, - OutputIterator output) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_set_intersection(const C1& c1, const C2& c2, OutputIterator output) { // In debug builds, ensure that both containers are sorted with respect to the // default comparator. std::set_intersection requires the containers be sorted // using operator<. - assert(absl::c_is_sorted(c1)); - assert(absl::c_is_sorted(c2)); + ABSL_ASSERT(absl::c_is_sorted(c1)); + ABSL_ASSERT(absl::c_is_sorted(c2)); return std::set_intersection(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), @@ -1324,13 +1358,13 @@ template ::value, void>::type> -OutputIterator c_set_intersection(const C1& c1, const C2& c2, - OutputIterator output, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator c_set_intersection( + const C1& c1, const C2& c2, OutputIterator output, LessThan&& comp) { // In debug builds, ensure that both containers are sorted with respect to the // default comparator. std::set_intersection requires the containers be sorted // using the same comparator. - assert(absl::c_is_sorted(c1, comp)); - assert(absl::c_is_sorted(c2, comp)); + ABSL_ASSERT(absl::c_is_sorted(c1, comp)); + ABSL_ASSERT(absl::c_is_sorted(c2, comp)); return std::set_intersection(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), @@ -1350,8 +1384,8 @@ template ::value, void>::type> -OutputIterator c_set_difference(const C1& c1, const C2& c2, - OutputIterator output) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_set_difference(const C1& c1, const C2& c2, OutputIterator output) { return std::set_difference(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), @@ -1367,8 +1401,8 @@ template ::value, void>::type> -OutputIterator c_set_difference(const C1& c1, const C2& c2, - OutputIterator output, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator c_set_difference( + const C1& c1, const C2& c2, OutputIterator output, LessThan&& comp) { return std::set_difference(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), @@ -1388,8 +1422,8 @@ template ::value, void>::type> -OutputIterator c_set_symmetric_difference(const C1& c1, const C2& c2, - OutputIterator output) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator +c_set_symmetric_difference(const C1& c1, const C2& c2, OutputIterator output) { return std::set_symmetric_difference( container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), @@ -1406,9 +1440,8 @@ template ::value, void>::type> -OutputIterator c_set_symmetric_difference(const C1& c1, const C2& c2, - OutputIterator output, - LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIterator c_set_symmetric_difference( + const C1& c1, const C2& c2, OutputIterator output, LessThan&& comp) { return std::set_symmetric_difference( container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), @@ -1426,7 +1459,8 @@ OutputIterator c_set_symmetric_difference(const C1& c1, const C2& c2, // Container-based version of the `std::push_heap()` function // to push a value onto a container heap. template -void c_push_heap(RandomAccessContainer& sequence) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_push_heap( + RandomAccessContainer& sequence) { std::push_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence)); } @@ -1434,7 +1468,8 @@ void c_push_heap(RandomAccessContainer& sequence) { // Overload of c_push_heap() for performing a push operation on a heap using a // `comp` other than `operator<`. template -void c_push_heap(RandomAccessContainer& sequence, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_push_heap( + RandomAccessContainer& sequence, LessThan&& comp) { std::push_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), std::forward(comp)); @@ -1445,7 +1480,8 @@ void c_push_heap(RandomAccessContainer& sequence, LessThan&& comp) { // Container-based version of the `std::pop_heap()` function // to pop a value from a heap container. template -void c_pop_heap(RandomAccessContainer& sequence) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_pop_heap( + RandomAccessContainer& sequence) { std::pop_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence)); } @@ -1453,7 +1489,8 @@ void c_pop_heap(RandomAccessContainer& sequence) { // Overload of c_pop_heap() for performing a pop operation on a heap using a // `comp` other than `operator<`. template -void c_pop_heap(RandomAccessContainer& sequence, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_pop_heap( + RandomAccessContainer& sequence, LessThan&& comp) { std::pop_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), std::forward(comp)); @@ -1464,7 +1501,8 @@ void c_pop_heap(RandomAccessContainer& sequence, LessThan&& comp) { // Container-based version of the `std::make_heap()` function // to make a container a heap. template -void c_make_heap(RandomAccessContainer& sequence) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_make_heap( + RandomAccessContainer& sequence) { std::make_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence)); } @@ -1472,7 +1510,8 @@ void c_make_heap(RandomAccessContainer& sequence) { // Overload of c_make_heap() for performing heap comparisons using a // `comp` other than `operator<` template -void c_make_heap(RandomAccessContainer& sequence, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_make_heap( + RandomAccessContainer& sequence, LessThan&& comp) { std::make_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), std::forward(comp)); @@ -1483,7 +1522,8 @@ void c_make_heap(RandomAccessContainer& sequence, LessThan&& comp) { // Container-based version of the `std::sort_heap()` function // to sort a heap into ascending order (after which it is no longer a heap). template -void c_sort_heap(RandomAccessContainer& sequence) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_sort_heap( + RandomAccessContainer& sequence) { std::sort_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence)); } @@ -1491,7 +1531,8 @@ void c_sort_heap(RandomAccessContainer& sequence) { // Overload of c_sort_heap() for performing heap comparisons using a // `comp` other than `operator<` template -void c_sort_heap(RandomAccessContainer& sequence, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_sort_heap( + RandomAccessContainer& sequence, LessThan&& comp) { std::sort_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), std::forward(comp)); @@ -1502,7 +1543,8 @@ void c_sort_heap(RandomAccessContainer& sequence, LessThan&& comp) { // Container-based version of the `std::is_heap()` function // to check whether the given container is a heap. template -bool c_is_heap(const RandomAccessContainer& sequence) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_is_heap( + const RandomAccessContainer& sequence) { return std::is_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence)); } @@ -1510,7 +1552,8 @@ bool c_is_heap(const RandomAccessContainer& sequence) { // Overload of c_is_heap() for performing heap comparisons using a // `comp` other than `operator<` template -bool c_is_heap(const RandomAccessContainer& sequence, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_is_heap( + const RandomAccessContainer& sequence, LessThan&& comp) { return std::is_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), std::forward(comp)); @@ -1521,8 +1564,9 @@ bool c_is_heap(const RandomAccessContainer& sequence, LessThan&& comp) { // Container-based version of the `std::is_heap_until()` function // to find the first element in a given container which is not in heap order. template -container_algorithm_internal::ContainerIter -c_is_heap_until(RandomAccessContainer& sequence) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_is_heap_until(RandomAccessContainer& sequence) { return std::is_heap_until(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence)); } @@ -1530,8 +1574,9 @@ c_is_heap_until(RandomAccessContainer& sequence) { // Overload of c_is_heap_until() for performing heap comparisons using a // `comp` other than `operator<` template -container_algorithm_internal::ContainerIter -c_is_heap_until(RandomAccessContainer& sequence, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_is_heap_until(RandomAccessContainer& sequence, LessThan&& comp) { return std::is_heap_until(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), std::forward(comp)); @@ -1626,8 +1671,8 @@ ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17 // that capital letters ("A-Z") have ASCII values less than lowercase letters // ("a-z"). template -bool c_lexicographical_compare(const Sequence1& sequence1, - const Sequence2& sequence2) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_lexicographical_compare( + const Sequence1& sequence1, const Sequence2& sequence2) { return std::lexicographical_compare( container_algorithm_internal::c_begin(sequence1), container_algorithm_internal::c_end(sequence1), @@ -1638,8 +1683,8 @@ bool c_lexicographical_compare(const Sequence1& sequence1, // Overload of c_lexicographical_compare() for performing a lexicographical // comparison using a `comp` operator instead of `operator<`. template -bool c_lexicographical_compare(const Sequence1& sequence1, - const Sequence2& sequence2, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_lexicographical_compare( + const Sequence1& sequence1, const Sequence2& sequence2, LessThan&& comp) { return std::lexicographical_compare( container_algorithm_internal::c_begin(sequence1), container_algorithm_internal::c_end(sequence1), @@ -1654,7 +1699,7 @@ bool c_lexicographical_compare(const Sequence1& sequence1, // to rearrange a container's elements into the next lexicographically greater // permutation. template -bool c_next_permutation(C& c) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_next_permutation(C& c) { return std::next_permutation(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c)); } @@ -1662,7 +1707,8 @@ bool c_next_permutation(C& c) { // Overload of c_next_permutation() for performing a lexicographical // comparison using a `comp` operator instead of `operator<`. template -bool c_next_permutation(C& c, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_next_permutation(C& c, + LessThan&& comp) { return std::next_permutation(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), std::forward(comp)); @@ -1674,7 +1720,7 @@ bool c_next_permutation(C& c, LessThan&& comp) { // to rearrange a container's elements into the next lexicographically lesser // permutation. template -bool c_prev_permutation(C& c) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_prev_permutation(C& c) { return std::prev_permutation(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c)); } @@ -1682,7 +1728,8 @@ bool c_prev_permutation(C& c) { // Overload of c_prev_permutation() for performing a lexicographical // comparison using a `comp` operator instead of `operator<`. template -bool c_prev_permutation(C& c, LessThan&& comp) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_prev_permutation(C& c, + LessThan&& comp) { return std::prev_permutation(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), std::forward(comp)); @@ -1698,7 +1745,8 @@ bool c_prev_permutation(C& c, LessThan&& comp) { // to compute successive values of `value`, as if incremented with `++value` // after each element is written, and write them to the container. template -void c_iota(Sequence& sequence, const T& value) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 void c_iota(Sequence& sequence, + const T& value) { std::iota(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), value); } @@ -1713,7 +1761,8 @@ void c_iota(Sequence& sequence, const T& value) { // absl::decay_t. As a user of this function you can casually read // this as "returns T by value" and assume it does the right thing. template -decay_t c_accumulate(const Sequence& sequence, T&& init) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 decay_t c_accumulate( + const Sequence& sequence, T&& init) { return std::accumulate(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), std::forward(init)); @@ -1722,8 +1771,8 @@ decay_t c_accumulate(const Sequence& sequence, T&& init) { // Overload of c_accumulate() for using a binary operations other than // addition for computing the accumulation. template -decay_t c_accumulate(const Sequence& sequence, T&& init, - BinaryOp&& binary_op) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 decay_t c_accumulate( + const Sequence& sequence, T&& init, BinaryOp&& binary_op) { return std::accumulate(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), std::forward(init), @@ -1739,8 +1788,8 @@ decay_t c_accumulate(const Sequence& sequence, T&& init, // absl::decay_t. As a user of this function you can casually read // this as "returns T by value" and assume it does the right thing. template -decay_t c_inner_product(const Sequence1& factors1, const Sequence2& factors2, - T&& sum) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 decay_t c_inner_product( + const Sequence1& factors1, const Sequence2& factors2, T&& sum) { return std::inner_product(container_algorithm_internal::c_begin(factors1), container_algorithm_internal::c_end(factors1), container_algorithm_internal::c_begin(factors2), @@ -1752,8 +1801,9 @@ decay_t c_inner_product(const Sequence1& factors1, const Sequence2& factors2, // the product between the two container's element pair). template -decay_t c_inner_product(const Sequence1& factors1, const Sequence2& factors2, - T&& sum, BinaryOp1&& op1, BinaryOp2&& op2) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 decay_t c_inner_product( + const Sequence1& factors1, const Sequence2& factors2, T&& sum, + BinaryOp1&& op1, BinaryOp2&& op2) { return std::inner_product(container_algorithm_internal::c_begin(factors1), container_algorithm_internal::c_end(factors1), container_algorithm_internal::c_begin(factors2), @@ -1767,8 +1817,8 @@ decay_t c_inner_product(const Sequence1& factors1, const Sequence2& factors2, // function to compute the difference between each element and the one preceding // it and write it to an iterator. template -OutputIt c_adjacent_difference(const InputSequence& input, - OutputIt output_first) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIt +c_adjacent_difference(const InputSequence& input, OutputIt output_first) { return std::adjacent_difference(container_algorithm_internal::c_begin(input), container_algorithm_internal::c_end(input), output_first); @@ -1777,8 +1827,8 @@ OutputIt c_adjacent_difference(const InputSequence& input, // Overload of c_adjacent_difference() for using a binary operation other than // subtraction to compute the adjacent difference. template -OutputIt c_adjacent_difference(const InputSequence& input, - OutputIt output_first, BinaryOp&& op) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIt c_adjacent_difference( + const InputSequence& input, OutputIt output_first, BinaryOp&& op) { return std::adjacent_difference(container_algorithm_internal::c_begin(input), container_algorithm_internal::c_end(input), output_first, std::forward(op)); @@ -1791,7 +1841,8 @@ OutputIt c_adjacent_difference(const InputSequence& input, // to an iterator. The partial sum is the sum of all element values so far in // the sequence. template -OutputIt c_partial_sum(const InputSequence& input, OutputIt output_first) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIt +c_partial_sum(const InputSequence& input, OutputIt output_first) { return std::partial_sum(container_algorithm_internal::c_begin(input), container_algorithm_internal::c_end(input), output_first); @@ -1800,8 +1851,8 @@ OutputIt c_partial_sum(const InputSequence& input, OutputIt output_first) { // Overload of c_partial_sum() for using a binary operation other than addition // to compute the "partial sum". template -OutputIt c_partial_sum(const InputSequence& input, OutputIt output_first, - BinaryOp&& op) { +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 OutputIt c_partial_sum( + const InputSequence& input, OutputIt output_first, BinaryOp&& op) { return std::partial_sum(container_algorithm_internal::c_begin(input), container_algorithm_internal::c_end(input), output_first, std::forward(op)); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/BUILD.bazel b/naiveproxy/src/third_party/abseil-cpp/absl/base/BUILD.bazel index 9f4a8a48b1..bc695a31c5 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/BUILD.bazel +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/BUILD.bazel @@ -88,9 +88,20 @@ cc_library( hdrs = ["nullability.h"], copts = ABSL_DEFAULT_COPTS, linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [":config"], +) + +cc_library( + name = "nullability_traits_internal", + hdrs = ["internal/nullability_traits.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], deps = [ ":config", - ":core_headers", + ":nullability", ], ) @@ -227,7 +238,6 @@ cc_library( name = "base_internal", hdrs = [ "internal/hide_ptr.h", - "internal/identity.h", "internal/scheduling_mode.h", ], copts = ABSL_DEFAULT_COPTS, @@ -589,6 +599,22 @@ cc_test( ], ) +cc_test( + name = "casts_test", + size = "small", + srcs = [ + "casts_test.cc", + ], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":base", + ":core_headers", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + cc_test( name = "no_destructor_test", srcs = ["no_destructor_test.cc"], @@ -622,7 +648,6 @@ cc_test( name = "nullability_test", srcs = ["nullability_test.cc"], deps = [ - ":core_headers", ":nullability", "@googletest//:gtest", "@googletest//:gtest_main", @@ -639,6 +664,18 @@ cc_test( ], ) +cc_test( + name = "nullability_traits_test", + srcs = ["internal/nullability_traits_test.cc"], + deps = [ + ":config", + ":nullability", + ":nullability_traits_internal", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + cc_test( name = "raw_logging_test", srcs = ["raw_logging_test.cc"], diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/BUILD.gn b/naiveproxy/src/third_party/abseil-cpp/absl/base/BUILD.gn index 98e7594136..022a7bae57 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/BUILD.gn +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/BUILD.gn @@ -40,10 +40,18 @@ absl_source_set("nullability") { public = [ "nullability.h" ] deps = [ ":config", - ":core_headers", ] } +absl_source_set("nullability_traits_internal") { + public = [ "internal/nullability_traits.h" ] + deps = [ + ":config", + ":nullability", + ] + visibility = [ "//third_party/abseil-cpp/absl/*" ] +} + absl_source_set("raw_logging_internal") { sources = [ "internal/raw_logging.cc" ] public = [ "internal/raw_logging.h" ] @@ -143,7 +151,6 @@ absl_source_set("malloc_internal") { absl_source_set("base_internal") { public = [ "internal/hide_ptr.h", - "internal/identity.h", "internal/scheduling_mode.h", ] deps = [ @@ -371,6 +378,14 @@ absl_test("config_test") { ] } +absl_test("casts_test") { + sources = [ "casts_test.cc" ] + deps = [ + ":base", + ":core_headers", + ] +} + absl_test("no_destructor_test") { sources = [ "no_destructor_test.cc" ] deps = [ @@ -383,7 +398,6 @@ absl_test("no_destructor_test") { absl_test("nullability_test") { sources = [ "nullability_test.cc" ] deps = [ - ":core_headers", ":nullability", ] } @@ -392,3 +406,40 @@ absl_test("nullability_default_nonnull_test") { sources = [ "nullability_default_nonnull_test.cc" ] deps = [ ":nullability" ] } + +absl_test("nullability_traits_test") { + sources = [ "internal/nullability_traits_test.cc" ] + deps = [ + ":config", + ":nullability", + ":nullability_traits_internal", + ] +} + +absl_test("raw_logging_test") { + sources = [ "raw_logging_test.cc" ] + deps = [ + ":raw_logging_internal", + "//third_party/abseil-cpp/absl/strings", + ] +} + +absl_test("sysinfo_test") { + sources = [ "internal/sysinfo_test.cc" ] + deps = [ + ":base", + "//third_party/abseil-cpp/absl/synchronization", + ] +} + +# low_level_alloc_test is not included because it has own main function. +# absl_test("low_level_alloc_test") + +absl_test("thread_identity_test") { + sources = [ "internal/thread_identity_test.cc" ] + deps = [ + ":base", + ":core_headers", + "//third_party/abseil-cpp/absl/synchronization", + ] +} diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/CMakeLists.txt b/naiveproxy/src/third_party/abseil-cpp/absl/base/CMakeLists.txt index 2caf0d20fc..9e8f3e5ca6 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/CMakeLists.txt +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/CMakeLists.txt @@ -74,7 +74,6 @@ absl_cc_library( "nullability.h" DEPS absl::config - absl::core_headers COPTS ${ABSL_DEFAULT_COPTS} ) @@ -87,7 +86,6 @@ absl_cc_test( COPTS ${ABSL_TEST_COPTS} DEPS - absl::core_headers absl::nullability GTest::gtest_main ) @@ -104,6 +102,34 @@ absl_cc_test( GTest::gtest_main ) +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + nullability_traits_internal + HDRS + "internal/nullability_traits.h" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::config + absl::nullability + PUBLIC +) + +absl_cc_test( + NAME + nullability_traits_test + SRCS + "internal/nullability_traits_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::config + absl::nullability + absl::nullability_traits_internal + GTest::gtest_main +) + # Internal-only target, do not depend on directly. absl_cc_library( NAME @@ -210,7 +236,6 @@ absl_cc_library( base_internal HDRS "internal/hide_ptr.h" - "internal/identity.h" "internal/scheduling_mode.h" COPTS ${ABSL_DEFAULT_COPTS} @@ -390,6 +415,19 @@ absl_cc_test( GTest::gtest_main ) +absl_cc_test( + NAME + casts_test + SRCS + "casts_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base + absl::core_headers + GTest::gtest_main +) + absl_cc_test( NAME errno_saver_test diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/attributes.h b/naiveproxy/src/third_party/abseil-cpp/absl/base/attributes.h index d009f6d491..33b2c28495 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/attributes.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/attributes.h @@ -553,7 +553,7 @@ // // Prevents the compiler from complaining about variables that appear unused. // -// Deprecated: Use the standard C++17 `[[maybe_unused]` instead. +// Deprecated: Use the standard C++17 `[[maybe_unused]]` instead. // // Due to differences in positioning requirements between the old, compiler // specific __attribute__ syntax and the now standard `[[maybe_unused]]`, this diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/casts.h b/naiveproxy/src/third_party/abseil-cpp/absl/base/casts.h index e0b11bbe49..35f5f93840 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/casts.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/casts.h @@ -33,7 +33,7 @@ #include // For std::bit_cast. #endif // defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L -#include "absl/base/internal/identity.h" +#include "absl/base/attributes.h" #include "absl/base/macros.h" #include "absl/meta/type_traits.h" @@ -90,9 +90,26 @@ ABSL_NAMESPACE_BEGIN // // Such implicit cast chaining may be useful within template logic. template -constexpr To implicit_cast(typename absl::internal::type_identity_t to) { +constexpr std::enable_if_t< + !type_traits_internal::IsView, std::remove_cv_t>>::value, + To> +implicit_cast(absl::type_identity_t to) { return to; } +template +constexpr std::enable_if_t< + type_traits_internal::IsView, + std::remove_cv_t>>::value, + To> +implicit_cast(absl::type_identity_t to ABSL_ATTRIBUTE_LIFETIME_BOUND) { + return to; +} +template +constexpr std::enable_if_t, To> implicit_cast( + absl::type_identity_t to ABSL_ATTRIBUTE_LIFETIME_BOUND) { + return std::forward>(to); +} // bit_cast() // diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/config.h b/naiveproxy/src/third_party/abseil-cpp/absl/base/config.h index f3cafbdfa5..a38c5826b8 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/config.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/config.h @@ -237,6 +237,8 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' || #error ABSL_HAVE_TLS cannot be directly set #elif (defined(__linux__)) && (defined(__clang__) || defined(_GLIBCXX_HAVE_TLS)) #define ABSL_HAVE_TLS 1 +#elif defined(__INTEL_LLVM_COMPILER) +#define ABSL_HAVE_TLS 1 #endif // ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE @@ -358,10 +360,10 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' || // Darwin (macOS and iOS) __APPLE__ // Akaros (http://akaros.org) __ros__ // Windows _WIN32 -// NaCL __native_client__ // AsmJS __asmjs__ // WebAssembly (Emscripten) __EMSCRIPTEN__ // Fuchsia __Fuchsia__ +// WebAssembly (WASI) _WASI_EMULATED_MMAN (implies __wasi__) // // Note that since Android defines both __ANDROID__ and __linux__, one // may probe for either Linux or Android by simply testing for __linux__. @@ -372,12 +374,13 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' || // POSIX.1-2001. #ifdef ABSL_HAVE_MMAP #error ABSL_HAVE_MMAP cannot be directly set -#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ - defined(_AIX) || defined(__ros__) || defined(__native_client__) || \ - defined(__asmjs__) || defined(__EMSCRIPTEN__) || defined(__Fuchsia__) || \ - defined(__sun) || defined(__myriad2__) || defined(__HAIKU__) || \ - defined(__OpenBSD__) || defined(__NetBSD__) || defined(__QNX__) || \ - defined(__VXWORKS__) || defined(__hexagon__) || defined(__XTENSA__) +#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ + defined(_AIX) || defined(__ros__) || defined(__asmjs__) || \ + defined(__EMSCRIPTEN__) || defined(__Fuchsia__) || defined(__sun) || \ + defined(__myriad2__) || defined(__HAIKU__) || defined(__OpenBSD__) || \ + defined(__NetBSD__) || defined(__QNX__) || defined(__VXWORKS__) || \ + defined(__hexagon__) || defined(__XTENSA__) || \ + defined(_WASI_EMULATED_MMAN) #define ABSL_HAVE_MMAP 1 #endif @@ -453,8 +456,6 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' || // WASI doesn't support signals #elif defined(__Fuchsia__) // Signals don't exist on fuchsia. -#elif defined(__native_client__) -// Signals don't exist on hexagon/QuRT #elif defined(__hexagon__) #else // other standard libraries diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/identity.h b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/identity.h deleted file mode 100644 index 365207b7e7..0000000000 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/identity.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2017 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.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. -// - -#ifndef ABSL_BASE_INTERNAL_IDENTITY_H_ -#define ABSL_BASE_INTERNAL_IDENTITY_H_ - -#include "absl/base/config.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace internal { - -// This is a back-fill of C++20's `std::type_identity`. -template -struct type_identity { - typedef T type; -}; - -// This is a back-fill of C++20's `std::type_identity_t`. -template -using type_identity_t = typename type_identity::type; - -} // namespace internal -ABSL_NAMESPACE_END -} // namespace absl - -#endif // ABSL_BASE_INTERNAL_IDENTITY_H_ diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/nullability_traits.h b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/nullability_traits.h new file mode 100644 index 0000000000..790ec90964 --- /dev/null +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/nullability_traits.h @@ -0,0 +1,71 @@ +// Copyright 2025 The Abseil Authors +// +// Licensed under the Apache License, Version 2.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. + +#ifndef ABSL_BASE_INTERNAL_NULLABILITY_TRAITS_H_ +#define ABSL_BASE_INTERNAL_NULLABILITY_TRAITS_H_ + +#include + +#include "absl/base/config.h" +#include "absl/base/nullability.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace base_internal { + +// `value` is true if the type `T` is compatible with nullability annotations +// (is a raw pointer, a smart pointer, or marked with +// ABSL_NULLABILITY_COMPATIBLE). Prefer to use the higher-level +// `AddNonnullIfCompatible` if that is sufficient. +// +// NOTE: This should not be used to detect if the compiler is Clang (since +// Clang is the only compiler that supports nullability annotations). +#if defined(__clang__) && !defined(__OBJC__) && \ + ABSL_HAVE_FEATURE(nullability_on_classes) +template +struct IsNullabilityCompatibleType { + constexpr static bool value = false; +}; + +template +struct IsNullabilityCompatibleType> { + constexpr static bool value = true; +}; +#else +// False when absl_nullable is a no-op (for non-Clang compilers or Objective-C.) +template +struct IsNullabilityCompatibleType { + constexpr static bool value = false; +}; +#endif + +// A trait to add `absl_nonnull` to a type if it is compatible with nullability +// annotations. +template ::value> +struct AddNonnullIfCompatible; + +template +struct AddNonnullIfCompatible { + using type = T; +}; +template +struct AddNonnullIfCompatible { + using type = absl_nonnull T; +}; + +} // namespace base_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_BASE_INTERNAL_NULLABILITY_TRAITS_H_ diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/poison.cc b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/poison.cc index b33d4c2d3d..c639c96662 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/poison.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/poison.cc @@ -57,19 +57,20 @@ size_t GetPageSize() { void* InitializePoisonedPointerInternal() { const size_t block_size = GetPageSize(); + void* data = nullptr; #if defined(ABSL_HAVE_ADDRESS_SANITIZER) - void* data = malloc(block_size); + data = malloc(block_size); ASAN_POISON_MEMORY_REGION(data, block_size); #elif defined(ABSL_HAVE_MEMORY_SANITIZER) - void* data = malloc(block_size); + data = malloc(block_size); __msan_poison(data, block_size); #elif defined(ABSL_HAVE_MMAP) - void* data = DirectMmap(nullptr, block_size, PROT_NONE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + data = DirectMmap(nullptr, block_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, + -1, 0); if (data == MAP_FAILED) return GetBadPointerInternal(); #elif defined(_WIN32) - void* data = VirtualAlloc(nullptr, block_size, MEM_RESERVE | MEM_COMMIT, - PAGE_NOACCESS); + data = VirtualAlloc(nullptr, block_size, MEM_RESERVE | MEM_COMMIT, + PAGE_NOACCESS); if (data == nullptr) return GetBadPointerInternal(); #else return GetBadPointerInternal(); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/raw_logging.cc b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/raw_logging.cc index 35a08f0ac0..8537f3ec52 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/raw_logging.cc @@ -41,9 +41,8 @@ // // This preprocessor token is also defined in raw_io.cc. If you need to copy // this, consider moving both to config.h instead. -#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ - defined(__hexagon__) || defined(__Fuchsia__) || \ - defined(__native_client__) || defined(__OpenBSD__) || \ +#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ + defined(__hexagon__) || defined(__Fuchsia__) || defined(__OpenBSD__) || \ defined(__EMSCRIPTEN__) || defined(__ASYLO__) #include @@ -158,7 +157,7 @@ void RawLogVA(absl::LogSeverity severity, const char* file, int line, #endif #ifdef ABSL_MIN_LOG_LEVEL - if (severity < static_cast(ABSL_MIN_LOG_LEVEL) && + if (severity < static_cast(ABSL_MIN_LOG_LEVEL) && severity < absl::LogSeverity::kFatal) { enabled = false; } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/spinlock.h b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/spinlock.h index 16fe93e54c..ff2b08726e 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/spinlock.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/spinlock.h @@ -101,6 +101,7 @@ class ABSL_LOCKABLE ABSL_ATTRIBUTE_WARN_UNUSED SpinLock { ABSL_TSAN_MUTEX_POST_LOCK(this, 0, 0); } + ABSL_DEPRECATE_AND_INLINE() inline void Lock() ABSL_EXCLUSIVE_LOCK_FUNCTION() { return lock(); } // Try to acquire this SpinLock without blocking and return true if the @@ -116,6 +117,7 @@ class ABSL_LOCKABLE ABSL_ATTRIBUTE_WARN_UNUSED SpinLock { return res; } + ABSL_DEPRECATE_AND_INLINE() [[nodiscard]] inline bool TryLock() ABSL_EXCLUSIVE_TRYLOCK_FUNCTION(true) { return try_lock(); } @@ -139,6 +141,7 @@ class ABSL_LOCKABLE ABSL_ATTRIBUTE_WARN_UNUSED SpinLock { ABSL_TSAN_MUTEX_POST_UNLOCK(this, 0); } + ABSL_DEPRECATE_AND_INLINE() inline void Unlock() ABSL_UNLOCK_FUNCTION() { unlock(); } // Determine if the lock is held. When the lock is held by the invoking @@ -235,17 +238,23 @@ class ABSL_LOCKABLE ABSL_ATTRIBUTE_WARN_UNUSED SpinLock { // the duration of a C++ scope. class ABSL_SCOPED_LOCKABLE [[nodiscard]] SpinLockHolder { public: - inline explicit SpinLockHolder(SpinLock* l) ABSL_EXCLUSIVE_LOCK_FUNCTION(l) + inline explicit SpinLockHolder( + SpinLock& l ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)) + ABSL_EXCLUSIVE_LOCK_FUNCTION(l) : lock_(l) { - l->lock(); + l.lock(); } - inline ~SpinLockHolder() ABSL_UNLOCK_FUNCTION() { lock_->unlock(); } + ABSL_DEPRECATE_AND_INLINE() + inline explicit SpinLockHolder(SpinLock* l) ABSL_EXCLUSIVE_LOCK_FUNCTION(l) + : SpinLockHolder(*l) {} + + inline ~SpinLockHolder() ABSL_UNLOCK_FUNCTION() { lock_.unlock(); } SpinLockHolder(const SpinLockHolder&) = delete; SpinLockHolder& operator=(const SpinLockHolder&) = delete; private: - SpinLock* lock_; + SpinLock& lock_; }; // Register a hook for profiling support. diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/spinlock_benchmark.cc b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/spinlock_benchmark.cc index 993cab6ff4..c79f49fefb 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/spinlock_benchmark.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/spinlock_benchmark.cc @@ -50,7 +50,7 @@ static void BM_SpinLock(benchmark::State& state) { static absl::NoDestructor spinlock( scheduling_mode); for (auto _ : state) { - absl::base_internal::SpinLockHolder holder(spinlock.get()); + absl::base_internal::SpinLockHolder holder(*spinlock.get()); } } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/sysinfo.cc b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/sysinfo.cc index 1937db3079..a62dd31c22 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/sysinfo.cc @@ -456,15 +456,6 @@ pid_t GetTID() { return getthrid(); } pid_t GetTID() { return static_cast(_lwp_self()); } -#elif defined(__native_client__) - -pid_t GetTID() { - auto* thread = pthread_self(); - static_assert(sizeof(pid_t) == sizeof(thread), - "In NaCL int expected to be the same size as a pointer"); - return reinterpret_cast(thread); -} - #elif defined(__Fuchsia__) pid_t GetTID() { diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc index 68f92730a8..dca7cbaa4c 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc @@ -85,6 +85,10 @@ int64_t UnscaledCycleClock::Now() { double UnscaledCycleClock::Frequency() { #ifdef __GLIBC__ return __ppc_get_timebase_freq(); +#elif defined(__linux__) + // Fallback for musl + ppc64le: use constant timebase frequency (512 MHz) + // Must come after __GLIBC__. + return static_cast(512000000); #elif defined(_AIX) // This is the same constant value as returned by // __ppc_get_timebase_freq(). diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h index 43a3dabeea..9a0841dfa7 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h @@ -34,7 +34,7 @@ // CycleClock that runs at atleast 1 MHz. We've found some Android // ARM64 devices where this is not the case, so we disable it by // default on Android ARM64. -#if defined(__native_client__) || (defined(__APPLE__)) || \ +#if defined(__APPLE__) || \ (defined(__ANDROID__) && defined(__aarch64__)) #define ABSL_USE_UNSCALED_CYCLECLOCK_DEFAULT 0 #else diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/nullability.h b/naiveproxy/src/third_party/abseil-cpp/absl/base/nullability.h index 2796a36125..facc6422e3 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/nullability.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/nullability.h @@ -81,7 +81,7 @@ // const Employee* absl_nonnull e; // // // A non-null pointer to a const nullable pointer to an `Employee`. -// Employee* absl_nullable const* absl_nonnull e = nullptr; +// Employee* absl_nullable const* absl_nonnull e; // // // A non-null function pointer. // void (*absl_nonnull func)(int, double); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/optimization.h b/naiveproxy/src/third_party/abseil-cpp/absl/base/optimization.h index 429ea9ce79..04678c4938 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/optimization.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/optimization.h @@ -53,9 +53,7 @@ // ABSL_BLOCK_TAIL_CALL_OPTIMIZATION(); // return result; // } -#if defined(__pnacl__) -#define ABSL_BLOCK_TAIL_CALL_OPTIMIZATION() if (volatile int x = 0) { (void)x; } -#elif defined(__clang__) +#if defined(__clang__) // Clang will not tail call given inline volatile assembly. #define ABSL_BLOCK_TAIL_CALL_OPTIMIZATION() __asm__ __volatile__("") #elif defined(__GNUC__) diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/base/spinlock_test_common.cc b/naiveproxy/src/third_party/abseil-cpp/absl/base/spinlock_test_common.cc index 56b09ec26d..6ac2e36c45 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/base/spinlock_test_common.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/base/spinlock_test_common.cc @@ -101,7 +101,7 @@ static uint32_t Hash32(uint32_t a, uint32_t c) { static void TestFunction(uint32_t thread_salt, SpinLock* spinlock) { for (int i = 0; i < kIters; i++) { - SpinLockHolder h(spinlock); + SpinLockHolder h(*spinlock); for (size_t j = 0; j < kArrayLength; j++) { const size_t index = (j + thread_salt) % kArrayLength; values[index] = Hash32(values[index], thread_salt); @@ -120,7 +120,7 @@ static void ThreadedTest(SpinLock* spinlock) { thread.join(); } - SpinLockHolder h(spinlock); + SpinLockHolder h(*spinlock); for (size_t i = 1; i < kArrayLength; i++) { EXPECT_EQ(values[0], values[i]); } @@ -132,12 +132,12 @@ static_assert(std::is_trivially_destructible(), ""); TEST(SpinLock, StackNonCooperativeDisablesScheduling) { SpinLock spinlock(base_internal::SCHEDULE_KERNEL_ONLY); - SpinLockHolder l(&spinlock); + SpinLockHolder l(spinlock); EXPECT_FALSE(base_internal::SchedulingGuard::ReschedulingIsAllowed()); } TEST(SpinLock, StaticNonCooperativeDisablesScheduling) { - SpinLockHolder l(&static_noncooperative_spinlock); + SpinLockHolder l(static_noncooperative_spinlock); EXPECT_FALSE(base_internal::SchedulingGuard::ReschedulingIsAllowed()); } @@ -243,12 +243,12 @@ TEST(SpinLockWithThreads, DoesNotDeadlock) { BlockingCounter* b) { locked->WaitForNotification(); // Wait for LockThenWait() to hold "s". b->DecrementCount(); - SpinLockHolder l(spinlock); + SpinLockHolder l(*spinlock); } static void LockThenWait(Notification* locked, SpinLock* spinlock, BlockingCounter* b) { - SpinLockHolder l(spinlock); + SpinLockHolder l(*spinlock); locked->Notify(); b->Wait(); } @@ -271,16 +271,13 @@ TEST(SpinLockWithThreads, DoesNotDeadlock) { } }; + int num_threads = base_internal::NumCPUs() * 2; SpinLock stack_cooperative_spinlock; SpinLock stack_noncooperative_spinlock(base_internal::SCHEDULE_KERNEL_ONLY); - Helper::DeadlockTest(&stack_cooperative_spinlock, - base_internal::NumCPUs() * 2); - Helper::DeadlockTest(&stack_noncooperative_spinlock, - base_internal::NumCPUs() * 2); - Helper::DeadlockTest(&static_cooperative_spinlock, - base_internal::NumCPUs() * 2); - Helper::DeadlockTest(&static_noncooperative_spinlock, - base_internal::NumCPUs() * 2); + Helper::DeadlockTest(&stack_cooperative_spinlock, num_threads); + Helper::DeadlockTest(&stack_noncooperative_spinlock, num_threads); + Helper::DeadlockTest(&static_cooperative_spinlock, num_threads); + Helper::DeadlockTest(&static_noncooperative_spinlock, num_threads); } TEST(SpinLockTest, IsCooperative) { diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/container/flat_hash_map.h b/naiveproxy/src/third_party/abseil-cpp/absl/container/flat_hash_map.h index a1f4f24aae..7d6fd21e22 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/container/flat_hash_map.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/container/flat_hash_map.h @@ -462,7 +462,9 @@ class ABSL_ATTRIBUTE_OWNER flat_hash_map // // Sets the number of slots in the `flat_hash_map` to the number needed to // accommodate at least `count` total elements without exceeding the current - // maximum load factor, and may rehash the container if needed. + // maximum load factor, and may rehash the container if needed. After this + // returns, it is guaranteed that `count - size()` elements can be inserted + // into the `flat_hash_map` without another rehash. using Base::reserve; // flat_hash_map::at() diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/container/flat_hash_set.h b/naiveproxy/src/third_party/abseil-cpp/absl/container/flat_hash_set.h index 2d255529ba..95e4533146 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/container/flat_hash_set.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/container/flat_hash_set.h @@ -396,7 +396,9 @@ class ABSL_ATTRIBUTE_OWNER flat_hash_set // // Sets the number of slots in the `flat_hash_set` to the number needed to // accommodate at least `count` total elements without exceeding the current - // maximum load factor, and may rehash the container if needed. + // maximum load factor, and may rehash the container if needed. After this + // returns, it is guaranteed that `count - size()` elements can be inserted + // into the `flat_hash_set` without another rehash. using Base::reserve; // flat_hash_set::contains() diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/container/inlined_vector.h b/naiveproxy/src/third_party/abseil-cpp/absl/container/inlined_vector.h index c53cbd21c1..6b05d92c56 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/container/inlined_vector.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/container/inlined_vector.h @@ -815,13 +815,11 @@ class ABSL_ATTRIBUTE_WARN_UNUSED InlinedVector { // `InlinedVector::clear()` // // Destroys all elements in the inlined vector, setting the size to `0` and - // deallocating any held memory. + // preserving capacity. void clear() noexcept { inlined_vector_internal::DestroyAdapter::DestroyElements( storage_.GetAllocator(), data(), size()); - storage_.DeallocateIfAllocated(); - - storage_.SetInlinedSize(0); + storage_.SetSize(0); } // `InlinedVector::reserve(...)` @@ -1011,6 +1009,16 @@ H AbslHashValue(H h, const absl::InlinedVector& a) { return H::combine_contiguous(std::move(h), a.data(), a.size()); } +template +constexpr typename InlinedVector::size_type erase_if( + InlinedVector& v, Predicate pred) { + const auto it = std::remove_if(v.begin(), v.end(), std::move(pred)); + const auto removed = static_cast::size_type>( + std::distance(it, v.end())); + v.erase(it, v.end()); + return removed; +} + ABSL_NAMESPACE_END } // namespace absl diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/btree_container.h b/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/btree_container.h index 21f00ae414..f4f41d0ddf 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/btree_container.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/btree_container.h @@ -640,12 +640,12 @@ class btree_map_container : public btree_set_container { } template >()> mapped_type &operator[](key_arg &&k) ABSL_ATTRIBUTE_LIFETIME_BOUND { - return try_emplace(std::forward(k)).first->second; + return try_emplace(std::forward>(k)).first->second; } template > = 0> mapped_type &operator[](key_arg &&k ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY( this)) ABSL_ATTRIBUTE_LIFETIME_BOUND { - return this->template operator[](std::forward(k)); + return this->template operator[](std::forward>(k)); } template diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h b/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h index 0501e48d32..f0fd354f1b 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h @@ -212,6 +212,9 @@ static_assert( static_assert(ctrl_t::kDeleted == static_cast(-2), "ctrl_t::kDeleted must be -2 to make the implementation of " "ConvertSpecialToEmptyAndFullToDeleted efficient"); +static_assert(ctrl_t::kEmpty == static_cast(-128), + "ctrl_t::kEmpty must be -128 to use saturated subtraction in" + " ConvertSpecialToEmptyAndFullToDeleted"); // Helpers for checking the state of a control byte. inline bool IsEmpty(ctrl_t c) { return c == ctrl_t::kEmpty; } @@ -329,15 +332,15 @@ struct GroupSse2Impl { } void ConvertSpecialToEmptyAndFullToDeleted(ctrl_t* dst) const { + // Take advantage of the fact that kEmpty is already the smallest signed + // char value, and using a saturated subtraction will not affect it. + // All special values have the MSB set, so after an AND with MSBS, we + // are left with -128 for special values and 0 for full. After applying + // subs 2, we arrive at the result of -128(kEmpty) for special and + // -2(kDeleted) for full. auto msbs = _mm_set1_epi8(static_cast(-128)); - auto x126 = _mm_set1_epi8(126); -#ifdef ABSL_INTERNAL_HAVE_SSSE3 - auto res = _mm_or_si128(_mm_shuffle_epi8(x126, ctrl), msbs); -#else - auto zero = _mm_setzero_si128(); - auto special_mask = _mm_cmpgt_epi8_fixed(zero, ctrl); - auto res = _mm_or_si128(msbs, _mm_andnot_si128(special_mask, x126)); -#endif + auto twos = _mm_set1_epi8(static_cast(2)); + auto res = _mm_subs_epi8(_mm_and_si128(msbs, ctrl), twos); _mm_storeu_si128(reinterpret_cast<__m128i*>(dst), res); } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/inlined_vector.h b/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/inlined_vector.h index b0d3f077e6..85e8960e1e 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/inlined_vector.h @@ -27,7 +27,6 @@ #include "absl/base/attributes.h" #include "absl/base/config.h" -#include "absl/base/internal/identity.h" #include "absl/base/macros.h" #include "absl/container/internal/compressed_tuple.h" #include "absl/memory/memory.h" @@ -127,7 +126,7 @@ struct MallocAdapter { }; template -void ConstructElements(absl::internal::type_identity_t& allocator, +void ConstructElements(absl::type_identity_t& allocator, Pointer construct_first, ValueAdapter& values, SizeType construct_size) { for (SizeType i = 0; i < construct_size; ++i) { diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h b/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h index b42a4f22f6..85adf87935 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h @@ -205,7 +205,8 @@ class raw_hash_map : public raw_hash_set { !std::is_convertible::value, int>::type = 0> std::pair try_emplace(key_arg &&k, Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND { - return try_emplace_impl(std::forward(k), std::forward(args)...); + return try_emplace_impl(std::forward>(k), + std::forward(args)...); } template { std::pair try_emplace( key_arg &&k ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this), Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND { - return this->template try_emplace(std::forward(k), + return this->template try_emplace(std::forward>(k), std::forward(args)...); } @@ -241,14 +242,15 @@ class raw_hash_map : public raw_hash_set { class... Args> iterator try_emplace(const_iterator, key_arg &&k, Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND { - return try_emplace(std::forward(k), std::forward(args)...).first; + return try_emplace(std::forward>(k), std::forward(args)...) + .first; } template > = 0> iterator try_emplace(const_iterator hint, key_arg &&k ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this), Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND { - return this->template try_emplace(hint, std::forward(k), + return this->template try_emplace(hint, std::forward>(k), std::forward(args)...); } @@ -264,7 +266,7 @@ class raw_hash_map : public raw_hash_set { const key_arg &k ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this), Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND { - return this->template try_emplace(hint, std::forward(k), + return this->template try_emplace(hint, k, std::forward(args)...); } @@ -296,15 +298,15 @@ class raw_hash_map : public raw_hash_set { // It is safe to use unchecked_deref here because try_emplace // will always return an iterator pointing to a valid item in the table, // since it inserts if nothing is found for the given key. - return Policy::value( - &this->unchecked_deref(try_emplace(std::forward(key)).first)); + return Policy::value(&this->unchecked_deref( + try_emplace(std::forward>(key)).first)); } template > = 0> MappedReference

operator[]( key_arg &&key ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)) ABSL_ATTRIBUTE_LIFETIME_BOUND { - return this->template operator[](std::forward(key)); + return this->template operator[](std::forward>(key)); } template #include #include +#include #include #include "absl/base/attributes.h" @@ -108,6 +109,13 @@ size_t Resize1To3NewOffset(size_t hash, PerTableSeed seed) { return SingleGroupTableH1(hash, seed) & 2; } +// Returns the address of the ith slot in slots where each slot occupies +// slot_size. +inline void* SlotAddress(void* slot_array, size_t slot, size_t slot_size) { + return static_cast(static_cast(slot_array) + + (slot * slot_size)); +} + // Returns the address of the slot `i` iterations after `slot` assuming each // slot has the specified size. inline void* NextSlot(void* slot, size_t slot_size, size_t i = 1) { @@ -147,21 +155,31 @@ bool CommonFieldsGenerationInfoEnabled::should_rehash_for_bug_detection_on_move( namespace { +// Probes an array of control bits using a probe sequence, +// and returns the mask corresponding to the first group with a deleted or empty +// slot. +inline Group::NonIterableBitMaskType probe_till_first_non_full_group( + const ctrl_t* ctrl, probe_seq& seq, + [[maybe_unused]] size_t capacity) { + while (true) { + GroupFullEmptyOrDeleted g{ctrl + seq.offset()}; + auto mask = g.MaskEmptyOrDeleted(); + if (mask) { + return mask; + } + seq.next(); + ABSL_SWISSTABLE_ASSERT(seq.index() <= capacity && "full table!"); + } +} + FindInfo find_first_non_full_from_h1(const ctrl_t* ctrl, size_t h1, size_t capacity) { auto seq = probe_h1(capacity, h1); if (IsEmptyOrDeleted(ctrl[seq.offset()])) { return {seq.offset(), /*probe_length=*/0}; } - while (true) { - GroupFullEmptyOrDeleted g{ctrl + seq.offset()}; - auto mask = g.MaskEmptyOrDeleted(); - if (mask) { - return {seq.offset(mask.LowestBitSet()), seq.index()}; - } - seq.next(); - ABSL_SWISSTABLE_ASSERT(seq.index() <= capacity && "full table!"); - } + auto mask = probe_till_first_non_full_group(ctrl, seq, capacity); + return {seq.offset(mask.LowestBitSet()), seq.index()}; } // Probes an array of control bits using a probe sequence derived from `hash`, @@ -176,6 +194,16 @@ FindInfo find_first_non_full(const CommonFields& common, size_t hash) { common.capacity()); } +// Same as `find_first_non_full`, but returns the mask corresponding to the +// first group with a deleted or empty slot. +std::pair find_first_non_full_group( + const CommonFields& common, size_t hash) { + auto seq = probe(common, hash); + auto mask = + probe_till_first_non_full_group(common.control(), seq, common.capacity()); + return {{seq.offset(), seq.index()}, mask}; +} + // Whether a table fits in half a group. A half-group table fits entirely into a // probing group, i.e., has a capacity < `Group::kWidth`. // @@ -297,6 +325,69 @@ void PrepareInsertCommon(CommonFields& common) { common.maybe_increment_generation_on_insert(); } +// Sets sanitizer poisoning for slot corresponding to control byte being set. +inline void DoSanitizeOnSetCtrl(const CommonFields& c, size_t i, ctrl_t h, + size_t slot_size) { + ABSL_SWISSTABLE_ASSERT(i < c.capacity()); + auto* slot_i = static_cast(c.slot_array()) + i * slot_size; + if (IsFull(h)) { + SanitizerUnpoisonMemoryRegion(slot_i, slot_size); + } else { + SanitizerPoisonMemoryRegion(slot_i, slot_size); + } +} + +// Sets `ctrl[i]` to `h`. +// +// Unlike setting it directly, this function will perform bounds checks and +// mirror the value to the cloned tail if necessary. +inline void SetCtrl(const CommonFields& c, size_t i, ctrl_t h, + size_t slot_size) { + ABSL_SWISSTABLE_ASSERT(!c.is_small()); + DoSanitizeOnSetCtrl(c, i, h, slot_size); + ctrl_t* ctrl = c.control(); + ctrl[i] = h; + ctrl[((i - NumClonedBytes()) & c.capacity()) + + (NumClonedBytes() & c.capacity())] = h; +} +// Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`. +inline void SetCtrl(const CommonFields& c, size_t i, h2_t h, size_t slot_size) { + SetCtrl(c, i, static_cast(h), slot_size); +} + +// Like SetCtrl, but in a single group table, we can save some operations when +// setting the cloned control byte. +inline void SetCtrlInSingleGroupTable(const CommonFields& c, size_t i, ctrl_t h, + size_t slot_size) { + ABSL_SWISSTABLE_ASSERT(!c.is_small()); + ABSL_SWISSTABLE_ASSERT(is_single_group(c.capacity())); + DoSanitizeOnSetCtrl(c, i, h, slot_size); + ctrl_t* ctrl = c.control(); + ctrl[i] = h; + ctrl[i + c.capacity() + 1] = h; +} +// Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`. +inline void SetCtrlInSingleGroupTable(const CommonFields& c, size_t i, h2_t h, + size_t slot_size) { + SetCtrlInSingleGroupTable(c, i, static_cast(h), slot_size); +} + +// Like SetCtrl, but in a table with capacity >= Group::kWidth - 1, +// we can save some operations when setting the cloned control byte. +inline void SetCtrlInLargeTable(const CommonFields& c, size_t i, ctrl_t h, + size_t slot_size) { + ABSL_SWISSTABLE_ASSERT(c.capacity() >= Group::kWidth - 1); + DoSanitizeOnSetCtrl(c, i, h, slot_size); + ctrl_t* ctrl = c.control(); + ctrl[i] = h; + ctrl[((i - NumClonedBytes()) & c.capacity()) + NumClonedBytes()] = h; +} +// Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`. +inline void SetCtrlInLargeTable(const CommonFields& c, size_t i, h2_t h, + size_t slot_size) { + SetCtrlInLargeTable(c, i, static_cast(h), slot_size); +} + size_t DropDeletesWithoutResizeAndPrepareInsert( CommonFields& common, const PolicyFunctions& __restrict policy, size_t new_hash) { @@ -679,7 +770,7 @@ void ResizeNonSooImpl(CommonFields& common, ABSL_SWISSTABLE_ASSERT(IsValidCapacity(new_capacity)); ABSL_SWISSTABLE_ASSERT(new_capacity > policy.soo_capacity()); - const size_t old_capacity = common.capacity(); + [[maybe_unused]] const size_t old_capacity = common.capacity(); [[maybe_unused]] ctrl_t* old_ctrl; [[maybe_unused]] void* old_slots; if constexpr (kMode == ResizeNonSooMode::kGuaranteedAllocated) { @@ -688,7 +779,7 @@ void ResizeNonSooImpl(CommonFields& common, } const size_t slot_size = policy.slot_size; - const size_t slot_align = policy.slot_align; + [[maybe_unused]] const size_t slot_align = policy.slot_align; const bool has_infoz = infoz.IsSampled(); void* alloc = policy.get_char_alloc(common); @@ -1295,12 +1386,12 @@ std::pair Grow1To3AndPrepareInsert( ctrl_t* old_ctrl = common.control(); void* old_slots = common.slot_array(); - common.set_capacity(kNewCapacity); const size_t slot_size = policy.slot_size; const size_t slot_align = policy.slot_align; void* alloc = policy.get_char_alloc(common); HashtablezInfoHandle infoz = common.infoz(); const bool has_infoz = infoz.IsSampled(); + common.set_capacity(kNewCapacity); const auto [new_ctrl, new_slots] = AllocBackingArray(common, policy, kNewCapacity, has_infoz, alloc); @@ -1854,7 +1945,9 @@ void ReserveTableToFitNewSize(CommonFields& common, namespace { size_t PrepareInsertLargeImpl(CommonFields& common, const PolicyFunctions& __restrict policy, - size_t hash, FindInfo target) { + size_t hash, + Group::NonIterableBitMaskType mask_empty, + FindInfo target_group) { ABSL_SWISSTABLE_ASSERT(!common.is_small()); const GrowthInfo growth_info = common.growth_info(); // When there are no deleted slots in the table @@ -1865,23 +1958,27 @@ size_t PrepareInsertLargeImpl(CommonFields& common, } PrepareInsertCommon(common); common.growth_info().OverwriteEmptyAsFull(); - SetCtrl(common, target.offset, H2(hash), policy.slot_size); - common.infoz().RecordInsert(hash, target.probe_length); - return target.offset; + target_group.offset += mask_empty.LowestBitSet(); + target_group.offset &= common.capacity(); + SetCtrl(common, target_group.offset, H2(hash), policy.slot_size); + common.infoz().RecordInsert(hash, target_group.probe_length); + return target_group.offset; } } // namespace size_t PrepareInsertLarge(CommonFields& common, const PolicyFunctions& __restrict policy, size_t hash, - FindInfo target) { + Group::NonIterableBitMaskType mask_empty, + FindInfo target_group) { // NOLINTNEXTLINE(misc-static-assert) ABSL_SWISSTABLE_ASSERT(!SwisstableGenerationsEnabled()); - return PrepareInsertLargeImpl(common, policy, hash, target); + return PrepareInsertLargeImpl(common, policy, hash, mask_empty, target_group); } size_t PrepareInsertLargeGenerationsEnabled( CommonFields& common, const PolicyFunctions& policy, size_t hash, - FindInfo target, absl::FunctionRef recompute_hash) { + Group::NonIterableBitMaskType mask_empty, FindInfo target_group, + absl::FunctionRef recompute_hash) { // NOLINTNEXTLINE(misc-static-assert) ABSL_SWISSTABLE_ASSERT(SwisstableGenerationsEnabled()); if (common.should_rehash_for_bug_detection_on_insert()) { @@ -1890,9 +1987,10 @@ size_t PrepareInsertLargeGenerationsEnabled( ResizeAllocatedTableWithSeedChange( common, policy, common.growth_left() > 0 ? cap : NextCapacity(cap)); hash = recompute_hash(common.seed().seed()); - target = find_first_non_full(common, hash); + std::tie(target_group, mask_empty) = + find_first_non_full_group(common, hash); } - return PrepareInsertLargeImpl(common, policy, hash, target); + return PrepareInsertLargeImpl(common, policy, hash, mask_empty, target_group); } namespace { diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h b/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h index 679d68c423..9033982b7a 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h @@ -1175,30 +1175,32 @@ constexpr size_t NormalizeCapacity(size_t n) { } // General notes on capacity/growth methods below: -// - We use 7/8th as maximum load factor. For 16-wide groups, that gives an -// average of two empty slots per group. -// - For (capacity+1) >= Group::kWidth, growth is 7/8*capacity. +// - We use 27/32 as maximum load factor. For 16-wide groups, that gives an +// average of 2.5 empty slots per group. // - For (capacity+1) < Group::kWidth, growth == capacity. In this case, we // never need to probe (the whole table fits in one group) so we don't need a // load factor less than 1. +// - For (capacity+1) == Group::kWidth, growth is capacity - 1 since we need +// at least one empty slot for probing algorithm. +// - For (capacity+1) > Group::kWidth, growth is 27/32*capacity. // Given `capacity`, applies the load factor; i.e., it returns the maximum // number of values we should put into the table before a resizing rehash. constexpr size_t CapacityToGrowth(size_t capacity) { ABSL_SWISSTABLE_ASSERT(IsValidCapacity(capacity)); - // `capacity*7/8` + // `capacity*27/32` if (Group::kWidth == 8 && capacity == 7) { - // x-x/8 does not work when x==7. + // formula does not work when x==7. return 6; } - return capacity - capacity / 8; + return capacity - capacity / 8 - capacity / 32; } // Given `size`, "unapplies" the load factor to find how large the capacity // should be to stay within the load factor. // // For size == 0, returns 0. -// For other values, returns the same as `NormalizeCapacity(size*8/7)`. +// For other values, returns the same as `NormalizeCapacity(size*32/27)`. constexpr size_t SizeToCapacity(size_t size) { if (size == 0) { return 0; @@ -1207,18 +1209,10 @@ constexpr size_t SizeToCapacity(size_t size) { // Shifting right `~size_t{}` by `leading_zeros` yields // NormalizeCapacity(size). int leading_zeros = absl::countl_zero(size); - constexpr size_t kLast3Bits = size_t{7} << (sizeof(size_t) * 8 - 3); - // max_size_for_next_capacity = max_load_factor * next_capacity - // = (7/8) * (~size_t{} >> leading_zeros) - // = (7/8*~size_t{}) >> leading_zeros - // = kLast3Bits >> leading_zeros - size_t max_size_for_next_capacity = kLast3Bits >> leading_zeros; + size_t next_capacity = ~size_t{} >> leading_zeros; + size_t max_size_for_next_capacity = CapacityToGrowth(next_capacity); // Decrease shift if size is too big for the minimum capacity. leading_zeros -= static_cast(size > max_size_for_next_capacity); - if constexpr (Group::kWidth == 8) { - // Formula doesn't work when size==7 for 8-wide groups. - leading_zeros -= (size == 7); - } return (~size_t{}) >> leading_zeros; } @@ -1474,81 +1468,11 @@ extern template size_t TryFindNewIndexWithoutProbing(size_t h1, ctrl_t* new_ctrl, size_t new_capacity); -// Sets sanitizer poisoning for slot corresponding to control byte being set. -inline void DoSanitizeOnSetCtrl(const CommonFields& c, size_t i, ctrl_t h, - size_t slot_size) { - ABSL_SWISSTABLE_ASSERT(i < c.capacity()); - auto* slot_i = static_cast(c.slot_array()) + i * slot_size; - if (IsFull(h)) { - SanitizerUnpoisonMemoryRegion(slot_i, slot_size); - } else { - SanitizerPoisonMemoryRegion(slot_i, slot_size); - } -} - -// Sets `ctrl[i]` to `h`. -// -// Unlike setting it directly, this function will perform bounds checks and -// mirror the value to the cloned tail if necessary. -inline void SetCtrl(const CommonFields& c, size_t i, ctrl_t h, - size_t slot_size) { - ABSL_SWISSTABLE_ASSERT(!c.is_small()); - DoSanitizeOnSetCtrl(c, i, h, slot_size); - ctrl_t* ctrl = c.control(); - ctrl[i] = h; - ctrl[((i - NumClonedBytes()) & c.capacity()) + - (NumClonedBytes() & c.capacity())] = h; -} -// Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`. -inline void SetCtrl(const CommonFields& c, size_t i, h2_t h, size_t slot_size) { - SetCtrl(c, i, static_cast(h), slot_size); -} - -// Like SetCtrl, but in a single group table, we can save some operations when -// setting the cloned control byte. -inline void SetCtrlInSingleGroupTable(const CommonFields& c, size_t i, ctrl_t h, - size_t slot_size) { - ABSL_SWISSTABLE_ASSERT(!c.is_small()); - ABSL_SWISSTABLE_ASSERT(is_single_group(c.capacity())); - DoSanitizeOnSetCtrl(c, i, h, slot_size); - ctrl_t* ctrl = c.control(); - ctrl[i] = h; - ctrl[i + c.capacity() + 1] = h; -} -// Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`. -inline void SetCtrlInSingleGroupTable(const CommonFields& c, size_t i, h2_t h, - size_t slot_size) { - SetCtrlInSingleGroupTable(c, i, static_cast(h), slot_size); -} - -// Like SetCtrl, but in a table with capacity >= Group::kWidth - 1, -// we can save some operations when setting the cloned control byte. -inline void SetCtrlInLargeTable(const CommonFields& c, size_t i, ctrl_t h, - size_t slot_size) { - ABSL_SWISSTABLE_ASSERT(c.capacity() >= Group::kWidth - 1); - DoSanitizeOnSetCtrl(c, i, h, slot_size); - ctrl_t* ctrl = c.control(); - ctrl[i] = h; - ctrl[((i - NumClonedBytes()) & c.capacity()) + NumClonedBytes()] = h; -} -// Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`. -inline void SetCtrlInLargeTable(const CommonFields& c, size_t i, h2_t h, - size_t slot_size) { - SetCtrlInLargeTable(c, i, static_cast(h), slot_size); -} - // growth_info (which is a size_t) is stored with the backing array. constexpr size_t BackingArrayAlignment(size_t align_of_slot) { return (std::max)(align_of_slot, alignof(GrowthInfo)); } -// Returns the address of the ith slot in slots where each slot occupies -// slot_size. -inline void* SlotAddress(void* slot_array, size_t slot, size_t slot_size) { - return static_cast(static_cast(slot_array) + - (slot * slot_size)); -} - // Iterates over all full slots and calls `cb(const ctrl_t*, void*)`. // No insertion to the table is allowed during `cb` call. // Erasure is allowed only for the element passed to the callback. @@ -1804,29 +1728,35 @@ ABSL_ATTRIBUTE_NOINLINE void TransferNRelocatable(void*, void* dst, void* src, // empty class cases. void* GetRefForEmptyClass(CommonFields& common); -// Given the hash of a value not currently in the table and the first empty -// slot in the probe sequence, finds a viable slot index to insert it at. +// Given the hash of a value not currently in the table and the first group with +// an empty slot in the probe sequence, finds a viable slot index to insert it +// at. // // In case there's no space left, the table can be resized or rehashed // (for tables with deleted slots, see FindInsertPositionWithGrowthOrRehash). // // In the case of absence of deleted slots and positive growth_left, the element -// can be inserted in the provided `target` position. +// can be inserted in one of the empty slots in the provided `target_group`. // // When the table has deleted slots (according to GrowthInfo), the target // position will be searched one more time using `find_first_non_full`. // // REQUIRES: `!common.is_small()`. // REQUIRES: At least one non-full slot available. -// REQUIRES: `target` is a valid empty position to insert. +// REQUIRES: `mask_empty` is a mask containing empty slots for the +// `target_group`. +// REQUIRES: `target_group` is a starting position for the group that has +// at least one empty slot. size_t PrepareInsertLarge(CommonFields& common, const PolicyFunctions& policy, - size_t hash, FindInfo target); + size_t hash, Group::NonIterableBitMaskType mask_empty, + FindInfo target_group); // Same as above, but with generations enabled, we may end up changing the seed, // which means we need to be able to recompute the hash. size_t PrepareInsertLargeGenerationsEnabled( CommonFields& common, const PolicyFunctions& policy, size_t hash, - FindInfo target, absl::FunctionRef recompute_hash); + Group::NonIterableBitMaskType mask_empty, FindInfo target_group, + absl::FunctionRef recompute_hash); // A SwissTable. // @@ -2466,13 +2396,13 @@ class raw_hash_set { // s.insert({"abc", 42}); std::pair insert(init_type&& value) ABSL_ATTRIBUTE_LIFETIME_BOUND -#if __cplusplus >= 202002L +#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L requires(!IsLifetimeBoundAssignmentFrom::value) #endif { return emplace(std::move(value)); } -#if __cplusplus >= 202002L +#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L std::pair insert( init_type&& value ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)) ABSL_ATTRIBUTE_LIFETIME_BOUND @@ -2515,17 +2445,17 @@ class raw_hash_set { template void insert(InputIt first, InputIt last) { - for (; first != last; ++first) emplace(*first); + insert_range(first, last); } template = 0, std::enable_if_t::value, int> = 0> void insert(std::initializer_list ilist) { - insert(ilist.begin(), ilist.end()); + insert_range(ilist.begin(), ilist.end()); } void insert(std::initializer_list ilist) { - insert(ilist.begin(), ilist.end()); + insert_range(ilist.begin(), ilist.end()); } insert_return_type insert(node_type&& node) ABSL_ATTRIBUTE_LIFETIME_BOUND { @@ -3260,31 +3190,47 @@ class raw_hash_set { auto seq = probe(common(), hash); const h2_t h2 = H2(hash); const ctrl_t* ctrl = control(); - while (true) { + size_t index; + bool inserted; + // We use a lambda function to be able to exit from the nested loop without + // duplicating generated code for the return statement (e.g. iterator_at). + [&]() ABSL_ATTRIBUTE_ALWAYS_INLINE { + while (true) { #ifndef ABSL_HAVE_MEMORY_SANITIZER - absl::PrefetchToLocalCache(slot_array() + seq.offset()); + absl::PrefetchToLocalCache(slot_array() + seq.offset()); #endif - Group g{ctrl + seq.offset()}; - for (uint32_t i : g.Match(h2)) { - if (ABSL_PREDICT_TRUE(equal_to(key, slot_array() + seq.offset(i)))) - return {iterator_at(seq.offset(i)), false}; + Group g{ctrl + seq.offset()}; + for (uint32_t i : g.Match(h2)) { + if (ABSL_PREDICT_TRUE(equal_to(key, slot_array() + seq.offset(i)))) { + index = seq.offset(i); + inserted = false; + return; + } + } + auto mask_empty = g.MaskEmpty(); + if (ABSL_PREDICT_TRUE(mask_empty)) { + size_t target_group_offset = seq.offset(); + index = SwisstableGenerationsEnabled() + ? PrepareInsertLargeGenerationsEnabled( + common(), GetPolicyFunctions(), hash, mask_empty, + FindInfo{target_group_offset, seq.index()}, + HashKey{hash_ref(), key}) + : PrepareInsertLarge( + common(), GetPolicyFunctions(), hash, mask_empty, + FindInfo{target_group_offset, seq.index()}); + inserted = true; + return; + } + seq.next(); + ABSL_SWISSTABLE_ASSERT(seq.index() <= capacity() && "full table!"); } - auto mask_empty = g.MaskEmpty(); - if (ABSL_PREDICT_TRUE(mask_empty)) { - size_t target = seq.offset(mask_empty.LowestBitSet()); - size_t index = - SwisstableGenerationsEnabled() - ? PrepareInsertLargeGenerationsEnabled( - common(), GetPolicyFunctions(), hash, - FindInfo{target, seq.index()}, - HashKey{hash_ref(), key}) - : PrepareInsertLarge(common(), GetPolicyFunctions(), hash, - FindInfo{target, seq.index()}); - return {iterator_at(index), true}; - } - seq.next(); - ABSL_SWISSTABLE_ASSERT(seq.index() <= capacity() && "full table!"); - } + }(); + return {iterator_at(index), inserted}; + } + + template + void insert_range(InputIt first, InputIt last) { + for (; first != last; ++first) emplace(*first); } protected: diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc b/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc index 458038e0b3..2712160f79 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc @@ -15,8 +15,14 @@ // Generates probe length statistics for many combinations of key types and key // distributions, all using the default hash function for swisstable. +#include +#include +#include +#include #include #include // NOLINT +#include +#include #include #include "absl/base/no_destructor.h" @@ -227,24 +233,6 @@ Ptr* MakePtr(uintptr_t v) { return reinterpret_cast*>(v); } -struct IntIdentity { - uint64_t i; - friend bool operator==(IntIdentity a, IntIdentity b) { return a.i == b.i; } - IntIdentity operator++(int) { return IntIdentity{i++}; } -}; - -template -struct PtrIdentity { - explicit PtrIdentity(uintptr_t val = PointerForAlignment()) : i(val) {} - uintptr_t i; - friend bool operator==(PtrIdentity a, PtrIdentity b) { return a.i == b.i; } - PtrIdentity operator++(int) { - PtrIdentity p(i); - i += Align; - return p; - } -}; - enum class StringSize { kSmall, kMedium, kLarge, kExtraLarge }; constexpr char kStringFormat[] = "%s/name-%07d-of-9999999.txt"; @@ -270,20 +258,6 @@ struct String { } }; -template <> -struct DefaultHash { - struct type { - size_t operator()(IntIdentity t) const { return t.i; } - }; -}; - -template -struct DefaultHash> { - struct type { - size_t operator()(PtrIdentity t) const { return t.i; } - }; -}; - template struct Sequential { T operator()() const { return current++; } @@ -389,20 +363,6 @@ struct Random*, Dist> { } }; -template -struct Random { - IntIdentity operator()() const { - return IntIdentity{Random{}()}; - } -}; - -template -struct Random, Dist> { - PtrIdentity operator()() const { - return PtrIdentity{Random{}() * Align}; - } -}; - template struct Random, Dist> { std::string operator()() const { @@ -423,18 +383,12 @@ std::string Name(); std::string Name(uint32_t*) { return "u32"; } std::string Name(uint64_t*) { return "u64"; } -std::string Name(IntIdentity*) { return "IntIdentity"; } template std::string Name(Ptr**) { return absl::StrCat("Ptr", Align); } -template -std::string Name(PtrIdentity*) { - return absl::StrCat("PtrIdentity", Align); -} - template std::string Name(String*) { switch (size) { @@ -558,15 +512,10 @@ int main(int argc, char** argv) { std::vector results; RunForType(results); - RunForType(results); RunForType*>(results); RunForType*>(results); RunForType*>(results); RunForType*>(results); - RunForType>(results); - RunForType>(results); - RunForType>(results); - RunForType>(results); RunForType>(results); RunForType>(results); RunForType>(results); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/container/node_hash_map.h b/naiveproxy/src/third_party/abseil-cpp/absl/container/node_hash_map.h index 46faa8951c..b24db3601e 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/container/node_hash_map.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/container/node_hash_map.h @@ -455,7 +455,9 @@ class ABSL_ATTRIBUTE_OWNER node_hash_map // // Sets the number of slots in the `node_hash_map` to the number needed to // accommodate at least `count` total elements without exceeding the current - // maximum load factor, and may rehash the container if needed. + // maximum load factor, and may rehash the container if needed. After this + // returns, it is guaranteed that `count - size()` elements can be inserted + // into the `node_hash_map` without another rehash. using Base::reserve; // node_hash_map::at() diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/container/node_hash_set.h b/naiveproxy/src/third_party/abseil-cpp/absl/container/node_hash_set.h index 9eef870ff8..508248c745 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/container/node_hash_set.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/container/node_hash_set.h @@ -390,7 +390,9 @@ class ABSL_ATTRIBUTE_OWNER node_hash_set // // Sets the number of slots in the `node_hash_set` to the number needed to // accommodate at least `count` total elements without exceeding the current - // maximum load factor, and may rehash the container if needed. + // maximum load factor, and may rehash the container if needed. After this + // returns, it is guaranteed that `count - size()` elements can be inserted + // into the `node_hash_set` without another rehash. using Base::reserve; // node_hash_set::contains() diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc b/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc index c59f773ea3..a6976017f3 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc @@ -145,6 +145,14 @@ CpuType GetIntelCpuType() { } case 0x5e: // Skylake (client) return CpuType::kIntelSkylake; + case 0x6a: // Ice Lake + return CpuType::kIntelIcelake; + case 0x8f: // Sapphire Rapids + return CpuType::kIntelSapphirerapids; + case 0xcf: // Emerald Rapids + return CpuType::kIntelEmeraldrapids; + case 0xad: // Granite Rapids + return CpuType::kIntelGraniterapidsap; default: return CpuType::kUnknown; } @@ -210,6 +218,14 @@ CpuType GetAmdCpuType() { return CpuType::kUnknown; } break; + case 0x1A: + switch (model_num) { + case 0x2: + return CpuType::kAmdTurin; + default: + return CpuType::kUnknown; + } + break; default: return CpuType::kUnknown; } @@ -259,6 +275,7 @@ CpuType GetCpuType() { case 0xd40: return CpuType::kArmNeoverseV1; case 0xd49: return CpuType::kArmNeoverseN2; case 0xd4f: return CpuType::kArmNeoverseV2; + case 0xd8e: return CpuType::kArmNeoverseN3; default: return CpuType::kUnknown; } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h b/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h index 01e19590ca..e76a8027ca 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h @@ -30,10 +30,15 @@ enum class CpuType { kAmdNaples, kAmdMilan, kAmdGenoa, + kAmdTurin, kAmdRyzenV3000, kIntelCascadelakeXeon, kIntelSkylakeXeon, kIntelBroadwell, + kIntelIcelake, + kIntelSapphirerapids, + kIntelEmeraldrapids, + kIntelGraniterapidsap, kIntelSkylake, kIntelIvybridge, kIntelSandybridge, @@ -42,7 +47,8 @@ enum class CpuType { kArmNeoverseV1, kAmpereSiryn, kArmNeoverseN2, - kArmNeoverseV2 + kArmNeoverseV2, + kArmNeoverseN3, }; // Returns the type of host CPU this code is running on. Returns kUnknown if diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc b/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc index 03cf348ff9..ebd9c3fef2 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc @@ -317,6 +317,46 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreamsBase return crc; } + // Same as Process64BytesCRC, but just interleaved for 2 streams. + ABSL_ATTRIBUTE_ALWAYS_INLINE void Process64BytesCRC2Streams( + const uint8_t* p0, const uint8_t* p1, uint64_t* crc) const { + uint64_t crc0 = crc[0]; + uint64_t crc1 = crc[1]; + for (int i = 0; i < 8; i++) { + crc0 = CRC32_u64(static_cast(crc0), + absl::little_endian::Load64(p0)); + crc1 = CRC32_u64(static_cast(crc1), + absl::little_endian::Load64(p1)); + p0 += 8; + p1 += 8; + } + crc[0] = crc0; + crc[1] = crc1; + } + + // Same as Process64BytesCRC, but just interleaved for 3 streams. + ABSL_ATTRIBUTE_ALWAYS_INLINE void Process64BytesCRC3Streams( + const uint8_t* p0, const uint8_t* p1, const uint8_t* p2, + uint64_t* crc) const { + uint64_t crc0 = crc[0]; + uint64_t crc1 = crc[1]; + uint64_t crc2 = crc[2]; + for (int i = 0; i < 8; i++) { + crc0 = CRC32_u64(static_cast(crc0), + absl::little_endian::Load64(p0)); + crc1 = CRC32_u64(static_cast(crc1), + absl::little_endian::Load64(p1)); + crc2 = CRC32_u64(static_cast(crc2), + absl::little_endian::Load64(p2)); + p0 += 8; + p1 += 8; + p2 += 8; + } + crc[0] = crc0; + crc[1] = crc1; + crc[2] = crc2; + } + // Constants generated by './scripts/gen-crc-consts.py x86_pclmul // crc32_lsb_0x82f63b78' from the Linux kernel. alignas(16) static constexpr uint64_t kFoldAcross512Bits[2] = { @@ -350,7 +390,8 @@ template = 1 && num_crc_streams <= kMaxStreams, "Invalid number of crc streams"); static_assert(num_pclmul_streams >= 0 && num_pclmul_streams <= kMaxStreams, @@ -360,47 +401,15 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreams uint32_t l = *crc; uint64_t l64; - // We have dedicated instruction for 1,2,4 and 8 bytes. - if (length & 8) { - ABSL_INTERNAL_STEP8(l, p); - length &= ~size_t{8}; - } - if (length & 4) { - ABSL_INTERNAL_STEP4(l, p); - length &= ~size_t{4}; - } - if (length & 2) { - ABSL_INTERNAL_STEP2(l, p); - length &= ~size_t{2}; - } - if (length & 1) { - ABSL_INTERNAL_STEP1(l, p); - length &= ~size_t{1}; - } - if (length == 0) { - *crc = l; - return; - } - // length is now multiple of 16. - // For small blocks just run simple loop, because cost of combining multiple // streams is significant. - if (strategy != CutoffStrategy::Unroll64CRC) { - if (length < kSmallCutoff) { - while (length >= 16) { - ABSL_INTERNAL_STEP8(l, p); - ABSL_INTERNAL_STEP8(l, p); - length -= 16; - } - *crc = l; - return; - } - } - - // For medium blocks we run 3 crc streams and combine them as described in - // Intel paper above. Running 4th stream doesn't help, because crc - // instruction has latency 3 and throughput 1. - if (length < kMediumCutoff) { + if (strategy != CutoffStrategy::Unroll64CRC && (length < kSmallCutoff)) { + // fallthrough; Use the same strategy as we do for processing the + // remaining bytes after any other strategy. + } else if (length < kMediumCutoff) { + // For medium blocks we run 3 crc streams and combine them as described in + // Intel paper above. Running 4th stream doesn't help, because crc + // instruction has latency 3 and throughput 1. l64 = l; if (strategy == CutoffStrategy::Fold3) { uint64_t l641 = 0; @@ -449,6 +458,7 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreams p += 64; } } + l = static_cast(l64); } else { // There is a lot of data, we can ignore combine costs and run all // requested streams (num_crc_streams + num_pclmul_streams), @@ -482,9 +492,19 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreams uint64_t l64_pclmul[kMaxStreams] = {0}; // Peel first iteration, because PCLMULQDQ stream, needs setup. - for (size_t i = 0; i < num_crc_streams; i++) { - l64_crc[i] = Process64BytesCRC(crc_streams[i], l64_crc[i]); - crc_streams[i] += 16 * 4; + if (num_crc_streams == 1) { + l64_crc[0] = Process64BytesCRC(crc_streams[0], l64_crc[0]); + crc_streams[0] += 16 * 4; + } else if (num_crc_streams == 2) { + Process64BytesCRC2Streams(crc_streams[0], crc_streams[1], l64_crc); + crc_streams[0] += 16 * 4; + crc_streams[1] += 16 * 4; + } else { + Process64BytesCRC3Streams(crc_streams[0], crc_streams[1], + crc_streams[2], l64_crc); + crc_streams[0] += 16 * 4; + crc_streams[1] += 16 * 4; + crc_streams[2] += 16 * 4; } V128 partialCRC[kMaxStreams][4]; @@ -522,24 +542,28 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreams // } // But unrolling and interleaving PCLMULQDQ and CRC blocks manually // gives ~2% performance boost. - l64_crc[0] = Process64BytesCRC(crc_streams[0], l64_crc[0]); - crc_streams[0] += 16 * 4; + if (num_crc_streams == 1) { + l64_crc[0] = Process64BytesCRC(crc_streams[0], l64_crc[0]); + crc_streams[0] += 16 * 4; + } else if (num_crc_streams == 2) { + Process64BytesCRC2Streams(crc_streams[0], crc_streams[1], l64_crc); + crc_streams[0] += 16 * 4; + crc_streams[1] += 16 * 4; + } else { + Process64BytesCRC3Streams(crc_streams[0], crc_streams[1], + crc_streams[2], l64_crc); + crc_streams[0] += 16 * 4; + crc_streams[1] += 16 * 4; + crc_streams[2] += 16 * 4; + } if (num_pclmul_streams > 0) { Process64BytesPclmul(pclmul_streams[0], partialCRC[0]); pclmul_streams[0] += 16 * 4; } - if (num_crc_streams > 1) { - l64_crc[1] = Process64BytesCRC(crc_streams[1], l64_crc[1]); - crc_streams[1] += 16 * 4; - } if (num_pclmul_streams > 1) { Process64BytesPclmul(pclmul_streams[1], partialCRC[1]); pclmul_streams[1] += 16 * 4; } - if (num_crc_streams > 2) { - l64_crc[2] = Process64BytesCRC(crc_streams[2], l64_crc[2]); - crc_streams[2] += 16 * 4; - } if (num_pclmul_streams > 2) { Process64BytesPclmul(pclmul_streams[2], partialCRC[2]); pclmul_streams[2] += 16 * 4; @@ -571,15 +595,26 @@ class CRC32AcceleratedX86ARMCombinedMultipleStreams } else { p = crc_streams[num_crc_streams - 1]; } + l = static_cast(l64); } - l = static_cast(l64); + uint64_t remaining_bytes = static_cast(e - p); + // Process the remaining bytes. while ((e - p) >= 16) { ABSL_INTERNAL_STEP8(l, p); ABSL_INTERNAL_STEP8(l, p); } - // Process the last few bytes - while (p != e) { + + if (remaining_bytes & 8) { + ABSL_INTERNAL_STEP8(l, p); + } + if (remaining_bytes & 4) { + ABSL_INTERNAL_STEP4(l, p); + } + if (remaining_bytes & 2) { + ABSL_INTERNAL_STEP2(l, p); + } + if (remaining_bytes & 1) { ABSL_INTERNAL_STEP1(l, p); } @@ -605,6 +640,8 @@ CRCImpl* TryNewCRC32AcceleratedX86ARMCombined() { case CpuType::kAmdRome: case CpuType::kAmdNaples: case CpuType::kAmdMilan: + case CpuType::kAmdGenoa: + case CpuType::kAmdTurin: return new CRC32AcceleratedX86ARMCombinedMultipleStreams< 3, 1, CutoffStrategy::Fold3>(); // PCLMULQDQ is fast, use combined PCLMULQDQ + CRC implementation. @@ -612,6 +649,10 @@ CRCImpl* TryNewCRC32AcceleratedX86ARMCombined() { case CpuType::kIntelSkylakeXeon: case CpuType::kIntelBroadwell: case CpuType::kIntelSkylake: + case CpuType::kIntelIcelake: + case CpuType::kIntelSapphirerapids: + case CpuType::kIntelEmeraldrapids: + case CpuType::kIntelGraniterapidsap: return new CRC32AcceleratedX86ARMCombinedMultipleStreams< 3, 2, CutoffStrategy::Fold3>(); // PCLMULQDQ is slow, don't use it. @@ -623,6 +664,7 @@ CRCImpl* TryNewCRC32AcceleratedX86ARMCombined() { case CpuType::kArmNeoverseN1: case CpuType::kArmNeoverseN2: case CpuType::kArmNeoverseV1: + case CpuType::kArmNeoverseN3: return new CRC32AcceleratedX86ARMCombinedMultipleStreams< 1, 1, CutoffStrategy::Unroll64CRC>(); case CpuType::kAmpereSiryn: diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h b/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h index 9e5ccfc49d..a0d2f087a7 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +// SKIP_ABSL_INLINE_NAMESPACE_CHECK + #ifndef ABSL_CRC_INTERNAL_NON_TEMPORAL_ARM_INTRINSICS_H_ #define ABSL_CRC_INTERNAL_NON_TEMPORAL_ARM_INTRINSICS_H_ @@ -21,7 +23,7 @@ #include typedef int64x2_t __m128i; /* 128-bit vector containing integers */ -#define vreinterpretq_m128i_s32(x) vreinterpretq_s64_s32(x) +#define vreinterpretq_m128i_s64(x) (x) #define vreinterpretq_s64_m128i(x) (x) // Guarantees that every preceding store is globally visible before any @@ -44,7 +46,7 @@ static inline __attribute__((always_inline)) void _mm_sfence(void) { // https://msdn.microsoft.com/zh-cn/library/f4k12ae8(v=vs.90).aspx static inline __attribute__((always_inline)) __m128i _mm_loadu_si128( const __m128i *p) { - return vreinterpretq_m128i_s32(vld1q_s32((const int32_t *)p)); + return vreinterpretq_m128i_s64(vld1q_s64((const int64_t*)p)); } // Stores the data in a to the address p without polluting the caches. If the diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/BUILD.bazel b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/BUILD.bazel index cd0f1dea8d..7cc053e783 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/BUILD.bazel +++ b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/BUILD.bazel @@ -14,6 +14,9 @@ # limitations under the License. # +load("@rules_cc//cc:cc_binary.bzl", "cc_binary") +load("@rules_cc//cc:cc_library.bzl", "cc_library") +load("@rules_cc//cc:cc_test.bzl", "cc_test") load( "//absl:copts/configure_copts.bzl", "ABSL_DEFAULT_COPTS", @@ -55,6 +58,7 @@ cc_library( "//absl/base:config", "//absl/base:core_headers", "//absl/base:dynamic_annotations", + "//absl/base:malloc_internal", "//absl/base:raw_logging_internal", ], ) @@ -68,6 +72,7 @@ cc_test( ":stacktrace", "//absl/base:config", "//absl/base:core_headers", + "//absl/base:errno_saver", "//absl/types:span", "@googletest//:gtest", "@googletest//:gtest_main", diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/BUILD.gn b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/BUILD.gn index a1939b6779..adfdddf0f1 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/BUILD.gn +++ b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/BUILD.gn @@ -25,6 +25,7 @@ absl_source_set("stacktrace") { "//third_party/abseil-cpp/absl/base:config", "//third_party/abseil-cpp/absl/base:core_headers", "//third_party/abseil-cpp/absl/base:dynamic_annotations", + "//third_party/abseil-cpp/absl/base:malloc_internal", "//third_party/abseil-cpp/absl/base:raw_logging_internal", ] } @@ -35,6 +36,7 @@ absl_test("stacktrace_test") { ":stacktrace", "//third_party/abseil-cpp/absl/base:config", "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/base:errno_saver", "//third_party/abseil-cpp/absl/types:span", ] } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/CMakeLists.txt b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/CMakeLists.txt index 60b138a539..d8249fed50 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/CMakeLists.txt +++ b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/CMakeLists.txt @@ -42,6 +42,7 @@ absl_cc_library( absl::config absl::core_headers absl::dynamic_annotations + absl::malloc_internal absl::raw_logging_internal PUBLIC ) @@ -57,6 +58,7 @@ absl_cc_test( absl::stacktrace absl::config absl::core_headers + absl::errno_saver absl::span GTest::gmock_main ) diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h index 1fac29c52b..c8a103669c 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h @@ -32,10 +32,10 @@ #error ABSL_HAVE_ELF_MEM_IMAGE cannot be directly set #endif -#if defined(__ELF__) && !defined(__OpenBSD__) && !defined(__QNX__) && \ - !defined(__native_client__) && !defined(__asmjs__) && \ - !defined(__wasm__) && !defined(__HAIKU__) && !defined(__sun) && \ - !defined(__VXWORKS__) && !defined(__hexagon__) && !defined(__XTENSA__) +#if defined(__ELF__) && !defined(__OpenBSD__) && !defined(__QNX__) && \ + !defined(__asmjs__) && !defined(__wasm__) && !defined(__HAIKU__) && \ + !defined(__sun) && !defined(__VXWORKS__) && !defined(__hexagon__) && \ + !defined(__XTENSA__) #define ABSL_HAVE_ELF_MEM_IMAGE 1 #endif diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc index 1746b5d4c3..bbdce77f85 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc @@ -123,7 +123,7 @@ static void **NextStackFrame(void **old_frame_pointer, const void *uc, // earlier in the stack than the old_frame_pointer, then use it. If it is // later, then we have already unwound through it and it needs no special // handling. - if (pre_signal_frame_pointer >= old_frame_pointer) { + if (pre_signal_frame_pointer > old_frame_pointer) { new_frame_pointer = pre_signal_frame_pointer; } } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc index 2f39c70506..9f8700605a 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc @@ -52,13 +52,6 @@ static std::atomic disable_stacktraces(true); // Disabled until healthy. // Waiting until static initializers run seems to be late enough. // This file is included into stacktrace.cc so this will only run once. ABSL_ATTRIBUTE_UNUSED static int stacktraces_enabler = []() { - // Check if we can even create stacktraces. If not, bail early and leave - // disable_stacktraces set as-is. - // clang-format off - if (!EM_ASM_INT({ return (typeof wasmOffsetConverter !== 'undefined'); })) { - return 0; - } - // clang-format on disable_stacktraces.store(false, std::memory_order_relaxed); return 0; }(); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc index f9919c6156..7ae7fefad8 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc @@ -162,7 +162,8 @@ static int UnwindImpl(void **result, uintptr_t *frames, int *sizes, absl::debugging_internal::StripPointerMetadata(frame_pointer); } if (sizes != nullptr) { - sizes[n] = ComputeStackFrameSize(frame_pointer, next_frame_pointer); + sizes[n] = static_cast( + ComputeStackFrameSize(frame_pointer, next_frame_pointer)); } } n++; diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/symbolize.h b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/symbolize.h index 5593fde6b4..509f4267c8 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/internal/symbolize.h @@ -28,8 +28,8 @@ #ifdef ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE #error ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE cannot be directly set -#elif defined(__ELF__) && defined(__GLIBC__) && !defined(__native_client__) \ - && !defined(__asmjs__) && !defined(__wasm__) +#elif defined(__ELF__) && defined(__GLIBC__) && !defined(__asmjs__) \ + && !defined(__wasm__) #define ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE 1 #include diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/stacktrace.cc b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/stacktrace.cc index ccecff766e..67df814c5e 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/stacktrace.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/stacktrace.cc @@ -38,40 +38,19 @@ #include #include +#include #include #include +#include #include "absl/base/attributes.h" #include "absl/base/config.h" +#include "absl/base/internal/low_level_alloc.h" #include "absl/base/optimization.h" #include "absl/base/port.h" #include "absl/debugging/internal/stacktrace_config.h" -#ifdef ABSL_INTERNAL_HAVE_ALLOCA -#error ABSL_INTERNAL_HAVE_ALLOCA cannot be directly set -#endif - -#ifdef _WIN32 -#include -#define ABSL_INTERNAL_HAVE_ALLOCA 1 -#else -#ifdef __has_include -#if __has_include() -#include -#define ABSL_INTERNAL_HAVE_ALLOCA 1 -#elif !defined(alloca) -static void* alloca(size_t) noexcept { return nullptr; } -#endif -#endif -#endif - -#ifdef ABSL_INTERNAL_HAVE_ALLOCA -static constexpr bool kHaveAlloca = true; -#else -static constexpr bool kHaveAlloca = false; -#endif - #if defined(ABSL_STACKTRACE_INL_HEADER) #include ABSL_STACKTRACE_INL_HEADER #else @@ -100,18 +79,60 @@ ABSL_ATTRIBUTE_ALWAYS_INLINE inline int Unwind(void** result, uintptr_t* frames, int* sizes, size_t max_depth, int skip_count, const void* uc, int* min_dropped_frames) { + static constexpr size_t kMinPageSize = 4096; + + // Allow up to ~half a page, leaving some slack space for local variables etc. + static constexpr size_t kMaxStackElements = + (kMinPageSize / 2) / (sizeof(*frames) + sizeof(*sizes)); + + // Allocate a buffer dynamically, using the signal-safe allocator. + static constexpr auto allocate = [](size_t num_bytes) -> void* { + base_internal::InitSigSafeArena(); + return base_internal::LowLevelAlloc::AllocWithArena( + num_bytes, base_internal::SigSafeArena()); + }; + + uintptr_t frames_stackbuf[kMaxStackElements]; + int sizes_stackbuf[kMaxStackElements]; + + // We only need to free the buffers if we allocated them with the signal-safe + // allocator. + bool must_free_frames = false; + bool must_free_sizes = false; + bool unwind_with_fixup = internal_stacktrace::ShouldFixUpStack(); + +#ifdef _WIN32 if (unwind_with_fixup) { - if constexpr (kHaveAlloca) { - // Some implementations of FixUpStack may need to be passed frame - // information from Unwind, even if the caller doesn't need that - // information. We allocate the necessary buffers for such implementations - // here. - if (frames == nullptr) { - frames = static_cast(alloca(max_depth * sizeof(*frames))); + // TODO(b/434184677): Fixups are flaky and not supported on Windows + unwind_with_fixup = false; +#ifndef NDEBUG + abort(); +#endif + } +#endif + + if (unwind_with_fixup) { + // Some implementations of FixUpStack may need to be passed frame + // information from Unwind, even if the caller doesn't need that + // information. We allocate the necessary buffers for such implementations + // here. + + if (frames == nullptr) { + if (max_depth <= std::size(frames_stackbuf)) { + frames = frames_stackbuf; + } else { + frames = static_cast(allocate(max_depth * sizeof(*frames))); + must_free_frames = true; } - if (sizes == nullptr) { - sizes = static_cast(alloca(max_depth * sizeof(*sizes))); + } + + if (sizes == nullptr) { + if (max_depth <= std::size(sizes_stackbuf)) { + sizes = sizes_stackbuf; + } else { + sizes = static_cast(allocate(max_depth * sizeof(*sizes))); + must_free_sizes = true; } } } @@ -140,6 +161,15 @@ ABSL_ATTRIBUTE_ALWAYS_INLINE inline int Unwind(void** result, uintptr_t* frames, if (unwind_with_fixup) { internal_stacktrace::FixUpStack(result, frames, sizes, max_depth, size); } + + if (must_free_sizes) { + base_internal::LowLevelAlloc::Free(sizes); + } + + if (must_free_frames) { + base_internal::LowLevelAlloc::Free(frames); + } + ABSL_BLOCK_TAIL_CALL_OPTIMIZATION(); return static_cast(size); } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc index f6da0ac202..5756325a45 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc @@ -26,33 +26,20 @@ extern "C" { const char* emscripten_pc_get_function(const void* pc); +void* emscripten_stack_snapshot(); } -// clang-format off -EM_JS(bool, HaveOffsetConverter, (), - { return typeof wasmOffsetConverter !== 'undefined'; }); -// clang-format on - namespace absl { ABSL_NAMESPACE_BEGIN -void InitializeSymbolizer(const char*) { - if (!HaveOffsetConverter()) { - ABSL_RAW_LOG(INFO, - "Symbolization unavailable. Rebuild with -sWASM=1 " - "and -sUSE_OFFSET_CONVERTER=1."); - } -} +void InitializeSymbolizer(const char*) {} bool Symbolize(const void* pc, char* out, int out_size) { - // Check if we have the offset converter necessary for pc_get_function. - // Without it, the program will abort(). - if (!HaveOffsetConverter()) { - return false; - } if (pc == nullptr || out_size <= 0) { return false; } + // Need to capture a snapshot first. + emscripten_stack_snapshot(); const char* func_name = emscripten_pc_get_function(pc); if (func_name == nullptr) { return false; diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc index 589890f31e..eaeefb9863 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc @@ -15,7 +15,6 @@ // See "Retrieving Symbol Information by Address": // https://msdn.microsoft.com/en-us/library/windows/desktop/ms680578(v=vs.85).aspx -#include #include #include @@ -58,10 +57,9 @@ void InitializeSymbolizer(const char*) { // NTSTATUS (0xC0000004), which can happen when a module load occurs during // the SymInitialize call. In this case, we should try calling SymInitialize // again. + constexpr DWORD kStatusInfoLengthMismatch = DWORD{0xC0000004}; syminitialize_error = GetLastError(); - // Both NTSTATUS and DWORD are 32-bit numbers, which makes the cast safe. - if (syminitialize_error != - static_cast(STATUS_INFO_LENGTH_MISMATCH)) { + if (syminitialize_error != kStatusInfoLengthMismatch) { break; } } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/flags/BUILD.bazel b/naiveproxy/src/third_party/abseil-cpp/absl/flags/BUILD.bazel index 532721d23f..f928609a9b 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/flags/BUILD.bazel +++ b/naiveproxy/src/third_party/abseil-cpp/absl/flags/BUILD.bazel @@ -168,6 +168,7 @@ cc_library( linkopts = ABSL_DEFAULT_LINKOPTS, visibility = [ "//absl/flags:__pkg__", + "//absl/flags/rust:__pkg__", ], deps = [ ":commandlineflag", diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/flags/declare.h b/naiveproxy/src/third_party/abseil-cpp/absl/flags/declare.h index 8d2a856e3b..a0b12bb51e 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/flags/declare.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/flags/declare.h @@ -59,10 +59,19 @@ ABSL_NAMESPACE_END // Internal implementation of ABSL_DECLARE_FLAG to allow macro expansion of its // arguments. Clients must use ABSL_DECLARE_FLAG instead. +// +// The non-MSVC implementation declares the flag twice. This is to allow +// applying attributes to the second declaration. However, this causes a +// compile error (C4273) in MSVC if a `__declspec` is prepended to the macro. +#if defined(_MSC_VER) +#define ABSL_DECLARE_FLAG_INTERNAL(type, name) \ + extern absl::Flag FLAGS_##name +#else #define ABSL_DECLARE_FLAG_INTERNAL(type, name) \ extern absl::Flag FLAGS_##name; \ namespace absl /* block flags in namespaces */ {} \ /* second redeclaration is to allow applying attributes */ \ extern absl::Flag FLAGS_##name +#endif // _MSC_VER #endif // ABSL_FLAGS_DECLARE_H_ diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h b/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h index daef4e354c..e2c4c82fed 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h @@ -58,7 +58,7 @@ class FlagStateInterface { virtual ~FlagStateInterface(); // Restores the flag originated this object to the saved state. - virtual void Restore() const = 0; + virtual void Restore() && = 0; }; } // namespace flags_internal diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/flag.cc b/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/flag.cc index 37f6ef1e9d..8e894250b7 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/flag.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/flag.cc @@ -26,6 +26,7 @@ #include #include #include +#include #include #include "absl/base/attributes.h" @@ -73,8 +74,8 @@ bool ShouldValidateFlagValue(FlagFastTypeId flag_type_id) { // need to acquire these locks themselves. class MutexRelock { public: - explicit MutexRelock(absl::Mutex& mu) : mu_(mu) { mu_.Unlock(); } - ~MutexRelock() { mu_.Lock(); } + explicit MutexRelock(absl::Mutex& mu) : mu_(mu) { mu_.unlock(); } + ~MutexRelock() { mu_.lock(); } MutexRelock(const MutexRelock&) = delete; MutexRelock& operator=(const MutexRelock&) = delete; @@ -88,9 +89,9 @@ class MutexRelock { // we move the memory to the freelist where it lives indefinitely, so it can // still be safely accessed. This also prevents leak checkers from complaining // about the leaked memory that can no longer be accessed through any pointer. -absl::Mutex* FreelistMutex() { +absl::Mutex& FreelistMutex() { static absl::NoDestructor mutex; - return mutex.get(); + return *mutex; } ABSL_CONST_INIT std::vector* s_freelist ABSL_GUARDED_BY(FreelistMutex()) ABSL_PT_GUARDED_BY(FreelistMutex()) = nullptr; @@ -139,8 +140,8 @@ class FlagState : public flags_internal::FlagStateInterface { friend class FlagImpl; // Restores the flag to the saved state. - void Restore() const override { - if (!flag_impl_.RestoreState(*this)) return; + void Restore() && override { + if (!std::move(flag_impl_).RestoreState(*this)) return; ABSL_INTERNAL_LOG(INFO, absl::StrCat("Restore saved value of ", flag_impl_.Name(), @@ -248,12 +249,12 @@ void FlagImpl::Init() { seq_lock_.MarkInitialized(); } -absl::Mutex* FlagImpl::DataGuard() const { +absl::Mutex& FlagImpl::DataGuard() const { absl::call_once(const_cast(this)->init_control_, &FlagImpl::Init, const_cast(this)); // data_guard_ is initialized inside Init. - return reinterpret_cast(&data_guard_); + return *reinterpret_cast(&data_guard_); } void FlagImpl::AssertValidType(FlagFastTypeId rhs_type_id, @@ -375,7 +376,7 @@ std::string FlagImpl::DefaultValue() const { } std::string FlagImpl::CurrentValue() const { - auto* guard = DataGuard(); // Make sure flag initialized + auto& guard = DataGuard(); // Make sure flag initialized switch (ValueStorageKind()) { case FlagValueStorageKind::kValueAndInitBit: case FlagValueStorageKind::kOneWordAtomic: { @@ -429,8 +430,8 @@ void FlagImpl::InvokeCallback() const { // and it also can be different by the time the callback invocation is // completed. Requires that *primary_lock be held in exclusive mode; it may be // released and reacquired by the implementation. - MutexRelock relock(*DataGuard()); - absl::MutexLock lock(&callback_->guard); + MutexRelock relock(DataGuard()); + absl::MutexLock lock(callback_->guard); cb(); } @@ -535,7 +536,7 @@ std::unique_ptr FlagImpl::TryParse( } void FlagImpl::Read(void* dst) const { - auto* guard = DataGuard(); // Make sure flag initialized + auto& guard = DataGuard(); // Make sure flag initialized switch (ValueStorageKind()) { case FlagValueStorageKind::kValueAndInitBit: case FlagValueStorageKind::kOneWordAtomic: { @@ -567,14 +568,14 @@ void FlagImpl::Read(void* dst) const { int64_t FlagImpl::ReadOneWord() const { assert(ValueStorageKind() == FlagValueStorageKind::kOneWordAtomic || ValueStorageKind() == FlagValueStorageKind::kValueAndInitBit); - auto* guard = DataGuard(); // Make sure flag initialized + auto& guard = DataGuard(); // Make sure flag initialized (void)guard; return OneWordValue().load(std::memory_order_acquire); } bool FlagImpl::ReadOneBool() const { assert(ValueStorageKind() == FlagValueStorageKind::kValueAndInitBit); - auto* guard = DataGuard(); // Make sure flag initialized + auto& guard = DataGuard(); // Make sure flag initialized (void)guard; return absl::bit_cast>( OneWordValue().load(std::memory_order_acquire)) diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/flag.h b/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/flag.h index b61a24737f..cab9d16990 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/flag.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/flag.h @@ -601,17 +601,17 @@ class FlagImpl final : public CommandLineFlag { data_guard_{} {} // Constant access methods - int64_t ReadOneWord() const ABSL_LOCKS_EXCLUDED(*DataGuard()); - bool ReadOneBool() const ABSL_LOCKS_EXCLUDED(*DataGuard()); - void Read(void* dst) const override ABSL_LOCKS_EXCLUDED(*DataGuard()); - void Read(bool* value) const ABSL_LOCKS_EXCLUDED(*DataGuard()) { + int64_t ReadOneWord() const ABSL_LOCKS_EXCLUDED(DataGuard()); + bool ReadOneBool() const ABSL_LOCKS_EXCLUDED(DataGuard()); + void Read(void* dst) const override ABSL_LOCKS_EXCLUDED(DataGuard()); + void Read(bool* value) const ABSL_LOCKS_EXCLUDED(DataGuard()) { *value = ReadOneBool(); } template () == FlagValueStorageKind::kOneWordAtomic, int> = 0> - void Read(T* value) const ABSL_LOCKS_EXCLUDED(*DataGuard()) { + void Read(T* value) const ABSL_LOCKS_EXCLUDED(DataGuard()) { int64_t v = ReadOneWord(); std::memcpy(value, static_cast(&v), sizeof(T)); } @@ -619,17 +619,17 @@ class FlagImpl final : public CommandLineFlag { typename std::enable_if() == FlagValueStorageKind::kValueAndInitBit, int>::type = 0> - void Read(T* value) const ABSL_LOCKS_EXCLUDED(*DataGuard()) { + void Read(T* value) const ABSL_LOCKS_EXCLUDED(DataGuard()) { *value = absl::bit_cast>(ReadOneWord()).value; } // Mutating access methods - void Write(const void* src) ABSL_LOCKS_EXCLUDED(*DataGuard()); + void Write(const void* src) ABSL_LOCKS_EXCLUDED(DataGuard()); // Interfaces to operate on callbacks. void SetCallback(const FlagCallbackFunc mutation_callback) - ABSL_LOCKS_EXCLUDED(*DataGuard()); - void InvokeCallback() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard()); + ABSL_LOCKS_EXCLUDED(DataGuard()); + void InvokeCallback() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(DataGuard()); // Used in read/write operations to validate source/target has correct type. // For example if flag is declared as absl::Flag FLAGS_foo, a call to @@ -646,11 +646,11 @@ class FlagImpl final : public CommandLineFlag { friend class FlagState; // Ensures that `data_guard_` is initialized and returns it. - absl::Mutex* DataGuard() const + absl::Mutex& DataGuard() const ABSL_LOCK_RETURNED(reinterpret_cast(data_guard_)); // Returns heap allocated value of type T initialized with default value. std::unique_ptr MakeInitValue() const - ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard()); + ABSL_EXCLUSIVE_LOCKS_REQUIRED(DataGuard()); // Flag initialization called via absl::call_once. void Init(); @@ -676,16 +676,15 @@ class FlagImpl final : public CommandLineFlag { // returns new value. Otherwise returns nullptr. std::unique_ptr TryParse(absl::string_view value, std::string& err) const - ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard()); + ABSL_EXCLUSIVE_LOCKS_REQUIRED(DataGuard()); // Stores the flag value based on the pointer to the source. void StoreValue(const void* src, ValueSource source) - ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard()); + ABSL_EXCLUSIVE_LOCKS_REQUIRED(DataGuard()); // Copy the flag data, protected by `seq_lock_` into `dst`. // // REQUIRES: ValueStorageKind() == kSequenceLocked. - void ReadSequenceLockedData(void* dst) const - ABSL_LOCKS_EXCLUDED(*DataGuard()); + void ReadSequenceLockedData(void* dst) const ABSL_LOCKS_EXCLUDED(DataGuard()); FlagHelpKind HelpSourceKind() const { return static_cast(help_source_kind_); @@ -694,7 +693,7 @@ class FlagImpl final : public CommandLineFlag { return static_cast(value_storage_kind_); } FlagDefaultKind DefaultKind() const - ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard()) { + ABSL_EXCLUSIVE_LOCKS_REQUIRED(DataGuard()) { return static_cast(def_kind_); } @@ -705,30 +704,30 @@ class FlagImpl final : public CommandLineFlag { std::string Help() const override; FlagFastTypeId TypeId() const override; bool IsSpecifiedOnCommandLine() const override - ABSL_LOCKS_EXCLUDED(*DataGuard()); - std::string DefaultValue() const override ABSL_LOCKS_EXCLUDED(*DataGuard()); - std::string CurrentValue() const override ABSL_LOCKS_EXCLUDED(*DataGuard()); + ABSL_LOCKS_EXCLUDED(DataGuard()); + std::string DefaultValue() const override ABSL_LOCKS_EXCLUDED(DataGuard()); + std::string CurrentValue() const override ABSL_LOCKS_EXCLUDED(DataGuard()); bool ValidateInputValue(absl::string_view value) const override - ABSL_LOCKS_EXCLUDED(*DataGuard()); + ABSL_LOCKS_EXCLUDED(DataGuard()); void CheckDefaultValueParsingRoundtrip() const override - ABSL_LOCKS_EXCLUDED(*DataGuard()); + ABSL_LOCKS_EXCLUDED(DataGuard()); - int64_t ModificationCount() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard()); + int64_t ModificationCount() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(DataGuard()); // Interfaces to save and restore flags to/from persistent state. // Returns current flag state or nullptr if flag does not support // saving and restoring a state. std::unique_ptr SaveState() override - ABSL_LOCKS_EXCLUDED(*DataGuard()); + ABSL_LOCKS_EXCLUDED(DataGuard()); // Restores the flag state to the supplied state object. If there is // nothing to restore returns false. Otherwise returns true. bool RestoreState(const FlagState& flag_state) - ABSL_LOCKS_EXCLUDED(*DataGuard()); + ABSL_LOCKS_EXCLUDED(DataGuard()); bool ParseFrom(absl::string_view value, FlagSettingMode set_mode, ValueSource source, std::string& error) override - ABSL_LOCKS_EXCLUDED(*DataGuard()); + ABSL_LOCKS_EXCLUDED(DataGuard()); // Immutable flag's state. @@ -758,9 +757,9 @@ class FlagImpl final : public CommandLineFlag { // locks. uint8_t def_kind_ : 2; // Has this flag's value been modified? - bool modified_ : 1 ABSL_GUARDED_BY(*DataGuard()); + bool modified_ : 1 ABSL_GUARDED_BY(DataGuard()); // Has this flag been specified on command line. - bool on_command_line_ : 1 ABSL_GUARDED_BY(*DataGuard()); + bool on_command_line_ : 1 ABSL_GUARDED_BY(DataGuard()); // Unique tag for absl::call_once call to initialize this flag. absl::once_flag init_control_; @@ -769,7 +768,7 @@ class FlagImpl final : public CommandLineFlag { flags_internal::SequenceLock seq_lock_; // Optional flag's callback and absl::Mutex to guard the invocations. - FlagCallback* callback_ ABSL_GUARDED_BY(*DataGuard()); + FlagCallback* callback_ ABSL_GUARDED_BY(DataGuard()); // Either a pointer to the function generating the default value based on the // value specified in ABSL_FLAG or pointer to the dynamically set default // value via SetCommandLineOptionWithMode. def_kind_ is used to distinguish diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/program_name.cc b/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/program_name.cc index fb06643df5..23185c626a 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/program_name.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/program_name.cc @@ -29,9 +29,9 @@ namespace absl { ABSL_NAMESPACE_BEGIN namespace flags_internal { -static absl::Mutex* ProgramNameMutex() { +static absl::Mutex& ProgramNameMutex() { static absl::NoDestructor mutex; - return mutex.get(); + return *mutex; } ABSL_CONST_INIT static std::string* program_name ABSL_GUARDED_BY( ProgramNameMutex()) ABSL_PT_GUARDED_BY(ProgramNameMutex()) = nullptr; diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/usage.cc b/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/usage.cc index fc68b03db2..3c44271a70 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/usage.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/flags/internal/usage.cc @@ -434,9 +434,9 @@ HelpMode HandleUsageFlags(std::ostream& out, namespace { -absl::Mutex* HelpAttributesMutex() { +absl::Mutex& HelpAttributesMutex() { static absl::NoDestructor mutex; - return mutex.get(); + return *mutex; } ABSL_CONST_INIT std::string* match_substr ABSL_GUARDED_BY(HelpAttributesMutex()) ABSL_PT_GUARDED_BY(HelpAttributesMutex()) = nullptr; diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/flags/parse.cc b/naiveproxy/src/third_party/abseil-cpp/absl/flags/parse.cc index c87cacdc7c..df2a179e2a 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/flags/parse.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/flags/parse.cc @@ -64,9 +64,9 @@ ABSL_NAMESPACE_BEGIN namespace flags_internal { namespace { -absl::Mutex* ProcessingChecksMutex() { +absl::Mutex& ProcessingChecksMutex() { static absl::NoDestructor mutex; - return mutex.get(); + return *mutex; } ABSL_CONST_INIT bool flagfile_needs_processing @@ -76,9 +76,9 @@ ABSL_CONST_INIT bool fromenv_needs_processing ABSL_CONST_INIT bool tryfromenv_needs_processing ABSL_GUARDED_BY(ProcessingChecksMutex()) = false; -absl::Mutex* SpecifiedFlagsMutex() { +absl::Mutex& SpecifiedFlagsMutex() { static absl::NoDestructor mutex; - return mutex.get(); + return *mutex; } ABSL_CONST_INIT std::vector* specified_flags diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/flags/reflection.cc b/naiveproxy/src/third_party/abseil-cpp/absl/flags/reflection.cc index b8b4a2ea70..fb64a65394 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/flags/reflection.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/flags/reflection.cc @@ -19,6 +19,7 @@ #include #include +#include #include "absl/base/config.h" #include "absl/base/no_destructor.h" @@ -53,8 +54,11 @@ class FlagRegistry { // Store a flag in this registry. Takes ownership of *flag. void RegisterFlag(CommandLineFlag& flag, const char* filename); - void Lock() ABSL_EXCLUSIVE_LOCK_FUNCTION(lock_) { lock_.Lock(); } - void Unlock() ABSL_UNLOCK_FUNCTION(lock_) { lock_.Unlock(); } + void lock() ABSL_EXCLUSIVE_LOCK_FUNCTION(lock_) { lock_.lock(); } + inline void Lock() ABSL_EXCLUSIVE_LOCK_FUNCTION(lock_) { lock(); } + + void unlock() ABSL_UNLOCK_FUNCTION(lock_) { lock_.unlock(); } + inline void Unlock() ABSL_UNLOCK_FUNCTION(lock_) { unlock(); } // Returns the flag object for the specified name, or nullptr if not found. // Will emit a warning if a 'retired' flag is specified. @@ -87,8 +91,8 @@ namespace { class FlagRegistryLock { public: - explicit FlagRegistryLock(FlagRegistry& fr) : fr_(fr) { fr_.Lock(); } - ~FlagRegistryLock() { fr_.Unlock(); } + explicit FlagRegistryLock(FlagRegistry& fr) : fr_(fr) { fr_.lock(); } + ~FlagRegistryLock() { fr_.unlock(); } private: FlagRegistry& fr_; @@ -317,9 +321,9 @@ class FlagSaverImpl { } // Restores the saved flag states into the flag registry. - void RestoreToRegistry() { + void RestoreToRegistry() && { for (const auto& flag_state : backup_registry_) { - flag_state->Restore(); + std::move(*flag_state).Restore(); } } @@ -337,7 +341,7 @@ FlagSaver::FlagSaver() : impl_(new flags_internal::FlagSaverImpl) { FlagSaver::~FlagSaver() { if (!impl_) return; - impl_->RestoreToRegistry(); + std::move(*impl_).RestoreToRegistry(); delete impl_; } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/flags/usage.cc b/naiveproxy/src/third_party/abseil-cpp/absl/flags/usage.cc index 267a5039f6..e42b454022 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/flags/usage.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/flags/usage.cc @@ -40,7 +40,7 @@ ABSL_CONST_INIT std::string* program_usage_message // -------------------------------------------------------------------- // Sets the "usage" message to be used by help reporting routines. void SetProgramUsageMessage(absl::string_view new_usage_message) { - absl::MutexLock l(&flags_internal::usage_message_guard); + absl::MutexLock l(flags_internal::usage_message_guard); if (flags_internal::program_usage_message != nullptr) { ABSL_INTERNAL_LOG(FATAL, "SetProgramUsageMessage() called twice."); @@ -55,7 +55,7 @@ void SetProgramUsageMessage(absl::string_view new_usage_message) { // Note: We able to return string_view here only because calling // SetProgramUsageMessage twice is prohibited. absl::string_view ProgramUsageMessage() { - absl::MutexLock l(&flags_internal::usage_message_guard); + absl::MutexLock l(flags_internal::usage_message_guard); return flags_internal::program_usage_message != nullptr ? absl::string_view(*flags_internal::program_usage_message) diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/flags/usage_config.cc b/naiveproxy/src/third_party/abseil-cpp/absl/flags/usage_config.cc index 5922c5e20f..bbc020d1f4 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/flags/usage_config.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/flags/usage_config.cc @@ -105,9 +105,9 @@ std::string NormalizeFilename(absl::string_view filename) { // -------------------------------------------------------------------- -absl::Mutex* CustomUsageConfigMutex() { +absl::Mutex& CustomUsageConfigMutex() { static absl::NoDestructor mutex; - return mutex.get(); + return *mutex; } ABSL_CONST_INIT FlagsUsageConfig* custom_usage_config ABSL_GUARDED_BY(CustomUsageConfigMutex()) diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/functional/BUILD.bazel b/naiveproxy/src/third_party/abseil-cpp/absl/functional/BUILD.bazel index c2bb96d7d1..b7aa31f5b0 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/functional/BUILD.bazel +++ b/naiveproxy/src/third_party/abseil-cpp/absl/functional/BUILD.bazel @@ -44,6 +44,7 @@ cc_library( deps = [ "//absl/base:config", "//absl/base:core_headers", + "//absl/base:nullability", "//absl/meta:type_traits", "//absl/utility", ], @@ -61,6 +62,7 @@ cc_test( ":any_invocable", "//absl/base:config", "//absl/base:core_headers", + "//absl/base:nullability", "//absl/meta:type_traits", "//absl/utility", "@googletest//:gtest", @@ -102,8 +104,10 @@ cc_library( linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ ":any_invocable", + "//absl/base:config", "//absl/base:core_headers", "//absl/meta:type_traits", + "//absl/utility", ], ) @@ -115,8 +119,10 @@ cc_test( deps = [ ":any_invocable", ":function_ref", + "//absl/base:config", "//absl/container:test_instance_tracker", "//absl/memory", + "//absl/utility", "@googletest//:gtest", "@googletest//:gtest_main", ], diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/functional/BUILD.gn b/naiveproxy/src/third_party/abseil-cpp/absl/functional/BUILD.gn index 3b5a6d5bb7..ab0bb0d987 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/functional/BUILD.gn +++ b/naiveproxy/src/third_party/abseil-cpp/absl/functional/BUILD.gn @@ -10,6 +10,7 @@ absl_source_set("any_invocable") { deps = [ "//third_party/abseil-cpp/absl/base:config", "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/base:nullability", "//third_party/abseil-cpp/absl/meta:type_traits", "//third_party/abseil-cpp/absl/utility", ] @@ -24,6 +25,7 @@ absl_test("any_invocable_test") { ":any_invocable", "//third_party/abseil-cpp/absl/base:config", "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/base:nullability", "//third_party/abseil-cpp/absl/meta:type_traits", "//third_party/abseil-cpp/absl/utility", ] @@ -44,8 +46,10 @@ absl_source_set("function_ref") { public = [ "function_ref.h" ] deps = [ ":any_invocable", + "//third_party/abseil-cpp/absl/base:config", "//third_party/abseil-cpp/absl/base:core_headers", "//third_party/abseil-cpp/absl/meta:type_traits", + "//third_party/abseil-cpp/absl/utility", ] } @@ -54,8 +58,10 @@ absl_test("function_ref_test") { deps = [ ":any_invocable", ":function_ref", + "//third_party/abseil-cpp/absl/base:config", "//third_party/abseil-cpp/absl/container:test_instance_tracker", "//third_party/abseil-cpp/absl/memory", + "//third_party/abseil-cpp/absl/utility", ] } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/functional/CMakeLists.txt b/naiveproxy/src/third_party/abseil-cpp/absl/functional/CMakeLists.txt index 91939db501..07f3dc0b91 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/functional/CMakeLists.txt +++ b/naiveproxy/src/third_party/abseil-cpp/absl/functional/CMakeLists.txt @@ -24,6 +24,7 @@ absl_cc_library( COPTS ${ABSL_DEFAULT_COPTS} DEPS + absl::base absl::config absl::core_headers absl::type_traits @@ -41,6 +42,7 @@ absl_cc_test( ${ABSL_TEST_COPTS} DEPS absl::any_invocable + absl::base absl::config absl::core_headers absl::type_traits @@ -85,9 +87,11 @@ absl_cc_library( COPTS ${ABSL_DEFAULT_COPTS} DEPS + absl::config absl::core_headers absl::any_invocable absl::meta + absl::utility PUBLIC ) @@ -99,9 +103,11 @@ absl_cc_test( COPTS ${ABSL_TEST_COPTS} DEPS + absl::config absl::function_ref absl::memory absl::test_instance_tracker + absl::utility GTest::gmock_main ) diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/functional/any_invocable.h b/naiveproxy/src/third_party/abseil-cpp/absl/functional/any_invocable.h index 524345d5c0..6dd72b6e36 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/functional/any_invocable.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/functional/any_invocable.h @@ -39,7 +39,9 @@ #include #include +#include "absl/base/attributes.h" #include "absl/base/config.h" +#include "absl/base/nullability.h" #include "absl/functional/internal/any_invocable.h" #include "absl/meta/type_traits.h" #include "absl/utility/utility.h" @@ -158,7 +160,8 @@ ABSL_NAMESPACE_BEGIN // AnyInvocable empty; // empty(); // WARNING: Undefined behavior! template -class AnyInvocable : private internal_any_invocable::Impl { +class ABSL_NULLABILITY_COMPATIBLE ABSL_ATTRIBUTE_OWNER AnyInvocable + : private internal_any_invocable::Impl { private: static_assert( std::is_function::value, @@ -169,6 +172,7 @@ class AnyInvocable : private internal_any_invocable::Impl { public: // The return type of Sig using result_type = typename Impl::result_type; + using absl_internal_is_view = std::false_type; // Constructors diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/functional/function_ref.h b/naiveproxy/src/third_party/abseil-cpp/absl/functional/function_ref.h index f1d087a77a..3882eb056e 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/functional/function_ref.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/functional/function_ref.h @@ -47,12 +47,14 @@ #define ABSL_FUNCTIONAL_FUNCTION_REF_H_ #include -#include #include +#include #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/functional/internal/function_ref.h" #include "absl/meta/type_traits.h" +#include "absl/utility/utility.h" namespace absl { ABSL_NAMESPACE_BEGIN @@ -83,42 +85,80 @@ class FunctionRef; // bool Visitor(absl::FunctionRef // callback); template -class FunctionRef { - private: +class ABSL_ATTRIBUTE_VIEW FunctionRef { + protected: // Used to disable constructors for objects that are not compatible with the // signature of this FunctionRef. - template > + template using EnableIfCompatible = - typename std::enable_if::value || - std::is_convertible::value>::type; + std::enable_if_t::value>; - public: - // Constructs a FunctionRef from any invocable type. - template > - // NOLINTNEXTLINE(runtime/explicit) - FunctionRef(const F& f ABSL_ATTRIBUTE_LIFETIME_BOUND) - : invoker_(&absl::functional_internal::InvokeObject) { + // Internal constructor to supersede the copying constructor + template + // NOLINTNEXTLINE(google-explicit-constructor) + FunctionRef(std::in_place_t, F&& f ABSL_ATTRIBUTE_LIFETIME_BOUND) noexcept + : invoker_(&absl::functional_internal::InvokeObject) { absl::functional_internal::AssertNonNull(f); ptr_.obj = &f; } + public: + // Constructs a FunctionRef from any invocable type. + template >, F&>>> + // NOLINTNEXTLINE(google-explicit-constructor) + FunctionRef(F&& f ABSL_ATTRIBUTE_LIFETIME_BOUND) noexcept + : FunctionRef(std::in_place, std::forward(f)) {} + // Overload for function pointers. This eliminates a level of indirection that // would happen if the above overload was used (it lets us store the pointer // instead of a pointer to a pointer). // // This overload is also used for references to functions, since references to // functions can decay to function pointers implicitly. - template < - typename F, typename = EnableIfCompatible, - absl::functional_internal::EnableIf::value> = 0> - FunctionRef(F* f) // NOLINT(runtime/explicit) + template , + absl::functional_internal::EnableIf> = 0> + // NOLINTNEXTLINE(google-explicit-constructor) + FunctionRef(F* f ABSL_ATTRIBUTE_LIFETIME_BOUND) noexcept : invoker_(&absl::functional_internal::InvokeFunction) { assert(f != nullptr); ptr_.fun = reinterpret_cast(f); } - FunctionRef& operator=(const FunctionRef& rhs) = default; - FunctionRef(const FunctionRef& rhs) = default; +#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L + // Similar to the other overloads, but passes the address of a known callable + // `F` at compile time. This allows calling arbitrary functions while avoiding + // an indirection. + // Needs C++20 as `nontype_t` needs C++20 for `auto` template parameters. + template > + FunctionRef(nontype_t) noexcept // NOLINT(google-explicit-constructor) + : invoker_(&absl::functional_internal::InvokeFunction) {} + + template < + auto F, typename Obj, + typename = EnableIfCompatible&>, + absl::functional_internal::EnableIf> = + 0> + // NOLINTNEXTLINE(google-explicit-constructor) + FunctionRef(nontype_t, Obj&& obj ABSL_ATTRIBUTE_LIFETIME_BOUND) noexcept + : invoker_(&absl::functional_internal::InvokeObject) { + ptr_.obj = std::addressof(obj); + } + + template > + // NOLINTNEXTLINE(google-explicit-constructor) + FunctionRef(nontype_t, Obj* obj ABSL_ATTRIBUTE_LIFETIME_BOUND) noexcept + : invoker_(&absl::functional_internal::InvokePtr) { + ptr_.obj = obj; + } +#endif + + using absl_internal_is_view = std::true_type; // Call the underlying object. R operator()(Args... args) const { @@ -133,11 +173,76 @@ class FunctionRef { // Allow const qualified function signatures. Since FunctionRef requires // constness anyway we can just make this a no-op. template -class FunctionRef : public FunctionRef { +class ABSL_ATTRIBUTE_VIEW + FunctionRef : private FunctionRef { + using Base = FunctionRef; + + template + using EnableIfCompatible = + typename Base::template EnableIfCompatible; + public: - using FunctionRef::FunctionRef; + template < + typename F, + typename = EnableIfCompatible>, const F&>>> + // NOLINTNEXTLINE(google-explicit-constructor) + FunctionRef(const F& f ABSL_ATTRIBUTE_LIFETIME_BOUND) noexcept + : Base(std::in_place_t(), f) {} + + template , + absl::functional_internal::EnableIf> = 0> + // NOLINTNEXTLINE(google-explicit-constructor) + FunctionRef(F* f ABSL_ATTRIBUTE_LIFETIME_BOUND) noexcept : Base(f) {} + +#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L + template > + // NOLINTNEXTLINE(google-explicit-constructor) + FunctionRef(nontype_t arg) noexcept : Base(arg) {} + + template &>, + absl::functional_internal::EnableIf< + !std::is_rvalue_reference_v> = 0> + // NOLINTNEXTLINE(google-explicit-constructor) + FunctionRef(nontype_t arg, + Obj&& obj ABSL_ATTRIBUTE_LIFETIME_BOUND) noexcept + : Base(arg, std::forward(obj)) {} + + template > + // NOLINTNEXTLINE(google-explicit-constructor) + FunctionRef(nontype_t arg, + const Obj* obj ABSL_ATTRIBUTE_LIFETIME_BOUND) noexcept + : Base(arg, obj) {} +#endif + + using absl_internal_is_view = std::true_type; + + using Base::operator(); }; +template +FunctionRef(F*) -> FunctionRef; + +#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L +template +FunctionRef(nontype_t) + -> FunctionRef>; + +template +FunctionRef(nontype_t, U&&) + -> FunctionRef, M>>; + +template +FunctionRef(nontype_t, U&&) -> FunctionRef, std::invoke_result_t()>>; + +template +FunctionRef(nontype_t, U&&) -> FunctionRef; +#endif + ABSL_NAMESPACE_END } // namespace absl diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/functional/internal/any_invocable.h b/naiveproxy/src/third_party/abseil-cpp/absl/functional/internal/any_invocable.h index 167d947d4c..a696fddd86 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/functional/internal/any_invocable.h @@ -66,6 +66,7 @@ #include "absl/base/attributes.h" #include "absl/base/config.h" #include "absl/base/macros.h" +#include "absl/base/nullability.h" #include "absl/base/optimization.h" #include "absl/meta/type_traits.h" #include "absl/utility/utility.h" @@ -75,7 +76,7 @@ ABSL_NAMESPACE_BEGIN // Defined in functional/any_invocable.h template -class AnyInvocable; +class ABSL_NULLABILITY_COMPATIBLE AnyInvocable; namespace internal_any_invocable { diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/functional/internal/function_ref.h b/naiveproxy/src/third_party/abseil-cpp/absl/functional/internal/function_ref.h index 27d45b886d..543b30f6d4 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/functional/internal/function_ref.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/functional/internal/function_ref.h @@ -72,14 +72,52 @@ using Invoker = R (*)(VoidPtr, typename ForwardT::type...); // static_cast handles the case the return type is void. template R InvokeObject(VoidPtr ptr, typename ForwardT::type... args) { - auto o = static_cast(ptr.obj); - return static_cast(std::invoke(*o, std::forward(args)...)); + using T = std::remove_reference_t; + return static_cast(std::invoke( + std::forward(*const_cast(static_cast(ptr.obj))), + std::forward::type>(args)...)); +} + +template +R InvokeObject(VoidPtr ptr, typename ForwardT::type... args) { + using T = std::remove_reference_t; + Obj&& obj = + std::forward(*const_cast(static_cast(ptr.obj))); + // Avoid std::invoke() since the callee is a known function at compile time + if constexpr (std::is_member_function_pointer_v) { + return static_cast((std::forward(obj).*F)( + std::forward::type>(args)...)); + } else { + return static_cast( + F(std::forward(obj), + std::forward::type>(args)...)); + } +} + +template +R InvokePtr(VoidPtr ptr, typename ForwardT::type... args) { + T* obj = const_cast(static_cast(ptr.obj)); + // Avoid std::invoke() since the callee is a known function at compile time + if constexpr (std::is_member_function_pointer_v) { + return static_cast( + (obj->*F)(std::forward::type>(args)...)); + } else { + return static_cast( + F(obj, std::forward::type>(args)...)); + } } template R InvokeFunction(VoidPtr ptr, typename ForwardT::type... args) { auto f = reinterpret_cast(ptr.fun); - return static_cast(std::invoke(f, std::forward(args)...)); + return static_cast( + std::invoke(f, std::forward::type>(args)...)); +} + +template +R InvokeFunction(VoidPtr, typename ForwardT::type... args) { + return static_cast( + F(std::forward::type>(args)...)); } template @@ -98,7 +136,7 @@ template void AssertNonNull(const F&) {} template -void AssertNonNull(F C::*f) { +void AssertNonNull(F C::* f) { assert(f != nullptr); (void)f; } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/hash/internal/hash.cc b/naiveproxy/src/third_party/abseil-cpp/absl/hash/internal/hash.cc index a693d5c1f7..9e43e94cc6 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/hash/internal/hash.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/hash/internal/hash.cc @@ -59,8 +59,7 @@ uint64_t Mix32Bytes(const uint8_t* ptr, uint64_t current_state) { uint64_t duplicated_state2 = current_state; do { - // Always prefetch the next cacheline. - PrefetchToLocalCache(ptr + ABSL_CACHELINE_SIZE); + PrefetchToLocalCache(ptr + 5 * ABSL_CACHELINE_SIZE); uint64_t a = absl::base_internal::UnalignedLoad64(ptr); uint64_t b = absl::base_internal::UnalignedLoad64(ptr + 8); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/hash/internal/hash.h b/naiveproxy/src/third_party/abseil-cpp/absl/hash/internal/hash.h index 8c584b207a..2f91a8beac 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/hash/internal/hash.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/hash/internal/hash.h @@ -88,7 +88,8 @@ #include "absl/types/variant.h" #include "absl/utility/utility.h" -#if defined(__cpp_lib_filesystem) && __cpp_lib_filesystem >= 201703L +#if defined(__cpp_lib_filesystem) && __cpp_lib_filesystem >= 201703L && \ + !defined(__XTENSA__) #include // NOLINT #endif @@ -633,7 +634,8 @@ H AbslHashValue(H hash_state, std::basic_string_view str) { (!defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) || \ __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 130000) && \ (!defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) || \ - __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101500) + __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101500) && \ + (!defined(__XTENSA__)) #define ABSL_INTERNAL_STD_FILESYSTEM_PATH_HASH_AVAILABLE 1 diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/BUILD.bazel b/naiveproxy/src/third_party/abseil-cpp/absl/log/BUILD.bazel index d4b37307de..5bc715023f 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/BUILD.bazel +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/BUILD.bazel @@ -80,6 +80,8 @@ cc_library( ":log", "//absl/base:config", "//absl/base:core_headers", + "//absl/base:nullability", + "//absl/base:nullability_traits_internal", "//absl/strings", ], ) @@ -154,6 +156,7 @@ cc_library( cc_library( name = "log_entry", + srcs = ["log_entry.cc"], hdrs = ["log_entry.h"], copts = ABSL_DEFAULT_COPTS, linkopts = ABSL_DEFAULT_LINKOPTS, @@ -162,6 +165,7 @@ cc_library( "//absl/base:core_headers", "//absl/base:log_severity", "//absl/log/internal:config", + "//absl/log/internal:proto", "//absl/strings", "//absl/time", "//absl/types:span", diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/BUILD.gn b/naiveproxy/src/third_party/abseil-cpp/absl/log/BUILD.gn index 7b7e4e3d1c..cbf0a5571a 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/BUILD.gn +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/BUILD.gn @@ -32,6 +32,8 @@ absl_source_set("die_if_null") { ":log", "//third_party/abseil-cpp/absl/base:config", "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/base:nullability", + "//third_party/abseil-cpp/absl/base:nullability_traits_internal", "//third_party/abseil-cpp/absl/strings", ] } @@ -89,12 +91,15 @@ absl_source_set("log") { } absl_source_set("log_entry") { + sources = [ "log_entry.cc" ] public = [ "log_entry.h" ] deps = [ "//third_party/abseil-cpp/absl/base:config", "//third_party/abseil-cpp/absl/base:core_headers", "//third_party/abseil-cpp/absl/base:log_severity", "//third_party/abseil-cpp/absl/log/internal:config", + "//third_party/abseil-cpp/absl/log/internal:proto", + "//third_party/abseil-cpp/absl/strings", "//third_party/abseil-cpp/absl/strings:string_view", "//third_party/abseil-cpp/absl/time", "//third_party/abseil-cpp/absl/types:span", diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/CMakeLists.txt b/naiveproxy/src/third_party/abseil-cpp/absl/log/CMakeLists.txt index 130897f49f..51f399e8a7 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/CMakeLists.txt +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/CMakeLists.txt @@ -28,7 +28,6 @@ absl_cc_library( absl::core_headers absl::log_internal_check_op absl::log_internal_conditions - absl::log_internal_message absl::log_internal_strip ) @@ -47,6 +46,7 @@ absl_cc_library( absl::base absl::config absl::core_headers + absl::has_ostream_operator absl::leak_check absl::log_internal_nullguard absl::log_internal_nullstream @@ -466,6 +466,8 @@ absl_cc_library( absl::config absl::core_headers absl::log + absl::nullability + absl::nullability_traits_internal absl::strings PUBLIC ) @@ -560,6 +562,8 @@ absl_cc_library( absl_cc_library( NAME log_entry + SRCS + "log_entry.cc" HDRS "log_entry.h" COPTS @@ -570,6 +574,7 @@ absl_cc_library( absl::config absl::core_headers absl::log_internal_config + absl::log_internal_proto absl::log_severity absl::span absl::strings diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/check_test_impl.inc b/naiveproxy/src/third_party/abseil-cpp/absl/log/check_test_impl.inc index 5a7caf47d0..495f85a267 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/check_test_impl.inc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/check_test_impl.inc @@ -13,6 +13,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +// SKIP_ABSL_INLINE_NAMESPACE_CHECK + #ifndef ABSL_LOG_CHECK_TEST_IMPL_H_ #define ABSL_LOG_CHECK_TEST_IMPL_H_ @@ -241,6 +243,18 @@ TEST(CHECKTest, TestBinaryChecksWithPrimitives) { ABSL_TEST_CHECK_LT(1, 2); } +TEST(CHECKTest, TestBinaryChecksWithStringComparison) { + const std::string a = "a"; + ABSL_TEST_CHECK_EQ(a, "a"); + ABSL_TEST_CHECK_NE(a, "b"); + ABSL_TEST_CHECK_GE(a, a); + ABSL_TEST_CHECK_GE("b", a); + ABSL_TEST_CHECK_LE(a, "a"); + ABSL_TEST_CHECK_LE(a, "b"); + ABSL_TEST_CHECK_GT("b", a); + ABSL_TEST_CHECK_LT(a, "b"); +} + // For testing using CHECK*() on anonymous enums. enum { CASE_A, CASE_B }; @@ -278,8 +292,7 @@ TEST(CHECKDeathTest, TestBinaryChecksWithUnprintable) { ExampleTypeThatHasNoStreamOperator a{true}; ExampleTypeThatHasNoStreamOperator b{false}; ABSL_TEST_CHECK_EQ(a, a); - EXPECT_DEATH(ABSL_TEST_CHECK_EQ(a, b), - "Check failed: a == b \\(UNPRINTABLE vs. UNPRINTABLE\\)"); + EXPECT_DEATH(ABSL_TEST_CHECK_EQ(a, b), "Check failed: a == b"); ABSL_TEST_CHECK_EQ(a, true); EXPECT_DEATH(ABSL_TEST_CHECK_EQ(a, false), "Check failed: a == false \\(UNPRINTABLE vs. 0\\)"); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/die_if_null.cc b/naiveproxy/src/third_party/abseil-cpp/absl/log/die_if_null.cc index 19c6a28ed8..0d0b78ed43 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/die_if_null.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/die_if_null.cc @@ -15,6 +15,7 @@ #include "absl/log/die_if_null.h" #include "absl/base/config.h" +#include "absl/base/nullability.h" #include "absl/log/log.h" #include "absl/strings/str_cat.h" @@ -22,7 +23,8 @@ namespace absl { ABSL_NAMESPACE_BEGIN namespace log_internal { -void DieBecauseNull(const char* file, int line, const char* exprtext) { +void DieBecauseNull(const char* absl_nonnull file, int line, + const char* absl_nonnull exprtext) { LOG(FATAL).AtLocation(file, line) << absl::StrCat("Check failed: '", exprtext, "' Must be non-null"); } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/die_if_null.h b/naiveproxy/src/third_party/abseil-cpp/absl/log/die_if_null.h index 8597976f4c..ac7dbe6885 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/die_if_null.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/die_if_null.h @@ -23,10 +23,13 @@ #include +#include #include #include "absl/base/attributes.h" #include "absl/base/config.h" +#include "absl/base/internal/nullability_traits.h" +#include "absl/base/nullability.h" #include "absl/base/optimization.h" // ABSL_DIE_IF_NULL() @@ -56,12 +59,30 @@ namespace log_internal { // generates less code than its implementation would if inlined, for a slight // code size reduction each time `ABSL_DIE_IF_NULL` is called. [[noreturn]] ABSL_ATTRIBUTE_NOINLINE void DieBecauseNull( - const char* file, int line, const char* exprtext); + const char* absl_nonnull file, int line, const char* absl_nonnull exprtext); // Helper for `ABSL_DIE_IF_NULL`. + +// Since we use `remove_reference_t` before `AddNonnullIfCompatible`, we need +// to explicitly have overloads for both lvalue reference and rvalue reference +// arguments and returns. template -[[nodiscard]] T DieIfNull(const char* file, int line, const char* exprtext, - T&& t) { +[[nodiscard]] typename absl::base_internal::AddNonnullIfCompatible< + std::remove_reference_t>::type& +DieIfNull(const char* absl_nonnull file, int line, + const char* absl_nonnull exprtext, T& t) { + if (ABSL_PREDICT_FALSE(t == nullptr)) { + // Call a non-inline helper function for a small code size improvement. + DieBecauseNull(file, line, exprtext); + } + return t; +} + +template +[[nodiscard]] typename absl::base_internal::AddNonnullIfCompatible< + std::remove_reference_t>::type&& +DieIfNull(const char* absl_nonnull file, int line, + const char* absl_nonnull exprtext, T&& t) { if (ABSL_PREDICT_FALSE(t == nullptr)) { // Call a non-inline helper function for a small code size improvement. DieBecauseNull(file, line, exprtext); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/BUILD.bazel b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/BUILD.bazel index 1ba9d7662a..bb20a95fb1 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/BUILD.bazel +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/BUILD.bazel @@ -59,7 +59,6 @@ cc_library( deps = [ ":check_op", ":conditions", - ":log_message", ":strip", "//absl/base:core_headers", ], @@ -82,6 +81,7 @@ cc_library( "//absl/base:nullability", "//absl/debugging:leak_check", "//absl/strings", + "//absl/strings:has_ostream_operator", ], ) diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/BUILD.gn b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/BUILD.gn index fda8e48dc0..0102f806c0 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/BUILD.gn +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/BUILD.gn @@ -9,7 +9,6 @@ absl_source_set("check_impl") { deps = [ ":check_op", ":conditions", - ":log_message", ":strip", "//third_party/abseil-cpp/absl/base:core_headers", ] @@ -28,6 +27,7 @@ absl_source_set("check_op") { "//third_party/abseil-cpp/absl/base:nullability", "//third_party/abseil-cpp/absl/debugging:leak_check", "//third_party/abseil-cpp/absl/strings", + "//third_party/abseil-cpp/absl/strings:has_ostream_operator", ] } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/check_impl.h b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/check_impl.h index 00f25f80ba..dc2e214de7 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/check_impl.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/check_impl.h @@ -12,13 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. +// SKIP_ABSL_INLINE_NAMESPACE_CHECK + #ifndef ABSL_LOG_INTERNAL_CHECK_IMPL_H_ #define ABSL_LOG_INTERNAL_CHECK_IMPL_H_ #include "absl/base/optimization.h" #include "absl/log/internal/check_op.h" #include "absl/log/internal/conditions.h" -#include "absl/log/internal/log_message.h" #include "absl/log/internal/strip.h" // CHECK diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/check_op.cc b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/check_op.cc index 5db98dd9cd..be8ceaf4ca 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/check_op.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/check_op.cc @@ -101,7 +101,9 @@ void MakeCheckOpValueString(std::ostream& os, const void* p) { } } -void MakeCheckOpUnprintableString(std::ostream& os) { os << "UNPRINTABLE"; } +std::ostream& operator<<(std::ostream& os, UnprintableWrapper) { + return os << "UNPRINTABLE"; +} // Helper functions for string comparisons. #define DEFINE_CHECK_STROP_IMPL(name, func, expected) \ diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/check_op.h b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/check_op.h index 4554475dad..532b37cae1 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/check_op.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/check_op.h @@ -40,15 +40,16 @@ #include "absl/log/internal/nullstream.h" #include "absl/log/internal/strip.h" #include "absl/strings/has_absl_stringify.h" +#include "absl/strings/has_ostream_operator.h" #include "absl/strings/string_view.h" // `ABSL_LOG_INTERNAL_STRIP_STRING_LITERAL` wraps string literals that // should be stripped when `ABSL_MIN_LOG_LEVEL` exceeds `kFatal`. #ifdef ABSL_MIN_LOG_LEVEL -#define ABSL_LOG_INTERNAL_STRIP_STRING_LITERAL(literal) \ - (::absl::LogSeverity::kFatal >= \ - static_cast<::absl::LogSeverity>(ABSL_MIN_LOG_LEVEL) \ - ? (literal) \ +#define ABSL_LOG_INTERNAL_STRIP_STRING_LITERAL(literal) \ + (::absl::LogSeverity::kFatal >= \ + static_cast<::absl::LogSeverityAtLeast>(ABSL_MIN_LOG_LEVEL) \ + ? (literal) \ : "") #else #define ABSL_LOG_INTERNAL_STRIP_STRING_LITERAL(literal) (literal) @@ -224,17 +225,12 @@ void MakeCheckOpValueString(std::ostream& os, signed char v); void MakeCheckOpValueString(std::ostream& os, unsigned char v); void MakeCheckOpValueString(std::ostream& os, const void* absl_nullable p); -void MakeCheckOpUnprintableString(std::ostream& os); - // A wrapper for types that have no operator<<. struct UnprintableWrapper { template explicit UnprintableWrapper(const T&) {} - friend std::ostream& operator<<(std::ostream& os, const UnprintableWrapper&) { - MakeCheckOpUnprintableString(os); - return os; - } + friend std::ostream& operator<<(std::ostream& os, UnprintableWrapper); }; namespace detect_specialization { @@ -357,24 +353,27 @@ std::enable_if_t::value, StringifyToStreamWrapper> Detect(...); // Ellipsis has lowest preference when int passed. -// is_streamable is true for types that have an output stream operator<<. -template -struct is_streamable : std::false_type {}; - -template -struct is_streamable() - << std::declval())>> - : std::true_type {}; - // This overload triggers when T is neither possible to print nor an enum. template std::enable_if_t, std::is_enum, std::is_pointer, std::is_same, - is_streamable, HasAbslStringify>>, + HasOstreamOperator, HasAbslStringify>>, UnprintableWrapper> Detect(...); +// Equivalent to the updated std::underlying_type from C++20, which is no +// longer undefined behavior for non-enum types. +template +struct UnderlyingType {}; + +template +struct UnderlyingType>> { + using type = std::underlying_type_t; +}; +template +using UnderlyingTypeT = typename UnderlyingType::type; + // This overload triggers when T is a scoped enum that has not defined an output // stream operator (operator<<) or AbslStringify. It causes the enum value to be // converted to a type that can be streamed. For consistency with other enums, a @@ -382,17 +381,17 @@ Detect(...); // one backed by another integer is converted to (u)int64_t. template std::enable_if_t< - std::conjunction_v< - std::is_enum, std::negation>, - std::negation>, std::negation>>, - std::conditional_t< - std::is_same_v, bool> || - std::is_same_v, char> || - std::is_same_v, signed char> || - std::is_same_v, unsigned char>, - std::underlying_type_t, - std::conditional_t>, int64_t, - uint64_t>>> + std::conjunction_v, + std::negation>, + std::negation>, + std::negation>>, + std::conditional_t, bool> || + std::is_same_v, char> || + std::is_same_v, signed char> || + std::is_same_v, unsigned char>, + UnderlyingTypeT, + std::conditional_t>, + int64_t, uint64_t>>> Detect(...); } // namespace detect_specialization @@ -407,10 +406,16 @@ ABSL_ATTRIBUTE_RETURNS_NONNULL const char* absl_nonnull MakeCheckOpString( template const char* absl_nonnull MakeCheckOpString(T1 v1, T2 v2, const char* absl_nonnull exprtext) { - CheckOpMessageBuilder comb(exprtext); - MakeCheckOpValueString(comb.ForVar1(), v1); - MakeCheckOpValueString(comb.ForVar2(), v2); - return comb.NewString(); + if constexpr (std::is_same_v, UnprintableWrapper> && + std::is_same_v, UnprintableWrapper>) { + // No sense printing " (UNPRINTABLE vs. UNPRINTABLE)" + return exprtext; + } else { + CheckOpMessageBuilder comb(exprtext); + MakeCheckOpValueString(comb.ForVar1(), v1); + MakeCheckOpValueString(comb.ForVar2(), v2); + return comb.NewString(); + } } // Add a few commonly used instantiations as extern to reduce size of objects @@ -441,7 +446,7 @@ ABSL_LOG_INTERNAL_DEFINE_MAKE_CHECK_OP_STRING_EXTERN(const void* absl_nonnull); #ifdef ABSL_MIN_LOG_LEVEL #define ABSL_LOG_INTERNAL_CHECK_OP_IMPL_RESULT(U1, U2, v1, v2, exprtext) \ ((::absl::LogSeverity::kFatal >= \ - static_cast<::absl::LogSeverity>(ABSL_MIN_LOG_LEVEL)) \ + static_cast<::absl::LogSeverityAtLeast>(ABSL_MIN_LOG_LEVEL)) \ ? MakeCheckOpString(v1, v2, exprtext) \ : "") #else diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/conditions.h b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/conditions.h index 6fb74b142b..3325a318b1 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/conditions.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/conditions.h @@ -108,46 +108,49 @@ #ifdef ABSL_MIN_LOG_LEVEL #define ABSL_LOG_INTERNAL_CONDITION_INFO(type, condition) \ ABSL_LOG_INTERNAL_##type##_CONDITION( \ - (condition) && ::absl::LogSeverity::kInfo >= \ - static_cast<::absl::LogSeverity>(ABSL_MIN_LOG_LEVEL)) + (condition) && \ + ::absl::LogSeverity::kInfo >= \ + static_cast<::absl::LogSeverityAtLeast>(ABSL_MIN_LOG_LEVEL)) #define ABSL_LOG_INTERNAL_CONDITION_WARNING(type, condition) \ ABSL_LOG_INTERNAL_##type##_CONDITION( \ - (condition) && ::absl::LogSeverity::kWarning >= \ - static_cast<::absl::LogSeverity>(ABSL_MIN_LOG_LEVEL)) + (condition) && \ + ::absl::LogSeverity::kWarning >= \ + static_cast<::absl::LogSeverityAtLeast>(ABSL_MIN_LOG_LEVEL)) #define ABSL_LOG_INTERNAL_CONDITION_ERROR(type, condition) \ ABSL_LOG_INTERNAL_##type##_CONDITION( \ - (condition) && ::absl::LogSeverity::kError >= \ - static_cast<::absl::LogSeverity>(ABSL_MIN_LOG_LEVEL)) + (condition) && \ + ::absl::LogSeverity::kError >= \ + static_cast<::absl::LogSeverityAtLeast>(ABSL_MIN_LOG_LEVEL)) #define ABSL_LOG_INTERNAL_CONDITION_DO_NOT_SUBMIT(type, condition) \ ABSL_LOG_INTERNAL_CONDITION_ERROR(type, condition) // NOTE: Use ternary operators instead of short-circuiting to mitigate // https://bugs.llvm.org/show_bug.cgi?id=51928. #define ABSL_LOG_INTERNAL_CONDITION_FATAL(type, condition) \ ABSL_LOG_INTERNAL_##type##_CONDITION( \ - ((condition) \ - ? (::absl::LogSeverity::kFatal >= \ - static_cast<::absl::LogSeverity>(ABSL_MIN_LOG_LEVEL) \ - ? true \ - : (::absl::log_internal::AbortQuietly(), false)) \ - : false)) + ((condition) ? (::absl::LogSeverity::kFatal >= \ + static_cast<::absl::LogSeverityAtLeast>( \ + ABSL_MIN_LOG_LEVEL) \ + ? true \ + : (::absl::log_internal::AbortQuietly(), false)) \ + : false)) // NOTE: Use ternary operators instead of short-circuiting to mitigate // https://bugs.llvm.org/show_bug.cgi?id=51928. -#define ABSL_LOG_INTERNAL_CONDITION_QFATAL(type, condition) \ - ABSL_LOG_INTERNAL_##type##_CONDITION( \ - ((condition) \ - ? (::absl::LogSeverity::kFatal >= \ - static_cast<::absl::LogSeverity>(ABSL_MIN_LOG_LEVEL) \ - ? true \ - : (::absl::log_internal::ExitQuietly(), false)) \ - : false)) -#define ABSL_LOG_INTERNAL_CONDITION_DFATAL(type, condition) \ - ABSL_LOG_INTERNAL_##type##_CONDITION( \ - (ABSL_ASSUME(absl::kLogDebugFatal == absl::LogSeverity::kError || \ - absl::kLogDebugFatal == absl::LogSeverity::kFatal), \ - (condition) && \ - (::absl::kLogDebugFatal >= \ - static_cast<::absl::LogSeverity>(ABSL_MIN_LOG_LEVEL) || \ - (::absl::kLogDebugFatal == ::absl::LogSeverity::kFatal && \ +#define ABSL_LOG_INTERNAL_CONDITION_QFATAL(type, condition) \ + ABSL_LOG_INTERNAL_##type##_CONDITION( \ + ((condition) ? (::absl::LogSeverity::kFatal >= \ + static_cast<::absl::LogSeverityAtLeast>( \ + ABSL_MIN_LOG_LEVEL) \ + ? true \ + : (::absl::log_internal::ExitQuietly(), false)) \ + : false)) +#define ABSL_LOG_INTERNAL_CONDITION_DFATAL(type, condition) \ + ABSL_LOG_INTERNAL_##type##_CONDITION( \ + (ABSL_ASSUME(absl::kLogDebugFatal == absl::LogSeverity::kError || \ + absl::kLogDebugFatal == absl::LogSeverity::kFatal), \ + (condition) && \ + (::absl::kLogDebugFatal >= \ + static_cast<::absl::LogSeverityAtLeast>(ABSL_MIN_LOG_LEVEL) || \ + (::absl::kLogDebugFatal == ::absl::LogSeverity::kFatal && \ (::absl::log_internal::AbortQuietly(), false))))) #define ABSL_LOG_INTERNAL_CONDITION_LEVEL(severity) \ @@ -157,13 +160,13 @@ ::absl::NormalizeLogSeverity(severity); \ absl_log_internal_severity_loop; absl_log_internal_severity_loop = 0) \ ABSL_LOG_INTERNAL_CONDITION_LEVEL_IMPL -#define ABSL_LOG_INTERNAL_CONDITION_LEVEL_IMPL(type, condition) \ - ABSL_LOG_INTERNAL_##type##_CONDITION(( \ - (condition) && \ - (absl_log_internal_severity >= \ - static_cast<::absl::LogSeverity>(ABSL_MIN_LOG_LEVEL) || \ - (absl_log_internal_severity == ::absl::LogSeverity::kFatal && \ - (::absl::log_internal::AbortQuietly(), false))))) +#define ABSL_LOG_INTERNAL_CONDITION_LEVEL_IMPL(type, condition) \ + ABSL_LOG_INTERNAL_##type##_CONDITION( \ + ((condition) && \ + (absl_log_internal_severity >= \ + static_cast<::absl::LogSeverityAtLeast>(ABSL_MIN_LOG_LEVEL) || \ + (absl_log_internal_severity == ::absl::LogSeverity::kFatal && \ + (::absl::log_internal::AbortQuietly(), false))))) #else // ndef ABSL_MIN_LOG_LEVEL #define ABSL_LOG_INTERNAL_CONDITION_INFO(type, condition) \ ABSL_LOG_INTERNAL_##type##_CONDITION(condition) diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_impl.h b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_impl.h index a67f2f31b4..2fe73de10b 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_impl.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_impl.h @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +// SKIP_ABSL_INLINE_NAMESPACE_CHECK + #ifndef ABSL_LOG_INTERNAL_LOG_IMPL_H_ #define ABSL_LOG_INTERNAL_LOG_IMPL_H_ @@ -23,260 +25,256 @@ // ABSL_LOG() #define ABSL_LOG_INTERNAL_LOG_IMPL(severity) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATELESS, true) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() // ABSL_PLOG() -#define ABSL_LOG_INTERNAL_PLOG_IMPL(severity) \ - ABSL_LOG_INTERNAL_CONDITION##severity(STATELESS, true) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() \ +#define ABSL_LOG_INTERNAL_PLOG_IMPL(severity) \ + ABSL_LOG_INTERNAL_CONDITION##severity(STATELESS, true) \ + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() \ .WithPerror() // ABSL_DLOG() #ifndef NDEBUG #define ABSL_LOG_INTERNAL_DLOG_IMPL(severity) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATELESS, true) \ - ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #else #define ABSL_LOG_INTERNAL_DLOG_IMPL(severity) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATELESS, false) \ - ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #endif // The `switch` ensures that this expansion is the beginning of a statement (as // opposed to an expression). The use of both `case 0` and `default` is to // suppress a compiler warning. -#define ABSL_LOG_INTERNAL_VLOG_IMPL(verbose_level) \ - switch (const int absl_logging_internal_verbose_level = (verbose_level)) \ - case 0: \ - default: \ - ABSL_LOG_INTERNAL_LOG_IF_IMPL( \ - _INFO, ABSL_VLOG_IS_ON(absl_logging_internal_verbose_level)) \ - .WithVerbosity(absl_logging_internal_verbose_level) +#define ABSL_LOG_INTERNAL_VLOG_IMPL(verbose_level) \ + switch (const int absl_log_internal_verbose_level = (verbose_level)) \ + case 0: \ + default: \ + ABSL_LOG_INTERNAL_LOG_IF_IMPL( \ + _INFO, ABSL_VLOG_IS_ON(absl_log_internal_verbose_level)) \ + .WithVerbosity(absl_log_internal_verbose_level) #ifndef NDEBUG -#define ABSL_LOG_INTERNAL_DVLOG_IMPL(verbose_level) \ - switch (const int absl_logging_internal_verbose_level = (verbose_level)) \ - case 0: \ - default: \ - ABSL_LOG_INTERNAL_DLOG_IF_IMPL( \ - _INFO, ABSL_VLOG_IS_ON(absl_logging_internal_verbose_level)) \ - .WithVerbosity(absl_logging_internal_verbose_level) +#define ABSL_LOG_INTERNAL_DVLOG_IMPL(verbose_level) \ + switch (const int absl_log_internal_verbose_level = (verbose_level)) \ + case 0: \ + default: \ + ABSL_LOG_INTERNAL_DLOG_IF_IMPL( \ + _INFO, ABSL_VLOG_IS_ON(absl_log_internal_verbose_level)) \ + .WithVerbosity(absl_log_internal_verbose_level) #else -#define ABSL_LOG_INTERNAL_DVLOG_IMPL(verbose_level) \ - switch (const int absl_logging_internal_verbose_level = (verbose_level)) \ - case 0: \ - default: \ - ABSL_LOG_INTERNAL_DLOG_IF_IMPL( \ - _INFO, false && ABSL_VLOG_IS_ON(absl_logging_internal_verbose_level)) \ - .WithVerbosity(absl_logging_internal_verbose_level) +#define ABSL_LOG_INTERNAL_DVLOG_IMPL(verbose_level) \ + switch (const int absl_log_internal_verbose_level = (verbose_level)) \ + case 0: \ + default: \ + ABSL_LOG_INTERNAL_DLOG_IF_IMPL( \ + _INFO, false && ABSL_VLOG_IS_ON(absl_log_internal_verbose_level)) \ + .WithVerbosity(absl_log_internal_verbose_level) #endif #define ABSL_LOG_INTERNAL_LOG_IF_IMPL(severity, condition) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATELESS, condition) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_PLOG_IF_IMPL(severity, condition) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATELESS, condition) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() \ + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() \ .WithPerror() #ifndef NDEBUG #define ABSL_LOG_INTERNAL_DLOG_IF_IMPL(severity, condition) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATELESS, condition) \ - ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #else #define ABSL_LOG_INTERNAL_DLOG_IF_IMPL(severity, condition) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATELESS, false && (condition)) \ - ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #endif // ABSL_LOG_EVERY_N #define ABSL_LOG_INTERNAL_LOG_EVERY_N_IMPL(severity, n) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, true)(EveryN, n) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() // ABSL_LOG_FIRST_N #define ABSL_LOG_INTERNAL_LOG_FIRST_N_IMPL(severity, n) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, true)(FirstN, n) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() // ABSL_LOG_EVERY_POW_2 #define ABSL_LOG_INTERNAL_LOG_EVERY_POW_2_IMPL(severity) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, true)(EveryPow2) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() // ABSL_LOG_EVERY_N_SEC #define ABSL_LOG_INTERNAL_LOG_EVERY_N_SEC_IMPL(severity, n_seconds) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, true)(EveryNSec, n_seconds) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_PLOG_EVERY_N_IMPL(severity, n) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, true)(EveryN, n) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() \ + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() \ .WithPerror() #define ABSL_LOG_INTERNAL_PLOG_FIRST_N_IMPL(severity, n) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, true)(FirstN, n) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() \ + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() \ .WithPerror() #define ABSL_LOG_INTERNAL_PLOG_EVERY_POW_2_IMPL(severity) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, true)(EveryPow2) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() \ + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() \ .WithPerror() #define ABSL_LOG_INTERNAL_PLOG_EVERY_N_SEC_IMPL(severity, n_seconds) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, true)(EveryNSec, n_seconds) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() \ + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() \ .WithPerror() #ifndef NDEBUG #define ABSL_LOG_INTERNAL_DLOG_EVERY_N_IMPL(severity, n) \ ABSL_LOG_INTERNAL_CONDITION_INFO(STATEFUL, true) \ - (EveryN, n) ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + (EveryN, n) ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_DLOG_FIRST_N_IMPL(severity, n) \ ABSL_LOG_INTERNAL_CONDITION_INFO(STATEFUL, true) \ - (FirstN, n) ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + (FirstN, n) ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_DLOG_EVERY_POW_2_IMPL(severity) \ ABSL_LOG_INTERNAL_CONDITION_INFO(STATEFUL, true) \ - (EveryPow2) ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + (EveryPow2) ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_DLOG_EVERY_N_SEC_IMPL(severity, n_seconds) \ ABSL_LOG_INTERNAL_CONDITION_INFO(STATEFUL, true) \ - (EveryNSec, n_seconds) ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + (EveryNSec, n_seconds) ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #else // def NDEBUG #define ABSL_LOG_INTERNAL_DLOG_EVERY_N_IMPL(severity, n) \ ABSL_LOG_INTERNAL_CONDITION_INFO(STATEFUL, false) \ - (EveryN, n) ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + (EveryN, n) ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_DLOG_FIRST_N_IMPL(severity, n) \ ABSL_LOG_INTERNAL_CONDITION_INFO(STATEFUL, false) \ - (FirstN, n) ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + (FirstN, n) ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_DLOG_EVERY_POW_2_IMPL(severity) \ ABSL_LOG_INTERNAL_CONDITION_INFO(STATEFUL, false) \ - (EveryPow2) ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + (EveryPow2) ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_DLOG_EVERY_N_SEC_IMPL(severity, n_seconds) \ ABSL_LOG_INTERNAL_CONDITION_INFO(STATEFUL, false) \ - (EveryNSec, n_seconds) ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + (EveryNSec, n_seconds) ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #endif // def NDEBUG -#define ABSL_LOG_INTERNAL_VLOG_EVERY_N_IMPL(verbose_level, n) \ - switch (const int absl_logging_internal_verbose_level = (verbose_level)) \ - case 0: \ - default: \ - ABSL_LOG_INTERNAL_CONDITION_INFO( \ - STATEFUL, ABSL_VLOG_IS_ON(absl_logging_internal_verbose_level)) \ - (EveryN, n) ABSL_LOGGING_INTERNAL_LOG_INFO.InternalStream().WithVerbosity( \ - absl_logging_internal_verbose_level) +#define ABSL_LOG_INTERNAL_VLOG_EVERY_N_IMPL(verbose_level, n) \ + switch (const int absl_log_internal_verbose_level = (verbose_level)) \ + case 0: \ + default: \ + ABSL_LOG_INTERNAL_CONDITION_INFO( \ + STATEFUL, ABSL_VLOG_IS_ON(absl_log_internal_verbose_level)) \ + (EveryN, n) ABSL_LOG_INTERNAL_LOG_INFO.InternalStream().WithVerbosity( \ + absl_log_internal_verbose_level) -#define ABSL_LOG_INTERNAL_VLOG_FIRST_N_IMPL(verbose_level, n) \ - switch (const int absl_logging_internal_verbose_level = (verbose_level)) \ - case 0: \ - default: \ - ABSL_LOG_INTERNAL_CONDITION_INFO( \ - STATEFUL, ABSL_VLOG_IS_ON(absl_logging_internal_verbose_level)) \ - (FirstN, n) ABSL_LOGGING_INTERNAL_LOG_INFO.InternalStream().WithVerbosity( \ - absl_logging_internal_verbose_level) +#define ABSL_LOG_INTERNAL_VLOG_FIRST_N_IMPL(verbose_level, n) \ + switch (const int absl_log_internal_verbose_level = (verbose_level)) \ + case 0: \ + default: \ + ABSL_LOG_INTERNAL_CONDITION_INFO( \ + STATEFUL, ABSL_VLOG_IS_ON(absl_log_internal_verbose_level)) \ + (FirstN, n) ABSL_LOG_INTERNAL_LOG_INFO.InternalStream().WithVerbosity( \ + absl_log_internal_verbose_level) -#define ABSL_LOG_INTERNAL_VLOG_EVERY_POW_2_IMPL(verbose_level) \ - switch (const int absl_logging_internal_verbose_level = (verbose_level)) \ - case 0: \ - default: \ - ABSL_LOG_INTERNAL_CONDITION_INFO( \ - STATEFUL, ABSL_VLOG_IS_ON(absl_logging_internal_verbose_level)) \ - (EveryPow2) ABSL_LOGGING_INTERNAL_LOG_INFO.InternalStream().WithVerbosity( \ - absl_logging_internal_verbose_level) +#define ABSL_LOG_INTERNAL_VLOG_EVERY_POW_2_IMPL(verbose_level) \ + switch (const int absl_log_internal_verbose_level = (verbose_level)) \ + case 0: \ + default: \ + ABSL_LOG_INTERNAL_CONDITION_INFO( \ + STATEFUL, ABSL_VLOG_IS_ON(absl_log_internal_verbose_level)) \ + (EveryPow2) ABSL_LOG_INTERNAL_LOG_INFO.InternalStream().WithVerbosity( \ + absl_log_internal_verbose_level) -#define ABSL_LOG_INTERNAL_VLOG_EVERY_N_SEC_IMPL(verbose_level, n_seconds) \ - switch (const int absl_logging_internal_verbose_level = (verbose_level)) \ - case 0: \ - default: \ - ABSL_LOG_INTERNAL_CONDITION_INFO( \ - STATEFUL, ABSL_VLOG_IS_ON(absl_logging_internal_verbose_level)) \ - (EveryNSec, n_seconds) ABSL_LOGGING_INTERNAL_LOG_INFO.InternalStream() \ - .WithVerbosity(absl_logging_internal_verbose_level) +#define ABSL_LOG_INTERNAL_VLOG_EVERY_N_SEC_IMPL(verbose_level, n_seconds) \ + switch (const int absl_log_internal_verbose_level = (verbose_level)) \ + case 0: \ + default: \ + ABSL_LOG_INTERNAL_CONDITION_INFO( \ + STATEFUL, ABSL_VLOG_IS_ON(absl_log_internal_verbose_level)) \ + (EveryNSec, n_seconds) ABSL_LOG_INTERNAL_LOG_INFO.InternalStream() \ + .WithVerbosity(absl_log_internal_verbose_level) #define ABSL_LOG_INTERNAL_LOG_IF_EVERY_N_IMPL(severity, condition, n) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)(EveryN, n) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_LOG_IF_FIRST_N_IMPL(severity, condition, n) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)(FirstN, n) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_LOG_IF_EVERY_POW_2_IMPL(severity, condition) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)(EveryPow2) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() -#define ABSL_LOG_INTERNAL_LOG_IF_EVERY_N_SEC_IMPL(severity, condition, \ - n_seconds) \ - ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)(EveryNSec, \ - n_seconds) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() +#define ABSL_LOG_INTERNAL_LOG_IF_EVERY_N_SEC_IMPL(severity, condition, \ + n_seconds) \ + ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)( \ + EveryNSec, n_seconds) ABSL_LOG_INTERNAL_LOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_PLOG_IF_EVERY_N_IMPL(severity, condition, n) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)(EveryN, n) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() \ + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() \ .WithPerror() #define ABSL_LOG_INTERNAL_PLOG_IF_FIRST_N_IMPL(severity, condition, n) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)(FirstN, n) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() \ + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() \ .WithPerror() #define ABSL_LOG_INTERNAL_PLOG_IF_EVERY_POW_2_IMPL(severity, condition) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)(EveryPow2) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() \ + ABSL_LOG_INTERNAL_LOG##severity.InternalStream() \ .WithPerror() -#define ABSL_LOG_INTERNAL_PLOG_IF_EVERY_N_SEC_IMPL(severity, condition, \ - n_seconds) \ - ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)(EveryNSec, \ - n_seconds) \ - ABSL_LOGGING_INTERNAL_LOG##severity.InternalStream() \ - .WithPerror() +#define ABSL_LOG_INTERNAL_PLOG_IF_EVERY_N_SEC_IMPL(severity, condition, \ + n_seconds) \ + ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)( \ + EveryNSec, n_seconds) ABSL_LOG_INTERNAL_LOG##severity.InternalStream() \ + .WithPerror() #ifndef NDEBUG #define ABSL_LOG_INTERNAL_DLOG_IF_EVERY_N_IMPL(severity, condition, n) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)(EveryN, n) \ - ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_DLOG_IF_FIRST_N_IMPL(severity, condition, n) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)(FirstN, n) \ - ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_DLOG_IF_EVERY_POW_2_IMPL(severity, condition) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)(EveryPow2) \ - ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_DLOG_IF_EVERY_N_SEC_IMPL(severity, condition, \ n_seconds) \ - ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)(EveryNSec, \ - n_seconds) \ - ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, condition)( \ + EveryNSec, n_seconds) ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #else // def NDEBUG #define ABSL_LOG_INTERNAL_DLOG_IF_EVERY_N_IMPL(severity, condition, n) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, false && (condition))( \ - EveryN, n) ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + EveryN, n) ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_DLOG_IF_FIRST_N_IMPL(severity, condition, n) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, false && (condition))( \ - FirstN, n) ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + FirstN, n) ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_DLOG_IF_EVERY_POW_2_IMPL(severity, condition) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, false && (condition))( \ - EveryPow2) ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + EveryPow2) ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #define ABSL_LOG_INTERNAL_DLOG_IF_EVERY_N_SEC_IMPL(severity, condition, \ n_seconds) \ ABSL_LOG_INTERNAL_CONDITION##severity(STATEFUL, false && (condition))( \ - EveryNSec, n_seconds) \ - ABSL_LOGGING_INTERNAL_DLOG##severity.InternalStream() + EveryNSec, n_seconds) ABSL_LOG_INTERNAL_DLOG##severity.InternalStream() #endif // def NDEBUG #endif // ABSL_LOG_INTERNAL_LOG_IMPL_H_ diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_message.cc b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_message.cc index 3aed3a2fdf..52ab3d96a7 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_message.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_message.cc @@ -150,7 +150,7 @@ void WriteToStream(const char* data, void* os) { } // namespace struct LogMessage::LogMessageData final { - LogMessageData(const char* absl_nonnull file, int line, + LogMessageData(absl::string_view file, int line, absl::LogSeverity severity, absl::Time timestamp); LogMessageData(const LogMessageData&) = delete; LogMessageData& operator=(const LogMessageData&) = delete; @@ -202,7 +202,7 @@ struct LogMessage::LogMessageData final { void FinalizeEncodingAndFormat(); }; -LogMessage::LogMessageData::LogMessageData(const char* absl_nonnull file, +LogMessage::LogMessageData::LogMessageData(absl::string_view file, int line, absl::LogSeverity severity, absl::Time timestamp) : extra_sinks_only(false), manipulated(nullptr) { @@ -275,6 +275,9 @@ void LogMessage::LogMessageData::FinalizeEncodingAndFormat() { LogMessage::LogMessage(const char* absl_nonnull file, int line, absl::LogSeverity severity) + : LogMessage(absl::string_view(file), line, severity) {} +LogMessage::LogMessage(absl::string_view file, int line, + absl::LogSeverity severity) : data_(absl::make_unique(file, line, severity, absl::Now())) { data_->first_fatal = false; diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_message.h b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_message.h index 1aaf05e31f..5b6eed3ce0 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_message.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_message.h @@ -64,9 +64,13 @@ class LogMessage { struct WarningTag {}; struct ErrorTag {}; - // Used for `LOG`. + // Used for `LOG`. Taking `const char *` instead of `string_view` keeps + // callsites a little bit smaller at the cost of doing `strlen` at runtime. LogMessage(const char* absl_nonnull file, int line, absl::LogSeverity severity) ABSL_ATTRIBUTE_COLD; + // Used for FFI integrations that don't have a NUL-terminated string. + LogMessage(absl::string_view file, int line, + absl::LogSeverity severity) ABSL_ATTRIBUTE_COLD; // These constructors are slightly smaller/faster to call; the severity is // curried into the function pointer. LogMessage(const char* absl_nonnull file, int line, diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_sink_set.cc b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_sink_set.cc index 3d5c69952c..c4c7e5ff8d 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_sink_set.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/log_sink_set.cc @@ -192,7 +192,7 @@ class GlobalLogSinkSet final { absl::log_internal::WriteToStderr( entry.text_message_with_prefix_and_newline(), entry.log_severity()); } else { - absl::ReaderMutexLock global_sinks_lock(&guard_); + absl::ReaderMutexLock global_sinks_lock(guard_); ThreadIsLoggingStatus() = true; // Ensure the "thread is logging" status is reverted upon leaving the // scope even in case of exceptions. @@ -205,7 +205,7 @@ class GlobalLogSinkSet final { void AddLogSink(absl::LogSink* sink) ABSL_LOCKS_EXCLUDED(guard_) { { - absl::WriterMutexLock global_sinks_lock(&guard_); + absl::WriterMutexLock global_sinks_lock(guard_); auto pos = std::find(sinks_.begin(), sinks_.end(), sink); if (pos == sinks_.end()) { sinks_.push_back(sink); @@ -217,7 +217,7 @@ class GlobalLogSinkSet final { void RemoveLogSink(absl::LogSink* sink) ABSL_LOCKS_EXCLUDED(guard_) { { - absl::WriterMutexLock global_sinks_lock(&guard_); + absl::WriterMutexLock global_sinks_lock(guard_); auto pos = std::find(sinks_.begin(), sinks_.end(), sink); if (pos != sinks_.end()) { sinks_.erase(pos); @@ -235,7 +235,7 @@ class GlobalLogSinkSet final { guard_.AssertReaderHeld(); FlushLogSinksLocked(); } else { - absl::ReaderMutexLock global_sinks_lock(&guard_); + absl::ReaderMutexLock global_sinks_lock(guard_); // In case if LogSink::Flush overload decides to log ThreadIsLoggingStatus() = true; // Ensure the "thread is logging" status is reverted upon leaving the diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/strip.h b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/strip.h index 60ef87825c..6fd857bdc5 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/strip.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/strip.h @@ -26,57 +26,56 @@ #include "absl/log/internal/log_message.h" #include "absl/log/internal/nullstream.h" -// `ABSL_LOGGING_INTERNAL_LOG_*` evaluates to a temporary `LogMessage` object or +// `ABSL_LOG_INTERNAL_LOG_*` evaluates to a temporary `LogMessage` object or // to a related object with a compatible API but different behavior. This set // of defines comes in three flavors: vanilla, plus two variants that strip some // logging in subtly different ways for subtly different reasons (see below). #if defined(STRIP_LOG) && STRIP_LOG -#define ABSL_LOGGING_INTERNAL_LOG_INFO ::absl::log_internal::NullStream() -#define ABSL_LOGGING_INTERNAL_LOG_WARNING ::absl::log_internal::NullStream() -#define ABSL_LOGGING_INTERNAL_LOG_ERROR ::absl::log_internal::NullStream() -#define ABSL_LOGGING_INTERNAL_LOG_FATAL ::absl::log_internal::NullStreamFatal() -#define ABSL_LOGGING_INTERNAL_LOG_QFATAL ::absl::log_internal::NullStreamFatal() -#define ABSL_LOGGING_INTERNAL_LOG_DFATAL \ +#define ABSL_LOG_INTERNAL_LOG_INFO ::absl::log_internal::NullStream() +#define ABSL_LOG_INTERNAL_LOG_WARNING ::absl::log_internal::NullStream() +#define ABSL_LOG_INTERNAL_LOG_ERROR ::absl::log_internal::NullStream() +#define ABSL_LOG_INTERNAL_LOG_FATAL ::absl::log_internal::NullStreamFatal() +#define ABSL_LOG_INTERNAL_LOG_QFATAL ::absl::log_internal::NullStreamFatal() +#define ABSL_LOG_INTERNAL_LOG_DFATAL \ ::absl::log_internal::NullStreamMaybeFatal(::absl::kLogDebugFatal) -#define ABSL_LOGGING_INTERNAL_LOG_LEVEL(severity) \ +#define ABSL_LOG_INTERNAL_LOG_LEVEL(severity) \ ::absl::log_internal::NullStreamMaybeFatal(absl_log_internal_severity) // Fatal `DLOG`s expand a little differently to avoid being `[[noreturn]]`. -#define ABSL_LOGGING_INTERNAL_DLOG_FATAL \ +#define ABSL_LOG_INTERNAL_DLOG_FATAL \ ::absl::log_internal::NullStreamMaybeFatal(::absl::LogSeverity::kFatal) -#define ABSL_LOGGING_INTERNAL_DLOG_QFATAL \ +#define ABSL_LOG_INTERNAL_DLOG_QFATAL \ ::absl::log_internal::NullStreamMaybeFatal(::absl::LogSeverity::kFatal) -#define ABSL_LOG_INTERNAL_CHECK(failure_message) ABSL_LOGGING_INTERNAL_LOG_FATAL -#define ABSL_LOG_INTERNAL_QCHECK(failure_message) \ - ABSL_LOGGING_INTERNAL_LOG_QFATAL +#define ABSL_LOG_INTERNAL_CHECK(failure_message) ABSL_LOG_INTERNAL_LOG_FATAL +#define ABSL_LOG_INTERNAL_QCHECK(failure_message) ABSL_LOG_INTERNAL_LOG_QFATAL #else // !defined(STRIP_LOG) || !STRIP_LOG -#define ABSL_LOGGING_INTERNAL_LOG_INFO \ - ::absl::log_internal::LogMessage( \ +#define ABSL_LOG_INTERNAL_LOG_INFO \ + ::absl::log_internal::LogMessage( \ __FILE__, __LINE__, ::absl::log_internal::LogMessage::InfoTag{}) -#define ABSL_LOGGING_INTERNAL_LOG_WARNING \ - ::absl::log_internal::LogMessage( \ +#define ABSL_LOG_INTERNAL_LOG_WARNING \ + ::absl::log_internal::LogMessage( \ __FILE__, __LINE__, ::absl::log_internal::LogMessage::WarningTag{}) -#define ABSL_LOGGING_INTERNAL_LOG_ERROR \ - ::absl::log_internal::LogMessage( \ +#define ABSL_LOG_INTERNAL_LOG_ERROR \ + ::absl::log_internal::LogMessage( \ __FILE__, __LINE__, ::absl::log_internal::LogMessage::ErrorTag{}) -#define ABSL_LOGGING_INTERNAL_LOG_FATAL \ +#define ABSL_LOG_INTERNAL_LOG_FATAL \ ::absl::log_internal::LogMessageFatal(__FILE__, __LINE__) -#define ABSL_LOGGING_INTERNAL_LOG_QFATAL \ +#define ABSL_LOG_INTERNAL_LOG_QFATAL \ ::absl::log_internal::LogMessageQuietlyFatal(__FILE__, __LINE__) -#define ABSL_LOGGING_INTERNAL_LOG_DFATAL \ +#define ABSL_LOG_INTERNAL_LOG_DFATAL \ ::absl::log_internal::LogMessage(__FILE__, __LINE__, ::absl::kLogDebugFatal) -#define ABSL_LOGGING_INTERNAL_LOG_LEVEL(severity) \ +#define ABSL_LOG_INTERNAL_LOG_LEVEL(severity) \ ::absl::log_internal::LogMessage(__FILE__, __LINE__, \ absl_log_internal_severity) // Fatal `DLOG`s expand a little differently to avoid being `[[noreturn]]`. -#define ABSL_LOGGING_INTERNAL_DLOG_FATAL \ +#define ABSL_LOG_INTERNAL_DLOG_FATAL \ ::absl::log_internal::LogMessageDebugFatal(__FILE__, __LINE__) -#define ABSL_LOGGING_INTERNAL_DLOG_QFATAL \ +#define ABSL_LOG_INTERNAL_DLOG_QFATAL \ ::absl::log_internal::LogMessageQuietlyDebugFatal(__FILE__, __LINE__) // These special cases dispatch to special-case constructors that allow us to @@ -89,12 +88,12 @@ #endif // !defined(STRIP_LOG) || !STRIP_LOG // This part of a non-fatal `DLOG`s expands the same as `LOG`. -#define ABSL_LOGGING_INTERNAL_DLOG_INFO ABSL_LOGGING_INTERNAL_LOG_INFO -#define ABSL_LOGGING_INTERNAL_DLOG_WARNING ABSL_LOGGING_INTERNAL_LOG_WARNING -#define ABSL_LOGGING_INTERNAL_DLOG_ERROR ABSL_LOGGING_INTERNAL_LOG_ERROR -#define ABSL_LOGGING_INTERNAL_DLOG_DFATAL ABSL_LOGGING_INTERNAL_LOG_DFATAL -#define ABSL_LOGGING_INTERNAL_DLOG_LEVEL ABSL_LOGGING_INTERNAL_LOG_LEVEL +#define ABSL_LOG_INTERNAL_DLOG_INFO ABSL_LOG_INTERNAL_LOG_INFO +#define ABSL_LOG_INTERNAL_DLOG_WARNING ABSL_LOG_INTERNAL_LOG_WARNING +#define ABSL_LOG_INTERNAL_DLOG_ERROR ABSL_LOG_INTERNAL_LOG_ERROR +#define ABSL_LOG_INTERNAL_DLOG_DFATAL ABSL_LOG_INTERNAL_LOG_DFATAL +#define ABSL_LOG_INTERNAL_DLOG_LEVEL ABSL_LOG_INTERNAL_LOG_LEVEL -#define ABSL_LOGGING_INTERNAL_LOG_DO_NOT_SUBMIT ABSL_LOGGING_INTERNAL_LOG_ERROR +#define ABSL_LOG_INTERNAL_LOG_DO_NOT_SUBMIT ABSL_LOG_INTERNAL_LOG_ERROR #endif // ABSL_LOG_INTERNAL_STRIP_H_ diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/vlog_config.cc b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/vlog_config.cc index 0a460d937d..97665a59b6 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/vlog_config.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/vlog_config.cc @@ -94,12 +94,12 @@ ABSL_CONST_INIT absl::base_internal::SpinLock mutex( // `GetUpdateSitesMutex()` serializes updates to all of the sites (i.e. those in // `site_list_head`) themselves. -absl::Mutex* GetUpdateSitesMutex() { +absl::Mutex& GetUpdateSitesMutex() { // Chromium requires no global destructors, so we can't use the // absl::kConstInit idiom since absl::Mutex as a non-trivial destructor. static absl::NoDestructor update_sites_mutex ABSL_ACQUIRED_AFTER( mutex); - return update_sites_mutex.get(); + return *update_sites_mutex; } ABSL_CONST_INIT int global_v ABSL_GUARDED_BY(mutex) = 0; @@ -159,10 +159,10 @@ int VLogLevel(absl::string_view file, const std::vector* infos, // If there are any slashes in the pattern, try to match the full // name. if (FNMatch(info.module_pattern, stem)) { - return info.vlog_level == kUseFlag ? current_global_v : info.vlog_level; + return info.vlog_level; } } else if (FNMatch(info.module_pattern, stem_basename)) { - return info.vlog_level == kUseFlag ? current_global_v : info.vlog_level; + return info.vlog_level; } } @@ -222,7 +222,7 @@ int PrependVModuleLocked(absl::string_view module_pattern, int log_level) } // namespace int VLogLevel(absl::string_view file) ABSL_LOCKS_EXCLUDED(mutex) { - absl::base_internal::SpinLockHolder l(&mutex); + absl::base_internal::SpinLockHolder l(mutex); return VLogLevel(file, vmodule_info, global_v); } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/vlog_config.h b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/vlog_config.h index 84e817a3e2..da020f87f1 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/vlog_config.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/internal/vlog_config.h @@ -48,7 +48,6 @@ class VLogSite; int RegisterAndInitialize(VLogSite* absl_nonnull v); void UpdateVLogSites(); -constexpr int kUseFlag = (std::numeric_limits::min)(); // Represents a unique callsite for a `VLOG()` or `VLOG_IS_ON()` call. // diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/log.h b/naiveproxy/src/third_party/abseil-cpp/absl/log/log.h index f1cab9d0c0..371c32ff80 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/log.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/log.h @@ -247,11 +247,11 @@ // However, simply testing whether verbose logging is enabled can be expensive. // If you don't intend to enable verbose logging in non-debug builds, consider // using `DVLOG` instead. -#define VLOG(severity) ABSL_LOG_INTERNAL_VLOG_IMPL(severity) +#define VLOG(verbose_level) ABSL_LOG_INTERNAL_VLOG_IMPL(verbose_level) // `DVLOG` behaves like `VLOG` in debug mode (i.e. `#ifndef NDEBUG`). // Otherwise, it compiles away and does nothing. -#define DVLOG(severity) ABSL_LOG_INTERNAL_DVLOG_IMPL(severity) +#define DVLOG(verbose_level) ABSL_LOG_INTERNAL_DVLOG_IMPL(verbose_level) // `LOG_IF` and friends add a second argument which specifies a condition. If // the condition is false, nothing is logged. diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/log_basic_test_impl.inc b/naiveproxy/src/third_party/abseil-cpp/absl/log/log_basic_test_impl.inc index c4b4e2429e..3f007dc9cb 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/log_basic_test_impl.inc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/log_basic_test_impl.inc @@ -94,6 +94,7 @@ TEST_P(BasicLogTest, Info) { absl::log_internal::ScopedMinLogLevel scoped_min_log_level(GetParam()); absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); + EXPECT_CALL(test_sink, Send).Times(0); const int log_line = __LINE__ + 1; auto do_log = [] { ABSL_TEST_LOG(INFO) << "hello world"; }; @@ -125,6 +126,7 @@ TEST_P(BasicLogTest, Warning) { absl::log_internal::ScopedMinLogLevel scoped_min_log_level(GetParam()); absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); + EXPECT_CALL(test_sink, Send).Times(0); const int log_line = __LINE__ + 1; auto do_log = [] { ABSL_TEST_LOG(WARNING) << "hello world"; }; @@ -156,6 +158,7 @@ TEST_P(BasicLogTest, Error) { absl::log_internal::ScopedMinLogLevel scoped_min_log_level(GetParam()); absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); + EXPECT_CALL(test_sink, Send).Times(0); const int log_line = __LINE__ + 1; auto do_log = [] { ABSL_TEST_LOG(ERROR) << "hello world"; }; @@ -187,6 +190,7 @@ TEST_P(BasicLogTest, DoNotSubmit) { absl::log_internal::ScopedMinLogLevel scoped_min_log_level(GetParam()); absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); + EXPECT_CALL(test_sink, Send).Times(0); const int log_line = __LINE__ + 1; auto do_log = [] { ABSL_TEST_LOG(DO_NOT_SUBMIT) << "hello world"; }; @@ -233,6 +237,7 @@ TEST_P(BasicLogDeathTest, Fatal) { { absl::ScopedMockLog test_sink( absl::MockLogDefault::kDisallowUnexpected); + EXPECT_CALL(test_sink, Send).Times(0); EXPECT_CALL(test_sink, Send) .Times(AnyNumber()) @@ -299,6 +304,7 @@ TEST_P(BasicLogDeathTest, QFatal) { { absl::ScopedMockLog test_sink( absl::MockLogDefault::kDisallowUnexpected); + EXPECT_CALL(test_sink, Send).Times(0); EXPECT_CALL(test_sink, Send) .Times(AnyNumber()) @@ -336,6 +342,7 @@ TEST_P(BasicLogTest, DFatal) { absl::log_internal::ScopedMinLogLevel scoped_min_log_level(GetParam()); absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); + EXPECT_CALL(test_sink, Send).Times(0); const int log_line = __LINE__ + 1; auto do_log = [] { ABSL_TEST_LOG(DFATAL) << "hello world"; }; @@ -375,6 +382,7 @@ TEST_P(BasicLogDeathTest, DFatal) { { absl::ScopedMockLog test_sink( absl::MockLogDefault::kDisallowUnexpected); + EXPECT_CALL(test_sink, Send).Times(0); EXPECT_CALL(test_sink, Send) .Times(AnyNumber()) @@ -456,6 +464,7 @@ TEST_P(BasicLogTest, Level) { for (auto severity : {absl::LogSeverity::kInfo, absl::LogSeverity::kWarning, absl::LogSeverity::kError}) { absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); + EXPECT_CALL(test_sink, Send).Times(0); const int log_line = __LINE__ + 2; auto do_log = [severity] { @@ -506,6 +515,7 @@ TEST_P(BasicLogDeathTest, Level) { { absl::ScopedMockLog test_sink( absl::MockLogDefault::kDisallowUnexpected); + EXPECT_CALL(test_sink, Send).Times(0); EXPECT_CALL(test_sink, Send) .Times(AnyNumber()) @@ -567,6 +577,7 @@ TEST_P(BasicLogTest, LevelClampsNegativeValues) { } absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); + EXPECT_CALL(test_sink, Send).Times(0); EXPECT_CALL(test_sink, Send(LogSeverity(Eq(absl::LogSeverity::kInfo)))); @@ -583,6 +594,7 @@ TEST_P(BasicLogTest, LevelClampsLargeValues) { } absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); + EXPECT_CALL(test_sink, Send).Times(0); EXPECT_CALL(test_sink, Send(LogSeverity(Eq(absl::LogSeverity::kError)))); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/log_entry.cc b/naiveproxy/src/third_party/abseil-cpp/absl/log/log_entry.cc new file mode 100644 index 0000000000..358b8f5a7c --- /dev/null +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/log_entry.cc @@ -0,0 +1,263 @@ +// Copyright 2025 The Abseil Authors +// +// Licensed under the Apache License, Version 2.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 "absl/log/log_entry.h" + +#include +#include +#include +#include +#include + +#include "absl/base/config.h" +#include "absl/log/internal/proto.h" +#include "absl/strings/escaping.h" +#include "absl/strings/string_view.h" +#include "absl/time/time.h" +#include "absl/types/span.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace { +// message `logging.proto.Event` +enum EventTag : uint8_t { + kFileName = 2, + kFileLine = 3, + kTimeNsecs = 4, + kSeverity = 5, + kThreadId = 6, + kValue = 7, + kSequenceNumber = 9, + kThreadName = 10, +}; + +// message `logging.proto.Value` +enum ValueTag : uint8_t { + kString = 1, + kStringLiteral = 6, +}; + +// enum `logging.proto.Severity` +enum Severity : int { + FINEST = 300, + FINER = 400, + FINE = 500, + VERBOSE_0 = 600, + CONFIG = 700, + INFO = 800, + NOTICE = 850, + WARNING = 900, + ERROR = 950, + SEVERE = 1000, + FATAL = 1100, +}; + +void PrintEscapedRangeTo(const absl::string_view str, + const absl::string_view substr, std::ostream* os) { + const absl::string_view head = + str.substr(0, static_cast(substr.data() - str.data())); + const char old_fill = os->fill(); + const auto old_flags = os->flags(); + *os << std::right + << std::setw(static_cast(absl::CHexEscape(head).size())) << ""; + switch (substr.size()) { + case 0: + *os << "\\"; + break; + case 1: + *os << "^"; + break; + default: + *os << "[" << std::setw(static_cast(absl::CHexEscape(substr).size())) + << std::setfill('-') << ")"; + break; + } + os->fill(old_fill); + os->flags(old_flags); +} +} // namespace +void PrintTo(const LogEntry& entry, std::ostream* os) { + auto text_message_with_prefix_and_newline_and_nul = absl::string_view( + entry.text_message_with_prefix_and_newline_and_nul_.data(), + entry.text_message_with_prefix_and_newline_and_nul_.size()); + *os << "LogEntry {\n" + << " source_filename: \"" << absl::CHexEscape(entry.source_filename()) + << "\"\n" + << " source_basename: \"" << absl::CHexEscape(entry.source_basename()) + << "\"\n" + << " source_line: " << entry.source_line() << "\n" + << " prefix: " << std::boolalpha << entry.prefix() << "\n" + << " log_severity: " << entry.log_severity() << "\n" + << " verbosity: " << entry.verbosity(); + if (entry.verbosity() == absl::LogEntry::kNoVerbosityLevel) { + *os << " (kNoVerbosityLevel)"; + } + *os << "\n" + << " timestamp: " << entry.timestamp() << "\n" + << " tid: " << entry.tid() << "\n" + << " text_message_with_prefix_and_newline_and_nul_: \"" + << absl::CHexEscape(text_message_with_prefix_and_newline_and_nul) + << "\"\n" + << " text_message_with_prefix_and_newline: "; + PrintEscapedRangeTo(text_message_with_prefix_and_newline_and_nul, + entry.text_message_with_prefix_and_newline(), os); + *os << "\n" + << " text_message_with_prefix: "; + PrintEscapedRangeTo(text_message_with_prefix_and_newline_and_nul, + entry.text_message_with_prefix(), os); + *os << "\n" + << " text_message_with_newline: "; + PrintEscapedRangeTo(text_message_with_prefix_and_newline_and_nul, + entry.text_message_with_newline(), os); + *os << "\n" + << " text_message: "; + PrintEscapedRangeTo(text_message_with_prefix_and_newline_and_nul, + entry.text_message(), os); + *os << "\n" + << " text_message_with_prefix_and_newline_c_str: "; + PrintEscapedRangeTo( + text_message_with_prefix_and_newline_and_nul, + // NOLINTNEXTLINE(bugprone-string-constructor) + absl::string_view(entry.text_message_with_prefix_and_newline_c_str(), 0), + os); + *os << "\n" + << " encoded_message (raw): \"" + << absl::CHexEscape(entry.encoded_message()) << "\"\n" + << " encoded_message {\n"; + absl::Span event = entry.encoded_message(); + log_internal::ProtoField field; + while (field.DecodeFrom(&event)) { + switch (field.tag()) { + case EventTag::kFileName: + *os << " file_name: \"" << absl::CHexEscape(field.string_value()) + << "\"\n"; + break; + case EventTag::kFileLine: + *os << " file_line: " << field.int32_value() << "\n"; + break; + case EventTag::kTimeNsecs: + *os << " time_nsecs: " << field.int64_value() << " (" + << absl::FromUnixNanos(field.int64_value()) << ")\n"; + break; + case EventTag::kSeverity: + *os << " severity: " << field.int32_value(); + switch (field.int32_value()) { + case Severity::FINEST: + *os << " (FINEST)"; + break; + case Severity::FINER: + *os << " (FINER)"; + break; + case Severity::FINE: + *os << " (FINE)"; + break; + case Severity::VERBOSE_0: + *os << " (VERBOSE_0)"; + break; + case Severity::CONFIG: + *os << " (CONFIG)"; + break; + case Severity::INFO: + *os << " (INFO)"; + break; + case Severity::NOTICE: + *os << " (NOTICE)"; + break; + case Severity::WARNING: + *os << " (WARNING)"; + break; + case Severity::ERROR: + *os << " (ERROR)"; + break; + case Severity::SEVERE: + *os << " (SEVERE)"; + break; + case Severity::FATAL: + *os << " (FATAL)"; + break; + } + *os << "\n"; + break; + case EventTag::kThreadId: + *os << " thread_id: " << field.int64_value() << "\n"; + break; + case EventTag::kValue: { + *os << " value {\n"; + auto value = field.bytes_value(); + while (field.DecodeFrom(&value)) { + switch (field.tag()) { + case ValueTag::kString: + *os << " str: \"" << absl::CHexEscape(field.string_value()) + << "\"\n"; + break; + case ValueTag::kStringLiteral: + *os << " literal: \"" + << absl::CHexEscape(field.string_value()) << "\"\n"; + break; + default: + *os << " unknown field " << field.tag(); + switch (field.type()) { + case log_internal::WireType::kVarint: + *os << " (VARINT): " << std::hex << std::showbase + << field.uint64_value() << std::dec << "\n"; + break; + case log_internal::WireType::k64Bit: + *os << " (I64): " << std::hex << std::showbase + << field.uint64_value() << std::dec << "\n"; + break; + case log_internal::WireType::kLengthDelimited: + *os << " (LEN): \"" << absl::CHexEscape(field.string_value()) + << "\"\n"; + break; + case log_internal::WireType::k32Bit: + *os << " (I32): " << std::hex << std::showbase + << field.uint32_value() << std::dec << "\n"; + break; + } + break; + } + } + *os << " }\n"; + break; + } + default: + *os << " unknown field " << field.tag(); + switch (field.type()) { + case log_internal::WireType::kVarint: + *os << " (VARINT): " << std::hex << std::showbase + << field.uint64_value() << std::dec << "\n"; + break; + case log_internal::WireType::k64Bit: + *os << " (I64): " << std::hex << std::showbase + << field.uint64_value() << std::dec << "\n"; + break; + case log_internal::WireType::kLengthDelimited: + *os << " (LEN): \"" << absl::CHexEscape(field.string_value()) + << "\"\n"; + break; + case log_internal::WireType::k32Bit: + *os << " (I32): " << std::hex << std::showbase + << field.uint32_value() << std::dec << "\n"; + break; + } + break; + } + } + *os << " }\n" + << " stacktrace: \"" << absl::CHexEscape(entry.stacktrace()) << "\"\n" + << "}"; +} + +ABSL_NAMESPACE_END +} // namespace absl diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/log_entry.h b/naiveproxy/src/third_party/abseil-cpp/absl/log/log_entry.h index 7a55dfe29e..c56685629c 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/log_entry.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/log_entry.h @@ -25,6 +25,7 @@ #define ABSL_LOG_LOG_ENTRY_H_ #include +#include #include #include "absl/base/attributes.h" @@ -213,6 +214,7 @@ class LogEntry final { friend class log_internal::LogEntryTestPeer; friend class log_internal::LogMessage; + friend void PrintTo(const absl::LogEntry& entry, std::ostream* os); }; ABSL_NAMESPACE_END diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/log/scoped_mock_log.h b/naiveproxy/src/third_party/abseil-cpp/absl/log/scoped_mock_log.h index a383066741..970087374e 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/log/scoped_mock_log.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/log/scoped_mock_log.h @@ -160,7 +160,13 @@ class ScopedMockLog final { // from the log message text, log message path and log message severity. // // If no expectations are specified for this mock, the default action is to - // forward the call to the `Log` mock. + // forward the call to the `Log` mock. Tests using `Send` are advised to call + // + // `EXPECT_CALL(sink, Send).Times(0);` + // + // prior to specifying other expectations to suppress forwarding to `Log`. + // That way, unexpected calls show up as calls to `Send` with complete data + // and metadata for easier debugging. MOCK_METHOD(void, Send, (const absl::LogEntry&)); // Implements the mock method: diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/meta/type_traits.h b/naiveproxy/src/third_party/abseil-cpp/absl/meta/type_traits.h index 02c1e6309c..59eb38ba81 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/meta/type_traits.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/meta/type_traits.h @@ -40,6 +40,7 @@ #include #include #include +#include #include #include "absl/base/attributes.h" @@ -168,6 +169,28 @@ template using remove_cvref_t = typename remove_cvref::type; #endif +#if defined(__cpp_lib_type_identity) && __cpp_lib_type_identity >= 201806L +template +using type_identity = std::type_identity; + +template +using type_identity_t = std::type_identity_t; +#else +// type_identity +// +// Back-fill of C++20's `std::type_identity`. +template +struct type_identity { + typedef T type; +}; + +// type_identity_t +// +// Back-fill of C++20's `std::type_identity_t`. +template +using type_identity_t = typename type_identity::type; +#endif + namespace type_traits_internal { #if (defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703L) || \ @@ -451,7 +474,7 @@ namespace type_traits_internal { // Detects if a class's definition has declared itself to be an owner by // declaring -// using absl_internal_is_view = std::true_type; +// using absl_internal_is_view = std::false_type; // as a member. // Types that don't want either must either omit this declaration entirely, or // (if e.g. inheriting from a base class) define the member to something that @@ -479,6 +502,17 @@ struct IsOwnerImpl< template struct IsOwner : IsOwnerImpl {}; +// This allows incomplete types to be used for associative containers, and also +// expands the set of types we can handle to include std::pair. +template +struct IsOwner> + : std::integral_constant< + bool, std::conditional_t, std::false_type, + IsOwner>>::value && + std::conditional_t, std::false_type, + IsOwner>>::value> { +}; + template struct IsOwner> : std::true_type {}; @@ -513,6 +547,13 @@ template struct IsView : std::integral_constant::value || IsViewImpl::value> {}; +// This allows incomplete types to be used for associative containers, and also +// expands the set of types we can handle to include std::pair. +template +struct IsView> + : std::integral_constant>::value && + IsView>::value> {}; + template struct IsView> : std::true_type {}; diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/numeric/int128.h b/naiveproxy/src/third_party/abseil-cpp/absl/numeric/int128.h index ae736b2846..32603b04ea 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/numeric/int128.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/numeric/int128.h @@ -164,9 +164,9 @@ class constexpr explicit operator __int128() const; constexpr explicit operator unsigned __int128() const; #endif // ABSL_HAVE_INTRINSIC_INT128 - explicit operator float() const; - explicit operator double() const; - explicit operator long double() const; + constexpr explicit operator float() const; + constexpr explicit operator double() const; + constexpr explicit operator long double() const; // Trivial copy constructor, assignment operator and destructor. @@ -357,14 +357,18 @@ class int128 { constexpr int128(unsigned long v); // NOLINT(runtime/int) constexpr int128(long long v); // NOLINT(runtime/int) constexpr int128(unsigned long long v); // NOLINT(runtime/int) + constexpr explicit int128(uint128 v); #ifdef ABSL_HAVE_INTRINSIC_INT128 constexpr int128(__int128 v); // NOLINT(runtime/explicit) constexpr explicit int128(unsigned __int128 v); -#endif // ABSL_HAVE_INTRINSIC_INT128 - constexpr explicit int128(uint128 v); + constexpr explicit int128(float v); + constexpr explicit int128(double v); + constexpr explicit int128(long double v); +#else explicit int128(float v); explicit int128(double v); explicit int128(long double v); +#endif // ABSL_HAVE_INTRINSIC_INT128 // Assignment operators from arithmetic types int128& operator=(int v); @@ -401,9 +405,9 @@ class int128 { constexpr explicit operator __int128() const; constexpr explicit operator unsigned __int128() const; #endif // ABSL_HAVE_INTRINSIC_INT128 - explicit operator float() const; - explicit operator double() const; - explicit operator long double() const; + constexpr explicit operator float() const; + constexpr explicit operator double() const; + constexpr explicit operator long double() const; // Trivial copy constructor, assignment operator and destructor. @@ -609,9 +613,15 @@ constexpr uint128 operator<<(uint128 lhs, int amount); constexpr uint128 operator>>(uint128 lhs, int amount); constexpr uint128 operator+(uint128 lhs, uint128 rhs); constexpr uint128 operator-(uint128 lhs, uint128 rhs); +#if defined(ABSL_HAVE_INTRINSIC_INT128) +constexpr uint128 operator*(uint128 lhs, uint128 rhs); +constexpr uint128 operator/(uint128 lhs, uint128 rhs); +constexpr uint128 operator%(uint128 lhs, uint128 rhs); +#else // ABSL_HAVE_INTRINSIC_INT128 uint128 operator*(uint128 lhs, uint128 rhs); uint128 operator/(uint128 lhs, uint128 rhs); uint128 operator%(uint128 lhs, uint128 rhs); +#endif // ABSL_HAVE_INTRINSIC_INT128 inline uint128& uint128::operator<<=(int amount) { *this = *this << amount; @@ -788,18 +798,18 @@ constexpr uint128::operator unsigned __int128() const { // Conversion operators to floating point types. -inline uint128::operator float() const { +constexpr uint128::operator float() const { // Note: This method might return Inf. constexpr float pow_2_64 = 18446744073709551616.0f; return static_cast(lo_) + static_cast(hi_) * pow_2_64; } -inline uint128::operator double() const { +constexpr uint128::operator double() const { constexpr double pow_2_64 = 18446744073709551616.0; return static_cast(lo_) + static_cast(hi_) * pow_2_64; } -inline uint128::operator long double() const { +constexpr uint128::operator long double() const { constexpr long double pow_2_64 = 18446744073709551616.0L; return static_cast(lo_) + static_cast(hi_) * pow_2_64; @@ -1021,19 +1031,15 @@ constexpr uint128 operator-(uint128 lhs, uint128 rhs) { #endif } +#if !defined(ABSL_HAVE_INTRINSIC_INT128) inline uint128 operator*(uint128 lhs, uint128 rhs) { -#if defined(ABSL_HAVE_INTRINSIC_INT128) - // TODO(strel) Remove once alignment issues are resolved and unsigned __int128 - // can be used for uint128 storage. - return static_cast(lhs) * - static_cast(rhs); -#elif defined(_MSC_VER) && defined(_M_X64) && !defined(_M_ARM64EC) +#if defined(_MSC_VER) && defined(_M_X64) && !defined(_M_ARM64EC) uint64_t carry; uint64_t low = _umul128(Uint128Low64(lhs), Uint128Low64(rhs), &carry); return MakeUint128(Uint128Low64(lhs) * Uint128High64(rhs) + Uint128High64(lhs) * Uint128Low64(rhs) + carry, low); -#else // ABSL_HAVE_INTRINSIC128 +#else // _MSC_VER uint64_t a32 = Uint128Low64(lhs) >> 32; uint64_t a00 = Uint128Low64(lhs) & 0xffffffff; uint64_t b32 = Uint128Low64(rhs) >> 32; @@ -1045,16 +1051,24 @@ inline uint128 operator*(uint128 lhs, uint128 rhs) { result += uint128(a32 * b00) << 32; result += uint128(a00 * b32) << 32; return result; -#endif // ABSL_HAVE_INTRINSIC128 +#endif // _MSC_VER } +#endif // ABSL_HAVE_INTRINSIC_INT128 #if defined(ABSL_HAVE_INTRINSIC_INT128) -inline uint128 operator/(uint128 lhs, uint128 rhs) { +constexpr uint128 operator*(uint128 lhs, uint128 rhs) { + // TODO(strel) Remove once alignment issues are resolved and unsigned __int128 + // can be used for uint128 storage. + return static_cast(lhs) * + static_cast(rhs); +} + +constexpr uint128 operator/(uint128 lhs, uint128 rhs) { return static_cast(lhs) / static_cast(rhs); } -inline uint128 operator%(uint128 lhs, uint128 rhs) { +constexpr uint128 operator%(uint128 lhs, uint128 rhs) { return static_cast(lhs) % static_cast(rhs); } @@ -1112,9 +1126,15 @@ inline int128& int128::operator=(unsigned long long v) { constexpr int128 operator-(int128 v); constexpr int128 operator+(int128 lhs, int128 rhs); constexpr int128 operator-(int128 lhs, int128 rhs); +#if defined(ABSL_HAVE_INTRINSIC_INT128) +constexpr int128 operator*(int128 lhs, int128 rhs); +constexpr int128 operator/(int128 lhs, int128 rhs); +constexpr int128 operator%(int128 lhs, int128 rhs); +#else int128 operator*(int128 lhs, int128 rhs); int128 operator/(int128 lhs, int128 rhs); int128 operator%(int128 lhs, int128 rhs); +#endif // ABSL_HAVE_INTRINSIC_INT128 constexpr int128 operator|(int128 lhs, int128 rhs); constexpr int128 operator&(int128 lhs, int128 rhs); constexpr int128 operator^(int128 lhs, int128 rhs); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc b/naiveproxy/src/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc index 216115a412..dea1d213c9 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc @@ -73,17 +73,11 @@ constexpr int128::int128(unsigned long long v) : v_{v} {} constexpr int128::int128(unsigned __int128 v) : v_{static_cast<__int128>(v)} {} -inline int128::int128(float v) { - v_ = static_cast<__int128>(v); -} +constexpr int128::int128(float v) : v_{static_cast<__int128>(v)} {} -inline int128::int128(double v) { - v_ = static_cast<__int128>(v); -} +constexpr int128::int128(double v) : v_{static_cast<__int128>(v)} {} -inline int128::int128(long double v) { - v_ = static_cast<__int128>(v); -} +constexpr int128::int128(long double v) : v_{static_cast<__int128>(v)} {} constexpr int128::int128(uint128 v) : v_{static_cast<__int128>(v)} {} @@ -119,9 +113,7 @@ constexpr int128::operator unsigned short() const { // NOLINT(runtime/int) return static_cast(v_); // NOLINT(runtime/int) } -constexpr int128::operator int() const { - return static_cast(v_); -} +constexpr int128::operator int() const { return static_cast(v_); } constexpr int128::operator unsigned int() const { return static_cast(v_); @@ -153,17 +145,17 @@ constexpr int128::operator unsigned __int128() const { // conversions. In that case, we do the conversion with a similar implementation // to the conversion operators in int128_no_intrinsic.inc. #if defined(__clang__) && !defined(__ppc64__) -inline int128::operator float() const { return static_cast(v_); } +constexpr int128::operator float() const { return static_cast(v_); } -inline int128::operator double() const { return static_cast(v_); } +constexpr int128::operator double() const { return static_cast(v_); } -inline int128::operator long double() const { +constexpr int128::operator long double() const { return static_cast(v_); } -#else // Clang on PowerPC +#else // Clang on PowerPC -inline int128::operator float() const { +constexpr int128::operator float() const { // We must convert the absolute value and then negate as needed, because // floating point types are typically sign-magnitude. Otherwise, the // difference between the high and low 64 bits when interpreted as two's @@ -177,7 +169,7 @@ inline int128::operator float() const { static_cast(Int128High64(*this)) * pow_2_64; } -inline int128::operator double() const { +constexpr int128::operator double() const { // See comment in int128::operator float() above. constexpr double pow_2_64 = 18446744073709551616.0; return v_ < 0 && *this != Int128Min() @@ -186,7 +178,7 @@ inline int128::operator double() const { static_cast(Int128High64(*this)) * pow_2_64; } -inline int128::operator long double() const { +constexpr int128::operator long double() const { // See comment in int128::operator float() above. constexpr long double pow_2_64 = 18446744073709551616.0L; return v_ < 0 && *this != Int128Min() @@ -254,17 +246,19 @@ constexpr int128 operator-(int128 lhs, int128 rhs) { return static_cast<__int128>(lhs) - static_cast<__int128>(rhs); } -inline int128 operator*(int128 lhs, int128 rhs) { +#if defined(ABSL_HAVE_INTRINSIC_INT128) +constexpr int128 operator*(int128 lhs, int128 rhs) { return static_cast<__int128>(lhs) * static_cast<__int128>(rhs); } -inline int128 operator/(int128 lhs, int128 rhs) { +constexpr int128 operator/(int128 lhs, int128 rhs) { return static_cast<__int128>(lhs) / static_cast<__int128>(rhs); } -inline int128 operator%(int128 lhs, int128 rhs) { +constexpr int128 operator%(int128 lhs, int128 rhs) { return static_cast<__int128>(lhs) % static_cast<__int128>(rhs); } +#endif // ABSL_HAVE_INTRINSIC_INT128 inline int128 int128::operator++(int) { int128 tmp(*this); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc b/naiveproxy/src/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc index a7cdceabfa..48bec2cc8f 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc @@ -132,7 +132,7 @@ constexpr int128::operator unsigned long long() const { // NOLINT(runtime/int) return static_cast(lo_); // NOLINT(runtime/int) } -inline int128::operator float() const { +constexpr int128::operator float() const { // We must convert the absolute value and then negate as needed, because // floating point types are typically sign-magnitude. Otherwise, the // difference between the high and low 64 bits when interpreted as two's @@ -142,20 +142,18 @@ inline int128::operator float() const { constexpr float pow_2_64 = 18446744073709551616.0f; return hi_ < 0 && *this != Int128Min() ? -static_cast(-*this) - : static_cast(lo_) + - static_cast(hi_) * pow_2_64; + : static_cast(lo_) + static_cast(hi_) * pow_2_64; } -inline int128::operator double() const { +constexpr int128::operator double() const { // See comment in int128::operator float() above. constexpr double pow_2_64 = 18446744073709551616.0; return hi_ < 0 && *this != Int128Min() ? -static_cast(-*this) - : static_cast(lo_) + - static_cast(hi_) * pow_2_64; + : static_cast(lo_) + static_cast(hi_) * pow_2_64; } -inline int128::operator long double() const { +constexpr int128::operator long double() const { // See comment in int128::operator float() above. constexpr long double pow_2_64 = 18446744073709551616.0L; return hi_ < 0 && *this != Int128Min() diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/profiling/hashtable.cc b/naiveproxy/src/third_party/abseil-cpp/absl/profiling/hashtable.cc index bfec0d56c3..407c6b4078 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/profiling/hashtable.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/profiling/hashtable.cc @@ -42,6 +42,8 @@ StatusOr MarshalHashtableProfile() { namespace debugging_internal { +static void DroppedHashtableSample() {} + StatusOr MarshalHashtableProfile( container_internal::HashtablezSampler& sampler, Time now) { static constexpr absl::string_view kDropFrames = @@ -111,10 +113,18 @@ StatusOr MarshalHashtableProfile( MakeSpan(info.stack, info.depth), labels); }); - // TODO(b/262310142): Make this more structured data. - StringId comment_id = - builder.InternString(StrCat("dropped_samples: ", dropped)); - builder.set_comment_id(comment_id); + if (dropped > 0) { + // If we dropped samples, we don't have information for them, including + // their sizes. The non-zero weight allows it to be noticed in the profile + // and examined more closely. + // + // We compensate for the fixup done by AddSample by adjusting the address + // here. + const void* kFakeStack[] = { + absl::bit_cast( + reinterpret_cast(&DroppedHashtableSample)+1)}; + builder.AddSample(static_cast(dropped), kFakeStack, {}); + } builder.AddCurrentMappings(); return std::move(builder).Emit(); } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h b/naiveproxy/src/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h index 84843fdf98..88a4b27171 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h @@ -130,7 +130,7 @@ SampleRecorder::SetDisposeCallback(DisposeCallback f) { template SampleRecorder::SampleRecorder() : dropped_samples_(0), size_estimate_(0), all_(nullptr), dispose_(nullptr) { - absl::MutexLock l(&graveyard_.init_mu); + absl::MutexLock l(graveyard_.init_mu); graveyard_.dead = &graveyard_; } @@ -159,8 +159,8 @@ void SampleRecorder::PushDead(T* sample) { dispose(*sample); } - absl::MutexLock graveyard_lock(&graveyard_.init_mu); - absl::MutexLock sample_lock(&sample->init_mu); + absl::MutexLock graveyard_lock(graveyard_.init_mu); + absl::MutexLock sample_lock(sample->init_mu); sample->dead = graveyard_.dead; graveyard_.dead = sample; } @@ -168,7 +168,7 @@ void SampleRecorder::PushDead(T* sample) { template template T* SampleRecorder::PopDead(Targs... args) { - absl::MutexLock graveyard_lock(&graveyard_.init_mu); + absl::MutexLock graveyard_lock(graveyard_.init_mu); // The list is circular, so eventually it collapses down to // graveyard_.dead == &graveyard_ @@ -176,7 +176,7 @@ T* SampleRecorder::PopDead(Targs... args) { T* sample = graveyard_.dead; if (sample == &graveyard_) return nullptr; - absl::MutexLock sample_lock(&sample->init_mu); + absl::MutexLock sample_lock(sample->init_mu); graveyard_.dead = sample->dead; sample->dead = nullptr; sample->PrepareForSampling(std::forward(args)...); @@ -198,7 +198,7 @@ T* SampleRecorder::Register(Targs&&... args) { // Resurrection failed. Hire a new warlock. sample = new T(); { - absl::MutexLock sample_lock(&sample->init_mu); + absl::MutexLock sample_lock(sample->init_mu); // If flag initialization happens to occur (perhaps in another thread) // while in this block, it will lock `graveyard_` which is usually always // locked before any sample. This will appear as a lock inversion. @@ -226,7 +226,7 @@ size_t SampleRecorder::Iterate( const std::function& f) { T* s = all_.load(std::memory_order_acquire); while (s != nullptr) { - absl::MutexLock l(&s->init_mu); + absl::MutexLock l(s->init_mu); if (s->dead == nullptr) { f(*s); } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/BUILD.bazel b/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/BUILD.bazel index a9adea3c88..1a3fef849b 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/BUILD.bazel +++ b/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/BUILD.bazel @@ -802,6 +802,7 @@ cc_test( linkopts = ABSL_DEFAULT_LINKOPTS, tags = [ "benchmark", + "no_test_ios_sim_arm64", "no_test_ios_x86_64", "no_test_loonix", # Crashing. "no_test_wasm", diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/entropy_pool.cc b/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/entropy_pool.cc index fa47d0de6f..1386700512 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/entropy_pool.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/entropy_pool.cc @@ -55,7 +55,7 @@ class alignas(std::max(size_t{ABSL_CACHELINE_SIZE}, size_t{32})) RandenTraits::kCapacityBytes / sizeof(uint32_t); void Init(absl::Span data) { - SpinLockHolder l(&mu_); // Always uncontested. + SpinLockHolder l(mu_); // Always uncontested. std::copy(data.begin(), data.end(), std::begin(state_)); next_ = kState; } @@ -84,7 +84,7 @@ class alignas(std::max(size_t{ABSL_CACHELINE_SIZE}, size_t{32})) }; void RandenPoolEntry::Fill(uint8_t* out, size_t bytes) { - SpinLockHolder l(&mu_); + SpinLockHolder l(mu_); while (bytes > 0) { MaybeRefill(); size_t remaining = available() * sizeof(state_[0]); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/platform.h b/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/platform.h index bd2993e181..a6fde4b277 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/platform.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/platform.h @@ -35,7 +35,6 @@ // Darwin (macOS and iOS) __APPLE__ // Akaros (http://akaros.org) __ros__ // Windows _WIN32 -// NaCL __native_client__ // AsmJS __asmjs__ // WebAssembly __wasm__ // Fuchsia __Fuchsia__ @@ -125,12 +124,6 @@ #endif -// NaCl does not allow AES. -#if defined(__native_client__) -#undef ABSL_HAVE_ACCELERATED_AES -#define ABSL_HAVE_ACCELERATED_AES 0 -#endif - // ABSL_RANDOM_INTERNAL_AES_DISPATCH indicates whether the currently active // platform has, or should use run-time dispatch for selecting the // accelerated Randen implementation. @@ -162,10 +155,4 @@ #define ABSL_RANDOM_INTERNAL_AES_DISPATCH 1 #endif -// NaCl does not allow dispatch. -#if defined(__native_client__) -#undef ABSL_RANDOM_INTERNAL_AES_DISPATCH -#define ABSL_RANDOM_INTERNAL_AES_DISPATCH 0 -#endif - #endif // ABSL_RANDOM_INTERNAL_PLATFORM_H_ diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/seed_material.cc b/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/seed_material.cc index 8099ec7360..b6380c8374 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/seed_material.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/random/internal/seed_material.cc @@ -41,12 +41,7 @@ #include "absl/types/optional.h" #include "absl/types/span.h" -#if defined(__native_client__) - -#include -#define ABSL_RANDOM_USE_NACL_SECURE_RANDOM 1 - -#elif defined(_WIN32) +#if defined(_WIN32) #include #define ABSL_RANDOM_USE_BCRYPT 1 @@ -109,27 +104,6 @@ bool ReadSeedMaterialFromOSEntropyImpl(absl::Span values) { return BCRYPT_SUCCESS(ret); } -#elif defined(ABSL_RANDOM_USE_NACL_SECURE_RANDOM) - -// On NaCL use nacl_secure_random to acquire bytes. -bool ReadSeedMaterialFromOSEntropyImpl(absl::Span values) { - auto buffer = reinterpret_cast(values.data()); - size_t buffer_size = sizeof(uint32_t) * values.size(); - - uint8_t* output_ptr = buffer; - while (buffer_size > 0) { - size_t nread = 0; - const int error = nacl_secure_random(output_ptr, buffer_size, &nread); - if (error != 0 || nread > buffer_size) { - ABSL_RAW_LOG(ERROR, "Failed to read secure_random seed data: %d", error); - return false; - } - output_ptr += nread; - buffer_size -= nread; - } - return true; -} - #elif defined(__Fuchsia__) bool ReadSeedMaterialFromOSEntropyImpl(absl::Span values) { diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/status/internal/status_internal.h b/naiveproxy/src/third_party/abseil-cpp/absl/status/internal/status_internal.h index 45b90f3648..35a9f9b99f 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/status/internal/status_internal.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/status/internal/status_internal.h @@ -38,9 +38,11 @@ ABSL_NAMESPACE_BEGIN // TODO(b/176172494): ABSL_MUST_USE_RESULT should expand to the more strict // [[nodiscard]]. For now, just use [[nodiscard]] directly when it is available. #if ABSL_HAVE_CPP_ATTRIBUTE(nodiscard) -class [[nodiscard]] ABSL_ATTRIBUTE_TRIVIAL_ABI Status; +class [[nodiscard]] ABSL_ATTRIBUTE_TRIVIAL_ABI + Status; #else -class ABSL_MUST_USE_RESULT ABSL_ATTRIBUTE_TRIVIAL_ABI Status; +class ABSL_MUST_USE_RESULT ABSL_ATTRIBUTE_TRIVIAL_ABI + Status; #endif ABSL_NAMESPACE_END } // namespace absl diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/status/internal/statusor_internal.h b/naiveproxy/src/third_party/abseil-cpp/absl/status/internal/statusor_internal.h index b6641041ea..8a4e2f5267 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/status/internal/statusor_internal.h @@ -29,7 +29,8 @@ namespace absl { ABSL_NAMESPACE_BEGIN template -class ABSL_MUST_USE_RESULT StatusOr; +class ABSL_MUST_USE_RESULT + StatusOr; namespace internal_statusor { diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/status/statusor.h b/naiveproxy/src/third_party/abseil-cpp/absl/status/statusor.h index 56309af32e..52294ee2f9 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/status/statusor.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/status/statusor.h @@ -45,8 +45,8 @@ #include #include "absl/base/attributes.h" -#include "absl/base/nullability.h" #include "absl/base/call_once.h" +#include "absl/base/nullability.h" #include "absl/meta/type_traits.h" #include "absl/status/internal/statusor_internal.h" #include "absl/status/status.h" diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/BUILD.bazel b/naiveproxy/src/third_party/abseil-cpp/absl/strings/BUILD.bazel index 2e73f80fec..1ecc069e07 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/BUILD.bazel +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/BUILD.bazel @@ -102,6 +102,7 @@ cc_library( deps = [ ":charset", ":internal", + ":resize_and_overwrite", ":string_view", "//absl/base", "//absl/base:config", @@ -142,6 +143,33 @@ cc_library( ], ) +cc_library( + name = "resize_and_overwrite", + hdrs = ["resize_and_overwrite.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + "//absl/base:config", + "//absl/base:core_headers", + "//absl/base:dynamic_annotations", + "//absl/base:throw_delegate", + ], +) + +cc_test( + name = "resize_and_overwrite_test", + srcs = ["resize_and_overwrite_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":resize_and_overwrite", + "//absl/base:dynamic_annotations", + "//absl/log:absl_check", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + cc_test( name = "match_test", size = "small", @@ -602,6 +630,7 @@ cc_library( ":cordz_update_scope", ":cordz_update_tracker", ":internal", + ":resize_and_overwrite", ":strings", "//absl/base:config", "//absl/base:core_headers", @@ -654,6 +683,7 @@ cc_library( "//absl/base", "//absl/base:config", "//absl/base:core_headers", + "//absl/base:no_destructor", "//absl/base:raw_logging_internal", "//absl/container:inlined_vector", "//absl/debugging:stacktrace", @@ -1095,12 +1125,12 @@ cc_test( name = "resize_uninitialized_test", size = "small", srcs = [ - "internal/resize_uninitialized.h", "internal/resize_uninitialized_test.cc", ], copts = ABSL_TEST_COPTS, visibility = ["//visibility:private"], deps = [ + ":internal", "//absl/base:core_headers", "//absl/meta:type_traits", "@googletest//:gtest", diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/BUILD.gn b/naiveproxy/src/third_party/abseil-cpp/absl/strings/BUILD.gn index 51c3e690b8..67a58aee6b 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/BUILD.gn +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/BUILD.gn @@ -68,6 +68,7 @@ absl_source_set("strings") { deps = [ ":charset", ":internal", + ":resize_and_overwrite", ":string_view", "//third_party/abseil-cpp/absl/base", "//third_party/abseil-cpp/absl/base:config", @@ -105,6 +106,25 @@ absl_source_set("internal") { ] } +absl_source_set("resize_and_overwrite") { + public = [ "resize_and_overwrite.h" ] + deps = [ + "//third_party/abseil-cpp/absl/base:dynamic_annotations", + "//third_party/abseil-cpp/absl/base:config", + "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/base:throw_delegate", + ] +} + +absl_test("resize_and_overwrite_test") { + sources = [ "resize_and_overwrite_test.cc" ] + deps = [ + ":resize_and_overwrite", + "//third_party/abseil-cpp/absl/base:dynamic_annotations", + "//third_party/abseil-cpp/absl/log:absl_check", + ] +} + absl_source_set("str_format") { public = [ "str_format.h" ] deps = [ @@ -366,6 +386,7 @@ absl_source_set("cord") { ":cordz_update_scope", ":cordz_update_tracker", ":internal", + ":resize_and_overwrite", ":string_view", ":strings", "//third_party/abseil-cpp/absl/base:config", @@ -411,6 +432,7 @@ absl_source_set("cordz_info") { "//third_party/abseil-cpp/absl/base", "//third_party/abseil-cpp/absl/base:config", "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/base:no_destructor", "//third_party/abseil-cpp/absl/base:raw_logging_internal", "//third_party/abseil-cpp/absl/container:inlined_vector", "//third_party/abseil-cpp/absl/debugging:stacktrace", diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/CMakeLists.txt b/naiveproxy/src/third_party/abseil-cpp/absl/strings/CMakeLists.txt index 32ad263c1e..da44ef7f2d 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/CMakeLists.txt +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/CMakeLists.txt @@ -77,6 +77,7 @@ absl_cc_library( DEPS absl::string_view absl::strings_internal + absl::strings_resize_and_overwrite absl::base absl::bits absl::charset @@ -141,6 +142,34 @@ absl_cc_library( absl::type_traits ) +absl_cc_library( + NAME + strings_resize_and_overwrite + HDRS + "resize_and_overwrite.h" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::config + absl::core_headers + absl::dynamic_annotations + absl::throw_delegate +) + +absl_cc_test( + NAME + strings_resize_and_overwrite_test + SRCS + "resize_and_overwrite_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::strings_resize_and_overwrite + absl::absl_check + absl::dynamic_annotations + GTest::gmock_main +) + absl_cc_test( NAME match_test @@ -337,11 +366,11 @@ absl_cc_test( NAME resize_uninitialized_test SRCS - "internal/resize_uninitialized.h" "internal/resize_uninitialized_test.cc" COPTS ${ABSL_TEST_COPTS} DEPS + absl::strings_internal absl::base absl::core_headers absl::type_traits @@ -845,6 +874,7 @@ absl_cc_library( absl::cordz_statistics absl::cordz_update_tracker absl::core_headers + absl::no_destructor absl::inlined_vector absl::span absl::raw_logging_internal @@ -1000,6 +1030,7 @@ absl_cc_library( absl::raw_logging_internal absl::span absl::strings + absl::strings_resize_and_overwrite absl::type_traits absl::weakly_mixed_integer PUBLIC diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/ascii.h b/naiveproxy/src/third_party/abseil-cpp/absl/strings/ascii.h index ca0747e56b..6a75b1f7e4 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/ascii.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/ascii.h @@ -61,6 +61,7 @@ #include "absl/base/config.h" #include "absl/base/nullability.h" #include "absl/strings/internal/resize_uninitialized.h" +#include "absl/strings/resize_and_overwrite.h" #include "absl/strings/string_view.h" namespace absl { @@ -190,8 +191,10 @@ void AsciiStrToLower(std::string* absl_nonnull s); // Creates a lowercase string from a given absl::string_view. [[nodiscard]] inline std::string AsciiStrToLower(absl::string_view s) { std::string result; - strings_internal::STLStringResizeUninitialized(&result, s.size()); - ascii_internal::AsciiStrToLower(&result[0], s.data(), s.size()); + StringResizeAndOverwrite(result, s.size(), [s](char* buf, size_t buf_size) { + ascii_internal::AsciiStrToLower(buf, s.data(), s.size()); + return buf_size; + }); return result; } @@ -219,8 +222,10 @@ void AsciiStrToUpper(std::string* absl_nonnull s); // Creates an uppercase string from a given absl::string_view. [[nodiscard]] inline std::string AsciiStrToUpper(absl::string_view s) { std::string result; - strings_internal::STLStringResizeUninitialized(&result, s.size()); - ascii_internal::AsciiStrToUpper(&result[0], s.data(), s.size()); + StringResizeAndOverwrite(result, s.size(), [s](char* buf, size_t buf_size) { + ascii_internal::AsciiStrToUpper(buf, s.data(), s.size()); + return buf_size; + }); return result; } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/cord.cc b/naiveproxy/src/third_party/abseil-cpp/absl/strings/cord.cc index e53f914dbb..91fcf91cbd 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/cord.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/cord.cc @@ -52,6 +52,7 @@ #include "absl/strings/internal/cordz_update_tracker.h" #include "absl/strings/internal/resize_uninitialized.h" #include "absl/strings/match.h" +#include "absl/strings/resize_and_overwrite.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "absl/strings/strip.h" @@ -161,8 +162,10 @@ static CordRep* absl_nonnull CordRepFromString(std::string&& src) { // -------------------------------------------------------------------- // Cord::InlineRep functions -inline void Cord::InlineRep::set_data(const char* absl_nonnull data, size_t n) { +inline void Cord::InlineRep::set_data(const char* absl_nullable data, + size_t n) { static_assert(kMaxInline == 15, "set_data is hard-coded for a length of 15"); + assert(data != nullptr || n == 0); data_.set_inline_data(data, n); } @@ -1053,8 +1056,11 @@ void CopyCordToString(const Cord& src, std::string* absl_nonnull dst) { if (!src.contents_.is_tree()) { src.contents_.CopyTo(dst); } else { - absl::strings_internal::STLStringResizeUninitialized(dst, src.size()); - src.CopyToArraySlowPath(&(*dst)[0]); + StringResizeAndOverwrite(*dst, src.size(), + [&src](char* buf, size_t buf_size) { + src.CopyToArraySlowPath(buf); + return buf_size; + }); } } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/cord.h b/naiveproxy/src/third_party/abseil-cpp/absl/strings/cord.h index edda551ae8..fa6eb8ad21 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/cord.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/cord.h @@ -921,7 +921,7 @@ class Cord { // Returns nullptr if holding pointer const char* absl_nullable data() const; // Discards pointer, if any - void set_data(const char* absl_nonnull data, size_t n); + void set_data(const char* absl_nullable data, size_t n); char* absl_nonnull set_data(size_t n); // Write data to the result // Returns nullptr if holding bytes absl::cord_internal::CordRep* absl_nullable tree() const; diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cord_internal.h b/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cord_internal.h index cf1f703bfc..66375612d2 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cord_internal.h @@ -381,6 +381,8 @@ struct CordRepExternalImpl this->releaser_invoker = &Release; } + const Releaser* releaser() const { return &this->template get<0>(); } + ~CordRepExternalImpl() { InvokeReleaser(Rank1{}, std::move(this->template get<0>()), absl::string_view(base, length)); @@ -915,8 +917,6 @@ inline CordRep* CordRep::Ref(CordRep* rep) { inline void CordRep::Unref(CordRep* rep) { assert(rep != nullptr); - // Expect refcount to be 0. Avoiding the cost of an atomic decrement should - // typically outweigh the cost of an extra branch checking for ref == 1. if (ABSL_PREDICT_FALSE(!rep->refcount.DecrementExpectHighRefcount())) { Destroy(rep); } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc b/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc index 53d5f529a7..a4f47f0a13 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc @@ -54,7 +54,7 @@ static Queue& GlobalQueue() { CordzHandle::CordzHandle(bool is_snapshot) : is_snapshot_(is_snapshot) { Queue& global_queue = GlobalQueue(); if (is_snapshot) { - MutexLock lock(&global_queue.mutex); + MutexLock lock(global_queue.mutex); CordzHandle* dq_tail = global_queue.dq_tail.load(std::memory_order_acquire); if (dq_tail != nullptr) { dq_prev_ = dq_tail; @@ -69,7 +69,7 @@ CordzHandle::~CordzHandle() { if (is_snapshot_) { std::vector to_delete; { - MutexLock lock(&global_queue.mutex); + MutexLock lock(global_queue.mutex); CordzHandle* next = dq_next_; if (dq_prev_ == nullptr) { // We were head of the queue, delete every CordzHandle until we reach @@ -103,7 +103,7 @@ void CordzHandle::Delete(CordzHandle* handle) { if (handle) { Queue& queue = GlobalQueue(); if (!handle->SafeToDelete()) { - MutexLock lock(&queue.mutex); + MutexLock lock(queue.mutex); CordzHandle* dq_tail = queue.dq_tail.load(std::memory_order_acquire); if (dq_tail != nullptr) { handle->dq_prev_ = dq_tail; @@ -119,7 +119,7 @@ void CordzHandle::Delete(CordzHandle* handle) { std::vector CordzHandle::DiagnosticsGetDeleteQueue() { std::vector handles; Queue& global_queue = GlobalQueue(); - MutexLock lock(&global_queue.mutex); + MutexLock lock(global_queue.mutex); CordzHandle* dq_tail = global_queue.dq_tail.load(std::memory_order_acquire); for (const CordzHandle* p = dq_tail; p; p = p->dq_prev_) { handles.push_back(p); @@ -134,7 +134,7 @@ bool CordzHandle::DiagnosticsHandleIsSafeToInspect( if (handle->is_snapshot_) return false; bool snapshot_found = false; Queue& global_queue = GlobalQueue(); - MutexLock lock(&global_queue.mutex); + MutexLock lock(global_queue.mutex); for (const CordzHandle* p = global_queue.dq_tail; p; p = p->dq_prev_) { if (p == handle) return !snapshot_found; if (p == this) snapshot_found = true; @@ -151,7 +151,7 @@ CordzHandle::DiagnosticsGetSafeToInspectDeletedHandles() { } Queue& global_queue = GlobalQueue(); - MutexLock lock(&global_queue.mutex); + MutexLock lock(global_queue.mutex); for (const CordzHandle* p = dq_next_; p != nullptr; p = p->dq_next_) { if (!p->is_snapshot()) { handles.push_back(p); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc b/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc index 4baaecdcf6..38fb473160 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc @@ -17,7 +17,8 @@ #include #include "absl/base/config.h" -#include "absl/base/internal/spinlock.h" +#include "absl/base/const_init.h" +#include "absl/base/no_destructor.h" #include "absl/container/inlined_vector.h" #include "absl/debugging/stacktrace.h" #include "absl/strings/internal/cord_internal.h" @@ -34,8 +35,6 @@ namespace absl { ABSL_NAMESPACE_BEGIN namespace cord_internal { -ABSL_CONST_INIT CordzInfo::List CordzInfo::global_list_{absl::kConstInit}; - namespace { // CordRepAnalyzer performs the analysis of a cord. @@ -221,24 +220,32 @@ class CordRepAnalyzer { } // namespace +CordzInfo::List* CordzInfo::GlobalList() { + static absl::NoDestructor list; + return list.get(); +} + CordzInfo* CordzInfo::Head(const CordzSnapshot& snapshot) { ABSL_ASSERT(snapshot.is_snapshot()); - // We can do an 'unsafe' load of 'head', as we are guaranteed that the - // instance it points to is kept alive by the provided CordzSnapshot, so we - // can simply return the current value using an acquire load. + // We obtain the lock here as we must synchronize the first call into the list + // with any concurrent 'Untrack()` operation to avoid any read in the list to + // reorder before the observation of the thread 'untracking a cord' of the + // delete queue being empty or not. After this all next observations are safe + // as we have established all subsequent untracks will be queued for delete. // We do enforce in DEBUG builds that the 'head' value is present in the - // delete queue: ODR violations may lead to 'snapshot' and 'global_list_' + // delete queue: ODR violations may lead to 'snapshot' and 'global_list' // being in different libraries / modules. - CordzInfo* head = global_list_.head.load(std::memory_order_acquire); - ABSL_ASSERT(snapshot.DiagnosticsHandleIsSafeToInspect(head)); - return head; + auto global_list = GlobalList(); + absl::MutexLock l(global_list->mutex); + ABSL_ASSERT(snapshot.DiagnosticsHandleIsSafeToInspect(global_list->head)); + return global_list->head; } CordzInfo* CordzInfo::Next(const CordzSnapshot& snapshot) const { ABSL_ASSERT(snapshot.is_snapshot()); - // Similar to the 'Head()' function, we do not need a mutex here. + // We do not need a lock here. See also comments in Head(). CordzInfo* next = ci_next_.load(std::memory_order_acquire); ABSL_ASSERT(snapshot.DiagnosticsHandleIsSafeToInspect(this)); ABSL_ASSERT(snapshot.DiagnosticsHandleIsSafeToInspect(next)); @@ -327,22 +334,21 @@ CordzInfo::~CordzInfo() { } void CordzInfo::Track() { - SpinLockHolder l(&list_->mutex); - - CordzInfo* const head = list_->head.load(std::memory_order_acquire); + absl::MutexLock l(list_->mutex); + CordzInfo* const head = list_->head; if (head != nullptr) { head->ci_prev_.store(this, std::memory_order_release); } ci_next_.store(head, std::memory_order_release); - list_->head.store(this, std::memory_order_release); + list_->head = this; } void CordzInfo::Untrack() { ODRCheck(); { - SpinLockHolder l(&list_->mutex); + absl::MutexLock l(list_->mutex); - CordzInfo* const head = list_->head.load(std::memory_order_acquire); + CordzInfo* const head = list_->head; CordzInfo* const next = ci_next_.load(std::memory_order_acquire); CordzInfo* const prev = ci_prev_.load(std::memory_order_acquire); @@ -356,7 +362,7 @@ void CordzInfo::Untrack() { prev->ci_next_.store(next, std::memory_order_release); } else { ABSL_ASSERT(head == this); - list_->head.store(next, std::memory_order_release); + list_->head = next; } } @@ -370,7 +376,7 @@ void CordzInfo::Untrack() { // We are likely part of a snapshot, extend the life of the CordRep { - absl::MutexLock lock(&mutex_); + absl::MutexLock lock(mutex_); if (rep_) CordRep::Ref(rep_); } CordzHandle::Delete(this); @@ -378,14 +384,14 @@ void CordzInfo::Untrack() { void CordzInfo::Lock(MethodIdentifier method) ABSL_EXCLUSIVE_LOCK_FUNCTION(mutex_) { - mutex_.Lock(); + mutex_.lock(); update_tracker_.LossyAdd(method); assert(rep_); } void CordzInfo::Unlock() ABSL_UNLOCK_FUNCTION(mutex_) { bool tracked = rep_ != nullptr; - mutex_.Unlock(); + mutex_.unlock(); if (!tracked) { Untrack(); } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cordz_info.h b/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cordz_info.h index 0091fa2ea2..ccbe4144e4 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/cordz_info.h @@ -20,8 +20,8 @@ #include #include "absl/base/config.h" +#include "absl/base/const_init.h" #include "absl/base/internal/raw_logging.h" -#include "absl/base/internal/spinlock.h" #include "absl/base/thread_annotations.h" #include "absl/strings/internal/cord_internal.h" #include "absl/strings/internal/cordz_functions.h" @@ -121,12 +121,10 @@ class ABSL_LOCKABLE CordzInfo : public CordzHandle { CordzInfo& operator=(const CordzInfo&) = delete; // Retrieves the oldest existing CordzInfo. - static CordzInfo* Head(const CordzSnapshot& snapshot) - ABSL_NO_THREAD_SAFETY_ANALYSIS; + static CordzInfo* Head(const CordzSnapshot& snapshot); // Retrieves the next oldest existing CordzInfo older than 'this' instance. - CordzInfo* Next(const CordzSnapshot& snapshot) const - ABSL_NO_THREAD_SAFETY_ANALYSIS; + CordzInfo* Next(const CordzSnapshot& snapshot) const; // Locks this instance for the update identified by `method`. // Increases the count for `method` in `update_tracker`. @@ -185,18 +183,15 @@ class ABSL_LOCKABLE CordzInfo : public CordzHandle { int64_t sampling_stride() const { return sampling_stride_; } private: - using SpinLock = absl::base_internal::SpinLock; - using SpinLockHolder = ::absl::base_internal::SpinLockHolder; - // Global cordz info list. CordzInfo stores a pointer to the global list // instance to harden against ODR violations. struct List { - constexpr explicit List(absl::ConstInitType) {} - - SpinLock mutex; - std::atomic head ABSL_GUARDED_BY(mutex){nullptr}; + absl::Mutex mutex; + CordzInfo* head ABSL_GUARDED_BY(mutex){nullptr}; }; + static List* GlobalList(); + static constexpr size_t kMaxStackDepth = 64; explicit CordzInfo(CordRep* rep, const CordzInfo* src, @@ -221,7 +216,7 @@ class ABSL_LOCKABLE CordzInfo : public CordzHandle { void ODRCheck() const { #ifndef NDEBUG - ABSL_RAW_CHECK(list_ == &global_list_, "ODR violation in Cord"); + ABSL_RAW_CHECK(list_ == GlobalList(), "ODR violation in Cord"); #endif } @@ -231,12 +226,11 @@ class ABSL_LOCKABLE CordzInfo : public CordzHandle { static void MaybeTrackCordImpl(InlineData& cord, const InlineData& src, MethodIdentifier method); - ABSL_CONST_INIT static List global_list_; - List* const list_ = &global_list_; + List* const list_ = GlobalList(); // ci_prev_ and ci_next_ require the global list mutex to be held. // Unfortunately we can't use thread annotations such that the thread safety - // analysis understands that list_ and global_list_ are one and the same. + // analysis understands that list_ and GlobalList() are one and the same. std::atomic ci_prev_{nullptr}; std::atomic ci_next_{nullptr}; @@ -290,7 +284,7 @@ inline void CordzInfo::SetCordRep(CordRep* rep) { inline void CordzInfo::UnsafeSetCordRep(CordRep* rep) { rep_ = rep; } inline CordRep* CordzInfo::RefCordRep() const ABSL_LOCKS_EXCLUDED(mutex_) { - MutexLock lock(&mutex_); + MutexLock lock(mutex_); return rep_ ? CordRep::Ref(rep_) : nullptr; } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h b/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h index eab6ab9d00..ee3df2687d 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h @@ -28,11 +28,9 @@ // We disable format checker under vscode intellisense compilation. // See https://github.com/microsoft/vscode-cpptools/issues/3683 for // more details. -#if ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(__native_client__) && \ - !defined(__INTELLISENSE__) +#if ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(__INTELLISENSE__) #define ABSL_INTERNAL_ENABLE_FORMAT_CHECKER 1 -#endif // ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(__native_client__) && - // !defined(__INTELLISENSE__) +#endif // ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(__INTELLISENSE__) #endif // ABSL_INTERNAL_ENABLE_FORMAT_CHECKER namespace absl { diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h b/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h index 31fcf6dc22..5f9df0e1ed 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h @@ -47,6 +47,7 @@ #include "absl/base/internal/raw_logging.h" #include "absl/strings/internal/ostringstream.h" #include "absl/strings/internal/resize_uninitialized.h" +#include "absl/strings/resize_and_overwrite.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" @@ -249,23 +250,25 @@ std::string JoinAlgorithm(Iterator start, Iterator end, absl::string_view s, constexpr uint64_t kMaxSize = uint64_t{(std::numeric_limits::max)()}; ABSL_INTERNAL_CHECK(result_size <= kMaxSize, "size_t overflow"); - STLStringResizeUninitialized(&result, static_cast(result_size)); - // Joins strings - char* result_buf = &*result.begin(); - - memcpy(result_buf, start_value.data(), start_value.size()); - result_buf += start_value.size(); - for (Iterator it = start; ++it != end;) { - memcpy(result_buf, s.data(), s.size()); - result_buf += s.size(); - auto&& value = *it; - memcpy(result_buf, value.data(), value.size()); - result_buf += value.size(); - } + StringResizeAndOverwrite( + result, static_cast(result_size), + [&start, &end, &start_value, s](char* result_buf, + size_t result_buf_size) { + // Joins strings + memcpy(result_buf, start_value.data(), start_value.size()); + result_buf += start_value.size(); + for (Iterator it = start; ++it != end;) { + memcpy(result_buf, s.data(), s.size()); + result_buf += s.size(); + auto&& value = *it; + memcpy(result_buf, value.data(), value.size()); + result_buf += value.size(); + } + return result_buf_size; + }); } } - return result; } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/numbers.cc b/naiveproxy/src/third_party/abseil-cpp/absl/strings/numbers.cc index a83fd2ca84..01caf78f57 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/numbers.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/numbers.cc @@ -81,11 +81,15 @@ bool SimpleAtof(absl::string_view str, float* absl_nonnull out) { bool SimpleAtod(absl::string_view str, double* absl_nonnull out) { *out = 0.0; str = StripAsciiWhitespace(str); + if (str.empty()) { + // absl::from_chars doesn't accept empty strings. + return false; + } // std::from_chars doesn't accept an initial +, but SimpleAtod does, so if one // is present, skip it, while avoiding accepting "+-0" as valid. - if (!str.empty() && str[0] == '+') { + if (str[0] == '+') { str.remove_prefix(1); - if (!str.empty() && str[0] == '-') { + if (str.empty() || str[0] == '-') { return false; } } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/resize_and_overwrite.h b/naiveproxy/src/third_party/abseil-cpp/absl/strings/resize_and_overwrite.h new file mode 100644 index 0000000000..b3bd06e144 --- /dev/null +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/resize_and_overwrite.h @@ -0,0 +1,190 @@ +// Copyright 2025 The Abseil Authors +// +// Licensed under the Apache License, Version 2.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. +// +// ----------------------------------------------------------------------------- +// File: resize_and_overwrite.h +// ----------------------------------------------------------------------------- +// +// This file contains a polyfill for C++23's +// std::basic_string::resize_and_overwrite +// +// The polyfill takes the form of a free function: + +// template +// void StringResizeAndOverwrite(T& str, typename T::size_type count, Op op); +// +// This avoids the cost of initializing a suitably-sized std::string when it is +// intended to be used as a char array, for example, to be populated by a +// C-style API. +// +// Example usage: +// +// std::string IntToString(int n) { +// std::string result; +// constexpr size_t kMaxIntChars = 10; +// absl::StringResizeAndOverwrite( +// result, kMaxIntChars, [n](char* buffer, size_t buffer_size) { +// return snprintf(buffer, buffer_size, "%d", n); +// }); +// return result; +// } +// +// https://en.cppreference.com/w/cpp/string/basic_string/resize_and_overwrite.html +// https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1072r10.html + +#ifndef ABSL_STRINGS_RESIZE_AND_OVERWRITE_H_ +#define ABSL_STRINGS_RESIZE_AND_OVERWRITE_H_ + +#include +#include // IWYU pragma: keep +#include +#include + +#include "absl/base/config.h" +#include "absl/base/dynamic_annotations.h" +#include "absl/base/internal/throw_delegate.h" +#include "absl/base/macros.h" +#include "absl/base/optimization.h" + +#if defined(__cpp_lib_string_resize_and_overwrite) && \ + __cpp_lib_string_resize_and_overwrite >= 202110L +#define ABSL_INTERNAL_HAS_RESIZE_AND_OVERWRITE 1 +#endif + +namespace absl { +ABSL_NAMESPACE_BEGIN + +namespace strings_internal { + +#ifndef ABSL_INTERNAL_HAS_RESIZE_AND_OVERWRITE + +inline size_t ProbeResizeAndOverwriteOp(char*, size_t) { return 0; } + +// Prior to C++23, Google's libc++ backports resize_and_overwrite as +// __google_nonstandard_backport_resize_and_overwrite +template +struct has__google_nonstandard_backport_resize_and_overwrite : std::false_type { +}; + +template +struct has__google_nonstandard_backport_resize_and_overwrite< + T, + std::void_t< + decltype(std::declval() + .__google_nonstandard_backport_resize_and_overwrite( + std::declval(), ProbeResizeAndOverwriteOp))>> + : std::true_type {}; + +// Prior to C++23, the version of libstdc++ that shipped with GCC >= 14 +// has __resize_and_overwrite. +template +struct has__resize_and_overwrite : std::false_type {}; + +template +struct has__resize_and_overwrite< + T, std::void_t().__resize_and_overwrite( + std::declval(), ProbeResizeAndOverwriteOp))>> + : std::true_type {}; + +// libc++ used __resize_default_init to achieve uninitialized string resizes +// before removing it September 2025, in favor of resize_and_overwrite. +// https://github.com/llvm/llvm-project/commit/92f5d8df361bb1bb6dea88f86faeedfd295ab970 +template +struct has__resize_default_init : std::false_type {}; + +template +struct has__resize_default_init< + T, std::void_t().__resize_default_init(42))>> + : std::true_type {}; + +// Prior to C++23, some versions of MSVC have _Resize_and_overwrite. +template +struct has_Resize_and_overwrite : std::false_type {}; + +template +struct has_Resize_and_overwrite< + T, std::void_t()._Resize_and_overwrite( + std::declval(), ProbeResizeAndOverwriteOp))>> + : std::true_type {}; + +#endif // ifndef ABSL_INTERNAL_HAS_RESIZE_AND_OVERWRITE + +// A less-efficient fallback implementation that uses resize(). +template +void StringResizeAndOverwriteFallback(T& str, typename T::size_type n, Op op) { + if (ABSL_PREDICT_FALSE(n > str.max_size())) { + absl::base_internal::ThrowStdLengthError("absl::StringResizeAndOverwrite"); + } +#ifdef ABSL_HAVE_MEMORY_SANITIZER + auto old_size = str.size(); +#endif + str.resize(n); +#ifdef ABSL_HAVE_MEMORY_SANITIZER + if (old_size < n) { + ABSL_ANNOTATE_MEMORY_IS_UNINITIALIZED(str.data() + old_size, n - old_size); + } +#endif + auto new_size = std::move(op)(str.data(), n); + ABSL_HARDENING_ASSERT(new_size >= 0 && new_size <= n); + ABSL_HARDENING_ASSERT(str.data()[n] == typename T::value_type{}); + str.erase(static_cast(new_size)); +} + +} // namespace strings_internal + +// Resizes `str` to contain at most `n` characters, using the user-provided +// operation `op` to modify the possibly indeterminate contents. `op` must +// return the finalized length of `str`. +// +// Invalidates all iterators, pointers, and references into `str`, regardless +// of whether reallocation occurs. +// +// `op(value_type* buf, size_t buf_size)` is allowed to write `value_type{}` to +// `buf[buf_size]`, which facilitiates interoperation with functions that write +// a trailing NUL. Please note that this requirement is more strict than +// `basic_string::resize_and_overwrite()`, which allows writing an abitrary +// value to `buf[buf_size]`. +template +void StringResizeAndOverwrite(T& str, typename T::size_type n, Op op) { +#ifdef ABSL_INTERNAL_HAS_RESIZE_AND_OVERWRITE + str.resize_and_overwrite(n, std::move(op)); +#else + if constexpr (strings_internal:: + has__google_nonstandard_backport_resize_and_overwrite< + T>::value) { + str.__google_nonstandard_backport_resize_and_overwrite(n, std::move(op)); + } else if constexpr (strings_internal::has__resize_and_overwrite::value) { + str.__resize_and_overwrite(n, std::move(op)); + } else if constexpr (strings_internal::has__resize_default_init::value) { + str.__resize_default_init(n); + str.__resize_default_init( + static_cast(std::move(op)(str.data(), n))); + } else if constexpr (strings_internal::has_Resize_and_overwrite::value) { + str._Resize_and_overwrite(n, std::move(op)); + } else { + strings_internal::StringResizeAndOverwriteFallback(str, n, op); + } +#endif +#if defined(ABSL_HAVE_MEMORY_SANITIZER) + auto shadow = __msan_test_shadow(str.data(), str.size()); + ABSL_ASSERT(shadow == -1); +#endif +} + +ABSL_NAMESPACE_END +} // namespace absl + +#undef ABSL_INTERNAL_HAS_RESIZE_AND_OVERWRITE + +#endif // ABSL_STRINGS_RESIZE_AND_OVERWRITE_H_ diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/str_cat.cc b/naiveproxy/src/third_party/abseil-cpp/absl/strings/str_cat.cc index 1f3cfbffc1..99b3a1e1f5 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/str_cat.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/str_cat.cc @@ -27,6 +27,7 @@ #include "absl/base/internal/raw_logging.h" #include "absl/base/nullability.h" #include "absl/strings/internal/resize_uninitialized.h" +#include "absl/strings/resize_and_overwrite.h" #include "absl/strings/string_view.h" namespace absl { @@ -67,13 +68,14 @@ std::string StrCat(const AlphaNum& a, const AlphaNum& b) { const uint64_t result_size = static_cast(a.size()) + static_cast(b.size()); ABSL_INTERNAL_CHECK(result_size <= kMaxSize, "size_t overflow"); - absl::strings_internal::STLStringResizeUninitialized( - &result, static_cast(result_size)); - char* const begin = &result[0]; - char* out = begin; - out = Append(out, a); - out = Append(out, b); - assert(out == begin + result.size()); + absl::StringResizeAndOverwrite(result, static_cast(result_size), + [&a, &b](char* const begin, size_t buf_size) { + char* out = begin; + out = Append(out, a); + out = Append(out, b); + assert(out == begin + buf_size); + return buf_size; + }); return result; } @@ -86,14 +88,16 @@ std::string StrCat(const AlphaNum& a, const AlphaNum& b, const AlphaNum& c) { static_cast(b.size()) + static_cast(c.size()); ABSL_INTERNAL_CHECK(result_size <= kMaxSize, "size_t overflow"); - strings_internal::STLStringResizeUninitialized( - &result, static_cast(result_size)); - char* const begin = &result[0]; - char* out = begin; - out = Append(out, a); - out = Append(out, b); - out = Append(out, c); - assert(out == begin + result.size()); + absl::StringResizeAndOverwrite( + result, static_cast(result_size), + [&a, &b, &c](char* const begin, size_t buf_size) { + char* out = begin; + out = Append(out, a); + out = Append(out, b); + out = Append(out, c); + assert(out == begin + buf_size); + return buf_size; + }); return result; } @@ -103,20 +107,21 @@ std::string StrCat(const AlphaNum& a, const AlphaNum& b, const AlphaNum& c, // Use uint64_t to prevent size_t overflow. We assume it is not possible for // in memory strings to overflow a uint64_t. constexpr uint64_t kMaxSize = uint64_t{std::numeric_limits::max()}; - const uint64_t result_size = static_cast(a.size()) + - static_cast(b.size()) + - static_cast(c.size()) + - static_cast(d.size()); + const uint64_t result_size = + static_cast(a.size()) + static_cast(b.size()) + + static_cast(c.size()) + static_cast(d.size()); ABSL_INTERNAL_CHECK(result_size <= kMaxSize, "size_t overflow"); - strings_internal::STLStringResizeUninitialized( - &result, static_cast(result_size)); - char* const begin = &result[0]; - char* out = begin; - out = Append(out, a); - out = Append(out, b); - out = Append(out, c); - out = Append(out, d); - assert(out == begin + result.size()); + absl::StringResizeAndOverwrite( + result, static_cast(result_size), + [&a, &b, &c, &d](char* const begin, size_t buf_size) { + char* out = begin; + out = Append(out, a); + out = Append(out, b); + out = Append(out, c); + out = Append(out, d); + assert(out == begin + buf_size); + return buf_size; + }); return result; } @@ -133,19 +138,19 @@ std::string CatPieces(std::initializer_list pieces) { total_size += piece.size(); } ABSL_INTERNAL_CHECK(total_size <= kMaxSize, "size_t overflow"); - strings_internal::STLStringResizeUninitialized( - &result, static_cast(total_size)); - - char* const begin = &result[0]; - char* out = begin; - for (absl::string_view piece : pieces) { - const size_t this_size = piece.size(); - if (this_size != 0) { - memcpy(out, piece.data(), this_size); - out += this_size; - } - } - assert(out == begin + result.size()); + absl::StringResizeAndOverwrite(result, static_cast(total_size), + [&pieces](char* const begin, size_t buf_size) { + char* out = begin; + for (absl::string_view piece : pieces) { + const size_t this_size = piece.size(); + if (this_size != 0) { + memcpy(out, piece.data(), this_size); + out += this_size; + } + } + assert(out == begin + buf_size); + return buf_size; + }); return result; } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/str_cat.h b/naiveproxy/src/third_party/abseil-cpp/absl/strings/str_cat.h index 84db0f6cd5..48eb6f999f 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/str_cat.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/str_cat.h @@ -109,6 +109,7 @@ #include "absl/strings/internal/resize_uninitialized.h" #include "absl/strings/internal/stringify_sink.h" #include "absl/strings/numbers.h" +#include "absl/strings/resize_and_overwrite.h" #include "absl/strings/string_view.h" #if !defined(ABSL_USES_STD_STRING_VIEW) @@ -471,23 +472,27 @@ std::string IntegerToString(Integer i) { // with 22 bytes (including NULL at the end). constexpr size_t kMaxDigits10 = 22; std::string result; - strings_internal::STLStringResizeUninitialized(&result, kMaxDigits10); - char* start = &result[0]; - // note: this can be optimized to not write last zero. - char* end = numbers_internal::FastIntToBuffer(i, start); - auto size = static_cast(end - start); - assert((size < result.size()) && - "StrCat(Integer) does not fit into kMaxDigits10"); - result.erase(size); + StringResizeAndOverwrite( + result, kMaxDigits10, [i](char* start, size_t buf_size) { + // Note: This can be optimized to not write last zero. + char* end = numbers_internal::FastIntToBuffer(i, start); + auto size = static_cast(end - start); + ABSL_ASSERT(size < buf_size); + return size; + }); return result; } + template std::string FloatToString(Float f) { std::string result; - strings_internal::STLStringResizeUninitialized( - &result, numbers_internal::kSixDigitsToBufferSize); - char* start = &result[0]; - result.erase(numbers_internal::SixDigitsToBuffer(f, start)); + StringResizeAndOverwrite(result, numbers_internal::kSixDigitsToBufferSize, + [f](char* start, size_t buf_size) { + size_t size = + numbers_internal::SixDigitsToBuffer(f, start); + ABSL_ASSERT(size < buf_size); + return size; + }); return result; } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/strings/string_view.h b/naiveproxy/src/third_party/abseil-cpp/absl/strings/string_view.h index eca5404ba8..2f0a0fd082 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/strings/string_view.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/strings/string_view.h @@ -34,13 +34,15 @@ #include #include #include +#include #include +#include #include "absl/base/attributes.h" -#include "absl/base/nullability.h" #include "absl/base/config.h" #include "absl/base/internal/throw_delegate.h" #include "absl/base/macros.h" +#include "absl/base/nullability.h" #include "absl/base/optimization.h" #include "absl/base/port.h" @@ -64,6 +66,32 @@ ABSL_NAMESPACE_END #define ABSL_INTERNAL_STRING_VIEW_MEMCMP memcmp #endif // ABSL_HAVE_BUILTIN(__builtin_memcmp) +// If `std::ranges` is available, mark `string_view` as satisfying the +// `view` and `borrowed_range` concepts, just like `std::string_view`. +#ifdef __has_include +#if __has_include() +#include +#endif +#endif + +#if defined(__cpp_lib_ranges) && __cpp_lib_ranges >= 201911L +#include // NOLINT(build/c++20) + +namespace absl { +ABSL_NAMESPACE_BEGIN +class string_view; +ABSL_NAMESPACE_END +} // namespace absl + +template <> +// NOLINTNEXTLINE(build/c++20) +inline constexpr bool std::ranges::enable_view = true; +template <> +// NOLINTNEXTLINE(build/c++20) +inline constexpr bool std::ranges::enable_borrowed_range = + true; +#endif + namespace absl { ABSL_NAMESPACE_BEGIN @@ -208,6 +236,16 @@ class ABSL_ATTRIBUTE_VIEW string_view { ABSL_ASSERT(data != nullptr || len == 0); } +#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L + template End> + requires(std::is_same_v, value_type> && + !std::is_convertible_v) + constexpr string_view(It begin, End end) + : ptr_(std::to_address(begin)), length_(end - begin) { + ABSL_HARDENING_ASSERT(end >= begin); + } +#endif // ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L + constexpr string_view(const string_view&) noexcept = default; string_view& operator=(const string_view&) noexcept = default; @@ -749,8 +787,8 @@ ABSL_NAMESPACE_BEGIN // // Like `s.substr(pos, n)`, but clips `pos` to an upper bound of `s.size()`. // Provided because std::string_view::substr throws if `pos > size()` -inline string_view ClippedSubstr(string_view s, size_t pos, - size_t n = string_view::npos) { +inline string_view ClippedSubstr(string_view s ABSL_ATTRIBUTE_LIFETIME_BOUND, + size_t pos, size_t n = string_view::npos) { pos = (std::min)(pos, static_cast(s.size())); return s.substr(pos, n); } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/BUILD.bazel b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/BUILD.bazel index 9a1aa83379..9c6b31a29f 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/BUILD.bazel +++ b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/BUILD.bazel @@ -148,6 +148,7 @@ cc_library( "//absl/base:tracing_internal", "//absl/debugging:stacktrace", "//absl/debugging:symbolize", + "//absl/meta:type_traits", "//absl/time", ] + select({ "//conditions:default": [], diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/BUILD.gn b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/BUILD.gn index 1fdeab4619..34274bc145 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/BUILD.gn +++ b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/BUILD.gn @@ -87,6 +87,7 @@ absl_source_set("synchronization") { "//third_party/abseil-cpp/absl/base:tracing_internal", "//third_party/abseil-cpp/absl/debugging:stacktrace", "//third_party/abseil-cpp/absl/debugging:symbolize", + "//third_party/abseil-cpp/absl/meta:type_traits", "//third_party/abseil-cpp/absl/time", ] } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/CMakeLists.txt b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/CMakeLists.txt index ad45515c11..9c4a0b1fe9 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/CMakeLists.txt +++ b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/CMakeLists.txt @@ -109,6 +109,7 @@ absl_cc_library( absl::core_headers absl::dynamic_annotations absl::malloc_internal + absl::meta absl::nullability absl::raw_logging_internal absl::stacktrace diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/barrier.cc b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/barrier.cc index 0dfd795e7b..f5dad22203 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/barrier.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/barrier.cc @@ -26,7 +26,7 @@ static bool IsZero(void *arg) { } bool Barrier::Block() { - MutexLock l(&this->lock_); + MutexLock l(this->lock_); this->num_to_block_--; if (this->num_to_block_ < 0) { diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc index a530baf4cc..9468469afa 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc @@ -42,7 +42,7 @@ bool BlockingCounter::DecrementCount() { "BlockingCounter::DecrementCount() called too many times"); if (count == 0) { base_internal::TraceSignal(this, TraceObjectKind()); - MutexLock l(&lock_); + MutexLock l(lock_); done_ = true; return true; } @@ -52,7 +52,7 @@ bool BlockingCounter::DecrementCount() { void BlockingCounter::Wait() { base_internal::TraceWait(this, TraceObjectKind()); { - MutexLock l(&this->lock_); + MutexLock l(this->lock_); // only one thread may call Wait(). To support more than one thread, // implement a counter num_to_exit, like in the Barrier class. diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc index 2ec8075019..0b0f9207a4 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc @@ -60,7 +60,7 @@ static void ReclaimThreadIdentity(void* v) { // association state in this case. base_internal::ClearCurrentThreadIdentity(); { - base_internal::SpinLockHolder l(&freelist_lock); + base_internal::SpinLockHolder l(freelist_lock); identity->next = thread_identity_freelist; thread_identity_freelist = identity; } @@ -108,7 +108,7 @@ static base_internal::ThreadIdentity* NewThreadIdentity() { { // Re-use a previously released object if possible. - base_internal::SpinLockHolder l(&freelist_lock); + base_internal::SpinLockHolder l(freelist_lock); if (thread_identity_freelist) { identity = thread_identity_freelist; // Take list-head. thread_identity_freelist = thread_identity_freelist->next; diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc index e332520dbe..f58fb0a777 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc @@ -58,7 +58,7 @@ ABSL_CONST_INIT static absl::base_internal::SpinLock arena_mu( ABSL_CONST_INIT static base_internal::LowLevelAlloc::Arena* arena; static void InitArenaIfNecessary() { - base_internal::SpinLockHolder l(&arena_mu); + base_internal::SpinLockHolder l(arena_mu); if (arena == nullptr) { arena = base_internal::LowLevelAlloc::NewArena(0); } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/internal/thread_pool.h b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/internal/thread_pool.h index 5eb0bb605e..f87adf635d 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/internal/thread_pool.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/internal/thread_pool.h @@ -46,7 +46,7 @@ class ThreadPool { ~ThreadPool() { { - absl::MutexLock l(&mu_); + absl::MutexLock l(mu_); for (size_t i = 0; i < threads_.size(); i++) { queue_.push(nullptr); // Shutdown signal. } @@ -59,7 +59,7 @@ class ThreadPool { // Schedule a function to be run on a ThreadPool thread immediately. void Schedule(absl::AnyInvocable func) { assert(func != nullptr); - absl::MutexLock l(&mu_); + absl::MutexLock l(mu_); queue_.push(std::move(func)); } @@ -72,7 +72,7 @@ class ThreadPool { while (true) { absl::AnyInvocable func; { - absl::MutexLock l(&mu_); + absl::MutexLock l(mu_); mu_.Await(absl::Condition(this, &ThreadPool::WorkAvailable)); func = std::move(queue_.front()); queue_.pop(); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/mutex.cc b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/mutex.cc index 4c862fc6ec..1d5858261a 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/mutex.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/mutex.cc @@ -1223,9 +1223,8 @@ static GraphId GetGraphIdLocked(Mutex* mu) } static GraphId GetGraphId(Mutex* mu) ABSL_LOCKS_EXCLUDED(deadlock_graph_mu) { - deadlock_graph_mu.lock(); + base_internal::SpinLockHolder l(deadlock_graph_mu); GraphId id = GetGraphIdLocked(mu); - deadlock_graph_mu.unlock(); return id; } @@ -1386,7 +1385,7 @@ static GraphId DeadlockCheck(Mutex* mu) { SynchLocksHeld* all_locks = Synch_GetAllLocks(); - absl::base_internal::SpinLockHolder lock(&deadlock_graph_mu); + absl::base_internal::SpinLockHolder lock(deadlock_graph_mu); const GraphId mu_id = GetGraphIdLocked(mu); if (all_locks->n == 0) { @@ -2761,7 +2760,7 @@ void CondVar::SignalAll() { void ReleasableMutexLock::Release() { ABSL_RAW_CHECK(this->mu_ != nullptr, "ReleasableMutexLock::Release may only be called once"); - this->mu_->Unlock(); + this->mu_->unlock(); this->mu_ = nullptr; } diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/mutex.h b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/mutex.h index 110c2209d3..10fafcb4ea 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/mutex.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/mutex.h @@ -61,18 +61,16 @@ #include #include #include -#include -#include #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/const_init.h" -#include "absl/base/internal/identity.h" -#include "absl/base/internal/low_level_alloc.h" #include "absl/base/internal/thread_identity.h" #include "absl/base/internal/tsan_mutex_interface.h" +#include "absl/base/macros.h" #include "absl/base/nullability.h" -#include "absl/base/port.h" #include "absl/base/thread_annotations.h" +#include "absl/meta/type_traits.h" #include "absl/synchronization/internal/kernel_timeout.h" #include "absl/synchronization/internal/per_thread_sem.h" #include "absl/time/time.h" @@ -293,12 +291,12 @@ class ABSL_LOCKABLE ABSL_ATTRIBUTE_WARN_UNUSED Mutex { // These methods may be used (along with the complementary `Reader*()` // methods) to distinguish simple exclusive `Mutex` usage (`Lock()`, // etc.) from reader/writer lock usage. - void WriterLock() ABSL_EXCLUSIVE_LOCK_FUNCTION() { this->lock(); } + void WriterLock() ABSL_EXCLUSIVE_LOCK_FUNCTION() { lock(); } - void WriterUnlock() ABSL_UNLOCK_FUNCTION() { this->unlock(); } + void WriterUnlock() ABSL_UNLOCK_FUNCTION() { unlock(); } [[nodiscard]] bool WriterTryLock() ABSL_EXCLUSIVE_TRYLOCK_FUNCTION(true) { - return this->try_lock(); + return try_lock(); } // --------------------------------------------------------------------------- @@ -561,10 +559,10 @@ class ABSL_LOCKABLE ABSL_ATTRIBUTE_WARN_UNUSED Mutex { base_internal::PerThreadSynch* absl_nonnull w); void Dtor(); - friend class CondVar; // for access to Trans()/Fer(). + friend class CondVar; // for access to Trans()/Fer(). void Trans(MuHow absl_nonnull how); // used for CondVar->Mutex transfer void Fer(base_internal::PerThreadSynch* absl_nonnull - w); // used for CondVar->Mutex transfer + w); // used for CondVar->Mutex transfer // Catch the error of writing Mutex when intending MutexLock. explicit Mutex(const volatile Mutex* absl_nullable /*ignored*/) {} @@ -587,7 +585,7 @@ class ABSL_LOCKABLE ABSL_ATTRIBUTE_WARN_UNUSED Mutex { // Class Foo { // public: // Foo::Bar* Baz() { -// MutexLock lock(&mu_); +// MutexLock lock(mu_); // ... // return bar; // } @@ -599,32 +597,42 @@ class ABSL_SCOPED_LOCKABLE MutexLock { public: // Constructors - // Calls `mu->Lock()` and returns when that call returns. That is, `*mu` is + // Calls `mu.lock()` and returns when that call returns. That is, `mu` is + // guaranteed to be locked when this object is constructed. + explicit MutexLock(Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)) + ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) + : mu_(mu) { + this->mu_.lock(); + } + + // Calls `mu->lock()` and returns when that call returns. That is, `*mu` is // guaranteed to be locked when this object is constructed. Requires that // `mu` be dereferenceable. explicit MutexLock(Mutex* absl_nonnull mu) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) - : mu_(mu) { - this->mu_->Lock(); - } + : MutexLock(*mu) {} - // Like above, but calls `mu->LockWhen(cond)` instead. That is, in addition to + // Like above, but calls `mu.LockWhen(cond)` instead. That is, in addition to // the above, the condition given by `cond` is also guaranteed to hold when // this object is constructed. + explicit MutexLock(Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this), + const Condition& cond) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) + : mu_(mu) { + this->mu_.LockWhen(cond); + } + explicit MutexLock(Mutex* absl_nonnull mu, const Condition& cond) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) - : mu_(mu) { - this->mu_->LockWhen(cond); - } + : MutexLock(*mu, cond) {} MutexLock(const MutexLock&) = delete; // NOLINT(runtime/mutex) MutexLock(MutexLock&&) = delete; // NOLINT(runtime/mutex) MutexLock& operator=(const MutexLock&) = delete; MutexLock& operator=(MutexLock&&) = delete; - ~MutexLock() ABSL_UNLOCK_FUNCTION() { this->mu_->Unlock(); } + ~MutexLock() ABSL_UNLOCK_FUNCTION() { this->mu_.unlock(); } private: - Mutex* absl_nonnull const mu_; + Mutex& mu_; }; // ReaderMutexLock @@ -633,26 +641,34 @@ class ABSL_SCOPED_LOCKABLE MutexLock { // releases a shared lock on a `Mutex` via RAII. class ABSL_SCOPED_LOCKABLE ReaderMutexLock { public: - explicit ReaderMutexLock(Mutex* absl_nonnull mu) ABSL_SHARED_LOCK_FUNCTION(mu) + explicit ReaderMutexLock(Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)) + ABSL_SHARED_LOCK_FUNCTION(mu) : mu_(mu) { - mu->ReaderLock(); + mu.lock_shared(); + } + + explicit ReaderMutexLock(Mutex* absl_nonnull mu) ABSL_SHARED_LOCK_FUNCTION(mu) + : ReaderMutexLock(*mu) {} + + explicit ReaderMutexLock(Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this), + const Condition& cond) ABSL_SHARED_LOCK_FUNCTION(mu) + : mu_(mu) { + mu.ReaderLockWhen(cond); } explicit ReaderMutexLock(Mutex* absl_nonnull mu, const Condition& cond) ABSL_SHARED_LOCK_FUNCTION(mu) - : mu_(mu) { - mu->ReaderLockWhen(cond); - } + : ReaderMutexLock(*mu, cond) {} ReaderMutexLock(const ReaderMutexLock&) = delete; ReaderMutexLock(ReaderMutexLock&&) = delete; ReaderMutexLock& operator=(const ReaderMutexLock&) = delete; ReaderMutexLock& operator=(ReaderMutexLock&&) = delete; - ~ReaderMutexLock() ABSL_UNLOCK_FUNCTION() { this->mu_->ReaderUnlock(); } + ~ReaderMutexLock() ABSL_UNLOCK_FUNCTION() { this->mu_.unlock_shared(); } private: - Mutex* absl_nonnull const mu_; + Mutex& mu_; }; // WriterMutexLock @@ -661,27 +677,36 @@ class ABSL_SCOPED_LOCKABLE ReaderMutexLock { // releases a write (exclusive) lock on a `Mutex` via RAII. class ABSL_SCOPED_LOCKABLE WriterMutexLock { public: - explicit WriterMutexLock(Mutex* absl_nonnull mu) + explicit WriterMutexLock(Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) : mu_(mu) { - mu->WriterLock(); + mu.lock(); + } + + explicit WriterMutexLock(Mutex* absl_nonnull mu) + ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) + : WriterMutexLock(*mu) {} + + explicit WriterMutexLock(Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this), + const Condition& cond) + ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) + : mu_(mu) { + mu.WriterLockWhen(cond); } explicit WriterMutexLock(Mutex* absl_nonnull mu, const Condition& cond) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) - : mu_(mu) { - mu->WriterLockWhen(cond); - } + : WriterMutexLock(*mu, cond) {} WriterMutexLock(const WriterMutexLock&) = delete; WriterMutexLock(WriterMutexLock&&) = delete; WriterMutexLock& operator=(const WriterMutexLock&) = delete; WriterMutexLock& operator=(WriterMutexLock&&) = delete; - ~WriterMutexLock() ABSL_UNLOCK_FUNCTION() { this->mu_->WriterUnlock(); } + ~WriterMutexLock() ABSL_UNLOCK_FUNCTION() { this->mu_.unlock(); } private: - Mutex* absl_nonnull const mu_; + Mutex& mu_; }; // ----------------------------------------------------------------------------- @@ -728,7 +753,7 @@ class ABSL_SCOPED_LOCKABLE WriterMutexLock { // Example using a scope guard: // // { -// MutexLock lock(&mu_, count_is_zero); +// MutexLock lock(mu_, count_is_zero); // // ... // } // @@ -769,27 +794,27 @@ class Condition { template Condition( bool (*absl_nonnull func)(T* absl_nullability_unknown), - typename absl::internal::type_identity::type* absl_nullability_unknown - arg); + typename absl::type_identity::type* absl_nullability_unknown + arg); // Templated version for invoking a method that returns a `bool`. // // `Condition(object, &Class::Method)` constructs a `Condition` that evaluates // `object->Method()`. // - // Implementation Note: `absl::internal::type_identity` is used to allow + // Implementation Note: `absl::type_identity` is used to allow // methods to come from base classes. A simpler signature like // `Condition(T*, bool (T::*)())` does not suffice. template Condition( T* absl_nonnull object, - bool (absl::internal::type_identity::type::* absl_nonnull method)()); + bool (absl::type_identity::type::* absl_nonnull method)()); // Same as above, for const members template Condition( const T* absl_nonnull object, - bool (absl::internal::type_identity::type::* absl_nonnull method)() + bool (absl::type_identity::type::* absl_nonnull method)() const); // A Condition that returns the value of `*cond` @@ -1034,7 +1059,7 @@ class ABSL_SCOPED_LOCKABLE MutexLockMaybe { ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) : mu_(mu) { if (this->mu_ != nullptr) { - this->mu_->Lock(); + this->mu_->lock(); } } @@ -1048,7 +1073,7 @@ class ABSL_SCOPED_LOCKABLE MutexLockMaybe { ~MutexLockMaybe() ABSL_UNLOCK_FUNCTION() { if (this->mu_ != nullptr) { - this->mu_->Unlock(); + this->mu_->unlock(); } } @@ -1066,28 +1091,37 @@ class ABSL_SCOPED_LOCKABLE MutexLockMaybe { // mutex before destruction. `Release()` may be called at most once. class ABSL_SCOPED_LOCKABLE ReleasableMutexLock { public: + explicit ReleasableMutexLock(Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY( + this)) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) + : mu_(&mu) { + this->mu_->lock(); + } + explicit ReleasableMutexLock(Mutex* absl_nonnull mu) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) - : mu_(mu) { - this->mu_->Lock(); + : ReleasableMutexLock(*mu) {} + + explicit ReleasableMutexLock( + Mutex& mu ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this), + const Condition& cond) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) + : mu_(&mu) { + this->mu_->LockWhen(cond); } explicit ReleasableMutexLock(Mutex* absl_nonnull mu, const Condition& cond) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) - : mu_(mu) { - this->mu_->LockWhen(cond); - } + : ReleasableMutexLock(*mu, cond) {} ~ReleasableMutexLock() ABSL_UNLOCK_FUNCTION() { if (this->mu_ != nullptr) { - this->mu_->Unlock(); + this->mu_->unlock(); } } void Release() ABSL_UNLOCK_FUNCTION(); private: - Mutex* absl_nonnull mu_; + Mutex* absl_nullable mu_; ReleasableMutexLock(const ReleasableMutexLock&) = delete; ReleasableMutexLock(ReleasableMutexLock&&) = delete; ReleasableMutexLock& operator=(const ReleasableMutexLock&) = delete; @@ -1149,15 +1183,15 @@ inline Condition::Condition( template inline Condition::Condition( bool (*absl_nonnull func)(T* absl_nullability_unknown), - typename absl::internal::type_identity::type* absl_nullability_unknown - arg) + typename absl::type_identity::type* absl_nullability_unknown + arg) // Just delegate to the overload above. : Condition(func, arg) {} template inline Condition::Condition( T* absl_nonnull object, - bool (absl::internal::type_identity::type::* absl_nonnull method)()) + bool (absl::type_identity::type::* absl_nonnull method)()) : eval_(&CastAndCallMethod), arg_(object) { static_assert(sizeof(&method) <= sizeof(callback_), "An overlarge method pointer was passed to Condition."); @@ -1167,7 +1201,7 @@ inline Condition::Condition( template inline Condition::Condition( const T* absl_nonnull object, - bool (absl::internal::type_identity::type::* absl_nonnull method)() + bool (absl::type_identity::type::* absl_nonnull method)() const) : eval_(&CastAndCallMethod), arg_(reinterpret_cast(const_cast(object))) { diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/mutex_benchmark.cc b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/mutex_benchmark.cc index 1f33c0d7cb..d2c64956f0 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/mutex_benchmark.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/mutex_benchmark.cc @@ -30,7 +30,7 @@ namespace { void BM_Mutex(benchmark::State& state) { static absl::NoDestructor mu; for (auto _ : state) { - absl::MutexLock lock(mu.get()); + absl::MutexLock lock(*mu.get()); } } BENCHMARK(BM_Mutex)->UseRealTime()->Threads(1)->ThreadPerCpu(); @@ -38,7 +38,7 @@ BENCHMARK(BM_Mutex)->UseRealTime()->Threads(1)->ThreadPerCpu(); void BM_ReaderLock(benchmark::State& state) { static absl::NoDestructor mu; for (auto _ : state) { - absl::ReaderMutexLock lock(mu.get()); + absl::ReaderMutexLock lock(*mu.get()); } } BENCHMARK(BM_ReaderLock)->UseRealTime()->Threads(1)->ThreadPerCpu(); @@ -46,8 +46,8 @@ BENCHMARK(BM_ReaderLock)->UseRealTime()->Threads(1)->ThreadPerCpu(); void BM_TryLock(benchmark::State& state) { absl::Mutex mu; for (auto _ : state) { - if (mu.TryLock()) { - mu.Unlock(); + if (mu.try_lock()) { + mu.unlock(); } } } @@ -56,8 +56,8 @@ BENCHMARK(BM_TryLock); void BM_ReaderTryLock(benchmark::State& state) { static absl::NoDestructor mu; for (auto _ : state) { - if (mu->ReaderTryLock()) { - mu->ReaderUnlock(); + if (mu->try_lock_shared()) { + mu->unlock_shared(); } } } @@ -145,7 +145,7 @@ void BM_MutexEnqueue(benchmark::State& state) { shared->looping_threads.fetch_add(1); for (int i = 0; i < kBatchSize; i++) { { - absl::MutexLock l(&shared->mu); + absl::MutexLock l(shared->mu); shared->thread_has_mutex.store(true, std::memory_order_relaxed); // Spin until all other threads are either out of the benchmark loop // or blocked on the mutex. This ensures that the mutex queue is kept @@ -273,7 +273,7 @@ void BM_ConditionWaiters(benchmark::State& state) { init->DecrementCount(); m->LockWhen(absl::Condition( static_cast([](int* v) { return *v == 0; }), p)); - m->Unlock(); + m->unlock(); } }; @@ -299,15 +299,15 @@ void BM_ConditionWaiters(benchmark::State& state) { init.Wait(); for (auto _ : state) { - mu.Lock(); - mu.Unlock(); // Each unlock requires Condition evaluation for our waiters. + mu.lock(); + mu.unlock(); // Each unlock requires Condition evaluation for our waiters. } - mu.Lock(); + mu.lock(); for (int i = 0; i < num_classes; i++) { equivalence_classes[i] = 0; } - mu.Unlock(); + mu.unlock(); } // Some configurations have higher thread limits than others. diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/notification.cc b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/notification.cc index a5853ab3d7..a890c1bcd5 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/notification.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/synchronization/notification.cc @@ -26,7 +26,7 @@ ABSL_NAMESPACE_BEGIN void Notification::Notify() { base_internal::TraceSignal(this, TraceObjectKind()); - MutexLock l(&this->mutex_); + MutexLock l(this->mutex_); #ifndef NDEBUG if (ABSL_PREDICT_FALSE(notified_yet_.load(std::memory_order_relaxed))) { @@ -43,7 +43,7 @@ void Notification::Notify() { Notification::~Notification() { // Make sure that the thread running Notify() exits before the object is // destructed. - MutexLock l(&this->mutex_); + MutexLock l(this->mutex_); } void Notification::WaitForNotification() const { @@ -51,7 +51,7 @@ void Notification::WaitForNotification() const { if (!HasBeenNotifiedInternal(&this->notified_yet_)) { this->mutex_.LockWhen( Condition(&HasBeenNotifiedInternal, &this->notified_yet_)); - this->mutex_.Unlock(); + this->mutex_.unlock(); } base_internal::TraceContinue(this, TraceObjectKind()); } @@ -63,7 +63,7 @@ bool Notification::WaitForNotificationWithTimeout( if (!notified) { notified = this->mutex_.LockWhenWithTimeout( Condition(&HasBeenNotifiedInternal, &this->notified_yet_), timeout); - this->mutex_.Unlock(); + this->mutex_.unlock(); } base_internal::TraceContinue(notified ? this : nullptr, TraceObjectKind()); return notified; @@ -75,7 +75,7 @@ bool Notification::WaitForNotificationWithDeadline(absl::Time deadline) const { if (!notified) { notified = this->mutex_.LockWhenWithDeadline( Condition(&HasBeenNotifiedInternal, &this->notified_yet_), deadline); - this->mutex_.Unlock(); + this->mutex_.unlock(); } base_internal::TraceContinue(notified ? this : nullptr, TraceObjectKind()); return notified; diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/time/BUILD.bazel b/naiveproxy/src/third_party/abseil-cpp/absl/time/BUILD.bazel index b61999b338..b68dd85686 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/time/BUILD.bazel +++ b/naiveproxy/src/third_party/abseil-cpp/absl/time/BUILD.bazel @@ -121,6 +121,7 @@ cc_test( "no_test_android_arm", "no_test_android_arm64", "no_test_android_x86", + "no_test_ios_sim_arm64", "no_test_ios_x86_64", "no_test_lexan", "no_test_loonix", diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/time/civil_time_benchmark.cc b/naiveproxy/src/third_party/abseil-cpp/absl/time/civil_time_benchmark.cc index 2de0233dc4..2818a90e53 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/time/civil_time_benchmark.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/time/civil_time_benchmark.cc @@ -12,14 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "absl/time/civil_time.h" - #include #include #include #include #include "absl/hash/hash.h" +#include "absl/time/civil_time.h" #include "benchmark/benchmark.h" namespace { diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/time/clock.cc b/naiveproxy/src/third_party/abseil-cpp/absl/time/clock.cc index f920ada4eb..bf6a10b3ad 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/time/clock.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/time/clock.cc @@ -125,7 +125,7 @@ class UnscaledCycleClockWrapperForGetCurrentTime { // spin-delay tuning. // Acquire seqlock (*seq) and return the value to be written to unlock. -static inline uint64_t SeqAcquire(std::atomic *seq) { +static inline uint64_t SeqAcquire(std::atomic* seq) { uint64_t x = seq->fetch_add(1, std::memory_order_relaxed); // We put a release fence between update to *seq and writes to shared data. @@ -140,7 +140,7 @@ static inline uint64_t SeqAcquire(std::atomic *seq) { // Release seqlock (*seq) by writing x to it---a value previously returned by // SeqAcquire. -static inline void SeqRelease(std::atomic *seq, uint64_t x) { +static inline void SeqRelease(std::atomic* seq, uint64_t x) { // The unlock store to *seq must have release ordering so that all // updates to shared data must finish before this store. seq->store(x, std::memory_order_release); // release lock for readers @@ -218,7 +218,7 @@ ABSL_CONST_INIT static TimeState time_state; // assumed to be complete resyncs, which shouldn't happen. If they do, a full // reinitialization of the outer algorithm should occur.) static int64_t GetCurrentTimeNanosFromKernel(uint64_t last_cycleclock, - uint64_t *cycleclock) + uint64_t* cycleclock) ABSL_EXCLUSIVE_LOCKS_REQUIRED(time_state.lock) { uint64_t local_approx_syscall_time_in_cycles = // local copy time_state.approx_syscall_time_in_cycles.load(std::memory_order_relaxed); @@ -274,8 +274,8 @@ static int64_t GetCurrentTimeNanosSlowPath() ABSL_ATTRIBUTE_COLD; // Read the contents of *atomic into *sample. // Each field is read atomically, but to maintain atomicity between fields, // the access must be done under a lock. -static void ReadTimeSampleAtomic(const struct TimeSampleAtomic *atomic, - struct TimeSample *sample) { +static void ReadTimeSampleAtomic(const struct TimeSampleAtomic* atomic, + struct TimeSample* sample) { sample->base_ns = atomic->base_ns.load(std::memory_order_relaxed); sample->base_cycles = atomic->base_cycles.load(std::memory_order_relaxed); sample->nsscaled_per_cycle = @@ -397,7 +397,7 @@ static uint64_t SafeDivideAndScale(uint64_t a, uint64_t b) { static uint64_t UpdateLastSample( uint64_t now_cycles, uint64_t now_ns, uint64_t delta_cycles, - const struct TimeSample *sample) ABSL_ATTRIBUTE_COLD; + const struct TimeSample* sample) ABSL_ATTRIBUTE_COLD; // The slow path of GetCurrentTimeNanos(). This is taken while gathering // initial samples, when enough time has elapsed since the last sample, and if @@ -415,7 +415,7 @@ static int64_t GetCurrentTimeNanosSlowPath() ABSL_LOCKS_EXCLUDED(time_state.lock) { // Serialize access to slow-path. Fast-path readers are not blocked yet, and // code below must not modify last_sample until the seqlock is acquired. - base_internal::SpinLockHolder l(&time_state.lock); + base_internal::SpinLockHolder l(time_state.lock); // Sample the kernel time base. This is the definition of // "now" if we take the slow path. @@ -454,7 +454,7 @@ static int64_t GetCurrentTimeNanosSlowPath() // for readers. Returns the new estimated time. static uint64_t UpdateLastSample(uint64_t now_cycles, uint64_t now_ns, uint64_t delta_cycles, - const struct TimeSample *sample) + const struct TimeSample* sample) ABSL_EXCLUSIVE_LOCKS_REQUIRED(time_state.lock) { uint64_t estimated_base_ns = now_ns; uint64_t lock_value = diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/time/duration_benchmark.cc b/naiveproxy/src/third_party/abseil-cpp/absl/time/duration_benchmark.cc index fdb26bb32f..e2dd4d2857 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/time/duration_benchmark.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/time/duration_benchmark.cc @@ -358,6 +358,150 @@ void BM_Duration_ToInt64Hours(benchmark::State& state) { } BENCHMARK(BM_Duration_ToInt64Hours); +// +// ToDoubleXYZ +// +void BM_Duration_ToDoubleNanoseconds(benchmark::State& state) { + absl::Duration d = absl::Seconds(100000); + while (state.KeepRunning()) { + benchmark::DoNotOptimize(d); + double result = absl::ToDoubleNanoseconds(d); + benchmark::DoNotOptimize(result); + } +} +BENCHMARK(BM_Duration_ToDoubleNanoseconds); + +void BM_Duration_ToDoubleMicroseconds(benchmark::State& state) { + absl::Duration d = absl::Seconds(100000); + while (state.KeepRunning()) { + benchmark::DoNotOptimize(d); + double result = absl::ToDoubleMicroseconds(d); + benchmark::DoNotOptimize(result); + } +} +BENCHMARK(BM_Duration_ToDoubleMicroseconds); + +void BM_Duration_ToDoubleMilliseconds(benchmark::State& state) { + absl::Duration d = absl::Seconds(100000); + while (state.KeepRunning()) { + benchmark::DoNotOptimize(d); + double result = absl::ToDoubleMilliseconds(d); + benchmark::DoNotOptimize(result); + } +} +BENCHMARK(BM_Duration_ToDoubleMilliseconds); + +void BM_Duration_ToDoubleSeconds(benchmark::State& state) { + absl::Duration d = absl::Seconds(100000); + while (state.KeepRunning()) { + benchmark::DoNotOptimize(d); + double result = absl::ToDoubleSeconds(d); + benchmark::DoNotOptimize(result); + } +} +BENCHMARK(BM_Duration_ToDoubleSeconds); + +void BM_Duration_ToDoubleMinutes(benchmark::State& state) { + absl::Duration d = absl::Seconds(100000); + while (state.KeepRunning()) { + benchmark::DoNotOptimize(d); + double result = absl::ToDoubleMinutes(d); + benchmark::DoNotOptimize(result); + } +} +BENCHMARK(BM_Duration_ToDoubleMinutes); + +void BM_Duration_ToDoubleHours(benchmark::State& state) { + absl::Duration d = absl::Seconds(100000); + while (state.KeepRunning()) { + benchmark::DoNotOptimize(d); + double result = absl::ToDoubleHours(d); + benchmark::DoNotOptimize(result); + } +} +BENCHMARK(BM_Duration_ToDoubleHours); + +// +// ToDoubleXYZ Latency +// +void BM_Duration_ToDoubleNanoseconds_Latency(benchmark::State& state) { + absl::Duration d1 = absl::Seconds(100000); + absl::Duration d2 = absl::Seconds(100000); + double result = 1; + while (state.KeepRunning()) { + benchmark::DoNotOptimize(d1); + benchmark::DoNotOptimize(d2); + benchmark::DoNotOptimize(result); + result = absl::ToDoubleNanoseconds(result < 0 ? d1 : d2); + } +} +BENCHMARK(BM_Duration_ToDoubleNanoseconds_Latency); + +void BM_Duration_ToDoubleMicroseconds_Latency(benchmark::State& state) { + absl::Duration d1 = absl::Seconds(100000); + absl::Duration d2 = absl::Seconds(100000); + double result = 1; + while (state.KeepRunning()) { + benchmark::DoNotOptimize(d1); + benchmark::DoNotOptimize(d2); + benchmark::DoNotOptimize(result); + result = absl::ToDoubleMicroseconds(result < 0 ? d1 : d2); + } +} +BENCHMARK(BM_Duration_ToDoubleMicroseconds_Latency); + +void BM_Duration_ToDoubleMilliseconds_Latency(benchmark::State& state) { + absl::Duration d1 = absl::Seconds(100000); + absl::Duration d2 = absl::Seconds(100000); + double result = 1; + while (state.KeepRunning()) { + benchmark::DoNotOptimize(d1); + benchmark::DoNotOptimize(d2); + benchmark::DoNotOptimize(result); + result = absl::ToDoubleMilliseconds(result < 0 ? d1 : d2); + } +} +BENCHMARK(BM_Duration_ToDoubleMilliseconds_Latency); + +void BM_Duration_ToDoubleSeconds_Latency(benchmark::State& state) { + absl::Duration d1 = absl::Seconds(100000); + absl::Duration d2 = absl::Seconds(100000); + double result = 1; + while (state.KeepRunning()) { + benchmark::DoNotOptimize(d1); + benchmark::DoNotOptimize(d2); + benchmark::DoNotOptimize(result); + result = absl::ToDoubleSeconds(result < 0 ? d1 : d2); + } +} +BENCHMARK(BM_Duration_ToDoubleSeconds_Latency); + +void BM_Duration_ToDoubleMinutes_Latency(benchmark::State& state) { + absl::Duration d1 = absl::Seconds(100000); + absl::Duration d2 = absl::Seconds(100000); + double result = 1; + while (state.KeepRunning()) { + benchmark::DoNotOptimize(d1); + benchmark::DoNotOptimize(d2); + benchmark::DoNotOptimize(result); + result = absl::ToDoubleMinutes(result < 0 ? d1 : d2); + } +} +BENCHMARK(BM_Duration_ToDoubleMinutes_Latency); + +void BM_Duration_ToDoubleHours_Latency(benchmark::State& state) { + absl::Duration d1 = absl::Seconds(100000); + absl::Duration d2 = absl::Seconds(100000); + double result = 1; + while (state.KeepRunning()) { + benchmark::DoNotOptimize(d1); + benchmark::DoNotOptimize(d2); + benchmark::DoNotOptimize(result); + result = absl::ToDoubleHours(result < 0 ? d1 : d2); + } +} +BENCHMARK(BM_Duration_ToDoubleHours_Latency); + // // To/FromTimespec // diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/BUILD.bazel b/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/BUILD.bazel index 8abc804ce3..6e17874888 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +++ b/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/BUILD.bazel @@ -83,9 +83,15 @@ cc_library( ### tests -test_suite( - name = "all_tests", - visibility = ["//visibility:public"], +cc_library( + name = "test_time_zone_names", + testonly = True, + srcs = ["src/test_time_zone_names.cc"], + hdrs = ["src/test_time_zone_names.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = ["//visibility:private"], + deps = ["//absl/base:config"], ) cc_test( @@ -140,6 +146,7 @@ cc_test( ], deps = [ ":civil_time", + ":test_time_zone_names", ":time_zone", "//absl/base:config", "@googletest//:gtest", @@ -164,6 +171,7 @@ cc_test( tags = ["benchmark"], deps = [ ":civil_time", + ":test_time_zone_names", ":time_zone", "//absl/base:config", "@google_benchmark//:benchmark_main", diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc b/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc index ba7e149662..ce2781871d 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc @@ -23,6 +23,7 @@ #include "benchmark/benchmark.h" #include "absl/time/internal/cctz/include/cctz/civil_time.h" #include "absl/time/internal/cctz/include/cctz/time_zone.h" +#include "absl/time/internal/cctz/src/test_time_zone_names.h" #include "absl/time/internal/cctz/src/time_zone_impl.h" namespace { @@ -103,498 +104,10 @@ const char RFC3339_sec[] = "%Y-%m-%d%ET%H:%M:%S%Ez"; const char RFC1123_full[] = "%a, %d %b %Y %H:%M:%S %z"; const char RFC1123_no_wday[] = "%d %b %Y %H:%M:%S %z"; -// A list of known time-zone names. -// TODO: Refactor with src/time_zone_lookup_test.cc. -const char* const kTimeZoneNames[] = {"Africa/Abidjan", - "Africa/Accra", - "Africa/Addis_Ababa", - "Africa/Algiers", - "Africa/Asmara", - "Africa/Bamako", - "Africa/Bangui", - "Africa/Banjul", - "Africa/Bissau", - "Africa/Blantyre", - "Africa/Brazzaville", - "Africa/Bujumbura", - "Africa/Cairo", - "Africa/Casablanca", - "Africa/Ceuta", - "Africa/Conakry", - "Africa/Dakar", - "Africa/Dar_es_Salaam", - "Africa/Djibouti", - "Africa/Douala", - "Africa/El_Aaiun", - "Africa/Freetown", - "Africa/Gaborone", - "Africa/Harare", - "Africa/Johannesburg", - "Africa/Juba", - "Africa/Kampala", - "Africa/Khartoum", - "Africa/Kigali", - "Africa/Kinshasa", - "Africa/Lagos", - "Africa/Libreville", - "Africa/Lome", - "Africa/Luanda", - "Africa/Lubumbashi", - "Africa/Lusaka", - "Africa/Malabo", - "Africa/Maputo", - "Africa/Maseru", - "Africa/Mbabane", - "Africa/Mogadishu", - "Africa/Monrovia", - "Africa/Nairobi", - "Africa/Ndjamena", - "Africa/Niamey", - "Africa/Nouakchott", - "Africa/Ouagadougou", - "Africa/Porto-Novo", - "Africa/Sao_Tome", - "Africa/Timbuktu", - "Africa/Tripoli", - "Africa/Tunis", - "Africa/Windhoek", - "America/Adak", - "America/Anchorage", - "America/Anguilla", - "America/Antigua", - "America/Araguaina", - "America/Argentina/Buenos_Aires", - "America/Argentina/Catamarca", - "America/Argentina/Cordoba", - "America/Argentina/Jujuy", - "America/Argentina/La_Rioja", - "America/Argentina/Mendoza", - "America/Argentina/Rio_Gallegos", - "America/Argentina/Salta", - "America/Argentina/San_Juan", - "America/Argentina/San_Luis", - "America/Argentina/Tucuman", - "America/Argentina/Ushuaia", - "America/Aruba", - "America/Asuncion", - "America/Atikokan", - "America/Atka", - "America/Bahia", - "America/Bahia_Banderas", - "America/Barbados", - "America/Belem", - "America/Belize", - "America/Blanc-Sablon", - "America/Boa_Vista", - "America/Bogota", - "America/Boise", - "America/Cambridge_Bay", - "America/Campo_Grande", - "America/Cancun", - "America/Caracas", - "America/Cayenne", - "America/Cayman", - "America/Chicago", - "America/Chihuahua", - "America/Ciudad_Juarez", - "America/Coral_Harbour", - "America/Costa_Rica", - "America/Coyhaique", - "America/Creston", - "America/Cuiaba", - "America/Curacao", - "America/Danmarkshavn", - "America/Dawson", - "America/Dawson_Creek", - "America/Denver", - "America/Detroit", - "America/Dominica", - "America/Edmonton", - "America/Eirunepe", - "America/El_Salvador", - "America/Ensenada", - "America/Fort_Nelson", - "America/Fortaleza", - "America/Glace_Bay", - "America/Goose_Bay", - "America/Grand_Turk", - "America/Grenada", - "America/Guadeloupe", - "America/Guatemala", - "America/Guayaquil", - "America/Guyana", - "America/Halifax", - "America/Havana", - "America/Hermosillo", - "America/Indiana/Indianapolis", - "America/Indiana/Knox", - "America/Indiana/Marengo", - "America/Indiana/Petersburg", - "America/Indiana/Tell_City", - "America/Indiana/Vevay", - "America/Indiana/Vincennes", - "America/Indiana/Winamac", - "America/Inuvik", - "America/Iqaluit", - "America/Jamaica", - "America/Juneau", - "America/Kentucky/Louisville", - "America/Kentucky/Monticello", - "America/Kralendijk", - "America/La_Paz", - "America/Lima", - "America/Los_Angeles", - "America/Lower_Princes", - "America/Maceio", - "America/Managua", - "America/Manaus", - "America/Marigot", - "America/Martinique", - "America/Matamoros", - "America/Mazatlan", - "America/Menominee", - "America/Merida", - "America/Metlakatla", - "America/Mexico_City", - "America/Miquelon", - "America/Moncton", - "America/Monterrey", - "America/Montevideo", - "America/Montreal", - "America/Montserrat", - "America/Nassau", - "America/New_York", - "America/Nipigon", - "America/Nome", - "America/Noronha", - "America/North_Dakota/Beulah", - "America/North_Dakota/Center", - "America/North_Dakota/New_Salem", - "America/Nuuk", - "America/Ojinaga", - "America/Panama", - "America/Pangnirtung", - "America/Paramaribo", - "America/Phoenix", - "America/Port-au-Prince", - "America/Port_of_Spain", - "America/Porto_Acre", - "America/Porto_Velho", - "America/Puerto_Rico", - "America/Punta_Arenas", - "America/Rainy_River", - "America/Rankin_Inlet", - "America/Recife", - "America/Regina", - "America/Resolute", - "America/Rio_Branco", - "America/Santa_Isabel", - "America/Santarem", - "America/Santiago", - "America/Santo_Domingo", - "America/Sao_Paulo", - "America/Scoresbysund", - "America/Shiprock", - "America/Sitka", - "America/St_Barthelemy", - "America/St_Johns", - "America/St_Kitts", - "America/St_Lucia", - "America/St_Thomas", - "America/St_Vincent", - "America/Swift_Current", - "America/Tegucigalpa", - "America/Thule", - "America/Thunder_Bay", - "America/Tijuana", - "America/Toronto", - "America/Tortola", - "America/Vancouver", - "America/Virgin", - "America/Whitehorse", - "America/Winnipeg", - "America/Yakutat", - "America/Yellowknife", - "Antarctica/Casey", - "Antarctica/Davis", - "Antarctica/DumontDUrville", - "Antarctica/Macquarie", - "Antarctica/Mawson", - "Antarctica/McMurdo", - "Antarctica/Palmer", - "Antarctica/Rothera", - "Antarctica/Syowa", - "Antarctica/Troll", - "Antarctica/Vostok", - "Arctic/Longyearbyen", - "Asia/Aden", - "Asia/Almaty", - "Asia/Amman", - "Asia/Anadyr", - "Asia/Aqtau", - "Asia/Aqtobe", - "Asia/Ashgabat", - "Asia/Atyrau", - "Asia/Baghdad", - "Asia/Bahrain", - "Asia/Baku", - "Asia/Bangkok", - "Asia/Barnaul", - "Asia/Beirut", - "Asia/Bishkek", - "Asia/Brunei", - "Asia/Chita", - "Asia/Choibalsan", - "Asia/Chongqing", - "Asia/Colombo", - "Asia/Damascus", - "Asia/Dhaka", - "Asia/Dili", - "Asia/Dubai", - "Asia/Dushanbe", - "Asia/Famagusta", - "Asia/Gaza", - "Asia/Harbin", - "Asia/Hebron", - "Asia/Ho_Chi_Minh", - "Asia/Hong_Kong", - "Asia/Hovd", - "Asia/Irkutsk", - "Asia/Istanbul", - "Asia/Jakarta", - "Asia/Jayapura", - "Asia/Jerusalem", - "Asia/Kabul", - "Asia/Kamchatka", - "Asia/Karachi", - "Asia/Kashgar", - "Asia/Kathmandu", - "Asia/Khandyga", - "Asia/Kolkata", - "Asia/Krasnoyarsk", - "Asia/Kuala_Lumpur", - "Asia/Kuching", - "Asia/Kuwait", - "Asia/Macau", - "Asia/Magadan", - "Asia/Makassar", - "Asia/Manila", - "Asia/Muscat", - "Asia/Nicosia", - "Asia/Novokuznetsk", - "Asia/Novosibirsk", - "Asia/Omsk", - "Asia/Oral", - "Asia/Phnom_Penh", - "Asia/Pontianak", - "Asia/Pyongyang", - "Asia/Qatar", - "Asia/Qostanay", - "Asia/Qyzylorda", - "Asia/Riyadh", - "Asia/Sakhalin", - "Asia/Samarkand", - "Asia/Seoul", - "Asia/Shanghai", - "Asia/Singapore", - "Asia/Srednekolymsk", - "Asia/Taipei", - "Asia/Tashkent", - "Asia/Tbilisi", - "Asia/Tehran", - "Asia/Tel_Aviv", - "Asia/Thimphu", - "Asia/Tokyo", - "Asia/Tomsk", - "Asia/Ulaanbaatar", - "Asia/Urumqi", - "Asia/Ust-Nera", - "Asia/Vientiane", - "Asia/Vladivostok", - "Asia/Yakutsk", - "Asia/Yangon", - "Asia/Yekaterinburg", - "Asia/Yerevan", - "Atlantic/Azores", - "Atlantic/Bermuda", - "Atlantic/Canary", - "Atlantic/Cape_Verde", - "Atlantic/Faroe", - "Atlantic/Jan_Mayen", - "Atlantic/Madeira", - "Atlantic/Reykjavik", - "Atlantic/South_Georgia", - "Atlantic/St_Helena", - "Atlantic/Stanley", - "Australia/Adelaide", - "Australia/Brisbane", - "Australia/Broken_Hill", - "Australia/Canberra", - "Australia/Currie", - "Australia/Darwin", - "Australia/Eucla", - "Australia/Hobart", - "Australia/Lindeman", - "Australia/Lord_Howe", - "Australia/Melbourne", - "Australia/Perth", - "Australia/Sydney", - "Australia/Yancowinna", - "Etc/GMT", - "Etc/GMT+0", - "Etc/GMT+1", - "Etc/GMT+10", - "Etc/GMT+11", - "Etc/GMT+12", - "Etc/GMT+2", - "Etc/GMT+3", - "Etc/GMT+4", - "Etc/GMT+5", - "Etc/GMT+6", - "Etc/GMT+7", - "Etc/GMT+8", - "Etc/GMT+9", - "Etc/GMT-0", - "Etc/GMT-1", - "Etc/GMT-10", - "Etc/GMT-11", - "Etc/GMT-12", - "Etc/GMT-13", - "Etc/GMT-14", - "Etc/GMT-2", - "Etc/GMT-3", - "Etc/GMT-4", - "Etc/GMT-5", - "Etc/GMT-6", - "Etc/GMT-7", - "Etc/GMT-8", - "Etc/GMT-9", - "Etc/GMT0", - "Etc/Greenwich", - "Etc/UCT", - "Etc/UTC", - "Etc/Universal", - "Etc/Zulu", - "Europe/Amsterdam", - "Europe/Andorra", - "Europe/Astrakhan", - "Europe/Athens", - "Europe/Belfast", - "Europe/Belgrade", - "Europe/Berlin", - "Europe/Bratislava", - "Europe/Brussels", - "Europe/Bucharest", - "Europe/Budapest", - "Europe/Busingen", - "Europe/Chisinau", - "Europe/Copenhagen", - "Europe/Dublin", - "Europe/Gibraltar", - "Europe/Guernsey", - "Europe/Helsinki", - "Europe/Isle_of_Man", - "Europe/Istanbul", - "Europe/Jersey", - "Europe/Kaliningrad", - "Europe/Kirov", - "Europe/Kyiv", - "Europe/Lisbon", - "Europe/Ljubljana", - "Europe/London", - "Europe/Luxembourg", - "Europe/Madrid", - "Europe/Malta", - "Europe/Mariehamn", - "Europe/Minsk", - "Europe/Monaco", - "Europe/Moscow", - "Europe/Nicosia", - "Europe/Oslo", - "Europe/Paris", - "Europe/Podgorica", - "Europe/Prague", - "Europe/Riga", - "Europe/Rome", - "Europe/Samara", - "Europe/San_Marino", - "Europe/Sarajevo", - "Europe/Saratov", - "Europe/Simferopol", - "Europe/Skopje", - "Europe/Sofia", - "Europe/Stockholm", - "Europe/Tallinn", - "Europe/Tirane", - "Europe/Tiraspol", - "Europe/Ulyanovsk", - "Europe/Vaduz", - "Europe/Vatican", - "Europe/Vienna", - "Europe/Vilnius", - "Europe/Volgograd", - "Europe/Warsaw", - "Europe/Zagreb", - "Europe/Zurich", - "Factory", - "Indian/Antananarivo", - "Indian/Chagos", - "Indian/Christmas", - "Indian/Cocos", - "Indian/Comoro", - "Indian/Kerguelen", - "Indian/Mahe", - "Indian/Maldives", - "Indian/Mauritius", - "Indian/Mayotte", - "Indian/Reunion", - "Pacific/Apia", - "Pacific/Auckland", - "Pacific/Bougainville", - "Pacific/Chatham", - "Pacific/Chuuk", - "Pacific/Easter", - "Pacific/Efate", - "Pacific/Fakaofo", - "Pacific/Fiji", - "Pacific/Funafuti", - "Pacific/Galapagos", - "Pacific/Gambier", - "Pacific/Guadalcanal", - "Pacific/Guam", - "Pacific/Honolulu", - "Pacific/Johnston", - "Pacific/Kanton", - "Pacific/Kiritimati", - "Pacific/Kosrae", - "Pacific/Kwajalein", - "Pacific/Majuro", - "Pacific/Marquesas", - "Pacific/Midway", - "Pacific/Nauru", - "Pacific/Niue", - "Pacific/Norfolk", - "Pacific/Noumea", - "Pacific/Pago_Pago", - "Pacific/Palau", - "Pacific/Pitcairn", - "Pacific/Pohnpei", - "Pacific/Port_Moresby", - "Pacific/Rarotonga", - "Pacific/Saipan", - "Pacific/Samoa", - "Pacific/Tahiti", - "Pacific/Tarawa", - "Pacific/Tongatapu", - "Pacific/Wake", - "Pacific/Wallis", - "Pacific/Yap", - "UTC", - nullptr}; - std::vector AllTimeZoneNames() { std::vector names; - for (const char* const* namep = kTimeZoneNames; *namep != nullptr; ++namep) { + for (const char* const* namep = cctz::kTimeZoneNames; *namep != nullptr; + ++namep) { names.push_back(std::string("file:") + *namep); } assert(!names.empty()); @@ -889,6 +402,7 @@ const char* const kFormats[] = { RFC3339_sec, // 3 "%Y-%m-%d%ET%H:%M:%S", // 4 "%Y-%m-%d", // 5 + "%F%ET%T", // 6 }; const int kNumFormats = sizeof(kFormats) / sizeof(kFormats[0]); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.cc b/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.cc new file mode 100644 index 0000000000..ab54c9ae70 --- /dev/null +++ b/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.cc @@ -0,0 +1,515 @@ +// Copyright 2025 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// 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 "absl/time/internal/cctz/src/test_time_zone_names.h" + +#include "absl/base/config.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace time_internal { +namespace cctz { + +// A list of known time-zone names. +const char* const kTimeZoneNames[] = {"Africa/Abidjan", + "Africa/Accra", + "Africa/Addis_Ababa", + "Africa/Algiers", + "Africa/Asmara", + "Africa/Bamako", + "Africa/Bangui", + "Africa/Banjul", + "Africa/Bissau", + "Africa/Blantyre", + "Africa/Brazzaville", + "Africa/Bujumbura", + "Africa/Cairo", + "Africa/Casablanca", + "Africa/Ceuta", + "Africa/Conakry", + "Africa/Dakar", + "Africa/Dar_es_Salaam", + "Africa/Djibouti", + "Africa/Douala", + "Africa/El_Aaiun", + "Africa/Freetown", + "Africa/Gaborone", + "Africa/Harare", + "Africa/Johannesburg", + "Africa/Juba", + "Africa/Kampala", + "Africa/Khartoum", + "Africa/Kigali", + "Africa/Kinshasa", + "Africa/Lagos", + "Africa/Libreville", + "Africa/Lome", + "Africa/Luanda", + "Africa/Lubumbashi", + "Africa/Lusaka", + "Africa/Malabo", + "Africa/Maputo", + "Africa/Maseru", + "Africa/Mbabane", + "Africa/Mogadishu", + "Africa/Monrovia", + "Africa/Nairobi", + "Africa/Ndjamena", + "Africa/Niamey", + "Africa/Nouakchott", + "Africa/Ouagadougou", + "Africa/Porto-Novo", + "Africa/Sao_Tome", + "Africa/Timbuktu", + "Africa/Tripoli", + "Africa/Tunis", + "Africa/Windhoek", + "America/Adak", + "America/Anchorage", + "America/Anguilla", + "America/Antigua", + "America/Araguaina", + "America/Argentina/Buenos_Aires", + "America/Argentina/Catamarca", + "America/Argentina/Cordoba", + "America/Argentina/Jujuy", + "America/Argentina/La_Rioja", + "America/Argentina/Mendoza", + "America/Argentina/Rio_Gallegos", + "America/Argentina/Salta", + "America/Argentina/San_Juan", + "America/Argentina/San_Luis", + "America/Argentina/Tucuman", + "America/Argentina/Ushuaia", + "America/Aruba", + "America/Asuncion", + "America/Atikokan", + "America/Atka", + "America/Bahia", + "America/Bahia_Banderas", + "America/Barbados", + "America/Belem", + "America/Belize", + "America/Blanc-Sablon", + "America/Boa_Vista", + "America/Bogota", + "America/Boise", + "America/Cambridge_Bay", + "America/Campo_Grande", + "America/Cancun", + "America/Caracas", + "America/Cayenne", + "America/Cayman", + "America/Chicago", + "America/Chihuahua", + "America/Ciudad_Juarez", + "America/Coral_Harbour", + "America/Costa_Rica", + "America/Coyhaique", + "America/Creston", + "America/Cuiaba", + "America/Curacao", + "America/Danmarkshavn", + "America/Dawson", + "America/Dawson_Creek", + "America/Denver", + "America/Detroit", + "America/Dominica", + "America/Edmonton", + "America/Eirunepe", + "America/El_Salvador", + "America/Ensenada", + "America/Fort_Nelson", + "America/Fortaleza", + "America/Glace_Bay", + "America/Goose_Bay", + "America/Grand_Turk", + "America/Grenada", + "America/Guadeloupe", + "America/Guatemala", + "America/Guayaquil", + "America/Guyana", + "America/Halifax", + "America/Havana", + "America/Hermosillo", + "America/Indiana/Indianapolis", + "America/Indiana/Knox", + "America/Indiana/Marengo", + "America/Indiana/Petersburg", + "America/Indiana/Tell_City", + "America/Indiana/Vevay", + "America/Indiana/Vincennes", + "America/Indiana/Winamac", + "America/Inuvik", + "America/Iqaluit", + "America/Jamaica", + "America/Juneau", + "America/Kentucky/Louisville", + "America/Kentucky/Monticello", + "America/Kralendijk", + "America/La_Paz", + "America/Lima", + "America/Los_Angeles", + "America/Lower_Princes", + "America/Maceio", + "America/Managua", + "America/Manaus", + "America/Marigot", + "America/Martinique", + "America/Matamoros", + "America/Mazatlan", + "America/Menominee", + "America/Merida", + "America/Metlakatla", + "America/Mexico_City", + "America/Miquelon", + "America/Moncton", + "America/Monterrey", + "America/Montevideo", + "America/Montreal", + "America/Montserrat", + "America/Nassau", + "America/New_York", + "America/Nipigon", + "America/Nome", + "America/Noronha", + "America/North_Dakota/Beulah", + "America/North_Dakota/Center", + "America/North_Dakota/New_Salem", + "America/Nuuk", + "America/Ojinaga", + "America/Panama", + "America/Pangnirtung", + "America/Paramaribo", + "America/Phoenix", + "America/Port-au-Prince", + "America/Port_of_Spain", + "America/Porto_Acre", + "America/Porto_Velho", + "America/Puerto_Rico", + "America/Punta_Arenas", + "America/Rainy_River", + "America/Rankin_Inlet", + "America/Recife", + "America/Regina", + "America/Resolute", + "America/Rio_Branco", + "America/Santa_Isabel", + "America/Santarem", + "America/Santiago", + "America/Santo_Domingo", + "America/Sao_Paulo", + "America/Scoresbysund", + "America/Shiprock", + "America/Sitka", + "America/St_Barthelemy", + "America/St_Johns", + "America/St_Kitts", + "America/St_Lucia", + "America/St_Thomas", + "America/St_Vincent", + "America/Swift_Current", + "America/Tegucigalpa", + "America/Thule", + "America/Thunder_Bay", + "America/Tijuana", + "America/Toronto", + "America/Tortola", + "America/Vancouver", + "America/Virgin", + "America/Whitehorse", + "America/Winnipeg", + "America/Yakutat", + "America/Yellowknife", + "Antarctica/Casey", + "Antarctica/Davis", + "Antarctica/DumontDUrville", + "Antarctica/Macquarie", + "Antarctica/Mawson", + "Antarctica/McMurdo", + "Antarctica/Palmer", + "Antarctica/Rothera", + "Antarctica/Syowa", + "Antarctica/Troll", + "Antarctica/Vostok", + "Arctic/Longyearbyen", + "Asia/Aden", + "Asia/Almaty", + "Asia/Amman", + "Asia/Anadyr", + "Asia/Aqtau", + "Asia/Aqtobe", + "Asia/Ashgabat", + "Asia/Atyrau", + "Asia/Baghdad", + "Asia/Bahrain", + "Asia/Baku", + "Asia/Bangkok", + "Asia/Barnaul", + "Asia/Beirut", + "Asia/Bishkek", + "Asia/Brunei", + "Asia/Chita", + "Asia/Choibalsan", + "Asia/Chongqing", + "Asia/Colombo", + "Asia/Damascus", + "Asia/Dhaka", + "Asia/Dili", + "Asia/Dubai", + "Asia/Dushanbe", + "Asia/Famagusta", + "Asia/Gaza", + "Asia/Harbin", + "Asia/Hebron", + "Asia/Ho_Chi_Minh", + "Asia/Hong_Kong", + "Asia/Hovd", + "Asia/Irkutsk", + "Asia/Istanbul", + "Asia/Jakarta", + "Asia/Jayapura", + "Asia/Jerusalem", + "Asia/Kabul", + "Asia/Kamchatka", + "Asia/Karachi", + "Asia/Kashgar", + "Asia/Kathmandu", + "Asia/Khandyga", + "Asia/Kolkata", + "Asia/Krasnoyarsk", + "Asia/Kuala_Lumpur", + "Asia/Kuching", + "Asia/Kuwait", + "Asia/Macau", + "Asia/Magadan", + "Asia/Makassar", + "Asia/Manila", + "Asia/Muscat", + "Asia/Nicosia", + "Asia/Novokuznetsk", + "Asia/Novosibirsk", + "Asia/Omsk", + "Asia/Oral", + "Asia/Phnom_Penh", + "Asia/Pontianak", + "Asia/Pyongyang", + "Asia/Qatar", + "Asia/Qostanay", + "Asia/Qyzylorda", + "Asia/Riyadh", + "Asia/Sakhalin", + "Asia/Samarkand", + "Asia/Seoul", + "Asia/Shanghai", + "Asia/Singapore", + "Asia/Srednekolymsk", + "Asia/Taipei", + "Asia/Tashkent", + "Asia/Tbilisi", + "Asia/Tehran", + "Asia/Tel_Aviv", + "Asia/Thimphu", + "Asia/Tokyo", + "Asia/Tomsk", + "Asia/Ulaanbaatar", + "Asia/Urumqi", + "Asia/Ust-Nera", + "Asia/Vientiane", + "Asia/Vladivostok", + "Asia/Yakutsk", + "Asia/Yangon", + "Asia/Yekaterinburg", + "Asia/Yerevan", + "Atlantic/Azores", + "Atlantic/Bermuda", + "Atlantic/Canary", + "Atlantic/Cape_Verde", + "Atlantic/Faroe", + "Atlantic/Jan_Mayen", + "Atlantic/Madeira", + "Atlantic/Reykjavik", + "Atlantic/South_Georgia", + "Atlantic/St_Helena", + "Atlantic/Stanley", + "Australia/Adelaide", + "Australia/Brisbane", + "Australia/Broken_Hill", + "Australia/Canberra", + "Australia/Currie", + "Australia/Darwin", + "Australia/Eucla", + "Australia/Hobart", + "Australia/Lindeman", + "Australia/Lord_Howe", + "Australia/Melbourne", + "Australia/Perth", + "Australia/Sydney", + "Australia/Yancowinna", + "Etc/GMT", + "Etc/GMT+0", + "Etc/GMT+1", + "Etc/GMT+10", + "Etc/GMT+11", + "Etc/GMT+12", + "Etc/GMT+2", + "Etc/GMT+3", + "Etc/GMT+4", + "Etc/GMT+5", + "Etc/GMT+6", + "Etc/GMT+7", + "Etc/GMT+8", + "Etc/GMT+9", + "Etc/GMT-0", + "Etc/GMT-1", + "Etc/GMT-10", + "Etc/GMT-11", + "Etc/GMT-12", + "Etc/GMT-13", + "Etc/GMT-14", + "Etc/GMT-2", + "Etc/GMT-3", + "Etc/GMT-4", + "Etc/GMT-5", + "Etc/GMT-6", + "Etc/GMT-7", + "Etc/GMT-8", + "Etc/GMT-9", + "Etc/GMT0", + "Etc/Greenwich", + "Etc/UCT", + "Etc/UTC", + "Etc/Universal", + "Etc/Zulu", + "Europe/Amsterdam", + "Europe/Andorra", + "Europe/Astrakhan", + "Europe/Athens", + "Europe/Belfast", + "Europe/Belgrade", + "Europe/Berlin", + "Europe/Bratislava", + "Europe/Brussels", + "Europe/Bucharest", + "Europe/Budapest", + "Europe/Busingen", + "Europe/Chisinau", + "Europe/Copenhagen", + "Europe/Dublin", + "Europe/Gibraltar", + "Europe/Guernsey", + "Europe/Helsinki", + "Europe/Isle_of_Man", + "Europe/Istanbul", + "Europe/Jersey", + "Europe/Kaliningrad", + "Europe/Kirov", + "Europe/Kyiv", + "Europe/Lisbon", + "Europe/Ljubljana", + "Europe/London", + "Europe/Luxembourg", + "Europe/Madrid", + "Europe/Malta", + "Europe/Mariehamn", + "Europe/Minsk", + "Europe/Monaco", + "Europe/Moscow", + "Europe/Nicosia", + "Europe/Oslo", + "Europe/Paris", + "Europe/Podgorica", + "Europe/Prague", + "Europe/Riga", + "Europe/Rome", + "Europe/Samara", + "Europe/San_Marino", + "Europe/Sarajevo", + "Europe/Saratov", + "Europe/Simferopol", + "Europe/Skopje", + "Europe/Sofia", + "Europe/Stockholm", + "Europe/Tallinn", + "Europe/Tirane", + "Europe/Tiraspol", + "Europe/Ulyanovsk", + "Europe/Vaduz", + "Europe/Vatican", + "Europe/Vienna", + "Europe/Vilnius", + "Europe/Volgograd", + "Europe/Warsaw", + "Europe/Zagreb", + "Europe/Zurich", + "Factory", + "Indian/Antananarivo", + "Indian/Chagos", + "Indian/Christmas", + "Indian/Cocos", + "Indian/Comoro", + "Indian/Kerguelen", + "Indian/Mahe", + "Indian/Maldives", + "Indian/Mauritius", + "Indian/Mayotte", + "Indian/Reunion", + "Pacific/Apia", + "Pacific/Auckland", + "Pacific/Bougainville", + "Pacific/Chatham", + "Pacific/Chuuk", + "Pacific/Easter", + "Pacific/Efate", + "Pacific/Fakaofo", + "Pacific/Fiji", + "Pacific/Funafuti", + "Pacific/Galapagos", + "Pacific/Gambier", + "Pacific/Guadalcanal", + "Pacific/Guam", + "Pacific/Honolulu", + "Pacific/Johnston", + "Pacific/Kanton", + "Pacific/Kiritimati", + "Pacific/Kosrae", + "Pacific/Kwajalein", + "Pacific/Majuro", + "Pacific/Marquesas", + "Pacific/Midway", + "Pacific/Nauru", + "Pacific/Niue", + "Pacific/Norfolk", + "Pacific/Noumea", + "Pacific/Pago_Pago", + "Pacific/Palau", + "Pacific/Pitcairn", + "Pacific/Pohnpei", + "Pacific/Port_Moresby", + "Pacific/Rarotonga", + "Pacific/Saipan", + "Pacific/Samoa", + "Pacific/Tahiti", + "Pacific/Tarawa", + "Pacific/Tongatapu", + "Pacific/Wake", + "Pacific/Wallis", + "Pacific/Yap", + "UTC", + nullptr}; + +} // namespace cctz +} // namespace time_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.h b/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.h new file mode 100644 index 0000000000..1993994a1d --- /dev/null +++ b/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.h @@ -0,0 +1,33 @@ +// Copyright 2025 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// 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. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TEST_TIME_ZONE_NAMES_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TEST_TIME_ZONE_NAMES_H_ + +#include "absl/base/config.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace time_internal { +namespace cctz { + +// A list of known time-zone names. +extern const char* const kTimeZoneNames[]; + +} // namespace cctz +} // namespace time_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TEST_TIME_ZONE_NAMES_H_ diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc b/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc index 0e5f32f14a..f739e026e3 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc @@ -117,7 +117,7 @@ std::tm ToTM(const time_zone::absolute_lookup& al) { tm.tm_mday = al.cs.day(); tm.tm_mon = al.cs.month() - 1; - // Saturate tm.tm_year is cases of over/underflow. + // Saturate tm.tm_year in cases of over/underflow. if (al.cs.year() < std::numeric_limits::min() + 1900) { tm.tm_year = std::numeric_limits::min(); } else if (al.cs.year() - 1900 > std::numeric_limits::max()) { @@ -338,7 +338,7 @@ std::string format(const std::string& format, const time_point& tp, const std::tm tm = ToTM(al); // Scratch buffer for internal conversions. - char buf[3 + kDigits10_64]; // enough for longest conversion + char buf[6 + (kDigits10_64 + 2)]; // enough for longest conversion %F char* const ep = buf + sizeof(buf); char* bp; // works back from ep @@ -382,7 +382,7 @@ std::string format(const std::string& format, const time_point& tp, if (cur == end || (cur - percent) % 2 == 0) continue; // Simple specifiers that we handle ourselves. - if (strchr("YmdeUuWwHMSzZs%", *cur)) { + if (strchr("YmdeFUuWwHMSTzZs%", *cur)) { if (cur - 1 != pending) { FormatTM(&result, std::string(pending, cur - 1), tm); } @@ -403,6 +403,14 @@ std::string format(const std::string& format, const time_point& tp, if (*cur == 'e' && *bp == '0') *bp = ' '; // for Windows result.append(bp, static_cast(ep - bp)); break; + case 'F': + bp = Format02d(ep, al.cs.day()); + *--bp = '-'; + bp = Format02d(bp, al.cs.month()); + *--bp = '-'; + bp = Format64(bp, 0, al.cs.year()); + result.append(bp, static_cast(ep - bp)); + break; case 'U': bp = Format02d(ep, ToWeek(civil_day(al.cs), weekday::sunday)); result.append(bp, static_cast(ep - bp)); @@ -431,6 +439,14 @@ std::string format(const std::string& format, const time_point& tp, bp = Format02d(ep, al.cs.second()); result.append(bp, static_cast(ep - bp)); break; + case 'T': + bp = Format02d(ep, al.cs.second()); + *--bp = ':'; + bp = Format02d(bp, al.cs.minute()); + *--bp = ':'; + bp = Format02d(bp, al.cs.hour()); + result.append(bp, static_cast(ep - bp)); + break; case 'z': bp = FormatOffset(ep, al.offset, ""); result.append(bp, static_cast(ep - bp)); @@ -769,6 +785,20 @@ bool parse(const std::string& format, const std::string& input, data = ParseInt(data, 2, 1, 31, &tm.tm_mday); week_num = -1; continue; + case 'F': + data = ParseInt(data, 0, kyearmin, kyearmax, &year); + if (data != nullptr) { + saw_year = true; + data = (*data == '-' ? data + 1 : nullptr); + } + data = ParseInt(data, 2, 1, 12, &tm.tm_mon); + if (data != nullptr) { + tm.tm_mon -= 1; + data = (*data == '-' ? data + 1 : nullptr); + } + data = ParseInt(data, 2, 1, 31, &tm.tm_mday); + week_num = -1; + continue; case 'U': data = ParseInt(data, 0, 0, 53, &week_num); week_start = weekday::sunday; @@ -794,13 +824,20 @@ bool parse(const std::string& format, const std::string& input, case 'S': data = ParseInt(data, 2, 0, 60, &tm.tm_sec); continue; + case 'T': + data = ParseInt(data, 2, 0, 23, &tm.tm_hour); + twelve_hour = false; + data = (data != nullptr && *data == ':' ? data + 1 : nullptr); + data = ParseInt(data, 2, 0, 59, &tm.tm_min); + data = (data != nullptr && *data == ':' ? data + 1 : nullptr); + data = ParseInt(data, 2, 0, 60, &tm.tm_sec); + continue; case 'I': case 'l': case 'r': // probably uses %I twelve_hour = true; break; case 'R': // uses %H - case 'T': // uses %H case 'c': // probably uses %H case 'X': // probably uses %H twelve_hour = false; diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/time/time.cc b/naiveproxy/src/third_party/abseil-cpp/absl/time/time.cc index d983c12bb5..faef864e8c 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/time/time.cc +++ b/naiveproxy/src/third_party/abseil-cpp/absl/time/time.cc @@ -249,8 +249,8 @@ absl::Time FromUniversal(int64_t universal) { int64_t ToUnixNanos(Time t) { if (time_internal::GetRepHi(time_internal::ToUnixDuration(t)) >= 0 && time_internal::GetRepHi(time_internal::ToUnixDuration(t)) >> 33 == 0) { - return (time_internal::GetRepHi(time_internal::ToUnixDuration(t)) * - 1000 * 1000 * 1000) + + return (time_internal::GetRepHi(time_internal::ToUnixDuration(t)) * 1000 * + 1000 * 1000) + (time_internal::GetRepLo(time_internal::ToUnixDuration(t)) / 4); } return FloorToUnit(time_internal::ToUnixDuration(t), absl::Nanoseconds(1)); @@ -259,8 +259,8 @@ int64_t ToUnixNanos(Time t) { int64_t ToUnixMicros(Time t) { if (time_internal::GetRepHi(time_internal::ToUnixDuration(t)) >= 0 && time_internal::GetRepHi(time_internal::ToUnixDuration(t)) >> 43 == 0) { - return (time_internal::GetRepHi(time_internal::ToUnixDuration(t)) * - 1000 * 1000) + + return (time_internal::GetRepHi(time_internal::ToUnixDuration(t)) * 1000 * + 1000) + (time_internal::GetRepLo(time_internal::ToUnixDuration(t)) / 4000); } return FloorToUnit(time_internal::ToUnixDuration(t), absl::Microseconds(1)); diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/time/time.h b/naiveproxy/src/third_party/abseil-cpp/absl/time/time.h index 29beaac19a..8e8df2e970 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/time/time.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/time/time.h @@ -732,7 +732,6 @@ bool ParseDuration(absl::string_view dur_string, Duration* d); // `absl::ParseDuration()`. bool AbslParseFlag(absl::string_view text, Duration* dst, std::string* error); - // AbslUnparseFlag() // // Unparses a Duration value into a command-line string representation using @@ -1681,14 +1680,16 @@ ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration FromInt64(int64_t v, return (v <= (std::numeric_limits::max)() / 60 && v >= (std::numeric_limits::min)() / 60) ? MakeDuration(v * 60) - : v > 0 ? InfiniteDuration() : -InfiniteDuration(); + : v > 0 ? InfiniteDuration() + : -InfiniteDuration(); } ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration FromInt64(int64_t v, std::ratio<3600>) { return (v <= (std::numeric_limits::max)() / 3600 && v >= (std::numeric_limits::min)() / 3600) ? MakeDuration(v * 3600) - : v > 0 ? InfiniteDuration() : -InfiniteDuration(); + : v > 0 ? InfiniteDuration() + : -InfiniteDuration(); } // IsValidRep64(0) is true if the expression `int64_t{std::declval()}` is @@ -1806,13 +1807,12 @@ ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration operator-(Duration d) { (std::numeric_limits::min)() ? InfiniteDuration() : time_internal::MakeDuration(-time_internal::GetRepHi(d)) - : time_internal::IsInfiniteDuration(d) - ? time_internal::OppositeInfinity(d) - : time_internal::MakeDuration( - time_internal::NegateAndSubtractOne( - time_internal::GetRepHi(d)), - time_internal::kTicksPerSecond - - time_internal::GetRepLo(d)); + : time_internal::IsInfiniteDuration(d) + ? time_internal::OppositeInfinity(d) + : time_internal::MakeDuration( + time_internal::NegateAndSubtractOne( + time_internal::GetRepHi(d)), + time_internal::kTicksPerSecond - time_internal::GetRepLo(d)); } ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration InfiniteDuration() { diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/types/compare.h b/naiveproxy/src/third_party/abseil-cpp/absl/types/compare.h index 3cf4a91768..edf1039883 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/types/compare.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/types/compare.h @@ -120,8 +120,7 @@ enum class ncmp : value_type { unordered = -127 }; // A no-op expansion that can be followed by a semicolon at class level. #define ABSL_COMPARE_INLINE_BASECLASS_DECL(name) static_assert(true, "") -#define ABSL_COMPARE_INLINE_SUBCLASS_DECL(type, name) \ - static const type name +#define ABSL_COMPARE_INLINE_SUBCLASS_DECL(type, name) static const type name #define ABSL_COMPARE_INLINE_INIT(type, name, init) \ inline constexpr type type::name(init) @@ -190,28 +189,28 @@ class partial_ordering ABSL_COMPARE_INLINE_SUBCLASS_DECL(partial_ordering, unordered); // Comparisons - friend constexpr bool operator==( - partial_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator==(partial_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.is_ordered() && v.value_ == 0; } - friend constexpr bool operator!=( - partial_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator!=(partial_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return !v.is_ordered() || v.value_ != 0; } - friend constexpr bool operator<( - partial_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator<(partial_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.is_ordered() && v.value_ < 0; } - friend constexpr bool operator<=( - partial_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator<=(partial_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.is_ordered() && v.value_ <= 0; } - friend constexpr bool operator>( - partial_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator>(partial_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.is_ordered() && v.value_ > 0; } - friend constexpr bool operator>=( - partial_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator>=(partial_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.is_ordered() && v.value_ >= 0; } friend constexpr bool operator==(compare_internal::OnlyLiteralZero, @@ -278,28 +277,28 @@ class weak_ordering : partial_ordering::greater); } // Comparisons - friend constexpr bool operator==( - weak_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator==(weak_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.value_ == 0; } - friend constexpr bool operator!=( - weak_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator!=(weak_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.value_ != 0; } - friend constexpr bool operator<( - weak_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator<(weak_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.value_ < 0; } - friend constexpr bool operator<=( - weak_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator<=(weak_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.value_ <= 0; } - friend constexpr bool operator>( - weak_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator>(weak_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.value_ > 0; } - friend constexpr bool operator>=( - weak_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator>=(weak_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.value_ >= 0; } friend constexpr bool operator==(compare_internal::OnlyLiteralZero, @@ -370,28 +369,28 @@ class strong_ordering : (value_ < 0 ? weak_ordering::less : weak_ordering::greater); } // Comparisons - friend constexpr bool operator==( - strong_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator==(strong_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.value_ == 0; } - friend constexpr bool operator!=( - strong_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator!=(strong_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.value_ != 0; } - friend constexpr bool operator<( - strong_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator<(strong_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.value_ < 0; } - friend constexpr bool operator<=( - strong_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator<=(strong_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.value_ <= 0; } - friend constexpr bool operator>( - strong_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator>(strong_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.value_ > 0; } - friend constexpr bool operator>=( - strong_ordering v, compare_internal::OnlyLiteralZero) noexcept { + friend constexpr bool operator>=(strong_ordering v, + compare_internal::OnlyLiteralZero) noexcept { return v.value_ >= 0; } friend constexpr bool operator==(compare_internal::OnlyLiteralZero, @@ -451,14 +450,16 @@ namespace compare_internal { // SFINAE prevents implicit conversions to bool (such as from int). template ::value, int> = 0> -constexpr bool compare_result_as_less_than(const BoolT r) { return r; } +constexpr bool compare_result_as_less_than(const BoolT r) { + return r; +} constexpr bool compare_result_as_less_than(const absl::weak_ordering r) { return r < 0; } template -constexpr bool do_less_than_comparison(const Compare &compare, const K &x, - const LK &y) { +constexpr bool do_less_than_comparison(const Compare& compare, const K& x, + const LK& y) { return compare_result_as_less_than(compare(x, y)); } @@ -468,34 +469,34 @@ constexpr bool do_less_than_comparison(const Compare &compare, const K &x, template ::value, int> = 0> constexpr absl::weak_ordering compare_result_as_ordering(const Int c) { - return c < 0 ? absl::weak_ordering::less - : c == 0 ? absl::weak_ordering::equivalent - : absl::weak_ordering::greater; + return c < 0 ? absl::weak_ordering::less + : c == 0 ? absl::weak_ordering::equivalent + : absl::weak_ordering::greater; } constexpr absl::weak_ordering compare_result_as_ordering( const absl::weak_ordering c) { return c; } -template < - typename Compare, typename K, typename LK, - absl::enable_if_t>::value, - int> = 0> -constexpr absl::weak_ordering do_three_way_comparison(const Compare &compare, - const K &x, const LK &y) { +template >::value, + int> = 0> +constexpr absl::weak_ordering do_three_way_comparison(const Compare& compare, + const K& x, const LK& y) { return compare_result_as_ordering(compare(x, y)); } -template < - typename Compare, typename K, typename LK, - absl::enable_if_t>::value, - int> = 0> -constexpr absl::weak_ordering do_three_way_comparison(const Compare &compare, - const K &x, const LK &y) { - return compare(x, y) ? absl::weak_ordering::less - : compare(y, x) ? absl::weak_ordering::greater - : absl::weak_ordering::equivalent; +template >::value, + int> = 0> +constexpr absl::weak_ordering do_three_way_comparison(const Compare& compare, + const K& x, const LK& y) { + return compare(x, y) ? absl::weak_ordering::less + : compare(y, x) ? absl::weak_ordering::greater + : absl::weak_ordering::equivalent; } } // namespace compare_internal diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/types/internal/span.h b/naiveproxy/src/third_party/abseil-cpp/absl/types/internal/span.h index 1039f612b6..cdf394185d 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/types/internal/span.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/types/internal/span.h @@ -121,6 +121,7 @@ struct IsView< using ConstData = decltype(span_internal::GetData(std::declval())); using MutData = decltype(span_internal::GetData(std::declval())); + public: static constexpr bool value = std::is_same::value; }; diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/types/optional.h b/naiveproxy/src/third_party/abseil-cpp/absl/types/optional.h index 65bba64ff2..5b68a5be99 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/types/optional.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/types/optional.h @@ -31,10 +31,10 @@ namespace absl { ABSL_NAMESPACE_BEGIN using std::bad_optional_access; -using std::optional; using std::make_optional; -using std::nullopt_t; using std::nullopt; +using std::nullopt_t; +using std::optional; ABSL_NAMESPACE_END } // namespace absl diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/types/span.h b/naiveproxy/src/third_party/abseil-cpp/absl/types/span.h index 3338e878e8..d2cf627562 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/types/span.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/types/span.h @@ -91,10 +91,10 @@ ABSL_NAMESPACE_END #if defined(__cpp_lib_ranges) && __cpp_lib_ranges >= 201911L #include // NOLINT(build/c++20) template - // NOLINTNEXTLINE(build/c++20) +// NOLINTNEXTLINE(build/c++20) inline constexpr bool std::ranges::enable_view> = true; template - // NOLINTNEXTLINE(build/c++20) +// NOLINTNEXTLINE(build/c++20) inline constexpr bool std::ranges::enable_borrowed_range> = true; #endif @@ -726,24 +726,38 @@ ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool operator>=(Span a, const U& b) { // } // template -constexpr Span MakeSpan(T* absl_nullable ptr, size_t size) noexcept { +constexpr Span MakeSpan(T* absl_nullable ptr ABSL_ATTRIBUTE_LIFETIME_BOUND, + size_t size) noexcept { return Span(ptr, size); } template -Span MakeSpan(T* absl_nullable begin, T* absl_nullable end) noexcept { +Span MakeSpan(T* absl_nullable begin ABSL_ATTRIBUTE_LIFETIME_BOUND, + T* absl_nullable end) noexcept { ABSL_HARDENING_ASSERT(begin <= end); return Span(begin, static_cast(end - begin)); } template constexpr auto MakeSpan(C& c) noexcept // NOLINT(runtime/references) - -> decltype(absl::MakeSpan(span_internal::GetData(c), c.size())) { + -> std::enable_if_t::value, + decltype(absl::MakeSpan(span_internal::GetData(c), + c.size()))> { + return MakeSpan(span_internal::GetData(c), c.size()); +} + +template +constexpr auto MakeSpan( + C& c ABSL_ATTRIBUTE_LIFETIME_BOUND) noexcept // NOLINT(runtime/references) + -> std::enable_if_t::value, + decltype(absl::MakeSpan(span_internal::GetData(c), + c.size()))> { return MakeSpan(span_internal::GetData(c), c.size()); } template -constexpr Span MakeSpan(T (&array)[N]) noexcept { +constexpr Span MakeSpan( + T (&array ABSL_ATTRIBUTE_LIFETIME_BOUND)[N]) noexcept { return Span(array, N); } @@ -772,25 +786,36 @@ constexpr Span MakeSpan(T (&array)[N]) noexcept { // ProcessInts(absl::MakeConstSpan(std::vector{ 0, 0, 0 })); // template -constexpr Span MakeConstSpan(T* absl_nullable ptr, - size_t size) noexcept { +constexpr Span MakeConstSpan( + T* absl_nullable ptr ABSL_ATTRIBUTE_LIFETIME_BOUND, size_t size) noexcept { return Span(ptr, size); } template -Span MakeConstSpan(T* absl_nullable begin, +Span MakeConstSpan(T* absl_nullable begin + ABSL_ATTRIBUTE_LIFETIME_BOUND, T* absl_nullable end) noexcept { ABSL_HARDENING_ASSERT(begin <= end); return Span(begin, end - begin); } template -constexpr auto MakeConstSpan(const C& c) noexcept -> decltype(MakeSpan(c)) { +constexpr auto MakeConstSpan(const C& c) noexcept + -> std::enable_if_t::value, + decltype(MakeSpan(c))> { + return MakeSpan(c); +} + +template +constexpr auto MakeConstSpan(const C& c ABSL_ATTRIBUTE_LIFETIME_BOUND) noexcept + -> std::enable_if_t::value, + decltype(MakeSpan(c))> { return MakeSpan(c); } template -constexpr Span MakeConstSpan(const T (&array)[N]) noexcept { +constexpr Span MakeConstSpan( + const T (&array ABSL_ATTRIBUTE_LIFETIME_BOUND)[N]) noexcept { return Span(array, N); } ABSL_NAMESPACE_END diff --git a/naiveproxy/src/third_party/abseil-cpp/absl/utility/utility.h b/naiveproxy/src/third_party/abseil-cpp/absl/utility/utility.h index 4637b03df1..4d72c31a4f 100644 --- a/naiveproxy/src/third_party/abseil-cpp/absl/utility/utility.h +++ b/naiveproxy/src/third_party/abseil-cpp/absl/utility/utility.h @@ -49,6 +49,19 @@ using std::make_index_sequence; using std::make_integer_sequence; using std::move; +#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L +// Backfill for std::nontype_t. An instance of this class can be provided as a +// disambiguation tag to `absl::function_ref` to pass the address of a known +// callable at compile time. +// Requires C++20 due to `auto` template parameter. +template +struct nontype_t { + explicit nontype_t() = default; +}; +template +constexpr nontype_t nontype{}; +#endif + ABSL_NAMESPACE_END } // namespace absl diff --git a/naiveproxy/src/third_party/abseil-cpp/generate_def_files.py b/naiveproxy/src/third_party/abseil-cpp/generate_def_files.py index 4a48532c8c..c80356f841 100755 --- a/naiveproxy/src/third_party/abseil-cpp/generate_def_files.py +++ b/naiveproxy/src/third_party/abseil-cpp/generate_def_files.py @@ -27,8 +27,10 @@ import sys import tempfile import time + assert sys.platform != 'win32', \ - "This doesn't work on Windows due to https://crbug.com/3790230222" + "This doesn't work on Windows, https://crbug.com/379023022" + # Matches mangled symbols containing 'absl' or starting with 'Absl'. This is # a good enough heuristic to select Abseil symbols to list in the .def file. @@ -36,28 +38,13 @@ assert sys.platform != 'win32', \ # which describes decorations under different calling conventions. We mostly # just attempt to handle any leading underscore for C names (as in __cdecl). ABSL_SYM_RE = r'0* [BT] (?P[?]+[^?].*absl.*|_?Absl.*)' -if sys.platform == 'win32': - # Typical dumpbin /symbol lines look like this: - # 04B 0000000C SECT14 notype Static | ?$S1@?1??SetCurrent - # ThreadIdentity@base_internal@absl@@YAXPAUThreadIdentity@12@P6AXPAX@Z@Z@4IA - # (unsigned int `void __cdecl absl::base_internal::SetCurrentThreadIdentity... - # We need to start on "| ?" and end on the first " (" (stopping on space would - # also work). - # This regex is identical inside the () characters except for the ? after .*, - # which is needed to prevent greedily grabbing the undecorated version of the - # symbols. - ABSL_SYM_RE = r'.*External \| (?P[?]+[^?].*?absl.*?|_?Absl.*?)($| \(.*)' - # Typical exported symbols in dumpbin /directives look like: - # /EXPORT:?kHexChar@numbers_internal@absl@@3QBDB,DATA - ABSL_EXPORTED_RE = r'.*/EXPORT:(.*),.*' def _DebugOrRelease(is_debug): return 'dbg' if is_debug else 'rel' -def _GenerateDefFile(cpu, is_debug, extra_gn_args=[], suffix=None): - """Generates a .def file for the absl component build on the specified CPU.""" +def _GenerateDefFileBuild(cpu, is_debug, use_cxx23, extra_gn_args, suffix, out_dir, cwd): if extra_gn_args: assert suffix != None, 'suffix is needed when extra_gn_args is used' @@ -67,6 +54,7 @@ def _GenerateDefFile(cpu, is_debug, extra_gn_args=[], suffix=None): 'is_component_build = true', 'is_debug = {}'.format(str(is_debug).lower()), 'proprietary_codecs = true', + 'use_cxx23={}'.format(str(use_cxx23).lower()), 'symbol_level = 0', 'target_cpu = "{}"'.format(cpu), 'target_os = "win"', @@ -76,114 +64,89 @@ def _GenerateDefFile(cpu, is_debug, extra_gn_args=[], suffix=None): gn = 'gn' autoninja = 'autoninja' - symbol_dumper = ['third_party/llvm-build/Release+Asserts/bin/llvm-nm'] + llvm_nm = ['third_party/llvm-build/Release+Asserts/bin/llvm-nm'] if sys.platform == 'win32': gn = 'gn.bat' autoninja = 'autoninja.bat' - symbol_dumper = ['dumpbin', '/symbols'] - import shutil - if not shutil.which('dumpbin'): - logging.error('dumpbin not found. Run tools\\win\\setenv.bat.') - exit(1) + llvm_nm += '.exe' + + logging.info('[%s - %s] Creating tmp out dir in %s', cpu, flavor, out_dir) + subprocess.check_call([gn, 'gen', out_dir, '--args=' + ' '.join(gn_args)], + cwd=cwd) + logging.info('[%s - %s] gn gen completed', cpu, flavor) + subprocess.check_call( + [autoninja, '-C', out_dir, 'third_party/abseil-cpp:absl_component_deps'], + cwd=os.getcwd()) + logging.info('[%s - %s] autoninja completed', cpu, flavor) + + obj_files = [] + for root, _dirnames, filenames in os.walk( + os.path.join(out_dir, 'obj', 'third_party', 'abseil-cpp')): + matched_files = fnmatch.filter(filenames, '*.obj') + obj_files.extend((os.path.join(root, f) for f in matched_files)) + + logging.info('[%s - %s] Found %d object files.', cpu, flavor, len(obj_files)) + + absl_symbols = set() + for f in obj_files: + stdout = subprocess.check_output(llvm_nm + [f], cwd=os.getcwd()) + for line in stdout.splitlines(): + line = line.decode('utf-8') + match = re.match(ABSL_SYM_RE, line) + if match: + symbol = match.group('symbol') + assert symbol.count(' ') == 0, ('Regex matched too much, probably got ' + 'undecorated name as well') + # Avoid to export deleting dtors since they trigger + # "lld-link: error: export of deleting dtor" linker errors, see + # crbug.com/1201277. + if symbol.startswith('??_G'): + continue + # Strip any leading underscore for C names (as in __cdecl). It's only + # there on x86, but the x86 toolchain falls over when you include it! + if cpu == 'x86' and symbol.startswith('_'): + symbol = symbol[1:] + absl_symbols.add(symbol) + + logging.info('[%s - %s] Found %d absl symbols.', cpu, flavor, len(absl_symbols)) + + if extra_gn_args: + def_file = os.path.join('third_party', 'abseil-cpp', + 'symbols_{}_{}_{}'.format(cpu, flavor, suffix)) + else: + def_file = os.path.join('third_party', 'abseil-cpp', + 'symbols_{}_{}'.format(cpu, flavor)) + if use_cxx23: + def_file += "_cxx23" + def_file += ".def" + + with open(def_file, 'w', newline='') as f: + f.write('EXPORTS\n') + for s in sorted(absl_symbols): + f.write(' {}\n'.format(s)) + + logging.info('[%s - %s] .def file successfully generated.', cpu, flavor) + + +def _GenerateDefFile(cpu, is_debug, use_cxx23, extra_gn_args=[], suffix=None): + """Generates a .def file for the absl component build on the specified CPU.""" cwd = os.getcwd() with tempfile.TemporaryDirectory(dir=os.path.join(cwd, 'out')) as out_dir: - logging.info('[%s - %s] Creating tmp out dir in %s', cpu, flavor, out_dir) - subprocess.check_call([gn, 'gen', out_dir, '--args=' + ' '.join(gn_args)], - cwd=cwd) - logging.info('[%s - %s] gn gen completed', cpu, flavor) - subprocess.check_call( - [autoninja, '-C', out_dir, 'third_party/abseil-cpp:absl_component_deps'], - cwd=os.getcwd()) - logging.info('[%s - %s] autoninja completed', cpu, flavor) - - obj_files = [] - for root, _dirnames, filenames in os.walk( - os.path.join(out_dir, 'obj', 'third_party', 'abseil-cpp')): - matched_files = fnmatch.filter(filenames, '*.obj') - obj_files.extend((os.path.join(root, f) for f in matched_files)) - - logging.info('[%s - %s] Found %d object files.', cpu, flavor, len(obj_files)) - - absl_symbols = set() - dll_exports = set() - if sys.platform == 'win32': - for f in obj_files: - # Track all of the functions exported with __declspec(dllexport) and - # don't list them in the .def file - double-exports are not allowed. The - # error is "lld-link: error: duplicate /export option". - exports_out = subprocess.check_output(['dumpbin', '/directives', f], cwd=os.getcwd()) - for line in exports_out.splitlines(): - line = line.decode('utf-8') - match = re.match(ABSL_EXPORTED_RE, line) - if match: - dll_exports.add(match.groups()[0]) - for f in obj_files: - stdout = subprocess.check_output(symbol_dumper + [f], cwd=os.getcwd()) - for line in stdout.splitlines(): - try: - line = line.decode('utf-8') - except UnicodeDecodeError: - # Due to a dumpbin bug there are sometimes invalid utf-8 characters in - # the output. This only happens on an unimportant line so it can - # safely and silently be skipped. - # https://developercommunity.visualstudio.com/content/problem/1091330/dumpbin-symbols-produces-randomly-wrong-output-on.html - continue - match = re.match(ABSL_SYM_RE, line) - if match: - symbol = match.group('symbol') - assert symbol.count(' ') == 0, ('Regex matched too much, probably got ' - 'undecorated name as well') - # Avoid getting names exported with dllexport, to avoid - # "lld-link: error: duplicate /export option" on symbols such as: - # ?kHexChar@numbers_internal@absl@@3QBDB - if symbol in dll_exports: - continue - # Avoid to export deleting dtors since they trigger - # "lld-link: error: export of deleting dtor" linker errors, see - # crbug.com/1201277. - if symbol.startswith('??_G'): - continue - # Strip any leading underscore for C names (as in __cdecl). It's only - # there on x86, but the x86 toolchain falls over when you include it! - if cpu == 'x86' and symbol.startswith('_'): - symbol = symbol[1:] - absl_symbols.add(symbol) - - logging.info('[%s - %s] Found %d absl symbols.', cpu, flavor, len(absl_symbols)) - - if extra_gn_args: - def_file = os.path.join('third_party', 'abseil-cpp', - 'symbols_{}_{}_{}.def'.format(cpu, flavor, suffix)) - else: - def_file = os.path.join('third_party', 'abseil-cpp', - 'symbols_{}_{}.def'.format(cpu, flavor)) - - with open(def_file, 'w', newline='') as f: - f.write('EXPORTS\n') - for s in sorted(absl_symbols): - f.write(' {}\n'.format(s)) + _GenerateDefFileBuild(cpu, is_debug, use_cxx23, extra_gn_args, suffix, out_dir, cwd) # Hack, it looks like there is a race in the directory cleanup. time.sleep(10) - logging.info('[%s - %s] .def file successfully generated.', cpu, flavor) - if __name__ == '__main__': logging.getLogger().setLevel(logging.INFO) - if sys.version_info.major == 2: - logging.error('This script requires Python 3.') - exit(1) - if not os.getcwd().endswith('src') or not os.path.exists('chrome/browser'): logging.error('Run this script from a chromium/src/ directory.') exit(1) - _GenerateDefFile('x86', True) - _GenerateDefFile('x86', False) - _GenerateDefFile('x64', True) - _GenerateDefFile('x64', False) - _GenerateDefFile('x64', False, ['is_asan = true'], 'asan') - _GenerateDefFile('arm64', True) - _GenerateDefFile('arm64', False) + for use_cxx23 in (True, False): + _GenerateDefFile('x64', False, use_cxx23, ['is_asan = true'], 'asan') + for arch in ('x86', 'x64', 'arm64'): + for is_debug in (True, False): + _GenerateDefFile(arch, is_debug, use_cxx23) diff --git a/naiveproxy/src/third_party/abseil-cpp/symbols_arm64_dbg.def b/naiveproxy/src/third_party/abseil-cpp/symbols_arm64_dbg.def index e05d057398..68ea31c210 100644 --- a/naiveproxy/src/third_party/abseil-cpp/symbols_arm64_dbg.def +++ b/naiveproxy/src/third_party/abseil-cpp/symbols_arm64_dbg.def @@ -18,6 +18,7 @@ EXPORTS ??$?0$$T@?$Storage@PEAPEAUCordRep@cord_internal@absl@@$00U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEA$$T@Z ??$?0$$T@?$Storage@PEAPEAVLogSink@absl@@$00U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@internal_compressed_tuple@container_internal@2@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEA$$T@Z ??$?0$$T@?$Storage@PEAUPayload@status_internal@absl@@$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEA$$T@Z + ??$?0$$V$0A@@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAA@XZ ??$?0$$V$0A@@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAA@XZ ??$?0$$V$0A@@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAA@XZ ??$?0$$V$0A@@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEAA@XZ @@ -25,12 +26,14 @@ EXPORTS ??$?0$$V$0A@@?$NoDestructor@VMutex@absl@@@absl@@QEAA@XZ ??$?0$$V@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z ??$?0$$V@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??$?0$$V@PlacementImpl@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAA@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAA@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAA@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEAA@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAA@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@VMutex@absl@@@absl@@QEAA@XZ ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@QEAA@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@23@@__Cr@std@@QEAA@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@45@@Z ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AEBQEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@AEBQEAVCommandLineFlag@absl@@@Z ??$?0$00X@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ ??$?0$00X@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ @@ -72,7 +75,10 @@ EXPORTS ??$?0AEAPEAVCommandLineFlag@absl@@AEA_N@?$__tuple_impl@U?$__integer_sequence@_K$0A@$00@__Cr@std@@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@QEAA@U__forward_args@12@AEAPEAVCommandLineFlag@absl@@AEA_N@Z ??$?0AEAPEAVCommandLineFlag@absl@@AEA_N@?$__tuple_impl@U?$__integer_sequence@_K$0A@$00@__Cr@std@@PEAVCommandLineFlag@absl@@_N@__Cr@std@@QEAA@U__forward_args@12@AEAPEAVCommandLineFlag@absl@@AEA_N@Z ??$?0AEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU0123@$0A@@?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@QEAA@AEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAU3456@@Z + ??$?0AEAUFindInfo@container_internal@absl@@$0A@@?$__tuple_leaf@$0A@AEAUFindInfo@container_internal@absl@@$0A@@__Cr@std@@QEAA@AEAUFindInfo@container_internal@absl@@@Z + ??$?0AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@12@@?$__tuple_impl@U?$__integer_sequence@_K$0A@$00@__Cr@std@@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@56@@__Cr@std@@QEAA@U__forward_args@12@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@56@@Z ??$?0AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV234@@Z@@?$__temp_value@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@AEBV678@@Z@@Z + ??$?0AEAV?$NonIterableBitMask@_K$07$02@container_internal@absl@@$0A@@?$__tuple_leaf@$00AEAV?$NonIterableBitMask@_K$07$02@container_internal@absl@@$0A@@__Cr@std@@QEAA@AEAV?$NonIterableBitMask@_K$07$02@container_internal@absl@@@Z ??$?0AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@$0A@@?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@QEAA@AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$$T$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@container_internal@absl@@QEAA@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$$QEA$$T@Z ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@56@$$QEA$$T@Z @@ -139,7 +145,9 @@ EXPORTS ??$?0PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU0123@$0A@@?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@@__Cr@std@@QEAA@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z ??$?0PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@$0A@@?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@QEAA@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z ??$?0PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QEAA@PEBVFormatArgImpl@str_format_internal@1@0AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@Z - ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@X@?$FunctionRef@$$A6A_K_K@Z@absl@@QEAA@AEBU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@@?$FunctionRef@$$A6A_K_K@Z@absl@@IEAA@Uin_place_t@__Cr@std@@$$QEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@X@?$FunctionRef@$$A6A_K_K@Z@absl@@QEAA@$$QEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$__check_pair_construction@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@_K$07$02@23@@__Cr@std@@$0A@@?$pair@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@_K$07$02@23@@__Cr@std@@QEAA@AEBUFindInfo@container_internal@absl@@AEBV?$NonIterableBitMask@_K$07$02@45@@Z ??$?0U?$array@D$0DKJI@@__Cr@std@@XU012@H@?$Span@D@absl@@QEAA@AEAU?$array@D$0DKJI@@__Cr@std@@@Z ??$?0UHex@absl@@X@AlphaNum@absl@@QEAA@AEBUHex@1@$$QEAVStringifySink@strings_internal@1@@Z ??$?0UStringEq@container_internal@absl@@@?$Storage@UStringEq@container_internal@absl@@$01U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAUStringEq@23@@Z @@ -206,9 +214,13 @@ EXPORTS ??$?0V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@?$Storage@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@PEAVLogSink@absl@@@56@@Z ??$?0V?$allocator@PEAVLogSink@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@$$QEAI@Z ??$?0V?$allocator@PEAVLogSink@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@PEAVLogSink@absl@@@56@$$QEAI@Z + ??$?0V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@QEAA@_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@AEBQEBUCordRep@cord_internal@absl@@@Z + ??$?0V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@QEAA@_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@UPayload@status_internal@absl@@@56@@Z ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$QEAI@Z ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@UPayload@status_internal@absl@@@56@$$QEAI@Z + ??$?0V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$?0V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$?0V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z @@ -229,10 +241,12 @@ EXPORTS ??$?0VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@12@@Z ??$?0VTimeZoneLibC@cctz@time_internal@absl@@$0A@@?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@QEAA@AEBU?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@12@@Z ??$?0VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@12@@Z + ??$?0Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEA_N$0A@@?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@QEAA@$$QEAViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEA_N@Z ??$?0Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N$0A@@?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@QEAA@$$QEAViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@$$QEA_N@Z ??$?0_J@FlagState@flags_internal@absl@@QEAA@AEAVFlagImpl@12@AEB_J_N2_J@Z ??$?0_J@FormatArgImpl@str_format_internal@absl@@QEAA@AEB_J@Z ??$?4PEAVCommandLineFlag@absl@@_N$0A@@?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@QEAAAEAV012@$$QEAV?$tuple@PEAVCommandLineFlag@absl@@_N@12@@Z + ??$?4UFindInfo@container_internal@absl@@V?$NonIterableBitMask@_K$07$02@12@$0A@@?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@23@@__Cr@std@@QEAAAEAV012@$$QEAU?$pair@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@_K$07$02@23@@12@@Z ??$?6$01@LogMessage@log_internal@absl@@QEAAAEAV012@AEAY01$$CBD@Z ??$?6$02@LogMessage@log_internal@absl@@QEAAAEAV012@AEAY02$$CBD@Z ??$?6$0P@@LogMessage@log_internal@absl@@QEAAAEAV012@AEAY0P@$$CBD@Z @@ -585,7 +599,7 @@ EXPORTS ??$InvokeFlush@VBufferRawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPEAVBufferRawSink@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$InvokeFlush@VFILERawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPEAVFILERawSink@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$InvokeGet@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@@FlagImplPeer@flags_internal@absl@@SA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@12@@Z - ??$InvokeObject@U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z + ??$InvokeObject@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z ??$InvokeParseFlag@H@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z ??$InvokeParseFlag@M@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAMPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z ??$InvokeParseFlag@N@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEANPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z @@ -742,6 +756,20 @@ EXPORTS ??$StrSplit@VByAnyChar@absl@@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@@Z ??$StrSplit@VByAnyChar@absl@@USkipEmpty@2@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@USkipEmpty@0@@Z ??$StreamFormat@I@absl@@YA?AVStreamable@str_format_internal@0@AEBV?$FormatSpecTemplate@$0JPPPL@@20@AEBI@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@H@strings_internal@0@YA?AV123@H@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@I@strings_internal@0@YA?AV123@I@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@J@strings_internal@0@YA?AV123@J@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@K@strings_internal@0@YA?AV123@K@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_J@strings_internal@0@YA?AV123@_J@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_K@strings_internal@0@YA?AV123@1@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@0@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@2V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@50@@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@H@01@YA?AV234@H@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@I@01@YA?AV234@I@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@J@01@YA?AV234@J@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@K@01@YA?AV234@K@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_J@01@YA?AV234@_J@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_K@01@YA?AV234@1@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@01@YA?AV234@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@2V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z@@Z ??$ToChronoDuration@V?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z ??$ToChronoDuration@V?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z @@ -808,19 +836,19 @@ EXPORTS ??$__advance@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@_JUrandom_access_iterator_tag@01@@Z ??$__advance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@_JUrandom_access_iterator_tag@01@@Z ??$__advance@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@_JUrandom_access_iterator_tag@01@@Z - ??$__allocate_at_least@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAVCommandLineFlag@absl@@@01@AEAV?$allocator@PEAVCommandLineFlag@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAVCordzHandle@cord_internal@absl@@@01@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAVLogSink@absl@@@01@AEAV?$allocator@PEAVLogSink@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAPEBVCommandLineFlag@absl@@@01@AEAV?$allocator@PEBVCommandLineFlag@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAPEBVCordzHandle@cord_internal@absl@@@01@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUTransition@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUUnrecognizedFlag@absl@@@01@AEAV?$allocator@UUnrecognizedFlag@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@@01@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@01@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@01@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAVCommandLineFlag@absl@@_K@01@AEAV?$allocator@PEAVCommandLineFlag@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAVCordzHandle@cord_internal@absl@@_K@01@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAVLogSink@absl@@_K@01@AEAV?$allocator@PEAVLogSink@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAPEBVCommandLineFlag@absl@@_K@01@AEAV?$allocator@PEBVCommandLineFlag@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAPEBVCordzHandle@cord_internal@absl@@_K@01@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@01@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAUTransition@cctz@time_internal@absl@@_K@01@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@_K@01@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAUUnrecognizedFlag@absl@@_K@01@AEAV?$allocator@UUnrecognizedFlag@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@_K@01@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@U?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@_K@01@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@_K@Z ??$__allocator_destroy@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@PEAU45@@__Cr@std@@YAXAEAV?$allocator@UUnrecognizedFlag@absl@@@01@PEAUUnrecognizedFlag@absl@@1@Z ??$__annotate_contiguous_container@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z ??$__annotate_contiguous_container@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z @@ -835,13 +863,14 @@ EXPORTS ??$__annotate_contiguous_container@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z ??$__annotate_double_ended_contiguous_container@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX00000@Z ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z + ??$__as_transparent@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@01@AEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@01@@Z + ??$__as_transparent@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@01@AEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@01@@Z ??$__as_variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@YAAEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@01@AEAV201@@Z ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z ??$__at@P6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03$$V@__base@__visitation@__variant_detail@__Cr@std@@CA$$QEA_PAEBU?$__farray@P6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03@34@_K@Z ??$__at@P6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z@__base@__visitation@__variant_detail@__Cr@std@@CAAEBQ6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@1234@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@ZAEBQ6A_K01@Z@Z ??$__call@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@?$__invoke_void_return_wrapper@X$00@__Cr@std@@SAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@7@@Z ??$__call_func@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@CAXPEBT__policy_storage@123@AEAVCommandLineFlag@absl@@@Z - ??$__choose_policy@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@__policy@__function@__Cr@std@@CAPEBU0123@U?$integral_constant@_N$00@23@@Z ??$__constexpr_memmove@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0W4__element_count@01@@Z ??$__constexpr_memmove@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@0W4__element_count@01@@Z ??$__constexpr_memmove@PEAVLogSink@absl@@PEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0W4__element_count@01@@Z @@ -863,8 +892,8 @@ EXPORTS ??$__construct_at@PEBVCommandLineFlag@absl@@PEBV12@PEAPEBV12@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@$$QEAPEBV23@@Z ??$__construct_at@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@PEAPEBV123@@__Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@AEBQEBV234@@Z ??$__construct_at@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@PEAPEBV12345@@__Cr@std@@YAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV23456@AEBQEBV23456@@Z - ??$__construct_at@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@$$TAEA_KPEAU123@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@$$QEA$$TAEA_K@Z - ??$__construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@$$TAEA_KPEAU123@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@$$QEA$$TAEA_K@Z + ??$__construct_at@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@AEBQEBUCordRep@cord_internal@absl@@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@AEBQEBUCordRep@cord_internal@absl@@@Z + ??$__construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z @@ -885,23 +914,25 @@ EXPORTS ??$__construct_at@UUnrecognizedFlag@absl@@U12@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAU23@@Z ??$__construct_at@UUnrecognizedFlag@absl@@W4Source@12@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAW4Source@23@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z ??$__construct_at@UViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@AEA_KPEAU123@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV501@AEA_K@Z + ??$__construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$__construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$__construct_at@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@PEAV123@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@PEAV201@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV567@@Z@@Z ??$__construct_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@PEAV123@@__Cr@std@@YAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PEAV201@$$QEAV201@@Z ??$__construct_at@VFormatArgImpl@str_format_internal@absl@@AEBV123@PEAV123@@__Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@AEBV234@@Z ??$__construct_at_end@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@0_K@Z - ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z - ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z - ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z - ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z - ??$__construct_at_end_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@?$__split_buffer@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_node@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__construct_node@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__construct_node_hash@AEBQEBUCordRep@cord_internal@absl@@$$V@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBQEBUCordRep@cord_internal@absl@@@Z - ??$__construct_node_hash@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@?$__split_buffer@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z + ??$__construct_node@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__construct_node@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__construct_node_hash@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBQEBUCordRep@cord_internal@absl@@@Z + ??$__construct_node_hash@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$__copy@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@PEAU1234@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0PEAU3456@@Z ??$__copy@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z ??$__copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z @@ -981,18 +1012,18 @@ EXPORTS ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$01@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$02@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$0A@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z - ??$__distance@PEBUPayload@status_internal@absl@@@__Cr@std@@YA_JPEBUPayload@status_internal@absl@@0Urandom_access_iterator_tag@01@@Z - ??$__distance@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0Urandom_access_iterator_tag@01@@Z - ??$__distance@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@__Cr@std@@YA_JV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z + ??$__distance@PEBUPayload@status_internal@absl@@$0A@@__Cr@std@@YA_JPEBUPayload@status_internal@absl@@0@Z + ??$__distance@PEBUTransition@cctz@time_internal@absl@@$0A@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0@Z + ??$__distance@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0@Z + ??$__distance@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@0@Z + ??$__distance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@0@Z + ??$__distance@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@0@Z + ??$__distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z ??$__do_rehash@$00@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAX_K@Z - ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z + ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z ??$__emplace_back_assume_capacity@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ ??$__emplace_back_assume_capacity@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ ??$__emplace_back_assume_capacity@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV312@AEA_K@Z @@ -1020,14 +1051,13 @@ EXPORTS ??$__emplace_back_slow_path@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QEAV312@@Z ??$__emplace_back_slow_path@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@$$QEAW4Source@34@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z ??$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBQEBUCordRep@cord_internal@absl@@@Z - ??$__emplace_unique_extract_key@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBQEBUCordRep@cord_internal@absl@@U__extract_key_self_tag@12@@Z - ??$__emplace_unique_key_args@PEBUCordRep@cord_internal@absl@@AEBQEBU123@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBQEBUCordRep@cord_internal@absl@@0@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__find@PEAPEAVLogSink@absl@@PEAPEAV12@PEAV12@U__identity@__Cr@std@@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0AEBQEAV23@AEAU__identity@01@@Z - ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAPEAV?$__tree_node_base@PEAX@12@AEAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z - ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAPEAV?$__tree_node_base@PEAX@12@AEAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__find@PEAVLogSink@absl@@PEAV12@U__identity@__Cr@std@@$0A@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0AEBQEAV23@AEAU__identity@01@@Z + ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@__Cr@std@@AEAPEAV?$__tree_node_base@PEAX@23@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@__Cr@std@@AEAPEAV?$__tree_node_base@PEAX@23@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__find_loop@PEAPEAVLogSink@absl@@PEAPEAV12@PEAV12@U__identity@__Cr@std@@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0AEBQEAV23@AEAU__identity@01@@Z ??$__for_each_segment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@23@@__Cr@std@@YAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@01@@Z ??$__get_alt@$00AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z ??$__get_alt@$01AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z @@ -1042,18 +1072,30 @@ EXPORTS ??$__get_alt@AEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$01@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$01@34@@Z ??$__get_alt@AEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$02@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$02@34@@Z ??$__get_alt@AEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$0A@@34@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@AEBV834@AEA_K@Z@V@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@234@QEAAAEAU567@012@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@01@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV701@AEA_K@Z@V@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@301@QEAAAEAU456@123@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV56@@Z@V@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@234@QEAAAEAPEAV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@01@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@V@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@301@QEAAAEAPEAV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV567@@Z@V@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@234@QEAAAEAPEAV567@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@01@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@V@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@301@QEAAAEAPEAV456@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV56@@Z@V@?0???$emplace_back@AEBQEAVLogSink@absl@@@234@QEAAAEAPEAV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@01@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@V@?0???$emplace_back@AEBQEAVLogSink@absl@@@301@QEAAAEAPEAV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV56@@Z@V@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@234@QEAAAEAPEBV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@01@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@V@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@301@QEAAAEAPEBV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV567@@Z@V@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@234@QEAAAEAPEBV567@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@01@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@V@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@301@QEAAAEAPEBV456@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU5678@@Z@V@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@234@QEAAAEAU5678@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@01@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@V@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@301@QEAAAEAU4567@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU56@@Z@V@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@234@QEAAAEAU56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@QEAAAEAUUnrecognizedFlag@absl@@AEBU45@@Z@V@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@301@QEAAAEAU45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV56@@Z@V@?0???$emplace_back@PEBVCommandLineFlag@absl@@@234@QEAAAEAPEBV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@01@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@V@?0???$emplace_back@PEBVCommandLineFlag@absl@@@301@QEAAAEAPEBV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU5678@@Z@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@234@QEAAAEAU5678@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@01@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@301@QEAAAEAU4567@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@34@$$QEAV534@@Z@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@234@QEAAAEAV534@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@01@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@$$QEAV401@@Z@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@301@QEAAAEAV401@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@56@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@234@QEAAAEAU56@01@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@301@QEAAAEAU45@12@Z@@Z ??$__in_bounds@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@$0A@@__unique_ptr_array_bounds_stateless@__Cr@std@@QEBA_NPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@_K@Z ??$__in_bounds@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@$0A@@__unique_ptr_array_bounds_stateless@__Cr@std@@QEBA_NPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@_K@Z ??$__insert_assign_n_unchecked@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@_JPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z ??$__insert_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@1_J@Z + ??$__invoke@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K@__Cr@std@@YA_KAEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QEA_K@Z ??$__invoke@AEAUByCivilTime@Transition@cctz@time_internal@absl@@AEBU2345@AEBU2345@@__Cr@std@@YA_NAEAUByCivilTime@Transition@cctz@time_internal@absl@@AEBU3456@1@Z ??$__invoke@AEAUByUnixTime@Transition@cctz@time_internal@absl@@AEBU2345@AEBU2345@@__Cr@std@@YA_NAEAUByUnixTime@Transition@cctz@time_internal@absl@@AEBU3456@1@Z ??$__invoke@AEAU__identity@__Cr@std@@AEAPEAVLogSink@absl@@@__Cr@std@@YAAEAPEAVLogSink@absl@@AEAU__identity@01@AEAPEAV23@@Z ??$__invoke@AEAU__identity@__Cr@std@@AEAPEBVCommandLineFlag@absl@@@__Cr@std@@YAAEAPEBVCommandLineFlag@absl@@AEAU__identity@01@AEAPEBV23@@Z ??$__invoke@AEAU__identity@__Cr@std@@AEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAAEBUTransition@cctz@time_internal@absl@@AEAU__identity@01@AEBU2345@@Z ??$__invoke@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@__Cr@std@@YAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@6@@Z - ??$__invoke@AEBU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K@__Cr@std@@YA_KAEBU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QEA_K@Z - ??$__invoke@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@$$VX@__Cr@std@@YAX$$QEAP8FlagImpl@flags_internal@absl@@EAAXXZ$$QEAPEAV234@@Z + ??$__invoke@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@__Cr@std@@YAX$$QEAP8FlagImpl@flags_internal@absl@@EAAXXZ$$QEAPEAV234@@Z ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@456@@__Cr@std@@YA_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AEAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@501@@Z ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAU?$__alt@$01V?$Span@$$CBD@absl@@@456@@__Cr@std@@YA_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AEAU?$__alt@$01V?$Span@$$CBD@absl@@@501@@Z ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAU?$__alt@$02V?$variant@IHM@__Cr@std@@@456@@__Cr@std@@YA_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AEAU?$__alt@$02V?$variant@IHM@__Cr@std@@@501@@Z @@ -1063,8 +1105,11 @@ EXPORTS ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@_K_JIH_N@__Cr@std@@@__Cr@std@@YA_K$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@45@@Z@AEAV?$variant@_K_JIH_N@01@@Z ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@_K_JN@__Cr@std@@@__Cr@std@@YA_K$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@45@@Z@AEAV?$variant@_K_JN@01@@Z ??$__invoke_r@XAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@__Cr@std@@YAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@6@@Z + ??$__is_null@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@__function@__Cr@std@@YA_NAEBV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@Z ??$__iter_move@AEAPEAPEAVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEAVCommandLineFlag@absl@@AEAPEAPEAV34@@Z ??$__iter_move@AEAPEAPEBVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEBVCommandLineFlag@absl@@AEAPEAPEBV34@@Z + ??$__iter_move@PEAPEAVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEAVCommandLineFlag@absl@@$$QEAPEAPEAV34@@Z + ??$__iter_move@PEAPEBVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEBVCommandLineFlag@absl@@$$QEAPEAPEBV34@@Z ??$__libcpp_allocate@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@_K@Z ??$__libcpp_allocate@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@W4__element_count@01@_K@Z ??$__libcpp_allocate@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@W4__element_count@01@_K@Z @@ -1119,6 +1164,7 @@ EXPORTS ??$__libcpp_deallocate@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAXPEAVFormatArgImpl@str_format_internal@absl@@W4__element_count@01@_K@Z ??$__lower_bound@U_ClassicAlgPolicy@__Cr@std@@PEBUTransition@cctz@time_internal@absl@@PEBU4567@U4567@U__identity@23@UByUnixTime@4567@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@AEAUByUnixTime@2345@AEAU__identity@01@@Z ??$__lower_bound_bisecting@U_ClassicAlgPolicy@__Cr@std@@PEBUTransition@cctz@time_internal@absl@@U4567@U__identity@23@UByUnixTime@4567@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@AEBU2345@_JAEAUByUnixTime@2345@AEAU__identity@01@@Z + ??$__make_exception_guard@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@__Cr@std@@YA?AU?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@01@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@01@AEAAX_K@Z@@Z ??$__make_exception_guard@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@01@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@01@@Z ??$__make_value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@CA?A_P$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@78@@Z@@Z ??$__memberwise_forward_assign@V?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@V?$tuple@PEAVCommandLineFlag@absl@@_N@23@PEAVCommandLineFlag@absl@@_N$$Z$0A@$00@__Cr@std@@YAXAEAV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@$$QEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@U?$__tuple_types@PEAVCommandLineFlag@absl@@_N@01@U?$__integer_sequence@_K$0A@$00@01@@Z @@ -1131,9 +1177,8 @@ EXPORTS ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@PEAPEAU4567@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@PEAU4567@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@PEAU4567@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z - ??$__not_null@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@__function@__Cr@std@@YA_NAEBV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@Z ??$__rehash@$00@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAX_K@Z - ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z + ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z ??$__rewrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@U?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0@Z ??$__rewrap_iter@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@U?$__unwrap_iter_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@0@Z ??$__rewrap_iter@PEAPEAVLogSink@absl@@PEAPEAV12@U?$__unwrap_iter_impl@PEAPEAVLogSink@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0@Z @@ -1172,6 +1217,8 @@ EXPORTS ??$__to_address@PEAVLogSink@absl@@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@@Z ??$__to_address@PEBVCommandLineFlag@absl@@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@@Z ??$__to_address@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@@Z + ??$__to_address@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@@Z + ??$__to_address@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@@Z ??$__to_address@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU2345@@Z ??$__to_address@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@@Z ??$__to_address@UTransition@cctz@time_internal@absl@@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z @@ -1184,6 +1231,12 @@ EXPORTS ??$__to_address@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@AEBV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@@Z ??$__to_address@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV456@@Z@AEBV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@@Z ??$__to_address@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PEAV201@@Z + ??$__try_key_extraction@PEBUCordRep@cord_internal@absl@@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@67@AEBQEBU123@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@567@QEAA?AU867@0@Z@AEBQEBU123@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@01@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@01@QEAA?AU201@AEBQEBUCordRep@cord_internal@absl@@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@401@QEAA?AU201@0@Z@0@Z + ??$__try_key_extraction@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@23@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@523@QEAA?AU623@012@Z@AEBU723@V823@V923@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@401@QEAA?AU201@012@Z@012@Z + ??$__try_key_extraction@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@523@QEAA?AU623@012@Z@AEBU723@V823@V923@@__Cr@std@@YA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@401@QEAA?AU201@012@Z@012@Z + ??$__try_key_extraction_impl@PEBUCordRep@cord_internal@absl@@U?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@56@QEAA?AU456@AEBQEBU123@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@856@QEAA?AU456@0@Z@AEBQEBU123@$0A@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@01@QEAA?AU201@AEBQEBUCordRep@cord_internal@absl@@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@501@QEAA?AU201@1@Z@1@Z + ??$__try_key_extraction_impl@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@23@QEAA?AU423@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@623@QEAA?AU423@012@Z@AEBU723@V823@V923@$0A@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@501@QEAA?AU201@123@Z@123@Z + ??$__try_key_extraction_impl@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@QEAA?AU423@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@623@QEAA?AU423@012@Z@AEBU723@V823@V923@$0A@@__Cr@std@@YA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@501@QEAA?AU201@123@Z@123@Z ??$__uninitialized_allocator_copy@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@V423@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@1PEAV201@@Z ??$__uninitialized_allocator_copy_impl@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@PEAU4?1???R5678@QEBA?AV923@0@Z@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV567@@Z@2PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z ??$__uninitialized_allocator_relocate@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@YAXAEAV?$allocator@PEAVCommandLineFlag@absl@@@01@PEAPEAVCommandLineFlag@absl@@11@Z @@ -1222,6 +1275,8 @@ EXPORTS ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByUnixTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByUnixTime@2345@$$QEAU__identity@01@@Z ??$__validate_iter_reference@AEAPEAPEAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ ??$__validate_iter_reference@AEAPEAPEBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@PEAPEAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@PEAPEBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ ??$__visit_alt@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__impl@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@1234@AEAV?$__impl@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z ??$__visit_alt@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@56@@__variant@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@01234@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@34@@Z ??$__visit_value@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@78@@Z@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@34@@Z @@ -1317,8 +1372,8 @@ EXPORTS ??$construct_at@PEBVCommandLineFlag@absl@@PEBV12@PEAPEBV12@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@$$QEAPEBV23@@Z ??$construct_at@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@PEAPEBV123@@__Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@AEBQEBV234@@Z ??$construct_at@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@PEAPEBV12345@@__Cr@std@@YAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV23456@AEBQEBV23456@@Z - ??$construct_at@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@$$TAEA_KPEAU123@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@$$QEA$$TAEA_K@Z - ??$construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@$$TAEA_KPEAU123@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@$$QEA$$TAEA_K@Z + ??$construct_at@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@AEBQEBUCordRep@cord_internal@absl@@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@AEBQEBUCordRep@cord_internal@absl@@@Z + ??$construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z @@ -1339,6 +1394,8 @@ EXPORTS ??$construct_at@UUnrecognizedFlag@absl@@U12@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAU23@@Z ??$construct_at@UUnrecognizedFlag@absl@@W4Source@12@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAW4Source@23@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z ??$construct_at@UViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@AEA_KPEAU123@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV501@AEA_K@Z + ??$construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$construct_at@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@PEAV123@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@PEAV201@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV567@@Z@@Z ??$construct_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@PEAV123@@__Cr@std@@YAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PEAV201@$$QEAV201@@Z ??$construct_at@VFormatArgImpl@str_format_internal@absl@@AEBV123@PEAV123@@__Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@AEBV234@@Z @@ -1387,11 +1444,11 @@ EXPORTS ??$emplace@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z ??$emplace_at@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAAXViterator@012@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z ??$emplace_at@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAAXViterator@012@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z - ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ??$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV612@AEA_K@Z ??$emplace_back@AEBQEAUCordRep@cord_internal@absl@@@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAAEAPEAUCordRep@cord_internal@1@AEBQEAU231@@Z ??$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV34@@Z @@ -1403,23 +1460,23 @@ EXPORTS ??$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU3456@@Z ??$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU34@@Z ??$emplace_back@HVcrc32c_t@absl@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAH$$QEAVcrc32c_t@6@@Z - ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ??$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV34@@Z ??$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU3456@@Z ??$emplace_back@UPayload@status_internal@absl@@@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAAEAUPayload@status_internal@1@$$QEAU231@@Z ??$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QEAV312@@Z ??$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@34@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z - ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ??$end@V?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@AEAV?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@01@@Z ??$end@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@AEAV?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@01@@Z ??$find@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@PEAVLogSink@absl@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@01@V201@0AEBQEAVLogSink@absl@@@Z - ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA?AVconst_iterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$find_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z @@ -1444,6 +1501,7 @@ EXPORTS ??$get@$00@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEBUStringHash@12@XZ ??$get@$00@?$CompressedTuple@_KV?$allocator@D@__Cr@std@@@container_internal@absl@@QEGAAAEAV?$allocator@D@__Cr@std@@XZ ??$get@$00AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@YAAEA_NAEAV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@@Z + ??$get@$00AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@23@@__Cr@std@@YAAEAV?$NonIterableBitMask@_K$07$02@container_internal@absl@@AEAV?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@23@@01@@Z ??$get@$00PEAVCommandLineFlag@absl@@_N@__Cr@std@@YAAEA_NAEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@@Z ??$get@$01@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEBUStringEq@12@XZ ??$get@$02@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGAAAEAV?$allocator@D@__Cr@std@@XZ @@ -1460,6 +1518,7 @@ EXPORTS ??$get@$0A@@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEBVCommonFields@12@XZ ??$get@$0A@@?$CompressedTuple@_KV?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEB_KXZ ??$get@$0A@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@YAAEAPEAVCommandLineFlag@absl@@AEAV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@@Z + ??$get@$0A@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@23@@__Cr@std@@YAAEAUFindInfo@container_internal@absl@@AEAV?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@23@@01@@Z ??$get@$0A@AEBQEAVCommandLineFlag@absl@@@__Cr@std@@YAAEBQEAVCommandLineFlag@absl@@AEAV?$tuple@AEBQEAVCommandLineFlag@absl@@@01@@Z ??$get@$0A@PEAVCommandLineFlag@absl@@_N@__Cr@std@@YA$$QEAPEAVCommandLineFlag@absl@@$$QEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@@Z ??$get@$0A@PEAVCommandLineFlag@absl@@_N@__Cr@std@@YAAEAPEAVCommandLineFlag@absl@@AEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@@Z @@ -1477,7 +1536,7 @@ EXPORTS ??$hash_with_seed@V?$tuple@AEB_K@__Cr@std@@$0A@@MixingHashState@hash_internal@absl@@SA_KAEBV?$tuple@AEB_K@__Cr@std@@_K@Z ??$insert@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z ??$insert@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@1@Z - ??$invoke@AEBU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K@__Cr@std@@YA_KAEBU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QEA_K@Z + ??$invoke@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K@__Cr@std@@YA_KAEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QEA_K@Z ??$invoke@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@__Cr@std@@YAX$$QEAP8FlagImpl@flags_internal@absl@@EAAXXZ$$QEAPEAV234@@Z ??$iter_swap@AEAPEAPEAVCommandLineFlag@absl@@AEAPEAPEAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEAPEAVCommandLineFlag@absl@@0@Z ??$iter_swap@AEAPEAPEAVCommandLineFlag@absl@@PEAPEAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEAPEAVCommandLineFlag@absl@@$$QEAPEAPEAV34@@Z @@ -1488,6 +1547,7 @@ EXPORTS ??$iter_swap@PEAPEBVCommandLineFlag@absl@@PEAPEBV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAX$$QEAPEAPEBVCommandLineFlag@absl@@0@Z ??$iter_swap@PEAPEBVCommandLineFlag@absl@@PEAPEBV12@@__Cr@std@@YAXPEAPEBVCommandLineFlag@absl@@0@Z ??$launder@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@PEAU201@@Z + ??$launder@UList@CordzInfo@cord_internal@absl@@@__Cr@std@@YAPEAUList@CordzInfo@cord_internal@absl@@PEAU2345@@Z ??$launder@URefcountedRep@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEAURefcountedRep@CrcCordState@crc_internal@absl@@PEAU2345@@Z ??$launder@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@__Cr@std@@YAPEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@PEAV234@@Z ??$launder@VFlagRegistry@flags_internal@absl@@@__Cr@std@@YAPEAVFlagRegistry@flags_internal@absl@@PEAV234@@Z @@ -1515,7 +1575,7 @@ EXPORTS ??$make_pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@01@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z ??$make_pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@01@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z ??$make_tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@YA?AV?$tuple@PEAVCommandLineFlag@absl@@_N@01@AEAPEAVCommandLineFlag@absl@@AEA_N@Z - ??$make_unique@ULogMessageData@LogMessage@log_internal@absl@@AEAPEBDAEAHAEAW4LogSeverity@4@VTime@4@$0A@@__Cr@std@@YA?AV?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@01@AEAPEBDAEAHAEAW4LogSeverity@absl@@$$QEAVTime@4@@Z + ??$make_unique@ULogMessageData@LogMessage@log_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAHAEAW4LogSeverity@4@VTime@4@$0A@@__Cr@std@@YA?AV?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@01@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEAHAEAW4LogSeverity@absl@@$$QEAVTime@5@@Z ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@$$V$0A@@__Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@XZ ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@AEAV12@$0A@@__Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@AEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z ??$make_unique@VFallbackCrcMemcpyEngine@crc_internal@absl@@$$V$0A@@__Cr@std@@YA?AV?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@01@XZ @@ -1576,17 +1636,9 @@ EXPORTS ??$safe_strtoi_base@_K@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_KH@Z ??$swap@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAXAEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z ??$swap@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAXAEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z - ??$swap@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEAPEAVCommandLineFlag@absl@@0@Z - ??$swap@PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXAEAPEAPEAVCordzHandle@cord_internal@absl@@0@Z - ??$swap@PEAPEAVLogSink@absl@@@__Cr@std@@YAXAEAPEAPEAVLogSink@absl@@0@Z - ??$swap@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEAPEBVCommandLineFlag@absl@@0@Z - ??$swap@PEAPEBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXAEAPEAPEBVCordzHandle@cord_internal@absl@@0@Z - ??$swap@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAXAEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z ??$swap@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@YAXAEAPEAUTransition@cctz@time_internal@absl@@0@Z ??$swap@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAXAEAPEAUTransitionType@cctz@time_internal@absl@@0@Z ??$swap@PEAUUnrecognizedFlag@absl@@@__Cr@std@@YAXAEAPEAUUnrecognizedFlag@absl@@0@Z - ??$swap@PEAUViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXAEAPEAUViableSubstitution@strings_internal@absl@@0@Z - ??$swap@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXAEAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@0@Z ??$swap@PEAVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEAVCommandLineFlag@absl@@0@Z ??$swap@PEBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@YAXAEAPEBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@0@Z ??$swap@PEBVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEBVCommandLineFlag@absl@@0@Z @@ -1594,6 +1646,7 @@ EXPORTS ??$swap@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@0@Z ??$swap@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXAEAUViableSubstitution@strings_internal@absl@@0@Z ??$tie@PEAVCommandLineFlag@absl@@_N@__Cr@std@@YA?AV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$tie@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@_K$07$02@23@@__Cr@std@@YA?AV?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@23@@01@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@45@@Z ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@1@Z ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@1@Z ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@1@Z @@ -1660,6 +1713,19 @@ EXPORTS ??0?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@Z ??0?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@QEAA@AEAV?$allocator@UUnrecognizedFlag@absl@@@12@AEAPEAUUnrecognizedFlag@absl@@1@Z ??0?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@__Cr@std@@QEAA@AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@Z + ??0?$__allocation_result@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@__Cr@std@@QEAA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ??0?$__allocation_result@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@__Cr@std@@QEAA@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ??0?$__allocation_result@PEAPEAVCommandLineFlag@absl@@_K@__Cr@std@@QEAA@PEAPEAVCommandLineFlag@absl@@_K@Z + ??0?$__allocation_result@PEAPEAVCordzHandle@cord_internal@absl@@_K@__Cr@std@@QEAA@PEAPEAVCordzHandle@cord_internal@absl@@_K@Z + ??0?$__allocation_result@PEAPEAVLogSink@absl@@_K@__Cr@std@@QEAA@PEAPEAVLogSink@absl@@_K@Z + ??0?$__allocation_result@PEAPEBVCommandLineFlag@absl@@_K@__Cr@std@@QEAA@PEAPEBVCommandLineFlag@absl@@_K@Z + ??0?$__allocation_result@PEAPEBVCordzHandle@cord_internal@absl@@_K@__Cr@std@@QEAA@PEAPEBVCordzHandle@cord_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@__Cr@std@@QEAA@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUTransition@cctz@time_internal@absl@@_K@__Cr@std@@QEAA@PEAUTransition@cctz@time_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@_K@__Cr@std@@QEAA@PEAUTransitionType@cctz@time_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUUnrecognizedFlag@absl@@_K@__Cr@std@@QEAA@PEAUUnrecognizedFlag@absl@@_K@Z + ??0?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@_K@__Cr@std@@QEAA@PEAUViableSubstitution@strings_internal@absl@@_K@Z + ??0?$__allocation_result@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@_K@__Cr@std@@QEAA@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@_K@Z ??0?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z ??0?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z ??0?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__Cr@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z @@ -1679,6 +1745,7 @@ EXPORTS ??0?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@__Cr@std@@AEAA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV34567@@Z ??0?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@AEAA@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU3456@@Z ??0?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@AEAA@PEBQEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU3456@@Z + ??0?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@__Cr@std@@QEAA@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@12@AEAAX_K@Z@@Z ??0?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@12@@Z ??0?$__hash_const_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAA@AEBV?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@@Z ??0?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@AEBV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z @@ -1686,8 +1753,6 @@ EXPORTS ??0?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEAA@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z ??0?$__hash_map_const_iterator@V?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@V?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z ??0?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z - ??0?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@QEAA@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@_K@Z - ??0?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@QEAA@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@_K@Z ??0?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAA@PEAU012@@Z ??0?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAA@XZ ??0?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@PEAU012@@Z @@ -1695,11 +1760,15 @@ EXPORTS ??0?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@_N@Z ??0?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@_N@Z ??0?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA@XZ - ??0?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@X@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@12@@Z + ??0?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@X@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@12@@Z ??0?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEAA@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@12@@Z ??0?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEAA@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@12@@Z - ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEAA@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z - ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEAA@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@QEAA@XZ + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@QEAA@XZ ??0?$__non_trivial_if@$00V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ ??0?$__non_trivial_if@$00V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ ??0?$__non_trivial_if@$00V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ @@ -1734,31 +1803,46 @@ EXPORTS ??0?$__optional_move_assign_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ ??0?$__optional_move_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ ??0?$__optional_storage_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ - ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z - ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??0?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z - ??0?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??0?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVCommandLineFlag@absl@@@12@@Z - ??0?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z - ??0?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVLogSink@absl@@@12@@Z - ??0?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEBVCommandLineFlag@absl@@@12@@Z - ??0?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z - ??0?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z - ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z - ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z - ??0?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z - ??0?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z - ??0?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@_K0AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z - ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@12@@Z - ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@12@@Z + ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??0?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVLogSink@absl@@@12@@Z + ??0?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEBVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??0?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@_K0AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??0?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAA@_K0AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAVLogSink@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEBVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@12@@Z + ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@12@@Z ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@12@@Z ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@@Z ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@12@@Z ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@@Z ??0?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@12@_N@Z ??0?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@12@_N@Z - ??0?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEAA@XZ - ??0?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEAA@XZ + ??0?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ ??0?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@AEAA@PEAPEAVCommandLineFlag@absl@@@Z ??0?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@AEAA@PEAPEAVCordzHandle@cord_internal@absl@@@Z ??0?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@AEAA@PEAPEAVLogSink@absl@@@Z @@ -1967,13 +2051,15 @@ EXPORTS ??0KernelTimeout@synchronization_internal@absl@@QEAA@VTime@2@@Z ??0KernelTimeout@synchronization_internal@absl@@QEAA@XZ ??0LeakCheckDisabler@absl@@QEAA@XZ + ??0List@CordzInfo@cord_internal@absl@@QEAA@XZ ??0LockHolder@synchronization_internal@absl@@QEAA@PEAU_RTL_SRWLOCK@@@Z ??0LogEntry@absl@@AEAA@XZ ??0LogMessage@log_internal@absl@@QEAA@PEBDHUErrorTag@012@@Z ??0LogMessage@log_internal@absl@@QEAA@PEBDHUInfoTag@012@@Z ??0LogMessage@log_internal@absl@@QEAA@PEBDHUWarningTag@012@@Z ??0LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@2@@Z - ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@3@VTime@3@@Z + ??0LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@2@@Z + ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@3@VTime@3@@Z ??0LogMessageDebugFatal@log_internal@absl@@QEAA@PEBDH@Z ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH0@Z ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH@Z @@ -1985,7 +2071,7 @@ EXPORTS ??0MaskedPointer@flags_internal@absl@@QEAA@PEAX_N@Z ??0MixingHashState@hash_internal@absl@@AEAA@_K@Z ??0Mutex@absl@@QEAA@XZ - ??0MutexLock@absl@@QEAA@PEAVMutex@1@@Z + ??0MutexLock@absl@@QEAA@AEAVMutex@1@@Z ??0NodeCounts@CordzStatistics@cord_internal@absl@@QEAA@XZ ??0OstreamView@LogMessage@log_internal@absl@@QEAA@AEAULogMessageData@123@@Z ??0ParsedFloat@strings_internal@absl@@QEAA@XZ @@ -2000,7 +2086,7 @@ EXPORTS ??0ProtoField@log_internal@absl@@QEAA@XZ ??0Randen@random_internal@absl@@QEAA@XZ ??0RawHashSetLayout@container_internal@absl@@QEAA@_K00_N@Z - ??0ReaderMutexLock@absl@@QEAA@PEAVMutex@1@@Z + ??0ReaderMutexLock@absl@@QEAA@AEAVMutex@1@@Z ??0RefcountAndFlags@cord_internal@absl@@QEAA@XZ ??0RefcountedRep@CrcCordState@crc_internal@absl@@QEAA@XZ ??0Rep@CordBuffer@absl@@QEAA@PEAUCordRepFlat@cord_internal@2@@Z @@ -2019,7 +2105,7 @@ EXPORTS ??0ShiftState@strings_internal@absl@@QEAA@XZ ??0SpinLock@base_internal@absl@@QEAA@W4SchedulingMode@12@@Z ??0SpinLock@base_internal@absl@@QEAA@XZ - ??0SpinLockHolder@base_internal@absl@@QEAA@PEAVSpinLock@12@@Z + ??0SpinLockHolder@base_internal@absl@@QEAA@AEAVSpinLock@12@@Z ??0Status@absl@@AEAA@_K@Z ??0Status@absl@@QEAA@$$QEAV01@@Z ??0Status@absl@@QEAA@AEBV01@@Z @@ -2051,12 +2137,12 @@ EXPORTS ??0Utf8ForCodePoint@debugging_internal@absl@@QEAA@_K@Z ??0ViableSubstitution@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0_K@Z ??0Win32Waiter@synchronization_internal@absl@@QEAA@XZ - ??0WriterMutexLock@absl@@QEAA@PEAVMutex@1@@Z + ??0WriterMutexLock@absl@@QEAA@AEAVMutex@1@@Z ??0ZoneInfoSource@cctz@time_internal@absl@@QEAA@XZ - ??0_ConstructTransaction@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z - ??0_ConstructTransaction@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z - ??0_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAPEAUTransition@cctz@time_internal@absl@@_K@Z - ??0_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAPEAUTransitionType@cctz@time_internal@absl@@_K@Z + ??0_ConstructTransaction@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@PEAV123@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ??0_ConstructTransaction@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@PEAV123@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ??0_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@PEAV123@PEAUTransition@cctz@time_internal@absl@@_K@Z + ??0_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@PEAV123@PEAUTransitionType@cctz@time_internal@absl@@_K@Z ??0_ConstructTransaction@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAV123@AEAU__deque_block_range@123@@Z ??0_ConstructTransaction@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z ??0_ConstructTransaction@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z @@ -2079,6 +2165,8 @@ EXPORTS ??0__destroy_vector@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z ??0__destroy_vector@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z ??0__destroy_vector@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV123@@Z + ??0__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@@Z + ??0__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@@Z ??0absolute_lookup@time_zone@cctz@time_internal@absl@@QEAA@XZ ??0civil_lookup@time_zone@cctz@time_internal@absl@@QEAA@XZ ??0civil_transition@time_zone@cctz@time_internal@absl@@QEAA@XZ @@ -2128,24 +2216,24 @@ EXPORTS ??1?$__policy_func@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__function@__Cr@std@@QEAA@XZ ??1?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEAA@XZ ??1?$__policy_func@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAA@XZ ??1?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ ??1?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ - ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ ??1?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ ??1?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@absl@@QEAA@XZ ??1?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__Cr@std@@QEAA@XZ @@ -2251,10 +2339,10 @@ EXPORTS ??1UnrecognizedFlag@absl@@QEAA@XZ ??1WriterMutexLock@absl@@QEAA@XZ ??1ZoneInfoSource@cctz@time_internal@absl@@UEAA@XZ - ??1_ConstructTransaction@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1_ConstructTransaction@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ ??1_ConstructTransaction@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ ??1_ConstructTransaction@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ ??1_ConstructTransaction@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ @@ -2300,6 +2388,7 @@ EXPORTS ??6absl@@YA?AVuint128@0@V10@H@Z ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@AEBVCord@0@@Z ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@AEBVStatus@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@VTime@0@@Z ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vcrc32c_t@0@@Z ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vint128@0@@Z ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vuint128@0@@Z @@ -2314,6 +2403,7 @@ EXPORTS ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@@Z ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@0123@@Z ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@W4weekday@0123@@Z + ??6log_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@UUnprintableWrapper@01@@Z ??6str_format_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@AEBVStreamable@01@@Z ??6str_format_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@W4FormatConversionChar@1@@Z ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@01@@Z @@ -2423,9 +2513,6 @@ EXPORTS ??C?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@12@XZ ??C?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAULogMessageData@LogMessage@log_internal@absl@@XZ ??C?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ - ??C?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@XZ - ??C?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@XZ - ??C?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAVFlagStateInterface@flags_internal@absl@@XZ ??C?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAVTimeZoneIf@cctz@time_internal@absl@@XZ ??C?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAVTimeZoneInfo@cctz@time_internal@absl@@XZ ??CChunkIterator@Cord@absl@@QEBAPEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ @@ -2434,6 +2521,7 @@ EXPORTS ??D?$BitMask@_K$07$02$0A@@container_internal@absl@@QEBAIXZ ??D?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAAAEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@1@XZ ??D?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAAAEAVFlagRegistry@flags_internal@1@XZ + ??D?$NoDestructor@VMutex@absl@@@absl@@QEAAAEAVMutex@1@XZ ??D?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ??D?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ??D?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ @@ -2469,6 +2557,9 @@ EXPORTS ??D?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@12@XZ ??D?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEAULogMessageData@LogMessage@log_internal@absl@@XZ ??D?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEBAAEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ??D?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@XZ + ??D?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@XZ + ??D?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEAVFlagStateInterface@flags_internal@absl@@XZ ??DChunkIterator@Cord@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ??D__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AU__deque_block_range@123@XZ ??Dabsl@@YA?AVint128@0@V10@0@Z @@ -2553,8 +2644,38 @@ EXPORTS ??Pabsl@@YA_NVint128@0@0@Z ??Pabsl@@YA_NVuint128@0@0@Z ??R@?0???$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@23@_K@Z@QEBA?A?@@XZ + ??R@?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@QEBA?A?@@PEAD0@Z + ??R@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@45@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@UNoFormatter@12@@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV0?0???$IntegerToString@H@12@YA?AV345@H@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV0?0???$IntegerToString@I@12@YA?AV345@I@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV0?0???$IntegerToString@J@12@YA?AV345@J@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV0?0???$IntegerToString@K@12@YA?AV345@K@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV0?0???$IntegerToString@_J@12@YA?AV345@_J@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV0?0???$IntegerToString@_K@12@YA?AV345@1@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV0?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@12@YA?AV345@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@45@2V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@UNoFormatter@12@@Z@@Z@QEBA?A?@@XZ + ??R@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBQEBUCordRep@cord_internal@absl@@@Z@QEBA?A?@@00@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z ??R@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@67@@Z@QEBA?A?@@XZ ??R@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@67@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV723@AEA_K@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QEAV423@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z@QEBA?A?@@XZ ??R@?0???A?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAAEAD_K@Z@QEBA?A?@@XZ ??R@?0???A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAAEAUPayload@status_internal@2@_K@Z@QEBA?A?@@XZ ??R@?0???A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBAAEBUPayload@status_internal@2@_K@Z@QEBA?A?@@XZ @@ -2565,6 +2686,12 @@ EXPORTS ??R@?0???CChunkIterator@Cord@absl@@QEBAPEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ@QEBA?A?@@XZ ??R@?0???DChunkIterator@Cord@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ@QEBA?A?@@XZ ??R@?0???EChunkIterator@Cord@absl@@QEAAAEAV123@XZ@QEBA?A?@@XZ + ??R@?0???R0?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@QEBA?A?@@PEAD0@Z@QEBA?A?6@XZ ??R@?0??Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z@QEBA?A?@@0@Z ??R@?0??AssertIsValidForComparison@container_internal@absl@@YAXPEBW4ctrl_t@23@EPEBE@Z@QEBA?A?@@XZ ??R@?0??AssertSameContainer@container_internal@absl@@YAXPEBW4ctrl_t@23@0AEBQEBX1PEBE2@Z@QEBA?A?@@_NPEBD@Z @@ -2589,6 +2716,25 @@ EXPORTS ??R@?0??set_inline_size@Rep@InlineData@cord_internal@absl@@QEAAX_K@Z@QEBA?A?@@XZ ??R@?0??transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@0@Z@QEBA?A?@@XZ ??R@?0???$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@23@_K@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@H@12@YA?AV345@H@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@I@12@YA?AV345@I@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@J@12@YA?AV345@J@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@K@12@YA?AV345@K@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_J@12@YA?AV345@_J@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_K@12@YA?AV345@1@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@12@YA?AV345@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@45@2V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@UNoFormatter@12@@Z@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV723@AEA_K@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QEAV423@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z@QEBA?A?@@XZ ??R@?0??AssertSameContainer@container_internal@absl@@YAXPEBW4ctrl_t@23@0AEBQEBX1PEBE2@Z@QEBA?A?@@XZ ??R@?0??erase@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@@Z@QEBA?A?@@XZ ??R?$ConvertToContainer@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z @@ -2610,17 +2756,15 @@ EXPORTS ??R?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z ??R?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@12@@Z ??R?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@12@@Z - ??R?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEBA_NAEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z - ??R?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEBA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@@Z - ??R?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEBA_NAEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z - ??R?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEBA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@@Z + ??R?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@X@__Cr@std@@QEBA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@@Z + ??R?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@X@__Cr@std@@QEBA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@@Z ??R?$__policy_func@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__function@__Cr@std@@QEBA?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@23@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z ??R?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEBAXAEAVCommandLineFlag@absl@@@Z ??R?$__policy_func@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEBA_NAEBVCommandLineFlag@absl@@@Z ??R?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@@Z ??R?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@@Z - ??R?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEBA_NAEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z - ??R?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEBA_KAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEBA_NAEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEBA_KAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z ??R?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEBAXPEBVImpl@time_zone@cctz@time_internal@absl@@@Z ??R?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@QEBAXPEAULogMessageData@LogMessage@log_internal@absl@@@Z ??R?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@QEBAXPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z @@ -2656,6 +2800,8 @@ EXPORTS ??R__destroy_vector@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ ??R__destroy_vector@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ ??R__destroy_vector@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z ??Sabsl@@YA?AVuint128@0@V10@@Z ??Tabsl@@YA?AVuint128@0@V10@0@Z ??Uabsl@@YA?AVuint128@0@V10@0@Z @@ -2949,7 +3095,7 @@ EXPORTS ?Data@CordRepBtree@cord_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z ?Data@CordRepFlat@cord_internal@absl@@QEAAPEADXZ ?Data@CordRepFlat@cord_internal@absl@@QEBAPEBDXZ - ?DataGuard@FlagImpl@flags_internal@absl@@AEBAPEAVMutex@3@XZ + ?DataGuard@FlagImpl@flags_internal@absl@@AEBAAEAVMutex@3@XZ ?DataLossError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?DeadlineExceededError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?Deallocate@?$MallocAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@3@_K@Z @@ -3016,7 +3162,6 @@ EXPORTS ?DoLoad@?$AtomicHook@P6AXXZ@base_internal@absl@@AEBAP6AXXZXZ ?DoLoad@?$AtomicHook@P6AX_J@Z@base_internal@absl@@AEBAP6AX_J@ZXZ ?DoLoad@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@AEBAP6A_NW4LogSeverity@3@PEBDHPEAPEADPEAH@ZXZ - ?DoSanitizeOnSetCtrl@container_internal@absl@@YAXAEBVCommonFields@12@_KW4ctrl_t@12@1@Z ?DoStore@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@AEAA_NP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@Z@Z ?DoStore@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@AEAA_NP6AXPEBDH000@Z@Z ?DoStore@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@AEAA_NP6AXPEBDPEBX@Z@Z @@ -3225,6 +3370,7 @@ EXPORTS ?FromUDate@absl@@YA?AVTime@1@N@Z ?FromUniversal@absl@@YA?AVTime@1@_J@Z ?FromUnixDuration@time_internal@absl@@YA?AVTime@2@VDuration@2@@Z + ?FromUnixNanos@absl@@YA?AVTime@1@_J@Z ?FromUnixSeconds@cctz@time_internal@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@_J@Z ?Generate@Randen@random_internal@absl@@QEBAXPEAX@Z ?Generate@RandenHwAes@random_internal@absl@@SAXPEBXPEAX@Z @@ -3347,6 +3493,7 @@ EXPORTS ?GetWord@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAIH@Z ?GetYearDay@absl@@YAHV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z ?GlobalHashtablezSampler@container_internal@absl@@YAAEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?GlobalList@CordzInfo@cord_internal@absl@@CAPEAUList@123@XZ ?GlobalRegistry@FlagRegistry@flags_internal@absl@@SAAEAV123@XZ ?GuaranteedEqual@Condition@absl@@SA_NPEBV12@0@Z ?Guard@?$NullGuard@C@log_internal@absl@@SAAEBCAEBC@Z @@ -3511,8 +3658,6 @@ EXPORTS ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransitionType@234@@Z ?LocalTimeZone@absl@@YA?AVTimeZone@1@XZ ?Lock@CordzInfo@cord_internal@absl@@QEAAXW4MethodIdentifier@CordzUpdateTracker@23@@Z - ?Lock@FlagRegistry@flags_internal@absl@@QEAAXXZ - ?Lock@Mutex@absl@@QEAAXXZ ?LockSlow@Mutex@absl@@AEAAXPEBUMuHowS@2@PEBVCondition@2@H@Z ?LockSlowLoop@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@H@Z ?LockSlowWithDeadline@Mutex@absl@@AEAA_NPEBUMuHowS@2@PEBVCondition@2@VKernelTimeout@synchronization_internal@2@H@Z @@ -3535,7 +3680,6 @@ EXPORTS ?MakeAbsNanos@KernelTimeout@synchronization_internal@absl@@QEBA_JXZ ?MakeAbsTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ ?MakeCheckFailString@status_internal@absl@@YAPEBDPEBVStatus@2@PEBD@Z - ?MakeCheckOpUnprintableString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@C@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z @@ -3695,8 +3839,8 @@ EXPORTS ?Post@Win32Waiter@synchronization_internal@absl@@QEAAXXZ ?PrecombineLengthMix@hash_internal@absl@@YA_K_K0@Z ?PrepareForSampling@HashtablezInfo@container_internal@absl@@QEAAX_J_K11G@Z - ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KUFindInfo@12@@Z - ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KUFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@_K$07$02@12@UFindInfo@12@@Z + ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@_K$07$02@12@UFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z ?PrepareInsertSmallNonSoo@container_internal@absl@@YA?AU?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@AEAVCommonFields@12@AEBUPolicyFunctions@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z ?PrepareToDie@LogMessage@log_internal@absl@@AEAAXXZ ?PrepareToModify@Status@absl@@CAPEAVStatusRep@status_internal@2@_K@Z @@ -3717,6 +3861,7 @@ EXPORTS ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z ?PreviousCapacity@container_internal@absl@@YA_K_K@Z ?Print@Streamable@str_format_internal@absl@@QEBAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@@Z + ?PrintTo@absl@@YAXAEBVLogEntry@1@PEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ ?ProgramUsageMessage@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?Ptr@GraphCycles@synchronization_internal@absl@@QEAAPEAXUGraphId@23@@Z @@ -3747,9 +3892,7 @@ EXPORTS ?ReadOneWord@FlagImpl@flags_internal@absl@@QEBA_JXZ ?ReadSeedMaterialFromOSEntropy@random_internal@absl@@YA_NV?$Span@I@2@@Z ?ReadSequenceLockedData@FlagImpl@flags_internal@absl@@AEBAXPEAX@Z - ?ReaderLock@Mutex@absl@@QEAAXXZ ?ReaderTryLockSlow@Mutex@absl@@AEAA_NXZ - ?ReaderUnlock@Mutex@absl@@QEAAXXZ ?Rebuild@CordRepBtree@cord_internal@absl@@CAXPEAPEAV123@PEAV123@_N@Z ?Rebuild@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@@Z ?RecordClearedReservation@HashtablezInfoHandle@container_internal@absl@@QEAAXXZ @@ -3817,9 +3960,9 @@ EXPORTS ?Resize@?$ResizeUninitializedTraits@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@X@strings_internal@absl@@SAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z ?ResizeAllocatedTableWithSeedChange@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z ?ResourceExhaustedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z - ?Restore@FlagState@flags_internal@absl@@EEBAXXZ + ?Restore@FlagState@flags_internal@absl@@EEHAAXXZ ?RestoreState@FlagImpl@flags_internal@absl@@AEAA_NAEBVFlagState@23@@Z - ?RestoreToRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ + ?RestoreToRegistry@FlagSaverImpl@flags_internal@absl@@QEHAAXXZ ?Retire@flags_internal@absl@@YAXPEBDPEBXPEAE@Z ?ReverseConsume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z ?RoundUp@cord_internal@absl@@YA_K_K0@Z @@ -3851,12 +3994,6 @@ EXPORTS ?SetCordRep@CordzInfo@cord_internal@absl@@QEAAXPEAUCordRep@23@@Z ?SetCordRep@CordzUpdateScope@cord_internal@absl@@QEBAXPEAUCordRep@23@@Z ?SetCrcCordState@Cord@absl@@AEAAXVCrcCordState@crc_internal@2@@Z - ?SetCtrl@container_internal@absl@@YAXAEBVCommonFields@12@_KE1@Z - ?SetCtrl@container_internal@absl@@YAXAEBVCommonFields@12@_KW4ctrl_t@12@1@Z - ?SetCtrlInLargeTable@container_internal@absl@@YAXAEBVCommonFields@12@_KE1@Z - ?SetCtrlInLargeTable@container_internal@absl@@YAXAEBVCommonFields@12@_KW4ctrl_t@12@1@Z - ?SetCtrlInSingleGroupTable@container_internal@absl@@YAXAEBVCommonFields@12@_KE1@Z - ?SetCtrlInSingleGroupTable@container_internal@absl@@YAXAEBVCommonFields@12@_KW4ctrl_t@12@1@Z ?SetCurrentThreadIdentity@base_internal@absl@@YAXPEAUThreadIdentity@12@P6AXPEAX@Z@Z ?SetExitOnDFatal@log_internal@absl@@YAX_N@Z ?SetExpectedChecksum@Cord@absl@@QEAAXI@Z @@ -3874,7 +4011,6 @@ EXPORTS ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z ?SetInitialized@log_internal@absl@@YAXXZ - ?SetInlinedSize@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z ?SetIsAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ ?SetIsAllocated@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ ?SetIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ @@ -3891,6 +4027,7 @@ EXPORTS ?SetPrecision@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPEAVFormatConversionSpecImpl@23@@Z ?SetProgramInvocationName@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?SetProgramUsageMessage@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetSize@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z ?SetStackUnwinder@absl@@YAXP6AHPEAPEAXPEAHHHPEBX1@Z@Z ?SetStatusPayloadPrinter@status_internal@absl@@YAXP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@AEBVCord@2@@Z@Z ?SetStderrThreshold@absl@@YAXW4LogSeverityAtLeast@1@@Z @@ -3950,7 +4087,6 @@ EXPORTS ?SkipCrcNode@cord_internal@absl@@YAPEAUCordRep@12@PEAU312@@Z ?SkipCrcNode@cord_internal@absl@@YAPEBUCordRep@12@PEBU312@@Z ?SleepFor@absl@@YAXVDuration@1@@Z - ?SlotAddress@container_internal@absl@@YAPEAXPEAX_K1@Z ?SlowIsEnabled0@VLogSite@log_internal@absl@@AEAA_NH@Z ?SlowIsEnabled1@VLogSite@log_internal@absl@@AEAA_NH@Z ?SlowIsEnabled2@VLogSite@log_internal@absl@@AEAA_NH@Z @@ -4155,8 +4291,6 @@ EXPORTS ?UniversalEpoch@absl@@YA?AVTime@1@XZ ?UnknownError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?Unlock@CordzInfo@cord_internal@absl@@QEAAXXZ - ?Unlock@FlagRegistry@flags_internal@absl@@QEAAXXZ - ?Unlock@Mutex@absl@@QEAAXXZ ?UnlockSlow@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@@Z ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@F@Z ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@G@Z @@ -4253,8 +4387,6 @@ EXPORTS ?Write@FormatRawSinkImpl@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?Write@SequenceLock@flags_internal@absl@@QEAAXPEAU?$atomic@_K@__Cr@std@@PEBX_K@Z ?WriteToStderr@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4LogSeverity@2@@Z - ?WriterLock@Mutex@absl@@QEAAXXZ - ?WriterUnlock@Mutex@absl@@QEAAXXZ ?ZeroDuration@absl@@YA?AVDuration@1@XZ ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ @@ -4332,8 +4464,12 @@ EXPORTS ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z ?__as_base@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@IEGAA@XZ - ?__back_spare@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?__back_spare@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ ?__back_spare@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?__back_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?__back_spare_blocks@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ @@ -4354,69 +4490,109 @@ EXPORTS ?__call@?$__to_address_helper@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@X@__Cr@std@@SAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@AEBV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@@Z ?__capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?__capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__complete@?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@__Cr@std@@QEAAXXZ ?__complete@?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ ?__compose@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU5678@@Z - ?__construct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z - ?__construct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?__construct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX_K@Z + ?__construct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX_K@Z ?__construct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z ?__construct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z ?__copy_assign_alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEBV123@@Z ?__copy_assign_alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEBV123@U?$integral_constant@_N$0A@@23@@Z - ?__deallocate_node@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAXPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@@Z - ?__deallocate_node@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@@Z - ?__destruct_at_begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ?__destruct_at_begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$00@23@@Z - ?__destruct_at_begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ?__destruct_at_begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$00@23@@Z - ?__destruct_at_end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z - ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@U?$integral_constant@_N$0A@@23@@Z + ?__deallocate_node@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@@Z + ?__deallocate_node@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@@Z + ?__deallocate_node_list@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAXPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@@Z + ?__deallocate_node_list@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@@Z + ?__destruct_at_begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__destruct_at_begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$00@23@@Z + ?__destruct_at_begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$00@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAPEAVLogSink@absl@@@Z ?__destruct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransition@cctz@time_internal@absl@@@Z ?__destruct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z ?__destruct_at_end@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUViableSubstitution@strings_internal@absl@@@Z ?__end@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@@Z ?__end@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBQEBU4567@@Z - ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ - ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ - ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ - ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ ?__erase_to_end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEAVCommandLineFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEBVCommandLineFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAPEAUUnrecognizedFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ ?__front_spare@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?__front_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAVCommandLineFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAVLogSink@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEBVCommandLineFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UUnrecognizedFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@XZ ?__get_np@?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@XZ ?__get_np@?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ ?__get_value@?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@QEAAAEAPEBUCordRep@cord_internal@absl@@XZ ?__get_value@?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@QEAAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_value@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@QEAAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@XZ + ?__get_value@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@QEAAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@XZ ?__hash@?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEBA_KXZ ?__hash@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@AEAPEAV?$__tree_node_base@PEAX@23@PEAV523@@Z - ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@AEAPEAV?$__tree_node_base@PEAX@23@PEAV523@@Z + ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@AEAPEAV?$__tree_node_base@PEAX@23@PEAV523@@Z + ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@AEAPEAV?$__tree_node_base@PEAX@23@PEAV523@@Z ?__local@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@Z ?__local@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z ?__make_iter@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@PEAPEAVCommandLineFlag@absl@@@Z @@ -4434,11 +4610,33 @@ EXPORTS ?__move_range@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransition@cctz@time_internal@absl@@00@Z ?__move_range@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@00@Z ?__node_alloc@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@XZ - ?__node_alloc@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ - ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@XZ - ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@XZ ?__ptr@?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU123@XZ ?__ptr@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU123@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEAVCommandLineFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEBAPEAPEAVLogSink@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEBVCommandLineFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEBAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEBAPEAUUnrecognizedFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEBAPEAUViableSubstitution@strings_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEAVCommandLineFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEBAPEAPEAVLogSink@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEBVCommandLineFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEBAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEBAPEAUUnrecognizedFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEBAPEAUViableSubstitution@strings_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ ?__recommend@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z ?__recommend@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z ?__recommend@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z @@ -4452,7 +4650,7 @@ EXPORTS ?__recommend@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBA_K_K@Z ?__recommend_blocks@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SA_K_K@Z ?__rehash_unique@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAX_K@Z - ?__rehash_unique@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAX_K@Z + ?__rehash_unique@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAX_K@Z ?__rewrap@?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@SAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@0@Z ?__rewrap@?$__unwrap_iter_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@0@Z ?__rewrap@?$__unwrap_iter_impl@PEAPEAVLogSink@absl@@$00@__Cr@std@@SAPEAPEAVLogSink@absl@@PEAPEAV45@0@Z @@ -4470,29 +4668,119 @@ EXPORTS ?__rewrap@?$__unwrap_range_impl@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@SA@PEAUTransitionType@cctz@time_internal@absl@@0@Z ?__rewrap@?$__unwrap_range_impl@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@@__Cr@std@@SA@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z ?__rewrap@?$__unwrap_range_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@@__Cr@std@@SA@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@0@Z - ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@XZ - ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ - ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAPEAV?$__tree_node_base@PEAX@23@XZ - ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAPEAV?$__tree_node_base@PEAX@23@XZ + ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@XZ + ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ + ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAPEAV?$__tree_node_base@PEAX@23@XZ + ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAPEAV?$__tree_node_base@PEAX@23@XZ ?__segment@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@Z ?__segment@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEBQEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@0@Z ?__size@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEA_KXZ ?__size@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEB_KXZ ?__size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEA_KXZ ?__size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEB_KXZ - ?__swap_out_circular_buffer@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@23@PEAU4567@@Z - ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransitionType@cctz@time_internal@absl@@AEAU?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@23@PEAU4567@@Z - ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXAEAU?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@23@@Z + ?__swap_layouts@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXAEAV?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@PEAU4567@@Z + ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransitionType@cctz@time_internal@absl@@AEAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@PEAU4567@@Z + ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXAEAV?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAV?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@23@@Z + ?__swap_without_allocator@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAV?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXAEAV?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z ?__throw_length_error@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ ?__throw_length_error@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ ?__throw_length_error@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@CAXXZ @@ -4594,8 +4882,8 @@ EXPORTS ?assert_is_full@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAXPEBD@Z ?at_end@?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBA_NXZ ?back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAAEAPEAUCordRep@cord_internal@2@XZ - ?back@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ - ?back@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ ?back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEBUPrefixCrc@CrcCordState@crc_internal@absl@@XZ ?back@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ @@ -4632,12 +4920,25 @@ EXPORTS ?begin@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ ?begin@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ ?begin@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ - ?begin@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ - ?begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ - ?begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ - ?begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBQEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ - ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@23@XZ - ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?begin@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBAPEBQEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEAVCommandLineFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEBVCommandLineFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAPEAUUnrecognizedFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@23@XZ ?begin@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@$0BA@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@XZ ?begin@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@XZ ?begin@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@XZ @@ -4667,23 +4968,23 @@ EXPORTS ?btree@CordRepBtreeNavigator@cord_internal@absl@@QEBAPEAVCordRepBtree@23@XZ ?btree@CordRepBtreeReader@cord_internal@absl@@QEBAPEAVCordRepBtree@23@XZ ?bucket_count@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEBA_KXZ - ?bucket_count@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?bucket_count@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ ?bytes_value@ProtoField@log_internal@absl@@QEBA?AV?$Span@$$CBD@3@XZ - ?capacity@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ ?capacity@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA_KXZ ?capacity@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?capacity@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ @@ -4706,21 +5007,21 @@ EXPORTS ?chunk_begin@Cord@absl@@QEBA?AVChunkIterator@12@XZ ?chunk_end@Cord@absl@@QEBA?AVChunkIterator@12@XZ ?clear@?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEAAXXZ - ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXXZ ?clear@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ ?clear@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAAXXZ ?clear@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ @@ -4862,8 +5163,8 @@ EXPORTS ?delimiter@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBVByAnyChar@3@XZ ?delimiter@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBVByChar@3@XZ ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ - ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z - ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z + ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z ?destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@@Z ?destroy_slots@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXXZ ?destructor_impl@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXXZ @@ -4879,8 +5180,8 @@ EXPORTS ?empty@?$Span@$$CBD@absl@@QEBA_NXZ ?empty@?$Span@D@absl@@QEBA_NXZ ?empty@?$Span@I@absl@@QEBA_NXZ - ?empty@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ - ?empty@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ?empty@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_NXZ + ?empty@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_NXZ ?empty@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ ?empty@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBA_NXZ ?empty@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA_NXZ @@ -4893,6 +5194,7 @@ EXPORTS ?empty@CommonFields@container_internal@absl@@QEBA_NXZ ?empty@Cord@absl@@QEBA_NXZ ?empty@HashtableSize@container_internal@absl@@QEBA_NXZ + ?encoded_message@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?encoded_remaining@LogMessageData@LogMessage@log_internal@absl@@QEAAAEAV?$Span@D@4@XZ ?end@?$BitMask@_K$07$02$00@container_internal@absl@@QEBA?AV123@XZ ?end@?$BitMask@_K$07$02$0A@@container_internal@absl@@QEBA?AV123@XZ @@ -4906,11 +5208,24 @@ EXPORTS ?end@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ ?end@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ ?end@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ - ?end@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ - ?end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ - ?end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ - ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@23@XZ - ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?end@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEAVCommandLineFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEBVCommandLineFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAPEAUUnrecognizedFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@23@XZ ?end@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@23@XZ ?end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@XZ ?end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@XZ @@ -4949,8 +5264,8 @@ EXPORTS ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV567@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@AEBV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@967@AEBVtime_zone@234@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEAMW4chars_format@1@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEANW4chars_format@1@@Z - ?front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ - ?front@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?front@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ ?front@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ ?gbswap_16@absl@@YAGG@Z ?gbswap_32@absl@@YAII@Z @@ -4964,6 +5279,7 @@ EXPORTS ?generation_ptr@HashSetIteratorGenerationInfoDisabled@container_internal@absl@@QEBAPEBEXZ ?get@?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@container_internal@absl@@QEBAPEAW4ctrl_t@23@XZ ?get@?$MaybeInitializedPtr@X@container_internal@absl@@QEBAPEAXXZ + ?get@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAAPEAUList@CordzInfo@cord_internal@2@XZ ?get@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAAPEAURefcountedRep@CrcCordState@crc_internal@2@XZ ?get@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAAPEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ ?get@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEBAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ @@ -4998,8 +5314,10 @@ EXPORTS ?get@?$Storage@_K$0A@U?$StorageTag@_KV?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGBAAEB_KXZ ?get@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ ?get@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransitionType@cctz@time_internal@absl@@XZ + ?get@?$__tuple_leaf@$00AEAV?$NonIterableBitMask@_K$07$02@container_internal@absl@@$0A@@__Cr@std@@QEAAAEAV?$NonIterableBitMask@_K$07$02@container_internal@absl@@XZ ?get@?$__tuple_leaf@$0A@$$QEAPEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@XZ ?get@?$__tuple_leaf@$0A@AEAPEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@XZ + ?get@?$__tuple_leaf@$0A@AEAUFindInfo@container_internal@absl@@$0A@@__Cr@std@@QEAAAEAUFindInfo@container_internal@absl@@XZ ?get@?$__tuple_leaf@$0A@AEBQEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEBQEAVCommandLineFlag@absl@@XZ ?get@?$__tuple_leaf@$0A@PEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@XZ ?get@?$unique_ptr@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ @@ -5011,6 +5329,7 @@ EXPORTS ?get@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ ?get@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAVZoneInfoSource@cctz@time_internal@absl@@XZ ?get@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEBAPEAXXZ + ?get@PlacementImpl@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAAPEAUList@CordzInfo@cord_internal@3@XZ ?get@PlacementImpl@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAAPEAURefcountedRep@CrcCordState@crc_internal@3@XZ ?get@PlacementImpl@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAAPEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@3@XZ ?get@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEBAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ @@ -5050,7 +5369,7 @@ EXPORTS ?has_timeout@KernelTimeout@synchronization_internal@absl@@QEBA_NXZ ?has_zero_flag@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ ?hash_function@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAU?$hash@PEBUCordRep@cord_internal@absl@@@23@XZ - ?hash_function@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@XZ + ?hash_function@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ ?hash_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAAEAUStringHash@23@XZ ?hash_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAAEBUStringHash@23@XZ ?hash_with_seed@?$HashImpl@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@hash_internal@absl@@AEBA_KAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z @@ -5074,6 +5393,8 @@ EXPORTS ?inline_size@Rep@InlineData@cord_internal@absl@@QEBA_KXZ ?insert@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@56@@Z ?insert@?$unordered_set@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_const_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBQEBUCordRep@cord_internal@absl@@@Z + ?int32_value@ProtoField@log_internal@absl@@QEBAHXZ + ?int64_value@ProtoField@log_internal@absl@@QEBA_JXZ ?is_absolute_timeout@KernelTimeout@synchronization_internal@absl@@QEBA_NXZ ?is_basic@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ ?is_conv@ConvTag@str_format_internal@absl@@QEBA_NXZ @@ -5098,8 +5419,10 @@ EXPORTS ?iterator_at@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AViterator@123@_K@Z ?iterator_at_ptr@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AViterator@123@U?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@@Z ?kDefaultIterControl@container_internal@absl@@3W4ctrl_t@12@A + ?key_comp@?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@QEBAAEBU?$less@X@23@XZ + ?key_comp@?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@QEBAAEBU?$less@X@23@XZ ?key_eq@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAU?$equal_to@PEBUCordRep@cord_internal@absl@@@23@XZ - ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@XZ + ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ ?length@CordRepBtreeReader@cord_internal@absl@@QEBA_KXZ ?length_mod@FormatConversionSpecImpl@str_format_internal@absl@@QEBA?AW4LengthMod@3@XZ ?load@?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__Cr@std@@QEBAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZW4memory_order@23@@Z @@ -5114,6 +5437,7 @@ EXPORTS ?load@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__Cr@std@@QEBA?AW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z ?load_time_zone@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVtime_zone@123@@Z ?local_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?lock@FlagRegistry@flags_internal@absl@@QEAAXXZ ?lock@Mutex@absl@@QEAAXXZ ?lock@SpinLock@base_internal@absl@@QEAAXXZ ?lock_shared@Mutex@absl@@QEAAXXZ @@ -5127,7 +5451,7 @@ EXPORTS ?max@?$numeric_limits@Vint128@absl@@@__Cr@std@@SA?AVint128@absl@@XZ ?max@?$numeric_limits@Vuint128@absl@@@__Cr@std@@SA?AVuint128@absl@@XZ ?max_load_factor@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAMXZ - ?max_load_factor@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAMXZ + ?max_load_factor@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAMXZ ?max_size@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?max_size@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?max_size@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ @@ -5181,10 +5505,10 @@ EXPORTS ?poison@InlineData@cord_internal@absl@@QEAAXXZ ?poison_this@InlineData@cord_internal@absl@@QEAAXXZ ?pop_back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAXXZ - ?pop_back@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?pop_back@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ ?pop_back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?pop_front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?pop_front@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?pop_front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXXZ + ?pop_front@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ ?precision@FormatConversionSpecImpl@str_format_internal@absl@@QEBAHXZ ?predicate@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBUAllowEmpty@3@XZ ?predicate@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBUSkipEmpty@3@XZ @@ -5345,10 +5669,12 @@ EXPORTS ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAAEA_KXZ ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?size@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAAEA_KXZ - ?size@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAAEA_KXZ - ?size@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?size@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?size@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAAEA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ ?size@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@$0BA@@__Cr@std@@QEBA_KXZ ?size@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ @@ -5411,6 +5737,9 @@ EXPORTS ?text@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?text@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?text@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_newline@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_prefix@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?text_message_with_prefix_and_newline@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?text_message_with_prefix_and_newline_c_str@LogEntry@absl@@QEBAPEBDXZ ?thread_identity@PerThreadSynch@base_internal@absl@@QEAAPEAUThreadIdentity@23@XZ @@ -5428,7 +5757,10 @@ EXPORTS ?try_lock@Mutex@absl@@QEAA_NXZ ?try_lock_shared@Mutex@absl@@QEAA_NXZ ?type@ProtoField@log_internal@absl@@QEBA?AW4WireType@23@XZ + ?uint32_value@ProtoField@log_internal@absl@@QEBAIXZ + ?uint64_value@ProtoField@log_internal@absl@@QEBA_KXZ ?unchecked_deref@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAAEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@XZ + ?unlock@FlagRegistry@flags_internal@absl@@QEAAXXZ ?unlock@Mutex@absl@@QEAAXXZ ?unlock@SpinLock@base_internal@absl@@QEAAXXZ ?unlock_shared@Mutex@absl@@QEAAXXZ @@ -5436,8 +5768,8 @@ EXPORTS ?utc_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ ?value@ConvertibleToStringView@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?value@InputValue@UnboundConversion@str_format_internal@absl@@QEBAHXZ - ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@XZ - ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@XZ + ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ ?valueless_by_exception@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@QEBA_NXZ ?valueless_by_exception@?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@QEBA_NXZ ?verbosity@LogEntry@absl@@QEBAHXZ diff --git a/naiveproxy/src/third_party/abseil-cpp/symbols_arm64_dbg_cxx23.def b/naiveproxy/src/third_party/abseil-cpp/symbols_arm64_dbg_cxx23.def new file mode 100644 index 0000000000..2f312a9446 --- /dev/null +++ b/naiveproxy/src/third_party/abseil-cpp/symbols_arm64_dbg_cxx23.def @@ -0,0 +1,5815 @@ +EXPORTS + ?$TSS0@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PEIAXPEIBX_KV54@_N@Z@4HA + ??$?0$$CBD$0A@@VoidPtr@str_format_internal@absl@@QEAA@PEBD@Z + ??$?0$$CBU?$atomic@_N@__Cr@std@@@Condition@absl@@QEAA@P6A_NPEBU?$atomic@_N@__Cr@std@@@Z0@Z + ??$?0$$CBUCordRep@cord_internal@absl@@@Hex@absl@@QEAA@PEBUCordRep@cord_internal@1@W4PadSpec@1@@Z + ??$?0$$CBVFormatArgImpl@str_format_internal@absl@@$$CBV012@@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@V?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@@Z + ??$?0$$CB_W$0A@@VoidPtr@str_format_internal@absl@@QEAA@PEB_W@Z + ??$?0$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V$$Z$0A@$$Z$S@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@AEAV?$tuple@$$V@12@U?$__integer_sequence@_K$0A@@12@U?$__integer_sequence@_K$S@12@@Z + ??$?0$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@Z + ??$?0$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@U?$__integer_sequence@_K$0A@@12@3@Z + ??$?0$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@U?$__integer_sequence@_K$0A@@12@3@Z + ??$?0$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@Z + ??$?0$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@@?$pair@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@Z + ??$?0$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@U?$__integer_sequence@_K$0A@@12@3@Z + ??$?0$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@U?$__integer_sequence@_K$0A@@12@3@Z + ??$?0$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@Z + ??$?0$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@@?$pair@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@Z + ??$?0$$T@?$Storage@PEAPEAUCordRep@cord_internal@absl@@$00U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEA$$T@Z + ??$?0$$T@?$Storage@PEAPEAVLogSink@absl@@$00U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@internal_compressed_tuple@container_internal@2@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEA$$T@Z + ??$?0$$T@?$Storage@PEAUPayload@status_internal@absl@@$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEA$$T@Z + ??$?0$$V$0A@@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V$0A@@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V$0A@@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V$0A@@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEAA@XZ + ??$?0$$V$0A@@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V$0A@@?$NoDestructor@VMutex@absl@@@absl@@QEAA@XZ + ??$?0$$V@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??$?0$$V@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??$?0$$V@PlacementImpl@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEAA@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@VMutex@absl@@@absl@@QEAA@XZ + ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@QEAA@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@23@@__Cr@std@@QEAA@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@45@@Z + ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AEBQEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@AEBQEAVCommandLineFlag@absl@@@Z + ??$?0$00X@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??$?0$00X@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??$?0$00X@?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@$$QEAV?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAV?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@12@$$QEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@12@$$QEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAULogMessageData@LogMessage@log_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@UThreadIdentity@base_internal@absl@@P6AXPEAX@Z@__Cr@std@@QEAA@PEAUThreadIdentity@base_internal@absl@@AEBQ6AXPEAX@Z@Z + ??$?0$00X@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$T@Z + ??$?0$00X@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z + ??$?0$00X@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??$?0$00X@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@$$QEAV?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@$$QEAV?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAVFallbackCrcMemcpyEngine@crc_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAVFlagState@flags_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$T@Z + ??$?0$00X@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAVTimeZoneInfo@cctz@time_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAVTimeZoneLibC@cctz@time_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$T@Z + ??$?0$00X@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAVZoneInfoSource@cctz@time_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEAA@$$T@Z + ??$?0$00X@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEAA@PEAX$$QEAUDynValueDeleter@flags_internal@absl@@@Z + ??$?0AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEAPEBV01234@$0A@@?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@QEAA@AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$?0AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV01234@$0A@@?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@QEAA@AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$$QEAPEAPEAPEBV34567@@Z + ??$?0AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAPEAPEAU0123@$0A@@?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@QEAA@AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$?0AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU0123@$0A@@?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@QEAA@AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAPEAU3456@@Z + ??$?0AEAPEAPEAVCommandLineFlag@absl@@AEA_N$0A@@?$pair@PEAPEAVCommandLineFlag@absl@@_N@__Cr@std@@QEAA@AEAPEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$?0AEAPEAPEAVLogSink@absl@@PEAPEAV01@$0A@@?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@QEAA@AEAPEAPEAVLogSink@absl@@$$QEAPEAPEAV34@@Z + ??$?0AEAPEAPEBVCommandLineFlag@absl@@AEA_N$0A@@?$pair@PEAPEBVCommandLineFlag@absl@@_N@__Cr@std@@QEAA@AEAPEAPEBVCommandLineFlag@absl@@AEA_N@Z + ??$?0AEAPEAUTransition@cctz@time_internal@absl@@AEAPEAU0123@$0A@@?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@QEAA@AEAPEAUTransition@cctz@time_internal@absl@@0@Z + ??$?0AEAPEAUTransition@cctz@time_internal@absl@@PEAU0123@$0A@@?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@QEAA@AEAPEAUTransition@cctz@time_internal@absl@@$$QEAPEAU3456@@Z + ??$?0AEAPEAUTransitionType@cctz@time_internal@absl@@AEAPEAU0123@$0A@@?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@QEAA@AEAPEAUTransitionType@cctz@time_internal@absl@@0@Z + ??$?0AEAPEAUTransitionType@cctz@time_internal@absl@@PEAU0123@$0A@@?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@QEAA@AEAPEAUTransitionType@cctz@time_internal@absl@@$$QEAPEAU3456@@Z + ??$?0AEAPEAVCommandLineFlag@absl@@$0A@@?$__tuple_leaf@$0A@AEAPEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAA@AEAPEAVCommandLineFlag@absl@@@Z + ??$?0AEAPEAVCommandLineFlag@absl@@$0A@@?$__tuple_leaf@$0A@PEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAA@AEAPEAVCommandLineFlag@absl@@@Z + ??$?0AEAPEAVCommandLineFlag@absl@@AEA_N$0A@@?$tuple@PEAVCommandLineFlag@absl@@_N@__Cr@std@@QEAA@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$?0AEAPEAVCommandLineFlag@absl@@AEA_N@?$__tuple_impl@U?$__integer_sequence@_K$0A@$00@__Cr@std@@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@QEAA@U__forward_args@12@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$?0AEAPEAVCommandLineFlag@absl@@AEA_N@?$__tuple_impl@U?$__integer_sequence@_K$0A@$00@__Cr@std@@PEAVCommandLineFlag@absl@@_N@__Cr@std@@QEAA@U__forward_args@12@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$?0AEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU0123@$0A@@?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@QEAA@AEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAU3456@@Z + ??$?0AEAUFindInfo@container_internal@absl@@$0A@@?$__tuple_leaf@$0A@AEAUFindInfo@container_internal@absl@@$0A@@__Cr@std@@QEAA@AEAUFindInfo@container_internal@absl@@@Z + ??$?0AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@12@@?$__tuple_impl@U?$__integer_sequence@_K$0A@$00@__Cr@std@@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@56@@__Cr@std@@QEAA@U__forward_args@12@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@56@@Z + ??$?0AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV234@@Z@@?$__temp_value@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@AEBV678@@Z@@Z + ??$?0AEAV?$NonIterableBitMask@_K$07$02@container_internal@absl@@$0A@@?$__tuple_leaf@$00AEAV?$NonIterableBitMask@_K$07$02@container_internal@absl@@$0A@@__Cr@std@@QEAA@AEAV?$NonIterableBitMask@_K$07$02@container_internal@absl@@@Z + ??$?0AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@$0A@@?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@QEAA@AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z + ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$$T$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@container_internal@absl@@QEAA@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$$QEA$$T@Z + ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@56@$$QEA$$T@Z + ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@56@@Z + ??$?0AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@$$T$00@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@container_internal@absl@@QEAA@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@$$QEA$$T@Z + ??$?0AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEAV?$allocator@PEAVLogSink@absl@@@56@$$QEA$$T@Z + ??$?0AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@?$Storage@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEAV?$allocator@PEAVLogSink@absl@@@56@@Z + ??$?0AEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$T$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@container_internal@absl@@QEAA@AEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$QEA$$T@Z + ??$?0AEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEAV?$allocator@UPayload@status_internal@absl@@@56@$$QEA$$T@Z + ??$?0AEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEAV?$allocator@UPayload@status_internal@absl@@@56@@Z + ??$?0AEAVCord@absl@@$0A@@?$optional@VCord@absl@@@__Cr@std@@QEAA@AEAVCord@absl@@@Z + ??$?0AEAVCord@absl@@@?$__optional_destruct_base@VCord@absl@@$0A@@__Cr@std@@QEAA@Uin_place_t@12@AEAVCord@absl@@@Z + ??$?0AEAY0BM@$$CBD$0A@@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEAA@AEAY0BM@$$CBD@Z + ??$?0AEAY0BM@$$CBD@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEAA@AEAY0BM@$$CBD@Z + ??$?0AEA_K@?$Storage@_K$0A@U?$StorageTag@_KV?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEA_K@Z + ??$?0AEA_KAEBV?$allocator@D@__Cr@std@@$00@?$CompressedTuple@_KV?$allocator@D@__Cr@std@@@container_internal@absl@@QEAA@AEA_KAEBV?$allocator@D@__Cr@std@@@Z + ??$?0AEA_KAEBV?$allocator@D@__Cr@std@@@?$CompressedTupleImpl@V?$CompressedTuple@_KV?$allocator@D@__Cr@std@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEA_KAEBV?$allocator@D@56@@Z + ??$?0AEBQEAVCommandLineFlag@absl@@$0A@@?$__tuple_leaf@$0A@AEBQEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAA@AEBQEAVCommandLineFlag@absl@@@Z + ??$?0AEBQEAVCommandLineFlag@absl@@@?$__tuple_impl@U?$__integer_sequence@_K$0A@@__Cr@std@@AEBQEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@U__forward_args@12@AEBQEAVCommandLineFlag@absl@@@Z + ??$?0AEBV?$allocator@D@__Cr@std@@@?$Storage@V?$allocator@D@__Cr@std@@$00U?$StorageTag@_KV?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEBV?$allocator@D@56@@Z + ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEBV?$allocator@UPayload@status_internal@absl@@@56@@Z + ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEAA@AEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$QEAI@Z + ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEBV?$allocator@UPayload@status_internal@absl@@@56@$$QEAI@Z + ??$?0AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@56@@Z + ??$?0AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEAA@AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$$QEAI@Z + ??$?0AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@56@$$QEAI@Z + ??$?0AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V$$Z$0A@$$Z$S@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@AEAV?$tuple@$$V@12@U?$__integer_sequence@_K$0A@@12@U?$__integer_sequence@_K$S@12@@Z + ??$?0AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V$$Z$0A@$$Z$S@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@AEAV?$tuple@$$V@12@U?$__integer_sequence@_K$0A@@12@U?$__integer_sequence@_K$S@12@@Z + ??$?0AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@Z + ??$?0AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@Z + ??$?0AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$ZAEBQEAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@23@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEAV?$tuple@AEBQEAVCommandLineFlag@absl@@@12@U?$__integer_sequence@_K$0A@@12@3@Z + ??$?0AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$ZAEBQEAVCommandLineFlag@absl@@@?$pair@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@AEBQEAVCommandLineFlag@absl@@@12@@Z + ??$?0D@?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@QEAA@AEBV?$allocator@D@12@@Z + ??$?0D@?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEBV?$allocator@D@12@@Z + ??$?0D@FormatArgImpl@str_format_internal@absl@@QEAA@AEBD@Z + ??$?0H@FormatArgImpl@str_format_internal@absl@@QEAA@AEBH@Z + ??$?0I@?$Storage@_K$00U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAI@Z + ??$?0I@?$Storage@_K$00U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAI@Z + ??$?0I@?$Storage@_K$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAI@Z + ??$?0I@?$Storage@_K$00U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAI@Z + ??$?0I@FormatArgImpl@str_format_internal@absl@@QEAA@AEBI@Z + ??$?0M@FormatArgImpl@str_format_internal@absl@@QEAA@AEBM@Z + ??$?0N@FormatArgImpl@str_format_internal@absl@@QEAA@AEBN@Z + ??$?0PEAI@?$SaltedSeedSeq@Vseed_seq@__Cr@std@@@random_internal@absl@@QEAA@PEAI0@Z + ??$?0PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV01234@$0A@@?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@QEAA@$$QEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$?0PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU0123@$0A@@?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@QEAA@$$QEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$?0PEAPEAVLogSink@absl@@$0A@@?$__wrap_iter@PEBQEAVLogSink@absl@@@__Cr@std@@QEAA@AEBV?$__wrap_iter@PEAPEAVLogSink@absl@@@12@@Z + ??$?0PEAPEAVLogSink@absl@@PEAPEAV01@$0A@@?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@QEAA@$$QEAPEAPEAVLogSink@absl@@0@Z + ??$?0PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAU0123@PEAPEAU0123@$0A@@?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@QEAA@AEBV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z + ??$?0PEAUTransition@cctz@time_internal@absl@@$0A@@?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@QEAA@AEBV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@@Z + ??$?0PEAUTransition@cctz@time_internal@absl@@PEAU0123@$0A@@?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@QEAA@$$QEAPEAUTransition@cctz@time_internal@absl@@0@Z + ??$?0PEAUTransitionType@cctz@time_internal@absl@@$0A@@?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAA@AEBV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@12@@Z + ??$?0PEAUTransitionType@cctz@time_internal@absl@@PEAU0123@$0A@@?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@QEAA@$$QEAPEAUTransitionType@cctz@time_internal@absl@@0@Z + ??$?0PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV234@@Z@PEAU0?1???R1234@QEBA?AV567@0@Z@$0A@@?$pair@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@PEAU1?1???R2345@QEBA?AV678@0@Z@@__Cr@std@@QEAA@$$QEAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@AEBV567@@Z@1@Z + ??$?0PEAVCommandLineFlag@absl@@$0A@@?$__tuple_leaf@$0A@$$QEAPEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAA@$$QEAPEAVCommandLineFlag@absl@@@Z + ??$?0PEAVCommandLineFlag@absl@@$0A@@?$tuple@$$QEAPEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@$$QEAPEAVCommandLineFlag@absl@@@Z + ??$?0PEAVCommandLineFlag@absl@@@?$__tuple_impl@U?$__integer_sequence@_K$0A@@__Cr@std@@$$QEAPEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@U__forward_args@12@$$QEAPEAVCommandLineFlag@absl@@@Z + ??$?0PEAW4ctrl_t@container_internal@absl@@AEAPEAX$0A@@?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@QEAA@$$QEAPEAW4ctrl_t@container_internal@absl@@AEAPEAX@Z + ??$?0PEAW4ctrl_t@container_internal@absl@@AEBQEAX$0A@@?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@QEAA@$$QEAPEAW4ctrl_t@container_internal@absl@@AEBQEAX@Z + ??$?0PEAW4ctrl_t@container_internal@absl@@PEAX$0A@@?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@QEAA@$$QEAPEAW4ctrl_t@container_internal@absl@@$$QEAPEAX@Z + ??$?0PEAX@FlagState@flags_internal@absl@@QEAA@AEAVFlagImpl@12@AEBQEAX_N2_J@Z + ??$?0PEBD@FormatArgImpl@str_format_internal@absl@@QEAA@AEBQEBD@Z + ??$?0PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU0123@$0A@@?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@QEAA@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAU3456@@Z + ??$?0PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU0123@$0A@@?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@@__Cr@std@@QEAA@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$?0PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@$0A@@?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@QEAA@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z + ??$?0PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QEAA@PEBVFormatArgImpl@str_format_internal@1@0AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@Z + ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@@?$FunctionRef@$$A6A_K_K@Z@absl@@IEAA@Uin_place_t@__Cr@std@@$$QEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@X@?$FunctionRef@$$A6A_K_K@Z@absl@@QEAA@$$QEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$array@D$0DKJI@@__Cr@std@@XU012@H@?$Span@D@absl@@QEAA@AEAU?$array@D$0DKJI@@__Cr@std@@@Z + ??$?0UFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@12@$0A@@?$pair@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@_K$07$02@23@@__Cr@std@@QEAA@$$QEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@45@@Z + ??$?0UHex@absl@@X@AlphaNum@absl@@QEAA@AEBUHex@1@$$QEAVStringifySink@strings_internal@1@@Z + ??$?0UStringEq@container_internal@absl@@@?$Storage@UStringEq@container_internal@absl@@$01U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAUStringEq@23@@Z + ??$?0UStringHash@container_internal@absl@@@?$Storage@UStringHash@container_internal@absl@@$00U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAUStringHash@23@@Z + ??$?0USynchEvent@absl@@@Condition@absl@@QEAA@P6A_NPEAUSynchEvent@1@@Z0@Z + ??$?0Uday_tag@detail@cctz@time_internal@absl@@@?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Uday_tag@detail@cctz@time_internal@absl@@@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Uday_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uhour_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uminute_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Umonth_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@detail@cctz@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uyear_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@$0A@@?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEAA@$$QEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@Z + ??$?0V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@X@?$function@$$A6AXAEAVCommandLineFlag@absl@@@Z@__Cr@std@@QEAA@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@Z + ??$?0V?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@XV01@H@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@AEBV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@1@@Z + ??$?0V?$Span@D@absl@@XV01@$0A@@?$Span@$$CBD@absl@@QEAA@AEBV?$Span@D@1@@Z + ??$?0V?$Span@I@absl@@XV01@$0A@@?$Span@$$CBI@absl@@QEAA@AEBV?$Span@I@1@@Z + ??$?0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V012@$0A@@?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@@__Cr@std@@QEAA@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0@Z + ??$?0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@$0A@@?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@QEAA@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z + ??$?0V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@AEA_N$0A@@?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@QEAA@$$QEAV?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@AEA_N@Z + ??$?0V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N$0A@@?$pair@V?$__hash_const_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@QEAA@$$QEAU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@12@@Z + ??$?0V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEA_N$0A@@?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@QEAA@$$QEAV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEA_N@Z + ??$?0V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEA_N$0A@@?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@__Cr@std@@QEAA@$$QEAV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@12@AEA_N@Z + ??$?0V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEA_N$0A@@?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@__Cr@std@@QEAA@$$QEAV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@12@AEA_N@Z + ??$?0V?$allocator@D@__Cr@std@@@?$Storage@V?$allocator@D@__Cr@std@@$02U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@D@56@@Z + ??$?0V?$allocator@D@__Cr@std@@@AlphaNum@absl@@QEAA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@PEAUCordRep@cord_internal@absl@@@56@@Z + ??$?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$$QEAI@Z + ??$?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@PEAUCordRep@cord_internal@absl@@@56@$$QEAI@Z + ??$?0V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@?$Storage@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@PEAVLogSink@absl@@@56@@Z + ??$?0V?$allocator@PEAVLogSink@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@$$QEAI@Z + ??$?0V?$allocator@PEAVLogSink@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@PEAVLogSink@absl@@@56@$$QEAI@Z + ??$?0V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@QEAA@_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@AEBQEBUCordRep@cord_internal@absl@@@Z + ??$?0V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@QEAA@_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@UPayload@status_internal@absl@@@56@@Z + ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$QEAI@Z + ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@UPayload@status_internal@absl@@@56@$$QEAI@Z + ??$?0V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$?0V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$?0V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@QEAA@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$?0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@$0A@@?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@$$QEAPEAVCommandLineFlag@absl@@@Z + ??$?0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@$0A@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@$$QEAPEAVCommandLineFlag@absl@@@Z + ??$?0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XV012@$0A@@?$Span@$$CBD@absl@@QEAA@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$?0VBufferRawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAVBufferRawSink@12@@Z + ??$?0VCommonFields@container_internal@absl@@@?$Storage@VCommonFields@container_internal@absl@@$0A@U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAVCommonFields@23@@Z + ??$?0VCommonFields@container_internal@absl@@UStringHash@12@UStringEq@12@V?$allocator@D@__Cr@std@@$00@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEAA@$$QEAVCommonFields@12@$$QEAUStringHash@12@$$QEAUStringEq@12@$$QEAV?$allocator@D@__Cr@std@@@Z + ??$?0VCommonFields@container_internal@absl@@UStringHash@12@UStringEq@12@V?$allocator@D@__Cr@std@@@?$CompressedTupleImpl@V?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00$01$02@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAVCommonFields@23@$$QEAUStringHash@23@$$QEAUStringEq@23@$$QEAV?$allocator@D@56@@Z + ??$?0VFILERawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAVFILERawSink@12@@Z + ??$?0VFallbackCrcMemcpyEngine@crc_internal@absl@@$0A@@?$default_delete@VCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@QEAA@AEBU?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@12@@Z + ??$?0VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@12@@Z + ??$?0VFlagState@flags_internal@absl@@$0A@@?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@QEAA@AEBU?$default_delete@VFlagState@flags_internal@absl@@@12@@Z + ??$?0VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@12@@Z + ??$?0VTimeZoneInfo@cctz@time_internal@absl@@$0A@@?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@QEAA@AEBU?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@12@@Z + ??$?0VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@12@@Z + ??$?0VTimeZoneLibC@cctz@time_internal@absl@@$0A@@?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@QEAA@AEBU?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@12@@Z + ??$?0VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@12@@Z + ??$?0Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEA_N$0A@@?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@QEAA@$$QEAViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEA_N@Z + ??$?0Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N$0A@@?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@QEAA@$$QEAViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@$$QEA_N@Z + ??$?0_J@FlagState@flags_internal@absl@@QEAA@AEAVFlagImpl@12@AEB_J_N2_J@Z + ??$?0_J@FormatArgImpl@str_format_internal@absl@@QEAA@AEB_J@Z + ??$?4PEAVCommandLineFlag@absl@@_N$0A@@?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@QEAAAEAV012@$$QEAV?$tuple@PEAVCommandLineFlag@absl@@_N@12@@Z + ??$?4UFindInfo@container_internal@absl@@V?$NonIterableBitMask@_K$07$02@12@$0A@@?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@23@@__Cr@std@@QEAAAEAV012@$$QEAU?$pair@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@_K$07$02@23@@12@@Z + ??$?6$01@LogMessage@log_internal@absl@@QEAAAEAV012@AEAY01$$CBD@Z + ??$?6$02@LogMessage@log_internal@absl@@QEAAAEAV012@AEAY02$$CBD@Z + ??$?6$0P@@LogMessage@log_internal@absl@@QEAAAEAV012@AEAY0P@$$CBD@Z + ??$?6C@LogMessage@log_internal@absl@@QEAAAEAV012@AEBC@Z + ??$?6D@LogMessage@log_internal@absl@@QEAAAEAV012@AEBD@Z + ??$?6E@LogMessage@log_internal@absl@@QEAAAEAV012@AEBE@Z + ??$?6F@LogMessage@log_internal@absl@@QEAAAEAV012@AEBF@Z + ??$?6G@LogMessage@log_internal@absl@@QEAAAEAV012@AEBG@Z + ??$?6H@LogMessage@log_internal@absl@@QEAAAEAV012@AEBH@Z + ??$?6I@LogMessage@log_internal@absl@@QEAAAEAV012@AEBI@Z + ??$?6J@LogMessage@log_internal@absl@@QEAAAEAV012@AEBJ@Z + ??$?6K@LogMessage@log_internal@absl@@QEAAAEAV012@AEBK@Z + ??$?6M@LogMessage@log_internal@absl@@QEAAAEAV012@AEBM@Z + ??$?6N@LogMessage@log_internal@absl@@QEAAAEAV012@AEBN@Z + ??$?6PEAX@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEAX@Z + ??$?6PEBD@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEBD@Z + ??$?6PEBX@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEBX@Z + ??$?6PEB_W@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEB_W@Z + ??$?6_J@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_J@Z + ??$?6_K@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_K@Z + ??$?6_N@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_N@Z + ??$?8PEAPEAVCommandLineFlag@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@0@Z + ??$?8PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@01@0@Z + ??$?8PEAPEAVLogSink@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEAPEAVLogSink@absl@@@01@0@Z + ??$?8PEAPEBVCommandLineFlag@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@0@Z + ??$?8PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z + ??$?8PEAUUnrecognizedFlag@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@01@0@Z + ??$?8PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@0@Z + ??$?8PEBQEAVLogSink@absl@@PEAPEAV01@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEBQEAVLogSink@absl@@@01@AEBV?$__wrap_iter@PEAPEAVLogSink@absl@@@01@@Z + ??$?8PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@0@Z + ??$?8PEBUUnrecognizedFlag@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@01@0@Z + ??$?8UUnrecognizedFlag@absl@@U01@@__Cr@std@@YA_NAEBV?$allocator@UUnrecognizedFlag@absl@@@01@0@Z + ??$?8V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@YA_NAEBV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@$$T@Z + ??$?8VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_NAEBV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@01@$$T@Z + ??$?BV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ + ??$?BV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@XZ + ??$?DH@absl@@YA?AVDuration@0@HV10@@Z + ??$?DH@absl@@YA?AVDuration@0@V10@H@Z + ??$?DN@absl@@YA?AVDuration@0@NV10@@Z + ??$?D_J@absl@@YA?AVDuration@0@_JV10@@Z + ??$?GPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV01234@@__Cr@std@@YA_JAEBV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z + ??$?GPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU0123@@__Cr@std@@YA_JAEBV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z + ??$?GPEAPEAVCommandLineFlag@absl@@PEAPEAV01@@__Cr@std@@YA_JAEBV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@0@Z + ??$?GPEAPEBVCommandLineFlag@absl@@PEAPEBV01@@__Cr@std@@YA_JAEBV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@0@Z + ??$?GPEAUTransition@cctz@time_internal@absl@@PEAU0123@@__Cr@std@@YA_JAEBV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0@Z + ??$?GPEAUTransitionType@cctz@time_internal@absl@@PEAU0123@@__Cr@std@@YA_JAEBV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z + ??$?GPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV234@@Z@PEAU0?1???R1234@QEBA?AV567@0@Z@@__Cr@std@@YA_JAEBV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@0@Z + ??$?GPEBQEAVLogSink@absl@@PEBQEAV01@@__Cr@std@@YA_JAEBV?$__wrap_iter@PEBQEAVLogSink@absl@@@01@0@Z + ??$?GPEBUTransition@cctz@time_internal@absl@@PEAU0123@@__Cr@std@@YA_JAEBV?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@01@AEBV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@01@@Z + ??$?GPEBUTransitionType@cctz@time_internal@absl@@PEAU0123@@__Cr@std@@YA_JAEBV?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@01@AEBV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@01@@Z + ??$?K_J@absl@@YA?AVDuration@0@V10@_J@Z + ??$?MUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?NUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?OUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?PUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?R$$CBUPrefixCrc@CrcCordState@crc_internal@absl@@U0123@$0A@@__copy_impl@__Cr@std@@QEBA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@12@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0PEAU4567@@Z + ??$?RAEAPEAVLogSink@absl@@@__identity@__Cr@std@@QEBAAEAPEAVLogSink@absl@@AEAPEAV34@@Z + ??$?RAEAPEBDAEAHAEAY0LLI@DAEBQEBDPEAD@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@QEBAXAEAPEBDAEAHAEAY0LLI@DAEBQEBD$$QEAPEAD@Z + ??$?RAEAPEBVCommandLineFlag@absl@@@__identity@__Cr@std@@QEBAAEAPEBVCommandLineFlag@absl@@AEAPEBV34@@Z + ??$?RAEAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@__variant_detail@__Cr@std@@@?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@QEBA?A_TAEAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@345@@Z + ??$?RAEAU?$__alt@$01V?$Span@$$CBD@absl@@@__variant_detail@__Cr@std@@@?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@QEBA?A_TAEAU?$__alt@$01V?$Span@$$CBD@absl@@@345@@Z + ??$?RAEAU?$__alt@$02V?$variant@IHM@__Cr@std@@@__variant_detail@__Cr@std@@@?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@QEBA?A_TAEAU?$__alt@$02V?$variant@IHM@__Cr@std@@@345@@Z + ??$?RAEAU?$__alt@$0A@V?$variant@_K_JIH_N@__Cr@std@@@__variant_detail@__Cr@std@@@?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@QEBA?A_TAEAU?$__alt@$0A@V?$variant@_K_JIH_N@__Cr@std@@@345@@Z + ??$?RAEAW4LogSeverity@absl@@AEAPEBDAEAHPEAPEADPEAH@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@QEBA_NAEAW4LogSeverity@2@AEAPEBDAEAH$$QEAPEAPEAD$$QEAPEAH@Z + ??$?RAEAY04$$CBDPEAVCondVar@absl@@@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@QEBAXAEAY04$$CBD$$QEAPEAVCondVar@2@@Z + ??$?RAEAY06$$CBDPEAVCondVar@absl@@@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@QEBAXAEAY06$$CBD$$QEAPEAVCondVar@2@@Z + ??$?RAEAY0BB@$$CBDPEAVCondVar@absl@@@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@QEBAXAEAY0BB@$$CBD$$QEAPEAVCondVar@2@@Z + ??$?RAEAY0N@$$CBDPEAVMutex@absl@@AEA_J@?$AtomicHook@P6AXPEBDPEBX_J@Z@base_internal@absl@@QEBAXAEAY0N@$$CBD$$QEAPEAVMutex@2@AEA_J@Z + ??$?RAEAY0O@$$CBDPEAVCondVar@absl@@@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@QEBAXAEAY0O@$$CBD$$QEAPEAVCondVar@2@@Z + ??$?RAEA_J@?$AtomicHook@P6AX_J@Z@base_internal@absl@@QEBAXAEA_J@Z + ??$?RAEBQEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QEBA$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEAPEAPEBV56789@@Z + ??$?RAEBQEAPEAUCordRep@cord_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QEBA$$QEAPEAUCordRep@cord_internal@absl@@AEBQEAPEAU567@@Z + ??$?RAEBQEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QEBA$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEBQEAPEAU5678@@Z + ??$?RAEBQEAPEAVLogSink@absl@@@__fn@__iter_move@ranges@__Cr@std@@QEBA$$QEAPEAVLogSink@absl@@AEBQEAPEAV56@@Z + ??$?RAEBQEAUPayload@status_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QEBA$$QEAUPayload@status_internal@absl@@AEBQEAU567@@Z + ??$?RAEBQEAUTransition@cctz@time_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QEBA$$QEAUTransition@cctz@time_internal@absl@@AEBQEAU5678@@Z + ??$?RAEBQEAUTransitionType@cctz@time_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QEBA$$QEAUTransitionType@cctz@time_internal@absl@@AEBQEAU5678@@Z + ??$?RAEBUTransition@cctz@time_internal@absl@@@__identity@__Cr@std@@QEBAAEBUTransition@cctz@time_internal@absl@@AEBU3456@@Z + ??$?RPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV01234@$0A@@?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$?RPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV01234@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$?RPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU0123@$0A@@?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@12@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$?RPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU0123@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@12@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$?RPEAVLogSink@absl@@PEAV01@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@12@PEAPEAVLogSink@absl@@00@Z + ??$?RPEAVSpinLock@base_internal@absl@@AEB_J@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@QEBAX$$QEAPEAVSpinLock@12@AEB_J@Z + ??$?RPEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@$0A@@__copy_impl@__Cr@std@@QEBA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@12@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z + ??$?RUTransition@cctz@time_internal@absl@@U0123@$0A@@?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@12@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$?RUTransition@cctz@time_internal@absl@@U0123@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@12@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$?RUTransitionType@cctz@time_internal@absl@@U0123@$0A@@?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@12@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$?RUTransitionType@cctz@time_internal@absl@@U0123@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@12@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$?RV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@$0A@@__copy_impl@__Cr@std@@QEBA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@12@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$V@?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@QEBA_KAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@EmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBUpiecewise_construct_t@56@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@EmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBUpiecewise_construct_t@56@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@AEBQEAVCommandLineFlag@absl@@@12@@?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@QEBA_NAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@AEBQEAVCommandLineFlag@absl@@@45@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@AEBQEAVCommandLineFlag@absl@@@12@@?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@QEBA_KAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@AEBQEAVCommandLineFlag@absl@@@45@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@AEBQEAVCommandLineFlag@absl@@@12@@FindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA?AVconst_iterator@123@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@67@$$QEAV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QEAV?$tuple@AEBQEAVCommandLineFlag@absl@@@67@@Z + ??$?RVDuration@absl@@V01@@?$__less@XX@__Cr@std@@QEBA_NAEBVDuration@absl@@0@Z + ??$?RVMixingHashState@hash_internal@absl@@@CombineRaw@hash_internal@absl@@QEBA?AVMixingHashState@12@V312@_K@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAPEBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAPEBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CC@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CC@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CG@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CG@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CH@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CH@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CI@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CI@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CL@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CL@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAH$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?VAEAVLogMessage@log_internal@absl@@@Voidify@log_internal@absl@@QEHBAXAEAVLogMessage@12@@Z + ??$?XH$0A@@Duration@absl@@QEAAAEAV01@H@Z + ??$AbslHashValue@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@YA?AVMixingHashState@01@V201@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$AbslHashValue@VMixingHashState@hash_internal@absl@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@hash_internal@absl@@YA?AVMixingHashState@01@V201@AEBV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@Z + ??$AbslHashValue@VMixingHashState@hash_internal@absl@@AEB_K@hash_internal@absl@@YA?AVMixingHashState@01@V201@AEBV?$tuple@AEB_K@__Cr@std@@@Z + ??$AbslStringify@VStringifySink@strings_internal@absl@@@absl@@YAXAEAVStringifySink@strings_internal@0@UHex@0@@Z + ??$Add@$00@CordRepBtree@cord_internal@absl@@AEAAXPEAUCordRep@12@@Z + ??$Add@$00@CordRepBtree@cord_internal@absl@@AEAAXV?$Span@QEAUCordRep@cord_internal@absl@@@2@@Z + ??$Add@$0A@@CordRepBtree@cord_internal@absl@@AEAAXPEAUCordRep@12@@Z + ??$Add@$0A@@CordRepBtree@cord_internal@absl@@AEAAXV?$Span@QEAUCordRep@cord_internal@absl@@@2@@Z + ??$AddCordRep@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z + ??$AddCordRep@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z + ??$AddData@$00@CordRepBtree@cord_internal@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ??$AddData@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$AddEdge@$00@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z + ??$AddEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z + ??$Allocate@$07V?$allocator@D@__Cr@std@@@container_internal@absl@@YAPEAXPEAV?$allocator@D@__Cr@std@@_K@Z + ??$AllocateBackingArray@$07V?$allocator@D@__Cr@std@@@container_internal@absl@@YAPEAXPEAX_K@Z + ??$Append@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$AppendImpl@AEBVCord@absl@@@Cord@absl@@AEAAXAEBV01@@Z + ??$AppendImpl@VCord@absl@@@Cord@absl@@AEAAX$$QEAV01@@Z + ??$ArgumentToConv@C@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@D@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@E@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@F@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@G@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@H@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@I@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@J@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@K@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@M@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@N@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@O@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@PEBD@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@PEB_W@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@UVoidPtr@str_format_internal@absl@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@Vint128@absl@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@Vuint128@absl@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@_J@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@_K@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@_N@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$AsciiInAZRange@$00@ascii_internal@absl@@YA_NE@Z + ??$AsciiInAZRange@$0A@@ascii_internal@absl@@YA_NE@Z + ??$AsciiInAZRangeNaive@$00@ascii_internal@absl@@YA_NE@Z + ??$AsciiInAZRangeNaive@$0A@@ascii_internal@absl@@YA_NE@Z + ??$AsciiStrCaseFold@$00@ascii_internal@absl@@YAXPEADPEBD_K@Z + ??$AsciiStrCaseFold@$0A@@ascii_internal@absl@@YAXPEADPEBD_K@Z + ??$AsciiStrCaseFoldImpl@$00$00@ascii_internal@absl@@YAXPEADPEBD_K@Z + ??$AsciiStrCaseFoldImpl@$00$0A@@ascii_internal@absl@@YAXPEADPEBD_K@Z + ??$AsciiStrCaseFoldImpl@$0A@$00@ascii_internal@absl@@YAXPEADPEBD_K@Z + ??$AsciiStrCaseFoldImpl@$0A@$0A@@ascii_internal@absl@@YAXPEADPEBD_K@Z + ??$AssertHashEqConsistent@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAAXAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$AssertNonNull@U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@@functional_internal@absl@@YAXAEBU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$AssertOnFind@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAAXAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$AssignElements@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXPEAUPayload@status_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@01@_K@Z + ??$Base64EscapeInternal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@strings_internal@absl@@YAXPEBE_KPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_NPEBD@Z + ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@A6AXXZ@Z + ??$CallOnceImpl@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@$$QEAP8FlagImpl@flags_internal@1@EAAXXZ$$QEAPEAV671@@Z + ??$CastAndCallFunction@$$CBU?$atomic@_N@__Cr@std@@@Condition@absl@@CA_NPEBV01@@Z + ??$CastAndCallFunction@USynchEvent@absl@@@Condition@absl@@CA_NPEBV01@@Z + ??$Compare@$0FE@$0FE@@strings_internal@absl@@YAHAEBV?$BigUnsigned@$0FE@@01@0@Z + ??$ConstructElements@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@01@_K@Z + ??$ConstructElements@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@V?$move_iterator@PEAPEAVLogSink@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@1@AEAV?$IteratorValueAdapter@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@V?$move_iterator@PEAPEAVLogSink@absl@@@23@@01@_K@Z + ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEBUPayload@status_internal@absl@@@01@_K@Z + ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@01@_K@Z + ??$ConstructElements@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEAVFormatArgImpl@str_format_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@01@_K@Z + ??$ConsumeConversion@$00@str_format_internal@absl@@YAPEBDPEBDQEBDPEAUUnboundConversion@01@PEAH@Z + ??$ConsumeConversion@$0A@@str_format_internal@absl@@YAPEBDPEBDQEBDPEAUUnboundConversion@01@PEAH@Z + ??$Convert@VFormatArgImpl@str_format_internal@absl@@@FormatArgImplFriend@str_format_internal@absl@@SA_NVFormatArgImpl@12@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ??$ConvertIntArg@C@str_format_internal@absl@@YA_NCVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@D@str_format_internal@absl@@YA_NDVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@E@str_format_internal@absl@@YA_NEVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@F@str_format_internal@absl@@YA_NFVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@G@str_format_internal@absl@@YA_NGVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@H@str_format_internal@absl@@YA_NHVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@I@str_format_internal@absl@@YA_NIVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@J@str_format_internal@absl@@YA_NJVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@K@str_format_internal@absl@@YA_NKVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@Vint128@absl@@@str_format_internal@absl@@YA_NVint128@1@VFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@Vuint128@absl@@@str_format_internal@absl@@YA_NVuint128@1@VFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_J@str_format_internal@absl@@YA_N_JVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_K@str_format_internal@absl@@YA_N_KVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_W@str_format_internal@absl@@YA_N_WVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXD_K@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXD_K@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBufferWithStructuredProtoField@$00@LogMessage@log_internal@absl@@AEAAXUStructuredProtoField@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBufferWithStructuredProtoField@$0A@@LogMessage@log_internal@absl@@AEAAXUStructuredProtoField@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CreateDefault@$0A@@CommonFields@container_internal@absl@@SA?AV012@XZ + ??$CreateWithCustomLimitImpl@$$V@CordBuffer@absl@@CA?AV01@_K0@Z + ??$Deallocate@$07V?$allocator@D@__Cr@std@@@container_internal@absl@@YAXPEAV?$allocator@D@__Cr@std@@PEAX_K@Z + ??$DeallocateBackingArray@$07V?$allocator@D@__Cr@std@@@container_internal@absl@@YAXPEAX_KPEAW4ctrl_t@01@11_N@Z + ??$DecomposePair@U?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YA_N$$QEAU?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@01@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$DecomposePair@U?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YA_K$$QEAU?$HashElement@UStringHash@container_internal@absl@@$00@01@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$DecomposePair@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@$$QEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@Z + ??$DecomposePair@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@Z + ??$DecomposePair@UFindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YA?AVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@$$QEAUFindElement@301@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$DecomposePairImpl@U?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@56@@memory_internal@container_internal@absl@@YA_N$$QEAU?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@12@U?$pair@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@23@@__Cr@std@@@Z + ??$DecomposePairImpl@U?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@56@@memory_internal@container_internal@absl@@YA_K$$QEAU?$HashElement@UStringHash@container_internal@absl@@$00@12@U?$pair@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@23@@__Cr@std@@@Z + ??$DecomposePairImpl@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@67@@memory_internal@container_internal@absl@@YA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@U?$pair@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@45@@Z + ??$DecomposePairImpl@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@67@@memory_internal@container_internal@absl@@YA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@U?$pair@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@45@@Z + ??$DecomposePairImpl@UFindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@67@@memory_internal@container_internal@absl@@YA?AVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QEAUFindElement@412@U?$pair@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@23@@__Cr@std@@@Z + ??$Dispatch@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@F@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@G@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@H@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@I@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@M@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@O@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@PEBD@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@PEB_W@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@UVoidPtr@str_format_internal@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@Vint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@Vuint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$DivMod@$09@?$BigUnsigned@$03@strings_internal@absl@@AEAAIXZ + ??$DivMod@$09@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAIXZ + ??$EmplaceBack@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z + ??$EmplaceBack@AEBQEAVLogSink@absl@@@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAPEAVLogSink@2@AEBQEAV32@@Z + ??$EmplaceBack@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAUPayload@status_internal@2@$$QEAU342@@Z + ??$EmplaceBackSlow@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z + ??$EmplaceBackSlow@AEBQEAVLogSink@absl@@@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAAEAPEAVLogSink@2@AEBQEAV32@@Z + ??$EmplaceBackSlow@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAAEAUPayload@status_internal@2@$$QEAU342@@Z + ??$Extract@V?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@str_format_internal@absl@@@UntypedFormatSpecImpl@str_format_internal@absl@@SAAEBV012@AEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@12@@Z + ??$Extract@V?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@str_format_internal@absl@@@UntypedFormatSpecImpl@str_format_internal@absl@@SAAEBV012@AEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@12@@Z + ??$Extract@V?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@str_format_internal@absl@@@UntypedFormatSpecImpl@str_format_internal@absl@@SAAEBV012@AEBV?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@12@@Z + ??$Extract@V?$FormatSpecTemplate@$0JPPPL@@str_format_internal@absl@@@UntypedFormatSpecImpl@str_format_internal@absl@@SAAEBV012@AEBV?$FormatSpecTemplate@$0JPPPL@@12@@Z + ??$ExtractCharSet@$0BPPPL@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0BPPPL@@01@@Z + ??$ExtractCharSet@$0EAAAA@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0EAAAA@@01@@Z + ??$ExtractCharSet@$0EAAAE@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0EAAAE@@01@@Z + ??$ExtractCharSet@$0IAAAE@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0IAAAE@@01@@Z + ??$ExtractCharSet@$0JPOAA@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0JPOAA@@01@@Z + ??$ExtractCharSet@$0JPPPL@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0JPPPL@@01@@Z + ??$ExtractStringification@UHex@absl@@@strings_internal@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAVStringifySink@01@AEBUHex@1@@Z + ??$FastIntToBuffer@C@numbers_internal@absl@@YAPEADCPEAD@Z + ??$FastIntToBuffer@D@numbers_internal@absl@@YAPEADDPEAD@Z + ??$FastIntToBuffer@E@numbers_internal@absl@@YAPEADEPEAD@Z + ??$FastIntToBuffer@F@numbers_internal@absl@@YAPEADFPEAD@Z + ??$FastIntToBuffer@G@numbers_internal@absl@@YAPEADGPEAD@Z + ??$FastIntToBuffer@J@numbers_internal@absl@@YAPEADJPEAD@Z + ??$FastIntToBuffer@K@numbers_internal@absl@@YAPEADKPEAD@Z + ??$FastIntToBuffer@_W@numbers_internal@absl@@YAPEAD_WPEAD@Z + ??$FastTypeId@F@absl@@YAPEBXXZ + ??$FastTypeId@G@absl@@YAPEBXXZ + ??$FastTypeId@H@absl@@YAPEBXXZ + ??$FastTypeId@I@absl@@YAPEBXXZ + ??$FastTypeId@J@absl@@YAPEBXXZ + ??$FastTypeId@K@absl@@YAPEBXXZ + ??$FastTypeId@M@absl@@YAPEBXXZ + ??$FastTypeId@N@absl@@YAPEBXXZ + ??$FastTypeId@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@YAPEBXXZ + ??$FastTypeId@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YAPEBXXZ + ??$FastTypeId@_J@absl@@YAPEBXXZ + ??$FastTypeId@_K@absl@@YAPEBXXZ + ??$FastTypeId@_N@absl@@YAPEBXXZ + ??$FindSubstitutions@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@strings_internal@absl@@YA?AV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@AEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@4@@Z + ??$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@01@PEBXPEAX2@Z + ??$Flush@V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@VBufferRawSink@str_format_internal@absl@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@VFILERawSink@str_format_internal@absl@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$FormatConvertImpl@_N$0A@@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@01@_NVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$FromChrono@_JV?$ratio@$00$0PECEA@@__Cr@std@@@time_internal@absl@@YA?AVDuration@1@AEBV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@@Z + ??$FromInt64@$00@time_internal@absl@@YA?AVDuration@1@_JV?$ratio@$00$00@__Cr@std@@@Z + ??$FromInt64@$0DLJKMKAA@@time_internal@absl@@YA?AVDuration@1@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@Z + ??$FromInt64@$0DOI@@time_internal@absl@@YA?AVDuration@1@_JV?$ratio@$00$0DOI@@__Cr@std@@@Z + ??$FromInt64@$0PECEA@@time_internal@absl@@YA?AVDuration@1@_JV?$ratio@$00$0PECEA@@__Cr@std@@@Z + ??$GenRuntimeTypeId@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEBVtype_info@@XZ + ??$GenericCompare@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@absl@@YAHAEBVCord@0@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$GenericCompare@HVCord@absl@@@absl@@YAHAEBVCord@0@0_K@Z + ??$GenericCompare@_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@absl@@YA_NAEBVCord@0@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$GenericCompare@_NVCord@absl@@@absl@@YA_NAEBVCord@0@0_K@Z + ??$GetData@$$CBV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@@span_internal@absl@@YAPEBVFormatArgImpl@str_format_internal@1@AEBV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@1@@Z + ??$GetData@$$CBV?$Span@D@absl@@@span_internal@absl@@YAPEADAEBV?$Span@D@1@@Z + ??$GetData@$$CBV?$Span@I@absl@@@span_internal@absl@@YAPEAIAEBV?$Span@I@1@@Z + ??$GetData@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@span_internal@absl@@YAPEBDAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$GetData@U?$array@D$0DKJI@@__Cr@std@@@span_internal@absl@@YAPEADAEAU?$array@D$0DKJI@@__Cr@std@@@Z + ??$GetData@V?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@@span_internal@absl@@YAPEAPEAVLogSink@1@AEAV?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@1@@Z + ??$GetData@V?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@span_internal@absl@@YAPEAPEAVLogSink@1@AEAV?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@Z + ??$GetDataImpl@$$CBV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@@span_internal@absl@@YAPEBVFormatArgImpl@str_format_internal@1@AEBV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@1@D@Z + ??$GetDataImpl@$$CBV?$Span@D@absl@@@span_internal@absl@@YAPEADAEBV?$Span@D@1@D@Z + ??$GetDataImpl@$$CBV?$Span@I@absl@@@span_internal@absl@@YAPEAIAEBV?$Span@I@1@D@Z + ??$GetDataImpl@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@span_internal@absl@@YAPEBDAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ??$GetDataImpl@U?$array@D$0DKJI@@__Cr@std@@@span_internal@absl@@YAPEADAEAU?$array@D$0DKJI@@__Cr@std@@D@Z + ??$GetDataImpl@V?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@@span_internal@absl@@YAPEAPEAVLogSink@1@AEAV?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@1@D@Z + ??$GetDataImpl@V?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@span_internal@absl@@YAPEAPEAVLogSink@1@AEAV?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@D@Z + ??$GetFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@0@@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$00$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$03$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$07$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$0A@$0A@@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$0BA@$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$HashOf@$S$$ZV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@absl@@YA_KAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@Z + ??$HashOf@$S$$Z_K@absl@@YA_KAEB_K@Z + ??$HidePtr@$$CBX@base_internal@absl@@YA_KPEBX@Z + ??$HidePtr@U?$atomic@_J@__Cr@std@@@base_internal@absl@@YA_KPEAU?$atomic@_J@__Cr@std@@@Z + ??$HidePtr@X@base_internal@absl@@YA_KPEAX@Z + ??$Hours@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$IgnoreLeak@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@YAPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV123@@Z + ??$Init@$0A@@CordRepBtreeNavigator@cord_internal@absl@@AEAAPEAUCordRep@12@PEAVCordRepBtree@12@@Z + ??$Init@D@FormatArgImpl@str_format_internal@absl@@AEAAXAEBD@Z + ??$Init@H@FormatArgImpl@str_format_internal@absl@@AEAAXAEBH@Z + ??$Init@I@FormatArgImpl@str_format_internal@absl@@AEAAXAEBI@Z + ??$Init@M@FormatArgImpl@str_format_internal@absl@@AEAAXAEBM@Z + ??$Init@N@FormatArgImpl@str_format_internal@absl@@AEAAXAEBN@Z + ??$Init@PEBD@FormatArgImpl@str_format_internal@absl@@AEAAXAEBQEBD@Z + ??$Init@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@AEAAXAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Init@_J@FormatArgImpl@str_format_internal@absl@@AEAAXAEB_J@Z + ??$InitDefaultValue@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@UEmptyBraces@01@@Z + ??$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@12@_K@Z + ??$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ??$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ??$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ??$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ??$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ??$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@H@UniquelyRepresentedProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@AEBH@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@HashValueProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@HashValueProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@AEBV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@V?$tuple@AEB_K@__Cr@std@@@HashValueProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@AEBV?$tuple@AEB_K@__Cr@std@@@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@_K@UniquelyRepresentedProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@AEB_K@Z + ??$InvokeFlush@V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@str_format_internal@absl@@YAXPEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$InvokeFlush@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@str_format_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$InvokeFlush@VBufferRawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPEAVBufferRawSink@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$InvokeFlush@VFILERawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPEAVFILERawSink@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$InvokeGet@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@@FlagImplPeer@flags_internal@absl@@SA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@12@@Z + ??$InvokeObject@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z + ??$InvokeParseFlag@H@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$InvokeParseFlag@M@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAMPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$InvokeParseFlag@N@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEANPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$InvokeParseFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$InvokeSet@V?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@FlagImplPeer@flags_internal@absl@@SAXAEAV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@12@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@Z + ??$IsAboveValidSize@$07@container_internal@absl@@YA_N_K0@Z + ??$IsDestructionTrivial@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@@container_internal@absl@@YA?A_PXZ + ??$IsOfType@F@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@G@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@H@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@I@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@J@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@K@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@M@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@N@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@_J@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@_K@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@_N@CommandLineFlag@absl@@QEBA_NXZ + ??$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z + ??$JoinRange@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$JoinRange@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$LowLevelCallOnce@A6AXXZ$$V@base_internal@absl@@YAXPEAVonce_flag@1@A6AXXZ@Z + ??$MakeCheckOpString@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0PEBD@Z + ??$MakeCheckOpString@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PEBD@Z + ??$MakeCheckOpString@DD@log_internal@absl@@YAPEBDDDPEBD@Z + ??$MakeCheckOpString@EE@log_internal@absl@@YAPEBDEEPEBD@Z + ??$MakeCheckOpString@MM@log_internal@absl@@YAPEBDMMPEBD@Z + ??$MakeCheckOpString@NN@log_internal@absl@@YAPEBDNNPEBD@Z + ??$MakeCheckOpString@PEBCPEBC@log_internal@absl@@YAPEBDPEBC0PEBD@Z + ??$MakeCheckOpString@PEBDPEBD@log_internal@absl@@YAPEBDPEBD00@Z + ??$MakeCheckOpString@PEBEPEBE@log_internal@absl@@YAPEBDPEBE0PEBD@Z + ??$MakeCheckOpString@PEBXPEBX@log_internal@absl@@YAPEBDPEBX0PEBD@Z + ??$MakeCheckOpString@_J_J@log_internal@absl@@YAPEBD_J0PEBD@Z + ??$MakeCheckOpString@_K_K@log_internal@absl@@YAPEBD_K0PEBD@Z + ??$MakeCheckOpString@_N_N@log_internal@absl@@YAPEBD_N0PEBD@Z + ??$MakeCheckOpValueString@M@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBM@Z + ??$MakeCheckOpValueString@N@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBN@Z + ??$MakeCheckOpValueString@PEBC@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBQEBC@Z + ??$MakeCheckOpValueString@PEBD@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBQEBD@Z + ??$MakeCheckOpValueString@PEBE@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBQEBE@Z + ??$MakeCheckOpValueString@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$MakeCheckOpValueString@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$MakeCheckOpValueString@_J@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEB_J@Z + ??$MakeCheckOpValueString@_K@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEB_K@Z + ??$MakeCheckOpValueString@_N@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEB_N@Z + ??$MakeConstSpan@$SQEAX@absl@@YA?AV?$Span@QEAX@0@PEBQEAX_K@Z + ??$MakeSpan@$SD@absl@@YA?AV?$Span@D@0@PEAD_K@Z + ??$MakeSpan@$SI$0BAA@@absl@@YA?AV?$Span@I@0@AEAY0BAA@I@Z + ??$MakeSpan@$SI$0BIA@@absl@@YA?AV?$Span@I@0@AEAY0BIA@I@Z + ??$MakeSpan@$SI$0CAA@@absl@@YA?AV?$Span@I@0@AEAY0CAA@I@Z + ??$MakeSpan@$SI$0CIA@@absl@@YA?AV?$Span@I@0@AEAY0CIA@I@Z + ??$MakeSpan@$SI$0IA@@absl@@YA?AV?$Span@I@0@AEAY0IA@I@Z + ??$MakeSpan@$SI@absl@@YA?AV?$Span@I@0@PEAI_K@Z + ??$MakeSpan@$SPEAVLogSink@absl@@@absl@@YA?AV?$Span@PEAVLogSink@absl@@@0@PEAPEAVLogSink@0@_K@Z + ??$MakeSpan@$SU?$array@D$0DKJI@@__Cr@std@@@absl@@YA?AV?$Span@D@0@AEAU?$array@D$0DKJI@@__Cr@std@@@Z + ??$MakeSpan@$SV?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@@absl@@YA?AV?$Span@PEAVLogSink@absl@@@0@AEAV?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@0@@Z + ??$MakeSpan@$SV?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@absl@@YA?AV?$Span@PEAVLogSink@absl@@@0@AEAV?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@Z + ??$MaskOfLength@I@crc_internal@absl@@YAIH@Z + ??$MaxValidSize@$07@container_internal@absl@@YA_K_K@Z + ??$MaxValidSizeFor1ByteSlot@$07@container_internal@absl@@YA_KXZ + ??$Merge@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z + ??$Merge@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z + ??$Microseconds@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Microseconds@J$0A@@absl@@YA?AVDuration@0@J@Z + ??$Milliseconds@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Milliseconds@K$0A@@absl@@YA?AVDuration@0@K@Z + ??$Milliseconds@N$0A@@absl@@YA?AVDuration@0@N@Z + ??$Minutes@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Nanoseconds@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Nanoseconds@J$0A@@absl@@YA?AVDuration@0@J@Z + ??$Nanoseconds@_J$0A@@absl@@YA?AVDuration@0@_J@Z + ??$NewImpl@$0BAAA@$$V@CordRepFlat@cord_internal@absl@@SAPEAU012@_K@Z + ??$NewImpl@$0EAAAA@$$V@CordRepFlat@cord_internal@absl@@SAPEAU012@_K@Z + ??$NewLeaf@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$NewLeaf@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$OffsetValue@U?$atomic@_K@__Cr@std@@@FlagImpl@flags_internal@absl@@AEBAPEAU?$atomic@_K@__Cr@std@@XZ + ??$OffsetValue@UFlagMaskedPointerValue@flags_internal@absl@@@FlagImpl@flags_internal@absl@@AEBAPEAUFlagMaskedPointerValue@12@XZ + ??$OffsetValue@UFlagOneWordValue@flags_internal@absl@@@FlagImpl@flags_internal@absl@@AEBAPEAUFlagOneWordValue@12@XZ + ??$PairArgs@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@$$QEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@Z + ??$PairArgs@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@$$QEAPEAVCommandLineFlag@1@@Z + ??$PairArgs@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@23@@__Cr@std@@AEBU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@Z + ??$PairArgs@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBQEAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@23@@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@AEBQEAVCommandLineFlag@1@@Z + ??$PairArgs@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@Z + ??$PairArgs@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@$$QEAPEAVCommandLineFlag@1@@Z + ??$ParseFlag@H@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??$ParseFlag@M@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAMPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??$ParseFlag@N@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEANPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??$ParseFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??$ParseFlagImpl@H@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAH@Z + ??$ParseFlagImpl@I@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAI@Z + ??$ParseFlagImpl@J@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAJ@Z + ??$ParseFlagImpl@K@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAK@Z + ??$ParseFlagImpl@_J@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEA_J@Z + ??$ParseFlagImpl@_K@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEA_K@Z + ??$ParseFloat@$09@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z + ??$ParseFloat@$0BA@@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z + ??$ParseFormatString@UParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@@str_format_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UParsedFormatConsumer@ParsedFormatBase@01@@Z + ??$PopDead@_J_K_K_KG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AEAAPEAUHashtablezInfo@container_internal@2@_J_K11G@Z + ??$Prepend@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$ReadCallback@P6A_NPEAUSynchEvent@absl@@@Z@Condition@absl@@AEBAXPEAP6A_NPEAUSynchEvent@1@@Z@Z + ??$ReadCallback@P6A_NPEBU?$atomic@_N@__Cr@std@@@Z@Condition@absl@@AEBAXPEAP6A_NPEBU?$atomic@_N@__Cr@std@@@Z@Z + ??$Register@AEB_JAEA_KAEA_KAEA_KAEAG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAAPEAUHashtablezInfo@container_internal@2@AEB_JAEA_K11AEAG@Z + ??$RotateRight@I@crc_internal@absl@@YAIIHH@Z + ??$RoundUp@$03@crc_internal@absl@@YAPEBEPEBE@Z + ??$RunWithReentrancyGuard@V@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@78@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@78@@Z@@CommonFields@container_internal@absl@@QEAAXV@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@78@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@78@@Z@@Z + ??$RunWithReentrancyGuard@V@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@78@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@78@@Z@@CommonFields@container_internal@absl@@QEAAXV@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@78@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@78@@Z@@Z + ??$RunWithReentrancyGuard@V@?0??destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z@@CommonFields@container_internal@absl@@QEAAXV@?0??destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@@Z@@Z + ??$RunWithReentrancyGuard@V@?0??transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@0@Z@@CommonFields@container_internal@absl@@QEAAXV@?0??transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@0@Z@@Z + ??$SNPrintF@DHHH@absl@@YAHPEAD_KAEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@str_format_internal@0@AEBDAEBH44@Z + ??$STLStringResizeUninitialized@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@X@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ??$STLStringResizeUninitializedAmortized@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ??$SanitizerPoisonObject@T?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@@container_internal@absl@@YAXPEBT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@@Z + ??$Seconds@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Seconds@J$0A@@absl@@YA?AVDuration@0@J@Z + ??$Seconds@_J$0A@@absl@@YA?AVDuration@0@_J@Z + ??$SetEdge@$00@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z + ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z + ??$SetFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YAXPEAV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@0@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@Z + ??$SharedCompareImpl@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@absl@@YAHAEBVCord@0@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$SharedCompareImpl@VCord@absl@@@absl@@YAHAEBVCord@0@0@Z + ??$SimpleAtoi@H@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAH@Z + ??$SmallMemmove@$00@cord_internal@absl@@YAXPEADPEBD_K@Z + ??$SmallMemmove@$0A@@cord_internal@absl@@YAXPEADPEBD_K@Z + ??$StoreCallback@P6A_NPEAUSynchEvent@absl@@@Z@Condition@absl@@AEAAXP6A_NPEAUSynchEvent@1@@Z@Z + ??$StoreCallback@P6A_NPEAX@Z@Condition@absl@@AEAAXP6A_NPEAX@Z@Z + ??$StoreCallback@P6A_NPEBU?$atomic@_N@__Cr@std@@@Z@Condition@absl@@AEAAXP6A_NPEBU?$atomic@_N@__Cr@std@@@Z@Z + ??$StrAppend@$$V@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@1111@Z + ??$StrCat@$$BY01D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEAY01$$CBD@Z + ??$StrCat@$$V@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000@Z + ??$StrCat@F@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@F@Z + ??$StrCat@G@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@G@Z + ??$StrCat@H@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ??$StrCat@I@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ??$StrCat@J@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ??$StrCat@K@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ??$StrCat@PEBD@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBQEBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY02D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY02$$CBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY03D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY03$$CBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0BO@DV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY0BO@$$CBD1@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0LD@D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY0LD@$$CBD@Z + ??$StrCat@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV123@@Z + ??$StrCat@_J@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ??$StrCat@_K@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ??$StrFormat@DHHHHH_JIV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HPEBDV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@str_format_internal@0@AEBDAEBH2222AEB_JAEBIAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@2AEBQEBD5@Z + ??$StrFormat@HM@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@str_format_internal@0@AEBHAEBM@Z + ??$StrFormat@HN@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@str_format_internal@0@AEBHAEBN@Z + ??$StrJoin@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z + ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@3@@Z + ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z + ??$StrSplit@D@absl@@YA?AV?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@D@Z + ??$StrSplit@DUAllowEmpty@absl@@@absl@@YA?AV?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@DUAllowEmpty@0@@Z + ??$StrSplit@VByAnyChar@absl@@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@@Z + ??$StrSplit@VByAnyChar@absl@@USkipEmpty@2@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@USkipEmpty@0@@Z + ??$StreamFormat@I@absl@@YA?AVStreamable@str_format_internal@0@AEBV?$FormatSpecTemplate@$0JPPPL@@20@AEBI@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@H@strings_internal@0@YA?AV123@H@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@I@strings_internal@0@YA?AV123@I@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@J@strings_internal@0@YA?AV123@J@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@K@strings_internal@0@YA?AV123@K@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_J@strings_internal@0@YA?AV123@_J@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_K@strings_internal@0@YA?AV123@1@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@0@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@2V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@50@@Z@@Z + ??$ToChronoDuration@V?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$0DOI@@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$0DOI@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToInt@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@F@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@G@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@H@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@I@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@M@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@O@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@PEBD@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@PEB_W@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@UVoidPtr@str_format_internal@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@VFormatArgImpl@str_format_internal@absl@@@FormatArgImplFriend@str_format_internal@absl@@SA_NVFormatArgImpl@12@PEAH@Z + ??$ToInt@Vint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@Vuint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@_J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@_K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@_N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToIntVal@C@FormatArgImpl@str_format_internal@absl@@CAHAEBC@Z + ??$ToIntVal@D@FormatArgImpl@str_format_internal@absl@@CAHAEBD@Z + ??$ToIntVal@E@FormatArgImpl@str_format_internal@absl@@CAHAEBE@Z + ??$ToIntVal@F@FormatArgImpl@str_format_internal@absl@@CAHAEBF@Z + ??$ToIntVal@G@FormatArgImpl@str_format_internal@absl@@CAHAEBG@Z + ??$ToIntVal@H@FormatArgImpl@str_format_internal@absl@@CAHAEBH@Z + ??$ToIntVal@I@FormatArgImpl@str_format_internal@absl@@CAHAEBI@Z + ??$ToIntVal@J@FormatArgImpl@str_format_internal@absl@@CAHAEBJ@Z + ??$ToIntVal@K@FormatArgImpl@str_format_internal@absl@@CAHAEBK@Z + ??$ToIntVal@_J@FormatArgImpl@str_format_internal@absl@@CAHAEB_J@Z + ??$ToIntVal@_K@FormatArgImpl@str_format_internal@absl@@CAHAEB_K@Z + ??$ToIntVal@_N@FormatArgImpl@str_format_internal@absl@@CAHAEB_N@Z + ??$TrailingZeros@_K@container_internal@absl@@YAI_K@Z + ??$TransferNRelocatable@$0BI@@container_internal@absl@@YAXPEAX00_K@Z + ??$TryFindNewIndexWithoutProbing@X@container_internal@absl@@YA_K_K00PEAW4ctrl_t@01@0@Z + ??$TypeErasedApplyToSlotFn@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@YA_KPEBXPEAX_K@Z + ??$UnhidePtr@X@base_internal@absl@@YAPEAX_K@Z + ??$Unparse@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@@Z + ??$UnparseFlag@H@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBH@Z + ??$UnparseFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@@Z + ??$UnparseFloatingPointVal@M@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@M@Z + ??$UnparseFloatingPointVal@N@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z + ??$__add_alignment_assumption@PEAPEAVCommandLineFlag@absl@@$0A@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAPEAPEAVCommandLineFlag@absl@@PEAPEAV34@@Z + ??$__add_alignment_assumption@PEAPEAVCordzHandle@cord_internal@absl@@$0A@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV345@@Z + ??$__add_alignment_assumption@PEAPEAVLogSink@absl@@$0A@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@CAPEAPEAVLogSink@absl@@PEAPEAV34@@Z + ??$__add_alignment_assumption@PEAPEBVCommandLineFlag@absl@@$0A@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAPEAPEBVCommandLineFlag@absl@@PEAPEBV34@@Z + ??$__add_alignment_assumption@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$0A@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@CAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU3456@@Z + ??$__add_alignment_assumption@PEAUTransition@cctz@time_internal@absl@@$0A@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAPEAUTransition@cctz@time_internal@absl@@PEAU3456@@Z + ??$__add_alignment_assumption@PEAUTransitionType@cctz@time_internal@absl@@$0A@@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAPEAUTransitionType@cctz@time_internal@absl@@PEAU3456@@Z + ??$__add_alignment_assumption@PEAUUnrecognizedFlag@absl@@$0A@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@CAPEAUUnrecognizedFlag@absl@@PEAU34@@Z + ??$__add_alignment_assumption@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@$0A@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@CAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@PEAV312@@Z + ??$__advance@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAXAEAPEBUTransition@cctz@time_internal@absl@@_JUrandom_access_iterator_tag@01@@Z + ??$__advance@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@_JUrandom_access_iterator_tag@01@@Z + ??$__advance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@_JUrandom_access_iterator_tag@01@@Z + ??$__advance@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@_JUrandom_access_iterator_tag@01@@Z + ??$__allocate_at_least@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@PEAVCommandLineFlag@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@PEAVLogSink@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@PEBVCommandLineFlag@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@UUnrecognizedFlag@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@_K@Z + ??$__allocator_destroy@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@PEAU45@@__Cr@std@@YAXAEAV?$allocator@UUnrecognizedFlag@absl@@@01@PEAUUnrecognizedFlag@absl@@1@Z + ??$__annotate_contiguous_container@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_double_ended_contiguous_container@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX00000@Z + ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z + ??$__as_transparent@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@01@AEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@01@@Z + ??$__as_transparent@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@01@AEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@01@@Z + ??$__as_variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@YAAEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@01@AEAV201@@Z + ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z + ??$__at@P6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03$$V@__base@__visitation@__variant_detail@__Cr@std@@CA$$QEA_PAEBU?$__farray@P6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03@34@_K@Z + ??$__at@P6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z@__base@__visitation@__variant_detail@__Cr@std@@CAAEBQ6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@1234@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@ZAEBQ6A_K01@Z@Z + ??$__call@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@?$__invoke_void_return_wrapper@X$00@__Cr@std@@SAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@7@@Z + ??$__call_func@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@CAXPEBT__policy_storage@123@AEAVCommandLineFlag@absl@@@Z + ??$__constexpr_memmove@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0W4__element_count@01@@Z + ??$__constexpr_memmove@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@0W4__element_count@01@@Z + ??$__constexpr_memmove@PEAVLogSink@absl@@PEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0W4__element_count@01@@Z + ??$__constexpr_memmove@UPrefixCrc@CrcCordState@crc_internal@absl@@$$CBU1234@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@PEBU2345@W4__element_count@01@@Z + ??$__constexpr_memmove@UTransition@cctz@time_internal@absl@@U1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@0W4__element_count@01@@Z + ??$__constexpr_memmove@UTransitionType@cctz@time_internal@absl@@U1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@0W4__element_count@01@@Z + ??$__construct_at@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEBV12345@PEAPEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@AEAPEAPEBV23456@@Z + ??$__construct_at@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@PEAPEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@$$QEAPEAPEBV23456@@Z + ??$__construct_at@PEAUCordRep@cord_internal@absl@@AEBQEAU123@PEAPEAU123@@__Cr@std@@YAPEAPEAUCordRep@cord_internal@absl@@PEAPEAU234@AEBQEAU234@@Z + ??$__construct_at@PEAUCordRep@cord_internal@absl@@PEAU123@PEAPEAU123@@__Cr@std@@YAPEAPEAUCordRep@cord_internal@absl@@PEAPEAU234@$$QEAPEAU234@@Z + ??$__construct_at@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAPEAU1234@PEAPEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@AEAPEAU2345@@Z + ??$__construct_at@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@PEAPEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@$$QEAPEAU2345@@Z + ??$__construct_at@PEAVCommandLineFlag@absl@@AEBQEAV12@PEAPEAV12@@__Cr@std@@YAPEAPEAVCommandLineFlag@absl@@PEAPEAV23@AEBQEAV23@@Z + ??$__construct_at@PEAVCordzHandle@cord_internal@absl@@AEBQEAV123@PEAPEAV123@@__Cr@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV234@AEBQEAV234@@Z + ??$__construct_at@PEAVLogSink@absl@@AEBQEAV12@PEAPEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@AEBQEAV23@@Z + ??$__construct_at@PEAVLogSink@absl@@PEAV12@PEAPEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@$$QEAPEAV23@@Z + ??$__construct_at@PEBUCordRep@cord_internal@absl@@AEBQEBU123@PEAPEBU123@@__Cr@std@@YAPEAPEBUCordRep@cord_internal@absl@@PEAPEBU234@AEBQEBU234@@Z + ??$__construct_at@PEBVCommandLineFlag@absl@@AEBQEBV12@PEAPEBV12@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@AEBQEBV23@@Z + ??$__construct_at@PEBVCommandLineFlag@absl@@PEBV12@PEAPEBV12@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@$$QEAPEBV23@@Z + ??$__construct_at@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@PEAPEBV123@@__Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@AEBQEBV234@@Z + ??$__construct_at@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@PEAPEBV12345@@__Cr@std@@YAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV23456@AEBQEBV23456@@Z + ??$__construct_at@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@AEBQEBUCordRep@cord_internal@absl@@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@AEBQEBUCordRep@cord_internal@absl@@@Z + ??$__construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$__construct_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@PEAU123@@__Cr@std@@YAPEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@01@@Z + ??$__construct_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@PEAU123@@__Cr@std@@YAPEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@01@@Z + ??$__construct_at@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$__construct_at@UPayload@status_internal@absl@@AEBU123@PEAU123@@__Cr@std@@YAPEAUPayload@status_internal@absl@@PEAU234@AEBU234@@Z + ??$__construct_at@UPayload@status_internal@absl@@U123@PEAU123@@__Cr@std@@YAPEAUPayload@status_internal@absl@@PEAU234@$$QEAU234@@Z + ??$__construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@AEBU1234@PEAU1234@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@AEBU2345@@Z + ??$__construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@HVcrc32c_t@4@PEAU1234@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@$$QEAH$$QEAVcrc32c_t@5@@Z + ??$__construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$__construct_at@UTransition@cctz@time_internal@absl@@$$VPEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z + ??$__construct_at@UTransition@cctz@time_internal@absl@@AEBU1234@PEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@AEBU2345@@Z + ??$__construct_at@UTransition@cctz@time_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$__construct_at@UTransitionType@cctz@time_internal@absl@@$$VPEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z + ??$__construct_at@UTransitionType@cctz@time_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$__construct_at@UUnrecognizedFlag@absl@@AEBU12@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@AEBU23@@Z + ??$__construct_at@UUnrecognizedFlag@absl@@U12@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAU23@@Z + ??$__construct_at@UUnrecognizedFlag@absl@@W4Source@12@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAW4Source@23@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z + ??$__construct_at@UViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@AEA_KPEAU123@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV501@AEA_K@Z + ??$__construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$__construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$__construct_at@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@PEAV123@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@PEAV201@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV567@@Z@@Z + ??$__construct_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@PEAV123@@__Cr@std@@YAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PEAV201@$$QEAV201@@Z + ??$__construct_at@VFormatArgImpl@str_format_internal@absl@@AEBV123@PEAV123@@__Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@AEBV234@@Z + ??$__construct_at_end@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@0_K@Z + ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@?$__split_buffer@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z + ??$__construct_node@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__construct_node@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__construct_node_hash@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBQEBUCordRep@cord_internal@absl@@@Z + ??$__construct_node_hash@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__copy@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@PEAU1234@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0PEAU3456@@Z + ??$__copy@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z + ??$__copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z + ??$__copy_backward_trivial_impl@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__copy_backward_trivial_impl@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__copy_backward_trivial_impl@UTransition@cctz@time_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__copy_backward_trivial_impl@UTransitionType@cctz@time_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@PEAPEAPEBV45678@$0A@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@PEAPEAU4567@$0A@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@PEAU4567@$0A@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@PEAU4567@$0A@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@PEAPEAPEBV45678@$0A@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@PEAPEAU4567@$0A@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAPEAVLogSink@absl@@PEAPEAV45@PEAPEAV45@$0A@@__Cr@std@@YA?AU?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@01@PEAPEAVLogSink@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@PEAU4567@$0A@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@PEAU4567@$0A@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U__copy_impl@__Cr@std@@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU4567@PEAU4567@$0A@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0PEAU3456@@Z + ??$__copy_move_unwrap_iters@U__copy_impl@__Cr@std@@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU4567@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@$0A@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z + ??$__copy_move_unwrap_iters@U__copy_impl@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@V423@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@$0A@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z + ??$__copy_trivial_impl@$$CBUPrefixCrc@CrcCordState@crc_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0PEAU3456@@Z + ??$__copy_trivial_impl@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__copy_trivial_impl@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__copy_trivial_impl@PEAVLogSink@absl@@PEAV12@@__Cr@std@@YA?AU?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@01@PEAPEAVLogSink@absl@@00@Z + ??$__copy_trivial_impl@UTransition@cctz@time_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__copy_trivial_impl@UTransitionType@cctz@time_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__create@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@__policy@__function@__Cr@std@@SAPEBU0123@XZ + ??$__cxx_atomic_compare_exchange_strong@PEAUArena@LowLevelAlloc@base_internal@absl@@@__Cr@std@@YA_NPEAU?$__cxx_atomic_base_impl@PEAUArena@LowLevelAlloc@base_internal@absl@@@01@PEAPEAUArena@LowLevelAlloc@base_internal@absl@@PEAU3456@W4memory_order@01@3@Z + ??$__cxx_atomic_compare_exchange_strong@PEAVTimeZone@absl@@@__Cr@std@@YA_NPEAU?$__cxx_atomic_base_impl@PEAVTimeZone@absl@@@01@PEAPEAVTimeZone@absl@@PEAV34@W4memory_order@01@3@Z + ??$__cxx_atomic_compare_exchange_strong@PEAVVLogSite@log_internal@absl@@@__Cr@std@@YA_NPEAU?$__cxx_atomic_base_impl@PEAVVLogSite@log_internal@absl@@@01@PEAPEAVVLogSite@log_internal@absl@@PEAV345@W4memory_order@01@3@Z + ??$__cxx_atomic_compare_exchange_weak@PEAUHashtablezInfo@container_internal@absl@@@__Cr@std@@YA_NPEAU?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@01@PEAPEAUHashtablezInfo@container_internal@absl@@PEAU345@W4memory_order@01@3@Z + ??$__cxx_atomic_compare_exchange_weak@PEAVVLogSite@log_internal@absl@@@__Cr@std@@YA_NPEAU?$__cxx_atomic_base_impl@PEAVVLogSite@log_internal@absl@@@01@PEAPEAVVLogSite@log_internal@absl@@PEAV345@W4memory_order@01@3@Z + ??$__cxx_atomic_exchange@PEAVVLogSite@log_internal@absl@@@__Cr@std@@YAPEAVVLogSite@log_internal@absl@@PEAU?$__cxx_atomic_base_impl@PEAVVLogSite@log_internal@absl@@@01@PEAV234@W4memory_order@01@@Z + ??$__cxx_atomic_load@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__Cr@std@@YAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZPEBU?$__cxx_atomic_base_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAUArena@LowLevelAlloc@base_internal@absl@@@__Cr@std@@YAPEAUArena@LowLevelAlloc@base_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAUArena@LowLevelAlloc@base_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAUHashtablezInfo@container_internal@absl@@@__Cr@std@@YAPEAUHashtablezInfo@container_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPEAVCordzHandle@cord_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAVCordzHandle@cord_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAVCordzInfo@cord_internal@absl@@@__Cr@std@@YAPEAVCordzInfo@cord_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAVTimeZone@absl@@@__Cr@std@@YAPEAVTimeZone@absl@@PEBU?$__cxx_atomic_base_impl@PEAVTimeZone@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAVVLogSite@log_internal@absl@@@__Cr@std@@YAPEAVVLogSite@log_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAVVLogSite@log_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@VMaskedPointer@flags_internal@absl@@@__Cr@std@@YA?AVMaskedPointer@flags_internal@absl@@PEBU?$__cxx_atomic_base_impl@VMaskedPointer@flags_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@W4OnDeadlockCycle@absl@@@__Cr@std@@YA?AW4OnDeadlockCycle@absl@@PEBU?$__cxx_atomic_base_impl@W4OnDeadlockCycle@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@W4State@PerThreadSynch@base_internal@absl@@@__Cr@std@@YA?AW4State@PerThreadSynch@base_internal@absl@@PEBU?$__cxx_atomic_base_impl@W4State@PerThreadSynch@base_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_store@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXPEAU?$__cxx_atomic_base_impl@PEAVCordzHandle@cord_internal@absl@@@01@PEAVCordzHandle@cord_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@PEAVCordzInfo@cord_internal@absl@@@__Cr@std@@YAXPEAU?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@01@PEAVCordzInfo@cord_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@PEAVVLogSite@log_internal@absl@@@__Cr@std@@YAXPEAU?$__cxx_atomic_base_impl@PEAVVLogSite@log_internal@absl@@@01@PEAVVLogSite@log_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@VMaskedPointer@flags_internal@absl@@@__Cr@std@@YAXPEAU?$__cxx_atomic_base_impl@VMaskedPointer@flags_internal@absl@@@01@VMaskedPointer@flags_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@W4OnDeadlockCycle@absl@@@__Cr@std@@YAXPEAU?$__cxx_atomic_base_impl@W4OnDeadlockCycle@absl@@@01@W4OnDeadlockCycle@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@W4State@PerThreadSynch@base_internal@absl@@@__Cr@std@@YAXPEAU?$__cxx_atomic_base_impl@W4State@PerThreadSynch@base_internal@absl@@@01@W4State@PerThreadSynch@base_internal@absl@@W4memory_order@01@@Z + ??$__debug_randomize_range@U_ClassicAlgPolicy@__Cr@std@@PEAPEAVCommandLineFlag@absl@@PEAPEAV45@@__Cr@std@@YAXPEAPEAVCommandLineFlag@absl@@0@Z + ??$__debug_randomize_range@U_ClassicAlgPolicy@__Cr@std@@PEAPEBVCommandLineFlag@absl@@PEAPEBV45@@__Cr@std@@YAXPEAPEBVCommandLineFlag@absl@@0@Z + ??$__debug_randomize_range@U_ClassicAlgPolicy@__Cr@std@@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@V423@@__Cr@std@@YAXV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@0@Z + ??$__debug_randomize_range@U_ClassicAlgPolicy@__Cr@std@@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@23@V423@@__Cr@std@@YAXV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@0@Z + ??$__destroy_at@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@$0A@@__Cr@std@@YAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$__destroy_at@PEAUCordRep@cord_internal@absl@@$0A@@__Cr@std@@YAXPEAPEAUCordRep@cord_internal@absl@@@Z + ??$__destroy_at@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$0A@@__Cr@std@@YAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$__destroy_at@PEAVCommandLineFlag@absl@@$0A@@__Cr@std@@YAXPEAPEAVCommandLineFlag@absl@@@Z + ??$__destroy_at@PEAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@YAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ??$__destroy_at@PEAVLogSink@absl@@$0A@@__Cr@std@@YAXPEAPEAVLogSink@absl@@@Z + ??$__destroy_at@PEBUCordRep@cord_internal@absl@@$0A@@__Cr@std@@YAXPEAPEBUCordRep@cord_internal@absl@@@Z + ??$__destroy_at@PEBVCommandLineFlag@absl@@$0A@@__Cr@std@@YAXPEAPEBVCommandLineFlag@absl@@@Z + ??$__destroy_at@PEBVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@YAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ??$__destroy_at@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@@Z + ??$__destroy_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@@Z + ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@@Z + ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@@Z + ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@@Z + ??$__destroy_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@@Z + ??$__destroy_at@UConversionItem@ParsedFormatBase@str_format_internal@absl@@$0A@@__Cr@std@@YAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ??$__destroy_at@UPayload@status_internal@absl@@$0A@@__Cr@std@@YAXPEAUPayload@status_internal@absl@@@Z + ??$__destroy_at@UPrefixCrc@CrcCordState@crc_internal@absl@@$0A@@__Cr@std@@YAXPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$__destroy_at@UTransition@cctz@time_internal@absl@@$0A@@__Cr@std@@YAXPEAUTransition@cctz@time_internal@absl@@@Z + ??$__destroy_at@UTransitionType@cctz@time_internal@absl@@$0A@@__Cr@std@@YAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ??$__destroy_at@UUnrecognizedFlag@absl@@$0A@@__Cr@std@@YAXPEAUUnrecognizedFlag@absl@@@Z + ??$__destroy_at@UViableSubstitution@strings_internal@absl@@$0A@@__Cr@std@@YAXPEAUViableSubstitution@strings_internal@absl@@@Z + ??$__destroy_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@$0A@@__Cr@std@@YAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$00@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$01@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$02@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$0A@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__distance@PEBUPayload@status_internal@absl@@$0A@@__Cr@std@@YA_JPEBUPayload@status_internal@absl@@0@Z + ??$__distance@PEBUTransition@cctz@time_internal@absl@@$0A@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0@Z + ??$__distance@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0@Z + ??$__distance@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@0@Z + ??$__distance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@0@Z + ??$__distance@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@0@Z + ??$__distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z + ??$__do_rehash@$00@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAX_K@Z + ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z + ??$__emplace_back_assume_capacity@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??$__emplace_back_assume_capacity@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??$__emplace_back_assume_capacity@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV312@AEA_K@Z + ??$__emplace_back_assume_capacity@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEAVCommandLineFlag@absl@@@Z + ??$__emplace_back_assume_capacity@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z + ??$__emplace_back_assume_capacity@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEAVLogSink@absl@@@Z + ??$__emplace_back_assume_capacity@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEBVCommandLineFlag@absl@@@Z + ??$__emplace_back_assume_capacity@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z + ??$__emplace_back_assume_capacity@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBUTransition@cctz@time_internal@absl@@@Z + ??$__emplace_back_assume_capacity@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBUUnrecognizedFlag@absl@@@Z + ??$__emplace_back_assume_capacity@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEBVCommandLineFlag@absl@@@Z + ??$__emplace_back_assume_capacity@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ??$__emplace_back_assume_capacity@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAX$$QEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@@Z + ??$__emplace_back_assume_capacity@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAW4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$__emplace_back_slow_path@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV612@AEA_K@Z + ??$__emplace_back_slow_path@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEAVCommandLineFlag@absl@@AEBQEAV34@@Z + ??$__emplace_back_slow_path@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV345@@Z + ??$__emplace_back_slow_path@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEAVLogSink@absl@@AEBQEAV34@@Z + ??$__emplace_back_slow_path@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEBVCommandLineFlag@absl@@AEBQEBV34@@Z + ??$__emplace_back_slow_path@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV345@@Z + ??$__emplace_back_slow_path@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEBU3456@@Z + ??$__emplace_back_slow_path@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@AEBU34@@Z + ??$__emplace_back_slow_path@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEBVCommandLineFlag@absl@@$$QEAPEBV34@@Z + ??$__emplace_back_slow_path@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU3456@@Z + ??$__emplace_back_slow_path@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QEAV312@@Z + ??$__emplace_back_slow_path@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@$$QEAW4Source@34@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBQEBUCordRep@cord_internal@absl@@@Z + ??$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__find@PEAVLogSink@absl@@PEAV12@U__identity@__Cr@std@@$0A@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0AEBQEAV23@AEAU__identity@01@@Z + ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@__Cr@std@@AEAPEAV?$__tree_node_base@PEAX@23@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@__Cr@std@@AEAPEAV?$__tree_node_base@PEAX@23@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__find_loop@PEAPEAVLogSink@absl@@PEAPEAV12@PEAV12@U__identity@__Cr@std@@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0AEBQEAV23@AEAU__identity@01@@Z + ??$__for_each_segment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@23@@__Cr@std@@YAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@01@@Z + ??$__get_alt@$00AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__get_alt@$01AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__get_alt@$02AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__get_alt@$0A@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__get_alt@AEAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$00@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$00@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$01@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$01@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$0A@@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$01V?$Span@$$CBD@absl@@V?$variant@IHM@__Cr@std@@@__variant_detail@__Cr@std@@$00@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$01V?$Span@$$CBD@absl@@V?$variant@IHM@__Cr@std@@@234@U?$in_place_index_t@$00@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$01V?$Span@$$CBD@absl@@V?$variant@IHM@__Cr@std@@@__variant_detail@__Cr@std@@@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$01V?$Span@$$CBD@absl@@V?$variant@IHM@__Cr@std@@@234@U?$in_place_index_t@$0A@@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$00@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$00@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$01@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$01@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$02@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$02@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$0A@@34@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@AEBV834@AEA_K@Z@V@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@234@QEAAAEAU567@012@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@01@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV701@AEA_K@Z@V@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@301@QEAAAEAU456@123@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV56@@Z@V@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@234@QEAAAEAPEAV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@01@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@V@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@301@QEAAAEAPEAV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV567@@Z@V@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@234@QEAAAEAPEAV567@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@01@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@V@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@301@QEAAAEAPEAV456@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV56@@Z@V@?0???$emplace_back@AEBQEAVLogSink@absl@@@234@QEAAAEAPEAV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@01@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@V@?0???$emplace_back@AEBQEAVLogSink@absl@@@301@QEAAAEAPEAV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV56@@Z@V@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@234@QEAAAEAPEBV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@01@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@V@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@301@QEAAAEAPEBV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV567@@Z@V@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@234@QEAAAEAPEBV567@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@01@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@V@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@301@QEAAAEAPEBV456@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU5678@@Z@V@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@234@QEAAAEAU5678@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@01@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@V@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@301@QEAAAEAU4567@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU56@@Z@V@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@234@QEAAAEAU56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@QEAAAEAUUnrecognizedFlag@absl@@AEBU45@@Z@V@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@301@QEAAAEAU45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV56@@Z@V@?0???$emplace_back@PEBVCommandLineFlag@absl@@@234@QEAAAEAPEBV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@01@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@V@?0???$emplace_back@PEBVCommandLineFlag@absl@@@301@QEAAAEAPEBV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU5678@@Z@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@234@QEAAAEAU5678@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@01@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@301@QEAAAEAU4567@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@34@$$QEAV534@@Z@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@234@QEAAAEAV534@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@01@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@$$QEAV401@@Z@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@301@QEAAAEAV401@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@56@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@234@QEAAAEAU56@01@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@301@QEAAAEAU45@12@Z@@Z + ??$__in_bounds@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@$0A@@__unique_ptr_array_bounds_stateless@__Cr@std@@QEBA_NPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@_K@Z + ??$__in_bounds@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@$0A@@__unique_ptr_array_bounds_stateless@__Cr@std@@QEBA_NPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@_K@Z + ??$__insert_assign_n_unchecked@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@_JPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$__insert_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@1_J@Z + ??$__invoke@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K@__Cr@std@@YA_KAEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QEA_K@Z + ??$__invoke@AEAUByCivilTime@Transition@cctz@time_internal@absl@@AEBU2345@AEBU2345@@__Cr@std@@YA_NAEAUByCivilTime@Transition@cctz@time_internal@absl@@AEBU3456@1@Z + ??$__invoke@AEAUByUnixTime@Transition@cctz@time_internal@absl@@AEBU2345@AEBU2345@@__Cr@std@@YA_NAEAUByUnixTime@Transition@cctz@time_internal@absl@@AEBU3456@1@Z + ??$__invoke@AEAU__identity@__Cr@std@@AEAPEAVLogSink@absl@@@__Cr@std@@YAAEAPEAVLogSink@absl@@AEAU__identity@01@AEAPEAV23@@Z + ??$__invoke@AEAU__identity@__Cr@std@@AEAPEBVCommandLineFlag@absl@@@__Cr@std@@YAAEAPEBVCommandLineFlag@absl@@AEAU__identity@01@AEAPEBV23@@Z + ??$__invoke@AEAU__identity@__Cr@std@@AEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAAEBUTransition@cctz@time_internal@absl@@AEAU__identity@01@AEBU2345@@Z + ??$__invoke@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@__Cr@std@@YAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@6@@Z + ??$__invoke@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@__Cr@std@@YAX$$QEAP8FlagImpl@flags_internal@absl@@EAAXXZ$$QEAPEAV234@@Z + ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@456@@__Cr@std@@YA_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AEAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@501@@Z + ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAU?$__alt@$01V?$Span@$$CBD@absl@@@456@@__Cr@std@@YA_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AEAU?$__alt@$01V?$Span@$$CBD@absl@@@501@@Z + ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAU?$__alt@$02V?$variant@IHM@__Cr@std@@@456@@__Cr@std@@YA_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AEAU?$__alt@$02V?$variant@IHM@__Cr@std@@@501@@Z + ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAU?$__alt@$0A@V?$variant@_K_JIH_N@__Cr@std@@@456@@__Cr@std@@YA_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AEAU?$__alt@$0A@V?$variant@_K_JIH_N@__Cr@std@@@501@@Z + ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$Span@$$CBD@4@@__Cr@std@@YA_K$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@45@@Z@AEAV?$Span@$$CBD@5@@Z + ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@IHM@__Cr@std@@@__Cr@std@@YA_K$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@45@@Z@AEAV?$variant@IHM@01@@Z + ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@_K_JIH_N@__Cr@std@@@__Cr@std@@YA_K$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@45@@Z@AEAV?$variant@_K_JIH_N@01@@Z + ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@_K_JN@__Cr@std@@@__Cr@std@@YA_K$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@45@@Z@AEAV?$variant@_K_JN@01@@Z + ??$__invoke_r@XAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@__Cr@std@@YAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@6@@Z + ??$__is_null@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@__function@__Cr@std@@YA_NAEBV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@Z + ??$__iter_move@AEAPEAPEAVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEAVCommandLineFlag@absl@@AEAPEAPEAV34@@Z + ??$__iter_move@AEAPEAPEBVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEBVCommandLineFlag@absl@@AEAPEAPEBV34@@Z + ??$__iter_move@PEAPEAVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEAVCommandLineFlag@absl@@$$QEAPEAPEAV34@@Z + ??$__iter_move@PEAPEBVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEBVCommandLineFlag@absl@@$$QEAPEAPEBV34@@Z + ??$__libcpp_allocate@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEAUCordRep@cord_internal@absl@@@__Cr@std@@YAPEAPEAUCordRep@cord_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEAVCommandLineFlag@absl@@@__Cr@std@@YAPEAPEAVCommandLineFlag@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEAVLogSink@absl@@@__Cr@std@@YAPEAPEAVLogSink@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEBVCommandLineFlag@absl@@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@YAPEAU?$AlignedType@$07@container_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_allocate@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@YAPEAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@34@PEBXPEAX2@Z@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UPayload@status_internal@absl@@@__Cr@std@@YAPEAUPayload@status_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UTransition@cctz@time_internal@absl@@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UUnrecognizedFlag@absl@@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_allocate@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_allocate@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@W4__element_count@01@_K@Z + ??$__libcpp_allocate@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAUCordRep@cord_internal@absl@@@__Cr@std@@YAXPEAPEAUCordRep@cord_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAVCommandLineFlag@absl@@@__Cr@std@@YAXPEAPEAVCommandLineFlag@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXPEAPEAVCordzHandle@cord_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAVLogSink@absl@@@__Cr@std@@YAXPEAPEAVLogSink@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEBVCommandLineFlag@absl@@@__Cr@std@@YAXPEAPEBVCommandLineFlag@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXPEAPEBVCordzHandle@cord_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAXPEAPEBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@YAXPEAU?$AlignedType@$07@container_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@YAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@YAXPEAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@34@PEBXPEAX2@Z@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UPayload@status_internal@absl@@@__Cr@std@@YAXPEAUPayload@status_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAXPEAUPrefixCrc@CrcCordState@crc_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UTransition@cctz@time_internal@absl@@@__Cr@std@@YAXPEAUTransition@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAXPEAUTransitionType@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UUnrecognizedFlag@absl@@@__Cr@std@@YAXPEAUUnrecognizedFlag@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXPEAUViableSubstitution@strings_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAXPEAVFormatArgImpl@str_format_internal@absl@@W4__element_count@01@_K@Z + ??$__lower_bound@U_ClassicAlgPolicy@__Cr@std@@PEBUTransition@cctz@time_internal@absl@@PEBU4567@U4567@U__identity@23@UByUnixTime@4567@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@AEAUByUnixTime@2345@AEAU__identity@01@@Z + ??$__lower_bound_bisecting@U_ClassicAlgPolicy@__Cr@std@@PEBUTransition@cctz@time_internal@absl@@U4567@U__identity@23@UByUnixTime@4567@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@AEBU2345@_JAEAUByUnixTime@2345@AEAU__identity@01@@Z + ??$__make_exception_guard@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@__Cr@std@@YA?AU?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@01@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@01@AEAAX_K@Z@@Z + ??$__make_exception_guard@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@01@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@01@@Z + ??$__make_value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@CA?A_P$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@78@@Z@@Z + ??$__memberwise_forward_assign@V?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@V?$tuple@PEAVCommandLineFlag@absl@@_N@23@PEAVCommandLineFlag@absl@@_N$$Z$0A@$00@__Cr@std@@YAXAEAV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@$$QEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@U?$__tuple_types@PEAVCommandLineFlag@absl@@_N@01@U?$__integer_sequence@_K$0A@$00@01@@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@PEAPEAPEBV45678@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@PEAPEAU4567@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PEAPEAVLogSink@absl@@PEAPEAV45@PEAPEAV45@@__Cr@std@@YA?AU?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@01@PEAPEAVLogSink@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@PEAU4567@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@PEAU4567@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@PEAPEAPEBV45678@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@PEAPEAU4567@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@PEAU4567@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@PEAU4567@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__rehash@$00@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAX_K@Z + ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z + ??$__rewrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@U?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0@Z + ??$__rewrap_iter@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@U?$__unwrap_iter_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@0@Z + ??$__rewrap_iter@PEAPEAVLogSink@absl@@PEAPEAV12@U?$__unwrap_iter_impl@PEAPEAVLogSink@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0@Z + ??$__rewrap_iter@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@U?$__unwrap_iter_impl@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@0@Z + ??$__rewrap_iter@PEAUTransition@cctz@time_internal@absl@@PEAU1234@U?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@0@Z + ??$__rewrap_iter@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@U?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@0@Z + ??$__rewrap_iter@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@U?$__unwrap_iter_impl@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU2345@0@Z + ??$__rewrap_iter@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@V123@U?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V201@0@Z + ??$__rewrap_iter@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@U?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@V201@0@Z + ??$__rewrap_iter@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@U?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@$00@23@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@01@V201@PEAPEAVLogSink@absl@@@Z + ??$__rewrap_range@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@PEAPEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0@Z + ??$__rewrap_range@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@PEAPEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@0@Z + ??$__rewrap_range@PEAPEAVLogSink@absl@@PEAPEAV12@PEAPEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0@Z + ??$__rewrap_range@PEAUTransition@cctz@time_internal@absl@@PEAU1234@PEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@0@Z + ??$__rewrap_range@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@PEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@0@Z + ??$__rewrap_range@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@PEBU1234@@__Cr@std@@YAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU2345@0@Z + ??$__rewrap_range@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@V123@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@V201@0@Z + ??$__std_visit_exhaustive_visitor_check@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$Span@$$CBD@4@@__variant@__visitation@__variant_detail@__Cr@std@@CAXXZ + ??$__std_visit_exhaustive_visitor_check@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@IHM@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@CAXXZ + ??$__std_visit_exhaustive_visitor_check@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@_K_JIH_N@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@CAXXZ + ??$__std_visit_exhaustive_visitor_check@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@_K_JN@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@CAXXZ + ??$__swap_allocator@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$allocator@UUnrecognizedFlag@absl@@@01@0@Z + ??$__swap_allocator@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$allocator@UUnrecognizedFlag@absl@@@01@0U?$integral_constant@_N$0A@@01@@Z + ??$__swap_bitmap_pos@U_ClassicAlgPolicy@__Cr@std@@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@YAXPEAPEAVCommandLineFlag@absl@@0AEA_K1@Z + ??$__swap_bitmap_pos@U_ClassicAlgPolicy@__Cr@std@@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@YAXPEAPEBVCommandLineFlag@absl@@0AEA_K1@Z + ??$__swap_bitmap_pos_within@U_ClassicAlgPolicy@__Cr@std@@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEAPEAVCommandLineFlag@absl@@0AEA_K1@Z + ??$__swap_bitmap_pos_within@U_ClassicAlgPolicy@__Cr@std@@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEAPEBVCommandLineFlag@absl@@0AEA_K1@Z + ??$__throw_if_valueless@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@@__Cr@std@@YAXAEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@01@@Z + ??$__to_address@$$CBUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU2345@@Z + ??$__to_address@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@@Z + ??$__to_address@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@PEAPEAU201@@Z + ??$__to_address@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@PEAPEAU201@@Z + ??$__to_address@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@@Z + ??$__to_address@PEAVCommandLineFlag@absl@@@__Cr@std@@YAPEAPEAVCommandLineFlag@absl@@PEAPEAV23@@Z + ??$__to_address@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV234@@Z + ??$__to_address@PEAVLogSink@absl@@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@@Z + ??$__to_address@PEBVCommandLineFlag@absl@@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@@Z + ??$__to_address@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@@Z + ??$__to_address@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@@Z + ??$__to_address@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@@Z + ??$__to_address@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU2345@@Z + ??$__to_address@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@@Z + ??$__to_address@UTransition@cctz@time_internal@absl@@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z + ??$__to_address@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z + ??$__to_address@UUnrecognizedFlag@absl@@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@@Z + ??$__to_address@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@@Z + ??$__to_address@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@YAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV456@@Z@PEAU2?1???R3456@QEBA?AV701@0@Z@@Z + ??$__to_address@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAPEAPEAVCommandLineFlag@absl@@AEBV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@@Z + ??$__to_address@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@$0A@@__Cr@std@@YAPEAPEAVLogSink@absl@@AEBV?$__wrap_iter@PEAPEAVLogSink@absl@@@01@@Z + ??$__to_address@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@AEBV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@@Z + ??$__to_address@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV456@@Z@AEBV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@@Z + ??$__to_address@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PEAV201@@Z + ??$__try_key_extraction@PEBUCordRep@cord_internal@absl@@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@67@AEBQEBU123@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@567@QEAA?AU867@0@Z@AEBQEBU123@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@01@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@01@QEAA?AU201@AEBQEBUCordRep@cord_internal@absl@@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@401@QEAA?AU201@0@Z@0@Z + ??$__try_key_extraction@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@23@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@523@QEAA?AU623@012@Z@AEBU723@V823@V923@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@401@QEAA?AU201@012@Z@012@Z + ??$__try_key_extraction@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@523@QEAA?AU623@012@Z@AEBU723@V823@V923@@__Cr@std@@YA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@401@QEAA?AU201@012@Z@012@Z + ??$__try_key_extraction_impl@PEBUCordRep@cord_internal@absl@@U?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@56@QEAA?AU456@AEBQEBU123@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@856@QEAA?AU456@0@Z@AEBQEBU123@$0A@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@01@QEAA?AU201@AEBQEBUCordRep@cord_internal@absl@@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@501@QEAA?AU201@1@Z@1@Z + ??$__try_key_extraction_impl@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@23@QEAA?AU423@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@623@QEAA?AU423@012@Z@AEBU723@V823@V923@$0A@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@501@QEAA?AU201@123@Z@123@Z + ??$__try_key_extraction_impl@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@QEAA?AU423@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@623@QEAA?AU423@012@Z@AEBU723@V823@V923@$0A@@__Cr@std@@YA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@501@QEAA?AU201@123@Z@123@Z + ??$__uninitialized_allocator_copy@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@V423@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@1PEAV201@@Z + ??$__uninitialized_allocator_copy_impl@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@PEAU4?1???R5678@QEBA?AV923@0@Z@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV567@@Z@2PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@YAXAEAV?$allocator@PEAVCommandLineFlag@absl@@@01@PEAPEAVCommandLineFlag@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@PEAPEAVCordzHandle@cord_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@__Cr@std@@YAXAEAV?$allocator@PEAVLogSink@absl@@@01@PEAPEAVLogSink@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@YAXAEAV?$allocator@PEBVCommandLineFlag@absl@@@01@PEAPEBVCommandLineFlag@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@PEAPEBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@PEAPEBVCordzHandle@cord_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@YAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PEAUTransition@cctz@time_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PEAUTransitionType@cctz@time_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@YAXAEAV?$allocator@UUnrecognizedFlag@absl@@@01@PEAUUnrecognizedFlag@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@PEAUViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@PEAUViableSubstitution@strings_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YAXAEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@11@Z + ??$__unwrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@@Z + ??$__unwrap_iter@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$__unwrap_iter_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@@Z + ??$__unwrap_iter@PEAPEAVLogSink@absl@@U?$__unwrap_iter_impl@PEAPEAVLogSink@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@@Z + ??$__unwrap_iter@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$__unwrap_iter_impl@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@@Z + ??$__unwrap_iter@PEAUTransition@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z + ??$__unwrap_iter@PEAUTransitionType@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z + ??$__unwrap_iter@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@U?$__unwrap_iter_impl@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU2345@@Z + ??$__unwrap_iter@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@U?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@$0A@@23@$0A@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V201@@Z + ??$__unwrap_iter@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@U?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@$0A@@23@$0A@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@V201@@Z + ??$__unwrap_iter@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@U?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@$00@23@$0A@@__Cr@std@@YAPEAPEAVCommandLineFlag@absl@@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@@Z + ??$__unwrap_iter@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@U?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@$00@23@$0A@@__Cr@std@@YAPEAPEAVLogSink@absl@@V?$__wrap_iter@PEAPEAVLogSink@absl@@@01@@Z + ??$__unwrap_iter@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@U?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@$00@23@$0A@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@@Z + ??$__unwrap_iter@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@U?$__unwrap_iter_impl@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$00@23@$0A@@__Cr@std@@YAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV456@@Z@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@@Z + ??$__unwrap_range@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@YA?A_PPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$__unwrap_range@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@YA?A_PPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$__unwrap_range@PEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@YA?A_PPEAPEAVLogSink@absl@@0@Z + ??$__unwrap_range@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YA?A_PPEAUTransition@cctz@time_internal@absl@@0@Z + ??$__unwrap_range@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YA?A_PPEAUTransitionType@cctz@time_internal@absl@@0@Z + ??$__unwrap_range@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@@__Cr@std@@YA?A_PPEBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$__unwrap_range@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@@__Cr@std@@YA?A_PV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0@Z + ??$__unwrap_range@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@__Cr@std@@YA?A_PV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@0@Z + ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByCivilTime@2345@$$QEAU__identity@01@@Z + ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByUnixTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByUnixTime@2345@$$QEAU__identity@01@@Z + ??$__validate_iter_reference@AEAPEAPEAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@AEAPEAPEBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@PEAPEAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@PEAPEBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__visit_alt@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__impl@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@1234@AEAV?$__impl@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__visit_alt@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@56@@__variant@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@01234@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@34@@Z + ??$__visit_value@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@78@@Z@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@34@@Z + ??$advance@PEBUTransition@cctz@time_internal@absl@@_J@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z + ??$advance@PEBUTransition@cctz@time_internal@absl@@_J_J$0A@@__Cr@std@@YAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z + ??$advance@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@_J_J$0A@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@_J@Z + ??$advance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@_J@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@12@_J@Z + ??$advance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@_J_J$0A@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@_J@Z + ??$advance@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@_J_J$0A@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@_J@Z + ??$allocate_at_least@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@12@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@12@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAPEAVCommandLineFlag@absl@@_K@12@AEAV?$allocator@PEAVCommandLineFlag@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAPEAVCordzHandle@cord_internal@absl@@_K@12@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAPEAVLogSink@absl@@_K@12@AEAV?$allocator@PEAVLogSink@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAPEBVCommandLineFlag@absl@@_K@12@AEAV?$allocator@PEBVCommandLineFlag@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAPEBVCordzHandle@cord_internal@absl@@_K@12@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@12@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAUTransition@cctz@time_internal@absl@@_K@12@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAUTransitionType@cctz@time_internal@absl@@_K@12@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAUUnrecognizedFlag@absl@@_K@12@AEAV?$allocator@UUnrecognizedFlag@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAUViableSubstitution@strings_internal@absl@@_K@12@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@_K@12@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@_K@Z + ??$apply@U?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA_N$$QEAU?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@12@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@U?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA_N$$QEAU?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@12@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@U?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA_K$$QEAU?$HashElement@UStringHash@container_internal@absl@@$00@12@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@U?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA_K$$QEAU?$HashElement@UStringHash@container_internal@absl@@$00@12@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z + ??$apply@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z + ??$apply@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z + ??$apply@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z + ??$apply@UFindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?AVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QEAUFindElement@412@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@UFindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA?AVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QEAUFindElement@412@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@$0A@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0@Z + ??$begin@V?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@AEAV?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@01@@Z + ??$begin@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@AEAV?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@01@@Z + ??$bit_cast@U?$FlagValueAndInitBit@_N@flags_internal@absl@@_J@__Cr@std@@YA?AU?$FlagValueAndInitBit@_N@flags_internal@absl@@AEB_J@Z + ??$c_begin@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@container_algorithm_internal@absl@@YA?AV?$__wrap_iter@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@AEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@@Z + ??$c_end@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@container_algorithm_internal@absl@@YA?AV?$__wrap_iter@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@AEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@@Z + ??$call_once@A6AXXZ$$V@absl@@YAXAEAVonce_flag@0@A6AXXZ@Z + ??$call_once@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@absl@@YAXAEAVonce_flag@0@$$QEAP8FlagImpl@flags_internal@0@EAAXXZ$$QEAPEAV230@@Z + ??$combine@H$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@AEBH@Z + ??$combine@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$combine@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@Z + ??$combine@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@AEBV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@Z + ??$combine@V?$tuple@AEB_K@__Cr@std@@$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@AEBV?$tuple@AEB_K@__Cr@std@@@Z + ??$combine@_K$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@AEB_K@Z + ??$combine_contiguous@D@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@PEBD_K@Z + ??$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z + ??$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z + ??$construct@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEBV12345@$0A@@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEBV45678@@Z + ??$construct@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@$0A@@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$$QEAPEAPEBV45678@@Z + ??$construct@PEAUCordRep@cord_internal@absl@@AEBQEAU123@$0A@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@AEBQEAU456@@Z + ??$construct@PEAUCordRep@cord_internal@absl@@PEAU123@$0A@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@$$QEAPEAU456@@Z + ??$construct@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAPEAU1234@$0A@@?$allocator_traits@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAPEAU4567@@Z + ??$construct@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@$0A@@?$allocator_traits@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAU4567@@Z + ??$construct@PEAVCommandLineFlag@absl@@AEBQEAV12@$0A@@?$allocator_traits@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVCommandLineFlag@absl@@@12@PEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z + ??$construct@PEAVCordzHandle@cord_internal@absl@@AEBQEAV123@$0A@@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@PEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z + ??$construct@PEAVLogSink@absl@@AEBQEAV12@$0A@@?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVLogSink@absl@@@12@PEAPEAVLogSink@absl@@AEBQEAV45@@Z + ??$construct@PEAVLogSink@absl@@PEAV12@$0A@@?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVLogSink@absl@@@12@PEAPEAVLogSink@absl@@$$QEAPEAV45@@Z + ??$construct@PEBUCordRep@cord_internal@absl@@AEBQEBU123@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@PEAPEBUCordRep@cord_internal@absl@@AEBQEBU456@@Z + ??$construct@PEBVCommandLineFlag@absl@@AEBQEBV12@$0A@@?$allocator_traits@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVCommandLineFlag@absl@@@12@PEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z + ??$construct@PEBVCommandLineFlag@absl@@PEBV12@$0A@@?$allocator_traits@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVCommandLineFlag@absl@@@12@PEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z + ??$construct@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@$0A@@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@PEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z + ??$construct@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@$0A@@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV45678@@Z + ??$construct@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$construct@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$construct@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$construct@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@$0A@@?$allocator_traits@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@12@PEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@Z + ??$construct@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@$0A@@?$allocator_traits@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@12@PEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@Z + ??$construct@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@$0A@@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z + ??$construct@UPayload@status_internal@absl@@AEBU123@$0A@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@12@PEAUPayload@status_internal@absl@@AEBU456@@Z + ??$construct@UPayload@status_internal@absl@@U123@$0A@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@12@PEAUPayload@status_internal@absl@@$$QEAU456@@Z + ??$construct@UPrefixCrc@CrcCordState@crc_internal@absl@@AEBU1234@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEBU4567@@Z + ??$construct@UPrefixCrc@CrcCordState@crc_internal@absl@@HVcrc32c_t@4@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAH$$QEAVcrc32c_t@7@@Z + ??$construct@UPrefixCrc@CrcCordState@crc_internal@absl@@U1234@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAU4567@@Z + ??$construct@UTransition@cctz@time_internal@absl@@$$V$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PEAUTransition@cctz@time_internal@absl@@@Z + ??$construct@UTransition@cctz@time_internal@absl@@AEBU1234@$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z + ??$construct@UTransition@cctz@time_internal@absl@@U1234@$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PEAUTransition@cctz@time_internal@absl@@$$QEAU4567@@Z + ??$construct@UTransitionType@cctz@time_internal@absl@@$$V$0A@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@PEAUTransitionType@cctz@time_internal@absl@@@Z + ??$construct@UTransitionType@cctz@time_internal@absl@@U1234@$0A@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@PEAUTransitionType@cctz@time_internal@absl@@$$QEAU4567@@Z + ??$construct@UUnrecognizedFlag@absl@@AEBU12@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UUnrecognizedFlag@absl@@@12@PEAUUnrecognizedFlag@absl@@AEBU45@@Z + ??$construct@UUnrecognizedFlag@absl@@U12@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UUnrecognizedFlag@absl@@@12@PEAUUnrecognizedFlag@absl@@$$QEAU45@@Z + ??$construct@UUnrecognizedFlag@absl@@W4Source@12@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UUnrecognizedFlag@absl@@@12@PEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$construct@UViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@AEA_K$0A@@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@PEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV712@AEA_K@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@$0A@@?$allocator_traits@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@AEBV789@@Z@@Z + ??$construct@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@$0A@@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QEAV412@@Z + ??$construct@VFormatArgImpl@str_format_internal@absl@@AEBV123@$0A@@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@12@PEAVFormatArgImpl@str_format_internal@absl@@AEBV456@@Z + ??$construct_at@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEBV12345@PEAPEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@AEAPEAPEBV23456@@Z + ??$construct_at@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@PEAPEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@$$QEAPEAPEBV23456@@Z + ??$construct_at@PEAUCordRep@cord_internal@absl@@AEBQEAU123@PEAPEAU123@@__Cr@std@@YAPEAPEAUCordRep@cord_internal@absl@@PEAPEAU234@AEBQEAU234@@Z + ??$construct_at@PEAUCordRep@cord_internal@absl@@PEAU123@PEAPEAU123@@__Cr@std@@YAPEAPEAUCordRep@cord_internal@absl@@PEAPEAU234@$$QEAPEAU234@@Z + ??$construct_at@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAPEAU1234@PEAPEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@AEAPEAU2345@@Z + ??$construct_at@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@PEAPEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@$$QEAPEAU2345@@Z + ??$construct_at@PEAVCommandLineFlag@absl@@AEBQEAV12@PEAPEAV12@@__Cr@std@@YAPEAPEAVCommandLineFlag@absl@@PEAPEAV23@AEBQEAV23@@Z + ??$construct_at@PEAVCordzHandle@cord_internal@absl@@AEBQEAV123@PEAPEAV123@@__Cr@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV234@AEBQEAV234@@Z + ??$construct_at@PEAVLogSink@absl@@AEBQEAV12@PEAPEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@AEBQEAV23@@Z + ??$construct_at@PEAVLogSink@absl@@PEAV12@PEAPEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@$$QEAPEAV23@@Z + ??$construct_at@PEBUCordRep@cord_internal@absl@@AEBQEBU123@PEAPEBU123@@__Cr@std@@YAPEAPEBUCordRep@cord_internal@absl@@PEAPEBU234@AEBQEBU234@@Z + ??$construct_at@PEBVCommandLineFlag@absl@@AEBQEBV12@PEAPEBV12@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@AEBQEBV23@@Z + ??$construct_at@PEBVCommandLineFlag@absl@@PEBV12@PEAPEBV12@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@$$QEAPEBV23@@Z + ??$construct_at@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@PEAPEBV123@@__Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@AEBQEBV234@@Z + ??$construct_at@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@PEAPEBV12345@@__Cr@std@@YAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV23456@AEBQEBV23456@@Z + ??$construct_at@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@AEBQEBUCordRep@cord_internal@absl@@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@AEBQEBUCordRep@cord_internal@absl@@@Z + ??$construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$construct_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@PEAU123@@__Cr@std@@YAPEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@01@@Z + ??$construct_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@PEAU123@@__Cr@std@@YAPEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@01@@Z + ??$construct_at@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$construct_at@UPayload@status_internal@absl@@AEBU123@PEAU123@@__Cr@std@@YAPEAUPayload@status_internal@absl@@PEAU234@AEBU234@@Z + ??$construct_at@UPayload@status_internal@absl@@U123@PEAU123@@__Cr@std@@YAPEAUPayload@status_internal@absl@@PEAU234@$$QEAU234@@Z + ??$construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@AEBU1234@PEAU1234@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@AEBU2345@@Z + ??$construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@HVcrc32c_t@4@PEAU1234@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@$$QEAH$$QEAVcrc32c_t@5@@Z + ??$construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$construct_at@UTransition@cctz@time_internal@absl@@$$VPEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z + ??$construct_at@UTransition@cctz@time_internal@absl@@AEBU1234@PEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@AEBU2345@@Z + ??$construct_at@UTransition@cctz@time_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$construct_at@UTransitionType@cctz@time_internal@absl@@$$VPEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z + ??$construct_at@UTransitionType@cctz@time_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$construct_at@UUnrecognizedFlag@absl@@AEBU12@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@AEBU23@@Z + ??$construct_at@UUnrecognizedFlag@absl@@U12@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAU23@@Z + ??$construct_at@UUnrecognizedFlag@absl@@W4Source@12@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAW4Source@23@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z + ??$construct_at@UViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@AEA_KPEAU123@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV501@AEA_K@Z + ??$construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$construct_at@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@PEAV123@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@PEAV201@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV567@@Z@@Z + ??$construct_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@PEAV123@@__Cr@std@@YAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PEAV201@$$QEAV201@@Z + ??$construct_at@VFormatArgImpl@str_format_internal@absl@@AEBV123@PEAV123@@__Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@AEBV234@@Z + ??$copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0V201@@Z + ??$copy_n@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@_JV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@$0A@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@_JV201@@Z + ??$destroy@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$destroy@PEAUCordRep@cord_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@@Z + ??$destroy@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$destroy@PEAVCommandLineFlag@absl@@$0A@@?$allocator_traits@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVCommandLineFlag@absl@@@12@PEAPEAVCommandLineFlag@absl@@@Z + ??$destroy@PEAVCordzHandle@cord_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@PEAPEAVCordzHandle@cord_internal@absl@@@Z + ??$destroy@PEAVLogSink@absl@@$0A@@?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVLogSink@absl@@@12@PEAPEAVLogSink@absl@@@Z + ??$destroy@PEBUCordRep@cord_internal@absl@@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@PEAPEBUCordRep@cord_internal@absl@@@Z + ??$destroy@PEBVCommandLineFlag@absl@@$0A@@?$allocator_traits@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVCommandLineFlag@absl@@@12@PEAPEBVCommandLineFlag@absl@@@Z + ??$destroy@PEBVCordzHandle@cord_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@PEAPEBVCordzHandle@cord_internal@absl@@@Z + ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@@Z + ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@@Z + ??$destroy@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@12@PEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@@Z + ??$destroy@UConversionItem@ParsedFormatBase@str_format_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ??$destroy@UPayload@status_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@12@PEAUPayload@status_internal@absl@@@Z + ??$destroy@UPrefixCrc@CrcCordState@crc_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$destroy@UTransition@cctz@time_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PEAUTransition@cctz@time_internal@absl@@@Z + ??$destroy@UTransitionType@cctz@time_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@PEAUTransitionType@cctz@time_internal@absl@@@Z + ??$destroy@UUnrecognizedFlag@absl@@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UUnrecognizedFlag@absl@@@12@PEAUUnrecognizedFlag@absl@@@Z + ??$destroy@UViableSubstitution@strings_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@PEAUViableSubstitution@strings_internal@absl@@@Z + ??$destroy@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@@Z + ??$destroy@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA?A_PPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@@Z + ??$destroy@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@@Z + ??$destroy@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@@Z + ??$distance@PEBUPayload@status_internal@absl@@@__Cr@std@@YA_JPEBUPayload@status_internal@absl@@0@Z + ??$distance@PEBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA_JPEBUTransition@cctz@time_internal@absl@@0@Z + ??$distance@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0@Z + ??$distance@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0@Z + ??$distance@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@0@Z + ??$distance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA_JV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@12@0@Z + ??$distance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@0@Z + ??$distance@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@__Cr@std@@YA_JV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@0@Z + ??$distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z + ??$distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z + ??$distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0@Z + ??$distance@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z + ??$element@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAAEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@@Z + ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@12@@Z + ??$emplace@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@12@@Z + ??$emplace@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z + ??$emplace@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z + ??$emplace_at@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAAXViterator@012@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z + ??$emplace_at@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAAXViterator@012@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z + ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV612@AEA_K@Z + ??$emplace_back@AEBQEAUCordRep@cord_internal@absl@@@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAAEAPEAUCordRep@cord_internal@1@AEBQEAU231@@Z + ??$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV34@@Z + ??$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV345@@Z + ??$emplace_back@AEBQEAVLogSink@absl@@@?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEAAAEAPEAVLogSink@1@AEBQEAV21@@Z + ??$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV34@@Z + ??$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV34@@Z + ??$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV345@@Z + ??$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU3456@@Z + ??$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU34@@Z + ??$emplace_back@HVcrc32c_t@absl@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAH$$QEAVcrc32c_t@6@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV34@@Z + ??$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU3456@@Z + ??$emplace_back@UPayload@status_internal@absl@@@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAAEAUPayload@status_internal@1@$$QEAU231@@Z + ??$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QEAV312@@Z + ??$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@34@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$end@V?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@AEAV?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@01@@Z + ??$end@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@AEAV?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@01@@Z + ??$find@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@PEAVLogSink@absl@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@01@V201@0AEBQEAVLogSink@absl@@@Z + ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA?AVconst_iterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$find_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$find_or_prepare_insert@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_or_prepare_insert_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_or_prepare_insert_small@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_small@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$forward_as_tuple@AEBQEAVCommandLineFlag@absl@@@__Cr@std@@YA?AV?$tuple@AEBQEAVCommandLineFlag@absl@@@01@AEBQEAVCommandLineFlag@absl@@@Z + ??$forward_as_tuple@PEAVCommandLineFlag@absl@@@__Cr@std@@YA?AV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@01@$$QEAPEAVCommandLineFlag@absl@@@Z + ??$get@$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@container_internal@absl@@QEGAAAEAPEAPEAUCordRep@cord_internal@2@XZ + ??$get@$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEA_KXZ + ??$get@$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGBAAEB_KXZ + ??$get@$00@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@container_internal@absl@@QEGAAAEAPEAPEAVLogSink@2@XZ + ??$get@$00@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEA_KXZ + ??$get@$00@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@container_internal@absl@@QEGBAAEB_KXZ + ??$get@$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@container_internal@absl@@QEGAAAEAPEAUPayload@status_internal@2@XZ + ??$get@$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEA_KXZ + ??$get@$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGBAAEB_KXZ + ??$get@$00@?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEA_KXZ + ??$get@$00@?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGBAAEB_KXZ + ??$get@$00@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGAAAEAUStringHash@12@XZ + ??$get@$00@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEBUStringHash@12@XZ + ??$get@$00@?$CompressedTuple@_KV?$allocator@D@__Cr@std@@@container_internal@absl@@QEGAAAEAV?$allocator@D@__Cr@std@@XZ + ??$get@$00AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@YAAEA_NAEAV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@@Z + ??$get@$00AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@23@@__Cr@std@@YAAEAV?$NonIterableBitMask@_K$07$02@container_internal@absl@@AEAV?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@23@@01@@Z + ??$get@$00PEAVCommandLineFlag@absl@@_N@__Cr@std@@YAAEA_NAEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@@Z + ??$get@$01@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEBUStringEq@12@XZ + ??$get@$02@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGAAAEAV?$allocator@D@__Cr@std@@XZ + ??$get@$0A@$$QEAPEAVCommandLineFlag@absl@@@__Cr@std@@YAAEAPEAVCommandLineFlag@absl@@AEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@01@@Z + ??$get@$0A@@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@container_internal@absl@@QEGAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@container_internal@absl@@QEGAAAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@container_internal@absl@@QEGAAAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGBAAEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGAAAEAVCommonFields@12@XZ + ??$get@$0A@@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEBVCommonFields@12@XZ + ??$get@$0A@@?$CompressedTuple@_KV?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEB_KXZ + ??$get@$0A@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@YAAEAPEAVCommandLineFlag@absl@@AEAV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@@Z + ??$get@$0A@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@23@@__Cr@std@@YAAEAUFindInfo@container_internal@absl@@AEAV?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@23@@01@@Z + ??$get@$0A@AEBQEAVCommandLineFlag@absl@@@__Cr@std@@YAAEBQEAVCommandLineFlag@absl@@AEAV?$tuple@AEBQEAVCommandLineFlag@absl@@@01@@Z + ??$get@$0A@PEAVCommandLineFlag@absl@@_N@__Cr@std@@YA$$QEAPEAVCommandLineFlag@absl@@$$QEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@@Z + ??$get@$0A@PEAVCommandLineFlag@absl@@_N@__Cr@std@@YAAEAPEAVCommandLineFlag@absl@@AEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@@Z + ??$hash@U?$Hash@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@hash_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@HashWithSeed@hash_internal@absl@@QEBA_KAEBU?$Hash@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$hash@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@HashWithSeed@hash_internal@absl@@QEBA_KAEBUStringHash@container_internal@2@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$hash@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@MixingHashState@hash_internal@absl@@SA_KAEBV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@Z + ??$hash@V?$tuple@AEB_K@__Cr@std@@@MixingHashState@hash_internal@absl@@SA_KAEBV?$tuple@AEB_K@__Cr@std@@@Z + ??$hash_bytes@VMixingHashState@hash_internal@absl@@H$0A@@hash_internal@absl@@YA?AVMixingHashState@01@V201@AEBH@Z + ??$hash_bytes@VMixingHashState@hash_internal@absl@@_K$0A@@hash_internal@absl@@YA?AVMixingHashState@01@V201@AEB_K@Z + ??$hash_range_or_bytes@VMixingHashState@hash_internal@absl@@D@hash_internal@absl@@YA?AVMixingHashState@01@V201@PEBD_K@Z + ??$hash_tuple@VMixingHashState@hash_internal@absl@@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@$0A@$00@hash_internal@absl@@YA?AVMixingHashState@01@V201@AEBV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@U?$integer_sequence@_K$0A@$00@45@@Z + ??$hash_tuple@VMixingHashState@hash_internal@absl@@V?$tuple@AEB_K@__Cr@std@@$0A@@hash_internal@absl@@YA?AVMixingHashState@01@V201@AEBV?$tuple@AEB_K@__Cr@std@@U?$integer_sequence@_K$0A@@45@@Z + ??$hash_with_seed@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@MixingHashState@hash_internal@absl@@SA_KAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$hash_with_seed@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@$0A@@MixingHashState@hash_internal@absl@@SA_KAEBV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@_K@Z + ??$hash_with_seed@V?$tuple@AEB_K@__Cr@std@@$0A@@MixingHashState@hash_internal@absl@@SA_KAEBV?$tuple@AEB_K@__Cr@std@@_K@Z + ??$insert@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z + ??$insert@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@1@Z + ??$invoke@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K@__Cr@std@@YA_KAEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QEA_K@Z + ??$invoke@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@__Cr@std@@YAX$$QEAP8FlagImpl@flags_internal@absl@@EAAXXZ$$QEAPEAV234@@Z + ??$iter_swap@AEAPEAPEAVCommandLineFlag@absl@@AEAPEAPEAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEAPEAVCommandLineFlag@absl@@0@Z + ??$iter_swap@AEAPEAPEAVCommandLineFlag@absl@@PEAPEAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEAPEAVCommandLineFlag@absl@@$$QEAPEAPEAV34@@Z + ??$iter_swap@AEAPEAPEBVCommandLineFlag@absl@@AEAPEAPEBV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEAPEBVCommandLineFlag@absl@@0@Z + ??$iter_swap@AEAPEAPEBVCommandLineFlag@absl@@PEAPEBV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEAPEBVCommandLineFlag@absl@@$$QEAPEAPEBV34@@Z + ??$iter_swap@PEAPEAVCommandLineFlag@absl@@PEAPEAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAX$$QEAPEAPEAVCommandLineFlag@absl@@0@Z + ??$iter_swap@PEAPEAVCommandLineFlag@absl@@PEAPEAV12@@__Cr@std@@YAXPEAPEAVCommandLineFlag@absl@@0@Z + ??$iter_swap@PEAPEBVCommandLineFlag@absl@@PEAPEBV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAX$$QEAPEAPEBVCommandLineFlag@absl@@0@Z + ??$iter_swap@PEAPEBVCommandLineFlag@absl@@PEAPEBV12@@__Cr@std@@YAXPEAPEBVCommandLineFlag@absl@@0@Z + ??$launder@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@PEAU201@@Z + ??$launder@UList@CordzInfo@cord_internal@absl@@@__Cr@std@@YAPEAUList@CordzInfo@cord_internal@absl@@PEAU2345@@Z + ??$launder@URefcountedRep@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEAURefcountedRep@CrcCordState@crc_internal@absl@@PEAU2345@@Z + ??$launder@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@__Cr@std@@YAPEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@PEAV234@@Z + ??$launder@VFlagRegistry@flags_internal@absl@@@__Cr@std@@YAPEAVFlagRegistry@flags_internal@absl@@PEAV234@@Z + ??$launder@VMutex@absl@@@__Cr@std@@YAPEAVMutex@absl@@PEAV23@@Z + ??$lower_bound@PEBUTransition@cctz@time_internal@absl@@U1234@UByUnixTime@1234@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@UByUnixTime@2345@@Z + ??$make_pair@AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEAPEBV12345@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$make_pair@AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$$QEAPEAPEAPEBV34567@@Z + ??$make_pair@AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAPEAPEAU1234@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$make_pair@AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAPEAU3456@@Z + ??$make_pair@AEAPEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@YA?AU?$pair@PEAPEAVCommandLineFlag@absl@@_N@01@AEAPEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$make_pair@AEAPEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@YA?AU?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@01@AEAPEAPEAVLogSink@absl@@$$QEAPEAPEAV34@@Z + ??$make_pair@AEAPEAPEBVCommandLineFlag@absl@@AEA_N@__Cr@std@@YA?AU?$pair@PEAPEBVCommandLineFlag@absl@@_N@01@AEAPEAPEBVCommandLineFlag@absl@@AEA_N@Z + ??$make_pair@AEAPEAUTransition@cctz@time_internal@absl@@AEAPEAU1234@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@AEAPEAUTransition@cctz@time_internal@absl@@0@Z + ??$make_pair@AEAPEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@AEAPEAUTransition@cctz@time_internal@absl@@$$QEAPEAU3456@@Z + ??$make_pair@AEAPEAUTransitionType@cctz@time_internal@absl@@AEAPEAU1234@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@AEAPEAUTransitionType@cctz@time_internal@absl@@0@Z + ??$make_pair@AEAPEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@AEAPEAUTransitionType@cctz@time_internal@absl@@$$QEAPEAU3456@@Z + ??$make_pair@AEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@01@AEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAU3456@@Z + ??$make_pair@AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@01@AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z + ??$make_pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@$$QEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$make_pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@$$QEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$make_pair@PEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@YA?AU?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@01@$$QEAPEAPEAVLogSink@absl@@0@Z + ??$make_pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@$$QEAPEAUTransition@cctz@time_internal@absl@@0@Z + ??$make_pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@$$QEAPEAUTransitionType@cctz@time_internal@absl@@0@Z + ??$make_pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@01@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAU3456@@Z + ??$make_pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@01@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z + ??$make_pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@01@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z + ??$make_tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@YA?AV?$tuple@PEAVCommandLineFlag@absl@@_N@01@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$make_unique@ULogMessageData@LogMessage@log_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAHAEAW4LogSeverity@4@VTime@4@$0A@@__Cr@std@@YA?AV?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@01@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEAHAEAW4LogSeverity@absl@@$$QEAVTime@5@@Z + ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@$$V$0A@@__Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@XZ + ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@AEAV12@$0A@@__Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@AEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z + ??$make_unique@VFallbackCrcMemcpyEngine@crc_internal@absl@@$$V$0A@@__Cr@std@@YA?AV?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@01@XZ + ??$make_unique@VFlagState@flags_internal@absl@@AEAVFlagImpl@23@AEAPEAXAEA_NAEA_N_J$0A@@__Cr@std@@YA?AV?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@01@AEAVFlagImpl@flags_internal@absl@@AEAPEAXAEA_N2$$QEA_J@Z + ??$make_unique@VFlagState@flags_internal@absl@@AEAVFlagImpl@23@PEAXAEA_NAEA_N_J$0A@@__Cr@std@@YA?AV?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@01@AEAVFlagImpl@flags_internal@absl@@$$QEAPEAXAEA_N2$$QEA_J@Z + ??$make_unique@VFlagState@flags_internal@absl@@AEAVFlagImpl@23@_JAEA_NAEA_N_J$0A@@__Cr@std@@YA?AV?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@01@AEAVFlagImpl@flags_internal@absl@@$$QEA_JAEA_N21@Z + ??$max@VDuration@absl@@@__Cr@std@@YAAEBVDuration@absl@@AEBV23@0@Z + ??$max@VDuration@absl@@U?$__less@XX@__Cr@std@@@__Cr@std@@YAAEBVDuration@absl@@AEBV23@0U?$__less@XX@01@@Z + ??$max_size@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAVCommandLineFlag@absl@@@12@@Z + ??$max_size@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAVLogSink@absl@@@12@@Z + ??$max_size@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEBVCommandLineFlag@absl@@@12@@Z + ??$max_size@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??$max_size@V?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@U?$AlignedType@$07@container_internal@absl@@@12@@Z + ??$max_size@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@12@@Z + ??$max_size@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UPayload@status_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??$max_size@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??$max_size@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@12@@Z + ??$min@VDuration@absl@@@__Cr@std@@YAAEBVDuration@absl@@AEBV23@0@Z + ??$min@VDuration@absl@@U?$__less@XX@__Cr@std@@@__Cr@std@@YAAEBVDuration@absl@@AEBV23@0U?$__less@XX@01@@Z + ??$move@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z + ??$move@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@00@Z + ??$move@PEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@00@Z + ??$move@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z + ??$move@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z + ??$move_backward@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z + ??$move_backward@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@00@Z + ??$move_backward@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z + ??$move_backward@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z + ??$next@AEAPEBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPEBUTransition@cctz@time_internal@absl@@AEAPEBU3456@_J@Z + ??$next@PEAPEAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPEAPEAVCommandLineFlag@absl@@PEAPEAV34@0@Z + ??$next@PEAPEBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPEAPEBVCommandLineFlag@absl@@PEAPEBV34@0@Z + ??$next@PEBUTransition@cctz@time_internal@absl@@$0A@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@_J@Z + ??$next@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@V201@_J@Z + ??$reset@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@$0A@@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@@Z + ??$reset@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@$0A@@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@H@strings_internal@absl@@YA?AV012@H@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@I@strings_internal@absl@@YA?AV012@I@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@J@strings_internal@absl@@YA?AV012@J@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@K@strings_internal@absl@@YA?AV012@K@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV012@_J@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV012@0@Z@@Z + ??$resize_and_overwrite@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@56@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@UNoFormatter@23@@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV012@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@1V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@UNoFormatter@45@@Z@@Z + ??$safe_strtoi_base@H@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHH@Z + ??$safe_strtoi_base@I@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAIH@Z + ??$safe_strtoi_base@J@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAJH@Z + ??$safe_strtoi_base@K@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAKH@Z + ??$safe_strtoi_base@_J@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_JH@Z + ??$safe_strtoi_base@_K@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_KH@Z + ??$swap@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAXAEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$swap@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAXAEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$swap@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@YAXAEAPEAUTransition@cctz@time_internal@absl@@0@Z + ??$swap@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAXAEAPEAUTransitionType@cctz@time_internal@absl@@0@Z + ??$swap@PEAUUnrecognizedFlag@absl@@@__Cr@std@@YAXAEAPEAUUnrecognizedFlag@absl@@0@Z + ??$swap@PEAVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEAVCommandLineFlag@absl@@0@Z + ??$swap@PEBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@YAXAEAPEBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@0@Z + ??$swap@PEBVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEBVCommandLineFlag@absl@@0@Z + ??$swap@PEBW4ctrl_t@container_internal@absl@@@__Cr@std@@YAXAEAPEBW4ctrl_t@container_internal@absl@@0@Z + ??$swap@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@0@Z + ??$swap@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXAEAUViableSubstitution@strings_internal@absl@@0@Z + ??$tie@PEAVCommandLineFlag@absl@@_N@__Cr@std@@YA?AV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$tie@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@_K$07$02@23@@__Cr@std@@YA?AV?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@23@@01@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@_K$07$02@45@@Z + ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@1@Z + ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@1@Z + ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@1@Z + ??$transfer_impl@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@CA?AU?$integral_constant@_N$00@__Cr@std@@PEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@45@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@1URank2@012@@Z + ??$upper_bound@PEBUTransition@cctz@time_internal@absl@@U1234@UByCivilTime@1234@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@UByCivilTime@2345@@Z + ??$upper_bound@PEBUTransition@cctz@time_internal@absl@@U1234@UByUnixTime@1234@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@UByUnixTime@2345@@Z + ??$visit@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@X@__Cr@std@@YA?A_T$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@45@@Z@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@01@@Z + ??0?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@Z + ??0?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@Z + ??0?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@Z + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@XZ + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@_K@Z + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@XZ + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@_K@Z + ??0?$BitMask@_K$07$02$00@container_internal@absl@@QEAA@_K@Z + ??0?$BitMask@_K$07$02$0A@@container_internal@absl@@QEAA@_K@Z + ??0?$BoundedUtf8LengthSequence@$0BAA@@debugging_internal@absl@@QEAA@XZ + ??0?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAA@_KAEBV?$allocator@D@__Cr@std@@@Z + ??0?$FlagRegistrar@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$00@flags_internal@absl@@QEAA@AEAV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@12@PEBD@Z + ??0?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@str_format_internal@absl@@QEAA@PEBD@Z + ??0?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@str_format_internal@absl@@QEAA@PEBD@Z + ??0?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@str_format_internal@absl@@QEAA@PEBD@Z + ??0?$FormatSpecTemplate@$0JPPPL@@str_format_internal@absl@@QEAA@PEBD@Z + ??0?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@QEAA@AEBUStringHash@12@_K@Z + ??0?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@QEAA@AEBUStringHash@12@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAA@XZ + ??0?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEAA@XZ + ??0?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAA@AEBV01@@Z + ??0?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAA@AEBV01@AEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@Z + ??0?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAA@XZ + ??0?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QEAA@AEBV?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@__Cr@std@@@Z + ??0?$IteratorValueAdapter@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@V?$move_iterator@PEAPEAVLogSink@absl@@@23@@inlined_vector_internal@absl@@QEAA@AEBV?$move_iterator@PEAPEAVLogSink@absl@@@__Cr@std@@@Z + ??0?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@QEAA@AEBQEBUPayload@status_internal@2@@Z + ??0?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QEAA@AEBV?$move_iterator@PEAUPayload@status_internal@absl@@@__Cr@std@@@Z + ??0?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@QEAA@AEBQEBVFormatArgImpl@str_format_internal@2@@Z + ??0?$NonIterableBitMask@_K$07$02@container_internal@absl@@QEAA@_K@Z + ??0?$ProbedItemImpl@I$0CA@@container_internal@absl@@QEAA@E_K0@Z + ??0?$ProbedItemImpl@_K$0EA@@container_internal@absl@@QEAA@E_K0@Z + ??0?$ProbedItemImpl@_K$0HK@@container_internal@absl@@QEAA@E_K0@Z + ??0?$Sample@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAA@XZ + ??0?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAA@XZ + ??0?$Span@$$CBD@absl@@QEAA@PEBD_K@Z + ??0?$Span@$$CBD@absl@@QEAA@XZ + ??0?$Span@$$CBI@absl@@QEAA@PEBI_K@Z + ??0?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@PEBVFormatArgImpl@str_format_internal@1@_K@Z + ??0?$Span@D@absl@@QEAA@PEAD_K@Z + ??0?$Span@D@absl@@QEAA@XZ + ??0?$Span@I@absl@@QEAA@PEAI_K@Z + ??0?$Span@PEAVLogSink@absl@@@absl@@QEAA@PEAPEAVLogSink@1@_K@Z + ??0?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEAA@PEBQEAUCordRep@cord_internal@1@_K@Z + ??0?$Span@QEAX@absl@@QEAA@PEBQEAX_K@Z + ??0?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@W4State@012@PEBV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@W4State@012@PEBV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@W4State@012@PEBV?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VByAnyChar@2@UAllowEmpty@2@@Z + ??0?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VByAnyChar@2@USkipEmpty@2@@Z + ??0?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VByChar@2@UAllowEmpty@2@@Z + ??0?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??0?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??0?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@AEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@Z + ??0?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??0?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@Z + ??0?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@QEAA@AEAV?$allocator@UUnrecognizedFlag@absl@@@12@AEAPEAUUnrecognizedFlag@absl@@1@Z + ??0?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@__Cr@std@@QEAA@AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@Z + ??0?$__allocation_result@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@__Cr@std@@QEAA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ??0?$__allocation_result@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@__Cr@std@@QEAA@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ??0?$__allocation_result@PEAPEAVCommandLineFlag@absl@@_K@__Cr@std@@QEAA@PEAPEAVCommandLineFlag@absl@@_K@Z + ??0?$__allocation_result@PEAPEAVCordzHandle@cord_internal@absl@@_K@__Cr@std@@QEAA@PEAPEAVCordzHandle@cord_internal@absl@@_K@Z + ??0?$__allocation_result@PEAPEAVLogSink@absl@@_K@__Cr@std@@QEAA@PEAPEAVLogSink@absl@@_K@Z + ??0?$__allocation_result@PEAPEBVCommandLineFlag@absl@@_K@__Cr@std@@QEAA@PEAPEBVCommandLineFlag@absl@@_K@Z + ??0?$__allocation_result@PEAPEBVCordzHandle@cord_internal@absl@@_K@__Cr@std@@QEAA@PEAPEBVCordzHandle@cord_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@__Cr@std@@QEAA@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUTransition@cctz@time_internal@absl@@_K@__Cr@std@@QEAA@PEAUTransition@cctz@time_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@_K@__Cr@std@@QEAA@PEAUTransitionType@cctz@time_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUUnrecognizedFlag@absl@@_K@__Cr@std@@QEAA@PEAUUnrecognizedFlag@absl@@_K@Z + ??0?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@_K@__Cr@std@@QEAA@PEAUViableSubstitution@strings_internal@absl@@_K@Z + ??0?$__allocation_result@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@_K@__Cr@std@@QEAA@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@_K@Z + ??0?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z + ??0?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z + ??0?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__Cr@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z + ??0?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__Cr@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@QEAA@PEAVCordzHandle@cord_internal@absl@@@Z + ??0?$__atomic_base@PEAVCordzInfo@cord_internal@absl@@$0A@@__Cr@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z + ??0?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__cxx_atomic_base_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__Cr@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z + ??0?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@__Cr@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__cxx_atomic_base_impl@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAA@PEAVCordzHandle@cord_internal@absl@@@Z + ??0?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@__Cr@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z + ??0?$__cxx_atomic_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@ZU?$__cxx_atomic_base_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__Cr@std@@@__Cr@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z + ??0?$__cxx_atomic_impl@PEAUHashtablezInfo@container_internal@absl@@U?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__cxx_atomic_impl@PEAVCordzHandle@cord_internal@absl@@U?$__cxx_atomic_base_impl@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAVCordzHandle@cord_internal@absl@@@Z + ??0?$__cxx_atomic_impl@PEAVCordzInfo@cord_internal@absl@@U?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z + ??0?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@__Cr@std@@AEAA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV34567@@Z + ??0?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@AEAA@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU3456@@Z + ??0?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@AEAA@PEBQEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU3456@@Z + ??0?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@__Cr@std@@QEAA@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@12@AEAAX_K@Z@@Z + ??0?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@12@@Z + ??0?$__hash_const_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAA@AEBV?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@@Z + ??0?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@AEBV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??0?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@AEAA@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@@Z + ??0?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEAA@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??0?$__hash_map_const_iterator@V?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@V?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??0?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAA@PEAU012@@Z + ??0?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@PEAU012@@Z + ??0?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@_N@Z + ??0?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@_N@Z + ??0?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA@XZ + ??0?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@X@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@12@@Z + ??0?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@X@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@12@@Z + ??0?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEAA@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@12@@Z + ??0?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEAA@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@QEAA@XZ + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__optional_copy_assign_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ + ??0?$__optional_copy_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ + ??0?$__optional_destruct_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ + ??0?$__optional_move_assign_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ + ??0?$__optional_move_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ + ??0?$__optional_storage_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??0?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVLogSink@absl@@@12@@Z + ??0?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEBVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??0?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@_K0AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??0?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAA@_K0AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAVLogSink@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEBVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@12@@Z + ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@12@@Z + ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@12@@Z + ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@@Z + ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@12@@Z + ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@@Z + ??0?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@12@_N@Z + ??0?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@12@_N@Z + ??0?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@AEAA@PEAPEAVCommandLineFlag@absl@@@Z + ??0?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@AEAA@PEAPEAVCordzHandle@cord_internal@absl@@@Z + ??0?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@AEAA@PEAPEAVLogSink@absl@@@Z + ??0?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@AEAA@PEAPEBVCommandLineFlag@absl@@@Z + ??0?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@AEAA@PEAUTransition@cctz@time_internal@absl@@@Z + ??0?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@AEAA@PEAUTransitionType@cctz@time_internal@absl@@@Z + ??0?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@__Cr@std@@AEAA@PEAUUnrecognizedFlag@absl@@@Z + ??0?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@AEAA@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@AEBV567@@Z@@Z + ??0?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@AEAA@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@@Z + ??0?$__wrap_iter@PEBQEAVLogSink@absl@@@__Cr@std@@AEAA@PEBQEAVLogSink@absl@@@Z + ??0?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@AEAA@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ??0?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@__Cr@std@@AEAA@PEBUUnrecognizedFlag@absl@@@Z + ??0?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEAVLogSink@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@QEAA@XZ + ??0?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@UPayload@status_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$atomic@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__Cr@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z + ??0?$atomic@PEAUHashtablezInfo@container_internal@absl@@@__Cr@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$atomic@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAA@PEAVCordzHandle@cord_internal@absl@@@Z + ??0?$atomic@PEAVCordzInfo@cord_internal@absl@@@__Cr@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z + ??0?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@XZ + ??0?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@XZ + ??0?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@XZ + ??0?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@XZ + ??0?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@XZ + ??0?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@XZ + ??0?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@XZ + ??0?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@absl@@QEAA@XZ + ??0?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@QEAA@XZ + ??0?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??0?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@__Cr@std@@QEAA@PEAPEAUCordRep@cord_internal@absl@@@Z + ??0?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAA@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??0?$move_iterator@PEAPEAVLogSink@absl@@@__Cr@std@@QEAA@PEAPEAVLogSink@absl@@@Z + ??0?$move_iterator@PEAUPayload@status_internal@absl@@@__Cr@std@@QEAA@PEAUPayload@status_internal@absl@@@Z + ??0?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@QEAA@PEAUTransition@cctz@time_internal@absl@@@Z + ??0?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAA@PEAUTransitionType@cctz@time_internal@absl@@@Z + ??0?$optional@VCord@absl@@@__Cr@std@@QEAA@Unullopt_t@12@@Z + ??0?$probe_seq@$07@container_internal@absl@@QEAA@_K0@Z + ??0?$raw_hash_map@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA@XZ + ??0?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA@XZ + ??0?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV012@@Z + ??0?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV012@@Z + ??0?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEAA@$$QEAV012@@Z + ??0?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$unordered_set@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA@XZ + ??0?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0AlphaNum@absl@@QEAA@H@Z + ??0AlphaNum@absl@@QEAA@PEBD@Z + ??0AlphaNum@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0AlphaNum@absl@@QEAA@_J@Z + ??0AlphaNum@absl@@QEAA@_K@Z + ??0Arena@LowLevelAlloc@base_internal@absl@@QEAA@I@Z + ??0Arg@substitute_internal@absl@@QEAA@PEBX@Z + ??0Arg@substitute_internal@absl@@QEAA@UDec@2@@Z + ??0Arg@substitute_internal@absl@@QEAA@UHex@2@@Z + ??0BadStatusOrAccess@absl@@QEAA@$$QEAV01@@Z + ??0BadStatusOrAccess@absl@@QEAA@AEBV01@@Z + ??0BadStatusOrAccess@absl@@QEAA@VStatus@1@@Z + ??0BestHints@flags_internal@absl@@QEAA@E@Z + ??0BlockingCounter@absl@@QEAA@H@Z + ??0BoundConversion@str_format_internal@absl@@QEAA@XZ + ??0Breakdown@Time@absl@@QEAA@XZ + ??0BufferRawSink@str_format_internal@absl@@QEAA@PEAD_K@Z + ??0ByAnyChar@absl@@QEAA@$$QEAV01@@Z + ??0ByAnyChar@absl@@QEAA@AEBV01@@Z + ??0ByAnyChar@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0ByChar@absl@@QEAA@D@Z + ??0ByLength@absl@@QEAA@_J@Z + ??0ByString@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0CRC32@crc_internal@absl@@QEAA@XZ + ??0CRC@crc_internal@absl@@IEAA@XZ + ??0CRCImpl@crc_internal@absl@@QEAA@XZ + ??0CharIterator@Cord@absl@@AEAA@PEBV12@@Z + ??0CharIterator@Cord@absl@@QEAA@XZ + ??0CheckOpMessageBuilder@log_internal@absl@@QEAA@PEBD@Z + ??0ChunkIterator@Cord@absl@@AEAA@PEAUCordRep@cord_internal@2@@Z + ??0ChunkIterator@Cord@absl@@AEAA@PEBV12@@Z + ??0ChunkIterator@Cord@absl@@QEAA@XZ + ??0ChunkRange@Cord@absl@@QEAA@PEBV12@@Z + ??0CivilInfo@TimeZone@absl@@QEAA@XZ + ??0CommandLineFlag@absl@@QEAA@XZ + ??0CommonFields@container_internal@absl@@QEAA@Unon_soo_tag_t@12@@Z + ??0CommonFields@container_internal@absl@@QEAA@Usoo_tag_t@12@@Z + ??0Condition@absl@@QEAA@P6A_NPEAX@Z0@Z + ??0Condition@absl@@QEAA@PEB_N@Z + ??0ConvertibleToStringView@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0Cord@absl@@AEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@1@@Z + ??0Cord@absl@@QEAA@$$QEAV01@@Z + ??0Cord@absl@@QEAA@AEBV01@@Z + ??0Cord@absl@@QEAA@XZ + ??0CordBuffer@absl@@AEAA@PEAUCordRepFlat@cord_internal@1@@Z + ??0CordBuffer@absl@@QEAA@XZ + ??0CordRep@cord_internal@absl@@QEAA@XZ + ??0CordRepBtree@cord_internal@absl@@AEAA@XZ + ??0CordRepBtreeNavigator@cord_internal@absl@@QEAA@XZ + ??0CordRepBtreeReader@cord_internal@absl@@QEAA@XZ + ??0CordRepCrc@cord_internal@absl@@QEAA@XZ + ??0CordRepExternal@cord_internal@absl@@QEAA@XZ + ??0CordRepFlat@cord_internal@absl@@QEAA@XZ + ??0CordRepSubstring@cord_internal@absl@@QEAA@XZ + ??0CordzHandle@cord_internal@absl@@IEAA@_N@Z + ??0CordzHandle@cord_internal@absl@@QEAA@XZ + ??0CordzInfo@cord_internal@absl@@AEAA@PEAUCordRep@12@PEBV012@W4MethodIdentifier@CordzUpdateTracker@12@_J@Z + ??0CordzStatistics@cord_internal@absl@@QEAA@XZ + ??0CordzUpdateScope@cord_internal@absl@@QEAA@PEAVCordzInfo@12@W4MethodIdentifier@CordzUpdateTracker@12@@Z + ??0CordzUpdateTracker@cord_internal@absl@@QEAA@XZ + ??0Counter@CordzUpdateTracker@cord_internal@absl@@QEAA@XZ + ??0CrcCordState@crc_internal@absl@@QEAA@$$QEAV012@@Z + ??0CrcCordState@crc_internal@absl@@QEAA@AEBV012@@Z + ??0CrcCordState@crc_internal@absl@@QEAA@XZ + ??0CrcMemcpyEngine@crc_internal@absl@@IEAA@XZ + ??0Duration@absl@@AEAA@_JI@Z + ??0Duration@absl@@QEAA@XZ + ??0DynValueDeleter@flags_internal@absl@@QEAA@P6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ??0ErrnoSaver@base_internal@absl@@QEAA@XZ + ??0FILERawSink@str_format_internal@absl@@QEAA@PEAU_iobuf@@@Z + ??0FallbackCrcMemcpyEngine@crc_internal@absl@@QEAA@XZ + ??0FlagCallback@flags_internal@absl@@QEAA@XZ + ??0FlagRegistry@flags_internal@absl@@QEAA@XZ + ??0FlagSaver@absl@@QEAA@XZ + ??0FlagSaverImpl@flags_internal@absl@@QEAA@XZ + ??0FlagStateInterface@flags_internal@absl@@QEAA@XZ + ??0FlagsUsageConfig@absl@@QEAA@AEBU01@@Z + ??0FlagsUsageConfig@absl@@QEAA@XZ + ??0FormatConversionSpecImpl@str_format_internal@absl@@QEAA@XZ + ??0FormatSinkImpl@str_format_internal@absl@@QEAA@VFormatRawSinkImpl@12@@Z + ??0GraphCycles@synchronization_internal@absl@@QEAA@XZ + ??0GroupAArch64Impl@container_internal@absl@@QEAA@PEBW4ctrl_t@12@@Z + ??0GroupPortableImpl@container_internal@absl@@QEAA@PEBW4ctrl_t@12@@Z + ??0HashSetIteratorGenerationInfoDisabled@container_internal@absl@@QEAA@PEBE@Z + ??0HashtableSize@container_internal@absl@@QEAA@Ufull_soo_tag_t@12@@Z + ??0HashtableSize@container_internal@absl@@QEAA@Uno_seed_empty_tag_t@12@@Z + ??0HashtablezInfo@container_internal@absl@@QEAA@XZ + ??0HashtablezInfoHandle@container_internal@absl@@QEAA@$$T@Z + ??0Hex@absl@@AEAA@W4PadSpec@1@_K@Z + ??0HiRep@Duration@absl@@QEAA@_J@Z + ??0Impl@time_zone@cctz@time_internal@absl@@AEAA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??0Impl@time_zone@cctz@time_internal@absl@@AEAA@XZ + ??0InlineData@cord_internal@absl@@QEAA@AEBV012@@Z + ??0InlineData@cord_internal@absl@@QEAA@W4DefaultInitType@012@@Z + ??0InlineData@cord_internal@absl@@QEAA@XZ + ??0InlineRep@Cord@absl@@QEAA@$$QEAV012@@Z + ??0InlineRep@Cord@absl@@QEAA@AEBV012@@Z + ??0InlineRep@Cord@absl@@QEAA@W4DefaultInitType@InlineData@cord_internal@2@@Z + ??0InlineRep@Cord@absl@@QEAA@XZ + ??0InputValue@UnboundConversion@str_format_internal@absl@@QEAA@XZ + ??0KernelTimeout@synchronization_internal@absl@@QEAA@VDuration@2@@Z + ??0KernelTimeout@synchronization_internal@absl@@QEAA@VTime@2@@Z + ??0KernelTimeout@synchronization_internal@absl@@QEAA@XZ + ??0LeakCheckDisabler@absl@@QEAA@XZ + ??0List@CordzInfo@cord_internal@absl@@QEAA@XZ + ??0LockHolder@synchronization_internal@absl@@QEAA@PEAU_RTL_SRWLOCK@@@Z + ??0LogEntry@absl@@AEAA@XZ + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUErrorTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUInfoTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUWarningTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@2@@Z + ??0LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@2@@Z + ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@3@VTime@3@@Z + ??0LogMessageDebugFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH0@Z + ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageQuietlyDebugFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageQuietlyFatal@log_internal@absl@@QEAA@PEBDH0@Z + ??0LogMessageQuietlyFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogSink@absl@@IEAA@XZ + ??0Long@Rep@CordBuffer@absl@@QEAA@PEAUCordRepFlat@cord_internal@3@@Z + ??0MaskedPointer@flags_internal@absl@@QEAA@PEAX_N@Z + ??0MixingHashState@hash_internal@absl@@AEAA@_K@Z + ??0Mutex@absl@@QEAA@XZ + ??0MutexLock@absl@@QEAA@AEAVMutex@1@@Z + ??0NodeCounts@CordzStatistics@cord_internal@absl@@QEAA@XZ + ??0OstreamView@LogMessage@log_internal@absl@@QEAA@AEAULogMessageData@123@@Z + ??0ParsedFloat@strings_internal@absl@@QEAA@XZ + ??0ParsedFormatBase@str_format_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_NV?$initializer_list@W4FormatConversionCharSet@absl@@@5@@Z + ??0ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA@PEAV123@@Z + ??0Payload@status_internal@absl@@QEAA@$$QEAU012@@Z + ??0Payload@status_internal@absl@@QEAA@AEBU012@@Z + ??0PerTableSeed@container_internal@absl@@AEAA@G@Z + ??0PosixTimeZone@cctz@time_internal@absl@@QEAA@XZ + ??0PrefixCrc@CrcCordState@crc_internal@absl@@QEAA@XZ + ??0PrefixCrc@CrcCordState@crc_internal@absl@@QEAA@_KVcrc32c_t@3@@Z + ??0ProtoField@log_internal@absl@@QEAA@XZ + ??0Randen@random_internal@absl@@QEAA@XZ + ??0RawHashSetLayout@container_internal@absl@@QEAA@_K00_N@Z + ??0ReaderMutexLock@absl@@QEAA@AEAVMutex@1@@Z + ??0RefcountAndFlags@cord_internal@absl@@QEAA@XZ + ??0RefcountedRep@CrcCordState@crc_internal@absl@@QEAA@XZ + ??0Rep@CordBuffer@absl@@QEAA@PEAUCordRepFlat@cord_internal@2@@Z + ??0Rep@CordBuffer@absl@@QEAA@XZ + ??0Rep@CrcCordState@crc_internal@absl@@QEAA@XZ + ??0Rep@GraphCycles@synchronization_internal@absl@@QEAA@XZ + ??0Rep@InlineData@cord_internal@absl@@QEAA@W4DefaultInitType@123@@Z + ??0Rep@InlineData@cord_internal@absl@@QEAA@XZ + ??0SavedValue@FlagState@flags_internal@absl@@QEAA@PEAX@Z + ??0SavedValue@FlagState@flags_internal@absl@@QEAA@_J@Z + ??0SchedulingHelper@base_internal@absl@@QEAA@W4SchedulingMode@12@@Z + ??0ScopedDisable@SchedulingGuard@base_internal@absl@@QEAA@XZ + ??0ScopedEnable@SchedulingGuard@base_internal@absl@@QEAA@XZ + ??0ScopedMinLogLevel@log_internal@absl@@QEAA@W4LogSeverityAtLeast@2@@Z + ??0ScopedStderrThreshold@absl@@QEAA@W4LogSeverityAtLeast@1@@Z + ??0ShiftState@strings_internal@absl@@QEAA@XZ + ??0SpinLock@base_internal@absl@@QEAA@W4SchedulingMode@12@@Z + ??0SpinLock@base_internal@absl@@QEAA@XZ + ??0SpinLockHolder@base_internal@absl@@QEAA@AEAVSpinLock@12@@Z + ??0Status@absl@@AEAA@_K@Z + ??0Status@absl@@QEAA@$$QEAV01@@Z + ??0Status@absl@@QEAA@AEBV01@@Z + ??0Status@absl@@QEAA@W4StatusCode@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0StatusRep@status_internal@absl@@QEAA@W4StatusCode@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@56@@Z + ??0StdcppWaiter@synchronization_internal@absl@@QEAA@XZ + ??0Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAA@_KAEBV?$allocator@D@__Cr@std@@@Z + ??0Streamable@str_format_internal@absl@@QEAA@AEBVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ??0StringifySink@detect_specialization@log_internal@absl@@QEAA@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0StringifySink@strings_internal@absl@@QEAA@XZ + ??0SynchWaitParams@absl@@QEAA@PEBUMuHowS@1@PEBVCondition@1@VKernelTimeout@synchronization_internal@1@PEAVMutex@1@PEAUPerThreadSynch@base_internal@1@PEAU?$atomic@_J@__Cr@std@@@Z + ??0Time@absl@@AEAA@VDuration@1@@Z + ??0Time@absl@@QEAA@XZ + ??0TimeConversion@absl@@QEAA@XZ + ??0TimeInfo@TimeZone@absl@@QEAA@XZ + ??0TimeZone@absl@@QEAA@Vtime_zone@cctz@time_internal@1@@Z + ??0TimeZoneIf@cctz@time_internal@absl@@IEAA@XZ + ??0TimeZoneInfo@cctz@time_internal@absl@@AEAA@XZ + ??0TimeZoneLibC@cctz@time_internal@absl@@AEAA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??0Transition@cctz@time_internal@absl@@QEAA@XZ + ??0TransitionType@cctz@time_internal@absl@@QEAA@XZ + ??0U@?1??Get@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@AEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ@QEAA@XZ + ??0UnboundConversion@str_format_internal@absl@@QEAA@XZ + ??0UnrecognizedFlag@absl@@QEAA@$$QEAU01@@Z + ??0UnrecognizedFlag@absl@@QEAA@AEBU01@@Z + ??0UnrecognizedFlag@absl@@QEAA@W4Source@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0UntypedFormatSpec@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0UntypedFormatSpecImpl@str_format_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0Utf8ForCodePoint@debugging_internal@absl@@QEAA@_K@Z + ??0ViableSubstitution@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0_K@Z + ??0Win32Waiter@synchronization_internal@absl@@QEAA@XZ + ??0WriterMutexLock@absl@@QEAA@AEAVMutex@1@@Z + ??0ZoneInfoSource@cctz@time_internal@absl@@QEAA@XZ + ??0_ConstructTransaction@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@PEAV123@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ??0_ConstructTransaction@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@PEAV123@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ??0_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@PEAV123@PEAUTransition@cctz@time_internal@absl@@_K@Z + ??0_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@PEAV123@PEAUTransitionType@cctz@time_internal@absl@@_K@Z + ??0_ConstructTransaction@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAV123@AEAU__deque_block_range@123@@Z + ??0_ConstructTransaction@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0__deque_block_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??0__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@0@Z + ??0__destroy_vector@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z + ??0__destroy_vector@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z + ??0__destroy_vector@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z + ??0__destroy_vector@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z + ??0__destroy_vector@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z + ??0__destroy_vector@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z + ??0__destroy_vector@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z + ??0__destroy_vector@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV123@@Z + ??0__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@@Z + ??0__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@@Z + ??0absolute_lookup@time_zone@cctz@time_internal@absl@@QEAA@XZ + ??0civil_lookup@time_zone@cctz@time_internal@absl@@QEAA@XZ + ??0civil_transition@time_zone@cctz@time_internal@absl@@QEAA@XZ + ??0const_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA@Viterator@123@@Z + ??0crc32c_t@absl@@QEAA@I@Z + ??0fields@detail@cctz@time_internal@absl@@QEAA@_JCCCCC@Z + ??0int128@absl@@AEAA@_J_K@Z + ??0int128@absl@@QEAA@H@Z + ??0int128@absl@@QEAA@M@Z + ??0int128@absl@@QEAA@N@Z + ??0int128@absl@@QEAA@O@Z + ??0iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA@PEAW4ctrl_t@23@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@PEBE@Z + ??0iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA@PEAW4ctrl_t@23@T?$MaybeInitializedPtr@X@23@PEBE@Z + ??0iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA@PEBE@Z + ??0once_flag@absl@@QEAA@XZ + ??0time_zone@cctz@time_internal@absl@@AEAA@PEBVImpl@0123@@Z + ??0time_zone@cctz@time_internal@absl@@QEAA@XZ + ??0uint128@absl@@AEAA@_K0@Z + ??0uint128@absl@@QEAA@H@Z + ??0uint128@absl@@QEAA@I@Z + ??0uint128@absl@@QEAA@M@Z + ??0uint128@absl@@QEAA@N@Z + ??0uint128@absl@@QEAA@O@Z + ??0uint128@absl@@QEAA@Vint128@1@@Z + ??0uint128@absl@@QEAA@_J@Z + ??0uint128@absl@@QEAA@_K@Z + ??1?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??1?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??1?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??1?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAA@XZ + ??1?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAA@XZ + ??1?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEAA@XZ + ??1?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAA@XZ + ??1?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QEAA@XZ + ??1?$Sample@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAA@XZ + ??1?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@XZ + ??1?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@XZ + ??1?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEAA@XZ + ??1?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEAA@XZ + ??1?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??1?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??1?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??1?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??1?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@QEAA@XZ + ??1?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@QEAA@XZ + ??1?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA@XZ + ??1?$__policy_func@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__function@__Cr@std@@QEAA@XZ + ??1?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEAA@XZ + ??1?$__policy_func@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAA@XZ + ??1?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@absl@@QEAA@XZ + ??1?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__Cr@std@@QEAA@XZ + ??1?$function@$$A6AXAEAVCommandLineFlag@absl@@@Z@__Cr@std@@QEAA@XZ + ??1?$function@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__Cr@std@@QEAA@XZ + ??1?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAA@XZ + ??1?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@QEAA@XZ + ??1?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$raw_hash_map@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA@XZ + ??1?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA@XZ + ??1?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@UThreadIdentity@base_internal@absl@@P6AXPEAX@Z@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEAA@XZ + ??1?$unordered_set@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA@XZ + ??1?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1BadStatusOrAccess@absl@@UEAA@XZ + ??1BestHints@flags_internal@absl@@QEAA@XZ + ??1ByAnyChar@absl@@QEAA@XZ + ??1CRC32@crc_internal@absl@@UEAA@XZ + ??1CRC@crc_internal@absl@@UEAA@XZ + ??1CRCImpl@crc_internal@absl@@UEAA@XZ + ??1CheckOpMessageBuilder@log_internal@absl@@QEAA@XZ + ??1Cord@absl@@QEAA@XZ + ??1CordBuffer@absl@@QEAA@XZ + ??1CordRepCrc@cord_internal@absl@@QEAA@XZ + ??1CordzHandle@cord_internal@absl@@MEAA@XZ + ??1CordzInfo@cord_internal@absl@@EEAA@XZ + ??1CordzUpdateScope@cord_internal@absl@@QEAA@XZ + ??1CrcCordState@crc_internal@absl@@QEAA@XZ + ??1CrcMemcpyEngine@crc_internal@absl@@UEAA@XZ + ??1ErrnoSaver@base_internal@absl@@QEAA@XZ + ??1FallbackCrcMemcpyEngine@crc_internal@absl@@UEAA@XZ + ??1FlagSaver@absl@@QEAA@XZ + ??1FlagSaverImpl@flags_internal@absl@@QEAA@XZ + ??1FlagState@flags_internal@absl@@UEAA@XZ + ??1FlagStateInterface@flags_internal@absl@@UEAA@XZ + ??1FlagsUsageConfig@absl@@QEAA@XZ + ??1FormatSinkImpl@str_format_internal@absl@@QEAA@XZ + ??1GraphCycles@synchronization_internal@absl@@QEAA@XZ + ??1HashtablezInfo@container_internal@absl@@QEAA@XZ + ??1Impl@time_zone@cctz@time_internal@absl@@QEAA@XZ + ??1LeakCheckDisabler@absl@@QEAA@XZ + ??1LockHolder@synchronization_internal@absl@@QEAA@XZ + ??1LogEntry@absl@@QEAA@XZ + ??1LogMessage@log_internal@absl@@QEAA@XZ + ??1LogMessageData@LogMessage@log_internal@absl@@QEAA@XZ + ??1LogMessageDebugFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageQuietlyDebugFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageQuietlyFatal@log_internal@absl@@QEAA@XZ + ??1LogSink@absl@@UEAA@XZ + ??1Mutex@absl@@QEAA@XZ + ??1MutexLock@absl@@QEAA@XZ + ??1Notification@absl@@QEAA@XZ + ??1OstreamView@LogMessage@log_internal@absl@@UEAA@XZ + ??1Payload@status_internal@absl@@QEAA@XZ + ??1PosixTimeZone@cctz@time_internal@absl@@QEAA@XZ + ??1ReaderMutexLock@absl@@QEAA@XZ + ??1RefcountedRep@CrcCordState@crc_internal@absl@@QEAA@XZ + ??1Rep@CrcCordState@crc_internal@absl@@QEAA@XZ + ??1Rep@GraphCycles@synchronization_internal@absl@@QEAA@XZ + ??1SchedulingHelper@base_internal@absl@@QEAA@XZ + ??1ScopedDisable@SchedulingGuard@base_internal@absl@@QEAA@XZ + ??1ScopedEnable@SchedulingGuard@base_internal@absl@@QEAA@XZ + ??1ScopedMinLogLevel@log_internal@absl@@QEAA@XZ + ??1ScopedStderrThreshold@absl@@QEAA@XZ + ??1SeedGenException@absl@@UEAA@XZ + ??1SpinLockHolder@base_internal@absl@@QEAA@XZ + ??1Status@absl@@QEAA@XZ + ??1StatusRep@status_internal@absl@@QEAA@XZ + ??1Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAA@XZ + ??1Streamable@str_format_internal@absl@@QEAA@XZ + ??1StringifySink@strings_internal@absl@@QEAA@XZ + ??1TimeZoneIf@cctz@time_internal@absl@@UEAA@XZ + ??1TimeZoneInfo@cctz@time_internal@absl@@UEAA@XZ + ??1TimeZoneLibC@cctz@time_internal@absl@@UEAA@XZ + ??1U@?1??Get@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@AEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ@QEAA@XZ + ??1UnrecognizedFlag@absl@@QEAA@XZ + ??1WriterMutexLock@absl@@QEAA@XZ + ??1ZoneInfoSource@cctz@time_internal@absl@@UEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??4?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAV012@AEBV012@@Z + ??4?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAV012@$$QEAV012@@Z + ??4BadStatusOrAccess@absl@@QEAAAEAV01@$$QEAV01@@Z + ??4BadStatusOrAccess@absl@@QEAAAEAV01@AEBV01@@Z + ??4Cord@absl@@QEAAAEAV01@$$QEAV01@@Z + ??4Cord@absl@@QEAAAEAV01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??4CordzUpdateTracker@cord_internal@absl@@QEAAAEAV012@AEBV012@@Z + ??4CrcCordState@crc_internal@absl@@QEAAAEAV012@$$QEAV012@@Z + ??4CrcCordState@crc_internal@absl@@QEAAAEAV012@AEBV012@@Z + ??4FlagsUsageConfig@absl@@QEAAAEAU01@AEBU01@@Z + ??4HiRep@Duration@absl@@QEAAAEAV012@_J@Z + ??4InlineData@cord_internal@absl@@QEAAAEAV012@AEBV012@@Z + ??4InlineRep@Cord@absl@@QEAAAEAV012@$$QEAV012@@Z + ??4Payload@status_internal@absl@@QEAAAEAU012@$$QEAU012@@Z + ??4Rep@CrcCordState@crc_internal@absl@@QEAAAEAU0123@AEBU0123@@Z + ??4Status@absl@@QEAAAEAV01@$$QEAV01@@Z + ??4Status@absl@@QEAAAEAV01@AEBV01@@Z + ??4int128@absl@@QEAAAEAV01@H@Z + ??4uint128@absl@@QEAAAEAV01@H@Z + ??4uint128@absl@@QEAAAEAV01@_J@Z + ??4uint128@absl@@QEAAAEAV01@_K@Z + ??5absl@@YA?AVuint128@0@V10@H@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@AEBV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@H@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@P6AAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV345@@Z@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@P6AAEAVios_base@__Cr@std@@AEAV345@@Z@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@_W@Z + ??6absl@@YA?AVuint128@0@V10@H@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@AEBVCord@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@AEBVStatus@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@VTime@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vcrc32c_t@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vint128@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vuint128@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverity@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverityAtLeast@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverityAtMost@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4StatusCode@0@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@W4weekday@0123@@Z + ??6log_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@UUnprintableWrapper@01@@Z + ??6str_format_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@AEBVStreamable@01@@Z + ??6str_format_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@W4FormatConversionChar@1@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@01@@Z + ??7absl@@YA_NVuint128@0@@Z + ??8CharIterator@Cord@absl@@QEBA_NAEBV012@@Z + ??8ChunkIterator@Cord@absl@@QEBA_NAEBV012@@Z + ??8GraphId@synchronization_internal@absl@@QEBA_NAEBU012@@Z + ??8StatusRep@status_internal@absl@@QEBA_NAEBV012@@Z + ??8__Cr@std@@YA_NAEBU__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__hash_map_const_iterator@V?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@01@0@Z + ??8absl@@YA_NAEBVCord@0@0@Z + ??8absl@@YA_NAEBVCord@0@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??8absl@@YA_NVDuration@0@0@Z + ??8absl@@YA_NVTime@0@0@Z + ??8absl@@YA_NVint128@0@0@Z + ??8absl@@YA_NVuint128@0@0@Z + ??8container_internal@absl@@YA_NAEBVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@0@Z + ??8container_internal@absl@@YA_NAEBViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@0@Z + ??8cord_internal@absl@@YA_NAEBVInlineData@01@0@Z + ??8strings_internal@absl@@YA_NAEBV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??8strings_internal@absl@@YA_NAEBV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??8strings_internal@absl@@YA_NAEBV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??9CharIterator@Cord@absl@@QEBA_NAEBV012@@Z + ??9ChunkIterator@Cord@absl@@QEBA_NAEBV012@@Z + ??9GraphId@synchronization_internal@absl@@QEBA_NAEBU012@@Z + ??9__Cr@std@@YA_NAEBU__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@01@0@Z + ??9__Cr@std@@YA_NAEBV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@01@0@Z + ??9__Cr@std@@YA_NAEBV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@01@0@Z + ??9__Cr@std@@YA_NAEBV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@01@0@Z + ??9__Cr@std@@YA_NAEBV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@01@0@Z + ??9absl@@YA_NAEBVCord@0@0@Z + ??9absl@@YA_NVint128@0@0@Z + ??9absl@@YA_NVuint128@0@0@Z + ??9container_internal@absl@@YA_NAEBV?$BitMask@_K$07$02$00@01@0@Z + ??9container_internal@absl@@YA_NAEBV?$BitMask@_K$07$02$0A@@01@0@Z + ??9container_internal@absl@@YA_NAEBViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@0@Z + ??9strings_internal@absl@@YA_NAEBV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??9strings_internal@absl@@YA_NAEBV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??9strings_internal@absl@@YA_NAEBV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??A?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAAEAD_K@Z + ??A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAAEAUPayload@status_internal@1@_K@Z + ??A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBAAEBUPayload@status_internal@1@_K@Z + ??A?$Span@$$CBD@absl@@QEBAAEBD_K@Z + ??A?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAAEBVFormatArgImpl@str_format_internal@1@_K@Z + ??A?$Span@D@absl@@QEBAAEAD_K@Z + ??A?$Span@I@absl@@QEBAAEAI_K@Z + ??A?$__farray@P6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03@__Cr@std@@QEBAAEBQ6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@12@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@612@@Z_K@Z + ??A?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@$0BA@@__Cr@std@@QEAAAEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@AEBV567@@Z@_K@Z + ??A?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEBUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ??A?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@12@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??A?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??A?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@_K@Z + ??A?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@_K@Z + ??A?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??A?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@_K@Z + ??A?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEBUTransition@cctz@time_internal@absl@@_K@Z + ??A?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransitionType@cctz@time_internal@absl@@_K@Z + ??A?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEBUTransitionType@cctz@time_internal@absl@@_K@Z + ??A?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@_K@Z + ??ACord@absl@@QEBAD_K@Z + ??B?$FlagRegistrar@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$00@flags_internal@absl@@QEBA?AUFlagRegistrarEmpty@12@XZ + ??B?$NonIterableBitMask@_K$07$02@container_internal@absl@@QEBA_NXZ + ??B?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@QEBAPEAVCordzHandle@cord_internal@absl@@XZ + ??B?$__policy_func@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEBA_NXZ + ??B?$function@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__Cr@std@@QEBA_NXZ + ??B?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ??B?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ??B?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ??B?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ??B?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEBA_NXZ + ??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ??BCordRepBtreeReader@cord_internal@absl@@QEBA_NXZ + ??BTimeZone@absl@@QEBA?AVtime_zone@cctz@time_internal@1@XZ + ??Bcrc32c_t@absl@@QEBAIXZ + ??Bint128@absl@@QEBADXZ + ??Bint128@absl@@QEBANXZ + ??Bint128@absl@@QEBA_JXZ + ??Bint128@absl@@QEBA_WXZ + ??Braw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV234@@Z@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@67@XZ + ??Buint128@absl@@QEBADXZ + ??Buint128@absl@@QEBAEXZ + ??Buint128@absl@@QEBAIXZ + ??Buint128@absl@@QEBANXZ + ??Buint128@absl@@QEBA_KXZ + ??Buint128@absl@@QEBA_NXZ + ??Buint128@absl@@QEBA_WXZ + ??C?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAAPEAURefcountedRep@CrcCordState@crc_internal@1@XZ + ??C?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBAPEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??C?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEBAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??C?$__hash_map_const_iterator@V?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBAPEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??C?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@QEBAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@XZ + ??C?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@QEBAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@XZ + ??C?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ??C?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@12@XZ + ??C?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@12@XZ + ??C?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAULogMessageData@LogMessage@log_internal@absl@@XZ + ??C?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ??C?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAVTimeZoneIf@cctz@time_internal@absl@@XZ + ??C?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAVTimeZoneInfo@cctz@time_internal@absl@@XZ + ??CChunkIterator@Cord@absl@@QEBAPEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??Citerator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBAPEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@XZ + ??D?$BitMask@_K$07$02$00@container_internal@absl@@QEBAIXZ + ??D?$BitMask@_K$07$02$0A@@container_internal@absl@@QEBAIXZ + ??D?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAAAEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@1@XZ + ??D?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAAAEAVFlagRegistry@flags_internal@1@XZ + ??D?$NoDestructor@VMutex@absl@@@absl@@QEAAAEAVMutex@1@XZ + ??D?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??D?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??D?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??D?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@__Cr@std@@QEBAAEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ??D?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@QEBAAEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ??D?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@QEBAAEBUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ??D?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEBAAEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??D?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEBAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??D?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??D?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEBAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@XZ + ??D?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEBAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@XZ + ??D?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@QEBAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@XZ + ??D?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@QEBAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@XZ + ??D?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@QEBAAEAPEAVCommandLineFlag@absl@@XZ + ??D?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEBAAEAPEAVCordzHandle@cord_internal@absl@@XZ + ??D?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@QEBAAEAPEAVLogSink@absl@@XZ + ??D?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@QEBAAEAPEBVCommandLineFlag@absl@@XZ + ??D?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@QEBAAEAUTransition@cctz@time_internal@absl@@XZ + ??D?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEBAAEAUTransitionType@cctz@time_internal@absl@@XZ + ??D?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@__Cr@std@@QEBAAEAUUnrecognizedFlag@absl@@XZ + ??D?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@QEBAAEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@AEBV567@@Z@XZ + ??D?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@XZ + ??D?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QEBAAEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ??D?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@__Cr@std@@QEBAAEBUUnrecognizedFlag@absl@@XZ + ??D?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEBA$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ??D?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@__Cr@std@@QEBA$$QEAPEAUCordRep@cord_internal@absl@@XZ + ??D?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEBA$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ??D?$move_iterator@PEAPEAVLogSink@absl@@@__Cr@std@@QEBA$$QEAPEAVLogSink@absl@@XZ + ??D?$move_iterator@PEAUPayload@status_internal@absl@@@__Cr@std@@QEBA$$QEAUPayload@status_internal@absl@@XZ + ??D?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@QEBA$$QEAUTransition@cctz@time_internal@absl@@XZ + ??D?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEBA$$QEAUTransitionType@cctz@time_internal@absl@@XZ + ??D?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@12@XZ + ??D?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@12@XZ + ??D?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEAULogMessageData@LogMessage@log_internal@absl@@XZ + ??D?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEBAAEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ??D?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@XZ + ??D?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@XZ + ??D?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEAVFlagStateInterface@flags_internal@absl@@XZ + ??DChunkIterator@Cord@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??D__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AU__deque_block_range@123@XZ + ??Dabsl@@YA?AVint128@0@V10@0@Z + ??Dabsl@@YA?AVuint128@0@V10@0@Z + ??Diterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBAAEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@XZ + ??E?$BitMask@_K$07$02$00@container_internal@absl@@QEAAAEAV012@XZ + ??E?$BitMask@_K$07$02$0A@@container_internal@absl@@QEAAAEAV012@XZ + ??E?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAAAEAV012@XZ + ??E?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAAAEAV012@XZ + ??E?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAAAEAV012@XZ + ??E?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@QEAAAEAV012@XZ + ??E?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$move_iterator@PEAPEAVLogSink@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$move_iterator@PEAUPayload@status_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??EChunkIterator@Cord@absl@@QEAAAEAV012@XZ + ??E__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAU0123@XZ + ??Eiterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAAAEAV0123@XZ + ??Euint128@absl@@QEAAAEAV01@XZ + ??F?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@QEAAAEAV012@XZ + ??G__Cr@std@@YA_JAEBV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0@Z + ??Gabsl@@YA?AVDuration@0@V10@0@Z + ??Gabsl@@YA?AVDuration@0@V10@@Z + ??Gabsl@@YA?AVDuration@0@VTime@0@0@Z + ??Gabsl@@YA?AVint128@0@V10@0@Z + ??Gabsl@@YA?AVint128@0@V10@@Z + ??Gabsl@@YA?AVuint128@0@V10@0@Z + ??Gabsl@@YA?AVuint128@0@V10@@Z + ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??H?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@QEBA?AV012@_J@Z + ??H?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@QEBA?AV012@_J@Z + ??H?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@QEBA?AV012@_J@Z + ??H?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@QEBA?AV012@_J@Z + ??Habsl@@YA?AVDuration@0@V10@0@Z + ??Habsl@@YA?AVTime@0@V10@VDuration@0@@Z + ??Habsl@@YA?AVint128@0@V10@0@Z + ??Habsl@@YA?AVuint128@0@V10@0@Z + ??Hdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Hdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Iabsl@@YA?AVuint128@0@V10@0@Z + ??Iabsl@@YA?AW4StatusToStringMode@0@W410@0@Z + ??Iabsl@@YA?AW4chars_format@0@W410@0@Z + ??Kabsl@@YA?AVint128@0@V10@0@Z + ??Kabsl@@YA?AVuint128@0@V10@0@Z + ??Kabsl@@YA_JVDuration@0@0@Z + ??Labsl@@YA?AVDuration@0@V10@0@Z + ??Labsl@@YA?AVint128@0@V10@0@Z + ??Labsl@@YA?AVuint128@0@V10@0@Z + ??Mabsl@@YA_NVDuration@0@0@Z + ??Mabsl@@YA_NVint128@0@0@Z + ??Mabsl@@YA_NVuint128@0@0@Z + ??Mabsl@@YA_NW4LogSeverity@0@W4LogSeverityAtLeast@0@@Z + ??Nabsl@@YA_NVDuration@0@0@Z + ??Nabsl@@YA_NVint128@0@0@Z + ??Oabsl@@YA_NVDuration@0@0@Z + ??Oabsl@@YA_NVint128@0@0@Z + ??Oabsl@@YA_NVuint128@0@0@Z + ??Pabsl@@YA_NVDuration@0@0@Z + ??Pabsl@@YA_NVint128@0@0@Z + ??Pabsl@@YA_NVuint128@0@0@Z + ??R@?0???$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@23@_K@Z@QEBA?A?@@XZ + ??R@?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@QEBA?A?@@PEAD0@Z + ??R@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@45@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@UNoFormatter@12@@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBQEBUCordRep@cord_internal@absl@@@Z@QEBA?A?@@00@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@67@@Z@QEBA?A?@@XZ + ??R@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@67@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV723@AEA_K@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QEAV423@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z@QEBA?A?@@XZ + ??R@?0???A?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAAEAD_K@Z@QEBA?A?@@XZ + ??R@?0???A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAAEAUPayload@status_internal@2@_K@Z@QEBA?A?@@XZ + ??R@?0???A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBAAEBUPayload@status_internal@2@_K@Z@QEBA?A?@@XZ + ??R@?0???A?$Span@$$CBD@absl@@QEBAAEBD_K@Z@QEBA?A?@@XZ + ??R@?0???A?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAAEBVFormatArgImpl@str_format_internal@2@_K@Z@QEBA?A?@@XZ + ??R@?0???A?$Span@D@absl@@QEBAAEAD_K@Z@QEBA?A?@@XZ + ??R@?0???A?$Span@I@absl@@QEBAAEAI_K@Z@QEBA?A?@@XZ + ??R@?0???CChunkIterator@Cord@absl@@QEBAPEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ@QEBA?A?@@XZ + ??R@?0???DChunkIterator@Cord@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ@QEBA?A?@@XZ + ??R@?0???EChunkIterator@Cord@absl@@QEAAAEAV123@XZ@QEBA?A?@@XZ + ??R@?0???R0?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@QEBA?A?@@PEAD0@Z@QEBA?A?6@XZ + ??R@?0??Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z@QEBA?A?@@0@Z + ??R@?0??AssertIsValidForComparison@container_internal@absl@@YAXPEBW4ctrl_t@23@EPEBE@Z@QEBA?A?@@XZ + ??R@?0??AssertSameContainer@container_internal@absl@@YAXPEBW4ctrl_t@23@0AEBQEBX1PEBE2@Z@QEBA?A?@@_NPEBD@Z + ??R@?0??CompareSlowPath@Cord@absl@@AEBAHAEBV23@_K1@Z@QEBA?A?@@PEAVChunkIterator@23@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??R@?0??CompareSlowPath@Cord@absl@@AEBAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K1@Z@QEBA?A?@@PEAVChunkIterator@23@PEAV456@@Z + ??R@?0??InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXAEBV234@@Z@QEBA?A?@@XZ + ??R@?0??InlinedRepToCode@Status@absl@@CA?AW4StatusCode@3@_K@Z@QEBA?A?@@XZ + ??R@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@QEBA?A?@@AEAVCommandLineFlag@4@@Z + ??R@?0??SetLength@CordBuffer@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??SubtractSize@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??SubtractSize@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAAEAPEAUCordRep@cord_internal@3@XZ@QEBA?A?@@XZ + ??R@?0??destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@Z@QEBA?A?@@XZ + ??R@?0??erase@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@@Z@QEBA?A?@@XZ + ??R@?0??inline_size@Rep@InlineData@cord_internal@absl@@QEBA_KXZ@QEBA?A?@@XZ + ??R@?0??pop_back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAXXZ@QEBA?A?@@XZ + ??R@?0??remove_prefix@?$Span@$$CBD@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??remove_prefix@?$Span@D@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??remove_suffix@?$Span@$$CBD@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??remove_suffix@?$Span@D@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??set_inline_data@InlineData@cord_internal@absl@@QEAAXPEBD_K@Z@QEBA?A?@@XZ + ??R@?0??set_inline_size@Rep@InlineData@cord_internal@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@0@Z@QEBA?A?@@XZ + ??R@?0???$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@23@_K@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV723@AEA_K@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QEAV423@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z@QEBA?A?@@XZ + ??R@?0??AssertSameContainer@container_internal@absl@@YAXPEBW4ctrl_t@23@0AEBQEBX1PEBE2@Z@QEBA?A?@@XZ + ??R@?0??erase@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@@Z@QEBA?A?@@XZ + ??R?$ConvertToContainer@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z + ??R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z + ??R?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@absl@@QEBAXPEAUCordRep@cord_internal@1@_K1@Z + ??R?$FunctionRef@$$A6AXPEAXPEBX@Z@absl@@QEBAXPEAXPEBX@Z + ??R?$FunctionRef@$$A6AXPEBW4ctrl_t@container_internal@absl@@PEAX@Z@absl@@QEBAXPEBW4ctrl_t@container_internal@1@PEAX@Z + ??R?$FunctionRef@$$A6AXV?$Span@I@absl@@@Z@absl@@QEBAXV?$Span@I@1@@Z + ??R?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z@absl@@QEBAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??R?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCord@absl@@@Z@absl@@QEBAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCord@1@@Z + ??R?$FunctionRef@$$A6A_K_K@Z@absl@@QEBA_K_K@Z + ??R?$HashImpl@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@hash_internal@absl@@QEBA_KAEBV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@Z + ??R?$HashImpl@V?$tuple@AEB_K@__Cr@std@@@hash_internal@absl@@QEBA_KAEBV?$tuple@AEB_K@__Cr@std@@@Z + ??R?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@QEBA_K_K@Z + ??R?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@__Cr@std@@QEAAXPEBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??R?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??R?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??R?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@@Z + ??R?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??R?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@12@@Z + ??R?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@12@@Z + ??R?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@X@__Cr@std@@QEBA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@@Z + ??R?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@X@__Cr@std@@QEBA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@@Z + ??R?$__policy_func@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__function@__Cr@std@@QEBA?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@23@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??R?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEBAXAEAVCommandLineFlag@absl@@@Z + ??R?$__policy_func@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEBA_NAEBVCommandLineFlag@absl@@@Z + ??R?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@@Z + ??R?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@@Z + ??R?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEBA_NAEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEBA_KAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEBAXPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??R?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@QEBAXPEAULogMessageData@LogMessage@log_internal@absl@@@Z + ??R?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@QEBAXPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z + ??R?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@QEBAXPEAVFallbackCrcMemcpyEngine@crc_internal@absl@@@Z + ??R?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@QEBAXPEAVFlagState@flags_internal@absl@@@Z + ??R?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@QEBAXPEAVFlagStateInterface@flags_internal@absl@@@Z + ??R?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@QEBAXPEAVTimeZoneIf@cctz@time_internal@absl@@@Z + ??R?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@QEBAXPEAVTimeZoneInfo@cctz@time_internal@absl@@@Z + ??R?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@QEBAXPEAVTimeZoneLibC@cctz@time_internal@absl@@@Z + ??R?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@QEBAXPEAVZoneInfoSource@cctz@time_internal@absl@@@Z + ??R?$divides@Vuint128@absl@@@__Cr@std@@QEBA?AVuint128@absl@@AEBV34@0@Z + ??R?$equal_to@PEBUCordRep@cord_internal@absl@@@__Cr@std@@QEBA_NAEBQEBUCordRep@cord_internal@absl@@0@Z + ??R?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__Cr@std@@QEBA?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$function@$$A6AXAEAVCommandLineFlag@absl@@@Z@__Cr@std@@QEBAXAEAVCommandLineFlag@absl@@@Z + ??R?$function@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__Cr@std@@QEBA_NAEBVCommandLineFlag@absl@@@Z + ??R?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@QEBA_KPEBUCordRep@cord_internal@absl@@@Z + ??RAllowEmpty@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??RBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@23@@Z@QEAA_KV?$Span@$$CBD@3@@Z + ??RBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@23@@Z@QEAA_KV?$variant@IHM@__Cr@std@@@Z + ??RBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@23@@Z@QEAA_KV?$variant@_K_JIH_N@__Cr@std@@@Z + ??RBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@23@@Z@QEAA_KV?$variant@_K_JN@__Cr@std@@@Z + ??RByCivilTime@Transition@cctz@time_internal@absl@@QEBA_NAEBU1234@0@Z + ??RByUnixTime@Transition@cctz@time_internal@absl@@QEBA_NAEBU1234@0@Z + ??RDynValueDeleter@flags_internal@absl@@QEBAXPEAX@Z + ??RErrnoSaver@base_internal@absl@@QEBAHXZ + ??RSkipEmpty@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??RStringEq@container_internal@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ??R__destroy_vector@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z + ??Sabsl@@YA?AVuint128@0@V10@@Z + ??Tabsl@@YA?AVuint128@0@V10@0@Z + ??Uabsl@@YA?AVuint128@0@V10@0@Z + ??Ustr_format_internal@absl@@YA?AW4Flags@01@W4201@0@Z + ??XDuration@absl@@QEAAAEAV01@N@Z + ??XDuration@absl@@QEAAAEAV01@_J@Z + ??Xint128@absl@@QEAAAEAV01@V01@@Z + ??Xuint128@absl@@QEAAAEAV01@V01@@Z + ??Y?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@QEAAAEAV012@_J@Z + ??Y?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@QEAAAEAV012@_J@Z + ??Y?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@QEAAAEAV012@_J@Z + ??Y?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@QEAAAEAV012@_J@Z + ??Y?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@QEAAAEAV012@_J@Z + ??Y?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@QEAAAEAV012@_J@Z + ??YDuration@absl@@QEAAAEAV01@V01@@Z + ??YTime@absl@@QEAAAEAV01@VDuration@1@@Z + ??Yint128@absl@@QEAAAEAV01@V01@@Z + ??Yuint128@absl@@QEAAAEAV01@V01@@Z + ??Z?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAAAEAV01234@_J@Z + ??ZDuration@absl@@QEAAAEAV01@V01@@Z + ??Zint128@absl@@QEAAAEAV01@V01@@Z + ??Zuint128@absl@@QEAAAEAV01@V01@@Z + ??_0Duration@absl@@QEAAAEAV01@N@Z + ??_0Duration@absl@@QEAAAEAV01@_J@Z + ??_0uint128@absl@@QEAAAEAV01@V01@@Z + ??_1Duration@absl@@QEAAAEAV01@V01@@Z + ??_2uint128@absl@@QEAAAEAV01@H@Z + ??_3uint128@absl@@QEAAAEAV01@H@Z + ??_4uint128@absl@@QEAAAEAV01@V01@@Z + ??_5uint128@absl@@QEAAAEAV01@V01@@Z + ??_6uint128@absl@@QEAAAEAV01@V01@@Z + ?AbortedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbsDuration@absl@@YA?AVDuration@1@V21@@Z + ?AbslFormatFlush@detect_specialization@log_internal@absl@@YAXPEAVStringifySink@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslFormatFlush@str_format_internal@absl@@YAXPEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?AbslFormatFlush@str_format_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?AbslFormatFlush@str_format_internal@absl@@YAXPEAVBufferRawSink@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslFormatFlush@str_format_internal@absl@@YAXPEAVFILERawSink@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVDuration@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAW4LogSeverity@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAFPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAGPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAIPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAJPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAKPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAMPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEANPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@1@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@45@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVint128@2@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVuint128@2@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_JPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_KPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_NPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LogSeverity@1@@Z + ?AbslUnparseFlag@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@45@@Z + ?AbslUnparseFlag@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@12@@Z + ?Absorb@RandenHwAes@random_internal@absl@@SAXPEBXPEAX@Z + ?Absorb@RandenSlow@random_internal@absl@@SAXPEBXPEAX@Z + ?AddHint@BestHints@flags_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z + ?AddLogSink@log_internal@absl@@YAXPEAVLogSink@2@@Z + ?AddResult@int128_internal@absl@@YA?AVuint128@2@V32@0@Z + ?AddSize@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z + ?AddSize@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z + ?AddSize@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z + ?AddSize@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z + ?AddWithCarry@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHI@Z + ?AddWithCarry@?$BigUnsigned@$03@strings_internal@absl@@AEAAXH_K@Z + ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHI@Z + ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXH_K@Z + ?AddressIsReadable@debugging_internal@absl@@YA_NPEBX@Z + ?Advance@Cord@absl@@SAXPEAVCharIterator@12@_K@Z + ?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AEAA?AV23@_K@Z + ?AdvanceBtree@ChunkIterator@Cord@absl@@AEAAAEAV123@XZ + ?AdvanceBytes@ChunkIterator@Cord@absl@@AEAAX_K@Z + ?AdvanceBytesBtree@ChunkIterator@Cord@absl@@AEAAX_K@Z + ?AlignBegin@CordRepBtree@cord_internal@absl@@AEAAXXZ + ?AlignEnd@CordRepBtree@cord_internal@absl@@AEAAXXZ + ?AlignUpTo@container_internal@absl@@YA_K_K0@Z + ?Alloc@LowLevelAlloc@base_internal@absl@@SAPEAX_K@Z + ?Alloc@flags_internal@absl@@YAPEAXP6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ?AllocWithArena@LowLevelAlloc@base_internal@absl@@SAPEAX_KPEAUArena@123@@Z + ?Allocate@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAPEAUCordRep@cord_internal@3@_K@Z + ?Allocate@?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAPEAVLogSink@3@_K@Z + ?Allocate@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@_K@Z + ?Allocate@?$MallocAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SA?AU?$Allocation@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@Z + ?Allocate@?$MallocAdapter@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SA?AU?$Allocation@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@23@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@Z + ?Allocate@?$MallocAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SA?AU?$Allocation@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@Z + ?Allocate@?$MallocAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SA?AU?$Allocation@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@Z + ?AllocatedSize@CordRepFlat@cord_internal@absl@@QEBA_KXZ + ?AllocatedSizeToTag@cord_internal@absl@@YAE_K@Z + ?AllocatedSizeToTagUnchecked@cord_internal@absl@@YAE_K@Z + ?AllowsUnprotectedRead@MaskedPointer@flags_internal@absl@@QEBA_NXZ + ?AlreadyExistsError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AlwaysTrue@Condition@absl@@CA_NPEBV12@@Z + ?AnnotateConstruct@NonEmptyInlinedStorage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAX_K@Z + ?AnnotateDestruct@NonEmptyInlinedStorage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAX_K@Z + ?Append@?$AppendUninitializedTraits@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@X@strings_internal@absl@@SAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ?Append@Cord@absl@@QEAAX$$QEAV12@@Z + ?Append@Cord@absl@@QEAAXAEBV12@@Z + ?Append@Cord@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z + ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z + ?Append@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@detect_specialization@log_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@detect_specialization@log_internal@absl@@QEAAX_KD@Z + ?Append@StringifySink@strings_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@strings_internal@absl@@QEAAX_KD@Z + ?AppendArray@InlineRep@Cord@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@3@@Z + ?AppendCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$initializer_list@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@5@@Z + ?AppendPrecise@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?AppendSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z + ?AppendText@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_KV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTruncated@log_internal@absl@@YA_KD_KAEAV?$Span@D@2@@Z + ?AppendTruncated@log_internal@absl@@YA_KV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV?$Span@D@2@@Z + ?AppendTruncated@log_internal@absl@@YA_KV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@AEAV?$Span@D@2@@Z + ?ApplyMask@MaskedPointer@flags_internal@absl@@AEAAX_K@Z + ?ApplySubstitutions@strings_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@45@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AreItersFromSameContainer@container_internal@absl@@YA_NPEBW4ctrl_t@12@0AEBQEBX1@Z + ?AsValueType@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@CAPEADPEAD@Z + ?AsciiStrToLower@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AsciiStrToLower@ascii_internal@absl@@YAXPEADPEBD_K@Z + ?AsciiStrToUpper@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AsciiStrToUpper@ascii_internal@absl@@YAXPEADPEBD_K@Z + ?AssertHeld@CordzInfo@cord_internal@absl@@QEAAXXZ + ?AssertHeld@Mutex@absl@@QEBAXXZ + ?AssertHeld@SpinLock@base_internal@absl@@QEBAXXZ + ?AssertInSooMode@CommonFields@container_internal@absl@@AEBAXXZ + ?AssertIsFull@container_internal@absl@@YAXPEBW4ctrl_t@12@EPEBEPEBD@Z + ?AssertIsValidForComparison@container_internal@absl@@YAXPEBW4ctrl_t@12@EPEBE@Z + ?AssertNotDebugCapacity@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEBAXXZ + ?AssertNotHeld@Mutex@absl@@QEBAXXZ + ?AssertReaderHeld@Mutex@absl@@QEBAXXZ + ?AssertSameContainer@container_internal@absl@@YAXPEBW4ctrl_t@12@0AEBQEBX1PEBE2@Z + ?AssertValid@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@_N@Z + ?AssertValid@CordRepBtree@cord_internal@absl@@SAPEBV123@PEBV123@_N@Z + ?AssertValidType@FlagImpl@flags_internal@absl@@QEBAXPEBXP6APEBVtype_info@@XZ@Z + ?AssignLargeString@Cord@absl@@AEAAAEAV12@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AssignNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXPEAUPayload@status_internal@3@@Z + ?AssignSlow@InlineRep@Cord@absl@@AEAAXAEBV123@@Z + ?AsyncSignalSafeWriteError@raw_log_internal@absl@@YAXPEBD_K@Z + ?At@TimeZone@absl@@QEBA?AUCivilInfo@12@VTime@2@@Z + ?At@TimeZone@absl@@QEBA?AUTimeInfo@12@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@2@@Z + ?AtLocation@LogMessage@log_internal@absl@@QEAAAEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?AtomicBufferValue@FlagImpl@flags_internal@absl@@AEBAPEAU?$atomic@_K@__Cr@std@@XZ + ?Avail@FormatSinkImpl@str_format_internal@absl@@AEBA_KXZ + ?Await@Mutex@absl@@QEAAXAEBVCondition@2@@Z + ?AwaitCommon@Mutex@absl@@AEAA_NAEBVCondition@2@VKernelTimeout@synchronization_internal@2@@Z + ?Base64Escape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?Base64Escape@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?Base64EscapeInternal@strings_internal@absl@@YA_KPEBE_KPEAD1PEBD_N@Z + ?Base64Unescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?Basename@flags_internal@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@@Z + ?BindWithPack@str_format_internal@absl@@YA_NPEBUUnboundConversion@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@PEAVBoundConversion@12@@Z + ?BitCastToSigned@int128_internal@absl@@YA_J_K@Z + ?Block@Barrier@absl@@QEAA_NXZ + ?Block@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?BreakTime@Impl@time_zone@cctz@time_internal@absl@@QEBA?AUabsolute_lookup@2345@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BreakTime@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AUabsolute_lookup@time_zone@234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BreakTime@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AUabsolute_lookup@time_zone@234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BufferSizeFor@log_internal@absl@@YA_K_KW4WireType@12@@Z + ?BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@12@@Z + ?BytesToHexString@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CPUSupportsRandenHwAes@random_internal@absl@@YA_NXZ + ?CUnescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@1@Z + ?CalculateBase64EscapedLenInternal@strings_internal@absl@@YA_K_K_N@Z + ?CallVoidPtrFunction@Condition@absl@@CA_NPEBV12@@Z + ?CancelledError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Capacity@CordRepFlat@cord_internal@absl@@QEBA_KXZ + ?CapacityToGrowth@container_internal@absl@@YA_K_K@Z + ?CappedDamerauLevenshteinDistance@strings_internal@absl@@YAEV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0E@Z + ?CatPieces@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$initializer_list@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@5@@Z + ?Ceil@absl@@YA?AVDuration@1@V21@0@Z + ?CheckDefaultValueParsingRoundtrip@FlagImpl@flags_internal@absl@@EEBAXXZ + ?CheckDefaultValueParsingRoundtrip@PrivateHandleAccessor@flags_internal@absl@@SAXAEBVCommandLineFlag@3@@Z + ?CheckFastPathSetting@str_format_internal@absl@@YA_NAEBUUnboundConversion@12@@Z + ?CheckInvariants@GraphCycles@synchronization_internal@absl@@QEBA_NXZ + ?CheckMask@MaskedPointer@flags_internal@absl@@AEBA_N_K@Z + ?CheckstrcasecmpfalseImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcasecmptrueImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcmpfalseImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcmptrueImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?Checksum@CrcCordState@crc_internal@absl@@QEBA?AVcrc32c_t@3@XZ + ?ChunkRemaining@Cord@absl@@SA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCharIterator@12@@Z + ?Chunks@Cord@absl@@QEBA?AVChunkRange@12@XZ + ?CityHash32@hash_internal@absl@@YAIPEBD_K@Z + ?CityHash64@hash_internal@absl@@YA_KPEBD_K@Z + ?CityHash64WithSeed@hash_internal@absl@@YA_KPEBD_K1@Z + ?CityHash64WithSeeds@hash_internal@absl@@YA_KPEBD_K11@Z + ?Clear@Cord@absl@@QEAAXXZ + ?ClearBackingArray@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@PEAX_N3@Z + ?ClearCurrentThreadIdentity@base_internal@absl@@YAXXZ + ?ClearLogBacktraceLocation@absl@@YAXXZ + ?ClearTimeZoneMapTestOnly@Impl@time_zone@cctz@time_internal@absl@@SAXXZ + ?Clone@flags_internal@absl@@YAPEAXP6APEAXW4FlagOp@12@PEBXPEAX2@Z1@Z + ?CloneAndUnref@StatusRep@status_internal@absl@@QEBAPEAV123@XZ + ?CodeToInlinedRep@Status@absl@@CA_KW4StatusCode@2@@Z + ?CombineContiguousImpl@hash_internal@absl@@YA_K_KPEBE0U?$integral_constant@H$03@__Cr@std@@@Z + ?CombineContiguousImpl@hash_internal@absl@@YA_K_KPEBE0U?$integral_constant@H$07@__Cr@std@@@Z + ?CombineLargeContiguousImplOn32BitLengthGt8@hash_internal@absl@@YA_KPEBE_K1@Z + ?CombineLargeContiguousImplOn64BitLengthGt32@hash_internal@absl@@YA_KPEBE_K1@Z + ?CommitTree@InlineRep@Cord@absl@@QEAAXPEBUCordRep@cord_internal@3@PEAU453@AEBVCordzUpdateScope@53@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?Compare@Cord@absl@@QEBAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?CompareImpl@Cord@absl@@AEBAHAEBV12@@Z + ?CompareSlowPath@Cord@absl@@AEBAHAEBV12@_K1@Z + ?CompareSlowPath@Cord@absl@@AEBAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K1@Z + ?Compute@CrcNonTemporalMemcpyAVXEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?Compute@CrcNonTemporalMemcpyEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?Compute@FallbackCrcMemcpyEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?ComputeCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SA_K_K0@Z + ?ComputeCapacity@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SA_K_K0@Z + ?ConcatCrc32c@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@3@@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@V?$move_iterator@PEAPEAVLogSink@absl@@@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@3@@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@3@@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@3@@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEAVFormatArgImpl@str_format_internal@3@@Z + ?Consume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z + ?ConsumeBeginTo@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@_K1@Z + ?ConsumePrefix@absl@@YA_NPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?ConsumeSuffix@absl@@YA_NPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?ConsumeUnboundConversion@str_format_internal@absl@@YAPEBDPEBD0PEAUUnboundConversion@12@PEAH@Z + ?ConsumeUnboundConversionNoInline@str_format_internal@absl@@YAPEBDPEBD0PEAUUnboundConversion@12@PEAH@Z + ?Contains@Cord@absl@@QEBA_NAEBV12@@Z + ?Contains@Cord@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Contains@str_format_internal@absl@@YA_NW4FormatConversionCharSet@2@D@Z + ?Contains@str_format_internal@absl@@YA_NW4FormatConversionCharSet@2@W4FormatConversionChar@2@@Z + ?ControlOffset@container_internal@absl@@YA_K_N@Z + ?ControlWord@base_internal@absl@@YAPEAU?$atomic@I@__Cr@std@@PEAVonce_flag@2@@Z + ?ConvertBoolArg@str_format_internal@absl@@YA_N_NPEAVFormatSinkImpl@12@@Z + ?ConvertDateTime@absl@@YA?AUTimeConversion@1@_JHHHHHVTimeZone@1@@Z + ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAW4ctrl_t@12@_K@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NMAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NNAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NOAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?ConvertOne@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NAEBUUnboundConversion@34@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ConvertSpecialToEmptyAndFullToDeleted@GroupAArch64Impl@container_internal@absl@@QEBAXPEAW4ctrl_t@23@@Z + ?Copy@CordRepBtree@cord_internal@absl@@AEBAPEAV123@XZ + ?Copy@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@AEBV312@V?$FunctionRef@$$A6AXPEAXPEBX@Z@2@@Z + ?Copy@flags_internal@absl@@YAXP6APEAXW4FlagOp@12@PEBXPEAX2@Z12@Z + ?CopyBeginTo@CordRepBtree@cord_internal@absl@@AEBAPEAV123@_K0@Z + ?CopyConstruct@flags_internal@absl@@YAXP6APEAXW4FlagOp@12@PEBXPEAX2@Z12@Z + ?CopyCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?CopyInlineToString@InlineData@cord_internal@absl@@QEBAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?CopyPrefix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K_N@Z + ?CopyRaw@CordRepBtree@cord_internal@absl@@AEBAPEAV123@_K@Z + ?CopySuffix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z + ?CopyTo@InlineRep@Cord@absl@@QEBAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?CopyToArray@InlineRep@Cord@absl@@QEBAXPEAD@Z + ?CopyToArrayImpl@Cord@absl@@AEBAXPEAD@Z + ?CopyToArraySlowPath@Cord@absl@@AEBAXPEAD@Z + ?CopyToEndFrom@CordRepBtree@cord_internal@absl@@AEBAPEAV123@_K0@Z + ?Crash@Helper@internal_statusor@absl@@SAXAEBVStatus@3@@Z + ?Crc32CAndCopy@crc_internal@absl@@YA?AVcrc32c_t@2@PEIAXPEIBX_KV32@_N@Z + ?Crc32c@CRC@crc_internal@absl@@SAPEAV123@XZ + ?CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@3@PEIAXPEIBX_KV43@_N@Z + ?Create@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAUCordRep@23@@Z + ?Create@CordRepFlat@cord_internal@absl@@SAPEAU123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?CreateSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@@Z + ?CreateThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ + ?CreateWithCustomLimit@CordBuffer@absl@@SA?AV12@_K0@Z + ?CreateWithDefaultLimit@CordBuffer@absl@@SA?AV12@_K@Z + ?Current@CordRepBtreeNavigator@cord_internal@absl@@QEBAPEAUCordRep@23@XZ + ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPEAUThreadIdentity@12@XZ + ?CurrentValue@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Data@CordRepBtree@cord_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?Data@CordRepFlat@cord_internal@absl@@QEAAPEADXZ + ?Data@CordRepFlat@cord_internal@absl@@QEBAPEBDXZ + ?DataGuard@FlagImpl@flags_internal@absl@@AEBAAEAVMutex@3@XZ + ?DataLossError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?DeadlineExceededError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Deallocate@?$MallocAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@3@_K@Z + ?Deallocate@?$MallocAdapter@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@3@_K@Z + ?Deallocate@?$MallocAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@3@_K@Z + ?Deallocate@?$MallocAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEAVFormatArgImpl@str_format_internal@3@_K@Z + ?DeallocateIfAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?DeallocateIfAllocated@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?DeallocateIfAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?DeallocateIfAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?DecodeFrom@ProtoField@log_internal@absl@@QEAA_NPEAV?$Span@$$CBD@3@@Z + ?DecodeRustPunycode@debugging_internal@absl@@YAPEADUDecodeRustPunycodeOptions@12@@Z + ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_JI@Z + ?Decrement@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ + ?DecrementCount@BlockingCounter@absl@@QEAA_NXZ + ?DecrementExpectHighRefcount@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ + ?DecrementSynchSem@Mutex@absl@@CA_NPEAV12@PEAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z + ?DeduceUsageFlags@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ + ?DefaultCapacity@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CA_KXZ + ?DefaultIterControl@container_internal@absl@@YAPEAW4ctrl_t@12@XZ + ?DefaultKind@FlagImpl@flags_internal@absl@@AEBA?AW4FlagDefaultKind@23@XZ + ?DefaultStackUnwinder@absl@@YAHPEAPEAXPEAHHHPEBX1@Z + ?DefaultStackUnwinder@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHHPEBX2@Z + ?DefaultValue@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Delete@CordRepBtree@cord_internal@absl@@SAXPEAV123@@Z + ?Delete@CordRepExternal@cord_internal@absl@@SAXPEAUCordRep@23@@Z + ?Delete@CordRepFlat@cord_internal@absl@@SAXPEAUCordRep@23@@Z + ?Delete@CordzHandle@cord_internal@absl@@SAXPEAV123@@Z + ?Delete@flags_internal@absl@@YAXP6APEAXW4FlagOp@12@PEBXPEAX2@Z2@Z + ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPEAUArena@123@@Z + ?Demangle@debugging_internal@absl@@YA_NPEBDPEAD_K@Z + ?DemangleRustSymbolEncoding@debugging_internal@absl@@YA_NPEBDPEAD_K@Z + ?DemangleString@debugging_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBD@Z + ?Description@Impl@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Description@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Description@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Destroy@CordRep@cord_internal@absl@@SAXPEAU123@@Z + ?Destroy@CordRepBtree@cord_internal@absl@@SAXPEAV123@@Z + ?Destroy@CordRepCrc@cord_internal@absl@@SAXPEAU123@@Z + ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAXXZ + ?DestroyCordSlow@Cord@absl@@AEAAXXZ + ?DestroyElements@?$DestroyAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$00@inlined_vector_internal@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@3@_K@Z + ?DestroyElements@?$DestroyAdapter@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$00@inlined_vector_internal@absl@@SAXAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@3@_K@Z + ?DestroyElements@?$DestroyAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@3@_K@Z + ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z + ?DidAllocate@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA_NXZ + ?DidAllocate@?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA_NXZ + ?DidAllocate@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA_NXZ + ?Die@LogMessage@log_internal@absl@@AEAAXXZ + ?DieBecauseNull@log_internal@absl@@YAXPEBDH0@Z + ?Digits10@?$BigUnsigned@$03@strings_internal@absl@@SAHXZ + ?Digits10@?$BigUnsigned@$0FE@@strings_internal@absl@@SAHXZ + ?DisableRescheduling@SchedulingGuard@base_internal@absl@@CA_NXZ + ?DoIgnoreLeak@absl@@YAXPEBX@Z + ?DoLoad@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@AEBAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@ZXZ + ?DoLoad@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@AEBAP6AXPEBDH000@ZXZ + ?DoLoad@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@AEBAP6AXPEBDPEBX@ZXZ + ?DoLoad@?$AtomicHook@P6AXPEBDPEBX_J@Z@base_internal@absl@@AEBAP6AXPEBDPEBX_J@ZXZ + ?DoLoad@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@AEBAP6AXPEBX_J@ZXZ + ?DoLoad@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@AEBAP6AXW4LogSeverity@3@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@ZXZ + ?DoLoad@?$AtomicHook@P6AXXZ@base_internal@absl@@AEBAP6AXXZXZ + ?DoLoad@?$AtomicHook@P6AX_J@Z@base_internal@absl@@AEBAP6AX_J@ZXZ + ?DoLoad@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@AEBAP6A_NW4LogSeverity@3@PEBDHPEAPEADPEAH@ZXZ + ?DoStore@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@AEAA_NP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@Z@Z + ?DoStore@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@AEAA_NP6AXPEBDH000@Z@Z + ?DoStore@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@AEAA_NP6AXPEBDPEBX@Z@Z + ?DoStore@?$AtomicHook@P6AXPEBDPEBX_J@Z@base_internal@absl@@AEAA_NP6AXPEBDPEBX_J@Z@Z + ?DoStore@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@AEAA_NP6AXPEBX_J@Z@Z + ?DoStore@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@AEAA_NP6AXW4LogSeverity@3@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@Z + ?DoStore@?$AtomicHook@P6AXXZ@base_internal@absl@@AEAA_NP6AXXZ@Z + ?DoStore@?$AtomicHook@P6AX_J@Z@base_internal@absl@@AEAA_NP6AX_J@Z@Z + ?DoStore@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@AEAA_NP6A_NW4LogSeverity@3@PEBDHPEAPEADPEAH@Z@Z + ?Dtor@Mutex@absl@@AEAAXXZ + ?DummyFunction@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@CA?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@CAXPEBDH000@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@CAXPEBDPEBX@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDPEBX_J@Z@base_internal@absl@@CAXPEBDPEBX_J@Z + ?DummyFunction@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@CAXPEBX_J@Z + ?DummyFunction@?$AtomicHook@P6AXXZ@base_internal@absl@@CAXXZ + ?DummyFunction@?$AtomicHook@P6AX_J@Z@base_internal@absl@@CAX_J@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@67@@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_NAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@67@@Z + ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXQEAXQEBQEAXQEAHHH_NP6AXPEBDPEAX@Z5@Z + ?DumpStackTrace@debugging_internal@absl@@YAXHH_NP6AXPEBDPEAX@Z2@Z + ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z + ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z + ?Edge@CordRepBtree@cord_internal@absl@@QEBAPEAUCordRep@23@W4EdgeType@123@@Z + ?Edge@CordRepBtree@cord_internal@absl@@QEBAPEAUCordRep@23@_K@Z + ?EdgeData@cord_internal@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEBUCordRep@12@@Z + ?Edges@CordRepBtree@cord_internal@absl@@QEBA?AV?$Span@QEAUCordRep@cord_internal@absl@@@3@XZ + ?Edges@CordRepBtree@cord_internal@absl@@QEBA?AV?$Span@QEAUCordRep@cord_internal@absl@@@3@_K0@Z + ?EmplaceTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@AEBVInlineData@53@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?EmplaceTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?EmptyGeneration@container_internal@absl@@YAPEAEXZ + ?EmptyString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?EnableDebugLog@CondVar@absl@@QEAAXPEBD@Z + ?EnableDebugLog@Mutex@absl@@QEAAXPEBD@Z + ?EnableInvariantDebugging@Mutex@absl@@QEAAXP6AXPEAX@Z0@Z + ?EnableLogPrefix@absl@@YAX_N@Z + ?EnableMutexInvariantDebugging@absl@@YAX_N@Z + ?EnableRescheduling@SchedulingGuard@base_internal@absl@@CAX_N@Z + ?EnableSymbolizeLogStackTrace@log_internal@absl@@YAX_N@Z + ?Encode32Bit@log_internal@absl@@YA_N_KHPEAV?$Span@D@2@@Z + ?Encode32Bit@log_internal@absl@@YA_N_KIPEAV?$Span@D@2@@Z + ?Encode64Bit@log_internal@absl@@YA_N_K0PEAV?$Span@D@2@@Z + ?Encode64Bit@log_internal@absl@@YA_N_K_JPEAV?$Span@D@2@@Z + ?EncodeBytes@log_internal@absl@@YA_N_KV?$Span@$$CBD@2@PEAV?$Span@D@2@@Z + ?EncodeBytesTruncate@log_internal@absl@@YA_N_KV?$Span@$$CBD@2@PEAV?$Span@D@2@@Z + ?EncodeDouble@log_internal@absl@@YA_N_KNPEAV?$Span@D@2@@Z + ?EncodeFloat@log_internal@absl@@YA_N_KMPEAV?$Span@D@2@@Z + ?EncodeMessageLength@log_internal@absl@@YAXV?$Span@D@2@PEBV32@@Z + ?EncodeMessageStart@log_internal@absl@@YA?AV?$Span@D@2@_K0PEAV32@@Z + ?EncodeStringTruncate@log_internal@absl@@YA_N_KV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$Span@D@2@@Z + ?EncodeStructuredProtoField@log_internal@absl@@YA_NUStructuredProtoField@12@AEAV?$Span@D@2@@Z + ?EncodeUTF8Char@strings_internal@absl@@YA_KPEAD_U@Z + ?EncodeVarint@log_internal@absl@@YA_N_K0PEAV?$Span@D@2@@Z + ?EncodeVarint@log_internal@absl@@YA_N_KHPEAV?$Span@D@2@@Z + ?EncodeVarint@log_internal@absl@@YA_N_KIPEAV?$Span@D@2@@Z + ?EncodeVarint@log_internal@absl@@YA_N_K_JPEAV?$Span@D@2@@Z + ?EncodeWaitCycles@SpinLock@base_internal@absl@@KAI_J0@Z + ?EndsWith@Cord@absl@@QEBA_NAEBV12@@Z + ?EndsWith@Cord@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?EndsWith@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EndsWithIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EqualsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EqualsImpl@Cord@absl@@AEBA_NAEBV12@_K@Z + ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z + ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z + ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z + ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z + ?Eval@Condition@absl@@QEBA_NXZ + ?Excess@str_format_internal@absl@@YA_K_K0@Z + ?ExitOnDFatal@log_internal@absl@@YA_NXZ + ?ExpectedChecksum@Cord@absl@@QEBA?AV?$optional@I@__Cr@std@@XZ + ?Extend@CRC32@crc_internal@absl@@UEBAXPEAIPEBX_K@Z + ?ExtendByZeroes@CRC32@crc_internal@absl@@UEBAXPEAI_K@Z + ?ExtendByZeroesImpl@CRC32@crc_internal@absl@@CAXPEAI_KQEBI2@Z + ?ExtendCrc32c@absl@@YA?AVcrc32c_t@1@V21@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ExtendCrc32cByZeroes@absl@@YA?AVcrc32c_t@1@V21@_K@Z + ?ExtendCrc32cInline@crc_internal@absl@@YA_NPEAIPEBD_K@Z + ?ExtendCrc32cInternal@crc_internal@absl@@YA?AVcrc32c_t@2@V32@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ExtendTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NXZ + ?ExtractAppendBuffer@CordRepBtree@cord_internal@absl@@SA?AUExtractResult@CordRep@23@PEAV123@_K@Z + ?ExtractFront@CordRepBtree@cord_internal@absl@@CAPEAUCordRep@23@PEAV123@@Z + ?FDivDuration@absl@@YANVDuration@1@0@Z + ?FLAGS_noflagfile@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FNMatch@log_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?FailQuietly@LogMessage@log_internal@absl@@KAXXZ + ?FailWithoutStackTrace@LogMessage@log_internal@absl@@KAXXZ + ?FailedPreconditionError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FailureSignalToString@debugging_internal@absl@@YAPEBDH@Z + ?FastHexToBufferZeroPad16@numbers_internal@absl@@YA_K_KPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEADHPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEADIPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_JPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_KPEAD@Z + ?FastTypeId@flags_internal@absl@@YAPEBXP6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ?Fer@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?Filename@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?FillParentStack@CordzInfo@cord_internal@absl@@CA_KPEBV123@PEAPEAX@Z + ?FillWordTable@CRCImpl@crc_internal@absl@@SAXIIHPEAY0BAA@I@Z + ?FillZeroesTable@CRCImpl@crc_internal@absl@@SAHIPEAY0BAA@I@Z + ?FinalizeEncodingAndFormat@LogMessageData@LogMessage@log_internal@absl@@QEAAXXZ + ?FinalizeRegistry@flags_internal@absl@@YAXXZ + ?Find@ByAnyChar@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByAsciiWhitespace@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByChar@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByLength@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByString@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@Cord@absl@@QEBA?AVCharIterator@12@AEBV12@@Z + ?Find@Cord@absl@@QEBA?AVCharIterator@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindCommandLineFlag@absl@@YAPEAVCommandLineFlag@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindFlag@FlagRegistry@flags_internal@absl@@QEAAPEAVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindFlatStartPiece@InlineRep@Cord@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?FindImpl@Cord@absl@@AEBA?AVCharIterator@12@V312@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindLongestCommonPrefix@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@0@Z + ?FindLongestCommonSuffix@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@0@Z + ?FindPath@GraphCycles@synchronization_internal@absl@@QEBAHUGraphId@23@0HQEAU423@@Z + ?FiveToTheNth@?$BigUnsigned@$03@strings_internal@absl@@SA?AV123@H@Z + ?FiveToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@SA?AV123@H@Z + ?FixUpStack@internal_stacktrace@absl@@YAXPEAPEAXPEA_KPEAH_KAEA_K@Z + ?FixedOffsetFromName@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FixedOffsetToAbbr@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FixedOffsetToName@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FlagHelp@flags_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCommandLineFlag@2@W4HelpFormat@12@@Z + ?FlagsContains@str_format_internal@absl@@YA_NW4Flags@12@0@Z + ?FlagsHelp@flags_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@W4HelpFormat@12@1@Z + ?FlagsToString@FormatConversionSpecImplFriend@str_format_internal@absl@@SA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVFormatConversionSpecImpl@23@@Z + ?FlagsToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4Flags@12@@Z + ?FlatOverhead@CordTestAccess@strings_internal@absl@@SA_KXZ + ?FlatTagToLength@CordTestAccess@strings_internal@absl@@SA_KE@Z + ?FlattenSlowPath@Cord@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Floor@absl@@YA?AVDuration@1@V21@0@Z + ?Flush@FormatSinkImpl@str_format_internal@absl@@QEAAXXZ + ?Flush@LogMessage@log_internal@absl@@QEAAXXZ + ?Flush@LogSink@absl@@UEAAXXZ + ?FlushLogSinks@absl@@YAXXZ + ?FlushLogSinks@log_internal@absl@@YAXXZ + ?ForEachChunkAux@Cord@absl@@CAXPEAUCordRep@cord_internal@2@V?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z@2@@Z + ?ForEachFlag@flags_internal@absl@@YAXV?$function@$$A6AXAEAVCommandLineFlag@absl@@@Z@__Cr@std@@@Z + ?ForEachPayload@StatusRep@status_internal@absl@@QEBAXV?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCord@absl@@@Z@3@@Z + ?ForVar1@CheckOpMessageBuilder@log_internal@absl@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?ForVar2@CheckOpMessageBuilder@log_internal@absl@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?ForcedTrySample@container_internal@absl@@YA?AVHashtablezInfoHandle@12@_K00G@Z + ?ForgetDeadlockInfo@Mutex@absl@@QEAAXXZ + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatConversionCharIsFloat@str_format_internal@absl@@YA_NW4FormatConversionChar@2@@Z + ?FormatConversionCharIsUpper@str_format_internal@absl@@YA_NW4FormatConversionChar@2@@Z + ?FormatConversionCharToChar@str_format_internal@absl@@YADW4FormatConversionChar@2@@Z + ?FormatConversionCharToConvInt@str_format_internal@absl@@YA_KD@Z + ?FormatConversionCharToConvInt@str_format_internal@absl@@YA_KW4FormatConversionChar@2@@Z + ?FormatConversionCharToConvValue@str_format_internal@absl@@YA?AW4FormatConversionCharSet@2@D@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0BPPPL@@12@DVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0BPPPL@@12@_WVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAA@@12@UVoidPtr@12@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@$$TVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@PEBDVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@PEB_WVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@AEBV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@MVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@NVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@OVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@CVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@EVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@FVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@GVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@HVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@IVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@JVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@KVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@Vint128@2@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@Vuint128@2@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@_JVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@_KVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatDuration@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?FormatLogMessage@log_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LogSeverity@2@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@2@VDuration@2@IV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@HW4PrefixFormat@12@3@Z + ?FormatLogPrefix@log_internal@absl@@YA_KW4LogSeverity@2@VTime@2@IV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4PrefixFormat@12@AEAV?$Span@D@2@@Z + ?FormatPack@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@VTime@1@VTimeZone@1@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@VTimeZone@1@@Z + ?FormatUntyped@str_format_internal@absl@@YA_NVFormatRawSinkImpl@12@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?FprintF@str_format_internal@absl@@YAHPEAU_iobuf@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?Free@LowLevelAlloc@base_internal@absl@@SAXPEAX@Z + ?Frequency@CycleClock@base_internal@absl@@SANXZ + ?Frequency@UnscaledCycleClock@base_internal@absl@@CANXZ + ?FromChrono@absl@@YA?AVDuration@1@AEBV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@@Z + ?FromChrono@absl@@YA?AVTime@1@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?FromCivil@absl@@YA?AVTime@1@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTimeZone@1@@Z + ?FromHost16@little_endian@absl@@YAGG@Z + ?FromHost32@little_endian@absl@@YAII@Z + ?FromHost64@little_endian@absl@@YA_K_K@Z + ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0DM@$00@__Cr@std@@@Z + ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0OBA@$00@__Cr@std@@@Z + ?FromTM@absl@@YA?AVTime@1@AEBUtm@@VTimeZone@1@@Z + ?FromUDate@absl@@YA?AVTime@1@N@Z + ?FromUniversal@absl@@YA?AVTime@1@_J@Z + ?FromUnixDuration@time_internal@absl@@YA?AVTime@2@VDuration@2@@Z + ?FromUnixNanos@absl@@YA?AVTime@1@_J@Z + ?FromUnixSeconds@cctz@time_internal@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@_J@Z + ?Generate@Randen@random_internal@absl@@QEBAXPEAX@Z + ?Generate@RandenHwAes@random_internal@absl@@SAXPEBXPEAX@Z + ?Generate@RandenSlow@random_internal@absl@@SAXPEBXPEAX@Z + ?Get@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@AEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ + ?Get@?$FlagValue@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$02@flags_internal@absl@@QEBA_NAEBVSequenceLock@23@AEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@Z + ?Get@HiRep@Duration@absl@@QEBA_JXZ + ?Get@RefcountAndFlags@cord_internal@absl@@QEBA_KXZ + ?GetAllFlags@absl@@YA?AV?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@1@XZ + ?GetAllocatedCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetAllocatedCapacity@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetAllocatedCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetAllocatedCapacity@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetAllocatedData@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAPEAUCordRep@cord_internal@3@XZ + ?GetAllocatedData@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAPEAVLogSink@3@XZ + ?GetAllocatedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@XZ + ?GetAllocatedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAPEBUPayload@status_internal@3@XZ + ?GetAllocatedData@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAVFormatArgImpl@str_format_internal@3@XZ + ?GetAllocatedData@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAPEBVFormatArgImpl@str_format_internal@3@XZ + ?GetAllocator@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@XZ + ?GetAllocator@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAAEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@XZ + ?GetAndroidNativeTag@log_internal@absl@@YAPEBDXZ + ?GetAppendBuffer@CordRepBtree@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z + ?GetAppendBufferSlow@CordRepBtree@cord_internal@absl@@AEAA?AV?$Span@D@3@_K@Z + ?GetAppendBufferSlowPath@Cord@absl@@AEAA?AVCordBuffer@2@_K00@Z + ?GetArchSpecificEngines@CrcMemcpy@crc_internal@absl@@CA?AUArchSpecificEngines@123@XZ + ?GetCachedTID@base_internal@absl@@YAIXZ + ?GetCapacity@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ + ?GetCapacity@?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ + ?GetCapacity@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ + ?GetCharacter@CordRepBtree@cord_internal@absl@@QEBAD_K@Z + ?GetCond@WinHelper@Win32Waiter@synchronization_internal@absl@@SAPEAU_RTL_CONDITION_VARIABLE@@PEAV234@@Z + ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ + ?GetCpuType@crc_internal@absl@@YA?AW4CpuType@12@XZ + ?GetCurrentTimeNanos@absl@@YA_JXZ + ?GetData@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAPEAPEAUCordRep@cord_internal@3@XZ + ?GetData@?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAPEAPEAVLogSink@3@XZ + ?GetData@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAPEAUPayload@status_internal@3@XZ + ?GetDebugStackTraceHook@debugging_internal@absl@@YAP6AXQEBQEAXHP6AXPEBDPEAX@Z2@ZXZ + ?GetEntropyFromRandenPool@random_internal@absl@@YAXPEAX_K@Z + ?GetEstimatedFairShareMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetEstimatedMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetFirstChunk@Cord@absl@@CA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV12@@Z + ?GetFirstChunk@Cord@absl@@CA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@@Z + ?GetFlagsHelpFormat@flags_internal@absl@@YA?AW4HelpFormat@12@XZ + ?GetFlagsHelpMatchSubstr@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?GetFlagsHelpMode@flags_internal@absl@@YA?AW4HelpMode@12@XZ + ?GetFlatAux@Cord@absl@@CA_NPEAUCordRep@cord_internal@2@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?GetGrowthInfoFromControl@container_internal@absl@@YAAEAVGrowthInfo@12@PEAW4ctrl_t@12@@Z + ?GetGrowthLeft@GrowthInfo@container_internal@absl@@QEBA_KXZ + ?GetHashtablezMaxSamples@container_internal@absl@@YA_KXZ + ?GetHashtablezSampleParameter@container_internal@absl@@YAHXZ + ?GetId@GraphCycles@synchronization_internal@absl@@QEAA?AUGraphId@23@PEAX@Z + ?GetInlinedCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetInlinedCapacity@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetInlinedCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetInlinedCapacity@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetInlinedData@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAPEAUCordRep@cord_internal@3@XZ + ?GetInlinedData@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAPEAVLogSink@3@XZ + ?GetInlinedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@XZ + ?GetInlinedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAPEBUPayload@status_internal@3@XZ + ?GetInlinedData@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAVFormatArgImpl@str_format_internal@3@XZ + ?GetInlinedData@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAPEBVFormatArgImpl@str_format_internal@3@XZ + ?GetIsAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_NXZ + ?GetIsAllocated@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_NXZ + ?GetIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_NXZ + ?GetIsAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_NXZ + ?GetKeys@RandenHwAes@random_internal@absl@@SAPEBXXZ + ?GetKeys@RandenSlow@random_internal@absl@@SAPEBXXZ + ?GetLock@WinHelper@Win32Waiter@synchronization_internal@absl@@SAPEAU_RTL_SRWLOCK@@PEAV234@@Z + ?GetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEBA_KXZ + ?GetMisspellingHints@flags_internal@absl@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?GetMorePreciseMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetOrCreateCurrentThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ + ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PEBV123@@Z + ?GetParentStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ + ?GetPayload@StatusRep@status_internal@absl@@QEBA?AV?$optional@VCord@absl@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@@Z + ?GetPolicyFunctions@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CAAEBUPolicyFunctions@23@XZ + ?GetProgramCounter@debugging_internal@absl@@YAPEAXQEAX@Z + ?GetRefForEmptyClass@container_internal@absl@@YAPEAXAEAVCommonFields@12@@Z + ?GetRepHi@time_internal@absl@@YA_JVDuration@2@@Z + ?GetRepLo@time_internal@absl@@YAIVDuration@2@@Z + ?GetSaltMaterial@random_internal@absl@@YA?AV?$optional@I@__Cr@std@@XZ + ?GetSize@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetSize@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetSize@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetSize@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetSizeAndIsAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ + ?GetSizeAndIsAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAAEB_KXZ + ?GetSizeAndIsAllocated@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ + ?GetSizeAndIsAllocated@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAAEB_KXZ + ?GetSizeAndIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ + ?GetSizeAndIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAAEB_KXZ + ?GetSizeAndIsAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ + ?GetSizeAndIsAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAAEB_KXZ + ?GetSkipCount@ExponentialBiased@profiling_internal@absl@@QEAA_J_J@Z + ?GetStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ + ?GetStackFrames@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHH@Z + ?GetStackFramesWithContext@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHHPEBX2@Z + ?GetStackTrace@GraphCycles@synchronization_internal@absl@@QEAAHUGraphId@23@PEAPEAPEAX@Z + ?GetStackTrace@absl@@YAHPEAPEAXHH@Z + ?GetStackTraceWithContext@absl@@YAHPEAPEAXHHPEBXPEAH@Z + ?GetStatusPayloadPrinter@status_internal@absl@@YAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@AEBVCord@2@@ZXZ + ?GetStride@ExponentialBiased@profiling_internal@absl@@QEAA_J_J@Z + ?GetTID@base_internal@absl@@YAIXZ + ?GetTagForChar@str_format_internal@absl@@YA?AVConvTag@12@D@Z + ?GetTestEngine@CrcMemcpy@crc_internal@absl@@SA?AV?$unique_ptr@VCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@HH@Z + ?GetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAPEAU?$atomic@H@__Cr@std@@XZ + ?GetTransitionType@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NH_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAE@Z + ?GetUsageConfig@flags_internal@absl@@YA?AUFlagsUsageConfig@2@XZ + ?GetWaiter@?$WaiterCrtp@VWin32Waiter@synchronization_internal@absl@@@synchronization_internal@absl@@SAPEAVWin32Waiter@23@PEAUThreadIdentity@base_internal@3@@Z + ?GetWeekday@absl@@YA?AW4weekday@detail@cctz@time_internal@1@V?$civil_time@Usecond_tag@time_internal@absl@@@3451@@Z + ?GetWord@?$BigUnsigned@$03@strings_internal@absl@@QEBAIH@Z + ?GetWord@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAIH@Z + ?GetYearDay@absl@@YAHV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?GlobalHashtablezSampler@container_internal@absl@@YAAEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?GlobalList@CordzInfo@cord_internal@absl@@CAPEAUList@123@XZ + ?GlobalRegistry@FlagRegistry@flags_internal@absl@@SAAEAV123@XZ + ?GuaranteedEqual@Condition@absl@@SA_NPEBV12@0@Z + ?Guard@?$NullGuard@C@log_internal@absl@@SAAEBCAEBC@Z + ?Guard@?$NullGuard@D@log_internal@absl@@SAAEBDAEBD@Z + ?Guard@?$NullGuard@E@log_internal@absl@@SAAEBEAEBE@Z + ?Guard@?$NullGuard@F@log_internal@absl@@SAAEBFAEBF@Z + ?Guard@?$NullGuard@G@log_internal@absl@@SAAEBGAEBG@Z + ?Guard@?$NullGuard@H@log_internal@absl@@SAAEBHAEBH@Z + ?Guard@?$NullGuard@I@log_internal@absl@@SAAEBIAEBI@Z + ?Guard@?$NullGuard@J@log_internal@absl@@SAAEBJAEBJ@Z + ?Guard@?$NullGuard@K@log_internal@absl@@SAAEBKAEBK@Z + ?Guard@?$NullGuard@M@log_internal@absl@@SAAEBMAEBM@Z + ?Guard@?$NullGuard@N@log_internal@absl@@SAAEBNAEBN@Z + ?Guard@?$NullGuard@PEAX@log_internal@absl@@SAAEBQEAXAEBQEAX@Z + ?Guard@?$NullGuard@PEBC@log_internal@absl@@SAPEBCPEBC@Z + ?Guard@?$NullGuard@PEBD@log_internal@absl@@SAPEBDPEBD@Z + ?Guard@?$NullGuard@PEBE@log_internal@absl@@SAPEBEPEBE@Z + ?Guard@?$NullGuard@PEBX@log_internal@absl@@SAAEBQEBXAEBQEBX@Z + ?Guard@?$NullGuard@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@log_internal@absl@@SAAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV456@@Z + ?Guard@?$NullGuard@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@log_internal@absl@@SAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@@Z + ?Guard@?$NullGuard@_J@log_internal@absl@@SAAEB_JAEB_J@Z + ?Guard@?$NullGuard@_K@log_internal@absl@@SAAEB_KAEB_K@Z + ?Guard@?$NullGuard@_N@log_internal@absl@@SAAEB_NAEB_N@Z + ?H1@container_internal@absl@@YA_K_K@Z + ?H2@container_internal@absl@@YAE_K@Z + ?HandleInvalidStatusCtorArg@Helper@internal_statusor@absl@@SAXPEAVStatus@3@@Z + ?HandleUsageFlags@flags_internal@absl@@YA?AW4HelpMode@12@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@@Z + ?HasBeenNotifiedInternal@Notification@absl@@CA_NPEBU?$atomic@_N@__Cr@std@@@Z + ?HasBeenRead@MaskedPointer@flags_internal@absl@@QEBA_NXZ + ?HasEdge@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z + ?HasNoDeleted@GrowthInfo@container_internal@absl@@QEBA_NXZ + ?HasNoDeletedAndGrowthLeft@GrowthInfo@container_internal@absl@@QEBA_NXZ + ?HasNoGrowthLeftAndNoDeleted@GrowthInfo@container_internal@absl@@QEBA_NXZ + ?HasNoGrowthLeftAssumingMayHaveDeleted@GrowthInfo@container_internal@absl@@QEBA_NXZ + ?HasNode@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@@Z + ?HasRandenHwAesImplementation@random_internal@absl@@YA_NXZ + ?HaveLeakSanitizer@absl@@YA_NXZ + ?Head@CordzInfo@cord_internal@absl@@SAPEAV123@AEBVCordzSnapshot@23@@Z + ?Help@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?HelpSourceKind@FlagImpl@flags_internal@absl@@AEBA?AW4FlagHelpKind@23@XZ + ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?HexStringToBytes@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?HideMask@base_internal@absl@@YA_KXZ + ?IDivDuration@absl@@YA_JVDuration@1@0PEAV21@@Z + ?In@Time@absl@@QEBA?AUBreakdown@12@VTimeZone@2@@Z + ?InMillisecondsFromNow@KernelTimeout@synchronization_internal@absl@@QEBAKXZ + ?InNanosecondsFromNow@KernelTimeout@synchronization_internal@absl@@AEBA_JXZ + ?Increment@RefcountAndFlags@cord_internal@absl@@QEAAXXZ + ?IncrementModificationCount@SequenceLock@flags_internal@absl@@QEAAXXZ + ?IncrementSynchSem@Mutex@absl@@CAXPEAV12@PEAUPerThreadSynch@base_internal@2@@Z + ?IndexBefore@CordRepBtree@cord_internal@absl@@AEBA?AUPosition@123@U4123@_K@Z + ?IndexBeyond@CordRepBtree@cord_internal@absl@@AEBA?AUPosition@123@_K@Z + ?IndexOf@CordRepBtree@cord_internal@absl@@AEBA?AUPosition@123@_K@Z + ?IndexOfLength@CordRepBtree@cord_internal@absl@@AEBA?AUPosition@123@_K@Z + ?InfiniteDuration@absl@@YA?AVDuration@1@XZ + ?InfiniteFuture@absl@@YA?AVTime@1@XZ + ?InfinitePast@absl@@YA?AVTime@1@XZ + ?Init@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCordRepBtree@23@@Z + ?Init@FlagImpl@flags_internal@absl@@AEAAXXZ + ?Init@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z + ?InitDiscreteDistribution@random_internal@absl@@YA?AV?$vector@U?$pair@N_K@__Cr@std@@V?$allocator@U?$pair@N_K@__Cr@std@@@23@@__Cr@std@@PEAV?$vector@NV?$allocator@N@__Cr@std@@@45@@Z + ?InitFirst@CordRepBtreeNavigator@cord_internal@absl@@QEAAPEAUCordRep@23@PEAVCordRepBtree@23@@Z + ?InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXAEBV123@@Z + ?InitGrowthLeftNoDeleted@GrowthInfo@container_internal@absl@@QEAAX_K@Z + ?InitInstance@CordRepBtree@cord_internal@absl@@AEAAXH_K0@Z + ?InitSigSafeArena@base_internal@absl@@YAXXZ + ?InitTables@CRC32@crc_internal@absl@@UEAAXXZ + ?InitTree@ChunkIterator@Cord@absl@@AEAAXPEAUCordRep@cord_internal@3@@Z + ?InitWhat@BadStatusOrAccess@absl@@AEBAXXZ + ?Initialize@ExponentialBiased@profiling_internal@absl@@AEAAXXZ + ?InitializeCordRepExternal@cord_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAUCordRepExternal@12@@Z + ?InitializeData@Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@AEAAPEADXZ + ?InitializeEncodingAndFormat@LogMessageData@LogMessage@log_internal@absl@@QEAAXXZ + ?InitializeLog@absl@@YAXXZ + ?InitializeSymbolizer@absl@@YAXPEBD@Z + ?InlinedRepToCode@Status@absl@@CA?AW4StatusCode@2@_K@Z + ?InsertAndReturnSumOfPredecessors@?$BoundedUtf8LengthSequence@$0BAA@@debugging_internal@absl@@QEAAIII@Z + ?InsertEdge@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@0@Z + ?InstallFailureSignalHandler@absl@@YAXAEBUFailureSignalHandlerOptions@1@@Z + ?Int128High64@absl@@YA_JVint128@1@@Z + ?Int128Low64@absl@@YA_KVint128@1@@Z + ?Int128Max@absl@@YA?AVint128@1@XZ + ?Int128Min@absl@@YA?AVint128@1@XZ + ?InternalAttemptToUseMutexInFatalSignalHandler@Mutex@absl@@SAXXZ + ?InternalCondVarPoke@StdcppWaiter@synchronization_internal@absl@@AEAAXXZ + ?InternalCondVarPoke@Win32Waiter@synchronization_internal@absl@@AEAAXXZ + ?InternalError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?InternalStream@LogMessage@log_internal@absl@@QEAAAEAV123@XZ + ?InvalidArgumentError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?InvalidGraphId@synchronization_internal@absl@@YA?AUGraphId@12@XZ + ?InvokeCallback@FlagImpl@flags_internal@absl@@QEBAXXZ + ?IsAborted@absl@@YA_NAEBVStatus@1@@Z + ?IsAlreadyExists@absl@@YA_NAEBVStatus@1@@Z + ?IsBtree@CordRep@cord_internal@absl@@QEBA_NXZ + ?IsCancelled@absl@@YA_NAEBVStatus@1@@Z + ?IsCooperative@SpinLock@base_internal@absl@@CA_NW4SchedulingMode@23@@Z + ?IsCordBtreeExhaustiveValidationEnabled@cord_internal@absl@@YA_NXZ + ?IsCrc@CordRep@cord_internal@absl@@QEBA_NXZ + ?IsDataEdge@cord_internal@absl@@YA_NPEBUCordRep@12@@Z + ?IsDataLoss@absl@@YA_NAEBVStatus@1@@Z + ?IsDeadlineExceeded@absl@@YA_NAEBVStatus@1@@Z + ?IsDeleted@container_internal@absl@@YA_NW4ctrl_t@12@@Z + ?IsEmpty@container_internal@absl@@YA_NW4ctrl_t@12@@Z + ?IsEmptyOrDeleted@container_internal@absl@@YA_NW4ctrl_t@12@@Z + ?IsExternal@CordRep@cord_internal@absl@@QEBA_NXZ + ?IsFailedPrecondition@absl@@YA_NAEBVStatus@1@@Z + ?IsFatal@LogMessage@log_internal@absl@@AEBA_NXZ + ?IsFlat@CordRep@cord_internal@absl@@QEBA_NXZ + ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_NPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_N_K0PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?IsFull@container_internal@absl@@YA_NW4ctrl_t@12@@Z + ?IsHashtablezEnabled@container_internal@absl@@YA_NXZ + ?IsHeld@SpinLock@base_internal@absl@@QEBA_NXZ + ?IsImmortal@RefcountAndFlags@cord_internal@absl@@QEBA_NXZ + ?IsInfiniteDuration@time_internal@absl@@YA_NVDuration@2@@Z + ?IsInitialized@log_internal@absl@@YA_NXZ + ?IsInlined@Status@absl@@CA_N_K@Z + ?IsInternal@absl@@YA_NAEBVStatus@1@@Z + ?IsInvalidArgument@absl@@YA_NAEBVStatus@1@@Z + ?IsMovedFrom@Status@absl@@CA_N_K@Z + ?IsNormalized@CrcCordState@crc_internal@absl@@QEBA_NXZ + ?IsNotFound@absl@@YA_NAEBVStatus@1@@Z + ?IsOne@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ + ?IsOutOfRange@absl@@YA_NAEBVStatus@1@@Z + ?IsPermissionDenied@absl@@YA_NAEBVStatus@1@@Z + ?IsPow2@CordBuffer@absl@@CA_N_K@Z + ?IsReachable@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z + ?IsResourceExhausted@absl@@YA_NAEBVStatus@1@@Z + ?IsRetired@CommandLineFlag@absl@@UEBA_NXZ + ?IsSame@InlineRep@Cord@absl@@QEBA_NAEBV123@@Z + ?IsSampled@HashtablezInfoHandle@container_internal@absl@@QEBA_NXZ + ?IsSmallCapacity@container_internal@absl@@YA_N_K@Z + ?IsSooControl@container_internal@absl@@YA_NPEBW4ctrl_t@12@@Z + ?IsSpecifiedOnCommandLine@FlagImpl@flags_internal@absl@@EEBA_NXZ + ?IsSpecifiedOnCommandLine@PrivateHandleAccessor@flags_internal@absl@@SA_NAEBVCommandLineFlag@3@@Z + ?IsSubstring@CordRep@cord_internal@absl@@QEBA_NXZ + ?IsUnauthenticated@absl@@YA_NAEBVStatus@1@@Z + ?IsUnavailable@absl@@YA_NAEBVStatus@1@@Z + ?IsUnimplemented@absl@@YA_NAEBVStatus@1@@Z + ?IsUnknown@absl@@YA_NAEBVStatus@1@@Z + ?IsUnprotectedReadCandidate@MaskedPointer@flags_internal@absl@@QEBA_NXZ + ?IsValid@CordRepBtree@cord_internal@absl@@SA_NPEBV123@_N@Z + ?IsValidCapacity@container_internal@absl@@YA_N_K@Z + ?IterateOverFullSlots@container_internal@absl@@YAXAEBVCommonFields@12@_KV?$FunctionRef@$$A6AXPEBW4ctrl_t@container_internal@absl@@PEAX@Z@2@@Z + ?KeyFunction@LogSink@absl@@EEBAXXZ + ?LeadingZeros@?$NonIterableBitMask@_K$07$02@container_internal@absl@@QEBAIXZ + ?LeakCheckerIsActive@absl@@YA_NXZ + ?LengthModToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LengthMod@2@@Z + ?LengthToTag@CordTestAccess@strings_internal@absl@@SAE_K@Z + ?Load16@big_endian@absl@@YAGPEBX@Z + ?Load16@little_endian@absl@@YAGPEBX@Z + ?Load32@big_endian@absl@@YAIPEBX@Z + ?Load32@little_endian@absl@@YAIPEBX@Z + ?Load64@little_endian@absl@@YA_KPEBX@Z + ?Load@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@QEBAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@ZXZ + ?Load@?$AtomicHook@P6AXXZ@base_internal@absl@@QEBAP6AXXZXZ + ?Load@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?Load@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NPEAVZoneInfoSource@234@@Z + ?LoadCycleClockSource@CycleClock@base_internal@absl@@CAP6A_JXZXZ + ?LoadTimeZone@Impl@time_zone@cctz@time_internal@absl@@SA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV2345@@Z + ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransition@234@@Z + ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransitionType@234@@Z + ?LocalTimeZone@absl@@YA?AVTimeZone@1@XZ + ?Lock@CordzInfo@cord_internal@absl@@QEAAXW4MethodIdentifier@CordzUpdateTracker@23@@Z + ?LockSlow@Mutex@absl@@AEAAXPEBUMuHowS@2@PEBVCondition@2@H@Z + ?LockSlowLoop@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@H@Z + ?LockSlowWithDeadline@Mutex@absl@@AEAA_NPEBUMuHowS@2@PEBVCondition@2@VKernelTimeout@synchronization_internal@2@H@Z + ?LockWhen@Mutex@absl@@QEAAXAEBVCondition@2@@Z + ?LockWhenCommon@Mutex@absl@@AEAA_NAEBVCondition@2@VKernelTimeout@synchronization_internal@2@_N@Z + ?LockWhenWithDeadline@Mutex@absl@@QEAA_NAEBVCondition@2@VTime@2@@Z + ?LockWhenWithTimeout@Mutex@absl@@QEAA_NAEBVCondition@2@VDuration@2@@Z + ?Log2Ceil@CordBuffer@absl@@CA_K_K@Z + ?Log2Floor@CordBuffer@absl@@CA_K_K@Z + ?LogBacktraceIfNeeded@LogMessage@log_internal@absl@@AEAAXXZ + ?LogFatalNodeType@cord_internal@absl@@YAXPEAUCordRep@12@@Z + ?LogSeverityName@absl@@YAPEBDW4LogSeverity@1@@Z + ?LogToSinks@log_internal@absl@@YAXAEBVLogEntry@2@V?$Span@PEAVLogSink@absl@@@2@_N@Z + ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QEAAXAEBV123@@Z + ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QEAAXW4MethodIdentifier@123@_J@Z + ?LowestBitSet@?$NonIterableBitMask@_K$07$02@container_internal@absl@@QEBAIXZ + ?Make@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?Make@TimeZoneInfo@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?Make@TimeZoneLibC@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?MakeAbsNanos@KernelTimeout@synchronization_internal@absl@@QEBA_JXZ + ?MakeAbsTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ + ?MakeCheckFailString@status_internal@absl@@YAPEBDPEBVStatus@2@PEBD@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@C@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEBX@Z + ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z + ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_JI@Z + ?MakeFlatWithExtraCapacity@InlineRep@Cord@absl@@QEAAPEAUCordRepFlat@cord_internal@3@_K@Z + ?MakeInitValue@FlagImpl@flags_internal@absl@@AEBA?AV?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@XZ + ?MakeInt128@absl@@YA?AVint128@1@_J_K@Z + ?MakeNormalizedDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z + ?MakeRelativeTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ + ?MakeSeedSeq@absl@@YA?AV?$SaltedSeedSeq@Vseed_seq@__Cr@std@@@random_internal@1@XZ + ?MakeStorageView@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA?AU?$StorageView@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@23@XZ + ?MakeStorageView@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA?AU?$StorageView@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@23@XZ + ?MakeStorageView@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA?AU?$StorageView@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@23@XZ + ?MakeTagType@log_internal@absl@@YA_K_KW4WireType@12@@Z + ?MakeTime@Impl@time_zone@cctz@time_internal@absl@@QEBA?AUcivil_lookup@2345@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@345@@Z + ?MakeTime@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?MakeTime@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?MakeUint128@absl@@YA?AVuint128@1@_K0@Z + ?MapToLocalCode@status_internal@absl@@YA?AW4StatusCode@2@H@Z + ?MarkAsRead@MaskedPointer@flags_internal@absl@@QEAAXXZ + ?MarkInitialized@SequenceLock@flags_internal@absl@@QEAAXXZ + ?MaskEmpty@GroupAArch64Impl@container_internal@absl@@QEBA@XZ + ?MaskEmptyOrDeleted@GroupPortableImpl@container_internal@absl@@QEBA@XZ + ?MaskFull@GroupPortableImpl@container_internal@absl@@QEBA@XZ + ?MaskNonFull@GroupAArch64Impl@container_internal@absl@@QEBA@XZ + ?Match@GroupAArch64Impl@container_internal@absl@@QEBA@E@Z + ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@AEBA_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z + ?MaxFlatLength@CordTestAccess@strings_internal@absl@@SA_KXZ + ?MaxFramesInLogStackTrace@log_internal@absl@@YAHXZ + ?MaxVarintSize@log_internal@absl@@YA_KXZ + ?MaybeBecomeIdle@WaiterBase@synchronization_internal@absl@@KAXXZ + ?MaybeExit@flags_internal@absl@@YAXW4HelpMode@12@@Z + ?MaybeGetCrcCordState@Cord@absl@@AEBAPEBVCrcCordState@crc_internal@2@XZ + ?MaybeRemoveEmptyCrcNode@InlineRep@Cord@absl@@AEAAXXZ + ?MaybeTrackCordImpl@CordzInfo@cord_internal@absl@@CAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?MemcpyCrc32c@absl@@YA?AVcrc32c_t@1@PEAXPEBX_KV21@@Z + ?MergeTrees@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@0@Z + ?MinLogLevel@absl@@YA?AW4LogSeverityAtLeast@1@XZ + ?MixIntoSeedMaterial@random_internal@absl@@YAXV?$Span@$$CBI@2@V?$Span@I@2@@Z + ?ModificationCount@FlagImpl@flags_internal@absl@@AEBA_JXZ + ?ModificationCount@SequenceLock@flags_internal@absl@@QEBA_JXZ + ?MovedFromRep@Status@absl@@CA_KXZ + ?MovedFromString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBI@Z + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QEAAXI@Z + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QEAAX_K@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHPEBI@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXI@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAX_K@Z + ?MultiplyByFiveToTheNth@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?MultiplyByFiveToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?MultiplyByTenToTheNth@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?MultiplyByTenToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?MultiplyStep@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBIHH@Z + ?MultiplyStep@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHPEBIHH@Z + ?MutexDelay@synchronization_internal@absl@@YAHHH@Z + ?Name@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Name@Impl@time_zone@cctz@time_internal@absl@@QEBAAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?NegateAndSubtractOne@time_internal@absl@@YA_J_J@Z + ?Never@KernelTimeout@synchronization_internal@absl@@SA?AV123@XZ + ?New@CordRepBtree@cord_internal@absl@@SAPEAV123@H@Z + ?New@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAUCordRep@23@@Z + ?New@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@0@Z + ?New@CordRepCrc@cord_internal@absl@@SAPEAU123@PEAUCordRep@23@VCrcCordState@crc_internal@3@@Z + ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@ULarge@123@_K@Z + ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@_K@Z + ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@I@Z + ?NewCRC32AcceleratedX86ARMCombinedAll@crc_internal@absl@@YA?AV?$vector@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@XZ + ?NewInternal@CRCImpl@crc_internal@absl@@SAPEAV123@XZ + ?NewString@CheckOpMessageBuilder@log_internal@absl@@QEAAPEBDXZ + ?Next@CordRepBtreeNavigator@cord_internal@absl@@QEAAPEAUCordRep@23@XZ + ?Next@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z + ?NextCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SA_K_K@Z + ?NextCapacity@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SA_K_K@Z + ?NextCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SA_K_K@Z + ?NextCapacity@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SA_K_K@Z + ?NextCapacity@container_internal@absl@@YA_K_K@Z + ?NextGeneration@container_internal@absl@@YAEE@Z + ?NextRandom@ExponentialBiased@profiling_internal@absl@@SA_K_K@Z + ?NextSeed@container_internal@absl@@YAGXZ + ?NextTransition@Impl@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@2345@@Z + ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z + ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?NextUp@CordRepBtreeNavigator@cord_internal@absl@@AEAAPEAUCordRep@23@XZ + ?NoPrefix@LogMessage@log_internal@absl@@QEAAAEAV123@XZ + ?NominalCPUFrequency@base_internal@absl@@YANXZ + ?Normalize@CrcCordState@crc_internal@absl@@QEAAXXZ + ?NormalizeCapacity@container_internal@absl@@YA_K_K@Z + ?NormalizeLogSeverity@absl@@YA?AW4LogSeverity@1@W421@@Z + ?NormalizedPrefixCrcAtNthChunk@CrcCordState@crc_internal@absl@@QEBA?AUPrefixCrc@123@_K@Z + ?NotFoundError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Notify@Notification@absl@@QEAAXXZ + ?Now@CycleClock@base_internal@absl@@SA_JXZ + ?Now@UnscaledCycleClock@base_internal@absl@@CA_JXZ + ?Now@absl@@YA?AVTime@1@XZ + ?NullSafeStringView@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEBD@Z + ?NumCPUs@base_internal@absl@@YAHXZ + ?NumChunks@CrcCordState@crc_internal@absl@@QEBA_KXZ + ?NumClonedBytes@container_internal@absl@@YA_KXZ + ?NumControlBytes@container_internal@absl@@YA_K_K@Z + ?NumGenerationBytes@container_internal@absl@@YA_KXZ + ?NumLeakedFlagValues@flags_internal@absl@@YA_KXZ + ?ODRCheck@CordzInfo@cord_internal@absl@@AEBAXXZ + ?OccursBefore@ViableSubstitution@strings_internal@absl@@QEBA_NAEBU123@@Z + ?OnUpdate@?$FlagRegistrar@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$00@flags_internal@absl@@QEHAA?AV123@P6AXXZ@Z + ?OnVLogVerbosityUpdate@log_internal@absl@@YAXV?$function@$$A6AXXZ@__Cr@std@@@Z + ?OneTimeInitThreadIdentity@synchronization_internal@absl@@YAXPEAUThreadIdentity@base_internal@2@@Z + ?OneWordValue@FlagImpl@flags_internal@absl@@AEBAAEAU?$atomic@_J@__Cr@std@@XZ + ?OppositeInfinity@time_internal@absl@@YA?AVDuration@2@V32@@Z + ?OutOfRangeError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?OverwriteControlAsFull@GrowthInfo@container_internal@absl@@QEAAXW4ctrl_t@23@@Z + ?OverwriteEmptyAsFull@GrowthInfo@container_internal@absl@@QEAAXXZ + ?OverwriteFullAsDeleted@GrowthInfo@container_internal@absl@@QEAAXXZ + ?OverwriteFullAsEmpty@GrowthInfo@container_internal@absl@@QEAAXXZ + ?OverwriteManyEmptyAsFull@GrowthInfo@container_internal@absl@@QEAAX_K@Z + ?Package@flags_internal@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@@Z + ?Parse@flags_internal@absl@@YA_NP6APEAXW4FlagOp@12@PEBXPEAX2@ZV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@2PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?ParseAbseilFlagsOnly@absl@@YAXHQEAPEADAEAV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@AEAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@34@@Z + ?ParseAbseilFlagsOnlyImpl@flags_internal@absl@@YA?AW4HelpMode@12@HQEAPEADAEAV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@AEAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@56@W4UsageFlagsAction@12@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCommandLine@absl@@YA?AV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@HQEAPEAD@Z + ?ParseCommandLineImpl@flags_internal@absl@@YA?AV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@HQEAPEADW4UsageFlagsAction@12@W4OnUndefinedFlag@12@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@45@@Z + ?ParseDigits@str_format_internal@absl@@YAHAEADAEAPEBDQEBD@Z + ?ParseDuration@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVDuration@1@@Z + ?ParseFlag@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVDuration@1@PEAV234@@Z + ?ParseFlag@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVTime@1@PEAV234@@Z + ?ParseFrom@CommandLineFlag@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?ParseFrom@FlagImpl@flags_internal@absl@@EEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4FlagSettingMode@23@W4ValueSource@23@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?ParseFrom@PrivateHandleAccessor@flags_internal@absl@@SA_NAEAVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4FlagSettingMode@23@W4ValueSource@23@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParsePosixSpec@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAUPosixTimeZone@123@@Z + ?ParseTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?ParseTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0VTimeZone@1@PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?PermissionDeniedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Piece@AlphaNum@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?PiecewiseChunkSize@hash_internal@absl@@YA_KXZ + ?PointerToRep@Status@absl@@CA_KPEAVStatusRep@status_internal@2@@Z + ?Poison@CrcCordState@crc_internal@absl@@QEAAXXZ + ?Poke@StdcppWaiter@synchronization_internal@absl@@QEAAXXZ + ?Poke@Win32Waiter@synchronization_internal@absl@@QEAAXXZ + ?Post@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z + ?Post@StdcppWaiter@synchronization_internal@absl@@QEAAXXZ + ?Post@Win32Waiter@synchronization_internal@absl@@QEAAXXZ + ?PrecombineLengthMix@hash_internal@absl@@YA_K_K0@Z + ?PrepareForSampling@HashtablezInfo@container_internal@absl@@QEAAX_J_K11G@Z + ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@_K$07$02@12@UFindInfo@12@@Z + ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@_K$07$02@12@UFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareInsertSmallNonSoo@container_internal@absl@@YA?AU?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@AEAVCommonFields@12@AEBUPolicyFunctions@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareToDie@LogMessage@log_internal@absl@@AEAAXXZ + ?PrepareToModify@Status@absl@@CAPEAVStatusRep@status_internal@2@_K@Z + ?Prepend@Cord@absl@@QEAAXAEBV12@@Z + ?Prepend@Cord@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Prepend@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z + ?Prepend@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?PrependArray@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?PrependPrecise@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?PrependSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z + ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependVModule@log_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?PrevTransition@Impl@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@2345@@Z + ?PrevTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z + ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?PreviousCapacity@container_internal@absl@@YA_K_K@Z + ?Print@Streamable@str_format_internal@absl@@QEBAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@@Z + ?PrintTo@absl@@YAXAEBVLogEntry@1@PEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ProgramUsageMessage@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Ptr@GraphCycles@synchronization_internal@absl@@QEAAPEAXUGraphId@23@@Z + ?Ptr@MaskedPointer@flags_internal@absl@@QEBAPEAXXZ + ?PtrStorage@FlagImpl@flags_internal@absl@@AEBAAEAU?$atomic@VMaskedPointer@flags_internal@absl@@@__Cr@std@@XZ + ?PushDead@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AEAAXPEAUHashtablezInfo@container_internal@3@@Z + ?PushNew@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AEAAXPEAUHashtablezInfo@container_internal@3@@Z + ?PutPaddedString@FormatSinkImpl@str_format_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HH_N@Z + ?PutTwoDigits@numbers_internal@absl@@YAXIPEAD@Z + ?RawAbsNanos@KernelTimeout@synchronization_internal@absl@@AEBA_JXZ + ?RawEnableLogPrefix@log_internal@absl@@YAX_N@Z + ?RawLog@raw_log_internal@absl@@YAXW4LogSeverity@2@PEBDH1ZZ + ?RawLoggingFullySupported@raw_log_internal@absl@@YA_NXZ + ?RawSetMinLogLevel@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z + ?RawSetStderrThreshold@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z + ?Read1To3@hash_internal@absl@@YAIPEBE_K@Z + ?Read4To8@hash_internal@absl@@YA_KPEBE_K@Z + ?Read8@hash_internal@absl@@YA_KPEBE@Z + ?Read9To16@hash_internal@absl@@YA?AU?$pair@_K_K@__Cr@std@@PEBE_K@Z + ?Read@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUReadResult@123@_K0@Z + ?Read@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K0AEAPEAUCordRep@23@@Z + ?Read@FlagImpl@flags_internal@absl@@UEBAXPEAX@Z + ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AEAAHPEBD0H@Z + ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAHPEBD0H@Z + ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z + ?ReadFloatMantissa@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z + ?ReadOneBool@FlagImpl@flags_internal@absl@@QEBA_NXZ + ?ReadOneWord@FlagImpl@flags_internal@absl@@QEBA_JXZ + ?ReadSeedMaterialFromOSEntropy@random_internal@absl@@YA_NV?$Span@I@2@@Z + ?ReadSequenceLockedData@FlagImpl@flags_internal@absl@@AEBAXPEAX@Z + ?ReaderTryLockSlow@Mutex@absl@@AEAA_NXZ + ?Rebuild@CordRepBtree@cord_internal@absl@@CAXPEAPEAV123@PEAV123@_N@Z + ?Rebuild@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@@Z + ?RecordClearedReservation@HashtablezInfoHandle@container_internal@absl@@QEAAXXZ + ?RecordClearedReservationSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?RecordErase@HashtablezInfoHandle@container_internal@absl@@QEAAXXZ + ?RecordEraseSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?RecordInsert@HashtablezInfoHandle@container_internal@absl@@QEAAX_K0@Z + ?RecordInsertSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K1@Z + ?RecordRehash@HashtablezInfoHandle@container_internal@absl@@QEAAX_K@Z + ?RecordRehashSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K@Z + ?RecordReservation@HashtablezInfoHandle@container_internal@absl@@QEAAX_K@Z + ?RecordReservationSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K@Z + ?RecordStorageChanged@HashtablezInfoHandle@container_internal@absl@@QEAAX_K0@Z + ?RecordStorageChangedSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K1@Z + ?Ref@CordRep@cord_internal@absl@@SAPEAU123@PEAU123@@Z + ?Ref@CrcCordState@crc_internal@absl@@CAXPEAURefcountedRep@123@@Z + ?Ref@Status@absl@@CAX_K@Z + ?Ref@StatusRep@status_internal@absl@@QEBAXXZ + ?RefCordRep@CordzInfo@cord_internal@absl@@QEBAPEAUCordRep@23@XZ + ?RefSharedEmptyRep@CrcCordState@crc_internal@absl@@CAPEAURefcountedRep@123@XZ + ?Register@CycleClockSource@base_internal@absl@@CAXP6A_JXZ@Z + ?RegisterAbortHook@raw_log_internal@absl@@YAXP6AXPEBDH000@Z@Z + ?RegisterAndInitialize@log_internal@absl@@YAHPEAVVLogSite@12@@Z + ?RegisterCommandLineFlag@flags_internal@absl@@YA_NAEAVCommandLineFlag@2@PEBD@Z + ?RegisterCondVarTracer@absl@@YAXP6AXPEBDPEBX@Z@Z + ?RegisterDebugStackTraceHook@debugging_internal@absl@@YAXP6AXQEBQEAXHP6AXPEBDPEAX@Z2@Z@Z + ?RegisterFlag@FlagRegistry@flags_internal@absl@@QEAAXAEAVCommandLineFlag@3@PEBD@Z + ?RegisterInternalLogFunction@raw_log_internal@absl@@YAXP6AXW4LogSeverity@2@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@Z + ?RegisterLivePointers@absl@@YAXPEBX_K@Z + ?RegisterLogFilterAndPrefixHook@raw_log_internal@absl@@YAXP6A_NW4LogSeverity@2@PEBDHPEAPEADPEAH@Z@Z + ?RegisterMutexProfiler@absl@@YAXP6AX_J@Z@Z + ?RegisterMutexTracer@absl@@YAXP6AXPEBDPEBX_J@Z@Z + ?RegisterSpinLockProfiler@base_internal@absl@@YAXP6AXPEBX_J@Z@Z + ?RegisterWithTsan@SpinLock@base_internal@absl@@AEAAXXZ + ?Rehash@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?RehashProbabilityConstant@container_internal@absl@@YA_KXZ + ?RelaxedCopyFromAtomic@SequenceLock@flags_internal@absl@@CAXPEAXPEBU?$atomic@_K@__Cr@std@@_K@Z + ?RelaxedCopyToAtomic@SequenceLock@flags_internal@absl@@CAXPEAU?$atomic@_K@__Cr@std@@PEBX_K@Z + ?Release@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEHAA?AU?$Allocation@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@23@XZ + ?Release@?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEHAA?AU?$Allocation@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@23@XZ + ?Release@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEHAA?AU?$Allocation@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@23@XZ + ?Release@ReleasableMutexLock@absl@@QEAAXXZ + ?Remove@CondVar@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?RemoveChunkPrefix@ChunkIterator@Cord@absl@@AEAAX_K@Z + ?RemoveCrc32cPrefix@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?RemoveCrc32cSuffix@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?RemoveCrcNode@cord_internal@absl@@YAPEAUCordRep@12@PEAU312@@Z + ?RemoveEdge@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@0@Z + ?RemoveExtraAsciiWhitespace@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?RemoveLogSink@log_internal@absl@@YAXPEAVLogSink@2@@Z + ?RemoveNode@GraphCycles@synchronization_internal@absl@@QEAAXPEAX@Z + ?RemovePrefix@Cord@absl@@QEAAX_K@Z + ?RemoveSuffix@Cord@absl@@QEAAX_K@Z + ?RemoveSuffix@CordRepBtree@cord_internal@absl@@SAPEAUCordRep@23@PEAV123@_K@Z + ?RepToPointer@Status@absl@@CAPEBVStatusRep@status_internal@2@_K@Z + ?ReportUnrecognizedFlags@absl@@YAXAEBV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@@Z + ?ReportUsageError@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_N@Z + ?ReserveEmptyNonAllocatedTableToFitBucketCount@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?ReserveTableToFitNewSize@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?Reset@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAXXZ + ?Reset@?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAXXZ + ?Reset@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAXXZ + ?ResetToBuiltinUTC@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z + ?ResetToEmpty@InlineRep@Cord@absl@@AEAAXXZ + ?Resize@?$ResizeUninitializedTraits@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@X@strings_internal@absl@@SAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ?ResizeAllocatedTableWithSeedChange@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?ResourceExhaustedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Restore@FlagState@flags_internal@absl@@EEHAAXXZ + ?RestoreState@FlagImpl@flags_internal@absl@@AEAA_NAEBVFlagState@23@@Z + ?RestoreToRegistry@FlagSaverImpl@flags_internal@absl@@QEHAAXXZ + ?Retire@flags_internal@absl@@YAXPEBDPEBXPEAE@Z + ?ReverseConsume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z + ?RoundUp@cord_internal@absl@@YA_K_K0@Z + ?RoundUpForTag@cord_internal@absl@@YA_K_K@Z + ?RuntimeTypeId@flags_internal@absl@@YAPEBVtype_info@@P6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ?SafeToDelete@CordzHandle@cord_internal@absl@@QEBA_NXZ + ?SampleSlow@container_internal@absl@@YAPEAUHashtablezInfo@12@AEAUSamplingState@12@_K11G@Z + ?SanitizerPoisonMemoryRegion@container_internal@absl@@YAXPEBX_K@Z + ?SanitizerSafeCopy@Rep@InlineData@cord_internal@absl@@QEBAAEBU1234@XZ + ?SanitizerUnpoisonMemoryRegion@container_internal@absl@@YAXPEBX_K@Z + ?SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ + ?SaveState@FlagImpl@flags_internal@absl@@EEAA?AV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?SaveState@PrivateHandleAccessor@flags_internal@absl@@SA?AV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAVCommandLineFlag@3@@Z + ?Scramble@CRC32@crc_internal@absl@@UEBAXPEAI@Z + ?Seek@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUPosition@123@_K@Z + ?Seek@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?SendToLog@LogMessage@log_internal@absl@@AEAAXXZ + ?SentinelEmptyGeneration@container_internal@absl@@YAEXZ + ?Set@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@AEAAXAEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@Z + ?Set@MaskedPointer@flags_internal@absl@@QEAAXP6APEAXW4FlagOp@23@PEBXPEAX2@Z1_N@Z + ?SetAllocation@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXU?$Allocation@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@23@@Z + ?SetAllocation@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXU?$Allocation@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@23@@Z + ?SetAllocation@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXU?$Allocation@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@23@@Z + ?SetAllocation@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXU?$Allocation@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@23@@Z + ?SetAndroidNativeTag@absl@@YAXPEBD@Z + ?SetCallback@FlagImpl@flags_internal@absl@@QEAAXQ6AXXZ@Z + ?SetConversionChar@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXW4FormatConversionChar@3@PEAVFormatConversionSpecImpl@23@@Z + ?SetCordBtreeExhaustiveValidation@cord_internal@absl@@YAX_N@Z + ?SetCordRep@CordzInfo@cord_internal@absl@@QEAAXPEAUCordRep@23@@Z + ?SetCordRep@CordzUpdateScope@cord_internal@absl@@QEBAXPEAUCordRep@23@@Z + ?SetCrcCordState@Cord@absl@@AEAAXVCrcCordState@crc_internal@2@@Z + ?SetCurrentThreadIdentity@base_internal@absl@@YAXPEAUThreadIdentity@12@P6AXPEAX@Z@Z + ?SetExitOnDFatal@log_internal@absl@@YAX_N@Z + ?SetExpectedChecksum@Cord@absl@@QEAAXI@Z + ?SetFailQuietly@LogMessage@log_internal@absl@@IEAAXXZ + ?SetFlags@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXW4Flags@23@PEAVFormatConversionSpecImpl@23@@Z + ?SetFlagsHelpFormat@flags_internal@absl@@YAXW4HelpFormat@12@@Z + ?SetFlagsHelpMatchSubstr@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetFlagsHelpMode@flags_internal@absl@@YAXW4HelpMode@12@@Z + ?SetFlagsUsageConfig@absl@@YAXUFlagsUsageConfig@1@@Z + ?SetHashtablezConfigListener@container_internal@absl@@YAXP6AXXZ@Z + ?SetHashtablezEnabled@container_internal@absl@@YAX_N@Z + ?SetHashtablezEnabledInternal@container_internal@absl@@YAX_N@Z + ?SetHashtablezMaxSamples@container_internal@absl@@YAX_K@Z + ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAX_K@Z + ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z + ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z + ?SetInitialized@log_internal@absl@@YAXXZ + ?SetIsAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?SetIsAllocated@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?SetIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?SetIsAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?SetLength@CordBuffer@absl@@QEAAX_K@Z + ?SetLengthMod@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXW4LengthMod@3@PEAVFormatConversionSpecImpl@23@@Z + ?SetLogBacktraceLocation@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?SetLoggingGlobalsListener@log_internal@absl@@YAXP6AXXZ@Z + ?SetMaxFramesInLogStackTrace@log_internal@absl@@YAXH@Z + ?SetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAAX_K@Z + ?SetMinLogLevel@absl@@YAXW4LogSeverityAtLeast@1@@Z + ?SetMutexDeadlockDetectionMode@absl@@YAXW4OnDeadlockCycle@1@@Z + ?SetPayload@StatusRep@status_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VCord@3@@Z + ?SetPrecision@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPEAVFormatConversionSpecImpl@23@@Z + ?SetProgramInvocationName@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetProgramUsageMessage@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetSize@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z + ?SetStackUnwinder@absl@@YAXP6AHPEAPEAXPEAHHHPEBX1@Z@Z + ?SetStatusPayloadPrinter@status_internal@absl@@YAXP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@AEBVCord@2@@Z@Z + ?SetStderrThreshold@absl@@YAXW4LogSeverityAtLeast@1@@Z + ?SetSuppressSigabortTrace@log_internal@absl@@YA_N_N@Z + ?SetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAXPEAU?$atomic@H@__Cr@std@@@Z + ?SetTimeZone@log_internal@absl@@YAXVTimeZone@2@@Z + ?SetToZero@?$BigUnsigned@$03@strings_internal@absl@@QEAAXXZ + ?SetToZero@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXXZ + ?SetTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@AEBVCordzUpdateScope@53@@Z + ?SetTreeOrEmpty@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@AEBVCordzUpdateScope@53@@Z + ?SetVModuleListHeadForTestOnly@log_internal@absl@@YAPEAVVLogSite@12@PEAV312@@Z + ?SetValue@?$Manager@D$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBD@Z + ?SetValue@?$Manager@H$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBH@Z + ?SetValue@?$Manager@I$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBI@Z + ?SetValue@?$Manager@M$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBM@Z + ?SetValue@?$Manager@N$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBN@Z + ?SetValue@?$Manager@PEBD$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBQEBD@Z + ?SetValue@?$Manager@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetValue@?$Manager@_J$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEB_J@Z + ?SetWidth@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPEAVFormatConversionSpecImpl@23@@Z + ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?ShiftLeft@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?ShortProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ShouldFixUpStack@internal_stacktrace@absl@@YA_NXZ + ?ShouldLog@LogEveryNSecState@log_internal@absl@@QEAA_NN@Z + ?ShouldLog@LogEveryNState@log_internal@absl@@QEAA_NH@Z + ?ShouldLog@LogEveryPow2State@log_internal@absl@@QEAA_NXZ + ?ShouldLog@LogFirstNState@log_internal@absl@@QEAA_NH@Z + ?ShouldLogBacktraceAt@log_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?ShouldPrependLogPrefix@absl@@YA_NXZ + ?ShouldSampleNextTable@container_internal@absl@@YA_NXZ + ?ShouldSymbolizeLogStackTrace@log_internal@absl@@YA_NXZ + ?SigSafeArena@base_internal@absl@@YAPEAUArena@LowLevelAlloc@12@XZ + ?Signal@CondVar@absl@@QEAAXXZ + ?SignalAll@CondVar@absl@@QEAAXXZ + ?SignedAddResult@int128_internal@absl@@YA?AVint128@2@V32@0@Z + ?SignedSubstructResult@int128_internal@absl@@YA?AVint128@2@V32@00@Z + ?SimpleAtob@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_N@Z + ?SimpleAtod@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAN@Z + ?SimpleAtof@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAM@Z + ?SimpleAtoi@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVint128@1@@Z + ?SimpleAtoi@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVuint128@1@@Z + ?SimpleHexAtoi@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVint128@1@@Z + ?SimpleHexAtoi@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVuint128@1@@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ?SixDigitsToBuffer@numbers_internal@absl@@YA_KNPEAD@Z + ?SizeToCapacity@container_internal@absl@@YA_K_K@Z + ?Sizeof@flags_internal@absl@@YA_KP6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SA_KXZ + ?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SA_KXZ + ?Skip@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUPosition@123@_K@Z + ?SkipCrcNode@cord_internal@absl@@YAPEAUCordRep@12@PEAU312@@Z + ?SkipCrcNode@cord_internal@absl@@YAPEBUCordRep@12@PEBU312@@Z + ?SleepFor@absl@@YAXVDuration@1@@Z + ?SlowIsEnabled0@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled1@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled2@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled3@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled4@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled5@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled@VLogSite@log_internal@absl@@AEAA_NHH@Z + ?SlowLock@SpinLock@base_internal@absl@@AEAAXXZ + ?SlowUnlock@SpinLock@base_internal@absl@@AEAAXI@Z + ?SnprintF@str_format_internal@absl@@YAHPEAD_KVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?SooCapacity@container_internal@absl@@YA_KXZ + ?SooControl@container_internal@absl@@YAPEAW4ctrl_t@12@XZ + ?SooEnabled@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CA_NXZ + ?SooSlotIndex@container_internal@absl@@YA_KXZ + ?SpinLockDelay@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@IHW4SchedulingMode@12@@Z + ?SpinLockSuggestedDelayNS@base_internal@absl@@YAHH@Z + ?SpinLockWait@base_internal@absl@@YAIPEAU?$atomic@I@__Cr@std@@HQEBUSpinLockWaitTransition@12@W4SchedulingMode@12@@Z + ?SpinLockWake@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@_N@Z + ?SpinLoop@SpinLock@base_internal@absl@@AEAAIXZ + ?StackTraceWorksForTest@debugging_internal@absl@@YA_NXZ + ?StartsWith@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StartsWithIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StatusCodeToString@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusCode@1@@Z + ?StatusMessageAsCStr@absl@@YAPEBDAEBVStatus@1@@Z + ?StderrThreshold@absl@@YA?AW4LogSeverityAtLeast@1@XZ + ?SteadyClockNow@KernelTimeout@synchronization_internal@absl@@CA_JXZ + ?Store16@little_endian@absl@@YAXPEAXG@Z + ?Store32@little_endian@absl@@YAXPEAXI@Z + ?Store64@little_endian@absl@@YAXPEAX_K@Z + ?Store@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@QEAAXP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@Z@Z + ?Store@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@QEAAXP6AXPEBDH000@Z@Z + ?Store@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@QEAAXP6AXPEBDPEBX@Z@Z + ?Store@?$AtomicHook@P6AXPEBDPEBX_J@Z@base_internal@absl@@QEAAXP6AXPEBDPEBX_J@Z@Z + ?Store@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@QEAAXP6AXPEBX_J@Z@Z + ?Store@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEAAXP6AXW4LogSeverity@3@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@Z + ?Store@?$AtomicHook@P6AXXZ@base_internal@absl@@QEAAXP6AXXZ@Z + ?Store@?$AtomicHook@P6AX_J@Z@base_internal@absl@@QEAAXP6AX_J@Z@Z + ?Store@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@QEAAXP6A_NW4LogSeverity@3@PEBDHPEAPEADPEAH@Z@Z + ?StoreValue@FlagImpl@flags_internal@absl@@AEAAXPEBXW4ValueSource@23@@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@111@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@11@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@1@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@000@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@00@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@0@Z + ?StrContains@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StrContains@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?StrContainsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StrContainsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?StrError@base_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?StrReplaceAll@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@4@@Z + ?StrReplaceAll@absl@@YAHV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@3@@Z + ?StripAsciiWhitespace@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?StripLeadingAsciiWhitespace@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?StripTrailingAsciiWhitespace@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?SubTree@CordRepBtree@cord_internal@absl@@QEAAPEAUCordRep@23@_K0@Z + ?Subcord@Cord@absl@@QEBA?AV12@_K0@Z + ?SubstituteAndAppendArray@substitute_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@PEBV645@_K@Z + ?Substring@CordRepSubstring@cord_internal@absl@@SAPEAUCordRep@23@PEAU423@_K1@Z + ?SubstructResult@int128_internal@absl@@YA?AVuint128@2@V32@00@Z + ?SubtractSize@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z + ?SubtractSize@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z + ?Summarize@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?SupportsArmCRC32PMULL@crc_internal@absl@@YA_NXZ + ?SuppressSigabortTrace@log_internal@absl@@YA_NXZ + ?Symbolize@absl@@YA_NPEBXPEADH@Z + ?TagToAllocatedSize@cord_internal@absl@@YA_KE@Z + ?TagToLength@cord_internal@absl@@YA_KE@Z + ?TakeRep@Cord@absl@@AEGBAPEAUCordRep@cord_internal@2@XZ + ?TakeRep@Cord@absl@@AEHAAPEAUCordRep@cord_internal@2@XZ + ?TestOnlyAddNodes@GraphCycles@synchronization_internal@absl@@QEAAXI@Z + ?TestOnlyRefreshSamplingStateForCurrentThread@container_internal@absl@@YAXXZ + ?ThreadIsLoggingToLogSink@log_internal@absl@@YA_NXZ + ?ThrowBadStatusOrAccess@internal_statusor@absl@@YAXVStatus@2@@Z + ?ThrowSeedGenException@random_internal@absl@@YAXXZ + ?ThrowStdBadAlloc@base_internal@absl@@YAXXZ + ?ThrowStdBadFunctionCall@base_internal@absl@@YAXXZ + ?ThrowStdDomainError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdDomainError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdInvalidArgument@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdInvalidArgument@base_internal@absl@@YAXPEBD@Z + ?ThrowStdLengthError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdLengthError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdLogicError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdLogicError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdOutOfRange@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdOutOfRange@base_internal@absl@@YAXPEBD@Z + ?ThrowStdOverflowError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdOverflowError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdRangeError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdRangeError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdRuntimeError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdRuntimeError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdUnderflowError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdUnderflowError@base_internal@absl@@YAXPEBD@Z + ?Tick@PerThreadSem@synchronization_internal@absl@@SAXPEAUThreadIdentity@base_internal@3@@Z + ?TimeFromTimespec@absl@@YA?AVTime@1@Utimespec@@@Z + ?TimeFromTimeval@absl@@YA?AVTime@1@Utimeval@@@Z + ?TimeLocal@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@_J@Z + ?TimeZone@log_internal@absl@@YAPEBV02@XZ + ?ToChronoDuration@KernelTimeout@synchronization_internal@absl@@QEBA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@XZ + ?ToChronoHours@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMicroseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMilliseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0DOI@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMinutes@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoNanoseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoSeconds@absl@@YA?AV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoTime@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@VTime@1@@Z + ?ToChronoTimePoint@KernelTimeout@synchronization_internal@absl@@QEBA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@XZ + ?ToCivilSecond@absl@@YA?AV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTime@1@VTimeZone@1@@Z + ?ToDoubleHours@absl@@YANVDuration@1@@Z + ?ToDoubleMicroseconds@absl@@YANVDuration@1@@Z + ?ToDoubleMilliseconds@absl@@YANVDuration@1@@Z + ?ToDoubleMinutes@absl@@YANVDuration@1@@Z + ?ToDoubleNanoseconds@absl@@YANVDuration@1@@Z + ?ToDoubleSeconds@absl@@YANVDuration@1@@Z + ?ToHost16@big_endian@absl@@YAGG@Z + ?ToHost16@little_endian@absl@@YAGG@Z + ?ToHost32@big_endian@absl@@YAII@Z + ?ToHost32@little_endian@absl@@YAII@Z + ?ToHost64@little_endian@absl@@YA_K_K@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DOI@@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0PECEA@@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$0DM@$00@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$0OBA@$00@__Cr@std@@@Z + ?ToInt64Hours@absl@@YA_JVDuration@1@@Z + ?ToInt64Microseconds@absl@@YA_JVDuration@1@@Z + ?ToInt64Milliseconds@absl@@YA_JVDuration@1@@Z + ?ToInt64Minutes@absl@@YA_JVDuration@1@@Z + ?ToInt64Nanoseconds@absl@@YA_JVDuration@1@@Z + ?ToInt64Seconds@absl@@YA_JVDuration@1@@Z + ?ToOpResult@CordRepBtree@cord_internal@absl@@AEAA?AUOpResult@123@_N@Z + ?ToSinkAlso@LogMessage@log_internal@absl@@QEAAAEAV123@PEAVLogSink@3@@Z + ?ToSinkOnly@LogMessage@log_internal@absl@@QEAAAEAV123@PEAVLogSink@3@@Z + ?ToString@?$BigUnsigned@$03@strings_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@Status@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusToStringMode@2@@Z + ?ToString@StatusRep@status_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusToStringMode@3@@Z + ?ToString@int128@absl@@AEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@uint128@absl@@AEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToStringSlow@Status@absl@@CA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KW4StatusToStringMode@2@@Z + ?ToTM@absl@@YA?AUtm@@VTime@1@VTimeZone@1@@Z + ?ToTimeT@absl@@YA_JVTime@1@@Z + ?ToTimespec@absl@@YA?AUtimespec@@VDuration@1@@Z + ?ToTimespec@absl@@YA?AUtimespec@@VTime@1@@Z + ?ToTimeval@absl@@YA?AUtimeval@@VDuration@1@@Z + ?ToTimeval@absl@@YA?AUtimeval@@VTime@1@@Z + ?ToUDate@absl@@YANVTime@1@@Z + ?ToUniversal@absl@@YA_JVTime@1@@Z + ?ToUnixDuration@time_internal@absl@@YA?AVDuration@2@VTime@2@@Z + ?ToUnixMicros@absl@@YA_JVTime@1@@Z + ?ToUnixMillis@absl@@YA_JVTime@1@@Z + ?ToUnixNanos@absl@@YA_JVTime@1@@Z + ?ToUnixSeconds@absl@@YA_JVTime@1@@Z + ?ToUnixSeconds@cctz@time_internal@absl@@YA_JAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?TraceContinue@base_internal@absl@@YAXPEBXW4ObjectKind@12@@Z + ?TraceObjectKind@BlockingCounter@absl@@CA?AW4ObjectKind@base_internal@2@XZ + ?TraceObjectKind@Notification@absl@@CA?AW4ObjectKind@base_internal@2@XZ + ?TraceSignal@base_internal@absl@@YAXPEBXW4ObjectKind@12@@Z + ?TraceWait@base_internal@absl@@YAXPEBXW4ObjectKind@12@@Z + ?Track@CordzInfo@cord_internal@absl@@AEAAXXZ + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@W4MethodIdentifier@CordzUpdateTracker@23@_J@Z + ?TrailingZeros@?$NonIterableBitMask@_K$07$02@container_internal@absl@@QEBAIXZ + ?Trans@Mutex@absl@@AEAAXPEBUMuHowS@2@@Z + ?Trunc@absl@@YA?AVDuration@1@V21@0@Z + ?TryLockImpl@SpinLock@base_internal@absl@@AEAA_NXZ + ?TryLockInternal@SpinLock@base_internal@absl@@AEAAIII@Z + ?TryLockSlow@Mutex@absl@@AEAA_NXZ + ?TryNewCRC32AcceleratedX86ARMCombined@crc_internal@absl@@YAPEAVCRCImpl@12@XZ + ?TryParse@FlagImpl@flags_internal@absl@@AEBA?AV?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?TryRead@SequenceLock@flags_internal@absl@@QEBA_NPEAXPEBU?$atomic@_K@__Cr@std@@_K@Z + ?TryRemove@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?TypeId@FlagImpl@flags_internal@absl@@EEBAPEBXXZ + ?TypeId@PrivateHandleAccessor@flags_internal@absl@@SAPEBXAEBVCommandLineFlag@3@@Z + ?TypeName@CommandLineFlag@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?TypeName@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?TypeName@PrivateHandleAccessor@flags_internal@absl@@SA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCommandLineFlag@3@@Z + ?UTC@Impl@time_zone@cctz@time_internal@absl@@SA?AV2345@XZ + ?UTC@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?UTC@TimeZoneInfo@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?UTCImpl@Impl@time_zone@cctz@time_internal@absl@@CAPEBV12345@XZ + ?UTCTimeZone@absl@@YA?AVTimeZone@1@XZ + ?Uint128High64@absl@@YA_KVuint128@1@@Z + ?Uint128Low64@absl@@YA_KVuint128@1@@Z + ?Uint128Max@absl@@YA?AVuint128@1@XZ + ?UnRegisterLivePointers@absl@@YAXPEBX_K@Z + ?UnalignedLoad16@base_internal@absl@@YAGPEBX@Z + ?UnalignedLoad32@base_internal@absl@@YAIPEBX@Z + ?UnalignedLoad64@base_internal@absl@@YA_KPEBX@Z + ?UnalignedStore16@base_internal@absl@@YAXPEAXG@Z + ?UnalignedStore32@base_internal@absl@@YAXPEAXI@Z + ?UnalignedStore64@base_internal@absl@@YAXPEAX_K@Z + ?UnauthenticatedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnavailableError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnextendByZeroes@CRC32@crc_internal@absl@@UEBAXPEAI_K@Z + ?UnextendCrc32cByZeroes@crc_internal@absl@@YA?AVcrc32c_t@2@V32@_K@Z + ?UnimplementedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UniversalEpoch@absl@@YA?AVTime@1@XZ + ?UnknownError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Unlock@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UnlockSlow@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@F@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@G@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@M@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@P6APEAXW4FlagOp@12@PEBXPEAX2@Z1@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@Vint128@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@Vuint128@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_N@Z + ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?Unref@CordRep@cord_internal@absl@@SAXPEAU123@@Z + ?Unref@CordRepBtree@cord_internal@absl@@SAXV?$Span@QEAUCordRep@cord_internal@absl@@@3@@Z + ?Unref@CrcCordState@crc_internal@absl@@CAXPEAURefcountedRep@123@@Z + ?Unref@Status@absl@@CAX_K@Z + ?Unref@StatusRep@status_internal@absl@@QEBAXXZ + ?UnrefTree@InlineRep@Cord@absl@@AEAAXXZ + ?Unregister@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAAXPEAUHashtablezInfo@container_internal@3@@Z + ?Unregister@HashtablezInfoHandle@container_internal@absl@@QEAAXXZ + ?UnsafeSetCordRep@CordzInfo@cord_internal@absl@@AEAAXPEAUCordRep@23@@Z + ?UnsampleSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?Unscramble@CRC32@crc_internal@absl@@UEBAXPEAI@Z + ?Untrack@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UpdateGlobalVLogLevel@log_internal@absl@@YAHH@Z + ?UpdateStackTrace@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@HP6AHPEAPEAXH@Z@Z + ?UpdateVLogSites@log_internal@absl@@YAXXZ + ?UpdateVModule@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UsingInlinedStorage@Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@CA_N_K@Z + ?Utf8SafeCEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?Utf8SafeCHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?VLogLevel@log_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ValidateInputValue@FlagImpl@flags_internal@absl@@EEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ValidateInputValue@PrivateHandleAccessor@flags_internal@absl@@SA_NAEBVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Value@?$Manager@C$01@FormatArgImpl@str_format_internal@absl@@SACTData@234@@Z + ?Value@?$Manager@D$01@FormatArgImpl@str_format_internal@absl@@SADTData@234@@Z + ?Value@?$Manager@E$01@FormatArgImpl@str_format_internal@absl@@SAETData@234@@Z + ?Value@?$Manager@F$01@FormatArgImpl@str_format_internal@absl@@SAFTData@234@@Z + ?Value@?$Manager@G$01@FormatArgImpl@str_format_internal@absl@@SAGTData@234@@Z + ?Value@?$Manager@H$01@FormatArgImpl@str_format_internal@absl@@SAHTData@234@@Z + ?Value@?$Manager@I$01@FormatArgImpl@str_format_internal@absl@@SAITData@234@@Z + ?Value@?$Manager@J$01@FormatArgImpl@str_format_internal@absl@@SAJTData@234@@Z + ?Value@?$Manager@K$01@FormatArgImpl@str_format_internal@absl@@SAKTData@234@@Z + ?Value@?$Manager@M$01@FormatArgImpl@str_format_internal@absl@@SAMTData@234@@Z + ?Value@?$Manager@N$01@FormatArgImpl@str_format_internal@absl@@SANTData@234@@Z + ?Value@?$Manager@O$01@FormatArgImpl@str_format_internal@absl@@SAOTData@234@@Z + ?Value@?$Manager@PEBD$01@FormatArgImpl@str_format_internal@absl@@SAPEBDTData@234@@Z + ?Value@?$Manager@PEB_W$01@FormatArgImpl@str_format_internal@absl@@SAPEB_WTData@234@@Z + ?Value@?$Manager@UVoidPtr@str_format_internal@absl@@$01@FormatArgImpl@str_format_internal@absl@@SA?AUVoidPtr@34@TData@234@@Z + ?Value@?$Manager@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SAAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@TData@234@@Z + ?Value@?$Manager@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SAAEBV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@TData@234@@Z + ?Value@?$Manager@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@TData@234@@Z + ?Value@?$Manager@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SAAEBV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@TData@234@@Z + ?Value@?$Manager@Vint128@absl@@$0A@@FormatArgImpl@str_format_internal@absl@@SAAEBVint128@4@TData@234@@Z + ?Value@?$Manager@Vuint128@absl@@$0A@@FormatArgImpl@str_format_internal@absl@@SAAEBVuint128@4@TData@234@@Z + ?Value@?$Manager@_J$01@FormatArgImpl@str_format_internal@absl@@SA_JTData@234@@Z + ?Value@?$Manager@_K$01@FormatArgImpl@str_format_internal@absl@@SA_KTData@234@@Z + ?Value@?$Manager@_N$01@FormatArgImpl@str_format_internal@absl@@SA_NTData@234@@Z + ?Value@CordzUpdateTracker@cord_internal@absl@@QEBA_JW4MethodIdentifier@123@@Z + ?ValueOffset@flags_internal@absl@@YA_JP6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ?ValueStorageKind@FlagImpl@flags_internal@absl@@AEBA?AW4FlagValueStorageKind@23@XZ + ?VarintSize@log_internal@absl@@YA_K_K@Z + ?Version@Impl@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@ZoneInfoSource@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Wait@BlockingCounter@absl@@QEAAXXZ + ?Wait@PerThreadSem@synchronization_internal@absl@@CA_NVKernelTimeout@23@@Z + ?Wait@StdcppWaiter@synchronization_internal@absl@@QEAA_NVKernelTimeout@23@@Z + ?Wait@Win32Waiter@synchronization_internal@absl@@QEAA_NVKernelTimeout@23@@Z + ?WaitCommon@CondVar@absl@@AEAA_NPEAVMutex@2@VKernelTimeout@synchronization_internal@2@@Z + ?WaitForNotification@Notification@absl@@QEBAXXZ + ?WaitForNotificationWithDeadline@Notification@absl@@QEBA_NVTime@2@@Z + ?WaitForNotificationWithTimeout@Notification@absl@@QEBA_NVDuration@2@@Z + ?Wakeup@Mutex@absl@@AEAAPEAUPerThreadSynch@base_internal@2@PEAU342@@Z + ?WasPresentOnCommandLine@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?WebSafeBase64Escape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?WebSafeBase64Escape@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?WebSafeBase64Unescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?WideToUtf8@strings_internal@absl@@YA_K_WPEADAEAUShiftState@12@@Z + ?WithMetadataFrom@LogMessage@log_internal@absl@@QEAAAEAV123@AEBVLogEntry@3@@Z + ?WithPerror@LogMessage@log_internal@absl@@QEAAAEAV123@XZ + ?WithThreadID@LogMessage@log_internal@absl@@QEAAAEAV123@I@Z + ?WithTimestamp@LogMessage@log_internal@absl@@QEAAAEAV123@VTime@3@@Z + ?WithVerbosity@LogMessage@log_internal@absl@@QEAAAEAV123@H@Z + ?Write@BufferRawSink@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@FILERawSink@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@FlagImpl@flags_internal@absl@@QEAAXPEBX@Z + ?Write@FormatRawSinkImpl@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@SequenceLock@flags_internal@absl@@QEAAXPEAU?$atomic@_K@__Cr@std@@PEBX_K@Z + ?WriteToStderr@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4LogSeverity@2@@Z + ?ZeroDuration@absl@@YA?AVDuration@1@XZ + ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ + ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ + ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__addr@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ + ?__addr@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?__alloc@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAAEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?__alloc@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAAEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?__alloc@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__annotate_contiguous_container@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_delete@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBAXXZ + ?__annotate_increase@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase_back@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase_back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBAX_K@Z + ?__annotate_poison_block@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_shrink@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink_back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K0@Z + ?__annotate_whole_block@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_KW4__asan_annotation_type@123@@Z + ?__annotate_whole_block@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_KW4__asan_annotation_type@123@@Z + ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__as_base@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@IEGAA@XZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__back_spare_blocks@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__base_destruct_at_end@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAPEAVLogSink@absl@@@Z + ?__base_destruct_at_end@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__base_destruct_at_end@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__base_destruct_at_end@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__begin@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@@Z + ?__begin@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBQEBU4567@@Z + ?__call@?$__to_address_helper@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@X@__Cr@std@@SAPEAPEAVCommandLineFlag@absl@@AEBV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@@Z + ?__call@?$__to_address_helper@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@X@__Cr@std@@SAPEAPEAVLogSink@absl@@AEBV?$__wrap_iter@PEAPEAVLogSink@absl@@@23@@Z + ?__call@?$__to_address_helper@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@X@__Cr@std@@SAPEAPEBVCommandLineFlag@absl@@AEBV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@23@@Z + ?__call@?$__to_address_helper@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@X@__Cr@std@@SAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@AEBV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@@Z + ?__capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__complete@?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@__Cr@std@@QEAAXXZ + ?__complete@?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?__compose@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU5678@@Z + ?__construct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX_K@Z + ?__construct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX_K@Z + ?__construct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__construct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__copy_assign_alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEBV123@@Z + ?__copy_assign_alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEBV123@U?$integral_constant@_N$0A@@23@@Z + ?__deallocate_node@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@@Z + ?__deallocate_node@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@@Z + ?__deallocate_node_list@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAXPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@@Z + ?__deallocate_node_list@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@@Z + ?__destruct_at_begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__destruct_at_begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$00@23@@Z + ?__destruct_at_begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$00@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAPEAVLogSink@absl@@@Z + ?__destruct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__end@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@@Z + ?__end@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBQEBU4567@@Z + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__erase_to_end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEAVCommandLineFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEBVCommandLineFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAPEAUUnrecognizedFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAVCommandLineFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAVLogSink@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEBVCommandLineFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UUnrecognizedFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@XZ + ?__get_np@?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@XZ + ?__get_np@?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ + ?__get_value@?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@QEAAAEAPEBUCordRep@cord_internal@absl@@XZ + ?__get_value@?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@QEAAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_value@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@QEAAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@XZ + ?__get_value@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@QEAAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@XZ + ?__hash@?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__hash@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@AEAPEAV?$__tree_node_base@PEAX@23@PEAV523@@Z + ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@AEAPEAV?$__tree_node_base@PEAX@23@PEAV523@@Z + ?__local@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@Z + ?__local@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z + ?__make_iter@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@PEAPEAVCommandLineFlag@absl@@@Z + ?__make_iter@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@23@PEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__make_iter@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@23@PEAPEAVLogSink@absl@@@Z + ?__make_iter@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBA?AV?$__wrap_iter@PEBQEAVLogSink@absl@@@23@PEBQEAVLogSink@absl@@@Z + ?__make_iter@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@23@PEAPEBVCommandLineFlag@absl@@@Z + ?__make_iter@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA?AV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__make_iter@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@PEAUTransition@cctz@time_internal@absl@@@Z + ?__make_iter@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@PEAUTransitionType@cctz@time_internal@absl@@@Z + ?__make_iter@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@23@PEAUUnrecognizedFlag@absl@@@Z + ?__make_iter@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEBA?AV?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@23@PEBUUnrecognizedFlag@absl@@@Z + ?__make_iter@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__maybe_remove_back_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAA_N_N@Z + ?__move_range@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransition@cctz@time_internal@absl@@00@Z + ?__move_range@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@00@Z + ?__node_alloc@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?__ptr@?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU123@XZ + ?__ptr@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU123@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEAVCommandLineFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEBAPEAPEAVLogSink@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEBVCommandLineFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEBAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEBAPEAUUnrecognizedFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEBAPEAUViableSubstitution@strings_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEAVCommandLineFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEBAPEAPEAVLogSink@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEBVCommandLineFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEBAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEBAPEAUUnrecognizedFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEBAPEAUViableSubstitution@strings_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__recommend@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBA_K_K@Z + ?__recommend_blocks@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SA_K_K@Z + ?__rehash_unique@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAX_K@Z + ?__rehash_unique@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAX_K@Z + ?__rewrap@?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@SAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@0@Z + ?__rewrap@?$__unwrap_iter_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@PEAPEAVLogSink@absl@@$00@__Cr@std@@SAPEAPEAVLogSink@absl@@PEAPEAV45@0@Z + ?__rewrap@?$__unwrap_iter_impl@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@__Cr@std@@SAPEAUTransition@cctz@time_internal@absl@@PEAU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@__Cr@std@@SAPEAUTransitionType@cctz@time_internal@absl@@PEAU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@$0A@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@V423@0@Z + ?__rewrap@?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@$0A@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@V423@0@Z + ?__rewrap@?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@$00@__Cr@std@@SA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@23@V423@PEAPEAVLogSink@absl@@@Z + ?__rewrap@?$__unwrap_range_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@SA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@SA@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@SA@PEAPEAVLogSink@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@SA@PEAUTransition@cctz@time_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@SA@PEAUTransitionType@cctz@time_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@@__Cr@std@@SA@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@@__Cr@std@@SA@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@0@Z + ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@XZ + ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ + ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAPEAV?$__tree_node_base@PEAX@23@XZ + ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAPEAV?$__tree_node_base@PEAX@23@XZ + ?__segment@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@Z + ?__segment@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEBQEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@0@Z + ?__size@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEA_KXZ + ?__size@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEB_KXZ + ?__size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEA_KXZ + ?__size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEB_KXZ + ?__swap_layouts@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXAEAV?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@PEAU4567@@Z + ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransitionType@cctz@time_internal@absl@@AEAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@PEAU4567@@Z + ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXAEAV?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAV?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@23@@Z + ?__swap_without_allocator@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAV?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXAEAV?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z + ?__throw_length_error@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@CAXXZ + ?__unwrap@?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@SAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@@Z + ?__unwrap@?$__unwrap_iter_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@PEAPEAVLogSink@absl@@$00@__Cr@std@@SAPEAPEAVLogSink@absl@@PEAPEAV45@@Z + ?__unwrap@?$__unwrap_iter_impl@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@__Cr@std@@SAPEAUTransition@cctz@time_internal@absl@@PEAU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@__Cr@std@@SAPEAUTransitionType@cctz@time_internal@absl@@PEAU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@$0A@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@V423@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@$0A@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@V423@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@$00@__Cr@std@@SAPEAPEAVCommandLineFlag@absl@@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@$00@__Cr@std@@SAPEAPEAVLogSink@absl@@V?$__wrap_iter@PEAPEAVLogSink@absl@@@23@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@$00@__Cr@std@@SAPEAPEBVCommandLineFlag@absl@@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@23@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$00@__Cr@std@@SAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@@Z + ?__unwrap@?$__unwrap_range_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@SA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@SA@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@SA@PEAPEAVLogSink@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@SA@PEAUTransition@cctz@time_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@SA@PEAUTransitionType@cctz@time_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@@__Cr@std@@SA@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@@__Cr@std@@SA@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@0@Z + ?__unwrap@?$__unwrap_range_impl@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@__Cr@std@@SA@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@0@Z + ?__upcast@?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@XZ + ?__upcast@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@XZ + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uday_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uhour_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uminute_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Umonth_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Usecond_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uyear_tag@1234@U51234@@Z + ?alloc@Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAAEAV?$allocator@D@__Cr@std@@XZ + ?alloc_size@RawHashSetLayout@container_internal@absl@@QEBA_KXZ + ?allocate@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?allocate@?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@_K@Z + ?allocate@?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@_K@Z + ?allocate@?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@QEAAPEAPEAUCordRep@cord_internal@absl@@_K@Z + ?allocate@?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?allocate@?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAAPEAPEAVCommandLineFlag@absl@@_K@Z + ?allocate@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@_K@Z + ?allocate@?$allocator@PEAVLogSink@absl@@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@_K@Z + ?allocate@?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@QEAAPEAPEBVCommandLineFlag@absl@@_K@Z + ?allocate@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@_K@Z + ?allocate@?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?allocate@?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@QEAAPEAU?$AlignedType@$07@container_internal@absl@@_K@Z + ?allocate@?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@_K@Z + ?allocate@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@_K@Z + ?allocate@?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@QEAAPEAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@56@PEBXPEAX2@Z@_K@Z + ?allocate@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z + ?allocate@?$allocator@UPayload@status_internal@absl@@@__Cr@std@@QEAAPEAUPayload@status_internal@absl@@_K@Z + ?allocate@?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?allocate@?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@_K@Z + ?allocate@?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@_K@Z + ?allocate@?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@QEAAPEAUUnrecognizedFlag@absl@@_K@Z + ?allocate@?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@_K@Z + ?allocate@?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_K@Z + ?allocate@?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_K@Z + ?allocate@?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@_K@Z + ?allocate@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@QEAAPEAVFormatArgImpl@str_format_internal@absl@@_K@Z + ?allocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@AEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@AEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEAPEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAPEAPEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEAU?$AlignedType@$07@container_internal@absl@@AEAV?$allocator@U?$AlignedType@$07@container_internal@absl@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@AEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@AEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@@__Cr@std@@SAPEAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@56@PEBXPEAX2@Z@AEAV?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEAUPayload@status_internal@absl@@AEAV?$allocator@UPayload@status_internal@absl@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEAVFormatArgImpl@str_format_internal@absl@@AEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@23@_K@Z + ?allocate_at_least@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAPEAVCommandLineFlag@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAPEAVCordzHandle@cord_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@PEAVLogSink@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAPEAVLogSink@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAPEBVCommandLineFlag@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAPEBVCordzHandle@cord_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAUTransition@cctz@time_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAUTransitionType@cctz@time_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAUUnrecognizedFlag@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAUViableSubstitution@strings_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA?AU?$allocation_result@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@_K@23@_K@Z + ?arg@BoundConversion@str_format_internal@absl@@QEBAPEBVFormatArgImpl@23@XZ + ?as_chars@InlineData@cord_internal@absl@@QEAAPEADXZ + ?as_chars@InlineData@cord_internal@absl@@QEBAPEBDXZ + ?as_chars@Rep@InlineData@cord_internal@absl@@QEAAPEADXZ + ?as_chars@Rep@InlineData@cord_internal@absl@@QEBAPEBDXZ + ?as_conv@ConvTag@str_format_internal@absl@@QEBA?AW4FormatConversionChar@3@XZ + ?as_flags@ConvTag@str_format_internal@absl@@QEBA?AW4Flags@23@XZ + ?as_length@ConvTag@str_format_internal@absl@@QEBA?AW4LengthMod@3@XZ + ?as_tree@InlineData@cord_internal@absl@@QEBAPEAUCordRep@23@XZ + ?as_tree@InlineRep@Cord@absl@@QEBAPEAUCordRep@cord_internal@3@XZ + ?ascii_isdigit@absl@@YA_NE@Z + ?ascii_isprint@absl@@YA_NE@Z + ?ascii_isspace@absl@@YA_NE@Z + ?ascii_isxdigit@absl@@YA_NE@Z + ?ascii_tolower@absl@@YADE@Z + ?ascii_toupper@absl@@YADE@Z + ?assert_is_full@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAXPEBD@Z + ?at_end@?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBA_NXZ + ?back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAAEAPEAUCordRep@cord_internal@2@XZ + ?back@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEBUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ + ?back@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransitionType@cctz@time_internal@absl@@XZ + ?back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@XZ + ?back@CordRepBtree@cord_internal@absl@@QEBA_KXZ + ?base@?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@QEBAPEAPEAVCommandLineFlag@absl@@XZ + ?base@?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?base@?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@QEBAPEAPEAVLogSink@absl@@XZ + ?base@?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@QEBAPEAPEBVCommandLineFlag@absl@@XZ + ?base@?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ + ?base@?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?base@?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@__Cr@std@@QEBAPEAUUnrecognizedFlag@absl@@XZ + ?base@?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@QEBAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@XZ + ?base@?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?base@?$__wrap_iter@PEBQEAVLogSink@absl@@@__Cr@std@@QEBAPEBQEAVLogSink@absl@@XZ + ?base@?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QEBAPEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?base@?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@QEBAPEBUTransition@cctz@time_internal@absl@@XZ + ?base@?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEBAPEBUTransitionType@cctz@time_internal@absl@@XZ + ?base@?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@__Cr@std@@QEBAPEBUUnrecognizedFlag@absl@@XZ + ?base@?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEGBAAEBQEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?base@?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEGBAAEBQEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?base@?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@QEGBAAEBQEAUTransition@cctz@time_internal@absl@@XZ + ?base@?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEGBAAEBQEAUTransitionType@cctz@time_internal@absl@@XZ + ?begin@?$BitMask@_K$07$02$00@container_internal@absl@@QEBA?AV123@XZ + ?begin@?$BitMask@_K$07$02$0A@@container_internal@absl@@QEBA?AV123@XZ + ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAPEAUPayload@status_internal@2@XZ + ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBAPEBUPayload@status_internal@2@XZ + ?begin@?$Span@$$CBI@absl@@QEBAPEBIXZ + ?begin@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEBVFormatArgImpl@str_format_internal@2@XZ + ?begin@?$Span@I@absl@@QEBAPEAIXZ + ?begin@?$Span@PEAVLogSink@absl@@@absl@@QEBAPEAPEAVLogSink@2@XZ + ?begin@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBAPEBQEAUCordRep@cord_internal@2@XZ + ?begin@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?begin@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?begin@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?begin@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBAPEBQEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEAVCommandLineFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEBVCommandLineFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAPEAUUnrecognizedFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?begin@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@$0BA@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@XZ + ?begin@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@XZ + ?begin@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@XZ + ?begin@?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@QEBAPEBVFormatArgImpl@str_format_internal@absl@@XZ + ?begin@?$initializer_list@W4FormatConversionCharSet@absl@@@std@@QEBAPEBW4FormatConversionCharSet@absl@@XZ + ?begin@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@23@XZ + ?begin@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@23@XZ + ?begin@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@123@XZ + ?begin@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?begin@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@XZ + ?begin@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@23@XZ + ?begin@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@23@XZ + ?begin@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__wrap_iter@PEBQEAVLogSink@absl@@@23@XZ + ?begin@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@23@XZ + ?begin@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ + ?begin@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@XZ + ?begin@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@XZ + ?begin@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@23@XZ + ?begin@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@23@XZ + ?begin@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@XZ + ?begin@ChunkRange@Cord@absl@@QEBA?AVChunkIterator@23@XZ + ?begin@CordRepBtree@cord_internal@absl@@QEBA_KXZ + ?begin@Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEBAPEADXZ + ?begin@__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AU1234@XZ + ?btree@CordRep@cord_internal@absl@@QEAAPEAVCordRepBtree@23@XZ + ?btree@CordRep@cord_internal@absl@@QEBAPEBVCordRepBtree@23@XZ + ?btree@CordRepBtreeNavigator@cord_internal@absl@@QEBAPEAVCordRepBtree@23@XZ + ?btree@CordRepBtreeReader@cord_internal@absl@@QEBAPEAVCordRepBtree@23@XZ + ?bucket_count@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEBA_KXZ + ?bucket_count@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?bytes_value@ProtoField@log_internal@absl@@QEBA?AV?$Span@$$CBD@3@XZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA_KXZ + ?capacity@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@CommonFields@container_internal@absl@@QEBA_KXZ + ?capacity@CordBuffer@absl@@QEBA_KXZ + ?capacity@CordRepBtree@cord_internal@absl@@QEBA_KXZ + ?cbegin@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__wrap_iter@PEBQEAVLogSink@absl@@@23@XZ + ?char_alloc_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAAEAV?$allocator@D@__Cr@std@@XZ + ?char_begin@Cord@absl@@QEBA?AVCharIterator@12@XZ + ?char_end@Cord@absl@@QEBA?AVCharIterator@12@XZ + ?chunk_begin@Cord@absl@@QEBA?AVChunkIterator@12@XZ + ?chunk_end@Cord@absl@@QEBA?AVChunkIterator@12@XZ + ?clear@?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEAAXXZ + ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXXZ + ?clear@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAAXXZ + ?clear@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ?clear@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ?clear@InlineRep@Cord@absl@@QEAAPEAUCordRep@cord_internal@3@XZ + ?clear_backing_array@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAX_N@Z + ?clear_cordz_info@InlineData@cord_internal@absl@@QEAAXXZ + ?code@Status@absl@@QEBA?AW4StatusCode@2@XZ + ?code@StatusRep@status_internal@absl@@QEBA?AW4StatusCode@3@XZ + ?combine@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@23@V423@@Z + ?combine_contiguous@MixingHashState@hash_internal@absl@@SA?AV123@V123@PEBE_K@Z + ?combine_raw@MixingHashState@hash_internal@absl@@CA?AV123@V123@_K@Z + ?common@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAAEAVCommonFields@23@XZ + ?common@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAAEBVCommonFields@23@XZ + ?compare_exchange_strong@?$__atomic_base@PEAUArena@LowLevelAlloc@base_internal@absl@@$0A@@__Cr@std@@QEAA_NAEAPEAUArena@LowLevelAlloc@base_internal@absl@@PEAU4567@W4memory_order@23@2@Z + ?compare_exchange_strong@?$__atomic_base@PEAVTimeZone@absl@@$0A@@__Cr@std@@QEAA_NAEAPEAVTimeZone@absl@@PEAV45@W4memory_order@23@2@Z + ?compare_exchange_strong@?$__atomic_base@PEAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QEAA_NAEAPEAVVLogSite@log_internal@absl@@PEAV456@W4memory_order@23@2@Z + ?compare_exchange_weak@?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__Cr@std@@QEAA_NAEAPEAUHashtablezInfo@container_internal@absl@@PEAU456@W4memory_order@23@2@Z + ?compare_exchange_weak@?$__atomic_base@PEAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QEAA_NAEAPEAVVLogSite@log_internal@absl@@PEAV456@W4memory_order@23@2@Z + ?control@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAPEAW4ctrl_t@23@XZ + ?control@CommonFields@container_internal@absl@@QEBAPEAW4ctrl_t@23@XZ + ?control@HeapOrSoo@container_internal@absl@@QEAAAEAT?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@23@XZ + ?control@HeapOrSoo@container_internal@absl@@QEBA?AT?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@23@XZ + ?control@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAPEAW4ctrl_t@34@XZ + ?control_offset@RawHashSetLayout@container_internal@absl@@QEBA_KXZ + ?conversion_char@FormatConversionSpecImpl@str_format_internal@absl@@QEBA?AW4FormatConversionChar@3@XZ + ?copy_max_inline_to@InlineData@cord_internal@absl@@QEBAXPEAD@Z + ?cordz_info@InlineData@cord_internal@absl@@QEBAPEAVCordzInfo@23@XZ + ?cordz_info@InlineRep@Cord@absl@@QEBAPEAVCordzInfo@cord_internal@3@XZ + ?cordz_info@Rep@InlineData@cord_internal@absl@@QEBA_JXZ + ?cordz_should_profile@cord_internal@absl@@YA_JXZ + ?count@FILERawSink@str_format_internal@absl@@QEBA_KXZ + ?crc@CordRep@cord_internal@absl@@QEAAPEAUCordRepCrc@23@XZ + ?crc@CordRep@cord_internal@absl@@QEBAPEBUCordRepCrc@23@XZ + ?cycle_clock_source_@CycleClock@base_internal@absl@@0U?$atomic@P6A_JXZ@__Cr@std@@A + ?data@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAPEADXZ + ?data@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAPEAPEAUCordRep@cord_internal@2@XZ + ?data@?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEAAPEAPEAVLogSink@2@XZ + ?data@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAPEAUPayload@status_internal@2@XZ + ?data@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBAPEBUPayload@status_internal@2@XZ + ?data@?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QEBAPEBVFormatArgImpl@str_format_internal@2@XZ + ?data@?$Span@$$CBD@absl@@QEBAPEBDXZ + ?data@?$Span@$$CBI@absl@@QEBAPEBIXZ + ?data@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEBVFormatArgImpl@str_format_internal@2@XZ + ?data@?$Span@D@absl@@QEBAPEADXZ + ?data@?$Span@I@absl@@QEBAPEAIXZ + ?data@?$Span@PEAVLogSink@absl@@@absl@@QEBAPEAPEAVLogSink@2@XZ + ?data@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBAPEBQEAUCordRep@cord_internal@2@XZ + ?data@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@$0BA@@__Cr@std@@QEAAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@XZ + ?data@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBQEAVCommandLineFlag@absl@@XZ + ?data@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBQEAVCordzHandle@cord_internal@absl@@XZ + ?data@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@XZ + ?data@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBQEAVLogSink@absl@@XZ + ?data@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBQEBVCommandLineFlag@absl@@XZ + ?data@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBQEBVCordzHandle@cord_internal@absl@@XZ + ?data@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?data@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBUTransition@cctz@time_internal@absl@@XZ + ?data@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBUTransitionType@cctz@time_internal@absl@@XZ + ?data@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBUUnrecognizedFlag@absl@@XZ + ?data@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBUViableSubstitution@strings_internal@absl@@XZ + ?data@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEBV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?data@AlphaNum@absl@@QEBAPEBDXZ + ?data@CordBuffer@absl@@QEAAPEADXZ + ?data@InlineRep@Cord@absl@@QEBAPEBDXZ + ?data@NonEmptyInlinedStorage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAPEADXZ + ?data@Rep@CordBuffer@absl@@QEAAPEADXZ + ?day@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?day@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?day@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z + ?days_per_4years@impl@detail@cctz@time_internal@absl@@YAHH@Z + ?days_per_century@impl@detail@cctz@time_internal@absl@@YAHH@Z + ?days_per_month@impl@detail@cctz@time_internal@absl@@YAH_JC@Z + ?days_per_year@impl@detail@cctz@time_internal@absl@@YAH_JC@Z + ?dealloc@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXXZ + ?deallocate@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@_K@Z + ?deallocate@?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@_K@Z + ?deallocate@?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@_K@Z + ?deallocate@?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?deallocate@?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@_K@Z + ?deallocate@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@_K@Z + ?deallocate@?$allocator@PEAVLogSink@absl@@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@_K@Z + ?deallocate@?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@_K@Z + ?deallocate@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@_K@Z + ?deallocate@?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAAXPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@QEAAXPEAU?$AlignedType@$07@container_internal@absl@@_K@Z + ?deallocate@?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@_K@Z + ?deallocate@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@_K@Z + ?deallocate@?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@QEAAXPEAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@56@PEBXPEAX2@Z@_K@Z + ?deallocate@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z + ?deallocate@?$allocator@UPayload@status_internal@absl@@@__Cr@std@@QEAAXPEAUPayload@status_internal@absl@@_K@Z + ?deallocate@?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAAXPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?deallocate@?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@_K@Z + ?deallocate@?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@_K@Z + ?deallocate@?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_K@Z + ?deallocate@?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_K@Z + ?deallocate@?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@_K@Z + ?deallocate@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@QEAAXPEAVFormatArgImpl@str_format_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@PEAPEAUCordRep@cord_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVCommandLineFlag@absl@@@23@PEAPEAVCommandLineFlag@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@PEAPEAVCordzHandle@cord_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVLogSink@absl@@@23@PEAPEAVLogSink@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVCommandLineFlag@absl@@@23@PEAPEBVCommandLineFlag@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@PEAPEBVCordzHandle@cord_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$AlignedType@$07@container_internal@absl@@@23@PEAU?$AlignedType@$07@container_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@23@PEAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@67@PEBXPEAX3@Z@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@23@PEAUPayload@status_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@23@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@PEAUTransition@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@PEAUTransitionType@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UUnrecognizedFlag@absl@@@23@PEAUUnrecognizedFlag@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@PEAUViableSubstitution@strings_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@23@PEAVFormatArgImpl@str_format_internal@absl@@_K@Z + ?decrement_size@CommonFields@container_internal@absl@@QEAAXXZ + ?decrement_size@HashtableSize@container_internal@absl@@QEAAXXZ + ?decrement_small_size@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXXZ + ?delimiter@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBVByAnyChar@3@XZ + ?delimiter@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBVByAnyChar@3@XZ + ?delimiter@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBVByChar@3@XZ + ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z + ?destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@@Z + ?destroy_slots@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXXZ + ?destructor_impl@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXXZ + ?difference@detail@cctz@time_internal@absl@@YA_JUday_tag@1234@Ufields@1234@1@Z + ?difference@detail@cctz@time_internal@absl@@YA_JUhour_tag@1234@Ufields@1234@1@Z + ?difference@detail@cctz@time_internal@absl@@YA_JUminute_tag@1234@Ufields@1234@1@Z + ?difference@detail@cctz@time_internal@absl@@YA_JUsecond_tag@1234@Ufields@1234@1@Z + ?effective_impl@time_zone@cctz@time_internal@absl@@AEBAAEBVImpl@1234@XZ + ?element@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SAAEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@@Z + ?emplace@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@CAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@@Z + ?empty@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEBA_NXZ + ?empty@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBA_NXZ + ?empty@?$Span@$$CBD@absl@@QEBA_NXZ + ?empty@?$Span@D@absl@@QEBA_NXZ + ?empty@?$Span@I@absl@@QEBA_NXZ + ?empty@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_NXZ + ?empty@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_NXZ + ?empty@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ?empty@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBA_NXZ + ?empty@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA_NXZ + ?empty@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ?empty@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ?empty@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ?empty@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ?empty@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ?empty@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBA_NXZ + ?empty@CommonFields@container_internal@absl@@QEBA_NXZ + ?empty@Cord@absl@@QEBA_NXZ + ?empty@HashtableSize@container_internal@absl@@QEBA_NXZ + ?encoded_message@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?encoded_remaining@LogMessageData@LogMessage@log_internal@absl@@QEAAAEAV?$Span@D@4@XZ + ?end@?$BitMask@_K$07$02$00@container_internal@absl@@QEBA?AV123@XZ + ?end@?$BitMask@_K$07$02$0A@@container_internal@absl@@QEBA?AV123@XZ + ?end@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAPEAUPayload@status_internal@2@XZ + ?end@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBAPEBUPayload@status_internal@2@XZ + ?end@?$Span@$$CBI@absl@@QEBAPEBIXZ + ?end@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEBVFormatArgImpl@str_format_internal@2@XZ + ?end@?$Span@I@absl@@QEBAPEAIXZ + ?end@?$Span@PEAVLogSink@absl@@@absl@@QEBAPEAPEAVLogSink@2@XZ + ?end@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBAPEBQEAUCordRep@cord_internal@2@XZ + ?end@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?end@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?end@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?end@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEAVCommandLineFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEBVCommandLineFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAPEAUUnrecognizedFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?end@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@23@XZ + ?end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@XZ + ?end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@XZ + ?end@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@23@XZ + ?end@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@23@XZ + ?end@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@123@XZ + ?end@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?end@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@XZ + ?end@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@23@XZ + ?end@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@23@XZ + ?end@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@23@XZ + ?end@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ + ?end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@XZ + ?end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@XZ + ?end@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@23@XZ + ?end@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@23@XZ + ?end@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@XZ + ?end@ChunkRange@Cord@absl@@QEBA?AVChunkIterator@23@XZ + ?end@CordRepBtree@cord_internal@absl@@QEBA_KXZ + ?end@Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEBAPEADXZ + ?end@__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AU1234@XZ + ?engines@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PEIAXPEIBX_KV54@_N@Z@4UArchSpecificEngines@234@B + ?eq_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAAEBUStringEq@23@XZ + ?erase@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAPEAUPayload@status_internal@2@PEBU342@@Z + ?erase@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@23@V?$__wrap_iter@PEBQEAVLogSink@absl@@@23@@Z + ?error@FILERawSink@str_format_internal@absl@@QEBAHXZ + ?exchange@?$__atomic_base@PEAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QEAAPEAVVLogSite@log_internal@absl@@PEAV456@W4memory_order@23@@Z + ?external@CordRep@cord_internal@absl@@QEAAPEAUCordRepExternal@23@XZ + ?external@CordRep@cord_internal@absl@@QEBAPEBUCordRepExternal@23@XZ + ?fetch_add_end@CordRepBtree@cord_internal@absl@@AEAA_K_K@Z + ?find@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ?fits_in_soo@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBA_N_K@Z + ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z + ?flat@CordRep@cord_internal@absl@@QEAAPEAUCordRepFlat@23@XZ + ?flat@CordRep@cord_internal@absl@@QEBAPEBUCordRepFlat@23@XZ + ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV567@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@AEBV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@967@AEBVtime_zone@234@@Z + ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEAMW4chars_format@1@@Z + ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEANW4chars_format@1@@Z + ?front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?front@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?front@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ + ?gbswap_16@absl@@YAGG@Z + ?gbswap_32@absl@@YAII@Z + ?gbswap_64@absl@@YA_K_K@Z + ?generate_new_seed@CommonFields@container_internal@absl@@QEAAX_N@Z + ?generate_new_seed@HashtableSize@container_internal@absl@@QEAAXXZ + ?generation@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEBAEXZ + ?generation@HashSetIteratorGenerationInfoDisabled@container_internal@absl@@QEBAEXZ + ?generation_offset@RawHashSetLayout@container_internal@absl@@QEBA_KXZ + ?generation_ptr@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEBAPEAEXZ + ?generation_ptr@HashSetIteratorGenerationInfoDisabled@container_internal@absl@@QEBAPEBEXZ + ?get@?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@container_internal@absl@@QEBAPEAW4ctrl_t@23@XZ + ?get@?$MaybeInitializedPtr@X@container_internal@absl@@QEBAPEAXXZ + ?get@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAAPEAUList@CordzInfo@cord_internal@2@XZ + ?get@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAAPEAURefcountedRep@CrcCordState@crc_internal@2@XZ + ?get@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAAPEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?get@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEBAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?get@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAAPEAVFlagRegistry@flags_internal@2@XZ + ?get@?$NoDestructor@VMutex@absl@@@absl@@QEAAPEAVMutex@2@XZ + ?get@?$Storage@PEAPEAUCordRep@cord_internal@absl@@$00U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEAPEAPEAUCordRep@cord_internal@4@XZ + ?get@?$Storage@PEAPEAVLogSink@absl@@$00U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@internal_compressed_tuple@container_internal@2@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEAPEAPEAVLogSink@4@XZ + ?get@?$Storage@PEAUPayload@status_internal@absl@@$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEAPEAUPayload@status_internal@4@XZ + ?get@?$Storage@UStringEq@container_internal@absl@@$01U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QEGBAAEBUStringEq@34@XZ + ?get@?$Storage@UStringHash@container_internal@absl@@$00U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAUStringHash@34@XZ + ?get@?$Storage@UStringHash@container_internal@absl@@$00U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QEGBAAEBUStringHash@34@XZ + ?get@?$Storage@V?$allocator@D@__Cr@std@@$00U?$StorageTag@_KV?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@D@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@D@__Cr@std@@$02U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@D@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGBAAEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@VCommonFields@container_internal@absl@@$0A@U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEAVCommonFields@34@XZ + ?get@?$Storage@VCommonFields@container_internal@absl@@$0A@U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$0A@@internal_compressed_tuple@container_internal@absl@@QEGBAAEBVCommonFields@34@XZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEA_KXZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGBAAEB_KXZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEA_KXZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGBAAEB_KXZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEA_KXZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGBAAEB_KXZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEA_KXZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGBAAEB_KXZ + ?get@?$Storage@_K$0A@U?$StorageTag@_KV?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGBAAEB_KXZ + ?get@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ + ?get@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransitionType@cctz@time_internal@absl@@XZ + ?get@?$__tuple_leaf@$00AEAV?$NonIterableBitMask@_K$07$02@container_internal@absl@@$0A@@__Cr@std@@QEAAAEAV?$NonIterableBitMask@_K$07$02@container_internal@absl@@XZ + ?get@?$__tuple_leaf@$0A@$$QEAPEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@XZ + ?get@?$__tuple_leaf@$0A@AEAPEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@XZ + ?get@?$__tuple_leaf@$0A@AEAUFindInfo@container_internal@absl@@$0A@@__Cr@std@@QEAAAEAUFindInfo@container_internal@absl@@XZ + ?get@?$__tuple_leaf@$0A@AEBQEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEBQEAVCommandLineFlag@absl@@XZ + ?get@?$__tuple_leaf@$0A@PEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@XZ + ?get@?$unique_ptr@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?get@?$unique_ptr@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?get@?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@XZ + ?get@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@XZ + ?get@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ?get@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@XZ + ?get@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ + ?get@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAVZoneInfoSource@cctz@time_internal@absl@@XZ + ?get@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEBAPEAXXZ + ?get@PlacementImpl@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAAPEAUList@CordzInfo@cord_internal@3@XZ + ?get@PlacementImpl@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAAPEAURefcountedRep@CrcCordState@crc_internal@3@XZ + ?get@PlacementImpl@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAAPEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@3@XZ + ?get@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEBAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?get@PlacementImpl@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAAPEAVFlagRegistry@flags_internal@3@XZ + ?get@PlacementImpl@?$NoDestructor@VMutex@absl@@@absl@@QEAAPEAVMutex@3@XZ + ?get_cordz_mean_interval@cord_internal@absl@@YAHXZ + ?get_deleter@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEBV?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEBV?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAU?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@23@XZ + ?get_deleter@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAU?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAU?$default_delete@VFlagState@flags_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAU?$default_delete@VFlagStateInterface@flags_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAU?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAU?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEAAAEAUDynValueDeleter@flags_internal@absl@@XZ + ?get_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEBAHXZ + ?get_soo_data@HeapOrSoo@container_internal@absl@@QEAAPEAXXZ + ?get_soo_data@HeapOrSoo@container_internal@absl@@QEBAPEBXXZ + ?get_weekday@detail@cctz@time_internal@absl@@YA?AW4weekday@1234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@@Z + ?get_yearday@detail@cctz@time_internal@absl@@YAHAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@@Z + ?growth_info@CommonFields@container_internal@absl@@QEAAAEAVGrowthInfo@23@XZ + ?growth_info@CommonFields@container_internal@absl@@QEBA?AVGrowthInfo@23@XZ + ?growth_left@CommonFields@container_internal@absl@@QEBA_KXZ + ?has_alt_flag@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ + ?has_infoz@CommonFields@container_internal@absl@@QEBA_NXZ + ?has_infoz@HashtableSize@container_internal@absl@@QEBA_NXZ + ?has_left_flag@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ + ?has_parsed_conversion@UntypedFormatSpecImpl@str_format_internal@absl@@QEBA_NXZ + ?has_show_pos_flag@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ + ?has_sign_col_flag@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ + ?has_timeout@KernelTimeout@synchronization_internal@absl@@QEBA_NXZ + ?has_zero_flag@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ + ?hash_function@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAU?$hash@PEBUCordRep@cord_internal@absl@@@23@XZ + ?hash_function@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?hash_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAAEAUStringHash@23@XZ + ?hash_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAAEBUStringHash@23@XZ + ?hash_with_seed@?$HashImpl@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@hash_internal@absl@@AEBA_KAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?hash_with_seed@StringHash@container_internal@absl@@AEBA_KV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?height@CordRepBtree@cord_internal@absl@@QEBAHXZ + ?hour@?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?hour@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?hour@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?increment_size@CommonFields@container_internal@absl@@QEAAXXZ + ?increment_size@CommonFields@container_internal@absl@@QEAAX_K@Z + ?increment_size@HashtableSize@container_internal@absl@@QEAAXXZ + ?increment_size@HashtableSize@container_internal@absl@@QEAAX_K@Z + ?index@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@QEBA_KXZ + ?index@?$probe_seq@$07@container_internal@absl@@QEBA_KXZ + ?index@CordRepBtree@cord_internal@absl@@QEBA_KW4EdgeType@123@@Z + ?infoz@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AVHashtablezInfoHandle@23@XZ + ?infoz@CommonFields@container_internal@absl@@QEAA?AVHashtablezInfoHandle@23@XZ + ?infoz_ptr@CommonFields@container_internal@absl@@QEBAPEAVHashtablezInfoHandle@23@XZ + ?inline_size@InlineData@cord_internal@absl@@QEBA_KXZ + ?inline_size@InlineRep@Cord@absl@@AEBA_KXZ + ?inline_size@Rep@InlineData@cord_internal@absl@@QEBA_KXZ + ?insert@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@56@@Z + ?insert@?$unordered_set@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_const_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBQEBUCordRep@cord_internal@absl@@@Z + ?int32_value@ProtoField@log_internal@absl@@QEBAHXZ + ?int64_value@ProtoField@log_internal@absl@@QEBA_JXZ + ?is_absolute_timeout@KernelTimeout@synchronization_internal@absl@@QEBA_NXZ + ?is_basic@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ + ?is_conv@ConvTag@str_format_internal@absl@@QEBA_NXZ + ?is_either_profiled@InlineData@cord_internal@absl@@SA_NAEBV123@0@Z + ?is_empty@InlineData@cord_internal@absl@@QEBA_NXZ + ?is_flags@ConvTag@str_format_internal@absl@@QEBA_NXZ + ?is_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEBA_NXZ + ?is_leap_year@impl@detail@cctz@time_internal@absl@@YA_N_J@Z + ?is_length@ConvTag@str_format_internal@absl@@QEBA_NXZ + ?is_profiled@InlineData@cord_internal@absl@@QEBA_NXZ + ?is_relative_timeout@KernelTimeout@synchronization_internal@absl@@QEBA_NXZ + ?is_sampled_seed@HashtableSize@container_internal@absl@@QEBA_NXZ + ?is_short@Rep@CordBuffer@absl@@QEBA_NXZ + ?is_single_group@container_internal@absl@@YA_N_K@Z + ?is_small@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBA_NXZ + ?is_small@CommonFields@container_internal@absl@@QEBA_NXZ + ?is_snapshot@CordzHandle@cord_internal@absl@@QEBA_NXZ + ?is_soo@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBA_NXZ + ?is_tree@InlineData@cord_internal@absl@@QEBA_NXZ + ?is_tree@InlineRep@Cord@absl@@QEBA_NXZ + ?is_tree@Rep@InlineData@cord_internal@absl@@QEBA_NXZ + ?iterator_at@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AViterator@123@_K@Z + ?iterator_at_ptr@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AViterator@123@U?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@@Z + ?kDefaultIterControl@container_internal@absl@@3W4ctrl_t@12@A + ?key_comp@?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@QEBAAEBU?$less@X@23@XZ + ?key_comp@?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@QEBAAEBU?$less@X@23@XZ + ?key_eq@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAU?$equal_to@PEBUCordRep@cord_internal@absl@@@23@XZ + ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?length@CordRepBtreeReader@cord_internal@absl@@QEBA_KXZ + ?length_mod@FormatConversionSpecImpl@str_format_internal@absl@@QEBA?AW4LengthMod@3@XZ + ?load@?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__Cr@std@@QEBAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZW4memory_order@23@@Z + ?load@?$__atomic_base@PEAUArena@LowLevelAlloc@base_internal@absl@@$0A@@__Cr@std@@QEBAPEAUArena@LowLevelAlloc@base_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__Cr@std@@QEBAPEAUHashtablezInfo@container_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@QEBAPEAVCordzHandle@cord_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PEAVCordzInfo@cord_internal@absl@@$0A@@__Cr@std@@QEBAPEAVCordzInfo@cord_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PEAVTimeZone@absl@@$0A@@__Cr@std@@QEBAPEAVTimeZone@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PEAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QEBAPEAVVLogSite@log_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@VMaskedPointer@flags_internal@absl@@$0A@@__Cr@std@@QEBA?AVMaskedPointer@flags_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__Cr@std@@QEBA?AW4OnDeadlockCycle@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__Cr@std@@QEBA?AW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z + ?load_time_zone@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVtime_zone@123@@Z + ?local_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?lock@FlagRegistry@flags_internal@absl@@QEAAXXZ + ?lock@Mutex@absl@@QEAAXXZ + ?lock@SpinLock@base_internal@absl@@QEAAXXZ + ?lock_shared@Mutex@absl@@QEAAXXZ + ?log_severity@LogEntry@absl@@QEBA?AW4LogSeverity@2@XZ + ?lookup@time_zone@cctz@time_internal@absl@@QEBA?AUabsolute_lookup@1234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?lookup@time_zone@cctz@time_internal@absl@@QEBA?AUcivil_lookup@1234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?make_tree@InlineData@cord_internal@absl@@QEAAXPEAUCordRep@23@@Z + ?make_tree@Rep@InlineData@cord_internal@absl@@QEAAXPEAUCordRep@34@@Z + ?max@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ + ?max@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ + ?max@?$numeric_limits@Vint128@absl@@@__Cr@std@@SA?AVint128@absl@@XZ + ?max@?$numeric_limits@Vuint128@absl@@@__Cr@std@@SA?AVuint128@absl@@XZ + ?max_load_factor@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAMXZ + ?max_load_factor@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAMXZ + ?max_size@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?maybe_increment_generation_on_insert@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEAAXXZ + ?memcasecmp@strings_internal@absl@@YAHPEBD0_K@Z + ?message@Status@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?message@StatusRep@status_internal@absl@@QEBAAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?min@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ + ?min@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ + ?min@?$numeric_limits@Vint128@absl@@@__Cr@std@@SA?AVint128@absl@@XZ + ?minute@?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?minute@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?minute@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?month@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?month@?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?month@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?month@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?mutable_rep@CrcCordState@crc_internal@absl@@QEAAPEAURep@123@XZ + ?n_day@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_JC00CCC@Z + ?n_hour@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J0000CC@Z + ?n_min@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J00000C@Z + ?n_mon@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J000CCC@Z + ?n_sec@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J00000@Z + ?name@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?next@?$probe_seq@$07@container_internal@absl@@QEAAXXZ + ?next_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@1234@@Z + ?next_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z + ?non_temporal_store_memcpy@crc_internal@absl@@YAPEAXPEIAXPEIBX_K@Z + ?non_temporal_store_memcpy_avx@crc_internal@absl@@YAPEAXPEIAXPEIBX_K@Z + ?offset@?$probe_seq@$07@container_internal@absl@@QEBA_KXZ + ?offset@?$probe_seq@$07@container_internal@absl@@QEBA_K_K@Z + ?ok@Status@absl@@QEBA_NXZ + ?ok@Utf8ForCodePoint@debugging_internal@absl@@QEBA_NXZ + ?overflow@Streambuf@OStringStream@strings_internal@absl@@MEAAHH@Z + ?parse@detail@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0AEBVtime_zone@234@PEAV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@PEAV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@chrono@67@PEAV567@@Z + ?parsed_conversion@UntypedFormatSpecImpl@str_format_internal@absl@@QEBAPEBVParsedFormatBase@23@XZ + ?pointer_to@?$pointer_traits@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@AEAU423@@Z + ?pointer_to@?$pointer_traits@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@AEAU423@@Z + ?pointer_to@?$pointer_traits@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@AEAU423@@Z + ?pointer_to@?$pointer_traits@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@__Cr@std@@SAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@AEAU423@@Z + ?pointer_to@?$pointer_traits@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@__Cr@std@@SAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@AEAU423@@Z + ?pointer_to@?$pointer_traits@PEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@AEBU423@@Z + ?poison@InlineData@cord_internal@absl@@QEAAXXZ + ?poison_this@InlineData@cord_internal@absl@@QEAAXXZ + ?pop_back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAXXZ + ?pop_back@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?pop_back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?pop_front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXXZ + ?pop_front@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?precision@FormatConversionSpecImpl@str_format_internal@absl@@QEBAHXZ + ?predicate@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBUAllowEmpty@3@XZ + ?predicate@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBUSkipEmpty@3@XZ + ?predicate@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBUAllowEmpty@3@XZ + ?prefetch_heap_block@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAXXZ + ?prefix@LogEntry@absl@@QEBA_NXZ + ?prev_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@1234@@Z + ?prev_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z + ?probe@container_internal@absl@@YA?AV?$probe_seq@$07@12@AEBVCommonFields@12@_K@Z + ?probe@container_internal@absl@@YA?AV?$probe_seq@$07@12@_K0@Z + ?probe_h1@container_internal@absl@@YA?AV?$probe_seq@$07@12@_K0@Z + ?push_back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAXAEBQEAUCordRep@cord_internal@2@@Z + ?push_back@?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEAAXAEBQEAVLogSink@2@@Z + ?push_back@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAX$$QEAUPayload@status_internal@2@@Z + ?push_back@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?push_back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?push_back@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEAVCommandLineFlag@absl@@@Z + ?push_back@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z + ?push_back@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEAVLogSink@absl@@@Z + ?push_back@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEBVCommandLineFlag@absl@@@Z + ?push_back@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEBVCommandLineFlag@absl@@@Z + ?push_back@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z + ?push_back@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?push_back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBUTransition@cctz@time_internal@absl@@@Z + ?push_back@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBUUnrecognizedFlag@absl@@@Z + ?raw_code@Status@absl@@QEBAHXZ + ?reduce_size@InlineRep@Cord@absl@@QEAAX_K@Z + ?release@?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?release@?$unique_ptr@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?release@?$unique_ptr@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?release@?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@XZ + ?release@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@XZ + ?release@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ?release@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@XZ + ?release@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ + ?release@?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAVFallbackCrcMemcpyEngine@crc_internal@absl@@XZ + ?release@?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAVFlagState@flags_internal@absl@@XZ + ?release@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAVFlagStateInterface@flags_internal@absl@@XZ + ?release@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAVTimeZoneInfo@cctz@time_internal@absl@@XZ + ?release@?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAVTimeZoneLibC@cctz@time_internal@absl@@XZ + ?release@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEAAPEAXXZ + ?remaining_inline_capacity@InlineRep@Cord@absl@@QEBA_KXZ + ?remove_prefix@?$Span@$$CBD@absl@@QEAAX_K@Z + ?remove_prefix@?$Span@D@absl@@QEAAX_K@Z + ?remove_prefix@InlineRep@Cord@absl@@QEAAX_K@Z + ?remove_suffix@?$Span@$$CBD@absl@@QEAAX_K@Z + ?remove_suffix@?$Span@D@absl@@QEAAX_K@Z + ?rep@CrcCordState@crc_internal@absl@@QEBAAEBURep@123@XZ + ?rep@Rep@CordBuffer@absl@@QEBAPEAUCordRepFlat@cord_internal@3@XZ + ?reserve@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reset@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAX$$T@Z + ?reset@?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?reset@?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@@Z + ?reset@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@@Z + ?reset@?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAULogMessageData@LogMessage@log_internal@absl@@@Z + ?reset@?$unique_ptr@UThreadIdentity@base_internal@absl@@P6AXPEAX@Z@__Cr@std@@QEAAXPEAUThreadIdentity@base_internal@absl@@@Z + ?reset@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z + ?reset@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ?reset@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z + ?reset@?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAVFallbackCrcMemcpyEngine@crc_internal@absl@@@Z + ?reset@?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAVFlagState@flags_internal@absl@@@Z + ?reset@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAVFlagStateInterface@flags_internal@absl@@@Z + ?reset@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAVTimeZoneIf@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAVTimeZoneInfo@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAVTimeZoneLibC@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAVZoneInfoSource@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEAAXPEAX@Z + ?reset_reserved_growth@CommonFields@container_internal@absl@@QEAAX_K@Z + ?reset_reserved_growth@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEAAX_K0@Z + ?resize@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?resize@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?safe_strto128_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVint128@2@H@Z + ?safe_strto16_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAFH@Z + ?safe_strto32_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHH@Z + ?safe_strto64_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_JH@Z + ?safe_strto8_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEACH@Z + ?safe_strtou128_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVuint128@2@H@Z + ?safe_strtou16_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAGH@Z + ?safe_strtou32_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAIH@Z + ?safe_strtou64_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_KH@Z + ?safe_strtou8_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAEH@Z + ?sampling_stride@CordzInfo@cord_internal@absl@@QEBA_JXZ + ?scale_add@impl@detail@cctz@time_internal@absl@@YA_J_J00@Z + ?second@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?second@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?seed@CommonFields@container_internal@absl@@QEBA?AVPerTableSeed@23@XZ + ?seed@HashtableSize@container_internal@absl@@QEBA?AVPerTableSeed@23@XZ + ?seed@PerTableSeed@container_internal@absl@@QEBA_KXZ + ?self@Rep@InlineData@cord_internal@absl@@QEAAPEAU1234@XZ + ?self@Rep@InlineData@cord_internal@absl@@QEBAPEBU1234@XZ + ?set@?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@container_internal@absl@@QEAAXPEAW4ctrl_t@23@@Z + ?set@?$MaybeInitializedPtr@X@container_internal@absl@@QEAAXPEAX@Z + ?set_arg@BoundConversion@str_format_internal@absl@@QEAAXPEBVFormatArgImpl@23@@Z + ?set_begin@CordRepBtree@cord_internal@absl@@AEAAX_K@Z + ?set_capacity@CommonFields@container_internal@absl@@QEAAX_K@Z + ?set_control@CommonFields@container_internal@absl@@QEAAXPEAW4ctrl_t@23@@Z + ?set_conversion_char@FormatConversionSpecImpl@str_format_internal@absl@@QEAAXW4FormatConversionChar@3@@Z + ?set_cordz_info@InlineData@cord_internal@absl@@QEAAXPEAVCordzInfo@23@@Z + ?set_cordz_info@Rep@InlineData@cord_internal@absl@@QEAAX_J@Z + ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z + ?set_data@InlineRep@Cord@absl@@QEAAPEAD_K@Z + ?set_data@InlineRep@Cord@absl@@QEAAXPEBD_K@Z + ?set_empty_soo@CommonFields@container_internal@absl@@QEAAXXZ + ?set_end@CordRepBtree@cord_internal@absl@@AEAAX_K@Z + ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEAAXH@Z + ?set_full_soo@CommonFields@container_internal@absl@@QEAAXXZ + ?set_generation@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEAAXE@Z + ?set_generation_ptr@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEAAXPEAE@Z + ?set_has_infoz@CommonFields@container_internal@absl@@QEAAXXZ + ?set_has_infoz@HashtableSize@container_internal@absl@@QEAAXXZ + ?set_infoz@CommonFields@container_internal@absl@@QEAAXVHashtablezInfoHandle@23@@Z + ?set_inline_data@InlineData@cord_internal@absl@@QEAAXPEBD_K@Z + ?set_inline_size@InlineData@cord_internal@absl@@QEAAX_K@Z + ?set_inline_size@InlineRep@Cord@absl@@AEAAX_K@Z + ?set_inline_size@Rep@InlineData@cord_internal@absl@@QEAAX_K@Z + ?set_reservation_size@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEAAX_K@Z + ?set_reserved_growth@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEAAX_K@Z + ?set_sampled_seed@HashtableSize@container_internal@absl@@QEAAXXZ + ?set_seed@HashtableSize@container_internal@absl@@AEAAXG@Z + ?set_short_length@Rep@CordBuffer@absl@@QEAAX_K@Z + ?set_size_to_zero@CommonFields@container_internal@absl@@QEAAXXZ + ?set_size_to_zero_keep_metadata@HashtableSize@container_internal@absl@@QEAAXXZ + ?set_slots@CommonFields@container_internal@absl@@QEAAXPEAX@Z + ?set_tag@Rep@InlineData@cord_internal@absl@@QEAAXC@Z + ?set_tree@InlineData@cord_internal@absl@@QEAAXPEAUCordRep@23@@Z + ?set_tree@Rep@InlineData@cord_internal@absl@@QEAAXPEAUCordRep@34@@Z + ?set_value@InputValue@UnboundConversion@str_format_internal@absl@@QEAAXH@Z + ?shallow_subcords_enabled@cord_internal@absl@@3U?$atomic@_N@__Cr@std@@A + ?should_rehash_for_bug_detection_on_insert@CommonFields@container_internal@absl@@QEBA_NXZ + ?should_rehash_for_bug_detection_on_insert@CommonFieldsGenerationInfoEnabled@container_internal@absl@@QEBA_N_K@Z + ?should_rehash_for_bug_detection_on_move@CommonFieldsGenerationInfoEnabled@container_internal@absl@@QEBA_N_K@Z + ?shrink_to_fit@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?shrink_to_fit@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?single_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AViterator@123@XZ + ?single_slot@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@XZ + ?size@?$BigUnsigned@$03@strings_internal@absl@@QEBAHXZ + ?size@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAHXZ + ?size@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEBA_KXZ + ?size@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEBA_KXZ + ?size@?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEBA_KXZ + ?size@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBA_KXZ + ?size@?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QEBA_KXZ + ?size@?$Span@$$CBD@absl@@QEBA_KXZ + ?size@?$Span@$$CBI@absl@@QEBA_KXZ + ?size@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBA_KXZ + ?size@?$Span@D@absl@@QEBA_KXZ + ?size@?$Span@I@absl@@QEBA_KXZ + ?size@?$Span@PEAVLogSink@absl@@@absl@@QEBA_KXZ + ?size@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBA_KXZ + ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAAEA_KXZ + ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAAEA_KXZ + ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAAEA_KXZ + ?size@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAAEA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@$0BA@@__Cr@std@@QEBA_KXZ + ?size@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@QEBA_KXZ + ?size@?$initializer_list@W4FormatConversionCharSet@absl@@@std@@QEBA_KXZ + ?size@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA_KXZ + ?size@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?size@AlphaNum@absl@@QEBA_KXZ + ?size@CommonFields@container_internal@absl@@QEBA_KXZ + ?size@Cord@absl@@QEBA_KXZ + ?size@CordRepBtree@cord_internal@absl@@QEBA_KXZ + ?size@HashtableSize@container_internal@absl@@QEBA_KXZ + ?size@InlineRep@Cord@absl@@QEBA_KXZ + ?size@Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEBA_KXZ + ?skip_empty_or_deleted@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXXZ + ?slot@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@XZ + ?slot_array@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@XZ + ?slot_array@CommonFields@container_internal@absl@@QEBAPEAXXZ + ?slot_array@HeapOrSoo@container_internal@absl@@QEAAAEAT?$MaybeInitializedPtr@X@23@XZ + ?slot_array@HeapOrSoo@container_internal@absl@@QEBA?AT?$MaybeInitializedPtr@X@23@XZ + ?slot_offset@RawHashSetLayout@container_internal@absl@@QEBA_KXZ + ?slots_union@CommonFields@container_internal@absl@@QEBA?AT?$MaybeInitializedPtr@X@23@XZ + ?soo_capacity@PolicyFunctions@container_internal@absl@@QEBAEXZ + ?soo_data@CommonFields@container_internal@absl@@QEAAPEAXXZ + ?soo_data@CommonFields@container_internal@absl@@QEBAPEBXXZ + ?source_basename@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?source_filename@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?source_line@LogEntry@absl@@QEBAHXZ + ?stacktrace@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?status@BadStatusOrAccess@absl@@QEBAAEBVStatus@2@XZ + ?step@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uday_tag@1234@U51234@_J@Z + ?step@detail@cctz@time_internal@absl@@YA?AUfields@1234@Usecond_tag@1234@U51234@_J@Z + ?store@?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@QEAAXPEAVCordzHandle@cord_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@PEAVCordzInfo@cord_internal@absl@@$0A@@__Cr@std@@QEAAXPEAVCordzInfo@cord_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@PEAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QEAAXPEAVVLogSite@log_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@VMaskedPointer@flags_internal@absl@@$0A@@__Cr@std@@QEAAXVMaskedPointer@flags_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__Cr@std@@QEAAXW4OnDeadlockCycle@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__Cr@std@@QEAAXW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z + ?str@UntypedFormatSpecImpl@str_format_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?stream@OstreamView@LogMessage@log_internal@absl@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?string_value@ProtoField@log_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?sub_fetch_begin@CordRepBtree@cord_internal@absl@@AEAA_K_K@Z + ?subspan@?$Span@$$CBD@absl@@QEBA?AV12@_K0@Z + ?subspan@?$Span@D@absl@@QEBA?AV12@_K0@Z + ?substring@CordRep@cord_internal@absl@@QEAAPEAUCordRepSubstring@23@XZ + ?substring@CordRep@cord_internal@absl@@QEBAPEBUCordRepSubstring@23@XZ + ?swap@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAV123@@Z + ?tag@ProtoField@log_internal@absl@@QEBA_KXZ + ?tag@Rep@InlineData@cord_internal@absl@@QEBACXZ + ?text@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_newline@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_prefix@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_prefix_and_newline@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_prefix_and_newline_c_str@LogEntry@absl@@QEBAPEBDXZ + ?thread_identity@PerThreadSynch@base_internal@absl@@QEAAPEAUThreadIdentity@23@XZ + ?tid@LogEntry@absl@@QEBAIXZ + ?timestamp@LogEntry@absl@@QEBA?AVTime@2@XZ + ?to_address@?$pointer_traits@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAPEAPEAVCommandLineFlag@absl@@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@@Z + ?to_address@?$pointer_traits@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAPEAPEAVLogSink@absl@@V?$__wrap_iter@PEAPEAVLogSink@absl@@@23@@Z + ?to_address@?$pointer_traits@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAPEAPEBVCommandLineFlag@absl@@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@23@@Z + ?to_address@?$pointer_traits@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@__Cr@std@@SAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@@Z + ?total_written@BufferRawSink@str_format_internal@absl@@QEBA_KXZ + ?transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@0@Z + ?transfer_unprobed_elements_to_next_capacity_fn@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CAXAEAVCommonFields@23@PEBW4ctrl_t@23@PEAX2P6AX2E_K3@Z@Z + ?tree@InlineRep@Cord@absl@@QEBAPEAUCordRep@cord_internal@3@XZ + ?tree@Rep@InlineData@cord_internal@absl@@QEBAPEAUCordRep@34@XZ + ?try_lock@Mutex@absl@@QEAA_NXZ + ?try_lock_shared@Mutex@absl@@QEAA_NXZ + ?type@ProtoField@log_internal@absl@@QEBA?AW4WireType@23@XZ + ?uint32_value@ProtoField@log_internal@absl@@QEBAIXZ + ?uint64_value@ProtoField@log_internal@absl@@QEBA_KXZ + ?unchecked_deref@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAAEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@XZ + ?unlock@FlagRegistry@flags_internal@absl@@QEAAXXZ + ?unlock@Mutex@absl@@QEAAXXZ + ?unlock@SpinLock@base_internal@absl@@QEAAXXZ + ?unlock_shared@Mutex@absl@@QEAAXXZ + ?unpoison@InlineData@cord_internal@absl@@QEAAXXZ + ?utc_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?value@ConvertibleToStringView@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?value@InputValue@UnboundConversion@str_format_internal@absl@@QEBAHXZ + ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?valueless_by_exception@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@QEBA_NXZ + ?valueless_by_exception@?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@QEBA_NXZ + ?verbosity@LogEntry@absl@@QEBAHXZ + ?version@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?what@BadStatusOrAccess@absl@@UEBAPEBDXZ + ?what@SeedGenException@absl@@UEBAPEBDXZ + ?width@FormatConversionSpecImpl@str_format_internal@absl@@QEBAHXZ + ?words@?$BigUnsigned@$03@strings_internal@absl@@QEBAPEBIXZ + ?words@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAPEBIXZ + ?xsputn@Streambuf@OStringStream@strings_internal@absl@@MEAA_JPEBD_J@Z + ?year@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBA_JXZ + ?year@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBA_JXZ + ?year@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBA_JXZ + ?year@?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBA_JXZ + ?year_index@impl@detail@cctz@time_internal@absl@@YAH_JC@Z + ?ymd_ord@impl@detail@cctz@time_internal@absl@@YA_J_JCC@Z + AbslContainerInternalSampleEverything + AbslInternalMutexYield + AbslInternalOnFatalLogMessage + AbslInternalPerThreadSemInit + AbslInternalPerThreadSemPoke + AbslInternalPerThreadSemPost + AbslInternalPerThreadSemWait + AbslInternalReportFatalUsageError + AbslInternalSleepFor + AbslInternalSpinLockDelay + AbslInternalSpinLockWake + AbslInternalTraceContinue + AbslInternalTraceObserved + AbslInternalTraceSignal + AbslInternalTraceWait diff --git a/naiveproxy/src/third_party/abseil-cpp/symbols_arm64_rel.def b/naiveproxy/src/third_party/abseil-cpp/symbols_arm64_rel.def index 9f6cfd644d..461f18c6aa 100644 --- a/naiveproxy/src/third_party/abseil-cpp/symbols_arm64_rel.def +++ b/naiveproxy/src/third_party/abseil-cpp/symbols_arm64_rel.def @@ -36,7 +36,6 @@ EXPORTS ??$Append@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z ??$AppendImpl@AEBVCord@absl@@@Cord@absl@@AEAAXAEBV01@@Z ??$AppendImpl@VCord@absl@@@Cord@absl@@AEAAX$$QEAV01@@Z - ??$Base64EscapeInternal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@strings_internal@absl@@YAXPEBE_KPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_NPEBD@Z ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@A6AXXZ@Z ??$CallOnceImpl@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@$$QEAP8FlagImpl@flags_internal@1@EAAXXZ$$QEAPEAV671@@Z ??$CastAndCallFunction@$$CBU?$atomic@_N@__Cr@std@@@Condition@absl@@CA_NPEBV01@@Z @@ -106,8 +105,7 @@ EXPORTS ??$GrowSooTableToNextCapacityAndPrepareInsert@$07$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z ??$GrowSooTableToNextCapacityAndPrepareInsert@$0A@$0A@@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z ??$GrowSooTableToNextCapacityAndPrepareInsert@$0BA@$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z - ??$InvokeObject@U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z - ??$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z + ??$InvokeObject@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z ??$MakeCheckOpString@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0PEBD@Z ??$MakeCheckOpString@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PEBD@Z ??$MakeCheckOpString@DD@log_internal@absl@@YAPEBDDDPEBD@Z @@ -145,6 +143,7 @@ EXPORTS ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0LD@D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY0LD@$$CBD@Z ??$StrCat@_K@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@01@YA?AV234@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@2V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z@@Z ??$TransferNRelocatable@$0BI@@container_internal@absl@@YAXPEAX00_K@Z ??$TryFindNewIndexWithoutProbing@X@container_internal@absl@@YA_K_K00PEAW4ctrl_t@01@0@Z ??$TypeErasedApplyToSlotFn@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@YA_KPEBXPEAX_K@Z @@ -158,41 +157,30 @@ EXPORTS ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$02@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$0A@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z ??$__do_rehash@$00@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAX_K@Z - ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z + ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z ??$__emplace_back_slow_path@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV612@AEA_K@Z ??$__emplace_back_slow_path@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@AEBU34@@Z ??$__emplace_back_slow_path@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@$$QEAW4Source@34@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z - ??$__emplace_unique_key_args@PEBUCordRep@cord_internal@absl@@AEBQEBU123@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBQEBUCordRep@cord_internal@absl@@0@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$__for_each_segment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@23@@__Cr@std@@YAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@01@@Z ??$__insert_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@1_J@Z + ??$__invoke@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@__Cr@std@@YAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@6@@Z ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@12@@Z ??$emplace@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@12@@Z - ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV34@@Z - ??$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV34@@Z - ??$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV34@@Z - ??$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV345@@Z - ??$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU3456@@Z + ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ??$emplace_back@HVcrc32c_t@absl@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAH$$QEAVcrc32c_t@6@@Z - ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV34@@Z - ??$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU3456@@Z - ??$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QEAV312@@Z - ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$find_or_prepare_insert@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z ??$find_or_prepare_insert_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z @@ -242,7 +230,8 @@ EXPORTS ??0LogMessage@log_internal@absl@@QEAA@PEBDHUInfoTag@012@@Z ??0LogMessage@log_internal@absl@@QEAA@PEBDHUWarningTag@012@@Z ??0LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@2@@Z - ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@3@VTime@3@@Z + ??0LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@2@@Z + ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@3@VTime@3@@Z ??0LogMessageDebugFatal@log_internal@absl@@QEAA@PEBDH@Z ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH0@Z ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH@Z @@ -321,6 +310,7 @@ EXPORTS ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@@Z ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@0123@@Z ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@W4weekday@0123@@Z + ??6log_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@UUnprintableWrapper@01@@Z ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@01@@Z ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@01@@Z ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@01@@Z @@ -339,10 +329,25 @@ EXPORTS ??Kabsl@@YA?AVuint128@0@V10@0@Z ??Labsl@@YA?AVint128@0@V10@0@Z ??Labsl@@YA?AVuint128@0@V10@0@Z + ??R@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBQEBUCordRep@cord_internal@absl@@@Z@QEBA?A?@@00@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QEAV423@@Z@QEBA?A?@@XZ ??R?$ConvertToContainer@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z ??R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z ??RByCivilTime@Transition@cctz@time_internal@absl@@QEBA_NAEBU1234@0@Z ??RDynValueDeleter@flags_internal@absl@@QEBAXPEAX@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z ??XDuration@absl@@QEAAAEAV01@N@Z ??XDuration@absl@@QEAAAEAV01@_J@Z ??YDuration@absl@@QEAAAEAV01@V01@@Z @@ -510,7 +515,7 @@ EXPORTS ?CreateThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPEAUThreadIdentity@12@XZ ?CurrentValue@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ - ?DataGuard@FlagImpl@flags_internal@absl@@AEBAPEAVMutex@3@XZ + ?DataGuard@FlagImpl@flags_internal@absl@@AEBAAEAVMutex@3@XZ ?DataLossError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?DeadlineExceededError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?DecodeFrom@ProtoField@log_internal@absl@@QEAA_NPEAV?$Span@$$CBD@3@@Z @@ -756,6 +761,7 @@ EXPORTS ?GetWord@?$BigUnsigned@$03@strings_internal@absl@@QEBAIH@Z ?GetWord@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAIH@Z ?GlobalHashtablezSampler@container_internal@absl@@YAAEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?GlobalList@CordzInfo@cord_internal@absl@@CAPEAUList@123@XZ ?GlobalRegistry@FlagRegistry@flags_internal@absl@@SAAEAV123@XZ ?GuaranteedEqual@Condition@absl@@SA_NPEBV12@0@Z ?HandleInvalidStatusCtorArg@Helper@internal_statusor@absl@@SAXPEAVStatus@3@@Z @@ -848,7 +854,6 @@ EXPORTS ?MakeAbsNanos@KernelTimeout@synchronization_internal@absl@@QEBA_JXZ ?MakeAbsTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ ?MakeCheckFailString@status_internal@absl@@YAPEBDPEBVStatus@2@PEBD@Z - ?MakeCheckOpUnprintableString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@C@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z @@ -897,6 +902,7 @@ EXPORTS ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?NextUp@CordRepBtreeNavigator@cord_internal@absl@@AEAAPEAUCordRep@23@XZ ?NoPrefix@LogMessage@log_internal@absl@@QEAAAEAV123@XZ ?NominalCPUFrequency@base_internal@absl@@YANXZ ?Normalize@CrcCordState@crc_internal@absl@@QEAAXXZ @@ -944,8 +950,8 @@ EXPORTS ?Post@StdcppWaiter@synchronization_internal@absl@@QEAAXXZ ?Post@Win32Waiter@synchronization_internal@absl@@QEAAXXZ ?PrepareForSampling@HashtablezInfo@container_internal@absl@@QEAAX_J_K11G@Z - ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KUFindInfo@12@@Z - ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KUFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@_K$07$02@12@UFindInfo@12@@Z + ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@_K$07$02@12@UFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z ?PrepareInsertSmallNonSoo@container_internal@absl@@YA?AU?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@AEAVCommonFields@12@AEBUPolicyFunctions@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z ?PrepareToDie@LogMessage@log_internal@absl@@AEAAXXZ ?PrepareToModify@Status@absl@@CAPEAVStatusRep@status_internal@2@_K@Z @@ -962,6 +968,7 @@ EXPORTS ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z ?Print@Streamable@str_format_internal@absl@@QEBAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@@Z + ?PrintTo@absl@@YAXAEBVLogEntry@1@PEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ ?ProgramUsageMessage@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?Ptr@GraphCycles@synchronization_internal@absl@@QEAAPEAXUGraphId@23@@Z @@ -1026,7 +1033,7 @@ EXPORTS ?ResetToBuiltinUTC@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z ?ResizeAllocatedTableWithSeedChange@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z ?ResourceExhaustedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z - ?Restore@FlagState@flags_internal@absl@@EEBAXXZ + ?Restore@FlagState@flags_internal@absl@@EEHAAXXZ ?RestoreState@FlagImpl@flags_internal@absl@@AEAA_NAEBVFlagState@23@@Z ?Retire@flags_internal@absl@@YAXPEBDPEBXPEAE@Z ?ReverseConsume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z @@ -1303,8 +1310,6 @@ EXPORTS ?cycle_clock_source_@CycleClock@base_internal@absl@@0U?$atomic@P6A_JXZ@__Cr@std@@A ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ - ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z - ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z ?effective_impl@time_zone@cctz@time_internal@absl@@AEBAAEBVImpl@1234@XZ ?engines@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PEIAXPEIBX_KV54@_N@Z@4UArchSpecificEngines@234@B ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z @@ -1331,6 +1336,7 @@ EXPORTS ?overflow@Streambuf@OStringStream@strings_internal@absl@@MEAAHH@Z ?parse@detail@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0AEBVtime_zone@234@PEAV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@PEAV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@chrono@67@PEAV567@@Z ?prev_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@1234@@Z + ?prev_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z ?reserve@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z ?reserve@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z ?reserve@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z diff --git a/naiveproxy/src/third_party/abseil-cpp/symbols_arm64_rel_cxx23.def b/naiveproxy/src/third_party/abseil-cpp/symbols_arm64_rel_cxx23.def new file mode 100644 index 0000000000..4bef5af80d --- /dev/null +++ b/naiveproxy/src/third_party/abseil-cpp/symbols_arm64_rel_cxx23.def @@ -0,0 +1,1391 @@ +EXPORTS + ?$TSS0@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PEIAXPEIBX_KV54@_N@Z@4HA + ??$?0$$V$0A@@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAA@XZ + ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?6C@LogMessage@log_internal@absl@@QEAAAEAV012@AEBC@Z + ??$?6D@LogMessage@log_internal@absl@@QEAAAEAV012@AEBD@Z + ??$?6E@LogMessage@log_internal@absl@@QEAAAEAV012@AEBE@Z + ??$?6F@LogMessage@log_internal@absl@@QEAAAEAV012@AEBF@Z + ??$?6G@LogMessage@log_internal@absl@@QEAAAEAV012@AEBG@Z + ??$?6H@LogMessage@log_internal@absl@@QEAAAEAV012@AEBH@Z + ??$?6I@LogMessage@log_internal@absl@@QEAAAEAV012@AEBI@Z + ??$?6J@LogMessage@log_internal@absl@@QEAAAEAV012@AEBJ@Z + ??$?6K@LogMessage@log_internal@absl@@QEAAAEAV012@AEBK@Z + ??$?6M@LogMessage@log_internal@absl@@QEAAAEAV012@AEBM@Z + ??$?6N@LogMessage@log_internal@absl@@QEAAAEAV012@AEBN@Z + ??$?6PEAX@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEAX@Z + ??$?6PEBD@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEBD@Z + ??$?6PEBX@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEBX@Z + ??$?6PEB_W@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEB_W@Z + ??$?6_J@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_J@Z + ??$?6_K@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_K@Z + ??$?6_N@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_N@Z + ??$?MUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?OUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CC@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CC@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CG@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CG@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CH@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CH@$$CBD@Z + ??$AbslStringify@VStringifySink@strings_internal@absl@@@absl@@YAXAEAVStringifySink@strings_internal@0@UHex@0@@Z + ??$AddCordRep@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z + ??$AddCordRep@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z + ??$AddData@$00@CordRepBtree@cord_internal@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ??$AddData@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$AllocateBackingArray@$07V?$allocator@D@__Cr@std@@@container_internal@absl@@YAPEAXPEAX_K@Z + ??$Append@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$AppendImpl@AEBVCord@absl@@@Cord@absl@@AEAAXAEBV01@@Z + ??$AppendImpl@VCord@absl@@@Cord@absl@@AEAAX$$QEAV01@@Z + ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@A6AXXZ@Z + ??$CallOnceImpl@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@$$QEAP8FlagImpl@flags_internal@1@EAAXXZ$$QEAPEAV671@@Z + ??$CastAndCallFunction@$$CBU?$atomic@_N@__Cr@std@@@Condition@absl@@CA_NPEBV01@@Z + ??$ConsumeConversion@$00@str_format_internal@absl@@YAPEBDPEBDQEBDPEAUUnboundConversion@01@PEAH@Z + ??$ConsumeConversion@$0A@@str_format_internal@absl@@YAPEBDPEBDQEBDPEAUUnboundConversion@01@PEAH@Z + ??$ConvertIntArg@C@str_format_internal@absl@@YA_NCVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@D@str_format_internal@absl@@YA_NDVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@E@str_format_internal@absl@@YA_NEVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@F@str_format_internal@absl@@YA_NFVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@G@str_format_internal@absl@@YA_NGVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@H@str_format_internal@absl@@YA_NHVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@I@str_format_internal@absl@@YA_NIVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@J@str_format_internal@absl@@YA_NJVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@K@str_format_internal@absl@@YA_NKVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@Vint128@absl@@@str_format_internal@absl@@YA_NVint128@1@VFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@Vuint128@absl@@@str_format_internal@absl@@YA_NVuint128@1@VFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_J@str_format_internal@absl@@YA_N_JVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_K@str_format_internal@absl@@YA_N_KVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_W@str_format_internal@absl@@YA_N_WVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXD_K@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXD_K@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBufferWithStructuredProtoField@$00@LogMessage@log_internal@absl@@AEAAXUStructuredProtoField@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBufferWithStructuredProtoField@$0A@@LogMessage@log_internal@absl@@AEAAXUStructuredProtoField@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$DeallocateBackingArray@$07V?$allocator@D@__Cr@std@@@container_internal@absl@@YAXPEAX_KPEAW4ctrl_t@01@11_N@Z + ??$Dispatch@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@F@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@G@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@H@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@I@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@M@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@O@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@PEBD@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@PEB_W@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@UVoidPtr@str_format_internal@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@Vint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@Vuint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$EmplaceBackSlow@AEBQEAVLogSink@absl@@@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAAEAPEAVLogSink@2@AEBQEAV32@@Z + ??$EmplaceBackSlow@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAAEAUPayload@status_internal@2@$$QEAU342@@Z + ??$FindSubstitutions@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@strings_internal@absl@@YA?AV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@AEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@4@@Z + ??$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@01@PEBXPEAX2@Z + ??$Flush@V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@VBufferRawSink@str_format_internal@absl@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@VFILERawSink@str_format_internal@absl@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$GenRuntimeTypeId@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEBVtype_info@@XZ + ??$GenericCompare@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@absl@@YAHAEBVCord@0@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$GenericCompare@HVCord@absl@@@absl@@YAHAEBVCord@0@0_K@Z + ??$GenericCompare@_NVCord@absl@@@absl@@YA_NAEBVCord@0@0_K@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$00$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$03$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$07$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$0A@$0A@@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$0BA@$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$InvokeObject@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z + ??$MakeCheckOpString@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0PEBD@Z + ??$MakeCheckOpString@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PEBD@Z + ??$MakeCheckOpString@DD@log_internal@absl@@YAPEBDDDPEBD@Z + ??$MakeCheckOpString@EE@log_internal@absl@@YAPEBDEEPEBD@Z + ??$MakeCheckOpString@MM@log_internal@absl@@YAPEBDMMPEBD@Z + ??$MakeCheckOpString@NN@log_internal@absl@@YAPEBDNNPEBD@Z + ??$MakeCheckOpString@PEBCPEBC@log_internal@absl@@YAPEBDPEBC0PEBD@Z + ??$MakeCheckOpString@PEBDPEBD@log_internal@absl@@YAPEBDPEBD00@Z + ??$MakeCheckOpString@PEBEPEBE@log_internal@absl@@YAPEBDPEBE0PEBD@Z + ??$MakeCheckOpString@PEBXPEBX@log_internal@absl@@YAPEBDPEBX0PEBD@Z + ??$MakeCheckOpString@_J_J@log_internal@absl@@YAPEBD_J0PEBD@Z + ??$MakeCheckOpString@_K_K@log_internal@absl@@YAPEBD_K0PEBD@Z + ??$MakeCheckOpString@_N_N@log_internal@absl@@YAPEBD_N0PEBD@Z + ??$Merge@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z + ??$Merge@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z + ??$NewLeaf@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$NewLeaf@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$ParseFlagImpl@H@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAH@Z + ??$ParseFlagImpl@I@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAI@Z + ??$ParseFlagImpl@J@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAJ@Z + ??$ParseFlagImpl@K@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAK@Z + ??$ParseFlagImpl@_J@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEA_J@Z + ??$ParseFlagImpl@_K@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEA_K@Z + ??$ParseFloat@$09@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z + ??$ParseFloat@$0BA@@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z + ??$ParseFormatString@UParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@@str_format_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UParsedFormatConsumer@ParsedFormatBase@01@@Z + ??$PopDead@_J_K_K_KG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AEAAPEAUHashtablezInfo@container_internal@2@_J_K11G@Z + ??$Prepend@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$Register@AEB_JAEA_KAEA_KAEA_KAEAG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAAPEAUHashtablezInfo@container_internal@2@AEB_JAEA_K11AEAG@Z + ??$SNPrintF@DHHH@absl@@YAHPEAD_KAEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@str_format_internal@0@AEBDAEBH44@Z + ??$StrCat@PEBD@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBQEBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY02D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY02$$CBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY03D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY03$$CBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0BO@DV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY0BO@$$CBD1@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0LD@D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY0LD@$$CBD@Z + ??$StrCat@_K@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z + ??$TransferNRelocatable@$0BI@@container_internal@absl@@YAXPEAX00_K@Z + ??$TryFindNewIndexWithoutProbing@X@container_internal@absl@@YA_K_K00PEAW4ctrl_t@01@0@Z + ??$TypeErasedApplyToSlotFn@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@YA_KPEBXPEAX_K@Z + ??$UnparseFloatingPointVal@M@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@M@Z + ??$UnparseFloatingPointVal@N@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z + ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z + ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z + ??$__call_func@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@CAXPEBT__policy_storage@123@AEAVCommandLineFlag@absl@@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$00@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$01@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$02@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$0A@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__do_rehash@$00@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAX_K@Z + ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z + ??$__emplace_back_slow_path@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV612@AEA_K@Z + ??$__emplace_back_slow_path@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@AEBU34@@Z + ??$__emplace_back_slow_path@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@$$QEAW4Source@34@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$__for_each_segment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@23@@__Cr@std@@YAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@01@@Z + ??$__insert_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@1_J@Z + ??$__invoke@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@__Cr@std@@YAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@6@@Z + ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@12@@Z + ??$emplace@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@12@@Z + ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@HVcrc32c_t@absl@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAH$$QEAVcrc32c_t@6@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$find_or_prepare_insert@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_or_prepare_insert_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$resize_and_overwrite@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@56@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@UNoFormatter@23@@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV012@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@1V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@UNoFormatter@45@@Z@@Z + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@XZ + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@_K@Z + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@XZ + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@_K@Z + ??0?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@W4State@012@PEBV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@W4State@012@PEBV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0AlphaNum@absl@@QEAA@H@Z + ??0AlphaNum@absl@@QEAA@PEBD@Z + ??0AlphaNum@absl@@QEAA@_K@Z + ??0Arena@LowLevelAlloc@base_internal@absl@@QEAA@I@Z + ??0Arg@substitute_internal@absl@@QEAA@PEBX@Z + ??0Arg@substitute_internal@absl@@QEAA@UDec@2@@Z + ??0Arg@substitute_internal@absl@@QEAA@UHex@2@@Z + ??0BadStatusOrAccess@absl@@QEAA@$$QEAV01@@Z + ??0BadStatusOrAccess@absl@@QEAA@AEBV01@@Z + ??0BadStatusOrAccess@absl@@QEAA@VStatus@1@@Z + ??0BlockingCounter@absl@@QEAA@H@Z + ??0ByAnyChar@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0ByLength@absl@@QEAA@_J@Z + ??0ByString@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0CRC@crc_internal@absl@@IEAA@XZ + ??0CheckOpMessageBuilder@log_internal@absl@@QEAA@PEBD@Z + ??0Condition@absl@@QEAA@P6A_NPEAX@Z0@Z + ??0Condition@absl@@QEAA@PEB_N@Z + ??0Cord@absl@@AEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@1@@Z + ??0Cord@absl@@QEAA@AEBV01@@Z + ??0CordzHandle@cord_internal@absl@@IEAA@_N@Z + ??0CordzInfo@cord_internal@absl@@AEAA@PEAUCordRep@12@PEBV012@W4MethodIdentifier@CordzUpdateTracker@12@_J@Z + ??0CrcCordState@crc_internal@absl@@QEAA@$$QEAV012@@Z + ??0CrcCordState@crc_internal@absl@@QEAA@AEBV012@@Z + ??0CrcCordState@crc_internal@absl@@QEAA@XZ + ??0DynValueDeleter@flags_internal@absl@@QEAA@P6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ??0FlagSaver@absl@@QEAA@XZ + ??0GraphCycles@synchronization_internal@absl@@QEAA@XZ + ??0HashtablezInfo@container_internal@absl@@QEAA@XZ + ??0Impl@time_zone@cctz@time_internal@absl@@AEAA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??0Impl@time_zone@cctz@time_internal@absl@@AEAA@XZ + ??0KernelTimeout@synchronization_internal@absl@@QEAA@VDuration@2@@Z + ??0KernelTimeout@synchronization_internal@absl@@QEAA@VTime@2@@Z + ??0LeakCheckDisabler@absl@@QEAA@XZ + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUErrorTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUInfoTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUWarningTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@2@@Z + ??0LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@2@@Z + ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@3@VTime@3@@Z + ??0LogMessageDebugFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH0@Z + ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageQuietlyDebugFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageQuietlyFatal@log_internal@absl@@QEAA@PEBDH0@Z + ??0LogMessageQuietlyFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0MaskedPointer@flags_internal@absl@@QEAA@PEAX_N@Z + ??0OstreamView@LogMessage@log_internal@absl@@QEAA@AEAULogMessageData@123@@Z + ??0ParsedFormatBase@str_format_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_NV?$initializer_list@W4FormatConversionCharSet@absl@@@5@@Z + ??0Randen@random_internal@absl@@QEAA@XZ + ??0ScopedMinLogLevel@log_internal@absl@@QEAA@W4LogSeverityAtLeast@2@@Z + ??0ScopedStderrThreshold@absl@@QEAA@W4LogSeverityAtLeast@1@@Z + ??0Status@absl@@QEAA@W4StatusCode@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0StdcppWaiter@synchronization_internal@absl@@QEAA@XZ + ??0StringifySink@detect_specialization@log_internal@absl@@QEAA@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0TimeZoneLibC@cctz@time_internal@absl@@AEAA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??0Utf8ForCodePoint@debugging_internal@absl@@QEAA@_K@Z + ??0Win32Waiter@synchronization_internal@absl@@QEAA@XZ + ??0int128@absl@@QEAA@M@Z + ??0int128@absl@@QEAA@N@Z + ??0int128@absl@@QEAA@O@Z + ??0uint128@absl@@QEAA@M@Z + ??0uint128@absl@@QEAA@N@Z + ??0uint128@absl@@QEAA@O@Z + ??1?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1CRC@crc_internal@absl@@UEAA@XZ + ??1Cord@absl@@QEAA@XZ + ??1CordzHandle@cord_internal@absl@@MEAA@XZ + ??1CordzInfo@cord_internal@absl@@EEAA@XZ + ??1CrcCordState@crc_internal@absl@@QEAA@XZ + ??1FlagSaver@absl@@QEAA@XZ + ??1FlagStateInterface@flags_internal@absl@@UEAA@XZ + ??1GraphCycles@synchronization_internal@absl@@QEAA@XZ + ??1HashtablezInfo@container_internal@absl@@QEAA@XZ + ??1LeakCheckDisabler@absl@@QEAA@XZ + ??1LogMessage@log_internal@absl@@QEAA@XZ + ??1LogMessageDebugFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageQuietlyDebugFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageQuietlyFatal@log_internal@absl@@QEAA@XZ + ??1Mutex@absl@@QEAA@XZ + ??1Notification@absl@@QEAA@XZ + ??1OstreamView@LogMessage@log_internal@absl@@UEAA@XZ + ??1ScopedMinLogLevel@log_internal@absl@@QEAA@XZ + ??1ScopedStderrThreshold@absl@@QEAA@XZ + ??1SeedGenException@absl@@UEAA@XZ + ??1TimeZoneIf@cctz@time_internal@absl@@UEAA@XZ + ??1TimeZoneInfo@cctz@time_internal@absl@@UEAA@XZ + ??1ZoneInfoSource@cctz@time_internal@absl@@UEAA@XZ + ??4BadStatusOrAccess@absl@@QEAAAEAV01@$$QEAV01@@Z + ??4BadStatusOrAccess@absl@@QEAAAEAV01@AEBV01@@Z + ??4Cord@absl@@QEAAAEAV01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??4CrcCordState@crc_internal@absl@@QEAAAEAV012@$$QEAV012@@Z + ??4CrcCordState@crc_internal@absl@@QEAAAEAV012@AEBV012@@Z + ??4FlagsUsageConfig@absl@@QEAAAEAU01@AEBU01@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@AEBV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@P6AAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV345@@Z@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@P6AAEAVios_base@__Cr@std@@AEAV345@@Z@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@_W@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@AEBVCord@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@AEBVStatus@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vint128@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vuint128@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverity@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverityAtLeast@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverityAtMost@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4StatusCode@0@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@W4weekday@0123@@Z + ??6log_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@UUnprintableWrapper@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@01@@Z + ??8StatusRep@status_internal@absl@@QEBA_NAEBV012@@Z + ??ACord@absl@@QEBAD_K@Z + ??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ??Bint128@absl@@QEBANXZ + ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??Hdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Kabsl@@YA?AVint128@0@V10@0@Z + ??Kabsl@@YA?AVuint128@0@V10@0@Z + ??Labsl@@YA?AVint128@0@V10@0@Z + ??Labsl@@YA?AVuint128@0@V10@0@Z + ??R@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBQEBUCordRep@cord_internal@absl@@@Z@QEBA?A?@@00@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QEAV423@@Z@QEBA?A?@@XZ + ??R?$ConvertToContainer@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z + ??R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z + ??RByCivilTime@Transition@cctz@time_internal@absl@@QEBA_NAEBU1234@0@Z + ??RDynValueDeleter@flags_internal@absl@@QEBAXPEAX@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z + ??XDuration@absl@@QEAAAEAV01@N@Z + ??XDuration@absl@@QEAAAEAV01@_J@Z + ??YDuration@absl@@QEAAAEAV01@V01@@Z + ??ZDuration@absl@@QEAAAEAV01@V01@@Z + ??_0Duration@absl@@QEAAAEAV01@N@Z + ??_0Duration@absl@@QEAAAEAV01@_J@Z + ??_1Duration@absl@@QEAAAEAV01@V01@@Z + ?AbortedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslFormatFlush@detect_specialization@log_internal@absl@@YAXPEAVStringifySink@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVDuration@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAW4LogSeverity@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAFPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAGPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAIPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAJPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAKPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAMPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEANPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@1@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@45@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVint128@2@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVuint128@2@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_JPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_KPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_NPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LogSeverity@1@@Z + ?AbslUnparseFlag@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@45@@Z + ?AbslUnparseFlag@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@12@@Z + ?Absorb@RandenHwAes@random_internal@absl@@SAXPEBXPEAX@Z + ?Absorb@RandenSlow@random_internal@absl@@SAXPEBXPEAX@Z + ?AddHint@BestHints@flags_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z + ?AddLogSink@log_internal@absl@@YAXPEAVLogSink@2@@Z + ?AddWithCarry@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHI@Z + ?AddWithCarry@?$BigUnsigned@$03@strings_internal@absl@@AEAAXH_K@Z + ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHI@Z + ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXH_K@Z + ?AddressIsReadable@debugging_internal@absl@@YA_NPEBX@Z + ?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AEAA?AV23@_K@Z + ?AdvanceBytesBtree@ChunkIterator@Cord@absl@@AEAAX_K@Z + ?Alloc@LowLevelAlloc@base_internal@absl@@SAPEAX_K@Z + ?AllocWithArena@LowLevelAlloc@base_internal@absl@@SAPEAX_KPEAUArena@123@@Z + ?AlreadyExistsError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AlwaysTrue@Condition@absl@@CA_NPEBV12@@Z + ?Append@Cord@absl@@QEAAX$$QEAV12@@Z + ?Append@Cord@absl@@QEAAXAEBV12@@Z + ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z + ?Append@StringifySink@detect_specialization@log_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@detect_specialization@log_internal@absl@@QEAAX_KD@Z + ?Append@StringifySink@strings_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@strings_internal@absl@@QEAAX_KD@Z + ?AppendArray@InlineRep@Cord@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@3@@Z + ?AppendCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$initializer_list@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@5@@Z + ?AppendPrecise@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?AppendSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z + ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?ApplyMask@MaskedPointer@flags_internal@absl@@AEAAX_K@Z + ?ApplySubstitutions@strings_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@45@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AsciiStrToLower@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AsciiStrToLower@ascii_internal@absl@@YAXPEADPEBD_K@Z + ?AsciiStrToUpper@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AsciiStrToUpper@ascii_internal@absl@@YAXPEADPEBD_K@Z + ?AssertHeld@Mutex@absl@@QEBAXXZ + ?AssertNotHeld@Mutex@absl@@QEBAXXZ + ?AssertReaderHeld@Mutex@absl@@QEBAXXZ + ?AssertValidType@FlagImpl@flags_internal@absl@@QEBAXPEBXP6APEBVtype_info@@XZ@Z + ?AssignLargeString@Cord@absl@@AEAAAEAV12@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AssignSlow@InlineRep@Cord@absl@@AEAAXAEBV123@@Z + ?AsyncSignalSafeWriteError@raw_log_internal@absl@@YAXPEBD_K@Z + ?At@TimeZone@absl@@QEBA?AUCivilInfo@12@VTime@2@@Z + ?At@TimeZone@absl@@QEBA?AUTimeInfo@12@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@2@@Z + ?AtLocation@LogMessage@log_internal@absl@@QEAAAEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?AtomicBufferValue@FlagImpl@flags_internal@absl@@AEBAPEAU?$atomic@_K@__Cr@std@@XZ + ?AwaitCommon@Mutex@absl@@AEAA_NAEBVCondition@2@VKernelTimeout@synchronization_internal@2@@Z + ?Base64Escape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?Base64Escape@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?Base64EscapeInternal@strings_internal@absl@@YA_KPEBE_KPEAD1PEBD_N@Z + ?Base64Unescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?BindWithPack@str_format_internal@absl@@YA_NPEBUUnboundConversion@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@PEAVBoundConversion@12@@Z + ?Block@Barrier@absl@@QEAA_NXZ + ?Block@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?BreakTime@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AUabsolute_lookup@time_zone@234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BreakTime@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AUabsolute_lookup@time_zone@234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BytesToHexString@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CPUSupportsRandenHwAes@random_internal@absl@@YA_NXZ + ?CUnescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@1@Z + ?CalculateBase64EscapedLenInternal@strings_internal@absl@@YA_K_K_N@Z + ?CallVoidPtrFunction@Condition@absl@@CA_NPEBV12@@Z + ?CancelledError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?CappedDamerauLevenshteinDistance@strings_internal@absl@@YAEV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0E@Z + ?CatPieces@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$initializer_list@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@5@@Z + ?Ceil@absl@@YA?AVDuration@1@V21@0@Z + ?CheckDefaultValueParsingRoundtrip@FlagImpl@flags_internal@absl@@EEBAXXZ + ?CheckDefaultValueParsingRoundtrip@PrivateHandleAccessor@flags_internal@absl@@SAXAEBVCommandLineFlag@3@@Z + ?CheckInvariants@GraphCycles@synchronization_internal@absl@@QEBA_NXZ + ?CheckMask@MaskedPointer@flags_internal@absl@@AEBA_N_K@Z + ?CheckstrcasecmpfalseImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcasecmptrueImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcmpfalseImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcmptrueImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?Checksum@CrcCordState@crc_internal@absl@@QEBA?AVcrc32c_t@3@XZ + ?CityHash32@hash_internal@absl@@YAIPEBD_K@Z + ?CityHash64@hash_internal@absl@@YA_KPEBD_K@Z + ?CityHash64WithSeed@hash_internal@absl@@YA_KPEBD_K1@Z + ?CityHash64WithSeeds@hash_internal@absl@@YA_KPEBD_K11@Z + ?Clear@Cord@absl@@QEAAXXZ + ?ClearBackingArray@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@PEAX_N3@Z + ?ClearCurrentThreadIdentity@base_internal@absl@@YAXXZ + ?ClearLogBacktraceLocation@absl@@YAXXZ + ?ClearTimeZoneMapTestOnly@Impl@time_zone@cctz@time_internal@absl@@SAXXZ + ?CloneAndUnref@StatusRep@status_internal@absl@@QEBAPEAV123@XZ + ?CombineContiguousImpl@hash_internal@absl@@YA_K_KPEBE0U?$integral_constant@H$03@__Cr@std@@@Z + ?CombineContiguousImpl@hash_internal@absl@@YA_K_KPEBE0U?$integral_constant@H$07@__Cr@std@@@Z + ?CombineLargeContiguousImplOn32BitLengthGt8@hash_internal@absl@@YA_KPEBE_K1@Z + ?CombineLargeContiguousImplOn64BitLengthGt32@hash_internal@absl@@YA_KPEBE_K1@Z + ?Compare@Cord@absl@@QEBAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?CompareImpl@Cord@absl@@AEBAHAEBV12@@Z + ?CompareSlowPath@Cord@absl@@AEBAHAEBV12@_K1@Z + ?CompareSlowPath@Cord@absl@@AEBAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K1@Z + ?Compute@CrcNonTemporalMemcpyAVXEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?Compute@CrcNonTemporalMemcpyEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?Compute@FallbackCrcMemcpyEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?ConcatCrc32c@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?Consume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z + ?ConsumeBeginTo@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@_K1@Z + ?ConsumeUnboundConversionNoInline@str_format_internal@absl@@YAPEBDPEBD0PEAUUnboundConversion@12@PEAH@Z + ?Contains@Cord@absl@@QEBA_NAEBV12@@Z + ?Contains@Cord@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ConvertBoolArg@str_format_internal@absl@@YA_N_NPEAVFormatSinkImpl@12@@Z + ?ConvertDateTime@absl@@YA?AUTimeConversion@1@_JHHHHHVTimeZone@1@@Z + ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAW4ctrl_t@12@_K@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NMAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NNAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NOAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?Copy@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@AEBV312@V?$FunctionRef@$$A6AXPEAXPEBX@Z@2@@Z + ?CopyCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?CopyPrefix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K_N@Z + ?CopySuffix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z + ?CopyToArraySlowPath@Cord@absl@@AEBAXPEAD@Z + ?Crash@Helper@internal_statusor@absl@@SAXAEBVStatus@3@@Z + ?Crc32c@CRC@crc_internal@absl@@SAPEAV123@XZ + ?CreateSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@@Z + ?CreateThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ + ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPEAUThreadIdentity@12@XZ + ?CurrentValue@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?DataGuard@FlagImpl@flags_internal@absl@@AEBAAEAVMutex@3@XZ + ?DataLossError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?DeadlineExceededError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?DecodeFrom@ProtoField@log_internal@absl@@QEAA_NPEAV?$Span@$$CBD@3@@Z + ?DecodeRustPunycode@debugging_internal@absl@@YAPEADUDecodeRustPunycodeOptions@12@@Z + ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_JI@Z + ?DecrementCount@BlockingCounter@absl@@QEAA_NXZ + ?DecrementSynchSem@Mutex@absl@@CA_NPEAV12@PEAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z + ?DeduceUsageFlags@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ + ?DefaultStackUnwinder@absl@@YAHPEAPEAXPEAHHHPEBX1@Z + ?DefaultStackUnwinder@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHHPEBX2@Z + ?DefaultValue@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Delete@CordzHandle@cord_internal@absl@@SAXPEAV123@@Z + ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPEAUArena@123@@Z + ?Demangle@debugging_internal@absl@@YA_NPEBDPEAD_K@Z + ?DemangleRustSymbolEncoding@debugging_internal@absl@@YA_NPEBDPEAD_K@Z + ?DemangleString@debugging_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBD@Z + ?Description@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Description@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Destroy@CordRep@cord_internal@absl@@SAXPEAU123@@Z + ?Destroy@CordRepBtree@cord_internal@absl@@SAXPEAV123@@Z + ?Destroy@CordRepCrc@cord_internal@absl@@SAXPEAU123@@Z + ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAXXZ + ?DestroyCordSlow@Cord@absl@@AEAAXXZ + ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z + ?Die@LogMessage@log_internal@absl@@AEAAXXZ + ?DieBecauseNull@log_internal@absl@@YAXPEBDH0@Z + ?Digits10@?$BigUnsigned@$03@strings_internal@absl@@SAHXZ + ?Digits10@?$BigUnsigned@$0FE@@strings_internal@absl@@SAHXZ + ?DoIgnoreLeak@absl@@YAXPEBX@Z + ?Dtor@Mutex@absl@@AEAAXXZ + ?DummyFunction@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@CA?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@CAXPEBDH000@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@CAXPEBDPEBX@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDPEBX_J@Z@base_internal@absl@@CAXPEBDPEBX_J@Z + ?DummyFunction@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@CAXPEBX_J@Z + ?DummyFunction@?$AtomicHook@P6AXXZ@base_internal@absl@@CAXXZ + ?DummyFunction@?$AtomicHook@P6AX_J@Z@base_internal@absl@@CAX_J@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@67@@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_NAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@67@@Z + ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXQEAXQEBQEAXQEAHHH_NP6AXPEBDPEAX@Z5@Z + ?DumpStackTrace@debugging_internal@absl@@YAXHH_NP6AXPEBDPEAX@Z2@Z + ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z + ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z + ?EmptyGeneration@container_internal@absl@@YAPEAEXZ + ?EmptyString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?EnableDebugLog@CondVar@absl@@QEAAXPEBD@Z + ?EnableDebugLog@Mutex@absl@@QEAAXPEBD@Z + ?EnableInvariantDebugging@Mutex@absl@@QEAAXP6AXPEAX@Z0@Z + ?EnableLogPrefix@absl@@YAX_N@Z + ?EnableMutexInvariantDebugging@absl@@YAX_N@Z + ?EnableSymbolizeLogStackTrace@log_internal@absl@@YAX_N@Z + ?Encode32Bit@log_internal@absl@@YA_N_KIPEAV?$Span@D@2@@Z + ?Encode64Bit@log_internal@absl@@YA_N_K0PEAV?$Span@D@2@@Z + ?EncodeBytes@log_internal@absl@@YA_N_KV?$Span@$$CBD@2@PEAV?$Span@D@2@@Z + ?EncodeBytesTruncate@log_internal@absl@@YA_N_KV?$Span@$$CBD@2@PEAV?$Span@D@2@@Z + ?EncodeMessageLength@log_internal@absl@@YAXV?$Span@D@2@PEBV32@@Z + ?EncodeMessageStart@log_internal@absl@@YA?AV?$Span@D@2@_K0PEAV32@@Z + ?EncodeStructuredProtoField@log_internal@absl@@YA_NUStructuredProtoField@12@AEAV?$Span@D@2@@Z + ?EncodeUTF8Char@strings_internal@absl@@YA_KPEAD_U@Z + ?EncodeVarint@log_internal@absl@@YA_N_K0PEAV?$Span@D@2@@Z + ?EncodeWaitCycles@SpinLock@base_internal@absl@@KAI_J0@Z + ?EndsWith@Cord@absl@@QEBA_NAEBV12@@Z + ?EndsWith@Cord@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?EndsWithIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EqualsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EqualsImpl@Cord@absl@@AEBA_NAEBV12@_K@Z + ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z + ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z + ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z + ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z + ?Eval@Condition@absl@@QEBA_NXZ + ?ExitOnDFatal@log_internal@absl@@YA_NXZ + ?ExpectedChecksum@Cord@absl@@QEBA?AV?$optional@I@__Cr@std@@XZ + ?Extend@CRC32@crc_internal@absl@@UEBAXPEAIPEBX_K@Z + ?ExtendByZeroes@CRC32@crc_internal@absl@@UEBAXPEAI_K@Z + ?ExtendByZeroesImpl@CRC32@crc_internal@absl@@CAXPEAI_KQEBI2@Z + ?ExtendCrc32cByZeroes@absl@@YA?AVcrc32c_t@1@V21@_K@Z + ?ExtendCrc32cInternal@crc_internal@absl@@YA?AVcrc32c_t@2@V32@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ExtendTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NXZ + ?ExtractAppendBuffer@CordRepBtree@cord_internal@absl@@SA?AUExtractResult@CordRep@23@PEAV123@_K@Z + ?ExtractFront@CordRepBtree@cord_internal@absl@@CAPEAUCordRep@23@PEAV123@@Z + ?FDivDuration@absl@@YANVDuration@1@0@Z + ?FLAGS_noflagfile@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FLAGS_nofromenv@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FLAGS_notryfromenv@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FLAGS_noundefok@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FNMatch@log_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?FailQuietly@LogMessage@log_internal@absl@@KAXXZ + ?FailWithoutStackTrace@LogMessage@log_internal@absl@@KAXXZ + ?FailedPreconditionError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FailureSignalToString@debugging_internal@absl@@YAPEBDH@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEADHPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEADIPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_JPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_KPEAD@Z + ?Fer@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?Filename@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?FillParentStack@CordzInfo@cord_internal@absl@@CA_KPEBV123@PEAPEAX@Z + ?FillWordTable@CRCImpl@crc_internal@absl@@SAXIIHPEAY0BAA@I@Z + ?FillZeroesTable@CRCImpl@crc_internal@absl@@SAHIPEAY0BAA@I@Z + ?FinalizeEncodingAndFormat@LogMessageData@LogMessage@log_internal@absl@@QEAAXXZ + ?FinalizeRegistry@flags_internal@absl@@YAXXZ + ?Find@ByAnyChar@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByAsciiWhitespace@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByChar@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByLength@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByString@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@Cord@absl@@QEBA?AVCharIterator@12@AEBV12@@Z + ?Find@Cord@absl@@QEBA?AVCharIterator@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindCommandLineFlag@absl@@YAPEAVCommandLineFlag@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindFlag@FlagRegistry@flags_internal@absl@@QEAAPEAVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindFlatStartPiece@InlineRep@Cord@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?FindImpl@Cord@absl@@AEBA?AVCharIterator@12@V312@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindLongestCommonPrefix@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@0@Z + ?FindLongestCommonSuffix@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@0@Z + ?FindPath@GraphCycles@synchronization_internal@absl@@QEBAHUGraphId@23@0HQEAU423@@Z + ?FiveToTheNth@?$BigUnsigned@$03@strings_internal@absl@@SA?AV123@H@Z + ?FiveToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@SA?AV123@H@Z + ?FixUpStack@internal_stacktrace@absl@@YAXPEAPEAXPEA_KPEAH_KAEA_K@Z + ?FixedOffsetFromName@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FixedOffsetToAbbr@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FixedOffsetToName@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FlagHelp@flags_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCommandLineFlag@2@W4HelpFormat@12@@Z + ?FlagsHelp@flags_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@W4HelpFormat@12@1@Z + ?FlagsToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4Flags@12@@Z + ?FlatOverhead@CordTestAccess@strings_internal@absl@@SA_KXZ + ?FlatTagToLength@CordTestAccess@strings_internal@absl@@SA_KE@Z + ?FlattenSlowPath@Cord@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Floor@absl@@YA?AVDuration@1@V21@0@Z + ?Flush@LogMessage@log_internal@absl@@QEAAXXZ + ?Flush@LogSink@absl@@UEAAXXZ + ?FlushLogSinks@log_internal@absl@@YAXXZ + ?ForEachChunkAux@Cord@absl@@CAXPEAUCordRep@cord_internal@2@V?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z@2@@Z + ?ForEachFlag@flags_internal@absl@@YAXV?$function@$$A6AXAEAVCommandLineFlag@absl@@@Z@__Cr@std@@@Z + ?ForEachPayload@StatusRep@status_internal@absl@@QEBAXV?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCord@absl@@@Z@3@@Z + ?ForVar2@CheckOpMessageBuilder@log_internal@absl@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?ForcedTrySample@container_internal@absl@@YA?AVHashtablezInfoHandle@12@_K00G@Z + ?ForgetDeadlockInfo@Mutex@absl@@QEAAXXZ + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatConversionCharToConvInt@str_format_internal@absl@@YA_KD@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0BPPPL@@12@DVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0BPPPL@@12@_WVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAA@@12@UVoidPtr@12@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@$$TVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@PEBDVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@PEB_WVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@AEBV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@MVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@NVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@OVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@CVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@EVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@FVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@GVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@HVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@IVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@JVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@KVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@Vint128@2@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@Vuint128@2@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@_JVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@_KVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatDuration@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?FormatLogMessage@log_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LogSeverity@2@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@2@VDuration@2@IV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@HW4PrefixFormat@12@3@Z + ?FormatLogPrefix@log_internal@absl@@YA_KW4LogSeverity@2@VTime@2@IV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4PrefixFormat@12@AEAV?$Span@D@2@@Z + ?FormatPack@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@VTime@1@VTimeZone@1@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@VTimeZone@1@@Z + ?FormatUntyped@str_format_internal@absl@@YA_NVFormatRawSinkImpl@12@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?FprintF@str_format_internal@absl@@YAHPEAU_iobuf@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?Free@LowLevelAlloc@base_internal@absl@@SAXPEAX@Z + ?Frequency@UnscaledCycleClock@base_internal@absl@@CANXZ + ?FromChrono@absl@@YA?AVTime@1@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?FromTM@absl@@YA?AVTime@1@AEBUtm@@VTimeZone@1@@Z + ?FromUDate@absl@@YA?AVTime@1@N@Z + ?FromUniversal@absl@@YA?AVTime@1@_J@Z + ?Generate@RandenHwAes@random_internal@absl@@SAXPEBXPEAX@Z + ?Generate@RandenSlow@random_internal@absl@@SAXPEBXPEAX@Z + ?Get@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@AEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ + ?GetAllFlags@absl@@YA?AV?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@1@XZ + ?GetAndroidNativeTag@log_internal@absl@@YAPEBDXZ + ?GetAppendBuffer@CordRepBtree@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z + ?GetAppendBufferSlow@CordRepBtree@cord_internal@absl@@AEAA?AV?$Span@D@3@_K@Z + ?GetAppendBufferSlowPath@Cord@absl@@AEAA?AVCordBuffer@2@_K00@Z + ?GetArchSpecificEngines@CrcMemcpy@crc_internal@absl@@CA?AUArchSpecificEngines@123@XZ + ?GetCachedTID@base_internal@absl@@YAIXZ + ?GetCharacter@CordRepBtree@cord_internal@absl@@QEBAD_K@Z + ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ + ?GetCpuType@crc_internal@absl@@YA?AW4CpuType@12@XZ + ?GetCurrentTimeNanos@absl@@YA_JXZ + ?GetDebugStackTraceHook@debugging_internal@absl@@YAP6AXQEBQEAXHP6AXPEBDPEAX@Z2@ZXZ + ?GetEntropyFromRandenPool@random_internal@absl@@YAXPEAX_K@Z + ?GetEstimatedFairShareMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetEstimatedMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetFlagsHelpFormat@flags_internal@absl@@YA?AW4HelpFormat@12@XZ + ?GetFlagsHelpMatchSubstr@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?GetFlagsHelpMode@flags_internal@absl@@YA?AW4HelpMode@12@XZ + ?GetFlatAux@Cord@absl@@CA_NPEAUCordRep@cord_internal@2@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?GetHashtablezMaxSamples@container_internal@absl@@YA_KXZ + ?GetHashtablezSampleParameter@container_internal@absl@@YAHXZ + ?GetId@GraphCycles@synchronization_internal@absl@@QEAA?AUGraphId@23@PEAX@Z + ?GetKeys@RandenHwAes@random_internal@absl@@SAPEBXXZ + ?GetKeys@RandenSlow@random_internal@absl@@SAPEBXXZ + ?GetMisspellingHints@flags_internal@absl@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?GetMorePreciseMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PEBV123@@Z + ?GetParentStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ + ?GetPayload@StatusRep@status_internal@absl@@QEBA?AV?$optional@VCord@absl@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@@Z + ?GetProgramCounter@debugging_internal@absl@@YAPEAXQEAX@Z + ?GetRefForEmptyClass@container_internal@absl@@YAPEAXAEAVCommonFields@12@@Z + ?GetSaltMaterial@random_internal@absl@@YA?AV?$optional@I@__Cr@std@@XZ + ?GetSkipCount@ExponentialBiased@profiling_internal@absl@@QEAA_J_J@Z + ?GetStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ + ?GetStackFrames@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHH@Z + ?GetStackFramesWithContext@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHHPEBX2@Z + ?GetStackTrace@GraphCycles@synchronization_internal@absl@@QEAAHUGraphId@23@PEAPEAPEAX@Z + ?GetStackTrace@absl@@YAHPEAPEAXHH@Z + ?GetStackTraceWithContext@absl@@YAHPEAPEAXHHPEBXPEAH@Z + ?GetStatusPayloadPrinter@status_internal@absl@@YAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@AEBVCord@2@@ZXZ + ?GetStride@ExponentialBiased@profiling_internal@absl@@QEAA_J_J@Z + ?GetTID@base_internal@absl@@YAIXZ + ?GetTestEngine@CrcMemcpy@crc_internal@absl@@SA?AV?$unique_ptr@VCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@HH@Z + ?GetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAPEAU?$atomic@H@__Cr@std@@XZ + ?GetTransitionType@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NH_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAE@Z + ?GetUsageConfig@flags_internal@absl@@YA?AUFlagsUsageConfig@2@XZ + ?GetWord@?$BigUnsigned@$03@strings_internal@absl@@QEBAIH@Z + ?GetWord@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAIH@Z + ?GlobalHashtablezSampler@container_internal@absl@@YAAEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?GlobalList@CordzInfo@cord_internal@absl@@CAPEAUList@123@XZ + ?GlobalRegistry@FlagRegistry@flags_internal@absl@@SAAEAV123@XZ + ?GuaranteedEqual@Condition@absl@@SA_NPEBV12@0@Z + ?HandleInvalidStatusCtorArg@Helper@internal_statusor@absl@@SAXPEAVStatus@3@@Z + ?HandleUsageFlags@flags_internal@absl@@YA?AW4HelpMode@12@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@@Z + ?HasBeenNotifiedInternal@Notification@absl@@CA_NPEBU?$atomic@_N@__Cr@std@@@Z + ?HasBeenRead@MaskedPointer@flags_internal@absl@@QEBA_NXZ + ?HasEdge@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z + ?HasNode@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@@Z + ?HasRandenHwAesImplementation@random_internal@absl@@YA_NXZ + ?HaveLeakSanitizer@absl@@YA_NXZ + ?Head@CordzInfo@cord_internal@absl@@SAPEAV123@AEBVCordzSnapshot@23@@Z + ?Help@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?HexStringToBytes@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?IDivDuration@absl@@YA_JVDuration@1@0PEAV21@@Z + ?In@Time@absl@@QEBA?AUBreakdown@12@VTimeZone@2@@Z + ?InMillisecondsFromNow@KernelTimeout@synchronization_internal@absl@@QEBAKXZ + ?InNanosecondsFromNow@KernelTimeout@synchronization_internal@absl@@AEBA_JXZ + ?IncrementSynchSem@Mutex@absl@@CAXPEAV12@PEAUPerThreadSynch@base_internal@2@@Z + ?Init@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCordRepBtree@23@@Z + ?Init@FlagImpl@flags_internal@absl@@AEAAXXZ + ?InitDiscreteDistribution@random_internal@absl@@YA?AV?$vector@U?$pair@N_K@__Cr@std@@V?$allocator@U?$pair@N_K@__Cr@std@@@23@@__Cr@std@@PEAV?$vector@NV?$allocator@N@__Cr@std@@@45@@Z + ?InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXAEBV123@@Z + ?InitSigSafeArena@base_internal@absl@@YAXXZ + ?InitTables@CRC32@crc_internal@absl@@UEAAXXZ + ?InitTree@ChunkIterator@Cord@absl@@AEAAXPEAUCordRep@cord_internal@3@@Z + ?InitWhat@BadStatusOrAccess@absl@@AEBAXXZ + ?Initialize@ExponentialBiased@profiling_internal@absl@@AEAAXXZ + ?InitializeCordRepExternal@cord_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAUCordRepExternal@12@@Z + ?InitializeEncodingAndFormat@LogMessageData@LogMessage@log_internal@absl@@QEAAXXZ + ?InitializeLog@absl@@YAXXZ + ?InitializeSymbolizer@absl@@YAXPEBD@Z + ?InsertEdge@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@0@Z + ?InstallFailureSignalHandler@absl@@YAXAEBUFailureSignalHandlerOptions@1@@Z + ?InternalAttemptToUseMutexInFatalSignalHandler@Mutex@absl@@SAXXZ + ?InternalCondVarPoke@StdcppWaiter@synchronization_internal@absl@@AEAAXXZ + ?InternalCondVarPoke@Win32Waiter@synchronization_internal@absl@@AEAAXXZ + ?InternalError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?InvalidArgumentError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?InvokeCallback@FlagImpl@flags_internal@absl@@QEBAXXZ + ?IsAborted@absl@@YA_NAEBVStatus@1@@Z + ?IsAlreadyExists@absl@@YA_NAEBVStatus@1@@Z + ?IsCancelled@absl@@YA_NAEBVStatus@1@@Z + ?IsCordBtreeExhaustiveValidationEnabled@cord_internal@absl@@YA_NXZ + ?IsDataLoss@absl@@YA_NAEBVStatus@1@@Z + ?IsDeadlineExceeded@absl@@YA_NAEBVStatus@1@@Z + ?IsFailedPrecondition@absl@@YA_NAEBVStatus@1@@Z + ?IsFatal@LogMessage@log_internal@absl@@AEBA_NXZ + ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_NPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_N_K0PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?IsHashtablezEnabled@container_internal@absl@@YA_NXZ + ?IsInitialized@log_internal@absl@@YA_NXZ + ?IsInternal@absl@@YA_NAEBVStatus@1@@Z + ?IsInvalidArgument@absl@@YA_NAEBVStatus@1@@Z + ?IsNotFound@absl@@YA_NAEBVStatus@1@@Z + ?IsOutOfRange@absl@@YA_NAEBVStatus@1@@Z + ?IsPermissionDenied@absl@@YA_NAEBVStatus@1@@Z + ?IsReachable@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z + ?IsResourceExhausted@absl@@YA_NAEBVStatus@1@@Z + ?IsRetired@CommandLineFlag@absl@@UEBA_NXZ + ?IsSpecifiedOnCommandLine@FlagImpl@flags_internal@absl@@EEBA_NXZ + ?IsSpecifiedOnCommandLine@PrivateHandleAccessor@flags_internal@absl@@SA_NAEBVCommandLineFlag@3@@Z + ?IsUnauthenticated@absl@@YA_NAEBVStatus@1@@Z + ?IsUnavailable@absl@@YA_NAEBVStatus@1@@Z + ?IsUnimplemented@absl@@YA_NAEBVStatus@1@@Z + ?IsUnknown@absl@@YA_NAEBVStatus@1@@Z + ?IsUnprotectedReadCandidate@MaskedPointer@flags_internal@absl@@QEBA_NXZ + ?IsValid@CordRepBtree@cord_internal@absl@@SA_NPEBV123@_N@Z + ?IterateOverFullSlots@container_internal@absl@@YAXAEBVCommonFields@12@_KV?$FunctionRef@$$A6AXPEBW4ctrl_t@container_internal@absl@@PEAX@Z@2@@Z + ?KeyFunction@LogSink@absl@@EEBAXXZ + ?LeakCheckerIsActive@absl@@YA_NXZ + ?LengthModToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LengthMod@2@@Z + ?LengthToTag@CordTestAccess@strings_internal@absl@@SAE_K@Z + ?Load@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?Load@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NPEAVZoneInfoSource@234@@Z + ?LoadTimeZone@Impl@time_zone@cctz@time_internal@absl@@SA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV2345@@Z + ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransition@234@@Z + ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransitionType@234@@Z + ?Lock@CordzInfo@cord_internal@absl@@QEAAXW4MethodIdentifier@CordzUpdateTracker@23@@Z + ?LockSlow@Mutex@absl@@AEAAXPEBUMuHowS@2@PEBVCondition@2@H@Z + ?LockSlowLoop@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@H@Z + ?LockSlowWithDeadline@Mutex@absl@@AEAA_NPEBUMuHowS@2@PEBVCondition@2@VKernelTimeout@synchronization_internal@2@H@Z + ?LockWhenCommon@Mutex@absl@@AEAA_NAEBVCondition@2@VKernelTimeout@synchronization_internal@2@_N@Z + ?LogBacktraceIfNeeded@LogMessage@log_internal@absl@@AEAAXXZ + ?LogFatalNodeType@cord_internal@absl@@YAXPEAUCordRep@12@@Z + ?LogToSinks@log_internal@absl@@YAXAEBVLogEntry@2@V?$Span@PEAVLogSink@absl@@@2@_N@Z + ?Make@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?Make@TimeZoneInfo@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?Make@TimeZoneLibC@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?MakeAbsNanos@KernelTimeout@synchronization_internal@absl@@QEBA_JXZ + ?MakeAbsTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ + ?MakeCheckFailString@status_internal@absl@@YAPEBDPEBVStatus@2@PEBD@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@C@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEBX@Z + ?MakeInitValue@FlagImpl@flags_internal@absl@@AEBA?AV?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@XZ + ?MakeRelativeTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ + ?MakeSeedSeq@absl@@YA?AV?$SaltedSeedSeq@Vseed_seq@__Cr@std@@@random_internal@1@XZ + ?MakeTime@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?MakeTime@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?MapToLocalCode@status_internal@absl@@YA?AW4StatusCode@2@H@Z + ?MarkAsRead@MaskedPointer@flags_internal@absl@@QEAAXXZ + ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@AEBA_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z + ?MaxFlatLength@CordTestAccess@strings_internal@absl@@SA_KXZ + ?MaxFramesInLogStackTrace@log_internal@absl@@YAHXZ + ?MaybeBecomeIdle@WaiterBase@synchronization_internal@absl@@KAXXZ + ?MaybeExit@flags_internal@absl@@YAXW4HelpMode@12@@Z + ?MaybeGetCrcCordState@Cord@absl@@AEBAPEBVCrcCordState@crc_internal@2@XZ + ?MaybeTrackCordImpl@CordzInfo@cord_internal@absl@@CAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?MemcpyCrc32c@absl@@YA?AVcrc32c_t@1@PEAXPEBX_KV21@@Z + ?MergeTrees@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@0@Z + ?MinLogLevel@absl@@YA?AW4LogSeverityAtLeast@1@XZ + ?MixIntoSeedMaterial@random_internal@absl@@YAXV?$Span@$$CBI@2@V?$Span@I@2@@Z + ?ModificationCount@FlagImpl@flags_internal@absl@@AEBA_JXZ + ?MovedFromString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBI@Z + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QEAAXI@Z + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QEAAX_K@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHPEBI@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXI@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAX_K@Z + ?MultiplyByFiveToTheNth@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?MultiplyByFiveToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?MultiplyByTenToTheNth@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?MultiplyByTenToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?MultiplyStep@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBIHH@Z + ?MultiplyStep@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHPEBIHH@Z + ?MutexDelay@synchronization_internal@absl@@YAHHH@Z + ?Name@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?New@CordRepCrc@cord_internal@absl@@SAPEAU123@PEAUCordRep@23@VCrcCordState@crc_internal@3@@Z + ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@I@Z + ?NewCRC32AcceleratedX86ARMCombinedAll@crc_internal@absl@@YA?AV?$vector@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@XZ + ?NewInternal@CRCImpl@crc_internal@absl@@SAPEAV123@XZ + ?NewString@CheckOpMessageBuilder@log_internal@absl@@QEAAPEBDXZ + ?Next@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z + ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z + ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?NextUp@CordRepBtreeNavigator@cord_internal@absl@@AEAAPEAUCordRep@23@XZ + ?NoPrefix@LogMessage@log_internal@absl@@QEAAAEAV123@XZ + ?NominalCPUFrequency@base_internal@absl@@YANXZ + ?Normalize@CrcCordState@crc_internal@absl@@QEAAXXZ + ?NormalizedPrefixCrcAtNthChunk@CrcCordState@crc_internal@absl@@QEBA?AUPrefixCrc@123@_K@Z + ?NotFoundError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Notify@Notification@absl@@QEAAXXZ + ?Now@CycleClock@base_internal@absl@@SA_JXZ + ?Now@absl@@YA?AVTime@1@XZ + ?NumCPUs@base_internal@absl@@YAHXZ + ?NumLeakedFlagValues@flags_internal@absl@@YA_KXZ + ?OnVLogVerbosityUpdate@log_internal@absl@@YAXV?$function@$$A6AXXZ@__Cr@std@@@Z + ?OneTimeInitThreadIdentity@synchronization_internal@absl@@YAXPEAUThreadIdentity@base_internal@2@@Z + ?OneWordValue@FlagImpl@flags_internal@absl@@AEBAAEAU?$atomic@_J@__Cr@std@@XZ + ?OutOfRangeError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ParseAbseilFlagsOnly@absl@@YAXHQEAPEADAEAV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@AEAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@34@@Z + ?ParseAbseilFlagsOnlyImpl@flags_internal@absl@@YA?AW4HelpMode@12@HQEAPEADAEAV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@AEAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@56@W4UsageFlagsAction@12@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCommandLine@absl@@YA?AV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@HQEAPEAD@Z + ?ParseCommandLineImpl@flags_internal@absl@@YA?AV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@HQEAPEADW4UsageFlagsAction@12@W4OnUndefinedFlag@12@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@45@@Z + ?ParseDigits@str_format_internal@absl@@YAHAEADAEAPEBDQEBD@Z + ?ParseDuration@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVDuration@1@@Z + ?ParseFlag@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVDuration@1@PEAV234@@Z + ?ParseFlag@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVTime@1@PEAV234@@Z + ?ParseFrom@CommandLineFlag@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?ParseFrom@FlagImpl@flags_internal@absl@@EEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4FlagSettingMode@23@W4ValueSource@23@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?ParseFrom@PrivateHandleAccessor@flags_internal@absl@@SA_NAEAVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4FlagSettingMode@23@W4ValueSource@23@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParsePosixSpec@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAUPosixTimeZone@123@@Z + ?ParseTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?ParseTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0VTimeZone@1@PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?PermissionDeniedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Poison@CrcCordState@crc_internal@absl@@QEAAXXZ + ?Poke@StdcppWaiter@synchronization_internal@absl@@QEAAXXZ + ?Poke@Win32Waiter@synchronization_internal@absl@@QEAAXXZ + ?Post@StdcppWaiter@synchronization_internal@absl@@QEAAXXZ + ?Post@Win32Waiter@synchronization_internal@absl@@QEAAXXZ + ?PrepareForSampling@HashtablezInfo@container_internal@absl@@QEAAX_J_K11G@Z + ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@_K$07$02@12@UFindInfo@12@@Z + ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@_K$07$02@12@UFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareInsertSmallNonSoo@container_internal@absl@@YA?AU?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@AEAVCommonFields@12@AEBUPolicyFunctions@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareToDie@LogMessage@log_internal@absl@@AEAAXXZ + ?PrepareToModify@Status@absl@@CAPEAVStatusRep@status_internal@2@_K@Z + ?Prepend@Cord@absl@@QEAAXAEBV12@@Z + ?Prepend@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?PrependArray@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?PrependPrecise@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?PrependSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z + ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependVModule@log_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?PrevTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z + ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?Print@Streamable@str_format_internal@absl@@QEBAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@@Z + ?PrintTo@absl@@YAXAEBVLogEntry@1@PEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ProgramUsageMessage@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Ptr@GraphCycles@synchronization_internal@absl@@QEAAPEAXUGraphId@23@@Z + ?PtrStorage@FlagImpl@flags_internal@absl@@AEBAAEAU?$atomic@VMaskedPointer@flags_internal@absl@@@__Cr@std@@XZ + ?PutPaddedString@FormatSinkImpl@str_format_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HH_N@Z + ?PutTwoDigits@numbers_internal@absl@@YAXIPEAD@Z + ?RawEnableLogPrefix@log_internal@absl@@YAX_N@Z + ?RawLog@raw_log_internal@absl@@YAXW4LogSeverity@2@PEBDH1ZZ + ?RawLoggingFullySupported@raw_log_internal@absl@@YA_NXZ + ?RawSetMinLogLevel@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z + ?RawSetStderrThreshold@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z + ?Read@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUReadResult@123@_K0@Z + ?Read@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K0AEAPEAUCordRep@23@@Z + ?Read@FlagImpl@flags_internal@absl@@UEBAXPEAX@Z + ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AEAAHPEBD0H@Z + ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAHPEBD0H@Z + ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z + ?ReadFloatMantissa@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z + ?ReadOneBool@FlagImpl@flags_internal@absl@@QEBA_NXZ + ?ReadOneWord@FlagImpl@flags_internal@absl@@QEBA_JXZ + ?ReadSeedMaterialFromOSEntropy@random_internal@absl@@YA_NV?$Span@I@2@@Z + ?ReadSequenceLockedData@FlagImpl@flags_internal@absl@@AEBAXPEAX@Z + ?ReaderTryLockSlow@Mutex@absl@@AEAA_NXZ + ?Rebuild@CordRepBtree@cord_internal@absl@@CAXPEAPEAV123@PEAV123@_N@Z + ?Rebuild@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@@Z + ?RecordClearedReservationSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?RecordEraseSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?RecordInsertSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K1@Z + ?RecordRehashSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K@Z + ?RecordReservationSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K@Z + ?RecordStorageChangedSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K1@Z + ?RefSharedEmptyRep@CrcCordState@crc_internal@absl@@CAPEAURefcountedRep@123@XZ + ?Register@CycleClockSource@base_internal@absl@@CAXP6A_JXZ@Z + ?RegisterAbortHook@raw_log_internal@absl@@YAXP6AXPEBDH000@Z@Z + ?RegisterAndInitialize@log_internal@absl@@YAHPEAVVLogSite@12@@Z + ?RegisterCommandLineFlag@flags_internal@absl@@YA_NAEAVCommandLineFlag@2@PEBD@Z + ?RegisterCondVarTracer@absl@@YAXP6AXPEBDPEBX@Z@Z + ?RegisterDebugStackTraceHook@debugging_internal@absl@@YAXP6AXQEBQEAXHP6AXPEBDPEAX@Z2@Z@Z + ?RegisterFlag@FlagRegistry@flags_internal@absl@@QEAAXAEAVCommandLineFlag@3@PEBD@Z + ?RegisterInternalLogFunction@raw_log_internal@absl@@YAXP6AXW4LogSeverity@2@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@Z + ?RegisterLivePointers@absl@@YAXPEBX_K@Z + ?RegisterLogFilterAndPrefixHook@raw_log_internal@absl@@YAXP6A_NW4LogSeverity@2@PEBDHPEAPEADPEAH@Z@Z + ?RegisterMutexProfiler@absl@@YAXP6AX_J@Z@Z + ?RegisterMutexTracer@absl@@YAXP6AXPEBDPEBX_J@Z@Z + ?RegisterSpinLockProfiler@base_internal@absl@@YAXP6AXPEBX_J@Z@Z + ?Rehash@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?Release@ReleasableMutexLock@absl@@QEAAXXZ + ?Remove@CondVar@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?RemoveCrc32cPrefix@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?RemoveCrc32cSuffix@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?RemoveEdge@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@0@Z + ?RemoveExtraAsciiWhitespace@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?RemoveLogSink@log_internal@absl@@YAXPEAVLogSink@2@@Z + ?RemoveNode@GraphCycles@synchronization_internal@absl@@QEAAXPEAX@Z + ?RemovePrefix@Cord@absl@@QEAAX_K@Z + ?RemoveSuffix@Cord@absl@@QEAAX_K@Z + ?RemoveSuffix@CordRepBtree@cord_internal@absl@@SAPEAUCordRep@23@PEAV123@_K@Z + ?ReportUnrecognizedFlags@absl@@YAXAEBV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@@Z + ?ReportUsageError@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_N@Z + ?ReserveEmptyNonAllocatedTableToFitBucketCount@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?ReserveTableToFitNewSize@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?ResetToBuiltinUTC@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z + ?ResizeAllocatedTableWithSeedChange@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?ResourceExhaustedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Restore@FlagState@flags_internal@absl@@EEHAAXXZ + ?RestoreState@FlagImpl@flags_internal@absl@@AEAA_NAEBVFlagState@23@@Z + ?Retire@flags_internal@absl@@YAXPEBDPEBXPEAE@Z + ?ReverseConsume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z + ?SafeToDelete@CordzHandle@cord_internal@absl@@QEBA_NXZ + ?SampleSlow@container_internal@absl@@YAPEAUHashtablezInfo@12@AEAUSamplingState@12@_K11G@Z + ?SaveState@FlagImpl@flags_internal@absl@@EEAA?AV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?SaveState@PrivateHandleAccessor@flags_internal@absl@@SA?AV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAVCommandLineFlag@3@@Z + ?Scramble@CRC32@crc_internal@absl@@UEBAXPEAI@Z + ?Seek@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?SendToLog@LogMessage@log_internal@absl@@AEAAXXZ + ?Set@MaskedPointer@flags_internal@absl@@QEAAXP6APEAXW4FlagOp@23@PEBXPEAX2@Z1_N@Z + ?SetAndroidNativeTag@absl@@YAXPEBD@Z + ?SetCallback@FlagImpl@flags_internal@absl@@QEAAXQ6AXXZ@Z + ?SetCordBtreeExhaustiveValidation@cord_internal@absl@@YAX_N@Z + ?SetCrcCordState@Cord@absl@@AEAAXVCrcCordState@crc_internal@2@@Z + ?SetCurrentThreadIdentity@base_internal@absl@@YAXPEAUThreadIdentity@12@P6AXPEAX@Z@Z + ?SetExitOnDFatal@log_internal@absl@@YAX_N@Z + ?SetExpectedChecksum@Cord@absl@@QEAAXI@Z + ?SetFailQuietly@LogMessage@log_internal@absl@@IEAAXXZ + ?SetFlagsHelpFormat@flags_internal@absl@@YAXW4HelpFormat@12@@Z + ?SetFlagsHelpMatchSubstr@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetFlagsHelpMode@flags_internal@absl@@YAXW4HelpMode@12@@Z + ?SetFlagsUsageConfig@absl@@YAXUFlagsUsageConfig@1@@Z + ?SetHashtablezConfigListener@container_internal@absl@@YAXP6AXXZ@Z + ?SetHashtablezEnabled@container_internal@absl@@YAX_N@Z + ?SetHashtablezEnabledInternal@container_internal@absl@@YAX_N@Z + ?SetHashtablezMaxSamples@container_internal@absl@@YAX_K@Z + ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAX_K@Z + ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z + ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z + ?SetInitialized@log_internal@absl@@YAXXZ + ?SetLogBacktraceLocation@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?SetLoggingGlobalsListener@log_internal@absl@@YAXP6AXXZ@Z + ?SetMaxFramesInLogStackTrace@log_internal@absl@@YAXH@Z + ?SetMinLogLevel@absl@@YAXW4LogSeverityAtLeast@1@@Z + ?SetMutexDeadlockDetectionMode@absl@@YAXW4OnDeadlockCycle@1@@Z + ?SetPayload@StatusRep@status_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VCord@3@@Z + ?SetProgramInvocationName@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetProgramUsageMessage@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetStackUnwinder@absl@@YAXP6AHPEAPEAXPEAHHHPEBX1@Z@Z + ?SetStatusPayloadPrinter@status_internal@absl@@YAXP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@AEBVCord@2@@Z@Z + ?SetStderrThreshold@absl@@YAXW4LogSeverityAtLeast@1@@Z + ?SetSuppressSigabortTrace@log_internal@absl@@YA_N_N@Z + ?SetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAXPEAU?$atomic@H@__Cr@std@@@Z + ?SetTimeZone@log_internal@absl@@YAXVTimeZone@2@@Z + ?SetToZero@?$BigUnsigned@$03@strings_internal@absl@@QEAAXXZ + ?SetToZero@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXXZ + ?SetVModuleListHeadForTestOnly@log_internal@absl@@YAPEAVVLogSite@12@PEAV312@@Z + ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?ShiftLeft@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?ShortProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ShouldFixUpStack@internal_stacktrace@absl@@YA_NXZ + ?ShouldLog@LogEveryNSecState@log_internal@absl@@QEAA_NN@Z + ?ShouldLog@LogEveryNState@log_internal@absl@@QEAA_NH@Z + ?ShouldLog@LogEveryPow2State@log_internal@absl@@QEAA_NXZ + ?ShouldLog@LogFirstNState@log_internal@absl@@QEAA_NH@Z + ?ShouldLogBacktraceAt@log_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?ShouldPrependLogPrefix@absl@@YA_NXZ + ?ShouldSymbolizeLogStackTrace@log_internal@absl@@YA_NXZ + ?SigSafeArena@base_internal@absl@@YAPEAUArena@LowLevelAlloc@12@XZ + ?Signal@CondVar@absl@@QEAAXXZ + ?SignalAll@CondVar@absl@@QEAAXXZ + ?SimpleAtob@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_N@Z + ?SimpleAtod@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAN@Z + ?SimpleAtof@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAM@Z + ?SixDigitsToBuffer@numbers_internal@absl@@YA_KNPEAD@Z + ?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SA_KXZ + ?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SA_KXZ + ?Skip@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUPosition@123@_K@Z + ?SlowIsEnabled0@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled1@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled2@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled3@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled4@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled5@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled@VLogSite@log_internal@absl@@AEAA_NHH@Z + ?SlowLock@SpinLock@base_internal@absl@@AEAAXXZ + ?SlowUnlock@SpinLock@base_internal@absl@@AEAAXI@Z + ?SnprintF@str_format_internal@absl@@YAHPEAD_KVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?SpinLockSuggestedDelayNS@base_internal@absl@@YAHH@Z + ?SpinLockWait@base_internal@absl@@YAIPEAU?$atomic@I@__Cr@std@@HQEBUSpinLockWaitTransition@12@W4SchedulingMode@12@@Z + ?SpinLoop@SpinLock@base_internal@absl@@AEAAIXZ + ?StackTraceWorksForTest@debugging_internal@absl@@YA_NXZ + ?StartsWithIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StatusCodeToString@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusCode@1@@Z + ?StatusMessageAsCStr@absl@@YAPEBDAEBVStatus@1@@Z + ?StderrThreshold@absl@@YA?AW4LogSeverityAtLeast@1@XZ + ?SteadyClockNow@KernelTimeout@synchronization_internal@absl@@CA_JXZ + ?StoreValue@FlagImpl@flags_internal@absl@@AEAAXPEBXW4ValueSource@23@@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@111@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@11@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@1@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@000@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@00@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@0@Z + ?StrContainsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StrContainsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?StrError@base_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?StrReplaceAll@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@4@@Z + ?StrReplaceAll@absl@@YAHV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@3@@Z + ?SubTree@CordRepBtree@cord_internal@absl@@QEAAPEAUCordRep@23@_K0@Z + ?Subcord@Cord@absl@@QEBA?AV12@_K0@Z + ?SubstituteAndAppendArray@substitute_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@PEBV645@_K@Z + ?Summarize@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?SupportsArmCRC32PMULL@crc_internal@absl@@YA_NXZ + ?SuppressSigabortTrace@log_internal@absl@@YA_NXZ + ?Symbolize@absl@@YA_NPEBXPEADH@Z + ?TestOnlyAddNodes@GraphCycles@synchronization_internal@absl@@QEAAXI@Z + ?TestOnlyRefreshSamplingStateForCurrentThread@container_internal@absl@@YAXXZ + ?ThreadIsLoggingToLogSink@log_internal@absl@@YA_NXZ + ?ThrowBadStatusOrAccess@internal_statusor@absl@@YAXVStatus@2@@Z + ?ThrowSeedGenException@random_internal@absl@@YAXXZ + ?ThrowStdBadAlloc@base_internal@absl@@YAXXZ + ?ThrowStdBadFunctionCall@base_internal@absl@@YAXXZ + ?ThrowStdDomainError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdDomainError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdInvalidArgument@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdInvalidArgument@base_internal@absl@@YAXPEBD@Z + ?ThrowStdLengthError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdLengthError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdLogicError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdLogicError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdOutOfRange@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdOutOfRange@base_internal@absl@@YAXPEBD@Z + ?ThrowStdOverflowError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdOverflowError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdRangeError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdRangeError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdRuntimeError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdRuntimeError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdUnderflowError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdUnderflowError@base_internal@absl@@YAXPEBD@Z + ?Tick@PerThreadSem@synchronization_internal@absl@@SAXPEAUThreadIdentity@base_internal@3@@Z + ?TimeFromTimespec@absl@@YA?AVTime@1@Utimespec@@@Z + ?TimeFromTimeval@absl@@YA?AVTime@1@Utimeval@@@Z + ?TimeLocal@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@_J@Z + ?TimeZone@log_internal@absl@@YAPEBV02@XZ + ?ToChronoDuration@KernelTimeout@synchronization_internal@absl@@QEBA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@XZ + ?ToChronoHours@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMicroseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMilliseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0DOI@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMinutes@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoNanoseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoSeconds@absl@@YA?AV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoTime@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@VTime@1@@Z + ?ToChronoTimePoint@KernelTimeout@synchronization_internal@absl@@QEBA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@XZ + ?ToDoubleHours@absl@@YANVDuration@1@@Z + ?ToDoubleMicroseconds@absl@@YANVDuration@1@@Z + ?ToDoubleMilliseconds@absl@@YANVDuration@1@@Z + ?ToDoubleMinutes@absl@@YANVDuration@1@@Z + ?ToDoubleNanoseconds@absl@@YANVDuration@1@@Z + ?ToDoubleSeconds@absl@@YANVDuration@1@@Z + ?ToSinkAlso@LogMessage@log_internal@absl@@QEAAAEAV123@PEAVLogSink@3@@Z + ?ToSinkOnly@LogMessage@log_internal@absl@@QEAAAEAV123@PEAVLogSink@3@@Z + ?ToString@?$BigUnsigned@$03@strings_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@Status@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusToStringMode@2@@Z + ?ToString@StatusRep@status_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusToStringMode@3@@Z + ?ToString@int128@absl@@AEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@uint128@absl@@AEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToStringSlow@Status@absl@@CA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KW4StatusToStringMode@2@@Z + ?ToTM@absl@@YA?AUtm@@VTime@1@VTimeZone@1@@Z + ?ToTimeT@absl@@YA_JVTime@1@@Z + ?ToTimespec@absl@@YA?AUtimespec@@VDuration@1@@Z + ?ToTimespec@absl@@YA?AUtimespec@@VTime@1@@Z + ?ToTimeval@absl@@YA?AUtimeval@@VDuration@1@@Z + ?ToTimeval@absl@@YA?AUtimeval@@VTime@1@@Z + ?ToUDate@absl@@YANVTime@1@@Z + ?ToUniversal@absl@@YA_JVTime@1@@Z + ?ToUnixMicros@absl@@YA_JVTime@1@@Z + ?ToUnixMillis@absl@@YA_JVTime@1@@Z + ?ToUnixNanos@absl@@YA_JVTime@1@@Z + ?ToUnixSeconds@absl@@YA_JVTime@1@@Z + ?Track@CordzInfo@cord_internal@absl@@AEAAXXZ + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@W4MethodIdentifier@CordzUpdateTracker@23@_J@Z + ?Trans@Mutex@absl@@AEAAXPEBUMuHowS@2@@Z + ?Trunc@absl@@YA?AVDuration@1@V21@0@Z + ?TryLockSlow@Mutex@absl@@AEAA_NXZ + ?TryNewCRC32AcceleratedX86ARMCombined@crc_internal@absl@@YAPEAVCRCImpl@12@XZ + ?TryParse@FlagImpl@flags_internal@absl@@AEBA?AV?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?TryRead@SequenceLock@flags_internal@absl@@QEBA_NPEAXPEBU?$atomic@_K@__Cr@std@@_K@Z + ?TryRemove@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?TypeId@FlagImpl@flags_internal@absl@@EEBAPEBXXZ + ?TypeId@PrivateHandleAccessor@flags_internal@absl@@SAPEBXAEBVCommandLineFlag@3@@Z + ?TypeName@CommandLineFlag@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?TypeName@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?TypeName@PrivateHandleAccessor@flags_internal@absl@@SA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCommandLineFlag@3@@Z + ?UTC@Impl@time_zone@cctz@time_internal@absl@@SA?AV2345@XZ + ?UTC@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?UTC@TimeZoneInfo@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?UTCImpl@Impl@time_zone@cctz@time_internal@absl@@CAPEBV12345@XZ + ?UnRegisterLivePointers@absl@@YAXPEBX_K@Z + ?UnauthenticatedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnavailableError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnextendByZeroes@CRC32@crc_internal@absl@@UEBAXPEAI_K@Z + ?UnextendCrc32cByZeroes@crc_internal@absl@@YA?AVcrc32c_t@2@V32@_K@Z + ?UnimplementedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnknownError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Unlock@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UnlockSlow@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@F@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@G@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@M@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@Vint128@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@Vuint128@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_N@Z + ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?Unref@StatusRep@status_internal@absl@@QEBAXXZ + ?UnrefTree@InlineRep@Cord@absl@@AEAAXXZ + ?UnsampleSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?Unscramble@CRC32@crc_internal@absl@@UEBAXPEAI@Z + ?Untrack@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UpdateGlobalVLogLevel@log_internal@absl@@YAHH@Z + ?UpdateStackTrace@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@HP6AHPEAPEAXH@Z@Z + ?UpdateVLogSites@log_internal@absl@@YAXXZ + ?UpdateVModule@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Utf8SafeCEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?Utf8SafeCHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?VLogLevel@log_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ValidateInputValue@FlagImpl@flags_internal@absl@@EEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ValidateInputValue@PrivateHandleAccessor@flags_internal@absl@@SA_NAEBVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Version@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@ZoneInfoSource@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Wait@BlockingCounter@absl@@QEAAXXZ + ?Wait@StdcppWaiter@synchronization_internal@absl@@QEAA_NVKernelTimeout@23@@Z + ?Wait@Win32Waiter@synchronization_internal@absl@@QEAA_NVKernelTimeout@23@@Z + ?WaitCommon@CondVar@absl@@AEAA_NPEAVMutex@2@VKernelTimeout@synchronization_internal@2@@Z + ?WaitForNotification@Notification@absl@@QEBAXXZ + ?WaitForNotificationWithDeadline@Notification@absl@@QEBA_NVTime@2@@Z + ?WaitForNotificationWithTimeout@Notification@absl@@QEBA_NVDuration@2@@Z + ?Wakeup@Mutex@absl@@AEAAPEAUPerThreadSynch@base_internal@2@PEAU342@@Z + ?WasPresentOnCommandLine@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?WebSafeBase64Escape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?WebSafeBase64Escape@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?WebSafeBase64Unescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?WideToUtf8@strings_internal@absl@@YA_K_WPEADAEAUShiftState@12@@Z + ?WithMetadataFrom@LogMessage@log_internal@absl@@QEAAAEAV123@AEBVLogEntry@3@@Z + ?WithPerror@LogMessage@log_internal@absl@@QEAAAEAV123@XZ + ?WithThreadID@LogMessage@log_internal@absl@@QEAAAEAV123@I@Z + ?WithTimestamp@LogMessage@log_internal@absl@@QEAAAEAV123@VTime@3@@Z + ?WithVerbosity@LogMessage@log_internal@absl@@QEAAAEAV123@H@Z + ?Write@BufferRawSink@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@FILERawSink@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@FlagImpl@flags_internal@absl@@QEAAXPEBX@Z + ?WriteToStderr@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4LogSeverity@2@@Z + ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ + ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ + ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__erase_to_end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z + ?__throw_length_error@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@CAXXZ + ?cycle_clock_source_@CycleClock@base_internal@absl@@0U?$atomic@P6A_JXZ@__Cr@std@@A + ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z + ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?effective_impl@time_zone@cctz@time_internal@absl@@AEBAAEBVImpl@1234@XZ + ?engines@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PEIAXPEIBX_KV54@_N@Z@4UArchSpecificEngines@234@B + ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z + ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV567@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@AEBV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@967@AEBVtime_zone@234@@Z + ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEAMW4chars_format@1@@Z + ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEANW4chars_format@1@@Z + ?get_cordz_mean_interval@cord_internal@absl@@YAHXZ + ?get_weekday@detail@cctz@time_internal@absl@@YA?AW4weekday@1234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@@Z + ?kDefaultIterControl@container_internal@absl@@3W4ctrl_t@12@A + ?load_time_zone@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVtime_zone@123@@Z + ?local_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?lock@Mutex@absl@@QEAAXXZ + ?lock_shared@Mutex@absl@@QEAAXXZ + ?lookup@time_zone@cctz@time_internal@absl@@QEBA?AUabsolute_lookup@1234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?lookup@time_zone@cctz@time_internal@absl@@QEBA?AUcivil_lookup@1234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?max@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ + ?memcasecmp@strings_internal@absl@@YAHPEBD0_K@Z + ?mutable_rep@CrcCordState@crc_internal@absl@@QEAAPEAURep@123@XZ + ?n_day@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_JC00CCC@Z + ?n_sec@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J00000@Z + ?name@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?next_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@1234@@Z + ?next_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z + ?overflow@Streambuf@OStringStream@strings_internal@absl@@MEAAHH@Z + ?parse@detail@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0AEBVtime_zone@234@PEAV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@PEAV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@chrono@67@PEAV567@@Z + ?prev_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@1234@@Z + ?prev_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z + ?reserve@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?resize@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?resize@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?safe_strto128_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVint128@2@H@Z + ?safe_strto16_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAFH@Z + ?safe_strto32_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHH@Z + ?safe_strto64_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_JH@Z + ?safe_strto8_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEACH@Z + ?safe_strtou128_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVuint128@2@H@Z + ?safe_strtou16_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAGH@Z + ?safe_strtou32_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAIH@Z + ?safe_strtou64_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_KH@Z + ?safe_strtou8_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAEH@Z + ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z + ?shallow_subcords_enabled@cord_internal@absl@@3U?$atomic@_N@__Cr@std@@A + ?should_rehash_for_bug_detection_on_insert@CommonFieldsGenerationInfoEnabled@container_internal@absl@@QEBA_N_K@Z + ?should_rehash_for_bug_detection_on_move@CommonFieldsGenerationInfoEnabled@container_internal@absl@@QEBA_N_K@Z + ?shrink_to_fit@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?size@?$BigUnsigned@$03@strings_internal@absl@@QEBAHXZ + ?size@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAHXZ + ?size@Cord@absl@@QEBA_KXZ + ?status@BadStatusOrAccess@absl@@QEBAAEBVStatus@2@XZ + ?stream@OstreamView@LogMessage@log_internal@absl@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?transfer_unprobed_elements_to_next_capacity_fn@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CAXAEAVCommonFields@23@PEBW4ctrl_t@23@PEAX2P6AX2E_K3@Z@Z + ?try_lock@Mutex@absl@@QEAA_NXZ + ?try_lock_shared@Mutex@absl@@QEAA_NXZ + ?unlock@Mutex@absl@@QEAAXXZ + ?unlock_shared@Mutex@absl@@QEAAXXZ + ?utc_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?version@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?what@BadStatusOrAccess@absl@@UEBAPEBDXZ + ?what@SeedGenException@absl@@UEBAPEBDXZ + ?words@?$BigUnsigned@$03@strings_internal@absl@@QEBAPEBIXZ + ?words@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAPEBIXZ + ?xsputn@Streambuf@OStringStream@strings_internal@absl@@MEAA_JPEBD_J@Z + AbslContainerInternalSampleEverything + AbslInternalMutexYield + AbslInternalOnFatalLogMessage + AbslInternalPerThreadSemInit + AbslInternalPerThreadSemPoke + AbslInternalPerThreadSemPost + AbslInternalPerThreadSemWait + AbslInternalReportFatalUsageError + AbslInternalSleepFor + AbslInternalSpinLockDelay + AbslInternalSpinLockWake + AbslInternalTraceContinue + AbslInternalTraceObserved + AbslInternalTraceSignal + AbslInternalTraceWait diff --git a/naiveproxy/src/third_party/abseil-cpp/symbols_x64_dbg.def b/naiveproxy/src/third_party/abseil-cpp/symbols_x64_dbg.def index 80e31368a9..8144c38c1e 100644 --- a/naiveproxy/src/third_party/abseil-cpp/symbols_x64_dbg.def +++ b/naiveproxy/src/third_party/abseil-cpp/symbols_x64_dbg.def @@ -18,6 +18,7 @@ EXPORTS ??$?0$$T@?$Storage@PEAPEAUCordRep@cord_internal@absl@@$00U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEA$$T@Z ??$?0$$T@?$Storage@PEAPEAVLogSink@absl@@$00U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@internal_compressed_tuple@container_internal@2@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEA$$T@Z ??$?0$$T@?$Storage@PEAUPayload@status_internal@absl@@$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEA$$T@Z + ??$?0$$V$0A@@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAA@XZ ??$?0$$V$0A@@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAA@XZ ??$?0$$V$0A@@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAA@XZ ??$?0$$V$0A@@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEAA@XZ @@ -25,12 +26,14 @@ EXPORTS ??$?0$$V$0A@@?$NoDestructor@VMutex@absl@@@absl@@QEAA@XZ ??$?0$$V@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z ??$?0$$V@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??$?0$$V@PlacementImpl@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAA@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAA@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAA@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEAA@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAA@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@VMutex@absl@@@absl@@QEAA@XZ ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@QEAA@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@QEAA@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@45@@Z ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AEBQEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@AEBQEAVCommandLineFlag@absl@@@Z ??$?0$00X@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ ??$?0$00X@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ @@ -72,7 +75,10 @@ EXPORTS ??$?0AEAPEAVCommandLineFlag@absl@@AEA_N@?$__tuple_impl@U?$__integer_sequence@_K$0A@$00@__Cr@std@@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@QEAA@U__forward_args@12@AEAPEAVCommandLineFlag@absl@@AEA_N@Z ??$?0AEAPEAVCommandLineFlag@absl@@AEA_N@?$__tuple_impl@U?$__integer_sequence@_K$0A@$00@__Cr@std@@PEAVCommandLineFlag@absl@@_N@__Cr@std@@QEAA@U__forward_args@12@AEAPEAVCommandLineFlag@absl@@AEA_N@Z ??$?0AEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU0123@$0A@@?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@QEAA@AEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAU3456@@Z + ??$?0AEAUFindInfo@container_internal@absl@@$0A@@?$__tuple_leaf@$0A@AEAUFindInfo@container_internal@absl@@$0A@@__Cr@std@@QEAA@AEAUFindInfo@container_internal@absl@@@Z + ??$?0AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@12@@?$__tuple_impl@U?$__integer_sequence@_K$0A@$00@__Cr@std@@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@56@@__Cr@std@@QEAA@U__forward_args@12@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@56@@Z ??$?0AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV234@@Z@@?$__temp_value@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@AEBV678@@Z@@Z + ??$?0AEAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@$0A@@?$__tuple_leaf@$00AEAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@$0A@@__Cr@std@@QEAA@AEAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@@Z ??$?0AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@$0A@@?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@QEAA@AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$$T$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@container_internal@absl@@QEAA@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$$QEA$$T@Z ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@56@$$QEA$$T@Z @@ -139,7 +145,9 @@ EXPORTS ??$?0PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU0123@$0A@@?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@@__Cr@std@@QEAA@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z ??$?0PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@$0A@@?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@QEAA@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z ??$?0PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QEAA@PEBVFormatArgImpl@str_format_internal@1@0AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@Z - ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@X@?$FunctionRef@$$A6A_K_K@Z@absl@@QEAA@AEBU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@@?$FunctionRef@$$A6A_K_K@Z@absl@@IEAA@Uin_place_t@__Cr@std@@$$QEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@X@?$FunctionRef@$$A6A_K_K@Z@absl@@QEAA@$$QEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$__check_pair_construction@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@$0A@@?$pair@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@QEAA@AEBUFindInfo@container_internal@absl@@AEBV?$NonIterableBitMask@G$0BA@$0A@@45@@Z ??$?0U?$array@D$0DKJI@@__Cr@std@@XU012@H@?$Span@D@absl@@QEAA@AEAU?$array@D$0DKJI@@__Cr@std@@@Z ??$?0UHex@absl@@X@AlphaNum@absl@@QEAA@AEBUHex@1@$$QEAVStringifySink@strings_internal@1@@Z ??$?0UStringEq@container_internal@absl@@@?$Storage@UStringEq@container_internal@absl@@$01U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAUStringEq@23@@Z @@ -206,9 +214,13 @@ EXPORTS ??$?0V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@?$Storage@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@PEAVLogSink@absl@@@56@@Z ??$?0V?$allocator@PEAVLogSink@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@$$QEAI@Z ??$?0V?$allocator@PEAVLogSink@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@PEAVLogSink@absl@@@56@$$QEAI@Z + ??$?0V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@QEAA@_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@AEBQEBUCordRep@cord_internal@absl@@@Z + ??$?0V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@QEAA@_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@UPayload@status_internal@absl@@@56@@Z ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$QEAI@Z ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@UPayload@status_internal@absl@@@56@$$QEAI@Z + ??$?0V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$?0V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$?0V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z @@ -229,10 +241,12 @@ EXPORTS ??$?0VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@12@@Z ??$?0VTimeZoneLibC@cctz@time_internal@absl@@$0A@@?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@QEAA@AEBU?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@12@@Z ??$?0VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@12@@Z + ??$?0Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEA_N$0A@@?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@QEAA@$$QEAViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEA_N@Z ??$?0Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N$0A@@?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@QEAA@$$QEAViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@$$QEA_N@Z ??$?0_J@FlagState@flags_internal@absl@@QEAA@AEAVFlagImpl@12@AEB_J_N2_J@Z ??$?0_J@FormatArgImpl@str_format_internal@absl@@QEAA@AEB_J@Z ??$?4PEAVCommandLineFlag@absl@@_N$0A@@?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@QEAAAEAV012@$$QEAV?$tuple@PEAVCommandLineFlag@absl@@_N@12@@Z + ??$?4UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@12@$0A@@?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@QEAAAEAV012@$$QEAU?$pair@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@23@@12@@Z ??$?6$01@LogMessage@log_internal@absl@@QEAAAEAV012@AEAY01$$CBD@Z ??$?6$02@LogMessage@log_internal@absl@@QEAAAEAV012@AEAY02$$CBD@Z ??$?6$0P@@LogMessage@log_internal@absl@@QEAAAEAV012@AEAY0P@$$CBD@Z @@ -585,7 +599,7 @@ EXPORTS ??$InvokeFlush@VBufferRawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPEAVBufferRawSink@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$InvokeFlush@VFILERawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPEAVFILERawSink@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$InvokeGet@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@@FlagImplPeer@flags_internal@absl@@SA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@12@@Z - ??$InvokeObject@U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z + ??$InvokeObject@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z ??$InvokeParseFlag@H@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z ??$InvokeParseFlag@M@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAMPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z ??$InvokeParseFlag@N@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEANPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z @@ -741,6 +755,20 @@ EXPORTS ??$StrSplit@VByAnyChar@absl@@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@@Z ??$StrSplit@VByAnyChar@absl@@USkipEmpty@2@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@USkipEmpty@0@@Z ??$StreamFormat@I@absl@@YA?AVStreamable@str_format_internal@0@AEBV?$FormatSpecTemplate@$0JPPPL@@20@AEBI@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@H@strings_internal@0@YA?AV123@H@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@I@strings_internal@0@YA?AV123@I@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@J@strings_internal@0@YA?AV123@J@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@K@strings_internal@0@YA?AV123@K@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_J@strings_internal@0@YA?AV123@_J@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_K@strings_internal@0@YA?AV123@1@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@0@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@2V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@50@@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@H@01@YA?AV234@H@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@I@01@YA?AV234@I@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@J@01@YA?AV234@J@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@K@01@YA?AV234@K@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_J@01@YA?AV234@_J@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_K@01@YA?AV234@1@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@01@YA?AV234@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@2V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z@@Z ??$ToChronoDuration@V?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z ??$ToChronoDuration@V?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z @@ -808,19 +836,19 @@ EXPORTS ??$__advance@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@_JUrandom_access_iterator_tag@01@@Z ??$__advance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@_JUrandom_access_iterator_tag@01@@Z ??$__advance@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@_JUrandom_access_iterator_tag@01@@Z - ??$__allocate_at_least@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAVCommandLineFlag@absl@@@01@AEAV?$allocator@PEAVCommandLineFlag@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAVCordzHandle@cord_internal@absl@@@01@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAVLogSink@absl@@@01@AEAV?$allocator@PEAVLogSink@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAPEBVCommandLineFlag@absl@@@01@AEAV?$allocator@PEBVCommandLineFlag@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAPEBVCordzHandle@cord_internal@absl@@@01@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUTransition@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUUnrecognizedFlag@absl@@@01@AEAV?$allocator@UUnrecognizedFlag@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@@01@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@_K@Z - ??$__allocate_at_least@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@01@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@01@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAVCommandLineFlag@absl@@_K@01@AEAV?$allocator@PEAVCommandLineFlag@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAVCordzHandle@cord_internal@absl@@_K@01@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAPEAVLogSink@absl@@_K@01@AEAV?$allocator@PEAVLogSink@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAPEBVCommandLineFlag@absl@@_K@01@AEAV?$allocator@PEBVCommandLineFlag@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAPEBVCordzHandle@cord_internal@absl@@_K@01@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@01@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAUTransition@cctz@time_internal@absl@@_K@01@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@_K@01@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAUUnrecognizedFlag@absl@@_K@01@AEAV?$allocator@UUnrecognizedFlag@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@_K@01@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@U?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@_K@01@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@_K@Z ??$__allocator_destroy@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@PEAU45@@__Cr@std@@YAXAEAV?$allocator@UUnrecognizedFlag@absl@@@01@PEAUUnrecognizedFlag@absl@@1@Z ??$__annotate_contiguous_container@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z ??$__annotate_contiguous_container@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z @@ -835,13 +863,14 @@ EXPORTS ??$__annotate_contiguous_container@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z ??$__annotate_double_ended_contiguous_container@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX00000@Z ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z + ??$__as_transparent@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@01@AEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@01@@Z + ??$__as_transparent@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@01@AEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@01@@Z ??$__as_variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@YAAEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@01@AEAV201@@Z ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z ??$__at@P6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03$$V@__base@__visitation@__variant_detail@__Cr@std@@CA$$QEA_PAEBU?$__farray@P6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03@34@_K@Z ??$__at@P6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z@__base@__visitation@__variant_detail@__Cr@std@@CAAEBQ6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@1234@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@ZAEBQ6A_K01@Z@Z ??$__call@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@?$__invoke_void_return_wrapper@X$00@__Cr@std@@SAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@7@@Z ??$__call_func@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@CAXPEBT__policy_storage@123@AEAVCommandLineFlag@absl@@@Z - ??$__choose_policy@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@__policy@__function@__Cr@std@@CAPEBU0123@U?$integral_constant@_N$00@23@@Z ??$__constexpr_memmove@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0W4__element_count@01@@Z ??$__constexpr_memmove@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@0W4__element_count@01@@Z ??$__constexpr_memmove@PEAVLogSink@absl@@PEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0W4__element_count@01@@Z @@ -863,8 +892,8 @@ EXPORTS ??$__construct_at@PEBVCommandLineFlag@absl@@PEBV12@PEAPEBV12@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@$$QEAPEBV23@@Z ??$__construct_at@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@PEAPEBV123@@__Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@AEBQEBV234@@Z ??$__construct_at@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@PEAPEBV12345@@__Cr@std@@YAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV23456@AEBQEBV23456@@Z - ??$__construct_at@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@$$TAEA_KPEAU123@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@$$QEA$$TAEA_K@Z - ??$__construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@$$TAEA_KPEAU123@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@$$QEA$$TAEA_K@Z + ??$__construct_at@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@AEBQEBUCordRep@cord_internal@absl@@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@AEBQEBUCordRep@cord_internal@absl@@@Z + ??$__construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z @@ -885,23 +914,25 @@ EXPORTS ??$__construct_at@UUnrecognizedFlag@absl@@U12@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAU23@@Z ??$__construct_at@UUnrecognizedFlag@absl@@W4Source@12@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAW4Source@23@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z ??$__construct_at@UViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@AEA_KPEAU123@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV501@AEA_K@Z + ??$__construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$__construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$__construct_at@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@PEAV123@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@PEAV201@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV567@@Z@@Z ??$__construct_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@PEAV123@@__Cr@std@@YAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PEAV201@$$QEAV201@@Z ??$__construct_at@VFormatArgImpl@str_format_internal@absl@@AEBV123@PEAV123@@__Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@AEBV234@@Z ??$__construct_at_end@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@0_K@Z - ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z - ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z - ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z - ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z - ??$__construct_at_end_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@?$__split_buffer@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_node@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__construct_node@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__construct_node_hash@AEBQEBUCordRep@cord_internal@absl@@$$V@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBQEBUCordRep@cord_internal@absl@@@Z - ??$__construct_node_hash@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@?$__split_buffer@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z + ??$__construct_node@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__construct_node@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__construct_node_hash@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBQEBUCordRep@cord_internal@absl@@@Z + ??$__construct_node_hash@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$__copy@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@PEAU1234@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0PEAU3456@@Z ??$__copy@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z ??$__copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z @@ -981,18 +1012,18 @@ EXPORTS ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$01@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$02@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$0A@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z - ??$__distance@PEBUPayload@status_internal@absl@@@__Cr@std@@YA_JPEBUPayload@status_internal@absl@@0Urandom_access_iterator_tag@01@@Z - ??$__distance@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0Urandom_access_iterator_tag@01@@Z - ??$__distance@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@__Cr@std@@YA_JV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z + ??$__distance@PEBUPayload@status_internal@absl@@$0A@@__Cr@std@@YA_JPEBUPayload@status_internal@absl@@0@Z + ??$__distance@PEBUTransition@cctz@time_internal@absl@@$0A@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0@Z + ??$__distance@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0@Z + ??$__distance@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@0@Z + ??$__distance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@0@Z + ??$__distance@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@0@Z + ??$__distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z ??$__do_rehash@$00@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAX_K@Z - ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z + ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z ??$__emplace_back_assume_capacity@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ ??$__emplace_back_assume_capacity@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ ??$__emplace_back_assume_capacity@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV312@AEA_K@Z @@ -1020,14 +1051,13 @@ EXPORTS ??$__emplace_back_slow_path@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QEAV312@@Z ??$__emplace_back_slow_path@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@$$QEAW4Source@34@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z ??$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBQEBUCordRep@cord_internal@absl@@@Z - ??$__emplace_unique_extract_key@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBQEBUCordRep@cord_internal@absl@@U__extract_key_self_tag@12@@Z - ??$__emplace_unique_key_args@PEBUCordRep@cord_internal@absl@@AEBQEBU123@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBQEBUCordRep@cord_internal@absl@@0@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__find@PEAPEAVLogSink@absl@@PEAPEAV12@PEAV12@U__identity@__Cr@std@@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0AEBQEAV23@AEAU__identity@01@@Z - ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAPEAV?$__tree_node_base@PEAX@12@AEAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z - ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAPEAV?$__tree_node_base@PEAX@12@AEAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__find@PEAVLogSink@absl@@PEAV12@U__identity@__Cr@std@@$0A@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0AEBQEAV23@AEAU__identity@01@@Z + ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@__Cr@std@@AEAPEAV?$__tree_node_base@PEAX@23@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@__Cr@std@@AEAPEAV?$__tree_node_base@PEAX@23@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__find_loop@PEAPEAVLogSink@absl@@PEAPEAV12@PEAV12@U__identity@__Cr@std@@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0AEBQEAV23@AEAU__identity@01@@Z ??$__for_each_segment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@23@@__Cr@std@@YAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@01@@Z ??$__get_alt@$00AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z ??$__get_alt@$01AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z @@ -1042,18 +1072,30 @@ EXPORTS ??$__get_alt@AEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$01@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$01@34@@Z ??$__get_alt@AEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$02@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$02@34@@Z ??$__get_alt@AEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$0A@@34@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@AEBV834@AEA_K@Z@V@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@234@QEAAAEAU567@012@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@01@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV701@AEA_K@Z@V@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@301@QEAAAEAU456@123@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV56@@Z@V@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@234@QEAAAEAPEAV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@01@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@V@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@301@QEAAAEAPEAV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV567@@Z@V@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@234@QEAAAEAPEAV567@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@01@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@V@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@301@QEAAAEAPEAV456@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV56@@Z@V@?0???$emplace_back@AEBQEAVLogSink@absl@@@234@QEAAAEAPEAV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@01@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@V@?0???$emplace_back@AEBQEAVLogSink@absl@@@301@QEAAAEAPEAV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV56@@Z@V@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@234@QEAAAEAPEBV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@01@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@V@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@301@QEAAAEAPEBV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV567@@Z@V@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@234@QEAAAEAPEBV567@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@01@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@V@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@301@QEAAAEAPEBV456@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU5678@@Z@V@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@234@QEAAAEAU5678@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@01@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@V@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@301@QEAAAEAU4567@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU56@@Z@V@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@234@QEAAAEAU56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@QEAAAEAUUnrecognizedFlag@absl@@AEBU45@@Z@V@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@301@QEAAAEAU45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV56@@Z@V@?0???$emplace_back@PEBVCommandLineFlag@absl@@@234@QEAAAEAPEBV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@01@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@V@?0???$emplace_back@PEBVCommandLineFlag@absl@@@301@QEAAAEAPEBV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU5678@@Z@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@234@QEAAAEAU5678@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@01@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@301@QEAAAEAU4567@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@34@$$QEAV534@@Z@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@234@QEAAAEAV534@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@01@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@$$QEAV401@@Z@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@301@QEAAAEAV401@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@56@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@234@QEAAAEAU56@01@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@301@QEAAAEAU45@12@Z@@Z ??$__in_bounds@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@$0A@@__unique_ptr_array_bounds_stateless@__Cr@std@@QEBA_NPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@_K@Z ??$__in_bounds@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@$0A@@__unique_ptr_array_bounds_stateless@__Cr@std@@QEBA_NPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@_K@Z ??$__insert_assign_n_unchecked@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@_JPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z ??$__insert_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@1_J@Z + ??$__invoke@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K@__Cr@std@@YA_KAEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QEA_K@Z ??$__invoke@AEAUByCivilTime@Transition@cctz@time_internal@absl@@AEBU2345@AEBU2345@@__Cr@std@@YA_NAEAUByCivilTime@Transition@cctz@time_internal@absl@@AEBU3456@1@Z ??$__invoke@AEAUByUnixTime@Transition@cctz@time_internal@absl@@AEBU2345@AEBU2345@@__Cr@std@@YA_NAEAUByUnixTime@Transition@cctz@time_internal@absl@@AEBU3456@1@Z ??$__invoke@AEAU__identity@__Cr@std@@AEAPEAVLogSink@absl@@@__Cr@std@@YAAEAPEAVLogSink@absl@@AEAU__identity@01@AEAPEAV23@@Z ??$__invoke@AEAU__identity@__Cr@std@@AEAPEBVCommandLineFlag@absl@@@__Cr@std@@YAAEAPEBVCommandLineFlag@absl@@AEAU__identity@01@AEAPEBV23@@Z ??$__invoke@AEAU__identity@__Cr@std@@AEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAAEBUTransition@cctz@time_internal@absl@@AEAU__identity@01@AEBU2345@@Z ??$__invoke@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@__Cr@std@@YAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@6@@Z - ??$__invoke@AEBU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K@__Cr@std@@YA_KAEBU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QEA_K@Z - ??$__invoke@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@$$VX@__Cr@std@@YAX$$QEAP8FlagImpl@flags_internal@absl@@EAAXXZ$$QEAPEAV234@@Z + ??$__invoke@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@__Cr@std@@YAX$$QEAP8FlagImpl@flags_internal@absl@@EAAXXZ$$QEAPEAV234@@Z ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@456@@__Cr@std@@YA_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AEAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@501@@Z ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAU?$__alt@$01V?$Span@$$CBD@absl@@@456@@__Cr@std@@YA_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AEAU?$__alt@$01V?$Span@$$CBD@absl@@@501@@Z ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAU?$__alt@$02V?$variant@IHM@__Cr@std@@@456@@__Cr@std@@YA_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AEAU?$__alt@$02V?$variant@IHM@__Cr@std@@@501@@Z @@ -1063,8 +1105,11 @@ EXPORTS ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@_K_JIH_N@__Cr@std@@@__Cr@std@@YA_K$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@45@@Z@AEAV?$variant@_K_JIH_N@01@@Z ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@_K_JN@__Cr@std@@@__Cr@std@@YA_K$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@45@@Z@AEAV?$variant@_K_JN@01@@Z ??$__invoke_r@XAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@__Cr@std@@YAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@6@@Z + ??$__is_null@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@__function@__Cr@std@@YA_NAEBV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@Z ??$__iter_move@AEAPEAPEAVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEAVCommandLineFlag@absl@@AEAPEAPEAV34@@Z ??$__iter_move@AEAPEAPEBVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEBVCommandLineFlag@absl@@AEAPEAPEBV34@@Z + ??$__iter_move@PEAPEAVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEAVCommandLineFlag@absl@@$$QEAPEAPEAV34@@Z + ??$__iter_move@PEAPEBVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEBVCommandLineFlag@absl@@$$QEAPEAPEBV34@@Z ??$__libcpp_allocate@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@_K@Z ??$__libcpp_allocate@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@W4__element_count@01@_K@Z ??$__libcpp_allocate@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@W4__element_count@01@_K@Z @@ -1119,6 +1164,7 @@ EXPORTS ??$__libcpp_deallocate@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAXPEAVFormatArgImpl@str_format_internal@absl@@W4__element_count@01@_K@Z ??$__lower_bound@U_ClassicAlgPolicy@__Cr@std@@PEBUTransition@cctz@time_internal@absl@@PEBU4567@U4567@U__identity@23@UByUnixTime@4567@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@AEAUByUnixTime@2345@AEAU__identity@01@@Z ??$__lower_bound_bisecting@U_ClassicAlgPolicy@__Cr@std@@PEBUTransition@cctz@time_internal@absl@@U4567@U__identity@23@UByUnixTime@4567@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@AEBU2345@_JAEAUByUnixTime@2345@AEAU__identity@01@@Z + ??$__make_exception_guard@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@__Cr@std@@YA?AU?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@01@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@01@AEAAX_K@Z@@Z ??$__make_exception_guard@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@01@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@01@@Z ??$__make_value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@CA?A_P$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@78@@Z@@Z ??$__memberwise_forward_assign@V?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@V?$tuple@PEAVCommandLineFlag@absl@@_N@23@PEAVCommandLineFlag@absl@@_N$$Z$0A@$00@__Cr@std@@YAXAEAV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@$$QEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@U?$__tuple_types@PEAVCommandLineFlag@absl@@_N@01@U?$__integer_sequence@_K$0A@$00@01@@Z @@ -1131,9 +1177,8 @@ EXPORTS ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@PEAPEAU4567@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@PEAU4567@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@PEAU4567@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z - ??$__not_null@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@__function@__Cr@std@@YA_NAEBV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@Z ??$__rehash@$00@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAX_K@Z - ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z + ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z ??$__rewrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@U?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0@Z ??$__rewrap_iter@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@U?$__unwrap_iter_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@0@Z ??$__rewrap_iter@PEAPEAVLogSink@absl@@PEAPEAV12@U?$__unwrap_iter_impl@PEAPEAVLogSink@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0@Z @@ -1172,6 +1217,8 @@ EXPORTS ??$__to_address@PEAVLogSink@absl@@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@@Z ??$__to_address@PEBVCommandLineFlag@absl@@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@@Z ??$__to_address@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@@Z + ??$__to_address@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@@Z + ??$__to_address@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@@Z ??$__to_address@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU2345@@Z ??$__to_address@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@@Z ??$__to_address@UTransition@cctz@time_internal@absl@@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z @@ -1184,6 +1231,12 @@ EXPORTS ??$__to_address@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@AEBV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@@Z ??$__to_address@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV456@@Z@AEBV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@@Z ??$__to_address@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PEAV201@@Z + ??$__try_key_extraction@PEBUCordRep@cord_internal@absl@@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@67@AEBQEBU123@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@567@QEAA?AU867@0@Z@AEBQEBU123@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@01@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@01@QEAA?AU201@AEBQEBUCordRep@cord_internal@absl@@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@401@QEAA?AU201@0@Z@0@Z + ??$__try_key_extraction@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@23@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@523@QEAA?AU623@012@Z@AEBU723@V823@V923@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@401@QEAA?AU201@012@Z@012@Z + ??$__try_key_extraction@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@523@QEAA?AU623@012@Z@AEBU723@V823@V923@@__Cr@std@@YA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@401@QEAA?AU201@012@Z@012@Z + ??$__try_key_extraction_impl@PEBUCordRep@cord_internal@absl@@U?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@56@QEAA?AU456@AEBQEBU123@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@856@QEAA?AU456@0@Z@AEBQEBU123@$0A@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@01@QEAA?AU201@AEBQEBUCordRep@cord_internal@absl@@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@501@QEAA?AU201@1@Z@1@Z + ??$__try_key_extraction_impl@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@23@QEAA?AU423@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@623@QEAA?AU423@012@Z@AEBU723@V823@V923@$0A@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@501@QEAA?AU201@123@Z@123@Z + ??$__try_key_extraction_impl@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@QEAA?AU423@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@623@QEAA?AU423@012@Z@AEBU723@V823@V923@$0A@@__Cr@std@@YA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@501@QEAA?AU201@123@Z@123@Z ??$__uninitialized_allocator_copy@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@V423@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@1PEAV201@@Z ??$__uninitialized_allocator_copy_impl@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@PEAU4?1???R5678@QEBA?AV923@0@Z@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV567@@Z@2PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z ??$__uninitialized_allocator_relocate@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@YAXAEAV?$allocator@PEAVCommandLineFlag@absl@@@01@PEAPEAVCommandLineFlag@absl@@11@Z @@ -1222,6 +1275,8 @@ EXPORTS ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByUnixTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByUnixTime@2345@$$QEAU__identity@01@@Z ??$__validate_iter_reference@AEAPEAPEAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ ??$__validate_iter_reference@AEAPEAPEBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@PEAPEAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@PEAPEBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ ??$__visit_alt@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__impl@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@1234@AEAV?$__impl@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z ??$__visit_alt@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@56@@__variant@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@01234@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@34@@Z ??$__visit_value@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@78@@Z@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@34@@Z @@ -1317,8 +1372,8 @@ EXPORTS ??$construct_at@PEBVCommandLineFlag@absl@@PEBV12@PEAPEBV12@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@$$QEAPEBV23@@Z ??$construct_at@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@PEAPEBV123@@__Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@AEBQEBV234@@Z ??$construct_at@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@PEAPEBV12345@@__Cr@std@@YAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV23456@AEBQEBV23456@@Z - ??$construct_at@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@$$TAEA_KPEAU123@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@$$QEA$$TAEA_K@Z - ??$construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@$$TAEA_KPEAU123@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@$$QEA$$TAEA_K@Z + ??$construct_at@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@AEBQEBUCordRep@cord_internal@absl@@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@AEBQEBUCordRep@cord_internal@absl@@@Z + ??$construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z @@ -1339,6 +1394,8 @@ EXPORTS ??$construct_at@UUnrecognizedFlag@absl@@U12@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAU23@@Z ??$construct_at@UUnrecognizedFlag@absl@@W4Source@12@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAW4Source@23@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z ??$construct_at@UViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@AEA_KPEAU123@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV501@AEA_K@Z + ??$construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z ??$construct_at@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@PEAV123@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@PEAV201@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV567@@Z@@Z ??$construct_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@PEAV123@@__Cr@std@@YAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PEAV201@$$QEAV201@@Z ??$construct_at@VFormatArgImpl@str_format_internal@absl@@AEBV123@PEAV123@@__Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@AEBV234@@Z @@ -1387,11 +1444,11 @@ EXPORTS ??$emplace@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z ??$emplace_at@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAAXViterator@012@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z ??$emplace_at@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAAXViterator@012@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z - ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ??$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV612@AEA_K@Z ??$emplace_back@AEBQEAUCordRep@cord_internal@absl@@@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAAEAPEAUCordRep@cord_internal@1@AEBQEAU231@@Z ??$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV34@@Z @@ -1403,23 +1460,23 @@ EXPORTS ??$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU3456@@Z ??$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU34@@Z ??$emplace_back@HVcrc32c_t@absl@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAH$$QEAVcrc32c_t@6@@Z - ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ??$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV34@@Z ??$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU3456@@Z ??$emplace_back@UPayload@status_internal@absl@@@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAAEAUPayload@status_internal@1@$$QEAU231@@Z ??$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QEAV312@@Z ??$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@34@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z - ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ??$end@V?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@AEAV?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@01@@Z ??$end@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@AEAV?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@01@@Z ??$find@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@PEAVLogSink@absl@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@01@V201@0AEBQEAVLogSink@absl@@@Z - ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA?AVconst_iterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$find_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z @@ -1444,6 +1501,7 @@ EXPORTS ??$get@$00@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEBUStringHash@12@XZ ??$get@$00@?$CompressedTuple@_KV?$allocator@D@__Cr@std@@@container_internal@absl@@QEGAAAEAV?$allocator@D@__Cr@std@@XZ ??$get@$00AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@YAAEA_NAEAV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@@Z + ??$get@$00AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@YAAEAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@AEAV?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@23@@01@@Z ??$get@$00PEAVCommandLineFlag@absl@@_N@__Cr@std@@YAAEA_NAEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@@Z ??$get@$01@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEBUStringEq@12@XZ ??$get@$02@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGAAAEAV?$allocator@D@__Cr@std@@XZ @@ -1460,6 +1518,7 @@ EXPORTS ??$get@$0A@@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEBVCommonFields@12@XZ ??$get@$0A@@?$CompressedTuple@_KV?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEB_KXZ ??$get@$0A@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@YAAEAPEAVCommandLineFlag@absl@@AEAV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@@Z + ??$get@$0A@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@YAAEAUFindInfo@container_internal@absl@@AEAV?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@23@@01@@Z ??$get@$0A@AEBQEAVCommandLineFlag@absl@@@__Cr@std@@YAAEBQEAVCommandLineFlag@absl@@AEAV?$tuple@AEBQEAVCommandLineFlag@absl@@@01@@Z ??$get@$0A@PEAVCommandLineFlag@absl@@_N@__Cr@std@@YA$$QEAPEAVCommandLineFlag@absl@@$$QEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@@Z ??$get@$0A@PEAVCommandLineFlag@absl@@_N@__Cr@std@@YAAEAPEAVCommandLineFlag@absl@@AEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@@Z @@ -1477,7 +1536,7 @@ EXPORTS ??$hash_with_seed@V?$tuple@AEB_K@__Cr@std@@$0A@@MixingHashState@hash_internal@absl@@SA_KAEBV?$tuple@AEB_K@__Cr@std@@_K@Z ??$insert@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z ??$insert@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@1@Z - ??$invoke@AEBU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K@__Cr@std@@YA_KAEBU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QEA_K@Z + ??$invoke@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K@__Cr@std@@YA_KAEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QEA_K@Z ??$invoke@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@__Cr@std@@YAX$$QEAP8FlagImpl@flags_internal@absl@@EAAXXZ$$QEAPEAV234@@Z ??$iter_swap@AEAPEAPEAVCommandLineFlag@absl@@AEAPEAPEAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEAPEAVCommandLineFlag@absl@@0@Z ??$iter_swap@AEAPEAPEAVCommandLineFlag@absl@@PEAPEAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEAPEAVCommandLineFlag@absl@@$$QEAPEAPEAV34@@Z @@ -1488,6 +1547,7 @@ EXPORTS ??$iter_swap@PEAPEBVCommandLineFlag@absl@@PEAPEBV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAX$$QEAPEAPEBVCommandLineFlag@absl@@0@Z ??$iter_swap@PEAPEBVCommandLineFlag@absl@@PEAPEBV12@@__Cr@std@@YAXPEAPEBVCommandLineFlag@absl@@0@Z ??$launder@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@PEAU201@@Z + ??$launder@UList@CordzInfo@cord_internal@absl@@@__Cr@std@@YAPEAUList@CordzInfo@cord_internal@absl@@PEAU2345@@Z ??$launder@URefcountedRep@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEAURefcountedRep@CrcCordState@crc_internal@absl@@PEAU2345@@Z ??$launder@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@__Cr@std@@YAPEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@PEAV234@@Z ??$launder@VFlagRegistry@flags_internal@absl@@@__Cr@std@@YAPEAVFlagRegistry@flags_internal@absl@@PEAV234@@Z @@ -1515,7 +1575,7 @@ EXPORTS ??$make_pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@01@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z ??$make_pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@01@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z ??$make_tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@YA?AV?$tuple@PEAVCommandLineFlag@absl@@_N@01@AEAPEAVCommandLineFlag@absl@@AEA_N@Z - ??$make_unique@ULogMessageData@LogMessage@log_internal@absl@@AEAPEBDAEAHAEAW4LogSeverity@4@VTime@4@$0A@@__Cr@std@@YA?AV?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@01@AEAPEBDAEAHAEAW4LogSeverity@absl@@$$QEAVTime@4@@Z + ??$make_unique@ULogMessageData@LogMessage@log_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAHAEAW4LogSeverity@4@VTime@4@$0A@@__Cr@std@@YA?AV?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@01@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEAHAEAW4LogSeverity@absl@@$$QEAVTime@5@@Z ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@$$V$0A@@__Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@XZ ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@AEAV12@$0A@@__Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@AEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z ??$make_unique@VFallbackCrcMemcpyEngine@crc_internal@absl@@$$V$0A@@__Cr@std@@YA?AV?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@01@XZ @@ -1576,17 +1636,9 @@ EXPORTS ??$safe_strtoi_base@_K@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_KH@Z ??$swap@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAXAEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z ??$swap@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAXAEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z - ??$swap@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEAPEAVCommandLineFlag@absl@@0@Z - ??$swap@PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXAEAPEAPEAVCordzHandle@cord_internal@absl@@0@Z - ??$swap@PEAPEAVLogSink@absl@@@__Cr@std@@YAXAEAPEAPEAVLogSink@absl@@0@Z - ??$swap@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEAPEBVCommandLineFlag@absl@@0@Z - ??$swap@PEAPEBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXAEAPEAPEBVCordzHandle@cord_internal@absl@@0@Z - ??$swap@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAXAEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z ??$swap@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@YAXAEAPEAUTransition@cctz@time_internal@absl@@0@Z ??$swap@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAXAEAPEAUTransitionType@cctz@time_internal@absl@@0@Z ??$swap@PEAUUnrecognizedFlag@absl@@@__Cr@std@@YAXAEAPEAUUnrecognizedFlag@absl@@0@Z - ??$swap@PEAUViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXAEAPEAUViableSubstitution@strings_internal@absl@@0@Z - ??$swap@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXAEAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@0@Z ??$swap@PEAVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEAVCommandLineFlag@absl@@0@Z ??$swap@PEBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@YAXAEAPEBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@0@Z ??$swap@PEBVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEBVCommandLineFlag@absl@@0@Z @@ -1594,6 +1646,7 @@ EXPORTS ??$swap@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@0@Z ??$swap@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXAEAUViableSubstitution@strings_internal@absl@@0@Z ??$tie@PEAVCommandLineFlag@absl@@_N@__Cr@std@@YA?AV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$tie@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@YA?AV?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@23@@01@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@45@@Z ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@1@Z ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@1@Z ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@1@Z @@ -1661,6 +1714,19 @@ EXPORTS ??0?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@Z ??0?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@QEAA@AEAV?$allocator@UUnrecognizedFlag@absl@@@12@AEAPEAUUnrecognizedFlag@absl@@1@Z ??0?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@__Cr@std@@QEAA@AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@Z + ??0?$__allocation_result@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@__Cr@std@@QEAA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ??0?$__allocation_result@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@__Cr@std@@QEAA@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ??0?$__allocation_result@PEAPEAVCommandLineFlag@absl@@_K@__Cr@std@@QEAA@PEAPEAVCommandLineFlag@absl@@_K@Z + ??0?$__allocation_result@PEAPEAVCordzHandle@cord_internal@absl@@_K@__Cr@std@@QEAA@PEAPEAVCordzHandle@cord_internal@absl@@_K@Z + ??0?$__allocation_result@PEAPEAVLogSink@absl@@_K@__Cr@std@@QEAA@PEAPEAVLogSink@absl@@_K@Z + ??0?$__allocation_result@PEAPEBVCommandLineFlag@absl@@_K@__Cr@std@@QEAA@PEAPEBVCommandLineFlag@absl@@_K@Z + ??0?$__allocation_result@PEAPEBVCordzHandle@cord_internal@absl@@_K@__Cr@std@@QEAA@PEAPEBVCordzHandle@cord_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@__Cr@std@@QEAA@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUTransition@cctz@time_internal@absl@@_K@__Cr@std@@QEAA@PEAUTransition@cctz@time_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@_K@__Cr@std@@QEAA@PEAUTransitionType@cctz@time_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUUnrecognizedFlag@absl@@_K@__Cr@std@@QEAA@PEAUUnrecognizedFlag@absl@@_K@Z + ??0?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@_K@__Cr@std@@QEAA@PEAUViableSubstitution@strings_internal@absl@@_K@Z + ??0?$__allocation_result@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@_K@__Cr@std@@QEAA@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@_K@Z ??0?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z ??0?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z ??0?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__Cr@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z @@ -1680,6 +1746,7 @@ EXPORTS ??0?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@__Cr@std@@AEAA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV34567@@Z ??0?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@AEAA@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU3456@@Z ??0?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@AEAA@PEBQEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU3456@@Z + ??0?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@__Cr@std@@QEAA@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@12@AEAAX_K@Z@@Z ??0?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@12@@Z ??0?$__hash_const_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAA@AEBV?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@@Z ??0?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@AEBV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z @@ -1687,8 +1754,6 @@ EXPORTS ??0?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEAA@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z ??0?$__hash_map_const_iterator@V?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@V?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z ??0?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z - ??0?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@QEAA@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@_K@Z - ??0?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@QEAA@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@_K@Z ??0?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAA@PEAU012@@Z ??0?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAA@XZ ??0?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@PEAU012@@Z @@ -1696,11 +1761,15 @@ EXPORTS ??0?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@_N@Z ??0?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@_N@Z ??0?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA@XZ - ??0?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@X@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@12@@Z + ??0?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@X@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@12@@Z ??0?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEAA@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@12@@Z ??0?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEAA@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@12@@Z - ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEAA@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z - ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEAA@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@QEAA@XZ + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@QEAA@XZ ??0?$__non_trivial_if@$00V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ ??0?$__non_trivial_if@$00V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ ??0?$__non_trivial_if@$00V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ @@ -1735,31 +1804,46 @@ EXPORTS ??0?$__optional_move_assign_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ ??0?$__optional_move_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ ??0?$__optional_storage_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ - ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z - ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??0?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z - ??0?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??0?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVCommandLineFlag@absl@@@12@@Z - ??0?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z - ??0?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVLogSink@absl@@@12@@Z - ??0?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEBVCommandLineFlag@absl@@@12@@Z - ??0?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z - ??0?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z - ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z - ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z - ??0?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z - ??0?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@_K0AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z - ??0?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@_K0AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z - ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@12@@Z - ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@12@@Z + ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??0?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVLogSink@absl@@@12@@Z + ??0?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEBVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??0?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@_K0AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??0?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAA@_K0AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAVLogSink@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEBVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@12@@Z + ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@12@@Z ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@12@@Z ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@@Z ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@12@@Z ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@@Z ??0?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@12@_N@Z ??0?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@12@_N@Z - ??0?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEAA@XZ - ??0?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEAA@XZ + ??0?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ ??0?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@AEAA@PEAPEAVCommandLineFlag@absl@@@Z ??0?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@AEAA@PEAPEAVCordzHandle@cord_internal@absl@@@Z ??0?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@AEAA@PEAPEAVLogSink@absl@@@Z @@ -1968,13 +2052,15 @@ EXPORTS ??0KernelTimeout@synchronization_internal@absl@@QEAA@VTime@2@@Z ??0KernelTimeout@synchronization_internal@absl@@QEAA@XZ ??0LeakCheckDisabler@absl@@QEAA@XZ + ??0List@CordzInfo@cord_internal@absl@@QEAA@XZ ??0LockHolder@synchronization_internal@absl@@QEAA@PEAU_RTL_SRWLOCK@@@Z ??0LogEntry@absl@@AEAA@XZ ??0LogMessage@log_internal@absl@@QEAA@PEBDHUErrorTag@012@@Z ??0LogMessage@log_internal@absl@@QEAA@PEBDHUInfoTag@012@@Z ??0LogMessage@log_internal@absl@@QEAA@PEBDHUWarningTag@012@@Z ??0LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@2@@Z - ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@3@VTime@3@@Z + ??0LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@2@@Z + ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@3@VTime@3@@Z ??0LogMessageDebugFatal@log_internal@absl@@QEAA@PEBDH@Z ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH0@Z ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH@Z @@ -1986,7 +2072,7 @@ EXPORTS ??0MaskedPointer@flags_internal@absl@@QEAA@PEAX_N@Z ??0MixingHashState@hash_internal@absl@@AEAA@_K@Z ??0Mutex@absl@@QEAA@XZ - ??0MutexLock@absl@@QEAA@PEAVMutex@1@@Z + ??0MutexLock@absl@@QEAA@AEAVMutex@1@@Z ??0NodeCounts@CordzStatistics@cord_internal@absl@@QEAA@XZ ??0OstreamView@LogMessage@log_internal@absl@@QEAA@AEAULogMessageData@123@@Z ??0ParsedFloat@strings_internal@absl@@QEAA@XZ @@ -2001,7 +2087,7 @@ EXPORTS ??0ProtoField@log_internal@absl@@QEAA@XZ ??0Randen@random_internal@absl@@QEAA@XZ ??0RawHashSetLayout@container_internal@absl@@QEAA@_K00_N@Z - ??0ReaderMutexLock@absl@@QEAA@PEAVMutex@1@@Z + ??0ReaderMutexLock@absl@@QEAA@AEAVMutex@1@@Z ??0RefcountAndFlags@cord_internal@absl@@QEAA@XZ ??0RefcountedRep@CrcCordState@crc_internal@absl@@QEAA@XZ ??0Rep@CordBuffer@absl@@QEAA@PEAUCordRepFlat@cord_internal@2@@Z @@ -2020,7 +2106,7 @@ EXPORTS ??0ShiftState@strings_internal@absl@@QEAA@XZ ??0SpinLock@base_internal@absl@@QEAA@W4SchedulingMode@12@@Z ??0SpinLock@base_internal@absl@@QEAA@XZ - ??0SpinLockHolder@base_internal@absl@@QEAA@PEAVSpinLock@12@@Z + ??0SpinLockHolder@base_internal@absl@@QEAA@AEAVSpinLock@12@@Z ??0Status@absl@@AEAA@_K@Z ??0Status@absl@@QEAA@$$QEAV01@@Z ??0Status@absl@@QEAA@AEBV01@@Z @@ -2052,12 +2138,12 @@ EXPORTS ??0Utf8ForCodePoint@debugging_internal@absl@@QEAA@_K@Z ??0ViableSubstitution@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0_K@Z ??0Win32Waiter@synchronization_internal@absl@@QEAA@XZ - ??0WriterMutexLock@absl@@QEAA@PEAVMutex@1@@Z + ??0WriterMutexLock@absl@@QEAA@AEAVMutex@1@@Z ??0ZoneInfoSource@cctz@time_internal@absl@@QEAA@XZ - ??0_ConstructTransaction@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z - ??0_ConstructTransaction@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z - ??0_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAPEAUTransition@cctz@time_internal@absl@@_K@Z - ??0_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAPEAUTransitionType@cctz@time_internal@absl@@_K@Z + ??0_ConstructTransaction@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@PEAV123@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ??0_ConstructTransaction@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@PEAV123@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ??0_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@PEAV123@PEAUTransition@cctz@time_internal@absl@@_K@Z + ??0_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@PEAV123@PEAUTransitionType@cctz@time_internal@absl@@_K@Z ??0_ConstructTransaction@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAV123@AEAU__deque_block_range@123@@Z ??0_ConstructTransaction@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z ??0_ConstructTransaction@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z @@ -2080,6 +2166,8 @@ EXPORTS ??0__destroy_vector@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z ??0__destroy_vector@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z ??0__destroy_vector@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV123@@Z + ??0__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@@Z + ??0__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@@Z ??0absolute_lookup@time_zone@cctz@time_internal@absl@@QEAA@XZ ??0civil_lookup@time_zone@cctz@time_internal@absl@@QEAA@XZ ??0civil_transition@time_zone@cctz@time_internal@absl@@QEAA@XZ @@ -2129,24 +2217,24 @@ EXPORTS ??1?$__policy_func@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__function@__Cr@std@@QEAA@XZ ??1?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEAA@XZ ??1?$__policy_func@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAA@XZ ??1?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ ??1?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ - ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ ??1?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ ??1?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@absl@@QEAA@XZ ??1?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__Cr@std@@QEAA@XZ @@ -2252,10 +2340,10 @@ EXPORTS ??1UnrecognizedFlag@absl@@QEAA@XZ ??1WriterMutexLock@absl@@QEAA@XZ ??1ZoneInfoSource@cctz@time_internal@absl@@UEAA@XZ - ??1_ConstructTransaction@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1_ConstructTransaction@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ - ??1_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ ??1_ConstructTransaction@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ ??1_ConstructTransaction@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ ??1_ConstructTransaction@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ @@ -2301,6 +2389,7 @@ EXPORTS ??6absl@@YA?AVuint128@0@V10@H@Z ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@AEBVCord@0@@Z ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@AEBVStatus@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@VTime@0@@Z ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vcrc32c_t@0@@Z ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vint128@0@@Z ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vuint128@0@@Z @@ -2315,6 +2404,7 @@ EXPORTS ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@@Z ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@0123@@Z ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@W4weekday@0123@@Z + ??6log_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@UUnprintableWrapper@01@@Z ??6str_format_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@AEBVStreamable@01@@Z ??6str_format_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@W4FormatConversionChar@1@@Z ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@01@@Z @@ -2424,9 +2514,6 @@ EXPORTS ??C?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@12@XZ ??C?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAULogMessageData@LogMessage@log_internal@absl@@XZ ??C?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ - ??C?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@XZ - ??C?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@XZ - ??C?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAVFlagStateInterface@flags_internal@absl@@XZ ??C?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAVTimeZoneIf@cctz@time_internal@absl@@XZ ??C?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAVTimeZoneInfo@cctz@time_internal@absl@@XZ ??CChunkIterator@Cord@absl@@QEBAPEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ @@ -2435,6 +2522,7 @@ EXPORTS ??D?$BitMask@_K$07$02$0A@@container_internal@absl@@QEBAIXZ ??D?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAAAEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@1@XZ ??D?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAAAEAVFlagRegistry@flags_internal@1@XZ + ??D?$NoDestructor@VMutex@absl@@@absl@@QEAAAEAVMutex@1@XZ ??D?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ??D?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ??D?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ @@ -2470,6 +2558,9 @@ EXPORTS ??D?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@12@XZ ??D?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEAULogMessageData@LogMessage@log_internal@absl@@XZ ??D?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEBAAEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ??D?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@XZ + ??D?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@XZ + ??D?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEAVFlagStateInterface@flags_internal@absl@@XZ ??DChunkIterator@Cord@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ??D__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AU__deque_block_range@123@XZ ??Dabsl@@YA?AVint128@0@V10@0@Z @@ -2554,8 +2645,38 @@ EXPORTS ??Pabsl@@YA_NVint128@0@0@Z ??Pabsl@@YA_NVuint128@0@0@Z ??R@?0???$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@23@_K@Z@QEBA?A?@@XZ + ??R@?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@QEBA?A?@@PEAD0@Z + ??R@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@45@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@UNoFormatter@12@@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV0?0???$IntegerToString@H@12@YA?AV345@H@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV0?0???$IntegerToString@I@12@YA?AV345@I@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV0?0???$IntegerToString@J@12@YA?AV345@J@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV0?0???$IntegerToString@K@12@YA?AV345@K@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV0?0???$IntegerToString@_J@12@YA?AV345@_J@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV0?0???$IntegerToString@_K@12@YA?AV345@1@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV0?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@12@YA?AV345@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@45@2V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@UNoFormatter@12@@Z@@Z@QEBA?A?@@XZ + ??R@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBQEBUCordRep@cord_internal@absl@@@Z@QEBA?A?@@00@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z ??R@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@67@@Z@QEBA?A?@@XZ ??R@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@67@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV723@AEA_K@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QEAV423@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z@QEBA?A?@@XZ ??R@?0???A?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAAEAD_K@Z@QEBA?A?@@XZ ??R@?0???A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAAEAUPayload@status_internal@2@_K@Z@QEBA?A?@@XZ ??R@?0???A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBAAEBUPayload@status_internal@2@_K@Z@QEBA?A?@@XZ @@ -2566,6 +2687,12 @@ EXPORTS ??R@?0???CChunkIterator@Cord@absl@@QEBAPEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ@QEBA?A?@@XZ ??R@?0???DChunkIterator@Cord@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ@QEBA?A?@@XZ ??R@?0???EChunkIterator@Cord@absl@@QEAAAEAV123@XZ@QEBA?A?@@XZ + ??R@?0???R0?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@QEBA?A?@@PEAD0@Z@QEBA?A?6@XZ ??R@?0??Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z@QEBA?A?@@0@Z ??R@?0??AssertIsValidForComparison@container_internal@absl@@YAXPEBW4ctrl_t@23@EPEBE@Z@QEBA?A?@@XZ ??R@?0??AssertSameContainer@container_internal@absl@@YAXPEBW4ctrl_t@23@0AEBQEBX1PEBE2@Z@QEBA?A?@@_NPEBD@Z @@ -2590,6 +2717,25 @@ EXPORTS ??R@?0??set_inline_size@Rep@InlineData@cord_internal@absl@@QEAAX_K@Z@QEBA?A?@@XZ ??R@?0??transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@0@Z@QEBA?A?@@XZ ??R@?0???$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@23@_K@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@H@12@YA?AV345@H@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@I@12@YA?AV345@I@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@J@12@YA?AV345@J@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@K@12@YA?AV345@K@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_J@12@YA?AV345@_J@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_K@12@YA?AV345@1@Z@@Z@QEBA?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@12@YA?AV345@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@45@2V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@UNoFormatter@12@@Z@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV723@AEA_K@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QEAV423@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z@QEBA?A?@@XZ ??R@?0??AssertSameContainer@container_internal@absl@@YAXPEBW4ctrl_t@23@0AEBQEBX1PEBE2@Z@QEBA?A?@@XZ ??R@?0??erase@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@@Z@QEBA?A?@@XZ ??R?$ConvertToContainer@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z @@ -2611,17 +2757,15 @@ EXPORTS ??R?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z ??R?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@12@@Z ??R?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@12@@Z - ??R?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEBA_NAEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z - ??R?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEBA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@@Z - ??R?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEBA_NAEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z - ??R?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEBA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@@Z + ??R?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@X@__Cr@std@@QEBA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@@Z + ??R?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@X@__Cr@std@@QEBA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@@Z ??R?$__policy_func@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__function@__Cr@std@@QEBA?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@23@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z ??R?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEBAXAEAVCommandLineFlag@absl@@@Z ??R?$__policy_func@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEBA_NAEBVCommandLineFlag@absl@@@Z ??R?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@@Z ??R?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@@Z - ??R?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEBA_NAEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z - ??R?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QEBA_KAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEBA_NAEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEBA_KAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z ??R?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEBAXPEBVImpl@time_zone@cctz@time_internal@absl@@@Z ??R?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@QEBAXPEAULogMessageData@LogMessage@log_internal@absl@@@Z ??R?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@QEBAXPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z @@ -2657,6 +2801,8 @@ EXPORTS ??R__destroy_vector@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ ??R__destroy_vector@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ ??R__destroy_vector@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z ??Sabsl@@YA?AVuint128@0@V10@@Z ??Tabsl@@YA?AVuint128@0@V10@0@Z ??Uabsl@@YA?AVuint128@0@V10@0@Z @@ -2950,7 +3096,7 @@ EXPORTS ?Data@CordRepBtree@cord_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z ?Data@CordRepFlat@cord_internal@absl@@QEAAPEADXZ ?Data@CordRepFlat@cord_internal@absl@@QEBAPEBDXZ - ?DataGuard@FlagImpl@flags_internal@absl@@AEBAPEAVMutex@3@XZ + ?DataGuard@FlagImpl@flags_internal@absl@@AEBAAEAVMutex@3@XZ ?DataLossError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?DeadlineExceededError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?Deallocate@?$MallocAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@3@_K@Z @@ -3017,7 +3163,6 @@ EXPORTS ?DoLoad@?$AtomicHook@P6AXXZ@base_internal@absl@@AEBAP6AXXZXZ ?DoLoad@?$AtomicHook@P6AX_J@Z@base_internal@absl@@AEBAP6AX_J@ZXZ ?DoLoad@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@AEBAP6A_NW4LogSeverity@3@PEBDHPEAPEADPEAH@ZXZ - ?DoSanitizeOnSetCtrl@container_internal@absl@@YAXAEBVCommonFields@12@_KW4ctrl_t@12@1@Z ?DoStore@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@AEAA_NP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@Z@Z ?DoStore@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@AEAA_NP6AXPEBDH000@Z@Z ?DoStore@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@AEAA_NP6AXPEBDPEBX@Z@Z @@ -3226,6 +3371,7 @@ EXPORTS ?FromUDate@absl@@YA?AVTime@1@N@Z ?FromUniversal@absl@@YA?AVTime@1@_J@Z ?FromUnixDuration@time_internal@absl@@YA?AVTime@2@VDuration@2@@Z + ?FromUnixNanos@absl@@YA?AVTime@1@_J@Z ?FromUnixSeconds@cctz@time_internal@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@_J@Z ?Generate@Randen@random_internal@absl@@QEBAXPEAX@Z ?Generate@RandenHwAes@random_internal@absl@@SAXPEBXPEAX@Z @@ -3348,6 +3494,7 @@ EXPORTS ?GetWord@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAIH@Z ?GetYearDay@absl@@YAHV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z ?GlobalHashtablezSampler@container_internal@absl@@YAAEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?GlobalList@CordzInfo@cord_internal@absl@@CAPEAUList@123@XZ ?GlobalRegistry@FlagRegistry@flags_internal@absl@@SAAEAV123@XZ ?GuaranteedEqual@Condition@absl@@SA_NPEBV12@0@Z ?Guard@?$NullGuard@C@log_internal@absl@@SAAEBCAEBC@Z @@ -3512,8 +3659,6 @@ EXPORTS ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransitionType@234@@Z ?LocalTimeZone@absl@@YA?AVTimeZone@1@XZ ?Lock@CordzInfo@cord_internal@absl@@QEAAXW4MethodIdentifier@CordzUpdateTracker@23@@Z - ?Lock@FlagRegistry@flags_internal@absl@@QEAAXXZ - ?Lock@Mutex@absl@@QEAAXXZ ?LockSlow@Mutex@absl@@AEAAXPEBUMuHowS@2@PEBVCondition@2@H@Z ?LockSlowLoop@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@H@Z ?LockSlowWithDeadline@Mutex@absl@@AEAA_NPEBUMuHowS@2@PEBVCondition@2@VKernelTimeout@synchronization_internal@2@H@Z @@ -3537,7 +3682,6 @@ EXPORTS ?MakeAbsNanos@KernelTimeout@synchronization_internal@absl@@QEBA_JXZ ?MakeAbsTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ ?MakeCheckFailString@status_internal@absl@@YAPEBDPEBVStatus@2@PEBD@Z - ?MakeCheckOpUnprintableString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@C@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z @@ -3698,8 +3842,8 @@ EXPORTS ?Post@Win32Waiter@synchronization_internal@absl@@QEAAXXZ ?PrecombineLengthMix@hash_internal@absl@@YA_K_K0@Z ?PrepareForSampling@HashtablezInfo@container_internal@absl@@QEAAX_J_K11G@Z - ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KUFindInfo@12@@Z - ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KUFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@@Z + ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z ?PrepareInsertSmallNonSoo@container_internal@absl@@YA?AU?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@AEAVCommonFields@12@AEBUPolicyFunctions@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z ?PrepareToDie@LogMessage@log_internal@absl@@AEAAXXZ ?PrepareToModify@Status@absl@@CAPEAVStatusRep@status_internal@2@_K@Z @@ -3720,6 +3864,7 @@ EXPORTS ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z ?PreviousCapacity@container_internal@absl@@YA_K_K@Z ?Print@Streamable@str_format_internal@absl@@QEBAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@@Z + ?PrintTo@absl@@YAXAEBVLogEntry@1@PEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ ?ProgramUsageMessage@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?Ptr@GraphCycles@synchronization_internal@absl@@QEAAPEAXUGraphId@23@@Z @@ -3750,9 +3895,7 @@ EXPORTS ?ReadOneWord@FlagImpl@flags_internal@absl@@QEBA_JXZ ?ReadSeedMaterialFromOSEntropy@random_internal@absl@@YA_NV?$Span@I@2@@Z ?ReadSequenceLockedData@FlagImpl@flags_internal@absl@@AEBAXPEAX@Z - ?ReaderLock@Mutex@absl@@QEAAXXZ ?ReaderTryLockSlow@Mutex@absl@@AEAA_NXZ - ?ReaderUnlock@Mutex@absl@@QEAAXXZ ?Rebuild@CordRepBtree@cord_internal@absl@@CAXPEAPEAV123@PEAV123@_N@Z ?Rebuild@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@@Z ?RecordClearedReservation@HashtablezInfoHandle@container_internal@absl@@QEAAXXZ @@ -3820,9 +3963,9 @@ EXPORTS ?Resize@?$ResizeUninitializedTraits@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@X@strings_internal@absl@@SAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z ?ResizeAllocatedTableWithSeedChange@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z ?ResourceExhaustedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z - ?Restore@FlagState@flags_internal@absl@@EEBAXXZ + ?Restore@FlagState@flags_internal@absl@@EEHAAXXZ ?RestoreState@FlagImpl@flags_internal@absl@@AEAA_NAEBVFlagState@23@@Z - ?RestoreToRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ + ?RestoreToRegistry@FlagSaverImpl@flags_internal@absl@@QEHAAXXZ ?Retire@flags_internal@absl@@YAXPEBDPEBXPEAE@Z ?ReverseConsume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z ?RoundUp@cord_internal@absl@@YA_K_K0@Z @@ -3854,12 +3997,6 @@ EXPORTS ?SetCordRep@CordzInfo@cord_internal@absl@@QEAAXPEAUCordRep@23@@Z ?SetCordRep@CordzUpdateScope@cord_internal@absl@@QEBAXPEAUCordRep@23@@Z ?SetCrcCordState@Cord@absl@@AEAAXVCrcCordState@crc_internal@2@@Z - ?SetCtrl@container_internal@absl@@YAXAEBVCommonFields@12@_KE1@Z - ?SetCtrl@container_internal@absl@@YAXAEBVCommonFields@12@_KW4ctrl_t@12@1@Z - ?SetCtrlInLargeTable@container_internal@absl@@YAXAEBVCommonFields@12@_KE1@Z - ?SetCtrlInLargeTable@container_internal@absl@@YAXAEBVCommonFields@12@_KW4ctrl_t@12@1@Z - ?SetCtrlInSingleGroupTable@container_internal@absl@@YAXAEBVCommonFields@12@_KE1@Z - ?SetCtrlInSingleGroupTable@container_internal@absl@@YAXAEBVCommonFields@12@_KW4ctrl_t@12@1@Z ?SetCurrentThreadIdentity@base_internal@absl@@YAXPEAUThreadIdentity@12@P6AXPEAX@Z@Z ?SetExitOnDFatal@log_internal@absl@@YAX_N@Z ?SetExpectedChecksum@Cord@absl@@QEAAXI@Z @@ -3877,7 +4014,6 @@ EXPORTS ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z ?SetInitialized@log_internal@absl@@YAXXZ - ?SetInlinedSize@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z ?SetIsAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ ?SetIsAllocated@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ ?SetIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ @@ -3894,6 +4030,7 @@ EXPORTS ?SetPrecision@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPEAVFormatConversionSpecImpl@23@@Z ?SetProgramInvocationName@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?SetProgramUsageMessage@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetSize@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z ?SetStackUnwinder@absl@@YAXP6AHPEAPEAXPEAHHHPEBX1@Z@Z ?SetStatusPayloadPrinter@status_internal@absl@@YAXP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@AEBVCord@2@@Z@Z ?SetStderrThreshold@absl@@YAXW4LogSeverityAtLeast@1@@Z @@ -3953,7 +4090,6 @@ EXPORTS ?SkipCrcNode@cord_internal@absl@@YAPEAUCordRep@12@PEAU312@@Z ?SkipCrcNode@cord_internal@absl@@YAPEBUCordRep@12@PEBU312@@Z ?SleepFor@absl@@YAXVDuration@1@@Z - ?SlotAddress@container_internal@absl@@YAPEAXPEAX_K1@Z ?SlowIsEnabled0@VLogSite@log_internal@absl@@AEAA_NH@Z ?SlowIsEnabled1@VLogSite@log_internal@absl@@AEAA_NH@Z ?SlowIsEnabled2@VLogSite@log_internal@absl@@AEAA_NH@Z @@ -4158,8 +4294,6 @@ EXPORTS ?UniversalEpoch@absl@@YA?AVTime@1@XZ ?UnknownError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?Unlock@CordzInfo@cord_internal@absl@@QEAAXXZ - ?Unlock@FlagRegistry@flags_internal@absl@@QEAAXXZ - ?Unlock@Mutex@absl@@QEAAXXZ ?UnlockSlow@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@@Z ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@F@Z ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@G@Z @@ -4256,8 +4390,6 @@ EXPORTS ?Write@FormatRawSinkImpl@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?Write@SequenceLock@flags_internal@absl@@QEAAXPEAU?$atomic@_K@__Cr@std@@PEBX_K@Z ?WriteToStderr@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4LogSeverity@2@@Z - ?WriterLock@Mutex@absl@@QEAAXXZ - ?WriterUnlock@Mutex@absl@@QEAAXXZ ?ZeroDuration@absl@@YA?AVDuration@1@XZ ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ @@ -4335,8 +4467,12 @@ EXPORTS ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z ?__as_base@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@IEGAA@XZ - ?__back_spare@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?__back_spare@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ ?__back_spare@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?__back_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?__back_spare_blocks@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ @@ -4357,69 +4493,109 @@ EXPORTS ?__call@?$__to_address_helper@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@X@__Cr@std@@SAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@AEBV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@@Z ?__capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?__capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__complete@?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@__Cr@std@@QEAAXXZ ?__complete@?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ ?__compose@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU5678@@Z - ?__construct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z - ?__construct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?__construct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX_K@Z + ?__construct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX_K@Z ?__construct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z ?__construct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z ?__copy_assign_alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEBV123@@Z ?__copy_assign_alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEBV123@U?$integral_constant@_N$0A@@23@@Z - ?__deallocate_node@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAXPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@@Z - ?__deallocate_node@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@@Z - ?__destruct_at_begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ?__destruct_at_begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$00@23@@Z - ?__destruct_at_begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ?__destruct_at_begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$00@23@@Z - ?__destruct_at_end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z - ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@U?$integral_constant@_N$0A@@23@@Z + ?__deallocate_node@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@@Z + ?__deallocate_node@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@@Z + ?__deallocate_node_list@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAXPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@@Z + ?__deallocate_node_list@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@@Z + ?__destruct_at_begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__destruct_at_begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$00@23@@Z + ?__destruct_at_begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$00@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAPEAVLogSink@absl@@@Z ?__destruct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransition@cctz@time_internal@absl@@@Z ?__destruct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z ?__destruct_at_end@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUViableSubstitution@strings_internal@absl@@@Z ?__end@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@@Z ?__end@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBQEBU4567@@Z - ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ - ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ - ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ - ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ ?__erase_to_end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEAVCommandLineFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEBVCommandLineFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAPEAUUnrecognizedFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ ?__front_spare@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?__front_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAVCommandLineFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAVLogSink@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEBVCommandLineFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UUnrecognizedFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@XZ ?__get_np@?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@XZ ?__get_np@?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ ?__get_value@?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@QEAAAEAPEBUCordRep@cord_internal@absl@@XZ ?__get_value@?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@QEAAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_value@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@QEAAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@XZ + ?__get_value@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@QEAAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@XZ ?__hash@?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEBA_KXZ ?__hash@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@AEAPEAV?$__tree_node_base@PEAX@23@PEAV523@@Z - ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@AEAPEAV?$__tree_node_base@PEAX@23@PEAV523@@Z + ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@AEAPEAV?$__tree_node_base@PEAX@23@PEAV523@@Z + ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@AEAPEAV?$__tree_node_base@PEAX@23@PEAV523@@Z ?__local@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@Z ?__local@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z ?__make_iter@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@PEAPEAVCommandLineFlag@absl@@@Z @@ -4437,11 +4613,33 @@ EXPORTS ?__move_range@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransition@cctz@time_internal@absl@@00@Z ?__move_range@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@00@Z ?__node_alloc@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@XZ - ?__node_alloc@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ - ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@XZ - ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@XZ ?__ptr@?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU123@XZ ?__ptr@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU123@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEAVCommandLineFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEBAPEAPEAVLogSink@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEBVCommandLineFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEBAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEBAPEAUUnrecognizedFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEBAPEAUViableSubstitution@strings_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEAVCommandLineFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEBAPEAPEAVLogSink@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEBVCommandLineFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEBAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEBAPEAUUnrecognizedFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEBAPEAUViableSubstitution@strings_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ ?__recommend@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z ?__recommend@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z ?__recommend@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z @@ -4455,7 +4653,7 @@ EXPORTS ?__recommend@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBA_K_K@Z ?__recommend_blocks@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SA_K_K@Z ?__rehash_unique@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAX_K@Z - ?__rehash_unique@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAX_K@Z + ?__rehash_unique@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAX_K@Z ?__rewrap@?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@SAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@0@Z ?__rewrap@?$__unwrap_iter_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@0@Z ?__rewrap@?$__unwrap_iter_impl@PEAPEAVLogSink@absl@@$00@__Cr@std@@SAPEAPEAVLogSink@absl@@PEAPEAV45@0@Z @@ -4473,29 +4671,119 @@ EXPORTS ?__rewrap@?$__unwrap_range_impl@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@SA@PEAUTransitionType@cctz@time_internal@absl@@0@Z ?__rewrap@?$__unwrap_range_impl@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@@__Cr@std@@SA@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z ?__rewrap@?$__unwrap_range_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@@__Cr@std@@SA@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@0@Z - ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@XZ - ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ - ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAPEAV?$__tree_node_base@PEAX@23@XZ - ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAPEAV?$__tree_node_base@PEAX@23@XZ + ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@XZ + ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ + ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAPEAV?$__tree_node_base@PEAX@23@XZ + ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAPEAV?$__tree_node_base@PEAX@23@XZ ?__segment@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@Z ?__segment@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEBQEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@0@Z ?__size@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEA_KXZ ?__size@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEB_KXZ ?__size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEA_KXZ ?__size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEB_KXZ - ?__swap_out_circular_buffer@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@23@PEAU4567@@Z - ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransitionType@cctz@time_internal@absl@@AEAU?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@23@PEAU4567@@Z - ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXAEAU?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@23@@Z + ?__swap_layouts@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXAEAV?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@PEAU4567@@Z + ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransitionType@cctz@time_internal@absl@@AEAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@PEAU4567@@Z + ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXAEAV?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAV?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@23@@Z + ?__swap_without_allocator@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAV?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXAEAV?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z ?__throw_length_error@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ ?__throw_length_error@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ ?__throw_length_error@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@CAXXZ @@ -4598,8 +4886,8 @@ EXPORTS ?assert_is_full@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAXPEBD@Z ?at_end@?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBA_NXZ ?back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAAEAPEAUCordRep@cord_internal@2@XZ - ?back@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ - ?back@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ ?back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEBUPrefixCrc@CrcCordState@crc_internal@absl@@XZ ?back@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ @@ -4636,12 +4924,25 @@ EXPORTS ?begin@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ ?begin@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ ?begin@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ - ?begin@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ - ?begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ - ?begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ - ?begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBQEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ - ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@23@XZ - ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?begin@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBAPEBQEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEAVCommandLineFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEBVCommandLineFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAPEAUUnrecognizedFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@23@XZ ?begin@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@$0BA@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@XZ ?begin@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@XZ ?begin@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@XZ @@ -4671,23 +4972,23 @@ EXPORTS ?btree@CordRepBtreeNavigator@cord_internal@absl@@QEBAPEAVCordRepBtree@23@XZ ?btree@CordRepBtreeReader@cord_internal@absl@@QEBAPEAVCordRepBtree@23@XZ ?bucket_count@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEBA_KXZ - ?bucket_count@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?bucket_count@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ ?bytes_value@ProtoField@log_internal@absl@@QEBA?AV?$Span@$$CBD@3@XZ - ?capacity@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?capacity@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ ?capacity@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA_KXZ ?capacity@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?capacity@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ @@ -4710,21 +5011,21 @@ EXPORTS ?chunk_begin@Cord@absl@@QEBA?AVChunkIterator@12@XZ ?chunk_end@Cord@absl@@QEBA?AVChunkIterator@12@XZ ?clear@?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEAAXXZ - ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?clear@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXXZ ?clear@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ ?clear@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAAXXZ ?clear@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ @@ -4866,8 +5167,8 @@ EXPORTS ?delimiter@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBVByAnyChar@3@XZ ?delimiter@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBVByChar@3@XZ ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ - ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z - ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z + ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z ?destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@@Z ?destroy_slots@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXXZ ?destructor_impl@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXXZ @@ -4883,8 +5184,8 @@ EXPORTS ?empty@?$Span@$$CBD@absl@@QEBA_NXZ ?empty@?$Span@D@absl@@QEBA_NXZ ?empty@?$Span@I@absl@@QEBA_NXZ - ?empty@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ - ?empty@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ?empty@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_NXZ + ?empty@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_NXZ ?empty@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ ?empty@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBA_NXZ ?empty@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA_NXZ @@ -4897,6 +5198,7 @@ EXPORTS ?empty@CommonFields@container_internal@absl@@QEBA_NXZ ?empty@Cord@absl@@QEBA_NXZ ?empty@HashtableSize@container_internal@absl@@QEBA_NXZ + ?encoded_message@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?encoded_remaining@LogMessageData@LogMessage@log_internal@absl@@QEAAAEAV?$Span@D@4@XZ ?end@?$BitMask@G$0BA@$0A@$0A@@container_internal@absl@@QEBA?AV123@XZ ?end@?$BitMask@_K$07$02$0A@@container_internal@absl@@QEBA?AV123@XZ @@ -4910,11 +5212,24 @@ EXPORTS ?end@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ ?end@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ ?end@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ - ?end@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ - ?end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ - ?end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ - ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@23@XZ - ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?end@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEAVCommandLineFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEBVCommandLineFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAPEAUUnrecognizedFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@23@XZ ?end@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@23@XZ ?end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@XZ ?end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@XZ @@ -4953,8 +5268,8 @@ EXPORTS ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV567@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@AEBV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@967@AEBVtime_zone@234@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEAMW4chars_format@1@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEANW4chars_format@1@@Z - ?front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ - ?front@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?front@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ ?front@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ ?gbswap_16@absl@@YAGG@Z ?gbswap_32@absl@@YAII@Z @@ -4968,6 +5283,7 @@ EXPORTS ?generation_ptr@HashSetIteratorGenerationInfoDisabled@container_internal@absl@@QEBAPEBEXZ ?get@?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@container_internal@absl@@QEBAPEAW4ctrl_t@23@XZ ?get@?$MaybeInitializedPtr@X@container_internal@absl@@QEBAPEAXXZ + ?get@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAAPEAUList@CordzInfo@cord_internal@2@XZ ?get@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAAPEAURefcountedRep@CrcCordState@crc_internal@2@XZ ?get@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAAPEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ ?get@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEBAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ @@ -5002,8 +5318,10 @@ EXPORTS ?get@?$Storage@_K$0A@U?$StorageTag@_KV?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGBAAEB_KXZ ?get@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ ?get@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransitionType@cctz@time_internal@absl@@XZ + ?get@?$__tuple_leaf@$00AEAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@$0A@@__Cr@std@@QEAAAEAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@XZ ?get@?$__tuple_leaf@$0A@$$QEAPEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@XZ ?get@?$__tuple_leaf@$0A@AEAPEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@XZ + ?get@?$__tuple_leaf@$0A@AEAUFindInfo@container_internal@absl@@$0A@@__Cr@std@@QEAAAEAUFindInfo@container_internal@absl@@XZ ?get@?$__tuple_leaf@$0A@AEBQEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEBQEAVCommandLineFlag@absl@@XZ ?get@?$__tuple_leaf@$0A@PEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@XZ ?get@?$unique_ptr@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ @@ -5015,6 +5333,7 @@ EXPORTS ?get@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ ?get@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAVZoneInfoSource@cctz@time_internal@absl@@XZ ?get@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEBAPEAXXZ + ?get@PlacementImpl@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAAPEAUList@CordzInfo@cord_internal@3@XZ ?get@PlacementImpl@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAAPEAURefcountedRep@CrcCordState@crc_internal@3@XZ ?get@PlacementImpl@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAAPEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@3@XZ ?get@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEBAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ @@ -5054,7 +5373,7 @@ EXPORTS ?has_timeout@KernelTimeout@synchronization_internal@absl@@QEBA_NXZ ?has_zero_flag@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ ?hash_function@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAU?$hash@PEBUCordRep@cord_internal@absl@@@23@XZ - ?hash_function@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@XZ + ?hash_function@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ ?hash_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAAEAUStringHash@23@XZ ?hash_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAAEBUStringHash@23@XZ ?hash_with_seed@?$HashImpl@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@hash_internal@absl@@AEBA_KAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z @@ -5078,6 +5397,8 @@ EXPORTS ?inline_size@Rep@InlineData@cord_internal@absl@@QEBA_KXZ ?insert@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@56@@Z ?insert@?$unordered_set@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_const_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBQEBUCordRep@cord_internal@absl@@@Z + ?int32_value@ProtoField@log_internal@absl@@QEBAHXZ + ?int64_value@ProtoField@log_internal@absl@@QEBA_JXZ ?is_absolute_timeout@KernelTimeout@synchronization_internal@absl@@QEBA_NXZ ?is_basic@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ ?is_conv@ConvTag@str_format_internal@absl@@QEBA_NXZ @@ -5102,8 +5423,10 @@ EXPORTS ?iterator_at@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AViterator@123@_K@Z ?iterator_at_ptr@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AViterator@123@U?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@@Z ?kDefaultIterControl@container_internal@absl@@3W4ctrl_t@12@A + ?key_comp@?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@QEBAAEBU?$less@X@23@XZ + ?key_comp@?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@QEBAAEBU?$less@X@23@XZ ?key_eq@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAU?$equal_to@PEBUCordRep@cord_internal@absl@@@23@XZ - ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@XZ + ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ ?length@CordRepBtreeReader@cord_internal@absl@@QEBA_KXZ ?length_mod@FormatConversionSpecImpl@str_format_internal@absl@@QEBA?AW4LengthMod@3@XZ ?load@?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__Cr@std@@QEBAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZW4memory_order@23@@Z @@ -5118,6 +5441,7 @@ EXPORTS ?load@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__Cr@std@@QEBA?AW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z ?load_time_zone@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVtime_zone@123@@Z ?local_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?lock@FlagRegistry@flags_internal@absl@@QEAAXXZ ?lock@Mutex@absl@@QEAAXXZ ?lock@SpinLock@base_internal@absl@@QEAAXXZ ?lock_shared@Mutex@absl@@QEAAXXZ @@ -5131,7 +5455,7 @@ EXPORTS ?max@?$numeric_limits@Vint128@absl@@@__Cr@std@@SA?AVint128@absl@@XZ ?max@?$numeric_limits@Vuint128@absl@@@__Cr@std@@SA?AVuint128@absl@@XZ ?max_load_factor@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAMXZ - ?max_load_factor@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAMXZ + ?max_load_factor@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAMXZ ?max_size@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?max_size@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?max_size@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ @@ -5185,10 +5509,10 @@ EXPORTS ?poison@InlineData@cord_internal@absl@@QEAAXXZ ?poison_this@InlineData@cord_internal@absl@@QEAAXXZ ?pop_back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAXXZ - ?pop_back@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?pop_back@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ ?pop_back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?pop_front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ?pop_front@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?pop_front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXXZ + ?pop_front@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ ?precision@FormatConversionSpecImpl@str_format_internal@absl@@QEBAHXZ ?predicate@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBUAllowEmpty@3@XZ ?predicate@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBUSkipEmpty@3@XZ @@ -5349,10 +5673,12 @@ EXPORTS ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAAEA_KXZ ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?size@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAAEA_KXZ - ?size@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAAEA_KXZ - ?size@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?size@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ - ?size@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAAEA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ ?size@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@$0BA@@__Cr@std@@QEBA_KXZ ?size@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ ?size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ @@ -5415,6 +5741,9 @@ EXPORTS ?text@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?text@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?text@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_newline@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_prefix@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?text_message_with_prefix_and_newline@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?text_message_with_prefix_and_newline_c_str@LogEntry@absl@@QEBAPEBDXZ ?thread_identity@PerThreadSynch@base_internal@absl@@QEAAPEAUThreadIdentity@23@XZ @@ -5432,7 +5761,10 @@ EXPORTS ?try_lock@Mutex@absl@@QEAA_NXZ ?try_lock_shared@Mutex@absl@@QEAA_NXZ ?type@ProtoField@log_internal@absl@@QEBA?AW4WireType@23@XZ + ?uint32_value@ProtoField@log_internal@absl@@QEBAIXZ + ?uint64_value@ProtoField@log_internal@absl@@QEBA_KXZ ?unchecked_deref@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAAEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@XZ + ?unlock@FlagRegistry@flags_internal@absl@@QEAAXXZ ?unlock@Mutex@absl@@QEAAXXZ ?unlock@SpinLock@base_internal@absl@@QEAAXXZ ?unlock_shared@Mutex@absl@@QEAAXXZ @@ -5440,8 +5772,8 @@ EXPORTS ?utc_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ ?value@ConvertibleToStringView@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?value@InputValue@UnboundConversion@str_format_internal@absl@@QEBAHXZ - ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@XZ - ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@XZ + ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ ?valueless_by_exception@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@QEBA_NXZ ?valueless_by_exception@?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@QEBA_NXZ ?verbosity@LogEntry@absl@@QEBAHXZ diff --git a/naiveproxy/src/third_party/abseil-cpp/symbols_x64_dbg_cxx23.def b/naiveproxy/src/third_party/abseil-cpp/symbols_x64_dbg_cxx23.def new file mode 100644 index 0000000000..aaa74a9825 --- /dev/null +++ b/naiveproxy/src/third_party/abseil-cpp/symbols_x64_dbg_cxx23.def @@ -0,0 +1,5819 @@ +EXPORTS + ?$TSS0@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PEIAXPEIBX_KV54@_N@Z@4HA + ??$?0$$CBD$0A@@VoidPtr@str_format_internal@absl@@QEAA@PEBD@Z + ??$?0$$CBU?$atomic@_N@__Cr@std@@@Condition@absl@@QEAA@P6A_NPEBU?$atomic@_N@__Cr@std@@@Z0@Z + ??$?0$$CBUCordRep@cord_internal@absl@@@Hex@absl@@QEAA@PEBUCordRep@cord_internal@1@W4PadSpec@1@@Z + ??$?0$$CBVFormatArgImpl@str_format_internal@absl@@$$CBV012@@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@V?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@@Z + ??$?0$$CB_W$0A@@VoidPtr@str_format_internal@absl@@QEAA@PEB_W@Z + ??$?0$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V$$Z$0A@$$Z$S@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@AEAV?$tuple@$$V@12@U?$__integer_sequence@_K$0A@@12@U?$__integer_sequence@_K$S@12@@Z + ??$?0$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@Z + ??$?0$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@U?$__integer_sequence@_K$0A@@12@3@Z + ??$?0$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@U?$__integer_sequence@_K$0A@@12@3@Z + ??$?0$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@Z + ??$?0$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@@?$pair@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@Z + ??$?0$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@U?$__integer_sequence@_K$0A@@12@3@Z + ??$?0$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@U?$__integer_sequence@_K$0A@@12@3@Z + ??$?0$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@Z + ??$?0$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QEAPEAVCommandLineFlag@absl@@@?$pair@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@Z + ??$?0$$T@?$Storage@PEAPEAUCordRep@cord_internal@absl@@$00U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEA$$T@Z + ??$?0$$T@?$Storage@PEAPEAVLogSink@absl@@$00U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@internal_compressed_tuple@container_internal@2@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEA$$T@Z + ??$?0$$T@?$Storage@PEAUPayload@status_internal@absl@@$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEA$$T@Z + ??$?0$$V$0A@@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V$0A@@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V$0A@@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V$0A@@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEAA@XZ + ??$?0$$V$0A@@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V$0A@@?$NoDestructor@VMutex@absl@@@absl@@QEAA@XZ + ??$?0$$V@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??$?0$$V@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??$?0$$V@PlacementImpl@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEAA@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@VMutex@absl@@@absl@@QEAA@XZ + ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@QEAA@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@QEAA@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@45@@Z + ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AEBQEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@AEBQEAVCommandLineFlag@absl@@@Z + ??$?0$00X@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??$?0$00X@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??$?0$00X@?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@$$QEAV?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAV?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@12@$$QEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@12@$$QEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAULogMessageData@LogMessage@log_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@UThreadIdentity@base_internal@absl@@P6AXPEAX@Z@__Cr@std@@QEAA@PEAUThreadIdentity@base_internal@absl@@AEBQ6AXPEAX@Z@Z + ??$?0$00X@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$T@Z + ??$?0$00X@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z + ??$?0$00X@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??$?0$00X@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@$$QEAV?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@$$QEAV?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAVFallbackCrcMemcpyEngine@crc_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAVFlagState@flags_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$T@Z + ??$?0$00X@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAVTimeZoneInfo@cctz@time_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAVTimeZoneLibC@cctz@time_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$T@Z + ??$?0$00X@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAVZoneInfoSource@cctz@time_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEAA@$$T@Z + ??$?0$00X@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEAA@PEAX$$QEAUDynValueDeleter@flags_internal@absl@@@Z + ??$?0AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEAPEBV01234@$0A@@?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@QEAA@AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$?0AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV01234@$0A@@?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@QEAA@AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$$QEAPEAPEAPEBV34567@@Z + ??$?0AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAPEAPEAU0123@$0A@@?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@QEAA@AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$?0AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU0123@$0A@@?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@QEAA@AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAPEAU3456@@Z + ??$?0AEAPEAPEAVCommandLineFlag@absl@@AEA_N$0A@@?$pair@PEAPEAVCommandLineFlag@absl@@_N@__Cr@std@@QEAA@AEAPEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$?0AEAPEAPEAVLogSink@absl@@PEAPEAV01@$0A@@?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@QEAA@AEAPEAPEAVLogSink@absl@@$$QEAPEAPEAV34@@Z + ??$?0AEAPEAPEBVCommandLineFlag@absl@@AEA_N$0A@@?$pair@PEAPEBVCommandLineFlag@absl@@_N@__Cr@std@@QEAA@AEAPEAPEBVCommandLineFlag@absl@@AEA_N@Z + ??$?0AEAPEAUTransition@cctz@time_internal@absl@@AEAPEAU0123@$0A@@?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@QEAA@AEAPEAUTransition@cctz@time_internal@absl@@0@Z + ??$?0AEAPEAUTransition@cctz@time_internal@absl@@PEAU0123@$0A@@?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@QEAA@AEAPEAUTransition@cctz@time_internal@absl@@$$QEAPEAU3456@@Z + ??$?0AEAPEAUTransitionType@cctz@time_internal@absl@@AEAPEAU0123@$0A@@?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@QEAA@AEAPEAUTransitionType@cctz@time_internal@absl@@0@Z + ??$?0AEAPEAUTransitionType@cctz@time_internal@absl@@PEAU0123@$0A@@?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@QEAA@AEAPEAUTransitionType@cctz@time_internal@absl@@$$QEAPEAU3456@@Z + ??$?0AEAPEAVCommandLineFlag@absl@@$0A@@?$__tuple_leaf@$0A@AEAPEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAA@AEAPEAVCommandLineFlag@absl@@@Z + ??$?0AEAPEAVCommandLineFlag@absl@@$0A@@?$__tuple_leaf@$0A@PEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAA@AEAPEAVCommandLineFlag@absl@@@Z + ??$?0AEAPEAVCommandLineFlag@absl@@AEA_N$0A@@?$tuple@PEAVCommandLineFlag@absl@@_N@__Cr@std@@QEAA@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$?0AEAPEAVCommandLineFlag@absl@@AEA_N@?$__tuple_impl@U?$__integer_sequence@_K$0A@$00@__Cr@std@@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@QEAA@U__forward_args@12@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$?0AEAPEAVCommandLineFlag@absl@@AEA_N@?$__tuple_impl@U?$__integer_sequence@_K$0A@$00@__Cr@std@@PEAVCommandLineFlag@absl@@_N@__Cr@std@@QEAA@U__forward_args@12@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$?0AEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU0123@$0A@@?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@QEAA@AEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAU3456@@Z + ??$?0AEAUFindInfo@container_internal@absl@@$0A@@?$__tuple_leaf@$0A@AEAUFindInfo@container_internal@absl@@$0A@@__Cr@std@@QEAA@AEAUFindInfo@container_internal@absl@@@Z + ??$?0AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@12@@?$__tuple_impl@U?$__integer_sequence@_K$0A@$00@__Cr@std@@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@56@@__Cr@std@@QEAA@U__forward_args@12@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@56@@Z + ??$?0AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV234@@Z@@?$__temp_value@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@AEBV678@@Z@@Z + ??$?0AEAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@$0A@@?$__tuple_leaf@$00AEAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@$0A@@__Cr@std@@QEAA@AEAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@@Z + ??$?0AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@$0A@@?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@QEAA@AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z + ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$$T$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@container_internal@absl@@QEAA@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$$QEA$$T@Z + ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@56@$$QEA$$T@Z + ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@56@@Z + ??$?0AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@$$T$00@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@container_internal@absl@@QEAA@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@$$QEA$$T@Z + ??$?0AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEAV?$allocator@PEAVLogSink@absl@@@56@$$QEA$$T@Z + ??$?0AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@?$Storage@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEAV?$allocator@PEAVLogSink@absl@@@56@@Z + ??$?0AEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$T$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@container_internal@absl@@QEAA@AEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$QEA$$T@Z + ??$?0AEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEAV?$allocator@UPayload@status_internal@absl@@@56@$$QEA$$T@Z + ??$?0AEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEAV?$allocator@UPayload@status_internal@absl@@@56@@Z + ??$?0AEAVCord@absl@@$0A@@?$optional@VCord@absl@@@__Cr@std@@QEAA@AEAVCord@absl@@@Z + ??$?0AEAVCord@absl@@@?$__optional_destruct_base@VCord@absl@@$0A@@__Cr@std@@QEAA@Uin_place_t@12@AEAVCord@absl@@@Z + ??$?0AEAY0BM@$$CBD$0A@@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEAA@AEAY0BM@$$CBD@Z + ??$?0AEAY0BM@$$CBD@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEAA@AEAY0BM@$$CBD@Z + ??$?0AEA_K@?$Storage@_K$0A@U?$StorageTag@_KV?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEA_K@Z + ??$?0AEA_KAEBV?$allocator@D@__Cr@std@@$00@?$CompressedTuple@_KV?$allocator@D@__Cr@std@@@container_internal@absl@@QEAA@AEA_KAEBV?$allocator@D@__Cr@std@@@Z + ??$?0AEA_KAEBV?$allocator@D@__Cr@std@@@?$CompressedTupleImpl@V?$CompressedTuple@_KV?$allocator@D@__Cr@std@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEA_KAEBV?$allocator@D@56@@Z + ??$?0AEBQEAVCommandLineFlag@absl@@$0A@@?$__tuple_leaf@$0A@AEBQEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAA@AEBQEAVCommandLineFlag@absl@@@Z + ??$?0AEBQEAVCommandLineFlag@absl@@@?$__tuple_impl@U?$__integer_sequence@_K$0A@@__Cr@std@@AEBQEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@U__forward_args@12@AEBQEAVCommandLineFlag@absl@@@Z + ??$?0AEBV?$allocator@D@__Cr@std@@@?$Storage@V?$allocator@D@__Cr@std@@$00U?$StorageTag@_KV?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEBV?$allocator@D@56@@Z + ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEBV?$allocator@UPayload@status_internal@absl@@@56@@Z + ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEAA@AEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$QEAI@Z + ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEBV?$allocator@UPayload@status_internal@absl@@@56@$$QEAI@Z + ??$?0AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@56@@Z + ??$?0AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEAA@AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$$QEAI@Z + ??$?0AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@56@$$QEAI@Z + ??$?0AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V$$Z$0A@$$Z$S@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@AEAV?$tuple@$$V@12@U?$__integer_sequence@_K$0A@@12@U?$__integer_sequence@_K$S@12@@Z + ??$?0AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V$$Z$0A@$$Z$S@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@AEAV?$tuple@$$V@12@U?$__integer_sequence@_K$0A@@12@U?$__integer_sequence@_K$S@12@@Z + ??$?0AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@Z + ??$?0AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@Z + ??$?0AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$ZAEBQEAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@23@@__Cr@std@@AEAA@Upiecewise_construct_t@12@AEAV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEAV?$tuple@AEBQEAVCommandLineFlag@absl@@@12@U?$__integer_sequence@_K$0A@@12@3@Z + ??$?0AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$ZAEBQEAVCommandLineFlag@absl@@@?$pair@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAA@Upiecewise_construct_t@12@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@AEBQEAVCommandLineFlag@absl@@@12@@Z + ??$?0D@?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@QEAA@AEBV?$allocator@D@12@@Z + ??$?0D@?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEBV?$allocator@D@12@@Z + ??$?0D@FormatArgImpl@str_format_internal@absl@@QEAA@AEBD@Z + ??$?0H@FormatArgImpl@str_format_internal@absl@@QEAA@AEBH@Z + ??$?0I@?$Storage@_K$00U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAI@Z + ??$?0I@?$Storage@_K$00U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAI@Z + ??$?0I@?$Storage@_K$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAI@Z + ??$?0I@?$Storage@_K$00U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAI@Z + ??$?0I@FormatArgImpl@str_format_internal@absl@@QEAA@AEBI@Z + ??$?0M@FormatArgImpl@str_format_internal@absl@@QEAA@AEBM@Z + ??$?0N@FormatArgImpl@str_format_internal@absl@@QEAA@AEBN@Z + ??$?0PEAI@?$SaltedSeedSeq@Vseed_seq@__Cr@std@@@random_internal@absl@@QEAA@PEAI0@Z + ??$?0PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV01234@$0A@@?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@QEAA@$$QEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$?0PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU0123@$0A@@?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@QEAA@$$QEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$?0PEAPEAVLogSink@absl@@$0A@@?$__wrap_iter@PEBQEAVLogSink@absl@@@__Cr@std@@QEAA@AEBV?$__wrap_iter@PEAPEAVLogSink@absl@@@12@@Z + ??$?0PEAPEAVLogSink@absl@@PEAPEAV01@$0A@@?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@QEAA@$$QEAPEAPEAVLogSink@absl@@0@Z + ??$?0PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAU0123@PEAPEAU0123@$0A@@?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@QEAA@AEBV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z + ??$?0PEAUTransition@cctz@time_internal@absl@@$0A@@?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@QEAA@AEBV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@@Z + ??$?0PEAUTransition@cctz@time_internal@absl@@PEAU0123@$0A@@?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@QEAA@$$QEAPEAUTransition@cctz@time_internal@absl@@0@Z + ??$?0PEAUTransitionType@cctz@time_internal@absl@@$0A@@?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAA@AEBV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@12@@Z + ??$?0PEAUTransitionType@cctz@time_internal@absl@@PEAU0123@$0A@@?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@QEAA@$$QEAPEAUTransitionType@cctz@time_internal@absl@@0@Z + ??$?0PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV234@@Z@PEAU0?1???R1234@QEBA?AV567@0@Z@$0A@@?$pair@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@PEAU1?1???R2345@QEBA?AV678@0@Z@@__Cr@std@@QEAA@$$QEAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@AEBV567@@Z@1@Z + ??$?0PEAVCommandLineFlag@absl@@$0A@@?$__tuple_leaf@$0A@$$QEAPEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAA@$$QEAPEAVCommandLineFlag@absl@@@Z + ??$?0PEAVCommandLineFlag@absl@@$0A@@?$tuple@$$QEAPEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@$$QEAPEAVCommandLineFlag@absl@@@Z + ??$?0PEAVCommandLineFlag@absl@@@?$__tuple_impl@U?$__integer_sequence@_K$0A@@__Cr@std@@$$QEAPEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@U__forward_args@12@$$QEAPEAVCommandLineFlag@absl@@@Z + ??$?0PEAW4ctrl_t@container_internal@absl@@AEAPEAX$0A@@?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@QEAA@$$QEAPEAW4ctrl_t@container_internal@absl@@AEAPEAX@Z + ??$?0PEAW4ctrl_t@container_internal@absl@@AEBQEAX$0A@@?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@QEAA@$$QEAPEAW4ctrl_t@container_internal@absl@@AEBQEAX@Z + ??$?0PEAW4ctrl_t@container_internal@absl@@PEAX$0A@@?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@QEAA@$$QEAPEAW4ctrl_t@container_internal@absl@@$$QEAPEAX@Z + ??$?0PEAX@FlagState@flags_internal@absl@@QEAA@AEAVFlagImpl@12@AEBQEAX_N2_J@Z + ??$?0PEBD@FormatArgImpl@str_format_internal@absl@@QEAA@AEBQEBD@Z + ??$?0PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU0123@$0A@@?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@QEAA@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAU3456@@Z + ??$?0PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU0123@$0A@@?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@@__Cr@std@@QEAA@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$?0PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@$0A@@?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@QEAA@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z + ??$?0PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QEAA@PEBVFormatArgImpl@str_format_internal@1@0AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@Z + ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@@?$FunctionRef@$$A6A_K_K@Z@absl@@IEAA@Uin_place_t@__Cr@std@@$$QEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@X@?$FunctionRef@$$A6A_K_K@Z@absl@@QEAA@$$QEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$array@D$0DKJI@@__Cr@std@@XU012@H@?$Span@D@absl@@QEAA@AEAU?$array@D$0DKJI@@__Cr@std@@@Z + ??$?0UFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@12@$0A@@?$pair@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@QEAA@$$QEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@45@@Z + ??$?0UHex@absl@@X@AlphaNum@absl@@QEAA@AEBUHex@1@$$QEAVStringifySink@strings_internal@1@@Z + ??$?0UStringEq@container_internal@absl@@@?$Storage@UStringEq@container_internal@absl@@$01U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAUStringEq@23@@Z + ??$?0UStringHash@container_internal@absl@@@?$Storage@UStringHash@container_internal@absl@@$00U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAUStringHash@23@@Z + ??$?0USynchEvent@absl@@@Condition@absl@@QEAA@P6A_NPEAUSynchEvent@1@@Z0@Z + ??$?0Uday_tag@detail@cctz@time_internal@absl@@@?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Uday_tag@detail@cctz@time_internal@absl@@@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Uday_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uday_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uhour_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uminute_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Umonth_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@detail@cctz@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uyear_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@1234@PEAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@AEBV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PEAX@Z + ??$?0V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@$0A@@?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEAA@$$QEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@Z + ??$?0V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@X@?$function@$$A6AXAEAVCommandLineFlag@absl@@@Z@__Cr@std@@QEAA@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@Z + ??$?0V?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@XV01@H@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@AEBV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@1@@Z + ??$?0V?$Span@D@absl@@XV01@$0A@@?$Span@$$CBD@absl@@QEAA@AEBV?$Span@D@1@@Z + ??$?0V?$Span@I@absl@@XV01@$0A@@?$Span@$$CBI@absl@@QEAA@AEBV?$Span@I@1@@Z + ??$?0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V012@$0A@@?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@@__Cr@std@@QEAA@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0@Z + ??$?0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@$0A@@?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@QEAA@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z + ??$?0V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@AEA_N$0A@@?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@QEAA@$$QEAV?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@AEA_N@Z + ??$?0V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N$0A@@?$pair@V?$__hash_const_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@QEAA@$$QEAU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@12@@Z + ??$?0V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEA_N$0A@@?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@QEAA@$$QEAV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEA_N@Z + ??$?0V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEA_N$0A@@?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@__Cr@std@@QEAA@$$QEAV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@12@AEA_N@Z + ??$?0V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEA_N$0A@@?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@__Cr@std@@QEAA@$$QEAV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@12@AEA_N@Z + ??$?0V?$allocator@D@__Cr@std@@@?$Storage@V?$allocator@D@__Cr@std@@$02U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@D@56@@Z + ??$?0V?$allocator@D@__Cr@std@@@AlphaNum@absl@@QEAA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@PEAUCordRep@cord_internal@absl@@@56@@Z + ??$?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$$QEAI@Z + ??$?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@PEAUCordRep@cord_internal@absl@@@56@$$QEAI@Z + ??$?0V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@?$Storage@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@PEAVLogSink@absl@@@56@@Z + ??$?0V?$allocator@PEAVLogSink@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@$$QEAI@Z + ??$?0V?$allocator@PEAVLogSink@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@PEAVLogSink@absl@@@56@$$QEAI@Z + ??$?0V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@QEAA@_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@AEBQEBUCordRep@cord_internal@absl@@@Z + ??$?0V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@QEAA@_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@UPayload@status_internal@absl@@@56@@Z + ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEAA@$$QEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$QEAI@Z + ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAV?$allocator@UPayload@status_internal@absl@@@56@$$QEAI@Z + ??$?0V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$?0V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$?0V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@QEAA@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$?0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@$0A@@?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@$$QEAPEAVCommandLineFlag@absl@@@Z + ??$?0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@$0A@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@$$QEAPEAVCommandLineFlag@absl@@@Z + ??$?0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XV012@$0A@@?$Span@$$CBD@absl@@QEAA@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$?0VBufferRawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAVBufferRawSink@12@@Z + ??$?0VCommonFields@container_internal@absl@@@?$Storage@VCommonFields@container_internal@absl@@$0A@U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAVCommonFields@23@@Z + ??$?0VCommonFields@container_internal@absl@@UStringHash@12@UStringEq@12@V?$allocator@D@__Cr@std@@$00@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEAA@$$QEAVCommonFields@12@$$QEAUStringHash@12@$$QEAUStringEq@12@$$QEAV?$allocator@D@__Cr@std@@@Z + ??$?0VCommonFields@container_internal@absl@@UStringHash@12@UStringEq@12@V?$allocator@D@__Cr@std@@@?$CompressedTupleImpl@V?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00$01$02@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@__Cr@std@@$$QEAVCommonFields@23@$$QEAUStringHash@23@$$QEAUStringEq@23@$$QEAV?$allocator@D@56@@Z + ??$?0VFILERawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAVFILERawSink@12@@Z + ??$?0VFallbackCrcMemcpyEngine@crc_internal@absl@@$0A@@?$default_delete@VCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@QEAA@AEBU?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@12@@Z + ??$?0VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@12@@Z + ??$?0VFlagState@flags_internal@absl@@$0A@@?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@QEAA@AEBU?$default_delete@VFlagState@flags_internal@absl@@@12@@Z + ??$?0VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@12@@Z + ??$?0VTimeZoneInfo@cctz@time_internal@absl@@$0A@@?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@QEAA@AEBU?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@12@@Z + ??$?0VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@12@@Z + ??$?0VTimeZoneLibC@cctz@time_internal@absl@@$0A@@?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@QEAA@AEBU?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@12@@Z + ??$?0VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@12@@Z + ??$?0Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEA_N$0A@@?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@QEAA@$$QEAViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEA_N@Z + ??$?0Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N$0A@@?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@QEAA@$$QEAViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@$$QEA_N@Z + ??$?0_J@FlagState@flags_internal@absl@@QEAA@AEAVFlagImpl@12@AEB_J_N2_J@Z + ??$?0_J@FormatArgImpl@str_format_internal@absl@@QEAA@AEB_J@Z + ??$?4PEAVCommandLineFlag@absl@@_N$0A@@?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@QEAAAEAV012@$$QEAV?$tuple@PEAVCommandLineFlag@absl@@_N@12@@Z + ??$?4UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@12@$0A@@?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@QEAAAEAV012@$$QEAU?$pair@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@23@@12@@Z + ??$?6$01@LogMessage@log_internal@absl@@QEAAAEAV012@AEAY01$$CBD@Z + ??$?6$02@LogMessage@log_internal@absl@@QEAAAEAV012@AEAY02$$CBD@Z + ??$?6$0P@@LogMessage@log_internal@absl@@QEAAAEAV012@AEAY0P@$$CBD@Z + ??$?6C@LogMessage@log_internal@absl@@QEAAAEAV012@AEBC@Z + ??$?6D@LogMessage@log_internal@absl@@QEAAAEAV012@AEBD@Z + ??$?6E@LogMessage@log_internal@absl@@QEAAAEAV012@AEBE@Z + ??$?6F@LogMessage@log_internal@absl@@QEAAAEAV012@AEBF@Z + ??$?6G@LogMessage@log_internal@absl@@QEAAAEAV012@AEBG@Z + ??$?6H@LogMessage@log_internal@absl@@QEAAAEAV012@AEBH@Z + ??$?6I@LogMessage@log_internal@absl@@QEAAAEAV012@AEBI@Z + ??$?6J@LogMessage@log_internal@absl@@QEAAAEAV012@AEBJ@Z + ??$?6K@LogMessage@log_internal@absl@@QEAAAEAV012@AEBK@Z + ??$?6M@LogMessage@log_internal@absl@@QEAAAEAV012@AEBM@Z + ??$?6N@LogMessage@log_internal@absl@@QEAAAEAV012@AEBN@Z + ??$?6PEAX@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEAX@Z + ??$?6PEBD@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEBD@Z + ??$?6PEBX@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEBX@Z + ??$?6PEB_W@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEB_W@Z + ??$?6_J@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_J@Z + ??$?6_K@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_K@Z + ??$?6_N@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_N@Z + ??$?8PEAPEAVCommandLineFlag@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@0@Z + ??$?8PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@01@0@Z + ??$?8PEAPEAVLogSink@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEAPEAVLogSink@absl@@@01@0@Z + ??$?8PEAPEBVCommandLineFlag@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@0@Z + ??$?8PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z + ??$?8PEAUUnrecognizedFlag@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@01@0@Z + ??$?8PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@0@Z + ??$?8PEBQEAVLogSink@absl@@PEAPEAV01@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEBQEAVLogSink@absl@@@01@AEBV?$__wrap_iter@PEAPEAVLogSink@absl@@@01@@Z + ??$?8PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@0@Z + ??$?8PEBUUnrecognizedFlag@absl@@@__Cr@std@@YA_NAEBV?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@01@0@Z + ??$?8UUnrecognizedFlag@absl@@U01@@__Cr@std@@YA_NAEBV?$allocator@UUnrecognizedFlag@absl@@@01@0@Z + ??$?8V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@YA_NAEBV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@$$T@Z + ??$?8VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_NAEBV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@01@$$T@Z + ??$?BV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ + ??$?BV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@XZ + ??$?DH@absl@@YA?AVDuration@0@HV10@@Z + ??$?DH@absl@@YA?AVDuration@0@V10@H@Z + ??$?DN@absl@@YA?AVDuration@0@NV10@@Z + ??$?D_J@absl@@YA?AVDuration@0@_JV10@@Z + ??$?GPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV01234@@__Cr@std@@YA_JAEBV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z + ??$?GPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU0123@@__Cr@std@@YA_JAEBV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z + ??$?GPEAPEAVCommandLineFlag@absl@@PEAPEAV01@@__Cr@std@@YA_JAEBV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@0@Z + ??$?GPEAPEBVCommandLineFlag@absl@@PEAPEBV01@@__Cr@std@@YA_JAEBV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@0@Z + ??$?GPEAUTransition@cctz@time_internal@absl@@PEAU0123@@__Cr@std@@YA_JAEBV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0@Z + ??$?GPEAUTransitionType@cctz@time_internal@absl@@PEAU0123@@__Cr@std@@YA_JAEBV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z + ??$?GPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV234@@Z@PEAU0?1???R1234@QEBA?AV567@0@Z@@__Cr@std@@YA_JAEBV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@0@Z + ??$?GPEBQEAVLogSink@absl@@PEBQEAV01@@__Cr@std@@YA_JAEBV?$__wrap_iter@PEBQEAVLogSink@absl@@@01@0@Z + ??$?GPEBUTransition@cctz@time_internal@absl@@PEAU0123@@__Cr@std@@YA_JAEBV?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@01@AEBV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@01@@Z + ??$?GPEBUTransitionType@cctz@time_internal@absl@@PEAU0123@@__Cr@std@@YA_JAEBV?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@01@AEBV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@01@@Z + ??$?K_J@absl@@YA?AVDuration@0@V10@_J@Z + ??$?MUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?NUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?OUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?PUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?R$$CBUPrefixCrc@CrcCordState@crc_internal@absl@@U0123@$0A@@__copy_impl@__Cr@std@@QEBA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@12@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0PEAU4567@@Z + ??$?RAEAPEAVLogSink@absl@@@__identity@__Cr@std@@QEBAAEAPEAVLogSink@absl@@AEAPEAV34@@Z + ??$?RAEAPEBDAEAHAEAY0LLI@DAEBQEBDPEAD@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@QEBAXAEAPEBDAEAHAEAY0LLI@DAEBQEBD$$QEAPEAD@Z + ??$?RAEAPEBVCommandLineFlag@absl@@@__identity@__Cr@std@@QEBAAEAPEBVCommandLineFlag@absl@@AEAPEBV34@@Z + ??$?RAEAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@__variant_detail@__Cr@std@@@?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@QEBA?A_TAEAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@345@@Z + ??$?RAEAU?$__alt@$01V?$Span@$$CBD@absl@@@__variant_detail@__Cr@std@@@?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@QEBA?A_TAEAU?$__alt@$01V?$Span@$$CBD@absl@@@345@@Z + ??$?RAEAU?$__alt@$02V?$variant@IHM@__Cr@std@@@__variant_detail@__Cr@std@@@?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@QEBA?A_TAEAU?$__alt@$02V?$variant@IHM@__Cr@std@@@345@@Z + ??$?RAEAU?$__alt@$0A@V?$variant@_K_JIH_N@__Cr@std@@@__variant_detail@__Cr@std@@@?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@QEBA?A_TAEAU?$__alt@$0A@V?$variant@_K_JIH_N@__Cr@std@@@345@@Z + ??$?RAEAW4LogSeverity@absl@@AEAPEBDAEAHPEAPEADPEAH@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@QEBA_NAEAW4LogSeverity@2@AEAPEBDAEAH$$QEAPEAPEAD$$QEAPEAH@Z + ??$?RAEAY04$$CBDPEAVCondVar@absl@@@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@QEBAXAEAY04$$CBD$$QEAPEAVCondVar@2@@Z + ??$?RAEAY06$$CBDPEAVCondVar@absl@@@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@QEBAXAEAY06$$CBD$$QEAPEAVCondVar@2@@Z + ??$?RAEAY0BB@$$CBDPEAVCondVar@absl@@@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@QEBAXAEAY0BB@$$CBD$$QEAPEAVCondVar@2@@Z + ??$?RAEAY0N@$$CBDPEAVMutex@absl@@AEA_J@?$AtomicHook@P6AXPEBDPEBX_J@Z@base_internal@absl@@QEBAXAEAY0N@$$CBD$$QEAPEAVMutex@2@AEA_J@Z + ??$?RAEAY0O@$$CBDPEAVCondVar@absl@@@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@QEBAXAEAY0O@$$CBD$$QEAPEAVCondVar@2@@Z + ??$?RAEA_J@?$AtomicHook@P6AX_J@Z@base_internal@absl@@QEBAXAEA_J@Z + ??$?RAEBQEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QEBA$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEAPEAPEBV56789@@Z + ??$?RAEBQEAPEAUCordRep@cord_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QEBA$$QEAPEAUCordRep@cord_internal@absl@@AEBQEAPEAU567@@Z + ??$?RAEBQEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QEBA$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEBQEAPEAU5678@@Z + ??$?RAEBQEAPEAVLogSink@absl@@@__fn@__iter_move@ranges@__Cr@std@@QEBA$$QEAPEAVLogSink@absl@@AEBQEAPEAV56@@Z + ??$?RAEBQEAUPayload@status_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QEBA$$QEAUPayload@status_internal@absl@@AEBQEAU567@@Z + ??$?RAEBQEAUTransition@cctz@time_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QEBA$$QEAUTransition@cctz@time_internal@absl@@AEBQEAU5678@@Z + ??$?RAEBQEAUTransitionType@cctz@time_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QEBA$$QEAUTransitionType@cctz@time_internal@absl@@AEBQEAU5678@@Z + ??$?RAEBUTransition@cctz@time_internal@absl@@@__identity@__Cr@std@@QEBAAEBUTransition@cctz@time_internal@absl@@AEBU3456@@Z + ??$?RPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV01234@$0A@@?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$?RPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV01234@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$?RPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU0123@$0A@@?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@12@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$?RPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU0123@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@12@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$?RPEAVLogSink@absl@@PEAV01@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@12@PEAPEAVLogSink@absl@@00@Z + ??$?RPEAVSpinLock@base_internal@absl@@AEB_J@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@QEBAX$$QEAPEAVSpinLock@12@AEB_J@Z + ??$?RPEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@$0A@@__copy_impl@__Cr@std@@QEBA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@12@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z + ??$?RUTransition@cctz@time_internal@absl@@U0123@$0A@@?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@12@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$?RUTransition@cctz@time_internal@absl@@U0123@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@12@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$?RUTransitionType@cctz@time_internal@absl@@U0123@$0A@@?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@12@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$?RUTransitionType@cctz@time_internal@absl@@U0123@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QEBA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@12@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$?RV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@$0A@@__copy_impl@__Cr@std@@QEBA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@12@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@12@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$V@?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@QEBA_KAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@EmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBUpiecewise_construct_t@56@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@EmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBUpiecewise_construct_t@56@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@AEBQEAVCommandLineFlag@absl@@@12@@?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@QEBA_NAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@AEBQEAVCommandLineFlag@absl@@@45@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@AEBQEAVCommandLineFlag@absl@@@12@@?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@QEBA_KAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@AEBQEAVCommandLineFlag@absl@@@45@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@12@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@AEBQEAVCommandLineFlag@absl@@@12@@FindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA?AVconst_iterator@123@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@67@$$QEAV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QEAV?$tuple@AEBQEAVCommandLineFlag@absl@@@67@@Z + ??$?RVDuration@absl@@V01@@?$__less@XX@__Cr@std@@QEBA_NAEBVDuration@absl@@0@Z + ??$?RVMixingHashState@hash_internal@absl@@@CombineRaw@hash_internal@absl@@QEBA?AVMixingHashState@12@V312@_K@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAPEBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAPEBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CC@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CC@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CG@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CG@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CH@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CH@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CI@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CI@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CL@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CL@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAH$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?VAEAVLogMessage@log_internal@absl@@@Voidify@log_internal@absl@@QEHBAXAEAVLogMessage@12@@Z + ??$?XH$0A@@Duration@absl@@QEAAAEAV01@H@Z + ??$AbslHashValue@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@YA?AVMixingHashState@01@V201@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$AbslHashValue@VMixingHashState@hash_internal@absl@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@hash_internal@absl@@YA?AVMixingHashState@01@V201@AEBV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@Z + ??$AbslHashValue@VMixingHashState@hash_internal@absl@@AEB_K@hash_internal@absl@@YA?AVMixingHashState@01@V201@AEBV?$tuple@AEB_K@__Cr@std@@@Z + ??$AbslStringify@VStringifySink@strings_internal@absl@@@absl@@YAXAEAVStringifySink@strings_internal@0@UHex@0@@Z + ??$Add@$00@CordRepBtree@cord_internal@absl@@AEAAXPEAUCordRep@12@@Z + ??$Add@$00@CordRepBtree@cord_internal@absl@@AEAAXV?$Span@QEAUCordRep@cord_internal@absl@@@2@@Z + ??$Add@$0A@@CordRepBtree@cord_internal@absl@@AEAAXPEAUCordRep@12@@Z + ??$Add@$0A@@CordRepBtree@cord_internal@absl@@AEAAXV?$Span@QEAUCordRep@cord_internal@absl@@@2@@Z + ??$AddCordRep@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z + ??$AddCordRep@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z + ??$AddData@$00@CordRepBtree@cord_internal@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ??$AddData@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$AddEdge@$00@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z + ??$AddEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z + ??$Allocate@$07V?$allocator@D@__Cr@std@@@container_internal@absl@@YAPEAXPEAV?$allocator@D@__Cr@std@@_K@Z + ??$AllocateBackingArray@$07V?$allocator@D@__Cr@std@@@container_internal@absl@@YAPEAXPEAX_K@Z + ??$Append@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$AppendImpl@AEBVCord@absl@@@Cord@absl@@AEAAXAEBV01@@Z + ??$AppendImpl@VCord@absl@@@Cord@absl@@AEAAX$$QEAV01@@Z + ??$ArgumentToConv@C@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@D@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@E@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@F@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@G@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@H@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@I@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@J@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@K@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@M@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@N@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@O@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@PEBD@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@PEB_W@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@UVoidPtr@str_format_internal@absl@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@Vint128@absl@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@Vuint128@absl@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@_J@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@_K@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@_N@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$AsciiInAZRange@$00@ascii_internal@absl@@YA_NE@Z + ??$AsciiInAZRange@$0A@@ascii_internal@absl@@YA_NE@Z + ??$AsciiInAZRangeNaive@$00@ascii_internal@absl@@YA_NE@Z + ??$AsciiInAZRangeNaive@$0A@@ascii_internal@absl@@YA_NE@Z + ??$AsciiStrCaseFold@$00@ascii_internal@absl@@YAXPEADPEBD_K@Z + ??$AsciiStrCaseFold@$0A@@ascii_internal@absl@@YAXPEADPEBD_K@Z + ??$AsciiStrCaseFoldImpl@$00$00@ascii_internal@absl@@YAXPEADPEBD_K@Z + ??$AsciiStrCaseFoldImpl@$00$0A@@ascii_internal@absl@@YAXPEADPEBD_K@Z + ??$AsciiStrCaseFoldImpl@$0A@$00@ascii_internal@absl@@YAXPEADPEBD_K@Z + ??$AsciiStrCaseFoldImpl@$0A@$0A@@ascii_internal@absl@@YAXPEADPEBD_K@Z + ??$AssertHashEqConsistent@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAAXAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$AssertNonNull@U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@@functional_internal@absl@@YAXAEBU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$AssertOnFind@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAAXAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$AssignElements@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXPEAUPayload@status_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@01@_K@Z + ??$Base64EscapeInternal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@strings_internal@absl@@YAXPEBE_KPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_NPEBD@Z + ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@A6AXXZ@Z + ??$CallOnceImpl@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@$$QEAP8FlagImpl@flags_internal@1@EAAXXZ$$QEAPEAV671@@Z + ??$CastAndCallFunction@$$CBU?$atomic@_N@__Cr@std@@@Condition@absl@@CA_NPEBV01@@Z + ??$CastAndCallFunction@USynchEvent@absl@@@Condition@absl@@CA_NPEBV01@@Z + ??$Compare@$0FE@$0FE@@strings_internal@absl@@YAHAEBV?$BigUnsigned@$0FE@@01@0@Z + ??$ConstructElements@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@01@_K@Z + ??$ConstructElements@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@V?$move_iterator@PEAPEAVLogSink@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@1@AEAV?$IteratorValueAdapter@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@V?$move_iterator@PEAPEAVLogSink@absl@@@23@@01@_K@Z + ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEBUPayload@status_internal@absl@@@01@_K@Z + ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@01@_K@Z + ??$ConstructElements@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEAVFormatArgImpl@str_format_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@01@_K@Z + ??$ConsumeConversion@$00@str_format_internal@absl@@YAPEBDPEBDQEBDPEAUUnboundConversion@01@PEAH@Z + ??$ConsumeConversion@$0A@@str_format_internal@absl@@YAPEBDPEBDQEBDPEAUUnboundConversion@01@PEAH@Z + ??$Convert@VFormatArgImpl@str_format_internal@absl@@@FormatArgImplFriend@str_format_internal@absl@@SA_NVFormatArgImpl@12@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ??$ConvertIntArg@C@str_format_internal@absl@@YA_NCVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@D@str_format_internal@absl@@YA_NDVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@E@str_format_internal@absl@@YA_NEVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@F@str_format_internal@absl@@YA_NFVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@G@str_format_internal@absl@@YA_NGVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@H@str_format_internal@absl@@YA_NHVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@I@str_format_internal@absl@@YA_NIVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@J@str_format_internal@absl@@YA_NJVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@K@str_format_internal@absl@@YA_NKVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@Vint128@absl@@@str_format_internal@absl@@YA_NVint128@1@VFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@Vuint128@absl@@@str_format_internal@absl@@YA_NVuint128@1@VFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_J@str_format_internal@absl@@YA_N_JVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_K@str_format_internal@absl@@YA_N_KVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_W@str_format_internal@absl@@YA_N_WVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXD_K@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXD_K@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBufferWithStructuredProtoField@$00@LogMessage@log_internal@absl@@AEAAXUStructuredProtoField@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBufferWithStructuredProtoField@$0A@@LogMessage@log_internal@absl@@AEAAXUStructuredProtoField@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CreateDefault@$0A@@CommonFields@container_internal@absl@@SA?AV012@XZ + ??$CreateWithCustomLimitImpl@$$V@CordBuffer@absl@@CA?AV01@_K0@Z + ??$Deallocate@$07V?$allocator@D@__Cr@std@@@container_internal@absl@@YAXPEAV?$allocator@D@__Cr@std@@PEAX_K@Z + ??$DeallocateBackingArray@$07V?$allocator@D@__Cr@std@@@container_internal@absl@@YAXPEAX_KPEAW4ctrl_t@01@11_N@Z + ??$DecomposePair@U?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YA_N$$QEAU?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@01@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$DecomposePair@U?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YA_K$$QEAU?$HashElement@UStringHash@container_internal@absl@@$00@01@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$DecomposePair@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@$$QEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@Z + ??$DecomposePair@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@Z + ??$DecomposePair@UFindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YA?AVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@$$QEAUFindElement@301@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$DecomposePairImpl@U?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@56@@memory_internal@container_internal@absl@@YA_N$$QEAU?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@12@U?$pair@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@23@@__Cr@std@@@Z + ??$DecomposePairImpl@U?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@56@@memory_internal@container_internal@absl@@YA_K$$QEAU?$HashElement@UStringHash@container_internal@absl@@$00@12@U?$pair@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@23@@__Cr@std@@@Z + ??$DecomposePairImpl@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@67@@memory_internal@container_internal@absl@@YA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@U?$pair@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@45@@Z + ??$DecomposePairImpl@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@67@@memory_internal@container_internal@absl@@YA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@U?$pair@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@45@@Z + ??$DecomposePairImpl@UFindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@67@@memory_internal@container_internal@absl@@YA?AVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QEAUFindElement@412@U?$pair@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@23@@__Cr@std@@@Z + ??$Dispatch@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@F@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@G@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@H@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@I@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@M@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@O@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@PEBD@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@PEB_W@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@UVoidPtr@str_format_internal@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@Vint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@Vuint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$DivMod@$09@?$BigUnsigned@$03@strings_internal@absl@@AEAAIXZ + ??$DivMod@$09@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAIXZ + ??$EmplaceBack@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z + ??$EmplaceBack@AEBQEAVLogSink@absl@@@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAPEAVLogSink@2@AEBQEAV32@@Z + ??$EmplaceBack@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAUPayload@status_internal@2@$$QEAU342@@Z + ??$EmplaceBackSlow@AEBQEAUCordRep@cord_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAAEAPEAUCordRep@cord_internal@2@AEBQEAU342@@Z + ??$EmplaceBackSlow@AEBQEAVLogSink@absl@@@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAAEAPEAVLogSink@2@AEBQEAV32@@Z + ??$EmplaceBackSlow@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAAEAUPayload@status_internal@2@$$QEAU342@@Z + ??$Extract@V?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@str_format_internal@absl@@@UntypedFormatSpecImpl@str_format_internal@absl@@SAAEBV012@AEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@12@@Z + ??$Extract@V?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@str_format_internal@absl@@@UntypedFormatSpecImpl@str_format_internal@absl@@SAAEBV012@AEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@12@@Z + ??$Extract@V?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@str_format_internal@absl@@@UntypedFormatSpecImpl@str_format_internal@absl@@SAAEBV012@AEBV?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@12@@Z + ??$Extract@V?$FormatSpecTemplate@$0JPPPL@@str_format_internal@absl@@@UntypedFormatSpecImpl@str_format_internal@absl@@SAAEBV012@AEBV?$FormatSpecTemplate@$0JPPPL@@12@@Z + ??$ExtractCharSet@$0BPPPL@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0BPPPL@@01@@Z + ??$ExtractCharSet@$0EAAAA@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0EAAAA@@01@@Z + ??$ExtractCharSet@$0EAAAE@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0EAAAE@@01@@Z + ??$ExtractCharSet@$0IAAAE@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0IAAAE@@01@@Z + ??$ExtractCharSet@$0JPOAA@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0JPOAA@@01@@Z + ??$ExtractCharSet@$0JPPPL@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0JPPPL@@01@@Z + ??$ExtractStringification@UHex@absl@@@strings_internal@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAVStringifySink@01@AEBUHex@1@@Z + ??$FastIntToBuffer@C@numbers_internal@absl@@YAPEADCPEAD@Z + ??$FastIntToBuffer@D@numbers_internal@absl@@YAPEADDPEAD@Z + ??$FastIntToBuffer@E@numbers_internal@absl@@YAPEADEPEAD@Z + ??$FastIntToBuffer@F@numbers_internal@absl@@YAPEADFPEAD@Z + ??$FastIntToBuffer@G@numbers_internal@absl@@YAPEADGPEAD@Z + ??$FastIntToBuffer@J@numbers_internal@absl@@YAPEADJPEAD@Z + ??$FastIntToBuffer@K@numbers_internal@absl@@YAPEADKPEAD@Z + ??$FastIntToBuffer@_W@numbers_internal@absl@@YAPEAD_WPEAD@Z + ??$FastTypeId@F@absl@@YAPEBXXZ + ??$FastTypeId@G@absl@@YAPEBXXZ + ??$FastTypeId@H@absl@@YAPEBXXZ + ??$FastTypeId@I@absl@@YAPEBXXZ + ??$FastTypeId@J@absl@@YAPEBXXZ + ??$FastTypeId@K@absl@@YAPEBXXZ + ??$FastTypeId@M@absl@@YAPEBXXZ + ??$FastTypeId@N@absl@@YAPEBXXZ + ??$FastTypeId@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@YAPEBXXZ + ??$FastTypeId@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YAPEBXXZ + ??$FastTypeId@_J@absl@@YAPEBXXZ + ??$FastTypeId@_K@absl@@YAPEBXXZ + ??$FastTypeId@_N@absl@@YAPEBXXZ + ??$FindSubstitutions@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@strings_internal@absl@@YA?AV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@AEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@4@@Z + ??$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@01@PEBXPEAX2@Z + ??$Flush@V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@VBufferRawSink@str_format_internal@absl@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@VFILERawSink@str_format_internal@absl@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$FormatConvertImpl@_N$0A@@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@01@_NVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$FromChrono@_JV?$ratio@$00$0PECEA@@__Cr@std@@@time_internal@absl@@YA?AVDuration@1@AEBV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@@Z + ??$FromInt64@$00@time_internal@absl@@YA?AVDuration@1@_JV?$ratio@$00$00@__Cr@std@@@Z + ??$FromInt64@$0DLJKMKAA@@time_internal@absl@@YA?AVDuration@1@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@Z + ??$FromInt64@$0DOI@@time_internal@absl@@YA?AVDuration@1@_JV?$ratio@$00$0DOI@@__Cr@std@@@Z + ??$FromInt64@$0PECEA@@time_internal@absl@@YA?AVDuration@1@_JV?$ratio@$00$0PECEA@@__Cr@std@@@Z + ??$GenRuntimeTypeId@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEBVtype_info@@XZ + ??$GenericCompare@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@absl@@YAHAEBVCord@0@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$GenericCompare@HVCord@absl@@@absl@@YAHAEBVCord@0@0_K@Z + ??$GenericCompare@_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@absl@@YA_NAEBVCord@0@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$GenericCompare@_NVCord@absl@@@absl@@YA_NAEBVCord@0@0_K@Z + ??$GetData@$$CBV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@@span_internal@absl@@YAPEBVFormatArgImpl@str_format_internal@1@AEBV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@1@@Z + ??$GetData@$$CBV?$Span@D@absl@@@span_internal@absl@@YAPEADAEBV?$Span@D@1@@Z + ??$GetData@$$CBV?$Span@I@absl@@@span_internal@absl@@YAPEAIAEBV?$Span@I@1@@Z + ??$GetData@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@span_internal@absl@@YAPEBDAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$GetData@U?$array@D$0DKJI@@__Cr@std@@@span_internal@absl@@YAPEADAEAU?$array@D$0DKJI@@__Cr@std@@@Z + ??$GetData@V?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@@span_internal@absl@@YAPEAPEAVLogSink@1@AEAV?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@1@@Z + ??$GetData@V?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@span_internal@absl@@YAPEAPEAVLogSink@1@AEAV?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@Z + ??$GetDataImpl@$$CBV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@@span_internal@absl@@YAPEBVFormatArgImpl@str_format_internal@1@AEBV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@1@D@Z + ??$GetDataImpl@$$CBV?$Span@D@absl@@@span_internal@absl@@YAPEADAEBV?$Span@D@1@D@Z + ??$GetDataImpl@$$CBV?$Span@I@absl@@@span_internal@absl@@YAPEAIAEBV?$Span@I@1@D@Z + ??$GetDataImpl@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@span_internal@absl@@YAPEBDAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ??$GetDataImpl@U?$array@D$0DKJI@@__Cr@std@@@span_internal@absl@@YAPEADAEAU?$array@D$0DKJI@@__Cr@std@@D@Z + ??$GetDataImpl@V?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@@span_internal@absl@@YAPEAPEAVLogSink@1@AEAV?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@1@D@Z + ??$GetDataImpl@V?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@span_internal@absl@@YAPEAPEAVLogSink@1@AEAV?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@D@Z + ??$GetFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@0@@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$00$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$03$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$07$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$0A@$0A@@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$0BA@$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$HashOf@$S$$ZV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@absl@@YA_KAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@Z + ??$HashOf@$S$$Z_K@absl@@YA_KAEB_K@Z + ??$HidePtr@$$CBX@base_internal@absl@@YA_KPEBX@Z + ??$HidePtr@U?$atomic@_J@__Cr@std@@@base_internal@absl@@YA_KPEAU?$atomic@_J@__Cr@std@@@Z + ??$HidePtr@X@base_internal@absl@@YA_KPEAX@Z + ??$Hours@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$IgnoreLeak@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@YAPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV123@@Z + ??$Init@$0A@@CordRepBtreeNavigator@cord_internal@absl@@AEAAPEAUCordRep@12@PEAVCordRepBtree@12@@Z + ??$Init@D@FormatArgImpl@str_format_internal@absl@@AEAAXAEBD@Z + ??$Init@H@FormatArgImpl@str_format_internal@absl@@AEAAXAEBH@Z + ??$Init@I@FormatArgImpl@str_format_internal@absl@@AEAAXAEBI@Z + ??$Init@M@FormatArgImpl@str_format_internal@absl@@AEAAXAEBM@Z + ??$Init@N@FormatArgImpl@str_format_internal@absl@@AEAAXAEBN@Z + ??$Init@PEBD@FormatArgImpl@str_format_internal@absl@@AEAAXAEBQEBD@Z + ??$Init@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@AEAAXAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Init@_J@FormatArgImpl@str_format_internal@absl@@AEAAXAEB_J@Z + ??$InitDefaultValue@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@UEmptyBraces@01@@Z + ??$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@12@_K@Z + ??$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ??$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ??$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ??$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ??$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ??$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@H@UniquelyRepresentedProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@AEBH@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@HashValueProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@HashValueProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@AEBV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@V?$tuple@AEB_K@__Cr@std@@@HashValueProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@AEBV?$tuple@AEB_K@__Cr@std@@@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@_K@UniquelyRepresentedProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@AEB_K@Z + ??$InvokeFlush@V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@str_format_internal@absl@@YAXPEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$InvokeFlush@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@str_format_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$InvokeFlush@VBufferRawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPEAVBufferRawSink@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$InvokeFlush@VFILERawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPEAVFILERawSink@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$InvokeGet@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@@FlagImplPeer@flags_internal@absl@@SA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@12@@Z + ??$InvokeObject@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z + ??$InvokeParseFlag@H@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$InvokeParseFlag@M@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAMPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$InvokeParseFlag@N@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEANPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$InvokeParseFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$InvokeSet@V?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@FlagImplPeer@flags_internal@absl@@SAXAEAV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@12@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@Z + ??$IsAboveValidSize@$07@container_internal@absl@@YA_N_K0@Z + ??$IsDestructionTrivial@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@@container_internal@absl@@YA?A_PXZ + ??$IsOfType@F@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@G@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@H@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@I@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@J@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@K@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@M@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@N@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@_J@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@_K@CommandLineFlag@absl@@QEBA_NXZ + ??$IsOfType@_N@CommandLineFlag@absl@@QEBA_NXZ + ??$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z + ??$JoinRange@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$JoinRange@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$LowLevelCallOnce@A6AXXZ$$V@base_internal@absl@@YAXPEAVonce_flag@1@A6AXXZ@Z + ??$MakeCheckOpString@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0PEBD@Z + ??$MakeCheckOpString@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PEBD@Z + ??$MakeCheckOpString@DD@log_internal@absl@@YAPEBDDDPEBD@Z + ??$MakeCheckOpString@EE@log_internal@absl@@YAPEBDEEPEBD@Z + ??$MakeCheckOpString@MM@log_internal@absl@@YAPEBDMMPEBD@Z + ??$MakeCheckOpString@NN@log_internal@absl@@YAPEBDNNPEBD@Z + ??$MakeCheckOpString@PEBCPEBC@log_internal@absl@@YAPEBDPEBC0PEBD@Z + ??$MakeCheckOpString@PEBDPEBD@log_internal@absl@@YAPEBDPEBD00@Z + ??$MakeCheckOpString@PEBEPEBE@log_internal@absl@@YAPEBDPEBE0PEBD@Z + ??$MakeCheckOpString@PEBXPEBX@log_internal@absl@@YAPEBDPEBX0PEBD@Z + ??$MakeCheckOpString@_J_J@log_internal@absl@@YAPEBD_J0PEBD@Z + ??$MakeCheckOpString@_K_K@log_internal@absl@@YAPEBD_K0PEBD@Z + ??$MakeCheckOpString@_N_N@log_internal@absl@@YAPEBD_N0PEBD@Z + ??$MakeCheckOpValueString@M@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBM@Z + ??$MakeCheckOpValueString@N@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBN@Z + ??$MakeCheckOpValueString@PEBC@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBQEBC@Z + ??$MakeCheckOpValueString@PEBD@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBQEBD@Z + ??$MakeCheckOpValueString@PEBE@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBQEBE@Z + ??$MakeCheckOpValueString@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$MakeCheckOpValueString@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$MakeCheckOpValueString@_J@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEB_J@Z + ??$MakeCheckOpValueString@_K@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEB_K@Z + ??$MakeCheckOpValueString@_N@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEB_N@Z + ??$MakeConstSpan@$SQEAX@absl@@YA?AV?$Span@QEAX@0@PEBQEAX_K@Z + ??$MakeSpan@$SD@absl@@YA?AV?$Span@D@0@PEAD_K@Z + ??$MakeSpan@$SI$0BAA@@absl@@YA?AV?$Span@I@0@AEAY0BAA@I@Z + ??$MakeSpan@$SI$0BIA@@absl@@YA?AV?$Span@I@0@AEAY0BIA@I@Z + ??$MakeSpan@$SI$0CAA@@absl@@YA?AV?$Span@I@0@AEAY0CAA@I@Z + ??$MakeSpan@$SI$0CIA@@absl@@YA?AV?$Span@I@0@AEAY0CIA@I@Z + ??$MakeSpan@$SI$0IA@@absl@@YA?AV?$Span@I@0@AEAY0IA@I@Z + ??$MakeSpan@$SI@absl@@YA?AV?$Span@I@0@PEAI_K@Z + ??$MakeSpan@$SPEAVLogSink@absl@@@absl@@YA?AV?$Span@PEAVLogSink@absl@@@0@PEAPEAVLogSink@0@_K@Z + ??$MakeSpan@$SU?$array@D$0DKJI@@__Cr@std@@@absl@@YA?AV?$Span@D@0@AEAU?$array@D$0DKJI@@__Cr@std@@@Z + ??$MakeSpan@$SV?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@@absl@@YA?AV?$Span@PEAVLogSink@absl@@@0@AEAV?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@0@@Z + ??$MakeSpan@$SV?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@absl@@YA?AV?$Span@PEAVLogSink@absl@@@0@AEAV?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@Z + ??$MaskOfLength@I@crc_internal@absl@@YAIH@Z + ??$MaxValidSize@$07@container_internal@absl@@YA_K_K@Z + ??$MaxValidSizeFor1ByteSlot@$07@container_internal@absl@@YA_KXZ + ??$Merge@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z + ??$Merge@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z + ??$Microseconds@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Microseconds@J$0A@@absl@@YA?AVDuration@0@J@Z + ??$Milliseconds@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Milliseconds@K$0A@@absl@@YA?AVDuration@0@K@Z + ??$Milliseconds@N$0A@@absl@@YA?AVDuration@0@N@Z + ??$Minutes@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Nanoseconds@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Nanoseconds@J$0A@@absl@@YA?AVDuration@0@J@Z + ??$Nanoseconds@_J$0A@@absl@@YA?AVDuration@0@_J@Z + ??$NewImpl@$0BAAA@$$V@CordRepFlat@cord_internal@absl@@SAPEAU012@_K@Z + ??$NewImpl@$0EAAAA@$$V@CordRepFlat@cord_internal@absl@@SAPEAU012@_K@Z + ??$NewLeaf@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$NewLeaf@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$OffsetValue@U?$atomic@_K@__Cr@std@@@FlagImpl@flags_internal@absl@@AEBAPEAU?$atomic@_K@__Cr@std@@XZ + ??$OffsetValue@UFlagMaskedPointerValue@flags_internal@absl@@@FlagImpl@flags_internal@absl@@AEBAPEAUFlagMaskedPointerValue@12@XZ + ??$OffsetValue@UFlagOneWordValue@flags_internal@absl@@@FlagImpl@flags_internal@absl@@AEBAPEAUFlagOneWordValue@12@XZ + ??$PairArgs@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@$$QEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@Z + ??$PairArgs@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@$$QEAPEAVCommandLineFlag@1@@Z + ??$PairArgs@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@23@@__Cr@std@@AEBU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@Z + ??$PairArgs@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBQEAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@AEBQEAVCommandLineFlag@absl@@@23@@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@AEBQEAVCommandLineFlag@1@@Z + ??$PairArgs@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@Z + ??$PairArgs@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@__Cr@std@@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@$$QEAPEAVCommandLineFlag@1@@Z + ??$ParseFlag@H@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??$ParseFlag@M@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAMPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??$ParseFlag@N@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEANPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??$ParseFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??$ParseFlagImpl@H@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAH@Z + ??$ParseFlagImpl@I@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAI@Z + ??$ParseFlagImpl@J@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAJ@Z + ??$ParseFlagImpl@K@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAK@Z + ??$ParseFlagImpl@_J@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEA_J@Z + ??$ParseFlagImpl@_K@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEA_K@Z + ??$ParseFloat@$09@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z + ??$ParseFloat@$0BA@@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z + ??$ParseFormatString@UParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@@str_format_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UParsedFormatConsumer@ParsedFormatBase@01@@Z + ??$PopDead@_J_K_K_KG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AEAAPEAUHashtablezInfo@container_internal@2@_J_K11G@Z + ??$Prepend@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$ReadCallback@P6A_NPEAUSynchEvent@absl@@@Z@Condition@absl@@AEBAXPEAP6A_NPEAUSynchEvent@1@@Z@Z + ??$ReadCallback@P6A_NPEBU?$atomic@_N@__Cr@std@@@Z@Condition@absl@@AEBAXPEAP6A_NPEBU?$atomic@_N@__Cr@std@@@Z@Z + ??$Register@AEB_JAEA_KAEA_KAEA_KAEAG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAAPEAUHashtablezInfo@container_internal@2@AEB_JAEA_K11AEAG@Z + ??$RotateRight@I@crc_internal@absl@@YAIIHH@Z + ??$RunWithReentrancyGuard@V@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@78@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@78@@Z@@CommonFields@container_internal@absl@@QEAAXV@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@78@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@78@@Z@@Z + ??$RunWithReentrancyGuard@V@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@78@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@78@@Z@@CommonFields@container_internal@absl@@QEAAXV@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@78@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@78@@Z@@Z + ??$RunWithReentrancyGuard@V@?0??destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z@@CommonFields@container_internal@absl@@QEAAXV@?0??destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@@Z@@Z + ??$RunWithReentrancyGuard@V@?0??transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@0@Z@@CommonFields@container_internal@absl@@QEAAXV@?0??transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@0@Z@@Z + ??$SNPrintF@DHHH@absl@@YAHPEAD_KAEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@str_format_internal@0@AEBDAEBH44@Z + ??$STLStringResizeUninitialized@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@X@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ??$STLStringResizeUninitializedAmortized@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ??$SanitizerPoisonObject@T?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@@container_internal@absl@@YAXPEBT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@@Z + ??$Seconds@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Seconds@J$0A@@absl@@YA?AVDuration@0@J@Z + ??$Seconds@_J$0A@@absl@@YA?AVDuration@0@_J@Z + ??$SetEdge@$00@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z + ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z + ??$SetFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YAXPEAV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@0@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@Z + ??$SharedCompareImpl@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@absl@@YAHAEBVCord@0@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$SharedCompareImpl@VCord@absl@@@absl@@YAHAEBVCord@0@0@Z + ??$SimpleAtoi@H@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAH@Z + ??$SmallMemmove@$00@cord_internal@absl@@YAXPEADPEBD_K@Z + ??$SmallMemmove@$0A@@cord_internal@absl@@YAXPEADPEBD_K@Z + ??$StoreCallback@P6A_NPEAUSynchEvent@absl@@@Z@Condition@absl@@AEAAXP6A_NPEAUSynchEvent@1@@Z@Z + ??$StoreCallback@P6A_NPEAX@Z@Condition@absl@@AEAAXP6A_NPEAX@Z@Z + ??$StoreCallback@P6A_NPEBU?$atomic@_N@__Cr@std@@@Z@Condition@absl@@AEAAXP6A_NPEBU?$atomic@_N@__Cr@std@@@Z@Z + ??$StrAppend@$$V@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@1111@Z + ??$StrCat@$$BY01D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEAY01$$CBD@Z + ??$StrCat@$$V@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000@Z + ??$StrCat@F@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@F@Z + ??$StrCat@G@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@G@Z + ??$StrCat@H@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ??$StrCat@I@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ??$StrCat@J@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ??$StrCat@K@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ??$StrCat@PEBD@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBQEBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY02D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY02$$CBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY03D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY03$$CBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0BO@DV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY0BO@$$CBD1@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0LD@D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY0LD@$$CBD@Z + ??$StrCat@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV123@@Z + ??$StrCat@_J@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ??$StrCat@_K@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ??$StrFormat@DHHHHH_JIV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HPEBDV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@str_format_internal@0@AEBDAEBH2222AEB_JAEBIAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@2AEBQEBD5@Z + ??$StrFormat@HM@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@str_format_internal@0@AEBHAEBM@Z + ??$StrFormat@HN@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@str_format_internal@0@AEBHAEBN@Z + ??$StrJoin@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z + ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@3@@Z + ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z + ??$StrSplit@D@absl@@YA?AV?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@D@Z + ??$StrSplit@DUAllowEmpty@absl@@@absl@@YA?AV?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@DUAllowEmpty@0@@Z + ??$StrSplit@VByAnyChar@absl@@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@@Z + ??$StrSplit@VByAnyChar@absl@@USkipEmpty@2@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@USkipEmpty@0@@Z + ??$StreamFormat@I@absl@@YA?AVStreamable@str_format_internal@0@AEBV?$FormatSpecTemplate@$0JPPPL@@20@AEBI@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@H@strings_internal@0@YA?AV123@H@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@I@strings_internal@0@YA?AV123@I@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@J@strings_internal@0@YA?AV123@J@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@K@strings_internal@0@YA?AV123@K@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_J@strings_internal@0@YA?AV123@_J@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_K@strings_internal@0@YA?AV123@1@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@0@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@2V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@50@@Z@@Z + ??$ToChronoDuration@V?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$0DOI@@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$0DOI@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToInt@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@F@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@G@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@H@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@I@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@M@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@O@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@PEBD@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@PEB_W@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@UVoidPtr@str_format_internal@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@VFormatArgImpl@str_format_internal@absl@@@FormatArgImplFriend@str_format_internal@absl@@SA_NVFormatArgImpl@12@PEAH@Z + ??$ToInt@Vint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@Vuint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@_J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@_K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@_N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PEAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToIntVal@C@FormatArgImpl@str_format_internal@absl@@CAHAEBC@Z + ??$ToIntVal@D@FormatArgImpl@str_format_internal@absl@@CAHAEBD@Z + ??$ToIntVal@E@FormatArgImpl@str_format_internal@absl@@CAHAEBE@Z + ??$ToIntVal@F@FormatArgImpl@str_format_internal@absl@@CAHAEBF@Z + ??$ToIntVal@G@FormatArgImpl@str_format_internal@absl@@CAHAEBG@Z + ??$ToIntVal@H@FormatArgImpl@str_format_internal@absl@@CAHAEBH@Z + ??$ToIntVal@I@FormatArgImpl@str_format_internal@absl@@CAHAEBI@Z + ??$ToIntVal@J@FormatArgImpl@str_format_internal@absl@@CAHAEBJ@Z + ??$ToIntVal@K@FormatArgImpl@str_format_internal@absl@@CAHAEBK@Z + ??$ToIntVal@_J@FormatArgImpl@str_format_internal@absl@@CAHAEB_J@Z + ??$ToIntVal@_K@FormatArgImpl@str_format_internal@absl@@CAHAEB_K@Z + ??$ToIntVal@_N@FormatArgImpl@str_format_internal@absl@@CAHAEB_N@Z + ??$TrailingZeros@G@container_internal@absl@@YAIG@Z + ??$TrailingZeros@_K@container_internal@absl@@YAI_K@Z + ??$TransferNRelocatable@$0BI@@container_internal@absl@@YAXPEAX00_K@Z + ??$TryFindNewIndexWithoutProbing@X@container_internal@absl@@YA_K_K00PEAW4ctrl_t@01@0@Z + ??$TypeErasedApplyToSlotFn@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@YA_KPEBXPEAX_K@Z + ??$UnhidePtr@X@base_internal@absl@@YAPEAX_K@Z + ??$Unparse@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@@Z + ??$UnparseFlag@H@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBH@Z + ??$UnparseFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@@Z + ??$UnparseFloatingPointVal@M@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@M@Z + ??$UnparseFloatingPointVal@N@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z + ??$__add_alignment_assumption@PEAPEAVCommandLineFlag@absl@@$0A@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAPEAPEAVCommandLineFlag@absl@@PEAPEAV34@@Z + ??$__add_alignment_assumption@PEAPEAVCordzHandle@cord_internal@absl@@$0A@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV345@@Z + ??$__add_alignment_assumption@PEAPEAVLogSink@absl@@$0A@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@CAPEAPEAVLogSink@absl@@PEAPEAV34@@Z + ??$__add_alignment_assumption@PEAPEBVCommandLineFlag@absl@@$0A@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAPEAPEBVCommandLineFlag@absl@@PEAPEBV34@@Z + ??$__add_alignment_assumption@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$0A@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@CAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU3456@@Z + ??$__add_alignment_assumption@PEAUTransition@cctz@time_internal@absl@@$0A@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAPEAUTransition@cctz@time_internal@absl@@PEAU3456@@Z + ??$__add_alignment_assumption@PEAUTransitionType@cctz@time_internal@absl@@$0A@@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAPEAUTransitionType@cctz@time_internal@absl@@PEAU3456@@Z + ??$__add_alignment_assumption@PEAUUnrecognizedFlag@absl@@$0A@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@CAPEAUUnrecognizedFlag@absl@@PEAU34@@Z + ??$__add_alignment_assumption@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@$0A@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@CAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@PEAV312@@Z + ??$__advance@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAXAEAPEBUTransition@cctz@time_internal@absl@@_JUrandom_access_iterator_tag@01@@Z + ??$__advance@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@_JUrandom_access_iterator_tag@01@@Z + ??$__advance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@_JUrandom_access_iterator_tag@01@@Z + ??$__advance@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@_JUrandom_access_iterator_tag@01@@Z + ??$__allocate_at_least@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@PEAVCommandLineFlag@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@PEAVLogSink@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@PEBVCommandLineFlag@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@UUnrecognizedFlag@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@_K@Z + ??$__allocate_at_least@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?A_PAEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@_K@Z + ??$__allocator_destroy@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@PEAU45@@__Cr@std@@YAXAEAV?$allocator@UUnrecognizedFlag@absl@@@01@PEAUUnrecognizedFlag@absl@@1@Z + ??$__annotate_contiguous_container@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_contiguous_container@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPEBX000@Z + ??$__annotate_double_ended_contiguous_container@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPEBX00000@Z + ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z + ??$__as_transparent@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@01@AEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@01@@Z + ??$__as_transparent@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@01@AEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@01@@Z + ??$__as_variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@YAAEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@01@AEAV201@@Z + ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z + ??$__at@P6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03$$V@__base@__visitation@__variant_detail@__Cr@std@@CA$$QEA_PAEBU?$__farray@P6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03@34@_K@Z + ??$__at@P6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z@__base@__visitation@__variant_detail@__Cr@std@@CAAEBQ6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@1234@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@ZAEBQ6A_K01@Z@Z + ??$__call@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@?$__invoke_void_return_wrapper@X$00@__Cr@std@@SAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@7@@Z + ??$__call_func@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@CAXPEBT__policy_storage@123@AEAVCommandLineFlag@absl@@@Z + ??$__constexpr_memmove@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0W4__element_count@01@@Z + ??$__constexpr_memmove@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@0W4__element_count@01@@Z + ??$__constexpr_memmove@PEAVLogSink@absl@@PEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0W4__element_count@01@@Z + ??$__constexpr_memmove@UPrefixCrc@CrcCordState@crc_internal@absl@@$$CBU1234@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@PEBU2345@W4__element_count@01@@Z + ??$__constexpr_memmove@UTransition@cctz@time_internal@absl@@U1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@0W4__element_count@01@@Z + ??$__constexpr_memmove@UTransitionType@cctz@time_internal@absl@@U1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@0W4__element_count@01@@Z + ??$__construct_at@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEBV12345@PEAPEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@AEAPEAPEBV23456@@Z + ??$__construct_at@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@PEAPEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@$$QEAPEAPEBV23456@@Z + ??$__construct_at@PEAUCordRep@cord_internal@absl@@AEBQEAU123@PEAPEAU123@@__Cr@std@@YAPEAPEAUCordRep@cord_internal@absl@@PEAPEAU234@AEBQEAU234@@Z + ??$__construct_at@PEAUCordRep@cord_internal@absl@@PEAU123@PEAPEAU123@@__Cr@std@@YAPEAPEAUCordRep@cord_internal@absl@@PEAPEAU234@$$QEAPEAU234@@Z + ??$__construct_at@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAPEAU1234@PEAPEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@AEAPEAU2345@@Z + ??$__construct_at@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@PEAPEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@$$QEAPEAU2345@@Z + ??$__construct_at@PEAVCommandLineFlag@absl@@AEBQEAV12@PEAPEAV12@@__Cr@std@@YAPEAPEAVCommandLineFlag@absl@@PEAPEAV23@AEBQEAV23@@Z + ??$__construct_at@PEAVCordzHandle@cord_internal@absl@@AEBQEAV123@PEAPEAV123@@__Cr@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV234@AEBQEAV234@@Z + ??$__construct_at@PEAVLogSink@absl@@AEBQEAV12@PEAPEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@AEBQEAV23@@Z + ??$__construct_at@PEAVLogSink@absl@@PEAV12@PEAPEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@$$QEAPEAV23@@Z + ??$__construct_at@PEBUCordRep@cord_internal@absl@@AEBQEBU123@PEAPEBU123@@__Cr@std@@YAPEAPEBUCordRep@cord_internal@absl@@PEAPEBU234@AEBQEBU234@@Z + ??$__construct_at@PEBVCommandLineFlag@absl@@AEBQEBV12@PEAPEBV12@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@AEBQEBV23@@Z + ??$__construct_at@PEBVCommandLineFlag@absl@@PEBV12@PEAPEBV12@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@$$QEAPEBV23@@Z + ??$__construct_at@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@PEAPEBV123@@__Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@AEBQEBV234@@Z + ??$__construct_at@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@PEAPEBV12345@@__Cr@std@@YAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV23456@AEBQEBV23456@@Z + ??$__construct_at@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@AEBQEBUCordRep@cord_internal@absl@@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@AEBQEBUCordRep@cord_internal@absl@@@Z + ??$__construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$__construct_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@PEAU123@@__Cr@std@@YAPEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@01@@Z + ??$__construct_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@PEAU123@@__Cr@std@@YAPEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@01@@Z + ??$__construct_at@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$__construct_at@UPayload@status_internal@absl@@AEBU123@PEAU123@@__Cr@std@@YAPEAUPayload@status_internal@absl@@PEAU234@AEBU234@@Z + ??$__construct_at@UPayload@status_internal@absl@@U123@PEAU123@@__Cr@std@@YAPEAUPayload@status_internal@absl@@PEAU234@$$QEAU234@@Z + ??$__construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@AEBU1234@PEAU1234@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@AEBU2345@@Z + ??$__construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@HVcrc32c_t@4@PEAU1234@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@$$QEAH$$QEAVcrc32c_t@5@@Z + ??$__construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$__construct_at@UTransition@cctz@time_internal@absl@@$$VPEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z + ??$__construct_at@UTransition@cctz@time_internal@absl@@AEBU1234@PEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@AEBU2345@@Z + ??$__construct_at@UTransition@cctz@time_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$__construct_at@UTransitionType@cctz@time_internal@absl@@$$VPEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z + ??$__construct_at@UTransitionType@cctz@time_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$__construct_at@UUnrecognizedFlag@absl@@AEBU12@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@AEBU23@@Z + ??$__construct_at@UUnrecognizedFlag@absl@@U12@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAU23@@Z + ??$__construct_at@UUnrecognizedFlag@absl@@W4Source@12@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAW4Source@23@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z + ??$__construct_at@UViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@AEA_KPEAU123@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV501@AEA_K@Z + ??$__construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$__construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$__construct_at@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@PEAV123@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@PEAV201@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV567@@Z@@Z + ??$__construct_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@PEAV123@@__Cr@std@@YAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PEAV201@$$QEAV201@@Z + ??$__construct_at@VFormatArgImpl@str_format_internal@absl@@AEBV123@PEAV123@@__Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@AEBV234@@Z + ??$__construct_at_end@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@0_K@Z + ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@?$__split_buffer@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z + ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z + ??$__construct_node@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__construct_node@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__construct_node_hash@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBQEBUCordRep@cord_internal@absl@@@Z + ??$__construct_node_hash@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__copy@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@PEAU1234@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0PEAU3456@@Z + ??$__copy@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z + ??$__copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z + ??$__copy_backward_trivial_impl@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__copy_backward_trivial_impl@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__copy_backward_trivial_impl@UTransition@cctz@time_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__copy_backward_trivial_impl@UTransitionType@cctz@time_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@PEAPEAPEBV45678@$0A@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@PEAPEAU4567@$0A@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@PEAU4567@$0A@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@PEAU4567@$0A@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@PEAPEAPEBV45678@$0A@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@PEAPEAU4567@$0A@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAPEAVLogSink@absl@@PEAPEAV45@PEAPEAV45@$0A@@__Cr@std@@YA?AU?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@01@PEAPEAVLogSink@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@PEAU4567@$0A@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@PEAU4567@$0A@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U__copy_impl@__Cr@std@@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU4567@PEAU4567@$0A@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0PEAU3456@@Z + ??$__copy_move_unwrap_iters@U__copy_impl@__Cr@std@@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU4567@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@$0A@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z + ??$__copy_move_unwrap_iters@U__copy_impl@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@V423@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@$0A@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z + ??$__copy_trivial_impl@$$CBUPrefixCrc@CrcCordState@crc_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0PEAU3456@@Z + ??$__copy_trivial_impl@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__copy_trivial_impl@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__copy_trivial_impl@PEAVLogSink@absl@@PEAV12@@__Cr@std@@YA?AU?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@01@PEAPEAVLogSink@absl@@00@Z + ??$__copy_trivial_impl@UTransition@cctz@time_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__copy_trivial_impl@UTransitionType@cctz@time_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__create@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@__policy@__function@__Cr@std@@SAPEBU0123@XZ + ??$__cxx_atomic_compare_exchange_strong@PEAUArena@LowLevelAlloc@base_internal@absl@@@__Cr@std@@YA_NPEAU?$__cxx_atomic_base_impl@PEAUArena@LowLevelAlloc@base_internal@absl@@@01@PEAPEAUArena@LowLevelAlloc@base_internal@absl@@PEAU3456@W4memory_order@01@3@Z + ??$__cxx_atomic_compare_exchange_strong@PEAVTimeZone@absl@@@__Cr@std@@YA_NPEAU?$__cxx_atomic_base_impl@PEAVTimeZone@absl@@@01@PEAPEAVTimeZone@absl@@PEAV34@W4memory_order@01@3@Z + ??$__cxx_atomic_compare_exchange_strong@PEAVVLogSite@log_internal@absl@@@__Cr@std@@YA_NPEAU?$__cxx_atomic_base_impl@PEAVVLogSite@log_internal@absl@@@01@PEAPEAVVLogSite@log_internal@absl@@PEAV345@W4memory_order@01@3@Z + ??$__cxx_atomic_compare_exchange_weak@PEAUHashtablezInfo@container_internal@absl@@@__Cr@std@@YA_NPEAU?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@01@PEAPEAUHashtablezInfo@container_internal@absl@@PEAU345@W4memory_order@01@3@Z + ??$__cxx_atomic_compare_exchange_weak@PEAVVLogSite@log_internal@absl@@@__Cr@std@@YA_NPEAU?$__cxx_atomic_base_impl@PEAVVLogSite@log_internal@absl@@@01@PEAPEAVVLogSite@log_internal@absl@@PEAV345@W4memory_order@01@3@Z + ??$__cxx_atomic_exchange@PEAVVLogSite@log_internal@absl@@@__Cr@std@@YAPEAVVLogSite@log_internal@absl@@PEAU?$__cxx_atomic_base_impl@PEAVVLogSite@log_internal@absl@@@01@PEAV234@W4memory_order@01@@Z + ??$__cxx_atomic_load@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__Cr@std@@YAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZPEBU?$__cxx_atomic_base_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAUArena@LowLevelAlloc@base_internal@absl@@@__Cr@std@@YAPEAUArena@LowLevelAlloc@base_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAUArena@LowLevelAlloc@base_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAUHashtablezInfo@container_internal@absl@@@__Cr@std@@YAPEAUHashtablezInfo@container_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPEAVCordzHandle@cord_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAVCordzHandle@cord_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAVCordzInfo@cord_internal@absl@@@__Cr@std@@YAPEAVCordzInfo@cord_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAVTimeZone@absl@@@__Cr@std@@YAPEAVTimeZone@absl@@PEBU?$__cxx_atomic_base_impl@PEAVTimeZone@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAVVLogSite@log_internal@absl@@@__Cr@std@@YAPEAVVLogSite@log_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAVVLogSite@log_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@VMaskedPointer@flags_internal@absl@@@__Cr@std@@YA?AVMaskedPointer@flags_internal@absl@@PEBU?$__cxx_atomic_base_impl@VMaskedPointer@flags_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@W4OnDeadlockCycle@absl@@@__Cr@std@@YA?AW4OnDeadlockCycle@absl@@PEBU?$__cxx_atomic_base_impl@W4OnDeadlockCycle@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@W4State@PerThreadSynch@base_internal@absl@@@__Cr@std@@YA?AW4State@PerThreadSynch@base_internal@absl@@PEBU?$__cxx_atomic_base_impl@W4State@PerThreadSynch@base_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_store@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXPEAU?$__cxx_atomic_base_impl@PEAVCordzHandle@cord_internal@absl@@@01@PEAVCordzHandle@cord_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@PEAVCordzInfo@cord_internal@absl@@@__Cr@std@@YAXPEAU?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@01@PEAVCordzInfo@cord_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@PEAVVLogSite@log_internal@absl@@@__Cr@std@@YAXPEAU?$__cxx_atomic_base_impl@PEAVVLogSite@log_internal@absl@@@01@PEAVVLogSite@log_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@VMaskedPointer@flags_internal@absl@@@__Cr@std@@YAXPEAU?$__cxx_atomic_base_impl@VMaskedPointer@flags_internal@absl@@@01@VMaskedPointer@flags_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@W4OnDeadlockCycle@absl@@@__Cr@std@@YAXPEAU?$__cxx_atomic_base_impl@W4OnDeadlockCycle@absl@@@01@W4OnDeadlockCycle@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@W4State@PerThreadSynch@base_internal@absl@@@__Cr@std@@YAXPEAU?$__cxx_atomic_base_impl@W4State@PerThreadSynch@base_internal@absl@@@01@W4State@PerThreadSynch@base_internal@absl@@W4memory_order@01@@Z + ??$__debug_randomize_range@U_ClassicAlgPolicy@__Cr@std@@PEAPEAVCommandLineFlag@absl@@PEAPEAV45@@__Cr@std@@YAXPEAPEAVCommandLineFlag@absl@@0@Z + ??$__debug_randomize_range@U_ClassicAlgPolicy@__Cr@std@@PEAPEBVCommandLineFlag@absl@@PEAPEBV45@@__Cr@std@@YAXPEAPEBVCommandLineFlag@absl@@0@Z + ??$__debug_randomize_range@U_ClassicAlgPolicy@__Cr@std@@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@V423@@__Cr@std@@YAXV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@0@Z + ??$__debug_randomize_range@U_ClassicAlgPolicy@__Cr@std@@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@23@V423@@__Cr@std@@YAXV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@0@Z + ??$__destroy_at@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@$0A@@__Cr@std@@YAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$__destroy_at@PEAUCordRep@cord_internal@absl@@$0A@@__Cr@std@@YAXPEAPEAUCordRep@cord_internal@absl@@@Z + ??$__destroy_at@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$0A@@__Cr@std@@YAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$__destroy_at@PEAVCommandLineFlag@absl@@$0A@@__Cr@std@@YAXPEAPEAVCommandLineFlag@absl@@@Z + ??$__destroy_at@PEAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@YAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ??$__destroy_at@PEAVLogSink@absl@@$0A@@__Cr@std@@YAXPEAPEAVLogSink@absl@@@Z + ??$__destroy_at@PEBUCordRep@cord_internal@absl@@$0A@@__Cr@std@@YAXPEAPEBUCordRep@cord_internal@absl@@@Z + ??$__destroy_at@PEBVCommandLineFlag@absl@@$0A@@__Cr@std@@YAXPEAPEBVCommandLineFlag@absl@@@Z + ??$__destroy_at@PEBVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@YAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ??$__destroy_at@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@@Z + ??$__destroy_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@@Z + ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@@Z + ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@@Z + ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@@Z + ??$__destroy_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@@Z + ??$__destroy_at@UConversionItem@ParsedFormatBase@str_format_internal@absl@@$0A@@__Cr@std@@YAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ??$__destroy_at@UPayload@status_internal@absl@@$0A@@__Cr@std@@YAXPEAUPayload@status_internal@absl@@@Z + ??$__destroy_at@UPrefixCrc@CrcCordState@crc_internal@absl@@$0A@@__Cr@std@@YAXPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$__destroy_at@UTransition@cctz@time_internal@absl@@$0A@@__Cr@std@@YAXPEAUTransition@cctz@time_internal@absl@@@Z + ??$__destroy_at@UTransitionType@cctz@time_internal@absl@@$0A@@__Cr@std@@YAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ??$__destroy_at@UUnrecognizedFlag@absl@@$0A@@__Cr@std@@YAXPEAUUnrecognizedFlag@absl@@@Z + ??$__destroy_at@UViableSubstitution@strings_internal@absl@@$0A@@__Cr@std@@YAXPEAUViableSubstitution@strings_internal@absl@@@Z + ??$__destroy_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@$0A@@__Cr@std@@YAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$00@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$01@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$02@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$0A@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__distance@PEBUPayload@status_internal@absl@@$0A@@__Cr@std@@YA_JPEBUPayload@status_internal@absl@@0@Z + ??$__distance@PEBUTransition@cctz@time_internal@absl@@$0A@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0@Z + ??$__distance@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0@Z + ??$__distance@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@0@Z + ??$__distance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@0@Z + ??$__distance@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@0@Z + ??$__distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YA_JV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z + ??$__do_rehash@$00@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAX_K@Z + ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z + ??$__emplace_back_assume_capacity@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??$__emplace_back_assume_capacity@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??$__emplace_back_assume_capacity@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV312@AEA_K@Z + ??$__emplace_back_assume_capacity@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEAVCommandLineFlag@absl@@@Z + ??$__emplace_back_assume_capacity@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z + ??$__emplace_back_assume_capacity@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEAVLogSink@absl@@@Z + ??$__emplace_back_assume_capacity@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEBVCommandLineFlag@absl@@@Z + ??$__emplace_back_assume_capacity@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z + ??$__emplace_back_assume_capacity@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBUTransition@cctz@time_internal@absl@@@Z + ??$__emplace_back_assume_capacity@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBUUnrecognizedFlag@absl@@@Z + ??$__emplace_back_assume_capacity@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEBVCommandLineFlag@absl@@@Z + ??$__emplace_back_assume_capacity@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ??$__emplace_back_assume_capacity@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAX$$QEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@@Z + ??$__emplace_back_assume_capacity@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAW4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$__emplace_back_slow_path@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV612@AEA_K@Z + ??$__emplace_back_slow_path@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEAVCommandLineFlag@absl@@AEBQEAV34@@Z + ??$__emplace_back_slow_path@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV345@@Z + ??$__emplace_back_slow_path@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEAVLogSink@absl@@AEBQEAV34@@Z + ??$__emplace_back_slow_path@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEBVCommandLineFlag@absl@@AEBQEBV34@@Z + ??$__emplace_back_slow_path@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV345@@Z + ??$__emplace_back_slow_path@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEBU3456@@Z + ??$__emplace_back_slow_path@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@AEBU34@@Z + ??$__emplace_back_slow_path@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEBVCommandLineFlag@absl@@$$QEAPEBV34@@Z + ??$__emplace_back_slow_path@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU3456@@Z + ??$__emplace_back_slow_path@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QEAV312@@Z + ??$__emplace_back_slow_path@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@$$QEAW4Source@34@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBQEBUCordRep@cord_internal@absl@@@Z + ??$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$__find@PEAVLogSink@absl@@PEAV12@U__identity@__Cr@std@@$0A@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0AEBQEAV23@AEAU__identity@01@@Z + ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@__Cr@std@@AEAPEAV?$__tree_node_base@PEAX@23@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@__Cr@std@@AEAPEAV?$__tree_node_base@PEAX@23@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__find_loop@PEAPEAVLogSink@absl@@PEAPEAV12@PEAV12@U__identity@__Cr@std@@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0AEBQEAV23@AEAU__identity@01@@Z + ??$__for_each_segment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@23@@__Cr@std@@YAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@01@@Z + ??$__get_alt@$00AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__get_alt@$01AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__get_alt@$02AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__get_alt@$0A@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__get_alt@AEAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$00@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$00@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$01@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$01@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$0A@@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$01V?$Span@$$CBD@absl@@V?$variant@IHM@__Cr@std@@@__variant_detail@__Cr@std@@$00@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$01V?$Span@$$CBD@absl@@V?$variant@IHM@__Cr@std@@@234@U?$in_place_index_t@$00@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$01V?$Span@$$CBD@absl@@V?$variant@IHM@__Cr@std@@@__variant_detail@__Cr@std@@@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$01V?$Span@$$CBD@absl@@V?$variant@IHM@__Cr@std@@@234@U?$in_place_index_t@$0A@@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$00@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$00@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$01@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$01@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$02@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$02@34@@Z + ??$__get_alt@AEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__union@__access@__variant_detail@__Cr@std@@SA$$QEA_PAEAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$0A@@34@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@AEBV834@AEA_K@Z@V@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@234@QEAAAEAU567@012@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@01@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV701@AEA_K@Z@V@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@301@QEAAAEAU456@123@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV56@@Z@V@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@234@QEAAAEAPEAV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@01@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@V@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@301@QEAAAEAPEAV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV567@@Z@V@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@234@QEAAAEAPEAV567@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@01@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@V@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@301@QEAAAEAPEAV456@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV56@@Z@V@?0???$emplace_back@AEBQEAVLogSink@absl@@@234@QEAAAEAPEAV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@01@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@V@?0???$emplace_back@AEBQEAVLogSink@absl@@@301@QEAAAEAPEAV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV56@@Z@V@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@234@QEAAAEAPEBV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@01@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@V@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@301@QEAAAEAPEBV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV567@@Z@V@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@234@QEAAAEAPEBV567@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@01@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@V@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@301@QEAAAEAPEBV456@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU5678@@Z@V@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@234@QEAAAEAU5678@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@01@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@V@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@301@QEAAAEAU4567@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU56@@Z@V@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@234@QEAAAEAU56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@QEAAAEAUUnrecognizedFlag@absl@@AEBU45@@Z@V@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@301@QEAAAEAU45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV56@@Z@V@?0???$emplace_back@PEBVCommandLineFlag@absl@@@234@QEAAAEAPEBV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@01@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@V@?0???$emplace_back@PEBVCommandLineFlag@absl@@@301@QEAAAEAPEBV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU5678@@Z@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@234@QEAAAEAU5678@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@01@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@301@QEAAAEAU4567@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@34@$$QEAV534@@Z@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@234@QEAAAEAV534@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@01@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@$$QEAV401@@Z@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@301@QEAAAEAV401@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@56@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@234@QEAAAEAU56@01@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@301@QEAAAEAU45@12@Z@@Z + ??$__in_bounds@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@$0A@@__unique_ptr_array_bounds_stateless@__Cr@std@@QEBA_NPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@_K@Z + ??$__in_bounds@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@$0A@@__unique_ptr_array_bounds_stateless@__Cr@std@@QEBA_NPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@_K@Z + ??$__insert_assign_n_unchecked@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@_JPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$__insert_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@1_J@Z + ??$__invoke@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K@__Cr@std@@YA_KAEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QEA_K@Z + ??$__invoke@AEAUByCivilTime@Transition@cctz@time_internal@absl@@AEBU2345@AEBU2345@@__Cr@std@@YA_NAEAUByCivilTime@Transition@cctz@time_internal@absl@@AEBU3456@1@Z + ??$__invoke@AEAUByUnixTime@Transition@cctz@time_internal@absl@@AEBU2345@AEBU2345@@__Cr@std@@YA_NAEAUByUnixTime@Transition@cctz@time_internal@absl@@AEBU3456@1@Z + ??$__invoke@AEAU__identity@__Cr@std@@AEAPEAVLogSink@absl@@@__Cr@std@@YAAEAPEAVLogSink@absl@@AEAU__identity@01@AEAPEAV23@@Z + ??$__invoke@AEAU__identity@__Cr@std@@AEAPEBVCommandLineFlag@absl@@@__Cr@std@@YAAEAPEBVCommandLineFlag@absl@@AEAU__identity@01@AEAPEBV23@@Z + ??$__invoke@AEAU__identity@__Cr@std@@AEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAAEBUTransition@cctz@time_internal@absl@@AEAU__identity@01@AEBU2345@@Z + ??$__invoke@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@__Cr@std@@YAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@6@@Z + ??$__invoke@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@__Cr@std@@YAX$$QEAP8FlagImpl@flags_internal@absl@@EAAXXZ$$QEAPEAV234@@Z + ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@456@@__Cr@std@@YA_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AEAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@501@@Z + ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAU?$__alt@$01V?$Span@$$CBD@absl@@@456@@__Cr@std@@YA_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AEAU?$__alt@$01V?$Span@$$CBD@absl@@@501@@Z + ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAU?$__alt@$02V?$variant@IHM@__Cr@std@@@456@@__Cr@std@@YA_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AEAU?$__alt@$02V?$variant@IHM@__Cr@std@@@501@@Z + ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAU?$__alt@$0A@V?$variant@_K_JIH_N@__Cr@std@@@456@@__Cr@std@@YA_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AEAU?$__alt@$0A@V?$variant@_K_JIH_N@__Cr@std@@@501@@Z + ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$Span@$$CBD@4@@__Cr@std@@YA_K$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@45@@Z@AEAV?$Span@$$CBD@5@@Z + ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@IHM@__Cr@std@@@__Cr@std@@YA_K$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@45@@Z@AEAV?$variant@IHM@01@@Z + ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@_K_JIH_N@__Cr@std@@@__Cr@std@@YA_K$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@45@@Z@AEAV?$variant@_K_JIH_N@01@@Z + ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@_K_JN@__Cr@std@@@__Cr@std@@YA_K$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@45@@Z@AEAV?$variant@_K_JN@01@@Z + ??$__invoke_r@XAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@__Cr@std@@YAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@6@@Z + ??$__is_null@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@__function@__Cr@std@@YA_NAEBV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@Z + ??$__iter_move@AEAPEAPEAVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEAVCommandLineFlag@absl@@AEAPEAPEAV34@@Z + ??$__iter_move@AEAPEAPEBVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEBVCommandLineFlag@absl@@AEAPEAPEBV34@@Z + ??$__iter_move@PEAPEAVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEAVCommandLineFlag@absl@@$$QEAPEAPEAV34@@Z + ??$__iter_move@PEAPEBVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QEAPEBVCommandLineFlag@absl@@$$QEAPEAPEBV34@@Z + ??$__libcpp_allocate@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEAUCordRep@cord_internal@absl@@@__Cr@std@@YAPEAPEAUCordRep@cord_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEAVCommandLineFlag@absl@@@__Cr@std@@YAPEAPEAVCommandLineFlag@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEAVLogSink@absl@@@__Cr@std@@YAPEAPEAVLogSink@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEBVCommandLineFlag@absl@@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@YAPEAU?$AlignedType@$07@container_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_allocate@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@YAPEAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@34@PEBXPEAX2@Z@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UPayload@status_internal@absl@@@__Cr@std@@YAPEAUPayload@status_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UTransition@cctz@time_internal@absl@@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UUnrecognizedFlag@absl@@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_allocate@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_allocate@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_allocate@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@W4__element_count@01@_K@Z + ??$__libcpp_allocate@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAUCordRep@cord_internal@absl@@@__Cr@std@@YAXPEAPEAUCordRep@cord_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAVCommandLineFlag@absl@@@__Cr@std@@YAXPEAPEAVCommandLineFlag@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXPEAPEAVCordzHandle@cord_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEAVLogSink@absl@@@__Cr@std@@YAXPEAPEAVLogSink@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEBVCommandLineFlag@absl@@@__Cr@std@@YAXPEAPEBVCommandLineFlag@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXPEAPEBVCordzHandle@cord_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAXPEAPEBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@YAXPEAU?$AlignedType@$07@container_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@YAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@YAXPEAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@34@PEBXPEAX2@Z@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UPayload@status_internal@absl@@@__Cr@std@@YAXPEAUPayload@status_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAXPEAUPrefixCrc@CrcCordState@crc_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UTransition@cctz@time_internal@absl@@@__Cr@std@@YAXPEAUTransition@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAXPEAUTransitionType@cctz@time_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UUnrecognizedFlag@absl@@@__Cr@std@@YAXPEAUUnrecognizedFlag@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXPEAUViableSubstitution@strings_internal@absl@@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@01@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@W4__element_count@01@_K@Z + ??$__libcpp_deallocate@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAXPEAVFormatArgImpl@str_format_internal@absl@@W4__element_count@01@_K@Z + ??$__lower_bound@U_ClassicAlgPolicy@__Cr@std@@PEBUTransition@cctz@time_internal@absl@@PEBU4567@U4567@U__identity@23@UByUnixTime@4567@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@AEAUByUnixTime@2345@AEAU__identity@01@@Z + ??$__lower_bound_bisecting@U_ClassicAlgPolicy@__Cr@std@@PEBUTransition@cctz@time_internal@absl@@U4567@U__identity@23@UByUnixTime@4567@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@AEBU2345@_JAEAUByUnixTime@2345@AEAU__identity@01@@Z + ??$__make_exception_guard@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@__Cr@std@@YA?AU?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@01@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@01@AEAAX_K@Z@@Z + ??$__make_exception_guard@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@01@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@01@@Z + ??$__make_value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@CA?A_P$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@78@@Z@@Z + ??$__memberwise_forward_assign@V?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@V?$tuple@PEAVCommandLineFlag@absl@@_N@23@PEAVCommandLineFlag@absl@@_N$$Z$0A@$00@__Cr@std@@YAXAEAV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@$$QEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@U?$__tuple_types@PEAVCommandLineFlag@absl@@_N@01@U?$__integer_sequence@_K$0A@$00@01@@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@PEAPEAPEBV45678@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@PEAPEAU4567@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PEAPEAVLogSink@absl@@PEAPEAV45@PEAPEAV45@@__Cr@std@@YA?AU?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@01@PEAPEAVLogSink@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@PEAU4567@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@PEAU4567@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@PEAPEAPEBV45678@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@PEAPEAU4567@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@PEAU4567@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@PEAU4567@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__rehash@$00@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAX_K@Z + ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z + ??$__rewrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@U?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0@Z + ??$__rewrap_iter@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@U?$__unwrap_iter_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@0@Z + ??$__rewrap_iter@PEAPEAVLogSink@absl@@PEAPEAV12@U?$__unwrap_iter_impl@PEAPEAVLogSink@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0@Z + ??$__rewrap_iter@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@U?$__unwrap_iter_impl@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@0@Z + ??$__rewrap_iter@PEAUTransition@cctz@time_internal@absl@@PEAU1234@U?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@0@Z + ??$__rewrap_iter@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@U?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@0@Z + ??$__rewrap_iter@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@U?$__unwrap_iter_impl@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU2345@0@Z + ??$__rewrap_iter@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@V123@U?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V201@0@Z + ??$__rewrap_iter@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@U?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@V201@0@Z + ??$__rewrap_iter@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@U?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@$00@23@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@01@V201@PEAPEAVLogSink@absl@@@Z + ??$__rewrap_range@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@PEAPEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0@Z + ??$__rewrap_range@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@PEAPEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@0@Z + ??$__rewrap_range@PEAPEAVLogSink@absl@@PEAPEAV12@PEAPEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@0@Z + ??$__rewrap_range@PEAUTransition@cctz@time_internal@absl@@PEAU1234@PEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@0@Z + ??$__rewrap_range@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@PEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@0@Z + ??$__rewrap_range@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@PEBU1234@@__Cr@std@@YAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU2345@0@Z + ??$__rewrap_range@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@V123@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@V201@0@Z + ??$__std_visit_exhaustive_visitor_check@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$Span@$$CBD@4@@__variant@__visitation@__variant_detail@__Cr@std@@CAXXZ + ??$__std_visit_exhaustive_visitor_check@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@IHM@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@CAXXZ + ??$__std_visit_exhaustive_visitor_check@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@_K_JIH_N@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@CAXXZ + ??$__std_visit_exhaustive_visitor_check@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@_K_JN@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@CAXXZ + ??$__swap_allocator@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$allocator@UUnrecognizedFlag@absl@@@01@0@Z + ??$__swap_allocator@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$allocator@UUnrecognizedFlag@absl@@@01@0U?$integral_constant@_N$0A@@01@@Z + ??$__swap_bitmap_pos@U_ClassicAlgPolicy@__Cr@std@@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@YAXPEAPEAVCommandLineFlag@absl@@0AEA_K1@Z + ??$__swap_bitmap_pos@U_ClassicAlgPolicy@__Cr@std@@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@YAXPEAPEBVCommandLineFlag@absl@@0AEA_K1@Z + ??$__swap_bitmap_pos_within@U_ClassicAlgPolicy@__Cr@std@@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEAPEAVCommandLineFlag@absl@@0AEA_K1@Z + ??$__swap_bitmap_pos_within@U_ClassicAlgPolicy@__Cr@std@@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEAPEBVCommandLineFlag@absl@@0AEA_K1@Z + ??$__throw_if_valueless@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@@__Cr@std@@YAXAEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@01@@Z + ??$__to_address@$$CBUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU2345@@Z + ??$__to_address@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@@Z + ??$__to_address@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@PEAPEAU201@@Z + ??$__to_address@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@PEAPEAU201@@Z + ??$__to_address@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@@Z + ??$__to_address@PEAVCommandLineFlag@absl@@@__Cr@std@@YAPEAPEAVCommandLineFlag@absl@@PEAPEAV23@@Z + ??$__to_address@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV234@@Z + ??$__to_address@PEAVLogSink@absl@@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@@Z + ??$__to_address@PEBVCommandLineFlag@absl@@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@@Z + ??$__to_address@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@@Z + ??$__to_address@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@@Z + ??$__to_address@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@@Z + ??$__to_address@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU2345@@Z + ??$__to_address@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@@Z + ??$__to_address@UTransition@cctz@time_internal@absl@@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z + ??$__to_address@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z + ??$__to_address@UUnrecognizedFlag@absl@@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@@Z + ??$__to_address@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@@Z + ??$__to_address@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@YAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV456@@Z@PEAU2?1???R3456@QEBA?AV701@0@Z@@Z + ??$__to_address@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAPEAPEAVCommandLineFlag@absl@@AEBV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@@Z + ??$__to_address@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@$0A@@__Cr@std@@YAPEAPEAVLogSink@absl@@AEBV?$__wrap_iter@PEAPEAVLogSink@absl@@@01@@Z + ??$__to_address@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@AEBV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@@Z + ??$__to_address@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV456@@Z@AEBV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@@Z + ??$__to_address@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PEAV201@@Z + ??$__try_key_extraction@PEBUCordRep@cord_internal@absl@@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@67@AEBQEBU123@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@567@QEAA?AU867@0@Z@AEBQEBU123@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@01@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@01@QEAA?AU201@AEBQEBUCordRep@cord_internal@absl@@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@401@QEAA?AU201@0@Z@0@Z + ??$__try_key_extraction@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@23@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@523@QEAA?AU623@012@Z@AEBU723@V823@V923@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@401@QEAA?AU201@012@Z@012@Z + ??$__try_key_extraction@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@523@QEAA?AU623@012@Z@AEBU723@V823@V923@@__Cr@std@@YA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@401@QEAA?AU201@012@Z@012@Z + ??$__try_key_extraction_impl@PEBUCordRep@cord_internal@absl@@U?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@56@QEAA?AU456@AEBQEBU123@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@856@QEAA?AU456@0@Z@AEBQEBU123@$0A@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@01@QEAA?AU201@AEBQEBUCordRep@cord_internal@absl@@@Z@V@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@501@QEAA?AU201@1@Z@1@Z + ??$__try_key_extraction_impl@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@23@QEAA?AU423@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@623@QEAA?AU423@012@Z@AEBU723@V823@V923@$0A@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@501@QEAA?AU201@123@Z@123@Z + ??$__try_key_extraction_impl@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@QEAA?AU423@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@623@QEAA?AU423@012@Z@AEBU723@V823@V923@$0A@@__Cr@std@@YA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@01@QEAA?AU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@501@QEAA?AU201@123@Z@123@Z + ??$__uninitialized_allocator_copy@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@V423@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@1PEAV201@@Z + ??$__uninitialized_allocator_copy_impl@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@PEAU4?1???R5678@QEBA?AV923@0@Z@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV567@@Z@2PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@YAXAEAV?$allocator@PEAVCommandLineFlag@absl@@@01@PEAPEAVCommandLineFlag@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@PEAPEAVCordzHandle@cord_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@__Cr@std@@YAXAEAV?$allocator@PEAVLogSink@absl@@@01@PEAPEAVLogSink@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@YAXAEAV?$allocator@PEBVCommandLineFlag@absl@@@01@PEAPEBVCommandLineFlag@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@PEAPEBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@PEAPEBVCordzHandle@cord_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@YAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PEAUTransition@cctz@time_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PEAUTransitionType@cctz@time_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@YAXAEAV?$allocator@UUnrecognizedFlag@absl@@@01@PEAUUnrecognizedFlag@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@PEAUViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@PEAUViableSubstitution@strings_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YAXAEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@11@Z + ??$__unwrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@@Z + ??$__unwrap_iter@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$__unwrap_iter_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@@Z + ??$__unwrap_iter@PEAPEAVLogSink@absl@@U?$__unwrap_iter_impl@PEAPEAVLogSink@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@@Z + ??$__unwrap_iter@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$__unwrap_iter_impl@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@@Z + ??$__unwrap_iter@PEAUTransition@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z + ??$__unwrap_iter@PEAUTransitionType@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z + ??$__unwrap_iter@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@U?$__unwrap_iter_impl@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU2345@@Z + ??$__unwrap_iter@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@U?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@$0A@@23@$0A@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V201@@Z + ??$__unwrap_iter@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@U?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@$0A@@23@$0A@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@V201@@Z + ??$__unwrap_iter@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@U?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@$00@23@$0A@@__Cr@std@@YAPEAPEAVCommandLineFlag@absl@@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@@Z + ??$__unwrap_iter@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@U?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@$00@23@$0A@@__Cr@std@@YAPEAPEAVLogSink@absl@@V?$__wrap_iter@PEAPEAVLogSink@absl@@@01@@Z + ??$__unwrap_iter@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@U?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@$00@23@$0A@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@@Z + ??$__unwrap_iter@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@U?$__unwrap_iter_impl@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$00@23@$0A@@__Cr@std@@YAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV456@@Z@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@@Z + ??$__unwrap_range@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@YA?A_PPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$__unwrap_range@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@YA?A_PPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$__unwrap_range@PEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@YA?A_PPEAPEAVLogSink@absl@@0@Z + ??$__unwrap_range@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YA?A_PPEAUTransition@cctz@time_internal@absl@@0@Z + ??$__unwrap_range@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YA?A_PPEAUTransitionType@cctz@time_internal@absl@@0@Z + ??$__unwrap_range@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@@__Cr@std@@YA?A_PPEBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$__unwrap_range@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@@__Cr@std@@YA?A_PV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0@Z + ??$__unwrap_range@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@__Cr@std@@YA?A_PV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@0@Z + ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByCivilTime@2345@$$QEAU__identity@01@@Z + ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByUnixTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByUnixTime@2345@$$QEAU__identity@01@@Z + ??$__validate_iter_reference@AEAPEAPEAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@AEAPEAPEBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@PEAPEAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@PEAPEBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__visit_alt@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__impl@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@1234@AEAV?$__impl@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__visit_alt@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@56@@__variant@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@01234@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@34@@Z + ??$__visit_value@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@78@@Z@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@34@@Z + ??$advance@PEBUTransition@cctz@time_internal@absl@@_J@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z + ??$advance@PEBUTransition@cctz@time_internal@absl@@_J_J$0A@@__Cr@std@@YAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z + ??$advance@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@_J_J$0A@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@_J@Z + ??$advance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@_J@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@12@_J@Z + ??$advance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@_J_J$0A@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@_J@Z + ??$advance@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@_J_J$0A@@__Cr@std@@YAXAEAV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@_J@Z + ??$allocate_at_least@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@12@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@12@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAPEAVCommandLineFlag@absl@@_K@12@AEAV?$allocator@PEAVCommandLineFlag@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAPEAVCordzHandle@cord_internal@absl@@_K@12@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAPEAVLogSink@absl@@_K@12@AEAV?$allocator@PEAVLogSink@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAPEBVCommandLineFlag@absl@@_K@12@AEAV?$allocator@PEBVCommandLineFlag@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAPEBVCordzHandle@cord_internal@absl@@_K@12@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@12@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAUTransition@cctz@time_internal@absl@@_K@12@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAUTransitionType@cctz@time_internal@absl@@_K@12@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAUUnrecognizedFlag@absl@@_K@12@AEAV?$allocator@UUnrecognizedFlag@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAUViableSubstitution@strings_internal@absl@@_K@12@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@_K@Z + ??$allocate_at_least@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@_K@12@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@_K@Z + ??$apply@U?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA_N$$QEAU?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@12@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@U?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA_N$$QEAU?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@12@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@U?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA_K$$QEAU?$HashElement@UStringHash@container_internal@absl@@$00@12@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@U?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA_K$$QEAU?$HashElement@UStringHash@container_internal@absl@@$00@12@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z + ??$apply@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z + ??$apply@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z + ??$apply@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z + ??$apply@UFindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?AVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QEAUFindElement@412@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@UFindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA?AVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QEAUFindElement@412@AEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@$0A@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0@Z + ??$begin@V?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@AEAV?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@01@@Z + ??$begin@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@AEAV?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@01@@Z + ??$bit_cast@U?$FlagValueAndInitBit@_N@flags_internal@absl@@_J@__Cr@std@@YA?AU?$FlagValueAndInitBit@_N@flags_internal@absl@@AEB_J@Z + ??$c_begin@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@container_algorithm_internal@absl@@YA?AV?$__wrap_iter@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@AEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@@Z + ??$c_end@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@container_algorithm_internal@absl@@YA?AV?$__wrap_iter@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@AEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@@Z + ??$call_once@A6AXXZ$$V@absl@@YAXAEAVonce_flag@0@A6AXXZ@Z + ??$call_once@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@absl@@YAXAEAVonce_flag@0@$$QEAP8FlagImpl@flags_internal@0@EAAXXZ$$QEAPEAV230@@Z + ??$combine@H$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@AEBH@Z + ??$combine@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$combine@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@Z + ??$combine@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@AEBV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@Z + ??$combine@V?$tuple@AEB_K@__Cr@std@@$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@AEBV?$tuple@AEB_K@__Cr@std@@@Z + ??$combine@_K$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@AEB_K@Z + ??$combine_contiguous@D@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@PEBD_K@Z + ??$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z + ??$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z + ??$construct@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEBV12345@$0A@@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEBV45678@@Z + ??$construct@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@$0A@@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$$QEAPEAPEBV45678@@Z + ??$construct@PEAUCordRep@cord_internal@absl@@AEBQEAU123@$0A@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@AEBQEAU456@@Z + ??$construct@PEAUCordRep@cord_internal@absl@@PEAU123@$0A@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@$$QEAPEAU456@@Z + ??$construct@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAPEAU1234@$0A@@?$allocator_traits@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAPEAU4567@@Z + ??$construct@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@$0A@@?$allocator_traits@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAU4567@@Z + ??$construct@PEAVCommandLineFlag@absl@@AEBQEAV12@$0A@@?$allocator_traits@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVCommandLineFlag@absl@@@12@PEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z + ??$construct@PEAVCordzHandle@cord_internal@absl@@AEBQEAV123@$0A@@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@PEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z + ??$construct@PEAVLogSink@absl@@AEBQEAV12@$0A@@?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVLogSink@absl@@@12@PEAPEAVLogSink@absl@@AEBQEAV45@@Z + ??$construct@PEAVLogSink@absl@@PEAV12@$0A@@?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVLogSink@absl@@@12@PEAPEAVLogSink@absl@@$$QEAPEAV45@@Z + ??$construct@PEBUCordRep@cord_internal@absl@@AEBQEBU123@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@PEAPEBUCordRep@cord_internal@absl@@AEBQEBU456@@Z + ??$construct@PEBVCommandLineFlag@absl@@AEBQEBV12@$0A@@?$allocator_traits@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVCommandLineFlag@absl@@@12@PEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z + ??$construct@PEBVCommandLineFlag@absl@@PEBV12@$0A@@?$allocator_traits@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVCommandLineFlag@absl@@@12@PEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z + ??$construct@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@$0A@@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@PEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z + ??$construct@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@$0A@@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV45678@@Z + ??$construct@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$construct@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$construct@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z + ??$construct@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@$0A@@?$allocator_traits@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@12@PEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@Z + ??$construct@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@$0A@@?$allocator_traits@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@12@PEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@12@@Z + ??$construct@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@$0A@@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z + ??$construct@UPayload@status_internal@absl@@AEBU123@$0A@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@12@PEAUPayload@status_internal@absl@@AEBU456@@Z + ??$construct@UPayload@status_internal@absl@@U123@$0A@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@12@PEAUPayload@status_internal@absl@@$$QEAU456@@Z + ??$construct@UPrefixCrc@CrcCordState@crc_internal@absl@@AEBU1234@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEBU4567@@Z + ??$construct@UPrefixCrc@CrcCordState@crc_internal@absl@@HVcrc32c_t@4@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAH$$QEAVcrc32c_t@7@@Z + ??$construct@UPrefixCrc@CrcCordState@crc_internal@absl@@U1234@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAU4567@@Z + ??$construct@UTransition@cctz@time_internal@absl@@$$V$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PEAUTransition@cctz@time_internal@absl@@@Z + ??$construct@UTransition@cctz@time_internal@absl@@AEBU1234@$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z + ??$construct@UTransition@cctz@time_internal@absl@@U1234@$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PEAUTransition@cctz@time_internal@absl@@$$QEAU4567@@Z + ??$construct@UTransitionType@cctz@time_internal@absl@@$$V$0A@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@PEAUTransitionType@cctz@time_internal@absl@@@Z + ??$construct@UTransitionType@cctz@time_internal@absl@@U1234@$0A@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@PEAUTransitionType@cctz@time_internal@absl@@$$QEAU4567@@Z + ??$construct@UUnrecognizedFlag@absl@@AEBU12@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UUnrecognizedFlag@absl@@@12@PEAUUnrecognizedFlag@absl@@AEBU45@@Z + ??$construct@UUnrecognizedFlag@absl@@U12@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UUnrecognizedFlag@absl@@@12@PEAUUnrecognizedFlag@absl@@$$QEAU45@@Z + ??$construct@UUnrecognizedFlag@absl@@W4Source@12@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UUnrecognizedFlag@absl@@@12@PEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$construct@UViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@AEA_K$0A@@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@PEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV712@AEA_K@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@AEBUpiecewise_construct_t@45@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@$0A@@?$allocator_traits@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@AEBV789@@Z@@Z + ??$construct@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@$0A@@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QEAV412@@Z + ??$construct@VFormatArgImpl@str_format_internal@absl@@AEBV123@$0A@@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@12@PEAVFormatArgImpl@str_format_internal@absl@@AEBV456@@Z + ??$construct_at@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEBV12345@PEAPEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@AEAPEAPEBV23456@@Z + ??$construct_at@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@PEAPEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@$$QEAPEAPEBV23456@@Z + ??$construct_at@PEAUCordRep@cord_internal@absl@@AEBQEAU123@PEAPEAU123@@__Cr@std@@YAPEAPEAUCordRep@cord_internal@absl@@PEAPEAU234@AEBQEAU234@@Z + ??$construct_at@PEAUCordRep@cord_internal@absl@@PEAU123@PEAPEAU123@@__Cr@std@@YAPEAPEAUCordRep@cord_internal@absl@@PEAPEAU234@$$QEAPEAU234@@Z + ??$construct_at@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAPEAU1234@PEAPEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@AEAPEAU2345@@Z + ??$construct_at@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@PEAPEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@$$QEAPEAU2345@@Z + ??$construct_at@PEAVCommandLineFlag@absl@@AEBQEAV12@PEAPEAV12@@__Cr@std@@YAPEAPEAVCommandLineFlag@absl@@PEAPEAV23@AEBQEAV23@@Z + ??$construct_at@PEAVCordzHandle@cord_internal@absl@@AEBQEAV123@PEAPEAV123@@__Cr@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV234@AEBQEAV234@@Z + ??$construct_at@PEAVLogSink@absl@@AEBQEAV12@PEAPEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@AEBQEAV23@@Z + ??$construct_at@PEAVLogSink@absl@@PEAV12@PEAPEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@$$QEAPEAV23@@Z + ??$construct_at@PEBUCordRep@cord_internal@absl@@AEBQEBU123@PEAPEBU123@@__Cr@std@@YAPEAPEBUCordRep@cord_internal@absl@@PEAPEBU234@AEBQEBU234@@Z + ??$construct_at@PEBVCommandLineFlag@absl@@AEBQEBV12@PEAPEBV12@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@AEBQEBV23@@Z + ??$construct_at@PEBVCommandLineFlag@absl@@PEBV12@PEAPEBV12@@__Cr@std@@YAPEAPEBVCommandLineFlag@absl@@PEAPEBV23@$$QEAPEBV23@@Z + ??$construct_at@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@PEAPEBV123@@__Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@AEBQEBV234@@Z + ??$construct_at@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@PEAPEBV12345@@__Cr@std@@YAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV23456@AEBQEBV23456@@Z + ??$construct_at@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@AEBQEBUCordRep@cord_internal@absl@@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@01@AEBQEBUCordRep@cord_internal@absl@@@Z + ??$construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@01@PEAU201@AEA_KAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$construct_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@PEAU123@@__Cr@std@@YAPEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@01@@Z + ??$construct_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@PEAU123@@__Cr@std@@YAPEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@01@@Z + ??$construct_at@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$construct_at@UPayload@status_internal@absl@@AEBU123@PEAU123@@__Cr@std@@YAPEAUPayload@status_internal@absl@@PEAU234@AEBU234@@Z + ??$construct_at@UPayload@status_internal@absl@@U123@PEAU123@@__Cr@std@@YAPEAUPayload@status_internal@absl@@PEAU234@$$QEAU234@@Z + ??$construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@AEBU1234@PEAU1234@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@AEBU2345@@Z + ??$construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@HVcrc32c_t@4@PEAU1234@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@$$QEAH$$QEAVcrc32c_t@5@@Z + ??$construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$construct_at@UTransition@cctz@time_internal@absl@@$$VPEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z + ??$construct_at@UTransition@cctz@time_internal@absl@@AEBU1234@PEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@AEBU2345@@Z + ??$construct_at@UTransition@cctz@time_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$construct_at@UTransitionType@cctz@time_internal@absl@@$$VPEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z + ??$construct_at@UTransitionType@cctz@time_internal@absl@@U1234@PEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@$$QEAU2345@@Z + ??$construct_at@UUnrecognizedFlag@absl@@AEBU12@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@AEBU23@@Z + ??$construct_at@UUnrecognizedFlag@absl@@U12@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAU23@@Z + ??$construct_at@UUnrecognizedFlag@absl@@W4Source@12@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAU12@@__Cr@std@@YAPEAUUnrecognizedFlag@absl@@PEAU23@$$QEAW4Source@23@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z + ??$construct_at@UViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@AEA_KPEAU123@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV501@AEA_K@Z + ??$construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAV123@@__Cr@std@@YAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@01@PEAV201@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@01@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z + ??$construct_at@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@PEAV123@@__Cr@std@@YAPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@PEAV201@AEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@AEBV567@@Z@@Z + ??$construct_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@PEAV123@@__Cr@std@@YAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PEAV201@$$QEAV201@@Z + ??$construct_at@VFormatArgImpl@str_format_internal@absl@@AEBV123@PEAV123@@__Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@AEBV234@@Z + ??$copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0V201@@Z + ??$copy_n@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@_JV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@$0A@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@_JV201@@Z + ??$destroy@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$destroy@PEAUCordRep@cord_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@@Z + ??$destroy@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$destroy@PEAVCommandLineFlag@absl@@$0A@@?$allocator_traits@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVCommandLineFlag@absl@@@12@PEAPEAVCommandLineFlag@absl@@@Z + ??$destroy@PEAVCordzHandle@cord_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@PEAPEAVCordzHandle@cord_internal@absl@@@Z + ??$destroy@PEAVLogSink@absl@@$0A@@?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVLogSink@absl@@@12@PEAPEAVLogSink@absl@@@Z + ??$destroy@PEBUCordRep@cord_internal@absl@@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@PEAPEBUCordRep@cord_internal@absl@@@Z + ??$destroy@PEBVCommandLineFlag@absl@@$0A@@?$allocator_traits@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVCommandLineFlag@absl@@@12@PEAPEBVCommandLineFlag@absl@@@Z + ??$destroy@PEBVCordzHandle@cord_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@PEAPEBVCordzHandle@cord_internal@absl@@@Z + ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@@Z + ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@@Z + ??$destroy@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@12@PEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@@Z + ??$destroy@UConversionItem@ParsedFormatBase@str_format_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ??$destroy@UPayload@status_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@12@PEAUPayload@status_internal@absl@@@Z + ??$destroy@UPrefixCrc@CrcCordState@crc_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$destroy@UTransition@cctz@time_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PEAUTransition@cctz@time_internal@absl@@@Z + ??$destroy@UTransitionType@cctz@time_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@PEAUTransitionType@cctz@time_internal@absl@@@Z + ??$destroy@UUnrecognizedFlag@absl@@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UUnrecognizedFlag@absl@@@12@PEAUUnrecognizedFlag@absl@@@Z + ??$destroy@UViableSubstitution@strings_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@PEAUViableSubstitution@strings_internal@absl@@@Z + ??$destroy@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@@Z + ??$destroy@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA?A_PPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@@Z + ??$destroy@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@@Z + ??$destroy@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@@Z + ??$distance@PEBUPayload@status_internal@absl@@@__Cr@std@@YA_JPEBUPayload@status_internal@absl@@0@Z + ??$distance@PEBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA_JPEBUTransition@cctz@time_internal@absl@@0@Z + ??$distance@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0@Z + ??$distance@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0@Z + ??$distance@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@0@Z + ??$distance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA_JV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@12@0@Z + ??$distance@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@0@Z + ??$distance@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@__Cr@std@@YA_JV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@0@Z + ??$distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z + ??$distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z + ??$distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0@Z + ??$distance@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z + ??$element@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAAEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@@Z + ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@12@@Z + ??$emplace@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@12@@Z + ??$emplace@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z + ??$emplace@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z + ??$emplace_at@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAAXViterator@012@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z + ??$emplace_at@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAAXViterator@012@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@56@@Z + ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV612@AEA_K@Z + ??$emplace_back@AEBQEAUCordRep@cord_internal@absl@@@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAAEAPEAUCordRep@cord_internal@1@AEBQEAU231@@Z + ??$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV34@@Z + ??$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV345@@Z + ??$emplace_back@AEBQEAVLogSink@absl@@@?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEAAAEAPEAVLogSink@1@AEBQEAV21@@Z + ??$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV34@@Z + ??$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV34@@Z + ??$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV345@@Z + ??$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU3456@@Z + ??$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU34@@Z + ??$emplace_back@HVcrc32c_t@absl@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAH$$QEAVcrc32c_t@6@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV34@@Z + ??$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU3456@@Z + ??$emplace_back@UPayload@status_internal@absl@@@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAAEAUPayload@status_internal@1@$$QEAU231@@Z + ??$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QEAV312@@Z + ??$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@34@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$end@V?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@01@AEAV?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@01@@Z + ??$end@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@01@AEAV?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@01@@Z + ??$find@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@PEAVLogSink@absl@@@__Cr@std@@YA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@01@V201@0AEBQEAVLogSink@absl@@@Z + ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA?AVconst_iterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$find_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$find_or_prepare_insert@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_or_prepare_insert_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_or_prepare_insert_small@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_small@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$forward_as_tuple@AEBQEAVCommandLineFlag@absl@@@__Cr@std@@YA?AV?$tuple@AEBQEAVCommandLineFlag@absl@@@01@AEBQEAVCommandLineFlag@absl@@@Z + ??$forward_as_tuple@PEAVCommandLineFlag@absl@@@__Cr@std@@YA?AV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@01@$$QEAPEAVCommandLineFlag@absl@@@Z + ??$get@$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@container_internal@absl@@QEGAAAEAPEAPEAUCordRep@cord_internal@2@XZ + ??$get@$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEA_KXZ + ??$get@$00@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGBAAEB_KXZ + ??$get@$00@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@container_internal@absl@@QEGAAAEAPEAPEAVLogSink@2@XZ + ??$get@$00@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEA_KXZ + ??$get@$00@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@container_internal@absl@@QEGBAAEB_KXZ + ??$get@$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@container_internal@absl@@QEGAAAEAPEAUPayload@status_internal@2@XZ + ??$get@$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEA_KXZ + ??$get@$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGBAAEB_KXZ + ??$get@$00@?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEA_KXZ + ??$get@$00@?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGBAAEB_KXZ + ??$get@$00@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGAAAEAUStringHash@12@XZ + ??$get@$00@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEBUStringHash@12@XZ + ??$get@$00@?$CompressedTuple@_KV?$allocator@D@__Cr@std@@@container_internal@absl@@QEGAAAEAV?$allocator@D@__Cr@std@@XZ + ??$get@$00AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@YAAEA_NAEAV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@@Z + ??$get@$00AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@YAAEAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@AEAV?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@23@@01@@Z + ??$get@$00PEAVCommandLineFlag@absl@@_N@__Cr@std@@YAAEA_NAEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@@Z + ??$get@$01@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEBUStringEq@12@XZ + ??$get@$02@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGAAAEAV?$allocator@D@__Cr@std@@XZ + ??$get@$0A@$$QEAPEAVCommandLineFlag@absl@@@__Cr@std@@YAAEAPEAVCommandLineFlag@absl@@AEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@01@@Z + ??$get@$0A@@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@container_internal@absl@@QEGAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@container_internal@absl@@QEGAAAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@container_internal@absl@@QEGAAAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGBAAEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@container_internal@absl@@QEGAAAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGAAAEAVCommonFields@12@XZ + ??$get@$0A@@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEBVCommonFields@12@XZ + ??$get@$0A@@?$CompressedTuple@_KV?$allocator@D@__Cr@std@@@container_internal@absl@@QEGBAAEB_KXZ + ??$get@$0A@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@YAAEAPEAVCommandLineFlag@absl@@AEAV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@@Z + ??$get@$0A@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@YAAEAUFindInfo@container_internal@absl@@AEAV?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@23@@01@@Z + ??$get@$0A@AEBQEAVCommandLineFlag@absl@@@__Cr@std@@YAAEBQEAVCommandLineFlag@absl@@AEAV?$tuple@AEBQEAVCommandLineFlag@absl@@@01@@Z + ??$get@$0A@PEAVCommandLineFlag@absl@@_N@__Cr@std@@YA$$QEAPEAVCommandLineFlag@absl@@$$QEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@@Z + ??$get@$0A@PEAVCommandLineFlag@absl@@_N@__Cr@std@@YAAEAPEAVCommandLineFlag@absl@@AEAV?$tuple@PEAVCommandLineFlag@absl@@_N@01@@Z + ??$hash@U?$Hash@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@hash_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@HashWithSeed@hash_internal@absl@@QEBA_KAEBU?$Hash@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$hash@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@HashWithSeed@hash_internal@absl@@QEBA_KAEBUStringHash@container_internal@2@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$hash@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@MixingHashState@hash_internal@absl@@SA_KAEBV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@Z + ??$hash@V?$tuple@AEB_K@__Cr@std@@@MixingHashState@hash_internal@absl@@SA_KAEBV?$tuple@AEB_K@__Cr@std@@@Z + ??$hash_bytes@VMixingHashState@hash_internal@absl@@H$0A@@hash_internal@absl@@YA?AVMixingHashState@01@V201@AEBH@Z + ??$hash_bytes@VMixingHashState@hash_internal@absl@@_K$0A@@hash_internal@absl@@YA?AVMixingHashState@01@V201@AEB_K@Z + ??$hash_range_or_bytes@VMixingHashState@hash_internal@absl@@D@hash_internal@absl@@YA?AVMixingHashState@01@V201@PEBD_K@Z + ??$hash_tuple@VMixingHashState@hash_internal@absl@@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@$0A@$00@hash_internal@absl@@YA?AVMixingHashState@01@V201@AEBV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@U?$integer_sequence@_K$0A@$00@45@@Z + ??$hash_tuple@VMixingHashState@hash_internal@absl@@V?$tuple@AEB_K@__Cr@std@@$0A@@hash_internal@absl@@YA?AVMixingHashState@01@V201@AEBV?$tuple@AEB_K@__Cr@std@@U?$integer_sequence@_K$0A@@45@@Z + ??$hash_with_seed@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@MixingHashState@hash_internal@absl@@SA_KAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$hash_with_seed@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@$0A@@MixingHashState@hash_internal@absl@@SA_KAEBV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@_K@Z + ??$hash_with_seed@V?$tuple@AEB_K@__Cr@std@@$0A@@MixingHashState@hash_internal@absl@@SA_KAEBV?$tuple@AEB_K@__Cr@std@@_K@Z + ??$insert@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@45@@Z + ??$insert@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@1@Z + ??$invoke@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K@__Cr@std@@YA_KAEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QEA_K@Z + ??$invoke@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@__Cr@std@@YAX$$QEAP8FlagImpl@flags_internal@absl@@EAAXXZ$$QEAPEAV234@@Z + ??$iter_swap@AEAPEAPEAVCommandLineFlag@absl@@AEAPEAPEAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEAPEAVCommandLineFlag@absl@@0@Z + ??$iter_swap@AEAPEAPEAVCommandLineFlag@absl@@PEAPEAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEAPEAVCommandLineFlag@absl@@$$QEAPEAPEAV34@@Z + ??$iter_swap@AEAPEAPEBVCommandLineFlag@absl@@AEAPEAPEBV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEAPEBVCommandLineFlag@absl@@0@Z + ??$iter_swap@AEAPEAPEBVCommandLineFlag@absl@@PEAPEBV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEAPEBVCommandLineFlag@absl@@$$QEAPEAPEBV34@@Z + ??$iter_swap@PEAPEAVCommandLineFlag@absl@@PEAPEAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAX$$QEAPEAPEAVCommandLineFlag@absl@@0@Z + ??$iter_swap@PEAPEAVCommandLineFlag@absl@@PEAPEAV12@@__Cr@std@@YAXPEAPEAVCommandLineFlag@absl@@0@Z + ??$iter_swap@PEAPEBVCommandLineFlag@absl@@PEAPEBV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAX$$QEAPEAPEBVCommandLineFlag@absl@@0@Z + ??$iter_swap@PEAPEBVCommandLineFlag@absl@@PEAPEBV12@@__Cr@std@@YAXPEAPEBVCommandLineFlag@absl@@0@Z + ??$launder@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@01@PEAU201@@Z + ??$launder@UList@CordzInfo@cord_internal@absl@@@__Cr@std@@YAPEAUList@CordzInfo@cord_internal@absl@@PEAU2345@@Z + ??$launder@URefcountedRep@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPEAURefcountedRep@CrcCordState@crc_internal@absl@@PEAU2345@@Z + ??$launder@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@__Cr@std@@YAPEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@PEAV234@@Z + ??$launder@VFlagRegistry@flags_internal@absl@@@__Cr@std@@YAPEAVFlagRegistry@flags_internal@absl@@PEAV234@@Z + ??$launder@VMutex@absl@@@__Cr@std@@YAPEAVMutex@absl@@PEAV23@@Z + ??$lower_bound@PEBUTransition@cctz@time_internal@absl@@U1234@UByUnixTime@1234@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@UByUnixTime@2345@@Z + ??$make_pair@AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEAPEBV12345@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$make_pair@AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$$QEAPEAPEAPEBV34567@@Z + ??$make_pair@AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAPEAPEAU1234@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$make_pair@AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@AEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAPEAU3456@@Z + ??$make_pair@AEAPEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@YA?AU?$pair@PEAPEAVCommandLineFlag@absl@@_N@01@AEAPEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$make_pair@AEAPEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@YA?AU?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@01@AEAPEAPEAVLogSink@absl@@$$QEAPEAPEAV34@@Z + ??$make_pair@AEAPEAPEBVCommandLineFlag@absl@@AEA_N@__Cr@std@@YA?AU?$pair@PEAPEBVCommandLineFlag@absl@@_N@01@AEAPEAPEBVCommandLineFlag@absl@@AEA_N@Z + ??$make_pair@AEAPEAUTransition@cctz@time_internal@absl@@AEAPEAU1234@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@AEAPEAUTransition@cctz@time_internal@absl@@0@Z + ??$make_pair@AEAPEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@AEAPEAUTransition@cctz@time_internal@absl@@$$QEAPEAU3456@@Z + ??$make_pair@AEAPEAUTransitionType@cctz@time_internal@absl@@AEAPEAU1234@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@AEAPEAUTransitionType@cctz@time_internal@absl@@0@Z + ??$make_pair@AEAPEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@AEAPEAUTransitionType@cctz@time_internal@absl@@$$QEAPEAU3456@@Z + ??$make_pair@AEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@01@AEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAU3456@@Z + ??$make_pair@AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@01@AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z + ??$make_pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@$$QEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$make_pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@YA?AU?$pair@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@01@$$QEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$make_pair@PEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@YA?AU?$pair@PEAPEAVLogSink@absl@@PEAPEAV12@@01@$$QEAPEAPEAVLogSink@absl@@0@Z + ??$make_pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@$$QEAPEAUTransition@cctz@time_internal@absl@@0@Z + ??$make_pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@$$QEAPEAUTransitionType@cctz@time_internal@absl@@0@Z + ??$make_pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@@01@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAPEAU3456@@Z + ??$make_pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@01@$$QEAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z + ??$make_pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@01@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@$$QEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z + ??$make_tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@__Cr@std@@YA?AV?$tuple@PEAVCommandLineFlag@absl@@_N@01@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$make_unique@ULogMessageData@LogMessage@log_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAHAEAW4LogSeverity@4@VTime@4@$0A@@__Cr@std@@YA?AV?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@01@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEAHAEAW4LogSeverity@absl@@$$QEAVTime@5@@Z + ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@$$V$0A@@__Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@XZ + ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@AEAV12@$0A@@__Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@AEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z + ??$make_unique@VFallbackCrcMemcpyEngine@crc_internal@absl@@$$V$0A@@__Cr@std@@YA?AV?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@01@XZ + ??$make_unique@VFlagState@flags_internal@absl@@AEAVFlagImpl@23@AEAPEAXAEA_NAEA_N_J$0A@@__Cr@std@@YA?AV?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@01@AEAVFlagImpl@flags_internal@absl@@AEAPEAXAEA_N2$$QEA_J@Z + ??$make_unique@VFlagState@flags_internal@absl@@AEAVFlagImpl@23@PEAXAEA_NAEA_N_J$0A@@__Cr@std@@YA?AV?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@01@AEAVFlagImpl@flags_internal@absl@@$$QEAPEAXAEA_N2$$QEA_J@Z + ??$make_unique@VFlagState@flags_internal@absl@@AEAVFlagImpl@23@_JAEA_NAEA_N_J$0A@@__Cr@std@@YA?AV?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@01@AEAVFlagImpl@flags_internal@absl@@$$QEA_JAEA_N21@Z + ??$max@VDuration@absl@@@__Cr@std@@YAAEBVDuration@absl@@AEBV23@0@Z + ??$max@VDuration@absl@@U?$__less@XX@__Cr@std@@@__Cr@std@@YAAEBVDuration@absl@@AEBV23@0U?$__less@XX@01@@Z + ??$max_size@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAVCommandLineFlag@absl@@@12@@Z + ??$max_size@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEAVLogSink@absl@@@12@@Z + ??$max_size@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEBVCommandLineFlag@absl@@@12@@Z + ??$max_size@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??$max_size@V?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@U?$AlignedType@$07@container_internal@absl@@@12@@Z + ??$max_size@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@12@@Z + ??$max_size@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UPayload@status_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??$max_size@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??$max_size@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SA_KAEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@12@@Z + ??$min@VDuration@absl@@@__Cr@std@@YAAEBVDuration@absl@@AEBV23@0@Z + ??$min@VDuration@absl@@U?$__less@XX@__Cr@std@@@__Cr@std@@YAAEBVDuration@absl@@AEBV23@0U?$__less@XX@01@@Z + ??$move@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z + ??$move@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@00@Z + ??$move@PEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@YAPEAPEAVLogSink@absl@@PEAPEAV23@00@Z + ??$move@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z + ??$move@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z + ??$move_backward@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z + ??$move_backward@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@YAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU2345@00@Z + ??$move_backward@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z + ??$move_backward@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z + ??$next@AEAPEBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPEBUTransition@cctz@time_internal@absl@@AEAPEBU3456@_J@Z + ??$next@PEAPEAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPEAPEAVCommandLineFlag@absl@@PEAPEAV34@0@Z + ??$next@PEAPEBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPEAPEBVCommandLineFlag@absl@@PEAPEBV34@0@Z + ??$next@PEBUTransition@cctz@time_internal@absl@@$0A@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@_J@Z + ??$next@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@01@V201@_J@Z + ??$reset@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@$0A@@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@@Z + ??$reset@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@$0A@@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@H@strings_internal@absl@@YA?AV012@H@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@I@strings_internal@absl@@YA?AV012@I@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@J@strings_internal@absl@@YA?AV012@J@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@K@strings_internal@absl@@YA?AV012@K@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV012@_J@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV012@0@Z@@Z + ??$resize_and_overwrite@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@56@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@UNoFormatter@23@@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV012@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@1V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@UNoFormatter@45@@Z@@Z + ??$safe_strtoi_base@H@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHH@Z + ??$safe_strtoi_base@I@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAIH@Z + ??$safe_strtoi_base@J@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAJH@Z + ??$safe_strtoi_base@K@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAKH@Z + ??$safe_strtoi_base@_J@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_JH@Z + ??$safe_strtoi_base@_K@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_KH@Z + ??$swap@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAXAEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$swap@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAXAEAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$swap@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@YAXAEAPEAUTransition@cctz@time_internal@absl@@0@Z + ??$swap@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAXAEAPEAUTransitionType@cctz@time_internal@absl@@0@Z + ??$swap@PEAUUnrecognizedFlag@absl@@@__Cr@std@@YAXAEAPEAUUnrecognizedFlag@absl@@0@Z + ??$swap@PEAVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEAVCommandLineFlag@absl@@0@Z + ??$swap@PEBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@YAXAEAPEBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@0@Z + ??$swap@PEBVCommandLineFlag@absl@@@__Cr@std@@YAXAEAPEBVCommandLineFlag@absl@@0@Z + ??$swap@PEBW4ctrl_t@container_internal@absl@@@__Cr@std@@YAXAEAPEBW4ctrl_t@container_internal@absl@@0@Z + ??$swap@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAEAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@0@Z + ??$swap@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXAEAUViableSubstitution@strings_internal@absl@@0@Z + ??$tie@PEAVCommandLineFlag@absl@@_N@__Cr@std@@YA?AV?$tuple@AEAPEAVCommandLineFlag@absl@@AEA_N@01@AEAPEAVCommandLineFlag@absl@@AEA_N@Z + ??$tie@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@YA?AV?$tuple@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@23@@01@AEAUFindInfo@container_internal@absl@@AEAV?$NonIterableBitMask@G$0BA@$0A@@45@@Z + ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@1@Z + ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAXPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@1@Z + ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@1@Z + ??$transfer_impl@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@CA?AU?$integral_constant@_N$00@__Cr@std@@PEAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@45@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@12@1URank2@012@@Z + ??$upper_bound@PEBUTransition@cctz@time_internal@absl@@U1234@UByCivilTime@1234@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@UByCivilTime@2345@@Z + ??$upper_bound@PEBUTransition@cctz@time_internal@absl@@U1234@UByUnixTime@1234@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@UByUnixTime@2345@@Z + ??$visit@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@X@__Cr@std@@YA?A_T$$QEAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@45@@Z@AEAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@01@@Z + ??0?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@Z + ??0?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@@Z + ??0?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@Z + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@XZ + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@_K@Z + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@XZ + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@_K@Z + ??0?$BitMask@G$0BA@$0A@$0A@@container_internal@absl@@QEAA@G@Z + ??0?$BitMask@_K$07$02$0A@@container_internal@absl@@QEAA@_K@Z + ??0?$BoundedUtf8LengthSequence@$0BAA@@debugging_internal@absl@@QEAA@XZ + ??0?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAA@_KAEBV?$allocator@D@__Cr@std@@@Z + ??0?$FlagRegistrar@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$00@flags_internal@absl@@QEAA@AEAV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@12@PEBD@Z + ??0?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@str_format_internal@absl@@QEAA@PEBD@Z + ??0?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@str_format_internal@absl@@QEAA@PEBD@Z + ??0?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@str_format_internal@absl@@QEAA@PEBD@Z + ??0?$FormatSpecTemplate@$0JPPPL@@str_format_internal@absl@@QEAA@PEBD@Z + ??0?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@QEAA@AEBUStringHash@12@_K@Z + ??0?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@QEAA@AEBUStringHash@12@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAA@XZ + ??0?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEAA@XZ + ??0?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAA@AEBV01@@Z + ??0?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAA@AEBV01@AEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@Z + ??0?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAA@XZ + ??0?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QEAA@AEBV?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@__Cr@std@@@Z + ??0?$IteratorValueAdapter@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@V?$move_iterator@PEAPEAVLogSink@absl@@@23@@inlined_vector_internal@absl@@QEAA@AEBV?$move_iterator@PEAPEAVLogSink@absl@@@__Cr@std@@@Z + ??0?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@QEAA@AEBQEBUPayload@status_internal@2@@Z + ??0?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QEAA@AEBV?$move_iterator@PEAUPayload@status_internal@absl@@@__Cr@std@@@Z + ??0?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@QEAA@AEBQEBVFormatArgImpl@str_format_internal@2@@Z + ??0?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@QEAA@G@Z + ??0?$NonIterableBitMask@_K$07$02@container_internal@absl@@QEAA@_K@Z + ??0?$ProbedItemImpl@I$0CA@@container_internal@absl@@QEAA@E_K0@Z + ??0?$ProbedItemImpl@_K$0EA@@container_internal@absl@@QEAA@E_K0@Z + ??0?$ProbedItemImpl@_K$0HK@@container_internal@absl@@QEAA@E_K0@Z + ??0?$Sample@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAA@XZ + ??0?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAA@XZ + ??0?$Span@$$CBD@absl@@QEAA@PEBD_K@Z + ??0?$Span@$$CBD@absl@@QEAA@XZ + ??0?$Span@$$CBI@absl@@QEAA@PEBI_K@Z + ??0?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@PEBVFormatArgImpl@str_format_internal@1@_K@Z + ??0?$Span@D@absl@@QEAA@PEAD_K@Z + ??0?$Span@D@absl@@QEAA@XZ + ??0?$Span@I@absl@@QEAA@PEAI_K@Z + ??0?$Span@PEAVLogSink@absl@@@absl@@QEAA@PEAPEAVLogSink@1@_K@Z + ??0?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEAA@PEBQEAUCordRep@cord_internal@1@_K@Z + ??0?$Span@QEAX@absl@@QEAA@PEBQEAX_K@Z + ??0?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@W4State@012@PEBV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@W4State@012@PEBV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@W4State@012@PEBV?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VByAnyChar@2@UAllowEmpty@2@@Z + ??0?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VByAnyChar@2@USkipEmpty@2@@Z + ??0?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VByChar@2@UAllowEmpty@2@@Z + ??0?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??0?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??0?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@AEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@Z + ??0?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??0?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@AEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@Z + ??0?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@QEAA@AEAV?$allocator@UUnrecognizedFlag@absl@@@12@AEAPEAUUnrecognizedFlag@absl@@1@Z + ??0?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@__Cr@std@@QEAA@AEAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@Z + ??0?$__allocation_result@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@__Cr@std@@QEAA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ??0?$__allocation_result@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@__Cr@std@@QEAA@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ??0?$__allocation_result@PEAPEAVCommandLineFlag@absl@@_K@__Cr@std@@QEAA@PEAPEAVCommandLineFlag@absl@@_K@Z + ??0?$__allocation_result@PEAPEAVCordzHandle@cord_internal@absl@@_K@__Cr@std@@QEAA@PEAPEAVCordzHandle@cord_internal@absl@@_K@Z + ??0?$__allocation_result@PEAPEAVLogSink@absl@@_K@__Cr@std@@QEAA@PEAPEAVLogSink@absl@@_K@Z + ??0?$__allocation_result@PEAPEBVCommandLineFlag@absl@@_K@__Cr@std@@QEAA@PEAPEBVCommandLineFlag@absl@@_K@Z + ??0?$__allocation_result@PEAPEBVCordzHandle@cord_internal@absl@@_K@__Cr@std@@QEAA@PEAPEBVCordzHandle@cord_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@__Cr@std@@QEAA@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUTransition@cctz@time_internal@absl@@_K@__Cr@std@@QEAA@PEAUTransition@cctz@time_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@_K@__Cr@std@@QEAA@PEAUTransitionType@cctz@time_internal@absl@@_K@Z + ??0?$__allocation_result@PEAUUnrecognizedFlag@absl@@_K@__Cr@std@@QEAA@PEAUUnrecognizedFlag@absl@@_K@Z + ??0?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@_K@__Cr@std@@QEAA@PEAUViableSubstitution@strings_internal@absl@@_K@Z + ??0?$__allocation_result@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@_K@__Cr@std@@QEAA@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@_K@Z + ??0?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z + ??0?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z + ??0?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__Cr@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z + ??0?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__Cr@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@QEAA@PEAVCordzHandle@cord_internal@absl@@@Z + ??0?$__atomic_base@PEAVCordzInfo@cord_internal@absl@@$0A@@__Cr@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z + ??0?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__cxx_atomic_base_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__Cr@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z + ??0?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@__Cr@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__cxx_atomic_base_impl@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAA@PEAVCordzHandle@cord_internal@absl@@@Z + ??0?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@__Cr@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z + ??0?$__cxx_atomic_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@ZU?$__cxx_atomic_base_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__Cr@std@@@__Cr@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z + ??0?$__cxx_atomic_impl@PEAUHashtablezInfo@container_internal@absl@@U?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__cxx_atomic_impl@PEAVCordzHandle@cord_internal@absl@@U?$__cxx_atomic_base_impl@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAVCordzHandle@cord_internal@absl@@@Z + ??0?$__cxx_atomic_impl@PEAVCordzInfo@cord_internal@absl@@U?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z + ??0?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@__Cr@std@@AEAA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV34567@@Z + ??0?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@AEAA@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU3456@@Z + ??0?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@AEAA@PEBQEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU3456@@Z + ??0?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@__Cr@std@@QEAA@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@12@AEAAX_K@Z@@Z + ??0?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@12@@Z + ??0?$__hash_const_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAA@AEBV?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@@Z + ??0?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@AEBV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??0?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@AEAA@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@@Z + ??0?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@AEAA@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??0?$__hash_map_const_iterator@V?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@V?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??0?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAA@PEAU012@@Z + ??0?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@PEAU012@@Z + ??0?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@_N@Z + ??0?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@_N@Z + ??0?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA@XZ + ??0?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@X@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@12@@Z + ??0?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@X@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@12@@Z + ??0?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEAA@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@12@@Z + ??0?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEAA@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@QEAA@XZ + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__non_trivial_if@$00V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$__optional_copy_assign_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ + ??0?$__optional_copy_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ + ??0?$__optional_destruct_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ + ??0?$__optional_move_assign_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ + ??0?$__optional_move_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ + ??0?$__optional_storage_base@VCord@absl@@$0A@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??0?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEAVLogSink@absl@@@12@@Z + ??0?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEBVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@_K0AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@_K0AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@_K0AEAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??0?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@_K0AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??0?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAA@_K0AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAA@XZ + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEAVLogSink@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEBVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAA@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@12@@Z + ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEBV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@12@@Z + ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@12@@Z + ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@@Z + ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@12@@Z + ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEAA@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@@Z + ??0?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@12@_N@Z + ??0?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@12@_N@Z + ??0?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@AEAA@PEAPEAVCommandLineFlag@absl@@@Z + ??0?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@AEAA@PEAPEAVCordzHandle@cord_internal@absl@@@Z + ??0?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@AEAA@PEAPEAVLogSink@absl@@@Z + ??0?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@AEAA@PEAPEBVCommandLineFlag@absl@@@Z + ??0?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@AEAA@PEAUTransition@cctz@time_internal@absl@@@Z + ??0?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@AEAA@PEAUTransitionType@cctz@time_internal@absl@@@Z + ??0?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@__Cr@std@@AEAA@PEAUUnrecognizedFlag@absl@@@Z + ??0?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@AEAA@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@AEBV567@@Z@@Z + ??0?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@AEAA@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@@Z + ??0?$__wrap_iter@PEBQEAVLogSink@absl@@@__Cr@std@@AEAA@PEBQEAVLogSink@absl@@@Z + ??0?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@AEAA@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ??0?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@__Cr@std@@AEAA@PEBUUnrecognizedFlag@absl@@@Z + ??0?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEAVLogSink@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@QEAA@XZ + ??0?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@UPayload@status_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@QEAA@XZ + ??0?$atomic@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__Cr@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z + ??0?$atomic@PEAUHashtablezInfo@container_internal@absl@@@__Cr@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$atomic@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAA@PEAVCordzHandle@cord_internal@absl@@@Z + ??0?$atomic@PEAVCordzInfo@cord_internal@absl@@@__Cr@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z + ??0?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@XZ + ??0?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@XZ + ??0?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@XZ + ??0?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@XZ + ??0?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@XZ + ??0?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@XZ + ??0?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z + ??0?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@XZ + ??0?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z + ??0?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@absl@@QEAA@XZ + ??0?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@QEAA@XZ + ??0?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??0?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@__Cr@std@@QEAA@PEAPEAUCordRep@cord_internal@absl@@@Z + ??0?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAA@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??0?$move_iterator@PEAPEAVLogSink@absl@@@__Cr@std@@QEAA@PEAPEAVLogSink@absl@@@Z + ??0?$move_iterator@PEAUPayload@status_internal@absl@@@__Cr@std@@QEAA@PEAUPayload@status_internal@absl@@@Z + ??0?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@QEAA@PEAUTransition@cctz@time_internal@absl@@@Z + ??0?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAA@PEAUTransitionType@cctz@time_internal@absl@@@Z + ??0?$optional@VCord@absl@@@__Cr@std@@QEAA@Unullopt_t@12@@Z + ??0?$probe_seq@$0BA@@container_internal@absl@@QEAA@_K0@Z + ??0?$raw_hash_map@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA@XZ + ??0?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA@XZ + ??0?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV012@@Z + ??0?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@$$QEAV012@@Z + ??0?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEAA@$$QEAV012@@Z + ??0?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$unordered_set@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA@XZ + ??0?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??0?$vector@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??0AlphaNum@absl@@QEAA@H@Z + ??0AlphaNum@absl@@QEAA@PEBD@Z + ??0AlphaNum@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0AlphaNum@absl@@QEAA@_J@Z + ??0AlphaNum@absl@@QEAA@_K@Z + ??0Arena@LowLevelAlloc@base_internal@absl@@QEAA@I@Z + ??0Arg@substitute_internal@absl@@QEAA@PEBX@Z + ??0Arg@substitute_internal@absl@@QEAA@UDec@2@@Z + ??0Arg@substitute_internal@absl@@QEAA@UHex@2@@Z + ??0BadStatusOrAccess@absl@@QEAA@$$QEAV01@@Z + ??0BadStatusOrAccess@absl@@QEAA@AEBV01@@Z + ??0BadStatusOrAccess@absl@@QEAA@VStatus@1@@Z + ??0BestHints@flags_internal@absl@@QEAA@E@Z + ??0BlockingCounter@absl@@QEAA@H@Z + ??0BoundConversion@str_format_internal@absl@@QEAA@XZ + ??0Breakdown@Time@absl@@QEAA@XZ + ??0BufferRawSink@str_format_internal@absl@@QEAA@PEAD_K@Z + ??0ByAnyChar@absl@@QEAA@$$QEAV01@@Z + ??0ByAnyChar@absl@@QEAA@AEBV01@@Z + ??0ByAnyChar@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0ByChar@absl@@QEAA@D@Z + ??0ByLength@absl@@QEAA@_J@Z + ??0ByString@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0CRC32@crc_internal@absl@@QEAA@XZ + ??0CRC@crc_internal@absl@@IEAA@XZ + ??0CRCImpl@crc_internal@absl@@QEAA@XZ + ??0CharIterator@Cord@absl@@AEAA@PEBV12@@Z + ??0CharIterator@Cord@absl@@QEAA@XZ + ??0CheckOpMessageBuilder@log_internal@absl@@QEAA@PEBD@Z + ??0ChunkIterator@Cord@absl@@AEAA@PEAUCordRep@cord_internal@2@@Z + ??0ChunkIterator@Cord@absl@@AEAA@PEBV12@@Z + ??0ChunkIterator@Cord@absl@@QEAA@XZ + ??0ChunkRange@Cord@absl@@QEAA@PEBV12@@Z + ??0CivilInfo@TimeZone@absl@@QEAA@XZ + ??0CommandLineFlag@absl@@QEAA@XZ + ??0CommonFields@container_internal@absl@@QEAA@Unon_soo_tag_t@12@@Z + ??0CommonFields@container_internal@absl@@QEAA@Usoo_tag_t@12@@Z + ??0Condition@absl@@QEAA@P6A_NPEAX@Z0@Z + ??0Condition@absl@@QEAA@PEB_N@Z + ??0ConvertibleToStringView@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0Cord@absl@@AEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@1@@Z + ??0Cord@absl@@QEAA@$$QEAV01@@Z + ??0Cord@absl@@QEAA@AEBV01@@Z + ??0Cord@absl@@QEAA@XZ + ??0CordBuffer@absl@@AEAA@PEAUCordRepFlat@cord_internal@1@@Z + ??0CordBuffer@absl@@QEAA@XZ + ??0CordRep@cord_internal@absl@@QEAA@XZ + ??0CordRepBtree@cord_internal@absl@@AEAA@XZ + ??0CordRepBtreeNavigator@cord_internal@absl@@QEAA@XZ + ??0CordRepBtreeReader@cord_internal@absl@@QEAA@XZ + ??0CordRepCrc@cord_internal@absl@@QEAA@XZ + ??0CordRepExternal@cord_internal@absl@@QEAA@XZ + ??0CordRepFlat@cord_internal@absl@@QEAA@XZ + ??0CordRepSubstring@cord_internal@absl@@QEAA@XZ + ??0CordzHandle@cord_internal@absl@@IEAA@_N@Z + ??0CordzHandle@cord_internal@absl@@QEAA@XZ + ??0CordzInfo@cord_internal@absl@@AEAA@PEAUCordRep@12@PEBV012@W4MethodIdentifier@CordzUpdateTracker@12@_J@Z + ??0CordzStatistics@cord_internal@absl@@QEAA@XZ + ??0CordzUpdateScope@cord_internal@absl@@QEAA@PEAVCordzInfo@12@W4MethodIdentifier@CordzUpdateTracker@12@@Z + ??0CordzUpdateTracker@cord_internal@absl@@QEAA@XZ + ??0Counter@CordzUpdateTracker@cord_internal@absl@@QEAA@XZ + ??0CrcCordState@crc_internal@absl@@QEAA@$$QEAV012@@Z + ??0CrcCordState@crc_internal@absl@@QEAA@AEBV012@@Z + ??0CrcCordState@crc_internal@absl@@QEAA@XZ + ??0CrcMemcpyEngine@crc_internal@absl@@IEAA@XZ + ??0Duration@absl@@AEAA@_JI@Z + ??0Duration@absl@@QEAA@XZ + ??0DynValueDeleter@flags_internal@absl@@QEAA@P6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ??0ErrnoSaver@base_internal@absl@@QEAA@XZ + ??0FILERawSink@str_format_internal@absl@@QEAA@PEAU_iobuf@@@Z + ??0FallbackCrcMemcpyEngine@crc_internal@absl@@QEAA@XZ + ??0FlagCallback@flags_internal@absl@@QEAA@XZ + ??0FlagRegistry@flags_internal@absl@@QEAA@XZ + ??0FlagSaver@absl@@QEAA@XZ + ??0FlagSaverImpl@flags_internal@absl@@QEAA@XZ + ??0FlagStateInterface@flags_internal@absl@@QEAA@XZ + ??0FlagsUsageConfig@absl@@QEAA@AEBU01@@Z + ??0FlagsUsageConfig@absl@@QEAA@XZ + ??0FormatConversionSpecImpl@str_format_internal@absl@@QEAA@XZ + ??0FormatSinkImpl@str_format_internal@absl@@QEAA@VFormatRawSinkImpl@12@@Z + ??0GraphCycles@synchronization_internal@absl@@QEAA@XZ + ??0GroupPortableImpl@container_internal@absl@@QEAA@PEBW4ctrl_t@12@@Z + ??0GroupSse2Impl@container_internal@absl@@QEAA@PEBW4ctrl_t@12@@Z + ??0HashSetIteratorGenerationInfoDisabled@container_internal@absl@@QEAA@PEBE@Z + ??0HashtableSize@container_internal@absl@@QEAA@Ufull_soo_tag_t@12@@Z + ??0HashtableSize@container_internal@absl@@QEAA@Uno_seed_empty_tag_t@12@@Z + ??0HashtablezInfo@container_internal@absl@@QEAA@XZ + ??0HashtablezInfoHandle@container_internal@absl@@QEAA@$$T@Z + ??0Hex@absl@@AEAA@W4PadSpec@1@_K@Z + ??0HiRep@Duration@absl@@QEAA@_J@Z + ??0Impl@time_zone@cctz@time_internal@absl@@AEAA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??0Impl@time_zone@cctz@time_internal@absl@@AEAA@XZ + ??0InlineData@cord_internal@absl@@QEAA@AEBV012@@Z + ??0InlineData@cord_internal@absl@@QEAA@W4DefaultInitType@012@@Z + ??0InlineData@cord_internal@absl@@QEAA@XZ + ??0InlineRep@Cord@absl@@QEAA@$$QEAV012@@Z + ??0InlineRep@Cord@absl@@QEAA@AEBV012@@Z + ??0InlineRep@Cord@absl@@QEAA@W4DefaultInitType@InlineData@cord_internal@2@@Z + ??0InlineRep@Cord@absl@@QEAA@XZ + ??0InputValue@UnboundConversion@str_format_internal@absl@@QEAA@XZ + ??0KernelTimeout@synchronization_internal@absl@@QEAA@VDuration@2@@Z + ??0KernelTimeout@synchronization_internal@absl@@QEAA@VTime@2@@Z + ??0KernelTimeout@synchronization_internal@absl@@QEAA@XZ + ??0LeakCheckDisabler@absl@@QEAA@XZ + ??0List@CordzInfo@cord_internal@absl@@QEAA@XZ + ??0LockHolder@synchronization_internal@absl@@QEAA@PEAU_RTL_SRWLOCK@@@Z + ??0LogEntry@absl@@AEAA@XZ + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUErrorTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUInfoTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUWarningTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@2@@Z + ??0LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@2@@Z + ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@3@VTime@3@@Z + ??0LogMessageDebugFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH0@Z + ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageQuietlyDebugFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageQuietlyFatal@log_internal@absl@@QEAA@PEBDH0@Z + ??0LogMessageQuietlyFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogSink@absl@@IEAA@XZ + ??0Long@Rep@CordBuffer@absl@@QEAA@PEAUCordRepFlat@cord_internal@3@@Z + ??0MaskedPointer@flags_internal@absl@@QEAA@PEAX_N@Z + ??0MixingHashState@hash_internal@absl@@AEAA@_K@Z + ??0Mutex@absl@@QEAA@XZ + ??0MutexLock@absl@@QEAA@AEAVMutex@1@@Z + ??0NodeCounts@CordzStatistics@cord_internal@absl@@QEAA@XZ + ??0OstreamView@LogMessage@log_internal@absl@@QEAA@AEAULogMessageData@123@@Z + ??0ParsedFloat@strings_internal@absl@@QEAA@XZ + ??0ParsedFormatBase@str_format_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_NV?$initializer_list@W4FormatConversionCharSet@absl@@@5@@Z + ??0ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA@PEAV123@@Z + ??0Payload@status_internal@absl@@QEAA@$$QEAU012@@Z + ??0Payload@status_internal@absl@@QEAA@AEBU012@@Z + ??0PerTableSeed@container_internal@absl@@AEAA@G@Z + ??0PosixTimeZone@cctz@time_internal@absl@@QEAA@XZ + ??0PrefixCrc@CrcCordState@crc_internal@absl@@QEAA@XZ + ??0PrefixCrc@CrcCordState@crc_internal@absl@@QEAA@_KVcrc32c_t@3@@Z + ??0ProtoField@log_internal@absl@@QEAA@XZ + ??0Randen@random_internal@absl@@QEAA@XZ + ??0RawHashSetLayout@container_internal@absl@@QEAA@_K00_N@Z + ??0ReaderMutexLock@absl@@QEAA@AEAVMutex@1@@Z + ??0RefcountAndFlags@cord_internal@absl@@QEAA@XZ + ??0RefcountedRep@CrcCordState@crc_internal@absl@@QEAA@XZ + ??0Rep@CordBuffer@absl@@QEAA@PEAUCordRepFlat@cord_internal@2@@Z + ??0Rep@CordBuffer@absl@@QEAA@XZ + ??0Rep@CrcCordState@crc_internal@absl@@QEAA@XZ + ??0Rep@GraphCycles@synchronization_internal@absl@@QEAA@XZ + ??0Rep@InlineData@cord_internal@absl@@QEAA@W4DefaultInitType@123@@Z + ??0Rep@InlineData@cord_internal@absl@@QEAA@XZ + ??0SavedValue@FlagState@flags_internal@absl@@QEAA@PEAX@Z + ??0SavedValue@FlagState@flags_internal@absl@@QEAA@_J@Z + ??0SchedulingHelper@base_internal@absl@@QEAA@W4SchedulingMode@12@@Z + ??0ScopedDisable@SchedulingGuard@base_internal@absl@@QEAA@XZ + ??0ScopedEnable@SchedulingGuard@base_internal@absl@@QEAA@XZ + ??0ScopedMinLogLevel@log_internal@absl@@QEAA@W4LogSeverityAtLeast@2@@Z + ??0ScopedStderrThreshold@absl@@QEAA@W4LogSeverityAtLeast@1@@Z + ??0ShiftState@strings_internal@absl@@QEAA@XZ + ??0SpinLock@base_internal@absl@@QEAA@W4SchedulingMode@12@@Z + ??0SpinLock@base_internal@absl@@QEAA@XZ + ??0SpinLockHolder@base_internal@absl@@QEAA@AEAVSpinLock@12@@Z + ??0Status@absl@@AEAA@_K@Z + ??0Status@absl@@QEAA@$$QEAV01@@Z + ??0Status@absl@@QEAA@AEBV01@@Z + ??0Status@absl@@QEAA@W4StatusCode@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0StatusRep@status_internal@absl@@QEAA@W4StatusCode@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@56@@Z + ??0StdcppWaiter@synchronization_internal@absl@@QEAA@XZ + ??0Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAA@_KAEBV?$allocator@D@__Cr@std@@@Z + ??0Streamable@str_format_internal@absl@@QEAA@AEBVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ??0StringifySink@detect_specialization@log_internal@absl@@QEAA@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0StringifySink@strings_internal@absl@@QEAA@XZ + ??0SynchWaitParams@absl@@QEAA@PEBUMuHowS@1@PEBVCondition@1@VKernelTimeout@synchronization_internal@1@PEAVMutex@1@PEAUPerThreadSynch@base_internal@1@PEAU?$atomic@_J@__Cr@std@@@Z + ??0Time@absl@@AEAA@VDuration@1@@Z + ??0Time@absl@@QEAA@XZ + ??0TimeConversion@absl@@QEAA@XZ + ??0TimeInfo@TimeZone@absl@@QEAA@XZ + ??0TimeZone@absl@@QEAA@Vtime_zone@cctz@time_internal@1@@Z + ??0TimeZoneIf@cctz@time_internal@absl@@IEAA@XZ + ??0TimeZoneInfo@cctz@time_internal@absl@@AEAA@XZ + ??0TimeZoneLibC@cctz@time_internal@absl@@AEAA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??0Transition@cctz@time_internal@absl@@QEAA@XZ + ??0TransitionType@cctz@time_internal@absl@@QEAA@XZ + ??0U@?1??Get@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@AEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ@QEAA@XZ + ??0UnboundConversion@str_format_internal@absl@@QEAA@XZ + ??0UnrecognizedFlag@absl@@QEAA@$$QEAU01@@Z + ??0UnrecognizedFlag@absl@@QEAA@AEBU01@@Z + ??0UnrecognizedFlag@absl@@QEAA@W4Source@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0UntypedFormatSpec@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0UntypedFormatSpecImpl@str_format_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0Utf8ForCodePoint@debugging_internal@absl@@QEAA@_K@Z + ??0ViableSubstitution@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0_K@Z + ??0Win32Waiter@synchronization_internal@absl@@QEAA@XZ + ??0WriterMutexLock@absl@@QEAA@AEAVMutex@1@@Z + ??0ZoneInfoSource@cctz@time_internal@absl@@QEAA@XZ + ??0_ConstructTransaction@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@PEAV123@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ??0_ConstructTransaction@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@PEAV123@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ??0_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@PEAV123@PEAUTransition@cctz@time_internal@absl@@_K@Z + ??0_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@PEAV123@PEAUTransitionType@cctz@time_internal@absl@@_K@Z + ??0_ConstructTransaction@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAV123@AEAU__deque_block_range@123@@Z + ??0_ConstructTransaction@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV123@_K@Z + ??0__deque_block_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??0__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@0@Z + ??0__destroy_vector@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z + ??0__destroy_vector@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z + ??0__destroy_vector@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z + ??0__destroy_vector@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z + ??0__destroy_vector@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z + ??0__destroy_vector@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z + ??0__destroy_vector@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@AEAV123@@Z + ??0__destroy_vector@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV123@@Z + ??0__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@@Z + ??0__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@@Z + ??0absolute_lookup@time_zone@cctz@time_internal@absl@@QEAA@XZ + ??0civil_lookup@time_zone@cctz@time_internal@absl@@QEAA@XZ + ??0civil_transition@time_zone@cctz@time_internal@absl@@QEAA@XZ + ??0const_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA@Viterator@123@@Z + ??0crc32c_t@absl@@QEAA@I@Z + ??0fields@detail@cctz@time_internal@absl@@QEAA@_JCCCCC@Z + ??0int128@absl@@AEAA@_J_K@Z + ??0int128@absl@@QEAA@H@Z + ??0int128@absl@@QEAA@M@Z + ??0int128@absl@@QEAA@N@Z + ??0int128@absl@@QEAA@O@Z + ??0iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA@PEAW4ctrl_t@23@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@PEBE@Z + ??0iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA@PEAW4ctrl_t@23@T?$MaybeInitializedPtr@X@23@PEBE@Z + ??0iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA@PEBE@Z + ??0once_flag@absl@@QEAA@XZ + ??0time_zone@cctz@time_internal@absl@@AEAA@PEBVImpl@0123@@Z + ??0time_zone@cctz@time_internal@absl@@QEAA@XZ + ??0uint128@absl@@AEAA@_K0@Z + ??0uint128@absl@@QEAA@H@Z + ??0uint128@absl@@QEAA@I@Z + ??0uint128@absl@@QEAA@M@Z + ??0uint128@absl@@QEAA@N@Z + ??0uint128@absl@@QEAA@O@Z + ??0uint128@absl@@QEAA@Vint128@1@@Z + ??0uint128@absl@@QEAA@_J@Z + ??0uint128@absl@@QEAA@_K@Z + ??1?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??1?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??1?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??1?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAA@XZ + ??1?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAA@XZ + ??1?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEAA@XZ + ??1?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAA@XZ + ??1?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QEAA@XZ + ??1?$Sample@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAA@XZ + ??1?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@XZ + ??1?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@XZ + ??1?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEAA@XZ + ??1?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEAA@XZ + ??1?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??1?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??1?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??1?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA@XZ + ??1?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@QEAA@XZ + ??1?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@QEAA@XZ + ??1?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA@XZ + ??1?$__policy_func@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__function@__Cr@std@@QEAA@XZ + ??1?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEAA@XZ + ??1?$__policy_func@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAA@XZ + ??1?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAA@XZ + ??1?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@absl@@QEAA@XZ + ??1?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__Cr@std@@QEAA@XZ + ??1?$function@$$A6AXAEAVCommandLineFlag@absl@@@Z@__Cr@std@@QEAA@XZ + ??1?$function@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__Cr@std@@QEAA@XZ + ??1?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAA@XZ + ??1?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@QEAA@XZ + ??1?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$raw_hash_map@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA@XZ + ??1?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA@XZ + ??1?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@UThreadIdentity@base_internal@absl@@P6AXPEAX@Z@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEAA@XZ + ??1?$unordered_set@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA@XZ + ??1?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??1BadStatusOrAccess@absl@@UEAA@XZ + ??1BestHints@flags_internal@absl@@QEAA@XZ + ??1ByAnyChar@absl@@QEAA@XZ + ??1CRC32@crc_internal@absl@@UEAA@XZ + ??1CRC@crc_internal@absl@@UEAA@XZ + ??1CRCImpl@crc_internal@absl@@UEAA@XZ + ??1CheckOpMessageBuilder@log_internal@absl@@QEAA@XZ + ??1Cord@absl@@QEAA@XZ + ??1CordBuffer@absl@@QEAA@XZ + ??1CordRepCrc@cord_internal@absl@@QEAA@XZ + ??1CordzHandle@cord_internal@absl@@MEAA@XZ + ??1CordzInfo@cord_internal@absl@@EEAA@XZ + ??1CordzUpdateScope@cord_internal@absl@@QEAA@XZ + ??1CrcCordState@crc_internal@absl@@QEAA@XZ + ??1CrcMemcpyEngine@crc_internal@absl@@UEAA@XZ + ??1ErrnoSaver@base_internal@absl@@QEAA@XZ + ??1FallbackCrcMemcpyEngine@crc_internal@absl@@UEAA@XZ + ??1FlagSaver@absl@@QEAA@XZ + ??1FlagSaverImpl@flags_internal@absl@@QEAA@XZ + ??1FlagState@flags_internal@absl@@UEAA@XZ + ??1FlagStateInterface@flags_internal@absl@@UEAA@XZ + ??1FlagsUsageConfig@absl@@QEAA@XZ + ??1FormatSinkImpl@str_format_internal@absl@@QEAA@XZ + ??1GraphCycles@synchronization_internal@absl@@QEAA@XZ + ??1HashtablezInfo@container_internal@absl@@QEAA@XZ + ??1Impl@time_zone@cctz@time_internal@absl@@QEAA@XZ + ??1LeakCheckDisabler@absl@@QEAA@XZ + ??1LockHolder@synchronization_internal@absl@@QEAA@XZ + ??1LogEntry@absl@@QEAA@XZ + ??1LogMessage@log_internal@absl@@QEAA@XZ + ??1LogMessageData@LogMessage@log_internal@absl@@QEAA@XZ + ??1LogMessageDebugFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageQuietlyDebugFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageQuietlyFatal@log_internal@absl@@QEAA@XZ + ??1LogSink@absl@@UEAA@XZ + ??1Mutex@absl@@QEAA@XZ + ??1MutexLock@absl@@QEAA@XZ + ??1Notification@absl@@QEAA@XZ + ??1OstreamView@LogMessage@log_internal@absl@@UEAA@XZ + ??1Payload@status_internal@absl@@QEAA@XZ + ??1PosixTimeZone@cctz@time_internal@absl@@QEAA@XZ + ??1ReaderMutexLock@absl@@QEAA@XZ + ??1RefcountedRep@CrcCordState@crc_internal@absl@@QEAA@XZ + ??1Rep@CrcCordState@crc_internal@absl@@QEAA@XZ + ??1Rep@GraphCycles@synchronization_internal@absl@@QEAA@XZ + ??1SchedulingHelper@base_internal@absl@@QEAA@XZ + ??1ScopedDisable@SchedulingGuard@base_internal@absl@@QEAA@XZ + ??1ScopedEnable@SchedulingGuard@base_internal@absl@@QEAA@XZ + ??1ScopedMinLogLevel@log_internal@absl@@QEAA@XZ + ??1ScopedStderrThreshold@absl@@QEAA@XZ + ??1SeedGenException@absl@@UEAA@XZ + ??1SpinLockHolder@base_internal@absl@@QEAA@XZ + ??1Status@absl@@QEAA@XZ + ??1StatusRep@status_internal@absl@@QEAA@XZ + ??1Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAA@XZ + ??1Streamable@str_format_internal@absl@@QEAA@XZ + ??1StringifySink@strings_internal@absl@@QEAA@XZ + ??1TimeZoneIf@cctz@time_internal@absl@@UEAA@XZ + ??1TimeZoneInfo@cctz@time_internal@absl@@UEAA@XZ + ??1TimeZoneLibC@cctz@time_internal@absl@@UEAA@XZ + ??1U@?1??Get@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@AEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ@QEAA@XZ + ??1UnrecognizedFlag@absl@@QEAA@XZ + ??1WriterMutexLock@absl@@QEAA@XZ + ??1ZoneInfoSource@cctz@time_internal@absl@@UEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA@XZ + ??4?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAV012@AEBV012@@Z + ??4?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAV012@$$QEAV012@@Z + ??4BadStatusOrAccess@absl@@QEAAAEAV01@$$QEAV01@@Z + ??4BadStatusOrAccess@absl@@QEAAAEAV01@AEBV01@@Z + ??4Cord@absl@@QEAAAEAV01@$$QEAV01@@Z + ??4Cord@absl@@QEAAAEAV01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??4CordzUpdateTracker@cord_internal@absl@@QEAAAEAV012@AEBV012@@Z + ??4CrcCordState@crc_internal@absl@@QEAAAEAV012@$$QEAV012@@Z + ??4CrcCordState@crc_internal@absl@@QEAAAEAV012@AEBV012@@Z + ??4FlagsUsageConfig@absl@@QEAAAEAU01@AEBU01@@Z + ??4HiRep@Duration@absl@@QEAAAEAV012@_J@Z + ??4InlineData@cord_internal@absl@@QEAAAEAV012@AEBV012@@Z + ??4InlineRep@Cord@absl@@QEAAAEAV012@$$QEAV012@@Z + ??4Payload@status_internal@absl@@QEAAAEAU012@$$QEAU012@@Z + ??4Rep@CrcCordState@crc_internal@absl@@QEAAAEAU0123@AEBU0123@@Z + ??4Status@absl@@QEAAAEAV01@$$QEAV01@@Z + ??4Status@absl@@QEAAAEAV01@AEBV01@@Z + ??4int128@absl@@QEAAAEAV01@H@Z + ??4uint128@absl@@QEAAAEAV01@H@Z + ??4uint128@absl@@QEAAAEAV01@_J@Z + ??4uint128@absl@@QEAAAEAV01@_K@Z + ??5absl@@YA?AVuint128@0@V10@H@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@AEBV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@H@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@P6AAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV345@@Z@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@P6AAEAVios_base@__Cr@std@@AEAV345@@Z@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@_W@Z + ??6absl@@YA?AVuint128@0@V10@H@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@AEBVCord@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@AEBVStatus@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@VTime@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vcrc32c_t@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vint128@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vuint128@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverity@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverityAtLeast@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverityAtMost@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4StatusCode@0@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@W4weekday@0123@@Z + ??6log_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@UUnprintableWrapper@01@@Z + ??6str_format_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@AEBVStreamable@01@@Z + ??6str_format_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@W4FormatConversionChar@1@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@01@@Z + ??7absl@@YA_NVuint128@0@@Z + ??8CharIterator@Cord@absl@@QEBA_NAEBV012@@Z + ??8ChunkIterator@Cord@absl@@QEBA_NAEBV012@@Z + ??8GraphId@synchronization_internal@absl@@QEBA_NAEBU012@@Z + ??8StatusRep@status_internal@absl@@QEBA_NAEBV012@@Z + ??8__Cr@std@@YA_NAEBU__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__hash_map_const_iterator@V?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@01@0@Z + ??8__Cr@std@@YA_NAEBV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@01@0@Z + ??8absl@@YA_NAEBVCord@0@0@Z + ??8absl@@YA_NAEBVCord@0@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??8absl@@YA_NVDuration@0@0@Z + ??8absl@@YA_NVTime@0@0@Z + ??8absl@@YA_NVint128@0@0@Z + ??8absl@@YA_NVuint128@0@0@Z + ??8container_internal@absl@@YA_NAEBVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@0@Z + ??8container_internal@absl@@YA_NAEBViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@0@Z + ??8cord_internal@absl@@YA_NAEBVInlineData@01@0@Z + ??8strings_internal@absl@@YA_NAEBV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??8strings_internal@absl@@YA_NAEBV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??8strings_internal@absl@@YA_NAEBV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??9CharIterator@Cord@absl@@QEBA_NAEBV012@@Z + ??9ChunkIterator@Cord@absl@@QEBA_NAEBV012@@Z + ??9GraphId@synchronization_internal@absl@@QEBA_NAEBU012@@Z + ??9__Cr@std@@YA_NAEBU__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@01@0@Z + ??9__Cr@std@@YA_NAEBV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@01@0@Z + ??9__Cr@std@@YA_NAEBV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@01@0@Z + ??9__Cr@std@@YA_NAEBV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@01@0@Z + ??9__Cr@std@@YA_NAEBV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@01@0@Z + ??9absl@@YA_NAEBVCord@0@0@Z + ??9absl@@YA_NVint128@0@0@Z + ??9absl@@YA_NVuint128@0@0@Z + ??9container_internal@absl@@YA_NAEBV?$BitMask@G$0BA@$0A@$0A@@01@0@Z + ??9container_internal@absl@@YA_NAEBV?$BitMask@_K$07$02$0A@@01@0@Z + ??9container_internal@absl@@YA_NAEBViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@0@Z + ??9strings_internal@absl@@YA_NAEBV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??9strings_internal@absl@@YA_NAEBV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??9strings_internal@absl@@YA_NAEBV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??A?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAAEAD_K@Z + ??A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAAEAUPayload@status_internal@1@_K@Z + ??A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBAAEBUPayload@status_internal@1@_K@Z + ??A?$Span@$$CBD@absl@@QEBAAEBD_K@Z + ??A?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAAEBVFormatArgImpl@str_format_internal@1@_K@Z + ??A?$Span@D@absl@@QEBAAEAD_K@Z + ??A?$Span@I@absl@@QEBAAEAI_K@Z + ??A?$__farray@P6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03@__Cr@std@@QEBAAEBQ6A_K$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@12@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@612@@Z_K@Z + ??A?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@$0BA@@__Cr@std@@QEAAAEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@AEBV567@@Z@_K@Z + ??A?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEBUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ??A?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@12@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??A?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??A?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@_K@Z + ??A?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@_K@Z + ??A?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??A?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@_K@Z + ??A?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEBUTransition@cctz@time_internal@absl@@_K@Z + ??A?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransitionType@cctz@time_internal@absl@@_K@Z + ??A?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEBUTransitionType@cctz@time_internal@absl@@_K@Z + ??A?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@_K@Z + ??ACord@absl@@QEBAD_K@Z + ??B?$FlagRegistrar@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$00@flags_internal@absl@@QEBA?AUFlagRegistrarEmpty@12@XZ + ??B?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@QEBA_NXZ + ??B?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@QEBAPEAVCordzHandle@cord_internal@absl@@XZ + ??B?$__policy_func@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEBA_NXZ + ??B?$function@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__Cr@std@@QEBA_NXZ + ??B?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ??B?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ??B?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ??B?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ??B?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEBA_NXZ + ??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ??BCordRepBtreeReader@cord_internal@absl@@QEBA_NXZ + ??BTimeZone@absl@@QEBA?AVtime_zone@cctz@time_internal@1@XZ + ??Bcrc32c_t@absl@@QEBAIXZ + ??Bint128@absl@@QEBADXZ + ??Bint128@absl@@QEBANXZ + ??Bint128@absl@@QEBA_JXZ + ??Bint128@absl@@QEBA_WXZ + ??Braw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV234@@Z@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@67@XZ + ??Buint128@absl@@QEBADXZ + ??Buint128@absl@@QEBAEXZ + ??Buint128@absl@@QEBAIXZ + ??Buint128@absl@@QEBANXZ + ??Buint128@absl@@QEBA_KXZ + ??Buint128@absl@@QEBA_NXZ + ??Buint128@absl@@QEBA_WXZ + ??C?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAAPEAURefcountedRep@CrcCordState@crc_internal@1@XZ + ??C?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBAPEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??C?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEBAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??C?$__hash_map_const_iterator@V?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBAPEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??C?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@QEBAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@XZ + ??C?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@QEBAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@XZ + ??C?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ??C?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@12@XZ + ??C?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@12@XZ + ??C?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAULogMessageData@LogMessage@log_internal@absl@@XZ + ??C?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ??C?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAVTimeZoneIf@cctz@time_internal@absl@@XZ + ??C?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAVTimeZoneInfo@cctz@time_internal@absl@@XZ + ??CChunkIterator@Cord@absl@@QEBAPEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??Citerator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBAPEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@XZ + ??D?$BitMask@G$0BA@$0A@$0A@@container_internal@absl@@QEBAIXZ + ??D?$BitMask@_K$07$02$0A@@container_internal@absl@@QEBAIXZ + ??D?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAAAEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@1@XZ + ??D?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAAAEAVFlagRegistry@flags_internal@1@XZ + ??D?$NoDestructor@VMutex@absl@@@absl@@QEAAAEAVMutex@1@XZ + ??D?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??D?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??D?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??D?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@__Cr@std@@QEBAAEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ??D?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@QEBAAEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ??D?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@QEBAAEBUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ??D?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEBAAEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??D?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEBAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??D?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??D?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEBAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@XZ + ??D?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEBAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@XZ + ??D?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@QEBAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@XZ + ??D?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@QEBAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@XZ + ??D?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@QEBAAEAPEAVCommandLineFlag@absl@@XZ + ??D?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEBAAEAPEAVCordzHandle@cord_internal@absl@@XZ + ??D?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@QEBAAEAPEAVLogSink@absl@@XZ + ??D?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@QEBAAEAPEBVCommandLineFlag@absl@@XZ + ??D?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@QEBAAEAUTransition@cctz@time_internal@absl@@XZ + ??D?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEBAAEAUTransitionType@cctz@time_internal@absl@@XZ + ??D?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@__Cr@std@@QEBAAEAUUnrecognizedFlag@absl@@XZ + ??D?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@QEBAAEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@AEBV567@@Z@XZ + ??D?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@XZ + ??D?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QEBAAEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ??D?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@__Cr@std@@QEBAAEBUUnrecognizedFlag@absl@@XZ + ??D?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEBA$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ??D?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@__Cr@std@@QEBA$$QEAPEAUCordRep@cord_internal@absl@@XZ + ??D?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEBA$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ??D?$move_iterator@PEAPEAVLogSink@absl@@@__Cr@std@@QEBA$$QEAPEAVLogSink@absl@@XZ + ??D?$move_iterator@PEAUPayload@status_internal@absl@@@__Cr@std@@QEBA$$QEAUPayload@status_internal@absl@@XZ + ??D?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@QEBA$$QEAUTransition@cctz@time_internal@absl@@XZ + ??D?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEBA$$QEAUTransitionType@cctz@time_internal@absl@@XZ + ??D?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@12@XZ + ??D?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@12@XZ + ??D?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEAULogMessageData@LogMessage@log_internal@absl@@XZ + ??D?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEBAAEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ??D?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@XZ + ??D?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@XZ + ??D?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEAVFlagStateInterface@flags_internal@absl@@XZ + ??DChunkIterator@Cord@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??D__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AU__deque_block_range@123@XZ + ??Dabsl@@YA?AVint128@0@V10@0@Z + ??Dabsl@@YA?AVuint128@0@V10@0@Z + ??Diterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBAAEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@XZ + ??E?$BitMask@G$0BA@$0A@$0A@@container_internal@absl@@QEAAAEAV012@XZ + ??E?$BitMask@_K$07$02$0A@@container_internal@absl@@QEAAAEAV012@XZ + ??E?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAAAEAV012@XZ + ??E?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAAAEAV012@XZ + ??E?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAAAEAV012@XZ + ??E?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@QEAAAEAV012@XZ + ??E?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$move_iterator@PEAPEAVLogSink@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$move_iterator@PEAUPayload@status_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??E?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAAAEAV012@XZ + ??EChunkIterator@Cord@absl@@QEAAAEAV012@XZ + ??E__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAU0123@XZ + ??Eiterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAAAEAV0123@XZ + ??Euint128@absl@@QEAAAEAV01@XZ + ??F?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@QEAAAEAV012@XZ + ??G__Cr@std@@YA_JAEBV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0@Z + ??Gabsl@@YA?AVDuration@0@V10@0@Z + ??Gabsl@@YA?AVDuration@0@V10@@Z + ??Gabsl@@YA?AVDuration@0@VTime@0@0@Z + ??Gabsl@@YA?AVint128@0@V10@0@Z + ??Gabsl@@YA?AVint128@0@V10@@Z + ??Gabsl@@YA?AVuint128@0@V10@0@Z + ??Gabsl@@YA?AVuint128@0@V10@@Z + ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??H?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@QEBA?AV012@_J@Z + ??H?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@QEBA?AV012@_J@Z + ??H?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@QEBA?AV012@_J@Z + ??H?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@QEBA?AV012@_J@Z + ??Habsl@@YA?AVDuration@0@V10@0@Z + ??Habsl@@YA?AVTime@0@V10@VDuration@0@@Z + ??Habsl@@YA?AVint128@0@V10@0@Z + ??Habsl@@YA?AVuint128@0@V10@0@Z + ??Hdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Hdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Iabsl@@YA?AVuint128@0@V10@0@Z + ??Iabsl@@YA?AW4StatusToStringMode@0@W410@0@Z + ??Iabsl@@YA?AW4chars_format@0@W410@0@Z + ??Kabsl@@YA?AVint128@0@V10@0@Z + ??Kabsl@@YA?AVuint128@0@V10@0@Z + ??Kabsl@@YA_JVDuration@0@0@Z + ??Labsl@@YA?AVDuration@0@V10@0@Z + ??Labsl@@YA?AVint128@0@V10@0@Z + ??Labsl@@YA?AVuint128@0@V10@0@Z + ??Mabsl@@YA_NVDuration@0@0@Z + ??Mabsl@@YA_NVint128@0@0@Z + ??Mabsl@@YA_NVuint128@0@0@Z + ??Mabsl@@YA_NW4LogSeverity@0@W4LogSeverityAtLeast@0@@Z + ??Nabsl@@YA_NVDuration@0@0@Z + ??Nabsl@@YA_NVint128@0@0@Z + ??Oabsl@@YA_NVDuration@0@0@Z + ??Oabsl@@YA_NVint128@0@0@Z + ??Oabsl@@YA_NVuint128@0@0@Z + ??Pabsl@@YA_NVDuration@0@0@Z + ??Pabsl@@YA_NVint128@0@0@Z + ??Pabsl@@YA_NVuint128@0@0@Z + ??R@?0???$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@23@_K@Z@QEBA?A?@@XZ + ??R@?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@QEBA?A?@@PEAD0@Z + ??R@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@45@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@UNoFormatter@12@@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBQEBUCordRep@cord_internal@absl@@@Z@QEBA?A?@@00@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@67@@Z@QEBA?A?@@XZ + ??R@?0???$construct@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QEAPEAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@AEBUpiecewise_construct_t@__Cr@std@@$$QEAV?$tuple@$$QEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QEAV?$tuple@$$QEAPEAVCommandLineFlag@absl@@@67@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV723@AEA_K@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QEAV423@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z@QEBA?A?@@XZ + ??R@?0???A?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAAEAD_K@Z@QEBA?A?@@XZ + ??R@?0???A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAAEAUPayload@status_internal@2@_K@Z@QEBA?A?@@XZ + ??R@?0???A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBAAEBUPayload@status_internal@2@_K@Z@QEBA?A?@@XZ + ??R@?0???A?$Span@$$CBD@absl@@QEBAAEBD_K@Z@QEBA?A?@@XZ + ??R@?0???A?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAAEBVFormatArgImpl@str_format_internal@2@_K@Z@QEBA?A?@@XZ + ??R@?0???A?$Span@D@absl@@QEBAAEAD_K@Z@QEBA?A?@@XZ + ??R@?0???A?$Span@I@absl@@QEBAAEAI_K@Z@QEBA?A?@@XZ + ??R@?0???CChunkIterator@Cord@absl@@QEBAPEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ@QEBA?A?@@XZ + ??R@?0???DChunkIterator@Cord@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ@QEBA?A?@@XZ + ??R@?0???EChunkIterator@Cord@absl@@QEAAAEAV123@XZ@QEBA?A?@@XZ + ??R@?0???R0?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@QEBA?A?@@PEAD_K@Z@QEBA?A?6@XZ + ??R@?0???R0?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@QEBA?A?@@PEAD0@Z@QEBA?A?6@XZ + ??R@?0??Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z@QEBA?A?@@0@Z + ??R@?0??AssertIsValidForComparison@container_internal@absl@@YAXPEBW4ctrl_t@23@EPEBE@Z@QEBA?A?@@XZ + ??R@?0??AssertSameContainer@container_internal@absl@@YAXPEBW4ctrl_t@23@0AEBQEBX1PEBE2@Z@QEBA?A?@@_NPEBD@Z + ??R@?0??CompareSlowPath@Cord@absl@@AEBAHAEBV23@_K1@Z@QEBA?A?@@PEAVChunkIterator@23@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??R@?0??CompareSlowPath@Cord@absl@@AEBAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K1@Z@QEBA?A?@@PEAVChunkIterator@23@PEAV456@@Z + ??R@?0??InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXAEBV234@@Z@QEBA?A?@@XZ + ??R@?0??InlinedRepToCode@Status@absl@@CA?AW4StatusCode@3@_K@Z@QEBA?A?@@XZ + ??R@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@QEBA?A?@@AEAVCommandLineFlag@4@@Z + ??R@?0??SetLength@CordBuffer@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??SubtractSize@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??SubtractSize@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAAEAPEAUCordRep@cord_internal@3@XZ@QEBA?A?@@XZ + ??R@?0??destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@@Z@QEBA?A?@@XZ + ??R@?0??erase@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@@Z@QEBA?A?@@XZ + ??R@?0??inline_size@Rep@InlineData@cord_internal@absl@@QEBA_KXZ@QEBA?A?@@XZ + ??R@?0??pop_back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAXXZ@QEBA?A?@@XZ + ??R@?0??remove_prefix@?$Span@$$CBD@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??remove_prefix@?$Span@D@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??remove_suffix@?$Span@$$CBD@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??remove_suffix@?$Span@D@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??set_inline_data@InlineData@cord_internal@absl@@QEAAXPEBD_K@Z@QEBA?A?@@XZ + ??R@?0??set_inline_size@Rep@InlineData@cord_internal@absl@@QEAAX_K@Z@QEBA?A?@@XZ + ??R@?0??transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@0@Z@QEBA?A?@@XZ + ??R@?0???$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@23@_K@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV723@AEA_K@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@AEBU45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QEAV423@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z@QEBA?A?@@XZ + ??R@?0??AssertSameContainer@container_internal@absl@@YAXPEBW4ctrl_t@23@0AEBQEBX1PEBE2@Z@QEBA?A?@@XZ + ??R@?0??erase@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@@Z@QEBA?A?@@XZ + ??R?$ConvertToContainer@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z + ??R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z + ??R?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@absl@@QEBAXPEAUCordRep@cord_internal@1@_K1@Z + ??R?$FunctionRef@$$A6AXPEAXPEBX@Z@absl@@QEBAXPEAXPEBX@Z + ??R?$FunctionRef@$$A6AXPEBW4ctrl_t@container_internal@absl@@PEAX@Z@absl@@QEBAXPEBW4ctrl_t@container_internal@1@PEAX@Z + ??R?$FunctionRef@$$A6AXV?$Span@I@absl@@@Z@absl@@QEBAXV?$Span@I@1@@Z + ??R?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z@absl@@QEBAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??R?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCord@absl@@@Z@absl@@QEBAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCord@1@@Z + ??R?$FunctionRef@$$A6A_K_K@Z@absl@@QEBA_K_K@Z + ??R?$HashImpl@V?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@hash_internal@absl@@QEBA_KAEBV?$tuple@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@__Cr@std@@@Z + ??R?$HashImpl@V?$tuple@AEB_K@__Cr@std@@@hash_internal@absl@@QEBA_KAEBV?$tuple@AEB_K@__Cr@std@@@Z + ??R?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@QEBA_K_K@Z + ??R?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@__Cr@std@@QEAAXPEBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??R?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??R?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??R?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@12@@Z + ??R?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z + ??R?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@12@@Z + ??R?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@12@@Z + ??R?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@X@__Cr@std@@QEBA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@@Z + ??R?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@X@__Cr@std@@QEBA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@@Z + ??R?$__policy_func@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__function@__Cr@std@@QEBA?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@23@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??R?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEBAXAEAVCommandLineFlag@absl@@@Z + ??R?$__policy_func@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QEBA_NAEBVCommandLineFlag@absl@@@Z + ??R?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@12@@Z + ??R?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@12@@Z + ??R?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEBA_NAEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QEBA_KAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEBAXPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??R?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@QEBAXPEAULogMessageData@LogMessage@log_internal@absl@@@Z + ??R?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@QEBAXPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z + ??R?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@QEBAXPEAVFallbackCrcMemcpyEngine@crc_internal@absl@@@Z + ??R?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@QEBAXPEAVFlagState@flags_internal@absl@@@Z + ??R?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@QEBAXPEAVFlagStateInterface@flags_internal@absl@@@Z + ??R?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@QEBAXPEAVTimeZoneIf@cctz@time_internal@absl@@@Z + ??R?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@QEBAXPEAVTimeZoneInfo@cctz@time_internal@absl@@@Z + ??R?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@QEBAXPEAVTimeZoneLibC@cctz@time_internal@absl@@@Z + ??R?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@QEBAXPEAVZoneInfoSource@cctz@time_internal@absl@@@Z + ??R?$divides@Vuint128@absl@@@__Cr@std@@QEBA?AVuint128@absl@@AEBV34@0@Z + ??R?$equal_to@PEBUCordRep@cord_internal@absl@@@__Cr@std@@QEBA_NAEBQEBUCordRep@cord_internal@absl@@0@Z + ??R?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__Cr@std@@QEBA?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$function@$$A6AXAEAVCommandLineFlag@absl@@@Z@__Cr@std@@QEBAXAEAVCommandLineFlag@absl@@@Z + ??R?$function@$$A6A_NAEBVCommandLineFlag@absl@@@Z@__Cr@std@@QEBA_NAEBVCommandLineFlag@absl@@@Z + ??R?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@QEBA_KPEBUCordRep@cord_internal@absl@@@Z + ??RAllowEmpty@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??RBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@23@@Z@QEAA_KV?$Span@$$CBD@3@@Z + ??RBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@23@@Z@QEAA_KV?$variant@IHM@__Cr@std@@@Z + ??RBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@23@@Z@QEAA_KV?$variant@_K_JIH_N@__Cr@std@@@Z + ??RBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@23@@Z@QEAA_KV?$variant@_K_JN@__Cr@std@@@Z + ??RByCivilTime@Transition@cctz@time_internal@absl@@QEBA_NAEBU1234@0@Z + ??RByUnixTime@Transition@cctz@time_internal@absl@@QEBA_NAEBU1234@0@Z + ??RDynValueDeleter@flags_internal@absl@@QEBAXPEAX@Z + ??RErrnoSaver@base_internal@absl@@QEBAHXZ + ??RSkipEmpty@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??RStringEq@container_internal@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ??R__destroy_vector@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z + ??Sabsl@@YA?AVuint128@0@V10@@Z + ??Tabsl@@YA?AVuint128@0@V10@0@Z + ??Uabsl@@YA?AVuint128@0@V10@0@Z + ??Ustr_format_internal@absl@@YA?AW4Flags@01@W4201@0@Z + ??XDuration@absl@@QEAAAEAV01@N@Z + ??XDuration@absl@@QEAAAEAV01@_J@Z + ??Xint128@absl@@QEAAAEAV01@V01@@Z + ??Xuint128@absl@@QEAAAEAV01@V01@@Z + ??Y?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@QEAAAEAV012@_J@Z + ??Y?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@QEAAAEAV012@_J@Z + ??Y?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@QEAAAEAV012@_J@Z + ??Y?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@QEAAAEAV012@_J@Z + ??Y?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@QEAAAEAV012@_J@Z + ??Y?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@QEAAAEAV012@_J@Z + ??YDuration@absl@@QEAAAEAV01@V01@@Z + ??YTime@absl@@QEAAAEAV01@VDuration@1@@Z + ??Yint128@absl@@QEAAAEAV01@V01@@Z + ??Yuint128@absl@@QEAAAEAV01@V01@@Z + ??Z?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAAAEAV01234@_J@Z + ??ZDuration@absl@@QEAAAEAV01@V01@@Z + ??Zint128@absl@@QEAAAEAV01@V01@@Z + ??Zuint128@absl@@QEAAAEAV01@V01@@Z + ??_0Duration@absl@@QEAAAEAV01@N@Z + ??_0Duration@absl@@QEAAAEAV01@_J@Z + ??_0uint128@absl@@QEAAAEAV01@V01@@Z + ??_1Duration@absl@@QEAAAEAV01@V01@@Z + ??_2uint128@absl@@QEAAAEAV01@H@Z + ??_3uint128@absl@@QEAAAEAV01@H@Z + ??_4uint128@absl@@QEAAAEAV01@V01@@Z + ??_5uint128@absl@@QEAAAEAV01@V01@@Z + ??_6uint128@absl@@QEAAAEAV01@V01@@Z + ?AbortedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbsDuration@absl@@YA?AVDuration@1@V21@@Z + ?AbslFormatFlush@detect_specialization@log_internal@absl@@YAXPEAVStringifySink@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslFormatFlush@str_format_internal@absl@@YAXPEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?AbslFormatFlush@str_format_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?AbslFormatFlush@str_format_internal@absl@@YAXPEAVBufferRawSink@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslFormatFlush@str_format_internal@absl@@YAXPEAVFILERawSink@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVDuration@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAW4LogSeverity@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAFPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAGPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAIPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAJPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAKPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAMPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEANPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@1@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@45@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVint128@2@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVuint128@2@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_JPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_KPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_NPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LogSeverity@1@@Z + ?AbslUnparseFlag@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@45@@Z + ?AbslUnparseFlag@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@12@@Z + ?Absorb@RandenHwAes@random_internal@absl@@SAXPEBXPEAX@Z + ?Absorb@RandenSlow@random_internal@absl@@SAXPEBXPEAX@Z + ?AddHint@BestHints@flags_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z + ?AddLogSink@log_internal@absl@@YAXPEAVLogSink@2@@Z + ?AddResult@int128_internal@absl@@YA?AVuint128@2@V32@0@Z + ?AddSize@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z + ?AddSize@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z + ?AddSize@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z + ?AddSize@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z + ?AddWithCarry@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHI@Z + ?AddWithCarry@?$BigUnsigned@$03@strings_internal@absl@@AEAAXH_K@Z + ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHI@Z + ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXH_K@Z + ?AddressIsReadable@debugging_internal@absl@@YA_NPEBX@Z + ?Advance@Cord@absl@@SAXPEAVCharIterator@12@_K@Z + ?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AEAA?AV23@_K@Z + ?AdvanceBtree@ChunkIterator@Cord@absl@@AEAAAEAV123@XZ + ?AdvanceBytes@ChunkIterator@Cord@absl@@AEAAX_K@Z + ?AdvanceBytesBtree@ChunkIterator@Cord@absl@@AEAAX_K@Z + ?AlignBegin@CordRepBtree@cord_internal@absl@@AEAAXXZ + ?AlignEnd@CordRepBtree@cord_internal@absl@@AEAAXXZ + ?AlignUpTo@container_internal@absl@@YA_K_K0@Z + ?Alloc@LowLevelAlloc@base_internal@absl@@SAPEAX_K@Z + ?Alloc@flags_internal@absl@@YAPEAXP6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ?AllocWithArena@LowLevelAlloc@base_internal@absl@@SAPEAX_KPEAUArena@123@@Z + ?Allocate@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAPEAUCordRep@cord_internal@3@_K@Z + ?Allocate@?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAPEAVLogSink@3@_K@Z + ?Allocate@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@_K@Z + ?Allocate@?$MallocAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SA?AU?$Allocation@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@Z + ?Allocate@?$MallocAdapter@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SA?AU?$Allocation@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@23@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@Z + ?Allocate@?$MallocAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SA?AU?$Allocation@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@Z + ?Allocate@?$MallocAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SA?AU?$Allocation@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@Z + ?AllocatedSize@CordRepFlat@cord_internal@absl@@QEBA_KXZ + ?AllocatedSizeToTag@cord_internal@absl@@YAE_K@Z + ?AllocatedSizeToTagUnchecked@cord_internal@absl@@YAE_K@Z + ?AllowsUnprotectedRead@MaskedPointer@flags_internal@absl@@QEBA_NXZ + ?AlreadyExistsError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AlwaysTrue@Condition@absl@@CA_NPEBV12@@Z + ?AnnotateConstruct@NonEmptyInlinedStorage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAX_K@Z + ?AnnotateDestruct@NonEmptyInlinedStorage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAX_K@Z + ?Append@?$AppendUninitializedTraits@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@X@strings_internal@absl@@SAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ?Append@Cord@absl@@QEAAX$$QEAV12@@Z + ?Append@Cord@absl@@QEAAXAEBV12@@Z + ?Append@Cord@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z + ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z + ?Append@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@detect_specialization@log_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@detect_specialization@log_internal@absl@@QEAAX_KD@Z + ?Append@StringifySink@strings_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@strings_internal@absl@@QEAAX_KD@Z + ?AppendArray@InlineRep@Cord@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@3@@Z + ?AppendCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$initializer_list@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@5@@Z + ?AppendPrecise@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?AppendSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z + ?AppendText@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_KV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTruncated@log_internal@absl@@YA_KD_KAEAV?$Span@D@2@@Z + ?AppendTruncated@log_internal@absl@@YA_KV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV?$Span@D@2@@Z + ?AppendTruncated@log_internal@absl@@YA_KV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@AEAV?$Span@D@2@@Z + ?ApplyMask@MaskedPointer@flags_internal@absl@@AEAAX_K@Z + ?ApplySubstitutions@strings_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@45@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AreItersFromSameContainer@container_internal@absl@@YA_NPEBW4ctrl_t@12@0AEBQEBX1@Z + ?AsValueType@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@CAPEADPEAD@Z + ?AsciiStrToLower@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AsciiStrToLower@ascii_internal@absl@@YAXPEADPEBD_K@Z + ?AsciiStrToUpper@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AsciiStrToUpper@ascii_internal@absl@@YAXPEADPEBD_K@Z + ?AssertHeld@CordzInfo@cord_internal@absl@@QEAAXXZ + ?AssertHeld@Mutex@absl@@QEBAXXZ + ?AssertHeld@SpinLock@base_internal@absl@@QEBAXXZ + ?AssertInSooMode@CommonFields@container_internal@absl@@AEBAXXZ + ?AssertIsFull@container_internal@absl@@YAXPEBW4ctrl_t@12@EPEBEPEBD@Z + ?AssertIsValidForComparison@container_internal@absl@@YAXPEBW4ctrl_t@12@EPEBE@Z + ?AssertNotDebugCapacity@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEBAXXZ + ?AssertNotHeld@Mutex@absl@@QEBAXXZ + ?AssertReaderHeld@Mutex@absl@@QEBAXXZ + ?AssertSameContainer@container_internal@absl@@YAXPEBW4ctrl_t@12@0AEBQEBX1PEBE2@Z + ?AssertValid@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@_N@Z + ?AssertValid@CordRepBtree@cord_internal@absl@@SAPEBV123@PEBV123@_N@Z + ?AssertValidType@FlagImpl@flags_internal@absl@@QEBAXPEBXP6APEBVtype_info@@XZ@Z + ?AssignLargeString@Cord@absl@@AEAAAEAV12@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AssignNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXPEAUPayload@status_internal@3@@Z + ?AssignSlow@InlineRep@Cord@absl@@AEAAXAEBV123@@Z + ?AsyncSignalSafeWriteError@raw_log_internal@absl@@YAXPEBD_K@Z + ?At@TimeZone@absl@@QEBA?AUCivilInfo@12@VTime@2@@Z + ?At@TimeZone@absl@@QEBA?AUTimeInfo@12@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@2@@Z + ?AtLocation@LogMessage@log_internal@absl@@QEAAAEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?AtomicBufferValue@FlagImpl@flags_internal@absl@@AEBAPEAU?$atomic@_K@__Cr@std@@XZ + ?Avail@FormatSinkImpl@str_format_internal@absl@@AEBA_KXZ + ?Await@Mutex@absl@@QEAAXAEBVCondition@2@@Z + ?AwaitCommon@Mutex@absl@@AEAA_NAEBVCondition@2@VKernelTimeout@synchronization_internal@2@@Z + ?Base64Escape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?Base64Escape@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?Base64EscapeInternal@strings_internal@absl@@YA_KPEBE_KPEAD1PEBD_N@Z + ?Base64Unescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?Basename@flags_internal@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@@Z + ?BindWithPack@str_format_internal@absl@@YA_NPEBUUnboundConversion@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@PEAVBoundConversion@12@@Z + ?BitCastToSigned@int128_internal@absl@@YA_J_K@Z + ?Block@Barrier@absl@@QEAA_NXZ + ?Block@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?BreakTime@Impl@time_zone@cctz@time_internal@absl@@QEBA?AUabsolute_lookup@2345@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BreakTime@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AUabsolute_lookup@time_zone@234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BreakTime@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AUabsolute_lookup@time_zone@234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BufferSizeFor@log_internal@absl@@YA_K_KW4WireType@12@@Z + ?BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@12@@Z + ?BytesToHexString@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CPUSupportsRandenHwAes@random_internal@absl@@YA_NXZ + ?CUnescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@1@Z + ?CalculateBase64EscapedLenInternal@strings_internal@absl@@YA_K_K_N@Z + ?CallVoidPtrFunction@Condition@absl@@CA_NPEBV12@@Z + ?CancelledError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Capacity@CordRepFlat@cord_internal@absl@@QEBA_KXZ + ?CapacityToGrowth@container_internal@absl@@YA_K_K@Z + ?CappedDamerauLevenshteinDistance@strings_internal@absl@@YAEV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0E@Z + ?CatPieces@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$initializer_list@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@5@@Z + ?Ceil@absl@@YA?AVDuration@1@V21@0@Z + ?CheckDefaultValueParsingRoundtrip@FlagImpl@flags_internal@absl@@EEBAXXZ + ?CheckDefaultValueParsingRoundtrip@PrivateHandleAccessor@flags_internal@absl@@SAXAEBVCommandLineFlag@3@@Z + ?CheckFastPathSetting@str_format_internal@absl@@YA_NAEBUUnboundConversion@12@@Z + ?CheckInvariants@GraphCycles@synchronization_internal@absl@@QEBA_NXZ + ?CheckMask@MaskedPointer@flags_internal@absl@@AEBA_N_K@Z + ?CheckstrcasecmpfalseImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcasecmptrueImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcmpfalseImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcmptrueImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?Checksum@CrcCordState@crc_internal@absl@@QEBA?AVcrc32c_t@3@XZ + ?ChunkRemaining@Cord@absl@@SA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCharIterator@12@@Z + ?Chunks@Cord@absl@@QEBA?AVChunkRange@12@XZ + ?CityHash32@hash_internal@absl@@YAIPEBD_K@Z + ?CityHash64@hash_internal@absl@@YA_KPEBD_K@Z + ?CityHash64WithSeed@hash_internal@absl@@YA_KPEBD_K1@Z + ?CityHash64WithSeeds@hash_internal@absl@@YA_KPEBD_K11@Z + ?Clear@Cord@absl@@QEAAXXZ + ?ClearBackingArray@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@PEAX_N3@Z + ?ClearCurrentThreadIdentity@base_internal@absl@@YAXXZ + ?ClearLogBacktraceLocation@absl@@YAXXZ + ?ClearTimeZoneMapTestOnly@Impl@time_zone@cctz@time_internal@absl@@SAXXZ + ?Clone@flags_internal@absl@@YAPEAXP6APEAXW4FlagOp@12@PEBXPEAX2@Z1@Z + ?CloneAndUnref@StatusRep@status_internal@absl@@QEBAPEAV123@XZ + ?CodeToInlinedRep@Status@absl@@CA_KW4StatusCode@2@@Z + ?CombineContiguousImpl@hash_internal@absl@@YA_K_KPEBE0U?$integral_constant@H$03@__Cr@std@@@Z + ?CombineContiguousImpl@hash_internal@absl@@YA_K_KPEBE0U?$integral_constant@H$07@__Cr@std@@@Z + ?CombineLargeContiguousImplOn32BitLengthGt8@hash_internal@absl@@YA_KPEBE_K1@Z + ?CombineLargeContiguousImplOn64BitLengthGt32@hash_internal@absl@@YA_KPEBE_K1@Z + ?CommitTree@InlineRep@Cord@absl@@QEAAXPEBUCordRep@cord_internal@3@PEAU453@AEBVCordzUpdateScope@53@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?Compare@Cord@absl@@QEBAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?CompareImpl@Cord@absl@@AEBAHAEBV12@@Z + ?CompareSlowPath@Cord@absl@@AEBAHAEBV12@_K1@Z + ?CompareSlowPath@Cord@absl@@AEBAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K1@Z + ?Compute@CrcNonTemporalMemcpyAVXEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?Compute@CrcNonTemporalMemcpyEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?Compute@FallbackCrcMemcpyEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?ComputeCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SA_K_K0@Z + ?ComputeCapacity@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SA_K_K0@Z + ?ConcatCrc32c@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@3@@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@V?$move_iterator@PEAPEAVLogSink@absl@@@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@3@@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@3@@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@3@@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEAVFormatArgImpl@str_format_internal@3@@Z + ?Consume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z + ?ConsumeBeginTo@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@_K1@Z + ?ConsumePrefix@absl@@YA_NPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?ConsumeSuffix@absl@@YA_NPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?ConsumeUnboundConversion@str_format_internal@absl@@YAPEBDPEBD0PEAUUnboundConversion@12@PEAH@Z + ?ConsumeUnboundConversionNoInline@str_format_internal@absl@@YAPEBDPEBD0PEAUUnboundConversion@12@PEAH@Z + ?Contains@Cord@absl@@QEBA_NAEBV12@@Z + ?Contains@Cord@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Contains@str_format_internal@absl@@YA_NW4FormatConversionCharSet@2@D@Z + ?Contains@str_format_internal@absl@@YA_NW4FormatConversionCharSet@2@W4FormatConversionChar@2@@Z + ?ControlOffset@container_internal@absl@@YA_K_N@Z + ?ControlWord@base_internal@absl@@YAPEAU?$atomic@I@__Cr@std@@PEAVonce_flag@2@@Z + ?ConvertBoolArg@str_format_internal@absl@@YA_N_NPEAVFormatSinkImpl@12@@Z + ?ConvertDateTime@absl@@YA?AUTimeConversion@1@_JHHHHHVTimeZone@1@@Z + ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAW4ctrl_t@12@_K@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NMAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NNAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NOAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?ConvertOne@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NAEBUUnboundConversion@34@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ConvertSpecialToEmptyAndFullToDeleted@GroupSse2Impl@container_internal@absl@@QEBAXPEAW4ctrl_t@23@@Z + ?Copy@CordRepBtree@cord_internal@absl@@AEBAPEAV123@XZ + ?Copy@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@AEBV312@V?$FunctionRef@$$A6AXPEAXPEBX@Z@2@@Z + ?Copy@flags_internal@absl@@YAXP6APEAXW4FlagOp@12@PEBXPEAX2@Z12@Z + ?CopyBeginTo@CordRepBtree@cord_internal@absl@@AEBAPEAV123@_K0@Z + ?CopyConstruct@flags_internal@absl@@YAXP6APEAXW4FlagOp@12@PEBXPEAX2@Z12@Z + ?CopyCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?CopyInlineToString@InlineData@cord_internal@absl@@QEBAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?CopyPrefix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K_N@Z + ?CopyRaw@CordRepBtree@cord_internal@absl@@AEBAPEAV123@_K@Z + ?CopySuffix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z + ?CopyTo@InlineRep@Cord@absl@@QEBAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?CopyToArray@InlineRep@Cord@absl@@QEBAXPEAD@Z + ?CopyToArrayImpl@Cord@absl@@AEBAXPEAD@Z + ?CopyToArraySlowPath@Cord@absl@@AEBAXPEAD@Z + ?CopyToEndFrom@CordRepBtree@cord_internal@absl@@AEBAPEAV123@_K0@Z + ?Crash@Helper@internal_statusor@absl@@SAXAEBVStatus@3@@Z + ?Crc32CAndCopy@crc_internal@absl@@YA?AVcrc32c_t@2@PEIAXPEIBX_KV32@_N@Z + ?Crc32c@CRC@crc_internal@absl@@SAPEAV123@XZ + ?CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@3@PEIAXPEIBX_KV43@_N@Z + ?Create@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAUCordRep@23@@Z + ?Create@CordRepFlat@cord_internal@absl@@SAPEAU123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?CreateSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@@Z + ?CreateThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ + ?CreateWithCustomLimit@CordBuffer@absl@@SA?AV12@_K0@Z + ?CreateWithDefaultLimit@CordBuffer@absl@@SA?AV12@_K@Z + ?Current@CordRepBtreeNavigator@cord_internal@absl@@QEBAPEAUCordRep@23@XZ + ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPEAUThreadIdentity@12@XZ + ?CurrentValue@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Data@CordRepBtree@cord_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?Data@CordRepFlat@cord_internal@absl@@QEAAPEADXZ + ?Data@CordRepFlat@cord_internal@absl@@QEBAPEBDXZ + ?DataGuard@FlagImpl@flags_internal@absl@@AEBAAEAVMutex@3@XZ + ?DataLossError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?DeadlineExceededError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Deallocate@?$MallocAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@3@_K@Z + ?Deallocate@?$MallocAdapter@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@3@_K@Z + ?Deallocate@?$MallocAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@3@_K@Z + ?Deallocate@?$MallocAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PEAVFormatArgImpl@str_format_internal@3@_K@Z + ?DeallocateIfAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?DeallocateIfAllocated@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?DeallocateIfAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?DeallocateIfAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?DecodeFrom@ProtoField@log_internal@absl@@QEAA_NPEAV?$Span@$$CBD@3@@Z + ?DecodeRustPunycode@debugging_internal@absl@@YAPEADUDecodeRustPunycodeOptions@12@@Z + ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_JI@Z + ?Decrement@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ + ?DecrementCount@BlockingCounter@absl@@QEAA_NXZ + ?DecrementExpectHighRefcount@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ + ?DecrementSynchSem@Mutex@absl@@CA_NPEAV12@PEAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z + ?DeduceUsageFlags@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ + ?DefaultCapacity@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CA_KXZ + ?DefaultIterControl@container_internal@absl@@YAPEAW4ctrl_t@12@XZ + ?DefaultKind@FlagImpl@flags_internal@absl@@AEBA?AW4FlagDefaultKind@23@XZ + ?DefaultStackUnwinder@absl@@YAHPEAPEAXPEAHHHPEBX1@Z + ?DefaultStackUnwinder@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHHPEBX2@Z + ?DefaultValue@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Delete@CordRepBtree@cord_internal@absl@@SAXPEAV123@@Z + ?Delete@CordRepExternal@cord_internal@absl@@SAXPEAUCordRep@23@@Z + ?Delete@CordRepFlat@cord_internal@absl@@SAXPEAUCordRep@23@@Z + ?Delete@CordzHandle@cord_internal@absl@@SAXPEAV123@@Z + ?Delete@flags_internal@absl@@YAXP6APEAXW4FlagOp@12@PEBXPEAX2@Z2@Z + ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPEAUArena@123@@Z + ?Demangle@debugging_internal@absl@@YA_NPEBDPEAD_K@Z + ?DemangleRustSymbolEncoding@debugging_internal@absl@@YA_NPEBDPEAD_K@Z + ?DemangleString@debugging_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBD@Z + ?Description@Impl@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Description@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Description@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Destroy@CordRep@cord_internal@absl@@SAXPEAU123@@Z + ?Destroy@CordRepBtree@cord_internal@absl@@SAXPEAV123@@Z + ?Destroy@CordRepCrc@cord_internal@absl@@SAXPEAU123@@Z + ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAXXZ + ?DestroyCordSlow@Cord@absl@@AEAAXXZ + ?DestroyElements@?$DestroyAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$00@inlined_vector_internal@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@3@_K@Z + ?DestroyElements@?$DestroyAdapter@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$00@inlined_vector_internal@absl@@SAXAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@3@_K@Z + ?DestroyElements@?$DestroyAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@3@_K@Z + ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z + ?DidAllocate@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA_NXZ + ?DidAllocate@?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA_NXZ + ?DidAllocate@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA_NXZ + ?Die@LogMessage@log_internal@absl@@AEAAXXZ + ?DieBecauseNull@log_internal@absl@@YAXPEBDH0@Z + ?Digits10@?$BigUnsigned@$03@strings_internal@absl@@SAHXZ + ?Digits10@?$BigUnsigned@$0FE@@strings_internal@absl@@SAHXZ + ?DisableRescheduling@SchedulingGuard@base_internal@absl@@CA_NXZ + ?DoIgnoreLeak@absl@@YAXPEBX@Z + ?DoLoad@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@AEBAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@ZXZ + ?DoLoad@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@AEBAP6AXPEBDH000@ZXZ + ?DoLoad@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@AEBAP6AXPEBDPEBX@ZXZ + ?DoLoad@?$AtomicHook@P6AXPEBDPEBX_J@Z@base_internal@absl@@AEBAP6AXPEBDPEBX_J@ZXZ + ?DoLoad@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@AEBAP6AXPEBX_J@ZXZ + ?DoLoad@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@AEBAP6AXW4LogSeverity@3@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@ZXZ + ?DoLoad@?$AtomicHook@P6AXXZ@base_internal@absl@@AEBAP6AXXZXZ + ?DoLoad@?$AtomicHook@P6AX_J@Z@base_internal@absl@@AEBAP6AX_J@ZXZ + ?DoLoad@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@AEBAP6A_NW4LogSeverity@3@PEBDHPEAPEADPEAH@ZXZ + ?DoStore@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@AEAA_NP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@Z@Z + ?DoStore@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@AEAA_NP6AXPEBDH000@Z@Z + ?DoStore@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@AEAA_NP6AXPEBDPEBX@Z@Z + ?DoStore@?$AtomicHook@P6AXPEBDPEBX_J@Z@base_internal@absl@@AEAA_NP6AXPEBDPEBX_J@Z@Z + ?DoStore@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@AEAA_NP6AXPEBX_J@Z@Z + ?DoStore@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@AEAA_NP6AXW4LogSeverity@3@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@Z + ?DoStore@?$AtomicHook@P6AXXZ@base_internal@absl@@AEAA_NP6AXXZ@Z + ?DoStore@?$AtomicHook@P6AX_J@Z@base_internal@absl@@AEAA_NP6AX_J@Z@Z + ?DoStore@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@AEAA_NP6A_NW4LogSeverity@3@PEBDHPEAPEADPEAH@Z@Z + ?Dtor@Mutex@absl@@AEAAXXZ + ?DummyFunction@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@CA?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@CAXPEBDH000@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@CAXPEBDPEBX@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDPEBX_J@Z@base_internal@absl@@CAXPEBDPEBX_J@Z + ?DummyFunction@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@CAXPEBX_J@Z + ?DummyFunction@?$AtomicHook@P6AXXZ@base_internal@absl@@CAXXZ + ?DummyFunction@?$AtomicHook@P6AX_J@Z@base_internal@absl@@CAX_J@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@67@@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_NAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@67@@Z + ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXQEAXQEBQEAXQEAHHH_NP6AXPEBDPEAX@Z5@Z + ?DumpStackTrace@debugging_internal@absl@@YAXHH_NP6AXPEBDPEAX@Z2@Z + ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z + ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z + ?Edge@CordRepBtree@cord_internal@absl@@QEBAPEAUCordRep@23@W4EdgeType@123@@Z + ?Edge@CordRepBtree@cord_internal@absl@@QEBAPEAUCordRep@23@_K@Z + ?EdgeData@cord_internal@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEBUCordRep@12@@Z + ?Edges@CordRepBtree@cord_internal@absl@@QEBA?AV?$Span@QEAUCordRep@cord_internal@absl@@@3@XZ + ?Edges@CordRepBtree@cord_internal@absl@@QEBA?AV?$Span@QEAUCordRep@cord_internal@absl@@@3@_K0@Z + ?EmplaceTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@AEBVInlineData@53@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?EmplaceTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?EmptyGeneration@container_internal@absl@@YAPEAEXZ + ?EmptyString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?EnableDebugLog@CondVar@absl@@QEAAXPEBD@Z + ?EnableDebugLog@Mutex@absl@@QEAAXPEBD@Z + ?EnableInvariantDebugging@Mutex@absl@@QEAAXP6AXPEAX@Z0@Z + ?EnableLogPrefix@absl@@YAX_N@Z + ?EnableMutexInvariantDebugging@absl@@YAX_N@Z + ?EnableRescheduling@SchedulingGuard@base_internal@absl@@CAX_N@Z + ?EnableSymbolizeLogStackTrace@log_internal@absl@@YAX_N@Z + ?Encode32Bit@log_internal@absl@@YA_N_KHPEAV?$Span@D@2@@Z + ?Encode32Bit@log_internal@absl@@YA_N_KIPEAV?$Span@D@2@@Z + ?Encode64Bit@log_internal@absl@@YA_N_K0PEAV?$Span@D@2@@Z + ?Encode64Bit@log_internal@absl@@YA_N_K_JPEAV?$Span@D@2@@Z + ?EncodeBytes@log_internal@absl@@YA_N_KV?$Span@$$CBD@2@PEAV?$Span@D@2@@Z + ?EncodeBytesTruncate@log_internal@absl@@YA_N_KV?$Span@$$CBD@2@PEAV?$Span@D@2@@Z + ?EncodeDouble@log_internal@absl@@YA_N_KNPEAV?$Span@D@2@@Z + ?EncodeFloat@log_internal@absl@@YA_N_KMPEAV?$Span@D@2@@Z + ?EncodeMessageLength@log_internal@absl@@YAXV?$Span@D@2@PEBV32@@Z + ?EncodeMessageStart@log_internal@absl@@YA?AV?$Span@D@2@_K0PEAV32@@Z + ?EncodeStringTruncate@log_internal@absl@@YA_N_KV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$Span@D@2@@Z + ?EncodeStructuredProtoField@log_internal@absl@@YA_NUStructuredProtoField@12@AEAV?$Span@D@2@@Z + ?EncodeUTF8Char@strings_internal@absl@@YA_KPEAD_U@Z + ?EncodeVarint@log_internal@absl@@YA_N_K0PEAV?$Span@D@2@@Z + ?EncodeVarint@log_internal@absl@@YA_N_KHPEAV?$Span@D@2@@Z + ?EncodeVarint@log_internal@absl@@YA_N_KIPEAV?$Span@D@2@@Z + ?EncodeVarint@log_internal@absl@@YA_N_K_JPEAV?$Span@D@2@@Z + ?EncodeWaitCycles@SpinLock@base_internal@absl@@KAI_J0@Z + ?EndsWith@Cord@absl@@QEBA_NAEBV12@@Z + ?EndsWith@Cord@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?EndsWith@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EndsWithIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EqualsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EqualsImpl@Cord@absl@@AEBA_NAEBV12@_K@Z + ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z + ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z + ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z + ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z + ?Eval@Condition@absl@@QEBA_NXZ + ?Excess@str_format_internal@absl@@YA_K_K0@Z + ?ExitOnDFatal@log_internal@absl@@YA_NXZ + ?ExpectedChecksum@Cord@absl@@QEBA?AV?$optional@I@__Cr@std@@XZ + ?Extend@CRC32@crc_internal@absl@@UEBAXPEAIPEBX_K@Z + ?ExtendByZeroes@CRC32@crc_internal@absl@@UEBAXPEAI_K@Z + ?ExtendByZeroesImpl@CRC32@crc_internal@absl@@CAXPEAI_KQEBI2@Z + ?ExtendCrc32c@absl@@YA?AVcrc32c_t@1@V21@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ExtendCrc32cByZeroes@absl@@YA?AVcrc32c_t@1@V21@_K@Z + ?ExtendCrc32cInline@crc_internal@absl@@YA_NPEAIPEBD_K@Z + ?ExtendCrc32cInternal@crc_internal@absl@@YA?AVcrc32c_t@2@V32@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ExtendTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NXZ + ?ExtractAppendBuffer@CordRepBtree@cord_internal@absl@@SA?AUExtractResult@CordRep@23@PEAV123@_K@Z + ?ExtractFront@CordRepBtree@cord_internal@absl@@CAPEAUCordRep@23@PEAV123@@Z + ?FDivDuration@absl@@YANVDuration@1@0@Z + ?FLAGS_noflagfile@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FNMatch@log_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?FailQuietly@LogMessage@log_internal@absl@@KAXXZ + ?FailWithoutStackTrace@LogMessage@log_internal@absl@@KAXXZ + ?FailedPreconditionError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FailureSignalToString@debugging_internal@absl@@YAPEBDH@Z + ?FastHexToBufferZeroPad16@numbers_internal@absl@@YA_K_KPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEADHPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEADIPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_JPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_KPEAD@Z + ?FastTypeId@flags_internal@absl@@YAPEBXP6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ?Fer@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?Filename@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?FillParentStack@CordzInfo@cord_internal@absl@@CA_KPEBV123@PEAPEAX@Z + ?FillWordTable@CRCImpl@crc_internal@absl@@SAXIIHPEAY0BAA@I@Z + ?FillZeroesTable@CRCImpl@crc_internal@absl@@SAHIPEAY0BAA@I@Z + ?FinalizeEncodingAndFormat@LogMessageData@LogMessage@log_internal@absl@@QEAAXXZ + ?FinalizeRegistry@flags_internal@absl@@YAXXZ + ?Find@ByAnyChar@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByAsciiWhitespace@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByChar@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByLength@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByString@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@Cord@absl@@QEBA?AVCharIterator@12@AEBV12@@Z + ?Find@Cord@absl@@QEBA?AVCharIterator@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindCommandLineFlag@absl@@YAPEAVCommandLineFlag@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindFlag@FlagRegistry@flags_internal@absl@@QEAAPEAVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindFlatStartPiece@InlineRep@Cord@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?FindImpl@Cord@absl@@AEBA?AVCharIterator@12@V312@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindLongestCommonPrefix@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@0@Z + ?FindLongestCommonSuffix@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@0@Z + ?FindPath@GraphCycles@synchronization_internal@absl@@QEBAHUGraphId@23@0HQEAU423@@Z + ?FiveToTheNth@?$BigUnsigned@$03@strings_internal@absl@@SA?AV123@H@Z + ?FiveToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@SA?AV123@H@Z + ?FixUpStack@internal_stacktrace@absl@@YAXPEAPEAXPEA_KPEAH_KAEA_K@Z + ?FixedOffsetFromName@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FixedOffsetToAbbr@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FixedOffsetToName@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FlagHelp@flags_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCommandLineFlag@2@W4HelpFormat@12@@Z + ?FlagsContains@str_format_internal@absl@@YA_NW4Flags@12@0@Z + ?FlagsHelp@flags_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@W4HelpFormat@12@1@Z + ?FlagsToString@FormatConversionSpecImplFriend@str_format_internal@absl@@SA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVFormatConversionSpecImpl@23@@Z + ?FlagsToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4Flags@12@@Z + ?FlatOverhead@CordTestAccess@strings_internal@absl@@SA_KXZ + ?FlatTagToLength@CordTestAccess@strings_internal@absl@@SA_KE@Z + ?FlattenSlowPath@Cord@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Floor@absl@@YA?AVDuration@1@V21@0@Z + ?Flush@FormatSinkImpl@str_format_internal@absl@@QEAAXXZ + ?Flush@LogMessage@log_internal@absl@@QEAAXXZ + ?Flush@LogSink@absl@@UEAAXXZ + ?FlushLogSinks@absl@@YAXXZ + ?FlushLogSinks@log_internal@absl@@YAXXZ + ?ForEachChunkAux@Cord@absl@@CAXPEAUCordRep@cord_internal@2@V?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z@2@@Z + ?ForEachFlag@flags_internal@absl@@YAXV?$function@$$A6AXAEAVCommandLineFlag@absl@@@Z@__Cr@std@@@Z + ?ForEachPayload@StatusRep@status_internal@absl@@QEBAXV?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCord@absl@@@Z@3@@Z + ?ForVar1@CheckOpMessageBuilder@log_internal@absl@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?ForVar2@CheckOpMessageBuilder@log_internal@absl@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?ForcedTrySample@container_internal@absl@@YA?AVHashtablezInfoHandle@12@_K00G@Z + ?ForgetDeadlockInfo@Mutex@absl@@QEAAXXZ + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatConversionCharIsFloat@str_format_internal@absl@@YA_NW4FormatConversionChar@2@@Z + ?FormatConversionCharIsUpper@str_format_internal@absl@@YA_NW4FormatConversionChar@2@@Z + ?FormatConversionCharToChar@str_format_internal@absl@@YADW4FormatConversionChar@2@@Z + ?FormatConversionCharToConvInt@str_format_internal@absl@@YA_KD@Z + ?FormatConversionCharToConvInt@str_format_internal@absl@@YA_KW4FormatConversionChar@2@@Z + ?FormatConversionCharToConvValue@str_format_internal@absl@@YA?AW4FormatConversionCharSet@2@D@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0BPPPL@@12@DVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0BPPPL@@12@_WVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAA@@12@UVoidPtr@12@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@$$TVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@PEBDVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@PEB_WVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@AEBV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@MVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@NVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@OVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@CVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@EVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@FVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@GVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@HVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@IVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@JVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@KVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@Vint128@2@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@Vuint128@2@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@_JVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@_KVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatDuration@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?FormatLogMessage@log_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LogSeverity@2@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@2@VDuration@2@IV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@HW4PrefixFormat@12@3@Z + ?FormatLogPrefix@log_internal@absl@@YA_KW4LogSeverity@2@VTime@2@IV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4PrefixFormat@12@AEAV?$Span@D@2@@Z + ?FormatPack@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@VTime@1@VTimeZone@1@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@VTimeZone@1@@Z + ?FormatUntyped@str_format_internal@absl@@YA_NVFormatRawSinkImpl@12@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?FprintF@str_format_internal@absl@@YAHPEAU_iobuf@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?Free@LowLevelAlloc@base_internal@absl@@SAXPEAX@Z + ?Frequency@CycleClock@base_internal@absl@@SANXZ + ?Frequency@UnscaledCycleClock@base_internal@absl@@CANXZ + ?FromChrono@absl@@YA?AVDuration@1@AEBV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@@Z + ?FromChrono@absl@@YA?AVTime@1@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?FromCivil@absl@@YA?AVTime@1@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTimeZone@1@@Z + ?FromHost16@little_endian@absl@@YAGG@Z + ?FromHost32@little_endian@absl@@YAII@Z + ?FromHost64@little_endian@absl@@YA_K_K@Z + ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0DM@$00@__Cr@std@@@Z + ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0OBA@$00@__Cr@std@@@Z + ?FromTM@absl@@YA?AVTime@1@AEBUtm@@VTimeZone@1@@Z + ?FromUDate@absl@@YA?AVTime@1@N@Z + ?FromUniversal@absl@@YA?AVTime@1@_J@Z + ?FromUnixDuration@time_internal@absl@@YA?AVTime@2@VDuration@2@@Z + ?FromUnixNanos@absl@@YA?AVTime@1@_J@Z + ?FromUnixSeconds@cctz@time_internal@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@_J@Z + ?Generate@Randen@random_internal@absl@@QEBAXPEAX@Z + ?Generate@RandenHwAes@random_internal@absl@@SAXPEBXPEAX@Z + ?Generate@RandenSlow@random_internal@absl@@SAXPEBXPEAX@Z + ?Get@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@AEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ + ?Get@?$FlagValue@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$02@flags_internal@absl@@QEBA_NAEBVSequenceLock@23@AEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@Z + ?Get@HiRep@Duration@absl@@QEBA_JXZ + ?Get@RefcountAndFlags@cord_internal@absl@@QEBA_KXZ + ?GetAllFlags@absl@@YA?AV?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@1@XZ + ?GetAllocatedCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetAllocatedCapacity@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetAllocatedCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetAllocatedCapacity@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetAllocatedData@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAPEAUCordRep@cord_internal@3@XZ + ?GetAllocatedData@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAPEAVLogSink@3@XZ + ?GetAllocatedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@XZ + ?GetAllocatedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAPEBUPayload@status_internal@3@XZ + ?GetAllocatedData@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAVFormatArgImpl@str_format_internal@3@XZ + ?GetAllocatedData@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAPEBVFormatArgImpl@str_format_internal@3@XZ + ?GetAllocator@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@XZ + ?GetAllocator@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAAEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@XZ + ?GetAndroidNativeTag@log_internal@absl@@YAPEBDXZ + ?GetAppendBuffer@CordRepBtree@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z + ?GetAppendBufferSlow@CordRepBtree@cord_internal@absl@@AEAA?AV?$Span@D@3@_K@Z + ?GetAppendBufferSlowPath@Cord@absl@@AEAA?AVCordBuffer@2@_K00@Z + ?GetArchSpecificEngines@CrcMemcpy@crc_internal@absl@@CA?AUArchSpecificEngines@123@XZ + ?GetCachedTID@base_internal@absl@@YAIXZ + ?GetCapacity@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ + ?GetCapacity@?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ + ?GetCapacity@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ + ?GetCharacter@CordRepBtree@cord_internal@absl@@QEBAD_K@Z + ?GetCond@WinHelper@Win32Waiter@synchronization_internal@absl@@SAPEAU_RTL_CONDITION_VARIABLE@@PEAV234@@Z + ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ + ?GetCpuType@crc_internal@absl@@YA?AW4CpuType@12@XZ + ?GetCurrentTimeNanos@absl@@YA_JXZ + ?GetData@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAPEAPEAUCordRep@cord_internal@3@XZ + ?GetData@?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAPEAPEAVLogSink@3@XZ + ?GetData@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEAPEAUPayload@status_internal@3@XZ + ?GetDebugStackTraceHook@debugging_internal@absl@@YAP6AXQEBQEAXHP6AXPEBDPEAX@Z2@ZXZ + ?GetEntropyFromRandenPool@random_internal@absl@@YAXPEAX_K@Z + ?GetEstimatedFairShareMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetEstimatedMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetFirstChunk@Cord@absl@@CA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV12@@Z + ?GetFirstChunk@Cord@absl@@CA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@@Z + ?GetFlagsHelpFormat@flags_internal@absl@@YA?AW4HelpFormat@12@XZ + ?GetFlagsHelpMatchSubstr@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?GetFlagsHelpMode@flags_internal@absl@@YA?AW4HelpMode@12@XZ + ?GetFlatAux@Cord@absl@@CA_NPEAUCordRep@cord_internal@2@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?GetGrowthInfoFromControl@container_internal@absl@@YAAEAVGrowthInfo@12@PEAW4ctrl_t@12@@Z + ?GetGrowthLeft@GrowthInfo@container_internal@absl@@QEBA_KXZ + ?GetHashtablezMaxSamples@container_internal@absl@@YA_KXZ + ?GetHashtablezSampleParameter@container_internal@absl@@YAHXZ + ?GetId@GraphCycles@synchronization_internal@absl@@QEAA?AUGraphId@23@PEAX@Z + ?GetInlinedCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetInlinedCapacity@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetInlinedCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetInlinedCapacity@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetInlinedData@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAPEAUCordRep@cord_internal@3@XZ + ?GetInlinedData@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAPEAVLogSink@3@XZ + ?GetInlinedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@XZ + ?GetInlinedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAPEBUPayload@status_internal@3@XZ + ?GetInlinedData@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAVFormatArgImpl@str_format_internal@3@XZ + ?GetInlinedData@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAPEBVFormatArgImpl@str_format_internal@3@XZ + ?GetIsAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_NXZ + ?GetIsAllocated@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_NXZ + ?GetIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_NXZ + ?GetIsAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_NXZ + ?GetKeys@RandenHwAes@random_internal@absl@@SAPEBXXZ + ?GetKeys@RandenSlow@random_internal@absl@@SAPEBXXZ + ?GetLock@WinHelper@Win32Waiter@synchronization_internal@absl@@SAPEAU_RTL_SRWLOCK@@PEAV234@@Z + ?GetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEBA_KXZ + ?GetMisspellingHints@flags_internal@absl@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?GetMorePreciseMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetOrCreateCurrentThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ + ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PEBV123@@Z + ?GetParentStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ + ?GetPayload@StatusRep@status_internal@absl@@QEBA?AV?$optional@VCord@absl@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@@Z + ?GetPolicyFunctions@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CAAEBUPolicyFunctions@23@XZ + ?GetProgramCounter@debugging_internal@absl@@YAPEAXQEAX@Z + ?GetRefForEmptyClass@container_internal@absl@@YAPEAXAEAVCommonFields@12@@Z + ?GetRepHi@time_internal@absl@@YA_JVDuration@2@@Z + ?GetRepLo@time_internal@absl@@YAIVDuration@2@@Z + ?GetSaltMaterial@random_internal@absl@@YA?AV?$optional@I@__Cr@std@@XZ + ?GetSize@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetSize@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetSize@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetSize@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ + ?GetSizeAndIsAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ + ?GetSizeAndIsAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAAEB_KXZ + ?GetSizeAndIsAllocated@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ + ?GetSizeAndIsAllocated@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAAEB_KXZ + ?GetSizeAndIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ + ?GetSizeAndIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAAEB_KXZ + ?GetSizeAndIsAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ + ?GetSizeAndIsAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEBAAEB_KXZ + ?GetSkipCount@ExponentialBiased@profiling_internal@absl@@QEAA_J_J@Z + ?GetStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ + ?GetStackFrames@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHH@Z + ?GetStackFramesWithContext@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHHPEBX2@Z + ?GetStackTrace@GraphCycles@synchronization_internal@absl@@QEAAHUGraphId@23@PEAPEAPEAX@Z + ?GetStackTrace@absl@@YAHPEAPEAXHH@Z + ?GetStackTraceWithContext@absl@@YAHPEAPEAXHHPEBXPEAH@Z + ?GetStatusPayloadPrinter@status_internal@absl@@YAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@AEBVCord@2@@ZXZ + ?GetStride@ExponentialBiased@profiling_internal@absl@@QEAA_J_J@Z + ?GetTID@base_internal@absl@@YAIXZ + ?GetTagForChar@str_format_internal@absl@@YA?AVConvTag@12@D@Z + ?GetTestEngine@CrcMemcpy@crc_internal@absl@@SA?AV?$unique_ptr@VCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@HH@Z + ?GetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAPEAU?$atomic@H@__Cr@std@@XZ + ?GetTransitionType@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NH_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAE@Z + ?GetUsageConfig@flags_internal@absl@@YA?AUFlagsUsageConfig@2@XZ + ?GetWaiter@?$WaiterCrtp@VWin32Waiter@synchronization_internal@absl@@@synchronization_internal@absl@@SAPEAVWin32Waiter@23@PEAUThreadIdentity@base_internal@3@@Z + ?GetWeekday@absl@@YA?AW4weekday@detail@cctz@time_internal@1@V?$civil_time@Usecond_tag@time_internal@absl@@@3451@@Z + ?GetWord@?$BigUnsigned@$03@strings_internal@absl@@QEBAIH@Z + ?GetWord@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAIH@Z + ?GetYearDay@absl@@YAHV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?GlobalHashtablezSampler@container_internal@absl@@YAAEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?GlobalList@CordzInfo@cord_internal@absl@@CAPEAUList@123@XZ + ?GlobalRegistry@FlagRegistry@flags_internal@absl@@SAAEAV123@XZ + ?GuaranteedEqual@Condition@absl@@SA_NPEBV12@0@Z + ?Guard@?$NullGuard@C@log_internal@absl@@SAAEBCAEBC@Z + ?Guard@?$NullGuard@D@log_internal@absl@@SAAEBDAEBD@Z + ?Guard@?$NullGuard@E@log_internal@absl@@SAAEBEAEBE@Z + ?Guard@?$NullGuard@F@log_internal@absl@@SAAEBFAEBF@Z + ?Guard@?$NullGuard@G@log_internal@absl@@SAAEBGAEBG@Z + ?Guard@?$NullGuard@H@log_internal@absl@@SAAEBHAEBH@Z + ?Guard@?$NullGuard@I@log_internal@absl@@SAAEBIAEBI@Z + ?Guard@?$NullGuard@J@log_internal@absl@@SAAEBJAEBJ@Z + ?Guard@?$NullGuard@K@log_internal@absl@@SAAEBKAEBK@Z + ?Guard@?$NullGuard@M@log_internal@absl@@SAAEBMAEBM@Z + ?Guard@?$NullGuard@N@log_internal@absl@@SAAEBNAEBN@Z + ?Guard@?$NullGuard@PEAX@log_internal@absl@@SAAEBQEAXAEBQEAX@Z + ?Guard@?$NullGuard@PEBC@log_internal@absl@@SAPEBCPEBC@Z + ?Guard@?$NullGuard@PEBD@log_internal@absl@@SAPEBDPEBD@Z + ?Guard@?$NullGuard@PEBE@log_internal@absl@@SAPEBEPEBE@Z + ?Guard@?$NullGuard@PEBX@log_internal@absl@@SAAEBQEBXAEBQEBX@Z + ?Guard@?$NullGuard@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@log_internal@absl@@SAAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV456@@Z + ?Guard@?$NullGuard@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@log_internal@absl@@SAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@@Z + ?Guard@?$NullGuard@_J@log_internal@absl@@SAAEB_JAEB_J@Z + ?Guard@?$NullGuard@_K@log_internal@absl@@SAAEB_KAEB_K@Z + ?Guard@?$NullGuard@_N@log_internal@absl@@SAAEB_NAEB_N@Z + ?H1@container_internal@absl@@YA_K_K@Z + ?H2@container_internal@absl@@YAE_K@Z + ?HandleInvalidStatusCtorArg@Helper@internal_statusor@absl@@SAXPEAVStatus@3@@Z + ?HandleUsageFlags@flags_internal@absl@@YA?AW4HelpMode@12@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@@Z + ?HasBeenNotifiedInternal@Notification@absl@@CA_NPEBU?$atomic@_N@__Cr@std@@@Z + ?HasBeenRead@MaskedPointer@flags_internal@absl@@QEBA_NXZ + ?HasEdge@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z + ?HasNoDeleted@GrowthInfo@container_internal@absl@@QEBA_NXZ + ?HasNoDeletedAndGrowthLeft@GrowthInfo@container_internal@absl@@QEBA_NXZ + ?HasNoGrowthLeftAndNoDeleted@GrowthInfo@container_internal@absl@@QEBA_NXZ + ?HasNoGrowthLeftAssumingMayHaveDeleted@GrowthInfo@container_internal@absl@@QEBA_NXZ + ?HasNode@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@@Z + ?HasRandenHwAesImplementation@random_internal@absl@@YA_NXZ + ?HaveLeakSanitizer@absl@@YA_NXZ + ?Head@CordzInfo@cord_internal@absl@@SAPEAV123@AEBVCordzSnapshot@23@@Z + ?Help@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?HelpSourceKind@FlagImpl@flags_internal@absl@@AEBA?AW4FlagHelpKind@23@XZ + ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?HexStringToBytes@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?HideMask@base_internal@absl@@YA_KXZ + ?IDivDuration@absl@@YA_JVDuration@1@0PEAV21@@Z + ?In@Time@absl@@QEBA?AUBreakdown@12@VTimeZone@2@@Z + ?InMillisecondsFromNow@KernelTimeout@synchronization_internal@absl@@QEBAKXZ + ?InNanosecondsFromNow@KernelTimeout@synchronization_internal@absl@@AEBA_JXZ + ?Increment@RefcountAndFlags@cord_internal@absl@@QEAAXXZ + ?IncrementModificationCount@SequenceLock@flags_internal@absl@@QEAAXXZ + ?IncrementSynchSem@Mutex@absl@@CAXPEAV12@PEAUPerThreadSynch@base_internal@2@@Z + ?IndexBefore@CordRepBtree@cord_internal@absl@@AEBA?AUPosition@123@U4123@_K@Z + ?IndexBeyond@CordRepBtree@cord_internal@absl@@AEBA?AUPosition@123@_K@Z + ?IndexOf@CordRepBtree@cord_internal@absl@@AEBA?AUPosition@123@_K@Z + ?IndexOfLength@CordRepBtree@cord_internal@absl@@AEBA?AUPosition@123@_K@Z + ?InfiniteDuration@absl@@YA?AVDuration@1@XZ + ?InfiniteFuture@absl@@YA?AVTime@1@XZ + ?InfinitePast@absl@@YA?AVTime@1@XZ + ?Init@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCordRepBtree@23@@Z + ?Init@FlagImpl@flags_internal@absl@@AEAAXXZ + ?Init@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z + ?InitDiscreteDistribution@random_internal@absl@@YA?AV?$vector@U?$pair@N_K@__Cr@std@@V?$allocator@U?$pair@N_K@__Cr@std@@@23@@__Cr@std@@PEAV?$vector@NV?$allocator@N@__Cr@std@@@45@@Z + ?InitFirst@CordRepBtreeNavigator@cord_internal@absl@@QEAAPEAUCordRep@23@PEAVCordRepBtree@23@@Z + ?InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXAEBV123@@Z + ?InitGrowthLeftNoDeleted@GrowthInfo@container_internal@absl@@QEAAX_K@Z + ?InitInstance@CordRepBtree@cord_internal@absl@@AEAAXH_K0@Z + ?InitSigSafeArena@base_internal@absl@@YAXXZ + ?InitTables@CRC32@crc_internal@absl@@UEAAXXZ + ?InitTree@ChunkIterator@Cord@absl@@AEAAXPEAUCordRep@cord_internal@3@@Z + ?InitWhat@BadStatusOrAccess@absl@@AEBAXXZ + ?Initialize@ExponentialBiased@profiling_internal@absl@@AEAAXXZ + ?InitializeCordRepExternal@cord_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAUCordRepExternal@12@@Z + ?InitializeData@Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@AEAAPEADXZ + ?InitializeEncodingAndFormat@LogMessageData@LogMessage@log_internal@absl@@QEAAXXZ + ?InitializeLog@absl@@YAXXZ + ?InitializeSymbolizer@absl@@YAXPEBD@Z + ?InlinedRepToCode@Status@absl@@CA?AW4StatusCode@2@_K@Z + ?InsertAndReturnSumOfPredecessors@?$BoundedUtf8LengthSequence@$0BAA@@debugging_internal@absl@@QEAAIII@Z + ?InsertEdge@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@0@Z + ?InstallFailureSignalHandler@absl@@YAXAEBUFailureSignalHandlerOptions@1@@Z + ?Int128High64@absl@@YA_JVint128@1@@Z + ?Int128Low64@absl@@YA_KVint128@1@@Z + ?Int128Max@absl@@YA?AVint128@1@XZ + ?Int128Min@absl@@YA?AVint128@1@XZ + ?InternalAttemptToUseMutexInFatalSignalHandler@Mutex@absl@@SAXXZ + ?InternalCondVarPoke@StdcppWaiter@synchronization_internal@absl@@AEAAXXZ + ?InternalCondVarPoke@Win32Waiter@synchronization_internal@absl@@AEAAXXZ + ?InternalError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?InternalStream@LogMessage@log_internal@absl@@QEAAAEAV123@XZ + ?InvalidArgumentError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?InvalidGraphId@synchronization_internal@absl@@YA?AUGraphId@12@XZ + ?InvokeCallback@FlagImpl@flags_internal@absl@@QEBAXXZ + ?IsAborted@absl@@YA_NAEBVStatus@1@@Z + ?IsAlreadyExists@absl@@YA_NAEBVStatus@1@@Z + ?IsBtree@CordRep@cord_internal@absl@@QEBA_NXZ + ?IsCancelled@absl@@YA_NAEBVStatus@1@@Z + ?IsCooperative@SpinLock@base_internal@absl@@CA_NW4SchedulingMode@23@@Z + ?IsCordBtreeExhaustiveValidationEnabled@cord_internal@absl@@YA_NXZ + ?IsCrc@CordRep@cord_internal@absl@@QEBA_NXZ + ?IsDataEdge@cord_internal@absl@@YA_NPEBUCordRep@12@@Z + ?IsDataLoss@absl@@YA_NAEBVStatus@1@@Z + ?IsDeadlineExceeded@absl@@YA_NAEBVStatus@1@@Z + ?IsDeleted@container_internal@absl@@YA_NW4ctrl_t@12@@Z + ?IsEmpty@container_internal@absl@@YA_NW4ctrl_t@12@@Z + ?IsEmptyOrDeleted@container_internal@absl@@YA_NW4ctrl_t@12@@Z + ?IsExternal@CordRep@cord_internal@absl@@QEBA_NXZ + ?IsFailedPrecondition@absl@@YA_NAEBVStatus@1@@Z + ?IsFatal@LogMessage@log_internal@absl@@AEBA_NXZ + ?IsFlat@CordRep@cord_internal@absl@@QEBA_NXZ + ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_NPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_N_K0PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?IsFull@container_internal@absl@@YA_NW4ctrl_t@12@@Z + ?IsHashtablezEnabled@container_internal@absl@@YA_NXZ + ?IsHeld@SpinLock@base_internal@absl@@QEBA_NXZ + ?IsImmortal@RefcountAndFlags@cord_internal@absl@@QEBA_NXZ + ?IsInfiniteDuration@time_internal@absl@@YA_NVDuration@2@@Z + ?IsInitialized@log_internal@absl@@YA_NXZ + ?IsInlined@Status@absl@@CA_N_K@Z + ?IsInternal@absl@@YA_NAEBVStatus@1@@Z + ?IsInvalidArgument@absl@@YA_NAEBVStatus@1@@Z + ?IsMovedFrom@Status@absl@@CA_N_K@Z + ?IsNormalized@CrcCordState@crc_internal@absl@@QEBA_NXZ + ?IsNotFound@absl@@YA_NAEBVStatus@1@@Z + ?IsOne@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ + ?IsOutOfRange@absl@@YA_NAEBVStatus@1@@Z + ?IsPermissionDenied@absl@@YA_NAEBVStatus@1@@Z + ?IsPow2@CordBuffer@absl@@CA_N_K@Z + ?IsReachable@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z + ?IsResourceExhausted@absl@@YA_NAEBVStatus@1@@Z + ?IsRetired@CommandLineFlag@absl@@UEBA_NXZ + ?IsSame@InlineRep@Cord@absl@@QEBA_NAEBV123@@Z + ?IsSampled@HashtablezInfoHandle@container_internal@absl@@QEBA_NXZ + ?IsSmallCapacity@container_internal@absl@@YA_N_K@Z + ?IsSooControl@container_internal@absl@@YA_NPEBW4ctrl_t@12@@Z + ?IsSpecifiedOnCommandLine@FlagImpl@flags_internal@absl@@EEBA_NXZ + ?IsSpecifiedOnCommandLine@PrivateHandleAccessor@flags_internal@absl@@SA_NAEBVCommandLineFlag@3@@Z + ?IsSubstring@CordRep@cord_internal@absl@@QEBA_NXZ + ?IsUnauthenticated@absl@@YA_NAEBVStatus@1@@Z + ?IsUnavailable@absl@@YA_NAEBVStatus@1@@Z + ?IsUnimplemented@absl@@YA_NAEBVStatus@1@@Z + ?IsUnknown@absl@@YA_NAEBVStatus@1@@Z + ?IsUnprotectedReadCandidate@MaskedPointer@flags_internal@absl@@QEBA_NXZ + ?IsValid@CordRepBtree@cord_internal@absl@@SA_NPEBV123@_N@Z + ?IsValidCapacity@container_internal@absl@@YA_N_K@Z + ?IterateOverFullSlots@container_internal@absl@@YAXAEBVCommonFields@12@_KV?$FunctionRef@$$A6AXPEBW4ctrl_t@container_internal@absl@@PEAX@Z@2@@Z + ?KeyFunction@LogSink@absl@@EEBAXXZ + ?LeadingZeros@?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@QEBAIXZ + ?LeakCheckerIsActive@absl@@YA_NXZ + ?LengthModToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LengthMod@2@@Z + ?LengthToTag@CordTestAccess@strings_internal@absl@@SAE_K@Z + ?Load16@big_endian@absl@@YAGPEBX@Z + ?Load16@little_endian@absl@@YAGPEBX@Z + ?Load32@big_endian@absl@@YAIPEBX@Z + ?Load32@little_endian@absl@@YAIPEBX@Z + ?Load64@little_endian@absl@@YA_KPEBX@Z + ?Load@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@QEBAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@ZXZ + ?Load@?$AtomicHook@P6AXXZ@base_internal@absl@@QEBAP6AXXZXZ + ?Load@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?Load@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NPEAVZoneInfoSource@234@@Z + ?LoadCycleClockSource@CycleClock@base_internal@absl@@CAP6A_JXZXZ + ?LoadTimeZone@Impl@time_zone@cctz@time_internal@absl@@SA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV2345@@Z + ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransition@234@@Z + ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransitionType@234@@Z + ?LocalTimeZone@absl@@YA?AVTimeZone@1@XZ + ?Lock@CordzInfo@cord_internal@absl@@QEAAXW4MethodIdentifier@CordzUpdateTracker@23@@Z + ?LockSlow@Mutex@absl@@AEAAXPEBUMuHowS@2@PEBVCondition@2@H@Z + ?LockSlowLoop@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@H@Z + ?LockSlowWithDeadline@Mutex@absl@@AEAA_NPEBUMuHowS@2@PEBVCondition@2@VKernelTimeout@synchronization_internal@2@H@Z + ?LockWhen@Mutex@absl@@QEAAXAEBVCondition@2@@Z + ?LockWhenCommon@Mutex@absl@@AEAA_NAEBVCondition@2@VKernelTimeout@synchronization_internal@2@_N@Z + ?LockWhenWithDeadline@Mutex@absl@@QEAA_NAEBVCondition@2@VTime@2@@Z + ?LockWhenWithTimeout@Mutex@absl@@QEAA_NAEBVCondition@2@VDuration@2@@Z + ?Log2Ceil@CordBuffer@absl@@CA_K_K@Z + ?Log2Floor@CordBuffer@absl@@CA_K_K@Z + ?LogBacktraceIfNeeded@LogMessage@log_internal@absl@@AEAAXXZ + ?LogFatalNodeType@cord_internal@absl@@YAXPEAUCordRep@12@@Z + ?LogSeverityName@absl@@YAPEBDW4LogSeverity@1@@Z + ?LogToSinks@log_internal@absl@@YAXAEBVLogEntry@2@V?$Span@PEAVLogSink@absl@@@2@_N@Z + ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QEAAXAEBV123@@Z + ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QEAAXW4MethodIdentifier@123@_J@Z + ?LowestBitSet@?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@QEBAIXZ + ?LowestBitSet@?$NonIterableBitMask@_K$07$02@container_internal@absl@@QEBAIXZ + ?Make@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?Make@TimeZoneInfo@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?Make@TimeZoneLibC@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?MakeAbsNanos@KernelTimeout@synchronization_internal@absl@@QEBA_JXZ + ?MakeAbsTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ + ?MakeCheckFailString@status_internal@absl@@YAPEBDPEBVStatus@2@PEBD@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@C@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEBX@Z + ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z + ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_JI@Z + ?MakeFlatWithExtraCapacity@InlineRep@Cord@absl@@QEAAPEAUCordRepFlat@cord_internal@3@_K@Z + ?MakeInitValue@FlagImpl@flags_internal@absl@@AEBA?AV?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@XZ + ?MakeInt128@absl@@YA?AVint128@1@_J_K@Z + ?MakeNormalizedDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z + ?MakeRelativeTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ + ?MakeSeedSeq@absl@@YA?AV?$SaltedSeedSeq@Vseed_seq@__Cr@std@@@random_internal@1@XZ + ?MakeStorageView@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA?AU?$StorageView@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@23@XZ + ?MakeStorageView@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA?AU?$StorageView@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@23@XZ + ?MakeStorageView@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAA?AU?$StorageView@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@23@XZ + ?MakeTagType@log_internal@absl@@YA_K_KW4WireType@12@@Z + ?MakeTime@Impl@time_zone@cctz@time_internal@absl@@QEBA?AUcivil_lookup@2345@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@345@@Z + ?MakeTime@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?MakeTime@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?MakeUint128@absl@@YA?AVuint128@1@_K0@Z + ?MapToLocalCode@status_internal@absl@@YA?AW4StatusCode@2@H@Z + ?MarkAsRead@MaskedPointer@flags_internal@absl@@QEAAXXZ + ?MarkInitialized@SequenceLock@flags_internal@absl@@QEAAXXZ + ?MaskEmpty@GroupSse2Impl@container_internal@absl@@QEBA?AV?$NonIterableBitMask@G$0BA@$0A@@23@XZ + ?MaskEmptyOrDeleted@GroupSse2Impl@container_internal@absl@@QEBA?AV?$NonIterableBitMask@G$0BA@$0A@@23@XZ + ?MaskFull@GroupPortableImpl@container_internal@absl@@QEBA@XZ + ?MaskFull@GroupSse2Impl@container_internal@absl@@QEBA?AV?$BitMask@G$0BA@$0A@$0A@@23@XZ + ?MaskNonFull@GroupSse2Impl@container_internal@absl@@QEBA@XZ + ?Match@GroupSse2Impl@container_internal@absl@@QEBA?AV?$BitMask@G$0BA@$0A@$0A@@23@E@Z + ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@AEBA_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z + ?MaxFlatLength@CordTestAccess@strings_internal@absl@@SA_KXZ + ?MaxFramesInLogStackTrace@log_internal@absl@@YAHXZ + ?MaxVarintSize@log_internal@absl@@YA_KXZ + ?MaybeBecomeIdle@WaiterBase@synchronization_internal@absl@@KAXXZ + ?MaybeExit@flags_internal@absl@@YAXW4HelpMode@12@@Z + ?MaybeGetCrcCordState@Cord@absl@@AEBAPEBVCrcCordState@crc_internal@2@XZ + ?MaybeRemoveEmptyCrcNode@InlineRep@Cord@absl@@AEAAXXZ + ?MaybeTrackCordImpl@CordzInfo@cord_internal@absl@@CAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?MemcpyCrc32c@absl@@YA?AVcrc32c_t@1@PEAXPEBX_KV21@@Z + ?MergeTrees@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@0@Z + ?MinLogLevel@absl@@YA?AW4LogSeverityAtLeast@1@XZ + ?MixIntoSeedMaterial@random_internal@absl@@YAXV?$Span@$$CBI@2@V?$Span@I@2@@Z + ?ModificationCount@FlagImpl@flags_internal@absl@@AEBA_JXZ + ?ModificationCount@SequenceLock@flags_internal@absl@@QEBA_JXZ + ?MovedFromRep@Status@absl@@CA_KXZ + ?MovedFromString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBI@Z + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QEAAXI@Z + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QEAAX_K@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHPEBI@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXI@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAX_K@Z + ?MultiplyByFiveToTheNth@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?MultiplyByFiveToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?MultiplyByTenToTheNth@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?MultiplyByTenToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?MultiplyStep@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBIHH@Z + ?MultiplyStep@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHPEBIHH@Z + ?MutexDelay@synchronization_internal@absl@@YAHHH@Z + ?Name@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Name@Impl@time_zone@cctz@time_internal@absl@@QEBAAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?NegateAndSubtractOne@time_internal@absl@@YA_J_J@Z + ?Never@KernelTimeout@synchronization_internal@absl@@SA?AV123@XZ + ?New@CordRepBtree@cord_internal@absl@@SAPEAV123@H@Z + ?New@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAUCordRep@23@@Z + ?New@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@0@Z + ?New@CordRepCrc@cord_internal@absl@@SAPEAU123@PEAUCordRep@23@VCrcCordState@crc_internal@3@@Z + ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@ULarge@123@_K@Z + ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@_K@Z + ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@I@Z + ?NewCRC32AcceleratedX86ARMCombinedAll@crc_internal@absl@@YA?AV?$vector@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@XZ + ?NewInternal@CRCImpl@crc_internal@absl@@SAPEAV123@XZ + ?NewString@CheckOpMessageBuilder@log_internal@absl@@QEAAPEBDXZ + ?Next@CordRepBtreeNavigator@cord_internal@absl@@QEAAPEAUCordRep@23@XZ + ?Next@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z + ?NextCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SA_K_K@Z + ?NextCapacity@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SA_K_K@Z + ?NextCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SA_K_K@Z + ?NextCapacity@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SA_K_K@Z + ?NextCapacity@container_internal@absl@@YA_K_K@Z + ?NextGeneration@container_internal@absl@@YAEE@Z + ?NextRandom@ExponentialBiased@profiling_internal@absl@@SA_K_K@Z + ?NextSeed@container_internal@absl@@YAGXZ + ?NextTransition@Impl@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@2345@@Z + ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z + ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?NextUp@CordRepBtreeNavigator@cord_internal@absl@@AEAAPEAUCordRep@23@XZ + ?NoPrefix@LogMessage@log_internal@absl@@QEAAAEAV123@XZ + ?NominalCPUFrequency@base_internal@absl@@YANXZ + ?Normalize@CrcCordState@crc_internal@absl@@QEAAXXZ + ?NormalizeCapacity@container_internal@absl@@YA_K_K@Z + ?NormalizeLogSeverity@absl@@YA?AW4LogSeverity@1@W421@@Z + ?NormalizedPrefixCrcAtNthChunk@CrcCordState@crc_internal@absl@@QEBA?AUPrefixCrc@123@_K@Z + ?NotFoundError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Notify@Notification@absl@@QEAAXXZ + ?Now@CycleClock@base_internal@absl@@SA_JXZ + ?Now@UnscaledCycleClock@base_internal@absl@@CA_JXZ + ?Now@absl@@YA?AVTime@1@XZ + ?NullSafeStringView@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEBD@Z + ?NumCPUs@base_internal@absl@@YAHXZ + ?NumChunks@CrcCordState@crc_internal@absl@@QEBA_KXZ + ?NumClonedBytes@container_internal@absl@@YA_KXZ + ?NumControlBytes@container_internal@absl@@YA_K_K@Z + ?NumGenerationBytes@container_internal@absl@@YA_KXZ + ?NumLeakedFlagValues@flags_internal@absl@@YA_KXZ + ?ODRCheck@CordzInfo@cord_internal@absl@@AEBAXXZ + ?OccursBefore@ViableSubstitution@strings_internal@absl@@QEBA_NAEBU123@@Z + ?OnUpdate@?$FlagRegistrar@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$00@flags_internal@absl@@QEHAA?AV123@P6AXXZ@Z + ?OnVLogVerbosityUpdate@log_internal@absl@@YAXV?$function@$$A6AXXZ@__Cr@std@@@Z + ?OneTimeInitThreadIdentity@synchronization_internal@absl@@YAXPEAUThreadIdentity@base_internal@2@@Z + ?OneWordValue@FlagImpl@flags_internal@absl@@AEBAAEAU?$atomic@_J@__Cr@std@@XZ + ?OppositeInfinity@time_internal@absl@@YA?AVDuration@2@V32@@Z + ?OutOfRangeError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?OverwriteControlAsFull@GrowthInfo@container_internal@absl@@QEAAXW4ctrl_t@23@@Z + ?OverwriteEmptyAsFull@GrowthInfo@container_internal@absl@@QEAAXXZ + ?OverwriteFullAsDeleted@GrowthInfo@container_internal@absl@@QEAAXXZ + ?OverwriteFullAsEmpty@GrowthInfo@container_internal@absl@@QEAAXXZ + ?OverwriteManyEmptyAsFull@GrowthInfo@container_internal@absl@@QEAAX_K@Z + ?Package@flags_internal@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@@Z + ?Parse@flags_internal@absl@@YA_NP6APEAXW4FlagOp@12@PEBXPEAX2@ZV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@2PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?ParseAbseilFlagsOnly@absl@@YAXHQEAPEADAEAV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@AEAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@34@@Z + ?ParseAbseilFlagsOnlyImpl@flags_internal@absl@@YA?AW4HelpMode@12@HQEAPEADAEAV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@AEAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@56@W4UsageFlagsAction@12@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCommandLine@absl@@YA?AV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@HQEAPEAD@Z + ?ParseCommandLineImpl@flags_internal@absl@@YA?AV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@HQEAPEADW4UsageFlagsAction@12@W4OnUndefinedFlag@12@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@45@@Z + ?ParseDigits@str_format_internal@absl@@YAHAEADAEAPEBDQEBD@Z + ?ParseDuration@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVDuration@1@@Z + ?ParseFlag@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVDuration@1@PEAV234@@Z + ?ParseFlag@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVTime@1@PEAV234@@Z + ?ParseFrom@CommandLineFlag@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?ParseFrom@FlagImpl@flags_internal@absl@@EEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4FlagSettingMode@23@W4ValueSource@23@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?ParseFrom@PrivateHandleAccessor@flags_internal@absl@@SA_NAEAVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4FlagSettingMode@23@W4ValueSource@23@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParsePosixSpec@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAUPosixTimeZone@123@@Z + ?ParseTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?ParseTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0VTimeZone@1@PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?PermissionDeniedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Piece@AlphaNum@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?PiecewiseChunkSize@hash_internal@absl@@YA_KXZ + ?PointerToRep@Status@absl@@CA_KPEAVStatusRep@status_internal@2@@Z + ?Poison@CrcCordState@crc_internal@absl@@QEAAXXZ + ?Poke@StdcppWaiter@synchronization_internal@absl@@QEAAXXZ + ?Poke@Win32Waiter@synchronization_internal@absl@@QEAAXXZ + ?Post@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z + ?Post@StdcppWaiter@synchronization_internal@absl@@QEAAXXZ + ?Post@Win32Waiter@synchronization_internal@absl@@QEAAXXZ + ?PrecombineLengthMix@hash_internal@absl@@YA_K_K0@Z + ?PrepareForSampling@HashtablezInfo@container_internal@absl@@QEAAX_J_K11G@Z + ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@@Z + ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareInsertSmallNonSoo@container_internal@absl@@YA?AU?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@AEAVCommonFields@12@AEBUPolicyFunctions@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareToDie@LogMessage@log_internal@absl@@AEAAXXZ + ?PrepareToModify@Status@absl@@CAPEAVStatusRep@status_internal@2@_K@Z + ?Prepend@Cord@absl@@QEAAXAEBV12@@Z + ?Prepend@Cord@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Prepend@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z + ?Prepend@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?PrependArray@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?PrependPrecise@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?PrependSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z + ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependVModule@log_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?PrevTransition@Impl@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@2345@@Z + ?PrevTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z + ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?PreviousCapacity@container_internal@absl@@YA_K_K@Z + ?Print@Streamable@str_format_internal@absl@@QEBAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@@Z + ?PrintTo@absl@@YAXAEBVLogEntry@1@PEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ProgramUsageMessage@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Ptr@GraphCycles@synchronization_internal@absl@@QEAAPEAXUGraphId@23@@Z + ?Ptr@MaskedPointer@flags_internal@absl@@QEBAPEAXXZ + ?PtrStorage@FlagImpl@flags_internal@absl@@AEBAAEAU?$atomic@VMaskedPointer@flags_internal@absl@@@__Cr@std@@XZ + ?PushDead@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AEAAXPEAUHashtablezInfo@container_internal@3@@Z + ?PushNew@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AEAAXPEAUHashtablezInfo@container_internal@3@@Z + ?PutPaddedString@FormatSinkImpl@str_format_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HH_N@Z + ?PutTwoDigits@numbers_internal@absl@@YAXIPEAD@Z + ?RawAbsNanos@KernelTimeout@synchronization_internal@absl@@AEBA_JXZ + ?RawEnableLogPrefix@log_internal@absl@@YAX_N@Z + ?RawLog@raw_log_internal@absl@@YAXW4LogSeverity@2@PEBDH1ZZ + ?RawLoggingFullySupported@raw_log_internal@absl@@YA_NXZ + ?RawSetMinLogLevel@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z + ?RawSetStderrThreshold@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z + ?Read1To3@hash_internal@absl@@YAIPEBE_K@Z + ?Read4To8@hash_internal@absl@@YA_KPEBE_K@Z + ?Read8@hash_internal@absl@@YA_KPEBE@Z + ?Read9To16@hash_internal@absl@@YA?AU?$pair@_K_K@__Cr@std@@PEBE_K@Z + ?Read@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUReadResult@123@_K0@Z + ?Read@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K0AEAPEAUCordRep@23@@Z + ?Read@FlagImpl@flags_internal@absl@@UEBAXPEAX@Z + ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AEAAHPEBD0H@Z + ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAHPEBD0H@Z + ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z + ?ReadFloatMantissa@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z + ?ReadOneBool@FlagImpl@flags_internal@absl@@QEBA_NXZ + ?ReadOneWord@FlagImpl@flags_internal@absl@@QEBA_JXZ + ?ReadSeedMaterialFromOSEntropy@random_internal@absl@@YA_NV?$Span@I@2@@Z + ?ReadSequenceLockedData@FlagImpl@flags_internal@absl@@AEBAXPEAX@Z + ?ReaderTryLockSlow@Mutex@absl@@AEAA_NXZ + ?Rebuild@CordRepBtree@cord_internal@absl@@CAXPEAPEAV123@PEAV123@_N@Z + ?Rebuild@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@@Z + ?RecordClearedReservation@HashtablezInfoHandle@container_internal@absl@@QEAAXXZ + ?RecordClearedReservationSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?RecordErase@HashtablezInfoHandle@container_internal@absl@@QEAAXXZ + ?RecordEraseSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?RecordInsert@HashtablezInfoHandle@container_internal@absl@@QEAAX_K0@Z + ?RecordInsertSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K1@Z + ?RecordRehash@HashtablezInfoHandle@container_internal@absl@@QEAAX_K@Z + ?RecordRehashSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K@Z + ?RecordReservation@HashtablezInfoHandle@container_internal@absl@@QEAAX_K@Z + ?RecordReservationSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K@Z + ?RecordStorageChanged@HashtablezInfoHandle@container_internal@absl@@QEAAX_K0@Z + ?RecordStorageChangedSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K1@Z + ?Ref@CordRep@cord_internal@absl@@SAPEAU123@PEAU123@@Z + ?Ref@CrcCordState@crc_internal@absl@@CAXPEAURefcountedRep@123@@Z + ?Ref@Status@absl@@CAX_K@Z + ?Ref@StatusRep@status_internal@absl@@QEBAXXZ + ?RefCordRep@CordzInfo@cord_internal@absl@@QEBAPEAUCordRep@23@XZ + ?RefSharedEmptyRep@CrcCordState@crc_internal@absl@@CAPEAURefcountedRep@123@XZ + ?Register@CycleClockSource@base_internal@absl@@CAXP6A_JXZ@Z + ?RegisterAbortHook@raw_log_internal@absl@@YAXP6AXPEBDH000@Z@Z + ?RegisterAndInitialize@log_internal@absl@@YAHPEAVVLogSite@12@@Z + ?RegisterCommandLineFlag@flags_internal@absl@@YA_NAEAVCommandLineFlag@2@PEBD@Z + ?RegisterCondVarTracer@absl@@YAXP6AXPEBDPEBX@Z@Z + ?RegisterDebugStackTraceHook@debugging_internal@absl@@YAXP6AXQEBQEAXHP6AXPEBDPEAX@Z2@Z@Z + ?RegisterFlag@FlagRegistry@flags_internal@absl@@QEAAXAEAVCommandLineFlag@3@PEBD@Z + ?RegisterInternalLogFunction@raw_log_internal@absl@@YAXP6AXW4LogSeverity@2@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@Z + ?RegisterLivePointers@absl@@YAXPEBX_K@Z + ?RegisterLogFilterAndPrefixHook@raw_log_internal@absl@@YAXP6A_NW4LogSeverity@2@PEBDHPEAPEADPEAH@Z@Z + ?RegisterMutexProfiler@absl@@YAXP6AX_J@Z@Z + ?RegisterMutexTracer@absl@@YAXP6AXPEBDPEBX_J@Z@Z + ?RegisterSpinLockProfiler@base_internal@absl@@YAXP6AXPEBX_J@Z@Z + ?RegisterWithTsan@SpinLock@base_internal@absl@@AEAAXXZ + ?Rehash@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?RehashProbabilityConstant@container_internal@absl@@YA_KXZ + ?RelaxedCopyFromAtomic@SequenceLock@flags_internal@absl@@CAXPEAXPEBU?$atomic@_K@__Cr@std@@_K@Z + ?RelaxedCopyToAtomic@SequenceLock@flags_internal@absl@@CAXPEAU?$atomic@_K@__Cr@std@@PEBX_K@Z + ?Release@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEHAA?AU?$Allocation@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@23@XZ + ?Release@?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEHAA?AU?$Allocation@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@23@XZ + ?Release@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEHAA?AU?$Allocation@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@23@XZ + ?Release@ReleasableMutexLock@absl@@QEAAXXZ + ?Remove@CondVar@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?RemoveChunkPrefix@ChunkIterator@Cord@absl@@AEAAX_K@Z + ?RemoveCrc32cPrefix@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?RemoveCrc32cSuffix@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?RemoveCrcNode@cord_internal@absl@@YAPEAUCordRep@12@PEAU312@@Z + ?RemoveEdge@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@0@Z + ?RemoveExtraAsciiWhitespace@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?RemoveLogSink@log_internal@absl@@YAXPEAVLogSink@2@@Z + ?RemoveNode@GraphCycles@synchronization_internal@absl@@QEAAXPEAX@Z + ?RemovePrefix@Cord@absl@@QEAAX_K@Z + ?RemoveSuffix@Cord@absl@@QEAAX_K@Z + ?RemoveSuffix@CordRepBtree@cord_internal@absl@@SAPEAUCordRep@23@PEAV123@_K@Z + ?RepToPointer@Status@absl@@CAPEBVStatusRep@status_internal@2@_K@Z + ?ReportUnrecognizedFlags@absl@@YAXAEBV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@@Z + ?ReportUsageError@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_N@Z + ?ReserveEmptyNonAllocatedTableToFitBucketCount@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?ReserveTableToFitNewSize@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?Reset@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAXXZ + ?Reset@?$AllocationTransaction@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAXXZ + ?Reset@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAXXZ + ?ResetToBuiltinUTC@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z + ?ResetToEmpty@InlineRep@Cord@absl@@AEAAXXZ + ?Resize@?$ResizeUninitializedTraits@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@X@strings_internal@absl@@SAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ?ResizeAllocatedTableWithSeedChange@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?ResourceExhaustedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Restore@FlagState@flags_internal@absl@@EEHAAXXZ + ?RestoreState@FlagImpl@flags_internal@absl@@AEAA_NAEBVFlagState@23@@Z + ?RestoreToRegistry@FlagSaverImpl@flags_internal@absl@@QEHAAXXZ + ?Retire@flags_internal@absl@@YAXPEBDPEBXPEAE@Z + ?ReverseConsume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z + ?RoundUp@cord_internal@absl@@YA_K_K0@Z + ?RoundUpForTag@cord_internal@absl@@YA_K_K@Z + ?RuntimeTypeId@flags_internal@absl@@YAPEBVtype_info@@P6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ?SafeToDelete@CordzHandle@cord_internal@absl@@QEBA_NXZ + ?SampleSlow@container_internal@absl@@YAPEAUHashtablezInfo@12@AEAUSamplingState@12@_K11G@Z + ?SanitizerPoisonMemoryRegion@container_internal@absl@@YAXPEBX_K@Z + ?SanitizerSafeCopy@Rep@InlineData@cord_internal@absl@@QEBAAEBU1234@XZ + ?SanitizerUnpoisonMemoryRegion@container_internal@absl@@YAXPEBX_K@Z + ?SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ + ?SaveState@FlagImpl@flags_internal@absl@@EEAA?AV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?SaveState@PrivateHandleAccessor@flags_internal@absl@@SA?AV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAVCommandLineFlag@3@@Z + ?Scramble@CRC32@crc_internal@absl@@UEBAXPEAI@Z + ?Seek@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUPosition@123@_K@Z + ?Seek@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?SendToLog@LogMessage@log_internal@absl@@AEAAXXZ + ?SentinelEmptyGeneration@container_internal@absl@@YAEXZ + ?Set@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@AEAAXAEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@Z + ?Set@MaskedPointer@flags_internal@absl@@QEAAXP6APEAXW4FlagOp@23@PEBXPEAX2@Z1_N@Z + ?SetAllocation@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXU?$Allocation@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@23@@Z + ?SetAllocation@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXU?$Allocation@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@23@@Z + ?SetAllocation@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXU?$Allocation@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@23@@Z + ?SetAllocation@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXU?$Allocation@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@23@@Z + ?SetAndroidNativeTag@absl@@YAXPEBD@Z + ?SetCallback@FlagImpl@flags_internal@absl@@QEAAXQ6AXXZ@Z + ?SetConversionChar@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXW4FormatConversionChar@3@PEAVFormatConversionSpecImpl@23@@Z + ?SetCordBtreeExhaustiveValidation@cord_internal@absl@@YAX_N@Z + ?SetCordRep@CordzInfo@cord_internal@absl@@QEAAXPEAUCordRep@23@@Z + ?SetCordRep@CordzUpdateScope@cord_internal@absl@@QEBAXPEAUCordRep@23@@Z + ?SetCrcCordState@Cord@absl@@AEAAXVCrcCordState@crc_internal@2@@Z + ?SetCurrentThreadIdentity@base_internal@absl@@YAXPEAUThreadIdentity@12@P6AXPEAX@Z@Z + ?SetExitOnDFatal@log_internal@absl@@YAX_N@Z + ?SetExpectedChecksum@Cord@absl@@QEAAXI@Z + ?SetFailQuietly@LogMessage@log_internal@absl@@IEAAXXZ + ?SetFlags@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXW4Flags@23@PEAVFormatConversionSpecImpl@23@@Z + ?SetFlagsHelpFormat@flags_internal@absl@@YAXW4HelpFormat@12@@Z + ?SetFlagsHelpMatchSubstr@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetFlagsHelpMode@flags_internal@absl@@YAXW4HelpMode@12@@Z + ?SetFlagsUsageConfig@absl@@YAXUFlagsUsageConfig@1@@Z + ?SetHashtablezConfigListener@container_internal@absl@@YAXP6AXXZ@Z + ?SetHashtablezEnabled@container_internal@absl@@YAX_N@Z + ?SetHashtablezEnabledInternal@container_internal@absl@@YAX_N@Z + ?SetHashtablezMaxSamples@container_internal@absl@@YAX_K@Z + ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAX_K@Z + ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z + ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z + ?SetInitialized@log_internal@absl@@YAXXZ + ?SetIsAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?SetIsAllocated@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?SetIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?SetIsAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ + ?SetLength@CordBuffer@absl@@QEAAX_K@Z + ?SetLengthMod@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXW4LengthMod@3@PEAVFormatConversionSpecImpl@23@@Z + ?SetLogBacktraceLocation@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?SetLoggingGlobalsListener@log_internal@absl@@YAXP6AXXZ@Z + ?SetMaxFramesInLogStackTrace@log_internal@absl@@YAXH@Z + ?SetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAAX_K@Z + ?SetMinLogLevel@absl@@YAXW4LogSeverityAtLeast@1@@Z + ?SetMutexDeadlockDetectionMode@absl@@YAXW4OnDeadlockCycle@1@@Z + ?SetPayload@StatusRep@status_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VCord@3@@Z + ?SetPrecision@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPEAVFormatConversionSpecImpl@23@@Z + ?SetProgramInvocationName@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetProgramUsageMessage@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetSize@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z + ?SetStackUnwinder@absl@@YAXP6AHPEAPEAXPEAHHHPEBX1@Z@Z + ?SetStatusPayloadPrinter@status_internal@absl@@YAXP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@AEBVCord@2@@Z@Z + ?SetStderrThreshold@absl@@YAXW4LogSeverityAtLeast@1@@Z + ?SetSuppressSigabortTrace@log_internal@absl@@YA_N_N@Z + ?SetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAXPEAU?$atomic@H@__Cr@std@@@Z + ?SetTimeZone@log_internal@absl@@YAXVTimeZone@2@@Z + ?SetToZero@?$BigUnsigned@$03@strings_internal@absl@@QEAAXXZ + ?SetToZero@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXXZ + ?SetTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@AEBVCordzUpdateScope@53@@Z + ?SetTreeOrEmpty@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@AEBVCordzUpdateScope@53@@Z + ?SetVModuleListHeadForTestOnly@log_internal@absl@@YAPEAVVLogSite@12@PEAV312@@Z + ?SetValue@?$Manager@D$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBD@Z + ?SetValue@?$Manager@H$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBH@Z + ?SetValue@?$Manager@I$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBI@Z + ?SetValue@?$Manager@M$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBM@Z + ?SetValue@?$Manager@N$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBN@Z + ?SetValue@?$Manager@PEBD$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBQEBD@Z + ?SetValue@?$Manager@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetValue@?$Manager@_J$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEB_J@Z + ?SetWidth@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPEAVFormatConversionSpecImpl@23@@Z + ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?ShiftLeft@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?ShortProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ShouldFixUpStack@internal_stacktrace@absl@@YA_NXZ + ?ShouldLog@LogEveryNSecState@log_internal@absl@@QEAA_NN@Z + ?ShouldLog@LogEveryNState@log_internal@absl@@QEAA_NH@Z + ?ShouldLog@LogEveryPow2State@log_internal@absl@@QEAA_NXZ + ?ShouldLog@LogFirstNState@log_internal@absl@@QEAA_NH@Z + ?ShouldLogBacktraceAt@log_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?ShouldPrependLogPrefix@absl@@YA_NXZ + ?ShouldSampleNextTable@container_internal@absl@@YA_NXZ + ?ShouldSymbolizeLogStackTrace@log_internal@absl@@YA_NXZ + ?SigSafeArena@base_internal@absl@@YAPEAUArena@LowLevelAlloc@12@XZ + ?Signal@CondVar@absl@@QEAAXXZ + ?SignalAll@CondVar@absl@@QEAAXXZ + ?SignedAddResult@int128_internal@absl@@YA?AVint128@2@V32@0@Z + ?SignedSubstructResult@int128_internal@absl@@YA?AVint128@2@V32@00@Z + ?SimpleAtob@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_N@Z + ?SimpleAtod@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAN@Z + ?SimpleAtof@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAM@Z + ?SimpleAtoi@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVint128@1@@Z + ?SimpleAtoi@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVuint128@1@@Z + ?SimpleHexAtoi@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVint128@1@@Z + ?SimpleHexAtoi@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVuint128@1@@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ?SixDigitsToBuffer@numbers_internal@absl@@YA_KNPEAD@Z + ?SizeToCapacity@container_internal@absl@@YA_K_K@Z + ?Sizeof@flags_internal@absl@@YA_KP6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SA_KXZ + ?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SA_KXZ + ?Skip@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUPosition@123@_K@Z + ?SkipCrcNode@cord_internal@absl@@YAPEAUCordRep@12@PEAU312@@Z + ?SkipCrcNode@cord_internal@absl@@YAPEBUCordRep@12@PEBU312@@Z + ?SleepFor@absl@@YAXVDuration@1@@Z + ?SlowIsEnabled0@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled1@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled2@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled3@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled4@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled5@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled@VLogSite@log_internal@absl@@AEAA_NHH@Z + ?SlowLock@SpinLock@base_internal@absl@@AEAAXXZ + ?SlowUnlock@SpinLock@base_internal@absl@@AEAAXI@Z + ?SnprintF@str_format_internal@absl@@YAHPEAD_KVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?SooCapacity@container_internal@absl@@YA_KXZ + ?SooControl@container_internal@absl@@YAPEAW4ctrl_t@12@XZ + ?SooEnabled@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CA_NXZ + ?SooSlotIndex@container_internal@absl@@YA_KXZ + ?SpinLockDelay@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@IHW4SchedulingMode@12@@Z + ?SpinLockSuggestedDelayNS@base_internal@absl@@YAHH@Z + ?SpinLockWait@base_internal@absl@@YAIPEAU?$atomic@I@__Cr@std@@HQEBUSpinLockWaitTransition@12@W4SchedulingMode@12@@Z + ?SpinLockWake@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@_N@Z + ?SpinLoop@SpinLock@base_internal@absl@@AEAAIXZ + ?StackTraceWorksForTest@debugging_internal@absl@@YA_NXZ + ?StartsWith@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StartsWithIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StatusCodeToString@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusCode@1@@Z + ?StatusMessageAsCStr@absl@@YAPEBDAEBVStatus@1@@Z + ?StderrThreshold@absl@@YA?AW4LogSeverityAtLeast@1@XZ + ?SteadyClockNow@KernelTimeout@synchronization_internal@absl@@CA_JXZ + ?Store16@little_endian@absl@@YAXPEAXG@Z + ?Store32@little_endian@absl@@YAXPEAXI@Z + ?Store64@little_endian@absl@@YAXPEAX_K@Z + ?Store@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@QEAAXP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@Z@Z + ?Store@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@QEAAXP6AXPEBDH000@Z@Z + ?Store@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@QEAAXP6AXPEBDPEBX@Z@Z + ?Store@?$AtomicHook@P6AXPEBDPEBX_J@Z@base_internal@absl@@QEAAXP6AXPEBDPEBX_J@Z@Z + ?Store@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@QEAAXP6AXPEBX_J@Z@Z + ?Store@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEAAXP6AXW4LogSeverity@3@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@Z + ?Store@?$AtomicHook@P6AXXZ@base_internal@absl@@QEAAXP6AXXZ@Z + ?Store@?$AtomicHook@P6AX_J@Z@base_internal@absl@@QEAAXP6AX_J@Z@Z + ?Store@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@QEAAXP6A_NW4LogSeverity@3@PEBDHPEAPEADPEAH@Z@Z + ?StoreValue@FlagImpl@flags_internal@absl@@AEAAXPEBXW4ValueSource@23@@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@111@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@11@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@1@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@000@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@00@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@0@Z + ?StrContains@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StrContains@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?StrContainsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StrContainsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?StrError@base_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?StrReplaceAll@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@4@@Z + ?StrReplaceAll@absl@@YAHV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@3@@Z + ?StripAsciiWhitespace@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?StripLeadingAsciiWhitespace@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?StripTrailingAsciiWhitespace@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?SubTree@CordRepBtree@cord_internal@absl@@QEAAPEAUCordRep@23@_K0@Z + ?Subcord@Cord@absl@@QEBA?AV12@_K0@Z + ?SubstituteAndAppendArray@substitute_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@PEBV645@_K@Z + ?Substring@CordRepSubstring@cord_internal@absl@@SAPEAUCordRep@23@PEAU423@_K1@Z + ?SubstructResult@int128_internal@absl@@YA?AVuint128@2@V32@00@Z + ?SubtractSize@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z + ?SubtractSize@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAX_K@Z + ?Summarize@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?SupportsArmCRC32PMULL@crc_internal@absl@@YA_NXZ + ?SuppressSigabortTrace@log_internal@absl@@YA_NXZ + ?Symbolize@absl@@YA_NPEBXPEADH@Z + ?TagToAllocatedSize@cord_internal@absl@@YA_KE@Z + ?TagToLength@cord_internal@absl@@YA_KE@Z + ?TakeRep@Cord@absl@@AEGBAPEAUCordRep@cord_internal@2@XZ + ?TakeRep@Cord@absl@@AEHAAPEAUCordRep@cord_internal@2@XZ + ?TestOnlyAddNodes@GraphCycles@synchronization_internal@absl@@QEAAXI@Z + ?TestOnlyRefreshSamplingStateForCurrentThread@container_internal@absl@@YAXXZ + ?ThreadIsLoggingToLogSink@log_internal@absl@@YA_NXZ + ?ThrowBadStatusOrAccess@internal_statusor@absl@@YAXVStatus@2@@Z + ?ThrowSeedGenException@random_internal@absl@@YAXXZ + ?ThrowStdBadAlloc@base_internal@absl@@YAXXZ + ?ThrowStdBadFunctionCall@base_internal@absl@@YAXXZ + ?ThrowStdDomainError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdDomainError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdInvalidArgument@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdInvalidArgument@base_internal@absl@@YAXPEBD@Z + ?ThrowStdLengthError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdLengthError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdLogicError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdLogicError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdOutOfRange@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdOutOfRange@base_internal@absl@@YAXPEBD@Z + ?ThrowStdOverflowError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdOverflowError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdRangeError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdRangeError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdRuntimeError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdRuntimeError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdUnderflowError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdUnderflowError@base_internal@absl@@YAXPEBD@Z + ?Tick@PerThreadSem@synchronization_internal@absl@@SAXPEAUThreadIdentity@base_internal@3@@Z + ?TimeFromTimespec@absl@@YA?AVTime@1@Utimespec@@@Z + ?TimeFromTimeval@absl@@YA?AVTime@1@Utimeval@@@Z + ?TimeLocal@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@_J@Z + ?TimeZone@log_internal@absl@@YAPEBV02@XZ + ?ToChronoDuration@KernelTimeout@synchronization_internal@absl@@QEBA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@XZ + ?ToChronoHours@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMicroseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMilliseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0DOI@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMinutes@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoNanoseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoSeconds@absl@@YA?AV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoTime@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@VTime@1@@Z + ?ToChronoTimePoint@KernelTimeout@synchronization_internal@absl@@QEBA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@XZ + ?ToCivilSecond@absl@@YA?AV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTime@1@VTimeZone@1@@Z + ?ToDoubleHours@absl@@YANVDuration@1@@Z + ?ToDoubleMicroseconds@absl@@YANVDuration@1@@Z + ?ToDoubleMilliseconds@absl@@YANVDuration@1@@Z + ?ToDoubleMinutes@absl@@YANVDuration@1@@Z + ?ToDoubleNanoseconds@absl@@YANVDuration@1@@Z + ?ToDoubleSeconds@absl@@YANVDuration@1@@Z + ?ToHost16@big_endian@absl@@YAGG@Z + ?ToHost16@little_endian@absl@@YAGG@Z + ?ToHost32@big_endian@absl@@YAII@Z + ?ToHost32@little_endian@absl@@YAII@Z + ?ToHost64@little_endian@absl@@YA_K_K@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DOI@@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0PECEA@@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$0DM@$00@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$0OBA@$00@__Cr@std@@@Z + ?ToInt64Hours@absl@@YA_JVDuration@1@@Z + ?ToInt64Microseconds@absl@@YA_JVDuration@1@@Z + ?ToInt64Milliseconds@absl@@YA_JVDuration@1@@Z + ?ToInt64Minutes@absl@@YA_JVDuration@1@@Z + ?ToInt64Nanoseconds@absl@@YA_JVDuration@1@@Z + ?ToInt64Seconds@absl@@YA_JVDuration@1@@Z + ?ToOpResult@CordRepBtree@cord_internal@absl@@AEAA?AUOpResult@123@_N@Z + ?ToSinkAlso@LogMessage@log_internal@absl@@QEAAAEAV123@PEAVLogSink@3@@Z + ?ToSinkOnly@LogMessage@log_internal@absl@@QEAAAEAV123@PEAVLogSink@3@@Z + ?ToString@?$BigUnsigned@$03@strings_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@Status@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusToStringMode@2@@Z + ?ToString@StatusRep@status_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusToStringMode@3@@Z + ?ToString@int128@absl@@AEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@uint128@absl@@AEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToStringSlow@Status@absl@@CA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KW4StatusToStringMode@2@@Z + ?ToTM@absl@@YA?AUtm@@VTime@1@VTimeZone@1@@Z + ?ToTimeT@absl@@YA_JVTime@1@@Z + ?ToTimespec@absl@@YA?AUtimespec@@VDuration@1@@Z + ?ToTimespec@absl@@YA?AUtimespec@@VTime@1@@Z + ?ToTimeval@absl@@YA?AUtimeval@@VDuration@1@@Z + ?ToTimeval@absl@@YA?AUtimeval@@VTime@1@@Z + ?ToUDate@absl@@YANVTime@1@@Z + ?ToUniversal@absl@@YA_JVTime@1@@Z + ?ToUnixDuration@time_internal@absl@@YA?AVDuration@2@VTime@2@@Z + ?ToUnixMicros@absl@@YA_JVTime@1@@Z + ?ToUnixMillis@absl@@YA_JVTime@1@@Z + ?ToUnixNanos@absl@@YA_JVTime@1@@Z + ?ToUnixSeconds@absl@@YA_JVTime@1@@Z + ?ToUnixSeconds@cctz@time_internal@absl@@YA_JAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?TraceContinue@base_internal@absl@@YAXPEBXW4ObjectKind@12@@Z + ?TraceObjectKind@BlockingCounter@absl@@CA?AW4ObjectKind@base_internal@2@XZ + ?TraceObjectKind@Notification@absl@@CA?AW4ObjectKind@base_internal@2@XZ + ?TraceSignal@base_internal@absl@@YAXPEBXW4ObjectKind@12@@Z + ?TraceWait@base_internal@absl@@YAXPEBXW4ObjectKind@12@@Z + ?Track@CordzInfo@cord_internal@absl@@AEAAXXZ + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@W4MethodIdentifier@CordzUpdateTracker@23@_J@Z + ?TrailingZeros@?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@QEBAIXZ + ?Trans@Mutex@absl@@AEAAXPEBUMuHowS@2@@Z + ?Trunc@absl@@YA?AVDuration@1@V21@0@Z + ?TryLockImpl@SpinLock@base_internal@absl@@AEAA_NXZ + ?TryLockInternal@SpinLock@base_internal@absl@@AEAAIII@Z + ?TryLockSlow@Mutex@absl@@AEAA_NXZ + ?TryNewCRC32AcceleratedX86ARMCombined@crc_internal@absl@@YAPEAVCRCImpl@12@XZ + ?TryParse@FlagImpl@flags_internal@absl@@AEBA?AV?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?TryRead@SequenceLock@flags_internal@absl@@QEBA_NPEAXPEBU?$atomic@_K@__Cr@std@@_K@Z + ?TryRemove@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?TypeId@FlagImpl@flags_internal@absl@@EEBAPEBXXZ + ?TypeId@PrivateHandleAccessor@flags_internal@absl@@SAPEBXAEBVCommandLineFlag@3@@Z + ?TypeName@CommandLineFlag@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?TypeName@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?TypeName@PrivateHandleAccessor@flags_internal@absl@@SA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCommandLineFlag@3@@Z + ?UTC@Impl@time_zone@cctz@time_internal@absl@@SA?AV2345@XZ + ?UTC@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?UTC@TimeZoneInfo@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?UTCImpl@Impl@time_zone@cctz@time_internal@absl@@CAPEBV12345@XZ + ?UTCTimeZone@absl@@YA?AVTimeZone@1@XZ + ?Uint128High64@absl@@YA_KVuint128@1@@Z + ?Uint128Low64@absl@@YA_KVuint128@1@@Z + ?Uint128Max@absl@@YA?AVuint128@1@XZ + ?UnRegisterLivePointers@absl@@YAXPEBX_K@Z + ?UnalignedLoad16@base_internal@absl@@YAGPEBX@Z + ?UnalignedLoad32@base_internal@absl@@YAIPEBX@Z + ?UnalignedLoad64@base_internal@absl@@YA_KPEBX@Z + ?UnalignedStore16@base_internal@absl@@YAXPEAXG@Z + ?UnalignedStore32@base_internal@absl@@YAXPEAXI@Z + ?UnalignedStore64@base_internal@absl@@YAXPEAX_K@Z + ?UnauthenticatedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnavailableError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnextendByZeroes@CRC32@crc_internal@absl@@UEBAXPEAI_K@Z + ?UnextendCrc32cByZeroes@crc_internal@absl@@YA?AVcrc32c_t@2@V32@_K@Z + ?UnimplementedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UniversalEpoch@absl@@YA?AVTime@1@XZ + ?UnknownError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Unlock@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UnlockSlow@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@F@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@G@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@M@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@P6APEAXW4FlagOp@12@PEBXPEAX2@Z1@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@Vint128@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@Vuint128@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_N@Z + ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?Unref@CordRep@cord_internal@absl@@SAXPEAU123@@Z + ?Unref@CordRepBtree@cord_internal@absl@@SAXV?$Span@QEAUCordRep@cord_internal@absl@@@3@@Z + ?Unref@CrcCordState@crc_internal@absl@@CAXPEAURefcountedRep@123@@Z + ?Unref@Status@absl@@CAX_K@Z + ?Unref@StatusRep@status_internal@absl@@QEBAXXZ + ?UnrefTree@InlineRep@Cord@absl@@AEAAXXZ + ?Unregister@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAAXPEAUHashtablezInfo@container_internal@3@@Z + ?Unregister@HashtablezInfoHandle@container_internal@absl@@QEAAXXZ + ?UnsafeSetCordRep@CordzInfo@cord_internal@absl@@AEAAXPEAUCordRep@23@@Z + ?UnsampleSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?Unscramble@CRC32@crc_internal@absl@@UEBAXPEAI@Z + ?Untrack@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UpdateGlobalVLogLevel@log_internal@absl@@YAHH@Z + ?UpdateStackTrace@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@HP6AHPEAPEAXH@Z@Z + ?UpdateVLogSites@log_internal@absl@@YAXXZ + ?UpdateVModule@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UsingInlinedStorage@Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@CA_N_K@Z + ?Utf8SafeCEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?Utf8SafeCHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?VLogLevel@log_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ValidateInputValue@FlagImpl@flags_internal@absl@@EEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ValidateInputValue@PrivateHandleAccessor@flags_internal@absl@@SA_NAEBVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Value@?$Manager@C$01@FormatArgImpl@str_format_internal@absl@@SACTData@234@@Z + ?Value@?$Manager@D$01@FormatArgImpl@str_format_internal@absl@@SADTData@234@@Z + ?Value@?$Manager@E$01@FormatArgImpl@str_format_internal@absl@@SAETData@234@@Z + ?Value@?$Manager@F$01@FormatArgImpl@str_format_internal@absl@@SAFTData@234@@Z + ?Value@?$Manager@G$01@FormatArgImpl@str_format_internal@absl@@SAGTData@234@@Z + ?Value@?$Manager@H$01@FormatArgImpl@str_format_internal@absl@@SAHTData@234@@Z + ?Value@?$Manager@I$01@FormatArgImpl@str_format_internal@absl@@SAITData@234@@Z + ?Value@?$Manager@J$01@FormatArgImpl@str_format_internal@absl@@SAJTData@234@@Z + ?Value@?$Manager@K$01@FormatArgImpl@str_format_internal@absl@@SAKTData@234@@Z + ?Value@?$Manager@M$01@FormatArgImpl@str_format_internal@absl@@SAMTData@234@@Z + ?Value@?$Manager@N$01@FormatArgImpl@str_format_internal@absl@@SANTData@234@@Z + ?Value@?$Manager@O$01@FormatArgImpl@str_format_internal@absl@@SAOTData@234@@Z + ?Value@?$Manager@PEBD$01@FormatArgImpl@str_format_internal@absl@@SAPEBDTData@234@@Z + ?Value@?$Manager@PEB_W$01@FormatArgImpl@str_format_internal@absl@@SAPEB_WTData@234@@Z + ?Value@?$Manager@UVoidPtr@str_format_internal@absl@@$01@FormatArgImpl@str_format_internal@absl@@SA?AUVoidPtr@34@TData@234@@Z + ?Value@?$Manager@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SAAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@TData@234@@Z + ?Value@?$Manager@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SAAEBV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@TData@234@@Z + ?Value@?$Manager@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SAAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@TData@234@@Z + ?Value@?$Manager@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SAAEBV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@TData@234@@Z + ?Value@?$Manager@Vint128@absl@@$0A@@FormatArgImpl@str_format_internal@absl@@SAAEBVint128@4@TData@234@@Z + ?Value@?$Manager@Vuint128@absl@@$0A@@FormatArgImpl@str_format_internal@absl@@SAAEBVuint128@4@TData@234@@Z + ?Value@?$Manager@_J$01@FormatArgImpl@str_format_internal@absl@@SA_JTData@234@@Z + ?Value@?$Manager@_K$01@FormatArgImpl@str_format_internal@absl@@SA_KTData@234@@Z + ?Value@?$Manager@_N$01@FormatArgImpl@str_format_internal@absl@@SA_NTData@234@@Z + ?Value@CordzUpdateTracker@cord_internal@absl@@QEBA_JW4MethodIdentifier@123@@Z + ?ValueOffset@flags_internal@absl@@YA_JP6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ?ValueStorageKind@FlagImpl@flags_internal@absl@@AEBA?AW4FlagValueStorageKind@23@XZ + ?VarintSize@log_internal@absl@@YA_K_K@Z + ?Version@Impl@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@ZoneInfoSource@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Wait@BlockingCounter@absl@@QEAAXXZ + ?Wait@PerThreadSem@synchronization_internal@absl@@CA_NVKernelTimeout@23@@Z + ?Wait@StdcppWaiter@synchronization_internal@absl@@QEAA_NVKernelTimeout@23@@Z + ?Wait@Win32Waiter@synchronization_internal@absl@@QEAA_NVKernelTimeout@23@@Z + ?WaitCommon@CondVar@absl@@AEAA_NPEAVMutex@2@VKernelTimeout@synchronization_internal@2@@Z + ?WaitForNotification@Notification@absl@@QEBAXXZ + ?WaitForNotificationWithDeadline@Notification@absl@@QEBA_NVTime@2@@Z + ?WaitForNotificationWithTimeout@Notification@absl@@QEBA_NVDuration@2@@Z + ?Wakeup@Mutex@absl@@AEAAPEAUPerThreadSynch@base_internal@2@PEAU342@@Z + ?WasPresentOnCommandLine@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?WebSafeBase64Escape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?WebSafeBase64Escape@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?WebSafeBase64Unescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?WideToUtf8@strings_internal@absl@@YA_K_WPEADAEAUShiftState@12@@Z + ?WithMetadataFrom@LogMessage@log_internal@absl@@QEAAAEAV123@AEBVLogEntry@3@@Z + ?WithPerror@LogMessage@log_internal@absl@@QEAAAEAV123@XZ + ?WithThreadID@LogMessage@log_internal@absl@@QEAAAEAV123@I@Z + ?WithTimestamp@LogMessage@log_internal@absl@@QEAAAEAV123@VTime@3@@Z + ?WithVerbosity@LogMessage@log_internal@absl@@QEAAAEAV123@H@Z + ?Write@BufferRawSink@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@FILERawSink@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@FlagImpl@flags_internal@absl@@QEAAXPEBX@Z + ?Write@FormatRawSinkImpl@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@SequenceLock@flags_internal@absl@@QEAAXPEAU?$atomic@_K@__Cr@std@@PEBX_K@Z + ?WriteToStderr@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4LogSeverity@2@@Z + ?ZeroDuration@absl@@YA?AVDuration@1@XZ + ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ + ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ + ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__addr@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ + ?__addr@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?__alloc@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAAEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?__alloc@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAAEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?__alloc@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__annotate_contiguous_container@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_contiguous_container@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_delete@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_delete@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBAXXZ + ?__annotate_increase@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase_back@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_increase_back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_new@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBAX_K@Z + ?__annotate_poison_block@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXPEBX0@Z + ?__annotate_shrink@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBAX_K@Z + ?__annotate_shrink_back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K0@Z + ?__annotate_whole_block@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_KW4__asan_annotation_type@123@@Z + ?__annotate_whole_block@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_KW4__asan_annotation_type@123@@Z + ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__as_base@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@IEGAA@XZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__back_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__back_spare_blocks@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__base_destruct_at_end@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAPEAVLogSink@absl@@@Z + ?__base_destruct_at_end@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__base_destruct_at_end@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__base_destruct_at_end@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__begin@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@@Z + ?__begin@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBQEBU4567@@Z + ?__call@?$__to_address_helper@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@X@__Cr@std@@SAPEAPEAVCommandLineFlag@absl@@AEBV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@@Z + ?__call@?$__to_address_helper@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@X@__Cr@std@@SAPEAPEAVLogSink@absl@@AEBV?$__wrap_iter@PEAPEAVLogSink@absl@@@23@@Z + ?__call@?$__to_address_helper@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@X@__Cr@std@@SAPEAPEBVCommandLineFlag@absl@@AEBV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@23@@Z + ?__call@?$__to_address_helper@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@X@__Cr@std@@SAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@AEBV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@@Z + ?__capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__complete@?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z@@__Cr@std@@QEAAXXZ + ?__complete@?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PEAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?__compose@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU5678@@Z + ?__construct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX_K@Z + ?__construct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX_K@Z + ?__construct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__construct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__copy_assign_alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEBV123@@Z + ?__copy_assign_alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEBV123@U?$integral_constant@_N$0A@@23@@Z + ?__deallocate_node@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@@Z + ?__deallocate_node@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@@Z + ?__deallocate_node_list@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAXPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@@Z + ?__deallocate_node_list@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@@Z + ?__destruct_at_begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__destruct_at_begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$00@23@@Z + ?__destruct_at_begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_begin@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$00@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAPEAVLogSink@absl@@@Z + ?__destruct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__end@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@@Z + ?__end@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBQEBU4567@@Z + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@XZ + ?__erase_to_end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEAVCommandLineFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEBVCommandLineFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAPEAUUnrecognizedFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__front_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAVCommandLineFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEAVLogSink@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEBVCommandLineFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UUnrecognizedFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@XZ + ?__get_np@?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@XZ + ?__get_np@?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@AEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ + ?__get_value@?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@QEAAAEAPEBUCordRep@cord_internal@absl@@XZ + ?__get_value@?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@QEAAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_value@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@QEAAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@XZ + ?__get_value@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@QEAAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@XZ + ?__hash@?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__hash@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@AEAPEAV?$__tree_node_base@PEAX@23@PEAV523@@Z + ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_end_node@PEAV?$__tree_node_base@PEAX@__Cr@std@@@23@AEAPEAV?$__tree_node_base@PEAX@23@PEAV523@@Z + ?__local@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@Z + ?__local@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z + ?__make_iter@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@PEAPEAVCommandLineFlag@absl@@@Z + ?__make_iter@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@23@PEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__make_iter@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@23@PEAPEAVLogSink@absl@@@Z + ?__make_iter@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBA?AV?$__wrap_iter@PEBQEAVLogSink@absl@@@23@PEBQEAVLogSink@absl@@@Z + ?__make_iter@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@23@PEAPEBVCommandLineFlag@absl@@@Z + ?__make_iter@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA?AV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__make_iter@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@PEAUTransition@cctz@time_internal@absl@@@Z + ?__make_iter@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@PEAUTransitionType@cctz@time_internal@absl@@@Z + ?__make_iter@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@23@PEAUUnrecognizedFlag@absl@@@Z + ?__make_iter@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEBA?AV?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@23@PEBUUnrecognizedFlag@absl@@@Z + ?__make_iter@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__maybe_remove_back_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAA_N_N@Z + ?__move_range@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransition@cctz@time_internal@absl@@00@Z + ?__move_range@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@00@Z + ?__node_alloc@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?__ptr@?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU123@XZ + ?__ptr@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU123@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEAVCommandLineFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEBAPEAPEAVLogSink@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEBVCommandLineFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEBAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEBAPEAUUnrecognizedFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEBAPEAUViableSubstitution@strings_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEAVCommandLineFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEBAPEAPEAVLogSink@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEBAPEAPEBVCommandLineFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEBAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEBAPEAUUnrecognizedFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEBAPEAUViableSubstitution@strings_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__recommend@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEBA_K_K@Z + ?__recommend@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBA_K_K@Z + ?__recommend_blocks@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SA_K_K@Z + ?__rehash_unique@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAX_K@Z + ?__rehash_unique@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAX_K@Z + ?__rewrap@?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@SAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@0@Z + ?__rewrap@?$__unwrap_iter_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@PEAPEAVLogSink@absl@@$00@__Cr@std@@SAPEAPEAVLogSink@absl@@PEAPEAV45@0@Z + ?__rewrap@?$__unwrap_iter_impl@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@__Cr@std@@SAPEAUTransition@cctz@time_internal@absl@@PEAU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@__Cr@std@@SAPEAUTransitionType@cctz@time_internal@absl@@PEAU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@$0A@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@V423@0@Z + ?__rewrap@?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@$0A@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@V423@0@Z + ?__rewrap@?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@$00@__Cr@std@@SA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@23@V423@PEAPEAVLogSink@absl@@@Z + ?__rewrap@?$__unwrap_range_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@SA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@SA@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@SA@PEAPEAVLogSink@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@SA@PEAUTransition@cctz@time_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@SA@PEAUTransitionType@cctz@time_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@@__Cr@std@@SA@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@@__Cr@std@@SA@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@0@Z + ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@XZ + ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ + ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAPEAV?$__tree_node_base@PEAX@23@XZ + ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEBAPEAPEAV?$__tree_node_base@PEAX@23@XZ + ?__segment@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@Z + ?__segment@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@SAPEBQEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAX_K@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@0@Z + ?__size@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEA_KXZ + ?__size@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEB_KXZ + ?__size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEA_KXZ + ?__size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEB_KXZ + ?__swap_layouts@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXAEAV?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@PEAU4567@@Z + ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransitionType@cctz@time_internal@absl@@AEAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@PEAU4567@@Z + ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXAEAV?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAV?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@23@@Z + ?__swap_without_allocator@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAV?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAXAEAV?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAXAEAV123@@Z + ?__throw_length_error@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@CAXXZ + ?__unwrap@?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@SAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@@Z + ?__unwrap@?$__unwrap_iter_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@PEAPEAVLogSink@absl@@$00@__Cr@std@@SAPEAPEAVLogSink@absl@@PEAPEAV45@@Z + ?__unwrap@?$__unwrap_iter_impl@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@__Cr@std@@SAPEAUTransition@cctz@time_internal@absl@@PEAU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@__Cr@std@@SAPEAUTransitionType@cctz@time_internal@absl@@PEAU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@$0A@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@V423@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@$0A@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@V423@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@$00@__Cr@std@@SAPEAPEAVCommandLineFlag@absl@@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@$00@__Cr@std@@SAPEAPEAVLogSink@absl@@V?$__wrap_iter@PEAPEAVLogSink@absl@@@23@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@$00@__Cr@std@@SAPEAPEBVCommandLineFlag@absl@@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@23@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@$00@__Cr@std@@SAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@@Z + ?__unwrap@?$__unwrap_range_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@__Cr@std@@SA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@PEAPEAU1234@@__Cr@std@@SA@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PEAPEAVLogSink@absl@@PEAPEAV12@@__Cr@std@@SA@PEAPEAVLogSink@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@SA@PEAUTransition@cctz@time_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@SA@PEAUTransitionType@cctz@time_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@@__Cr@std@@SA@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V123@@__Cr@std@@SA@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@0@Z + ?__unwrap@?$__unwrap_range_impl@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@__Cr@std@@SA@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@0@Z + ?__upcast@?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@XZ + ?__upcast@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@XZ + ?_mm_cmpgt_epi8_fixed@container_internal@absl@@YA?AT__m128i@@T3@0@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uday_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uhour_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uminute_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Umonth_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Usecond_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uyear_tag@1234@U51234@@Z + ?alloc@Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAAEAV?$allocator@D@__Cr@std@@XZ + ?alloc_size@RawHashSetLayout@container_internal@absl@@QEBA_KXZ + ?allocate@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?allocate@?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@_K@Z + ?allocate@?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@_K@Z + ?allocate@?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@QEAAPEAPEAUCordRep@cord_internal@absl@@_K@Z + ?allocate@?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?allocate@?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAAPEAPEAVCommandLineFlag@absl@@_K@Z + ?allocate@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@_K@Z + ?allocate@?$allocator@PEAVLogSink@absl@@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@_K@Z + ?allocate@?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@QEAAPEAPEBVCommandLineFlag@absl@@_K@Z + ?allocate@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@_K@Z + ?allocate@?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?allocate@?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@QEAAPEAU?$AlignedType@$07@container_internal@absl@@_K@Z + ?allocate@?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@_K@Z + ?allocate@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@_K@Z + ?allocate@?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@QEAAPEAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@56@PEBXPEAX2@Z@_K@Z + ?allocate@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z + ?allocate@?$allocator@UPayload@status_internal@absl@@@__Cr@std@@QEAAPEAUPayload@status_internal@absl@@_K@Z + ?allocate@?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?allocate@?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@_K@Z + ?allocate@?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@_K@Z + ?allocate@?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@QEAAPEAUUnrecognizedFlag@absl@@_K@Z + ?allocate@?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@_K@Z + ?allocate@?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_K@Z + ?allocate@?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_K@Z + ?allocate@?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@_K@Z + ?allocate@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@QEAAPEAVFormatArgImpl@str_format_internal@absl@@_K@Z + ?allocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@AEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@AEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEAPEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAPEAPEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEAU?$AlignedType@$07@container_internal@absl@@AEAV?$allocator@U?$AlignedType@$07@container_internal@absl@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@AEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@AEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@@__Cr@std@@SAPEAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@56@PEBXPEAX2@Z@AEAV?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEAUPayload@status_internal@absl@@AEAV?$allocator@UPayload@status_internal@absl@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@AEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@_K@Z + ?allocate@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEAVFormatArgImpl@str_format_internal@absl@@AEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@23@_K@Z + ?allocate_at_least@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAPEAVCommandLineFlag@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAPEAVCordzHandle@cord_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@PEAVLogSink@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAPEAVLogSink@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAPEBVCommandLineFlag@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAPEBVCordzHandle@cord_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAUTransition@cctz@time_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAUTransitionType@cctz@time_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAUUnrecognizedFlag@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@QEAA?AU?$allocation_result@PEAUViableSubstitution@strings_internal@absl@@_K@23@_K@Z + ?allocate_at_least@?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAA?AU?$allocation_result@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@_K@23@_K@Z + ?arg@BoundConversion@str_format_internal@absl@@QEBAPEBVFormatArgImpl@23@XZ + ?as_chars@InlineData@cord_internal@absl@@QEAAPEADXZ + ?as_chars@InlineData@cord_internal@absl@@QEBAPEBDXZ + ?as_chars@Rep@InlineData@cord_internal@absl@@QEAAPEADXZ + ?as_chars@Rep@InlineData@cord_internal@absl@@QEBAPEBDXZ + ?as_conv@ConvTag@str_format_internal@absl@@QEBA?AW4FormatConversionChar@3@XZ + ?as_flags@ConvTag@str_format_internal@absl@@QEBA?AW4Flags@23@XZ + ?as_length@ConvTag@str_format_internal@absl@@QEBA?AW4LengthMod@3@XZ + ?as_tree@InlineData@cord_internal@absl@@QEBAPEAUCordRep@23@XZ + ?as_tree@InlineRep@Cord@absl@@QEBAPEAUCordRep@cord_internal@3@XZ + ?ascii_isdigit@absl@@YA_NE@Z + ?ascii_isprint@absl@@YA_NE@Z + ?ascii_isspace@absl@@YA_NE@Z + ?ascii_isxdigit@absl@@YA_NE@Z + ?ascii_tolower@absl@@YADE@Z + ?ascii_toupper@absl@@YADE@Z + ?assert_is_full@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAXPEBD@Z + ?at_end@?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEBA_NXZ + ?back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAAEAPEAUCordRep@cord_internal@2@XZ + ?back@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAAEBUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ + ?back@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransitionType@cctz@time_internal@absl@@XZ + ?back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@XZ + ?back@CordRepBtree@cord_internal@absl@@QEBA_KXZ + ?base@?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@QEBAPEAPEAVCommandLineFlag@absl@@XZ + ?base@?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?base@?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@QEBAPEAPEAVLogSink@absl@@XZ + ?base@?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@QEBAPEAPEBVCommandLineFlag@absl@@XZ + ?base@?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ + ?base@?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?base@?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@__Cr@std@@QEBAPEAUUnrecognizedFlag@absl@@XZ + ?base@?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@QEBAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@XZ + ?base@?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?base@?$__wrap_iter@PEBQEAVLogSink@absl@@@__Cr@std@@QEBAPEBQEAVLogSink@absl@@XZ + ?base@?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QEBAPEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?base@?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@QEBAPEBUTransition@cctz@time_internal@absl@@XZ + ?base@?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEBAPEBUTransitionType@cctz@time_internal@absl@@XZ + ?base@?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@__Cr@std@@QEBAPEBUUnrecognizedFlag@absl@@XZ + ?base@?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEGBAAEBQEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?base@?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEGBAAEBQEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?base@?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@QEGBAAEBQEAUTransition@cctz@time_internal@absl@@XZ + ?base@?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEGBAAEBQEAUTransitionType@cctz@time_internal@absl@@XZ + ?begin@?$BitMask@G$0BA@$0A@$0A@@container_internal@absl@@QEBA?AV123@XZ + ?begin@?$BitMask@_K$07$02$0A@@container_internal@absl@@QEBA?AV123@XZ + ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAPEAUPayload@status_internal@2@XZ + ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBAPEBUPayload@status_internal@2@XZ + ?begin@?$Span@$$CBI@absl@@QEBAPEBIXZ + ?begin@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEBVFormatArgImpl@str_format_internal@2@XZ + ?begin@?$Span@I@absl@@QEBAPEAIXZ + ?begin@?$Span@PEAVLogSink@absl@@@absl@@QEBAPEAPEAVLogSink@2@XZ + ?begin@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBAPEBQEAUCordRep@cord_internal@2@XZ + ?begin@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?begin@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?begin@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?begin@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBAPEBQEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEAVCommandLineFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEBVCommandLineFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAPEAUUnrecognizedFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?begin@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@$0BA@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@XZ + ?begin@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@XZ + ?begin@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@XZ + ?begin@?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@QEBAPEBVFormatArgImpl@str_format_internal@absl@@XZ + ?begin@?$initializer_list@W4FormatConversionCharSet@absl@@@std@@QEBAPEBW4FormatConversionCharSet@absl@@XZ + ?begin@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@23@XZ + ?begin@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@23@XZ + ?begin@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@123@XZ + ?begin@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?begin@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@XZ + ?begin@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@23@XZ + ?begin@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@23@XZ + ?begin@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__wrap_iter@PEBQEAVLogSink@absl@@@23@XZ + ?begin@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@23@XZ + ?begin@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ + ?begin@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@XZ + ?begin@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@XZ + ?begin@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@23@XZ + ?begin@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@23@XZ + ?begin@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@XZ + ?begin@ChunkRange@Cord@absl@@QEBA?AVChunkIterator@23@XZ + ?begin@CordRepBtree@cord_internal@absl@@QEBA_KXZ + ?begin@Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEBAPEADXZ + ?begin@__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AU1234@XZ + ?btree@CordRep@cord_internal@absl@@QEAAPEAVCordRepBtree@23@XZ + ?btree@CordRep@cord_internal@absl@@QEBAPEBVCordRepBtree@23@XZ + ?btree@CordRepBtreeNavigator@cord_internal@absl@@QEBAPEAVCordRepBtree@23@XZ + ?btree@CordRepBtreeReader@cord_internal@absl@@QEBAPEAVCordRepBtree@23@XZ + ?bucket_count@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEBA_KXZ + ?bucket_count@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?bytes_value@ProtoField@log_internal@absl@@QEBA?AV?$Span@$$CBD@3@XZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA_KXZ + ?capacity@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?capacity@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?capacity@CommonFields@container_internal@absl@@QEBA_KXZ + ?capacity@CordBuffer@absl@@QEBA_KXZ + ?capacity@CordRepBtree@cord_internal@absl@@QEBA_KXZ + ?cbegin@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__wrap_iter@PEBQEAVLogSink@absl@@@23@XZ + ?char_alloc_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAAEAV?$allocator@D@__Cr@std@@XZ + ?char_begin@Cord@absl@@QEBA?AVCharIterator@12@XZ + ?char_end@Cord@absl@@QEBA?AVCharIterator@12@XZ + ?chunk_begin@Cord@absl@@QEBA?AVChunkIterator@12@XZ + ?chunk_end@Cord@absl@@QEBA?AVChunkIterator@12@XZ + ?clear@?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEAAXXZ + ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QEAAXXZ + ?clear@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QEAAXXZ + ?clear@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAAXXZ + ?clear@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ?clear@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ?clear@InlineRep@Cord@absl@@QEAAPEAUCordRep@cord_internal@3@XZ + ?clear_backing_array@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAX_N@Z + ?clear_cordz_info@InlineData@cord_internal@absl@@QEAAXXZ + ?code@Status@absl@@QEBA?AW4StatusCode@2@XZ + ?code@StatusRep@status_internal@absl@@QEBA?AW4StatusCode@3@XZ + ?combine@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@23@V423@@Z + ?combine_contiguous@MixingHashState@hash_internal@absl@@SA?AV123@V123@PEBE_K@Z + ?combine_raw@MixingHashState@hash_internal@absl@@CA?AV123@V123@_K@Z + ?common@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAAEAVCommonFields@23@XZ + ?common@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAAEBVCommonFields@23@XZ + ?compare_exchange_strong@?$__atomic_base@PEAUArena@LowLevelAlloc@base_internal@absl@@$0A@@__Cr@std@@QEAA_NAEAPEAUArena@LowLevelAlloc@base_internal@absl@@PEAU4567@W4memory_order@23@2@Z + ?compare_exchange_strong@?$__atomic_base@PEAVTimeZone@absl@@$0A@@__Cr@std@@QEAA_NAEAPEAVTimeZone@absl@@PEAV45@W4memory_order@23@2@Z + ?compare_exchange_strong@?$__atomic_base@PEAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QEAA_NAEAPEAVVLogSite@log_internal@absl@@PEAV456@W4memory_order@23@2@Z + ?compare_exchange_weak@?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__Cr@std@@QEAA_NAEAPEAUHashtablezInfo@container_internal@absl@@PEAU456@W4memory_order@23@2@Z + ?compare_exchange_weak@?$__atomic_base@PEAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QEAA_NAEAPEAVVLogSite@log_internal@absl@@PEAV456@W4memory_order@23@2@Z + ?control@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAPEAW4ctrl_t@23@XZ + ?control@CommonFields@container_internal@absl@@QEBAPEAW4ctrl_t@23@XZ + ?control@HeapOrSoo@container_internal@absl@@QEAAAEAT?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@23@XZ + ?control@HeapOrSoo@container_internal@absl@@QEBA?AT?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@23@XZ + ?control@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAPEAW4ctrl_t@34@XZ + ?control_offset@RawHashSetLayout@container_internal@absl@@QEBA_KXZ + ?conversion_char@FormatConversionSpecImpl@str_format_internal@absl@@QEBA?AW4FormatConversionChar@3@XZ + ?copy_max_inline_to@InlineData@cord_internal@absl@@QEBAXPEAD@Z + ?cordz_info@InlineData@cord_internal@absl@@QEBAPEAVCordzInfo@23@XZ + ?cordz_info@InlineRep@Cord@absl@@QEBAPEAVCordzInfo@cord_internal@3@XZ + ?cordz_info@Rep@InlineData@cord_internal@absl@@QEBA_JXZ + ?cordz_should_profile@cord_internal@absl@@YA_JXZ + ?count@FILERawSink@str_format_internal@absl@@QEBA_KXZ + ?crc@CordRep@cord_internal@absl@@QEAAPEAUCordRepCrc@23@XZ + ?crc@CordRep@cord_internal@absl@@QEBAPEBUCordRepCrc@23@XZ + ?cycle_clock_source_@CycleClock@base_internal@absl@@0U?$atomic@P6A_JXZ@__Cr@std@@A + ?data@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAPEADXZ + ?data@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAPEAPEAUCordRep@cord_internal@2@XZ + ?data@?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEAAPEAPEAVLogSink@2@XZ + ?data@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAPEAUPayload@status_internal@2@XZ + ?data@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBAPEBUPayload@status_internal@2@XZ + ?data@?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QEBAPEBVFormatArgImpl@str_format_internal@2@XZ + ?data@?$Span@$$CBD@absl@@QEBAPEBDXZ + ?data@?$Span@$$CBI@absl@@QEBAPEBIXZ + ?data@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEBVFormatArgImpl@str_format_internal@2@XZ + ?data@?$Span@D@absl@@QEBAPEADXZ + ?data@?$Span@I@absl@@QEBAPEAIXZ + ?data@?$Span@PEAVLogSink@absl@@@absl@@QEBAPEAPEAVLogSink@2@XZ + ?data@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBAPEBQEAUCordRep@cord_internal@2@XZ + ?data@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@$0BA@@__Cr@std@@QEAAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@XZ + ?data@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBQEAVCommandLineFlag@absl@@XZ + ?data@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBQEAVCordzHandle@cord_internal@absl@@XZ + ?data@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@XZ + ?data@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBQEAVLogSink@absl@@XZ + ?data@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBQEBVCommandLineFlag@absl@@XZ + ?data@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBQEBVCordzHandle@cord_internal@absl@@XZ + ?data@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?data@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBUTransition@cctz@time_internal@absl@@XZ + ?data@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBUTransitionType@cctz@time_internal@absl@@XZ + ?data@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBUUnrecognizedFlag@absl@@XZ + ?data@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEBUViableSubstitution@strings_internal@absl@@XZ + ?data@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEBV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?data@AlphaNum@absl@@QEBAPEBDXZ + ?data@CordBuffer@absl@@QEAAPEADXZ + ?data@InlineRep@Cord@absl@@QEBAPEBDXZ + ?data@NonEmptyInlinedStorage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEAAPEADXZ + ?data@Rep@CordBuffer@absl@@QEAAPEADXZ + ?day@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?day@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?day@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z + ?days_per_4years@impl@detail@cctz@time_internal@absl@@YAHH@Z + ?days_per_century@impl@detail@cctz@time_internal@absl@@YAHH@Z + ?days_per_month@impl@detail@cctz@time_internal@absl@@YAH_JC@Z + ?days_per_year@impl@detail@cctz@time_internal@absl@@YAH_JC@Z + ?dealloc@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXXZ + ?deallocate@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@_K@Z + ?deallocate@?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@_K@Z + ?deallocate@?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@_K@Z + ?deallocate@?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAAXPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?deallocate@?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@QEAAXPEAPEAVCommandLineFlag@absl@@_K@Z + ?deallocate@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@_K@Z + ?deallocate@?$allocator@PEAVLogSink@absl@@@__Cr@std@@QEAAXPEAPEAVLogSink@absl@@_K@Z + ?deallocate@?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@QEAAXPEAPEBVCommandLineFlag@absl@@_K@Z + ?deallocate@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@_K@Z + ?deallocate@?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QEAAXPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@QEAAXPEAU?$AlignedType@$07@container_internal@absl@@_K@Z + ?deallocate@?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@QEAAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@_K@Z + ?deallocate@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@_K@Z + ?deallocate@?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@QEAAXPEAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@56@PEBXPEAX2@Z@_K@Z + ?deallocate@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z + ?deallocate@?$allocator@UPayload@status_internal@absl@@@__Cr@std@@QEAAXPEAUPayload@status_internal@absl@@_K@Z + ?deallocate@?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QEAAXPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?deallocate@?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@QEAAXPEAUUnrecognizedFlag@absl@@_K@Z + ?deallocate@?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@_K@Z + ?deallocate@?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_K@Z + ?deallocate@?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_K@Z + ?deallocate@?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@_K@Z + ?deallocate@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@QEAAXPEAVFormatArgImpl@str_format_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@PEAPEAUCordRep@cord_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVCommandLineFlag@absl@@@23@PEAPEAVCommandLineFlag@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@PEAPEAVCordzHandle@cord_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEAVLogSink@absl@@@23@PEAPEAVLogSink@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVCommandLineFlag@absl@@@23@PEAPEBVCommandLineFlag@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@PEAPEBVCordzHandle@cord_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@U?$AlignedType@$07@container_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$AlignedType@$07@container_internal@absl@@@23@PEAU?$AlignedType@$07@container_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@23@PEBXPEAX2@Z@@23@PEAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@67@PEBXPEAX3@Z@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@23@PEAUPayload@status_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@23@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@PEAUTransition@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@PEAUTransitionType@cctz@time_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UUnrecognizedFlag@absl@@@23@PEAUUnrecognizedFlag@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@PEAUViableSubstitution@strings_internal@absl@@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@23@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@23@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@23@PEAVFormatArgImpl@str_format_internal@absl@@_K@Z + ?decrement_size@CommonFields@container_internal@absl@@QEAAXXZ + ?decrement_size@HashtableSize@container_internal@absl@@QEAAXXZ + ?decrement_small_size@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXXZ + ?delimiter@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBVByAnyChar@3@XZ + ?delimiter@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBVByAnyChar@3@XZ + ?delimiter@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBVByChar@3@XZ + ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z + ?destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@@Z + ?destroy_slots@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXXZ + ?destructor_impl@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXXZ + ?difference@detail@cctz@time_internal@absl@@YA_JUday_tag@1234@Ufields@1234@1@Z + ?difference@detail@cctz@time_internal@absl@@YA_JUhour_tag@1234@Ufields@1234@1@Z + ?difference@detail@cctz@time_internal@absl@@YA_JUminute_tag@1234@Ufields@1234@1@Z + ?difference@detail@cctz@time_internal@absl@@YA_JUsecond_tag@1234@Ufields@1234@1@Z + ?effective_impl@time_zone@cctz@time_internal@absl@@AEBAAEBVImpl@1234@XZ + ?element@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@SAAEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@PEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@@Z + ?emplace@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@CAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@@Z + ?empty@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEBA_NXZ + ?empty@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBA_NXZ + ?empty@?$Span@$$CBD@absl@@QEBA_NXZ + ?empty@?$Span@D@absl@@QEBA_NXZ + ?empty@?$Span@I@absl@@QEBA_NXZ + ?empty@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_NXZ + ?empty@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_NXZ + ?empty@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ?empty@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBA_NXZ + ?empty@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA_NXZ + ?empty@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ?empty@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ?empty@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ?empty@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ?empty@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_NXZ + ?empty@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBA_NXZ + ?empty@CommonFields@container_internal@absl@@QEBA_NXZ + ?empty@Cord@absl@@QEBA_NXZ + ?empty@HashtableSize@container_internal@absl@@QEBA_NXZ + ?encoded_message@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?encoded_remaining@LogMessageData@LogMessage@log_internal@absl@@QEAAAEAV?$Span@D@4@XZ + ?end@?$BitMask@G$0BA@$0A@$0A@@container_internal@absl@@QEBA?AV123@XZ + ?end@?$BitMask@_K$07$02$0A@@container_internal@absl@@QEBA?AV123@XZ + ?end@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAPEAUPayload@status_internal@2@XZ + ?end@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBAPEBUPayload@status_internal@2@XZ + ?end@?$Span@$$CBI@absl@@QEBAPEBIXZ + ?end@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEBVFormatArgImpl@str_format_internal@2@XZ + ?end@?$Span@I@absl@@QEBAPEAIXZ + ?end@?$Span@PEAVLogSink@absl@@@absl@@QEBAPEAPEAVLogSink@2@XZ + ?end@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBAPEBQEAUCordRep@cord_internal@2@XZ + ?end@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?end@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?end@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?end@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVCommandLineFlag@absl@@AEAV?$allocator@PEAVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEAVCommandLineFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEAVLogSink@absl@@AEAV?$allocator@PEAVLogSink@absl@@@23@@__Cr@std@@QEAAPEAPEAVLogSink@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PEBVCommandLineFlag@absl@@AEAV?$allocator@PEBVCommandLineFlag@absl@@@23@@__Cr@std@@QEAAPEAPEBVCommandLineFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QEAAPEAUUnrecognizedFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AEAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@23@XZ + ?end@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@23@XZ + ?end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@XZ + ?end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@XZ + ?end@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@23@XZ + ?end@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@@23@XZ + ?end@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@123@XZ + ?end@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?end@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@XZ + ?end@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@23@XZ + ?end@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@23@XZ + ?end@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@23@XZ + ?end@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ + ?end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@XZ + ?end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@XZ + ?end@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUUnrecognizedFlag@absl@@@23@XZ + ?end@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA?AV?$__wrap_iter@PEBUUnrecognizedFlag@absl@@@23@XZ + ?end@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@XZ + ?end@ChunkRange@Cord@absl@@QEBA?AVChunkIterator@23@XZ + ?end@CordRepBtree@cord_internal@absl@@QEBA_KXZ + ?end@Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEBAPEADXZ + ?end@__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA?AU1234@XZ + ?engines@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PEIAXPEIBX_KV54@_N@Z@4UArchSpecificEngines@234@B + ?eq_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAAEBUStringEq@23@XZ + ?erase@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAPEAUPayload@status_internal@2@PEBU342@@Z + ?erase@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAPEAVLogSink@absl@@@23@V?$__wrap_iter@PEBQEAVLogSink@absl@@@23@@Z + ?error@FILERawSink@str_format_internal@absl@@QEBAHXZ + ?exchange@?$__atomic_base@PEAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QEAAPEAVVLogSite@log_internal@absl@@PEAV456@W4memory_order@23@@Z + ?external@CordRep@cord_internal@absl@@QEAAPEAUCordRepExternal@23@XZ + ?external@CordRep@cord_internal@absl@@QEBAPEBUCordRepExternal@23@XZ + ?fetch_add_end@CordRepBtree@cord_internal@absl@@AEAA_K_K@Z + ?find@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ?fits_in_soo@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBA_N_K@Z + ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z + ?flat@CordRep@cord_internal@absl@@QEAAPEAUCordRepFlat@23@XZ + ?flat@CordRep@cord_internal@absl@@QEBAPEBUCordRepFlat@23@XZ + ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV567@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@AEBV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@967@AEBVtime_zone@234@@Z + ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEAMW4chars_format@1@@Z + ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEANW4chars_format@1@@Z + ?front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?front@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?front@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ + ?gbswap_16@absl@@YAGG@Z + ?gbswap_32@absl@@YAII@Z + ?gbswap_64@absl@@YA_K_K@Z + ?generate_new_seed@CommonFields@container_internal@absl@@QEAAX_N@Z + ?generate_new_seed@HashtableSize@container_internal@absl@@QEAAXXZ + ?generation@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEBAEXZ + ?generation@HashSetIteratorGenerationInfoDisabled@container_internal@absl@@QEBAEXZ + ?generation_offset@RawHashSetLayout@container_internal@absl@@QEBA_KXZ + ?generation_ptr@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEBAPEAEXZ + ?generation_ptr@HashSetIteratorGenerationInfoDisabled@container_internal@absl@@QEBAPEBEXZ + ?get@?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@container_internal@absl@@QEBAPEAW4ctrl_t@23@XZ + ?get@?$MaybeInitializedPtr@X@container_internal@absl@@QEBAPEAXXZ + ?get@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAAPEAUList@CordzInfo@cord_internal@2@XZ + ?get@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAAPEAURefcountedRep@CrcCordState@crc_internal@2@XZ + ?get@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAAPEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?get@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEBAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?get@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAAPEAVFlagRegistry@flags_internal@2@XZ + ?get@?$NoDestructor@VMutex@absl@@@absl@@QEAAPEAVMutex@2@XZ + ?get@?$Storage@PEAPEAUCordRep@cord_internal@absl@@$00U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEAPEAPEAUCordRep@cord_internal@4@XZ + ?get@?$Storage@PEAPEAVLogSink@absl@@$00U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@internal_compressed_tuple@container_internal@2@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEAPEAPEAVLogSink@4@XZ + ?get@?$Storage@PEAUPayload@status_internal@absl@@$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEAPEAUPayload@status_internal@4@XZ + ?get@?$Storage@UStringEq@container_internal@absl@@$01U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QEGBAAEBUStringEq@34@XZ + ?get@?$Storage@UStringHash@container_internal@absl@@$00U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAUStringHash@34@XZ + ?get@?$Storage@UStringHash@container_internal@absl@@$00U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QEGBAAEBUStringHash@34@XZ + ?get@?$Storage@V?$allocator@D@__Cr@std@@$00U?$StorageTag@_KV?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@D@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@D@__Cr@std@@$02U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@D@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@PEAPEAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@PEAPEAVLogSink@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@PEAVLogSink@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PEAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGBAAEBV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QEGAAAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@VCommonFields@container_internal@absl@@$0A@U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEAVCommonFields@34@XZ + ?get@?$Storage@VCommonFields@container_internal@absl@@$0A@U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$0A@@internal_compressed_tuple@container_internal@absl@@QEGBAAEBVCommonFields@34@XZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEA_KXZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGBAAEB_KXZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEA_KXZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGBAAEB_KXZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEA_KXZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGBAAEB_KXZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGAAAEA_KXZ + ?get@?$Storage@_K$00U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@_K@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGBAAEB_KXZ + ?get@?$Storage@_K$0A@U?$StorageTag@_KV?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QEGBAAEB_KXZ + ?get@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ + ?get@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransitionType@cctz@time_internal@absl@@XZ + ?get@?$__tuple_leaf@$00AEAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@$0A@@__Cr@std@@QEAAAEAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@XZ + ?get@?$__tuple_leaf@$0A@$$QEAPEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@XZ + ?get@?$__tuple_leaf@$0A@AEAPEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@XZ + ?get@?$__tuple_leaf@$0A@AEAUFindInfo@container_internal@absl@@$0A@@__Cr@std@@QEAAAEAUFindInfo@container_internal@absl@@XZ + ?get@?$__tuple_leaf@$0A@AEBQEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEBQEAVCommandLineFlag@absl@@XZ + ?get@?$__tuple_leaf@$0A@PEAVCommandLineFlag@absl@@$0A@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@XZ + ?get@?$unique_ptr@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?get@?$unique_ptr@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?get@?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@XZ + ?get@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@XZ + ?get@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ?get@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@XZ + ?get@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ + ?get@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBAPEAVZoneInfoSource@cctz@time_internal@absl@@XZ + ?get@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEBAPEAXXZ + ?get@PlacementImpl@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QEAAPEAUList@CordzInfo@cord_internal@3@XZ + ?get@PlacementImpl@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QEAAPEAURefcountedRep@CrcCordState@crc_internal@3@XZ + ?get@PlacementImpl@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAAPEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@3@XZ + ?get@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QEBAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?get@PlacementImpl@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAAPEAVFlagRegistry@flags_internal@3@XZ + ?get@PlacementImpl@?$NoDestructor@VMutex@absl@@@absl@@QEAAPEAVMutex@3@XZ + ?get_cordz_mean_interval@cord_internal@absl@@YAHXZ + ?get_deleter@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEBV?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBAAEBV?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAU?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@23@XZ + ?get_deleter@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAU?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAU?$default_delete@VFlagState@flags_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAU?$default_delete@VFlagStateInterface@flags_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAU?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAU?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEAAAEAUDynValueDeleter@flags_internal@absl@@XZ + ?get_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEBAHXZ + ?get_soo_data@HeapOrSoo@container_internal@absl@@QEAAPEAXXZ + ?get_soo_data@HeapOrSoo@container_internal@absl@@QEBAPEBXXZ + ?get_weekday@detail@cctz@time_internal@absl@@YA?AW4weekday@1234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@@Z + ?get_yearday@detail@cctz@time_internal@absl@@YAHAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@@Z + ?growth_info@CommonFields@container_internal@absl@@QEAAAEAVGrowthInfo@23@XZ + ?growth_info@CommonFields@container_internal@absl@@QEBA?AVGrowthInfo@23@XZ + ?growth_left@CommonFields@container_internal@absl@@QEBA_KXZ + ?has_alt_flag@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ + ?has_infoz@CommonFields@container_internal@absl@@QEBA_NXZ + ?has_infoz@HashtableSize@container_internal@absl@@QEBA_NXZ + ?has_left_flag@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ + ?has_parsed_conversion@UntypedFormatSpecImpl@str_format_internal@absl@@QEBA_NXZ + ?has_show_pos_flag@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ + ?has_sign_col_flag@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ + ?has_timeout@KernelTimeout@synchronization_internal@absl@@QEBA_NXZ + ?has_zero_flag@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ + ?hash_function@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAU?$hash@PEBUCordRep@cord_internal@absl@@@23@XZ + ?hash_function@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?hash_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAAEAUStringHash@23@XZ + ?hash_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAAEBUStringHash@23@XZ + ?hash_with_seed@?$HashImpl@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@hash_internal@absl@@AEBA_KAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?hash_with_seed@StringHash@container_internal@absl@@AEBA_KV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?height@CordRepBtree@cord_internal@absl@@QEBAHXZ + ?hour@?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?hour@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?hour@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?increment_size@CommonFields@container_internal@absl@@QEAAXXZ + ?increment_size@CommonFields@container_internal@absl@@QEAAX_K@Z + ?increment_size@HashtableSize@container_internal@absl@@QEAAXXZ + ?increment_size@HashtableSize@container_internal@absl@@QEAAX_K@Z + ?index@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@QEBA_KXZ + ?index@?$probe_seq@$0BA@@container_internal@absl@@QEBA_KXZ + ?index@CordRepBtree@cord_internal@absl@@QEBA_KW4EdgeType@123@@Z + ?infoz@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AVHashtablezInfoHandle@23@XZ + ?infoz@CommonFields@container_internal@absl@@QEAA?AVHashtablezInfoHandle@23@XZ + ?infoz_ptr@CommonFields@container_internal@absl@@QEBAPEAVHashtablezInfoHandle@23@XZ + ?inline_size@InlineData@cord_internal@absl@@QEBA_KXZ + ?inline_size@InlineRep@Cord@absl@@AEBA_KXZ + ?inline_size@Rep@InlineData@cord_internal@absl@@QEBA_KXZ + ?insert@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QEAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@56@@Z + ?insert@?$unordered_set@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_const_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBQEBUCordRep@cord_internal@absl@@@Z + ?int32_value@ProtoField@log_internal@absl@@QEBAHXZ + ?int64_value@ProtoField@log_internal@absl@@QEBA_JXZ + ?is_absolute_timeout@KernelTimeout@synchronization_internal@absl@@QEBA_NXZ + ?is_basic@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ + ?is_conv@ConvTag@str_format_internal@absl@@QEBA_NXZ + ?is_either_profiled@InlineData@cord_internal@absl@@SA_NAEBV123@0@Z + ?is_empty@InlineData@cord_internal@absl@@QEBA_NXZ + ?is_flags@ConvTag@str_format_internal@absl@@QEBA_NXZ + ?is_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEBA_NXZ + ?is_leap_year@impl@detail@cctz@time_internal@absl@@YA_N_J@Z + ?is_length@ConvTag@str_format_internal@absl@@QEBA_NXZ + ?is_profiled@InlineData@cord_internal@absl@@QEBA_NXZ + ?is_relative_timeout@KernelTimeout@synchronization_internal@absl@@QEBA_NXZ + ?is_sampled_seed@HashtableSize@container_internal@absl@@QEBA_NXZ + ?is_short@Rep@CordBuffer@absl@@QEBA_NXZ + ?is_single_group@container_internal@absl@@YA_N_K@Z + ?is_small@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBA_NXZ + ?is_small@CommonFields@container_internal@absl@@QEBA_NXZ + ?is_snapshot@CordzHandle@cord_internal@absl@@QEBA_NXZ + ?is_soo@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBA_NXZ + ?is_tree@InlineData@cord_internal@absl@@QEBA_NXZ + ?is_tree@InlineRep@Cord@absl@@QEBA_NXZ + ?is_tree@Rep@InlineData@cord_internal@absl@@QEBA_NXZ + ?iterator_at@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AViterator@123@_K@Z + ?iterator_at_ptr@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AViterator@123@U?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@@Z + ?kDefaultIterControl@container_internal@absl@@3W4ctrl_t@12@A + ?key_comp@?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@QEBAAEBU?$less@X@23@XZ + ?key_comp@?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@QEBAAEBU?$less@X@23@XZ + ?key_eq@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAU?$equal_to@PEBUCordRep@cord_internal@absl@@@23@XZ + ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?length@CordRepBtreeReader@cord_internal@absl@@QEBA_KXZ + ?length_mod@FormatConversionSpecImpl@str_format_internal@absl@@QEBA?AW4LengthMod@3@XZ + ?load@?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__Cr@std@@QEBAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZW4memory_order@23@@Z + ?load@?$__atomic_base@PEAUArena@LowLevelAlloc@base_internal@absl@@$0A@@__Cr@std@@QEBAPEAUArena@LowLevelAlloc@base_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__Cr@std@@QEBAPEAUHashtablezInfo@container_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@QEBAPEAVCordzHandle@cord_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PEAVCordzInfo@cord_internal@absl@@$0A@@__Cr@std@@QEBAPEAVCordzInfo@cord_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PEAVTimeZone@absl@@$0A@@__Cr@std@@QEBAPEAVTimeZone@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PEAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QEBAPEAVVLogSite@log_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@VMaskedPointer@flags_internal@absl@@$0A@@__Cr@std@@QEBA?AVMaskedPointer@flags_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__Cr@std@@QEBA?AW4OnDeadlockCycle@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__Cr@std@@QEBA?AW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z + ?load_time_zone@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVtime_zone@123@@Z + ?local_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?lock@FlagRegistry@flags_internal@absl@@QEAAXXZ + ?lock@Mutex@absl@@QEAAXXZ + ?lock@SpinLock@base_internal@absl@@QEAAXXZ + ?lock_shared@Mutex@absl@@QEAAXXZ + ?log_severity@LogEntry@absl@@QEBA?AW4LogSeverity@2@XZ + ?lookup@time_zone@cctz@time_internal@absl@@QEBA?AUabsolute_lookup@1234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?lookup@time_zone@cctz@time_internal@absl@@QEBA?AUcivil_lookup@1234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?make_tree@InlineData@cord_internal@absl@@QEAAXPEAUCordRep@23@@Z + ?make_tree@Rep@InlineData@cord_internal@absl@@QEAAXPEAUCordRep@34@@Z + ?max@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ + ?max@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ + ?max@?$numeric_limits@Vint128@absl@@@__Cr@std@@SA?AVint128@absl@@XZ + ?max@?$numeric_limits@Vuint128@absl@@@__Cr@std@@SA?AVuint128@absl@@XZ + ?max_load_factor@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAAAEAMXZ + ?max_load_factor@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAMXZ + ?max_size@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?max_size@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?maybe_increment_generation_on_insert@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEAAXXZ + ?memcasecmp@strings_internal@absl@@YAHPEBD0_K@Z + ?message@Status@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?message@StatusRep@status_internal@absl@@QEBAAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?min@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ + ?min@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ + ?min@?$numeric_limits@Vint128@absl@@@__Cr@std@@SA?AVint128@absl@@XZ + ?minute@?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?minute@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?minute@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?month@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?month@?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?month@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?month@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?mutable_rep@CrcCordState@crc_internal@absl@@QEAAPEAURep@123@XZ + ?n_day@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_JC00CCC@Z + ?n_hour@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J0000CC@Z + ?n_min@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J00000C@Z + ?n_mon@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J000CCC@Z + ?n_sec@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J00000@Z + ?name@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?next@?$probe_seq@$0BA@@container_internal@absl@@QEAAXXZ + ?next_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@1234@@Z + ?next_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z + ?non_temporal_store_memcpy@crc_internal@absl@@YAPEAXPEIAXPEIBX_K@Z + ?non_temporal_store_memcpy_avx@crc_internal@absl@@YAPEAXPEIAXPEIBX_K@Z + ?offset@?$probe_seq@$0BA@@container_internal@absl@@QEBA_KXZ + ?offset@?$probe_seq@$0BA@@container_internal@absl@@QEBA_K_K@Z + ?ok@Status@absl@@QEBA_NXZ + ?ok@Utf8ForCodePoint@debugging_internal@absl@@QEBA_NXZ + ?overflow@Streambuf@OStringStream@strings_internal@absl@@MEAAHH@Z + ?parse@detail@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0AEBVtime_zone@234@PEAV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@PEAV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@chrono@67@PEAV567@@Z + ?parsed_conversion@UntypedFormatSpecImpl@str_format_internal@absl@@QEBAPEBVParsedFormatBase@23@XZ + ?pointer_to@?$pointer_traits@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@23@AEAU423@@Z + ?pointer_to@?$pointer_traits@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@23@AEAU423@@Z + ?pointer_to@?$pointer_traits@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@AEAU423@@Z + ?pointer_to@?$pointer_traits@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@__Cr@std@@SAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@AEAU423@@Z + ?pointer_to@?$pointer_traits@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@__Cr@std@@SAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@AEAU423@@Z + ?pointer_to@?$pointer_traits@PEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAPEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@AEBU423@@Z + ?poison@InlineData@cord_internal@absl@@QEAAXXZ + ?poison_this@InlineData@cord_internal@absl@@QEAAXXZ + ?pop_back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAXXZ + ?pop_back@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?pop_back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?pop_front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXXZ + ?pop_front@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ?precision@FormatConversionSpecImpl@str_format_internal@absl@@QEBAHXZ + ?predicate@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBUAllowEmpty@3@XZ + ?predicate@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBUSkipEmpty@3@XZ + ?predicate@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBAAEBUAllowEmpty@3@XZ + ?prefetch_heap_block@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAXXZ + ?prefix@LogEntry@absl@@QEBA_NXZ + ?prev_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@1234@@Z + ?prev_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z + ?probe@container_internal@absl@@YA?AV?$probe_seq@$0BA@@12@AEBVCommonFields@12@_K@Z + ?probe@container_internal@absl@@YA?AV?$probe_seq@$0BA@@12@_K0@Z + ?probe_h1@container_internal@absl@@YA?AV?$probe_seq@$0BA@@12@_K0@Z + ?push_back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEAAXAEBQEAUCordRep@cord_internal@2@@Z + ?push_back@?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEAAXAEBQEAVLogSink@2@@Z + ?push_back@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEAAX$$QEAUPayload@status_internal@2@@Z + ?push_back@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?push_back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?push_back@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEAVCommandLineFlag@absl@@@Z + ?push_back@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z + ?push_back@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEAVLogSink@absl@@@Z + ?push_back@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEBVCommandLineFlag@absl@@@Z + ?push_back@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEBVCommandLineFlag@absl@@@Z + ?push_back@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z + ?push_back@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?push_back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBUTransition@cctz@time_internal@absl@@@Z + ?push_back@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBUUnrecognizedFlag@absl@@@Z + ?raw_code@Status@absl@@QEBAHXZ + ?reduce_size@InlineRep@Cord@absl@@QEAAX_K@Z + ?release@?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?release@?$unique_ptr@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?release@?$unique_ptr@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?release@?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@XZ + ?release@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@XZ + ?release@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ?release@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@XZ + ?release@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@XZ + ?release@?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAVFallbackCrcMemcpyEngine@crc_internal@absl@@XZ + ?release@?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAVFlagState@flags_internal@absl@@XZ + ?release@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAVFlagStateInterface@flags_internal@absl@@XZ + ?release@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAVTimeZoneInfo@cctz@time_internal@absl@@XZ + ?release@?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAPEAVTimeZoneLibC@cctz@time_internal@absl@@XZ + ?release@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEAAPEAXXZ + ?remaining_inline_capacity@InlineRep@Cord@absl@@QEBA_KXZ + ?remove_prefix@?$Span@$$CBD@absl@@QEAAX_K@Z + ?remove_prefix@?$Span@D@absl@@QEAAX_K@Z + ?remove_prefix@InlineRep@Cord@absl@@QEAAX_K@Z + ?remove_suffix@?$Span@$$CBD@absl@@QEAAX_K@Z + ?remove_suffix@?$Span@D@absl@@QEAAX_K@Z + ?rep@CrcCordState@crc_internal@absl@@QEBAAEBURep@123@XZ + ?rep@Rep@CordBuffer@absl@@QEBAPEAUCordRepFlat@cord_internal@3@XZ + ?reserve@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reset@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAX$$T@Z + ?reset@?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAXPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?reset@?$unique_ptr@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@23@@Z + ?reset@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@23@@Z + ?reset@?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAULogMessageData@LogMessage@log_internal@absl@@@Z + ?reset@?$unique_ptr@UThreadIdentity@base_internal@absl@@P6AXPEAX@Z@__Cr@std@@QEAAXPEAUThreadIdentity@base_internal@absl@@@Z + ?reset@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z + ?reset@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ?reset@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z + ?reset@?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAVFallbackCrcMemcpyEngine@crc_internal@absl@@@Z + ?reset@?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAVFlagState@flags_internal@absl@@@Z + ?reset@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAVFlagStateInterface@flags_internal@absl@@@Z + ?reset@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAVTimeZoneIf@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAVTimeZoneInfo@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAVTimeZoneLibC@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEAVZoneInfoSource@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QEAAXPEAX@Z + ?reset_reserved_growth@CommonFields@container_internal@absl@@QEAAX_K@Z + ?reset_reserved_growth@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEAAX_K0@Z + ?resize@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?resize@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?safe_strto128_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVint128@2@H@Z + ?safe_strto16_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAFH@Z + ?safe_strto32_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHH@Z + ?safe_strto64_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_JH@Z + ?safe_strto8_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEACH@Z + ?safe_strtou128_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVuint128@2@H@Z + ?safe_strtou16_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAGH@Z + ?safe_strtou32_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAIH@Z + ?safe_strtou64_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_KH@Z + ?safe_strtou8_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAEH@Z + ?sampling_stride@CordzInfo@cord_internal@absl@@QEBA_JXZ + ?scale_add@impl@detail@cctz@time_internal@absl@@YA_J_J00@Z + ?second@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?second@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ + ?seed@CommonFields@container_internal@absl@@QEBA?AVPerTableSeed@23@XZ + ?seed@HashtableSize@container_internal@absl@@QEBA?AVPerTableSeed@23@XZ + ?seed@PerTableSeed@container_internal@absl@@QEBA_KXZ + ?self@Rep@InlineData@cord_internal@absl@@QEAAPEAU1234@XZ + ?self@Rep@InlineData@cord_internal@absl@@QEBAPEBU1234@XZ + ?set@?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@container_internal@absl@@QEAAXPEAW4ctrl_t@23@@Z + ?set@?$MaybeInitializedPtr@X@container_internal@absl@@QEAAXPEAX@Z + ?set_arg@BoundConversion@str_format_internal@absl@@QEAAXPEBVFormatArgImpl@23@@Z + ?set_begin@CordRepBtree@cord_internal@absl@@AEAAX_K@Z + ?set_capacity@CommonFields@container_internal@absl@@QEAAX_K@Z + ?set_control@CommonFields@container_internal@absl@@QEAAXPEAW4ctrl_t@23@@Z + ?set_conversion_char@FormatConversionSpecImpl@str_format_internal@absl@@QEAAXW4FormatConversionChar@3@@Z + ?set_cordz_info@InlineData@cord_internal@absl@@QEAAXPEAVCordzInfo@23@@Z + ?set_cordz_info@Rep@InlineData@cord_internal@absl@@QEAAX_J@Z + ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z + ?set_data@InlineRep@Cord@absl@@QEAAPEAD_K@Z + ?set_data@InlineRep@Cord@absl@@QEAAXPEBD_K@Z + ?set_empty_soo@CommonFields@container_internal@absl@@QEAAXXZ + ?set_end@CordRepBtree@cord_internal@absl@@AEAAX_K@Z + ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEAAXH@Z + ?set_full_soo@CommonFields@container_internal@absl@@QEAAXXZ + ?set_generation@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEAAXE@Z + ?set_generation_ptr@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEAAXPEAE@Z + ?set_has_infoz@CommonFields@container_internal@absl@@QEAAXXZ + ?set_has_infoz@HashtableSize@container_internal@absl@@QEAAXXZ + ?set_infoz@CommonFields@container_internal@absl@@QEAAXVHashtablezInfoHandle@23@@Z + ?set_inline_data@InlineData@cord_internal@absl@@QEAAXPEBD_K@Z + ?set_inline_size@InlineData@cord_internal@absl@@QEAAX_K@Z + ?set_inline_size@InlineRep@Cord@absl@@AEAAX_K@Z + ?set_inline_size@Rep@InlineData@cord_internal@absl@@QEAAX_K@Z + ?set_reservation_size@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEAAX_K@Z + ?set_reserved_growth@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QEAAX_K@Z + ?set_sampled_seed@HashtableSize@container_internal@absl@@QEAAXXZ + ?set_seed@HashtableSize@container_internal@absl@@AEAAXG@Z + ?set_short_length@Rep@CordBuffer@absl@@QEAAX_K@Z + ?set_size_to_zero@CommonFields@container_internal@absl@@QEAAXXZ + ?set_size_to_zero_keep_metadata@HashtableSize@container_internal@absl@@QEAAXXZ + ?set_slots@CommonFields@container_internal@absl@@QEAAXPEAX@Z + ?set_tag@Rep@InlineData@cord_internal@absl@@QEAAXC@Z + ?set_tree@InlineData@cord_internal@absl@@QEAAXPEAUCordRep@23@@Z + ?set_tree@Rep@InlineData@cord_internal@absl@@QEAAXPEAUCordRep@34@@Z + ?set_value@InputValue@UnboundConversion@str_format_internal@absl@@QEAAXH@Z + ?shallow_subcords_enabled@cord_internal@absl@@3U?$atomic@_N@__Cr@std@@A + ?should_rehash_for_bug_detection_on_insert@CommonFields@container_internal@absl@@QEBA_NXZ + ?should_rehash_for_bug_detection_on_insert@CommonFieldsGenerationInfoEnabled@container_internal@absl@@QEBA_N_K@Z + ?should_rehash_for_bug_detection_on_move@CommonFieldsGenerationInfoEnabled@container_internal@absl@@QEBA_N_K@Z + ?shrink_to_fit@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?shrink_to_fit@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?single_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AViterator@123@XZ + ?single_slot@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@XZ + ?size@?$BigUnsigned@$03@strings_internal@absl@@QEBAHXZ + ?size@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAHXZ + ?size@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEBA_KXZ + ?size@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QEBA_KXZ + ?size@?$InlinedVector@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@absl@@QEBA_KXZ + ?size@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QEBA_KXZ + ?size@?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QEBA_KXZ + ?size@?$Span@$$CBD@absl@@QEBA_KXZ + ?size@?$Span@$$CBI@absl@@QEBA_KXZ + ?size@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBA_KXZ + ?size@?$Span@D@absl@@QEBA_KXZ + ?size@?$Span@I@absl@@QEBA_KXZ + ?size@?$Span@PEAVLogSink@absl@@@absl@@QEBA_KXZ + ?size@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBA_KXZ + ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAAEA_KXZ + ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEAAAEA_KXZ + ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAAEA_KXZ + ?size@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAAEA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?size@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@$0BA@@__Cr@std@@QEBA_KXZ + ?size@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@QEBA_KXZ + ?size@?$initializer_list@W4FormatConversionCharSet@absl@@@std@@QEBA_KXZ + ?size@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEBA_KXZ + ?size@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEBA_KXZ + ?size@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEBA_KXZ + ?size@AlphaNum@absl@@QEBA_KXZ + ?size@CommonFields@container_internal@absl@@QEBA_KXZ + ?size@Cord@absl@@QEBA_KXZ + ?size@CordRepBtree@cord_internal@absl@@QEBA_KXZ + ?size@HashtableSize@container_internal@absl@@QEBA_KXZ + ?size@InlineRep@Cord@absl@@QEBA_KXZ + ?size@Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@QEBA_KXZ + ?skip_empty_or_deleted@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXXZ + ?slot@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@34@XZ + ?slot_array@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@XZ + ?slot_array@CommonFields@container_internal@absl@@QEBAPEAXXZ + ?slot_array@HeapOrSoo@container_internal@absl@@QEAAAEAT?$MaybeInitializedPtr@X@23@XZ + ?slot_array@HeapOrSoo@container_internal@absl@@QEBA?AT?$MaybeInitializedPtr@X@23@XZ + ?slot_offset@RawHashSetLayout@container_internal@absl@@QEBA_KXZ + ?slots_union@CommonFields@container_internal@absl@@QEBA?AT?$MaybeInitializedPtr@X@23@XZ + ?soo_capacity@PolicyFunctions@container_internal@absl@@QEBAEXZ + ?soo_data@CommonFields@container_internal@absl@@QEAAPEAXXZ + ?soo_data@CommonFields@container_internal@absl@@QEBAPEBXXZ + ?source_basename@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?source_filename@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?source_line@LogEntry@absl@@QEBAHXZ + ?stacktrace@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?status@BadStatusOrAccess@absl@@QEBAAEBVStatus@2@XZ + ?step@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uday_tag@1234@U51234@_J@Z + ?step@detail@cctz@time_internal@absl@@YA?AUfields@1234@Usecond_tag@1234@U51234@_J@Z + ?store@?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@QEAAXPEAVCordzHandle@cord_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@PEAVCordzInfo@cord_internal@absl@@$0A@@__Cr@std@@QEAAXPEAVCordzInfo@cord_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@PEAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QEAAXPEAVVLogSite@log_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@VMaskedPointer@flags_internal@absl@@$0A@@__Cr@std@@QEAAXVMaskedPointer@flags_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__Cr@std@@QEAAXW4OnDeadlockCycle@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__Cr@std@@QEAAXW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z + ?str@UntypedFormatSpecImpl@str_format_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?stream@OstreamView@LogMessage@log_internal@absl@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?string_value@ProtoField@log_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?sub_fetch_begin@CordRepBtree@cord_internal@absl@@AEAA_K_K@Z + ?subspan@?$Span@$$CBD@absl@@QEBA?AV12@_K0@Z + ?subspan@?$Span@D@absl@@QEBA?AV12@_K0@Z + ?substring@CordRep@cord_internal@absl@@QEAAPEAUCordRepSubstring@23@XZ + ?substring@CordRep@cord_internal@absl@@QEBAPEBUCordRepSubstring@23@XZ + ?swap@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAV123@@Z + ?tag@ProtoField@log_internal@absl@@QEBA_KXZ + ?tag@Rep@InlineData@cord_internal@absl@@QEBACXZ + ?text@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_newline@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_prefix@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_prefix_and_newline@LogEntry@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_prefix_and_newline_c_str@LogEntry@absl@@QEBAPEBDXZ + ?thread_identity@PerThreadSynch@base_internal@absl@@QEAAPEAUThreadIdentity@23@XZ + ?tid@LogEntry@absl@@QEBAIXZ + ?timestamp@LogEntry@absl@@QEBA?AVTime@2@XZ + ?to_address@?$pointer_traits@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAPEAPEAVCommandLineFlag@absl@@V?$__wrap_iter@PEAPEAVCommandLineFlag@absl@@@23@@Z + ?to_address@?$pointer_traits@V?$__wrap_iter@PEAPEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAPEAPEAVLogSink@absl@@V?$__wrap_iter@PEAPEAVLogSink@absl@@@23@@Z + ?to_address@?$pointer_traits@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAPEAPEBVCommandLineFlag@absl@@V?$__wrap_iter@PEAPEBVCommandLineFlag@absl@@@23@@Z + ?to_address@?$pointer_traits@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@@__Cr@std@@SAPEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@AEBV678@@Z@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@23@@Z + ?total_written@BufferRawSink@str_format_internal@absl@@QEBA_KXZ + ?transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAAXPEAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@23@0@Z + ?transfer_unprobed_elements_to_next_capacity_fn@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CAXAEAVCommonFields@23@PEBW4ctrl_t@23@PEAX2P6AX2E_K3@Z@Z + ?tree@InlineRep@Cord@absl@@QEBAPEAUCordRep@cord_internal@3@XZ + ?tree@Rep@InlineData@cord_internal@absl@@QEBAPEAUCordRep@34@XZ + ?try_lock@Mutex@absl@@QEAA_NXZ + ?try_lock_shared@Mutex@absl@@QEAA_NXZ + ?type@ProtoField@log_internal@absl@@QEBA?AW4WireType@23@XZ + ?uint32_value@ProtoField@log_internal@absl@@QEBAIXZ + ?uint64_value@ProtoField@log_internal@absl@@QEBA_KXZ + ?unchecked_deref@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAAEAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@XZ + ?unlock@FlagRegistry@flags_internal@absl@@QEAAXXZ + ?unlock@Mutex@absl@@QEAAXXZ + ?unlock@SpinLock@base_internal@absl@@QEAAXXZ + ?unlock_shared@Mutex@absl@@QEAAXXZ + ?unpoison@InlineData@cord_internal@absl@@QEAAXXZ + ?utc_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?value@ConvertibleToStringView@strings_internal@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?value@InputValue@UnboundConversion@str_format_internal@absl@@QEBAHXZ + ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?valueless_by_exception@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@QEBA_NXZ + ?valueless_by_exception@?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@QEBA_NXZ + ?verbosity@LogEntry@absl@@QEBAHXZ + ?version@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?what@BadStatusOrAccess@absl@@UEBAPEBDXZ + ?what@SeedGenException@absl@@UEBAPEBDXZ + ?width@FormatConversionSpecImpl@str_format_internal@absl@@QEBAHXZ + ?words@?$BigUnsigned@$03@strings_internal@absl@@QEBAPEBIXZ + ?words@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAPEBIXZ + ?xsputn@Streambuf@OStringStream@strings_internal@absl@@MEAA_JPEBD_J@Z + ?year@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBA_JXZ + ?year@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBA_JXZ + ?year@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBA_JXZ + ?year@?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBA_JXZ + ?year_index@impl@detail@cctz@time_internal@absl@@YAH_JC@Z + ?ymd_ord@impl@detail@cctz@time_internal@absl@@YA_J_JCC@Z + AbslContainerInternalSampleEverything + AbslInternalMutexYield + AbslInternalOnFatalLogMessage + AbslInternalPerThreadSemInit + AbslInternalPerThreadSemPoke + AbslInternalPerThreadSemPost + AbslInternalPerThreadSemWait + AbslInternalReportFatalUsageError + AbslInternalSleepFor + AbslInternalSpinLockDelay + AbslInternalSpinLockWake + AbslInternalTraceContinue + AbslInternalTraceObserved + AbslInternalTraceSignal + AbslInternalTraceWait diff --git a/naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel.def b/naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel.def index 2dc59db82f..0f63e79874 100644 --- a/naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel.def +++ b/naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel.def @@ -36,7 +36,6 @@ EXPORTS ??$Append@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z ??$AppendImpl@AEBVCord@absl@@@Cord@absl@@AEAAXAEBV01@@Z ??$AppendImpl@VCord@absl@@@Cord@absl@@AEAAX$$QEAV01@@Z - ??$Base64EscapeInternal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@strings_internal@absl@@YAXPEBE_KPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_NPEBD@Z ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@A6AXXZ@Z ??$CallOnceImpl@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@$$QEAP8FlagImpl@flags_internal@1@EAAXXZ$$QEAPEAV671@@Z ??$CastAndCallFunction@$$CBU?$atomic@_N@__Cr@std@@@Condition@absl@@CA_NPEBV01@@Z @@ -106,8 +105,7 @@ EXPORTS ??$GrowSooTableToNextCapacityAndPrepareInsert@$07$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z ??$GrowSooTableToNextCapacityAndPrepareInsert@$0A@$0A@@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z ??$GrowSooTableToNextCapacityAndPrepareInsert@$0BA@$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z - ??$InvokeObject@U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z - ??$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z + ??$InvokeObject@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z ??$MakeCheckOpString@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0PEBD@Z ??$MakeCheckOpString@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PEBD@Z ??$MakeCheckOpString@DD@log_internal@absl@@YAPEBDDDPEBD@Z @@ -146,6 +144,7 @@ EXPORTS ??$StrCat@_K@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@3@@Z ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@01@YA?AV234@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@2V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z@@Z ??$TransferNRelocatable@$0BI@@container_internal@absl@@YAXPEAX00_K@Z ??$TryFindNewIndexWithoutProbing@X@container_internal@absl@@YA_K_K00PEAW4ctrl_t@01@0@Z ??$TypeErasedApplyToSlotFn@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@YA_KPEBXPEAX_K@Z @@ -159,41 +158,29 @@ EXPORTS ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$02@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$0A@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z ??$__do_rehash@$00@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAX_K@Z - ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z + ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z ??$__emplace_back_slow_path@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@AEBU34@@Z ??$__emplace_back_slow_path@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@$$QEAW4Source@34@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z - ??$__emplace_unique_key_args@PEBUCordRep@cord_internal@absl@@AEBQEBU123@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBQEBUCordRep@cord_internal@absl@@0@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$__for_each_segment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@23@@__Cr@std@@YAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@01@@Z ??$__insert_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@1_J@Z + ??$__invoke@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@__Cr@std@@YAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@6@@Z ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@12@@Z ??$emplace@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@12@@Z - ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV612@AEA_K@Z - ??$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV34@@Z - ??$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV34@@Z - ??$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV34@@Z - ??$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV345@@Z - ??$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU3456@@Z + ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ??$emplace_back@HVcrc32c_t@absl@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAH$$QEAVcrc32c_t@6@@Z - ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV34@@Z - ??$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU3456@@Z - ??$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QEAV312@@Z - ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$find_or_prepare_insert@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z ??$find_or_prepare_insert_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z @@ -243,7 +230,8 @@ EXPORTS ??0LogMessage@log_internal@absl@@QEAA@PEBDHUInfoTag@012@@Z ??0LogMessage@log_internal@absl@@QEAA@PEBDHUWarningTag@012@@Z ??0LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@2@@Z - ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@3@VTime@3@@Z + ??0LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@2@@Z + ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@3@VTime@3@@Z ??0LogMessageDebugFatal@log_internal@absl@@QEAA@PEBDH@Z ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH0@Z ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH@Z @@ -322,6 +310,7 @@ EXPORTS ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@@Z ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@0123@@Z ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@W4weekday@0123@@Z + ??6log_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@UUnprintableWrapper@01@@Z ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@01@@Z ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@01@@Z ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@01@@Z @@ -339,10 +328,26 @@ EXPORTS ??Kabsl@@YA?AVuint128@0@V10@0@Z ??Labsl@@YA?AVint128@0@V10@0@Z ??Labsl@@YA?AVuint128@0@V10@0@Z + ??R@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBQEBUCordRep@cord_internal@absl@@@Z@QEBA?A?@@00@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV723@AEA_K@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QEAV423@@Z@QEBA?A?@@XZ ??R?$ConvertToContainer@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z ??R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z ??RByCivilTime@Transition@cctz@time_internal@absl@@QEBA_NAEBU1234@0@Z ??RDynValueDeleter@flags_internal@absl@@QEBAXPEAX@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z ??XDuration@absl@@QEAAAEAV01@N@Z ??XDuration@absl@@QEAAAEAV01@_J@Z ??YDuration@absl@@QEAAAEAV01@V01@@Z @@ -406,6 +411,7 @@ EXPORTS ?Append@Cord@absl@@QEAAXAEBV12@@Z ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z + ?Append@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?Append@StringifySink@detect_specialization@log_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?Append@StringifySink@detect_specialization@log_internal@absl@@QEAAX_KD@Z ?Append@StringifySink@strings_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z @@ -509,7 +515,7 @@ EXPORTS ?CreateThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPEAUThreadIdentity@12@XZ ?CurrentValue@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ - ?DataGuard@FlagImpl@flags_internal@absl@@AEBAPEAVMutex@3@XZ + ?DataGuard@FlagImpl@flags_internal@absl@@AEBAAEAVMutex@3@XZ ?DataLossError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?DeadlineExceededError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?DecodeFrom@ProtoField@log_internal@absl@@QEAA_NPEAV?$Span@$$CBD@3@@Z @@ -755,6 +761,7 @@ EXPORTS ?GetWord@?$BigUnsigned@$03@strings_internal@absl@@QEBAIH@Z ?GetWord@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAIH@Z ?GlobalHashtablezSampler@container_internal@absl@@YAAEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?GlobalList@CordzInfo@cord_internal@absl@@CAPEAUList@123@XZ ?GlobalRegistry@FlagRegistry@flags_internal@absl@@SAAEAV123@XZ ?GuaranteedEqual@Condition@absl@@SA_NPEBV12@0@Z ?HandleInvalidStatusCtorArg@Helper@internal_statusor@absl@@SAXPEAVStatus@3@@Z @@ -847,7 +854,6 @@ EXPORTS ?MakeAbsNanos@KernelTimeout@synchronization_internal@absl@@QEBA_JXZ ?MakeAbsTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ ?MakeCheckFailString@status_internal@absl@@YAPEBDPEBVStatus@2@PEBD@Z - ?MakeCheckOpUnprintableString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@C@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z @@ -896,6 +902,7 @@ EXPORTS ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?NextUp@CordRepBtreeNavigator@cord_internal@absl@@AEAAPEAUCordRep@23@XZ ?NoPrefix@LogMessage@log_internal@absl@@QEAAAEAV123@XZ ?NominalCPUFrequency@base_internal@absl@@YANXZ ?Normalize@CrcCordState@crc_internal@absl@@QEAAXXZ @@ -943,8 +950,8 @@ EXPORTS ?Post@StdcppWaiter@synchronization_internal@absl@@QEAAXXZ ?Post@Win32Waiter@synchronization_internal@absl@@QEAAXXZ ?PrepareForSampling@HashtablezInfo@container_internal@absl@@QEAAX_J_K11G@Z - ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KUFindInfo@12@@Z - ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KUFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@@Z + ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z ?PrepareInsertSmallNonSoo@container_internal@absl@@YA?AU?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@AEAVCommonFields@12@AEBUPolicyFunctions@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z ?PrepareToDie@LogMessage@log_internal@absl@@AEAAXXZ ?PrepareToModify@Status@absl@@CAPEAVStatusRep@status_internal@2@_K@Z @@ -961,6 +968,7 @@ EXPORTS ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z ?Print@Streamable@str_format_internal@absl@@QEBAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@@Z + ?PrintTo@absl@@YAXAEBVLogEntry@1@PEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ ?ProgramUsageMessage@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?Ptr@GraphCycles@synchronization_internal@absl@@QEAAPEAXUGraphId@23@@Z @@ -1025,7 +1033,7 @@ EXPORTS ?ResetToBuiltinUTC@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z ?ResizeAllocatedTableWithSeedChange@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z ?ResourceExhaustedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z - ?Restore@FlagState@flags_internal@absl@@EEBAXXZ + ?Restore@FlagState@flags_internal@absl@@EEHAAXXZ ?RestoreState@FlagImpl@flags_internal@absl@@AEAA_NAEBVFlagState@23@@Z ?Retire@flags_internal@absl@@YAXPEBDPEBXPEAE@Z ?ReverseConsume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z @@ -1303,8 +1311,6 @@ EXPORTS ?cycle_clock_source_@CycleClock@base_internal@absl@@0U?$atomic@P6A_JXZ@__Cr@std@@A ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ - ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z - ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z ?effective_impl@time_zone@cctz@time_internal@absl@@AEBAAEBVImpl@1234@XZ ?engines@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PEIAXPEIBX_KV54@_N@Z@4UArchSpecificEngines@234@B ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z @@ -1330,6 +1336,7 @@ EXPORTS ?overflow@Streambuf@OStringStream@strings_internal@absl@@MEAAHH@Z ?parse@detail@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0AEBVtime_zone@234@PEAV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@PEAV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@chrono@67@PEAV567@@Z ?prev_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@1234@@Z + ?prev_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z ?reserve@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z ?reserve@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z ?reserve@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z diff --git a/naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel_asan.def b/naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel_asan.def index f74227d2db..a50c86719d 100644 --- a/naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel_asan.def +++ b/naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel_asan.def @@ -110,13 +110,7 @@ EXPORTS ??$GrowSooTableToNextCapacityAndPrepareInsert@$07$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z ??$GrowSooTableToNextCapacityAndPrepareInsert@$0A@$0A@@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z ??$GrowSooTableToNextCapacityAndPrepareInsert@$0BA@$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z - ??$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z - ??$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z - ??$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z - ??$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z - ??$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z - ??$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z - ??$InvokeObject@U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z + ??$InvokeObject@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z ??$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z ??$MakeCheckOpString@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0PEBD@Z ??$MakeCheckOpString@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PEBD@Z @@ -149,7 +143,15 @@ EXPORTS ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY03D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY03$$CBD@Z ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0BO@DV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY0BO@$$CBD1@Z ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0LD@D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY0LD@$$CBD@Z + ??$StrCat@_K@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@H@01@YA?AV234@H@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@I@01@YA?AV234@I@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@J@01@YA?AV234@J@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@K@01@YA?AV234@K@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_J@01@YA?AV234@_J@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$IntegerToString@_K@01@YA?AV234@1@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@strings_internal@absl@@YAXAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@01@YA?AV234@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@2V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z@@Z ??$TransferNRelocatable@$0BI@@container_internal@absl@@YAXPEAX00_K@Z ??$TryFindNewIndexWithoutProbing@X@container_internal@absl@@YA_K_K00PEAW4ctrl_t@01@0@Z ??$TypeErasedApplyToSlotFn@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@YA_KPEBXPEAX_K@Z @@ -157,7 +159,6 @@ EXPORTS ??$UnparseFloatingPointVal@N@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z - ??$__call@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@?$__invoke_void_return_wrapper@X$00@__Cr@std@@SAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@7@@Z ??$__call_func@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@CAXPEBT__policy_storage@123@AEAVCommandLineFlag@absl@@@Z ??$__construct_at_end@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@0_K@Z ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$00@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z @@ -165,7 +166,7 @@ EXPORTS ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$02@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$0A@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z ??$__do_rehash@$00@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAX_K@Z - ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z + ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z ??$__emplace_back_slow_path@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV612@AEA_K@Z ??$__emplace_back_slow_path@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEAVCommandLineFlag@absl@@AEBQEAV34@@Z ??$__emplace_back_slow_path@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV345@@Z @@ -178,29 +179,27 @@ EXPORTS ??$__emplace_back_slow_path@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU3456@@Z ??$__emplace_back_slow_path@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QEAV312@@Z ??$__emplace_back_slow_path@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@$$QEAW4Source@34@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z - ??$__emplace_unique_key_args@PEBUCordRep@cord_internal@absl@@AEBQEBU123@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBQEBUCordRep@cord_internal@absl@@0@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$__for_each_segment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@23@@__Cr@std@@YAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@01@@Z + ??$__if_likely_else@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@56@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@234@QEAAAEAU56@01@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@301@QEAAAEAU45@12@Z@@Z ??$__insert_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@1_J@Z + ??$__invoke@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@__Cr@std@@YAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@6@@Z ??$construct_at@UPayload@status_internal@absl@@U123@PEAU123@@__Cr@std@@YAPEAUPayload@status_internal@absl@@PEAU234@$$QEAU234@@Z ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@12@@Z ??$emplace@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@12@@Z - ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ - ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ??$emplace_back@HVcrc32c_t@absl@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAH$$QEAVcrc32c_t@6@@Z - ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$find_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z ??$find_or_prepare_insert@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z @@ -254,7 +253,8 @@ EXPORTS ??0LogMessage@log_internal@absl@@QEAA@PEBDHUInfoTag@012@@Z ??0LogMessage@log_internal@absl@@QEAA@PEBDHUWarningTag@012@@Z ??0LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@2@@Z - ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@3@VTime@3@@Z + ??0LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@2@@Z + ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@3@VTime@3@@Z ??0LogMessageDebugFatal@log_internal@absl@@QEAA@PEBDH@Z ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH0@Z ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH@Z @@ -334,6 +334,7 @@ EXPORTS ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@@Z ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@0123@@Z ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@W4weekday@0123@@Z + ??6log_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@UUnprintableWrapper@01@@Z ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@01@@Z ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@01@@Z ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@01@@Z @@ -354,6 +355,11 @@ EXPORTS ??Kabsl@@YA?AVuint128@0@V10@0@Z ??Labsl@@YA?AVint128@0@V10@0@Z ??Labsl@@YA?AVuint128@0@V10@0@Z + ??R@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@45@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@UNoFormatter@12@@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBQEBUCordRep@cord_internal@absl@@@Z@QEBA?A?@@00@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z ??R?$ConvertToContainer@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z ??R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z ??RByCivilTime@Transition@cctz@time_internal@absl@@QEBA_NAEBU1234@0@Z @@ -365,6 +371,8 @@ EXPORTS ??R__destroy_vector@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ ??R__destroy_vector@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ ??R__destroy_vector@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z ??XDuration@absl@@QEAAAEAV01@N@Z ??XDuration@absl@@QEAAAEAV01@_J@Z ??YDuration@absl@@QEAAAEAV01@V01@@Z @@ -535,7 +543,7 @@ EXPORTS ?CreateThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPEAUThreadIdentity@12@XZ ?CurrentValue@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ - ?DataGuard@FlagImpl@flags_internal@absl@@AEBAPEAVMutex@3@XZ + ?DataGuard@FlagImpl@flags_internal@absl@@AEBAAEAVMutex@3@XZ ?DataLossError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?DeadlineExceededError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?DecodeFrom@ProtoField@log_internal@absl@@QEAA_NPEAV?$Span@$$CBD@3@@Z @@ -782,6 +790,7 @@ EXPORTS ?GetWord@?$BigUnsigned@$03@strings_internal@absl@@QEBAIH@Z ?GetWord@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAIH@Z ?GlobalHashtablezSampler@container_internal@absl@@YAAEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?GlobalList@CordzInfo@cord_internal@absl@@CAPEAUList@123@XZ ?GlobalRegistry@FlagRegistry@flags_internal@absl@@SAAEAV123@XZ ?GuaranteedEqual@Condition@absl@@SA_NPEBV12@0@Z ?HandleInvalidStatusCtorArg@Helper@internal_statusor@absl@@SAXPEAVStatus@3@@Z @@ -875,7 +884,6 @@ EXPORTS ?MakeAbsNanos@KernelTimeout@synchronization_internal@absl@@QEBA_JXZ ?MakeAbsTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ ?MakeCheckFailString@status_internal@absl@@YAPEBDPEBVStatus@2@PEBD@Z - ?MakeCheckOpUnprintableString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@C@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z @@ -925,6 +933,7 @@ EXPORTS ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?NextUp@CordRepBtreeNavigator@cord_internal@absl@@AEAAPEAUCordRep@23@XZ ?NoPrefix@LogMessage@log_internal@absl@@QEAAAEAV123@XZ ?NominalCPUFrequency@base_internal@absl@@YANXZ ?Normalize@CrcCordState@crc_internal@absl@@QEAAXXZ @@ -972,8 +981,8 @@ EXPORTS ?Post@StdcppWaiter@synchronization_internal@absl@@QEAAXXZ ?Post@Win32Waiter@synchronization_internal@absl@@QEAAXXZ ?PrepareForSampling@HashtablezInfo@container_internal@absl@@QEAAX_J_K11G@Z - ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KUFindInfo@12@@Z - ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KUFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@@Z + ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z ?PrepareInsertSmallNonSoo@container_internal@absl@@YA?AU?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@AEAVCommonFields@12@AEBUPolicyFunctions@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z ?PrepareToDie@LogMessage@log_internal@absl@@AEAAXXZ ?PrepareToModify@Status@absl@@CAPEAVStatusRep@status_internal@2@_K@Z @@ -990,6 +999,7 @@ EXPORTS ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z ?Print@Streamable@str_format_internal@absl@@QEBAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@@Z + ?PrintTo@absl@@YAXAEBVLogEntry@1@PEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ ?ProgramUsageMessage@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?Ptr@GraphCycles@synchronization_internal@absl@@QEAAPEAXUGraphId@23@@Z @@ -1053,10 +1063,9 @@ EXPORTS ?ReserveTableToFitNewSize@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z ?ResetToBuiltinUTC@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z ?ResetToEmpty@InlineRep@Cord@absl@@AEAAXXZ - ?Resize@?$ResizeUninitializedTraits@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@X@strings_internal@absl@@SAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z ?ResizeAllocatedTableWithSeedChange@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z ?ResourceExhaustedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z - ?Restore@FlagState@flags_internal@absl@@EEBAXXZ + ?Restore@FlagState@flags_internal@absl@@EEHAAXXZ ?RestoreState@FlagImpl@flags_internal@absl@@AEAA_NAEBVFlagState@23@@Z ?Retire@flags_internal@absl@@YAXPEBDPEBXPEAE@Z ?ReverseConsume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z @@ -1072,7 +1081,6 @@ EXPORTS ?SetCallback@FlagImpl@flags_internal@absl@@QEAAXQ6AXXZ@Z ?SetCordBtreeExhaustiveValidation@cord_internal@absl@@YAX_N@Z ?SetCrcCordState@Cord@absl@@AEAAXVCrcCordState@crc_internal@2@@Z - ?SetCtrlInLargeTable@container_internal@absl@@YAXAEBVCommonFields@12@_KE1@Z ?SetCurrentThreadIdentity@base_internal@absl@@YAXPEAUThreadIdentity@12@P6AXPEAX@Z@Z ?SetExitOnDFatal@log_internal@absl@@YAX_N@Z ?SetExpectedChecksum@Cord@absl@@QEAAXI@Z @@ -1323,10 +1331,9 @@ EXPORTS ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z ?__erase_to_end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z - ?__maybe_remove_back_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAA_N_N@Z ?__move_range@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransition@cctz@time_internal@absl@@00@Z ?__move_range@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@00@Z - ?__swap_out_circular_buffer@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAU?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@23@@Z + ?__swap_out_circular_buffer@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z ?__throw_length_error@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ ?__throw_length_error@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ ?__throw_length_error@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@CAXXZ @@ -1346,8 +1353,6 @@ EXPORTS ?cycle_clock_source_@CycleClock@base_internal@absl@@0U?$atomic@P6A_JXZ@__Cr@std@@A ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ - ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z - ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z ?effective_impl@time_zone@cctz@time_internal@absl@@AEBAAEBVImpl@1234@XZ ?end@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@123@XZ ?engines@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PEIAXPEIBX_KV54@_N@Z@4UArchSpecificEngines@234@B @@ -1375,6 +1380,7 @@ EXPORTS ?parse@detail@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0AEBVtime_zone@234@PEAV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@PEAV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@chrono@67@PEAV567@@Z ?poison@InlineData@cord_internal@absl@@QEAAXXZ ?prev_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@1234@@Z + ?prev_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z ?push_back@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEBVImpl@time_zone@cctz@time_internal@absl@@@Z ?push_back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ?remove_prefix@InlineRep@Cord@absl@@QEAAX_K@Z diff --git a/naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel_asan_cxx23.def b/naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel_asan_cxx23.def new file mode 100644 index 0000000000..e943ccd17e --- /dev/null +++ b/naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel_asan_cxx23.def @@ -0,0 +1,1442 @@ +EXPORTS + ?$TSS0@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PEIAXPEIBX_KV54@_N@Z@4HA + ??$?0$$V$0A@@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAA@XZ + ??$?0$$V$0A@@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QEAA@XZ + ??$?0PEAI@?$SaltedSeedSeq@Vseed_seq@__Cr@std@@@random_internal@absl@@QEAA@PEAI0@Z + ??$?0V?$allocator@D@__Cr@std@@@AlphaNum@absl@@QEAA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?6C@LogMessage@log_internal@absl@@QEAAAEAV012@AEBC@Z + ??$?6D@LogMessage@log_internal@absl@@QEAAAEAV012@AEBD@Z + ??$?6E@LogMessage@log_internal@absl@@QEAAAEAV012@AEBE@Z + ??$?6F@LogMessage@log_internal@absl@@QEAAAEAV012@AEBF@Z + ??$?6G@LogMessage@log_internal@absl@@QEAAAEAV012@AEBG@Z + ??$?6H@LogMessage@log_internal@absl@@QEAAAEAV012@AEBH@Z + ??$?6I@LogMessage@log_internal@absl@@QEAAAEAV012@AEBI@Z + ??$?6J@LogMessage@log_internal@absl@@QEAAAEAV012@AEBJ@Z + ??$?6K@LogMessage@log_internal@absl@@QEAAAEAV012@AEBK@Z + ??$?6M@LogMessage@log_internal@absl@@QEAAAEAV012@AEBM@Z + ??$?6N@LogMessage@log_internal@absl@@QEAAAEAV012@AEBN@Z + ??$?6PEAX@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEAX@Z + ??$?6PEBD@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEBD@Z + ??$?6PEBX@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEBX@Z + ??$?6PEB_W@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEB_W@Z + ??$?6_J@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_J@Z + ??$?6_K@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_K@Z + ??$?6_N@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_N@Z + ??$?MUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?OUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CC@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CC@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CG@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CG@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CH@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CH@$$CBD@Z + ??$AbslStringify@VStringifySink@strings_internal@absl@@@absl@@YAXAEAVStringifySink@strings_internal@0@UHex@0@@Z + ??$AddCordRep@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z + ??$AddCordRep@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z + ??$AddData@$00@CordRepBtree@cord_internal@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ??$AddData@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$AllocateBackingArray@$07V?$allocator@D@__Cr@std@@@container_internal@absl@@YAPEAXPEAX_K@Z + ??$Append@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$AppendImpl@AEBVCord@absl@@@Cord@absl@@AEAAXAEBV01@@Z + ??$AppendImpl@VCord@absl@@@Cord@absl@@AEAAX$$QEAV01@@Z + ??$Base64EscapeInternal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@strings_internal@absl@@YAXPEBE_KPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_NPEBD@Z + ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@A6AXXZ@Z + ??$CallOnceImpl@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@$$QEAP8FlagImpl@flags_internal@1@EAAXXZ$$QEAPEAV671@@Z + ??$CastAndCallFunction@$$CBU?$atomic@_N@__Cr@std@@@Condition@absl@@CA_NPEBV01@@Z + ??$ConsumeConversion@$00@str_format_internal@absl@@YAPEBDPEBDQEBDPEAUUnboundConversion@01@PEAH@Z + ??$ConsumeConversion@$0A@@str_format_internal@absl@@YAPEBDPEBDQEBDPEAUUnboundConversion@01@PEAH@Z + ??$ConvertIntArg@C@str_format_internal@absl@@YA_NCVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@D@str_format_internal@absl@@YA_NDVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@E@str_format_internal@absl@@YA_NEVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@F@str_format_internal@absl@@YA_NFVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@G@str_format_internal@absl@@YA_NGVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@H@str_format_internal@absl@@YA_NHVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@I@str_format_internal@absl@@YA_NIVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@J@str_format_internal@absl@@YA_NJVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@K@str_format_internal@absl@@YA_NKVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@Vint128@absl@@@str_format_internal@absl@@YA_NVint128@1@VFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@Vuint128@absl@@@str_format_internal@absl@@YA_NVuint128@1@VFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_J@str_format_internal@absl@@YA_N_JVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_K@str_format_internal@absl@@YA_N_KVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_W@str_format_internal@absl@@YA_N_WVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXD_K@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXD_K@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBufferWithStructuredProtoField@$00@LogMessage@log_internal@absl@@AEAAXUStructuredProtoField@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBufferWithStructuredProtoField@$0A@@LogMessage@log_internal@absl@@AEAAXUStructuredProtoField@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$DeallocateBackingArray@$07V?$allocator@D@__Cr@std@@@container_internal@absl@@YAXPEAX_KPEAW4ctrl_t@01@11_N@Z + ??$Dispatch@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@F@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@G@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@H@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@I@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@M@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@O@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@PEBD@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@PEB_W@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@UVoidPtr@str_format_internal@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@Vint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@Vuint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$EmplaceBackSlow@AEBQEAVLogSink@absl@@@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAAEAPEAVLogSink@2@AEBQEAV32@@Z + ??$EmplaceBackSlow@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAAEAUPayload@status_internal@2@$$QEAU342@@Z + ??$FindSubstitutions@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@strings_internal@absl@@YA?AV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@AEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@4@@Z + ??$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@01@PEBXPEAX2@Z + ??$Flush@V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@VBufferRawSink@str_format_internal@absl@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@VFILERawSink@str_format_internal@absl@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$GenRuntimeTypeId@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEBVtype_info@@XZ + ??$GenericCompare@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@absl@@YAHAEBVCord@0@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$GenericCompare@HVCord@absl@@@absl@@YAHAEBVCord@0@0_K@Z + ??$GenericCompare@_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@absl@@YA_NAEBVCord@0@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$GenericCompare@_NVCord@absl@@@absl@@YA_NAEBVCord@0@0_K@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$00$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$03$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$07$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$0A@$0A@@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$0BA@$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$InvokeObject@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z + ??$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z + ??$MakeCheckOpString@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0PEBD@Z + ??$MakeCheckOpString@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PEBD@Z + ??$MakeCheckOpString@DD@log_internal@absl@@YAPEBDDDPEBD@Z + ??$MakeCheckOpString@EE@log_internal@absl@@YAPEBDEEPEBD@Z + ??$MakeCheckOpString@MM@log_internal@absl@@YAPEBDMMPEBD@Z + ??$MakeCheckOpString@NN@log_internal@absl@@YAPEBDNNPEBD@Z + ??$MakeCheckOpString@PEBCPEBC@log_internal@absl@@YAPEBDPEBC0PEBD@Z + ??$MakeCheckOpString@PEBDPEBD@log_internal@absl@@YAPEBDPEBD00@Z + ??$MakeCheckOpString@PEBEPEBE@log_internal@absl@@YAPEBDPEBE0PEBD@Z + ??$MakeCheckOpString@PEBXPEBX@log_internal@absl@@YAPEBDPEBX0PEBD@Z + ??$MakeCheckOpString@_J_J@log_internal@absl@@YAPEBD_J0PEBD@Z + ??$MakeCheckOpString@_K_K@log_internal@absl@@YAPEBD_K0PEBD@Z + ??$MakeCheckOpString@_N_N@log_internal@absl@@YAPEBD_N0PEBD@Z + ??$Merge@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z + ??$Merge@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z + ??$NewLeaf@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$NewLeaf@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$ParseFloat@$09@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z + ??$ParseFloat@$0BA@@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z + ??$ParseFormatString@UParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@@str_format_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UParsedFormatConsumer@ParsedFormatBase@01@@Z + ??$PopDead@_J_K_K_KG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AEAAPEAUHashtablezInfo@container_internal@2@_J_K11G@Z + ??$Prepend@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$Register@AEB_JAEA_KAEA_KAEA_KAEAG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAAPEAUHashtablezInfo@container_internal@2@AEB_JAEA_K11AEAG@Z + ??$SNPrintF@DHHH@absl@@YAHPEAD_KAEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@str_format_internal@0@AEBDAEBH44@Z + ??$STLStringResizeUninitializedAmortized@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ??$SharedCompareImpl@VCord@absl@@@absl@@YAHAEBVCord@0@0@Z + ??$StrCat@PEBD@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBQEBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY02D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY02$$CBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY03D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY03$$CBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0BO@DV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY0BO@$$CBD1@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0LD@D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY0LD@$$CBD@Z + ??$StrCat@_K@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z + ??$TransferNRelocatable@$0BI@@container_internal@absl@@YAXPEAX00_K@Z + ??$TryFindNewIndexWithoutProbing@X@container_internal@absl@@YA_K_K00PEAW4ctrl_t@01@0@Z + ??$TypeErasedApplyToSlotFn@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@YA_KPEBXPEAX_K@Z + ??$UnparseFloatingPointVal@M@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@M@Z + ??$UnparseFloatingPointVal@N@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z + ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z + ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z + ??$__call_func@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@CAXPEBT__policy_storage@123@AEAVCommandLineFlag@absl@@@Z + ??$__construct_at_end@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAXV?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@0_K@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$00@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$01@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$02@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$0A@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__do_rehash@$00@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAX_K@Z + ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z + ??$__emplace_back_slow_path@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV612@AEA_K@Z + ??$__emplace_back_slow_path@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEAVCommandLineFlag@absl@@AEBQEAV34@@Z + ??$__emplace_back_slow_path@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV345@@Z + ??$__emplace_back_slow_path@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEAVLogSink@absl@@AEBQEAV34@@Z + ??$__emplace_back_slow_path@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEBVCommandLineFlag@absl@@AEBQEBV34@@Z + ??$__emplace_back_slow_path@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV345@@Z + ??$__emplace_back_slow_path@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEBU3456@@Z + ??$__emplace_back_slow_path@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@AEBU34@@Z + ??$__emplace_back_slow_path@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAPEBVCommandLineFlag@absl@@$$QEAPEBV34@@Z + ??$__emplace_back_slow_path@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU3456@@Z + ??$__emplace_back_slow_path@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAAPEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QEAV312@@Z + ??$__emplace_back_slow_path@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@$$QEAW4Source@34@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$__for_each_segment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@23@@__Cr@std@@YAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@01@@Z + ??$__if_likely_else@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@56@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@234@QEAAAEAU56@01@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@QEAAAEAUUnrecognizedFlag@absl@@$$QEAW4Source@45@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@301@QEAAAEAU45@12@Z@@Z + ??$__insert_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@1_J@Z + ??$__invoke@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@__Cr@std@@YAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@6@@Z + ??$construct_at@UPayload@status_internal@absl@@U123@PEAU123@@__Cr@std@@YAPEAUPayload@status_internal@absl@@PEAU234@$$QEAU234@@Z + ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@12@@Z + ??$emplace@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@12@@Z + ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@HVcrc32c_t@absl@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAH$$QEAVcrc32c_t@6@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$find_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$find_or_prepare_insert@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_or_prepare_insert_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_or_prepare_insert_small@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_small@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@H@strings_internal@absl@@YA?AV012@H@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@I@strings_internal@absl@@YA?AV012@I@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@J@strings_internal@absl@@YA?AV012@J@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@K@strings_internal@absl@@YA?AV012@K@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV012@_J@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV012@0@Z@@Z + ??$resize_and_overwrite@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@56@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@UNoFormatter@23@@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV012@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@1V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@UNoFormatter@45@@Z@@Z + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@XZ + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@_K@Z + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@XZ + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@_K@Z + ??0?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@W4State@012@PEBV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@W4State@012@PEBV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0AlphaNum@absl@@QEAA@H@Z + ??0AlphaNum@absl@@QEAA@PEBD@Z + ??0AlphaNum@absl@@QEAA@_K@Z + ??0Arena@LowLevelAlloc@base_internal@absl@@QEAA@I@Z + ??0Arg@substitute_internal@absl@@QEAA@PEBX@Z + ??0Arg@substitute_internal@absl@@QEAA@UDec@2@@Z + ??0Arg@substitute_internal@absl@@QEAA@UHex@2@@Z + ??0BadStatusOrAccess@absl@@QEAA@$$QEAV01@@Z + ??0BadStatusOrAccess@absl@@QEAA@AEBV01@@Z + ??0BadStatusOrAccess@absl@@QEAA@VStatus@1@@Z + ??0BlockingCounter@absl@@QEAA@H@Z + ??0ByAnyChar@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0ByLength@absl@@QEAA@_J@Z + ??0ByString@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0CRC@crc_internal@absl@@IEAA@XZ + ??0CheckOpMessageBuilder@log_internal@absl@@QEAA@PEBD@Z + ??0ChunkIterator@Cord@absl@@AEAA@PEBV12@@Z + ??0Condition@absl@@QEAA@P6A_NPEAX@Z0@Z + ??0Condition@absl@@QEAA@PEB_N@Z + ??0Cord@absl@@AEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@1@@Z + ??0CordzHandle@cord_internal@absl@@IEAA@_N@Z + ??0CordzInfo@cord_internal@absl@@AEAA@PEAUCordRep@12@PEBV012@W4MethodIdentifier@CordzUpdateTracker@12@_J@Z + ??0CrcCordState@crc_internal@absl@@QEAA@$$QEAV012@@Z + ??0CrcCordState@crc_internal@absl@@QEAA@AEBV012@@Z + ??0CrcCordState@crc_internal@absl@@QEAA@XZ + ??0DynValueDeleter@flags_internal@absl@@QEAA@P6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ??0FlagSaver@absl@@QEAA@XZ + ??0GraphCycles@synchronization_internal@absl@@QEAA@XZ + ??0HashtablezInfo@container_internal@absl@@QEAA@XZ + ??0Impl@time_zone@cctz@time_internal@absl@@AEAA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??0Impl@time_zone@cctz@time_internal@absl@@AEAA@XZ + ??0InlineRep@Cord@absl@@QEAA@AEBV012@@Z + ??0KernelTimeout@synchronization_internal@absl@@QEAA@VDuration@2@@Z + ??0KernelTimeout@synchronization_internal@absl@@QEAA@VTime@2@@Z + ??0LeakCheckDisabler@absl@@QEAA@XZ + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUErrorTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUInfoTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUWarningTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@2@@Z + ??0LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@2@@Z + ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@3@VTime@3@@Z + ??0LogMessageDebugFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH0@Z + ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageQuietlyDebugFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageQuietlyFatal@log_internal@absl@@QEAA@PEBDH0@Z + ??0LogMessageQuietlyFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0MaskedPointer@flags_internal@absl@@QEAA@PEAX_N@Z + ??0OstreamView@LogMessage@log_internal@absl@@QEAA@AEAULogMessageData@123@@Z + ??0ParsedFormatBase@str_format_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_NV?$initializer_list@W4FormatConversionCharSet@absl@@@5@@Z + ??0Randen@random_internal@absl@@QEAA@XZ + ??0ScopedMinLogLevel@log_internal@absl@@QEAA@W4LogSeverityAtLeast@2@@Z + ??0ScopedStderrThreshold@absl@@QEAA@W4LogSeverityAtLeast@1@@Z + ??0Status@absl@@QEAA@W4StatusCode@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0StdcppWaiter@synchronization_internal@absl@@QEAA@XZ + ??0StringifySink@detect_specialization@log_internal@absl@@QEAA@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0TimeZoneLibC@cctz@time_internal@absl@@AEAA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??0Utf8ForCodePoint@debugging_internal@absl@@QEAA@_K@Z + ??0Win32Waiter@synchronization_internal@absl@@QEAA@XZ + ??0int128@absl@@QEAA@M@Z + ??0int128@absl@@QEAA@N@Z + ??0int128@absl@@QEAA@O@Z + ??0uint128@absl@@QEAA@M@Z + ??0uint128@absl@@QEAA@N@Z + ??0uint128@absl@@QEAA@O@Z + ??1?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1CRC@crc_internal@absl@@UEAA@XZ + ??1Cord@absl@@QEAA@XZ + ??1CordzHandle@cord_internal@absl@@MEAA@XZ + ??1CordzInfo@cord_internal@absl@@EEAA@XZ + ??1CrcCordState@crc_internal@absl@@QEAA@XZ + ??1FlagSaver@absl@@QEAA@XZ + ??1FlagStateInterface@flags_internal@absl@@UEAA@XZ + ??1GraphCycles@synchronization_internal@absl@@QEAA@XZ + ??1HashtablezInfo@container_internal@absl@@QEAA@XZ + ??1LeakCheckDisabler@absl@@QEAA@XZ + ??1LogMessage@log_internal@absl@@QEAA@XZ + ??1LogMessageDebugFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageQuietlyDebugFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageQuietlyFatal@log_internal@absl@@QEAA@XZ + ??1Mutex@absl@@QEAA@XZ + ??1Notification@absl@@QEAA@XZ + ??1OstreamView@LogMessage@log_internal@absl@@UEAA@XZ + ??1ScopedMinLogLevel@log_internal@absl@@QEAA@XZ + ??1ScopedStderrThreshold@absl@@QEAA@XZ + ??1SeedGenException@absl@@UEAA@XZ + ??1TimeZoneIf@cctz@time_internal@absl@@UEAA@XZ + ??1ZoneInfoSource@cctz@time_internal@absl@@UEAA@XZ + ??4BadStatusOrAccess@absl@@QEAAAEAV01@$$QEAV01@@Z + ??4BadStatusOrAccess@absl@@QEAAAEAV01@AEBV01@@Z + ??4Cord@absl@@QEAAAEAV01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??4CrcCordState@crc_internal@absl@@QEAAAEAV012@$$QEAV012@@Z + ??4CrcCordState@crc_internal@absl@@QEAAAEAV012@AEBV012@@Z + ??4FlagsUsageConfig@absl@@QEAAAEAU01@AEBU01@@Z + ??4InlineData@cord_internal@absl@@QEAAAEAV012@AEBV012@@Z + ??4InlineRep@Cord@absl@@QEAAAEAV012@$$QEAV012@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@AEBV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@P6AAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV345@@Z@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@P6AAEAVios_base@__Cr@std@@AEAV345@@Z@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@_W@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@AEBVCord@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@AEBVStatus@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vint128@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vuint128@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverity@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverityAtLeast@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverityAtMost@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4StatusCode@0@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@W4weekday@0123@@Z + ??6log_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@UUnprintableWrapper@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@01@@Z + ??8StatusRep@status_internal@absl@@QEBA_NAEBV012@@Z + ??8absl@@YA_NAEBVCord@0@0@Z + ??8container_internal@absl@@YA_NAEBViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@0@Z + ??8cord_internal@absl@@YA_NAEBVInlineData@01@0@Z + ??ACord@absl@@QEBAD_K@Z + ??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ??Bint128@absl@@QEBANXZ + ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??Kabsl@@YA?AVint128@0@V10@0@Z + ??Kabsl@@YA?AVuint128@0@V10@0@Z + ??Labsl@@YA?AVint128@0@V10@0@Z + ??Labsl@@YA?AVuint128@0@V10@0@Z + ??R@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@45@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@UNoFormatter@12@@Z@QEBA?A?@@PEAD_K@Z + ??R@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBQEBUCordRep@cord_internal@absl@@@Z@QEBA?A?@@00@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R?$ConvertToContainer@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z + ??R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z + ??RByCivilTime@Transition@cctz@time_internal@absl@@QEBA_NAEBU1234@0@Z + ??RDynValueDeleter@flags_internal@absl@@QEBAXPEAX@Z + ??R__destroy_vector@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ??R__destroy_vector@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXXZ + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z + ??XDuration@absl@@QEAAAEAV01@N@Z + ??XDuration@absl@@QEAAAEAV01@_J@Z + ??YDuration@absl@@QEAAAEAV01@V01@@Z + ??ZDuration@absl@@QEAAAEAV01@V01@@Z + ??_0Duration@absl@@QEAAAEAV01@N@Z + ??_0Duration@absl@@QEAAAEAV01@_J@Z + ??_1Duration@absl@@QEAAAEAV01@V01@@Z + ?AbortedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslFormatFlush@detect_specialization@log_internal@absl@@YAXPEAVStringifySink@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVDuration@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAW4LogSeverity@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAFPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAGPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAIPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAJPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAKPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAMPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEANPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@1@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@45@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVint128@2@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVuint128@2@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_JPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_KPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_NPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LogSeverity@1@@Z + ?AbslUnparseFlag@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@45@@Z + ?AbslUnparseFlag@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@12@@Z + ?Absorb@RandenHwAes@random_internal@absl@@SAXPEBXPEAX@Z + ?Absorb@RandenSlow@random_internal@absl@@SAXPEBXPEAX@Z + ?AddHint@BestHints@flags_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z + ?AddLogSink@log_internal@absl@@YAXPEAVLogSink@2@@Z + ?AddWithCarry@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHI@Z + ?AddWithCarry@?$BigUnsigned@$03@strings_internal@absl@@AEAAXH_K@Z + ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHI@Z + ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXH_K@Z + ?AddressIsReadable@debugging_internal@absl@@YA_NPEBX@Z + ?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AEAA?AV23@_K@Z + ?AdvanceBytesBtree@ChunkIterator@Cord@absl@@AEAAX_K@Z + ?Alloc@LowLevelAlloc@base_internal@absl@@SAPEAX_K@Z + ?AllocWithArena@LowLevelAlloc@base_internal@absl@@SAPEAX_KPEAUArena@123@@Z + ?AlreadyExistsError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AlwaysTrue@Condition@absl@@CA_NPEBV12@@Z + ?Append@Cord@absl@@QEAAX$$QEAV12@@Z + ?Append@Cord@absl@@QEAAXAEBV12@@Z + ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z + ?Append@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@detect_specialization@log_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@detect_specialization@log_internal@absl@@QEAAX_KD@Z + ?Append@StringifySink@strings_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@strings_internal@absl@@QEAAX_KD@Z + ?AppendArray@InlineRep@Cord@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@3@@Z + ?AppendCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$initializer_list@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@5@@Z + ?AppendPrecise@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?AppendSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z + ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?ApplyMask@MaskedPointer@flags_internal@absl@@AEAAX_K@Z + ?ApplySubstitutions@strings_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@45@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AsciiStrToLower@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AsciiStrToLower@ascii_internal@absl@@YAXPEADPEBD_K@Z + ?AsciiStrToUpper@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AsciiStrToUpper@ascii_internal@absl@@YAXPEADPEBD_K@Z + ?AssertHeld@Mutex@absl@@QEBAXXZ + ?AssertNotHeld@Mutex@absl@@QEBAXXZ + ?AssertReaderHeld@Mutex@absl@@QEBAXXZ + ?AssertSameContainer@container_internal@absl@@YAXPEBW4ctrl_t@12@0AEBQEBX1PEBE2@Z + ?AssertValidType@FlagImpl@flags_internal@absl@@QEBAXPEBXP6APEBVtype_info@@XZ@Z + ?AssignLargeString@Cord@absl@@AEAAAEAV12@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AssignSlow@InlineRep@Cord@absl@@AEAAXAEBV123@@Z + ?AsyncSignalSafeWriteError@raw_log_internal@absl@@YAXPEBD_K@Z + ?At@TimeZone@absl@@QEBA?AUCivilInfo@12@VTime@2@@Z + ?At@TimeZone@absl@@QEBA?AUTimeInfo@12@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@2@@Z + ?AtLocation@LogMessage@log_internal@absl@@QEAAAEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?AtomicBufferValue@FlagImpl@flags_internal@absl@@AEBAPEAU?$atomic@_K@__Cr@std@@XZ + ?AwaitCommon@Mutex@absl@@AEAA_NAEBVCondition@2@VKernelTimeout@synchronization_internal@2@@Z + ?Base64Escape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?Base64Escape@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?Base64EscapeInternal@strings_internal@absl@@YA_KPEBE_KPEAD1PEBD_N@Z + ?Base64Unescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?BindWithPack@str_format_internal@absl@@YA_NPEBUUnboundConversion@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@PEAVBoundConversion@12@@Z + ?Block@Barrier@absl@@QEAA_NXZ + ?Block@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?BreakTime@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AUabsolute_lookup@time_zone@234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BreakTime@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AUabsolute_lookup@time_zone@234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BytesToHexString@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CPUSupportsRandenHwAes@random_internal@absl@@YA_NXZ + ?CUnescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@1@Z + ?CalculateBase64EscapedLenInternal@strings_internal@absl@@YA_K_K_N@Z + ?CallVoidPtrFunction@Condition@absl@@CA_NPEBV12@@Z + ?CancelledError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?CappedDamerauLevenshteinDistance@strings_internal@absl@@YAEV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0E@Z + ?CatPieces@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$initializer_list@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@5@@Z + ?Ceil@absl@@YA?AVDuration@1@V21@0@Z + ?CheckDefaultValueParsingRoundtrip@FlagImpl@flags_internal@absl@@EEBAXXZ + ?CheckDefaultValueParsingRoundtrip@PrivateHandleAccessor@flags_internal@absl@@SAXAEBVCommandLineFlag@3@@Z + ?CheckInvariants@GraphCycles@synchronization_internal@absl@@QEBA_NXZ + ?CheckMask@MaskedPointer@flags_internal@absl@@AEBA_N_K@Z + ?CheckstrcasecmpfalseImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcasecmptrueImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcmpfalseImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcmptrueImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?Checksum@CrcCordState@crc_internal@absl@@QEBA?AVcrc32c_t@3@XZ + ?CityHash32@hash_internal@absl@@YAIPEBD_K@Z + ?CityHash64@hash_internal@absl@@YA_KPEBD_K@Z + ?CityHash64WithSeed@hash_internal@absl@@YA_KPEBD_K1@Z + ?CityHash64WithSeeds@hash_internal@absl@@YA_KPEBD_K11@Z + ?Clear@Cord@absl@@QEAAXXZ + ?ClearBackingArray@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@PEAX_N3@Z + ?ClearCurrentThreadIdentity@base_internal@absl@@YAXXZ + ?ClearLogBacktraceLocation@absl@@YAXXZ + ?ClearTimeZoneMapTestOnly@Impl@time_zone@cctz@time_internal@absl@@SAXXZ + ?CloneAndUnref@StatusRep@status_internal@absl@@QEBAPEAV123@XZ + ?CombineContiguousImpl@hash_internal@absl@@YA_K_KPEBE0U?$integral_constant@H$07@__Cr@std@@@Z + ?CombineLargeContiguousImplOn32BitLengthGt8@hash_internal@absl@@YA_KPEBE_K1@Z + ?CombineLargeContiguousImplOn64BitLengthGt32@hash_internal@absl@@YA_KPEBE_K1@Z + ?Compare@Cord@absl@@QEBAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?CompareImpl@Cord@absl@@AEBAHAEBV12@@Z + ?CompareSlowPath@Cord@absl@@AEBAHAEBV12@_K1@Z + ?CompareSlowPath@Cord@absl@@AEBAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K1@Z + ?Compute@CrcNonTemporalMemcpyAVXEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?Compute@CrcNonTemporalMemcpyEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?Compute@FallbackCrcMemcpyEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?ConcatCrc32c@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?Consume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z + ?ConsumeBeginTo@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@_K1@Z + ?ConsumeUnboundConversionNoInline@str_format_internal@absl@@YAPEBDPEBD0PEAUUnboundConversion@12@PEAH@Z + ?Contains@Cord@absl@@QEBA_NAEBV12@@Z + ?Contains@Cord@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ConvertBoolArg@str_format_internal@absl@@YA_N_NPEAVFormatSinkImpl@12@@Z + ?ConvertDateTime@absl@@YA?AUTimeConversion@1@_JHHHHHVTimeZone@1@@Z + ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAW4ctrl_t@12@_K@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NMAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NNAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NOAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?Copy@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@AEBV312@V?$FunctionRef@$$A6AXPEAXPEBX@Z@2@@Z + ?CopyCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?CopyInlineToString@InlineData@cord_internal@absl@@QEBAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?CopyPrefix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K_N@Z + ?CopySuffix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z + ?CopyToArrayImpl@Cord@absl@@AEBAXPEAD@Z + ?CopyToArraySlowPath@Cord@absl@@AEBAXPEAD@Z + ?Crash@Helper@internal_statusor@absl@@SAXAEBVStatus@3@@Z + ?Crc32c@CRC@crc_internal@absl@@SAPEAV123@XZ + ?CreateSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@@Z + ?CreateThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ + ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPEAUThreadIdentity@12@XZ + ?CurrentValue@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?DataGuard@FlagImpl@flags_internal@absl@@AEBAAEAVMutex@3@XZ + ?DataLossError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?DeadlineExceededError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?DecodeFrom@ProtoField@log_internal@absl@@QEAA_NPEAV?$Span@$$CBD@3@@Z + ?DecodeRustPunycode@debugging_internal@absl@@YAPEADUDecodeRustPunycodeOptions@12@@Z + ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_JI@Z + ?DecrementCount@BlockingCounter@absl@@QEAA_NXZ + ?DecrementSynchSem@Mutex@absl@@CA_NPEAV12@PEAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z + ?DeduceUsageFlags@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ + ?DefaultStackUnwinder@absl@@YAHPEAPEAXPEAHHHPEBX1@Z + ?DefaultStackUnwinder@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHHPEBX2@Z + ?DefaultValue@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Delete@CordzHandle@cord_internal@absl@@SAXPEAV123@@Z + ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPEAUArena@123@@Z + ?Demangle@debugging_internal@absl@@YA_NPEBDPEAD_K@Z + ?DemangleRustSymbolEncoding@debugging_internal@absl@@YA_NPEBDPEAD_K@Z + ?DemangleString@debugging_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBD@Z + ?Description@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Description@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Destroy@CordRep@cord_internal@absl@@SAXPEAU123@@Z + ?Destroy@CordRepBtree@cord_internal@absl@@SAXPEAV123@@Z + ?Destroy@CordRepCrc@cord_internal@absl@@SAXPEAU123@@Z + ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAXXZ + ?DestroyCordSlow@Cord@absl@@AEAAXXZ + ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z + ?Die@LogMessage@log_internal@absl@@AEAAXXZ + ?DieBecauseNull@log_internal@absl@@YAXPEBDH0@Z + ?Digits10@?$BigUnsigned@$03@strings_internal@absl@@SAHXZ + ?Digits10@?$BigUnsigned@$0FE@@strings_internal@absl@@SAHXZ + ?DoIgnoreLeak@absl@@YAXPEBX@Z + ?Dtor@Mutex@absl@@AEAAXXZ + ?DummyFunction@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@CA?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@CAXPEBDH000@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@CAXPEBDPEBX@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDPEBX_J@Z@base_internal@absl@@CAXPEBDPEBX_J@Z + ?DummyFunction@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@CAXPEBX_J@Z + ?DummyFunction@?$AtomicHook@P6AXXZ@base_internal@absl@@CAXXZ + ?DummyFunction@?$AtomicHook@P6AX_J@Z@base_internal@absl@@CAX_J@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@67@@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_NAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@67@@Z + ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXQEAXQEBQEAXQEAHHH_NP6AXPEBDPEAX@Z5@Z + ?DumpStackTrace@debugging_internal@absl@@YAXHH_NP6AXPEBDPEAX@Z2@Z + ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z + ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z + ?EmptyGeneration@container_internal@absl@@YAPEAEXZ + ?EmptyString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?EnableDebugLog@CondVar@absl@@QEAAXPEBD@Z + ?EnableDebugLog@Mutex@absl@@QEAAXPEBD@Z + ?EnableInvariantDebugging@Mutex@absl@@QEAAXP6AXPEAX@Z0@Z + ?EnableLogPrefix@absl@@YAX_N@Z + ?EnableMutexInvariantDebugging@absl@@YAX_N@Z + ?EnableSymbolizeLogStackTrace@log_internal@absl@@YAX_N@Z + ?Encode32Bit@log_internal@absl@@YA_N_KIPEAV?$Span@D@2@@Z + ?Encode64Bit@log_internal@absl@@YA_N_K0PEAV?$Span@D@2@@Z + ?EncodeBytes@log_internal@absl@@YA_N_KV?$Span@$$CBD@2@PEAV?$Span@D@2@@Z + ?EncodeBytesTruncate@log_internal@absl@@YA_N_KV?$Span@$$CBD@2@PEAV?$Span@D@2@@Z + ?EncodeMessageLength@log_internal@absl@@YAXV?$Span@D@2@PEBV32@@Z + ?EncodeMessageStart@log_internal@absl@@YA?AV?$Span@D@2@_K0PEAV32@@Z + ?EncodeStructuredProtoField@log_internal@absl@@YA_NUStructuredProtoField@12@AEAV?$Span@D@2@@Z + ?EncodeUTF8Char@strings_internal@absl@@YA_KPEAD_U@Z + ?EncodeVarint@log_internal@absl@@YA_N_K0PEAV?$Span@D@2@@Z + ?EncodeWaitCycles@SpinLock@base_internal@absl@@KAI_J0@Z + ?EndsWith@Cord@absl@@QEBA_NAEBV12@@Z + ?EndsWith@Cord@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?EndsWithIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EqualsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EqualsImpl@Cord@absl@@AEBA_NAEBV12@_K@Z + ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z + ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z + ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z + ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z + ?Eval@Condition@absl@@QEBA_NXZ + ?ExitOnDFatal@log_internal@absl@@YA_NXZ + ?ExpectedChecksum@Cord@absl@@QEBA?AV?$optional@I@__Cr@std@@XZ + ?Extend@CRC32@crc_internal@absl@@UEBAXPEAIPEBX_K@Z + ?ExtendByZeroes@CRC32@crc_internal@absl@@UEBAXPEAI_K@Z + ?ExtendByZeroesImpl@CRC32@crc_internal@absl@@CAXPEAI_KQEBI2@Z + ?ExtendCrc32cByZeroes@absl@@YA?AVcrc32c_t@1@V21@_K@Z + ?ExtendCrc32cInternal@crc_internal@absl@@YA?AVcrc32c_t@2@V32@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ExtendTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NXZ + ?ExtractAppendBuffer@CordRepBtree@cord_internal@absl@@SA?AUExtractResult@CordRep@23@PEAV123@_K@Z + ?ExtractFront@CordRepBtree@cord_internal@absl@@CAPEAUCordRep@23@PEAV123@@Z + ?FDivDuration@absl@@YANVDuration@1@0@Z + ?FLAGS_noflagfile@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FLAGS_nofromenv@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FLAGS_notryfromenv@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FLAGS_noundefok@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FNMatch@log_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?FailQuietly@LogMessage@log_internal@absl@@KAXXZ + ?FailWithoutStackTrace@LogMessage@log_internal@absl@@KAXXZ + ?FailedPreconditionError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FailureSignalToString@debugging_internal@absl@@YAPEBDH@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEADHPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEADIPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_JPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_KPEAD@Z + ?Fer@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?Filename@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?FillParentStack@CordzInfo@cord_internal@absl@@CA_KPEBV123@PEAPEAX@Z + ?FillWordTable@CRCImpl@crc_internal@absl@@SAXIIHPEAY0BAA@I@Z + ?FillZeroesTable@CRCImpl@crc_internal@absl@@SAHIPEAY0BAA@I@Z + ?FinalizeEncodingAndFormat@LogMessageData@LogMessage@log_internal@absl@@QEAAXXZ + ?FinalizeRegistry@flags_internal@absl@@YAXXZ + ?Find@ByAnyChar@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByAsciiWhitespace@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByChar@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByLength@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByString@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@Cord@absl@@QEBA?AVCharIterator@12@AEBV12@@Z + ?Find@Cord@absl@@QEBA?AVCharIterator@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindAndReportLeaks@absl@@YA_NXZ + ?FindCommandLineFlag@absl@@YAPEAVCommandLineFlag@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindFlag@FlagRegistry@flags_internal@absl@@QEAAPEAVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindFlatStartPiece@InlineRep@Cord@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?FindImpl@Cord@absl@@AEBA?AVCharIterator@12@V312@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindLongestCommonPrefix@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@0@Z + ?FindLongestCommonSuffix@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@0@Z + ?FindPath@GraphCycles@synchronization_internal@absl@@QEBAHUGraphId@23@0HQEAU423@@Z + ?FiveToTheNth@?$BigUnsigned@$03@strings_internal@absl@@SA?AV123@H@Z + ?FiveToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@SA?AV123@H@Z + ?FixUpStack@internal_stacktrace@absl@@YAXPEAPEAXPEA_KPEAH_KAEA_K@Z + ?FixedOffsetFromName@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FixedOffsetToAbbr@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FixedOffsetToName@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FlagHelp@flags_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCommandLineFlag@2@W4HelpFormat@12@@Z + ?FlagsHelp@flags_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@W4HelpFormat@12@1@Z + ?FlagsToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4Flags@12@@Z + ?FlatOverhead@CordTestAccess@strings_internal@absl@@SA_KXZ + ?FlatTagToLength@CordTestAccess@strings_internal@absl@@SA_KE@Z + ?FlattenSlowPath@Cord@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Floor@absl@@YA?AVDuration@1@V21@0@Z + ?Flush@LogMessage@log_internal@absl@@QEAAXXZ + ?Flush@LogSink@absl@@UEAAXXZ + ?FlushLogSinks@log_internal@absl@@YAXXZ + ?ForEachChunkAux@Cord@absl@@CAXPEAUCordRep@cord_internal@2@V?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z@2@@Z + ?ForEachFlag@flags_internal@absl@@YAXV?$function@$$A6AXAEAVCommandLineFlag@absl@@@Z@__Cr@std@@@Z + ?ForEachPayload@StatusRep@status_internal@absl@@QEBAXV?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCord@absl@@@Z@3@@Z + ?ForVar2@CheckOpMessageBuilder@log_internal@absl@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?ForcedTrySample@container_internal@absl@@YA?AVHashtablezInfoHandle@12@_K00G@Z + ?ForgetDeadlockInfo@Mutex@absl@@QEAAXXZ + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatConversionCharToConvInt@str_format_internal@absl@@YA_KD@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0BPPPL@@12@DVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0BPPPL@@12@_WVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAA@@12@UVoidPtr@12@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@$$TVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@PEBDVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@PEB_WVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@AEBV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@MVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@NVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@OVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@CVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@EVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@FVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@GVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@HVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@IVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@JVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@KVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@Vint128@2@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@Vuint128@2@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@_JVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@_KVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatDuration@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?FormatLogMessage@log_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LogSeverity@2@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@2@VDuration@2@IV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@HW4PrefixFormat@12@3@Z + ?FormatLogPrefix@log_internal@absl@@YA_KW4LogSeverity@2@VTime@2@IV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4PrefixFormat@12@AEAV?$Span@D@2@@Z + ?FormatPack@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@VTime@1@VTimeZone@1@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@VTimeZone@1@@Z + ?FormatUntyped@str_format_internal@absl@@YA_NVFormatRawSinkImpl@12@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?FprintF@str_format_internal@absl@@YAHPEAU_iobuf@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?Free@LowLevelAlloc@base_internal@absl@@SAXPEAX@Z + ?Frequency@UnscaledCycleClock@base_internal@absl@@CANXZ + ?FromChrono@absl@@YA?AVTime@1@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?FromTM@absl@@YA?AVTime@1@AEBUtm@@VTimeZone@1@@Z + ?FromUDate@absl@@YA?AVTime@1@N@Z + ?FromUniversal@absl@@YA?AVTime@1@_J@Z + ?Generate@RandenHwAes@random_internal@absl@@SAXPEBXPEAX@Z + ?Generate@RandenSlow@random_internal@absl@@SAXPEBXPEAX@Z + ?Get@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@AEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ + ?GetAllFlags@absl@@YA?AV?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@1@XZ + ?GetAndroidNativeTag@log_internal@absl@@YAPEBDXZ + ?GetAppendBuffer@CordRepBtree@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z + ?GetAppendBufferSlow@CordRepBtree@cord_internal@absl@@AEAA?AV?$Span@D@3@_K@Z + ?GetAppendBufferSlowPath@Cord@absl@@AEAA?AVCordBuffer@2@_K00@Z + ?GetArchSpecificEngines@CrcMemcpy@crc_internal@absl@@CA?AUArchSpecificEngines@123@XZ + ?GetCachedTID@base_internal@absl@@YAIXZ + ?GetCharacter@CordRepBtree@cord_internal@absl@@QEBAD_K@Z + ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ + ?GetCpuType@crc_internal@absl@@YA?AW4CpuType@12@XZ + ?GetCurrentTimeNanos@absl@@YA_JXZ + ?GetDebugStackTraceHook@debugging_internal@absl@@YAP6AXQEBQEAXHP6AXPEBDPEAX@Z2@ZXZ + ?GetEntropyFromRandenPool@random_internal@absl@@YAXPEAX_K@Z + ?GetEstimatedFairShareMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetEstimatedMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetFlagsHelpFormat@flags_internal@absl@@YA?AW4HelpFormat@12@XZ + ?GetFlagsHelpMatchSubstr@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?GetFlagsHelpMode@flags_internal@absl@@YA?AW4HelpMode@12@XZ + ?GetFlatAux@Cord@absl@@CA_NPEAUCordRep@cord_internal@2@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?GetHashtablezMaxSamples@container_internal@absl@@YA_KXZ + ?GetHashtablezSampleParameter@container_internal@absl@@YAHXZ + ?GetId@GraphCycles@synchronization_internal@absl@@QEAA?AUGraphId@23@PEAX@Z + ?GetKeys@RandenHwAes@random_internal@absl@@SAPEBXXZ + ?GetKeys@RandenSlow@random_internal@absl@@SAPEBXXZ + ?GetMisspellingHints@flags_internal@absl@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?GetMorePreciseMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PEBV123@@Z + ?GetParentStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ + ?GetPayload@StatusRep@status_internal@absl@@QEBA?AV?$optional@VCord@absl@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@@Z + ?GetProgramCounter@debugging_internal@absl@@YAPEAXQEAX@Z + ?GetRefForEmptyClass@container_internal@absl@@YAPEAXAEAVCommonFields@12@@Z + ?GetSaltMaterial@random_internal@absl@@YA?AV?$optional@I@__Cr@std@@XZ + ?GetSkipCount@ExponentialBiased@profiling_internal@absl@@QEAA_J_J@Z + ?GetStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ + ?GetStackFrames@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHH@Z + ?GetStackFramesWithContext@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHHPEBX2@Z + ?GetStackTrace@GraphCycles@synchronization_internal@absl@@QEAAHUGraphId@23@PEAPEAPEAX@Z + ?GetStackTrace@absl@@YAHPEAPEAXHH@Z + ?GetStackTraceWithContext@absl@@YAHPEAPEAXHHPEBXPEAH@Z + ?GetStatusPayloadPrinter@status_internal@absl@@YAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@AEBVCord@2@@ZXZ + ?GetStride@ExponentialBiased@profiling_internal@absl@@QEAA_J_J@Z + ?GetTID@base_internal@absl@@YAIXZ + ?GetTestEngine@CrcMemcpy@crc_internal@absl@@SA?AV?$unique_ptr@VCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@HH@Z + ?GetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAPEAU?$atomic@H@__Cr@std@@XZ + ?GetTransitionType@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NH_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAE@Z + ?GetUsageConfig@flags_internal@absl@@YA?AUFlagsUsageConfig@2@XZ + ?GetWord@?$BigUnsigned@$03@strings_internal@absl@@QEBAIH@Z + ?GetWord@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAIH@Z + ?GlobalHashtablezSampler@container_internal@absl@@YAAEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?GlobalList@CordzInfo@cord_internal@absl@@CAPEAUList@123@XZ + ?GlobalRegistry@FlagRegistry@flags_internal@absl@@SAAEAV123@XZ + ?GuaranteedEqual@Condition@absl@@SA_NPEBV12@0@Z + ?HandleInvalidStatusCtorArg@Helper@internal_statusor@absl@@SAXPEAVStatus@3@@Z + ?HandleUsageFlags@flags_internal@absl@@YA?AW4HelpMode@12@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@@Z + ?HasBeenNotifiedInternal@Notification@absl@@CA_NPEBU?$atomic@_N@__Cr@std@@@Z + ?HasBeenRead@MaskedPointer@flags_internal@absl@@QEBA_NXZ + ?HasEdge@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z + ?HasNode@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@@Z + ?HasRandenHwAesImplementation@random_internal@absl@@YA_NXZ + ?HaveLeakSanitizer@absl@@YA_NXZ + ?Head@CordzInfo@cord_internal@absl@@SAPEAV123@AEBVCordzSnapshot@23@@Z + ?Help@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?HexStringToBytes@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?IDivDuration@absl@@YA_JVDuration@1@0PEAV21@@Z + ?In@Time@absl@@QEBA?AUBreakdown@12@VTimeZone@2@@Z + ?InMillisecondsFromNow@KernelTimeout@synchronization_internal@absl@@QEBAKXZ + ?InNanosecondsFromNow@KernelTimeout@synchronization_internal@absl@@AEBA_JXZ + ?IncrementSynchSem@Mutex@absl@@CAXPEAV12@PEAUPerThreadSynch@base_internal@2@@Z + ?Init@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCordRepBtree@23@@Z + ?Init@FlagImpl@flags_internal@absl@@AEAAXXZ + ?InitDiscreteDistribution@random_internal@absl@@YA?AV?$vector@U?$pair@N_K@__Cr@std@@V?$allocator@U?$pair@N_K@__Cr@std@@@23@@__Cr@std@@PEAV?$vector@NV?$allocator@N@__Cr@std@@@45@@Z + ?InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXAEBV123@@Z + ?InitSigSafeArena@base_internal@absl@@YAXXZ + ?InitTables@CRC32@crc_internal@absl@@UEAAXXZ + ?InitTree@ChunkIterator@Cord@absl@@AEAAXPEAUCordRep@cord_internal@3@@Z + ?InitWhat@BadStatusOrAccess@absl@@AEBAXXZ + ?Initialize@ExponentialBiased@profiling_internal@absl@@AEAAXXZ + ?InitializeCordRepExternal@cord_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAUCordRepExternal@12@@Z + ?InitializeData@Storage@?$FixedArray@D$0?0V?$allocator@D@__Cr@std@@@absl@@AEAAPEADXZ + ?InitializeEncodingAndFormat@LogMessageData@LogMessage@log_internal@absl@@QEAAXXZ + ?InitializeLog@absl@@YAXXZ + ?InitializeSymbolizer@absl@@YAXPEBD@Z + ?InsertEdge@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@0@Z + ?InstallFailureSignalHandler@absl@@YAXAEBUFailureSignalHandlerOptions@1@@Z + ?InternalAttemptToUseMutexInFatalSignalHandler@Mutex@absl@@SAXXZ + ?InternalCondVarPoke@StdcppWaiter@synchronization_internal@absl@@AEAAXXZ + ?InternalCondVarPoke@Win32Waiter@synchronization_internal@absl@@AEAAXXZ + ?InternalError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?InvalidArgumentError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?InvokeCallback@FlagImpl@flags_internal@absl@@QEBAXXZ + ?IsAborted@absl@@YA_NAEBVStatus@1@@Z + ?IsAlreadyExists@absl@@YA_NAEBVStatus@1@@Z + ?IsCancelled@absl@@YA_NAEBVStatus@1@@Z + ?IsCordBtreeExhaustiveValidationEnabled@cord_internal@absl@@YA_NXZ + ?IsDataLoss@absl@@YA_NAEBVStatus@1@@Z + ?IsDeadlineExceeded@absl@@YA_NAEBVStatus@1@@Z + ?IsFailedPrecondition@absl@@YA_NAEBVStatus@1@@Z + ?IsFatal@LogMessage@log_internal@absl@@AEBA_NXZ + ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_NPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_N_K0PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?IsHashtablezEnabled@container_internal@absl@@YA_NXZ + ?IsInitialized@log_internal@absl@@YA_NXZ + ?IsInternal@absl@@YA_NAEBVStatus@1@@Z + ?IsInvalidArgument@absl@@YA_NAEBVStatus@1@@Z + ?IsNotFound@absl@@YA_NAEBVStatus@1@@Z + ?IsOutOfRange@absl@@YA_NAEBVStatus@1@@Z + ?IsPermissionDenied@absl@@YA_NAEBVStatus@1@@Z + ?IsReachable@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z + ?IsResourceExhausted@absl@@YA_NAEBVStatus@1@@Z + ?IsRetired@CommandLineFlag@absl@@UEBA_NXZ + ?IsSpecifiedOnCommandLine@FlagImpl@flags_internal@absl@@EEBA_NXZ + ?IsSpecifiedOnCommandLine@PrivateHandleAccessor@flags_internal@absl@@SA_NAEBVCommandLineFlag@3@@Z + ?IsUnauthenticated@absl@@YA_NAEBVStatus@1@@Z + ?IsUnavailable@absl@@YA_NAEBVStatus@1@@Z + ?IsUnimplemented@absl@@YA_NAEBVStatus@1@@Z + ?IsUnknown@absl@@YA_NAEBVStatus@1@@Z + ?IsUnprotectedReadCandidate@MaskedPointer@flags_internal@absl@@QEBA_NXZ + ?IsValid@CordRepBtree@cord_internal@absl@@SA_NPEBV123@_N@Z + ?IterateOverFullSlots@container_internal@absl@@YAXAEBVCommonFields@12@_KV?$FunctionRef@$$A6AXPEBW4ctrl_t@container_internal@absl@@PEAX@Z@2@@Z + ?KeyFunction@LogSink@absl@@EEBAXXZ + ?LeakCheckerIsActive@absl@@YA_NXZ + ?LengthModToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LengthMod@2@@Z + ?LengthToTag@CordTestAccess@strings_internal@absl@@SAE_K@Z + ?Load@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?Load@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NPEAVZoneInfoSource@234@@Z + ?LoadTimeZone@Impl@time_zone@cctz@time_internal@absl@@SA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV2345@@Z + ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransition@234@@Z + ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransitionType@234@@Z + ?Lock@CordzInfo@cord_internal@absl@@QEAAXW4MethodIdentifier@CordzUpdateTracker@23@@Z + ?LockSlow@Mutex@absl@@AEAAXPEBUMuHowS@2@PEBVCondition@2@H@Z + ?LockSlowLoop@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@H@Z + ?LockSlowWithDeadline@Mutex@absl@@AEAA_NPEBUMuHowS@2@PEBVCondition@2@VKernelTimeout@synchronization_internal@2@H@Z + ?LockWhenCommon@Mutex@absl@@AEAA_NAEBVCondition@2@VKernelTimeout@synchronization_internal@2@_N@Z + ?LogBacktraceIfNeeded@LogMessage@log_internal@absl@@AEAAXXZ + ?LogFatalNodeType@cord_internal@absl@@YAXPEAUCordRep@12@@Z + ?LogToSinks@log_internal@absl@@YAXAEBVLogEntry@2@V?$Span@PEAVLogSink@absl@@@2@_N@Z + ?Make@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?Make@TimeZoneInfo@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?Make@TimeZoneLibC@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?MakeAbsNanos@KernelTimeout@synchronization_internal@absl@@QEBA_JXZ + ?MakeAbsTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ + ?MakeCheckFailString@status_internal@absl@@YAPEBDPEBVStatus@2@PEBD@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@C@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEBX@Z + ?MakeFlatWithExtraCapacity@InlineRep@Cord@absl@@QEAAPEAUCordRepFlat@cord_internal@3@_K@Z + ?MakeInitValue@FlagImpl@flags_internal@absl@@AEBA?AV?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@XZ + ?MakeRelativeTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ + ?MakeSeedSeq@absl@@YA?AV?$SaltedSeedSeq@Vseed_seq@__Cr@std@@@random_internal@1@XZ + ?MakeTime@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?MakeTime@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?MapToLocalCode@status_internal@absl@@YA?AW4StatusCode@2@H@Z + ?MarkAsRead@MaskedPointer@flags_internal@absl@@QEAAXXZ + ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@AEBA_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z + ?MaxFlatLength@CordTestAccess@strings_internal@absl@@SA_KXZ + ?MaxFramesInLogStackTrace@log_internal@absl@@YAHXZ + ?MaybeBecomeIdle@WaiterBase@synchronization_internal@absl@@KAXXZ + ?MaybeExit@flags_internal@absl@@YAXW4HelpMode@12@@Z + ?MaybeGetCrcCordState@Cord@absl@@AEBAPEBVCrcCordState@crc_internal@2@XZ + ?MaybeTrackCordImpl@CordzInfo@cord_internal@absl@@CAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?MemcpyCrc32c@absl@@YA?AVcrc32c_t@1@PEAXPEBX_KV21@@Z + ?MergeTrees@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@0@Z + ?MinLogLevel@absl@@YA?AW4LogSeverityAtLeast@1@XZ + ?MixIntoSeedMaterial@random_internal@absl@@YAXV?$Span@$$CBI@2@V?$Span@I@2@@Z + ?ModificationCount@FlagImpl@flags_internal@absl@@AEBA_JXZ + ?MovedFromString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBI@Z + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QEAAXI@Z + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QEAAX_K@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHPEBI@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXI@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAX_K@Z + ?MultiplyByFiveToTheNth@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?MultiplyByFiveToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?MultiplyByTenToTheNth@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?MultiplyByTenToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?MultiplyStep@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBIHH@Z + ?MultiplyStep@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHPEBIHH@Z + ?MutexDelay@synchronization_internal@absl@@YAHHH@Z + ?Name@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?New@CordRepCrc@cord_internal@absl@@SAPEAU123@PEAUCordRep@23@VCrcCordState@crc_internal@3@@Z + ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@I@Z + ?NewCRC32AcceleratedX86ARMCombinedAll@crc_internal@absl@@YA?AV?$vector@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@XZ + ?NewInternal@CRCImpl@crc_internal@absl@@SAPEAV123@XZ + ?NewString@CheckOpMessageBuilder@log_internal@absl@@QEAAPEBDXZ + ?Next@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z + ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z + ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?NextUp@CordRepBtreeNavigator@cord_internal@absl@@AEAAPEAUCordRep@23@XZ + ?NoPrefix@LogMessage@log_internal@absl@@QEAAAEAV123@XZ + ?NominalCPUFrequency@base_internal@absl@@YANXZ + ?Normalize@CrcCordState@crc_internal@absl@@QEAAXXZ + ?NormalizedPrefixCrcAtNthChunk@CrcCordState@crc_internal@absl@@QEBA?AUPrefixCrc@123@_K@Z + ?NotFoundError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Notify@Notification@absl@@QEAAXXZ + ?Now@CycleClock@base_internal@absl@@SA_JXZ + ?Now@absl@@YA?AVTime@1@XZ + ?NumCPUs@base_internal@absl@@YAHXZ + ?NumLeakedFlagValues@flags_internal@absl@@YA_KXZ + ?OnVLogVerbosityUpdate@log_internal@absl@@YAXV?$function@$$A6AXXZ@__Cr@std@@@Z + ?OneTimeInitThreadIdentity@synchronization_internal@absl@@YAXPEAUThreadIdentity@base_internal@2@@Z + ?OneWordValue@FlagImpl@flags_internal@absl@@AEBAAEAU?$atomic@_J@__Cr@std@@XZ + ?OutOfRangeError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ParseAbseilFlagsOnly@absl@@YAXHQEAPEADAEAV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@AEAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@34@@Z + ?ParseAbseilFlagsOnlyImpl@flags_internal@absl@@YA?AW4HelpMode@12@HQEAPEADAEAV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@AEAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@56@W4UsageFlagsAction@12@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCommandLine@absl@@YA?AV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@HQEAPEAD@Z + ?ParseCommandLineImpl@flags_internal@absl@@YA?AV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@HQEAPEADW4UsageFlagsAction@12@W4OnUndefinedFlag@12@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@45@@Z + ?ParseDigits@str_format_internal@absl@@YAHAEADAEAPEBDQEBD@Z + ?ParseDuration@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVDuration@1@@Z + ?ParseFlag@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVDuration@1@PEAV234@@Z + ?ParseFlag@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVTime@1@PEAV234@@Z + ?ParseFrom@CommandLineFlag@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?ParseFrom@FlagImpl@flags_internal@absl@@EEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4FlagSettingMode@23@W4ValueSource@23@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?ParseFrom@PrivateHandleAccessor@flags_internal@absl@@SA_NAEAVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4FlagSettingMode@23@W4ValueSource@23@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParsePosixSpec@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAUPosixTimeZone@123@@Z + ?ParseTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?ParseTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0VTimeZone@1@PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?PermissionDeniedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Poison@CrcCordState@crc_internal@absl@@QEAAXXZ + ?Poke@StdcppWaiter@synchronization_internal@absl@@QEAAXXZ + ?Poke@Win32Waiter@synchronization_internal@absl@@QEAAXXZ + ?Post@StdcppWaiter@synchronization_internal@absl@@QEAAXXZ + ?Post@Win32Waiter@synchronization_internal@absl@@QEAAXXZ + ?PrepareForSampling@HashtablezInfo@container_internal@absl@@QEAAX_J_K11G@Z + ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@@Z + ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareInsertSmallNonSoo@container_internal@absl@@YA?AU?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@AEAVCommonFields@12@AEBUPolicyFunctions@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareToDie@LogMessage@log_internal@absl@@AEAAXXZ + ?PrepareToModify@Status@absl@@CAPEAVStatusRep@status_internal@2@_K@Z + ?Prepend@Cord@absl@@QEAAXAEBV12@@Z + ?Prepend@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?PrependArray@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?PrependPrecise@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?PrependSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z + ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependVModule@log_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?PrevTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z + ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?Print@Streamable@str_format_internal@absl@@QEBAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@@Z + ?PrintTo@absl@@YAXAEBVLogEntry@1@PEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ProgramUsageMessage@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Ptr@GraphCycles@synchronization_internal@absl@@QEAAPEAXUGraphId@23@@Z + ?PtrStorage@FlagImpl@flags_internal@absl@@AEBAAEAU?$atomic@VMaskedPointer@flags_internal@absl@@@__Cr@std@@XZ + ?PutPaddedString@FormatSinkImpl@str_format_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HH_N@Z + ?PutTwoDigits@numbers_internal@absl@@YAXIPEAD@Z + ?RawEnableLogPrefix@log_internal@absl@@YAX_N@Z + ?RawLog@raw_log_internal@absl@@YAXW4LogSeverity@2@PEBDH1ZZ + ?RawLoggingFullySupported@raw_log_internal@absl@@YA_NXZ + ?RawSetMinLogLevel@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z + ?RawSetStderrThreshold@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z + ?Read@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUReadResult@123@_K0@Z + ?Read@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K0AEAPEAUCordRep@23@@Z + ?Read@FlagImpl@flags_internal@absl@@UEBAXPEAX@Z + ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AEAAHPEBD0H@Z + ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAHPEBD0H@Z + ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z + ?ReadFloatMantissa@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z + ?ReadOneBool@FlagImpl@flags_internal@absl@@QEBA_NXZ + ?ReadOneWord@FlagImpl@flags_internal@absl@@QEBA_JXZ + ?ReadSeedMaterialFromOSEntropy@random_internal@absl@@YA_NV?$Span@I@2@@Z + ?ReadSequenceLockedData@FlagImpl@flags_internal@absl@@AEBAXPEAX@Z + ?ReaderTryLockSlow@Mutex@absl@@AEAA_NXZ + ?Rebuild@CordRepBtree@cord_internal@absl@@CAXPEAPEAV123@PEAV123@_N@Z + ?Rebuild@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@@Z + ?RecordClearedReservationSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?RecordEraseSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?RecordInsertSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K1@Z + ?RecordRehashSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K@Z + ?RecordReservationSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K@Z + ?RecordStorageChangedSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K1@Z + ?RefSharedEmptyRep@CrcCordState@crc_internal@absl@@CAPEAURefcountedRep@123@XZ + ?Register@CycleClockSource@base_internal@absl@@CAXP6A_JXZ@Z + ?RegisterAbortHook@raw_log_internal@absl@@YAXP6AXPEBDH000@Z@Z + ?RegisterAndInitialize@log_internal@absl@@YAHPEAVVLogSite@12@@Z + ?RegisterCommandLineFlag@flags_internal@absl@@YA_NAEAVCommandLineFlag@2@PEBD@Z + ?RegisterCondVarTracer@absl@@YAXP6AXPEBDPEBX@Z@Z + ?RegisterDebugStackTraceHook@debugging_internal@absl@@YAXP6AXQEBQEAXHP6AXPEBDPEAX@Z2@Z@Z + ?RegisterFlag@FlagRegistry@flags_internal@absl@@QEAAXAEAVCommandLineFlag@3@PEBD@Z + ?RegisterInternalLogFunction@raw_log_internal@absl@@YAXP6AXW4LogSeverity@2@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@Z + ?RegisterLivePointers@absl@@YAXPEBX_K@Z + ?RegisterLogFilterAndPrefixHook@raw_log_internal@absl@@YAXP6A_NW4LogSeverity@2@PEBDHPEAPEADPEAH@Z@Z + ?RegisterMutexProfiler@absl@@YAXP6AX_J@Z@Z + ?RegisterMutexTracer@absl@@YAXP6AXPEBDPEBX_J@Z@Z + ?RegisterSpinLockProfiler@base_internal@absl@@YAXP6AXPEBX_J@Z@Z + ?Rehash@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?Release@ReleasableMutexLock@absl@@QEAAXXZ + ?Remove@CondVar@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?RemoveCrc32cPrefix@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?RemoveCrc32cSuffix@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?RemoveEdge@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@0@Z + ?RemoveExtraAsciiWhitespace@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?RemoveLogSink@log_internal@absl@@YAXPEAVLogSink@2@@Z + ?RemoveNode@GraphCycles@synchronization_internal@absl@@QEAAXPEAX@Z + ?RemovePrefix@Cord@absl@@QEAAX_K@Z + ?RemoveSuffix@Cord@absl@@QEAAX_K@Z + ?RemoveSuffix@CordRepBtree@cord_internal@absl@@SAPEAUCordRep@23@PEAV123@_K@Z + ?ReportUnrecognizedFlags@absl@@YAXAEBV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@@Z + ?ReportUsageError@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_N@Z + ?ReserveEmptyNonAllocatedTableToFitBucketCount@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?ReserveTableToFitNewSize@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?ResetToBuiltinUTC@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z + ?ResetToEmpty@InlineRep@Cord@absl@@AEAAXXZ + ?ResizeAllocatedTableWithSeedChange@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?ResourceExhaustedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Restore@FlagState@flags_internal@absl@@EEHAAXXZ + ?RestoreState@FlagImpl@flags_internal@absl@@AEAA_NAEBVFlagState@23@@Z + ?Retire@flags_internal@absl@@YAXPEBDPEBXPEAE@Z + ?ReverseConsume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z + ?SafeToDelete@CordzHandle@cord_internal@absl@@QEBA_NXZ + ?SampleSlow@container_internal@absl@@YAPEAUHashtablezInfo@12@AEAUSamplingState@12@_K11G@Z + ?SaveState@FlagImpl@flags_internal@absl@@EEAA?AV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?SaveState@PrivateHandleAccessor@flags_internal@absl@@SA?AV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAVCommandLineFlag@3@@Z + ?Scramble@CRC32@crc_internal@absl@@UEBAXPEAI@Z + ?Seek@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?SendToLog@LogMessage@log_internal@absl@@AEAAXXZ + ?Set@MaskedPointer@flags_internal@absl@@QEAAXP6APEAXW4FlagOp@23@PEBXPEAX2@Z1_N@Z + ?SetAndroidNativeTag@absl@@YAXPEBD@Z + ?SetCallback@FlagImpl@flags_internal@absl@@QEAAXQ6AXXZ@Z + ?SetCordBtreeExhaustiveValidation@cord_internal@absl@@YAX_N@Z + ?SetCrcCordState@Cord@absl@@AEAAXVCrcCordState@crc_internal@2@@Z + ?SetCurrentThreadIdentity@base_internal@absl@@YAXPEAUThreadIdentity@12@P6AXPEAX@Z@Z + ?SetExitOnDFatal@log_internal@absl@@YAX_N@Z + ?SetExpectedChecksum@Cord@absl@@QEAAXI@Z + ?SetFailQuietly@LogMessage@log_internal@absl@@IEAAXXZ + ?SetFlagsHelpFormat@flags_internal@absl@@YAXW4HelpFormat@12@@Z + ?SetFlagsHelpMatchSubstr@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetFlagsHelpMode@flags_internal@absl@@YAXW4HelpMode@12@@Z + ?SetFlagsUsageConfig@absl@@YAXUFlagsUsageConfig@1@@Z + ?SetHashtablezConfigListener@container_internal@absl@@YAXP6AXXZ@Z + ?SetHashtablezEnabled@container_internal@absl@@YAX_N@Z + ?SetHashtablezEnabledInternal@container_internal@absl@@YAX_N@Z + ?SetHashtablezMaxSamples@container_internal@absl@@YAX_K@Z + ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAX_K@Z + ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z + ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z + ?SetInitialized@log_internal@absl@@YAXXZ + ?SetLogBacktraceLocation@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?SetLoggingGlobalsListener@log_internal@absl@@YAXP6AXXZ@Z + ?SetMaxFramesInLogStackTrace@log_internal@absl@@YAXH@Z + ?SetMinLogLevel@absl@@YAXW4LogSeverityAtLeast@1@@Z + ?SetMutexDeadlockDetectionMode@absl@@YAXW4OnDeadlockCycle@1@@Z + ?SetPayload@StatusRep@status_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VCord@3@@Z + ?SetProgramInvocationName@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetProgramUsageMessage@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetStackUnwinder@absl@@YAXP6AHPEAPEAXPEAHHHPEBX1@Z@Z + ?SetStatusPayloadPrinter@status_internal@absl@@YAXP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@AEBVCord@2@@Z@Z + ?SetStderrThreshold@absl@@YAXW4LogSeverityAtLeast@1@@Z + ?SetSuppressSigabortTrace@log_internal@absl@@YA_N_N@Z + ?SetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAXPEAU?$atomic@H@__Cr@std@@@Z + ?SetTimeZone@log_internal@absl@@YAXVTimeZone@2@@Z + ?SetToZero@?$BigUnsigned@$03@strings_internal@absl@@QEAAXXZ + ?SetToZero@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXXZ + ?SetTreeOrEmpty@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@AEBVCordzUpdateScope@53@@Z + ?SetVModuleListHeadForTestOnly@log_internal@absl@@YAPEAVVLogSite@12@PEAV312@@Z + ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?ShiftLeft@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?ShortProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ShouldFixUpStack@internal_stacktrace@absl@@YA_NXZ + ?ShouldLog@LogEveryNSecState@log_internal@absl@@QEAA_NN@Z + ?ShouldLog@LogEveryNState@log_internal@absl@@QEAA_NH@Z + ?ShouldLog@LogEveryPow2State@log_internal@absl@@QEAA_NXZ + ?ShouldLog@LogFirstNState@log_internal@absl@@QEAA_NH@Z + ?ShouldLogBacktraceAt@log_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?ShouldPrependLogPrefix@absl@@YA_NXZ + ?ShouldSymbolizeLogStackTrace@log_internal@absl@@YA_NXZ + ?SigSafeArena@base_internal@absl@@YAPEAUArena@LowLevelAlloc@12@XZ + ?Signal@CondVar@absl@@QEAAXXZ + ?SignalAll@CondVar@absl@@QEAAXXZ + ?SimpleAtob@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_N@Z + ?SimpleAtod@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAN@Z + ?SimpleAtof@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAM@Z + ?SixDigitsToBuffer@numbers_internal@absl@@YA_KNPEAD@Z + ?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SA_KXZ + ?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SA_KXZ + ?Skip@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUPosition@123@_K@Z + ?SlowIsEnabled0@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled1@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled2@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled3@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled4@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled5@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled@VLogSite@log_internal@absl@@AEAA_NHH@Z + ?SlowLock@SpinLock@base_internal@absl@@AEAAXXZ + ?SlowUnlock@SpinLock@base_internal@absl@@AEAAXI@Z + ?SnprintF@str_format_internal@absl@@YAHPEAD_KVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?SpinLockSuggestedDelayNS@base_internal@absl@@YAHH@Z + ?SpinLockWait@base_internal@absl@@YAIPEAU?$atomic@I@__Cr@std@@HQEBUSpinLockWaitTransition@12@W4SchedulingMode@12@@Z + ?SpinLoop@SpinLock@base_internal@absl@@AEAAIXZ + ?StackTraceWorksForTest@debugging_internal@absl@@YA_NXZ + ?StartsWithIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StatusCodeToString@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusCode@1@@Z + ?StatusMessageAsCStr@absl@@YAPEBDAEBVStatus@1@@Z + ?StderrThreshold@absl@@YA?AW4LogSeverityAtLeast@1@XZ + ?SteadyClockNow@KernelTimeout@synchronization_internal@absl@@CA_JXZ + ?StoreValue@FlagImpl@flags_internal@absl@@AEAAXPEBXW4ValueSource@23@@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@111@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@11@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@1@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@000@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@00@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@0@Z + ?StrContainsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StrContainsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?StrError@base_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?StrReplaceAll@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@4@@Z + ?StrReplaceAll@absl@@YAHV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@3@@Z + ?SubTree@CordRepBtree@cord_internal@absl@@QEAAPEAUCordRep@23@_K0@Z + ?Subcord@Cord@absl@@QEBA?AV12@_K0@Z + ?SubstituteAndAppendArray@substitute_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@PEBV645@_K@Z + ?Summarize@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?SupportsArmCRC32PMULL@crc_internal@absl@@YA_NXZ + ?SuppressSigabortTrace@log_internal@absl@@YA_NXZ + ?Symbolize@absl@@YA_NPEBXPEADH@Z + ?TestOnlyAddNodes@GraphCycles@synchronization_internal@absl@@QEAAXI@Z + ?TestOnlyRefreshSamplingStateForCurrentThread@container_internal@absl@@YAXXZ + ?ThreadIsLoggingToLogSink@log_internal@absl@@YA_NXZ + ?ThrowBadStatusOrAccess@internal_statusor@absl@@YAXVStatus@2@@Z + ?ThrowSeedGenException@random_internal@absl@@YAXXZ + ?ThrowStdBadAlloc@base_internal@absl@@YAXXZ + ?ThrowStdBadFunctionCall@base_internal@absl@@YAXXZ + ?ThrowStdDomainError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdDomainError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdInvalidArgument@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdInvalidArgument@base_internal@absl@@YAXPEBD@Z + ?ThrowStdLengthError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdLengthError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdLogicError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdLogicError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdOutOfRange@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdOutOfRange@base_internal@absl@@YAXPEBD@Z + ?ThrowStdOverflowError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdOverflowError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdRangeError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdRangeError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdRuntimeError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdRuntimeError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdUnderflowError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdUnderflowError@base_internal@absl@@YAXPEBD@Z + ?Tick@PerThreadSem@synchronization_internal@absl@@SAXPEAUThreadIdentity@base_internal@3@@Z + ?TimeFromTimespec@absl@@YA?AVTime@1@Utimespec@@@Z + ?TimeFromTimeval@absl@@YA?AVTime@1@Utimeval@@@Z + ?TimeLocal@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@_J@Z + ?TimeZone@log_internal@absl@@YAPEBV02@XZ + ?ToChronoDuration@KernelTimeout@synchronization_internal@absl@@QEBA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@XZ + ?ToChronoHours@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMicroseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMilliseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0DOI@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMinutes@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoNanoseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoSeconds@absl@@YA?AV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoTime@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@VTime@1@@Z + ?ToChronoTimePoint@KernelTimeout@synchronization_internal@absl@@QEBA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@XZ + ?ToDoubleHours@absl@@YANVDuration@1@@Z + ?ToDoubleMicroseconds@absl@@YANVDuration@1@@Z + ?ToDoubleMilliseconds@absl@@YANVDuration@1@@Z + ?ToDoubleMinutes@absl@@YANVDuration@1@@Z + ?ToDoubleNanoseconds@absl@@YANVDuration@1@@Z + ?ToDoubleSeconds@absl@@YANVDuration@1@@Z + ?ToSinkAlso@LogMessage@log_internal@absl@@QEAAAEAV123@PEAVLogSink@3@@Z + ?ToSinkOnly@LogMessage@log_internal@absl@@QEAAAEAV123@PEAVLogSink@3@@Z + ?ToString@?$BigUnsigned@$03@strings_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@Status@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusToStringMode@2@@Z + ?ToString@StatusRep@status_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusToStringMode@3@@Z + ?ToString@int128@absl@@AEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@uint128@absl@@AEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToStringSlow@Status@absl@@CA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KW4StatusToStringMode@2@@Z + ?ToTM@absl@@YA?AUtm@@VTime@1@VTimeZone@1@@Z + ?ToTimeT@absl@@YA_JVTime@1@@Z + ?ToTimespec@absl@@YA?AUtimespec@@VDuration@1@@Z + ?ToTimespec@absl@@YA?AUtimespec@@VTime@1@@Z + ?ToTimeval@absl@@YA?AUtimeval@@VDuration@1@@Z + ?ToTimeval@absl@@YA?AUtimeval@@VTime@1@@Z + ?ToUDate@absl@@YANVTime@1@@Z + ?ToUniversal@absl@@YA_JVTime@1@@Z + ?ToUnixMicros@absl@@YA_JVTime@1@@Z + ?ToUnixMillis@absl@@YA_JVTime@1@@Z + ?ToUnixNanos@absl@@YA_JVTime@1@@Z + ?ToUnixSeconds@absl@@YA_JVTime@1@@Z + ?Track@CordzInfo@cord_internal@absl@@AEAAXXZ + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@W4MethodIdentifier@CordzUpdateTracker@23@_J@Z + ?Trans@Mutex@absl@@AEAAXPEBUMuHowS@2@@Z + ?Trunc@absl@@YA?AVDuration@1@V21@0@Z + ?TryLockSlow@Mutex@absl@@AEAA_NXZ + ?TryNewCRC32AcceleratedX86ARMCombined@crc_internal@absl@@YAPEAVCRCImpl@12@XZ + ?TryParse@FlagImpl@flags_internal@absl@@AEBA?AV?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?TryRead@SequenceLock@flags_internal@absl@@QEBA_NPEAXPEBU?$atomic@_K@__Cr@std@@_K@Z + ?TryRemove@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?TypeId@FlagImpl@flags_internal@absl@@EEBAPEBXXZ + ?TypeId@PrivateHandleAccessor@flags_internal@absl@@SAPEBXAEBVCommandLineFlag@3@@Z + ?TypeName@CommandLineFlag@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?TypeName@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?TypeName@PrivateHandleAccessor@flags_internal@absl@@SA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCommandLineFlag@3@@Z + ?UTC@Impl@time_zone@cctz@time_internal@absl@@SA?AV2345@XZ + ?UTC@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?UTC@TimeZoneInfo@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?UTCImpl@Impl@time_zone@cctz@time_internal@absl@@CAPEBV12345@XZ + ?UnRegisterLivePointers@absl@@YAXPEBX_K@Z + ?UnauthenticatedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnavailableError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnextendByZeroes@CRC32@crc_internal@absl@@UEBAXPEAI_K@Z + ?UnextendCrc32cByZeroes@crc_internal@absl@@YA?AVcrc32c_t@2@V32@_K@Z + ?UnimplementedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnknownError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Unlock@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UnlockSlow@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@F@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@G@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@M@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@Vint128@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@Vuint128@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_N@Z + ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?Unref@StatusRep@status_internal@absl@@QEBAXXZ + ?UnrefTree@InlineRep@Cord@absl@@AEAAXXZ + ?UnsampleSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?Unscramble@CRC32@crc_internal@absl@@UEBAXPEAI@Z + ?Untrack@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UpdateGlobalVLogLevel@log_internal@absl@@YAHH@Z + ?UpdateStackTrace@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@HP6AHPEAPEAXH@Z@Z + ?UpdateVLogSites@log_internal@absl@@YAXXZ + ?UpdateVModule@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Utf8SafeCEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?Utf8SafeCHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?VLogLevel@log_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ValidateInputValue@FlagImpl@flags_internal@absl@@EEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ValidateInputValue@PrivateHandleAccessor@flags_internal@absl@@SA_NAEBVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Version@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@ZoneInfoSource@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Wait@BlockingCounter@absl@@QEAAXXZ + ?Wait@StdcppWaiter@synchronization_internal@absl@@QEAA_NVKernelTimeout@23@@Z + ?Wait@Win32Waiter@synchronization_internal@absl@@QEAA_NVKernelTimeout@23@@Z + ?WaitCommon@CondVar@absl@@AEAA_NPEAVMutex@2@VKernelTimeout@synchronization_internal@2@@Z + ?WaitForNotification@Notification@absl@@QEBAXXZ + ?WaitForNotificationWithDeadline@Notification@absl@@QEBA_NVTime@2@@Z + ?WaitForNotificationWithTimeout@Notification@absl@@QEBA_NVDuration@2@@Z + ?Wakeup@Mutex@absl@@AEAAPEAUPerThreadSynch@base_internal@2@PEAU342@@Z + ?WasPresentOnCommandLine@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?WebSafeBase64Escape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?WebSafeBase64Escape@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?WebSafeBase64Unescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?WideToUtf8@strings_internal@absl@@YA_K_WPEADAEAUShiftState@12@@Z + ?WithMetadataFrom@LogMessage@log_internal@absl@@QEAAAEAV123@AEBVLogEntry@3@@Z + ?WithPerror@LogMessage@log_internal@absl@@QEAAAEAV123@XZ + ?WithThreadID@LogMessage@log_internal@absl@@QEAAAEAV123@I@Z + ?WithTimestamp@LogMessage@log_internal@absl@@QEAAAEAV123@VTime@3@@Z + ?WithVerbosity@LogMessage@log_internal@absl@@QEAAAEAV123@H@Z + ?Write@BufferRawSink@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@FILERawSink@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@FlagImpl@flags_internal@absl@@QEAAXPEBX@Z + ?WriteToStderr@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4LogSeverity@2@@Z + ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ + ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ + ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__annotate_delete@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAXXZ + ?__annotate_from_to@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEBAX_K0W4__asan_annotation_type@123@W4__asan_annotation_place@123@@Z + ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__erase_to_end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z + ?__move_range@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransition@cctz@time_internal@absl@@00@Z + ?__move_range@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@00@Z + ?__swap_out_circular_buffer@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$__split_buffer@UUnrecognizedFlag@absl@@AEAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__throw_length_error@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@CAXXZ + ?assert_is_full@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEBAXPEBD@Z + ?begin@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@123@XZ + ?clear@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?clear@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAAXXZ + ?combine_contiguous@MixingHashState@hash_internal@absl@@SA?AV123@V123@PEBE_K@Z + ?cycle_clock_source_@CycleClock@base_internal@absl@@0U?$atomic@P6A_JXZ@__Cr@std@@A + ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z + ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?effective_impl@time_zone@cctz@time_internal@absl@@AEBAAEBVImpl@1234@XZ + ?end@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@123@XZ + ?engines@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PEIAXPEIBX_KV54@_N@Z@4UArchSpecificEngines@234@B + ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z + ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV567@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@AEBV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@967@AEBVtime_zone@234@@Z + ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEAMW4chars_format@1@@Z + ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEANW4chars_format@1@@Z + ?get_cordz_mean_interval@cord_internal@absl@@YAHXZ + ?get_weekday@detail@cctz@time_internal@absl@@YA?AW4weekday@1234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@@Z + ?kDefaultIterControl@container_internal@absl@@3W4ctrl_t@12@A + ?load_time_zone@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVtime_zone@123@@Z + ?local_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?lock@Mutex@absl@@QEAAXXZ + ?lock_shared@Mutex@absl@@QEAAXXZ + ?lookup@time_zone@cctz@time_internal@absl@@QEBA?AUabsolute_lookup@1234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?lookup@time_zone@cctz@time_internal@absl@@QEBA?AUcivil_lookup@1234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?memcasecmp@strings_internal@absl@@YAHPEBD0_K@Z + ?mutable_rep@CrcCordState@crc_internal@absl@@QEAAPEAURep@123@XZ + ?n_day@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_JC00CCC@Z + ?n_sec@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J00000@Z + ?name@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?next_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@1234@@Z + ?next_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z + ?overflow@Streambuf@OStringStream@strings_internal@absl@@MEAAHH@Z + ?parse@detail@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0AEBVtime_zone@234@PEAV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@PEAV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@chrono@67@PEAV567@@Z + ?poison@InlineData@cord_internal@absl@@QEAAXXZ + ?prev_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@1234@@Z + ?prev_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z + ?push_back@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXAEBQEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?push_back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX$$QEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?remove_prefix@InlineRep@Cord@absl@@QEAAX_K@Z + ?reserve@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?resize@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?resize@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?safe_strto128_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVint128@2@H@Z + ?safe_strto16_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAFH@Z + ?safe_strto32_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHH@Z + ?safe_strto64_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_JH@Z + ?safe_strto8_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEACH@Z + ?safe_strtou128_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVuint128@2@H@Z + ?safe_strtou16_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAGH@Z + ?safe_strtou32_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAIH@Z + ?safe_strtou64_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_KH@Z + ?safe_strtou8_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAEH@Z + ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z + ?shallow_subcords_enabled@cord_internal@absl@@3U?$atomic@_N@__Cr@std@@A + ?should_rehash_for_bug_detection_on_insert@CommonFieldsGenerationInfoEnabled@container_internal@absl@@QEBA_N_K@Z + ?should_rehash_for_bug_detection_on_move@CommonFieldsGenerationInfoEnabled@container_internal@absl@@QEBA_N_K@Z + ?shrink_to_fit@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?shrink_to_fit@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?size@?$BigUnsigned@$03@strings_internal@absl@@QEBAHXZ + ?size@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAHXZ + ?size@Cord@absl@@QEBA_KXZ + ?status@BadStatusOrAccess@absl@@QEBAAEBVStatus@2@XZ + ?stream@OstreamView@LogMessage@log_internal@absl@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?tag@Rep@InlineData@cord_internal@absl@@QEBACXZ + ?transfer_unprobed_elements_to_next_capacity_fn@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CAXAEAVCommonFields@23@PEBW4ctrl_t@23@PEAX2P6AX2E_K3@Z@Z + ?try_lock@Mutex@absl@@QEAA_NXZ + ?try_lock_shared@Mutex@absl@@QEAA_NXZ + ?unlock@Mutex@absl@@QEAAXXZ + ?unlock_shared@Mutex@absl@@QEAAXXZ + ?utc_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?version@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?what@BadStatusOrAccess@absl@@UEBAPEBDXZ + ?what@SeedGenException@absl@@UEBAPEBDXZ + ?words@?$BigUnsigned@$03@strings_internal@absl@@QEBAPEBIXZ + ?words@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAPEBIXZ + ?xsputn@Streambuf@OStringStream@strings_internal@absl@@MEAA_JPEBD_J@Z + AbslContainerInternalSampleEverything + AbslInternalMutexYield + AbslInternalOnFatalLogMessage + AbslInternalPerThreadSemInit + AbslInternalPerThreadSemPoke + AbslInternalPerThreadSemPost + AbslInternalPerThreadSemWait + AbslInternalReportFatalUsageError + AbslInternalSleepFor + AbslInternalSpinLockDelay + AbslInternalSpinLockWake + AbslInternalTraceContinue + AbslInternalTraceObserved + AbslInternalTraceSignal + AbslInternalTraceWait diff --git a/naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel_cxx23.def b/naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel_cxx23.def new file mode 100644 index 0000000000..22ce1791bb --- /dev/null +++ b/naiveproxy/src/third_party/abseil-cpp/symbols_x64_rel_cxx23.def @@ -0,0 +1,1391 @@ +EXPORTS + ?$TSS0@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PEIAXPEIBX_KV54@_N@Z@4HA + ??$?0$$V$0A@@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QEAA@XZ + ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?6C@LogMessage@log_internal@absl@@QEAAAEAV012@AEBC@Z + ??$?6D@LogMessage@log_internal@absl@@QEAAAEAV012@AEBD@Z + ??$?6E@LogMessage@log_internal@absl@@QEAAAEAV012@AEBE@Z + ??$?6F@LogMessage@log_internal@absl@@QEAAAEAV012@AEBF@Z + ??$?6G@LogMessage@log_internal@absl@@QEAAAEAV012@AEBG@Z + ??$?6H@LogMessage@log_internal@absl@@QEAAAEAV012@AEBH@Z + ??$?6I@LogMessage@log_internal@absl@@QEAAAEAV012@AEBI@Z + ??$?6J@LogMessage@log_internal@absl@@QEAAAEAV012@AEBJ@Z + ??$?6K@LogMessage@log_internal@absl@@QEAAAEAV012@AEBK@Z + ??$?6M@LogMessage@log_internal@absl@@QEAAAEAV012@AEBM@Z + ??$?6N@LogMessage@log_internal@absl@@QEAAAEAV012@AEBN@Z + ??$?6PEAX@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEAX@Z + ??$?6PEBD@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEBD@Z + ??$?6PEBX@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEBX@Z + ??$?6PEB_W@LogMessage@log_internal@absl@@QEAAAEAV012@AEBQEB_W@Z + ??$?6_J@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_J@Z + ??$?6_K@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_K@Z + ??$?6_N@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_N@Z + ??$?MUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?OUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CC@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CC@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CG@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CG@$$CBD@Z + ??$?RW4LogSeverity@absl@@AEBQEBDHAEAY0CH@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAY0CH@$$CBD@Z + ??$AbslStringify@VStringifySink@strings_internal@absl@@@absl@@YAXAEAVStringifySink@strings_internal@0@UHex@0@@Z + ??$AddCordRep@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z + ??$AddCordRep@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z + ??$AddData@$00@CordRepBtree@cord_internal@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ??$AddData@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$AllocateBackingArray@$07V?$allocator@D@__Cr@std@@@container_internal@absl@@YAPEAXPEAX_K@Z + ??$Append@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$AppendImpl@AEBVCord@absl@@@Cord@absl@@AEAAXAEBV01@@Z + ??$AppendImpl@VCord@absl@@@Cord@absl@@AEAAX$$QEAV01@@Z + ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@A6AXXZ@Z + ??$CallOnceImpl@P8FlagImpl@flags_internal@absl@@EAAXXZPEAV123@@base_internal@absl@@YAXPEAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@$$QEAP8FlagImpl@flags_internal@1@EAAXXZ$$QEAPEAV671@@Z + ??$CastAndCallFunction@$$CBU?$atomic@_N@__Cr@std@@@Condition@absl@@CA_NPEBV01@@Z + ??$ConsumeConversion@$00@str_format_internal@absl@@YAPEBDPEBDQEBDPEAUUnboundConversion@01@PEAH@Z + ??$ConsumeConversion@$0A@@str_format_internal@absl@@YAPEBDPEBDQEBDPEAUUnboundConversion@01@PEAH@Z + ??$ConvertIntArg@C@str_format_internal@absl@@YA_NCVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@D@str_format_internal@absl@@YA_NDVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@E@str_format_internal@absl@@YA_NEVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@F@str_format_internal@absl@@YA_NFVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@G@str_format_internal@absl@@YA_NGVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@H@str_format_internal@absl@@YA_NHVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@I@str_format_internal@absl@@YA_NIVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@J@str_format_internal@absl@@YA_NJVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@K@str_format_internal@absl@@YA_NKVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@Vint128@absl@@@str_format_internal@absl@@YA_NVint128@1@VFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@Vuint128@absl@@@str_format_internal@absl@@YA_NVuint128@1@VFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_J@str_format_internal@absl@@YA_N_JVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_K@str_format_internal@absl@@YA_N_KVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_W@str_format_internal@absl@@YA_N_WVFormatConversionSpecImpl@01@PEAVFormatSinkImpl@01@@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXD_K@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXD_K@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBufferWithStructuredProtoField@$00@LogMessage@log_internal@absl@@AEAAXUStructuredProtoField@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBufferWithStructuredProtoField@$0A@@LogMessage@log_internal@absl@@AEAAXUStructuredProtoField@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$DeallocateBackingArray@$07V?$allocator@D@__Cr@std@@@container_internal@absl@@YAXPEAX_KPEAW4ctrl_t@01@11_N@Z + ??$Dispatch@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@F@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@G@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@H@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@I@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@M@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@O@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@PEBD@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@PEB_W@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@UVoidPtr@str_format_internal@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@Vint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@Vuint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$Dispatch@_N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z + ??$EmplaceBackSlow@AEBQEAVLogSink@absl@@@?$Storage@PEAVLogSink@absl@@$0BA@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAAEAPEAVLogSink@2@AEBQEAV32@@Z + ??$EmplaceBackSlow@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAAEAUPayload@status_internal@2@$$QEAU342@@Z + ??$FindSubstitutions@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@strings_internal@absl@@YA?AV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@AEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@4@@Z + ??$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEAXW4FlagOp@01@PEBXPEAX2@Z + ??$Flush@V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@VBufferRawSink@str_format_internal@absl@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@VFILERawSink@str_format_internal@absl@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPEAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$GenRuntimeTypeId@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPEBVtype_info@@XZ + ??$GenericCompare@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@absl@@YAHAEBVCord@0@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$GenericCompare@HVCord@absl@@@absl@@YAHAEBVCord@0@0_K@Z + ??$GenericCompare@_NVCord@absl@@@absl@@YA_NAEBVCord@0@0_K@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$00$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$03$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$07$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$0A@$0A@@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$0BA@$00@container_internal@absl@@YA_KAEAVCommonFields@01@AEBUPolicyFunctions@01@V?$FunctionRef@$$A6A_K_K@Z@1@_N@Z + ??$InvokeObject@AEAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@_K_K@functional_internal@absl@@YA_KTVoidPtr@01@_K@Z + ??$MakeCheckOpString@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0PEBD@Z + ??$MakeCheckOpString@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@@log_internal@absl@@YAPEBDAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PEBD@Z + ??$MakeCheckOpString@DD@log_internal@absl@@YAPEBDDDPEBD@Z + ??$MakeCheckOpString@EE@log_internal@absl@@YAPEBDEEPEBD@Z + ??$MakeCheckOpString@MM@log_internal@absl@@YAPEBDMMPEBD@Z + ??$MakeCheckOpString@NN@log_internal@absl@@YAPEBDNNPEBD@Z + ??$MakeCheckOpString@PEBCPEBC@log_internal@absl@@YAPEBDPEBC0PEBD@Z + ??$MakeCheckOpString@PEBDPEBD@log_internal@absl@@YAPEBDPEBD00@Z + ??$MakeCheckOpString@PEBEPEBE@log_internal@absl@@YAPEBDPEBE0PEBD@Z + ??$MakeCheckOpString@PEBXPEBX@log_internal@absl@@YAPEBDPEBX0PEBD@Z + ??$MakeCheckOpString@_J_J@log_internal@absl@@YAPEBD_J0PEBD@Z + ??$MakeCheckOpString@_K_K@log_internal@absl@@YAPEBD_K0PEBD@Z + ??$MakeCheckOpString@_N_N@log_internal@absl@@YAPEBD_N0PEBD@Z + ??$Merge@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z + ??$Merge@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z + ??$NewLeaf@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$NewLeaf@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ??$ParseFlagImpl@H@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAH@Z + ??$ParseFlagImpl@I@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAI@Z + ??$ParseFlagImpl@J@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAJ@Z + ??$ParseFlagImpl@K@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAK@Z + ??$ParseFlagImpl@_J@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEA_J@Z + ??$ParseFlagImpl@_K@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEA_K@Z + ??$ParseFloat@$09@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z + ??$ParseFloat@$0BA@@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z + ??$ParseFormatString@UParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@@str_format_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UParsedFormatConsumer@ParsedFormatBase@01@@Z + ??$PopDead@_J_K_K_KG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AEAAPEAUHashtablezInfo@container_internal@2@_J_K11G@Z + ??$Prepend@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$Register@AEB_JAEA_KAEA_KAEA_KAEAG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAAPEAUHashtablezInfo@container_internal@2@AEB_JAEA_K11AEAG@Z + ??$SNPrintF@DHHH@absl@@YAHPEAD_KAEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@str_format_internal@0@AEBDAEBH44@Z + ??$StrCat@PEBD@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBQEBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY02D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY02$$CBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY03D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY03$$CBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0BO@DV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY0BO@$$CBD1@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0LD@D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@0@0000AEBV123@AEAY0LD@$$CBD@Z + ??$StrCat@_K@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@3@@Z + ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z + ??$TransferNRelocatable@$0BI@@container_internal@absl@@YAXPEAX00_K@Z + ??$TryFindNewIndexWithoutProbing@X@container_internal@absl@@YA_K_K00PEAW4ctrl_t@01@0@Z + ??$TypeErasedApplyToSlotFn@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@YA_KPEBXPEAX_K@Z + ??$UnparseFloatingPointVal@M@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@M@Z + ??$UnparseFloatingPointVal@N@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z + ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z + ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z + ??$__call_func@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@@?$__policy_func@$$A6AXAEAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@CAXPEBT__policy_storage@123@AEAVCommandLineFlag@absl@@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$00@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$01@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$02@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$0A@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QEAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YA_KUStructuredProtoField@34@@Z@@__variant@2345@AEAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__do_rehash@$00@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AEAAX_K@Z + ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z + ??$__emplace_back_slow_path@AEBUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@AEBU34@@Z + ??$__emplace_back_slow_path@W4Source@UnrecognizedFlag@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AEAAPEAUUnrecognizedFlag@absl@@$$QEAW4Source@34@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$__for_each_segment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@23@@__Cr@std@@YAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__copy_impl@01@@Z + ??$__insert_with_size@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$__wrap_iter@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PEAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV345@@Z@@12@1_J@Z + ??$__invoke@AEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@5@@__Cr@std@@YAXAEAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QEAAXXZ@AEAVCommandLineFlag@6@@Z + ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@12@@Z + ??$emplace@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@12@@Z + ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXXZ + ??$emplace_back@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@HVcrc32c_t@absl@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QEAH$$QEAVcrc32c_t@6@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAXAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@AEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAXAEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QEAAX$$QEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAA?AViterator@012@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$find_or_prepare_insert@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_or_prepare_insert_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AEAA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$resize_and_overwrite@V@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@56@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@UNoFormatter@23@@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QEAAX_KV@?0???$JoinAlgorithm@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV012@V?$__wrap_iter@PEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@1V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@UNoFormatter@45@@Z@@Z + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@XZ + ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@_K@Z + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@XZ + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@_K@Z + ??0?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@W4State@012@PEBV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QEAA@W4State@012@PEBV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0AlphaNum@absl@@QEAA@H@Z + ??0AlphaNum@absl@@QEAA@PEBD@Z + ??0AlphaNum@absl@@QEAA@_K@Z + ??0Arena@LowLevelAlloc@base_internal@absl@@QEAA@I@Z + ??0Arg@substitute_internal@absl@@QEAA@PEBX@Z + ??0Arg@substitute_internal@absl@@QEAA@UDec@2@@Z + ??0Arg@substitute_internal@absl@@QEAA@UHex@2@@Z + ??0BadStatusOrAccess@absl@@QEAA@$$QEAV01@@Z + ??0BadStatusOrAccess@absl@@QEAA@AEBV01@@Z + ??0BadStatusOrAccess@absl@@QEAA@VStatus@1@@Z + ??0BlockingCounter@absl@@QEAA@H@Z + ??0ByAnyChar@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0ByLength@absl@@QEAA@_J@Z + ??0ByString@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0CRC@crc_internal@absl@@IEAA@XZ + ??0CheckOpMessageBuilder@log_internal@absl@@QEAA@PEBD@Z + ??0Condition@absl@@QEAA@P6A_NPEAX@Z0@Z + ??0Condition@absl@@QEAA@PEB_N@Z + ??0Cord@absl@@AEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@1@@Z + ??0Cord@absl@@QEAA@AEBV01@@Z + ??0CordzHandle@cord_internal@absl@@IEAA@_N@Z + ??0CordzInfo@cord_internal@absl@@AEAA@PEAUCordRep@12@PEBV012@W4MethodIdentifier@CordzUpdateTracker@12@_J@Z + ??0CrcCordState@crc_internal@absl@@QEAA@$$QEAV012@@Z + ??0CrcCordState@crc_internal@absl@@QEAA@AEBV012@@Z + ??0CrcCordState@crc_internal@absl@@QEAA@XZ + ??0DynValueDeleter@flags_internal@absl@@QEAA@P6APEAXW4FlagOp@12@PEBXPEAX2@Z@Z + ??0FlagSaver@absl@@QEAA@XZ + ??0GraphCycles@synchronization_internal@absl@@QEAA@XZ + ??0HashtablezInfo@container_internal@absl@@QEAA@XZ + ??0Impl@time_zone@cctz@time_internal@absl@@AEAA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??0Impl@time_zone@cctz@time_internal@absl@@AEAA@XZ + ??0KernelTimeout@synchronization_internal@absl@@QEAA@VDuration@2@@Z + ??0KernelTimeout@synchronization_internal@absl@@QEAA@VTime@2@@Z + ??0LeakCheckDisabler@absl@@QEAA@XZ + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUErrorTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUInfoTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHUWarningTag@012@@Z + ??0LogMessage@log_internal@absl@@QEAA@PEBDHW4LogSeverity@2@@Z + ??0LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@2@@Z + ??0LogMessageData@LogMessage@log_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@3@VTime@3@@Z + ??0LogMessageDebugFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH0@Z + ??0LogMessageFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageQuietlyDebugFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0LogMessageQuietlyFatal@log_internal@absl@@QEAA@PEBDH0@Z + ??0LogMessageQuietlyFatal@log_internal@absl@@QEAA@PEBDH@Z + ??0MaskedPointer@flags_internal@absl@@QEAA@PEAX_N@Z + ??0OstreamView@LogMessage@log_internal@absl@@QEAA@AEAULogMessageData@123@@Z + ??0ParsedFormatBase@str_format_internal@absl@@QEAA@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_NV?$initializer_list@W4FormatConversionCharSet@absl@@@5@@Z + ??0Randen@random_internal@absl@@QEAA@XZ + ??0ScopedMinLogLevel@log_internal@absl@@QEAA@W4LogSeverityAtLeast@2@@Z + ??0ScopedStderrThreshold@absl@@QEAA@W4LogSeverityAtLeast@1@@Z + ??0Status@absl@@QEAA@W4StatusCode@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0StdcppWaiter@synchronization_internal@absl@@QEAA@XZ + ??0StringifySink@detect_specialization@log_internal@absl@@QEAA@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0TimeZoneLibC@cctz@time_internal@absl@@AEAA@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??0Utf8ForCodePoint@debugging_internal@absl@@QEAA@_K@Z + ??0Win32Waiter@synchronization_internal@absl@@QEAA@XZ + ??0int128@absl@@QEAA@M@Z + ??0int128@absl@@QEAA@N@Z + ??0int128@absl@@QEAA@O@Z + ??0uint128@absl@@QEAA@M@Z + ??0uint128@absl@@QEAA@N@Z + ??0uint128@absl@@QEAA@O@Z + ??1?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QEAA@XZ + ??1CRC@crc_internal@absl@@UEAA@XZ + ??1Cord@absl@@QEAA@XZ + ??1CordzHandle@cord_internal@absl@@MEAA@XZ + ??1CordzInfo@cord_internal@absl@@EEAA@XZ + ??1CrcCordState@crc_internal@absl@@QEAA@XZ + ??1FlagSaver@absl@@QEAA@XZ + ??1FlagStateInterface@flags_internal@absl@@UEAA@XZ + ??1GraphCycles@synchronization_internal@absl@@QEAA@XZ + ??1HashtablezInfo@container_internal@absl@@QEAA@XZ + ??1LeakCheckDisabler@absl@@QEAA@XZ + ??1LogMessage@log_internal@absl@@QEAA@XZ + ??1LogMessageDebugFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageQuietlyDebugFatal@log_internal@absl@@QEAA@XZ + ??1LogMessageQuietlyFatal@log_internal@absl@@QEAA@XZ + ??1Mutex@absl@@QEAA@XZ + ??1Notification@absl@@QEAA@XZ + ??1OstreamView@LogMessage@log_internal@absl@@UEAA@XZ + ??1ScopedMinLogLevel@log_internal@absl@@QEAA@XZ + ??1ScopedStderrThreshold@absl@@QEAA@XZ + ??1SeedGenException@absl@@UEAA@XZ + ??1TimeZoneIf@cctz@time_internal@absl@@UEAA@XZ + ??1TimeZoneInfo@cctz@time_internal@absl@@UEAA@XZ + ??1ZoneInfoSource@cctz@time_internal@absl@@UEAA@XZ + ??4BadStatusOrAccess@absl@@QEAAAEAV01@$$QEAV01@@Z + ??4BadStatusOrAccess@absl@@QEAAAEAV01@AEBV01@@Z + ??4Cord@absl@@QEAAAEAV01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??4CrcCordState@crc_internal@absl@@QEAAAEAV012@$$QEAV012@@Z + ??4CrcCordState@crc_internal@absl@@QEAAAEAV012@AEBV012@@Z + ??4FlagsUsageConfig@absl@@QEAAAEAU01@AEBU01@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@AEBV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@P6AAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV345@@Z@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@P6AAEAVios_base@__Cr@std@@AEAV345@@Z@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QEAAAEAV012@_W@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@AEBVCord@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@AEBVStatus@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vint128@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@Vuint128@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverity@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverityAtLeast@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4LogSeverityAtMost@0@@Z + ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV123@W4StatusCode@0@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@AEBV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@W4weekday@0123@@Z + ??6log_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@UUnprintableWrapper@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV234@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@01@@Z + ??8StatusRep@status_internal@absl@@QEBA_NAEBV012@@Z + ??ACord@absl@@QEBAD_K@Z + ??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ??Bint128@absl@@QEBANXZ + ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??Kabsl@@YA?AVint128@0@V10@0@Z + ??Kabsl@@YA?AVuint128@0@V10@0@Z + ??Labsl@@YA?AVint128@0@V10@0@Z + ??Labsl@@YA?AVuint128@0@V10@0@Z + ??R@?0???$__emplace_unique@AEBQEBUCordRep@cord_internal@absl@@@?$__hash_table@PEBUCordRep@cord_internal@absl@@U?$hash@PEBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PEBUCordRep@cord_internal@absl@@@56@V?$allocator@PEBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@PEBUCordRep@cord_internal@absl@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBQEBUCordRep@cord_internal@absl@@@Z@QEBA?A?@@00@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@_J@__Cr@std@@_N@23@AEBUpiecewise_construct_t@23@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QEAV?$tuple@$$V@23@@Z@QEBA?A?@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$emplace_back@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV723@AEA_K@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCommandLineFlag@absl@@@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCommandLineFlag@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEAVLogSink@absl@@AEBQEAV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@AEBQEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUTransition@cctz@time_internal@absl@@AEBU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@PEBVCommandLineFlag@absl@@@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAPEBVCommandLineFlag@absl@@$$QEAPEBV45@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAAEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z@QEBA?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAAEAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QEAV423@@Z@QEBA?A?@@XZ + ??R?$ConvertToContainer@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z + ??R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QEBA?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AEBV123@@Z + ??RByCivilTime@Transition@cctz@time_internal@absl@@QEBA_NAEBU1234@0@Z + ??RDynValueDeleter@flags_internal@absl@@QEBAXPEAX@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PEAX@23@@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PEAX@23@@Z + ??XDuration@absl@@QEAAAEAV01@N@Z + ??XDuration@absl@@QEAAAEAV01@_J@Z + ??YDuration@absl@@QEAAAEAV01@V01@@Z + ??ZDuration@absl@@QEAAAEAV01@V01@@Z + ??_0Duration@absl@@QEAAAEAV01@N@Z + ??_0Duration@absl@@QEAAAEAV01@_J@Z + ??_1Duration@absl@@QEAAAEAV01@V01@@Z + ?AbortedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslFormatFlush@detect_specialization@log_internal@absl@@YAXPEAVStringifySink@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVDuration@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAW4LogSeverity@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAFPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAGPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAIPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAJPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAKPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAMPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEANPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@1@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@45@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVint128@2@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVuint128@2@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_JPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_KPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_NPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@12@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LogSeverity@1@@Z + ?AbslUnparseFlag@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@45@@Z + ?AbslUnparseFlag@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@12@@Z + ?Absorb@RandenHwAes@random_internal@absl@@SAXPEBXPEAX@Z + ?Absorb@RandenSlow@random_internal@absl@@SAXPEBXPEAX@Z + ?AddHint@BestHints@flags_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z + ?AddLogSink@log_internal@absl@@YAXPEAVLogSink@2@@Z + ?AddWithCarry@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHI@Z + ?AddWithCarry@?$BigUnsigned@$03@strings_internal@absl@@AEAAXH_K@Z + ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHI@Z + ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXH_K@Z + ?AddressIsReadable@debugging_internal@absl@@YA_NPEBX@Z + ?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AEAA?AV23@_K@Z + ?AdvanceBytesBtree@ChunkIterator@Cord@absl@@AEAAX_K@Z + ?Alloc@LowLevelAlloc@base_internal@absl@@SAPEAX_K@Z + ?AllocWithArena@LowLevelAlloc@base_internal@absl@@SAPEAX_KPEAUArena@123@@Z + ?AlreadyExistsError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AlwaysTrue@Condition@absl@@CA_NPEBV12@@Z + ?Append@Cord@absl@@QEAAX$$QEAV12@@Z + ?Append@Cord@absl@@QEAAXAEBV12@@Z + ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z + ?Append@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@detect_specialization@log_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@detect_specialization@log_internal@absl@@QEAAX_KD@Z + ?Append@StringifySink@strings_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@strings_internal@absl@@QEAAX_KD@Z + ?AppendArray@InlineRep@Cord@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@3@@Z + ?AppendCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$initializer_list@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@5@@Z + ?AppendPrecise@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?AppendSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z + ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?ApplyMask@MaskedPointer@flags_internal@absl@@AEAAX_K@Z + ?ApplySubstitutions@strings_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@45@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AsciiStrToLower@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AsciiStrToLower@ascii_internal@absl@@YAXPEADPEBD_K@Z + ?AsciiStrToUpper@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AsciiStrToUpper@ascii_internal@absl@@YAXPEADPEBD_K@Z + ?AssertHeld@Mutex@absl@@QEBAXXZ + ?AssertNotHeld@Mutex@absl@@QEBAXXZ + ?AssertReaderHeld@Mutex@absl@@QEBAXXZ + ?AssertValidType@FlagImpl@flags_internal@absl@@QEBAXPEBXP6APEBVtype_info@@XZ@Z + ?AssignLargeString@Cord@absl@@AEAAAEAV12@$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AssignSlow@InlineRep@Cord@absl@@AEAAXAEBV123@@Z + ?AsyncSignalSafeWriteError@raw_log_internal@absl@@YAXPEBD_K@Z + ?At@TimeZone@absl@@QEBA?AUCivilInfo@12@VTime@2@@Z + ?At@TimeZone@absl@@QEBA?AUTimeInfo@12@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@2@@Z + ?AtLocation@LogMessage@log_internal@absl@@QEAAAEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?AtomicBufferValue@FlagImpl@flags_internal@absl@@AEBAPEAU?$atomic@_K@__Cr@std@@XZ + ?AwaitCommon@Mutex@absl@@AEAA_NAEBVCondition@2@VKernelTimeout@synchronization_internal@2@@Z + ?Base64Escape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?Base64Escape@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?Base64EscapeInternal@strings_internal@absl@@YA_KPEBE_KPEAD1PEBD_N@Z + ?Base64Unescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?BindWithPack@str_format_internal@absl@@YA_NPEBUUnboundConversion@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@PEAVBoundConversion@12@@Z + ?Block@Barrier@absl@@QEAA_NXZ + ?Block@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?BreakTime@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AUabsolute_lookup@time_zone@234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BreakTime@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AUabsolute_lookup@time_zone@234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BytesToHexString@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CPUSupportsRandenHwAes@random_internal@absl@@YA_NXZ + ?CUnescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@1@Z + ?CalculateBase64EscapedLenInternal@strings_internal@absl@@YA_K_K_N@Z + ?CallVoidPtrFunction@Condition@absl@@CA_NPEBV12@@Z + ?CancelledError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?CappedDamerauLevenshteinDistance@strings_internal@absl@@YAEV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0E@Z + ?CatPieces@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$initializer_list@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@5@@Z + ?Ceil@absl@@YA?AVDuration@1@V21@0@Z + ?CheckDefaultValueParsingRoundtrip@FlagImpl@flags_internal@absl@@EEBAXXZ + ?CheckDefaultValueParsingRoundtrip@PrivateHandleAccessor@flags_internal@absl@@SAXAEBVCommandLineFlag@3@@Z + ?CheckInvariants@GraphCycles@synchronization_internal@absl@@QEBA_NXZ + ?CheckMask@MaskedPointer@flags_internal@absl@@AEBA_N_K@Z + ?CheckstrcasecmpfalseImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcasecmptrueImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcmpfalseImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?CheckstrcmptrueImpl@log_internal@absl@@YAPEBDPEBD00@Z + ?Checksum@CrcCordState@crc_internal@absl@@QEBA?AVcrc32c_t@3@XZ + ?CityHash32@hash_internal@absl@@YAIPEBD_K@Z + ?CityHash64@hash_internal@absl@@YA_KPEBD_K@Z + ?CityHash64WithSeed@hash_internal@absl@@YA_KPEBD_K1@Z + ?CityHash64WithSeeds@hash_internal@absl@@YA_KPEBD_K11@Z + ?Clear@Cord@absl@@QEAAXXZ + ?ClearBackingArray@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@PEAX_N3@Z + ?ClearCurrentThreadIdentity@base_internal@absl@@YAXXZ + ?ClearLogBacktraceLocation@absl@@YAXXZ + ?ClearTimeZoneMapTestOnly@Impl@time_zone@cctz@time_internal@absl@@SAXXZ + ?CloneAndUnref@StatusRep@status_internal@absl@@QEBAPEAV123@XZ + ?CombineContiguousImpl@hash_internal@absl@@YA_K_KPEBE0U?$integral_constant@H$07@__Cr@std@@@Z + ?CombineLargeContiguousImplOn32BitLengthGt8@hash_internal@absl@@YA_KPEBE_K1@Z + ?CombineLargeContiguousImplOn64BitLengthGt32@hash_internal@absl@@YA_KPEBE_K1@Z + ?Compare@Cord@absl@@QEBAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?CompareImpl@Cord@absl@@AEBAHAEBV12@@Z + ?CompareSlowPath@Cord@absl@@AEBAHAEBV12@_K1@Z + ?CompareSlowPath@Cord@absl@@AEBAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K1@Z + ?Compute@CrcNonTemporalMemcpyAVXEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?Compute@CrcNonTemporalMemcpyEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?Compute@FallbackCrcMemcpyEngine@crc_internal@absl@@UEBA?AVcrc32c_t@3@PEIAXPEIBX_KV43@@Z + ?ConcatCrc32c@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?Consume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z + ?ConsumeBeginTo@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@_K1@Z + ?ConsumeUnboundConversionNoInline@str_format_internal@absl@@YAPEBDPEBD0PEAUUnboundConversion@12@PEAH@Z + ?Contains@Cord@absl@@QEBA_NAEBV12@@Z + ?Contains@Cord@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ConvertBoolArg@str_format_internal@absl@@YA_N_NPEAVFormatSinkImpl@12@@Z + ?ConvertDateTime@absl@@YA?AUTimeConversion@1@_JHHHHHVTimeZone@1@@Z + ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAW4ctrl_t@12@_K@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NMAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NNAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NOAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?Copy@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@AEBV312@V?$FunctionRef@$$A6AXPEAXPEBX@Z@2@@Z + ?CopyCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?CopyPrefix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K_N@Z + ?CopySuffix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z + ?CopyToArraySlowPath@Cord@absl@@AEBAXPEAD@Z + ?Crash@Helper@internal_statusor@absl@@SAXAEBVStatus@3@@Z + ?Crc32c@CRC@crc_internal@absl@@SAPEAV123@XZ + ?CreateSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@@Z + ?CreateThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ + ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPEAUThreadIdentity@12@XZ + ?CurrentValue@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?DataGuard@FlagImpl@flags_internal@absl@@AEBAAEAVMutex@3@XZ + ?DataLossError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?DeadlineExceededError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?DecodeFrom@ProtoField@log_internal@absl@@QEAA_NPEAV?$Span@$$CBD@3@@Z + ?DecodeRustPunycode@debugging_internal@absl@@YAPEADUDecodeRustPunycodeOptions@12@@Z + ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_JI@Z + ?DecrementCount@BlockingCounter@absl@@QEAA_NXZ + ?DecrementSynchSem@Mutex@absl@@CA_NPEAV12@PEAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z + ?DeduceUsageFlags@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ + ?DefaultStackUnwinder@absl@@YAHPEAPEAXPEAHHHPEBX1@Z + ?DefaultStackUnwinder@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHHPEBX2@Z + ?DefaultValue@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Delete@CordzHandle@cord_internal@absl@@SAXPEAV123@@Z + ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPEAUArena@123@@Z + ?Demangle@debugging_internal@absl@@YA_NPEBDPEAD_K@Z + ?DemangleRustSymbolEncoding@debugging_internal@absl@@YA_NPEBDPEAD_K@Z + ?DemangleString@debugging_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBD@Z + ?Description@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Description@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Destroy@CordRep@cord_internal@absl@@SAXPEAU123@@Z + ?Destroy@CordRepBtree@cord_internal@absl@@SAXPEAV123@@Z + ?Destroy@CordRepCrc@cord_internal@absl@@SAXPEAU123@@Z + ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AEAAXXZ + ?DestroyCordSlow@Cord@absl@@AEAAXXZ + ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z + ?Die@LogMessage@log_internal@absl@@AEAAXXZ + ?DieBecauseNull@log_internal@absl@@YAXPEBDH0@Z + ?Digits10@?$BigUnsigned@$03@strings_internal@absl@@SAHXZ + ?Digits10@?$BigUnsigned@$0FE@@strings_internal@absl@@SAHXZ + ?DoIgnoreLeak@absl@@YAXPEBX@Z + ?Dtor@Mutex@absl@@AEAAXXZ + ?DummyFunction@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBVCord@absl@@@Z@base_internal@absl@@CA?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEBVCord@3@@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDH000@Z@base_internal@absl@@CAXPEBDH000@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@CAXPEBDPEBX@Z + ?DummyFunction@?$AtomicHook@P6AXPEBDPEBX_J@Z@base_internal@absl@@CAXPEBDPEBX_J@Z + ?DummyFunction@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@CAXPEBX_J@Z + ?DummyFunction@?$AtomicHook@P6AXXZ@base_internal@absl@@CAXXZ + ?DummyFunction@?$AtomicHook@P6AX_J@Z@base_internal@absl@@CAX_J@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@67@@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_NAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@67@@Z + ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXQEAXQEBQEAXQEAHHH_NP6AXPEBDPEAX@Z5@Z + ?DumpStackTrace@debugging_internal@absl@@YAXHH_NP6AXPEBDPEAX@Z2@Z + ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z + ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z + ?EmptyGeneration@container_internal@absl@@YAPEAEXZ + ?EmptyString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?EnableDebugLog@CondVar@absl@@QEAAXPEBD@Z + ?EnableDebugLog@Mutex@absl@@QEAAXPEBD@Z + ?EnableInvariantDebugging@Mutex@absl@@QEAAXP6AXPEAX@Z0@Z + ?EnableLogPrefix@absl@@YAX_N@Z + ?EnableMutexInvariantDebugging@absl@@YAX_N@Z + ?EnableSymbolizeLogStackTrace@log_internal@absl@@YAX_N@Z + ?Encode32Bit@log_internal@absl@@YA_N_KIPEAV?$Span@D@2@@Z + ?Encode64Bit@log_internal@absl@@YA_N_K0PEAV?$Span@D@2@@Z + ?EncodeBytes@log_internal@absl@@YA_N_KV?$Span@$$CBD@2@PEAV?$Span@D@2@@Z + ?EncodeBytesTruncate@log_internal@absl@@YA_N_KV?$Span@$$CBD@2@PEAV?$Span@D@2@@Z + ?EncodeMessageLength@log_internal@absl@@YAXV?$Span@D@2@PEBV32@@Z + ?EncodeMessageStart@log_internal@absl@@YA?AV?$Span@D@2@_K0PEAV32@@Z + ?EncodeStructuredProtoField@log_internal@absl@@YA_NUStructuredProtoField@12@AEAV?$Span@D@2@@Z + ?EncodeUTF8Char@strings_internal@absl@@YA_KPEAD_U@Z + ?EncodeVarint@log_internal@absl@@YA_N_K0PEAV?$Span@D@2@@Z + ?EncodeWaitCycles@SpinLock@base_internal@absl@@KAI_J0@Z + ?EndsWith@Cord@absl@@QEBA_NAEBV12@@Z + ?EndsWith@Cord@absl@@QEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?EndsWithIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EqualsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EqualsImpl@Cord@absl@@AEBA_NAEBV12@_K@Z + ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z + ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z + ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z + ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z + ?Eval@Condition@absl@@QEBA_NXZ + ?ExitOnDFatal@log_internal@absl@@YA_NXZ + ?ExpectedChecksum@Cord@absl@@QEBA?AV?$optional@I@__Cr@std@@XZ + ?Extend@CRC32@crc_internal@absl@@UEBAXPEAIPEBX_K@Z + ?ExtendByZeroes@CRC32@crc_internal@absl@@UEBAXPEAI_K@Z + ?ExtendByZeroesImpl@CRC32@crc_internal@absl@@CAXPEAI_KQEBI2@Z + ?ExtendCrc32cByZeroes@absl@@YA?AVcrc32c_t@1@V21@_K@Z + ?ExtendCrc32cInternal@crc_internal@absl@@YA?AVcrc32c_t@2@V32@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ExtendTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NXZ + ?ExtractAppendBuffer@CordRepBtree@cord_internal@absl@@SA?AUExtractResult@CordRep@23@PEAV123@_K@Z + ?ExtractFront@CordRepBtree@cord_internal@absl@@CAPEAUCordRep@23@PEAV123@@Z + ?FDivDuration@absl@@YANVDuration@1@0@Z + ?FLAGS_noflagfile@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FLAGS_nofromenv@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FLAGS_notryfromenv@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FLAGS_noundefok@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FNMatch@log_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?FailQuietly@LogMessage@log_internal@absl@@KAXXZ + ?FailWithoutStackTrace@LogMessage@log_internal@absl@@KAXXZ + ?FailedPreconditionError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FailureSignalToString@debugging_internal@absl@@YAPEBDH@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEADHPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEADIPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_JPEAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_KPEAD@Z + ?Fer@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?Filename@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?FillParentStack@CordzInfo@cord_internal@absl@@CA_KPEBV123@PEAPEAX@Z + ?FillWordTable@CRCImpl@crc_internal@absl@@SAXIIHPEAY0BAA@I@Z + ?FillZeroesTable@CRCImpl@crc_internal@absl@@SAHIPEAY0BAA@I@Z + ?FinalizeEncodingAndFormat@LogMessageData@LogMessage@log_internal@absl@@QEAAXXZ + ?FinalizeRegistry@flags_internal@absl@@YAXXZ + ?Find@ByAnyChar@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByAsciiWhitespace@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByChar@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByLength@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@ByString@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@_K@Z + ?Find@Cord@absl@@QEBA?AVCharIterator@12@AEBV12@@Z + ?Find@Cord@absl@@QEBA?AVCharIterator@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindCommandLineFlag@absl@@YAPEAVCommandLineFlag@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindFlag@FlagRegistry@flags_internal@absl@@QEAAPEAVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindFlatStartPiece@InlineRep@Cord@absl@@QEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?FindImpl@Cord@absl@@AEBA?AVCharIterator@12@V312@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindLongestCommonPrefix@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@0@Z + ?FindLongestCommonSuffix@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@0@Z + ?FindPath@GraphCycles@synchronization_internal@absl@@QEBAHUGraphId@23@0HQEAU423@@Z + ?FiveToTheNth@?$BigUnsigned@$03@strings_internal@absl@@SA?AV123@H@Z + ?FiveToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@SA?AV123@H@Z + ?FixUpStack@internal_stacktrace@absl@@YAXPEAPEAXPEA_KPEAH_KAEA_K@Z + ?FixedOffsetFromName@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FixedOffsetToAbbr@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FixedOffsetToName@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FlagHelp@flags_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCommandLineFlag@2@W4HelpFormat@12@@Z + ?FlagsHelp@flags_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@W4HelpFormat@12@1@Z + ?FlagsToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4Flags@12@@Z + ?FlatOverhead@CordTestAccess@strings_internal@absl@@SA_KXZ + ?FlatTagToLength@CordTestAccess@strings_internal@absl@@SA_KE@Z + ?FlattenSlowPath@Cord@absl@@AEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Floor@absl@@YA?AVDuration@1@V21@0@Z + ?Flush@LogMessage@log_internal@absl@@QEAAXXZ + ?Flush@LogSink@absl@@UEAAXXZ + ?FlushLogSinks@log_internal@absl@@YAXXZ + ?ForEachChunkAux@Cord@absl@@CAXPEAUCordRep@cord_internal@2@V?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z@2@@Z + ?ForEachFlag@flags_internal@absl@@YAXV?$function@$$A6AXAEAVCommandLineFlag@absl@@@Z@__Cr@std@@@Z + ?ForEachPayload@StatusRep@status_internal@absl@@QEBAXV?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCord@absl@@@Z@3@@Z + ?ForVar2@CheckOpMessageBuilder@log_internal@absl@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?ForcedTrySample@container_internal@absl@@YA?AVHashtablezInfoHandle@12@_K00G@Z + ?ForgetDeadlockInfo@Mutex@absl@@QEAAXXZ + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatConversionCharToConvInt@str_format_internal@absl@@YA_KD@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0BPPPL@@12@DVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0BPPPL@@12@_WVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAA@@12@UVoidPtr@12@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@$$TVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@PEBDVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@PEB_WVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@AEBV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@MVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@NVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@OVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@CVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@EVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@FVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@GVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@HVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@IVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@JVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@KVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@Vint128@2@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@Vuint128@2@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@_JVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@_KVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z + ?FormatDuration@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?FormatLogMessage@log_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LogSeverity@2@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@2@VDuration@2@IV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@HW4PrefixFormat@12@3@Z + ?FormatLogPrefix@log_internal@absl@@YA_KW4LogSeverity@2@VTime@2@IV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4PrefixFormat@12@AEAV?$Span@D@2@@Z + ?FormatPack@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@VTime@1@VTimeZone@1@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@VTimeZone@1@@Z + ?FormatUntyped@str_format_internal@absl@@YA_NVFormatRawSinkImpl@12@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?FprintF@str_format_internal@absl@@YAHPEAU_iobuf@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?Free@LowLevelAlloc@base_internal@absl@@SAXPEAX@Z + ?Frequency@UnscaledCycleClock@base_internal@absl@@CANXZ + ?FromChrono@absl@@YA?AVTime@1@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?FromTM@absl@@YA?AVTime@1@AEBUtm@@VTimeZone@1@@Z + ?FromUDate@absl@@YA?AVTime@1@N@Z + ?FromUniversal@absl@@YA?AVTime@1@_J@Z + ?Generate@RandenHwAes@random_internal@absl@@SAXPEBXPEAX@Z + ?Generate@RandenSlow@random_internal@absl@@SAXPEBXPEAX@Z + ?Get@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@AEBA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ + ?GetAllFlags@absl@@YA?AV?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@23@@1@XZ + ?GetAndroidNativeTag@log_internal@absl@@YAPEBDXZ + ?GetAppendBuffer@CordRepBtree@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z + ?GetAppendBufferSlow@CordRepBtree@cord_internal@absl@@AEAA?AV?$Span@D@3@_K@Z + ?GetAppendBufferSlowPath@Cord@absl@@AEAA?AVCordBuffer@2@_K00@Z + ?GetArchSpecificEngines@CrcMemcpy@crc_internal@absl@@CA?AUArchSpecificEngines@123@XZ + ?GetCachedTID@base_internal@absl@@YAIXZ + ?GetCharacter@CordRepBtree@cord_internal@absl@@QEBAD_K@Z + ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ + ?GetCpuType@crc_internal@absl@@YA?AW4CpuType@12@XZ + ?GetCurrentTimeNanos@absl@@YA_JXZ + ?GetDebugStackTraceHook@debugging_internal@absl@@YAP6AXQEBQEAXHP6AXPEBDPEAX@Z2@ZXZ + ?GetEntropyFromRandenPool@random_internal@absl@@YAXPEAX_K@Z + ?GetEstimatedFairShareMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetEstimatedMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetFlagsHelpFormat@flags_internal@absl@@YA?AW4HelpFormat@12@XZ + ?GetFlagsHelpMatchSubstr@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?GetFlagsHelpMode@flags_internal@absl@@YA?AW4HelpMode@12@XZ + ?GetFlatAux@Cord@absl@@CA_NPEAUCordRep@cord_internal@2@PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?GetHashtablezMaxSamples@container_internal@absl@@YA_KXZ + ?GetHashtablezSampleParameter@container_internal@absl@@YAHXZ + ?GetId@GraphCycles@synchronization_internal@absl@@QEAA?AUGraphId@23@PEAX@Z + ?GetKeys@RandenHwAes@random_internal@absl@@SAPEBXXZ + ?GetKeys@RandenSlow@random_internal@absl@@SAPEBXXZ + ?GetMisspellingHints@flags_internal@absl@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?GetMorePreciseMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z + ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PEBV123@@Z + ?GetParentStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ + ?GetPayload@StatusRep@status_internal@absl@@QEBA?AV?$optional@VCord@absl@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@@Z + ?GetProgramCounter@debugging_internal@absl@@YAPEAXQEAX@Z + ?GetRefForEmptyClass@container_internal@absl@@YAPEAXAEAVCommonFields@12@@Z + ?GetSaltMaterial@random_internal@absl@@YA?AV?$optional@I@__Cr@std@@XZ + ?GetSkipCount@ExponentialBiased@profiling_internal@absl@@QEAA_J_J@Z + ?GetStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ + ?GetStackFrames@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHH@Z + ?GetStackFramesWithContext@internal_stacktrace@absl@@YAHPEAPEAXPEA_KPEAHHHPEBX2@Z + ?GetStackTrace@GraphCycles@synchronization_internal@absl@@QEAAHUGraphId@23@PEAPEAPEAX@Z + ?GetStackTrace@absl@@YAHPEAPEAXHH@Z + ?GetStackTraceWithContext@absl@@YAHPEAPEAXHHPEBXPEAH@Z + ?GetStatusPayloadPrinter@status_internal@absl@@YAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@AEBVCord@2@@ZXZ + ?GetStride@ExponentialBiased@profiling_internal@absl@@QEAA_J_J@Z + ?GetTID@base_internal@absl@@YAIXZ + ?GetTestEngine@CrcMemcpy@crc_internal@absl@@SA?AV?$unique_ptr@VCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@HH@Z + ?GetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAPEAU?$atomic@H@__Cr@std@@XZ + ?GetTransitionType@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NH_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAE@Z + ?GetUsageConfig@flags_internal@absl@@YA?AUFlagsUsageConfig@2@XZ + ?GetWord@?$BigUnsigned@$03@strings_internal@absl@@QEBAIH@Z + ?GetWord@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAIH@Z + ?GlobalHashtablezSampler@container_internal@absl@@YAAEAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?GlobalList@CordzInfo@cord_internal@absl@@CAPEAUList@123@XZ + ?GlobalRegistry@FlagRegistry@flags_internal@absl@@SAAEAV123@XZ + ?GuaranteedEqual@Condition@absl@@SA_NPEBV12@0@Z + ?HandleInvalidStatusCtorArg@Helper@internal_statusor@absl@@SAXPEAVStatus@3@@Z + ?HandleUsageFlags@flags_internal@absl@@YA?AW4HelpMode@12@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@@Z + ?HasBeenNotifiedInternal@Notification@absl@@CA_NPEBU?$atomic@_N@__Cr@std@@@Z + ?HasBeenRead@MaskedPointer@flags_internal@absl@@QEBA_NXZ + ?HasEdge@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z + ?HasNode@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@@Z + ?HasRandenHwAesImplementation@random_internal@absl@@YA_NXZ + ?HaveLeakSanitizer@absl@@YA_NXZ + ?Head@CordzInfo@cord_internal@absl@@SAPEAV123@AEBVCordzSnapshot@23@@Z + ?Help@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?HexStringToBytes@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?IDivDuration@absl@@YA_JVDuration@1@0PEAV21@@Z + ?In@Time@absl@@QEBA?AUBreakdown@12@VTimeZone@2@@Z + ?InMillisecondsFromNow@KernelTimeout@synchronization_internal@absl@@QEBAKXZ + ?InNanosecondsFromNow@KernelTimeout@synchronization_internal@absl@@AEBA_JXZ + ?IncrementSynchSem@Mutex@absl@@CAXPEAV12@PEAUPerThreadSynch@base_internal@2@@Z + ?Init@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCordRepBtree@23@@Z + ?Init@FlagImpl@flags_internal@absl@@AEAAXXZ + ?InitDiscreteDistribution@random_internal@absl@@YA?AV?$vector@U?$pair@N_K@__Cr@std@@V?$allocator@U?$pair@N_K@__Cr@std@@@23@@__Cr@std@@PEAV?$vector@NV?$allocator@N@__Cr@std@@@45@@Z + ?InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAXAEBV123@@Z + ?InitSigSafeArena@base_internal@absl@@YAXXZ + ?InitTables@CRC32@crc_internal@absl@@UEAAXXZ + ?InitTree@ChunkIterator@Cord@absl@@AEAAXPEAUCordRep@cord_internal@3@@Z + ?InitWhat@BadStatusOrAccess@absl@@AEBAXXZ + ?Initialize@ExponentialBiased@profiling_internal@absl@@AEAAXXZ + ?InitializeCordRepExternal@cord_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAUCordRepExternal@12@@Z + ?InitializeEncodingAndFormat@LogMessageData@LogMessage@log_internal@absl@@QEAAXXZ + ?InitializeLog@absl@@YAXXZ + ?InitializeSymbolizer@absl@@YAXPEBD@Z + ?InsertEdge@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@0@Z + ?InstallFailureSignalHandler@absl@@YAXAEBUFailureSignalHandlerOptions@1@@Z + ?InternalAttemptToUseMutexInFatalSignalHandler@Mutex@absl@@SAXXZ + ?InternalCondVarPoke@StdcppWaiter@synchronization_internal@absl@@AEAAXXZ + ?InternalCondVarPoke@Win32Waiter@synchronization_internal@absl@@AEAAXXZ + ?InternalError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?InvalidArgumentError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?InvokeCallback@FlagImpl@flags_internal@absl@@QEBAXXZ + ?IsAborted@absl@@YA_NAEBVStatus@1@@Z + ?IsAlreadyExists@absl@@YA_NAEBVStatus@1@@Z + ?IsCancelled@absl@@YA_NAEBVStatus@1@@Z + ?IsCordBtreeExhaustiveValidationEnabled@cord_internal@absl@@YA_NXZ + ?IsDataLoss@absl@@YA_NAEBVStatus@1@@Z + ?IsDeadlineExceeded@absl@@YA_NAEBVStatus@1@@Z + ?IsFailedPrecondition@absl@@YA_NAEBVStatus@1@@Z + ?IsFatal@LogMessage@log_internal@absl@@AEBA_NXZ + ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_NPEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_N_K0PEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?IsHashtablezEnabled@container_internal@absl@@YA_NXZ + ?IsInitialized@log_internal@absl@@YA_NXZ + ?IsInternal@absl@@YA_NAEBVStatus@1@@Z + ?IsInvalidArgument@absl@@YA_NAEBVStatus@1@@Z + ?IsNotFound@absl@@YA_NAEBVStatus@1@@Z + ?IsOutOfRange@absl@@YA_NAEBVStatus@1@@Z + ?IsPermissionDenied@absl@@YA_NAEBVStatus@1@@Z + ?IsReachable@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z + ?IsResourceExhausted@absl@@YA_NAEBVStatus@1@@Z + ?IsRetired@CommandLineFlag@absl@@UEBA_NXZ + ?IsSpecifiedOnCommandLine@FlagImpl@flags_internal@absl@@EEBA_NXZ + ?IsSpecifiedOnCommandLine@PrivateHandleAccessor@flags_internal@absl@@SA_NAEBVCommandLineFlag@3@@Z + ?IsUnauthenticated@absl@@YA_NAEBVStatus@1@@Z + ?IsUnavailable@absl@@YA_NAEBVStatus@1@@Z + ?IsUnimplemented@absl@@YA_NAEBVStatus@1@@Z + ?IsUnknown@absl@@YA_NAEBVStatus@1@@Z + ?IsUnprotectedReadCandidate@MaskedPointer@flags_internal@absl@@QEBA_NXZ + ?IsValid@CordRepBtree@cord_internal@absl@@SA_NPEBV123@_N@Z + ?IterateOverFullSlots@container_internal@absl@@YAXAEBVCommonFields@12@_KV?$FunctionRef@$$A6AXPEBW4ctrl_t@container_internal@absl@@PEAX@Z@2@@Z + ?KeyFunction@LogSink@absl@@EEBAXXZ + ?LeakCheckerIsActive@absl@@YA_NXZ + ?LengthModToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LengthMod@2@@Z + ?LengthToTag@CordTestAccess@strings_internal@absl@@SAE_K@Z + ?Load@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?Load@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NPEAVZoneInfoSource@234@@Z + ?LoadTimeZone@Impl@time_zone@cctz@time_internal@absl@@SA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAV2345@@Z + ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransition@234@@Z + ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransitionType@234@@Z + ?Lock@CordzInfo@cord_internal@absl@@QEAAXW4MethodIdentifier@CordzUpdateTracker@23@@Z + ?LockSlow@Mutex@absl@@AEAAXPEBUMuHowS@2@PEBVCondition@2@H@Z + ?LockSlowLoop@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@H@Z + ?LockSlowWithDeadline@Mutex@absl@@AEAA_NPEBUMuHowS@2@PEBVCondition@2@VKernelTimeout@synchronization_internal@2@H@Z + ?LockWhenCommon@Mutex@absl@@AEAA_NAEBVCondition@2@VKernelTimeout@synchronization_internal@2@_N@Z + ?LogBacktraceIfNeeded@LogMessage@log_internal@absl@@AEAAXXZ + ?LogFatalNodeType@cord_internal@absl@@YAXPEAUCordRep@12@@Z + ?LogToSinks@log_internal@absl@@YAXAEBVLogEntry@2@V?$Span@PEAVLogSink@absl@@@2@_N@Z + ?Make@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?Make@TimeZoneInfo@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?Make@TimeZoneLibC@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?MakeAbsNanos@KernelTimeout@synchronization_internal@absl@@QEBA_JXZ + ?MakeAbsTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ + ?MakeCheckFailString@status_internal@absl@@YAPEBDPEBVStatus@2@PEBD@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@C@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEBX@Z + ?MakeInitValue@FlagImpl@flags_internal@absl@@AEBA?AV?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@XZ + ?MakeRelativeTimespec@KernelTimeout@synchronization_internal@absl@@QEBA?AUtimespec@@XZ + ?MakeSeedSeq@absl@@YA?AV?$SaltedSeedSeq@Vseed_seq@__Cr@std@@@random_internal@1@XZ + ?MakeTime@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?MakeTime@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?MapToLocalCode@status_internal@absl@@YA?AW4StatusCode@2@H@Z + ?MarkAsRead@MaskedPointer@flags_internal@absl@@QEAAXXZ + ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@AEBA_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z + ?MaxFlatLength@CordTestAccess@strings_internal@absl@@SA_KXZ + ?MaxFramesInLogStackTrace@log_internal@absl@@YAHXZ + ?MaybeBecomeIdle@WaiterBase@synchronization_internal@absl@@KAXXZ + ?MaybeExit@flags_internal@absl@@YAXW4HelpMode@12@@Z + ?MaybeGetCrcCordState@Cord@absl@@AEBAPEBVCrcCordState@crc_internal@2@XZ + ?MaybeTrackCordImpl@CordzInfo@cord_internal@absl@@CAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?MemcpyCrc32c@absl@@YA?AVcrc32c_t@1@PEAXPEBX_KV21@@Z + ?MergeTrees@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@0@Z + ?MinLogLevel@absl@@YA?AW4LogSeverityAtLeast@1@XZ + ?MixIntoSeedMaterial@random_internal@absl@@YAXV?$Span@$$CBI@2@V?$Span@I@2@@Z + ?ModificationCount@FlagImpl@flags_internal@absl@@AEBA_JXZ + ?MovedFromString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBI@Z + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QEAAXI@Z + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QEAAX_K@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHPEBI@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXI@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAX_K@Z + ?MultiplyByFiveToTheNth@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?MultiplyByFiveToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?MultiplyByTenToTheNth@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?MultiplyByTenToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?MultiplyStep@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBIHH@Z + ?MultiplyStep@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXHPEBIHH@Z + ?MutexDelay@synchronization_internal@absl@@YAHHH@Z + ?Name@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?New@CordRepCrc@cord_internal@absl@@SAPEAU123@PEAUCordRep@23@VCrcCordState@crc_internal@3@@Z + ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@I@Z + ?NewCRC32AcceleratedX86ARMCombinedAll@crc_internal@absl@@YA?AV?$vector@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@XZ + ?NewInternal@CRCImpl@crc_internal@absl@@SAPEAV123@XZ + ?NewString@CheckOpMessageBuilder@log_internal@absl@@QEAAPEBDXZ + ?Next@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z + ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z + ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?NextUp@CordRepBtreeNavigator@cord_internal@absl@@AEAAPEAUCordRep@23@XZ + ?NoPrefix@LogMessage@log_internal@absl@@QEAAAEAV123@XZ + ?NominalCPUFrequency@base_internal@absl@@YANXZ + ?Normalize@CrcCordState@crc_internal@absl@@QEAAXXZ + ?NormalizedPrefixCrcAtNthChunk@CrcCordState@crc_internal@absl@@QEBA?AUPrefixCrc@123@_K@Z + ?NotFoundError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Notify@Notification@absl@@QEAAXXZ + ?Now@CycleClock@base_internal@absl@@SA_JXZ + ?Now@absl@@YA?AVTime@1@XZ + ?NumCPUs@base_internal@absl@@YAHXZ + ?NumLeakedFlagValues@flags_internal@absl@@YA_KXZ + ?OnVLogVerbosityUpdate@log_internal@absl@@YAXV?$function@$$A6AXXZ@__Cr@std@@@Z + ?OneTimeInitThreadIdentity@synchronization_internal@absl@@YAXPEAUThreadIdentity@base_internal@2@@Z + ?OneWordValue@FlagImpl@flags_internal@absl@@AEBAAEAU?$atomic@_J@__Cr@std@@XZ + ?OutOfRangeError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ParseAbseilFlagsOnly@absl@@YAXHQEAPEADAEAV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@AEAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@34@@Z + ?ParseAbseilFlagsOnlyImpl@flags_internal@absl@@YA?AW4HelpMode@12@HQEAPEADAEAV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@AEAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@56@W4UsageFlagsAction@12@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCommandLine@absl@@YA?AV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@HQEAPEAD@Z + ?ParseCommandLineImpl@flags_internal@absl@@YA?AV?$vector@PEADV?$allocator@PEAD@__Cr@std@@@__Cr@std@@HQEAPEADW4UsageFlagsAction@12@W4OnUndefinedFlag@12@AEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@45@@Z + ?ParseDigits@str_format_internal@absl@@YAHAEADAEAPEBDQEBD@Z + ?ParseDuration@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVDuration@1@@Z + ?ParseFlag@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVDuration@1@PEAV234@@Z + ?ParseFlag@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVTime@1@PEAV234@@Z + ?ParseFrom@CommandLineFlag@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?ParseFrom@FlagImpl@flags_internal@absl@@EEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4FlagSettingMode@23@W4ValueSource@23@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?ParseFrom@PrivateHandleAccessor@flags_internal@absl@@SA_NAEAVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4FlagSettingMode@23@W4ValueSource@23@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParsePosixSpec@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAUPosixTimeZone@123@@Z + ?ParseTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?ParseTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0VTimeZone@1@PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?PermissionDeniedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Poison@CrcCordState@crc_internal@absl@@QEAAXXZ + ?Poke@StdcppWaiter@synchronization_internal@absl@@QEAAXXZ + ?Poke@Win32Waiter@synchronization_internal@absl@@QEAAXXZ + ?Post@StdcppWaiter@synchronization_internal@absl@@QEAAXXZ + ?Post@Win32Waiter@synchronization_internal@absl@@QEAAXXZ + ?PrepareForSampling@HashtablezInfo@container_internal@absl@@QEAAX_J_K11G@Z + ?PrepareInsertLarge@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@@Z + ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YA_KAEAVCommonFields@12@AEBUPolicyFunctions@12@_KV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareInsertSmallNonSoo@container_internal@absl@@YA?AU?$pair@PEAW4ctrl_t@container_internal@absl@@PEAX@__Cr@std@@AEAVCommonFields@12@AEBUPolicyFunctions@12@V?$FunctionRef@$$A6A_K_K@Z@2@@Z + ?PrepareToDie@LogMessage@log_internal@absl@@AEAAXXZ + ?PrepareToModify@Status@absl@@CAPEAVStatusRep@status_internal@2@_K@Z + ?Prepend@Cord@absl@@QEAAXAEBV12@@Z + ?Prepend@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?PrependArray@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?PrependPrecise@Cord@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?PrependSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z + ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependVModule@log_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?PrevTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z + ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@time_zone@234@@Z + ?Print@Streamable@str_format_internal@absl@@QEBAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEAV456@@Z + ?PrintTo@absl@@YAXAEBVLogEntry@1@PEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ProgramUsageMessage@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Ptr@GraphCycles@synchronization_internal@absl@@QEAAPEAXUGraphId@23@@Z + ?PtrStorage@FlagImpl@flags_internal@absl@@AEBAAEAU?$atomic@VMaskedPointer@flags_internal@absl@@@__Cr@std@@XZ + ?PutPaddedString@FormatSinkImpl@str_format_internal@absl@@QEAA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HH_N@Z + ?PutTwoDigits@numbers_internal@absl@@YAXIPEAD@Z + ?RawEnableLogPrefix@log_internal@absl@@YAX_N@Z + ?RawLog@raw_log_internal@absl@@YAXW4LogSeverity@2@PEBDH1ZZ + ?RawLoggingFullySupported@raw_log_internal@absl@@YA_NXZ + ?RawSetMinLogLevel@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z + ?RawSetStderrThreshold@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z + ?Read@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUReadResult@123@_K0@Z + ?Read@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K0AEAPEAUCordRep@23@@Z + ?Read@FlagImpl@flags_internal@absl@@UEBAXPEAX@Z + ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AEAAHPEBD0H@Z + ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAHPEBD0H@Z + ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z + ?ReadFloatMantissa@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z + ?ReadOneBool@FlagImpl@flags_internal@absl@@QEBA_NXZ + ?ReadOneWord@FlagImpl@flags_internal@absl@@QEBA_JXZ + ?ReadSeedMaterialFromOSEntropy@random_internal@absl@@YA_NV?$Span@I@2@@Z + ?ReadSequenceLockedData@FlagImpl@flags_internal@absl@@AEBAXPEAX@Z + ?ReaderTryLockSlow@Mutex@absl@@AEAA_NXZ + ?Rebuild@CordRepBtree@cord_internal@absl@@CAXPEAPEAV123@PEAV123@_N@Z + ?Rebuild@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@@Z + ?RecordClearedReservationSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?RecordEraseSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?RecordInsertSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K1@Z + ?RecordRehashSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K@Z + ?RecordReservationSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K@Z + ?RecordStorageChangedSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K1@Z + ?RefSharedEmptyRep@CrcCordState@crc_internal@absl@@CAPEAURefcountedRep@123@XZ + ?Register@CycleClockSource@base_internal@absl@@CAXP6A_JXZ@Z + ?RegisterAbortHook@raw_log_internal@absl@@YAXP6AXPEBDH000@Z@Z + ?RegisterAndInitialize@log_internal@absl@@YAHPEAVVLogSite@12@@Z + ?RegisterCommandLineFlag@flags_internal@absl@@YA_NAEAVCommandLineFlag@2@PEBD@Z + ?RegisterCondVarTracer@absl@@YAXP6AXPEBDPEBX@Z@Z + ?RegisterDebugStackTraceHook@debugging_internal@absl@@YAXP6AXQEBQEAXHP6AXPEBDPEAX@Z2@Z@Z + ?RegisterFlag@FlagRegistry@flags_internal@absl@@QEAAXAEAVCommandLineFlag@3@PEBD@Z + ?RegisterInternalLogFunction@raw_log_internal@absl@@YAXP6AXW4LogSeverity@2@PEBDHAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@Z + ?RegisterLivePointers@absl@@YAXPEBX_K@Z + ?RegisterLogFilterAndPrefixHook@raw_log_internal@absl@@YAXP6A_NW4LogSeverity@2@PEBDHPEAPEADPEAH@Z@Z + ?RegisterMutexProfiler@absl@@YAXP6AX_J@Z@Z + ?RegisterMutexTracer@absl@@YAXP6AXPEBDPEBX_J@Z@Z + ?RegisterSpinLockProfiler@base_internal@absl@@YAXP6AXPEBX_J@Z@Z + ?Rehash@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?Release@ReleasableMutexLock@absl@@QEAAXXZ + ?Remove@CondVar@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?RemoveCrc32cPrefix@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?RemoveCrc32cSuffix@absl@@YA?AVcrc32c_t@1@V21@0_K@Z + ?RemoveEdge@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@0@Z + ?RemoveExtraAsciiWhitespace@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?RemoveLogSink@log_internal@absl@@YAXPEAVLogSink@2@@Z + ?RemoveNode@GraphCycles@synchronization_internal@absl@@QEAAXPEAX@Z + ?RemovePrefix@Cord@absl@@QEAAX_K@Z + ?RemoveSuffix@Cord@absl@@QEAAX_K@Z + ?RemoveSuffix@CordRepBtree@cord_internal@absl@@SAPEAUCordRep@23@PEAV123@_K@Z + ?ReportUnrecognizedFlags@absl@@YAXAEBV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@@Z + ?ReportUsageError@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_N@Z + ?ReserveEmptyNonAllocatedTableToFitBucketCount@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?ReserveTableToFitNewSize@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?ResetToBuiltinUTC@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z + ?ResizeAllocatedTableWithSeedChange@container_internal@absl@@YAXAEAVCommonFields@12@AEBUPolicyFunctions@12@_K@Z + ?ResourceExhaustedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Restore@FlagState@flags_internal@absl@@EEHAAXXZ + ?RestoreState@FlagImpl@flags_internal@absl@@AEAA_NAEBVFlagState@23@@Z + ?Retire@flags_internal@absl@@YAXPEBDPEBXPEAE@Z + ?ReverseConsume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z + ?SafeToDelete@CordzHandle@cord_internal@absl@@QEBA_NXZ + ?SampleSlow@container_internal@absl@@YAPEAUHashtablezInfo@12@AEAUSamplingState@12@_K11G@Z + ?SaveState@FlagImpl@flags_internal@absl@@EEAA?AV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?SaveState@PrivateHandleAccessor@flags_internal@absl@@SA?AV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AEAVCommandLineFlag@3@@Z + ?Scramble@CRC32@crc_internal@absl@@UEBAXPEAI@Z + ?Seek@CordRepBtreeReader@cord_internal@absl@@QEAA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z + ?SendToLog@LogMessage@log_internal@absl@@AEAAXXZ + ?Set@MaskedPointer@flags_internal@absl@@QEAAXP6APEAXW4FlagOp@23@PEBXPEAX2@Z1_N@Z + ?SetAndroidNativeTag@absl@@YAXPEBD@Z + ?SetCallback@FlagImpl@flags_internal@absl@@QEAAXQ6AXXZ@Z + ?SetCordBtreeExhaustiveValidation@cord_internal@absl@@YAX_N@Z + ?SetCrcCordState@Cord@absl@@AEAAXVCrcCordState@crc_internal@2@@Z + ?SetCurrentThreadIdentity@base_internal@absl@@YAXPEAUThreadIdentity@12@P6AXPEAX@Z@Z + ?SetExitOnDFatal@log_internal@absl@@YAX_N@Z + ?SetExpectedChecksum@Cord@absl@@QEAAXI@Z + ?SetFailQuietly@LogMessage@log_internal@absl@@IEAAXXZ + ?SetFlagsHelpFormat@flags_internal@absl@@YAXW4HelpFormat@12@@Z + ?SetFlagsHelpMatchSubstr@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetFlagsHelpMode@flags_internal@absl@@YAXW4HelpMode@12@@Z + ?SetFlagsUsageConfig@absl@@YAXUFlagsUsageConfig@1@@Z + ?SetHashtablezConfigListener@container_internal@absl@@YAXP6AXXZ@Z + ?SetHashtablezEnabled@container_internal@absl@@YAX_N@Z + ?SetHashtablezEnabledInternal@container_internal@absl@@YAX_N@Z + ?SetHashtablezMaxSamples@container_internal@absl@@YAX_K@Z + ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAX_K@Z + ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z + ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z + ?SetInitialized@log_internal@absl@@YAXXZ + ?SetLogBacktraceLocation@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?SetLoggingGlobalsListener@log_internal@absl@@YAXP6AXXZ@Z + ?SetMaxFramesInLogStackTrace@log_internal@absl@@YAXH@Z + ?SetMinLogLevel@absl@@YAXW4LogSeverityAtLeast@1@@Z + ?SetMutexDeadlockDetectionMode@absl@@YAXW4OnDeadlockCycle@1@@Z + ?SetPayload@StatusRep@status_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VCord@3@@Z + ?SetProgramInvocationName@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetProgramUsageMessage@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetStackUnwinder@absl@@YAXP6AHPEAPEAXPEAHHHPEBX1@Z@Z + ?SetStatusPayloadPrinter@status_internal@absl@@YAXP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@AEBVCord@2@@Z@Z + ?SetStderrThreshold@absl@@YAXW4LogSeverityAtLeast@1@@Z + ?SetSuppressSigabortTrace@log_internal@absl@@YA_N_N@Z + ?SetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAXPEAU?$atomic@H@__Cr@std@@@Z + ?SetTimeZone@log_internal@absl@@YAXVTimeZone@2@@Z + ?SetToZero@?$BigUnsigned@$03@strings_internal@absl@@QEAAXXZ + ?SetToZero@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXXZ + ?SetVModuleListHeadForTestOnly@log_internal@absl@@YAPEAVVLogSite@12@PEAV312@@Z + ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z + ?ShiftLeft@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z + ?ShortProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ShouldFixUpStack@internal_stacktrace@absl@@YA_NXZ + ?ShouldLog@LogEveryNSecState@log_internal@absl@@QEAA_NN@Z + ?ShouldLog@LogEveryNState@log_internal@absl@@QEAA_NH@Z + ?ShouldLog@LogEveryPow2State@log_internal@absl@@QEAA_NXZ + ?ShouldLog@LogFirstNState@log_internal@absl@@QEAA_NH@Z + ?ShouldLogBacktraceAt@log_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?ShouldPrependLogPrefix@absl@@YA_NXZ + ?ShouldSymbolizeLogStackTrace@log_internal@absl@@YA_NXZ + ?SigSafeArena@base_internal@absl@@YAPEAUArena@LowLevelAlloc@12@XZ + ?Signal@CondVar@absl@@QEAAXXZ + ?SignalAll@CondVar@absl@@QEAAXXZ + ?SimpleAtob@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_N@Z + ?SimpleAtod@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAN@Z + ?SimpleAtof@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAM@Z + ?SixDigitsToBuffer@numbers_internal@absl@@YA_KNPEAD@Z + ?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SA_KXZ + ?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SA_KXZ + ?Skip@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUPosition@123@_K@Z + ?SlowIsEnabled0@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled1@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled2@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled3@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled4@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled5@VLogSite@log_internal@absl@@AEAA_NH@Z + ?SlowIsEnabled@VLogSite@log_internal@absl@@AEAA_NHH@Z + ?SlowLock@SpinLock@base_internal@absl@@AEAAXXZ + ?SlowUnlock@SpinLock@base_internal@absl@@AEAAXI@Z + ?SnprintF@str_format_internal@absl@@YAHPEAD_KVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?SpinLockSuggestedDelayNS@base_internal@absl@@YAHH@Z + ?SpinLockWait@base_internal@absl@@YAIPEAU?$atomic@I@__Cr@std@@HQEBUSpinLockWaitTransition@12@W4SchedulingMode@12@@Z + ?SpinLoop@SpinLock@base_internal@absl@@AEAAIXZ + ?StackTraceWorksForTest@debugging_internal@absl@@YA_NXZ + ?StartsWithIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StatusCodeToString@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusCode@1@@Z + ?StatusMessageAsCStr@absl@@YAPEBDAEBVStatus@1@@Z + ?StderrThreshold@absl@@YA?AW4LogSeverityAtLeast@1@XZ + ?SteadyClockNow@KernelTimeout@synchronization_internal@absl@@CA_JXZ + ?StoreValue@FlagImpl@flags_internal@absl@@AEAAXPEBXW4ValueSource@23@@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@111@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@11@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@1@Z + ?StrAppend@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@000@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@00@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBVAlphaNum@1@0@Z + ?StrContainsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StrContainsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?StrError@base_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?StrReplaceAll@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@4@@Z + ?StrReplaceAll@absl@@YAHV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@3@@Z + ?SubTree@CordRepBtree@cord_internal@absl@@QEAAPEAUCordRep@23@_K0@Z + ?Subcord@Cord@absl@@QEBA?AV12@_K0@Z + ?SubstituteAndAppendArray@substitute_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@PEBV645@_K@Z + ?Summarize@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?SupportsArmCRC32PMULL@crc_internal@absl@@YA_NXZ + ?SuppressSigabortTrace@log_internal@absl@@YA_NXZ + ?Symbolize@absl@@YA_NPEBXPEADH@Z + ?TestOnlyAddNodes@GraphCycles@synchronization_internal@absl@@QEAAXI@Z + ?TestOnlyRefreshSamplingStateForCurrentThread@container_internal@absl@@YAXXZ + ?ThreadIsLoggingToLogSink@log_internal@absl@@YA_NXZ + ?ThrowBadStatusOrAccess@internal_statusor@absl@@YAXVStatus@2@@Z + ?ThrowSeedGenException@random_internal@absl@@YAXXZ + ?ThrowStdBadAlloc@base_internal@absl@@YAXXZ + ?ThrowStdBadFunctionCall@base_internal@absl@@YAXXZ + ?ThrowStdDomainError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdDomainError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdInvalidArgument@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdInvalidArgument@base_internal@absl@@YAXPEBD@Z + ?ThrowStdLengthError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdLengthError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdLogicError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdLogicError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdOutOfRange@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdOutOfRange@base_internal@absl@@YAXPEBD@Z + ?ThrowStdOverflowError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdOverflowError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdRangeError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdRangeError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdRuntimeError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdRuntimeError@base_internal@absl@@YAXPEBD@Z + ?ThrowStdUnderflowError@base_internal@absl@@YAXAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdUnderflowError@base_internal@absl@@YAXPEBD@Z + ?Tick@PerThreadSem@synchronization_internal@absl@@SAXPEAUThreadIdentity@base_internal@3@@Z + ?TimeFromTimespec@absl@@YA?AVTime@1@Utimespec@@@Z + ?TimeFromTimeval@absl@@YA?AVTime@1@Utimeval@@@Z + ?TimeLocal@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@_J@Z + ?TimeZone@log_internal@absl@@YAPEBV02@XZ + ?ToChronoDuration@KernelTimeout@synchronization_internal@absl@@QEBA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@XZ + ?ToChronoHours@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMicroseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMilliseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0DOI@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMinutes@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoNanoseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoSeconds@absl@@YA?AV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoTime@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@VTime@1@@Z + ?ToChronoTimePoint@KernelTimeout@synchronization_internal@absl@@QEBA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@XZ + ?ToDoubleHours@absl@@YANVDuration@1@@Z + ?ToDoubleMicroseconds@absl@@YANVDuration@1@@Z + ?ToDoubleMilliseconds@absl@@YANVDuration@1@@Z + ?ToDoubleMinutes@absl@@YANVDuration@1@@Z + ?ToDoubleNanoseconds@absl@@YANVDuration@1@@Z + ?ToDoubleSeconds@absl@@YANVDuration@1@@Z + ?ToSinkAlso@LogMessage@log_internal@absl@@QEAAAEAV123@PEAVLogSink@3@@Z + ?ToSinkOnly@LogMessage@log_internal@absl@@QEAAAEAV123@PEAVLogSink@3@@Z + ?ToString@?$BigUnsigned@$03@strings_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@Status@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusToStringMode@2@@Z + ?ToString@StatusRep@status_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusToStringMode@3@@Z + ?ToString@int128@absl@@AEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@uint128@absl@@AEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToStringSlow@Status@absl@@CA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_KW4StatusToStringMode@2@@Z + ?ToTM@absl@@YA?AUtm@@VTime@1@VTimeZone@1@@Z + ?ToTimeT@absl@@YA_JVTime@1@@Z + ?ToTimespec@absl@@YA?AUtimespec@@VDuration@1@@Z + ?ToTimespec@absl@@YA?AUtimespec@@VTime@1@@Z + ?ToTimeval@absl@@YA?AUtimeval@@VDuration@1@@Z + ?ToTimeval@absl@@YA?AUtimeval@@VTime@1@@Z + ?ToUDate@absl@@YANVTime@1@@Z + ?ToUniversal@absl@@YA_JVTime@1@@Z + ?ToUnixMicros@absl@@YA_JVTime@1@@Z + ?ToUnixMillis@absl@@YA_JVTime@1@@Z + ?ToUnixNanos@absl@@YA_JVTime@1@@Z + ?ToUnixSeconds@absl@@YA_JVTime@1@@Z + ?Track@CordzInfo@cord_internal@absl@@AEAAXXZ + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@W4MethodIdentifier@CordzUpdateTracker@23@_J@Z + ?Trans@Mutex@absl@@AEAAXPEBUMuHowS@2@@Z + ?Trunc@absl@@YA?AVDuration@1@V21@0@Z + ?TryLockSlow@Mutex@absl@@AEAA_NXZ + ?TryNewCRC32AcceleratedX86ARMCombined@crc_internal@absl@@YAPEAVCRCImpl@12@XZ + ?TryParse@FlagImpl@flags_internal@absl@@AEBA?AV?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?TryRead@SequenceLock@flags_internal@absl@@QEBA_NPEAXPEBU?$atomic@_K@__Cr@std@@_K@Z + ?TryRemove@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?TypeId@FlagImpl@flags_internal@absl@@EEBAPEBXXZ + ?TypeId@PrivateHandleAccessor@flags_internal@absl@@SAPEBXAEBVCommandLineFlag@3@@Z + ?TypeName@CommandLineFlag@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?TypeName@FlagImpl@flags_internal@absl@@EEBA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?TypeName@PrivateHandleAccessor@flags_internal@absl@@SA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBVCommandLineFlag@3@@Z + ?UTC@Impl@time_zone@cctz@time_internal@absl@@SA?AV2345@XZ + ?UTC@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?UTC@TimeZoneInfo@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?UTCImpl@Impl@time_zone@cctz@time_internal@absl@@CAPEBV12345@XZ + ?UnRegisterLivePointers@absl@@YAXPEBX_K@Z + ?UnauthenticatedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnavailableError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnextendByZeroes@CRC32@crc_internal@absl@@UEBAXPEAI_K@Z + ?UnextendCrc32cByZeroes@crc_internal@absl@@YA?AVcrc32c_t@2@V32@_K@Z + ?UnimplementedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnknownError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Unlock@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UnlockSlow@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@F@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@G@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@M@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@Vint128@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@Vuint128@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_N@Z + ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?Unref@StatusRep@status_internal@absl@@QEBAXXZ + ?UnrefTree@InlineRep@Cord@absl@@AEAAXXZ + ?UnsampleSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?Unscramble@CRC32@crc_internal@absl@@UEBAXPEAI@Z + ?Untrack@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UpdateGlobalVLogLevel@log_internal@absl@@YAHH@Z + ?UpdateStackTrace@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@HP6AHPEAPEAXH@Z@Z + ?UpdateVLogSites@log_internal@absl@@YAXXZ + ?UpdateVModule@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Utf8SafeCEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?Utf8SafeCHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?VLogLevel@log_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ValidateInputValue@FlagImpl@flags_internal@absl@@EEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ValidateInputValue@PrivateHandleAccessor@flags_internal@absl@@SA_NAEBVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Version@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@ZoneInfoSource@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Wait@BlockingCounter@absl@@QEAAXXZ + ?Wait@StdcppWaiter@synchronization_internal@absl@@QEAA_NVKernelTimeout@23@@Z + ?Wait@Win32Waiter@synchronization_internal@absl@@QEAA_NVKernelTimeout@23@@Z + ?WaitCommon@CondVar@absl@@AEAA_NPEAVMutex@2@VKernelTimeout@synchronization_internal@2@@Z + ?WaitForNotification@Notification@absl@@QEBAXXZ + ?WaitForNotificationWithDeadline@Notification@absl@@QEBA_NVTime@2@@Z + ?WaitForNotificationWithTimeout@Notification@absl@@QEBA_NVDuration@2@@Z + ?Wakeup@Mutex@absl@@AEAAPEAUPerThreadSynch@base_internal@2@PEAU342@@Z + ?WasPresentOnCommandLine@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?WebSafeBase64Escape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?WebSafeBase64Escape@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?WebSafeBase64Unescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?WideToUtf8@strings_internal@absl@@YA_K_WPEADAEAUShiftState@12@@Z + ?WithMetadataFrom@LogMessage@log_internal@absl@@QEAAAEAV123@AEBVLogEntry@3@@Z + ?WithPerror@LogMessage@log_internal@absl@@QEAAAEAV123@XZ + ?WithThreadID@LogMessage@log_internal@absl@@QEAAAEAV123@I@Z + ?WithTimestamp@LogMessage@log_internal@absl@@QEAAAEAV123@VTime@3@@Z + ?WithVerbosity@LogMessage@log_internal@absl@@QEAAAEAV123@H@Z + ?Write@BufferRawSink@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@FILERawSink@str_format_internal@absl@@QEAAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@FlagImpl@flags_internal@absl@@QEAAXPEBX@Z + ?WriteToStderr@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4LogSeverity@2@@Z + ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ + ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ + ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAX_K@Z + ?__erase_to_end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@23@@Z + ?__throw_length_error@?$vector@PEAVCommandLineFlag@absl@@V?$allocator@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEBVCommandLineFlag@absl@@V?$allocator@PEBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@CAXXZ + ?combine_contiguous@MixingHashState@hash_internal@absl@@SA?AV123@V123@PEBE_K@Z + ?cycle_clock_source_@CycleClock@base_internal@absl@@0U?$atomic@P6A_JXZ@__Cr@std@@A + ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z + ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?effective_impl@time_zone@cctz@time_internal@absl@@AEBAAEBVImpl@1234@XZ + ?engines@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PEIAXPEIBX_KV54@_N@Z@4UArchSpecificEngines@234@B + ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@AEBV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z + ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV567@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@AEBV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@967@AEBVtime_zone@234@@Z + ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEAMW4chars_format@1@@Z + ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEANW4chars_format@1@@Z + ?get_cordz_mean_interval@cord_internal@absl@@YAHXZ + ?get_weekday@detail@cctz@time_internal@absl@@YA?AW4weekday@1234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@@Z + ?kDefaultIterControl@container_internal@absl@@3W4ctrl_t@12@A + ?load_time_zone@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEAVtime_zone@123@@Z + ?local_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?lock@Mutex@absl@@QEAAXXZ + ?lock_shared@Mutex@absl@@QEAAXXZ + ?lookup@time_zone@cctz@time_internal@absl@@QEBA?AUabsolute_lookup@1234@AEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?lookup@time_zone@cctz@time_internal@absl@@QEBA?AUcivil_lookup@1234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?memcasecmp@strings_internal@absl@@YAHPEBD0_K@Z + ?mutable_rep@CrcCordState@crc_internal@absl@@QEAAPEAURep@123@XZ + ?n_day@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_JC00CCC@Z + ?n_sec@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J00000@Z + ?name@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?next_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@1234@@Z + ?next_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z + ?overflow@Streambuf@OStringStream@strings_internal@absl@@MEAAHH@Z + ?parse@detail@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0AEBVtime_zone@234@PEAV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@PEAV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@chrono@67@PEAV567@@Z + ?prev_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PEAUcivil_transition@1234@@Z + ?prev_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z + ?reserve@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?reserve@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?resize@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?resize@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAX_K@Z + ?safe_strto128_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVint128@2@H@Z + ?safe_strto16_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAFH@Z + ?safe_strto32_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAHH@Z + ?safe_strto64_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_JH@Z + ?safe_strto8_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEACH@Z + ?safe_strtou128_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVuint128@2@H@Z + ?safe_strtou16_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAGH@Z + ?safe_strtou32_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAIH@Z + ?safe_strtou64_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEA_KH@Z + ?safe_strtou8_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAEH@Z + ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z + ?shallow_subcords_enabled@cord_internal@absl@@3U?$atomic@_N@__Cr@std@@A + ?should_rehash_for_bug_detection_on_insert@CommonFieldsGenerationInfoEnabled@container_internal@absl@@QEBA_N_K@Z + ?should_rehash_for_bug_detection_on_move@CommonFieldsGenerationInfoEnabled@container_internal@absl@@QEBA_N_K@Z + ?shrink_to_fit@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXXZ + ?size@?$BigUnsigned@$03@strings_internal@absl@@QEBAHXZ + ?size@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAHXZ + ?size@Cord@absl@@QEBA_KXZ + ?status@BadStatusOrAccess@absl@@QEBAAEBVStatus@2@XZ + ?stream@OstreamView@LogMessage@log_internal@absl@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?transfer_unprobed_elements_to_next_capacity_fn@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CAXAEAVCommonFields@23@PEBW4ctrl_t@23@PEAX2P6AX2E_K3@Z@Z + ?try_lock@Mutex@absl@@QEAA_NXZ + ?try_lock_shared@Mutex@absl@@QEAA_NXZ + ?unlock@Mutex@absl@@QEAAXXZ + ?unlock_shared@Mutex@absl@@QEAAXXZ + ?utc_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?version@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?what@BadStatusOrAccess@absl@@UEBAPEBDXZ + ?what@SeedGenException@absl@@UEBAPEBDXZ + ?words@?$BigUnsigned@$03@strings_internal@absl@@QEBAPEBIXZ + ?words@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBAPEBIXZ + ?xsputn@Streambuf@OStringStream@strings_internal@absl@@MEAA_JPEBD_J@Z + AbslContainerInternalSampleEverything + AbslInternalMutexYield + AbslInternalOnFatalLogMessage + AbslInternalPerThreadSemInit + AbslInternalPerThreadSemPoke + AbslInternalPerThreadSemPost + AbslInternalPerThreadSemWait + AbslInternalReportFatalUsageError + AbslInternalSleepFor + AbslInternalSpinLockDelay + AbslInternalSpinLockWake + AbslInternalTraceContinue + AbslInternalTraceObserved + AbslInternalTraceSignal + AbslInternalTraceWait diff --git a/naiveproxy/src/third_party/abseil-cpp/symbols_x86_dbg.def b/naiveproxy/src/third_party/abseil-cpp/symbols_x86_dbg.def index 11b95e8a21..306e44a19b 100644 --- a/naiveproxy/src/third_party/abseil-cpp/symbols_x86_dbg.def +++ b/naiveproxy/src/third_party/abseil-cpp/symbols_x86_dbg.def @@ -18,6 +18,7 @@ EXPORTS ??$?0$$T@?$Storage@PAPAUCordRep@cord_internal@absl@@$00U?$StorageTag@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QA$$T@Z ??$?0$$T@?$Storage@PAPAVLogSink@absl@@$00U?$StorageTag@V?$allocator@PAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@absl@@@internal_compressed_tuple@container_internal@2@$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QA$$T@Z ??$?0$$T@?$Storage@PAUPayload@status_internal@absl@@$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QA$$T@Z + ??$?0$$V$0A@@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QAE@XZ ??$?0$$V$0A@@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QAE@XZ ??$?0$$V$0A@@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QAE@XZ ??$?0$$V$0A@@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QAE@XZ @@ -25,12 +26,14 @@ EXPORTS ??$?0$$V$0A@@?$NoDestructor@VMutex@absl@@@absl@@QAE@XZ ??$?0$$V@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z ??$?0$$V@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??$?0$$V@PlacementImpl@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QAE@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QAE@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QAE@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QAE@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QAE@XZ ??$?0$$V@PlacementImpl@?$NoDestructor@VMutex@absl@@@absl@@QAE@XZ ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@QAE@AAPAVCommandLineFlag@absl@@AA_N@Z + ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@QAE@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@45@@Z ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@ABQAVCommandLineFlag@absl@@@__Cr@std@@QAE@ABQAVCommandLineFlag@absl@@@Z ??$?0$00X@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ ??$?0$00X@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ @@ -75,7 +78,10 @@ EXPORTS ??$?0AAPAVCommandLineFlag@absl@@AA_N@?$__tuple_impl@U?$__integer_sequence@I$0A@$00@__Cr@std@@AAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@QAE@U__forward_args@12@AAPAVCommandLineFlag@absl@@AA_N@Z ??$?0AAPAVCommandLineFlag@absl@@AA_N@?$__tuple_impl@U?$__integer_sequence@I$0A@$00@__Cr@std@@PAVCommandLineFlag@absl@@_N@__Cr@std@@QAE@U__forward_args@12@AAPAVCommandLineFlag@absl@@AA_N@Z ??$?0AAPBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU0123@$0A@@?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@__Cr@std@@QAE@AAPBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAPAU3456@@Z + ??$?0AAUFindInfo@container_internal@absl@@$0A@@?$__tuple_leaf@$0A@AAUFindInfo@container_internal@absl@@$0A@@__Cr@std@@QAE@AAUFindInfo@container_internal@absl@@@Z + ??$?0AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@12@@?$__tuple_impl@U?$__integer_sequence@I$0A@$00@__Cr@std@@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@56@@__Cr@std@@QAE@U__forward_args@12@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@56@@Z ??$?0AAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV234@@Z@@?$__temp_value@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@AAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@ABV678@@Z@@Z + ??$?0AAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@$0A@@?$__tuple_leaf@$00AAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@$0A@@__Cr@std@@QAE@AAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@@Z ??$?0AAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@12@$0A@@?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__Cr@std@@QAE@AAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@$$QAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@12@@Z ??$?0AAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$$T$00@?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@absl@@@container_internal@absl@@QAE@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$$QA$$T@Z ??$?0AAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@absl@@@container_internal@absl@@U?$integer_sequence@I$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@56@$$QA$$T@Z @@ -139,7 +145,9 @@ EXPORTS ??$?0PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU0123@$0A@@?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@@__Cr@std@@QAE@$$QAPBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z ??$?0PBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@$0A@@?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@QAE@$$QAPBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@12@@Z ??$?0PBVFormatArgImpl@str_format_internal@absl@@$0A@@?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QAE@PBVFormatArgImpl@str_format_internal@1@0ABV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@Z - ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@X@?$FunctionRef@$$A6AII@Z@absl@@QAE@ABU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@@?$FunctionRef@$$A6AII@Z@absl@@IAE@Uin_place_t@__Cr@std@@$$QAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@X@?$FunctionRef@$$A6AII@Z@absl@@QAE@$$QAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$__check_pair_construction@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@$0A@@?$pair@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@QAE@ABUFindInfo@container_internal@absl@@ABV?$NonIterableBitMask@G$0BA@$0A@@45@@Z ??$?0U?$array@D$0DKJI@@__Cr@std@@XU012@H@?$Span@D@absl@@QAE@AAU?$array@D$0DKJI@@__Cr@std@@@Z ??$?0UHex@absl@@X@AlphaNum@absl@@QAE@ABUHex@1@$$QAVStringifySink@strings_internal@1@@Z ??$?0UStringEq@container_internal@absl@@@?$Storage@UStringEq@container_internal@absl@@$01U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAUStringEq@23@@Z @@ -206,9 +214,13 @@ EXPORTS ??$?0V?$allocator@PAVLogSink@absl@@@__Cr@std@@@?$Storage@V?$allocator@PAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAV?$allocator@PAVLogSink@absl@@@56@@Z ??$?0V?$allocator@PAVLogSink@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@container_internal@absl@@QAE@$$QAV?$allocator@PAVLogSink@absl@@@__Cr@std@@$$QAI@Z ??$?0V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAV?$allocator@PAVLogSink@absl@@@56@$$QAI@Z + ??$?0V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@ABQBUCordRep@cord_internal@absl@@@?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@QAE@IAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@ABQBUCordRep@cord_internal@absl@@@Z + ??$?0V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@12@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@QAE@IAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAV?$allocator@UPayload@status_internal@absl@@@56@@Z ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@container_internal@absl@@QAE@$$QAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$QAI@Z ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAV?$allocator@UPayload@status_internal@absl@@@56@$$QAI@Z + ??$?0V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@12@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@QAE@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$?0V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@12@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@QAE@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z ??$?0V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QAE@PAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QAE@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QAE@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z @@ -229,10 +241,12 @@ EXPORTS ??$?0VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@$$QAV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@12@@Z ??$?0VTimeZoneLibC@cctz@time_internal@absl@@$0A@@?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@QAE@ABU?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@12@@Z ??$?0VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@$$QAV?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@12@@Z + ??$?0Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AA_N$0A@@?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@QAE@$$QAViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AA_N@Z ??$?0Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N$0A@@?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@QAE@$$QAViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@$$QA_N@Z ??$?0_J@FlagState@flags_internal@absl@@QAE@AAVFlagImpl@12@AB_J_N2_J@Z ??$?0_J@FormatArgImpl@str_format_internal@absl@@QAE@AB_J@Z ??$?4PAVCommandLineFlag@absl@@_N$0A@@?$tuple@AAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@QAEAAV012@$$QAV?$tuple@PAVCommandLineFlag@absl@@_N@12@@Z + ??$?4UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@12@$0A@@?$tuple@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@QAEAAV012@$$QAU?$pair@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@23@@12@@Z ??$?6$01@LogMessage@log_internal@absl@@QAEAAV012@AAY01$$CBD@Z ??$?6$02@LogMessage@log_internal@absl@@QAEAAV012@AAY02$$CBD@Z ??$?6$0P@@LogMessage@log_internal@absl@@QAEAAV012@AAY0P@$$CBD@Z @@ -584,7 +598,7 @@ EXPORTS ??$InvokeFlush@VBufferRawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPAVBufferRawSink@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$InvokeFlush@VFILERawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPAVFILERawSink@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$InvokeGet@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@@FlagImplPeer@flags_internal@absl@@SA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@ABV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@12@@Z - ??$InvokeObject@U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@II@functional_internal@absl@@YAITVoidPtr@01@I@Z + ??$InvokeObject@AAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@II@functional_internal@absl@@YAITVoidPtr@01@I@Z ??$InvokeParseFlag@H@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAHPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z ??$InvokeParseFlag@M@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAMPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z ??$InvokeParseFlag@N@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PANPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z @@ -739,6 +753,20 @@ EXPORTS ??$StrSplit@VByAnyChar@absl@@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@@Z ??$StrSplit@VByAnyChar@absl@@USkipEmpty@2@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@USkipEmpty@0@@Z ??$StreamFormat@I@absl@@YA?AVStreamable@str_format_internal@0@ABV?$FormatSpecTemplate@$0JPPPL@@20@ABI@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@H@strings_internal@0@YA?AV123@H@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@I@strings_internal@0@YA?AV123@I@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@J@strings_internal@0@YA?AV123@J@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@K@strings_internal@0@YA?AV123@K@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@_J@strings_internal@0@YA?AV123@_J@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@_K@strings_internal@0@YA?AV123@_K@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@0@YA?AV123@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@1V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@50@@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@H@01@YA?AV234@H@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@I@01@YA?AV234@I@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@J@01@YA?AV234@J@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@K@01@YA?AV234@K@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@_J@01@YA?AV234@_J@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@_K@01@YA?AV234@_K@Z@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@01@YA?AV234@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@1V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z@@Z ??$ToChronoDuration@V?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z ??$ToChronoDuration@V?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z @@ -806,19 +834,19 @@ EXPORTS ??$__advance@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAAV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@HUrandom_access_iterator_tag@01@@Z ??$__advance@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAAV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@HUrandom_access_iterator_tag@01@@Z ??$__advance@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@@__Cr@std@@YAXAAV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@HUrandom_access_iterator_tag@01@@Z - ??$__allocate_at_least@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@01@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@01@I@Z - ??$__allocate_at_least@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@I@Z - ??$__allocate_at_least@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAPAVCommandLineFlag@absl@@@01@AAV?$allocator@PAVCommandLineFlag@absl@@@01@I@Z - ??$__allocate_at_least@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAPAVCordzHandle@cord_internal@absl@@@01@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@01@I@Z - ??$__allocate_at_least@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAPAVLogSink@absl@@@01@AAV?$allocator@PAVLogSink@absl@@@01@I@Z - ??$__allocate_at_least@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAPBVCommandLineFlag@absl@@@01@AAV?$allocator@PBVCommandLineFlag@absl@@@01@I@Z - ??$__allocate_at_least@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAPBVCordzHandle@cord_internal@absl@@@01@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@01@I@Z - ??$__allocate_at_least@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@I@Z - ??$__allocate_at_least@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAUTransition@cctz@time_internal@absl@@@01@AAV?$allocator@UTransition@cctz@time_internal@absl@@@01@I@Z - ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAUTransitionType@cctz@time_internal@absl@@@01@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@I@Z - ??$__allocate_at_least@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAUUnrecognizedFlag@absl@@@01@AAV?$allocator@UUnrecognizedFlag@absl@@@01@I@Z - ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAUViableSubstitution@strings_internal@absl@@@01@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@I@Z - ??$__allocate_at_least@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@I@Z + ??$__allocate_at_least@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@01@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@01@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PAPAVCommandLineFlag@absl@@I@01@AAV?$allocator@PAVCommandLineFlag@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PAPAVCordzHandle@cord_internal@absl@@I@01@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@PAVLogSink@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PAPAVLogSink@absl@@I@01@AAV?$allocator@PAVLogSink@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PAPBVCommandLineFlag@absl@@I@01@AAV?$allocator@PBVCommandLineFlag@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PAPBVCordzHandle@cord_internal@absl@@I@01@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@I@01@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PAUTransition@cctz@time_internal@absl@@I@01@AAV?$allocator@UTransition@cctz@time_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PAUTransitionType@cctz@time_internal@absl@@I@01@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PAUUnrecognizedFlag@absl@@I@01@AAV?$allocator@UUnrecognizedFlag@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@U?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PAUViableSubstitution@strings_internal@absl@@I@01@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@U?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@YA?AU?$__allocation_result@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@I@01@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@I@Z ??$__allocator_destroy@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@PAU45@@__Cr@std@@YAXAAV?$allocator@UUnrecognizedFlag@absl@@@01@PAUUnrecognizedFlag@absl@@1@Z ??$__annotate_contiguous_container@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXPBX000@Z ??$__annotate_contiguous_container@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPBX000@Z @@ -833,13 +861,14 @@ EXPORTS ??$__annotate_contiguous_container@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPBX000@Z ??$__annotate_double_ended_contiguous_container@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPBX00000@Z ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@I@Z + ??$__as_transparent@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@01@AAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@01@@Z + ??$__as_transparent@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@01@AAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@01@@Z ??$__as_variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@YAAAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@01@AAV201@@Z ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@H@Z ??$__at@P6AI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03$$V@__base@__visitation@__variant_detail@__Cr@std@@CA$$QA_PABU?$__farray@P6AI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03@34@I@Z ??$__at@P6AI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z@__base@__visitation@__variant_detail@__Cr@std@@CAABQ6AI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@1234@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@ZABQ6AI01@Z@Z ??$__call@AAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@5@@?$__invoke_void_return_wrapper@X$00@__Cr@std@@SAXAAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@7@@Z ??$__call_func@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@@?$__policy_func@$$A6AXAAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@CAXPBT__policy_storage@123@AAVCommandLineFlag@absl@@@Z - ??$__choose_policy@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@@__policy@__function@__Cr@std@@CAPBU0123@U?$integral_constant@_N$00@23@@Z ??$__constexpr_memmove@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@0W4__element_count@01@@Z ??$__constexpr_memmove@PAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@__Cr@std@@YAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU2345@0W4__element_count@01@@Z ??$__constexpr_memmove@PAVLogSink@absl@@PAV12@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@0W4__element_count@01@@Z @@ -861,8 +890,8 @@ EXPORTS ??$__construct_at@PBVCommandLineFlag@absl@@PBV12@PAPBV12@@__Cr@std@@YAPAPBVCommandLineFlag@absl@@PAPBV23@$$QAPBV23@@Z ??$__construct_at@PBVCordzHandle@cord_internal@absl@@ABQBV123@PAPBV123@@__Cr@std@@YAPAPBVCordzHandle@cord_internal@absl@@PAPBV234@ABQBV234@@Z ??$__construct_at@PBVImpl@time_zone@cctz@time_internal@absl@@ABQBV12345@PAPBV12345@@__Cr@std@@YAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV23456@ABQBV23456@@Z - ??$__construct_at@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@$$TAAIPAU123@@__Cr@std@@YAPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@01@PAU201@$$QA$$TAAI@Z - ??$__construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@$$TAAIPAU123@@__Cr@std@@YAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@01@PAU201@$$QA$$TAAI@Z + ??$__construct_at@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@AAIAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@ABQBUCordRep@cord_internal@absl@@PAU123@@__Cr@std@@YAPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@01@PAU201@AAIAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@01@ABQBUCordRep@cord_internal@absl@@@Z + ??$__construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@AAIAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@01@PAU201@AAIAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@01@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z @@ -883,23 +912,25 @@ EXPORTS ??$__construct_at@UUnrecognizedFlag@absl@@U12@PAU12@@__Cr@std@@YAPAUUnrecognizedFlag@absl@@PAU23@$$QAU23@@Z ??$__construct_at@UUnrecognizedFlag@absl@@W4Source@12@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAU12@@__Cr@std@@YAPAUUnrecognizedFlag@absl@@PAU23@$$QAW4Source@23@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z ??$__construct_at@UViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV456@AAIPAU123@@__Cr@std@@YAPAUViableSubstitution@strings_internal@absl@@PAU234@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@ABV501@AAI@Z + ??$__construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@23@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAV123@@__Cr@std@@YAPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@01@PAV201@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@01@ABUpiecewise_construct_t@01@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z + ??$__construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@23@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAV123@@__Cr@std@@YAPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@01@PAV201@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@01@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z ??$__construct_at@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@ABV678@@Z@PAV123@@__Cr@std@@YAPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@PAV201@AAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@ABV567@@Z@@Z ??$__construct_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@PAV123@@__Cr@std@@YAPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PAV201@$$QAV201@@Z ??$__construct_at@VFormatArgImpl@str_format_internal@absl@@ABV123@PAV123@@__Cr@std@@YAPAVFormatArgImpl@str_format_internal@absl@@PAV234@ABV234@@Z ??$__construct_at_end@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAEXV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@12@0I@Z - ??$__construct_at_end@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z - ??$__construct_at_end@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z - ??$__construct_at_end@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@0@Z - ??$__construct_at_end@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@0@Z - ??$__construct_at_end_with_size@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@@?$__split_buffer@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@12@I@Z - ??$__construct_at_end_with_size@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@I@Z - ??$__construct_at_end_with_size@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@I@Z - ??$__construct_at_end_with_size@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@I@Z - ??$__construct_at_end_with_size@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@I@Z - ??$__construct_node@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z - ??$__construct_node@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z - ??$__construct_node_hash@ABQBUCordRep@cord_internal@absl@@$$V@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAE?AV?$unique_ptr@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@@12@IABQBUCordRep@cord_internal@absl@@@Z - ??$__construct_node_hash@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@12@IABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$__construct_at_end@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end_with_size@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@@?$__split_buffer@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QAEXV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@12@I@Z + ??$__construct_at_end_with_size@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@I@Z + ??$__construct_at_end_with_size@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@I@Z + ??$__construct_at_end_with_size@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@I@Z + ??$__construct_at_end_with_size@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@I@Z + ??$__construct_node@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$__construct_node@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$__construct_node_hash@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAE?AV?$unique_ptr@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@@12@IABQBUCordRep@cord_internal@absl@@@Z + ??$__construct_node_hash@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@12@IABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z ??$__copy@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@PAU1234@@__Cr@std@@YA?AU?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@01@PBUPrefixCrc@CrcCordState@crc_internal@absl@@0PAU3456@@Z ??$__copy@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@YA?AU?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@01@PBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@@Z ??$__copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V123@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@@Z @@ -979,18 +1010,18 @@ EXPORTS ??$__dispatch@$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$01@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@2345@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z ??$__dispatch@$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$02@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@2345@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z ??$__dispatch@$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$0A@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@2345@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z - ??$__distance@PBUPayload@status_internal@absl@@@__Cr@std@@YAHPBUPayload@status_internal@absl@@0Urandom_access_iterator_tag@01@@Z - ??$__distance@PBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAHPBUTransition@cctz@time_internal@absl@@0Urandom_access_iterator_tag@01@@Z - ??$__distance@PBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAHPBVFormatArgImpl@str_format_internal@absl@@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAHV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAHV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@@__Cr@std@@YAHV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z - ??$__distance@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z + ??$__distance@PBUPayload@status_internal@absl@@$0A@@__Cr@std@@YAHPBUPayload@status_internal@absl@@0@Z + ??$__distance@PBUTransition@cctz@time_internal@absl@@$0A@@__Cr@std@@YAHPBUTransition@cctz@time_internal@absl@@0@Z + ??$__distance@PBVFormatArgImpl@str_format_internal@absl@@$0A@@__Cr@std@@YAHPBVFormatArgImpl@str_format_internal@absl@@0@Z + ??$__distance@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAHV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@0@Z + ??$__distance@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAHV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@0@Z + ??$__distance@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YAHV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@0@Z + ??$__distance@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAHV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAHV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAHV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAHV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@0@Z ??$__do_rehash@$00@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAEXI@Z - ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXI@Z + ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXI@Z ??$__emplace_back_assume_capacity@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ ??$__emplace_back_assume_capacity@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ ??$__emplace_back_assume_capacity@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXAAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@ABV312@AAI@Z @@ -1018,14 +1049,13 @@ EXPORTS ??$__emplace_back_slow_path@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAEPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QAV312@@Z ??$__emplace_back_slow_path@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AAEPAUUnrecognizedFlag@absl@@$$QAW4Source@34@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z ??$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@12@ABQBUCordRep@cord_internal@absl@@@Z - ??$__emplace_unique_extract_key@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@12@ABQBUCordRep@cord_internal@absl@@U__extract_key_self_tag@12@@Z - ??$__emplace_unique_key_args@PBUCordRep@cord_internal@absl@@ABQBU123@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@12@ABQBUCordRep@cord_internal@absl@@0@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z - ??$__find@PAPAVLogSink@absl@@PAPAV12@PAV12@U__identity@__Cr@std@@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@0ABQAV23@AAU__identity@01@@Z - ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAPAV?$__tree_node_base@PAX@12@AAPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z - ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAPAV?$__tree_node_base@PAX@12@AAPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$__find@PAVLogSink@absl@@PAV12@U__identity@__Cr@std@@$0A@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@0ABQAV23@AAU__identity@01@@Z + ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@PAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@__Cr@std@@AAPAV?$__tree_node_base@PAX@23@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@PAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@__Cr@std@@AAPAV?$__tree_node_base@PAX@23@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__find_loop@PAPAVLogSink@absl@@PAPAV12@PAV12@U__identity@__Cr@std@@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@0ABQAV23@AAU__identity@01@@Z ??$__for_each_segment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__copy_impl@23@@__Cr@std@@YAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__copy_impl@01@@Z ??$__get_alt@$00AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QA_PAAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z ??$__get_alt@$01AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QA_PAAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z @@ -1040,18 +1070,30 @@ EXPORTS ??$__get_alt@AAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$01@__union@__access@__variant_detail@__Cr@std@@SA$$QA_PAAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$01@34@@Z ??$__get_alt@AAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$02@__union@__access@__variant_detail@__Cr@std@@SA$$QA_PAAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$02@34@@Z ??$__get_alt@AAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__union@__access@__variant_detail@__Cr@std@@SA$$QA_PAAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$0A@@34@@Z + ??$__if_likely_else@V@?0???$emplace_back@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@ABV834@AAI@Z@V@?0???$emplace_back@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@234@QAEAAU567@012@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@01@QAEAAUViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@ABV701@AAI@Z@V@?0???$emplace_back@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@301@QAEAAU456@123@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@ABQAV56@@Z@V@?0???$emplace_back@ABQAVCommandLineFlag@absl@@@234@QAEAAPAV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@01@QAEAAPAVCommandLineFlag@absl@@ABQAV45@@Z@V@?0???$emplace_back@ABQAVCommandLineFlag@absl@@@301@QAEAAPAV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCordzHandle@cord_internal@absl@@ABQAV567@@Z@V@?0???$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@234@QAEAAPAV567@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@01@QAEAAPAVCordzHandle@cord_internal@absl@@ABQAV456@@Z@V@?0???$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@301@QAEAAPAV456@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@ABQAVLogSink@absl@@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVLogSink@absl@@ABQAV56@@Z@V@?0???$emplace_back@ABQAVLogSink@absl@@@234@QAEAAPAV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@ABQAVLogSink@absl@@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@01@QAEAAPAVLogSink@absl@@ABQAV45@@Z@V@?0???$emplace_back@ABQAVLogSink@absl@@@301@QAEAAPAV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@ABQBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@ABQBV56@@Z@V@?0???$emplace_back@ABQBVCommandLineFlag@absl@@@234@QAEAAPBV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@ABQBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@01@QAEAAPBVCommandLineFlag@absl@@ABQBV45@@Z@V@?0???$emplace_back@ABQBVCommandLineFlag@absl@@@301@QAEAAPBV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCordzHandle@cord_internal@absl@@ABQBV567@@Z@V@?0???$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@234@QAEAAPBV567@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@01@QAEAAPBVCordzHandle@cord_internal@absl@@ABQBV456@@Z@V@?0???$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@301@QAEAAPBV456@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@ABU5678@@Z@V@?0???$emplace_back@ABUTransition@cctz@time_internal@absl@@@234@QAEAAU5678@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@01@QAEAAUTransition@cctz@time_internal@absl@@ABU4567@@Z@V@?0???$emplace_back@ABUTransition@cctz@time_internal@absl@@@301@QAEAAU4567@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@ABUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@ABU56@@Z@V@?0???$emplace_back@ABUUnrecognizedFlag@absl@@@234@QAEAAU56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@ABUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@QAEAAUUnrecognizedFlag@absl@@ABU45@@Z@V@?0???$emplace_back@ABUUnrecognizedFlag@absl@@@301@QAEAAU45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@$$QAPBV56@@Z@V@?0???$emplace_back@PBVCommandLineFlag@absl@@@234@QAEAAPBV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@01@QAEAAPBVCommandLineFlag@absl@@$$QAPBV45@@Z@V@?0???$emplace_back@PBVCommandLineFlag@absl@@@301@QAEAAPBV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU5678@@Z@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@234@QAEAAU5678@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@01@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU4567@@Z@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@301@QAEAAU4567@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@34@$$QAV534@@Z@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@234@QAEAAV534@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@01@QAEAAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@$$QAV401@@Z@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@301@QAEAAV401@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@$$QAW4Source@56@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@234@QAEAAU56@01@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@QAEAAUUnrecognizedFlag@absl@@$$QAW4Source@45@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@301@QAEAAU45@12@Z@@Z ??$__in_bounds@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@$0A@@__unique_ptr_array_bounds_stateless@__Cr@std@@QBE_NPAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@I@Z ??$__in_bounds@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@$0A@@__unique_ptr_array_bounds_stateless@__Cr@std@@QBE_NPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@I@Z ??$__insert_assign_n_unchecked@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@$0A@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAEXV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@12@HPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z ??$__insert_with_size@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$__wrap_iter@PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@12@1H@Z + ??$__invoke@AAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@I@__Cr@std@@YAIAAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QAI@Z ??$__invoke@AAUByCivilTime@Transition@cctz@time_internal@absl@@ABU2345@ABU2345@@__Cr@std@@YA_NAAUByCivilTime@Transition@cctz@time_internal@absl@@ABU3456@1@Z ??$__invoke@AAUByUnixTime@Transition@cctz@time_internal@absl@@ABU2345@ABU2345@@__Cr@std@@YA_NAAUByUnixTime@Transition@cctz@time_internal@absl@@ABU3456@1@Z ??$__invoke@AAU__identity@__Cr@std@@AAPAVLogSink@absl@@@__Cr@std@@YAAAPAVLogSink@absl@@AAU__identity@01@AAPAV23@@Z ??$__invoke@AAU__identity@__Cr@std@@AAPBVCommandLineFlag@absl@@@__Cr@std@@YAAAPBVCommandLineFlag@absl@@AAU__identity@01@AAPBV23@@Z ??$__invoke@AAU__identity@__Cr@std@@ABUTransition@cctz@time_internal@absl@@@__Cr@std@@YAABUTransition@cctz@time_internal@absl@@AAU__identity@01@ABU2345@@Z ??$__invoke@AAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@5@@__Cr@std@@YAXAAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@6@@Z - ??$__invoke@ABU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@I@__Cr@std@@YAIABU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QAI@Z - ??$__invoke@P8FlagImpl@flags_internal@absl@@AEXXZPAV123@$$VX@__Cr@std@@YAX$$QAP8FlagImpl@flags_internal@absl@@AEXXZ$$QAPAV234@@Z + ??$__invoke@P8FlagImpl@flags_internal@absl@@AEXXZPAV123@@__Cr@std@@YAX$$QAP8FlagImpl@flags_internal@absl@@AEXXZ$$QAPAV234@@Z ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@456@@__Cr@std@@YAI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@501@@Z ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAU?$__alt@$01V?$Span@$$CBD@absl@@@456@@__Cr@std@@YAI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AAU?$__alt@$01V?$Span@$$CBD@absl@@@501@@Z ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAU?$__alt@$02V?$variant@IHM@__Cr@std@@@456@@__Cr@std@@YAI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AAU?$__alt@$02V?$variant@IHM@__Cr@std@@@501@@Z @@ -1061,8 +1103,11 @@ EXPORTS ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@AAV?$variant@_K_JIH_N@__Cr@std@@@__Cr@std@@YAI$$QAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@45@@Z@AAV?$variant@_K_JIH_N@01@@Z ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@AAV?$variant@_K_JN@__Cr@std@@@__Cr@std@@YAI$$QAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@45@@Z@AAV?$variant@_K_JN@01@@Z ??$__invoke_r@XAAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@5@@__Cr@std@@YAXAAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@6@@Z + ??$__is_null@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@@__function@__Cr@std@@YA_NABV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@@Z ??$__iter_move@AAPAPAVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QAPAVCommandLineFlag@absl@@AAPAPAV34@@Z ??$__iter_move@AAPAPBVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QAPBVCommandLineFlag@absl@@AAPAPBV34@@Z + ??$__iter_move@PAPAVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QAPAVCommandLineFlag@absl@@$$QAPAPAV34@@Z + ??$__iter_move@PAPBVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QAPBVCommandLineFlag@absl@@$$QAPAPBV34@@Z ??$__libcpp_allocate@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@I@Z ??$__libcpp_allocate@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@01@W4__element_count@01@I@Z ??$__libcpp_allocate@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@01@W4__element_count@01@I@Z @@ -1117,6 +1162,7 @@ EXPORTS ??$__libcpp_deallocate@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAXPAVFormatArgImpl@str_format_internal@absl@@W4__element_count@01@I@Z ??$__lower_bound@U_ClassicAlgPolicy@__Cr@std@@PBUTransition@cctz@time_internal@absl@@PBU4567@U4567@U__identity@23@UByUnixTime@4567@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@AAUByUnixTime@2345@AAU__identity@01@@Z ??$__lower_bound_bisecting@U_ClassicAlgPolicy@__Cr@std@@PBUTransition@cctz@time_internal@absl@@U4567@U__identity@23@UByUnixTime@4567@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@ABU2345@HAAUByUnixTime@2345@AAU__identity@01@@Z + ??$__make_exception_guard@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z@@__Cr@std@@YA?AU?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z@@01@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@01@AAEXI@Z@@Z ??$__make_exception_guard@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@__Cr@std@@@01@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@01@@Z ??$__make_value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@CA?A_P$$QAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@78@@Z@@Z ??$__memberwise_forward_assign@V?$tuple@AAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@V?$tuple@PAVCommandLineFlag@absl@@_N@23@PAVCommandLineFlag@absl@@_N$$Z$0A@$00@__Cr@std@@YAXAAV?$tuple@AAPAVCommandLineFlag@absl@@AA_N@01@$$QAV?$tuple@PAVCommandLineFlag@absl@@_N@01@U?$__tuple_types@PAVCommandLineFlag@absl@@_N@01@U?$__integer_sequence@I$0A@$00@01@@Z @@ -1129,9 +1175,8 @@ EXPORTS ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU4567@PAPAU4567@@__Cr@std@@YA?AU?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@01@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PAUTransition@cctz@time_internal@absl@@PAU4567@PAU4567@@__Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@PAUTransition@cctz@time_internal@absl@@00@Z ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PAUTransitionType@cctz@time_internal@absl@@PAU4567@PAU4567@@__Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@PAUTransitionType@cctz@time_internal@absl@@00@Z - ??$__not_null@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@@__function@__Cr@std@@YA_NABV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@@Z ??$__rehash@$00@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAEXI@Z - ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXI@Z + ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXI@Z ??$__rewrap_iter@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@U?$__unwrap_iter_impl@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@0@Z ??$__rewrap_iter@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@U?$__unwrap_iter_impl@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU2345@0@Z ??$__rewrap_iter@PAPAVLogSink@absl@@PAPAV12@U?$__unwrap_iter_impl@PAPAVLogSink@absl@@$00@__Cr@std@@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@0@Z @@ -1170,6 +1215,8 @@ EXPORTS ??$__to_address@PAVLogSink@absl@@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@@Z ??$__to_address@PBVCommandLineFlag@absl@@@__Cr@std@@YAPAPBVCommandLineFlag@absl@@PAPBV23@@Z ??$__to_address@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPAPBVCordzHandle@cord_internal@absl@@PAPBV234@@Z + ??$__to_address@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@YAPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@01@PAU201@@Z + ??$__to_address@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@YAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@01@PAU201@@Z ??$__to_address@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU2345@@Z ??$__to_address@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU2345@@Z ??$__to_address@UTransition@cctz@time_internal@absl@@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@@Z @@ -1182,6 +1229,12 @@ EXPORTS ??$__to_address@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAPAPBVCommandLineFlag@absl@@ABV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@@Z ??$__to_address@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YAPAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@ABV456@@Z@ABV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@@Z ??$__to_address@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PAV201@@Z + ??$__try_key_extraction@PBUCordRep@cord_internal@absl@@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@67@ABQBU123@@Z@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@567@QAE?AU867@0@Z@ABQBU123@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@01@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@01@QAE?AU201@ABQBUCordRep@cord_internal@absl@@@Z@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@401@QAE?AU201@0@Z@0@Z + ??$__try_key_extraction@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@23@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@523@QAE?AU623@012@Z@ABU723@V823@V923@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@01@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@01@QAE?AU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@401@QAE?AU201@012@Z@012@Z + ??$__try_key_extraction@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@523@QAE?AU623@012@Z@ABU723@V823@V923@@__Cr@std@@YA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@01@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@01@QAE?AU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@401@QAE?AU201@012@Z@012@Z + ??$__try_key_extraction_impl@PBUCordRep@cord_internal@absl@@U?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@56@QAE?AU456@ABQBU123@@Z@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@856@QAE?AU456@0@Z@ABQBU123@$0A@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@01@QAE?AU201@ABQBUCordRep@cord_internal@absl@@@Z@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@501@QAE?AU201@1@Z@1@Z + ??$__try_key_extraction_impl@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@23@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@23@QAE?AU423@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@623@QAE?AU423@012@Z@ABU723@V823@V923@$0A@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@01@QAE?AU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@501@QAE?AU201@123@Z@123@Z + ??$__try_key_extraction_impl@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@23@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@QAE?AU423@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@623@QAE?AU423@012@Z@ABU723@V823@V923@$0A@@__Cr@std@@YA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@01@QAE?AU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@501@QAE?AU201@123@Z@123@Z ??$__uninitialized_allocator_copy@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@23@V423@PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@__Cr@std@@YAPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@1PAV201@@Z ??$__uninitialized_allocator_copy_impl@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@ABV678@@Z@PAU4?1???R5678@QBE?AV923@0@Z@PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@__Cr@std@@YAPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@ABV567@@Z@2PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z ??$__uninitialized_allocator_relocate@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@PAPAVCommandLineFlag@absl@@@__Cr@std@@YAXAAV?$allocator@PAVCommandLineFlag@absl@@@01@PAPAVCommandLineFlag@absl@@11@Z @@ -1220,6 +1273,8 @@ EXPORTS ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByUnixTime@Transition@cctz@time_internal@absl@@PBU5678@PBU5678@U5678@U__identity@23@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@$$QAUByUnixTime@2345@$$QAU__identity@01@@Z ??$__validate_iter_reference@AAPAPAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ ??$__validate_iter_reference@AAPAPBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@PAPAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@PAPBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ ??$__visit_alt@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__impl@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@1234@AAV?$__impl@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z ??$__visit_alt@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@56@@__variant@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@01234@AAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@34@@Z ??$__visit_value@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@AAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@78@@Z@AAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@34@@Z @@ -1315,8 +1370,8 @@ EXPORTS ??$construct_at@PBVCommandLineFlag@absl@@PBV12@PAPBV12@@__Cr@std@@YAPAPBVCommandLineFlag@absl@@PAPBV23@$$QAPBV23@@Z ??$construct_at@PBVCordzHandle@cord_internal@absl@@ABQBV123@PAPBV123@@__Cr@std@@YAPAPBVCordzHandle@cord_internal@absl@@PAPBV234@ABQBV234@@Z ??$construct_at@PBVImpl@time_zone@cctz@time_internal@absl@@ABQBV12345@PAPBV12345@@__Cr@std@@YAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV23456@ABQBV23456@@Z - ??$construct_at@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@$$TAAIPAU123@@__Cr@std@@YAPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@01@PAU201@$$QA$$TAAI@Z - ??$construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@$$TAAIPAU123@@__Cr@std@@YAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@01@PAU201@$$QA$$TAAI@Z + ??$construct_at@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@AAIAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@ABQBUCordRep@cord_internal@absl@@PAU123@@__Cr@std@@YAPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@01@PAU201@AAIAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@01@ABQBUCordRep@cord_internal@absl@@@Z + ??$construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@AAIAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@01@PAU201@AAIAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@01@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z @@ -1337,6 +1392,8 @@ EXPORTS ??$construct_at@UUnrecognizedFlag@absl@@U12@PAU12@@__Cr@std@@YAPAUUnrecognizedFlag@absl@@PAU23@$$QAU23@@Z ??$construct_at@UUnrecognizedFlag@absl@@W4Source@12@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAU12@@__Cr@std@@YAPAUUnrecognizedFlag@absl@@PAU23@$$QAW4Source@23@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z ??$construct_at@UViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV456@AAIPAU123@@__Cr@std@@YAPAUViableSubstitution@strings_internal@absl@@PAU234@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@ABV501@AAI@Z + ??$construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@23@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAV123@@__Cr@std@@YAPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@01@PAV201@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@01@ABUpiecewise_construct_t@01@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z + ??$construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@23@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAV123@@__Cr@std@@YAPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@01@PAV201@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@01@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z ??$construct_at@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@ABV678@@Z@PAV123@@__Cr@std@@YAPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@PAV201@AAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@ABV567@@Z@@Z ??$construct_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@PAV123@@__Cr@std@@YAPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PAV201@$$QAV201@@Z ??$construct_at@VFormatArgImpl@str_format_internal@absl@@ABV123@PAV123@@__Cr@std@@YAPAVFormatArgImpl@str_format_internal@absl@@PAV234@ABV234@@Z @@ -1385,11 +1442,11 @@ EXPORTS ??$emplace@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@45@@Z ??$emplace_at@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IAEXViterator@012@ABUpiecewise_construct_t@__Cr@std@@$$QAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@56@@Z ??$emplace_at@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IAEXViterator@012@ABUpiecewise_construct_t@__Cr@std@@$$QAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@56@@Z - ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ??$emplace_back@AAPAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXAAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ??$emplace_back@AAPAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXAAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ??$emplace_back@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@ABV612@AAI@Z ??$emplace_back@ABQAUCordRep@cord_internal@absl@@@?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QAEAAPAUCordRep@cord_internal@1@ABQAU231@@Z ??$emplace_back@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@ABQAV34@@Z @@ -1401,23 +1458,23 @@ EXPORTS ??$emplace_back@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@ABU3456@@Z ??$emplace_back@ABUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@ABU34@@Z ??$emplace_back@HVcrc32c_t@absl@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAH$$QAVcrc32c_t@6@@Z - ??$emplace_back@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ??$emplace_back@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@$$QAPBV34@@Z ??$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU3456@@Z ??$emplace_back@UPayload@status_internal@absl@@@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAEAAUPayload@status_internal@1@$$QAU231@@Z ??$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QAV312@@Z ??$emplace_back@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@$$QAW4Source@34@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z - ??$emplace_front@AAPAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXAAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_front@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_front@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_front@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@AAPAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXAAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ??$end@V?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@AAV?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@01@@Z ??$end@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@AAV?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@01@@Z ??$find@V?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@PAVLogSink@absl@@@__Cr@std@@YA?AV?$__wrap_iter@PAPAVLogSink@absl@@@01@V201@0ABQAVLogSink@absl@@@Z - ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE?AViterator@012@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QBE?AVconst_iterator@012@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$find_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAE?AViterator@012@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z @@ -1442,6 +1499,7 @@ EXPORTS ??$get@$00@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QGAEAAUStringHash@12@XZ ??$get@$00@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QGBEABUStringHash@12@XZ ??$get@$00AAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@YAAA_NAAV?$tuple@AAPAVCommandLineFlag@absl@@AA_N@01@@Z + ??$get@$00AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@YAAAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@AAV?$tuple@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@23@@01@@Z ??$get@$00PAVCommandLineFlag@absl@@_N@__Cr@std@@YAAA_NAAV?$tuple@PAVCommandLineFlag@absl@@_N@01@@Z ??$get@$01@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QGBEABUStringEq@12@XZ ??$get@$02@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QGAEAAV?$allocator@D@__Cr@std@@XZ @@ -1458,6 +1516,7 @@ EXPORTS ??$get@$0A@@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QGAEAAVCommonFields@12@XZ ??$get@$0A@@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QGBEABVCommonFields@12@XZ ??$get@$0A@AAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@YAAAPAVCommandLineFlag@absl@@AAV?$tuple@AAPAVCommandLineFlag@absl@@AA_N@01@@Z + ??$get@$0A@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@YAAAUFindInfo@container_internal@absl@@AAV?$tuple@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@23@@01@@Z ??$get@$0A@ABQAVCommandLineFlag@absl@@@__Cr@std@@YAABQAVCommandLineFlag@absl@@AAV?$tuple@ABQAVCommandLineFlag@absl@@@01@@Z ??$get@$0A@PAVCommandLineFlag@absl@@_N@__Cr@std@@YA$$QAPAVCommandLineFlag@absl@@$$QAV?$tuple@PAVCommandLineFlag@absl@@_N@01@@Z ??$get@$0A@PAVCommandLineFlag@absl@@_N@__Cr@std@@YAAAPAVCommandLineFlag@absl@@AAV?$tuple@PAVCommandLineFlag@absl@@_N@01@@Z @@ -1475,7 +1534,7 @@ EXPORTS ??$hash_with_seed@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@$0A@@MixingHashState@hash_internal@absl@@SAIABV?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@I@Z ??$insert@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@45@@Z ??$insert@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@$0A@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__wrap_iter@PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@12@1@Z - ??$invoke@ABU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@I@__Cr@std@@YAIABU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QAI@Z + ??$invoke@AAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@I@__Cr@std@@YAIAAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QAI@Z ??$invoke@P8FlagImpl@flags_internal@absl@@AEXXZPAV123@@__Cr@std@@YAX$$QAP8FlagImpl@flags_internal@absl@@AEXXZ$$QAPAV234@@Z ??$iter_swap@AAPAPAVCommandLineFlag@absl@@AAPAPAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAAPAPAVCommandLineFlag@absl@@0@Z ??$iter_swap@AAPAPAVCommandLineFlag@absl@@PAPAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAAPAPAVCommandLineFlag@absl@@$$QAPAPAV34@@Z @@ -1486,6 +1545,7 @@ EXPORTS ??$iter_swap@PAPBVCommandLineFlag@absl@@PAPBV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAX$$QAPAPBVCommandLineFlag@absl@@0@Z ??$iter_swap@PAPBVCommandLineFlag@absl@@PAPBV12@@__Cr@std@@YAXPAPBVCommandLineFlag@absl@@0@Z ??$launder@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@01@PAU201@@Z + ??$launder@UList@CordzInfo@cord_internal@absl@@@__Cr@std@@YAPAUList@CordzInfo@cord_internal@absl@@PAU2345@@Z ??$launder@URefcountedRep@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPAURefcountedRep@CrcCordState@crc_internal@absl@@PAU2345@@Z ??$launder@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@__Cr@std@@YAPAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@PAV234@@Z ??$launder@VFlagRegistry@flags_internal@absl@@@__Cr@std@@YAPAVFlagRegistry@flags_internal@absl@@PAV234@@Z @@ -1513,7 +1573,7 @@ EXPORTS ??$make_pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@YA?AU?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@01@$$QAPBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@@Z ??$make_pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@01@$$QAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@$$QAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@@Z ??$make_tuple@AAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@YA?AV?$tuple@PAVCommandLineFlag@absl@@_N@01@AAPAVCommandLineFlag@absl@@AA_N@Z - ??$make_unique@ULogMessageData@LogMessage@log_internal@absl@@AAPBDAAHAAW4LogSeverity@4@VTime@4@$0A@@__Cr@std@@YA?AV?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@01@AAPBDAAHAAW4LogSeverity@absl@@$$QAVTime@4@@Z + ??$make_unique@ULogMessageData@LogMessage@log_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAHAAW4LogSeverity@4@VTime@4@$0A@@__Cr@std@@YA?AV?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@01@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AAHAAW4LogSeverity@absl@@$$QAVTime@5@@Z ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@$$V$0A@@__Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@XZ ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@AAV12@$0A@@__Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@AAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z ??$make_unique@VFallbackCrcMemcpyEngine@crc_internal@absl@@$$V$0A@@__Cr@std@@YA?AV?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@01@XZ @@ -1574,17 +1634,9 @@ EXPORTS ??$safe_strtoi_base@_K@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_KH@Z ??$swap@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAXAAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z ??$swap@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAXAAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z - ??$swap@PAPAVCommandLineFlag@absl@@@__Cr@std@@YAXAAPAPAVCommandLineFlag@absl@@0@Z - ??$swap@PAPAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXAAPAPAVCordzHandle@cord_internal@absl@@0@Z - ??$swap@PAPAVLogSink@absl@@@__Cr@std@@YAXAAPAPAVLogSink@absl@@0@Z - ??$swap@PAPBVCommandLineFlag@absl@@@__Cr@std@@YAXAAPAPBVCommandLineFlag@absl@@0@Z - ??$swap@PAPBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXAAPAPBVCordzHandle@cord_internal@absl@@0@Z - ??$swap@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAXAAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z ??$swap@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@YAXAAPAUTransition@cctz@time_internal@absl@@0@Z ??$swap@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAXAAPAUTransitionType@cctz@time_internal@absl@@0@Z ??$swap@PAUUnrecognizedFlag@absl@@@__Cr@std@@YAXAAPAUUnrecognizedFlag@absl@@0@Z - ??$swap@PAUViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXAAPAUViableSubstitution@strings_internal@absl@@0@Z - ??$swap@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXAAPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@0@Z ??$swap@PAVCommandLineFlag@absl@@@__Cr@std@@YAXAAPAVCommandLineFlag@absl@@0@Z ??$swap@PBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@YAXAAPBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@0@Z ??$swap@PBVCommandLineFlag@absl@@@__Cr@std@@YAXAAPBVCommandLineFlag@absl@@0@Z @@ -1592,6 +1644,7 @@ EXPORTS ??$swap@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@0@Z ??$swap@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXAAUViableSubstitution@strings_internal@absl@@0@Z ??$tie@PAVCommandLineFlag@absl@@_N@__Cr@std@@YA?AV?$tuple@AAPAVCommandLineFlag@absl@@AA_N@01@AAPAVCommandLineFlag@absl@@AA_N@Z + ??$tie@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@YA?AV?$tuple@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@23@@01@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@45@@Z ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@1@Z ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAXPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@1@Z ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@1@Z @@ -1659,6 +1712,19 @@ EXPORTS ??0?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@ABV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@Z ??0?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@__Cr@std@@QAE@AAV?$allocator@UUnrecognizedFlag@absl@@@12@AAPAUUnrecognizedFlag@absl@@1@Z ??0?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__copy_impl@__Cr@std@@QAE@AAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@Z + ??0?$__allocation_result@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@__Cr@std@@QAE@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z + ??0?$__allocation_result@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@__Cr@std@@QAE@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ??0?$__allocation_result@PAPAVCommandLineFlag@absl@@I@__Cr@std@@QAE@PAPAVCommandLineFlag@absl@@I@Z + ??0?$__allocation_result@PAPAVCordzHandle@cord_internal@absl@@I@__Cr@std@@QAE@PAPAVCordzHandle@cord_internal@absl@@I@Z + ??0?$__allocation_result@PAPAVLogSink@absl@@I@__Cr@std@@QAE@PAPAVLogSink@absl@@I@Z + ??0?$__allocation_result@PAPBVCommandLineFlag@absl@@I@__Cr@std@@QAE@PAPBVCommandLineFlag@absl@@I@Z + ??0?$__allocation_result@PAPBVCordzHandle@cord_internal@absl@@I@__Cr@std@@QAE@PAPBVCordzHandle@cord_internal@absl@@I@Z + ??0?$__allocation_result@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@I@__Cr@std@@QAE@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@I@Z + ??0?$__allocation_result@PAUTransition@cctz@time_internal@absl@@I@__Cr@std@@QAE@PAUTransition@cctz@time_internal@absl@@I@Z + ??0?$__allocation_result@PAUTransitionType@cctz@time_internal@absl@@I@__Cr@std@@QAE@PAUTransitionType@cctz@time_internal@absl@@I@Z + ??0?$__allocation_result@PAUUnrecognizedFlag@absl@@I@__Cr@std@@QAE@PAUUnrecognizedFlag@absl@@I@Z + ??0?$__allocation_result@PAUViableSubstitution@strings_internal@absl@@I@__Cr@std@@QAE@PAUViableSubstitution@strings_internal@absl@@I@Z + ??0?$__allocation_result@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@I@__Cr@std@@QAE@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@I@Z ??0?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@12@I@Z ??0?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@I@Z ??0?$__atomic_base@P6AXABUHashtablezInfo@container_internal@absl@@@Z$0A@@__Cr@std@@QAE@P6AXABUHashtablezInfo@container_internal@absl@@@Z@Z @@ -1678,6 +1744,7 @@ EXPORTS ??0?$__deque_iterator@PBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@AAPBV12345@PAPAPBV12345@H$0A@@__Cr@std@@AAE@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV34567@@Z ??0?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@AAE@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU3456@@Z ??0?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@AAE@PBQBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU3456@@Z + ??0?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z@@__Cr@std@@QAE@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@12@AAEXI@Z@@Z ??0?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@12@@Z ??0?$__hash_const_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@QAE@ABV?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@@Z ??0?$__hash_const_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAE@ABV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@@Z @@ -1685,8 +1752,6 @@ EXPORTS ??0?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@AAE@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@@Z ??0?$__hash_map_const_iterator@V?$__hash_const_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@V?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@12@@Z ??0?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@@Z - ??0?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@QAE@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@I@Z - ??0?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@QAE@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@I@Z ??0?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@QAE@PAU012@@Z ??0?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@QAE@XZ ??0?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAE@PAU012@@Z @@ -1694,11 +1759,15 @@ EXPORTS ??0?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@_N@Z ??0?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@_N@Z ??0?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE@XZ - ??0?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??0?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??0?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@X@__Cr@std@@QAE@ABV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@12@@Z + ??0?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@X@__Cr@std@@QAE@ABV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@12@@Z ??0?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@@__Cr@std@@QAE@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@12@@Z ??0?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@@__Cr@std@@QAE@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@12@@Z - ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QAE@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z - ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QAE@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QAE@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@QAE@XZ + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QAE@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@QAE@XZ ??0?$__non_trivial_if@$00V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ ??0?$__non_trivial_if@$00V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ ??0?$__non_trivial_if@$00V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ @@ -1733,31 +1802,46 @@ EXPORTS ??0?$__optional_move_assign_base@VCord@absl@@$0A@@__Cr@std@@QAE@XZ ??0?$__optional_move_base@VCord@absl@@$0A@@__Cr@std@@QAE@XZ ??0?$__optional_storage_base@VCord@absl@@$0A@@__Cr@std@@QAE@XZ - ??0?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@IIAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z - ??0?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??0?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@IIAAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z - ??0?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??0?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@IIAAV?$allocator@PAVCommandLineFlag@absl@@@12@@Z - ??0?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@IIAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@@Z - ??0?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAE@IIAAV?$allocator@PAVLogSink@absl@@@12@@Z - ??0?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@IIAAV?$allocator@PBVCommandLineFlag@absl@@@12@@Z - ??0?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@IIAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@@Z - ??0?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@IIAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z - ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@IIAAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z - ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@IIAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z - ??0?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@IIAAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z - ??0?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@IIAAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z - ??0?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@IIAAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z - ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE@ABV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@12@@Z - ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE@ABV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@12@@Z + ??0?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAE@IIAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAE@XZ + ??0?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@IIAAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??0?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??0?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@IIAAV?$allocator@PAVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAE@IIAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@IIAAV?$allocator@PAVLogSink@absl@@@12@@Z + ??0?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@IIAAV?$allocator@PBVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAE@IIAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@IIAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@IIAAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@IIAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@IIAAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??0?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAE@IIAAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??0?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QAE@IIAAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAE@XZ + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAE@XZ + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@PAVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@PAVLogSink@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@PBVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE@ABV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@12@@Z + ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE@ABV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@12@@Z ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@AAE@PAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@12@@Z ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@AAE@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@12@@Z ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@AAE@PAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@12@@Z ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@AAE@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@12@@Z ??0?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@12@_N@Z ??0?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@12@_N@Z - ??0?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QAE@XZ - ??0?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QAE@XZ + ??0?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??0?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QAE@XZ ??0?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@AAE@PAPAVCommandLineFlag@absl@@@Z ??0?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@__Cr@std@@AAE@PAPAVCordzHandle@cord_internal@absl@@@Z ??0?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@AAE@PAPAVLogSink@absl@@@Z @@ -1966,13 +2050,15 @@ EXPORTS ??0KernelTimeout@synchronization_internal@absl@@QAE@VTime@2@@Z ??0KernelTimeout@synchronization_internal@absl@@QAE@XZ ??0LeakCheckDisabler@absl@@QAE@XZ + ??0List@CordzInfo@cord_internal@absl@@QAE@XZ ??0LockHolder@synchronization_internal@absl@@QAE@PAU_RTL_SRWLOCK@@@Z ??0LogEntry@absl@@AAE@XZ ??0LogMessage@log_internal@absl@@QAE@PBDHUErrorTag@012@@Z ??0LogMessage@log_internal@absl@@QAE@PBDHUInfoTag@012@@Z ??0LogMessage@log_internal@absl@@QAE@PBDHUWarningTag@012@@Z ??0LogMessage@log_internal@absl@@QAE@PBDHW4LogSeverity@2@@Z - ??0LogMessageData@LogMessage@log_internal@absl@@QAE@PBDHW4LogSeverity@3@VTime@3@@Z + ??0LogMessage@log_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@2@@Z + ??0LogMessageData@LogMessage@log_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@3@VTime@3@@Z ??0LogMessageDebugFatal@log_internal@absl@@QAE@PBDH@Z ??0LogMessageFatal@log_internal@absl@@QAE@PBDH0@Z ??0LogMessageFatal@log_internal@absl@@QAE@PBDH@Z @@ -1984,7 +2070,7 @@ EXPORTS ??0MaskedPointer@flags_internal@absl@@QAE@PAX_N@Z ??0MixingHashState@hash_internal@absl@@AAE@_K@Z ??0Mutex@absl@@QAE@XZ - ??0MutexLock@absl@@QAE@PAVMutex@1@@Z + ??0MutexLock@absl@@QAE@AAVMutex@1@@Z ??0NodeCounts@CordzStatistics@cord_internal@absl@@QAE@XZ ??0OstreamView@LogMessage@log_internal@absl@@QAE@AAULogMessageData@123@@Z ??0ParsedFloat@strings_internal@absl@@QAE@XZ @@ -1999,7 +2085,7 @@ EXPORTS ??0ProtoField@log_internal@absl@@QAE@XZ ??0Randen@random_internal@absl@@QAE@XZ ??0RawHashSetLayout@container_internal@absl@@QAE@III_N@Z - ??0ReaderMutexLock@absl@@QAE@PAVMutex@1@@Z + ??0ReaderMutexLock@absl@@QAE@AAVMutex@1@@Z ??0RefcountAndFlags@cord_internal@absl@@QAE@XZ ??0RefcountedRep@CrcCordState@crc_internal@absl@@QAE@XZ ??0Rep@CordBuffer@absl@@QAE@PAUCordRepFlat@cord_internal@2@@Z @@ -2018,7 +2104,7 @@ EXPORTS ??0ShiftState@strings_internal@absl@@QAE@XZ ??0SpinLock@base_internal@absl@@QAE@W4SchedulingMode@12@@Z ??0SpinLock@base_internal@absl@@QAE@XZ - ??0SpinLockHolder@base_internal@absl@@QAE@PAVSpinLock@12@@Z + ??0SpinLockHolder@base_internal@absl@@QAE@AAVSpinLock@12@@Z ??0Status@absl@@AAE@I@Z ??0Status@absl@@QAE@$$QAV01@@Z ??0Status@absl@@QAE@ABV01@@Z @@ -2050,12 +2136,12 @@ EXPORTS ??0Utf8ForCodePoint@debugging_internal@absl@@QAE@_K@Z ??0ViableSubstitution@strings_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0I@Z ??0Win32Waiter@synchronization_internal@absl@@QAE@XZ - ??0WriterMutexLock@absl@@QAE@PAVMutex@1@@Z + ??0WriterMutexLock@absl@@QAE@AAVMutex@1@@Z ??0ZoneInfoSource@cctz@time_internal@absl@@QAE@XZ - ??0_ConstructTransaction@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z - ??0_ConstructTransaction@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z - ??0_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAPAUTransition@cctz@time_internal@absl@@I@Z - ??0_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAPAUTransitionType@cctz@time_internal@absl@@I@Z + ??0_ConstructTransaction@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAE@PAV123@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z + ??0_ConstructTransaction@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@PAV123@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ??0_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@PAV123@PAUTransition@cctz@time_internal@absl@@I@Z + ??0_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@PAV123@PAUTransitionType@cctz@time_internal@absl@@I@Z ??0_ConstructTransaction@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAV123@AAU__deque_block_range@123@@Z ??0_ConstructTransaction@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@I@Z ??0_ConstructTransaction@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@I@Z @@ -2078,6 +2164,8 @@ EXPORTS ??0__destroy_vector@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@@Z ??0__destroy_vector@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@@Z ??0__destroy_vector@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@AAV123@@Z + ??0__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@23@@Z + ??0__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@23@@Z ??0absolute_lookup@time_zone@cctz@time_internal@absl@@QAE@XZ ??0civil_lookup@time_zone@cctz@time_internal@absl@@QAE@XZ ??0civil_transition@time_zone@cctz@time_internal@absl@@QAE@XZ @@ -2127,24 +2215,24 @@ EXPORTS ??1?$__policy_func@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__function@__Cr@std@@QAE@XZ ??1?$__policy_func@$$A6AXAAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QAE@XZ ??1?$__policy_func@$$A6A_NABVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QAE@XZ - ??1?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QAE@XZ ??1?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ ??1?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE@XZ - ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE@XZ ??1?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ ??1?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@23@@absl@@QAE@XZ ??1?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__Cr@std@@QAE@XZ @@ -2250,10 +2338,10 @@ EXPORTS ??1UnrecognizedFlag@absl@@QAE@XZ ??1WriterMutexLock@absl@@QAE@XZ ??1ZoneInfoSource@cctz@time_internal@absl@@UAE@XZ - ??1_ConstructTransaction@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1_ConstructTransaction@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ - ??1_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ ??1_ConstructTransaction@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ ??1_ConstructTransaction@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ ??1_ConstructTransaction@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ @@ -2299,6 +2387,7 @@ EXPORTS ??6absl@@YA?AVuint128@0@V10@H@Z ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@ABVCord@0@@Z ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@ABVStatus@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@VTime@0@@Z ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@Vcrc32c_t@0@@Z ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@Vint128@0@@Z ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@Vuint128@0@@Z @@ -2313,6 +2402,7 @@ EXPORTS ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@@Z ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@0123@@Z ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@W4weekday@0123@@Z + ??6log_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@UUnprintableWrapper@01@@Z ??6str_format_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@ABVStreamable@01@@Z ??6str_format_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@W4FormatConversionChar@1@@Z ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@01@@Z @@ -2422,9 +2512,6 @@ EXPORTS ??C?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@12@XZ ??C?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPAULogMessageData@LogMessage@log_internal@absl@@XZ ??C?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QBEPAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ - ??C?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@12@XZ - ??C?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@12@XZ - ??C?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPAVFlagStateInterface@flags_internal@absl@@XZ ??C?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPAVTimeZoneIf@cctz@time_internal@absl@@XZ ??C?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPAVTimeZoneInfo@cctz@time_internal@absl@@XZ ??CChunkIterator@Cord@absl@@QBEPBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ @@ -2433,6 +2520,7 @@ EXPORTS ??D?$BitMask@_K$07$02$0A@@container_internal@absl@@QBEIXZ ??D?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QAEAAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@1@XZ ??D?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QAEAAVFlagRegistry@flags_internal@1@XZ + ??D?$NoDestructor@VMutex@absl@@@absl@@QAEAAVMutex@1@XZ ??D?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QBEABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ??D?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QBEABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ??D?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QBEABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ @@ -2468,6 +2556,9 @@ EXPORTS ??D?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEAAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@12@XZ ??D?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QBEAAULogMessageData@LogMessage@log_internal@absl@@XZ ??D?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QBEAAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ??D?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEAAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@12@XZ + ??D?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEAAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@12@XZ + ??D?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QBEAAVFlagStateInterface@flags_internal@absl@@XZ ??DChunkIterator@Cord@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ??D__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBE?AU__deque_block_range@123@XZ ??Dabsl@@YA?AVint128@0@V10@0@Z @@ -2552,8 +2643,38 @@ EXPORTS ??Pabsl@@YA_NVint128@0@0@Z ??Pabsl@@YA_NVuint128@0@0@Z ??R@?0???$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PBVFormatArgImpl@str_format_internal@absl@@@23@I@Z@QBE?A?@@XZ + ??R@?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@QBE?A?@@PADI@Z + ??R@?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@QBE?A?@@PADI@Z + ??R@?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@QBE?A?@@PADI@Z + ??R@?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@QBE?A?@@PADI@Z + ??R@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@QBE?A?@@PADI@Z + ??R@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@QBE?A?@@PADI@Z + ??R@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@45@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@UNoFormatter@12@@Z@QBE?A?@@PADI@Z + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV0?0???$IntegerToString@H@12@YA?AV345@H@Z@@Z@QBE?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV0?0???$IntegerToString@I@12@YA?AV345@I@Z@@Z@QBE?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV0?0???$IntegerToString@J@12@YA?AV345@J@Z@@Z@QBE?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV0?0???$IntegerToString@K@12@YA?AV345@K@Z@@Z@QBE?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV0?0???$IntegerToString@_J@12@YA?AV345@_J@Z@@Z@QBE?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV0?0???$IntegerToString@_K@12@YA?AV345@_K@Z@@Z@QBE?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV0?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@12@YA?AV345@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@45@1V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@UNoFormatter@12@@Z@@Z@QBE?A?@@XZ + ??R@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@23@ABQBUCordRep@cord_internal@absl@@@Z@QBE?A?@@00@Z + ??R@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@QBE?A?@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@QBE?A?@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@QBE?A?@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z ??R@?0???$construct@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@ABUpiecewise_construct_t@__Cr@std@@$$QAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@67@@Z@QBE?A?@@XZ ??R@?0???$construct@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@ABUpiecewise_construct_t@__Cr@std@@$$QAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@67@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@ABV723@AAI@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@ABQAV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCordzHandle@cord_internal@absl@@ABQAV456@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVLogSink@absl@@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVLogSink@absl@@ABQAV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@ABQBV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCordzHandle@cord_internal@absl@@ABQBV456@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@ABU4567@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@ABU45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@$$QAPBV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU4567@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QAV423@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@$$QAW4Source@45@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z@QBE?A?@@XZ ??R@?0???A?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QAEAADI@Z@QBE?A?@@XZ ??R@?0???A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAEAAUPayload@status_internal@2@I@Z@QBE?A?@@XZ ??R@?0???A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QBEABUPayload@status_internal@2@I@Z@QBE?A?@@XZ @@ -2564,6 +2685,12 @@ EXPORTS ??R@?0???CChunkIterator@Cord@absl@@QBEPBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ@QBE?A?@@XZ ??R@?0???DChunkIterator@Cord@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ@QBE?A?@@XZ ??R@?0???EChunkIterator@Cord@absl@@QAEAAV123@XZ@QBE?A?@@XZ + ??R@?0???R0?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@QBE?A?@@PADI@Z@QBE?A?6@XZ + ??R@?0???R0?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@QBE?A?@@PADI@Z@QBE?A?6@XZ + ??R@?0???R0?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@QBE?A?@@PADI@Z@QBE?A?6@XZ + ??R@?0???R0?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@QBE?A?@@PADI@Z@QBE?A?6@XZ + ??R@?0???R0?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@QBE?A?@@PADI@Z@QBE?A?6@XZ + ??R@?0???R0?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@QBE?A?@@PADI@Z@QBE?A?6@XZ ??R@?0??Append@FormatSinkImpl@str_format_internal@absl@@QAEXID@Z@QBE?A?@@I@Z ??R@?0??AssertIsValidForComparison@container_internal@absl@@YAXPBW4ctrl_t@23@EPBE@Z@QBE?A?@@XZ ??R@?0??AssertSameContainer@container_internal@absl@@YAXPBW4ctrl_t@23@0ABQBX1PBE2@Z@QBE?A?@@_NPBD@Z @@ -2588,6 +2715,25 @@ EXPORTS ??R@?0??set_inline_size@Rep@InlineData@cord_internal@absl@@QAEXI@Z@QBE?A?@@XZ ??R@?0??transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@34@0@Z@QBE?A?@@XZ ??R@?0???$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PBVFormatArgImpl@str_format_internal@absl@@@23@I@Z@QBE?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@H@12@YA?AV345@H@Z@@Z@QBE?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@I@12@YA?AV345@I@Z@@Z@QBE?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@J@12@YA?AV345@J@Z@@Z@QBE?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@K@12@YA?AV345@K@Z@@Z@QBE?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@_J@12@YA?AV345@_J@Z@@Z@QBE?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@_K@12@YA?AV345@_K@Z@@Z@QBE?A?@@XZ + ??R@?0???$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@12@YA?AV345@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@45@1V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@UNoFormatter@12@@Z@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@ABV723@AAI@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@ABQAV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCordzHandle@cord_internal@absl@@ABQAV456@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVLogSink@absl@@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVLogSink@absl@@ABQAV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@ABQBV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCordzHandle@cord_internal@absl@@ABQBV456@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@ABU4567@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@ABU45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@$$QAPBV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU4567@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QAV423@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@$$QAW4Source@45@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z@QBE?A?@@XZ ??R@?0??AssertSameContainer@container_internal@absl@@YAXPBW4ctrl_t@23@0ABQBX1PBE2@Z@QBE?A?@@XZ ??R@?0??erase@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAEPAUPayload@status_internal@3@PBU453@@Z@QBE?A?@@XZ ??R?$ConvertToContainer@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@ABV123@@Z @@ -2609,17 +2755,15 @@ EXPORTS ??R?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@@Z ??R?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@12@@Z ??R?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@12@@Z - ??R?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QBE_NABU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z - ??R?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QBE_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@ABU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@@Z - ??R?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QBE_NABU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z - ??R?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QBE_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@ABU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@@Z + ??R?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@X@__Cr@std@@QBE@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@ABU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@@Z + ??R?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@X@__Cr@std@@QBE@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@ABU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@@Z ??R?$__policy_func@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__function@__Cr@std@@QBE?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@23@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z ??R?$__policy_func@$$A6AXAAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QBEXAAVCommandLineFlag@absl@@@Z ??R?$__policy_func@$$A6A_NABVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QBE_NABVCommandLineFlag@absl@@@Z ??R?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@12@@Z ??R?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@12@@Z - ??R?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QBE_NABU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z - ??R?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@__Cr@std@@QBEIABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QBE_NABU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QBEIABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z ??R?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QBEXPBVImpl@time_zone@cctz@time_internal@absl@@@Z ??R?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@QBEXPAULogMessageData@LogMessage@log_internal@absl@@@Z ??R?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@QBEXPAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z @@ -2655,6 +2799,8 @@ EXPORTS ??R__destroy_vector@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ ??R__destroy_vector@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ ??R__destroy_vector@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXXZ + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@@Z ??Sabsl@@YA?AVuint128@0@V10@@Z ??Tabsl@@YA?AVuint128@0@V10@0@Z ??Uabsl@@YA?AVuint128@0@V10@0@Z @@ -2948,7 +3094,7 @@ EXPORTS ?Data@CordRepBtree@cord_internal@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z ?Data@CordRepFlat@cord_internal@absl@@QAEPADXZ ?Data@CordRepFlat@cord_internal@absl@@QBEPBDXZ - ?DataGuard@FlagImpl@flags_internal@absl@@ABEPAVMutex@3@XZ + ?DataGuard@FlagImpl@flags_internal@absl@@ABEAAVMutex@3@XZ ?DataLossError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?DeadlineExceededError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?Deallocate@?$MallocAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@3@I@Z @@ -3015,7 +3161,6 @@ EXPORTS ?DoLoad@?$AtomicHook@P6AXXZ@base_internal@absl@@ABEP6AXXZXZ ?DoLoad@?$AtomicHook@P6AX_J@Z@base_internal@absl@@ABEP6AX_J@ZXZ ?DoLoad@?$AtomicHook@P6A_NW4LogSeverity@absl@@PBDHPAPADPAH@Z@base_internal@absl@@ABEP6A_NW4LogSeverity@3@PBDHPAPADPAH@ZXZ - ?DoSanitizeOnSetCtrl@container_internal@absl@@YAXABVCommonFields@12@IW4ctrl_t@12@I@Z ?DoStore@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@ABVCord@absl@@@Z@base_internal@absl@@AAE_NP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@ABVCord@3@@Z@Z ?DoStore@?$AtomicHook@P6AXPBDH000@Z@base_internal@absl@@AAE_NP6AXPBDH000@Z@Z ?DoStore@?$AtomicHook@P6AXPBDPBX@Z@base_internal@absl@@AAE_NP6AXPBDPBX@Z@Z @@ -3224,6 +3369,7 @@ EXPORTS ?FromUDate@absl@@YA?AVTime@1@N@Z ?FromUniversal@absl@@YA?AVTime@1@_J@Z ?FromUnixDuration@time_internal@absl@@YA?AVTime@2@VDuration@2@@Z + ?FromUnixNanos@absl@@YA?AVTime@1@_J@Z ?FromUnixSeconds@cctz@time_internal@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@_J@Z ?Generate@Randen@random_internal@absl@@QBEXPAX@Z ?Generate@RandenHwAes@random_internal@absl@@SAXPBXPAX@Z @@ -3346,6 +3492,7 @@ EXPORTS ?GetWord@?$BigUnsigned@$0FE@@strings_internal@absl@@QBEIH@Z ?GetYearDay@absl@@YAHV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z ?GlobalHashtablezSampler@container_internal@absl@@YAAAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?GlobalList@CordzInfo@cord_internal@absl@@CAPAUList@123@XZ ?GlobalRegistry@FlagRegistry@flags_internal@absl@@SAAAV123@XZ ?GuaranteedEqual@Condition@absl@@SA_NPBV12@0@Z ?Guard@?$NullGuard@C@log_internal@absl@@SAABCABC@Z @@ -3510,8 +3657,6 @@ EXPORTS ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@ABE?AUabsolute_lookup@time_zone@234@_JABUTransitionType@234@@Z ?LocalTimeZone@absl@@YA?AVTimeZone@1@XZ ?Lock@CordzInfo@cord_internal@absl@@QAEXW4MethodIdentifier@CordzUpdateTracker@23@@Z - ?Lock@FlagRegistry@flags_internal@absl@@QAEXXZ - ?Lock@Mutex@absl@@QAEXXZ ?LockSlow@Mutex@absl@@AAEXPBUMuHowS@2@PBVCondition@2@H@Z ?LockSlowLoop@Mutex@absl@@AAEXPAUSynchWaitParams@2@H@Z ?LockSlowWithDeadline@Mutex@absl@@AAE_NPBUMuHowS@2@PBVCondition@2@VKernelTimeout@synchronization_internal@2@H@Z @@ -3535,7 +3680,6 @@ EXPORTS ?MakeAbsNanos@KernelTimeout@synchronization_internal@absl@@QBE_JXZ ?MakeAbsTimespec@KernelTimeout@synchronization_internal@absl@@QBE?AUtimespec@@XZ ?MakeCheckFailString@status_internal@absl@@YAPBDPBVStatus@2@PBD@Z - ?MakeCheckOpUnprintableString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@C@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z @@ -3696,8 +3840,8 @@ EXPORTS ?Post@Win32Waiter@synchronization_internal@absl@@QAEXXZ ?PrecombineLengthMix@hash_internal@absl@@YA_K_KI@Z ?PrepareForSampling@HashtablezInfo@container_internal@absl@@QAEX_JIIIG@Z - ?PrepareInsertLarge@container_internal@absl@@YAIAAVCommonFields@12@ABUPolicyFunctions@12@IUFindInfo@12@@Z - ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YAIAAVCommonFields@12@ABUPolicyFunctions@12@IUFindInfo@12@V?$FunctionRef@$$A6AII@Z@2@@Z + ?PrepareInsertLarge@container_internal@absl@@YAIAAVCommonFields@12@ABUPolicyFunctions@12@IV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@@Z + ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YAIAAVCommonFields@12@ABUPolicyFunctions@12@IV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@V?$FunctionRef@$$A6AII@Z@2@@Z ?PrepareInsertSmallNonSoo@container_internal@absl@@YA?AU?$pair@PAW4ctrl_t@container_internal@absl@@PAX@__Cr@std@@AAVCommonFields@12@ABUPolicyFunctions@12@V?$FunctionRef@$$A6AII@Z@2@@Z ?PrepareToDie@LogMessage@log_internal@absl@@AAEXXZ ?PrepareToModify@Status@absl@@CAPAVStatusRep@status_internal@2@I@Z @@ -3718,6 +3862,7 @@ EXPORTS ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@time_zone@234@@Z ?PreviousCapacity@container_internal@absl@@YAII@Z ?Print@Streamable@str_format_internal@absl@@QBEAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@@Z + ?PrintTo@absl@@YAXABVLogEntry@1@PAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ ?ProgramUsageMessage@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?Ptr@GraphCycles@synchronization_internal@absl@@QAEPAXUGraphId@23@@Z @@ -3748,9 +3893,7 @@ EXPORTS ?ReadOneWord@FlagImpl@flags_internal@absl@@QBE_JXZ ?ReadSeedMaterialFromOSEntropy@random_internal@absl@@YA_NV?$Span@I@2@@Z ?ReadSequenceLockedData@FlagImpl@flags_internal@absl@@ABEXPAX@Z - ?ReaderLock@Mutex@absl@@QAEXXZ ?ReaderTryLockSlow@Mutex@absl@@AAE_NXZ - ?ReaderUnlock@Mutex@absl@@QAEXXZ ?Rebuild@CordRepBtree@cord_internal@absl@@CAXPAPAV123@PAV123@_N@Z ?Rebuild@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@@Z ?RecordClearedReservation@HashtablezInfoHandle@container_internal@absl@@QAEXXZ @@ -3818,9 +3961,9 @@ EXPORTS ?Resize@?$ResizeUninitializedTraits@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@X@strings_internal@absl@@SAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z ?ResizeAllocatedTableWithSeedChange@container_internal@absl@@YAXAAVCommonFields@12@ABUPolicyFunctions@12@I@Z ?ResourceExhaustedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z - ?Restore@FlagState@flags_internal@absl@@EBEXXZ + ?Restore@FlagState@flags_internal@absl@@EHAEXXZ ?RestoreState@FlagImpl@flags_internal@absl@@AAE_NABVFlagState@23@@Z - ?RestoreToRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ + ?RestoreToRegistry@FlagSaverImpl@flags_internal@absl@@QHAEXXZ ?Retire@flags_internal@absl@@YAXPBDPBXPAE@Z ?ReverseConsume@cord_internal@absl@@YAXPAUCordRep@12@V?$FunctionRef@$$A6AXPAUCordRep@cord_internal@absl@@II@Z@2@@Z ?RoundUp@cord_internal@absl@@YAIII@Z @@ -3852,12 +3995,6 @@ EXPORTS ?SetCordRep@CordzInfo@cord_internal@absl@@QAEXPAUCordRep@23@@Z ?SetCordRep@CordzUpdateScope@cord_internal@absl@@QBEXPAUCordRep@23@@Z ?SetCrcCordState@Cord@absl@@AAEXVCrcCordState@crc_internal@2@@Z - ?SetCtrl@container_internal@absl@@YAXABVCommonFields@12@IEI@Z - ?SetCtrl@container_internal@absl@@YAXABVCommonFields@12@IW4ctrl_t@12@I@Z - ?SetCtrlInLargeTable@container_internal@absl@@YAXABVCommonFields@12@IEI@Z - ?SetCtrlInLargeTable@container_internal@absl@@YAXABVCommonFields@12@IW4ctrl_t@12@I@Z - ?SetCtrlInSingleGroupTable@container_internal@absl@@YAXABVCommonFields@12@IEI@Z - ?SetCtrlInSingleGroupTable@container_internal@absl@@YAXABVCommonFields@12@IW4ctrl_t@12@I@Z ?SetCurrentThreadIdentity@base_internal@absl@@YAXPAUThreadIdentity@12@P6AXPAX@Z@Z ?SetExitOnDFatal@log_internal@absl@@YAX_N@Z ?SetExpectedChecksum@Cord@absl@@QAEXI@Z @@ -3875,7 +4012,6 @@ EXPORTS ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z ?SetInitialized@log_internal@absl@@YAXXZ - ?SetInlinedSize@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXI@Z ?SetIsAllocated@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXXZ ?SetIsAllocated@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXXZ ?SetIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXXZ @@ -3892,6 +4028,7 @@ EXPORTS ?SetPrecision@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPAVFormatConversionSpecImpl@23@@Z ?SetProgramInvocationName@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?SetProgramUsageMessage@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetSize@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXI@Z ?SetStackUnwinder@absl@@YAXP6AHPAPAXPAHHHPBX1@Z@Z ?SetStatusPayloadPrinter@status_internal@absl@@YAXP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@ABVCord@2@@Z@Z ?SetStderrThreshold@absl@@YAXW4LogSeverityAtLeast@1@@Z @@ -3951,7 +4088,6 @@ EXPORTS ?SkipCrcNode@cord_internal@absl@@YAPAUCordRep@12@PAU312@@Z ?SkipCrcNode@cord_internal@absl@@YAPBUCordRep@12@PBU312@@Z ?SleepFor@absl@@YAXVDuration@1@@Z - ?SlotAddress@container_internal@absl@@YAPAXPAXII@Z ?SlowIsEnabled0@VLogSite@log_internal@absl@@AAE_NH@Z ?SlowIsEnabled1@VLogSite@log_internal@absl@@AAE_NH@Z ?SlowIsEnabled2@VLogSite@log_internal@absl@@AAE_NH@Z @@ -4156,8 +4292,6 @@ EXPORTS ?UniversalEpoch@absl@@YA?AVTime@1@XZ ?UnknownError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?Unlock@CordzInfo@cord_internal@absl@@QAEXXZ - ?Unlock@FlagRegistry@flags_internal@absl@@QAEXXZ - ?Unlock@Mutex@absl@@QAEXXZ ?UnlockSlow@Mutex@absl@@AAEXPAUSynchWaitParams@2@@Z ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@F@Z ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@G@Z @@ -4254,8 +4388,6 @@ EXPORTS ?Write@FormatRawSinkImpl@str_format_internal@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?Write@SequenceLock@flags_internal@absl@@QAEXPAU?$atomic@_K@__Cr@std@@PBXI@Z ?WriteToStderr@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4LogSeverity@2@@Z - ?WriterLock@Mutex@absl@@QAEXXZ - ?WriterUnlock@Mutex@absl@@QAEXXZ ?ZeroDuration@absl@@YA?AVDuration@1@XZ ?__add_back_capacity@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXXZ ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z @@ -4333,8 +4465,12 @@ EXPORTS ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z ?__as_base@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@IGAE@XZ - ?__back_spare@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?__back_spare@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ ?__back_spare@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ ?__back_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ ?__back_spare_blocks@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ @@ -4355,69 +4491,109 @@ EXPORTS ?__call@?$__to_address_helper@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@X@__Cr@std@@SAPAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@ABV678@@Z@ABV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@23@@Z ?__capacity@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ ?__capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?__complete@?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z@@__Cr@std@@QAEXXZ ?__complete@?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ ?__compose@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU5678@@Z - ?__construct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXI@Z - ?__construct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXI@Z + ?__construct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXI@Z + ?__construct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXI@Z ?__construct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z ?__construct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z ?__copy_assign_alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXABV123@@Z ?__copy_assign_alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXABV123@U?$integral_constant@_N$0A@@23@@Z - ?__deallocate_node@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAEXPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@@Z - ?__deallocate_node@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@@Z - ?__destruct_at_begin@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z - ?__destruct_at_begin@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$00@23@@Z - ?__destruct_at_begin@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ?__destruct_at_begin@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$00@23@@Z - ?__destruct_at_end@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAVLogSink@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPAVLogSink@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@@Z - ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@U?$integral_constant@_N$0A@@23@@Z - ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z - ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@U?$integral_constant@_N$0A@@23@@Z + ?__deallocate_node@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAEXPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@23@@Z + ?__deallocate_node@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@23@@Z + ?__deallocate_node_list@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAEXPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@@Z + ?__deallocate_node_list@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@@Z + ?__destruct_at_begin@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__destruct_at_begin@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$00@23@@Z + ?__destruct_at_begin@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_begin@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$00@23@@Z + ?__destruct_at_end@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAPAVLogSink@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAPAVLogSink@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AAEXPAPAVLogSink@absl@@@Z ?__destruct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAUTransition@cctz@time_internal@absl@@@Z ?__destruct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAUTransitionType@cctz@time_internal@absl@@@Z ?__destruct_at_end@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAUViableSubstitution@strings_internal@absl@@@Z ?__end@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@SAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU4567@@Z ?__end@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@__Cr@std@@SAPBUPrefixCrc@CrcCordState@crc_internal@absl@@PBQBU4567@@Z - ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@XZ - ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@XZ - ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@XZ - ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@XZ ?__erase_to_end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@@Z + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEPAPAVCommandLineFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEPAPAVCordzHandle@cord_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEPAPAVLogSink@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEPAPBVCommandLineFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEPAPBVCordzHandle@cord_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAUTransition@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAUTransitionType@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEPAUUnrecognizedFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEPAUViableSubstitution@strings_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ ?__front_spare@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ ?__front_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PAVCommandLineFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PAVLogSink@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PBVCommandLineFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEAAV?$allocator@UUnrecognizedFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@XZ ?__get_np@?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@ABEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@XZ ?__get_np@?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@ABEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@XZ ?__get_value@?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@QAEAAPBUCordRep@cord_internal@absl@@XZ ?__get_value@?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@QAEAAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_value@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@QAEAAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@XZ + ?__get_value@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@QAEAAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@XZ ?__hash@?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@QBEIXZ ?__hash@?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QBEIXZ - ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@AAPAV?$__tree_node_base@PAX@23@PAV523@@Z - ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@AAPAV?$__tree_node_base@PAX@23@PAV523@@Z + ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@AAPAV?$__tree_node_base@PAX@23@PAV523@@Z + ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@AAPAV?$__tree_node_base@PAX@23@PAV523@@Z ?__local@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@SAPAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@Z ?__local@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@__Cr@std@@SAPBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@@Z ?__make_iter@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAE?AV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@23@PAPAVCommandLineFlag@absl@@@Z @@ -4435,11 +4611,33 @@ EXPORTS ?__move_range@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAUTransition@cctz@time_internal@absl@@00@Z ?__move_range@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAUTransitionType@cctz@time_internal@absl@@00@Z ?__node_alloc@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAEAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@XZ - ?__node_alloc@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@XZ - ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@23@XZ - ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@23@XZ ?__ptr@?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@QAEPAU123@XZ ?__ptr@?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAEPAU123@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QBEPAPAVCommandLineFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QBEPAPAVCordzHandle@cord_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QBEPAPAVLogSink@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QBEPAPBVCommandLineFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QBEPAPBVCordzHandle@cord_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QBEPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QBEPAUTransition@cctz@time_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QBEPAUTransitionType@cctz@time_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QBEPAUUnrecognizedFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QBEPAUViableSubstitution@strings_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QBEPAPAVCommandLineFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QBEPAPAVCordzHandle@cord_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QBEPAPAVLogSink@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QBEPAPBVCommandLineFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QBEPAPBVCordzHandle@cord_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QBEPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QBEPAUTransition@cctz@time_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QBEPAUTransitionType@cctz@time_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QBEPAUUnrecognizedFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QBEPAUViableSubstitution@strings_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ ?__recommend@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABEII@Z ?__recommend@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@ABEII@Z ?__recommend@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@ABEII@Z @@ -4453,7 +4651,7 @@ EXPORTS ?__recommend@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABEII@Z ?__recommend_blocks@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAII@Z ?__rehash_unique@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAEXI@Z - ?__rehash_unique@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEXI@Z + ?__rehash_unique@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEXI@Z ?__rewrap@?$__unwrap_iter_impl@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@SAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV45678@0@Z ?__rewrap@?$__unwrap_iter_impl@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU4567@0@Z ?__rewrap@?$__unwrap_iter_impl@PAPAVLogSink@absl@@$00@__Cr@std@@SAPAPAVLogSink@absl@@PAPAV45@0@Z @@ -4471,29 +4669,119 @@ EXPORTS ?__rewrap@?$__unwrap_range_impl@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@__Cr@std@@SA@PAUTransitionType@cctz@time_internal@absl@@0@Z ?__rewrap@?$__unwrap_range_impl@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@@__Cr@std@@SA@PBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z ?__rewrap@?$__unwrap_range_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V123@@__Cr@std@@SA@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@0@Z - ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@XZ - ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@XZ - ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAPAV?$__tree_node_base@PAX@23@XZ - ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAPAV?$__tree_node_base@PAX@23@XZ + ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@XZ + ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@XZ + ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAPAV?$__tree_node_base@PAX@23@XZ + ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAPAV?$__tree_node_base@PAX@23@XZ ?__segment@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@SAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@Z ?__segment@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@__Cr@std@@SAPBQBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEXPAPAVLogSink@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEXPAPAVLogSink@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEXPAPAVLogSink@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEXPAPAVLogSink@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@0@Z ?__size@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAIXZ ?__size@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEABIXZ ?__size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAIXZ ?__size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEABIXZ - ?__swap_out_circular_buffer@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAU?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAU?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AAEXAAU?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAU?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAU?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAU?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEPAUTransition@cctz@time_internal@absl@@AAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@23@PAU4567@@Z - ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEPAUTransitionType@cctz@time_internal@absl@@AAU?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@23@PAU4567@@Z - ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAU?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAU?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAU?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@23@@Z - ?__swap_out_circular_buffer@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAEXAAU?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@23@@Z + ?__swap_layouts@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAEXAAV?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@23@@Z + ?__swap_out_circular_buffer@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEPAUTransition@cctz@time_internal@absl@@AAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@PAU4567@@Z + ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEPAUTransitionType@cctz@time_internal@absl@@AAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@PAU4567@@Z + ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAEXAAV?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXAAV?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@23@@Z + ?__swap_without_allocator@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXAAV?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXAAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXAAV?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXAAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXAAV?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXAAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXAAV123@@Z ?__throw_length_error@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ ?__throw_length_error@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ ?__throw_length_error@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@CAXXZ @@ -4596,8 +4884,8 @@ EXPORTS ?assert_is_full@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABEXPBD@Z ?at_end@?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QBE_NXZ ?back@?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QAEAAPAUCordRep@cord_internal@2@XZ - ?back@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ - ?back@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ ?back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEABUPrefixCrc@CrcCordState@crc_internal@absl@@XZ ?back@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@XZ @@ -4634,12 +4922,25 @@ EXPORTS ?begin@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ ?begin@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ ?begin@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ - ?begin@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@XZ - ?begin@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ - ?begin@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ - ?begin@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPBQAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ - ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@23@XZ - ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@23@XZ + ?begin@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEPBQAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEPAPAVCommandLineFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEPAPAVCordzHandle@cord_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEPAPAVLogSink@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEPAPBVCommandLineFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEPAPBVCordzHandle@cord_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAUTransition@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAUTransitionType@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEPAUUnrecognizedFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEPAUViableSubstitution@strings_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@23@XZ + ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@23@XZ ?begin@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@$0BA@@__Cr@std@@QAE?AV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@23@XZ ?begin@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@XZ ?begin@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBE?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@XZ @@ -4669,23 +4970,23 @@ EXPORTS ?btree@CordRepBtreeNavigator@cord_internal@absl@@QBEPAVCordRepBtree@23@XZ ?btree@CordRepBtreeReader@cord_internal@absl@@QBEPAVCordRepBtree@23@XZ ?bucket_count@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QBEIXZ - ?bucket_count@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QBEIXZ + ?bucket_count@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QBEIXZ ?bytes_value@ProtoField@log_internal@absl@@QBE?AV?$Span@$$CBD@3@XZ - ?capacity@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?capacity@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?capacity@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?capacity@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?capacity@?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?capacity@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?capacity@?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?capacity@?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?capacity@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?capacity@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?capacity@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?capacity@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?capacity@?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?capacity@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?capacity@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEIXZ ?capacity@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QBEIXZ ?capacity@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ ?capacity@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ @@ -4708,21 +5009,21 @@ EXPORTS ?chunk_begin@Cord@absl@@QBE?AVChunkIterator@12@XZ ?chunk_end@Cord@absl@@QBE?AVChunkIterator@12@XZ ?clear@?$InlinedVector@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@absl@@QAEXXZ - ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEXXZ - ?clear@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?clear@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?clear@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?clear@?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?clear@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?clear@?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?clear@?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?clear@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?clear@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?clear@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?clear@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?clear@?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?clear@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?clear@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXXZ + ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QAEXXZ ?clear@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ ?clear@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAEXXZ ?clear@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEXXZ @@ -4864,8 +5165,8 @@ EXPORTS ?delimiter@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBEABVByAnyChar@3@XZ ?delimiter@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBEABVByChar@3@XZ ?description@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ - ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@@Z - ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@@Z + ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@@Z + ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@@Z ?destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@@Z ?destroy_slots@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXXZ ?destructor_impl@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXXZ @@ -4881,8 +5182,8 @@ EXPORTS ?empty@?$Span@$$CBD@absl@@QBE_NXZ ?empty@?$Span@D@absl@@QBE_NXZ ?empty@?$Span@I@absl@@QBE_NXZ - ?empty@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBE_NXZ - ?empty@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBE_NXZ + ?empty@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBE_NXZ + ?empty@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBE_NXZ ?empty@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBE_NXZ ?empty@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QBE_NXZ ?empty@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QBE_NXZ @@ -4895,6 +5196,7 @@ EXPORTS ?empty@CommonFields@container_internal@absl@@QBE_NXZ ?empty@Cord@absl@@QBE_NXZ ?empty@HashtableSize@container_internal@absl@@QBE_NXZ + ?encoded_message@LogEntry@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?encoded_remaining@LogMessageData@LogMessage@log_internal@absl@@QAEAAV?$Span@D@4@XZ ?end@?$BitMask@G$0BA@$0A@$0A@@container_internal@absl@@QBE?AV123@XZ ?end@?$BitMask@_K$07$02$0A@@container_internal@absl@@QBE?AV123@XZ @@ -4908,11 +5210,24 @@ EXPORTS ?end@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ ?end@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ ?end@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ - ?end@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@XZ - ?end@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ - ?end@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ - ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@23@XZ - ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@23@XZ + ?end@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEPAPAVCommandLineFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEPAPAVCordzHandle@cord_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEPAPAVLogSink@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEPAPBVCommandLineFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEPAPBVCordzHandle@cord_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAUTransition@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAUTransitionType@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEPAUUnrecognizedFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEPAUViableSubstitution@strings_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@23@XZ + ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@23@XZ ?end@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__deque_iterator@PBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@AAPBV12345@PAPAPBV12345@H$0A@@23@XZ ?end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@XZ ?end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBE?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@XZ @@ -4951,8 +5266,8 @@ EXPORTS ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV567@ABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@ABV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@967@ABVtime_zone@234@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PBD0AAMW4chars_format@1@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PBD0AANW4chars_format@1@@Z - ?front@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ - ?front@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?front@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEAAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?front@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ ?front@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@XZ ?gbswap_16@absl@@YAGG@Z ?gbswap_32@absl@@YAII@Z @@ -4966,6 +5281,7 @@ EXPORTS ?generation_ptr@HashSetIteratorGenerationInfoDisabled@container_internal@absl@@QBEPBEXZ ?get@?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@container_internal@absl@@QBEPAW4ctrl_t@23@XZ ?get@?$MaybeInitializedPtr@X@container_internal@absl@@QBEPAXXZ + ?get@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QAEPAUList@CordzInfo@cord_internal@2@XZ ?get@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QAEPAURefcountedRep@CrcCordState@crc_internal@2@XZ ?get@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QAEPAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ ?get@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QBEPBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ @@ -5000,8 +5316,10 @@ EXPORTS ?get@?$Storage@VCommonFields@container_internal@absl@@$0A@U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$0A@@internal_compressed_tuple@container_internal@absl@@QGBEABVCommonFields@34@XZ ?get@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@XZ ?get@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransitionType@cctz@time_internal@absl@@XZ + ?get@?$__tuple_leaf@$00AAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@$0A@@__Cr@std@@QAEAAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@XZ ?get@?$__tuple_leaf@$0A@$$QAPAVCommandLineFlag@absl@@$0A@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@XZ ?get@?$__tuple_leaf@$0A@AAPAVCommandLineFlag@absl@@$0A@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@XZ + ?get@?$__tuple_leaf@$0A@AAUFindInfo@container_internal@absl@@$0A@@__Cr@std@@QAEAAUFindInfo@container_internal@absl@@XZ ?get@?$__tuple_leaf@$0A@ABQAVCommandLineFlag@absl@@$0A@@__Cr@std@@QAEABQAVCommandLineFlag@absl@@XZ ?get@?$__tuple_leaf@$0A@PAVCommandLineFlag@absl@@$0A@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@XZ ?get@?$unique_ptr@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QBEPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ @@ -5013,6 +5331,7 @@ EXPORTS ?get@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@XZ ?get@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPAVZoneInfoSource@cctz@time_internal@absl@@XZ ?get@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QBEPAXXZ + ?get@PlacementImpl@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QAEPAUList@CordzInfo@cord_internal@3@XZ ?get@PlacementImpl@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QAEPAURefcountedRep@CrcCordState@crc_internal@3@XZ ?get@PlacementImpl@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QAEPAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@3@XZ ?get@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QBEPBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ @@ -5052,7 +5371,7 @@ EXPORTS ?has_timeout@KernelTimeout@synchronization_internal@absl@@QBE_NXZ ?has_zero_flag@FormatConversionSpecImpl@str_format_internal@absl@@QBE_NXZ ?hash_function@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAEAAU?$hash@PBUCordRep@cord_internal@absl@@@23@XZ - ?hash_function@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@XZ + ?hash_function@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ ?hash_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEAAUStringHash@23@XZ ?hash_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABEABUStringHash@23@XZ ?hash_with_seed@?$HashImpl@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@hash_internal@absl@@ABEIABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z @@ -5076,6 +5395,8 @@ EXPORTS ?inline_size@Rep@InlineData@cord_internal@absl@@QBEIXZ ?insert@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@56@@Z ?insert@?$unordered_set@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE?AU?$pair@V?$__hash_const_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@23@ABQBUCordRep@cord_internal@absl@@@Z + ?int32_value@ProtoField@log_internal@absl@@QBEHXZ + ?int64_value@ProtoField@log_internal@absl@@QBE_JXZ ?is_absolute_timeout@KernelTimeout@synchronization_internal@absl@@QBE_NXZ ?is_basic@FormatConversionSpecImpl@str_format_internal@absl@@QBE_NXZ ?is_conv@ConvTag@str_format_internal@absl@@QBE_NXZ @@ -5100,8 +5421,10 @@ EXPORTS ?iterator_at@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IAE?AViterator@123@I@Z ?iterator_at_ptr@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IAE?AViterator@123@U?$pair@PAW4ctrl_t@container_internal@absl@@PAX@__Cr@std@@@Z ?kDefaultIterControl@container_internal@absl@@3W4ctrl_t@12@A + ?key_comp@?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@QBEABU?$less@X@23@XZ + ?key_comp@?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@QBEABU?$less@X@23@XZ ?key_eq@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAEAAU?$equal_to@PBUCordRep@cord_internal@absl@@@23@XZ - ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@XZ + ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ ?length@CordRepBtreeReader@cord_internal@absl@@QBEIXZ ?length_mod@FormatConversionSpecImpl@str_format_internal@absl@@QBE?AW4LengthMod@3@XZ ?load@?$__atomic_base@P6AXABUHashtablezInfo@container_internal@absl@@@Z$0A@@__Cr@std@@QBEP6AXABUHashtablezInfo@container_internal@absl@@@ZW4memory_order@23@@Z @@ -5116,6 +5439,7 @@ EXPORTS ?load@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__Cr@std@@QBE?AW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z ?load_time_zone@cctz@time_internal@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAVtime_zone@123@@Z ?local_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?lock@FlagRegistry@flags_internal@absl@@QAEXXZ ?lock@Mutex@absl@@QAEXXZ ?lock@SpinLock@base_internal@absl@@QAEXXZ ?lock_shared@Mutex@absl@@QAEXXZ @@ -5129,7 +5453,7 @@ EXPORTS ?max@?$numeric_limits@Vint128@absl@@@__Cr@std@@SA?AVint128@absl@@XZ ?max@?$numeric_limits@Vuint128@absl@@@__Cr@std@@SA?AVuint128@absl@@XZ ?max_load_factor@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAEAAMXZ - ?max_load_factor@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEAAMXZ + ?max_load_factor@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEAAMXZ ?max_size@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ ?max_size@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ ?max_size@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ @@ -5183,10 +5507,10 @@ EXPORTS ?poison@InlineData@cord_internal@absl@@QAEXXZ ?poison_this@InlineData@cord_internal@absl@@QAEXXZ ?pop_back@?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QAEXXZ - ?pop_back@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?pop_back@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ ?pop_back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?pop_front@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ?pop_front@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?pop_front@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXXZ + ?pop_front@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ ?precision@FormatConversionSpecImpl@str_format_internal@absl@@QBEHXZ ?predicate@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBEABUAllowEmpty@3@XZ ?predicate@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBEABUSkipEmpty@3@XZ @@ -5347,10 +5671,12 @@ EXPORTS ?size@?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEAAIXZ ?size@?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QBEIXZ ?size@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAEAAIXZ - ?size@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEAAIXZ - ?size@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?size@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ - ?size@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QBEIXZ + ?size@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEAAIXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?size@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QBEIXZ ?size@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@$0BA@@__Cr@std@@QBEIXZ ?size@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ ?size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ @@ -5413,6 +5739,9 @@ EXPORTS ?text@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?text@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?text@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message@LogEntry@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_newline@LogEntry@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_prefix@LogEntry@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?text_message_with_prefix_and_newline@LogEntry@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?text_message_with_prefix_and_newline_c_str@LogEntry@absl@@QBEPBDXZ ?thread_identity@PerThreadSynch@base_internal@absl@@QAEPAUThreadIdentity@23@XZ @@ -5430,7 +5759,10 @@ EXPORTS ?try_lock@Mutex@absl@@QAE_NXZ ?try_lock_shared@Mutex@absl@@QAE_NXZ ?type@ProtoField@log_internal@absl@@QBE?AW4WireType@23@XZ + ?uint32_value@ProtoField@log_internal@absl@@QBEIXZ + ?uint64_value@ProtoField@log_internal@absl@@QBE_KXZ ?unchecked_deref@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABEAAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@XZ + ?unlock@FlagRegistry@flags_internal@absl@@QAEXXZ ?unlock@Mutex@absl@@QAEXXZ ?unlock@SpinLock@base_internal@absl@@QAEXXZ ?unlock_shared@Mutex@absl@@QAEXXZ @@ -5438,8 +5770,8 @@ EXPORTS ?utc_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ ?value@ConvertibleToStringView@strings_internal@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?value@InputValue@UnboundConversion@str_format_internal@absl@@QBEHXZ - ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@XZ - ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@XZ + ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ ?valueless_by_exception@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@QBE_NXZ ?valueless_by_exception@?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@QBE_NXZ ?verbosity@LogEntry@absl@@QBEHXZ diff --git a/naiveproxy/src/third_party/abseil-cpp/symbols_x86_dbg_cxx23.def b/naiveproxy/src/third_party/abseil-cpp/symbols_x86_dbg_cxx23.def new file mode 100644 index 0000000000..046a566d81 --- /dev/null +++ b/naiveproxy/src/third_party/abseil-cpp/symbols_x86_dbg_cxx23.def @@ -0,0 +1,5817 @@ +EXPORTS + ?$TSS0@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PIAXPIBXIV54@_N@Z@4HA + ??$?0$$CBD$0A@@VoidPtr@str_format_internal@absl@@QAE@PBD@Z + ??$?0$$CBU?$atomic@_N@__Cr@std@@@Condition@absl@@QAE@P6A_NPBU?$atomic@_N@__Cr@std@@@Z0@Z + ??$?0$$CBUCordRep@cord_internal@absl@@@Hex@absl@@QAE@PBUCordRep@cord_internal@1@W4PadSpec@1@@Z + ??$?0$$CBVFormatArgImpl@str_format_internal@absl@@$$CBV012@@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QAE@V?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@@Z + ??$?0$$CB_W$0A@@VoidPtr@str_format_internal@absl@@QAE@PB_W@Z + ??$?0$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V$$Z$0A@$$Z$S@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@AAE@Upiecewise_construct_t@12@AAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@AAV?$tuple@$$V@12@U?$__integer_sequence@I$0A@@12@U?$__integer_sequence@I$S@12@@Z + ??$?0$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@QAE@Upiecewise_construct_t@12@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@Z + ??$?0$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QAPAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@AAE@Upiecewise_construct_t@12@AAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AAV?$tuple@$$QAPAVCommandLineFlag@absl@@@12@U?$__integer_sequence@I$0A@@12@3@Z + ??$?0$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QAPAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@__Cr@std@@AAE@Upiecewise_construct_t@12@AAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AAV?$tuple@$$QAPAVCommandLineFlag@absl@@@12@U?$__integer_sequence@I$0A@@12@3@Z + ??$?0$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QAPAVCommandLineFlag@absl@@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@QAE@Upiecewise_construct_t@12@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QAPAVCommandLineFlag@absl@@@12@@Z + ??$?0$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QAPAVCommandLineFlag@absl@@@?$pair@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@__Cr@std@@QAE@Upiecewise_construct_t@12@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QAPAVCommandLineFlag@absl@@@12@@Z + ??$?0$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QAPAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@AAE@Upiecewise_construct_t@12@AAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AAV?$tuple@$$QAPAVCommandLineFlag@absl@@@12@U?$__integer_sequence@I$0A@@12@3@Z + ??$?0$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QAPAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@__Cr@std@@AAE@Upiecewise_construct_t@12@AAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AAV?$tuple@$$QAPAVCommandLineFlag@absl@@@12@U?$__integer_sequence@I$0A@@12@3@Z + ??$?0$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QAPAVCommandLineFlag@absl@@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@QAE@Upiecewise_construct_t@12@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QAPAVCommandLineFlag@absl@@@12@@Z + ??$?0$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$Z$$QAPAVCommandLineFlag@absl@@@?$pair@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@__Cr@std@@QAE@Upiecewise_construct_t@12@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QAPAVCommandLineFlag@absl@@@12@@Z + ??$?0$$T@?$Storage@PAPAUCordRep@cord_internal@absl@@$00U?$StorageTag@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QA$$T@Z + ??$?0$$T@?$Storage@PAPAVLogSink@absl@@$00U?$StorageTag@V?$allocator@PAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@absl@@@internal_compressed_tuple@container_internal@2@$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QA$$T@Z + ??$?0$$T@?$Storage@PAUPayload@status_internal@absl@@$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QA$$T@Z + ??$?0$$V$0A@@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QAE@XZ + ??$?0$$V$0A@@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QAE@XZ + ??$?0$$V$0A@@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QAE@XZ + ??$?0$$V$0A@@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QAE@XZ + ??$?0$$V$0A@@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QAE@XZ + ??$?0$$V$0A@@?$NoDestructor@VMutex@absl@@@absl@@QAE@XZ + ??$?0$$V@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??$?0$$V@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??$?0$$V@PlacementImpl@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QAE@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QAE@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QAE@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QAE@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QAE@XZ + ??$?0$$V@PlacementImpl@?$NoDestructor@VMutex@absl@@@absl@@QAE@XZ + ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@QAE@AAPAVCommandLineFlag@absl@@AA_N@Z + ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@QAE@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@45@@Z + ??$?0$$Y_And@__Cr@std@@$0A@@?$tuple@ABQAVCommandLineFlag@absl@@@__Cr@std@@QAE@ABQAVCommandLineFlag@absl@@@Z + ??$?0$00X@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??$?0$00X@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??$?0$00X@?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@PAPBVImpl@time_zone@cctz@time_internal@absl@@$$QAV?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@PAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAV?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@12@$$QAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@12@$$QAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAULogMessageData@LogMessage@log_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@UThreadIdentity@base_internal@absl@@P6AXPAX@Z@__Cr@std@@QAE@PAUThreadIdentity@base_internal@absl@@ABQ6AXPAX@Z@Z + ??$?0$00X@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QAE@$$T@Z + ??$?0$00X@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QAE@PAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z + ??$?0$00X@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??$?0$00X@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@12@$$QAV?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@12@$$QAV?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$?0$00X@?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAVFallbackCrcMemcpyEngine@crc_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAVFlagState@flags_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@$$T@Z + ??$?0$00X@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAVTimeZoneInfo@cctz@time_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAVTimeZoneLibC@cctz@time_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@$$T@Z + ??$?0$00X@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAVZoneInfoSource@cctz@time_internal@absl@@@Z + ??$?0$00X@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QAE@$$T@Z + ??$?0$00X@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QAE@PAX$$QAUDynValueDeleter@flags_internal@absl@@@Z + ??$?0AAI@?$Storage@I$0A@U?$StorageTag@IV?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@AAI@Z + ??$?0AAIABV?$allocator@D@__Cr@std@@$00@?$CompressedTuple@IV?$allocator@D@__Cr@std@@@container_internal@absl@@QAE@AAIABV?$allocator@D@__Cr@std@@@Z + ??$?0AAIABV?$allocator@D@__Cr@std@@@?$CompressedTupleImpl@V?$CompressedTuple@IV?$allocator@D@__Cr@std@@@container_internal@absl@@U?$integer_sequence@I$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@AAIABV?$allocator@D@56@@Z + ??$?0AAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@AAPAPAPBV01234@$0A@@?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@__Cr@std@@QAE@AAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$?0AAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV01234@$0A@@?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@__Cr@std@@QAE@AAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@$$QAPAPAPBV34567@@Z + ??$?0AAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@AAPAPAU0123@$0A@@?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@__Cr@std@@QAE@AAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$?0AAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU0123@$0A@@?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@__Cr@std@@QAE@AAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAPAPAU3456@@Z + ??$?0AAPAPAVCommandLineFlag@absl@@AA_N$0A@@?$pair@PAPAVCommandLineFlag@absl@@_N@__Cr@std@@QAE@AAPAPAVCommandLineFlag@absl@@AA_N@Z + ??$?0AAPAPAVLogSink@absl@@PAPAV01@$0A@@?$pair@PAPAVLogSink@absl@@PAPAV12@@__Cr@std@@QAE@AAPAPAVLogSink@absl@@$$QAPAPAV34@@Z + ??$?0AAPAPBVCommandLineFlag@absl@@AA_N$0A@@?$pair@PAPBVCommandLineFlag@absl@@_N@__Cr@std@@QAE@AAPAPBVCommandLineFlag@absl@@AA_N@Z + ??$?0AAPAUTransition@cctz@time_internal@absl@@AAPAU0123@$0A@@?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@__Cr@std@@QAE@AAPAUTransition@cctz@time_internal@absl@@0@Z + ??$?0AAPAUTransition@cctz@time_internal@absl@@PAU0123@$0A@@?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@__Cr@std@@QAE@AAPAUTransition@cctz@time_internal@absl@@$$QAPAU3456@@Z + ??$?0AAPAUTransitionType@cctz@time_internal@absl@@AAPAU0123@$0A@@?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@__Cr@std@@QAE@AAPAUTransitionType@cctz@time_internal@absl@@0@Z + ??$?0AAPAUTransitionType@cctz@time_internal@absl@@PAU0123@$0A@@?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@__Cr@std@@QAE@AAPAUTransitionType@cctz@time_internal@absl@@$$QAPAU3456@@Z + ??$?0AAPAVCommandLineFlag@absl@@$0A@@?$__tuple_leaf@$0A@AAPAVCommandLineFlag@absl@@$0A@@__Cr@std@@QAE@AAPAVCommandLineFlag@absl@@@Z + ??$?0AAPAVCommandLineFlag@absl@@$0A@@?$__tuple_leaf@$0A@PAVCommandLineFlag@absl@@$0A@@__Cr@std@@QAE@AAPAVCommandLineFlag@absl@@@Z + ??$?0AAPAVCommandLineFlag@absl@@AA_N$0A@@?$tuple@PAVCommandLineFlag@absl@@_N@__Cr@std@@QAE@AAPAVCommandLineFlag@absl@@AA_N@Z + ??$?0AAPAVCommandLineFlag@absl@@AA_N@?$__tuple_impl@U?$__integer_sequence@I$0A@$00@__Cr@std@@AAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@QAE@U__forward_args@12@AAPAVCommandLineFlag@absl@@AA_N@Z + ??$?0AAPAVCommandLineFlag@absl@@AA_N@?$__tuple_impl@U?$__integer_sequence@I$0A@$00@__Cr@std@@PAVCommandLineFlag@absl@@_N@__Cr@std@@QAE@U__forward_args@12@AAPAVCommandLineFlag@absl@@AA_N@Z + ??$?0AAPBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU0123@$0A@@?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@__Cr@std@@QAE@AAPBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAPAU3456@@Z + ??$?0AAUFindInfo@container_internal@absl@@$0A@@?$__tuple_leaf@$0A@AAUFindInfo@container_internal@absl@@$0A@@__Cr@std@@QAE@AAUFindInfo@container_internal@absl@@@Z + ??$?0AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@12@@?$__tuple_impl@U?$__integer_sequence@I$0A@$00@__Cr@std@@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@56@@__Cr@std@@QAE@U__forward_args@12@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@56@@Z + ??$?0AAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV234@@Z@@?$__temp_value@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@AAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@ABV678@@Z@@Z + ??$?0AAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@$0A@@?$__tuple_leaf@$00AAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@$0A@@__Cr@std@@QAE@AAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@@Z + ??$?0AAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@12@$0A@@?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__Cr@std@@QAE@AAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@$$QAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@12@@Z + ??$?0AAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$$T$00@?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@absl@@@container_internal@absl@@QAE@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$$QA$$T@Z + ??$?0AAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@absl@@@container_internal@absl@@U?$integer_sequence@I$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@56@$$QA$$T@Z + ??$?0AAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@56@@Z + ??$?0AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@$$T$00@?$CompressedTuple@V?$allocator@PAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@absl@@@container_internal@absl@@QAE@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@$$QA$$T@Z + ??$?0AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@absl@@@container_internal@absl@@U?$integer_sequence@I$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@AAV?$allocator@PAVLogSink@absl@@@56@$$QA$$T@Z + ??$?0AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@@?$Storage@V?$allocator@PAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@AAV?$allocator@PAVLogSink@absl@@@56@@Z + ??$?0AAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$T$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@absl@@@container_internal@absl@@QAE@AAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$QA$$T@Z + ??$?0AAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@absl@@@container_internal@absl@@U?$integer_sequence@I$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@AAV?$allocator@UPayload@status_internal@absl@@@56@$$QA$$T@Z + ??$?0AAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@AAV?$allocator@UPayload@status_internal@absl@@@56@@Z + ??$?0AAVCord@absl@@$0A@@?$optional@VCord@absl@@@__Cr@std@@QAE@AAVCord@absl@@@Z + ??$?0AAVCord@absl@@@?$__optional_destruct_base@VCord@absl@@$0A@@__Cr@std@@QAE@Uin_place_t@12@AAVCord@absl@@@Z + ??$?0AAY0BM@$$CBD$0A@@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QAE@AAY0BM@$$CBD@Z + ??$?0AAY0BM@$$CBD@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QAE@AAY0BM@$$CBD@Z + ??$?0ABQAVCommandLineFlag@absl@@$0A@@?$__tuple_leaf@$0A@ABQAVCommandLineFlag@absl@@$0A@@__Cr@std@@QAE@ABQAVCommandLineFlag@absl@@@Z + ??$?0ABQAVCommandLineFlag@absl@@@?$__tuple_impl@U?$__integer_sequence@I$0A@@__Cr@std@@ABQAVCommandLineFlag@absl@@@__Cr@std@@QAE@U__forward_args@12@ABQAVCommandLineFlag@absl@@@Z + ??$?0ABV?$allocator@D@__Cr@std@@@?$Storage@V?$allocator@D@__Cr@std@@$00U?$StorageTag@IV?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@ABV?$allocator@D@56@@Z + ??$?0ABV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@ABV?$allocator@UPayload@status_internal@absl@@@56@@Z + ??$?0ABV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@container_internal@absl@@QAE@ABV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$QAI@Z + ??$?0ABV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@ABV?$allocator@UPayload@status_internal@absl@@@56@$$QAI@Z + ??$?0ABV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@ABV?$allocator@VFormatArgImpl@str_format_internal@absl@@@56@@Z + ??$?0ABV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I@container_internal@absl@@QAE@ABV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$$QAI@Z + ??$?0ABV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@ABV?$allocator@VFormatArgImpl@str_format_internal@absl@@@56@$$QAI@Z + ??$?0ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V$$Z$0A@$$Z$S@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AAE@Upiecewise_construct_t@12@AAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@AAV?$tuple@$$V@12@U?$__integer_sequence@I$0A@@12@U?$__integer_sequence@I$S@12@@Z + ??$?0ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V$$Z$0A@$$Z$S@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@AAE@Upiecewise_construct_t@12@AAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@AAV?$tuple@$$V@12@U?$__integer_sequence@I$0A@@12@U?$__integer_sequence@I$S@12@@Z + ??$?0ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QAE@Upiecewise_construct_t@12@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@Z + ??$?0ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$Z$$V@?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@QAE@Upiecewise_construct_t@12@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@Z + ??$?0ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$ZABQAVCommandLineFlag@absl@@$$Z$0A@$$Z$0A@@?$pair@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@ABQAVCommandLineFlag@absl@@@23@@__Cr@std@@AAE@Upiecewise_construct_t@12@AAV?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@AAV?$tuple@ABQAVCommandLineFlag@absl@@@12@U?$__integer_sequence@I$0A@@12@3@Z + ??$?0ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$ZABQAVCommandLineFlag@absl@@@?$pair@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@ABQAVCommandLineFlag@absl@@@23@@__Cr@std@@QAE@Upiecewise_construct_t@12@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@ABQAVCommandLineFlag@absl@@@12@@Z + ??$?0D@?$allocator@U?$AlignedType@$03@container_internal@absl@@@__Cr@std@@QAE@ABV?$allocator@D@12@@Z + ??$?0D@?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@ABV?$allocator@D@12@@Z + ??$?0D@FormatArgImpl@str_format_internal@absl@@QAE@ABD@Z + ??$?0H@FormatArgImpl@str_format_internal@absl@@QAE@ABH@Z + ??$?0I@?$Storage@I$00U?$StorageTag@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAI@Z + ??$?0I@?$Storage@I$00U?$StorageTag@V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAI@Z + ??$?0I@?$Storage@I$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAI@Z + ??$?0I@?$Storage@I$00U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAI@Z + ??$?0I@FormatArgImpl@str_format_internal@absl@@QAE@ABI@Z + ??$?0M@FormatArgImpl@str_format_internal@absl@@QAE@ABM@Z + ??$?0N@FormatArgImpl@str_format_internal@absl@@QAE@ABN@Z + ??$?0PAI@?$SaltedSeedSeq@Vseed_seq@__Cr@std@@@random_internal@absl@@QAE@PAI0@Z + ??$?0PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV01234@$0A@@?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@__Cr@std@@QAE@$$QAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$?0PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU0123@$0A@@?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@__Cr@std@@QAE@$$QAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$?0PAPAVLogSink@absl@@$0A@@?$__wrap_iter@PBQAVLogSink@absl@@@__Cr@std@@QAE@ABV?$__wrap_iter@PAPAVLogSink@absl@@@12@@Z + ??$?0PAPAVLogSink@absl@@PAPAV01@$0A@@?$pair@PAPAVLogSink@absl@@PAPAV12@@__Cr@std@@QAE@$$QAPAPAVLogSink@absl@@0@Z + ??$?0PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAU0123@PAPAU0123@$0A@@?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@QAE@ABV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@12@@Z + ??$?0PAUTransition@cctz@time_internal@absl@@$0A@@?$__wrap_iter@PBUTransition@cctz@time_internal@absl@@@__Cr@std@@QAE@ABV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@12@@Z + ??$?0PAUTransition@cctz@time_internal@absl@@PAU0123@$0A@@?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@__Cr@std@@QAE@$$QAPAUTransition@cctz@time_internal@absl@@0@Z + ??$?0PAUTransitionType@cctz@time_internal@absl@@$0A@@?$__wrap_iter@PBUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QAE@ABV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@12@@Z + ??$?0PAUTransitionType@cctz@time_internal@absl@@PAU0123@$0A@@?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@__Cr@std@@QAE@$$QAPAUTransitionType@cctz@time_internal@absl@@0@Z + ??$?0PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV234@@Z@PAU0?1???R1234@QBE?AV567@0@Z@$0A@@?$pair@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@PAU1?1???R2345@QBE?AV678@0@Z@@__Cr@std@@QAE@$$QAPAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@ABV567@@Z@1@Z + ??$?0PAVCommandLineFlag@absl@@$0A@@?$__tuple_leaf@$0A@$$QAPAVCommandLineFlag@absl@@$0A@@__Cr@std@@QAE@$$QAPAVCommandLineFlag@absl@@@Z + ??$?0PAVCommandLineFlag@absl@@$0A@@?$tuple@$$QAPAVCommandLineFlag@absl@@@__Cr@std@@QAE@$$QAPAVCommandLineFlag@absl@@@Z + ??$?0PAVCommandLineFlag@absl@@@?$__tuple_impl@U?$__integer_sequence@I$0A@@__Cr@std@@$$QAPAVCommandLineFlag@absl@@@__Cr@std@@QAE@U__forward_args@12@$$QAPAVCommandLineFlag@absl@@@Z + ??$?0PAW4ctrl_t@container_internal@absl@@AAPAX$0A@@?$pair@PAW4ctrl_t@container_internal@absl@@PAX@__Cr@std@@QAE@$$QAPAW4ctrl_t@container_internal@absl@@AAPAX@Z + ??$?0PAW4ctrl_t@container_internal@absl@@ABQAX$0A@@?$pair@PAW4ctrl_t@container_internal@absl@@PAX@__Cr@std@@QAE@$$QAPAW4ctrl_t@container_internal@absl@@ABQAX@Z + ??$?0PAW4ctrl_t@container_internal@absl@@PAX$0A@@?$pair@PAW4ctrl_t@container_internal@absl@@PAX@__Cr@std@@QAE@$$QAPAW4ctrl_t@container_internal@absl@@$$QAPAX@Z + ??$?0PAX@FlagState@flags_internal@absl@@QAE@AAVFlagImpl@12@ABQAX_N2_J@Z + ??$?0PBD@FormatArgImpl@str_format_internal@absl@@QAE@ABQBD@Z + ??$?0PBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU0123@$0A@@?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@__Cr@std@@QAE@$$QAPBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAPAU3456@@Z + ??$?0PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU0123@$0A@@?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@@__Cr@std@@QAE@$$QAPBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$?0PBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@$0A@@?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@QAE@$$QAPBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@12@@Z + ??$?0PBVFormatArgImpl@str_format_internal@absl@@$0A@@?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QAE@PBVFormatArgImpl@str_format_internal@1@0ABV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@Z + ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@@?$FunctionRef@$$A6AII@Z@absl@@IAE@Uin_place_t@__Cr@std@@$$QAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@X@?$FunctionRef@$$A6AII@Z@absl@@QAE@$$QAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$?0U?$array@D$0DKJI@@__Cr@std@@XU012@H@?$Span@D@absl@@QAE@AAU?$array@D$0DKJI@@__Cr@std@@@Z + ??$?0UFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@12@$0A@@?$pair@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@QAE@$$QAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@45@@Z + ??$?0UHex@absl@@X@AlphaNum@absl@@QAE@ABUHex@1@$$QAVStringifySink@strings_internal@1@@Z + ??$?0UStringEq@container_internal@absl@@@?$Storage@UStringEq@container_internal@absl@@$01U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAUStringEq@23@@Z + ??$?0UStringHash@container_internal@absl@@@?$Storage@UStringHash@container_internal@absl@@$00U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAUStringHash@23@@Z + ??$?0USynchEvent@absl@@@Condition@absl@@QAE@P6A_NPAUSynchEvent@1@@Z0@Z + ??$?0Uday_tag@detail@cctz@time_internal@absl@@@?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@PAX@Z + ??$?0Uday_tag@detail@cctz@time_internal@absl@@@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@PAX@Z + ??$?0Uday_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@PAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uday_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uday_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uday_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uday_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uday_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uday_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uhour_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@1234@PAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uhour_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uhour_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uminute_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@1234@PAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uminute_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uminute_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Umonth_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@1234@PAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Umonth_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Umonth_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Usecond_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@PAX@Z + ??$?0Usecond_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@PAX@Z + ??$?0Usecond_tag@detail@cctz@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@PAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Usecond_tag@time_internal@absl@@@?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Usecond_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uyear_tag@detail@cctz@time_internal@absl@@@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@1234@PAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PAX@Z + ??$?0Uyear_tag@time_internal@absl@@@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@ABV?$civil_time@Uyear_tag@time_internal@absl@@@1234@PAX@Z + ??$?0V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@$0A@@?$__policy_func@$$A6AXAAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QAE@$$QAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@@Z + ??$?0V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@X@?$function@$$A6AXAAVCommandLineFlag@absl@@@Z@__Cr@std@@QAE@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@@Z + ??$?0V?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@XV01@H@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QAE@ABV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@1@@Z + ??$?0V?$Span@D@absl@@XV01@$0A@@?$Span@$$CBD@absl@@QAE@ABV?$Span@D@1@@Z + ??$?0V?$Span@I@absl@@XV01@$0A@@?$Span@$$CBI@absl@@QAE@ABV?$Span@I@1@@Z + ??$?0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V012@$0A@@?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V123@@__Cr@std@@QAE@$$QAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@0@Z + ??$?0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@12@$0A@@?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__Cr@std@@QAE@$$QAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@$$QAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@12@@Z + ??$?0V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@AA_N$0A@@?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@QAE@$$QAV?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@AA_N@Z + ??$?0V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N$0A@@?$pair@V?$__hash_const_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@QAE@$$QAU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@12@@Z + ??$?0V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@AA_N$0A@@?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@QAE@$$QAV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@AA_N@Z + ??$?0V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@AA_N$0A@@?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@__Cr@std@@QAE@$$QAV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@12@AA_N@Z + ??$?0V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@AA_N$0A@@?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@__Cr@std@@QAE@$$QAV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@12@AA_N@Z + ??$?0V?$allocator@D@__Cr@std@@@?$Storage@V?$allocator@D@__Cr@std@@$02U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAV?$allocator@D@56@@Z + ??$?0V?$allocator@D@__Cr@std@@@AlphaNum@absl@@QAE@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?0V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAV?$allocator@PAUCordRep@cord_internal@absl@@@56@@Z + ??$?0V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@I@container_internal@absl@@QAE@$$QAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$$QAI@Z + ??$?0V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAV?$allocator@PAUCordRep@cord_internal@absl@@@56@$$QAI@Z + ??$?0V?$allocator@PAVLogSink@absl@@@__Cr@std@@@?$Storage@V?$allocator@PAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAV?$allocator@PAVLogSink@absl@@@56@@Z + ??$?0V?$allocator@PAVLogSink@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@container_internal@absl@@QAE@$$QAV?$allocator@PAVLogSink@absl@@@__Cr@std@@$$QAI@Z + ??$?0V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAV?$allocator@PAVLogSink@absl@@@56@$$QAI@Z + ??$?0V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@ABQBUCordRep@cord_internal@absl@@@?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@QAE@IAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@ABQBUCordRep@cord_internal@absl@@@Z + ??$?0V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@12@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@QAE@IAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAV?$allocator@UPayload@status_internal@absl@@@56@@Z + ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@container_internal@absl@@QAE@$$QAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$$QAI@Z + ??$?0V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAV?$allocator@UPayload@status_internal@absl@@@56@$$QAI@Z + ??$?0V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@12@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@QAE@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$?0V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@12@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@V?$tuple@$$V@12@@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@QAE@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$?0V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QAE@PAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QAE@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QAE@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@QAE@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$?0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@$0A@@?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@QAE@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@$$QAPAVCommandLineFlag@absl@@@Z + ??$?0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@$0A@@?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@QAE@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@$$QAPAVCommandLineFlag@absl@@@Z + ??$?0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XV012@$0A@@?$Span@$$CBD@absl@@QAE@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$?0VBufferRawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QAE@PAVBufferRawSink@12@@Z + ??$?0VCommonFields@container_internal@absl@@@?$Storage@VCommonFields@container_internal@absl@@$0A@U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAVCommonFields@23@@Z + ??$?0VCommonFields@container_internal@absl@@UStringHash@12@UStringEq@12@V?$allocator@D@__Cr@std@@$00@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QAE@$$QAVCommonFields@12@$$QAUStringHash@12@$$QAUStringEq@12@$$QAV?$allocator@D@__Cr@std@@@Z + ??$?0VCommonFields@container_internal@absl@@UStringHash@12@UStringEq@12@V?$allocator@D@__Cr@std@@@?$CompressedTupleImpl@V?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@U?$integer_sequence@I$0A@$00$01$02@__Cr@std@@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@__Cr@std@@$$QAVCommonFields@23@$$QAUStringHash@23@$$QAUStringEq@23@$$QAV?$allocator@D@56@@Z + ??$?0VFILERawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QAE@PAVFILERawSink@12@@Z + ??$?0VFallbackCrcMemcpyEngine@crc_internal@absl@@$0A@@?$default_delete@VCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@QAE@ABU?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@12@@Z + ??$?0VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@$$QAV?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@12@@Z + ??$?0VFlagState@flags_internal@absl@@$0A@@?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@QAE@ABU?$default_delete@VFlagState@flags_internal@absl@@@12@@Z + ??$?0VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@$$QAV?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@12@@Z + ??$?0VTimeZoneInfo@cctz@time_internal@absl@@$0A@@?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@QAE@ABU?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@12@@Z + ??$?0VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@$$QAV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@12@@Z + ??$?0VTimeZoneLibC@cctz@time_internal@absl@@$0A@@?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@QAE@ABU?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@12@@Z + ??$?0VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@XX@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@$$QAV?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@12@@Z + ??$?0Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AA_N$0A@@?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@QAE@$$QAViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AA_N@Z + ??$?0Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N$0A@@?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@QAE@$$QAViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@$$QA_N@Z + ??$?0_J@FlagState@flags_internal@absl@@QAE@AAVFlagImpl@12@AB_J_N2_J@Z + ??$?0_J@FormatArgImpl@str_format_internal@absl@@QAE@AB_J@Z + ??$?4PAVCommandLineFlag@absl@@_N$0A@@?$tuple@AAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@QAEAAV012@$$QAV?$tuple@PAVCommandLineFlag@absl@@_N@12@@Z + ??$?4UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@12@$0A@@?$tuple@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@QAEAAV012@$$QAU?$pair@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@23@@12@@Z + ??$?6$01@LogMessage@log_internal@absl@@QAEAAV012@AAY01$$CBD@Z + ??$?6$02@LogMessage@log_internal@absl@@QAEAAV012@AAY02$$CBD@Z + ??$?6$0P@@LogMessage@log_internal@absl@@QAEAAV012@AAY0P@$$CBD@Z + ??$?6C@LogMessage@log_internal@absl@@QAEAAV012@ABC@Z + ??$?6D@LogMessage@log_internal@absl@@QAEAAV012@ABD@Z + ??$?6E@LogMessage@log_internal@absl@@QAEAAV012@ABE@Z + ??$?6F@LogMessage@log_internal@absl@@QAEAAV012@ABF@Z + ??$?6G@LogMessage@log_internal@absl@@QAEAAV012@ABG@Z + ??$?6H@LogMessage@log_internal@absl@@QAEAAV012@ABH@Z + ??$?6I@LogMessage@log_internal@absl@@QAEAAV012@ABI@Z + ??$?6J@LogMessage@log_internal@absl@@QAEAAV012@ABJ@Z + ??$?6K@LogMessage@log_internal@absl@@QAEAAV012@ABK@Z + ??$?6M@LogMessage@log_internal@absl@@QAEAAV012@ABM@Z + ??$?6N@LogMessage@log_internal@absl@@QAEAAV012@ABN@Z + ??$?6PAX@LogMessage@log_internal@absl@@QAEAAV012@ABQAX@Z + ??$?6PBD@LogMessage@log_internal@absl@@QAEAAV012@ABQBD@Z + ??$?6PBX@LogMessage@log_internal@absl@@QAEAAV012@ABQBX@Z + ??$?6PB_W@LogMessage@log_internal@absl@@QAEAAV012@ABQB_W@Z + ??$?6_J@LogMessage@log_internal@absl@@QAEAAV012@AB_J@Z + ??$?6_K@LogMessage@log_internal@absl@@QAEAAV012@AB_K@Z + ??$?6_N@LogMessage@log_internal@absl@@QAEAAV012@AB_N@Z + ??$?8PAPAVCommandLineFlag@absl@@@__Cr@std@@YA_NABV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@0@Z + ??$?8PAPAVCordzHandle@cord_internal@absl@@@__Cr@std@@YA_NABV?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@01@0@Z + ??$?8PAPAVLogSink@absl@@@__Cr@std@@YA_NABV?$__wrap_iter@PAPAVLogSink@absl@@@01@0@Z + ??$?8PAPBVCommandLineFlag@absl@@@__Cr@std@@YA_NABV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@0@Z + ??$?8PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@YA_NABV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@01@0@Z + ??$?8PAUUnrecognizedFlag@absl@@@__Cr@std@@YA_NABV?$__wrap_iter@PAUUnrecognizedFlag@absl@@@01@0@Z + ??$?8PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA_NABV?$__wrap_iter@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@0@Z + ??$?8PBQAVLogSink@absl@@PAPAV01@@__Cr@std@@YA_NABV?$__wrap_iter@PBQAVLogSink@absl@@@01@ABV?$__wrap_iter@PAPAVLogSink@absl@@@01@@Z + ??$?8PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YA_NABV?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@0@Z + ??$?8PBUUnrecognizedFlag@absl@@@__Cr@std@@YA_NABV?$__wrap_iter@PBUUnrecognizedFlag@absl@@@01@0@Z + ??$?8UUnrecognizedFlag@absl@@U01@@__Cr@std@@YA_NABV?$allocator@UUnrecognizedFlag@absl@@@01@0@Z + ??$?8V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@YA_NABV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@$$T@Z + ??$?8VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_NABV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@01@$$T@Z + ??$?BV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ + ??$?BV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@XZ + ??$?DH@absl@@YA?AVDuration@0@HV10@@Z + ??$?DH@absl@@YA?AVDuration@0@V10@H@Z + ??$?DN@absl@@YA?AVDuration@0@NV10@@Z + ??$?D_J@absl@@YA?AVDuration@0@_JV10@@Z + ??$?GPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV01234@@__Cr@std@@YAHABV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z + ??$?GPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU0123@@__Cr@std@@YAHABV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z + ??$?GPAPAVCommandLineFlag@absl@@PAPAV01@@__Cr@std@@YAHABV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@0@Z + ??$?GPAPBVCommandLineFlag@absl@@PAPBV01@@__Cr@std@@YAHABV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@0@Z + ??$?GPAUTransition@cctz@time_internal@absl@@PAU0123@@__Cr@std@@YAHABV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@01@0@Z + ??$?GPAUTransitionType@cctz@time_internal@absl@@PAU0123@@__Cr@std@@YAHABV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@0@Z + ??$?GPAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV234@@Z@PAU0?1???R1234@QBE?AV567@0@Z@@__Cr@std@@YAHABV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@0@Z + ??$?GPBQAVLogSink@absl@@PBQAV01@@__Cr@std@@YAHABV?$__wrap_iter@PBQAVLogSink@absl@@@01@0@Z + ??$?GPBUTransition@cctz@time_internal@absl@@PAU0123@@__Cr@std@@YAHABV?$__wrap_iter@PBUTransition@cctz@time_internal@absl@@@01@ABV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@01@@Z + ??$?GPBUTransitionType@cctz@time_internal@absl@@PAU0123@@__Cr@std@@YAHABV?$__wrap_iter@PBUTransitionType@cctz@time_internal@absl@@@01@ABV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@01@@Z + ??$?K_J@absl@@YA?AVDuration@0@V10@_J@Z + ??$?MUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?NUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?OUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?PUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?R$$CBUPrefixCrc@CrcCordState@crc_internal@absl@@U0123@$0A@@__copy_impl@__Cr@std@@QBE?AU?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@12@PBUPrefixCrc@CrcCordState@crc_internal@absl@@0PAU4567@@Z + ??$?RAAPAVLogSink@absl@@@__identity@__Cr@std@@QBEAAPAVLogSink@absl@@AAPAV34@@Z + ??$?RAAPBDAAHAAY0LLI@DABQBDPAD@?$AtomicHook@P6AXPBDH000@Z@base_internal@absl@@QBEXAAPBDAAHAAY0LLI@DABQBD$$QAPAD@Z + ??$?RAAPBVCommandLineFlag@absl@@@__identity@__Cr@std@@QBEAAPBVCommandLineFlag@absl@@AAPBV34@@Z + ??$?RAAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@__variant_detail@__Cr@std@@@?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@QBE?A_TAAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@345@@Z + ??$?RAAU?$__alt@$01V?$Span@$$CBD@absl@@@__variant_detail@__Cr@std@@@?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@QBE?A_TAAU?$__alt@$01V?$Span@$$CBD@absl@@@345@@Z + ??$?RAAU?$__alt@$02V?$variant@IHM@__Cr@std@@@__variant_detail@__Cr@std@@@?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@QBE?A_TAAU?$__alt@$02V?$variant@IHM@__Cr@std@@@345@@Z + ??$?RAAU?$__alt@$0A@V?$variant@_K_JIH_N@__Cr@std@@@__variant_detail@__Cr@std@@@?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@QBE?A_TAAU?$__alt@$0A@V?$variant@_K_JIH_N@__Cr@std@@@345@@Z + ??$?RAAW4LogSeverity@absl@@AAPBDAAHPAPADPAH@?$AtomicHook@P6A_NW4LogSeverity@absl@@PBDHPAPADPAH@Z@base_internal@absl@@QBE_NAAW4LogSeverity@2@AAPBDAAH$$QAPAPAD$$QAPAH@Z + ??$?RAAY04$$CBDPAVCondVar@absl@@@?$AtomicHook@P6AXPBDPBX@Z@base_internal@absl@@QBEXAAY04$$CBD$$QAPAVCondVar@2@@Z + ??$?RAAY06$$CBDPAVCondVar@absl@@@?$AtomicHook@P6AXPBDPBX@Z@base_internal@absl@@QBEXAAY06$$CBD$$QAPAVCondVar@2@@Z + ??$?RAAY0BB@$$CBDPAVCondVar@absl@@@?$AtomicHook@P6AXPBDPBX@Z@base_internal@absl@@QBEXAAY0BB@$$CBD$$QAPAVCondVar@2@@Z + ??$?RAAY0N@$$CBDPAVMutex@absl@@AA_J@?$AtomicHook@P6AXPBDPBX_J@Z@base_internal@absl@@QBEXAAY0N@$$CBD$$QAPAVMutex@2@AA_J@Z + ??$?RAAY0O@$$CBDPAVCondVar@absl@@@?$AtomicHook@P6AXPBDPBX@Z@base_internal@absl@@QBEXAAY0O@$$CBD$$QAPAVCondVar@2@@Z + ??$?RAA_J@?$AtomicHook@P6AX_J@Z@base_internal@absl@@QBEXAA_J@Z + ??$?RABQAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QBE$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@ABQAPAPBV56789@@Z + ??$?RABQAPAUCordRep@cord_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QBE$$QAPAUCordRep@cord_internal@absl@@ABQAPAU567@@Z + ??$?RABQAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QBE$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@ABQAPAU5678@@Z + ??$?RABQAPAVLogSink@absl@@@__fn@__iter_move@ranges@__Cr@std@@QBE$$QAPAVLogSink@absl@@ABQAPAV56@@Z + ??$?RABQAUPayload@status_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QBE$$QAUPayload@status_internal@absl@@ABQAU567@@Z + ??$?RABQAUTransition@cctz@time_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QBE$$QAUTransition@cctz@time_internal@absl@@ABQAU5678@@Z + ??$?RABQAUTransitionType@cctz@time_internal@absl@@@__fn@__iter_move@ranges@__Cr@std@@QBE$$QAUTransitionType@cctz@time_internal@absl@@ABQAU5678@@Z + ??$?RABUTransition@cctz@time_internal@absl@@@__identity@__Cr@std@@QBEABUTransition@cctz@time_internal@absl@@ABU3456@@Z + ??$?RPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV01234@$0A@@?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QBE?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@12@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$?RPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV01234@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QBE?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@12@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$?RPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU0123@$0A@@?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QBE?AU?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@12@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$?RPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU0123@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QBE?AU?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@12@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$?RPAVLogSink@absl@@PAV01@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QBE?AU?$pair@PAPAVLogSink@absl@@PAPAV12@@12@PAPAVLogSink@absl@@00@Z + ??$?RPAVSpinLock@base_internal@absl@@AB_J@?$AtomicHook@P6AXPBX_J@Z@base_internal@absl@@QBEX$$QAPAVSpinLock@12@AB_J@Z + ??$?RPBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@$0A@@__copy_impl@__Cr@std@@QBE?AU?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@12@PBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@12@@Z + ??$?RUTransition@cctz@time_internal@absl@@U0123@$0A@@?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QBE?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@12@PAUTransition@cctz@time_internal@absl@@00@Z + ??$?RUTransition@cctz@time_internal@absl@@U0123@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QBE?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@12@PAUTransition@cctz@time_internal@absl@@00@Z + ??$?RUTransitionType@cctz@time_internal@absl@@U0123@$0A@@?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QBE?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@12@PAUTransitionType@cctz@time_internal@absl@@00@Z + ??$?RUTransitionType@cctz@time_internal@absl@@U0123@$0A@@?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@QBE?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@12@PAUTransitionType@cctz@time_internal@absl@@00@Z + ??$?RV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@12@$0A@@__copy_impl@__Cr@std@@QBE?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@12@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@12@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$V@?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@QBEIABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@12@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QAPAVCommandLineFlag@absl@@@12@@EmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QBE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@ABUpiecewise_construct_t@56@$$QAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@56@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@12@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@$$QAPAVCommandLineFlag@absl@@@12@@EmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QBE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@ABUpiecewise_construct_t@56@$$QAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@56@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@12@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@ABQAVCommandLineFlag@absl@@@12@@?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@QBE_NABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@45@$$QAV?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QAV?$tuple@ABQAVCommandLineFlag@absl@@@45@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@12@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@ABQAVCommandLineFlag@absl@@@12@@?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@QBEIABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@45@$$QAV?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QAV?$tuple@ABQAVCommandLineFlag@absl@@@45@@Z + ??$?RV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@12@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$tuple@ABQAVCommandLineFlag@absl@@@12@@FindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QBE?AVconst_iterator@123@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@67@$$QAV?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QAV?$tuple@ABQAVCommandLineFlag@absl@@@67@@Z + ??$?RVDuration@absl@@V01@@?$__less@XX@__Cr@std@@QBE_NABVDuration@absl@@0@Z + ??$?RVMixingHashState@hash_internal@absl@@@CombineRaw@hash_internal@absl@@QBE?AVMixingHashState@12@V312@_K@Z + ??$?RW4LogSeverity@absl@@ABQBDHAAPBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAPBD@Z + ??$?RW4LogSeverity@absl@@ABQBDHAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?RW4LogSeverity@absl@@ABQBDHAAY0CC@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAY0CC@$$CBD@Z + ??$?RW4LogSeverity@absl@@ABQBDHAAY0CG@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAY0CG@$$CBD@Z + ??$?RW4LogSeverity@absl@@ABQBDHAAY0CH@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAY0CH@$$CBD@Z + ??$?RW4LogSeverity@absl@@ABQBDHAAY0CI@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAY0CI@$$CBD@Z + ??$?RW4LogSeverity@absl@@ABQBDHAAY0CL@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAY0CL@$$CBD@Z + ??$?RW4LogSeverity@absl@@ABQBDHV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAH$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?VAAVLogMessage@log_internal@absl@@@Voidify@log_internal@absl@@QHBEXAAVLogMessage@12@@Z + ??$?XH$0A@@Duration@absl@@QAEAAV01@H@Z + ??$AbslHashValue@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@YA?AVMixingHashState@01@V201@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$AbslHashValue@VMixingHashState@hash_internal@absl@@ABI@hash_internal@absl@@YA?AVMixingHashState@01@V201@ABV?$tuple@ABI@__Cr@std@@@Z + ??$AbslHashValue@VMixingHashState@hash_internal@absl@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@hash_internal@absl@@YA?AVMixingHashState@01@V201@ABV?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@@Z + ??$AbslStringify@VStringifySink@strings_internal@absl@@@absl@@YAXAAVStringifySink@strings_internal@0@UHex@0@@Z + ??$Add@$00@CordRepBtree@cord_internal@absl@@AAEXPAUCordRep@12@@Z + ??$Add@$00@CordRepBtree@cord_internal@absl@@AAEXV?$Span@QAUCordRep@cord_internal@absl@@@2@@Z + ??$Add@$0A@@CordRepBtree@cord_internal@absl@@AAEXPAUCordRep@12@@Z + ??$Add@$0A@@CordRepBtree@cord_internal@absl@@AAEXV?$Span@QAUCordRep@cord_internal@absl@@@2@@Z + ??$AddCordRep@$00@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@PAUCordRep@12@@Z + ??$AddCordRep@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@PAUCordRep@12@@Z + ??$AddData@$00@CordRepBtree@cord_internal@absl@@AAE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@I@Z + ??$AddData@$00@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@AAE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@I@Z + ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$AddEdge@$00@CordRepBtree@cord_internal@absl@@QAE?AUOpResult@012@_NPAUCordRep@12@I@Z + ??$AddEdge@$0A@@CordRepBtree@cord_internal@absl@@QAE?AUOpResult@012@_NPAUCordRep@12@I@Z + ??$Allocate@$03V?$allocator@D@__Cr@std@@@container_internal@absl@@YAPAXPAV?$allocator@D@__Cr@std@@I@Z + ??$AllocateBackingArray@$03V?$allocator@D@__Cr@std@@@container_internal@absl@@YAPAXPAXI@Z + ??$Append@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QAEX$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$AppendImpl@ABVCord@absl@@@Cord@absl@@AAEXABV01@@Z + ??$AppendImpl@VCord@absl@@@Cord@absl@@AAEX$$QAV01@@Z + ??$ArgumentToConv@C@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@D@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@E@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@F@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@G@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@H@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@I@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@J@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@K@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@M@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@N@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@O@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@PBD@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@PB_W@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@UVoidPtr@str_format_internal@absl@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@Vint128@absl@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@Vuint128@absl@@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@_J@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@_K@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$ArgumentToConv@_N@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ + ??$AsciiInAZRange@$00@ascii_internal@absl@@YA_NE@Z + ??$AsciiInAZRange@$0A@@ascii_internal@absl@@YA_NE@Z + ??$AsciiInAZRangeNaive@$00@ascii_internal@absl@@YA_NE@Z + ??$AsciiInAZRangeNaive@$0A@@ascii_internal@absl@@YA_NE@Z + ??$AsciiStrCaseFold@$00@ascii_internal@absl@@YAXPADPBDI@Z + ??$AsciiStrCaseFold@$0A@@ascii_internal@absl@@YAXPADPBDI@Z + ??$AsciiStrCaseFoldImpl@$00$00@ascii_internal@absl@@YAXPADPBDI@Z + ??$AsciiStrCaseFoldImpl@$00$0A@@ascii_internal@absl@@YAXPADPBDI@Z + ??$AsciiStrCaseFoldImpl@$0A@$00@ascii_internal@absl@@YAXPADPBDI@Z + ??$AsciiStrCaseFoldImpl@$0A@$0A@@ascii_internal@absl@@YAXPADPBDI@Z + ??$AssertHashEqConsistent@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IAEXABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$AssertNonNull@U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@@functional_internal@absl@@YAXABU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@1@@Z + ??$AssertOnFind@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IAEXABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$AssignElements@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXPAUPayload@status_internal@1@AAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@01@I@Z + ??$Base64EscapeInternal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@strings_internal@absl@@YAXPBEIPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_NPBD@Z + ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@A6AXXZ@Z + ??$CallOnceImpl@P8FlagImpl@flags_internal@absl@@AEXXZPAV123@@base_internal@absl@@YAXPAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@$$QAP8FlagImpl@flags_internal@1@AEXXZ$$QAPAV671@@Z + ??$CastAndCallFunction@$$CBU?$atomic@_N@__Cr@std@@@Condition@absl@@CA_NPBV01@@Z + ??$CastAndCallFunction@USynchEvent@absl@@@Condition@absl@@CA_NPBV01@@Z + ??$Compare@$0FE@$0FE@@strings_internal@absl@@YAHABV?$BigUnsigned@$0FE@@01@0@Z + ??$ConstructElements@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@V?$move_iterator@PAPAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@1@AAV?$IteratorValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@V?$move_iterator@PAPAUCordRep@cord_internal@absl@@@23@@01@I@Z + ??$ConstructElements@V?$allocator@PAVLogSink@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@PAVLogSink@absl@@@__Cr@std@@V?$move_iterator@PAPAVLogSink@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAAV?$allocator@PAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@1@AAV?$IteratorValueAdapter@V?$allocator@PAVLogSink@absl@@@__Cr@std@@V?$move_iterator@PAPAVLogSink@absl@@@23@@01@I@Z + ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@1@AAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PBUPayload@status_internal@absl@@@01@I@Z + ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@1@AAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@01@I@Z + ??$ConstructElements@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PAVFormatArgImpl@str_format_internal@1@AAV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PBVFormatArgImpl@str_format_internal@absl@@@01@I@Z + ??$ConsumeConversion@$00@str_format_internal@absl@@YAPBDPBDQBDPAUUnboundConversion@01@PAH@Z + ??$ConsumeConversion@$0A@@str_format_internal@absl@@YAPBDPBDQBDPAUUnboundConversion@01@PAH@Z + ??$Convert@VFormatArgImpl@str_format_internal@absl@@@FormatArgImplFriend@str_format_internal@absl@@SA_NVFormatArgImpl@12@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ??$ConvertIntArg@C@str_format_internal@absl@@YA_NCVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@D@str_format_internal@absl@@YA_NDVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@E@str_format_internal@absl@@YA_NEVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@F@str_format_internal@absl@@YA_NFVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@G@str_format_internal@absl@@YA_NGVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@H@str_format_internal@absl@@YA_NHVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@I@str_format_internal@absl@@YA_NIVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@J@str_format_internal@absl@@YA_NJVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@K@str_format_internal@absl@@YA_NKVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@Vint128@absl@@@str_format_internal@absl@@YA_NVint128@1@VFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@Vuint128@absl@@@str_format_internal@absl@@YA_NVuint128@1@VFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_J@str_format_internal@absl@@YA_N_JVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_K@str_format_internal@absl@@YA_N_KVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_W@str_format_internal@absl@@YA_N_WVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AAEXDI@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AAEXV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AAEXDI@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AAEXV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBufferWithStructuredProtoField@$00@LogMessage@log_internal@absl@@AAEXUStructuredProtoField@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBufferWithStructuredProtoField@$0A@@LogMessage@log_internal@absl@@AAEXUStructuredProtoField@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CreateDefault@$0A@@CommonFields@container_internal@absl@@SA?AV012@XZ + ??$CreateWithCustomLimitImpl@$$V@CordBuffer@absl@@CA?AV01@II@Z + ??$Deallocate@$03V?$allocator@D@__Cr@std@@@container_internal@absl@@YAXPAV?$allocator@D@__Cr@std@@PAXI@Z + ??$DeallocateBackingArray@$03V?$allocator@D@__Cr@std@@@container_internal@absl@@YAXPAXIPAW4ctrl_t@01@II_N@Z + ??$DecomposePair@U?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YA_N$$QAU?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@01@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$DecomposePair@U?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YAI$$QAU?$HashElement@UStringHash@container_internal@absl@@$00@01@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$DecomposePair@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@$$QAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@34@@Z + ??$DecomposePair@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@$$QAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@34@@Z + ??$DecomposePair@UFindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@container_internal@absl@@YA?AVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@$$QAUFindElement@301@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$DecomposePairImpl@U?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@ABQAVCommandLineFlag@absl@@@56@@memory_internal@container_internal@absl@@YA_N$$QAU?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@12@U?$pair@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@ABQAVCommandLineFlag@absl@@@23@@__Cr@std@@@Z + ??$DecomposePairImpl@U?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@ABQAVCommandLineFlag@absl@@@56@@memory_internal@container_internal@absl@@YAI$$QAU?$HashElement@UStringHash@container_internal@absl@@$00@12@U?$pair@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@ABQAVCommandLineFlag@absl@@@23@@__Cr@std@@@Z + ??$DecomposePairImpl@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@$$QAPAVCommandLineFlag@absl@@@67@@memory_internal@container_internal@absl@@YA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@U?$pair@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@45@@Z + ??$DecomposePairImpl@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@$$QAPAVCommandLineFlag@absl@@@67@@memory_internal@container_internal@absl@@YA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@U?$pair@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@45@@Z + ??$DecomposePairImpl@UFindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$tuple@ABQAVCommandLineFlag@absl@@@67@@memory_internal@container_internal@absl@@YA?AVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QAUFindElement@412@U?$pair@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@ABQAVCommandLineFlag@absl@@@23@@__Cr@std@@@Z + ??$Dispatch@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@F@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@G@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@H@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@I@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@M@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@O@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@PBD@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@PB_W@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@UVoidPtr@str_format_internal@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@Vint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@Vuint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@_J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@_K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@_N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$DivMod@$09@?$BigUnsigned@$03@strings_internal@absl@@AAEIXZ + ??$DivMod@$09@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEIXZ + ??$EmplaceBack@ABQAUCordRep@cord_internal@absl@@@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAPAUCordRep@cord_internal@2@ABQAU342@@Z + ??$EmplaceBack@ABQAVLogSink@absl@@@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAPAVLogSink@2@ABQAV32@@Z + ??$EmplaceBack@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAUPayload@status_internal@2@$$QAU342@@Z + ??$EmplaceBackSlow@ABQAUCordRep@cord_internal@absl@@@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AAEAAPAUCordRep@cord_internal@2@ABQAU342@@Z + ??$EmplaceBackSlow@ABQAVLogSink@absl@@@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AAEAAPAVLogSink@2@ABQAV32@@Z + ??$EmplaceBackSlow@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AAEAAUPayload@status_internal@2@$$QAU342@@Z + ??$Extract@V?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@str_format_internal@absl@@@UntypedFormatSpecImpl@str_format_internal@absl@@SAABV012@ABV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@12@@Z + ??$Extract@V?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@str_format_internal@absl@@@UntypedFormatSpecImpl@str_format_internal@absl@@SAABV012@ABV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@12@@Z + ??$Extract@V?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@str_format_internal@absl@@@UntypedFormatSpecImpl@str_format_internal@absl@@SAABV012@ABV?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@12@@Z + ??$Extract@V?$FormatSpecTemplate@$0JPPPL@@str_format_internal@absl@@@UntypedFormatSpecImpl@str_format_internal@absl@@SAABV012@ABV?$FormatSpecTemplate@$0JPPPL@@12@@Z + ??$ExtractCharSet@$0BPPPL@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0BPPPL@@01@@Z + ??$ExtractCharSet@$0EAAAA@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0EAAAA@@01@@Z + ??$ExtractCharSet@$0EAAAE@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0EAAAE@@01@@Z + ??$ExtractCharSet@$0IAAAE@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0IAAAE@@01@@Z + ??$ExtractCharSet@$0JPOAA@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0JPOAA@@01@@Z + ??$ExtractCharSet@$0JPPPL@@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@U?$ArgConvertResult@$0JPPPL@@01@@Z + ??$ExtractStringification@UHex@absl@@@strings_internal@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAVStringifySink@01@ABUHex@1@@Z + ??$FastIntToBuffer@C@numbers_internal@absl@@YAPADCPAD@Z + ??$FastIntToBuffer@D@numbers_internal@absl@@YAPADDPAD@Z + ??$FastIntToBuffer@E@numbers_internal@absl@@YAPADEPAD@Z + ??$FastIntToBuffer@F@numbers_internal@absl@@YAPADFPAD@Z + ??$FastIntToBuffer@G@numbers_internal@absl@@YAPADGPAD@Z + ??$FastIntToBuffer@J@numbers_internal@absl@@YAPADJPAD@Z + ??$FastIntToBuffer@K@numbers_internal@absl@@YAPADKPAD@Z + ??$FastIntToBuffer@_W@numbers_internal@absl@@YAPAD_WPAD@Z + ??$FastTypeId@F@absl@@YAPBXXZ + ??$FastTypeId@G@absl@@YAPBXXZ + ??$FastTypeId@H@absl@@YAPBXXZ + ??$FastTypeId@I@absl@@YAPBXXZ + ??$FastTypeId@J@absl@@YAPBXXZ + ??$FastTypeId@K@absl@@YAPBXXZ + ??$FastTypeId@M@absl@@YAPBXXZ + ??$FastTypeId@N@absl@@YAPBXXZ + ??$FastTypeId@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@YAPBXXZ + ??$FastTypeId@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YAPBXXZ + ??$FastTypeId@_J@absl@@YAPBXXZ + ??$FastTypeId@_K@absl@@YAPBXXZ + ??$FastTypeId@_N@absl@@YAPBXXZ + ??$FindSubstitutions@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@strings_internal@absl@@YA?AV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@ABV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@4@@Z + ??$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@01@PBXPAX2@Z + ??$Flush@V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@VBufferRawSink@str_format_internal@absl@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@VFILERawSink@str_format_internal@absl@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$FormatConvertImpl@_N$0A@@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@01@_NVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$FromChrono@_JV?$ratio@$00$0PECEA@@__Cr@std@@@time_internal@absl@@YA?AVDuration@1@ABV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@@Z + ??$FromInt64@$00@time_internal@absl@@YA?AVDuration@1@_JV?$ratio@$00$00@__Cr@std@@@Z + ??$FromInt64@$0DLJKMKAA@@time_internal@absl@@YA?AVDuration@1@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@Z + ??$FromInt64@$0DOI@@time_internal@absl@@YA?AVDuration@1@_JV?$ratio@$00$0DOI@@__Cr@std@@@Z + ??$FromInt64@$0PECEA@@time_internal@absl@@YA?AVDuration@1@_JV?$ratio@$00$0PECEA@@__Cr@std@@@Z + ??$GenRuntimeTypeId@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPBVtype_info@@XZ + ??$GenericCompare@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@absl@@YAHABVCord@0@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$GenericCompare@HVCord@absl@@@absl@@YAHABVCord@0@0I@Z + ??$GenericCompare@_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@absl@@YA_NABVCord@0@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$GenericCompare@_NVCord@absl@@@absl@@YA_NABVCord@0@0I@Z + ??$GetData@$$CBV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@@span_internal@absl@@YAPBVFormatArgImpl@str_format_internal@1@ABV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@1@@Z + ??$GetData@$$CBV?$Span@D@absl@@@span_internal@absl@@YAPADABV?$Span@D@1@@Z + ??$GetData@$$CBV?$Span@I@absl@@@span_internal@absl@@YAPAIABV?$Span@I@1@@Z + ??$GetData@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@span_internal@absl@@YAPBDABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$GetData@U?$array@D$0DKJI@@__Cr@std@@@span_internal@absl@@YAPADAAU?$array@D$0DKJI@@__Cr@std@@@Z + ??$GetData@V?$InlinedVector@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@absl@@@span_internal@absl@@YAPAPAVLogSink@1@AAV?$InlinedVector@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@1@@Z + ??$GetData@V?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@span_internal@absl@@YAPAPAVLogSink@1@AAV?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@Z + ??$GetDataImpl@$$CBV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@@span_internal@absl@@YAPBVFormatArgImpl@str_format_internal@1@ABV?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@1@D@Z + ??$GetDataImpl@$$CBV?$Span@D@absl@@@span_internal@absl@@YAPADABV?$Span@D@1@D@Z + ??$GetDataImpl@$$CBV?$Span@I@absl@@@span_internal@absl@@YAPAIABV?$Span@I@1@D@Z + ??$GetDataImpl@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@span_internal@absl@@YAPBDABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ??$GetDataImpl@U?$array@D$0DKJI@@__Cr@std@@@span_internal@absl@@YAPADAAU?$array@D$0DKJI@@__Cr@std@@D@Z + ??$GetDataImpl@V?$InlinedVector@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@absl@@@span_internal@absl@@YAPAPAVLogSink@1@AAV?$InlinedVector@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@1@D@Z + ??$GetDataImpl@V?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@span_internal@absl@@YAPAPAVLogSink@1@AAV?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@D@Z + ??$GetFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@ABV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@0@@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$00$00@container_internal@absl@@YAIAAVCommonFields@01@ABUPolicyFunctions@01@V?$FunctionRef@$$A6AII@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$03$00@container_internal@absl@@YAIAAVCommonFields@01@ABUPolicyFunctions@01@V?$FunctionRef@$$A6AII@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$07$00@container_internal@absl@@YAIAAVCommonFields@01@ABUPolicyFunctions@01@V?$FunctionRef@$$A6AII@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$0A@$0A@@container_internal@absl@@YAIAAVCommonFields@01@ABUPolicyFunctions@01@V?$FunctionRef@$$A6AII@Z@1@_N@Z + ??$HashOf@$S$$ZI@absl@@YAIABI@Z + ??$HashOf@$S$$ZV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@absl@@YAIABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@Z + ??$HidePtr@$$CBX@base_internal@absl@@YAIPBX@Z + ??$HidePtr@U?$atomic@H@__Cr@std@@@base_internal@absl@@YAIPAU?$atomic@H@__Cr@std@@@Z + ??$HidePtr@X@base_internal@absl@@YAIPAX@Z + ??$Hours@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$IgnoreLeak@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@YAPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAV123@@Z + ??$Init@$0A@@CordRepBtreeNavigator@cord_internal@absl@@AAEPAUCordRep@12@PAVCordRepBtree@12@@Z + ??$Init@D@FormatArgImpl@str_format_internal@absl@@AAEXABD@Z + ??$Init@H@FormatArgImpl@str_format_internal@absl@@AAEXABH@Z + ??$Init@I@FormatArgImpl@str_format_internal@absl@@AAEXABI@Z + ??$Init@M@FormatArgImpl@str_format_internal@absl@@AAEXABM@Z + ??$Init@N@FormatArgImpl@str_format_internal@absl@@AAEXABN@Z + ??$Init@PBD@FormatArgImpl@str_format_internal@absl@@AAEXABQBD@Z + ??$Init@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@AAEXABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Init@_J@FormatArgImpl@str_format_internal@absl@@AAEXAB_J@Z + ??$InitDefaultValue@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@UEmptyBraces@01@@Z + ??$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PBVFormatArgImpl@str_format_internal@absl@@@12@I@Z + ??$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ??$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ??$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ??$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ??$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ??$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@H@UniquelyRepresentedProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@ABH@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@I@UniquelyRepresentedProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@ABI@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@HashValueProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@V?$tuple@ABI@__Cr@std@@@HashValueProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@ABV?$tuple@ABI@__Cr@std@@@Z + ??$Invoke@VMixingHashState@hash_internal@absl@@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@@HashValueProbe@HashSelect@hash_internal@absl@@SA?AVMixingHashState@23@V423@ABV?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@@Z + ??$InvokeFlush@V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@str_format_internal@absl@@YAXPAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$InvokeFlush@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@str_format_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$InvokeFlush@VBufferRawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPAVBufferRawSink@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$InvokeFlush@VFILERawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPAVFILERawSink@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$InvokeGet@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@@FlagImplPeer@flags_internal@absl@@SA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@ABV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@12@@Z + ??$InvokeObject@AAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@II@functional_internal@absl@@YAITVoidPtr@01@I@Z + ??$InvokeParseFlag@H@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAHPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$InvokeParseFlag@M@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAMPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$InvokeParseFlag@N@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PANPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$InvokeParseFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$InvokeSet@V?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@FlagImplPeer@flags_internal@absl@@SAXAAV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@12@ABV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@Z + ??$IsAboveValidSize@$03@container_internal@absl@@YA_NII@Z + ??$IsDestructionTrivial@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@@container_internal@absl@@YA?A_PXZ + ??$IsOfType@F@CommandLineFlag@absl@@QBE_NXZ + ??$IsOfType@G@CommandLineFlag@absl@@QBE_NXZ + ??$IsOfType@H@CommandLineFlag@absl@@QBE_NXZ + ??$IsOfType@I@CommandLineFlag@absl@@QBE_NXZ + ??$IsOfType@J@CommandLineFlag@absl@@QBE_NXZ + ??$IsOfType@K@CommandLineFlag@absl@@QBE_NXZ + ??$IsOfType@M@CommandLineFlag@absl@@QBE_NXZ + ??$IsOfType@N@CommandLineFlag@absl@@QBE_NXZ + ??$IsOfType@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@CommandLineFlag@absl@@QBE_NXZ + ??$IsOfType@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@CommandLineFlag@absl@@QBE_NXZ + ??$IsOfType@_J@CommandLineFlag@absl@@QBE_NXZ + ??$IsOfType@_K@CommandLineFlag@absl@@QBE_NXZ + ??$IsOfType@_N@CommandLineFlag@absl@@QBE_NXZ + ??$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z + ??$JoinRange@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$JoinRange@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$LowLevelCallOnce@A6AXXZ$$V@base_internal@absl@@YAXPAVonce_flag@1@A6AXXZ@Z + ??$MakeCheckOpString@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV123@@log_internal@absl@@YAPBDABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0PBD@Z + ??$MakeCheckOpString@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@@log_internal@absl@@YAPBDABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PBD@Z + ??$MakeCheckOpString@DD@log_internal@absl@@YAPBDDDPBD@Z + ??$MakeCheckOpString@EE@log_internal@absl@@YAPBDEEPBD@Z + ??$MakeCheckOpString@MM@log_internal@absl@@YAPBDMMPBD@Z + ??$MakeCheckOpString@NN@log_internal@absl@@YAPBDNNPBD@Z + ??$MakeCheckOpString@PBCPBC@log_internal@absl@@YAPBDPBC0PBD@Z + ??$MakeCheckOpString@PBDPBD@log_internal@absl@@YAPBDPBD00@Z + ??$MakeCheckOpString@PBEPBE@log_internal@absl@@YAPBDPBE0PBD@Z + ??$MakeCheckOpString@PBXPBX@log_internal@absl@@YAPBDPBX0PBD@Z + ??$MakeCheckOpString@_J_J@log_internal@absl@@YAPBD_J0PBD@Z + ??$MakeCheckOpString@_K_K@log_internal@absl@@YAPBD_K0PBD@Z + ??$MakeCheckOpString@_N_N@log_internal@absl@@YAPBD_N0PBD@Z + ??$MakeCheckOpValueString@M@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABM@Z + ??$MakeCheckOpValueString@N@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABN@Z + ??$MakeCheckOpValueString@PBC@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABQBC@Z + ??$MakeCheckOpValueString@PBD@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABQBD@Z + ??$MakeCheckOpValueString@PBE@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABQBE@Z + ??$MakeCheckOpValueString@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ??$MakeCheckOpValueString@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ??$MakeCheckOpValueString@_J@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AB_J@Z + ??$MakeCheckOpValueString@_K@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AB_K@Z + ??$MakeCheckOpValueString@_N@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AB_N@Z + ??$MakeConstSpan@$SQAX@absl@@YA?AV?$Span@QAX@0@PBQAXI@Z + ??$MakeSpan@$SD@absl@@YA?AV?$Span@D@0@PADI@Z + ??$MakeSpan@$SI$0BAA@@absl@@YA?AV?$Span@I@0@AAY0BAA@I@Z + ??$MakeSpan@$SI$0BIA@@absl@@YA?AV?$Span@I@0@AAY0BIA@I@Z + ??$MakeSpan@$SI$0CAA@@absl@@YA?AV?$Span@I@0@AAY0CAA@I@Z + ??$MakeSpan@$SI$0CIA@@absl@@YA?AV?$Span@I@0@AAY0CIA@I@Z + ??$MakeSpan@$SI$0IA@@absl@@YA?AV?$Span@I@0@AAY0IA@I@Z + ??$MakeSpan@$SI@absl@@YA?AV?$Span@I@0@PAII@Z + ??$MakeSpan@$SPAVLogSink@absl@@@absl@@YA?AV?$Span@PAVLogSink@absl@@@0@PAPAVLogSink@0@I@Z + ??$MakeSpan@$SU?$array@D$0DKJI@@__Cr@std@@@absl@@YA?AV?$Span@D@0@AAU?$array@D$0DKJI@@__Cr@std@@@Z + ??$MakeSpan@$SV?$InlinedVector@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@absl@@@absl@@YA?AV?$Span@PAVLogSink@absl@@@0@AAV?$InlinedVector@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@0@@Z + ??$MakeSpan@$SV?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@absl@@YA?AV?$Span@PAVLogSink@absl@@@0@AAV?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@@Z + ??$MaskOfLength@I@crc_internal@absl@@YAIH@Z + ??$MaxValidSizeFor1ByteSlot@$03@container_internal@absl@@YAIXZ + ??$Merge@$00@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@0@Z + ??$Merge@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@0@Z + ??$Microseconds@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Microseconds@J$0A@@absl@@YA?AVDuration@0@J@Z + ??$Milliseconds@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Milliseconds@K$0A@@absl@@YA?AVDuration@0@K@Z + ??$Milliseconds@N$0A@@absl@@YA?AVDuration@0@N@Z + ??$Minutes@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Nanoseconds@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Nanoseconds@J$0A@@absl@@YA?AVDuration@0@J@Z + ??$Nanoseconds@_J$0A@@absl@@YA?AVDuration@0@_J@Z + ??$NewImpl@$0BAAA@$$V@CordRepFlat@cord_internal@absl@@SAPAU012@I@Z + ??$NewImpl@$0EAAAA@$$V@CordRepFlat@cord_internal@absl@@SAPAU012@I@Z + ??$NewLeaf@$00@CordRepBtree@cord_internal@absl@@CAPAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$NewLeaf@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$OffsetValue@U?$atomic@_K@__Cr@std@@@FlagImpl@flags_internal@absl@@ABEPAU?$atomic@_K@__Cr@std@@XZ + ??$OffsetValue@UFlagMaskedPointerValue@flags_internal@absl@@@FlagImpl@flags_internal@absl@@ABEPAUFlagMaskedPointerValue@12@XZ + ??$OffsetValue@UFlagOneWordValue@flags_internal@absl@@@FlagImpl@flags_internal@absl@@ABEPAUFlagOneWordValue@12@XZ + ??$PairArgs@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@__Cr@std@@$$QAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@34@@Z + ??$PairArgs@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@__Cr@std@@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@$$QAPAVCommandLineFlag@1@@Z + ??$PairArgs@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@ABQAVCommandLineFlag@absl@@@23@@__Cr@std@@ABU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@34@@Z + ??$PairArgs@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABQAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@ABQAVCommandLineFlag@absl@@@23@@__Cr@std@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@ABQAVCommandLineFlag@1@@Z + ??$PairArgs@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@__Cr@std@@$$QAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@34@@Z + ??$PairArgs@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@YA?AU?$pair@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@__Cr@std@@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@$$QAPAVCommandLineFlag@1@@Z + ??$ParseFlag@H@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAHPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??$ParseFlag@M@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAMPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??$ParseFlag@N@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PANPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??$ParseFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??$ParseFlagImpl@H@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAH@Z + ??$ParseFlagImpl@I@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAI@Z + ??$ParseFlagImpl@J@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAJ@Z + ??$ParseFlagImpl@K@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAK@Z + ??$ParseFlagImpl@_J@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AA_J@Z + ??$ParseFlagImpl@_K@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AA_K@Z + ??$ParseFloat@$09@strings_internal@absl@@YA?AUParsedFloat@01@PBD0W4chars_format@1@@Z + ??$ParseFloat@$0BA@@strings_internal@absl@@YA?AUParsedFloat@01@PBD0W4chars_format@1@@Z + ??$ParseFormatString@UParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@@str_format_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UParsedFormatConsumer@ParsedFormatBase@01@@Z + ??$PopDead@_JIIIG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AAEPAUHashtablezInfo@container_internal@2@_JIIIG@Z + ??$Prepend@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QAEX$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$ReadCallback@P6A_NPAUSynchEvent@absl@@@Z@Condition@absl@@ABEXPAP6A_NPAUSynchEvent@1@@Z@Z + ??$ReadCallback@P6A_NPBU?$atomic@_N@__Cr@std@@@Z@Condition@absl@@ABEXPAP6A_NPBU?$atomic@_N@__Cr@std@@@Z@Z + ??$Register@AB_JAAIAAIAAIAAG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QAEPAUHashtablezInfo@container_internal@2@AB_JAAI11AAG@Z + ??$RotateRight@I@crc_internal@absl@@YAIIHH@Z + ??$RunWithReentrancyGuard@V@?0???$construct@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@34@ABUpiecewise_construct_t@__Cr@std@@$$QAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@78@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@78@@Z@@CommonFields@container_internal@absl@@QAEXV@?0???$construct@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@ABUpiecewise_construct_t@__Cr@std@@$$QAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@78@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@78@@Z@@Z + ??$RunWithReentrancyGuard@V@?0???$construct@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@34@ABUpiecewise_construct_t@__Cr@std@@$$QAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@78@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@78@@Z@@CommonFields@container_internal@absl@@QAEXV@?0???$construct@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@ABUpiecewise_construct_t@__Cr@std@@$$QAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@78@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@78@@Z@@Z + ??$RunWithReentrancyGuard@V@?0??destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@45@@Z@@CommonFields@container_internal@absl@@QAEXV@?0??destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@@Z@@Z + ??$RunWithReentrancyGuard@V@?0??transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@45@0@Z@@CommonFields@container_internal@absl@@QAEXV@?0??transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@0@Z@@Z + ??$SNPrintF@DHHH@absl@@YAHPADIABV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@str_format_internal@0@ABDABH33@Z + ??$STLStringResizeUninitialized@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@X@strings_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ??$STLStringResizeUninitializedAmortized@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@strings_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ??$SanitizerPoisonObject@T?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@@container_internal@absl@@YAXPBT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@01@@Z + ??$Seconds@H$0A@@absl@@YA?AVDuration@0@H@Z + ??$Seconds@J$0A@@absl@@YA?AVDuration@0@J@Z + ??$Seconds@_J$0A@@absl@@YA?AVDuration@0@_J@Z + ??$SetEdge@$00@CordRepBtree@cord_internal@absl@@QAE?AUOpResult@012@_NPAUCordRep@12@I@Z + ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QAE?AUOpResult@012@_NPAUCordRep@12@I@Z + ??$SetFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YAXPAV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@0@ABV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@Z + ??$SharedCompareImpl@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@absl@@YAHABVCord@0@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$SharedCompareImpl@VCord@absl@@@absl@@YAHABVCord@0@0@Z + ??$SimpleAtoi@H@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAH@Z + ??$SmallMemmove@$00@cord_internal@absl@@YAXPADPBDI@Z + ??$SmallMemmove@$0A@@cord_internal@absl@@YAXPADPBDI@Z + ??$StoreCallback@P6A_NPAUSynchEvent@absl@@@Z@Condition@absl@@AAEXP6A_NPAUSynchEvent@1@@Z@Z + ??$StoreCallback@P6A_NPAX@Z@Condition@absl@@AAEXP6A_NPAX@Z@Z + ??$StoreCallback@P6A_NPBU?$atomic@_N@__Cr@std@@@Z@Condition@absl@@AAEXP6A_NPBU?$atomic@_N@__Cr@std@@@Z@Z + ??$StrAppend@$$V@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@1111@Z + ??$StrCat@$$BY01D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000AAY01$$CBD@Z + ??$StrCat@$$V@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000@Z + ??$StrCat@F@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@F@Z + ??$StrCat@G@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@G@Z + ??$StrCat@H@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ??$StrCat@I@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ??$StrCat@J@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ??$StrCat@K@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ??$StrCat@PBD@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000ABQBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY02D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000ABV123@AAY02$$CBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY03D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000ABV123@AAY03$$CBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0BO@DV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000ABV123@AAY0BO@$$CBD1@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0LD@D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000ABV123@AAY0LD@$$CBD@Z + ??$StrCat@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@ABV123@@Z + ??$StrCat@_J@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ??$StrCat@_K@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ??$StrFormat@DHHHHH_JIV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HPBDV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@str_format_internal@0@ABDABH2222AB_JABIABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@2ABQBD5@Z + ??$StrFormat@HM@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@str_format_internal@0@ABHABM@Z + ??$StrFormat@HN@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@str_format_internal@0@ABHABN@Z + ??$StrJoin@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z + ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@ABV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@3@@Z + ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHABV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z + ??$StrSplit@D@absl@@YA?AV?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@D@Z + ??$StrSplit@DUAllowEmpty@absl@@@absl@@YA?AV?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@DUAllowEmpty@0@@Z + ??$StrSplit@VByAnyChar@absl@@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@@Z + ??$StrSplit@VByAnyChar@absl@@USkipEmpty@2@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@USkipEmpty@0@@Z + ??$StreamFormat@I@absl@@YA?AVStreamable@str_format_internal@0@ABV?$FormatSpecTemplate@$0JPPPL@@20@ABI@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV123@H@Z@@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@H@strings_internal@0@YA?AV123@H@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV123@I@Z@@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@I@strings_internal@0@YA?AV123@I@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV123@J@Z@@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@J@strings_internal@0@YA?AV123@J@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV123@K@Z@@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@K@strings_internal@0@YA?AV123@K@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV123@_J@Z@@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@_J@strings_internal@0@YA?AV123@_J@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV123@_K@Z@@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$IntegerToString@_K@strings_internal@0@YA?AV123@_K@Z@@Z + ??$StringResizeAndOverwrite@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@0@YA?AV123@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@1V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@50@@Z@@Z + ??$ToChronoDuration@V?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$0DOI@@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$0DOI@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToChronoDuration@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@@time_internal@absl@@YA?AV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ??$ToInt@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@F@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@G@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@H@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@I@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@M@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@O@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@PBD@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@PB_W@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@UVoidPtr@str_format_internal@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@VFormatArgImpl@str_format_internal@absl@@@FormatArgImplFriend@str_format_internal@absl@@SA_NVFormatArgImpl@12@PAH@Z + ??$ToInt@Vint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@Vuint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$0A@@__Cr@std@@2@Z + ??$ToInt@_J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@_K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToInt@_N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@PAHU?$integral_constant@_N$00@__Cr@std@@U?$integral_constant@_N$0A@@56@@Z + ??$ToIntVal@C@FormatArgImpl@str_format_internal@absl@@CAHABC@Z + ??$ToIntVal@D@FormatArgImpl@str_format_internal@absl@@CAHABD@Z + ??$ToIntVal@E@FormatArgImpl@str_format_internal@absl@@CAHABE@Z + ??$ToIntVal@F@FormatArgImpl@str_format_internal@absl@@CAHABF@Z + ??$ToIntVal@G@FormatArgImpl@str_format_internal@absl@@CAHABG@Z + ??$ToIntVal@H@FormatArgImpl@str_format_internal@absl@@CAHABH@Z + ??$ToIntVal@I@FormatArgImpl@str_format_internal@absl@@CAHABI@Z + ??$ToIntVal@J@FormatArgImpl@str_format_internal@absl@@CAHABJ@Z + ??$ToIntVal@K@FormatArgImpl@str_format_internal@absl@@CAHABK@Z + ??$ToIntVal@_J@FormatArgImpl@str_format_internal@absl@@CAHAB_J@Z + ??$ToIntVal@_K@FormatArgImpl@str_format_internal@absl@@CAHAB_K@Z + ??$ToIntVal@_N@FormatArgImpl@str_format_internal@absl@@CAHAB_N@Z + ??$TrailingZeros@G@container_internal@absl@@YAIG@Z + ??$TrailingZeros@_K@container_internal@absl@@YAI_K@Z + ??$TransferNRelocatable@$0M@@container_internal@absl@@YAXPAX00I@Z + ??$TryFindNewIndexWithoutProbing@X@container_internal@absl@@YAIIIIPAW4ctrl_t@01@I@Z + ??$TypeErasedApplyToSlotFn@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@YAIPBXPAXI@Z + ??$UnhidePtr@X@base_internal@absl@@YAPAXI@Z + ??$Unparse@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@@Z + ??$UnparseFlag@H@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABH@Z + ??$UnparseFlag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@@Z + ??$UnparseFloatingPointVal@M@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@M@Z + ??$UnparseFloatingPointVal@N@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z + ??$__add_alignment_assumption@PAPAVCommandLineFlag@absl@@$0A@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAPAPAVCommandLineFlag@absl@@PAPAV34@@Z + ??$__add_alignment_assumption@PAPAVCordzHandle@cord_internal@absl@@$0A@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAPAPAVCordzHandle@cord_internal@absl@@PAPAV345@@Z + ??$__add_alignment_assumption@PAPAVLogSink@absl@@$0A@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@CAPAPAVLogSink@absl@@PAPAV34@@Z + ??$__add_alignment_assumption@PAPBVCommandLineFlag@absl@@$0A@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAPAPBVCommandLineFlag@absl@@PAPBV34@@Z + ??$__add_alignment_assumption@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$0A@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@CAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU3456@@Z + ??$__add_alignment_assumption@PAUTransition@cctz@time_internal@absl@@$0A@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAPAUTransition@cctz@time_internal@absl@@PAU3456@@Z + ??$__add_alignment_assumption@PAUTransitionType@cctz@time_internal@absl@@$0A@@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAPAUTransitionType@cctz@time_internal@absl@@PAU3456@@Z + ??$__add_alignment_assumption@PAUUnrecognizedFlag@absl@@$0A@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@CAPAUUnrecognizedFlag@absl@@PAU34@@Z + ??$__add_alignment_assumption@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@$0A@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@CAPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@PAV312@@Z + ??$__advance@PBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAXAAPBUTransition@cctz@time_internal@absl@@HUrandom_access_iterator_tag@01@@Z + ??$__advance@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAAV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@HUrandom_access_iterator_tag@01@@Z + ??$__advance@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAAV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@HUrandom_access_iterator_tag@01@@Z + ??$__advance@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@@__Cr@std@@YAXAAV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@HUrandom_access_iterator_tag@01@@Z + ??$__allocate_at_least@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAAV?$allocator@PAVCommandLineFlag@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAAV?$allocator@PAVLogSink@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAAV?$allocator@PBVCommandLineFlag@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAAV?$allocator@UTransition@cctz@time_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAAV?$allocator@UUnrecognizedFlag@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?A_PAAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@I@Z + ??$__allocate_at_least@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?A_PAAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@I@Z + ??$__allocator_destroy@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@PAU45@@__Cr@std@@YAXAAV?$allocator@UUnrecognizedFlag@absl@@@01@PAUUnrecognizedFlag@absl@@1@Z + ??$__annotate_contiguous_container@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXPBX000@Z + ??$__annotate_contiguous_container@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPBX000@Z + ??$__annotate_contiguous_container@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@YAXPBX000@Z + ??$__annotate_contiguous_container@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAXPBX000@Z + ??$__annotate_contiguous_container@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXPBX000@Z + ??$__annotate_contiguous_container@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPBX000@Z + ??$__annotate_contiguous_container@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPBX000@Z + ??$__annotate_double_ended_contiguous_container@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YAXPBX00000@Z + ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@I@Z + ??$__as_transparent@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@01@AAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@01@@Z + ??$__as_transparent@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@01@AAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@01@@Z + ??$__as_variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@YAAAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@01@AAV201@@Z + ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@H@Z + ??$__at@P6AI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03$$V@__base@__visitation@__variant_detail@__Cr@std@@CA$$QA_PABU?$__farray@P6AI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03@34@I@Z + ??$__at@P6AI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z@__base@__visitation@__variant_detail@__Cr@std@@CAABQ6AI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@1234@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@ZABQ6AI01@Z@Z + ??$__call@AAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@5@@?$__invoke_void_return_wrapper@X$00@__Cr@std@@SAXAAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@7@@Z + ??$__call_func@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@@?$__policy_func@$$A6AXAAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@CAXPBT__policy_storage@123@AAVCommandLineFlag@absl@@@Z + ??$__constexpr_memmove@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@0W4__element_count@01@@Z + ??$__constexpr_memmove@PAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@__Cr@std@@YAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU2345@0W4__element_count@01@@Z + ??$__constexpr_memmove@PAVLogSink@absl@@PAV12@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@0W4__element_count@01@@Z + ??$__constexpr_memmove@UPrefixCrc@CrcCordState@crc_internal@absl@@$$CBU1234@@__Cr@std@@YAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU2345@PBU2345@W4__element_count@01@@Z + ??$__constexpr_memmove@UTransition@cctz@time_internal@absl@@U1234@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@0W4__element_count@01@@Z + ??$__constexpr_memmove@UTransitionType@cctz@time_internal@absl@@U1234@@__Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@0W4__element_count@01@@Z + ??$__construct_at@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAPAPBV12345@PAPAPBV12345@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@AAPAPBV23456@@Z + ??$__construct_at@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@PAPAPBV12345@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@$$QAPAPBV23456@@Z + ??$__construct_at@PAUCordRep@cord_internal@absl@@ABQAU123@PAPAU123@@__Cr@std@@YAPAPAUCordRep@cord_internal@absl@@PAPAU234@ABQAU234@@Z + ??$__construct_at@PAUCordRep@cord_internal@absl@@PAU123@PAPAU123@@__Cr@std@@YAPAPAUCordRep@cord_internal@absl@@PAPAU234@$$QAPAU234@@Z + ??$__construct_at@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAPAU1234@PAPAU1234@@__Cr@std@@YAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU2345@AAPAU2345@@Z + ??$__construct_at@PAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@PAPAU1234@@__Cr@std@@YAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU2345@$$QAPAU2345@@Z + ??$__construct_at@PAVCommandLineFlag@absl@@ABQAV12@PAPAV12@@__Cr@std@@YAPAPAVCommandLineFlag@absl@@PAPAV23@ABQAV23@@Z + ??$__construct_at@PAVCordzHandle@cord_internal@absl@@ABQAV123@PAPAV123@@__Cr@std@@YAPAPAVCordzHandle@cord_internal@absl@@PAPAV234@ABQAV234@@Z + ??$__construct_at@PAVLogSink@absl@@ABQAV12@PAPAV12@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@ABQAV23@@Z + ??$__construct_at@PAVLogSink@absl@@PAV12@PAPAV12@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@$$QAPAV23@@Z + ??$__construct_at@PBUCordRep@cord_internal@absl@@ABQBU123@PAPBU123@@__Cr@std@@YAPAPBUCordRep@cord_internal@absl@@PAPBU234@ABQBU234@@Z + ??$__construct_at@PBVCommandLineFlag@absl@@ABQBV12@PAPBV12@@__Cr@std@@YAPAPBVCommandLineFlag@absl@@PAPBV23@ABQBV23@@Z + ??$__construct_at@PBVCommandLineFlag@absl@@PBV12@PAPBV12@@__Cr@std@@YAPAPBVCommandLineFlag@absl@@PAPBV23@$$QAPBV23@@Z + ??$__construct_at@PBVCordzHandle@cord_internal@absl@@ABQBV123@PAPBV123@@__Cr@std@@YAPAPBVCordzHandle@cord_internal@absl@@PAPBV234@ABQBV234@@Z + ??$__construct_at@PBVImpl@time_zone@cctz@time_internal@absl@@ABQBV12345@PAPBV12345@@__Cr@std@@YAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV23456@ABQBV23456@@Z + ??$__construct_at@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@AAIAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@ABQBUCordRep@cord_internal@absl@@PAU123@@__Cr@std@@YAPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@01@PAU201@AAIAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@01@ABQBUCordRep@cord_internal@absl@@@Z + ??$__construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@AAIAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@01@PAU201@AAIAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@01@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z + ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z + ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z + ??$__construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z + ??$__construct_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@PAU123@@__Cr@std@@YAPAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@01@@Z + ??$__construct_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@PAU123@@__Cr@std@@YAPAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@01@@Z + ??$__construct_at@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@PAU1234@@__Cr@std@@YAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU2345@$$QAU2345@@Z + ??$__construct_at@UPayload@status_internal@absl@@ABU123@PAU123@@__Cr@std@@YAPAUPayload@status_internal@absl@@PAU234@ABU234@@Z + ??$__construct_at@UPayload@status_internal@absl@@U123@PAU123@@__Cr@std@@YAPAUPayload@status_internal@absl@@PAU234@$$QAU234@@Z + ??$__construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@ABU1234@PAU1234@@__Cr@std@@YAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU2345@ABU2345@@Z + ??$__construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@HVcrc32c_t@4@PAU1234@@__Cr@std@@YAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU2345@$$QAH$$QAVcrc32c_t@5@@Z + ??$__construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@U1234@PAU1234@@__Cr@std@@YAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU2345@$$QAU2345@@Z + ??$__construct_at@UTransition@cctz@time_internal@absl@@$$VPAU1234@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@@Z + ??$__construct_at@UTransition@cctz@time_internal@absl@@ABU1234@PAU1234@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@ABU2345@@Z + ??$__construct_at@UTransition@cctz@time_internal@absl@@U1234@PAU1234@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@$$QAU2345@@Z + ??$__construct_at@UTransitionType@cctz@time_internal@absl@@$$VPAU1234@@__Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@@Z + ??$__construct_at@UTransitionType@cctz@time_internal@absl@@U1234@PAU1234@@__Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@$$QAU2345@@Z + ??$__construct_at@UUnrecognizedFlag@absl@@ABU12@PAU12@@__Cr@std@@YAPAUUnrecognizedFlag@absl@@PAU23@ABU23@@Z + ??$__construct_at@UUnrecognizedFlag@absl@@U12@PAU12@@__Cr@std@@YAPAUUnrecognizedFlag@absl@@PAU23@$$QAU23@@Z + ??$__construct_at@UUnrecognizedFlag@absl@@W4Source@12@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAU12@@__Cr@std@@YAPAUUnrecognizedFlag@absl@@PAU23@$$QAW4Source@23@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z + ??$__construct_at@UViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV456@AAIPAU123@@__Cr@std@@YAPAUViableSubstitution@strings_internal@absl@@PAU234@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@ABV501@AAI@Z + ??$__construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@23@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAV123@@__Cr@std@@YAPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@01@PAV201@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@01@ABUpiecewise_construct_t@01@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z + ??$__construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@23@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAV123@@__Cr@std@@YAPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@01@PAV201@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@01@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z + ??$__construct_at@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@ABV678@@Z@PAV123@@__Cr@std@@YAPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@PAV201@AAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@ABV567@@Z@@Z + ??$__construct_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@PAV123@@__Cr@std@@YAPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PAV201@$$QAV201@@Z + ??$__construct_at@VFormatArgImpl@str_format_internal@absl@@ABV123@PAV123@@__Cr@std@@YAPAVFormatArgImpl@str_format_internal@absl@@PAV234@ABV234@@Z + ??$__construct_at_end@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAEXV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@12@0I@Z + ??$__construct_at_end@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end_with_size@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@@?$__split_buffer@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QAEXV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@12@I@Z + ??$__construct_at_end_with_size@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@I@Z + ??$__construct_at_end_with_size@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@I@Z + ??$__construct_at_end_with_size@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@I@Z + ??$__construct_at_end_with_size@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@I@Z + ??$__construct_node@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$__construct_node@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$__construct_node_hash@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAE?AV?$unique_ptr@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@@12@IABQBUCordRep@cord_internal@absl@@@Z + ??$__construct_node_hash@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@12@IABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$__copy@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@PAU1234@@__Cr@std@@YA?AU?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@01@PBUPrefixCrc@CrcCordState@crc_internal@absl@@0PAU3456@@Z + ??$__copy@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@YA?AU?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@01@PBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@@Z + ??$__copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V123@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@@Z + ??$__copy_backward_trivial_impl@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@@__Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__copy_backward_trivial_impl@PAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@__Cr@std@@YA?AU?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@01@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__copy_backward_trivial_impl@UTransition@cctz@time_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@PAUTransition@cctz@time_internal@absl@@00@Z + ??$__copy_backward_trivial_impl@UTransitionType@cctz@time_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@PAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV45678@PAPAPBV45678@$0A@@__Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU4567@PAPAU4567@$0A@@__Cr@std@@YA?AU?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@01@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PAUTransition@cctz@time_internal@absl@@PAU4567@PAU4567@$0A@@__Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@PAUTransition@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_backward_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PAUTransitionType@cctz@time_internal@absl@@PAU4567@PAU4567@$0A@@__Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@PAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV45678@PAPAPBV45678@$0A@@__Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU4567@PAPAU4567@$0A@@__Cr@std@@YA?AU?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@01@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PAPAVLogSink@absl@@PAPAV45@PAPAV45@$0A@@__Cr@std@@YA?AU?$pair@PAPAVLogSink@absl@@PAPAV12@@01@PAPAVLogSink@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PAUTransition@cctz@time_internal@absl@@PAU4567@PAU4567@$0A@@__Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@PAUTransition@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U?$__move_impl@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@PAUTransitionType@cctz@time_internal@absl@@PAU4567@PAU4567@$0A@@__Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@PAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__copy_move_unwrap_iters@U__copy_impl@__Cr@std@@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU4567@PAU4567@$0A@@__Cr@std@@YA?AU?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@01@PBUPrefixCrc@CrcCordState@crc_internal@absl@@0PAU3456@@Z + ??$__copy_move_unwrap_iters@U__copy_impl@__Cr@std@@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU4567@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@$0A@@__Cr@std@@YA?AU?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@01@PBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@@Z + ??$__copy_move_unwrap_iters@U__copy_impl@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@V423@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@$0A@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@@Z + ??$__copy_trivial_impl@$$CBUPrefixCrc@CrcCordState@crc_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@01@PBUPrefixCrc@CrcCordState@crc_internal@absl@@0PAU3456@@Z + ??$__copy_trivial_impl@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@@__Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__copy_trivial_impl@PAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@__Cr@std@@YA?AU?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@01@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__copy_trivial_impl@PAVLogSink@absl@@PAV12@@__Cr@std@@YA?AU?$pair@PAPAVLogSink@absl@@PAPAV12@@01@PAPAVLogSink@absl@@00@Z + ??$__copy_trivial_impl@UTransition@cctz@time_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@PAUTransition@cctz@time_internal@absl@@00@Z + ??$__copy_trivial_impl@UTransitionType@cctz@time_internal@absl@@U1234@@__Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@PAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__create@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@@__policy@__function@__Cr@std@@SAPBU0123@XZ + ??$__cxx_atomic_compare_exchange_strong@PAUArena@LowLevelAlloc@base_internal@absl@@@__Cr@std@@YA_NPAU?$__cxx_atomic_base_impl@PAUArena@LowLevelAlloc@base_internal@absl@@@01@PAPAUArena@LowLevelAlloc@base_internal@absl@@PAU3456@W4memory_order@01@3@Z + ??$__cxx_atomic_compare_exchange_strong@PAVTimeZone@absl@@@__Cr@std@@YA_NPAU?$__cxx_atomic_base_impl@PAVTimeZone@absl@@@01@PAPAVTimeZone@absl@@PAV34@W4memory_order@01@3@Z + ??$__cxx_atomic_compare_exchange_strong@PAVVLogSite@log_internal@absl@@@__Cr@std@@YA_NPAU?$__cxx_atomic_base_impl@PAVVLogSite@log_internal@absl@@@01@PAPAVVLogSite@log_internal@absl@@PAV345@W4memory_order@01@3@Z + ??$__cxx_atomic_compare_exchange_weak@PAUHashtablezInfo@container_internal@absl@@@__Cr@std@@YA_NPAU?$__cxx_atomic_base_impl@PAUHashtablezInfo@container_internal@absl@@@01@PAPAUHashtablezInfo@container_internal@absl@@PAU345@W4memory_order@01@3@Z + ??$__cxx_atomic_compare_exchange_weak@PAVVLogSite@log_internal@absl@@@__Cr@std@@YA_NPAU?$__cxx_atomic_base_impl@PAVVLogSite@log_internal@absl@@@01@PAPAVVLogSite@log_internal@absl@@PAV345@W4memory_order@01@3@Z + ??$__cxx_atomic_exchange@PAVVLogSite@log_internal@absl@@@__Cr@std@@YAPAVVLogSite@log_internal@absl@@PAU?$__cxx_atomic_base_impl@PAVVLogSite@log_internal@absl@@@01@PAV234@W4memory_order@01@@Z + ??$__cxx_atomic_load@P6AXABUHashtablezInfo@container_internal@absl@@@Z@__Cr@std@@YAP6AXABUHashtablezInfo@container_internal@absl@@@ZPBU?$__cxx_atomic_base_impl@P6AXABUHashtablezInfo@container_internal@absl@@@Z@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PAUArena@LowLevelAlloc@base_internal@absl@@@__Cr@std@@YAPAUArena@LowLevelAlloc@base_internal@absl@@PBU?$__cxx_atomic_base_impl@PAUArena@LowLevelAlloc@base_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PAUHashtablezInfo@container_internal@absl@@@__Cr@std@@YAPAUHashtablezInfo@container_internal@absl@@PBU?$__cxx_atomic_base_impl@PAUHashtablezInfo@container_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPAVCordzHandle@cord_internal@absl@@PBU?$__cxx_atomic_base_impl@PAVCordzHandle@cord_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PAVCordzInfo@cord_internal@absl@@@__Cr@std@@YAPAVCordzInfo@cord_internal@absl@@PBU?$__cxx_atomic_base_impl@PAVCordzInfo@cord_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PAVTimeZone@absl@@@__Cr@std@@YAPAVTimeZone@absl@@PBU?$__cxx_atomic_base_impl@PAVTimeZone@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PAVVLogSite@log_internal@absl@@@__Cr@std@@YAPAVVLogSite@log_internal@absl@@PBU?$__cxx_atomic_base_impl@PAVVLogSite@log_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@VMaskedPointer@flags_internal@absl@@@__Cr@std@@YA?AVMaskedPointer@flags_internal@absl@@PBU?$__cxx_atomic_base_impl@VMaskedPointer@flags_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@W4OnDeadlockCycle@absl@@@__Cr@std@@YA?AW4OnDeadlockCycle@absl@@PBU?$__cxx_atomic_base_impl@W4OnDeadlockCycle@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@W4State@PerThreadSynch@base_internal@absl@@@__Cr@std@@YA?AW4State@PerThreadSynch@base_internal@absl@@PBU?$__cxx_atomic_base_impl@W4State@PerThreadSynch@base_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_store@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXPAU?$__cxx_atomic_base_impl@PAVCordzHandle@cord_internal@absl@@@01@PAVCordzHandle@cord_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@PAVCordzInfo@cord_internal@absl@@@__Cr@std@@YAXPAU?$__cxx_atomic_base_impl@PAVCordzInfo@cord_internal@absl@@@01@PAVCordzInfo@cord_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@PAVVLogSite@log_internal@absl@@@__Cr@std@@YAXPAU?$__cxx_atomic_base_impl@PAVVLogSite@log_internal@absl@@@01@PAVVLogSite@log_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@VMaskedPointer@flags_internal@absl@@@__Cr@std@@YAXPAU?$__cxx_atomic_base_impl@VMaskedPointer@flags_internal@absl@@@01@VMaskedPointer@flags_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@W4OnDeadlockCycle@absl@@@__Cr@std@@YAXPAU?$__cxx_atomic_base_impl@W4OnDeadlockCycle@absl@@@01@W4OnDeadlockCycle@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@W4State@PerThreadSynch@base_internal@absl@@@__Cr@std@@YAXPAU?$__cxx_atomic_base_impl@W4State@PerThreadSynch@base_internal@absl@@@01@W4State@PerThreadSynch@base_internal@absl@@W4memory_order@01@@Z + ??$__debug_randomize_range@U_ClassicAlgPolicy@__Cr@std@@PAPAVCommandLineFlag@absl@@PAPAV45@@__Cr@std@@YAXPAPAVCommandLineFlag@absl@@0@Z + ??$__debug_randomize_range@U_ClassicAlgPolicy@__Cr@std@@PAPBVCommandLineFlag@absl@@PAPBV45@@__Cr@std@@YAXPAPBVCommandLineFlag@absl@@0@Z + ??$__debug_randomize_range@U_ClassicAlgPolicy@__Cr@std@@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@23@V423@@__Cr@std@@YAXV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@0@Z + ??$__debug_randomize_range@U_ClassicAlgPolicy@__Cr@std@@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@23@V423@@__Cr@std@@YAXV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@0@Z + ??$__destroy_at@PAPBVImpl@time_zone@cctz@time_internal@absl@@$0A@@__Cr@std@@YAXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$__destroy_at@PAUCordRep@cord_internal@absl@@$0A@@__Cr@std@@YAXPAPAUCordRep@cord_internal@absl@@@Z + ??$__destroy_at@PAUPrefixCrc@CrcCordState@crc_internal@absl@@$0A@@__Cr@std@@YAXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$__destroy_at@PAVCommandLineFlag@absl@@$0A@@__Cr@std@@YAXPAPAVCommandLineFlag@absl@@@Z + ??$__destroy_at@PAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@YAXPAPAVCordzHandle@cord_internal@absl@@@Z + ??$__destroy_at@PAVLogSink@absl@@$0A@@__Cr@std@@YAXPAPAVLogSink@absl@@@Z + ??$__destroy_at@PBUCordRep@cord_internal@absl@@$0A@@__Cr@std@@YAXPAPBUCordRep@cord_internal@absl@@@Z + ??$__destroy_at@PBVCommandLineFlag@absl@@$0A@@__Cr@std@@YAXPAPBVCommandLineFlag@absl@@@Z + ??$__destroy_at@PBVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@YAXPAPBVCordzHandle@cord_internal@absl@@@Z + ??$__destroy_at@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@$0A@@__Cr@std@@YAXPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@01@@Z + ??$__destroy_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@$0A@@__Cr@std@@YAXPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@01@@Z + ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAXPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@@Z + ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@$0A@@__Cr@std@@YAXPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@@Z + ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@$0A@@__Cr@std@@YAXPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@@Z + ??$__destroy_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAXPAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@01@@Z + ??$__destroy_at@UConversionItem@ParsedFormatBase@str_format_internal@absl@@$0A@@__Cr@std@@YAXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ??$__destroy_at@UPayload@status_internal@absl@@$0A@@__Cr@std@@YAXPAUPayload@status_internal@absl@@@Z + ??$__destroy_at@UPrefixCrc@CrcCordState@crc_internal@absl@@$0A@@__Cr@std@@YAXPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$__destroy_at@UTransition@cctz@time_internal@absl@@$0A@@__Cr@std@@YAXPAUTransition@cctz@time_internal@absl@@@Z + ??$__destroy_at@UTransitionType@cctz@time_internal@absl@@$0A@@__Cr@std@@YAXPAUTransitionType@cctz@time_internal@absl@@@Z + ??$__destroy_at@UUnrecognizedFlag@absl@@$0A@@__Cr@std@@YAXPAUUnrecognizedFlag@absl@@@Z + ??$__destroy_at@UViableSubstitution@strings_internal@absl@@$0A@@__Cr@std@@YAXPAUViableSubstitution@strings_internal@absl@@@Z + ??$__destroy_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@$0A@@__Cr@std@@YAXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@@Z + ??$__dispatch@$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$00@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@2345@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$01@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@2345@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$02@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@2345@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$0A@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@2345@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__distance@PBUPayload@status_internal@absl@@$0A@@__Cr@std@@YAHPBUPayload@status_internal@absl@@0@Z + ??$__distance@PBUTransition@cctz@time_internal@absl@@$0A@@__Cr@std@@YAHPBUTransition@cctz@time_internal@absl@@0@Z + ??$__distance@PBVFormatArgImpl@str_format_internal@absl@@$0A@@__Cr@std@@YAHPBVFormatArgImpl@str_format_internal@absl@@0@Z + ??$__distance@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAHV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@0@Z + ??$__distance@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAHV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@0@Z + ??$__distance@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YAHV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@0@Z + ??$__distance@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAHV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAHV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAHV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@01@0@Z + ??$__distance@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAHV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@0@Z + ??$__do_rehash@$00@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAEXI@Z + ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXI@Z + ??$__emplace_back_assume_capacity@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ??$__emplace_back_assume_capacity@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ??$__emplace_back_assume_capacity@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXAAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@ABV312@AAI@Z + ??$__emplace_back_assume_capacity@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXABQAVCommandLineFlag@absl@@@Z + ??$__emplace_back_assume_capacity@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXABQAVCordzHandle@cord_internal@absl@@@Z + ??$__emplace_back_assume_capacity@ABQAVLogSink@absl@@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEXABQAVLogSink@absl@@@Z + ??$__emplace_back_assume_capacity@ABQBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXABQBVCommandLineFlag@absl@@@Z + ??$__emplace_back_assume_capacity@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXABQBVCordzHandle@cord_internal@absl@@@Z + ??$__emplace_back_assume_capacity@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXABUTransition@cctz@time_internal@absl@@@Z + ??$__emplace_back_assume_capacity@ABUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXABUUnrecognizedFlag@absl@@@Z + ??$__emplace_back_assume_capacity@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAPBVCommandLineFlag@absl@@@Z + ??$__emplace_back_assume_capacity@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ??$__emplace_back_assume_capacity@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEX$$QAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@@Z + ??$__emplace_back_assume_capacity@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAW4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$__emplace_back_slow_path@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AAEPAUViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@ABV612@AAI@Z + ??$__emplace_back_slow_path@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAEPAPAVCommandLineFlag@absl@@ABQAV34@@Z + ??$__emplace_back_slow_path@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAEPAPAVCordzHandle@cord_internal@absl@@ABQAV345@@Z + ??$__emplace_back_slow_path@ABQAVLogSink@absl@@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AAEPAPAVLogSink@absl@@ABQAV34@@Z + ??$__emplace_back_slow_path@ABQBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAEPAPBVCommandLineFlag@absl@@ABQBV34@@Z + ??$__emplace_back_slow_path@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAEPAPBVCordzHandle@cord_internal@absl@@ABQBV345@@Z + ??$__emplace_back_slow_path@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEPAUTransition@cctz@time_internal@absl@@ABU3456@@Z + ??$__emplace_back_slow_path@ABUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AAEPAUUnrecognizedFlag@absl@@ABU34@@Z + ??$__emplace_back_slow_path@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAEPAPBVCommandLineFlag@absl@@$$QAPBV34@@Z + ??$__emplace_back_slow_path@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AAEPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU3456@@Z + ??$__emplace_back_slow_path@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAEPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QAV312@@Z + ??$__emplace_back_slow_path@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AAEPAUUnrecognizedFlag@absl@@$$QAW4Source@34@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@12@ABQBUCordRep@cord_internal@absl@@@Z + ??$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$__find@PAVLogSink@absl@@PAV12@U__identity@__Cr@std@@$0A@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@0ABQAV23@AAU__identity@01@@Z + ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@PAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@__Cr@std@@AAPAV?$__tree_node_base@PAX@23@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__find_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@PAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@__Cr@std@@AAPAV?$__tree_node_base@PAX@23@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$__find_loop@PAPAVLogSink@absl@@PAPAV12@PAV12@U__identity@__Cr@std@@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@0ABQAV23@AAU__identity@01@@Z + ??$__for_each_segment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__copy_impl@23@@__Cr@std@@YAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__copy_impl@01@@Z + ??$__get_alt@$00AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QA_PAAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__get_alt@$01AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QA_PAAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__get_alt@$02AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QA_PAAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__get_alt@$0A@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__base@__access@__variant_detail@__Cr@std@@SA$$QA_PAAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__get_alt@AAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$00@__union@__access@__variant_detail@__Cr@std@@SA$$QA_PAAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$00@34@@Z + ??$__get_alt@AAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$01@__union@__access@__variant_detail@__Cr@std@@SA$$QA_PAAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$01@34@@Z + ??$__get_alt@AAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__union@__access@__variant_detail@__Cr@std@@SA$$QA_PAAT?$__union@$0A@$00V?$variant@_K_JN@__Cr@std@@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$0A@@34@@Z + ??$__get_alt@AAT?$__union@$0A@$01V?$Span@$$CBD@absl@@V?$variant@IHM@__Cr@std@@@__variant_detail@__Cr@std@@$00@__union@__access@__variant_detail@__Cr@std@@SA$$QA_PAAT?$__union@$0A@$01V?$Span@$$CBD@absl@@V?$variant@IHM@__Cr@std@@@234@U?$in_place_index_t@$00@34@@Z + ??$__get_alt@AAT?$__union@$0A@$01V?$Span@$$CBD@absl@@V?$variant@IHM@__Cr@std@@@__variant_detail@__Cr@std@@@__union@__access@__variant_detail@__Cr@std@@SA$$QA_PAAT?$__union@$0A@$01V?$Span@$$CBD@absl@@V?$variant@IHM@__Cr@std@@@234@U?$in_place_index_t@$0A@@34@@Z + ??$__get_alt@AAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$00@__union@__access@__variant_detail@__Cr@std@@SA$$QA_PAAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$00@34@@Z + ??$__get_alt@AAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$01@__union@__access@__variant_detail@__Cr@std@@SA$$QA_PAAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$01@34@@Z + ??$__get_alt@AAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@$02@__union@__access@__variant_detail@__Cr@std@@SA$$QA_PAAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$02@34@@Z + ??$__get_alt@AAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@@__union@__access@__variant_detail@__Cr@std@@SA$$QA_PAAT?$__union@$0A@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@U?$in_place_index_t@$0A@@34@@Z + ??$__if_likely_else@V@?0???$emplace_back@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@ABV834@AAI@Z@V@?0???$emplace_back@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@234@QAEAAU567@012@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@01@QAEAAUViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@ABV701@AAI@Z@V@?0???$emplace_back@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@301@QAEAAU456@123@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@ABQAV56@@Z@V@?0???$emplace_back@ABQAVCommandLineFlag@absl@@@234@QAEAAPAV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@01@QAEAAPAVCommandLineFlag@absl@@ABQAV45@@Z@V@?0???$emplace_back@ABQAVCommandLineFlag@absl@@@301@QAEAAPAV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCordzHandle@cord_internal@absl@@ABQAV567@@Z@V@?0???$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@234@QAEAAPAV567@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@01@QAEAAPAVCordzHandle@cord_internal@absl@@ABQAV456@@Z@V@?0???$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@301@QAEAAPAV456@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@ABQAVLogSink@absl@@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVLogSink@absl@@ABQAV56@@Z@V@?0???$emplace_back@ABQAVLogSink@absl@@@234@QAEAAPAV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@ABQAVLogSink@absl@@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@01@QAEAAPAVLogSink@absl@@ABQAV45@@Z@V@?0???$emplace_back@ABQAVLogSink@absl@@@301@QAEAAPAV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@ABQBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@ABQBV56@@Z@V@?0???$emplace_back@ABQBVCommandLineFlag@absl@@@234@QAEAAPBV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@ABQBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@01@QAEAAPBVCommandLineFlag@absl@@ABQBV45@@Z@V@?0???$emplace_back@ABQBVCommandLineFlag@absl@@@301@QAEAAPBV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCordzHandle@cord_internal@absl@@ABQBV567@@Z@V@?0???$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@234@QAEAAPBV567@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@01@QAEAAPBVCordzHandle@cord_internal@absl@@ABQBV456@@Z@V@?0???$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@301@QAEAAPBV456@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@ABU5678@@Z@V@?0???$emplace_back@ABUTransition@cctz@time_internal@absl@@@234@QAEAAU5678@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@01@QAEAAUTransition@cctz@time_internal@absl@@ABU4567@@Z@V@?0???$emplace_back@ABUTransition@cctz@time_internal@absl@@@301@QAEAAU4567@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@ABUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@ABU56@@Z@V@?0???$emplace_back@ABUUnrecognizedFlag@absl@@@234@QAEAAU56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@ABUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@QAEAAUUnrecognizedFlag@absl@@ABU45@@Z@V@?0???$emplace_back@ABUUnrecognizedFlag@absl@@@301@QAEAAU45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@$$QAPBV56@@Z@V@?0???$emplace_back@PBVCommandLineFlag@absl@@@234@QAEAAPBV56@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@01@QAEAAPBVCommandLineFlag@absl@@$$QAPBV45@@Z@V@?0???$emplace_back@PBVCommandLineFlag@absl@@@301@QAEAAPBV45@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU5678@@Z@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@234@QAEAAU5678@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@01@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU4567@@Z@V@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@301@QAEAAU4567@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@34@$$QAV534@@Z@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@234@QAEAAV534@0@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@01@QAEAAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@$$QAV401@@Z@V@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@301@QAEAAV401@1@Z@@Z + ??$__if_likely_else@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@$$QAW4Source@56@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@234@QAEAAU56@01@Z@@__Cr@std@@YAX_NV@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@QAEAAUUnrecognizedFlag@absl@@$$QAW4Source@45@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z@V@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@301@QAEAAU45@12@Z@@Z + ??$__in_bounds@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@$0A@@__unique_ptr_array_bounds_stateless@__Cr@std@@QBE_NPAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@I@Z + ??$__in_bounds@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@$0A@@__unique_ptr_array_bounds_stateless@__Cr@std@@QBE_NPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@I@Z + ??$__insert_assign_n_unchecked@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@$0A@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAEXV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@12@HPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$__insert_with_size@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$__wrap_iter@PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@12@1H@Z + ??$__invoke@AAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@I@__Cr@std@@YAIAAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QAI@Z + ??$__invoke@AAUByCivilTime@Transition@cctz@time_internal@absl@@ABU2345@ABU2345@@__Cr@std@@YA_NAAUByCivilTime@Transition@cctz@time_internal@absl@@ABU3456@1@Z + ??$__invoke@AAUByUnixTime@Transition@cctz@time_internal@absl@@ABU2345@ABU2345@@__Cr@std@@YA_NAAUByUnixTime@Transition@cctz@time_internal@absl@@ABU3456@1@Z + ??$__invoke@AAU__identity@__Cr@std@@AAPAVLogSink@absl@@@__Cr@std@@YAAAPAVLogSink@absl@@AAU__identity@01@AAPAV23@@Z + ??$__invoke@AAU__identity@__Cr@std@@AAPBVCommandLineFlag@absl@@@__Cr@std@@YAAAPBVCommandLineFlag@absl@@AAU__identity@01@AAPBV23@@Z + ??$__invoke@AAU__identity@__Cr@std@@ABUTransition@cctz@time_internal@absl@@@__Cr@std@@YAABUTransition@cctz@time_internal@absl@@AAU__identity@01@ABU2345@@Z + ??$__invoke@AAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@5@@__Cr@std@@YAXAAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@6@@Z + ??$__invoke@P8FlagImpl@flags_internal@absl@@AEXXZPAV123@@__Cr@std@@YAX$$QAP8FlagImpl@flags_internal@absl@@AEXXZ$$QAPAV234@@Z + ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@456@@__Cr@std@@YAI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AAU?$__alt@$00V?$variant@_K_JN@__Cr@std@@@501@@Z + ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAU?$__alt@$01V?$Span@$$CBD@absl@@@456@@__Cr@std@@YAI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AAU?$__alt@$01V?$Span@$$CBD@absl@@@501@@Z + ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAU?$__alt@$02V?$variant@IHM@__Cr@std@@@456@@__Cr@std@@YAI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AAU?$__alt@$02V?$variant@IHM@__Cr@std@@@501@@Z + ??$__invoke@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAU?$__alt@$0A@V?$variant@_K_JIH_N@__Cr@std@@@456@@__Cr@std@@YAI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@01@AAU?$__alt@$0A@V?$variant@_K_JIH_N@__Cr@std@@@501@@Z + ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@AAV?$Span@$$CBD@4@@__Cr@std@@YAI$$QAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@45@@Z@AAV?$Span@$$CBD@5@@Z + ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@AAV?$variant@IHM@__Cr@std@@@__Cr@std@@YAI$$QAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@45@@Z@AAV?$variant@IHM@01@@Z + ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@AAV?$variant@_K_JIH_N@__Cr@std@@@__Cr@std@@YAI$$QAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@45@@Z@AAV?$variant@_K_JIH_N@01@@Z + ??$__invoke@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@AAV?$variant@_K_JN@__Cr@std@@@__Cr@std@@YAI$$QAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@45@@Z@AAV?$variant@_K_JN@01@@Z + ??$__invoke_r@XAAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@5@@__Cr@std@@YAXAAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@6@@Z + ??$__is_null@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@@__function@__Cr@std@@YA_NABV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@@Z + ??$__iter_move@AAPAPAVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QAPAVCommandLineFlag@absl@@AAPAPAV34@@Z + ??$__iter_move@AAPAPBVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QAPBVCommandLineFlag@absl@@AAPAPBV34@@Z + ??$__iter_move@PAPAVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QAPAVCommandLineFlag@absl@@$$QAPAPAV34@@Z + ??$__iter_move@PAPBVCommandLineFlag@absl@@$0A@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA$$QAPBVCommandLineFlag@absl@@$$QAPAPBV34@@Z + ??$__libcpp_allocate@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@01@W4__element_count@01@I@Z + ??$__libcpp_allocate@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@01@W4__element_count@01@I@Z + ??$__libcpp_allocate@PAUCordRep@cord_internal@absl@@@__Cr@std@@YAPAPAUCordRep@cord_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@PAVCommandLineFlag@absl@@@__Cr@std@@YAPAPAVCommandLineFlag@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPAPAVCordzHandle@cord_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@PAVLogSink@absl@@@__Cr@std@@YAPAPAVLogSink@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@PBVCommandLineFlag@absl@@@__Cr@std@@YAPAPBVCommandLineFlag@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPAPBVCordzHandle@cord_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAPAPBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@U?$AlignedType@$03@container_internal@absl@@@__Cr@std@@YAPAU?$AlignedType@$03@container_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@YAPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@01@W4__element_count@01@I@Z + ??$__libcpp_allocate@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@YAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@01@W4__element_count@01@I@Z + ??$__libcpp_allocate@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@23@PBXPAX2@Z@@__Cr@std@@YAPAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@34@PBXPAX2@Z@W4__element_count@01@I@Z + ??$__libcpp_allocate@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@UPayload@status_internal@absl@@@__Cr@std@@YAPAUPayload@status_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPAUPrefixCrc@CrcCordState@crc_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@UTransition@cctz@time_internal@absl@@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@UUnrecognizedFlag@absl@@@__Cr@std@@YAPAUUnrecognizedFlag@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAPAUViableSubstitution@strings_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_allocate@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@YAPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@01@W4__element_count@01@I@Z + ??$__libcpp_allocate@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@YAPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@01@W4__element_count@01@I@Z + ??$__libcpp_allocate@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@W4__element_count@01@I@Z + ??$__libcpp_allocate@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAPAVFormatArgImpl@str_format_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@01@W4__element_count@01@I@Z + ??$__libcpp_deallocate@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@01@W4__element_count@01@I@Z + ??$__libcpp_deallocate@PAUCordRep@cord_internal@absl@@@__Cr@std@@YAXPAPAUCordRep@cord_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@PAVCommandLineFlag@absl@@@__Cr@std@@YAXPAPAVCommandLineFlag@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXPAPAVCordzHandle@cord_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@PAVLogSink@absl@@@__Cr@std@@YAXPAPAVLogSink@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@PBVCommandLineFlag@absl@@@__Cr@std@@YAXPAPBVCommandLineFlag@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXPAPBVCordzHandle@cord_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAXPAPBVImpl@time_zone@cctz@time_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@U?$AlignedType@$03@container_internal@absl@@@__Cr@std@@YAXPAU?$AlignedType@$03@container_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@YAXPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@01@W4__element_count@01@I@Z + ??$__libcpp_deallocate@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@YAXPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@01@W4__element_count@01@I@Z + ??$__libcpp_deallocate@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@23@PBXPAX2@Z@@__Cr@std@@YAXPAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@34@PBXPAX2@Z@W4__element_count@01@I@Z + ??$__libcpp_deallocate@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@UPayload@status_internal@absl@@@__Cr@std@@YAXPAUPayload@status_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAXPAUPrefixCrc@CrcCordState@crc_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@UTransition@cctz@time_internal@absl@@@__Cr@std@@YAXPAUTransition@cctz@time_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAXPAUTransitionType@cctz@time_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@UUnrecognizedFlag@absl@@@__Cr@std@@YAXPAUUnrecognizedFlag@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXPAUViableSubstitution@strings_internal@absl@@W4__element_count@01@I@Z + ??$__libcpp_deallocate@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@YAXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@01@W4__element_count@01@I@Z + ??$__libcpp_deallocate@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@YAXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@01@W4__element_count@01@I@Z + ??$__libcpp_deallocate@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@W4__element_count@01@I@Z + ??$__libcpp_deallocate@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAXPAVFormatArgImpl@str_format_internal@absl@@W4__element_count@01@I@Z + ??$__lower_bound@U_ClassicAlgPolicy@__Cr@std@@PBUTransition@cctz@time_internal@absl@@PBU4567@U4567@U__identity@23@UByUnixTime@4567@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@AAUByUnixTime@2345@AAU__identity@01@@Z + ??$__lower_bound_bisecting@U_ClassicAlgPolicy@__Cr@std@@PBUTransition@cctz@time_internal@absl@@U4567@U__identity@23@UByUnixTime@4567@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@ABU2345@HAAUByUnixTime@2345@AAU__identity@01@@Z + ??$__make_exception_guard@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z@@__Cr@std@@YA?AU?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z@@01@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@01@AAEXI@Z@@Z + ??$__make_exception_guard@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@__Cr@std@@@01@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@01@@Z + ??$__make_value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@CA?A_P$$QAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@78@@Z@@Z + ??$__memberwise_forward_assign@V?$tuple@AAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@V?$tuple@PAVCommandLineFlag@absl@@_N@23@PAVCommandLineFlag@absl@@_N$$Z$0A@$00@__Cr@std@@YAXAAV?$tuple@AAPAVCommandLineFlag@absl@@AA_N@01@$$QAV?$tuple@PAVCommandLineFlag@absl@@_N@01@U?$__tuple_types@PAVCommandLineFlag@absl@@_N@01@U?$__integer_sequence@I$0A@$00@01@@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV45678@PAPAPBV45678@@__Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU4567@PAPAU4567@@__Cr@std@@YA?AU?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@01@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PAPAVLogSink@absl@@PAPAV45@PAPAV45@@__Cr@std@@YA?AU?$pair@PAPAVLogSink@absl@@PAPAV12@@01@PAPAVLogSink@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PAUTransition@cctz@time_internal@absl@@PAU4567@PAU4567@@__Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@PAUTransition@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@__Cr@std@@PAUTransitionType@cctz@time_internal@absl@@PAU4567@PAU4567@@__Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@PAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV45678@PAPAPBV45678@@__Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU4567@PAPAU4567@@__Cr@std@@YA?AU?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@01@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@00@Z + ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PAUTransition@cctz@time_internal@absl@@PAU4567@PAU4567@@__Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@PAUTransition@cctz@time_internal@absl@@00@Z + ??$__move_backward@U_ClassicAlgPolicy@__Cr@std@@PAUTransitionType@cctz@time_internal@absl@@PAU4567@PAU4567@@__Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@PAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__rehash@$00@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAEXI@Z + ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXI@Z + ??$__rewrap_iter@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@U?$__unwrap_iter_impl@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@0@Z + ??$__rewrap_iter@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@U?$__unwrap_iter_impl@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU2345@0@Z + ??$__rewrap_iter@PAPAVLogSink@absl@@PAPAV12@U?$__unwrap_iter_impl@PAPAVLogSink@absl@@$00@__Cr@std@@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@0@Z + ??$__rewrap_iter@PAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@U?$__unwrap_iter_impl@PAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU2345@0@Z + ??$__rewrap_iter@PAUTransition@cctz@time_internal@absl@@PAU1234@U?$__unwrap_iter_impl@PAUTransition@cctz@time_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@0@Z + ??$__rewrap_iter@PAUTransitionType@cctz@time_internal@absl@@PAU1234@U?$__unwrap_iter_impl@PAUTransitionType@cctz@time_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@0@Z + ??$__rewrap_iter@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@U?$__unwrap_iter_impl@PBUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@@__Cr@std@@YAPBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU2345@0@Z + ??$__rewrap_iter@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@V123@U?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@V201@0@Z + ??$__rewrap_iter@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V123@U?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@V201@0@Z + ??$__rewrap_iter@V?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@absl@@U?$__unwrap_iter_impl@V?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@$00@23@@__Cr@std@@YA?AV?$__wrap_iter@PAPAVLogSink@absl@@@01@V201@PAPAVLogSink@absl@@@Z + ??$__rewrap_range@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@PAPAPBV12345@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@0@Z + ??$__rewrap_range@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@PAPAU1234@@__Cr@std@@YAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU2345@0@Z + ??$__rewrap_range@PAPAVLogSink@absl@@PAPAV12@PAPAV12@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@0@Z + ??$__rewrap_range@PAUTransition@cctz@time_internal@absl@@PAU1234@PAU1234@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@0@Z + ??$__rewrap_range@PAUTransitionType@cctz@time_internal@absl@@PAU1234@PAU1234@@__Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@0@Z + ??$__rewrap_range@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@PBU1234@@__Cr@std@@YAPBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU2345@0@Z + ??$__rewrap_range@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V123@V123@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@V201@0@Z + ??$__std_visit_exhaustive_visitor_check@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@AAV?$Span@$$CBD@4@@__variant@__visitation@__variant_detail@__Cr@std@@CAXXZ + ??$__std_visit_exhaustive_visitor_check@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@AAV?$variant@IHM@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@CAXXZ + ??$__std_visit_exhaustive_visitor_check@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@AAV?$variant@_K_JIH_N@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@CAXXZ + ??$__std_visit_exhaustive_visitor_check@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@AAV?$variant@_K_JN@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@CAXXZ + ??$__swap_allocator@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAAV?$allocator@UUnrecognizedFlag@absl@@@01@0@Z + ??$__swap_allocator@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAAV?$allocator@UUnrecognizedFlag@absl@@@01@0U?$integral_constant@_N$0A@@01@@Z + ??$__swap_bitmap_pos@U_ClassicAlgPolicy@__Cr@std@@PAPAVCommandLineFlag@absl@@@__Cr@std@@YAXPAPAVCommandLineFlag@absl@@0AA_K1@Z + ??$__swap_bitmap_pos@U_ClassicAlgPolicy@__Cr@std@@PAPBVCommandLineFlag@absl@@@__Cr@std@@YAXPAPBVCommandLineFlag@absl@@0AA_K1@Z + ??$__swap_bitmap_pos_within@U_ClassicAlgPolicy@__Cr@std@@PAPAVCommandLineFlag@absl@@@__Cr@std@@YAXAAPAPAVCommandLineFlag@absl@@0AA_K1@Z + ??$__swap_bitmap_pos_within@U_ClassicAlgPolicy@__Cr@std@@PAPBVCommandLineFlag@absl@@@__Cr@std@@YAXAAPAPBVCommandLineFlag@absl@@0AA_K1@Z + ??$__throw_if_valueless@AAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@@__Cr@std@@YAXAAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@01@@Z + ??$__to_address@$$CBUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU2345@@Z + ??$__to_address@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@@Z + ??$__to_address@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@01@PAPAU201@@Z + ??$__to_address@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@01@PAPAU201@@Z + ??$__to_address@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU2345@@Z + ??$__to_address@PAVCommandLineFlag@absl@@@__Cr@std@@YAPAPAVCommandLineFlag@absl@@PAPAV23@@Z + ??$__to_address@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPAPAVCordzHandle@cord_internal@absl@@PAPAV234@@Z + ??$__to_address@PAVLogSink@absl@@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@@Z + ??$__to_address@PBVCommandLineFlag@absl@@@__Cr@std@@YAPAPBVCommandLineFlag@absl@@PAPBV23@@Z + ??$__to_address@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAPAPBVCordzHandle@cord_internal@absl@@PAPBV234@@Z + ??$__to_address@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@YAPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@01@PAU201@@Z + ??$__to_address@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@YAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@01@PAU201@@Z + ??$__to_address@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU2345@@Z + ??$__to_address@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU2345@@Z + ??$__to_address@UTransition@cctz@time_internal@absl@@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@@Z + ??$__to_address@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@@Z + ??$__to_address@UUnrecognizedFlag@absl@@@__Cr@std@@YAPAUUnrecognizedFlag@absl@@PAU23@@Z + ??$__to_address@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAPAUViableSubstitution@strings_internal@absl@@PAU234@@Z + ??$__to_address@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@YAPAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@ABV456@@Z@PAU2?1???R3456@QBE?AV701@0@Z@@Z + ??$__to_address@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAPAPAVCommandLineFlag@absl@@ABV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@@Z + ??$__to_address@V?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@$0A@@__Cr@std@@YAPAPAVLogSink@absl@@ABV?$__wrap_iter@PAPAVLogSink@absl@@@01@@Z + ??$__to_address@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@$0A@@__Cr@std@@YAPAPBVCommandLineFlag@absl@@ABV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@@Z + ??$__to_address@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YAPAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@ABV456@@Z@ABV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@@Z + ??$__to_address@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YAPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PAV201@@Z + ??$__try_key_extraction@PBUCordRep@cord_internal@absl@@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@67@ABQBU123@@Z@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@567@QAE?AU867@0@Z@ABQBU123@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@01@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@01@QAE?AU201@ABQBUCordRep@cord_internal@absl@@@Z@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@401@QAE?AU201@0@Z@0@Z + ??$__try_key_extraction@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@23@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@523@QAE?AU623@012@Z@ABU723@V823@V923@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@01@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@01@QAE?AU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@401@QAE?AU201@012@Z@012@Z + ??$__try_key_extraction@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@523@QAE?AU623@012@Z@ABU723@V823@V923@@__Cr@std@@YA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@01@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@01@QAE?AU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@401@QAE?AU201@012@Z@012@Z + ??$__try_key_extraction_impl@PBUCordRep@cord_internal@absl@@U?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@__Cr@std@@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@56@QAE?AU456@ABQBU123@@Z@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@856@QAE?AU456@0@Z@ABQBU123@$0A@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@01@QAE?AU201@ABQBUCordRep@cord_internal@absl@@@Z@V@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@501@QAE?AU201@1@Z@1@Z + ??$__try_key_extraction_impl@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@23@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@23@QAE?AU423@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@623@QAE?AU423@012@Z@ABU723@V823@V923@$0A@@__Cr@std@@YA?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@01@QAE?AU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@501@QAE?AU201@123@Z@123@Z + ??$__try_key_extraction_impl@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@23@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@QAE?AU423@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@623@QAE?AU423@012@Z@ABU723@V823@V923@$0A@@__Cr@std@@YA?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@01@U?$__priority_tag@$00@01@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@01@QAE?AU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z@V@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@501@QAE?AU201@123@Z@123@Z + ??$__uninitialized_allocator_copy@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@23@V423@PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@__Cr@std@@YAPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@1PAV201@@Z + ??$__uninitialized_allocator_copy_impl@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@ABV678@@Z@PAU4?1???R5678@QBE?AV923@0@Z@PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@__Cr@std@@YAPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@ABV567@@Z@2PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@PAPAVCommandLineFlag@absl@@@__Cr@std@@YAXAAV?$allocator@PAVCommandLineFlag@absl@@@01@PAPAVCommandLineFlag@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@PAPAVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@01@PAPAVCordzHandle@cord_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@absl@@@__Cr@std@@YAXAAV?$allocator@PAVLogSink@absl@@@01@PAPAVLogSink@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@PAPBVCommandLineFlag@absl@@@__Cr@std@@YAXAAV?$allocator@PBVCommandLineFlag@absl@@@01@PAPBVCommandLineFlag@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@PAPBVCordzHandle@cord_internal@absl@@@__Cr@std@@YAXAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@01@PAPBVCordzHandle@cord_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@YAXAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@YAXAAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PAUTransition@cctz@time_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAXAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PAUTransitionType@cctz@time_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@__Cr@std@@YAXAAV?$allocator@UUnrecognizedFlag@absl@@@01@PAUUnrecognizedFlag@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@PAUViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXAAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@PAUViableSubstitution@strings_internal@absl@@11@Z + ??$__uninitialized_allocator_relocate@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@__Cr@std@@YAXAAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@01@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@11@Z + ??$__unwrap_iter@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@@Z + ??$__unwrap_iter@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$__unwrap_iter_impl@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU2345@@Z + ??$__unwrap_iter@PAPAVLogSink@absl@@U?$__unwrap_iter_impl@PAPAVLogSink@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@@Z + ??$__unwrap_iter@PAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$__unwrap_iter_impl@PAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU2345@@Z + ??$__unwrap_iter@PAUTransition@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PAUTransition@cctz@time_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@@Z + ??$__unwrap_iter@PAUTransitionType@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PAUTransitionType@cctz@time_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@@Z + ??$__unwrap_iter@PBUPrefixCrc@CrcCordState@crc_internal@absl@@U?$__unwrap_iter_impl@PBUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@$0A@@__Cr@std@@YAPBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU2345@@Z + ??$__unwrap_iter@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@U?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@$0A@@23@$0A@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@V201@@Z + ??$__unwrap_iter@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@U?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@$0A@@23@$0A@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@V201@@Z + ??$__unwrap_iter@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@U?$__unwrap_iter_impl@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@$00@23@$0A@@__Cr@std@@YAPAPAVCommandLineFlag@absl@@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@@Z + ??$__unwrap_iter@V?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@U?$__unwrap_iter_impl@V?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@$00@23@$0A@@__Cr@std@@YAPAPAVLogSink@absl@@V?$__wrap_iter@PAPAVLogSink@absl@@@01@@Z + ??$__unwrap_iter@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@U?$__unwrap_iter_impl@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@$00@23@$0A@@__Cr@std@@YAPAPBVCommandLineFlag@absl@@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@@Z + ??$__unwrap_iter@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@U?$__unwrap_iter_impl@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@$00@23@$0A@@__Cr@std@@YAPAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@ABV456@@Z@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@@Z + ??$__unwrap_range@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@__Cr@std@@YA?A_PPAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$__unwrap_range@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@__Cr@std@@YA?A_PPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$__unwrap_range@PAPAVLogSink@absl@@PAPAV12@@__Cr@std@@YA?A_PPAPAVLogSink@absl@@0@Z + ??$__unwrap_range@PAUTransition@cctz@time_internal@absl@@PAU1234@@__Cr@std@@YA?A_PPAUTransition@cctz@time_internal@absl@@0@Z + ??$__unwrap_range@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@__Cr@std@@YA?A_PPAUTransitionType@cctz@time_internal@absl@@0@Z + ??$__unwrap_range@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@@__Cr@std@@YA?A_PPBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$__unwrap_range@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V123@@__Cr@std@@YA?A_PV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0@Z + ??$__unwrap_range@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@V123@@__Cr@std@@YA?A_PV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@0@Z + ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PBU5678@PBU5678@U5678@U__identity@23@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@$$QAUByCivilTime@2345@$$QAU__identity@01@@Z + ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByUnixTime@Transition@cctz@time_internal@absl@@PBU5678@PBU5678@U5678@U__identity@23@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@$$QAUByUnixTime@2345@$$QAU__identity@01@@Z + ??$__validate_iter_reference@AAPAPAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@AAPAPBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@PAPAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__validate_iter_reference@PAPBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ + ??$__visit_alt@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__impl@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@1234@AAV?$__impl@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@234@@Z + ??$__visit_alt@U?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@56@@__variant@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@01234@AAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@34@@Z + ??$__visit_value@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@AAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@@__variant@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@78@@Z@AAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@34@@Z + ??$advance@PBUTransition@cctz@time_internal@absl@@H@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAAPBUTransition@cctz@time_internal@absl@@H@Z + ??$advance@PBUTransition@cctz@time_internal@absl@@HH$0A@@__Cr@std@@YAXAAPBUTransition@cctz@time_internal@absl@@H@Z + ??$advance@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@HH$0A@@__Cr@std@@YAXAAV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@H@Z + ??$advance@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@H@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAAV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@12@H@Z + ??$advance@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@HH$0A@@__Cr@std@@YAXAAV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@H@Z + ??$advance@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@HH$0A@@__Cr@std@@YAXAAV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@H@Z + ??$allocate_at_least@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@12@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@I@Z + ??$allocate_at_least@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@12@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@I@Z + ??$allocate_at_least@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PAPAVCommandLineFlag@absl@@I@12@AAV?$allocator@PAVCommandLineFlag@absl@@@12@I@Z + ??$allocate_at_least@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PAPAVCordzHandle@cord_internal@absl@@I@12@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@I@Z + ??$allocate_at_least@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PAPAVLogSink@absl@@I@12@AAV?$allocator@PAVLogSink@absl@@@12@I@Z + ??$allocate_at_least@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PAPBVCommandLineFlag@absl@@I@12@AAV?$allocator@PBVCommandLineFlag@absl@@@12@I@Z + ??$allocate_at_least@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PAPBVCordzHandle@cord_internal@absl@@I@12@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@I@Z + ??$allocate_at_least@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@I@12@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@I@Z + ??$allocate_at_least@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PAUTransition@cctz@time_internal@absl@@I@12@AAV?$allocator@UTransition@cctz@time_internal@absl@@@12@I@Z + ??$allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PAUTransitionType@cctz@time_internal@absl@@I@12@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@I@Z + ??$allocate_at_least@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PAUUnrecognizedFlag@absl@@I@12@AAV?$allocator@UUnrecognizedFlag@absl@@@12@I@Z + ??$allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PAUViableSubstitution@strings_internal@absl@@I@12@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@I@Z + ??$allocate_at_least@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SA?AU?$allocation_result@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@I@12@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@I@Z + ??$apply@U?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SA_N$$QAU?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@12@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@U?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@container_internal@absl@@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA_N$$QAU?$EqualElement@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UStringEq@container_internal@absl@@@12@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@U?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SAI$$QAU?$HashElement@UStringHash@container_internal@absl@@$00@12@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@U?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAI$$QAU?$HashElement@UStringHash@container_internal@absl@@$00@12@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@45@@Z + ??$apply@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@34@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@45@@Z + ??$apply@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@45@@Z + ??$apply@UEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@34@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAUEmplaceDecomposable@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@45@@Z + ??$apply@UFindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SA?AVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QAUFindElement@412@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$apply@UFindElement@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@34@@?$hash_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA?AVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@12@$$QAUFindElement@412@AAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@Z + ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@$0A@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@0@Z + ??$begin@V?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@AAV?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@01@@Z + ??$begin@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@AAV?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@01@@Z + ??$bit_cast@U?$FlagValueAndInitBit@_N@flags_internal@absl@@_J@__Cr@std@@YA?AU?$FlagValueAndInitBit@_N@flags_internal@absl@@AB_J@Z + ??$c_begin@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@container_algorithm_internal@absl@@YA?AV?$__wrap_iter@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@AAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@@Z + ??$c_end@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@container_algorithm_internal@absl@@YA?AV?$__wrap_iter@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@AAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@34@@Z + ??$call_once@A6AXXZ$$V@absl@@YAXAAVonce_flag@0@A6AXXZ@Z + ??$call_once@P8FlagImpl@flags_internal@absl@@AEXXZPAV123@@absl@@YAXAAVonce_flag@0@$$QAP8FlagImpl@flags_internal@0@AEXXZ$$QAPAV230@@Z + ??$combine@H$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@ABH@Z + ??$combine@I$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@ABI@Z + ??$combine@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$combine@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@Z + ??$combine@V?$tuple@ABI@__Cr@std@@$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@ABV?$tuple@ABI@__Cr@std@@@Z + ??$combine@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@$$V@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@ABV?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@@Z + ??$combine_contiguous@D@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@PBDI@Z + ??$construct@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@ABUpiecewise_construct_t@__Cr@std@@$$QAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@56@@Z + ??$construct@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@ABUpiecewise_construct_t@__Cr@std@@$$QAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@56@@Z + ??$construct@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAPAPBV12345@$0A@@?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@AAPAPBV45678@@Z + ??$construct@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@$0A@@?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$$QAPAPBV45678@@Z + ??$construct@PAUCordRep@cord_internal@absl@@ABQAU123@$0A@@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@12@PAPAUCordRep@cord_internal@absl@@ABQAU456@@Z + ??$construct@PAUCordRep@cord_internal@absl@@PAU123@$0A@@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@12@PAPAUCordRep@cord_internal@absl@@$$QAPAU456@@Z + ??$construct@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAPAU1234@$0A@@?$allocator_traits@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@AAPAU4567@@Z + ??$construct@PAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@$0A@@?$allocator_traits@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAPAU4567@@Z + ??$construct@PAVCommandLineFlag@absl@@ABQAV12@$0A@@?$allocator_traits@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAVCommandLineFlag@absl@@@12@PAPAVCommandLineFlag@absl@@ABQAV45@@Z + ??$construct@PAVCordzHandle@cord_internal@absl@@ABQAV123@$0A@@?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@PAPAVCordzHandle@cord_internal@absl@@ABQAV456@@Z + ??$construct@PAVLogSink@absl@@ABQAV12@$0A@@?$allocator_traits@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAVLogSink@absl@@@12@PAPAVLogSink@absl@@ABQAV45@@Z + ??$construct@PAVLogSink@absl@@PAV12@$0A@@?$allocator_traits@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAVLogSink@absl@@@12@PAPAVLogSink@absl@@$$QAPAV45@@Z + ??$construct@PBUCordRep@cord_internal@absl@@ABQBU123@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@PAPBUCordRep@cord_internal@absl@@ABQBU456@@Z + ??$construct@PBVCommandLineFlag@absl@@ABQBV12@$0A@@?$allocator_traits@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PBVCommandLineFlag@absl@@@12@PAPBVCommandLineFlag@absl@@ABQBV45@@Z + ??$construct@PBVCommandLineFlag@absl@@PBV12@$0A@@?$allocator_traits@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PBVCommandLineFlag@absl@@@12@PAPBVCommandLineFlag@absl@@$$QAPBV45@@Z + ??$construct@PBVCordzHandle@cord_internal@absl@@ABQBV123@$0A@@?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@PAPBVCordzHandle@cord_internal@absl@@ABQBV456@@Z + ??$construct@PBVImpl@time_zone@cctz@time_internal@absl@@ABQBV12345@$0A@@?$allocator_traits@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@12@PAPBVImpl@time_zone@cctz@time_internal@absl@@ABQBV45678@@Z + ??$construct@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@PAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$construct@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@12@PAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$construct@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@12@PAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z + ??$construct@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@$0A@@?$allocator_traits@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@12@PAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@12@@Z + ??$construct@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@$0A@@?$allocator_traits@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@12@PAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@12@@Z + ??$construct@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@$0A@@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU4567@@Z + ??$construct@UPayload@status_internal@absl@@ABU123@$0A@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UPayload@status_internal@absl@@@12@PAUPayload@status_internal@absl@@ABU456@@Z + ??$construct@UPayload@status_internal@absl@@U123@$0A@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UPayload@status_internal@absl@@@12@PAUPayload@status_internal@absl@@$$QAU456@@Z + ??$construct@UPrefixCrc@CrcCordState@crc_internal@absl@@ABU1234@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@PAUPrefixCrc@CrcCordState@crc_internal@absl@@ABU4567@@Z + ??$construct@UPrefixCrc@CrcCordState@crc_internal@absl@@HVcrc32c_t@4@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@PAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAH$$QAVcrc32c_t@7@@Z + ??$construct@UPrefixCrc@CrcCordState@crc_internal@absl@@U1234@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@PAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAU4567@@Z + ??$construct@UTransition@cctz@time_internal@absl@@$$V$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PAUTransition@cctz@time_internal@absl@@@Z + ??$construct@UTransition@cctz@time_internal@absl@@ABU1234@$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PAUTransition@cctz@time_internal@absl@@ABU4567@@Z + ??$construct@UTransition@cctz@time_internal@absl@@U1234@$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PAUTransition@cctz@time_internal@absl@@$$QAU4567@@Z + ??$construct@UTransitionType@cctz@time_internal@absl@@$$V$0A@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@PAUTransitionType@cctz@time_internal@absl@@@Z + ??$construct@UTransitionType@cctz@time_internal@absl@@U1234@$0A@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@PAUTransitionType@cctz@time_internal@absl@@$$QAU4567@@Z + ??$construct@UUnrecognizedFlag@absl@@ABU12@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UUnrecognizedFlag@absl@@@12@PAUUnrecognizedFlag@absl@@ABU45@@Z + ??$construct@UUnrecognizedFlag@absl@@U12@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UUnrecognizedFlag@absl@@@12@PAUUnrecognizedFlag@absl@@$$QAU45@@Z + ??$construct@UUnrecognizedFlag@absl@@W4Source@12@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UUnrecognizedFlag@absl@@@12@PAUUnrecognizedFlag@absl@@$$QAW4Source@45@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$construct@UViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV456@AAI$0A@@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@PAUViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@ABV712@AAI@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SAXPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@ABUpiecewise_construct_t@45@$$QAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAXPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@ABUpiecewise_construct_t@45@$$QAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SAXPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@ABUpiecewise_construct_t@45@$$QAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SAXPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@ABUpiecewise_construct_t@45@$$QAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAXPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@ABUpiecewise_construct_t@45@$$QAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SAXPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@ABUpiecewise_construct_t@45@$$QAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@45@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@45@@Z + ??$construct@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@ABV678@@Z@$0A@@?$allocator_traits@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@ABV789@@Z@@Z + ??$construct@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@$0A@@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QAV412@@Z + ??$construct@VFormatArgImpl@str_format_internal@absl@@ABV123@$0A@@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@12@PAVFormatArgImpl@str_format_internal@absl@@ABV456@@Z + ??$construct_at@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAPAPBV12345@PAPAPBV12345@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@AAPAPBV23456@@Z + ??$construct_at@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@PAPAPBV12345@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@$$QAPAPBV23456@@Z + ??$construct_at@PAUCordRep@cord_internal@absl@@ABQAU123@PAPAU123@@__Cr@std@@YAPAPAUCordRep@cord_internal@absl@@PAPAU234@ABQAU234@@Z + ??$construct_at@PAUCordRep@cord_internal@absl@@PAU123@PAPAU123@@__Cr@std@@YAPAPAUCordRep@cord_internal@absl@@PAPAU234@$$QAPAU234@@Z + ??$construct_at@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAPAU1234@PAPAU1234@@__Cr@std@@YAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU2345@AAPAU2345@@Z + ??$construct_at@PAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@PAPAU1234@@__Cr@std@@YAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU2345@$$QAPAU2345@@Z + ??$construct_at@PAVCommandLineFlag@absl@@ABQAV12@PAPAV12@@__Cr@std@@YAPAPAVCommandLineFlag@absl@@PAPAV23@ABQAV23@@Z + ??$construct_at@PAVCordzHandle@cord_internal@absl@@ABQAV123@PAPAV123@@__Cr@std@@YAPAPAVCordzHandle@cord_internal@absl@@PAPAV234@ABQAV234@@Z + ??$construct_at@PAVLogSink@absl@@ABQAV12@PAPAV12@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@ABQAV23@@Z + ??$construct_at@PAVLogSink@absl@@PAV12@PAPAV12@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@$$QAPAV23@@Z + ??$construct_at@PBUCordRep@cord_internal@absl@@ABQBU123@PAPBU123@@__Cr@std@@YAPAPBUCordRep@cord_internal@absl@@PAPBU234@ABQBU234@@Z + ??$construct_at@PBVCommandLineFlag@absl@@ABQBV12@PAPBV12@@__Cr@std@@YAPAPBVCommandLineFlag@absl@@PAPBV23@ABQBV23@@Z + ??$construct_at@PBVCommandLineFlag@absl@@PBV12@PAPBV12@@__Cr@std@@YAPAPBVCommandLineFlag@absl@@PAPBV23@$$QAPBV23@@Z + ??$construct_at@PBVCordzHandle@cord_internal@absl@@ABQBV123@PAPBV123@@__Cr@std@@YAPAPBVCordzHandle@cord_internal@absl@@PAPBV234@ABQBV234@@Z + ??$construct_at@PBVImpl@time_zone@cctz@time_internal@absl@@ABQBV12345@PAPBV12345@@__Cr@std@@YAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV23456@ABQBV23456@@Z + ??$construct_at@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@AAIAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@ABQBUCordRep@cord_internal@absl@@PAU123@@__Cr@std@@YAPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@01@PAU201@AAIAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@01@ABQBUCordRep@cord_internal@absl@@@Z + ??$construct_at@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@AAIAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@01@PAU201@AAIAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@01@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z + ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z + ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z + ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z + ??$construct_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@PAU123@@__Cr@std@@YAPAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@01@@Z + ??$construct_at@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@PAU123@@__Cr@std@@YAPAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@01@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@01@@Z + ??$construct_at@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@PAU1234@@__Cr@std@@YAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU2345@$$QAU2345@@Z + ??$construct_at@UPayload@status_internal@absl@@ABU123@PAU123@@__Cr@std@@YAPAUPayload@status_internal@absl@@PAU234@ABU234@@Z + ??$construct_at@UPayload@status_internal@absl@@U123@PAU123@@__Cr@std@@YAPAUPayload@status_internal@absl@@PAU234@$$QAU234@@Z + ??$construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@ABU1234@PAU1234@@__Cr@std@@YAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU2345@ABU2345@@Z + ??$construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@HVcrc32c_t@4@PAU1234@@__Cr@std@@YAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU2345@$$QAH$$QAVcrc32c_t@5@@Z + ??$construct_at@UPrefixCrc@CrcCordState@crc_internal@absl@@U1234@PAU1234@@__Cr@std@@YAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU2345@$$QAU2345@@Z + ??$construct_at@UTransition@cctz@time_internal@absl@@$$VPAU1234@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@@Z + ??$construct_at@UTransition@cctz@time_internal@absl@@ABU1234@PAU1234@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@ABU2345@@Z + ??$construct_at@UTransition@cctz@time_internal@absl@@U1234@PAU1234@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@$$QAU2345@@Z + ??$construct_at@UTransitionType@cctz@time_internal@absl@@$$VPAU1234@@__Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@@Z + ??$construct_at@UTransitionType@cctz@time_internal@absl@@U1234@PAU1234@@__Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@$$QAU2345@@Z + ??$construct_at@UUnrecognizedFlag@absl@@ABU12@PAU12@@__Cr@std@@YAPAUUnrecognizedFlag@absl@@PAU23@ABU23@@Z + ??$construct_at@UUnrecognizedFlag@absl@@U12@PAU12@@__Cr@std@@YAPAUUnrecognizedFlag@absl@@PAU23@$$QAU23@@Z + ??$construct_at@UUnrecognizedFlag@absl@@W4Source@12@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAU12@@__Cr@std@@YAPAUUnrecognizedFlag@absl@@PAU23@$$QAW4Source@23@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@@Z + ??$construct_at@UViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV456@AAIPAU123@@__Cr@std@@YAPAUViableSubstitution@strings_internal@absl@@PAU234@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@ABV501@AAI@Z + ??$construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@23@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAV123@@__Cr@std@@YAPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@01@PAV201@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@01@ABUpiecewise_construct_t@01@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z + ??$construct_at@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@23@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAV123@@__Cr@std@@YAPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@01@PAV201@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@01@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z + ??$construct_at@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@ABV678@@Z@PAV123@@__Cr@std@@YAPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@PAV201@AAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@01@ABV567@@Z@@Z + ??$construct_at@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V123@PAV123@@__Cr@std@@YAPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@01@PAV201@$$QAV201@@Z + ??$construct_at@VFormatArgImpl@str_format_internal@absl@@ABV123@PAV123@@__Cr@std@@YAPAVFormatArgImpl@str_format_internal@absl@@PAV234@ABV234@@Z + ??$copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0V201@@Z + ??$copy_n@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@HV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@$0A@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@HV201@@Z + ??$destroy@PAPBVImpl@time_zone@cctz@time_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$destroy@PAUCordRep@cord_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@12@PAPAUCordRep@cord_internal@absl@@@Z + ??$destroy@PAUPrefixCrc@CrcCordState@crc_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$destroy@PAVCommandLineFlag@absl@@$0A@@?$allocator_traits@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAVCommandLineFlag@absl@@@12@PAPAVCommandLineFlag@absl@@@Z + ??$destroy@PAVCordzHandle@cord_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@PAPAVCordzHandle@cord_internal@absl@@@Z + ??$destroy@PAVLogSink@absl@@$0A@@?$allocator_traits@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAVLogSink@absl@@@12@PAPAVLogSink@absl@@@Z + ??$destroy@PBUCordRep@cord_internal@absl@@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@PAPBUCordRep@cord_internal@absl@@@Z + ??$destroy@PBVCommandLineFlag@absl@@$0A@@?$allocator_traits@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PBVCommandLineFlag@absl@@@12@PAPBVCommandLineFlag@absl@@@Z + ??$destroy@PBVCordzHandle@cord_internal@absl@@$0A@@?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@PAPBVCordzHandle@cord_internal@absl@@@Z + ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@PAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@12@PAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@@Z + ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@12@PAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@@Z + ??$destroy@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@12@PAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@@Z + ??$destroy@UConversionItem@ParsedFormatBase@str_format_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ??$destroy@UPayload@status_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UPayload@status_internal@absl@@@12@PAUPayload@status_internal@absl@@@Z + ??$destroy@UPrefixCrc@CrcCordState@crc_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$destroy@UTransition@cctz@time_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PAUTransition@cctz@time_internal@absl@@@Z + ??$destroy@UTransitionType@cctz@time_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@PAUTransitionType@cctz@time_internal@absl@@@Z + ??$destroy@UUnrecognizedFlag@absl@@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UUnrecognizedFlag@absl@@@12@PAUUnrecognizedFlag@absl@@@Z + ??$destroy@UViableSubstitution@strings_internal@absl@@$0A@@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@PAUViableSubstitution@strings_internal@absl@@@Z + ??$destroy@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@@Z + ??$destroy@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SA?A_PPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@@Z + ??$destroy@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@@Z + ??$destroy@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@@Z + ??$distance@PBUPayload@status_internal@absl@@@__Cr@std@@YAHPBUPayload@status_internal@absl@@0@Z + ??$distance@PBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAHPBUTransition@cctz@time_internal@absl@@0@Z + ??$distance@PBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAHPBUTransition@cctz@time_internal@absl@@0@Z + ??$distance@PBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAHPBVFormatArgImpl@str_format_internal@absl@@0@Z + ??$distance@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAHV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@0@Z + ??$distance@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAHV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@12@0@Z + ??$distance@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAHV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@0@Z + ??$distance@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@@__Cr@std@@YAHV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@0@Z + ??$distance@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z + ??$distance@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z + ??$distance@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@01@0@Z + ??$distance@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@0@Z + ??$element@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAAAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@@Z + ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PBUTransition@cctz@time_internal@absl@@@12@@Z + ??$emplace@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@12@V?$__wrap_iter@PBUTransitionType@cctz@time_internal@absl@@@12@@Z + ??$emplace@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@45@@Z + ??$emplace@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@45@@Z + ??$emplace_at@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IAEXViterator@012@ABUpiecewise_construct_t@__Cr@std@@$$QAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@56@@Z + ??$emplace_at@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IAEXViterator@012@ABUpiecewise_construct_t@__Cr@std@@$$QAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@56@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@56@@Z + ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ??$emplace_back@AAPAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXAAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@ABV612@AAI@Z + ??$emplace_back@ABQAUCordRep@cord_internal@absl@@@?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QAEAAPAUCordRep@cord_internal@1@ABQAU231@@Z + ??$emplace_back@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@ABQAV34@@Z + ??$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCordzHandle@cord_internal@absl@@ABQAV345@@Z + ??$emplace_back@ABQAVLogSink@absl@@@?$InlinedVector@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@absl@@QAEAAPAVLogSink@1@ABQAV21@@Z + ??$emplace_back@ABQAVLogSink@absl@@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVLogSink@absl@@ABQAV34@@Z + ??$emplace_back@ABQBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@ABQBV34@@Z + ??$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCordzHandle@cord_internal@absl@@ABQBV345@@Z + ??$emplace_back@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@ABU3456@@Z + ??$emplace_back@ABUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@ABU34@@Z + ??$emplace_back@HVcrc32c_t@absl@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAH$$QAVcrc32c_t@6@@Z + ??$emplace_back@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@$$QAPBV34@@Z + ??$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU3456@@Z + ??$emplace_back@UPayload@status_internal@absl@@@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAEAAUPayload@status_internal@1@$$QAU231@@Z + ??$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QAV312@@Z + ??$emplace_back@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@$$QAW4Source@34@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$emplace_front@AAPAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXAAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$end@V?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@01@AAV?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@01@@Z + ??$end@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@YA?AV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@01@AAV?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@01@@Z + ??$find@V?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@PAVLogSink@absl@@@__Cr@std@@YA?AV?$__wrap_iter@PAPAVLogSink@absl@@@01@V201@0ABQAVLogSink@absl@@@Z + ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE?AViterator@012@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QBE?AVconst_iterator@012@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$find_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAE?AViterator@012@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$find_or_prepare_insert@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IAE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_or_prepare_insert_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_or_prepare_insert_small@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_small@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAE?AViterator@012@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$forward_as_tuple@ABQAVCommandLineFlag@absl@@@__Cr@std@@YA?AV?$tuple@ABQAVCommandLineFlag@absl@@@01@ABQAVCommandLineFlag@absl@@@Z + ??$forward_as_tuple@PAVCommandLineFlag@absl@@@__Cr@std@@YA?AV?$tuple@$$QAPAVCommandLineFlag@absl@@@01@$$QAPAVCommandLineFlag@absl@@@Z + ??$get@$00@?$CompressedTuple@IV?$allocator@D@__Cr@std@@@container_internal@absl@@QGAEAAV?$allocator@D@__Cr@std@@XZ + ??$get@$00@?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@I@container_internal@absl@@QGAEAAIXZ + ??$get@$00@?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@I@container_internal@absl@@QGBEABIXZ + ??$get@$00@?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@absl@@@container_internal@absl@@QGAEAAPAPAUCordRep@cord_internal@2@XZ + ??$get@$00@?$CompressedTuple@V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@container_internal@absl@@QGAEAAIXZ + ??$get@$00@?$CompressedTuple@V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@container_internal@absl@@QGBEABIXZ + ??$get@$00@?$CompressedTuple@V?$allocator@PAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@absl@@@container_internal@absl@@QGAEAAPAPAVLogSink@2@XZ + ??$get@$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@container_internal@absl@@QGAEAAIXZ + ??$get@$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@container_internal@absl@@QGBEABIXZ + ??$get@$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@absl@@@container_internal@absl@@QGAEAAPAUPayload@status_internal@2@XZ + ??$get@$00@?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I@container_internal@absl@@QGAEAAIXZ + ??$get@$00@?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I@container_internal@absl@@QGBEABIXZ + ??$get@$00@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QGAEAAUStringHash@12@XZ + ??$get@$00@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QGBEABUStringHash@12@XZ + ??$get@$00AAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@YAAA_NAAV?$tuple@AAPAVCommandLineFlag@absl@@AA_N@01@@Z + ??$get@$00AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@YAAAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@AAV?$tuple@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@23@@01@@Z + ??$get@$00PAVCommandLineFlag@absl@@_N@__Cr@std@@YAAA_NAAV?$tuple@PAVCommandLineFlag@absl@@_N@01@@Z + ??$get@$01@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QGBEABUStringEq@12@XZ + ??$get@$02@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QGAEAAV?$allocator@D@__Cr@std@@XZ + ??$get@$0A@$$QAPAVCommandLineFlag@absl@@@__Cr@std@@YAAAPAVCommandLineFlag@absl@@AAV?$tuple@$$QAPAVCommandLineFlag@absl@@@01@@Z + ??$get@$0A@@?$CompressedTuple@IV?$allocator@D@__Cr@std@@@container_internal@absl@@QGBEABIXZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@I@container_internal@absl@@QGAEAAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@absl@@@container_internal@absl@@QGAEAAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@container_internal@absl@@QGAEAAV?$allocator@PAVLogSink@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@PAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@absl@@@container_internal@absl@@QGAEAAV?$allocator@PAVLogSink@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@container_internal@absl@@QGAEAAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@container_internal@absl@@QGBEABV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@absl@@@container_internal@absl@@QGAEAAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I@container_internal@absl@@QGAEAAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@XZ + ??$get@$0A@@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QGAEAAVCommonFields@12@XZ + ??$get@$0A@@?$CompressedTuple@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@container_internal@absl@@QGBEABVCommonFields@12@XZ + ??$get@$0A@AAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@YAAAPAVCommandLineFlag@absl@@AAV?$tuple@AAPAVCommandLineFlag@absl@@AA_N@01@@Z + ??$get@$0A@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@YAAAUFindInfo@container_internal@absl@@AAV?$tuple@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@23@@01@@Z + ??$get@$0A@ABQAVCommandLineFlag@absl@@@__Cr@std@@YAABQAVCommandLineFlag@absl@@AAV?$tuple@ABQAVCommandLineFlag@absl@@@01@@Z + ??$get@$0A@PAVCommandLineFlag@absl@@_N@__Cr@std@@YA$$QAPAVCommandLineFlag@absl@@$$QAV?$tuple@PAVCommandLineFlag@absl@@_N@01@@Z + ??$get@$0A@PAVCommandLineFlag@absl@@_N@__Cr@std@@YAAAPAVCommandLineFlag@absl@@AAV?$tuple@PAVCommandLineFlag@absl@@_N@01@@Z + ??$hash@U?$Hash@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@hash_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@HashWithSeed@hash_internal@absl@@QBEIABU?$Hash@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$hash@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@HashWithSeed@hash_internal@absl@@QBEIABUStringHash@container_internal@2@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$hash@V?$tuple@ABI@__Cr@std@@@MixingHashState@hash_internal@absl@@SAIABV?$tuple@ABI@__Cr@std@@@Z + ??$hash@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@@MixingHashState@hash_internal@absl@@SAIABV?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@@Z + ??$hash_bytes@VMixingHashState@hash_internal@absl@@H$0A@@hash_internal@absl@@YA?AVMixingHashState@01@V201@ABH@Z + ??$hash_bytes@VMixingHashState@hash_internal@absl@@I$0A@@hash_internal@absl@@YA?AVMixingHashState@01@V201@ABI@Z + ??$hash_range_or_bytes@VMixingHashState@hash_internal@absl@@D@hash_internal@absl@@YA?AVMixingHashState@01@V201@PBDI@Z + ??$hash_tuple@VMixingHashState@hash_internal@absl@@V?$tuple@ABI@__Cr@std@@$0A@@hash_internal@absl@@YA?AVMixingHashState@01@V201@ABV?$tuple@ABI@__Cr@std@@U?$integer_sequence@I$0A@@45@@Z + ??$hash_tuple@VMixingHashState@hash_internal@absl@@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@$0A@$00@hash_internal@absl@@YA?AVMixingHashState@01@V201@ABV?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@U?$integer_sequence@I$0A@$00@45@@Z + ??$hash_with_seed@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@MixingHashState@hash_internal@absl@@SAIABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$hash_with_seed@V?$tuple@ABI@__Cr@std@@$0A@@MixingHashState@hash_internal@absl@@SAIABV?$tuple@ABI@__Cr@std@@I@Z + ??$hash_with_seed@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@$0A@@MixingHashState@hash_internal@absl@@SAIABV?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@I@Z + ??$insert@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@45@@Z + ??$insert@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@$0A@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__wrap_iter@PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@12@1@Z + ??$invoke@AAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@I@__Cr@std@@YAIAAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@$$QAI@Z + ??$invoke@P8FlagImpl@flags_internal@absl@@AEXXZPAV123@@__Cr@std@@YAX$$QAP8FlagImpl@flags_internal@absl@@AEXXZ$$QAPAV234@@Z + ??$iter_swap@AAPAPAVCommandLineFlag@absl@@AAPAPAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAAPAPAVCommandLineFlag@absl@@0@Z + ??$iter_swap@AAPAPAVCommandLineFlag@absl@@PAPAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAAPAPAVCommandLineFlag@absl@@$$QAPAPAV34@@Z + ??$iter_swap@AAPAPBVCommandLineFlag@absl@@AAPAPBV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAAPAPBVCommandLineFlag@absl@@0@Z + ??$iter_swap@AAPAPBVCommandLineFlag@absl@@PAPBV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAAPAPBVCommandLineFlag@absl@@$$QAPAPBV34@@Z + ??$iter_swap@PAPAVCommandLineFlag@absl@@PAPAV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAX$$QAPAPAVCommandLineFlag@absl@@0@Z + ??$iter_swap@PAPAVCommandLineFlag@absl@@PAPAV12@@__Cr@std@@YAXPAPAVCommandLineFlag@absl@@0@Z + ??$iter_swap@PAPBVCommandLineFlag@absl@@PAPBV12@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAX$$QAPAPBVCommandLineFlag@absl@@0@Z + ??$iter_swap@PAPBVCommandLineFlag@absl@@PAPBV12@@__Cr@std@@YAXPAPBVCommandLineFlag@absl@@0@Z + ??$launder@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@01@PAU201@@Z + ??$launder@UList@CordzInfo@cord_internal@absl@@@__Cr@std@@YAPAUList@CordzInfo@cord_internal@absl@@PAU2345@@Z + ??$launder@URefcountedRep@CrcCordState@crc_internal@absl@@@__Cr@std@@YAPAURefcountedRep@CrcCordState@crc_internal@absl@@PAU2345@@Z + ??$launder@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@__Cr@std@@YAPAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@PAV234@@Z + ??$launder@VFlagRegistry@flags_internal@absl@@@__Cr@std@@YAPAVFlagRegistry@flags_internal@absl@@PAV234@@Z + ??$launder@VMutex@absl@@@__Cr@std@@YAPAVMutex@absl@@PAV23@@Z + ??$lower_bound@PBUTransition@cctz@time_internal@absl@@U1234@UByUnixTime@1234@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@UByUnixTime@2345@@Z + ??$make_pair@AAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@AAPAPAPBV12345@@__Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@AAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$make_pair@AAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@__Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@AAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@$$QAPAPAPBV34567@@Z + ??$make_pair@AAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@AAPAPAU1234@@__Cr@std@@YA?AU?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@01@AAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$make_pair@AAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@__Cr@std@@YA?AU?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@01@AAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAPAPAU3456@@Z + ??$make_pair@AAPAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@YA?AU?$pair@PAPAVCommandLineFlag@absl@@_N@01@AAPAPAVCommandLineFlag@absl@@AA_N@Z + ??$make_pair@AAPAPAVLogSink@absl@@PAPAV12@@__Cr@std@@YA?AU?$pair@PAPAVLogSink@absl@@PAPAV12@@01@AAPAPAVLogSink@absl@@$$QAPAPAV34@@Z + ??$make_pair@AAPAPBVCommandLineFlag@absl@@AA_N@__Cr@std@@YA?AU?$pair@PAPBVCommandLineFlag@absl@@_N@01@AAPAPBVCommandLineFlag@absl@@AA_N@Z + ??$make_pair@AAPAUTransition@cctz@time_internal@absl@@AAPAU1234@@__Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@AAPAUTransition@cctz@time_internal@absl@@0@Z + ??$make_pair@AAPAUTransition@cctz@time_internal@absl@@PAU1234@@__Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@AAPAUTransition@cctz@time_internal@absl@@$$QAPAU3456@@Z + ??$make_pair@AAPAUTransitionType@cctz@time_internal@absl@@AAPAU1234@@__Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@AAPAUTransitionType@cctz@time_internal@absl@@0@Z + ??$make_pair@AAPAUTransitionType@cctz@time_internal@absl@@PAU1234@@__Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@AAPAUTransitionType@cctz@time_internal@absl@@$$QAPAU3456@@Z + ??$make_pair@AAPBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@__Cr@std@@YA?AU?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@01@AAPBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAPAU3456@@Z + ??$make_pair@AAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@01@AAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@$$QAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@@Z + ??$make_pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@__Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@$$QAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$make_pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@__Cr@std@@YA?AU?$pair@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@01@$$QAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$make_pair@PAPAVLogSink@absl@@PAPAV12@@__Cr@std@@YA?AU?$pair@PAPAVLogSink@absl@@PAPAV12@@01@$$QAPAPAVLogSink@absl@@0@Z + ??$make_pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@__Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@$$QAPAUTransition@cctz@time_internal@absl@@0@Z + ??$make_pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@__Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@$$QAPAUTransitionType@cctz@time_internal@absl@@0@Z + ??$make_pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@__Cr@std@@YA?AU?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@@01@$$QAPBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAPAU3456@@Z + ??$make_pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@YA?AU?$pair@PBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@01@$$QAPBUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@@Z + ??$make_pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__Cr@std@@YA?AU?$pair@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@01@$$QAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@$$QAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@@Z + ??$make_tuple@AAPAVCommandLineFlag@absl@@AA_N@__Cr@std@@YA?AV?$tuple@PAVCommandLineFlag@absl@@_N@01@AAPAVCommandLineFlag@absl@@AA_N@Z + ??$make_unique@ULogMessageData@LogMessage@log_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAHAAW4LogSeverity@4@VTime@4@$0A@@__Cr@std@@YA?AV?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@01@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AAHAAW4LogSeverity@absl@@$$QAVTime@5@@Z + ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@$$V$0A@@__Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@XZ + ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@AAV12@$0A@@__Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@01@AAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z + ??$make_unique@VFallbackCrcMemcpyEngine@crc_internal@absl@@$$V$0A@@__Cr@std@@YA?AV?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@01@XZ + ??$make_unique@VFlagState@flags_internal@absl@@AAVFlagImpl@23@AAPAXAA_NAA_N_J$0A@@__Cr@std@@YA?AV?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@01@AAVFlagImpl@flags_internal@absl@@AAPAXAA_N2$$QA_J@Z + ??$make_unique@VFlagState@flags_internal@absl@@AAVFlagImpl@23@PAXAA_NAA_N_J$0A@@__Cr@std@@YA?AV?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@01@AAVFlagImpl@flags_internal@absl@@$$QAPAXAA_N2$$QA_J@Z + ??$make_unique@VFlagState@flags_internal@absl@@AAVFlagImpl@23@_JAA_NAA_N_J$0A@@__Cr@std@@YA?AV?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@01@AAVFlagImpl@flags_internal@absl@@$$QA_JAA_N21@Z + ??$max@VDuration@absl@@@__Cr@std@@YAABVDuration@absl@@ABV23@0@Z + ??$max@VDuration@absl@@U?$__less@XX@__Cr@std@@@__Cr@std@@YAABVDuration@absl@@ABV23@0U?$__less@XX@01@@Z + ??$max_size@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@PAUCordRep@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@PAVCommandLineFlag@absl@@@12@@Z + ??$max_size@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PAVLogSink@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@PAVLogSink@absl@@@12@@Z + ??$max_size@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@PBVCommandLineFlag@absl@@@12@@Z + ??$max_size@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??$max_size@V?$allocator@U?$AlignedType@$03@container_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$AlignedType@$03@container_internal@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@U?$AlignedType@$03@container_internal@absl@@@12@@Z + ??$max_size@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@23@PBXPAX2@Z@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@23@PBXPAX2@Z@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@23@PBXPAX2@Z@@12@@Z + ??$max_size@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@UPayload@status_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??$max_size@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??$max_size@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??$max_size@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??$max_size@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAIABV?$allocator@VFormatArgImpl@str_format_internal@absl@@@12@@Z + ??$min@VDuration@absl@@@__Cr@std@@YAABVDuration@absl@@ABV23@0@Z + ??$min@VDuration@absl@@U?$__less@XX@__Cr@std@@@__Cr@std@@YAABVDuration@absl@@ABV23@0U?$__less@XX@01@@Z + ??$move@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@00@Z + ??$move@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@__Cr@std@@YAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU2345@00@Z + ??$move@PAPAVLogSink@absl@@PAPAV12@@__Cr@std@@YAPAPAVLogSink@absl@@PAPAV23@00@Z + ??$move@PAUTransition@cctz@time_internal@absl@@PAU1234@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@00@Z + ??$move@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@__Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@00@Z + ??$move_backward@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@__Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@00@Z + ??$move_backward@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@__Cr@std@@YAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU2345@00@Z + ??$move_backward@PAUTransition@cctz@time_internal@absl@@PAU1234@@__Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@00@Z + ??$move_backward@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@__Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@00@Z + ??$next@AAPBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPBUTransition@cctz@time_internal@absl@@AAPBU3456@H@Z + ??$next@PAPAVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPAPAVCommandLineFlag@absl@@PAPAV34@0@Z + ??$next@PAPBVCommandLineFlag@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPAPBVCommandLineFlag@absl@@PAPBV34@0@Z + ??$next@PBUTransition@cctz@time_internal@absl@@$0A@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@H@Z + ??$next@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@$0A@@__Cr@std@@YA?AV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@01@V201@H@Z + ??$reset@PAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@$0A@@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@@Z + ??$reset@PAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@$0A@@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QAEXIV@?0???$IntegerToString@H@strings_internal@absl@@YA?AV012@H@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QAEXIV@?0???$IntegerToString@I@strings_internal@absl@@YA?AV012@I@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QAEXIV@?0???$IntegerToString@J@strings_internal@absl@@YA?AV012@J@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QAEXIV@?0???$IntegerToString@K@strings_internal@absl@@YA?AV012@K@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QAEXIV@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV012@_J@Z@@Z + ??$resize_and_overwrite@V@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QAEXIV@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV012@_K@Z@@Z + ??$resize_and_overwrite@V@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@56@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@UNoFormatter@23@@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QAEXIV@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV012@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@UNoFormatter@45@@Z@@Z + ??$safe_strtoi_base@H@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAHH@Z + ??$safe_strtoi_base@I@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAIH@Z + ??$safe_strtoi_base@J@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAJH@Z + ??$safe_strtoi_base@K@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAKH@Z + ??$safe_strtoi_base@_J@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_JH@Z + ??$safe_strtoi_base@_K@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_KH@Z + ??$swap@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@YAXAAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ??$swap@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@YAXAAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??$swap@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@YAXAAPAUTransition@cctz@time_internal@absl@@0@Z + ??$swap@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@YAXAAPAUTransitionType@cctz@time_internal@absl@@0@Z + ??$swap@PAUUnrecognizedFlag@absl@@@__Cr@std@@YAXAAPAUUnrecognizedFlag@absl@@0@Z + ??$swap@PAVCommandLineFlag@absl@@@__Cr@std@@YAXAAPAVCommandLineFlag@absl@@0@Z + ??$swap@PBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@YAXAAPBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@0@Z + ??$swap@PBVCommandLineFlag@absl@@@__Cr@std@@YAXAAPBVCommandLineFlag@absl@@0@Z + ??$swap@PBW4ctrl_t@container_internal@absl@@@__Cr@std@@YAXAAPBW4ctrl_t@container_internal@absl@@0@Z + ??$swap@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@YAXAAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@01@0@Z + ??$swap@UViableSubstitution@strings_internal@absl@@@__Cr@std@@YAXAAUViableSubstitution@strings_internal@absl@@0@Z + ??$tie@PAVCommandLineFlag@absl@@_N@__Cr@std@@YA?AV?$tuple@AAPAVCommandLineFlag@absl@@AA_N@01@AAPAVCommandLineFlag@absl@@AA_N@Z + ??$tie@UFindInfo@container_internal@absl@@V?$NonIterableBitMask@G$0BA@$0A@@23@@__Cr@std@@YA?AV?$tuple@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@23@@01@AAUFindInfo@container_internal@absl@@AAV?$NonIterableBitMask@G$0BA@$0A@@45@@Z + ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@1@Z + ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@SAXPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@1@Z + ??$transfer@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SA?A_PPAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@1@Z + ??$transfer_impl@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@@?$common_policy_traits@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@X@container_internal@absl@@CA?AU?$integral_constant@_N$00@__Cr@std@@PAV?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@45@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@12@1URank2@012@@Z + ??$upper_bound@PBUTransition@cctz@time_internal@absl@@U1234@UByCivilTime@1234@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@UByCivilTime@2345@@Z + ??$upper_bound@PBUTransition@cctz@time_internal@absl@@U1234@UByUnixTime@1234@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@UByUnixTime@2345@@Z + ??$visit@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@AAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@X@__Cr@std@@YA?A_T$$QAUBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@45@@Z@AAV?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@01@@Z + ??0?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@Z + ??0?$AllocationTransaction@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@@Z + ??0?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@AAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@Z + ??0?$BigUnsigned@$03@strings_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$BigUnsigned@$03@strings_internal@absl@@QAE@XZ + ??0?$BigUnsigned@$03@strings_internal@absl@@QAE@_K@Z + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QAE@XZ + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QAE@_K@Z + ??0?$BitMask@G$0BA@$0A@$0A@@container_internal@absl@@QAE@G@Z + ??0?$BitMask@_K$07$02$0A@@container_internal@absl@@QAE@_K@Z + ??0?$BoundedUtf8LengthSequence@$0BAA@@debugging_internal@absl@@QAE@XZ + ??0?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QAE@IABV?$allocator@D@__Cr@std@@@Z + ??0?$FlagRegistrar@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$00@flags_internal@absl@@QAE@AAV?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@12@PBD@Z + ??0?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@str_format_internal@absl@@QAE@PBD@Z + ??0?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@str_format_internal@absl@@QAE@PBD@Z + ??0?$FormatSpecTemplate@$0JPPPL@$0JPOAA@@str_format_internal@absl@@QAE@PBD@Z + ??0?$FormatSpecTemplate@$0JPPPL@@str_format_internal@absl@@QAE@PBD@Z + ??0?$HashElement@UStringHash@container_internal@absl@@$00@container_internal@absl@@QAE@ABUStringHash@12@I@Z + ??0?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@QAE@ABUStringHash@12@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QAE@XZ + ??0?$InlinedVector@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@absl@@QAE@XZ + ??0?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAE@ABV01@@Z + ??0?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAE@ABV01@ABV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@Z + ??0?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAE@XZ + ??0?$IteratorValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@V?$move_iterator@PAPAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QAE@ABV?$move_iterator@PAPAUCordRep@cord_internal@absl@@@__Cr@std@@@Z + ??0?$IteratorValueAdapter@V?$allocator@PAVLogSink@absl@@@__Cr@std@@V?$move_iterator@PAPAVLogSink@absl@@@23@@inlined_vector_internal@absl@@QAE@ABV?$move_iterator@PAPAVLogSink@absl@@@__Cr@std@@@Z + ??0?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@QAE@ABQBUPayload@status_internal@2@@Z + ??0?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QAE@ABV?$move_iterator@PAUPayload@status_internal@absl@@@__Cr@std@@@Z + ??0?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@QAE@ABQBVFormatArgImpl@str_format_internal@2@@Z + ??0?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@QAE@G@Z + ??0?$NonIterableBitMask@_K$07$02@container_internal@absl@@QAE@_K@Z + ??0?$ProbedItemImpl@I$0CA@@container_internal@absl@@QAE@EII@Z + ??0?$ProbedItemImpl@_K$0EA@@container_internal@absl@@QAE@EII@Z + ??0?$ProbedItemImpl@_K$0HK@@container_internal@absl@@QAE@EII@Z + ??0?$Sample@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QAE@XZ + ??0?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QAE@XZ + ??0?$Span@$$CBD@absl@@QAE@PBDI@Z + ??0?$Span@$$CBD@absl@@QAE@XZ + ??0?$Span@$$CBI@absl@@QAE@PBII@Z + ??0?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QAE@PBVFormatArgImpl@str_format_internal@1@I@Z + ??0?$Span@D@absl@@QAE@PADI@Z + ??0?$Span@D@absl@@QAE@XZ + ??0?$Span@I@absl@@QAE@PAII@Z + ??0?$Span@PAVLogSink@absl@@@absl@@QAE@PAPAVLogSink@1@I@Z + ??0?$Span@QAUCordRep@cord_internal@absl@@@absl@@QAE@PBQAUCordRep@cord_internal@1@I@Z + ??0?$Span@QAX@absl@@QAE@PBQAXI@Z + ??0?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QAE@W4State@012@PBV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QAE@W4State@012@PBV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QAE@W4State@012@PBV?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VByAnyChar@2@UAllowEmpty@2@@Z + ??0?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VByAnyChar@2@USkipEmpty@2@@Z + ??0?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VByChar@2@UAllowEmpty@2@@Z + ??0?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@XZ + ??0?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@XZ + ??0?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@ABV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@Z + ??0?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@XZ + ??0?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@ABV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@Z + ??0?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@__Cr@std@@QAE@AAV?$allocator@UUnrecognizedFlag@absl@@@12@AAPAUUnrecognizedFlag@absl@@1@Z + ??0?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__copy_impl@__Cr@std@@QAE@AAV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@Z + ??0?$__allocation_result@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@__Cr@std@@QAE@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z + ??0?$__allocation_result@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@__Cr@std@@QAE@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ??0?$__allocation_result@PAPAVCommandLineFlag@absl@@I@__Cr@std@@QAE@PAPAVCommandLineFlag@absl@@I@Z + ??0?$__allocation_result@PAPAVCordzHandle@cord_internal@absl@@I@__Cr@std@@QAE@PAPAVCordzHandle@cord_internal@absl@@I@Z + ??0?$__allocation_result@PAPAVLogSink@absl@@I@__Cr@std@@QAE@PAPAVLogSink@absl@@I@Z + ??0?$__allocation_result@PAPBVCommandLineFlag@absl@@I@__Cr@std@@QAE@PAPBVCommandLineFlag@absl@@I@Z + ??0?$__allocation_result@PAPBVCordzHandle@cord_internal@absl@@I@__Cr@std@@QAE@PAPBVCordzHandle@cord_internal@absl@@I@Z + ??0?$__allocation_result@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@I@__Cr@std@@QAE@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@I@Z + ??0?$__allocation_result@PAUTransition@cctz@time_internal@absl@@I@__Cr@std@@QAE@PAUTransition@cctz@time_internal@absl@@I@Z + ??0?$__allocation_result@PAUTransitionType@cctz@time_internal@absl@@I@__Cr@std@@QAE@PAUTransitionType@cctz@time_internal@absl@@I@Z + ??0?$__allocation_result@PAUUnrecognizedFlag@absl@@I@__Cr@std@@QAE@PAUUnrecognizedFlag@absl@@I@Z + ??0?$__allocation_result@PAUViableSubstitution@strings_internal@absl@@I@__Cr@std@@QAE@PAUViableSubstitution@strings_internal@absl@@I@Z + ??0?$__allocation_result@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@I@__Cr@std@@QAE@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@I@Z + ??0?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@12@I@Z + ??0?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@12@I@Z + ??0?$__atomic_base@P6AXABUHashtablezInfo@container_internal@absl@@@Z$0A@@__Cr@std@@QAE@P6AXABUHashtablezInfo@container_internal@absl@@@Z@Z + ??0?$__atomic_base@PAUHashtablezInfo@container_internal@absl@@$0A@@__Cr@std@@QAE@PAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__atomic_base@PAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@QAE@PAVCordzHandle@cord_internal@absl@@@Z + ??0?$__atomic_base@PAVCordzInfo@cord_internal@absl@@$0A@@__Cr@std@@QAE@PAVCordzInfo@cord_internal@absl@@@Z + ??0?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__cxx_atomic_base_impl@P6AXABUHashtablezInfo@container_internal@absl@@@Z@__Cr@std@@QAE@P6AXABUHashtablezInfo@container_internal@absl@@@Z@Z + ??0?$__cxx_atomic_base_impl@PAUHashtablezInfo@container_internal@absl@@@__Cr@std@@QAE@PAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__cxx_atomic_base_impl@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@QAE@PAVCordzHandle@cord_internal@absl@@@Z + ??0?$__cxx_atomic_base_impl@PAVCordzInfo@cord_internal@absl@@@__Cr@std@@QAE@PAVCordzInfo@cord_internal@absl@@@Z + ??0?$__cxx_atomic_impl@P6AXABUHashtablezInfo@container_internal@absl@@@ZU?$__cxx_atomic_base_impl@P6AXABUHashtablezInfo@container_internal@absl@@@Z@__Cr@std@@@__Cr@std@@QAE@P6AXABUHashtablezInfo@container_internal@absl@@@Z@Z + ??0?$__cxx_atomic_impl@PAUHashtablezInfo@container_internal@absl@@U?$__cxx_atomic_base_impl@PAUHashtablezInfo@container_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__cxx_atomic_impl@PAVCordzHandle@cord_internal@absl@@U?$__cxx_atomic_base_impl@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAVCordzHandle@cord_internal@absl@@@Z + ??0?$__cxx_atomic_impl@PAVCordzInfo@cord_internal@absl@@U?$__cxx_atomic_base_impl@PAVCordzInfo@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAVCordzInfo@cord_internal@absl@@@Z + ??0?$__deque_iterator@PBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@AAPBV12345@PAPAPBV12345@H$0A@@__Cr@std@@AAE@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV34567@@Z + ??0?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@AAE@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU3456@@Z + ??0?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@AAE@PBQBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU3456@@Z + ??0?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z@@__Cr@std@@QAE@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@12@AAEXI@Z@@Z + ??0?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@12@@Z + ??0?$__hash_const_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@QAE@ABV?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@@Z + ??0?$__hash_const_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAE@ABV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@@Z + ??0?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@AAE@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@@Z + ??0?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@AAE@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@@Z + ??0?$__hash_map_const_iterator@V?$__hash_const_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@V?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@@Z + ??0?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@QAE@PAU012@@Z + ??0?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAE@PAU012@@Z + ??0?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@_N@Z + ??0?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@_N@Z + ??0?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE@XZ + ??0?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??0?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@X@__Cr@std@@QAE@ABV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@12@@Z + ??0?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@X@__Cr@std@@QAE@ABV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@12@@Z + ??0?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@@__Cr@std@@QAE@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@12@@Z + ??0?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@@__Cr@std@@QAE@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QAE@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@QAE@XZ + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QAE@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@@Z + ??0?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@U?$AlignedType@$03@container_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@23@PBXPAX2@Z@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__non_trivial_if@$00V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$__optional_copy_assign_base@VCord@absl@@$0A@@__Cr@std@@QAE@XZ + ??0?$__optional_copy_base@VCord@absl@@$0A@@__Cr@std@@QAE@XZ + ??0?$__optional_destruct_base@VCord@absl@@$0A@@__Cr@std@@QAE@XZ + ??0?$__optional_move_assign_base@VCord@absl@@$0A@@__Cr@std@@QAE@XZ + ??0?$__optional_move_base@VCord@absl@@$0A@@__Cr@std@@QAE@XZ + ??0?$__optional_storage_base@VCord@absl@@$0A@@__Cr@std@@QAE@XZ + ??0?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAE@IIAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAE@XZ + ??0?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@IIAAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??0?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??0?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@IIAAV?$allocator@PAVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAE@IIAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@IIAAV?$allocator@PAVLogSink@absl@@@12@@Z + ??0?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@IIAAV?$allocator@PBVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAE@IIAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@IIAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@IIAAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@IIAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@IIAAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??0?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAE@IIAAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??0?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QAE@IIAAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAE@XZ + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAE@XZ + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@PAVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@PAVLogSink@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@PBVCommandLineFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@UUnrecognizedFlag@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAE@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z + ??0?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE@ABV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@12@@Z + ??0?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE@ABV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@12@@Z + ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@AAE@PAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@12@@Z + ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@AAE@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@12@@Z + ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@AAE@PAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@12@@Z + ??0?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@AAE@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@12@@Z + ??0?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@12@_N@Z + ??0?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@12@_N@Z + ??0?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??0?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??0?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@AAE@PAPAVCommandLineFlag@absl@@@Z + ??0?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@__Cr@std@@AAE@PAPAVCordzHandle@cord_internal@absl@@@Z + ??0?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@AAE@PAPAVLogSink@absl@@@Z + ??0?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@AAE@PAPBVCommandLineFlag@absl@@@Z + ??0?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@AAE@PAUTransition@cctz@time_internal@absl@@@Z + ??0?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@AAE@PAUTransitionType@cctz@time_internal@absl@@@Z + ??0?$__wrap_iter@PAUUnrecognizedFlag@absl@@@__Cr@std@@AAE@PAUUnrecognizedFlag@absl@@@Z + ??0?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@AAE@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@ABV567@@Z@@Z + ??0?$__wrap_iter@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@AAE@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@@Z + ??0?$__wrap_iter@PBQAVLogSink@absl@@@__Cr@std@@AAE@PBQAVLogSink@absl@@@Z + ??0?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@AAE@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ??0?$__wrap_iter@PBUUnrecognizedFlag@absl@@@__Cr@std@@AAE@PBUUnrecognizedFlag@absl@@@Z + ??0?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@PAVLogSink@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@23@PBXPAX2@Z@@__Cr@std@@QAE@XZ + ??0?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@UPayload@status_internal@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@QAE@XZ + ??0?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@QAE@XZ + ??0?$atomic@P6AXABUHashtablezInfo@container_internal@absl@@@Z@__Cr@std@@QAE@P6AXABUHashtablezInfo@container_internal@absl@@@Z@Z + ??0?$atomic@PAUHashtablezInfo@container_internal@absl@@@__Cr@std@@QAE@PAUHashtablezInfo@container_internal@absl@@@Z + ??0?$atomic@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@QAE@PAVCordzHandle@cord_internal@absl@@@Z + ??0?$atomic@PAVCordzInfo@cord_internal@absl@@@__Cr@std@@QAE@PAVCordzInfo@cord_internal@absl@@@Z + ??0?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AAE@Ufields@1234@@Z + ??0?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@_J00000@Z + ??0?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AAE@Ufields@1234@@Z + ??0?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@XZ + ??0?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@_J00000@Z + ??0?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AAE@Ufields@1234@@Z + ??0?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AAE@Ufields@1234@@Z + ??0?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@XZ + ??0?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@_J00000@Z + ??0?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AAE@Ufields@1234@@Z + ??0?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AAE@Ufields@1234@@Z + ??0?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@XZ + ??0?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@_J00000@Z + ??0?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AAE@Ufields@1234@@Z + ??0?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AAE@Ufields@1234@@Z + ??0?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@XZ + ??0?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@_J00000@Z + ??0?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AAE@Ufields@1234@@Z + ??0?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@XZ + ??0?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@_J00000@Z + ??0?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AAE@Ufields@1234@@Z + ??0?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@XZ + ??0?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@_J00000@Z + ??0?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AAE@Ufields@1234@@Z + ??0?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@_J00000@Z + ??0?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AAE@Ufields@1234@@Z + ??0?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@XZ + ??0?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@_J00000@Z + ??0?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@23@@absl@@QAE@XZ + ??0?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??0?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??0?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@QAE@XZ + ??0?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QAE@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??0?$move_iterator@PAPAUCordRep@cord_internal@absl@@@__Cr@std@@QAE@PAPAUCordRep@cord_internal@absl@@@Z + ??0?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QAE@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??0?$move_iterator@PAPAVLogSink@absl@@@__Cr@std@@QAE@PAPAVLogSink@absl@@@Z + ??0?$move_iterator@PAUPayload@status_internal@absl@@@__Cr@std@@QAE@PAUPayload@status_internal@absl@@@Z + ??0?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@QAE@PAUTransition@cctz@time_internal@absl@@@Z + ??0?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QAE@PAUTransitionType@cctz@time_internal@absl@@@Z + ??0?$optional@VCord@absl@@@__Cr@std@@QAE@Unullopt_t@12@@Z + ??0?$probe_seq@$0BA@@container_internal@absl@@QAE@II@Z + ??0?$raw_hash_map@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE@XZ + ??0?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE@XZ + ??0?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QAE@$$QAV012@@Z + ??0?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@$$QAV012@@Z + ??0?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QAE@$$QAV012@@Z + ??0?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??0?$unordered_set@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE@XZ + ??0?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??0?$vector@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??0?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??0AlphaNum@absl@@QAE@H@Z + ??0AlphaNum@absl@@QAE@I@Z + ??0AlphaNum@absl@@QAE@PBD@Z + ??0AlphaNum@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0AlphaNum@absl@@QAE@_J@Z + ??0Arena@LowLevelAlloc@base_internal@absl@@QAE@I@Z + ??0Arg@substitute_internal@absl@@QAE@PBX@Z + ??0Arg@substitute_internal@absl@@QAE@UDec@2@@Z + ??0Arg@substitute_internal@absl@@QAE@UHex@2@@Z + ??0BadStatusOrAccess@absl@@QAE@$$QAV01@@Z + ??0BadStatusOrAccess@absl@@QAE@ABV01@@Z + ??0BadStatusOrAccess@absl@@QAE@VStatus@1@@Z + ??0BestHints@flags_internal@absl@@QAE@E@Z + ??0BlockingCounter@absl@@QAE@H@Z + ??0BoundConversion@str_format_internal@absl@@QAE@XZ + ??0Breakdown@Time@absl@@QAE@XZ + ??0BufferRawSink@str_format_internal@absl@@QAE@PADI@Z + ??0ByAnyChar@absl@@QAE@$$QAV01@@Z + ??0ByAnyChar@absl@@QAE@ABV01@@Z + ??0ByAnyChar@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0ByChar@absl@@QAE@D@Z + ??0ByLength@absl@@QAE@H@Z + ??0ByString@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0CRC32@crc_internal@absl@@QAE@XZ + ??0CRC@crc_internal@absl@@IAE@XZ + ??0CRCImpl@crc_internal@absl@@QAE@XZ + ??0CharIterator@Cord@absl@@AAE@PBV12@@Z + ??0CharIterator@Cord@absl@@QAE@XZ + ??0CheckOpMessageBuilder@log_internal@absl@@QAE@PBD@Z + ??0ChunkIterator@Cord@absl@@AAE@PAUCordRep@cord_internal@2@@Z + ??0ChunkIterator@Cord@absl@@AAE@PBV12@@Z + ??0ChunkIterator@Cord@absl@@QAE@XZ + ??0ChunkRange@Cord@absl@@QAE@PBV12@@Z + ??0CivilInfo@TimeZone@absl@@QAE@XZ + ??0CommandLineFlag@absl@@QAE@XZ + ??0CommonFields@container_internal@absl@@QAE@Unon_soo_tag_t@12@@Z + ??0CommonFields@container_internal@absl@@QAE@Usoo_tag_t@12@@Z + ??0Condition@absl@@QAE@P6A_NPAX@Z0@Z + ??0Condition@absl@@QAE@PB_N@Z + ??0ConvertibleToStringView@strings_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0Cord@absl@@AAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@1@@Z + ??0Cord@absl@@QAE@$$QAV01@@Z + ??0Cord@absl@@QAE@ABV01@@Z + ??0Cord@absl@@QAE@XZ + ??0CordBuffer@absl@@AAE@PAUCordRepFlat@cord_internal@1@@Z + ??0CordBuffer@absl@@QAE@XZ + ??0CordRep@cord_internal@absl@@QAE@XZ + ??0CordRepBtree@cord_internal@absl@@AAE@XZ + ??0CordRepBtreeNavigator@cord_internal@absl@@QAE@XZ + ??0CordRepBtreeReader@cord_internal@absl@@QAE@XZ + ??0CordRepCrc@cord_internal@absl@@QAE@XZ + ??0CordRepExternal@cord_internal@absl@@QAE@XZ + ??0CordRepFlat@cord_internal@absl@@QAE@XZ + ??0CordRepSubstring@cord_internal@absl@@QAE@XZ + ??0CordzHandle@cord_internal@absl@@IAE@_N@Z + ??0CordzHandle@cord_internal@absl@@QAE@XZ + ??0CordzInfo@cord_internal@absl@@AAE@PAUCordRep@12@PBV012@W4MethodIdentifier@CordzUpdateTracker@12@_J@Z + ??0CordzStatistics@cord_internal@absl@@QAE@XZ + ??0CordzUpdateScope@cord_internal@absl@@QAE@PAVCordzInfo@12@W4MethodIdentifier@CordzUpdateTracker@12@@Z + ??0CordzUpdateTracker@cord_internal@absl@@QAE@XZ + ??0Counter@CordzUpdateTracker@cord_internal@absl@@QAE@XZ + ??0CrcCordState@crc_internal@absl@@QAE@$$QAV012@@Z + ??0CrcCordState@crc_internal@absl@@QAE@ABV012@@Z + ??0CrcCordState@crc_internal@absl@@QAE@XZ + ??0CrcMemcpyEngine@crc_internal@absl@@IAE@XZ + ??0Duration@absl@@AAE@_JI@Z + ??0Duration@absl@@QAE@XZ + ??0DynValueDeleter@flags_internal@absl@@QAE@P6APAXW4FlagOp@12@PBXPAX2@Z@Z + ??0ErrnoSaver@base_internal@absl@@QAE@XZ + ??0FILERawSink@str_format_internal@absl@@QAE@PAU_iobuf@@@Z + ??0FallbackCrcMemcpyEngine@crc_internal@absl@@QAE@XZ + ??0FlagCallback@flags_internal@absl@@QAE@XZ + ??0FlagRegistry@flags_internal@absl@@QAE@XZ + ??0FlagSaver@absl@@QAE@XZ + ??0FlagSaverImpl@flags_internal@absl@@QAE@XZ + ??0FlagStateInterface@flags_internal@absl@@QAE@XZ + ??0FlagsUsageConfig@absl@@QAE@ABU01@@Z + ??0FlagsUsageConfig@absl@@QAE@XZ + ??0FormatConversionSpecImpl@str_format_internal@absl@@QAE@XZ + ??0FormatSinkImpl@str_format_internal@absl@@QAE@VFormatRawSinkImpl@12@@Z + ??0GraphCycles@synchronization_internal@absl@@QAE@XZ + ??0GroupPortableImpl@container_internal@absl@@QAE@PBW4ctrl_t@12@@Z + ??0GroupSse2Impl@container_internal@absl@@QAE@PBW4ctrl_t@12@@Z + ??0HashSetIteratorGenerationInfoDisabled@container_internal@absl@@QAE@PBE@Z + ??0HashtableSize@container_internal@absl@@QAE@Ufull_soo_tag_t@12@@Z + ??0HashtableSize@container_internal@absl@@QAE@Uno_seed_empty_tag_t@12@@Z + ??0HashtablezInfo@container_internal@absl@@QAE@XZ + ??0HashtablezInfoHandle@container_internal@absl@@QAE@$$T@Z + ??0Hex@absl@@AAE@W4PadSpec@1@_K@Z + ??0HiRep@Duration@absl@@QAE@_J@Z + ??0Impl@time_zone@cctz@time_internal@absl@@AAE@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??0Impl@time_zone@cctz@time_internal@absl@@AAE@XZ + ??0InlineData@cord_internal@absl@@QAE@ABV012@@Z + ??0InlineData@cord_internal@absl@@QAE@W4DefaultInitType@012@@Z + ??0InlineData@cord_internal@absl@@QAE@XZ + ??0InlineRep@Cord@absl@@QAE@$$QAV012@@Z + ??0InlineRep@Cord@absl@@QAE@ABV012@@Z + ??0InlineRep@Cord@absl@@QAE@W4DefaultInitType@InlineData@cord_internal@2@@Z + ??0InlineRep@Cord@absl@@QAE@XZ + ??0InputValue@UnboundConversion@str_format_internal@absl@@QAE@XZ + ??0KernelTimeout@synchronization_internal@absl@@QAE@VDuration@2@@Z + ??0KernelTimeout@synchronization_internal@absl@@QAE@VTime@2@@Z + ??0KernelTimeout@synchronization_internal@absl@@QAE@XZ + ??0LeakCheckDisabler@absl@@QAE@XZ + ??0List@CordzInfo@cord_internal@absl@@QAE@XZ + ??0LockHolder@synchronization_internal@absl@@QAE@PAU_RTL_SRWLOCK@@@Z + ??0LogEntry@absl@@AAE@XZ + ??0LogMessage@log_internal@absl@@QAE@PBDHUErrorTag@012@@Z + ??0LogMessage@log_internal@absl@@QAE@PBDHUInfoTag@012@@Z + ??0LogMessage@log_internal@absl@@QAE@PBDHUWarningTag@012@@Z + ??0LogMessage@log_internal@absl@@QAE@PBDHW4LogSeverity@2@@Z + ??0LogMessage@log_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@2@@Z + ??0LogMessageData@LogMessage@log_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@3@VTime@3@@Z + ??0LogMessageDebugFatal@log_internal@absl@@QAE@PBDH@Z + ??0LogMessageFatal@log_internal@absl@@QAE@PBDH0@Z + ??0LogMessageFatal@log_internal@absl@@QAE@PBDH@Z + ??0LogMessageQuietlyDebugFatal@log_internal@absl@@QAE@PBDH@Z + ??0LogMessageQuietlyFatal@log_internal@absl@@QAE@PBDH0@Z + ??0LogMessageQuietlyFatal@log_internal@absl@@QAE@PBDH@Z + ??0LogSink@absl@@IAE@XZ + ??0Long@Rep@CordBuffer@absl@@QAE@PAUCordRepFlat@cord_internal@3@@Z + ??0MaskedPointer@flags_internal@absl@@QAE@PAX_N@Z + ??0MixingHashState@hash_internal@absl@@AAE@_K@Z + ??0Mutex@absl@@QAE@XZ + ??0MutexLock@absl@@QAE@AAVMutex@1@@Z + ??0NodeCounts@CordzStatistics@cord_internal@absl@@QAE@XZ + ??0OstreamView@LogMessage@log_internal@absl@@QAE@AAULogMessageData@123@@Z + ??0ParsedFloat@strings_internal@absl@@QAE@XZ + ??0ParsedFormatBase@str_format_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_NV?$initializer_list@W4FormatConversionCharSet@absl@@@5@@Z + ??0ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QAE@PAV123@@Z + ??0Payload@status_internal@absl@@QAE@$$QAU012@@Z + ??0Payload@status_internal@absl@@QAE@ABU012@@Z + ??0PerTableSeed@container_internal@absl@@AAE@G@Z + ??0PosixTimeZone@cctz@time_internal@absl@@QAE@XZ + ??0PrefixCrc@CrcCordState@crc_internal@absl@@QAE@IVcrc32c_t@3@@Z + ??0PrefixCrc@CrcCordState@crc_internal@absl@@QAE@XZ + ??0ProtoField@log_internal@absl@@QAE@XZ + ??0Randen@random_internal@absl@@QAE@XZ + ??0RawHashSetLayout@container_internal@absl@@QAE@III_N@Z + ??0ReaderMutexLock@absl@@QAE@AAVMutex@1@@Z + ??0RefcountAndFlags@cord_internal@absl@@QAE@XZ + ??0RefcountedRep@CrcCordState@crc_internal@absl@@QAE@XZ + ??0Rep@CordBuffer@absl@@QAE@PAUCordRepFlat@cord_internal@2@@Z + ??0Rep@CordBuffer@absl@@QAE@XZ + ??0Rep@CrcCordState@crc_internal@absl@@QAE@XZ + ??0Rep@GraphCycles@synchronization_internal@absl@@QAE@XZ + ??0Rep@InlineData@cord_internal@absl@@QAE@W4DefaultInitType@123@@Z + ??0Rep@InlineData@cord_internal@absl@@QAE@XZ + ??0SavedValue@FlagState@flags_internal@absl@@QAE@PAX@Z + ??0SavedValue@FlagState@flags_internal@absl@@QAE@_J@Z + ??0SchedulingHelper@base_internal@absl@@QAE@W4SchedulingMode@12@@Z + ??0ScopedDisable@SchedulingGuard@base_internal@absl@@QAE@XZ + ??0ScopedEnable@SchedulingGuard@base_internal@absl@@QAE@XZ + ??0ScopedMinLogLevel@log_internal@absl@@QAE@W4LogSeverityAtLeast@2@@Z + ??0ScopedStderrThreshold@absl@@QAE@W4LogSeverityAtLeast@1@@Z + ??0ShiftState@strings_internal@absl@@QAE@XZ + ??0SpinLock@base_internal@absl@@QAE@W4SchedulingMode@12@@Z + ??0SpinLock@base_internal@absl@@QAE@XZ + ??0SpinLockHolder@base_internal@absl@@QAE@AAVSpinLock@12@@Z + ??0Status@absl@@AAE@I@Z + ??0Status@absl@@QAE@$$QAV01@@Z + ??0Status@absl@@QAE@ABV01@@Z + ??0Status@absl@@QAE@W4StatusCode@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0StatusRep@status_internal@absl@@QAE@W4StatusCode@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@56@@Z + ??0StdcppWaiter@synchronization_internal@absl@@QAE@XZ + ??0Storage@?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QAE@IABV?$allocator@D@__Cr@std@@@Z + ??0Streamable@str_format_internal@absl@@QAE@ABVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ??0StringifySink@detect_specialization@log_internal@absl@@QAE@AAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0StringifySink@strings_internal@absl@@QAE@XZ + ??0SynchWaitParams@absl@@QAE@PBUMuHowS@1@PBVCondition@1@VKernelTimeout@synchronization_internal@1@PAVMutex@1@PAUPerThreadSynch@base_internal@1@PAU?$atomic@H@__Cr@std@@@Z + ??0Time@absl@@AAE@VDuration@1@@Z + ??0Time@absl@@QAE@XZ + ??0TimeConversion@absl@@QAE@XZ + ??0TimeInfo@TimeZone@absl@@QAE@XZ + ??0TimeZone@absl@@QAE@Vtime_zone@cctz@time_internal@1@@Z + ??0TimeZoneIf@cctz@time_internal@absl@@IAE@XZ + ??0TimeZoneInfo@cctz@time_internal@absl@@AAE@XZ + ??0TimeZoneLibC@cctz@time_internal@absl@@AAE@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??0Transition@cctz@time_internal@absl@@QAE@XZ + ??0TransitionType@cctz@time_internal@absl@@QAE@XZ + ??0U@?1??Get@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@ABE?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ@QAE@XZ + ??0UnboundConversion@str_format_internal@absl@@QAE@XZ + ??0UnrecognizedFlag@absl@@QAE@$$QAU01@@Z + ??0UnrecognizedFlag@absl@@QAE@ABU01@@Z + ??0UnrecognizedFlag@absl@@QAE@W4Source@01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0UntypedFormatSpec@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0UntypedFormatSpecImpl@str_format_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0Utf8ForCodePoint@debugging_internal@absl@@QAE@_K@Z + ??0ViableSubstitution@strings_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0I@Z + ??0Win32Waiter@synchronization_internal@absl@@QAE@XZ + ??0WriterMutexLock@absl@@QAE@AAVMutex@1@@Z + ??0ZoneInfoSource@cctz@time_internal@absl@@QAE@XZ + ??0_ConstructTransaction@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAE@PAV123@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z + ??0_ConstructTransaction@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@PAV123@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ??0_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@PAV123@PAUTransition@cctz@time_internal@absl@@I@Z + ??0_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@PAV123@PAUTransitionType@cctz@time_internal@absl@@I@Z + ??0_ConstructTransaction@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAV123@AAU__deque_block_range@123@@Z + ??0_ConstructTransaction@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@I@Z + ??0_ConstructTransaction@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@I@Z + ??0_ConstructTransaction@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@I@Z + ??0_ConstructTransaction@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@I@Z + ??0_ConstructTransaction@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@I@Z + ??0_ConstructTransaction@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@I@Z + ??0_ConstructTransaction@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@I@Z + ??0_ConstructTransaction@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@I@Z + ??0_ConstructTransaction@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@I@Z + ??0_ConstructTransaction@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@I@Z + ??0_ConstructTransaction@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@AAV123@I@Z + ??0__deque_block_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@PAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??0__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@0@Z + ??0__destroy_vector@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@@Z + ??0__destroy_vector@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@@Z + ??0__destroy_vector@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@@Z + ??0__destroy_vector@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@@Z + ??0__destroy_vector@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@@Z + ??0__destroy_vector@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@@Z + ??0__destroy_vector@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@AAV123@@Z + ??0__destroy_vector@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@AAV123@@Z + ??0__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@23@@Z + ??0__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@23@@Z + ??0absolute_lookup@time_zone@cctz@time_internal@absl@@QAE@XZ + ??0civil_lookup@time_zone@cctz@time_internal@absl@@QAE@XZ + ??0civil_transition@time_zone@cctz@time_internal@absl@@QAE@XZ + ??0const_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE@Viterator@123@@Z + ??0crc32c_t@absl@@QAE@I@Z + ??0fields@detail@cctz@time_internal@absl@@QAE@_JCCCCC@Z + ??0int128@absl@@AAE@_J_K@Z + ??0int128@absl@@QAE@H@Z + ??0int128@absl@@QAE@M@Z + ??0int128@absl@@QAE@N@Z + ??0int128@absl@@QAE@O@Z + ??0iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAE@PAW4ctrl_t@23@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@PBE@Z + ??0iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAE@PAW4ctrl_t@23@T?$MaybeInitializedPtr@X@23@PBE@Z + ??0iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAE@PBE@Z + ??0once_flag@absl@@QAE@XZ + ??0time_zone@cctz@time_internal@absl@@AAE@PBVImpl@0123@@Z + ??0time_zone@cctz@time_internal@absl@@QAE@XZ + ??0uint128@absl@@AAE@_K0@Z + ??0uint128@absl@@QAE@H@Z + ??0uint128@absl@@QAE@I@Z + ??0uint128@absl@@QAE@M@Z + ??0uint128@absl@@QAE@N@Z + ??0uint128@absl@@QAE@O@Z + ??0uint128@absl@@QAE@Vint128@1@@Z + ??0uint128@absl@@QAE@_J@Z + ??0uint128@absl@@QAE@_K@Z + ??1?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@XZ + ??1?$AllocationTransaction@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@XZ + ??1?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@XZ + ??1?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QAE@XZ + ??1?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QAE@XZ + ??1?$InlinedVector@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@absl@@QAE@XZ + ??1?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAE@XZ + ??1?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QAE@XZ + ??1?$Sample@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QAE@XZ + ??1?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QAE@XZ + ??1?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QAE@XZ + ??1?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QAE@XZ + ??1?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QAE@XZ + ??1?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@XZ + ??1?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@XZ + ??1?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@XZ + ??1?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE@XZ + ??1?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@QAE@XZ + ??1?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@QAE@XZ + ??1?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE@XZ + ??1?$__policy_func@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__function@__Cr@std@@QAE@XZ + ??1?$__policy_func@$$A6AXAAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QAE@XZ + ??1?$__policy_func@$$A6A_NABVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAE@XZ + ??1?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QAE@XZ + ??1?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??1?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??1?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@23@@absl@@QAE@XZ + ??1?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__Cr@std@@QAE@XZ + ??1?$function@$$A6AXAAVCommandLineFlag@absl@@@Z@__Cr@std@@QAE@XZ + ??1?$function@$$A6A_NABVCommandLineFlag@absl@@@Z@__Cr@std@@QAE@XZ + ??1?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??1?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??1?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QAE@XZ + ??1?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@QAE@XZ + ??1?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??1?$raw_hash_map@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE@XZ + ??1?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE@XZ + ??1?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@UThreadIdentity@base_internal@absl@@P6AXPAX@Z@__Cr@std@@QAE@XZ + ??1?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QAE@XZ + ??1?$unordered_set@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE@XZ + ??1?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??1BadStatusOrAccess@absl@@UAE@XZ + ??1BestHints@flags_internal@absl@@QAE@XZ + ??1ByAnyChar@absl@@QAE@XZ + ??1CRC32@crc_internal@absl@@UAE@XZ + ??1CRC@crc_internal@absl@@UAE@XZ + ??1CRCImpl@crc_internal@absl@@UAE@XZ + ??1CheckOpMessageBuilder@log_internal@absl@@QAE@XZ + ??1Cord@absl@@QAE@XZ + ??1CordBuffer@absl@@QAE@XZ + ??1CordRepCrc@cord_internal@absl@@QAE@XZ + ??1CordzHandle@cord_internal@absl@@MAE@XZ + ??1CordzInfo@cord_internal@absl@@EAE@XZ + ??1CordzUpdateScope@cord_internal@absl@@QAE@XZ + ??1CrcCordState@crc_internal@absl@@QAE@XZ + ??1CrcMemcpyEngine@crc_internal@absl@@UAE@XZ + ??1ErrnoSaver@base_internal@absl@@QAE@XZ + ??1FallbackCrcMemcpyEngine@crc_internal@absl@@UAE@XZ + ??1FlagSaver@absl@@QAE@XZ + ??1FlagSaverImpl@flags_internal@absl@@QAE@XZ + ??1FlagState@flags_internal@absl@@UAE@XZ + ??1FlagStateInterface@flags_internal@absl@@UAE@XZ + ??1FlagsUsageConfig@absl@@QAE@XZ + ??1FormatSinkImpl@str_format_internal@absl@@QAE@XZ + ??1GraphCycles@synchronization_internal@absl@@QAE@XZ + ??1HashtablezInfo@container_internal@absl@@QAE@XZ + ??1Impl@time_zone@cctz@time_internal@absl@@QAE@XZ + ??1LeakCheckDisabler@absl@@QAE@XZ + ??1LockHolder@synchronization_internal@absl@@QAE@XZ + ??1LogEntry@absl@@QAE@XZ + ??1LogMessage@log_internal@absl@@QAE@XZ + ??1LogMessageData@LogMessage@log_internal@absl@@QAE@XZ + ??1LogMessageDebugFatal@log_internal@absl@@QAE@XZ + ??1LogMessageFatal@log_internal@absl@@QAE@XZ + ??1LogMessageQuietlyDebugFatal@log_internal@absl@@QAE@XZ + ??1LogMessageQuietlyFatal@log_internal@absl@@QAE@XZ + ??1LogSink@absl@@UAE@XZ + ??1Mutex@absl@@QAE@XZ + ??1MutexLock@absl@@QAE@XZ + ??1Notification@absl@@QAE@XZ + ??1OstreamView@LogMessage@log_internal@absl@@UAE@XZ + ??1Payload@status_internal@absl@@QAE@XZ + ??1PosixTimeZone@cctz@time_internal@absl@@QAE@XZ + ??1ReaderMutexLock@absl@@QAE@XZ + ??1RefcountedRep@CrcCordState@crc_internal@absl@@QAE@XZ + ??1Rep@CrcCordState@crc_internal@absl@@QAE@XZ + ??1Rep@GraphCycles@synchronization_internal@absl@@QAE@XZ + ??1SchedulingHelper@base_internal@absl@@QAE@XZ + ??1ScopedDisable@SchedulingGuard@base_internal@absl@@QAE@XZ + ??1ScopedEnable@SchedulingGuard@base_internal@absl@@QAE@XZ + ??1ScopedMinLogLevel@log_internal@absl@@QAE@XZ + ??1ScopedStderrThreshold@absl@@QAE@XZ + ??1SeedGenException@absl@@UAE@XZ + ??1SpinLockHolder@base_internal@absl@@QAE@XZ + ??1Status@absl@@QAE@XZ + ??1StatusRep@status_internal@absl@@QAE@XZ + ??1Storage@?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QAE@XZ + ??1Streamable@str_format_internal@absl@@QAE@XZ + ??1StringifySink@strings_internal@absl@@QAE@XZ + ??1TimeZoneIf@cctz@time_internal@absl@@UAE@XZ + ??1TimeZoneInfo@cctz@time_internal@absl@@UAE@XZ + ??1TimeZoneLibC@cctz@time_internal@absl@@UAE@XZ + ??1U@?1??Get@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@ABE?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ@QAE@XZ + ??1UnrecognizedFlag@absl@@QAE@XZ + ??1WriterMutexLock@absl@@QAE@XZ + ??1ZoneInfoSource@cctz@time_internal@absl@@UAE@XZ + ??1_ConstructTransaction@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1_ConstructTransaction@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE@XZ + ??4?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAV012@ABV012@@Z + ??4?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QAEAAV012@$$QAV012@@Z + ??4BadStatusOrAccess@absl@@QAEAAV01@$$QAV01@@Z + ??4BadStatusOrAccess@absl@@QAEAAV01@ABV01@@Z + ??4Cord@absl@@QAEAAV01@$$QAV01@@Z + ??4Cord@absl@@QAEAAV01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??4CordzUpdateTracker@cord_internal@absl@@QAEAAV012@ABV012@@Z + ??4CrcCordState@crc_internal@absl@@QAEAAV012@$$QAV012@@Z + ??4CrcCordState@crc_internal@absl@@QAEAAV012@ABV012@@Z + ??4FlagsUsageConfig@absl@@QAEAAU01@ABU01@@Z + ??4HiRep@Duration@absl@@QAEAAV012@_J@Z + ??4InlineData@cord_internal@absl@@QAEAAV012@ABV012@@Z + ??4InlineRep@Cord@absl@@QAEAAV012@$$QAV012@@Z + ??4Payload@status_internal@absl@@QAEAAU012@$$QAU012@@Z + ??4Rep@CrcCordState@crc_internal@absl@@QAEAAU0123@ABU0123@@Z + ??4Status@absl@@QAEAAV01@$$QAV01@@Z + ??4Status@absl@@QAEAAV01@ABV01@@Z + ??4int128@absl@@QAEAAV01@H@Z + ??4uint128@absl@@QAEAAV01@H@Z + ??4uint128@absl@@QAEAAV01@_J@Z + ??4uint128@absl@@QAEAAV01@_K@Z + ??5absl@@YA?AVuint128@0@V10@H@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@ABV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@H@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@P6AAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV345@@Z@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@P6AAAVios_base@__Cr@std@@AAV345@@Z@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@_W@Z + ??6absl@@YA?AVuint128@0@V10@H@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@ABVCord@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@ABVStatus@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@VTime@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@Vcrc32c_t@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@Vint128@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@Vuint128@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@W4LogSeverity@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@W4LogSeverityAtLeast@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@W4LogSeverityAtMost@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@W4StatusCode@0@@Z + ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@W4weekday@0123@@Z + ??6log_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@UUnprintableWrapper@01@@Z + ??6str_format_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@ABVStreamable@01@@Z + ??6str_format_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@W4FormatConversionChar@1@@Z + ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@01@@Z + ??7absl@@YA_NVuint128@0@@Z + ??8CharIterator@Cord@absl@@QBE_NABV012@@Z + ??8ChunkIterator@Cord@absl@@QBE_NABV012@@Z + ??8GraphId@synchronization_internal@absl@@QBE_NABU012@@Z + ??8StatusRep@status_internal@absl@@QBE_NABV012@@Z + ??8__Cr@std@@YA_NABU__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NABV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@0@Z + ??8__Cr@std@@YA_NABV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0@Z + ??8__Cr@std@@YA_NABV?$__hash_const_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NABV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NABV?$__hash_map_const_iterator@V?$__hash_const_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NABV?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@01@0@Z + ??8__Cr@std@@YA_NABV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@01@0@Z + ??8__Cr@std@@YA_NABV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@01@0@Z + ??8absl@@YA_NABVCord@0@0@Z + ??8absl@@YA_NABVCord@0@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??8absl@@YA_NVDuration@0@0@Z + ??8absl@@YA_NVTime@0@0@Z + ??8absl@@YA_NVint128@0@0@Z + ??8absl@@YA_NVuint128@0@0@Z + ??8container_internal@absl@@YA_NABVconst_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@0@Z + ??8container_internal@absl@@YA_NABViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@0@Z + ??8cord_internal@absl@@YA_NABVInlineData@01@0@Z + ??8strings_internal@absl@@YA_NABV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??8strings_internal@absl@@YA_NABV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??8strings_internal@absl@@YA_NABV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??9CharIterator@Cord@absl@@QBE_NABV012@@Z + ??9ChunkIterator@Cord@absl@@QBE_NABV012@@Z + ??9GraphId@synchronization_internal@absl@@QBE_NABU012@@Z + ??9__Cr@std@@YA_NABU__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@01@0@Z + ??9__Cr@std@@YA_NABV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@@01@0@Z + ??9__Cr@std@@YA_NABV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@@01@0@Z + ??9__Cr@std@@YA_NABV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@01@0@Z + ??9__Cr@std@@YA_NABV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@01@0@Z + ??9absl@@YA_NABVCord@0@0@Z + ??9absl@@YA_NVint128@0@0@Z + ??9absl@@YA_NVuint128@0@0@Z + ??9container_internal@absl@@YA_NABV?$BitMask@G$0BA@$0A@$0A@@01@0@Z + ??9container_internal@absl@@YA_NABV?$BitMask@_K$07$02$0A@@01@0@Z + ??9container_internal@absl@@YA_NABViterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@01@0@Z + ??9strings_internal@absl@@YA_NABV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??9strings_internal@absl@@YA_NABV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??9strings_internal@absl@@YA_NABV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@01@0@Z + ??A?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QAEAADI@Z + ??A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAEAAUPayload@status_internal@1@I@Z + ??A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QBEABUPayload@status_internal@1@I@Z + ??A?$Span@$$CBD@absl@@QBEABDI@Z + ??A?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QBEABVFormatArgImpl@str_format_internal@1@I@Z + ??A?$Span@D@absl@@QBEAADI@Z + ??A?$Span@I@absl@@QBEAAII@Z + ??A?$__farray@P6AI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@Z$03@__Cr@std@@QBEABQ6AI$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@12@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@612@@ZI@Z + ??A?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@$0BA@@__Cr@std@@QAEAAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@ABV567@@Z@I@Z + ??A?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEABUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ??A?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@12@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??A?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??A?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEAAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@I@Z + ??A?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEAAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@I@Z + ??A?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEAAPBVImpl@time_zone@cctz@time_internal@absl@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??A?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@I@Z + ??A?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEABUTransition@cctz@time_internal@absl@@I@Z + ??A?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransitionType@cctz@time_internal@absl@@I@Z + ??A?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEABUTransitionType@cctz@time_internal@absl@@I@Z + ??A?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUViableSubstitution@strings_internal@absl@@I@Z + ??ACord@absl@@QBEDI@Z + ??B?$FlagRegistrar@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$00@flags_internal@absl@@QBE?AUFlagRegistrarEmpty@12@XZ + ??B?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@QBE_NXZ + ??B?$__atomic_base@PAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@QBEPAVCordzHandle@cord_internal@absl@@XZ + ??B?$__policy_func@$$A6A_NABVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QBE_NXZ + ??B?$function@$$A6A_NABVCommandLineFlag@absl@@@Z@__Cr@std@@QBE_NXZ + ??B?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QBE_NXZ + ??B?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QBE_NXZ + ??B?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBE_NXZ + ??B?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBE_NXZ + ??B?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QBE_NXZ + ??BCord@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ??BCordRepBtreeReader@cord_internal@absl@@QBE_NXZ + ??BTimeZone@absl@@QBE?AVtime_zone@cctz@time_internal@1@XZ + ??Bcrc32c_t@absl@@QBEIXZ + ??Bint128@absl@@QBEDXZ + ??Bint128@absl@@QBENXZ + ??Bint128@absl@@QBE_JXZ + ??Bint128@absl@@QBE_WXZ + ??Braw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV234@@Z@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@67@XZ + ??Buint128@absl@@QBEDXZ + ??Buint128@absl@@QBEEXZ + ??Buint128@absl@@QBEIXZ + ??Buint128@absl@@QBENXZ + ??Buint128@absl@@QBE_KXZ + ??Buint128@absl@@QBE_NXZ + ??Buint128@absl@@QBE_WXZ + ??C?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QAEPAURefcountedRep@CrcCordState@crc_internal@1@XZ + ??C?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QBEPBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??C?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QBEPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??C?$__hash_map_const_iterator@V?$__hash_const_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QBEPBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??C?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@QBEPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@XZ + ??C?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@QBEPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@XZ + ??C?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ??C?$unique_ptr@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@12@XZ + ??C?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@12@XZ + ??C?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPAULogMessageData@LogMessage@log_internal@absl@@XZ + ??C?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QBEPAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ??C?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPAVTimeZoneIf@cctz@time_internal@absl@@XZ + ??C?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPAVTimeZoneInfo@cctz@time_internal@absl@@XZ + ??CChunkIterator@Cord@absl@@QBEPBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??Citerator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QBEPAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@XZ + ??D?$BitMask@G$0BA@$0A@$0A@@container_internal@absl@@QBEIXZ + ??D?$BitMask@_K$07$02$0A@@container_internal@absl@@QBEIXZ + ??D?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QAEAAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@1@XZ + ??D?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QAEAAVFlagRegistry@flags_internal@1@XZ + ??D?$NoDestructor@VMutex@absl@@@absl@@QAEAAVMutex@1@XZ + ??D?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QBEABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??D?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QBEABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??D?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QBEABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??D?$__deque_iterator@PBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@AAPBV12345@PAPAPBV12345@H$0A@@__Cr@std@@QBEAAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ??D?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@QBEAAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ??D?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@QBEABUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ??D?$__hash_const_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QBEABU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??D?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QBEAAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??D?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QBEAAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??D?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@@__Cr@std@@QBEAAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@XZ + ??D?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@@__Cr@std@@QBEAAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@XZ + ??D?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@QBEAAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@XZ + ??D?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@QBEAAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@XZ + ??D?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@QBEAAPAVCommandLineFlag@absl@@XZ + ??D?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@__Cr@std@@QBEAAPAVCordzHandle@cord_internal@absl@@XZ + ??D?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@QBEAAPAVLogSink@absl@@XZ + ??D?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@QBEAAPBVCommandLineFlag@absl@@XZ + ??D?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@QBEAAUTransition@cctz@time_internal@absl@@XZ + ??D?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QBEAAUTransitionType@cctz@time_internal@absl@@XZ + ??D?$__wrap_iter@PAUUnrecognizedFlag@absl@@@__Cr@std@@QBEAAUUnrecognizedFlag@absl@@XZ + ??D?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@QBEAAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@12@ABV567@@Z@XZ + ??D?$__wrap_iter@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QBEAAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@XZ + ??D?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QBEABUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ??D?$__wrap_iter@PBUUnrecognizedFlag@absl@@@__Cr@std@@QBEABUUnrecognizedFlag@absl@@XZ + ??D?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QBE$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ??D?$move_iterator@PAPAUCordRep@cord_internal@absl@@@__Cr@std@@QBE$$QAPAUCordRep@cord_internal@absl@@XZ + ??D?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QBE$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ??D?$move_iterator@PAPAVLogSink@absl@@@__Cr@std@@QBE$$QAPAVLogSink@absl@@XZ + ??D?$move_iterator@PAUPayload@status_internal@absl@@@__Cr@std@@QBE$$QAUPayload@status_internal@absl@@XZ + ??D?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@QBE$$QAUTransition@cctz@time_internal@absl@@XZ + ??D?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QBE$$QAUTransitionType@cctz@time_internal@absl@@XZ + ??D?$unique_ptr@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEAAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@12@XZ + ??D?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEAAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@12@XZ + ??D?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QBEAAULogMessageData@LogMessage@log_internal@absl@@XZ + ??D?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QBEAAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ??D?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEAAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@12@XZ + ??D?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEAAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@12@XZ + ??D?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QBEAAVFlagStateInterface@flags_internal@absl@@XZ + ??DChunkIterator@Cord@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ??D__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBE?AU__deque_block_range@123@XZ + ??Dabsl@@YA?AVint128@0@V10@0@Z + ??Dabsl@@YA?AVuint128@0@V10@0@Z + ??Diterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QBEAAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@XZ + ??E?$BitMask@G$0BA@$0A@$0A@@container_internal@absl@@QAEAAV012@XZ + ??E?$BitMask@_K$07$02$0A@@container_internal@absl@@QAEAAV012@XZ + ??E?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QAEAAV012@XZ + ??E?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QAEAAV012@XZ + ??E?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QAEAAV012@XZ + ??E?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@QAEAAV012@XZ + ??E?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@QAEAAV012@XZ + ??E?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAEAAV012@XZ + ??E?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEAAV012@XZ + ??E?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@@__Cr@std@@QAEAAV012@XZ + ??E?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@@__Cr@std@@QAEAAV012@XZ + ??E?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@QAEAAV012@XZ + ??E?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@QAEAAV012@XZ + ??E?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@QAEAAV012@XZ + ??E?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@__Cr@std@@QAEAAV012@XZ + ??E?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@QAEAAV012@XZ + ??E?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@QAEAAV012@XZ + ??E?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QAEAAV012@XZ + ??E?$__wrap_iter@PAUUnrecognizedFlag@absl@@@__Cr@std@@QAEAAV012@XZ + ??E?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@QAEAAV012@XZ + ??E?$__wrap_iter@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEAAV012@XZ + ??E?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QAEAAV012@XZ + ??E?$__wrap_iter@PBUUnrecognizedFlag@absl@@@__Cr@std@@QAEAAV012@XZ + ??E?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QAEAAV012@XZ + ??E?$move_iterator@PAPAUCordRep@cord_internal@absl@@@__Cr@std@@QAEAAV012@XZ + ??E?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QAEAAV012@XZ + ??E?$move_iterator@PAPAVLogSink@absl@@@__Cr@std@@QAEAAV012@XZ + ??E?$move_iterator@PAUPayload@status_internal@absl@@@__Cr@std@@QAEAAV012@XZ + ??E?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@QAEAAV012@XZ + ??E?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QAEAAV012@XZ + ??EChunkIterator@Cord@absl@@QAEAAV012@XZ + ??E__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAU0123@XZ + ??Eiterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAEAAV0123@XZ + ??Euint128@absl@@QAEAAV01@XZ + ??F?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@QAEAAV012@XZ + ??G__Cr@std@@YAHABV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0@Z + ??Gabsl@@YA?AVDuration@0@V10@0@Z + ??Gabsl@@YA?AVDuration@0@V10@@Z + ??Gabsl@@YA?AVDuration@0@VTime@0@0@Z + ??Gabsl@@YA?AVint128@0@V10@0@Z + ??Gabsl@@YA?AVint128@0@V10@@Z + ??Gabsl@@YA?AVuint128@0@V10@0@Z + ??Gabsl@@YA?AVuint128@0@V10@@Z + ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??H?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@QBE?AV012@H@Z + ??H?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@QBE?AV012@H@Z + ??H?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@QBE?AV012@H@Z + ??H?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@QBE?AV012@H@Z + ??Habsl@@YA?AVDuration@0@V10@0@Z + ??Habsl@@YA?AVTime@0@V10@VDuration@0@@Z + ??Habsl@@YA?AVint128@0@V10@0@Z + ??Habsl@@YA?AVuint128@0@V10@0@Z + ??Hdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Hdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Iabsl@@YA?AVuint128@0@V10@0@Z + ??Iabsl@@YA?AW4StatusToStringMode@0@W410@0@Z + ??Iabsl@@YA?AW4chars_format@0@W410@0@Z + ??Kabsl@@YA?AVint128@0@V10@0@Z + ??Kabsl@@YA?AVuint128@0@V10@0@Z + ??Kabsl@@YA_JVDuration@0@0@Z + ??Labsl@@YA?AVDuration@0@V10@0@Z + ??Labsl@@YA?AVint128@0@V10@0@Z + ??Labsl@@YA?AVuint128@0@V10@0@Z + ??Mabsl@@YA_NVDuration@0@0@Z + ??Mabsl@@YA_NVint128@0@0@Z + ??Mabsl@@YA_NVuint128@0@0@Z + ??Mabsl@@YA_NW4LogSeverity@0@W4LogSeverityAtLeast@0@@Z + ??Nabsl@@YA_NVDuration@0@0@Z + ??Nabsl@@YA_NVint128@0@0@Z + ??Oabsl@@YA_NVDuration@0@0@Z + ??Oabsl@@YA_NVint128@0@0@Z + ??Oabsl@@YA_NVuint128@0@0@Z + ??Pabsl@@YA_NVDuration@0@0@Z + ??Pabsl@@YA_NVint128@0@0@Z + ??Pabsl@@YA_NVuint128@0@0@Z + ??R@?0???$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PBVFormatArgImpl@str_format_internal@absl@@@23@I@Z@QBE?A?@@XZ + ??R@?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@QBE?A?@@PADI@Z + ??R@?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@QBE?A?@@PADI@Z + ??R@?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@QBE?A?@@PADI@Z + ??R@?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@QBE?A?@@PADI@Z + ??R@?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@QBE?A?@@PADI@Z + ??R@?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@QBE?A?@@PADI@Z + ??R@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@45@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@UNoFormatter@12@@Z@QBE?A?@@PADI@Z + ??R@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@23@ABQBUCordRep@cord_internal@absl@@@Z@QBE?A?@@00@Z + ??R@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@QBE?A?@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@QBE?A?@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@QBE?A?@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$construct@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@ABUpiecewise_construct_t@__Cr@std@@$$QAV?$tuple@$$QAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@67@@Z@QBE?A?@@XZ + ??R@?0???$construct@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@V?$tuple@$$QAPAVCommandLineFlag@absl@@@23@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@ABUpiecewise_construct_t@__Cr@std@@$$QAV?$tuple@$$QBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@67@$$QAV?$tuple@$$QAPAVCommandLineFlag@absl@@@67@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@ABV723@AAI@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@ABQAV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCordzHandle@cord_internal@absl@@ABQAV456@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVLogSink@absl@@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVLogSink@absl@@ABQAV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@ABQBV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCordzHandle@cord_internal@absl@@ABQBV456@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@ABU4567@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@ABU45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@$$QAPBV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU4567@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QAV423@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@$$QAW4Source@45@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z@QBE?A?@@XZ + ??R@?0???A?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QAEAADI@Z@QBE?A?@@XZ + ??R@?0???A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAEAAUPayload@status_internal@2@I@Z@QBE?A?@@XZ + ??R@?0???A?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QBEABUPayload@status_internal@2@I@Z@QBE?A?@@XZ + ??R@?0???A?$Span@$$CBD@absl@@QBEABDI@Z@QBE?A?@@XZ + ??R@?0???A?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QBEABVFormatArgImpl@str_format_internal@2@I@Z@QBE?A?@@XZ + ??R@?0???A?$Span@D@absl@@QBEAADI@Z@QBE?A?@@XZ + ??R@?0???A?$Span@I@absl@@QBEAAII@Z@QBE?A?@@XZ + ??R@?0???CChunkIterator@Cord@absl@@QBEPBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ@QBE?A?@@XZ + ??R@?0???DChunkIterator@Cord@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ@QBE?A?@@XZ + ??R@?0???EChunkIterator@Cord@absl@@QAEAAV123@XZ@QBE?A?@@XZ + ??R@?0???R0?0???$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z@QBE?A?@@PADI@Z@QBE?A?6@XZ + ??R@?0???R0?0???$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z@QBE?A?@@PADI@Z@QBE?A?6@XZ + ??R@?0???R0?0???$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z@QBE?A?@@PADI@Z@QBE?A?6@XZ + ??R@?0???R0?0???$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z@QBE?A?@@PADI@Z@QBE?A?6@XZ + ??R@?0???R0?0???$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z@QBE?A?@@PADI@Z@QBE?A?6@XZ + ??R@?0???R0?0???$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z@QBE?A?@@PADI@Z@QBE?A?6@XZ + ??R@?0??Append@FormatSinkImpl@str_format_internal@absl@@QAEXID@Z@QBE?A?@@I@Z + ??R@?0??AssertIsValidForComparison@container_internal@absl@@YAXPBW4ctrl_t@23@EPBE@Z@QBE?A?@@XZ + ??R@?0??AssertSameContainer@container_internal@absl@@YAXPBW4ctrl_t@23@0ABQBX1PBE2@Z@QBE?A?@@_NPBD@Z + ??R@?0??CompareSlowPath@Cord@absl@@ABEHABV23@II@Z@QBE?A?@@PAVChunkIterator@23@PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??R@?0??CompareSlowPath@Cord@absl@@ABEHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@II@Z@QBE?A?@@PAVChunkIterator@23@PAV456@@Z + ??R@?0??InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXABV234@@Z@QBE?A?@@XZ + ??R@?0??InlinedRepToCode@Status@absl@@CA?AW4StatusCode@3@I@Z@QBE?A?@@XZ + ??R@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@QBE?A?@@AAVCommandLineFlag@4@@Z + ??R@?0??SetLength@CordBuffer@absl@@QAEXI@Z@QBE?A?@@XZ + ??R@?0??SubtractSize@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXI@Z@QBE?A?@@XZ + ??R@?0??SubtractSize@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXI@Z@QBE?A?@@XZ + ??R@?0??back@?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QAEAAPAUCordRep@cord_internal@3@XZ@QBE?A?@@XZ + ??R@?0??destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@34@@Z@QBE?A?@@XZ + ??R@?0??erase@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAEPAUPayload@status_internal@3@PBU453@@Z@QBE?A?@@XZ + ??R@?0??inline_size@Rep@InlineData@cord_internal@absl@@QBEIXZ@QBE?A?@@XZ + ??R@?0??pop_back@?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QAEXXZ@QBE?A?@@XZ + ??R@?0??remove_prefix@?$Span@$$CBD@absl@@QAEXI@Z@QBE?A?@@XZ + ??R@?0??remove_prefix@?$Span@D@absl@@QAEXI@Z@QBE?A?@@XZ + ??R@?0??remove_suffix@?$Span@$$CBD@absl@@QAEXI@Z@QBE?A?@@XZ + ??R@?0??remove_suffix@?$Span@D@absl@@QAEXI@Z@QBE?A?@@XZ + ??R@?0??set_inline_data@InlineData@cord_internal@absl@@QAEXPBDI@Z@QBE?A?@@XZ + ??R@?0??set_inline_size@Rep@InlineData@cord_internal@absl@@QAEXI@Z@QBE?A?@@XZ + ??R@?0??transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@34@0@Z@QBE?A?@@XZ + ??R@?0???$Initialize@V?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXV?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PBVFormatArgImpl@str_format_internal@absl@@@23@I@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@ABV723@AAI@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@ABQAV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCordzHandle@cord_internal@absl@@ABQAV456@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVLogSink@absl@@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVLogSink@absl@@ABQAV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@ABQBV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCordzHandle@cord_internal@absl@@ABQBV456@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@ABU4567@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@ABU45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@$$QAPBV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU4567@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QAV423@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAUUnrecognizedFlag@absl@@$$QAW4Source@45@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@@Z@QBE?A?@@XZ + ??R@?0??AssertSameContainer@container_internal@absl@@YAXPBW4ctrl_t@23@0ABQBX1PBE2@Z@QBE?A?@@XZ + ??R@?0??erase@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAEPAUPayload@status_internal@3@PBU453@@Z@QBE?A?@@XZ + ??R?$ConvertToContainer@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@ABV123@@Z + ??R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV123@@Z + ??R?$FunctionRef@$$A6AII@Z@absl@@QBEII@Z + ??R?$FunctionRef@$$A6AXPAUCordRep@cord_internal@absl@@II@Z@absl@@QBEXPAUCordRep@cord_internal@1@II@Z + ??R?$FunctionRef@$$A6AXPAXPBX@Z@absl@@QBEXPAXPBX@Z + ??R?$FunctionRef@$$A6AXPBW4ctrl_t@container_internal@absl@@PAX@Z@absl@@QBEXPBW4ctrl_t@container_internal@1@PAX@Z + ??R?$FunctionRef@$$A6AXV?$Span@I@absl@@@Z@absl@@QBEXV?$Span@I@1@@Z + ??R?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z@absl@@QBEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??R?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABVCord@absl@@@Z@absl@@QBEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABVCord@1@@Z + ??R?$HashImpl@V?$tuple@ABI@__Cr@std@@@hash_internal@absl@@QBEIABV?$tuple@ABI@__Cr@std@@@Z + ??R?$HashImpl@V?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@@hash_internal@absl@@QBEIABV?$tuple@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABH@__Cr@std@@@Z + ??R?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@QBEII@Z + ??R?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__copy_impl@__Cr@std@@QAEXPBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ??R?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??R?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??R?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@12@@Z + ??R?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@@Z + ??R?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@12@@Z + ??R?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@12@@Z + ??R?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@X@__Cr@std@@QBE@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@ABU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@12@@Z + ??R?$__lazy_synth_three_way_comparator@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@X@__Cr@std@@QBE@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@ABU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@12@@Z + ??R?$__policy_func@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__function@__Cr@std@@QBE?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@23@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ??R?$__policy_func@$$A6AXAAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QBEXAAVCommandLineFlag@absl@@@Z + ??R?$__policy_func@$$A6A_NABVCommandLineFlag@absl@@@Z@__function@__Cr@std@@QBE_NABVCommandLineFlag@absl@@@Z + ??R?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@12@@Z + ??R?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@12@@Z + ??R?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QBE_NABU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@QBEIABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QBEXPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??R?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@QBEXPAULogMessageData@LogMessage@log_internal@absl@@@Z + ??R?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@QBEXPAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z + ??R?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@QBEXPAVFallbackCrcMemcpyEngine@crc_internal@absl@@@Z + ??R?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@QBEXPAVFlagState@flags_internal@absl@@@Z + ??R?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@QBEXPAVFlagStateInterface@flags_internal@absl@@@Z + ??R?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@QBEXPAVTimeZoneIf@cctz@time_internal@absl@@@Z + ??R?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@QBEXPAVTimeZoneInfo@cctz@time_internal@absl@@@Z + ??R?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@QBEXPAVTimeZoneLibC@cctz@time_internal@absl@@@Z + ??R?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@QBEXPAVZoneInfoSource@cctz@time_internal@absl@@@Z + ??R?$divides@Vuint128@absl@@@__Cr@std@@QBE?AVuint128@absl@@ABV34@0@Z + ??R?$equal_to@PBUCordRep@cord_internal@absl@@@__Cr@std@@QBE_NABQBUCordRep@cord_internal@absl@@0@Z + ??R?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z@__Cr@std@@QBE?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??R?$function@$$A6AXAAVCommandLineFlag@absl@@@Z@__Cr@std@@QBEXAAVCommandLineFlag@absl@@@Z + ??R?$function@$$A6A_NABVCommandLineFlag@absl@@@Z@__Cr@std@@QBE_NABVCommandLineFlag@absl@@@Z + ??R?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@QBEIPBUCordRep@cord_internal@absl@@@Z + ??RAllowEmpty@absl@@QBE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??RBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@23@@Z@QAEIV?$Span@$$CBD@3@@Z + ??RBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@23@@Z@QAEIV?$variant@IHM@__Cr@std@@@Z + ??RBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@23@@Z@QAEIV?$variant@_K_JIH_N@__Cr@std@@@Z + ??RBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@23@@Z@QAEIV?$variant@_K_JN@__Cr@std@@@Z + ??RByCivilTime@Transition@cctz@time_internal@absl@@QBE_NABU1234@0@Z + ??RByUnixTime@Transition@cctz@time_internal@absl@@QBE_NABU1234@0@Z + ??RDynValueDeleter@flags_internal@absl@@QBEXPAX@Z + ??RErrnoSaver@base_internal@absl@@QBEHXZ + ??RSkipEmpty@absl@@QBE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??RStringEq@container_internal@absl@@QBE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ??R__destroy_vector@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ??R__destroy_vector@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ??R__destroy_vector@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ??R__destroy_vector@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ??R__destroy_vector@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ??R__destroy_vector@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ??R__destroy_vector@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ??R__destroy_vector@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXXZ + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@@Z + ??Sabsl@@YA?AVuint128@0@V10@@Z + ??Tabsl@@YA?AVuint128@0@V10@0@Z + ??Uabsl@@YA?AVuint128@0@V10@0@Z + ??Ustr_format_internal@absl@@YA?AW4Flags@01@W4201@0@Z + ??XDuration@absl@@QAEAAV01@N@Z + ??XDuration@absl@@QAEAAV01@_J@Z + ??Xint128@absl@@QAEAAV01@V01@@Z + ??Xuint128@absl@@QAEAAV01@V01@@Z + ??Y?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@QAEAAV012@H@Z + ??Y?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@QAEAAV012@H@Z + ??Y?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@QAEAAV012@H@Z + ??Y?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@QAEAAV012@H@Z + ??Y?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@QAEAAV012@H@Z + ??Y?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@QAEAAV012@H@Z + ??YDuration@absl@@QAEAAV01@V01@@Z + ??YTime@absl@@QAEAAV01@VDuration@1@@Z + ??Yint128@absl@@QAEAAV01@V01@@Z + ??Yuint128@absl@@QAEAAV01@V01@@Z + ??Z?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAEAAV01234@_J@Z + ??ZDuration@absl@@QAEAAV01@V01@@Z + ??Zint128@absl@@QAEAAV01@V01@@Z + ??Zuint128@absl@@QAEAAV01@V01@@Z + ??_0Duration@absl@@QAEAAV01@N@Z + ??_0Duration@absl@@QAEAAV01@_J@Z + ??_0uint128@absl@@QAEAAV01@V01@@Z + ??_1Duration@absl@@QAEAAV01@V01@@Z + ??_2uint128@absl@@QAEAAV01@H@Z + ??_3uint128@absl@@QAEAAV01@H@Z + ??_4uint128@absl@@QAEAAV01@V01@@Z + ??_5uint128@absl@@QAEAAV01@V01@@Z + ??_6uint128@absl@@QAEAAV01@V01@@Z + ?AbortedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbsDuration@absl@@YA?AVDuration@1@V21@@Z + ?AbslFormatFlush@detect_specialization@log_internal@absl@@YAXPAVStringifySink@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslFormatFlush@str_format_internal@absl@@YAXPAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?AbslFormatFlush@str_format_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?AbslFormatFlush@str_format_internal@absl@@YAXPAVBufferRawSink@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslFormatFlush@str_format_internal@absl@@YAXPAVFILERawSink@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVDuration@1@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVTime@1@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAW4LogSeverity@1@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAFPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAGPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAHPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAIPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAJPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAKPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAMPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PANPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@1@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@45@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVint128@2@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVuint128@2@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_JPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_KPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_NPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@12@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@12@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@12@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@12@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@12@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@12@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LogSeverity@1@@Z + ?AbslUnparseFlag@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@45@@Z + ?AbslUnparseFlag@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@12@@Z + ?Absorb@RandenHwAes@random_internal@absl@@SAXPBXPAX@Z + ?Absorb@RandenSlow@random_internal@absl@@SAXPBXPAX@Z + ?AddHint@BestHints@flags_internal@absl@@QAE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z + ?AddLogSink@log_internal@absl@@YAXPAVLogSink@2@@Z + ?AddResult@int128_internal@absl@@YA?AVuint128@2@V32@0@Z + ?AddSize@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXI@Z + ?AddSize@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXI@Z + ?AddSize@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXI@Z + ?AddSize@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXI@Z + ?AddWithCarry@?$BigUnsigned@$03@strings_internal@absl@@AAEXHI@Z + ?AddWithCarry@?$BigUnsigned@$03@strings_internal@absl@@AAEXH_K@Z + ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEXHI@Z + ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEXH_K@Z + ?AddressIsReadable@debugging_internal@absl@@YA_NPBX@Z + ?Advance@Cord@absl@@SAXPAVCharIterator@12@I@Z + ?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AAE?AV23@I@Z + ?AdvanceBtree@ChunkIterator@Cord@absl@@AAEAAV123@XZ + ?AdvanceBytes@ChunkIterator@Cord@absl@@AAEXI@Z + ?AdvanceBytesBtree@ChunkIterator@Cord@absl@@AAEXI@Z + ?AlignBegin@CordRepBtree@cord_internal@absl@@AAEXXZ + ?AlignEnd@CordRepBtree@cord_internal@absl@@AAEXXZ + ?AlignUpTo@container_internal@absl@@YAIII@Z + ?Alloc@LowLevelAlloc@base_internal@absl@@SAPAXI@Z + ?Alloc@flags_internal@absl@@YAPAXP6APAXW4FlagOp@12@PBXPAX2@Z@Z + ?AllocWithArena@LowLevelAlloc@base_internal@absl@@SAPAXIPAUArena@123@@Z + ?Allocate@?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAPAUCordRep@cord_internal@3@I@Z + ?Allocate@?$AllocationTransaction@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAPAVLogSink@3@I@Z + ?Allocate@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAUPayload@status_internal@3@I@Z + ?Allocate@?$MallocAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SA?AU?$Allocation@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@23@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@I@Z + ?Allocate@?$MallocAdapter@V?$allocator@PAVLogSink@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SA?AU?$Allocation@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@23@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@I@Z + ?Allocate@?$MallocAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SA?AU?$Allocation@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@23@AAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@Z + ?Allocate@?$MallocAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SA?AU?$Allocation@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@23@AAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I@Z + ?AllocatedSize@CordRepFlat@cord_internal@absl@@QBEIXZ + ?AllocatedSizeToTag@cord_internal@absl@@YAEI@Z + ?AllocatedSizeToTagUnchecked@cord_internal@absl@@YAEI@Z + ?AllowsUnprotectedRead@MaskedPointer@flags_internal@absl@@QBE_NXZ + ?AlreadyExistsError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AlwaysTrue@Condition@absl@@CA_NPBV12@@Z + ?AnnotateConstruct@NonEmptyInlinedStorage@?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QAEXI@Z + ?AnnotateDestruct@NonEmptyInlinedStorage@?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QAEXI@Z + ?Append@?$AppendUninitializedTraits@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@X@strings_internal@absl@@SAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ?Append@Cord@absl@@QAEX$$QAV12@@Z + ?Append@Cord@absl@@QAEXABV12@@Z + ?Append@Cord@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@PAUCordRep@23@@Z + ?Append@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ?Append@FormatSinkImpl@str_format_internal@absl@@QAEXID@Z + ?Append@FormatSinkImpl@str_format_internal@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QAE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@detect_specialization@log_internal@absl@@QAEXID@Z + ?Append@StringifySink@detect_specialization@log_internal@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@strings_internal@absl@@QAEXID@Z + ?Append@StringifySink@strings_internal@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AppendArray@InlineRep@Cord@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@3@@Z + ?AppendCordToString@absl@@YAXABVCord@1@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AppendPack@str_format_internal@absl@@YAAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?AppendPieces@strings_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$initializer_list@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@5@@Z + ?AppendPrecise@Cord@absl@@AAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?AppendSlow@CordRepBtree@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z + ?AppendText@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QAEIV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AppendTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToInlined@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTruncated@log_internal@absl@@YAIDIAAV?$Span@D@2@@Z + ?AppendTruncated@log_internal@absl@@YAIV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV?$Span@D@2@@Z + ?AppendTruncated@log_internal@absl@@YAIV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@AAV?$Span@D@2@@Z + ?ApplyMask@MaskedPointer@flags_internal@absl@@AAEXI@Z + ?ApplySubstitutions@strings_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@45@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AreItersFromSameContainer@container_internal@absl@@YA_NPBW4ctrl_t@12@0ABQBX1@Z + ?AsValueType@?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@CAPADPAD@Z + ?AsciiStrToLower@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AsciiStrToLower@ascii_internal@absl@@YAXPADPBDI@Z + ?AsciiStrToUpper@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AsciiStrToUpper@ascii_internal@absl@@YAXPADPBDI@Z + ?AssertHeld@CordzInfo@cord_internal@absl@@QAEXXZ + ?AssertHeld@Mutex@absl@@QBEXXZ + ?AssertHeld@SpinLock@base_internal@absl@@QBEXXZ + ?AssertInSooMode@CommonFields@container_internal@absl@@ABEXXZ + ?AssertIsFull@container_internal@absl@@YAXPBW4ctrl_t@12@EPBEPBD@Z + ?AssertIsValidForComparison@container_internal@absl@@YAXPBW4ctrl_t@12@EPBE@Z + ?AssertNotDebugCapacity@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IBEXXZ + ?AssertNotHeld@Mutex@absl@@QBEXXZ + ?AssertReaderHeld@Mutex@absl@@QBEXXZ + ?AssertSameContainer@container_internal@absl@@YAXPBW4ctrl_t@12@0ABQBX1PBE2@Z + ?AssertValid@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@_N@Z + ?AssertValid@CordRepBtree@cord_internal@absl@@SAPBV123@PBV123@_N@Z + ?AssertValidType@FlagImpl@flags_internal@absl@@QBEXPBXP6APBVtype_info@@XZ@Z + ?AssignLargeString@Cord@absl@@AAEAAV12@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AssignNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QAEXPAUPayload@status_internal@3@@Z + ?AssignSlow@InlineRep@Cord@absl@@AAEXABV123@@Z + ?AsyncSignalSafeWriteError@raw_log_internal@absl@@YAXPBDI@Z + ?At@TimeZone@absl@@QBE?AUCivilInfo@12@VTime@2@@Z + ?At@TimeZone@absl@@QBE?AUTimeInfo@12@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@2@@Z + ?AtLocation@LogMessage@log_internal@absl@@QAEAAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?AtomicBufferValue@FlagImpl@flags_internal@absl@@ABEPAU?$atomic@_K@__Cr@std@@XZ + ?Avail@FormatSinkImpl@str_format_internal@absl@@ABEIXZ + ?Await@Mutex@absl@@QAEXABVCondition@2@@Z + ?AwaitCommon@Mutex@absl@@AAE_NABVCondition@2@VKernelTimeout@synchronization_internal@2@@Z + ?Base64Escape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?Base64Escape@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?Base64EscapeInternal@strings_internal@absl@@YAIPBEIPADIPBD_N@Z + ?Base64Unescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?Basename@flags_internal@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@@Z + ?BindWithPack@str_format_internal@absl@@YA_NPBUUnboundConversion@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@PAVBoundConversion@12@@Z + ?BitCastToSigned@int128_internal@absl@@YA_J_K@Z + ?Block@Barrier@absl@@QAE_NXZ + ?Block@Mutex@absl@@AAEXPAUPerThreadSynch@base_internal@2@@Z + ?BreakTime@Impl@time_zone@cctz@time_internal@absl@@QBE?AUabsolute_lookup@2345@ABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BreakTime@TimeZoneInfo@cctz@time_internal@absl@@UBE?AUabsolute_lookup@time_zone@234@ABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BreakTime@TimeZoneLibC@cctz@time_internal@absl@@UBE?AUabsolute_lookup@time_zone@234@ABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BufferSizeFor@log_internal@absl@@YAI_KW4WireType@12@@Z + ?BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@12@@Z + ?BytesToHexString@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CPUSupportsRandenHwAes@random_internal@absl@@YA_NXZ + ?CUnescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@1@Z + ?CalculateBase64EscapedLenInternal@strings_internal@absl@@YAII_N@Z + ?CallVoidPtrFunction@Condition@absl@@CA_NPBV12@@Z + ?CancelledError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Capacity@CordRepFlat@cord_internal@absl@@QBEIXZ + ?CapacityToGrowth@container_internal@absl@@YAII@Z + ?CappedDamerauLevenshteinDistance@strings_internal@absl@@YAEV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0E@Z + ?CatPieces@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$initializer_list@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@5@@Z + ?Ceil@absl@@YA?AVDuration@1@V21@0@Z + ?CheckDefaultValueParsingRoundtrip@FlagImpl@flags_internal@absl@@EBEXXZ + ?CheckDefaultValueParsingRoundtrip@PrivateHandleAccessor@flags_internal@absl@@SAXABVCommandLineFlag@3@@Z + ?CheckFastPathSetting@str_format_internal@absl@@YA_NABUUnboundConversion@12@@Z + ?CheckInvariants@GraphCycles@synchronization_internal@absl@@QBE_NXZ + ?CheckMask@MaskedPointer@flags_internal@absl@@ABE_NI@Z + ?CheckstrcasecmpfalseImpl@log_internal@absl@@YAPBDPBD00@Z + ?CheckstrcasecmptrueImpl@log_internal@absl@@YAPBDPBD00@Z + ?CheckstrcmpfalseImpl@log_internal@absl@@YAPBDPBD00@Z + ?CheckstrcmptrueImpl@log_internal@absl@@YAPBDPBD00@Z + ?Checksum@CrcCordState@crc_internal@absl@@QBE?AVcrc32c_t@3@XZ + ?ChunkRemaining@Cord@absl@@SA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABVCharIterator@12@@Z + ?Chunks@Cord@absl@@QBE?AVChunkRange@12@XZ + ?CityHash32@hash_internal@absl@@YAIPBDI@Z + ?CityHash64@hash_internal@absl@@YA_KPBDI@Z + ?CityHash64WithSeed@hash_internal@absl@@YA_KPBDI_K@Z + ?CityHash64WithSeeds@hash_internal@absl@@YA_KPBDI_K1@Z + ?Clear@Cord@absl@@QAEXXZ + ?ClearBackingArray@container_internal@absl@@YAXAAVCommonFields@12@ABUPolicyFunctions@12@PAX_N3@Z + ?ClearCurrentThreadIdentity@base_internal@absl@@YAXXZ + ?ClearLogBacktraceLocation@absl@@YAXXZ + ?ClearTimeZoneMapTestOnly@Impl@time_zone@cctz@time_internal@absl@@SAXXZ + ?Clone@flags_internal@absl@@YAPAXP6APAXW4FlagOp@12@PBXPAX2@Z1@Z + ?CloneAndUnref@StatusRep@status_internal@absl@@QBEPAV123@XZ + ?CodeToInlinedRep@Status@absl@@CAIW4StatusCode@2@@Z + ?CombineContiguousImpl@hash_internal@absl@@YA_K_KPBEIU?$integral_constant@H$03@__Cr@std@@@Z + ?CombineContiguousImpl@hash_internal@absl@@YA_K_KPBEIU?$integral_constant@H$07@__Cr@std@@@Z + ?CombineLargeContiguousImplOn32BitLengthGt8@hash_internal@absl@@YA_KPBEI_K@Z + ?CombineLargeContiguousImplOn64BitLengthGt32@hash_internal@absl@@YA_KPBEI_K@Z + ?CommitTree@InlineRep@Cord@absl@@QAEXPBUCordRep@cord_internal@3@PAU453@ABVCordzUpdateScope@53@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?Compare@Cord@absl@@QBEHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?CompareImpl@Cord@absl@@ABEHABV12@@Z + ?CompareSlowPath@Cord@absl@@ABEHABV12@II@Z + ?CompareSlowPath@Cord@absl@@ABEHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@II@Z + ?Compute@CrcNonTemporalMemcpyAVXEngine@crc_internal@absl@@UBE?AVcrc32c_t@3@PIAXPIBXIV43@@Z + ?Compute@CrcNonTemporalMemcpyEngine@crc_internal@absl@@UBE?AVcrc32c_t@3@PIAXPIBXIV43@@Z + ?Compute@FallbackCrcMemcpyEngine@crc_internal@absl@@UBE?AVcrc32c_t@3@PIAXPIBXIV43@@Z + ?ComputeCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SAIII@Z + ?ComputeCapacity@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SAIII@Z + ?ConcatCrc32c@absl@@YA?AVcrc32c_t@1@V21@0I@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@V?$move_iterator@PAPAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QAEXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@3@@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PAVLogSink@absl@@@__Cr@std@@V?$move_iterator@PAPAVLogSink@absl@@@23@@inlined_vector_internal@absl@@QAEXAAV?$allocator@PAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@3@@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@QAEXAAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@3@@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QAEXAAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@3@@Z + ?ConstructNext@?$IteratorValueAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PBVFormatArgImpl@str_format_internal@absl@@@inlined_vector_internal@absl@@QAEXAAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PAVFormatArgImpl@str_format_internal@3@@Z + ?Consume@cord_internal@absl@@YAXPAUCordRep@12@V?$FunctionRef@$$A6AXPAUCordRep@cord_internal@absl@@II@Z@2@@Z + ?ConsumeBeginTo@CordRepBtree@cord_internal@absl@@CAPAV123@PAV123@II@Z + ?ConsumePrefix@absl@@YA_NPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?ConsumeSuffix@absl@@YA_NPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?ConsumeUnboundConversion@str_format_internal@absl@@YAPBDPBD0PAUUnboundConversion@12@PAH@Z + ?ConsumeUnboundConversionNoInline@str_format_internal@absl@@YAPBDPBD0PAUUnboundConversion@12@PAH@Z + ?Contains@Cord@absl@@QBE_NABV12@@Z + ?Contains@Cord@absl@@QBE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Contains@str_format_internal@absl@@YA_NW4FormatConversionCharSet@2@D@Z + ?Contains@str_format_internal@absl@@YA_NW4FormatConversionCharSet@2@W4FormatConversionChar@2@@Z + ?ControlOffset@container_internal@absl@@YAI_N@Z + ?ControlWord@base_internal@absl@@YAPAU?$atomic@I@__Cr@std@@PAVonce_flag@2@@Z + ?ConvertBoolArg@str_format_internal@absl@@YA_N_NPAVFormatSinkImpl@12@@Z + ?ConvertDateTime@absl@@YA?AUTimeConversion@1@_JHHHHHVTimeZone@1@@Z + ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPAW4ctrl_t@12@I@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NMABVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NNABVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NOABVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?ConvertOne@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QAE_NABUUnboundConversion@34@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ConvertSpecialToEmptyAndFullToDeleted@GroupSse2Impl@container_internal@absl@@QBEXPAW4ctrl_t@23@@Z + ?Copy@CordRepBtree@cord_internal@absl@@ABEPAV123@XZ + ?Copy@container_internal@absl@@YAXAAVCommonFields@12@ABUPolicyFunctions@12@ABV312@V?$FunctionRef@$$A6AXPAXPBX@Z@2@@Z + ?Copy@flags_internal@absl@@YAXP6APAXW4FlagOp@12@PBXPAX2@Z12@Z + ?CopyBeginTo@CordRepBtree@cord_internal@absl@@ABEPAV123@II@Z + ?CopyConstruct@flags_internal@absl@@YAXP6APAXW4FlagOp@12@PBXPAX2@Z12@Z + ?CopyCordToString@absl@@YAXABVCord@1@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?CopyInlineToString@InlineData@cord_internal@absl@@QBEXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?CopyPrefix@CordRepBtree@cord_internal@absl@@AAE?AUCopyResult@123@I_N@Z + ?CopyRaw@CordRepBtree@cord_internal@absl@@ABEPAV123@I@Z + ?CopySuffix@CordRepBtree@cord_internal@absl@@AAE?AUCopyResult@123@I@Z + ?CopyTo@InlineRep@Cord@absl@@QBEXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?CopyToArray@InlineRep@Cord@absl@@QBEXPAD@Z + ?CopyToArrayImpl@Cord@absl@@ABEXPAD@Z + ?CopyToArraySlowPath@Cord@absl@@ABEXPAD@Z + ?CopyToEndFrom@CordRepBtree@cord_internal@absl@@ABEPAV123@II@Z + ?Crash@Helper@internal_statusor@absl@@SAXABVStatus@3@@Z + ?Crc32CAndCopy@crc_internal@absl@@YA?AVcrc32c_t@2@PIAXPIBXIV32@_N@Z + ?Crc32c@CRC@crc_internal@absl@@SAPAV123@XZ + ?CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@3@PIAXPIBXIV43@_N@Z + ?Create@CordRepBtree@cord_internal@absl@@SAPAV123@PAUCordRep@23@@Z + ?Create@CordRepFlat@cord_internal@absl@@SAPAU123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ?CreateSlow@CordRepBtree@cord_internal@absl@@CAPAV123@PAUCordRep@23@@Z + ?CreateThreadIdentity@synchronization_internal@absl@@YAPAUThreadIdentity@base_internal@2@XZ + ?CreateWithCustomLimit@CordBuffer@absl@@SA?AV12@II@Z + ?CreateWithDefaultLimit@CordBuffer@absl@@SA?AV12@I@Z + ?Current@CordRepBtreeNavigator@cord_internal@absl@@QBEPAUCordRep@23@XZ + ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPAUThreadIdentity@12@XZ + ?CurrentValue@FlagImpl@flags_internal@absl@@EBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Data@CordRepBtree@cord_internal@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ?Data@CordRepFlat@cord_internal@absl@@QAEPADXZ + ?Data@CordRepFlat@cord_internal@absl@@QBEPBDXZ + ?DataGuard@FlagImpl@flags_internal@absl@@ABEAAVMutex@3@XZ + ?DataLossError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?DeadlineExceededError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Deallocate@?$MallocAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@3@I@Z + ?Deallocate@?$MallocAdapter@V?$allocator@PAVLogSink@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAAV?$allocator@PAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@3@I@Z + ?Deallocate@?$MallocAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@3@I@Z + ?Deallocate@?$MallocAdapter@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@PAVFormatArgImpl@str_format_internal@3@I@Z + ?DeallocateIfAllocated@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXXZ + ?DeallocateIfAllocated@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXXZ + ?DeallocateIfAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXXZ + ?DeallocateIfAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXXZ + ?DecodeFrom@ProtoField@log_internal@absl@@QAE_NPAV?$Span@$$CBD@3@@Z + ?DecodeRustPunycode@debugging_internal@absl@@YAPADUDecodeRustPunycodeOptions@12@@Z + ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_JI@Z + ?Decrement@RefcountAndFlags@cord_internal@absl@@QAE_NXZ + ?DecrementCount@BlockingCounter@absl@@QAE_NXZ + ?DecrementExpectHighRefcount@RefcountAndFlags@cord_internal@absl@@QAE_NXZ + ?DecrementSynchSem@Mutex@absl@@CA_NPAV12@PAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z + ?DeduceUsageFlags@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@XZ + ?DefaultCapacity@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CAIXZ + ?DefaultIterControl@container_internal@absl@@YAPAW4ctrl_t@12@XZ + ?DefaultKind@FlagImpl@flags_internal@absl@@ABE?AW4FlagDefaultKind@23@XZ + ?DefaultStackUnwinder@absl@@YAHPAPAXPAHHHPBX1@Z + ?DefaultStackUnwinder@internal_stacktrace@absl@@YAHPAPAXPAIPAHHHPBX2@Z + ?DefaultValue@FlagImpl@flags_internal@absl@@EBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Delete@CordRepBtree@cord_internal@absl@@SAXPAV123@@Z + ?Delete@CordRepExternal@cord_internal@absl@@SAXPAUCordRep@23@@Z + ?Delete@CordRepFlat@cord_internal@absl@@SAXPAUCordRep@23@@Z + ?Delete@CordzHandle@cord_internal@absl@@SAXPAV123@@Z + ?Delete@flags_internal@absl@@YAXP6APAXW4FlagOp@12@PBXPAX2@Z2@Z + ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPAUArena@123@@Z + ?Demangle@debugging_internal@absl@@YA_NPBDPADI@Z + ?DemangleRustSymbolEncoding@debugging_internal@absl@@YA_NPBDPADI@Z + ?DemangleString@debugging_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBD@Z + ?Description@Impl@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Description@TimeZoneInfo@cctz@time_internal@absl@@UBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Description@TimeZoneLibC@cctz@time_internal@absl@@UBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Destroy@CordRep@cord_internal@absl@@SAXPAU123@@Z + ?Destroy@CordRepBtree@cord_internal@absl@@SAXPAV123@@Z + ?Destroy@CordRepCrc@cord_internal@absl@@SAXPAU123@@Z + ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AAEXXZ + ?DestroyCordSlow@Cord@absl@@AAEXXZ + ?DestroyElements@?$DestroyAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$00@inlined_vector_internal@absl@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@3@I@Z + ?DestroyElements@?$DestroyAdapter@V?$allocator@PAVLogSink@absl@@@__Cr@std@@$00@inlined_vector_internal@absl@@SAXAAV?$allocator@PAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@3@I@Z + ?DestroyElements@?$DestroyAdapter@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@@inlined_vector_internal@absl@@SAXAAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@3@I@Z + ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QAE?AV?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QBE_NPBV123@@Z + ?DidAllocate@?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE_NXZ + ?DidAllocate@?$AllocationTransaction@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE_NXZ + ?DidAllocate@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE_NXZ + ?Die@LogMessage@log_internal@absl@@AAEXXZ + ?DieBecauseNull@log_internal@absl@@YAXPBDH0@Z + ?Digits10@?$BigUnsigned@$03@strings_internal@absl@@SAHXZ + ?Digits10@?$BigUnsigned@$0FE@@strings_internal@absl@@SAHXZ + ?DisableRescheduling@SchedulingGuard@base_internal@absl@@CA_NXZ + ?DoIgnoreLeak@absl@@YAXPBX@Z + ?DoLoad@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@ABVCord@absl@@@Z@base_internal@absl@@ABEP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@ABVCord@3@@ZXZ + ?DoLoad@?$AtomicHook@P6AXPBDH000@Z@base_internal@absl@@ABEP6AXPBDH000@ZXZ + ?DoLoad@?$AtomicHook@P6AXPBDPBX@Z@base_internal@absl@@ABEP6AXPBDPBX@ZXZ + ?DoLoad@?$AtomicHook@P6AXPBDPBX_J@Z@base_internal@absl@@ABEP6AXPBDPBX_J@ZXZ + ?DoLoad@?$AtomicHook@P6AXPBX_J@Z@base_internal@absl@@ABEP6AXPBX_J@ZXZ + ?DoLoad@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@ABEP6AXW4LogSeverity@3@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@ZXZ + ?DoLoad@?$AtomicHook@P6AXXZ@base_internal@absl@@ABEP6AXXZXZ + ?DoLoad@?$AtomicHook@P6AX_J@Z@base_internal@absl@@ABEP6AX_J@ZXZ + ?DoLoad@?$AtomicHook@P6A_NW4LogSeverity@absl@@PBDHPAPADPAH@Z@base_internal@absl@@ABEP6A_NW4LogSeverity@3@PBDHPAPADPAH@ZXZ + ?DoStore@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@ABVCord@absl@@@Z@base_internal@absl@@AAE_NP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@ABVCord@3@@Z@Z + ?DoStore@?$AtomicHook@P6AXPBDH000@Z@base_internal@absl@@AAE_NP6AXPBDH000@Z@Z + ?DoStore@?$AtomicHook@P6AXPBDPBX@Z@base_internal@absl@@AAE_NP6AXPBDPBX@Z@Z + ?DoStore@?$AtomicHook@P6AXPBDPBX_J@Z@base_internal@absl@@AAE_NP6AXPBDPBX_J@Z@Z + ?DoStore@?$AtomicHook@P6AXPBX_J@Z@base_internal@absl@@AAE_NP6AXPBX_J@Z@Z + ?DoStore@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@AAE_NP6AXW4LogSeverity@3@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@Z + ?DoStore@?$AtomicHook@P6AXXZ@base_internal@absl@@AAE_NP6AXXZ@Z + ?DoStore@?$AtomicHook@P6AX_J@Z@base_internal@absl@@AAE_NP6AX_J@Z@Z + ?DoStore@?$AtomicHook@P6A_NW4LogSeverity@absl@@PBDHPAPADPAH@Z@base_internal@absl@@AAE_NP6A_NW4LogSeverity@3@PBDHPAPADPAH@Z@Z + ?Dtor@Mutex@absl@@AAEXXZ + ?DummyFunction@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@ABVCord@absl@@@Z@base_internal@absl@@CA?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@ABVCord@3@@Z + ?DummyFunction@?$AtomicHook@P6AXPBDH000@Z@base_internal@absl@@CAXPBDH000@Z + ?DummyFunction@?$AtomicHook@P6AXPBDPBX@Z@base_internal@absl@@CAXPBDPBX@Z + ?DummyFunction@?$AtomicHook@P6AXPBDPBX_J@Z@base_internal@absl@@CAXPBDPBX_J@Z + ?DummyFunction@?$AtomicHook@P6AXPBX_J@Z@base_internal@absl@@CAXPBX_J@Z + ?DummyFunction@?$AtomicHook@P6AXXZ@base_internal@absl@@CAXXZ + ?DummyFunction@?$AtomicHook@P6AX_J@Z@base_internal@absl@@CAX_J@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPBUCordRep@23@AAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPBUCordRep@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@67@@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPBUCordRep@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_NAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@67@@Z + ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXQAXQBQAXQAHHH_NP6AXPBDPAX@Z5@Z + ?DumpStackTrace@debugging_internal@absl@@YAXHH_NP6AXPBDPAX@Z2@Z + ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z + ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z + ?Edge@CordRepBtree@cord_internal@absl@@QBEPAUCordRep@23@I@Z + ?Edge@CordRepBtree@cord_internal@absl@@QBEPAUCordRep@23@W4EdgeType@123@@Z + ?EdgeData@cord_internal@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PBUCordRep@12@@Z + ?Edges@CordRepBtree@cord_internal@absl@@QBE?AV?$Span@QAUCordRep@cord_internal@absl@@@3@II@Z + ?Edges@CordRepBtree@cord_internal@absl@@QBE?AV?$Span@QAUCordRep@cord_internal@absl@@@3@XZ + ?EmplaceTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@ABVInlineData@53@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?EmplaceTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?EmptyGeneration@container_internal@absl@@YAPAEXZ + ?EmptyString@Status@absl@@CAPBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?EnableDebugLog@CondVar@absl@@QAEXPBD@Z + ?EnableDebugLog@Mutex@absl@@QAEXPBD@Z + ?EnableInvariantDebugging@Mutex@absl@@QAEXP6AXPAX@Z0@Z + ?EnableLogPrefix@absl@@YAX_N@Z + ?EnableMutexInvariantDebugging@absl@@YAX_N@Z + ?EnableRescheduling@SchedulingGuard@base_internal@absl@@CAX_N@Z + ?EnableSymbolizeLogStackTrace@log_internal@absl@@YAX_N@Z + ?Encode32Bit@log_internal@absl@@YA_N_KHPAV?$Span@D@2@@Z + ?Encode32Bit@log_internal@absl@@YA_N_KIPAV?$Span@D@2@@Z + ?Encode64Bit@log_internal@absl@@YA_N_K0PAV?$Span@D@2@@Z + ?Encode64Bit@log_internal@absl@@YA_N_K_JPAV?$Span@D@2@@Z + ?EncodeBytes@log_internal@absl@@YA_N_KV?$Span@$$CBD@2@PAV?$Span@D@2@@Z + ?EncodeBytesTruncate@log_internal@absl@@YA_N_KV?$Span@$$CBD@2@PAV?$Span@D@2@@Z + ?EncodeDouble@log_internal@absl@@YA_N_KNPAV?$Span@D@2@@Z + ?EncodeFloat@log_internal@absl@@YA_N_KMPAV?$Span@D@2@@Z + ?EncodeMessageLength@log_internal@absl@@YAXV?$Span@D@2@PBV32@@Z + ?EncodeMessageStart@log_internal@absl@@YA?AV?$Span@D@2@_K0PAV32@@Z + ?EncodeStringTruncate@log_internal@absl@@YA_N_KV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$Span@D@2@@Z + ?EncodeStructuredProtoField@log_internal@absl@@YA_NUStructuredProtoField@12@AAV?$Span@D@2@@Z + ?EncodeUTF8Char@strings_internal@absl@@YAIPAD_U@Z + ?EncodeVarint@log_internal@absl@@YA_N_K0PAV?$Span@D@2@@Z + ?EncodeVarint@log_internal@absl@@YA_N_KHPAV?$Span@D@2@@Z + ?EncodeVarint@log_internal@absl@@YA_N_KIPAV?$Span@D@2@@Z + ?EncodeVarint@log_internal@absl@@YA_N_K_JPAV?$Span@D@2@@Z + ?EncodeWaitCycles@SpinLock@base_internal@absl@@KAI_J0@Z + ?EndsWith@Cord@absl@@QBE_NABV12@@Z + ?EndsWith@Cord@absl@@QBE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?EndsWith@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EndsWithIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EqualsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EqualsImpl@Cord@absl@@ABE_NABV12@I@Z + ?EqualsImpl@Cord@absl@@ABE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@ABE_NEE@Z + ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAUPayload@status_internal@3@PBU453@0@Z + ?EraseMetaOnlyLarge@container_internal@absl@@YAXAAVCommonFields@12@PBW4ctrl_t@12@I@Z + ?EraseMetaOnlySmall@container_internal@absl@@YAXAAVCommonFields@12@_NI@Z + ?ErasePayload@StatusRep@status_internal@absl@@QAE?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z + ?Eval@Condition@absl@@QBE_NXZ + ?Excess@str_format_internal@absl@@YAIII@Z + ?ExitOnDFatal@log_internal@absl@@YA_NXZ + ?ExpectedChecksum@Cord@absl@@QBE?AV?$optional@I@__Cr@std@@XZ + ?Extend@CRC32@crc_internal@absl@@UBEXPAIPBXI@Z + ?ExtendByZeroes@CRC32@crc_internal@absl@@UBEXPAII@Z + ?ExtendByZeroesImpl@CRC32@crc_internal@absl@@CAXPAIIQBI1@Z + ?ExtendCrc32c@absl@@YA?AVcrc32c_t@1@V21@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ExtendCrc32cByZeroes@absl@@YA?AVcrc32c_t@1@V21@I@Z + ?ExtendCrc32cInline@crc_internal@absl@@YA_NPAIPBDI@Z + ?ExtendCrc32cInternal@crc_internal@absl@@YA?AVcrc32c_t@2@V32@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ExtendTransitions@TimeZoneInfo@cctz@time_internal@absl@@AAE_NXZ + ?ExtractAppendBuffer@CordRepBtree@cord_internal@absl@@SA?AUExtractResult@CordRep@23@PAV123@I@Z + ?ExtractFront@CordRepBtree@cord_internal@absl@@CAPAUCordRep@23@PAV123@@Z + ?FDivDuration@absl@@YANVDuration@1@0@Z + ?FLAGS_noflagfile@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FNMatch@log_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?FailQuietly@LogMessage@log_internal@absl@@KAXXZ + ?FailWithoutStackTrace@LogMessage@log_internal@absl@@KAXXZ + ?FailedPreconditionError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FailureSignalToString@debugging_internal@absl@@YAPBDH@Z + ?FastHexToBufferZeroPad16@numbers_internal@absl@@YAI_KPAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPADHPAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPADIPAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPAD_JPAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPAD_KPAD@Z + ?FastTypeId@flags_internal@absl@@YAPBXP6APAXW4FlagOp@12@PBXPAX2@Z@Z + ?Fer@Mutex@absl@@AAEXPAUPerThreadSynch@base_internal@2@@Z + ?Filename@FlagImpl@flags_internal@absl@@EBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?FillParentStack@CordzInfo@cord_internal@absl@@CAIPBV123@PAPAX@Z + ?FillWordTable@CRCImpl@crc_internal@absl@@SAXIIHPAY0BAA@I@Z + ?FillZeroesTable@CRCImpl@crc_internal@absl@@SAHIPAY0BAA@I@Z + ?FinalizeEncodingAndFormat@LogMessageData@LogMessage@log_internal@absl@@QAEXXZ + ?FinalizeRegistry@flags_internal@absl@@YAXXZ + ?Find@ByAnyChar@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@I@Z + ?Find@ByAsciiWhitespace@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@I@Z + ?Find@ByChar@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@I@Z + ?Find@ByLength@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@I@Z + ?Find@ByString@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@I@Z + ?Find@Cord@absl@@QBE?AVCharIterator@12@ABV12@@Z + ?Find@Cord@absl@@QBE?AVCharIterator@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindCommandLineFlag@absl@@YAPAVCommandLineFlag@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindFlag@FlagRegistry@flags_internal@absl@@QAEPAVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindFlatStartPiece@InlineRep@Cord@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?FindImpl@Cord@absl@@ABE?AVCharIterator@12@V312@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindLongestCommonPrefix@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@0@Z + ?FindLongestCommonSuffix@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@0@Z + ?FindPath@GraphCycles@synchronization_internal@absl@@QBEHUGraphId@23@0HQAU423@@Z + ?FiveToTheNth@?$BigUnsigned@$03@strings_internal@absl@@SA?AV123@H@Z + ?FiveToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@SA?AV123@H@Z + ?FixUpStack@internal_stacktrace@absl@@YAXPAPAXPAIPAHIAAI@Z + ?FixedOffsetFromName@cctz@time_internal@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FixedOffsetToAbbr@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FixedOffsetToName@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FlagHelp@flags_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABVCommandLineFlag@2@W4HelpFormat@12@@Z + ?FlagsContains@str_format_internal@absl@@YA_NW4Flags@12@0@Z + ?FlagsHelp@flags_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@W4HelpFormat@12@1@Z + ?FlagsToString@FormatConversionSpecImplFriend@str_format_internal@absl@@SA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVFormatConversionSpecImpl@23@@Z + ?FlagsToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4Flags@12@@Z + ?FlatOverhead@CordTestAccess@strings_internal@absl@@SAIXZ + ?FlatTagToLength@CordTestAccess@strings_internal@absl@@SAIE@Z + ?FlattenSlowPath@Cord@absl@@AAE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Floor@absl@@YA?AVDuration@1@V21@0@Z + ?Flush@FormatSinkImpl@str_format_internal@absl@@QAEXXZ + ?Flush@LogMessage@log_internal@absl@@QAEXXZ + ?Flush@LogSink@absl@@UAEXXZ + ?FlushLogSinks@absl@@YAXXZ + ?FlushLogSinks@log_internal@absl@@YAXXZ + ?ForEachChunkAux@Cord@absl@@CAXPAUCordRep@cord_internal@2@V?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z@2@@Z + ?ForEachFlag@flags_internal@absl@@YAXV?$function@$$A6AXAAVCommandLineFlag@absl@@@Z@__Cr@std@@@Z + ?ForEachPayload@StatusRep@status_internal@absl@@QBEXV?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABVCord@absl@@@Z@3@@Z + ?ForVar1@CheckOpMessageBuilder@log_internal@absl@@QAEAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?ForVar2@CheckOpMessageBuilder@log_internal@absl@@QAEAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?ForcedTrySample@container_internal@absl@@YA?AVHashtablezInfoHandle@12@IIIG@Z + ?ForgetDeadlockInfo@Mutex@absl@@QAEXXZ + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatConversionCharIsFloat@str_format_internal@absl@@YA_NW4FormatConversionChar@2@@Z + ?FormatConversionCharIsUpper@str_format_internal@absl@@YA_NW4FormatConversionChar@2@@Z + ?FormatConversionCharToChar@str_format_internal@absl@@YADW4FormatConversionChar@2@@Z + ?FormatConversionCharToConvInt@str_format_internal@absl@@YA_KD@Z + ?FormatConversionCharToConvInt@str_format_internal@absl@@YA_KW4FormatConversionChar@2@@Z + ?FormatConversionCharToConvValue@str_format_internal@absl@@YA?AW4FormatConversionCharSet@2@D@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0BPPPL@@12@DVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0BPPPL@@12@_WVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAA@@12@UVoidPtr@12@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@$$TVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@PBDVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@PB_WVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@ABV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@MVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@NVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@OVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@CVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@EVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@FVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@GVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@HVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@IVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@JVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@KVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@Vint128@2@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@Vuint128@2@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@_JVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@_KVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatDuration@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?FormatLogMessage@log_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LogSeverity@2@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@2@VDuration@2@IV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@HW4PrefixFormat@12@3@Z + ?FormatLogPrefix@log_internal@absl@@YAIW4LogSeverity@2@VTime@2@IV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4PrefixFormat@12@AAV?$Span@D@2@@Z + ?FormatPack@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@VTime@1@VTimeZone@1@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@VTimeZone@1@@Z + ?FormatUntyped@str_format_internal@absl@@YA_NVFormatRawSinkImpl@12@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?FprintF@str_format_internal@absl@@YAHPAU_iobuf@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?Free@LowLevelAlloc@base_internal@absl@@SAXPAX@Z + ?Frequency@CycleClock@base_internal@absl@@SANXZ + ?Frequency@UnscaledCycleClock@base_internal@absl@@CANXZ + ?FromChrono@absl@@YA?AVDuration@1@ABV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@@Z + ?FromChrono@absl@@YA?AVTime@1@ABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?FromCivil@absl@@YA?AVTime@1@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTimeZone@1@@Z + ?FromHost16@little_endian@absl@@YAGG@Z + ?FromHost32@little_endian@absl@@YAII@Z + ?FromHost64@little_endian@absl@@YA_K_K@Z + ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0DM@$00@__Cr@std@@@Z + ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0OBA@$00@__Cr@std@@@Z + ?FromTM@absl@@YA?AVTime@1@ABUtm@@VTimeZone@1@@Z + ?FromUDate@absl@@YA?AVTime@1@N@Z + ?FromUniversal@absl@@YA?AVTime@1@_J@Z + ?FromUnixDuration@time_internal@absl@@YA?AVTime@2@VDuration@2@@Z + ?FromUnixNanos@absl@@YA?AVTime@1@_J@Z + ?FromUnixSeconds@cctz@time_internal@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@_J@Z + ?Generate@Randen@random_internal@absl@@QBEXPAX@Z + ?Generate@RandenHwAes@random_internal@absl@@SAXPBXPAX@Z + ?Generate@RandenSlow@random_internal@absl@@SAXPBXPAX@Z + ?Get@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@ABE?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ + ?Get@?$FlagValue@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$02@flags_internal@absl@@QBE_NABVSequenceLock@23@AAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@Z + ?Get@HiRep@Duration@absl@@QBE_JXZ + ?Get@RefcountAndFlags@cord_internal@absl@@QBEIXZ + ?GetAllFlags@absl@@YA?AV?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@23@@1@XZ + ?GetAllocatedCapacity@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEIXZ + ?GetAllocatedCapacity@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEIXZ + ?GetAllocatedCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEIXZ + ?GetAllocatedCapacity@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEIXZ + ?GetAllocatedData@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAPAUCordRep@cord_internal@3@XZ + ?GetAllocatedData@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAPAVLogSink@3@XZ + ?GetAllocatedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAUPayload@status_internal@3@XZ + ?GetAllocatedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEPBUPayload@status_internal@3@XZ + ?GetAllocatedData@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAVFormatArgImpl@str_format_internal@3@XZ + ?GetAllocatedData@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEPBVFormatArgImpl@str_format_internal@3@XZ + ?GetAllocator@?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$AllocationTransaction@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@PAVLogSink@absl@@@__Cr@std@@XZ + ?GetAllocator@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@PAVLogSink@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEABV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?GetAllocator@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@XZ + ?GetAndroidNativeTag@log_internal@absl@@YAPBDXZ + ?GetAppendBuffer@CordRepBtree@cord_internal@absl@@QAE?AV?$Span@D@3@I@Z + ?GetAppendBufferSlow@CordRepBtree@cord_internal@absl@@AAE?AV?$Span@D@3@I@Z + ?GetAppendBufferSlowPath@Cord@absl@@AAE?AVCordBuffer@2@III@Z + ?GetArchSpecificEngines@CrcMemcpy@crc_internal@absl@@CA?AUArchSpecificEngines@123@XZ + ?GetCachedTID@base_internal@absl@@YAIXZ + ?GetCapacity@?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAIXZ + ?GetCapacity@?$AllocationTransaction@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAIXZ + ?GetCapacity@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAIXZ + ?GetCharacter@CordRepBtree@cord_internal@absl@@QBEDI@Z + ?GetCond@WinHelper@Win32Waiter@synchronization_internal@absl@@SAPAU_RTL_CONDITION_VARIABLE@@PAV234@@Z + ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QBE?AUCordzStatistics@23@XZ + ?GetCpuType@crc_internal@absl@@YA?AW4CpuType@12@XZ + ?GetCurrentTimeNanos@absl@@YA_JXZ + ?GetData@?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAPAPAUCordRep@cord_internal@3@XZ + ?GetData@?$AllocationTransaction@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAPAPAVLogSink@3@XZ + ?GetData@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAPAUPayload@status_internal@3@XZ + ?GetDebugStackTraceHook@debugging_internal@absl@@YAP6AXQBQAXHP6AXPBDPAX@Z2@ZXZ + ?GetEntropyFromRandenPool@random_internal@absl@@YAXPAXI@Z + ?GetEstimatedFairShareMemoryUsage@cord_internal@absl@@YAIPBUCordRep@12@@Z + ?GetEstimatedMemoryUsage@cord_internal@absl@@YAIPBUCordRep@12@@Z + ?GetFirstChunk@Cord@absl@@CA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV12@@Z + ?GetFirstChunk@Cord@absl@@CA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@@Z + ?GetFlagsHelpFormat@flags_internal@absl@@YA?AW4HelpFormat@12@XZ + ?GetFlagsHelpMatchSubstr@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?GetFlagsHelpMode@flags_internal@absl@@YA?AW4HelpMode@12@XZ + ?GetFlatAux@Cord@absl@@CA_NPAUCordRep@cord_internal@2@PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?GetGrowthInfoFromControl@container_internal@absl@@YAAAVGrowthInfo@12@PAW4ctrl_t@12@@Z + ?GetGrowthLeft@GrowthInfo@container_internal@absl@@QBEIXZ + ?GetHashtablezMaxSamples@container_internal@absl@@YAIXZ + ?GetHashtablezSampleParameter@container_internal@absl@@YAHXZ + ?GetId@GraphCycles@synchronization_internal@absl@@QAE?AUGraphId@23@PAX@Z + ?GetInlinedCapacity@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEIXZ + ?GetInlinedCapacity@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEIXZ + ?GetInlinedCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEIXZ + ?GetInlinedCapacity@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEIXZ + ?GetInlinedData@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAPAUCordRep@cord_internal@3@XZ + ?GetInlinedData@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAPAVLogSink@3@XZ + ?GetInlinedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAUPayload@status_internal@3@XZ + ?GetInlinedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEPBUPayload@status_internal@3@XZ + ?GetInlinedData@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAVFormatArgImpl@str_format_internal@3@XZ + ?GetInlinedData@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEPBVFormatArgImpl@str_format_internal@3@XZ + ?GetIsAllocated@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBE_NXZ + ?GetIsAllocated@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBE_NXZ + ?GetIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBE_NXZ + ?GetIsAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBE_NXZ + ?GetKeys@RandenHwAes@random_internal@absl@@SAPBXXZ + ?GetKeys@RandenSlow@random_internal@absl@@SAPBXXZ + ?GetLock@WinHelper@Win32Waiter@synchronization_internal@absl@@SAPAU_RTL_SRWLOCK@@PAV234@@Z + ?GetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QBEIXZ + ?GetMisspellingHints@flags_internal@absl@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?GetMorePreciseMemoryUsage@cord_internal@absl@@YAIPBUCordRep@12@@Z + ?GetOrCreateCurrentThreadIdentity@synchronization_internal@absl@@YAPAUThreadIdentity@base_internal@2@XZ + ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PBV123@@Z + ?GetParentStack@CordzInfo@cord_internal@absl@@QBE?AV?$Span@QAX@3@XZ + ?GetPayload@StatusRep@status_internal@absl@@QBE?AV?$optional@VCord@absl@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@@Z + ?GetPolicyFunctions@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CAABUPolicyFunctions@23@XZ + ?GetProgramCounter@debugging_internal@absl@@YAPAXQAX@Z + ?GetRefForEmptyClass@container_internal@absl@@YAPAXAAVCommonFields@12@@Z + ?GetRepHi@time_internal@absl@@YA_JVDuration@2@@Z + ?GetRepLo@time_internal@absl@@YAIVDuration@2@@Z + ?GetSaltMaterial@random_internal@absl@@YA?AV?$optional@I@__Cr@std@@XZ + ?GetSize@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEIXZ + ?GetSize@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEIXZ + ?GetSize@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEIXZ + ?GetSize@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEIXZ + ?GetSizeAndIsAllocated@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAIXZ + ?GetSizeAndIsAllocated@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEABIXZ + ?GetSizeAndIsAllocated@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAIXZ + ?GetSizeAndIsAllocated@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEABIXZ + ?GetSizeAndIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAIXZ + ?GetSizeAndIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEABIXZ + ?GetSizeAndIsAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEAAIXZ + ?GetSizeAndIsAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QBEABIXZ + ?GetSkipCount@ExponentialBiased@profiling_internal@absl@@QAE_J_J@Z + ?GetStack@CordzInfo@cord_internal@absl@@QBE?AV?$Span@QAX@3@XZ + ?GetStackFrames@internal_stacktrace@absl@@YAHPAPAXPAIPAHHH@Z + ?GetStackFramesWithContext@internal_stacktrace@absl@@YAHPAPAXPAIPAHHHPBX2@Z + ?GetStackTrace@GraphCycles@synchronization_internal@absl@@QAEHUGraphId@23@PAPAPAX@Z + ?GetStackTrace@absl@@YAHPAPAXHH@Z + ?GetStackTraceWithContext@absl@@YAHPAPAXHHPBXPAH@Z + ?GetStatusPayloadPrinter@status_internal@absl@@YAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@ABVCord@2@@ZXZ + ?GetStride@ExponentialBiased@profiling_internal@absl@@QAE_J_J@Z + ?GetTID@base_internal@absl@@YAIXZ + ?GetTagForChar@str_format_internal@absl@@YA?AVConvTag@12@D@Z + ?GetTestEngine@CrcMemcpy@crc_internal@absl@@SA?AV?$unique_ptr@VCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@HH@Z + ?GetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAPAU?$atomic@H@__Cr@std@@XZ + ?GetTransitionType@TimeZoneInfo@cctz@time_internal@absl@@AAE_NH_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAE@Z + ?GetUsageConfig@flags_internal@absl@@YA?AUFlagsUsageConfig@2@XZ + ?GetWaiter@?$WaiterCrtp@VWin32Waiter@synchronization_internal@absl@@@synchronization_internal@absl@@SAPAVWin32Waiter@23@PAUThreadIdentity@base_internal@3@@Z + ?GetWeekday@absl@@YA?AW4weekday@detail@cctz@time_internal@1@V?$civil_time@Usecond_tag@time_internal@absl@@@3451@@Z + ?GetWord@?$BigUnsigned@$03@strings_internal@absl@@QBEIH@Z + ?GetWord@?$BigUnsigned@$0FE@@strings_internal@absl@@QBEIH@Z + ?GetYearDay@absl@@YAHV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?GlobalHashtablezSampler@container_internal@absl@@YAAAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?GlobalList@CordzInfo@cord_internal@absl@@CAPAUList@123@XZ + ?GlobalRegistry@FlagRegistry@flags_internal@absl@@SAAAV123@XZ + ?GuaranteedEqual@Condition@absl@@SA_NPBV12@0@Z + ?Guard@?$NullGuard@C@log_internal@absl@@SAABCABC@Z + ?Guard@?$NullGuard@D@log_internal@absl@@SAABDABD@Z + ?Guard@?$NullGuard@E@log_internal@absl@@SAABEABE@Z + ?Guard@?$NullGuard@F@log_internal@absl@@SAABFABF@Z + ?Guard@?$NullGuard@G@log_internal@absl@@SAABGABG@Z + ?Guard@?$NullGuard@H@log_internal@absl@@SAABHABH@Z + ?Guard@?$NullGuard@I@log_internal@absl@@SAABIABI@Z + ?Guard@?$NullGuard@J@log_internal@absl@@SAABJABJ@Z + ?Guard@?$NullGuard@K@log_internal@absl@@SAABKABK@Z + ?Guard@?$NullGuard@M@log_internal@absl@@SAABMABM@Z + ?Guard@?$NullGuard@N@log_internal@absl@@SAABNABN@Z + ?Guard@?$NullGuard@PAX@log_internal@absl@@SAABQAXABQAX@Z + ?Guard@?$NullGuard@PBC@log_internal@absl@@SAPBCPBC@Z + ?Guard@?$NullGuard@PBD@log_internal@absl@@SAPBDPBD@Z + ?Guard@?$NullGuard@PBE@log_internal@absl@@SAPBEPBE@Z + ?Guard@?$NullGuard@PBX@log_internal@absl@@SAABQBXABQBX@Z + ?Guard@?$NullGuard@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@log_internal@absl@@SAABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV456@@Z + ?Guard@?$NullGuard@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@log_internal@absl@@SAABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV456@@Z + ?Guard@?$NullGuard@_J@log_internal@absl@@SAAB_JAB_J@Z + ?Guard@?$NullGuard@_K@log_internal@absl@@SAAB_KAB_K@Z + ?Guard@?$NullGuard@_N@log_internal@absl@@SAAB_NAB_N@Z + ?H1@container_internal@absl@@YAII@Z + ?H2@container_internal@absl@@YAEI@Z + ?HandleInvalidStatusCtorArg@Helper@internal_statusor@absl@@SAXPAVStatus@3@@Z + ?HandleUsageFlags@flags_internal@absl@@YA?AW4HelpMode@12@AAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@@Z + ?HasBeenNotifiedInternal@Notification@absl@@CA_NPBU?$atomic@_N@__Cr@std@@@Z + ?HasBeenRead@MaskedPointer@flags_internal@absl@@QBE_NXZ + ?HasEdge@GraphCycles@synchronization_internal@absl@@QBE_NUGraphId@23@0@Z + ?HasNoDeleted@GrowthInfo@container_internal@absl@@QBE_NXZ + ?HasNoDeletedAndGrowthLeft@GrowthInfo@container_internal@absl@@QBE_NXZ + ?HasNoGrowthLeftAndNoDeleted@GrowthInfo@container_internal@absl@@QBE_NXZ + ?HasNoGrowthLeftAssumingMayHaveDeleted@GrowthInfo@container_internal@absl@@QBE_NXZ + ?HasNode@GraphCycles@synchronization_internal@absl@@QAE_NUGraphId@23@@Z + ?HasRandenHwAesImplementation@random_internal@absl@@YA_NXZ + ?HaveLeakSanitizer@absl@@YA_NXZ + ?Head@CordzInfo@cord_internal@absl@@SAPAV123@ABVCordzSnapshot@23@@Z + ?Help@FlagImpl@flags_internal@absl@@EBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?HelpSourceKind@FlagImpl@flags_internal@absl@@ABE?AW4FlagHelpKind@23@XZ + ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?HexStringToBytes@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?HideMask@base_internal@absl@@YAIXZ + ?IDivDuration@absl@@YA_JVDuration@1@0PAV21@@Z + ?In@Time@absl@@QBE?AUBreakdown@12@VTimeZone@2@@Z + ?InMillisecondsFromNow@KernelTimeout@synchronization_internal@absl@@QBEKXZ + ?InNanosecondsFromNow@KernelTimeout@synchronization_internal@absl@@ABE_JXZ + ?Increment@RefcountAndFlags@cord_internal@absl@@QAEXXZ + ?IncrementModificationCount@SequenceLock@flags_internal@absl@@QAEXXZ + ?IncrementSynchSem@Mutex@absl@@CAXPAV12@PAUPerThreadSynch@base_internal@2@@Z + ?IndexBefore@CordRepBtree@cord_internal@absl@@ABE?AUPosition@123@U4123@I@Z + ?IndexBeyond@CordRepBtree@cord_internal@absl@@ABE?AUPosition@123@I@Z + ?IndexOf@CordRepBtree@cord_internal@absl@@ABE?AUPosition@123@I@Z + ?IndexOfLength@CordRepBtree@cord_internal@absl@@ABE?AUPosition@123@I@Z + ?InfiniteDuration@absl@@YA?AVDuration@1@XZ + ?InfiniteFuture@absl@@YA?AVTime@1@XZ + ?InfinitePast@absl@@YA?AVTime@1@XZ + ?Init@CordRepBtreeReader@cord_internal@absl@@QAE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCordRepBtree@23@@Z + ?Init@FlagImpl@flags_internal@absl@@AAEXXZ + ?Init@PerThreadSem@synchronization_internal@absl@@CAXPAUThreadIdentity@base_internal@3@@Z + ?InitDiscreteDistribution@random_internal@absl@@YA?AV?$vector@U?$pair@NI@__Cr@std@@V?$allocator@U?$pair@NI@__Cr@std@@@23@@__Cr@std@@PAV?$vector@NV?$allocator@N@__Cr@std@@@45@@Z + ?InitFirst@CordRepBtreeNavigator@cord_internal@absl@@QAEPAUCordRep@23@PAVCordRepBtree@23@@Z + ?InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXABV123@@Z + ?InitGrowthLeftNoDeleted@GrowthInfo@container_internal@absl@@QAEXI@Z + ?InitInstance@CordRepBtree@cord_internal@absl@@AAEXHII@Z + ?InitSigSafeArena@base_internal@absl@@YAXXZ + ?InitTables@CRC32@crc_internal@absl@@UAEXXZ + ?InitTree@ChunkIterator@Cord@absl@@AAEXPAUCordRep@cord_internal@3@@Z + ?InitWhat@BadStatusOrAccess@absl@@ABEXXZ + ?Initialize@ExponentialBiased@profiling_internal@absl@@AAEXXZ + ?InitializeCordRepExternal@cord_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAUCordRepExternal@12@@Z + ?InitializeData@Storage@?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@AAEPADXZ + ?InitializeEncodingAndFormat@LogMessageData@LogMessage@log_internal@absl@@QAEXXZ + ?InitializeLog@absl@@YAXXZ + ?InitializeSymbolizer@absl@@YAXPBD@Z + ?InlinedRepToCode@Status@absl@@CA?AW4StatusCode@2@I@Z + ?InsertAndReturnSumOfPredecessors@?$BoundedUtf8LengthSequence@$0BAA@@debugging_internal@absl@@QAEIII@Z + ?InsertEdge@GraphCycles@synchronization_internal@absl@@QAE_NUGraphId@23@0@Z + ?InstallFailureSignalHandler@absl@@YAXABUFailureSignalHandlerOptions@1@@Z + ?Int128High64@absl@@YA_JVint128@1@@Z + ?Int128Low64@absl@@YA_KVint128@1@@Z + ?Int128Max@absl@@YA?AVint128@1@XZ + ?Int128Min@absl@@YA?AVint128@1@XZ + ?InternalAttemptToUseMutexInFatalSignalHandler@Mutex@absl@@SAXXZ + ?InternalCondVarPoke@StdcppWaiter@synchronization_internal@absl@@AAEXXZ + ?InternalCondVarPoke@Win32Waiter@synchronization_internal@absl@@AAEXXZ + ?InternalError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?InternalStream@LogMessage@log_internal@absl@@QAEAAV123@XZ + ?InvalidArgumentError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?InvalidGraphId@synchronization_internal@absl@@YA?AUGraphId@12@XZ + ?InvokeCallback@FlagImpl@flags_internal@absl@@QBEXXZ + ?IsAborted@absl@@YA_NABVStatus@1@@Z + ?IsAlreadyExists@absl@@YA_NABVStatus@1@@Z + ?IsBtree@CordRep@cord_internal@absl@@QBE_NXZ + ?IsCancelled@absl@@YA_NABVStatus@1@@Z + ?IsCooperative@SpinLock@base_internal@absl@@CA_NW4SchedulingMode@23@@Z + ?IsCordBtreeExhaustiveValidationEnabled@cord_internal@absl@@YA_NXZ + ?IsCrc@CordRep@cord_internal@absl@@QBE_NXZ + ?IsDataEdge@cord_internal@absl@@YA_NPBUCordRep@12@@Z + ?IsDataLoss@absl@@YA_NABVStatus@1@@Z + ?IsDeadlineExceeded@absl@@YA_NABVStatus@1@@Z + ?IsDeleted@container_internal@absl@@YA_NW4ctrl_t@12@@Z + ?IsEmpty@container_internal@absl@@YA_NW4ctrl_t@12@@Z + ?IsEmptyOrDeleted@container_internal@absl@@YA_NW4ctrl_t@12@@Z + ?IsExternal@CordRep@cord_internal@absl@@QBE_NXZ + ?IsFailedPrecondition@absl@@YA_NABVStatus@1@@Z + ?IsFatal@LogMessage@log_internal@absl@@ABE_NXZ + ?IsFlat@CordRep@cord_internal@absl@@QBE_NXZ + ?IsFlat@CordRepBtree@cord_internal@absl@@QBE_NIIPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?IsFlat@CordRepBtree@cord_internal@absl@@QBE_NPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?IsFull@container_internal@absl@@YA_NW4ctrl_t@12@@Z + ?IsHashtablezEnabled@container_internal@absl@@YA_NXZ + ?IsHeld@SpinLock@base_internal@absl@@QBE_NXZ + ?IsImmortal@RefcountAndFlags@cord_internal@absl@@QBE_NXZ + ?IsInfiniteDuration@time_internal@absl@@YA_NVDuration@2@@Z + ?IsInitialized@log_internal@absl@@YA_NXZ + ?IsInlined@Status@absl@@CA_NI@Z + ?IsInternal@absl@@YA_NABVStatus@1@@Z + ?IsInvalidArgument@absl@@YA_NABVStatus@1@@Z + ?IsMovedFrom@Status@absl@@CA_NI@Z + ?IsNormalized@CrcCordState@crc_internal@absl@@QBE_NXZ + ?IsNotFound@absl@@YA_NABVStatus@1@@Z + ?IsOne@RefcountAndFlags@cord_internal@absl@@QAE_NXZ + ?IsOutOfRange@absl@@YA_NABVStatus@1@@Z + ?IsPermissionDenied@absl@@YA_NABVStatus@1@@Z + ?IsPow2@CordBuffer@absl@@CA_NI@Z + ?IsReachable@GraphCycles@synchronization_internal@absl@@QBE_NUGraphId@23@0@Z + ?IsResourceExhausted@absl@@YA_NABVStatus@1@@Z + ?IsRetired@CommandLineFlag@absl@@UBE_NXZ + ?IsSame@InlineRep@Cord@absl@@QBE_NABV123@@Z + ?IsSampled@HashtablezInfoHandle@container_internal@absl@@QBE_NXZ + ?IsSmallCapacity@container_internal@absl@@YA_NI@Z + ?IsSooControl@container_internal@absl@@YA_NPBW4ctrl_t@12@@Z + ?IsSpecifiedOnCommandLine@FlagImpl@flags_internal@absl@@EBE_NXZ + ?IsSpecifiedOnCommandLine@PrivateHandleAccessor@flags_internal@absl@@SA_NABVCommandLineFlag@3@@Z + ?IsSubstring@CordRep@cord_internal@absl@@QBE_NXZ + ?IsUnauthenticated@absl@@YA_NABVStatus@1@@Z + ?IsUnavailable@absl@@YA_NABVStatus@1@@Z + ?IsUnimplemented@absl@@YA_NABVStatus@1@@Z + ?IsUnknown@absl@@YA_NABVStatus@1@@Z + ?IsUnprotectedReadCandidate@MaskedPointer@flags_internal@absl@@QBE_NXZ + ?IsValid@CordRepBtree@cord_internal@absl@@SA_NPBV123@_N@Z + ?IsValidCapacity@container_internal@absl@@YA_NI@Z + ?IterateOverFullSlots@container_internal@absl@@YAXABVCommonFields@12@IV?$FunctionRef@$$A6AXPBW4ctrl_t@container_internal@absl@@PAX@Z@2@@Z + ?KeyFunction@LogSink@absl@@EBEXXZ + ?LeadingZeros@?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@QBEIXZ + ?LeakCheckerIsActive@absl@@YA_NXZ + ?LengthModToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LengthMod@2@@Z + ?LengthToTag@CordTestAccess@strings_internal@absl@@SAEI@Z + ?Load16@big_endian@absl@@YAGPBX@Z + ?Load16@little_endian@absl@@YAGPBX@Z + ?Load32@big_endian@absl@@YAIPBX@Z + ?Load32@little_endian@absl@@YAIPBX@Z + ?Load64@little_endian@absl@@YA_KPBX@Z + ?Load@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@ABVCord@absl@@@Z@base_internal@absl@@QBEP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@ABVCord@3@@ZXZ + ?Load@?$AtomicHook@P6AXXZ@base_internal@absl@@QBEP6AXXZXZ + ?Load@TimeZoneInfo@cctz@time_internal@absl@@AAE_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?Load@TimeZoneInfo@cctz@time_internal@absl@@AAE_NPAVZoneInfoSource@234@@Z + ?LoadCycleClockSource@CycleClock@base_internal@absl@@CAP6A_JXZXZ + ?LoadTimeZone@Impl@time_zone@cctz@time_internal@absl@@SA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAV2345@@Z + ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@ABE?AUabsolute_lookup@time_zone@234@_JABUTransition@234@@Z + ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@ABE?AUabsolute_lookup@time_zone@234@_JABUTransitionType@234@@Z + ?LocalTimeZone@absl@@YA?AVTimeZone@1@XZ + ?Lock@CordzInfo@cord_internal@absl@@QAEXW4MethodIdentifier@CordzUpdateTracker@23@@Z + ?LockSlow@Mutex@absl@@AAEXPBUMuHowS@2@PBVCondition@2@H@Z + ?LockSlowLoop@Mutex@absl@@AAEXPAUSynchWaitParams@2@H@Z + ?LockSlowWithDeadline@Mutex@absl@@AAE_NPBUMuHowS@2@PBVCondition@2@VKernelTimeout@synchronization_internal@2@H@Z + ?LockWhen@Mutex@absl@@QAEXABVCondition@2@@Z + ?LockWhenCommon@Mutex@absl@@AAE_NABVCondition@2@VKernelTimeout@synchronization_internal@2@_N@Z + ?LockWhenWithDeadline@Mutex@absl@@QAE_NABVCondition@2@VTime@2@@Z + ?LockWhenWithTimeout@Mutex@absl@@QAE_NABVCondition@2@VDuration@2@@Z + ?Log2Ceil@CordBuffer@absl@@CAII@Z + ?Log2Floor@CordBuffer@absl@@CAII@Z + ?LogBacktraceIfNeeded@LogMessage@log_internal@absl@@AAEXXZ + ?LogFatalNodeType@cord_internal@absl@@YAXPAUCordRep@12@@Z + ?LogSeverityName@absl@@YAPBDW4LogSeverity@1@@Z + ?LogToSinks@log_internal@absl@@YAXABVLogEntry@2@V?$Span@PAVLogSink@absl@@@2@_N@Z + ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QAEXABV123@@Z + ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QAEXW4MethodIdentifier@123@_J@Z + ?LowestBitSet@?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@QBEIXZ + ?LowestBitSet@?$NonIterableBitMask@_K$07$02@container_internal@absl@@QBEIXZ + ?Make@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?Make@TimeZoneInfo@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?Make@TimeZoneLibC@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?MakeAbsNanos@KernelTimeout@synchronization_internal@absl@@QBE_JXZ + ?MakeAbsTimespec@KernelTimeout@synchronization_internal@absl@@QBE?AUtimespec@@XZ + ?MakeCheckFailString@status_internal@absl@@YAPBDPBVStatus@2@PBD@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@C@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PBX@Z + ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z + ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_JI@Z + ?MakeFlatWithExtraCapacity@InlineRep@Cord@absl@@QAEPAUCordRepFlat@cord_internal@3@I@Z + ?MakeInitValue@FlagImpl@flags_internal@absl@@ABE?AV?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@XZ + ?MakeInt128@absl@@YA?AVint128@1@_J_K@Z + ?MakeNormalizedDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z + ?MakeRelativeTimespec@KernelTimeout@synchronization_internal@absl@@QBE?AUtimespec@@XZ + ?MakeSeedSeq@absl@@YA?AV?$SaltedSeedSeq@Vseed_seq@__Cr@std@@@random_internal@1@XZ + ?MakeStorageView@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE?AU?$StorageView@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@23@XZ + ?MakeStorageView@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE?AU?$StorageView@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@23@XZ + ?MakeStorageView@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAE?AU?$StorageView@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@23@XZ + ?MakeTagType@log_internal@absl@@YA_K_KW4WireType@12@@Z + ?MakeTime@Impl@time_zone@cctz@time_internal@absl@@QBE?AUcivil_lookup@2345@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@345@@Z + ?MakeTime@TimeZoneInfo@cctz@time_internal@absl@@UBE?AUcivil_lookup@time_zone@234@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?MakeTime@TimeZoneLibC@cctz@time_internal@absl@@UBE?AUcivil_lookup@time_zone@234@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?MakeUint128@absl@@YA?AVuint128@1@_K0@Z + ?MapToLocalCode@status_internal@absl@@YA?AW4StatusCode@2@H@Z + ?MarkAsRead@MaskedPointer@flags_internal@absl@@QAEXXZ + ?MarkInitialized@SequenceLock@flags_internal@absl@@QAEXXZ + ?MaskEmpty@GroupSse2Impl@container_internal@absl@@QBE?AV?$NonIterableBitMask@G$0BA@$0A@@23@XZ + ?MaskEmptyOrDeleted@GroupSse2Impl@container_internal@absl@@QBE?AV?$NonIterableBitMask@G$0BA@$0A@@23@XZ + ?MaskFull@GroupPortableImpl@container_internal@absl@@QBE@XZ + ?MaskFull@GroupSse2Impl@container_internal@absl@@QBE?AV?$BitMask@G$0BA@$0A@$0A@@23@XZ + ?MaskNonFull@GroupSse2Impl@container_internal@absl@@QBE@XZ + ?Match@GroupSse2Impl@container_internal@absl@@QBE?AV?$BitMask@G$0BA@$0A@$0A@@23@E@Z + ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@ABE_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z + ?MaxFlatLength@CordTestAccess@strings_internal@absl@@SAIXZ + ?MaxFramesInLogStackTrace@log_internal@absl@@YAHXZ + ?MaxVarintSize@log_internal@absl@@YAIXZ + ?MaybeBecomeIdle@WaiterBase@synchronization_internal@absl@@KAXXZ + ?MaybeExit@flags_internal@absl@@YAXW4HelpMode@12@@Z + ?MaybeGetCrcCordState@Cord@absl@@ABEPBVCrcCordState@crc_internal@2@XZ + ?MaybeRemoveEmptyCrcNode@InlineRep@Cord@absl@@AAEXXZ + ?MaybeTrackCordImpl@CordzInfo@cord_internal@absl@@CAXAAVInlineData@23@ABV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?MemcpyCrc32c@absl@@YA?AVcrc32c_t@1@PAXPBXIV21@@Z + ?MergeTrees@CordRepBtree@cord_internal@absl@@CAPAV123@PAV123@0@Z + ?MinLogLevel@absl@@YA?AW4LogSeverityAtLeast@1@XZ + ?MixIntoSeedMaterial@random_internal@absl@@YAXV?$Span@$$CBI@2@V?$Span@I@2@@Z + ?ModificationCount@FlagImpl@flags_internal@absl@@ABE_JXZ + ?ModificationCount@SequenceLock@flags_internal@absl@@QBE_JXZ + ?MovedFromRep@Status@absl@@CAIXZ + ?MovedFromString@Status@absl@@CAPBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@AAEXHPBI@Z + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QAEXI@Z + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QAEX_K@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEXHPBI@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEXI@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEX_K@Z + ?MultiplyByFiveToTheNth@?$BigUnsigned@$03@strings_internal@absl@@QAEXH@Z + ?MultiplyByFiveToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEXH@Z + ?MultiplyByTenToTheNth@?$BigUnsigned@$03@strings_internal@absl@@QAEXH@Z + ?MultiplyByTenToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEXH@Z + ?MultiplyStep@?$BigUnsigned@$03@strings_internal@absl@@AAEXHPBIHH@Z + ?MultiplyStep@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEXHPBIHH@Z + ?MutexDelay@synchronization_internal@absl@@YAHHH@Z + ?Name@FlagImpl@flags_internal@absl@@EBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Name@Impl@time_zone@cctz@time_internal@absl@@QBEABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?NegateAndSubtractOne@time_internal@absl@@YA_J_J@Z + ?Never@KernelTimeout@synchronization_internal@absl@@SA?AV123@XZ + ?New@CordRepBtree@cord_internal@absl@@SAPAV123@H@Z + ?New@CordRepBtree@cord_internal@absl@@SAPAV123@PAUCordRep@23@@Z + ?New@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@0@Z + ?New@CordRepCrc@cord_internal@absl@@SAPAU123@PAUCordRep@23@VCrcCordState@crc_internal@3@@Z + ?New@CordRepFlat@cord_internal@absl@@SAPAU123@I@Z + ?New@CordRepFlat@cord_internal@absl@@SAPAU123@ULarge@123@I@Z + ?NewArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@I@Z + ?NewCRC32AcceleratedX86ARMCombinedAll@crc_internal@absl@@YA?AV?$vector@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@XZ + ?NewInternal@CRCImpl@crc_internal@absl@@SAPAV123@XZ + ?NewString@CheckOpMessageBuilder@log_internal@absl@@QAEPBDXZ + ?Next@CordRepBtreeNavigator@cord_internal@absl@@QAEPAUCordRep@23@XZ + ?Next@CordRepBtreeReader@cord_internal@absl@@QAE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Next@CordzInfo@cord_internal@absl@@QBEPAV123@ABVCordzSnapshot@23@@Z + ?NextCapacity@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SAII@Z + ?NextCapacity@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SAII@Z + ?NextCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SAII@Z + ?NextCapacity@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@SAII@Z + ?NextCapacity@container_internal@absl@@YAII@Z + ?NextGeneration@container_internal@absl@@YAEE@Z + ?NextRandom@ExponentialBiased@profiling_internal@absl@@SA_K_K@Z + ?NextSeed@container_internal@absl@@YAGXZ + ?NextTransition@Impl@time_zone@cctz@time_internal@absl@@QBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@2345@@Z + ?NextTransition@TimeZone@absl@@QBE_NVTime@2@PAUCivilTransition@12@@Z + ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@time_zone@234@@Z + ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@time_zone@234@@Z + ?NextUp@CordRepBtreeNavigator@cord_internal@absl@@AAEPAUCordRep@23@XZ + ?NoPrefix@LogMessage@log_internal@absl@@QAEAAV123@XZ + ?NominalCPUFrequency@base_internal@absl@@YANXZ + ?Normalize@CrcCordState@crc_internal@absl@@QAEXXZ + ?NormalizeCapacity@container_internal@absl@@YAII@Z + ?NormalizeLogSeverity@absl@@YA?AW4LogSeverity@1@W421@@Z + ?NormalizedPrefixCrcAtNthChunk@CrcCordState@crc_internal@absl@@QBE?AUPrefixCrc@123@I@Z + ?NotFoundError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Notify@Notification@absl@@QAEXXZ + ?Now@CycleClock@base_internal@absl@@SA_JXZ + ?Now@UnscaledCycleClock@base_internal@absl@@CA_JXZ + ?Now@absl@@YA?AVTime@1@XZ + ?NullSafeStringView@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PBD@Z + ?NumCPUs@base_internal@absl@@YAHXZ + ?NumChunks@CrcCordState@crc_internal@absl@@QBEIXZ + ?NumClonedBytes@container_internal@absl@@YAIXZ + ?NumControlBytes@container_internal@absl@@YAII@Z + ?NumGenerationBytes@container_internal@absl@@YAIXZ + ?NumLeakedFlagValues@flags_internal@absl@@YA_KXZ + ?ODRCheck@CordzInfo@cord_internal@absl@@ABEXXZ + ?OccursBefore@ViableSubstitution@strings_internal@absl@@QBE_NABU123@@Z + ?OnUpdate@?$FlagRegistrar@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@$00@flags_internal@absl@@QHAE?AV123@P6AXXZ@Z + ?OnVLogVerbosityUpdate@log_internal@absl@@YAXV?$function@$$A6AXXZ@__Cr@std@@@Z + ?OneTimeInitThreadIdentity@synchronization_internal@absl@@YAXPAUThreadIdentity@base_internal@2@@Z + ?OneWordValue@FlagImpl@flags_internal@absl@@ABEAAU?$atomic@_J@__Cr@std@@XZ + ?OppositeInfinity@time_internal@absl@@YA?AVDuration@2@V32@@Z + ?OutOfRangeError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?OverwriteControlAsFull@GrowthInfo@container_internal@absl@@QAEXW4ctrl_t@23@@Z + ?OverwriteEmptyAsFull@GrowthInfo@container_internal@absl@@QAEXXZ + ?OverwriteFullAsDeleted@GrowthInfo@container_internal@absl@@QAEXXZ + ?OverwriteFullAsEmpty@GrowthInfo@container_internal@absl@@QAEXXZ + ?OverwriteManyEmptyAsFull@GrowthInfo@container_internal@absl@@QAEXI@Z + ?Package@flags_internal@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@@Z + ?Parse@flags_internal@absl@@YA_NP6APAXW4FlagOp@12@PBXPAX2@ZV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@2PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?ParseAbseilFlagsOnly@absl@@YAXHQAPADAAV?$vector@PADV?$allocator@PAD@__Cr@std@@@__Cr@std@@AAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@34@@Z + ?ParseAbseilFlagsOnlyImpl@flags_internal@absl@@YA?AW4HelpMode@12@HQAPADAAV?$vector@PADV?$allocator@PAD@__Cr@std@@@__Cr@std@@AAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@56@W4UsageFlagsAction@12@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCommandLine@absl@@YA?AV?$vector@PADV?$allocator@PAD@__Cr@std@@@__Cr@std@@HQAPAD@Z + ?ParseCommandLineImpl@flags_internal@absl@@YA?AV?$vector@PADV?$allocator@PAD@__Cr@std@@@__Cr@std@@HQAPADW4UsageFlagsAction@12@W4OnUndefinedFlag@12@AAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@45@@Z + ?ParseDigits@str_format_internal@absl@@YAHAADAAPBDQBD@Z + ?ParseDuration@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVDuration@1@@Z + ?ParseFlag@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAVDuration@1@PAV234@@Z + ?ParseFlag@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAVTime@1@PAV234@@Z + ?ParseFrom@CommandLineFlag@absl@@QAE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?ParseFrom@FlagImpl@flags_internal@absl@@EAE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4FlagSettingMode@23@W4ValueSource@23@AAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?ParseFrom@PrivateHandleAccessor@flags_internal@absl@@SA_NAAVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4FlagSettingMode@23@W4ValueSource@23@AAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParsePosixSpec@cctz@time_internal@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAUPosixTimeZone@123@@Z + ?ParseTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PAVTime@1@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?ParseTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0VTimeZone@1@PAVTime@1@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?PermissionDeniedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Piece@AlphaNum@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?PiecewiseChunkSize@hash_internal@absl@@YAIXZ + ?PointerToRep@Status@absl@@CAIPAVStatusRep@status_internal@2@@Z + ?Poison@CrcCordState@crc_internal@absl@@QAEXXZ + ?Poke@StdcppWaiter@synchronization_internal@absl@@QAEXXZ + ?Poke@Win32Waiter@synchronization_internal@absl@@QAEXXZ + ?Post@PerThreadSem@synchronization_internal@absl@@CAXPAUThreadIdentity@base_internal@3@@Z + ?Post@StdcppWaiter@synchronization_internal@absl@@QAEXXZ + ?Post@Win32Waiter@synchronization_internal@absl@@QAEXXZ + ?PrecombineLengthMix@hash_internal@absl@@YA_K_KI@Z + ?PrepareForSampling@HashtablezInfo@container_internal@absl@@QAEX_JIIIG@Z + ?PrepareInsertLarge@container_internal@absl@@YAIAAVCommonFields@12@ABUPolicyFunctions@12@IV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@@Z + ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YAIAAVCommonFields@12@ABUPolicyFunctions@12@IV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@V?$FunctionRef@$$A6AII@Z@2@@Z + ?PrepareInsertSmallNonSoo@container_internal@absl@@YA?AU?$pair@PAW4ctrl_t@container_internal@absl@@PAX@__Cr@std@@AAVCommonFields@12@ABUPolicyFunctions@12@V?$FunctionRef@$$A6AII@Z@2@@Z + ?PrepareToDie@LogMessage@log_internal@absl@@AAEXXZ + ?PrepareToModify@Status@absl@@CAPAVStatusRep@status_internal@2@I@Z + ?Prepend@Cord@absl@@QAEXABV12@@Z + ?Prepend@Cord@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Prepend@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@PAUCordRep@23@@Z + ?Prepend@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ?PrependArray@Cord@absl@@AAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?PrependPrecise@Cord@absl@@AAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?PrependSlow@CordRepBtree@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z + ?PrependTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToInlined@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependVModule@log_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?PrevTransition@Impl@time_zone@cctz@time_internal@absl@@QBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@2345@@Z + ?PrevTransition@TimeZone@absl@@QBE_NVTime@2@PAUCivilTransition@12@@Z + ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@time_zone@234@@Z + ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@time_zone@234@@Z + ?PreviousCapacity@container_internal@absl@@YAII@Z + ?Print@Streamable@str_format_internal@absl@@QBEAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@@Z + ?PrintTo@absl@@YAXABVLogEntry@1@PAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ProgramUsageMessage@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Ptr@GraphCycles@synchronization_internal@absl@@QAEPAXUGraphId@23@@Z + ?Ptr@MaskedPointer@flags_internal@absl@@QBEPAXXZ + ?PtrStorage@FlagImpl@flags_internal@absl@@ABEAAU?$atomic@VMaskedPointer@flags_internal@absl@@@__Cr@std@@XZ + ?PushDead@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AAEXPAUHashtablezInfo@container_internal@3@@Z + ?PushNew@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AAEXPAUHashtablezInfo@container_internal@3@@Z + ?PutPaddedString@FormatSinkImpl@str_format_internal@absl@@QAE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HH_N@Z + ?PutTwoDigits@numbers_internal@absl@@YAXIPAD@Z + ?RawAbsNanos@KernelTimeout@synchronization_internal@absl@@ABE_JXZ + ?RawEnableLogPrefix@log_internal@absl@@YAX_N@Z + ?RawLog@raw_log_internal@absl@@YAXW4LogSeverity@2@PBDH1ZZ + ?RawLoggingFullySupported@raw_log_internal@absl@@YA_NXZ + ?RawSetMinLogLevel@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z + ?RawSetStderrThreshold@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z + ?Read1To3@hash_internal@absl@@YAIPBEI@Z + ?Read4To8@hash_internal@absl@@YA_KPBEI@Z + ?Read8@hash_internal@absl@@YA_KPBE@Z + ?Read9To16@hash_internal@absl@@YA?AU?$pair@_K_K@__Cr@std@@PBEI@Z + ?Read@CordRepBtreeNavigator@cord_internal@absl@@QAE?AUReadResult@123@II@Z + ?Read@CordRepBtreeReader@cord_internal@absl@@QAE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@IIAAPAUCordRep@23@@Z + ?Read@FlagImpl@flags_internal@absl@@UBEXPAX@Z + ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AAEHPBD0H@Z + ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEHPBD0H@Z + ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QAEHABUParsedFloat@23@H@Z + ?ReadFloatMantissa@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEHABUParsedFloat@23@H@Z + ?ReadOneBool@FlagImpl@flags_internal@absl@@QBE_NXZ + ?ReadOneWord@FlagImpl@flags_internal@absl@@QBE_JXZ + ?ReadSeedMaterialFromOSEntropy@random_internal@absl@@YA_NV?$Span@I@2@@Z + ?ReadSequenceLockedData@FlagImpl@flags_internal@absl@@ABEXPAX@Z + ?ReaderTryLockSlow@Mutex@absl@@AAE_NXZ + ?Rebuild@CordRepBtree@cord_internal@absl@@CAXPAPAV123@PAV123@_N@Z + ?Rebuild@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@@Z + ?RecordClearedReservation@HashtablezInfoHandle@container_internal@absl@@QAEXXZ + ?RecordClearedReservationSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@@Z + ?RecordErase@HashtablezInfoHandle@container_internal@absl@@QAEXXZ + ?RecordEraseSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@@Z + ?RecordInsert@HashtablezInfoHandle@container_internal@absl@@QAEXII@Z + ?RecordInsertSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@II@Z + ?RecordRehash@HashtablezInfoHandle@container_internal@absl@@QAEXI@Z + ?RecordRehashSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@I@Z + ?RecordReservation@HashtablezInfoHandle@container_internal@absl@@QAEXI@Z + ?RecordReservationSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@I@Z + ?RecordStorageChanged@HashtablezInfoHandle@container_internal@absl@@QAEXII@Z + ?RecordStorageChangedSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@II@Z + ?Ref@CordRep@cord_internal@absl@@SAPAU123@PAU123@@Z + ?Ref@CrcCordState@crc_internal@absl@@CAXPAURefcountedRep@123@@Z + ?Ref@Status@absl@@CAXI@Z + ?Ref@StatusRep@status_internal@absl@@QBEXXZ + ?RefCordRep@CordzInfo@cord_internal@absl@@QBEPAUCordRep@23@XZ + ?RefSharedEmptyRep@CrcCordState@crc_internal@absl@@CAPAURefcountedRep@123@XZ + ?Register@CycleClockSource@base_internal@absl@@CAXP6A_JXZ@Z + ?RegisterAbortHook@raw_log_internal@absl@@YAXP6AXPBDH000@Z@Z + ?RegisterAndInitialize@log_internal@absl@@YAHPAVVLogSite@12@@Z + ?RegisterCommandLineFlag@flags_internal@absl@@YA_NAAVCommandLineFlag@2@PBD@Z + ?RegisterCondVarTracer@absl@@YAXP6AXPBDPBX@Z@Z + ?RegisterDebugStackTraceHook@debugging_internal@absl@@YAXP6AXQBQAXHP6AXPBDPAX@Z2@Z@Z + ?RegisterFlag@FlagRegistry@flags_internal@absl@@QAEXAAVCommandLineFlag@3@PBD@Z + ?RegisterInternalLogFunction@raw_log_internal@absl@@YAXP6AXW4LogSeverity@2@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@Z + ?RegisterLivePointers@absl@@YAXPBXI@Z + ?RegisterLogFilterAndPrefixHook@raw_log_internal@absl@@YAXP6A_NW4LogSeverity@2@PBDHPAPADPAH@Z@Z + ?RegisterMutexProfiler@absl@@YAXP6AX_J@Z@Z + ?RegisterMutexTracer@absl@@YAXP6AXPBDPBX_J@Z@Z + ?RegisterSpinLockProfiler@base_internal@absl@@YAXP6AXPBX_J@Z@Z + ?RegisterWithTsan@SpinLock@base_internal@absl@@AAEXXZ + ?Rehash@container_internal@absl@@YAXAAVCommonFields@12@ABUPolicyFunctions@12@I@Z + ?RehashProbabilityConstant@container_internal@absl@@YAIXZ + ?RelaxedCopyFromAtomic@SequenceLock@flags_internal@absl@@CAXPAXPBU?$atomic@_K@__Cr@std@@I@Z + ?RelaxedCopyToAtomic@SequenceLock@flags_internal@absl@@CAXPAU?$atomic@_K@__Cr@std@@PBXI@Z + ?Release@?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QHAE?AU?$Allocation@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@23@XZ + ?Release@?$AllocationTransaction@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QHAE?AU?$Allocation@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@23@XZ + ?Release@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QHAE?AU?$Allocation@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@23@XZ + ?Release@ReleasableMutexLock@absl@@QAEXXZ + ?Remove@CondVar@absl@@AAEXPAUPerThreadSynch@base_internal@2@@Z + ?RemoveChunkPrefix@ChunkIterator@Cord@absl@@AAEXI@Z + ?RemoveCrc32cPrefix@absl@@YA?AVcrc32c_t@1@V21@0I@Z + ?RemoveCrc32cSuffix@absl@@YA?AVcrc32c_t@1@V21@0I@Z + ?RemoveCrcNode@cord_internal@absl@@YAPAUCordRep@12@PAU312@@Z + ?RemoveEdge@GraphCycles@synchronization_internal@absl@@QAEXUGraphId@23@0@Z + ?RemoveExtraAsciiWhitespace@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?RemoveLogSink@log_internal@absl@@YAXPAVLogSink@2@@Z + ?RemoveNode@GraphCycles@synchronization_internal@absl@@QAEXPAX@Z + ?RemovePrefix@Cord@absl@@QAEXI@Z + ?RemoveSuffix@Cord@absl@@QAEXI@Z + ?RemoveSuffix@CordRepBtree@cord_internal@absl@@SAPAUCordRep@23@PAV123@I@Z + ?RepToPointer@Status@absl@@CAPBVStatusRep@status_internal@2@I@Z + ?ReportUnrecognizedFlags@absl@@YAXABV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@@Z + ?ReportUsageError@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_N@Z + ?ReserveEmptyNonAllocatedTableToFitBucketCount@container_internal@absl@@YAXAAVCommonFields@12@ABUPolicyFunctions@12@I@Z + ?ReserveTableToFitNewSize@container_internal@absl@@YAXAAVCommonFields@12@ABUPolicyFunctions@12@I@Z + ?Reset@?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AAEXXZ + ?Reset@?$AllocationTransaction@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AAEXXZ + ?Reset@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AAEXXZ + ?ResetToBuiltinUTC@TimeZoneInfo@cctz@time_internal@absl@@AAE_NABV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z + ?ResetToEmpty@InlineRep@Cord@absl@@AAEXXZ + ?Resize@?$ResizeUninitializedTraits@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@X@strings_internal@absl@@SAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ?ResizeAllocatedTableWithSeedChange@container_internal@absl@@YAXAAVCommonFields@12@ABUPolicyFunctions@12@I@Z + ?ResourceExhaustedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Restore@FlagState@flags_internal@absl@@EHAEXXZ + ?RestoreState@FlagImpl@flags_internal@absl@@AAE_NABVFlagState@23@@Z + ?RestoreToRegistry@FlagSaverImpl@flags_internal@absl@@QHAEXXZ + ?Retire@flags_internal@absl@@YAXPBDPBXPAE@Z + ?ReverseConsume@cord_internal@absl@@YAXPAUCordRep@12@V?$FunctionRef@$$A6AXPAUCordRep@cord_internal@absl@@II@Z@2@@Z + ?RoundUp@cord_internal@absl@@YAIII@Z + ?RoundUpForTag@cord_internal@absl@@YAII@Z + ?RuntimeTypeId@flags_internal@absl@@YAPBVtype_info@@P6APAXW4FlagOp@12@PBXPAX2@Z@Z + ?SafeToDelete@CordzHandle@cord_internal@absl@@QBE_NXZ + ?SampleSlow@container_internal@absl@@YAPAUHashtablezInfo@12@AAUSamplingState@12@IIIG@Z + ?SanitizerPoisonMemoryRegion@container_internal@absl@@YAXPBXI@Z + ?SanitizerSafeCopy@Rep@InlineData@cord_internal@absl@@QBEABU1234@XZ + ?SanitizerUnpoisonMemoryRegion@container_internal@absl@@YAXPBXI@Z + ?SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ + ?SaveState@FlagImpl@flags_internal@absl@@EAE?AV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?SaveState@PrivateHandleAccessor@flags_internal@absl@@SA?AV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAVCommandLineFlag@3@@Z + ?Scramble@CRC32@crc_internal@absl@@UBEXPAI@Z + ?Seek@CordRepBtreeNavigator@cord_internal@absl@@QAE?AUPosition@123@I@Z + ?Seek@CordRepBtreeReader@cord_internal@absl@@QAE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ?SendToLog@LogMessage@log_internal@absl@@AAEXXZ + ?SentinelEmptyGeneration@container_internal@absl@@YAEXZ + ?Set@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@AAEXABV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@Z + ?Set@MaskedPointer@flags_internal@absl@@QAEXP6APAXW4FlagOp@23@PBXPAX2@Z1_N@Z + ?SetAllocation@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXU?$Allocation@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@23@@Z + ?SetAllocation@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXU?$Allocation@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@23@@Z + ?SetAllocation@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXU?$Allocation@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@23@@Z + ?SetAllocation@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXU?$Allocation@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@23@@Z + ?SetAndroidNativeTag@absl@@YAXPBD@Z + ?SetCallback@FlagImpl@flags_internal@absl@@QAEXQ6AXXZ@Z + ?SetConversionChar@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXW4FormatConversionChar@3@PAVFormatConversionSpecImpl@23@@Z + ?SetCordBtreeExhaustiveValidation@cord_internal@absl@@YAX_N@Z + ?SetCordRep@CordzInfo@cord_internal@absl@@QAEXPAUCordRep@23@@Z + ?SetCordRep@CordzUpdateScope@cord_internal@absl@@QBEXPAUCordRep@23@@Z + ?SetCrcCordState@Cord@absl@@AAEXVCrcCordState@crc_internal@2@@Z + ?SetCurrentThreadIdentity@base_internal@absl@@YAXPAUThreadIdentity@12@P6AXPAX@Z@Z + ?SetExitOnDFatal@log_internal@absl@@YAX_N@Z + ?SetExpectedChecksum@Cord@absl@@QAEXI@Z + ?SetFailQuietly@LogMessage@log_internal@absl@@IAEXXZ + ?SetFlags@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXW4Flags@23@PAVFormatConversionSpecImpl@23@@Z + ?SetFlagsHelpFormat@flags_internal@absl@@YAXW4HelpFormat@12@@Z + ?SetFlagsHelpMatchSubstr@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetFlagsHelpMode@flags_internal@absl@@YAXW4HelpMode@12@@Z + ?SetFlagsUsageConfig@absl@@YAXUFlagsUsageConfig@1@@Z + ?SetHashtablezConfigListener@container_internal@absl@@YAXP6AXXZ@Z + ?SetHashtablezEnabled@container_internal@absl@@YAX_N@Z + ?SetHashtablezEnabledInternal@container_internal@absl@@YAX_N@Z + ?SetHashtablezMaxSamples@container_internal@absl@@YAXI@Z + ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAXI@Z + ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z + ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z + ?SetInitialized@log_internal@absl@@YAXXZ + ?SetIsAllocated@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXXZ + ?SetIsAllocated@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXXZ + ?SetIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXXZ + ?SetIsAllocated@?$Storage@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXXZ + ?SetLength@CordBuffer@absl@@QAEXI@Z + ?SetLengthMod@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXW4LengthMod@3@PAVFormatConversionSpecImpl@23@@Z + ?SetLogBacktraceLocation@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?SetLoggingGlobalsListener@log_internal@absl@@YAXP6AXXZ@Z + ?SetMaxFramesInLogStackTrace@log_internal@absl@@YAXH@Z + ?SetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QAEXI@Z + ?SetMinLogLevel@absl@@YAXW4LogSeverityAtLeast@1@@Z + ?SetMutexDeadlockDetectionMode@absl@@YAXW4OnDeadlockCycle@1@@Z + ?SetPayload@StatusRep@status_internal@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VCord@3@@Z + ?SetPrecision@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPAVFormatConversionSpecImpl@23@@Z + ?SetProgramInvocationName@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetProgramUsageMessage@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetSize@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXI@Z + ?SetStackUnwinder@absl@@YAXP6AHPAPAXPAHHHPBX1@Z@Z + ?SetStatusPayloadPrinter@status_internal@absl@@YAXP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@ABVCord@2@@Z@Z + ?SetStderrThreshold@absl@@YAXW4LogSeverityAtLeast@1@@Z + ?SetSuppressSigabortTrace@log_internal@absl@@YA_N_N@Z + ?SetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAXPAU?$atomic@H@__Cr@std@@@Z + ?SetTimeZone@log_internal@absl@@YAXVTimeZone@2@@Z + ?SetToZero@?$BigUnsigned@$03@strings_internal@absl@@QAEXXZ + ?SetToZero@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEXXZ + ?SetTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@ABVCordzUpdateScope@53@@Z + ?SetTreeOrEmpty@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@ABVCordzUpdateScope@53@@Z + ?SetVModuleListHeadForTestOnly@log_internal@absl@@YAPAVVLogSite@12@PAV312@@Z + ?SetValue@?$Manager@D$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@ABD@Z + ?SetValue@?$Manager@H$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@ABH@Z + ?SetValue@?$Manager@I$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@ABI@Z + ?SetValue@?$Manager@M$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@ABM@Z + ?SetValue@?$Manager@N$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@ABN@Z + ?SetValue@?$Manager@PBD$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@ABQBD@Z + ?SetValue@?$Manager@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetValue@?$Manager@_J$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AB_J@Z + ?SetWidth@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPAVFormatConversionSpecImpl@23@@Z + ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QAEXH@Z + ?ShiftLeft@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEXH@Z + ?ShortProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ShouldFixUpStack@internal_stacktrace@absl@@YA_NXZ + ?ShouldLog@LogEveryNSecState@log_internal@absl@@QAE_NN@Z + ?ShouldLog@LogEveryNState@log_internal@absl@@QAE_NH@Z + ?ShouldLog@LogEveryPow2State@log_internal@absl@@QAE_NXZ + ?ShouldLog@LogFirstNState@log_internal@absl@@QAE_NH@Z + ?ShouldLogBacktraceAt@log_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?ShouldPrependLogPrefix@absl@@YA_NXZ + ?ShouldSampleNextTable@container_internal@absl@@YA_NXZ + ?ShouldSymbolizeLogStackTrace@log_internal@absl@@YA_NXZ + ?SigSafeArena@base_internal@absl@@YAPAUArena@LowLevelAlloc@12@XZ + ?Signal@CondVar@absl@@QAEXXZ + ?SignalAll@CondVar@absl@@QAEXXZ + ?SignedAddResult@int128_internal@absl@@YA?AVint128@2@V32@0@Z + ?SignedSubstructResult@int128_internal@absl@@YA?AVint128@2@V32@00@Z + ?SimpleAtob@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_N@Z + ?SimpleAtod@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAN@Z + ?SimpleAtof@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAM@Z + ?SimpleAtoi@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVint128@1@@Z + ?SimpleAtoi@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVuint128@1@@Z + ?SimpleHexAtoi@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVint128@1@@Z + ?SimpleHexAtoi@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVuint128@1@@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ?SingleArgStrCat@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ?SixDigitsToBuffer@numbers_internal@absl@@YAINPAD@Z + ?SizeToCapacity@container_internal@absl@@YAII@Z + ?Sizeof@flags_internal@absl@@YAIP6APAXW4FlagOp@12@PBXPAX2@Z@Z + ?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SAIXZ + ?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SAIXZ + ?Skip@CordRepBtreeNavigator@cord_internal@absl@@QAE?AUPosition@123@I@Z + ?SkipCrcNode@cord_internal@absl@@YAPAUCordRep@12@PAU312@@Z + ?SkipCrcNode@cord_internal@absl@@YAPBUCordRep@12@PBU312@@Z + ?SleepFor@absl@@YAXVDuration@1@@Z + ?SlowIsEnabled0@VLogSite@log_internal@absl@@AAE_NH@Z + ?SlowIsEnabled1@VLogSite@log_internal@absl@@AAE_NH@Z + ?SlowIsEnabled2@VLogSite@log_internal@absl@@AAE_NH@Z + ?SlowIsEnabled3@VLogSite@log_internal@absl@@AAE_NH@Z + ?SlowIsEnabled4@VLogSite@log_internal@absl@@AAE_NH@Z + ?SlowIsEnabled5@VLogSite@log_internal@absl@@AAE_NH@Z + ?SlowIsEnabled@VLogSite@log_internal@absl@@AAE_NHH@Z + ?SlowLock@SpinLock@base_internal@absl@@AAEXXZ + ?SlowUnlock@SpinLock@base_internal@absl@@AAEXI@Z + ?SnprintF@str_format_internal@absl@@YAHPADIVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?SooCapacity@container_internal@absl@@YAIXZ + ?SooControl@container_internal@absl@@YAPAW4ctrl_t@12@XZ + ?SooEnabled@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CA_NXZ + ?SooSlotIndex@container_internal@absl@@YAIXZ + ?SpinLockDelay@base_internal@absl@@YAXPAU?$atomic@I@__Cr@std@@IHW4SchedulingMode@12@@Z + ?SpinLockSuggestedDelayNS@base_internal@absl@@YAHH@Z + ?SpinLockWait@base_internal@absl@@YAIPAU?$atomic@I@__Cr@std@@HQBUSpinLockWaitTransition@12@W4SchedulingMode@12@@Z + ?SpinLockWake@base_internal@absl@@YAXPAU?$atomic@I@__Cr@std@@_N@Z + ?SpinLoop@SpinLock@base_internal@absl@@AAEIXZ + ?StackTraceWorksForTest@debugging_internal@absl@@YA_NXZ + ?StartsWith@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StartsWithIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StatusCodeToString@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusCode@1@@Z + ?StatusMessageAsCStr@absl@@YAPBDABVStatus@1@@Z + ?StderrThreshold@absl@@YA?AW4LogSeverityAtLeast@1@XZ + ?SteadyClockNow@KernelTimeout@synchronization_internal@absl@@CA_JXZ + ?Store16@little_endian@absl@@YAXPAXG@Z + ?Store32@little_endian@absl@@YAXPAXI@Z + ?Store64@little_endian@absl@@YAXPAX_K@Z + ?Store@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@ABVCord@absl@@@Z@base_internal@absl@@QAEXP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@ABVCord@3@@Z@Z + ?Store@?$AtomicHook@P6AXPBDH000@Z@base_internal@absl@@QAEXP6AXPBDH000@Z@Z + ?Store@?$AtomicHook@P6AXPBDPBX@Z@base_internal@absl@@QAEXP6AXPBDPBX@Z@Z + ?Store@?$AtomicHook@P6AXPBDPBX_J@Z@base_internal@absl@@QAEXP6AXPBDPBX_J@Z@Z + ?Store@?$AtomicHook@P6AXPBX_J@Z@base_internal@absl@@QAEXP6AXPBX_J@Z@Z + ?Store@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QAEXP6AXW4LogSeverity@3@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@Z + ?Store@?$AtomicHook@P6AXXZ@base_internal@absl@@QAEXP6AXXZ@Z + ?Store@?$AtomicHook@P6AX_J@Z@base_internal@absl@@QAEXP6AX_J@Z@Z + ?Store@?$AtomicHook@P6A_NW4LogSeverity@absl@@PBDHPAPADPAH@Z@base_internal@absl@@QAEXP6A_NW4LogSeverity@3@PBDHPAPADPAH@Z@Z + ?StoreValue@FlagImpl@flags_internal@absl@@AAEXPBXW4ValueSource@23@@Z + ?StrAppend@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@1@111@Z + ?StrAppend@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@1@11@Z + ?StrAppend@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@1@1@Z + ?StrAppend@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@1@@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@1@000@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@1@00@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@1@0@Z + ?StrContains@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StrContains@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?StrContainsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StrContainsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?StrError@base_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?StrReplaceAll@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@4@@Z + ?StrReplaceAll@absl@@YAHV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@3@@Z + ?StripAsciiWhitespace@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?StripLeadingAsciiWhitespace@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?StripTrailingAsciiWhitespace@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@@Z + ?SubTree@CordRepBtree@cord_internal@absl@@QAEPAUCordRep@23@II@Z + ?Subcord@Cord@absl@@QBE?AV12@II@Z + ?SubstituteAndAppendArray@substitute_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@PBV645@I@Z + ?Substring@CordRepSubstring@cord_internal@absl@@SAPAUCordRep@23@PAU423@II@Z + ?SubstructResult@int128_internal@absl@@YA?AVuint128@2@V32@00@Z + ?SubtractSize@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXI@Z + ?SubtractSize@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXI@Z + ?Summarize@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?SupportsArmCRC32PMULL@crc_internal@absl@@YA_NXZ + ?SuppressSigabortTrace@log_internal@absl@@YA_NXZ + ?Symbolize@absl@@YA_NPBXPADH@Z + ?TagToAllocatedSize@cord_internal@absl@@YAIE@Z + ?TagToLength@cord_internal@absl@@YAIE@Z + ?TakeRep@Cord@absl@@AGBEPAUCordRep@cord_internal@2@XZ + ?TakeRep@Cord@absl@@AHAEPAUCordRep@cord_internal@2@XZ + ?TestOnlyAddNodes@GraphCycles@synchronization_internal@absl@@QAEXI@Z + ?TestOnlyRefreshSamplingStateForCurrentThread@container_internal@absl@@YAXXZ + ?ThreadIsLoggingToLogSink@log_internal@absl@@YA_NXZ + ?ThrowBadStatusOrAccess@internal_statusor@absl@@YAXVStatus@2@@Z + ?ThrowSeedGenException@random_internal@absl@@YAXXZ + ?ThrowStdBadAlloc@base_internal@absl@@YAXXZ + ?ThrowStdBadFunctionCall@base_internal@absl@@YAXXZ + ?ThrowStdDomainError@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdDomainError@base_internal@absl@@YAXPBD@Z + ?ThrowStdInvalidArgument@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdInvalidArgument@base_internal@absl@@YAXPBD@Z + ?ThrowStdLengthError@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdLengthError@base_internal@absl@@YAXPBD@Z + ?ThrowStdLogicError@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdLogicError@base_internal@absl@@YAXPBD@Z + ?ThrowStdOutOfRange@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdOutOfRange@base_internal@absl@@YAXPBD@Z + ?ThrowStdOverflowError@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdOverflowError@base_internal@absl@@YAXPBD@Z + ?ThrowStdRangeError@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdRangeError@base_internal@absl@@YAXPBD@Z + ?ThrowStdRuntimeError@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdRuntimeError@base_internal@absl@@YAXPBD@Z + ?ThrowStdUnderflowError@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdUnderflowError@base_internal@absl@@YAXPBD@Z + ?Tick@PerThreadSem@synchronization_internal@absl@@SAXPAUThreadIdentity@base_internal@3@@Z + ?TimeFromTimespec@absl@@YA?AVTime@1@Utimespec@@@Z + ?TimeFromTimeval@absl@@YA?AVTime@1@Utimeval@@@Z + ?TimeLocal@TimeZoneInfo@cctz@time_internal@absl@@ABE?AUcivil_lookup@time_zone@234@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@_J@Z + ?TimeZone@log_internal@absl@@YAPBV02@XZ + ?ToChronoDuration@KernelTimeout@synchronization_internal@absl@@QBE?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@XZ + ?ToChronoHours@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMicroseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMilliseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0DOI@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMinutes@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoNanoseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoSeconds@absl@@YA?AV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoTime@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@VTime@1@@Z + ?ToChronoTimePoint@KernelTimeout@synchronization_internal@absl@@QBE?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@XZ + ?ToCivilSecond@absl@@YA?AV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTime@1@VTimeZone@1@@Z + ?ToDoubleHours@absl@@YANVDuration@1@@Z + ?ToDoubleMicroseconds@absl@@YANVDuration@1@@Z + ?ToDoubleMilliseconds@absl@@YANVDuration@1@@Z + ?ToDoubleMinutes@absl@@YANVDuration@1@@Z + ?ToDoubleNanoseconds@absl@@YANVDuration@1@@Z + ?ToDoubleSeconds@absl@@YANVDuration@1@@Z + ?ToHost16@big_endian@absl@@YAGG@Z + ?ToHost16@little_endian@absl@@YAGG@Z + ?ToHost32@big_endian@absl@@YAII@Z + ?ToHost32@little_endian@absl@@YAII@Z + ?ToHost64@little_endian@absl@@YA_K_K@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DOI@@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0PECEA@@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$0DM@$00@__Cr@std@@@Z + ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$0OBA@$00@__Cr@std@@@Z + ?ToInt64Hours@absl@@YA_JVDuration@1@@Z + ?ToInt64Microseconds@absl@@YA_JVDuration@1@@Z + ?ToInt64Milliseconds@absl@@YA_JVDuration@1@@Z + ?ToInt64Minutes@absl@@YA_JVDuration@1@@Z + ?ToInt64Nanoseconds@absl@@YA_JVDuration@1@@Z + ?ToInt64Seconds@absl@@YA_JVDuration@1@@Z + ?ToOpResult@CordRepBtree@cord_internal@absl@@AAE?AUOpResult@123@_N@Z + ?ToSinkAlso@LogMessage@log_internal@absl@@QAEAAV123@PAVLogSink@3@@Z + ?ToSinkOnly@LogMessage@log_internal@absl@@QAEAAV123@PAVLogSink@3@@Z + ?ToString@?$BigUnsigned@$03@strings_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@?$BigUnsigned@$0FE@@strings_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@Status@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusToStringMode@2@@Z + ?ToString@StatusRep@status_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusToStringMode@3@@Z + ?ToString@int128@absl@@ABE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@uint128@absl@@ABE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToStringSlow@Status@absl@@CA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IW4StatusToStringMode@2@@Z + ?ToTM@absl@@YA?AUtm@@VTime@1@VTimeZone@1@@Z + ?ToTimeT@absl@@YA_JVTime@1@@Z + ?ToTimespec@absl@@YA?AUtimespec@@VDuration@1@@Z + ?ToTimespec@absl@@YA?AUtimespec@@VTime@1@@Z + ?ToTimeval@absl@@YA?AUtimeval@@VDuration@1@@Z + ?ToTimeval@absl@@YA?AUtimeval@@VTime@1@@Z + ?ToUDate@absl@@YANVTime@1@@Z + ?ToUniversal@absl@@YA_JVTime@1@@Z + ?ToUnixDuration@time_internal@absl@@YA?AVDuration@2@VTime@2@@Z + ?ToUnixMicros@absl@@YA_JVTime@1@@Z + ?ToUnixMillis@absl@@YA_JVTime@1@@Z + ?ToUnixNanos@absl@@YA_JVTime@1@@Z + ?ToUnixSeconds@absl@@YA_JVTime@1@@Z + ?ToUnixSeconds@cctz@time_internal@absl@@YA_JABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?TraceContinue@base_internal@absl@@YAXPBXW4ObjectKind@12@@Z + ?TraceObjectKind@BlockingCounter@absl@@CA?AW4ObjectKind@base_internal@2@XZ + ?TraceObjectKind@Notification@absl@@CA?AW4ObjectKind@base_internal@2@XZ + ?TraceSignal@base_internal@absl@@YAXPBXW4ObjectKind@12@@Z + ?TraceWait@base_internal@absl@@YAXPBXW4ObjectKind@12@@Z + ?Track@CordzInfo@cord_internal@absl@@AAEXXZ + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAAVInlineData@23@ABV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAAVInlineData@23@W4MethodIdentifier@CordzUpdateTracker@23@_J@Z + ?TrailingZeros@?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@QBEIXZ + ?Trans@Mutex@absl@@AAEXPBUMuHowS@2@@Z + ?Trunc@absl@@YA?AVDuration@1@V21@0@Z + ?TryLockImpl@SpinLock@base_internal@absl@@AAE_NXZ + ?TryLockInternal@SpinLock@base_internal@absl@@AAEIII@Z + ?TryLockSlow@Mutex@absl@@AAE_NXZ + ?TryNewCRC32AcceleratedX86ARMCombined@crc_internal@absl@@YAPAVCRCImpl@12@XZ + ?TryParse@FlagImpl@flags_internal@absl@@ABE?AV?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?TryRead@SequenceLock@flags_internal@absl@@QBE_NPAXPBU?$atomic@_K@__Cr@std@@I@Z + ?TryRemove@Mutex@absl@@AAEXPAUPerThreadSynch@base_internal@2@@Z + ?TypeId@FlagImpl@flags_internal@absl@@EBEPBXXZ + ?TypeId@PrivateHandleAccessor@flags_internal@absl@@SAPBXABVCommandLineFlag@3@@Z + ?TypeName@CommandLineFlag@absl@@EBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?TypeName@FlagImpl@flags_internal@absl@@EBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?TypeName@PrivateHandleAccessor@flags_internal@absl@@SA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABVCommandLineFlag@3@@Z + ?UTC@Impl@time_zone@cctz@time_internal@absl@@SA?AV2345@XZ + ?UTC@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?UTC@TimeZoneInfo@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?UTCImpl@Impl@time_zone@cctz@time_internal@absl@@CAPBV12345@XZ + ?UTCTimeZone@absl@@YA?AVTimeZone@1@XZ + ?Uint128High64@absl@@YA_KVuint128@1@@Z + ?Uint128Low64@absl@@YA_KVuint128@1@@Z + ?Uint128Max@absl@@YA?AVuint128@1@XZ + ?UnRegisterLivePointers@absl@@YAXPBXI@Z + ?UnalignedLoad16@base_internal@absl@@YAGPBX@Z + ?UnalignedLoad32@base_internal@absl@@YAIPBX@Z + ?UnalignedLoad64@base_internal@absl@@YA_KPBX@Z + ?UnalignedStore16@base_internal@absl@@YAXPAXG@Z + ?UnalignedStore32@base_internal@absl@@YAXPAXI@Z + ?UnalignedStore64@base_internal@absl@@YAXPAX_K@Z + ?UnauthenticatedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnavailableError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnextendByZeroes@CRC32@crc_internal@absl@@UBEXPAII@Z + ?UnextendCrc32cByZeroes@crc_internal@absl@@YA?AVcrc32c_t@2@V32@I@Z + ?UnimplementedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UniversalEpoch@absl@@YA?AVTime@1@XZ + ?UnknownError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Unlock@CordzInfo@cord_internal@absl@@QAEXXZ + ?UnlockSlow@Mutex@absl@@AAEXPAUSynchWaitParams@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@F@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@G@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@M@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@P6APAXW4FlagOp@12@PBXPAX2@Z1@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@Vint128@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@Vuint128@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_N@Z + ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?Unref@CordRep@cord_internal@absl@@SAXPAU123@@Z + ?Unref@CordRepBtree@cord_internal@absl@@SAXV?$Span@QAUCordRep@cord_internal@absl@@@3@@Z + ?Unref@CrcCordState@crc_internal@absl@@CAXPAURefcountedRep@123@@Z + ?Unref@Status@absl@@CAXI@Z + ?Unref@StatusRep@status_internal@absl@@QBEXXZ + ?UnrefTree@InlineRep@Cord@absl@@AAEXXZ + ?Unregister@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QAEXPAUHashtablezInfo@container_internal@3@@Z + ?Unregister@HashtablezInfoHandle@container_internal@absl@@QAEXXZ + ?UnsafeSetCordRep@CordzInfo@cord_internal@absl@@AAEXPAUCordRep@23@@Z + ?UnsampleSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@@Z + ?Unscramble@CRC32@crc_internal@absl@@UBEXPAI@Z + ?Untrack@CordzInfo@cord_internal@absl@@QAEXXZ + ?UpdateGlobalVLogLevel@log_internal@absl@@YAHH@Z + ?UpdateStackTrace@GraphCycles@synchronization_internal@absl@@QAEXUGraphId@23@HP6AHPAPAXH@Z@Z + ?UpdateVLogSites@log_internal@absl@@YAXXZ + ?UpdateVModule@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UsingInlinedStorage@Storage@?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@CA_NI@Z + ?Utf8SafeCEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?Utf8SafeCHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?VLogLevel@log_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ValidateInputValue@FlagImpl@flags_internal@absl@@EBE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ValidateInputValue@PrivateHandleAccessor@flags_internal@absl@@SA_NABVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Value@?$Manager@C$01@FormatArgImpl@str_format_internal@absl@@SACTData@234@@Z + ?Value@?$Manager@D$01@FormatArgImpl@str_format_internal@absl@@SADTData@234@@Z + ?Value@?$Manager@E$01@FormatArgImpl@str_format_internal@absl@@SAETData@234@@Z + ?Value@?$Manager@F$01@FormatArgImpl@str_format_internal@absl@@SAFTData@234@@Z + ?Value@?$Manager@G$01@FormatArgImpl@str_format_internal@absl@@SAGTData@234@@Z + ?Value@?$Manager@H$01@FormatArgImpl@str_format_internal@absl@@SAHTData@234@@Z + ?Value@?$Manager@I$01@FormatArgImpl@str_format_internal@absl@@SAITData@234@@Z + ?Value@?$Manager@J$01@FormatArgImpl@str_format_internal@absl@@SAJTData@234@@Z + ?Value@?$Manager@K$01@FormatArgImpl@str_format_internal@absl@@SAKTData@234@@Z + ?Value@?$Manager@M$01@FormatArgImpl@str_format_internal@absl@@SAMTData@234@@Z + ?Value@?$Manager@N$01@FormatArgImpl@str_format_internal@absl@@SANTData@234@@Z + ?Value@?$Manager@O$01@FormatArgImpl@str_format_internal@absl@@SAOTData@234@@Z + ?Value@?$Manager@PBD$01@FormatArgImpl@str_format_internal@absl@@SAPBDTData@234@@Z + ?Value@?$Manager@PB_W$01@FormatArgImpl@str_format_internal@absl@@SAPB_WTData@234@@Z + ?Value@?$Manager@UVoidPtr@str_format_internal@absl@@$01@FormatArgImpl@str_format_internal@absl@@SA?AUVoidPtr@34@TData@234@@Z + ?Value@?$Manager@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SAABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@TData@234@@Z + ?Value@?$Manager@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SAABV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@TData@234@@Z + ?Value@?$Manager@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SAABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@TData@234@@Z + ?Value@?$Manager@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@$0A@@FormatArgImpl@str_format_internal@absl@@SAABV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@TData@234@@Z + ?Value@?$Manager@Vint128@absl@@$0A@@FormatArgImpl@str_format_internal@absl@@SAABVint128@4@TData@234@@Z + ?Value@?$Manager@Vuint128@absl@@$0A@@FormatArgImpl@str_format_internal@absl@@SAABVuint128@4@TData@234@@Z + ?Value@?$Manager@_J$01@FormatArgImpl@str_format_internal@absl@@SA_JTData@234@@Z + ?Value@?$Manager@_K$01@FormatArgImpl@str_format_internal@absl@@SA_KTData@234@@Z + ?Value@?$Manager@_N$01@FormatArgImpl@str_format_internal@absl@@SA_NTData@234@@Z + ?Value@CordzUpdateTracker@cord_internal@absl@@QBE_JW4MethodIdentifier@123@@Z + ?ValueOffset@flags_internal@absl@@YAHP6APAXW4FlagOp@12@PBXPAX2@Z@Z + ?ValueStorageKind@FlagImpl@flags_internal@absl@@ABE?AW4FlagValueStorageKind@23@XZ + ?VarintSize@log_internal@absl@@YAI_K@Z + ?Version@Impl@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@TimeZoneInfo@cctz@time_internal@absl@@UBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@TimeZoneLibC@cctz@time_internal@absl@@UBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@ZoneInfoSource@cctz@time_internal@absl@@UBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Wait@BlockingCounter@absl@@QAEXXZ + ?Wait@PerThreadSem@synchronization_internal@absl@@CA_NVKernelTimeout@23@@Z + ?Wait@StdcppWaiter@synchronization_internal@absl@@QAE_NVKernelTimeout@23@@Z + ?Wait@Win32Waiter@synchronization_internal@absl@@QAE_NVKernelTimeout@23@@Z + ?WaitCommon@CondVar@absl@@AAE_NPAVMutex@2@VKernelTimeout@synchronization_internal@2@@Z + ?WaitForNotification@Notification@absl@@QBEXXZ + ?WaitForNotificationWithDeadline@Notification@absl@@QBE_NVTime@2@@Z + ?WaitForNotificationWithTimeout@Notification@absl@@QBE_NVDuration@2@@Z + ?Wakeup@Mutex@absl@@AAEPAUPerThreadSynch@base_internal@2@PAU342@@Z + ?WasPresentOnCommandLine@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?WebSafeBase64Escape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?WebSafeBase64Escape@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?WebSafeBase64Unescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?WideToUtf8@strings_internal@absl@@YAI_WPADAAUShiftState@12@@Z + ?WithMetadataFrom@LogMessage@log_internal@absl@@QAEAAV123@ABVLogEntry@3@@Z + ?WithPerror@LogMessage@log_internal@absl@@QAEAAV123@XZ + ?WithThreadID@LogMessage@log_internal@absl@@QAEAAV123@I@Z + ?WithTimestamp@LogMessage@log_internal@absl@@QAEAAV123@VTime@3@@Z + ?WithVerbosity@LogMessage@log_internal@absl@@QAEAAV123@H@Z + ?Write@BufferRawSink@str_format_internal@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@FILERawSink@str_format_internal@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@FlagImpl@flags_internal@absl@@QAEXPBX@Z + ?Write@FormatRawSinkImpl@str_format_internal@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@SequenceLock@flags_internal@absl@@QAEXPAU?$atomic@_K@__Cr@std@@PBXI@Z + ?WriteToStderr@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4LogSeverity@2@@Z + ?ZeroDuration@absl@@YA?AVDuration@1@XZ + ?__add_back_capacity@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXXZ + ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z + ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXXZ + ?__addr@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEPAUTransition@cctz@time_internal@absl@@XZ + ?__addr@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEPAUTransitionType@cctz@time_internal@absl@@XZ + ?__alloc@?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEAAV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@XZ + ?__alloc@?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEAAV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@XZ + ?__alloc@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__annotate_contiguous_container@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXPBX0@Z + ?__annotate_contiguous_container@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXPBX0@Z + ?__annotate_contiguous_container@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@ABEXPBX0@Z + ?__annotate_contiguous_container@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXPBX0@Z + ?__annotate_contiguous_container@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXPBX0@Z + ?__annotate_contiguous_container@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXPBX0@Z + ?__annotate_contiguous_container@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXPBX0@Z + ?__annotate_contiguous_container@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXPBX0@Z + ?__annotate_contiguous_container@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXPBX0@Z + ?__annotate_contiguous_container@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXPBX0@Z + ?__annotate_contiguous_container@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABEXPBX0@Z + ?__annotate_delete@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXXZ + ?__annotate_delete@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXXZ + ?__annotate_delete@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXXZ + ?__annotate_delete@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@ABEXXZ + ?__annotate_delete@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXXZ + ?__annotate_delete@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXXZ + ?__annotate_delete@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXXZ + ?__annotate_delete@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXXZ + ?__annotate_delete@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXXZ + ?__annotate_delete@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXXZ + ?__annotate_delete@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXXZ + ?__annotate_delete@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABEXXZ + ?__annotate_increase@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_increase@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_increase@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_increase@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_increase@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_increase@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_increase@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_increase@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_increase@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_increase@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_increase@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABEXI@Z + ?__annotate_increase_back@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_increase_back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_new@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_new@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_new@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_new@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_new@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_new@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_new@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_new@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_new@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_new@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_new@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_new@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_new@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABEXI@Z + ?__annotate_poison_block@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXPBX0@Z + ?__annotate_shrink@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_shrink@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_shrink@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_shrink@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_shrink@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_shrink@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_shrink@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_shrink@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_shrink@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_shrink@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXI@Z + ?__annotate_shrink@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABEXI@Z + ?__annotate_shrink_back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXII@Z + ?__annotate_whole_block@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXIW4__asan_annotation_type@123@@Z + ?__annotate_whole_block@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@ABEXIW4__asan_annotation_type@123@@Z + ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z + ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z + ?__as_base@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@IGAE@XZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__back_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__back_spare@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?__back_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?__back_spare_blocks@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?__base_destruct_at_end@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAPAVCordzHandle@cord_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AAEXPAPAVLogSink@absl@@@Z + ?__base_destruct_at_end@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXPAPBVCommandLineFlag@absl@@@Z + ?__base_destruct_at_end@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAPBVCordzHandle@cord_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAUTransition@cctz@time_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAUTransitionType@cctz@time_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXPAUUnrecognizedFlag@absl@@@Z + ?__base_destruct_at_end@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAUViableSubstitution@strings_internal@absl@@@Z + ?__base_destruct_at_end@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__begin@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@SAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU4567@@Z + ?__begin@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@__Cr@std@@SAPBUPrefixCrc@CrcCordState@crc_internal@absl@@PBQBU4567@@Z + ?__call@?$__to_address_helper@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@X@__Cr@std@@SAPAPAVCommandLineFlag@absl@@ABV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@23@@Z + ?__call@?$__to_address_helper@V?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@X@__Cr@std@@SAPAPAVLogSink@absl@@ABV?$__wrap_iter@PAPAVLogSink@absl@@@23@@Z + ?__call@?$__to_address_helper@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@X@__Cr@std@@SAPAPBVCommandLineFlag@absl@@ABV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@23@@Z + ?__call@?$__to_address_helper@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@X@__Cr@std@@SAPAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@ABV678@@Z@ABV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@23@@Z + ?__capacity@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?__capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?__complete@?$__exception_guard_noexceptions@V@?0??__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z@@__Cr@std@@QAEXXZ + ?__complete@?$__exception_guard_noexceptions@V?$_AllocatorDestroyRangeReverse@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@PAUUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?__compose@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU5678@@Z + ?__construct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXI@Z + ?__construct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXI@Z + ?__construct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z + ?__construct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z + ?__copy_assign_alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXABV123@@Z + ?__copy_assign_alloc@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXABV123@U?$integral_constant@_N$0A@@23@@Z + ?__deallocate_node@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAEXPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@23@@Z + ?__deallocate_node@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@23@@Z + ?__deallocate_node_list@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAEXPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@@Z + ?__deallocate_node_list@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@@Z + ?__destruct_at_begin@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__destruct_at_begin@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$00@23@@Z + ?__destruct_at_begin@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_begin@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$00@23@@Z + ?__destruct_at_end@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAPAVLogSink@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAPAVLogSink@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__destruct_at_end@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AAEXPAPAVLogSink@absl@@@Z + ?__destruct_at_end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAUTransition@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAUTransitionType@cctz@time_internal@absl@@@Z + ?__destruct_at_end@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAUViableSubstitution@strings_internal@absl@@@Z + ?__end@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@SAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU4567@@Z + ?__end@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@__Cr@std@@SAPBUPrefixCrc@CrcCordState@crc_internal@absl@@PBQBU4567@@Z + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@XZ + ?__end_node@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@XZ + ?__erase_to_end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@@Z + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEPAPAVCommandLineFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEPAPAVCordzHandle@cord_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEPAPAVLogSink@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEPAPBVCommandLineFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEPAPBVCordzHandle@cord_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAUTransition@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAUTransitionType@cctz@time_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEPAUUnrecognizedFlag@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEPAUViableSubstitution@strings_internal@absl@@XZ + ?__front_cap@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__front_spare@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?__front_spare@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?__front_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PAVCommandLineFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PAVLogSink@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PBVCommandLineFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEAAV?$allocator@UUnrecognizedFlag@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEAAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@XZ + ?__get_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@XZ + ?__get_np@?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@ABEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@XZ + ?__get_np@?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@ABEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@XZ + ?__get_value@?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@QAEAAPBUCordRep@cord_internal@absl@@XZ + ?__get_value@?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@QAEAAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ + ?__get_value@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@QAEAAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@XZ + ?__get_value@?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@QAEAAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@XZ + ?__hash@?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@QBEIXZ + ?__hash@?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QBEIXZ + ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@AAPAV?$__tree_node_base@PAX@23@PAV523@@Z + ?__insert_node_at@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_end_node@PAV?$__tree_node_base@PAX@__Cr@std@@@23@AAPAV?$__tree_node_base@PAX@23@PAV523@@Z + ?__local@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@SAPAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@Z + ?__local@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@__Cr@std@@SAPBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@@Z + ?__make_iter@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAE?AV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@23@PAPAVCommandLineFlag@absl@@@Z + ?__make_iter@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAE?AV?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@23@PAPAVCordzHandle@cord_internal@absl@@@Z + ?__make_iter@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AAE?AV?$__wrap_iter@PAPAVLogSink@absl@@@23@PAPAVLogSink@absl@@@Z + ?__make_iter@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@ABE?AV?$__wrap_iter@PBQAVLogSink@absl@@@23@PBQAVLogSink@absl@@@Z + ?__make_iter@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAE?AV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@23@PAPBVCommandLineFlag@absl@@@Z + ?__make_iter@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@ABE?AV?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__make_iter@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAE?AV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@23@PAUTransition@cctz@time_internal@absl@@@Z + ?__make_iter@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAE?AV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@23@PAUTransitionType@cctz@time_internal@absl@@@Z + ?__make_iter@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AAE?AV?$__wrap_iter@PAUUnrecognizedFlag@absl@@@23@PAUUnrecognizedFlag@absl@@@Z + ?__make_iter@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@ABE?AV?$__wrap_iter@PBUUnrecognizedFlag@absl@@@23@PBUUnrecognizedFlag@absl@@@Z + ?__make_iter@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$__wrap_iter@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__maybe_remove_back_spare@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAE_N_N@Z + ?__move_range@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAUTransition@cctz@time_internal@absl@@00@Z + ?__move_range@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPAUTransitionType@cctz@time_internal@absl@@00@Z + ?__node_alloc@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAEAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@23@XZ + ?__node_alloc@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@23@XZ + ?__ptr@?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@QAEPAU123@XZ + ?__ptr@?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAEPAU123@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QBEPAPAVCommandLineFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QBEPAPAVCordzHandle@cord_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QBEPAPAVLogSink@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QBEPAPBVCommandLineFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QBEPAPBVCordzHandle@cord_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QBEPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QBEPAUTransition@cctz@time_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QBEPAUTransitionType@cctz@time_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QBEPAUUnrecognizedFlag@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QBEPAUViableSubstitution@strings_internal@absl@@XZ + ?__raw_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QBEPAPAVCommandLineFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QBEPAPAVCordzHandle@cord_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QBEPAPAVLogSink@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QBEPAPBVCommandLineFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QBEPAPBVCordzHandle@cord_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QBEPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QBEPAUTransition@cctz@time_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QBEPAUTransitionType@cctz@time_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QBEPAUUnrecognizedFlag@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QBEPAUViableSubstitution@strings_internal@absl@@XZ + ?__raw_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?__recommend@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABEII@Z + ?__recommend@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@ABEII@Z + ?__recommend@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@ABEII@Z + ?__recommend@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@ABEII@Z + ?__recommend@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@ABEII@Z + ?__recommend@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@ABEII@Z + ?__recommend@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEII@Z + ?__recommend@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABEII@Z + ?__recommend@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@ABEII@Z + ?__recommend@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@ABEII@Z + ?__recommend@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABEII@Z + ?__recommend_blocks@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAII@Z + ?__rehash_unique@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAEXI@Z + ?__rehash_unique@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEXI@Z + ?__rewrap@?$__unwrap_iter_impl@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@SAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV45678@0@Z + ?__rewrap@?$__unwrap_iter_impl@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@PAPAVLogSink@absl@@$00@__Cr@std@@SAPAPAVLogSink@absl@@PAPAV45@0@Z + ?__rewrap@?$__unwrap_iter_impl@PAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@PAUTransition@cctz@time_internal@absl@@$00@__Cr@std@@SAPAUTransition@cctz@time_internal@absl@@PAU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@PAUTransitionType@cctz@time_internal@absl@@$00@__Cr@std@@SAPAUTransitionType@cctz@time_internal@absl@@PAU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@PBUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU4567@0@Z + ?__rewrap@?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@$0A@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@V423@0@Z + ?__rewrap@?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@$0A@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@V423@0@Z + ?__rewrap@?$__unwrap_iter_impl@V?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@$00@__Cr@std@@SA?AV?$__wrap_iter@PAPAVLogSink@absl@@@23@V423@PAPAVLogSink@absl@@@Z + ?__rewrap@?$__unwrap_range_impl@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@__Cr@std@@SA@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@__Cr@std@@SA@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PAPAVLogSink@absl@@PAPAV12@@__Cr@std@@SA@PAPAVLogSink@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PAUTransition@cctz@time_internal@absl@@PAU1234@@__Cr@std@@SA@PAUTransition@cctz@time_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@__Cr@std@@SA@PAUTransitionType@cctz@time_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@@__Cr@std@@SA@PBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__rewrap@?$__unwrap_range_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V123@@__Cr@std@@SA@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@0@Z + ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@XZ + ?__root@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@XZ + ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAPAV?$__tree_node_base@PAX@23@XZ + ?__root_ptr@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QBEPAPAV?$__tree_node_base@PAX@23@XZ + ?__segment@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@@__Cr@std@@SAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@Z + ?__segment@?$__segmented_iterator_traits@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@__Cr@std@@SAPBQBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEXPAPAVLogSink@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXI@Z + ?__set_capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEXPAPAVLogSink@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@@Z + ?__set_data@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEXPAPAVLogSink@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@@Z + ?__set_sentinel@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEXPAPAVLogSink@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@0@Z + ?__set_valid_range@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@0@Z + ?__size@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAIXZ + ?__size@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEABIXZ + ?__size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAIXZ + ?__size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEABIXZ + ?__swap_layouts@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_layouts@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_layouts@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_layouts@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAEXAAV?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@23@@Z + ?__swap_out_circular_buffer@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEPAUTransition@cctz@time_internal@absl@@AAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@PAU4567@@Z + ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEPAUTransitionType@cctz@time_internal@absl@@AAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@PAU4567@@Z + ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_out_circular_buffer@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@23@@Z + ?__swap_out_circular_buffer@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXAAV?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@23@@Z + ?__swap_out_circular_buffer@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAEXAAV?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXAAV?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@23@@Z + ?__swap_without_allocator@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXAAV?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXAAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXAAV?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXAAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEXAAV?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@23@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXAAV123@@Z + ?__swap_without_allocator@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEXAAV123@@Z + ?__throw_length_error@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@CAXXZ + ?__unwrap@?$__unwrap_iter_impl@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$00@__Cr@std@@SAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV45678@@Z + ?__unwrap@?$__unwrap_iter_impl@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@PAPAVLogSink@absl@@$00@__Cr@std@@SAPAPAVLogSink@absl@@PAPAV45@@Z + ?__unwrap@?$__unwrap_iter_impl@PAUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@PAUTransition@cctz@time_internal@absl@@$00@__Cr@std@@SAPAUTransition@cctz@time_internal@absl@@PAU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@PAUTransitionType@cctz@time_internal@absl@@$00@__Cr@std@@SAPAUTransitionType@cctz@time_internal@absl@@PAU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@PBUPrefixCrc@CrcCordState@crc_internal@absl@@$00@__Cr@std@@SAPBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU4567@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@__Cr@std@@$0A@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@V423@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@$0A@@__Cr@std@@SA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@V423@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@$00@__Cr@std@@SAPAPAVCommandLineFlag@absl@@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@23@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@$00@__Cr@std@@SAPAPAVLogSink@absl@@V?$__wrap_iter@PAPAVLogSink@absl@@@23@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@$00@__Cr@std@@SAPAPBVCommandLineFlag@absl@@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@23@@Z + ?__unwrap@?$__unwrap_iter_impl@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@$00@__Cr@std@@SAPAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@ABV678@@Z@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@23@@Z + ?__unwrap@?$__unwrap_range_impl@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@__Cr@std@@SA@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@PAPAU1234@@__Cr@std@@SA@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PAPAVLogSink@absl@@PAPAV12@@__Cr@std@@SA@PAPAVLogSink@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PAUTransition@cctz@time_internal@absl@@PAU1234@@__Cr@std@@SA@PAUTransition@cctz@time_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@__Cr@std@@SA@PAUTransitionType@cctz@time_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@PBUPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@@__Cr@std@@SA@PBUPrefixCrc@CrcCordState@crc_internal@absl@@0@Z + ?__unwrap@?$__unwrap_range_impl@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V123@@__Cr@std@@SA@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@0@Z + ?__unwrap@?$__unwrap_range_impl@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@V123@@__Cr@std@@SA@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@23@0@Z + ?__upcast@?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@QAEPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@23@XZ + ?__upcast@?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAEPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@23@XZ + ?_mm_cmpgt_epi8_fixed@container_internal@absl@@YA?AT__m128i@@T3@0@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uday_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uhour_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uminute_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Umonth_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Usecond_tag@1234@U51234@@Z + ?align@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uyear_tag@1234@U51234@@Z + ?alloc@Storage@?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QAEAAV?$allocator@D@__Cr@std@@XZ + ?alloc_size@RawHashSetLayout@container_internal@absl@@QBEIXZ + ?allocate@?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z + ?allocate@?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEPAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@I@Z + ?allocate@?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@I@Z + ?allocate@?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@QAEPAPAUCordRep@cord_internal@absl@@I@Z + ?allocate@?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ?allocate@?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@QAEPAPAVCommandLineFlag@absl@@I@Z + ?allocate@?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@QAEPAPAVCordzHandle@cord_internal@absl@@I@Z + ?allocate@?$allocator@PAVLogSink@absl@@@__Cr@std@@QAEPAPAVLogSink@absl@@I@Z + ?allocate@?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@QAEPAPBVCommandLineFlag@absl@@I@Z + ?allocate@?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@QAEPAPBVCordzHandle@cord_internal@absl@@I@Z + ?allocate@?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QAEPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z + ?allocate@?$allocator@U?$AlignedType@$03@container_internal@absl@@@__Cr@std@@QAEPAU?$AlignedType@$03@container_internal@absl@@I@Z + ?allocate@?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@QAEPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@23@I@Z + ?allocate@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAEPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@23@I@Z + ?allocate@?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@23@PBXPAX2@Z@@__Cr@std@@QAEPAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@56@PBXPAX2@Z@I@Z + ?allocate@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QAEPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@I@Z + ?allocate@?$allocator@UPayload@status_internal@absl@@@__Cr@std@@QAEPAUPayload@status_internal@absl@@I@Z + ?allocate@?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QAEPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ?allocate@?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@QAEPAUTransition@cctz@time_internal@absl@@I@Z + ?allocate@?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@QAEPAUTransitionType@cctz@time_internal@absl@@I@Z + ?allocate@?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@QAEPAUUnrecognizedFlag@absl@@I@Z + ?allocate@?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@QAEPAUViableSubstitution@strings_internal@absl@@I@Z + ?allocate@?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@I@Z + ?allocate@?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@I@Z + ?allocate@?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@I@Z + ?allocate@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@QAEPAVFormatArgImpl@str_format_internal@absl@@I@Z + ?allocate@?$allocator_traits@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@AAV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@I@Z + ?allocate@?$allocator_traits@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@AAV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@I@Z + ?allocate@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAPAPAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@23@I@Z + ?allocate@?$allocator_traits@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAPAPAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@I@Z + ?allocate@?$allocator_traits@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAPAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@23@I@Z + ?allocate@?$allocator_traits@V?$allocator@U?$AlignedType@$03@container_internal@absl@@@__Cr@std@@@__Cr@std@@SAPAU?$AlignedType@$03@container_internal@absl@@AAV?$allocator@U?$AlignedType@$03@container_internal@absl@@@23@I@Z + ?allocate@?$allocator_traits@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@23@AAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@I@Z + ?allocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@23@AAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@I@Z + ?allocate@?$allocator_traits@V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@23@PBXPAX2@Z@@__Cr@std@@@__Cr@std@@SAPAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@56@PBXPAX2@Z@AAV?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@23@PBXPAX2@Z@@23@I@Z + ?allocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAPAUPayload@status_internal@absl@@AAV?$allocator@UPayload@status_internal@absl@@@23@I@Z + ?allocate@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAPAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@23@I@Z + ?allocate@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@23@I@Z + ?allocate@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@AAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@23@I@Z + ?allocate@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAPAVFormatArgImpl@str_format_internal@absl@@AAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@23@I@Z + ?allocate_at_least@?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QAE?AU?$allocation_result@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@23@I@Z + ?allocate_at_least@?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QAE?AU?$allocation_result@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@23@I@Z + ?allocate_at_least@?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@QAE?AU?$allocation_result@PAPAVCommandLineFlag@absl@@I@23@I@Z + ?allocate_at_least@?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@QAE?AU?$allocation_result@PAPAVCordzHandle@cord_internal@absl@@I@23@I@Z + ?allocate_at_least@?$allocator@PAVLogSink@absl@@@__Cr@std@@QAE?AU?$allocation_result@PAPAVLogSink@absl@@I@23@I@Z + ?allocate_at_least@?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@QAE?AU?$allocation_result@PAPBVCommandLineFlag@absl@@I@23@I@Z + ?allocate_at_least@?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@QAE?AU?$allocation_result@PAPBVCordzHandle@cord_internal@absl@@I@23@I@Z + ?allocate_at_least@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QAE?AU?$allocation_result@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@I@23@I@Z + ?allocate_at_least@?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@QAE?AU?$allocation_result@PAUTransition@cctz@time_internal@absl@@I@23@I@Z + ?allocate_at_least@?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@QAE?AU?$allocation_result@PAUTransitionType@cctz@time_internal@absl@@I@23@I@Z + ?allocate_at_least@?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@QAE?AU?$allocation_result@PAUUnrecognizedFlag@absl@@I@23@I@Z + ?allocate_at_least@?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@QAE?AU?$allocation_result@PAUViableSubstitution@strings_internal@absl@@I@23@I@Z + ?allocate_at_least@?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAE?AU?$allocation_result@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@I@23@I@Z + ?arg@BoundConversion@str_format_internal@absl@@QBEPBVFormatArgImpl@23@XZ + ?as_chars@InlineData@cord_internal@absl@@QAEPADXZ + ?as_chars@InlineData@cord_internal@absl@@QBEPBDXZ + ?as_chars@Rep@InlineData@cord_internal@absl@@QAEPADXZ + ?as_chars@Rep@InlineData@cord_internal@absl@@QBEPBDXZ + ?as_conv@ConvTag@str_format_internal@absl@@QBE?AW4FormatConversionChar@3@XZ + ?as_flags@ConvTag@str_format_internal@absl@@QBE?AW4Flags@23@XZ + ?as_length@ConvTag@str_format_internal@absl@@QBE?AW4LengthMod@3@XZ + ?as_tree@InlineData@cord_internal@absl@@QBEPAUCordRep@23@XZ + ?as_tree@InlineRep@Cord@absl@@QBEPAUCordRep@cord_internal@3@XZ + ?ascii_isdigit@absl@@YA_NE@Z + ?ascii_isprint@absl@@YA_NE@Z + ?ascii_isspace@absl@@YA_NE@Z + ?ascii_isxdigit@absl@@YA_NE@Z + ?ascii_tolower@absl@@YADE@Z + ?ascii_toupper@absl@@YADE@Z + ?assert_is_full@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABEXPBD@Z + ?at_end@?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QBE_NXZ + ?back@?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QAEAAPAUCordRep@cord_internal@2@XZ + ?back@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEABUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?back@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@XZ + ?back@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransitionType@cctz@time_internal@absl@@XZ + ?back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUViableSubstitution@strings_internal@absl@@XZ + ?back@CordRepBtree@cord_internal@absl@@QBEIXZ + ?base@?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@QBEPAPAVCommandLineFlag@absl@@XZ + ?base@?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@__Cr@std@@QBEPAPAVCordzHandle@cord_internal@absl@@XZ + ?base@?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@QBEPAPAVLogSink@absl@@XZ + ?base@?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@QBEPAPBVCommandLineFlag@absl@@XZ + ?base@?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@QBEPAUTransition@cctz@time_internal@absl@@XZ + ?base@?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QBEPAUTransitionType@cctz@time_internal@absl@@XZ + ?base@?$__wrap_iter@PAUUnrecognizedFlag@absl@@@__Cr@std@@QBEPAUUnrecognizedFlag@absl@@XZ + ?base@?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@QBEPAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@ABV678@@Z@XZ + ?base@?$__wrap_iter@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QBEPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?base@?$__wrap_iter@PBQAVLogSink@absl@@@__Cr@std@@QBEPBQAVLogSink@absl@@XZ + ?base@?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QBEPBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?base@?$__wrap_iter@PBUTransition@cctz@time_internal@absl@@@__Cr@std@@QBEPBUTransition@cctz@time_internal@absl@@XZ + ?base@?$__wrap_iter@PBUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QBEPBUTransitionType@cctz@time_internal@absl@@XZ + ?base@?$__wrap_iter@PBUUnrecognizedFlag@absl@@@__Cr@std@@QBEPBUUnrecognizedFlag@absl@@XZ + ?base@?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QGBEABQAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?base@?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QGBEABQAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?base@?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@QGBEABQAUTransition@cctz@time_internal@absl@@XZ + ?base@?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@QGBEABQAUTransitionType@cctz@time_internal@absl@@XZ + ?begin@?$BitMask@G$0BA@$0A@$0A@@container_internal@absl@@QBE?AV123@XZ + ?begin@?$BitMask@_K$07$02$0A@@container_internal@absl@@QBE?AV123@XZ + ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAEPAUPayload@status_internal@2@XZ + ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QBEPBUPayload@status_internal@2@XZ + ?begin@?$Span@$$CBI@absl@@QBEPBIXZ + ?begin@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QBEPBVFormatArgImpl@str_format_internal@2@XZ + ?begin@?$Span@I@absl@@QBEPAIXZ + ?begin@?$Span@PAVLogSink@absl@@@absl@@QBEPAPAVLogSink@2@XZ + ?begin@?$Span@QAUCordRep@cord_internal@absl@@@absl@@QBEPBQAUCordRep@cord_internal@2@XZ + ?begin@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?begin@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?begin@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?begin@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEPBQAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEPAPAVCommandLineFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEPAPAVCordzHandle@cord_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEPAPAVLogSink@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEPAPBVCommandLineFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEPAPBVCordzHandle@cord_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAUTransition@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAUTransitionType@cctz@time_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEPAUUnrecognizedFlag@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEPAUViableSubstitution@strings_internal@absl@@XZ + ?begin@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@23@XZ + ?begin@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@23@XZ + ?begin@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@$0BA@@__Cr@std@@QAE?AV?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@23@XZ + ?begin@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@XZ + ?begin@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBE?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@XZ + ?begin@?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@QBEPBVFormatArgImpl@str_format_internal@absl@@XZ + ?begin@?$initializer_list@W4FormatConversionCharSet@absl@@@std@@QBEPBW4FormatConversionCharSet@absl@@XZ + ?begin@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@@23@XZ + ?begin@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@@23@XZ + ?begin@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE?AViterator@123@XZ + ?begin@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@XZ + ?begin@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@23@XZ + ?begin@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@23@XZ + ?begin@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAPAVLogSink@absl@@@23@XZ + ?begin@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QBE?AV?$__wrap_iter@PBQAVLogSink@absl@@@23@XZ + ?begin@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@23@XZ + ?begin@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QBE?AV?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ + ?begin@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@23@XZ + ?begin@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@23@XZ + ?begin@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAUUnrecognizedFlag@absl@@@23@XZ + ?begin@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QBE?AV?$__wrap_iter@PBUUnrecognizedFlag@absl@@@23@XZ + ?begin@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__wrap_iter@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@XZ + ?begin@ChunkRange@Cord@absl@@QBE?AVChunkIterator@23@XZ + ?begin@CordRepBtree@cord_internal@absl@@QBEIXZ + ?begin@Storage@?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QBEPADXZ + ?begin@__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBE?AU1234@XZ + ?btree@CordRep@cord_internal@absl@@QAEPAVCordRepBtree@23@XZ + ?btree@CordRep@cord_internal@absl@@QBEPBVCordRepBtree@23@XZ + ?btree@CordRepBtreeNavigator@cord_internal@absl@@QBEPAVCordRepBtree@23@XZ + ?btree@CordRepBtreeReader@cord_internal@absl@@QBEPAVCordRepBtree@23@XZ + ?bucket_count@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QBEIXZ + ?bucket_count@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QBEIXZ + ?bytes_value@ProtoField@log_internal@absl@@QBE?AV?$Span@$$CBD@3@XZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEIXZ + ?capacity@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QBEIXZ + ?capacity@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?capacity@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?capacity@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?capacity@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?capacity@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?capacity@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?capacity@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?capacity@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?capacity@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?capacity@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?capacity@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEIXZ + ?capacity@CommonFields@container_internal@absl@@QBEIXZ + ?capacity@CordBuffer@absl@@QBEIXZ + ?capacity@CordRepBtree@cord_internal@absl@@QBEIXZ + ?cbegin@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QBE?AV?$__wrap_iter@PBQAVLogSink@absl@@@23@XZ + ?char_alloc_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEAAV?$allocator@D@__Cr@std@@XZ + ?char_begin@Cord@absl@@QBE?AVCharIterator@12@XZ + ?char_end@Cord@absl@@QBE?AVCharIterator@12@XZ + ?chunk_begin@Cord@absl@@QBE?AVChunkIterator@12@XZ + ?chunk_end@Cord@absl@@QBE?AVChunkIterator@12@XZ + ?clear@?$InlinedVector@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@absl@@QAEXXZ + ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@QAEXXZ + ?clear@?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@QAEXXZ + ?clear@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?clear@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAEXXZ + ?clear@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEXXZ + ?clear@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?clear@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?clear@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?clear@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?clear@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?clear@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?clear@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?clear@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXXZ + ?clear@InlineRep@Cord@absl@@QAEPAUCordRep@cord_internal@3@XZ + ?clear_backing_array@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEX_N@Z + ?clear_cordz_info@InlineData@cord_internal@absl@@QAEXXZ + ?code@Status@absl@@QBE?AW4StatusCode@2@XZ + ?code@StatusRep@status_internal@absl@@QBE?AW4StatusCode@3@XZ + ?combine@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@23@V423@@Z + ?combine_contiguous@MixingHashState@hash_internal@absl@@SA?AV123@V123@PBEI@Z + ?combine_raw@MixingHashState@hash_internal@absl@@CA?AV123@V123@_K@Z + ?common@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEAAVCommonFields@23@XZ + ?common@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABEABVCommonFields@23@XZ + ?compare_exchange_strong@?$__atomic_base@PAUArena@LowLevelAlloc@base_internal@absl@@$0A@@__Cr@std@@QAE_NAAPAUArena@LowLevelAlloc@base_internal@absl@@PAU4567@W4memory_order@23@2@Z + ?compare_exchange_strong@?$__atomic_base@PAVTimeZone@absl@@$0A@@__Cr@std@@QAE_NAAPAVTimeZone@absl@@PAV45@W4memory_order@23@2@Z + ?compare_exchange_strong@?$__atomic_base@PAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QAE_NAAPAVVLogSite@log_internal@absl@@PAV456@W4memory_order@23@2@Z + ?compare_exchange_weak@?$__atomic_base@PAUHashtablezInfo@container_internal@absl@@$0A@@__Cr@std@@QAE_NAAPAUHashtablezInfo@container_internal@absl@@PAU456@W4memory_order@23@2@Z + ?compare_exchange_weak@?$__atomic_base@PAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QAE_NAAPAVVLogSite@log_internal@absl@@PAV456@W4memory_order@23@2@Z + ?control@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABEPAW4ctrl_t@23@XZ + ?control@CommonFields@container_internal@absl@@QBEPAW4ctrl_t@23@XZ + ?control@HeapOrSoo@container_internal@absl@@QAEAAT?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@23@XZ + ?control@HeapOrSoo@container_internal@absl@@QBE?AT?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@23@XZ + ?control@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABEPAW4ctrl_t@34@XZ + ?control_offset@RawHashSetLayout@container_internal@absl@@QBEIXZ + ?conversion_char@FormatConversionSpecImpl@str_format_internal@absl@@QBE?AW4FormatConversionChar@3@XZ + ?copy_max_inline_to@InlineData@cord_internal@absl@@QBEXPAD@Z + ?cordz_info@InlineData@cord_internal@absl@@QBEPAVCordzInfo@23@XZ + ?cordz_info@InlineRep@Cord@absl@@QBEPAVCordzInfo@cord_internal@3@XZ + ?cordz_info@Rep@InlineData@cord_internal@absl@@QBE_JXZ + ?cordz_should_profile@cord_internal@absl@@YA_JXZ + ?count@FILERawSink@str_format_internal@absl@@QBEIXZ + ?crc@CordRep@cord_internal@absl@@QAEPAUCordRepCrc@23@XZ + ?crc@CordRep@cord_internal@absl@@QBEPBUCordRepCrc@23@XZ + ?cycle_clock_source_@CycleClock@base_internal@absl@@0U?$atomic@P6A_JXZ@__Cr@std@@A + ?data@?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QAEPADXZ + ?data@?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QAEPAPAUCordRep@cord_internal@2@XZ + ?data@?$InlinedVector@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@absl@@QAEPAPAVLogSink@2@XZ + ?data@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAEPAUPayload@status_internal@2@XZ + ?data@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QBEPBUPayload@status_internal@2@XZ + ?data@?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QBEPBVFormatArgImpl@str_format_internal@2@XZ + ?data@?$Span@$$CBD@absl@@QBEPBDXZ + ?data@?$Span@$$CBI@absl@@QBEPBIXZ + ?data@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QBEPBVFormatArgImpl@str_format_internal@2@XZ + ?data@?$Span@D@absl@@QBEPADXZ + ?data@?$Span@I@absl@@QBEPAIXZ + ?data@?$Span@PAVLogSink@absl@@@absl@@QBEPAPAVLogSink@2@XZ + ?data@?$Span@QAUCordRep@cord_internal@absl@@@absl@@QBEPBQAUCordRep@cord_internal@2@XZ + ?data@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@$0BA@@__Cr@std@@QAEPAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@ABV678@@Z@XZ + ?data@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QBEPBQAVCommandLineFlag@absl@@XZ + ?data@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPBQAVCordzHandle@cord_internal@absl@@XZ + ?data@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEPAPAVLogSink@absl@@XZ + ?data@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QBEPBQAVLogSink@absl@@XZ + ?data@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QBEPBQBVCommandLineFlag@absl@@XZ + ?data@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPBQBVCordzHandle@cord_internal@absl@@XZ + ?data@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?data@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPBUTransition@cctz@time_internal@absl@@XZ + ?data@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPBUTransitionType@cctz@time_internal@absl@@XZ + ?data@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QBEPBUUnrecognizedFlag@absl@@XZ + ?data@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPBUViableSubstitution@strings_internal@absl@@XZ + ?data@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPBV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?data@AlphaNum@absl@@QBEPBDXZ + ?data@CordBuffer@absl@@QAEPADXZ + ?data@InlineRep@Cord@absl@@QBEPBDXZ + ?data@NonEmptyInlinedStorage@?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QAEPADXZ + ?data@Rep@CordBuffer@absl@@QAEPADXZ + ?day@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?day@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?day@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z + ?days_per_4years@impl@detail@cctz@time_internal@absl@@YAHH@Z + ?days_per_century@impl@detail@cctz@time_internal@absl@@YAHH@Z + ?days_per_month@impl@detail@cctz@time_internal@absl@@YAH_JC@Z + ?days_per_year@impl@detail@cctz@time_internal@absl@@YAH_JC@Z + ?dealloc@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXXZ + ?deallocate@?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z + ?deallocate@?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@I@Z + ?deallocate@?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@I@Z + ?deallocate@?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@QAEXPAPAUCordRep@cord_internal@absl@@I@Z + ?deallocate@?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QAEXPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ?deallocate@?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@QAEXPAPAVCommandLineFlag@absl@@I@Z + ?deallocate@?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@I@Z + ?deallocate@?$allocator@PAVLogSink@absl@@@__Cr@std@@QAEXPAPAVLogSink@absl@@I@Z + ?deallocate@?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@QAEXPAPBVCommandLineFlag@absl@@I@Z + ?deallocate@?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@I@Z + ?deallocate@?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@QAEXPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z + ?deallocate@?$allocator@U?$AlignedType@$03@container_internal@absl@@@__Cr@std@@QAEXPAU?$AlignedType@$03@container_internal@absl@@I@Z + ?deallocate@?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@QAEXPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@23@I@Z + ?deallocate@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAEXPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@23@I@Z + ?deallocate@?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@23@PBXPAX2@Z@@__Cr@std@@QAEXPAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@56@PBXPAX2@Z@I@Z + ?deallocate@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@I@Z + ?deallocate@?$allocator@UPayload@status_internal@absl@@@__Cr@std@@QAEXPAUPayload@status_internal@absl@@I@Z + ?deallocate@?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@QAEXPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ?deallocate@?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@QAEXPAUTransition@cctz@time_internal@absl@@I@Z + ?deallocate@?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@I@Z + ?deallocate@?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@QAEXPAUUnrecognizedFlag@absl@@I@Z + ?deallocate@?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@QAEXPAUViableSubstitution@strings_internal@absl@@I@Z + ?deallocate@?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@I@Z + ?deallocate@?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@I@Z + ?deallocate@?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@I@Z + ?deallocate@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@QAEXPAVFormatArgImpl@str_format_internal@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@PAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@I@Z + ?deallocate@?$allocator_traits@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@PAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@I@Z + ?deallocate@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@23@PAPAUCordRep@cord_internal@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAVCommandLineFlag@absl@@@23@PAPAVCommandLineFlag@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@PAPAVCordzHandle@cord_internal@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PAVLogSink@absl@@@23@PAPAVLogSink@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PBVCommandLineFlag@absl@@@23@PAPBVCommandLineFlag@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@PAPBVCordzHandle@cord_internal@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@23@PAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@U?$AlignedType@$03@container_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@U?$AlignedType@$03@container_internal@absl@@@23@PAU?$AlignedType@$03@container_internal@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@23@I@Z + ?deallocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@23@I@Z + ?deallocate@?$allocator_traits@V?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@23@PBXPAX2@Z@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@23@PBXPAX2@Z@@23@PAUAlignedSpace@?1???$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@67@PBXPAX3@Z@I@Z + ?deallocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UPayload@status_internal@absl@@@23@PAUPayload@status_internal@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@23@PAUPrefixCrc@CrcCordState@crc_internal@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UTransition@cctz@time_internal@absl@@@23@PAUTransition@cctz@time_internal@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@PAUTransitionType@cctz@time_internal@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UUnrecognizedFlag@absl@@@23@PAUUnrecognizedFlag@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@PAUViableSubstitution@strings_internal@absl@@I@Z + ?deallocate@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@23@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@I@Z + ?deallocate@?$allocator_traits@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@23@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@I@Z + ?deallocate@?$allocator_traits@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@I@Z + ?deallocate@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@SAXAAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@23@PAVFormatArgImpl@str_format_internal@absl@@I@Z + ?decrement_size@CommonFields@container_internal@absl@@QAEXXZ + ?decrement_size@HashtableSize@container_internal@absl@@QAEXXZ + ?decrement_small_size@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXXZ + ?delimiter@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBEABVByAnyChar@3@XZ + ?delimiter@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBEABVByAnyChar@3@XZ + ?delimiter@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBEABVByChar@3@XZ + ?description@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@@Z + ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@@Z + ?destroy@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@@Z + ?destroy_slots@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXXZ + ?destructor_impl@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXXZ + ?difference@detail@cctz@time_internal@absl@@YA_JUday_tag@1234@Ufields@1234@1@Z + ?difference@detail@cctz@time_internal@absl@@YA_JUhour_tag@1234@Ufields@1234@1@Z + ?difference@detail@cctz@time_internal@absl@@YA_JUminute_tag@1234@Ufields@1234@1@Z + ?difference@detail@cctz@time_internal@absl@@YA_JUsecond_tag@1234@Ufields@1234@1@Z + ?effective_impl@time_zone@cctz@time_internal@absl@@ABEABVImpl@1234@XZ + ?element@?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@SAAAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@PAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@@Z + ?emplace@?$map_slot_policy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@CAXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@@Z + ?empty@?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QBE_NXZ + ?empty@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QBE_NXZ + ?empty@?$Span@$$CBD@absl@@QBE_NXZ + ?empty@?$Span@D@absl@@QBE_NXZ + ?empty@?$Span@I@absl@@QBE_NXZ + ?empty@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBE_NXZ + ?empty@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBE_NXZ + ?empty@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBE_NXZ + ?empty@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QBE_NXZ + ?empty@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QBE_NXZ + ?empty@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QBE_NXZ + ?empty@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBE_NXZ + ?empty@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBE_NXZ + ?empty@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QBE_NXZ + ?empty@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QBE_NXZ + ?empty@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBE_NXZ + ?empty@CommonFields@container_internal@absl@@QBE_NXZ + ?empty@Cord@absl@@QBE_NXZ + ?empty@HashtableSize@container_internal@absl@@QBE_NXZ + ?encoded_message@LogEntry@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?encoded_remaining@LogMessageData@LogMessage@log_internal@absl@@QAEAAV?$Span@D@4@XZ + ?end@?$BitMask@G$0BA@$0A@$0A@@container_internal@absl@@QBE?AV123@XZ + ?end@?$BitMask@_K$07$02$0A@@container_internal@absl@@QBE?AV123@XZ + ?end@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAEPAUPayload@status_internal@2@XZ + ?end@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QBEPBUPayload@status_internal@2@XZ + ?end@?$Span@$$CBI@absl@@QBEPBIXZ + ?end@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QBEPBVFormatArgImpl@str_format_internal@2@XZ + ?end@?$Span@I@absl@@QBEPAIXZ + ?end@?$Span@PAVLogSink@absl@@@absl@@QBEPAPAVLogSink@2@XZ + ?end@?$Span@QAUCordRep@cord_internal@absl@@@absl@@QBEPBQAUCordRep@cord_internal@2@XZ + ?end@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?end@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?end@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$SplitIterator@V?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@23@XZ + ?end@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QAEPAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVCommandLineFlag@absl@@AAV?$allocator@PAVCommandLineFlag@absl@@@23@@__Cr@std@@QAEPAPAVCommandLineFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEPAPAVCordzHandle@cord_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PAVLogSink@absl@@AAV?$allocator@PAVLogSink@absl@@@23@@__Cr@std@@QAEPAPAVLogSink@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@PBVCommandLineFlag@absl@@AAV?$allocator@PBVCommandLineFlag@absl@@@23@@__Cr@std@@QAEPAPBVCommandLineFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@@__Cr@std@@QAEPAPBVCordzHandle@cord_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@@__Cr@std@@QAEPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAUTransition@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@@__Cr@std@@QAEPAUTransitionType@cctz@time_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@V__split_buffer_pointer_layout@45@@__Cr@std@@UUnrecognizedFlag@absl@@AAV?$allocator@UUnrecognizedFlag@absl@@@23@@__Cr@std@@QAEPAUUnrecognizedFlag@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@56@@__Cr@std@@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@@__Cr@std@@QAEPAUViableSubstitution@strings_internal@absl@@XZ + ?end@?$__split_buffer_pointer_layout@V?$__split_buffer@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@V__split_buffer_pointer_layout@23@@__Cr@std@@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@AAV?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEPAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@XZ + ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@23@XZ + ?end@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@23@XZ + ?end@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__deque_iterator@PBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@AAPBV12345@PAPAPBV12345@H$0A@@23@XZ + ?end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@XZ + ?end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBE?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@XZ + ?end@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@@23@XZ + ?end@?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__map_iterator@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@@23@XZ + ?end@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE?AViterator@123@XZ + ?end@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@XZ + ?end@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAPAVCommandLineFlag@absl@@@23@XZ + ?end@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@23@XZ + ?end@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAPAVLogSink@absl@@@23@XZ + ?end@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAPBVCommandLineFlag@absl@@@23@XZ + ?end@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QBE?AV?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ + ?end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@23@XZ + ?end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@23@XZ + ?end@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAUUnrecognizedFlag@absl@@@23@XZ + ?end@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QBE?AV?$__wrap_iter@PBUUnrecognizedFlag@absl@@@23@XZ + ?end@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__wrap_iter@PAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@XZ + ?end@ChunkRange@Cord@absl@@QBE?AVChunkIterator@23@XZ + ?end@CordRepBtree@cord_internal@absl@@QBEIXZ + ?end@Storage@?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QBEPADXZ + ?end@__deque_range@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBE?AU1234@XZ + ?engines@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PIAXPIBXIV54@_N@Z@4UArchSpecificEngines@234@B + ?eq_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABEABUStringEq@23@XZ + ?erase@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAEPAUPayload@status_internal@2@PBU342@@Z + ?erase@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAPAVLogSink@absl@@@23@V?$__wrap_iter@PBQAVLogSink@absl@@@23@@Z + ?error@FILERawSink@str_format_internal@absl@@QBEHXZ + ?exchange@?$__atomic_base@PAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QAEPAVVLogSite@log_internal@absl@@PAV456@W4memory_order@23@@Z + ?external@CordRep@cord_internal@absl@@QAEPAUCordRepExternal@23@XZ + ?external@CordRep@cord_internal@absl@@QBEPBUCordRepExternal@23@XZ + ?fetch_add_end@CordRepBtree@cord_internal@absl@@AAEII@Z + ?find@?$unordered_map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@@Z + ?fits_in_soo@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABE_NI@Z + ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@ABV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z + ?flat@CordRep@cord_internal@absl@@QAEPAUCordRepFlat@23@XZ + ?flat@CordRep@cord_internal@absl@@QBEPBUCordRepFlat@23@XZ + ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV567@ABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@ABV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@967@ABVtime_zone@234@@Z + ?from_chars@absl@@YA?AUfrom_chars_result@1@PBD0AAMW4chars_format@1@@Z + ?from_chars@absl@@YA?AUfrom_chars_result@1@PBD0AANW4chars_format@1@@Z + ?front@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEAAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?front@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?front@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@XZ + ?gbswap_16@absl@@YAGG@Z + ?gbswap_32@absl@@YAII@Z + ?gbswap_64@absl@@YA_K_K@Z + ?generate_new_seed@CommonFields@container_internal@absl@@QAEX_N@Z + ?generate_new_seed@HashtableSize@container_internal@absl@@QAEXXZ + ?generation@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QBEEXZ + ?generation@HashSetIteratorGenerationInfoDisabled@container_internal@absl@@QBEEXZ + ?generation_offset@RawHashSetLayout@container_internal@absl@@QBEIXZ + ?generation_ptr@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QBEPAEXZ + ?generation_ptr@HashSetIteratorGenerationInfoDisabled@container_internal@absl@@QBEPBEXZ + ?get@?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@container_internal@absl@@QBEPAW4ctrl_t@23@XZ + ?get@?$MaybeInitializedPtr@X@container_internal@absl@@QBEPAXXZ + ?get@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QAEPAUList@CordzInfo@cord_internal@2@XZ + ?get@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QAEPAURefcountedRep@CrcCordState@crc_internal@2@XZ + ?get@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QAEPAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?get@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QBEPBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?get@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QAEPAVFlagRegistry@flags_internal@2@XZ + ?get@?$NoDestructor@VMutex@absl@@@absl@@QAEPAVMutex@2@XZ + ?get@?$Storage@I$00U?$StorageTag@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QGAEAAIXZ + ?get@?$Storage@I$00U?$StorageTag@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QGBEABIXZ + ?get@?$Storage@I$00U?$StorageTag@V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QGAEAAIXZ + ?get@?$Storage@I$00U?$StorageTag@V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QGBEABIXZ + ?get@?$Storage@I$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QGAEAAIXZ + ?get@?$Storage@I$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QGBEABIXZ + ?get@?$Storage@I$00U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QGAEAAIXZ + ?get@?$Storage@I$00U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QGBEABIXZ + ?get@?$Storage@I$0A@U?$StorageTag@IV?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$0A@@internal_compressed_tuple@container_internal@absl@@QGBEABIXZ + ?get@?$Storage@PAPAUCordRep@cord_internal@absl@@$00U?$StorageTag@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QGAEAAPAPAUCordRep@cord_internal@4@XZ + ?get@?$Storage@PAPAVLogSink@absl@@$00U?$StorageTag@V?$allocator@PAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@absl@@@internal_compressed_tuple@container_internal@2@$0A@@internal_compressed_tuple@container_internal@absl@@QGAEAAPAPAVLogSink@4@XZ + ?get@?$Storage@PAUPayload@status_internal@absl@@$00U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@3@$0A@@internal_compressed_tuple@container_internal@absl@@QGAEAAPAUPayload@status_internal@4@XZ + ?get@?$Storage@UStringEq@container_internal@absl@@$01U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QGBEABUStringEq@34@XZ + ?get@?$Storage@UStringHash@container_internal@absl@@$00U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QGAEAAUStringHash@34@XZ + ?get@?$Storage@UStringHash@container_internal@absl@@$00U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$00@internal_compressed_tuple@container_internal@absl@@QGBEABUStringHash@34@XZ + ?get@?$Storage@V?$allocator@D@__Cr@std@@$00U?$StorageTag@IV?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QGAEAAV?$allocator@D@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@D@__Cr@std@@$02U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QGAEAAV?$allocator@D@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QGAEAAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@PAPAUCordRep@cord_internal@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QGAEAAV?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@PAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PAVLogSink@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QGAEAAV?$allocator@PAVLogSink@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@PAVLogSink@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@PAVLogSink@absl@@@__Cr@std@@PAPAVLogSink@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QGAEAAV?$allocator@PAVLogSink@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QGAEAAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QGBEABV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@PAUPayload@status_internal@absl@@@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QGAEAAV?$allocator@UPayload@status_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@$0A@U?$StorageTag@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@I@internal_compressed_tuple@container_internal@absl@@$00@internal_compressed_tuple@container_internal@absl@@QGAEAAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@XZ + ?get@?$Storage@VCommonFields@container_internal@absl@@$0A@U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$0A@@internal_compressed_tuple@container_internal@absl@@QGAEAAVCommonFields@34@XZ + ?get@?$Storage@VCommonFields@container_internal@absl@@$0A@U?$StorageTag@VCommonFields@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@D@__Cr@std@@@internal_compressed_tuple@23@$0A@@internal_compressed_tuple@container_internal@absl@@QGBEABVCommonFields@34@XZ + ?get@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@XZ + ?get@?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransitionType@cctz@time_internal@absl@@XZ + ?get@?$__tuple_leaf@$00AAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@$0A@@__Cr@std@@QAEAAV?$NonIterableBitMask@G$0BA@$0A@@container_internal@absl@@XZ + ?get@?$__tuple_leaf@$0A@$$QAPAVCommandLineFlag@absl@@$0A@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@XZ + ?get@?$__tuple_leaf@$0A@AAPAVCommandLineFlag@absl@@$0A@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@XZ + ?get@?$__tuple_leaf@$0A@AAUFindInfo@container_internal@absl@@$0A@@__Cr@std@@QAEAAUFindInfo@container_internal@absl@@XZ + ?get@?$__tuple_leaf@$0A@ABQAVCommandLineFlag@absl@@$0A@@__Cr@std@@QAEABQAVCommandLineFlag@absl@@XZ + ?get@?$__tuple_leaf@$0A@PAVCommandLineFlag@absl@@$0A@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@XZ + ?get@?$unique_ptr@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QBEPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?get@?$unique_ptr@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QBEPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?get@?$unique_ptr@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@23@XZ + ?get@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@23@XZ + ?get@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QBEPAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ?get@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@XZ + ?get@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@XZ + ?get@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEPAVZoneInfoSource@cctz@time_internal@absl@@XZ + ?get@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QBEPAXXZ + ?get@PlacementImpl@?$NoDestructor@UList@CordzInfo@cord_internal@absl@@@absl@@QAEPAUList@CordzInfo@cord_internal@3@XZ + ?get@PlacementImpl@?$NoDestructor@URefcountedRep@CrcCordState@crc_internal@absl@@@absl@@QAEPAURefcountedRep@CrcCordState@crc_internal@3@XZ + ?get@PlacementImpl@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QAEPAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@3@XZ + ?get@PlacementImpl@?$NoDestructor@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@absl@@QBEPBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?get@PlacementImpl@?$NoDestructor@VFlagRegistry@flags_internal@absl@@@absl@@QAEPAVFlagRegistry@flags_internal@3@XZ + ?get@PlacementImpl@?$NoDestructor@VMutex@absl@@@absl@@QAEPAVMutex@3@XZ + ?get_cordz_mean_interval@cord_internal@absl@@YAHXZ + ?get_deleter@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEABV?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEABV?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QAEAAU?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@23@XZ + ?get_deleter@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@XZ + ?get_deleter@?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAU?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAU?$default_delete@VFlagState@flags_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAU?$default_delete@VFlagStateInterface@flags_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAU?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAU?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@23@XZ + ?get_deleter@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QAEAAUDynValueDeleter@flags_internal@absl@@XZ + ?get_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QBEHXZ + ?get_soo_data@HeapOrSoo@container_internal@absl@@QAEPAXXZ + ?get_soo_data@HeapOrSoo@container_internal@absl@@QBEPBXXZ + ?get_weekday@detail@cctz@time_internal@absl@@YA?AW4weekday@1234@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@@Z + ?get_yearday@detail@cctz@time_internal@absl@@YAHABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@@Z + ?growth_info@CommonFields@container_internal@absl@@QAEAAVGrowthInfo@23@XZ + ?growth_info@CommonFields@container_internal@absl@@QBE?AVGrowthInfo@23@XZ + ?growth_left@CommonFields@container_internal@absl@@QBEIXZ + ?has_alt_flag@FormatConversionSpecImpl@str_format_internal@absl@@QBE_NXZ + ?has_infoz@CommonFields@container_internal@absl@@QBE_NXZ + ?has_infoz@HashtableSize@container_internal@absl@@QBE_NXZ + ?has_left_flag@FormatConversionSpecImpl@str_format_internal@absl@@QBE_NXZ + ?has_parsed_conversion@UntypedFormatSpecImpl@str_format_internal@absl@@QBE_NXZ + ?has_show_pos_flag@FormatConversionSpecImpl@str_format_internal@absl@@QBE_NXZ + ?has_sign_col_flag@FormatConversionSpecImpl@str_format_internal@absl@@QBE_NXZ + ?has_timeout@KernelTimeout@synchronization_internal@absl@@QBE_NXZ + ?has_zero_flag@FormatConversionSpecImpl@str_format_internal@absl@@QBE_NXZ + ?hash_function@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAEAAU?$hash@PBUCordRep@cord_internal@absl@@@23@XZ + ?hash_function@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?hash_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEAAUStringHash@23@XZ + ?hash_ref@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABEABUStringHash@23@XZ + ?hash_with_seed@?$HashImpl@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@hash_internal@absl@@ABEIABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ?hash_with_seed@StringHash@container_internal@absl@@ABEIV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ?height@CordRepBtree@cord_internal@absl@@QBEHXZ + ?hour@?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?hour@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?hour@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?increment_size@CommonFields@container_internal@absl@@QAEXI@Z + ?increment_size@CommonFields@container_internal@absl@@QAEXXZ + ?increment_size@HashtableSize@container_internal@absl@@QAEXI@Z + ?increment_size@HashtableSize@container_internal@absl@@QAEXXZ + ?index@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@QBEIXZ + ?index@?$probe_seq@$0BA@@container_internal@absl@@QBEIXZ + ?index@CordRepBtree@cord_internal@absl@@QBEIW4EdgeType@123@@Z + ?infoz@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAE?AVHashtablezInfoHandle@23@XZ + ?infoz@CommonFields@container_internal@absl@@QAE?AVHashtablezInfoHandle@23@XZ + ?infoz_ptr@CommonFields@container_internal@absl@@QBEPAVHashtablezInfoHandle@23@XZ + ?inline_size@InlineData@cord_internal@absl@@QBEIXZ + ?inline_size@InlineRep@Cord@absl@@ABEIXZ + ?inline_size@Rep@InlineData@cord_internal@absl@@QBEIXZ + ?insert@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@$$QAU?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@56@@Z + ?insert@?$unordered_set@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE?AU?$pair@V?$__hash_const_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@23@ABQBUCordRep@cord_internal@absl@@@Z + ?int32_value@ProtoField@log_internal@absl@@QBEHXZ + ?int64_value@ProtoField@log_internal@absl@@QBE_JXZ + ?is_absolute_timeout@KernelTimeout@synchronization_internal@absl@@QBE_NXZ + ?is_basic@FormatConversionSpecImpl@str_format_internal@absl@@QBE_NXZ + ?is_conv@ConvTag@str_format_internal@absl@@QBE_NXZ + ?is_either_profiled@InlineData@cord_internal@absl@@SA_NABV123@0@Z + ?is_empty@InlineData@cord_internal@absl@@QBE_NXZ + ?is_flags@ConvTag@str_format_internal@absl@@QBE_NXZ + ?is_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QBE_NXZ + ?is_leap_year@impl@detail@cctz@time_internal@absl@@YA_N_J@Z + ?is_length@ConvTag@str_format_internal@absl@@QBE_NXZ + ?is_profiled@InlineData@cord_internal@absl@@QBE_NXZ + ?is_relative_timeout@KernelTimeout@synchronization_internal@absl@@QBE_NXZ + ?is_sampled_seed@HashtableSize@container_internal@absl@@QBE_NXZ + ?is_short@Rep@CordBuffer@absl@@QBE_NXZ + ?is_single_group@container_internal@absl@@YA_NI@Z + ?is_small@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABE_NXZ + ?is_small@CommonFields@container_internal@absl@@QBE_NXZ + ?is_snapshot@CordzHandle@cord_internal@absl@@QBE_NXZ + ?is_soo@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABE_NXZ + ?is_tree@InlineData@cord_internal@absl@@QBE_NXZ + ?is_tree@InlineRep@Cord@absl@@QBE_NXZ + ?is_tree@Rep@InlineData@cord_internal@absl@@QBE_NXZ + ?iterator_at@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IAE?AViterator@123@I@Z + ?iterator_at_ptr@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IAE?AViterator@123@U?$pair@PAW4ctrl_t@container_internal@absl@@PAX@__Cr@std@@@Z + ?kDefaultIterControl@container_internal@absl@@3W4ctrl_t@12@A + ?key_comp@?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@X@23@@__Cr@std@@QBEABU?$less@X@23@XZ + ?key_comp@?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@X@23@@__Cr@std@@QBEABU?$less@X@23@XZ + ?key_eq@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAEAAU?$equal_to@PBUCordRep@cord_internal@absl@@@23@XZ + ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?length@CordRepBtreeReader@cord_internal@absl@@QBEIXZ + ?length_mod@FormatConversionSpecImpl@str_format_internal@absl@@QBE?AW4LengthMod@3@XZ + ?load@?$__atomic_base@P6AXABUHashtablezInfo@container_internal@absl@@@Z$0A@@__Cr@std@@QBEP6AXABUHashtablezInfo@container_internal@absl@@@ZW4memory_order@23@@Z + ?load@?$__atomic_base@PAUArena@LowLevelAlloc@base_internal@absl@@$0A@@__Cr@std@@QBEPAUArena@LowLevelAlloc@base_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PAUHashtablezInfo@container_internal@absl@@$0A@@__Cr@std@@QBEPAUHashtablezInfo@container_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@QBEPAVCordzHandle@cord_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PAVCordzInfo@cord_internal@absl@@$0A@@__Cr@std@@QBEPAVCordzInfo@cord_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PAVTimeZone@absl@@$0A@@__Cr@std@@QBEPAVTimeZone@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QBEPAVVLogSite@log_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@VMaskedPointer@flags_internal@absl@@$0A@@__Cr@std@@QBE?AVMaskedPointer@flags_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__Cr@std@@QBE?AW4OnDeadlockCycle@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__Cr@std@@QBE?AW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z + ?load_time_zone@cctz@time_internal@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAVtime_zone@123@@Z + ?local_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?lock@FlagRegistry@flags_internal@absl@@QAEXXZ + ?lock@Mutex@absl@@QAEXXZ + ?lock@SpinLock@base_internal@absl@@QAEXXZ + ?lock_shared@Mutex@absl@@QAEXXZ + ?log_severity@LogEntry@absl@@QBE?AW4LogSeverity@2@XZ + ?lookup@time_zone@cctz@time_internal@absl@@QBE?AUabsolute_lookup@1234@ABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?lookup@time_zone@cctz@time_internal@absl@@QBE?AUcivil_lookup@1234@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?make_tree@InlineData@cord_internal@absl@@QAEXPAUCordRep@23@@Z + ?make_tree@Rep@InlineData@cord_internal@absl@@QAEXPAUCordRep@34@@Z + ?max@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ + ?max@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ + ?max@?$numeric_limits@Vint128@absl@@@__Cr@std@@SA?AVint128@absl@@XZ + ?max@?$numeric_limits@Vuint128@absl@@@__Cr@std@@SA?AVuint128@absl@@XZ + ?max_load_factor@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAEAAMXZ + ?max_load_factor@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAEAAMXZ + ?max_size@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?max_size@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?max_size@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?max_size@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?max_size@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?max_size@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?max_size@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?max_size@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?max_size@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?max_size@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?max_size@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEIXZ + ?maybe_increment_generation_on_insert@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QAEXXZ + ?memcasecmp@strings_internal@absl@@YAHPBD0I@Z + ?message@Status@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?message@StatusRep@status_internal@absl@@QBEABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?min@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ + ?min@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ + ?min@?$numeric_limits@Vint128@absl@@@__Cr@std@@SA?AVint128@absl@@XZ + ?minute@?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?minute@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?minute@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?month@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?month@?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?month@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?month@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?mutable_rep@CrcCordState@crc_internal@absl@@QAEPAURep@123@XZ + ?n_day@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_JC00CCC@Z + ?n_hour@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J0000CC@Z + ?n_min@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J00000C@Z + ?n_mon@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J000CCC@Z + ?n_sec@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J00000@Z + ?name@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?next@?$probe_seq@$0BA@@container_internal@absl@@QAEXXZ + ?next_transition@time_zone@cctz@time_internal@absl@@QBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@1234@@Z + ?next_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z + ?non_temporal_store_memcpy@crc_internal@absl@@YAPAXPIAXPIBXI@Z + ?non_temporal_store_memcpy_avx@crc_internal@absl@@YAPAXPIAXPIBXI@Z + ?offset@?$probe_seq@$0BA@@container_internal@absl@@QBEII@Z + ?offset@?$probe_seq@$0BA@@container_internal@absl@@QBEIXZ + ?ok@Status@absl@@QBE_NXZ + ?ok@Utf8ForCodePoint@debugging_internal@absl@@QBE_NXZ + ?overflow@Streambuf@OStringStream@strings_internal@absl@@MAEHH@Z + ?parse@detail@cctz@time_internal@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0ABVtime_zone@234@PAV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@PAV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@chrono@67@PAV567@@Z + ?parsed_conversion@UntypedFormatSpecImpl@str_format_internal@absl@@QBEPBVParsedFormatBase@23@XZ + ?pointer_to@?$pointer_traits@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@23@AAU423@@Z + ?pointer_to@?$pointer_traits@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@SAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@23@AAU423@@Z + ?pointer_to@?$pointer_traits@PAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@AAU423@@Z + ?pointer_to@?$pointer_traits@PAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@__Cr@std@@SAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@AAU423@@Z + ?pointer_to@?$pointer_traits@PAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@__Cr@std@@SAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@AAU423@@Z + ?pointer_to@?$pointer_traits@PBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@SAPBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@ABU423@@Z + ?poison@InlineData@cord_internal@absl@@QAEXXZ + ?poison_this@InlineData@cord_internal@absl@@QAEXXZ + ?pop_back@?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QAEXXZ + ?pop_back@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ?pop_back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?pop_front@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXXZ + ?pop_front@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ?precision@FormatConversionSpecImpl@str_format_internal@absl@@QBEHXZ + ?predicate@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBEABUAllowEmpty@3@XZ + ?predicate@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBEABUSkipEmpty@3@XZ + ?predicate@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBEABUAllowEmpty@3@XZ + ?prefetch_heap_block@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABEXXZ + ?prefix@LogEntry@absl@@QBE_NXZ + ?prev_transition@time_zone@cctz@time_internal@absl@@QBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@1234@@Z + ?prev_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z + ?probe@container_internal@absl@@YA?AV?$probe_seq@$0BA@@12@ABVCommonFields@12@I@Z + ?probe@container_internal@absl@@YA?AV?$probe_seq@$0BA@@12@II@Z + ?probe_h1@container_internal@absl@@YA?AV?$probe_seq@$0BA@@12@II@Z + ?push_back@?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QAEXABQAUCordRep@cord_internal@2@@Z + ?push_back@?$InlinedVector@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@absl@@QAEXABQAVLogSink@2@@Z + ?push_back@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QAEX$$QAUPayload@status_internal@2@@Z + ?push_back@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXABQBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?push_back@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?push_back@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXABQAVCommandLineFlag@absl@@@Z + ?push_back@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXABQAVCordzHandle@cord_internal@absl@@@Z + ?push_back@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEXABQAVLogSink@absl@@@Z + ?push_back@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAPBVCommandLineFlag@absl@@@Z + ?push_back@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXABQBVCommandLineFlag@absl@@@Z + ?push_back@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXABQBVCordzHandle@cord_internal@absl@@@Z + ?push_back@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z + ?push_back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXABUTransition@cctz@time_internal@absl@@@Z + ?push_back@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXABUUnrecognizedFlag@absl@@@Z + ?raw_code@Status@absl@@QBEHXZ + ?reduce_size@InlineRep@Cord@absl@@QAEXI@Z + ?release@?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?release@?$unique_ptr@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ + ?release@?$unique_ptr@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEPAUPrefixCrc@CrcCordState@crc_internal@absl@@XZ + ?release@?$unique_ptr@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@23@XZ + ?release@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@23@XZ + ?release@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QAEPAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@XZ + ?release@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@XZ + ?release@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@XZ + ?release@?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEPAVFallbackCrcMemcpyEngine@crc_internal@absl@@XZ + ?release@?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QAEPAVFlagState@flags_internal@absl@@XZ + ?release@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QAEPAVFlagStateInterface@flags_internal@absl@@XZ + ?release@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEPAVTimeZoneInfo@cctz@time_internal@absl@@XZ + ?release@?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEPAVTimeZoneLibC@cctz@time_internal@absl@@XZ + ?release@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QAEPAXXZ + ?remaining_inline_capacity@InlineRep@Cord@absl@@QBEIXZ + ?remove_prefix@?$Span@$$CBD@absl@@QAEXI@Z + ?remove_prefix@?$Span@D@absl@@QAEXI@Z + ?remove_prefix@InlineRep@Cord@absl@@QAEXI@Z + ?remove_suffix@?$Span@$$CBD@absl@@QAEXI@Z + ?remove_suffix@?$Span@D@absl@@QAEXI@Z + ?rep@CrcCordState@crc_internal@absl@@QBEABURep@123@XZ + ?rep@Rep@CordBuffer@absl@@QBEPAUCordRepFlat@cord_internal@3@XZ + ?reserve@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXI@Z + ?reserve@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXI@Z + ?reserve@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXI@Z + ?reserve@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXI@Z + ?reserve@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXI@Z + ?reset@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEX$$T@Z + ?reset@?$unique_ptr@$$CBVImpl@time_zone@cctz@time_internal@absl@@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__allocator_destructor@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEXPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ?reset@?$unique_ptr@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@23@@Z + ?reset@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@23@@Z + ?reset@?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAULogMessageData@LogMessage@log_internal@absl@@@Z + ?reset@?$unique_ptr@UThreadIdentity@base_internal@absl@@P6AXPAX@Z@__Cr@std@@QAEXPAUThreadIdentity@base_internal@absl@@@Z + ?reset@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@__Cr@std@@@__Cr@std@@QAEXPAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@@Z + ?reset@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@@Z + ?reset@?$unique_ptr@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@V?$__tree_node_destructor@V?$allocator@V?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@@Z + ?reset@?$unique_ptr@VFallbackCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VFallbackCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAVFallbackCrcMemcpyEngine@crc_internal@absl@@@Z + ?reset@?$unique_ptr@VFlagState@flags_internal@absl@@U?$default_delete@VFlagState@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAVFlagState@flags_internal@absl@@@Z + ?reset@?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAVFlagStateInterface@flags_internal@absl@@@Z + ?reset@?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAVTimeZoneIf@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAVTimeZoneInfo@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAVTimeZoneLibC@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPAVZoneInfoSource@cctz@time_internal@absl@@@Z + ?reset@?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@QAEXPAX@Z + ?reset_reserved_growth@CommonFields@container_internal@absl@@QAEXI@Z + ?reset_reserved_growth@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QAEXII@Z + ?resize@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXI@Z + ?resize@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXI@Z + ?safe_strto128_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVint128@2@H@Z + ?safe_strto16_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAFH@Z + ?safe_strto32_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAHH@Z + ?safe_strto64_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_JH@Z + ?safe_strto8_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PACH@Z + ?safe_strtou128_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVuint128@2@H@Z + ?safe_strtou16_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAGH@Z + ?safe_strtou32_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAIH@Z + ?safe_strtou64_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_KH@Z + ?safe_strtou8_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAEH@Z + ?sampling_stride@CordzInfo@cord_internal@absl@@QBE_JXZ + ?scale_add@impl@detail@cctz@time_internal@absl@@YA_J_J00@Z + ?second@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?second@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ + ?seed@CommonFields@container_internal@absl@@QBE?AVPerTableSeed@23@XZ + ?seed@HashtableSize@container_internal@absl@@QBE?AVPerTableSeed@23@XZ + ?seed@PerTableSeed@container_internal@absl@@QBEIXZ + ?self@Rep@InlineData@cord_internal@absl@@QAEPAU1234@XZ + ?self@Rep@InlineData@cord_internal@absl@@QBEPBU1234@XZ + ?set@?$MaybeInitializedPtr@W4ctrl_t@container_internal@absl@@@container_internal@absl@@QAEXPAW4ctrl_t@23@@Z + ?set@?$MaybeInitializedPtr@X@container_internal@absl@@QAEXPAX@Z + ?set_arg@BoundConversion@str_format_internal@absl@@QAEXPBVFormatArgImpl@23@@Z + ?set_begin@CordRepBtree@cord_internal@absl@@AAEXI@Z + ?set_capacity@CommonFields@container_internal@absl@@QAEXI@Z + ?set_control@CommonFields@container_internal@absl@@QAEXPAW4ctrl_t@23@@Z + ?set_conversion_char@FormatConversionSpecImpl@str_format_internal@absl@@QAEXW4FormatConversionChar@3@@Z + ?set_cordz_info@InlineData@cord_internal@absl@@QAEXPAVCordzInfo@23@@Z + ?set_cordz_info@Rep@InlineData@cord_internal@absl@@QAEX_J@Z + ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z + ?set_data@InlineRep@Cord@absl@@QAEPADI@Z + ?set_data@InlineRep@Cord@absl@@QAEXPBDI@Z + ?set_empty_soo@CommonFields@container_internal@absl@@QAEXXZ + ?set_end@CordRepBtree@cord_internal@absl@@AAEXI@Z + ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QAEXH@Z + ?set_full_soo@CommonFields@container_internal@absl@@QAEXXZ + ?set_generation@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QAEXE@Z + ?set_generation_ptr@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QAEXPAE@Z + ?set_has_infoz@CommonFields@container_internal@absl@@QAEXXZ + ?set_has_infoz@HashtableSize@container_internal@absl@@QAEXXZ + ?set_infoz@CommonFields@container_internal@absl@@QAEXVHashtablezInfoHandle@23@@Z + ?set_inline_data@InlineData@cord_internal@absl@@QAEXPBDI@Z + ?set_inline_size@InlineData@cord_internal@absl@@QAEXI@Z + ?set_inline_size@InlineRep@Cord@absl@@AAEXI@Z + ?set_inline_size@Rep@InlineData@cord_internal@absl@@QAEXI@Z + ?set_reservation_size@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QAEXI@Z + ?set_reserved_growth@CommonFieldsGenerationInfoDisabled@container_internal@absl@@QAEXI@Z + ?set_sampled_seed@HashtableSize@container_internal@absl@@QAEXXZ + ?set_seed@HashtableSize@container_internal@absl@@AAEXG@Z + ?set_short_length@Rep@CordBuffer@absl@@QAEXI@Z + ?set_size_to_zero@CommonFields@container_internal@absl@@QAEXXZ + ?set_size_to_zero_keep_metadata@HashtableSize@container_internal@absl@@QAEXXZ + ?set_slots@CommonFields@container_internal@absl@@QAEXPAX@Z + ?set_tag@Rep@InlineData@cord_internal@absl@@QAEXC@Z + ?set_tree@InlineData@cord_internal@absl@@QAEXPAUCordRep@23@@Z + ?set_tree@Rep@InlineData@cord_internal@absl@@QAEXPAUCordRep@34@@Z + ?set_value@InputValue@UnboundConversion@str_format_internal@absl@@QAEXH@Z + ?shallow_subcords_enabled@cord_internal@absl@@3U?$atomic@_N@__Cr@std@@A + ?should_rehash_for_bug_detection_on_insert@CommonFields@container_internal@absl@@QBE_NXZ + ?should_rehash_for_bug_detection_on_insert@CommonFieldsGenerationInfoEnabled@container_internal@absl@@QBE_NI@Z + ?should_rehash_for_bug_detection_on_move@CommonFieldsGenerationInfoEnabled@container_internal@absl@@QBE_NI@Z + ?shrink_to_fit@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?shrink_to_fit@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?single_iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAE?AViterator@123@XZ + ?single_slot@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@XZ + ?size@?$BigUnsigned@$03@strings_internal@absl@@QBEHXZ + ?size@?$BigUnsigned@$0FE@@strings_internal@absl@@QBEHXZ + ?size@?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QBEIXZ + ?size@?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__Cr@std@@@absl@@QBEIXZ + ?size@?$InlinedVector@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@absl@@QBEIXZ + ?size@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@absl@@QBEIXZ + ?size@?$InlinedVector@VFormatArgImpl@str_format_internal@absl@@$03V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@absl@@QBEIXZ + ?size@?$Span@$$CBD@absl@@QBEIXZ + ?size@?$Span@$$CBI@absl@@QBEIXZ + ?size@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QBEIXZ + ?size@?$Span@D@absl@@QBEIXZ + ?size@?$Span@I@absl@@QBEIXZ + ?size@?$Span@PAVLogSink@absl@@@absl@@QBEIXZ + ?size@?$Span@QAUCordRep@cord_internal@absl@@@absl@@QBEIXZ + ?size@?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEAAIXZ + ?size@?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?size@?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QAEAAIXZ + ?size@?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?size@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAEAAIXZ + ?size@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEAAIXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?size@?$__split_buffer_pointer_layout@V?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@23@@__Cr@std@@QBEIXZ + ?size@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QBEIXZ + ?size@?$array@Uraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@$0BA@@__Cr@std@@QBEIXZ + ?size@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?size@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?size@?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@QBEIXZ + ?size@?$initializer_list@W4FormatConversionCharSet@absl@@@std@@QBEIXZ + ?size@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QBEIXZ + ?size@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?size@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?size@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?size@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?size@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?size@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?size@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?size@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?size@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?size@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@QBEIXZ + ?size@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QBEIXZ + ?size@AlphaNum@absl@@QBEIXZ + ?size@CommonFields@container_internal@absl@@QBEIXZ + ?size@Cord@absl@@QBEIXZ + ?size@CordRepBtree@cord_internal@absl@@QBEIXZ + ?size@HashtableSize@container_internal@absl@@QBEIXZ + ?size@InlineRep@Cord@absl@@QBEIXZ + ?size@Storage@?$FixedArray@D$0PPPPPPPP@V?$allocator@D@__Cr@std@@@absl@@QBEIXZ + ?skip_empty_or_deleted@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXXZ + ?slot@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABEPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@34@XZ + ?slot_array@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABEPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@XZ + ?slot_array@CommonFields@container_internal@absl@@QBEPAXXZ + ?slot_array@HeapOrSoo@container_internal@absl@@QAEAAT?$MaybeInitializedPtr@X@23@XZ + ?slot_array@HeapOrSoo@container_internal@absl@@QBE?AT?$MaybeInitializedPtr@X@23@XZ + ?slot_offset@RawHashSetLayout@container_internal@absl@@QBEIXZ + ?slots_union@CommonFields@container_internal@absl@@QBE?AT?$MaybeInitializedPtr@X@23@XZ + ?soo_capacity@PolicyFunctions@container_internal@absl@@QBEEXZ + ?soo_data@CommonFields@container_internal@absl@@QAEPAXXZ + ?soo_data@CommonFields@container_internal@absl@@QBEPBXXZ + ?source_basename@LogEntry@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?source_filename@LogEntry@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?source_line@LogEntry@absl@@QBEHXZ + ?stacktrace@LogEntry@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?status@BadStatusOrAccess@absl@@QBEABVStatus@2@XZ + ?step@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uday_tag@1234@U51234@_J@Z + ?step@detail@cctz@time_internal@absl@@YA?AUfields@1234@Usecond_tag@1234@U51234@_J@Z + ?store@?$__atomic_base@PAVCordzHandle@cord_internal@absl@@$0A@@__Cr@std@@QAEXPAVCordzHandle@cord_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@PAVCordzInfo@cord_internal@absl@@$0A@@__Cr@std@@QAEXPAVCordzInfo@cord_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@PAVVLogSite@log_internal@absl@@$0A@@__Cr@std@@QAEXPAVVLogSite@log_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@VMaskedPointer@flags_internal@absl@@$0A@@__Cr@std@@QAEXVMaskedPointer@flags_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__Cr@std@@QAEXW4OnDeadlockCycle@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__Cr@std@@QAEXW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z + ?str@UntypedFormatSpecImpl@str_format_internal@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?stream@OstreamView@LogMessage@log_internal@absl@@QAEAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?string_value@ProtoField@log_internal@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?sub_fetch_begin@CordRepBtree@cord_internal@absl@@AAEII@Z + ?subspan@?$Span@$$CBD@absl@@QBE?AV12@II@Z + ?subspan@?$Span@D@absl@@QBE?AV12@II@Z + ?substring@CordRep@cord_internal@absl@@QAEPAUCordRepSubstring@23@XZ + ?substring@CordRep@cord_internal@absl@@QBEPBUCordRepSubstring@23@XZ + ?swap@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXAAV123@@Z + ?tag@ProtoField@log_internal@absl@@QBE_KXZ + ?tag@Rep@InlineData@cord_internal@absl@@QBECXZ + ?text@?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text@?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message@LogEntry@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_newline@LogEntry@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_prefix@LogEntry@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_prefix_and_newline@LogEntry@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?text_message_with_prefix_and_newline_c_str@LogEntry@absl@@QBEPBDXZ + ?thread_identity@PerThreadSynch@base_internal@absl@@QAEPAUThreadIdentity@23@XZ + ?tid@LogEntry@absl@@QBEIXZ + ?timestamp@LogEntry@absl@@QBE?AVTime@2@XZ + ?to_address@?$pointer_traits@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAPAPAVCommandLineFlag@absl@@V?$__wrap_iter@PAPAVCommandLineFlag@absl@@@23@@Z + ?to_address@?$pointer_traits@V?$__wrap_iter@PAPAVLogSink@absl@@@__Cr@std@@@__Cr@std@@SAPAPAVLogSink@absl@@V?$__wrap_iter@PAPAVLogSink@absl@@@23@@Z + ?to_address@?$pointer_traits@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@SAPAPBVCommandLineFlag@absl@@V?$__wrap_iter@PAPBVCommandLineFlag@absl@@@23@@Z + ?to_address@?$pointer_traits@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@@__Cr@std@@SAPAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@23@ABV678@@Z@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@23@@Z + ?total_written@BufferRawSink@str_format_internal@absl@@QBEIXZ + ?transfer@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAEXPAT?$map_slot_type@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@23@0@Z + ?transfer_unprobed_elements_to_next_capacity_fn@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CAXAAVCommonFields@23@PBW4ctrl_t@23@PAX2P6AX2EII@Z@Z + ?tree@InlineRep@Cord@absl@@QBEPAUCordRep@cord_internal@3@XZ + ?tree@Rep@InlineData@cord_internal@absl@@QBEPAUCordRep@34@XZ + ?try_lock@Mutex@absl@@QAE_NXZ + ?try_lock_shared@Mutex@absl@@QAE_NXZ + ?type@ProtoField@log_internal@absl@@QBE?AW4WireType@23@XZ + ?uint32_value@ProtoField@log_internal@absl@@QBEIXZ + ?uint64_value@ProtoField@log_internal@absl@@QBE_KXZ + ?unchecked_deref@iterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@ABEAAU?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@XZ + ?unlock@FlagRegistry@flags_internal@absl@@QAEXXZ + ?unlock@Mutex@absl@@QAEXXZ + ?unlock@SpinLock@base_internal@absl@@QAEXXZ + ?unlock_shared@Mutex@absl@@QAEXXZ + ?unpoison@InlineData@cord_internal@absl@@QAEXXZ + ?utc_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?value@ConvertibleToStringView@strings_internal@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?value@InputValue@UnboundConversion@str_format_internal@absl@@QBEHXZ + ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?value_comp@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@XZ + ?valueless_by_exception@?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__variant_detail@__Cr@std@@QBE_NXZ + ?valueless_by_exception@?$variant@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@__Cr@std@@QBE_NXZ + ?verbosity@LogEntry@absl@@QBEHXZ + ?version@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?what@BadStatusOrAccess@absl@@UBEPBDXZ + ?what@SeedGenException@absl@@UBEPBDXZ + ?width@FormatConversionSpecImpl@str_format_internal@absl@@QBEHXZ + ?words@?$BigUnsigned@$03@strings_internal@absl@@QBEPBIXZ + ?words@?$BigUnsigned@$0FE@@strings_internal@absl@@QBEPBIXZ + ?xsputn@Streambuf@OStringStream@strings_internal@absl@@MAEHPBDH@Z + ?year@?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBE_JXZ + ?year@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBE_JXZ + ?year@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QBE_JXZ + ?year@?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBE_JXZ + ?year_index@impl@detail@cctz@time_internal@absl@@YAH_JC@Z + ?ymd_ord@impl@detail@cctz@time_internal@absl@@YA_J_JCC@Z + AbslContainerInternalSampleEverything + AbslInternalMutexYield + AbslInternalOnFatalLogMessage + AbslInternalPerThreadSemInit + AbslInternalPerThreadSemPoke + AbslInternalPerThreadSemPost + AbslInternalPerThreadSemWait + AbslInternalReportFatalUsageError + AbslInternalSleepFor + AbslInternalSpinLockDelay + AbslInternalSpinLockWake + AbslInternalTraceContinue + AbslInternalTraceObserved + AbslInternalTraceSignal + AbslInternalTraceWait diff --git a/naiveproxy/src/third_party/abseil-cpp/symbols_x86_rel.def b/naiveproxy/src/third_party/abseil-cpp/symbols_x86_rel.def index 1a3619a9b3..1e9df319e6 100644 --- a/naiveproxy/src/third_party/abseil-cpp/symbols_x86_rel.def +++ b/naiveproxy/src/third_party/abseil-cpp/symbols_x86_rel.def @@ -36,7 +36,6 @@ EXPORTS ??$Append@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QAEX$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z ??$AppendImpl@ABVCord@absl@@@Cord@absl@@AAEXABV01@@Z ??$AppendImpl@VCord@absl@@@Cord@absl@@AAEX$$QAV01@@Z - ??$Base64EscapeInternal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@strings_internal@absl@@YAXPBEIPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_NPBD@Z ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@A6AXXZ@Z ??$CallOnceImpl@P8FlagImpl@flags_internal@absl@@AEXXZPAV123@@base_internal@absl@@YAXPAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@$$QAP8FlagImpl@flags_internal@1@AEXXZ$$QAPAV671@@Z ??$CastAndCallFunction@$$CBU?$atomic@_N@__Cr@std@@@Condition@absl@@CA_NPBV01@@Z @@ -105,13 +104,7 @@ EXPORTS ??$GrowSooTableToNextCapacityAndPrepareInsert@$03$00@container_internal@absl@@YAIAAVCommonFields@01@ABUPolicyFunctions@01@V?$FunctionRef@$$A6AII@Z@1@_N@Z ??$GrowSooTableToNextCapacityAndPrepareInsert@$07$00@container_internal@absl@@YAIAAVCommonFields@01@ABUPolicyFunctions@01@V?$FunctionRef@$$A6AII@Z@1@_N@Z ??$GrowSooTableToNextCapacityAndPrepareInsert@$0A@$0A@@container_internal@absl@@YAIAAVCommonFields@01@ABUPolicyFunctions@01@V?$FunctionRef@$$A6AII@Z@1@_N@Z - ??$IntegerToString@H@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z - ??$IntegerToString@I@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z - ??$IntegerToString@J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z - ??$IntegerToString@K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z - ??$IntegerToString@_J@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z - ??$IntegerToString@_K@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z - ??$InvokeObject@U?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@II@functional_internal@absl@@YAITVoidPtr@01@I@Z + ??$InvokeObject@AAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@II@functional_internal@absl@@YAITVoidPtr@01@I@Z ??$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z ??$MakeCheckOpString@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV123@@log_internal@absl@@YAPBDABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0PBD@Z ??$MakeCheckOpString@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@@log_internal@absl@@YAPBDABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PBD@Z @@ -143,6 +136,7 @@ EXPORTS ??$Prepend@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QAEX$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z ??$Register@AB_JAAIAAIAAIAAG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QAEPAUHashtablezInfo@container_internal@2@AB_JAAI11AAG@Z ??$SNPrintF@DHHH@absl@@YAHPADIABV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@str_format_internal@0@ABDABH33@Z + ??$StrCat@I@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z ??$StrCat@PBD@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000ABQBD@Z ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY02D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000ABV123@AAY02$$CBD@Z ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY03D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000ABV123@AAY03$$CBD@Z @@ -152,6 +146,7 @@ EXPORTS ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHABV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z ??$StrSplit@VByAnyChar@absl@@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@@Z ??$StrSplit@VByAnyChar@absl@@USkipEmpty@2@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@USkipEmpty@0@@Z + ??$StringResizeAndOverwriteFallback@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV123@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@UNoFormatter@56@@Z@@strings_internal@absl@@YAXAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IV@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@01@YA?AV234@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@1V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z@@Z ??$TransferNRelocatable@$0M@@container_internal@absl@@YAXPAX00I@Z ??$TryFindNewIndexWithoutProbing@X@container_internal@absl@@YAIIIIPAW4ctrl_t@01@I@Z ??$TypeErasedApplyToSlotFn@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@YAIPBXPAXI@Z @@ -165,41 +160,30 @@ EXPORTS ??$__dispatch@$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$02@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@2345@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z ??$__dispatch@$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$0A@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@2345@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z ??$__do_rehash@$00@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAEXI@Z - ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXI@Z + ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXI@Z ??$__emplace_back_slow_path@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AAEPAUViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@ABV612@AAI@Z ??$__emplace_back_slow_path@ABUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AAEPAUUnrecognizedFlag@absl@@ABU34@@Z ??$__emplace_back_slow_path@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AAEPAUUnrecognizedFlag@absl@@$$QAW4Source@34@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z - ??$__emplace_unique_key_args@PBUCordRep@cord_internal@absl@@ABQBU123@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@12@ABQBUCordRep@cord_internal@absl@@0@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z - ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z ??$__for_each_segment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__copy_impl@23@@__Cr@std@@YAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__copy_impl@01@@Z ??$__insert_with_size@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$__wrap_iter@PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@12@1H@Z + ??$__invoke@AAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@5@@__Cr@std@@YAXAAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@6@@Z ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PBUTransition@cctz@time_internal@absl@@@12@@Z ??$emplace@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@12@V?$__wrap_iter@PBUTransitionType@cctz@time_internal@absl@@@12@@Z - ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ - ??$emplace_back@AAPAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXAAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@ABQAV34@@Z - ??$emplace_back@ABQAVLogSink@absl@@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVLogSink@absl@@ABQAV34@@Z - ??$emplace_back@ABQBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@ABQBV34@@Z - ??$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCordzHandle@cord_internal@absl@@ABQBV345@@Z - ??$emplace_back@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@ABU3456@@Z + ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ??$emplace_back@AAPAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXAAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z ??$emplace_back@HVcrc32c_t@absl@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAH$$QAVcrc32c_t@6@@Z - ??$emplace_back@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_back@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_back@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@$$QAPBV34@@Z - ??$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU3456@@Z - ??$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@12@$$QAV312@@Z - ??$emplace_front@AAPAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXAAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_front@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$emplace_front@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z - ??$emplace_front@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z - ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$emplace_back@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@AAPAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXAAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE?AViterator@012@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ??$find_or_prepare_insert@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IAE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z ??$find_or_prepare_insert_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z @@ -249,7 +233,8 @@ EXPORTS ??0LogMessage@log_internal@absl@@QAE@PBDHUInfoTag@012@@Z ??0LogMessage@log_internal@absl@@QAE@PBDHUWarningTag@012@@Z ??0LogMessage@log_internal@absl@@QAE@PBDHW4LogSeverity@2@@Z - ??0LogMessageData@LogMessage@log_internal@absl@@QAE@PBDHW4LogSeverity@3@VTime@3@@Z + ??0LogMessage@log_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@2@@Z + ??0LogMessageData@LogMessage@log_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@3@VTime@3@@Z ??0LogMessageDebugFatal@log_internal@absl@@QAE@PBDH@Z ??0LogMessageFatal@log_internal@absl@@QAE@PBDH0@Z ??0LogMessageFatal@log_internal@absl@@QAE@PBDH@Z @@ -328,6 +313,7 @@ EXPORTS ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@@Z ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@0123@@Z ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@W4weekday@0123@@Z + ??6log_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@UUnprintableWrapper@01@@Z ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@01@@Z ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@01@@Z ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@01@@Z @@ -343,10 +329,25 @@ EXPORTS ??Kabsl@@YA?AVuint128@0@V10@0@Z ??Labsl@@YA?AVint128@0@V10@0@Z ??Labsl@@YA?AVuint128@0@V10@0@Z + ??R@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@23@ABQBUCordRep@cord_internal@absl@@@Z@QBE?A?@@00@Z + ??R@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@QBE?A?@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@QBE?A?@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@QBE?A?@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$emplace_back@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@ABQAV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCordzHandle@cord_internal@absl@@ABQAV456@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVLogSink@absl@@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVLogSink@absl@@ABQAV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@ABQBV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCordzHandle@cord_internal@absl@@ABQBV456@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@ABU4567@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@$$QAPBV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU4567@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QAV423@@Z@QBE?A?@@XZ ??R?$ConvertToContainer@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@ABV123@@Z ??R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV123@@Z ??RByCivilTime@Transition@cctz@time_internal@absl@@QBE_NABU1234@0@Z ??RDynValueDeleter@flags_internal@absl@@QBEXPAX@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@@Z ??XDuration@absl@@QAEAAV01@N@Z ??XDuration@absl@@QAEAAV01@_J@Z ??YDuration@absl@@QAEAAV01@V01@@Z @@ -514,7 +515,7 @@ EXPORTS ?CreateThreadIdentity@synchronization_internal@absl@@YAPAUThreadIdentity@base_internal@2@XZ ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPAUThreadIdentity@12@XZ ?CurrentValue@FlagImpl@flags_internal@absl@@EBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ - ?DataGuard@FlagImpl@flags_internal@absl@@ABEPAVMutex@3@XZ + ?DataGuard@FlagImpl@flags_internal@absl@@ABEAAVMutex@3@XZ ?DataLossError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?DeadlineExceededError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?DecodeFrom@ProtoField@log_internal@absl@@QAE_NPAV?$Span@$$CBD@3@@Z @@ -760,6 +761,7 @@ EXPORTS ?GetWord@?$BigUnsigned@$03@strings_internal@absl@@QBEIH@Z ?GetWord@?$BigUnsigned@$0FE@@strings_internal@absl@@QBEIH@Z ?GlobalHashtablezSampler@container_internal@absl@@YAAAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?GlobalList@CordzInfo@cord_internal@absl@@CAPAUList@123@XZ ?GlobalRegistry@FlagRegistry@flags_internal@absl@@SAAAV123@XZ ?GuaranteedEqual@Condition@absl@@SA_NPBV12@0@Z ?HandleInvalidStatusCtorArg@Helper@internal_statusor@absl@@SAXPAVStatus@3@@Z @@ -852,7 +854,6 @@ EXPORTS ?MakeAbsNanos@KernelTimeout@synchronization_internal@absl@@QBE_JXZ ?MakeAbsTimespec@KernelTimeout@synchronization_internal@absl@@QBE?AUtimespec@@XZ ?MakeCheckFailString@status_internal@absl@@YAPBDPBVStatus@2@PBD@Z - ?MakeCheckOpUnprintableString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@C@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z ?MakeCheckOpValueString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z @@ -901,6 +902,7 @@ EXPORTS ?NextTransition@TimeZone@absl@@QBE_NVTime@2@PAUCivilTransition@12@@Z ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@time_zone@234@@Z ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@time_zone@234@@Z + ?NextUp@CordRepBtreeNavigator@cord_internal@absl@@AAEPAUCordRep@23@XZ ?NoPrefix@LogMessage@log_internal@absl@@QAEAAV123@XZ ?NominalCPUFrequency@base_internal@absl@@YANXZ ?Normalize@CrcCordState@crc_internal@absl@@QAEXXZ @@ -949,8 +951,8 @@ EXPORTS ?Post@StdcppWaiter@synchronization_internal@absl@@QAEXXZ ?Post@Win32Waiter@synchronization_internal@absl@@QAEXXZ ?PrepareForSampling@HashtablezInfo@container_internal@absl@@QAEX_JIIIG@Z - ?PrepareInsertLarge@container_internal@absl@@YAIAAVCommonFields@12@ABUPolicyFunctions@12@IUFindInfo@12@@Z - ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YAIAAVCommonFields@12@ABUPolicyFunctions@12@IUFindInfo@12@V?$FunctionRef@$$A6AII@Z@2@@Z + ?PrepareInsertLarge@container_internal@absl@@YAIAAVCommonFields@12@ABUPolicyFunctions@12@IV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@@Z + ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YAIAAVCommonFields@12@ABUPolicyFunctions@12@IV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@V?$FunctionRef@$$A6AII@Z@2@@Z ?PrepareInsertSmallNonSoo@container_internal@absl@@YA?AU?$pair@PAW4ctrl_t@container_internal@absl@@PAX@__Cr@std@@AAVCommonFields@12@ABUPolicyFunctions@12@V?$FunctionRef@$$A6AII@Z@2@@Z ?PrepareToDie@LogMessage@log_internal@absl@@AAEXXZ ?PrepareToModify@Status@absl@@CAPAVStatusRep@status_internal@2@I@Z @@ -967,6 +969,7 @@ EXPORTS ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@time_zone@234@@Z ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@time_zone@234@@Z ?Print@Streamable@str_format_internal@absl@@QBEAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@@Z + ?PrintTo@absl@@YAXABVLogEntry@1@PAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ ?ProgramUsageMessage@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ ?Ptr@GraphCycles@synchronization_internal@absl@@QAEPAXUGraphId@23@@Z @@ -1031,7 +1034,7 @@ EXPORTS ?ResetToBuiltinUTC@TimeZoneInfo@cctz@time_internal@absl@@AAE_NABV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z ?ResizeAllocatedTableWithSeedChange@container_internal@absl@@YAXAAVCommonFields@12@ABUPolicyFunctions@12@I@Z ?ResourceExhaustedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z - ?Restore@FlagState@flags_internal@absl@@EBEXXZ + ?Restore@FlagState@flags_internal@absl@@EHAEXXZ ?RestoreState@FlagImpl@flags_internal@absl@@AAE_NABVFlagState@23@@Z ?Retire@flags_internal@absl@@YAXPBDPBXPAE@Z ?ReverseConsume@cord_internal@absl@@YAXPAUCordRep@12@V?$FunctionRef@$$A6AXPAUCordRep@cord_internal@absl@@II@Z@2@@Z @@ -1310,8 +1313,6 @@ EXPORTS ?cycle_clock_source_@CycleClock@base_internal@absl@@0U?$atomic@P6A_JXZ@__Cr@std@@A ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z ?description@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ - ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@AAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@@Z - ?destroy@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@AAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@@Z ?effective_impl@time_zone@cctz@time_internal@absl@@ABEABVImpl@1234@XZ ?engines@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PIAXPIBXIV54@_N@Z@4UArchSpecificEngines@234@B ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@ABV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z @@ -1333,6 +1334,7 @@ EXPORTS ?n_sec@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J00000@Z ?name@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ ?next_transition@time_zone@cctz@time_internal@absl@@QBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@1234@@Z + ?next_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z ?overflow@Streambuf@OStringStream@strings_internal@absl@@MAEHH@Z ?parse@detail@cctz@time_internal@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0ABVtime_zone@234@PAV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@PAV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@chrono@67@PAV567@@Z ?prev_transition@time_zone@cctz@time_internal@absl@@QBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@1234@@Z diff --git a/naiveproxy/src/third_party/abseil-cpp/symbols_x86_rel_cxx23.def b/naiveproxy/src/third_party/abseil-cpp/symbols_x86_rel_cxx23.def new file mode 100644 index 0000000000..29a3b1ab9e --- /dev/null +++ b/naiveproxy/src/third_party/abseil-cpp/symbols_x86_rel_cxx23.def @@ -0,0 +1,1392 @@ +EXPORTS + ?$TSS0@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PIAXPIBXIV54@_N@Z@4HA + ??$?0$$V$0A@@?$NoDestructor@V?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@@absl@@QAE@XZ + ??$?0V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QAE@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$?6C@LogMessage@log_internal@absl@@QAEAAV012@ABC@Z + ??$?6D@LogMessage@log_internal@absl@@QAEAAV012@ABD@Z + ??$?6E@LogMessage@log_internal@absl@@QAEAAV012@ABE@Z + ??$?6F@LogMessage@log_internal@absl@@QAEAAV012@ABF@Z + ??$?6G@LogMessage@log_internal@absl@@QAEAAV012@ABG@Z + ??$?6H@LogMessage@log_internal@absl@@QAEAAV012@ABH@Z + ??$?6I@LogMessage@log_internal@absl@@QAEAAV012@ABI@Z + ??$?6J@LogMessage@log_internal@absl@@QAEAAV012@ABJ@Z + ??$?6K@LogMessage@log_internal@absl@@QAEAAV012@ABK@Z + ??$?6M@LogMessage@log_internal@absl@@QAEAAV012@ABM@Z + ??$?6N@LogMessage@log_internal@absl@@QAEAAV012@ABN@Z + ??$?6PAX@LogMessage@log_internal@absl@@QAEAAV012@ABQAX@Z + ??$?6PBD@LogMessage@log_internal@absl@@QAEAAV012@ABQBD@Z + ??$?6PBX@LogMessage@log_internal@absl@@QAEAAV012@ABQBX@Z + ??$?6PB_W@LogMessage@log_internal@absl@@QAEAAV012@ABQB_W@Z + ??$?6_J@LogMessage@log_internal@absl@@QAEAAV012@AB_J@Z + ??$?6_K@LogMessage@log_internal@absl@@QAEAAV012@AB_K@Z + ??$?6_N@LogMessage@log_internal@absl@@QAEAAV012@AB_N@Z + ??$?MUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?OUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z + ??$?RW4LogSeverity@absl@@ABQBDHAAY0CC@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAY0CC@$$CBD@Z + ??$?RW4LogSeverity@absl@@ABQBDHAAY0CG@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAY0CG@$$CBD@Z + ??$?RW4LogSeverity@absl@@ABQBDHAAY0CH@$$CBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAY0CH@$$CBD@Z + ??$AbslStringify@VStringifySink@strings_internal@absl@@@absl@@YAXAAVStringifySink@strings_internal@0@UHex@0@@Z + ??$AddCordRep@$00@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@PAUCordRep@12@@Z + ??$AddCordRep@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@PAUCordRep@12@@Z + ??$AddData@$00@CordRepBtree@cord_internal@absl@@AAE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@I@Z + ??$AddData@$00@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@AAE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@I@Z + ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$AllocateBackingArray@$03V?$allocator@D@__Cr@std@@@container_internal@absl@@YAPAXPAXI@Z + ??$Append@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QAEX$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$AppendImpl@ABVCord@absl@@@Cord@absl@@AAEXABV01@@Z + ??$AppendImpl@VCord@absl@@@Cord@absl@@AAEX$$QAV01@@Z + ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@A6AXXZ@Z + ??$CallOnceImpl@P8FlagImpl@flags_internal@absl@@AEXXZPAV123@@base_internal@absl@@YAXPAU?$atomic@I@__Cr@std@@W4SchedulingMode@01@$$QAP8FlagImpl@flags_internal@1@AEXXZ$$QAPAV671@@Z + ??$CastAndCallFunction@$$CBU?$atomic@_N@__Cr@std@@@Condition@absl@@CA_NPBV01@@Z + ??$ConsumeConversion@$00@str_format_internal@absl@@YAPBDPBDQBDPAUUnboundConversion@01@PAH@Z + ??$ConsumeConversion@$0A@@str_format_internal@absl@@YAPBDPBDQBDPAUUnboundConversion@01@PAH@Z + ??$ConvertIntArg@C@str_format_internal@absl@@YA_NCVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@D@str_format_internal@absl@@YA_NDVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@E@str_format_internal@absl@@YA_NEVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@F@str_format_internal@absl@@YA_NFVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@G@str_format_internal@absl@@YA_NGVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@H@str_format_internal@absl@@YA_NHVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@I@str_format_internal@absl@@YA_NIVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@J@str_format_internal@absl@@YA_NJVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@K@str_format_internal@absl@@YA_NKVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@Vint128@absl@@@str_format_internal@absl@@YA_NVint128@1@VFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@Vuint128@absl@@@str_format_internal@absl@@YA_NVuint128@1@VFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_J@str_format_internal@absl@@YA_N_JVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_K@str_format_internal@absl@@YA_N_KVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$ConvertIntArg@_W@str_format_internal@absl@@YA_N_WVFormatConversionSpecImpl@01@PAVFormatSinkImpl@01@@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AAEXDI@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$00@LogMessage@log_internal@absl@@AAEXV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AAEXDI@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AAEXV?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBufferWithStructuredProtoField@$00@LogMessage@log_internal@absl@@AAEXUStructuredProtoField@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$CopyToEncodedBufferWithStructuredProtoField@$0A@@LogMessage@log_internal@absl@@AAEXUStructuredProtoField@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$DeallocateBackingArray@$03V?$allocator@D@__Cr@std@@@container_internal@absl@@YAXPAXIPAW4ctrl_t@01@II_N@Z + ??$Dispatch@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@F@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@G@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@H@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@I@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@M@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@O@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@PBD@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@PB_W@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@UVoidPtr@str_format_internal@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@V?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@Vint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@Vuint128@absl@@@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@_J@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@_K@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$Dispatch@_N@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z + ??$EmplaceBackSlow@ABQAVLogSink@absl@@@?$Storage@PAVLogSink@absl@@$0BA@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AAEAAPAVLogSink@2@ABQAV32@@Z + ??$EmplaceBackSlow@UPayload@status_internal@absl@@@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AAEAAUPayload@status_internal@2@$$QAU342@@Z + ??$FindSubstitutions@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@strings_internal@absl@@YA?AV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@ABV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@4@@Z + ??$FlagOps@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPAXW4FlagOp@01@PBXPAX2@Z + ??$Flush@V?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@VBufferRawSink@str_format_internal@absl@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$Flush@VFILERawSink@str_format_internal@absl@@@FormatRawSinkImpl@str_format_internal@absl@@CAXPAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$GenRuntimeTypeId@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@YAPBVtype_info@@XZ + ??$GenericCompare@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@absl@@YAHABVCord@0@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$GenericCompare@HVCord@absl@@@absl@@YAHABVCord@0@0I@Z + ??$GenericCompare@_NVCord@absl@@@absl@@YA_NABVCord@0@0I@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$00$00@container_internal@absl@@YAIAAVCommonFields@01@ABUPolicyFunctions@01@V?$FunctionRef@$$A6AII@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$03$00@container_internal@absl@@YAIAAVCommonFields@01@ABUPolicyFunctions@01@V?$FunctionRef@$$A6AII@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$07$00@container_internal@absl@@YAIAAVCommonFields@01@ABUPolicyFunctions@01@V?$FunctionRef@$$A6AII@Z@1@_N@Z + ??$GrowSooTableToNextCapacityAndPrepareInsert@$0A@$0A@@container_internal@absl@@YAIAAVCommonFields@01@ABUPolicyFunctions@01@V?$FunctionRef@$$A6AII@Z@1@_N@Z + ??$InvokeObject@AAU?$HashKey@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@II@functional_internal@absl@@YAITVoidPtr@01@I@Z + ??$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@34@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@UNoFormatter@01@@Z + ??$MakeCheckOpString@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV123@@log_internal@absl@@YAPBDABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0PBD@Z + ??$MakeCheckOpString@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@@log_internal@absl@@YAPBDABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PBD@Z + ??$MakeCheckOpString@DD@log_internal@absl@@YAPBDDDPBD@Z + ??$MakeCheckOpString@EE@log_internal@absl@@YAPBDEEPBD@Z + ??$MakeCheckOpString@MM@log_internal@absl@@YAPBDMMPBD@Z + ??$MakeCheckOpString@NN@log_internal@absl@@YAPBDNNPBD@Z + ??$MakeCheckOpString@PBCPBC@log_internal@absl@@YAPBDPBC0PBD@Z + ??$MakeCheckOpString@PBDPBD@log_internal@absl@@YAPBDPBD00@Z + ??$MakeCheckOpString@PBEPBE@log_internal@absl@@YAPBDPBE0PBD@Z + ??$MakeCheckOpString@PBXPBX@log_internal@absl@@YAPBDPBX0PBD@Z + ??$MakeCheckOpString@_J_J@log_internal@absl@@YAPBD_J0PBD@Z + ??$MakeCheckOpString@_K_K@log_internal@absl@@YAPBD_K0PBD@Z + ??$MakeCheckOpString@_N_N@log_internal@absl@@YAPBD_N0PBD@Z + ??$Merge@$00@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@0@Z + ??$Merge@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@0@Z + ??$NewLeaf@$00@CordRepBtree@cord_internal@absl@@CAPAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$NewLeaf@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ??$ParseFlagImpl@H@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAH@Z + ??$ParseFlagImpl@I@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAI@Z + ??$ParseFlagImpl@J@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAJ@Z + ??$ParseFlagImpl@K@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAK@Z + ??$ParseFlagImpl@_J@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AA_J@Z + ??$ParseFlagImpl@_K@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AA_K@Z + ??$ParseFloat@$09@strings_internal@absl@@YA?AUParsedFloat@01@PBD0W4chars_format@1@@Z + ??$ParseFloat@$0BA@@strings_internal@absl@@YA?AUParsedFloat@01@PBD0W4chars_format@1@@Z + ??$ParseFormatString@UParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@@str_format_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@UParsedFormatConsumer@ParsedFormatBase@01@@Z + ??$PopDead@_JIIIG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AAEPAUHashtablezInfo@container_internal@2@_JIIIG@Z + ??$Prepend@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$0A@@Cord@absl@@QAEX$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??$Register@AB_JAAIAAIAAIAAG@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QAEPAUHashtablezInfo@container_internal@2@AB_JAAI11AAG@Z + ??$SNPrintF@DHHH@absl@@YAHPADIABV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@@str_format_internal@0@ABDABH33@Z + ??$StrCat@I@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ??$StrCat@PBD@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000ABQBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY02D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000ABV123@AAY02$$CBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY03D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000ABV123@AAY03$$CBD@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0BO@DV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000ABV123@AAY0BO@$$CBD1@Z + ??$StrCat@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@$$BY0LD@D@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@0@0000ABV123@AAY0LD@$$CBD@Z + ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@ABV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@3@@Z + ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHABV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z + ??$StrSplit@VByAnyChar@absl@@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@@Z + ??$StrSplit@VByAnyChar@absl@@USkipEmpty@2@@absl@@YA?AV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@0@VConvertibleToStringView@20@VByAnyChar@0@USkipEmpty@0@@Z + ??$TransferNRelocatable@$0M@@container_internal@absl@@YAXPAX00I@Z + ??$TryFindNewIndexWithoutProbing@X@container_internal@absl@@YAIIIIPAW4ctrl_t@01@I@Z + ??$TypeErasedApplyToSlotFn@UStringHash@container_internal@absl@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@$00@container_internal@absl@@YAIPBXPAXI@Z + ??$UnparseFloatingPointVal@M@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@M@Z + ??$UnparseFloatingPointVal@N@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z + ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@I@Z + ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@H@Z + ??$__call_func@V@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@@?$__policy_func@$$A6AXAAVCommandLineFlag@absl@@@Z@__function@__Cr@std@@CAXPBT__policy_storage@123@AAVCommandLineFlag@absl@@@Z + ??$__dispatch@$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$00@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@2345@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$01@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@2345@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$02@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@2345@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__dispatch@$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@__visitation@__variant_detail@__Cr@std@@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@456@@?$__dispatcher@$0A@@__base@__visitation@__variant_detail@__Cr@std@@SA?A_T$$QAU?$__value_visitor@UBufferSizeVisitor@?1??BufferSizeForStructuredProtoField@log_internal@absl@@YAIUStructuredProtoField@34@@Z@@__variant@2345@AAV?$__base@$0A@V?$variant@_K_JIH_N@__Cr@std@@V?$variant@_K_JN@23@V?$Span@$$CBD@absl@@V?$variant@IHM@23@@345@@Z + ??$__do_rehash@$00@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@AAEXI@Z + ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXI@Z + ??$__emplace_back_slow_path@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV123@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AAEPAUViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@ABV612@AAI@Z + ??$__emplace_back_slow_path@ABUUnrecognizedFlag@absl@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AAEPAUUnrecognizedFlag@absl@@ABU34@@Z + ??$__emplace_back_slow_path@W4Source@UnrecognizedFlag@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@AAEPAUUnrecognizedFlag@absl@@$$QAW4Source@34@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@@Z + ??$__for_each_segment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__copy_impl@23@@__Cr@std@@YAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0U?$_CopySegment@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__copy_impl@01@@Z + ??$__insert_with_size@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@__Cr@std@@V123@@?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$__wrap_iter@PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@V?$__wrap_iter@PAUraw_view@?1???R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV345@@Z@@12@1H@Z + ??$__invoke@AAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@5@@__Cr@std@@YAXAAV@?0??SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ@AAVCommandLineFlag@6@@Z + ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PBUTransition@cctz@time_internal@absl@@@12@@Z + ??$emplace@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAE?AV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@12@V?$__wrap_iter@PBUTransitionType@cctz@time_internal@absl@@@12@@Z + ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXXZ + ??$emplace_back@AAPAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXAAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@HVcrc32c_t@absl@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUPrefixCrc@CrcCordState@crc_internal@absl@@$$QAH$$QAVcrc32c_t@6@@Z + ??$emplace_back@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_back@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_back@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@AAPAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEXAAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@AAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEXAAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$emplace_front@PAPBVImpl@time_zone@cctz@time_internal@absl@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@78@@__Cr@std@@QAEX$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z + ??$emplace_front@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@V__split_buffer_pointer_layout@67@@__Cr@std@@QAEX$$QAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@Z + ??$find@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@@Z + ??$find@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAE?AViterator@012@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??$find_or_prepare_insert@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@IAE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$find_or_prepare_insert_large@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@AAE?AU?$pair@Viterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@_N@__Cr@std@@ABV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ??$resize_and_overwrite@V@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@56@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@UNoFormatter@23@@Z@@?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@QAEXIV@?0???$JoinAlgorithm@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@X@strings_internal@absl@@YA?AV012@V?$__wrap_iter@PBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@0V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@UNoFormatter@45@@Z@@Z + ??0?$BigUnsigned@$03@strings_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$BigUnsigned@$03@strings_internal@absl@@QAE@XZ + ??0?$BigUnsigned@$03@strings_internal@absl@@QAE@_K@Z + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QAE@XZ + ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QAE@_K@Z + ??0?$SplitIterator@V?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QAE@W4State@012@PBV?$Splitter@VByAnyChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0?$SplitIterator@V?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@@strings_internal@absl@@QAE@W4State@012@PBV?$Splitter@VByAnyChar@absl@@USkipEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@12@@Z + ??0AlphaNum@absl@@QAE@H@Z + ??0AlphaNum@absl@@QAE@I@Z + ??0AlphaNum@absl@@QAE@PBD@Z + ??0Arena@LowLevelAlloc@base_internal@absl@@QAE@I@Z + ??0Arg@substitute_internal@absl@@QAE@PBX@Z + ??0Arg@substitute_internal@absl@@QAE@UDec@2@@Z + ??0Arg@substitute_internal@absl@@QAE@UHex@2@@Z + ??0BadStatusOrAccess@absl@@QAE@$$QAV01@@Z + ??0BadStatusOrAccess@absl@@QAE@ABV01@@Z + ??0BadStatusOrAccess@absl@@QAE@VStatus@1@@Z + ??0BlockingCounter@absl@@QAE@H@Z + ??0ByAnyChar@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0ByLength@absl@@QAE@H@Z + ??0ByString@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0CRC@crc_internal@absl@@IAE@XZ + ??0CheckOpMessageBuilder@log_internal@absl@@QAE@PBD@Z + ??0Condition@absl@@QAE@P6A_NPAX@Z0@Z + ??0Condition@absl@@QAE@PB_N@Z + ??0Cord@absl@@AAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@1@@Z + ??0Cord@absl@@QAE@ABV01@@Z + ??0CordzHandle@cord_internal@absl@@IAE@_N@Z + ??0CordzInfo@cord_internal@absl@@AAE@PAUCordRep@12@PBV012@W4MethodIdentifier@CordzUpdateTracker@12@_J@Z + ??0CrcCordState@crc_internal@absl@@QAE@$$QAV012@@Z + ??0CrcCordState@crc_internal@absl@@QAE@ABV012@@Z + ??0CrcCordState@crc_internal@absl@@QAE@XZ + ??0DynValueDeleter@flags_internal@absl@@QAE@P6APAXW4FlagOp@12@PBXPAX2@Z@Z + ??0FlagSaver@absl@@QAE@XZ + ??0GraphCycles@synchronization_internal@absl@@QAE@XZ + ??0HashtablezInfo@container_internal@absl@@QAE@XZ + ??0Impl@time_zone@cctz@time_internal@absl@@AAE@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??0Impl@time_zone@cctz@time_internal@absl@@AAE@XZ + ??0KernelTimeout@synchronization_internal@absl@@QAE@VDuration@2@@Z + ??0KernelTimeout@synchronization_internal@absl@@QAE@VTime@2@@Z + ??0LeakCheckDisabler@absl@@QAE@XZ + ??0LogMessage@log_internal@absl@@QAE@PBDHUErrorTag@012@@Z + ??0LogMessage@log_internal@absl@@QAE@PBDHUInfoTag@012@@Z + ??0LogMessage@log_internal@absl@@QAE@PBDHUWarningTag@012@@Z + ??0LogMessage@log_internal@absl@@QAE@PBDHW4LogSeverity@2@@Z + ??0LogMessage@log_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@2@@Z + ??0LogMessageData@LogMessage@log_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4LogSeverity@3@VTime@3@@Z + ??0LogMessageDebugFatal@log_internal@absl@@QAE@PBDH@Z + ??0LogMessageFatal@log_internal@absl@@QAE@PBDH0@Z + ??0LogMessageFatal@log_internal@absl@@QAE@PBDH@Z + ??0LogMessageQuietlyDebugFatal@log_internal@absl@@QAE@PBDH@Z + ??0LogMessageQuietlyFatal@log_internal@absl@@QAE@PBDH0@Z + ??0LogMessageQuietlyFatal@log_internal@absl@@QAE@PBDH@Z + ??0MaskedPointer@flags_internal@absl@@QAE@PAX_N@Z + ??0OstreamView@LogMessage@log_internal@absl@@QAE@AAULogMessageData@123@@Z + ??0ParsedFormatBase@str_format_internal@absl@@QAE@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_NV?$initializer_list@W4FormatConversionCharSet@absl@@@5@@Z + ??0Randen@random_internal@absl@@QAE@XZ + ??0ScopedMinLogLevel@log_internal@absl@@QAE@W4LogSeverityAtLeast@2@@Z + ??0ScopedStderrThreshold@absl@@QAE@W4LogSeverityAtLeast@1@@Z + ??0Status@absl@@QAE@W4StatusCode@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0StdcppWaiter@synchronization_internal@absl@@QAE@XZ + ??0StringifySink@detect_specialization@log_internal@absl@@QAE@AAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??0TimeZoneLibC@cctz@time_internal@absl@@AAE@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??0Utf8ForCodePoint@debugging_internal@absl@@QAE@_K@Z + ??0Win32Waiter@synchronization_internal@absl@@QAE@XZ + ??0int128@absl@@QAE@M@Z + ??0int128@absl@@QAE@N@Z + ??0int128@absl@@QAE@O@Z + ??0uint128@absl@@QAE@M@Z + ??0uint128@absl@@QAE@N@Z + ??0uint128@absl@@QAE@O@Z + ??1?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1?$unique_ptr@ULogMessageData@LogMessage@log_internal@absl@@U?$default_delete@ULogMessageData@LogMessage@log_internal@absl@@@__Cr@std@@@__Cr@std@@QAE@XZ + ??1CRC@crc_internal@absl@@UAE@XZ + ??1Cord@absl@@QAE@XZ + ??1CordzHandle@cord_internal@absl@@MAE@XZ + ??1CordzInfo@cord_internal@absl@@EAE@XZ + ??1CrcCordState@crc_internal@absl@@QAE@XZ + ??1FlagSaver@absl@@QAE@XZ + ??1FlagStateInterface@flags_internal@absl@@UAE@XZ + ??1GraphCycles@synchronization_internal@absl@@QAE@XZ + ??1HashtablezInfo@container_internal@absl@@QAE@XZ + ??1LeakCheckDisabler@absl@@QAE@XZ + ??1LogMessage@log_internal@absl@@QAE@XZ + ??1LogMessageDebugFatal@log_internal@absl@@QAE@XZ + ??1LogMessageFatal@log_internal@absl@@QAE@XZ + ??1LogMessageQuietlyDebugFatal@log_internal@absl@@QAE@XZ + ??1LogMessageQuietlyFatal@log_internal@absl@@QAE@XZ + ??1Mutex@absl@@QAE@XZ + ??1Notification@absl@@QAE@XZ + ??1OstreamView@LogMessage@log_internal@absl@@UAE@XZ + ??1ScopedMinLogLevel@log_internal@absl@@QAE@XZ + ??1ScopedStderrThreshold@absl@@QAE@XZ + ??1SeedGenException@absl@@UAE@XZ + ??1TimeZoneIf@cctz@time_internal@absl@@UAE@XZ + ??1TimeZoneInfo@cctz@time_internal@absl@@UAE@XZ + ??1ZoneInfoSource@cctz@time_internal@absl@@UAE@XZ + ??4BadStatusOrAccess@absl@@QAEAAV01@$$QAV01@@Z + ??4BadStatusOrAccess@absl@@QAEAAV01@ABV01@@Z + ??4Cord@absl@@QAEAAV01@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??4CrcCordState@crc_internal@absl@@QAEAAV012@$$QAV012@@Z + ??4CrcCordState@crc_internal@absl@@QAEAAV012@ABV012@@Z + ??4FlagsUsageConfig@absl@@QAEAAU01@ABU01@@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@ABV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@P6AAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV345@@Z@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@P6AAAVios_base@__Cr@std@@AAV345@@Z@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@@Z + ??6LogMessage@log_internal@absl@@QAEAAV012@_W@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@ABVCord@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@ABVStatus@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@Vint128@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@Vuint128@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@W4LogSeverity@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@W4LogSeverityAtLeast@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@W4LogSeverityAtMost@0@@Z + ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV123@W4StatusCode@0@@Z + ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Uminute_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Umonth_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@ABV?$civil_time@Uyear_tag@detail@cctz@time_internal@absl@@@0123@@Z + ??6detail@cctz@time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@W4weekday@0123@@Z + ??6log_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@UUnprintableWrapper@01@@Z + ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@01@@Z + ??6time_internal@absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV234@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@01@@Z + ??8StatusRep@status_internal@absl@@QBE_NABV012@@Z + ??ACord@absl@@QBEDI@Z + ??BCord@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ??Bint128@absl@@QBENXZ + ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z + ??Kabsl@@YA?AVint128@0@V10@0@Z + ??Kabsl@@YA?AVuint128@0@V10@0@Z + ??Labsl@@YA?AVint128@0@V10@0@Z + ??Labsl@@YA?AVuint128@0@V10@0@Z + ??R@?0???$__emplace_unique@ABQBUCordRep@cord_internal@absl@@@?$__hash_table@PBUCordRep@cord_internal@absl@@U?$hash@PBUCordRep@cord_internal@absl@@@__Cr@std@@U?$equal_to@PBUCordRep@cord_internal@absl@@@56@V?$allocator@PBUCordRep@cord_internal@absl@@@56@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@PBUCordRep@cord_internal@absl@@PAX@__Cr@std@@@__Cr@std@@_N@23@ABQBUCordRep@cord_internal@absl@@@Z@QBE?A?@@00@Z + ??R@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@QBE?A?@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@QBE?A?@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$__emplace_unique@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__tree_iterator@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@H@__Cr@std@@_N@23@ABUpiecewise_construct_t@23@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$$QAV?$tuple@$$V@23@@Z@QBE?A?@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@012@Z + ??R@?0???$emplace_back@ABQAVCommandLineFlag@absl@@@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCommandLineFlag@absl@@ABQAV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVCordzHandle@cord_internal@absl@@ABQAV456@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQAVLogSink@absl@@@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@QAEAAPAVLogSink@absl@@ABQAV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@ABQBV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCordzHandle@cord_internal@absl@@ABQBV456@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUTransition@cctz@time_internal@absl@@ABU4567@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@PBVCommandLineFlag@absl@@@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@QAEAAPBVCommandLineFlag@absl@@$$QAPBV45@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEAAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU4567@@Z@QBE?A?@@XZ + ??R@?0???$emplace_back@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEAAV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@23@$$QAV423@@Z@QBE?A?@@XZ + ??R?$ConvertToContainer@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@ABV123@@Z + ??R?$ConvertToContainer@V?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@$0A@@?$Splitter@VByChar@absl@@UAllowEmpty@2@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@strings_internal@absl@@QBE?AV?$vector@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$allocator@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@ABV123@@Z + ??RByCivilTime@Transition@cctz@time_internal@absl@@QBE_NABU1234@0@Z + ??RDynValueDeleter@flags_internal@absl@@QBEXPAX@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$map@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@23@@__Cr@std@@PAX@23@@Z + ??R__tree_deleter@?$__tree@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@V?$__map_value_compare@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@23@U?$less@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@@23@@__Cr@std@@QAEXPAV?$__tree_node@U?$__value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@23@@__Cr@std@@PAX@23@@Z + ??XDuration@absl@@QAEAAV01@N@Z + ??XDuration@absl@@QAEAAV01@_J@Z + ??YDuration@absl@@QAEAAV01@V01@@Z + ??ZDuration@absl@@QAEAAV01@V01@@Z + ??_0Duration@absl@@QAEAAV01@N@Z + ??_0Duration@absl@@QAEAAV01@_J@Z + ??_1Duration@absl@@QAEAAV01@V01@@Z + ?AbortedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslFormatFlush@detect_specialization@log_internal@absl@@YAXPAVStringifySink@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVDuration@1@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVTime@1@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAW4LogSeverity@1@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAFPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAGPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAHPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAIPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAJPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAKPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAMPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PANPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@1@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@45@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVint128@2@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVuint128@2@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_JPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_KPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_NPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@12@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@12@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@12@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@12@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@12@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslParseFlag@time_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@12@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LogSeverity@1@@Z + ?AbslUnparseFlag@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@45@@Z + ?AbslUnparseFlag@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@12@@Z + ?AbslUnparseFlag@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@12@@Z + ?Absorb@RandenHwAes@random_internal@absl@@SAXPBXPAX@Z + ?Absorb@RandenSlow@random_internal@absl@@SAXPBXPAX@Z + ?AddHint@BestHints@flags_internal@absl@@QAE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z + ?AddLogSink@log_internal@absl@@YAXPAVLogSink@2@@Z + ?AddWithCarry@?$BigUnsigned@$03@strings_internal@absl@@AAEXHI@Z + ?AddWithCarry@?$BigUnsigned@$03@strings_internal@absl@@AAEXH_K@Z + ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEXHI@Z + ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEXH_K@Z + ?AddressIsReadable@debugging_internal@absl@@YA_NPBX@Z + ?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AAE?AV23@I@Z + ?AdvanceBytesBtree@ChunkIterator@Cord@absl@@AAEXI@Z + ?Alloc@LowLevelAlloc@base_internal@absl@@SAPAXI@Z + ?AllocWithArena@LowLevelAlloc@base_internal@absl@@SAPAXIPAUArena@123@@Z + ?AlreadyExistsError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AlwaysTrue@Condition@absl@@CA_NPBV12@@Z + ?Append@Cord@absl@@QAEX$$QAV12@@Z + ?Append@Cord@absl@@QAEXABV12@@Z + ?Append@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ?Append@FormatSinkImpl@str_format_internal@absl@@QAEXID@Z + ?Append@StringifySink@detect_specialization@log_internal@absl@@QAEXID@Z + ?Append@StringifySink@detect_specialization@log_internal@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Append@StringifySink@strings_internal@absl@@QAEXID@Z + ?Append@StringifySink@strings_internal@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?AppendArray@InlineRep@Cord@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@3@@Z + ?AppendCordToString@absl@@YAXABVCord@1@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AppendPack@str_format_internal@absl@@YAAAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?AppendPieces@strings_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$initializer_list@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@5@@Z + ?AppendPrecise@Cord@absl@@AAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?AppendSlow@CordRepBtree@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z + ?AppendTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToInlined@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?ApplyMask@MaskedPointer@flags_internal@absl@@AAEXI@Z + ?ApplySubstitutions@strings_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@45@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?AsciiStrToLower@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AsciiStrToLower@ascii_internal@absl@@YAXPADPBDI@Z + ?AsciiStrToUpper@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AsciiStrToUpper@ascii_internal@absl@@YAXPADPBDI@Z + ?AssertHeld@Mutex@absl@@QBEXXZ + ?AssertNotHeld@Mutex@absl@@QBEXXZ + ?AssertReaderHeld@Mutex@absl@@QBEXXZ + ?AssertValidType@FlagImpl@flags_internal@absl@@QBEXPBXP6APBVtype_info@@XZ@Z + ?AssignLargeString@Cord@absl@@AAEAAV12@$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?AssignSlow@InlineRep@Cord@absl@@AAEXABV123@@Z + ?AsyncSignalSafeWriteError@raw_log_internal@absl@@YAXPBDI@Z + ?At@TimeZone@absl@@QBE?AUCivilInfo@12@VTime@2@@Z + ?At@TimeZone@absl@@QBE?AUTimeInfo@12@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@2@@Z + ?AtLocation@LogMessage@log_internal@absl@@QAEAAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?AtomicBufferValue@FlagImpl@flags_internal@absl@@ABEPAU?$atomic@_K@__Cr@std@@XZ + ?AwaitCommon@Mutex@absl@@AAE_NABVCondition@2@VKernelTimeout@synchronization_internal@2@@Z + ?Base64Escape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?Base64Escape@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?Base64EscapeInternal@strings_internal@absl@@YAIPBEIPADIPBD_N@Z + ?Base64Unescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?BindWithPack@str_format_internal@absl@@YA_NPBUUnboundConversion@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@PAVBoundConversion@12@@Z + ?Block@Barrier@absl@@QAE_NXZ + ?Block@Mutex@absl@@AAEXPAUPerThreadSynch@base_internal@2@@Z + ?BreakTime@TimeZoneInfo@cctz@time_internal@absl@@UBE?AUabsolute_lookup@time_zone@234@ABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BreakTime@TimeZoneLibC@cctz@time_internal@absl@@UBE?AUabsolute_lookup@time_zone@234@ABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?BytesToHexString@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?CPUSupportsRandenHwAes@random_internal@absl@@YA_NXZ + ?CUnescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@1@Z + ?CalculateBase64EscapedLenInternal@strings_internal@absl@@YAII_N@Z + ?CallVoidPtrFunction@Condition@absl@@CA_NPBV12@@Z + ?CancelledError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?CappedDamerauLevenshteinDistance@strings_internal@absl@@YAEV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0E@Z + ?CatPieces@strings_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$initializer_list@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@5@@Z + ?Ceil@absl@@YA?AVDuration@1@V21@0@Z + ?CheckDefaultValueParsingRoundtrip@FlagImpl@flags_internal@absl@@EBEXXZ + ?CheckDefaultValueParsingRoundtrip@PrivateHandleAccessor@flags_internal@absl@@SAXABVCommandLineFlag@3@@Z + ?CheckInvariants@GraphCycles@synchronization_internal@absl@@QBE_NXZ + ?CheckMask@MaskedPointer@flags_internal@absl@@ABE_NI@Z + ?CheckstrcasecmpfalseImpl@log_internal@absl@@YAPBDPBD00@Z + ?CheckstrcasecmptrueImpl@log_internal@absl@@YAPBDPBD00@Z + ?CheckstrcmpfalseImpl@log_internal@absl@@YAPBDPBD00@Z + ?CheckstrcmptrueImpl@log_internal@absl@@YAPBDPBD00@Z + ?Checksum@CrcCordState@crc_internal@absl@@QBE?AVcrc32c_t@3@XZ + ?CityHash32@hash_internal@absl@@YAIPBDI@Z + ?CityHash64@hash_internal@absl@@YA_KPBDI@Z + ?CityHash64WithSeed@hash_internal@absl@@YA_KPBDI_K@Z + ?CityHash64WithSeeds@hash_internal@absl@@YA_KPBDI_K1@Z + ?Clear@Cord@absl@@QAEXXZ + ?ClearBackingArray@container_internal@absl@@YAXAAVCommonFields@12@ABUPolicyFunctions@12@PAX_N3@Z + ?ClearCurrentThreadIdentity@base_internal@absl@@YAXXZ + ?ClearLogBacktraceLocation@absl@@YAXXZ + ?ClearTimeZoneMapTestOnly@Impl@time_zone@cctz@time_internal@absl@@SAXXZ + ?CloneAndUnref@StatusRep@status_internal@absl@@QBEPAV123@XZ + ?CombineContiguousImpl@hash_internal@absl@@YA_K_KPBEIU?$integral_constant@H$03@__Cr@std@@@Z + ?CombineContiguousImpl@hash_internal@absl@@YA_K_KPBEIU?$integral_constant@H$07@__Cr@std@@@Z + ?CombineLargeContiguousImplOn32BitLengthGt8@hash_internal@absl@@YA_KPBEI_K@Z + ?CombineLargeContiguousImplOn64BitLengthGt32@hash_internal@absl@@YA_KPBEI_K@Z + ?Compare@Cord@absl@@QBEHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?CompareImpl@Cord@absl@@ABEHABV12@@Z + ?CompareSlowPath@Cord@absl@@ABEHABV12@II@Z + ?CompareSlowPath@Cord@absl@@ABEHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@II@Z + ?Compute@CrcNonTemporalMemcpyAVXEngine@crc_internal@absl@@UBE?AVcrc32c_t@3@PIAXPIBXIV43@@Z + ?Compute@CrcNonTemporalMemcpyEngine@crc_internal@absl@@UBE?AVcrc32c_t@3@PIAXPIBXIV43@@Z + ?Compute@FallbackCrcMemcpyEngine@crc_internal@absl@@UBE?AVcrc32c_t@3@PIAXPIBXIV43@@Z + ?ConcatCrc32c@absl@@YA?AVcrc32c_t@1@V21@0I@Z + ?Consume@cord_internal@absl@@YAXPAUCordRep@12@V?$FunctionRef@$$A6AXPAUCordRep@cord_internal@absl@@II@Z@2@@Z + ?ConsumeBeginTo@CordRepBtree@cord_internal@absl@@CAPAV123@PAV123@II@Z + ?ConsumeUnboundConversionNoInline@str_format_internal@absl@@YAPBDPBD0PAUUnboundConversion@12@PAH@Z + ?Contains@Cord@absl@@QBE_NABV12@@Z + ?Contains@Cord@absl@@QBE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ConvertBoolArg@str_format_internal@absl@@YA_N_NPAVFormatSinkImpl@12@@Z + ?ConvertDateTime@absl@@YA?AUTimeConversion@1@_JHHHHHVTimeZone@1@@Z + ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPAW4ctrl_t@12@I@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NMABVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NNABVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?ConvertFloatImpl@str_format_internal@absl@@YA_NOABVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?Copy@container_internal@absl@@YAXAAVCommonFields@12@ABUPolicyFunctions@12@ABV312@V?$FunctionRef@$$A6AXPAXPBX@Z@2@@Z + ?CopyCordToString@absl@@YAXABVCord@1@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?CopyPrefix@CordRepBtree@cord_internal@absl@@AAE?AUCopyResult@123@I_N@Z + ?CopySuffix@CordRepBtree@cord_internal@absl@@AAE?AUCopyResult@123@I@Z + ?CopyToArraySlowPath@Cord@absl@@ABEXPAD@Z + ?Crash@Helper@internal_statusor@absl@@SAXABVStatus@3@@Z + ?Crc32c@CRC@crc_internal@absl@@SAPAV123@XZ + ?CreateSlow@CordRepBtree@cord_internal@absl@@CAPAV123@PAUCordRep@23@@Z + ?CreateThreadIdentity@synchronization_internal@absl@@YAPAUThreadIdentity@base_internal@2@XZ + ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPAUThreadIdentity@12@XZ + ?CurrentValue@FlagImpl@flags_internal@absl@@EBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?DataGuard@FlagImpl@flags_internal@absl@@ABEAAVMutex@3@XZ + ?DataLossError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?DeadlineExceededError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?DecodeFrom@ProtoField@log_internal@absl@@QAE_NPAV?$Span@$$CBD@3@@Z + ?DecodeRustPunycode@debugging_internal@absl@@YAPADUDecodeRustPunycodeOptions@12@@Z + ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_JI@Z + ?DecrementCount@BlockingCounter@absl@@QAE_NXZ + ?DecrementSynchSem@Mutex@absl@@CA_NPAV12@PAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z + ?DeduceUsageFlags@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@XZ + ?DefaultStackUnwinder@absl@@YAHPAPAXPAHHHPBX1@Z + ?DefaultStackUnwinder@internal_stacktrace@absl@@YAHPAPAXPAIPAHHHPBX2@Z + ?DefaultValue@FlagImpl@flags_internal@absl@@EBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Delete@CordzHandle@cord_internal@absl@@SAXPAV123@@Z + ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPAUArena@123@@Z + ?Demangle@debugging_internal@absl@@YA_NPBDPADI@Z + ?DemangleRustSymbolEncoding@debugging_internal@absl@@YA_NPBDPADI@Z + ?DemangleString@debugging_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBD@Z + ?Description@TimeZoneInfo@cctz@time_internal@absl@@UBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Description@TimeZoneLibC@cctz@time_internal@absl@@UBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Destroy@CordRep@cord_internal@absl@@SAXPAU123@@Z + ?Destroy@CordRepBtree@cord_internal@absl@@SAXPAV123@@Z + ?Destroy@CordRepCrc@cord_internal@absl@@SAXPAU123@@Z + ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@AAEXXZ + ?DestroyCordSlow@Cord@absl@@AAEXXZ + ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QAE?AV?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QBE_NPBV123@@Z + ?Die@LogMessage@log_internal@absl@@AAEXXZ + ?DieBecauseNull@log_internal@absl@@YAXPBDH0@Z + ?Digits10@?$BigUnsigned@$03@strings_internal@absl@@SAHXZ + ?Digits10@?$BigUnsigned@$0FE@@strings_internal@absl@@SAHXZ + ?DoIgnoreLeak@absl@@YAXPBX@Z + ?Dtor@Mutex@absl@@AAEXXZ + ?DummyFunction@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@ABVCord@absl@@@Z@base_internal@absl@@CA?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@ABVCord@3@@Z + ?DummyFunction@?$AtomicHook@P6AXPBDH000@Z@base_internal@absl@@CAXPBDH000@Z + ?DummyFunction@?$AtomicHook@P6AXPBDPBX@Z@base_internal@absl@@CAXPBDPBX@Z + ?DummyFunction@?$AtomicHook@P6AXPBDPBX_J@Z@base_internal@absl@@CAXPBDPBX_J@Z + ?DummyFunction@?$AtomicHook@P6AXPBX_J@Z@base_internal@absl@@CAXPBX_J@Z + ?DummyFunction@?$AtomicHook@P6AXXZ@base_internal@absl@@CAXXZ + ?DummyFunction@?$AtomicHook@P6AX_J@Z@base_internal@absl@@CAX_J@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPBUCordRep@23@AAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPBUCordRep@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@67@@Z + ?Dump@CordRepBtree@cord_internal@absl@@SAXPBUCordRep@23@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_NAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@67@@Z + ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXQAXQBQAXQAHHH_NP6AXPBDPAX@Z5@Z + ?DumpStackTrace@debugging_internal@absl@@YAXHH_NP6AXPBDPAX@Z2@Z + ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z + ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z + ?EmptyGeneration@container_internal@absl@@YAPAEXZ + ?EmptyString@Status@absl@@CAPBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?EnableDebugLog@CondVar@absl@@QAEXPBD@Z + ?EnableDebugLog@Mutex@absl@@QAEXPBD@Z + ?EnableInvariantDebugging@Mutex@absl@@QAEXP6AXPAX@Z0@Z + ?EnableLogPrefix@absl@@YAX_N@Z + ?EnableMutexInvariantDebugging@absl@@YAX_N@Z + ?EnableSymbolizeLogStackTrace@log_internal@absl@@YAX_N@Z + ?Encode32Bit@log_internal@absl@@YA_N_KIPAV?$Span@D@2@@Z + ?Encode64Bit@log_internal@absl@@YA_N_K0PAV?$Span@D@2@@Z + ?EncodeBytes@log_internal@absl@@YA_N_KV?$Span@$$CBD@2@PAV?$Span@D@2@@Z + ?EncodeBytesTruncate@log_internal@absl@@YA_N_KV?$Span@$$CBD@2@PAV?$Span@D@2@@Z + ?EncodeMessageLength@log_internal@absl@@YAXV?$Span@D@2@PBV32@@Z + ?EncodeMessageStart@log_internal@absl@@YA?AV?$Span@D@2@_K0PAV32@@Z + ?EncodeStructuredProtoField@log_internal@absl@@YA_NUStructuredProtoField@12@AAV?$Span@D@2@@Z + ?EncodeUTF8Char@strings_internal@absl@@YAIPAD_U@Z + ?EncodeVarint@log_internal@absl@@YA_N_K0PAV?$Span@D@2@@Z + ?EncodeWaitCycles@SpinLock@base_internal@absl@@KAI_J0@Z + ?EndsWith@Cord@absl@@QBE_NABV12@@Z + ?EndsWith@Cord@absl@@QBE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?EndsWithIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EqualsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?EqualsImpl@Cord@absl@@ABE_NABV12@I@Z + ?EqualsImpl@Cord@absl@@ABE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@ABE_NEE@Z + ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAUPayload@status_internal@3@PBU453@0@Z + ?EraseMetaOnlyLarge@container_internal@absl@@YAXAAVCommonFields@12@PBW4ctrl_t@12@I@Z + ?EraseMetaOnlySmall@container_internal@absl@@YAXAAVCommonFields@12@_NI@Z + ?ErasePayload@StatusRep@status_internal@absl@@QAE?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z + ?Eval@Condition@absl@@QBE_NXZ + ?ExitOnDFatal@log_internal@absl@@YA_NXZ + ?ExpectedChecksum@Cord@absl@@QBE?AV?$optional@I@__Cr@std@@XZ + ?Extend@CRC32@crc_internal@absl@@UBEXPAIPBXI@Z + ?ExtendByZeroes@CRC32@crc_internal@absl@@UBEXPAII@Z + ?ExtendByZeroesImpl@CRC32@crc_internal@absl@@CAXPAIIQBI1@Z + ?ExtendCrc32cByZeroes@absl@@YA?AVcrc32c_t@1@V21@I@Z + ?ExtendCrc32cInternal@crc_internal@absl@@YA?AVcrc32c_t@2@V32@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ExtendTransitions@TimeZoneInfo@cctz@time_internal@absl@@AAE_NXZ + ?ExtractAppendBuffer@CordRepBtree@cord_internal@absl@@SA?AUExtractResult@CordRep@23@PAV123@I@Z + ?ExtractFront@CordRepBtree@cord_internal@absl@@CAPAUCordRep@23@PAV123@@Z + ?FDivDuration@absl@@YANVDuration@1@0@Z + ?FLAGS_noflagfile@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FLAGS_nofromenv@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FLAGS_notryfromenv@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FLAGS_noundefok@@3UFlagRegistrarEmpty@flags_internal@absl@@A + ?FNMatch@log_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?FailQuietly@LogMessage@log_internal@absl@@KAXXZ + ?FailWithoutStackTrace@LogMessage@log_internal@absl@@KAXXZ + ?FailedPreconditionError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FailureSignalToString@debugging_internal@absl@@YAPBDH@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPADHPAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPADIPAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPAD_JPAD@Z + ?FastIntToBuffer@numbers_internal@absl@@YAPAD_KPAD@Z + ?Fer@Mutex@absl@@AAEXPAUPerThreadSynch@base_internal@2@@Z + ?Filename@FlagImpl@flags_internal@absl@@EBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?FillParentStack@CordzInfo@cord_internal@absl@@CAIPBV123@PAPAX@Z + ?FillWordTable@CRCImpl@crc_internal@absl@@SAXIIHPAY0BAA@I@Z + ?FillZeroesTable@CRCImpl@crc_internal@absl@@SAHIPAY0BAA@I@Z + ?FinalizeEncodingAndFormat@LogMessageData@LogMessage@log_internal@absl@@QAEXXZ + ?FinalizeRegistry@flags_internal@absl@@YAXXZ + ?Find@ByAnyChar@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@I@Z + ?Find@ByAsciiWhitespace@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@I@Z + ?Find@ByChar@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@I@Z + ?Find@ByLength@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@I@Z + ?Find@ByString@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V345@I@Z + ?Find@Cord@absl@@QBE?AVCharIterator@12@ABV12@@Z + ?Find@Cord@absl@@QBE?AVCharIterator@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindCommandLineFlag@absl@@YAPAVCommandLineFlag@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindFlag@FlagRegistry@flags_internal@absl@@QAEPAVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindFlatStartPiece@InlineRep@Cord@absl@@QBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?FindImpl@Cord@absl@@ABE?AVCharIterator@12@V312@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?FindLongestCommonPrefix@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@0@Z + ?FindLongestCommonSuffix@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V234@0@Z + ?FindPath@GraphCycles@synchronization_internal@absl@@QBEHUGraphId@23@0HQAU423@@Z + ?FiveToTheNth@?$BigUnsigned@$03@strings_internal@absl@@SA?AV123@H@Z + ?FiveToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@SA?AV123@H@Z + ?FixUpStack@internal_stacktrace@absl@@YAXPAPAXPAIPAHIAAI@Z + ?FixedOffsetFromName@cctz@time_internal@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FixedOffsetToAbbr@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FixedOffsetToName@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@56@@Z + ?FlagHelp@flags_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABVCommandLineFlag@2@W4HelpFormat@12@@Z + ?FlagsHelp@flags_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@W4HelpFormat@12@1@Z + ?FlagsToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4Flags@12@@Z + ?FlatOverhead@CordTestAccess@strings_internal@absl@@SAIXZ + ?FlatTagToLength@CordTestAccess@strings_internal@absl@@SAIE@Z + ?FlattenSlowPath@Cord@absl@@AAE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Floor@absl@@YA?AVDuration@1@V21@0@Z + ?Flush@LogMessage@log_internal@absl@@QAEXXZ + ?Flush@LogSink@absl@@UAEXXZ + ?FlushLogSinks@log_internal@absl@@YAXXZ + ?ForEachChunkAux@Cord@absl@@CAXPAUCordRep@cord_internal@2@V?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z@2@@Z + ?ForEachFlag@flags_internal@absl@@YAXV?$function@$$A6AXAAVCommandLineFlag@absl@@@Z@__Cr@std@@@Z + ?ForEachPayload@StatusRep@status_internal@absl@@QBEXV?$FunctionRef@$$A6AXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABVCord@absl@@@Z@3@@Z + ?ForVar2@CheckOpMessageBuilder@log_internal@absl@@QAEAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?ForcedTrySample@container_internal@absl@@YA?AVHashtablezInfoHandle@12@IIIG@Z + ?ForgetDeadlockInfo@Mutex@absl@@QAEXXZ + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatCivilTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?FormatConversionCharToConvInt@str_format_internal@absl@@YA_KD@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0BPPPL@@12@DVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0BPPPL@@12@_WVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAA@@12@UVoidPtr@12@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@$$TVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@PBDVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0EAAAE@@12@PB_WVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@ABV?$basic_string@_WU?$char_traits@_W@__Cr@std@@V?$allocator@_W@23@@__Cr@std@@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0IAAAE@@12@V?$basic_string_view@_WU?$char_traits@_W@__Cr@std@@@__Cr@std@@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@MVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@NVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPOAA@@12@OVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@CVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@EVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@FVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@GVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@HVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@IVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@JVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@KVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@Vint128@2@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@Vuint128@2@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@_JVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatConvertImpl@str_format_internal@absl@@YA?AU?$ArgConvertResult@$0JPPPL@@12@_KVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z + ?FormatDuration@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?FormatLogMessage@log_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LogSeverity@2@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@2@VDuration@2@IV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@HW4PrefixFormat@12@3@Z + ?FormatLogPrefix@log_internal@absl@@YAIW4LogSeverity@2@VTime@2@IV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HW4PrefixFormat@12@AAV?$Span@D@2@@Z + ?FormatPack@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@VTime@1@VTimeZone@1@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?FormatTime@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@VTimeZone@1@@Z + ?FormatUntyped@str_format_internal@absl@@YA_NVFormatRawSinkImpl@12@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?FprintF@str_format_internal@absl@@YAHPAU_iobuf@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?Free@LowLevelAlloc@base_internal@absl@@SAXPAX@Z + ?Frequency@UnscaledCycleClock@base_internal@absl@@CANXZ + ?FromChrono@absl@@YA?AVTime@1@ABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?FromTM@absl@@YA?AVTime@1@ABUtm@@VTimeZone@1@@Z + ?FromUDate@absl@@YA?AVTime@1@N@Z + ?FromUniversal@absl@@YA?AVTime@1@_J@Z + ?Generate@RandenHwAes@random_internal@absl@@SAXPBXPAX@Z + ?Generate@RandenSlow@random_internal@absl@@SAXPBXPAX@Z + ?Get@?$Flag@V?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@@flags_internal@absl@@ABE?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@XZ + ?GetAllFlags@absl@@YA?AV?$flat_hash_map@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@UStringHash@container_internal@5@UStringEq@75@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@23@@1@XZ + ?GetAndroidNativeTag@log_internal@absl@@YAPBDXZ + ?GetAppendBuffer@CordRepBtree@cord_internal@absl@@QAE?AV?$Span@D@3@I@Z + ?GetAppendBufferSlow@CordRepBtree@cord_internal@absl@@AAE?AV?$Span@D@3@I@Z + ?GetAppendBufferSlowPath@Cord@absl@@AAE?AVCordBuffer@2@III@Z + ?GetArchSpecificEngines@CrcMemcpy@crc_internal@absl@@CA?AUArchSpecificEngines@123@XZ + ?GetCachedTID@base_internal@absl@@YAIXZ + ?GetCharacter@CordRepBtree@cord_internal@absl@@QBEDI@Z + ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QBE?AUCordzStatistics@23@XZ + ?GetCpuType@crc_internal@absl@@YA?AW4CpuType@12@XZ + ?GetCurrentTimeNanos@absl@@YA_JXZ + ?GetDebugStackTraceHook@debugging_internal@absl@@YAP6AXQBQAXHP6AXPBDPAX@Z2@ZXZ + ?GetEntropyFromRandenPool@random_internal@absl@@YAXPAXI@Z + ?GetEstimatedFairShareMemoryUsage@cord_internal@absl@@YAIPBUCordRep@12@@Z + ?GetEstimatedMemoryUsage@cord_internal@absl@@YAIPBUCordRep@12@@Z + ?GetFlagsHelpFormat@flags_internal@absl@@YA?AW4HelpFormat@12@XZ + ?GetFlagsHelpMatchSubstr@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?GetFlagsHelpMode@flags_internal@absl@@YA?AW4HelpMode@12@XZ + ?GetFlatAux@Cord@absl@@CA_NPAUCordRep@cord_internal@2@PAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?GetHashtablezMaxSamples@container_internal@absl@@YAIXZ + ?GetHashtablezSampleParameter@container_internal@absl@@YAHXZ + ?GetId@GraphCycles@synchronization_internal@absl@@QAE?AUGraphId@23@PAX@Z + ?GetKeys@RandenHwAes@random_internal@absl@@SAPBXXZ + ?GetKeys@RandenSlow@random_internal@absl@@SAPBXXZ + ?GetMisspellingHints@flags_internal@absl@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@@Z + ?GetMorePreciseMemoryUsage@cord_internal@absl@@YAIPBUCordRep@12@@Z + ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PBV123@@Z + ?GetParentStack@CordzInfo@cord_internal@absl@@QBE?AV?$Span@QAX@3@XZ + ?GetPayload@StatusRep@status_internal@absl@@QBE?AV?$optional@VCord@absl@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@@Z + ?GetProgramCounter@debugging_internal@absl@@YAPAXQAX@Z + ?GetRefForEmptyClass@container_internal@absl@@YAPAXAAVCommonFields@12@@Z + ?GetSaltMaterial@random_internal@absl@@YA?AV?$optional@I@__Cr@std@@XZ + ?GetSkipCount@ExponentialBiased@profiling_internal@absl@@QAE_J_J@Z + ?GetStack@CordzInfo@cord_internal@absl@@QBE?AV?$Span@QAX@3@XZ + ?GetStackFrames@internal_stacktrace@absl@@YAHPAPAXPAIPAHHH@Z + ?GetStackFramesWithContext@internal_stacktrace@absl@@YAHPAPAXPAIPAHHHPBX2@Z + ?GetStackTrace@GraphCycles@synchronization_internal@absl@@QAEHUGraphId@23@PAPAPAX@Z + ?GetStackTrace@absl@@YAHPAPAXHH@Z + ?GetStackTraceWithContext@absl@@YAHPAPAXHHPBXPAH@Z + ?GetStatusPayloadPrinter@status_internal@absl@@YAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@ABVCord@2@@ZXZ + ?GetStride@ExponentialBiased@profiling_internal@absl@@QAE_J_J@Z + ?GetTID@base_internal@absl@@YAIXZ + ?GetTestEngine@CrcMemcpy@crc_internal@absl@@SA?AV?$unique_ptr@VCrcMemcpyEngine@crc_internal@absl@@U?$default_delete@VCrcMemcpyEngine@crc_internal@absl@@@__Cr@std@@@__Cr@std@@HH@Z + ?GetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAPAU?$atomic@H@__Cr@std@@XZ + ?GetTransitionType@TimeZoneInfo@cctz@time_internal@absl@@AAE_NH_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAE@Z + ?GetUsageConfig@flags_internal@absl@@YA?AUFlagsUsageConfig@2@XZ + ?GetWord@?$BigUnsigned@$03@strings_internal@absl@@QBEIH@Z + ?GetWord@?$BigUnsigned@$0FE@@strings_internal@absl@@QBEIH@Z + ?GlobalHashtablezSampler@container_internal@absl@@YAAAV?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@2@XZ + ?GlobalList@CordzInfo@cord_internal@absl@@CAPAUList@123@XZ + ?GlobalRegistry@FlagRegistry@flags_internal@absl@@SAAAV123@XZ + ?GuaranteedEqual@Condition@absl@@SA_NPBV12@0@Z + ?HandleInvalidStatusCtorArg@Helper@internal_statusor@absl@@SAXPAVStatus@3@@Z + ?HandleUsageFlags@flags_internal@absl@@YA?AW4HelpMode@12@AAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@@Z + ?HasBeenNotifiedInternal@Notification@absl@@CA_NPBU?$atomic@_N@__Cr@std@@@Z + ?HasBeenRead@MaskedPointer@flags_internal@absl@@QBE_NXZ + ?HasEdge@GraphCycles@synchronization_internal@absl@@QBE_NUGraphId@23@0@Z + ?HasNode@GraphCycles@synchronization_internal@absl@@QAE_NUGraphId@23@@Z + ?HasRandenHwAesImplementation@random_internal@absl@@YA_NXZ + ?HaveLeakSanitizer@absl@@YA_NXZ + ?Head@CordzInfo@cord_internal@absl@@SAPAV123@ABVCordzSnapshot@23@@Z + ?Help@FlagImpl@flags_internal@absl@@EBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?HexStringToBytes@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?IDivDuration@absl@@YA_JVDuration@1@0PAV21@@Z + ?In@Time@absl@@QBE?AUBreakdown@12@VTimeZone@2@@Z + ?InMillisecondsFromNow@KernelTimeout@synchronization_internal@absl@@QBEKXZ + ?InNanosecondsFromNow@KernelTimeout@synchronization_internal@absl@@ABE_JXZ + ?IncrementSynchSem@Mutex@absl@@CAXPAV12@PAUPerThreadSynch@base_internal@2@@Z + ?Init@CordRepBtreeReader@cord_internal@absl@@QAE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCordRepBtree@23@@Z + ?Init@FlagImpl@flags_internal@absl@@AAEXXZ + ?InitDiscreteDistribution@random_internal@absl@@YA?AV?$vector@U?$pair@NI@__Cr@std@@V?$allocator@U?$pair@NI@__Cr@std@@@23@@__Cr@std@@PAV?$vector@NV?$allocator@N@__Cr@std@@@45@@Z + ?InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEXABV123@@Z + ?InitSigSafeArena@base_internal@absl@@YAXXZ + ?InitTables@CRC32@crc_internal@absl@@UAEXXZ + ?InitTree@ChunkIterator@Cord@absl@@AAEXPAUCordRep@cord_internal@3@@Z + ?InitWhat@BadStatusOrAccess@absl@@ABEXXZ + ?Initialize@ExponentialBiased@profiling_internal@absl@@AAEXXZ + ?InitializeCordRepExternal@cord_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAUCordRepExternal@12@@Z + ?InitializeEncodingAndFormat@LogMessageData@LogMessage@log_internal@absl@@QAEXXZ + ?InitializeLog@absl@@YAXXZ + ?InitializeSymbolizer@absl@@YAXPBD@Z + ?InsertEdge@GraphCycles@synchronization_internal@absl@@QAE_NUGraphId@23@0@Z + ?InstallFailureSignalHandler@absl@@YAXABUFailureSignalHandlerOptions@1@@Z + ?InternalAttemptToUseMutexInFatalSignalHandler@Mutex@absl@@SAXXZ + ?InternalCondVarPoke@StdcppWaiter@synchronization_internal@absl@@AAEXXZ + ?InternalCondVarPoke@Win32Waiter@synchronization_internal@absl@@AAEXXZ + ?InternalError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?InvalidArgumentError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?InvokeCallback@FlagImpl@flags_internal@absl@@QBEXXZ + ?IsAborted@absl@@YA_NABVStatus@1@@Z + ?IsAlreadyExists@absl@@YA_NABVStatus@1@@Z + ?IsCancelled@absl@@YA_NABVStatus@1@@Z + ?IsCordBtreeExhaustiveValidationEnabled@cord_internal@absl@@YA_NXZ + ?IsDataLoss@absl@@YA_NABVStatus@1@@Z + ?IsDeadlineExceeded@absl@@YA_NABVStatus@1@@Z + ?IsFailedPrecondition@absl@@YA_NABVStatus@1@@Z + ?IsFatal@LogMessage@log_internal@absl@@ABE_NXZ + ?IsFlat@CordRepBtree@cord_internal@absl@@QBE_NIIPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?IsFlat@CordRepBtree@cord_internal@absl@@QBE_NPAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?IsHashtablezEnabled@container_internal@absl@@YA_NXZ + ?IsInitialized@log_internal@absl@@YA_NXZ + ?IsInternal@absl@@YA_NABVStatus@1@@Z + ?IsInvalidArgument@absl@@YA_NABVStatus@1@@Z + ?IsNotFound@absl@@YA_NABVStatus@1@@Z + ?IsOutOfRange@absl@@YA_NABVStatus@1@@Z + ?IsPermissionDenied@absl@@YA_NABVStatus@1@@Z + ?IsReachable@GraphCycles@synchronization_internal@absl@@QBE_NUGraphId@23@0@Z + ?IsResourceExhausted@absl@@YA_NABVStatus@1@@Z + ?IsRetired@CommandLineFlag@absl@@UBE_NXZ + ?IsSpecifiedOnCommandLine@FlagImpl@flags_internal@absl@@EBE_NXZ + ?IsSpecifiedOnCommandLine@PrivateHandleAccessor@flags_internal@absl@@SA_NABVCommandLineFlag@3@@Z + ?IsUnauthenticated@absl@@YA_NABVStatus@1@@Z + ?IsUnavailable@absl@@YA_NABVStatus@1@@Z + ?IsUnimplemented@absl@@YA_NABVStatus@1@@Z + ?IsUnknown@absl@@YA_NABVStatus@1@@Z + ?IsUnprotectedReadCandidate@MaskedPointer@flags_internal@absl@@QBE_NXZ + ?IsValid@CordRepBtree@cord_internal@absl@@SA_NPBV123@_N@Z + ?IterateOverFullSlots@container_internal@absl@@YAXABVCommonFields@12@IV?$FunctionRef@$$A6AXPBW4ctrl_t@container_internal@absl@@PAX@Z@2@@Z + ?KeyFunction@LogSink@absl@@EBEXXZ + ?LeakCheckerIsActive@absl@@YA_NXZ + ?LengthModToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4LengthMod@2@@Z + ?LengthToTag@CordTestAccess@strings_internal@absl@@SAEI@Z + ?Load@TimeZoneInfo@cctz@time_internal@absl@@AAE_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?Load@TimeZoneInfo@cctz@time_internal@absl@@AAE_NPAVZoneInfoSource@234@@Z + ?LoadTimeZone@Impl@time_zone@cctz@time_internal@absl@@SA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAV2345@@Z + ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@ABE?AUabsolute_lookup@time_zone@234@_JABUTransition@234@@Z + ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@ABE?AUabsolute_lookup@time_zone@234@_JABUTransitionType@234@@Z + ?Lock@CordzInfo@cord_internal@absl@@QAEXW4MethodIdentifier@CordzUpdateTracker@23@@Z + ?LockSlow@Mutex@absl@@AAEXPBUMuHowS@2@PBVCondition@2@H@Z + ?LockSlowLoop@Mutex@absl@@AAEXPAUSynchWaitParams@2@H@Z + ?LockSlowWithDeadline@Mutex@absl@@AAE_NPBUMuHowS@2@PBVCondition@2@VKernelTimeout@synchronization_internal@2@H@Z + ?LockWhenCommon@Mutex@absl@@AAE_NABVCondition@2@VKernelTimeout@synchronization_internal@2@_N@Z + ?LogBacktraceIfNeeded@LogMessage@log_internal@absl@@AAEXXZ + ?LogFatalNodeType@cord_internal@absl@@YAXPAUCordRep@12@@Z + ?LogToSinks@log_internal@absl@@YAXABVLogEntry@2@V?$Span@PAVLogSink@absl@@@2@_N@Z + ?Make@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?Make@TimeZoneInfo@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?Make@TimeZoneLibC@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneLibC@cctz@time_internal@absl@@U?$default_delete@VTimeZoneLibC@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?MakeAbsNanos@KernelTimeout@synchronization_internal@absl@@QBE_JXZ + ?MakeAbsTimespec@KernelTimeout@synchronization_internal@absl@@QBE?AUtimespec@@XZ + ?MakeCheckFailString@status_internal@absl@@YAPBDPBVStatus@2@PBD@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@C@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@E@Z + ?MakeCheckOpValueString@log_internal@absl@@YAXAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PBX@Z + ?MakeInitValue@FlagImpl@flags_internal@absl@@ABE?AV?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@XZ + ?MakeRelativeTimespec@KernelTimeout@synchronization_internal@absl@@QBE?AUtimespec@@XZ + ?MakeSeedSeq@absl@@YA?AV?$SaltedSeedSeq@Vseed_seq@__Cr@std@@@random_internal@1@XZ + ?MakeTime@TimeZoneInfo@cctz@time_internal@absl@@UBE?AUcivil_lookup@time_zone@234@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?MakeTime@TimeZoneLibC@cctz@time_internal@absl@@UBE?AUcivil_lookup@time_zone@234@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?MapToLocalCode@status_internal@absl@@YA?AW4StatusCode@2@H@Z + ?MarkAsRead@MaskedPointer@flags_internal@absl@@QAEXXZ + ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@ABE_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z + ?MaxFlatLength@CordTestAccess@strings_internal@absl@@SAIXZ + ?MaxFramesInLogStackTrace@log_internal@absl@@YAHXZ + ?MaybeBecomeIdle@WaiterBase@synchronization_internal@absl@@KAXXZ + ?MaybeExit@flags_internal@absl@@YAXW4HelpMode@12@@Z + ?MaybeGetCrcCordState@Cord@absl@@ABEPBVCrcCordState@crc_internal@2@XZ + ?MaybeTrackCordImpl@CordzInfo@cord_internal@absl@@CAXAAVInlineData@23@ABV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?MemcpyCrc32c@absl@@YA?AVcrc32c_t@1@PAXPBXIV21@@Z + ?MergeTrees@CordRepBtree@cord_internal@absl@@CAPAV123@PAV123@0@Z + ?MinLogLevel@absl@@YA?AW4LogSeverityAtLeast@1@XZ + ?MixIntoSeedMaterial@random_internal@absl@@YAXV?$Span@$$CBI@2@V?$Span@I@2@@Z + ?ModificationCount@FlagImpl@flags_internal@absl@@ABE_JXZ + ?MovedFromString@Status@absl@@CAPBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@AAEXHPBI@Z + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QAEXI@Z + ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QAEX_K@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEXHPBI@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEXI@Z + ?MultiplyBy@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEX_K@Z + ?MultiplyByFiveToTheNth@?$BigUnsigned@$03@strings_internal@absl@@QAEXH@Z + ?MultiplyByFiveToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEXH@Z + ?MultiplyByTenToTheNth@?$BigUnsigned@$03@strings_internal@absl@@QAEXH@Z + ?MultiplyByTenToTheNth@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEXH@Z + ?MultiplyStep@?$BigUnsigned@$03@strings_internal@absl@@AAEXHPBIHH@Z + ?MultiplyStep@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEXHPBIHH@Z + ?MutexDelay@synchronization_internal@absl@@YAHHH@Z + ?Name@FlagImpl@flags_internal@absl@@EBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?New@CordRepCrc@cord_internal@absl@@SAPAU123@PAUCordRep@23@VCrcCordState@crc_internal@3@@Z + ?NewArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@I@Z + ?NewCRC32AcceleratedX86ARMCombinedAll@crc_internal@absl@@YA?AV?$vector@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VCRCImpl@crc_internal@absl@@U?$default_delete@VCRCImpl@crc_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@XZ + ?NewInternal@CRCImpl@crc_internal@absl@@SAPAV123@XZ + ?NewString@CheckOpMessageBuilder@log_internal@absl@@QAEPBDXZ + ?Next@CordRepBtreeReader@cord_internal@absl@@QAE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Next@CordzInfo@cord_internal@absl@@QBEPAV123@ABVCordzSnapshot@23@@Z + ?NextTransition@TimeZone@absl@@QBE_NVTime@2@PAUCivilTransition@12@@Z + ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@time_zone@234@@Z + ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@time_zone@234@@Z + ?NextUp@CordRepBtreeNavigator@cord_internal@absl@@AAEPAUCordRep@23@XZ + ?NoPrefix@LogMessage@log_internal@absl@@QAEAAV123@XZ + ?NominalCPUFrequency@base_internal@absl@@YANXZ + ?Normalize@CrcCordState@crc_internal@absl@@QAEXXZ + ?NormalizedPrefixCrcAtNthChunk@CrcCordState@crc_internal@absl@@QBE?AUPrefixCrc@123@I@Z + ?NotFoundError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Notify@Notification@absl@@QAEXXZ + ?Now@CycleClock@base_internal@absl@@SA_JXZ + ?Now@UnscaledCycleClock@base_internal@absl@@CA_JXZ + ?Now@absl@@YA?AVTime@1@XZ + ?NumCPUs@base_internal@absl@@YAHXZ + ?NumLeakedFlagValues@flags_internal@absl@@YA_KXZ + ?OnVLogVerbosityUpdate@log_internal@absl@@YAXV?$function@$$A6AXXZ@__Cr@std@@@Z + ?OneTimeInitThreadIdentity@synchronization_internal@absl@@YAXPAUThreadIdentity@base_internal@2@@Z + ?OneWordValue@FlagImpl@flags_internal@absl@@ABEAAU?$atomic@_J@__Cr@std@@XZ + ?OutOfRangeError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ParseAbseilFlagsOnly@absl@@YAXHQAPADAAV?$vector@PADV?$allocator@PAD@__Cr@std@@@__Cr@std@@AAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@34@@Z + ?ParseAbseilFlagsOnlyImpl@flags_internal@absl@@YA?AW4HelpMode@12@HQAPADAAV?$vector@PADV?$allocator@PAD@__Cr@std@@@__Cr@std@@AAV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@56@W4UsageFlagsAction@12@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseCommandLine@absl@@YA?AV?$vector@PADV?$allocator@PAD@__Cr@std@@@__Cr@std@@HQAPAD@Z + ?ParseCommandLineImpl@flags_internal@absl@@YA?AV?$vector@PADV?$allocator@PAD@__Cr@std@@@__Cr@std@@HQAPADW4UsageFlagsAction@12@W4OnUndefinedFlag@12@AAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@45@@Z + ?ParseDigits@str_format_internal@absl@@YAHAADAAPBDQBD@Z + ?ParseDuration@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVDuration@1@@Z + ?ParseFlag@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAVDuration@1@PAV234@@Z + ?ParseFlag@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAVTime@1@PAV234@@Z + ?ParseFrom@CommandLineFlag@absl@@QAE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@45@@Z + ?ParseFrom@FlagImpl@flags_internal@absl@@EAE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4FlagSettingMode@23@W4ValueSource@23@AAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?ParseFrom@PrivateHandleAccessor@flags_internal@absl@@SA_NAAVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4FlagSettingMode@23@W4ValueSource@23@AAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@67@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uhour_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uminute_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Umonth_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParseLenientCivilTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$civil_time@Uyear_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z + ?ParsePosixSpec@cctz@time_internal@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAUPosixTimeZone@123@@Z + ?ParseTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0PAVTime@1@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?ParseTime@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0VTimeZone@1@PAVTime@1@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?PermissionDeniedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Poison@CrcCordState@crc_internal@absl@@QAEXXZ + ?Poke@StdcppWaiter@synchronization_internal@absl@@QAEXXZ + ?Poke@Win32Waiter@synchronization_internal@absl@@QAEXXZ + ?Post@StdcppWaiter@synchronization_internal@absl@@QAEXXZ + ?Post@Win32Waiter@synchronization_internal@absl@@QAEXXZ + ?PrepareForSampling@HashtablezInfo@container_internal@absl@@QAEX_JIIIG@Z + ?PrepareInsertLarge@container_internal@absl@@YAIAAVCommonFields@12@ABUPolicyFunctions@12@IV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@@Z + ?PrepareInsertLargeGenerationsEnabled@container_internal@absl@@YAIAAVCommonFields@12@ABUPolicyFunctions@12@IV?$NonIterableBitMask@G$0BA@$0A@@12@UFindInfo@12@V?$FunctionRef@$$A6AII@Z@2@@Z + ?PrepareInsertSmallNonSoo@container_internal@absl@@YA?AU?$pair@PAW4ctrl_t@container_internal@absl@@PAX@__Cr@std@@AAVCommonFields@12@ABUPolicyFunctions@12@V?$FunctionRef@$$A6AII@Z@2@@Z + ?PrepareToDie@LogMessage@log_internal@absl@@AAEXXZ + ?PrepareToModify@Status@absl@@CAPAVStatusRep@status_internal@2@I@Z + ?Prepend@Cord@absl@@QAEXABV12@@Z + ?Prepend@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ?PrependArray@Cord@absl@@AAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?PrependPrecise@Cord@absl@@AAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4MethodIdentifier@CordzUpdateTracker@cord_internal@2@@Z + ?PrependSlow@CordRepBtree@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z + ?PrependTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToInlined@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependVModule@log_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?PrevTransition@TimeZone@absl@@QBE_NVTime@2@PAUCivilTransition@12@@Z + ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@time_zone@234@@Z + ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@time_zone@234@@Z + ?Print@Streamable@str_format_internal@absl@@QBEAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AAV456@@Z + ?PrintTo@absl@@YAXABVLogEntry@1@PAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ProgramUsageMessage@absl@@YA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?Ptr@GraphCycles@synchronization_internal@absl@@QAEPAXUGraphId@23@@Z + ?PtrStorage@FlagImpl@flags_internal@absl@@ABEAAU?$atomic@VMaskedPointer@flags_internal@absl@@@__Cr@std@@XZ + ?PutPaddedString@FormatSinkImpl@str_format_internal@absl@@QAE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HH_N@Z + ?PutTwoDigits@numbers_internal@absl@@YAXIPAD@Z + ?RawEnableLogPrefix@log_internal@absl@@YAX_N@Z + ?RawLog@raw_log_internal@absl@@YAXW4LogSeverity@2@PBDH1ZZ + ?RawLoggingFullySupported@raw_log_internal@absl@@YA_NXZ + ?RawSetMinLogLevel@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z + ?RawSetStderrThreshold@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z + ?Read@CordRepBtreeNavigator@cord_internal@absl@@QAE?AUReadResult@123@II@Z + ?Read@CordRepBtreeReader@cord_internal@absl@@QAE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@IIAAPAUCordRep@23@@Z + ?Read@FlagImpl@flags_internal@absl@@UBEXPAX@Z + ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AAEHPBD0H@Z + ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEHPBD0H@Z + ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QAEHABUParsedFloat@23@H@Z + ?ReadFloatMantissa@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEHABUParsedFloat@23@H@Z + ?ReadOneBool@FlagImpl@flags_internal@absl@@QBE_NXZ + ?ReadOneWord@FlagImpl@flags_internal@absl@@QBE_JXZ + ?ReadSeedMaterialFromOSEntropy@random_internal@absl@@YA_NV?$Span@I@2@@Z + ?ReadSequenceLockedData@FlagImpl@flags_internal@absl@@ABEXPAX@Z + ?ReaderTryLockSlow@Mutex@absl@@AAE_NXZ + ?Rebuild@CordRepBtree@cord_internal@absl@@CAXPAPAV123@PAV123@_N@Z + ?Rebuild@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@@Z + ?RecordClearedReservationSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@@Z + ?RecordEraseSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@@Z + ?RecordInsertSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@II@Z + ?RecordRehashSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@I@Z + ?RecordReservationSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@I@Z + ?RecordStorageChangedSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@II@Z + ?RefSharedEmptyRep@CrcCordState@crc_internal@absl@@CAPAURefcountedRep@123@XZ + ?Register@CycleClockSource@base_internal@absl@@CAXP6A_JXZ@Z + ?RegisterAbortHook@raw_log_internal@absl@@YAXP6AXPBDH000@Z@Z + ?RegisterAndInitialize@log_internal@absl@@YAHPAVVLogSite@12@@Z + ?RegisterCommandLineFlag@flags_internal@absl@@YA_NAAVCommandLineFlag@2@PBD@Z + ?RegisterCondVarTracer@absl@@YAXP6AXPBDPBX@Z@Z + ?RegisterDebugStackTraceHook@debugging_internal@absl@@YAXP6AXQBQAXHP6AXPBDPAX@Z2@Z@Z + ?RegisterFlag@FlagRegistry@flags_internal@absl@@QAEXAAVCommandLineFlag@3@PBD@Z + ?RegisterInternalLogFunction@raw_log_internal@absl@@YAXP6AXW4LogSeverity@2@PBDHABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z@Z + ?RegisterLivePointers@absl@@YAXPBXI@Z + ?RegisterLogFilterAndPrefixHook@raw_log_internal@absl@@YAXP6A_NW4LogSeverity@2@PBDHPAPADPAH@Z@Z + ?RegisterMutexProfiler@absl@@YAXP6AX_J@Z@Z + ?RegisterMutexTracer@absl@@YAXP6AXPBDPBX_J@Z@Z + ?RegisterSpinLockProfiler@base_internal@absl@@YAXP6AXPBX_J@Z@Z + ?Rehash@container_internal@absl@@YAXAAVCommonFields@12@ABUPolicyFunctions@12@I@Z + ?Release@ReleasableMutexLock@absl@@QAEXXZ + ?Remove@CondVar@absl@@AAEXPAUPerThreadSynch@base_internal@2@@Z + ?RemoveCrc32cPrefix@absl@@YA?AVcrc32c_t@1@V21@0I@Z + ?RemoveCrc32cSuffix@absl@@YA?AVcrc32c_t@1@V21@0I@Z + ?RemoveEdge@GraphCycles@synchronization_internal@absl@@QAEXUGraphId@23@0@Z + ?RemoveExtraAsciiWhitespace@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?RemoveLogSink@log_internal@absl@@YAXPAVLogSink@2@@Z + ?RemoveNode@GraphCycles@synchronization_internal@absl@@QAEXPAX@Z + ?RemovePrefix@Cord@absl@@QAEXI@Z + ?RemoveSuffix@Cord@absl@@QAEXI@Z + ?RemoveSuffix@CordRepBtree@cord_internal@absl@@SAPAUCordRep@23@PAV123@I@Z + ?ReportUnrecognizedFlags@absl@@YAXABV?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@@Z + ?ReportUsageError@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_N@Z + ?ReserveEmptyNonAllocatedTableToFitBucketCount@container_internal@absl@@YAXAAVCommonFields@12@ABUPolicyFunctions@12@I@Z + ?ReserveTableToFitNewSize@container_internal@absl@@YAXAAVCommonFields@12@ABUPolicyFunctions@12@I@Z + ?ResetToBuiltinUTC@TimeZoneInfo@cctz@time_internal@absl@@AAE_NABV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z + ?ResizeAllocatedTableWithSeedChange@container_internal@absl@@YAXAAVCommonFields@12@ABUPolicyFunctions@12@I@Z + ?ResourceExhaustedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Restore@FlagState@flags_internal@absl@@EHAEXXZ + ?RestoreState@FlagImpl@flags_internal@absl@@AAE_NABVFlagState@23@@Z + ?Retire@flags_internal@absl@@YAXPBDPBXPAE@Z + ?ReverseConsume@cord_internal@absl@@YAXPAUCordRep@12@V?$FunctionRef@$$A6AXPAUCordRep@cord_internal@absl@@II@Z@2@@Z + ?SafeToDelete@CordzHandle@cord_internal@absl@@QBE_NXZ + ?SampleSlow@container_internal@absl@@YAPAUHashtablezInfo@12@AAUSamplingState@12@IIIG@Z + ?SaveFromRegistry@FlagSaverImpl@flags_internal@absl@@QAEXXZ + ?SaveState@FlagImpl@flags_internal@absl@@EAE?AV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?SaveState@PrivateHandleAccessor@flags_internal@absl@@SA?AV?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@AAVCommandLineFlag@3@@Z + ?Scramble@CRC32@crc_internal@absl@@UBEXPAI@Z + ?Seek@CordRepBtreeReader@cord_internal@absl@@QAE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z + ?SendToLog@LogMessage@log_internal@absl@@AAEXXZ + ?Set@MaskedPointer@flags_internal@absl@@QAEXP6APAXW4FlagOp@23@PBXPAX2@Z1_N@Z + ?SetAndroidNativeTag@absl@@YAXPBD@Z + ?SetCallback@FlagImpl@flags_internal@absl@@QAEXQ6AXXZ@Z + ?SetCordBtreeExhaustiveValidation@cord_internal@absl@@YAX_N@Z + ?SetCrcCordState@Cord@absl@@AAEXVCrcCordState@crc_internal@2@@Z + ?SetCurrentThreadIdentity@base_internal@absl@@YAXPAUThreadIdentity@12@P6AXPAX@Z@Z + ?SetExitOnDFatal@log_internal@absl@@YAX_N@Z + ?SetExpectedChecksum@Cord@absl@@QAEXI@Z + ?SetFailQuietly@LogMessage@log_internal@absl@@IAEXXZ + ?SetFlagsHelpFormat@flags_internal@absl@@YAXW4HelpFormat@12@@Z + ?SetFlagsHelpMatchSubstr@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetFlagsHelpMode@flags_internal@absl@@YAXW4HelpMode@12@@Z + ?SetFlagsUsageConfig@absl@@YAXUFlagsUsageConfig@1@@Z + ?SetHashtablezConfigListener@container_internal@absl@@YAXP6AXXZ@Z + ?SetHashtablezEnabled@container_internal@absl@@YAX_N@Z + ?SetHashtablezEnabledInternal@container_internal@absl@@YAX_N@Z + ?SetHashtablezMaxSamples@container_internal@absl@@YAXI@Z + ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAXI@Z + ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z + ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z + ?SetInitialized@log_internal@absl@@YAXXZ + ?SetLogBacktraceLocation@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?SetLoggingGlobalsListener@log_internal@absl@@YAXP6AXXZ@Z + ?SetMaxFramesInLogStackTrace@log_internal@absl@@YAXH@Z + ?SetMinLogLevel@absl@@YAXW4LogSeverityAtLeast@1@@Z + ?SetMutexDeadlockDetectionMode@absl@@YAXW4OnDeadlockCycle@1@@Z + ?SetPayload@StatusRep@status_internal@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@VCord@3@@Z + ?SetProgramInvocationName@flags_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetProgramUsageMessage@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?SetStackUnwinder@absl@@YAXP6AHPAPAXPAHHHPBX1@Z@Z + ?SetStatusPayloadPrinter@status_internal@absl@@YAXP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@ABVCord@2@@Z@Z + ?SetStderrThreshold@absl@@YAXW4LogSeverityAtLeast@1@@Z + ?SetSuppressSigabortTrace@log_internal@absl@@YA_N_N@Z + ?SetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAXPAU?$atomic@H@__Cr@std@@@Z + ?SetTimeZone@log_internal@absl@@YAXVTimeZone@2@@Z + ?SetToZero@?$BigUnsigned@$03@strings_internal@absl@@QAEXXZ + ?SetToZero@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEXXZ + ?SetVModuleListHeadForTestOnly@log_internal@absl@@YAPAVVLogSite@12@PAV312@@Z + ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QAEXH@Z + ?ShiftLeft@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEXH@Z + ?ShortProgramInvocationName@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ShouldFixUpStack@internal_stacktrace@absl@@YA_NXZ + ?ShouldLog@LogEveryNSecState@log_internal@absl@@QAE_NN@Z + ?ShouldLog@LogEveryNState@log_internal@absl@@QAE_NH@Z + ?ShouldLog@LogEveryPow2State@log_internal@absl@@QAE_NXZ + ?ShouldLog@LogFirstNState@log_internal@absl@@QAE_NH@Z + ?ShouldLogBacktraceAt@log_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@Z + ?ShouldPrependLogPrefix@absl@@YA_NXZ + ?ShouldSymbolizeLogStackTrace@log_internal@absl@@YA_NXZ + ?SigSafeArena@base_internal@absl@@YAPAUArena@LowLevelAlloc@12@XZ + ?Signal@CondVar@absl@@QAEXXZ + ?SignalAll@CondVar@absl@@QAEXXZ + ?SimpleAtob@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_N@Z + ?SimpleAtod@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAN@Z + ?SimpleAtof@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAM@Z + ?SixDigitsToBuffer@numbers_internal@absl@@YAINPAD@Z + ?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SAIXZ + ?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SAIXZ + ?Skip@CordRepBtreeNavigator@cord_internal@absl@@QAE?AUPosition@123@I@Z + ?SlowIsEnabled0@VLogSite@log_internal@absl@@AAE_NH@Z + ?SlowIsEnabled1@VLogSite@log_internal@absl@@AAE_NH@Z + ?SlowIsEnabled2@VLogSite@log_internal@absl@@AAE_NH@Z + ?SlowIsEnabled3@VLogSite@log_internal@absl@@AAE_NH@Z + ?SlowIsEnabled4@VLogSite@log_internal@absl@@AAE_NH@Z + ?SlowIsEnabled5@VLogSite@log_internal@absl@@AAE_NH@Z + ?SlowIsEnabled@VLogSite@log_internal@absl@@AAE_NHH@Z + ?SlowLock@SpinLock@base_internal@absl@@AAEXXZ + ?SlowUnlock@SpinLock@base_internal@absl@@AAEXI@Z + ?SnprintF@str_format_internal@absl@@YAHPADIVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?SpinLockSuggestedDelayNS@base_internal@absl@@YAHH@Z + ?SpinLockWait@base_internal@absl@@YAIPAU?$atomic@I@__Cr@std@@HQBUSpinLockWaitTransition@12@W4SchedulingMode@12@@Z + ?SpinLoop@SpinLock@base_internal@absl@@AAEIXZ + ?StackTraceWorksForTest@debugging_internal@absl@@YA_NXZ + ?StartsWithIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StatusCodeToString@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusCode@1@@Z + ?StatusMessageAsCStr@absl@@YAPBDABVStatus@1@@Z + ?StderrThreshold@absl@@YA?AW4LogSeverityAtLeast@1@XZ + ?SteadyClockNow@KernelTimeout@synchronization_internal@absl@@CA_JXZ + ?StoreValue@FlagImpl@flags_internal@absl@@AAEXPBXW4ValueSource@23@@Z + ?StrAppend@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@1@111@Z + ?StrAppend@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@1@11@Z + ?StrAppend@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@1@1@Z + ?StrAppend@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@1@@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@1@000@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@1@00@Z + ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABVAlphaNum@1@0@Z + ?StrContainsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@0@Z + ?StrContainsIgnoreCase@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@D@Z + ?StrError@base_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?StrReplaceAll@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@4@@Z + ?StrReplaceAll@absl@@YAHV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@3@@Z + ?SubTree@CordRepBtree@cord_internal@absl@@QAEPAUCordRep@23@II@Z + ?Subcord@Cord@absl@@QBE?AV12@II@Z + ?SubstituteAndAppendArray@substitute_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@45@PBV645@I@Z + ?Summarize@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z + ?SupportsArmCRC32PMULL@crc_internal@absl@@YA_NXZ + ?SuppressSigabortTrace@log_internal@absl@@YA_NXZ + ?Symbolize@absl@@YA_NPBXPADH@Z + ?TestOnlyAddNodes@GraphCycles@synchronization_internal@absl@@QAEXI@Z + ?TestOnlyRefreshSamplingStateForCurrentThread@container_internal@absl@@YAXXZ + ?ThreadIsLoggingToLogSink@log_internal@absl@@YA_NXZ + ?ThrowBadStatusOrAccess@internal_statusor@absl@@YAXVStatus@2@@Z + ?ThrowSeedGenException@random_internal@absl@@YAXXZ + ?ThrowStdBadAlloc@base_internal@absl@@YAXXZ + ?ThrowStdBadFunctionCall@base_internal@absl@@YAXXZ + ?ThrowStdDomainError@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdDomainError@base_internal@absl@@YAXPBD@Z + ?ThrowStdInvalidArgument@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdInvalidArgument@base_internal@absl@@YAXPBD@Z + ?ThrowStdLengthError@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdLengthError@base_internal@absl@@YAXPBD@Z + ?ThrowStdLogicError@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdLogicError@base_internal@absl@@YAXPBD@Z + ?ThrowStdOutOfRange@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdOutOfRange@base_internal@absl@@YAXPBD@Z + ?ThrowStdOverflowError@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdOverflowError@base_internal@absl@@YAXPBD@Z + ?ThrowStdRangeError@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdRangeError@base_internal@absl@@YAXPBD@Z + ?ThrowStdRuntimeError@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdRuntimeError@base_internal@absl@@YAXPBD@Z + ?ThrowStdUnderflowError@base_internal@absl@@YAXABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z + ?ThrowStdUnderflowError@base_internal@absl@@YAXPBD@Z + ?Tick@PerThreadSem@synchronization_internal@absl@@SAXPAUThreadIdentity@base_internal@3@@Z + ?TimeFromTimespec@absl@@YA?AVTime@1@Utimespec@@@Z + ?TimeFromTimeval@absl@@YA?AVTime@1@Utimeval@@@Z + ?TimeLocal@TimeZoneInfo@cctz@time_internal@absl@@ABE?AUcivil_lookup@time_zone@234@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@_J@Z + ?TimeZone@log_internal@absl@@YAPBV02@XZ + ?ToChronoDuration@KernelTimeout@synchronization_internal@absl@@QBE?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@XZ + ?ToChronoHours@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMicroseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMilliseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0DOI@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoMinutes@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoNanoseconds@absl@@YA?AV?$duration@_JV?$ratio@$00$0DLJKMKAA@@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoSeconds@absl@@YA?AV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@VDuration@1@@Z + ?ToChronoTime@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@VTime@1@@Z + ?ToChronoTimePoint@KernelTimeout@synchronization_internal@absl@@QBE?AV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__Cr@std@@@234@@chrono@__Cr@std@@XZ + ?ToDoubleHours@absl@@YANVDuration@1@@Z + ?ToDoubleMicroseconds@absl@@YANVDuration@1@@Z + ?ToDoubleMilliseconds@absl@@YANVDuration@1@@Z + ?ToDoubleMinutes@absl@@YANVDuration@1@@Z + ?ToDoubleNanoseconds@absl@@YANVDuration@1@@Z + ?ToDoubleSeconds@absl@@YANVDuration@1@@Z + ?ToSinkAlso@LogMessage@log_internal@absl@@QAEAAV123@PAVLogSink@3@@Z + ?ToSinkOnly@LogMessage@log_internal@absl@@QAEAAV123@PAVLogSink@3@@Z + ?ToString@?$BigUnsigned@$03@strings_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@?$BigUnsigned@$0FE@@strings_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@Status@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusToStringMode@2@@Z + ?ToString@StatusRep@status_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@W4StatusToStringMode@3@@Z + ?ToString@int128@absl@@ABE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToString@uint128@absl@@ABE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?ToStringSlow@Status@absl@@CA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@IW4StatusToStringMode@2@@Z + ?ToTM@absl@@YA?AUtm@@VTime@1@VTimeZone@1@@Z + ?ToTimeT@absl@@YA_JVTime@1@@Z + ?ToTimespec@absl@@YA?AUtimespec@@VDuration@1@@Z + ?ToTimespec@absl@@YA?AUtimespec@@VTime@1@@Z + ?ToTimeval@absl@@YA?AUtimeval@@VDuration@1@@Z + ?ToTimeval@absl@@YA?AUtimeval@@VTime@1@@Z + ?ToUDate@absl@@YANVTime@1@@Z + ?ToUniversal@absl@@YA_JVTime@1@@Z + ?ToUnixMicros@absl@@YA_JVTime@1@@Z + ?ToUnixMillis@absl@@YA_JVTime@1@@Z + ?ToUnixNanos@absl@@YA_JVTime@1@@Z + ?ToUnixSeconds@absl@@YA_JVTime@1@@Z + ?Track@CordzInfo@cord_internal@absl@@AAEXXZ + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAAVInlineData@23@ABV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAAVInlineData@23@W4MethodIdentifier@CordzUpdateTracker@23@_J@Z + ?Trans@Mutex@absl@@AAEXPBUMuHowS@2@@Z + ?Trunc@absl@@YA?AVDuration@1@V21@0@Z + ?TryLockSlow@Mutex@absl@@AAE_NXZ + ?TryNewCRC32AcceleratedX86ARMCombined@crc_internal@absl@@YAPAVCRCImpl@12@XZ + ?TryParse@FlagImpl@flags_internal@absl@@ABE?AV?$unique_ptr@XUDynValueDeleter@flags_internal@absl@@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@56@AAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@56@@Z + ?TryRead@SequenceLock@flags_internal@absl@@QBE_NPAXPBU?$atomic@_K@__Cr@std@@I@Z + ?TryRemove@Mutex@absl@@AAEXPAUPerThreadSynch@base_internal@2@@Z + ?TypeId@FlagImpl@flags_internal@absl@@EBEPBXXZ + ?TypeId@PrivateHandleAccessor@flags_internal@absl@@SAPBXABVCommandLineFlag@3@@Z + ?TypeName@CommandLineFlag@absl@@EBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?TypeName@FlagImpl@flags_internal@absl@@EBE?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?TypeName@PrivateHandleAccessor@flags_internal@absl@@SA?AV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABVCommandLineFlag@3@@Z + ?UTC@Impl@time_zone@cctz@time_internal@absl@@SA?AV2345@XZ + ?UTC@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?UTC@TimeZoneInfo@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@XZ + ?UTCImpl@Impl@time_zone@cctz@time_internal@absl@@CAPBV12345@XZ + ?UnRegisterLivePointers@absl@@YAXPBXI@Z + ?UnauthenticatedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnavailableError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnextendByZeroes@CRC32@crc_internal@absl@@UBEXPAII@Z + ?UnextendCrc32cByZeroes@crc_internal@absl@@YA?AVcrc32c_t@2@V32@I@Z + ?UnimplementedError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?UnknownError@absl@@YA?AVStatus@1@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Unlock@CordzInfo@cord_internal@absl@@QAEXXZ + ?UnlockSlow@Mutex@absl@@AAEXPAUSynchWaitParams@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@F@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@G@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@H@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@I@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@J@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@K@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@M@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@N@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@Vint128@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@Vuint128@2@@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_J@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_K@Z + ?Unparse@flags_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@_N@Z + ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VDuration@1@@Z + ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@VTime@1@@Z + ?Unref@StatusRep@status_internal@absl@@QBEXXZ + ?UnrefTree@InlineRep@Cord@absl@@AAEXXZ + ?UnsampleSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@@Z + ?Unscramble@CRC32@crc_internal@absl@@UBEXPAI@Z + ?Untrack@CordzInfo@cord_internal@absl@@QAEXXZ + ?UpdateGlobalVLogLevel@log_internal@absl@@YAHH@Z + ?UpdateStackTrace@GraphCycles@synchronization_internal@absl@@QAEXUGraphId@23@HP6AHPAPAXH@Z@Z + ?UpdateVLogSites@log_internal@absl@@YAXXZ + ?UpdateVModule@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Utf8SafeCEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?Utf8SafeCHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?VLogLevel@log_internal@absl@@YAHV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ValidateInputValue@FlagImpl@flags_internal@absl@@EBE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?ValidateInputValue@PrivateHandleAccessor@flags_internal@absl@@SA_NABVCommandLineFlag@3@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Version@TimeZoneInfo@cctz@time_internal@absl@@UBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@TimeZoneLibC@cctz@time_internal@absl@@UBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Version@ZoneInfoSource@cctz@time_internal@absl@@UBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?Wait@BlockingCounter@absl@@QAEXXZ + ?Wait@StdcppWaiter@synchronization_internal@absl@@QAE_NVKernelTimeout@23@@Z + ?Wait@Win32Waiter@synchronization_internal@absl@@QAE_NVKernelTimeout@23@@Z + ?WaitCommon@CondVar@absl@@AAE_NPAVMutex@2@VKernelTimeout@synchronization_internal@2@@Z + ?WaitForNotification@Notification@absl@@QBEXXZ + ?WaitForNotificationWithDeadline@Notification@absl@@QBE_NVTime@2@@Z + ?WaitForNotificationWithTimeout@Notification@absl@@QBE_NVDuration@2@@Z + ?Wakeup@Mutex@absl@@AAEPAUPerThreadSynch@base_internal@2@PAU342@@Z + ?WasPresentOnCommandLine@flags_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?WebSafeBase64Escape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@34@@Z + ?WebSafeBase64Escape@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?WebSafeBase64Unescape@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@34@@Z + ?WideToUtf8@strings_internal@absl@@YAI_WPADAAUShiftState@12@@Z + ?WithMetadataFrom@LogMessage@log_internal@absl@@QAEAAV123@ABVLogEntry@3@@Z + ?WithPerror@LogMessage@log_internal@absl@@QAEAAV123@XZ + ?WithThreadID@LogMessage@log_internal@absl@@QAEAAV123@I@Z + ?WithTimestamp@LogMessage@log_internal@absl@@QAEAAV123@VTime@3@@Z + ?WithVerbosity@LogMessage@log_internal@absl@@QAEAAV123@H@Z + ?Write@BufferRawSink@str_format_internal@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@FILERawSink@str_format_internal@absl@@QAEXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z + ?Write@FlagImpl@flags_internal@absl@@QAEXPBX@Z + ?WriteToStderr@log_internal@absl@@YAXV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@W4LogSeverity@2@@Z + ?__add_back_capacity@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXXZ + ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z + ?__add_back_capacity@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXXZ + ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z + ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXI@Z + ?__erase_to_end@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@23@@Z + ?__throw_length_error@?$vector@PAVCommandLineFlag@absl@@V?$allocator@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PAVLogSink@absl@@V?$allocator@PAVLogSink@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PBVCommandLineFlag@absl@@V?$allocator@PBVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@CAXXZ + ?__throw_length_error@?$vector@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@V?$allocator@V?$unique_ptr@VFlagStateInterface@flags_internal@absl@@U?$default_delete@VFlagStateInterface@flags_internal@absl@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@CAXXZ + ?combine_contiguous@MixingHashState@hash_internal@absl@@SA?AV123@V123@PBEI@Z + ?cycle_clock_source_@CycleClock@base_internal@absl@@0U?$atomic@P6A_JXZ@__Cr@std@@A + ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z + ?description@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?effective_impl@time_zone@cctz@time_internal@absl@@ABEABVImpl@1234@XZ + ?engines@?1??CrcAndCopy@CrcMemcpy@crc_internal@absl@@SA?AVcrc32c_t@4@PIAXPIBXIV54@_N@Z@4UArchSpecificEngines@234@B + ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@ABV?$duration@_JV?$ratio@$00$00@__Cr@std@@@chrono@__Cr@std@@@Z + ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABV567@ABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@ABV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@967@ABVtime_zone@234@@Z + ?from_chars@absl@@YA?AUfrom_chars_result@1@PBD0AAMW4chars_format@1@@Z + ?from_chars@absl@@YA?AUfrom_chars_result@1@PBD0AANW4chars_format@1@@Z + ?get_cordz_mean_interval@cord_internal@absl@@YAHXZ + ?get_weekday@detail@cctz@time_internal@absl@@YA?AW4weekday@1234@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@@Z + ?kDefaultIterControl@container_internal@absl@@3W4ctrl_t@12@A + ?load_time_zone@cctz@time_internal@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PAVtime_zone@123@@Z + ?local_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?lock@Mutex@absl@@QAEXXZ + ?lock_shared@Mutex@absl@@QAEXXZ + ?lookup@time_zone@cctz@time_internal@absl@@QBE?AUabsolute_lookup@1234@ABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@@Z + ?lookup@time_zone@cctz@time_internal@absl@@QBE?AUcivil_lookup@1234@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z + ?memcasecmp@strings_internal@absl@@YAHPBD0I@Z + ?mutable_rep@CrcCordState@crc_internal@absl@@QAEPAURep@123@XZ + ?n_day@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_JC00CCC@Z + ?n_sec@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J00000@Z + ?name@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?next_transition@time_zone@cctz@time_internal@absl@@QBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@1234@@Z + ?next_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z + ?overflow@Streambuf@OStringStream@strings_internal@absl@@MAEHH@Z + ?parse@detail@cctz@time_internal@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@0ABVtime_zone@234@PAV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@67@PAV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__Cr@std@@@chrono@67@PAV567@@Z + ?prev_transition@time_zone@cctz@time_internal@absl@@QBE_NABV?$time_point@Vsystem_clock@chrono@__Cr@std@@V?$duration@_JV?$ratio@$00$00@__Cr@std@@@234@@chrono@__Cr@std@@PAUcivil_transition@1234@@Z + ?reserve@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXI@Z + ?reserve@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXI@Z + ?reserve@?$vector@UUnrecognizedFlag@absl@@V?$allocator@UUnrecognizedFlag@absl@@@__Cr@std@@@__Cr@std@@QAEXI@Z + ?resize@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXI@Z + ?resize@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXI@Z + ?safe_strto128_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVint128@2@H@Z + ?safe_strto16_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAFH@Z + ?safe_strto32_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAHH@Z + ?safe_strto64_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_JH@Z + ?safe_strto8_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PACH@Z + ?safe_strtou128_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVuint128@2@H@Z + ?safe_strtou16_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAGH@Z + ?safe_strtou32_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAIH@Z + ?safe_strtou64_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PA_KH@Z + ?safe_strtou8_base@numbers_internal@absl@@YA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAEH@Z + ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z + ?shallow_subcords_enabled@cord_internal@absl@@3U?$atomic@_N@__Cr@std@@A + ?should_rehash_for_bug_detection_on_insert@CommonFieldsGenerationInfoEnabled@container_internal@absl@@QBE_NI@Z + ?should_rehash_for_bug_detection_on_move@CommonFieldsGenerationInfoEnabled@container_internal@absl@@QBE_NI@Z + ?shrink_to_fit@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXXZ + ?size@?$BigUnsigned@$03@strings_internal@absl@@QBEHXZ + ?size@?$BigUnsigned@$0FE@@strings_internal@absl@@QBEHXZ + ?size@Cord@absl@@QBEIXZ + ?status@BadStatusOrAccess@absl@@QBEABVStatus@2@XZ + ?stream@OstreamView@LogMessage@log_internal@absl@@QAEAAV?$basic_ostream@DU?$char_traits@D@__Cr@std@@@__Cr@std@@XZ + ?transfer_unprobed_elements_to_next_capacity_fn@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@CAXAAVCommonFields@23@PBW4ctrl_t@23@PAX2P6AX2EII@Z@Z + ?try_lock@Mutex@absl@@QAE_NXZ + ?try_lock_shared@Mutex@absl@@QAE_NXZ + ?unlock@Mutex@absl@@QAEXXZ + ?unlock_shared@Mutex@absl@@QAEXXZ + ?utc_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ + ?version@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ + ?what@BadStatusOrAccess@absl@@UBEPBDXZ + ?what@SeedGenException@absl@@UBEPBDXZ + ?words@?$BigUnsigned@$03@strings_internal@absl@@QBEPBIXZ + ?words@?$BigUnsigned@$0FE@@strings_internal@absl@@QBEPBIXZ + ?xsputn@Streambuf@OStringStream@strings_internal@absl@@MAEHPBDH@Z + AbslContainerInternalSampleEverything + AbslInternalMutexYield + AbslInternalOnFatalLogMessage + AbslInternalPerThreadSemInit + AbslInternalPerThreadSemPoke + AbslInternalPerThreadSemPost + AbslInternalPerThreadSemWait + AbslInternalReportFatalUsageError + AbslInternalSleepFor + AbslInternalSpinLockDelay + AbslInternalSpinLockWake + AbslInternalTraceContinue + AbslInternalTraceObserved + AbslInternalTraceSignal + AbslInternalTraceWait diff --git a/naiveproxy/src/third_party/ashmem/BUILD.gn b/naiveproxy/src/third_party/ashmem/BUILD.gn deleted file mode 100644 index 4297b0dcd2..0000000000 --- a/naiveproxy/src/third_party/ashmem/BUILD.gn +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright 2014 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -assert(is_android) - -source_set("ashmem") { - sources = [ - "ashmem-dev.c", - "ashmem.h", - ] - - configs -= [ "//build/config/android:default_orderfile_instrumentation" ] -} diff --git a/naiveproxy/src/third_party/ashmem/DIR_METADATA b/naiveproxy/src/third_party/ashmem/DIR_METADATA deleted file mode 100644 index 744e51f4bb..0000000000 --- a/naiveproxy/src/third_party/ashmem/DIR_METADATA +++ /dev/null @@ -1,6 +0,0 @@ -monorail: { - component: "Internals>Core" -} -buganizer_public: { - component_id: 1456128 -} diff --git a/naiveproxy/src/third_party/ashmem/LICENSE b/naiveproxy/src/third_party/ashmem/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/naiveproxy/src/third_party/ashmem/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/naiveproxy/src/third_party/ashmem/OWNERS b/naiveproxy/src/third_party/ashmem/OWNERS deleted file mode 100644 index 3301555a7b..0000000000 --- a/naiveproxy/src/third_party/ashmem/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -lizeb@chromium.org -pasko@chromium.org diff --git a/naiveproxy/src/third_party/ashmem/README.chromium b/naiveproxy/src/third_party/ashmem/README.chromium deleted file mode 100644 index cdd96a1720..0000000000 --- a/naiveproxy/src/third_party/ashmem/README.chromium +++ /dev/null @@ -1,25 +0,0 @@ -Name: Android -URL: http://source.android.com -Description: Android shared memory implementation. Only applies to OS_ANDROID. -Version: 7203eb2a8a29a7b721a48cd291700f38f3da1456 -Update Mechanism: Manual -Security Critical: yes -Shipped: yes -License: Apache-2.0 -License File: LICENSE -Patches: - 0001-Add-ashmem-get-prot-region.path: - Add ashmem_get_prot_region() declaration and implementation to return - the current protection mask of a given Ashmem region. - 0002-Use-AShareMemory-functions-when-possible.patch: - Use ASharedMemory_xxx() functions from libandroid.so when possible - in order to prepare for future devices without ashmem support. - 0003-Pthread-once-for-funcs-init.patch: - Fix the data race that was introduced in the previous patch by using - pthread_once() for function pointers initialization. - 0004-Fixup-ashmem_get_prot_region-for-memfd.patch: - mmap with MAP_PRIVATE is meant to succeed even on write-protected - memfd's as it will just copy-on-write. - 0005-Fix-ashmem-availability-check.patch: - Use builtin_available instead of a weak reference as weak references - seem to still trigger SDK level checks in new NDK (r28). diff --git a/naiveproxy/src/third_party/ashmem/patches/0001-Add-ashmem-get-prot-region.patch b/naiveproxy/src/third_party/ashmem/patches/0001-Add-ashmem-get-prot-region.patch deleted file mode 100644 index 5bba42dce2..0000000000 --- a/naiveproxy/src/third_party/ashmem/patches/0001-Add-ashmem-get-prot-region.patch +++ /dev/null @@ -1,28 +0,0 @@ -diff --git a/third_party/ashmem/ashmem-dev.c b/third_party/ashmem/ashmem-dev.c -index 2303369d8167..52b3f47eeae0 100644 ---- a/third_party/ashmem/ashmem-dev.c -+++ b/third_party/ashmem/ashmem-dev.c -@@ -72,6 +72,11 @@ int ashmem_set_prot_region(int fd, int prot) - return ioctl(fd, ASHMEM_SET_PROT_MASK, prot); - } - -+int ashmem_get_prot_region(int fd) -+{ -+ return ioctl(fd, ASHMEM_GET_PROT_MASK); -+} -+ - int ashmem_pin_region(int fd, size_t offset, size_t len) - { - struct ashmem_pin pin = { offset, len }; -diff --git a/third_party/ashmem/ashmem.h b/third_party/ashmem/ashmem.h -index 7d411cc064ba..d8afccbd2a6e 100644 ---- a/third_party/ashmem/ashmem.h -+++ b/third_party/ashmem/ashmem.h -@@ -18,6 +18,7 @@ extern "C" { - - int ashmem_create_region(const char *name, size_t size); - int ashmem_set_prot_region(int fd, int prot); -+int ashmem_get_prot_region(int fd); - int ashmem_pin_region(int fd, size_t offset, size_t len); - int ashmem_unpin_region(int fd, size_t offset, size_t len); - int ashmem_get_size_region(int fd); diff --git a/naiveproxy/src/third_party/ashmem/patches/0002-Use-ASharedMemory-functions-when-possible.patch b/naiveproxy/src/third_party/ashmem/patches/0002-Use-ASharedMemory-functions-when-possible.patch deleted file mode 100644 index d958065915..0000000000 --- a/naiveproxy/src/third_party/ashmem/patches/0002-Use-ASharedMemory-functions-when-possible.patch +++ /dev/null @@ -1,332 +0,0 @@ -diff --git a/third_party/ashmem/ashmem-dev.c b/third_party/ashmem/ashmem-dev.c -index 52b3f47eeae0..25a33cdcd0c8 100644 ---- a/third_party/ashmem/ashmem-dev.c -+++ b/third_party/ashmem/ashmem-dev.c -@@ -14,23 +14,115 @@ - * limitations under the License. - */ - --/* -- * Implementation of the user-space ashmem API for devices, which have our -- * ashmem-enabled kernel. See ashmem-sim.c for the "fake" tmp-based version, -- * used by the simulator. -- */ -+#include "ashmem.h" - -+#include -+#include - #include -+#include - #include -+#include - #include - #include - #include -+#include /* for fdstat() */ - #include - - #include --#include "ashmem.h" -+#include - --#define ASHMEM_DEVICE "/dev/ashmem" -+#define ASHMEM_DEVICE "/dev/ashmem" -+ -+/* Technical note regarding reading system properties. -+ * -+ * Try to use the new __system_property_read_callback API that appeared in -+ * Android O / API level 26 when available. Otherwise use the deprecated -+ * __system_property_get function. -+ * -+ * For more technical details from an NDK maintainer, see: -+ * https://bugs.chromium.org/p/chromium/issues/detail?id=392191#c17 -+ */ -+ -+/* Weak symbol import */ -+void __system_property_read_callback( -+ const prop_info* info, -+ void (*callback)( -+ void* cookie, const char* name, const char* value, uint32_t serial), -+ void* cookie) __attribute__((weak)); -+ -+/* Callback used with __system_property_read_callback. */ -+static void prop_read_int(void* cookie, -+ const char* name, -+ const char* value, -+ uint32_t serial) { -+ *(int *)cookie = atoi(value); -+ (void)name; -+ (void)serial; -+} -+ -+static int system_property_get_int(const char* name) { -+ int result = 0; -+ if (__system_property_read_callback) { -+ const prop_info* info = __system_property_find(name); -+ if (info) -+ __system_property_read_callback(info, &prop_read_int, &result); -+ } else { -+ char value[PROP_VALUE_MAX] = {}; -+ if (__system_property_get(name, value) >= 1) -+ result = atoi(value); -+ } -+ return result; -+} -+ -+static int device_api_level() { -+ static int s_api_level = -1; -+ if (s_api_level < 0) -+ s_api_level = system_property_get_int("ro.build.version.sdk"); -+ return s_api_level; -+} -+ -+typedef enum { -+ ASHMEM_STATUS_INIT, -+ ASHMEM_STATUS_NOT_SUPPORTED, -+ ASHMEM_STATUS_SUPPORTED, -+} AshmemStatus; -+ -+static AshmemStatus s_ashmem_status = ASHMEM_STATUS_INIT; -+static dev_t s_ashmem_dev; -+ -+/* Return the dev_t of a given file path, or 0 if not available, */ -+static dev_t ashmem_find_dev(const char* path) { -+ struct stat st; -+ dev_t result = 0; -+ if (stat(path, &st) == 0 && S_ISCHR(st.st_mode)) -+ result = st.st_dev; -+ return result; -+} -+ -+static AshmemStatus ashmem_get_status(void) { -+ /* NOTE: No need to make this thread-safe, assuming that -+ * all threads will find the same value. */ -+ if (s_ashmem_status != ASHMEM_STATUS_INIT) -+ return s_ashmem_status; -+ -+ s_ashmem_dev = ashmem_find_dev(ASHMEM_DEVICE); -+ s_ashmem_status = (s_ashmem_dev == 0) ? ASHMEM_STATUS_NOT_SUPPORTED -+ : ASHMEM_STATUS_SUPPORTED; -+ return s_ashmem_status; -+} -+ -+/* Returns true iff the ashmem device ioctl should be used for a given fd. -+ * NOTE: Try not to use fstat() when possible to avoid performance issues. */ -+static int ashmem_dev_fd_check(int fd) { -+ if (device_api_level() <= __ANDROID_API_O_MR1__) -+ return 1; -+ if (ashmem_get_status() == ASHMEM_STATUS_SUPPORTED) { -+ struct stat st; -+ return (fstat(fd, &st) == 0 && S_ISCHR(st.st_mode) && -+ st.st_dev != 0 && st.st_dev == s_ashmem_dev); -+ } -+ return 0; -+} - - /* - * ashmem_create_region - creates a new ashmem region and returns the file -@@ -39,67 +131,133 @@ - * `name' is an optional label to give the region (visible in /proc/pid/maps) - * `size' is the size of the region, in page-aligned bytes - */ --int ashmem_create_region(const char *name, size_t size) --{ -- int fd, ret; -+static int ashmem_dev_create_region(const char *name, size_t size) { -+ int fd = open(ASHMEM_DEVICE, O_RDWR); -+ if (fd < 0) -+ return fd; - -- fd = open(ASHMEM_DEVICE, O_RDWR); -- if (fd < 0) -- return fd; -+ int ret; -+ if (name) { -+ char buf[ASHMEM_NAME_LEN]; -+ strlcpy(buf, name, sizeof(buf)); -+ ret = ioctl(fd, ASHMEM_SET_NAME, buf); -+ if (ret < 0) -+ goto error; -+ } -+ ret = ioctl(fd, ASHMEM_SET_SIZE, size); -+ if (ret < 0) -+ goto error; - -- if (name) { -- char buf[ASHMEM_NAME_LEN]; -+ return fd; - -- strlcpy(buf, name, sizeof(buf)); -- ret = ioctl(fd, ASHMEM_SET_NAME, buf); -- if (ret < 0) -- goto error; -- } -+error: -+ close(fd); -+ return ret; -+} - -- ret = ioctl(fd, ASHMEM_SET_SIZE, size); -- if (ret < 0) -- goto error; -+static int ashmem_dev_set_prot_region(int fd, int prot) { -+ return ioctl(fd, ASHMEM_SET_PROT_MASK, prot); -+} - -- return fd; -+static int ashmem_dev_get_prot_region(int fd) { -+ return ioctl(fd, ASHMEM_GET_PROT_MASK); -+} - --error: -- close(fd); -- return ret; -+static int ashmem_dev_pin_region(int fd, size_t offset, size_t len) { -+ struct ashmem_pin pin = { offset, len }; -+ return ioctl(fd, ASHMEM_PIN, &pin); - } - --int ashmem_set_prot_region(int fd, int prot) --{ -- return ioctl(fd, ASHMEM_SET_PROT_MASK, prot); -+static int ashmem_dev_unpin_region(int fd, size_t offset, size_t len) { -+ struct ashmem_pin pin = { offset, len }; -+ return ioctl(fd, ASHMEM_UNPIN, &pin); - } - --int ashmem_get_prot_region(int fd) --{ -- return ioctl(fd, ASHMEM_GET_PROT_MASK); -+static size_t ashmem_dev_get_size_region(int fd) { -+ return ioctl(fd, ASHMEM_GET_SIZE, NULL); - } - --int ashmem_pin_region(int fd, size_t offset, size_t len) --{ -- struct ashmem_pin pin = { offset, len }; -- return ioctl(fd, ASHMEM_PIN, &pin); -+// Starting with API level 26, the following functions from -+// libandroid.so should be used to create shared memory regions. -+typedef int(*ASharedMemory_createFunc)(const char*, size_t); -+typedef size_t(*ASharedMemory_getSizeFunc)(int fd); -+typedef int(*ASharedMemory_setProtFunc)(int fd, int prot); -+ -+// Function pointers to shared memory functions. -+typedef struct { -+ ASharedMemory_createFunc create; -+ ASharedMemory_getSizeFunc getSize; -+ ASharedMemory_setProtFunc setProt; -+} ASharedMemoryFuncs; -+ -+const ASharedMemoryFuncs* ashmem_get_funcs() { -+ static ASharedMemoryFuncs s_ashmem_funcs = {}; -+ ASharedMemoryFuncs* funcs = &s_ashmem_funcs; -+ if (funcs->create == NULL) { -+ if (device_api_level() >= __ANDROID_API_O__) { -+ /* Leaked intentionally! */ -+ void* lib = dlopen("libandroid.so", RTLD_NOW); -+ funcs->create = (ASharedMemory_createFunc) -+ dlsym(lib, "ASharedMemory_create"); -+ funcs->getSize = (ASharedMemory_getSizeFunc) -+ dlsym(lib, "ASharedMemory_getSize"); -+ funcs->setProt = (ASharedMemory_setProtFunc) -+ dlsym(lib, "ASharedMemory_setProt"); -+ } else { -+ funcs->create = &ashmem_dev_create_region; -+ funcs->getSize = &ashmem_dev_get_size_region; -+ funcs->setProt = &ashmem_dev_set_prot_region; -+ } -+ } -+ return funcs; - } - --int ashmem_unpin_region(int fd, size_t offset, size_t len) --{ -- struct ashmem_pin pin = { offset, len }; -- return ioctl(fd, ASHMEM_UNPIN, &pin); -+int ashmem_create_region(const char* name, size_t size) { -+ return ashmem_get_funcs()->create(name, size); - } - --int ashmem_get_size_region(int fd) --{ -- return ioctl(fd, ASHMEM_GET_SIZE, NULL); -+int ashmem_set_prot_region(int fd, int prot) { -+ return ashmem_get_funcs()->setProt(fd, prot); - } - --int ashmem_purge_all(void) --{ -- const int fd = open(ASHMEM_DEVICE, O_RDWR); -- if (fd < 0) -- return fd; -- const int ret = ioctl(fd, ASHMEM_PURGE_ALL_CACHES, 0); -- close(fd); -- return ret; -+int ashmem_get_prot_region(int fd) { -+ if (ashmem_dev_fd_check(fd)) -+ return ashmem_dev_get_prot_region(fd); -+ /* There are only two practical values to return here: either -+ * PROT_READ|PROT_WRITE or just PROT_READ, so try to determine -+ * the flags by trying to mmap() the region read-write first. -+ */ -+ int result = PROT_READ; -+ const size_t page_size = (size_t)sysconf(_SC_PAGESIZE); -+ void* m = mmap(NULL, page_size, PROT_READ|PROT_WRITE, -+ MAP_PRIVATE, fd, 0); -+ if (m != MAP_FAILED) { -+ munmap(m, page_size); -+ result = PROT_READ|PROT_WRITE; -+ } -+ return result; -+} -+ -+int ashmem_pin_region(int fd, size_t offset, size_t len) { -+ if (ashmem_dev_fd_check(fd)) -+ return ashmem_dev_pin_region(fd, offset, len); -+ return ASHMEM_NOT_PURGED; -+} -+ -+int ashmem_unpin_region(int fd, size_t offset, size_t len) { -+ if (ashmem_dev_fd_check(fd)) -+ return ashmem_dev_unpin_region(fd, offset, len); -+ /* NOTE: It is not possible to use madvise() here because it requires a -+ * memory address. This could be done in the caller though, instead of -+ * this function. */ -+ return 0; -+} -+ -+int ashmem_get_size_region(int fd) { -+ /* NOTE: Original API returns an int. Avoid breaking it. */ -+ return (int)ashmem_get_funcs()->getSize(fd); -+} -+ -+int ashmem_device_is_supported(void) { -+ return ashmem_get_status() == ASHMEM_STATUS_SUPPORTED; - } -diff --git a/third_party/ashmem/ashmem.h b/third_party/ashmem/ashmem.h -index d8afccbd2a6e..f3675c98b19a 100644 ---- a/third_party/ashmem/ashmem.h -+++ b/third_party/ashmem/ashmem.h -@@ -16,13 +16,20 @@ - extern "C" { - #endif - -+/* Returns true if the ashmem device is supported on this device. -+ * Not that even if the device is not supported, -+ * ashmem_{create,set_prot,get_prot,get_size}_region() will still work -+ * because they will use the ASharedMemory functions from libandroid.so -+ * instead. But ashmem_{pin,unpin}_region() will be no-ops. -+ */ -+int ashmem_device_is_supported(void); -+ - int ashmem_create_region(const char *name, size_t size); - int ashmem_set_prot_region(int fd, int prot); - int ashmem_get_prot_region(int fd); - int ashmem_pin_region(int fd, size_t offset, size_t len); - int ashmem_unpin_region(int fd, size_t offset, size_t len); - int ashmem_get_size_region(int fd); --int ashmem_purge_all(void); - - #ifdef __cplusplus - } diff --git a/naiveproxy/src/third_party/ashmem/patches/0003-Pthread-once-for-funcs-init.patch b/naiveproxy/src/third_party/ashmem/patches/0003-Pthread-once-for-funcs-init.patch deleted file mode 100644 index 778a6e4701..0000000000 --- a/naiveproxy/src/third_party/ashmem/patches/0003-Pthread-once-for-funcs-init.patch +++ /dev/null @@ -1,61 +0,0 @@ -diff --git a/third_party/ashmem/ashmem-dev.c b/third_party/ashmem/ashmem-dev.c -index 25a33cdcd0c8..399ea36ce382 100644 ---- a/third_party/ashmem/ashmem-dev.c -+++ b/third_party/ashmem/ashmem-dev.c -@@ -18,6 +18,7 @@ - - #include - #include -+#include - #include - #include - #include -@@ -190,26 +191,30 @@ typedef struct { - ASharedMemory_setProtFunc setProt; - } ASharedMemoryFuncs; - --const ASharedMemoryFuncs* ashmem_get_funcs() { -- static ASharedMemoryFuncs s_ashmem_funcs = {}; -+static ASharedMemoryFuncs s_ashmem_funcs = {}; -+static pthread_once_t s_ashmem_funcs_once = PTHREAD_ONCE_INIT; -+ -+static void ashmem_init_funcs() { - ASharedMemoryFuncs* funcs = &s_ashmem_funcs; -- if (funcs->create == NULL) { -- if (device_api_level() >= __ANDROID_API_O__) { -- /* Leaked intentionally! */ -- void* lib = dlopen("libandroid.so", RTLD_NOW); -- funcs->create = (ASharedMemory_createFunc) -- dlsym(lib, "ASharedMemory_create"); -- funcs->getSize = (ASharedMemory_getSizeFunc) -- dlsym(lib, "ASharedMemory_getSize"); -- funcs->setProt = (ASharedMemory_setProtFunc) -- dlsym(lib, "ASharedMemory_setProt"); -- } else { -- funcs->create = &ashmem_dev_create_region; -- funcs->getSize = &ashmem_dev_get_size_region; -- funcs->setProt = &ashmem_dev_set_prot_region; -- } -+ if (device_api_level() >= __ANDROID_API_O__) { -+ /* Leaked intentionally! */ -+ void* lib = dlopen("libandroid.so", RTLD_NOW); -+ funcs->create = -+ (ASharedMemory_createFunc)dlsym(lib, "ASharedMemory_create"); -+ funcs->getSize = -+ (ASharedMemory_getSizeFunc)dlsym(lib, "ASharedMemory_getSize"); -+ funcs->setProt = -+ (ASharedMemory_setProtFunc)dlsym(lib, "ASharedMemory_setProt"); -+ } else { -+ funcs->create = &ashmem_dev_create_region; -+ funcs->getSize = &ashmem_dev_get_size_region; -+ funcs->setProt = &ashmem_dev_set_prot_region; - } -- return funcs; -+} -+ -+static const ASharedMemoryFuncs* ashmem_get_funcs() { -+ pthread_once(&s_ashmem_funcs_once, ashmem_init_funcs); -+ return &s_ashmem_funcs; - } - - int ashmem_create_region(const char* name, size_t size) { diff --git a/naiveproxy/src/third_party/ashmem/patches/0004-Fixup-ashmem_get_prot_region-for-memfd.patch b/naiveproxy/src/third_party/ashmem/patches/0004-Fixup-ashmem_get_prot_region-for-memfd.patch deleted file mode 100644 index feae8beb59..0000000000 --- a/naiveproxy/src/third_party/ashmem/patches/0004-Fixup-ashmem_get_prot_region-for-memfd.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/third_party/ashmem/ashmem-dev.c b/third_party/ashmem/ashmem-dev.c -index 399ea36ce3826..6bb4977bab28d 100644 ---- a/third_party/ashmem/ashmem-dev.c -+++ b/third_party/ashmem/ashmem-dev.c -@@ -235,7 +235,7 @@ int ashmem_get_prot_region(int fd) { - int result = PROT_READ; - const size_t page_size = (size_t)sysconf(_SC_PAGESIZE); - void* m = mmap(NULL, page_size, PROT_READ|PROT_WRITE, -- MAP_PRIVATE, fd, 0); -+ MAP_SHARED, fd, 0); - if (m != MAP_FAILED) { - munmap(m, page_size); - result = PROT_READ|PROT_WRITE; diff --git a/naiveproxy/src/third_party/ashmem/patches/0005-Fix-ashmem-availability-check.patch b/naiveproxy/src/third_party/ashmem/patches/0005-Fix-ashmem-availability-check.patch deleted file mode 100644 index 35b5426019..0000000000 --- a/naiveproxy/src/third_party/ashmem/patches/0005-Fix-ashmem-availability-check.patch +++ /dev/null @@ -1,39 +0,0 @@ -From ad36ee583a7e6300716b061ddae433fd9da9793d Mon Sep 17 00:00:00 2001 -From: Sam Maier -Date: Tue, 22 Apr 2025 11:33:56 -0400 -Subject: [PATCH] Fix ashmem availability check - ---- - third_party/ashmem/ashmem-dev.c | 9 +-------- - 1 file changed, 1 insertion(+), 8 deletions(-) - -diff --git a/third_party/ashmem/ashmem-dev.c b/third_party/ashmem/ashmem-dev.c -index 6bb4977bab28d..4a3e31f6910f4 100644 ---- a/third_party/ashmem/ashmem-dev.c -+++ b/third_party/ashmem/ashmem-dev.c -@@ -44,13 +44,6 @@ - * https://bugs.chromium.org/p/chromium/issues/detail?id=392191#c17 - */ - --/* Weak symbol import */ --void __system_property_read_callback( -- const prop_info* info, -- void (*callback)( -- void* cookie, const char* name, const char* value, uint32_t serial), -- void* cookie) __attribute__((weak)); -- - /* Callback used with __system_property_read_callback. */ - static void prop_read_int(void* cookie, - const char* name, -@@ -63,7 +56,7 @@ static void prop_read_int(void* cookie, - - static int system_property_get_int(const char* name) { - int result = 0; -- if (__system_property_read_callback) { -+ if (__builtin_available(android 26, *)) { - const prop_info* info = __system_property_find(name); - if (info) - __system_property_read_callback(info, &prop_read_int, &result); --- -2.49.0.805.g082f7c87e0-goog - diff --git a/naiveproxy/src/third_party/boringssl/README.chromium b/naiveproxy/src/third_party/boringssl/README.chromium index 91fb1480cc..89182c6afb 100644 --- a/naiveproxy/src/third_party/boringssl/README.chromium +++ b/naiveproxy/src/third_party/boringssl/README.chromium @@ -1,6 +1,7 @@ Name: BoringSSL URL: https://boringssl.googlesource.com/boringssl Version: git +Update Mechanism: Manual License: MIT, BSD-3-Clause, OpenSSL, ISC, SSLeay License File: src/LICENSE License Android Compatible: yes diff --git a/naiveproxy/src/third_party/boringssl/src/API-CONVENTIONS.md b/naiveproxy/src/third_party/boringssl/src/API-CONVENTIONS.md index 98850309b2..94c375dcfe 100644 --- a/naiveproxy/src/third_party/boringssl/src/API-CONVENTIONS.md +++ b/naiveproxy/src/third_party/boringssl/src/API-CONVENTIONS.md @@ -284,7 +284,7 @@ pointer. The caller must own the object before the function call and, after transfer, no longer owns it. As a corollary, the caller may no longer reference the object without a separate guarantee on the lifetime. The function may even release the object before returning. Callers that wish to independently retain a -transfered object must therefore take a reference or make a copy before +transferred object must therefore take a reference or make a copy before transferring. Callers should also take note of whether the function is documented to transfer pointers unconditionally or only on success. Unlike C++ and Rust, functions in BoringSSL typically only transfer on success. @@ -322,3 +322,132 @@ it as needed. Consult the API documentation for the threading guarantees of particular objects. In general, stateless reference-counted objects like `RSA` or `EVP_PKEY` which represent keys may typically be used from multiple threads simultaneously, provided no thread mutates the key. + + +## Callbacks and Closures + +Several BoringSSL APIs, particularly in libssl, allow applications to configure +callbacks to customize behavior. Often, an application may wish to pass in some +[closure](https://en.wikipedia.org/wiki/Closure_(computer_programming)), where +the callback is bound to some additional state. For example, a callback for TLS +private key offload may need a handle to the application-specific private key. + +BoringSSL's APIs are C-based and use C function pointers, which do not support +bound variables. Instead, C callback APIs split the closure into a function +pointer and some `void *` data parameter. This is sometimes called "arg", +"callback data", "context", "data", or "user data". + +For example, the `SSL_CTX_set_cert_cb` function takes an `arg` parameter, which +is passed back into the user-supplied callback, `cb`. The user would pass a +function that casts `arg` back to the expected type and looks up bound data as +needed: + +``` +OPENSSL_EXPORT void SSL_CTX_set_cert_cb(SSL_CTX *ctx, + int (*cb)(SSL *ssl, void *arg), + void *arg); +``` + +An application might use it with a C++ `std::function` as follows: + +``` +int RunCertCallback(SSL *ssl, void *arg) { + auto *f = static_cast*>(arg); + return (*f)(ssl); +} + +std::function cert_cb = ...; +SSL_CTX_set_cert_cb(ctx, RunCertCallback, &cert_cb); +``` + +Note that such an application would additionally need to ensure that `cert_cb` +outlives `ctx`, e.g. by storing it in the `SSL_CTX`'s owning object. + +BoringSSL APIs, however, commonly take callbacks without an explicit data +parameter. For example, the `SSL_set_custom_verify` takes an undecorated +`callback` parameter: + +``` +OPENSSL_EXPORT void SSL_set_custom_verify( + SSL *ssl, int mode, + enum ssl_verify_result_t (*callback)(SSL *ssl, uint8_t *out_alert)); +``` + +In such APIs, the callback is expected to look up data through the owning +object, here the `ssl`. Many types in BoringSSL, including `SSL`, support +`ex_data`. `ex_data` lets applications associate extra data with the object. See +the [API documentation](https://commondatastorage.googleapis.com/chromium-boringssl-docs/ex_data.h.html) +for more details. `ex_data` also supports registering a `free_func` callback, +which can give the application more options to ensure callback data outlives the +object. + +Often, for a callback-heavy object like `SSL`, the application will already have +some owning object that wraps the `SSL`. The application can then register a +single `ex_data` index, pointering back to the owning object, and store all the +callback state there. + +For example, this code snippet connects `SSL` callbacks to methods on some +wrapper `MySSLConnection` class. + +``` +class MySSLConnection { + private: + void Init() { + ssl_.reset(SSL_new(...)); + // Save a pointer in `ssl_` back to `this`. `this` owns and thus outlives + // `ssl_`. (To have `ssl_` own its ex_data, use `SSL_get_ex_new_index`'s + // `free_func` parameter.) + CHECK(SSL_set_ex_data(ssl_.get(), ExDataIndex(), this)); + // Register callbacks. + SSL_set_custom_verify(ssl_.get(), SSL_VERIFY_PEER, + &MySSLConnection::DoVerifyCallback); + SSL_set_info_callback(ssl_.get(), &MySSLConnection::DoInfoCallback); + ... + } + + static int ExDataIndex() { + static const int kIndex = [] { + int idx = SSL_get_ex_new_index(0, nullptr, nullptr, nullptr); + CHECK(idx >= 0); + return idx; + }(); + return kIndex; + } + + static MySSLConnection *FromSSL(const SSL *ssl) { + return static_cast( + SSL_get_ex_data(ssl_.get(), ExDataIndex())); + } + + // Callback functions passed to BoringSSL: + static ssl_verify_result_t DoVerifyCallback(SSL *ssl, uint8_t *out_alert)) { + return FromSSL(ssl)->Verify(out_alert); + } + static void DoInfoCallback(const SSL *ssl, int type, int value) { + return FromSSL(ssl)->InfoCallback(type, value); + } + + // The underlying methods that the callback functions forward to: + ssl_verify_result_t VerifyCallback(uint8_t *out_alert)) { ... } + void InfoCallback(int type, int value) { ... } + + bssl::UniquePtr ssl_; +}; +``` + +In other cases, the callback may live on a different object than is passed into +the callback. The application can then use ex_data on either the passed-in +object, or follow accessors to parent objects. For example, an `SSL_get_SSL_CTX` +returns the `SSL_CTX` of an `SSL` and +[`SSL_CTX_set_cert_verify_callback`'s documentation](https://commondatastorage.googleapis.com/chromium-boringssl-docs/ssl.h.html#SSL_CTX_set_cert_verify_callback) +mentions that `SSL_get_ex_data_X509_STORE_CTX_idx` may be used to find the `SSL` +corresponding to the `X509_STORE_CTX`. + +``` +OPENSSL_EXPORT void SSL_CTX_sess_set_new_cb( + SSL_CTX *ctx, int (*new_session_cb)(SSL *ssl, SSL_SESSION *session)); + +OPENSSL_EXPORT void SSL_CTX_set_cert_verify_callback( + SSL_CTX *ctx, int (*callback)(X509_STORE_CTX *store_ctx, void *arg), + void *arg); +``` diff --git a/naiveproxy/src/third_party/boringssl/src/BUILDING.md b/naiveproxy/src/third_party/boringssl/src/BUILDING.md index e7e7f0e8ad..3e67e1536d 100644 --- a/naiveproxy/src/third_party/boringssl/src/BUILDING.md +++ b/naiveproxy/src/third_party/boringssl/src/BUILDING.md @@ -14,7 +14,7 @@ Unless otherwise noted, build tools must at most five years old, matching [Abseil guidelines](https://abseil.io/about/compatibility). If in doubt, use the most recent stable version of each tool. - * [CMake](https://cmake.org/download/) 3.12 or later is required. + * [CMake](https://cmake.org/download/) 3.22 or later is required. * Building with [Ninja](https://ninja-build.org/) instead of Make is recommended, because it makes builds faster. On Windows, CMake's Visual @@ -74,8 +74,8 @@ themselves automatically. ### Building for Android It's possible to build BoringSSL with the Android NDK using CMake. Recent -versions of the NDK include a CMake toolchain file which works with CMake 3.6.0 -or later. This has been tested with version r16b of the NDK. +versions of the NDK include a CMake toolchain file. This has been tested with +version r16b of the NDK. Unpack the Android NDK somewhere and export `ANDROID_NDK` to point to the directory. Then run CMake like this: @@ -218,4 +218,4 @@ reported to work, as has MSYS Perl. to `PATH`, which can confuse some build tools when identifying the compiler (removing `C:\Strawberry\c\bin` from `PATH` should resolve any problems). -See (gen/README.md)[./gen/README.md] for more details. +See [gen/README.md](./gen/README.md) for more details. diff --git a/naiveproxy/src/third_party/boringssl/src/CMakeLists.txt b/naiveproxy/src/third_party/boringssl/src/CMakeLists.txt index 06ce07e955..59bb999592 100644 --- a/naiveproxy/src/third_party/boringssl/src/CMakeLists.txt +++ b/naiveproxy/src/third_party/boringssl/src/CMakeLists.txt @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.22) # Defer enabling C and CXX languages. project(BoringSSL NONE) @@ -43,11 +43,6 @@ include(GNUInstallDirs) set(INSTALL_ENABLED 1) -if(CMAKE_VERSION VERSION_LESS 3.21 AND - CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) - set(PROJECT_IS_TOP_LEVEL 1) -endif() - if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT CMAKE_CROSSCOMPILING AND BUILD_TESTING) find_package(PkgConfig QUIET) @@ -384,20 +379,10 @@ if(FIPS_DELOCATE OR NOT OPENSSL_NO_ASM) if (NOT OPENSSL_NO_ASM) set(OPENSSL_ASM TRUE) endif() - # Work around https://gitlab.kitware.com/cmake/cmake/-/issues/20771 in older - # CMake versions. - if(APPLE AND CMAKE_VERSION VERSION_LESS 3.19) - if(CMAKE_OSX_SYSROOT) - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -isysroot \"${CMAKE_OSX_SYSROOT}\"") - endif() - foreach(arch ${CMAKE_OSX_ARCHITECTURES}) - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -arch ${arch}") - endforeach() - endif() if(NOT WIN32) set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,--noexecstack") endif() - # Clang's integerated assembler does not support debug symbols. + # Clang's integrated assembler does not support debug symbols. if(NOT CMAKE_ASM_COMPILER_ID MATCHES "Clang") set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,-g") endif() @@ -713,11 +698,16 @@ if(BUILD_TESTING) add_executable(test_fips util/fipstools/test_fips.cc) target_link_libraries(test_fips crypto) + + add_executable(jitter_deltas util/fipstools/entropy/jitter_deltas.cc) + target_link_libraries(jitter_deltas crypto) endif() if(FIPS) add_executable(modulewrapper ${MODULEWRAPPER_SOURCES}) target_link_libraries(modulewrapper crypto) + add_executable(entropy_modulewrapper ${ENTROPY_MODULEWRAPPER_SOURCES}) + target_link_libraries(entropy_modulewrapper crypto) endif() add_executable(bssl ${BSSL_SOURCES}) @@ -739,12 +729,8 @@ if(FUZZ) endif() if(RUST_BINDINGS) - find_program(BINDGEN_EXECUTABLE bindgen) - if(NOT BINDGEN_EXECUTABLE) - message(FATAL_ERROR "Could not find bindgen but was asked to generate Rust bindings.") - else() - add_subdirectory(rust) - endif() + find_program(BINDGEN_EXECUTABLE bindgen REQUIRED) + add_subdirectory(rust) endif() if(CMAKE_SYSTEM_NAME STREQUAL "Linux") diff --git a/naiveproxy/src/third_party/boringssl/src/CONTRIBUTING.md b/naiveproxy/src/third_party/boringssl/src/CONTRIBUTING.md index 7f08cc3aa3..c808da0106 100644 --- a/naiveproxy/src/third_party/boringssl/src/CONTRIBUTING.md +++ b/naiveproxy/src/third_party/boringssl/src/CONTRIBUTING.md @@ -1,6 +1,6 @@ Want to contribute? Great! First, read this page (including the small print at the end). -### Before you contribute +# Before you contribute Before we can use your code, you must sign the [Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual) (CLA), which you can do online. The CLA is necessary mainly because you own the @@ -14,11 +14,11 @@ Before you start working on a larger contribution, you should get in touch with us first via email with your idea so that we can help out and possibly guide you. Coordinating up front makes it much easier to avoid frustration later on. -### Code reviews +# Code reviews All submissions, including submissions by project members, require review. We use [Gerrit](https://boringssl-review.googlesource.com) for this purpose. -#### Setup +## Setup If you have not done so on this machine, you will need to set up a password for Gerrit. Sign in with a Google account, visit [this link](https://boringssl.googlesource.com/), and click the "Generate @@ -28,14 +28,24 @@ You must also have a Gerrit account associated with your Google account. To do this visit the [Gerrit review server](https://boringssl-review.googlesource.com) and click "Sign in" (top right). -Finally, you will need to prepare your checkout to +## Uploading changes + +There are a few different workflows for uploading to Gerrit, depending on what +tools you have available and whether you are more familiar with Gerrit or +Chromium's `depot_tools`. + +**WARNING**: The two workflows, by default, convert branches and commits into +code review changes very differently. + +### Uploading directly to Gerrit + +To use the Gerrit workflow, you will need to prepare your checkout to [add Change-Ids](https://gerrit-review.googlesource.com/Documentation/cmd-hook-commit-msg.html) on commit. Run: curl -Lo .git/hooks/commit-msg https://boringssl-review.googlesource.com/tools/hooks/commit-msg chmod u+x .git/hooks/commit-msg -#### Uploading changes To upload a change, push it to the special `refs/for/main` target: git push origin HEAD:refs/for/main @@ -43,20 +53,39 @@ To upload a change, push it to the special `refs/for/main` target: The output will then give you a link to the change. Add `agl@google.com`, `davidben@google.com` as reviewers. -Pushing a commit with the same Change-Id as an existing change will upload a new -version of it. (Use the `git rebase` or `git commit --amend` commands.) +Pushing a commit with the same `Change-Id` as an existing change will upload a new +version of it. (Gerrit refers to versions of a change as "patchsets".) The +`git rebase` or `git commit --amend` commands may be helpful to modify an +existing commit. Making changes as separate commits will result in multiple +Gerrit change, as described below. + +Pushing a series of commits will create a series of dependent changes. To upload +new versions of commits in the series, `git rebase -i` may be helpful. For more detailed instructions, see the [Gerrit User Guide](https://gerrit-review.googlesource.com/Documentation/intro-user.html). +Google employers may also find [go/gerrit-dev-workflows](https://goto.corp.google.com/gerrit-dev-workflows) +helpful. -As an alternative to pushing to `refs/for/main`: if you have Chromium's -`depot_tools` installed, you can simply run `git cl upload` to upload a change. -This also has the advantage of automatically running any relevant `PRESUBMIT.py` -checks. See [depot_tools +### Uploading using depot_tools + +If you have Chromium's `depot_tools` installed, you can use `git cl upload` to +upload a change. This also has the advantage of automatically running any +relevant `PRESUBMIT.py` checks, which can catch common/trivial errors locally at +upload time instead of waiting for a slower CQ run. + +By default, your entire branch will be squashed into a single Gerrit change. +This avoids the need for tools like `git commit --amend` to upload new versions +of the change. However, to upload a series of changes, you must create a series +of branches in your repository. Setting `gerrit.squash-uploads` to `false` in +`git config` disables this behavior and causes `git cl upload` to behave like +the Gerrit workflow above. + +See [depot_tools documentation](https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools.html) for more info. -### Copyright headers +# Copyright headers New files contributed directly to BoringSSL should use the following copyright header, where `YEAR` is the year the file was added: @@ -89,7 +118,25 @@ the Apache 2.0 appendix. Thus new files should begin with the following header: // See the License for the specific language governing permissions and // limitations under the License. -### The small print +# Testing +See the [build instructions](./BUILDING.md) for instructions on how to run +tests. + +Additionally, our Gerrit instance is configured to run our tests on a range of +platforms. This is called the "commit queue" or CQ. Project members can set the +`Commit-Queue` label to +1 for a dry run, which runs the tests without +submitting the CL. + +# Pre-generated files +There are a number of files in BoringSSL which are checked into the source tree, +to reduce dependencies for consumers of the library. When modifying their +inputs, the generated files must be updated. The CQ and `depot_tools` presubmit +scripts will check that they are correct. + +See [pre-generated file documentation](./gen/README.md) for how to update these +files. + +# The small print Contributions made by corporations are covered by a different agreement than the one above, the [Software Grant and Corporate Contributor License Agreement](https://cla.developers.google.com/about/google-corporate). diff --git a/naiveproxy/src/third_party/boringssl/src/INCORPORATING.md b/naiveproxy/src/third_party/boringssl/src/INCORPORATING.md index bc809233bb..415e2dcaad 100644 --- a/naiveproxy/src/third_party/boringssl/src/INCORPORATING.md +++ b/naiveproxy/src/third_party/boringssl/src/INCORPORATING.md @@ -108,7 +108,7 @@ module system. If you are using multiple versions in a single binary, in different shared objects, ensure you build BoringSSL with `-fvisibility=hidden` and do not export any of BoringSSL's symbols. This will prevent any collisions with other -verisons that may be included in other shared objects. Note that this requires +versions that may be included in other shared objects. Note that this requires that all callers of BoringSSL APIs live in the same shared object as BoringSSL. If you require that BoringSSL APIs be used across shared object boundaries, diff --git a/naiveproxy/src/third_party/boringssl/src/MODULE.bazel b/naiveproxy/src/third_party/boringssl/src/MODULE.bazel index 8f57e976da..4532c8bb4d 100644 --- a/naiveproxy/src/third_party/boringssl/src/MODULE.bazel +++ b/naiveproxy/src/third_party/boringssl/src/MODULE.bazel @@ -16,7 +16,7 @@ # the revision where we bump the version. module( name = "boringssl", - version = "0.20250701.0", + version = "0.20251002.0", compatibility_level = 2, ) @@ -30,7 +30,7 @@ module( # need to request they run tests when triaging issues. If # https://github.com/bazelbuild/bazel/issues/22187 is ever fixed, we can change # this. -bazel_dep(name = "googletest", version = "1.17.0") +bazel_dep(name = "googletest", version = "1.17.0.bcr.1") bazel_dep(name = "platforms", version = "1.0.0") -bazel_dep(name = "rules_cc", version = "0.1.2") +bazel_dep(name = "rules_cc", version = "0.2.8") bazel_dep(name = "rules_license", version = "1.0.0") diff --git a/naiveproxy/src/third_party/boringssl/src/MODULE.bazel.lock b/naiveproxy/src/third_party/boringssl/src/MODULE.bazel.lock index ecd314215e..4a0f22fb14 100644 --- a/naiveproxy/src/third_party/boringssl/src/MODULE.bazel.lock +++ b/naiveproxy/src/third_party/boringssl/src/MODULE.bazel.lock @@ -36,8 +36,8 @@ "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", - "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", - "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", + "https://bcr.bazel.build/modules/googletest/1.17.0.bcr.1/MODULE.bazel": "9f8e815fba6e81dee850a33068166989000eabcf7690d2127a975c2ebda6baae", + "https://bcr.bazel.build/modules/googletest/1.17.0.bcr.1/source.json": "7ec4d46613cc41d908cb87a58e7e7ad11dba4662640af8ae2200bd045c1e4f84", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", @@ -69,8 +69,8 @@ "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", - "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0", - "https://bcr.bazel.build/modules/rules_cc/0.1.2/source.json": "53fcb09b5816c83ca60d9d7493faf3bfaf410dfc2f15deb52d6ddd146b8d43f0", + "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", + "https://bcr.bazel.build/modules/rules_cc/0.2.8/source.json": "85087982aca15f31307bd52698316b28faa31bd2c3095a41f456afec0131344c", "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", diff --git a/naiveproxy/src/third_party/boringssl/src/PORTING.md b/naiveproxy/src/third_party/boringssl/src/PORTING.md index 3faf757b15..4bf616c00e 100644 --- a/naiveproxy/src/third_party/boringssl/src/PORTING.md +++ b/naiveproxy/src/third_party/boringssl/src/PORTING.md @@ -283,7 +283,7 @@ parameter. ## Significant API additions -In some places, BoringSSL has added significant APIs. Use of these APIs goes beyound “porting” and means giving up on OpenSSL compatibility. +In some places, BoringSSL has added significant APIs. Use of these APIs goes beyond “porting” and means giving up on OpenSSL compatibility. One example of this has already been mentioned: the [CBS and CBB](https://commondatastorage.googleapis.com/chromium-boringssl-docs/bytestring.h.html) functions should be used whenever parsing or serialising data. diff --git a/naiveproxy/src/third_party/boringssl/src/PRESUBMIT.py b/naiveproxy/src/third_party/boringssl/src/PRESUBMIT.py new file mode 100644 index 0000000000..4f13a4e9f6 --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/PRESUBMIT.py @@ -0,0 +1,53 @@ +# Copyright 2025 The BoringSSL Authors +# +# Licensed under the Apache License, Version 2.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. + +"""Presubmit checks for BoringSSL. + +Run by the presubmit API in depot_tools, e.g. by running `git cl presubmit`. +""" + +PRESUBMIT_VERSION = '2.0.0' +USE_PYTHON3 = True + + +def CheckPregeneratedFiles(input_api, output_api): + """Checks that pregenerated files are properly updated.""" + # TODO(chlily): Make this compatible with the util/bot environment for CI/CQ. + try: + # Check that `go` is available on the $PATH. + input_api.subprocess.check_call(['go', 'version'], + stdout=input_api.subprocess.PIPE, + stderr=input_api.subprocess.PIPE) + except input_api.subprocess.CalledProcessError as e: + return [ + output_api.PresubmitPromptOrNotify(f'Could not run `go`: {e}') + ] + + pregenerate_script_path = input_api.os_path.join( + input_api.change.RepositoryRoot(), 'util', 'pregenerate') + try: + out, retcode = input_api.subprocess.communicate( + ['go', 'run', pregenerate_script_path, '-check'], + stdout=input_api.subprocess.PIPE, + stderr=input_api.subprocess.PIPE) + if retcode: + bad = out[1].decode("utf-8").splitlines() + return [ + output_api.PresubmitError( + ("Found out-of-date generated files. " + "Run `go run ./util/pregenerate` to update them."), bad) + ] + except input_api.subprocess.CalledProcessError as e: + return [output_api.PresubmitError(f'Could not run go script: {e}')] + return [] # Check passed. diff --git a/naiveproxy/src/third_party/boringssl/src/STYLE.md b/naiveproxy/src/third_party/boringssl/src/STYLE.md index 1b6bd0b33f..29c0dd784f 100644 --- a/naiveproxy/src/third_party/boringssl/src/STYLE.md +++ b/naiveproxy/src/third_party/boringssl/src/STYLE.md @@ -33,14 +33,16 @@ pattern requires lifting some variable declarations. Comments should be `// C99-style` for consistency with C++. -When declaring pointer types, `*` should be placed next to the variable name, -not the type. So +When declaring pointer or reference types, `*` or `&` should be placed next to +the variable name, not the type. So uint8_t *ptr; + const auto &blah; not uint8_t* ptr; + const auto& blah; Rather than `malloc()` and `free()`, use the wrappers `OPENSSL_malloc()` and `OPENSSL_free()`. Use the standard C `assert()` function freely. diff --git a/naiveproxy/src/third_party/boringssl/src/build.json b/naiveproxy/src/third_party/boringssl/src/build.json index a24ee0697c..8f77c424dd 100644 --- a/naiveproxy/src/third_party/boringssl/src/build.json +++ b/naiveproxy/src/third_party/boringssl/src/build.json @@ -72,6 +72,8 @@ "crypto/fipsmodule/ec/wnaf.cc.inc", "crypto/fipsmodule/ecdh/ecdh.cc.inc", "crypto/fipsmodule/ecdsa/ecdsa.cc.inc", + "crypto/fipsmodule/entropy/jitter.cc.inc", + "crypto/fipsmodule/entropy/sha512.cc.inc", "crypto/fipsmodule/hkdf/hkdf.cc.inc", "crypto/fipsmodule/hmac/hmac.cc.inc", "crypto/fipsmodule/keccak/keccak.cc.inc", @@ -259,17 +261,13 @@ "crypto/evp/evp_asn1.cc", "crypto/evp/evp_ctx.cc", "crypto/evp/p_dh.cc", - "crypto/evp/p_dh_asn1.cc", - "crypto/evp/p_dsa_asn1.cc", + "crypto/evp/p_dsa.cc", "crypto/evp/p_ec.cc", - "crypto/evp/p_ec_asn1.cc", "crypto/evp/p_ed25519.cc", - "crypto/evp/p_ed25519_asn1.cc", "crypto/evp/p_hkdf.cc", + "crypto/evp/p_mldsa.cc", "crypto/evp/p_rsa.cc", - "crypto/evp/p_rsa_asn1.cc", "crypto/evp/p_x25519.cc", - "crypto/evp/p_x25519_asn1.cc", "crypto/evp/pbkdf.cc", "crypto/evp/print.cc", "crypto/evp/scrypt.cc", @@ -402,7 +400,6 @@ "crypto/x509/x_req.cc", "crypto/x509/x_sig.cc", "crypto/x509/x_spki.cc", - "crypto/x509/x_val.cc", "crypto/x509/x_x509.cc", "crypto/x509/x_x509a.cc", "crypto/xwing/xwing.cc" @@ -417,7 +414,6 @@ "include/openssl/asn1t.h", "include/openssl/base.h", "include/openssl/base64.h", - "include/openssl/bcm_public.h", "include/openssl/bio.h", "include/openssl/blake2.h", "include/openssl/blowfish.h", @@ -449,7 +445,6 @@ "include/openssl/evp.h", "include/openssl/evp_errors.h", "include/openssl/ex_data.h", - "include/openssl/experimental/kyber.h", "include/openssl/hkdf.h", "include/openssl/hmac.h", "include/openssl/hpke.h", @@ -529,6 +524,7 @@ "crypto/fipsmodule/ec/p256-nistz.h", "crypto/fipsmodule/ec/p256_table.h", "crypto/fipsmodule/ecdsa/internal.h", + "crypto/fipsmodule/entropy/internal.h", "crypto/fipsmodule/keccak/internal.h", "crypto/fipsmodule/rand/internal.h", "crypto/fipsmodule/rsa/internal.h", @@ -771,6 +767,7 @@ "test_support": { "srcs": [ "crypto/test/abi_test.cc", + "crypto/test/der_trailing_data.cc", "crypto/test/file_test.cc", "crypto/test/file_test_gtest.cc", "crypto/test/file_util.cc", @@ -780,6 +777,7 @@ ], "internal_hdrs": [ "crypto/test/abi_test.h", + "crypto/test/der_trailing_data.h", "crypto/test/file_test.h", "crypto/test/file_util.h", "crypto/test/gtest_main.h", @@ -851,6 +849,7 @@ "crypto/fipsmodule/ec/p256-nistz_test.cc", "crypto/fipsmodule/ec/p256_test.cc", "crypto/fipsmodule/ecdsa/ecdsa_test.cc", + "crypto/fipsmodule/entropy/jitter_test.cc", "crypto/fipsmodule/hkdf/hkdf_test.cc", "crypto/fipsmodule/keccak/keccak_test.cc", "crypto/fipsmodule/rand/ctrdrbg_test.cc", @@ -898,8 +897,7 @@ "crypto/cipher/test/nist_cavp/*.txt", "crypto/curve25519/ed25519_tests.txt", "crypto/ecdh/ecdh_tests.txt", - "crypto/evp/evp_tests.txt", - "crypto/evp/scrypt_tests.txt", + "crypto/evp/test/*.txt", "crypto/fipsmodule/aes/aes_tests.txt", "crypto/fipsmodule/bn/test/*.txt", "crypto/fipsmodule/cmac/cavp_3des_cmac_tests.txt", @@ -912,6 +910,7 @@ "crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt", "crypto/fipsmodule/keccak/keccak_tests.txt", "crypto/fipsmodule/rand/ctrdrbg_vectors.txt", + "crypto/fipsmodule/rand/ctrdrbg_df_vectors.txt", "crypto/hmac/hmac_tests.txt", "crypto/hpke/hpke_test_vectors.txt", "crypto/kyber/kyber_tests.txt", @@ -943,6 +942,7 @@ "crypto/slhdsa/slhdsa_siggen.txt", "crypto/slhdsa/slhdsa_sigver.txt", "crypto/x509/test/*.pem", + "crypto/x509/test/*.pk8", "third_party/wycheproof_testvectors/*.txt" ] }, @@ -1077,7 +1077,18 @@ "modulewrapper": { "srcs": [ "util/fipstools/acvp/modulewrapper/main.cc", - "util/fipstools/acvp/modulewrapper/modulewrapper.cc" + "util/fipstools/acvp/modulewrapper/modulewrapper.cc", + "util/fipstools/acvp/modulewrapper/proto.cc" + ], + "internal_hdrs": [ + "util/fipstools/acvp/modulewrapper/modulewrapper.h" + ] + }, + "entropy_modulewrapper": { + "srcs": [ + "util/fipstools/acvp/entropy_modulewrapper/main.cc", + "util/fipstools/acvp/entropy_modulewrapper/modulewrapper.cc", + "util/fipstools/acvp/modulewrapper/proto.cc" ], "internal_hdrs": [ "util/fipstools/acvp/modulewrapper/modulewrapper.h" diff --git a/naiveproxy/src/third_party/boringssl/src/cmake/go.cmake b/naiveproxy/src/third_party/boringssl/src/cmake/go.cmake index 9b2f411983..13d21a59c3 100644 --- a/naiveproxy/src/third_party/boringssl/src/cmake/go.cmake +++ b/naiveproxy/src/third_party/boringssl/src/cmake/go.cmake @@ -25,37 +25,19 @@ endfunction() function(go_executable dest package) require_go() set(godeps "${PROJECT_SOURCE_DIR}/util/godeps.go") - if(NOT CMAKE_GENERATOR STREQUAL "Ninja") - # The DEPFILE parameter to add_custom_command only works with Ninja. Query - # the sources at configure time. Additionally, everything depends on go.mod. - # That affects what external packages to use. - # - # TODO(davidben): Starting CMake 3.20, it also works with Make. Starting - # 3.21, it works with Visual Studio and Xcode too. - execute_process(COMMAND ${GO_EXECUTABLE} run ${godeps} -format cmake - -pkg ${package} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - OUTPUT_VARIABLE sources - RESULT_VARIABLE godeps_result) - add_custom_command(OUTPUT ${dest} - COMMAND ${GO_EXECUTABLE} build - -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${sources} ${PROJECT_SOURCE_DIR}/go.mod) - else() - # Ninja expects the target in the depfile to match the output. This is a - # relative path from the build directory. - binary_dir_relative_path(${dest} target) + # Ninja expects the target in the depfile to match the output. This is a + # relative path from the build directory. + set(target "${CMAKE_CURRENT_BINARY_DIR}/${dest}") + cmake_path(RELATIVE_PATH target BASE_DIRECTORY "${CMAKE_BINARY_DIR}") - set(depfile "${CMAKE_CURRENT_BINARY_DIR}/${dest}.d") - add_custom_command(OUTPUT ${dest} - COMMAND ${GO_EXECUTABLE} build - -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package} - COMMAND ${GO_EXECUTABLE} run ${godeps} -format depfile - -target ${target} -pkg ${package} -out ${depfile} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${godeps} ${PROJECT_SOURCE_DIR}/go.mod - DEPFILE ${depfile}) - endif() + set(depfile "${CMAKE_CURRENT_BINARY_DIR}/${dest}.d") + add_custom_command(OUTPUT ${dest} + COMMAND ${GO_EXECUTABLE} build + -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package} + COMMAND ${GO_EXECUTABLE} run ${godeps} -format depfile + -target ${target} -pkg ${package} -out ${depfile} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${godeps} ${PROJECT_SOURCE_DIR}/go.mod + DEPFILE ${depfile}) endfunction() diff --git a/naiveproxy/src/third_party/boringssl/src/cmake/paths.cmake b/naiveproxy/src/third_party/boringssl/src/cmake/paths.cmake index 625b18846d..c6285f91dc 100644 --- a/naiveproxy/src/third_party/boringssl/src/cmake/paths.cmake +++ b/naiveproxy/src/third_party/boringssl/src/cmake/paths.cmake @@ -12,18 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# binary_dir_relative_path sets outvar to -# ${CMAKE_CURRENT_BINARY_DIR}/${cur_bin_dir_relative}, but expressed relative to -# ${CMAKE_BINARY_DIR}. -# -# TODO(davidben): When we require CMake 3.20 or later, this can be replaced with -# the built-in cmake_path(RELATIVE_PATH) function. -function(binary_dir_relative_path cur_bin_dir_relative outvar) - string(LENGTH "${CMAKE_BINARY_DIR}/" root_dir_length) - string(SUBSTRING "${CMAKE_CURRENT_BINARY_DIR}/${cur_bin_dir_relative}" ${root_dir_length} -1 result) - set(${outvar} ${result} PARENT_SCOPE) -endfunction() - # copy_post_build causes targets in ${ARGN} to be copied to # ${CMAKE_CURRENT_BINARY_DIR}/${dir} after being built. function(copy_post_build dir) diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_bitstr.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_bitstr.cc index 6bdd7260d7..3c97ccbc66 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_bitstr.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_bitstr.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include "../internal.h" #include "internal.h" @@ -69,7 +70,7 @@ int ASN1_BIT_STRING_num_bytes(const ASN1_BIT_STRING *str, size_t *out) { } int i2c_ASN1_BIT_STRING(const ASN1_BIT_STRING *a, unsigned char **pp) { - if (a == NULL) { + if (a == nullptr) { return 0; } @@ -80,7 +81,7 @@ int i2c_ASN1_BIT_STRING(const ASN1_BIT_STRING *a, unsigned char **pp) { return 0; } int ret = 1 + len; - if (pp == NULL) { + if (pp == nullptr) { return ret; } @@ -110,76 +111,96 @@ int asn1_marshal_bit_string(CBB *out, const ASN1_BIT_STRING *in, CBB_flush(out); } -ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, - const unsigned char **pp, long len) { - ASN1_BIT_STRING *ret = NULL; - const unsigned char *p; - unsigned char *s; - int padding; - uint8_t padding_mask; - - if (len < 1) { +static int asn1_parse_bit_string_contents(bssl::Span in, + ASN1_BIT_STRING *out) { + CBS cbs = in; + uint8_t padding; + if (!CBS_get_u8(&cbs, &padding)) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_SHORT); - goto err; + return 0; } - if (len > INT_MAX) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_LONG); - goto err; - } - - if ((a == NULL) || ((*a) == NULL)) { - if ((ret = ASN1_BIT_STRING_new()) == NULL) { - return NULL; - } - } else { - ret = (*a); - } - - p = *pp; - padding = *(p++); - len--; if (padding > 7) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_BIT_STRING_BITS_LEFT); - goto err; + return 0; } // Unused bits in a BIT STRING must be zero. - padding_mask = (1 << padding) - 1; - if (padding != 0 && (len < 1 || (p[len - 1] & padding_mask) != 0)) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_BIT_STRING_PADDING); - goto err; - } - - // We do this to preserve the settings. If we modify the settings, via - // the _set_bit function, we will recalculate on output - ret->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); // clear - ret->flags |= (ASN1_STRING_FLAG_BITS_LEFT | padding); // set - - if (len > 0) { - s = reinterpret_cast(OPENSSL_memdup(p, len)); - if (s == NULL) { - goto err; + uint8_t padding_mask = (1 << padding) - 1; + if (padding != 0) { + CBS copy = cbs; + uint8_t last; + if (!CBS_get_last_u8(©, &last) || (last & padding_mask) != 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_BIT_STRING_PADDING); + return 0; } - p += len; - } else { - s = NULL; } - ret->length = (int)len; - OPENSSL_free(ret->data); - ret->data = s; - ret->type = V_ASN1_BIT_STRING; - if (a != NULL) { - (*a) = ret; + if (!ASN1_STRING_set(out, CBS_data(&cbs), CBS_len(&cbs))) { + return 0; } - *pp = p; + + out->type = V_ASN1_BIT_STRING; + // |ASN1_STRING_FLAG_BITS_LEFT| and the bottom 3 bits encode |padding|. + out->flags &= ~0x07; + out->flags |= ASN1_STRING_FLAG_BITS_LEFT | padding; + return 1; +} + +ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, + const unsigned char **pp, long len) { + if (len < 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_SHORT); + return nullptr; + } + + ASN1_BIT_STRING *ret = nullptr; + if (a == nullptr || *a == nullptr) { + if ((ret = ASN1_BIT_STRING_new()) == nullptr) { + return nullptr; + } + } else { + ret = *a; + } + + if (!asn1_parse_bit_string_contents(bssl::Span(*pp, len), ret)) { + if (ret != nullptr && (a == nullptr || *a != ret)) { + ASN1_BIT_STRING_free(ret); + } + return nullptr; + } + + if (a != nullptr) { + *a = ret; + } + *pp += len; return ret; -err: - if ((ret != NULL) && ((a == NULL) || (*a != ret))) { - ASN1_BIT_STRING_free(ret); +} + +int asn1_parse_bit_string(CBS *cbs, ASN1_BIT_STRING *out, CBS_ASN1_TAG tag) { + tag = tag == 0 ? CBS_ASN1_BITSTRING : tag; + CBS child; + if (!CBS_get_asn1(cbs, &child, tag)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; } - return NULL; + return asn1_parse_bit_string_contents(child, out); +} + +int asn1_parse_bit_string_with_bad_length(CBS *cbs, ASN1_BIT_STRING *out) { + CBS child; + CBS_ASN1_TAG tag; + size_t header_len; + int indefinite; + if (!CBS_get_any_ber_asn1_element(cbs, &child, &tag, &header_len, + /*out_ber_found=*/nullptr, + &indefinite) || + tag != CBS_ASN1_BITSTRING || indefinite || // + !CBS_skip(&child, header_len)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + return asn1_parse_bit_string_contents(child, out); } // These next 2 functions from Goetz Babin-Ebell @@ -194,22 +215,22 @@ int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value) { v = 0; } - if (a == NULL) { + if (a == nullptr) { return 0; } a->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); // clear, set on write - if ((a->length < (w + 1)) || (a->data == NULL)) { + if ((a->length < (w + 1)) || (a->data == nullptr)) { if (!value) { return 1; // Don't need to set } - if (a->data == NULL) { + if (a->data == nullptr) { c = (unsigned char *)OPENSSL_malloc(w + 1); } else { c = (unsigned char *)OPENSSL_realloc(a->data, w + 1); } - if (c == NULL) { + if (c == nullptr) { return 0; } if (w + 1 - a->length > 0) { @@ -230,7 +251,7 @@ int ASN1_BIT_STRING_get_bit(const ASN1_BIT_STRING *a, int n) { w = n / 8; v = 1 << (7 - (n & 0x07)); - if ((a == NULL) || (a->length < (w + 1)) || (a->data == NULL)) { + if ((a == nullptr) || (a->length < (w + 1)) || (a->data == nullptr)) { return 0; } return ((a->data[w] & v) != 0); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_bool.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_bool.cc index 7869e694ed..9294688488 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_bool.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_bool.cc @@ -21,13 +21,10 @@ int i2d_ASN1_BOOLEAN(ASN1_BOOLEAN a, unsigned char **outp) { - CBB cbb; - if (!CBB_init(&cbb, 3) || // - !CBB_add_asn1_bool(&cbb, a != ASN1_BOOLEAN_FALSE)) { - CBB_cleanup(&cbb); - return -1; - } - return CBB_finish_i2d(&cbb, outp); + return bssl::I2DFromCBB( + /*initial_capacity=*/3, outp, [&](CBB *cbb) -> bool { + return CBB_add_asn1_bool(cbb, a != ASN1_BOOLEAN_FALSE); + }); } ASN1_BOOLEAN d2i_ASN1_BOOLEAN(ASN1_BOOLEAN *out, const unsigned char **inp, @@ -45,7 +42,7 @@ ASN1_BOOLEAN d2i_ASN1_BOOLEAN(ASN1_BOOLEAN *out, const unsigned char **inp, } ASN1_BOOLEAN ret = val ? ASN1_BOOLEAN_TRUE : ASN1_BOOLEAN_FALSE; - if (out != NULL) { + if (out != nullptr) { *out = ret; } *inp = CBS_data(&cbs); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_d2i_fp.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_d2i_fp.cc index 66bf8d4131..36eee341e2 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_d2i_fp.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_d2i_fp.cc @@ -27,7 +27,7 @@ void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x) { // Historically, this function did not impose a limit in OpenSSL and is used // to read CRLs, so we leave this without an external bound. if (!BIO_read_asn1(in, &data, &len, INT_MAX)) { - return NULL; + return nullptr; } const uint8_t *ptr = data; void *ret = ASN1_item_d2i(reinterpret_cast(x), &ptr, len, it); @@ -37,9 +37,9 @@ void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x) { void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x) { BIO *b = BIO_new_fp(in, BIO_NOCLOSE); - if (b == NULL) { + if (b == nullptr) { OPENSSL_PUT_ERROR(ASN1, ERR_R_BUF_LIB); - return NULL; + return nullptr; } void *ret = ASN1_item_d2i_bio(it, b, x); BIO_free(b); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_dup.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_dup.cc index df2b9be82c..b98a0e8d73 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_dup.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_dup.cc @@ -22,21 +22,21 @@ // directly dup the underlying structure instead of doing and encode and // decode. void *ASN1_item_dup(const ASN1_ITEM *it, void *x) { - unsigned char *b = NULL; + unsigned char *b = nullptr; const unsigned char *p; long i; void *ret; - if (x == NULL) { - return NULL; + if (x == nullptr) { + return nullptr; } i = ASN1_item_i2d(reinterpret_cast(x), &b, it); - if (b == NULL) { - return NULL; + if (b == nullptr) { + return nullptr; } p = b; - ret = ASN1_item_d2i(NULL, &p, i, it); + ret = ASN1_item_d2i(nullptr, &p, i, it); OPENSSL_free(b); return ret; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_gentm.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_gentm.cc index f3b2faec77..56b6ba47ce 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_gentm.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_gentm.cc @@ -36,19 +36,36 @@ int asn1_generalizedtime_to_tm(struct tm *tm, const ASN1_GENERALIZEDTIME *d) { return 1; } +int asn1_parse_generalized_time(CBS *cbs, ASN1_GENERALIZEDTIME *out, + CBS_ASN1_TAG tag) { + tag = tag == 0 ? CBS_ASN1_GENERALIZEDTIME : tag; + CBS child; + if (!CBS_get_asn1(cbs, &child, tag) || + !CBS_parse_generalized_time(&child, nullptr, + /*allow_timezone_offset=*/0)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + if (!ASN1_STRING_set(out, CBS_data(&child), CBS_len(&child))) { + return 0; + } + out->type = V_ASN1_GENERALIZEDTIME; + return 1; +} + int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *d) { - return asn1_generalizedtime_to_tm(NULL, d); + return asn1_generalizedtime_to_tm(nullptr, d); } int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str) { size_t len = strlen(str); CBS cbs; CBS_init(&cbs, (const uint8_t *)str, len); - if (!CBS_parse_generalized_time(&cbs, /*out_tm=*/NULL, + if (!CBS_parse_generalized_time(&cbs, /*out_tm=*/nullptr, /*allow_timezone_offset=*/0)) { return 0; } - if (s != NULL) { + if (s != nullptr) { if (!ASN1_STRING_set(s, str, len)) { return 0; } @@ -68,18 +85,18 @@ ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, long offset_sec) { struct tm data; if (!OPENSSL_posix_to_tm(posix_time, &data)) { - return NULL; + return nullptr; } if (offset_day || offset_sec) { if (!OPENSSL_gmtime_adj(&data, offset_day, offset_sec)) { - return NULL; + return nullptr; } } if (data.tm_year < 0 - 1900 || data.tm_year > 9999 - 1900) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_TIME_VALUE); - return NULL; + return nullptr; } char buf[16]; @@ -90,11 +107,11 @@ ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, BSSL_CHECK(ret == static_cast(sizeof(buf) - 1)); int free_s = 0; - if (s == NULL) { + if (s == nullptr) { free_s = 1; s = ASN1_UTCTIME_new(); - if (s == NULL) { - return NULL; + if (s == nullptr) { + return nullptr; } } @@ -102,7 +119,7 @@ ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, if (free_s) { ASN1_UTCTIME_free(s); } - return NULL; + return nullptr; } s->type = V_ASN1_GENERALIZEDTIME; return s; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_i2d_fp.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_i2d_fp.cc index fcde9fb72f..30385cf545 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_i2d_fp.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_i2d_fp.cc @@ -19,9 +19,9 @@ #include -int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x) { +int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, const void *x) { BIO *b = BIO_new_fp(out, BIO_NOCLOSE); - if (b == NULL) { + if (b == nullptr) { OPENSSL_PUT_ERROR(ASN1, ERR_R_BUF_LIB); return 0; } @@ -30,10 +30,11 @@ int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x) { return ret; } -int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x) { - unsigned char *b = NULL; - int n = ASN1_item_i2d(reinterpret_cast(x), &b, it); - if (b == NULL) { +int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, const void *x) { + unsigned char *b = nullptr; + int n = ASN1_item_i2d(reinterpret_cast(const_cast(x)), + &b, it); + if (b == nullptr) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_int.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_int.cc index e6417055a6..5e6d3ff5c0 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_int.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_int.cc @@ -21,6 +21,7 @@ #include #include #include +#include #include "../internal.h" #include "internal.h" @@ -88,7 +89,7 @@ int asn1_marshal_integer(CBB *out, const ASN1_INTEGER *in, CBS_ASN1_TAG tag) { } int i2c_ASN1_INTEGER(const ASN1_INTEGER *in, unsigned char **outp) { - if (in == NULL) { + if (in == nullptr) { return 0; } @@ -128,7 +129,7 @@ int i2c_ASN1_INTEGER(const ASN1_INTEGER *in, unsigned char **outp) { } int len = (int)(pad + CBS_len(&cbs)); assert(len > 0); - if (outp == NULL) { + if (outp == nullptr) { return len; } @@ -146,32 +147,13 @@ int i2c_ASN1_INTEGER(const ASN1_INTEGER *in, unsigned char **outp) { return len; } -ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **out, const unsigned char **inp, - long len) { - // This function can handle lengths up to INT_MAX - 1, but the rest of the - // legacy ASN.1 code mixes integer types, so avoid exposing it to - // ASN1_INTEGERS with larger lengths. - if (len < 0 || len > INT_MAX / 2) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_TOO_LONG); - return NULL; - } - - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); +static int asn1_parse_integer_contents(bssl::Span in, + ASN1_INTEGER *out) { + CBS cbs = in; int is_negative; if (!CBS_is_valid_asn1_integer(&cbs, &is_negative)) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_INTEGER); - return NULL; - } - - ASN1_INTEGER *ret = NULL; - if (out == NULL || *out == NULL) { - ret = ASN1_INTEGER_new(); - if (ret == NULL) { - return NULL; - } - } else { - ret = *out; + return 0; } // Convert to |ASN1_INTEGER|'s sign-and-magnitude representation. First, @@ -192,33 +174,75 @@ ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **out, const unsigned char **inp, } } - if (!ASN1_STRING_set(ret, CBS_data(&cbs), CBS_len(&cbs))) { - goto err; + if (!ASN1_STRING_set(out, CBS_data(&cbs), CBS_len(&cbs))) { + return 0; } if (is_negative) { - ret->type = V_ASN1_NEG_INTEGER; - negate_twos_complement(ret->data, ret->length); + out->type = V_ASN1_NEG_INTEGER; + negate_twos_complement(out->data, out->length); } else { - ret->type = V_ASN1_INTEGER; + out->type = V_ASN1_INTEGER; } // The value should be minimally-encoded. - assert(ret->length == 0 || ret->data[0] != 0); + assert(out->length == 0 || out->data[0] != 0); // Zero is not negative. - assert(!is_negative || ret->length > 0); + assert(!is_negative || out->length > 0); + return 1; +} + +int asn1_parse_integer(CBS *cbs, ASN1_INTEGER *out, CBS_ASN1_TAG tag) { + tag = tag == 0 ? CBS_ASN1_INTEGER : tag; + CBS child; + if (!CBS_get_asn1(cbs, &child, tag)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + return asn1_parse_integer_contents(child, out); +} + +int asn1_parse_enumerated(CBS *cbs, ASN1_ENUMERATED *out, CBS_ASN1_TAG tag) { + tag = tag == 0 ? CBS_ASN1_ENUMERATED : tag; + if (!asn1_parse_integer(cbs, out, tag)) { + return 0; + } + // Fix the type value. + out->type = + (out->type & V_ASN1_NEG) ? V_ASN1_NEG_ENUMERATED : V_ASN1_ENUMERATED; + return 1; +} + +ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **out, const unsigned char **inp, + long len) { + if (len < 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_SHORT); + return nullptr; + } + + ASN1_INTEGER *ret = nullptr; + if (out == nullptr || *out == nullptr) { + ret = ASN1_INTEGER_new(); + if (ret == nullptr) { + return nullptr; + } + } else { + ret = *out; + } + + if (!asn1_parse_integer_contents(bssl::Span(*inp, len), ret)) { + if (ret != nullptr && (out == nullptr || *out != ret)) { + ASN1_INTEGER_free(ret); + } + return nullptr; + } *inp += len; - if (out != NULL) { + if (out != nullptr) { *out = ret; } return ret; -err: - if (ret != NULL && (out == NULL || *out != ret)) { - ASN1_INTEGER_free(ret); - } - return NULL; } int ASN1_INTEGER_set_int64(ASN1_INTEGER *a, int64_t v) { @@ -350,7 +374,7 @@ int ASN1_ENUMERATED_get_int64(int64_t *out, const ASN1_ENUMERATED *a) { } static long asn1_string_get_long(const ASN1_STRING *a, int type) { - if (a == NULL) { + if (a == nullptr) { return 0; } @@ -376,13 +400,13 @@ long ASN1_ENUMERATED_get(const ASN1_ENUMERATED *a) { static ASN1_STRING *bn_to_asn1_string(const BIGNUM *bn, ASN1_STRING *ai, int type) { ASN1_INTEGER *ret; - if (ai == NULL) { + if (ai == nullptr) { ret = ASN1_STRING_type_new(type); } else { ret = ai; } int len; - if (ret == NULL) { + if (ret == nullptr) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); goto err; } @@ -394,7 +418,7 @@ static ASN1_STRING *bn_to_asn1_string(const BIGNUM *bn, ASN1_STRING *ai, } len = BN_num_bytes(bn); - if (!ASN1_STRING_set(ret, NULL, len) || + if (!ASN1_STRING_set(ret, nullptr, len) || !BN_bn2bin_padded(ret->data, len, bn)) { goto err; } @@ -404,7 +428,7 @@ err: if (ret != ai) { ASN1_STRING_free(ret); } - return NULL; + return nullptr; } ASN1_INTEGER *BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN1_INTEGER *ai) { @@ -418,11 +442,11 @@ ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(const BIGNUM *bn, ASN1_ENUMERATED *ai) { static BIGNUM *asn1_string_to_bn(const ASN1_STRING *ai, BIGNUM *bn, int type) { if ((ai->type & ~V_ASN1_NEG) != type) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_INTEGER_TYPE); - return NULL; + return nullptr; } BIGNUM *ret; - if ((ret = BN_bin2bn(ai->data, ai->length, bn)) == NULL) { + if ((ret = BN_bin2bn(ai->data, ai->length, bn)) == nullptr) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_BN_LIB); } else if (ai->type & V_ASN1_NEG) { BN_set_negative(ret, 1); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_mbstr.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_mbstr.cc index 7c64b1537f..ddea75ed0a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_mbstr.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_mbstr.cc @@ -184,7 +184,7 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, CBB cbb; CBB_zero(&cbb); // If both the same type just copy across - uint8_t *data = NULL; + uint8_t *data = nullptr; size_t data_len = 0; if (inform == outform) { if (!ASN1_STRING_set(dest, in, len)) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_object.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_object.cc index a4ede8a6c0..fabd918733 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_object.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_object.cc @@ -27,26 +27,27 @@ #include "internal.h" -int i2d_ASN1_OBJECT(const ASN1_OBJECT *in, unsigned char **outp) { - if (in == NULL) { +int asn1_marshal_object(CBB *out, const ASN1_OBJECT *in, CBS_ASN1_TAG tag) { + if (in == nullptr) { OPENSSL_PUT_ERROR(ASN1, ERR_R_PASSED_NULL_PARAMETER); - return -1; + return 0; } if (in->length <= 0) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OBJECT); - return -1; + return 0; } - CBB cbb, child; - if (!CBB_init(&cbb, (size_t)in->length + 2) || - !CBB_add_asn1(&cbb, &child, CBS_ASN1_OBJECT) || - !CBB_add_bytes(&child, in->data, in->length)) { - CBB_cleanup(&cbb); - return -1; - } + tag = tag == 0 ? CBS_ASN1_OBJECT : tag; + return CBB_add_asn1_element(out, tag, in->data, in->length); +} - return CBB_finish_i2d(&cbb, outp); +int i2d_ASN1_OBJECT(const ASN1_OBJECT *in, unsigned char **outp) { + return bssl::I2DFromCBB( + /*initial_capacity=*/static_cast(in->length) + 2, outp, + [&](CBB *cbb) -> bool { + return asn1_marshal_object(cbb, in, /*tag=*/0); + }); } int i2t_ASN1_OBJECT(char *buf, int buf_len, const ASN1_OBJECT *a) { @@ -63,17 +64,17 @@ static int write_str(BIO *bp, const char *str) { } int i2a_ASN1_OBJECT(BIO *bp, const ASN1_OBJECT *a) { - if (a == NULL || a->data == NULL) { + if (a == nullptr || a->data == nullptr) { return write_str(bp, "NULL"); } - char buf[80], *allocated = NULL; + char buf[80], *allocated = nullptr; const char *str = buf; int len = i2t_ASN1_OBJECT(buf, sizeof(buf), a); if (len > (int)sizeof(buf) - 1) { // The input was truncated. Allocate a buffer that fits. allocated = reinterpret_cast(OPENSSL_malloc(len + 1)); - if (allocated == NULL) { + if (allocated == nullptr) { return -1; } len = i2t_ASN1_OBJECT(allocated, len + 1, a); @@ -90,83 +91,78 @@ int i2a_ASN1_OBJECT(BIO *bp, const ASN1_OBJECT *a) { ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **out, const unsigned char **inp, long len) { - if (len < 0) { - return NULL; - } - - CBS cbs, child; - CBS_init(&cbs, *inp, (size_t)len); - if (!CBS_get_asn1(&cbs, &child, CBS_ASN1_OBJECT)) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); - return NULL; - } - - const uint8_t *contents = CBS_data(&child); - ASN1_OBJECT *ret = c2i_ASN1_OBJECT(out, &contents, CBS_len(&child)); - if (ret != NULL) { - // |c2i_ASN1_OBJECT| should have consumed the entire input. - assert(CBS_data(&cbs) == contents); - *inp = CBS_data(&cbs); - } - return ret; + return bssl::D2IFromCBS(out, inp, len, [](CBS *cbs) -> ASN1_OBJECT * { + CBS child; + if (!CBS_get_asn1(cbs, &child, CBS_ASN1_OBJECT)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return nullptr; + } + const uint8_t *contents = CBS_data(&child); + return c2i_ASN1_OBJECT(nullptr, &contents, CBS_len(&child)); + }); } ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **out, const unsigned char **inp, long len) { - if (len < 0) { + return bssl::D2IFromCBS(out, inp, len, [](CBS *cbs) -> ASN1_OBJECT * { + if (!CBS_is_valid_asn1_oid(cbs)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_OBJECT_ENCODING); + return nullptr; + } + ASN1_OBJECT *ret = + ASN1_OBJECT_create(NID_undef, CBS_data(cbs), CBS_len(cbs), + /*sn=*/nullptr, /*ln=*/nullptr); + if (ret != nullptr) { + // |c2i_ASN1_OBJECT| consumes its whole input on success. + BSSL_CHECK(CBS_skip(cbs, CBS_len(cbs))); + } + return ret; + }); +} + +ASN1_OBJECT *asn1_parse_object(CBS *cbs, CBS_ASN1_TAG tag) { + tag = tag == 0 ? CBS_ASN1_OBJECT : tag; + CBS child; + if (!CBS_get_asn1(cbs, &child, tag)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return nullptr; + } + if (!CBS_is_valid_asn1_oid(&child)) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_OBJECT_ENCODING); - return NULL; + return nullptr; } - - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - if (!CBS_is_valid_asn1_oid(&cbs)) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_OBJECT_ENCODING); - return NULL; - } - - ASN1_OBJECT *ret = ASN1_OBJECT_create(NID_undef, *inp, (size_t)len, - /*sn=*/NULL, /*ln=*/NULL); - if (ret == NULL) { - return NULL; - } - - if (out != NULL) { - ASN1_OBJECT_free(*out); - *out = ret; - } - *inp += len; // All bytes were consumed. - return ret; + return ASN1_OBJECT_create(NID_undef, CBS_data(&child), CBS_len(&child), + /*sn=*/nullptr, /*ln=*/nullptr); } ASN1_OBJECT *ASN1_OBJECT_new(void) { ASN1_OBJECT *ret; ret = (ASN1_OBJECT *)OPENSSL_malloc(sizeof(ASN1_OBJECT)); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->length = 0; - ret->data = NULL; + ret->data = nullptr; ret->nid = 0; - ret->sn = NULL; - ret->ln = NULL; + ret->sn = nullptr; + ret->ln = nullptr; ret->flags = ASN1_OBJECT_FLAG_DYNAMIC; return ret; } void ASN1_OBJECT_free(ASN1_OBJECT *a) { - if (a == NULL) { + if (a == nullptr) { return; } if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC_STRINGS) { OPENSSL_free((void *)a->sn); OPENSSL_free((void *)a->ln); - a->sn = a->ln = NULL; + a->sn = a->ln = nullptr; } if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC_DATA) { OPENSSL_free((void *)a->data); - a->data = NULL; + a->data = nullptr; a->length = 0; } if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC) { @@ -178,7 +174,7 @@ ASN1_OBJECT *ASN1_OBJECT_create(int nid, const unsigned char *data, size_t len, const char *sn, const char *ln) { if (len > INT_MAX) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_LONG); - return NULL; + return nullptr; } ASN1_OBJECT o; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_strex.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_strex.cc index a2d5e2cb7f..3c9978abc0 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_strex.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_strex.cc @@ -36,7 +36,7 @@ static int maybe_write(BIO *out, const void *buf, int len) { // If |out| is NULL, ignore the output but report the length. - return out == NULL || BIO_write(out, buf, len) == len; + return out == nullptr || BIO_write(out, buf, len) == len; } static int is_control_character(unsigned char c) { return c < 32 || c == 127; } @@ -65,7 +65,7 @@ static int do_esc_char(uint32_t c, unsigned long flags, char *do_quotes, (is_last && (c == ' '))) { if (flags & ASN1_STRFLGS_ESC_QUOTE) { // No need to escape, just tell the caller to quote. - if (do_quotes != NULL) { + if (do_quotes != nullptr) { *do_quotes = 1; } return maybe_write(out, &u8, 1) ? 1 : -1; @@ -199,7 +199,7 @@ static int do_dump(unsigned long flags, BIO *out, const ASN1_STRING *str) { ASN1_TYPE t; OPENSSL_memset(&t, 0, sizeof(ASN1_TYPE)); asn1_type_set0_string(&t, (ASN1_STRING *)str); - unsigned char *der_buf = NULL; + unsigned char *der_buf = nullptr; int der_len = i2d_ASN1_TYPE(&t, &der_buf); if (der_len < 0) { return -1; @@ -281,7 +281,7 @@ int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, // Measure the length. char quotes = 0; - int len = do_buf(str->data, str->length, encoding, flags, "es, NULL); + int len = do_buf(str->data, str->length, encoding, flags, "es, nullptr); if (len < 0) { return -1; } @@ -295,7 +295,7 @@ int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, // Encode the value. if ((quotes && !maybe_write(out, "\"", 1)) || - do_buf(str->data, str->length, encoding, flags, NULL, out) < 0 || + do_buf(str->data, str->length, encoding, flags, nullptr, out) < 0 || (quotes && !maybe_write(out, "\"", 1))) { return -1; } @@ -304,12 +304,12 @@ int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, int ASN1_STRING_print_ex_fp(FILE *fp, const ASN1_STRING *str, unsigned long flags) { - BIO *bio = NULL; - if (fp != NULL) { + BIO *bio = nullptr; + if (fp != nullptr) { // If |fp| is NULL, this function returns the number of bytes without // writing. bio = BIO_new_fp(fp, BIO_NOCLOSE); - if (bio == NULL) { + if (bio == nullptr) { return -1; } } @@ -328,7 +328,7 @@ int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in) { return -1; } ASN1_STRING stmp, *str = &stmp; - stmp.data = NULL; + stmp.data = nullptr; stmp.length = 0; stmp.flags = 0; int ret = @@ -345,7 +345,7 @@ int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v) { char buf[80]; const char *p; - if (v == NULL) { + if (v == nullptr) { return 0; } n = 0; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_strnid.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_strnid.cc index c2a0c27dab..13cf951786 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_strnid.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_strnid.cc @@ -18,6 +18,8 @@ #include #include +#include + #include #include #include @@ -29,7 +31,7 @@ DEFINE_LHASH_OF(ASN1_STRING_TABLE) -static LHASH_OF(ASN1_STRING_TABLE) *string_tables = NULL; +static LHASH_OF(ASN1_STRING_TABLE) *string_tables = nullptr; static CRYPTO_MUTEX string_tables_lock = CRYPTO_MUTEX_INIT; void ASN1_STRING_set_default_mask(unsigned long mask) {} @@ -46,13 +48,13 @@ static const ASN1_STRING_TABLE *asn1_string_table_get(int nid); ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, const unsigned char *in, ossl_ssize_t len, int inform, int nid) { - ASN1_STRING *str = NULL; + ASN1_STRING *str = nullptr; int ret; if (!out) { out = &str; } const ASN1_STRING_TABLE *tbl = asn1_string_table_get(nid); - if (tbl != NULL) { + if (tbl != nullptr) { unsigned long mask = tbl->mask; if (!(tbl->flags & STABLE_NO_MASK)) { mask &= B_ASN1_UTF8STRING; @@ -63,7 +65,7 @@ ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, const unsigned char *in, ret = ASN1_mbstring_copy(out, in, len, inform, B_ASN1_UTF8STRING); } if (ret <= 0) { - return NULL; + return nullptr; } return *out; } @@ -129,14 +131,14 @@ static const ASN1_STRING_TABLE *asn1_string_table_get(int nid) { ASN1_STRING_TABLE key; key.nid = nid; const ASN1_STRING_TABLE *tbl = reinterpret_cast( - bsearch(&key, tbl_standard, OPENSSL_ARRAY_SIZE(tbl_standard), + bsearch(&key, tbl_standard, std::size(tbl_standard), sizeof(ASN1_STRING_TABLE), table_cmp_void)); - if (tbl != NULL) { + if (tbl != nullptr) { return tbl; } CRYPTO_MUTEX_lock_read(&string_tables_lock); - if (string_tables != NULL) { + if (string_tables != nullptr) { tbl = lh_ASN1_STRING_TABLE_retrieve(string_tables, &key); } CRYPTO_MUTEX_unlock_read(&string_tables_lock); @@ -149,7 +151,7 @@ static const ASN1_STRING_TABLE *asn1_string_table_get(int nid) { int ASN1_STRING_TABLE_add(int nid, long minsize, long maxsize, unsigned long mask, unsigned long flags) { // Existing entries cannot be overwritten. - if (asn1_string_table_get(nid) != NULL) { + if (asn1_string_table_get(nid) != nullptr) { OPENSSL_PUT_ERROR(ASN1, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } @@ -157,10 +159,10 @@ int ASN1_STRING_TABLE_add(int nid, long minsize, long maxsize, int ret = 0; CRYPTO_MUTEX_lock_write(&string_tables_lock); - ASN1_STRING_TABLE *tbl = NULL; - if (string_tables == NULL) { + ASN1_STRING_TABLE *tbl = nullptr; + if (string_tables == nullptr) { string_tables = lh_ASN1_STRING_TABLE_new(table_hash, table_cmp); - if (string_tables == NULL) { + if (string_tables == nullptr) { goto err; } } else { @@ -168,7 +170,7 @@ int ASN1_STRING_TABLE_add(int nid, long minsize, long maxsize, // unlocked. ASN1_STRING_TABLE key; key.nid = nid; - if (lh_ASN1_STRING_TABLE_retrieve(string_tables, &key) != NULL) { + if (lh_ASN1_STRING_TABLE_retrieve(string_tables, &key) != nullptr) { OPENSSL_PUT_ERROR(ASN1, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); goto err; } @@ -176,7 +178,7 @@ int ASN1_STRING_TABLE_add(int nid, long minsize, long maxsize, tbl = reinterpret_cast( OPENSSL_malloc(sizeof(ASN1_STRING_TABLE))); - if (tbl == NULL) { + if (tbl == nullptr) { goto err; } tbl->nid = nid; @@ -189,7 +191,7 @@ int ASN1_STRING_TABLE_add(int nid, long minsize, long maxsize, OPENSSL_free(tbl); goto err; } - assert(old_tbl == NULL); + assert(old_tbl == nullptr); ret = 1; err: @@ -202,5 +204,5 @@ void ASN1_STRING_TABLE_cleanup(void) {} void asn1_get_string_table_for_testing(const ASN1_STRING_TABLE **out_ptr, size_t *out_len) { *out_ptr = tbl_standard; - *out_len = OPENSSL_ARRAY_SIZE(tbl_standard); + *out_len = std::size(tbl_standard); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_time.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_time.cc index 46785f64c5..af240a9ece 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_time.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_time.cc @@ -51,11 +51,11 @@ ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, int64_t posix_time, int offset_day, if (!OPENSSL_posix_to_tm(posix_time, &tm)) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ERROR_GETTING_TIME); - return NULL; + return nullptr; } if (offset_day || offset_sec) { if (!OPENSSL_gmtime_adj(&tm, offset_day, offset_sec)) { - return NULL; + return nullptr; } } if (fits_in_utc_time(&tm)) { @@ -77,10 +77,10 @@ int ASN1_TIME_check(const ASN1_TIME *t) { ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(const ASN1_TIME *in, ASN1_GENERALIZEDTIME **out) { if (!ASN1_TIME_check(in)) { - return NULL; + return nullptr; } - ASN1_GENERALIZEDTIME *ret = NULL; + ASN1_GENERALIZEDTIME *ret = nullptr; if (!out || !*out) { if (!(ret = ASN1_GENERALIZEDTIME_new())) { goto err; @@ -97,8 +97,8 @@ ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(const ASN1_TIME *in, goto done; } - // Grow the string to accomodate the two-digit century. - if (!ASN1_STRING_set(ret, NULL, in->length + 2)) { + // Grow the string to accommodate the two-digit century. + if (!ASN1_STRING_set(ret, nullptr, in->length + 2)) { goto err; } @@ -116,16 +116,16 @@ ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(const ASN1_TIME *in, } done: - if (out != NULL && *out == NULL) { + if (out != nullptr && *out == nullptr) { *out = ret; } return ret; err: - if (out == NULL || *out != ret) { + if (out == nullptr || *out != ret) { ASN1_GENERALIZEDTIME_free(ret); } - return NULL; + return nullptr; } int ASN1_TIME_set_string(ASN1_TIME *s, const char *str) { @@ -138,7 +138,7 @@ int ASN1_TIME_set_string_X509(ASN1_TIME *s, const char *str) { CBS_init(&cbs, (const uint8_t *)str, strlen(str)); int type; struct tm tm; - if (CBS_parse_utc_time(&cbs, /*out_tm=*/NULL, + if (CBS_parse_utc_time(&cbs, /*out_tm=*/nullptr, /*allow_timezone_offset=*/0)) { type = V_ASN1_UTCTIME; } else if (CBS_parse_generalized_time(&cbs, &tm, @@ -152,7 +152,7 @@ int ASN1_TIME_set_string_X509(ASN1_TIME *s, const char *str) { return 0; } - if (s != NULL) { + if (s != nullptr) { if (!ASN1_STRING_set(s, CBS_data(&cbs), CBS_len(&cbs))) { return 0; } @@ -163,8 +163,8 @@ int ASN1_TIME_set_string_X509(ASN1_TIME *s, const char *str) { static int asn1_time_to_tm(struct tm *tm, const ASN1_TIME *t, int allow_timezone_offset) { - if (t == NULL) { - if (OPENSSL_posix_to_tm(time(NULL), tm)) { + if (t == nullptr) { + if (OPENSSL_posix_to_tm(time(nullptr), tm)) { return 1; } return 0; @@ -222,3 +222,19 @@ int ASN1_TIME_to_posix(const ASN1_TIME *t, int64_t *out_time) { } return OPENSSL_tm_to_posix(&tm, out_time); } + +int asn1_parse_time(CBS *cbs, ASN1_TIME *out, int allow_utc_timezone_offset) { + if (CBS_peek_asn1_tag(cbs, CBS_ASN1_UTCTIME)) { + return asn1_parse_utc_time(cbs, out, /*tag=*/0, allow_utc_timezone_offset); + } + return asn1_parse_generalized_time(cbs, out, /*tag=*/0); +} + +int asn1_marshal_time(CBB *cbb, const ASN1_TIME *in) { + if (in->type != V_ASN1_UTCTIME && in->type != V_ASN1_GENERALIZEDTIME) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE); + return 0; + } + return asn1_marshal_octet_string(cbb, in, + static_cast(in->type)); +} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_type.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_type.cc index 92e9ede52e..c6f066fdae 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_type.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_type.cc @@ -16,6 +16,7 @@ #include +#include #include #include #include @@ -29,18 +30,18 @@ int ASN1_TYPE_get(const ASN1_TYPE *a) { case V_ASN1_BOOLEAN: return a->type; case V_ASN1_OBJECT: - return a->value.object != NULL ? a->type : 0; + return a->value.object != nullptr ? a->type : 0; default: - return a->value.asn1_string != NULL ? a->type : 0; + return a->value.asn1_string != nullptr ? a->type : 0; } } const void *asn1_type_value_as_pointer(const ASN1_TYPE *a) { switch (a->type) { case V_ASN1_NULL: - return NULL; + return nullptr; case V_ASN1_BOOLEAN: - return a->value.boolean ? (void *)0xff : NULL; + return a->value.boolean ? (void *)0xff : nullptr; case V_ASN1_OBJECT: return a->value.object; default: @@ -68,18 +69,18 @@ void asn1_type_set0_string(ASN1_TYPE *a, ASN1_STRING *str) { void asn1_type_cleanup(ASN1_TYPE *a) { switch (a->type) { case V_ASN1_NULL: - a->value.ptr = NULL; + a->value.ptr = nullptr; break; case V_ASN1_BOOLEAN: a->value.boolean = ASN1_BOOLEAN_NONE; break; case V_ASN1_OBJECT: ASN1_OBJECT_free(a->value.object); - a->value.object = NULL; + a->value.object = nullptr; break; default: ASN1_STRING_free(a->value.asn1_string); - a->value.asn1_string = NULL; + a->value.asn1_string = nullptr; break; } } @@ -89,7 +90,7 @@ void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value) { a->type = type; switch (type) { case V_ASN1_NULL: - a->value.ptr = NULL; + a->value.ptr = nullptr; break; case V_ASN1_BOOLEAN: a->value.boolean = value ? ASN1_BOOLEAN_TRUE : ASN1_BOOLEAN_FALSE; @@ -170,3 +171,263 @@ int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b) { return result; } + +int asn1_parse_any(CBS *cbs, ASN1_TYPE *out) { + CBS_ASN1_TAG tag; + CBS elem; + size_t header_len; + if (!CBS_get_any_asn1_element(cbs, &elem, &tag, &header_len)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + + // Handle the non-string types. + if (tag == CBS_ASN1_OBJECT) { + bssl::UniquePtr obj(asn1_parse_object(&elem, /*tag=*/0)); + if (obj == nullptr) { + return 0; + } + ASN1_TYPE_set(out, V_ASN1_OBJECT, obj.release()); + return 1; + } + if (tag == CBS_ASN1_NULL) { + if (CBS_len(&elem) != header_len) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + ASN1_TYPE_set(out, V_ASN1_NULL, nullptr); + return 1; + } + if (tag == CBS_ASN1_BOOLEAN) { + int b; + if (!CBS_get_asn1_bool(&elem, &b)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + // V_ASN1_BOOLEAN will interpret the pointer as null for false and any + // arbitrary non-null pointer for true. + ASN1_TYPE_set(out, V_ASN1_BOOLEAN, b ? out : nullptr); + return 1; + } + + // All other cases are handled identically to the string-based ANY parser. + bssl::UniquePtr str(ASN1_STRING_new()); + if (str == nullptr || !asn1_parse_any_as_string(&elem, str.get())) { + return 0; + } + asn1_type_set0_string(out, str.release()); + return 1; +} + +int asn1_parse_any_as_string(CBS *cbs, ASN1_STRING *out) { + CBS_ASN1_TAG tag; + CBS elem; + size_t header_len; + if (!CBS_get_any_asn1_element(cbs, &elem, &tag, &header_len)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + + // Reject unexpectedly constructed or primitive universal types, rather than + // encoding them as an opaque |V_ASN1_OTHER|. As of X.680 (02/2021), tag + // numbers 0-36 have been allocated, except 15. Of these, only 8 (EXTERNAL), + // 11 (EMBEDDED PDV), 16 (SEQUENCE), 17 (SET), and 29 (CHARACTER STRING) are + // constructed. + const CBS_ASN1_TAG tag_class = (tag & CBS_ASN1_CLASS_MASK); + const CBS_ASN1_TAG number = tag & CBS_ASN1_TAG_NUMBER_MASK; + if (tag_class == CBS_ASN1_UNIVERSAL && number <= 36 && number != 15) { + const bool is_constructed = (tag & CBS_ASN1_CONSTRUCTED) != 0; + if (number == V_ASN1_EXTERNAL || number == 11 /* EMBEDDED PDV */ || + number == V_ASN1_SEQUENCE || number == V_ASN1_SET || + number == 29 /* CHARACTER STRING*/) { + if (!is_constructed) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_CONSTRUCTED); + return 0; + } + } else { + if (is_constructed) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE); + return 0; + } + } + } + + // Historically, parsing high universal tag numbers made OpenSSL's + // |ASN1_STRING| representation ambiguous. We've since fixed this with + // |V_ASN1_OTHER| but, for now, continue to enforce the limit. + if (tag_class == CBS_ASN1_UNIVERSAL && number > V_ASN1_MAX_UNIVERSAL) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + + // These types are just parsed as |V_ASN1_OTHER| here. Check the contents + // before the generic |V_ASN1_OTHER| path. + CBS body = elem; + BSSL_CHECK(CBS_skip(&body, header_len)); + switch (tag) { + case CBS_ASN1_OBJECT: + if (!CBS_is_valid_asn1_oid(&body)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_OBJECT_ENCODING); + return 0; + } + break; + case CBS_ASN1_NULL: + if (CBS_len(&body) != 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_NULL_IS_WRONG_LENGTH); + return 0; + } + break; + case CBS_ASN1_BOOLEAN: { + uint8_t v; + if (!CBS_get_u8(&body, &v) || CBS_len(&body) != 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_BOOLEAN_IS_WRONG_LENGTH); + return 0; + } + if (v != 0 && v != 0xff) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + break; + } + } + + switch (tag) { + case CBS_ASN1_INTEGER: + return asn1_parse_integer(&elem, out, tag); + case CBS_ASN1_ENUMERATED: + return asn1_parse_enumerated(&elem, out, tag); + case CBS_ASN1_BITSTRING: + return asn1_parse_bit_string(&elem, out, tag); + case CBS_ASN1_UNIVERSALSTRING: + return asn1_parse_universal_string(&elem, out, tag); + case CBS_ASN1_BMPSTRING: + return asn1_parse_bmp_string(&elem, out, tag); + case CBS_ASN1_UTF8STRING: + return asn1_parse_utf8_string(&elem, out, tag); + case CBS_ASN1_UTCTIME: + // TODO(crbug.com/42290221): Reject timezone offsets here. We have no + // known cases where UTCTime inside ANY needs accept invalid timezones. + return asn1_parse_utc_time(&elem, out, tag, /*allow_timezone_offset=*/1); + case CBS_ASN1_GENERALIZEDTIME: + return asn1_parse_generalized_time(&elem, out, tag); + case CBS_ASN1_OCTETSTRING: + case CBS_ASN1_T61STRING: + case CBS_ASN1_IA5STRING: + case CBS_ASN1_NUMERICSTRING: + case CBS_ASN1_PRINTABLESTRING: + case CBS_ASN1_VIDEOTEXSTRING: + case CBS_ASN1_GRAPHICSTRING: + case CBS_ASN1_VISIBLESTRING: + case CBS_ASN1_GENERALSTRING: + // T61String is parsed as Latin-1, so all byte strings are valid. The + // others we currently do not enforce. + // + // TODO(crbug.com/42290290): Enforce the encoding of the other string + // types. + if (!asn1_parse_octet_string(&elem, out, tag)) { + return 0; + } + out->type = static_cast(tag); + return 1; + default: + // All unrecognized types, or types that cannot be represented as + // |ASN1_STRING|, are represented as the whole element. + if (!ASN1_STRING_set(out, CBS_data(&elem), CBS_len(&elem))) { + return 0; + } + if (tag == CBS_ASN1_SEQUENCE) { + out->type = V_ASN1_SEQUENCE; + } else if (tag == CBS_ASN1_SET) { + out->type = V_ASN1_SET; + } else { + out->type = V_ASN1_OTHER; + } + return 1; + } +} + +static int asn1_marshal_string_with_type(CBB *out, const ASN1_STRING *in, + int type); + +int asn1_marshal_any(CBB *out, const ASN1_TYPE *in) { + switch (in->type) { + case V_ASN1_OBJECT: + return asn1_marshal_object(out, in->value.object, /*tag=*/0); + case V_ASN1_NULL: + return CBB_add_asn1_element(out, CBS_ASN1_NULL, nullptr, 0); + case V_ASN1_BOOLEAN: + return CBB_add_asn1_bool(out, in->value.boolean != ASN1_BOOLEAN_FALSE); + case V_ASN1_INTEGER: + case V_ASN1_ENUMERATED: + case V_ASN1_BIT_STRING: + case V_ASN1_OCTET_STRING: + case V_ASN1_NUMERICSTRING: + case V_ASN1_PRINTABLESTRING: + case V_ASN1_T61STRING: + case V_ASN1_VIDEOTEXSTRING: + case V_ASN1_IA5STRING: + case V_ASN1_UTCTIME: + case V_ASN1_GENERALIZEDTIME: + case V_ASN1_GRAPHICSTRING: + case V_ASN1_VISIBLESTRING: + case V_ASN1_GENERALSTRING: + case V_ASN1_UNIVERSALSTRING: + case V_ASN1_BMPSTRING: + case V_ASN1_UTF8STRING: + case V_ASN1_SEQUENCE: + case V_ASN1_SET: + case V_ASN1_OTHER: + // If |in->type| and the underlying |ASN1_STRING| type don't match, use + // |in->type|. See b/446993031. + return asn1_marshal_string_with_type(out, in->value.asn1_string, + in->type); + default: + // |ASN1_TYPE|s can have type -1 when default-constructed. + OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE); + return 0; + } +} + +static int asn1_marshal_string_with_type(CBB *out, const ASN1_STRING *in, + int type) { + switch (type) { + case V_ASN1_INTEGER: + case V_ASN1_NEG_INTEGER: + return asn1_marshal_integer(out, in, CBS_ASN1_INTEGER); + case V_ASN1_ENUMERATED: + case V_ASN1_NEG_ENUMERATED: + return asn1_marshal_integer(out, in, CBS_ASN1_ENUMERATED); + case V_ASN1_BIT_STRING: + return asn1_marshal_bit_string(out, in, /*tag=*/0); + case V_ASN1_OCTET_STRING: + case V_ASN1_NUMERICSTRING: + case V_ASN1_PRINTABLESTRING: + case V_ASN1_T61STRING: + case V_ASN1_VIDEOTEXSTRING: + case V_ASN1_IA5STRING: + case V_ASN1_UTCTIME: + case V_ASN1_GENERALIZEDTIME: + case V_ASN1_GRAPHICSTRING: + case V_ASN1_VISIBLESTRING: + case V_ASN1_GENERALSTRING: + case V_ASN1_UNIVERSALSTRING: + case V_ASN1_BMPSTRING: + case V_ASN1_UTF8STRING: + return asn1_marshal_octet_string(out, in, + static_cast(in->type)); + case V_ASN1_SEQUENCE: + case V_ASN1_SET: + case V_ASN1_OTHER: + // These three types store the whole TLV as contents. + return CBB_add_bytes(out, ASN1_STRING_get0_data(in), + ASN1_STRING_length(in)); + default: + // |ASN1_TYPE|s can have type -1 when default-constructed. + OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE); + return 0; + } +} + +int asn1_marshal_any_string(CBB *out, const ASN1_STRING *in) { + return asn1_marshal_string_with_type(out, in, in->type); +} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_utctm.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_utctm.cc index 5c9e359875..c45220cc78 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_utctm.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/a_utctm.cc @@ -37,8 +37,24 @@ int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d, return 1; } +int asn1_parse_utc_time(CBS *cbs, ASN1_UTCTIME *out, CBS_ASN1_TAG tag, + int allow_timezone_offset) { + tag = tag == 0 ? CBS_ASN1_UTCTIME : tag; + CBS child; + if (!CBS_get_asn1(cbs, &child, tag) || + !CBS_parse_utc_time(&child, nullptr, allow_timezone_offset)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + if (!ASN1_STRING_set(out, CBS_data(&child), CBS_len(&child))) { + return 0; + } + out->type = V_ASN1_UTCTIME; + return 1; +} + int ASN1_UTCTIME_check(const ASN1_UTCTIME *d) { - return asn1_utctime_to_tm(NULL, d, /*allow_timezone_offset=*/1); + return asn1_utctime_to_tm(nullptr, d, /*allow_timezone_offset=*/1); } int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str) { @@ -48,11 +64,11 @@ int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str) { size_t len = strlen(str); CBS cbs; CBS_init(&cbs, (const uint8_t *)str, len); - if (!CBS_parse_utc_time(&cbs, /*out_tm=*/NULL, + if (!CBS_parse_utc_time(&cbs, /*out_tm=*/nullptr, /*allow_timezone_offset=*/0)) { return 0; } - if (s != NULL) { + if (s != nullptr) { if (!ASN1_STRING_set(s, str, len)) { return 0; } @@ -69,17 +85,17 @@ ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, int64_t posix_time, int offset_day, long offset_sec) { struct tm data; if (!OPENSSL_posix_to_tm(posix_time, &data)) { - return NULL; + return nullptr; } if (offset_day || offset_sec) { if (!OPENSSL_gmtime_adj(&data, offset_day, offset_sec)) { - return NULL; + return nullptr; } } if (data.tm_year < 50 || data.tm_year >= 150) { - return NULL; + return nullptr; } char buf[14]; @@ -90,11 +106,11 @@ ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, int64_t posix_time, BSSL_CHECK(ret == static_cast(sizeof(buf) - 1)); int free_s = 0; - if (s == NULL) { + if (s == nullptr) { free_s = 1; s = ASN1_UTCTIME_new(); - if (s == NULL) { - return NULL; + if (s == nullptr) { + return nullptr; } } @@ -102,7 +118,7 @@ ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, int64_t posix_time, if (free_s) { ASN1_UTCTIME_free(s); } - return NULL; + return nullptr; } s->type = V_ASN1_UTCTIME; return s; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/asn1_lib.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/asn1_lib.cc index 517dda5ebd..c31c8c3fa9 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/asn1_lib.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/asn1_lib.cc @@ -201,9 +201,12 @@ int ASN1_object_size(int constructed, int length, int tag) { } int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str) { - if (str == NULL) { + if (str == nullptr) { return 0; } + if (dst == str) { + return 1; + } if (!ASN1_STRING_set(dst, str->data, str->length)) { return 0; } @@ -215,15 +218,15 @@ int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str) { ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *str) { ASN1_STRING *ret; if (!str) { - return NULL; + return nullptr; } ret = ASN1_STRING_new(); if (!ret) { - return NULL; + return nullptr; } if (!ASN1_STRING_copy(ret, str)) { ASN1_STRING_free(ret); - return NULL; + return nullptr; } return ret; } @@ -232,7 +235,7 @@ int ASN1_STRING_set(ASN1_STRING *str, const void *_data, ossl_ssize_t len_s) { const char *data = reinterpret_cast(_data); size_t len; if (len_s < 0) { - if (data == NULL) { + if (data == nullptr) { return 0; } len = strlen(data); @@ -246,21 +249,21 @@ int ASN1_STRING_set(ASN1_STRING *str, const void *_data, ossl_ssize_t len_s) { return 0; } - if (str->length <= (int)len || str->data == NULL) { + if (str->length <= (int)len || str->data == nullptr) { unsigned char *c = str->data; - if (c == NULL) { + if (c == nullptr) { str->data = reinterpret_cast(OPENSSL_malloc(len + 1)); } else { str->data = reinterpret_cast(OPENSSL_realloc(c, len + 1)); } - if (str->data == NULL) { + if (str->data == nullptr) { str->data = c; return 0; } } str->length = (int)len; - if (data != NULL) { + if (data != nullptr) { OPENSSL_memcpy(str->data, data, len); // Historically, OpenSSL would NUL-terminate most (but not all) // |ASN1_STRING|s, in case anyone accidentally passed |str->data| into a @@ -285,21 +288,31 @@ ASN1_STRING *ASN1_STRING_type_new(int type) { ASN1_STRING *ret; ret = (ASN1_STRING *)OPENSSL_malloc(sizeof(ASN1_STRING)); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->length = 0; ret->type = type; - ret->data = NULL; + ret->data = nullptr; ret->flags = 0; return ret; } +void asn1_string_init(ASN1_STRING *str, int type) { + OPENSSL_memset(str, 0, sizeof(ASN1_STRING)); + str->type = type; +} + +void asn1_string_cleanup(ASN1_STRING *str) { + OPENSSL_free(str->data); + str->data = nullptr; +} + void ASN1_STRING_free(ASN1_STRING *str) { - if (str == NULL) { + if (str == nullptr) { return; } - OPENSSL_free(str->data); + asn1_string_cleanup(str); OPENSSL_free(str); } @@ -353,3 +366,70 @@ unsigned char *ASN1_STRING_data(ASN1_STRING *str) { return str->data; } const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *str) { return str->data; } + +int asn1_parse_octet_string(CBS *cbs, ASN1_STRING *out, CBS_ASN1_TAG tag) { + tag = tag == 0 ? CBS_ASN1_OCTETSTRING : tag; + CBS child; + if (!CBS_get_asn1(cbs, &child, tag)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + if (!ASN1_STRING_set(out, CBS_data(&child), CBS_len(&child))) { + return 0; + } + out->type = V_ASN1_OCTET_STRING; + return 1; +} + +int asn1_marshal_octet_string(CBB *out, const ASN1_STRING *in, + CBS_ASN1_TAG tag) { + tag = tag == 0 ? CBS_ASN1_OCTETSTRING : tag; + return CBB_add_asn1_element(out, tag, ASN1_STRING_get0_data(in), + ASN1_STRING_length(in)); +} + +static int asn1_parse_character_string(CBS *cbs, ASN1_STRING *out, + CBS_ASN1_TAG tag, int str_type, + int (*get_char)(CBS *cbs, uint32_t *), + int bad_char_err) { + CBS child; + if (!CBS_get_asn1(cbs, &child, tag)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + CBS copy = child; + while (CBS_len(©) != 0) { + uint32_t c; + if (!get_char(©, &c)) { + OPENSSL_PUT_ERROR(ASN1, bad_char_err); + return 0; + } + } + if (!ASN1_STRING_set(out, CBS_data(&child), CBS_len(&child))) { + return 0; + } + out->type = str_type; + return 1; +} + +int asn1_parse_bmp_string(CBS *cbs, ASN1_BMPSTRING *out, CBS_ASN1_TAG tag) { + tag = tag == 0 ? CBS_ASN1_BMPSTRING : tag; + return asn1_parse_character_string(cbs, out, tag, V_ASN1_BMPSTRING, + &CBS_get_ucs2_be, + ASN1_R_INVALID_BMPSTRING); +} + +int asn1_parse_universal_string(CBS *cbs, ASN1_UNIVERSALSTRING *out, + CBS_ASN1_TAG tag) { + tag = tag == 0 ? CBS_ASN1_UNIVERSALSTRING : tag; + return asn1_parse_character_string(cbs, out, tag, V_ASN1_UNIVERSALSTRING, + &CBS_get_utf32_be, + ASN1_R_INVALID_UNIVERSALSTRING); +} + +int asn1_parse_utf8_string(CBS *cbs, ASN1_UNIVERSALSTRING *out, + CBS_ASN1_TAG tag) { + tag = tag == 0 ? CBS_ASN1_UTF8STRING : tag; + return asn1_parse_character_string(cbs, out, tag, V_ASN1_UTF8STRING, + &CBS_get_utf8, ASN1_R_INVALID_UTF8STRING); +} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/asn_pack.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/asn_pack.cc index 2d66061980..e2d85f91c9 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/asn_pack.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/asn_pack.cc @@ -19,26 +19,26 @@ ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **out) { - uint8_t *new_data = NULL; + uint8_t *new_data = nullptr; int len = ASN1_item_i2d(reinterpret_cast(obj), &new_data, it); if (len <= 0) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ENCODE_ERROR); - return NULL; + return nullptr; } - ASN1_STRING *ret = NULL; - if (out == NULL || *out == NULL) { + ASN1_STRING *ret = nullptr; + if (out == nullptr || *out == nullptr) { ret = ASN1_STRING_new(); - if (ret == NULL) { + if (ret == nullptr) { OPENSSL_free(new_data); - return NULL; + return nullptr; } } else { ret = *out; } ASN1_STRING_set0(ret, new_data, len); - if (out != NULL) { + if (out != nullptr) { *out = ret; } return ret; @@ -46,11 +46,11 @@ ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **out) { void *ASN1_item_unpack(const ASN1_STRING *oct, const ASN1_ITEM *it) { const unsigned char *p = oct->data; - void *ret = ASN1_item_d2i(NULL, &p, oct->length, it); - if (ret == NULL || p != oct->data + oct->length) { + void *ret = ASN1_item_d2i(nullptr, &p, oct->length, it); + if (ret == nullptr || p != oct->data + oct->length) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); ASN1_item_free(reinterpret_cast(ret), it); - return NULL; + return nullptr; } return ret; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/f_int.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/f_int.cc index e842e79e8f..2774d17790 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/f_int.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/f_int.cc @@ -21,7 +21,7 @@ int i2a_ASN1_INTEGER(BIO *bp, const ASN1_INTEGER *a) { static const char *h = "0123456789ABCDEF"; char buf[2]; - if (a == NULL) { + if (a == nullptr) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/f_string.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/f_string.cc index 04cf751e11..38cc7c29cf 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/f_string.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/f_string.cc @@ -21,7 +21,7 @@ int i2a_ASN1_STRING(BIO *bp, const ASN1_STRING *a, int type) { static const char *h = "0123456789ABCDEF"; char buf[2]; - if (a == NULL) { + if (a == nullptr) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/internal.h index 2baeb12e40..0b45f5235c 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/internal.h @@ -48,7 +48,8 @@ OPENSSL_EXPORT int OPENSSL_gmtime_diff(int *out_days, int *out_secs, const struct tm *from, const struct tm *to); -// Internal ASN1 structures and functions: not for application use + +// Object identifiers. // These are used internally in the ASN1_OBJECT to keep track of // whether the names and data need to be free()ed @@ -72,6 +73,134 @@ struct asn1_object_st { ASN1_OBJECT *ASN1_OBJECT_new(void); +// asn1_parse_object parses a DER-encoded ASN.1 OBJECT IDENTIFIER from |cbs| and +// write the result to |out|. If |tag| is non-zero, the value is implicitly +// tagged with |tag|. On success, it returns a newly-allocated |ASN1_OBJECT| +// with the result and advances |cbs| past the parsed element. +// +// TODO(crbug.com/boringssl/414361735): This should return a bssl::UniquePtr, +// but cannot until it is made C++ linkage. +ASN1_OBJECT *asn1_parse_object(CBS *cbs, CBS_ASN1_TAG tag); + +// asn1_marshal_object marshals |in| as a DER-encoded, ASN.1 OBJECT IDENTIFIER +// and writes the result to |out|. It returns one on success and zero on error. +// If |tag| is non-zero, the tag is replaced with |tag|. +int asn1_marshal_object(CBB *out, const ASN1_OBJECT *in, CBS_ASN1_TAG tag); + + +// Strings. + +// asn1_is_printable returns one if |value| is a valid Unicode codepoint for an +// ASN.1 PrintableString, and zero otherwise. +int asn1_is_printable(uint32_t value); + +// asn1_string_init initializes |str|, which may be uninitialized, with type +// |type|. +void asn1_string_init(ASN1_STRING *str, int type); + +// asn1_string_cleanup releases memory associated with |str|'s value, without +// freeing |str| itself. +void asn1_string_cleanup(ASN1_STRING *str); + +// asn1_bit_string_length returns the number of bytes in |str| and sets +// |*out_padding_bits| to the number of padding bits. +// +// This function should be used instead of |ASN1_STRING_length| to correctly +// handle the non-|ASN1_STRING_FLAG_BITS_LEFT| case. +int asn1_bit_string_length(const ASN1_BIT_STRING *str, + uint8_t *out_padding_bits); + +// The following functions parse a DER-encoded ASN.1 value of the specified +// type from |cbs| and write the result to |*out|. If |tag| is non-zero, the +// value is implicitly tagged with |tag|. On success, they return one and +// advance |cbs| past the parsed element. On entry, |*out| must contain an +// |ASN1_STRING| in some valid state. +int asn1_parse_bit_string(CBS *cbs, ASN1_BIT_STRING *out, CBS_ASN1_TAG tag); +int asn1_parse_integer(CBS *cbs, ASN1_INTEGER *out, CBS_ASN1_TAG tag); +int asn1_parse_enumerated(CBS *cbs, ASN1_ENUMERATED *out, CBS_ASN1_TAG tag); +int asn1_parse_octet_string(CBS *cbs, ASN1_STRING *out, CBS_ASN1_TAG tag); +int asn1_parse_bmp_string(CBS *cbs, ASN1_BMPSTRING *out, CBS_ASN1_TAG tag); +int asn1_parse_universal_string(CBS *cbs, ASN1_UNIVERSALSTRING *out, + CBS_ASN1_TAG tag); +int asn1_parse_utf8_string(CBS *cbs, ASN1_UNIVERSALSTRING *out, + CBS_ASN1_TAG tag); +int asn1_parse_generalized_time(CBS *cbs, ASN1_GENERALIZEDTIME *out, + CBS_ASN1_TAG tag); +int asn1_parse_utc_time(CBS *cbs, ASN1_UTCTIME *out, CBS_ASN1_TAG tag, + int allow_timezone_offset); + +// asn1_parse_bit_string_with_bad_length behaves like |asn1_parse_bit_string| +// but tolerates BER non-minimal, definite lengths. +int asn1_parse_bit_string_with_bad_length(CBS *cbs, ASN1_BIT_STRING *out); + +// asn1_marshal_bit_string marshals |in| as a DER-encoded, ASN.1 BIT STRING and +// writes the result to |out|. It returns one on success and zero on error. If +// |tag| is non-zero, the tag is replaced with |tag|. +int asn1_marshal_bit_string(CBB *out, const ASN1_BIT_STRING *in, + CBS_ASN1_TAG tag); + +// asn1_marshal_integer marshals |in| as a DER-encoded, ASN.1 INTEGER and writes +// the result to |out|. It returns one on success and zero on error. If |tag| is +// non-zero, the tag is replaced with |tag|. This can also be used to marshal an +// ASN.1 ENUMERATED value by overriding the tag. +int asn1_marshal_integer(CBB *out, const ASN1_INTEGER *in, CBS_ASN1_TAG tag); + +// asn1_marshal_octet_string marshals |in| as a DER-encoded, ASN.1 OCTET STRING +// and writes the result to |out|. It returns one on success and zero on error. +// If |tag| is non-zero, the tag is replaced with |tag|. +// +// This function may be used to marshal other string-based universal types whose +// encoding is that of an implicitly-tagged OCTET STRING, e.g. UTF8String. +int asn1_marshal_octet_string(CBB *out, const ASN1_STRING *in, + CBS_ASN1_TAG tag); + +OPENSSL_EXPORT int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d, + int allow_timezone_offset); +OPENSSL_EXPORT int asn1_generalizedtime_to_tm(struct tm *tm, + const ASN1_GENERALIZEDTIME *d); + +int asn1_parse_time(CBS *cbs, ASN1_TIME *out, int allow_utc_timezone_offset); +int asn1_marshal_time(CBB *cbb, const ASN1_TIME *in); + + +// The ASN.1 ANY type. + +// asn1_type_value_as_pointer returns |a|'s value in pointer form. This is +// usually the value object but, for BOOLEAN values, is 0 or 0xff cast to +// a pointer. +const void *asn1_type_value_as_pointer(const ASN1_TYPE *a); + +// asn1_type_set0_string sets |a|'s value to the object represented by |str| and +// takes ownership of |str|. +void asn1_type_set0_string(ASN1_TYPE *a, ASN1_STRING *str); + +// asn1_type_cleanup releases memory associated with |a|'s value, without +// freeing |a| itself. +void asn1_type_cleanup(ASN1_TYPE *a); + +// asn1_parse_any parses a DER-encoded ASN.1 value of any type from |cbs| and +// writes the result to |*out|. On success, it advances |cbs| past the parsed +// element and returns one. On entry, |*out| must contain an |ASN1_TYPE| in some +// valid state. +int asn1_parse_any(CBS *cbs, ASN1_TYPE *out); + +// asn1_parse_any_as_string behaves like |asn1_parse_any| but represents the +// value as an |ASN1_STRING|. Types which are not represented with +// |ASN1_STRING|, such as |ASN1_OBJECT|, are represented with type +// |V_ASN1_OTHER|. +int asn1_parse_any_as_string(CBS *cbs, ASN1_STRING *out); + +// asn1_marshal_any marshals |in| as a DER-encoded ASN.1 value and writes the +// result to |out|. It returns one on success and zeron on error. +int asn1_marshal_any(CBB *out, const ASN1_TYPE *in); + +// asn1_marshal_any_string marshals |in| as a DER-encoded ASN.1 value and writes +// the result to |out|. It returns one on success and zeron on error. +int asn1_marshal_any_string(CBB *out, const ASN1_STRING *in); + + +// Support structures for the template-based encoder. + // ASN1_ENCODING is used to save the received encoding of an ASN.1 type. This // avoids problems with invalid encodings that break signatures. typedef struct ASN1_ENCODING_st { @@ -79,16 +208,8 @@ typedef struct ASN1_ENCODING_st { uint8_t *enc; // len is the length of |enc|. If zero, there is no saved encoding. size_t len; - // buf, if non-NULL, is the |CRYPTO_BUFFER| that |enc| points into. If NULL, - // |enc| must be released with |OPENSSL_free|. - CRYPTO_BUFFER *buf; } ASN1_ENCODING; -OPENSSL_EXPORT int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d, - int allow_timezone_offset); -OPENSSL_EXPORT int asn1_generalizedtime_to_tm(struct tm *tm, - const ASN1_GENERALIZEDTIME *d); - int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); @@ -97,14 +218,12 @@ void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); // ASN1_item_ex_d2i parses |len| bytes from |*in| as a structure of type |it| // and writes the result to |*pval|. If |tag| is non-negative, |it| is // implicitly tagged with the tag specified by |tag| and |aclass|. If |opt| is -// non-zero, the value is optional. If |buf| is non-NULL, |*in| must point into -// |buf|. +// non-zero, the value is optional. // // This function returns one and advances |*in| if an object was successfully // parsed, -1 if an optional value was successfully skipped, and zero on error. int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, - const ASN1_ITEM *it, int tag, int aclass, char opt, - CRYPTO_BUFFER *buf); + const ASN1_ITEM *it, int tag, int aclass, char opt); // ASN1_item_ex_i2d encodes |*pval| as a value of type |it| to |out| under the // i2d output convention. It returns a non-zero length on success and -1 on @@ -150,47 +269,11 @@ int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, // returns one on success and zero on error. If |buf| is non-NULL, |in| must // point into |buf|. int asn1_enc_save(ASN1_VALUE **pval, const uint8_t *in, size_t inlen, - const ASN1_ITEM *it, CRYPTO_BUFFER *buf); + const ASN1_ITEM *it); // asn1_encoding_clear clears the cached encoding in |enc|. void asn1_encoding_clear(ASN1_ENCODING *enc); -// asn1_type_value_as_pointer returns |a|'s value in pointer form. This is -// usually the value object but, for BOOLEAN values, is 0 or 0xff cast to -// a pointer. -const void *asn1_type_value_as_pointer(const ASN1_TYPE *a); - -// asn1_type_set0_string sets |a|'s value to the object represented by |str| and -// takes ownership of |str|. -void asn1_type_set0_string(ASN1_TYPE *a, ASN1_STRING *str); - -// asn1_type_cleanup releases memory associated with |a|'s value, without -// freeing |a| itself. -void asn1_type_cleanup(ASN1_TYPE *a); - -// asn1_is_printable returns one if |value| is a valid Unicode codepoint for an -// ASN.1 PrintableString, and zero otherwise. -int asn1_is_printable(uint32_t value); - -// asn1_bit_string_length returns the number of bytes in |str| and sets -// |*out_padding_bits| to the number of padding bits. -// -// This function should be used instead of |ASN1_STRING_length| to correctly -// handle the non-|ASN1_STRING_FLAG_BITS_LEFT| case. -int asn1_bit_string_length(const ASN1_BIT_STRING *str, - uint8_t *out_padding_bits); - -// asn1_marshal_bit_string marshals |in| as a DER-encoded, ASN.1 BIT STRING and -// writes the result to |out|. It returns one on success and zero on error. If -// |tag| is non-zero, the tag is replaced with |tag|. -int asn1_marshal_bit_string(CBB *out, const ASN1_BIT_STRING *in, - CBS_ASN1_TAG tag); - -// asn1_marshal_integer marshals |in| as a DER-encoded, ASN.1 INTEGER and writes -// the result to |out|. It returns one on success and zero on error. If |tag| is -// non-zero, the tag is replaced with |tag|. -int asn1_marshal_integer(CBB *out, const ASN1_INTEGER *in, CBS_ASN1_TAG tag); - typedef struct { int nid; long minsize; @@ -210,8 +293,18 @@ typedef ASN1_VALUE *ASN1_d2i_func(ASN1_VALUE **a, const unsigned char **in, long length); typedef int ASN1_i2d_func(ASN1_VALUE *a, unsigned char **in); -typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, - const ASN1_ITEM *it, int opt, ASN1_TLC *ctx); +// An ASN1_ex_parse function should parse a value from |cbs| and set |*pval| to +// the result. It should return one on success and zero on failure. If |opt| is +// non-zero, the field may be optional. If an optional element is missing, the +// function should return one and consume zero bytes from |cbs|. +// +// If |opt| is non-zero, the function can assume that |*pval| is nullptr on +// entry. Otherwise, |*pval| may either be nullptr, or the result of +// |ASN1_ex_new_func|. The function may either write into the existing object, +// if any, or unconditionally make a new one. (The existing object comes from +// tasn_new.cc recursively filling in objects before parsing into them.) +typedef int ASN1_ex_parse(ASN1_VALUE **pval, CBS *cbs, const ASN1_ITEM *it, + int opt); typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it); @@ -221,14 +314,56 @@ typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); typedef struct ASN1_EXTERN_FUNCS_st { ASN1_ex_new_func *asn1_ex_new; ASN1_ex_free_func *asn1_ex_free; - ASN1_ex_d2i *asn1_ex_d2i; + ASN1_ex_parse *asn1_ex_parse; ASN1_ex_i2d *asn1_ex_i2d; } ASN1_EXTERN_FUNCS; -// ASN1_ANY_AS_STRING is an |ASN1_ITEM| with ASN.1 type ANY and C type -// |ASN1_STRING*|. Types which are not represented with |ASN1_STRING|, such as -// |ASN1_OBJECT|, are represented with type |V_ASN1_OTHER|. -DECLARE_ASN1_ITEM(ASN1_ANY_AS_STRING) +#define IMPLEMENT_EXTERN_ASN1_SIMPLE(name, new_func, free_func, tag, \ + parse_func, i2d_func) \ + static int name##_new_cb(ASN1_VALUE **pval, const ASN1_ITEM *it) { \ + *pval = (ASN1_VALUE *)new_func(); \ + return *pval != nullptr; \ + } \ + \ + static void name##_free_cb(ASN1_VALUE **pval, const ASN1_ITEM *it) { \ + free_func((name *)*pval); \ + *pval = nullptr; \ + } \ + \ + static int name##_parse_cb(ASN1_VALUE **pval, CBS *cbs, const ASN1_ITEM *it, \ + int opt) { \ + if (opt && !CBS_peek_asn1_tag(cbs, (tag))) { \ + return 1; \ + } \ + \ + if ((*pval == nullptr && !name##_new_cb(pval, it)) || \ + !parse_func(cbs, (name *)*pval)) { \ + return 0; \ + } \ + return 1; \ + } \ + \ + static int name##_i2d_cb(ASN1_VALUE **pval, unsigned char **out, \ + const ASN1_ITEM *it) { \ + return i2d_func((name *)*pval, out); \ + } \ + \ + static const ASN1_EXTERN_FUNCS name##_extern_funcs = { \ + name##_new_cb, name##_free_cb, name##_parse_cb, name##_i2d_cb}; \ + \ + IMPLEMENT_EXTERN_ASN1(name, name##_extern_funcs) + +// ASN1_TIME is an |ASN1_ITEM| whose ASN.1 type is X.509 Time (RFC 5280) and C +// type is |ASN1_TIME*|. +DECLARE_ASN1_ITEM(ASN1_TIME) + +// DIRECTORYSTRING is an |ASN1_ITEM| whose ASN.1 type is X.509 DirectoryString +// (RFC 5280) and C type is |ASN1_STRING*|. +DECLARE_ASN1_ITEM(DIRECTORYSTRING) + +// DISPLAYTEXT is an |ASN1_ITEM| whose ASN.1 type is X.509 DisplayText (RFC +// 5280) and C type is |ASN1_STRING*|. +DECLARE_ASN1_ITEM(DISPLAYTEXT) #if defined(__cplusplus) diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/posix_time.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/posix_time.cc index 1dd2ee4641..6361a0e984 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/posix_time.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/posix_time.cc @@ -189,7 +189,7 @@ struct tm *OPENSSL_gmtime(const time_t *time, struct tm *out_tm) { "time_t is broken"); int64_t posix_time = *time; if (!OPENSSL_posix_to_tm(posix_time, out_tm)) { - return NULL; + return nullptr; } return out_tm; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_dec.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_dec.cc index 627c13588f..8928bf43d4 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_dec.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_dec.cc @@ -39,18 +39,16 @@ static int asn1_check_tlen(long *olen, int *otag, unsigned char *oclass, static int asn1_template_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_TEMPLATE *tt, char opt, - CRYPTO_BUFFER *buf, int depth); + int depth); static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, long len, const ASN1_TEMPLATE *tt, char opt, - CRYPTO_BUFFER *buf, int depth); -static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, long len, - int utype, const ASN1_ITEM *it); + int depth); static int asn1_d2i_ex_primitive(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, int tag, int aclass, char opt); static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, int tag, int aclass, - char opt, CRYPTO_BUFFER *buf, int depth); + char opt, int depth); unsigned long ASN1_tag2bit(int tag) { switch (tag) { @@ -91,25 +89,6 @@ unsigned long ASN1_tag2bit(int tag) { } } -static int is_supported_universal_type(int tag, int aclass) { - if (aclass != V_ASN1_UNIVERSAL) { - return 0; - } - return tag == V_ASN1_OBJECT || tag == V_ASN1_NULL || tag == V_ASN1_BOOLEAN || - tag == V_ASN1_BIT_STRING || tag == V_ASN1_INTEGER || - tag == V_ASN1_ENUMERATED || tag == V_ASN1_OCTET_STRING || - tag == V_ASN1_NUMERICSTRING || tag == V_ASN1_PRINTABLESTRING || - tag == V_ASN1_T61STRING || tag == V_ASN1_VIDEOTEXSTRING || - tag == V_ASN1_IA5STRING || tag == V_ASN1_UTCTIME || - tag == V_ASN1_GENERALIZEDTIME || tag == V_ASN1_GRAPHICSTRING || - tag == V_ASN1_VISIBLESTRING || tag == V_ASN1_GENERALSTRING || - tag == V_ASN1_UNIVERSALSTRING || tag == V_ASN1_BMPSTRING || - tag == V_ASN1_UTF8STRING || tag == V_ASN1_SET || - tag == V_ASN1_SEQUENCE; -} - -// Macro to initialize and invalidate the cache - // Decode an ASN1 item, this currently behaves just like a standard 'd2i' // function. 'in' points to a buffer to read the data from, in future we // will have more advanced versions that can input data a piece at a time and @@ -117,9 +96,9 @@ static int is_supported_universal_type(int tag, int aclass) { ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it) { - ASN1_VALUE *ret = NULL; + ASN1_VALUE *ret = nullptr; if (asn1_item_ex_d2i(&ret, in, len, it, /*tag=*/-1, /*aclass=*/0, /*opt=*/0, - /*buf=*/NULL, /*depth=*/0) <= 0) { + /*depth=*/0) <= 0) { // Clean up, in case the caller left a partial object. // // TODO(davidben): I don't think it can leave one, but the codepaths below @@ -131,7 +110,7 @@ ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, // with |ret|. This differs from OpenSSL slightly in that we don't support // object reuse. We run this on both success and failure. On failure, even // with object reuse, OpenSSL destroys the previous object. - if (pval != NULL) { + if (pval != nullptr) { ASN1_item_ex_free(pval, it); *pval = ret; } @@ -149,9 +128,9 @@ ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, int tag, int aclass, - char opt, CRYPTO_BUFFER *buf, int depth) { - const ASN1_TEMPLATE *tt, *errtt = NULL; - const unsigned char *p = NULL, *q; + char opt, int depth) { + const ASN1_TEMPLATE *tt, *errtt = nullptr; + const unsigned char *p = nullptr, *q; unsigned char oclass; char cst, isopt; int i; @@ -161,10 +140,9 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, if (!pval) { return 0; } - - if (buf != NULL) { - assert(CRYPTO_BUFFER_data(buf) <= *in && - *in + len <= CRYPTO_BUFFER_data(buf) + CRYPTO_BUFFER_len(buf)); + if (len < 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_BUFFER_TOO_SMALL); + goto err; } // Bound |len| to comfortably fit in an int. Lengths in this module often @@ -189,11 +167,9 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE); goto err; } - return asn1_template_ex_d2i(pval, in, len, it->templates, opt, buf, - depth); + return asn1_template_ex_d2i(pval, in, len, it->templates, opt, depth); } return asn1_d2i_ex_primitive(pval, in, len, it, tag, aclass, opt); - break; case ASN1_ITYPE_MSTRING: // It never makes sense for multi-strings to have implicit tagging, so @@ -205,7 +181,8 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, p = *in; // Just read in tag and class - ret = asn1_check_tlen(NULL, &otag, &oclass, NULL, &p, len, -1, 0, 1); + ret = + asn1_check_tlen(nullptr, &otag, &oclass, nullptr, &p, len, -1, 0, 1); if (!ret) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); goto err; @@ -239,7 +216,18 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, } const ASN1_EXTERN_FUNCS *ef = reinterpret_cast(it->funcs); - return ef->asn1_ex_d2i(pval, in, len, it, opt, NULL); + CBS cbs; + CBS_init(&cbs, *in, len); + CBS copy = cbs; + if (!ef->asn1_ex_parse(pval, &cbs, it, opt)) { + goto err; + } + *in = CBS_data(&cbs); + // Check whether the function skipped an optional element. + // + // TODO(crbug.com/42290418): Switch the rest of this function to + // |asn1_ex_parse|'s calling convention. + return CBS_len(&cbs) == CBS_len(©) ? -1 : 1; } case ASN1_ITYPE_CHOICE: { @@ -251,8 +239,8 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, } const ASN1_AUX *aux = reinterpret_cast(it->funcs); - ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL; - if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, NULL)) { + ASN1_aux_cb *asn1_cb = aux != nullptr ? aux->asn1_cb : nullptr; + if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, nullptr)) { goto auxerr; } @@ -274,7 +262,7 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, for (i = 0, tt = it->templates; i < it->tcount; i++, tt++) { pchptr = asn1_get_field_ptr(pval, tt); // We mark field as OPTIONAL so its absence can be recognised. - ret = asn1_template_ex_d2i(pchptr, &p, len, tt, 1, buf, depth); + ret = asn1_template_ex_d2i(pchptr, &p, len, tt, 1, depth); // If field not present, try the next one if (ret == -1) { continue; @@ -302,7 +290,7 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, } asn1_set_choice_selector(pval, i, it); - if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, NULL)) { + if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, nullptr)) { goto auxerr; } *in = p; @@ -318,7 +306,8 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, aclass = V_ASN1_UNIVERSAL; } // Get SEQUENCE length and update len, p - ret = asn1_check_tlen(&len, NULL, NULL, &cst, &p, len, tag, aclass, opt); + ret = asn1_check_tlen(&len, nullptr, nullptr, &cst, &p, len, tag, aclass, + opt); if (!ret) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); goto err; @@ -336,8 +325,8 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, } const ASN1_AUX *aux = reinterpret_cast(it->funcs); - ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL; - if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, NULL)) { + ASN1_aux_cb *asn1_cb = aux != nullptr ? aux->asn1_cb : nullptr; + if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, nullptr)) { goto auxerr; } @@ -347,7 +336,7 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, const ASN1_TEMPLATE *seqtt; ASN1_VALUE **pseqval; seqtt = asn1_do_adb(pval, tt, 0); - if (seqtt == NULL) { + if (seqtt == nullptr) { continue; } pseqval = asn1_get_field_ptr(pval, seqtt); @@ -360,7 +349,7 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, const ASN1_TEMPLATE *seqtt; ASN1_VALUE **pseqval; seqtt = asn1_do_adb(pval, tt, 1); - if (seqtt == NULL) { + if (seqtt == nullptr) { goto err; } pseqval = asn1_get_field_ptr(pval, seqtt); @@ -380,7 +369,7 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, } // attempt to read in field, allowing each to be OPTIONAL - ret = asn1_template_ex_d2i(pseqval, &p, len, seqtt, isopt, buf, depth); + ret = asn1_template_ex_d2i(pseqval, &p, len, seqtt, isopt, depth); if (!ret) { errtt = seqtt; goto err; @@ -405,7 +394,7 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, for (; i < it->tcount; tt++, i++) { const ASN1_TEMPLATE *seqtt; seqtt = asn1_do_adb(pval, tt, 1); - if (seqtt == NULL) { + if (seqtt == nullptr) { goto err; } if (seqtt->flags & ASN1_TFLG_OPTIONAL) { @@ -419,10 +408,10 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, } } // Save encoding - if (!asn1_enc_save(pval, *in, p - *in, it, buf)) { + if (!asn1_enc_save(pval, *in, p - *in, it)) { goto auxerr; } - if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, NULL)) { + if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, nullptr)) { goto auxerr; } *in = p; @@ -445,10 +434,8 @@ err: } int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, - const ASN1_ITEM *it, int tag, int aclass, char opt, - CRYPTO_BUFFER *buf) { - return asn1_item_ex_d2i(pval, in, len, it, tag, aclass, opt, buf, - /*depth=*/0); + const ASN1_ITEM *it, int tag, int aclass, char opt) { + return asn1_item_ex_d2i(pval, in, len, it, tag, aclass, opt, /*depth=*/0); } // Templates are handled with two separate functions. One handles any @@ -456,7 +443,7 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, static int asn1_template_ex_d2i(ASN1_VALUE **val, const unsigned char **in, long inlen, const ASN1_TEMPLATE *tt, char opt, - CRYPTO_BUFFER *buf, int depth) { + int depth) { int aclass; int ret; long len; @@ -474,8 +461,8 @@ static int asn1_template_ex_d2i(ASN1_VALUE **val, const unsigned char **in, char cst; // Need to work out amount of data available to the inner content and // where it starts: so read in EXPLICIT header to get the info. - ret = asn1_check_tlen(&len, NULL, NULL, &cst, &p, inlen, tt->tag, aclass, - opt); + ret = asn1_check_tlen(&len, nullptr, nullptr, &cst, &p, inlen, tt->tag, + aclass, opt); q = p; if (!ret) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); @@ -488,7 +475,7 @@ static int asn1_template_ex_d2i(ASN1_VALUE **val, const unsigned char **in, return 0; } // We've found the field so it can't be OPTIONAL now - ret = asn1_template_noexp_d2i(val, &p, len, tt, /*opt=*/0, buf, depth); + ret = asn1_template_noexp_d2i(val, &p, len, tt, /*opt=*/0, depth); if (!ret) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); return 0; @@ -501,7 +488,7 @@ static int asn1_template_ex_d2i(ASN1_VALUE **val, const unsigned char **in, goto err; } } else { - return asn1_template_noexp_d2i(val, in, inlen, tt, opt, buf, depth); + return asn1_template_noexp_d2i(val, in, inlen, tt, opt, depth); } *in = p; @@ -514,7 +501,7 @@ err: static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, long len, const ASN1_TEMPLATE *tt, char opt, - CRYPTO_BUFFER *buf, int depth) { + int depth) { int aclass; int ret; const unsigned char *p; @@ -542,8 +529,8 @@ static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, } } // Get the tag - ret = - asn1_check_tlen(&len, NULL, NULL, NULL, &p, len, sktag, skaclass, opt); + ret = asn1_check_tlen(&len, nullptr, nullptr, nullptr, &p, len, sktag, + skaclass, opt); if (!ret) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); return 0; @@ -570,9 +557,10 @@ static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, while (len > 0) { ASN1_VALUE *skfield; const unsigned char *q = p; - skfield = NULL; + skfield = nullptr; if (!asn1_item_ex_d2i(&skfield, &p, len, ASN1_ITEM_ptr(tt->item), - /*tag=*/-1, /*aclass=*/0, /*opt=*/0, buf, depth)) { + /*tag=*/-1, /*aclass=*/0, /*opt=*/0, depth)) { + ASN1_item_ex_free(&skfield, ASN1_ITEM_ptr(tt->item)); OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); goto err; } @@ -585,7 +573,7 @@ static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, } else if (flags & ASN1_TFLG_IMPTAG) { // IMPLICIT tagging ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), tt->tag, - aclass, opt, buf, depth); + aclass, opt, depth); if (!ret) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); goto err; @@ -595,7 +583,7 @@ static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, } else { // Nothing special ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), /*tag=*/-1, - /*aclass=*/0, opt, buf, depth); + /*aclass=*/0, opt, depth); if (!ret) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); goto err; @@ -612,306 +600,202 @@ err: return 0; } +// TODO(crbug.com/42290418): Switch the whole file to use a CBS-based calling +// convention. +static int asn1_d2i_ex_primitive_cbs(ASN1_VALUE **pval, CBS *cbs, + const ASN1_ITEM *it, int tag, int aclass, + char opt); + +// asn1_d2i_ex_primitive returns one on success, zero on error, and -1 if an +// optional value was skipped. static int asn1_d2i_ex_primitive(ASN1_VALUE **pval, const unsigned char **in, long inlen, const ASN1_ITEM *it, int tag, int aclass, char opt) { - int ret = 0, utype; - long plen; - char cst; - const unsigned char *p; - const unsigned char *cont = NULL; - long len; - if (!pval) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NULL); - return 0; // Should never happen + CBS cbs; + CBS_init(&cbs, *in, inlen); + int ret = asn1_d2i_ex_primitive_cbs(pval, &cbs, it, tag, aclass, opt); + if (ret <= 0) { + return ret; } + *in = CBS_data(&cbs); + return 1; +} +static ASN1_STRING *ensure_string(ASN1_VALUE **pval) { + if (*pval) { + return (ASN1_STRING *)*pval; + } + ASN1_STRING *str = ASN1_STRING_new(); + if (str == nullptr) { + return nullptr; + } + *pval = (ASN1_VALUE *)str; + return str; +} + +static int asn1_d2i_ex_primitive_cbs(ASN1_VALUE **pval, CBS *cbs, + const ASN1_ITEM *it, int tag, int aclass, + char opt) { + // Historically, |it->funcs| for primitive types contained an + // |ASN1_PRIMITIVE_FUNCS| table of callbacks. + assert(it->funcs == nullptr); + + int utype; assert(it->itype == ASN1_ITYPE_PRIMITIVE || it->itype == ASN1_ITYPE_MSTRING); if (it->itype == ASN1_ITYPE_MSTRING) { + // MSTRING passes utype in |tag|, normally used for implicit tagging. utype = tag; tag = -1; } else { utype = it->utype; } - if (utype == V_ASN1_ANY || utype == V_ASN1_ANY_AS_STRING) { - // If type is ANY need to figure out type from tag - unsigned char oclass; + // Handle ANY types. + if (utype == V_ASN1_ANY) { if (tag >= 0) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_TAGGED_ANY); return 0; } - if (opt) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OPTIONAL_ANY); - return 0; + if (opt && CBS_len(cbs) == 0) { + return -1; // Omitted OPTIONAL value. } - const int is_string = utype == V_ASN1_ANY_AS_STRING; - p = *in; - ret = asn1_check_tlen(&plen, &utype, &oclass, &cst, &p, inlen, -1, 0, 0); - if (!ret) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); - return 0; - } - if (!is_supported_universal_type(utype, oclass)) { - utype = V_ASN1_OTHER; - } - // These three types are not represented as |ASN1_STRING|, so they must be - // parsed separately and then treated as an opaque |V_ASN1_OTHER|. - if (is_string && (utype == V_ASN1_OBJECT || utype == V_ASN1_NULL || - utype == V_ASN1_BOOLEAN)) { - if (cst) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE); - return 0; - } - CBS cbs; - CBS_init(&cbs, p, plen); - if (utype == V_ASN1_OBJECT && !CBS_is_valid_asn1_oid(&cbs)) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_OBJECT_ENCODING); - return 0; - } - if (utype == V_ASN1_NULL && CBS_len(&cbs) != 0) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_NULL_IS_WRONG_LENGTH); - return 0; - } - if (utype == V_ASN1_BOOLEAN) { - if (CBS_len(&cbs) != 1) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_BOOLEAN_IS_WRONG_LENGTH); - return 0; - } - uint8_t v = CBS_data(&cbs)[0]; - if (v != 0 && v != 0xff) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); - return 0; - } - } - utype = V_ASN1_OTHER; - } - } - if (tag == -1) { - tag = utype; - aclass = V_ASN1_UNIVERSAL; - } - p = *in; - // Check header - ret = asn1_check_tlen(&plen, NULL, NULL, &cst, &p, inlen, tag, aclass, opt); - if (!ret) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); - return 0; - } else if (ret == -1) { - return -1; - } - ret = 0; - // SEQUENCE, SET and "OTHER" are left in encoded form - if ((utype == V_ASN1_SEQUENCE) || (utype == V_ASN1_SET) || - (utype == V_ASN1_OTHER)) { - // SEQUENCE and SET must be constructed - if (utype != V_ASN1_OTHER && !cst) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_CONSTRUCTED); - return 0; - } - - cont = *in; - len = p - cont + plen; - p += plen; - } else if (cst) { - // This parser historically supported BER constructed strings. We no - // longer do and will gradually tighten this parser into a DER - // parser. BER types should use |CBS_asn1_ber_to_der|. - OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE); - return 0; - } else { - cont = p; - len = plen; - p += plen; - } - - // We now have content length and type: translate into a structure - if (!asn1_ex_c2i(pval, cont, len, utype, it)) { - goto err; - } - - *in = p; - ret = 1; -err: - return ret; -} - -// Translate ASN1 content octets into a structure - -static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, long len, - int utype, const ASN1_ITEM *it) { - ASN1_VALUE **opval = NULL; - ASN1_STRING *stmp; - ASN1_TYPE *typ = NULL; - int ret = 0; - ASN1_INTEGER **tint; - - // Historically, |it->funcs| for primitive types contained an - // |ASN1_PRIMITIVE_FUNCS| table of callbacks. - assert(it->funcs == NULL); - - // If ANY type clear type and set pointer to internal value - if (it->utype == V_ASN1_ANY) { + ASN1_TYPE *typ; if (!*pval) { typ = ASN1_TYPE_new(); - if (typ == NULL) { - goto err; + if (typ == nullptr) { + return 0; } *pval = (ASN1_VALUE *)typ; } else { typ = (ASN1_TYPE *)*pval; } - - if (utype != typ->type) { - ASN1_TYPE_set(typ, utype, NULL); - } - opval = pval; - pval = &typ->value.asn1_value; + return asn1_parse_any(cbs, typ); } - // If implementing a type that is not represented in |ASN1_STRING|, the - // |V_ASN1_ANY_AS_STRING| logic must be modified to redirect it to - // |V_ASN1_OTHER|. - switch (utype) { - case V_ASN1_OBJECT: - if (!c2i_ASN1_OBJECT((ASN1_OBJECT **)pval, &cont, len)) { - goto err; - } - break; + // Convert the crypto/asn1 tag into a CBS one. + if (tag == -1) { + tag = utype; + aclass = V_ASN1_UNIVERSAL; + } - case V_ASN1_NULL: - if (len) { + // All edge cases of |utype| should have been handled already. |utype| is now + // either a primitive |ASN1_ITEM|, handled by |DECLARE_ASN1_ITEM|, or a + // multistring option with a corresponding |B_ASN1_*| constant. + assert(utype >= 0 && utype <= V_ASN1_MAX_UNIVERSAL); + CBS_ASN1_TAG cbs_tag = + (static_cast(aclass) << CBS_ASN1_TAG_SHIFT) | + static_cast(tag); + if (utype == V_ASN1_SEQUENCE || utype == V_ASN1_SET) { + cbs_tag |= CBS_ASN1_CONSTRUCTED; + } + + if (opt && !CBS_peek_asn1_tag(cbs, cbs_tag)) { + return -1; // Omitted OPTIONAL value. + } + + // Handle non-|ASN1_STRING| types. + switch (utype) { + case V_ASN1_OBJECT: { + bssl::UniquePtr obj(asn1_parse_object(cbs, cbs_tag)); + if (obj == nullptr) { + return 0; + } + ASN1_OBJECT_free((ASN1_OBJECT *)*pval); + *pval = (ASN1_VALUE *)obj.release(); + return 1; + } + case V_ASN1_NULL: { + CBS null; + if (!CBS_get_asn1(cbs, &null, cbs_tag)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + if (CBS_len(&null) != 0) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NULL_IS_WRONG_LENGTH); - goto err; + return 0; } *pval = (ASN1_VALUE *)1; - break; - - case V_ASN1_BOOLEAN: - if (len != 1) { + return 1; + } + case V_ASN1_BOOLEAN: { + CBS child; + if (!CBS_get_asn1(cbs, &child, cbs_tag)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + // TODO(crbug.com/42290221): Reject invalid BOOLEAN encodings and just + // call |CBS_get_asn1_bool|. + if (CBS_len(&child) != 1) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_BOOLEAN_IS_WRONG_LENGTH); - goto err; - } else { - ASN1_BOOLEAN *tbool; - tbool = (ASN1_BOOLEAN *)pval; - *tbool = *cont; + return 0; } - break; + ASN1_BOOLEAN *tbool; + tbool = (ASN1_BOOLEAN *)pval; + *tbool = CBS_data(&child)[0]; + return 1; + } + } + // All other types as an |ASN1_STRING| representation. + ASN1_STRING *str = ensure_string(pval); + if (str == nullptr) { + return 0; + } + + switch (utype) { case V_ASN1_BIT_STRING: - if (!c2i_ASN1_BIT_STRING((ASN1_BIT_STRING **)pval, &cont, len)) { - goto err; - } - break; - + return asn1_parse_bit_string(cbs, str, cbs_tag); case V_ASN1_INTEGER: + return asn1_parse_integer(cbs, str, cbs_tag); case V_ASN1_ENUMERATED: - tint = (ASN1_INTEGER **)pval; - if (!c2i_ASN1_INTEGER(tint, &cont, len)) { - goto err; - } - // Fixup type to match the expected form - (*tint)->type = utype | ((*tint)->type & V_ASN1_NEG); - break; - + return asn1_parse_enumerated(cbs, str, cbs_tag); + case V_ASN1_UNIVERSALSTRING: + return asn1_parse_universal_string(cbs, str, cbs_tag); + case V_ASN1_BMPSTRING: + return asn1_parse_bmp_string(cbs, str, cbs_tag); + case V_ASN1_UTF8STRING: + return asn1_parse_utf8_string(cbs, str, cbs_tag); + case V_ASN1_UTCTIME: + // TODO(crbug.com/42290221): Reject timezone offsets. We need to parse + // invalid timestamps in |X509| objects, but that parser no longer uses + // this code. + return asn1_parse_utc_time(cbs, str, cbs_tag, + /*allow_timezone_offset=*/1); + case V_ASN1_GENERALIZEDTIME: + return asn1_parse_generalized_time(cbs, str, cbs_tag); case V_ASN1_OCTET_STRING: case V_ASN1_NUMERICSTRING: case V_ASN1_PRINTABLESTRING: case V_ASN1_T61STRING: case V_ASN1_VIDEOTEXSTRING: case V_ASN1_IA5STRING: - case V_ASN1_UTCTIME: - case V_ASN1_GENERALIZEDTIME: case V_ASN1_GRAPHICSTRING: case V_ASN1_VISIBLESTRING: case V_ASN1_GENERALSTRING: - case V_ASN1_UNIVERSALSTRING: - case V_ASN1_BMPSTRING: - case V_ASN1_UTF8STRING: - case V_ASN1_OTHER: - case V_ASN1_SET: + // T61String is parsed as Latin-1, so all byte strings are valid. The + // others we currently do not enforce. + // + // TODO(crbug.com/42290290): Enforce the encoding of the other string + // types. + if (!asn1_parse_octet_string(cbs, str, cbs_tag)) { + return 0; + } + str->type = utype; + return 1; case V_ASN1_SEQUENCE: { - CBS cbs; - CBS_init(&cbs, cont, (size_t)len); - if (utype == V_ASN1_BMPSTRING) { - while (CBS_len(&cbs) != 0) { - uint32_t c; - if (!CBS_get_ucs2_be(&cbs, &c)) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_BMPSTRING); - goto err; - } - } + // Save the entire element in the string. + CBS elem; + if (!CBS_get_asn1_element(cbs, &elem, cbs_tag)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; } - if (utype == V_ASN1_UNIVERSALSTRING) { - while (CBS_len(&cbs) != 0) { - uint32_t c; - if (!CBS_get_utf32_be(&cbs, &c)) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_UNIVERSALSTRING); - goto err; - } - } - } - if (utype == V_ASN1_UTF8STRING) { - while (CBS_len(&cbs) != 0) { - uint32_t c; - if (!CBS_get_utf8(&cbs, &c)) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_UTF8STRING); - goto err; - } - } - } - if (utype == V_ASN1_UTCTIME) { - if (!CBS_parse_utc_time(&cbs, NULL, /*allow_timezone_offset=*/1)) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_TIME_FORMAT); - goto err; - } - } - if (utype == V_ASN1_GENERALIZEDTIME) { - if (!CBS_parse_generalized_time(&cbs, NULL, - /*allow_timezone_offset=*/0)) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_TIME_FORMAT); - goto err; - } - } - // TODO(https://crbug.com/boringssl/427): Check other string types. - - // All based on ASN1_STRING and handled the same - if (!*pval) { - stmp = ASN1_STRING_type_new(utype); - if (!stmp) { - goto err; - } - *pval = (ASN1_VALUE *)stmp; - } else { - stmp = (ASN1_STRING *)*pval; - stmp->type = utype; - } - if (!ASN1_STRING_set(stmp, cont, len)) { - ASN1_STRING_free(stmp); - *pval = NULL; - goto err; - } - break; + str->type = V_ASN1_SEQUENCE; + return ASN1_STRING_set(str, CBS_data(&elem), CBS_len(&elem)); } - default: OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE); - goto err; - } - // If ASN1_ANY and NULL type fix up value - if (typ && (utype == V_ASN1_NULL)) { - typ->value.ptr = NULL; - } - - ret = 1; -err: - if (!ret) { - ASN1_TYPE_free(typ); - if (opval) { - *opval = NULL; + return 0; } - } - return ret; } // Check an ASN1 tag and length: a bit like ASN1_get_object but it diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_enc.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_enc.cc index 9aa2039db4..07d74a8543 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_enc.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_enc.cc @@ -44,7 +44,7 @@ static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out, int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it) { if (out && !*out) { unsigned char *p, *buf; - int len = ASN1_item_ex_i2d(&val, NULL, it, /*tag=*/-1, /*aclass=*/0); + int len = ASN1_item_ex_i2d(&val, nullptr, it, /*tag=*/-1, /*aclass=*/0); if (len <= 0) { return len; } @@ -81,13 +81,13 @@ int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, int asn1_item_ex_i2d_opt(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass, int optional) { - const ASN1_TEMPLATE *tt = NULL; + const ASN1_TEMPLATE *tt = nullptr; int i, seqcontlen, seqlen; // Historically, |aclass| was repurposed to pass additional flags into the // encoding process. assert((aclass & ASN1_TFLG_TAG_CLASS) == aclass); - // If not overridding the tag, |aclass| is ignored and should be zero. + // If not overriding the tag, |aclass| is ignored and should be zero. assert(tag != -1 || aclass == 0); // All fields are pointers, except for boolean |ASN1_ITYPE_PRIMITIVE|s. @@ -189,8 +189,8 @@ int asn1_item_ex_i2d_opt(ASN1_VALUE **pval, unsigned char **out, return -1; } pseqval = asn1_get_field_ptr(pval, seqtt); - tmplen = - asn1_template_ex_i2d(pseqval, NULL, seqtt, -1, 0, /*optional=*/0); + tmplen = asn1_template_ex_i2d(pseqval, nullptr, seqtt, -1, 0, + /*optional=*/0); if (tmplen == -1 || (tmplen > INT_MAX - seqcontlen)) { return -1; } @@ -238,7 +238,7 @@ static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out, // Historically, |iclass| was repurposed to pass additional flags into the // encoding process. assert((iclass & ASN1_TFLG_TAG_CLASS) == iclass); - // If not overridding the tag, |iclass| is ignored and should be zero. + // If not overriding the tag, |iclass| is ignored and should be zero. assert(tag != -1 || iclass == 0); // Work out tag and class to use: tagging may come either from the @@ -315,7 +315,8 @@ static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out, for (j = 0; j < sk_ASN1_VALUE_num(sk); j++) { int tmplen; skitem = sk_ASN1_VALUE_value(sk, j); - tmplen = ASN1_item_ex_i2d(&skitem, NULL, ASN1_ITEM_ptr(tt->item), -1, 0); + tmplen = + ASN1_item_ex_i2d(&skitem, nullptr, ASN1_ITEM_ptr(tt->item), -1, 0); if (tmplen == -1 || (skcontlen > INT_MAX - tmplen)) { return -1; } @@ -353,7 +354,7 @@ static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out, if (flags & ASN1_TFLG_EXPTAG) { // EXPLICIT tagging // Find length of tagged item - i = asn1_item_ex_i2d_opt(pval, NULL, ASN1_ITEM_ptr(tt->item), -1, 0, + i = asn1_item_ex_i2d_opt(pval, nullptr, ASN1_ITEM_ptr(tt->item), -1, 0, optional); if (i <= 0) { return i; @@ -417,7 +418,7 @@ static int asn1_set_seq_out(STACK_OF(ASN1_VALUE) *sk, unsigned char **out, DER_ENC *encoded = reinterpret_cast( OPENSSL_calloc(sk_ASN1_VALUE_num(sk), sizeof(*encoded))); uint8_t *p = buf; - if (encoded == NULL || buf == NULL) { + if (encoded == nullptr || buf == nullptr) { goto err; } @@ -458,7 +459,7 @@ static int asn1_i2d_ex_primitive(ASN1_VALUE **pval, unsigned char **out, // Get length of content octets and maybe find out the underlying type. int omit; int utype = it->utype; - int len = asn1_ex_i2c(pval, NULL, &omit, &utype, it); + int len = asn1_ex_i2c(pval, nullptr, &omit, &utype, it); if (len < 0) { return -1; } @@ -519,7 +520,7 @@ static int asn1_i2d_ex_primitive(ASN1_VALUE **pval, unsigned char **out, // without omitting the element. ASN.1 values may have empty contents. static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *out_omit, int *putype, const ASN1_ITEM *it) { - ASN1_BOOLEAN *tbool = NULL; + ASN1_BOOLEAN *tbool = nullptr; ASN1_STRING *strtmp; ASN1_OBJECT *otmp; int utype; @@ -530,7 +531,7 @@ static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *out_omit, assert(it->itype == ASN1_ITYPE_PRIMITIVE || it->itype == ASN1_ITYPE_MSTRING); // Historically, |it->funcs| for primitive types contained an // |ASN1_PRIMITIVE_FUNCS| table of callbacks. - assert(it->funcs == NULL); + assert(it->funcs == nullptr); *out_omit = 0; @@ -543,7 +544,7 @@ static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *out_omit, } } - if (it->itype == ASN1_ITYPE_MSTRING || it->utype == V_ASN1_ANY_AS_STRING) { + if (it->itype == ASN1_ITYPE_MSTRING) { // If MSTRING type set the underlying type strtmp = (ASN1_STRING *)*pval; utype = strtmp->type; @@ -589,7 +590,7 @@ static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *out_omit, break; case V_ASN1_NULL: - cont = NULL; + cont = nullptr; len = 0; break; @@ -613,7 +614,7 @@ static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *out_omit, case V_ASN1_BIT_STRING: { int ret = - i2c_ASN1_BIT_STRING((ASN1_BIT_STRING *)*pval, cout ? &cout : NULL); + i2c_ASN1_BIT_STRING((ASN1_BIT_STRING *)*pval, cout ? &cout : nullptr); // |i2c_ASN1_BIT_STRING| returns zero on error instead of -1. return ret <= 0 ? -1 : ret; } @@ -621,7 +622,7 @@ static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *out_omit, case V_ASN1_INTEGER: case V_ASN1_ENUMERATED: { // |i2c_ASN1_INTEGER| also handles ENUMERATED. - int ret = i2c_ASN1_INTEGER((ASN1_INTEGER *)*pval, cout ? &cout : NULL); + int ret = i2c_ASN1_INTEGER((ASN1_INTEGER *)*pval, cout ? &cout : nullptr); // |i2c_ASN1_INTEGER| returns zero on error instead of -1. return ret <= 0 ? -1 : ret; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_fre.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_fre.cc index 8d1fefe32c..b2ea46604b 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_fre.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_fre.cc @@ -50,9 +50,9 @@ void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { case ASN1_ITYPE_CHOICE: { const ASN1_AUX *aux = reinterpret_cast(it->funcs); - ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL; + ASN1_aux_cb *asn1_cb = aux != nullptr ? aux->asn1_cb : nullptr; if (asn1_cb) { - if (asn1_cb(ASN1_OP_FREE_PRE, pval, it, NULL) == 2) { + if (asn1_cb(ASN1_OP_FREE_PRE, pval, it, nullptr) == 2) { return; } } @@ -63,10 +63,10 @@ void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { ASN1_template_free(pchval, tt); } if (asn1_cb) { - asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL); + asn1_cb(ASN1_OP_FREE_POST, pval, it, nullptr); } OPENSSL_free(*pval); - *pval = NULL; + *pval = nullptr; break; } @@ -84,15 +84,15 @@ void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { return; } const ASN1_AUX *aux = reinterpret_cast(it->funcs); - ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL; + ASN1_aux_cb *asn1_cb = aux != nullptr ? aux->asn1_cb : nullptr; if (asn1_cb) { - if (asn1_cb(ASN1_OP_FREE_PRE, pval, it, NULL) == 2) { + if (asn1_cb(ASN1_OP_FREE_PRE, pval, it, nullptr) == 2) { return; } } asn1_enc_free(pval, it); // If we free up as normal we will invalidate any ANY DEFINED BY - // field and we wont be able to determine the type of the field it + // field and we won't be able to determine the type of the field it // defines. So free up in reverse order. for (int i = it->tcount - 1; i >= 0; i--) { const ASN1_TEMPLATE *seqtt = asn1_do_adb(pval, &it->templates[i], 0); @@ -103,10 +103,10 @@ void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { ASN1_template_free(pseqval, seqtt); } if (asn1_cb) { - asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL); + asn1_cb(ASN1_OP_FREE_POST, pval, it, nullptr); } OPENSSL_free(*pval); - *pval = NULL; + *pval = nullptr; break; } } @@ -120,7 +120,7 @@ void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) { ASN1_item_ex_free(&vtmp, ASN1_ITEM_ptr(tt->item)); } sk_ASN1_VALUE_free(sk); - *pval = NULL; + *pval = nullptr; } else { ASN1_item_ex_free(pval, ASN1_ITEM_ptr(tt->item)); } @@ -128,8 +128,8 @@ void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) { void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { // Historically, |it->funcs| for primitive types contained an - // |ASN1_PRIMITIVE_FUNCS| table of calbacks. - assert(it->funcs == NULL); + // |ASN1_PRIMITIVE_FUNCS| table of callbacks. + assert(it->funcs == nullptr); int utype = it->itype == ASN1_ITYPE_MSTRING ? -1 : it->utype; switch (utype) { @@ -149,7 +149,7 @@ void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { break; case V_ASN1_ANY: - if (*pval != NULL) { + if (*pval != nullptr) { asn1_type_cleanup((ASN1_TYPE *)*pval); OPENSSL_free(*pval); } @@ -157,8 +157,8 @@ void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { default: ASN1_STRING_free((ASN1_STRING *)*pval); - *pval = NULL; + *pval = nullptr; break; } - *pval = NULL; + *pval = nullptr; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_new.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_new.cc index 13bdbb8d2a..8756830bb5 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_new.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_new.cc @@ -32,17 +32,17 @@ static int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it); static void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it); ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it) { - ASN1_VALUE *ret = NULL; + ASN1_VALUE *ret = nullptr; if (ASN1_item_ex_new(&ret, it) > 0) { return ret; } - return NULL; + return nullptr; } // Allocate an ASN1 structure int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { - const ASN1_TEMPLATE *tt = NULL; + const ASN1_TEMPLATE *tt = nullptr; const ASN1_EXTERN_FUNCS *ef; ASN1_VALUE **pseqval; int i; @@ -75,9 +75,9 @@ int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { case ASN1_ITYPE_CHOICE: { const ASN1_AUX *aux = reinterpret_cast(it->funcs); - ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL; + ASN1_aux_cb *asn1_cb = aux != nullptr ? aux->asn1_cb : nullptr; if (asn1_cb) { - i = asn1_cb(ASN1_OP_NEW_PRE, pval, it, NULL); + i = asn1_cb(ASN1_OP_NEW_PRE, pval, it, nullptr); if (!i) { goto auxerr; } @@ -90,7 +90,7 @@ int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { goto memerr; } asn1_set_choice_selector(pval, -1, it); - if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL)) { + if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, nullptr)) { goto auxerr2; } break; @@ -98,9 +98,9 @@ int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { case ASN1_ITYPE_SEQUENCE: { const ASN1_AUX *aux = reinterpret_cast(it->funcs); - ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL; + ASN1_aux_cb *asn1_cb = aux != nullptr ? aux->asn1_cb : nullptr; if (asn1_cb) { - i = asn1_cb(ASN1_OP_NEW_PRE, pval, it, NULL); + i = asn1_cb(ASN1_OP_NEW_PRE, pval, it, nullptr); if (!i) { goto auxerr; } @@ -120,7 +120,7 @@ int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { goto memerr2; } } - if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL)) { + if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, nullptr)) { goto auxerr2; } break; @@ -143,7 +143,7 @@ auxerr: static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it) { switch (it->itype) { case ASN1_ITYPE_EXTERN: - *pval = NULL; + *pval = nullptr; break; case ASN1_ITYPE_PRIMITIVE: @@ -160,7 +160,7 @@ static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it) { case ASN1_ITYPE_CHOICE: case ASN1_ITYPE_SEQUENCE: - *pval = NULL; + *pval = nullptr; break; } } @@ -175,7 +175,7 @@ static int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) { // If ANY DEFINED BY nothing to do if (tt->flags & ASN1_TFLG_ADB_MASK) { - *pval = NULL; + *pval = nullptr; return 1; } // If SET OF or SEQUENCE OF, its a STACK @@ -199,7 +199,7 @@ done: static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) { // If ADB or STACK just NULL the field if (tt->flags & (ASN1_TFLG_ADB_MASK | ASN1_TFLG_SK_MASK)) { - *pval = NULL; + *pval = nullptr; } else { asn1_item_clear(pval, ASN1_ITEM_ptr(tt->item)); } @@ -214,8 +214,8 @@ static int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { } // Historically, |it->funcs| for primitive types contained an - // |ASN1_PRIMITIVE_FUNCS| table of calbacks. - assert(it->funcs == NULL); + // |ASN1_PRIMITIVE_FUNCS| table of callbacks. + assert(it->funcs == nullptr); int utype; if (it->itype == ASN1_ITYPE_MSTRING) { @@ -242,7 +242,7 @@ static int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { if (!typ) { return 0; } - typ->value.ptr = NULL; + typ->value.ptr = nullptr; typ->type = -1; *pval = (ASN1_VALUE *)typ; break; @@ -261,8 +261,8 @@ static int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { static void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it) { int utype; // Historically, |it->funcs| for primitive types contained an - // |ASN1_PRIMITIVE_FUNCS| table of calbacks. - assert(it == NULL || it->funcs == NULL); + // |ASN1_PRIMITIVE_FUNCS| table of callbacks. + assert(it == nullptr || it->funcs == nullptr); if (!it || (it->itype == ASN1_ITYPE_MSTRING)) { utype = -1; } else { @@ -271,6 +271,6 @@ static void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it) { if (utype == V_ASN1_BOOLEAN) { *(ASN1_BOOLEAN *)pval = (ASN1_BOOLEAN)it->size; } else { - *pval = NULL; + *pval = nullptr; } } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_typ.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_typ.cc index 1d11ae890a..05931ee4c4 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_typ.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_typ.cc @@ -19,6 +19,9 @@ #include "internal.h" +// TODO(crbug.com/42290417): While we need |ASN1_ITEM|s, the exposed new, free, +// i2d, and d2i functions should call the underlying implementations directly. + #define IMPLEMENT_ASN1_STRING_FUNCTIONS(sname) \ IMPLEMENT_ASN1_TYPE(sname) \ IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(sname, sname, sname) \ @@ -46,7 +49,6 @@ IMPLEMENT_ASN1_FUNCTIONS_const(ASN1_NULL) IMPLEMENT_ASN1_TYPE(ASN1_OBJECT) IMPLEMENT_ASN1_TYPE(ASN1_ANY) -IMPLEMENT_ASN1_TYPE(ASN1_ANY_AS_STRING) // Just swallow an ASN1_SEQUENCE in an ASN1_STRING IMPLEMENT_ASN1_TYPE(ASN1_SEQUENCE) diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_utl.cc b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_utl.cc index 3b1dbfc4de..981fba4eda 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_utl.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/asn1/tasn_utl.cc @@ -51,11 +51,11 @@ int asn1_set_choice_selector(ASN1_VALUE **pval, int value, static CRYPTO_refcount_t *asn1_get_references(ASN1_VALUE **pval, const ASN1_ITEM *it) { if (it->itype != ASN1_ITYPE_SEQUENCE) { - return NULL; + return nullptr; } const ASN1_AUX *aux = reinterpret_cast(it->funcs); if (!aux || !(aux->flags & ASN1_AFLG_REFCOUNT)) { - return NULL; + return nullptr; } return reinterpret_cast( offset2ptr(*pval, aux->ref_offset)); @@ -63,14 +63,14 @@ static CRYPTO_refcount_t *asn1_get_references(ASN1_VALUE **pval, void asn1_refcount_set_one(ASN1_VALUE **pval, const ASN1_ITEM *it) { CRYPTO_refcount_t *references = asn1_get_references(pval, it); - if (references != NULL) { + if (references != nullptr) { *references = 1; } } int asn1_refcount_dec_and_test_zero(ASN1_VALUE **pval, const ASN1_ITEM *it) { CRYPTO_refcount_t *references = asn1_get_references(pval, it); - if (references != NULL) { + if (references != nullptr) { return CRYPTO_refcount_dec_and_test_zero(references); } return 1; @@ -80,11 +80,11 @@ static ASN1_ENCODING *asn1_get_enc_ptr(ASN1_VALUE **pval, const ASN1_ITEM *it) { assert(it->itype == ASN1_ITYPE_SEQUENCE); const ASN1_AUX *aux; if (!pval || !*pval) { - return NULL; + return nullptr; } aux = reinterpret_cast(it->funcs); if (!aux || !(aux->flags & ASN1_AFLG_ENCODING)) { - return NULL; + return nullptr; } return reinterpret_cast(offset2ptr(*pval, aux->enc_offset)); } @@ -92,9 +92,8 @@ static ASN1_ENCODING *asn1_get_enc_ptr(ASN1_VALUE **pval, const ASN1_ITEM *it) { void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it) { ASN1_ENCODING *enc = asn1_get_enc_ptr(pval, it); if (enc) { - enc->enc = NULL; + enc->enc = nullptr; enc->len = 0; - enc->buf = NULL; } } @@ -106,7 +105,7 @@ void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { } int asn1_enc_save(ASN1_VALUE **pval, const uint8_t *in, size_t in_len, - const ASN1_ITEM *it, CRYPTO_BUFFER *buf) { + const ASN1_ITEM *it) { ASN1_ENCODING *enc; enc = asn1_get_enc_ptr(pval, it); if (!enc) { @@ -114,17 +113,9 @@ int asn1_enc_save(ASN1_VALUE **pval, const uint8_t *in, size_t in_len, } asn1_encoding_clear(enc); - if (buf != NULL) { - assert(CRYPTO_BUFFER_data(buf) <= in && - in + in_len <= CRYPTO_BUFFER_data(buf) + CRYPTO_BUFFER_len(buf)); - CRYPTO_BUFFER_up_ref(buf); - enc->buf = buf; - enc->enc = (uint8_t *)in; - } else { - enc->enc = reinterpret_cast(OPENSSL_memdup(in, in_len)); - if (!enc->enc) { - return 0; - } + enc->enc = reinterpret_cast(OPENSSL_memdup(in, in_len)); + if (!enc->enc) { + return 0; } enc->len = in_len; @@ -132,14 +123,9 @@ int asn1_enc_save(ASN1_VALUE **pval, const uint8_t *in, size_t in_len, } void asn1_encoding_clear(ASN1_ENCODING *enc) { - if (enc->buf != NULL) { - CRYPTO_BUFFER_free(enc->buf); - } else { - OPENSSL_free(enc->enc); - } - enc->enc = NULL; + OPENSSL_free(enc->enc); + enc->enc = nullptr; enc->len = 0; - enc->buf = NULL; } int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, @@ -187,7 +173,7 @@ const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt, // Check if NULL int selector; - if (*sfld == NULL) { + if (*sfld == nullptr) { if (!adb->null_tt) { goto err; } @@ -224,5 +210,5 @@ err: if (nullerr) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE); } - return NULL; + return nullptr; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/base64/base64.cc b/naiveproxy/src/third_party/boringssl/src/crypto/base64/base64.cc index 1fbd23ce61..00581c189d 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/base64/base64.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/base64/base64.cc @@ -54,7 +54,7 @@ static uint8_t conv_bin2ascii(uint8_t a) { return ret; } -static_assert(sizeof(((EVP_ENCODE_CTX *)(NULL))->data) % 3 == 0, +static_assert(sizeof(((EVP_ENCODE_CTX *)nullptr)->data) % 3 == 0, "data length must be a multiple of base64 chunk size"); int EVP_EncodedLength(size_t *out_len, size_t len) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bcm_support.h b/naiveproxy/src/third_party/boringssl/src/crypto/bcm_support.h index faea2bbc53..dd82f62adc 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bcm_support.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bcm_support.h @@ -35,13 +35,6 @@ void CRYPTO_init_sysrand(void); // system. void CRYPTO_sysrand(uint8_t *buf, size_t len); -// CRYPTO_sysrand_if_available fills |len| bytes at |buf| with entropy from the -// operating system, or early /dev/urandom data, and returns 1, _if_ the entropy -// pool is initialized or if getrandom() is not available and not in FIPS mode. -// Otherwise it will not block and will instead fill |buf| with all zeros and -// return 0. -int CRYPTO_sysrand_if_available(uint8_t *buf, size_t len); - // CRYPTO_sysrand_for_seed fills |len| bytes at |buf| with entropy from the // operating system. It may draw from the |GRND_RANDOM| pool on Android, // depending on the vendor's configuration. diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bio/bio.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bio/bio.cc index f585d68031..67d11245f6 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bio/bio.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bio/bio.cc @@ -32,8 +32,8 @@ static CRYPTO_EX_DATA_CLASS g_ex_data_class = BIO *BIO_new(const BIO_METHOD *method) { BIO *ret = reinterpret_cast(OPENSSL_zalloc(sizeof(BIO))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->method = method; @@ -41,9 +41,9 @@ BIO *BIO_new(const BIO_METHOD *method) { ret->references = 1; CRYPTO_new_ex_data(&ret->ex_data); - if (method->create != NULL && !method->create(ret)) { + if (method->create != nullptr && !method->create(ret)) { OPENSSL_free(ret); - return NULL; + return nullptr; } return ret; @@ -52,14 +52,14 @@ BIO *BIO_new(const BIO_METHOD *method) { int BIO_free(BIO *bio) { BIO *next_bio; - for (; bio != NULL; bio = next_bio) { + for (; bio != nullptr; bio = next_bio) { if (!CRYPTO_refcount_dec_and_test_zero(&bio->references)) { return 0; } next_bio = BIO_pop(bio); - if (bio->method != NULL && bio->method->destroy != NULL) { + if (bio->method != nullptr && bio->method->destroy != nullptr) { bio->method->destroy(bio); } @@ -79,7 +79,8 @@ void BIO_vfree(BIO *bio) { BIO_free(bio); } void BIO_free_all(BIO *bio) { BIO_free(bio); } int BIO_read(BIO *bio, void *buf, int len) { - if (bio == NULL || bio->method == NULL || bio->method->bread == NULL) { + if (bio == nullptr || bio->method == nullptr || + bio->method->bread == nullptr) { OPENSSL_PUT_ERROR(BIO, BIO_R_UNSUPPORTED_METHOD); return -2; } @@ -98,7 +99,8 @@ int BIO_read(BIO *bio, void *buf, int len) { } int BIO_gets(BIO *bio, char *buf, int len) { - if (bio == NULL || bio->method == NULL || bio->method->bgets == NULL) { + if (bio == nullptr || bio->method == nullptr || + bio->method->bgets == nullptr) { OPENSSL_PUT_ERROR(BIO, BIO_R_UNSUPPORTED_METHOD); return -2; } @@ -117,7 +119,8 @@ int BIO_gets(BIO *bio, char *buf, int len) { } int BIO_write(BIO *bio, const void *in, int inl) { - if (bio == NULL || bio->method == NULL || bio->method->bwrite == NULL) { + if (bio == nullptr || bio->method == nullptr || + bio->method->bwrite == nullptr) { OPENSSL_PUT_ERROR(BIO, BIO_R_UNSUPPORTED_METHOD); return -2; } @@ -158,14 +161,16 @@ int BIO_puts(BIO *bio, const char *in) { return BIO_write(bio, in, (int)len); } -int BIO_flush(BIO *bio) { return (int)BIO_ctrl(bio, BIO_CTRL_FLUSH, 0, NULL); } +int BIO_flush(BIO *bio) { + return (int)BIO_ctrl(bio, BIO_CTRL_FLUSH, 0, nullptr); +} long BIO_ctrl(BIO *bio, int cmd, long larg, void *parg) { - if (bio == NULL) { + if (bio == nullptr) { return 0; } - if (bio->method == NULL || bio->method->ctrl == NULL) { + if (bio->method == nullptr || bio->method->ctrl == nullptr) { OPENSSL_PUT_ERROR(BIO, BIO_R_UNSUPPORTED_METHOD); return -2; } @@ -174,10 +179,10 @@ long BIO_ctrl(BIO *bio, int cmd, long larg, void *parg) { } char *BIO_ptr_ctrl(BIO *b, int cmd, long larg) { - char *p = NULL; + char *p = nullptr; if (BIO_ctrl(b, cmd, larg, (void *)&p) <= 0) { - return NULL; + return nullptr; } return p; @@ -189,9 +194,11 @@ long BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg) { return BIO_ctrl(b, cmd, larg, (void *)&i); } -int BIO_reset(BIO *bio) { return (int)BIO_ctrl(bio, BIO_CTRL_RESET, 0, NULL); } +int BIO_reset(BIO *bio) { + return (int)BIO_ctrl(bio, BIO_CTRL_RESET, 0, nullptr); +} -int BIO_eof(BIO *bio) { return (int)BIO_ctrl(bio, BIO_CTRL_EOF, 0, NULL); } +int BIO_eof(BIO *bio) { return (int)BIO_ctrl(bio, BIO_CTRL_EOF, 0, nullptr); } void BIO_set_flags(BIO *bio, int flags) { bio->flags |= flags; } @@ -245,11 +252,11 @@ void BIO_copy_next_retry(BIO *bio) { } long BIO_callback_ctrl(BIO *bio, int cmd, BIO_info_cb *fp) { - if (bio == NULL) { + if (bio == nullptr) { return 0; } - if (bio->method == NULL || bio->method->callback_ctrl == NULL) { + if (bio->method == nullptr || bio->method->callback_ctrl == nullptr) { OPENSSL_PUT_ERROR(BIO, BIO_R_UNSUPPORTED_METHOD); return 0; } @@ -258,7 +265,7 @@ long BIO_callback_ctrl(BIO *bio, int cmd, BIO_info_cb *fp) { } size_t BIO_pending(const BIO *bio) { - const long r = BIO_ctrl((BIO *)bio, BIO_CTRL_PENDING, 0, NULL); + const long r = BIO_ctrl((BIO *)bio, BIO_CTRL_PENDING, 0, nullptr); assert(r >= 0); if (r < 0) { @@ -270,7 +277,7 @@ size_t BIO_pending(const BIO *bio) { size_t BIO_ctrl_pending(const BIO *bio) { return BIO_pending(bio); } size_t BIO_wpending(const BIO *bio) { - const long r = BIO_ctrl((BIO *)bio, BIO_CTRL_WPENDING, 0, NULL); + const long r = BIO_ctrl((BIO *)bio, BIO_CTRL_WPENDING, 0, nullptr); assert(r >= 0); if (r < 0) { @@ -280,7 +287,7 @@ size_t BIO_wpending(const BIO *bio) { } int BIO_set_close(BIO *bio, int close_flag) { - return (int)BIO_ctrl(bio, BIO_CTRL_SET_CLOSE, close_flag, NULL); + return (int)BIO_ctrl(bio, BIO_CTRL_SET_CLOSE, close_flag, nullptr); } OPENSSL_EXPORT uint64_t BIO_number_read(const BIO *bio) { @@ -294,12 +301,12 @@ OPENSSL_EXPORT uint64_t BIO_number_written(const BIO *bio) { BIO *BIO_push(BIO *bio, BIO *appended_bio) { BIO *last_bio; - if (bio == NULL) { + if (bio == nullptr) { return bio; } last_bio = bio; - while (last_bio->next_bio != NULL) { + while (last_bio->next_bio != nullptr) { last_bio = last_bio->next_bio; } @@ -310,17 +317,17 @@ BIO *BIO_push(BIO *bio, BIO *appended_bio) { BIO *BIO_pop(BIO *bio) { BIO *ret; - if (bio == NULL) { - return NULL; + if (bio == nullptr) { + return nullptr; } ret = bio->next_bio; - bio->next_bio = NULL; + bio->next_bio = nullptr; return ret; } BIO *BIO_next(BIO *bio) { if (!bio) { - return NULL; + return nullptr; } return bio->next_bio; } @@ -329,12 +336,12 @@ BIO *BIO_find_type(BIO *bio, int type) { int method_type, mask; if (!bio) { - return NULL; + return nullptr; } mask = type & 0xff; do { - if (bio->method != NULL) { + if (bio->method != nullptr) { method_type = bio->method->type; if (!mask) { @@ -346,9 +353,9 @@ BIO *BIO_find_type(BIO *bio, int type) { } } bio = bio->next_bio; - } while (bio != NULL); + } while (bio != nullptr); - return NULL; + return nullptr; } int BIO_indent(BIO *bio, unsigned indent, unsigned max_indent) { @@ -391,7 +398,7 @@ static int bio_read_all(BIO *bio, uint8_t **out, size_t *out_len, return 0; } *out = reinterpret_cast(OPENSSL_malloc(len)); - if (*out == NULL) { + if (*out == nullptr) { return 0; } OPENSSL_memcpy(*out, prefix, prefix_len); @@ -423,7 +430,7 @@ static int bio_read_all(BIO *bio, uint8_t **out, size_t *out_len, } uint8_t *new_buf = reinterpret_cast(OPENSSL_realloc(*out, len)); - if (new_buf == NULL) { + if (new_buf == nullptr) { OPENSSL_free(*out); return 0; } @@ -444,7 +451,7 @@ static int bio_read_full(BIO *bio, uint8_t *out, int *out_eof_on_first_read, int todo = len <= INT_MAX ? (int)len : INT_MAX; int ret = BIO_read(bio, out, todo); if (ret <= 0) { - if (out_eof_on_first_read != NULL) { + if (out_eof_on_first_read != nullptr) { *out_eof_on_first_read = first_read && ret == 0; } return 0; @@ -513,7 +520,7 @@ int BIO_read_asn1(BIO *bio, uint8_t **out, size_t *out_len, size_t max_len) { return 0; } - if (!bio_read_full(bio, header + kInitialHeaderLen, NULL, num_bytes)) { + if (!bio_read_full(bio, header + kInitialHeaderLen, nullptr, num_bytes)) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NOT_ENOUGH_DATA); return 0; } @@ -548,11 +555,11 @@ int BIO_read_asn1(BIO *bio, uint8_t **out, size_t *out_len, size_t max_len) { *out_len = len; *out = reinterpret_cast(OPENSSL_malloc(len)); - if (*out == NULL) { + if (*out == nullptr) { return 0; } OPENSSL_memcpy(*out, header, header_len); - if (!bio_read_full(bio, (*out) + header_len, NULL, len - header_len)) { + if (!bio_read_full(bio, (*out) + header_len, nullptr, len - header_len)) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NOT_ENOUGH_DATA); OPENSSL_free(*out); return 0; @@ -581,8 +588,8 @@ int BIO_get_new_index(void) { BIO_METHOD *BIO_meth_new(int type, const char *name) { BIO_METHOD *method = reinterpret_cast(OPENSSL_zalloc(sizeof(BIO_METHOD))); - if (method == NULL) { - return NULL; + if (method == nullptr) { + return nullptr; } method->type = type; method->name = name; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bio/bio_mem.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bio/bio_mem.cc index 5f8c6cf13d..cbca18cb82 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bio/bio_mem.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bio/bio_mem.cc @@ -32,12 +32,12 @@ BIO *BIO_new_mem_buf(const void *buf, ossl_ssize_t len) { if (!buf && len != 0) { OPENSSL_PUT_ERROR(BIO, BIO_R_NULL_PARAMETER); - return NULL; + return nullptr; } ret = BIO_new(BIO_s_mem()); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } b = (BUF_MEM *)ret->ptr; @@ -50,7 +50,7 @@ BIO *BIO_new_mem_buf(const void *buf, ossl_ssize_t len) { // |num| is used to store the value that this BIO will return when it runs // out of data. If it's negative then the retry flags will also be set. Since - // this is static data, retrying wont help + // this is static data, retrying won't help ret->num = 0; return ret; @@ -60,7 +60,7 @@ static int mem_new(BIO *bio) { BUF_MEM *b; b = BUF_MEM_new(); - if (b == NULL) { + if (b == nullptr) { return 0; } @@ -75,16 +75,16 @@ static int mem_new(BIO *bio) { } static int mem_free(BIO *bio) { - if (!bio->shutdown || !bio->init || bio->ptr == NULL) { + if (!bio->shutdown || !bio->init || bio->ptr == nullptr) { return 1; } BUF_MEM *b = (BUF_MEM *)bio->ptr; if (bio->flags & BIO_FLAGS_MEM_RDONLY) { - b->data = NULL; + b->data = nullptr; } BUF_MEM_free(b); - bio->ptr = NULL; + bio->ptr = nullptr; return 1; } @@ -153,7 +153,7 @@ static int mem_gets(BIO *bio, char *buf, int size) { // Stop at the first newline. const char *newline = reinterpret_cast(OPENSSL_memchr(b->data, '\n', ret)); - if (newline != NULL) { + if (newline != nullptr) { ret = (int)(newline - b->data + 1); } @@ -168,7 +168,7 @@ static long mem_ctrl(BIO *bio, int cmd, long num, void *ptr) { BUF_MEM *b = static_cast(bio->ptr); switch (cmd) { case BIO_CTRL_RESET: - if (b->data != NULL) { + if (b->data != nullptr) { // For read only case reset to the start again if (bio->flags & BIO_FLAGS_MEM_RDONLY) { b->data -= b->max - b->length; @@ -198,7 +198,7 @@ static long mem_ctrl(BIO *bio, int cmd, long num, void *ptr) { bio->ptr = ptr; return 1; case BIO_C_GET_BUF_MEM_PTR: - if (ptr != NULL) { + if (ptr != nullptr) { BUF_MEM **out = reinterpret_cast(ptr); *out = b; } @@ -254,5 +254,5 @@ int BIO_set_mem_buf(BIO *bio, BUF_MEM *b, int take_ownership) { } int BIO_set_mem_eof_return(BIO *bio, int eof_value) { - return (int)BIO_ctrl(bio, BIO_C_SET_BUF_MEM_EOF_RETURN, eof_value, NULL); + return (int)BIO_ctrl(bio, BIO_C_SET_BUF_MEM_EOF_RETURN, eof_value, nullptr); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bio/connect.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bio/connect.cc index b6f52280e9..2ef74beac6 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bio/connect.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bio/connect.cc @@ -75,15 +75,15 @@ static int closesocket(int sock) { return close(sock); } // successful, |*out_port| may be NULL on return if no port was specified. static int split_host_and_port(char **out_host, char **out_port, const char *name) { - const char *host, *port = NULL; + const char *host, *port = nullptr; size_t host_len = 0; - *out_host = NULL; - *out_port = NULL; + *out_host = nullptr; + *out_port = nullptr; if (name[0] == '[') { // bracketed IPv6 address const char *close = strchr(name, ']'); - if (close == NULL) { + if (close == nullptr) { return 0; } host = name + 1; @@ -95,7 +95,8 @@ static int split_host_and_port(char **out_host, char **out_port, } } else { const char *colon = strchr(name, ':'); - if (colon == NULL || strchr(colon + 1, ':') != NULL) { // IPv6 address + if (colon == nullptr || + strchr(colon + 1, ':') != nullptr) { // IPv6 address host = name; host_len = strlen(name); } else { // host:port @@ -106,17 +107,17 @@ static int split_host_and_port(char **out_host, char **out_port, } *out_host = OPENSSL_strndup(host, host_len); - if (*out_host == NULL) { + if (*out_host == nullptr) { return 0; } - if (port == NULL) { - *out_port = NULL; + if (port == nullptr) { + *out_port = nullptr; return 1; } *out_port = OPENSSL_strdup(port); - if (*out_port == NULL) { + if (*out_port == nullptr) { OPENSSL_free(*out_host); - *out_host = NULL; + *out_host = nullptr; return 0; } return 1; @@ -124,9 +125,9 @@ static int split_host_and_port(char **out_host, char **out_port, static int conn_state(BIO *bio, BIO_CONNECT *c) { int ret = -1, i; - int (*cb)(BIO *, int, int) = NULL; + int (*cb)(BIO *, int, int) = nullptr; - if (c->info_callback != NULL) { + if (c->info_callback != nullptr) { cb = c->info_callback; } @@ -137,15 +138,15 @@ static int conn_state(BIO *bio, BIO_CONNECT *c) { // exactly what they say. If there is only a hostname, try // (just once) to split it into a hostname and port. - if (c->param_hostname == NULL) { + if (c->param_hostname == nullptr) { OPENSSL_PUT_ERROR(BIO, BIO_R_NO_HOSTNAME_SPECIFIED); goto exit_loop; } - if (c->param_port == NULL) { + if (c->param_port == nullptr) { char *host, *port; if (!split_host_and_port(&host, &port, c->param_hostname) || - port == NULL) { + port == nullptr) { OPENSSL_free(host); OPENSSL_free(port); OPENSSL_PUT_ERROR(BIO, BIO_R_NO_PORT_SPECIFIED); @@ -235,7 +236,7 @@ static int conn_state(BIO *bio, BIO_CONNECT *c) { goto exit_loop; } - if (cb != NULL) { + if (cb != nullptr) { ret = cb((BIO *)bio, c->state, ret); if (ret == 0) { goto end; @@ -244,7 +245,7 @@ static int conn_state(BIO *bio, BIO_CONNECT *c) { } exit_loop: - if (cb != NULL) { + if (cb != nullptr) { ret = cb((BIO *)bio, c->state, ret); } @@ -255,8 +256,8 @@ end: static BIO_CONNECT *BIO_CONNECT_new(void) { BIO_CONNECT *ret = reinterpret_cast(OPENSSL_zalloc(sizeof(BIO_CONNECT))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->state = BIO_CONN_S_BEFORE; return ret; @@ -276,7 +277,7 @@ static int conn_new(BIO *bio) { bio->num = -1; bio->flags = 0; bio->ptr = BIO_CONNECT_new(); - return bio->ptr != NULL; + return bio->ptr != nullptr; } static void conn_close_socket(BIO *bio) { @@ -434,12 +435,12 @@ BIO *BIO_new_connect(const char *hostname) { BIO *ret; ret = BIO_new(BIO_s_connect()); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } if (!BIO_set_conn_hostname(ret, hostname)) { BIO_free(ret); - return NULL; + return nullptr; } return ret; } @@ -467,11 +468,11 @@ int BIO_set_conn_int_port(BIO *bio, const int *port) { } int BIO_set_nbio(BIO *bio, int on) { - return (int)BIO_ctrl(bio, BIO_C_SET_NBIO, on, NULL); + return (int)BIO_ctrl(bio, BIO_C_SET_NBIO, on, nullptr); } int BIO_do_connect(BIO *bio) { - return (int)BIO_ctrl(bio, BIO_C_DO_STATE_MACHINE, 0, NULL); + return (int)BIO_ctrl(bio, BIO_C_DO_STATE_MACHINE, 0, nullptr); } #endif // OPENSSL_NO_SOCK diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bio/fd.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bio/fd.cc index c5dc64a06f..bbbd8a173a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bio/fd.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bio/fd.cc @@ -46,8 +46,8 @@ BIO *BIO_new_fd(int fd, int close_flag) { BIO *ret = BIO_new(BIO_s_fd()); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } BIO_set_fd(ret, fd, close_flag); return ret; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bio/file.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bio/file.cc index 8c0515621d..91ca48c2c9 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bio/file.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bio/file.cc @@ -56,7 +56,7 @@ #else static FILE *fopen_if_available(const char *path, const char *mode) { errno = ENOENT; - return NULL; + return nullptr; } #endif @@ -65,7 +65,7 @@ BIO *BIO_new_file(const char *filename, const char *mode) { FILE *file; file = fopen_if_available(filename, mode); - if (file == NULL) { + if (file == nullptr) { OPENSSL_PUT_SYSTEM_ERROR(); ERR_add_error_data(5, "fopen('", filename, "','", mode, "')"); @@ -74,13 +74,13 @@ BIO *BIO_new_file(const char *filename, const char *mode) { } else { OPENSSL_PUT_ERROR(BIO, BIO_R_SYS_LIB); } - return NULL; + return nullptr; } ret = BIO_new_fp(file, BIO_CLOSE); - if (ret == NULL) { + if (ret == nullptr) { fclose(file); - return NULL; + return nullptr; } return ret; @@ -88,8 +88,8 @@ BIO *BIO_new_file(const char *filename, const char *mode) { BIO *BIO_new_fp(FILE *stream, int flags) { BIO *ret = BIO_new(BIO_s_file()); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } BIO_set_fp(ret, stream, flags); @@ -101,9 +101,9 @@ static int file_free(BIO *bio) { return 1; } - if (bio->init && bio->ptr != NULL) { + if (bio->init && bio->ptr != nullptr) { fclose(reinterpret_cast(bio->ptr)); - bio->ptr = NULL; + bio->ptr = nullptr; } bio->init = 0; @@ -270,8 +270,8 @@ int BIO_rw_filename(BIO *bio, const char *filename) { (char *)filename); } -long BIO_tell(BIO *bio) { return BIO_ctrl(bio, BIO_C_FILE_TELL, 0, NULL); } +long BIO_tell(BIO *bio) { return BIO_ctrl(bio, BIO_C_FILE_TELL, 0, nullptr); } long BIO_seek(BIO *bio, long offset) { - return BIO_ctrl(bio, BIO_C_FILE_SEEK, offset, NULL); + return BIO_ctrl(bio, BIO_C_FILE_SEEK, offset, nullptr); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bio/pair.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bio/pair.cc index 50058e8ccf..5004c6b1ff 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bio/pair.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bio/pair.cc @@ -48,7 +48,7 @@ struct bio_bio_st { static int bio_new(BIO *bio) { struct bio_bio_st *b = reinterpret_cast(OPENSSL_zalloc(sizeof *b)); - if (b == NULL) { + if (b == nullptr) { return 0; } @@ -62,29 +62,29 @@ static void bio_destroy_pair(BIO *bio) { BIO *peer_bio; struct bio_bio_st *peer_b; - if (b == NULL) { + if (b == nullptr) { return; } peer_bio = b->peer; - if (peer_bio == NULL) { + if (peer_bio == nullptr) { return; } peer_b = reinterpret_cast(peer_bio->ptr); - assert(peer_b != NULL); + assert(peer_b != nullptr); assert(peer_b->peer == bio); - peer_b->peer = NULL; + peer_b->peer = nullptr; peer_bio->init = 0; - assert(peer_b->buf != NULL); + assert(peer_b->buf != nullptr); peer_b->len = 0; peer_b->offset = 0; - b->peer = NULL; + b->peer = nullptr; bio->init = 0; - assert(b->buf != NULL); + assert(b->buf != nullptr); b->len = 0; b->offset = 0; } @@ -92,7 +92,7 @@ static void bio_destroy_pair(BIO *bio) { static int bio_free(BIO *bio) { struct bio_bio_st *b = reinterpret_cast(bio->ptr); - assert(b != NULL); + assert(b != nullptr); if (b->peer) { bio_destroy_pair(bio); @@ -116,15 +116,15 @@ static int bio_read(BIO *bio, char *buf, int size_) { } b = reinterpret_cast(bio->ptr); - assert(b != NULL); - assert(b->peer != NULL); + assert(b != nullptr); + assert(b->peer != nullptr); peer_b = reinterpret_cast(b->peer->ptr); - assert(peer_b != NULL); - assert(peer_b->buf != NULL); + assert(peer_b != nullptr); + assert(peer_b->buf != nullptr); peer_b->request = 0; // will be set in "retry_read" situation - if (buf == NULL || size == 0) { + if (buf == nullptr || size == 0) { return 0; } @@ -195,14 +195,14 @@ static int bio_write(BIO *bio, const char *buf, int num_) { BIO_clear_retry_flags(bio); - if (!bio->init || buf == NULL || num == 0) { + if (!bio->init || buf == nullptr || num == 0) { return 0; } b = reinterpret_cast(bio->ptr); - assert(b != NULL); - assert(b->peer != NULL); - assert(b->buf != NULL); + assert(b != nullptr); + assert(b->peer != nullptr); + assert(b->buf != nullptr); b->request = 0; if (b->closed) { @@ -265,35 +265,35 @@ static int bio_make_pair(BIO *bio1, BIO *bio2, size_t writebuf1_len, size_t writebuf2_len) { struct bio_bio_st *b1, *b2; - assert(bio1 != NULL); - assert(bio2 != NULL); + assert(bio1 != nullptr); + assert(bio2 != nullptr); b1 = reinterpret_cast(bio1->ptr); b2 = reinterpret_cast(bio2->ptr); - if (b1->peer != NULL || b2->peer != NULL) { + if (b1->peer != nullptr || b2->peer != nullptr) { OPENSSL_PUT_ERROR(BIO, BIO_R_IN_USE); return 0; } - if (b1->buf == NULL) { + if (b1->buf == nullptr) { if (writebuf1_len) { b1->size = writebuf1_len; } b1->buf = reinterpret_cast(OPENSSL_malloc(b1->size)); - if (b1->buf == NULL) { + if (b1->buf == nullptr) { return 0; } b1->len = 0; b1->offset = 0; } - if (b2->buf == NULL) { + if (b2->buf == nullptr) { if (writebuf2_len) { b2->size = writebuf2_len; } b2->buf = reinterpret_cast(OPENSSL_malloc(b2->size)); - if (b2->buf == NULL) { + if (b2->buf == nullptr) { return 0; } b2->len = 0; @@ -414,12 +414,12 @@ int BIO_new_bio_pair(BIO **bio1_p, size_t writebuf1_len, BIO **bio2_p, size_t writebuf2_len) { BIO *bio1 = BIO_new(bio_s_bio()); BIO *bio2 = BIO_new(bio_s_bio()); - if (bio1 == NULL || bio2 == NULL || + if (bio1 == nullptr || bio2 == nullptr || !bio_make_pair(bio1, bio2, writebuf1_len, writebuf2_len)) { BIO_free(bio1); BIO_free(bio2); - *bio1_p = NULL; - *bio2_p = NULL; + *bio1_p = nullptr; + *bio2_p = nullptr; return 0; } @@ -429,13 +429,13 @@ int BIO_new_bio_pair(BIO **bio1_p, size_t writebuf1_len, BIO **bio2_p, } size_t BIO_ctrl_get_read_request(BIO *bio) { - return BIO_ctrl(bio, BIO_C_GET_READ_REQUEST, 0, NULL); + return BIO_ctrl(bio, BIO_C_GET_READ_REQUEST, 0, nullptr); } size_t BIO_ctrl_get_write_guarantee(BIO *bio) { - return BIO_ctrl(bio, BIO_C_GET_WRITE_GUARANTEE, 0, NULL); + return BIO_ctrl(bio, BIO_C_GET_WRITE_GUARANTEE, 0, nullptr); } int BIO_shutdown_wr(BIO *bio) { - return (int)BIO_ctrl(bio, BIO_C_SHUTDOWN_WR, 0, NULL); + return (int)BIO_ctrl(bio, BIO_C_SHUTDOWN_WR, 0, nullptr); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bio/printf.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bio/printf.cc index ca74f9508e..0837ee56fa 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bio/printf.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bio/printf.cc @@ -39,7 +39,7 @@ int BIO_printf(BIO *bio, const char *format, ...) { // include a trailing NUL, but the buffer must be sized for it. out = reinterpret_cast(OPENSSL_malloc(requested_len + 1)); out_malloced = 1; - if (out == NULL) { + if (out == nullptr) { return -1; } va_start(args, format); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bio/socket.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bio/socket.cc index 65d91b2084..acf595a0f0 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bio/socket.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bio/socket.cc @@ -47,7 +47,7 @@ static int sock_free(BIO *bio) { } static int sock_read(BIO *b, char *out, int outl) { - if (out == NULL) { + if (out == nullptr) { return 0; } @@ -129,8 +129,8 @@ BIO *BIO_new_socket(int fd, int close_flag) { BIO *ret; ret = BIO_new(BIO_s_socket()); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } BIO_set_fd(ret, fd, close_flag); return ret; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/blake2/blake2.cc b/naiveproxy/src/third_party/boringssl/src/crypto/blake2/blake2.cc index 3f69a6e069..8173015759 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/blake2/blake2.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/blake2/blake2.cc @@ -16,6 +16,8 @@ #include +#include + #include "../internal.h" // https://tools.ietf.org/html/rfc7693#section-2.6 @@ -99,7 +101,7 @@ static void blake2b_transform(BLAKE2B_CTX *b2b, blake2b_load(block, s[15])); } - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(b2b->h); i++) { + for (size_t i = 0; i < std::size(b2b->h); i++) { b2b->h[i] ^= v[i]; b2b->h[i] ^= v[i + 8]; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bn/bn_asn1.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bn/bn_asn1.cc index 38b03eb8d0..71b7ae1b7b 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bn/bn_asn1.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bn/bn_asn1.cc @@ -32,7 +32,7 @@ int BN_parse_asn1_unsigned(CBS *cbs, BIGNUM *ret) { return 0; } - return BN_bin2bn(CBS_data(&child), CBS_len(&child), ret) != NULL; + return BN_bin2bn(CBS_data(&child), CBS_len(&child), ret) != nullptr; } int BN_marshal_asn1(CBB *cbb, const BIGNUM *bn) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bn/convert.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bn/convert.cc index 59ea6d4b84..6996ee09b8 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bn/convert.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bn/convert.cc @@ -41,8 +41,8 @@ char *BN_bn2hex(const BIGNUM *bn) { char *buf = reinterpret_cast( OPENSSL_malloc(1 /* leading '-' */ + 1 /* zero is non-empty */ + width * BN_BYTES * 2 + 1 /* trailing NUL */)); - if (buf == NULL) { - return NULL; + if (buf == nullptr) { + return nullptr; } char *p = buf; @@ -139,11 +139,11 @@ typedef int (*char_test_func)(int c); static int bn_x2bn(BIGNUM **outp, const char *in, decode_func decode, char_test_func want_char) { - BIGNUM *ret = NULL; + BIGNUM *ret = nullptr; int neg = 0, i; int num; - if (in == NULL || *in == 0) { + if (in == nullptr || *in == 0) { return 0; } @@ -156,14 +156,14 @@ static int bn_x2bn(BIGNUM **outp, const char *in, decode_func decode, } num = i + neg; - if (outp == NULL) { + if (outp == nullptr) { return num; } // in is the start of the hex digits, and it is 'i' long - if (*outp == NULL) { + if (*outp == nullptr) { ret = BN_new(); - if (ret == NULL) { + if (ret == nullptr) { return 0; } } else { @@ -184,7 +184,7 @@ static int bn_x2bn(BIGNUM **outp, const char *in, decode_func decode, return num; err: - if (*outp == NULL) { + if (*outp == nullptr) { BN_free(ret); } @@ -300,7 +300,7 @@ int BN_print(BIO *bp, const BIGNUM *a) { int BN_print_fp(FILE *fp, const BIGNUM *a) { BIO *b = BIO_new_fp(fp, BIO_NOCLOSE); - if (b == NULL) { + if (b == nullptr) { return 0; } @@ -330,7 +330,7 @@ size_t BN_bn2mpi(const BIGNUM *in, uint8_t *out) { return 4; } - if (out == NULL) { + if (out == nullptr) { return 4 + len; } @@ -351,7 +351,7 @@ size_t BN_bn2mpi(const BIGNUM *in, uint8_t *out) { BIGNUM *BN_mpi2bn(const uint8_t *in, size_t len, BIGNUM *out) { if (len < 4) { OPENSSL_PUT_ERROR(BN, BN_R_BAD_ENCODING); - return NULL; + return nullptr; } const size_t in_len = ((size_t)in[0] << 24) | // ((size_t)in[1] << 16) | // @@ -359,14 +359,14 @@ BIGNUM *BN_mpi2bn(const uint8_t *in, size_t len, BIGNUM *out) { ((size_t)in[3]); if (in_len != len - 4) { OPENSSL_PUT_ERROR(BN, BN_R_BAD_ENCODING); - return NULL; + return nullptr; } int out_is_alloced = 0; - if (out == NULL) { + if (out == nullptr) { out = BN_new(); - if (out == NULL) { - return NULL; + if (out == nullptr) { + return nullptr; } out_is_alloced = 1; } @@ -377,11 +377,11 @@ BIGNUM *BN_mpi2bn(const uint8_t *in, size_t len, BIGNUM *out) { } in += 4; - if (BN_bin2bn(in, in_len, out) == NULL) { + if (BN_bin2bn(in, in_len, out) == nullptr) { if (out_is_alloced) { BN_free(out); } - return NULL; + return nullptr; } out->neg = ((*in) & 0x80) != 0; if (out->neg) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bn/div.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bn/div.cc index 868a2a3b00..ce4c4c683c 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bn/div.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bn/div.cc @@ -30,7 +30,7 @@ int BN_mod_pow2(BIGNUM *r, const BIGNUM *a, size_t e) { // If |a| definitely has less than |e| bits, just BN_copy. if ((size_t)a->width < num_words) { - return BN_copy(r, a) != NULL; + return BN_copy(r, a) != nullptr; } // Otherwise, first make sure we have enough space in |r|. diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bn/exponentiation.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bn/exponentiation.cc index 07f9ec6795..fcae5fed83 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bn/exponentiation.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bn/exponentiation.cc @@ -31,17 +31,17 @@ int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) { } BIGNUM *v = BN_CTX_get(ctx); - if (rr == NULL || v == NULL) { + if (rr == nullptr || v == nullptr) { return 0; } - if (BN_copy(v, a) == NULL) { + if (BN_copy(v, a) == nullptr) { return 0; } int bits = BN_num_bits(p); if (BN_is_odd(p)) { - if (BN_copy(rr, a) == NULL) { + if (BN_copy(rr, a) == nullptr) { return 0; } } else { @@ -114,7 +114,7 @@ int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, } if (BN_is_odd(m)) { - return BN_mod_exp_mont(r, a, p, m, ctx, NULL); + return BN_mod_exp_mont(r, a, p, m, ctx, nullptr); } return mod_exp_even(r, a, p, m, ctx); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bn/sqrt.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bn/sqrt.cc index e23f1a3bbc..56a0f003bb 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bn/sqrt.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bn/sqrt.cc @@ -39,7 +39,8 @@ int BN_sqrt(BIGNUM *out_sqrt, const BIGNUM *in, BN_CTX *ctx) { tmp = BN_CTX_get(ctx); last_delta = BN_CTX_get(ctx); delta = BN_CTX_get(ctx); - if (estimate == NULL || tmp == NULL || last_delta == NULL || delta == NULL) { + if (estimate == nullptr || tmp == nullptr || last_delta == nullptr || + delta == nullptr) { goto err; } @@ -52,9 +53,8 @@ int BN_sqrt(BIGNUM *out_sqrt, const BIGNUM *in, BN_CTX *ctx) { // |in| = 0. for (;;) { // |estimate| = 1/2 * (|estimate| + |in|/|estimate|) - if (!BN_div(tmp, NULL, in, estimate, ctx) || - !BN_add(tmp, tmp, estimate) || - !BN_rshift1(estimate, tmp) || + if (!BN_div(tmp, nullptr, in, estimate, ctx) || + !BN_add(tmp, tmp, estimate) || !BN_rshift1(estimate, tmp) || // |tmp| = |estimate|^2 !BN_sqr(tmp, estimate, ctx) || // |delta| = |in| - |tmp| diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/buf/buf.cc b/naiveproxy/src/third_party/boringssl/src/crypto/buf/buf.cc index cb797b2a57..aa41e56faf 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/buf/buf.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/buf/buf.cc @@ -53,7 +53,7 @@ int BUF_MEM_reserve(BUF_MEM *buf, size_t cap) { char *new_buf = reinterpret_cast(OPENSSL_realloc(buf->data, alloc_size)); - if (new_buf == NULL) { + if (new_buf == nullptr) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/asn1_compat.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/asn1_compat.cc index 6c9770ba63..387445d87a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/asn1_compat.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/asn1_compat.cc @@ -39,10 +39,10 @@ int CBB_finish_i2d(CBB *cbb, uint8_t **outp) { OPENSSL_free(der); return -1; } - if (outp != NULL) { - if (*outp == NULL) { + if (outp != nullptr) { + if (*outp == nullptr) { *outp = der; - der = NULL; + der = nullptr; } else { OPENSSL_memcpy(*outp, der, der_len); *outp += der_len; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/ber.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/ber.cc index 758bf0afde..ebd5310371 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/ber.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/ber.cc @@ -128,7 +128,7 @@ static int cbs_convert_ber(CBS *in, CBB *out, CBS_ASN1_TAG string_tag, int indefinite; CBB *out_contents, out_contents_storage; if (!CBS_get_any_ber_asn1_element(in, &contents, &tag, &header_len, - /*out_ber_found=*/NULL, &indefinite)) { + /*out_ber_found=*/nullptr, &indefinite)) { return 0; } @@ -200,10 +200,10 @@ int CBS_asn1_ber_to_der(CBS *in, CBS *out, uint8_t **out_storage) { } if (!conversion_needed) { - if (!CBS_get_any_asn1_element(in, out, NULL, NULL)) { + if (!CBS_get_any_asn1_element(in, out, nullptr, nullptr)) { return 0; } - *out_storage = NULL; + *out_storage = nullptr; return 1; } @@ -228,7 +228,7 @@ int CBS_get_asn1_implicit_string(CBS *in, CBS *out, uint8_t **out_storage, if (CBS_peek_asn1_tag(in, outer_tag)) { // Normal implicitly-tagged string. - *out_storage = NULL; + *out_storage = nullptr; return CBS_get_asn1(in, out, outer_tag); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/cbb.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/cbb.cc index 86b772b38e..2d004bf776 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/cbb.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/cbb.cc @@ -28,7 +28,7 @@ void CBB_zero(CBB *cbb) { OPENSSL_memset(cbb, 0, sizeof(CBB)); } static void cbb_init(CBB *cbb, uint8_t *buf, size_t cap, int can_resize) { cbb->is_child = 0; - cbb->child = NULL; + cbb->child = nullptr; cbb->u.base.buf = buf; cbb->u.base.len = 0; cbb->u.base.cap = cap; @@ -40,7 +40,7 @@ int CBB_init(CBB *cbb, size_t initial_capacity) { CBB_zero(cbb); uint8_t *buf = reinterpret_cast(OPENSSL_malloc(initial_capacity)); - if (initial_capacity > 0 && buf == NULL) { + if (initial_capacity > 0 && buf == nullptr) { return 0; } @@ -69,7 +69,7 @@ void CBB_cleanup(CBB *cbb) { static int cbb_buffer_reserve(struct cbb_buffer_st *base, uint8_t **out, size_t len) { - if (base == NULL) { + if (base == nullptr) { return 0; } @@ -92,7 +92,7 @@ static int cbb_buffer_reserve(struct cbb_buffer_st *base, uint8_t **out, } uint8_t *newbuf = reinterpret_cast(OPENSSL_realloc(base->buf, newcap)); - if (newbuf == NULL) { + if (newbuf == nullptr) { goto err; } @@ -131,18 +131,18 @@ int CBB_finish(CBB *cbb, uint8_t **out_data, size_t *out_len) { return 0; } - if (cbb->u.base.can_resize && (out_data == NULL || out_len == NULL)) { + if (cbb->u.base.can_resize && (out_data == nullptr || out_len == nullptr)) { // |out_data| and |out_len| can only be NULL if the CBB is fixed. return 0; } - if (out_data != NULL) { + if (out_data != nullptr) { *out_data = cbb->u.base.buf; } - if (out_len != NULL) { + if (out_len != nullptr) { *out_len = cbb->u.base.len; } - cbb->u.base.buf = NULL; + cbb->u.base.buf = nullptr; CBB_cleanup(cbb); return 1; } @@ -174,7 +174,7 @@ static void cbb_on_error(CBB *cbb) { // Clearing the pointer is not strictly necessary, but GCC's dangling pointer // warning does not know |cbb->child| will not be read once |error| is set // above. - cbb->child = NULL; + cbb->child = nullptr; } // CBB_flush recurses and then writes out any pending length prefix. The @@ -185,11 +185,11 @@ int CBB_flush(CBB *cbb) { // fail all following calls. In particular, |cbb->child| may point to invalid // memory. struct cbb_buffer_st *base = cbb_get_base(cbb); - if (base == NULL || base->error) { + if (base == nullptr || base->error) { return 0; } - if (cbb->child == NULL) { + if (cbb->child == nullptr) { // Nothing to flush. return 1; } @@ -241,7 +241,7 @@ int CBB_flush(CBB *cbb) { if (len_len != 1) { // We need to move the contents along in order to make space. size_t extra_bytes = len_len - 1; - if (!cbb_buffer_add(base, NULL, extra_bytes)) { + if (!cbb_buffer_add(base, nullptr, extra_bytes)) { goto err; } OPENSSL_memmove(base->buf + child_start + extra_bytes, @@ -260,8 +260,8 @@ int CBB_flush(CBB *cbb) { goto err; } - child->base = NULL; - cbb->child = NULL; + child->base = nullptr; + cbb->child = nullptr; return 1; @@ -271,7 +271,7 @@ err: } const uint8_t *CBB_data(const CBB *cbb) { - assert(cbb->child == NULL); + assert(cbb->child == nullptr); if (cbb->is_child) { return cbb->u.child.base->buf + cbb->u.child.offset + cbb->u.child.pending_len_len; @@ -280,7 +280,7 @@ const uint8_t *CBB_data(const CBB *cbb) { } size_t CBB_len(const CBB *cbb) { - assert(cbb->child == NULL); + assert(cbb->child == nullptr); if (cbb->is_child) { assert(cbb->u.child.offset + cbb->u.child.pending_len_len <= cbb->u.child.base->len); @@ -292,7 +292,7 @@ size_t CBB_len(const CBB *cbb) { static int cbb_add_child(CBB *cbb, CBB *out_child, uint8_t len_len, int is_asn1) { - assert(cbb->child == NULL); + assert(cbb->child == nullptr); assert(!is_asn1 || len_len == 1); struct cbb_buffer_st *base = cbb_get_base(cbb); size_t offset = base->len; @@ -419,7 +419,7 @@ int CBB_reserve(CBB *cbb, uint8_t **out_data, size_t len) { int CBB_did_write(CBB *cbb, size_t len) { struct cbb_buffer_st *base = cbb_get_base(cbb); size_t newlen = base->len + len; - if (cbb->child != NULL || newlen < base->len || newlen > base->cap) { + if (cbb->child != nullptr || newlen < base->len || newlen > base->cap) { return 0; } base->len = newlen; @@ -476,7 +476,7 @@ void CBB_discard(CBB *cbb, size_t len) { } void CBB_discard_child(CBB *cbb) { - if (cbb->child == NULL) { + if (cbb->child == nullptr) { return; } @@ -484,8 +484,8 @@ void CBB_discard_child(CBB *cbb) { assert(cbb->child->is_child); base->len = cbb->child->u.child.offset; - cbb->child->u.child.base = NULL; - cbb->child = NULL; + cbb->child->u.child.base = nullptr; + cbb->child = nullptr; } int CBB_add_asn1_element(CBB *cbb, CBS_ASN1_TAG tag, const uint8_t *data, @@ -666,7 +666,7 @@ int CBB_flush_asn1_set_of(CBB *cbb) { size_t num_children = 0; CBS_init(&cbs, CBB_data(cbb), CBB_len(cbb)); while (CBS_len(&cbs) != 0) { - if (!CBS_get_any_asn1_element(&cbs, NULL, NULL, NULL)) { + if (!CBS_get_any_asn1_element(&cbs, nullptr, nullptr, nullptr)) { OPENSSL_PUT_ERROR(CRYPTO, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } @@ -687,12 +687,12 @@ int CBB_flush_asn1_set_of(CBB *cbb) { reinterpret_cast(OPENSSL_calloc(num_children, sizeof(CBS))); uint8_t *out; size_t offset = 0; - if (buf == NULL || children == NULL) { + if (buf == nullptr || children == nullptr) { goto err; } CBS_init(&cbs, buf, buf_len); for (size_t i = 0; i < num_children; i++) { - if (!CBS_get_any_asn1_element(&cbs, &children[i], NULL, NULL)) { + if (!CBS_get_any_asn1_element(&cbs, &children[i], nullptr, nullptr)) { goto err; } } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/cbs.cc b/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/cbs.cc index fd11c5a89c..55bb149cb3 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/cbs.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/cbs.cc @@ -44,14 +44,14 @@ int CBS_skip(CBS *cbs, size_t len) { int CBS_stow(const CBS *cbs, uint8_t **out_ptr, size_t *out_len) { OPENSSL_free(*out_ptr); - *out_ptr = NULL; + *out_ptr = nullptr; *out_len = 0; if (cbs->len == 0) { return 1; } *out_ptr = reinterpret_cast(OPENSSL_memdup(cbs->data, cbs->len)); - if (*out_ptr == NULL) { + if (*out_ptr == nullptr) { return 0; } *out_len = cbs->len; @@ -59,15 +59,15 @@ int CBS_stow(const CBS *cbs, uint8_t **out_ptr, size_t *out_len) { } int CBS_strdup(const CBS *cbs, char **out_ptr) { - if (*out_ptr != NULL) { + if (*out_ptr != nullptr) { OPENSSL_free(*out_ptr); } *out_ptr = OPENSSL_strndup((const char *)cbs->data, cbs->len); - return (*out_ptr != NULL); + return (*out_ptr != nullptr); } int CBS_contains_zero_byte(const CBS *cbs) { - return OPENSSL_memchr(cbs->data, 0, cbs->len) != NULL; + return OPENSSL_memchr(cbs->data, 0, cbs->len) != nullptr; } int CBS_mem_equal(const CBS *cbs, const uint8_t *data, size_t len) { @@ -207,7 +207,7 @@ int CBS_get_u24_length_prefixed(CBS *cbs, CBS *out) { int CBS_get_until_first(CBS *cbs, CBS *out, uint8_t c) { const uint8_t *split = reinterpret_cast( OPENSSL_memchr(CBS_data(cbs), c, CBS_len(cbs))); - if (split == NULL) { + if (split == nullptr) { return 0; } return CBS_get_bytes(cbs, out, split - CBS_data(cbs)); @@ -309,22 +309,22 @@ static int cbs_get_any_asn1_element(CBS *cbs, CBS *out, CBS_ASN1_TAG *out_tag, CBS header = *cbs; CBS throwaway; - if (out == NULL) { + if (out == nullptr) { out = &throwaway; } if (ber_ok) { *out_ber_found = 0; *out_indefinite = 0; } else { - assert(out_ber_found == NULL); - assert(out_indefinite == NULL); + assert(out_ber_found == nullptr); + assert(out_indefinite == nullptr); } CBS_ASN1_TAG tag; if (!parse_asn1_tag(&header, &tag)) { return 0; } - if (out_tag != NULL) { + if (out_tag != nullptr) { *out_tag = tag; } @@ -341,7 +341,7 @@ static int cbs_get_any_asn1_element(CBS *cbs, CBS *out, CBS_ASN1_TAG *out_tag, if ((length_byte & 0x80) == 0) { // Short form length. len = ((size_t)length_byte) + header_len; - if (out_header_len != NULL) { + if (out_header_len != nullptr) { *out_header_len = header_len; } } else { @@ -353,7 +353,7 @@ static int cbs_get_any_asn1_element(CBS *cbs, CBS *out, CBS_ASN1_TAG *out_tag, if (ber_ok && (tag & CBS_ASN1_CONSTRUCTED) != 0 && num_bytes == 0) { // indefinite length - if (out_header_len != NULL) { + if (out_header_len != nullptr) { *out_header_len = header_len; } *out_ber_found = 1; @@ -396,7 +396,7 @@ static int cbs_get_any_asn1_element(CBS *cbs, CBS *out, CBS_ASN1_TAG *out_tag, return 0; } len += header_len + num_bytes; - if (out_header_len != NULL) { + if (out_header_len != nullptr) { *out_header_len = header_len + num_bytes; } } @@ -420,7 +420,8 @@ int CBS_get_any_asn1(CBS *cbs, CBS *out, CBS_ASN1_TAG *out_tag) { int CBS_get_any_asn1_element(CBS *cbs, CBS *out, CBS_ASN1_TAG *out_tag, size_t *out_header_len) { - return cbs_get_any_asn1_element(cbs, out, out_tag, out_header_len, NULL, NULL, + return cbs_get_any_asn1_element(cbs, out, out_tag, out_header_len, nullptr, + nullptr, /*ber_ok=*/0); } @@ -440,7 +441,7 @@ static int cbs_get_asn1(CBS *cbs, CBS *out, CBS_ASN1_TAG tag_value, CBS_ASN1_TAG tag; CBS throwaway; - if (out == NULL) { + if (out == nullptr) { out = &throwaway; } @@ -546,7 +547,7 @@ int CBS_get_optional_asn1(CBS *cbs, CBS *out, int *out_present, present = 1; } - if (out_present != NULL) { + if (out_present != nullptr) { *out_present = present; } @@ -567,7 +568,7 @@ int CBS_get_optional_asn1_octet_string(CBS *cbs, CBS *out, int *out_present, return 0; } } else { - CBS_init(out, NULL, 0); + CBS_init(out, nullptr, 0); } if (out_present) { *out_present = present; @@ -663,7 +664,7 @@ int CBS_is_valid_asn1_integer(const CBS *cbs, int *out_is_negative) { if (!CBS_get_u8(©, &first_byte)) { return 0; // INTEGERs may not be empty. } - if (out_is_negative != NULL) { + if (out_is_negative != nullptr) { *out_is_negative = (first_byte & 0x80) != 0; } if (!CBS_get_u8(©, &second_byte)) { @@ -750,7 +751,7 @@ char *CBS_asn1_oid_to_text(const CBS *cbs) { err: CBB_cleanup(&cbb); - return NULL; + return nullptr; } static int cbs_get_two_digits(CBS *cbs, int *out) { @@ -886,7 +887,7 @@ static int CBS_parse_rfc5280_time_internal(const CBS *cbs, int is_gentime, return 0; // Reject invalid lengths. } - if (out_tm != NULL) { + if (out_tm != nullptr) { // Fill in the tm fields corresponding to what we validated. out_tm->tm_year = year - 1900; out_tm->tm_mon = month - 1; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/internal.h index 110fb95d83..0ec59e2111 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/bytestring/internal.h @@ -15,12 +15,14 @@ #ifndef OPENSSL_HEADER_CRYPTO_BYTESTRING_INTERNAL_H #define OPENSSL_HEADER_CRYPTO_BYTESTRING_INTERNAL_H -#include +#include +#include +#include + +#include + -#if defined(__cplusplus) extern "C" { -#endif - // CBS_asn1_ber_to_der reads a BER element from |in|. If it finds // indefinite-length elements or constructed strings then it converts the BER @@ -66,9 +68,53 @@ OPENSSL_EXPORT int CBS_get_asn1_implicit_string(CBS *in, CBS *out, // This function may be used to help implement legacy i2d ASN.1 functions. int CBB_finish_i2d(CBB *cbb, uint8_t **outp); - -#if defined(__cplusplus) } // extern C -#endif + +BSSL_NAMESPACE_BEGIN + +// D2IFromCBS takes a functor of type |Unique(CBS*)| and implements the d2i +// calling convention. For compatibility with functions that don't tag their +// return value (e.g. public APIs), |T*(CBS)| is also accepted. The callback can +// assume that the |CBS|'s length fits in |long|. The callback should not access +// |out|, |inp|, or |len| directly. +template +inline T *D2IFromCBS(T **out, const uint8_t **inp, long len, CBSFunc func) { + static_assert(std::is_invocable_v); + static_assert( + std::is_same_v, UniquePtr> || + std::is_same_v, T *>); + if (len < 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_BUFFER_TOO_SMALL); + return nullptr; + } + CBS cbs; + CBS_init(&cbs, *inp, len); + UniquePtr ret(func(&cbs)); + if (ret == nullptr) { + return nullptr; + } + if (out != nullptr) { + UniquePtr free_out(*out); + *out = ret.get(); + } + *inp = CBS_data(&cbs); + return ret.release(); +} + +// I2DFromCBB takes a functor of type |bool(CBB*)| and implements the i2d +// calling convention. It internally makes a |CBB| with the specified initial +// capacity. The callback should not access |outp| directly. +template +inline int I2DFromCBB(size_t initial_capacity, uint8_t **outp, CBBFunc func) { + static_assert(std::is_invocable_v); + static_assert(std::is_same_v, bool>); + ScopedCBB cbb; + if (!CBB_init(cbb.get(), initial_capacity) || !func(cbb.get())) { + return -1; + } + return CBB_finish_i2d(cbb.get(), outp); +} + +BSSL_NAMESPACE_END #endif // OPENSSL_HEADER_CRYPTO_BYTESTRING_INTERNAL_H diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/asm/aes128gcmsiv-x86_64.pl b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/asm/aes128gcmsiv-x86_64.pl index dec73fc4fd..09da04f705 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/asm/aes128gcmsiv-x86_64.pl +++ b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/asm/aes128gcmsiv-x86_64.pl @@ -307,7 +307,7 @@ aesgcmsiv_htable_polyval: .Lhtable_polyval_no_prefix: # At this point we know the number of blocks is a multiple of 8. However, # the reduction in the main loop includes a multiplication by x^(-128). In - # order to counter this, the existing tag needs to be multipled by x^128. + # order to counter this, the existing tag needs to be multiplied by x^128. # In practice, this just means that it is loaded into $Xhi, not $T. vpxor $T, $T, $T vmovdqa ($Tp), $Xhi diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/asm/chacha20_poly1305_armv8.pl b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/asm/chacha20_poly1305_armv8.pl index 06a35e067e..a4921e259a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/asm/chacha20_poly1305_armv8.pl +++ b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/asm/chacha20_poly1305_armv8.pl @@ -869,7 +869,7 @@ $code.=<<___; subs $adl, $adl, #1 b.gt .Lseal_hash_extra_load - // Hash in the final padded extra_in blcok + // Hash in the final padded extra_in block ___ &poly_add_vec($T0); &poly_mul(); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_aesctrhmac.cc b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_aesctrhmac.cc index 3f624e28b3..0970a49d97 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_aesctrhmac.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_aesctrhmac.cc @@ -39,7 +39,7 @@ struct aead_aes_ctr_hmac_sha256_ctx { SHA256_CTX outer_init_state; }; -static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >= +static_assert(sizeof(((EVP_AEAD_CTX *)nullptr)->state) >= sizeof(struct aead_aes_ctr_hmac_sha256_ctx), "AEAD state is too small"); static_assert(alignof(union evp_aead_ctx_st_state) >= @@ -96,8 +96,8 @@ static int aead_aes_ctr_hmac_sha256_init(EVP_AEAD_CTX *ctx, const uint8_t *key, return 0; } - aes_ctx->ctr = - aes_ctr_set_key(&aes_ctx->ks.ks, NULL, &aes_ctx->block, key, aes_key_len); + aes_ctx->ctr = aes_ctr_set_key(&aes_ctx->ks.ks, nullptr, &aes_ctx->block, key, + aes_key_len); ctx->tag_len = tag_len; hmac_init(&aes_ctx->inner_init_state, &aes_ctx->outer_init_state, key + aes_key_len); @@ -244,13 +244,13 @@ static const EVP_AEAD aead_aes_128_ctr_hmac_sha256 = { 0, // seal_scatter_supports_extra_in aead_aes_ctr_hmac_sha256_init, - NULL /* init_with_direction */, + nullptr /* init_with_direction */, aead_aes_ctr_hmac_sha256_cleanup, - NULL /* open */, + nullptr /* open */, aead_aes_ctr_hmac_sha256_seal_scatter, aead_aes_ctr_hmac_sha256_open_gather, - NULL /* get_iv */, - NULL /* tag_len */, + nullptr /* get_iv */, + nullptr /* tag_len */, }; static const EVP_AEAD aead_aes_256_ctr_hmac_sha256 = { @@ -261,13 +261,13 @@ static const EVP_AEAD aead_aes_256_ctr_hmac_sha256 = { 0, // seal_scatter_supports_extra_in aead_aes_ctr_hmac_sha256_init, - NULL /* init_with_direction */, + nullptr /* init_with_direction */, aead_aes_ctr_hmac_sha256_cleanup, - NULL /* open */, + nullptr /* open */, aead_aes_ctr_hmac_sha256_seal_scatter, aead_aes_ctr_hmac_sha256_open_gather, - NULL /* get_iv */, - NULL /* tag_len */, + nullptr /* get_iv */, + nullptr /* tag_len */, }; const EVP_AEAD *EVP_aead_aes_128_ctr_hmac_sha256(void) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_aeseax.cc b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_aeseax.cc index e4c8781b0a..0a567ad13a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_aeseax.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_aeseax.cc @@ -258,13 +258,13 @@ static const EVP_AEAD aead_aes_128_eax = { 0, // seal_scatter_supports_extra_in aead_aes_eax_init, - NULL, // init_with_direction + nullptr, // init_with_direction aead_aes_eax_cleanup, - NULL, // open + nullptr, // open aead_aes_eax_seal_scatter, aead_aes_eax_open_gather, - NULL, // get_iv - NULL, // tag_len + nullptr, // get_iv + nullptr, // tag_len }; static const EVP_AEAD aead_aes_256_eax = { @@ -275,13 +275,13 @@ static const EVP_AEAD aead_aes_256_eax = { 0, // seal_scatter_supports_extra_in aead_aes_eax_init, - NULL, // init_with_direction + nullptr, // init_with_direction aead_aes_eax_cleanup, - NULL, // open + nullptr, // open aead_aes_eax_seal_scatter, aead_aes_eax_open_gather, - NULL, // get_iv - NULL, // tag_len + nullptr, // get_iv + nullptr, // tag_len }; const EVP_AEAD *EVP_aead_aes_128_eax(void) { return &aead_aes_128_eax; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_aesgcmsiv.cc b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_aesgcmsiv.cc index a7b38c6acf..37fb18cfbe 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_aesgcmsiv.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_aesgcmsiv.cc @@ -44,7 +44,7 @@ struct aead_aes_gcm_siv_asm_ctx { // The assembly code assumes 8-byte alignment of the EVP_AEAD_CTX's state, and // aligns to 16 bytes itself. -static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) + 8 >= +static_assert(sizeof(((EVP_AEAD_CTX *)nullptr)->state) + 8 >= sizeof(struct aead_aes_gcm_siv_asm_ctx), "AEAD state is too small"); static_assert(alignof(union evp_aead_ctx_st_state) >= 8, @@ -504,13 +504,13 @@ const EVP_AEAD aead_aes_128_gcm_siv_asm = { 0, // seal_scatter_supports_extra_in aead_aes_gcm_siv_asm_init, - NULL /* init_with_direction */, + nullptr /* init_with_direction */, aead_aes_gcm_siv_asm_cleanup, - NULL /* open */, + nullptr /* open */, aead_aes_gcm_siv_asm_seal_scatter, aead_aes_gcm_siv_asm_open_gather, - NULL /* get_iv */, - NULL /* tag_len */, + nullptr /* get_iv */, + nullptr /* tag_len */, }; const EVP_AEAD aead_aes_256_gcm_siv_asm = { @@ -521,13 +521,13 @@ const EVP_AEAD aead_aes_256_gcm_siv_asm = { 0, // seal_scatter_supports_extra_in aead_aes_gcm_siv_asm_init, - NULL /* init_with_direction */, + nullptr /* init_with_direction */, aead_aes_gcm_siv_asm_cleanup, - NULL /* open */, + nullptr /* open */, aead_aes_gcm_siv_asm_seal_scatter, aead_aes_gcm_siv_asm_open_gather, - NULL /* get_iv */, - NULL /* tag_len */, + nullptr /* get_iv */, + nullptr /* tag_len */, }; #endif // X86_64 && !NO_ASM && !WINDOWS @@ -542,7 +542,7 @@ struct aead_aes_gcm_siv_ctx { unsigned is_256 : 1; }; -static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >= +static_assert(sizeof(((EVP_AEAD_CTX *)nullptr)->state) >= sizeof(struct aead_aes_gcm_siv_ctx), "AEAD state is too small"); static_assert(alignof(union evp_aead_ctx_st_state) >= @@ -570,7 +570,7 @@ int aead_aes_gcm_siv_init(EVP_AEAD_CTX *ctx, const uint8_t *key, size_t key_len, (struct aead_aes_gcm_siv_ctx *)&ctx->state; OPENSSL_memset(gcm_siv_ctx, 0, sizeof(struct aead_aes_gcm_siv_ctx)); - aes_ctr_set_key(&gcm_siv_ctx->ks.ks, NULL, &gcm_siv_ctx->kgk_block, key, + aes_ctr_set_key(&gcm_siv_ctx->ks.ks, nullptr, &gcm_siv_ctx->kgk_block, key, key_len); gcm_siv_ctx->is_256 = (key_len == 32); ctx->tag_len = tag_len; @@ -772,7 +772,7 @@ void gcm_siv_keys(const struct aead_aes_gcm_siv_ctx *gcm_siv_ctx, // We currently do not consider AES-GCM-SIV to be performance-sensitive on // client hardware. If this changes, we can write little-endian |ctr128_f| // functions. - aes_ctr_set_key(&out_keys->enc_key.ks, NULL, &out_keys->enc_block, + aes_ctr_set_key(&out_keys->enc_key.ks, nullptr, &out_keys->enc_block, key_material + 16, gcm_siv_ctx->is_256 ? 32 : 16); } @@ -870,13 +870,13 @@ const EVP_AEAD aead_aes_128_gcm_siv = { 0, // seal_scatter_supports_extra_in aead_aes_gcm_siv_init, - NULL /* init_with_direction */, + nullptr /* init_with_direction */, aead_aes_gcm_siv_cleanup, - NULL /* open */, + nullptr /* open */, aead_aes_gcm_siv_seal_scatter, aead_aes_gcm_siv_open_gather, - NULL /* get_iv */, - NULL /* tag_len */, + nullptr /* get_iv */, + nullptr /* tag_len */, }; const EVP_AEAD aead_aes_256_gcm_siv = { @@ -887,13 +887,13 @@ const EVP_AEAD aead_aes_256_gcm_siv = { 0, // seal_scatter_supports_extra_in aead_aes_gcm_siv_init, - NULL /* init_with_direction */, + nullptr /* init_with_direction */, aead_aes_gcm_siv_cleanup, - NULL /* open */, + nullptr /* open */, aead_aes_gcm_siv_seal_scatter, aead_aes_gcm_siv_open_gather, - NULL /* get_iv */, - NULL /* tag_len */, + nullptr /* get_iv */, + nullptr /* tag_len */, }; } // namespace diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_chacha20poly1305.cc b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_chacha20poly1305.cc index d1a9b34ae1..f13999c782 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_chacha20poly1305.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_chacha20poly1305.cc @@ -32,7 +32,7 @@ struct aead_chacha20_poly1305_ctx { uint8_t key[32]; }; -static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >= +static_assert(sizeof(((EVP_AEAD_CTX *)nullptr)->state) >= sizeof(struct aead_chacha20_poly1305_ctx), "AEAD state is too small"); static_assert(alignof(union evp_aead_ctx_st_state) >= @@ -251,7 +251,7 @@ static int chacha20_poly1305_open_gather( OPENSSL_memcpy(data.in.nonce, nonce, 12); chacha20_poly1305_open(out, in, in_len, ad, ad_len, &data); } else { - calc_tag(data.out.tag, key, nonce, ad, ad_len, in, in_len, NULL, 0); + calc_tag(data.out.tag, key, nonce, ad, ad_len, in, in_len, nullptr, 0); CRYPTO_chacha_20(out, in, in_len, key, nonce, 1); } @@ -306,13 +306,13 @@ static const EVP_AEAD aead_chacha20_poly1305 = { 1, // seal_scatter_supports_extra_in aead_chacha20_poly1305_init, - NULL, // init_with_direction + nullptr, // init_with_direction aead_chacha20_poly1305_cleanup, - NULL /* open */, + nullptr /* open */, aead_chacha20_poly1305_seal_scatter, aead_chacha20_poly1305_open_gather, - NULL, // get_iv - NULL, // tag_len + nullptr, // get_iv + nullptr, // tag_len }; static const EVP_AEAD aead_xchacha20_poly1305 = { @@ -323,13 +323,13 @@ static const EVP_AEAD aead_xchacha20_poly1305 = { 1, // seal_scatter_supports_extra_in aead_chacha20_poly1305_init, - NULL, // init_with_direction + nullptr, // init_with_direction aead_chacha20_poly1305_cleanup, - NULL /* open */, + nullptr /* open */, aead_xchacha20_poly1305_seal_scatter, aead_xchacha20_poly1305_open_gather, - NULL, // get_iv - NULL, // tag_len + nullptr, // get_iv + nullptr, // tag_len }; const EVP_AEAD *EVP_aead_chacha20_poly1305(void) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_tls.cc b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_tls.cc index d803ea67b0..39aaa2f571 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_tls.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/e_tls.cc @@ -43,7 +43,7 @@ typedef struct { static_assert(EVP_MAX_MD_SIZE < 256, "mac_key_len does not fit in uint8_t"); -static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >= sizeof(AEAD_TLS_CTX), +static_assert(sizeof(((EVP_AEAD_CTX *)nullptr)->state) >= sizeof(AEAD_TLS_CTX), "AEAD state is too small"); static_assert(alignof(union evp_aead_ctx_st_state) >= alignof(AEAD_TLS_CTX), "AEAD state has insufficient alignment"); @@ -85,10 +85,11 @@ static int aead_tls_init(EVP_AEAD_CTX *ctx, const uint8_t *key, size_t key_len, tls_ctx->mac_key_len = (uint8_t)mac_key_len; tls_ctx->implicit_iv = implicit_iv; - if (!EVP_CipherInit_ex(&tls_ctx->cipher_ctx, cipher, NULL, &key[mac_key_len], - implicit_iv ? &key[mac_key_len + enc_key_len] : NULL, - dir == evp_aead_seal) || - !HMAC_Init_ex(tls_ctx->hmac_ctx, key, mac_key_len, md, NULL)) { + if (!EVP_CipherInit_ex( + &tls_ctx->cipher_ctx, cipher, nullptr, &key[mac_key_len], + implicit_iv ? &key[mac_key_len + enc_key_len] : nullptr, + dir == evp_aead_seal) || + !HMAC_Init_ex(tls_ctx->hmac_ctx, key, mac_key_len, md, nullptr)) { aead_tls_cleanup(ctx); return 0; } @@ -163,7 +164,7 @@ static int aead_tls_seal_scatter(const EVP_AEAD_CTX *ctx, uint8_t *out, // in-place. uint8_t mac[EVP_MAX_MD_SIZE]; unsigned mac_len; - if (!HMAC_Init_ex(tls_ctx->hmac_ctx, NULL, 0, NULL, NULL) || + if (!HMAC_Init_ex(tls_ctx->hmac_ctx, nullptr, 0, nullptr, nullptr) || !HMAC_Update(tls_ctx->hmac_ctx, ad, ad_len) || !HMAC_Update(tls_ctx->hmac_ctx, ad_extra, sizeof(ad_extra)) || !HMAC_Update(tls_ctx->hmac_ctx, in, in_len) || @@ -174,7 +175,8 @@ static int aead_tls_seal_scatter(const EVP_AEAD_CTX *ctx, uint8_t *out, // Configure the explicit IV. if (EVP_CIPHER_CTX_mode(&tls_ctx->cipher_ctx) == EVP_CIPH_CBC_MODE && !tls_ctx->implicit_iv && - !EVP_EncryptInit_ex(&tls_ctx->cipher_ctx, NULL, NULL, NULL, nonce)) { + !EVP_EncryptInit_ex(&tls_ctx->cipher_ctx, nullptr, nullptr, nullptr, + nonce)) { return 0; } @@ -280,7 +282,8 @@ static int aead_tls_open(const EVP_AEAD_CTX *ctx, uint8_t *out, size_t *out_len, // Configure the explicit IV. if (EVP_CIPHER_CTX_mode(&tls_ctx->cipher_ctx) == EVP_CIPH_CBC_MODE && !tls_ctx->implicit_iv && - !EVP_DecryptInit_ex(&tls_ctx->cipher_ctx, NULL, NULL, NULL, nonce)) { + !EVP_DecryptInit_ex(&tls_ctx->cipher_ctx, nullptr, nullptr, nullptr, + nonce)) { return 0; } @@ -356,7 +359,7 @@ static int aead_tls_open(const EVP_AEAD_CTX *ctx, uint8_t *out, size_t *out_len, assert(EVP_CIPHER_CTX_mode(&tls_ctx->cipher_ctx) != EVP_CIPH_CBC_MODE); unsigned mac_len_u; - if (!HMAC_Init_ex(tls_ctx->hmac_ctx, NULL, 0, NULL, NULL) || + if (!HMAC_Init_ex(tls_ctx->hmac_ctx, nullptr, 0, nullptr, nullptr) || !HMAC_Update(tls_ctx->hmac_ctx, ad_fixed, ad_len) || !HMAC_Update(tls_ctx->hmac_ctx, out, data_len) || !HMAC_Final(tls_ctx->hmac_ctx, mac, &mac_len_u)) { @@ -462,13 +465,13 @@ static const EVP_AEAD aead_aes_128_cbc_sha1_tls = { SHA_DIGEST_LENGTH, // max tag length 0, // seal_scatter_supports_extra_in - NULL, // init + nullptr, // init aead_aes_128_cbc_sha1_tls_init, aead_tls_cleanup, aead_tls_open, aead_tls_seal_scatter, - NULL, // open_gather - NULL, // get_iv + nullptr, // open_gather + nullptr, // get_iv aead_tls_tag_len, }; @@ -479,12 +482,12 @@ static const EVP_AEAD aead_aes_128_cbc_sha1_tls_implicit_iv = { SHA_DIGEST_LENGTH, // max tag length 0, // seal_scatter_supports_extra_in - NULL, // init + nullptr, // init aead_aes_128_cbc_sha1_tls_implicit_iv_init, aead_tls_cleanup, aead_tls_open, aead_tls_seal_scatter, - NULL, // open_gather + nullptr, // open_gather aead_tls_get_iv, // get_iv aead_tls_tag_len, }; @@ -496,13 +499,13 @@ static const EVP_AEAD aead_aes_128_cbc_sha256_tls = { SHA256_DIGEST_LENGTH, // max tag length 0, // seal_scatter_supports_extra_in - NULL, // init + nullptr, // init aead_aes_128_cbc_sha256_tls_init, aead_tls_cleanup, aead_tls_open, aead_tls_seal_scatter, - NULL, // open_gather - NULL, // get_iv + nullptr, // open_gather + nullptr, // get_iv aead_tls_tag_len, }; @@ -513,13 +516,13 @@ static const EVP_AEAD aead_aes_256_cbc_sha1_tls = { SHA_DIGEST_LENGTH, // max tag length 0, // seal_scatter_supports_extra_in - NULL, // init + nullptr, // init aead_aes_256_cbc_sha1_tls_init, aead_tls_cleanup, aead_tls_open, aead_tls_seal_scatter, - NULL, // open_gather - NULL, // get_iv + nullptr, // open_gather + nullptr, // get_iv aead_tls_tag_len, }; @@ -530,12 +533,12 @@ static const EVP_AEAD aead_aes_256_cbc_sha1_tls_implicit_iv = { SHA_DIGEST_LENGTH, // max tag length 0, // seal_scatter_supports_extra_in - NULL, // init + nullptr, // init aead_aes_256_cbc_sha1_tls_implicit_iv_init, aead_tls_cleanup, aead_tls_open, aead_tls_seal_scatter, - NULL, // open_gather + nullptr, // open_gather aead_tls_get_iv, // get_iv aead_tls_tag_len, }; @@ -547,13 +550,13 @@ static const EVP_AEAD aead_des_ede3_cbc_sha1_tls = { SHA_DIGEST_LENGTH, // max tag length 0, // seal_scatter_supports_extra_in - NULL, // init + nullptr, // init aead_des_ede3_cbc_sha1_tls_init, aead_tls_cleanup, aead_tls_open, aead_tls_seal_scatter, - NULL, // open_gather - NULL, // get_iv + nullptr, // open_gather + nullptr, // get_iv aead_tls_tag_len, }; @@ -564,12 +567,12 @@ static const EVP_AEAD aead_des_ede3_cbc_sha1_tls_implicit_iv = { SHA_DIGEST_LENGTH, // max tag length 0, // seal_scatter_supports_extra_in - NULL, // init + nullptr, // init aead_des_ede3_cbc_sha1_tls_implicit_iv_init, aead_tls_cleanup, aead_tls_open, aead_tls_seal_scatter, - NULL, // open_gather + nullptr, // open_gather aead_tls_get_iv, // get_iv aead_tls_tag_len, }; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/get_cipher.cc b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/get_cipher.cc index 2622dc78d1..6513df01c4 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/get_cipher.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/get_cipher.cc @@ -55,17 +55,17 @@ static const struct { }; const EVP_CIPHER *EVP_get_cipherbynid(int nid) { - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kCiphers); i++) { - if (kCiphers[i].nid == nid) { - return kCiphers[i].func(); + for (const auto &cipher : kCiphers) { + if (cipher.nid == nid) { + return cipher.func(); } } - return NULL; + return nullptr; } const EVP_CIPHER *EVP_get_cipherbyname(const char *name) { - if (name == NULL) { - return NULL; + if (name == nullptr) { + return nullptr; } // This is not a name used by OpenSSL, but tcpdump registers it with @@ -75,11 +75,11 @@ const EVP_CIPHER *EVP_get_cipherbyname(const char *name) { name = "des-ede3-cbc"; } - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kCiphers); i++) { - if (OPENSSL_strcasecmp(kCiphers[i].name, name) == 0) { - return kCiphers[i].func(); + for (const auto &cipher : kCiphers) { + if (OPENSSL_strcasecmp(cipher.name, name) == 0) { + return cipher.func(); } } - return NULL; + return nullptr; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/tls_cbc.cc b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/tls_cbc.cc index d34d2d6edf..31d3218e20 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/cipher/tls_cbc.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/cipher/tls_cbc.cc @@ -53,7 +53,10 @@ int EVP_tls_cbc_remove_padding(crypto_word_t *out_padding_ok, size_t *out_len, for (size_t i = 0; i < to_check; i++) { uint8_t mask = constant_time_ge_8(padding_length, i); - uint8_t b = in[in_len - 1 - i]; + // The value barrier on |(in_len - 1 - i)| isn't needed to enforce + // constant-time. It is just there to prevent a false positive in + // constant-time checks by valgrind. + uint8_t b = in[value_barrier_w(in_len - 1 - i)]; // The final |padding_length+1| bytes should all have the value // |padding_length|. Therefore the XOR should be zero. good &= ~(mask & (padding_length ^ b)); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/cms/cms.cc b/naiveproxy/src/third_party/boringssl/src/crypto/cms/cms.cc index b2f19532b5..e7211e63ed 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/cms/cms.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/cms/cms.cc @@ -66,7 +66,7 @@ CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, // |CMS_sign| and OpenSSL interprets it as an alias for |CMS_PARTIAL| in this // context. if ((flags & (CMS_PARTIAL | CMS_STREAM)) == 0 && - !CMS_final(cms.get(), data, NULL, flags)) { + !CMS_final(cms.get(), data, nullptr, flags)) { return nullptr; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/conf/conf.cc b/naiveproxy/src/third_party/boringssl/src/crypto/conf/conf.cc index d5177ef16a..63001d8fba 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/conf/conf.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/conf/conf.cc @@ -59,20 +59,20 @@ static int conf_value_cmp(const CONF_VALUE *a, const CONF_VALUE *b) { } CONF *NCONF_new(void *method) { - if (method != NULL) { - return NULL; + if (method != nullptr) { + return nullptr; } CONF *conf = reinterpret_cast(OPENSSL_malloc(sizeof(CONF))); - if (conf == NULL) { - return NULL; + if (conf == nullptr) { + return nullptr; } conf->sections = lh_CONF_SECTION_new(conf_section_hash, conf_section_cmp); conf->values = lh_CONF_VALUE_new(conf_value_hash, conf_value_cmp); - if (conf->sections == NULL || conf->values == NULL) { + if (conf->sections == nullptr || conf->values == nullptr) { NCONF_free(conf); - return NULL; + return nullptr; } return conf; @@ -83,7 +83,7 @@ CONF_VALUE *CONF_VALUE_new(void) { } static void value_free(CONF_VALUE *value) { - if (value == NULL) { + if (value == nullptr) { return; } OPENSSL_free(value->section); @@ -93,7 +93,7 @@ static void value_free(CONF_VALUE *value) { } static void section_free(CONF_SECTION *section) { - if (section == NULL) { + if (section == nullptr) { return; } OPENSSL_free(section->name); @@ -108,13 +108,13 @@ static void section_free_arg(CONF_SECTION *section, void *arg) { } void NCONF_free(CONF *conf) { - if (conf == NULL) { + if (conf == nullptr) { return; } - lh_CONF_SECTION_doall_arg(conf->sections, section_free_arg, NULL); + lh_CONF_SECTION_doall_arg(conf->sections, section_free_arg, nullptr); lh_CONF_SECTION_free(conf->sections); - lh_CONF_VALUE_doall_arg(conf->values, value_free_arg, NULL); + lh_CONF_VALUE_doall_arg(conf->values, value_free_arg, nullptr); lh_CONF_VALUE_free(conf->values); OPENSSL_free(conf); } @@ -123,11 +123,11 @@ static CONF_SECTION *NCONF_new_section(const CONF *conf, const char *section) { CONF_SECTION *s = reinterpret_cast(OPENSSL_malloc(sizeof(CONF_SECTION))); if (!s) { - return NULL; + return nullptr; } s->name = OPENSSL_strdup(section); s->values = sk_CONF_VALUE_new_null(); - if (s->name == NULL || s->values == NULL) { + if (s->name == nullptr || s->values == nullptr) { goto err; } @@ -140,7 +140,7 @@ static CONF_SECTION *NCONF_new_section(const CONF *conf, const char *section) { err: section_free(s); - return NULL; + return nullptr; } static int is_comment(char c) { return c == '#'; } @@ -169,7 +169,7 @@ static int str_copy(CONF *conf, char *section, char **pto, char *from) { BUF_MEM *buf; buf = BUF_MEM_new(); - if (buf == NULL) { + if (buf == nullptr) { return 0; } @@ -244,8 +244,8 @@ static CONF_SECTION *get_section(const CONF *conf, const char *section) { const STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, const char *section) { const CONF_SECTION *section_obj = get_section(conf, section); - if (section_obj == NULL) { - return NULL; + if (section_obj == nullptr) { + return nullptr; } return section_obj->values; } @@ -254,7 +254,7 @@ const char *NCONF_get_string(const CONF *conf, const char *section, const char *name) { CONF_VALUE templ, *value; - if (section == NULL) { + if (section == nullptr) { section = kDefaultSectionName; } @@ -262,8 +262,8 @@ const char *NCONF_get_string(const CONF *conf, const char *section, templ.section = (char *)section; templ.name = (char *)name; value = lh_CONF_VALUE_retrieve(conf->values, &templ); - if (value == NULL) { - return NULL; + if (value == nullptr) { + return nullptr; } return value->value; } @@ -271,7 +271,7 @@ const char *NCONF_get_string(const CONF *conf, const char *section, static int add_string(const CONF *conf, CONF_SECTION *section, CONF_VALUE *value) { value->section = OPENSSL_strdup(section->name); - if (value->section == NULL) { + if (value->section == nullptr) { return 0; } @@ -286,7 +286,7 @@ static int add_string(const CONF *conf, CONF_SECTION *section, sk_CONF_VALUE_pop(section->values); return 0; } - if (old_value != NULL) { + if (old_value != nullptr) { (void)sk_CONF_VALUE_delete_ptr(section->values, old_value); value_free(old_value); } @@ -370,27 +370,27 @@ static void clear_comments(char *p) { int NCONF_load_bio(CONF *conf, BIO *in, long *out_error_line) { static const size_t CONFBUFSIZE = 512; int bufnum = 0, i, ii; - BUF_MEM *buff = NULL; + BUF_MEM *buff = nullptr; char *s, *p, *end; int again; long eline = 0; - CONF_VALUE *v = NULL; - CONF_SECTION *sv = NULL; - char *section = NULL, *buf; + CONF_VALUE *v = nullptr; + CONF_SECTION *sv = nullptr; + char *section = nullptr, *buf; char *start, *psection, *pname; - if ((buff = BUF_MEM_new()) == NULL) { + if ((buff = BUF_MEM_new()) == nullptr) { OPENSSL_PUT_ERROR(CONF, ERR_R_BUF_LIB); goto err; } section = OPENSSL_strdup(kDefaultSectionName); - if (section == NULL) { + if (section == nullptr) { goto err; } sv = NCONF_new_section(conf, section); - if (sv == NULL) { + if (sv == nullptr) { OPENSSL_PUT_ERROR(CONF, CONF_R_UNABLE_TO_CREATE_NEW_SECTION); goto err; } @@ -432,7 +432,7 @@ int NCONF_load_bio(CONF *conf, BIO *in, long *out_error_line) { // i is the number of bytes bufnum += i; - v = NULL; + v = nullptr; // check for line continuation if (bufnum >= 1) { // If we have bytes and the last char '\\' and @@ -472,20 +472,20 @@ int NCONF_load_bio(CONF *conf, BIO *in, long *out_error_line) { goto err; } *end = '\0'; - if (!str_copy(conf, NULL, §ion, start)) { + if (!str_copy(conf, nullptr, §ion, start)) { goto err; } - if ((sv = get_section(conf, section)) == NULL) { + if ((sv = get_section(conf, section)) == nullptr) { sv = NCONF_new_section(conf, section); } - if (sv == NULL) { + if (sv == nullptr) { OPENSSL_PUT_ERROR(CONF, CONF_R_UNABLE_TO_CREATE_NEW_SECTION); goto err; } continue; } else { pname = s; - psection = NULL; + psection = nullptr; end = eat_name(s); if ((end[0] == ':') && (end[1] == ':')) { *end = '\0'; @@ -515,11 +515,11 @@ int NCONF_load_bio(CONF *conf, BIO *in, long *out_error_line) { if (!(v = CONF_VALUE_new())) { goto err; } - if (psection == NULL) { + if (psection == nullptr) { psection = section; } v->name = OPENSSL_strdup(pname); - if (v->name == NULL) { + if (v->name == nullptr) { goto err; } if (!str_copy(conf, psection, &(v->value), start)) { @@ -528,10 +528,10 @@ int NCONF_load_bio(CONF *conf, BIO *in, long *out_error_line) { CONF_SECTION *tv; if (strcmp(psection, section) != 0) { - if ((tv = get_section(conf, psection)) == NULL) { + if ((tv = get_section(conf, psection)) == nullptr) { tv = NCONF_new_section(conf, psection); } - if (tv == NULL) { + if (tv == nullptr) { OPENSSL_PUT_ERROR(CONF, CONF_R_UNABLE_TO_CREATE_NEW_SECTION); goto err; } @@ -541,7 +541,7 @@ int NCONF_load_bio(CONF *conf, BIO *in, long *out_error_line) { if (add_string(conf, tv, v) == 0) { goto err; } - v = NULL; + v = nullptr; } } BUF_MEM_free(buff); @@ -551,7 +551,7 @@ int NCONF_load_bio(CONF *conf, BIO *in, long *out_error_line) { err: BUF_MEM_free(buff); OPENSSL_free(section); - if (out_error_line != NULL) { + if (out_error_line != nullptr) { *out_error_line = eline; } ERR_add_error_dataf("line %ld", eline); @@ -563,7 +563,7 @@ int NCONF_load(CONF *conf, const char *filename, long *out_error_line) { BIO *in = BIO_new_file(filename, "rb"); int ret; - if (in == NULL) { + if (in == nullptr) { OPENSSL_PUT_ERROR(CONF, ERR_R_SYS_LIB); return 0; } @@ -580,7 +580,7 @@ int CONF_parse_list(const char *list, char sep, int remove_whitespace, int ret; const char *lstart, *tmpend, *p; - if (list == NULL) { + if (list == nullptr) { OPENSSL_PUT_ERROR(CONF, CONF_R_LIST_CANNOT_BE_NULL); return 0; } @@ -594,7 +594,7 @@ int CONF_parse_list(const char *list, char sep, int remove_whitespace, } p = strchr(lstart, sep); if (p == lstart || !*lstart) { - ret = list_cb(NULL, 0, arg); + ret = list_cb(nullptr, 0, arg); } else { if (p) { tmpend = p - 1; @@ -611,7 +611,7 @@ int CONF_parse_list(const char *list, char sep, int remove_whitespace, if (ret <= 0) { return ret; } - if (p == NULL) { + if (p == nullptr) { return 1; } lstart = p + 1; @@ -623,6 +623,8 @@ int CONF_modules_load_file(const char *filename, const char *appname, return 1; } +void CONF_modules_unload(int all) {} + void CONF_modules_free(void) {} void OPENSSL_config(const char *config_name) {} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/cpu_aarch64_apple.cc b/naiveproxy/src/third_party/boringssl/src/crypto/cpu_aarch64_apple.cc index 8a8183e104..24fe16c5ec 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/cpu_aarch64_apple.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/cpu_aarch64_apple.cc @@ -24,7 +24,7 @@ static int has_hw_feature(const char *name) { int value; size_t len = sizeof(value); - if (sysctlbyname(name, &value, &len, NULL, 0) != 0) { + if (sysctlbyname(name, &value, &len, nullptr, 0) != 0) { return 0; } if (len != sizeof(int)) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/cpu_aarch64_openbsd.cc b/naiveproxy/src/third_party/boringssl/src/crypto/cpu_aarch64_openbsd.cc index 51e7058245..e0b884c3c1 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/cpu_aarch64_openbsd.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/cpu_aarch64_openbsd.cc @@ -29,7 +29,7 @@ void OPENSSL_cpuid_setup(void) { uint64_t cpu_id = 0; size_t len = sizeof(cpu_id); - if (sysctl(isar0_mib, 2, &cpu_id, &len, NULL, 0) < 0) { + if (sysctl(isar0_mib, 2, &cpu_id, &len, nullptr, 0) < 0) { return; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/cpu_arm_linux.cc b/naiveproxy/src/third_party/boringssl/src/crypto/cpu_arm_linux.cc index 90489f7274..7733d18521 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/cpu_arm_linux.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/cpu_arm_linux.cc @@ -55,7 +55,7 @@ static int read_file(char **out_ptr, size_t *out_len, const char *path) { int ret = 0; size_t cap = kReadSize, len = 0; char *buf = reinterpret_cast(OPENSSL_malloc(cap)); - if (buf == NULL) { + if (buf == nullptr) { goto err; } @@ -66,7 +66,7 @@ static int read_file(char **out_ptr, size_t *out_len, const char *path) { goto err; } char *new_buf = reinterpret_cast(OPENSSL_realloc(buf, new_cap)); - if (new_buf == NULL) { + if (new_buf == nullptr) { goto err; } buf = new_buf; @@ -86,7 +86,7 @@ static int read_file(char **out_ptr, size_t *out_len, const char *path) { *out_ptr = buf; *out_len = len; ret = 1; - buf = NULL; + buf = nullptr; err: OPENSSL_free(buf); @@ -100,7 +100,7 @@ void OPENSSL_cpuid_setup(void) { // We ignore the return value of |read_file| and proceed with an empty // /proc/cpuinfo on error. If |getauxval| works, we will still detect // capabilities. - char *cpuinfo_data = NULL; + char *cpuinfo_data = nullptr; size_t cpuinfo_len = 0; read_file(&cpuinfo_data, &cpuinfo_len, "/proc/cpuinfo"); STRING_PIECE cpuinfo; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/cpu_arm_linux.h b/naiveproxy/src/third_party/boringssl/src/crypto/cpu_arm_linux.h index 196f3ddc71..1c81d4e5b4 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/cpu_arm_linux.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/cpu_arm_linux.h @@ -50,13 +50,13 @@ static int STRING_PIECE_equals(const STRING_PIECE *a, const char *b) { return a->len == b_len && OPENSSL_memcmp(a->data, b, b_len) == 0; } -// STRING_PIECE_split finds the first occurence of |sep| in |in| and, if found, +// STRING_PIECE_split finds the first occurrence of |sep| in |in| and, if found, // sets |*out_left| and |*out_right| to |in| split before and after it. It // returns one if |sep| was found and zero otherwise. static int STRING_PIECE_split(STRING_PIECE *out_left, STRING_PIECE *out_right, const STRING_PIECE *in, char sep) { const char *p = (const char *)OPENSSL_memchr(in->data, sep, in->len); - if (p == NULL) { + if (p == nullptr) { return 0; } // |out_left| or |out_right| may alias |in|, so make a copy. diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/crypto.cc b/naiveproxy/src/third_party/boringssl/src/crypto/crypto.cc index e41a545fe5..ab20bb11c2 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/crypto.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/crypto.cc @@ -137,6 +137,8 @@ void ENGINE_load_builtin_engines(void) {} int ENGINE_register_all_complete(void) { return 1; } +void ENGINE_cleanup(void) {} + void OPENSSL_load_builtin_modules(void) {} int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/curve25519/spake25519.cc b/naiveproxy/src/third_party/boringssl/src/crypto/curve25519/spake25519.cc index 2a3164b493..4421f9bd8d 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/curve25519/spake25519.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/curve25519/spake25519.cc @@ -17,6 +17,8 @@ #include #include +#include + #include #include #include @@ -278,8 +280,8 @@ SPAKE2_CTX *SPAKE2_CTX_new(enum spake2_role_t my_role, const uint8_t *my_name, size_t their_name_len) { SPAKE2_CTX *ctx = reinterpret_cast(OPENSSL_zalloc(sizeof(SPAKE2_CTX))); - if (ctx == NULL) { - return NULL; + if (ctx == nullptr) { + return nullptr; } ctx->my_role = my_role; @@ -290,14 +292,14 @@ SPAKE2_CTX *SPAKE2_CTX_new(enum spake2_role_t my_role, const uint8_t *my_name, if (!CBS_stow(&my_name_cbs, &ctx->my_name, &ctx->my_name_len) || !CBS_stow(&their_name_cbs, &ctx->their_name, &ctx->their_name_len)) { SPAKE2_CTX_free(ctx); - return NULL; + return nullptr; } return ctx; } void SPAKE2_CTX_free(SPAKE2_CTX *ctx) { - if (ctx == NULL) { + if (ctx == nullptr) { return; } @@ -333,18 +335,17 @@ static const scalar kOrder = { // scalar_cmov copies |src| to |dest| if |mask| is all ones. static void scalar_cmov(scalar *dest, const scalar *src, crypto_word_t mask) { bn_select_words(dest->words, mask, src->words, dest->words, - OPENSSL_ARRAY_SIZE(dest->words)); + std::size(dest->words)); } // scalar_double sets |s| to |2×s|. static void scalar_double(scalar *s) { - bn_add_words(s->words, s->words, s->words, OPENSSL_ARRAY_SIZE(s->words)); + bn_add_words(s->words, s->words, s->words, std::size(s->words)); } // scalar_add sets |dest| to |dest| plus |src|. static void scalar_add(scalar *dest, const scalar *src) { - bn_add_words(dest->words, dest->words, src->words, - OPENSSL_ARRAY_SIZE(dest->words)); + bn_add_words(dest->words, dest->words, src->words, std::size(dest->words)); } int SPAKE2_generate_msg(SPAKE2_CTX *ctx, uint8_t *out, size_t *out_len, diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/dh/dh_asn1.cc b/naiveproxy/src/third_party/boringssl/src/crypto/dh/dh_asn1.cc index 9295e145a5..606b302ad9 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/dh/dh_asn1.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/dh/dh_asn1.cc @@ -26,16 +26,16 @@ static int parse_integer(CBS *cbs, BIGNUM **out) { - assert(*out == NULL); + assert(*out == nullptr); *out = BN_new(); - if (*out == NULL) { + if (*out == nullptr) { return 0; } return BN_parse_asn1_unsigned(cbs, *out); } static int marshal_integer(CBB *cbb, BIGNUM *bn) { - if (bn == NULL) { + if (bn == nullptr) { // A DH object may be missing some components. OPENSSL_PUT_ERROR(DH, ERR_R_PASSED_NULL_PARAMETER); return 0; @@ -95,29 +95,11 @@ int DH_marshal_parameters(CBB *cbb, const DH *dh) { } DH *d2i_DHparams(DH **out, const uint8_t **inp, long len) { - if (len < 0) { - return NULL; - } - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - DH *ret = DH_parse_parameters(&cbs); - if (ret == NULL) { - return NULL; - } - if (out != NULL) { - DH_free(*out); - *out = ret; - } - *inp = CBS_data(&cbs); - return ret; + return bssl::D2IFromCBS(out, inp, len, DH_parse_parameters); } int i2d_DHparams(const DH *in, uint8_t **outp) { - CBB cbb; - if (!CBB_init(&cbb, 0) || - !DH_marshal_parameters(&cbb, in)) { - CBB_cleanup(&cbb); - return -1; - } - return CBB_finish_i2d(&cbb, outp); + return bssl::I2DFromCBB( + /*initial_capacity=*/256, outp, + [&](CBB *cbb) -> bool { return DH_marshal_parameters(cbb, in); }); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/dh/params.cc b/naiveproxy/src/third_party/boringssl/src/crypto/dh/params.cc index 115505f043..bb62428e60 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/dh/params.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/dh/params.cc @@ -17,25 +17,25 @@ #include #include #include +#include #include "../fipsmodule/bn/internal.h" #include "../fipsmodule/dh/internal.h" -static BIGNUM *get_params(BIGNUM *ret, const BN_ULONG *words, - size_t num_words) { - BIGNUM *alloc = NULL; - if (ret == NULL) { +static BIGNUM *get_params(BIGNUM *ret, bssl::Span words) { + BIGNUM *alloc = nullptr; + if (ret == nullptr) { alloc = BN_new(); - if (alloc == NULL) { - return NULL; + if (alloc == nullptr) { + return nullptr; } ret = alloc; } - if (!bn_set_words(ret, words, num_words)) { + if (!bn_set_words(ret, words.data(), words.size())) { BN_free(alloc); - return NULL; + return nullptr; } return ret; @@ -56,7 +56,7 @@ BIGNUM *BN_get_rfc3526_prime_1536(BIGNUM *ret) { TOBN(0x29024e08, 0x8a67cc74), TOBN(0xc4c6628b, 0x80dc1cd1), TOBN(0xc90fdaa2, 0x2168c234), TOBN(0xffffffff, 0xffffffff), }; - return get_params(ret, kWords, OPENSSL_ARRAY_SIZE(kWords)); + return get_params(ret, kWords); } BIGNUM *BN_get_rfc3526_prime_2048(BIGNUM *ret) { @@ -78,7 +78,7 @@ BIGNUM *BN_get_rfc3526_prime_2048(BIGNUM *ret) { TOBN(0x29024e08, 0x8a67cc74), TOBN(0xc4c6628b, 0x80dc1cd1), TOBN(0xc90fdaa2, 0x2168c234), TOBN(0xffffffff, 0xffffffff), }; - return get_params(ret, kWords, OPENSSL_ARRAY_SIZE(kWords)); + return get_params(ret, kWords); } BIGNUM *BN_get_rfc3526_prime_3072(BIGNUM *ret) { @@ -108,7 +108,7 @@ BIGNUM *BN_get_rfc3526_prime_3072(BIGNUM *ret) { TOBN(0x29024e08, 0x8a67cc74), TOBN(0xc4c6628b, 0x80dc1cd1), TOBN(0xc90fdaa2, 0x2168c234), TOBN(0xffffffff, 0xffffffff), }; - return get_params(ret, kWords, OPENSSL_ARRAY_SIZE(kWords)); + return get_params(ret, kWords); } BIGNUM *BN_get_rfc3526_prime_4096(BIGNUM *ret) { @@ -146,7 +146,7 @@ BIGNUM *BN_get_rfc3526_prime_4096(BIGNUM *ret) { TOBN(0x29024e08, 0x8a67cc74), TOBN(0xc4c6628b, 0x80dc1cd1), TOBN(0xc90fdaa2, 0x2168c234), TOBN(0xffffffff, 0xffffffff), }; - return get_params(ret, kWords, OPENSSL_ARRAY_SIZE(kWords)); + return get_params(ret, kWords); } BIGNUM *BN_get_rfc3526_prime_6144(BIGNUM *ret) { @@ -200,7 +200,7 @@ BIGNUM *BN_get_rfc3526_prime_6144(BIGNUM *ret) { TOBN(0x29024e08, 0x8a67cc74), TOBN(0xc4c6628b, 0x80dc1cd1), TOBN(0xc90fdaa2, 0x2168c234), TOBN(0xffffffff, 0xffffffff), }; - return get_params(ret, kWords, OPENSSL_ARRAY_SIZE(kWords)); + return get_params(ret, kWords); } BIGNUM *BN_get_rfc3526_prime_8192(BIGNUM *ret) { @@ -270,7 +270,7 @@ BIGNUM *BN_get_rfc3526_prime_8192(BIGNUM *ret) { TOBN(0x29024e08, 0x8a67cc74), TOBN(0xc4c6628b, 0x80dc1cd1), TOBN(0xc90fdaa2, 0x2168c234), TOBN(0xffffffff, 0xffffffff), }; - return get_params(ret, kWords, OPENSSL_ARRAY_SIZE(kWords)); + return get_params(ret, kWords); } int DH_generate_parameters_ex(DH *dh, int prime_bits, int generator, @@ -306,16 +306,16 @@ int DH_generate_parameters_ex(DH *dh, int prime_bits, int generator, } // Make sure |dh| has the necessary elements - if (dh->p == NULL) { + if (dh->p == nullptr) { dh->p = BN_new(); - if (dh->p == NULL) { + if (dh->p == nullptr) { OPENSSL_PUT_ERROR(DH, ERR_R_BN_LIB); return 0; } } - if (dh->g == NULL) { + if (dh->g == nullptr) { dh->g = BN_new(); - if (dh->g == NULL) { + if (dh->g == nullptr) { OPENSSL_PUT_ERROR(DH, ERR_R_BN_LIB); return 0; } @@ -359,7 +359,7 @@ int DH_generate_parameters_ex(DH *dh, int prime_bits, int generator, } static int int_dh_bn_cpy(BIGNUM **dst, const BIGNUM *src) { - BIGNUM *a = NULL; + BIGNUM *a = nullptr; if (src) { a = BN_dup(src); @@ -396,12 +396,12 @@ static int int_dh_param_copy(DH *to, const DH *from, int is_x942) { DH *DHparams_dup(const DH *dh) { DH *ret = DH_new(); if (!ret) { - return NULL; + return nullptr; } if (!int_dh_param_copy(ret, dh, -1)) { DH_free(ret); - return NULL; + return nullptr; } return ret; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/digest/digest_extra.cc b/naiveproxy/src/third_party/boringssl/src/crypto/digest/digest_extra.cc index 4312142773..ea1709ae6b 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/digest/digest_extra.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/digest/digest_extra.cc @@ -23,6 +23,7 @@ #include #include #include +#include #include "../asn1/internal.h" #include "../fipsmodule/digest/internal.h" @@ -53,7 +54,7 @@ static const struct nid_to_digest nid_to_digest_mapping[] = { // consumers so we retain it there. {NID_undef, EVP_sha1, SN_dsaWithSHA, LN_dsaWithSHA}, {NID_undef, EVP_sha1, SN_dsaWithSHA1, LN_dsaWithSHA1}, - {NID_undef, EVP_sha1, SN_ecdsa_with_SHA1, NULL}, + {NID_undef, EVP_sha1, SN_ecdsa_with_SHA1, nullptr}, {NID_undef, EVP_md5, SN_md5WithRSAEncryption, LN_md5WithRSAEncryption}, {NID_undef, EVP_sha1, SN_sha1WithRSAEncryption, LN_sha1WithRSAEncryption}, {NID_undef, EVP_sha224, SN_sha224WithRSAEncryption, @@ -69,16 +70,16 @@ static const struct nid_to_digest nid_to_digest_mapping[] = { const EVP_MD *EVP_get_digestbynid(int nid) { if (nid == NID_undef) { // Skip the |NID_undef| entries in |nid_to_digest_mapping|. - return NULL; + return nullptr; } - for (unsigned i = 0; i < OPENSSL_ARRAY_SIZE(nid_to_digest_mapping); i++) { - if (nid_to_digest_mapping[i].nid == nid) { - return nid_to_digest_mapping[i].md_func(); + for (const auto &mapping : nid_to_digest_mapping) { + if (mapping.nid == nid) { + return mapping.md_func(); } } - return NULL; + return nullptr; } static const struct { @@ -102,42 +103,41 @@ static const struct { {{0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04}, 9, NID_sha224}, }; -static const EVP_MD *cbs_to_md(const CBS *cbs) { - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kMDOIDs); i++) { - if (CBS_len(cbs) == kMDOIDs[i].oid_len && - OPENSSL_memcmp(CBS_data(cbs), kMDOIDs[i].oid, kMDOIDs[i].oid_len) == - 0) { - return EVP_get_digestbynid(kMDOIDs[i].nid); +static int cbs_to_digest_nid(const CBS *cbs) { + for (const auto &md : kMDOIDs) { + if (bssl::Span(*cbs) == + bssl::Span(md.oid).first(md.oid_len)) { + return md.nid; } } - - return NULL; + return NID_undef; } const EVP_MD *EVP_get_digestbyobj(const ASN1_OBJECT *obj) { - // Handle objects with no corresponding OID. Note we don't use |OBJ_obj2nid| - // here to avoid pulling in the OID table. - if (obj->nid != NID_undef) { - return EVP_get_digestbynid(obj->nid); + int nid = obj->nid; + if (nid == NID_undef) { + // Handle objects with no saved NID. Note we don't use |OBJ_obj2nid| here to + // avoid pulling in the OID table. + CBS cbs; + CBS_init(&cbs, OBJ_get0_data(obj), OBJ_length(obj)); + nid = cbs_to_digest_nid(&cbs); } - CBS cbs; - CBS_init(&cbs, OBJ_get0_data(obj), OBJ_length(obj)); - return cbs_to_md(&cbs); + return nid == NID_undef ? nullptr : EVP_get_digestbynid(nid); } -const EVP_MD *EVP_parse_digest_algorithm(CBS *cbs) { +int EVP_parse_digest_algorithm_nid(CBS *cbs) { CBS algorithm, oid; if (!CBS_get_asn1(cbs, &algorithm, CBS_ASN1_SEQUENCE) || !CBS_get_asn1(&algorithm, &oid, CBS_ASN1_OBJECT)) { OPENSSL_PUT_ERROR(DIGEST, DIGEST_R_DECODE_ERROR); - return NULL; + return NID_undef; } - const EVP_MD *ret = cbs_to_md(&oid); - if (ret == NULL) { + int ret = cbs_to_digest_nid(&oid); + if (ret == NID_undef) { OPENSSL_PUT_ERROR(DIGEST, DIGEST_R_UNKNOWN_HASH); - return NULL; + return NID_undef; } // The parameters, if present, must be NULL. Historically, whether the NULL @@ -150,13 +150,21 @@ const EVP_MD *EVP_parse_digest_algorithm(CBS *cbs) { CBS_len(¶m) != 0 || // CBS_len(&algorithm) != 0) { OPENSSL_PUT_ERROR(DIGEST, DIGEST_R_DECODE_ERROR); - return NULL; + return NID_undef; } } return ret; } +const EVP_MD *EVP_parse_digest_algorithm(CBS *cbs) { + int nid = EVP_parse_digest_algorithm_nid(cbs); + if (nid == NID_undef) { + return nullptr; + } + return EVP_get_digestbynid(nid); +} + static int marshal_digest_algorithm(CBB *cbb, const EVP_MD *md, bool with_null) { CBB algorithm, oid, null; @@ -199,16 +207,16 @@ int EVP_marshal_digest_algorithm_no_params(CBB *cbb, const EVP_MD *md) { } const EVP_MD *EVP_get_digestbyname(const char *name) { - for (unsigned i = 0; i < OPENSSL_ARRAY_SIZE(nid_to_digest_mapping); i++) { - const char *short_name = nid_to_digest_mapping[i].short_name; - const char *long_name = nid_to_digest_mapping[i].long_name; + for (const auto &mapping : nid_to_digest_mapping) { + const char *short_name = mapping.short_name; + const char *long_name = mapping.long_name; if ((short_name && strcmp(short_name, name) == 0) || (long_name && strcmp(long_name, name) == 0)) { - return nid_to_digest_mapping[i].md_func(); + return mapping.md_func(); } } - return NULL; + return nullptr; } static void blake2b256_init(EVP_MD_CTX *ctx) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/dsa/dsa.cc b/naiveproxy/src/third_party/boringssl/src/crypto/dsa/dsa.cc index c1dcd3bf76..865e5062d0 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/dsa/dsa.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/dsa/dsa.cc @@ -47,8 +47,8 @@ static CRYPTO_EX_DATA_CLASS g_ex_data_class = CRYPTO_EX_DATA_CLASS_INIT; DSA *DSA_new(void) { DSA *dsa = reinterpret_cast(OPENSSL_zalloc(sizeof(DSA))); - if (dsa == NULL) { - return NULL; + if (dsa == nullptr) { + return nullptr; } dsa->references = 1; @@ -58,7 +58,7 @@ DSA *DSA_new(void) { } void DSA_free(DSA *dsa) { - if (dsa == NULL) { + if (dsa == nullptr) { return; } @@ -98,37 +98,37 @@ const BIGNUM *DSA_get0_g(const DSA *dsa) { return dsa->g; } void DSA_get0_key(const DSA *dsa, const BIGNUM **out_pub_key, const BIGNUM **out_priv_key) { - if (out_pub_key != NULL) { + if (out_pub_key != nullptr) { *out_pub_key = dsa->pub_key; } - if (out_priv_key != NULL) { + if (out_priv_key != nullptr) { *out_priv_key = dsa->priv_key; } } void DSA_get0_pqg(const DSA *dsa, const BIGNUM **out_p, const BIGNUM **out_q, const BIGNUM **out_g) { - if (out_p != NULL) { + if (out_p != nullptr) { *out_p = dsa->p; } - if (out_q != NULL) { + if (out_q != nullptr) { *out_q = dsa->q; } - if (out_g != NULL) { + if (out_g != nullptr) { *out_g = dsa->g; } } int DSA_set0_key(DSA *dsa, BIGNUM *pub_key, BIGNUM *priv_key) { - if (dsa->pub_key == NULL && pub_key == NULL) { + if (dsa->pub_key == nullptr && pub_key == nullptr) { return 0; } - if (pub_key != NULL) { + if (pub_key != nullptr) { BN_free(dsa->pub_key); dsa->pub_key = pub_key; } - if (priv_key != NULL) { + if (priv_key != nullptr) { BN_free(dsa->priv_key); dsa->priv_key = priv_key; } @@ -137,28 +137,29 @@ int DSA_set0_key(DSA *dsa, BIGNUM *pub_key, BIGNUM *priv_key) { } int DSA_set0_pqg(DSA *dsa, BIGNUM *p, BIGNUM *q, BIGNUM *g) { - if ((dsa->p == NULL && p == NULL) || (dsa->q == NULL && q == NULL) || - (dsa->g == NULL && g == NULL)) { + if ((dsa->p == nullptr && p == nullptr) || + (dsa->q == nullptr && q == nullptr) || + (dsa->g == nullptr && g == nullptr)) { return 0; } - if (p != NULL) { + if (p != nullptr) { BN_free(dsa->p); dsa->p = p; } - if (q != NULL) { + if (q != nullptr) { BN_free(dsa->q); dsa->q = q; } - if (g != NULL) { + if (g != nullptr) { BN_free(dsa->g); dsa->g = g; } BN_MONT_CTX_free(dsa->method_mont_p); - dsa->method_mont_p = NULL; + dsa->method_mont_p = nullptr; BN_MONT_CTX_free(dsa->method_mont_q); - dsa->method_mont_q = NULL; + dsa->method_mont_q = nullptr; return 1; } @@ -174,7 +175,7 @@ int DSA_generate_parameters_ex(DSA *dsa, unsigned bits, const uint8_t *seed_in, unsigned char md[SHA256_DIGEST_LENGTH]; unsigned char buf[SHA256_DIGEST_LENGTH], buf2[SHA256_DIGEST_LENGTH]; BIGNUM *r0, *W, *X, *c, *test; - BIGNUM *g = NULL, *q = NULL, *p = NULL; + BIGNUM *g = nullptr, *q = nullptr, *p = nullptr; int k, n = 0, m = 0; int counter = 0; int r = 0; @@ -190,7 +191,7 @@ int DSA_generate_parameters_ex(DSA *dsa, unsigned bits, const uint8_t *seed_in, bits = (bits + 63) / 64 * 64; - if (seed_in != NULL) { + if (seed_in != nullptr) { if (seed_len < qsize) { return 0; } @@ -216,7 +217,7 @@ int DSA_generate_parameters_ex(DSA *dsa, unsigned bits, const uint8_t *seed_in, p = BN_CTX_get(ctx.get()); test = BN_CTX_get(ctx.get()); - if (test == NULL || !BN_lshift(test, BN_value_one(), bits - 1)) { + if (test == nullptr || !BN_lshift(test, BN_value_one(), bits - 1)) { return 0; } @@ -228,7 +229,7 @@ int DSA_generate_parameters_ex(DSA *dsa, unsigned bits, const uint8_t *seed_in, return 0; } - int use_random_seed = (seed_in == NULL); + int use_random_seed = (seed_in == nullptr); if (use_random_seed) { if (!RAND_bytes(seed, qsize)) { return 0; @@ -237,7 +238,7 @@ int DSA_generate_parameters_ex(DSA *dsa, unsigned bits, const uint8_t *seed_in, CONSTTIME_DECLASSIFY(seed, qsize); } else { // If we come back through, use random seed next time. - seed_in = NULL; + seed_in = nullptr; } OPENSSL_memcpy(buf, seed, qsize); OPENSSL_memcpy(buf2, seed, qsize); @@ -250,8 +251,8 @@ int DSA_generate_parameters_ex(DSA *dsa, unsigned bits, const uint8_t *seed_in, } // step 2 - if (!EVP_Digest(seed, qsize, md, NULL, evpmd, NULL) || - !EVP_Digest(buf, qsize, buf2, NULL, evpmd, NULL)) { + if (!EVP_Digest(seed, qsize, md, nullptr, evpmd, nullptr) || + !EVP_Digest(buf, qsize, buf2, nullptr, evpmd, nullptr)) { return 0; } for (size_t i = 0; i < qsize; i++) { @@ -306,7 +307,7 @@ int DSA_generate_parameters_ex(DSA *dsa, unsigned bits, const uint8_t *seed_in, } } - if (!EVP_Digest(buf, qsize, md, NULL, evpmd, NULL)) { + if (!EVP_Digest(buf, qsize, md, nullptr, evpmd, nullptr)) { return 0; } @@ -358,7 +359,7 @@ end: // We now need to generate g // Set r0=(p-1)/q if (!BN_sub(test, p, BN_value_one()) || - !BN_div(r0, NULL, test, q, ctx.get())) { + !BN_div(r0, nullptr, test, q, ctx.get())) { return 0; } @@ -391,13 +392,13 @@ end: dsa->p = BN_dup(p); dsa->q = BN_dup(q); dsa->g = BN_dup(g); - if (dsa->p == NULL || dsa->q == NULL || dsa->g == NULL) { + if (dsa->p == nullptr || dsa->q == nullptr || dsa->g == nullptr) { return 0; } - if (out_counter != NULL) { + if (out_counter != nullptr) { *out_counter = counter; } - if (out_h != NULL) { + if (out_h != nullptr) { *out_h = h; } @@ -406,15 +407,15 @@ end: DSA *DSAparams_dup(const DSA *dsa) { DSA *ret = DSA_new(); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->p = BN_dup(dsa->p); ret->q = BN_dup(dsa->q); ret->g = BN_dup(dsa->g); - if (ret->p == NULL || ret->q == NULL || ret->g == NULL) { + if (ret->p == nullptr || ret->q == nullptr || ret->g == nullptr) { DSA_free(ret); - return NULL; + return nullptr; } return ret; } @@ -492,16 +493,16 @@ void DSA_SIG_free(DSA_SIG *sig) { void DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **out_r, const BIGNUM **out_s) { - if (out_r != NULL) { + if (out_r != nullptr) { *out_r = sig->r; } - if (out_s != NULL) { + if (out_s != nullptr) { *out_s = sig->s; } } int DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s) { - if (r == NULL || s == NULL) { + if (r == nullptr || s == nullptr) { return 0; } BN_free(sig->r); @@ -527,29 +528,29 @@ static int mod_mul_consttime(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, DSA_SIG *DSA_do_sign(const uint8_t *digest, size_t digest_len, const DSA *dsa) { if (!dsa_check_key(dsa)) { - return NULL; + return nullptr; } - if (dsa->priv_key == NULL) { + if (dsa->priv_key == nullptr) { OPENSSL_PUT_ERROR(DSA, DSA_R_MISSING_PARAMETERS); - return NULL; + return nullptr; } - BIGNUM *kinv = NULL, *r = NULL, *s = NULL; + BIGNUM *kinv = nullptr, *r = nullptr, *s = nullptr; BIGNUM m; BIGNUM xr; - BN_CTX *ctx = NULL; - DSA_SIG *ret = NULL; + BN_CTX *ctx = nullptr; + DSA_SIG *ret = nullptr; BN_init(&m); BN_init(&xr); s = BN_new(); { - if (s == NULL) { + if (s == nullptr) { goto err; } ctx = BN_CTX_new(); - if (ctx == NULL) { + if (ctx == nullptr) { goto err; } @@ -558,7 +559,7 @@ DSA_SIG *DSA_do_sign(const uint8_t *digest, size_t digest_len, const DSA *dsa) { // retry is negligible, let alone 32. Unfortunately, DSA was mis-specified, // so invalid parameters are reachable from most callers handling untrusted // private keys. (The |dsa_check_key| call above is not sufficient. Checking - // whether arbitrary paremeters form a valid DSA group is expensive.) + // whether arbitrary parameters form a valid DSA group is expensive.) static const int kMaxIterations = 32; int iters = 0; redo: @@ -573,7 +574,7 @@ DSA_SIG *DSA_do_sign(const uint8_t *digest, size_t digest_len, const DSA *dsa) { digest_len = BN_num_bytes(dsa->q); } - if (BN_bin2bn(digest, digest_len, &m) == NULL) { + if (BN_bin2bn(digest, digest_len, &m) == nullptr) { goto err; } @@ -612,7 +613,7 @@ DSA_SIG *DSA_do_sign(const uint8_t *digest, size_t digest_len, const DSA *dsa) { } ret = DSA_SIG_new(); - if (ret == NULL) { + if (ret == nullptr) { goto err; } ret->r = r; @@ -620,7 +621,7 @@ DSA_SIG *DSA_do_sign(const uint8_t *digest, size_t digest_len, const DSA *dsa) { } err: - if (ret == NULL) { + if (ret == nullptr) { OPENSSL_PUT_ERROR(DSA, ERR_R_BN_LIB); BN_free(r); BN_free(s); @@ -650,7 +651,7 @@ int DSA_do_check_signature(int *out_valid, const uint8_t *digest, return 0; } - if (dsa->pub_key == NULL) { + if (dsa->pub_key == nullptr) { OPENSSL_PUT_ERROR(DSA, DSA_R_MISSING_PARAMETERS); return 0; } @@ -662,7 +663,7 @@ int DSA_do_check_signature(int *out_valid, const uint8_t *digest, BN_init(&t1); BN_CTX *ctx = BN_CTX_new(); { - if (ctx == NULL) { + if (ctx == nullptr) { goto err; } @@ -703,7 +704,7 @@ int DSA_do_check_signature(int *out_valid, const uint8_t *digest, digest_len = (q_bits >> 3); } - if (BN_bin2bn(digest, digest_len, &u1) == NULL) { + if (BN_bin2bn(digest, digest_len, &u1) == nullptr) { goto err; } @@ -752,7 +753,7 @@ int DSA_sign(int type, const uint8_t *digest, size_t digest_len, DSA_SIG *s; s = DSA_do_sign(digest, digest_len, dsa); - if (s == NULL) { + if (s == nullptr) { *out_siglen = 0; return 0; } @@ -774,18 +775,18 @@ int DSA_verify(int type, const uint8_t *digest, size_t digest_len, int DSA_check_signature(int *out_valid, const uint8_t *digest, size_t digest_len, const uint8_t *sig, size_t sig_len, const DSA *dsa) { - DSA_SIG *s = NULL; + DSA_SIG *s = nullptr; int ret = 0; - uint8_t *der = NULL; + uint8_t *der = nullptr; s = DSA_SIG_new(); { - if (s == NULL) { + if (s == nullptr) { goto err; } const uint8_t *sigp = sig; - if (d2i_DSA_SIG(&s, &sigp, sig_len) == NULL || sigp != sig + sig_len) { + if (d2i_DSA_SIG(&s, &sigp, sig_len) == nullptr || sigp != sig + sig_len) { goto err; } @@ -820,7 +821,7 @@ static size_t der_len_len(size_t len) { } int DSA_size(const DSA *dsa) { - if (dsa->q == NULL) { + if (dsa->q == nullptr) { return 0; } @@ -851,7 +852,7 @@ static int dsa_sign_setup(const DSA *dsa, BN_CTX *ctx, BIGNUM **out_kinv, BN_init(&k); BIGNUM *r = BN_new(); BIGNUM *kinv = BN_new(); - if (r == NULL || kinv == NULL || + if (r == nullptr || kinv == nullptr || // Get random k !BN_rand_range_ex(&k, 1, dsa->q) || !BN_MONT_CTX_set_locked((BN_MONT_CTX **)&dsa->method_mont_p, @@ -884,11 +885,11 @@ static int dsa_sign_setup(const DSA *dsa, BN_CTX *ctx, BIGNUM **out_kinv, BN_clear_free(*out_kinv); *out_kinv = kinv; - kinv = NULL; + kinv = nullptr; BN_clear_free(*out_r); *out_r = r; - r = NULL; + r = nullptr; ret = 1; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/dsa/dsa_asn1.cc b/naiveproxy/src/third_party/boringssl/src/crypto/dsa/dsa_asn1.cc index af5ccadf80..b4ad573ddd 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/dsa/dsa_asn1.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/dsa/dsa_asn1.cc @@ -65,7 +65,7 @@ int dsa_check_key(const DSA *dsa) { return 0; } - if (dsa->pub_key != NULL) { + if (dsa->pub_key != nullptr) { // The public key is also in the multiplicative group of |p|. if (BN_is_negative(dsa->pub_key) || BN_is_zero(dsa->pub_key) || BN_cmp(dsa->pub_key, dsa->p) >= 0) { @@ -74,7 +74,7 @@ int dsa_check_key(const DSA *dsa) { } } - if (dsa->priv_key != NULL) { + if (dsa->priv_key != nullptr) { // The private key is a non-zero element of the scalar field, determined by // |q|. if (BN_is_negative(dsa->priv_key) || @@ -89,16 +89,16 @@ int dsa_check_key(const DSA *dsa) { } static int parse_integer(CBS *cbs, BIGNUM **out) { - assert(*out == NULL); + assert(*out == nullptr); *out = BN_new(); - if (*out == NULL) { + if (*out == nullptr) { return 0; } return BN_parse_asn1_unsigned(cbs, *out); } static int marshal_integer(CBB *cbb, BIGNUM *bn) { - if (bn == NULL) { + if (bn == nullptr) { // A DSA object may be missing some components. OPENSSL_PUT_ERROR(DSA, ERR_R_PASSED_NULL_PARAMETER); return 0; @@ -108,8 +108,8 @@ static int marshal_integer(CBB *cbb, BIGNUM *bn) { DSA_SIG *DSA_SIG_parse(CBS *cbs) { DSA_SIG *ret = DSA_SIG_new(); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } CBS child; if (!CBS_get_asn1(cbs, &child, CBS_ASN1_SEQUENCE) || @@ -118,7 +118,7 @@ DSA_SIG *DSA_SIG_parse(CBS *cbs) { CBS_len(&child) != 0) { OPENSSL_PUT_ERROR(DSA, DSA_R_DECODE_ERROR); DSA_SIG_free(ret); - return NULL; + return nullptr; } return ret; } @@ -255,113 +255,41 @@ int DSA_marshal_private_key(CBB *cbb, const DSA *dsa) { } DSA_SIG *d2i_DSA_SIG(DSA_SIG **out_sig, const uint8_t **inp, long len) { - if (len < 0) { - return NULL; - } - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - DSA_SIG *ret = DSA_SIG_parse(&cbs); - if (ret == NULL) { - return NULL; - } - if (out_sig != NULL) { - DSA_SIG_free(*out_sig); - *out_sig = ret; - } - *inp = CBS_data(&cbs); - return ret; + return bssl::D2IFromCBS(out_sig, inp, len, DSA_SIG_parse); } int i2d_DSA_SIG(const DSA_SIG *in, uint8_t **outp) { - CBB cbb; - if (!CBB_init(&cbb, 0) || - !DSA_SIG_marshal(&cbb, in)) { - CBB_cleanup(&cbb); - return -1; - } - return CBB_finish_i2d(&cbb, outp); + return bssl::I2DFromCBB( + /*initial_capacity=*/256, outp, + [&](CBB *cbb) -> bool { return DSA_SIG_marshal(cbb, in); }); } DSA *d2i_DSAPublicKey(DSA **out, const uint8_t **inp, long len) { - if (len < 0) { - return NULL; - } - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - DSA *ret = DSA_parse_public_key(&cbs); - if (ret == NULL) { - return NULL; - } - if (out != NULL) { - DSA_free(*out); - *out = ret; - } - *inp = CBS_data(&cbs); - return ret; + return bssl::D2IFromCBS(out, inp, len, DSA_parse_public_key); } int i2d_DSAPublicKey(const DSA *in, uint8_t **outp) { - CBB cbb; - if (!CBB_init(&cbb, 0) || - !DSA_marshal_public_key(&cbb, in)) { - CBB_cleanup(&cbb); - return -1; - } - return CBB_finish_i2d(&cbb, outp); + return bssl::I2DFromCBB( + /*initial_capacity=*/256, outp, + [&](CBB *cbb) -> bool { return DSA_marshal_public_key(cbb, in); }); } DSA *d2i_DSAPrivateKey(DSA **out, const uint8_t **inp, long len) { - if (len < 0) { - return NULL; - } - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - DSA *ret = DSA_parse_private_key(&cbs); - if (ret == NULL) { - return NULL; - } - if (out != NULL) { - DSA_free(*out); - *out = ret; - } - *inp = CBS_data(&cbs); - return ret; + return bssl::D2IFromCBS(out, inp, len, DSA_parse_private_key); } int i2d_DSAPrivateKey(const DSA *in, uint8_t **outp) { - CBB cbb; - if (!CBB_init(&cbb, 0) || - !DSA_marshal_private_key(&cbb, in)) { - CBB_cleanup(&cbb); - return -1; - } - return CBB_finish_i2d(&cbb, outp); + return bssl::I2DFromCBB( + /*initial_capacity=*/256, outp, + [&](CBB *cbb) -> bool { return DSA_marshal_private_key(cbb, in); }); } DSA *d2i_DSAparams(DSA **out, const uint8_t **inp, long len) { - if (len < 0) { - return NULL; - } - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - DSA *ret = DSA_parse_parameters(&cbs); - if (ret == NULL) { - return NULL; - } - if (out != NULL) { - DSA_free(*out); - *out = ret; - } - *inp = CBS_data(&cbs); - return ret; + return bssl::D2IFromCBS(out, inp, len, DSA_parse_parameters); } int i2d_DSAparams(const DSA *in, uint8_t **outp) { - CBB cbb; - if (!CBB_init(&cbb, 0) || - !DSA_marshal_parameters(&cbb, in)) { - CBB_cleanup(&cbb); - return -1; - } - return CBB_finish_i2d(&cbb, outp); + return bssl::I2DFromCBB( + /*initial_capacity=*/256, outp, + [&](CBB *cbb) -> bool { return DSA_marshal_parameters(cbb, in); }); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/ec/ec_asn1.cc b/naiveproxy/src/third_party/boringssl/src/crypto/ec/ec_asn1.cc index 58f379c790..d394584927 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/ec/ec_asn1.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/ec/ec_asn1.cc @@ -17,6 +17,9 @@ #include #include +#include +#include + #include #include #include @@ -27,6 +30,7 @@ #include "../bytestring/internal.h" #include "../fipsmodule/ec/internal.h" #include "../internal.h" +#include "internal.h" static const CBS_ASN1_TAG kParametersTag = @@ -34,17 +38,23 @@ static const CBS_ASN1_TAG kParametersTag = static const CBS_ASN1_TAG kPublicKeyTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 1; -// TODO(https://crbug.com/boringssl/497): Allow parsers to specify a list of -// acceptable groups, so parsers don't have to pull in all four. -typedef const EC_GROUP *(*ec_group_func)(void); -static const ec_group_func kAllGroups[] = { - &EC_group_p224, - &EC_group_p256, - &EC_group_p384, - &EC_group_p521, -}; +static auto get_all_groups() { + return std::array{ + EC_group_p224(), + EC_group_p256(), + EC_group_p384(), + EC_group_p521(), + }; +} + +EC_KEY *ec_key_parse_private_key( + CBS *cbs, const EC_GROUP *group, + bssl::Span allowed_groups) { + // If a group was supplied externally, no other groups can be parsed. + if (group != nullptr) { + allowed_groups = bssl::Span(&group, 1); + } -EC_KEY *EC_KEY_parse_private_key(CBS *cbs, const EC_GROUP *group) { CBS ec_private_key, private_key; uint64_t version; if (!CBS_get_asn1(cbs, &ec_private_key, CBS_ASN1_SEQUENCE) || @@ -66,23 +76,31 @@ EC_KEY *EC_KEY_parse_private_key(CBS *cbs, const EC_GROUP *group) { OPENSSL_PUT_ERROR(EC, EC_R_DECODE_ERROR); return nullptr; } - const EC_GROUP *inner_group = EC_KEY_parse_parameters(&child); + const EC_GROUP *inner_group = + ec_key_parse_parameters(&child, allowed_groups); if (inner_group == nullptr) { + // If the caller already supplied a group, any explicit group is required + // to match. On mismatch, |ec_key_parse_parameters| will fail to recognize + // any other groups, so remap the error. + if (group != nullptr && + ERR_equals(ERR_peek_last_error(), ERR_LIB_EC, EC_R_UNKNOWN_GROUP)) { + ERR_clear_error(); + OPENSSL_PUT_ERROR(EC, EC_R_GROUP_MISMATCH); + } return nullptr; } - if (group == nullptr) { - group = inner_group; - } else if (EC_GROUP_cmp(group, inner_group, nullptr) != 0) { - // If a group was supplied externally, it must match. - OPENSSL_PUT_ERROR(EC, EC_R_GROUP_MISMATCH); - return nullptr; - } + // Overriding |allowed_groups| above ensures the only returned group will be + // the matching one. + assert(group == nullptr || inner_group == group); + group = inner_group; if (CBS_len(&child) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_DECODE_ERROR); return nullptr; } } + // The group must have been specified either externally, or explicitly in the + // structure. if (group == nullptr) { OPENSSL_PUT_ERROR(EC, EC_R_MISSING_PARAMETERS); return nullptr; @@ -151,9 +169,13 @@ EC_KEY *EC_KEY_parse_private_key(CBS *cbs, const EC_GROUP *group) { return ret.release(); } +EC_KEY *EC_KEY_parse_private_key(CBS *cbs, const EC_GROUP *group) { + return ec_key_parse_private_key(cbs, group, get_all_groups()); +} + int EC_KEY_marshal_private_key(CBB *cbb, const EC_KEY *key, unsigned enc_flags) { - if (key == NULL || key->group == NULL || key->priv_key == NULL) { + if (key == nullptr || key->group == nullptr || key->priv_key == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -180,7 +202,7 @@ int EC_KEY_marshal_private_key(CBB *cbb, const EC_KEY *key, } // TODO(fork): replace this flexibility with sensible default? - if (!(enc_flags & EC_PKEY_NO_PUBKEY) && key->pub_key != NULL) { + if (!(enc_flags & EC_PKEY_NO_PUBKEY) && key->pub_key != nullptr) { CBB child, public_key; if (!CBB_add_asn1(&ec_private_key, &child, kPublicKeyTag) || !CBB_add_asn1(&child, &public_key, CBS_ASN1_BITSTRING) || @@ -188,7 +210,7 @@ int EC_KEY_marshal_private_key(CBB *cbb, const EC_KEY *key, // encoded as a BIT STRING with bits ordered as in the DER encoding. !CBB_add_u8(&public_key, 0 /* padding */) || !EC_POINT_point2cbb(&public_key, key->group, key->pub_key, - key->conv_form, NULL) || + key->conv_form, nullptr) || !CBB_flush(&ec_private_key)) { OPENSSL_PUT_ERROR(EC, EC_R_ENCODE_ERROR); return 0; @@ -234,7 +256,7 @@ static int parse_explicit_prime_curve(CBS *in, !CBS_get_asn1(&curve, &out->a, CBS_ASN1_OCTETSTRING) || !CBS_get_asn1(&curve, &out->b, CBS_ASN1_OCTETSTRING) || // |curve| has an optional BIT STRING seed which we ignore. - !CBS_get_optional_asn1(&curve, NULL, NULL, CBS_ASN1_BITSTRING) || + !CBS_get_optional_asn1(&curve, nullptr, nullptr, CBS_ASN1_BITSTRING) || CBS_len(&curve) != 0 || !CBS_get_asn1(¶ms, &base, CBS_ASN1_OCTETSTRING) || !CBS_get_asn1(¶ms, &out->order, CBS_ASN1_INTEGER) || @@ -296,23 +318,29 @@ static int integers_equal(const CBS *bytes, const BIGNUM *bn) { return CBS_mem_equal(©, buf, CBS_len(©)); } -EC_GROUP *EC_KEY_parse_curve_name(CBS *cbs) { +const EC_GROUP *ec_key_parse_curve_name( + CBS *cbs, bssl::Span allowed_groups) { CBS named_curve; if (!CBS_get_asn1(cbs, &named_curve, CBS_ASN1_OBJECT)) { OPENSSL_PUT_ERROR(EC, EC_R_DECODE_ERROR); - return NULL; + return nullptr; } // Look for a matching curve. - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kAllGroups); i++) { - const EC_GROUP *group = kAllGroups[i](); - if (CBS_mem_equal(&named_curve, group->oid, group->oid_len)) { - return (EC_GROUP *)group; + for (const EC_GROUP *group : allowed_groups) { + if (named_curve == bssl::Span(group->oid, group->oid_len)) { + return group; } } OPENSSL_PUT_ERROR(EC, EC_R_UNKNOWN_GROUP); - return NULL; + return nullptr; +} + +EC_GROUP *EC_KEY_parse_curve_name(CBS *cbs) { + // This function only ever returns a static |EC_GROUP|, but currently returns + // a non-const pointer for historical reasons. + return const_cast(ec_key_parse_curve_name(cbs, get_all_groups())); } int EC_KEY_marshal_curve_name(CBB *cbb, const EC_GROUP *group) { @@ -324,9 +352,10 @@ int EC_KEY_marshal_curve_name(CBB *cbb, const EC_GROUP *group) { return CBB_add_asn1_element(cbb, CBS_ASN1_OBJECT, group->oid, group->oid_len); } -EC_GROUP *EC_KEY_parse_parameters(CBS *cbs) { +const EC_GROUP *ec_key_parse_parameters( + CBS *cbs, bssl::Span allowed_groups) { if (!CBS_peek_asn1_tag(cbs, CBS_ASN1_SEQUENCE)) { - return EC_KEY_parse_curve_name(cbs); + return ec_key_parse_curve_name(cbs, allowed_groups); } // OpenSSL sometimes produces ECPrivateKeys with explicitly-encoded versions @@ -348,8 +377,7 @@ EC_GROUP *EC_KEY_parse_parameters(CBS *cbs) { return nullptr; } - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kAllGroups); i++) { - const EC_GROUP *group = kAllGroups[i](); + for (const EC_GROUP *group : allowed_groups) { if (!integers_equal(&curve.order, EC_GROUP_get0_order(group))) { continue; } @@ -372,16 +400,22 @@ EC_GROUP *EC_KEY_parse_parameters(CBS *cbs) { !integers_equal(&curve.base_y, y.get())) { break; } - return const_cast(group); + return group; } OPENSSL_PUT_ERROR(EC, EC_R_UNKNOWN_GROUP); return nullptr; } +EC_GROUP *EC_KEY_parse_parameters(CBS *cbs) { + // This function only ever returns a static |EC_GROUP|, but currently returns + // a non-const pointer for historical reasons. + return const_cast(ec_key_parse_parameters(cbs, get_all_groups())); +} + int EC_POINT_point2cbb(CBB *out, const EC_GROUP *group, const EC_POINT *point, point_conversion_form_t form, BN_CTX *ctx) { - size_t len = EC_POINT_point2oct(group, point, form, NULL, 0, ctx); + size_t len = EC_POINT_point2oct(group, point, form, nullptr, 0, ctx); if (len == 0) { return 0; } @@ -393,130 +427,78 @@ int EC_POINT_point2cbb(CBB *out, const EC_GROUP *group, const EC_POINT *point, EC_KEY *d2i_ECPrivateKey(EC_KEY **out, const uint8_t **inp, long len) { // This function treats its |out| parameter differently from other |d2i| // functions. If supplied, take the group from |*out|. - const EC_GROUP *group = NULL; - if (out != NULL && *out != NULL) { + const EC_GROUP *group = nullptr; + if (out != nullptr && *out != nullptr) { group = EC_KEY_get0_group(*out); } - if (len < 0) { - OPENSSL_PUT_ERROR(EC, EC_R_DECODE_ERROR); - return NULL; - } - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - EC_KEY *ret = EC_KEY_parse_private_key(&cbs, group); - if (ret == NULL) { - return NULL; - } - if (out != NULL) { - EC_KEY_free(*out); - *out = ret; - } - *inp = CBS_data(&cbs); - return ret; + return bssl::D2IFromCBS(out, inp, len, [&](CBS *cbs) { + return EC_KEY_parse_private_key(cbs, group); + }); } int i2d_ECPrivateKey(const EC_KEY *key, uint8_t **outp) { - CBB cbb; - if (!CBB_init(&cbb, 0) || - !EC_KEY_marshal_private_key(&cbb, key, EC_KEY_get_enc_flags(key))) { - CBB_cleanup(&cbb); - return -1; - } - return CBB_finish_i2d(&cbb, outp); + return bssl::I2DFromCBB( + /*initial_capacity=*/64, outp, [&](CBB *cbb) -> bool { + return EC_KEY_marshal_private_key(cbb, key, EC_KEY_get_enc_flags(key)); + }); } EC_GROUP *d2i_ECPKParameters(EC_GROUP **out, const uint8_t **inp, long len) { - if (len < 0) { - return NULL; - } - - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - EC_GROUP *ret = EC_KEY_parse_parameters(&cbs); - if (ret == NULL) { - return NULL; - } - - if (out != NULL) { - EC_GROUP_free(*out); - *out = ret; - } - *inp = CBS_data(&cbs); - return ret; + return bssl::D2IFromCBS(out, inp, len, EC_KEY_parse_parameters); } int i2d_ECPKParameters(const EC_GROUP *group, uint8_t **outp) { - if (group == NULL) { + if (group == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); return -1; } - - CBB cbb; - if (!CBB_init(&cbb, 0) || // - !EC_KEY_marshal_curve_name(&cbb, group)) { - CBB_cleanup(&cbb); - return -1; - } - return CBB_finish_i2d(&cbb, outp); + return bssl::I2DFromCBB( + /*initial_capacity=*/16, outp, + [&](CBB *cbb) -> bool { return EC_KEY_marshal_curve_name(cbb, group); }); } EC_KEY *d2i_ECParameters(EC_KEY **out_key, const uint8_t **inp, long len) { - if (len < 0) { - return NULL; - } - - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - const EC_GROUP *group = EC_KEY_parse_parameters(&cbs); - if (group == NULL) { - return NULL; - } - - EC_KEY *ret = EC_KEY_new(); - if (ret == NULL || !EC_KEY_set_group(ret, group)) { - EC_KEY_free(ret); - return NULL; - } - - if (out_key != NULL) { - EC_KEY_free(*out_key); - *out_key = ret; - } - *inp = CBS_data(&cbs); - return ret; + return bssl::D2IFromCBS( + out_key, inp, len, [](CBS *cbs) -> bssl::UniquePtr { + const EC_GROUP *group = EC_KEY_parse_parameters(cbs); + if (group == nullptr) { + return nullptr; + } + bssl::UniquePtr ret(EC_KEY_new()); + if (ret == nullptr || !EC_KEY_set_group(ret.get(), group)) { + return nullptr; + } + return ret; + }); } int i2d_ECParameters(const EC_KEY *key, uint8_t **outp) { - if (key == NULL || key->group == NULL) { + if (key == nullptr || key->group == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); return -1; } - - CBB cbb; - if (!CBB_init(&cbb, 0) || // - !EC_KEY_marshal_curve_name(&cbb, key->group)) { - CBB_cleanup(&cbb); - return -1; - } - return CBB_finish_i2d(&cbb, outp); + return bssl::I2DFromCBB( + /*initial_capacity=*/16, outp, [&](CBB *cbb) -> bool { + return EC_KEY_marshal_curve_name(cbb, key->group); + }); } EC_KEY *o2i_ECPublicKey(EC_KEY **keyp, const uint8_t **inp, long len) { - EC_KEY *ret = NULL; + EC_KEY *ret = nullptr; - if (keyp == NULL || *keyp == NULL || (*keyp)->group == NULL) { + if (keyp == nullptr || *keyp == nullptr || (*keyp)->group == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); - return NULL; + return nullptr; } ret = *keyp; - if (ret->pub_key == NULL && - (ret->pub_key = EC_POINT_new(ret->group)) == NULL) { - return NULL; + if (ret->pub_key == nullptr && + (ret->pub_key = EC_POINT_new(ret->group)) == nullptr) { + return nullptr; } - if (!EC_POINT_oct2point(ret->group, ret->pub_key, *inp, len, NULL)) { + if (!EC_POINT_oct2point(ret->group, ret->pub_key, *inp, len, nullptr)) { OPENSSL_PUT_ERROR(EC, ERR_R_EC_LIB); - return NULL; + return nullptr; } // save the point conversion form ret->conv_form = (point_conversion_form_t)(*inp[0] & ~0x01); @@ -525,31 +507,29 @@ EC_KEY *o2i_ECPublicKey(EC_KEY **keyp, const uint8_t **inp, long len) { } int i2o_ECPublicKey(const EC_KEY *key, uint8_t **outp) { - if (key == NULL) { + if (key == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); return 0; } - CBB cbb; - if (!CBB_init(&cbb, 0) || // - !EC_POINT_point2cbb(&cbb, key->group, key->pub_key, key->conv_form, - NULL)) { - CBB_cleanup(&cbb); - return -1; - } - int ret = CBB_finish_i2d(&cbb, outp); + // No initial capacity because |EC_POINT_point2cbb| will internally reserve + // the right size in one shot, so it's best to leave this at zero. + int ret = bssl::I2DFromCBB( + /*initial_capacity=*/0, outp, [&](CBB *cbb) -> bool { + return EC_POINT_point2cbb(cbb, key->group, key->pub_key, key->conv_form, + nullptr); + }); // Historically, this function used the wrong return value on error. return ret > 0 ? ret : 0; } size_t EC_get_builtin_curves(EC_builtin_curve *out_curves, size_t max_num_curves) { - if (max_num_curves > OPENSSL_ARRAY_SIZE(kAllGroups)) { - max_num_curves = OPENSSL_ARRAY_SIZE(kAllGroups); - } + auto all = get_all_groups(); + max_num_curves = std::min(all.size(), max_num_curves); for (size_t i = 0; i < max_num_curves; i++) { - const EC_GROUP *group = kAllGroups[i](); + const EC_GROUP *group = all[i]; out_curves[i].nid = group->curve_name; out_curves[i].comment = group->comment; } - return OPENSSL_ARRAY_SIZE(kAllGroups); + return all.size(); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/ec/ec_derive.cc b/naiveproxy/src/third_party/boringssl/src/crypto/ec/ec_derive.cc index 74fbfccbd9..6f6f7865b6 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/ec/ec_derive.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/ec/ec_derive.cc @@ -30,7 +30,7 @@ EC_KEY *EC_KEY_derive_from_secret(const EC_GROUP *group, const uint8_t *secret, size_t secret_len) { #define EC_KEY_DERIVE_MAX_NAME_LEN 16 const char *name = EC_curve_nid2nist(EC_GROUP_get_curve_name(group)); - if (name == NULL || strlen(name) > EC_KEY_DERIVE_MAX_NAME_LEN) { + if (name == nullptr || strlen(name) > EC_KEY_DERIVE_MAX_NAME_LEN) { OPENSSL_PUT_ERROR(EC, EC_R_UNKNOWN_GROUP); return nullptr; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/ec/hash_to_curve.cc b/naiveproxy/src/third_party/boringssl/src/crypto/ec/hash_to_curve.cc index b9601fc3a3..0e98792926 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/ec/hash_to_curve.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/ec/hash_to_curve.cc @@ -33,7 +33,7 @@ // becomes a performance bottleneck, some possible optimizations by // specializing it to the curve: // -// - Rather than using a generic |felem_exp|, specialize the exponentation to +// - Rather than using a generic |felem_exp|, specialize the exponentiation to // c2 with a faster addition chain. // // - |felem_mul| and |felem_sqr| are indirect calls to generic Montgomery @@ -183,6 +183,24 @@ static int hash_to_field2(const EC_GROUP *group, const EVP_MD *md, return 1; } +// hash_to_field1 implements the operation described in section 5.2 +// of RFC 9380, with count = 1. |k| is the security factor. +static int hash_to_field1(const EC_GROUP *group, const EVP_MD *md, + EC_FELEM *out, const uint8_t *dst, size_t dst_len, + unsigned k, const uint8_t *msg, size_t msg_len) { + size_t L; + uint8_t buf[2 * EC_MAX_BYTES]; + if (!num_bytes_to_derive(&L, &group->field.N, k) || + !expand_message_xmd(md, buf, L, msg, msg_len, dst, dst_len)) { + return 0; + } + BN_ULONG words[2 * EC_MAX_WORDS]; + size_t num_words = 2 * group->field.N.width; + big_endian_to_words(words, num_words, buf, L); + group->meth->felem_reduce(group, out, words, num_words); + return 1; +} + // hash_to_scalar behaves like |hash_to_field2| but returns a value modulo the // group order rather than a field element. |k| is the security factor. static int hash_to_scalar(const EC_GROUP *group, const EVP_MD *md, @@ -358,6 +376,28 @@ static int hash_to_curve(const EC_GROUP *group, const EVP_MD *md, return 1; } +static int encode_to_curve(const EC_GROUP *group, const EVP_MD *md, + const EC_FELEM *Z, const EC_FELEM *c2, unsigned k, + EC_JACOBIAN *out, const uint8_t *dst, size_t dst_len, + const uint8_t *msg, size_t msg_len) { + EC_FELEM u; + if (!hash_to_field1(group, md, &u, dst, dst_len, k, msg, msg_len)) { + return 0; + } + + // Compute |c1| = (p - 3) / 4. + BN_ULONG c1[EC_MAX_WORDS]; + size_t num_c1 = group->field.N.width; + if (!bn_copy_words(c1, num_c1, &group->field.N)) { + return 0; + } + bn_rshift_words(c1, c1, /*shift=*/2, /*num=*/num_c1); + + map_to_curve_simple_swu(group, Z, c1, num_c1, c2, out, &u); + // All our curves have cofactor one, so |clear_cofactor| is a no-op. + return 1; +} + static int felem_from_u8(const EC_GROUP *group, EC_FELEM *out, uint8_t a) { uint8_t bytes[EC_MAX_BYTES] = {0}; size_t len = BN_num_bytes(&group->field.N); @@ -415,7 +455,7 @@ int ec_hash_to_curve_p256_xmd_sha256_sswu(const EC_GROUP *group, int EC_hash_to_curve_p256_xmd_sha256_sswu(const EC_GROUP *group, EC_POINT *out, const uint8_t *dst, size_t dst_len, const uint8_t *msg, size_t msg_len) { - if (EC_GROUP_cmp(group, out->group, NULL) != 0) { + if (EC_GROUP_cmp(group, out->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } @@ -448,7 +488,7 @@ int ec_hash_to_curve_p384_xmd_sha384_sswu(const EC_GROUP *group, int EC_hash_to_curve_p384_xmd_sha384_sswu(const EC_GROUP *group, EC_POINT *out, const uint8_t *dst, size_t dst_len, const uint8_t *msg, size_t msg_len) { - if (EC_GROUP_cmp(group, out->group, NULL) != 0) { + if (EC_GROUP_cmp(group, out->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } @@ -456,6 +496,76 @@ int EC_hash_to_curve_p384_xmd_sha384_sswu(const EC_GROUP *group, EC_POINT *out, msg, msg_len); } +int ec_encode_to_curve_p256_xmd_sha256_sswu(const EC_GROUP *group, + EC_JACOBIAN *out, + const uint8_t *dst, size_t dst_len, + const uint8_t *msg, + size_t msg_len) { + // See section 8.3 of RFC 9380. + if (EC_GROUP_get_curve_name(group) != NID_X9_62_prime256v1) { + OPENSSL_PUT_ERROR(EC, EC_R_GROUP_MISMATCH); + return 0; + } + + // Z = -10, c2 = sqrt(10) + EC_FELEM Z, c2; + if (!felem_from_u8(group, &Z, 10) || + !ec_felem_from_bytes(group, &c2, kP256Sqrt10, sizeof(kP256Sqrt10))) { + return 0; + } + ec_felem_neg(group, &Z, &Z); + + return encode_to_curve(group, EVP_sha256(), &Z, &c2, /*k=*/128, out, dst, + dst_len, msg, msg_len); +} + +int EC_encode_to_curve_p256_xmd_sha256_sswu(const EC_GROUP *group, + EC_POINT *out, const uint8_t *dst, + size_t dst_len, const uint8_t *msg, + size_t msg_len) { + if (EC_GROUP_cmp(group, out->group, nullptr) != 0) { + OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); + return 0; + } + return ec_encode_to_curve_p256_xmd_sha256_sswu(group, &out->raw, dst, dst_len, + msg, msg_len); +} + +int ec_encode_to_curve_p384_xmd_sha384_sswu(const EC_GROUP *group, + EC_JACOBIAN *out, + const uint8_t *dst, size_t dst_len, + const uint8_t *msg, + size_t msg_len) { + // See section 8.3 of RFC 9380. + if (EC_GROUP_get_curve_name(group) != NID_secp384r1) { + OPENSSL_PUT_ERROR(EC, EC_R_GROUP_MISMATCH); + return 0; + } + + // Z = -12, c2 = sqrt(12) + EC_FELEM Z, c2; + if (!felem_from_u8(group, &Z, 12) || + !ec_felem_from_bytes(group, &c2, kP384Sqrt12, sizeof(kP384Sqrt12))) { + return 0; + } + ec_felem_neg(group, &Z, &Z); + + return encode_to_curve(group, EVP_sha384(), &Z, &c2, /*k=*/192, out, dst, + dst_len, msg, msg_len); +} + +int EC_encode_to_curve_p384_xmd_sha384_sswu(const EC_GROUP *group, + EC_POINT *out, const uint8_t *dst, + size_t dst_len, const uint8_t *msg, + size_t msg_len) { + if (EC_GROUP_cmp(group, out->group, nullptr) != 0) { + OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); + return 0; + } + return ec_encode_to_curve_p384_xmd_sha384_sswu(group, &out->raw, dst, dst_len, + msg, msg_len); +} + int ec_hash_to_scalar_p384_xmd_sha384(const EC_GROUP *group, EC_SCALAR *out, const uint8_t *dst, size_t dst_len, const uint8_t *msg, size_t msg_len) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/ec/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/ec/internal.h index 8dbe4a7c0c..d3ad220bed 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/ec/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/ec/internal.h @@ -17,6 +17,8 @@ #include +#include + #include "../fipsmodule/ec/internal.h" #if defined(__cplusplus) @@ -24,6 +26,31 @@ extern "C" { #endif +// Parsing functions. + +// ec_key_parse_curve_name behaves like |EC_KEY_parse_curve_name| but only +// supports the groups in |allowed_groups|. If no syntax errors were found but +// the group is unknown, it will fail with an error of |EC_R_UNKNOWN_GROUP|. +const EC_GROUP *ec_key_parse_curve_name( + CBS *cbs, bssl::Span allowed_groups); + +// ec_key_parse_parameters behaves like |EC_KEY_parse_parameters| but only +// supports the groups in |allowed_groups|. If no syntax errors were found but +// the group is unknown, it will fail with an error of |EC_R_UNKNOWN_GROUP|. +const EC_GROUP *ec_key_parse_parameters( + CBS *cbs, bssl::Span allowed_groups); + +// ec_key_parse_private_key behaves like |EC_KEY_parse_private_key| but only +// supports the groups in |allowed_groups|. If |group| is non-NULL, +// |allowed_groups| is ignored and instead only |group| is supported. +// +// TODO(crbug.com/boringssl/414361735): This should return a bssl::UniquePtr, +// but cannot until it is made C++ linkage. +EC_KEY *ec_key_parse_private_key( + CBS *cbs, const EC_GROUP *group, + bssl::Span allowed_groups); + + // Hash-to-curve. // // Internal |EC_JACOBIAN| versions of the corresponding public APIs. @@ -42,6 +69,20 @@ OPENSSL_EXPORT int ec_hash_to_curve_p384_xmd_sha384_sswu( const EC_GROUP *group, EC_JACOBIAN *out, const uint8_t *dst, size_t dst_len, const uint8_t *msg, size_t msg_len); +// ec_encode_to_curve_p256_xmd_sha256_sswu hashes |msg| to a point on |group| +// and writes the result to |out|, implementing the P256_XMD:SHA-256_SSWU_NU_ +// suite from RFC 9380. It returns one on success and zero on error. +OPENSSL_EXPORT int ec_encode_to_curve_p256_xmd_sha256_sswu( + const EC_GROUP *group, EC_JACOBIAN *out, const uint8_t *dst, size_t dst_len, + const uint8_t *msg, size_t msg_len); + +// ec_encode_to_curve_p384_xmd_sha384_sswu hashes |msg| to a point on |group| +// and writes the result to |out|, implementing the P384_XMD:SHA-384_SSWU_NU_ +// suite from RFC 9380. It returns one on success and zero on error. +OPENSSL_EXPORT int ec_encode_to_curve_p384_xmd_sha384_sswu( + const EC_GROUP *group, EC_JACOBIAN *out, const uint8_t *dst, size_t dst_len, + const uint8_t *msg, size_t msg_len); + // ec_hash_to_scalar_p384_xmd_sha384 hashes |msg| to a scalar on |group| // and writes the result to |out|, using the hash_to_field operation from the // P384_XMD:SHA-384_SSWU_RO_ suite from RFC 9380, but generating a value modulo diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/ecdh/ecdh.cc b/naiveproxy/src/third_party/boringssl/src/crypto/ecdh/ecdh.cc index 7305177f08..3d61e609ea 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/ecdh/ecdh.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/ecdh/ecdh.cc @@ -30,13 +30,13 @@ int ECDH_compute_key(void *out, size_t out_len, const EC_POINT *pub_key, const EC_KEY *priv_key, void *(*kdf)(const void *in, size_t inlen, void *out, size_t *out_len)) { - if (priv_key->priv_key == NULL) { + if (priv_key->priv_key == nullptr) { OPENSSL_PUT_ERROR(ECDH, ECDH_R_NO_PRIVATE_VALUE); return -1; } const EC_SCALAR *const priv = &priv_key->priv_key->scalar; const EC_GROUP *const group = EC_KEY_get0_group(priv_key); - if (EC_GROUP_cmp(group, pub_key->group, NULL) != 0) { + if (EC_GROUP_cmp(group, pub_key->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return -1; } @@ -51,8 +51,8 @@ int ECDH_compute_key(void *out, size_t out_len, const EC_POINT *pub_key, return -1; } - if (kdf != NULL) { - if (kdf(buf, buf_len, out, &out_len) == NULL) { + if (kdf != nullptr) { + if (kdf(buf, buf_len, out, &out_len) == nullptr) { OPENSSL_PUT_ERROR(ECDH, ECDH_R_KDF_FAILED); return -1; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/ecdsa/ecdsa_asn1.cc b/naiveproxy/src/third_party/boringssl/src/crypto/ecdsa/ecdsa_asn1.cc index 28d50362ca..98fa520f27 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/ecdsa/ecdsa_asn1.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/ecdsa/ecdsa_asn1.cc @@ -31,20 +31,20 @@ static ECDSA_SIG *ecdsa_sig_from_fixed(const EC_KEY *key, const uint8_t *in, size_t len) { const EC_GROUP *group = EC_KEY_get0_group(key); - if (group == NULL) { + if (group == nullptr) { OPENSSL_PUT_ERROR(ECDSA, ERR_R_PASSED_NULL_PARAMETER); - return NULL; + return nullptr; } size_t scalar_len = BN_num_bytes(EC_GROUP_get0_order(group)); if (len != 2 * scalar_len) { OPENSSL_PUT_ERROR(ECDSA, ECDSA_R_BAD_SIGNATURE); - return NULL; + return nullptr; } ECDSA_SIG *ret = ECDSA_SIG_new(); - if (ret == NULL || !BN_bin2bn(in, scalar_len, ret->r) || + if (ret == nullptr || !BN_bin2bn(in, scalar_len, ret->r) || !BN_bin2bn(in + scalar_len, scalar_len, ret->s)) { ECDSA_SIG_free(ret); - return NULL; + return nullptr; } return ret; } @@ -52,7 +52,7 @@ static ECDSA_SIG *ecdsa_sig_from_fixed(const EC_KEY *key, const uint8_t *in, static int ecdsa_sig_to_fixed(const EC_KEY *key, uint8_t *out, size_t *out_len, size_t max_out, const ECDSA_SIG *sig) { const EC_GROUP *group = EC_KEY_get0_group(key); - if (group == NULL) { + if (group == nullptr) { OPENSSL_PUT_ERROR(ECDSA, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -138,12 +138,12 @@ err: size_t ECDSA_size(const EC_KEY *key) { - if (key == NULL) { + if (key == nullptr) { return 0; } const EC_GROUP *group = EC_KEY_get0_group(key); - if (group == NULL) { + if (group == nullptr) { return 0; } @@ -154,20 +154,20 @@ size_t ECDSA_size(const EC_KEY *key) { ECDSA_SIG *ECDSA_SIG_new(void) { ECDSA_SIG *sig = reinterpret_cast(OPENSSL_malloc(sizeof(ECDSA_SIG))); - if (sig == NULL) { - return NULL; + if (sig == nullptr) { + return nullptr; } sig->r = BN_new(); sig->s = BN_new(); - if (sig->r == NULL || sig->s == NULL) { + if (sig->r == nullptr || sig->s == nullptr) { ECDSA_SIG_free(sig); - return NULL; + return nullptr; } return sig; } void ECDSA_SIG_free(ECDSA_SIG *sig) { - if (sig == NULL) { + if (sig == nullptr) { return; } @@ -182,16 +182,16 @@ const BIGNUM *ECDSA_SIG_get0_s(const ECDSA_SIG *sig) { return sig->s; } void ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **out_r, const BIGNUM **out_s) { - if (out_r != NULL) { + if (out_r != nullptr) { *out_r = sig->r; } - if (out_s != NULL) { + if (out_s != nullptr) { *out_s = sig->s; } } int ECDSA_SIG_set0(ECDSA_SIG *sig, BIGNUM *r, BIGNUM *s) { - if (r == NULL || s == NULL) { + if (r == nullptr || s == nullptr) { return 0; } BN_free(sig->r); @@ -219,7 +219,7 @@ ECDSA_SIG *ECDSA_sign_with_nonce_and_leak_private_key_for_testing( if (!ecdsa_sign_fixed_with_nonce_for_known_answer_test( digest, digest_len, sig, &sig_len, sizeof(sig), eckey, nonce, nonce_len)) { - return NULL; + return nullptr; } return ecdsa_sig_from_fixed(eckey, sig, sig_len); @@ -231,7 +231,7 @@ ECDSA_SIG *ECDSA_do_sign(const uint8_t *digest, size_t digest_len, size_t sig_len; if (!ecdsa_sign_fixed(digest, digest_len, sig, &sig_len, sizeof(sig), eckey)) { - return NULL; + return nullptr; } return ecdsa_sig_from_fixed(eckey, sig, sig_len); @@ -239,8 +239,8 @@ ECDSA_SIG *ECDSA_do_sign(const uint8_t *digest, size_t digest_len, ECDSA_SIG *ECDSA_SIG_parse(CBS *cbs) { ECDSA_SIG *ret = ECDSA_SIG_new(); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } CBS child; if (!CBS_get_asn1(cbs, &child, CBS_ASN1_SEQUENCE) || @@ -248,7 +248,7 @@ ECDSA_SIG *ECDSA_SIG_parse(CBS *cbs) { !BN_parse_asn1_unsigned(&child, ret->s) || CBS_len(&child) != 0) { OPENSSL_PUT_ERROR(ECDSA, ECDSA_R_BAD_SIGNATURE); ECDSA_SIG_free(ret); - return NULL; + return nullptr; } return ret; } @@ -257,10 +257,10 @@ ECDSA_SIG *ECDSA_SIG_from_bytes(const uint8_t *in, size_t in_len) { CBS cbs; CBS_init(&cbs, in, in_len); ECDSA_SIG *ret = ECDSA_SIG_parse(&cbs); - if (ret == NULL || CBS_len(&cbs) != 0) { + if (ret == nullptr || CBS_len(&cbs) != 0) { OPENSSL_PUT_ERROR(ECDSA, ECDSA_R_BAD_SIGNATURE); ECDSA_SIG_free(ret); - return NULL; + return nullptr; } return ret; } @@ -324,28 +324,11 @@ size_t ECDSA_SIG_max_len(size_t order_len) { } ECDSA_SIG *d2i_ECDSA_SIG(ECDSA_SIG **out, const uint8_t **inp, long len) { - if (len < 0) { - return NULL; - } - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - ECDSA_SIG *ret = ECDSA_SIG_parse(&cbs); - if (ret == NULL) { - return NULL; - } - if (out != NULL) { - ECDSA_SIG_free(*out); - *out = ret; - } - *inp = CBS_data(&cbs); - return ret; + return bssl::D2IFromCBS(out, inp, len, ECDSA_SIG_parse); } int i2d_ECDSA_SIG(const ECDSA_SIG *sig, uint8_t **outp) { - CBB cbb; - if (!CBB_init(&cbb, 0) || !ECDSA_SIG_marshal(&cbb, sig)) { - CBB_cleanup(&cbb); - return -1; - } - return CBB_finish_i2d(&cbb, outp); + return bssl::I2DFromCBB( + /*initial_capacity=*/64, outp, + [&](CBB *cbb) -> bool { return ECDSA_SIG_marshal(cbb, sig); }); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/ecdsa/ecdsa_p1363.cc b/naiveproxy/src/third_party/boringssl/src/crypto/ecdsa/ecdsa_p1363.cc index 3617468e9d..2913df3823 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/ecdsa/ecdsa_p1363.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/ecdsa/ecdsa_p1363.cc @@ -38,12 +38,12 @@ int ECDSA_verify_p1363(const uint8_t *digest, size_t digest_len, } size_t ECDSA_size_p1363(const EC_KEY *key) { - if (key == NULL) { + if (key == nullptr) { return 0; } const EC_GROUP *group = EC_KEY_get0_group(key); - if (group == NULL) { + if (group == nullptr) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/engine/engine.cc b/naiveproxy/src/third_party/boringssl/src/crypto/engine/engine.cc index 3f207badfb..06b3692f66 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/engine/engine.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/engine/engine.cc @@ -85,7 +85,7 @@ void METHOD_unref(void *method_in) { struct openssl_method_common_st *method = reinterpret_cast(method_in); - if (method == NULL) { + if (method == nullptr) { return; } assert(method->is_static); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/err/err.cc b/naiveproxy/src/third_party/boringssl/src/crypto/err/err.cc index 64caf27cff..ab7bf56078 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/err/err.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/err/err.cc @@ -74,7 +74,7 @@ static char *strdup_libc_malloc(const char *str) { // glibc and musl gate it on a feature macro. Reimplementing it is easier. size_t len = strlen(str); char *ret = reinterpret_cast(malloc(len + 1)); - if (ret != NULL) { + if (ret != nullptr) { memcpy(ret, str, len + 1); } return ret; @@ -89,7 +89,7 @@ static void err_clear(struct err_error_st *error) { static void err_copy(struct err_error_st *dst, const struct err_error_st *src) { err_clear(dst); dst->file = src->file; - if (src->data != NULL) { + if (src->data != nullptr) { // We can't use OPENSSL_strdup because we don't want to call OPENSSL_malloc, // which can affect the error stack. dst->data = strdup_libc_malloc(src->data); @@ -109,7 +109,7 @@ static CRYPTO_MUTEX global_next_library_mutex = CRYPTO_MUTEX_INIT; static void err_state_free(void *statep) { ERR_STATE *state = reinterpret_cast(statep); - if (state == NULL) { + if (state == nullptr) { return; } @@ -124,15 +124,15 @@ static void err_state_free(void *statep) { static ERR_STATE *err_get_state(void) { ERR_STATE *state = reinterpret_cast( CRYPTO_get_thread_local(OPENSSL_THREAD_LOCAL_ERR)); - if (state == NULL) { + if (state == nullptr) { state = reinterpret_cast(malloc(sizeof(ERR_STATE))); - if (state == NULL) { - return NULL; + if (state == nullptr) { + return nullptr; } OPENSSL_memset(state, 0, sizeof(ERR_STATE)); if (!CRYPTO_set_thread_local(OPENSSL_THREAD_LOCAL_ERR, state, err_state_free)) { - return NULL; + return nullptr; } } @@ -147,7 +147,7 @@ static uint32_t get_error_values(int inc, int top, const char **file, int *line, uint32_t ret; state = err_get_state(); - if (state == NULL || state->bottom == state->top) { + if (state == nullptr || state->bottom == state->top) { return 0; } @@ -162,8 +162,8 @@ static uint32_t get_error_values(int inc, int top, const char **file, int *line, error = &state->errors[i]; ret = error->packed; - if (file != NULL && line != NULL) { - if (error->file == NULL) { + if (file != nullptr && line != nullptr) { + if (error->file == nullptr) { *file = "NA"; *line = 0; } else { @@ -172,15 +172,15 @@ static uint32_t get_error_values(int inc, int top, const char **file, int *line, } } - if (data != NULL) { - if (error->data == NULL) { + if (data != nullptr) { + if (error->data == nullptr) { *data = ""; - if (flags != NULL) { + if (flags != nullptr) { *flags = 0; } } else { *data = error->data; - if (flags != NULL) { + if (flags != nullptr) { // Without |ERR_FLAG_MALLOCED|, rust-openssl assumes the string has a // static lifetime. In both cases, we retain ownership of the string, // and the caller is not expected to free it. @@ -192,11 +192,11 @@ static uint32_t get_error_values(int inc, int top, const char **file, int *line, // ownership and retains it until the next call that affects the // error queue. if (inc) { - if (error->data != NULL) { + if (error->data != nullptr) { free(state->to_free); state->to_free = error->data; } - error->data = NULL; + error->data = nullptr; } } } @@ -211,11 +211,13 @@ static uint32_t get_error_values(int inc, int top, const char **file, int *line, } uint32_t ERR_get_error(void) { - return get_error_values(1 /* inc */, 0 /* bottom */, NULL, NULL, NULL, NULL); + return get_error_values(1 /* inc */, 0 /* bottom */, nullptr, nullptr, + nullptr, nullptr); } uint32_t ERR_get_error_line(const char **file, int *line) { - return get_error_values(1 /* inc */, 0 /* bottom */, file, line, NULL, NULL); + return get_error_values(1 /* inc */, 0 /* bottom */, file, line, nullptr, + nullptr); } uint32_t ERR_get_error_line_data(const char **file, int *line, @@ -224,11 +226,13 @@ uint32_t ERR_get_error_line_data(const char **file, int *line, } uint32_t ERR_peek_error(void) { - return get_error_values(0 /* peek */, 0 /* bottom */, NULL, NULL, NULL, NULL); + return get_error_values(0 /* peek */, 0 /* bottom */, nullptr, nullptr, + nullptr, nullptr); } uint32_t ERR_peek_error_line(const char **file, int *line) { - return get_error_values(0 /* peek */, 0 /* bottom */, file, line, NULL, NULL); + return get_error_values(0 /* peek */, 0 /* bottom */, file, line, nullptr, + nullptr); } uint32_t ERR_peek_error_line_data(const char **file, int *line, @@ -238,11 +242,13 @@ uint32_t ERR_peek_error_line_data(const char **file, int *line, } uint32_t ERR_peek_last_error(void) { - return get_error_values(0 /* peek */, 1 /* top */, NULL, NULL, NULL, NULL); + return get_error_values(0 /* peek */, 1 /* top */, nullptr, nullptr, nullptr, + nullptr); } uint32_t ERR_peek_last_error_line(const char **file, int *line) { - return get_error_values(0 /* peek */, 1 /* top */, file, line, NULL, NULL); + return get_error_values(0 /* peek */, 1 /* top */, file, line, nullptr, + nullptr); } uint32_t ERR_peek_last_error_line_data(const char **file, int *line, @@ -254,7 +260,7 @@ void ERR_clear_error(void) { ERR_STATE *const state = err_get_state(); unsigned i; - if (state == NULL) { + if (state == nullptr) { return; } @@ -262,13 +268,13 @@ void ERR_clear_error(void) { err_clear(&state->errors[i]); } free(state->to_free); - state->to_free = NULL; + state->to_free = nullptr; state->top = state->bottom = 0; } void ERR_remove_thread_state(const CRYPTO_THREADID *tid) { - if (tid != NULL) { + if (tid != nullptr) { assert(0); return; } @@ -324,13 +330,13 @@ static const char *err_string_lookup(uint32_t lib, uint32_t key, // Values are sorted based on treating the |lib| and |key| part as an // unsigned integer. if (lib >= (1 << 6) || key >= (1 << 11)) { - return NULL; + return nullptr; } uint32_t search_key = lib << 26 | key << 15; const uint32_t *result = reinterpret_cast(bsearch( &search_key, values, num_values, sizeof(uint32_t), err_string_cmp)); - if (result == NULL) { - return NULL; + if (result == nullptr) { + return nullptr; } return &string_data[(*result) & 0x7fff]; @@ -345,7 +351,7 @@ typedef struct library_name_st { } // namespace static const LIBRARY_NAME kLibraryNames[ERR_NUM_LIBS] = { - {"invalid library (0)", NULL, NULL}, + {"invalid library (0)", nullptr, nullptr}, {"unknown library", "NONE", "NONE_LIB"}, {"system library", "SYS", "SYS_LIB"}, {"bignum routines", "BN", "BN_LIB"}, @@ -383,17 +389,17 @@ static const LIBRARY_NAME kLibraryNames[ERR_NUM_LIBS] = { static const char *err_lib_error_string(uint32_t packed_error) { const uint32_t lib = ERR_GET_LIB(packed_error); - return lib >= ERR_NUM_LIBS ? NULL : kLibraryNames[lib].str; + return lib >= ERR_NUM_LIBS ? nullptr : kLibraryNames[lib].str; } const char *ERR_lib_error_string(uint32_t packed_error) { const char *ret = err_lib_error_string(packed_error); - return ret == NULL ? "unknown library" : ret; + return ret == nullptr ? "unknown library" : ret; } const char *ERR_lib_symbol_name(uint32_t packed_error) { const uint32_t lib = ERR_GET_LIB(packed_error); - return lib >= ERR_NUM_LIBS ? NULL : kLibraryNames[lib].symbol; + return lib >= ERR_NUM_LIBS ? nullptr : kLibraryNames[lib].symbol; } const char *ERR_func_error_string(uint32_t packed_error) { @@ -408,7 +414,7 @@ static const char *err_reason_error_string(uint32_t packed_error, int symbol) { if (!symbol && reason < 127) { return strerror(reason); } - return NULL; + return nullptr; } if (reason < ERR_NUM_LIBS) { @@ -433,7 +439,7 @@ static const char *err_reason_error_string(uint32_t packed_error, int symbol) { case ERR_R_OVERFLOW: return symbol ? "OVERFLOW" : "overflow"; default: - return NULL; + return nullptr; } } @@ -445,7 +451,7 @@ static const char *err_reason_error_string(uint32_t packed_error, int symbol) { const char *ERR_reason_error_string(uint32_t packed_error) { const char *ret = err_reason_error_string(packed_error, /*symbol=*/0); - return ret == NULL ? "unknown error" : ret; + return ret == nullptr ? "unknown error" : ret; } const char *ERR_reason_symbol_name(uint32_t packed_error) { @@ -455,7 +461,7 @@ const char *ERR_reason_symbol_name(uint32_t packed_error) { char *ERR_error_string(uint32_t packed_error, char *ret) { static char buf[ERR_ERROR_STRING_BUF_LEN]; - if (ret == NULL) { + if (ret == nullptr) { // TODO(fork): remove this. ret = buf; } @@ -471,7 +477,7 @@ char *ERR_error_string(uint32_t packed_error, char *ret) { char *ERR_error_string_n(uint32_t packed_error, char *buf, size_t len) { if (len == 0) { - return NULL; + return nullptr; } unsigned lib = ERR_GET_LIB(packed_error); @@ -481,12 +487,12 @@ char *ERR_error_string_n(uint32_t packed_error, char *buf, size_t len) { const char *reason_str = err_reason_error_string(packed_error, /*symbol=*/0); char lib_buf[32], reason_buf[32]; - if (lib_str == NULL) { + if (lib_str == nullptr) { snprintf(lib_buf, sizeof(lib_buf), "lib(%u)", lib); lib_str = lib_buf; } - if (reason_str == NULL) { + if (reason_str == nullptr) { snprintf(reason_buf, sizeof(reason_buf), "reason(%u)", reason); reason_str = reason_buf; } @@ -510,7 +516,7 @@ char *ERR_error_string_n(uint32_t packed_error, char *buf, size_t len) { char *colon = strchr(s, ':'); char *last_pos = &buf[len - 1] - num_colons + i; - if (colon == NULL || colon > last_pos) { + if (colon == nullptr || colon > last_pos) { // set colon |i| at last possible position (buf[len-1] is the // terminating 0). If we're setting this colon, then all whole of the // rest of the string must be colons in order to have the correct @@ -568,7 +574,7 @@ static void err_set_error_data(char *data) { ERR_STATE *const state = err_get_state(); struct err_error_st *error; - if (state == NULL || state->top == state->bottom) { + if (state == nullptr || state->top == state->bottom) { free(data); return; } @@ -584,7 +590,7 @@ void ERR_put_error(int library, int unused, int reason, const char *file, ERR_STATE *const state = err_get_state(); struct err_error_st *error; - if (state == NULL) { + if (state == nullptr) { return; } @@ -620,7 +626,7 @@ static void err_add_error_vdata(unsigned num, va_list args) { va_copy(args_copy, args); for (size_t i = 0; i < num; i++) { substr = va_arg(args_copy, const char *); - if (substr == NULL) { + if (substr == nullptr) { continue; } size_t substr_len = strlen(substr); @@ -634,13 +640,13 @@ static void err_add_error_vdata(unsigned num, va_list args) { return; // Would overflow. } total_size += 1; // NUL terminator. - if ((buf = reinterpret_cast(malloc(total_size))) == NULL) { + if ((buf = reinterpret_cast(malloc(total_size))) == nullptr) { return; } buf[0] = '\0'; for (size_t i = 0; i < num; i++) { substr = va_arg(args, const char *); - if (substr == NULL) { + if (substr == nullptr) { continue; } if (OPENSSL_strlcat(buf, substr, total_size) >= total_size) { @@ -658,7 +664,7 @@ void ERR_add_error_data(unsigned count, ...) { } void ERR_add_error_dataf(const char *format, ...) { - char *buf = NULL; + char *buf = nullptr; va_list ap; va_start(ap, format); @@ -679,7 +685,7 @@ void ERR_set_error_data(char *data, int flags) { // We can not use OPENSSL_strdup because we don't want to call OPENSSL_malloc, // which can affect the error stack. char *copy = strdup_libc_malloc(data); - if (copy != NULL) { + if (copy != nullptr) { err_set_error_data(copy); } if (flags & ERR_FLAG_MALLOCED) { @@ -692,7 +698,7 @@ void ERR_set_error_data(char *data, int flags) { int ERR_set_mark(void) { ERR_STATE *const state = err_get_state(); - if (state == NULL || state->bottom == state->top) { + if (state == nullptr || state->bottom == state->top) { return 0; } state->errors[state->top].mark = 1; @@ -702,7 +708,7 @@ int ERR_set_mark(void) { int ERR_pop_to_mark(void) { ERR_STATE *const state = err_get_state(); - if (state == NULL) { + if (state == nullptr) { return 0; } @@ -741,7 +747,7 @@ struct err_save_state_st { }; void ERR_SAVE_STATE_free(ERR_SAVE_STATE *state) { - if (state == NULL) { + if (state == nullptr) { return; } for (size_t i = 0; i < state->num_errors; i++) { @@ -753,14 +759,14 @@ void ERR_SAVE_STATE_free(ERR_SAVE_STATE *state) { ERR_SAVE_STATE *ERR_save_state(void) { ERR_STATE *const state = err_get_state(); - if (state == NULL || state->top == state->bottom) { - return NULL; + if (state == nullptr || state->top == state->bottom) { + return nullptr; } ERR_SAVE_STATE *ret = reinterpret_cast(malloc(sizeof(ERR_SAVE_STATE))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } // Errors are stored in the range (bottom, top]. @@ -770,9 +776,9 @@ ERR_SAVE_STATE *ERR_save_state(void) { assert(num_errors < ERR_NUM_ERRORS); ret->errors = reinterpret_cast( malloc(num_errors * sizeof(struct err_error_st))); - if (ret->errors == NULL) { + if (ret->errors == nullptr) { free(ret); - return NULL; + return nullptr; } OPENSSL_memset(ret->errors, 0, num_errors * sizeof(struct err_error_st)); ret->num_errors = num_errors; @@ -785,7 +791,7 @@ ERR_SAVE_STATE *ERR_save_state(void) { } void ERR_restore_state(const ERR_SAVE_STATE *state) { - if (state == NULL || state->num_errors == 0) { + if (state == nullptr || state->num_errors == 0) { ERR_clear_error(); return; } @@ -795,7 +801,7 @@ void ERR_restore_state(const ERR_SAVE_STATE *state) { } ERR_STATE *const dst = err_get_state(); - if (dst == NULL) { + if (dst == nullptr) { return; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/err/evp.errordata b/naiveproxy/src/third_party/boringssl/src/crypto/err/evp.errordata index f65b7b0a88..cd2c84f050 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/err/evp.errordata +++ b/naiveproxy/src/third_party/boringssl/src/crypto/err/evp.errordata @@ -5,10 +5,10 @@ EVP,103,DIFFERENT_KEY_TYPES EVP,104,DIFFERENT_PARAMETERS EVP,136,EMPTY_PSK EVP,105,ENCODE_ERROR -EVP,106,EXPECTING_AN_EC_KEY_KEY EVP,107,EXPECTING_AN_RSA_KEY EVP,138,EXPECTING_A_DH_KEY EVP,108,EXPECTING_A_DSA_KEY +EVP,106,EXPECTING_A_EC_KEY EVP,109,ILLEGAL_OR_UNSUPPORTED_PADDING_MODE EVP,137,INVALID_BUFFER_SIZE EVP,110,INVALID_DIGEST_LENGTH @@ -34,6 +34,7 @@ EVP,123,NO_OPERATION_SET EVP,124,NO_PARAMETERS_SET EVP,125,OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE EVP,126,OPERATON_NOT_INITIALIZED +EVP,139,PRIVATE_KEY_WAS_NOT_SEED EVP,127,UNKNOWN_PUBLIC_KEY_TYPE EVP,128,UNSUPPORTED_ALGORITHM EVP,129,UNSUPPORTED_PUBLIC_KEY_TYPE diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/err/ssl.errordata b/naiveproxy/src/third_party/boringssl/src/crypto/err/ssl.errordata index 7d77cfdcd5..01c4ca616f 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/err/ssl.errordata +++ b/naiveproxy/src/third_party/boringssl/src/crypto/err/ssl.errordata @@ -54,6 +54,7 @@ SSL,142,DIGEST_CHECK_FAILED SSL,254,DOWNGRADE_DETECTED SSL,143,DTLS_MESSAGE_TOO_BIG SSL,257,DUPLICATE_EXTENSION +SSL,330,DUPLICATE_GROUP SSL,264,DUPLICATE_KEY_SHARE SSL,296,DUPLICATE_SIGNATURE_ALGORITHM SSL,283,EARLY_DATA_NOT_IN_USE @@ -83,6 +84,7 @@ SSL,321,INCONSISTENT_ECH_NEGOTIATION SSL,259,INVALID_ALPN_PROTOCOL SSL,315,INVALID_ALPN_PROTOCOL_LIST SSL,322,INVALID_ALPS_CODEPOINT +SSL,329,INVALID_CERTIFICATE_PROPERTY_LIST SSL,314,INVALID_CLIENT_HELLO_INNER SSL,158,INVALID_COMMAND SSL,256,INVALID_COMPRESSION_LIST @@ -97,6 +99,7 @@ SSL,295,INVALID_SIGNATURE_ALGORITHM SSL,324,INVALID_SPAKE2PLUSV1_VALUE SSL,160,INVALID_SSL_SESSION SSL,161,INVALID_TICKET_KEYS_LENGTH +SSL,328,INVALID_TRUST_ANCHOR_LIST SSL,302,KEY_USAGE_BIT_INCORRECT SSL,162,LENGTH_MISMATCH SSL,164,MISSING_EXTENSION @@ -243,8 +246,6 @@ SSL,236,UNSAFE_LEGACY_RENEGOTIATION_DISABLED SSL,237,UNSUPPORTED_CIPHER SSL,238,UNSUPPORTED_COMPRESSION_ALGORITHM SSL,327,UNSUPPORTED_CREDENTIAL_LIST -SSL,328,INVALID_TRUST_ANCHOR_LIST -SSL,329,INVALID_CERTIFICATE_PROPERTY_LIST SSL,312,UNSUPPORTED_ECH_SERVER_CONFIG SSL,239,UNSUPPORTED_ELLIPTIC_CURVE SSL,240,UNSUPPORTED_PROTOCOL diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/evp.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/evp.cc index 82a98dda5c..f08aff0f11 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/evp.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/evp.cc @@ -37,25 +37,16 @@ OPENSSL_DECLARE_ERROR_REASON(EVP, EMPTY_PSK) EVP_PKEY *EVP_PKEY_new(void) { EVP_PKEY *ret = reinterpret_cast(OPENSSL_zalloc(sizeof(EVP_PKEY))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } - ret->type = EVP_PKEY_NONE; ret->references = 1; return ret; } -static void free_it(EVP_PKEY *pkey) { - if (pkey->ameth && pkey->ameth->pkey_free) { - pkey->ameth->pkey_free(pkey); - pkey->pkey = NULL; - pkey->type = EVP_PKEY_NONE; - } -} - void EVP_PKEY_free(EVP_PKEY *pkey) { - if (pkey == NULL) { + if (pkey == nullptr) { return; } @@ -63,7 +54,7 @@ void EVP_PKEY_free(EVP_PKEY *pkey) { return; } - free_it(pkey); + evp_pkey_set0(pkey, nullptr, nullptr); OPENSSL_free(pkey); } @@ -80,7 +71,7 @@ int EVP_PKEY_is_opaque(const EVP_PKEY *pkey) { } int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { - if (a->type != b->type) { + if (EVP_PKEY_id(a) != EVP_PKEY_id(b)) { return -1; } @@ -103,9 +94,13 @@ int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { } int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) { - if (to->type == EVP_PKEY_NONE) { - evp_pkey_set_method(to, from->ameth); - } else if (to->type != from->type) { + if (EVP_PKEY_id(to) == EVP_PKEY_NONE) { + // TODO(crbug.com/42290409): This shouldn't leave |to| in a half-empty state + // on error. The complexity here largely comes from parameterless DSA keys, + // which we no longer support, so this function can probably be trimmed + // down. + evp_pkey_set0(to, from->ameth, nullptr); + } else if (EVP_PKEY_id(to) != EVP_PKEY_id(from)) { OPENSSL_PUT_ERROR(EVP, EVP_R_DIFFERENT_KEY_TYPES); return 0; } @@ -128,8 +123,9 @@ int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) { return from->ameth->param_copy(to, from); } - // TODO(https://crbug.com/boringssl/536): If the algorithm takes no - // parameters, copying them should vacuously succeed. + // TODO(https://crbug.com/42290406): If the algorithm takes no parameters, + // copying them should vacuously succeed. Better yet, simplify this whole + // notion of parameter copying above. return 0; } @@ -154,32 +150,17 @@ int EVP_PKEY_bits(const EVP_PKEY *pkey) { return 0; } -int EVP_PKEY_id(const EVP_PKEY *pkey) { return pkey->type; } - -// evp_pkey_asn1_find returns the ASN.1 method table for the given |nid|, which -// should be one of the |EVP_PKEY_*| values. It returns NULL if |nid| is -// unknown. -static const EVP_PKEY_ASN1_METHOD *evp_pkey_asn1_find(int nid) { - switch (nid) { - case EVP_PKEY_RSA: - return &rsa_asn1_meth; - case EVP_PKEY_EC: - return &ec_asn1_meth; - case EVP_PKEY_DSA: - return &dsa_asn1_meth; - case EVP_PKEY_ED25519: - return &ed25519_asn1_meth; - case EVP_PKEY_X25519: - return &x25519_asn1_meth; - default: - return NULL; - } +int EVP_PKEY_id(const EVP_PKEY *pkey) { + return pkey->ameth != nullptr ? pkey->ameth->pkey_id : EVP_PKEY_NONE; } -void evp_pkey_set_method(EVP_PKEY *pkey, const EVP_PKEY_ASN1_METHOD *method) { - free_it(pkey); +void evp_pkey_set0(EVP_PKEY *pkey, const EVP_PKEY_ASN1_METHOD *method, + void *pkey_data) { + if (pkey->ameth && pkey->ameth->pkey_free) { + pkey->ameth->pkey_free(pkey); + } pkey->ameth = method; - pkey->type = pkey->ameth->pkey_id; + pkey->pkey = pkey_data; } int EVP_PKEY_type(int nid) { @@ -210,89 +191,103 @@ int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key) { int EVP_PKEY_set_type(EVP_PKEY *pkey, int type) { if (pkey && pkey->pkey) { - // This isn't strictly necessary, but historically |EVP_PKEY_set_type| would - // clear |pkey| even if |evp_pkey_asn1_find| failed, so we preserve that - // behavior. - free_it(pkey); + // Some callers rely on |pkey| getting cleared even if |type| is + // unsupported, usually setting |type| to |EVP_PKEY_NONE|. + evp_pkey_set0(pkey, nullptr, nullptr); } - const EVP_PKEY_ASN1_METHOD *ameth = evp_pkey_asn1_find(type); - if (ameth == NULL) { + // This function broadly isn't useful. It initializes |EVP_PKEY| for a type, + // but forgets to put anything in the |pkey|. The one pattern where it does + // anything is |EVP_PKEY_X25519|, where it's needed to make + // |EVP_PKEY_set1_tls_encodedpoint| work, so we support only that. + const EVP_PKEY_ALG *alg; + if (type == EVP_PKEY_X25519) { + alg = EVP_pkey_x25519(); + } else { OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); ERR_add_error_dataf("algorithm %d", type); return 0; } if (pkey) { - evp_pkey_set_method(pkey, ameth); + evp_pkey_set0(pkey, alg->method, nullptr); } return 1; } +EVP_PKEY *EVP_PKEY_from_raw_private_key(const EVP_PKEY_ALG *alg, + const uint8_t *in, size_t len) { + if (alg->method->set_priv_raw == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); + return nullptr; + } + bssl::UniquePtr ret(EVP_PKEY_new()); + if (ret == nullptr || !alg->method->set_priv_raw(ret.get(), in, len)) { + return nullptr; + } + return ret.release(); +} + +EVP_PKEY *EVP_PKEY_from_private_seed(const EVP_PKEY_ALG *alg, const uint8_t *in, + size_t len) { + if (alg->method->set_priv_seed == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); + return nullptr; + } + bssl::UniquePtr ret(EVP_PKEY_new()); + if (ret == nullptr || !alg->method->set_priv_seed(ret.get(), in, len)) { + return nullptr; + } + return ret.release(); +} + +EVP_PKEY *EVP_PKEY_from_raw_public_key(const EVP_PKEY_ALG *alg, + const uint8_t *in, size_t len) { + if (alg->method->set_pub_raw == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); + return nullptr; + } + bssl::UniquePtr ret(EVP_PKEY_new()); + if (ret == nullptr || !alg->method->set_pub_raw(ret.get(), in, len)) { + return nullptr; + } + return ret.release(); +} + EVP_PKEY *EVP_PKEY_new_raw_private_key(int type, ENGINE *unused, const uint8_t *in, size_t len) { // To avoid pulling in all key types, look for specifically the key types that // support |set_priv_raw|. - const EVP_PKEY_ASN1_METHOD *method; switch (type) { case EVP_PKEY_X25519: - method = &x25519_asn1_meth; - break; + return EVP_PKEY_from_raw_private_key(EVP_pkey_x25519(), in, len); case EVP_PKEY_ED25519: - method = &ed25519_asn1_meth; - break; + return EVP_PKEY_from_raw_private_key(EVP_pkey_ed25519(), in, len); default: OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); return nullptr; } - - bssl::UniquePtr ret(EVP_PKEY_new()); - if (ret == nullptr) { - return nullptr; - } - evp_pkey_set_method(ret.get(), method); - - if (!ret->ameth->set_priv_raw(ret.get(), in, len)) { - return nullptr; - } - - return ret.release(); } EVP_PKEY *EVP_PKEY_new_raw_public_key(int type, ENGINE *unused, const uint8_t *in, size_t len) { // To avoid pulling in all key types, look for specifically the key types that // support |set_pub_raw|. - const EVP_PKEY_ASN1_METHOD *method; switch (type) { case EVP_PKEY_X25519: - method = &x25519_asn1_meth; - break; + return EVP_PKEY_from_raw_public_key(EVP_pkey_x25519(), in, len); case EVP_PKEY_ED25519: - method = &ed25519_asn1_meth; - break; + return EVP_PKEY_from_raw_public_key(EVP_pkey_ed25519(), in, len); default: OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); return nullptr; } - - bssl::UniquePtr ret(EVP_PKEY_new()); - if (ret == nullptr) { - return nullptr; - } - evp_pkey_set_method(ret.get(), method); - - if (!ret->ameth->set_pub_raw(ret.get(), in, len)) { - return nullptr; - } - - return ret.release(); } int EVP_PKEY_get_raw_private_key(const EVP_PKEY *pkey, uint8_t *out, size_t *out_len) { - if (pkey->ameth->get_priv_raw == NULL) { + if (pkey->ameth->get_priv_raw == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); return 0; } @@ -300,9 +295,19 @@ int EVP_PKEY_get_raw_private_key(const EVP_PKEY *pkey, uint8_t *out, return pkey->ameth->get_priv_raw(pkey, out, out_len); } +int EVP_PKEY_get_private_seed(const EVP_PKEY *pkey, uint8_t *out, + size_t *out_len) { + if (pkey->ameth->get_priv_seed == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); + return 0; + } + + return pkey->ameth->get_priv_seed(pkey, out, out_len); +} + int EVP_PKEY_get_raw_public_key(const EVP_PKEY *pkey, uint8_t *out, size_t *out_len) { - if (pkey->ameth->get_pub_raw == NULL) { + if (pkey->ameth->get_pub_raw == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); return 0; } @@ -311,7 +316,7 @@ int EVP_PKEY_get_raw_public_key(const EVP_PKEY *pkey, uint8_t *out, } int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b) { - if (a->type != b->type) { + if (EVP_PKEY_id(a) != EVP_PKEY_id(b)) { return -1; } if (a->ameth && a->ameth->param_cmp) { @@ -338,7 +343,7 @@ void *EVP_PKEY_get0(const EVP_PKEY *pkey) { // rather than reading |pkey->pkey| directly. This avoids problems if our // internal representation does not match the type the caller expects from // OpenSSL. - return NULL; + return nullptr; } void OpenSSL_add_all_algorithms(void) {} @@ -353,7 +358,7 @@ void EVP_cleanup(void) {} int EVP_PKEY_set1_tls_encodedpoint(EVP_PKEY *pkey, const uint8_t *in, size_t len) { - if (pkey->ameth->set1_tls_encodedpoint == NULL) { + if (pkey->ameth->set1_tls_encodedpoint == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); return 0; } @@ -362,7 +367,7 @@ int EVP_PKEY_set1_tls_encodedpoint(EVP_PKEY *pkey, const uint8_t *in, } size_t EVP_PKEY_get1_tls_encodedpoint(const EVP_PKEY *pkey, uint8_t **out_ptr) { - if (pkey->ameth->get1_tls_encodedpoint == NULL) { + if (pkey->ameth->get1_tls_encodedpoint == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/evp_asn1.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/evp_asn1.cc index d77a3d2b95..4bd85241a4 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/evp_asn1.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/evp_asn1.cc @@ -16,88 +16,72 @@ #include +#include + #include #include #include #include #include +#include #include "internal.h" #include "../bytestring/internal.h" #include "../internal.h" -// We intentionally omit |dh_asn1_meth| from this list. It is not serializable. -static const EVP_PKEY_ASN1_METHOD *const kASN1Methods[] = { - &rsa_asn1_meth, - &ec_asn1_meth, - &dsa_asn1_meth, - &ed25519_asn1_meth, - &x25519_asn1_meth, -}; - -static const EVP_PKEY_ASN1_METHOD *parse_key_type(CBS *cbs) { - CBS oid; - if (!CBS_get_asn1(cbs, &oid, CBS_ASN1_OBJECT)) { - return NULL; - } - - for (unsigned i = 0; i < OPENSSL_ARRAY_SIZE(kASN1Methods); i++) { - const EVP_PKEY_ASN1_METHOD *method = kASN1Methods[i]; - if (CBS_len(&oid) == method->oid_len && - OPENSSL_memcmp(CBS_data(&oid), method->oid, method->oid_len) == 0) { - return method; - } - } - - return NULL; -} - -EVP_PKEY *EVP_parse_public_key(CBS *cbs) { +EVP_PKEY *EVP_PKEY_from_subject_public_key_info(const uint8_t *in, size_t len, + const EVP_PKEY_ALG *const *algs, + size_t num_algs) { // Parse the SubjectPublicKeyInfo. - CBS spki, algorithm, key; - uint8_t padding; - if (!CBS_get_asn1(cbs, &spki, CBS_ASN1_SEQUENCE) || + CBS cbs, spki, algorithm, oid, key; + CBS_init(&cbs, in, len); + if (!CBS_get_asn1(&cbs, &spki, CBS_ASN1_SEQUENCE) || !CBS_get_asn1(&spki, &algorithm, CBS_ASN1_SEQUENCE) || + !CBS_get_asn1(&algorithm, &oid, CBS_ASN1_OBJECT) || !CBS_get_asn1(&spki, &key, CBS_ASN1_BITSTRING) || - CBS_len(&spki) != 0) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return nullptr; - } - const EVP_PKEY_ASN1_METHOD *method = parse_key_type(&algorithm); - if (method == nullptr) { - OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); - return nullptr; - } - if (// Every key type defined encodes the key as a byte string with the same - // conversion to BIT STRING. - !CBS_get_u8(&key, &padding) || - padding != 0) { + CBS_len(&spki) != 0 || // + CBS_len(&cbs) != 0) { OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); return nullptr; } - // Set up an |EVP_PKEY| of the appropriate type. bssl::UniquePtr ret(EVP_PKEY_new()); if (ret == nullptr) { return nullptr; } - evp_pkey_set_method(ret.get(), method); - - // Call into the type-specific SPKI decoding function. - if (ret->ameth->pub_decode == nullptr) { - OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); - return nullptr; - } - if (!ret->ameth->pub_decode(ret.get(), &algorithm, &key)) { - return nullptr; + for (const EVP_PKEY_ALG *alg : bssl::Span(algs, num_algs)) { + if (alg->method->pub_decode == nullptr || + bssl::Span(alg->method->oid, alg->method->oid_len) != oid) { + continue; + } + // Every key type we support encodes the key as a byte string with the same + // conversion to BIT STRING, so perform that common conversion ahead of + // time, but only after the OID is recognized as supported. + CBS key_bytes = key; + uint8_t padding; + if (!CBS_get_u8(&key_bytes, &padding) || padding != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return nullptr; + } + CBS params = algorithm; + switch (alg->method->pub_decode(alg, ret.get(), ¶ms, &key_bytes)) { + case evp_decode_error: + return nullptr; + case evp_decode_ok: + return ret.release(); + case evp_decode_unsupported: + // Continue trying other algorithms. + break; + } } - return ret.release(); + OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); + return nullptr; } int EVP_marshal_public_key(CBB *cbb, const EVP_PKEY *key) { - if (key->ameth == NULL || key->ameth->pub_encode == NULL) { + if (key->ameth == nullptr || key->ameth->pub_encode == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); return 0; } @@ -105,47 +89,51 @@ int EVP_marshal_public_key(CBB *cbb, const EVP_PKEY *key) { return key->ameth->pub_encode(cbb, key); } -EVP_PKEY *EVP_parse_private_key(CBS *cbs) { +EVP_PKEY *EVP_PKEY_from_private_key_info(const uint8_t *in, size_t len, + const EVP_PKEY_ALG *const *algs, + size_t num_algs) { // Parse the PrivateKeyInfo. - CBS pkcs8, algorithm, key; + CBS cbs, pkcs8, oid, algorithm, key; uint64_t version; - if (!CBS_get_asn1(cbs, &pkcs8, CBS_ASN1_SEQUENCE) || - !CBS_get_asn1_uint64(&pkcs8, &version) || - version != 0 || + CBS_init(&cbs, in, len); + if (!CBS_get_asn1(&cbs, &pkcs8, CBS_ASN1_SEQUENCE) || + !CBS_get_asn1_uint64(&pkcs8, &version) || version != 0 || !CBS_get_asn1(&pkcs8, &algorithm, CBS_ASN1_SEQUENCE) || - !CBS_get_asn1(&pkcs8, &key, CBS_ASN1_OCTETSTRING)) { + !CBS_get_asn1(&algorithm, &oid, CBS_ASN1_OBJECT) || + !CBS_get_asn1(&pkcs8, &key, CBS_ASN1_OCTETSTRING) || + // A PrivateKeyInfo ends with a SET of Attributes which we ignore. + CBS_len(&cbs) != 0) { OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); return nullptr; } - const EVP_PKEY_ASN1_METHOD *method = parse_key_type(&algorithm); - if (method == nullptr) { - OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); - return nullptr; - } - // A PrivateKeyInfo ends with a SET of Attributes which we ignore. - - // Set up an |EVP_PKEY| of the appropriate type. bssl::UniquePtr ret(EVP_PKEY_new()); if (ret == nullptr) { return nullptr; } - evp_pkey_set_method(ret.get(), method); - - // Call into the type-specific PrivateKeyInfo decoding function. - if (ret->ameth->priv_decode == nullptr) { - OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); - return nullptr; - } - if (!ret->ameth->priv_decode(ret.get(), &algorithm, &key)) { - return nullptr; + for (const EVP_PKEY_ALG *alg : bssl::Span(algs, num_algs)) { + if (alg->method->priv_decode == nullptr || + bssl::Span(alg->method->oid, alg->method->oid_len) != oid) { + continue; + } + CBS params = algorithm, key_copy = key; + switch (alg->method->priv_decode(alg, ret.get(), ¶ms, &key_copy)) { + case evp_decode_error: + return nullptr; + case evp_decode_ok: + return ret.release(); + case evp_decode_unsupported: + // Continue trying other algorithms. + break; + } } - return ret.release(); + OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); + return nullptr; } int EVP_marshal_private_key(CBB *cbb, const EVP_PKEY *key) { - if (key->ameth == NULL || key->ameth->priv_encode == NULL) { + if (key->ameth == nullptr || key->ameth->priv_encode == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); return 0; } @@ -153,6 +141,30 @@ int EVP_marshal_private_key(CBB *cbb, const EVP_PKEY *key) { return key->ameth->priv_encode(cbb, key); } +EVP_PKEY *EVP_parse_public_key(CBS *cbs) { + CBS elem; + if (!CBS_get_asn1_element(cbs, &elem, CBS_ASN1_SEQUENCE)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return nullptr; + } + + auto algs = bssl::GetDefaultEVPAlgorithms(); + return EVP_PKEY_from_subject_public_key_info(CBS_data(&elem), CBS_len(&elem), + algs.data(), algs.size()); +} + +EVP_PKEY *EVP_parse_private_key(CBS *cbs) { + CBS elem; + if (!CBS_get_asn1_element(cbs, &elem, CBS_ASN1_SEQUENCE)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return nullptr; + } + + auto algs = bssl::GetDefaultEVPAlgorithms(); + return EVP_PKEY_from_private_key_info(CBS_data(&elem), CBS_len(&elem), + algs.data(), algs.size()); +} + static bssl::UniquePtr old_priv_decode(CBS *cbs, int type) { bssl::UniquePtr ret(EVP_PKEY_new()); if (ret == nullptr) { @@ -192,35 +204,26 @@ static bssl::UniquePtr old_priv_decode(CBS *cbs, int type) { EVP_PKEY *d2i_PrivateKey(int type, EVP_PKEY **out, const uint8_t **inp, long len) { - if (len < 0) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return nullptr; - } - - // Parse with the legacy format. - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - bssl::UniquePtr ret = old_priv_decode(&cbs, type); - if (ret == nullptr) { - // Try again with PKCS#8. - ERR_clear_error(); - CBS_init(&cbs, *inp, (size_t)len); - ret.reset(EVP_parse_private_key(&cbs)); - if (ret == nullptr) { - return nullptr; - } - if (ret->type != type) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DIFFERENT_KEY_TYPES); - return nullptr; - } - } - - if (out != nullptr) { - EVP_PKEY_free(*out); - *out = ret.get(); - } - *inp = CBS_data(&cbs); - return ret.release(); + return bssl::D2IFromCBS( + out, inp, len, [&](CBS *cbs) -> bssl::UniquePtr { + // Parse with the legacy format. + CBS copy = *cbs; + bssl::UniquePtr ret = old_priv_decode(cbs, type); + if (ret == nullptr) { + // Try again with PKCS#8. + ERR_clear_error(); + *cbs = copy; + ret.reset(EVP_parse_private_key(cbs)); + if (ret == nullptr) { + return nullptr; + } + if (EVP_PKEY_id(ret.get()) != type) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DIFFERENT_KEY_TYPES); + return nullptr; + } + } + return ret; + }); } // num_elements parses one SEQUENCE from |in| and returns the number of elements @@ -235,7 +238,7 @@ static size_t num_elements(const uint8_t *in, size_t in_len) { size_t count = 0; while (CBS_len(&sequence) > 0) { - if (!CBS_get_any_asn1_element(&sequence, NULL, NULL, NULL)) { + if (!CBS_get_any_asn1_element(&sequence, nullptr, nullptr, nullptr)) { return 0; } @@ -248,15 +251,15 @@ static size_t num_elements(const uint8_t *in, size_t in_len) { EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **out, const uint8_t **inp, long len) { if (len < 0) { OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return NULL; + return nullptr; } // Parse the input as a PKCS#8 PrivateKeyInfo. CBS cbs; CBS_init(&cbs, *inp, (size_t)len); EVP_PKEY *ret = EVP_parse_private_key(&cbs); - if (ret != NULL) { - if (out != NULL) { + if (ret != nullptr) { + if (out != nullptr) { EVP_PKEY_free(*out); *out = ret; } @@ -279,7 +282,7 @@ EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **out, const uint8_t **inp, long len) { } int i2d_PublicKey(const EVP_PKEY *key, uint8_t **outp) { - switch (key->type) { + switch (EVP_PKEY_id(key)) { case EVP_PKEY_RSA: return i2d_RSAPublicKey(EVP_PKEY_get0_RSA(key), outp); case EVP_PKEY_DSA: @@ -294,93 +297,70 @@ int i2d_PublicKey(const EVP_PKEY *key, uint8_t **outp) { EVP_PKEY *d2i_PublicKey(int type, EVP_PKEY **out, const uint8_t **inp, long len) { - bssl::UniquePtr ret(EVP_PKEY_new()); - if (ret == nullptr) { - return nullptr; - } + return bssl::D2IFromCBS( + out, inp, len, [&](CBS *cbs) -> bssl::UniquePtr { + bssl::UniquePtr ret(EVP_PKEY_new()); + if (ret == nullptr) { + return nullptr; + } + switch (type) { + case EVP_PKEY_RSA: { + bssl::UniquePtr rsa(RSA_parse_public_key(cbs)); + if (rsa == nullptr) { + return nullptr; + } + EVP_PKEY_assign_RSA(ret.get(), rsa.release()); + return ret; + } - CBS cbs; - CBS_init(&cbs, *inp, len < 0 ? 0 : (size_t)len); - switch (type) { - case EVP_PKEY_RSA: { - bssl::UniquePtr rsa(RSA_parse_public_key(&cbs)); - if (rsa == nullptr) { - return nullptr; - } - EVP_PKEY_assign_RSA(ret.get(), rsa.release()); - break; - } - - // Unlike OpenSSL, we do not support EC keys with this API. The raw EC - // public key serialization requires knowing the group. In OpenSSL, calling - // this function with |EVP_PKEY_EC| and setting |out| to nullptr does not - // work. It requires |*out| to include a partially-initialized |EVP_PKEY| to - // extract the group. - default: - OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_PUBLIC_KEY_TYPE); - return nullptr; - } - - *inp = CBS_data(&cbs); - if (out != nullptr) { - EVP_PKEY_free(*out); - *out = ret.get(); - } - return ret.release(); + // Unlike OpenSSL, we do not support EC keys with this API. The raw EC + // public key serialization requires knowing the group. In OpenSSL, + // calling this function with |EVP_PKEY_EC| and setting |out| to + // nullptr does not work. It requires |*out| to include a + // partially-initialized |EVP_PKEY| to extract the group. + default: + OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_PUBLIC_KEY_TYPE); + return nullptr; + } + }); } EVP_PKEY *d2i_PUBKEY(EVP_PKEY **out, const uint8_t **inp, long len) { - if (len < 0) { - return nullptr; - } - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - bssl::UniquePtr ret(EVP_parse_public_key(&cbs)); - if (ret == nullptr) { - return nullptr; - } - if (out != nullptr) { - EVP_PKEY_free(*out); - *out = ret.get(); - } - *inp = CBS_data(&cbs); - return ret.release(); + return bssl::D2IFromCBS(out, inp, len, EVP_parse_public_key); } int i2d_PUBKEY(const EVP_PKEY *pkey, uint8_t **outp) { - if (pkey == NULL) { + if (pkey == nullptr) { return 0; } + return bssl::I2DFromCBB( + /*initial_capacity=*/128, outp, + [&](CBB *cbb) -> bool { return EVP_marshal_public_key(cbb, pkey); }); +} - CBB cbb; - if (!CBB_init(&cbb, 128) || - !EVP_marshal_public_key(&cbb, pkey)) { - CBB_cleanup(&cbb); - return -1; +static bssl::UniquePtr parse_spki( + CBS *cbs, bssl::Span algs) { + CBS spki; + if (!CBS_get_asn1_element(cbs, &spki, CBS_ASN1_SEQUENCE)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return nullptr; } - return CBB_finish_i2d(&cbb, outp); + return bssl::UniquePtr(EVP_PKEY_from_subject_public_key_info( + CBS_data(&spki), CBS_len(&spki), algs.data(), algs.size())); +} + +static bssl::UniquePtr parse_spki(CBS *cbs, const EVP_PKEY_ALG *alg) { + return parse_spki(cbs, bssl::Span(&alg, 1)); } RSA *d2i_RSA_PUBKEY(RSA **out, const uint8_t **inp, long len) { - if (len < 0) { - return nullptr; - } - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - bssl::UniquePtr pkey(EVP_parse_public_key(&cbs)); - if (pkey == nullptr) { - return nullptr; - } - bssl::UniquePtr rsa(EVP_PKEY_get1_RSA(pkey.get())); - if (rsa == nullptr) { - return nullptr; - } - if (out != nullptr) { - RSA_free(*out); - *out = rsa.get(); - } - *inp = CBS_data(&cbs); - return rsa.release(); + return bssl::D2IFromCBS(out, inp, len, [](CBS *cbs) -> bssl::UniquePtr { + bssl::UniquePtr pkey = parse_spki(cbs, EVP_pkey_rsa()); + if (pkey == nullptr) { + return nullptr; + } + return bssl::UniquePtr(EVP_PKEY_get1_RSA(pkey.get())); + }); } int i2d_RSA_PUBKEY(const RSA *rsa, uint8_t **outp) { @@ -398,25 +378,13 @@ int i2d_RSA_PUBKEY(const RSA *rsa, uint8_t **outp) { } DSA *d2i_DSA_PUBKEY(DSA **out, const uint8_t **inp, long len) { - if (len < 0) { - return nullptr; - } - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - bssl::UniquePtr pkey(EVP_parse_public_key(&cbs)); - if (pkey == nullptr) { - return nullptr; - } - bssl::UniquePtr dsa(EVP_PKEY_get1_DSA(pkey.get())); - if (dsa == nullptr) { - return nullptr; - } - if (out != nullptr) { - DSA_free(*out); - *out = dsa.get(); - } - *inp = CBS_data(&cbs); - return dsa.release(); + return bssl::D2IFromCBS(out, inp, len, [](CBS *cbs) -> bssl::UniquePtr { + bssl::UniquePtr pkey = parse_spki(cbs, EVP_pkey_dsa()); + if (pkey == nullptr) { + return nullptr; + } + return bssl::UniquePtr(EVP_PKEY_get1_DSA(pkey.get())); + }); } int i2d_DSA_PUBKEY(const DSA *dsa, uint8_t **outp) { @@ -434,29 +402,21 @@ int i2d_DSA_PUBKEY(const DSA *dsa, uint8_t **outp) { } EC_KEY *d2i_EC_PUBKEY(EC_KEY **out, const uint8_t **inp, long len) { - if (len < 0) { - return nullptr; - } - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - bssl::UniquePtr pkey(EVP_parse_public_key(&cbs)); - if (pkey == nullptr) { - return nullptr; - } - bssl::UniquePtr ec_key(EVP_PKEY_get1_EC_KEY(pkey.get())); - if (ec_key == nullptr) { - return nullptr; - } - if (out != nullptr) { - EC_KEY_free(*out); - *out = ec_key.get(); - } - *inp = CBS_data(&cbs); - return ec_key.release(); + return bssl::D2IFromCBS( + out, inp, len, [](CBS *cbs) -> bssl::UniquePtr { + const EVP_PKEY_ALG *const algs[] = { + EVP_pkey_ec_p224(), EVP_pkey_ec_p256(), EVP_pkey_ec_p384(), + EVP_pkey_ec_p521()}; + bssl::UniquePtr pkey = parse_spki(cbs, algs); + if (pkey == nullptr) { + return nullptr; + } + return bssl::UniquePtr(EVP_PKEY_get1_EC_KEY(pkey.get())); + }); } int i2d_EC_PUBKEY(const EC_KEY *ec_key, uint8_t **outp) { - if (ec_key == NULL) { + if (ec_key == nullptr) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/evp_ctx.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/evp_ctx.cc index 5e307c11ec..9be71d9a7a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/evp_ctx.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/evp_ctx.cc @@ -25,29 +25,31 @@ #include "internal.h" -static const EVP_PKEY_METHOD *const evp_methods[] = { +// |EVP_PKEY_RSA_PSS| is intentionally omitted from this list. These are types +// that can be created without an |EVP_PKEY|, and we do not support +// |EVP_PKEY_RSA_PSS| keygen. +static const EVP_PKEY_CTX_METHOD *const evp_methods[] = { &rsa_pkey_meth, &ec_pkey_meth, &ed25519_pkey_meth, &x25519_pkey_meth, &hkdf_pkey_meth, }; -static const EVP_PKEY_METHOD *evp_pkey_meth_find(int type) { - for (size_t i = 0; i < sizeof(evp_methods) / sizeof(EVP_PKEY_METHOD *); i++) { - if (evp_methods[i]->pkey_id == type) { - return evp_methods[i]; +static const EVP_PKEY_CTX_METHOD *evp_pkey_meth_find(int type) { + for (auto method : evp_methods) { + if (method->pkey_id == type) { + return method; } } - return NULL; + return nullptr; } -static EVP_PKEY_CTX *evp_pkey_ctx_new(EVP_PKEY *pkey, ENGINE *e, - const EVP_PKEY_METHOD *pmeth) { +static EVP_PKEY_CTX *evp_pkey_ctx_new(EVP_PKEY *pkey, + const EVP_PKEY_CTX_METHOD *pmeth) { bssl::UniquePtr ret = bssl::MakeUnique(); if (!ret) { return nullptr; } - ret->engine = e; ret->pmeth = pmeth; ret->operation = EVP_PKEY_OP_UNDEFINED; ret->pkey = bssl::UpRef(pkey); @@ -61,30 +63,30 @@ static EVP_PKEY_CTX *evp_pkey_ctx_new(EVP_PKEY *pkey, ENGINE *e, } EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e) { - if (pkey == NULL || pkey->ameth == NULL) { + if (pkey == nullptr || pkey->ameth == nullptr) { OPENSSL_PUT_ERROR(EVP, ERR_R_PASSED_NULL_PARAMETER); - return NULL; + return nullptr; } - const EVP_PKEY_METHOD *pkey_method = pkey->ameth->pkey_method; - if (pkey_method == NULL) { + const EVP_PKEY_CTX_METHOD *pkey_method = pkey->ameth->pkey_method; + if (pkey_method == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); ERR_add_error_dataf("algorithm %d", pkey->ameth->pkey_id); - return NULL; + return nullptr; } - return evp_pkey_ctx_new(pkey, e, pkey_method); + return evp_pkey_ctx_new(pkey, pkey_method); } EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e) { - const EVP_PKEY_METHOD *pkey_method = evp_pkey_meth_find(id); - if (pkey_method == NULL) { + const EVP_PKEY_CTX_METHOD *pkey_method = evp_pkey_meth_find(id); + if (pkey_method == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); ERR_add_error_dataf("algorithm %d", id); - return NULL; + return nullptr; } - return evp_pkey_ctx_new(NULL, e, pkey_method); + return evp_pkey_ctx_new(nullptr, pkey_method); } evp_pkey_ctx_st::~evp_pkey_ctx_st() { @@ -106,7 +108,6 @@ EVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *ctx) { } ret->pmeth = ctx->pmeth; - ret->engine = ctx->engine; ret->operation = ctx->operation; ret->pkey = bssl::UpRef(ctx->pkey); ret->peerkey = bssl::UpRef(ctx->peerkey); @@ -146,8 +147,8 @@ int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype, int cmd, } int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx) { - if (ctx == NULL || ctx->pmeth == NULL || - (ctx->pmeth->sign == NULL && ctx->pmeth->sign_message == NULL)) { + if (ctx == nullptr || ctx->pmeth == nullptr || + (ctx->pmeth->sign == nullptr && ctx->pmeth->sign_message == nullptr)) { OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); return 0; } @@ -170,8 +171,9 @@ int EVP_PKEY_sign(EVP_PKEY_CTX *ctx, uint8_t *sig, size_t *sig_len, } int EVP_PKEY_verify_init(EVP_PKEY_CTX *ctx) { - if (ctx == NULL || ctx->pmeth == NULL || - (ctx->pmeth->verify == NULL && ctx->pmeth->verify_message == NULL)) { + if (ctx == nullptr || ctx->pmeth == nullptr || + (ctx->pmeth->verify == nullptr && + ctx->pmeth->verify_message == nullptr)) { OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); return 0; } @@ -297,7 +299,7 @@ int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *ctx, EVP_PKEY *peer) { return 0; } - if (ctx->pkey->type != peer->type) { + if (EVP_PKEY_id(ctx->pkey.get()) != EVP_PKEY_id(peer)) { OPENSSL_PUT_ERROR(EVP, EVP_R_DIFFERENT_KEY_TYPES); return 0; } @@ -368,7 +370,7 @@ int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **out_pkey) { if (!ctx->pmeth->keygen(ctx, *out_pkey)) { EVP_PKEY_free(*out_pkey); - *out_pkey = NULL; + *out_pkey = nullptr; return 0; } return 1; @@ -407,7 +409,7 @@ int EVP_PKEY_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY **out_pkey) { if (!ctx->pmeth->paramgen(ctx, *out_pkey)) { EVP_PKEY_free(*out_pkey); - *out_pkey = NULL; + *out_pkey = nullptr; return 0; } return 1; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/evp/internal.h index e5256b5d1c..f22aa4b341 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/internal.h @@ -15,9 +15,11 @@ #ifndef OPENSSL_HEADER_CRYPTO_EVP_INTERNAL_H #define OPENSSL_HEADER_CRYPTO_EVP_INTERNAL_H -#include +#include -#include +#include + +#include #include "../internal.h" @@ -27,23 +29,42 @@ extern "C" { typedef struct evp_pkey_asn1_method_st EVP_PKEY_ASN1_METHOD; -typedef struct evp_pkey_method_st EVP_PKEY_METHOD; +typedef struct evp_pkey_ctx_method_st EVP_PKEY_CTX_METHOD; + +struct evp_pkey_alg_st { + // method implements operations for this |EVP_PKEY_ALG|. + const EVP_PKEY_ASN1_METHOD *method; +}; + +enum evp_decode_result_t { + evp_decode_error = 0, + evp_decode_ok = 1, + evp_decode_unsupported = 2, +}; struct evp_pkey_asn1_method_st { + // pkey_id contains one of the |EVP_PKEY_*| values and corresponds to the OID + // in the key type's AlgorithmIdentifier. int pkey_id; uint8_t oid[9]; uint8_t oid_len; - const EVP_PKEY_METHOD *pkey_method; + const EVP_PKEY_CTX_METHOD *pkey_method; // pub_decode decodes |params| and |key| as a SubjectPublicKeyInfo - // and writes the result into |out|. It returns one on success and zero on - // error. |params| is the AlgorithmIdentifier after the OBJECT IDENTIFIER - // type field, and |key| is the contents of the subjectPublicKey with the - // leading padding byte checked and removed. Although X.509 uses BIT STRINGs - // to represent SubjectPublicKeyInfo, every key type defined encodes the key - // as a byte string with the same conversion to BIT STRING. - int (*pub_decode)(EVP_PKEY *out, CBS *params, CBS *key); + // and writes the result into |out|. It returns |evp_decode_ok| on success, + // and |evp_decode_error| on error, and |evp_decode_unsupported| if the input + // was not supported by this |EVP_PKEY_ALG|. In case of + // |evp_decode_unsupported|, it does not add an error to the error queue. May + // modify |params| and |key|. Callers must make a copy if calling in a loop. + // + // |params| is the AlgorithmIdentifier after the OBJECT IDENTIFIER type field, + // and |key| is the contents of the subjectPublicKey with the leading padding + // byte checked and removed. Although X.509 uses BIT STRINGs to represent + // SubjectPublicKeyInfo, every key type defined encodes the key as a byte + // string with the same conversion to BIT STRING. + evp_decode_result_t (*pub_decode)(const EVP_PKEY_ALG *alg, EVP_PKEY *out, + CBS *params, CBS *key); // pub_encode encodes |key| as a SubjectPublicKeyInfo and appends the result // to |out|. It returns one on success and zero on error. @@ -52,18 +73,26 @@ struct evp_pkey_asn1_method_st { int (*pub_cmp)(const EVP_PKEY *a, const EVP_PKEY *b); // priv_decode decodes |params| and |key| as a PrivateKeyInfo and writes the - // result into |out|. It returns one on success and zero on error. |params| is - // the AlgorithmIdentifier after the OBJECT IDENTIFIER type field, and |key| - // is the contents of the OCTET STRING privateKey field. - int (*priv_decode)(EVP_PKEY *out, CBS *params, CBS *key); + // result into |out|. It returns |evp_decode_ok| on success, and + // |evp_decode_error| on error, and |evp_decode_unsupported| if the key type + // was not supported by this |EVP_PKEY_ALG|. In case of + // |evp_decode_unsupported|, it does not add an error to the error queue. May + // modify |params| and |key|. Callers must make a copy if calling in a loop. + // + // |params| is the AlgorithmIdentifier after the OBJECT IDENTIFIER type field, + // and |key| is the contents of the OCTET STRING privateKey field. + evp_decode_result_t (*priv_decode)(const EVP_PKEY_ALG *alg, EVP_PKEY *out, + CBS *params, CBS *key); // priv_encode encodes |key| as a PrivateKeyInfo and appends the result to // |out|. It returns one on success and zero on error. int (*priv_encode)(CBB *out, const EVP_PKEY *key); int (*set_priv_raw)(EVP_PKEY *pkey, const uint8_t *in, size_t len); + int (*set_priv_seed)(EVP_PKEY *pkey, const uint8_t *in, size_t len); int (*set_pub_raw)(EVP_PKEY *pkey, const uint8_t *in, size_t len); int (*get_priv_raw)(const EVP_PKEY *pkey, uint8_t *out, size_t *out_len); + int (*get_priv_seed)(const EVP_PKEY *pkey, uint8_t *out, size_t *out_len); int (*get_pub_raw)(const EVP_PKEY *pkey, uint8_t *out, size_t *out_len); // TODO(davidben): Can these be merged with the functions above? OpenSSL does @@ -94,15 +123,11 @@ struct evp_pkey_asn1_method_st { struct evp_pkey_st { CRYPTO_refcount_t references; - // type contains one of the EVP_PKEY_* values or NID_undef and determines - // the type of |pkey|. - int type; - - // pkey contains a pointer to a structure dependent on |type|. + // pkey contains a pointer to a structure dependent on |ameth|. void *pkey; - // ameth contains a pointer to a method table that contains many ASN.1 - // methods for the key type. + // ameth contains a pointer to a method table that determines the key type, or + // nullptr if the key is empty. const EVP_PKEY_ASN1_METHOD *ameth; } /* EVP_PKEY */; @@ -167,7 +192,7 @@ OPENSSL_EXPORT int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype, #define EVP_PKEY_CTRL_GET_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 10) #define EVP_PKEY_CTRL_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 11) #define EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 12) -#define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID (EVP_PKEY_ALG_CTRL + 13) +#define EVP_PKEY_CTRL_EC_PARAMGEN_GROUP (EVP_PKEY_ALG_CTRL + 13) #define EVP_PKEY_CTRL_HKDF_MODE (EVP_PKEY_ALG_CTRL + 14) #define EVP_PKEY_CTRL_HKDF_MD (EVP_PKEY_ALG_CTRL + 15) #define EVP_PKEY_CTRL_HKDF_KEY (EVP_PKEY_ALG_CTRL + 16) @@ -179,9 +204,7 @@ struct evp_pkey_ctx_st { ~evp_pkey_ctx_st(); // Method associated with this operation - const EVP_PKEY_METHOD *pmeth = nullptr; - // Engine that implements this method or nullptr if builtin - ENGINE *engine = nullptr; + const EVP_PKEY_CTX_METHOD *pmeth = nullptr; // Key: may be nullptr bssl::UniquePtr pkey; // Peer key for key agreement, may be nullptr @@ -195,7 +218,7 @@ struct evp_pkey_ctx_st { void *data = nullptr; } /* EVP_PKEY_CTX */; -struct evp_pkey_method_st { +struct evp_pkey_ctx_method_st { int pkey_id; int (*init)(EVP_PKEY_CTX *ctx); @@ -230,46 +253,44 @@ struct evp_pkey_method_st { int (*paramgen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey); int (*ctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2); -} /* EVP_PKEY_METHOD */; +} /* EVP_PKEY_CTX_METHOD */; -typedef struct { - // key is the concatenation of the private seed and public key. It is stored - // as a single 64-bit array to allow passing to |ED25519_sign|. If - // |has_private| is false, the first 32 bytes are uninitialized and the public - // key is in the last 32 bytes. - uint8_t key[64]; - char has_private; -} ED25519_KEY; +extern const EVP_PKEY_CTX_METHOD rsa_pkey_meth; +extern const EVP_PKEY_CTX_METHOD rsa_pss_pkey_meth; +extern const EVP_PKEY_CTX_METHOD ec_pkey_meth; +extern const EVP_PKEY_CTX_METHOD ed25519_pkey_meth; +extern const EVP_PKEY_CTX_METHOD x25519_pkey_meth; +extern const EVP_PKEY_CTX_METHOD hkdf_pkey_meth; +extern const EVP_PKEY_CTX_METHOD dh_pkey_meth; -#define ED25519_PUBLIC_KEY_OFFSET 32 - -typedef struct { - uint8_t pub[32]; - uint8_t priv[32]; - char has_private; -} X25519_KEY; - -extern const EVP_PKEY_ASN1_METHOD dsa_asn1_meth; -extern const EVP_PKEY_ASN1_METHOD ec_asn1_meth; -extern const EVP_PKEY_ASN1_METHOD rsa_asn1_meth; -extern const EVP_PKEY_ASN1_METHOD ed25519_asn1_meth; -extern const EVP_PKEY_ASN1_METHOD x25519_asn1_meth; -extern const EVP_PKEY_ASN1_METHOD dh_asn1_meth; - -extern const EVP_PKEY_METHOD rsa_pkey_meth; -extern const EVP_PKEY_METHOD ec_pkey_meth; -extern const EVP_PKEY_METHOD ed25519_pkey_meth; -extern const EVP_PKEY_METHOD x25519_pkey_meth; -extern const EVP_PKEY_METHOD hkdf_pkey_meth; -extern const EVP_PKEY_METHOD dh_pkey_meth; - -// evp_pkey_set_method behaves like |EVP_PKEY_set_type|, but takes a pointer to -// a method table. This avoids depending on every |EVP_PKEY_ASN1_METHOD|. -void evp_pkey_set_method(EVP_PKEY *pkey, const EVP_PKEY_ASN1_METHOD *method); +// evp_pkey_set0 sets |pkey|'s method to |method| and data to |pkey_data|, +// freeing any key that may previously have been configured. This function takes +// ownership of |pkey_data|, which must be of the type expected by |method|. +void evp_pkey_set0(EVP_PKEY *pkey, const EVP_PKEY_ASN1_METHOD *method, + void *pkey_data); #if defined(__cplusplus) } // extern C #endif +BSSL_NAMESPACE_BEGIN +inline auto GetDefaultEVPAlgorithms() { + // A set of algorithms to use by default in |EVP_parse_public_key| and + // |EVP_parse_private_key|. + return std::array{ + EVP_pkey_ec_p224(), + EVP_pkey_ec_p256(), + EVP_pkey_ec_p384(), + EVP_pkey_ec_p521(), + EVP_pkey_ed25519(), + EVP_pkey_rsa(), + EVP_pkey_x25519(), + // TODO(crbug.com/438761503): Remove DSA from this set, after callers that + // need DSA pass in |EVP_pkey_dsa| explicitly. + EVP_pkey_dsa(), + }; +} +BSSL_NAMESPACE_END + #endif // OPENSSL_HEADER_CRYPTO_EVP_INTERNAL_H diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_dh.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_dh.cc index 8b536449fc..46c4cd957d 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_dh.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_dh.cc @@ -16,13 +16,138 @@ #include +#include #include #include #include +#include "../internal.h" #include "internal.h" +static void dh_free(EVP_PKEY *pkey) { + DH_free(reinterpret_cast(pkey->pkey)); + pkey->pkey = nullptr; +} + +static int dh_size(const EVP_PKEY *pkey) { + return DH_size(reinterpret_cast(pkey->pkey)); +} + +static int dh_bits(const EVP_PKEY *pkey) { + return DH_bits(reinterpret_cast(pkey->pkey)); +} + +static int dh_param_missing(const EVP_PKEY *pkey) { + const DH *dh = reinterpret_cast(pkey->pkey); + return dh == nullptr || DH_get0_p(dh) == nullptr || DH_get0_g(dh) == nullptr; +} + +static int dh_param_copy(EVP_PKEY *to, const EVP_PKEY *from) { + if (dh_param_missing(from)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_MISSING_PARAMETERS); + return 0; + } + + const DH *dh = reinterpret_cast(from->pkey); + const BIGNUM *q_old = DH_get0_q(dh); + BIGNUM *p = BN_dup(DH_get0_p(dh)); + BIGNUM *q = q_old == nullptr ? nullptr : BN_dup(q_old); + BIGNUM *g = BN_dup(DH_get0_g(dh)); + if (p == nullptr || (q_old != nullptr && q == nullptr) || g == nullptr || + !DH_set0_pqg(reinterpret_cast(to->pkey), p, q, g)) { + BN_free(p); + BN_free(q); + BN_free(g); + return 0; + } + + // |DH_set0_pqg| took ownership of |p|, |q|, and |g|. + return 1; +} + +static int dh_param_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { + if (dh_param_missing(a) || dh_param_missing(b)) { + return -2; + } + + // Matching OpenSSL, only compare p and g for PKCS#3-style Diffie-Hellman. + // OpenSSL only checks q in X9.42-style Diffie-Hellman ("DHX"). + const DH *a_dh = reinterpret_cast(a->pkey); + const DH *b_dh = reinterpret_cast(b->pkey); + return BN_cmp(DH_get0_p(a_dh), DH_get0_p(b_dh)) == 0 && + BN_cmp(DH_get0_g(a_dh), DH_get0_g(b_dh)) == 0; +} + +static int dh_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { + if (dh_param_cmp(a, b) <= 0) { + return 0; + } + + const DH *a_dh = reinterpret_cast(a->pkey); + const DH *b_dh = reinterpret_cast(b->pkey); + return BN_cmp(DH_get0_pub_key(a_dh), DH_get0_pub_key(b_dh)) == 0; +} + +static const EVP_PKEY_ASN1_METHOD dh_asn1_meth = { + /*pkey_id=*/EVP_PKEY_DH, + /*oid=*/{0}, + /*oid_len=*/0, + /*pkey_method=*/&dh_pkey_meth, + /*pub_decode=*/nullptr, + /*pub_encode=*/nullptr, + /*pub_cmp=*/dh_pub_cmp, + /*priv_decode=*/nullptr, + /*priv_encode=*/nullptr, + /*set_priv_raw=*/nullptr, + /*set_priv_seed=*/nullptr, + /*set_pub_raw=*/nullptr, + /*get_priv_raw=*/nullptr, + /*get_priv_seed=*/nullptr, + /*get_pub_raw=*/nullptr, + /*set1_tls_encodedpoint=*/nullptr, + /*get1_tls_encodedpoint=*/nullptr, + /*pkey_opaque=*/nullptr, + /*pkey_size=*/dh_size, + /*pkey_bits=*/dh_bits, + /*param_missing=*/dh_param_missing, + /*param_copy=*/dh_param_copy, + /*param_cmp=*/dh_param_cmp, + /*pkey_free=*/dh_free, +}; + +int EVP_PKEY_set1_DH(EVP_PKEY *pkey, DH *key) { + if (EVP_PKEY_assign_DH(pkey, key)) { + DH_up_ref(key); + return 1; + } + return 0; +} + +int EVP_PKEY_assign_DH(EVP_PKEY *pkey, DH *key) { + if (key == nullptr) { + return 0; + } + evp_pkey_set0(pkey, &dh_asn1_meth, key); + return 1; +} + +DH *EVP_PKEY_get0_DH(const EVP_PKEY *pkey) { + if (EVP_PKEY_id(pkey) != EVP_PKEY_DH) { + OPENSSL_PUT_ERROR(EVP, EVP_R_EXPECTING_A_DH_KEY); + return nullptr; + } + return reinterpret_cast(const_cast(pkey)->pkey); +} + +DH *EVP_PKEY_get1_DH(const EVP_PKEY *pkey) { + DH *dh = EVP_PKEY_get0_DH(pkey); + if (dh != nullptr) { + DH_up_ref(dh); + } + return dh; +} + namespace { typedef struct dh_pkey_ctx_st { int pad; @@ -32,7 +157,7 @@ typedef struct dh_pkey_ctx_st { static int pkey_dh_init(EVP_PKEY_CTX *ctx) { DH_PKEY_CTX *dctx = reinterpret_cast(OPENSSL_zalloc(sizeof(DH_PKEY_CTX))); - if (dctx == NULL) { + if (dctx == nullptr) { return 0; } @@ -53,17 +178,18 @@ static int pkey_dh_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { static void pkey_dh_cleanup(EVP_PKEY_CTX *ctx) { OPENSSL_free(ctx->data); - ctx->data = NULL; + ctx->data = nullptr; } static int pkey_dh_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) { DH *dh = DH_new(); - if (dh == NULL || !EVP_PKEY_assign_DH(pkey, dh)) { + if (dh == nullptr || !EVP_PKEY_assign_DH(pkey, dh)) { DH_free(dh); return 0; } - if (ctx->pkey != NULL && !EVP_PKEY_copy_parameters(pkey, ctx->pkey.get())) { + if (ctx->pkey != nullptr && + !EVP_PKEY_copy_parameters(pkey, ctx->pkey.get())) { return 0; } @@ -72,25 +198,25 @@ static int pkey_dh_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) { static int pkey_dh_derive(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *out_len) { DH_PKEY_CTX *dctx = reinterpret_cast(ctx->data); - if (ctx->pkey == NULL || ctx->peerkey == NULL) { + if (ctx->pkey == nullptr || ctx->peerkey == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_KEYS_NOT_SET); return 0; } DH *our_key = reinterpret_cast(ctx->pkey->pkey); DH *peer_key = reinterpret_cast(ctx->peerkey->pkey); - if (our_key == NULL || peer_key == NULL) { + if (our_key == nullptr || peer_key == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_KEYS_NOT_SET); return 0; } const BIGNUM *pub_key = DH_get0_pub_key(peer_key); - if (pub_key == NULL) { + if (pub_key == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_KEYS_NOT_SET); return 0; } - if (out == NULL) { + if (out == nullptr) { *out_len = DH_size(our_key); return 1; } @@ -129,7 +255,7 @@ static int pkey_dh_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { } } -const EVP_PKEY_METHOD dh_pkey_meth = { +const EVP_PKEY_CTX_METHOD dh_pkey_meth = { /*pkey_id=*/EVP_PKEY_DH, /*init=*/pkey_dh_init, /*copy=*/pkey_dh_copy, @@ -149,5 +275,5 @@ const EVP_PKEY_METHOD dh_pkey_meth = { int EVP_PKEY_CTX_set_dh_pad(EVP_PKEY_CTX *ctx, int pad) { return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_DERIVE, - EVP_PKEY_CTRL_DH_PAD, pad, NULL); + EVP_PKEY_CTRL_DH_PAD, pad, nullptr); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_dh_asn1.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_dh_asn1.cc deleted file mode 100644 index 1c035e75e3..0000000000 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_dh_asn1.cc +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2006-2021 The OpenSSL Project Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.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 - -#include -#include -#include - -#include "../internal.h" -#include "internal.h" - - -static void dh_free(EVP_PKEY *pkey) { - DH_free(reinterpret_cast(pkey->pkey)); - pkey->pkey = NULL; -} - -static int dh_size(const EVP_PKEY *pkey) { - return DH_size(reinterpret_cast(pkey->pkey)); -} - -static int dh_bits(const EVP_PKEY *pkey) { - return DH_bits(reinterpret_cast(pkey->pkey)); -} - -static int dh_param_missing(const EVP_PKEY *pkey) { - const DH *dh = reinterpret_cast(pkey->pkey); - return dh == NULL || DH_get0_p(dh) == NULL || DH_get0_g(dh) == NULL; -} - -static int dh_param_copy(EVP_PKEY *to, const EVP_PKEY *from) { - if (dh_param_missing(from)) { - OPENSSL_PUT_ERROR(EVP, EVP_R_MISSING_PARAMETERS); - return 0; - } - - const DH *dh = reinterpret_cast(from->pkey); - const BIGNUM *q_old = DH_get0_q(dh); - BIGNUM *p = BN_dup(DH_get0_p(dh)); - BIGNUM *q = q_old == NULL ? NULL : BN_dup(q_old); - BIGNUM *g = BN_dup(DH_get0_g(dh)); - if (p == NULL || (q_old != NULL && q == NULL) || g == NULL || - !DH_set0_pqg(reinterpret_cast(to->pkey), p, q, g)) { - BN_free(p); - BN_free(q); - BN_free(g); - return 0; - } - - // |DH_set0_pqg| took ownership of |p|, |q|, and |g|. - return 1; -} - -static int dh_param_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { - if (dh_param_missing(a) || dh_param_missing(b)) { - return -2; - } - - // Matching OpenSSL, only compare p and g for PKCS#3-style Diffie-Hellman. - // OpenSSL only checks q in X9.42-style Diffie-Hellman ("DHX"). - const DH *a_dh = reinterpret_cast(a->pkey); - const DH *b_dh = reinterpret_cast(b->pkey); - return BN_cmp(DH_get0_p(a_dh), DH_get0_p(b_dh)) == 0 && - BN_cmp(DH_get0_g(a_dh), DH_get0_g(b_dh)) == 0; -} - -static int dh_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { - if (dh_param_cmp(a, b) <= 0) { - return 0; - } - - const DH *a_dh = reinterpret_cast(a->pkey); - const DH *b_dh = reinterpret_cast(b->pkey); - return BN_cmp(DH_get0_pub_key(a_dh), DH_get0_pub_key(b_dh)) == 0; -} - -const EVP_PKEY_ASN1_METHOD dh_asn1_meth = { - /*pkey_id=*/EVP_PKEY_DH, - /*oid=*/{0}, - /*oid_len=*/0, - /*pkey_method=*/&dh_pkey_meth, - /*pub_decode=*/nullptr, - /*pub_encode=*/nullptr, - /*pub_cmp=*/dh_pub_cmp, - /*priv_decode=*/nullptr, - /*priv_encode=*/nullptr, - /*set_priv_raw=*/nullptr, - /*set_pub_raw=*/nullptr, - /*get_priv_raw=*/nullptr, - /*get_pub_raw=*/nullptr, - /*set1_tls_encodedpoint=*/nullptr, - /*get1_tls_encodedpoint=*/nullptr, - /*pkey_opaque=*/nullptr, - /*pkey_size=*/dh_size, - /*pkey_bits=*/dh_bits, - /*param_missing=*/dh_param_missing, - /*param_copy=*/dh_param_copy, - /*param_cmp=*/dh_param_cmp, - /*pkey_free=*/dh_free, -}; - -int EVP_PKEY_set1_DH(EVP_PKEY *pkey, DH *key) { - if (EVP_PKEY_assign_DH(pkey, key)) { - DH_up_ref(key); - return 1; - } - return 0; -} - -int EVP_PKEY_assign_DH(EVP_PKEY *pkey, DH *key) { - evp_pkey_set_method(pkey, &dh_asn1_meth); - pkey->pkey = key; - return key != NULL; -} - -DH *EVP_PKEY_get0_DH(const EVP_PKEY *pkey) { - if (pkey->type != EVP_PKEY_DH) { - OPENSSL_PUT_ERROR(EVP, EVP_R_EXPECTING_A_DH_KEY); - return NULL; - } - return reinterpret_cast(const_cast(pkey)->pkey); -} - -DH *EVP_PKEY_get1_DH(const EVP_PKEY *pkey) { - DH *dh = EVP_PKEY_get0_DH(pkey); - if (dh != NULL) { - DH_up_ref(dh); - } - return dh; -} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_dsa_asn1.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_dsa.cc similarity index 83% rename from naiveproxy/src/third_party/boringssl/src/crypto/evp/p_dsa_asn1.cc rename to naiveproxy/src/third_party/boringssl/src/crypto/evp/p_dsa.cc index 8503d4dd88..00762be225 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_dsa_asn1.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_dsa.cc @@ -24,36 +24,36 @@ #include "internal.h" -static int dsa_pub_decode(EVP_PKEY *out, CBS *params, CBS *key) { +namespace { + +extern const EVP_PKEY_ASN1_METHOD dsa_asn1_meth; + +static evp_decode_result_t dsa_pub_decode(const EVP_PKEY_ALG *alg, + EVP_PKEY *out, CBS *params, + CBS *key) { // See RFC 3279, section 2.3.2. - // Parameters may or may not be present. - bssl::UniquePtr dsa; - if (CBS_len(params) == 0) { - dsa.reset(DSA_new()); - if (dsa == nullptr) { - return 0; - } - } else { - dsa.reset(DSA_parse_parameters(params)); - if (dsa == nullptr || CBS_len(params) != 0) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; - } + // Decode parameters. RFC 3279 permits DSA parameters to be omitted, in which + // case they are implicitly determined from the issuing certificate, or + // somewhere unspecified and out-of-band. We do not support this mode. + bssl::UniquePtr dsa(DSA_parse_parameters(params)); + if (dsa == nullptr || CBS_len(params) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; } dsa->pub_key = BN_new(); if (dsa->pub_key == nullptr) { - return 0; + return evp_decode_error; } if (!BN_parse_asn1_unsigned(key, dsa->pub_key) || CBS_len(key) != 0) { OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; + return evp_decode_error; } EVP_PKEY_assign_DSA(out, dsa.release()); - return 1; + return evp_decode_ok; } static int dsa_pub_encode(CBB *out, const EVP_PKEY *key) { @@ -78,23 +78,25 @@ static int dsa_pub_encode(CBB *out, const EVP_PKEY *key) { return 1; } -static int dsa_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) { +static evp_decode_result_t dsa_priv_decode(const EVP_PKEY_ALG *alg, + EVP_PKEY *out, CBS *params, + CBS *key) { // See PKCS#11, v2.40, section 2.5. // Decode parameters. bssl::UniquePtr dsa(DSA_parse_parameters(params)); if (dsa == nullptr || CBS_len(params) != 0) { OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; + return evp_decode_error; } dsa->priv_key = BN_new(); if (dsa->priv_key == nullptr) { - return 0; + return evp_decode_error; } if (!BN_parse_asn1_unsigned(key, dsa->priv_key) || CBS_len(key) != 0) { OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; + return evp_decode_error; } // To avoid DoS attacks when importing private keys, check bounds on |dsa|. @@ -102,7 +104,7 @@ static int dsa_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) { // width. if (!dsa_check_key(dsa.get())) { OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; + return evp_decode_error; } // Calculate the public key. @@ -111,11 +113,11 @@ static int dsa_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) { if (ctx == nullptr || dsa->pub_key == nullptr || !BN_mod_exp_mont_consttime(dsa->pub_key, dsa->g, dsa->priv_key, dsa->p, ctx.get(), nullptr)) { - return 0; + return evp_decode_error; } EVP_PKEY_assign_DSA(out, dsa.release()); - return 1; + return evp_decode_ok; } static int dsa_priv_encode(CBB *out, const EVP_PKEY *key) { @@ -218,8 +220,10 @@ const EVP_PKEY_ASN1_METHOD dsa_asn1_meth = { dsa_priv_encode, /*set_priv_raw=*/nullptr, + /*set_priv_seed=*/nullptr, /*set_pub_raw=*/nullptr, /*get_priv_raw=*/nullptr, + /*get_priv_seed=*/nullptr, /*get_pub_raw=*/nullptr, /*set1_tls_encodedpoint=*/nullptr, /*get1_tls_encodedpoint=*/nullptr, @@ -236,6 +240,13 @@ const EVP_PKEY_ASN1_METHOD dsa_asn1_meth = { int_dsa_free, }; +} // namespace + +const EVP_PKEY_ALG *EVP_pkey_dsa(void) { + static const EVP_PKEY_ALG kAlg = {&dsa_asn1_meth}; + return &kAlg; +} + int EVP_PKEY_CTX_set_dsa_paramgen_bits(EVP_PKEY_CTX *ctx, int nbits) { // BoringSSL does not support DSA in |EVP_PKEY_CTX|. OPENSSL_PUT_ERROR(EVP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); @@ -257,13 +268,15 @@ int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, DSA *key) { } int EVP_PKEY_assign_DSA(EVP_PKEY *pkey, DSA *key) { - evp_pkey_set_method(pkey, &dsa_asn1_meth); - pkey->pkey = key; - return key != nullptr; + if (key == nullptr) { + return 0; + } + evp_pkey_set0(pkey, &dsa_asn1_meth, key); + return 1; } DSA *EVP_PKEY_get0_DSA(const EVP_PKEY *pkey) { - if (pkey->type != EVP_PKEY_DSA) { + if (EVP_PKEY_id(pkey) != EVP_PKEY_DSA) { OPENSSL_PUT_ERROR(EVP, EVP_R_EXPECTING_A_DSA_KEY); return nullptr; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ec.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ec.cc index 927696cc58..7d18762000 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ec.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ec.cc @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -25,19 +26,356 @@ #include #include #include +#include +#include "../ec/internal.h" #include "../fipsmodule/ec/internal.h" #include "../internal.h" #include "internal.h" +namespace { + +struct EVP_PKEY_ALG_EC : public EVP_PKEY_ALG { + // ec_group returns the |EC_GROUP| for this algorithm. + const EC_GROUP *(*ec_group)(); +}; + +extern const EVP_PKEY_ASN1_METHOD ec_asn1_meth; + +static int eckey_pub_encode(CBB *out, const EVP_PKEY *key) { + const EC_KEY *ec_key = reinterpret_cast(key->pkey); + const EC_GROUP *group = EC_KEY_get0_group(ec_key); + const EC_POINT *public_key = EC_KEY_get0_public_key(ec_key); + + // See RFC 5480, section 2. + CBB spki, algorithm, key_bitstring; + if (!CBB_add_asn1(out, &spki, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1(&spki, &algorithm, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, ec_asn1_meth.oid, + ec_asn1_meth.oid_len) || + !EC_KEY_marshal_curve_name(&algorithm, group) || + !CBB_add_asn1(&spki, &key_bitstring, CBS_ASN1_BITSTRING) || + !CBB_add_u8(&key_bitstring, 0 /* padding */) || + !EC_POINT_point2cbb(&key_bitstring, group, public_key, + POINT_CONVERSION_UNCOMPRESSED, nullptr) || + !CBB_flush(out)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); + return 0; + } + + return 1; +} + +static evp_decode_result_t eckey_pub_decode(const EVP_PKEY_ALG *alg, + EVP_PKEY *out, CBS *params, + CBS *key) { + // See RFC 5480, section 2. + + // Check that |params| matches |alg|. Only the namedCurve form is allowed. + const EC_GROUP *group = static_cast(alg)->ec_group(); + if (ec_key_parse_curve_name(params, bssl::Span(&group, 1)) == nullptr) { + if (ERR_equals(ERR_peek_last_error(), ERR_LIB_EC, EC_R_UNKNOWN_GROUP)) { + ERR_clear_error(); + return evp_decode_unsupported; + } + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + if (CBS_len(params) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + + bssl::UniquePtr eckey(EC_KEY_new()); + if (eckey == nullptr || // + !EC_KEY_set_group(eckey.get(), group) || + !EC_KEY_oct2key(eckey.get(), CBS_data(key), CBS_len(key), nullptr)) { + return evp_decode_error; + } + + EVP_PKEY_assign_EC_KEY(out, eckey.release()); + return evp_decode_ok; +} + +static int eckey_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { + const EC_KEY *a_ec = reinterpret_cast(a->pkey); + const EC_KEY *b_ec = reinterpret_cast(b->pkey); + const EC_GROUP *group = EC_KEY_get0_group(b_ec); + const EC_POINT *pa = EC_KEY_get0_public_key(a_ec), + *pb = EC_KEY_get0_public_key(b_ec); + int r = EC_POINT_cmp(group, pa, pb, nullptr); + if (r == 0) { + return 1; + } else if (r == 1) { + return 0; + } else { + return -2; + } +} + +static evp_decode_result_t eckey_priv_decode(const EVP_PKEY_ALG *alg, + EVP_PKEY *out, CBS *params, + CBS *key) { + // See RFC 5915. + const EC_GROUP *group = static_cast(alg)->ec_group(); + if (ec_key_parse_parameters(params, bssl::Span(&group, 1)) == nullptr) { + if (ERR_equals(ERR_peek_last_error(), ERR_LIB_EC, EC_R_UNKNOWN_GROUP)) { + ERR_clear_error(); + return evp_decode_unsupported; + } + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + if (CBS_len(params) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + + bssl::UniquePtr ec_key(ec_key_parse_private_key(key, group, {})); + if (ec_key == nullptr || CBS_len(key) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + + EVP_PKEY_assign_EC_KEY(out, ec_key.release()); + return evp_decode_ok; +} + +static int eckey_priv_encode(CBB *out, const EVP_PKEY *key) { + const EC_KEY *ec_key = reinterpret_cast(key->pkey); + + // Omit the redundant copy of the curve name. This contradicts RFC 5915 but + // aligns with PKCS #11. SEC 1 only says they may be omitted if known by other + // means. Both OpenSSL and NSS omit the redundant parameters, so we omit them + // as well. + unsigned enc_flags = EC_KEY_get_enc_flags(ec_key) | EC_PKEY_NO_PARAMETERS; + + // See RFC 5915. + CBB pkcs8, algorithm, private_key; + if (!CBB_add_asn1(out, &pkcs8, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_uint64(&pkcs8, 0 /* version */) || + !CBB_add_asn1(&pkcs8, &algorithm, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, ec_asn1_meth.oid, + ec_asn1_meth.oid_len) || + !EC_KEY_marshal_curve_name(&algorithm, EC_KEY_get0_group(ec_key)) || + !CBB_add_asn1(&pkcs8, &private_key, CBS_ASN1_OCTETSTRING) || + !EC_KEY_marshal_private_key(&private_key, ec_key, enc_flags) || + !CBB_flush(out)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); + return 0; + } + + return 1; +} + +static int eckey_set1_tls_encodedpoint(EVP_PKEY *pkey, const uint8_t *in, + size_t len) { + EC_KEY *ec_key = reinterpret_cast(pkey->pkey); + if (ec_key == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); + return 0; + } + + return EC_KEY_oct2key(ec_key, in, len, nullptr); +} + +static size_t eckey_get1_tls_encodedpoint(const EVP_PKEY *pkey, + uint8_t **out_ptr) { + const EC_KEY *ec_key = reinterpret_cast(pkey->pkey); + if (ec_key == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); + return 0; + } + + return EC_KEY_key2buf(ec_key, POINT_CONVERSION_UNCOMPRESSED, out_ptr, + nullptr); +} + +static int int_ec_size(const EVP_PKEY *pkey) { + const EC_KEY *ec_key = reinterpret_cast(pkey->pkey); + return ECDSA_size(ec_key); +} + +static int ec_bits(const EVP_PKEY *pkey) { + const EC_KEY *ec_key = reinterpret_cast(pkey->pkey); + const EC_GROUP *group = EC_KEY_get0_group(ec_key); + if (group == nullptr) { + ERR_clear_error(); + return 0; + } + return EC_GROUP_order_bits(group); +} + +static int ec_missing_parameters(const EVP_PKEY *pkey) { + const EC_KEY *ec_key = reinterpret_cast(pkey->pkey); + return ec_key == nullptr || EC_KEY_get0_group(ec_key) == nullptr; +} + +static int ec_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) { + const EC_KEY *from_key = reinterpret_cast(from->pkey); + if (from_key == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); + return 0; + } + const EC_GROUP *group = EC_KEY_get0_group(from_key); + if (group == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_MISSING_PARAMETERS); + return 0; + } + if (to->pkey == nullptr) { + to->pkey = EC_KEY_new(); + if (to->pkey == nullptr) { + return 0; + } + } + return EC_KEY_set_group(reinterpret_cast(to->pkey), group); +} + +static int ec_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b) { + const EC_KEY *a_ec = reinterpret_cast(a->pkey); + const EC_KEY *b_ec = reinterpret_cast(b->pkey); + if (a_ec == nullptr || b_ec == nullptr) { + return -2; + } + const EC_GROUP *group_a = EC_KEY_get0_group(a_ec), + *group_b = EC_KEY_get0_group(b_ec); + if (group_a == nullptr || group_b == nullptr) { + return -2; + } + if (EC_GROUP_cmp(group_a, group_b, nullptr) != 0) { + // mismatch + return 0; + } + return 1; +} + +static void int_ec_free(EVP_PKEY *pkey) { + EC_KEY_free(reinterpret_cast(pkey->pkey)); + pkey->pkey = nullptr; +} + +static int eckey_opaque(const EVP_PKEY *pkey) { + const EC_KEY *ec_key = reinterpret_cast(pkey->pkey); + return EC_KEY_is_opaque(ec_key); +} + +const EVP_PKEY_ASN1_METHOD ec_asn1_meth = { + EVP_PKEY_EC, + // 1.2.840.10045.2.1 + {0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01}, + 7, + + &ec_pkey_meth, + + eckey_pub_decode, + eckey_pub_encode, + eckey_pub_cmp, + + eckey_priv_decode, + eckey_priv_encode, + + /*set_priv_raw=*/nullptr, + /*set_priv_seed=*/nullptr, + /*set_pub_raw=*/nullptr, + /*get_priv_raw=*/nullptr, + /*get_priv_seed=*/nullptr, + /*get_pub_raw=*/nullptr, + eckey_set1_tls_encodedpoint, + eckey_get1_tls_encodedpoint, + + eckey_opaque, + + int_ec_size, + ec_bits, + + ec_missing_parameters, + ec_copy_parameters, + ec_cmp_parameters, + + int_ec_free, +}; + +} // namespace + +const EVP_PKEY_ALG *EVP_pkey_ec_p224(void) { + static const EVP_PKEY_ALG_EC kAlg = {{&ec_asn1_meth}, &EC_group_p224}; + return &kAlg; +} + +const EVP_PKEY_ALG *EVP_pkey_ec_p256(void) { + static const EVP_PKEY_ALG_EC kAlg = {{&ec_asn1_meth}, &EC_group_p256}; + return &kAlg; +} + +const EVP_PKEY_ALG *EVP_pkey_ec_p384(void) { + static const EVP_PKEY_ALG_EC kAlg = {{&ec_asn1_meth}, &EC_group_p384}; + return &kAlg; +} + +const EVP_PKEY_ALG *EVP_pkey_ec_p521(void) { + static const EVP_PKEY_ALG_EC kAlg = {{&ec_asn1_meth}, &EC_group_p521}; + return &kAlg; +} + +int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, EC_KEY *key) { + if (EVP_PKEY_assign_EC_KEY(pkey, key)) { + EC_KEY_up_ref(key); + return 1; + } + return 0; +} + +int EVP_PKEY_assign_EC_KEY(EVP_PKEY *pkey, EC_KEY *key) { + if (key == nullptr) { + return 0; + } + evp_pkey_set0(pkey, &ec_asn1_meth, key); + return 1; +} + +EC_KEY *EVP_PKEY_get0_EC_KEY(const EVP_PKEY *pkey) { + if (EVP_PKEY_id(pkey) != EVP_PKEY_EC) { + OPENSSL_PUT_ERROR(EVP, EVP_R_EXPECTING_A_EC_KEY); + return nullptr; + } + return reinterpret_cast(pkey->pkey); +} + +EC_KEY *EVP_PKEY_get1_EC_KEY(const EVP_PKEY *pkey) { + EC_KEY *ec_key = EVP_PKEY_get0_EC_KEY(pkey); + if (ec_key != nullptr) { + EC_KEY_up_ref(ec_key); + } + return ec_key; +} + +int EVP_PKEY_get_ec_curve_nid(const EVP_PKEY *pkey) { + const EC_KEY *ec_key = EVP_PKEY_get0_EC_KEY(pkey); + if (ec_key == nullptr) { + return NID_undef; + } + const EC_GROUP *group = EC_KEY_get0_group(ec_key); + if (group == nullptr) { + return NID_undef; + } + return EC_GROUP_get_curve_name(group); +} + +int EVP_PKEY_get_ec_point_conv_form(const EVP_PKEY *pkey) { + const EC_KEY *ec_key = EVP_PKEY_get0_EC_KEY(pkey); + if (ec_key == nullptr) { + return 0; + } + return EC_KEY_get_conv_form(ec_key); +} + typedef struct { // message digest const EVP_MD *md; const EC_GROUP *gen_group; } EC_PKEY_CTX; - static int pkey_ec_init(EVP_PKEY_CTX *ctx) { EC_PKEY_CTX *dctx = reinterpret_cast(OPENSSL_zalloc(sizeof(EC_PKEY_CTX))); @@ -115,7 +453,7 @@ static int pkey_ec_derive(EVP_PKEY_CTX *ctx, uint8_t *key, size_t *keylen) { // NB: unlike PKCS#3 DH, if *outlen is less than maximum size this is // not an error, the result is truncated. size_t outlen = *keylen; - int ret = ECDH_compute_key(key, outlen, pubkey, eckey, 0); + int ret = ECDH_compute_key(key, outlen, pubkey, eckey, nullptr); if (ret < 0) { return 0; } @@ -148,12 +486,8 @@ static int pkey_ec_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { // Default behaviour is OK return 1; - case EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID: { - const EC_GROUP *group = EC_GROUP_new_by_curve_name(p1); - if (group == NULL) { - return 0; - } - dctx->gen_group = group; + case EVP_PKEY_CTRL_EC_PARAMGEN_GROUP: { + dctx->gen_group = static_cast(p2); return 1; } @@ -166,15 +500,16 @@ static int pkey_ec_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { static int pkey_ec_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) { EC_PKEY_CTX *dctx = reinterpret_cast(ctx->data); const EC_GROUP *group = dctx->gen_group; - if (group == NULL) { - if (ctx->pkey == NULL) { + if (group == nullptr) { + if (ctx->pkey == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_NO_PARAMETERS_SET); return 0; } group = EC_KEY_get0_group(reinterpret_cast(ctx->pkey->pkey)); } EC_KEY *ec = EC_KEY_new(); - if (ec == NULL || !EC_KEY_set_group(ec, group) || !EC_KEY_generate_key(ec)) { + if (ec == nullptr || !EC_KEY_set_group(ec, group) || + !EC_KEY_generate_key(ec)) { EC_KEY_free(ec); return 0; } @@ -184,12 +519,12 @@ static int pkey_ec_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) { static int pkey_ec_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) { EC_PKEY_CTX *dctx = reinterpret_cast(ctx->data); - if (dctx->gen_group == NULL) { + if (dctx->gen_group == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_NO_PARAMETERS_SET); return 0; } EC_KEY *ec = EC_KEY_new(); - if (ec == NULL || !EC_KEY_set_group(ec, dctx->gen_group)) { + if (ec == nullptr || !EC_KEY_set_group(ec, dctx->gen_group)) { EC_KEY_free(ec); return 0; } @@ -197,27 +532,32 @@ static int pkey_ec_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) { return 1; } -const EVP_PKEY_METHOD ec_pkey_meth = { +const EVP_PKEY_CTX_METHOD ec_pkey_meth = { EVP_PKEY_EC, pkey_ec_init, pkey_ec_copy, pkey_ec_cleanup, pkey_ec_keygen, pkey_ec_sign, - NULL /* sign_message */, + nullptr /* sign_message */, pkey_ec_verify, - NULL /* verify_message */, - NULL /* verify_recover */, - NULL /* encrypt */, - NULL /* decrypt */, + nullptr /* verify_message */, + nullptr /* verify_recover */, + nullptr /* encrypt */, + nullptr /* decrypt */, pkey_ec_derive, pkey_ec_paramgen, pkey_ec_ctrl, }; int EVP_PKEY_CTX_set_ec_paramgen_curve_nid(EVP_PKEY_CTX *ctx, int nid) { + const EC_GROUP *group = EC_GROUP_new_by_curve_name(nid); + if (group == nullptr) { + return 0; + } return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, EVP_PKEY_OP_TYPE_GEN, - EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL); + EVP_PKEY_CTRL_EC_PARAMGEN_GROUP, 0, + const_cast(group)); } int EVP_PKEY_CTX_set_ec_param_enc(EVP_PKEY_CTX *ctx, int encoding) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ec_asn1.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ec_asn1.cc deleted file mode 100644 index d3e4b4051e..0000000000 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ec_asn1.cc +++ /dev/null @@ -1,307 +0,0 @@ -// Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.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 - -#include -#include -#include -#include -#include -#include -#include - -#include "internal.h" - - -static int eckey_pub_encode(CBB *out, const EVP_PKEY *key) { - const EC_KEY *ec_key = reinterpret_cast(key->pkey); - const EC_GROUP *group = EC_KEY_get0_group(ec_key); - const EC_POINT *public_key = EC_KEY_get0_public_key(ec_key); - - // See RFC 5480, section 2. - CBB spki, algorithm, key_bitstring; - if (!CBB_add_asn1(out, &spki, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1(&spki, &algorithm, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, ec_asn1_meth.oid, - ec_asn1_meth.oid_len) || - !EC_KEY_marshal_curve_name(&algorithm, group) || - !CBB_add_asn1(&spki, &key_bitstring, CBS_ASN1_BITSTRING) || - !CBB_add_u8(&key_bitstring, 0 /* padding */) || - !EC_POINT_point2cbb(&key_bitstring, group, public_key, - POINT_CONVERSION_UNCOMPRESSED, NULL) || - !CBB_flush(out)) { - OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); - return 0; - } - - return 1; -} - -static int eckey_pub_decode(EVP_PKEY *out, CBS *params, CBS *key) { - // See RFC 5480, section 2. - - // The parameters are a named curve. - const EC_GROUP *group = EC_KEY_parse_curve_name(params); - if (group == NULL || CBS_len(params) != 0) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; - } - - bssl::UniquePtr eckey(EC_KEY_new()); - if (eckey == nullptr || // - !EC_KEY_set_group(eckey.get(), group) || - !EC_KEY_oct2key(eckey.get(), CBS_data(key), CBS_len(key), nullptr)) { - return 0; - } - - EVP_PKEY_assign_EC_KEY(out, eckey.release()); - return 1; -} - -static int eckey_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { - const EC_KEY *a_ec = reinterpret_cast(a->pkey); - const EC_KEY *b_ec = reinterpret_cast(b->pkey); - const EC_GROUP *group = EC_KEY_get0_group(b_ec); - const EC_POINT *pa = EC_KEY_get0_public_key(a_ec), - *pb = EC_KEY_get0_public_key(b_ec); - int r = EC_POINT_cmp(group, pa, pb, NULL); - if (r == 0) { - return 1; - } else if (r == 1) { - return 0; - } else { - return -2; - } -} - -static int eckey_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) { - // See RFC 5915. - const EC_GROUP *group = EC_KEY_parse_parameters(params); - if (group == NULL || CBS_len(params) != 0) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; - } - - EC_KEY *ec_key = EC_KEY_parse_private_key(key, group); - if (ec_key == NULL || CBS_len(key) != 0) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - EC_KEY_free(ec_key); - return 0; - } - - EVP_PKEY_assign_EC_KEY(out, ec_key); - return 1; -} - -static int eckey_priv_encode(CBB *out, const EVP_PKEY *key) { - const EC_KEY *ec_key = reinterpret_cast(key->pkey); - - // Omit the redundant copy of the curve name. This contradicts RFC 5915 but - // aligns with PKCS #11. SEC 1 only says they may be omitted if known by other - // means. Both OpenSSL and NSS omit the redundant parameters, so we omit them - // as well. - unsigned enc_flags = EC_KEY_get_enc_flags(ec_key) | EC_PKEY_NO_PARAMETERS; - - // See RFC 5915. - CBB pkcs8, algorithm, private_key; - if (!CBB_add_asn1(out, &pkcs8, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1_uint64(&pkcs8, 0 /* version */) || - !CBB_add_asn1(&pkcs8, &algorithm, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, ec_asn1_meth.oid, - ec_asn1_meth.oid_len) || - !EC_KEY_marshal_curve_name(&algorithm, EC_KEY_get0_group(ec_key)) || - !CBB_add_asn1(&pkcs8, &private_key, CBS_ASN1_OCTETSTRING) || - !EC_KEY_marshal_private_key(&private_key, ec_key, enc_flags) || - !CBB_flush(out)) { - OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); - return 0; - } - - return 1; -} - -static int eckey_set1_tls_encodedpoint(EVP_PKEY *pkey, const uint8_t *in, - size_t len) { - EC_KEY *ec_key = reinterpret_cast(pkey->pkey); - if (ec_key == NULL) { - OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); - return 0; - } - - return EC_KEY_oct2key(ec_key, in, len, NULL); -} - -static size_t eckey_get1_tls_encodedpoint(const EVP_PKEY *pkey, - uint8_t **out_ptr) { - const EC_KEY *ec_key = reinterpret_cast(pkey->pkey); - if (ec_key == NULL) { - OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); - return 0; - } - - return EC_KEY_key2buf(ec_key, POINT_CONVERSION_UNCOMPRESSED, out_ptr, NULL); -} - -static int int_ec_size(const EVP_PKEY *pkey) { - const EC_KEY *ec_key = reinterpret_cast(pkey->pkey); - return ECDSA_size(ec_key); -} - -static int ec_bits(const EVP_PKEY *pkey) { - const EC_KEY *ec_key = reinterpret_cast(pkey->pkey); - const EC_GROUP *group = EC_KEY_get0_group(ec_key); - if (group == NULL) { - ERR_clear_error(); - return 0; - } - return EC_GROUP_order_bits(group); -} - -static int ec_missing_parameters(const EVP_PKEY *pkey) { - const EC_KEY *ec_key = reinterpret_cast(pkey->pkey); - return ec_key == NULL || EC_KEY_get0_group(ec_key) == NULL; -} - -static int ec_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) { - const EC_KEY *from_key = reinterpret_cast(from->pkey); - if (from_key == NULL) { - OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); - return 0; - } - const EC_GROUP *group = EC_KEY_get0_group(from_key); - if (group == NULL) { - OPENSSL_PUT_ERROR(EVP, EVP_R_MISSING_PARAMETERS); - return 0; - } - if (to->pkey == NULL) { - to->pkey = EC_KEY_new(); - if (to->pkey == NULL) { - return 0; - } - } - return EC_KEY_set_group(reinterpret_cast(to->pkey), group); -} - -static int ec_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b) { - const EC_KEY *a_ec = reinterpret_cast(a->pkey); - const EC_KEY *b_ec = reinterpret_cast(b->pkey); - if (a_ec == NULL || b_ec == NULL) { - return -2; - } - const EC_GROUP *group_a = EC_KEY_get0_group(a_ec), - *group_b = EC_KEY_get0_group(b_ec); - if (group_a == NULL || group_b == NULL) { - return -2; - } - if (EC_GROUP_cmp(group_a, group_b, NULL) != 0) { - // mismatch - return 0; - } - return 1; -} - -static void int_ec_free(EVP_PKEY *pkey) { - EC_KEY_free(reinterpret_cast(pkey->pkey)); - pkey->pkey = NULL; -} - -static int eckey_opaque(const EVP_PKEY *pkey) { - const EC_KEY *ec_key = reinterpret_cast(pkey->pkey); - return EC_KEY_is_opaque(ec_key); -} - -const EVP_PKEY_ASN1_METHOD ec_asn1_meth = { - EVP_PKEY_EC, - // 1.2.840.10045.2.1 - {0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01}, - 7, - - &ec_pkey_meth, - - eckey_pub_decode, - eckey_pub_encode, - eckey_pub_cmp, - - eckey_priv_decode, - eckey_priv_encode, - - /*set_priv_raw=*/NULL, - /*set_pub_raw=*/NULL, - /*get_priv_raw=*/NULL, - /*get_pub_raw=*/NULL, - eckey_set1_tls_encodedpoint, - eckey_get1_tls_encodedpoint, - - eckey_opaque, - - int_ec_size, - ec_bits, - - ec_missing_parameters, - ec_copy_parameters, - ec_cmp_parameters, - - int_ec_free, -}; - -int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, EC_KEY *key) { - if (EVP_PKEY_assign_EC_KEY(pkey, key)) { - EC_KEY_up_ref(key); - return 1; - } - return 0; -} - -int EVP_PKEY_assign_EC_KEY(EVP_PKEY *pkey, EC_KEY *key) { - evp_pkey_set_method(pkey, &ec_asn1_meth); - pkey->pkey = key; - return key != NULL; -} - -EC_KEY *EVP_PKEY_get0_EC_KEY(const EVP_PKEY *pkey) { - if (pkey->type != EVP_PKEY_EC) { - OPENSSL_PUT_ERROR(EVP, EVP_R_EXPECTING_AN_EC_KEY_KEY); - return NULL; - } - return reinterpret_cast(pkey->pkey); -} - -EC_KEY *EVP_PKEY_get1_EC_KEY(const EVP_PKEY *pkey) { - EC_KEY *ec_key = EVP_PKEY_get0_EC_KEY(pkey); - if (ec_key != NULL) { - EC_KEY_up_ref(ec_key); - } - return ec_key; -} - -int EVP_PKEY_get_ec_curve_nid(const EVP_PKEY *pkey) { - const EC_KEY *ec_key = EVP_PKEY_get0_EC_KEY(pkey); - if (ec_key == nullptr) { - return NID_undef; - } - const EC_GROUP *group = EC_KEY_get0_group(ec_key); - if (group == nullptr) { - return NID_undef; - } - return EC_GROUP_get_curve_name(group); -} - -int EVP_PKEY_get_ec_point_conv_form(const EVP_PKEY *pkey) { - const EC_KEY *ec_key = EVP_PKEY_get0_EC_KEY(pkey); - if (ec_key == nullptr) { - return 0; - } - return EC_KEY_get_conv_form(ec_key); -} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ed25519.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ed25519.cc index 204133d097..fc2d979245 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ed25519.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ed25519.cc @@ -14,12 +14,235 @@ #include +#include #include #include #include +#include "../internal.h" #include "internal.h" +namespace { + +struct ED25519_KEY { + // key is the concatenation of the private seed and public key. It is stored + // as a single 64-bit array to allow passing to |ED25519_sign|. If + // |has_private| is false, the first 32 bytes are uninitialized and the public + // key is in the last 32 bytes. + uint8_t key[64]; + bool has_private; +}; + +extern const EVP_PKEY_ASN1_METHOD ed25519_asn1_meth; + +#define ED25519_PUBLIC_KEY_OFFSET 32 + +static void ed25519_free(EVP_PKEY *pkey) { + OPENSSL_free(pkey->pkey); + pkey->pkey = nullptr; +} + +static int ed25519_set_priv_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { + if (len != 32) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return 0; + } + + ED25519_KEY *key = + reinterpret_cast(OPENSSL_malloc(sizeof(ED25519_KEY))); + if (key == nullptr) { + return 0; + } + + // The RFC 8032 encoding stores only the 32-byte seed, so we must recover the + // full representation which we use from it. + uint8_t pubkey_unused[32]; + ED25519_keypair_from_seed(pubkey_unused, key->key, in); + key->has_private = true; + evp_pkey_set0(pkey, &ed25519_asn1_meth, key); + return 1; +} + +static int ed25519_set_pub_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { + if (len != 32) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return 0; + } + + ED25519_KEY *key = + reinterpret_cast(OPENSSL_malloc(sizeof(ED25519_KEY))); + if (key == nullptr) { + return 0; + } + + OPENSSL_memcpy(key->key + ED25519_PUBLIC_KEY_OFFSET, in, 32); + key->has_private = false; + evp_pkey_set0(pkey, &ed25519_asn1_meth, key); + return 1; +} + +static int ed25519_get_priv_raw(const EVP_PKEY *pkey, uint8_t *out, + size_t *out_len) { + const ED25519_KEY *key = reinterpret_cast(pkey->pkey); + if (!key->has_private) { + OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); + return 0; + } + + if (out == nullptr) { + *out_len = 32; + return 1; + } + + if (*out_len < 32) { + OPENSSL_PUT_ERROR(EVP, EVP_R_BUFFER_TOO_SMALL); + return 0; + } + + // The raw private key format is the first 32 bytes of the private key. + OPENSSL_memcpy(out, key->key, 32); + *out_len = 32; + return 1; +} + +static int ed25519_get_pub_raw(const EVP_PKEY *pkey, uint8_t *out, + size_t *out_len) { + const ED25519_KEY *key = reinterpret_cast(pkey->pkey); + if (out == nullptr) { + *out_len = 32; + return 1; + } + + if (*out_len < 32) { + OPENSSL_PUT_ERROR(EVP, EVP_R_BUFFER_TOO_SMALL); + return 0; + } + + OPENSSL_memcpy(out, key->key + ED25519_PUBLIC_KEY_OFFSET, 32); + *out_len = 32; + return 1; +} + +static evp_decode_result_t ed25519_pub_decode(const EVP_PKEY_ALG *alg, + EVP_PKEY *out, CBS *params, + CBS *key) { + // See RFC 8410, section 4. + + // The parameters must be omitted. Public keys have length 32. + if (CBS_len(params) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + + return ed25519_set_pub_raw(out, CBS_data(key), CBS_len(key)) + ? evp_decode_ok + : evp_decode_error; +} + +static int ed25519_pub_encode(CBB *out, const EVP_PKEY *pkey) { + const ED25519_KEY *key = reinterpret_cast(pkey->pkey); + + // See RFC 8410, section 4. + CBB spki, algorithm, key_bitstring; + if (!CBB_add_asn1(out, &spki, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1(&spki, &algorithm, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, ed25519_asn1_meth.oid, + ed25519_asn1_meth.oid_len) || + !CBB_add_asn1(&spki, &key_bitstring, CBS_ASN1_BITSTRING) || + !CBB_add_u8(&key_bitstring, 0 /* padding */) || + !CBB_add_bytes(&key_bitstring, key->key + ED25519_PUBLIC_KEY_OFFSET, + 32) || + !CBB_flush(out)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); + return 0; + } + + return 1; +} + +static int ed25519_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { + const ED25519_KEY *a_key = reinterpret_cast(a->pkey); + const ED25519_KEY *b_key = reinterpret_cast(b->pkey); + return OPENSSL_memcmp(a_key->key + ED25519_PUBLIC_KEY_OFFSET, + b_key->key + ED25519_PUBLIC_KEY_OFFSET, 32) == 0; +} + +static evp_decode_result_t ed25519_priv_decode(const EVP_PKEY_ALG *alg, + EVP_PKEY *out, CBS *params, + CBS *key) { + // See RFC 8410, section 7. + + // Parameters must be empty. The key is a 32-byte value wrapped in an extra + // OCTET STRING layer. + CBS inner; + if (CBS_len(params) != 0 || + !CBS_get_asn1(key, &inner, CBS_ASN1_OCTETSTRING) || CBS_len(key) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + + return ed25519_set_priv_raw(out, CBS_data(&inner), CBS_len(&inner)) + ? evp_decode_ok + : evp_decode_error; +} + +static int ed25519_priv_encode(CBB *out, const EVP_PKEY *pkey) { + const ED25519_KEY *key = reinterpret_cast(pkey->pkey); + if (!key->has_private) { + OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); + return 0; + } + + // See RFC 8410, section 7. + CBB pkcs8, algorithm, private_key, inner; + if (!CBB_add_asn1(out, &pkcs8, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_uint64(&pkcs8, 0 /* version */) || + !CBB_add_asn1(&pkcs8, &algorithm, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, ed25519_asn1_meth.oid, + ed25519_asn1_meth.oid_len) || + !CBB_add_asn1(&pkcs8, &private_key, CBS_ASN1_OCTETSTRING) || + !CBB_add_asn1(&private_key, &inner, CBS_ASN1_OCTETSTRING) || + // The PKCS#8 encoding stores only the 32-byte seed which is the first 32 + // bytes of the private key. + !CBB_add_bytes(&inner, key->key, 32) || // + !CBB_flush(out)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); + return 0; + } + + return 1; +} + +static int ed25519_size(const EVP_PKEY *pkey) { return 64; } + +static int ed25519_bits(const EVP_PKEY *pkey) { return 253; } + +const EVP_PKEY_ASN1_METHOD ed25519_asn1_meth = { + EVP_PKEY_ED25519, + {0x2b, 0x65, 0x70}, + 3, + &ed25519_pkey_meth, + ed25519_pub_decode, + ed25519_pub_encode, + ed25519_pub_cmp, + ed25519_priv_decode, + ed25519_priv_encode, + ed25519_set_priv_raw, + /*set_priv_seed=*/nullptr, + ed25519_set_pub_raw, + ed25519_get_priv_raw, + /*get_priv_seed=*/nullptr, + ed25519_get_pub_raw, + /*set1_tls_encodedpoint=*/nullptr, + /*get1_tls_encodedpoint=*/nullptr, + /*pkey_opaque=*/nullptr, + ed25519_size, + ed25519_bits, + /*param_missing=*/nullptr, + /*param_copy=*/nullptr, + /*param_cmp=*/nullptr, + ed25519_free, +}; // Ed25519 has no parameters to copy. static int pkey_ed25519_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { return 1; } @@ -27,18 +250,15 @@ static int pkey_ed25519_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { return 1; } static int pkey_ed25519_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) { ED25519_KEY *key = reinterpret_cast(OPENSSL_malloc(sizeof(ED25519_KEY))); - if (key == NULL) { + if (key == nullptr) { return 0; } - evp_pkey_set_method(pkey, &ed25519_asn1_meth); - uint8_t pubkey_unused[32]; ED25519_keypair(pubkey_unused, key->key); - key->has_private = 1; + key->has_private = true; - OPENSSL_free(pkey->pkey); - pkey->pkey = key; + evp_pkey_set0(pkey, &ed25519_asn1_meth, key); return 1; } @@ -52,7 +272,7 @@ static int pkey_ed25519_sign_message(EVP_PKEY_CTX *ctx, uint8_t *sig, return 0; } - if (sig == NULL) { + if (sig == nullptr) { *siglen = 64; return 1; } @@ -84,7 +304,9 @@ static int pkey_ed25519_verify_message(EVP_PKEY_CTX *ctx, const uint8_t *sig, return 1; } -const EVP_PKEY_METHOD ed25519_pkey_meth = { +} // namespace + +const EVP_PKEY_CTX_METHOD ed25519_pkey_meth = { /*pkey_id=*/EVP_PKEY_ED25519, /*init=*/nullptr, /*copy=*/pkey_ed25519_copy, @@ -101,3 +323,8 @@ const EVP_PKEY_METHOD ed25519_pkey_meth = { /*paramgen=*/nullptr, /*ctrl=*/nullptr, }; + +const EVP_PKEY_ALG *EVP_pkey_ed25519(void) { + static const EVP_PKEY_ALG kAlg = {&ed25519_asn1_meth}; + return &kAlg; +} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ed25519_asn1.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ed25519_asn1.cc deleted file mode 100644 index 8053422867..0000000000 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_ed25519_asn1.cc +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright 2017 The BoringSSL Authors -// -// Licensed under the Apache License, Version 2.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 - -#include -#include -#include -#include - -#include "../internal.h" -#include "internal.h" - - -static void ed25519_free(EVP_PKEY *pkey) { - OPENSSL_free(pkey->pkey); - pkey->pkey = NULL; -} - -static int ed25519_set_priv_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { - if (len != 32) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; - } - - ED25519_KEY *key = - reinterpret_cast(OPENSSL_malloc(sizeof(ED25519_KEY))); - if (key == NULL) { - return 0; - } - - // The RFC 8032 encoding stores only the 32-byte seed, so we must recover the - // full representation which we use from it. - uint8_t pubkey_unused[32]; - ED25519_keypair_from_seed(pubkey_unused, key->key, in); - key->has_private = 1; - - ed25519_free(pkey); - pkey->pkey = key; - return 1; -} - -static int ed25519_set_pub_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { - if (len != 32) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; - } - - ED25519_KEY *key = - reinterpret_cast(OPENSSL_malloc(sizeof(ED25519_KEY))); - if (key == NULL) { - return 0; - } - - OPENSSL_memcpy(key->key + ED25519_PUBLIC_KEY_OFFSET, in, 32); - key->has_private = 0; - - ed25519_free(pkey); - pkey->pkey = key; - return 1; -} - -static int ed25519_get_priv_raw(const EVP_PKEY *pkey, uint8_t *out, - size_t *out_len) { - const ED25519_KEY *key = reinterpret_cast(pkey->pkey); - if (!key->has_private) { - OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); - return 0; - } - - if (out == NULL) { - *out_len = 32; - return 1; - } - - if (*out_len < 32) { - OPENSSL_PUT_ERROR(EVP, EVP_R_BUFFER_TOO_SMALL); - return 0; - } - - // The raw private key format is the first 32 bytes of the private key. - OPENSSL_memcpy(out, key->key, 32); - *out_len = 32; - return 1; -} - -static int ed25519_get_pub_raw(const EVP_PKEY *pkey, uint8_t *out, - size_t *out_len) { - const ED25519_KEY *key = reinterpret_cast(pkey->pkey); - if (out == NULL) { - *out_len = 32; - return 1; - } - - if (*out_len < 32) { - OPENSSL_PUT_ERROR(EVP, EVP_R_BUFFER_TOO_SMALL); - return 0; - } - - OPENSSL_memcpy(out, key->key + ED25519_PUBLIC_KEY_OFFSET, 32); - *out_len = 32; - return 1; -} - -static int ed25519_pub_decode(EVP_PKEY *out, CBS *params, CBS *key) { - // See RFC 8410, section 4. - - // The parameters must be omitted. Public keys have length 32. - if (CBS_len(params) != 0) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; - } - - return ed25519_set_pub_raw(out, CBS_data(key), CBS_len(key)); -} - -static int ed25519_pub_encode(CBB *out, const EVP_PKEY *pkey) { - const ED25519_KEY *key = reinterpret_cast(pkey->pkey); - - // See RFC 8410, section 4. - CBB spki, algorithm, key_bitstring; - if (!CBB_add_asn1(out, &spki, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1(&spki, &algorithm, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, ed25519_asn1_meth.oid, - ed25519_asn1_meth.oid_len) || - !CBB_add_asn1(&spki, &key_bitstring, CBS_ASN1_BITSTRING) || - !CBB_add_u8(&key_bitstring, 0 /* padding */) || - !CBB_add_bytes(&key_bitstring, key->key + ED25519_PUBLIC_KEY_OFFSET, - 32) || - !CBB_flush(out)) { - OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); - return 0; - } - - return 1; -} - -static int ed25519_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { - const ED25519_KEY *a_key = reinterpret_cast(a->pkey); - const ED25519_KEY *b_key = reinterpret_cast(b->pkey); - return OPENSSL_memcmp(a_key->key + ED25519_PUBLIC_KEY_OFFSET, - b_key->key + ED25519_PUBLIC_KEY_OFFSET, 32) == 0; -} - -static int ed25519_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) { - // See RFC 8410, section 7. - - // Parameters must be empty. The key is a 32-byte value wrapped in an extra - // OCTET STRING layer. - CBS inner; - if (CBS_len(params) != 0 || - !CBS_get_asn1(key, &inner, CBS_ASN1_OCTETSTRING) || CBS_len(key) != 0) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; - } - - return ed25519_set_priv_raw(out, CBS_data(&inner), CBS_len(&inner)); -} - -static int ed25519_priv_encode(CBB *out, const EVP_PKEY *pkey) { - const ED25519_KEY *key = reinterpret_cast(pkey->pkey); - if (!key->has_private) { - OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); - return 0; - } - - // See RFC 8410, section 7. - CBB pkcs8, algorithm, private_key, inner; - if (!CBB_add_asn1(out, &pkcs8, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1_uint64(&pkcs8, 0 /* version */) || - !CBB_add_asn1(&pkcs8, &algorithm, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, ed25519_asn1_meth.oid, - ed25519_asn1_meth.oid_len) || - !CBB_add_asn1(&pkcs8, &private_key, CBS_ASN1_OCTETSTRING) || - !CBB_add_asn1(&private_key, &inner, CBS_ASN1_OCTETSTRING) || - // The PKCS#8 encoding stores only the 32-byte seed which is the first 32 - // bytes of the private key. - !CBB_add_bytes(&inner, key->key, 32) || // - !CBB_flush(out)) { - OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); - return 0; - } - - return 1; -} - -static int ed25519_size(const EVP_PKEY *pkey) { return 64; } - -static int ed25519_bits(const EVP_PKEY *pkey) { return 253; } - -const EVP_PKEY_ASN1_METHOD ed25519_asn1_meth = { - EVP_PKEY_ED25519, - {0x2b, 0x65, 0x70}, - 3, - &ed25519_pkey_meth, - ed25519_pub_decode, - ed25519_pub_encode, - ed25519_pub_cmp, - ed25519_priv_decode, - ed25519_priv_encode, - ed25519_set_priv_raw, - ed25519_set_pub_raw, - ed25519_get_priv_raw, - ed25519_get_pub_raw, - /*set1_tls_encodedpoint=*/NULL, - /*get1_tls_encodedpoint=*/NULL, - /*pkey_opaque=*/NULL, - ed25519_size, - ed25519_bits, - /*param_missing=*/NULL, - /*param_copy=*/NULL, - /*param_cmp=*/NULL, - ed25519_free, -}; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_hkdf.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_hkdf.cc index 0f816bb331..f0d793dffb 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_hkdf.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_hkdf.cc @@ -37,7 +37,7 @@ typedef struct { static int pkey_hkdf_init(EVP_PKEY_CTX *ctx) { HKDF_PKEY_CTX *hctx = reinterpret_cast(OPENSSL_zalloc(sizeof(HKDF_PKEY_CTX))); - if (hctx == NULL) { + if (hctx == nullptr) { return 0; } @@ -64,7 +64,7 @@ static int pkey_hkdf_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { if (hctx_src->key_len != 0) { hctx_dst->key = reinterpret_cast( OPENSSL_memdup(hctx_src->key, hctx_src->key_len)); - if (hctx_dst->key == NULL) { + if (hctx_dst->key == nullptr) { return 0; } hctx_dst->key_len = hctx_src->key_len; @@ -73,7 +73,7 @@ static int pkey_hkdf_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { if (hctx_src->salt_len != 0) { hctx_dst->salt = reinterpret_cast( OPENSSL_memdup(hctx_src->salt, hctx_src->salt_len)); - if (hctx_dst->salt == NULL) { + if (hctx_dst->salt == nullptr) { return 0; } hctx_dst->salt_len = hctx_src->salt_len; @@ -89,18 +89,18 @@ static int pkey_hkdf_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { static void pkey_hkdf_cleanup(EVP_PKEY_CTX *ctx) { HKDF_PKEY_CTX *hctx = reinterpret_cast(ctx->data); - if (hctx != NULL) { + if (hctx != nullptr) { OPENSSL_free(hctx->key); OPENSSL_free(hctx->salt); CBB_cleanup(&hctx->info); OPENSSL_free(hctx); - ctx->data = NULL; + ctx->data = nullptr; } } static int pkey_hkdf_derive(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *out_len) { HKDF_PKEY_CTX *hctx = reinterpret_cast(ctx->data); - if (hctx->md == NULL) { + if (hctx->md == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_MISSING_PARAMETERS); return 0; } @@ -109,7 +109,7 @@ static int pkey_hkdf_derive(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *out_len) { return 0; } - if (out == NULL) { + if (out == nullptr) { if (hctx->mode == EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY) { *out_len = EVP_MD_size(hctx->md); } @@ -183,27 +183,23 @@ static int pkey_hkdf_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { } } -const EVP_PKEY_METHOD hkdf_pkey_meth = { - /*pkey_id=*/EVP_PKEY_HKDF, - pkey_hkdf_init, - pkey_hkdf_copy, +const EVP_PKEY_CTX_METHOD hkdf_pkey_meth = { + /*pkey_id=*/EVP_PKEY_HKDF, pkey_hkdf_init, pkey_hkdf_copy, pkey_hkdf_cleanup, - /*keygen=*/NULL, - /*sign=*/NULL, - /*sign_message=*/NULL, - /*verify=*/NULL, - /*verify_message=*/NULL, - /*verify_recover=*/NULL, - /*encrypt=*/NULL, - /*decrypt=*/NULL, - pkey_hkdf_derive, - /*paramgen=*/NULL, - pkey_hkdf_ctrl, + /*keygen=*/nullptr, + /*sign=*/nullptr, + /*sign_message=*/nullptr, + /*verify=*/nullptr, + /*verify_message=*/nullptr, + /*verify_recover=*/nullptr, + /*encrypt=*/nullptr, + /*decrypt=*/nullptr, pkey_hkdf_derive, + /*paramgen=*/nullptr, pkey_hkdf_ctrl, }; int EVP_PKEY_CTX_hkdf_mode(EVP_PKEY_CTX *ctx, int mode) { return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_HKDF, EVP_PKEY_OP_DERIVE, - EVP_PKEY_CTRL_HKDF_MODE, mode, NULL); + EVP_PKEY_CTRL_HKDF_MODE, mode, nullptr); } int EVP_PKEY_CTX_set_hkdf_md(EVP_PKEY_CTX *ctx, const EVP_MD *md) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_mldsa.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_mldsa.cc new file mode 100644 index 0000000000..ae6583ca1c --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_mldsa.cc @@ -0,0 +1,457 @@ +// Copyright 2025 The BoringSSL Authors +// +// Licensed under the Apache License, Version 2.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 + +#include + +#include +#include +#include +#include +#include + +#include "../fipsmodule/bcm_interface.h" +#include "../mem_internal.h" +#include "internal.h" + +namespace { + +constexpr CBS_ASN1_TAG kSeedTag = CBS_ASN1_CONTEXT_SPECIFIC | 0; + +constexpr uint8_t kMLDSA44OID[] = {OBJ_ENC_ML_DSA_44}; +constexpr uint8_t kMLDSA65OID[] = {OBJ_ENC_ML_DSA_65}; +constexpr uint8_t kMLDSA87OID[] = {OBJ_ENC_ML_DSA_87}; + +// We must generate EVP bindings for three ML-DSA algorithms. Define a traits +// type that captures the functions and other parameters of an ML-DSA algorithm. +#define MAKE_MLDSA_TRAITS(kl) \ + struct MLDSA##kl##Traits { \ + using PublicKey = MLDSA##kl##_public_key; \ + using PrivateKey = MLDSA##kl##_private_key; \ + static constexpr size_t kPublicKeyBytes = MLDSA##kl##_PUBLIC_KEY_BYTES; \ + static constexpr size_t kSignatureBytes = MLDSA##kl##_SIGNATURE_BYTES; \ + static constexpr int kType = EVP_PKEY_ML_DSA_##kl; \ + static constexpr bssl::Span kOID = kMLDSA##kl##OID; \ + static constexpr auto PrivateKeyFromSeed = \ + &MLDSA##kl##_private_key_from_seed; \ + static constexpr auto Sign = &MLDSA##kl##_sign; \ + static constexpr auto ParsePublicKey = &MLDSA##kl##_parse_public_key; \ + static constexpr auto PublicOfPrivate = \ + &BCM_mldsa##kl##_public_of_private; \ + static constexpr auto MarshalPublicKey = &MLDSA##kl##_marshal_public_key; \ + static constexpr auto PublicKeysEqual = \ + &BCM_mldsa##kl##_public_keys_equal; \ + static constexpr auto Verify = &MLDSA##kl##_verify; \ + }; + +MAKE_MLDSA_TRAITS(44) +MAKE_MLDSA_TRAITS(65) +MAKE_MLDSA_TRAITS(87) + +// For each ML-DSA variant, the |EVP_PKEY| must hold a public or private key. +// EVP uses the same type for public and private keys, so the representation +// must support both. The private key type contains the public key struct in it, +// so we use a pointer to either a PrivateKeyData or +// PublicKeyData, with a common base class to dispatch between them. +// +// TODO(crbug.com/404286922): In C++20, we need fewer |typename|s in front of +// dependent type names. + +template +class PrivateKeyData; + +template +class KeyData { + public: + // Returns the underlying public key for the key. + const typename Traits::PublicKey *GetPublicKey() const; + + // Returns the PrivateKeyData struct for the key, or nullptr if this is a + // public key. + PrivateKeyData *AsPrivateKeyData(); + const PrivateKeyData *AsPrivateKeyData() const { + return const_cast(this)->AsPrivateKeyData(); + } + + // A KeyData cannot be freed directly. Rather, it must use this wrapper which + // calls the correct subclass's destructor. + static void Free(KeyData *data); + + protected: + explicit KeyData(bool is_private) : is_private_(is_private) {} + ~KeyData() = default; + bool is_private_; +}; + +template +class PublicKeyData : public KeyData { + public: + enum { kAllowUniquePtr = true }; + PublicKeyData() : KeyData(/*is_private=*/false) {} + typename Traits::PublicKey pub; +}; + +template +class PrivateKeyData : public KeyData { + public: + enum { kAllowUniquePtr = true }; + PrivateKeyData() : KeyData(/*is_private=*/true) {} + typename Traits::PrivateKey priv; + uint8_t seed[MLDSA_SEED_BYTES]; +}; + +template +const typename Traits::PublicKey *KeyData::GetPublicKey() const { + auto *priv_data = AsPrivateKeyData(); + if (priv_data != nullptr) { + return Traits::PublicOfPrivate(&priv_data->priv); + } + return &static_cast *>(this)->pub; +} + +template +PrivateKeyData *KeyData::AsPrivateKeyData() { + if (is_private_) { + return static_cast *>(this); + } + return nullptr; +} + +template +void KeyData::Free(KeyData *data) { + if (data == nullptr) { + return; + } + // Delete the more specific subclass. This is moot for now, because neither + // type has a non-trivial destructor. + auto *priv_data = data->AsPrivateKeyData(); + if (priv_data) { + bssl::Delete(priv_data); + } else { + bssl::Delete(static_cast *>(data)); + } +} + +// Finally, MLDSAImplementation instantiates the methods themselves. + +template +struct MLDSAImplementation { + static KeyData *GetKeyData(EVP_PKEY *pkey) { + assert(pkey->ameth == &asn1_method); + return static_cast *>(pkey->pkey); + } + + static const KeyData *GetKeyData(const EVP_PKEY *pkey) { + return GetKeyData(const_cast(pkey)); + } + + static void PkeyFree(EVP_PKEY *pkey) { + KeyData::Free(GetKeyData(pkey)); + pkey->pkey = nullptr; + } + + static int SetPrivateSeed(EVP_PKEY *pkey, const uint8_t *in, size_t len) { + auto priv = bssl::MakeUnique>(); + if (priv == nullptr) { + return 0; + } + + if (len != MLDSA_SEED_BYTES || + !Traits::PrivateKeyFromSeed(&priv->priv, in, len)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return 0; + } + OPENSSL_memcpy(priv->seed, in, len); + evp_pkey_set0(pkey, &asn1_method, priv.release()); + return 1; + } + + static int SetRawPublic(EVP_PKEY *pkey, const uint8_t *in, size_t len) { + auto pub = bssl::MakeUnique>(); + if (pub == nullptr) { + return 0; + } + CBS cbs; + CBS_init(&cbs, in, len); + if (!Traits::ParsePublicKey(&pub->pub, &cbs) || CBS_len(&cbs) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return 0; + } + evp_pkey_set0(pkey, &asn1_method, pub.release()); + return 1; + } + + static int GetPrivateSeed(const EVP_PKEY *pkey, uint8_t *out, + size_t *out_len) { + const auto *priv = GetKeyData(pkey)->AsPrivateKeyData(); + if (priv == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); + return 0; + } + if (out == nullptr) { + *out_len = MLDSA_SEED_BYTES; + return 1; + } + if (*out_len < MLDSA_SEED_BYTES) { + OPENSSL_PUT_ERROR(EVP, EVP_R_BUFFER_TOO_SMALL); + return 0; + } + OPENSSL_memcpy(out, priv->seed, MLDSA_SEED_BYTES); + *out_len = MLDSA_SEED_BYTES; + return 1; + } + + static int GetRawPublic(const EVP_PKEY *pkey, uint8_t *out, size_t *out_len) { + const auto *pub = GetKeyData(pkey)->GetPublicKey(); + if (out == nullptr) { + *out_len = Traits::kPublicKeyBytes; + return 1; + } + if (*out_len < Traits::kPublicKeyBytes) { + OPENSSL_PUT_ERROR(EVP, EVP_R_BUFFER_TOO_SMALL); + return 0; + } + CBB cbb; + CBB_init_fixed(&cbb, out, Traits::kPublicKeyBytes); + BSSL_CHECK(Traits::MarshalPublicKey(&cbb, pub)); + BSSL_CHECK(CBB_len(&cbb) == Traits::kPublicKeyBytes); + *out_len = Traits::kPublicKeyBytes; + return 1; + } + + static evp_decode_result_t DecodePublic(const EVP_PKEY_ALG *alg, + EVP_PKEY *out, CBS *params, + CBS *key) { + // The parameters must be omitted. See + // draft-ietf-lamps-dilithium-certificates-13, Section 2. + if (CBS_len(params) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + return SetRawPublic(out, CBS_data(key), CBS_len(key)) ? evp_decode_ok + : evp_decode_error; + } + + static int EncodePublic(CBB *out, const EVP_PKEY *pkey) { + const auto *pub = GetKeyData(pkey)->GetPublicKey(); + // See draft-ietf-lamps-dilithium-certificates-13, Sections 2 and 4. + CBB spki, algorithm, key_bitstring; + if (!CBB_add_asn1(out, &spki, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1(&spki, &algorithm, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, Traits::kOID.data(), + Traits::kOID.size()) || + !CBB_add_asn1(&spki, &key_bitstring, CBS_ASN1_BITSTRING) || + !CBB_add_u8(&key_bitstring, 0 /* padding */) || + !Traits::MarshalPublicKey(&key_bitstring, pub) || + !CBB_flush(out)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); + return 0; + } + return 1; + } + + static int ComparePublic(const EVP_PKEY *a, const EVP_PKEY *b) { + const auto *a_pub = GetKeyData(a)->GetPublicKey(); + const auto *b_pub = GetKeyData(b)->GetPublicKey(); + return Traits::PublicKeysEqual(a_pub, b_pub); + } + + static evp_decode_result_t DecodePrivate(const EVP_PKEY_ALG *alg, + EVP_PKEY *out, CBS *params, + CBS *key) { + // The parameters must be omitted. See + // draft-ietf-lamps-dilithium-certificates-13, Section 2. + if (CBS_len(params) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + + // See draft-ietf-lamps-dilithium-certificates-13, Section 6. Three + // different encodings were specified, adding complexity to the question of + // whether a private key is valid. We only implement the "seed" + // representation. Give this case a different error for easier diagnostics. + // + // The "expandedKey" representation was a last-minute accommodation for + // legacy hardware, which should be updated to use seeds. Supporting it + // complicates the notion of a private key with both seedful and seedless + // variants. + // + // The "both" representation is technically unsound and + // dangerous, so we do not implement it. Systems composed of components, + // some of which look at one half of the "both" representation, and half of + // the other, will appear to interop, but break when an input is + // inconsistent. The expanded key can be computed from the seed, so there is + // no purpose in this form. + CBS seed; + if (!CBS_get_asn1(key, &seed, kSeedTag)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_PRIVATE_KEY_WAS_NOT_SEED); + return evp_decode_error; + } + if (CBS_len(key) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + return SetPrivateSeed(out, CBS_data(&seed), CBS_len(&seed)) + ? evp_decode_ok + : evp_decode_error; + } + + static int EncodePrivate(CBB *out, const EVP_PKEY *pkey) { + const auto *priv = GetKeyData(pkey)->AsPrivateKeyData(); + if (priv == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); + return 0; + } + // See draft-ietf-lamps-dilithium-certificates-13, Sections 2 and 6. We + // encode only the seed representation. + CBB pkcs8, algorithm, private_key; + if (!CBB_add_asn1(out, &pkcs8, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_uint64(&pkcs8, 0 /* version */) || + !CBB_add_asn1(&pkcs8, &algorithm, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, Traits::kOID.data(), + Traits::kOID.size()) || + !CBB_add_asn1(&pkcs8, &private_key, CBS_ASN1_OCTETSTRING) || + !CBB_add_asn1_element(&private_key, kSeedTag, priv->seed, + sizeof(priv->seed)) || + !CBB_flush(out)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); + return 0; + } + return 1; + } + + static int PkeySize(const EVP_PKEY *pkey) { return Traits::kSignatureBytes; } + static int PkeyBits(const EVP_PKEY *pkey) { + // OpenSSL counts the bits in the public key serialization. + return Traits::kPublicKeyBytes * 8; + } + + // There is, for now, no context state to copy. When we add support for + // streaming signing, that will change. + static int CopyContext(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { return 1; } + + static int SignMessage(EVP_PKEY_CTX *ctx, uint8_t *sig, size_t *siglen, + const uint8_t *tbs, size_t tbslen) { + const auto *priv_data = GetKeyData(ctx->pkey.get())->AsPrivateKeyData(); + if (priv_data == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); + return 0; + } + if (sig == nullptr) { + *siglen = Traits::kSignatureBytes; + return 1; + } + if (*siglen < Traits::kSignatureBytes) { + OPENSSL_PUT_ERROR(EVP, EVP_R_BUFFER_TOO_SMALL); + return 0; + } + if (!Traits::Sign(sig, &priv_data->priv, tbs, tbslen, /*context=*/nullptr, + /*context_len=*/0)) { + return 0; + } + *siglen = Traits::kSignatureBytes; + return 1; + } + + static int VerifyMessage(EVP_PKEY_CTX *ctx, const uint8_t *sig, size_t siglen, + const uint8_t *tbs, size_t tbslen) { + const auto *pub = GetKeyData(ctx->pkey.get())->GetPublicKey(); + if (!Traits::Verify(pub, sig, siglen, tbs, tbslen, /*context=*/nullptr, + /*context_len=*/0)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_SIGNATURE); + return 0; + } + return 1; + } + + static constexpr EVP_PKEY_CTX_METHOD pkey_method = { + Traits::kType, + /*init=*/nullptr, + &CopyContext, + /*cleanup=*/nullptr, + // TODO(crbug.com/449751916): Add keygen support. + /*keygen=*/nullptr, + /*sign=*/nullptr, + &SignMessage, + /*verify=*/nullptr, + &VerifyMessage, + /*verify_recover=*/nullptr, + /*encrypt=*/nullptr, + /*decrypt=*/nullptr, + /*derive=*/nullptr, + /*paramgen=*/nullptr, + /*ctrl=*/nullptr, + }; + + static constexpr EVP_PKEY_ASN1_METHOD BuildASN1Method() { + EVP_PKEY_ASN1_METHOD ret = { + Traits::kType, + // The OID is filled in below. + /*oid=*/{}, + /*oid_len=*/0, + &pkey_method, + &DecodePublic, + &EncodePublic, + &ComparePublic, + &DecodePrivate, + &EncodePrivate, + // While exporting the seed as the "raw" private key would be natural, + // OpenSSL connected these APIs to the "raw private key", so we export + // the seed separately. + /*set_priv_raw=*/nullptr, + &SetPrivateSeed, + &SetRawPublic, + /*get_priv_raw=*/nullptr, + &GetPrivateSeed, + &GetRawPublic, + /*set1_tls_encodedpoint=*/nullptr, + /*get1_tls_encodedpoint=*/nullptr, + /*pkey_opaque=*/nullptr, + &PkeySize, + &PkeyBits, + /*param_missing=*/nullptr, + /*param_copy=*/nullptr, + /*param_cmp=*/nullptr, + &PkeyFree, + }; + // TODO(crbug.com/404286922): Use std::copy in C++20, when it's constexpr. + // TODO(crbug.com/450823446): Better yet, make this field an InplaceVector + // and give it a suitable constructor. + constexpr auto oid = Traits::kOID; + static_assert(oid.size() <= sizeof(ret.oid)); + for (size_t i = 0; i < oid.size(); i++) { + ret.oid[i] = oid[i]; + } + ret.oid_len = oid.size(); + return ret; + } + + static constexpr EVP_PKEY_ASN1_METHOD asn1_method = BuildASN1Method(); + static constexpr EVP_PKEY_ALG pkey_alg = {&asn1_method}; +}; + +} // namespace + +const EVP_PKEY_ALG *EVP_pkey_ml_dsa_44() { + return &MLDSAImplementation::pkey_alg; +} + +const EVP_PKEY_ALG *EVP_pkey_ml_dsa_65() { + return &MLDSAImplementation::pkey_alg; +} + +const EVP_PKEY_ALG *EVP_pkey_ml_dsa_87() { + return &MLDSAImplementation::pkey_alg; +} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_rsa.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_rsa.cc index f2bb22b6a8..f8121e160e 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_rsa.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_rsa.cc @@ -26,6 +26,7 @@ #include #include +#include "../fipsmodule/rsa/internal.h" #include "../internal.h" #include "../mem_internal.h" #include "../rsa/internal.h" @@ -34,6 +35,297 @@ namespace { +struct EVP_PKEY_ALG_RSA_PSS : public EVP_PKEY_ALG { + rsa_pss_params_t pss_params; +}; + +extern const EVP_PKEY_ASN1_METHOD rsa_asn1_meth; +extern const EVP_PKEY_ASN1_METHOD rsa_pss_asn1_meth; + +static int rsa_pub_encode(CBB *out, const EVP_PKEY *key) { + // See RFC 3279, section 2.3.1. + const RSA *rsa = reinterpret_cast(key->pkey); + CBB spki, algorithm, null, key_bitstring; + if (!CBB_add_asn1(out, &spki, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1(&spki, &algorithm, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, rsa_asn1_meth.oid, + rsa_asn1_meth.oid_len) || + !CBB_add_asn1(&algorithm, &null, CBS_ASN1_NULL) || + !CBB_add_asn1(&spki, &key_bitstring, CBS_ASN1_BITSTRING) || + !CBB_add_u8(&key_bitstring, 0 /* padding */) || + !RSA_marshal_public_key(&key_bitstring, rsa) || // + !CBB_flush(out)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); + return 0; + } + + return 1; +} + +static evp_decode_result_t rsa_pub_decode(const EVP_PKEY_ALG *alg, + EVP_PKEY *out, CBS *params, + CBS *key) { + // See RFC 3279, section 2.3.1. + + // The parameters must be NULL. + CBS null; + if (!CBS_get_asn1(params, &null, CBS_ASN1_NULL) || CBS_len(&null) != 0 || + CBS_len(params) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + + bssl::UniquePtr rsa( + RSA_public_key_from_bytes(CBS_data(key), CBS_len(key))); + if (rsa == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + + EVP_PKEY_assign_RSA(out, rsa.release()); + return evp_decode_ok; +} + +static int rsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { + // We currently assume that all |EVP_PKEY_RSA_PSS| keys have the same + // parameters, so this vacuously compares parameters. If we ever support + // multiple PSS parameter sets, we probably should compare them too. Note, + // however, that OpenSSL does not compare parameters here. + const RSA *a_rsa = reinterpret_cast(a->pkey); + const RSA *b_rsa = reinterpret_cast(b->pkey); + return BN_cmp(RSA_get0_n(b_rsa), RSA_get0_n(a_rsa)) == 0 && + BN_cmp(RSA_get0_e(b_rsa), RSA_get0_e(a_rsa)) == 0; +} + +static int rsa_priv_encode(CBB *out, const EVP_PKEY *key) { + const RSA *rsa = reinterpret_cast(key->pkey); + CBB pkcs8, algorithm, null, private_key; + if (!CBB_add_asn1(out, &pkcs8, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_uint64(&pkcs8, 0 /* version */) || + !CBB_add_asn1(&pkcs8, &algorithm, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, rsa_asn1_meth.oid, + rsa_asn1_meth.oid_len) || + !CBB_add_asn1(&algorithm, &null, CBS_ASN1_NULL) || + !CBB_add_asn1(&pkcs8, &private_key, CBS_ASN1_OCTETSTRING) || + !RSA_marshal_private_key(&private_key, rsa) || // + !CBB_flush(out)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); + return 0; + } + + return 1; +} + +static evp_decode_result_t rsa_priv_decode(const EVP_PKEY_ALG *alg, + EVP_PKEY *out, CBS *params, + CBS *key) { + // Per RFC 8017, A.1, the parameters have type NULL. + CBS null; + if (!CBS_get_asn1(params, &null, CBS_ASN1_NULL) || CBS_len(&null) != 0 || + CBS_len(params) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + + bssl::UniquePtr rsa( + RSA_private_key_from_bytes(CBS_data(key), CBS_len(key))); + if (rsa == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + + EVP_PKEY_assign_RSA(out, rsa.release()); + return evp_decode_ok; +} + +static evp_decode_result_t rsa_decode_pss_params(rsa_pss_params_t expected, + CBS *params) { + if (CBS_len(params) == 0) { + return evp_decode_unsupported; + } + rsa_pss_params_t pss_params; + if (!rsa_parse_pss_params(params, &pss_params, + /*allow_explicit_trailer=*/false) || + CBS_len(params) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + return pss_params == expected ? evp_decode_ok : evp_decode_unsupported; +} + +static int rsa_pub_encode_pss(CBB *out, const EVP_PKEY *key) { + const RSA *rsa = reinterpret_cast(key->pkey); + CBB spki, algorithm, key_bitstring; + if (!CBB_add_asn1(out, &spki, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1(&spki, &algorithm, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, rsa_pss_asn1_meth.oid, + rsa_pss_asn1_meth.oid_len) || + !rsa_marshal_pss_params(&algorithm, rsa->pss_params) || + !CBB_add_asn1(&spki, &key_bitstring, CBS_ASN1_BITSTRING) || + !CBB_add_u8(&key_bitstring, 0 /* padding */) || + !RSA_marshal_public_key(&key_bitstring, rsa) || // + !CBB_flush(out)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); + return 0; + } + + return 1; +} + +static evp_decode_result_t rsa_pub_decode_pss(const EVP_PKEY_ALG *alg, + EVP_PKEY *out, CBS *params, + CBS *key) { + const auto *alg_pss = static_cast(alg); + evp_decode_result_t ret = rsa_decode_pss_params(alg_pss->pss_params, params); + if (ret != evp_decode_ok) { + return ret; + } + + bssl::UniquePtr rsa( + RSA_public_key_from_bytes(CBS_data(key), CBS_len(key))); + if (rsa == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + + rsa->pss_params = alg_pss->pss_params; + evp_pkey_set0(out, &rsa_pss_asn1_meth, rsa.release()); + return evp_decode_ok; +} + +static int rsa_priv_encode_pss(CBB *out, const EVP_PKEY *key) { + const RSA *rsa = reinterpret_cast(key->pkey); + CBB pkcs8, algorithm, private_key; + if (!CBB_add_asn1(out, &pkcs8, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_uint64(&pkcs8, 0 /* version */) || + !CBB_add_asn1(&pkcs8, &algorithm, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, rsa_pss_asn1_meth.oid, + rsa_pss_asn1_meth.oid_len) || + !rsa_marshal_pss_params(&algorithm, rsa->pss_params) || + !CBB_add_asn1(&pkcs8, &private_key, CBS_ASN1_OCTETSTRING) || + !RSA_marshal_private_key(&private_key, rsa) || // + !CBB_flush(out)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); + return 0; + } + + return 1; +} + +static evp_decode_result_t rsa_priv_decode_pss(const EVP_PKEY_ALG *alg, + EVP_PKEY *out, CBS *params, + CBS *key) { + const auto *alg_pss = static_cast(alg); + evp_decode_result_t ret = rsa_decode_pss_params(alg_pss->pss_params, params); + if (ret != evp_decode_ok) { + return ret; + } + + bssl::UniquePtr rsa( + RSA_private_key_from_bytes(CBS_data(key), CBS_len(key))); + if (rsa == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + + rsa->pss_params = alg_pss->pss_params; + evp_pkey_set0(out, &rsa_pss_asn1_meth, rsa.release()); + return evp_decode_ok; +} + +static int rsa_opaque(const EVP_PKEY *pkey) { + const RSA *rsa = reinterpret_cast(pkey->pkey); + return RSA_is_opaque(rsa); +} + +static int int_rsa_size(const EVP_PKEY *pkey) { + const RSA *rsa = reinterpret_cast(pkey->pkey); + return RSA_size(rsa); +} + +static int rsa_bits(const EVP_PKEY *pkey) { + const RSA *rsa = reinterpret_cast(pkey->pkey); + return RSA_bits(rsa); +} + +static void int_rsa_free(EVP_PKEY *pkey) { + RSA_free(reinterpret_cast(pkey->pkey)); + pkey->pkey = nullptr; +} + +const EVP_PKEY_ASN1_METHOD rsa_asn1_meth = { + EVP_PKEY_RSA, + // 1.2.840.113549.1.1.1 + {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01}, + 9, + + &rsa_pkey_meth, + + rsa_pub_decode, + rsa_pub_encode, + rsa_pub_cmp, + + rsa_priv_decode, + rsa_priv_encode, + + /*set_priv_raw=*/nullptr, + /*set_priv_seed=*/nullptr, + /*set_pub_raw=*/nullptr, + /*get_priv_raw=*/nullptr, + /*get_priv_seed=*/nullptr, + /*get_pub_raw=*/nullptr, + /*set1_tls_encodedpoint=*/nullptr, + /*get1_tls_encodedpoint=*/nullptr, + + rsa_opaque, + + int_rsa_size, + rsa_bits, + + /*param_missing=*/nullptr, + /*param_copy=*/nullptr, + /*param_cmp=*/nullptr, + + int_rsa_free, +}; + +const EVP_PKEY_ASN1_METHOD rsa_pss_asn1_meth = { + EVP_PKEY_RSA_PSS, + // 1.2.840.113549.1.1.10 + {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0a}, + 9, + + &rsa_pss_pkey_meth, + + rsa_pub_decode_pss, + rsa_pub_encode_pss, + rsa_pub_cmp, + + rsa_priv_decode_pss, + rsa_priv_encode_pss, + + /*set_priv_raw=*/nullptr, + /*set_priv_seed=*/nullptr, + /*set_pub_raw=*/nullptr, + /*get_priv_raw=*/nullptr, + /*get_priv_seed=*/nullptr, + /*get_pub_raw=*/nullptr, + /*set1_tls_encodedpoint=*/nullptr, + /*get1_tls_encodedpoint=*/nullptr, + + rsa_opaque, + + int_rsa_size, + rsa_bits, + + /*param_missing=*/nullptr, + /*param_copy=*/nullptr, + /*param_cmp=*/nullptr, + + int_rsa_free, +}; + + struct RSA_PKEY_CTX { // Key gen parameters int nbits = 2048; @@ -46,15 +338,38 @@ struct RSA_PKEY_CTX { const EVP_MD *mgf1md = nullptr; // PSS salt length int saltlen = RSA_PSS_SALTLEN_DIGEST; + // restrict_pss_params, if true, indicates that the PSS signing/verifying + // parameters are restricted by the key's parameters. |md| and |mgf1md| may + // not change, and |saltlen| must be at least |md|'s hash length. + bool restrict_pss_params = false; bssl::Array oaep_label; }; +static bool is_pss_only(const EVP_PKEY_CTX *ctx) { + return ctx->pmeth->pkey_id == EVP_PKEY_RSA_PSS; +} + static int pkey_rsa_init(EVP_PKEY_CTX *ctx) { RSA_PKEY_CTX *rctx = bssl::New(); if (!rctx) { return 0; } + if (is_pss_only(ctx)) { + rctx->pad_mode = RSA_PKCS1_PSS_PADDING; + // Pick up PSS parameters from the key. + if (ctx->pkey != nullptr && ctx->pkey->pkey != nullptr) { + RSA *rsa = static_cast(ctx->pkey->pkey); + const EVP_MD *md = rsa_pss_params_get_md(rsa->pss_params); + if (md != nullptr) { + rctx->md = rctx->mgf1md = md; + // All our supported modes use the digest length as the salt length. + rctx->saltlen = EVP_MD_size(rctx->md); + rctx->restrict_pss_params = true; + } + } + } + ctx->data = rctx; return 1; } @@ -78,6 +393,7 @@ static int pkey_rsa_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { dctx->md = sctx->md; dctx->mgf1md = sctx->mgf1md; dctx->saltlen = sctx->saltlen; + dctx->restrict_pss_params = sctx->restrict_pss_params; if (!dctx->oaep_label.CopyFrom(sctx->oaep_label)) { return 0; } @@ -169,7 +485,7 @@ static int pkey_rsa_verify_recover(EVP_PKEY_CTX *ctx, uint8_t *out, RSA *rsa = reinterpret_cast(ctx->pkey->pkey); const size_t key_len = EVP_PKEY_size(ctx->pkey.get()); - if (out == NULL) { + if (out == nullptr) { *out_len = key_len; return 1; } @@ -179,7 +495,7 @@ static int pkey_rsa_verify_recover(EVP_PKEY_CTX *ctx, uint8_t *out, return 0; } - if (rctx->md == NULL) { + if (rctx->md == nullptr) { return RSA_verify_raw(rsa, out_len, out, *out_len, sig, sig_len, rctx->pad_mode); } @@ -214,7 +530,7 @@ static int pkey_rsa_verify_recover(EVP_PKEY_CTX *ctx, uint8_t *out, return 0; } - if (out != NULL) { + if (out != nullptr) { OPENSSL_memcpy(out, tbuf.data() + rslen - hash_len, hash_len); } *out_len = hash_len; @@ -317,6 +633,11 @@ static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { RSA_PKEY_CTX *rctx = reinterpret_cast(ctx->data); switch (type) { case EVP_PKEY_CTRL_RSA_PADDING: + // PSS keys cannot be switched to other padding types. + if (is_pss_only(ctx) && p1 != RSA_PKCS1_PSS_PADDING) { + OPENSSL_PUT_ERROR(EVP, EVP_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE); + return 0; + } if (!is_known_padding(p1) || !check_padding_md(rctx->md, p1) || (p1 == RSA_PKCS1_PSS_PADDING && 0 == (ctx->operation & (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY))) || @@ -325,7 +646,7 @@ static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { OPENSSL_PUT_ERROR(EVP, EVP_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE); return 0; } - if (p1 == RSA_PKCS1_OAEP_PADDING && rctx->md == NULL) { + if (p1 == RSA_PKCS1_OAEP_PADDING && rctx->md == nullptr) { rctx->md = EVP_sha1(); } rctx->pad_mode = p1; @@ -345,8 +666,20 @@ static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { *(int *)p2 = rctx->saltlen; } else { // Negative salt lengths are special values. - if (p1 < 0 && - (p1 != RSA_PSS_SALTLEN_DIGEST && p1 != RSA_PSS_SALTLEN_AUTO)) { + if (p1 < 0) { + if (p1 != RSA_PSS_SALTLEN_DIGEST && p1 != RSA_PSS_SALTLEN_AUTO) { + return 0; + } + // All our PSS restrictions accept saltlen == hashlen, so allow + // |RSA_PSS_SALTLEN_DIGEST|. Reject |RSA_PSS_SALTLEN_AUTO| for + // simplicity. + if (rctx->restrict_pss_params && p1 != RSA_PSS_SALTLEN_DIGEST) { + OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_PSS_SALTLEN); + return 0; + } + } else if (rctx->restrict_pss_params && + static_cast(p1) < EVP_MD_size(rctx->md)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_PSS_SALTLEN); return 0; } rctx->saltlen = p1; @@ -381,12 +714,19 @@ static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { } return 1; - case EVP_PKEY_CTRL_MD: - if (!check_padding_md(reinterpret_cast(p2), rctx->pad_mode)) { + case EVP_PKEY_CTRL_MD: { + const EVP_MD *md = reinterpret_cast(p2); + if (!check_padding_md(md, rctx->pad_mode)) { return 0; } - rctx->md = reinterpret_cast(p2); + if (rctx->restrict_pss_params && + EVP_MD_type(rctx->md) != EVP_MD_type(md)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_DIGEST_TYPE); + return 0; + } + rctx->md = md; return 1; + } case EVP_PKEY_CTRL_GET_MD: *(const EVP_MD **)p2 = rctx->md; @@ -406,7 +746,13 @@ static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { *(const EVP_MD **)p2 = rctx->md; } } else { - rctx->mgf1md = reinterpret_cast(p2); + const EVP_MD *md = reinterpret_cast(p2); + if (rctx->restrict_pss_params && + EVP_MD_type(rctx->mgf1md) != EVP_MD_type(md)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_MGF1_MD); + return 0; + } + rctx->mgf1md = md; } return 1; @@ -460,67 +806,163 @@ static int pkey_rsa_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) { } // namespace -const EVP_PKEY_METHOD rsa_pkey_meth = { +const EVP_PKEY_ALG *EVP_pkey_rsa(void) { + static const EVP_PKEY_ALG kAlg = {&rsa_asn1_meth}; + return &kAlg; +} + +const EVP_PKEY_ALG *EVP_pkey_rsa_pss_sha256(void) { + static const EVP_PKEY_ALG_RSA_PSS kAlg = {{&rsa_pss_asn1_meth}, + rsa_pss_sha256}; + return &kAlg; +} + +const EVP_PKEY_ALG *EVP_pkey_rsa_pss_sha384(void) { + static const EVP_PKEY_ALG_RSA_PSS kAlg = {{&rsa_pss_asn1_meth}, + rsa_pss_sha384}; + return &kAlg; +} + +const EVP_PKEY_ALG *EVP_pkey_rsa_pss_sha512(void) { + static const EVP_PKEY_ALG_RSA_PSS kAlg = {{&rsa_pss_asn1_meth}, + rsa_pss_sha512}; + return &kAlg; +} + +int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, RSA *key) { + if (EVP_PKEY_assign_RSA(pkey, key)) { + RSA_up_ref(key); + return 1; + } + return 0; +} + +int EVP_PKEY_assign_RSA(EVP_PKEY *pkey, RSA *key) { + if (key == nullptr) { + return 0; + } + evp_pkey_set0(pkey, &rsa_asn1_meth, key); + return 1; +} + +RSA *EVP_PKEY_get0_RSA(const EVP_PKEY *pkey) { + int pkey_id = EVP_PKEY_id(pkey); + if (pkey_id != EVP_PKEY_RSA && pkey_id != EVP_PKEY_RSA_PSS) { + OPENSSL_PUT_ERROR(EVP, EVP_R_EXPECTING_AN_RSA_KEY); + return nullptr; + } + return reinterpret_cast(pkey->pkey); +} + +RSA *EVP_PKEY_get1_RSA(const EVP_PKEY *pkey) { + RSA *rsa = EVP_PKEY_get0_RSA(pkey); + if (rsa != nullptr) { + RSA_up_ref(rsa); + } + return rsa; +} + +const EVP_PKEY_CTX_METHOD rsa_pkey_meth = { EVP_PKEY_RSA, pkey_rsa_init, pkey_rsa_copy, pkey_rsa_cleanup, pkey_rsa_keygen, pkey_rsa_sign, - NULL /* sign_message */, + /*sign_message=*/nullptr, pkey_rsa_verify, - NULL /* verify_message */, + /*verify_message=*/nullptr, pkey_rsa_verify_recover, pkey_rsa_encrypt, pkey_rsa_decrypt, - NULL /* derive */, - NULL /* paramgen */, + /*derive=*/nullptr, + /*paramgen=*/nullptr, pkey_rsa_ctrl, }; +const EVP_PKEY_CTX_METHOD rsa_pss_pkey_meth = { + EVP_PKEY_RSA_PSS, + pkey_rsa_init, + pkey_rsa_copy, + pkey_rsa_cleanup, + // In OpenSSL, |EVP_PKEY_RSA_PSS| supports key generation and fills in PSS + // parameters based on a separate set of keygen-targetted setters: + // |EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen|, + // |EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md|, and + // |EVP_PKEY_CTX_rsa_pss_key_digest|. We do not currently implement this + // because we only support one parameter set. + /*keygen=*/nullptr, + pkey_rsa_sign, + /*sign_message=*/nullptr, + pkey_rsa_verify, + /*verify_message=*/nullptr, + /*verify_recover=*/nullptr, + /*encrypt=*/nullptr, + /*decrypt=*/nullptr, + /*derive=*/nullptr, + /*paramgen=*/nullptr, + pkey_rsa_ctrl, +}; + +static int rsa_or_rsa_pss_ctrl(EVP_PKEY_CTX *ctx, int optype, int cmd, int p1, + void *p2) { + if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl) { + OPENSSL_PUT_ERROR(EVP, EVP_R_COMMAND_NOT_SUPPORTED); + return 0; + } + if (ctx->pmeth->pkey_id != EVP_PKEY_RSA && + ctx->pmeth->pkey_id != EVP_PKEY_RSA_PSS) { + OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); + return 0; + } + return EVP_PKEY_CTX_ctrl(ctx, /*keytype=*/-1, optype, cmd, p1, p2); +} + int EVP_PKEY_CTX_set_rsa_padding(EVP_PKEY_CTX *ctx, int padding) { - return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, EVP_PKEY_CTRL_RSA_PADDING, - padding, NULL); + return rsa_or_rsa_pss_ctrl(ctx, -1, EVP_PKEY_CTRL_RSA_PADDING, padding, + nullptr); } int EVP_PKEY_CTX_get_rsa_padding(EVP_PKEY_CTX *ctx, int *out_padding) { - return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, EVP_PKEY_CTRL_GET_RSA_PADDING, - 0, out_padding); + return rsa_or_rsa_pss_ctrl(ctx, -1, EVP_PKEY_CTRL_GET_RSA_PADDING, 0, + out_padding); } int EVP_PKEY_CTX_set_rsa_pss_keygen_md(EVP_PKEY_CTX *ctx, const EVP_MD *md) { + // We currently do not support keygen with |EVP_PKEY_RSA_PSS|. return 0; } int EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen(EVP_PKEY_CTX *ctx, int salt_len) { + // We currently do not support keygen with |EVP_PKEY_RSA_PSS|. return 0; } int EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md(EVP_PKEY_CTX *ctx, const EVP_MD *md) { + // We currently do not support keygen with |EVP_PKEY_RSA_PSS|. return 0; } int EVP_PKEY_CTX_set_rsa_pss_saltlen(EVP_PKEY_CTX *ctx, int salt_len) { - return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, - (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY), - EVP_PKEY_CTRL_RSA_PSS_SALTLEN, salt_len, NULL); + return rsa_or_rsa_pss_ctrl(ctx, (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY), + EVP_PKEY_CTRL_RSA_PSS_SALTLEN, salt_len, nullptr); } int EVP_PKEY_CTX_get_rsa_pss_saltlen(EVP_PKEY_CTX *ctx, int *out_salt_len) { - return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, - (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY), - EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN, 0, out_salt_len); + return rsa_or_rsa_pss_ctrl(ctx, (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY), + EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN, 0, + out_salt_len); } int EVP_PKEY_CTX_set_rsa_keygen_bits(EVP_PKEY_CTX *ctx, int bits) { - return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_KEYGEN, - EVP_PKEY_CTRL_RSA_KEYGEN_BITS, bits, NULL); + return rsa_or_rsa_pss_ctrl(ctx, EVP_PKEY_OP_KEYGEN, + EVP_PKEY_CTRL_RSA_KEYGEN_BITS, bits, nullptr); } int EVP_PKEY_CTX_set_rsa_keygen_pubexp(EVP_PKEY_CTX *ctx, BIGNUM *e) { - return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_KEYGEN, - EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP, 0, e); + return rsa_or_rsa_pss_ctrl(ctx, EVP_PKEY_OP_KEYGEN, + EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP, 0, e); } int EVP_PKEY_CTX_set_rsa_oaep_md(EVP_PKEY_CTX *ctx, const EVP_MD *md) { @@ -534,15 +976,13 @@ int EVP_PKEY_CTX_get_rsa_oaep_md(EVP_PKEY_CTX *ctx, const EVP_MD **out_md) { } int EVP_PKEY_CTX_set_rsa_mgf1_md(EVP_PKEY_CTX *ctx, const EVP_MD *md) { - return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, - EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, - EVP_PKEY_CTRL_RSA_MGF1_MD, 0, (void *)md); + return rsa_or_rsa_pss_ctrl(ctx, EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, + EVP_PKEY_CTRL_RSA_MGF1_MD, 0, (void *)md); } int EVP_PKEY_CTX_get_rsa_mgf1_md(EVP_PKEY_CTX *ctx, const EVP_MD **out_md) { - return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, - EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, - EVP_PKEY_CTRL_GET_RSA_MGF1_MD, 0, (void *)out_md); + return rsa_or_rsa_pss_ctrl(ctx, EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, + EVP_PKEY_CTRL_GET_RSA_MGF1_MD, 0, (void *)out_md); } int EVP_PKEY_CTX_set0_rsa_oaep_label(EVP_PKEY_CTX *ctx, uint8_t *label, diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_rsa_asn1.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_rsa_asn1.cc deleted file mode 100644 index 6c6bfc57c8..0000000000 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_rsa_asn1.cc +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.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 - -#include -#include -#include -#include -#include -#include - -#include "../fipsmodule/rsa/internal.h" -#include "internal.h" - - -static int rsa_pub_encode(CBB *out, const EVP_PKEY *key) { - // See RFC 3279, section 2.3.1. - const RSA *rsa = reinterpret_cast(key->pkey); - CBB spki, algorithm, null, key_bitstring; - if (!CBB_add_asn1(out, &spki, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1(&spki, &algorithm, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, rsa_asn1_meth.oid, - rsa_asn1_meth.oid_len) || - !CBB_add_asn1(&algorithm, &null, CBS_ASN1_NULL) || - !CBB_add_asn1(&spki, &key_bitstring, CBS_ASN1_BITSTRING) || - !CBB_add_u8(&key_bitstring, 0 /* padding */) || - !RSA_marshal_public_key(&key_bitstring, rsa) || // - !CBB_flush(out)) { - OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); - return 0; - } - - return 1; -} - -static int rsa_pub_decode(EVP_PKEY *out, CBS *params, CBS *key) { - // See RFC 3279, section 2.3.1. - - // The parameters must be NULL. - CBS null; - if (!CBS_get_asn1(params, &null, CBS_ASN1_NULL) || CBS_len(&null) != 0 || - CBS_len(params) != 0) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; - } - - RSA *rsa = RSA_parse_public_key(key); - if (rsa == NULL || CBS_len(key) != 0) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - RSA_free(rsa); - return 0; - } - - EVP_PKEY_assign_RSA(out, rsa); - return 1; -} - -static int rsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { - const RSA *a_rsa = reinterpret_cast(a->pkey); - const RSA *b_rsa = reinterpret_cast(b->pkey); - return BN_cmp(RSA_get0_n(b_rsa), RSA_get0_n(a_rsa)) == 0 && - BN_cmp(RSA_get0_e(b_rsa), RSA_get0_e(a_rsa)) == 0; -} - -static int rsa_priv_encode(CBB *out, const EVP_PKEY *key) { - const RSA *rsa = reinterpret_cast(key->pkey); - CBB pkcs8, algorithm, null, private_key; - if (!CBB_add_asn1(out, &pkcs8, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1_uint64(&pkcs8, 0 /* version */) || - !CBB_add_asn1(&pkcs8, &algorithm, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, rsa_asn1_meth.oid, - rsa_asn1_meth.oid_len) || - !CBB_add_asn1(&algorithm, &null, CBS_ASN1_NULL) || - !CBB_add_asn1(&pkcs8, &private_key, CBS_ASN1_OCTETSTRING) || - !RSA_marshal_private_key(&private_key, rsa) || // - !CBB_flush(out)) { - OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); - return 0; - } - - return 1; -} - -static int rsa_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) { - // Per RFC 3447, A.1, the parameters have type NULL. - CBS null; - if (!CBS_get_asn1(params, &null, CBS_ASN1_NULL) || CBS_len(&null) != 0 || - CBS_len(params) != 0) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; - } - - RSA *rsa = RSA_parse_private_key(key); - if (rsa == NULL || CBS_len(key) != 0) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - RSA_free(rsa); - return 0; - } - - EVP_PKEY_assign_RSA(out, rsa); - return 1; -} - -static int rsa_opaque(const EVP_PKEY *pkey) { - const RSA *rsa = reinterpret_cast(pkey->pkey); - return RSA_is_opaque(rsa); -} - -static int int_rsa_size(const EVP_PKEY *pkey) { - const RSA *rsa = reinterpret_cast(pkey->pkey); - return RSA_size(rsa); -} - -static int rsa_bits(const EVP_PKEY *pkey) { - const RSA *rsa = reinterpret_cast(pkey->pkey); - return RSA_bits(rsa); -} - -static void int_rsa_free(EVP_PKEY *pkey) { - RSA_free(reinterpret_cast(pkey->pkey)); - pkey->pkey = NULL; -} - -const EVP_PKEY_ASN1_METHOD rsa_asn1_meth = { - EVP_PKEY_RSA, - // 1.2.840.113549.1.1.1 - {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01}, - 9, - - &rsa_pkey_meth, - - rsa_pub_decode, - rsa_pub_encode, - rsa_pub_cmp, - - rsa_priv_decode, - rsa_priv_encode, - - /*set_priv_raw=*/NULL, - /*set_pub_raw=*/NULL, - /*get_priv_raw=*/NULL, - /*get_pub_raw=*/NULL, - /*set1_tls_encodedpoint=*/NULL, - /*get1_tls_encodedpoint=*/NULL, - - rsa_opaque, - - int_rsa_size, - rsa_bits, - - 0, - 0, - 0, - - int_rsa_free, -}; - -int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, RSA *key) { - if (EVP_PKEY_assign_RSA(pkey, key)) { - RSA_up_ref(key); - return 1; - } - return 0; -} - -int EVP_PKEY_assign_RSA(EVP_PKEY *pkey, RSA *key) { - evp_pkey_set_method(pkey, &rsa_asn1_meth); - pkey->pkey = key; - return key != NULL; -} - -RSA *EVP_PKEY_get0_RSA(const EVP_PKEY *pkey) { - if (pkey->type != EVP_PKEY_RSA) { - OPENSSL_PUT_ERROR(EVP, EVP_R_EXPECTING_AN_RSA_KEY); - return NULL; - } - return reinterpret_cast(pkey->pkey); -} - -RSA *EVP_PKEY_get1_RSA(const EVP_PKEY *pkey) { - RSA *rsa = EVP_PKEY_get0_RSA(pkey); - if (rsa != NULL) { - RSA_up_ref(rsa); - } - return rsa; -} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_x25519.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_x25519.cc index 1186e99c68..eb1bc447c0 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_x25519.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_x25519.cc @@ -14,36 +14,272 @@ #include +#include #include #include #include +#include "../internal.h" #include "internal.h" +namespace { + +struct X25519_KEY { + uint8_t pub[32]; + uint8_t priv[32]; + bool has_private; +}; + +extern const EVP_PKEY_ASN1_METHOD x25519_asn1_meth; + +static void x25519_free(EVP_PKEY *pkey) { + OPENSSL_free(pkey->pkey); + pkey->pkey = nullptr; +} + +static int x25519_set_priv_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { + if (len != 32) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return 0; + } + + X25519_KEY *key = + reinterpret_cast(OPENSSL_malloc(sizeof(X25519_KEY))); + if (key == nullptr) { + return 0; + } + + OPENSSL_memcpy(key->priv, in, 32); + X25519_public_from_private(key->pub, key->priv); + key->has_private = true; + + evp_pkey_set0(pkey, &x25519_asn1_meth, key); + return 1; +} + +static int x25519_set_pub_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { + if (len != 32) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return 0; + } + + X25519_KEY *key = + reinterpret_cast(OPENSSL_malloc(sizeof(X25519_KEY))); + if (key == nullptr) { + return 0; + } + + OPENSSL_memcpy(key->pub, in, 32); + key->has_private = false; + + evp_pkey_set0(pkey, &x25519_asn1_meth, key); + return 1; +} + +static int x25519_get_priv_raw(const EVP_PKEY *pkey, uint8_t *out, + size_t *out_len) { + const X25519_KEY *key = reinterpret_cast(pkey->pkey); + if (!key->has_private) { + OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); + return 0; + } + + if (out == nullptr) { + *out_len = 32; + return 1; + } + + if (*out_len < 32) { + OPENSSL_PUT_ERROR(EVP, EVP_R_BUFFER_TOO_SMALL); + return 0; + } + + OPENSSL_memcpy(out, key->priv, 32); + *out_len = 32; + return 1; +} + +static int x25519_get_pub_raw(const EVP_PKEY *pkey, uint8_t *out, + size_t *out_len) { + const X25519_KEY *key = reinterpret_cast(pkey->pkey); + if (out == nullptr) { + *out_len = 32; + return 1; + } + + if (*out_len < 32) { + OPENSSL_PUT_ERROR(EVP, EVP_R_BUFFER_TOO_SMALL); + return 0; + } + + OPENSSL_memcpy(out, key->pub, 32); + *out_len = 32; + return 1; +} + +static int x25519_set1_tls_encodedpoint(EVP_PKEY *pkey, const uint8_t *in, + size_t len) { + return x25519_set_pub_raw(pkey, in, len); +} + +static size_t x25519_get1_tls_encodedpoint(const EVP_PKEY *pkey, + uint8_t **out_ptr) { + const X25519_KEY *key = reinterpret_cast(pkey->pkey); + if (key == nullptr) { + OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); + return 0; + } + + *out_ptr = reinterpret_cast(OPENSSL_memdup(key->pub, 32)); + return *out_ptr == nullptr ? 0 : 32; +} + +static evp_decode_result_t x25519_pub_decode(const EVP_PKEY_ALG *alg, + EVP_PKEY *out, CBS *params, + CBS *key) { + // See RFC 8410, section 4. + + // The parameters must be omitted. Public keys have length 32. + if (CBS_len(params) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + + return x25519_set_pub_raw(out, CBS_data(key), CBS_len(key)) + ? evp_decode_ok + : evp_decode_error; +} + +static int x25519_pub_encode(CBB *out, const EVP_PKEY *pkey) { + const X25519_KEY *key = reinterpret_cast(pkey->pkey); + + // See RFC 8410, section 4. + CBB spki, algorithm, key_bitstring; + if (!CBB_add_asn1(out, &spki, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1(&spki, &algorithm, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, x25519_asn1_meth.oid, + x25519_asn1_meth.oid_len) || + !CBB_add_asn1(&spki, &key_bitstring, CBS_ASN1_BITSTRING) || + !CBB_add_u8(&key_bitstring, 0 /* padding */) || + !CBB_add_bytes(&key_bitstring, key->pub, 32) || // + !CBB_flush(out)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); + return 0; + } + + return 1; +} + +static int x25519_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { + const X25519_KEY *a_key = reinterpret_cast(a->pkey); + const X25519_KEY *b_key = reinterpret_cast(b->pkey); + return OPENSSL_memcmp(a_key->pub, b_key->pub, 32) == 0; +} + +static evp_decode_result_t x25519_priv_decode(const EVP_PKEY_ALG *alg, + EVP_PKEY *out, CBS *params, + CBS *key) { + // See RFC 8410, section 7. + + // Parameters must be empty. The key is a 32-byte value wrapped in an extra + // OCTET STRING layer. + CBS inner; + if (CBS_len(params) != 0 || + !CBS_get_asn1(key, &inner, CBS_ASN1_OCTETSTRING) || CBS_len(key) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return evp_decode_error; + } + + return x25519_set_priv_raw(out, CBS_data(&inner), CBS_len(&inner)) + ? evp_decode_ok + : evp_decode_error; +} + +static int x25519_priv_encode(CBB *out, const EVP_PKEY *pkey) { + const X25519_KEY *key = reinterpret_cast(pkey->pkey); + if (!key->has_private) { + OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); + return 0; + } + + // See RFC 8410, section 7. + CBB pkcs8, algorithm, private_key, inner; + if (!CBB_add_asn1(out, &pkcs8, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_uint64(&pkcs8, 0 /* version */) || + !CBB_add_asn1(&pkcs8, &algorithm, CBS_ASN1_SEQUENCE) || + !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, x25519_asn1_meth.oid, + x25519_asn1_meth.oid_len) || + !CBB_add_asn1(&pkcs8, &private_key, CBS_ASN1_OCTETSTRING) || + !CBB_add_asn1(&private_key, &inner, CBS_ASN1_OCTETSTRING) || + // The PKCS#8 encoding stores only the 32-byte seed which is the first 32 + // bytes of the private key. + !CBB_add_bytes(&inner, key->priv, 32) || // + !CBB_flush(out)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); + return 0; + } + + return 1; +} + +static int x25519_size(const EVP_PKEY *pkey) { return 32; } + +static int x25519_bits(const EVP_PKEY *pkey) { return 253; } + +const EVP_PKEY_ASN1_METHOD x25519_asn1_meth = { + EVP_PKEY_X25519, + {0x2b, 0x65, 0x6e}, + 3, + &x25519_pkey_meth, + x25519_pub_decode, + x25519_pub_encode, + x25519_pub_cmp, + x25519_priv_decode, + x25519_priv_encode, + x25519_set_priv_raw, + /*set_priv_seed=*/nullptr, + x25519_set_pub_raw, + x25519_get_priv_raw, + /*get_priv_seed=*/nullptr, + x25519_get_pub_raw, + x25519_set1_tls_encodedpoint, + x25519_get1_tls_encodedpoint, + /*pkey_opaque=*/nullptr, + x25519_size, + x25519_bits, + /*param_missing=*/nullptr, + /*param_copy=*/nullptr, + /*param_cmp=*/nullptr, + x25519_free, +}; + +} // namespace + +const EVP_PKEY_ALG *EVP_pkey_x25519(void) { + static const EVP_PKEY_ALG kAlg = {&x25519_asn1_meth}; + return &kAlg; +} + // X25519 has no parameters to copy. static int pkey_x25519_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { return 1; } static int pkey_x25519_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) { X25519_KEY *key = reinterpret_cast(OPENSSL_malloc(sizeof(X25519_KEY))); - if (key == NULL) { + if (key == nullptr) { return 0; } - evp_pkey_set_method(pkey, &x25519_asn1_meth); - X25519_keypair(key->pub, key->priv); - key->has_private = 1; - - OPENSSL_free(pkey->pkey); - pkey->pkey = key; + key->has_private = true; + evp_pkey_set0(pkey, &x25519_asn1_meth, key); return 1; } static int pkey_x25519_derive(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *out_len) { - if (ctx->pkey == NULL || ctx->peerkey == NULL) { + if (ctx->pkey == nullptr || ctx->peerkey == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_KEYS_NOT_SET); return 0; } @@ -52,7 +288,7 @@ static int pkey_x25519_derive(EVP_PKEY_CTX *ctx, uint8_t *out, reinterpret_cast(ctx->pkey->pkey); const X25519_KEY *peer_key = reinterpret_cast(ctx->peerkey->pkey); - if (our_key == NULL || peer_key == NULL) { + if (our_key == nullptr || peer_key == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_KEYS_NOT_SET); return 0; } @@ -62,7 +298,7 @@ static int pkey_x25519_derive(EVP_PKEY_CTX *ctx, uint8_t *out, return 0; } - if (out != NULL) { + if (out != nullptr) { if (*out_len < 32) { OPENSSL_PUT_ERROR(EVP, EVP_R_BUFFER_TOO_SMALL); return 0; @@ -90,20 +326,20 @@ static int pkey_x25519_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { } } -const EVP_PKEY_METHOD x25519_pkey_meth = { +const EVP_PKEY_CTX_METHOD x25519_pkey_meth = { /*pkey_id=*/EVP_PKEY_X25519, - /*init=*/NULL, + /*init=*/nullptr, /*copy=*/pkey_x25519_copy, - /*cleanup=*/NULL, + /*cleanup=*/nullptr, /*keygen=*/pkey_x25519_keygen, - /*sign=*/NULL, - /*sign_message=*/NULL, - /*verify=*/NULL, - /*verify_message=*/NULL, - /*verify_recover=*/NULL, - /*encrypt=*/NULL, - /*decrypt=*/NULL, + /*sign=*/nullptr, + /*sign_message=*/nullptr, + /*verify=*/nullptr, + /*verify_message=*/nullptr, + /*verify_recover=*/nullptr, + /*encrypt=*/nullptr, + /*decrypt=*/nullptr, /*derive=*/pkey_x25519_derive, - /*paramgen=*/NULL, + /*paramgen=*/nullptr, /*ctrl=*/pkey_x25519_ctrl, }; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_x25519_asn1.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_x25519_asn1.cc deleted file mode 100644 index c31dcc5dea..0000000000 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/p_x25519_asn1.cc +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright 2019 The BoringSSL Authors -// -// Licensed under the Apache License, Version 2.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 - -#include -#include -#include -#include - -#include "../internal.h" -#include "internal.h" - - -static void x25519_free(EVP_PKEY *pkey) { - OPENSSL_free(pkey->pkey); - pkey->pkey = NULL; -} - -static int x25519_set_priv_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { - if (len != 32) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; - } - - X25519_KEY *key = - reinterpret_cast(OPENSSL_malloc(sizeof(X25519_KEY))); - if (key == NULL) { - return 0; - } - - OPENSSL_memcpy(key->priv, in, 32); - X25519_public_from_private(key->pub, key->priv); - key->has_private = 1; - - x25519_free(pkey); - pkey->pkey = key; - return 1; -} - -static int x25519_set_pub_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { - if (len != 32) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; - } - - X25519_KEY *key = - reinterpret_cast(OPENSSL_malloc(sizeof(X25519_KEY))); - if (key == NULL) { - return 0; - } - - OPENSSL_memcpy(key->pub, in, 32); - key->has_private = 0; - - x25519_free(pkey); - pkey->pkey = key; - return 1; -} - -static int x25519_get_priv_raw(const EVP_PKEY *pkey, uint8_t *out, - size_t *out_len) { - const X25519_KEY *key = reinterpret_cast(pkey->pkey); - if (!key->has_private) { - OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); - return 0; - } - - if (out == NULL) { - *out_len = 32; - return 1; - } - - if (*out_len < 32) { - OPENSSL_PUT_ERROR(EVP, EVP_R_BUFFER_TOO_SMALL); - return 0; - } - - OPENSSL_memcpy(out, key->priv, 32); - *out_len = 32; - return 1; -} - -static int x25519_get_pub_raw(const EVP_PKEY *pkey, uint8_t *out, - size_t *out_len) { - const X25519_KEY *key = reinterpret_cast(pkey->pkey); - if (out == NULL) { - *out_len = 32; - return 1; - } - - if (*out_len < 32) { - OPENSSL_PUT_ERROR(EVP, EVP_R_BUFFER_TOO_SMALL); - return 0; - } - - OPENSSL_memcpy(out, key->pub, 32); - *out_len = 32; - return 1; -} - -static int x25519_set1_tls_encodedpoint(EVP_PKEY *pkey, const uint8_t *in, - size_t len) { - return x25519_set_pub_raw(pkey, in, len); -} - -static size_t x25519_get1_tls_encodedpoint(const EVP_PKEY *pkey, - uint8_t **out_ptr) { - const X25519_KEY *key = reinterpret_cast(pkey->pkey); - if (key == NULL) { - OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); - return 0; - } - - *out_ptr = reinterpret_cast(OPENSSL_memdup(key->pub, 32)); - return *out_ptr == NULL ? 0 : 32; -} - -static int x25519_pub_decode(EVP_PKEY *out, CBS *params, CBS *key) { - // See RFC 8410, section 4. - - // The parameters must be omitted. Public keys have length 32. - if (CBS_len(params) != 0) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; - } - - return x25519_set_pub_raw(out, CBS_data(key), CBS_len(key)); -} - -static int x25519_pub_encode(CBB *out, const EVP_PKEY *pkey) { - const X25519_KEY *key = reinterpret_cast(pkey->pkey); - - // See RFC 8410, section 4. - CBB spki, algorithm, key_bitstring; - if (!CBB_add_asn1(out, &spki, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1(&spki, &algorithm, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, x25519_asn1_meth.oid, - x25519_asn1_meth.oid_len) || - !CBB_add_asn1(&spki, &key_bitstring, CBS_ASN1_BITSTRING) || - !CBB_add_u8(&key_bitstring, 0 /* padding */) || - !CBB_add_bytes(&key_bitstring, key->pub, 32) || // - !CBB_flush(out)) { - OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); - return 0; - } - - return 1; -} - -static int x25519_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { - const X25519_KEY *a_key = reinterpret_cast(a->pkey); - const X25519_KEY *b_key = reinterpret_cast(b->pkey); - return OPENSSL_memcmp(a_key->pub, b_key->pub, 32) == 0; -} - -static int x25519_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) { - // See RFC 8410, section 7. - - // Parameters must be empty. The key is a 32-byte value wrapped in an extra - // OCTET STRING layer. - CBS inner; - if (CBS_len(params) != 0 || - !CBS_get_asn1(key, &inner, CBS_ASN1_OCTETSTRING) || CBS_len(key) != 0) { - OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); - return 0; - } - - return x25519_set_priv_raw(out, CBS_data(&inner), CBS_len(&inner)); -} - -static int x25519_priv_encode(CBB *out, const EVP_PKEY *pkey) { - const X25519_KEY *key = reinterpret_cast(pkey->pkey); - if (!key->has_private) { - OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); - return 0; - } - - // See RFC 8410, section 7. - CBB pkcs8, algorithm, private_key, inner; - if (!CBB_add_asn1(out, &pkcs8, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1_uint64(&pkcs8, 0 /* version */) || - !CBB_add_asn1(&pkcs8, &algorithm, CBS_ASN1_SEQUENCE) || - !CBB_add_asn1_element(&algorithm, CBS_ASN1_OBJECT, x25519_asn1_meth.oid, - x25519_asn1_meth.oid_len) || - !CBB_add_asn1(&pkcs8, &private_key, CBS_ASN1_OCTETSTRING) || - !CBB_add_asn1(&private_key, &inner, CBS_ASN1_OCTETSTRING) || - // The PKCS#8 encoding stores only the 32-byte seed which is the first 32 - // bytes of the private key. - !CBB_add_bytes(&inner, key->priv, 32) || // - !CBB_flush(out)) { - OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); - return 0; - } - - return 1; -} - -static int x25519_size(const EVP_PKEY *pkey) { return 32; } - -static int x25519_bits(const EVP_PKEY *pkey) { return 253; } - -const EVP_PKEY_ASN1_METHOD x25519_asn1_meth = { - EVP_PKEY_X25519, - {0x2b, 0x65, 0x6e}, - 3, - &x25519_pkey_meth, - x25519_pub_decode, - x25519_pub_encode, - x25519_pub_cmp, - x25519_priv_decode, - x25519_priv_encode, - x25519_set_priv_raw, - x25519_set_pub_raw, - x25519_get_priv_raw, - x25519_get_pub_raw, - x25519_set1_tls_encodedpoint, - x25519_get1_tls_encodedpoint, - /*pkey_opaque=*/NULL, - x25519_size, - x25519_bits, - /*param_missing=*/NULL, - /*param_copy=*/NULL, - /*param_cmp=*/NULL, - x25519_free, -}; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/pbkdf.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/pbkdf.cc index cce0fd0031..38a88768ab 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/pbkdf.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/pbkdf.cc @@ -26,7 +26,7 @@ int PKCS5_PBKDF2_HMAC(const char *password, size_t password_len, const EVP_MD *digest, size_t key_len, uint8_t *out_key) { // See RFC 8018, section 5.2. bssl::ScopedHMAC_CTX hctx; - if (!HMAC_Init_ex(hctx.get(), password, password_len, digest, NULL)) { + if (!HMAC_Init_ex(hctx.get(), password, password_len, digest, nullptr)) { return 0; } @@ -46,19 +46,19 @@ int PKCS5_PBKDF2_HMAC(const char *password, size_t password_len, // Compute U_1. uint8_t digest_tmp[EVP_MAX_MD_SIZE]; - if (!HMAC_Init_ex(hctx.get(), NULL, 0, NULL, NULL) || + if (!HMAC_Init_ex(hctx.get(), nullptr, 0, nullptr, nullptr) || !HMAC_Update(hctx.get(), salt, salt_len) || !HMAC_Update(hctx.get(), i_buf, 4) || - !HMAC_Final(hctx.get(), digest_tmp, NULL)) { + !HMAC_Final(hctx.get(), digest_tmp, nullptr)) { return 0; } OPENSSL_memcpy(out_key, digest_tmp, todo); for (uint32_t j = 1; j < iterations; j++) { // Compute the remaining U_* values and XOR. - if (!HMAC_Init_ex(hctx.get(), NULL, 0, NULL, NULL) || + if (!HMAC_Init_ex(hctx.get(), nullptr, 0, nullptr, nullptr) || !HMAC_Update(hctx.get(), digest_tmp, md_len) || - !HMAC_Final(hctx.get(), digest_tmp, NULL)) { + !HMAC_Final(hctx.get(), digest_tmp, nullptr)) { return 0; } for (size_t k = 0; k < todo; k++) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/print.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/print.cc index b4c0cd529e..50d158db4b 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/print.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/print.cc @@ -45,7 +45,7 @@ static int print_hex(BIO *bp, const uint8_t *data, size_t len, int off) { } static int bn_print(BIO *bp, const char *name, const BIGNUM *num, int off) { - if (num == NULL) { + if (num == nullptr) { return 1; } @@ -78,7 +78,7 @@ static int bn_print(BIO *bp, const char *name, const BIGNUM *num, int off) { // and negative values are never valid in keys anyway. size_t len = BN_num_bytes(num); uint8_t *buf = reinterpret_cast(OPENSSL_malloc(len + 1)); - if (buf == NULL) { + if (buf == nullptr) { return 0; } @@ -101,7 +101,7 @@ static int bn_print(BIO *bp, const char *name, const BIGNUM *num, int off) { static int do_rsa_print(BIO *out, const RSA *rsa, int off, int include_private) { int mod_len = 0; - if (rsa->n != NULL) { + if (rsa->n != nullptr) { mod_len = BN_num_bits(rsa->n); } @@ -150,60 +150,11 @@ static int rsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent) { } -// DSA keys. - -static int do_dsa_print(BIO *bp, const DSA *x, int off, int ptype) { - const BIGNUM *priv_key = NULL; - if (ptype == 2) { - priv_key = DSA_get0_priv_key(x); - } - - const BIGNUM *pub_key = NULL; - if (ptype > 0) { - pub_key = DSA_get0_pub_key(x); - } - - const char *ktype = "DSA-Parameters"; - if (ptype == 2) { - ktype = "Private-Key"; - } else if (ptype == 1) { - ktype = "Public-Key"; - } - - if (!BIO_indent(bp, off, 128) || - BIO_printf(bp, "%s: (%u bit)\n", ktype, BN_num_bits(DSA_get0_p(x))) <= - 0 || - // |priv_key| and |pub_key| may be NULL, in which case |bn_print| will - // silently skip them. - !bn_print(bp, "priv:", priv_key, off) || - !bn_print(bp, "pub:", pub_key, off) || - !bn_print(bp, "P:", DSA_get0_p(x), off) || - !bn_print(bp, "Q:", DSA_get0_q(x), off) || - !bn_print(bp, "G:", DSA_get0_g(x), off)) { - return 0; - } - - return 1; -} - -static int dsa_param_print(BIO *bp, const EVP_PKEY *pkey, int indent) { - return do_dsa_print(bp, EVP_PKEY_get0_DSA(pkey), indent, 0); -} - -static int dsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent) { - return do_dsa_print(bp, EVP_PKEY_get0_DSA(pkey), indent, 1); -} - -static int dsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent) { - return do_dsa_print(bp, EVP_PKEY_get0_DSA(pkey), indent, 2); -} - - // EC keys. static int do_EC_KEY_print(BIO *bp, const EC_KEY *x, int off, int ktype) { const EC_GROUP *group; - if (x == NULL || (group = EC_KEY_get0_group(x)) == NULL) { + if (x == nullptr || (group = EC_KEY_get0_group(x)) == nullptr) { OPENSSL_PUT_ERROR(EVP, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -230,15 +181,15 @@ static int do_EC_KEY_print(BIO *bp, const EC_KEY *x, int off, int ktype) { if (ktype == 2) { const BIGNUM *priv_key = EC_KEY_get0_private_key(x); - if (priv_key != NULL && // + if (priv_key != nullptr && // !bn_print(bp, "priv:", priv_key, off)) { return 0; } } - if (ktype > 0 && EC_KEY_get0_public_key(x) != NULL) { - uint8_t *pub = NULL; - size_t pub_len = EC_KEY_key2buf(x, EC_KEY_get_conv_form(x), &pub, NULL); + if (ktype > 0 && EC_KEY_get0_public_key(x) != nullptr) { + uint8_t *pub = nullptr; + size_t pub_len = EC_KEY_key2buf(x, EC_KEY_get_conv_form(x), &pub, nullptr); if (pub_len == 0) { return 0; } @@ -275,18 +226,12 @@ typedef struct { int (*param_print)(BIO *out, const EVP_PKEY *pkey, int indent); } EVP_PKEY_PRINT_METHOD; -static EVP_PKEY_PRINT_METHOD kPrintMethods[] = { +static const EVP_PKEY_PRINT_METHOD kPrintMethods[] = { { EVP_PKEY_RSA, rsa_pub_print, rsa_priv_print, - NULL /* param_print */, - }, - { - EVP_PKEY_DSA, - dsa_pub_print, - dsa_priv_print, - dsa_param_print, + /*param_print=*/nullptr, }, { EVP_PKEY_EC, @@ -296,15 +241,13 @@ static EVP_PKEY_PRINT_METHOD kPrintMethods[] = { }, }; -static size_t kPrintMethodsLen = OPENSSL_ARRAY_SIZE(kPrintMethods); - -static EVP_PKEY_PRINT_METHOD *find_method(int type) { - for (size_t i = 0; i < kPrintMethodsLen; i++) { - if (kPrintMethods[i].type == type) { - return &kPrintMethods[i]; +static const EVP_PKEY_PRINT_METHOD *find_method(int type) { + for (const auto &p : kPrintMethods) { + if (p.type == type) { + return &p; } } - return NULL; + return nullptr; } static int print_unsupported(BIO *out, const EVP_PKEY *pkey, int indent, @@ -316,8 +259,8 @@ static int print_unsupported(BIO *out, const EVP_PKEY *pkey, int indent, int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey, int indent, ASN1_PCTX *pctx) { - EVP_PKEY_PRINT_METHOD *method = find_method(EVP_PKEY_id(pkey)); - if (method != NULL && method->pub_print != NULL) { + const EVP_PKEY_PRINT_METHOD *method = find_method(EVP_PKEY_id(pkey)); + if (method != nullptr && method->pub_print != nullptr) { return method->pub_print(out, pkey, indent); } return print_unsupported(out, pkey, indent, "Public Key"); @@ -325,8 +268,8 @@ int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey, int indent, int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey, int indent, ASN1_PCTX *pctx) { - EVP_PKEY_PRINT_METHOD *method = find_method(EVP_PKEY_id(pkey)); - if (method != NULL && method->priv_print != NULL) { + const EVP_PKEY_PRINT_METHOD *method = find_method(EVP_PKEY_id(pkey)); + if (method != nullptr && method->priv_print != nullptr) { return method->priv_print(out, pkey, indent); } return print_unsupported(out, pkey, indent, "Private Key"); @@ -334,8 +277,8 @@ int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey, int indent, int EVP_PKEY_print_params(BIO *out, const EVP_PKEY *pkey, int indent, ASN1_PCTX *pctx) { - EVP_PKEY_PRINT_METHOD *method = find_method(EVP_PKEY_id(pkey)); - if (method != NULL && method->param_print != NULL) { + const EVP_PKEY_PRINT_METHOD *method = find_method(EVP_PKEY_id(pkey)); + if (method != nullptr && method->param_print != nullptr) { return method->param_print(out, pkey, indent); } return print_unsupported(out, pkey, indent, "Parameters"); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/evp/scrypt.cc b/naiveproxy/src/third_party/boringssl/src/crypto/evp/scrypt.cc index 548a3f615e..4f0f9fd144 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/evp/scrypt.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/evp/scrypt.cc @@ -183,7 +183,7 @@ int EVP_PBE_scrypt(const char *password, size_t password_len, size_t V_blocks = N * 2 * r; block_t *B = reinterpret_cast( OPENSSL_calloc(B_blocks + T_blocks + V_blocks, sizeof(block_t))); - if (B == NULL) { + if (B == nullptr) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/ex_data.cc b/naiveproxy/src/third_party/boringssl/src/crypto/ex_data.cc index 86a3d58ac1..4f025e4599 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/ex_data.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/ex_data.cc @@ -27,8 +27,8 @@ struct crypto_ex_data_func_st { - long argl; // Arbitary long - void *argp; // Arbitary void pointer + long argl; // Arbitrary long + void *argp; // Arbitrary void pointer CRYPTO_EX_free *free_func; // next points to the next |CRYPTO_EX_DATA_FUNCS| or NULL if this is the last // one. It may only be read if synchronized with a read from |num_funcs|. @@ -39,18 +39,18 @@ int CRYPTO_get_ex_new_index_ex(CRYPTO_EX_DATA_CLASS *ex_data_class, long argl, void *argp, CRYPTO_EX_free *free_func) { CRYPTO_EX_DATA_FUNCS *funcs = reinterpret_cast( OPENSSL_malloc(sizeof(CRYPTO_EX_DATA_FUNCS))); - if (funcs == NULL) { + if (funcs == nullptr) { return -1; } funcs->argl = argl; funcs->argp = argp; funcs->free_func = free_func; - funcs->next = NULL; + funcs->next = nullptr; CRYPTO_MUTEX_lock_write(&ex_data_class->lock); - uint32_t num_funcs = CRYPTO_atomic_load_u32(&ex_data_class->num_funcs); + uint32_t num_funcs = ex_data_class->num_funcs.load(); // The index must fit in |int|. if (num_funcs > (size_t)(INT_MAX - ex_data_class->num_reserved)) { OPENSSL_PUT_ERROR(CRYPTO, ERR_R_OVERFLOW); @@ -59,7 +59,7 @@ int CRYPTO_get_ex_new_index_ex(CRYPTO_EX_DATA_CLASS *ex_data_class, long argl, } // Append |funcs| to the linked list. - if (ex_data_class->last == NULL) { + if (ex_data_class->last == nullptr) { assert(num_funcs == 0); ex_data_class->funcs = funcs; ex_data_class->last = funcs; @@ -68,7 +68,7 @@ int CRYPTO_get_ex_new_index_ex(CRYPTO_EX_DATA_CLASS *ex_data_class, long argl, ex_data_class->last = funcs; } - CRYPTO_atomic_store_u32(&ex_data_class->num_funcs, num_funcs + 1); + ex_data_class->num_funcs.store(num_funcs + 1); CRYPTO_MUTEX_unlock_write(&ex_data_class->lock); return (int)num_funcs + ex_data_class->num_reserved; } @@ -81,16 +81,16 @@ int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int index, void *val) { abort(); } - if (ad->sk == NULL) { + if (ad->sk == nullptr) { ad->sk = sk_void_new_null(); - if (ad->sk == NULL) { + if (ad->sk == nullptr) { return 0; } } // Add NULL values until the stack is long enough. for (size_t i = sk_void_num(ad->sk); i <= (size_t)index; i++) { - if (!sk_void_push(ad->sk, NULL)) { + if (!sk_void_push(ad->sk, nullptr)) { return 0; } } @@ -100,22 +100,22 @@ int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int index, void *val) { } void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int idx) { - if (ad->sk == NULL || idx < 0 || (size_t)idx >= sk_void_num(ad->sk)) { - return NULL; + if (ad->sk == nullptr || idx < 0 || (size_t)idx >= sk_void_num(ad->sk)) { + return nullptr; } return sk_void_value(ad->sk, idx); } -void CRYPTO_new_ex_data(CRYPTO_EX_DATA *ad) { ad->sk = NULL; } +void CRYPTO_new_ex_data(CRYPTO_EX_DATA *ad) { ad->sk = nullptr; } void CRYPTO_free_ex_data(CRYPTO_EX_DATA_CLASS *ex_data_class, CRYPTO_EX_DATA *ad) { - if (ad->sk == NULL) { + if (ad->sk == nullptr) { // Nothing to do. return; } - uint32_t num_funcs = CRYPTO_atomic_load_u32(&ex_data_class->num_funcs); + uint32_t num_funcs = ex_data_class->num_funcs.load(); // |CRYPTO_get_ex_new_index_ex| will not allocate indices beyond |INT_MAX|. assert(num_funcs <= (size_t)(INT_MAX - ex_data_class->num_reserved)); @@ -123,7 +123,7 @@ void CRYPTO_free_ex_data(CRYPTO_EX_DATA_CLASS *ex_data_class, // after the |num_funcs| comparison to be correctly synchronized. CRYPTO_EX_DATA_FUNCS *const *funcs = &ex_data_class->funcs; for (uint32_t i = 0; i < num_funcs; i++) { - if ((*funcs)->free_func != NULL) { + if ((*funcs)->free_func != nullptr) { int index = (int)i + ex_data_class->num_reserved; void *ptr = CRYPTO_get_ex_data(ad, index); (*funcs)->free_func(/*parent=*/nullptr, ptr, /*ad*/ nullptr, index, @@ -133,7 +133,7 @@ void CRYPTO_free_ex_data(CRYPTO_EX_DATA_CLASS *ex_data_class, } sk_void_free(ad->sk); - ad->sk = NULL; + ad->sk = nullptr; } void CRYPTO_cleanup_all_ex_data(void) {} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/FIPS.md b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/FIPS.md index e7e1a9bd8d..c8e1771547 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/FIPS.md +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/FIPS.md @@ -1,6 +1,6 @@ # FIPS 140-3 -BoringSSL as a whole is not FIPS validated. However, there is a core library (called BoringCrypto) that has been FIPS validated. This document contains some notes about the design of the FIPS module and some documentation on performing FIPS-related tasks. This is not a substitute for reading the official Security Policy. +BoringSSL as a whole is not FIPS validated. However, there is a core library (called BoringCrypto, abbreviated in the code as BCM for "BoringCrypto Module") that has been FIPS validated. This document contains some notes about the design of the FIPS module and some documentation on performing FIPS-related tasks. This is not a substitute for reading the official Security Policy. Please note that we cannot answer questions about FIPS, nor about using BoringSSL in a FIPS-compliant manner. Please consult with an [accredited CMVP lab](http://csrc.nist.gov/groups/STM/testing_labs/) on these subjects. @@ -24,7 +24,7 @@ The following validations are active: | 2024-04-07 | Review Pending at NIST | [A5370](https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/details?product=18027) | | 2024-08-05 | Review Pending at NIST | [A6134](https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/details?product=9831) | | 2025-01-07 | Review Pending at NIST | [A6838](https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/details?product=19570) | -| 2025-xx-xx | Under review by NVLAP lab | | +| 2025-07-28 | Review Pending at NIST | [A7303](https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/details?validation=39913) | ## Update stream diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/aes_nohw.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/aes_nohw.cc.inc index 14f46b18dd..c9cfb370a6 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/aes_nohw.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/aes_nohw.cc.inc @@ -187,8 +187,8 @@ static_assert(AES_NOHW_WORD_SIZE == sizeof(aes_word_t), // // Observe that the distances between corresponding bits in bitsliced and // compact bit orders match. If we line up corresponding words of each block, -// the bitsliced and compact representations may be converted by tranposing bits -// in corresponding logical bytes. Continuing the 64-bit example: +// the bitsliced and compact representations may be converted by transposing +// bits in corresponding logical bytes. Continuing the 64-bit example: // // block_a[0] = a0 a1 a2 a3 | a8 a9 a10 a11 | a16 a17 a18 a19 ... // block_b[0] = b0 b1 b2 b3 | b8 b9 b10 b11 | b16 b17 b18 b19 ... diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/asm/aesni-x86_64.pl b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/asm/aesni-x86_64.pl index 930ae14144..85632e9da5 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/asm/aesni-x86_64.pl +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/asm/aesni-x86_64.pl @@ -64,7 +64,7 @@ # nothing one can do and the result appears optimal. CCM result is # identical to CBC, because CBC-MAC is essentially CBC encrypt without # saving output. CCM CTR "stays invisible," because it's neatly -# interleaved wih CBC-MAC. This provides ~30% improvement over +# interleaved with CBC-MAC. This provides ~30% improvement over # "straightforward" CCM implementation with CTR and CBC-MAC performed # disjointly. Parallelizable modes practically achieve the theoretical # limit. @@ -2262,7 +2262,7 @@ $code.=<<___; movdqu `16*0`($inp),$inout0 # load input movdqa $rndkey0,$twmask movdqu `16*1`($inp),$inout1 - pxor @tweak[0],$inout0 # intput^=tweak^round[0] + pxor @tweak[0],$inout0 # input^=tweak^round[0] movdqu `16*2`($inp),$inout2 pxor @tweak[1],$inout1 aesdec $rndkey1,$inout0 @@ -3778,7 +3778,7 @@ ctr_xts_se_handler: mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # prologue lable + lea (%rsi,%r10),%r10 # prologue label cmp %r10,%rbx # context->RipHandlerData mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # prologue lable + lea (%rsi,%r10),%r10 # prologue label cmp %r10,%rbx # context->Rip= 16) { @@ -63,13 +63,13 @@ void CRYPTO_cbc128_encrypt(const uint8_t *in, uint8_t *out, size_t len, void CRYPTO_cbc128_decrypt(const uint8_t *in, uint8_t *out, size_t len, const AES_KEY *key, uint8_t ivec[16], block128_f block) { - assert(key != NULL && ivec != NULL); + assert(key != nullptr && ivec != nullptr); if (len == 0) { // Avoid |ivec| == |iv| in the |memcpy| below, which is not legal in C. return; } - assert(in != NULL && out != NULL); + assert(in != nullptr && out != nullptr); const uintptr_t inptr = (uintptr_t) in; const uintptr_t outptr = (uintptr_t) out; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/ctr.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/ctr.cc.inc index cf9ca18612..8f18831e70 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/ctr.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/ctr.cc.inc @@ -73,7 +73,7 @@ void CRYPTO_ctr128_encrypt_ctr32(const uint8_t *in, uint8_t *out, size_t len, (*func)(in, out, blocks, key, ivec); // (*func) does not update ivec, caller does: CRYPTO_store_u32_be(ivec + 12, ctr32); - // ... overflow was detected, propogate carry. + // ... overflow was detected, propagate carry. if (ctr32 == 0) { ctr96_inc(ivec); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/gcm.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/gcm.cc.inc index 30855ee8b2..918cbefb12 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/gcm.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/gcm.cc.inc @@ -589,7 +589,7 @@ int CRYPTO_gcm128_finish(const GCM128_KEY *key, GCM128_CONTEXT *ctx, void CRYPTO_gcm128_tag(const GCM128_KEY *key, GCM128_CONTEXT *ctx, uint8_t *tag, size_t len) { - CRYPTO_gcm128_finish(key, ctx, NULL, 0); + CRYPTO_gcm128_finish(key, ctx, nullptr, 0); OPENSSL_memcpy(tag, ctx->Xi, len <= sizeof(ctx->Xi) ? len : sizeof(ctx->Xi)); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/key_wrap.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/key_wrap.cc.inc index ad1c314e9d..5c8acb7f1f 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/key_wrap.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/key_wrap.cc.inc @@ -41,7 +41,7 @@ int AES_wrap_key(const AES_KEY *key, const uint8_t *iv, uint8_t *out, return -1; } - if (iv == NULL) { + if (iv == nullptr) { iv = kDefaultIV; } @@ -113,7 +113,7 @@ int AES_unwrap_key(const AES_KEY *key, const uint8_t *iv, uint8_t *out, return -1; } - if (iv == NULL) { + if (iv == nullptr) { iv = kDefaultIV; } if (CRYPTO_memcmp(calculated_iv, iv, 8) != 0) { @@ -152,7 +152,7 @@ int AES_wrap_key_padded(const AES_KEY *key, uint8_t *out, size_t *out_len, } uint8_t *padded_in = reinterpret_cast(OPENSSL_malloc(padded_len)); - if (padded_in == NULL) { + if (padded_in == nullptr) { return 0; } assert(padded_len >= 8); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/ofb.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/ofb.cc.inc index 7a6834ac66..df981f0e82 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/ofb.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/aes/ofb.cc.inc @@ -23,8 +23,8 @@ static_assert(16 % sizeof(size_t) == 0, "block cannot be divided into size_t"); void CRYPTO_ofb128_encrypt(const uint8_t *in, uint8_t *out, size_t len, const AES_KEY *key, uint8_t ivec[16], unsigned *num, block128_f block) { - assert(key != NULL && ivec != NULL && num != NULL); - assert(len == 0 || (in != NULL && out != NULL)); + assert(key != nullptr && ivec != nullptr && num != nullptr); + assert(len == 0 || (in != nullptr && out != nullptr)); unsigned n = *num; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bcm.cc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bcm.cc index 227e5242de..daea544c5c 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bcm.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bcm.cc @@ -90,6 +90,7 @@ #include "ec/wnaf.cc.inc" #include "ecdh/ecdh.cc.inc" #include "ecdsa/ecdsa.cc.inc" +#include "entropy/jitter.cc.inc" #include "hkdf/hkdf.cc.inc" #include "hmac/hmac.cc.inc" #include "keccak/keccak.cc.inc" @@ -172,8 +173,8 @@ static void BORINGSSL_maybe_set_module_text_permissions(int permission) {} #endif // !ASAN -static void __attribute__((constructor)) -BORINGSSL_bcm_power_on_self_test(void) { +static void __attribute__((constructor)) BORINGSSL_bcm_power_on_self_test( + void) { #if !defined(OPENSSL_ASAN) // Integrity tests cannot run under ASAN because it involves reading the full // .text section, which triggers the global-buffer overflow detection. @@ -229,7 +230,7 @@ int BORINGSSL_integrity_test(void) { HMAC_CTX hmac_ctx; HMAC_CTX_init(&hmac_ctx); if (!HMAC_Init_ex(&hmac_ctx, kHMACKey, sizeof(kHMACKey), kHashFunction, - NULL /* no ENGINE */)) { + nullptr /* no ENGINE */)) { fprintf(CRYPTO_get_stderr(), "HMAC_Init_ex failed.\n"); return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bcm_interface.h b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bcm_interface.h index e60458c24d..67c8f3310c 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bcm_interface.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bcm_interface.h @@ -15,9 +15,11 @@ #ifndef OPENSSL_HEADER_CRYPTO_FIPSMODULE_BCM_INTERFACE_H #define OPENSSL_HEADER_CRYPTO_FIPSMODULE_BCM_INTERFACE_H -// For the moment, we reach out for AES_KEY. #include -#include +#include +#include +#include +#include // This header will eventually become the interface between BCM and the @@ -81,7 +83,7 @@ bcm_infallible BCM_rand_load_entropy(const uint8_t *entropy, size_t entropy_len, // BCM_rand_bytes is the same as the public |RAND_bytes| function, other // than returning a bcm_infallible status indicator. -OPENSSL_EXPORT bcm_infallible BCM_rand_bytes(uint8_t *out, size_t out_len); +bcm_infallible BCM_rand_bytes(uint8_t *out, size_t out_len); // BCM_rand_bytes_hwrng attempts to fill |out| with |len| bytes of entropy from // the CPU hardware random number generator if one is present. @@ -97,24 +99,20 @@ bcm_infallible BCM_rand_bytes_with_additional_data( // SHA-1 -// BCM_SHA_DIGEST_LENGTH is the length of a SHA-1 digest. -#define BCM_SHA_DIGEST_LENGTH 20 - // BCM_sha1_init initialises |sha|. bcm_infallible BCM_sha1_init(SHA_CTX *sha); -// BCM_SHA1_transform is a low-level function that performs a single, SHA-1 +// SHA1_transform is a low-level function that performs a single, SHA-1 // block transformation using the state from |sha| and |SHA_CBLOCK| bytes from // |block|. -bcm_infallible BCM_sha1_transform(SHA_CTX *c, - const uint8_t data[BCM_SHA_CBLOCK]); +bcm_infallible BCM_sha1_transform(SHA_CTX *c, const uint8_t data[SHA_CBLOCK]); // BCM_sha1_update adds |len| bytes from |data| to |sha|. bcm_infallible BCM_sha1_update(SHA_CTX *c, const void *data, size_t len); // BCM_sha1_final adds the final padding to |sha| and writes the resulting // digest to |out|, which must have at least |SHA_DIGEST_LENGTH| bytes of space. -bcm_infallible BCM_sha1_final(uint8_t out[BCM_SHA_DIGEST_LENGTH], SHA_CTX *c); +bcm_infallible BCM_sha1_final(uint8_t out[SHA_DIGEST_LENGTH], SHA_CTX *c); // BCM_fips_186_2_prf derives |out_len| bytes from |xkey| using the PRF @@ -131,14 +129,11 @@ bcm_infallible BCM_sha1_final(uint8_t out[BCM_SHA_DIGEST_LENGTH], SHA_CTX *c); // in new protocols. It is provided for compatibility with some legacy EAP // methods. bcm_infallible BCM_fips_186_2_prf(uint8_t *out, size_t out_len, - const uint8_t xkey[BCM_SHA_DIGEST_LENGTH]); + const uint8_t xkey[SHA_DIGEST_LENGTH]); // SHA-224 -// SHA224_DIGEST_LENGTH is the length of a SHA-224 digest. -#define BCM_SHA224_DIGEST_LENGTH 28 - // BCM_sha224_unit initialises |sha|. bcm_infallible BCM_sha224_init(SHA256_CTX *sha); @@ -148,15 +143,12 @@ bcm_infallible BCM_sha224_update(SHA256_CTX *sha, const void *data, size_t len); // BCM_sha224_final adds the final padding to |sha| and writes the resulting // digest to |out|, which must have at least |SHA224_DIGEST_LENGTH| bytes of // space. It aborts on programmer error. -bcm_infallible BCM_sha224_final(uint8_t out[BCM_SHA224_DIGEST_LENGTH], +bcm_infallible BCM_sha224_final(uint8_t out[SHA224_DIGEST_LENGTH], SHA256_CTX *sha); // SHA-256 -// BCM_SHA256_DIGEST_LENGTH is the length of a SHA-256 digest. -#define BCM_SHA256_DIGEST_LENGTH 32 - // BCM_sha256_init initialises |sha|. bcm_infallible BCM_sha256_init(SHA256_CTX *sha); @@ -164,20 +156,20 @@ bcm_infallible BCM_sha256_init(SHA256_CTX *sha); bcm_infallible BCM_sha256_update(SHA256_CTX *sha, const void *data, size_t len); // BCM_sha256_final adds the final padding to |sha| and writes the resulting -// digest to |out|, which must have at least |BCM_SHA256_DIGEST_LENGTH| bytes of +// digest to |out|, which must have at least |SHA256_DIGEST_LENGTH| bytes of // space. It aborts on programmer error. -bcm_infallible BCM_sha256_final(uint8_t out[BCM_SHA256_DIGEST_LENGTH], +bcm_infallible BCM_sha256_final(uint8_t out[SHA256_DIGEST_LENGTH], SHA256_CTX *sha); // BCM_sha256_transform is a low-level function that performs a single, SHA-256 -// block transformation using the state from |sha| and |BCM_SHA256_CBLOCK| bytes +// block transformation using the state from |sha| and |SHA256_CBLOCK| bytes // from |block|. bcm_infallible BCM_sha256_transform(SHA256_CTX *sha, - const uint8_t block[BCM_SHA256_CBLOCK]); + const uint8_t block[SHA256_CBLOCK]); // BCM_sha256_transform_blocks is a low-level function that takes |num_blocks| * -// |BCM_SHA256_CBLOCK| bytes of data and performs SHA-256 transforms on it to -// update |state|. +// |SHA256_CBLOCK| bytes of data and performs SHA-256 transforms on it to update +// |state|. bcm_infallible BCM_sha256_transform_blocks(uint32_t state[8], const uint8_t *data, size_t num_blocks); @@ -185,9 +177,6 @@ bcm_infallible BCM_sha256_transform_blocks(uint32_t state[8], // SHA-384. -// BCM_SHA384_DIGEST_LENGTH is the length of a SHA-384 digest. -#define BCM_SHA384_DIGEST_LENGTH 48 - // BCM_sha384_init initialises |sha|. bcm_infallible BCM_sha384_init(SHA512_CTX *sha); @@ -195,17 +184,14 @@ bcm_infallible BCM_sha384_init(SHA512_CTX *sha); bcm_infallible BCM_sha384_update(SHA512_CTX *sha, const void *data, size_t len); // BCM_sha384_final adds the final padding to |sha| and writes the resulting -// digest to |out|, which must have at least |BCM_sha384_DIGEST_LENGTH| bytes of +// digest to |out|, which must have at least |SHA384_DIGEST_LENGTH| bytes of // space. It may abort on programmer error. -bcm_infallible BCM_sha384_final(uint8_t out[BCM_SHA384_DIGEST_LENGTH], +bcm_infallible BCM_sha384_final(uint8_t out[SHA384_DIGEST_LENGTH], SHA512_CTX *sha); // SHA-512. -// BCM_SHA512_DIGEST_LENGTH is the length of a SHA-512 digest. -#define BCM_SHA512_DIGEST_LENGTH 64 - // BCM_sha512_init initialises |sha|. bcm_infallible BCM_sha512_init(SHA512_CTX *sha); @@ -213,24 +199,22 @@ bcm_infallible BCM_sha512_init(SHA512_CTX *sha); bcm_infallible BCM_sha512_update(SHA512_CTX *sha, const void *data, size_t len); // BCM_sha512_final adds the final padding to |sha| and writes the resulting -// digest to |out|, which must have at least |BCM_sha512_DIGEST_LENGTH| bytes of +// digest to |out|, which must have at least |SHA512_DIGEST_LENGTH| bytes of // space. -bcm_infallible BCM_sha512_final(uint8_t out[BCM_SHA512_DIGEST_LENGTH], +bcm_infallible BCM_sha512_final(uint8_t out[SHA512_DIGEST_LENGTH], SHA512_CTX *sha); // BCM_sha512_transform is a low-level function that performs a single, SHA-512 -// block transformation using the state from |sha| and |BCM_sha512_CBLOCK| bytes +// block transformation using the state from |sha| and |SHA512_CBLOCK| bytes // from |block|. bcm_infallible BCM_sha512_transform(SHA512_CTX *sha, - const uint8_t block[BCM_SHA512_CBLOCK]); + const uint8_t block[SHA512_CBLOCK]); // SHA-512-256 // // See https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf section 5.3.6 -#define BCM_SHA512_256_DIGEST_LENGTH 32 - // BCM_sha512_256_init initialises |sha|. bcm_infallible BCM_sha512_256_init(SHA512_CTX *sha); @@ -239,9 +223,9 @@ bcm_infallible BCM_sha512_256_update(SHA512_CTX *sha, const void *data, size_t len); // BCM_sha512_256_final adds the final padding to |sha| and writes the resulting -// digest to |out|, which must have at least |BCM_sha512_256_DIGEST_LENGTH| -// bytes of space. It may abort on programmer error. -bcm_infallible BCM_sha512_256_final(uint8_t out[BCM_SHA512_256_DIGEST_LENGTH], +// digest to |out|, which must have at least |SHA512_256_DIGEST_LENGTH| bytes of +// space. It may abort on programmer error. +bcm_infallible BCM_sha512_256_final(uint8_t out[SHA512_256_DIGEST_LENGTH], SHA512_CTX *sha); @@ -254,119 +238,85 @@ bcm_infallible BCM_sha512_256_final(uint8_t out[BCM_SHA512_256_DIGEST_LENGTH], // random entropy necessary to generate a signature in randomized mode. #define BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES 32 -// BCM_MLDSA_SEED_BYTES is the number of bytes in an ML-DSA seed value. -#define BCM_MLDSA_SEED_BYTES 32 - -// BCM_MLDSA_MU_BYTES is the number of bytes in an ML-DSA mu value. -#define BCM_MLDSA_MU_BYTES 64 - // BCM_MLDSA65_PRIVATE_KEY_BYTES is the number of bytes in an encoded ML-DSA-65 // private key. #define BCM_MLDSA65_PRIVATE_KEY_BYTES 4032 -// BCM_MLDSA65_PUBLIC_KEY_BYTES is the number of bytes in an encoded ML-DSA-65 -// public key. -#define BCM_MLDSA65_PUBLIC_KEY_BYTES 1952 - -// BCM_MLDSA65_SIGNATURE_BYTES is the number of bytes in an encoded ML-DSA-65 -// signature. -#define BCM_MLDSA65_SIGNATURE_BYTES 3309 - -struct BCM_mldsa65_private_key { - union { - uint8_t bytes[32 + 32 + 64 + 256 * 4 * (5 + 6 + 6)]; - uint32_t alignment; - } opaque; -}; - -struct BCM_mldsa65_public_key { - union { - uint8_t bytes[32 + 64 + 256 * 4 * 6]; - uint32_t alignment; - } opaque; -}; - -struct BCM_mldsa65_prehash { - union { - uint8_t bytes[200 + 4 + 4 + 4 * sizeof(size_t)]; - uint64_t alignment; - } opaque; -}; - OPENSSL_EXPORT bcm_status BCM_mldsa65_generate_key( - uint8_t out_encoded_public_key[BCM_MLDSA65_PUBLIC_KEY_BYTES], - uint8_t out_seed[BCM_MLDSA_SEED_BYTES], - struct BCM_mldsa65_private_key *out_private_key); + uint8_t out_encoded_public_key[MLDSA65_PUBLIC_KEY_BYTES], + uint8_t out_seed[MLDSA_SEED_BYTES], MLDSA65_private_key *out_private_key); OPENSSL_EXPORT bcm_status BCM_mldsa65_private_key_from_seed( - struct BCM_mldsa65_private_key *out_private_key, - const uint8_t seed[BCM_MLDSA_SEED_BYTES]); + MLDSA65_private_key *out_private_key, const uint8_t seed[MLDSA_SEED_BYTES]); OPENSSL_EXPORT bcm_status BCM_mldsa65_public_from_private( - struct BCM_mldsa65_public_key *out_public_key, - const struct BCM_mldsa65_private_key *private_key); + MLDSA65_public_key *out_public_key, const MLDSA65_private_key *private_key); + +// BCM_mldsa65_public_of_private returns the public half of |private_key|. +const MLDSA65_public_key *BCM_mldsa65_public_of_private( + const MLDSA65_private_key *private_key); OPENSSL_EXPORT bcm_status -BCM_mldsa65_check_key_fips(struct BCM_mldsa65_private_key *private_key); +BCM_mldsa65_check_key_fips(MLDSA65_private_key *private_key); OPENSSL_EXPORT bcm_status BCM_mldsa65_generate_key_fips( - uint8_t out_encoded_public_key[BCM_MLDSA65_PUBLIC_KEY_BYTES], - uint8_t out_seed[BCM_MLDSA_SEED_BYTES], - struct BCM_mldsa65_private_key *out_private_key); + uint8_t out_encoded_public_key[MLDSA65_PUBLIC_KEY_BYTES], + uint8_t out_seed[MLDSA_SEED_BYTES], MLDSA65_private_key *out_private_key); OPENSSL_EXPORT bcm_status BCM_mldsa65_private_key_from_seed_fips( - struct BCM_mldsa65_private_key *out_private_key, - const uint8_t seed[BCM_MLDSA_SEED_BYTES]); + MLDSA65_private_key *out_private_key, const uint8_t seed[MLDSA_SEED_BYTES]); -OPENSSL_EXPORT bcm_status BCM_mldsa65_sign( - uint8_t out_encoded_signature[BCM_MLDSA65_SIGNATURE_BYTES], - const struct BCM_mldsa65_private_key *private_key, const uint8_t *msg, - size_t msg_len, const uint8_t *context, size_t context_len); +OPENSSL_EXPORT bcm_status +BCM_mldsa65_sign(uint8_t out_encoded_signature[MLDSA65_SIGNATURE_BYTES], + const MLDSA65_private_key *private_key, const uint8_t *msg, + size_t msg_len, const uint8_t *context, size_t context_len); OPENSSL_EXPORT bcm_status BCM_mldsa65_verify( - const struct BCM_mldsa65_public_key *public_key, - const uint8_t signature[BCM_MLDSA65_SIGNATURE_BYTES], const uint8_t *msg, + const MLDSA65_public_key *public_key, + const uint8_t signature[MLDSA65_SIGNATURE_BYTES], const uint8_t *msg, size_t msg_len, const uint8_t *context, size_t context_len); OPENSSL_EXPORT void BCM_mldsa65_prehash_init( - struct BCM_mldsa65_prehash *out_prehash_ctx, - const struct BCM_mldsa65_public_key *public_key, const uint8_t *context, - size_t context_len); + MLDSA65_prehash *out_prehash_ctx, const MLDSA65_public_key *public_key, + const uint8_t *context, size_t context_len); OPENSSL_EXPORT void BCM_mldsa65_prehash_update( - struct BCM_mldsa65_prehash *inout_prehash_ctx, const uint8_t *msg, - size_t msg_len); + MLDSA65_prehash *inout_prehash_ctx, const uint8_t *msg, size_t msg_len); OPENSSL_EXPORT void BCM_mldsa65_prehash_finalize( - uint8_t out_msg_rep[BCM_MLDSA_MU_BYTES], - struct BCM_mldsa65_prehash *inout_prehash_ctx); + uint8_t out_msg_rep[MLDSA_MU_BYTES], MLDSA65_prehash *inout_prehash_ctx); OPENSSL_EXPORT bcm_status BCM_mldsa65_sign_message_representative( - uint8_t out_encoded_signature[BCM_MLDSA65_SIGNATURE_BYTES], - const struct BCM_mldsa65_private_key *private_key, - const uint8_t msg_rep[BCM_MLDSA_MU_BYTES]); + uint8_t out_encoded_signature[MLDSA65_SIGNATURE_BYTES], + const MLDSA65_private_key *private_key, + const uint8_t msg_rep[MLDSA_MU_BYTES]); -OPENSSL_EXPORT bcm_status BCM_mldsa65_marshal_public_key( - CBB *out, const struct BCM_mldsa65_public_key *public_key); +OPENSSL_EXPORT bcm_status BCM_mldsa65_verify_message_representative( + const MLDSA65_public_key *public_key, + const uint8_t signature[MLDSA65_SIGNATURE_BYTES], + const uint8_t msg_rep[MLDSA_MU_BYTES]); -OPENSSL_EXPORT bcm_status BCM_mldsa65_parse_public_key( - struct BCM_mldsa65_public_key *public_key, CBS *in); +OPENSSL_EXPORT bcm_status +BCM_mldsa65_marshal_public_key(CBB *out, const MLDSA65_public_key *public_key); -OPENSSL_EXPORT bcm_status BCM_mldsa65_parse_private_key( - struct BCM_mldsa65_private_key *private_key, CBS *in); +OPENSSL_EXPORT bcm_status +BCM_mldsa65_parse_public_key(MLDSA65_public_key *public_key, CBS *in); + +OPENSSL_EXPORT bcm_status +BCM_mldsa65_parse_private_key(MLDSA65_private_key *private_key, CBS *in); // BCM_mldsa65_generate_key_external_entropy generates a public/private key pair // using the given seed, writes the encoded public key to // |out_encoded_public_key| and sets |out_private_key| to the private key. OPENSSL_EXPORT bcm_status BCM_mldsa65_generate_key_external_entropy( - uint8_t out_encoded_public_key[BCM_MLDSA65_PUBLIC_KEY_BYTES], - struct BCM_mldsa65_private_key *out_private_key, - const uint8_t entropy[BCM_MLDSA_SEED_BYTES]); + uint8_t out_encoded_public_key[MLDSA65_PUBLIC_KEY_BYTES], + MLDSA65_private_key *out_private_key, + const uint8_t entropy[MLDSA_SEED_BYTES]); OPENSSL_EXPORT bcm_status BCM_mldsa65_generate_key_external_entropy_fips( - uint8_t out_encoded_public_key[BCM_MLDSA65_PUBLIC_KEY_BYTES], - struct BCM_mldsa65_private_key *out_private_key, - const uint8_t entropy[BCM_MLDSA_SEED_BYTES]); + uint8_t out_encoded_public_key[MLDSA65_PUBLIC_KEY_BYTES], + MLDSA65_private_key *out_private_key, + const uint8_t entropy[MLDSA_SEED_BYTES]); // BCM_mldsa5_sign_internal signs |msg| using |private_key| and writes the // signature to |out_encoded_signature|. The |context_prefix| and |context| are @@ -374,9 +324,9 @@ OPENSSL_EXPORT bcm_status BCM_mldsa65_generate_key_external_entropy_fips( // value can be set to zero bytes in order to make a deterministic signature, or // else filled with entropy for the usual |MLDSA_sign| behavior. OPENSSL_EXPORT bcm_status BCM_mldsa65_sign_internal( - uint8_t out_encoded_signature[BCM_MLDSA65_SIGNATURE_BYTES], - const struct BCM_mldsa65_private_key *private_key, const uint8_t *msg, - size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, + uint8_t out_encoded_signature[MLDSA65_SIGNATURE_BYTES], + const MLDSA65_private_key *private_key, const uint8_t *msg, size_t msg_len, + const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len, const uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]); @@ -384,124 +334,101 @@ OPENSSL_EXPORT bcm_status BCM_mldsa65_sign_internal( // signature of |msg| by |public_key|. The |context_prefix| and |context| are // prefixed to the message before verification, in that order. OPENSSL_EXPORT bcm_status BCM_mldsa65_verify_internal( - const struct BCM_mldsa65_public_key *public_key, - const uint8_t encoded_signature[BCM_MLDSA65_SIGNATURE_BYTES], + const MLDSA65_public_key *public_key, + const uint8_t encoded_signature[MLDSA65_SIGNATURE_BYTES], const uint8_t *msg, size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len); // BCM_mldsa65_marshal_private_key serializes |private_key| to |out| in the // NIST format for ML-DSA-65 private keys. OPENSSL_EXPORT bcm_status BCM_mldsa65_marshal_private_key( - CBB *out, const struct BCM_mldsa65_private_key *private_key); + CBB *out, const MLDSA65_private_key *private_key); + +// BCM_mldsa65_public_keys_equal returns one if |a| and |b| are equal and zero +// otherwise. +int BCM_mldsa65_public_keys_equal(const MLDSA65_public_key *a, + const MLDSA65_public_key *b); // BCM_MLDSA87_PRIVATE_KEY_BYTES is the number of bytes in an encoded ML-DSA-87 // private key. #define BCM_MLDSA87_PRIVATE_KEY_BYTES 4896 -// BCM_MLDSA87_PUBLIC_KEY_BYTES is the number of bytes in an encoded ML-DSA-87 -// public key. -#define BCM_MLDSA87_PUBLIC_KEY_BYTES 2592 - -// BCM_MLDSA87_SIGNATURE_BYTES is the number of bytes in an encoded ML-DSA-87 -// signature. -#define BCM_MLDSA87_SIGNATURE_BYTES 4627 - -struct BCM_mldsa87_private_key { - union { - uint8_t bytes[32 + 32 + 64 + 256 * 4 * (7 + 8 + 8)]; - uint32_t alignment; - } opaque; -}; - -struct BCM_mldsa87_public_key { - union { - uint8_t bytes[32 + 64 + 256 * 4 * 8]; - uint32_t alignment; - } opaque; -}; - -struct BCM_mldsa87_prehash { - union { - uint8_t bytes[200 + 4 + 4 + 4 * sizeof(size_t)]; - uint64_t alignment; - } opaque; -}; - OPENSSL_EXPORT bcm_status BCM_mldsa87_generate_key( - uint8_t out_encoded_public_key[BCM_MLDSA87_PUBLIC_KEY_BYTES], - uint8_t out_seed[BCM_MLDSA_SEED_BYTES], - struct BCM_mldsa87_private_key *out_private_key); + uint8_t out_encoded_public_key[MLDSA87_PUBLIC_KEY_BYTES], + uint8_t out_seed[MLDSA_SEED_BYTES], MLDSA87_private_key *out_private_key); OPENSSL_EXPORT bcm_status BCM_mldsa87_private_key_from_seed( - struct BCM_mldsa87_private_key *out_private_key, - const uint8_t seed[BCM_MLDSA_SEED_BYTES]); + MLDSA87_private_key *out_private_key, const uint8_t seed[MLDSA_SEED_BYTES]); OPENSSL_EXPORT bcm_status BCM_mldsa87_public_from_private( - struct BCM_mldsa87_public_key *out_public_key, - const struct BCM_mldsa87_private_key *private_key); + MLDSA87_public_key *out_public_key, const MLDSA87_private_key *private_key); + +// BCM_mldsa87_public_of_private returns the public half of |private_key|. +const MLDSA87_public_key *BCM_mldsa87_public_of_private( + const MLDSA87_private_key *private_key); OPENSSL_EXPORT bcm_status -BCM_mldsa87_check_key_fips(struct BCM_mldsa87_private_key *private_key); +BCM_mldsa87_check_key_fips(MLDSA87_private_key *private_key); OPENSSL_EXPORT bcm_status BCM_mldsa87_generate_key_fips( - uint8_t out_encoded_public_key[BCM_MLDSA87_PUBLIC_KEY_BYTES], - uint8_t out_seed[BCM_MLDSA_SEED_BYTES], - struct BCM_mldsa87_private_key *out_private_key); + uint8_t out_encoded_public_key[MLDSA87_PUBLIC_KEY_BYTES], + uint8_t out_seed[MLDSA_SEED_BYTES], MLDSA87_private_key *out_private_key); OPENSSL_EXPORT bcm_status BCM_mldsa87_private_key_from_seed_fips( - struct BCM_mldsa87_private_key *out_private_key, - const uint8_t seed[BCM_MLDSA_SEED_BYTES]); - -OPENSSL_EXPORT bcm_status BCM_mldsa87_sign( - uint8_t out_encoded_signature[BCM_MLDSA87_SIGNATURE_BYTES], - const struct BCM_mldsa87_private_key *private_key, const uint8_t *msg, - size_t msg_len, const uint8_t *context, size_t context_len); + MLDSA87_private_key *out_private_key, const uint8_t seed[MLDSA_SEED_BYTES]); OPENSSL_EXPORT bcm_status -BCM_mldsa87_verify(const struct BCM_mldsa87_public_key *public_key, +BCM_mldsa87_sign(uint8_t out_encoded_signature[MLDSA87_SIGNATURE_BYTES], + const MLDSA87_private_key *private_key, const uint8_t *msg, + size_t msg_len, const uint8_t *context, size_t context_len); + +OPENSSL_EXPORT bcm_status +BCM_mldsa87_verify(const MLDSA87_public_key *public_key, const uint8_t *signature, const uint8_t *msg, size_t msg_len, const uint8_t *context, size_t context_len); OPENSSL_EXPORT void BCM_mldsa87_prehash_init( - struct BCM_mldsa87_prehash *out_prehash_ctx, - const struct BCM_mldsa87_public_key *public_key, const uint8_t *context, - size_t context_len); + MLDSA87_prehash *out_prehash_ctx, const MLDSA87_public_key *public_key, + const uint8_t *context, size_t context_len); OPENSSL_EXPORT void BCM_mldsa87_prehash_update( - struct BCM_mldsa87_prehash *inout_prehash_ctx, const uint8_t *msg, - size_t msg_len); + MLDSA87_prehash *inout_prehash_ctx, const uint8_t *msg, size_t msg_len); OPENSSL_EXPORT void BCM_mldsa87_prehash_finalize( - uint8_t out_msg_rep[BCM_MLDSA_MU_BYTES], - struct BCM_mldsa87_prehash *inout_prehash_ctx); + uint8_t out_msg_rep[MLDSA_MU_BYTES], MLDSA87_prehash *inout_prehash_ctx); OPENSSL_EXPORT bcm_status BCM_mldsa87_sign_message_representative( - uint8_t out_encoded_signature[BCM_MLDSA87_SIGNATURE_BYTES], - const struct BCM_mldsa87_private_key *private_key, - const uint8_t msg_rep[BCM_MLDSA_MU_BYTES]); + uint8_t out_encoded_signature[MLDSA87_SIGNATURE_BYTES], + const MLDSA87_private_key *private_key, + const uint8_t msg_rep[MLDSA_MU_BYTES]); -OPENSSL_EXPORT bcm_status BCM_mldsa87_marshal_public_key( - CBB *out, const struct BCM_mldsa87_public_key *public_key); +OPENSSL_EXPORT bcm_status BCM_mldsa87_verify_message_representative( + const MLDSA87_public_key *public_key, + const uint8_t signature[MLDSA87_SIGNATURE_BYTES], + const uint8_t msg_rep[MLDSA_MU_BYTES]); -OPENSSL_EXPORT bcm_status BCM_mldsa87_parse_public_key( - struct BCM_mldsa87_public_key *public_key, CBS *in); +OPENSSL_EXPORT bcm_status +BCM_mldsa87_marshal_public_key(CBB *out, const MLDSA87_public_key *public_key); -OPENSSL_EXPORT bcm_status BCM_mldsa87_parse_private_key( - struct BCM_mldsa87_private_key *private_key, CBS *in); +OPENSSL_EXPORT bcm_status +BCM_mldsa87_parse_public_key(MLDSA87_public_key *public_key, CBS *in); + +OPENSSL_EXPORT bcm_status +BCM_mldsa87_parse_private_key(MLDSA87_private_key *private_key, CBS *in); // BCM_mldsa87_generate_key_external_entropy generates a public/private key pair // using the given seed, writes the encoded public key to // |out_encoded_public_key| and sets |out_private_key| to the private key. OPENSSL_EXPORT bcm_status BCM_mldsa87_generate_key_external_entropy( - uint8_t out_encoded_public_key[BCM_MLDSA87_PUBLIC_KEY_BYTES], - struct BCM_mldsa87_private_key *out_private_key, - const uint8_t entropy[BCM_MLDSA_SEED_BYTES]); + uint8_t out_encoded_public_key[MLDSA87_PUBLIC_KEY_BYTES], + MLDSA87_private_key *out_private_key, + const uint8_t entropy[MLDSA_SEED_BYTES]); OPENSSL_EXPORT bcm_status BCM_mldsa87_generate_key_external_entropy_fips( - uint8_t out_encoded_public_key[BCM_MLDSA87_PUBLIC_KEY_BYTES], - struct BCM_mldsa87_private_key *out_private_key, - const uint8_t entropy[BCM_MLDSA_SEED_BYTES]); + uint8_t out_encoded_public_key[MLDSA87_PUBLIC_KEY_BYTES], + MLDSA87_private_key *out_private_key, + const uint8_t entropy[MLDSA_SEED_BYTES]); // BCM_mldsa87_sign_internal signs |msg| using |private_key| and writes the // signature to |out_encoded_signature|. The |context_prefix| and |context| are @@ -509,9 +436,9 @@ OPENSSL_EXPORT bcm_status BCM_mldsa87_generate_key_external_entropy_fips( // value can be set to zero bytes in order to make a deterministic signature, or // else filled with entropy for the usual |MLDSA_sign| behavior. OPENSSL_EXPORT bcm_status BCM_mldsa87_sign_internal( - uint8_t out_encoded_signature[BCM_MLDSA87_SIGNATURE_BYTES], - const struct BCM_mldsa87_private_key *private_key, const uint8_t *msg, - size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, + uint8_t out_encoded_signature[MLDSA87_SIGNATURE_BYTES], + const MLDSA87_private_key *private_key, const uint8_t *msg, size_t msg_len, + const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len, const uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]); @@ -519,123 +446,100 @@ OPENSSL_EXPORT bcm_status BCM_mldsa87_sign_internal( // signature of |msg| by |public_key|. The |context_prefix| and |context| are // prefixed to the message before verification, in that order. OPENSSL_EXPORT bcm_status BCM_mldsa87_verify_internal( - const struct BCM_mldsa87_public_key *public_key, - const uint8_t encoded_signature[BCM_MLDSA87_SIGNATURE_BYTES], + const MLDSA87_public_key *public_key, + const uint8_t encoded_signature[MLDSA87_SIGNATURE_BYTES], const uint8_t *msg, size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len); // BCM_mldsa87_marshal_private_key serializes |private_key| to |out| in the // NIST format for ML-DSA-87 private keys. OPENSSL_EXPORT bcm_status BCM_mldsa87_marshal_private_key( - CBB *out, const struct BCM_mldsa87_private_key *private_key); + CBB *out, const MLDSA87_private_key *private_key); + +// BCM_mldsa87_public_keys_equal returns one if |a| and |b| are equal and zero +// otherwise. +int BCM_mldsa87_public_keys_equal(const MLDSA87_public_key *a, + const MLDSA87_public_key *b); // BCM_MLDSA44_PRIVATE_KEY_BYTES is the number of bytes in an encoded ML-DSA-44 // private key. #define BCM_MLDSA44_PRIVATE_KEY_BYTES 2560 -// BCM_MLDSA44_PUBLIC_KEY_BYTES is the number of bytes in an encoded ML-DSA-44 -// public key. -#define BCM_MLDSA44_PUBLIC_KEY_BYTES 1312 - -// BCM_MLDSA44_SIGNATURE_BYTES is the number of bytes in an encoded ML-DSA-44 -// signature. -#define BCM_MLDSA44_SIGNATURE_BYTES 2420 - -struct BCM_mldsa44_private_key { - union { - uint8_t bytes[32 + 32 + 64 + 256 * 4 * (4 + 4 + 4)]; - uint32_t alignment; - } opaque; -}; - -struct BCM_mldsa44_public_key { - union { - uint8_t bytes[32 + 64 + 256 * 4 * 4]; - uint32_t alignment; - } opaque; -}; - -struct BCM_mldsa44_prehash { - union { - uint8_t bytes[200 + 4 + 4 + 4 * sizeof(size_t)]; - uint64_t alignment; - } opaque; -}; - OPENSSL_EXPORT bcm_status BCM_mldsa44_generate_key( - uint8_t out_encoded_public_key[BCM_MLDSA44_PUBLIC_KEY_BYTES], - uint8_t out_seed[BCM_MLDSA_SEED_BYTES], - struct BCM_mldsa44_private_key *out_private_key); + uint8_t out_encoded_public_key[MLDSA44_PUBLIC_KEY_BYTES], + uint8_t out_seed[MLDSA_SEED_BYTES], MLDSA44_private_key *out_private_key); OPENSSL_EXPORT bcm_status BCM_mldsa44_private_key_from_seed( - struct BCM_mldsa44_private_key *out_private_key, - const uint8_t seed[BCM_MLDSA_SEED_BYTES]); + MLDSA44_private_key *out_private_key, const uint8_t seed[MLDSA_SEED_BYTES]); OPENSSL_EXPORT bcm_status BCM_mldsa44_public_from_private( - struct BCM_mldsa44_public_key *out_public_key, - const struct BCM_mldsa44_private_key *private_key); + MLDSA44_public_key *out_public_key, const MLDSA44_private_key *private_key); + +// BCM_mldsa44_public_of_private returns the public half of |private_key|. +const MLDSA44_public_key *BCM_mldsa44_public_of_private( + const MLDSA44_private_key *private_key); OPENSSL_EXPORT bcm_status -BCM_mldsa44_check_key_fips(struct BCM_mldsa44_private_key *private_key); +BCM_mldsa44_check_key_fips(MLDSA44_private_key *private_key); OPENSSL_EXPORT bcm_status BCM_mldsa44_generate_key_fips( - uint8_t out_encoded_public_key[BCM_MLDSA44_PUBLIC_KEY_BYTES], - uint8_t out_seed[BCM_MLDSA_SEED_BYTES], - struct BCM_mldsa44_private_key *out_private_key); + uint8_t out_encoded_public_key[MLDSA44_PUBLIC_KEY_BYTES], + uint8_t out_seed[MLDSA_SEED_BYTES], MLDSA44_private_key *out_private_key); OPENSSL_EXPORT bcm_status BCM_mldsa44_private_key_from_seed_fips( - struct BCM_mldsa44_private_key *out_private_key, - const uint8_t seed[BCM_MLDSA_SEED_BYTES]); - -OPENSSL_EXPORT bcm_status BCM_mldsa44_sign( - uint8_t out_encoded_signature[BCM_MLDSA44_SIGNATURE_BYTES], - const struct BCM_mldsa44_private_key *private_key, const uint8_t *msg, - size_t msg_len, const uint8_t *context, size_t context_len); + MLDSA44_private_key *out_private_key, const uint8_t seed[MLDSA_SEED_BYTES]); OPENSSL_EXPORT bcm_status -BCM_mldsa44_verify(const struct BCM_mldsa44_public_key *public_key, +BCM_mldsa44_sign(uint8_t out_encoded_signature[MLDSA44_SIGNATURE_BYTES], + const MLDSA44_private_key *private_key, const uint8_t *msg, + size_t msg_len, const uint8_t *context, size_t context_len); + +OPENSSL_EXPORT bcm_status +BCM_mldsa44_verify(const MLDSA44_public_key *public_key, const uint8_t *signature, const uint8_t *msg, size_t msg_len, const uint8_t *context, size_t context_len); OPENSSL_EXPORT void BCM_mldsa44_prehash_init( - struct BCM_mldsa44_prehash *out_prehash_ctx, - const struct BCM_mldsa44_public_key *public_key, const uint8_t *context, - size_t context_len); + MLDSA44_prehash *out_prehash_ctx, const MLDSA44_public_key *public_key, + const uint8_t *context, size_t context_len); OPENSSL_EXPORT void BCM_mldsa44_prehash_update( - struct BCM_mldsa44_prehash *inout_prehash_ctx, const uint8_t *msg, - size_t msg_len); + MLDSA44_prehash *inout_prehash_ctx, const uint8_t *msg, size_t msg_len); OPENSSL_EXPORT void BCM_mldsa44_prehash_finalize( - uint8_t out_msg_rep[BCM_MLDSA_MU_BYTES], - struct BCM_mldsa44_prehash *inout_prehash_ctx); + uint8_t out_msg_rep[MLDSA_MU_BYTES], MLDSA44_prehash *inout_prehash_ctx); OPENSSL_EXPORT bcm_status BCM_mldsa44_sign_message_representative( - uint8_t out_encoded_signature[BCM_MLDSA44_SIGNATURE_BYTES], - const struct BCM_mldsa44_private_key *private_key, - const uint8_t msg_rep[BCM_MLDSA_MU_BYTES]); + uint8_t out_encoded_signature[MLDSA44_SIGNATURE_BYTES], + const MLDSA44_private_key *private_key, + const uint8_t msg_rep[MLDSA_MU_BYTES]); -OPENSSL_EXPORT bcm_status BCM_mldsa44_marshal_public_key( - CBB *out, const struct BCM_mldsa44_public_key *public_key); +OPENSSL_EXPORT bcm_status BCM_mldsa44_verify_message_representative( + const MLDSA44_public_key *public_key, + const uint8_t signature[MLDSA44_SIGNATURE_BYTES], + const uint8_t msg_rep[MLDSA_MU_BYTES]); -OPENSSL_EXPORT bcm_status BCM_mldsa44_parse_public_key( - struct BCM_mldsa44_public_key *public_key, CBS *in); +OPENSSL_EXPORT bcm_status +BCM_mldsa44_marshal_public_key(CBB *out, const MLDSA44_public_key *public_key); -OPENSSL_EXPORT bcm_status BCM_mldsa44_parse_private_key( - struct BCM_mldsa44_private_key *private_key, CBS *in); +OPENSSL_EXPORT bcm_status +BCM_mldsa44_parse_public_key(MLDSA44_public_key *public_key, CBS *in); + +OPENSSL_EXPORT bcm_status +BCM_mldsa44_parse_private_key(MLDSA44_private_key *private_key, CBS *in); // BCM_mldsa44_generate_key_external_entropy generates a public/private key pair // using the given seed, writes the encoded public key to // |out_encoded_public_key| and sets |out_private_key| to the private key. OPENSSL_EXPORT bcm_status BCM_mldsa44_generate_key_external_entropy( - uint8_t out_encoded_public_key[BCM_MLDSA44_PUBLIC_KEY_BYTES], - struct BCM_mldsa44_private_key *out_private_key, - const uint8_t entropy[BCM_MLDSA_SEED_BYTES]); + uint8_t out_encoded_public_key[MLDSA44_PUBLIC_KEY_BYTES], + MLDSA44_private_key *out_private_key, + const uint8_t entropy[MLDSA_SEED_BYTES]); OPENSSL_EXPORT bcm_status BCM_mldsa44_generate_key_external_entropy_fips( - uint8_t out_encoded_public_key[BCM_MLDSA44_PUBLIC_KEY_BYTES], - struct BCM_mldsa44_private_key *out_private_key, - const uint8_t entropy[BCM_MLDSA_SEED_BYTES]); + uint8_t out_encoded_public_key[MLDSA44_PUBLIC_KEY_BYTES], + MLDSA44_private_key *out_private_key, + const uint8_t entropy[MLDSA_SEED_BYTES]); // BCM_mldsa44_sign_internal signs |msg| using |private_key| and writes the // signature to |out_encoded_signature|. The |context_prefix| and |context| are @@ -643,9 +547,9 @@ OPENSSL_EXPORT bcm_status BCM_mldsa44_generate_key_external_entropy_fips( // value can be set to zero bytes in order to make a deterministic signature, or // else filled with entropy for the usual |MLDSA_sign| behavior. OPENSSL_EXPORT bcm_status BCM_mldsa44_sign_internal( - uint8_t out_encoded_signature[BCM_MLDSA44_SIGNATURE_BYTES], - const struct BCM_mldsa44_private_key *private_key, const uint8_t *msg, - size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, + uint8_t out_encoded_signature[MLDSA44_SIGNATURE_BYTES], + const MLDSA44_private_key *private_key, const uint8_t *msg, size_t msg_len, + const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len, const uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]); @@ -653,15 +557,20 @@ OPENSSL_EXPORT bcm_status BCM_mldsa44_sign_internal( // signature of |msg| by |public_key|. The |context_prefix| and |context| are // prefixed to the message before verification, in that order. OPENSSL_EXPORT bcm_status BCM_mldsa44_verify_internal( - const struct BCM_mldsa44_public_key *public_key, - const uint8_t encoded_signature[BCM_MLDSA44_SIGNATURE_BYTES], + const MLDSA44_public_key *public_key, + const uint8_t encoded_signature[MLDSA44_SIGNATURE_BYTES], const uint8_t *msg, size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len); // BCM_mldsa44_marshal_private_key serializes |private_key| to |out| in the // NIST format for ML-DSA-44 private keys. OPENSSL_EXPORT bcm_status BCM_mldsa44_marshal_private_key( - CBB *out, const struct BCM_mldsa44_private_key *private_key); + CBB *out, const MLDSA44_private_key *private_key); + +// BCM_mldsa44_public_keys_equal returns one if |a| and |b| are equal and zero +// otherwise. +int BCM_mldsa44_public_keys_equal(const MLDSA44_public_key *a, + const MLDSA44_public_key *b); // ML-KEM @@ -674,22 +583,6 @@ OPENSSL_EXPORT bcm_status BCM_mldsa44_marshal_private_key( // decapsulating party. #define BCM_MLKEM_ENCAP_ENTROPY 32 -// BCM_MLKEM768_PUBLIC_KEY_BYTES is the number of bytes in an encoded ML-KEM-768 -// public key. -#define BCM_MLKEM768_PUBLIC_KEY_BYTES 1184 - -// BCM_MLKEM1024_PUBLIC_KEY_BYTES is the number of bytes in an encoded -// ML-KEM-1024 public key. -#define BCM_MLKEM1024_PUBLIC_KEY_BYTES 1568 - -// BCM_MLKEM768_CIPHERTEXT_BYTES is number of bytes in the ML-KEM-768 -// ciphertext. -#define BCM_MLKEM768_CIPHERTEXT_BYTES 1088 - -// BCM_MLKEM1024_CIPHERTEXT_BYTES is number of bytes in the ML-KEM-1024 -// ciphertext. -#define BCM_MLKEM1024_CIPHERTEXT_BYTES 1568 - // BCM_MLKEM768_PRIVATE_KEY_BYTES is the length of the data produced by // |BCM_mlkem768_marshal_private_key|. #define BCM_MLKEM768_PRIVATE_KEY_BYTES 2400 @@ -698,73 +591,50 @@ OPENSSL_EXPORT bcm_status BCM_mldsa44_marshal_private_key( // |BCM_mlkem1024_marshal_private_key|. #define BCM_MLKEM1024_PRIVATE_KEY_BYTES 3168 -// BCM_MLKEM_SEED_BYTES is the number of bytes in an ML-KEM seed. -#define BCM_MLKEM_SEED_BYTES 64 - -// BCM_mlkem_SHARED_SECRET_BYTES is the number of bytes in an ML-KEM shared -// secret. -#define BCM_MLKEM_SHARED_SECRET_BYTES 32 - -struct BCM_mlkem768_public_key { - union { - uint8_t bytes[512 * (3 + 9) + 32 + 32]; - uint16_t alignment; - } opaque; -}; - -struct BCM_mlkem768_private_key { - union { - uint8_t bytes[512 * (3 + 3 + 9) + 32 + 32 + 32]; - uint16_t alignment; - } opaque; -}; - - - OPENSSL_EXPORT bcm_infallible BCM_mlkem768_generate_key( - uint8_t out_encoded_public_key[BCM_MLKEM768_PUBLIC_KEY_BYTES], - uint8_t optional_out_seed[BCM_MLKEM_SEED_BYTES], - struct BCM_mlkem768_private_key *out_private_key); + uint8_t out_encoded_public_key[MLKEM768_PUBLIC_KEY_BYTES], + uint8_t optional_out_seed[MLKEM_SEED_BYTES], + MLKEM768_private_key *out_private_key); -OPENSSL_EXPORT bcm_status BCM_mlkem768_private_key_from_seed( - struct BCM_mlkem768_private_key *out_private_key, const uint8_t *seed, - size_t seed_len); +OPENSSL_EXPORT bcm_status +BCM_mlkem768_private_key_from_seed(MLKEM768_private_key *out_private_key, + const uint8_t *seed, size_t seed_len); OPENSSL_EXPORT bcm_status BCM_mlkem768_generate_key_fips( - uint8_t out_encoded_public_key[BCM_MLKEM768_PUBLIC_KEY_BYTES], - uint8_t optional_out_seed[BCM_MLKEM_SEED_BYTES], - struct BCM_mlkem768_private_key *out_private_key); + uint8_t out_encoded_public_key[MLKEM768_PUBLIC_KEY_BYTES], + uint8_t optional_out_seed[MLKEM_SEED_BYTES], + MLKEM768_private_key *out_private_key); OPENSSL_EXPORT bcm_status -BCM_mlkem768_check_fips(const struct BCM_mlkem768_private_key *private_key); - -OPENSSL_EXPORT bcm_infallible BCM_mlkem768_public_from_private( - struct BCM_mlkem768_public_key *out_public_key, - const struct BCM_mlkem768_private_key *private_key); +BCM_mlkem768_check_fips(const MLKEM768_private_key *private_key); OPENSSL_EXPORT bcm_infallible -BCM_mlkem768_encap(uint8_t out_ciphertext[BCM_MLKEM768_CIPHERTEXT_BYTES], - uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], - const struct BCM_mlkem768_public_key *public_key); +BCM_mlkem768_public_from_private(MLKEM768_public_key *out_public_key, + const MLKEM768_private_key *private_key); + +OPENSSL_EXPORT bcm_infallible +BCM_mlkem768_encap(uint8_t out_ciphertext[MLKEM768_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const MLKEM768_public_key *public_key); OPENSSL_EXPORT bcm_status -BCM_mlkem768_decap(uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], +BCM_mlkem768_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], const uint8_t *ciphertext, size_t ciphertext_len, - const struct BCM_mlkem768_private_key *private_key); + const MLKEM768_private_key *private_key); OPENSSL_EXPORT bcm_status BCM_mlkem768_marshal_public_key( - CBB *out, const struct BCM_mlkem768_public_key *public_key); + CBB *out, const MLKEM768_public_key *public_key); -OPENSSL_EXPORT bcm_status BCM_mlkem768_parse_public_key( - struct BCM_mlkem768_public_key *out_public_key, CBS *in); +OPENSSL_EXPORT bcm_status +BCM_mlkem768_parse_public_key(MLKEM768_public_key *out_public_key, CBS *in); // BCM_mlkem768_parse_private_key parses a private key, in NIST's format for // private keys, from |in| and writes the result to |out_private_key|. It // returns one on success or zero on parse error or if there are trailing bytes // in |in|. This format is verbose and should be avoided. Private keys should be // stored as seeds and parsed using |BCM_mlkem768_private_key_from_seed|. -OPENSSL_EXPORT bcm_status BCM_mlkem768_parse_private_key( - struct BCM_mlkem768_private_key *out_private_key, CBS *in); +OPENSSL_EXPORT bcm_status +BCM_mlkem768_parse_private_key(MLKEM768_private_key *out_private_key, CBS *in); // BCM_mlkem768_generate_key_external_seed is a deterministic function to create // a pair of ML-KEM-768 keys, using the supplied seed. The seed needs to be @@ -772,9 +642,9 @@ OPENSSL_EXPORT bcm_status BCM_mlkem768_parse_private_key( // callers should use the non-deterministic |BCM_mlkem768_generate_key| // directly. OPENSSL_EXPORT bcm_infallible BCM_mlkem768_generate_key_external_seed( - uint8_t out_encoded_public_key[BCM_MLKEM768_PUBLIC_KEY_BYTES], - struct BCM_mlkem768_private_key *out_private_key, - const uint8_t seed[BCM_MLKEM_SEED_BYTES]); + uint8_t out_encoded_public_key[MLKEM768_PUBLIC_KEY_BYTES], + MLKEM768_private_key *out_private_key, + const uint8_t seed[MLKEM_SEED_BYTES]); // BCM_mlkem768_encap_external_entropy behaves like |MLKEM768_encap|, but uses // |MLKEM_ENCAP_ENTROPY| bytes of |entropy| for randomization. The decapsulating @@ -782,9 +652,9 @@ OPENSSL_EXPORT bcm_infallible BCM_mlkem768_generate_key_external_seed( // used for tests, regular callers should use the non-deterministic // |BCM_mlkem768_encap| directly. OPENSSL_EXPORT bcm_infallible BCM_mlkem768_encap_external_entropy( - uint8_t out_ciphertext[BCM_MLKEM768_CIPHERTEXT_BYTES], - uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], - const struct BCM_mlkem768_public_key *public_key, + uint8_t out_ciphertext[MLKEM768_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const MLKEM768_public_key *public_key, const uint8_t entropy[BCM_MLKEM_ENCAP_ENTROPY]); // BCM_mlkem768_marshal_private_key serializes |private_key| to |out| in the @@ -792,58 +662,44 @@ OPENSSL_EXPORT bcm_infallible BCM_mlkem768_encap_external_entropy( // the seed value produced by |BCM_mlkem768_generate_key|, which is // significantly smaller.) OPENSSL_EXPORT bcm_status BCM_mlkem768_marshal_private_key( - CBB *out, const struct BCM_mlkem768_private_key *private_key); - -struct BCM_mlkem1024_public_key { - union { - uint8_t bytes[512 * (4 + 16) + 32 + 32]; - uint16_t alignment; - } opaque; -}; - -struct BCM_mlkem1024_private_key { - union { - uint8_t bytes[512 * (4 + 4 + 16) + 32 + 32 + 32]; - uint16_t alignment; - } opaque; -}; + CBB *out, const MLKEM768_private_key *private_key); OPENSSL_EXPORT bcm_infallible BCM_mlkem1024_generate_key( - uint8_t out_encoded_public_key[BCM_MLKEM1024_PUBLIC_KEY_BYTES], - uint8_t optional_out_seed[BCM_MLKEM_SEED_BYTES], - struct BCM_mlkem1024_private_key *out_private_key); + uint8_t out_encoded_public_key[MLKEM1024_PUBLIC_KEY_BYTES], + uint8_t optional_out_seed[MLKEM_SEED_BYTES], + MLKEM1024_private_key *out_private_key); OPENSSL_EXPORT bcm_status BCM_mlkem1024_generate_key_fips( - uint8_t out_encoded_public_key[BCM_MLKEM1024_PUBLIC_KEY_BYTES], - uint8_t optional_out_seed[BCM_MLKEM_SEED_BYTES], - struct BCM_mlkem1024_private_key *out_private_key); + uint8_t out_encoded_public_key[MLKEM1024_PUBLIC_KEY_BYTES], + uint8_t optional_out_seed[MLKEM_SEED_BYTES], + MLKEM1024_private_key *out_private_key); OPENSSL_EXPORT bcm_status -BCM_mlkem1024_check_fips(const struct BCM_mlkem1024_private_key *private_key); +BCM_mlkem1024_check_fips(const MLKEM1024_private_key *private_key); -OPENSSL_EXPORT bcm_status BCM_mlkem1024_private_key_from_seed( - struct BCM_mlkem1024_private_key *out_private_key, const uint8_t *seed, - size_t seed_len); - -OPENSSL_EXPORT bcm_infallible BCM_mlkem1024_public_from_private( - struct BCM_mlkem1024_public_key *out_public_key, - const struct BCM_mlkem1024_private_key *private_key); +OPENSSL_EXPORT bcm_status +BCM_mlkem1024_private_key_from_seed(MLKEM1024_private_key *out_private_key, + const uint8_t *seed, size_t seed_len); OPENSSL_EXPORT bcm_infallible -BCM_mlkem1024_encap(uint8_t out_ciphertext[BCM_MLKEM1024_CIPHERTEXT_BYTES], - uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], - const struct BCM_mlkem1024_public_key *public_key); +BCM_mlkem1024_public_from_private(MLKEM1024_public_key *out_public_key, + const MLKEM1024_private_key *private_key); + +OPENSSL_EXPORT bcm_infallible +BCM_mlkem1024_encap(uint8_t out_ciphertext[MLKEM1024_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const MLKEM1024_public_key *public_key); OPENSSL_EXPORT bcm_status -BCM_mlkem1024_decap(uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], +BCM_mlkem1024_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], const uint8_t *ciphertext, size_t ciphertext_len, - const struct BCM_mlkem1024_private_key *private_key); + const MLKEM1024_private_key *private_key); OPENSSL_EXPORT bcm_status BCM_mlkem1024_marshal_public_key( - CBB *out, const struct BCM_mlkem1024_public_key *public_key); + CBB *out, const MLKEM1024_public_key *public_key); -OPENSSL_EXPORT bcm_status BCM_mlkem1024_parse_public_key( - struct BCM_mlkem1024_public_key *out_public_key, CBS *in); +OPENSSL_EXPORT bcm_status +BCM_mlkem1024_parse_public_key(MLKEM1024_public_key *out_public_key, CBS *in); // BCM_mlkem1024_parse_private_key parses a private key, in NIST's format for // private keys, from |in| and writes the result to |out_private_key|. It @@ -851,7 +707,7 @@ OPENSSL_EXPORT bcm_status BCM_mlkem1024_parse_public_key( // in |in|. This format is verbose and should be avoided. Private keys should be // stored as seeds and parsed using |BCM_mlkem1024_private_key_from_seed|. OPENSSL_EXPORT bcm_status BCM_mlkem1024_parse_private_key( - struct BCM_mlkem1024_private_key *out_private_key, CBS *in); + MLKEM1024_private_key *out_private_key, CBS *in); // BCM_mlkem1024_generate_key_external_seed is a deterministic function to // create a pair of ML-KEM-1024 keys, using the supplied seed. The seed needs to @@ -859,9 +715,9 @@ OPENSSL_EXPORT bcm_status BCM_mlkem1024_parse_private_key( // callers should use the non-deterministic |BCM_mlkem1024_generate_key| // directly. OPENSSL_EXPORT bcm_infallible BCM_mlkem1024_generate_key_external_seed( - uint8_t out_encoded_public_key[BCM_MLKEM1024_PUBLIC_KEY_BYTES], - struct BCM_mlkem1024_private_key *out_private_key, - const uint8_t seed[BCM_MLKEM_SEED_BYTES]); + uint8_t out_encoded_public_key[MLKEM1024_PUBLIC_KEY_BYTES], + MLKEM1024_private_key *out_private_key, + const uint8_t seed[MLKEM_SEED_BYTES]); // BCM_mlkem1024_encap_external_entropy behaves like |MLKEM1024_encap|, but uses // |MLKEM_ENCAP_ENTROPY| bytes of |entropy| for randomization. The @@ -869,9 +725,9 @@ OPENSSL_EXPORT bcm_infallible BCM_mlkem1024_generate_key_external_seed( // should only be used for tests, regular callers should use the // non-deterministic |BCM_mlkem1024_encap| directly. OPENSSL_EXPORT bcm_infallible BCM_mlkem1024_encap_external_entropy( - uint8_t out_ciphertext[BCM_MLKEM1024_CIPHERTEXT_BYTES], - uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], - const struct BCM_mlkem1024_public_key *public_key, + uint8_t out_ciphertext[MLKEM1024_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const MLKEM1024_public_key *public_key, const uint8_t entropy[BCM_MLKEM_ENCAP_ENTROPY]); // BCM_mlkem1024_marshal_private_key serializes |private_key| to |out| in the @@ -879,7 +735,7 @@ OPENSSL_EXPORT bcm_infallible BCM_mlkem1024_encap_external_entropy( // the seed value produced by |BCM_mlkem1024_generate_key|, which is // significantly smaller.) OPENSSL_EXPORT bcm_status BCM_mlkem1024_marshal_private_key( - CBB *out, const struct BCM_mlkem1024_private_key *private_key); + CBB *out, const MLKEM1024_private_key *private_key); // SLH-DSA @@ -983,26 +839,24 @@ OPENSSL_EXPORT bcm_status BCM_slhdsa_sha2_128s_prehash_verify( // BCM_aes_encrypt encrypts a single block from |in| to |out| with |key|. The // |in| and |out| pointers may overlap. -OPENSSL_EXPORT bcm_infallible BCM_aes_encrypt(const uint8_t *in, uint8_t *out, - const AES_KEY *key); +bcm_infallible BCM_aes_encrypt(const uint8_t *in, uint8_t *out, + const AES_KEY *key); // BCM_aes_decrypt decrypts a single block from |in| to |out| with |key|. The // |in| and |out| pointers may overlap. -OPENSSL_EXPORT bcm_infallible BCM_aes_decrypt(const uint8_t *in, uint8_t *out, - const AES_KEY *key); +bcm_infallible BCM_aes_decrypt(const uint8_t *in, uint8_t *out, + const AES_KEY *key); // BCM_aes_set_encrypt_key configures |aeskey| to encrypt with the |bits|-bit // key, |key|. |key| must point to |bits|/8 bytes. It will return failure if // |bits| is an invalid AES key size. -OPENSSL_EXPORT bcm_status BCM_aes_set_encrypt_key(const uint8_t *key, - unsigned bits, - AES_KEY *aeskey); +bcm_status BCM_aes_set_encrypt_key(const uint8_t *key, unsigned bits, + AES_KEY *aeskey); // BCM_aes_set_decrypt_key configures |aeskey| to decrypt with the |bits|-bit // key, |key|. |key| must point to |bits|/8 bytes. It will return failure if // |bits| is an invalid AES key size. -OPENSSL_EXPORT bcm_status BCM_aes_set_decrypt_key(const uint8_t *key, - unsigned bits, - AES_KEY *aeskey); +bcm_status BCM_aes_set_decrypt_key(const uint8_t *key, unsigned bits, + AES_KEY *aeskey); #if defined(__cplusplus) diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/asm/armv8-mont.pl b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/asm/armv8-mont.pl index 80e0eeae6d..59a7e0eb74 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/asm/armv8-mont.pl +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/asm/armv8-mont.pl @@ -504,7 +504,7 @@ __bn_sqr8x_mont: adc $acc5,$acc5,$t1 adds $acc5,$acc5,$t2 - sub $t0,$ap_end,$num // rewinded ap + sub $t0,$ap_end,$num // rewound ap adc $acc6,xzr,xzr // t[14] add $acc6,$acc6,$t3 @@ -854,7 +854,7 @@ $code.=<<___; // to be zero at this point ldp $a0,$a1,[$tp,#8*0] sub $cnt,$np_end,$np // done yet? - sub $t2,$np_end,$num // rewinded np + sub $t2,$np_end,$num // rewound np ldp $a2,$a3,[$tp,#8*2] ldp $a4,$a5,[$tp,#8*4] ldp $a6,$a7,[$tp,#8*6] @@ -1212,7 +1212,7 @@ __bn_mul4x_mont: //adc $carry,$carry,xzr cbnz $cnt,.Loop_mul4x_1st_tail - sub $t1,$ap_end,$num // rewinded $ap + sub $t1,$ap_end,$num // rewound $ap cbz $t0,.Lmul4x_proceed ldp $a0,$a1,[$ap,#8*0] @@ -1354,7 +1354,7 @@ __bn_mul4x_mont: //adc $carry,$carry,xzr cbnz $cnt,.Loop_mul4x_tail - sub $t1,$np,$num // rewinded np? + sub $t1,$np,$num // rewound np? adc $carry,$carry,xzr cbz $t0,.Loop_mul4x_break diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/asm/co-586.pl b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/asm/co-586.pl index c3f4e52deb..fee2c55361 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/asm/co-586.pl +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/asm/co-586.pl @@ -46,17 +46,17 @@ sub mul_add_c &mul("edx"); &add($c0,"eax"); - &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0; # laod next a + &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0; # load next a &mov("eax",&wparam(0)) if $pos > 0; # load r[] ### &adc($c1,"edx"); - &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 0; # laod next b - &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 1; # laod next b + &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 0; # load next b + &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 1; # load next b ### &adc($c2,0); # is pos > 1, it means it is the last loop &mov(&DWP($i*4,"eax","",0),$c0) if $pos > 0; # save r[]; - &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1; # laod next a + &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1; # load next a } sub sqr_add_c diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/bn.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/bn.cc.inc index 83ee8337e1..c57db0ee2a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/bn.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/bn.cc.inc @@ -33,8 +33,8 @@ BIGNUM *BN_new(void) { BIGNUM *bn = reinterpret_cast(OPENSSL_malloc(sizeof(BIGNUM))); - if (bn == NULL) { - return NULL; + if (bn == nullptr) { + return nullptr; } OPENSSL_memset(bn, 0, sizeof(BIGNUM)); @@ -48,7 +48,7 @@ BIGNUM *BN_secure_new(void) { return BN_new(); } void BN_init(BIGNUM *bn) { OPENSSL_memset(bn, 0, sizeof(BIGNUM)); } void BN_free(BIGNUM *bn) { - if (bn == NULL) { + if (bn == nullptr) { return; } @@ -59,7 +59,7 @@ void BN_free(BIGNUM *bn) { if (bn->flags & BN_FLG_MALLOCED) { OPENSSL_free(bn); } else { - bn->d = NULL; + bn->d = nullptr; } } @@ -68,18 +68,18 @@ void BN_clear_free(BIGNUM *bn) { BN_free(bn); } BIGNUM *BN_dup(const BIGNUM *src) { BIGNUM *copy; - if (src == NULL) { - return NULL; + if (src == nullptr) { + return nullptr; } copy = BN_new(); - if (copy == NULL) { - return NULL; + if (copy == nullptr) { + return nullptr; } if (!BN_copy(copy, src)) { BN_free(copy); - return NULL; + return nullptr; } return copy; @@ -91,7 +91,7 @@ BIGNUM *BN_copy(BIGNUM *dest, const BIGNUM *src) { } if (!bn_wexpand(dest, src->width)) { - return NULL; + return nullptr; } OPENSSL_memcpy(dest->d, src->d, sizeof(src->d[0]) * src->width); @@ -102,7 +102,7 @@ BIGNUM *BN_copy(BIGNUM *dest, const BIGNUM *src) { } void BN_clear(BIGNUM *bn) { - if (bn->d != NULL) { + if (bn->d != nullptr) { OPENSSL_memset(bn->d, 0, bn->dmax * sizeof(bn->d[0])); } @@ -308,7 +308,7 @@ int bn_wexpand(BIGNUM *bn, size_t words) { } a = reinterpret_cast(OPENSSL_calloc(words, sizeof(BN_ULONG))); - if (a == NULL) { + if (a == nullptr) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/bytes.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/bytes.cc.inc index b5066ea07b..fad749ad75 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/bytes.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/bytes.cc.inc @@ -49,11 +49,11 @@ void bn_big_endian_to_words(BN_ULONG *out, size_t out_len, const uint8_t *in, } BIGNUM *BN_bin2bn(const uint8_t *in, size_t len, BIGNUM *ret) { - BIGNUM *bn = NULL; - if (ret == NULL) { + BIGNUM *bn = nullptr; + if (ret == nullptr) { bn = BN_new(); - if (bn == NULL) { - return NULL; + if (bn == nullptr) { + return nullptr; } ret = bn; } @@ -66,7 +66,7 @@ BIGNUM *BN_bin2bn(const uint8_t *in, size_t len, BIGNUM *ret) { size_t num_words = ((len - 1) / BN_BYTES) + 1; if (!bn_wexpand(ret, num_words)) { BN_free(bn); - return NULL; + return nullptr; } // |bn_wexpand| must check bounds on |num_words| to write it into @@ -80,11 +80,11 @@ BIGNUM *BN_bin2bn(const uint8_t *in, size_t len, BIGNUM *ret) { } BIGNUM *BN_lebin2bn(const uint8_t *in, size_t len, BIGNUM *ret) { - BIGNUM *bn = NULL; - if (ret == NULL) { + BIGNUM *bn = nullptr; + if (ret == nullptr) { bn = BN_new(); - if (bn == NULL) { - return NULL; + if (bn == nullptr) { + return nullptr; } ret = bn; } @@ -99,7 +99,7 @@ BIGNUM *BN_lebin2bn(const uint8_t *in, size_t len, BIGNUM *ret) { size_t num_words = ((len - 1) / BN_BYTES) + 1; if (!bn_wexpand(ret, num_words)) { BN_free(bn); - return NULL; + return nullptr; } ret->width = (int)num_words; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/cmp.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/cmp.cc.inc index d60becae14..8ef79c6c4c 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/cmp.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/cmp.cc.inc @@ -59,10 +59,10 @@ int BN_ucmp(const BIGNUM *a, const BIGNUM *b) { } int BN_cmp(const BIGNUM *a, const BIGNUM *b) { - if ((a == NULL) || (b == NULL)) { - if (a != NULL) { + if ((a == nullptr) || (b == nullptr)) { + if (a != nullptr) { return -1; - } else if (b != NULL) { + } else if (b != nullptr) { return 1; } else { return 0; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/div.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/div.cc.inc index a29bf9cbd4..7cffb32bfe 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/div.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/div.cc.inc @@ -170,10 +170,10 @@ int BN_div(BIGNUM *quotient, BIGNUM *rem, const BIGNUM *numerator, BIGNUM *tmp = BN_CTX_get(ctx); BIGNUM *snum = BN_CTX_get(ctx); BIGNUM *sdiv = BN_CTX_get(ctx); - BIGNUM *res = quotient == NULL ? BN_CTX_get(ctx) : quotient; + BIGNUM *res = quotient == nullptr ? BN_CTX_get(ctx) : quotient; int norm_shift, num_n, loop, div_n; BN_ULONG d0, d1; - if (tmp == NULL || snum == NULL || sdiv == NULL || res == NULL) { + if (tmp == nullptr || snum == nullptr || sdiv == nullptr || res == nullptr) { return 0; } @@ -330,7 +330,7 @@ int BN_div(BIGNUM *quotient, BIGNUM *rem, const BIGNUM *numerator, bn_set_minimal_width(res); // Knuth step D8: Unnormalize. snum now contains the remainder. - if (rem != NULL && !BN_rshift(rem, snum, norm_shift)) { + if (rem != nullptr && !BN_rshift(rem, snum, norm_shift)) { return 0; } @@ -412,15 +412,15 @@ int bn_div_consttime(BIGNUM *quotient, BIGNUM *remainder, bssl::BN_CTXScope scope(ctx); BIGNUM *q = quotient, *r = remainder; - if (quotient == NULL || quotient == numerator || quotient == divisor) { + if (quotient == nullptr || quotient == numerator || quotient == divisor) { q = BN_CTX_get(ctx); } - if (remainder == NULL || remainder == numerator || remainder == divisor) { + if (remainder == nullptr || remainder == numerator || remainder == divisor) { r = BN_CTX_get(ctx); } BIGNUM *tmp = BN_CTX_get(ctx); int initial_words; - if (q == NULL || r == NULL || tmp == NULL || + if (q == nullptr || r == nullptr || tmp == nullptr || !bn_wexpand(q, numerator->width) || !bn_wexpand(r, divisor->width) || !bn_wexpand(tmp, divisor->width)) { return 0; @@ -472,8 +472,8 @@ int bn_div_consttime(BIGNUM *quotient, BIGNUM *remainder, } } - if ((quotient != NULL && !BN_copy(quotient, q)) || - (remainder != NULL && !BN_copy(remainder, r))) { + if ((quotient != nullptr && !BN_copy(quotient, q)) || + (remainder != nullptr && !BN_copy(remainder, r))) { return 0; } @@ -482,8 +482,8 @@ int bn_div_consttime(BIGNUM *quotient, BIGNUM *remainder, static BIGNUM *bn_scratch_space_from_ctx(size_t width, BN_CTX *ctx) { BIGNUM *ret = BN_CTX_get(ctx); - if (ret == NULL || !bn_wexpand(ret, width)) { - return NULL; + if (ret == nullptr || !bn_wexpand(ret, width)) { + return nullptr; } ret->neg = 0; ret->width = (int)width; @@ -503,8 +503,8 @@ static const BIGNUM *bn_resized_from_ctx(const BIGNUM *bn, size_t width, return bn; } BIGNUM *ret = bn_scratch_space_from_ctx(width, ctx); - if (ret == NULL || !BN_copy(ret, bn) || !bn_resize_words(ret, width)) { - return NULL; + if (ret == nullptr || !BN_copy(ret, bn) || !bn_resize_words(ret, width)) { + return nullptr; } return ret; } @@ -573,7 +573,7 @@ int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx) { bssl::BN_CTXScope scope(ctx); BIGNUM *t = BN_CTX_get(ctx); - if (t == NULL) { + if (t == nullptr) { return 0; } @@ -713,7 +713,7 @@ BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w) { // fall back to using |BN_div_word|. if (w > ((BN_ULONG)1 << BN_BITS4)) { BIGNUM *tmp = BN_dup(a); - if (tmp == NULL) { + if (tmp == nullptr) { return (BN_ULONG)-1; } ret = BN_div_word(tmp, w); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/exponentiation.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/exponentiation.cc.inc index a6c7d55309..3f36756611 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/exponentiation.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/exponentiation.cc.inc @@ -154,7 +154,7 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, bssl::BN_CTXScope scope(ctx); BIGNUM *r = BN_CTX_get(ctx); val[0] = BN_CTX_get(ctx); - if (r == NULL || val[0] == NULL) { + if (r == nullptr || val[0] == nullptr) { return 0; } @@ -178,12 +178,12 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, } if (window > 1) { BIGNUM *d = BN_CTX_get(ctx); - if (d == NULL || !BN_mod_mul_montgomery(d, val[0], val[0], mont, ctx)) { + if (d == nullptr || !BN_mod_mul_montgomery(d, val[0], val[0], mont, ctx)) { return 0; } for (int i = 1; i < 1 << (window - 1); i++) { val[i] = BN_CTX_get(ctx); - if (val[i] == NULL || + if (val[i] == nullptr || !BN_mod_mul_montgomery(val[i], val[i - 1], d, mont, ctx)) { return 0; } @@ -343,7 +343,7 @@ void bn_mod_exp_mont_small(BN_ULONG *r, const BN_ULONG *a, size_t num, void bn_mod_inverse0_prime_mont_small(BN_ULONG *r, const BN_ULONG *a, size_t num, const BN_MONT_CTX *mont) { - if (num != (size_t)mont->N.width || num > BN_SMALL_MAX_WORDS) { + if (num != (size_t)mont->N.width || num > BN_SMALL_MAX_WORDS || num == 0) { abort(); } @@ -414,9 +414,9 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, const BN_MONT_CTX *mont) { int i, ret = 0, wvalue; - void *powerbuf_free = NULL; + void *powerbuf_free = nullptr; size_t powerbuf_len = 0; - BN_ULONG *powerbuf = NULL; + BN_ULONG *powerbuf = nullptr; if (!BN_is_odd(m)) { OPENSSL_PUT_ERROR(BN, BN_R_CALLED_WITH_EVEN_MODULUS); @@ -516,11 +516,11 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, powerbuf = storage; } // |storage| is more than large enough to handle 1024-bit inputs. - assert(powerbuf != NULL || top * BN_BITS2 > 1024); + assert(powerbuf != nullptr || top * BN_BITS2 > 1024); #endif - if (powerbuf == NULL) { + if (powerbuf == nullptr) { powerbuf_free = OPENSSL_malloc(powerbuf_len + MOD_EXP_CTIME_ALIGN); - if (powerbuf_free == NULL) { + if (powerbuf_free == nullptr) { goto err; } powerbuf = reinterpret_cast( @@ -731,7 +731,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, ret = 1; err: - if (powerbuf != NULL && powerbuf_free == NULL) { + if (powerbuf != nullptr && powerbuf_free == nullptr) { OPENSSL_cleanse(powerbuf, powerbuf_len); } OPENSSL_free(powerbuf_free); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/gcd.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/gcd.cc.inc index e876c4d2d9..907592f0a6 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/gcd.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/gcd.cc.inc @@ -40,12 +40,12 @@ int BN_mod_inverse_odd(BIGNUM *out, int *out_no_inverse, const BIGNUM *a, BIGNUM *X = BN_CTX_get(ctx); BIGNUM *Y = BN_CTX_get(ctx); BIGNUM *R = out; - if (Y == NULL) { + if (Y == nullptr) { return 0; } BN_zero(Y); - if (!BN_one(X) || BN_copy(B, a) == NULL || BN_copy(A, n) == NULL) { + if (!BN_one(X) || BN_copy(B, a) == nullptr || BN_copy(A, n) == nullptr) { return 0; } A->neg = 0; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/jacobi.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/jacobi.cc.inc index 1c1c51f245..2c90f8cff6 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/jacobi.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/jacobi.cc.inc @@ -45,7 +45,7 @@ int bn_jacobi(const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) { bssl::BN_CTXScope scope(ctx); BIGNUM *A = BN_CTX_get(ctx); BIGNUM *B = BN_CTX_get(ctx); - if (B == NULL) { + if (B == nullptr) { return -2; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/montgomery.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/montgomery.cc.inc index 6281b299ed..26f311a0eb 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/montgomery.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/montgomery.cc.inc @@ -40,8 +40,8 @@ void bn_mont_ctx_cleanup(BN_MONT_CTX *mont) { BN_MONT_CTX *BN_MONT_CTX_new(void) { BN_MONT_CTX *ret = reinterpret_cast(OPENSSL_malloc(sizeof(BN_MONT_CTX))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } bn_mont_ctx_init(ret); @@ -62,7 +62,7 @@ BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, const BN_MONT_CTX *from) { } if (!BN_copy(&to->RR, &from->RR) || !BN_copy(&to->N, &from->N)) { - return NULL; + return nullptr; } for (size_t i = 0; i < BN_MONT_CTX_N0_LIMBS; i++) { to->n0[i] = from->n0[i]; @@ -121,10 +121,10 @@ int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx) { return 0; } - BN_CTX *new_ctx = NULL; - if (ctx == NULL) { + BN_CTX *new_ctx = nullptr; + if (ctx == nullptr) { new_ctx = BN_CTX_new(); - if (new_ctx == NULL) { + if (new_ctx == nullptr) { return 0; } ctx = new_ctx; @@ -146,19 +146,19 @@ int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx) { BN_MONT_CTX *BN_MONT_CTX_new_for_modulus(const BIGNUM *mod, BN_CTX *ctx) { BN_MONT_CTX *mont = BN_MONT_CTX_new(); - if (mont == NULL || !BN_MONT_CTX_set(mont, mod, ctx)) { + if (mont == nullptr || !BN_MONT_CTX_set(mont, mod, ctx)) { BN_MONT_CTX_free(mont); - return NULL; + return nullptr; } return mont; } BN_MONT_CTX *BN_MONT_CTX_new_consttime(const BIGNUM *mod, BN_CTX *ctx) { BN_MONT_CTX *mont = BN_MONT_CTX_new(); - if (mont == NULL || !bn_mont_ctx_set_N_and_n0(mont, mod) || + if (mont == nullptr || !bn_mont_ctx_set_N_and_n0(mont, mod) || !bn_mont_ctx_set_RR_consttime(mont, ctx)) { BN_MONT_CTX_free(mont); - return NULL; + return nullptr; } return mont; } @@ -174,10 +174,10 @@ int BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, CRYPTO_MUTEX *lock, } CRYPTO_MUTEX_lock_write(lock); - if (*pmont == NULL) { + if (*pmont == nullptr) { *pmont = BN_MONT_CTX_new_for_modulus(mod, bn_ctx); } - const int ok = *pmont != NULL; + const int ok = *pmont != nullptr; CRYPTO_MUTEX_unlock_write(lock); return ok; } @@ -203,10 +203,7 @@ static int bn_from_montgomery_in_place(BN_ULONG *r, size_t num_r, BN_ULONG *a, BN_ULONG carry = 0; for (size_t i = 0; i < num_n; i++) { BN_ULONG v = bn_mul_add_words(a + i, n, num_n, a[i] * n0); - v += carry + a[i + num_n]; - carry |= (v != a[i + num_n]); - carry &= (v <= a[i + num_n]); - a[i + num_n] = v; + a[i + num_n] = CRYPTO_addc_w(a[i + num_n], v, carry, &carry); } // Shift |num_n| words to divide by R. We have |a| < 2 * |n|. Note that |a| @@ -245,7 +242,7 @@ int BN_from_montgomery(BIGNUM *r, const BIGNUM *a, const BN_MONT_CTX *mont, BN_CTX *ctx) { bssl::BN_CTXScope scope(ctx); BIGNUM *t = BN_CTX_get(ctx); - if (t == NULL || !BN_copy(t, a)) { + if (t == nullptr || !BN_copy(t, a)) { return 0; } @@ -278,7 +275,7 @@ static int bn_mod_mul_montgomery_fallback(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) { bssl::BN_CTXScope scope(ctx); BIGNUM *tmp = BN_CTX_get(ctx); - if (tmp == NULL) { + if (tmp == nullptr) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/montgomery_inv.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/montgomery_inv.cc.inc index b2fa839089..1c2b398613 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/montgomery_inv.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/montgomery_inv.cc.inc @@ -20,16 +20,13 @@ #include "../../internal.h" -static uint64_t bn_neg_inv_mod_r_u64(uint64_t n); +static uint64_t bn_neg_inv_mod_u64(uint64_t n); static_assert(BN_MONT_CTX_N0_LIMBS == 1 || BN_MONT_CTX_N0_LIMBS == 2, "BN_MONT_CTX_N0_LIMBS value is invalid"); static_assert(sizeof(BN_ULONG) * BN_MONT_CTX_N0_LIMBS == sizeof(uint64_t), "uint64_t is insufficient precision for n0"); -// LG_LITTLE_R is log_2(r). -#define LG_LITTLE_R (BN_MONT_CTX_N0_LIMBS * BN_BITS2) - uint64_t bn_mont_n0(const BIGNUM *n) { // These conditions are checked by the caller, |BN_MONT_CTX_set| or // |BN_MONT_CTX_new_consttime|. @@ -37,11 +34,11 @@ uint64_t bn_mont_n0(const BIGNUM *n) { assert(!BN_is_negative(n)); assert(BN_is_odd(n)); - // r == 2**(BN_MONT_CTX_N0_LIMBS * BN_BITS2) and LG_LITTLE_R == lg(r). This - // ensures that we can do integer division by |r| by simply ignoring - // |BN_MONT_CTX_N0_LIMBS| limbs. Similarly, we can calculate values modulo - // |r| by just looking at the lowest |BN_MONT_CTX_N0_LIMBS| limbs. This is - // what makes Montgomery multiplication efficient. + // r == 2**(BN_MONT_CTX_N0_LIMBS * BN_BITS2) ensures that we can do integer + // division by |r| by simply ignoring |BN_MONT_CTX_N0_LIMBS| limbs. Similarly, + // we can calculate values modulo |r| by just looking at the lowest + // |BN_MONT_CTX_N0_LIMBS| limbs. This is what makes Montgomery multiplication + // efficient. // // As shown in Algorithm 1 of "Fast Prime Field Elliptic Curve Cryptography // with 256 Bit Primes" by Shay Gueron and Vlad Krasnov, in the loop of a @@ -76,87 +73,45 @@ uint64_t bn_mont_n0(const BIGNUM *n) { } #endif - return bn_neg_inv_mod_r_u64(n_mod_r); + // A 64-bit inverse is enough precision to invert by r. (r is also currently + // always 2^64.) + return bn_neg_inv_mod_u64(n_mod_r); } -// bn_neg_inv_r_mod_n_u64 calculates the -1/n mod r; i.e. it calculates |v| -// such that u*r - v*n == 1. |r| is the constant defined in |bn_mont_n0|. |n| -// must be odd. -// -// This is derived from |xbinGCD| in Henry S. Warren, Jr.'s "Montgomery -// Multiplication" (http://www.hackersdelight.org/MontgomeryMultiplication.pdf). -// It is very similar to the MODULAR-INVERSE function in Stephen R. Dussé's and -// Burton S. Kaliski Jr.'s "A Cryptographic Library for the Motorola DSP56000" -// (http://link.springer.com/chapter/10.1007%2F3-540-46877-3_21). -// -// This is inspired by Joppe W. Bos's "Constant Time Modular Inversion" -// (http://www.joppebos.com/files/CTInversion.pdf) so that the inversion is -// constant-time with respect to |n|. We assume uint64_t additions, -// subtractions, shifts, and bitwise operations are all constant time, which -// may be a large leap of faith on 32-bit targets. We avoid division and -// multiplication, which tend to be the most problematic in terms of timing -// leaks. -// -// Most GCD implementations return values such that |u*r + v*n == 1|, so the -// caller would have to negate the resultant |v| for the purpose of Montgomery -// multiplication. This implementation does the negation implicitly by doing -// the computations as a difference instead of a sum. -static uint64_t bn_neg_inv_mod_r_u64(uint64_t n) { +// bn_neg_inv_mod_u64 calculates -1/n mod 2^64. |n| must be odd. +static uint64_t bn_neg_inv_mod_u64(uint64_t n) { + // This is a modified version of the technique described in + // https://crypto.stackexchange.com/a/47496 and + // https://bearssl.org/bigint.html#montgomery-reduction-and-multiplication. We + // modify it to compute the negative inverse directly so that, on 32-bit, + // negation happens before we go to double-word precision, instead of at the + // end. + // + // If r = -n^-1 (mod m), then r * (r*n + 2) is -n^(-1) (mod m^2). This is + // because, for some k, r*n = k*m - 1. Then: + // + // r*n * (r*n + 2) = (k*m - 1) * (k*m + 1) = k^2*m^2 - 1 = -1 (mod m^2) + // + // We start with the negative inverse mod some small power of 2 and square the + // modulus up to 2^64. n = n^-1 (mod 8) for all odd n, so r = -n (mod 8). From + // there, four iterations are enough for 2^32 and five for 2^64. assert(n % 2 == 1); - - // alpha == 2**(lg r - 1) == r / 2. - static const uint64_t alpha = UINT64_C(1) << (LG_LITTLE_R - 1); - - const uint64_t beta = n; - - uint64_t u = 1; - uint64_t v = 0; - - // The invariant maintained from here on is: - // 2**(lg r - i) == u*2*alpha - v*beta. - for (size_t i = 0; i < LG_LITTLE_R; ++i) { -#if BN_BITS2 == 64 && defined(BN_ULLONG) - assert((BN_ULLONG)(1) << (LG_LITTLE_R - i) == - ((BN_ULLONG)u * 2 * alpha) - ((BN_ULLONG)v * beta)); -#endif - - // Delete a common factor of 2 in u and v if |u| is even. Otherwise, set - // |u = (u + beta) / 2| and |v = (v / 2) + alpha|. - - uint64_t u_is_odd = UINT64_C(0) - (u & 1); // Either 0xff..ff or 0. - - // The addition can overflow, so use Dietz's method for it. - // - // Dietz calculates (x+y)/2 by (x⊕y)>>1 + x&y. This is valid for all - // (unsigned) x and y, even when x+y overflows. Evidence for 32-bit values - // (embedded in 64 bits to so that overflow can be ignored): - // - // (declare-fun x () (_ BitVec 64)) - // (declare-fun y () (_ BitVec 64)) - // (assert (let ( - // (one (_ bv1 64)) - // (thirtyTwo (_ bv32 64))) - // (and - // (bvult x (bvshl one thirtyTwo)) - // (bvult y (bvshl one thirtyTwo)) - // (not (= - // (bvadd (bvlshr (bvxor x y) one) (bvand x y)) - // (bvlshr (bvadd x y) one))) - // ))) - // (check-sat) - uint64_t beta_if_u_is_odd = beta & u_is_odd; // Either |beta| or 0. - u = ((u ^ beta_if_u_is_odd) >> 1) + (u & beta_if_u_is_odd); - - uint64_t alpha_if_u_is_odd = alpha & u_is_odd; // Either |alpha| or 0. - v = (v >> 1) + alpha_if_u_is_odd; +#if defined(OPENSSL_32_BIT) + // Compute the result mod 2^32 first. + uint32_t n32 = static_cast(n); + uint32_t r = 0u - n32; + for (int i = 0; i < 4; i++) { + r *= r * n32 + 2; } - - // The invariant now shows that u*r - v*n == 1 since r == 2 * alpha. -#if BN_BITS2 == 64 && defined(BN_ULLONG) - declassify_assert(1 == ((BN_ULLONG)u * 2 * alpha) - ((BN_ULLONG)v * beta)); + // Run one more double-word iteration to get the result mod 2^64. + return r * (r * n + 2); +#else + uint64_t r = 0u - n; + for (int i = 0; i < 5; i++) { + r *= r * n + 2; + } + return r; #endif - - return v; } int bn_mont_ctx_set_RR_consttime(BN_MONT_CTX *mont, BN_CTX *ctx) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/mul.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/mul.cc.inc index e33fb48d6a..f98b8867af 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/mul.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/mul.cc.inc @@ -158,7 +158,7 @@ static int bn_mul_impl(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, bssl::BN_CTXScope scope(ctx); if (r == a || r == b) { rr = BN_CTX_get(ctx); - if (rr == NULL) { + if (rr == nullptr) { return 0; } } else { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/prime.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/prime.cc.inc index fabb5451fd..42f0dd2ac4 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/prime.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/prime.cc.inc @@ -14,6 +14,8 @@ #include +#include + #include #include @@ -193,9 +195,9 @@ static int BN_prime_checks_for_size(int bits) { // of excluding a candidate with trial division is larger. static size_t num_trial_division_primes(const BIGNUM *n) { if (n->width * BN_BITS2 > 1024) { - return OPENSSL_ARRAY_SIZE(kPrimes); + return std::size(kPrimes); } - return OPENSSL_ARRAY_SIZE(kPrimes) / 2; + return std::size(kPrimes) / 2; } // BN_PRIME_CHECKS_BLINDED is the iteration count for blinding the constant-time @@ -315,7 +317,7 @@ int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe, const BIGNUM *add, loop: // make a random number and set the top and bottom bits - if (add == NULL) { + if (add == nullptr) { if (!probable_prime(ret, bits)) { return 0; } @@ -356,14 +358,14 @@ loop: // TODO(davidben): This doesn't quite work because an iteration count of 1 // still runs the blinding mechanism. for (i = 0; i < checks; i++) { - j = BN_is_prime_fasttest_ex(ret, 1, ctx.get(), 0, NULL); + j = BN_is_prime_fasttest_ex(ret, 1, ctx.get(), 0, nullptr); if (j == -1) { return 0; } else if (j == 0) { goto loop; } - j = BN_is_prime_fasttest_ex(t, 1, ctx.get(), 0, NULL); + j = BN_is_prime_fasttest_ex(t, 1, ctx.get(), 0, nullptr); if (j == -1) { return 0; } else if (j == 0) { @@ -410,10 +412,10 @@ int bn_miller_rabin_init(BN_MILLER_RABIN *miller_rabin, const BN_MONT_CTX *mont, miller_rabin->m = BN_CTX_get(ctx); miller_rabin->one_mont = BN_CTX_get(ctx); miller_rabin->w1_mont = BN_CTX_get(ctx); - if (miller_rabin->w1 == NULL || // - miller_rabin->m == NULL || // - miller_rabin->one_mont == NULL || // - miller_rabin->w1_mont == NULL) { + if (miller_rabin->w1 == nullptr || // + miller_rabin->m == nullptr || // + miller_rabin->one_mont == nullptr || // + miller_rabin->w1_mont == nullptr) { return 0; } @@ -450,7 +452,7 @@ int bn_miller_rabin_iteration(const BN_MILLER_RABIN *miller_rabin, const BIGNUM *w = &mont->N; BIGNUM *z = BN_CTX_get(ctx); crypto_word_t is_possibly_prime; - if (z == NULL || + if (z == nullptr || !BN_mod_exp_mont_consttime(z, b, miller_rabin->m, w, ctx, mont) || !BN_to_montgomery(z, z, mont, ctx)) { return 0; @@ -864,7 +866,7 @@ static int probable_prime_dh_safe(BIGNUM *p, int bits, const BIGNUM *padd, BIGNUM *t1 = BN_CTX_get(ctx); BIGNUM *q = BN_CTX_get(ctx); BIGNUM *qadd = BN_CTX_get(ctx); - if (qadd == NULL) { + if (qadd == nullptr) { return 0; } @@ -885,7 +887,7 @@ static int probable_prime_dh_safe(BIGNUM *p, int bits, const BIGNUM *padd, return 0; } - if (rem == NULL) { + if (rem == nullptr) { if (!BN_add_word(q, 1)) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/random.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/random.cc.inc index 20993355f1..5c565991eb 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/random.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/random.cc.inc @@ -27,7 +27,7 @@ int BN_rand(BIGNUM *rnd, int bits, int top, int bottom) { - if (rnd == NULL) { + if (rnd == nullptr) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/shift.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/shift.cc.inc index 491c796c9e..cd7dac9d41 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/shift.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/shift.cc.inc @@ -132,7 +132,7 @@ int bn_rshift_secret_shift(BIGNUM *r, const BIGNUM *a, unsigned n, bssl::BN_CTXScope scope(ctx); BIGNUM *tmp = BN_CTX_get(ctx); unsigned max_bits; - if (tmp == NULL || !BN_copy(r, a) || !bn_wexpand(tmp, r->width)) { + if (tmp == nullptr || !BN_copy(r, a) || !bn_wexpand(tmp, r->width)) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/sqrt.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/sqrt.cc.inc index 56d89e02b4..05b815d962 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/sqrt.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/bn/sqrt.cc.inc @@ -32,33 +32,31 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) { if (!BN_is_odd(p) || BN_abs_is_word(p, 1)) { if (BN_abs_is_word(p, 2)) { - if (ret == NULL) { + if (ret == nullptr) { ret = BN_new(); } - if (ret == NULL || - !BN_set_word(ret, BN_is_bit_set(a, 0))) { + if (ret == nullptr || !BN_set_word(ret, BN_is_bit_set(a, 0))) { if (ret != in) { BN_free(ret); } - return NULL; + return nullptr; } return ret; } OPENSSL_PUT_ERROR(BN, BN_R_P_IS_NOT_PRIME); - return NULL; + return nullptr; } if (BN_is_zero(a) || BN_is_one(a)) { - if (ret == NULL) { + if (ret == nullptr) { ret = BN_new(); } - if (ret == NULL || - !BN_set_word(ret, BN_is_one(a))) { + if (ret == nullptr || !BN_set_word(ret, BN_is_one(a))) { if (ret != in) { BN_free(ret); } - return NULL; + return nullptr; } return ret; } @@ -70,14 +68,14 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) { t = BN_CTX_get(ctx); x = BN_CTX_get(ctx); y = BN_CTX_get(ctx); - if (y == NULL) { + if (y == nullptr) { goto end; } - if (ret == NULL) { + if (ret == nullptr) { ret = BN_new(); } - if (ret == NULL) { + if (ret == nullptr) { goto end; } @@ -104,8 +102,7 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) { goto end; } q->neg = 0; - if (!BN_add_word(q, 1) || - !BN_mod_exp_mont(ret, A, q, p, ctx, NULL)) { + if (!BN_add_word(q, 1) || !BN_mod_exp_mont(ret, A, q, p, ctx, nullptr)) { goto end; } err = 0; @@ -149,7 +146,7 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) { goto end; } q->neg = 0; - if (!BN_mod_exp_mont(b, t, q, p, ctx, NULL)) { + if (!BN_mod_exp_mont(b, t, q, p, ctx, nullptr)) { goto end; } @@ -192,20 +189,9 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) { goto end; } } else { - if (!BN_pseudo_rand(y, BN_num_bits(p), 0, 0)) { + if (!BN_rand_range_ex(y, 22, p)) { goto end; } - if (BN_ucmp(y, p) >= 0) { - if (BN_usub(y, y, p)) { - goto end; - } - } - // now 0 <= y < |p| - if (BN_is_zero(y)) { - if (!BN_set_word(y, i)) { - goto end; - } - } } r = bn_jacobi(y, q, ctx); // here 'q' is |p| @@ -235,7 +221,7 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) { // Now that we have some non-square, we can find an element // of order 2^e by computing its q'th power. - if (!BN_mod_exp_mont(y, y, q, p, ctx, NULL)) { + if (!BN_mod_exp_mont(y, y, q, p, ctx, nullptr)) { goto end; } if (BN_is_one(y)) { @@ -279,7 +265,7 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) { goto end; } } else { - if (!BN_mod_exp_mont(x, A, t, p, ctx, NULL)) { + if (!BN_mod_exp_mont(x, A, t, p, ctx, nullptr)) { goto end; } if (BN_is_zero(x)) { @@ -376,7 +362,7 @@ end: if (ret != in) { BN_clear_free(ret); } - ret = NULL; + ret = nullptr; } return ret; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/aead.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/aead.cc.inc index 50a218da01..b9e4af1172 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/aead.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/aead.cc.inc @@ -42,20 +42,20 @@ EVP_AEAD_CTX *EVP_AEAD_CTX_new(const EVP_AEAD *aead, const uint8_t *key, EVP_AEAD_CTX *ctx = reinterpret_cast(OPENSSL_malloc(sizeof(EVP_AEAD_CTX))); if (!ctx) { - return NULL; + return nullptr; } EVP_AEAD_CTX_zero(ctx); - if (EVP_AEAD_CTX_init(ctx, aead, key, key_len, tag_len, NULL)) { + if (EVP_AEAD_CTX_init(ctx, aead, key, key_len, tag_len, nullptr)) { return ctx; } EVP_AEAD_CTX_free(ctx); - return NULL; + return nullptr; } void EVP_AEAD_CTX_free(EVP_AEAD_CTX *ctx) { - if (ctx == NULL) { + if (ctx == nullptr) { return; } EVP_AEAD_CTX_cleanup(ctx); @@ -67,7 +67,7 @@ int EVP_AEAD_CTX_init(EVP_AEAD_CTX *ctx, const EVP_AEAD *aead, ENGINE *impl) { if (!aead->init) { OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_NO_DIRECTION_SET); - ctx->aead = NULL; + ctx->aead = nullptr; return 0; } return EVP_AEAD_CTX_init_with_direction(ctx, aead, key, key_len, tag_len, @@ -80,7 +80,7 @@ int EVP_AEAD_CTX_init_with_direction(EVP_AEAD_CTX *ctx, const EVP_AEAD *aead, enum evp_aead_direction_t dir) { if (key_len != aead->key_len) { OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_UNSUPPORTED_KEY_SIZE); - ctx->aead = NULL; + ctx->aead = nullptr; return 0; } @@ -94,18 +94,18 @@ int EVP_AEAD_CTX_init_with_direction(EVP_AEAD_CTX *ctx, const EVP_AEAD *aead, } if (!ok) { - ctx->aead = NULL; + ctx->aead = nullptr; } return ok; } void EVP_AEAD_CTX_cleanup(EVP_AEAD_CTX *ctx) { - if (ctx->aead == NULL) { + if (ctx->aead == nullptr) { return; } ctx->aead->cleanup(ctx); - ctx->aead = NULL; + ctx->aead = nullptr; } // check_alias returns 1 if |out| is compatible with |in| and 0 otherwise. If @@ -141,7 +141,7 @@ int EVP_AEAD_CTX_seal(const EVP_AEAD_CTX *ctx, uint8_t *out, size_t *out_len, size_t out_tag_len; if (ctx->aead->seal_scatter(ctx, out, out + in_len, &out_tag_len, max_out_len - in_len, nonce, nonce_len, in, - in_len, NULL, 0, ad, ad_len)) { + in_len, nullptr, 0, ad, ad_len)) { *out_len = in_len + out_tag_len; return 1; } @@ -268,7 +268,7 @@ const EVP_AEAD *EVP_AEAD_CTX_aead(const EVP_AEAD_CTX *ctx) { return ctx->aead; } int EVP_AEAD_CTX_get_iv(const EVP_AEAD_CTX *ctx, const uint8_t **out_iv, size_t *out_len) { - if (ctx->aead->get_iv == NULL) { + if (ctx->aead->get_iv == nullptr) { OPENSSL_PUT_ERROR(CIPHER, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/cipher.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/cipher.cc.inc index fb351721fc..bd07890334 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/cipher.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/cipher.cc.inc @@ -41,7 +41,7 @@ EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void) { } int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *c) { - if (c->cipher != NULL && c->cipher->cleanup) { + if (c->cipher != nullptr && c->cipher->cleanup) { c->cipher->cleanup(c); } OPENSSL_free(c->cipher_data); @@ -58,7 +58,7 @@ void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx) { } int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in) { - if (in == NULL || in->cipher == NULL) { + if (in == nullptr || in->cipher == nullptr) { OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_INPUT_NOT_INITIALIZED); return 0; } @@ -74,14 +74,14 @@ int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in) { if (in->cipher_data && in->cipher->ctx_size) { out->cipher_data = OPENSSL_memdup(in->cipher_data, in->cipher->ctx_size); if (!out->cipher_data) { - out->cipher = NULL; + out->cipher = nullptr; return 0; } } if (in->cipher->flags & EVP_CIPH_CUSTOM_COPY) { if (!in->cipher->ctrl((EVP_CIPHER_CTX *)in, EVP_CTRL_COPY, 0, out)) { - out->cipher = NULL; + out->cipher = nullptr; return 0; } } @@ -121,19 +121,19 @@ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, if (ctx->cipher->ctx_size) { ctx->cipher_data = OPENSSL_malloc(ctx->cipher->ctx_size); if (!ctx->cipher_data) { - ctx->cipher = NULL; + ctx->cipher = nullptr; return 0; } } else { - ctx->cipher_data = NULL; + ctx->cipher_data = nullptr; } ctx->key_len = cipher->key_len; ctx->flags = 0; if (ctx->cipher->flags & EVP_CIPH_CTRL_INIT) { - if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_INIT, 0, NULL)) { - ctx->cipher = NULL; + if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_INIT, 0, nullptr)) { + ctx->cipher = nullptr; OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_INITIALIZATION_ERROR); return 0; } @@ -187,7 +187,7 @@ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ctx->buf_len = 0; ctx->final_used = 0; - // Clear the poisoned flag to permit re-use of a CTX that previously had a + // Clear the poisoned flag to permit reuse of a CTX that previously had a // failed operation. ctx->poisoned = 0; return 1; @@ -316,7 +316,7 @@ int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len) { // When EVP_CIPH_FLAG_CUSTOM_CIPHER is set, the return value of |cipher| is // the number of bytes written, or -1 on error. Otherwise the return value // is one on success and zero on error. - const int num_bytes = ctx->cipher->cipher(ctx, out, NULL, 0); + const int num_bytes = ctx->cipher->cipher(ctx, out, nullptr, 0); if (num_bytes < 0) { return 0; } @@ -430,7 +430,7 @@ int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *out_len) { } if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) { - i = ctx->cipher->cipher(ctx, out, NULL, 0); + i = ctx->cipher->cipher(ctx, out, nullptr, 0); if (i < 0) { return 0; } else { @@ -642,7 +642,7 @@ int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, if (cipher) { EVP_CIPHER_CTX_init(ctx); } - return EVP_CipherInit_ex(ctx, cipher, NULL, key, iv, enc); + return EVP_CipherInit_ex(ctx, cipher, nullptr, key, iv, enc); } int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aes.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aes.cc.inc index f0089c8d34..685fa24f41 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aes.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aes.cc.inc @@ -79,7 +79,7 @@ static int aes_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, if (hwaes_capable()) { ret = aes_hw_set_decrypt_key(key, ctx->key_len * 8, &dat->ks.ks); dat->block = aes_hw_decrypt; - dat->stream.cbc = NULL; + dat->stream.cbc = nullptr; if (mode == EVP_CIPH_CBC_MODE) { dat->stream.cbc = aes_hw_cbc_encrypt; } @@ -90,12 +90,12 @@ static int aes_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, vpaes_decrypt_key_to_bsaes(&dat->ks.ks, &dat->ks.ks); } // If |dat->stream.cbc| is provided, |dat->block| is never used. - dat->block = NULL; + dat->block = nullptr; dat->stream.cbc = bsaes_cbc_encrypt; } else if (vpaes_capable()) { ret = vpaes_set_decrypt_key(key, ctx->key_len * 8, &dat->ks.ks); dat->block = vpaes_decrypt; - dat->stream.cbc = NULL; + dat->stream.cbc = nullptr; #if defined(VPAES_CBC) if (mode == EVP_CIPH_CBC_MODE) { dat->stream.cbc = vpaes_cbc_encrypt; @@ -104,7 +104,7 @@ static int aes_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, } else { ret = aes_nohw_set_decrypt_key(key, ctx->key_len * 8, &dat->ks.ks); dat->block = aes_nohw_decrypt; - dat->stream.cbc = NULL; + dat->stream.cbc = nullptr; if (mode == EVP_CIPH_CBC_MODE) { dat->stream.cbc = aes_nohw_cbc_encrypt; } @@ -112,7 +112,7 @@ static int aes_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, } else if (hwaes_capable()) { ret = aes_hw_set_encrypt_key(key, ctx->key_len * 8, &dat->ks.ks); dat->block = aes_hw_encrypt; - dat->stream.cbc = NULL; + dat->stream.cbc = nullptr; if (mode == EVP_CIPH_CBC_MODE) { dat->stream.cbc = aes_hw_cbc_encrypt; } else if (mode == EVP_CIPH_CTR_MODE) { @@ -121,7 +121,7 @@ static int aes_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, } else if (vpaes_capable()) { ret = vpaes_set_encrypt_key(key, ctx->key_len * 8, &dat->ks.ks); dat->block = vpaes_encrypt; - dat->stream.cbc = NULL; + dat->stream.cbc = nullptr; #if defined(VPAES_CBC) if (mode == EVP_CIPH_CBC_MODE) { dat->stream.cbc = vpaes_cbc_encrypt; @@ -138,7 +138,7 @@ static int aes_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, } else { ret = aes_nohw_set_encrypt_key(key, ctx->key_len * 8, &dat->ks.ks); dat->block = aes_nohw_encrypt; - dat->stream.cbc = NULL; + dat->stream.cbc = nullptr; if (mode == EVP_CIPH_CBC_MODE) { dat->stream.cbc = aes_nohw_cbc_encrypt; } else if (mode == EVP_CIPH_CTR_MODE) { @@ -216,7 +216,7 @@ static int aes_gcm_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, OPENSSL_memset(&gctx->gcm, 0, sizeof(gctx->gcm)); CRYPTO_gcm128_init_aes_key(&gctx->key, key, ctx->key_len); // Use the IV if specified. Otherwise, use the saved IV, if any. - if (iv == NULL && gctx->iv_set) { + if (iv == nullptr && gctx->iv_set) { iv = gctx->iv; } if (iv) { @@ -387,7 +387,7 @@ static int aes_gcm_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in, } if (in) { - if (out == NULL) { + if (out == nullptr) { if (!CRYPTO_gcm128_aad(&gctx->key, &gctx->gcm, in, len)) { return -1; } @@ -728,7 +728,7 @@ static int aead_aes_gcm_init_impl(struct aead_aes_gcm_ctx *gcm_ctx, return 1; } -static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >= +static_assert(sizeof(((EVP_AEAD_CTX *)nullptr)->state) >= sizeof(struct aead_aes_gcm_ctx), "AEAD state is too small"); static_assert(alignof(union evp_aead_ctx_st_state) >= @@ -1031,7 +1031,7 @@ struct aead_aes_gcm_tls12_ctx { }; } // namespace -static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >= +static_assert(sizeof(((EVP_AEAD_CTX *)nullptr)->state) >= sizeof(struct aead_aes_gcm_tls12_ctx), "AEAD state is too small"); static_assert(alignof(union evp_aead_ctx_st_state) >= @@ -1126,7 +1126,7 @@ struct aead_aes_gcm_tls13_ctx { }; } // namespace -static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >= +static_assert(sizeof(((EVP_AEAD_CTX *)nullptr)->state) >= sizeof(struct aead_aes_gcm_tls13_ctx), "AEAD state is too small"); static_assert(alignof(union evp_aead_ctx_st_state) >= diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aesccm.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aesccm.cc.inc index b45ecdd4c5..af5077e603 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aesccm.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aesccm.cc.inc @@ -232,7 +232,7 @@ struct aead_aes_ccm_ctx { }; } // namespace -static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >= +static_assert(sizeof(((EVP_AEAD_CTX *)nullptr)->state) >= sizeof(struct aead_aes_ccm_ctx), "AEAD state is too small"); static_assert(alignof(union evp_aead_ctx_st_state) >= @@ -263,7 +263,8 @@ static int aead_aes_ccm_init(EVP_AEAD_CTX *ctx, const uint8_t *key, struct aead_aes_ccm_ctx *ccm_ctx = (struct aead_aes_ccm_ctx *)&ctx->state; block128_f block; - ctr128_f ctr = aes_ctr_set_key(&ccm_ctx->ks.ks, NULL, &block, key, key_len); + ctr128_f ctr = + aes_ctr_set_key(&ccm_ctx->ks.ks, nullptr, &block, key, key_len); ctx->tag_len = tag_len; if (!CRYPTO_ccm128_init(&ccm_ctx->ccm, &ccm_ctx->ks.ks, block, ctr, M, L)) { OPENSSL_PUT_ERROR(CIPHER, ERR_R_INTERNAL_ERROR); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cmac/cmac.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cmac/cmac.cc.inc index c05be09363..a08700965e 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cmac/cmac.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/cmac/cmac.cc.inc @@ -72,7 +72,7 @@ int AES_CMAC(uint8_t out[16], const uint8_t *key, size_t key_len, // We have to verify that all the CMAC services actually succeed before // updating the indicator state, so we lock the state here. FIPS_service_indicator_lock_state(); - const int ok = CMAC_Init(&ctx, key, key_len, cipher, NULL /* engine */) && + const int ok = CMAC_Init(&ctx, key, key_len, cipher, nullptr /* engine */) && CMAC_Update(&ctx, in, in_len) && CMAC_Final(&ctx, out, &scratch_out_len); FIPS_service_indicator_unlock_state(); @@ -86,14 +86,14 @@ int AES_CMAC(uint8_t out[16], const uint8_t *key, size_t key_len, CMAC_CTX *CMAC_CTX_new(void) { CMAC_CTX *ctx = reinterpret_cast(OPENSSL_malloc(sizeof(*ctx))); - if (ctx != NULL) { + if (ctx != nullptr) { CMAC_CTX_init(ctx); } return ctx; } void CMAC_CTX_free(CMAC_CTX *ctx) { - if (ctx == NULL) { + if (ctx == nullptr) { return; } @@ -160,11 +160,12 @@ int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t key_len, size_t block_size = EVP_CIPHER_block_size(cipher); if ((block_size != AES_BLOCK_SIZE && block_size != 8 /* 3-DES */) || EVP_CIPHER_key_length(cipher) != key_len || - !EVP_EncryptInit_ex(&ctx->cipher_ctx, cipher, NULL, + !EVP_EncryptInit_ex(&ctx->cipher_ctx, cipher, nullptr, reinterpret_cast(key), kZeroIV) || !EVP_Cipher(&ctx->cipher_ctx, scratch, kZeroIV, block_size) || // Reset context again ready for first data. - !EVP_EncryptInit_ex(&ctx->cipher_ctx, NULL, NULL, NULL, kZeroIV)) { + !EVP_EncryptInit_ex(&ctx->cipher_ctx, nullptr, nullptr, nullptr, + kZeroIV)) { goto out; } @@ -185,7 +186,8 @@ out: int CMAC_Reset(CMAC_CTX *ctx) { ctx->block_used = 0; - return EVP_EncryptInit_ex(&ctx->cipher_ctx, NULL, NULL, NULL, kZeroIV); + return EVP_EncryptInit_ex(&ctx->cipher_ctx, nullptr, nullptr, nullptr, + kZeroIV); } int CMAC_Update(CMAC_CTX *ctx, const uint8_t *in, size_t in_len) { @@ -259,7 +261,7 @@ int CMAC_Final(CMAC_CTX *ctx, uint8_t *out, size_t *out_len) { *out_len = block_size; const uint8_t *mask = ctx->k1; - if (out == NULL) { + if (out == nullptr) { ret = 1; goto out; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/dh/check.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/dh/check.cc.inc index 4d023d5ed3..dc41bc6446 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/dh/check.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/dh/check.cc.inc @@ -34,7 +34,8 @@ int dh_check_params_fast(const DH *dh) { } // q must be bounded by p. - if (dh->q != NULL && (BN_is_negative(dh->q) || BN_ucmp(dh->q, dh->p) > 0)) { + if (dh->q != nullptr && + (BN_is_negative(dh->q) || BN_ucmp(dh->q, dh->p) > 0)) { OPENSSL_PUT_ERROR(DH, DH_R_INVALID_PARAMETERS); return 0; } @@ -56,7 +57,7 @@ int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, int *out_flags) { } bssl::UniquePtr ctx(BN_CTX_new()); - if (ctx == NULL) { + if (ctx == nullptr) { return 0; } bssl::BN_CTXScope scope(ctx.get()); @@ -68,20 +69,18 @@ int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, int *out_flags) { // Check |pub_key| is less than |dh->p| - 1. BIGNUM *tmp = BN_CTX_get(ctx.get()); - if (tmp == NULL || - !BN_copy(tmp, dh->p) || - !BN_sub_word(tmp, 1)) { + if (tmp == nullptr || !BN_copy(tmp, dh->p) || !BN_sub_word(tmp, 1)) { return 0; } if (BN_cmp(pub_key, tmp) >= 0) { *out_flags |= DH_CHECK_PUBKEY_TOO_LARGE; } - if (dh->q != NULL) { + if (dh->q != nullptr) { // Check |pub_key|^|dh->q| is 1 mod |dh->p|. This is necessary for RFC 5114 // groups which are not safe primes but pick a generator on a prime-order // subgroup of size |dh->q|. - if (!BN_mod_exp_mont(tmp, pub_key, dh->q, dh->p, ctx.get(), NULL)) { + if (!BN_mod_exp_mont(tmp, pub_key, dh->q, dh->p, ctx.get(), nullptr)) { return 0; } if (!BN_is_one(tmp)) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/dh/dh.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/dh/dh.cc.inc index c10694071c..60d6531b7d 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/dh/dh.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/dh/dh.cc.inc @@ -16,6 +16,8 @@ #include +#include + #include #include #include @@ -29,8 +31,8 @@ DH *DH_new(void) { DH *dh = reinterpret_cast(OPENSSL_zalloc(sizeof(DH))); - if (dh == NULL) { - return NULL; + if (dh == nullptr) { + return nullptr; } CRYPTO_MUTEX_init(&dh->method_mont_p_lock); @@ -39,7 +41,7 @@ DH *DH_new(void) { } void DH_free(DH *dh) { - if (dh == NULL) { + if (dh == nullptr) { return; } @@ -72,21 +74,21 @@ const BIGNUM *DH_get0_g(const DH *dh) { return dh->g; } void DH_get0_key(const DH *dh, const BIGNUM **out_pub_key, const BIGNUM **out_priv_key) { - if (out_pub_key != NULL) { + if (out_pub_key != nullptr) { *out_pub_key = dh->pub_key; } - if (out_priv_key != NULL) { + if (out_priv_key != nullptr) { *out_priv_key = dh->priv_key; } } int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key) { - if (pub_key != NULL) { + if (pub_key != nullptr) { BN_free(dh->pub_key); dh->pub_key = pub_key; } - if (priv_key != NULL) { + if (priv_key != nullptr) { BN_free(dh->priv_key); dh->priv_key = priv_key; } @@ -96,40 +98,41 @@ int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key) { void DH_get0_pqg(const DH *dh, const BIGNUM **out_p, const BIGNUM **out_q, const BIGNUM **out_g) { - if (out_p != NULL) { + if (out_p != nullptr) { *out_p = dh->p; } - if (out_q != NULL) { + if (out_q != nullptr) { *out_q = dh->q; } - if (out_g != NULL) { + if (out_g != nullptr) { *out_g = dh->g; } } int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g) { - if ((dh->p == NULL && p == NULL) || (dh->g == NULL && g == NULL)) { + if ((dh->p == nullptr && p == nullptr) || + (dh->g == nullptr && g == nullptr)) { return 0; } - if (p != NULL) { + if (p != nullptr) { BN_free(dh->p); dh->p = p; } - if (q != NULL) { + if (q != nullptr) { BN_free(dh->q); dh->q = q; } - if (g != NULL) { + if (g != nullptr) { BN_free(dh->g); dh->g = g; } // Invalidate the cached Montgomery parameters. BN_MONT_CTX_free(dh->method_mont_p); - dh->method_mont_p = NULL; + dh->method_mont_p = nullptr; return 1; } @@ -252,7 +255,7 @@ static int dh_compute_key(DH *dh, BIGNUM *out_shared_key, return 0; } - if (dh->priv_key == NULL) { + if (dh->priv_key == nullptr) { OPENSSL_PUT_ERROR(DH, DH_R_NO_PRIVATE_VALUE); return 0; } @@ -352,7 +355,8 @@ int DH_compute_key_hashed(DH *dh, uint8_t *out, size_t *out_len, // Also, padded output avoids side-channels, so is always strongly // advisable. DH_compute_key_padded(shared_bytes, peers_key, dh) != (int)dh_len || - !EVP_Digest(shared_bytes, dh_len, out, &out_len_unsigned, digest, NULL) || + !EVP_Digest(shared_bytes, dh_len, out, &out_len_unsigned, digest, + nullptr) || out_len_unsigned != digest_len) { goto err; } @@ -406,7 +410,7 @@ DH *DH_get_rfc7919_2048(void) { } bn_set_static_words(ffdhe2048_p.get(), kFFDHE2048Data, - OPENSSL_ARRAY_SIZE(kFFDHE2048Data)); + std::size(kFFDHE2048Data)); if (!BN_rshift1(ffdhe2048_q.get(), ffdhe2048_p.get()) || !BN_set_word(ffdhe2048_g.get(), 2) || diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digest/digest.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digest/digest.cc.inc index 0b206be1fb..49e083b329 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digest/digest.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digest/digest.cc.inc @@ -55,7 +55,7 @@ EVP_MD_CTX *EVP_MD_CTX_new(void) { EVP_MD_CTX *EVP_MD_CTX_create(void) { return EVP_MD_CTX_new(); } int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx) { - assert(ctx->pctx == NULL || ctx->pctx_ops != NULL); + assert(ctx->pctx == nullptr || ctx->pctx_ops != nullptr); if (ctx->pctx_ops) { ctx->pctx_ops->free(ctx->pctx); } @@ -93,7 +93,7 @@ void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags) {} int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in) { // |in->digest| may be NULL if this is a signing |EVP_MD_CTX| for, e.g., // Ed25519 which does not hash with |EVP_MD_CTX|. - if (in == NULL || (in->pctx == NULL && in->digest == NULL)) { + if (in == nullptr || (in->pctx == nullptr && in->digest == nullptr)) { OPENSSL_PUT_ERROR(DIGEST, DIGEST_R_INPUT_NOT_INITIALIZED); return 0; } @@ -102,8 +102,8 @@ int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in) { return 0; } - EVP_PKEY_CTX *pctx = NULL; - assert(in->pctx == NULL || in->pctx_ops != NULL); + EVP_PKEY_CTX *pctx = nullptr; + assert(in->pctx == nullptr || in->pctx_ops != nullptr); if (in->pctx) { pctx = in->pctx_ops->dup(in->pctx); if (!pctx) { @@ -114,12 +114,12 @@ int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in) { EVP_MD_CTX_cleanup(out); out->digest = in->digest; - if (in->digest != NULL) { + if (in->digest != nullptr) { OPENSSL_memcpy(out->md_data, in->md_data, in->digest->ctx_size); } out->pctx = pctx; out->pctx_ops = in->pctx_ops; - assert(out->pctx == NULL || out->pctx_ops != NULL); + assert(out->pctx == nullptr || out->pctx_ops != nullptr); return 1; } @@ -153,7 +153,7 @@ int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *engine) { ctx->digest = type; } - assert(ctx->pctx == NULL || ctx->pctx_ops != NULL); + assert(ctx->pctx == nullptr || ctx->pctx_ops != nullptr); ctx->digest->init(ctx); return 1; @@ -161,7 +161,7 @@ int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *engine) { int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type) { EVP_MD_CTX_init(ctx); - return EVP_DigestInit_ex(ctx, type, NULL); + return EVP_DigestInit_ex(ctx, type, nullptr); } int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t len) { @@ -172,7 +172,7 @@ int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t len) { int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, uint8_t *md_out, unsigned int *size) { assert(ctx->digest->md_size <= EVP_MAX_MD_SIZE); ctx->digest->final(ctx, md_out); - if (size != NULL) { + if (size != nullptr) { *size = ctx->digest->md_size; } OPENSSL_cleanse(ctx->md_data, ctx->digest->ctx_size); @@ -194,8 +194,8 @@ int EVP_Digest(const void *data, size_t count, uint8_t *out_md, } const EVP_MD *EVP_MD_CTX_get0_md(const EVP_MD_CTX *ctx) { - if (ctx == NULL) { - return NULL; + if (ctx == nullptr) { + return nullptr; } return ctx->digest; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digest/digests.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digest/digests.cc.inc index 99e3a66c0a..3a3bfd3f05 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digest/digests.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digest/digests.cc.inc @@ -45,7 +45,7 @@ static void sha1_final(EVP_MD_CTX *ctx, uint8_t *md) { DEFINE_METHOD_FUNCTION(EVP_MD, EVP_sha1) { out->type = NID_sha1; - out->md_size = BCM_SHA_DIGEST_LENGTH; + out->md_size = SHA_DIGEST_LENGTH; out->flags = 0; out->init = sha1_init; out->update = sha1_update; @@ -71,7 +71,7 @@ static void sha224_final(EVP_MD_CTX *ctx, uint8_t *md) { DEFINE_METHOD_FUNCTION(EVP_MD, EVP_sha224) { out->type = NID_sha224; - out->md_size = BCM_SHA224_DIGEST_LENGTH; + out->md_size = SHA224_DIGEST_LENGTH; out->flags = 0; out->init = sha224_init; out->update = sha224_update; @@ -96,7 +96,7 @@ static void sha256_final(EVP_MD_CTX *ctx, uint8_t *md) { DEFINE_METHOD_FUNCTION(EVP_MD, EVP_sha256) { out->type = NID_sha256; - out->md_size = BCM_SHA256_DIGEST_LENGTH; + out->md_size = SHA256_DIGEST_LENGTH; out->flags = 0; out->init = sha256_init; out->update = sha256_update; @@ -120,7 +120,7 @@ static void sha384_final(EVP_MD_CTX *ctx, uint8_t *md) { DEFINE_METHOD_FUNCTION(EVP_MD, EVP_sha384) { out->type = NID_sha384; - out->md_size = BCM_SHA384_DIGEST_LENGTH; + out->md_size = SHA384_DIGEST_LENGTH; out->flags = 0; out->init = sha384_init; out->update = sha384_update; @@ -145,7 +145,7 @@ static void sha512_final(EVP_MD_CTX *ctx, uint8_t *md) { DEFINE_METHOD_FUNCTION(EVP_MD, EVP_sha512) { out->type = NID_sha512; - out->md_size = BCM_SHA512_DIGEST_LENGTH; + out->md_size = SHA512_DIGEST_LENGTH; out->flags = 0; out->init = sha512_init; out->update = sha512_update; @@ -170,7 +170,7 @@ static void sha512_256_final(EVP_MD_CTX *ctx, uint8_t *md) { DEFINE_METHOD_FUNCTION(EVP_MD, EVP_sha512_256) { out->type = NID_sha512_256; - out->md_size = BCM_SHA512_256_DIGEST_LENGTH; + out->md_size = SHA512_256_DIGEST_LENGTH; out->flags = 0; out->init = sha512_256_init; out->update = sha512_256_update; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digest/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digest/internal.h index dca8e2c88c..1174fcc5fc 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digest/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digest/internal.h @@ -25,7 +25,7 @@ extern "C" { // env_md_st is typoed ("evp" -> "env"), but the typo comes from OpenSSL and // some consumers forward-declare these structures so we're leaving it alone. struct env_md_st { - // type contains a NID identifing the digest function. (For example, + // type contains a NID identifying the digest function. (For example, // NID_md5.) int type; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digestsign/digestsign.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digestsign/digestsign.cc.inc index ced1fd8482..870cd49aa7 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digestsign/digestsign.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/digestsign/digestsign.cc.inc @@ -33,17 +33,17 @@ DEFINE_LOCAL_DATA(struct evp_md_pctx_ops, md_pctx_ops) { } static int uses_prehash(EVP_MD_CTX *ctx, enum evp_sign_verify_t op) { - return (op == evp_sign) ? (ctx->pctx->pmeth->sign != NULL) - : (ctx->pctx->pmeth->verify != NULL); + return (op == evp_sign) ? (ctx->pctx->pmeth->sign != nullptr) + : (ctx->pctx->pmeth->verify != nullptr); } static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey, enum evp_sign_verify_t op) { - if (ctx->pctx == NULL) { + if (ctx->pctx == nullptr) { ctx->pctx = EVP_PKEY_CTX_new(pkey, e); } - if (ctx->pctx == NULL) { + if (ctx->pctx == nullptr) { return 0; } ctx->pctx_ops = md_pctx_ops(); @@ -58,13 +58,12 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, } } - if (type != NULL && - !EVP_PKEY_CTX_set_signature_md(ctx->pctx, type)) { + if (type != nullptr && !EVP_PKEY_CTX_set_signature_md(ctx->pctx, type)) { return 0; } if (uses_prehash(ctx, op)) { - if (type == NULL) { + if (type == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_NO_DEFAULT_DIGEST); return 0; } @@ -135,7 +134,7 @@ int EVP_DigestSignFinal(EVP_MD_CTX *ctx, uint8_t *out_sig, return ret; } else { size_t s = EVP_MD_size(ctx->digest); - return EVP_PKEY_sign(ctx->pctx, out_sig, out_sig_len, NULL, s); + return EVP_PKEY_sign(ctx->pctx, out_sig, out_sig_len, nullptr, s); } } @@ -174,8 +173,7 @@ int EVP_DigestSign(EVP_MD_CTX *ctx, uint8_t *out_sig, size_t *out_sig_len, if (uses_prehash(ctx, evp_sign)) { // If |out_sig| is NULL, the caller is only querying the maximum output // length. |data| should only be incorporated in the final call. - if (out_sig != NULL && - !EVP_DigestSignUpdate(ctx, data, data_len)) { + if (out_sig != nullptr && !EVP_DigestSignUpdate(ctx, data, data_len)) { goto end; } @@ -183,7 +181,7 @@ int EVP_DigestSign(EVP_MD_CTX *ctx, uint8_t *out_sig, size_t *out_sig_len, goto end; } - if (ctx->pctx->pmeth->sign_message == NULL) { + if (ctx->pctx->pmeth->sign_message == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); goto end; } @@ -210,7 +208,7 @@ int EVP_DigestVerify(EVP_MD_CTX *ctx, const uint8_t *sig, size_t sig_len, goto end; } - if (ctx->pctx->pmeth->verify_message == NULL) { + if (ctx->pctx->pmeth->verify_message == nullptr) { OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); goto end; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl index 24efdc0b04..cc878d54b6 100755 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl @@ -959,7 +959,7 @@ ecp_nistz256_ord_mul_mont_adx: ################################# reduction mulx 8*0+128(%r14), $t0, $t1 - adcx $t0, $acc3 # guranteed to be zero + adcx $t0, $acc3 # guaranteed to be zero adox $t1, $acc4 mulx 8*1+128(%r14), $t0, $t1 diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/asm/p256_beeu-armv8-asm.pl b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/asm/p256_beeu-armv8-asm.pl index 66fb286470..c104b4f9df 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/asm/p256_beeu-armv8-asm.pl +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/asm/p256_beeu-armv8-asm.pl @@ -190,7 +190,7 @@ ___ # What matters here is the order of instructions relative to certain other # instructions, i.e. # - lsr and lsl must precede orr of the corresponding registers. -# - lsl must preced the lsr of the same register afterwards. +# - lsl must precede the lsr of the same register afterwards. # The chosen order of the instructions overall is to try and maximize # the pipeline usage. sub SHIFT256 { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/ec.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/ec.cc.inc index 14916ee484..be5e075318 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/ec.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/ec.cc.inc @@ -18,6 +18,8 @@ #include #include +#include + #include #include #include @@ -59,15 +61,15 @@ static void ec_group_set_a_minus3(EC_GROUP *group) { DEFINE_METHOD_FUNCTION(EC_GROUP, EC_group_p224) { out->curve_name = NID_secp224r1; out->comment = "NIST P-224"; - // 1.3.132.0.33 - static const uint8_t kOIDP224[] = {0x2b, 0x81, 0x04, 0x00, 0x21}; + static const uint8_t kOIDP224[] = {OBJ_ENC_secp224r1}; + static_assert(sizeof(kOIDP224) <= sizeof(out->oid)); OPENSSL_memcpy(out->oid, kOIDP224, sizeof(kOIDP224)); out->oid_len = sizeof(kOIDP224); - ec_group_init_static_mont(&out->field, OPENSSL_ARRAY_SIZE(kP224Field), - kP224Field, kP224FieldRR, kP224FieldN0); - ec_group_init_static_mont(&out->order, OPENSSL_ARRAY_SIZE(kP224Order), - kP224Order, kP224OrderRR, kP224OrderN0); + ec_group_init_static_mont(&out->field, std::size(kP224Field), kP224Field, + kP224FieldRR, kP224FieldN0); + ec_group_init_static_mont(&out->order, std::size(kP224Order), kP224Order, + kP224OrderRR, kP224OrderN0); #if defined(BORINGSSL_HAS_UINT128) && !defined(OPENSSL_SMALL) out->meth = EC_GFp_nistp224_method(); @@ -92,16 +94,15 @@ DEFINE_METHOD_FUNCTION(EC_GROUP, EC_group_p224) { DEFINE_METHOD_FUNCTION(EC_GROUP, EC_group_p256) { out->curve_name = NID_X9_62_prime256v1; out->comment = "NIST P-256"; - // 1.2.840.10045.3.1.7 - static const uint8_t kOIDP256[] = {0x2a, 0x86, 0x48, 0xce, - 0x3d, 0x03, 0x01, 0x07}; + static const uint8_t kOIDP256[] = {OBJ_ENC_X9_62_prime256v1}; + static_assert(sizeof(kOIDP256) <= sizeof(out->oid)); OPENSSL_memcpy(out->oid, kOIDP256, sizeof(kOIDP256)); out->oid_len = sizeof(kOIDP256); - ec_group_init_static_mont(&out->field, OPENSSL_ARRAY_SIZE(kP256Field), - kP256Field, kP256FieldRR, kP256FieldN0); - ec_group_init_static_mont(&out->order, OPENSSL_ARRAY_SIZE(kP256Order), - kP256Order, kP256OrderRR, kP256OrderN0); + ec_group_init_static_mont(&out->field, std::size(kP256Field), kP256Field, + kP256FieldRR, kP256FieldN0); + ec_group_init_static_mont(&out->order, std::size(kP256Order), kP256Order, + kP256OrderRR, kP256OrderN0); #if !defined(OPENSSL_NO_ASM) && \ (defined(OPENSSL_X86_64) || defined(OPENSSL_AARCH64)) && \ @@ -124,15 +125,15 @@ DEFINE_METHOD_FUNCTION(EC_GROUP, EC_group_p256) { DEFINE_METHOD_FUNCTION(EC_GROUP, EC_group_p384) { out->curve_name = NID_secp384r1; out->comment = "NIST P-384"; - // 1.3.132.0.34 - static const uint8_t kOIDP384[] = {0x2b, 0x81, 0x04, 0x00, 0x22}; + static const uint8_t kOIDP384[] = {OBJ_ENC_secp384r1}; + static_assert(sizeof(kOIDP384) <= sizeof(out->oid)); OPENSSL_memcpy(out->oid, kOIDP384, sizeof(kOIDP384)); out->oid_len = sizeof(kOIDP384); - ec_group_init_static_mont(&out->field, OPENSSL_ARRAY_SIZE(kP384Field), - kP384Field, kP384FieldRR, kP384FieldN0); - ec_group_init_static_mont(&out->order, OPENSSL_ARRAY_SIZE(kP384Order), - kP384Order, kP384OrderRR, kP384OrderN0); + ec_group_init_static_mont(&out->field, std::size(kP384Field), kP384Field, + kP384FieldRR, kP384FieldN0); + ec_group_init_static_mont(&out->order, std::size(kP384Order), kP384Order, + kP384OrderRR, kP384OrderN0); out->meth = EC_GFp_mont_method(); out->generator.group = out; @@ -149,15 +150,15 @@ DEFINE_METHOD_FUNCTION(EC_GROUP, EC_group_p384) { DEFINE_METHOD_FUNCTION(EC_GROUP, EC_group_p521) { out->curve_name = NID_secp521r1; out->comment = "NIST P-521"; - // 1.3.132.0.35 - static const uint8_t kOIDP521[] = {0x2b, 0x81, 0x04, 0x00, 0x23}; + static const uint8_t kOIDP521[] = {OBJ_ENC_secp521r1}; + static_assert(sizeof(kOIDP521) <= sizeof(out->oid)); OPENSSL_memcpy(out->oid, kOIDP521, sizeof(kOIDP521)); out->oid_len = sizeof(kOIDP521); - ec_group_init_static_mont(&out->field, OPENSSL_ARRAY_SIZE(kP521Field), - kP521Field, kP521FieldRR, kP521FieldN0); - ec_group_init_static_mont(&out->order, OPENSSL_ARRAY_SIZE(kP521Order), - kP521Order, kP521OrderRR, kP521OrderN0); + ec_group_init_static_mont(&out->field, std::size(kP521Field), kP521Field, + kP521FieldRR, kP521FieldN0); + ec_group_init_static_mont(&out->order, std::size(kP521Order), kP521Order, + kP521OrderRR, kP521OrderN0); out->meth = EC_GFp_mont_method(); out->generator.group = out; @@ -254,7 +255,7 @@ int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, EC_AFFINE affine; if (!ec_jacobian_to_affine(group, &affine, &generator->raw) || - !BN_MONT_CTX_set(&group->order, order, NULL)) { + !BN_MONT_CTX_set(&group->order, order, nullptr)) { return 0; } @@ -278,12 +279,12 @@ EC_GROUP *EC_GROUP_new_by_curve_name(int nid) { return (EC_GROUP *)EC_group_p521(); default: OPENSSL_PUT_ERROR(EC, EC_R_UNKNOWN_GROUP); - return NULL; + return nullptr; } } void EC_GROUP_free(EC_GROUP *group) { - if (group == NULL || + if (group == nullptr || // Built-in curves are static. group->curve_name != NID_undef || !CRYPTO_refcount_dec_and_test_zero(&group->references)) { @@ -296,7 +297,7 @@ void EC_GROUP_free(EC_GROUP *group) { } EC_GROUP *EC_GROUP_dup(const EC_GROUP *a) { - if (a == NULL || + if (a == nullptr || // Built-in curves are static. a->curve_name != NID_undef) { return (EC_GROUP *)a; @@ -336,7 +337,7 @@ int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ignored) { } const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group) { - return group->has_order ? &group->generator : NULL; + return group->has_order ? &group->generator : nullptr; } const BIGNUM *EC_GROUP_get0_order(const EC_GROUP *group) { @@ -345,7 +346,7 @@ const BIGNUM *EC_GROUP_get0_order(const EC_GROUP *group) { } int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx) { - if (BN_copy(order, EC_GROUP_get0_order(group)) == NULL) { + if (BN_copy(order, EC_GROUP_get0_order(group)) == nullptr) { return 0; } return 1; @@ -383,7 +384,7 @@ const char *EC_curve_nid2nist(int nid) { case NID_secp521r1: return "P-521"; } - return NULL; + return nullptr; } int EC_curve_nist2nid(const char *name) { @@ -403,14 +404,14 @@ int EC_curve_nist2nid(const char *name) { } EC_POINT *EC_POINT_new(const EC_GROUP *group) { - if (group == NULL) { + if (group == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); - return NULL; + return nullptr; } EC_POINT *ret = reinterpret_cast(OPENSSL_malloc(sizeof *ret)); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->group = EC_GROUP_dup(group); @@ -435,7 +436,7 @@ void EC_POINT_free(EC_POINT *point) { void EC_POINT_clear_free(EC_POINT *point) { EC_POINT_free(point); } int EC_POINT_copy(EC_POINT *dest, const EC_POINT *src) { - if (EC_GROUP_cmp(dest->group, src->group, NULL) != 0) { + if (EC_GROUP_cmp(dest->group, src->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } @@ -447,21 +448,21 @@ int EC_POINT_copy(EC_POINT *dest, const EC_POINT *src) { } EC_POINT *EC_POINT_dup(const EC_POINT *a, const EC_GROUP *group) { - if (a == NULL) { - return NULL; + if (a == nullptr) { + return nullptr; } EC_POINT *ret = EC_POINT_new(group); - if (ret == NULL || !EC_POINT_copy(ret, a)) { + if (ret == nullptr || !EC_POINT_copy(ret, a)) { EC_POINT_free(ret); - return NULL; + return nullptr; } return ret; } int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point) { - if (EC_GROUP_cmp(group, point->group, NULL) != 0) { + if (EC_GROUP_cmp(group, point->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } @@ -470,7 +471,7 @@ int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point) { } int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *point) { - if (EC_GROUP_cmp(group, point->group, NULL) != 0) { + if (EC_GROUP_cmp(group, point->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } @@ -479,7 +480,7 @@ int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *point) { int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx) { - if (EC_GROUP_cmp(group, point->group, NULL) != 0) { + if (EC_GROUP_cmp(group, point->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } @@ -488,8 +489,8 @@ int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx) { - if (EC_GROUP_cmp(group, a->group, NULL) != 0 || - EC_GROUP_cmp(group, b->group, NULL) != 0) { + if (EC_GROUP_cmp(group, a->group, nullptr) != 0 || + EC_GROUP_cmp(group, b->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return -1; } @@ -501,20 +502,20 @@ int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, const EC_POINT *point, BIGNUM *x, BIGNUM *y, BN_CTX *ctx) { - if (group->meth->point_get_affine_coordinates == 0) { + if (group->meth->point_get_affine_coordinates == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } - if (EC_GROUP_cmp(group, point->group, NULL) != 0) { + if (EC_GROUP_cmp(group, point->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } EC_FELEM x_felem, y_felem; - if (!group->meth->point_get_affine_coordinates(group, &point->raw, - x == NULL ? NULL : &x_felem, - y == NULL ? NULL : &y_felem) || - (x != NULL && !ec_felem_to_bignum(group, x, &x_felem)) || - (y != NULL && !ec_felem_to_bignum(group, y, &y_felem))) { + if (!group->meth->point_get_affine_coordinates( + group, &point->raw, x == nullptr ? nullptr : &x_felem, + y == nullptr ? nullptr : &y_felem) || + (x != nullptr && !ec_felem_to_bignum(group, x, &x_felem)) || + (y != nullptr && !ec_felem_to_bignum(group, y, &y_felem))) { return 0; } return 1; @@ -540,7 +541,7 @@ int ec_jacobian_to_affine(const EC_GROUP *group, EC_AFFINE *out, int ec_jacobian_to_affine_batch(const EC_GROUP *group, EC_AFFINE *out, const EC_JACOBIAN *in, size_t num) { - if (group->meth->jacobian_to_affine_batch == NULL) { + if (group->meth->jacobian_to_affine_batch == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } @@ -582,12 +583,12 @@ int ec_point_set_affine_coordinates(const EC_GROUP *group, EC_AFFINE *out, int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *point, const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx) { - if (EC_GROUP_cmp(group, point->group, NULL) != 0) { + if (EC_GROUP_cmp(group, point->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } - if (x == NULL || y == NULL) { + if (x == nullptr || y == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -615,9 +616,9 @@ int EC_POINT_set_affine_coordinates(const EC_GROUP *group, EC_POINT *point, int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx) { - if (EC_GROUP_cmp(group, r->group, NULL) != 0 || - EC_GROUP_cmp(group, a->group, NULL) != 0 || - EC_GROUP_cmp(group, b->group, NULL) != 0) { + if (EC_GROUP_cmp(group, r->group, nullptr) != 0 || + EC_GROUP_cmp(group, a->group, nullptr) != 0 || + EC_GROUP_cmp(group, b->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } @@ -627,8 +628,8 @@ int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx) { - if (EC_GROUP_cmp(group, r->group, NULL) != 0 || - EC_GROUP_cmp(group, a->group, NULL) != 0) { + if (EC_GROUP_cmp(group, r->group, nullptr) != 0 || + EC_GROUP_cmp(group, a->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } @@ -638,7 +639,7 @@ int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, int EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx) { - if (EC_GROUP_cmp(group, a->group, NULL) != 0) { + if (EC_GROUP_cmp(group, a->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } @@ -667,22 +668,22 @@ int ec_point_mul_no_self_test(const EC_GROUP *group, EC_POINT *r, // Previously, this function set |r| to the point at infinity if there was // nothing to multiply. But, nobody should be calling this function with // nothing to multiply in the first place. - if ((g_scalar == NULL && p_scalar == NULL) || - (p == NULL) != (p_scalar == NULL)) { + if ((g_scalar == nullptr && p_scalar == nullptr) || + (p == nullptr) != (p_scalar == nullptr)) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); return 0; } - if (EC_GROUP_cmp(group, r->group, NULL) != 0 || - (p != NULL && EC_GROUP_cmp(group, p->group, NULL) != 0)) { + if (EC_GROUP_cmp(group, r->group, nullptr) != 0 || + (p != nullptr && EC_GROUP_cmp(group, p->group, nullptr) != 0)) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } bssl::UniquePtr new_ctx; - if (ctx == NULL) { + if (ctx == nullptr) { new_ctx.reset(BN_CTX_new()); - if (new_ctx == NULL) { + if (new_ctx == nullptr) { return 0; } ctx = new_ctx.get(); @@ -699,7 +700,7 @@ int ec_point_mul_no_self_test(const EC_GROUP *group, EC_POINT *r, // which combined the two multiplications did not avoid the doubling case // in the incomplete addition formula and were not constant-time. - if (g_scalar != NULL) { + if (g_scalar != nullptr) { EC_SCALAR scalar; if (!arbitrary_bignum_to_scalar(group, &scalar, g_scalar, ctx) || !ec_point_mul_scalar_base(group, &r->raw, &scalar)) { @@ -707,14 +708,14 @@ int ec_point_mul_no_self_test(const EC_GROUP *group, EC_POINT *r, } } - if (p_scalar != NULL) { + if (p_scalar != nullptr) { EC_SCALAR scalar; EC_JACOBIAN tmp; if (!arbitrary_bignum_to_scalar(group, &scalar, p_scalar, ctx) || !ec_point_mul_scalar(group, &tmp, &p->raw, &scalar)) { return 0; } - if (g_scalar == NULL) { + if (g_scalar == nullptr) { OPENSSL_memcpy(&r->raw, &tmp, sizeof(EC_JACOBIAN)); } else { group->meth->add(group, &r->raw, &r->raw, &tmp); @@ -734,12 +735,12 @@ int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar, int ec_point_mul_scalar_public(const EC_GROUP *group, EC_JACOBIAN *r, const EC_SCALAR *g_scalar, const EC_JACOBIAN *p, const EC_SCALAR *p_scalar) { - if (g_scalar == NULL || p_scalar == NULL || p == NULL) { + if (g_scalar == nullptr || p_scalar == nullptr || p == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); return 0; } - if (group->meth->mul_public == NULL) { + if (group->meth->mul_public == nullptr) { return group->meth->mul_public_batch(group, r, g_scalar, p, p_scalar, 1); } @@ -751,7 +752,7 @@ int ec_point_mul_scalar_public_batch(const EC_GROUP *group, EC_JACOBIAN *r, const EC_SCALAR *g_scalar, const EC_JACOBIAN *points, const EC_SCALAR *scalars, size_t num) { - if (group->meth->mul_public_batch == NULL) { + if (group->meth->mul_public_batch == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } @@ -762,7 +763,7 @@ int ec_point_mul_scalar_public_batch(const EC_GROUP *group, EC_JACOBIAN *r, int ec_point_mul_scalar(const EC_GROUP *group, EC_JACOBIAN *r, const EC_JACOBIAN *p, const EC_SCALAR *scalar) { - if (p == NULL || scalar == NULL) { + if (p == nullptr || scalar == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -781,7 +782,7 @@ int ec_point_mul_scalar(const EC_GROUP *group, EC_JACOBIAN *r, int ec_point_mul_scalar_base(const EC_GROUP *group, EC_JACOBIAN *r, const EC_SCALAR *scalar) { - if (scalar == NULL) { + if (scalar == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -804,7 +805,7 @@ int ec_point_mul_scalar_batch(const EC_GROUP *group, EC_JACOBIAN *r, const EC_JACOBIAN *p0, const EC_SCALAR *scalar0, const EC_JACOBIAN *p1, const EC_SCALAR *scalar1, const EC_JACOBIAN *p2, const EC_SCALAR *scalar2) { - if (group->meth->mul_batch == NULL) { + if (group->meth->mul_batch == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } @@ -823,7 +824,7 @@ int ec_point_mul_scalar_batch(const EC_GROUP *group, EC_JACOBIAN *r, int ec_init_precomp(const EC_GROUP *group, EC_PRECOMP *out, const EC_JACOBIAN *p) { - if (group->meth->init_precomp == NULL) { + if (group->meth->init_precomp == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } @@ -836,7 +837,7 @@ int ec_point_mul_scalar_precomp(const EC_GROUP *group, EC_JACOBIAN *r, const EC_PRECOMP *p1, const EC_SCALAR *scalar1, const EC_PRECOMP *p2, const EC_SCALAR *scalar2) { - if (group->meth->mul_precomp == NULL) { + if (group->meth->mul_precomp == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } @@ -870,7 +871,7 @@ void ec_precomp_select(const EC_GROUP *group, EC_PRECOMP *out, BN_ULONG mask, const EC_PRECOMP *a, const EC_PRECOMP *b) { static_assert(sizeof(out->comb) == sizeof(*out), "out->comb does not span the entire structure"); - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(out->comb); i++) { + for (size_t i = 0; i < std::size(out->comb); i++) { ec_affine_select(group, &out->comb[i], mask, &a->comb[i], &b->comb[i]); } } @@ -926,7 +927,7 @@ int ec_get_x_coordinate_as_bytes(const EC_GROUP *group, uint8_t *out, } EC_FELEM x; - if (!group->meth->point_get_affine_coordinates(group, p, &x, NULL)) { + if (!group->meth->point_get_affine_coordinates(group, p, &x, nullptr)) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/ec_key.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/ec_key.cc.inc index d471e84536..7b54c83d54 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/ec_key.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/ec_key.cc.inc @@ -37,8 +37,8 @@ DEFINE_STATIC_EX_DATA_CLASS(g_ec_ex_data_class) static EC_WRAPPED_SCALAR *ec_wrapped_scalar_new(const EC_GROUP *group) { EC_WRAPPED_SCALAR *wrapped = reinterpret_cast( OPENSSL_zalloc(sizeof(EC_WRAPPED_SCALAR))); - if (wrapped == NULL) { - return NULL; + if (wrapped == nullptr) { + return nullptr; } wrapped->bignum.d = wrapped->scalar.words; @@ -52,12 +52,12 @@ static void ec_wrapped_scalar_free(EC_WRAPPED_SCALAR *scalar) { OPENSSL_free(scalar); } -EC_KEY *EC_KEY_new(void) { return EC_KEY_new_method(NULL); } +EC_KEY *EC_KEY_new(void) { return EC_KEY_new_method(nullptr); } EC_KEY *EC_KEY_new_method(const ENGINE *engine) { EC_KEY *ret = reinterpret_cast(OPENSSL_zalloc(sizeof(EC_KEY))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } if (engine) { @@ -78,7 +78,7 @@ EC_KEY *EC_KEY_new_method(const ENGINE *engine) { METHOD_unref(ret->ecdsa_meth); } OPENSSL_free(ret); - return NULL; + return nullptr; } return ret; @@ -86,19 +86,19 @@ EC_KEY *EC_KEY_new_method(const ENGINE *engine) { EC_KEY *EC_KEY_new_by_curve_name(int nid) { EC_KEY *ret = EC_KEY_new(); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->group = EC_GROUP_new_by_curve_name(nid); - if (ret->group == NULL) { + if (ret->group == nullptr) { EC_KEY_free(ret); - return NULL; + return nullptr; } return ret; } void EC_KEY_free(EC_KEY *r) { - if (r == NULL) { + if (r == nullptr) { return; } @@ -123,22 +123,22 @@ void EC_KEY_free(EC_KEY *r) { } EC_KEY *EC_KEY_dup(const EC_KEY *src) { - if (src == NULL) { + if (src == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); - return NULL; + return nullptr; } EC_KEY *ret = EC_KEY_new(); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } - if ((src->group != NULL && !EC_KEY_set_group(ret, src->group)) || - (src->pub_key != NULL && !EC_KEY_set_public_key(ret, src->pub_key)) || - (src->priv_key != NULL && + if ((src->group != nullptr && !EC_KEY_set_group(ret, src->group)) || + (src->pub_key != nullptr && !EC_KEY_set_public_key(ret, src->pub_key)) || + (src->priv_key != nullptr && !EC_KEY_set_private_key(ret, EC_KEY_get0_private_key(src)))) { EC_KEY_free(ret); - return NULL; + return nullptr; } ret->enc_flag = src->enc_flag; @@ -159,34 +159,34 @@ const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key) { return key->group; } int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group) { // If |key| already has a group, it is an error to switch to another one. - if (key->group != NULL) { - if (EC_GROUP_cmp(key->group, group, NULL) != 0) { + if (key->group != nullptr) { + if (EC_GROUP_cmp(key->group, group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_GROUP_MISMATCH); return 0; } return 1; } - assert(key->priv_key == NULL); - assert(key->pub_key == NULL); + assert(key->priv_key == nullptr); + assert(key->pub_key == nullptr); EC_GROUP_free(key->group); key->group = EC_GROUP_dup(group); - return key->group != NULL; + return key->group != nullptr; } const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key) { - return key->priv_key != NULL ? &key->priv_key->bignum : NULL; + return key->priv_key != nullptr ? &key->priv_key->bignum : nullptr; } int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *priv_key) { - if (key->group == NULL) { + if (key->group == nullptr) { OPENSSL_PUT_ERROR(EC, EC_R_MISSING_PARAMETERS); return 0; } EC_WRAPPED_SCALAR *scalar = ec_wrapped_scalar_new(key->group); - if (scalar == NULL) { + if (scalar == nullptr) { return 0; } if (!ec_bignum_to_scalar(key->group, &scalar->scalar, priv_key) || @@ -208,19 +208,25 @@ const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key) { } int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub_key) { - if (key->group == NULL) { + if (key->group == nullptr) { OPENSSL_PUT_ERROR(EC, EC_R_MISSING_PARAMETERS); return 0; } - if (pub_key != NULL && EC_GROUP_cmp(key->group, pub_key->group, NULL) != 0) { + if (pub_key != nullptr && EC_POINT_is_at_infinity(pub_key->group, pub_key)) { + OPENSSL_PUT_ERROR(EC, EC_R_POINT_AT_INFINITY); + return 0; + } + + if (pub_key != nullptr && + EC_GROUP_cmp(key->group, pub_key->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_GROUP_MISMATCH); return 0; } EC_POINT_free(key->pub_key); key->pub_key = EC_POINT_dup(pub_key, key->group); - return (key->pub_key == NULL) ? 0 : 1; + return (key->pub_key == nullptr) ? 0 : 1; } unsigned int EC_KEY_get_enc_flags(const EC_KEY *key) { return key->enc_flag; } @@ -249,7 +255,7 @@ int EC_KEY_check_key(const EC_KEY *eckey) { } // Test whether the public key is on the elliptic curve. - if (!EC_POINT_is_on_curve(eckey->group, eckey->pub_key, NULL)) { + if (!EC_POINT_is_on_curve(eckey->group, eckey->pub_key, nullptr)) { OPENSSL_PUT_ERROR(EC, EC_R_POINT_IS_NOT_ON_CURVE); return 0; } @@ -258,7 +264,7 @@ int EC_KEY_check_key(const EC_KEY *eckey) { // // NOTE: this is a FIPS pair-wise consistency check for the ECDH case. See SP // 800-56Ar3, page 36. - if (eckey->priv_key != NULL) { + if (eckey->priv_key != nullptr) { EC_JACOBIAN point; if (!ec_point_mul_scalar_base(eckey->group, &point, &eckey->priv_key->scalar)) { @@ -286,7 +292,7 @@ int EC_KEY_check_fips(const EC_KEY *key) { } if (key->priv_key) { - uint8_t digest[BCM_SHA256_DIGEST_LENGTH] = {0}; + uint8_t digest[SHA256_DIGEST_LENGTH] = {0}; uint8_t sig[ECDSA_MAX_FIXED_LEN]; size_t sig_len; if (!ecdsa_sign_fixed(digest, sizeof(digest), sig, &sig_len, sizeof(sig), @@ -346,7 +352,7 @@ int EC_KEY_oct2key(EC_KEY *key, const uint8_t *in, size_t len, BN_CTX *ctx) { size_t EC_KEY_key2buf(const EC_KEY *key, point_conversion_form_t form, uint8_t **out_buf, BN_CTX *ctx) { - if (key == NULL || key->pub_key == NULL || key->group == NULL) { + if (key == nullptr || key->pub_key == nullptr || key->group == nullptr) { OPENSSL_PUT_ERROR(EC, EC_R_MISSING_PARAMETERS); return 0; } @@ -355,7 +361,7 @@ size_t EC_KEY_key2buf(const EC_KEY *key, point_conversion_form_t form, } int EC_KEY_oct2priv(EC_KEY *key, const uint8_t *in, size_t len) { - if (key->group == NULL) { + if (key->group == nullptr) { OPENSSL_PUT_ERROR(EC, EC_R_MISSING_PARAMETERS); return 0; } @@ -365,21 +371,21 @@ int EC_KEY_oct2priv(EC_KEY *key, const uint8_t *in, size_t len) { return 0; } - BIGNUM *priv_key = BN_bin2bn(in, len, NULL); - int ok = priv_key != NULL && // + BIGNUM *priv_key = BN_bin2bn(in, len, nullptr); + int ok = priv_key != nullptr && // EC_KEY_set_private_key(key, priv_key); BN_free(priv_key); return ok; } size_t EC_KEY_priv2oct(const EC_KEY *key, uint8_t *out, size_t max_out) { - if (key->group == NULL || key->priv_key == NULL) { + if (key->group == nullptr || key->priv_key == nullptr) { OPENSSL_PUT_ERROR(EC, EC_R_MISSING_PARAMETERS); return 0; } size_t len = BN_num_bytes(EC_GROUP_get0_order(key->group)); - if (out == NULL) { + if (out == nullptr) { return len; } @@ -395,14 +401,14 @@ size_t EC_KEY_priv2oct(const EC_KEY *key, uint8_t *out, size_t max_out) { } size_t EC_KEY_priv2buf(const EC_KEY *key, uint8_t **out_buf) { - *out_buf = NULL; - size_t len = EC_KEY_priv2oct(key, NULL, 0); + *out_buf = nullptr; + size_t len = EC_KEY_priv2oct(key, nullptr, 0); if (len == 0) { return 0; } uint8_t *buf = reinterpret_cast(OPENSSL_malloc(len)); - if (buf == NULL) { + if (buf == nullptr) { return 0; } @@ -417,7 +423,7 @@ size_t EC_KEY_priv2buf(const EC_KEY *key, uint8_t **out_buf) { } int EC_KEY_generate_key(EC_KEY *key) { - if (key == NULL || key->group == NULL) { + if (key == nullptr || key->group == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -431,7 +437,7 @@ int EC_KEY_generate_key(EC_KEY *key) { static const uint8_t kDefaultAdditionalData[32] = {0}; EC_WRAPPED_SCALAR *priv_key = ec_wrapped_scalar_new(key->group); EC_POINT *pub_key = EC_POINT_new(key->group); - if (priv_key == NULL || pub_key == NULL || + if (priv_key == nullptr || pub_key == nullptr || // Generate the private key by testing candidates (FIPS 186-4 B.4.2). !ec_random_nonzero_scalar(key->group, &priv_key->scalar, kDefaultAdditionalData) || @@ -457,7 +463,7 @@ int EC_KEY_generate_key(EC_KEY *key) { } int EC_KEY_generate_key_fips(EC_KEY *eckey) { - if (eckey == NULL || eckey->group == NULL) { + if (eckey == nullptr || eckey->group == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -470,8 +476,8 @@ int EC_KEY_generate_key_fips(EC_KEY *eckey) { EC_POINT_free(eckey->pub_key); ec_wrapped_scalar_free(eckey->priv_key); - eckey->pub_key = NULL; - eckey->priv_key = NULL; + eckey->pub_key = nullptr; + eckey->priv_key = nullptr; return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/ec_montgomery.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/ec_montgomery.cc.inc index a5205fb298..f841622d26 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/ec_montgomery.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/ec_montgomery.cc.inc @@ -105,11 +105,11 @@ static int ec_GFp_mont_point_get_affine_coordinates(const EC_GROUP *group, ec_GFp_mont_felem_inv0(group, &z2, &point->Z); ec_GFp_mont_felem_sqr(group, &z1, &z2); - if (x != NULL) { + if (x != nullptr) { ec_GFp_mont_felem_mul(group, x, &point->X, &z1); } - if (y != NULL) { + if (y != nullptr) { ec_GFp_mont_felem_mul(group, &z1, &z1, &z2); ec_GFp_mont_felem_mul(group, y, &point->Y, &z1); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/felem.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/felem.cc.inc index 567856fe1b..b706f09b2b 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/felem.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/felem.cc.inc @@ -45,7 +45,7 @@ int ec_felem_to_bignum(const EC_GROUP *group, BIGNUM *out, const EC_FELEM *in) { uint8_t bytes[EC_MAX_BYTES]; size_t len; ec_felem_to_bytes(group, bytes, &len, in); - return BN_bin2bn(bytes, len, out) != NULL; + return BN_bin2bn(bytes, len, out) != nullptr; } void ec_felem_to_bytes(const EC_GROUP *group, uint8_t *out, size_t *out_len, diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/internal.h index 2c610bac0e..3d87bb8330 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/internal.h @@ -485,7 +485,7 @@ struct ec_method_st { // // TODO(davidben): This constrains |EC_FELEM|'s internal representation, adds // many indirect calls in the middle of the generic code, and a bunch of - // conversions. If p224-64.c were easily convertable to Montgomery form, we + // conversions. If p224-64.c were easily convertible to Montgomery form, we // could say |EC_FELEM| is always in Montgomery form. If we routed the rest of // simple.c to |EC_METHOD|, we could give |EC_POINT| an |EC_METHOD|-specific // representation and say |EC_FELEM| is purely a |EC_GFp_mont_method| type. @@ -578,7 +578,7 @@ struct ec_group_st { // has_order is one if |generator| and |order| have been initialized. int has_order; - // field_greater_than_order is one if |field| is greate than |order| and zero + // field_greater_than_order is one if |field| is greater than |order| and zero // otherwise. int field_greater_than_order; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/oct.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/oct.cc.inc index 69323dcb1b..094e322160 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/oct.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/oct.cc.inc @@ -144,7 +144,7 @@ static int ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point, int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point, const uint8_t *buf, size_t len, BN_CTX *ctx) { - if (EC_GROUP_cmp(group, point->group, NULL) != 0) { + if (EC_GROUP_cmp(group, point->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } @@ -154,11 +154,11 @@ int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point, size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, point_conversion_form_t form, uint8_t *buf, size_t max_out, BN_CTX *ctx) { - if (EC_GROUP_cmp(group, point->group, NULL) != 0) { + if (EC_GROUP_cmp(group, point->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } - if (buf == NULL) { + if (buf == nullptr) { // When |buf| is NULL, just return the number of bytes that would be // written, without doing an expensive Jacobian-to-affine conversion. if (ec_GFp_simple_is_at_infinity(group, &point->raw)) { @@ -177,13 +177,13 @@ size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, size_t EC_POINT_point2buf(const EC_GROUP *group, const EC_POINT *point, point_conversion_form_t form, uint8_t **out_buf, BN_CTX *ctx) { - *out_buf = NULL; - size_t len = EC_POINT_point2oct(group, point, form, NULL, 0, ctx); + *out_buf = nullptr; + size_t len = EC_POINT_point2oct(group, point, form, nullptr, 0, ctx); if (len == 0) { return 0; } uint8_t *buf = reinterpret_cast(OPENSSL_malloc(len)); - if (buf == NULL) { + if (buf == nullptr) { return 0; } len = EC_POINT_point2oct(group, point, form, buf, len, ctx); @@ -198,7 +198,7 @@ size_t EC_POINT_point2buf(const EC_GROUP *group, const EC_POINT *point, int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *point, const BIGNUM *x, int y_bit, BN_CTX *ctx) { - if (EC_GROUP_cmp(group, point->group, NULL) != 0) { + if (EC_GROUP_cmp(group, point->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } @@ -228,7 +228,7 @@ int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, BIGNUM *a = BN_CTX_get(ctx); BIGNUM *b = BN_CTX_get(ctx); BIGNUM *y = BN_CTX_get(ctx); - if (y == NULL || !EC_GROUP_get_curve_GFp(group, NULL, a, b, ctx)) { + if (y == nullptr || !EC_GROUP_get_curve_GFp(group, nullptr, a, b, ctx)) { return 0; } @@ -262,9 +262,7 @@ int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, } if (!BN_mod_sqrt(y, tmp1, field, ctx)) { - uint32_t err = ERR_peek_last_error(); - if (ERR_GET_LIB(err) == ERR_LIB_BN && - ERR_GET_REASON(err) == BN_R_NOT_A_SQUARE) { + if (ERR_equals(ERR_peek_last_error(), ERR_LIB_BN, BN_R_NOT_A_SQUARE)) { ERR_clear_error(); OPENSSL_PUT_ERROR(EC, EC_R_INVALID_COMPRESSED_POINT); } else { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/p224-64.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/p224-64.cc.inc index f36929fefb..10e90e5443 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/p224-64.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/p224-64.cc.inc @@ -876,7 +876,7 @@ static int ec_GFp_nistp224_point_get_affine_coordinates( p224_felem_square(tmp, z2); p224_felem_reduce(z1, tmp); - if (x != NULL) { + if (x != nullptr) { p224_felem x_in, x_out; p224_generic_to_felem(x_in, &point->X); p224_felem_mul(tmp, x_in, z1); @@ -884,7 +884,7 @@ static int ec_GFp_nistp224_point_get_affine_coordinates( p224_felem_to_generic(x, x_out); } - if (y != NULL) { + if (y != nullptr) { p224_felem y_in, y_out; p224_generic_to_felem(y_in, &point->Y); p224_felem_mul(tmp, z1, z2); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz.cc.inc index e640712a63..250975c9ce 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz.cc.inc @@ -293,8 +293,8 @@ static void ecp_nistz256_mod_inverse_sqr_mont(BN_ULONG r[P256_LIMBS], static void ecp_nistz256_windowed_mul(const EC_GROUP *group, P256_POINT *r, const EC_JACOBIAN *p, const EC_SCALAR *p_scalar) { - assert(p != NULL); - assert(p_scalar != NULL); + assert(p != nullptr); + assert(p_scalar != nullptr); assert(group->field.N.width == P256_LIMBS); static const size_t kWindowSize = 5; @@ -464,7 +464,7 @@ static void ecp_nistz256_points_mul_public(const EC_GROUP *group, const EC_SCALAR *g_scalar, const EC_JACOBIAN *p_, const EC_SCALAR *p_scalar) { - assert(p_ != NULL && p_scalar != NULL && g_scalar != NULL); + assert(p_ != nullptr && p_scalar != nullptr && g_scalar != nullptr); alignas(32) P256_POINT p; uint8_t p_str[33]; @@ -536,11 +536,11 @@ static int ecp_nistz256_get_affine(const EC_GROUP *group, assert(group->field.N.width == P256_LIMBS); ecp_nistz256_mod_inverse_sqr_mont(z_inv2, point->Z.words); - if (x != NULL) { + if (x != nullptr) { ecp_nistz256_mul_mont(x->words, z_inv2, point->X.words); } - if (y != NULL) { + if (y != nullptr) { ecp_nistz256_sqr_mont(z_inv2, z_inv2); // z^-4 ecp_nistz256_mul_mont(y->words, point->Y.words, point->Z.words); // y * z ecp_nistz256_mul_mont(y->words, y->words, z_inv2); // y * z^-3 @@ -651,9 +651,9 @@ static void ecp_nistz256_inv0_mod_ord(const EC_GROUP *group, EC_SCALAR *out, {4, i_111}, {5, i_111}, {5, i_101}, {3, i_11}, {10, i_101111}, {2, i_11}, {5, i_11}, {5, i_11}, {3, i_1}, {7, i_10101}, {6, i_1111}}; - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kChain); i++) { - ecp_nistz256_ord_sqr_mont(out->words, out->words, kChain[i].p); - ecp_nistz256_ord_mul_mont(out->words, out->words, table[kChain[i].i]); + for (const auto &step : kChain) { + ecp_nistz256_ord_sqr_mont(out->words, out->words, step.p); + ecp_nistz256_ord_mul_mont(out->words, out->words, table[step.i]); } } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/p256.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/p256.cc.inc index 6a8abcdbfb..96822d6634 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/p256.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/p256.cc.inc @@ -26,6 +26,8 @@ #include #include +#include + #include "../../internal.h" #include "../delocate.h" #include "./internal.h" @@ -259,14 +261,14 @@ static int ec_GFp_nistp256_point_get_affine_coordinates( fiat_p256_from_generic(z1, &point->Z); fiat_p256_inv_square(z2, z1); - if (x_out != NULL) { + if (x_out != nullptr) { fiat_p256_felem x; fiat_p256_from_generic(x, &point->X); fiat_p256_mul(x, x, z2); fiat_p256_to_generic(x_out, x); } - if (y_out != NULL) { + if (y_out != nullptr) { fiat_p256_felem y; fiat_p256_from_generic(y, &point->Y); fiat_p256_square(z2, z2); // z^-4 @@ -434,7 +436,7 @@ static void ec_GFp_nistp256_point_mul_public(const EC_GROUP *group, fiat_p256_felem p2[3]; fiat_p256_point_double(p2[0], p2[1], p2[2], p_pre_comp[0][0], p_pre_comp[0][1], p_pre_comp[0][2]); - for (size_t i = 1; i < OPENSSL_ARRAY_SIZE(p_pre_comp); i++) { + for (size_t i = 1; i < std::size(p_pre_comp); i++) { fiat_p256_point_add(p_pre_comp[i][0], p_pre_comp[i][1], p_pre_comp[i][2], p_pre_comp[i - 1][0], p_pre_comp[i - 1][1], p_pre_comp[i - 1][2], p2[0], p2[1], p2[2]); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/simple.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/simple.cc.inc index 59a130b338..d0148dd9a3 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/simple.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/simple.cc.inc @@ -71,9 +71,9 @@ int ec_GFp_simple_group_set_curve(EC_GROUP *group, const BIGNUM *p, int ec_GFp_simple_group_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b) { - if ((p != NULL && !BN_copy(p, &group->field.N)) || - (a != NULL && !ec_felem_to_bignum(group, a, &group->a)) || - (b != NULL && !ec_felem_to_bignum(group, b, &group->b))) { + if ((p != nullptr && !BN_copy(p, &group->field.N)) || + (a != nullptr && !ec_felem_to_bignum(group, a, &group->a)) || + (b != nullptr && !ec_felem_to_bignum(group, b, &group->b))) { return 0; } return 1; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/simple_mul.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/simple_mul.cc.inc index 36288a7013..9ac18fc1ec 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/simple_mul.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/simple_mul.cc.inc @@ -16,6 +16,9 @@ #include +#include +#include + #include "internal.h" #include "../bn/internal.h" #include "../../internal.h" @@ -31,7 +34,7 @@ void ec_GFp_mont_mul(const EC_GROUP *group, EC_JACOBIAN *r, EC_JACOBIAN precomp[32]; ec_GFp_simple_point_set_to_infinity(group, &precomp[0]); ec_GFp_simple_point_copy(&precomp[1], p); - for (size_t j = 2; j < OPENSSL_ARRAY_SIZE(precomp); j++) { + for (size_t j = 2; j < std::size(precomp); j++) { if (j & 1) { ec_GFp_mont_add(group, &precomp[j], &precomp[1], &precomp[j - 1]); } else { @@ -58,7 +61,7 @@ void ec_GFp_mont_mul(const EC_GROUP *group, EC_JACOBIAN *r, // Select the entry in constant-time. EC_JACOBIAN tmp; OPENSSL_memset(&tmp, 0, sizeof(EC_JACOBIAN)); - for (size_t j = 0; j < OPENSSL_ARRAY_SIZE(precomp); j++) { + for (size_t j = 0; j < std::size(precomp); j++) { BN_ULONG mask = constant_time_eq_w(j, window); ec_point_select(group, &tmp, mask, &precomp[j], &tmp); } @@ -133,7 +136,7 @@ void ec_GFp_mont_mul_batch(const EC_GROUP *group, EC_JACOBIAN *r, EC_JACOBIAN precomp[3][17]; ec_GFp_mont_batch_precomp(group, precomp[0], 17, p0); ec_GFp_mont_batch_precomp(group, precomp[1], 17, p1); - if (p2 != NULL) { + if (p2 != nullptr) { ec_GFp_mont_batch_precomp(group, precomp[2], 17, p2); } @@ -157,7 +160,7 @@ void ec_GFp_mont_mul_batch(const EC_GROUP *group, EC_JACOBIAN *r, ec_GFp_mont_batch_get_window(group, &tmp, precomp[1], scalar1, i); ec_GFp_mont_add(group, r, r, &tmp); - if (p2 != NULL) { + if (p2 != nullptr) { ec_GFp_mont_batch_get_window(group, &tmp, precomp[2], scalar2, i); ec_GFp_mont_add(group, r, r, &tmp); } @@ -202,10 +205,10 @@ int ec_GFp_mont_init_precomp(const EC_GROUP *group, EC_PRECOMP *out, // Store the comb in affine coordinates to shrink the table. (This reduces // cache pressure and makes the constant-time selects faster.) - static_assert(OPENSSL_ARRAY_SIZE(comb) == OPENSSL_ARRAY_SIZE(out->comb), - "comb sizes did not match"); - return ec_jacobian_to_affine_batch(group, out->comb, comb, - OPENSSL_ARRAY_SIZE(comb)); + static_assert( + std::extent_v == std::extent_vcomb)>, + "comb sizes did not match"); + return ec_jacobian_to_affine_batch(group, out->comb, comb, std::size(comb)); } static void ec_GFp_mont_get_comb_window(const EC_GROUP *group, @@ -224,7 +227,7 @@ static void ec_GFp_mont_get_comb_window(const EC_GROUP *group, // Select precomp->comb[window - 1]. If |window| is zero, |match| will always // be zero, which will leave |out| at infinity. OPENSSL_memset(out, 0, sizeof(EC_JACOBIAN)); - for (unsigned j = 0; j < OPENSSL_ARRAY_SIZE(precomp->comb); j++) { + for (unsigned j = 0; j < std::size(precomp->comb); j++) { BN_ULONG match = constant_time_eq_w(window, j + 1); ec_felem_select(group, &out->X, match, &precomp->comb[j].X, &out->X); ec_felem_select(group, &out->Y, match, &precomp->comb[j].Y, &out->Y); @@ -253,12 +256,12 @@ void ec_GFp_mont_mul_precomp(const EC_GROUP *group, EC_JACOBIAN *r, ec_GFp_mont_add(group, r, r, &tmp); } - if (p1 != NULL) { + if (p1 != nullptr) { ec_GFp_mont_get_comb_window(group, &tmp, p1, scalar1, i); ec_GFp_mont_add(group, r, r, &tmp); } - if (p2 != NULL) { + if (p2 != nullptr) { ec_GFp_mont_get_comb_window(group, &tmp, p2, scalar2, i); ec_GFp_mont_add(group, r, r, &tmp); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/wnaf.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/wnaf.cc.inc index 6a9b29a2b8..56d5b84066 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/wnaf.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ec/wnaf.cc.inc @@ -18,6 +18,8 @@ #include #include +#include + #include #include #include @@ -138,8 +140,8 @@ int ec_GFp_mont_mul_public_batch(const EC_GROUP *group, EC_JACOBIAN *r, EC_JACOBIAN precomp_stack[EC_WNAF_STACK][EC_WNAF_TABLE_SIZE]; // Allocated pointers, which will remain NULL unless needed. - EC_JACOBIAN(*precomp_alloc)[EC_WNAF_TABLE_SIZE] = NULL; - int8_t(*wNAF_alloc)[EC_MAX_BYTES * 8 + 1] = NULL; + EC_JACOBIAN(*precomp_alloc)[EC_WNAF_TABLE_SIZE] = nullptr; + int8_t (*wNAF_alloc)[EC_MAX_BYTES * 8 + 1] = nullptr; // These fields point either to the stack or heap buffers of the same name. int8_t(*wNAF)[EC_MAX_BYTES * 8 + 1]; @@ -151,12 +153,12 @@ int ec_GFp_mont_mul_public_batch(const EC_GROUP *group, EC_JACOBIAN *r, } else { wNAF_alloc = reinterpret_cast( OPENSSL_calloc(num, sizeof(wNAF_alloc[0]))); - if (wNAF_alloc == NULL) { + if (wNAF_alloc == nullptr) { return 0; } precomp_alloc = reinterpret_cast( OPENSSL_calloc(num, sizeof(precomp_alloc[0]))); - if (precomp_alloc == NULL) { + if (precomp_alloc == nullptr) { OPENSSL_free(wNAF_alloc); return 0; } @@ -167,15 +169,15 @@ int ec_GFp_mont_mul_public_batch(const EC_GROUP *group, EC_JACOBIAN *r, int8_t g_wNAF[EC_MAX_BYTES * 8 + 1]; EC_JACOBIAN g_precomp[EC_WNAF_TABLE_SIZE]; - assert(wNAF_len <= OPENSSL_ARRAY_SIZE(g_wNAF)); + assert(wNAF_len <= std::size(g_wNAF)); const EC_JACOBIAN *g = &group->generator.raw; - if (g_scalar != NULL) { + if (g_scalar != nullptr) { ec_compute_wNAF(group, g_wNAF, g_scalar, bits, EC_WNAF_WINDOW_BITS); compute_precomp(group, g_precomp, g, EC_WNAF_TABLE_SIZE); } for (size_t i = 0; i < num; i++) { - assert(wNAF_len <= OPENSSL_ARRAY_SIZE(wNAF[i])); + assert(wNAF_len <= std::size(wNAF[i])); ec_compute_wNAF(group, wNAF[i], &scalars[i], bits, EC_WNAF_WINDOW_BITS); compute_precomp(group, precomp[i], &points[i], EC_WNAF_TABLE_SIZE); } @@ -187,7 +189,7 @@ int ec_GFp_mont_mul_public_batch(const EC_GROUP *group, EC_JACOBIAN *r, ec_GFp_mont_dbl(group, r, r); } - if (g_scalar != NULL && g_wNAF[k] != 0) { + if (g_scalar != nullptr && g_wNAF[k] != 0) { lookup_precomp(group, &tmp, g_precomp, g_wNAF[k]); if (r_is_at_infinity) { ec_GFp_simple_point_copy(r, &tmp); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ecdh/ecdh.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ecdh/ecdh.cc.inc index 3c3832ce93..3592a690ab 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ecdh/ecdh.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ecdh/ecdh.cc.inc @@ -23,6 +23,7 @@ #include #include "../../internal.h" +#include "../bcm_interface.h" #include "../ec/internal.h" #include "../service_indicator/internal.h" @@ -31,13 +32,13 @@ int ECDH_compute_key_fips(uint8_t *out, size_t out_len, const EC_POINT *pub_key, const EC_KEY *priv_key) { boringssl_ensure_ecc_self_test(); - if (priv_key->priv_key == NULL) { + if (priv_key->priv_key == nullptr) { OPENSSL_PUT_ERROR(ECDH, ECDH_R_NO_PRIVATE_VALUE); return 0; } const EC_SCALAR *const priv = &priv_key->priv_key->scalar; const EC_GROUP *const group = EC_KEY_get0_group(priv_key); - if (EC_GROUP_cmp(group, pub_key->group, NULL) != 0) { + if (EC_GROUP_cmp(group, pub_key->group, nullptr) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ecdsa/ecdsa.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ecdsa/ecdsa.cc.inc index 24b8f49008..64ff0d823f 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ecdsa/ecdsa.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/ecdsa/ecdsa.cc.inc @@ -22,6 +22,7 @@ #include #include "../../internal.h" +#include "../bcm_interface.h" #include "../bn/internal.h" #include "../ec/internal.h" #include "../service_indicator/internal.h" @@ -61,7 +62,7 @@ int ecdsa_verify_fixed_no_self_test(const uint8_t *digest, size_t digest_len, const EC_KEY *eckey) { const EC_GROUP *group = EC_KEY_get0_group(eckey); const EC_POINT *pub_key = EC_KEY_get0_public_key(eckey); - if (group == NULL || pub_key == NULL || sig == NULL) { + if (group == nullptr || pub_key == nullptr || sig == nullptr) { OPENSSL_PUT_ERROR(ECDSA, ECDSA_R_MISSING_PARAMETERS); return 0; } @@ -194,7 +195,7 @@ int ecdsa_sign_fixed_with_nonce_for_known_answer_test( } const EC_GROUP *group = EC_KEY_get0_group(eckey); - if (group == NULL || eckey->priv_key == NULL) { + if (group == nullptr || eckey->priv_key == nullptr) { OPENSSL_PUT_ERROR(ECDSA, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -220,7 +221,7 @@ int ecdsa_sign_fixed(const uint8_t *digest, size_t digest_len, uint8_t *sig, } const EC_GROUP *group = EC_KEY_get0_group(eckey); - if (group == NULL || eckey->priv_key == NULL) { + if (group == nullptr || eckey->priv_key == nullptr) { OPENSSL_PUT_ERROR(ECDSA, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -229,13 +230,13 @@ int ecdsa_sign_fixed(const uint8_t *digest, size_t digest_len, uint8_t *sig, // Pass a SHA512 hash of the private key and digest as additional data // into the RBG. This is a hardening measure against entropy failure. - static_assert(BCM_SHA512_DIGEST_LENGTH >= 32, + static_assert(SHA512_DIGEST_LENGTH >= 32, "additional_data is too large for SHA-512"); FIPS_service_indicator_lock_state(); SHA512_CTX sha; - uint8_t additional_data[BCM_SHA512_DIGEST_LENGTH]; + uint8_t additional_data[SHA512_DIGEST_LENGTH]; BCM_sha512_init(&sha); BCM_sha512_update(&sha, priv_key->words, order->width * sizeof(BN_ULONG)); BCM_sha512_update(&sha, digest, digest_len); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/entropy/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/entropy/internal.h new file mode 100644 index 0000000000..a9f2a81483 --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/entropy/internal.h @@ -0,0 +1,38 @@ +// Copyright 2025 The BoringSSL Authors +// +// Licensed under the Apache License, Version 2.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. + +#ifndef OPENSSL_HEADER_CRYPTO_FIPSMODULE_ENTROPY_INTERNAL_H +#define OPENSSL_HEADER_CRYPTO_FIPSMODULE_ENTROPY_INTERNAL_H + +#include + +#if defined(OPENSSL_LINUX) || defined(OPENSSL_MACOS) + +BSSL_NAMESPACE_BEGIN +namespace entropy { + +// GetSeed fills `out` with random bytes from the jitter source. +OPENSSL_EXPORT bool GetSeed(uint8_t out[48]); + +// GetSamples fetches `n` raw delta time samples. +OPENSSL_EXPORT bool GetSamples(uint64_t *out, size_t n); + +// GetVersion returns the version of the entropy module. +int GetVersion(); + +} // namespace entropy +BSSL_NAMESPACE_END + +#endif // LINUX || MACOS +#endif // OPENSSL_HEADER_CRYPTO_FIPSMODULE_ENTROPY_INTERNAL_H diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/entropy/jitter.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/entropy/jitter.cc.inc new file mode 100644 index 0000000000..19c7fbfbd4 --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/entropy/jitter.cc.inc @@ -0,0 +1,463 @@ +// Copyright 2025 The BoringSSL Authors +// +// Licensed under the Apache License, Version 2.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. + +// BoringCrypto Jitter Entropy version 20250725. + +#include + +#if defined(OPENSSL_LINUX) || defined(OPENSSL_MACOS) + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include "internal.h" +#include "sha512.cc.inc" + +#if defined(__x86_64__) +#include +#endif + + +BSSL_NAMESPACE_BEGIN +namespace entropy { +namespace { + +#if defined(__x86_64__) +static inline uint64_t GetTimestamp() { return _rdtsc(); } +#elif defined(__aarch64__) +static inline uint64_t GetTimestamp() { + // Ideally this would use __arm_rsr64 from . Clang has supported + // it Clang 3.7 (2016), but GCC did not add it until GCC 14.1.0 (2024). See + // https://crbug.com/440670941. When our minimum GCC is past that point, + // switch this back to __arm_rsr64. + uint64_t ret; + __asm__ volatile("mrs %0, cntvct_el0" : "=r"(ret)); + return ret; +} +#else +static inline uint64_t GetTimestamp() { + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC_RAW, &ts); + return ts.tv_sec * 1000000000ULL + ts.tv_nsec; +} +#endif + +class MemoryOffsetLCG { + public: + MemoryOffsetLCG() : state(GetTimestamp() & 0xFFFFFFFF) {} + uint32_t Next() { + state = state * 1664525 + 1013904223; + return state; + } + + private: + uint32_t state; +}; + +class MemoryAccessSampler { + public: + MemoryAccessSampler(size_t array_size, unsigned num_samples) + : array_size_(array_size), + num_samples_(num_samples), + array_(reinterpret_cast(OPENSSL_malloc(array_size_))) { + if (array_ == nullptr || // + array_size_ == 0 || // + array_size_ > (1u << 26) || // + array_size_ & (array_size_ - 1)) { + abort(); + } + } + + ~MemoryAccessSampler() { OPENSSL_free(const_cast(array_)); } + + MemoryAccessSampler(const MemoryAccessSampler &) = delete; + MemoryAccessSampler &operator=(const MemoryAccessSampler &) = delete; + + MemoryAccessSampler(MemoryAccessSampler &&other) + : array_size_(other.array_size_), + num_samples_(other.num_samples_), + lcg_(other.lcg_), + array_(other.array_) { + other.array_ = nullptr; + } + + bool Next(uint64_t *out) { + // Perform some memory accesses and measure how long it took. The LCG is + // intended to defeat any CPU predictors and thus expose this code to as + // much system entropy as possible. + for (unsigned i = 0; i < num_samples_; i++) { + // The lower bits of an LCG tend to fall into short cycles and so are + // discarded here. + array_[(lcg_.Next() >> 6) & (array_size_ - 1)] += 1; + } + + *out = GetTimestamp(); + return true; + } + + private: + const size_t array_size_; + const unsigned num_samples_; + MemoryOffsetLCG lcg_; + volatile uint8_t *array_; +}; + +template +class DeltaSampler { + public: + explicit DeltaSampler(T &&sub_sampler) + : sub_sampler_(std::forward(sub_sampler)) {} + + // Next function to return the delta between two subsequent samples + bool Next(uint64_t *out) { + uint64_t sample; + if (!sub_sampler_.Next(&sample)) { + return false; + } + + if (!initialized_) { + last_sample_ = sample; + if (!sub_sampler_.Next(&sample)) { + return false; + } + initialized_ = true; + } + + *out = sample - last_sample_; + last_sample_ = sample; + return true; + } + + private: + bool initialized_ = false; + T sub_sampler_; + uint64_t last_sample_ = 0; +}; + +template +DeltaSampler(U &&sub_sampler) -> DeltaSampler>; + +template +class MaskSampler { + public: + explicit MaskSampler(uint8_t mask, T &&sub_sampler) + : mask_(mask), sub_sampler_(std::forward(sub_sampler)) {} + + bool Next(uint8_t *out) { + uint64_t sample; + if (!sub_sampler_.Next(&sample)) { + return false; + } + + *out = sample & mask_; + return true; + } + + private: + const uint8_t mask_; + T sub_sampler_; +}; + +template +MaskSampler(uint8_t mask, U &&sub_sampler) -> MaskSampler>; + +// The estimated entropy per sample from MaskSampler. +constexpr float kH = 0.8; + +// kAlphaLog2 is log_2(alpha), where alpha is the standard false-positive +// probability from SP 800-90B. +static constexpr float kAlphaLog2 = -20; +// kAlpha is the variable of the same name from section 4.4.1 of SP 800-90B. +constexpr float kAlpha = 1.0 / (1 << static_cast(-kAlphaLog2)); + +// Ceil rounds up its non-negative argument to the next integer. (std::ceil +// isn't constexpr until C++23.) +constexpr unsigned Ceil(float val) { + auto truncated = static_cast(val); + if (val == static_cast(truncated)) { + return truncated; + } + if (val > 0) { + return truncated + 1; + } + __builtin_unreachable(); +} + +template +class RepetitionCountTest { + public: + static constexpr unsigned kThreshold = 1 + Ceil(-kAlphaLog2 / kH); + static_assert(kThreshold == 26); + + explicit RepetitionCountTest(T &&sub_sampler) + : sub_sampler_(std::forward(sub_sampler)) {} + + bool Next(uint8_t *out) { + uint8_t sample; + if (!sub_sampler_.Next(&sample)) { + return false; + } + if (sample == last_sample_) { + count_++; + } else { + count_ = 1; + last_sample_ = sample; + } + if (count_ >= kThreshold) { + return false; + } + *out = sample; + return true; + } + + private: + T sub_sampler_; + unsigned count_ = 0; + uint8_t last_sample_ = 0; +}; + +template +RepetitionCountTest(U &&sub_sampler) -> RepetitionCountTest>; + +constexpr double BinomialPMF(int64_t k, int64_t n, double p) { + if (k < 0 || k > n) { + return 0.0; + } + + double result = 1.0; + for (int64_t i = 0; i < k; ++i) { + result *= (n - i); + result /= (i + 1); + } + + for (int64_t i = 0; i < k; ++i) { + result *= p; + } + for (int64_t i = 0; i < n - k; ++i) { + result *= (1 - p); + } + + return result; +} + +// CritBinom implements the Excel function of the same name. +constexpr unsigned CritBinom(unsigned trials, double probability_s, + double alpha) { + if (probability_s < 0.0 || probability_s > 1.0 || alpha < 0.0 || + alpha > 1.0) { + __builtin_unreachable(); + } + + double cumulative = 0.0; + for (unsigned k = 0; k <= trials; ++k) { + cumulative += BinomialPMF(k, trials, probability_s); + if (cumulative >= alpha) { + return k; + } + } + + return trials; +} + +// ExpTaylor calculates e^x using the Taylor series: e^x = 1 + x + x²/2! + +// x³/3! + ... +constexpr double ExpTaylor(double x) { + double sum = 1.0; + double term = 1.0; + + for (int i = 1; i < 25; ++i) { + term *= x / i; + sum += term; + } + + return sum; +} + +// Power2 calculates 2^exp by calculating e^(ln(2) * exp) = e^(ln(2)) ^ exp = +// 2^exp. (std::pow isn't constexpr until C++26.) +constexpr double Power2(double exp) { + constexpr double ln2 = 0.693147180559945309417232121458; + return ExpTaylor(exp * ln2); +} + +// AdaptiveProportionTestCutoff implements the function from the footnote on +// page 27 of SP 800-90B. +constexpr unsigned AdaptiveProportionTestCutoff(unsigned W, float H, + float alpha) { + return 1 + CritBinom(W, Power2(-H), 1.0 - alpha); +} + +// These are the example values from table 2 of SP 800-90B, to show that +// we're calculating the values correctly. +static_assert(AdaptiveProportionTestCutoff(512, 0.5, kAlpha) == 410); +static_assert(AdaptiveProportionTestCutoff(512, 1, kAlpha) == 311); +static_assert(AdaptiveProportionTestCutoff(512, 2, kAlpha) == 177); +static_assert(AdaptiveProportionTestCutoff(512, 4, kAlpha) == 62); +static_assert(AdaptiveProportionTestCutoff(512, 8, kAlpha) == 13); + +template +class AdaptiveProportionTest { + public: + // The size of the sliding window, representing the number of recent samples + // to analyze. + static constexpr unsigned kWindowSize = 512; + + // The maximum number of times any single byte value is allowed to appear + // within the sliding window. + static constexpr unsigned kThreshold = + AdaptiveProportionTestCutoff(kWindowSize, kH, kAlpha); + static_assert(kThreshold == 348); + + explicit AdaptiveProportionTest(T &&sub_sampler) + : sub_sampler_(std::forward(sub_sampler)) { + counts_.fill(0); + } + + bool Next(uint8_t *out) { + uint8_t sample; + if (!sub_sampler_.Next(&sample)) { + return false; + } + *out = sample; + + if (samples_processed_ >= kWindowSize) { + const uint8_t evicted_sample = buffer_[buffer_idx_]; + counts_[evicted_sample]--; + } + + buffer_[buffer_idx_] = sample; + const uint16_t new_count = ++counts_[sample]; + + if (new_count > kThreshold) { + return false; + } + + buffer_idx_ = (buffer_idx_ + 1) % kWindowSize; + samples_processed_++; + + return true; + } + + private: + T sub_sampler_; + + // A circular buffer to store the most recent `kWindowSize` samples. + std::array buffer_{}; + + // An array to store the frequency counts of each possible byte value (0-255) + // within the current window. + std::array counts_{}; + + // The current index for writing into the circular buffer. + size_t buffer_idx_ = 0; + + // The total number of samples processed. Used to determine when the buffer + // is full and eviction should begin. + size_t samples_processed_ = 0; +}; + +template +AdaptiveProportionTest(U &&sub_sampler) + -> AdaptiveProportionTest>; + +template +class SeedSampler { + public: + // NIST requires 1024 samples at start-up time. This code is structured so + // that the entropy generator is considered to be starting afresh for each + // seed. + static constexpr unsigned kNumSamples = 1024; + + explicit SeedSampler(T &&sub_sampler) + : sub_sampler_(std::forward(sub_sampler)) {} + + bool Next(uint8_t out_seed[48]) { + // HMAC-SHA384 `kNumSamples` samples with an all-zero key: + SHA512_CTX ctx; + SHA384_Init(&ctx); + + uint8_t block[kSHA384Block]; + memset(block, 0x36, sizeof(block)); + SHA384_Update(&ctx, block, sizeof(block)); + + static_assert(kNumSamples % sizeof(block) == 0); + for (unsigned i = 0; i < kNumSamples / sizeof(block); i++) { + for (unsigned j = 0; j < sizeof(block); j++) { + if (!sub_sampler_.Next(&block[j])) { + return false; + } + } + SHA384_Update(&ctx, block, sizeof(block)); + } + + SHA384_Final(out_seed, &ctx); + + SHA384_Init(&ctx); + memset(block, 0x5c, sizeof(block)); + SHA384_Update(&ctx, block, sizeof(block)); + SHA384_Update(&ctx, out_seed, kSHA384DigestLength); + SHA384_Final(out_seed, &ctx); + + return true; + } + + private: + T sub_sampler_; +}; + +template +SeedSampler(U &&sub_sampler) -> SeedSampler>; + +constexpr size_t kMemorySize = 1u << 25; +constexpr size_t kMemoryAccessesPerSample = 16; +constexpr size_t kBitsPerSample = 8; +constexpr uint8_t kMask = (1u << kBitsPerSample) - 1; + +} // namespace + +int GetVersion() { return 20250725; } + +bool GetSeed(uint8_t out[48]) { + auto sampler(SeedSampler(AdaptiveProportionTest(RepetitionCountTest( + MaskSampler(kMask, DeltaSampler(MemoryAccessSampler( + kMemorySize, kMemoryAccessesPerSample))))))); + return sampler.Next(out); +} + +bool GetSamples(uint64_t *out, size_t n) { + auto sampler( + DeltaSampler(MemoryAccessSampler(kMemorySize, kMemoryAccessesPerSample))); + for (size_t i = 0; i < n; i++) { + if (!sampler.Next(&out[i])) { + return false; + } + } + return true; +} + +} // namespace entropy +BSSL_NAMESPACE_END + +#endif // LINUX || MACOS diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/entropy/sha512.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/entropy/sha512.cc.inc new file mode 100644 index 0000000000..14e2975bc7 --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/entropy/sha512.cc.inc @@ -0,0 +1,324 @@ +// Copyright 2004-2016 The OpenSSL Project Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.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 +#include + + +// This is a copy of the SHA-384 code for the purpose of isolating the jitter +// entropy source certification from any changes to the normal implementation. + +namespace bssl::entropy { +namespace { + +constexpr size_t kSHA384Block = 128; +constexpr size_t kSHA384DigestLength = (384 / 8); + +struct SHA512_CTX { + uint64_t h[8]; + uint64_t Nl, Nh; + uint8_t p[kSHA384Block]; + unsigned num, md_len; +}; + +uint64_t CRYPTO_bswap8(uint64_t x) { return __builtin_bswap64(x); } + +uint64_t CRYPTO_load_u64_be(const void *ptr) { + uint64_t ret; + memcpy(&ret, ptr, sizeof(ret)); + return CRYPTO_bswap8(ret); +} + +void CRYPTO_store_u64_be(void *out, uint64_t v) { + v = CRYPTO_bswap8(v); + memcpy(out, &v, sizeof(v)); +} + +uint64_t CRYPTO_rotr_u64(uint64_t value, int shift) { + return (value >> shift) | (value << ((-shift) & 63)); +} + +void sha512_update(SHA512_CTX *c, const void *in_data, size_t len); +void sha512_final_impl(uint8_t *out, size_t md_len, SHA512_CTX *sha); + +void SHA384_Init(SHA512_CTX *sha) { + sha->h[0] = UINT64_C(0xcbbb9d5dc1059ed8); + sha->h[1] = UINT64_C(0x629a292a367cd507); + sha->h[2] = UINT64_C(0x9159015a3070dd17); + sha->h[3] = UINT64_C(0x152fecd8f70e5939); + sha->h[4] = UINT64_C(0x67332667ffc00b31); + sha->h[5] = UINT64_C(0x8eb44a8768581511); + sha->h[6] = UINT64_C(0xdb0c2e0d64f98fa7); + sha->h[7] = UINT64_C(0x47b5481dbefa4fa4); + + sha->Nl = 0; + sha->Nh = 0; + sha->num = 0; + sha->md_len = kSHA384DigestLength; + return; +} + +void SHA384_Final(uint8_t out[kSHA384DigestLength], SHA512_CTX *sha) { + // This function must be paired with |SHA384_Init|, which sets + // |sha->md_len| to |kSHA384DigestLength|. + sha512_final_impl(out, kSHA384DigestLength, sha); + return; +} + +void SHA384_Update(SHA512_CTX *sha, const void *data, size_t len) { + return sha512_update(sha, data, len); +} + +void sha512_block_data_order(uint64_t state[8], const uint8_t *in, + size_t num_blocks); + +void sha512_final_impl(uint8_t *out, size_t md_len, SHA512_CTX *sha) { + uint8_t *p = sha->p; + size_t n = sha->num; + + p[n] = 0x80; // There always is a room for one + n++; + if (n > (sizeof(sha->p) - 16)) { + memset(p + n, 0, sizeof(sha->p) - n); + n = 0; + sha512_block_data_order(sha->h, p, 1); + } + + memset(p + n, 0, sizeof(sha->p) - 16 - n); + CRYPTO_store_u64_be(p + sizeof(sha->p) - 16, sha->Nh); + CRYPTO_store_u64_be(p + sizeof(sha->p) - 8, sha->Nl); + + sha512_block_data_order(sha->h, p, 1); + + const size_t out_words = md_len / 8; + for (size_t i = 0; i < out_words; i++) { + CRYPTO_store_u64_be(out, sha->h[i]); + out += 8; + } +} + +const uint64_t K512[80] = { + UINT64_C(0x428a2f98d728ae22), UINT64_C(0x7137449123ef65cd), + UINT64_C(0xb5c0fbcfec4d3b2f), UINT64_C(0xe9b5dba58189dbbc), + UINT64_C(0x3956c25bf348b538), UINT64_C(0x59f111f1b605d019), + UINT64_C(0x923f82a4af194f9b), UINT64_C(0xab1c5ed5da6d8118), + UINT64_C(0xd807aa98a3030242), UINT64_C(0x12835b0145706fbe), + UINT64_C(0x243185be4ee4b28c), UINT64_C(0x550c7dc3d5ffb4e2), + UINT64_C(0x72be5d74f27b896f), UINT64_C(0x80deb1fe3b1696b1), + UINT64_C(0x9bdc06a725c71235), UINT64_C(0xc19bf174cf692694), + UINT64_C(0xe49b69c19ef14ad2), UINT64_C(0xefbe4786384f25e3), + UINT64_C(0x0fc19dc68b8cd5b5), UINT64_C(0x240ca1cc77ac9c65), + UINT64_C(0x2de92c6f592b0275), UINT64_C(0x4a7484aa6ea6e483), + UINT64_C(0x5cb0a9dcbd41fbd4), UINT64_C(0x76f988da831153b5), + UINT64_C(0x983e5152ee66dfab), UINT64_C(0xa831c66d2db43210), + UINT64_C(0xb00327c898fb213f), UINT64_C(0xbf597fc7beef0ee4), + UINT64_C(0xc6e00bf33da88fc2), UINT64_C(0xd5a79147930aa725), + UINT64_C(0x06ca6351e003826f), UINT64_C(0x142929670a0e6e70), + UINT64_C(0x27b70a8546d22ffc), UINT64_C(0x2e1b21385c26c926), + UINT64_C(0x4d2c6dfc5ac42aed), UINT64_C(0x53380d139d95b3df), + UINT64_C(0x650a73548baf63de), UINT64_C(0x766a0abb3c77b2a8), + UINT64_C(0x81c2c92e47edaee6), UINT64_C(0x92722c851482353b), + UINT64_C(0xa2bfe8a14cf10364), UINT64_C(0xa81a664bbc423001), + UINT64_C(0xc24b8b70d0f89791), UINT64_C(0xc76c51a30654be30), + UINT64_C(0xd192e819d6ef5218), UINT64_C(0xd69906245565a910), + UINT64_C(0xf40e35855771202a), UINT64_C(0x106aa07032bbd1b8), + UINT64_C(0x19a4c116b8d2d0c8), UINT64_C(0x1e376c085141ab53), + UINT64_C(0x2748774cdf8eeb99), UINT64_C(0x34b0bcb5e19b48a8), + UINT64_C(0x391c0cb3c5c95a63), UINT64_C(0x4ed8aa4ae3418acb), + UINT64_C(0x5b9cca4f7763e373), UINT64_C(0x682e6ff3d6b2b8a3), + UINT64_C(0x748f82ee5defb2fc), UINT64_C(0x78a5636f43172f60), + UINT64_C(0x84c87814a1f0ab72), UINT64_C(0x8cc702081a6439ec), + UINT64_C(0x90befffa23631e28), UINT64_C(0xa4506cebde82bde9), + UINT64_C(0xbef9a3f7b2c67915), UINT64_C(0xc67178f2e372532b), + UINT64_C(0xca273eceea26619c), UINT64_C(0xd186b8c721c0c207), + UINT64_C(0xeada7dd6cde0eb1e), UINT64_C(0xf57d4f7fee6ed178), + UINT64_C(0x06f067aa72176fba), UINT64_C(0x0a637dc5a2c898a6), + UINT64_C(0x113f9804bef90dae), UINT64_C(0x1b710b35131c471b), + UINT64_C(0x28db77f523047d84), UINT64_C(0x32caab7b40c72493), + UINT64_C(0x3c9ebe0a15c9bebc), UINT64_C(0x431d67c49c100d4c), + UINT64_C(0x4cc5d4becb3e42b6), UINT64_C(0x597f299cfc657e2a), + UINT64_C(0x5fcb6fab3ad6faec), UINT64_C(0x6c44198c4a475817), +}; + +#define Sigma0(x) \ + (CRYPTO_rotr_u64((x), 28) ^ CRYPTO_rotr_u64((x), 34) ^ \ + CRYPTO_rotr_u64((x), 39)) +#define Sigma1(x) \ + (CRYPTO_rotr_u64((x), 14) ^ CRYPTO_rotr_u64((x), 18) ^ \ + CRYPTO_rotr_u64((x), 41)) +#define sigma0(x) \ + (CRYPTO_rotr_u64((x), 1) ^ CRYPTO_rotr_u64((x), 8) ^ ((x) >> 7)) +#define sigma1(x) \ + (CRYPTO_rotr_u64((x), 19) ^ CRYPTO_rotr_u64((x), 61) ^ ((x) >> 6)) + +#define Ch(x, y, z) (((x) & (y)) ^ ((~(x)) & (z))) +#define Maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) + +#define ROUND_00_15(i, a, b, c, d, e, f, g, h) \ + do { \ + T1 += h + Sigma1(e) + Ch(e, f, g) + K512[i]; \ + h = Sigma0(a) + Maj(a, b, c); \ + d += T1; \ + h += T1; \ + } while (0) + +#define ROUND_16_80(i, j, a, b, c, d, e, f, g, h, X) \ + do { \ + s0 = X[(j + 1) & 0x0f]; \ + s0 = sigma0(s0); \ + s1 = X[(j + 14) & 0x0f]; \ + s1 = sigma1(s1); \ + T1 = X[(j) & 0x0f] += s0 + s1 + X[(j + 9) & 0x0f]; \ + ROUND_00_15(i + j, a, b, c, d, e, f, g, h); \ + } while (0) + +void sha512_block_data_order(uint64_t state[8], const uint8_t *in, size_t num) { + uint64_t a, b, c, d, e, f, g, h, s0, s1, T1; + uint64_t X[16]; + int i; + + while (num--) { + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + f = state[5]; + g = state[6]; + h = state[7]; + + T1 = X[0] = CRYPTO_load_u64_be(in); + ROUND_00_15(0, a, b, c, d, e, f, g, h); + T1 = X[1] = CRYPTO_load_u64_be(in + 8); + ROUND_00_15(1, h, a, b, c, d, e, f, g); + T1 = X[2] = CRYPTO_load_u64_be(in + 2 * 8); + ROUND_00_15(2, g, h, a, b, c, d, e, f); + T1 = X[3] = CRYPTO_load_u64_be(in + 3 * 8); + ROUND_00_15(3, f, g, h, a, b, c, d, e); + T1 = X[4] = CRYPTO_load_u64_be(in + 4 * 8); + ROUND_00_15(4, e, f, g, h, a, b, c, d); + T1 = X[5] = CRYPTO_load_u64_be(in + 5 * 8); + ROUND_00_15(5, d, e, f, g, h, a, b, c); + T1 = X[6] = CRYPTO_load_u64_be(in + 6 * 8); + ROUND_00_15(6, c, d, e, f, g, h, a, b); + T1 = X[7] = CRYPTO_load_u64_be(in + 7 * 8); + ROUND_00_15(7, b, c, d, e, f, g, h, a); + T1 = X[8] = CRYPTO_load_u64_be(in + 8 * 8); + ROUND_00_15(8, a, b, c, d, e, f, g, h); + T1 = X[9] = CRYPTO_load_u64_be(in + 9 * 8); + ROUND_00_15(9, h, a, b, c, d, e, f, g); + T1 = X[10] = CRYPTO_load_u64_be(in + 10 * 8); + ROUND_00_15(10, g, h, a, b, c, d, e, f); + T1 = X[11] = CRYPTO_load_u64_be(in + 11 * 8); + ROUND_00_15(11, f, g, h, a, b, c, d, e); + T1 = X[12] = CRYPTO_load_u64_be(in + 12 * 8); + ROUND_00_15(12, e, f, g, h, a, b, c, d); + T1 = X[13] = CRYPTO_load_u64_be(in + 13 * 8); + ROUND_00_15(13, d, e, f, g, h, a, b, c); + T1 = X[14] = CRYPTO_load_u64_be(in + 14 * 8); + ROUND_00_15(14, c, d, e, f, g, h, a, b); + T1 = X[15] = CRYPTO_load_u64_be(in + 15 * 8); + ROUND_00_15(15, b, c, d, e, f, g, h, a); + + for (i = 16; i < 80; i += 16) { + ROUND_16_80(i, 0, a, b, c, d, e, f, g, h, X); + ROUND_16_80(i, 1, h, a, b, c, d, e, f, g, X); + ROUND_16_80(i, 2, g, h, a, b, c, d, e, f, X); + ROUND_16_80(i, 3, f, g, h, a, b, c, d, e, X); + ROUND_16_80(i, 4, e, f, g, h, a, b, c, d, X); + ROUND_16_80(i, 5, d, e, f, g, h, a, b, c, X); + ROUND_16_80(i, 6, c, d, e, f, g, h, a, b, X); + ROUND_16_80(i, 7, b, c, d, e, f, g, h, a, X); + ROUND_16_80(i, 8, a, b, c, d, e, f, g, h, X); + ROUND_16_80(i, 9, h, a, b, c, d, e, f, g, X); + ROUND_16_80(i, 10, g, h, a, b, c, d, e, f, X); + ROUND_16_80(i, 11, f, g, h, a, b, c, d, e, X); + ROUND_16_80(i, 12, e, f, g, h, a, b, c, d, X); + ROUND_16_80(i, 13, d, e, f, g, h, a, b, c, X); + ROUND_16_80(i, 14, c, d, e, f, g, h, a, b, X); + ROUND_16_80(i, 15, b, c, d, e, f, g, h, a, X); + } + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + state[5] += f; + state[6] += g; + state[7] += h; + + in += 16 * 8; + } +} + +#undef Sigma0 +#undef Sigma1 +#undef sigma0 +#undef sigma1 +#undef Ch +#undef Maj +#undef ROUND_00_15 +#undef ROUND_16_80 + +void sha512_update(SHA512_CTX *c, const void *in_data, size_t len) { + uint64_t l; + uint8_t *p = c->p; + const uint8_t *data = reinterpret_cast(in_data); + + if (len == 0) { + return; + } + + l = (c->Nl + (((uint64_t)len) << 3)) & UINT64_C(0xffffffffffffffff); + if (l < c->Nl) { + c->Nh++; + } + if (sizeof(len) >= 8) { + c->Nh += (((uint64_t)len) >> 61); + } + c->Nl = l; + + if (c->num != 0) { + size_t n = sizeof(c->p) - c->num; + + if (len < n) { + memcpy(p + c->num, data, len); + c->num += (unsigned int)len; + return; + } else { + memcpy(p + c->num, data, n), c->num = 0; + len -= n; + data += n; + sha512_block_data_order(c->h, p, 1); + } + } + + if (len >= sizeof(c->p)) { + sha512_block_data_order(c->h, data, len / sizeof(c->p)); + data += len; + len %= sizeof(c->p); + data -= len; + } + + if (len != 0) { + memcpy(p, data, len); + c->num = (int)len; + } + + return; +} + +} // namespace +} // namespace bssl::entropy diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/hkdf/hkdf.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/hkdf/hkdf.cc.inc index ee04818d63..bf496b3f93 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/hkdf/hkdf.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/hkdf/hkdf.cc.inc @@ -47,7 +47,8 @@ int HKDF_extract(uint8_t *out_key, size_t *out_len, const EVP_MD *digest, // If salt is not given, HashLength zeros are used. However, HMAC does that // internally already so we can ignore it. unsigned len; - if (HMAC(digest, salt, salt_len, secret, secret_len, out_key, &len) == NULL) { + if (HMAC(digest, salt, salt_len, secret, secret_len, out_key, &len) == + nullptr) { OPENSSL_PUT_ERROR(HKDF, ERR_R_HMAC_LIB); return 0; } @@ -75,7 +76,7 @@ int HKDF_expand(uint8_t *out_key, size_t out_len, const EVP_MD *digest, } HMAC_CTX_init(&hmac); - if (!HMAC_Init_ex(&hmac, prk, prk_len, digest, NULL)) { + if (!HMAC_Init_ex(&hmac, prk, prk_len, digest, nullptr)) { goto out; } @@ -83,13 +84,12 @@ int HKDF_expand(uint8_t *out_key, size_t out_len, const EVP_MD *digest, uint8_t ctr = i + 1; size_t todo; - if (i != 0 && (!HMAC_Init_ex(&hmac, NULL, 0, NULL, NULL) || + if (i != 0 && (!HMAC_Init_ex(&hmac, nullptr, 0, nullptr, nullptr) || !HMAC_Update(&hmac, previous, digest_len))) { goto out; } - if (!HMAC_Update(&hmac, info, info_len) || - !HMAC_Update(&hmac, &ctr, 1) || - !HMAC_Final(&hmac, previous, NULL)) { + if (!HMAC_Update(&hmac, info, info_len) || !HMAC_Update(&hmac, &ctr, 1) || + !HMAC_Final(&hmac, previous, nullptr)) { goto out; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/hmac/hmac.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/hmac/hmac.cc.inc index fb0805d24d..59890b977a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/hmac/hmac.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/hmac/hmac.cc.inc @@ -33,7 +33,7 @@ uint8_t *HMAC(const EVP_MD *evp_md, const void *key, size_t key_len, // The underlying hash functions should not set the FIPS service indicator // until all operations have completed. FIPS_service_indicator_lock_state(); - const int ok = HMAC_Init_ex(&ctx, key, key_len, evp_md, NULL) && + const int ok = HMAC_Init_ex(&ctx, key, key_len, evp_md, nullptr) && HMAC_Update(&ctx, data, data_len) && HMAC_Final(&ctx, out, out_len); FIPS_service_indicator_unlock_state(); @@ -41,7 +41,7 @@ uint8_t *HMAC(const EVP_MD *evp_md, const void *key, size_t key_len, HMAC_CTX_cleanup(&ctx); if (!ok) { - return NULL; + return nullptr; } HMAC_verify_service_indicator(evp_md); @@ -49,7 +49,7 @@ uint8_t *HMAC(const EVP_MD *evp_md, const void *key, size_t key_len, } void HMAC_CTX_init(HMAC_CTX *ctx) { - ctx->md = NULL; + ctx->md = nullptr; EVP_MD_CTX_init(&ctx->i_ctx); EVP_MD_CTX_init(&ctx->o_ctx); EVP_MD_CTX_init(&ctx->md_ctx); @@ -58,7 +58,7 @@ void HMAC_CTX_init(HMAC_CTX *ctx) { HMAC_CTX *HMAC_CTX_new(void) { HMAC_CTX *ctx = reinterpret_cast(OPENSSL_malloc(sizeof(HMAC_CTX))); - if (ctx != NULL) { + if (ctx != nullptr) { HMAC_CTX_init(ctx); } return ctx; @@ -79,7 +79,7 @@ void HMAC_CTX_cleanse(HMAC_CTX *ctx) { } void HMAC_CTX_free(HMAC_CTX *ctx) { - if (ctx == NULL) { + if (ctx == nullptr) { return; } @@ -92,7 +92,7 @@ int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, size_t key_len, int ret = 0; FIPS_service_indicator_lock_state(); - if (md == NULL) { + if (md == nullptr) { md = ctx->md; } @@ -103,7 +103,7 @@ int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, size_t key_len, // ambiguous between using the empty key and reusing the previous key. There // exist callers which intend the latter, but the former is an awkward edge // case. Fix to API to avoid this. - if (md != ctx->md || key != NULL) { + if (md != ctx->md || key != nullptr) { uint8_t pad[EVP_MAX_MD_BLOCK_SIZE]; uint8_t key_block[EVP_MAX_MD_BLOCK_SIZE]; unsigned key_block_len; @@ -168,7 +168,6 @@ int HMAC_Final(HMAC_CTX *ctx, uint8_t *out, unsigned int *out_len) { !EVP_MD_CTX_copy_ex(&ctx->md_ctx, &ctx->o_ctx) || !EVP_DigestUpdate(&ctx->md_ctx, buf, i) || !EVP_DigestFinal_ex(&ctx->md_ctx, out, out_len)) { - *out_len = 0; goto out; } @@ -178,6 +177,8 @@ out: FIPS_service_indicator_unlock_state(); if (ret) { HMAC_verify_service_indicator(ctx->md); + } else if (out_len) { + *out_len = 0; } return ret; } @@ -206,7 +207,7 @@ int HMAC_Init(HMAC_CTX *ctx, const void *key, int key_len, const EVP_MD *md) { if (key && md) { HMAC_CTX_init(ctx); } - return HMAC_Init_ex(ctx, key, key_len, md, NULL); + return HMAC_Init_ex(ctx, key, key_len, md, nullptr); } int HMAC_CTX_copy(HMAC_CTX *dest, const HMAC_CTX *src) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mldsa/fips_known_values.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mldsa/fips_known_values.inc index 948fb5cf2f..dc639bd266 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mldsa/fips_known_values.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mldsa/fips_known_values.inc @@ -1,9 +1,9 @@ -const uint8_t kGenerateKeyEntropy[BCM_MLDSA_SEED_BYTES] = { +const uint8_t kGenerateKeyEntropy[MLDSA_SEED_BYTES] = { 0x47, 0x90, 0x52, 0x10, 0x30, 0x27, 0xbd, 0xf1, 0x7e, 0xb1, 0x22, 0xd7, 0x84, 0xfb, 0x3c, 0xf0, 0x40, 0xd2, 0xf4, 0x97, 0x11, 0x7e, 0x01, 0x38, 0xc4, 0xce, 0x9c, 0xac, 0x94, 0x71, 0xab, 0x39}; -const uint8_t kExpectedPublicKey[BCM_MLDSA65_PUBLIC_KEY_BYTES] = { +const uint8_t kExpectedPublicKey[MLDSA65_PUBLIC_KEY_BYTES] = { 0x0c, 0x6f, 0x38, 0x7d, 0x2a, 0xb4, 0x33, 0x87, 0xf0, 0x21, 0xb0, 0xda, 0x81, 0x6c, 0x71, 0xf0, 0xbc, 0x81, 0x5e, 0xf0, 0xb1, 0x6a, 0xf1, 0x12, 0x4f, 0x35, 0x4c, 0x27, 0x3e, 0xed, 0xb4, 0x2f, 0xe5, 0x4a, 0x01, 0x9a, @@ -506,12 +506,12 @@ const uint8_t kExpectedPrivateKey[BCM_MLDSA65_PRIVATE_KEY_BYTES] = { 0x35, 0x7e, 0x99, 0x89, 0x7f, 0x4f, 0xf7, 0xc2, 0x21, 0xc7, 0x11, 0xbf, 0xf2, 0x20, 0xa3, 0x56, 0x91, 0xab, 0x26, 0xfe, 0x17, 0xf1, 0xa5, 0xf3}; -const uint8_t kSignEntropy[BCM_MLDSA_SEED_BYTES] = { +const uint8_t kSignEntropy[MLDSA_SEED_BYTES] = { 0x7c, 0xf6, 0x8e, 0x63, 0x14, 0x04, 0x0b, 0x08, 0x20, 0x9b, 0x00, 0x8c, 0x31, 0x48, 0xee, 0xd3, 0xe1, 0x6d, 0x5f, 0x71, 0x3b, 0xc7, 0x08, 0x78, 0x05, 0x4b, 0x12, 0x4f, 0xf1, 0xf3, 0x50, 0x07}; -const uint8_t kExpectedCase1Signature[BCM_MLDSA65_SIGNATURE_BYTES] = { +const uint8_t kExpectedCase1Signature[MLDSA65_SIGNATURE_BYTES] = { 0xf8, 0xc7, 0x25, 0x84, 0x8b, 0x39, 0xd9, 0xd9, 0x80, 0xf0, 0x2f, 0xf7, 0xa0, 0x24, 0x19, 0x08, 0x70, 0x65, 0xe2, 0xc8, 0x0a, 0xc4, 0xd3, 0xd5, 0x97, 0x49, 0x31, 0xea, 0x7b, 0xd6, 0x64, 0xb6, 0x6e, 0x6b, 0xf3, 0xc7, @@ -788,7 +788,7 @@ const uint8_t kExpectedCase1Signature[BCM_MLDSA65_SIGNATURE_BYTES] = { 0xc2, 0xf3, 0xf7, 0xfd, 0x41, 0x76, 0x99, 0xec, 0x92, 0xb8, 0xbd, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0f, 0x16, 0x20, 0x24, 0x28}; -const uint8_t kExpectedCase2Signature[BCM_MLDSA65_SIGNATURE_BYTES] = { +const uint8_t kExpectedCase2Signature[MLDSA65_SIGNATURE_BYTES] = { 0xef, 0xbf, 0xd8, 0x29, 0xd3, 0x48, 0xaf, 0x86, 0x0d, 0xe5, 0x31, 0xde, 0xfc, 0xe8, 0x90, 0xc3, 0x1d, 0x9a, 0xda, 0x49, 0xd4, 0xb2, 0xab, 0x5e, 0x19, 0x8e, 0x31, 0x6f, 0x73, 0x3f, 0x7f, 0x77, 0xf8, 0xda, 0x71, 0x90, diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mldsa/mldsa.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mldsa/mldsa.cc.inc index 630d77ec8c..abd9c97ca0 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mldsa/mldsa.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mldsa/mldsa.cc.inc @@ -24,6 +24,7 @@ #include #include "../../internal.h" +#include "../../mem_internal.h" #include "../bcm_interface.h" #include "../keccak/internal.h" @@ -61,22 +62,22 @@ constexpr uint32_t kInverseDegreeMontgomery = 41978; template constexpr size_t public_key_bytes() { if constexpr (K == 6) { - return BCM_MLDSA65_PUBLIC_KEY_BYTES; + return MLDSA65_PUBLIC_KEY_BYTES; } else if constexpr (K == 8) { - return BCM_MLDSA87_PUBLIC_KEY_BYTES; + return MLDSA87_PUBLIC_KEY_BYTES; } else if constexpr (K == 4) { - return BCM_MLDSA44_PUBLIC_KEY_BYTES; + return MLDSA44_PUBLIC_KEY_BYTES; } } template constexpr size_t signature_bytes() { if constexpr (K == 6) { - return BCM_MLDSA65_SIGNATURE_BYTES; + return MLDSA65_SIGNATURE_BYTES; } else if constexpr (K == 8) { - return BCM_MLDSA87_SIGNATURE_BYTES; + return MLDSA87_SIGNATURE_BYTES; } else if constexpr (K == 4) { - return BCM_MLDSA44_SIGNATURE_BYTES; + return MLDSA44_SIGNATURE_BYTES; } } @@ -196,9 +197,9 @@ constexpr int plus_minus_eta_bitlen() { // Fundamental types. -typedef struct scalar { +struct scalar { uint32_t c[kDegree]; -} scalar; +}; template struct vector { @@ -281,36 +282,56 @@ static const uint32_t kNTTRootsMontgomery[256] = { uint32_t reduce_once(uint32_t x) { declassify_assert(x < 2 * kPrime); // return x < kPrime ? x : x - kPrime; - return constant_time_select_int(constant_time_lt_w(x, kPrime), x, x - kPrime); + const uint32_t subtracted = x - kPrime; + uint32_t mask = 0u - (subtracted >> 31); + // Although this is a constant-time select, we omit a value barrier here. + // Value barriers impede auto-vectorization (likely because it forces the + // value to transit through a general-purpose register). This is a difference + // of 1.4x to 1.5x in signing performance. + // + // We usually add value barriers to selects because Clang turns consecutive + // selects with the same condition into a branch instead of CMOV/CSEL. This + // condition does not occur in ML-DSA, so omitting it seems to be generally + // safe. However, see |coefficient_from_nibble|. + return (mask & x) | (~mask & subtracted); } -// Returns the absolute value in constant time. +// Returns the absolute value in constant time, interpreting the high bit as a +// sign bit. uint32_t abs_signed(uint32_t x) { - // return is_positive(x) ? x : -x; - // Note: MSVC doesn't like applying the unary minus operator to unsigned types - // (warning C4146), so we write the negation as a bitwise not plus one - // (assuming two's complement representation). - return constant_time_select_int(constant_time_lt_w(x, 0x80000000), x, 0u - x); + // return is_negative(x) ? -x : x; + uint32_t mask = 0u - (x >> 31); + return constant_time_select_32(mask, 0u - x, x); } // Returns the absolute value modulo kPrime. uint32_t abs_mod_prime(uint32_t x) { declassify_assert(x < kPrime); - // return x > kHalfPrime ? kPrime - x : x; - return constant_time_select_int(constant_time_lt_w(kHalfPrime, x), kPrime - x, - x); + // return x <= kHalfPrime ? x : kPrime - x; + uint32_t mask = x - kHalfPrime - 1; + mask = 0u - (mask >> 31); + return constant_time_select_32(mask, x, kPrime - x); } -// Returns the maximum of two values in constant time. -uint32_t maximum(uint32_t x, uint32_t y) { +// Returns the maximum of two values in constant time. Each value must be less +// than kPrime. +uint32_t maximum_reduced(uint32_t x, uint32_t y) { + declassify_assert(x < kPrime); + declassify_assert(y < kPrime); // return x < y ? y : x; - return constant_time_select_int(constant_time_lt_w(x, y), y, x); + uint32_t mask = x - y; + mask = 0u - (mask >> 31); + return constant_time_select_32(mask, y, x); } uint32_t mod_sub(uint32_t a, uint32_t b) { declassify_assert(a < kPrime); declassify_assert(b < kPrime); - return reduce_once(kPrime + a - b); + uint32_t r = a - b; + // return r < 0 ? r + kPrime : r; + uint32_t mask = 0u - (r >> 31); + // See |reduce_once| for which this does not have a value barrier. + return (mask & (r + kPrime)) | (~mask & r); } void scalar_add(scalar *out, const scalar *lhs, const scalar *rhs) { @@ -472,9 +493,9 @@ void power2_round(uint32_t *r1, uint32_t *r0, uint32_t r) { crypto_word_t mask = constant_time_lt_w((uint32_t)(1 << (kDroppedBits - 1)), *r0); // r0 = mask ? r0_adjusted : r0 - *r0 = constant_time_select_int(mask, r0_adjusted, *r0); + *r0 = constant_time_select_32(mask, r0_adjusted, *r0); // r1 = mask ? r1_adjusted : r1 - *r1 = constant_time_select_int(mask, r1_adjusted, *r1); + *r1 = constant_time_select_32(mask, r1_adjusted, *r1); } // Scale back previously rounded value. @@ -621,14 +642,14 @@ void scalar_low_bits(scalar *out, const scalar *in) { void scalar_max(uint32_t *max, const scalar *s) { for (int i = 0; i < kDegree; i++) { uint32_t abs = abs_mod_prime(s->c[i]); - *max = maximum(*max, abs); + *max = maximum_reduced(*max, abs); } } void scalar_max_signed(uint32_t *max, const scalar *s) { for (int i = 0; i < kDegree; i++) { uint32_t abs = abs_signed(s->c[i]); - *max = maximum(*max, abs); + *max = maximum_reduced(*max, abs); } } @@ -1105,7 +1126,7 @@ int scalar_decode_signed(scalar *out, const uint8_t *in, int bits, // is used for matrix expansion and only operates on public inputs. void scalar_from_keccak_vartime(scalar *out, const uint8_t derived_seed[kRhoBytes + 2]) { - struct BORINGSSL_keccak_st keccak_ctx; + BORINGSSL_keccak_st keccak_ctx; BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake128); BORINGSSL_keccak_absorb(&keccak_ctx, derived_seed, kRhoBytes + 2); assert(keccak_ctx.squeeze_offset == 0); @@ -1133,7 +1154,9 @@ static bool coefficient_from_nibble(uint32_t nibble, uint32_t *result); template <> bool coefficient_from_nibble<4>(uint32_t nibble, uint32_t *result) { if (constant_time_declassify_int(nibble < 9)) { - *result = mod_sub(4, nibble); + // Knowing bounds on |nibble| seems to tempt some versions of Clang to emit + // a branch, if we don't have a barrier in |mod_sub|. + *result = mod_sub(4, value_barrier_u32(nibble)); return true; } return false; @@ -1142,7 +1165,9 @@ bool coefficient_from_nibble<4>(uint32_t nibble, uint32_t *result) { template <> bool coefficient_from_nibble<2>(uint32_t nibble, uint32_t *result) { if (constant_time_declassify_int(nibble < 15)) { - *result = mod_sub(2, nibble % 5); + // Knowing bounds on |nibble| seems to tempt some versions of Clang to emit + // a branch, if we don't have a barrier in |mod_sub|. + *result = mod_sub(2, value_barrier_u32(nibble % 5)); return true; } return false; @@ -1151,7 +1176,7 @@ bool coefficient_from_nibble<2>(uint32_t nibble, uint32_t *result) { // FIPS 204, Algorithm 31 (`RejBoundedPoly`). template void scalar_uniform(scalar *out, const uint8_t derived_seed[kSigmaBytes + 2]) { - struct BORINGSSL_keccak_st keccak_ctx; + BORINGSSL_keccak_st keccak_ctx; BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake256); BORINGSSL_keccak_absorb(&keccak_ctx, derived_seed, kSigmaBytes + 2); assert(keccak_ctx.squeeze_offset == 0); @@ -1166,7 +1191,7 @@ void scalar_uniform(scalar *out, const uint8_t derived_seed[kSigmaBytes + 2]) { uint32_t t1 = block[i] >> 4; // FIPS 204, Algorithm 15 (`CoefFromHalfByte`). Although both the input // and output here are secret, it is OK to leak when we rejected a byte. - // Individual bytes of the SHAKE-256 stream are (indistiguishable from) + // Individual bytes of the SHAKE-256 stream are (indistinguishable from) // independent of each other and the original seed, so leaking information // about the rejected bytes does not reveal the input or output. uint32_t v; @@ -1194,7 +1219,7 @@ void scalar_sample_mask(scalar *out, // FIPS 204, Algorithm 29 (`SampleInBall`). void scalar_sample_in_ball_vartime(scalar *out, const uint8_t *seed, int len, int tau) { - struct BORINGSSL_keccak_st keccak_ctx; + BORINGSSL_keccak_st keccak_ctx; BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake256); BORINGSSL_keccak_absorb(&keccak_ctx, seed, len); assert(keccak_ctx.squeeze_offset == 0); @@ -1411,9 +1436,8 @@ struct public_key { template struct private_key { - uint8_t rho[kRhoBytes]; + public_key pub; uint8_t k[kKBytes]; - uint8_t public_key_hash[kTrBytes]; vector s1; vector s2; vector t0; @@ -1428,7 +1452,7 @@ struct signature { // FIPS 204, Algorithm 22 (`pkEncode`). template -int mldsa_marshal_public_key(CBB *out, const struct public_key *pub) { +int mldsa_marshal_public_key(CBB *out, const public_key *pub) { if (!CBB_add_bytes(out, pub->rho, sizeof(pub->rho))) { return 0; } @@ -1444,7 +1468,7 @@ int mldsa_marshal_public_key(CBB *out, const struct public_key *pub) { // FIPS 204, Algorithm 23 (`pkDecode`). template -int mldsa_parse_public_key(struct public_key *pub, CBS *in) { +int mldsa_parse_public_key(public_key *pub, CBS *in) { const CBS orig_in = *in; if (!CBS_copy_bytes(in, pub->rho, sizeof(pub->rho))) { @@ -1466,11 +1490,11 @@ int mldsa_parse_public_key(struct public_key *pub, CBS *in) { // FIPS 204, Algorithm 24 (`skEncode`). template -int mldsa_marshal_private_key(CBB *out, const struct private_key *priv) { - if (!CBB_add_bytes(out, priv->rho, sizeof(priv->rho)) || +int mldsa_marshal_private_key(CBB *out, const private_key *priv) { + if (!CBB_add_bytes(out, priv->pub.rho, sizeof(priv->pub.rho)) || !CBB_add_bytes(out, priv->k, sizeof(priv->k)) || - !CBB_add_bytes(out, priv->public_key_hash, - sizeof(priv->public_key_hash))) { + !CBB_add_bytes(out, priv->pub.public_key_hash, + sizeof(priv->pub.public_key_hash))) { return 0; } @@ -1499,18 +1523,16 @@ int mldsa_marshal_private_key(CBB *out, const struct private_key *priv) { return 1; } -// FIPS 204, Algorithm 25 (`skDecode`). +// FIPS 204, Algorithm 25 (`skDecode`). This is only used for testing. The +// supported external way to construct ML-DSA keys is to use the input seed. template -int mldsa_parse_private_key(struct private_key *priv, CBS *in) { - CBS s1_bytes; - CBS s2_bytes; - CBS t0_bytes; +int mldsa_parse_private_key(private_key *priv, CBS *in) { + CBS public_key_hash, s1_bytes, s2_bytes, t0_bytes; constexpr size_t scalar_bytes = (kDegree * plus_minus_eta_bitlen() + 7) / 8; - if (!CBS_copy_bytes(in, priv->rho, sizeof(priv->rho)) || + if (!CBS_copy_bytes(in, priv->pub.rho, sizeof(priv->pub.rho)) || !CBS_copy_bytes(in, priv->k, sizeof(priv->k)) || - !CBS_copy_bytes(in, priv->public_key_hash, - sizeof(priv->public_key_hash)) || + !CBS_get_bytes(in, &public_key_hash, kTrBytes) || !CBS_get_bytes(in, &s1_bytes, scalar_bytes * L) || !vector_decode_signed(&priv->s1, CBS_data(&s1_bytes), plus_minus_eta_bitlen(), eta()) || @@ -1523,12 +1545,28 @@ int mldsa_parse_private_key(struct private_key *priv, CBS *in) { return 0; } + // Compute `t1`, which is not in the `skDecode` input. + uint8_t unused[public_key_bytes()]; + if (!mldsa_finish_keygen(unused, priv)) { + return 0; + } + + // As a side effect of computing `t1`, we also compute `t0` and + // `public_key_hash`. Check they match the received bytes. + uint8_t t0_computed[416 * K]; + vector_encode_signed(t0_computed, &priv->t0, 13, 1 << 12); + if (!CBS_mem_equal(&public_key_hash, priv->pub.public_key_hash, + sizeof(priv->pub.public_key_hash)) || + !CBS_mem_equal(&t0_bytes, t0_computed, sizeof(t0_computed))) { + return 0; + } + return 1; } // FIPS 204, Algorithm 26 (`sigEncode`). template -int mldsa_marshal_signature(CBB *out, const struct signature *sign) { +int mldsa_marshal_signature(CBB *out, const signature *sign) { if (!CBB_add_bytes(out, sign->c_tilde, sizeof(sign->c_tilde))) { return 0; } @@ -1551,7 +1589,7 @@ int mldsa_marshal_signature(CBB *out, const struct signature *sign) { // FIPS 204, Algorithm 27 (`sigDecode`). template -int mldsa_parse_signature(struct signature *sign, CBS *in) { +int mldsa_parse_signature(signature *sign, CBS *in) { CBS z_bytes; CBS hint_bytes; if (!CBS_copy_bytes(in, sign->c_tilde, sizeof(sign->c_tilde)) || @@ -1567,37 +1605,69 @@ int mldsa_parse_signature(struct signature *sign, CBS *in) { return 1; } -template -struct DeleterFree { - void operator()(T *ptr) { OPENSSL_free(ptr); } -}; +// FIPS 204, Algorithm 6 (`ML-DSA.KeyGen_internal`), steps 3 and 5–11. +// Returns 1 on success and 0 on failure. +template +int mldsa_finish_keygen(uint8_t out_encoded_public_key[public_key_bytes()], + private_key *priv) { + // Intermediate values, allocated on the heap to allow use when there is a + // limited amount of stack. + struct Values { + enum { kAllowUniquePtr = true }; + matrix a_ntt; + vector s1_ntt; + vector t; + }; + auto values = bssl::MakeUnique(); + if (values == nullptr) { + return 0; + } + + // Step 3. + matrix_expand(&values->a_ntt, priv->pub.rho); + + // Step 5. + OPENSSL_memcpy(&values->s1_ntt, &priv->s1, sizeof(values->s1_ntt)); + vector_ntt(&values->s1_ntt); + + matrix_mult(&values->t, &values->a_ntt, &values->s1_ntt); + vector_inverse_ntt(&values->t); + vector_add(&values->t, &values->t, &priv->s2); + + // Step 6-7. + vector_power2_round(&priv->pub.t1, &priv->t0, &values->t); + // t1 is public. + CONSTTIME_DECLASSIFY(&priv->pub.t1, sizeof(priv->pub.t1)); + + // Step 8. + CBB cbb; + CBB_init_fixed(&cbb, out_encoded_public_key, public_key_bytes()); + if (!mldsa_marshal_public_key(&cbb, &priv->pub)) { + return 0; + } + assert(CBB_len(&cbb) == public_key_bytes()); + + // Step 9-11. + BORINGSSL_keccak(priv->pub.public_key_hash, sizeof(priv->pub.public_key_hash), + out_encoded_public_key, public_key_bytes(), + boringssl_shake256); + + return 1; +} // FIPS 204, Algorithm 6 (`ML-DSA.KeyGen_internal`). Returns 1 on success and 0 // on failure. template int mldsa_generate_key_external_entropy_no_self_test( uint8_t out_encoded_public_key[public_key_bytes()], - struct private_key *priv, - const uint8_t entropy[BCM_MLDSA_SEED_BYTES]) { - // Intermediate values, allocated on the heap to allow use when there is a - // limited amount of stack. - struct values_st { - struct public_key pub; - matrix a_ntt; - vector s1_ntt; - vector t; - }; - std::unique_ptr> values( - reinterpret_cast(OPENSSL_malloc(sizeof(values_st)))); - if (values == NULL) { - return 0; - } - - uint8_t augmented_entropy[BCM_MLDSA_SEED_BYTES + 2]; - OPENSSL_memcpy(augmented_entropy, entropy, BCM_MLDSA_SEED_BYTES); + private_key *priv, + const uint8_t entropy[MLDSA_SEED_BYTES]) { + // Step 1-2. + uint8_t augmented_entropy[MLDSA_SEED_BYTES + 2]; + OPENSSL_memcpy(augmented_entropy, entropy, MLDSA_SEED_BYTES); // The k and l parameters are appended to the seed. - augmented_entropy[BCM_MLDSA_SEED_BYTES] = K; - augmented_entropy[BCM_MLDSA_SEED_BYTES + 1] = L; + augmented_entropy[MLDSA_SEED_BYTES] = K; + augmented_entropy[MLDSA_SEED_BYTES + 1] = L; uint8_t expanded_seed[kRhoBytes + kSigmaBytes + kKBytes]; BORINGSSL_keccak(expanded_seed, sizeof(expanded_seed), augmented_entropy, sizeof(augmented_entropy), boringssl_shake256); @@ -1606,93 +1676,32 @@ int mldsa_generate_key_external_entropy_no_self_test( const uint8_t *const k = expanded_seed + kRhoBytes + kSigmaBytes; // rho is public. CONSTTIME_DECLASSIFY(rho, kRhoBytes); - OPENSSL_memcpy(values->pub.rho, rho, sizeof(values->pub.rho)); - OPENSSL_memcpy(priv->rho, rho, sizeof(priv->rho)); + OPENSSL_memcpy(priv->pub.rho, rho, sizeof(priv->pub.rho)); OPENSSL_memcpy(priv->k, k, sizeof(priv->k)); - - matrix_expand(&values->a_ntt, rho); + // Step 4. This is independent of A (step 3) and can be done first. vector_expand_short(&priv->s1, &priv->s2, sigma); - - OPENSSL_memcpy(&values->s1_ntt, &priv->s1, sizeof(values->s1_ntt)); - vector_ntt(&values->s1_ntt); - - matrix_mult(&values->t, &values->a_ntt, &values->s1_ntt); - vector_inverse_ntt(&values->t); - vector_add(&values->t, &values->t, &priv->s2); - - vector_power2_round(&values->pub.t1, &priv->t0, &values->t); - // t1 is public. - CONSTTIME_DECLASSIFY(&values->pub.t1, sizeof(values->pub.t1)); - - CBB cbb; - CBB_init_fixed(&cbb, out_encoded_public_key, public_key_bytes()); - if (!mldsa_marshal_public_key(&cbb, &values->pub)) { - return 0; - } - assert(CBB_len(&cbb) == public_key_bytes()); - - BORINGSSL_keccak(priv->public_key_hash, sizeof(priv->public_key_hash), - out_encoded_public_key, public_key_bytes(), - boringssl_shake256); - - return 1; + // Steps 3 and 5-11. + return mldsa_finish_keygen(out_encoded_public_key, priv); } template int mldsa_generate_key_external_entropy( uint8_t out_encoded_public_key[public_key_bytes()], - struct private_key *priv, - const uint8_t entropy[BCM_MLDSA_SEED_BYTES]) { + private_key *priv, const uint8_t entropy[MLDSA_SEED_BYTES]) { fips::ensure_keygen_self_test(); return mldsa_generate_key_external_entropy_no_self_test( out_encoded_public_key, priv, entropy); } -template -int mldsa_public_from_private(struct public_key *pub, - const struct private_key *priv) { - // Intermediate values, allocated on the heap to allow use when there is a - // limited amount of stack. - struct values_st { - matrix a_ntt; - vector s1_ntt; - vector t; - vector t0; - }; - std::unique_ptr> values( - reinterpret_cast(OPENSSL_malloc(sizeof(values_st)))); - if (values == NULL) { - return 0; - } - - OPENSSL_memcpy(pub->rho, priv->rho, sizeof(pub->rho)); - OPENSSL_memcpy(pub->public_key_hash, priv->public_key_hash, - sizeof(pub->public_key_hash)); - - matrix_expand(&values->a_ntt, priv->rho); - - OPENSSL_memcpy(&values->s1_ntt, &priv->s1, sizeof(values->s1_ntt)); - vector_ntt(&values->s1_ntt); - - matrix_mult(&values->t, &values->a_ntt, &values->s1_ntt); - vector_inverse_ntt(&values->t); - vector_add(&values->t, &values->t, &priv->s2); - - vector_power2_round(&pub->t1, &values->t0, &values->t); - // t1 is part of the public key and thus is public. - CONSTTIME_DECLASSIFY(&pub->t1, sizeof(pub->t1)); - return 1; -} - // FIPS 204, Algorithm 7 (`ML-DSA.Sign_internal`), using a pre-computed mu. // Returns 1 on success and 0 on failure. template -int mldsa_sign_mu( +int mldsa_sign_mu_no_self_test( uint8_t out_encoded_signature[signature_bytes()], - const struct private_key *priv, const uint8_t mu[kMuBytes], + const private_key *priv, const uint8_t mu[kMuBytes], const uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]) { uint8_t rho_prime[kRhoPrimeBytes]; - struct BORINGSSL_keccak_st keccak_ctx; + BORINGSSL_keccak_st keccak_ctx; BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake256); BORINGSSL_keccak_absorb(&keccak_ctx, priv->k, sizeof(priv->k)); BORINGSSL_keccak_absorb(&keccak_ctx, randomizer, @@ -1702,8 +1711,9 @@ int mldsa_sign_mu( // Intermediate values, allocated on the heap to allow use when there is a // limited amount of stack. - struct values_st { - struct signature sign; + struct Values { + enum { kAllowUniquePtr = true }; + signature sign; vector s1_ntt; vector s2_ntt; vector t0_ntt; @@ -1714,9 +1724,8 @@ int mldsa_sign_mu( vector cs1; vector cs2; }; - std::unique_ptr> values( - reinterpret_cast(OPENSSL_malloc(sizeof(values_st)))); - if (values == NULL) { + auto values = bssl::MakeUnique(); + if (values == nullptr) { return 0; } OPENSSL_memcpy(&values->s1_ntt, &priv->s1, sizeof(values->s1_ntt)); @@ -1728,7 +1737,7 @@ int mldsa_sign_mu( OPENSSL_memcpy(&values->t0_ntt, &priv->t0, sizeof(values->t0_ntt)); vector_ntt(&values->t0_ntt); - matrix_expand(&values->a_ntt, priv->rho); + matrix_expand(&values->a_ntt, priv->pub.rho); // kappa must not exceed 2**16/L = 13107. But the probability of it // exceeding even 1000 iterations is vanishingly small. @@ -1824,26 +1833,39 @@ int mldsa_sign_mu( } } +// FIPS 204, Algorithm 7 (`ML-DSA.Sign_internal`), using a pre-computed mu. +// Returns 1 on success and 0 on failure. +template +int mldsa_sign_mu( + uint8_t out_encoded_signature[signature_bytes()], + const private_key *priv, const uint8_t mu[kMuBytes], + const uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]) { + fips::ensure_sign_self_test(); + return mldsa_sign_mu_no_self_test(out_encoded_signature, priv, mu, + randomizer); +} + // FIPS 204, Algorithm 7 (`ML-DSA.Sign_internal`). Returns 1 on success and 0 // on failure. template int mldsa_sign_internal_no_self_test( uint8_t out_encoded_signature[signature_bytes()], - const struct private_key *priv, const uint8_t *msg, size_t msg_len, + const private_key *priv, const uint8_t *msg, size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len, const uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]) { uint8_t mu[kMuBytes]; - struct BORINGSSL_keccak_st keccak_ctx; + BORINGSSL_keccak_st keccak_ctx; BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake256); - BORINGSSL_keccak_absorb(&keccak_ctx, priv->public_key_hash, - sizeof(priv->public_key_hash)); + BORINGSSL_keccak_absorb(&keccak_ctx, priv->pub.public_key_hash, + sizeof(priv->pub.public_key_hash)); BORINGSSL_keccak_absorb(&keccak_ctx, context_prefix, context_prefix_len); BORINGSSL_keccak_absorb(&keccak_ctx, context, context_len); BORINGSSL_keccak_absorb(&keccak_ctx, msg, msg_len); BORINGSSL_keccak_squeeze(&keccak_ctx, mu, kMuBytes); - return mldsa_sign_mu(out_encoded_signature, priv, mu, randomizer); + return mldsa_sign_mu_no_self_test(out_encoded_signature, priv, mu, + randomizer); } // FIPS 204, Algorithm 7 (`ML-DSA.Sign_internal`). Returns 1 on success and 0 @@ -1851,7 +1873,7 @@ int mldsa_sign_internal_no_self_test( template int mldsa_sign_internal( uint8_t out_encoded_signature[signature_bytes()], - const struct private_key *priv, const uint8_t *msg, size_t msg_len, + const private_key *priv, const uint8_t *msg, size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len, const uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]) { @@ -1862,13 +1884,12 @@ int mldsa_sign_internal( } struct prehash_context { - struct BORINGSSL_keccak_st keccak_ctx; + BORINGSSL_keccak_st keccak_ctx; }; template -void mldsa_prehash_init(struct prehash_context *out_prehash_ctx, - const struct public_key *pub, - const uint8_t *context_prefix, +void mldsa_prehash_init(prehash_context *out_prehash_ctx, + const public_key *pub, const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len) { BORINGSSL_keccak_init(&out_prehash_ctx->keccak_ctx, boringssl_shake256); @@ -1879,36 +1900,36 @@ void mldsa_prehash_init(struct prehash_context *out_prehash_ctx, BORINGSSL_keccak_absorb(&out_prehash_ctx->keccak_ctx, context, context_len); } -void mldsa_prehash_update(struct prehash_context *inout_prehash_ctx, +void mldsa_prehash_update(prehash_context *inout_prehash_ctx, const uint8_t *msg, size_t msg_len) { BORINGSSL_keccak_absorb(&inout_prehash_ctx->keccak_ctx, msg, msg_len); } void mldsa_prehash_finalize(uint8_t out_msg_rep[kMuBytes], - struct prehash_context *inout_prehash_ctx) { + prehash_context *inout_prehash_ctx) { BORINGSSL_keccak_squeeze(&inout_prehash_ctx->keccak_ctx, out_msg_rep, kMuBytes); } -// FIPS 204, Algorithm 8 (`ML-DSA.Verify_internal`). +// FIPS 204, Algorithm 8 (`ML-DSA.Verify_internal`), using a pre-computed mu. +// Returns 1 on success and 0 on failure. template -int mldsa_verify_internal_no_self_test( - const struct public_key *pub, - const uint8_t encoded_signature[signature_bytes()], const uint8_t *msg, - size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, - const uint8_t *context, size_t context_len) { +int mldsa_verify_mu_no_self_test( + const public_key *pub, + const uint8_t encoded_signature[signature_bytes()], + const uint8_t mu[kMuBytes]) { // Intermediate values, allocated on the heap to allow use when there is a // limited amount of stack. - struct values_st { - struct signature sign; + struct Values { + enum { kAllowUniquePtr = true }; + signature sign; matrix a_ntt; vector z_ntt; vector az_ntt; vector ct1_ntt; }; - std::unique_ptr> values( - reinterpret_cast(OPENSSL_malloc(sizeof(values_st)))); - if (values == NULL) { + auto values = bssl::MakeUnique(); + if (values == nullptr) { return 0; } @@ -1920,16 +1941,6 @@ int mldsa_verify_internal_no_self_test( matrix_expand(&values->a_ntt, pub->rho); - uint8_t mu[kMuBytes]; - struct BORINGSSL_keccak_st keccak_ctx; - BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake256); - BORINGSSL_keccak_absorb(&keccak_ctx, pub->public_key_hash, - sizeof(pub->public_key_hash)); - BORINGSSL_keccak_absorb(&keccak_ctx, context_prefix, context_prefix_len); - BORINGSSL_keccak_absorb(&keccak_ctx, context, context_len); - BORINGSSL_keccak_absorb(&keccak_ctx, msg, msg_len); - BORINGSSL_keccak_squeeze(&keccak_ctx, mu, kMuBytes); - scalar c_ntt; scalar_sample_in_ball_vartime(&c_ntt, values->sign.c_tilde, sizeof(values->sign.c_tilde), tau()); @@ -1954,6 +1965,7 @@ int mldsa_verify_internal_no_self_test( w1_encode(w1_encoded, w1); uint8_t c_tilde[2 * lambda_bytes()]; + BORINGSSL_keccak_st keccak_ctx; BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake256); BORINGSSL_keccak_absorb(&keccak_ctx, mu, kMuBytes); BORINGSSL_keccak_absorb(&keccak_ctx, w1_encoded, w1_bytes()); @@ -1964,8 +1976,41 @@ int mldsa_verify_internal_no_self_test( OPENSSL_memcmp(c_tilde, values->sign.c_tilde, 2 * lambda_bytes()) == 0; } + +// FIPS 204, Algorithm 8 (`ML-DSA.Verify_internal`), using a pre-computed mu. +// Returns 1 on success and 0 on failure. template -int mldsa_verify_internal(const struct public_key *pub, +int mldsa_verify_mu( + const public_key *pub, + const uint8_t encoded_signature[signature_bytes()], + const uint8_t mu[kMuBytes]) { + fips::ensure_verify_self_test(); + return mldsa_verify_mu_no_self_test(pub, encoded_signature, mu); +} + +// FIPS 204, Algorithm 8 (`ML-DSA.Verify_internal`). +template +int mldsa_verify_internal_no_self_test( + const public_key *pub, + const uint8_t encoded_signature[signature_bytes()], const uint8_t *msg, + size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, + const uint8_t *context, size_t context_len) { + uint8_t mu[kMuBytes]; + BORINGSSL_keccak_st keccak_ctx; + BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake256); + BORINGSSL_keccak_absorb(&keccak_ctx, pub->public_key_hash, + sizeof(pub->public_key_hash)); + BORINGSSL_keccak_absorb(&keccak_ctx, context_prefix, context_prefix_len); + BORINGSSL_keccak_absorb(&keccak_ctx, context, context_len); + BORINGSSL_keccak_absorb(&keccak_ctx, msg, msg_len); + BORINGSSL_keccak_squeeze(&keccak_ctx, mu, kMuBytes); + + return mldsa_verify_mu_no_self_test(pub, encoded_signature, mu); +} + +// FIPS 204, Algorithm 8 (`ML-DSA.Verify_internal`). +template +int mldsa_verify_internal(const public_key *pub, const uint8_t encoded_signature[signature_bytes()], const uint8_t *msg, size_t msg_len, const uint8_t *context_prefix, @@ -1977,102 +2022,86 @@ int mldsa_verify_internal(const struct public_key *pub, context, context_len); } -struct private_key<6, 5> *private_key_from_external_65( - const struct BCM_mldsa65_private_key *external) { - static_assert(sizeof(struct BCM_mldsa65_private_key) == - sizeof(struct private_key<6, 5>), - "MLDSA65 private key size incorrect"); - static_assert(alignof(struct BCM_mldsa65_private_key) == - alignof(struct private_key<6, 5>), - "MLDSA65 private key alignment incorrect"); - return (struct private_key<6, 5> *)external; +static_assert(sizeof(MLDSA65_private_key) == sizeof(private_key<6, 5>)); +static_assert(alignof(MLDSA65_private_key) == alignof(private_key<6, 5>)); + +const private_key<6, 5> *private_key_from_external_65( + const MLDSA65_private_key *external) { + return reinterpret_cast *>(external); +} +private_key<6, 5> *private_key_from_external_65(MLDSA65_private_key *external) { + return reinterpret_cast *>(external); } -struct public_key<6> *public_key_from_external_65( - const struct BCM_mldsa65_public_key *external) { - static_assert( - sizeof(struct BCM_mldsa65_public_key) == sizeof(struct public_key<6>), - "MLDSA65 public key size incorrect"); - static_assert( - alignof(struct BCM_mldsa65_public_key) == alignof(struct public_key<6>), - "MLDSA65 public key alignment incorrect"); - return (struct public_key<6> *)external; +static_assert(sizeof(MLDSA65_public_key) == sizeof(public_key<6>)); +static_assert(alignof(MLDSA65_public_key) == alignof(public_key<6>)); + +const public_key<6> *public_key_from_external_65( + const MLDSA65_public_key *external) { + return reinterpret_cast *>(external); +} +public_key<6> *public_key_from_external_65(MLDSA65_public_key *external) { + return reinterpret_cast *>(external); } -struct prehash_context *prehash_context_from_external_65( - struct BCM_mldsa65_prehash *external) { - static_assert( - sizeof(struct BCM_mldsa65_prehash) == sizeof(struct prehash_context), - "MLDSA pre-hash context size incorrect"); - static_assert( - alignof(struct BCM_mldsa65_prehash) == alignof(struct prehash_context), - "MLDSA pre-hash context alignment incorrect"); +prehash_context *prehash_context_from_external_65(MLDSA65_prehash *external) { + static_assert(sizeof(MLDSA65_prehash) == sizeof(prehash_context)); + static_assert(alignof(MLDSA65_prehash) == alignof(prehash_context)); return reinterpret_cast(external); } -struct private_key<8, 7> *private_key_from_external_87( - const struct BCM_mldsa87_private_key *external) { - static_assert(sizeof(struct BCM_mldsa87_private_key) == - sizeof(struct private_key<8, 7>), - "MLDSA87 private key size incorrect"); - static_assert(alignof(struct BCM_mldsa87_private_key) == - alignof(struct private_key<8, 7>), - "MLDSA87 private key alignment incorrect"); - return (struct private_key<8, 7> *)external; +static_assert(sizeof(MLDSA87_private_key) == sizeof(private_key<8, 7>)); +static_assert(alignof(MLDSA87_private_key) == alignof(private_key<8, 7>)); +const private_key<8, 7> *private_key_from_external_87( + const MLDSA87_private_key *external) { + return reinterpret_cast *>(external); +} +private_key<8, 7> *private_key_from_external_87(MLDSA87_private_key *external) { + return reinterpret_cast *>(external); } -struct public_key<8> *public_key_from_external_87( - const struct BCM_mldsa87_public_key *external) { - static_assert( - sizeof(struct BCM_mldsa87_public_key) == sizeof(struct public_key<8>), - "MLDSA87 public key size incorrect"); - static_assert( - alignof(struct BCM_mldsa87_public_key) == alignof(struct public_key<8>), - "MLDSA87 public key alignment incorrect"); - return (struct public_key<8> *)external; +static_assert(sizeof(MLDSA87_public_key) == sizeof(public_key<8>)); +static_assert(alignof(MLDSA87_public_key) == alignof(public_key<8>)); + +const public_key<8> *public_key_from_external_87( + const MLDSA87_public_key *external) { + return reinterpret_cast *>(external); +} +public_key<8> *public_key_from_external_87(MLDSA87_public_key *external) { + return reinterpret_cast *>(external); } -struct prehash_context *prehash_context_from_external_87( - struct BCM_mldsa87_prehash *external) { - static_assert( - sizeof(struct BCM_mldsa87_prehash) == sizeof(struct prehash_context), - "MLDSA pre-hash context size incorrect"); - static_assert( - alignof(struct BCM_mldsa87_prehash) == alignof(struct prehash_context), - "MLDSA pre-hash context alignment incorrect"); +prehash_context *prehash_context_from_external_87(MLDSA87_prehash *external) { + static_assert(sizeof(MLDSA87_prehash) == sizeof(prehash_context)); + static_assert(alignof(MLDSA87_prehash) == alignof(prehash_context)); return reinterpret_cast(external); } -struct private_key<4, 4> *private_key_from_external_44( - const struct BCM_mldsa44_private_key *external) { - static_assert(sizeof(struct BCM_mldsa44_private_key) == - sizeof(struct private_key<4, 4>), - "MLDSA44 private key size incorrect"); - static_assert(alignof(struct BCM_mldsa44_private_key) == - alignof(struct private_key<4, 4>), - "MLDSA44 private key alignment incorrect"); - return (struct private_key<4, 4> *)external; +static_assert(sizeof(MLDSA44_private_key) == sizeof(private_key<4, 4>)); +static_assert(alignof(MLDSA44_private_key) == alignof(private_key<4, 4>)); + +const private_key<4, 4> *private_key_from_external_44( + const MLDSA44_private_key *external) { + return reinterpret_cast *>(external); +} +private_key<4, 4> *private_key_from_external_44(MLDSA44_private_key *external) { + return reinterpret_cast *>(external); } -struct public_key<4> *public_key_from_external_44( - const struct BCM_mldsa44_public_key *external) { - static_assert( - sizeof(struct BCM_mldsa44_public_key) == sizeof(struct public_key<4>), - "MLDSA44 public key size incorrect"); - static_assert( - alignof(struct BCM_mldsa44_public_key) == alignof(struct public_key<4>), - "MLDSA44 public key alignment incorrect"); - return (struct public_key<4> *)external; +static_assert(sizeof(MLDSA44_public_key) == sizeof(public_key<4>)); +static_assert(alignof(MLDSA44_public_key) == alignof(public_key<4>)); + +const public_key<4> *public_key_from_external_44( + const MLDSA44_public_key *external) { + return reinterpret_cast *>(external); +} +public_key<4> *public_key_from_external_44(MLDSA44_public_key *external) { + return reinterpret_cast *>(external); } -struct prehash_context *prehash_context_from_external_44( - struct BCM_mldsa44_prehash *external) { - static_assert( - sizeof(struct BCM_mldsa44_prehash) == sizeof(struct prehash_context), - "MLDSA pre-hash context size incorrect"); - static_assert( - alignof(struct BCM_mldsa44_prehash) == alignof(struct prehash_context), - "MLDSA pre-hash context alignment incorrect"); +prehash_context *prehash_context_from_external_44(MLDSA44_prehash *external) { + static_assert(sizeof(MLDSA44_prehash) == sizeof(prehash_context)); + static_assert(alignof(MLDSA44_prehash) == alignof(prehash_context)); return reinterpret_cast(external); } @@ -2081,25 +2110,32 @@ namespace fips { #include "fips_known_values.inc" static int keygen_self_test() { - private_key<6, 5> priv; - uint8_t pub_bytes[BCM_MLDSA65_PUBLIC_KEY_BYTES]; - if (!mldsa_generate_key_external_entropy_no_self_test(pub_bytes, &priv, - kGenerateKeyEntropy)) { + struct Values { + enum { kAllowUniquePtr = true }; + private_key<6, 5> priv; + uint8_t pub_bytes[MLDSA65_PUBLIC_KEY_BYTES]; + uint8_t priv_bytes[BCM_MLDSA65_PRIVATE_KEY_BYTES]; + }; + auto values = bssl::MakeUnique(); + if (values == nullptr || + !mldsa_generate_key_external_entropy_no_self_test( + values->pub_bytes, &values->priv, kGenerateKeyEntropy)) { return 0; } - uint8_t priv_bytes[BCM_MLDSA65_PRIVATE_KEY_BYTES]; CBB cbb; - CBB_init_fixed(&cbb, priv_bytes, sizeof(priv_bytes)); - if (!mldsa_marshal_private_key(&cbb, &priv)) { + CBB_init_fixed(&cbb, values->priv_bytes, sizeof(values->priv_bytes)); + if (!mldsa_marshal_private_key(&cbb, &values->priv)) { return 0; } - static_assert(sizeof(pub_bytes) == sizeof(kExpectedPublicKey)); - static_assert(sizeof(priv_bytes) == sizeof(kExpectedPrivateKey)); - if (!BORINGSSL_check_test(kExpectedPublicKey, pub_bytes, sizeof(pub_bytes), + static_assert(sizeof(values->pub_bytes) == sizeof(kExpectedPublicKey)); + static_assert(sizeof(values->priv_bytes) == sizeof(kExpectedPrivateKey)); + if (!BORINGSSL_check_test(kExpectedPublicKey, values->pub_bytes, + sizeof(values->pub_bytes), "ML-DSA keygen public key") || - !BORINGSSL_check_test(kExpectedPrivateKey, priv_bytes, sizeof(priv_bytes), + !BORINGSSL_check_test(kExpectedPrivateKey, values->priv_bytes, + sizeof(values->priv_bytes), "ML-DSA keygen private key")) { return 0; } @@ -2108,36 +2144,44 @@ static int keygen_self_test() { } static int sign_self_test() { - private_key<6, 5> priv; - uint8_t pub_bytes[BCM_MLDSA65_PUBLIC_KEY_BYTES]; - if (!mldsa_generate_key_external_entropy(pub_bytes, &priv, kSignEntropy)) { + struct Values { + enum { kAllowUniquePtr = true }; + private_key<6, 5> priv; + uint8_t pub_bytes[MLDSA65_PUBLIC_KEY_BYTES]; + uint8_t sig[MLDSA65_SIGNATURE_BYTES]; + }; + auto values = bssl::MakeUnique(); + if (values == nullptr || + !mldsa_generate_key_external_entropy(values->pub_bytes, &values->priv, + kSignEntropy)) { return 0; } const uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES] = {}; - uint8_t sig[BCM_MLDSA65_SIGNATURE_BYTES]; // This message triggers the first restart case for signing. uint8_t message[4] = {0}; - if (!mldsa_sign_internal_no_self_test(sig, &priv, message, sizeof(message), - nullptr, 0, nullptr, 0, randomizer)) { + if (!mldsa_sign_internal_no_self_test(values->sig, &values->priv, message, + sizeof(message), nullptr, 0, nullptr, 0, + randomizer)) { return 0; } - static_assert(sizeof(kExpectedCase1Signature) == sizeof(sig)); - if (!BORINGSSL_check_test(kExpectedCase1Signature, sig, sizeof(sig), - "ML-DSA sign case 1")) { + static_assert(sizeof(kExpectedCase1Signature) == sizeof(values->sig)); + if (!BORINGSSL_check_test(kExpectedCase1Signature, values->sig, + sizeof(values->sig), "ML-DSA sign case 1")) { return 0; } // This message triggers the second restart case for signing. message[0] = 123; - if (!mldsa_sign_internal_no_self_test(sig, &priv, message, sizeof(message), - nullptr, 0, nullptr, 0, randomizer)) { + if (!mldsa_sign_internal_no_self_test(values->sig, &values->priv, message, + sizeof(message), nullptr, 0, nullptr, 0, + randomizer)) { return 0; } - static_assert(sizeof(kExpectedCase2Signature) == sizeof(sig)); - if (!BORINGSSL_check_test(kExpectedCase2Signature, sig, sizeof(sig), - "ML-DSA sign case 2")) { + static_assert(sizeof(kExpectedCase2Signature) == sizeof(values->sig)); + if (!BORINGSSL_check_test(kExpectedCase2Signature, values->sig, + sizeof(values->sig), "ML-DSA sign case 2")) { return 0; } @@ -2145,14 +2189,13 @@ static int sign_self_test() { } static int verify_self_test() { - struct values_st { + struct Values { + enum { kAllowUniquePtr = true }; private_key<6, 5> priv; - public_key<6> pub; - uint8_t pub_bytes[BCM_MLDSA65_PUBLIC_KEY_BYTES]; + uint8_t pub_bytes[MLDSA65_PUBLIC_KEY_BYTES]; }; - std::unique_ptr> values( - reinterpret_cast(OPENSSL_malloc(sizeof(values_st)))); - if (!values) { + auto values = bssl::MakeUnique(); + if (values == nullptr) { return 0; } @@ -2162,9 +2205,8 @@ static int verify_self_test() { } const uint8_t message[4] = {1, 0}; - if (!mldsa_public_from_private(&values->pub, &values->priv) || - !mldsa_verify_internal_no_self_test<6, 5>( - &values->pub, kExpectedVerifySignature, message, sizeof(message), + if (!mldsa_verify_internal_no_self_test<6, 5>( + &values->priv.pub, kExpectedVerifySignature, message, sizeof(message), nullptr, 0, nullptr, 0)) { return 0; } @@ -2173,12 +2215,10 @@ static int verify_self_test() { } template -int check_key(private_key *priv) { +int check_key(const private_key *priv) { uint8_t sig[signature_bytes()]; uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES] = {}; - mldsa::public_key pub; - if (!mldsa_public_from_private(&pub, priv) || - !mldsa_sign_internal_no_self_test(sig, priv, nullptr, 0, nullptr, 0, + if (!mldsa_sign_internal_no_self_test(sig, priv, nullptr, 0, nullptr, 0, nullptr, 0, randomizer)) { return 0; } @@ -2187,8 +2227,8 @@ int check_key(private_key *priv) { sig[0] ^= 1; } - if (!mldsa_verify_internal_no_self_test(&pub, sig, nullptr, 0, nullptr, - 0, nullptr, 0)) { + if (!mldsa_verify_internal_no_self_test(&priv->pub, sig, nullptr, 0, + nullptr, 0, nullptr, 0)) { return 0; } return 1; @@ -2242,28 +2282,27 @@ void ensure_verify_self_test(void) {} // ML-DSA-65 specific wrappers. -bcm_status BCM_mldsa65_parse_public_key( - struct BCM_mldsa65_public_key *public_key, CBS *in) { +bcm_status BCM_mldsa65_parse_public_key(MLDSA65_public_key *public_key, + CBS *in) { return bcm_as_approved_status(mldsa_parse_public_key( mldsa::public_key_from_external_65(public_key), in)); } bcm_status BCM_mldsa65_marshal_private_key( - CBB *out, const struct BCM_mldsa65_private_key *private_key) { + CBB *out, const MLDSA65_private_key *private_key) { return bcm_as_approved_status(mldsa_marshal_private_key( out, mldsa::private_key_from_external_65(private_key))); } -bcm_status BCM_mldsa65_parse_private_key( - struct BCM_mldsa65_private_key *private_key, CBS *in) { +bcm_status BCM_mldsa65_parse_private_key(MLDSA65_private_key *private_key, + CBS *in) { return bcm_as_approved_status( mldsa_parse_private_key(mldsa::private_key_from_external_65(private_key), in) && CBS_len(in) == 0); } -bcm_status BCM_mldsa65_check_key_fips( - struct BCM_mldsa65_private_key *private_key) { +bcm_status BCM_mldsa65_check_key_fips(MLDSA65_private_key *private_key) { return bcm_as_approved_status( mldsa::fips::check_key(mldsa::private_key_from_external_65(private_key))); } @@ -2271,36 +2310,34 @@ bcm_status BCM_mldsa65_check_key_fips( // Calls |MLDSA_generate_key_external_entropy| with random bytes from // |BCM_rand_bytes|. bcm_status BCM_mldsa65_generate_key( - uint8_t out_encoded_public_key[BCM_MLDSA65_PUBLIC_KEY_BYTES], - uint8_t out_seed[BCM_MLDSA_SEED_BYTES], - struct BCM_mldsa65_private_key *out_private_key) { - BCM_rand_bytes(out_seed, BCM_MLDSA_SEED_BYTES); - CONSTTIME_SECRET(out_seed, BCM_MLDSA_SEED_BYTES); + uint8_t out_encoded_public_key[MLDSA65_PUBLIC_KEY_BYTES], + uint8_t out_seed[MLDSA_SEED_BYTES], MLDSA65_private_key *out_private_key) { + BCM_rand_bytes(out_seed, MLDSA_SEED_BYTES); + CONSTTIME_SECRET(out_seed, MLDSA_SEED_BYTES); return BCM_mldsa65_generate_key_external_entropy(out_encoded_public_key, out_private_key, out_seed); } bcm_status BCM_mldsa65_private_key_from_seed( - struct BCM_mldsa65_private_key *out_private_key, - const uint8_t seed[BCM_MLDSA_SEED_BYTES]) { - uint8_t public_key[BCM_MLDSA65_PUBLIC_KEY_BYTES]; + MLDSA65_private_key *out_private_key, + const uint8_t seed[MLDSA_SEED_BYTES]) { + uint8_t public_key[MLDSA65_PUBLIC_KEY_BYTES]; return BCM_mldsa65_generate_key_external_entropy(public_key, out_private_key, seed); } bcm_status BCM_mldsa65_generate_key_external_entropy( - uint8_t out_encoded_public_key[BCM_MLDSA65_PUBLIC_KEY_BYTES], - struct BCM_mldsa65_private_key *out_private_key, - const uint8_t entropy[BCM_MLDSA_SEED_BYTES]) { + uint8_t out_encoded_public_key[MLDSA65_PUBLIC_KEY_BYTES], + MLDSA65_private_key *out_private_key, + const uint8_t entropy[MLDSA_SEED_BYTES]) { return bcm_as_not_approved_status(mldsa_generate_key_external_entropy( out_encoded_public_key, mldsa::private_key_from_external_65(out_private_key), entropy)); } bcm_status BCM_mldsa65_generate_key_fips( - uint8_t out_encoded_public_key[BCM_MLDSA65_PUBLIC_KEY_BYTES], - uint8_t out_seed[BCM_MLDSA_SEED_BYTES], - struct BCM_mldsa65_private_key *out_private_key) { + uint8_t out_encoded_public_key[MLDSA65_PUBLIC_KEY_BYTES], + uint8_t out_seed[MLDSA_SEED_BYTES], MLDSA65_private_key *out_private_key) { if (out_encoded_public_key == nullptr || out_private_key == nullptr) { return bcm_status::failure; } @@ -2312,9 +2349,9 @@ bcm_status BCM_mldsa65_generate_key_fips( } bcm_status BCM_mldsa65_generate_key_external_entropy_fips( - uint8_t out_encoded_public_key[BCM_MLDSA65_PUBLIC_KEY_BYTES], - struct BCM_mldsa65_private_key *out_private_key, - const uint8_t entropy[BCM_MLDSA_SEED_BYTES]) { + uint8_t out_encoded_public_key[MLDSA65_PUBLIC_KEY_BYTES], + MLDSA65_private_key *out_private_key, + const uint8_t entropy[MLDSA_SEED_BYTES]) { if (out_encoded_public_key == nullptr || out_private_key == nullptr) { return bcm_status::failure; } @@ -2327,9 +2364,9 @@ bcm_status BCM_mldsa65_generate_key_external_entropy_fips( } bcm_status BCM_mldsa65_private_key_from_seed_fips( - struct BCM_mldsa65_private_key *out_private_key, - const uint8_t seed[BCM_MLDSA_SEED_BYTES]) { - uint8_t public_key[BCM_MLDSA65_PUBLIC_KEY_BYTES]; + MLDSA65_private_key *out_private_key, + const uint8_t seed[MLDSA_SEED_BYTES]) { + uint8_t public_key[MLDSA65_PUBLIC_KEY_BYTES]; if (BCM_mldsa65_generate_key_external_entropy(public_key, out_private_key, seed) == bcm_status::failure) { return bcm_status::failure; @@ -2338,17 +2375,24 @@ bcm_status BCM_mldsa65_private_key_from_seed_fips( } bcm_status BCM_mldsa65_public_from_private( - struct BCM_mldsa65_public_key *out_public_key, - const struct BCM_mldsa65_private_key *private_key) { - return bcm_as_approved_status(mldsa_public_from_private( - mldsa::public_key_from_external_65(out_public_key), - mldsa::private_key_from_external_65(private_key))); + MLDSA65_public_key *out_public_key, + const MLDSA65_private_key *private_key) { + const auto *priv = mldsa::private_key_from_external_65(private_key); + auto *out_pub = mldsa::public_key_from_external_65(out_public_key); + *out_pub = priv->pub; + return bcm_status::approved; +} + +const MLDSA65_public_key *BCM_mldsa65_public_of_private( + const MLDSA65_private_key *private_key){ + return reinterpret_cast( + &mldsa::private_key_from_external_65(private_key)->pub); } bcm_status BCM_mldsa65_sign_internal( - uint8_t out_encoded_signature[BCM_MLDSA65_SIGNATURE_BYTES], - const struct BCM_mldsa65_private_key *private_key, const uint8_t *msg, - size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, + uint8_t out_encoded_signature[MLDSA65_SIGNATURE_BYTES], + const MLDSA65_private_key *private_key, const uint8_t *msg, size_t msg_len, + const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len, const uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]) { return bcm_as_approved_status(mldsa_sign_internal( @@ -2360,9 +2404,9 @@ bcm_status BCM_mldsa65_sign_internal( // ML-DSA signature in randomized mode, filling the random bytes with // |BCM_rand_bytes|. bcm_status BCM_mldsa65_sign( - uint8_t out_encoded_signature[BCM_MLDSA65_SIGNATURE_BYTES], - const struct BCM_mldsa65_private_key *private_key, const uint8_t *msg, - size_t msg_len, const uint8_t *context, size_t context_len) { + uint8_t out_encoded_signature[MLDSA65_SIGNATURE_BYTES], + const MLDSA65_private_key *private_key, const uint8_t *msg, size_t msg_len, + const uint8_t *context, size_t context_len) { BSSL_CHECK(context_len <= 255); uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]; BCM_rand_bytes(randomizer, sizeof(randomizer)); @@ -2375,8 +2419,8 @@ bcm_status BCM_mldsa65_sign( } // ML-DSA pre-hashed API: initializing a pre-hashing context. -void BCM_mldsa65_prehash_init(struct BCM_mldsa65_prehash *out_prehash_ctx, - const struct BCM_mldsa65_public_key *public_key, +void BCM_mldsa65_prehash_init(MLDSA65_prehash *out_prehash_ctx, + const MLDSA65_public_key *public_key, const uint8_t *context, size_t context_len) { BSSL_CHECK(context_len <= 255); @@ -2388,25 +2432,24 @@ void BCM_mldsa65_prehash_init(struct BCM_mldsa65_prehash *out_prehash_ctx, } // ML-DSA pre-hashed API: updating a pre-hashing context with a message chunk. -void BCM_mldsa65_prehash_update(struct BCM_mldsa65_prehash *inout_prehash_ctx, +void BCM_mldsa65_prehash_update(MLDSA65_prehash *inout_prehash_ctx, const uint8_t *msg, size_t msg_len) { mldsa_prehash_update( mldsa::prehash_context_from_external_65(inout_prehash_ctx), msg, msg_len); } // ML-DSA pre-hashed API: obtaining a message representative to sign. -void BCM_mldsa65_prehash_finalize( - uint8_t out_msg_rep[BCM_MLDSA_MU_BYTES], - struct BCM_mldsa65_prehash *inout_prehash_ctx) { +void BCM_mldsa65_prehash_finalize(uint8_t out_msg_rep[MLDSA_MU_BYTES], + MLDSA65_prehash *inout_prehash_ctx) { mldsa_prehash_finalize( out_msg_rep, mldsa::prehash_context_from_external_65(inout_prehash_ctx)); } // ML-DSA pre-hashed API: signing a message representative. bcm_status BCM_mldsa65_sign_message_representative( - uint8_t out_encoded_signature[BCM_MLDSA65_SIGNATURE_BYTES], - const struct BCM_mldsa65_private_key *private_key, - const uint8_t msg_rep[BCM_MLDSA_MU_BYTES]) { + uint8_t out_encoded_signature[MLDSA65_SIGNATURE_BYTES], + const MLDSA65_private_key *private_key, + const uint8_t msg_rep[MLDSA_MU_BYTES]) { uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]; BCM_rand_bytes(randomizer, sizeof(randomizer)); CONSTTIME_SECRET(randomizer, sizeof(randomizer)); @@ -2416,11 +2459,20 @@ bcm_status BCM_mldsa65_sign_message_representative( msg_rep, randomizer)); } +// ML-DSA pre-hashed API: verifying a message representative. +bcm_status BCM_mldsa65_verify_message_representative( + const MLDSA65_public_key *public_key, + const uint8_t signature[MLDSA65_SIGNATURE_BYTES], + const uint8_t msg_rep[MLDSA_MU_BYTES]) { + return bcm_as_approved_status(mldsa::mldsa_verify_mu<6, 5>( + mldsa::public_key_from_external_65(public_key), signature, msg_rep)); +} + // FIPS 204, Algorithm 3 (`ML-DSA.Verify`). -bcm_status BCM_mldsa65_verify( - const struct BCM_mldsa65_public_key *public_key, - const uint8_t signature[BCM_MLDSA65_SIGNATURE_BYTES], const uint8_t *msg, - size_t msg_len, const uint8_t *context, size_t context_len) { +bcm_status BCM_mldsa65_verify(const MLDSA65_public_key *public_key, + const uint8_t signature[MLDSA65_SIGNATURE_BYTES], + const uint8_t *msg, size_t msg_len, + const uint8_t *context, size_t context_len) { BSSL_CHECK(context_len <= 255); const uint8_t context_prefix[2] = {0, static_cast(context_len)}; return BCM_mldsa65_verify_internal(public_key, signature, msg, msg_len, @@ -2429,8 +2481,8 @@ bcm_status BCM_mldsa65_verify( } bcm_status BCM_mldsa65_verify_internal( - const struct BCM_mldsa65_public_key *public_key, - const uint8_t encoded_signature[BCM_MLDSA65_SIGNATURE_BYTES], + const MLDSA65_public_key *public_key, + const uint8_t encoded_signature[MLDSA65_SIGNATURE_BYTES], const uint8_t *msg, size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len) { return bcm_as_approved_status(mldsa::mldsa_verify_internal<6, 5>( @@ -2439,36 +2491,47 @@ bcm_status BCM_mldsa65_verify_internal( } bcm_status BCM_mldsa65_marshal_public_key( - CBB *out, const struct BCM_mldsa65_public_key *public_key) { + CBB *out, const MLDSA65_public_key *public_key) { return bcm_as_approved_status(mldsa_marshal_public_key( out, mldsa::public_key_from_external_65(public_key))); } +int BCM_mldsa65_public_keys_equal(const MLDSA65_public_key *a, + const MLDSA65_public_key *b) { + auto *a_pub = mldsa::public_key_from_external_65(a); + auto *b_pub = mldsa::public_key_from_external_65(b); + // It is sufficient to compare |public_key_hash|. When importing a public key, + // the hash must be computed. When importing a private key in expanded form + // (an internal testing-only API), the hash is provided, but we recompute it + // and check for correctness. + return OPENSSL_memcmp(a_pub->public_key_hash, b_pub->public_key_hash, + sizeof(a_pub->public_key_hash)) == 0; +} + // ML-DSA-87 specific wrappers. -bcm_status BCM_mldsa87_parse_public_key( - struct BCM_mldsa87_public_key *public_key, CBS *in) { +bcm_status BCM_mldsa87_parse_public_key(MLDSA87_public_key *public_key, + CBS *in) { return bcm_as_approved_status(mldsa_parse_public_key( mldsa::public_key_from_external_87(public_key), in)); } bcm_status BCM_mldsa87_marshal_private_key( - CBB *out, const struct BCM_mldsa87_private_key *private_key) { + CBB *out, const MLDSA87_private_key *private_key) { return bcm_as_approved_status(mldsa_marshal_private_key( out, mldsa::private_key_from_external_87(private_key))); } -bcm_status BCM_mldsa87_parse_private_key( - struct BCM_mldsa87_private_key *private_key, CBS *in) { +bcm_status BCM_mldsa87_parse_private_key(MLDSA87_private_key *private_key, + CBS *in) { return bcm_as_approved_status( mldsa_parse_private_key(mldsa::private_key_from_external_87(private_key), in) && CBS_len(in) == 0); } -bcm_status BCM_mldsa87_check_key_fips( - struct BCM_mldsa87_private_key *private_key) { +bcm_status BCM_mldsa87_check_key_fips(MLDSA87_private_key *private_key) { return bcm_as_approved_status( mldsa::fips::check_key(mldsa::private_key_from_external_87(private_key))); } @@ -2476,35 +2539,33 @@ bcm_status BCM_mldsa87_check_key_fips( // Calls |MLDSA_generate_key_external_entropy| with random bytes from // |BCM_rand_bytes|. bcm_status BCM_mldsa87_generate_key( - uint8_t out_encoded_public_key[BCM_MLDSA87_PUBLIC_KEY_BYTES], - uint8_t out_seed[BCM_MLDSA_SEED_BYTES], - struct BCM_mldsa87_private_key *out_private_key) { - BCM_rand_bytes(out_seed, BCM_MLDSA_SEED_BYTES); + uint8_t out_encoded_public_key[MLDSA87_PUBLIC_KEY_BYTES], + uint8_t out_seed[MLDSA_SEED_BYTES], MLDSA87_private_key *out_private_key) { + BCM_rand_bytes(out_seed, MLDSA_SEED_BYTES); return BCM_mldsa87_generate_key_external_entropy(out_encoded_public_key, out_private_key, out_seed); } bcm_status BCM_mldsa87_private_key_from_seed( - struct BCM_mldsa87_private_key *out_private_key, - const uint8_t seed[BCM_MLDSA_SEED_BYTES]) { - uint8_t public_key[BCM_MLDSA87_PUBLIC_KEY_BYTES]; + MLDSA87_private_key *out_private_key, + const uint8_t seed[MLDSA_SEED_BYTES]) { + uint8_t public_key[MLDSA87_PUBLIC_KEY_BYTES]; return BCM_mldsa87_generate_key_external_entropy(public_key, out_private_key, seed); } bcm_status BCM_mldsa87_generate_key_external_entropy( - uint8_t out_encoded_public_key[BCM_MLDSA87_PUBLIC_KEY_BYTES], - struct BCM_mldsa87_private_key *out_private_key, - const uint8_t entropy[BCM_MLDSA_SEED_BYTES]) { + uint8_t out_encoded_public_key[MLDSA87_PUBLIC_KEY_BYTES], + MLDSA87_private_key *out_private_key, + const uint8_t entropy[MLDSA_SEED_BYTES]) { return bcm_as_not_approved_status(mldsa_generate_key_external_entropy( out_encoded_public_key, mldsa::private_key_from_external_87(out_private_key), entropy)); } bcm_status BCM_mldsa87_generate_key_fips( - uint8_t out_encoded_public_key[BCM_MLDSA87_PUBLIC_KEY_BYTES], - uint8_t out_seed[BCM_MLDSA_SEED_BYTES], - struct BCM_mldsa87_private_key *out_private_key) { + uint8_t out_encoded_public_key[MLDSA87_PUBLIC_KEY_BYTES], + uint8_t out_seed[MLDSA_SEED_BYTES], MLDSA87_private_key *out_private_key) { if (out_encoded_public_key == nullptr || out_private_key == nullptr) { return bcm_status::failure; } @@ -2516,9 +2577,9 @@ bcm_status BCM_mldsa87_generate_key_fips( } bcm_status BCM_mldsa87_generate_key_external_entropy_fips( - uint8_t out_encoded_public_key[BCM_MLDSA87_PUBLIC_KEY_BYTES], - struct BCM_mldsa87_private_key *out_private_key, - const uint8_t entropy[BCM_MLDSA_SEED_BYTES]) { + uint8_t out_encoded_public_key[MLDSA87_PUBLIC_KEY_BYTES], + MLDSA87_private_key *out_private_key, + const uint8_t entropy[MLDSA_SEED_BYTES]) { if (out_encoded_public_key == nullptr || out_private_key == nullptr) { return bcm_status::failure; } @@ -2531,9 +2592,9 @@ bcm_status BCM_mldsa87_generate_key_external_entropy_fips( } bcm_status BCM_mldsa87_private_key_from_seed_fips( - struct BCM_mldsa87_private_key *out_private_key, - const uint8_t seed[BCM_MLDSA_SEED_BYTES]) { - uint8_t public_key[BCM_MLDSA87_PUBLIC_KEY_BYTES]; + MLDSA87_private_key *out_private_key, + const uint8_t seed[MLDSA_SEED_BYTES]) { + uint8_t public_key[MLDSA87_PUBLIC_KEY_BYTES]; if (BCM_mldsa87_generate_key_external_entropy(public_key, out_private_key, seed) == bcm_status::failure) { return bcm_status::failure; @@ -2542,17 +2603,24 @@ bcm_status BCM_mldsa87_private_key_from_seed_fips( } bcm_status BCM_mldsa87_public_from_private( - struct BCM_mldsa87_public_key *out_public_key, - const struct BCM_mldsa87_private_key *private_key) { - return bcm_as_approved_status(mldsa_public_from_private( - mldsa::public_key_from_external_87(out_public_key), - mldsa::private_key_from_external_87(private_key))); + MLDSA87_public_key *out_public_key, + const MLDSA87_private_key *private_key) { + const auto *priv = mldsa::private_key_from_external_87(private_key); + auto *out_pub = mldsa::public_key_from_external_87(out_public_key); + *out_pub = priv->pub; + return bcm_status::approved; +} + +const MLDSA87_public_key *BCM_mldsa87_public_of_private( + const MLDSA87_private_key *private_key){ + return reinterpret_cast( + &mldsa::private_key_from_external_87(private_key)->pub); } bcm_status BCM_mldsa87_sign_internal( - uint8_t out_encoded_signature[BCM_MLDSA87_SIGNATURE_BYTES], - const struct BCM_mldsa87_private_key *private_key, const uint8_t *msg, - size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, + uint8_t out_encoded_signature[MLDSA87_SIGNATURE_BYTES], + const MLDSA87_private_key *private_key, const uint8_t *msg, size_t msg_len, + const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len, const uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]) { return bcm_as_approved_status(mldsa_sign_internal( @@ -2564,9 +2632,9 @@ bcm_status BCM_mldsa87_sign_internal( // ML-DSA signature in randomized mode, filling the random bytes with // |BCM_rand_bytes|. bcm_status BCM_mldsa87_sign( - uint8_t out_encoded_signature[BCM_MLDSA87_SIGNATURE_BYTES], - const struct BCM_mldsa87_private_key *private_key, const uint8_t *msg, - size_t msg_len, const uint8_t *context, size_t context_len) { + uint8_t out_encoded_signature[MLDSA87_SIGNATURE_BYTES], + const MLDSA87_private_key *private_key, const uint8_t *msg, size_t msg_len, + const uint8_t *context, size_t context_len) { BSSL_CHECK(context_len <= 255); uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]; BCM_rand_bytes(randomizer, sizeof(randomizer)); @@ -2578,8 +2646,8 @@ bcm_status BCM_mldsa87_sign( } // ML-DSA pre-hashed API: initializing a pre-hashing context. -void BCM_mldsa87_prehash_init(struct BCM_mldsa87_prehash *out_prehash_ctx, - const struct BCM_mldsa87_public_key *public_key, +void BCM_mldsa87_prehash_init(MLDSA87_prehash *out_prehash_ctx, + const MLDSA87_public_key *public_key, const uint8_t *context, size_t context_len) { BSSL_CHECK(context_len <= 255); @@ -2591,25 +2659,24 @@ void BCM_mldsa87_prehash_init(struct BCM_mldsa87_prehash *out_prehash_ctx, } // ML-DSA pre-hashed API: updating a pre-hashing context with a message chunk. -void BCM_mldsa87_prehash_update(struct BCM_mldsa87_prehash *inout_prehash_ctx, +void BCM_mldsa87_prehash_update(MLDSA87_prehash *inout_prehash_ctx, const uint8_t *msg, size_t msg_len) { mldsa_prehash_update( mldsa::prehash_context_from_external_87(inout_prehash_ctx), msg, msg_len); } // ML-DSA pre-hashed API: obtaining a message representative to sign. -void BCM_mldsa87_prehash_finalize( - uint8_t out_msg_rep[BCM_MLDSA_MU_BYTES], - struct BCM_mldsa87_prehash *inout_prehash_ctx) { +void BCM_mldsa87_prehash_finalize(uint8_t out_msg_rep[MLDSA_MU_BYTES], + MLDSA87_prehash *inout_prehash_ctx) { mldsa_prehash_finalize( out_msg_rep, mldsa::prehash_context_from_external_87(inout_prehash_ctx)); } // ML-DSA pre-hashed API: signing a message representative. bcm_status BCM_mldsa87_sign_message_representative( - uint8_t out_encoded_signature[BCM_MLDSA87_SIGNATURE_BYTES], - const struct BCM_mldsa87_private_key *private_key, - const uint8_t msg_rep[BCM_MLDSA_MU_BYTES]) { + uint8_t out_encoded_signature[MLDSA87_SIGNATURE_BYTES], + const MLDSA87_private_key *private_key, + const uint8_t msg_rep[MLDSA_MU_BYTES]) { uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]; BCM_rand_bytes(randomizer, sizeof(randomizer)); CONSTTIME_SECRET(randomizer, sizeof(randomizer)); @@ -2619,8 +2686,17 @@ bcm_status BCM_mldsa87_sign_message_representative( msg_rep, randomizer)); } +// ML-DSA pre-hashed API: verifying a message representative. +bcm_status BCM_mldsa87_verify_message_representative( + const MLDSA87_public_key *public_key, + const uint8_t signature[MLDSA87_SIGNATURE_BYTES], + const uint8_t msg_rep[MLDSA_MU_BYTES]) { + return bcm_as_approved_status(mldsa::mldsa_verify_mu<8, 7>( + mldsa::public_key_from_external_87(public_key), signature, msg_rep)); +} + // FIPS 204, Algorithm 3 (`ML-DSA.Verify`). -bcm_status BCM_mldsa87_verify(const struct BCM_mldsa87_public_key *public_key, +bcm_status BCM_mldsa87_verify(const MLDSA87_public_key *public_key, const uint8_t *signature, const uint8_t *msg, size_t msg_len, const uint8_t *context, size_t context_len) { @@ -2632,8 +2708,8 @@ bcm_status BCM_mldsa87_verify(const struct BCM_mldsa87_public_key *public_key, } bcm_status BCM_mldsa87_verify_internal( - const struct BCM_mldsa87_public_key *public_key, - const uint8_t encoded_signature[BCM_MLDSA87_SIGNATURE_BYTES], + const MLDSA87_public_key *public_key, + const uint8_t encoded_signature[MLDSA87_SIGNATURE_BYTES], const uint8_t *msg, size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len) { return bcm_as_approved_status(mldsa::mldsa_verify_internal<8, 7>( @@ -2642,36 +2718,47 @@ bcm_status BCM_mldsa87_verify_internal( } bcm_status BCM_mldsa87_marshal_public_key( - CBB *out, const struct BCM_mldsa87_public_key *public_key) { + CBB *out, const MLDSA87_public_key *public_key) { return bcm_as_approved_status(mldsa_marshal_public_key( out, mldsa::public_key_from_external_87(public_key))); } +int BCM_mldsa87_public_keys_equal(const MLDSA87_public_key *a, + const MLDSA87_public_key *b) { + auto *a_pub = mldsa::public_key_from_external_87(a); + auto *b_pub = mldsa::public_key_from_external_87(b); + // It is sufficient to compare |public_key_hash|. When importing a public key, + // the hash must be computed. When importing a private key in expanded form + // (an internal testing-only API), the hash is provided, but we recompute it + // and check for correctness. + return OPENSSL_memcmp(a_pub->public_key_hash, b_pub->public_key_hash, + sizeof(a_pub->public_key_hash)) == 0; +} + // ML-DSA-44 specific wrappers. -bcm_status BCM_mldsa44_parse_public_key( - struct BCM_mldsa44_public_key *public_key, CBS *in) { +bcm_status BCM_mldsa44_parse_public_key(MLDSA44_public_key *public_key, + CBS *in) { return bcm_as_approved_status(mldsa_parse_public_key( mldsa::public_key_from_external_44(public_key), in)); } bcm_status BCM_mldsa44_marshal_private_key( - CBB *out, const struct BCM_mldsa44_private_key *private_key) { + CBB *out, const MLDSA44_private_key *private_key) { return bcm_as_approved_status(mldsa_marshal_private_key( out, mldsa::private_key_from_external_44(private_key))); } -bcm_status BCM_mldsa44_parse_private_key( - struct BCM_mldsa44_private_key *private_key, CBS *in) { +bcm_status BCM_mldsa44_parse_private_key(MLDSA44_private_key *private_key, + CBS *in) { return bcm_as_approved_status( mldsa_parse_private_key(mldsa::private_key_from_external_44(private_key), in) && CBS_len(in) == 0); } -bcm_status BCM_mldsa44_check_key_fips( - struct BCM_mldsa44_private_key *private_key) { +bcm_status BCM_mldsa44_check_key_fips(MLDSA44_private_key *private_key) { return bcm_as_approved_status( mldsa::fips::check_key(mldsa::private_key_from_external_44(private_key))); } @@ -2679,35 +2766,33 @@ bcm_status BCM_mldsa44_check_key_fips( // Calls |MLDSA_generate_key_external_entropy| with random bytes from // |BCM_rand_bytes|. bcm_status BCM_mldsa44_generate_key( - uint8_t out_encoded_public_key[BCM_MLDSA44_PUBLIC_KEY_BYTES], - uint8_t out_seed[BCM_MLDSA_SEED_BYTES], - struct BCM_mldsa44_private_key *out_private_key) { - BCM_rand_bytes(out_seed, BCM_MLDSA_SEED_BYTES); + uint8_t out_encoded_public_key[MLDSA44_PUBLIC_KEY_BYTES], + uint8_t out_seed[MLDSA_SEED_BYTES], MLDSA44_private_key *out_private_key) { + BCM_rand_bytes(out_seed, MLDSA_SEED_BYTES); return BCM_mldsa44_generate_key_external_entropy(out_encoded_public_key, out_private_key, out_seed); } bcm_status BCM_mldsa44_private_key_from_seed( - struct BCM_mldsa44_private_key *out_private_key, - const uint8_t seed[BCM_MLDSA_SEED_BYTES]) { - uint8_t public_key[BCM_MLDSA44_PUBLIC_KEY_BYTES]; + MLDSA44_private_key *out_private_key, + const uint8_t seed[MLDSA_SEED_BYTES]) { + uint8_t public_key[MLDSA44_PUBLIC_KEY_BYTES]; return BCM_mldsa44_generate_key_external_entropy(public_key, out_private_key, seed); } bcm_status BCM_mldsa44_generate_key_external_entropy( - uint8_t out_encoded_public_key[BCM_MLDSA44_PUBLIC_KEY_BYTES], - struct BCM_mldsa44_private_key *out_private_key, - const uint8_t entropy[BCM_MLDSA_SEED_BYTES]) { + uint8_t out_encoded_public_key[MLDSA44_PUBLIC_KEY_BYTES], + MLDSA44_private_key *out_private_key, + const uint8_t entropy[MLDSA_SEED_BYTES]) { return bcm_as_not_approved_status(mldsa_generate_key_external_entropy( out_encoded_public_key, mldsa::private_key_from_external_44(out_private_key), entropy)); } bcm_status BCM_mldsa44_generate_key_fips( - uint8_t out_encoded_public_key[BCM_MLDSA44_PUBLIC_KEY_BYTES], - uint8_t out_seed[BCM_MLDSA_SEED_BYTES], - struct BCM_mldsa44_private_key *out_private_key) { + uint8_t out_encoded_public_key[MLDSA44_PUBLIC_KEY_BYTES], + uint8_t out_seed[MLDSA_SEED_BYTES], MLDSA44_private_key *out_private_key) { if (out_encoded_public_key == nullptr || out_private_key == nullptr) { return bcm_status::failure; } @@ -2719,9 +2804,9 @@ bcm_status BCM_mldsa44_generate_key_fips( } bcm_status BCM_mldsa44_generate_key_external_entropy_fips( - uint8_t out_encoded_public_key[BCM_MLDSA44_PUBLIC_KEY_BYTES], - struct BCM_mldsa44_private_key *out_private_key, - const uint8_t entropy[BCM_MLDSA_SEED_BYTES]) { + uint8_t out_encoded_public_key[MLDSA44_PUBLIC_KEY_BYTES], + MLDSA44_private_key *out_private_key, + const uint8_t entropy[MLDSA_SEED_BYTES]) { if (out_encoded_public_key == nullptr || out_private_key == nullptr) { return bcm_status::failure; } @@ -2734,9 +2819,9 @@ bcm_status BCM_mldsa44_generate_key_external_entropy_fips( } bcm_status BCM_mldsa44_private_key_from_seed_fips( - struct BCM_mldsa44_private_key *out_private_key, - const uint8_t seed[BCM_MLDSA_SEED_BYTES]) { - uint8_t public_key[BCM_MLDSA44_PUBLIC_KEY_BYTES]; + MLDSA44_private_key *out_private_key, + const uint8_t seed[MLDSA_SEED_BYTES]) { + uint8_t public_key[MLDSA44_PUBLIC_KEY_BYTES]; if (BCM_mldsa44_generate_key_external_entropy(public_key, out_private_key, seed) == bcm_status::failure) { return bcm_status::failure; @@ -2745,17 +2830,24 @@ bcm_status BCM_mldsa44_private_key_from_seed_fips( } bcm_status BCM_mldsa44_public_from_private( - struct BCM_mldsa44_public_key *out_public_key, - const struct BCM_mldsa44_private_key *private_key) { - return bcm_as_approved_status(mldsa_public_from_private( - mldsa::public_key_from_external_44(out_public_key), - mldsa::private_key_from_external_44(private_key))); + MLDSA44_public_key *out_public_key, + const MLDSA44_private_key *private_key) { + const auto *priv = mldsa::private_key_from_external_44(private_key); + auto *out_pub = mldsa::public_key_from_external_44(out_public_key); + *out_pub = priv->pub; + return bcm_status::approved; +} + +const MLDSA44_public_key *BCM_mldsa44_public_of_private( + const MLDSA44_private_key *private_key){ + return reinterpret_cast( + &mldsa::private_key_from_external_44(private_key)->pub); } bcm_status BCM_mldsa44_sign_internal( - uint8_t out_encoded_signature[BCM_MLDSA44_SIGNATURE_BYTES], - const struct BCM_mldsa44_private_key *private_key, const uint8_t *msg, - size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, + uint8_t out_encoded_signature[MLDSA44_SIGNATURE_BYTES], + const MLDSA44_private_key *private_key, const uint8_t *msg, size_t msg_len, + const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len, const uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]) { return bcm_as_approved_status(mldsa_sign_internal( @@ -2767,9 +2859,9 @@ bcm_status BCM_mldsa44_sign_internal( // ML-DSA signature in randomized mode, filling the random bytes with // |BCM_rand_bytes|. bcm_status BCM_mldsa44_sign( - uint8_t out_encoded_signature[BCM_MLDSA44_SIGNATURE_BYTES], - const struct BCM_mldsa44_private_key *private_key, const uint8_t *msg, - size_t msg_len, const uint8_t *context, size_t context_len) { + uint8_t out_encoded_signature[MLDSA44_SIGNATURE_BYTES], + const MLDSA44_private_key *private_key, const uint8_t *msg, size_t msg_len, + const uint8_t *context, size_t context_len) { BSSL_CHECK(context_len <= 255); uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]; BCM_rand_bytes(randomizer, sizeof(randomizer)); @@ -2781,8 +2873,8 @@ bcm_status BCM_mldsa44_sign( } // ML-DSA pre-hashed API: initializing a pre-hashing context. -void BCM_mldsa44_prehash_init(struct BCM_mldsa44_prehash *out_prehash_ctx, - const struct BCM_mldsa44_public_key *public_key, +void BCM_mldsa44_prehash_init(MLDSA44_prehash *out_prehash_ctx, + const MLDSA44_public_key *public_key, const uint8_t *context, size_t context_len) { BSSL_CHECK(context_len <= 255); @@ -2794,25 +2886,24 @@ void BCM_mldsa44_prehash_init(struct BCM_mldsa44_prehash *out_prehash_ctx, } // ML-DSA pre-hashed API: updating a pre-hashing context with a message chunk. -void BCM_mldsa44_prehash_update(struct BCM_mldsa44_prehash *inout_prehash_ctx, +void BCM_mldsa44_prehash_update(MLDSA44_prehash *inout_prehash_ctx, const uint8_t *msg, size_t msg_len) { mldsa_prehash_update( mldsa::prehash_context_from_external_44(inout_prehash_ctx), msg, msg_len); } // ML-DSA pre-hashed API: obtaining a message representative to sign. -void BCM_mldsa44_prehash_finalize( - uint8_t out_msg_rep[BCM_MLDSA_MU_BYTES], - struct BCM_mldsa44_prehash *inout_prehash_ctx) { +void BCM_mldsa44_prehash_finalize(uint8_t out_msg_rep[MLDSA_MU_BYTES], + MLDSA44_prehash *inout_prehash_ctx) { mldsa_prehash_finalize( out_msg_rep, mldsa::prehash_context_from_external_44(inout_prehash_ctx)); } // ML-DSA pre-hashed API: signing a message representative. bcm_status BCM_mldsa44_sign_message_representative( - uint8_t out_encoded_signature[BCM_MLDSA44_SIGNATURE_BYTES], - const struct BCM_mldsa44_private_key *private_key, - const uint8_t msg_rep[BCM_MLDSA_MU_BYTES]) { + uint8_t out_encoded_signature[MLDSA44_SIGNATURE_BYTES], + const MLDSA44_private_key *private_key, + const uint8_t msg_rep[MLDSA_MU_BYTES]) { uint8_t randomizer[BCM_MLDSA_SIGNATURE_RANDOMIZER_BYTES]; BCM_rand_bytes(randomizer, sizeof(randomizer)); CONSTTIME_SECRET(randomizer, sizeof(randomizer)); @@ -2822,8 +2913,17 @@ bcm_status BCM_mldsa44_sign_message_representative( msg_rep, randomizer)); } +// ML-DSA pre-hashed API: verifying a message representative. +bcm_status BCM_mldsa44_verify_message_representative( + const MLDSA44_public_key *public_key, + const uint8_t signature[MLDSA44_SIGNATURE_BYTES], + const uint8_t msg_rep[MLDSA_MU_BYTES]) { + return bcm_as_approved_status(mldsa::mldsa_verify_mu<4, 4>( + mldsa::public_key_from_external_44(public_key), signature, msg_rep)); +} + // FIPS 204, Algorithm 3 (`ML-DSA.Verify`). -bcm_status BCM_mldsa44_verify(const struct BCM_mldsa44_public_key *public_key, +bcm_status BCM_mldsa44_verify(const MLDSA44_public_key *public_key, const uint8_t *signature, const uint8_t *msg, size_t msg_len, const uint8_t *context, size_t context_len) { @@ -2835,8 +2935,8 @@ bcm_status BCM_mldsa44_verify(const struct BCM_mldsa44_public_key *public_key, } bcm_status BCM_mldsa44_verify_internal( - const struct BCM_mldsa44_public_key *public_key, - const uint8_t encoded_signature[BCM_MLDSA44_SIGNATURE_BYTES], + const MLDSA44_public_key *public_key, + const uint8_t encoded_signature[MLDSA44_SIGNATURE_BYTES], const uint8_t *msg, size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len, const uint8_t *context, size_t context_len) { return bcm_as_approved_status(mldsa::mldsa_verify_internal<4, 4>( @@ -2845,11 +2945,23 @@ bcm_status BCM_mldsa44_verify_internal( } bcm_status BCM_mldsa44_marshal_public_key( - CBB *out, const struct BCM_mldsa44_public_key *public_key) { + CBB *out, const MLDSA44_public_key *public_key) { return bcm_as_approved_status(mldsa_marshal_public_key( out, mldsa::public_key_from_external_44(public_key))); } +int BCM_mldsa44_public_keys_equal(const MLDSA44_public_key *a, + const MLDSA44_public_key *b) { + auto *a_pub = mldsa::public_key_from_external_44(a); + auto *b_pub = mldsa::public_key_from_external_44(b); + // It is sufficient to compare |public_key_hash|. When importing a public key, + // the hash must be computed. When importing a private key in expanded form + // (an internal testing-only API), the hash is provided, but we recompute it + // and check for correctness. + return OPENSSL_memcmp(a_pub->public_key_hash, b_pub->public_key_hash, + sizeof(a_pub->public_key_hash)) == 0; +} + int boringssl_self_test_mldsa() { return mldsa::fips::keygen_self_test() && mldsa::fips::sign_self_test() && mldsa::fips::verify_self_test(); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mlkem/fips_known_values.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mlkem/fips_known_values.inc index 81c1b8e33b..ac5aca6b1f 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mlkem/fips_known_values.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mlkem/fips_known_values.inc @@ -1,9 +1,9 @@ -const uint8_t kTestEntropy[BCM_MLKEM_SEED_BYTES] = { +const uint8_t kTestEntropy[MLKEM_SEED_BYTES] = { 0xc8, 0x77, 0x34, 0x04, 0xb3, 0xe5, 0x3e, 0x31, 0x7b, 0xab, 0x41, 0x08, 0xa8, 0x88, 0x9c, 0x90, 0xbe, 0xfb, 0x38, 0x0f, 0x63, 0x89, 0x70, 0xbc, 0xdc, 0x33, 0xeb, 0x2d, 0xe2, 0x99, 0x6b, 0x1a}; -const uint8_t kExpectedPublicKeyBytes[BCM_MLKEM768_PUBLIC_KEY_BYTES] = { +const uint8_t kExpectedPublicKeyBytes[MLKEM768_PUBLIC_KEY_BYTES] = { 0xcb, 0x0b, 0x33, 0xa2, 0xac, 0xc4, 0x94, 0x56, 0x1a, 0x36, 0x1c, 0x0d, 0xa3, 0x57, 0x5b, 0x63, 0x6c, 0x0d, 0x1f, 0xe1, 0xa8, 0x36, 0xd5, 0x5d, 0x38, 0x5c, 0xac, 0xf4, 0x67, 0x39, 0x9a, 0x12, 0x5b, 0xef, 0xa1, 0x0a, @@ -306,7 +306,7 @@ const uint8_t kExpectedPrivateKeyBytes[2400] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; -const uint8_t kExpectedCiphertext[BCM_MLKEM768_CIPHERTEXT_BYTES] = { +const uint8_t kExpectedCiphertext[MLKEM768_CIPHERTEXT_BYTES] = { 0x8c, 0xfa, 0xd2, 0x09, 0x06, 0x1b, 0xff, 0x23, 0x9f, 0x84, 0x61, 0xfd, 0x69, 0x7a, 0xa6, 0x2c, 0x57, 0x43, 0x64, 0x6b, 0x6b, 0x6b, 0xa3, 0xe1, 0xa9, 0x4f, 0x3e, 0x29, 0xff, 0x3d, 0xb1, 0x84, 0x51, 0x1d, 0x48, 0xe3, @@ -399,13 +399,13 @@ const uint8_t kExpectedCiphertext[BCM_MLKEM768_CIPHERTEXT_BYTES] = { 0xf2, 0x60, 0x8a, 0xb6, 0x1c, 0x14, 0xb6, 0x25, 0xf2, 0x44, 0x59, 0xb7, 0x67, 0x3b, 0x94, 0x88, 0x15, 0x70, 0x6f, 0xa8}; -const uint8_t kExpectedSharedSecret[BCM_MLKEM_SHARED_SECRET_BYTES] = { +const uint8_t kExpectedSharedSecret[MLKEM_SHARED_SECRET_BYTES] = { 0x7d, 0x9f, 0x1c, 0xb4, 0xae, 0x04, 0xd7, 0x5f, 0xa6, 0x57, 0x5a, 0xe0, 0xe4, 0x29, 0xb5, 0x73, 0xa9, 0x74, 0xb7, 0xa1, 0x25, 0xbd, 0xfb, 0x8a, 0x6e, 0x0f, 0x19, 0xba, 0xe1, 0x16, 0xae, 0x81}; const uint8_t - kExpectedImplicitRejectionSharedSecret[BCM_MLKEM_SHARED_SECRET_BYTES] = { + kExpectedImplicitRejectionSharedSecret[MLKEM_SHARED_SECRET_BYTES] = { 0xa3, 0x19, 0x2a, 0x8c, 0x88, 0xfc, 0x99, 0x6d, 0x2d, 0xf9, 0x85, 0x8d, 0x2c, 0x55, 0x36, 0x39, 0x93, 0xf0, 0x49, 0x4d, 0x7e, 0xc0, 0xbe, 0x5a, 0x56, 0x7b, 0x8a, 0x42, 0x43, 0xa5, 0x74, 0x5d}; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mlkem/mlkem.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mlkem/mlkem.cc.inc index 07aa29daa0..136a58d986 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mlkem/mlkem.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/mlkem/mlkem.cc.inc @@ -26,7 +26,6 @@ #include "../../internal.h" #include "../bcm_interface.h" -#include "../delocate.h" #include "../keccak/internal.h" @@ -56,14 +55,14 @@ void hash_g(uint8_t out[64], const uint8_t *in, size_t len) { } // This is called `J` in the spec. -void kdf(uint8_t out[BCM_MLKEM_SHARED_SECRET_BYTES], +void kdf(uint8_t out[MLKEM_SHARED_SECRET_BYTES], const uint8_t failure_secret[32], const uint8_t *ciphertext, size_t ciphertext_len) { - struct BORINGSSL_keccak_st st; + BORINGSSL_keccak_st st; BORINGSSL_keccak_init(&st, boringssl_shake256); BORINGSSL_keccak_absorb(&st, failure_secret, 32); BORINGSSL_keccak_absorb(&st, ciphertext, ciphertext_len); - BORINGSSL_keccak_squeeze(&st, out, BCM_MLKEM_SHARED_SECRET_BYTES); + BORINGSSL_keccak_squeeze(&st, out, MLKEM_SHARED_SECRET_BYTES); } // Constants that are common across all sizes. @@ -93,10 +92,8 @@ constexpr size_t encoded_public_key_size(int rank) { return encoded_vector_size(rank) + /*sizeof(rho)=*/32; } -static_assert(encoded_public_key_size(RANK768) == - BCM_MLKEM768_PUBLIC_KEY_BYTES); -static_assert(encoded_public_key_size(RANK1024) == - BCM_MLKEM1024_PUBLIC_KEY_BYTES); +static_assert(encoded_public_key_size(RANK768) == MLKEM768_PUBLIC_KEY_BYTES); +static_assert(encoded_public_key_size(RANK1024) == MLKEM1024_PUBLIC_KEY_BYTES); constexpr size_t compressed_vector_size(int rank) { // `if constexpr` isn't available in C++17. @@ -109,13 +106,13 @@ constexpr size_t ciphertext_size(int rank) { (rank == RANK768 ? kDV768 : kDV1024) * DEGREE / 8; } -static_assert(ciphertext_size(RANK768) == BCM_MLKEM768_CIPHERTEXT_BYTES); -static_assert(ciphertext_size(RANK1024) == BCM_MLKEM1024_CIPHERTEXT_BYTES); +static_assert(ciphertext_size(RANK768) == MLKEM768_CIPHERTEXT_BYTES); +static_assert(ciphertext_size(RANK1024) == MLKEM1024_CIPHERTEXT_BYTES); -typedef struct scalar { +struct scalar { // On every function entry and exit, 0 <= c < kPrime. uint16_t c[DEGREE]; -} scalar; +}; template struct vector { @@ -304,7 +301,7 @@ void scalar_sub(scalar *lhs, const scalar *rhs) { // the 2*ith and (2*i+1)th entries of the scalar as elements of GF(3329)[X]/(X^2 // - 17^(2*bitreverse(i)+1)) The value of 17^(2*bitreverse(i)+1) mod 3329 is // stored in the precomputed |kModRoots| table. Note that our Barrett transform -// only allows us to multipy two reduced numbers together, so we need some +// only allows us to multiply two reduced numbers together, so we need some // intermediate reduction steps, even if an uint64_t could hold 3 multiplied // numbers. void scalar_mult(scalar *out, const scalar *lhs, const scalar *rhs) { @@ -367,7 +364,7 @@ void scalar_inner_product(scalar *out, const vector *lhs, // uniformly distributed elements. This is used for matrix expansion and only // operates on public inputs. static void scalar_from_keccak_vartime(scalar *out, - struct BORINGSSL_keccak_st *keccak_ctx) { + BORINGSSL_keccak_st *keccak_ctx) { assert(keccak_ctx->squeeze_offset == 0); assert(keccak_ctx->rate_bytes == 168); static_assert(168 % 3 == 0, "block and coefficient boundaries do not align"); @@ -445,7 +442,7 @@ void matrix_expand(matrix *out, const uint8_t rho[32]) { for (int j = 0; j < RANK; j++) { input[32] = i; input[33] = j; - struct BORINGSSL_keccak_st keccak_ctx; + BORINGSSL_keccak_st keccak_ctx; BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake128); BORINGSSL_keccak_absorb(&keccak_ctx, input, sizeof(input)); scalar_from_keccak_vartime(&out->v[i][j], &keccak_ctx); @@ -654,15 +651,14 @@ struct public_key { template struct private_key { - struct public_key pub; + public_key pub; vector s; uint8_t fo_failure_secret[32]; }; template -static void decrypt_cpa( - uint8_t out[32], const struct private_key *priv, - const uint8_t ciphertext[BCM_MLKEM768_CIPHERTEXT_BYTES]) { +static void decrypt_cpa(uint8_t out[32], const private_key *priv, + const uint8_t ciphertext[MLKEM768_CIPHERTEXT_BYTES]) { constexpr int du = RANK == RANK768 ? kDU768 : kDU1024; constexpr int dv = RANK == RANK768 ? kDV768 : kDV1024; @@ -683,7 +679,7 @@ static void decrypt_cpa( template static bcm_status mlkem_marshal_public_key(CBB *out, - const struct public_key *pub) { + const public_key *pub) { uint8_t *vector_output; if (!CBB_add_space(out, &vector_output, encoded_vector_size(RANK))) { return bcm_status::failure; @@ -698,7 +694,7 @@ static bcm_status mlkem_marshal_public_key(CBB *out, template void mlkem_generate_key_external_seed_no_self_test( uint8_t *out_encoded_public_key, private_key *priv, - const uint8_t seed[BCM_MLKEM_SEED_BYTES]) { + const uint8_t seed[MLKEM_SEED_BYTES]) { uint8_t augmented_seed[33]; OPENSSL_memcpy(augmented_seed, seed, 32); augmented_seed[32] = RANK; @@ -734,9 +730,9 @@ void mlkem_generate_key_external_seed_no_self_test( } template -void mlkem_generate_key_external_seed( - uint8_t *out_encoded_public_key, private_key *priv, - const uint8_t seed[BCM_MLKEM_SEED_BYTES]) { +void mlkem_generate_key_external_seed(uint8_t *out_encoded_public_key, + private_key *priv, + const uint8_t seed[MLKEM_SEED_BYTES]) { fips::ensure_keygen_self_test(); mlkem_generate_key_external_seed_no_self_test(out_encoded_public_key, priv, seed); @@ -747,7 +743,7 @@ void mlkem_generate_key_external_seed( // would not result in a CCA secure scheme, since lattice schemes are vulnerable // to decryption failure oracles. template -void encrypt_cpa(uint8_t *out, const struct mlkem::public_key *pub, +void encrypt_cpa(uint8_t *out, const mlkem::public_key *pub, const uint8_t message[32], const uint8_t randomness[32]) { constexpr int du = RANK == RANK768 ? mlkem::kDU768 : mlkem::kDU1024; constexpr int dv = RANK == RANK768 ? mlkem::kDV768 : mlkem::kDV1024; @@ -784,8 +780,8 @@ void encrypt_cpa(uint8_t *out, const struct mlkem::public_key *pub, // See section 6.3 template void mlkem_decap_no_self_test( - uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], - const uint8_t *ciphertext, const struct private_key *priv) { + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const uint8_t *ciphertext, const private_key *priv) { uint8_t decrypted[64]; decrypt_cpa(decrypted, priv, ciphertext); OPENSSL_memcpy(decrypted + 32, priv->pub.public_key_hash, @@ -793,7 +789,7 @@ void mlkem_decap_no_self_test( uint8_t key_and_randomness[64]; hash_g(key_and_randomness, decrypted, sizeof(decrypted)); constexpr size_t ciphertext_len = ciphertext_size(RANK); - uint8_t expected_ciphertext[BCM_MLKEM1024_CIPHERTEXT_BYTES]; + uint8_t expected_ciphertext[MLKEM1024_CIPHERTEXT_BYTES]; static_assert(ciphertext_len <= sizeof(expected_ciphertext)); encrypt_cpa(expected_ciphertext, &priv->pub, decrypted, key_and_randomness + 32); @@ -803,16 +799,15 @@ void mlkem_decap_no_self_test( uint8_t mask = constant_time_eq_int_8( CRYPTO_memcmp(ciphertext, expected_ciphertext, ciphertext_len), 0); - for (int i = 0; i < BCM_MLKEM_SHARED_SECRET_BYTES; i++) { + for (int i = 0; i < MLKEM_SHARED_SECRET_BYTES; i++) { out_shared_secret[i] = constant_time_select_8(mask, key_and_randomness[i], failure_key[i]); } } template -void mlkem_decap(uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], - const uint8_t *ciphertext, - const struct private_key *priv) { +void mlkem_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const uint8_t *ciphertext, const private_key *priv) { fips::ensure_decap_self_test(); mlkem_decap_no_self_test(out_shared_secret, ciphertext, priv); } @@ -820,7 +815,7 @@ void mlkem_decap(uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], // mlkem_parse_public_key_no_hash parses |in| into |pub| but doesn't calculate // the value of |pub->public_key_hash|. template -int mlkem_parse_public_key_no_hash(struct public_key *pub, CBS *in) { +int mlkem_parse_public_key_no_hash(public_key *pub, CBS *in) { CBS t_bytes; if (!CBS_get_bytes(in, &t_bytes, encoded_vector_size(RANK)) || !vector_decode(&pub->t, CBS_data(&t_bytes), kLog2Prime) || @@ -832,7 +827,7 @@ int mlkem_parse_public_key_no_hash(struct public_key *pub, CBS *in) { } template -int mlkem_parse_public_key(struct public_key *pub, CBS *in) { +int mlkem_parse_public_key(public_key *pub, CBS *in) { CBS orig_in = *in; if (!mlkem_parse_public_key_no_hash(pub, in) || // CBS_len(in) != 0) { @@ -843,7 +838,7 @@ int mlkem_parse_public_key(struct public_key *pub, CBS *in) { } template -int mlkem_parse_private_key(struct private_key *priv, CBS *in) { +int mlkem_parse_private_key(private_key *priv, CBS *in) { CBS s_bytes; if (!CBS_get_bytes(in, &s_bytes, encoded_vector_size(RANK)) || !vector_decode(&priv->s, CBS_data(&s_bytes), kLog2Prime) || @@ -859,7 +854,7 @@ int mlkem_parse_private_key(struct private_key *priv, CBS *in) { } template -int mlkem_marshal_private_key(CBB *out, const struct private_key *priv) { +int mlkem_marshal_private_key(CBB *out, const private_key *priv) { uint8_t *s_output; if (!CBB_add_space(out, &s_output, encoded_vector_size(RANK))) { return 0; @@ -875,56 +870,60 @@ int mlkem_marshal_private_key(CBB *out, const struct private_key *priv) { return 1; } -struct public_key *public_key_768_from_external( - const struct BCM_mlkem768_public_key *external) { - static_assert(sizeof(struct BCM_mlkem768_public_key) >= - sizeof(struct public_key), - "MLKEM public key is too small"); - static_assert(alignof(struct BCM_mlkem768_public_key) >= - alignof(struct public_key), - "MLKEM public key alignment incorrect"); - return (struct public_key *)external; +static_assert(sizeof(MLKEM768_public_key) >= sizeof(public_key)); +static_assert(alignof(MLKEM768_public_key) >= alignof(public_key)); + +const public_key *public_key_768_from_external( + const MLKEM768_public_key *external) { + return reinterpret_cast *>(external); +} +public_key *public_key_768_from_external( + MLKEM768_public_key *external) { + return reinterpret_cast *>(external); } -static struct public_key *public_key_1024_from_external( - const struct BCM_mlkem1024_public_key *external) { - static_assert(sizeof(struct BCM_mlkem1024_public_key) >= - sizeof(struct public_key), - "MLKEM1024 public key is too small"); - static_assert(alignof(struct BCM_mlkem1024_public_key) >= - alignof(struct public_key), - "MLKEM1024 public key alignment incorrect"); - return (struct public_key *)external; +static_assert(sizeof(MLKEM1024_public_key) >= sizeof(public_key)); +static_assert(alignof(MLKEM1024_public_key) >= alignof(public_key)); + +const public_key *public_key_1024_from_external( + const MLKEM1024_public_key *external) { + return reinterpret_cast *>(external); +} +public_key *public_key_1024_from_external( + MLKEM1024_public_key *external) { + return reinterpret_cast *>(external); } -struct private_key *private_key_768_from_external( - const struct BCM_mlkem768_private_key *external) { - static_assert(sizeof(struct BCM_mlkem768_private_key) >= - sizeof(struct private_key), - "MLKEM private key too small"); - static_assert(alignof(struct BCM_mlkem768_private_key) >= - alignof(struct private_key), - "MLKEM private key alignment incorrect"); - return (struct private_key *)external; +static_assert(sizeof(MLKEM768_private_key) >= sizeof(private_key)); +static_assert(alignof(MLKEM768_private_key) >= alignof(private_key)); + +const private_key *private_key_768_from_external( + const MLKEM768_private_key *external) { + return reinterpret_cast *>(external); +} +private_key *private_key_768_from_external( + MLKEM768_private_key *external) { + return reinterpret_cast *>(external); } -struct private_key *private_key_1024_from_external( - const struct BCM_mlkem1024_private_key *external) { - static_assert(sizeof(struct BCM_mlkem1024_private_key) >= - sizeof(struct private_key), - "MLKEM1024 private key too small"); - static_assert(alignof(struct BCM_mlkem1024_private_key) >= - alignof(struct private_key), - "MLKEM1024 private key alignment incorrect"); - return (struct private_key *)external; +static_assert(sizeof(MLKEM1024_private_key) >= sizeof(private_key)); +static_assert(alignof(MLKEM1024_private_key) >= alignof(private_key)); + +const private_key *private_key_1024_from_external( + const MLKEM1024_private_key *external) { + return reinterpret_cast *>(external); +} +private_key *private_key_1024_from_external( + MLKEM1024_private_key *external) { + return reinterpret_cast *>(external); } // See section 6.2. template void mlkem_encap_external_entropy_no_self_test( uint8_t *out_ciphertext, - uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], - const struct mlkem::public_key *pub, + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const mlkem::public_key *pub, const uint8_t entropy[BCM_MLKEM_ENCAP_ENTROPY]) { uint8_t input[64]; OPENSSL_memcpy(input, entropy, BCM_MLKEM_ENCAP_ENTROPY); @@ -935,15 +934,15 @@ void mlkem_encap_external_entropy_no_self_test( encrypt_cpa(out_ciphertext, pub, entropy, key_and_randomness + 32); // The ciphertext is public. CONSTTIME_DECLASSIFY(out_ciphertext, mlkem::ciphertext_size(RANK)); - static_assert(BCM_MLKEM_SHARED_SECRET_BYTES == 32); + static_assert(MLKEM_SHARED_SECRET_BYTES == 32); memcpy(out_shared_secret, key_and_randomness, 32); } template void mlkem_encap_external_entropy( uint8_t *out_ciphertext, - uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], - const struct mlkem::public_key *pub, + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const mlkem::public_key *pub, const uint8_t entropy[BCM_MLKEM_ENCAP_ENTROPY]) { fips::ensure_encap_self_test(); mlkem_encap_external_entropy_no_self_test(out_ciphertext, out_shared_secret, @@ -955,9 +954,9 @@ namespace fips { #include "fips_known_values.inc" static int keygen_self_test() { - uint8_t pub_key[BCM_MLKEM768_PUBLIC_KEY_BYTES]; + uint8_t pub_key[MLKEM768_PUBLIC_KEY_BYTES]; private_key priv; - static_assert(sizeof(kTestEntropy) >= BCM_MLKEM_SEED_BYTES); + static_assert(sizeof(kTestEntropy) >= MLKEM_SEED_BYTES); mlkem_generate_key_external_seed_no_self_test(pub_key, &priv, kTestEntropy); CBB cbb; constexpr size_t kMarshaledPrivateKeySize = 2400; @@ -982,8 +981,8 @@ static int encap_self_test() { if (!mlkem_parse_public_key(&pub, &cbs)) { return 0; } - uint8_t ciphertext[BCM_MLKEM768_CIPHERTEXT_BYTES]; - uint8_t shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES]; + uint8_t ciphertext[MLKEM768_CIPHERTEXT_BYTES]; + uint8_t shared_secret[MLKEM_SHARED_SECRET_BYTES]; static_assert(sizeof(kTestEntropy) >= BCM_MLKEM_ENCAP_ENTROPY); mlkem_encap_external_entropy_no_self_test(ciphertext, shared_secret, &pub, kTestEntropy); @@ -1004,7 +1003,7 @@ static int decap_self_test() { if (!mlkem_parse_private_key(&priv, &cbs)) { return 0; } - uint8_t shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES]; + uint8_t shared_secret[MLKEM_SHARED_SECRET_BYTES]; mlkem_decap_no_self_test(shared_secret, kExpectedCiphertext, &priv); static_assert(sizeof(kExpectedSharedSecret) == sizeof(shared_secret)); if (!BORINGSSL_check_test(kExpectedSharedSecret, shared_secret, @@ -1013,7 +1012,7 @@ static int decap_self_test() { return 0; } - uint8_t implicit_rejection_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES]; + uint8_t implicit_rejection_shared_secret[MLKEM_SHARED_SECRET_BYTES]; static_assert(sizeof(kExpectedPrivateKeyBytes) >= sizeof(kExpectedCiphertext)); mlkem_decap_no_self_test(implicit_rejection_shared_secret, @@ -1073,14 +1072,13 @@ void ensure_decap_self_test(void) {} } // namespace } // namespace mlkem -bcm_status BCM_mlkem768_check_fips( - const struct BCM_mlkem768_private_key *private_key) { - mlkem::private_key *priv = +bcm_status BCM_mlkem768_check_fips(const MLKEM768_private_key *private_key) { + const mlkem::private_key *priv = mlkem::private_key_768_from_external(private_key); const uint8_t entropy[BCM_MLKEM_ENCAP_ENTROPY] = {1, 2, 3, 4}; - uint8_t ciphertext[BCM_MLKEM768_CIPHERTEXT_BYTES]; - uint8_t shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES]; + uint8_t ciphertext[MLKEM768_CIPHERTEXT_BYTES]; + uint8_t shared_secret[MLKEM_SHARED_SECRET_BYTES]; mlkem_encap_external_entropy_no_self_test(ciphertext, shared_secret, &priv->pub, entropy); @@ -1088,7 +1086,7 @@ bcm_status BCM_mlkem768_check_fips( shared_secret[0] ^= 1; } - uint8_t shared_secret2[BCM_MLKEM_SHARED_SECRET_BYTES]; + uint8_t shared_secret2[MLKEM_SHARED_SECRET_BYTES]; mlkem::mlkem_decap_no_self_test(shared_secret2, ciphertext, priv); if (CRYPTO_memcmp(shared_secret, shared_secret2, sizeof(shared_secret)) != 0) { @@ -1098,9 +1096,9 @@ bcm_status BCM_mlkem768_check_fips( } bcm_status BCM_mlkem768_generate_key_fips( - uint8_t out_encoded_public_key[BCM_MLKEM768_PUBLIC_KEY_BYTES], - uint8_t optional_out_seed[BCM_MLKEM_SEED_BYTES], - struct BCM_mlkem768_private_key *out_private_key) { + uint8_t out_encoded_public_key[MLKEM768_PUBLIC_KEY_BYTES], + uint8_t optional_out_seed[MLKEM_SEED_BYTES], + MLKEM768_private_key *out_private_key) { if (out_encoded_public_key == nullptr || out_private_key == nullptr) { return bcm_status::failure; } @@ -1110,10 +1108,10 @@ bcm_status BCM_mlkem768_generate_key_fips( } bcm_infallible BCM_mlkem768_generate_key( - uint8_t out_encoded_public_key[BCM_MLKEM768_PUBLIC_KEY_BYTES], - uint8_t optional_out_seed[BCM_MLKEM_SEED_BYTES], - struct BCM_mlkem768_private_key *out_private_key) { - uint8_t seed[BCM_MLKEM_SEED_BYTES]; + uint8_t out_encoded_public_key[MLKEM768_PUBLIC_KEY_BYTES], + uint8_t optional_out_seed[MLKEM_SEED_BYTES], + MLKEM768_private_key *out_private_key) { + uint8_t seed[MLKEM_SEED_BYTES]; BCM_rand_bytes(seed, sizeof(seed)); CONSTTIME_SECRET(seed, sizeof(seed)); if (optional_out_seed) { @@ -1125,26 +1123,25 @@ bcm_infallible BCM_mlkem768_generate_key( } bcm_status BCM_mlkem768_private_key_from_seed( - struct BCM_mlkem768_private_key *out_private_key, const uint8_t *seed, + MLKEM768_private_key *out_private_key, const uint8_t *seed, size_t seed_len) { - if (seed_len != BCM_MLKEM_SEED_BYTES) { + if (seed_len != MLKEM_SEED_BYTES) { return bcm_status::failure; } - uint8_t public_key_bytes[BCM_MLKEM768_PUBLIC_KEY_BYTES]; + uint8_t public_key_bytes[MLKEM768_PUBLIC_KEY_BYTES]; BCM_mlkem768_generate_key_external_seed(public_key_bytes, out_private_key, seed); return bcm_status::not_approved; } -bcm_status BCM_mlkem1024_check_fips( - const struct BCM_mlkem1024_private_key *private_key) { - mlkem::private_key *priv = +bcm_status BCM_mlkem1024_check_fips(const MLKEM1024_private_key *private_key) { + const mlkem::private_key *priv = mlkem::private_key_1024_from_external(private_key); const uint8_t entropy[BCM_MLKEM_ENCAP_ENTROPY] = {1, 2, 3, 4}; - uint8_t ciphertext[BCM_MLKEM1024_CIPHERTEXT_BYTES]; - uint8_t shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES]; + uint8_t ciphertext[MLKEM1024_CIPHERTEXT_BYTES]; + uint8_t shared_secret[MLKEM_SHARED_SECRET_BYTES]; mlkem_encap_external_entropy_no_self_test(ciphertext, shared_secret, &priv->pub, entropy); @@ -1152,7 +1149,7 @@ bcm_status BCM_mlkem1024_check_fips( shared_secret[0] ^= 1; } - uint8_t shared_secret2[BCM_MLKEM_SHARED_SECRET_BYTES]; + uint8_t shared_secret2[MLKEM_SHARED_SECRET_BYTES]; mlkem::mlkem_decap_no_self_test(shared_secret2, ciphertext, priv); if (CRYPTO_memcmp(shared_secret, shared_secret2, sizeof(shared_secret)) != 0) { @@ -1162,9 +1159,9 @@ bcm_status BCM_mlkem1024_check_fips( } bcm_status BCM_mlkem1024_generate_key_fips( - uint8_t out_encoded_public_key[BCM_MLKEM1024_PUBLIC_KEY_BYTES], - uint8_t optional_out_seed[BCM_MLKEM_SEED_BYTES], - struct BCM_mlkem1024_private_key *out_private_key) { + uint8_t out_encoded_public_key[MLKEM1024_PUBLIC_KEY_BYTES], + uint8_t optional_out_seed[MLKEM_SEED_BYTES], + MLKEM1024_private_key *out_private_key) { if (out_encoded_public_key == nullptr || out_private_key == nullptr) { return bcm_status::failure; } @@ -1174,10 +1171,10 @@ bcm_status BCM_mlkem1024_generate_key_fips( } bcm_infallible BCM_mlkem1024_generate_key( - uint8_t out_encoded_public_key[BCM_MLKEM1024_PUBLIC_KEY_BYTES], - uint8_t optional_out_seed[BCM_MLKEM_SEED_BYTES], - struct BCM_mlkem1024_private_key *out_private_key) { - uint8_t seed[BCM_MLKEM_SEED_BYTES]; + uint8_t out_encoded_public_key[MLKEM1024_PUBLIC_KEY_BYTES], + uint8_t optional_out_seed[MLKEM_SEED_BYTES], + MLKEM1024_private_key *out_private_key) { + uint8_t seed[MLKEM_SEED_BYTES]; BCM_rand_bytes(seed, sizeof(seed)); CONSTTIME_SECRET(seed, sizeof(seed)); if (optional_out_seed) { @@ -1189,21 +1186,21 @@ bcm_infallible BCM_mlkem1024_generate_key( } bcm_status BCM_mlkem1024_private_key_from_seed( - struct BCM_mlkem1024_private_key *out_private_key, const uint8_t *seed, + MLKEM1024_private_key *out_private_key, const uint8_t *seed, size_t seed_len) { - if (seed_len != BCM_MLKEM_SEED_BYTES) { + if (seed_len != MLKEM_SEED_BYTES) { return bcm_status::failure; } - uint8_t public_key_bytes[BCM_MLKEM1024_PUBLIC_KEY_BYTES]; + uint8_t public_key_bytes[MLKEM1024_PUBLIC_KEY_BYTES]; BCM_mlkem1024_generate_key_external_seed(public_key_bytes, out_private_key, seed); return bcm_status::not_approved; } bcm_infallible BCM_mlkem768_generate_key_external_seed( - uint8_t out_encoded_public_key[BCM_MLKEM768_PUBLIC_KEY_BYTES], - struct BCM_mlkem768_private_key *out_private_key, - const uint8_t seed[BCM_MLKEM_SEED_BYTES]) { + uint8_t out_encoded_public_key[MLKEM768_PUBLIC_KEY_BYTES], + MLKEM768_private_key *out_private_key, + const uint8_t seed[MLKEM_SEED_BYTES]) { mlkem::private_key *priv = mlkem::private_key_768_from_external(out_private_key); mlkem_generate_key_external_seed(out_encoded_public_key, priv, seed); @@ -1211,9 +1208,9 @@ bcm_infallible BCM_mlkem768_generate_key_external_seed( } bcm_infallible BCM_mlkem1024_generate_key_external_seed( - uint8_t out_encoded_public_key[BCM_MLKEM1024_PUBLIC_KEY_BYTES], - struct BCM_mlkem1024_private_key *out_private_key, - const uint8_t seed[BCM_MLKEM_SEED_BYTES]) { + uint8_t out_encoded_public_key[MLKEM1024_PUBLIC_KEY_BYTES], + MLKEM1024_private_key *out_private_key, + const uint8_t seed[MLKEM_SEED_BYTES]) { mlkem::private_key *priv = mlkem::private_key_1024_from_external(out_private_key); mlkem_generate_key_external_seed(out_encoded_public_key, priv, seed); @@ -1221,22 +1218,22 @@ bcm_infallible BCM_mlkem1024_generate_key_external_seed( } bcm_infallible BCM_mlkem768_public_from_private( - struct BCM_mlkem768_public_key *out_public_key, - const struct BCM_mlkem768_private_key *private_key) { - struct mlkem::public_key *const pub = + MLKEM768_public_key *out_public_key, + const MLKEM768_private_key *private_key) { + mlkem::public_key *const pub = mlkem::public_key_768_from_external(out_public_key); - const struct mlkem::private_key *const priv = + const mlkem::private_key *const priv = mlkem::private_key_768_from_external(private_key); *pub = priv->pub; return bcm_infallible::approved; } bcm_infallible BCM_mlkem1024_public_from_private( - struct BCM_mlkem1024_public_key *out_public_key, - const struct BCM_mlkem1024_private_key *private_key) { - struct mlkem::public_key *const pub = + MLKEM1024_public_key *out_public_key, + const MLKEM1024_private_key *private_key) { + mlkem::public_key *const pub = mlkem::public_key_1024_from_external(out_public_key); - const struct mlkem::private_key *const priv = + const mlkem::private_key *const priv = mlkem::private_key_1024_from_external(private_key); *pub = priv->pub; return bcm_infallible::approved; @@ -1245,9 +1242,9 @@ bcm_infallible BCM_mlkem1024_public_from_private( // Calls |MLKEM768_encap_external_entropy| with random bytes from // |BCM_rand_bytes| bcm_infallible BCM_mlkem768_encap( - uint8_t out_ciphertext[BCM_MLKEM768_CIPHERTEXT_BYTES], - uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], - const struct BCM_mlkem768_public_key *public_key) { + uint8_t out_ciphertext[MLKEM768_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const MLKEM768_public_key *public_key) { uint8_t entropy[BCM_MLKEM_ENCAP_ENTROPY]; BCM_rand_bytes(entropy, BCM_MLKEM_ENCAP_ENTROPY); CONSTTIME_SECRET(entropy, BCM_MLKEM_ENCAP_ENTROPY); @@ -1257,9 +1254,9 @@ bcm_infallible BCM_mlkem768_encap( } bcm_infallible BCM_mlkem1024_encap( - uint8_t out_ciphertext[BCM_MLKEM1024_CIPHERTEXT_BYTES], - uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], - const struct BCM_mlkem1024_public_key *public_key) { + uint8_t out_ciphertext[MLKEM1024_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const MLKEM1024_public_key *public_key) { uint8_t entropy[BCM_MLKEM_ENCAP_ENTROPY]; BCM_rand_bytes(entropy, BCM_MLKEM_ENCAP_ENTROPY); CONSTTIME_SECRET(entropy, BCM_MLKEM_ENCAP_ENTROPY); @@ -1269,70 +1266,70 @@ bcm_infallible BCM_mlkem1024_encap( } bcm_infallible BCM_mlkem768_encap_external_entropy( - uint8_t out_ciphertext[BCM_MLKEM768_CIPHERTEXT_BYTES], - uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], - const struct BCM_mlkem768_public_key *public_key, + uint8_t out_ciphertext[MLKEM768_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const MLKEM768_public_key *public_key, const uint8_t entropy[BCM_MLKEM_ENCAP_ENTROPY]) { - const struct mlkem::public_key *pub = + const mlkem::public_key *pub = mlkem::public_key_768_from_external(public_key); mlkem_encap_external_entropy(out_ciphertext, out_shared_secret, pub, entropy); return bcm_infallible::approved; } bcm_infallible BCM_mlkem1024_encap_external_entropy( - uint8_t out_ciphertext[BCM_MLKEM1024_CIPHERTEXT_BYTES], - uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], - const struct BCM_mlkem1024_public_key *public_key, + uint8_t out_ciphertext[MLKEM1024_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const MLKEM1024_public_key *public_key, const uint8_t entropy[BCM_MLKEM_ENCAP_ENTROPY]) { - const struct mlkem::public_key *pub = + const mlkem::public_key *pub = mlkem::public_key_1024_from_external(public_key); mlkem_encap_external_entropy(out_ciphertext, out_shared_secret, pub, entropy); return bcm_infallible::approved; } bcm_status BCM_mlkem768_decap( - uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], const uint8_t *ciphertext, size_t ciphertext_len, - const struct BCM_mlkem768_private_key *private_key) { - if (ciphertext_len != BCM_MLKEM768_CIPHERTEXT_BYTES) { - BCM_rand_bytes(out_shared_secret, BCM_MLKEM_SHARED_SECRET_BYTES); + const MLKEM768_private_key *private_key) { + if (ciphertext_len != MLKEM768_CIPHERTEXT_BYTES) { + BCM_rand_bytes(out_shared_secret, MLKEM_SHARED_SECRET_BYTES); return bcm_status::failure; } - const struct mlkem::private_key *priv = + const mlkem::private_key *priv = mlkem::private_key_768_from_external(private_key); mlkem_decap(out_shared_secret, ciphertext, priv); return bcm_status::approved; } bcm_status BCM_mlkem1024_decap( - uint8_t out_shared_secret[BCM_MLKEM_SHARED_SECRET_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], const uint8_t *ciphertext, size_t ciphertext_len, - const struct BCM_mlkem1024_private_key *private_key) { - if (ciphertext_len != BCM_MLKEM1024_CIPHERTEXT_BYTES) { - BCM_rand_bytes(out_shared_secret, BCM_MLKEM_SHARED_SECRET_BYTES); + const MLKEM1024_private_key *private_key) { + if (ciphertext_len != MLKEM1024_CIPHERTEXT_BYTES) { + BCM_rand_bytes(out_shared_secret, MLKEM_SHARED_SECRET_BYTES); return bcm_status::failure; } - const struct mlkem::private_key *priv = + const mlkem::private_key *priv = mlkem::private_key_1024_from_external(private_key); mlkem_decap(out_shared_secret, ciphertext, priv); return bcm_status::approved; } bcm_status BCM_mlkem768_marshal_public_key( - CBB *out, const struct BCM_mlkem768_public_key *public_key) { + CBB *out, const MLKEM768_public_key *public_key) { return mlkem_marshal_public_key( out, mlkem::public_key_768_from_external(public_key)); } bcm_status BCM_mlkem1024_marshal_public_key( - CBB *out, const struct BCM_mlkem1024_public_key *public_key) { + CBB *out, const MLKEM1024_public_key *public_key) { return mlkem_marshal_public_key( out, mlkem::public_key_1024_from_external(public_key)); } -bcm_status BCM_mlkem768_parse_public_key( - struct BCM_mlkem768_public_key *public_key, CBS *in) { - struct mlkem::public_key *pub = +bcm_status BCM_mlkem768_parse_public_key(MLKEM768_public_key *public_key, + CBS *in) { + mlkem::public_key *pub = mlkem::public_key_768_from_external(public_key); if (!mlkem_parse_public_key(pub, in)) { return bcm_status::failure; @@ -1340,9 +1337,9 @@ bcm_status BCM_mlkem768_parse_public_key( return bcm_status::approved; } -bcm_status BCM_mlkem1024_parse_public_key( - struct BCM_mlkem1024_public_key *public_key, CBS *in) { - struct mlkem::public_key *pub = +bcm_status BCM_mlkem1024_parse_public_key(MLKEM1024_public_key *public_key, + CBS *in) { + mlkem::public_key *pub = mlkem::public_key_1024_from_external(public_key); if (!mlkem_parse_public_key(pub, in)) { return bcm_status::failure; @@ -1351,8 +1348,8 @@ bcm_status BCM_mlkem1024_parse_public_key( } bcm_status BCM_mlkem768_marshal_private_key( - CBB *out, const struct BCM_mlkem768_private_key *private_key) { - const struct mlkem::private_key *const priv = + CBB *out, const MLKEM768_private_key *private_key) { + const mlkem::private_key *const priv = mlkem::private_key_768_from_external(private_key); if (!mlkem_marshal_private_key(out, priv)) { return bcm_status::failure; @@ -1361,8 +1358,8 @@ bcm_status BCM_mlkem768_marshal_private_key( } bcm_status BCM_mlkem1024_marshal_private_key( - CBB *out, const struct BCM_mlkem1024_private_key *private_key) { - const struct mlkem::private_key *const priv = + CBB *out, const MLKEM1024_private_key *private_key) { + const mlkem::private_key *const priv = mlkem::private_key_1024_from_external(private_key); if (!mlkem_marshal_private_key(out, priv)) { return bcm_status::failure; @@ -1370,9 +1367,9 @@ bcm_status BCM_mlkem1024_marshal_private_key( return bcm_status::approved; } -bcm_status BCM_mlkem768_parse_private_key( - struct BCM_mlkem768_private_key *out_private_key, CBS *in) { - struct mlkem::private_key *const priv = +bcm_status BCM_mlkem768_parse_private_key(MLKEM768_private_key *out_private_key, + CBS *in) { + mlkem::private_key *const priv = mlkem::private_key_768_from_external(out_private_key); if (!mlkem_parse_private_key(priv, in)) { return bcm_status::failure; @@ -1381,8 +1378,8 @@ bcm_status BCM_mlkem768_parse_private_key( } bcm_status BCM_mlkem1024_parse_private_key( - struct BCM_mlkem1024_private_key *out_private_key, CBS *in) { - struct mlkem::private_key *const priv = + MLKEM1024_private_key *out_private_key, CBS *in) { + mlkem::private_key *const priv = mlkem::private_key_1024_from_external(out_private_key); if (!mlkem_parse_private_key(priv, in)) { return bcm_status::failure; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rand/ctrdrbg.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rand/ctrdrbg.cc.inc index e9f471286c..a4b15efb18 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rand/ctrdrbg.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rand/ctrdrbg.cc.inc @@ -17,6 +17,7 @@ #include #include +#include #include "../aes/internal.h" #include "../service_indicator/internal.h" @@ -26,18 +27,149 @@ // Section references in this file refer to SP 800-90Ar1: // http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-90Ar1.pdf -// See table 3. -static const uint64_t kMaxReseedCount = UINT64_C(1) << 48; +// Also see table 3. +constexpr uint64_t kMaxReseedCount = UINT64_C(1) << 48; + +// Implements the BCC function as described in Section 10.3.3. +static void bcc(uint8_t out[AES_BLOCK_SIZE], const AES_KEY *aes_key, + const uint8_t *data, size_t data_len) { + // 1. chaining_value = 0^outlen. + uint8_t *chaining_value = out; + OPENSSL_memset(chaining_value, 0, AES_BLOCK_SIZE); + + // 2. n = len (data)/outlen. + BSSL_CHECK(data_len % AES_BLOCK_SIZE == 0); + const size_t n = data_len / AES_BLOCK_SIZE; + + for (size_t i = 0; i < n; i++) { + const uint8_t *block = data + (i * AES_BLOCK_SIZE); + uint8_t input_block[AES_BLOCK_SIZE]; + + // 4.1: input_block = chaining_value ⊕ block_i. + CRYPTO_xor16(input_block, chaining_value, block); + + // 4.2: chaining_value = Block_Encrypt (Key, input_block). + BCM_aes_encrypt(input_block, chaining_value, aes_key); + } + + // 5. output_block = chaining_value. +} + +// Implements the derivation function as described in Section 10.3.2. +static int block_cipher_df(uint8_t *out, size_t out_len, const uint8_t *input, + size_t input_len) { + // Constants for AES-256 + constexpr size_t kAESKeyLen = 32; + constexpr size_t kAESOutLen = AES_BLOCK_SIZE; + constexpr size_t kMaxNumBits = 512; + + if (out_len > kMaxNumBits / 8 || input_len > (1u << 30)) { + return 0; + } + + // 4. S = L || N || input_string || 0x80. + const size_t s_rawlen = sizeof(uint32_t) + sizeof(uint32_t) + input_len + 1; + // S is padded up to a block size. + const size_t s_len = (s_rawlen + kAESOutLen - 1) & ~(kAESOutLen - 1); + uint8_t iv_plus_s[/* space used below */ kAESOutLen + 4 + 4 + + CTR_DRBG_MAX_ENTROPY_LEN + CTR_DRBG_NONCE_LEN + + CTR_DRBG_SEED_LEN + 1 + + /* padding */ 7]; + if (kAESOutLen + s_len > sizeof(iv_plus_s)) { + return 0; + } + OPENSSL_memset(iv_plus_s, 0, sizeof(iv_plus_s)); + uint8_t *s_ptr = iv_plus_s + kAESOutLen; + // 2. L = len (input_string)/8. + CRYPTO_store_u32_be(s_ptr, (uint32_t)input_len); + s_ptr += sizeof(uint32_t); + // 3. N = number_of_bits_to_return/8. + CRYPTO_store_u32_be(s_ptr, (uint32_t)out_len); + s_ptr += sizeof(uint32_t); + OPENSSL_memcpy(s_ptr, input, input_len); + s_ptr += input_len; + *s_ptr = 0x80; + + uint8_t temp[kAESKeyLen + kAESOutLen]; + size_t temp_len = 0; + + // 8. K = leftmost (0x00010203...1D1E1F, keylen). + static const uint8_t kInitialKey[kAESKeyLen] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f}; + AES_KEY aes_key; + bcm_status status = + BCM_aes_set_encrypt_key(kInitialKey, 8 * sizeof(kInitialKey), &aes_key); + BSSL_CHECK(status != bcm_status::failure); + + // 7. i = 0. + uint32_t i = 0; + while (temp_len < sizeof(temp)) { + // 9.1 IV = i || 0^(outlen - len(i)). + CRYPTO_store_u32_be(iv_plus_s, i); + + // 9.2 temp = temp || BCC (K, (IV || S)). + bcc(temp + temp_len, &aes_key, iv_plus_s, kAESOutLen + s_len); + temp_len += kAESOutLen; + + // 9.3 i = i + 1. + i++; + } + + // 10. K = leftmost (temp, keylen). + uint8_t *const k = temp; + + // 11. X = select (temp, keylen+1, keylen+outlen). + uint8_t *const x = temp + kAESKeyLen; + + // 12. temp = the Null string. + temp_len = 0; + + // Create an AES key schedule for the final encryption steps. + status = BCM_aes_set_encrypt_key(k, kAESKeyLen * 8, &aes_key); + BSSL_CHECK(status != bcm_status::failure); + + // 13. While len (temp) < number_of_bits_to_return, do: + while (temp_len < out_len) { + // 13.1 X = Block_Encrypt (K, X). + BCM_aes_encrypt(x, x, &aes_key); + + // 13.2 temp = temp || X. + size_t to_copy = std::min(kAESOutLen, out_len - temp_len); + OPENSSL_memcpy(out + temp_len, x, to_copy); + temp_len += to_copy; + } + + return 1; +} CTR_DRBG_STATE *CTR_DRBG_new(const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], const uint8_t *personalization, size_t personalization_len) { CTR_DRBG_STATE *drbg = reinterpret_cast( OPENSSL_malloc(sizeof(CTR_DRBG_STATE))); - if (drbg == NULL || - !CTR_DRBG_init(drbg, entropy, personalization, personalization_len)) { + if (drbg == nullptr || + !CTR_DRBG_init(drbg, /*df=*/false, entropy, CTR_DRBG_ENTROPY_LEN, + /*nonce=*/nullptr, personalization, personalization_len)) { CTR_DRBG_free(drbg); - return NULL; + return nullptr; + } + + return drbg; +} + +CTR_DRBG_STATE *CTR_DRBG_new_df(const uint8_t *entropy, size_t entropy_len, + const uint8_t nonce[CTR_DRBG_NONCE_LEN], + const uint8_t *personalization, + size_t personalization_len) { + CTR_DRBG_STATE *drbg = reinterpret_cast( + OPENSSL_malloc(sizeof(CTR_DRBG_STATE))); + if (drbg == nullptr || + !CTR_DRBG_init(drbg, /*df=*/true, entropy, entropy_len, nonce, + personalization, personalization_len)) { + CTR_DRBG_free(drbg); + return nullptr; } return drbg; @@ -45,26 +177,45 @@ CTR_DRBG_STATE *CTR_DRBG_new(const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], void CTR_DRBG_free(CTR_DRBG_STATE *state) { OPENSSL_free(state); } -int CTR_DRBG_init(CTR_DRBG_STATE *drbg, - const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], +int CTR_DRBG_init(CTR_DRBG_STATE *drbg, int df, const uint8_t *entropy, + size_t entropy_len, const uint8_t nonce[CTR_DRBG_NONCE_LEN], const uint8_t *personalization, size_t personalization_len) { - // Section 10.2.1.3.1 - if (personalization_len > CTR_DRBG_ENTROPY_LEN) { + // Section 10.2.1.3.1 and 10.2.1.3.2 + if (personalization_len > CTR_DRBG_SEED_LEN || + (!df && entropy_len != CTR_DRBG_ENTROPY_LEN) || + (df && (entropy_len < CTR_DRBG_MIN_ENTROPY_LEN || + entropy_len > CTR_DRBG_MAX_ENTROPY_LEN)) || // + (df != (nonce != nullptr))) { return 0; } - uint8_t seed_material[CTR_DRBG_ENTROPY_LEN]; - OPENSSL_memcpy(seed_material, entropy, CTR_DRBG_ENTROPY_LEN); + uint8_t seed_material[CTR_DRBG_SEED_LEN]; + if (df) { + uint8_t pre_seed_material[CTR_DRBG_MAX_ENTROPY_LEN + CTR_DRBG_NONCE_LEN + + CTR_DRBG_SEED_LEN]; + OPENSSL_memcpy(pre_seed_material, entropy, entropy_len); + OPENSSL_memcpy(pre_seed_material + entropy_len, nonce, CTR_DRBG_NONCE_LEN); + OPENSSL_memcpy(pre_seed_material + entropy_len + CTR_DRBG_NONCE_LEN, + personalization, personalization_len); + const size_t pre_seed_material_length = + entropy_len + CTR_DRBG_NONCE_LEN + personalization_len; - for (size_t i = 0; i < personalization_len; i++) { - seed_material[i] ^= personalization[i]; + if (!block_cipher_df(seed_material, sizeof(seed_material), + pre_seed_material, pre_seed_material_length)) { + return 0; + } + } else { + OPENSSL_memcpy(seed_material, entropy, CTR_DRBG_ENTROPY_LEN); + for (size_t i = 0; i < personalization_len; i++) { + seed_material[i] ^= personalization[i]; + } } // Section 10.2.1.2 // kInitMask is the result of encrypting blocks with big-endian value 1, 2 // and 3 with the all-zero AES-256 key. - static const uint8_t kInitMask[CTR_DRBG_ENTROPY_LEN] = { + static const uint8_t kInitMask[CTR_DRBG_SEED_LEN] = { 0x53, 0x0f, 0x8a, 0xfb, 0xc7, 0x45, 0x36, 0xb9, 0xa9, 0x63, 0xb4, 0xf1, 0xc4, 0xcb, 0x73, 0x8b, 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e, 0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18, 0x72, 0x60, 0x03, 0xca, @@ -75,14 +226,16 @@ int CTR_DRBG_init(CTR_DRBG_STATE *drbg, seed_material[i] ^= kInitMask[i]; } - drbg->ctr = aes_ctr_set_key(&drbg->ks, NULL, &drbg->block, seed_material, 32); + drbg->df = df; + drbg->ctr = + aes_ctr_set_key(&drbg->ks, nullptr, &drbg->block, seed_material, 32); OPENSSL_memcpy(drbg->counter, seed_material + 32, 16); drbg->reseed_counter = 1; return 1; } -static_assert(CTR_DRBG_ENTROPY_LEN % AES_BLOCK_SIZE == 0, +static_assert(CTR_DRBG_SEED_LEN % AES_BLOCK_SIZE == 0, "not a multiple of AES block size"); // ctr_inc adds |n| to the last four bytes of |drbg->counter|, treated as a @@ -92,26 +245,19 @@ static void ctr32_add(CTR_DRBG_STATE *drbg, uint32_t n) { CRYPTO_store_u32_be(drbg->counter + 12, ctr + n); } -static int ctr_drbg_update(CTR_DRBG_STATE *drbg, const uint8_t *data, - size_t data_len) { - // Per section 10.2.1.2, |data_len| must be |CTR_DRBG_ENTROPY_LEN|. Here, we - // allow shorter inputs and right-pad them with zeros. This is equivalent to - // the specified algorithm but saves a copy in |CTR_DRBG_generate|. - if (data_len > CTR_DRBG_ENTROPY_LEN) { - return 0; - } - - uint8_t temp[CTR_DRBG_ENTROPY_LEN]; - for (size_t i = 0; i < CTR_DRBG_ENTROPY_LEN; i += AES_BLOCK_SIZE) { +static int ctr_drbg_update(CTR_DRBG_STATE *drbg, + const uint8_t data[CTR_DRBG_SEED_LEN]) { + uint8_t temp[CTR_DRBG_SEED_LEN]; + for (size_t i = 0; i < CTR_DRBG_SEED_LEN; i += AES_BLOCK_SIZE) { ctr32_add(drbg, 1); drbg->block(drbg->counter, temp + i, &drbg->ks); } - for (size_t i = 0; i < data_len; i++) { + for (size_t i = 0; i < CTR_DRBG_SEED_LEN; i++) { temp[i] ^= data[i]; } - drbg->ctr = aes_ctr_set_key(&drbg->ks, NULL, &drbg->block, temp, 32); + drbg->ctr = aes_ctr_set_key(&drbg->ks, nullptr, &drbg->block, temp, 32); OPENSSL_memcpy(drbg->counter, temp + 32, 16); return 1; @@ -121,23 +267,46 @@ int CTR_DRBG_reseed(CTR_DRBG_STATE *drbg, const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], const uint8_t *additional_data, size_t additional_data_len) { - // Section 10.2.1.4 - uint8_t entropy_copy[CTR_DRBG_ENTROPY_LEN]; + return CTR_DRBG_reseed_ex(drbg, entropy, CTR_DRBG_ENTROPY_LEN, + additional_data, additional_data_len); +} - if (additional_data_len > 0) { - if (additional_data_len > CTR_DRBG_ENTROPY_LEN) { - return 0; - } - - OPENSSL_memcpy(entropy_copy, entropy, CTR_DRBG_ENTROPY_LEN); - for (size_t i = 0; i < additional_data_len; i++) { - entropy_copy[i] ^= additional_data[i]; - } - - entropy = entropy_copy; +int CTR_DRBG_reseed_ex(CTR_DRBG_STATE *drbg, const uint8_t *entropy, + size_t entropy_len, const uint8_t *additional_data, + size_t additional_data_len) { + if (additional_data_len > CTR_DRBG_SEED_LEN || + (drbg->df && (entropy_len > CTR_DRBG_MAX_ENTROPY_LEN || + entropy_len < CTR_DRBG_MIN_ENTROPY_LEN)) || + (!drbg->df && entropy_len != CTR_DRBG_ENTROPY_LEN)) { + return 0; } - if (!ctr_drbg_update(drbg, entropy, CTR_DRBG_ENTROPY_LEN)) { + uint8_t seed_material[CTR_DRBG_SEED_LEN]; + if (drbg->df) { + // Section 10.2.1.4.2 + uint8_t pre_seed_material[CTR_DRBG_MAX_ENTROPY_LEN + CTR_DRBG_SEED_LEN]; + static_assert(CTR_DRBG_MAX_ENTROPY_LEN <= sizeof(pre_seed_material)); + OPENSSL_memcpy(pre_seed_material, entropy, entropy_len); + OPENSSL_memcpy(pre_seed_material + entropy_len, additional_data, + additional_data_len); + const size_t pre_seed_material_len = entropy_len + additional_data_len; + + if (!block_cipher_df(seed_material, sizeof(seed_material), + pre_seed_material, pre_seed_material_len)) { + return 0; + } + } else { + // Section 10.2.1.4 + static_assert(CTR_DRBG_ENTROPY_LEN == sizeof(seed_material)); + OPENSSL_memcpy(seed_material, entropy, CTR_DRBG_ENTROPY_LEN); + if (additional_data_len > 0) { + for (size_t i = 0; i < additional_data_len; i++) { + seed_material[i] ^= additional_data[i]; + } + } + } + + if (!ctr_drbg_update(drbg, seed_material)) { return 0; } @@ -159,9 +328,26 @@ int CTR_DRBG_generate(CTR_DRBG_STATE *drbg, uint8_t *out, size_t out_len, return 0; } - if (additional_data_len != 0 && - !ctr_drbg_update(drbg, additional_data, additional_data_len)) { - return 0; + uint8_t processed_additional_data[CTR_DRBG_SEED_LEN]; + OPENSSL_memset(processed_additional_data, 0, + sizeof(processed_additional_data)); + if (additional_data_len != 0) { + if (drbg->df) { + if (!block_cipher_df(processed_additional_data, + sizeof(processed_additional_data), additional_data, + additional_data_len)) { + return 0; + } + } else { + if (additional_data_len > sizeof(processed_additional_data)) { + return 0; + } + OPENSSL_memcpy(processed_additional_data, additional_data, + additional_data_len); + } + if (!ctr_drbg_update(drbg, processed_additional_data)) { + return 0; + } } // kChunkSize is used to interact better with the cache. Since the AES-CTR @@ -170,7 +356,7 @@ int CTR_DRBG_generate(CTR_DRBG_STATE *drbg, uint8_t *out, size_t out_len, // the whole buffer, flushing the L1 cache, and then do another pass (missing // the cache every time) to “encrypt” it. The code can avoid this by // chunking. - static const size_t kChunkSize = 8 * 1024; + constexpr size_t kChunkSize = 8 * 1024; while (out_len >= AES_BLOCK_SIZE) { size_t todo = kChunkSize; @@ -198,9 +384,7 @@ int CTR_DRBG_generate(CTR_DRBG_STATE *drbg, uint8_t *out, size_t out_len, OPENSSL_memcpy(out, block, out_len); } - // Right-padding |additional_data| in step 2.2 is handled implicitly by - // |ctr_drbg_update|, to save a copy. - if (!ctr_drbg_update(drbg, additional_data, additional_data_len)) { + if (!ctr_drbg_update(drbg, processed_additional_data)) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rand/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rand/internal.h index e791edf50b..0e24888a24 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rand/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rand/internal.h @@ -37,14 +37,19 @@ struct ctr_drbg_state_st { ctr128_f ctr; uint8_t counter[16]; uint64_t reseed_counter; + int df; }; -// CTR_DRBG_init initialises |*drbg| given |CTR_DRBG_ENTROPY_LEN| bytes of -// entropy in |entropy| and, optionally, a personalization string up to -// |CTR_DRBG_ENTROPY_LEN| bytes in length. It returns one on success and zero -// on error. -OPENSSL_EXPORT int CTR_DRBG_init(CTR_DRBG_STATE *drbg, - const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], +// CTR_DRBG_init initialises |*drbg| given |entropy_len| bytes of entropy in +// |entropy| and, optionally, a personalization string up to +// |CTR_DRBG_SEED_LEN| bytes in length. It returns one on success and zero on +// error. +// +// If `df` is false then `entropy_len` must be |CTR_DRBG_ENTROPY_LEN| and +// |nonce| must be nullptr. +OPENSSL_EXPORT int CTR_DRBG_init(CTR_DRBG_STATE *drbg, int df, + const uint8_t *entropy, size_t entropy_len, + const uint8_t nonce[CTR_DRBG_NONCE_LEN], const uint8_t *personalization, size_t personalization_len); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rand/rand.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rand/rand.cc.inc index f531b445aa..1b305511a2 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rand/rand.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rand/rand.cc.inc @@ -71,8 +71,8 @@ struct rand_thread_state { #if defined(BORINGSSL_FIPS) // last_block contains the previous block from |get_seed_entropy|. uint8_t last_block[CRNGT_BLOCK_SIZE]; - // next and prev form a NULL-terminated, double-linked list of all states in - // a process. + // next and prev form a nullptr-terminated, double-linked list of all states + // in a process. struct rand_thread_state *next, *prev; // clear_drbg_lock synchronizes between uses of |drbg| and // |rand_thread_state_clear_all| clearing it. This lock should be uncontended @@ -94,7 +94,7 @@ static void rand_thread_state_clear_all(void) __attribute__((destructor)); static void rand_thread_state_clear_all(void) { CRYPTO_MUTEX_lock_write(thread_states_list_lock_bss_get()); for (struct rand_thread_state *cur = *thread_states_list_bss_get(); - cur != NULL; cur = cur->next) { + cur != nullptr; cur = cur->next) { CRYPTO_MUTEX_lock_write(&cur->clear_drbg_lock); CTR_DRBG_clear(&cur->drbg); } @@ -111,23 +111,23 @@ static void rand_thread_state_free(void *state_in) { struct rand_thread_state *state = reinterpret_cast(state_in); - if (state_in == NULL) { + if (state_in == nullptr) { return; } #if defined(BORINGSSL_FIPS) CRYPTO_MUTEX_lock_write(thread_states_list_lock_bss_get()); - if (state->prev != NULL) { + if (state->prev != nullptr) { state->prev->next = state->next; } else if (*thread_states_list_bss_get() == state) { - // |state->prev| may be NULL either if it is the head of the list, + // |state->prev| may be nullptr either if it is the head of the list, // or if |state| is freed before it was added to the list at all. // Compare against the head of the list to distinguish these cases. *thread_states_list_bss_get() = state->next; } - if (state->next != NULL) { + if (state->next != nullptr) { state->next->prev = state->prev; } @@ -187,8 +187,7 @@ bcm_status BCM_rand_bytes_hwrng(uint8_t *buf, const size_t len) { struct entropy_buffer { // bytes contains entropy suitable for seeding a DRBG. - uint8_t - bytes[CRNGT_BLOCK_SIZE + CTR_DRBG_ENTROPY_LEN * BORINGSSL_FIPS_OVERREAD]; + uint8_t bytes[CRNGT_BLOCK_SIZE + CTR_DRBG_SEED_LEN * BORINGSSL_FIPS_OVERREAD]; // bytes_valid indicates the number of bytes of |bytes| that contain valid // data. size_t bytes_valid; @@ -250,11 +249,11 @@ static void get_seed_entropy(uint8_t *out_entropy, size_t out_entropy_len, // fill |additional_input| with entropy to supplement |seed|. It sets // |*out_additional_input_len| to the number of extra bytes. static void rand_get_seed(struct rand_thread_state *state, - uint8_t seed[CTR_DRBG_ENTROPY_LEN], - uint8_t additional_input[CTR_DRBG_ENTROPY_LEN], + uint8_t seed[CTR_DRBG_SEED_LEN], + uint8_t additional_input[CTR_DRBG_SEED_LEN], size_t *out_additional_input_len) { uint8_t entropy_bytes[sizeof(state->last_block) + - CTR_DRBG_ENTROPY_LEN * BORINGSSL_FIPS_OVERREAD]; + CTR_DRBG_SEED_LEN * BORINGSSL_FIPS_OVERREAD]; uint8_t *entropy = entropy_bytes; size_t entropy_len = sizeof(entropy_bytes); @@ -293,22 +292,23 @@ static void rand_get_seed(struct rand_thread_state *state, OPENSSL_memcpy(state->last_block, entropy + entropy_len - CRNGT_BLOCK_SIZE, CRNGT_BLOCK_SIZE); - assert(entropy_len == BORINGSSL_FIPS_OVERREAD * CTR_DRBG_ENTROPY_LEN); - OPENSSL_memcpy(seed, entropy, CTR_DRBG_ENTROPY_LEN); + assert(entropy_len == BORINGSSL_FIPS_OVERREAD * CTR_DRBG_SEED_LEN); + OPENSSL_memcpy(seed, entropy, CTR_DRBG_SEED_LEN); for (size_t i = 1; i < BORINGSSL_FIPS_OVERREAD; i++) { - for (size_t j = 0; j < CTR_DRBG_ENTROPY_LEN; j++) { - seed[j] ^= entropy[CTR_DRBG_ENTROPY_LEN * i + j]; + for (size_t j = 0; j < CTR_DRBG_SEED_LEN; j++) { + seed[j] ^= entropy[CTR_DRBG_SEED_LEN * i + j]; } } - // If we used something other than system entropy then also - // opportunistically read from the system. This avoids solely relying on the - // hardware once the entropy pool has been initialized. + // If we used something other than system entropy then also read from the + // system. This avoids solely relying on the hardware. + // TODO(crbug.com/446280903): Once this change sticks, switch + // |get_seed_entropy| to draw from the OS instead of RDRAND. *out_additional_input_len = 0; - if (want_additional_input && - CRYPTO_sysrand_if_available(additional_input, CTR_DRBG_ENTROPY_LEN)) { - *out_additional_input_len = CTR_DRBG_ENTROPY_LEN; + if (want_additional_input) { + CRYPTO_sysrand(additional_input, CTR_DRBG_SEED_LEN); + *out_additional_input_len = CTR_DRBG_SEED_LEN; } } @@ -318,12 +318,12 @@ static void rand_get_seed(struct rand_thread_state *state, // fill |additional_input| with entropy to supplement |seed|. It sets // |*out_additional_input_len| to the number of extra bytes. static void rand_get_seed(struct rand_thread_state *state, - uint8_t seed[CTR_DRBG_ENTROPY_LEN], - uint8_t additional_input[CTR_DRBG_ENTROPY_LEN], + uint8_t seed[CTR_DRBG_SEED_LEN], + uint8_t additional_input[CTR_DRBG_SEED_LEN], size_t *out_additional_input_len) { // If not in FIPS mode, we don't overread from the system entropy source and // we don't depend only on the hardware RDRAND. - CRYPTO_sysrand_for_seed(seed, CTR_DRBG_ENTROPY_LEN); + CRYPTO_sysrand_for_seed(seed, CTR_DRBG_SEED_LEN); *out_additional_input_len = 0; } @@ -353,13 +353,7 @@ bcm_infallible BCM_rand_bytes_with_additional_data( // promised not to fork. if (fork_generation != 0 || fork_unsafe_buffering) { OPENSSL_memset(additional_data, 0, sizeof(additional_data)); - } else if (!have_rdrand()) { - // No alternative so block for OS entropy. - CRYPTO_sysrand(additional_data, sizeof(additional_data)); - } else if (!CRYPTO_sysrand_if_available(additional_data, - sizeof(additional_data)) && - !rdrand(additional_data, sizeof(additional_data))) { - // RDRAND failed: block for OS entropy. + } else { CRYPTO_sysrand(additional_data, sizeof(additional_data)); } } @@ -372,10 +366,10 @@ bcm_infallible BCM_rand_bytes_with_additional_data( struct rand_thread_state *state = reinterpret_cast( CRYPTO_get_thread_local(OPENSSL_THREAD_LOCAL_RAND)); - if (state == NULL) { + if (state == nullptr) { state = reinterpret_cast( OPENSSL_zalloc(sizeof(struct rand_thread_state))); - if (state == NULL || + if (state == nullptr || !CRYPTO_set_thread_local(OPENSSL_THREAD_LOCAL_RAND, state, rand_thread_state_free)) { // If the system is out of memory, use an ephemeral state on the @@ -384,13 +378,13 @@ bcm_infallible BCM_rand_bytes_with_additional_data( } state->last_block_valid = 0; - uint8_t seed[CTR_DRBG_ENTROPY_LEN]; - uint8_t personalization[CTR_DRBG_ENTROPY_LEN] = {0}; + uint8_t seed[CTR_DRBG_SEED_LEN]; + uint8_t personalization[CTR_DRBG_SEED_LEN] = {0}; size_t personalization_len = 0; rand_get_seed(state, seed, personalization, &personalization_len); - if (!CTR_DRBG_init(&state->drbg, seed, personalization, - personalization_len)) { + if (!CTR_DRBG_init(&state->drbg, /*df=*/true, seed, 32u, seed + 32, + personalization, personalization_len)) { abort(); } state->calls = 0; @@ -403,10 +397,10 @@ bcm_infallible BCM_rand_bytes_with_additional_data( CRYPTO_MUTEX_lock_write(thread_states_list_lock_bss_get()); struct rand_thread_state **states_list = thread_states_list_bss_get(); state->next = *states_list; - if (state->next != NULL) { + if (state->next != nullptr) { state->next->prev = state; } - state->prev = NULL; + state->prev = nullptr; *states_list = state; CRYPTO_MUTEX_unlock_write(thread_states_list_lock_bss_get()); } @@ -422,8 +416,8 @@ bcm_infallible BCM_rand_bytes_with_additional_data( // safety. The children must reseed to avoid working from the same PRNG // state. state->fork_unsafe_buffering != fork_unsafe_buffering) { - uint8_t seed[CTR_DRBG_ENTROPY_LEN]; - uint8_t reseed_additional_data[CTR_DRBG_ENTROPY_LEN] = {0}; + uint8_t seed[CTR_DRBG_SEED_LEN]; + uint8_t reseed_additional_data[CTR_DRBG_SEED_LEN] = {0}; size_t reseed_additional_data_len = 0; rand_get_seed(state, seed, reseed_additional_data, &reseed_additional_data_len); @@ -433,8 +427,9 @@ bcm_infallible BCM_rand_bytes_with_additional_data( // |rand_thread_state_clear_all|. CRYPTO_MUTEX_lock_read(&state->clear_drbg_lock); #endif - if (!CTR_DRBG_reseed(&state->drbg, seed, reseed_additional_data, - reseed_additional_data_len)) { + if (!CTR_DRBG_reseed_ex(&state->drbg, seed, sizeof(seed), + reseed_additional_data, + reseed_additional_data_len)) { abort(); } state->calls = 0; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/blinding.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/blinding.cc.inc index b3bf4dab58..75e98e1c7a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/blinding.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/blinding.cc.inc @@ -21,6 +21,7 @@ #include #include "../../internal.h" +#include "../bn/internal.h" #include "internal.h" @@ -38,17 +39,17 @@ static int bn_blinding_create_param(BN_BLINDING *b, const BIGNUM *e, BN_BLINDING *BN_BLINDING_new(void) { BN_BLINDING *ret = reinterpret_cast(OPENSSL_zalloc(sizeof(BN_BLINDING))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->A = BN_new(); - if (ret->A == NULL) { + if (ret->A == nullptr) { goto err; } ret->Ai = BN_new(); - if (ret->Ai == NULL) { + if (ret->Ai == nullptr) { goto err; } @@ -59,7 +60,7 @@ BN_BLINDING *BN_BLINDING_new(void) { err: BN_BLINDING_free(ret); - return NULL; + return nullptr; } void BN_BLINDING_free(BN_BLINDING *r) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/internal.h index 94719cef6a..12fa09c279 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/internal.h @@ -29,6 +29,20 @@ extern "C" { typedef struct bn_blinding_st BN_BLINDING; +// TODO(davidben): This is inside BCM because |RSA| is inside BCM, but BCM never +// uses this. Split the RSA type in two. +enum rsa_pss_params_t { + // No parameters. + // TODO(davidben): Remove this and use std::optional where appropriate. + rsa_pss_none = 0, + // RSA-PSS using SHA-256, MGF1 with SHA-256, salt length 32. + rsa_pss_sha256, + // RSA-PSS using SHA-384, MGF1 with SHA-384, salt length 48. + rsa_pss_sha384, + // RSA-PSS using SHA-512, MGF1 with SHA-512, salt length 64. + rsa_pss_sha512, +}; + struct rsa_st { RSA_METHOD *meth; @@ -75,6 +89,10 @@ struct rsa_st { unsigned char *blindings_inuse; uint64_t blinding_fork_generation; + // pss_params is the RSA-PSS parameters associated with the key. This is not + // used by the low-level RSA implementation, just the EVP layer. + rsa_pss_params_t pss_params; + // private_key_frozen is one if the key has been used for a private key // operation and may no longer be mutated. unsigned private_key_frozen:1; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/padding.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/padding.cc.inc index 726d23dfc7..8d65b81ed2 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/padding.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/padding.cc.inc @@ -166,12 +166,12 @@ static const uint8_t kPSSZeroes[] = {0, 0, 0, 0, 0, 0, 0, 0}; int RSA_verify_PKCS1_PSS_mgf1(const RSA *rsa, const uint8_t *mHash, const EVP_MD *Hash, const EVP_MD *mgf1Hash, const uint8_t *EM, int sLen) { - if (mgf1Hash == NULL) { + if (mgf1Hash == nullptr) { mgf1Hash = Hash; } int ret = 0; - uint8_t *DB = NULL; + uint8_t *DB = nullptr; const uint8_t *H; bssl::ScopedEVP_MD_CTX ctx; unsigned MSBits; @@ -242,11 +242,11 @@ int RSA_verify_PKCS1_PSS_mgf1(const RSA *rsa, const uint8_t *mHash, goto err; } uint8_t H_[EVP_MAX_MD_SIZE]; - if (!EVP_DigestInit_ex(ctx.get(), Hash, NULL) || + if (!EVP_DigestInit_ex(ctx.get(), Hash, nullptr) || !EVP_DigestUpdate(ctx.get(), kPSSZeroes, sizeof(kPSSZeroes)) || !EVP_DigestUpdate(ctx.get(), mHash, hLen) || !EVP_DigestUpdate(ctx.get(), DB + salt_start, maskedDBLen - salt_start) || - !EVP_DigestFinal_ex(ctx.get(), H_, NULL)) { + !EVP_DigestFinal_ex(ctx.get(), H_, nullptr)) { goto err; } if (OPENSSL_memcmp(H_, H, hLen) != 0) { @@ -270,9 +270,9 @@ int RSA_padding_add_PKCS1_PSS_mgf1(const RSA *rsa, unsigned char *EM, bssl::ScopedEVP_MD_CTX ctx; size_t maskedDBLen, MSBits, emLen; size_t hLen; - unsigned char *H, *salt = NULL, *p; + unsigned char *H, *salt = nullptr, *p; - if (mgf1Hash == NULL) { + if (mgf1Hash == nullptr) { mgf1Hash = Hash; } @@ -326,11 +326,11 @@ int RSA_padding_add_PKCS1_PSS_mgf1(const RSA *rsa, unsigned char *EM, maskedDBLen = emLen - hLen - 1; H = EM + maskedDBLen; - if (!EVP_DigestInit_ex(ctx.get(), Hash, NULL) || + if (!EVP_DigestInit_ex(ctx.get(), Hash, nullptr) || !EVP_DigestUpdate(ctx.get(), kPSSZeroes, sizeof(kPSSZeroes)) || !EVP_DigestUpdate(ctx.get(), mHash, hLen) || !EVP_DigestUpdate(ctx.get(), salt, sLen) || - !EVP_DigestFinal_ex(ctx.get(), H, NULL)) { + !EVP_DigestFinal_ex(ctx.get(), H, nullptr)) { goto err; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa.cc.inc index f1ba37b3a6..bf9b16f3bb 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa.cc.inc @@ -18,6 +18,8 @@ #include #include +#include + #include #include #include @@ -41,24 +43,24 @@ OPENSSL_DECLARE_ERROR_REASON(RSA, BLOCK_TYPE_IS_NOT_02) DEFINE_STATIC_EX_DATA_CLASS(g_rsa_ex_data_class) static int bn_dup_into(BIGNUM **dst, const BIGNUM *src) { - if (src == NULL) { + if (src == nullptr) { OPENSSL_PUT_ERROR(RSA, ERR_R_PASSED_NULL_PARAMETER); return 0; } BN_free(*dst); *dst = BN_dup(src); - return *dst != NULL; + return *dst != nullptr; } RSA *RSA_new_public_key(const BIGNUM *n, const BIGNUM *e) { RSA *rsa = RSA_new(); - if (rsa == NULL || // + if (rsa == nullptr || // !bn_dup_into(&rsa->n, n) || // !bn_dup_into(&rsa->e, e) || // !RSA_check_key(rsa)) { RSA_free(rsa); - return NULL; + return nullptr; } return rsa; @@ -68,7 +70,7 @@ RSA *RSA_new_private_key(const BIGNUM *n, const BIGNUM *e, const BIGNUM *d, const BIGNUM *p, const BIGNUM *q, const BIGNUM *dmp1, const BIGNUM *dmq1, const BIGNUM *iqmp) { RSA *rsa = RSA_new(); - if (rsa == NULL || // + if (rsa == nullptr || // !bn_dup_into(&rsa->n, n) || // !bn_dup_into(&rsa->e, e) || // !bn_dup_into(&rsa->d, d) || // @@ -79,7 +81,7 @@ RSA *RSA_new_private_key(const BIGNUM *n, const BIGNUM *e, const BIGNUM *d, !bn_dup_into(&rsa->iqmp, iqmp) || // !RSA_check_key(rsa)) { RSA_free(rsa); - return NULL; + return nullptr; } return rsa; @@ -88,13 +90,13 @@ RSA *RSA_new_private_key(const BIGNUM *n, const BIGNUM *e, const BIGNUM *d, RSA *RSA_new_private_key_no_crt(const BIGNUM *n, const BIGNUM *e, const BIGNUM *d) { RSA *rsa = RSA_new(); - if (rsa == NULL || // + if (rsa == nullptr || // !bn_dup_into(&rsa->n, n) || // !bn_dup_into(&rsa->e, e) || // !bn_dup_into(&rsa->d, d) || // !RSA_check_key(rsa)) { RSA_free(rsa); - return NULL; + return nullptr; } return rsa; @@ -102,8 +104,8 @@ RSA *RSA_new_private_key_no_crt(const BIGNUM *n, const BIGNUM *e, RSA *RSA_new_private_key_no_e(const BIGNUM *n, const BIGNUM *d) { RSA *rsa = RSA_new(); - if (rsa == NULL) { - return NULL; + if (rsa == nullptr) { + return nullptr; } rsa->flags |= RSA_FLAG_NO_PUBLIC_EXPONENT; @@ -111,7 +113,7 @@ RSA *RSA_new_private_key_no_e(const BIGNUM *n, const BIGNUM *d) { !bn_dup_into(&rsa->d, d) || // !RSA_check_key(rsa)) { RSA_free(rsa); - return NULL; + return nullptr; } return rsa; @@ -119,8 +121,8 @@ RSA *RSA_new_private_key_no_e(const BIGNUM *n, const BIGNUM *d) { RSA *RSA_new_public_key_large_e(const BIGNUM *n, const BIGNUM *e) { RSA *rsa = RSA_new(); - if (rsa == NULL) { - return NULL; + if (rsa == nullptr) { + return nullptr; } rsa->flags |= RSA_FLAG_LARGE_PUBLIC_EXPONENT; @@ -128,7 +130,7 @@ RSA *RSA_new_public_key_large_e(const BIGNUM *n, const BIGNUM *e) { !bn_dup_into(&rsa->e, e) || // !RSA_check_key(rsa)) { RSA_free(rsa); - return NULL; + return nullptr; } return rsa; @@ -139,8 +141,8 @@ RSA *RSA_new_private_key_large_e(const BIGNUM *n, const BIGNUM *e, const BIGNUM *q, const BIGNUM *dmp1, const BIGNUM *dmq1, const BIGNUM *iqmp) { RSA *rsa = RSA_new(); - if (rsa == NULL) { - return NULL; + if (rsa == nullptr) { + return nullptr; } rsa->flags |= RSA_FLAG_LARGE_PUBLIC_EXPONENT; @@ -154,25 +156,25 @@ RSA *RSA_new_private_key_large_e(const BIGNUM *n, const BIGNUM *e, !bn_dup_into(&rsa->iqmp, iqmp) || // !RSA_check_key(rsa)) { RSA_free(rsa); - return NULL; + return nullptr; } return rsa; } -RSA *RSA_new(void) { return RSA_new_method(NULL); } +RSA *RSA_new(void) { return RSA_new_method(nullptr); } RSA *RSA_new_method(const ENGINE *engine) { RSA *rsa = reinterpret_cast(OPENSSL_zalloc(sizeof(RSA))); - if (rsa == NULL) { - return NULL; + if (rsa == nullptr) { + return nullptr; } if (engine) { rsa->meth = ENGINE_get_RSA_method(engine); } - if (rsa->meth == NULL) { + if (rsa->meth == nullptr) { rsa->meth = (RSA_METHOD *)RSA_default_method(); } METHOD_ref(rsa->meth); @@ -185,7 +187,7 @@ RSA *RSA_new_method(const ENGINE *engine) { if (rsa->meth->init && !rsa->meth->init(rsa)) { rsa->meth = nullptr; RSA_free(rsa); - return NULL; + return nullptr; } return rsa; @@ -193,16 +195,16 @@ RSA *RSA_new_method(const ENGINE *engine) { RSA *RSA_new_method_no_e(const ENGINE *engine, const BIGNUM *n) { RSA *rsa = RSA_new_method(engine); - if (rsa == NULL || !bn_dup_into(&rsa->n, n)) { + if (rsa == nullptr || !bn_dup_into(&rsa->n, n)) { RSA_free(rsa); - return NULL; + return nullptr; } rsa->flags |= RSA_FLAG_NO_PUBLIC_EXPONENT; return rsa; } void RSA_free(RSA *rsa) { - if (rsa == NULL) { + if (rsa == nullptr) { return; } @@ -255,60 +257,55 @@ const BIGNUM *RSA_get0_iqmp(const RSA *rsa) { return rsa->iqmp; } void RSA_get0_key(const RSA *rsa, const BIGNUM **out_n, const BIGNUM **out_e, const BIGNUM **out_d) { - if (out_n != NULL) { + if (out_n != nullptr) { *out_n = rsa->n; } - if (out_e != NULL) { + if (out_e != nullptr) { *out_e = rsa->e; } - if (out_d != NULL) { + if (out_d != nullptr) { *out_d = rsa->d; } } void RSA_get0_factors(const RSA *rsa, const BIGNUM **out_p, const BIGNUM **out_q) { - if (out_p != NULL) { + if (out_p != nullptr) { *out_p = rsa->p; } - if (out_q != NULL) { + if (out_q != nullptr) { *out_q = rsa->q; } } -const RSA_PSS_PARAMS *RSA_get0_pss_params(const RSA *rsa) { - // We do not support the id-RSASSA-PSS key encoding. If we add support later, - // the |maskHash| field should be filled in for OpenSSL compatibility. - return NULL; -} - void RSA_get0_crt_params(const RSA *rsa, const BIGNUM **out_dmp1, const BIGNUM **out_dmq1, const BIGNUM **out_iqmp) { - if (out_dmp1 != NULL) { + if (out_dmp1 != nullptr) { *out_dmp1 = rsa->dmp1; } - if (out_dmq1 != NULL) { + if (out_dmq1 != nullptr) { *out_dmq1 = rsa->dmq1; } - if (out_iqmp != NULL) { + if (out_iqmp != nullptr) { *out_iqmp = rsa->iqmp; } } int RSA_set0_key(RSA *rsa, BIGNUM *n, BIGNUM *e, BIGNUM *d) { - if ((rsa->n == NULL && n == NULL) || (rsa->e == NULL && e == NULL)) { + if ((rsa->n == nullptr && n == nullptr) || + (rsa->e == nullptr && e == nullptr)) { return 0; } - if (n != NULL) { + if (n != nullptr) { BN_free(rsa->n); rsa->n = n; } - if (e != NULL) { + if (e != nullptr) { BN_free(rsa->e); rsa->e = e; } - if (d != NULL) { + if (d != nullptr) { BN_free(rsa->d); rsa->d = d; } @@ -318,15 +315,16 @@ int RSA_set0_key(RSA *rsa, BIGNUM *n, BIGNUM *e, BIGNUM *d) { } int RSA_set0_factors(RSA *rsa, BIGNUM *p, BIGNUM *q) { - if ((rsa->p == NULL && p == NULL) || (rsa->q == NULL && q == NULL)) { + if ((rsa->p == nullptr && p == nullptr) || + (rsa->q == nullptr && q == nullptr)) { return 0; } - if (p != NULL) { + if (p != nullptr) { BN_free(rsa->p); rsa->p = p; } - if (q != NULL) { + if (q != nullptr) { BN_free(rsa->q); rsa->q = q; } @@ -336,21 +334,21 @@ int RSA_set0_factors(RSA *rsa, BIGNUM *p, BIGNUM *q) { } int RSA_set0_crt_params(RSA *rsa, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp) { - if ((rsa->dmp1 == NULL && dmp1 == NULL) || - (rsa->dmq1 == NULL && dmq1 == NULL) || - (rsa->iqmp == NULL && iqmp == NULL)) { + if ((rsa->dmp1 == nullptr && dmp1 == nullptr) || + (rsa->dmq1 == nullptr && dmq1 == nullptr) || + (rsa->iqmp == nullptr && iqmp == nullptr)) { return 0; } - if (dmp1 != NULL) { + if (dmp1 != nullptr) { BN_free(rsa->dmp1); rsa->dmp1 = dmp1; } - if (dmq1 != NULL) { + if (dmq1 != nullptr) { BN_free(rsa->dmq1); rsa->dmq1 = dmq1; } - if (iqmp != NULL) { + if (iqmp != nullptr) { BN_free(rsa->iqmp); rsa->iqmp = iqmp; } @@ -425,35 +423,35 @@ static const struct pkcs1_sig_prefix kPKCS1SigPrefixes[] = { }, { NID_sha1, - BCM_SHA_DIGEST_LENGTH, + SHA_DIGEST_LENGTH, 15, {0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14}, }, { NID_sha224, - BCM_SHA224_DIGEST_LENGTH, + SHA224_DIGEST_LENGTH, 19, {0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, 0x00, 0x04, 0x1c}, }, { NID_sha256, - BCM_SHA256_DIGEST_LENGTH, + SHA256_DIGEST_LENGTH, 19, {0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20}, }, { NID_sha384, - BCM_SHA384_DIGEST_LENGTH, + SHA384_DIGEST_LENGTH, 19, {0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30}, }, { NID_sha512, - BCM_SHA512_DIGEST_LENGTH, + SHA512_DIGEST_LENGTH, 19, {0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40}, @@ -558,7 +556,7 @@ int rsa_sign_no_self_test(int hash_nid, const uint8_t *digest, const unsigned rsa_size = RSA_size(rsa); int ret = 0; - uint8_t *signed_msg = NULL; + uint8_t *signed_msg = nullptr; size_t signed_msg_len = 0; int signed_msg_is_alloced = 0; size_t size_t_out_len; @@ -603,7 +601,7 @@ int RSA_sign_pss_mgf1(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, size_t padded_len = RSA_size(rsa); uint8_t *padded = reinterpret_cast(OPENSSL_malloc(padded_len)); - if (padded == NULL) { + if (padded == nullptr) { return 0; } @@ -618,15 +616,15 @@ int RSA_sign_pss_mgf1(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, int rsa_verify_no_self_test(int hash_nid, const uint8_t *digest, size_t digest_len, const uint8_t *sig, size_t sig_len, RSA *rsa) { - if (rsa->n == NULL || rsa->e == NULL) { + if (rsa->n == nullptr || rsa->e == nullptr) { OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING); return 0; } const size_t rsa_size = RSA_size(rsa); - uint8_t *buf = NULL; + uint8_t *buf = nullptr; int ret = 0; - uint8_t *signed_msg = NULL; + uint8_t *signed_msg = nullptr; size_t signed_msg_len = 0, len; int signed_msg_is_alloced = 0; @@ -682,7 +680,7 @@ int RSA_verify_pss_mgf1(RSA *rsa, const uint8_t *digest, size_t digest_len, size_t em_len = RSA_size(rsa); uint8_t *em = reinterpret_cast(OPENSSL_malloc(em_len)); - if (em == NULL) { + if (em == nullptr) { return 0; } @@ -719,7 +717,7 @@ static int check_mod_inverse(int *out_ok, const BIGNUM *a, const BIGNUM *ainv, BIGNUM *tmp = BN_CTX_get(ctx); if (tmp == nullptr || // !bn_mul_consttime(tmp, a, ainv, ctx) || - !bn_div_consttime(NULL, tmp, tmp, m, m_min_bits, ctx)) { + !bn_div_consttime(nullptr, tmp, tmp, m, m_min_bits, ctx)) { return 0; } *out_ok = constant_time_declassify_int(BN_is_one(tmp)); @@ -737,27 +735,27 @@ int RSA_check_key(const RSA *key) { return 0; } - if ((key->p != NULL) != (key->q != NULL)) { + if ((key->p != nullptr) != (key->q != nullptr)) { OPENSSL_PUT_ERROR(RSA, RSA_R_ONLY_ONE_OF_P_Q_GIVEN); return 0; } // |key->d| must be bounded by |key->n|. This ensures bounds on |RSA_bits| // translate to bounds on the running time of private key operations. - if (key->d != NULL && + if (key->d != nullptr && (BN_is_negative(key->d) || BN_cmp(key->d, key->n) >= 0)) { OPENSSL_PUT_ERROR(RSA, RSA_R_D_OUT_OF_RANGE); return 0; } - if (key->d == NULL || key->p == NULL) { + if (key->d == nullptr || key->p == nullptr) { // For a public key, or without p and q, there's nothing that can be // checked. return 1; } BN_CTX *ctx = BN_CTX_new(); - if (ctx == NULL) { + if (ctx == nullptr) { return 0; } @@ -803,8 +801,8 @@ int RSA_check_key(const RSA *key) { pm1_bits = BN_num_bits(&pm1); qm1_bits = BN_num_bits(&qm1); if (!bn_mul_consttime(&de, key->d, key->e, ctx) || - !bn_div_consttime(NULL, &tmp, &de, &pm1, pm1_bits, ctx) || - !bn_div_consttime(NULL, &de, &de, &qm1, qm1_bits, ctx)) { + !bn_div_consttime(nullptr, &tmp, &de, &pm1, pm1_bits, ctx) || + !bn_div_consttime(nullptr, &de, &de, &qm1, qm1_bits, ctx)) { OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN); goto out; } @@ -815,9 +813,9 @@ int RSA_check_key(const RSA *key) { goto out; } - has_crt_values = key->dmp1 != NULL; - if (has_crt_values != (key->dmq1 != NULL) || - has_crt_values != (key->iqmp != NULL)) { + has_crt_values = key->dmp1 != nullptr; + if (has_crt_values != (key->dmq1 != nullptr) || + has_crt_values != (key->iqmp != nullptr)) { OPENSSL_PUT_ERROR(RSA, RSA_R_INCONSISTENT_SET_OF_CRT_VALUES); goto out; } @@ -875,8 +873,8 @@ static const BN_ULONG kSmallFactorsLimbs[] = {TOBN(0xc4309333, 0x3ef4e3e1), 0x000017b1}; DEFINE_LOCAL_DATA(BIGNUM, g_small_factors) { - out->d = (BN_ULONG *)kSmallFactorsLimbs; - out->width = OPENSSL_ARRAY_SIZE(kSmallFactorsLimbs); + out->d = const_cast(kSmallFactorsLimbs); + out->width = std::size(kSmallFactorsLimbs); out->dmax = out->width; out->neg = 0; out->flags = BN_FLG_STATIC_DATA; @@ -888,7 +886,7 @@ int RSA_check_fips(RSA *key) { } BN_CTX *ctx = BN_CTX_new(); - if (ctx == NULL) { + if (ctx == nullptr) { return 0; } @@ -915,7 +913,7 @@ int RSA_check_fips(RSA *key) { !BN_is_one(&small_gcd) || !BN_enhanced_miller_rabin_primality_test(&primality_result, key->n, BN_prime_checks_for_generation, - ctx, NULL) || + ctx, nullptr) || primality_result != bn_non_prime_power_composite) { OPENSSL_PUT_ERROR(RSA, RSA_R_PUBLIC_KEY_VALIDATION_FAILED); ret = 0; @@ -924,7 +922,7 @@ int RSA_check_fips(RSA *key) { BN_free(&small_gcd); BN_CTX_free(ctx); - if (!ret || key->d == NULL || key->p == NULL) { + if (!ret || key->d == nullptr || key->p == nullptr) { // On a failure or on only a public key, there's nothing else can be // checked. return ret; @@ -937,7 +935,7 @@ int RSA_check_fips(RSA *key) { uint8_t data[32] = {0}; unsigned sig_len = RSA_size(key); uint8_t *sig = reinterpret_cast(OPENSSL_malloc(sig_len)); - if (sig == NULL) { + if (sig == nullptr) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa_impl.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa_impl.cc.inc index d4c9bf8884..cd302b1893 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa_impl.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa_impl.cc.inc @@ -18,6 +18,8 @@ #include #include +#include + #include #include #include @@ -35,7 +37,7 @@ static_assert(OPENSSL_RSA_MAX_MODULUS_BITS <= "Max RSA size too big for Montgomery arithmetic"); int rsa_check_public_key(const RSA *rsa) { - if (rsa->n == NULL) { + if (rsa->n == nullptr) { OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING); return 0; } @@ -61,7 +63,7 @@ int rsa_check_public_key(const RSA *rsa) { } static const unsigned kMaxExponentBits = 33; - if (rsa->e != NULL) { + if (rsa->e != nullptr) { // Reject e = 1, negative e, and even e. e must be odd to be relatively // prime with phi(n). unsigned e_bits = BN_num_bits(rsa->e); @@ -104,11 +106,11 @@ int rsa_check_public_key(const RSA *rsa) { } static int ensure_fixed_copy(BIGNUM **out, const BIGNUM *in, int width) { - if (*out != NULL) { + if (*out != nullptr) { return 1; } BIGNUM *copy = BN_dup(in); - if (copy == NULL || !bn_resize_words(copy, width)) { + if (copy == nullptr || !bn_resize_words(copy, width)) { BN_free(copy); return 0; } @@ -149,9 +151,9 @@ static int freeze_private_key(RSA *rsa, BN_CTX *ctx) { // copies. We use |mont_n->N|, |mont_p->N|, and |mont_q->N| as copies of |n|, // |p|, and |q| with the correct minimal widths. - if (rsa->mont_n == NULL) { + if (rsa->mont_n == nullptr) { rsa->mont_n = BN_MONT_CTX_new_for_modulus(rsa->n, ctx); - if (rsa->mont_n == NULL) { + if (rsa->mont_n == nullptr) { goto err; } } @@ -161,32 +163,32 @@ static int freeze_private_key(RSA *rsa, BN_CTX *ctx) { // ASN.1 serialization of RSA private keys unfortunately leaks the byte length // of |rsa->d|, but normalize it so we only leak it once, rather than per // operation. - if (rsa->d != NULL && + if (rsa->d != nullptr && !ensure_fixed_copy(&rsa->d_fixed, rsa->d, n_fixed->width)) { goto err; } - if (rsa->e != NULL && rsa->p != NULL && rsa->q != NULL) { + if (rsa->e != nullptr && rsa->p != nullptr && rsa->q != nullptr) { // TODO: p and q are also CONSTTIME_SECRET but not yet marked as such // because the Montgomery code does things like test whether or not values // are zero. So the secret marking probably needs to happen inside that // code. - if (rsa->mont_p == NULL) { + if (rsa->mont_p == nullptr) { rsa->mont_p = BN_MONT_CTX_new_consttime(rsa->p, ctx); - if (rsa->mont_p == NULL) { + if (rsa->mont_p == nullptr) { goto err; } } - if (rsa->mont_q == NULL) { + if (rsa->mont_q == nullptr) { rsa->mont_q = BN_MONT_CTX_new_consttime(rsa->q, ctx); - if (rsa->mont_q == NULL) { + if (rsa->mont_q == nullptr) { goto err; } } - if (rsa->dmp1 != NULL && rsa->dmq1 != NULL && rsa->iqmp != NULL) { + if (rsa->dmp1 != nullptr && rsa->dmq1 != nullptr && rsa->iqmp != nullptr) { // CRT components are only publicly bounded by their corresponding // moduli's bit lengths. const BIGNUM *p_fixed = &rsa->mont_p->N; @@ -198,9 +200,9 @@ static int freeze_private_key(RSA *rsa, BN_CTX *ctx) { // Compute |iqmp_mont|, which is |iqmp| in Montgomery form and with the // correct bit width. - if (rsa->iqmp_mont == NULL) { + if (rsa->iqmp_mont == nullptr) { BIGNUM *iqmp_mont = BN_new(); - if (iqmp_mont == NULL || + if (iqmp_mont == nullptr || !BN_to_montgomery(iqmp_mont, rsa->iqmp, rsa->mont_p, ctx)) { BN_free(iqmp_mont); goto err; @@ -223,29 +225,29 @@ void rsa_invalidate_key(RSA *rsa) { rsa->private_key_frozen = 0; BN_MONT_CTX_free(rsa->mont_n); - rsa->mont_n = NULL; + rsa->mont_n = nullptr; BN_MONT_CTX_free(rsa->mont_p); - rsa->mont_p = NULL; + rsa->mont_p = nullptr; BN_MONT_CTX_free(rsa->mont_q); - rsa->mont_q = NULL; + rsa->mont_q = nullptr; BN_free(rsa->d_fixed); - rsa->d_fixed = NULL; + rsa->d_fixed = nullptr; BN_free(rsa->dmp1_fixed); - rsa->dmp1_fixed = NULL; + rsa->dmp1_fixed = nullptr; BN_free(rsa->dmq1_fixed); - rsa->dmq1_fixed = NULL; + rsa->dmq1_fixed = nullptr; BN_free(rsa->iqmp_mont); - rsa->iqmp_mont = NULL; + rsa->iqmp_mont = nullptr; for (size_t i = 0; i < rsa->num_blindings; i++) { BN_BLINDING_free(rsa->blindings[i]); } OPENSSL_free(rsa->blindings); - rsa->blindings = NULL; + rsa->blindings = nullptr; rsa->num_blindings = 0; OPENSSL_free(rsa->blindings_inuse); - rsa->blindings_inuse = NULL; + rsa->blindings_inuse = nullptr; rsa->blinding_fork_generation = 0; } @@ -268,10 +270,10 @@ void rsa_invalidate_key(RSA *rsa) { // |*index_used| and must be passed to |rsa_blinding_release| when finished. static BN_BLINDING *rsa_blinding_get(RSA *rsa, size_t *index_used, BN_CTX *ctx) { - assert(ctx != NULL); - assert(rsa->mont_n != NULL); + assert(ctx != nullptr); + assert(rsa->mont_n != nullptr); - BN_BLINDING *ret = NULL; + BN_BLINDING *ret = nullptr; const uint64_t fork_generation = CRYPTO_get_fork_generation(); CRYPTO_MUTEX_lock_write(&rsa->lock); @@ -292,7 +294,7 @@ static BN_BLINDING *rsa_blinding_get(RSA *rsa, size_t *index_used, size_t new_num_blindings; BN_BLINDING **new_blindings; uint8_t *new_blindings_inuse; - if (free_inuse_flag != NULL) { + if (free_inuse_flag != nullptr) { *free_inuse_flag = 1; *index_used = free_inuse_flag - rsa->blindings_inuse; ret = rsa->blindings[*index_used]; @@ -324,7 +326,7 @@ static BN_BLINDING *rsa_blinding_get(RSA *rsa, size_t *index_used, OPENSSL_calloc(new_num_blindings, sizeof(BN_BLINDING *))); new_blindings_inuse = reinterpret_cast(OPENSSL_malloc(new_num_blindings)); - if (new_blindings == NULL || new_blindings_inuse == NULL) { + if (new_blindings == nullptr || new_blindings_inuse == nullptr) { goto err; } @@ -334,7 +336,7 @@ static BN_BLINDING *rsa_blinding_get(RSA *rsa, size_t *index_used, for (size_t i = rsa->num_blindings; i < new_num_blindings; i++) { new_blindings[i] = BN_BLINDING_new(); - if (new_blindings[i] == NULL) { + if (new_blindings[i] == nullptr) { for (size_t j = rsa->num_blindings; j < i; j++) { BN_BLINDING_free(new_blindings[j]); } @@ -386,7 +388,7 @@ int rsa_default_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, const uint8_t *in, size_t in_len, int padding) { const unsigned rsa_size = RSA_size(rsa); - uint8_t *buf = NULL; + uint8_t *buf = nullptr; int i, ret = 0; if (max_out < rsa_size) { @@ -395,7 +397,7 @@ int rsa_default_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out, } buf = reinterpret_cast(OPENSSL_malloc(rsa_size)); - if (buf == NULL) { + if (buf == nullptr) { goto err; } @@ -435,7 +437,7 @@ static int rsa_mod_exp_crt(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx); int rsa_verify_raw_no_self_test(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, const uint8_t *in, size_t in_len, int padding) { - if (rsa->n == NULL || rsa->e == NULL) { + if (rsa->n == nullptr || rsa->e == nullptr) { OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING); return 0; } @@ -689,27 +691,27 @@ static int mod_montgomery(BIGNUM *r, const BIGNUM *I, const BIGNUM *p, // I * R mod p here and save a reduction per prime. But this would require // changing the RSAZ code and may not be worth it. Note that the RSAZ code // uses a different radix, so it uses R' = 2^1044. There we'd actually want - // R^2 * R', and would futher benefit from a precomputed R'^2. It currently + // R^2 * R', and would further benefit from a precomputed R'^2. It currently // converts |mont_p->RR| to R'^2. return 1; } static int rsa_mod_exp_crt(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) { - assert(ctx != NULL); + assert(ctx != nullptr); - assert(rsa->n != NULL); - assert(rsa->e != NULL); - assert(rsa->d != NULL); - assert(rsa->p != NULL); - assert(rsa->q != NULL); - assert(rsa->dmp1 != NULL); - assert(rsa->dmq1 != NULL); - assert(rsa->iqmp != NULL); + assert(rsa->n != nullptr); + assert(rsa->e != nullptr); + assert(rsa->d != nullptr); + assert(rsa->p != nullptr); + assert(rsa->q != nullptr); + assert(rsa->dmp1 != nullptr); + assert(rsa->dmq1 != nullptr); + assert(rsa->iqmp != nullptr); bssl::BN_CTXScope scope(ctx); BIGNUM *r1 = BN_CTX_get(ctx); BIGNUM *m1 = BN_CTX_get(ctx); - if (r1 == NULL || m1 == NULL) { + if (r1 == nullptr || m1 == nullptr) { return 0; } @@ -768,10 +770,10 @@ static int rsa_mod_exp_crt(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) { } static int ensure_bignum(BIGNUM **out) { - if (*out == NULL) { + if (*out == nullptr) { *out = BN_new(); } - return *out != NULL; + return *out != nullptr; } // kBoringSSLRSASqrtTwo is the BIGNUM representation of ⌊2²⁰⁴⁷×√2⌋. This is @@ -840,7 +842,7 @@ const BN_ULONG kBoringSSLRSASqrtTwo[] = { TOBN(0xed17ac85, 0x83339915), TOBN(0x1d6f60ba, 0x893ba84c), TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484), }; -const size_t kBoringSSLRSASqrtTwoLen = OPENSSL_ARRAY_SIZE(kBoringSSLRSASqrtTwo); +const size_t kBoringSSLRSASqrtTwoLen = std::size(kBoringSSLRSASqrtTwo); // generate_prime sets |out| to a prime with length |bits| such that |out|-1 is // relatively prime to |e|. If |p| is non-NULL, |out| will also not be close to @@ -898,7 +900,7 @@ static int generate_prime(BIGNUM *out, int bits, const BIGNUM *e, int tries = 0, rand_tries = 0; bssl::BN_CTXScope scope(ctx); BIGNUM *tmp = BN_CTX_get(ctx); - if (tmp == NULL) { + if (tmp == nullptr) { return 0; } @@ -911,7 +913,7 @@ static int generate_prime(BIGNUM *out, int bits, const BIGNUM *e, return 0; } - if (p != NULL) { + if (p != nullptr) { // If |p| and |out| are too close, try again (step 5.4). if (!bn_abs_sub_consttime(tmp, out, p, ctx)) { return 0; @@ -1164,13 +1166,13 @@ static int rsa_generate_key_impl(RSA *rsa, int bits, const BIGNUM *e_value, static void replace_bignum(BIGNUM **out, BIGNUM **in) { BN_free(*out); *out = *in; - *in = NULL; + *in = nullptr; } static void replace_bn_mont_ctx(BN_MONT_CTX **out, BN_MONT_CTX **in) { BN_MONT_CTX_free(*out); *out = *in; - *in = NULL; + *in = nullptr; } static int RSA_generate_key_ex_maybe_fips(RSA *rsa, int bits, @@ -1178,14 +1180,12 @@ static int RSA_generate_key_ex_maybe_fips(RSA *rsa, int bits, int check_fips) { boringssl_ensure_rsa_self_test(); - if (rsa == NULL) { + if (rsa == nullptr) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); return 0; } - RSA *tmp = NULL; - uint32_t err; - int ret = 0; + bssl::UniquePtr tmp; // |rsa_generate_key_impl|'s 2^-20 failure probability is too high at scale, // so we run the FIPS algorithm four times, bringing it down to 2^-80. We @@ -1195,27 +1195,25 @@ static int RSA_generate_key_ex_maybe_fips(RSA *rsa, int bits, do { ERR_clear_error(); // Generate into scratch space, to avoid leaving partial work on failure. - tmp = RSA_new(); - if (tmp == NULL) { - goto out; + tmp.reset(RSA_new()); + if (tmp == nullptr) { + return 0; } - if (rsa_generate_key_impl(tmp, bits, e_value, cb)) { + if (rsa_generate_key_impl(tmp.get(), bits, e_value, cb)) { break; } - err = ERR_peek_error(); - RSA_free(tmp); - tmp = NULL; + tmp = nullptr; failures++; // Only retry on |RSA_R_TOO_MANY_ITERATIONS|. This is so a caller-induced // failure in |BN_GENCB_call| is still fatal. - } while (failures < 4 && ERR_GET_LIB(err) == ERR_LIB_RSA && - ERR_GET_REASON(err) == RSA_R_TOO_MANY_ITERATIONS); + } while (failures < 4 && ERR_equals(ERR_peek_error(), ERR_LIB_RSA, + RSA_R_TOO_MANY_ITERATIONS)); - if (tmp == NULL || (check_fips && !RSA_check_fips(tmp))) { - goto out; + if (tmp == nullptr || (check_fips && !RSA_check_fips(tmp.get()))) { + return 0; } rsa_invalidate_key(rsa); @@ -1235,11 +1233,7 @@ static int RSA_generate_key_ex_maybe_fips(RSA *rsa, int bits, replace_bignum(&rsa->dmq1_fixed, &tmp->dmq1_fixed); replace_bignum(&rsa->iqmp_mont, &tmp->iqmp_mont); rsa->private_key_frozen = tmp->private_key_frozen; - ret = 1; - -out: - RSA_free(tmp); - return ret; + return 1; } int RSA_generate_key_ex(RSA *rsa, int bits, const BIGNUM *e_value, @@ -1259,7 +1253,7 @@ int RSA_generate_key_fips(RSA *rsa, int bits, BN_GENCB *cb) { } BIGNUM *e = BN_new(); - int ret = e != NULL && BN_set_word(e, RSA_F4) && + int ret = e != nullptr && BN_set_word(e, RSA_F4) && RSA_generate_key_ex_maybe_fips(rsa, bits, e, cb, /*check_fips=*/1); BN_free(e); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/self_check/fips.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/self_check/fips.cc.inc index d51983c7a3..65b0301b96 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/self_check/fips.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/self_check/fips.cc.inc @@ -67,8 +67,8 @@ int FIPS_query_algorithm_status(const char *algorithm) { "SHA2-512", "SHA2-512/256", }; - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kApprovedAlgorithms); i++) { - if (strcmp(algorithm, kApprovedAlgorithms[i]) == 0) { + for (const char *approved : kApprovedAlgorithms) { + if (strcmp(algorithm, approved) == 0) { return 1; } } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/self_check/self_check.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/self_check/self_check.cc.inc index b64c64b7d2..13b4e13e9a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/self_check/self_check.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/self_check/self_check.cc.inc @@ -17,6 +17,8 @@ #include #include +#include + #include #include #include @@ -75,8 +77,8 @@ int BORINGSSL_self_test(void) { return 0; } #else static int set_bignum(BIGNUM **out, const uint8_t *in, size_t len) { - *out = BN_bin2bn(in, len, NULL); - return *out != NULL; + *out = BN_bin2bn(in, len, nullptr); + return *out != nullptr; } static RSA *self_test_rsa_key(void) { @@ -196,7 +198,7 @@ static RSA *self_test_rsa_key(void) { }; RSA *rsa = RSA_new(); - if (rsa == NULL || // + if (rsa == nullptr || // !set_bignum(&rsa->n, kN, sizeof(kN)) || !set_bignum(&rsa->e, kE, sizeof(kE)) || !set_bignum(&rsa->d, kD, sizeof(kD)) || @@ -206,7 +208,7 @@ static RSA *self_test_rsa_key(void) { !set_bignum(&rsa->dmq1, kDModQMinusOne, sizeof(kDModQMinusOne)) || !set_bignum(&rsa->iqmp, kQInverseModP, sizeof(kQInverseModP))) { RSA_free(rsa); - return NULL; + return nullptr; } return rsa; @@ -230,15 +232,15 @@ static EC_KEY *self_test_ecdsa_key(void) { }; EC_KEY *ec_key = EC_KEY_new(); - BIGNUM *qx = BN_bin2bn(kQx, sizeof(kQx), NULL); - BIGNUM *qy = BN_bin2bn(kQy, sizeof(kQy), NULL); - BIGNUM *d = BN_bin2bn(kD, sizeof(kD), NULL); - if (ec_key == NULL || qx == NULL || qy == NULL || d == NULL || + BIGNUM *qx = BN_bin2bn(kQx, sizeof(kQx), nullptr); + BIGNUM *qy = BN_bin2bn(kQy, sizeof(kQy), nullptr); + BIGNUM *d = BN_bin2bn(kD, sizeof(kD), nullptr); + if (ec_key == nullptr || qx == nullptr || qy == nullptr || d == nullptr || !EC_KEY_set_group(ec_key, EC_group_p256()) || !EC_KEY_set_public_key_affine_coordinates(ec_key, qx, qy) || !EC_KEY_set_private_key(ec_key, d)) { EC_KEY_free(ec_key); - ec_key = NULL; + ec_key = nullptr; } BN_free(qx); @@ -250,7 +252,7 @@ static EC_KEY *self_test_ecdsa_key(void) { static DH *self_test_dh(void) { DH *dh = DH_get_rfc7919_2048(); if (!dh) { - return NULL; + return nullptr; } BIGNUM *priv = BN_new(); @@ -269,9 +271,9 @@ static DH *self_test_dh(void) { }; bn_set_static_words(priv, kFFDHE2048PrivateKeyData, - OPENSSL_ARRAY_SIZE(kFFDHE2048PrivateKeyData)); + std::size(kFFDHE2048PrivateKeyData)); - if (!DH_set0_key(dh, NULL, priv)) { + if (!DH_set0_key(dh, nullptr, priv)) { goto err; } return dh; @@ -279,7 +281,7 @@ static DH *self_test_dh(void) { err: BN_free(priv); DH_free(dh); - return NULL; + return nullptr; } @@ -294,7 +296,7 @@ static int boringssl_self_test_rsa(void) { uint8_t output[256]; RSA *const rsa_key = self_test_rsa_key(); - if (rsa_key == NULL) { + if (rsa_key == nullptr) { fprintf(CRYPTO_get_stderr(), "RSA key construction failed\n"); goto err; } @@ -391,18 +393,18 @@ err: static int boringssl_self_test_ecc(void) { int ret = 0; - EC_KEY *ec_key = NULL; - EC_POINT *ec_point_in = NULL; - EC_POINT *ec_point_out = NULL; - BIGNUM *ec_scalar = NULL; - const EC_GROUP *ec_group = NULL; + EC_KEY *ec_key = nullptr; + EC_POINT *ec_point_in = nullptr; + EC_POINT *ec_point_out = nullptr; + BIGNUM *ec_scalar = nullptr; + const EC_GROUP *ec_group = nullptr; // The 'k' value for ECDSA is fixed to avoid an entropy draw. uint8_t ecdsa_k[32] = {0}; ecdsa_k[31] = 42; ec_key = self_test_ecdsa_key(); - if (ec_key == NULL) { + if (ec_key == nullptr) { fprintf(CRYPTO_get_stderr(), "ECDSA KeyGen failed\n"); goto err; } @@ -489,14 +491,15 @@ static int boringssl_self_test_ecc(void) { ec_point_out = EC_POINT_new(ec_group); ec_scalar = BN_new(); uint8_t z_comp_result[65]; - if (ec_point_in == NULL || ec_point_out == NULL || ec_scalar == NULL || + if (ec_point_in == nullptr || ec_point_out == nullptr || + ec_scalar == nullptr || !EC_POINT_oct2point(ec_group, ec_point_in, kP256Point, sizeof(kP256Point), - NULL) || + nullptr) || !BN_bin2bn(kP256Scalar, sizeof(kP256Scalar), ec_scalar) || - !ec_point_mul_no_self_test(ec_group, ec_point_out, NULL, ec_point_in, - ec_scalar, NULL) || + !ec_point_mul_no_self_test(ec_group, ec_point_out, nullptr, ec_point_in, + ec_scalar, nullptr) || !EC_POINT_point2oct(ec_group, ec_point_out, POINT_CONVERSION_UNCOMPRESSED, - z_comp_result, sizeof(z_comp_result), NULL) || + z_comp_result, sizeof(z_comp_result), nullptr) || !BORINGSSL_check_test(kP256PointResult, z_comp_result, sizeof(z_comp_result), "Z Computation Result")) { fprintf(CRYPTO_get_stderr(), "Z-computation KAT failed.\n"); @@ -516,8 +519,8 @@ err: static int boringssl_self_test_ffdh(void) { int ret = 0; - DH *dh = NULL; - BIGNUM *ffdhe2048_value = NULL; + DH *dh = nullptr; + BIGNUM *ffdhe2048_value = nullptr; // FFC Diffie-Hellman KAT @@ -569,12 +572,13 @@ static int boringssl_self_test_ffdh(void) { ffdhe2048_value = BN_new(); if (ffdhe2048_value) { bn_set_static_words(ffdhe2048_value, kFFDHE2048PublicValueData, - OPENSSL_ARRAY_SIZE(kFFDHE2048PublicValueData)); + std::size(kFFDHE2048PublicValueData)); } dh = self_test_dh(); uint8_t dh_out[sizeof(kDHOutput)]; - if (dh == NULL || ffdhe2048_value == NULL || sizeof(dh_out) != DH_size(dh) || + if (dh == nullptr || ffdhe2048_value == nullptr || + sizeof(dh_out) != DH_size(dh) || dh_compute_key_padded_no_self_test(dh_out, ffdhe2048_value, dh) != sizeof(dh_out) || !BORINGSSL_check_test(kDHOutput, dh_out, sizeof(dh_out), "FFC DH")) { @@ -694,9 +698,9 @@ int boringssl_self_test_hmac_sha256(void) { uint8_t output[EVP_MAX_MD_SIZE]; unsigned output_len; - HMAC(EVP_sha256(), kInput, sizeof(kInput), kInput, sizeof(kInput), output, - &output_len); - return output_len == sizeof(kPlaintextHMACSHA256) && + return nullptr != HMAC(EVP_sha256(), kInput, sizeof(kInput), kInput, + sizeof(kInput), output, &output_len) && + output_len == sizeof(kPlaintextHMACSHA256) && BORINGSSL_check_test(kPlaintextHMACSHA256, output, sizeof(kPlaintextHMACSHA256), "HMAC-SHA-256 KAT"); } @@ -767,7 +771,7 @@ static int boringssl_self_test_fast(void) { OPENSSL_memset(nonce, 0, sizeof(nonce)); bssl::ScopedEVP_AEAD_CTX aead_ctx; if (!EVP_AEAD_CTX_init(aead_ctx.get(), EVP_aead_aes_128_gcm(), kAESKey, - sizeof(kAESKey), 0, NULL)) { + sizeof(kAESKey), 0, nullptr)) { fprintf(CRYPTO_get_stderr(), "EVP_AEAD_CTX_init for AES-128-GCM failed.\n"); return 0; } @@ -786,8 +790,8 @@ static int boringssl_self_test_fast(void) { }; if (!EVP_AEAD_CTX_seal(aead_ctx.get(), output, &out_len, sizeof(output), nonce, EVP_AEAD_nonce_length(EVP_aead_aes_128_gcm()), - kAESGCMEncPlaintext, sizeof(kAESGCMEncPlaintext), NULL, - 0) || + kAESGCMEncPlaintext, sizeof(kAESGCMEncPlaintext), + nullptr, 0) || !BORINGSSL_check_test(kAESGCMCiphertext, output, sizeof(kAESGCMCiphertext), "AES-GCM-encrypt KAT")) { fprintf(CRYPTO_get_stderr(), "EVP_AEAD_CTX_seal for AES-128-GCM failed.\n"); @@ -810,7 +814,7 @@ static int boringssl_self_test_fast(void) { if (!EVP_AEAD_CTX_open(aead_ctx.get(), output, &out_len, sizeof(output), nonce, EVP_AEAD_nonce_length(EVP_aead_aes_128_gcm()), kAESGCMDecCiphertext, sizeof(kAESGCMDecCiphertext), - NULL, 0) || + nullptr, 0) || !BORINGSSL_check_test(kAESGCMDecPlaintext, output, sizeof(kAESGCMDecPlaintext), "AES-GCM-decrypt KAT")) { @@ -840,11 +844,14 @@ static int boringssl_self_test_fast(void) { } // DBRG KAT - static const uint8_t kDRBGEntropy[48] = { - 0xc4, 0xda, 0x07, 0x40, 0xd5, 0x05, 0xf1, 0xee, 0x28, 0x0b, 0x95, 0xe5, - 0x8c, 0x49, 0x31, 0xac, 0x6d, 0xe8, 0x46, 0xa0, 0x15, 0x2f, 0xbb, 0x4a, - 0x3f, 0x17, 0x4c, 0xf4, 0x78, 0x7a, 0x4f, 0x1a, 0x40, 0xc2, 0xb5, 0x0b, - 0xab, 0xe1, 0x4a, 0xae, 0x53, 0x0b, 0xe5, 0x88, 0x6d, 0x91, 0x0a, 0x27, + static const uint8_t kDRBGEntropy[32] = { + 0xc4, 0xda, 0x07, 0x40, 0xd5, 0x05, 0xf1, 0xee, 0x28, 0x0b, 0x95, + 0xe5, 0x8c, 0x49, 0x31, 0xac, 0x6d, 0xe8, 0x46, 0xa0, 0x15, 0x2f, + 0xbb, 0x4a, 0x3f, 0x17, 0x4c, 0xf4, 0x78, 0x7a, 0x4f, 0x1a, + }; + static const uint8_t kDRBGNonce[CTR_DRBG_NONCE_LEN] = { + 0x40, 0xc2, 0xb5, 0x0b, 0xab, 0xe1, 0x4a, 0xae, + 0x53, 0x0b, 0xe5, 0x88, 0x6d, 0x91, 0x0a, 0x27, }; static const uint8_t kDRBGPersonalization[18] = { 'B', 'C', 'M', 'P', 'e', 'r', 's', 'o', 'n', @@ -852,12 +859,12 @@ static int boringssl_self_test_fast(void) { static const uint8_t kDRBGAD[16] = {'B', 'C', 'M', ' ', 'D', 'R', 'B', 'G', ' ', 'K', 'A', 'T', ' ', 'A', 'D', ' '}; static const uint8_t kDRBGOutput[64] = { - 0x19, 0x1f, 0x2b, 0x49, 0x76, 0x85, 0xfd, 0x51, 0xb6, 0x56, 0xbc, - 0x1c, 0x7d, 0xd5, 0xdd, 0x44, 0x76, 0xa3, 0x5e, 0x17, 0x9b, 0x8e, - 0xb8, 0x98, 0x65, 0x12, 0xca, 0x35, 0x6c, 0xa0, 0x6f, 0xa0, 0x22, - 0xe4, 0xf6, 0xd8, 0x43, 0xed, 0x4e, 0x2d, 0x97, 0x39, 0x43, 0x3b, - 0x57, 0xfc, 0x23, 0x3f, 0x71, 0x0a, 0xe0, 0xed, 0xfe, 0xd5, 0xb8, - 0x67, 0x7a, 0x00, 0x39, 0xb2, 0x6e, 0xa9, 0x25, 0x97, + 0x55, 0x88, 0x81, 0x88, 0x16, 0x49, 0x68, 0xd8, 0x23, 0xc8, 0x18, + 0x57, 0x5d, 0x06, 0xc3, 0x5f, 0x60, 0x3a, 0xe8, 0xfe, 0x7c, 0x7e, + 0x1c, 0x4a, 0x6a, 0xa8, 0x91, 0x07, 0xc0, 0x0d, 0x1f, 0x70, 0x4a, + 0xbb, 0x20, 0x42, 0xd3, 0x3f, 0x19, 0xf1, 0xb1, 0xfc, 0xef, 0xa1, + 0x71, 0xfd, 0xf7, 0xaf, 0xc5, 0x12, 0x7a, 0x98, 0xad, 0x42, 0xbc, + 0x01, 0xe6, 0xa2, 0x83, 0xbc, 0x73, 0xb5, 0xba, 0x84, }; static const uint8_t kDRBGEntropy2[48] = { 0xc7, 0x16, 0x1c, 0xa3, 0x6c, 0x23, 0x09, 0xb7, 0x16, 0xe9, 0x85, 0x9b, @@ -866,21 +873,23 @@ static int boringssl_self_test_fast(void) { 0x76, 0xc1, 0x86, 0xe9, 0x35, 0x18, 0x03, 0x76, 0x3a, 0x79, 0x12, 0xfe, }; static const uint8_t kDRBGReseedOutput[64] = { - 0x00, 0xf2, 0x05, 0xaa, 0xfd, 0x11, 0x6c, 0x77, 0xbc, 0x81, 0x86, - 0x99, 0xca, 0x51, 0xcf, 0x80, 0x15, 0x9f, 0x02, 0x9e, 0x0b, 0xcd, - 0x26, 0xc8, 0x4b, 0x87, 0x8a, 0x15, 0x1a, 0xdd, 0xf2, 0xf3, 0xeb, - 0x94, 0x0b, 0x08, 0xc8, 0xc9, 0x57, 0xa4, 0x0b, 0x4b, 0x0f, 0x13, - 0xde, 0x7c, 0x0c, 0x6a, 0xac, 0x34, 0x4a, 0x9a, 0xf2, 0xd0, 0x83, - 0x02, 0x05, 0x17, 0xc9, 0x81, 0x8f, 0x2a, 0x81, 0x92, + 0xda, 0x49, 0xa1, 0x01, 0x31, 0x71, 0x77, 0xde, 0xf6, 0x8d, 0xb5, + 0x4f, 0x86, 0x0d, 0xc8, 0xd6, 0x3c, 0xaa, 0xbc, 0x72, 0x0a, 0x9c, + 0x8b, 0x68, 0xa9, 0x70, 0xf1, 0x21, 0x13, 0xce, 0xc6, 0xbc, 0xff, + 0xaf, 0xa8, 0xd5, 0x26, 0x76, 0x26, 0xcc, 0x0d, 0x89, 0x66, 0xab, + 0xc2, 0x11, 0xa8, 0x2f, 0xf1, 0x36, 0xa3, 0x2b, 0x52, 0xcd, 0x1a, + 0x2d, 0xe4, 0x82, 0xac, 0x3c, 0xbb, 0xa9, 0x17, 0x90, }; CTR_DRBG_STATE drbg; - if (!CTR_DRBG_init(&drbg, kDRBGEntropy, kDRBGPersonalization, + if (!CTR_DRBG_init(&drbg, /*df=*/true, kDRBGEntropy, sizeof(kDRBGEntropy), + kDRBGNonce, kDRBGPersonalization, sizeof(kDRBGPersonalization)) || !CTR_DRBG_generate(&drbg, output, sizeof(kDRBGOutput), kDRBGAD, sizeof(kDRBGAD)) || !BORINGSSL_check_test(kDRBGOutput, output, sizeof(kDRBGOutput), "DRBG Generate KAT") || - !CTR_DRBG_reseed(&drbg, kDRBGEntropy2, kDRBGAD, sizeof(kDRBGAD)) || + !CTR_DRBG_reseed_ex(&drbg, kDRBGEntropy2, sizeof(kDRBGEntropy2), kDRBGAD, + sizeof(kDRBGAD)) || !CTR_DRBG_generate(&drbg, output, sizeof(kDRBGReseedOutput), kDRBGAD, sizeof(kDRBGAD)) || !BORINGSSL_check_test(kDRBGReseedOutput, output, diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/service_indicator/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/service_indicator/internal.h index 8495138598..ea58e64528 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/service_indicator/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/service_indicator/internal.h @@ -27,7 +27,7 @@ // |FIPS_service_indicator_before_call| is intended to be called immediately // before an approved service, while |FIPS_service_indicator_after_call| should // be called immediately after. If the values returned from these two functions -// are not equal, this means that the service called inbetween is deemed to be +// are not equal, this means that the service called in between is deemed to be // approved. If the values are still the same, this means the counter has not // been incremented, and the service called is not approved for FIPS. // diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/service_indicator/service_indicator.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/service_indicator/service_indicator.cc.inc index d7ace3a260..e1db7e957c 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/service_indicator/service_indicator.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/service_indicator/service_indicator.cc.inc @@ -38,7 +38,7 @@ struct fips_service_indicator_state { }; // service_indicator_get returns a pointer to the |fips_service_indicator_state| -// for the current thread. It returns NULL on error. +// for the current thread. It returns nullptr on error. // // FIPS 140-3 requires that the module should provide the service indicator // for approved services irrespective of whether the user queries it or not. @@ -48,11 +48,11 @@ static struct fips_service_indicator_state *service_indicator_get(void) { reinterpret_cast(CRYPTO_get_thread_local( OPENSSL_THREAD_LOCAL_FIPS_SERVICE_INDICATOR_STATE)); - if (indicator == NULL) { + if (indicator == nullptr) { indicator = reinterpret_cast( OPENSSL_malloc(sizeof(struct fips_service_indicator_state))); - if (indicator == NULL) { - return NULL; + if (indicator == nullptr) { + return nullptr; } indicator->lock_state = STATE_UNLOCKED; @@ -62,7 +62,7 @@ static struct fips_service_indicator_state *service_indicator_get(void) { OPENSSL_THREAD_LOCAL_FIPS_SERVICE_INDICATOR_STATE, indicator, OPENSSL_free)) { OPENSSL_PUT_ERROR(CRYPTO, ERR_R_INTERNAL_ERROR); - return NULL; + return nullptr; } } @@ -71,7 +71,7 @@ static struct fips_service_indicator_state *service_indicator_get(void) { static uint64_t service_indicator_get_counter(void) { struct fips_service_indicator_state *indicator = service_indicator_get(); - if (indicator == NULL) { + if (indicator == nullptr) { return 0; } return indicator->counter; @@ -94,7 +94,7 @@ void FIPS_service_indicator_update_state(void) { void FIPS_service_indicator_lock_state(void) { struct fips_service_indicator_state *indicator = service_indicator_get(); - if (indicator == NULL) { + if (indicator == nullptr) { return; } @@ -115,7 +115,7 @@ void FIPS_service_indicator_lock_state(void) { void FIPS_service_indicator_unlock_state(void) { struct fips_service_indicator_state *indicator = service_indicator_get(); - if (indicator == NULL) { + if (indicator == nullptr) { return; } @@ -185,7 +185,7 @@ static int is_md_fips_approved_for_verifying(int md_type) { static void evp_md_ctx_verify_service_indicator(const EVP_MD_CTX *ctx, int (*md_ok)(int md_type)) { - if (EVP_MD_CTX_get0_md(ctx) == NULL) { + if (EVP_MD_CTX_get0_md(ctx) == nullptr) { // Signature schemes without a prehash are currently never FIPS approved. return; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/sha/sha1.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/sha/sha1.cc.inc index 530ab93fe0..54e518c984 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/sha/sha1.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/sha/sha1.cc.inc @@ -47,7 +47,7 @@ bcm_infallible BCM_sha1_transform(SHA_CTX *c, const uint8_t data[SHA_CBLOCK]) { namespace { struct SHA1Traits { using HashContext = SHA_CTX; - static constexpr size_t kBlockSize = BCM_SHA_CBLOCK; + static constexpr size_t kBlockSize = SHA_CBLOCK; static constexpr bool kLengthIsBigEndian = true; static void HashBlocks(uint32_t *state, const uint8_t *data, size_t num_blocks) { @@ -184,7 +184,7 @@ bcm_infallible BCM_fips_186_2_prf(uint8_t *out, size_t out_len, #endif /* Originally X was an array. As it's automatic it's natural - * to expect RISC compiler to accomodate at least part of it in + * to expect RISC compiler to accommodate at least part of it in * the register bank, isn't it? Unfortunately not all compilers * "find" this expectation reasonable:-( On order to make such * compilers generate better code I replace X[] with a bunch of diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/sha/sha256.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/sha/sha256.cc.inc index a1a22a94b1..cba39c7659 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/sha/sha256.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/sha/sha256.cc.inc @@ -34,7 +34,7 @@ bcm_infallible BCM_sha224_init(SHA256_CTX *sha) { sha->h[5] = 0x68581511UL; sha->h[6] = 0x64f98fa7UL; sha->h[7] = 0xbefa4fa4UL; - sha->md_len = BCM_SHA224_DIGEST_LENGTH; + sha->md_len = SHA224_DIGEST_LENGTH; return bcm_infallible::approved; } @@ -48,7 +48,7 @@ bcm_infallible BCM_sha256_init(SHA256_CTX *sha) { sha->h[5] = 0x9b05688cUL; sha->h[6] = 0x1f83d9abUL; sha->h[7] = 0x5be0cd19UL; - sha->md_len = BCM_SHA256_DIGEST_LENGTH; + sha->md_len = SHA256_DIGEST_LENGTH; return bcm_infallible::approved; } @@ -58,7 +58,7 @@ static void sha256_block_data_order(uint32_t state[8], const uint8_t *in, #endif bcm_infallible BCM_sha256_transform(SHA256_CTX *c, - const uint8_t data[BCM_SHA256_CBLOCK]) { + const uint8_t data[SHA256_CBLOCK]) { sha256_block_data_order(c->h, data, 1); return bcm_infallible::approved; } @@ -66,7 +66,7 @@ bcm_infallible BCM_sha256_transform(SHA256_CTX *c, namespace { struct SHA256Traits { using HashContext = SHA256_CTX; - static constexpr size_t kBlockSize = BCM_SHA256_CBLOCK; + static constexpr size_t kBlockSize = SHA256_CBLOCK; static constexpr bool kLengthIsBigEndian = true; static void HashBlocks(uint32_t *state, const uint8_t *data, size_t num_blocks) { @@ -89,7 +89,7 @@ bcm_infallible BCM_sha224_update(SHA256_CTX *ctx, const void *data, static void sha256_final_impl(uint8_t *out, size_t md_len, SHA256_CTX *c) { bssl::crypto_md32_final(c); - BSSL_CHECK(md_len <= BCM_SHA256_DIGEST_LENGTH); + BSSL_CHECK(md_len <= SHA256_DIGEST_LENGTH); assert(md_len % 4 == 0); const size_t out_words = md_len / 4; @@ -101,23 +101,23 @@ static void sha256_final_impl(uint8_t *out, size_t md_len, SHA256_CTX *c) { FIPS_service_indicator_update_state(); } -bcm_infallible BCM_sha256_final(uint8_t out[BCM_SHA256_DIGEST_LENGTH], +bcm_infallible BCM_sha256_final(uint8_t out[SHA256_DIGEST_LENGTH], SHA256_CTX *c) { - // Ideally we would assert |sha->md_len| is |BCM_SHA256_DIGEST_LENGTH| to - // match the size hint, but calling code often pairs |SHA224_Init| with - // |SHA256_Final| and expects |sha->md_len| to carry the size over. + // Ideally we would assert |sha->md_len| is |SHA256_DIGEST_LENGTH| tomatch the + // size hint, but calling code often pairs |SHA224_Init| with |SHA256_Final| + // and expects |sha->md_len| to carry the size over. // // TODO(davidben): Add an assert and fix code to match them up. sha256_final_impl(out, c->md_len, c); return bcm_infallible::approved; } -bcm_infallible BCM_sha224_final(uint8_t out[BCM_SHA224_DIGEST_LENGTH], +bcm_infallible BCM_sha224_final(uint8_t out[SHA224_DIGEST_LENGTH], SHA256_CTX *ctx) { // This function must be paired with |SHA224_Init|, which sets |ctx->md_len| - // to |BCM_SHA224_DIGEST_LENGTH|. - assert(ctx->md_len == BCM_SHA224_DIGEST_LENGTH); - sha256_final_impl(out, BCM_SHA224_DIGEST_LENGTH, ctx); + // to |SHA224_DIGEST_LENGTH|. + assert(ctx->md_len == SHA224_DIGEST_LENGTH); + sha256_final_impl(out, SHA224_DIGEST_LENGTH, ctx); return bcm_infallible::approved; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/sha/sha512.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/sha/sha512.cc.inc index 0c46df1bad..5cfbb90d58 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/sha/sha512.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/sha/sha512.cc.inc @@ -43,7 +43,7 @@ bcm_infallible BCM_sha384_init(SHA512_CTX *sha) { sha->bytes_so_far_low = 0; sha->bytes_so_far_high = 0; sha->num = 0; - sha->md_len = BCM_SHA384_DIGEST_LENGTH; + sha->md_len = SHA384_DIGEST_LENGTH; return bcm_infallible::approved; } @@ -61,7 +61,7 @@ bcm_infallible BCM_sha512_init(SHA512_CTX *sha) { sha->bytes_so_far_low = 0; sha->bytes_so_far_high = 0; sha->num = 0; - sha->md_len = BCM_SHA512_DIGEST_LENGTH; + sha->md_len = SHA512_DIGEST_LENGTH; return bcm_infallible::approved; } @@ -78,7 +78,7 @@ bcm_infallible BCM_sha512_256_init(SHA512_CTX *sha) { sha->bytes_so_far_low = 0; sha->bytes_so_far_high = 0; sha->num = 0; - sha->md_len = BCM_SHA512_256_DIGEST_LENGTH; + sha->md_len = SHA512_256_DIGEST_LENGTH; return bcm_infallible::approved; } @@ -88,12 +88,12 @@ static void sha512_block_data_order(uint64_t state[8], const uint8_t *in, #endif -bcm_infallible BCM_sha384_final(uint8_t out[BCM_SHA384_DIGEST_LENGTH], +bcm_infallible BCM_sha384_final(uint8_t out[SHA384_DIGEST_LENGTH], SHA512_CTX *sha) { // This function must be paired with |BCM_sha384_init|, which sets - // |sha->md_len| to |BCM_SHA384_DIGEST_LENGTH|. - assert(sha->md_len == BCM_SHA384_DIGEST_LENGTH); - sha512_final_impl(out, BCM_SHA384_DIGEST_LENGTH, sha); + // |sha->md_len| to |SHA384_DIGEST_LENGTH|. + assert(sha->md_len == SHA384_DIGEST_LENGTH); + sha512_final_impl(out, SHA384_DIGEST_LENGTH, sha); return bcm_infallible::approved; } @@ -107,12 +107,12 @@ bcm_infallible BCM_sha512_256_update(SHA512_CTX *sha, const void *data, return BCM_sha512_update(sha, data, len); } -bcm_infallible BCM_sha512_256_final(uint8_t out[BCM_SHA512_256_DIGEST_LENGTH], +bcm_infallible BCM_sha512_256_final(uint8_t out[SHA512_256_DIGEST_LENGTH], SHA512_CTX *sha) { // This function must be paired with |BCM_sha512_256_init|, which sets - // |sha->md_len| to |BCM_SHA512_256_DIGEST_LENGTH|. - assert(sha->md_len == BCM_SHA512_256_DIGEST_LENGTH); - sha512_final_impl(out, BCM_SHA512_256_DIGEST_LENGTH, sha); + // |sha->md_len| to |SHA512_256_DIGEST_LENGTH|. + assert(sha->md_len == SHA512_256_DIGEST_LENGTH); + sha512_final_impl(out, SHA512_256_DIGEST_LENGTH, sha); return bcm_infallible::approved; } @@ -166,10 +166,10 @@ bcm_infallible BCM_sha512_update(SHA512_CTX *c, const void *in_data, return bcm_infallible::approved; } -bcm_infallible BCM_sha512_final(uint8_t out[BCM_SHA512_DIGEST_LENGTH], +bcm_infallible BCM_sha512_final(uint8_t out[SHA512_DIGEST_LENGTH], SHA512_CTX *sha) { - // Ideally we would assert |sha->md_len| is |BCM_SHA512_DIGEST_LENGTH| to - // match the size hint, but calling code often pairs |BCM_sha384_init| with + // Ideally we would assert |sha->md_len| is |SHA512_DIGEST_LENGTH| to match + // the size hint, but calling code often pairs |BCM_sha384_init| with // |BCM_sha512_final| and expects |sha->md_len| to carry the size over. // // TODO(davidben): Add an assert and fix code to match them up. diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/tls/kdf.cc.inc b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/tls/kdf.cc.inc index d29695e1a1..f83ace4517 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/tls/kdf.cc.inc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fipsmodule/tls/kdf.cc.inc @@ -45,11 +45,11 @@ static int tls1_P_hash(uint8_t *out, size_t out_len, HMAC_CTX_init(&ctx_tmp); HMAC_CTX_init(&ctx_init); - if (!HMAC_Init_ex(&ctx_init, secret, secret_len, md, NULL) || + if (!HMAC_Init_ex(&ctx_init, secret, secret_len, md, nullptr) || !HMAC_CTX_copy_ex(&ctx, &ctx_init) || - !HMAC_Update(&ctx, (const uint8_t *) label, label_len) || + !HMAC_Update(&ctx, (const uint8_t *)label, label_len) || !HMAC_Update(&ctx, seed1, seed1_len) || - !HMAC_Update(&ctx, seed2, seed2_len) || + !HMAC_Update(&ctx, seed2, seed2_len) || // !HMAC_Final(&ctx, A1, &A1_len)) { goto err; } @@ -148,7 +148,7 @@ int CRYPTO_tls13_hkdf_expand_label(uint8_t *out, size_t out_len, const uint8_t *hash, size_t hash_len) { static const uint8_t kProtocolLabel[] = "tls13 "; CBB cbb, child; - uint8_t *hkdf_label = NULL; + uint8_t *hkdf_label = nullptr; size_t hkdf_label_len; FIPS_service_indicator_lock_state(); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/fuzzer_mode.cc b/naiveproxy/src/third_party/boringssl/src/crypto/fuzzer_mode.cc index e741552a46..cec8e1d8b9 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/fuzzer_mode.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/fuzzer_mode.cc @@ -18,13 +18,11 @@ #if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) -static CRYPTO_atomic_u32 fuzzer_mode_enabled = 0; +static bssl::Atomic fuzzer_mode_enabled = 0; -int CRYPTO_fuzzer_mode_enabled(void) { - return CRYPTO_atomic_load_u32(&fuzzer_mode_enabled); -} +int CRYPTO_fuzzer_mode_enabled(void) { return fuzzer_mode_enabled.load(); } void CRYPTO_set_fuzzer_mode(int enabled) { - CRYPTO_atomic_store_u32(&fuzzer_mode_enabled, !!enabled); + fuzzer_mode_enabled.store(!!enabled); } #endif // FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/hpke/hpke.cc b/naiveproxy/src/third_party/boringssl/src/crypto/hpke/hpke.cc index 321f9db6e4..ace4328d94 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/hpke/hpke.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/hpke/hpke.cc @@ -26,10 +26,12 @@ #include #include #include +#include #include #include #include +#include "../fipsmodule/bcm_interface.h" #include "../fipsmodule/ec/internal.h" #include "../internal.h" @@ -142,7 +144,7 @@ static int dhkem_extract_and_expand(uint16_t kem_id, const EVP_MD *hkdf_md, static_cast(kem_id & 0xff)}; uint8_t prk[EVP_MAX_MD_SIZE]; size_t prk_len; - return hpke_labeled_extract(hkdf_md, prk, &prk_len, NULL, 0, suite_id, + return hpke_labeled_extract(hkdf_md, prk, &prk_len, nullptr, 0, suite_id, sizeof(suite_id), "eae_prk", dh, dh_len) && hpke_labeled_expand(hkdf_md, out_key, out_len, prk, prk_len, suite_id, sizeof(suite_id), "shared_secret", kem_context, @@ -371,7 +373,7 @@ static int p256_private_key_from_seed(uint8_t out_priv[P256_PRIVATE_KEY_LEN], uint8_t dkp_prk[32]; size_t dkp_prk_len; - if (!hpke_labeled_extract(EVP_sha256(), dkp_prk, &dkp_prk_len, NULL, 0, + if (!hpke_labeled_extract(EVP_sha256(), dkp_prk, &dkp_prk_len, nullptr, 0, suite_id, sizeof(suite_id), "dkp_prk", seed, P256_SEED_LEN)) { return 0; @@ -602,11 +604,11 @@ const EVP_HPKE_KEM *EVP_hpke_p256_hkdf_sha256(void) { return &kKEM; } -#define XWING_PRIVATE_KEY_LEN 32 -#define XWING_PUBLIC_KEY_LEN 1216 -#define XWING_PUBLIC_VALUE_LEN 1120 +#define XWING_PRIVATE_KEY_LEN XWING_PRIVATE_KEY_BYTES +#define XWING_PUBLIC_KEY_LEN XWING_PUBLIC_KEY_BYTES +#define XWING_PUBLIC_VALUE_LEN XWING_CIPHERTEXT_BYTES #define XWING_SEED_LEN 64 -#define XWING_SHARED_KEY_LEN 32 +#define XWING_SHARED_KEY_LEN XWING_SHARED_SECRET_BYTES static int xwing_init_key(EVP_HPKE_KEY *key, const uint8_t *priv_key, size_t priv_key_len) { @@ -718,6 +720,160 @@ const EVP_HPKE_KEM *EVP_hpke_xwing(void) { return &kKEM; } +namespace { + +template +struct MLKEMHPKE { + // These sizes are common across both ML-KEM-768 and ML-KEM-1024. + static constexpr size_t PRIVATE_KEY_LEN = MLKEM_SEED_BYTES; + static constexpr size_t SHARED_KEY_LEN = MLKEM_SHARED_SECRET_BYTES; + + static constexpr uint16_t ID = KEM_ID; + static constexpr size_t PUBLIC_KEY_LEN = PUBLIC_KEY_BYTES; + static constexpr size_t SEED_LEN = ENCAP_ENTROPY_BYTES; + static constexpr size_t ENC_LEN = CIPHERTEXT_BYTES; + + static int InitKey(EVP_HPKE_KEY *key, const uint8_t *priv_key, + size_t priv_key_len) { + PrivateKey expanded_private_key; + if (!PrivateKeyFromSeed(&expanded_private_key, priv_key, priv_key_len)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return 0; + } + PublicKey public_key; + PublicFromPrivate(&public_key, &expanded_private_key); + CBB cbb; + static_assert(sizeof(key->public_key) >= PUBLIC_KEY_BYTES, + "EVP_HPKE_KEY public_key is too small for ML-KEM."); + if (!CBB_init_fixed(&cbb, key->public_key, PUBLIC_KEY_BYTES) || + !MarshalPublicKey(&cbb, &public_key)) { + return 0; + } + + static_assert(sizeof(key->private_key) >= PRIVATE_KEY_LEN, + "EVP_HPKE_KEY private_key is too small for ML-KEM"); + OPENSSL_memcpy(key->private_key, priv_key, priv_key_len); + return 1; + } + + static int HpkeGenerateKey(EVP_HPKE_KEY *key) { + static_assert(sizeof(key->public_key) >= PUBLIC_KEY_BYTES, + "EVP_HPKE_KEY public_key is too small for ML-KEM."); + static_assert(sizeof(key->private_key) >= PRIVATE_KEY_LEN, + "EVP_HPKE_KEY private_key is too small for ML-KEM"); + PrivateKey expanded_private_key; + GenerateKey(key->public_key, key->private_key, &expanded_private_key); + + return 1; + } + + static int EncapWithSeed(const EVP_HPKE_KEM *kem, uint8_t *out_shared_secret, + size_t *out_shared_secret_len, uint8_t *out_enc, + size_t *out_enc_len, size_t max_enc, + const uint8_t *peer_public_key, + size_t peer_public_key_len, const uint8_t *seed, + size_t seed_len) { + if (max_enc < CIPHERTEXT_BYTES) { + OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_BUFFER_SIZE); + return 0; + } + if (peer_public_key_len != PUBLIC_KEY_BYTES || + seed_len != ENCAP_ENTROPY_BYTES) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return 0; + } + + CBS cbs; + CBS_init(&cbs, peer_public_key, peer_public_key_len); + PublicKey public_key; + if (!ParsePublicKey(&public_key, &cbs)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return 0; + } + // The public ML-KEM interface doesn't support providing the encap entropy + // so the BCM function is used here. + BCMEncapExternalEntropy(out_enc, out_shared_secret, &public_key, seed); + + *out_enc_len = CIPHERTEXT_BYTES; + *out_shared_secret_len = SHARED_KEY_LEN; + return 1; + } + + static int HpkeDecap(const EVP_HPKE_KEY *key, uint8_t *out_shared_secret, + size_t *out_shared_secret_len, const uint8_t *enc, + size_t enc_len) { + PrivateKey private_key; + if (!PrivateKeyFromSeed(&private_key, key->private_key, PRIVATE_KEY_LEN)) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + return 0; + } + + if (!Decap(out_shared_secret, enc, enc_len, &private_key)) { + OPENSSL_PUT_ERROR(EVP, ERR_R_INTERNAL_ERROR); + return 0; + } + + *out_shared_secret_len = SHARED_KEY_LEN; + return 1; + } +}; + +using MLKEM768HPKE = + MLKEMHPKE; + +using MLKEM1024HPKE = + MLKEMHPKE; + +template +static const EVP_HPKE_KEM kMLKEM = { + /*id=*/MLKEM::ID, + /*public_key_len=*/MLKEM::PUBLIC_KEY_LEN, + /*private_key_len=*/MLKEM::PRIVATE_KEY_LEN, + /*seed_len=*/MLKEM::SEED_LEN, + /*enc_len=*/MLKEM::ENC_LEN, + MLKEM::InitKey, + MLKEM::HpkeGenerateKey, + MLKEM::EncapWithSeed, + MLKEM::HpkeDecap, + // ML-KEM doesn't support authenticated encapsulation/decapsulation: + // https://datatracker.ietf.org/doc/draft-ietf-hpke-pq/01/ + /*auth_encap_with_seed=*/nullptr, + /*auth_decap=*/nullptr, +}; + +} // namespace + +const EVP_HPKE_KEM *EVP_hpke_mlkem768(void) { return &kMLKEM; } +const EVP_HPKE_KEM *EVP_hpke_mlkem1024(void) { return &kMLKEM; } + uint16_t EVP_HPKE_KEM_id(const EVP_HPKE_KEM *kem) { return kem->id; } size_t EVP_HPKE_KEM_public_key_len(const EVP_HPKE_KEM *kem) { @@ -742,15 +898,15 @@ void EVP_HPKE_KEY_cleanup(EVP_HPKE_KEY *key) { EVP_HPKE_KEY *EVP_HPKE_KEY_new(void) { EVP_HPKE_KEY *key = reinterpret_cast(OPENSSL_malloc(sizeof(EVP_HPKE_KEY))); - if (key == NULL) { - return NULL; + if (key == nullptr) { + return nullptr; } EVP_HPKE_KEY_zero(key); return key; } void EVP_HPKE_KEY_free(EVP_HPKE_KEY *key) { - if (key != NULL) { + if (key != nullptr) { EVP_HPKE_KEY_cleanup(key); OPENSSL_free(key); } @@ -776,7 +932,7 @@ int EVP_HPKE_KEY_init(EVP_HPKE_KEY *key, const EVP_HPKE_KEM *kem, EVP_HPKE_KEY_zero(key); key->kem = kem; if (!kem->init_key(key, priv_key, priv_key_len)) { - key->kem = NULL; + key->kem = nullptr; return 0; } return 1; @@ -786,7 +942,7 @@ int EVP_HPKE_KEY_generate(EVP_HPKE_KEY *key, const EVP_HPKE_KEM *kem) { EVP_HPKE_KEY_zero(key); key->kem = kem; if (!kem->generate_key(key)) { - key->kem = NULL; + key->kem = nullptr; return 0; } return 1; @@ -891,8 +1047,8 @@ static int hpke_key_schedule(EVP_HPKE_CTX *ctx, uint8_t mode, const EVP_MD *hkdf_md = ctx->kdf->hkdf_md_func(); uint8_t psk_id_hash[EVP_MAX_MD_SIZE]; size_t psk_id_hash_len; - if (!hpke_labeled_extract(hkdf_md, psk_id_hash, &psk_id_hash_len, NULL, 0, - suite_id, sizeof(suite_id), "psk_id_hash", NULL, + if (!hpke_labeled_extract(hkdf_md, psk_id_hash, &psk_id_hash_len, nullptr, 0, + suite_id, sizeof(suite_id), "psk_id_hash", nullptr, 0)) { return 0; } @@ -900,7 +1056,7 @@ static int hpke_key_schedule(EVP_HPKE_CTX *ctx, uint8_t mode, // info_hash = LabeledExtract("", "info_hash", info) uint8_t info_hash[EVP_MAX_MD_SIZE]; size_t info_hash_len; - if (!hpke_labeled_extract(hkdf_md, info_hash, &info_hash_len, NULL, 0, + if (!hpke_labeled_extract(hkdf_md, info_hash, &info_hash_len, nullptr, 0, suite_id, sizeof(suite_id), "info_hash", info, info_len)) { return 0; @@ -914,7 +1070,7 @@ static int hpke_key_schedule(EVP_HPKE_CTX *ctx, uint8_t mode, if (!CBB_add_u8(&context_cbb, mode) || !CBB_add_bytes(&context_cbb, psk_id_hash, psk_id_hash_len) || !CBB_add_bytes(&context_cbb, info_hash, info_hash_len) || - !CBB_finish(&context_cbb, NULL, &context_len)) { + !CBB_finish(&context_cbb, nullptr, &context_len)) { return 0; } @@ -923,7 +1079,7 @@ static int hpke_key_schedule(EVP_HPKE_CTX *ctx, uint8_t mode, size_t secret_len; if (!hpke_labeled_extract(hkdf_md, secret, &secret_len, shared_secret, shared_secret_len, suite_id, sizeof(suite_id), - "secret", NULL, 0)) { + "secret", nullptr, 0)) { return 0; } @@ -934,7 +1090,7 @@ static int hpke_key_schedule(EVP_HPKE_CTX *ctx, uint8_t mode, if (!hpke_labeled_expand(hkdf_md, key, kKeyLen, secret, secret_len, suite_id, sizeof(suite_id), "key", context, context_len) || !EVP_AEAD_CTX_init(&ctx->aead_ctx, aead, key, kKeyLen, - EVP_AEAD_DEFAULT_TAG_LENGTH, NULL)) { + EVP_AEAD_DEFAULT_TAG_LENGTH, nullptr)) { return 0; } @@ -968,15 +1124,15 @@ void EVP_HPKE_CTX_cleanup(EVP_HPKE_CTX *ctx) { EVP_HPKE_CTX *EVP_HPKE_CTX_new(void) { EVP_HPKE_CTX *ctx = reinterpret_cast(OPENSSL_malloc(sizeof(EVP_HPKE_CTX))); - if (ctx == NULL) { - return NULL; + if (ctx == nullptr) { + return nullptr; } EVP_HPKE_CTX_zero(ctx); return ctx; } void EVP_HPKE_CTX_free(EVP_HPKE_CTX *ctx) { - if (ctx != NULL) { + if (ctx != nullptr) { EVP_HPKE_CTX_cleanup(ctx); OPENSSL_free(ctx); } @@ -1060,7 +1216,7 @@ int EVP_HPKE_CTX_setup_auth_sender_with_seed_for_testing( const uint8_t *peer_public_key, size_t peer_public_key_len, const uint8_t *info, size_t info_len, const uint8_t *seed, size_t seed_len) { - if (key->kem->auth_encap_with_seed == NULL) { + if (key->kem->auth_encap_with_seed == nullptr) { // Not all HPKE KEMs support AuthEncap. OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); return 0; @@ -1089,7 +1245,7 @@ int EVP_HPKE_CTX_setup_auth_recipient( const EVP_HPKE_AEAD *aead, const uint8_t *enc, size_t enc_len, const uint8_t *info, size_t info_len, const uint8_t *peer_public_key, size_t peer_public_key_len) { - if (key->kem->auth_decap == NULL) { + if (key->kem->auth_decap == nullptr) { // Not all HPKE KEMs support AuthDecap. OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); return 0; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/hrss/hrss.cc b/naiveproxy/src/third_party/boringssl/src/crypto/hrss/hrss.cc index 35311ef274..ee4423c773 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/hrss/hrss.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/hrss/hrss.cc @@ -17,6 +17,8 @@ #include #include #include + +#include #include #include @@ -309,7 +311,7 @@ static crypto_word_t word_reverse(crypto_word_t in) { }; #endif - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kMasks); i++) { + for (size_t i = 0; i < std::size(kMasks); i++) { in = ((in >> (1 << i)) & kMasks[i]) | ((in & kMasks[i]) << (1 << i)); } @@ -1635,7 +1637,7 @@ static int poly_unmarshal(struct poly *out, const uint8_t in[POLY_BYTES]) { return 0; } - // Set the final coefficient as specifed in [HRSSNIST] 1.9.2 step 6. + // Set the final coefficient as specified in [HRSSNIST] 1.9.2 step 6. uint32_t sum = 0; for (size_t i = 0; i < N - 1; i++) { sum += out->v[i]; @@ -1883,8 +1885,8 @@ static struct private_key *private_key_from_external( static void *malloc_align32(void **out_ptr, size_t size) { void *ptr = OPENSSL_malloc(size + 31); if (!ptr) { - *out_ptr = NULL; - return NULL; + *out_ptr = nullptr; + return nullptr; } *out_ptr = ptr; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/internal.h index e1dcf2235a..633e4faafe 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/internal.h @@ -23,6 +23,8 @@ #include #include +#include + #if defined(BORINGSSL_CONSTANT_TIME_VALIDATION) #include #endif @@ -44,6 +46,8 @@ #if defined(OPENSSL_THREADS) #include +#else +#include #endif #if defined(OPENSSL_WINDOWS_THREADS) @@ -104,8 +108,6 @@ typedef __uint128_t uint128_t; #endif #endif -#define OPENSSL_ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) - // GCC-like compilers indicate SSE2 with |__SSE2__|. MSVC leaves the caller to // know that x86_64 has SSE2, and uses _M_IX86_FP to indicate SSE2 on x86. // https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-170 @@ -403,8 +405,16 @@ static inline uint8_t constant_time_select_8(crypto_word_t mask, uint8_t a, // constant_time_select_int acts like |constant_time_select| but operates on // ints. static inline int constant_time_select_int(crypto_word_t mask, int a, int b) { - return (int)(constant_time_select_w(mask, (crypto_word_t)(a), - (crypto_word_t)(b))); + return static_cast(constant_time_select_w( + mask, static_cast(a), static_cast(b))); +} + +// constant_time_select_32 acts like |constant_time_select| but operates on +// 32-bit values. +static inline uint32_t constant_time_select_32(crypto_word_t mask, uint32_t a, + uint32_t b) { + return static_cast( + constant_time_select_w(mask, crypto_word_t{a}, crypto_word_t{b})); } // constant_time_conditional_memcpy copies |n| bytes from |src| to |dst| if @@ -524,58 +534,55 @@ OPENSSL_EXPORT void CRYPTO_once(CRYPTO_once_t *once, void (*init)(void)); // Atomics. // -// The following functions provide an API analogous to from C11 -// and abstract between a few variations on atomics we need to support. +// This is a thin wrapper over std::atomic because some embedded platforms do +// not support threads and don't provide a trivial std::atomic implementation. +// For now, this does not wrap std::memory_order. If we ever use non-default +// std::memory_order, we will need to wrap these too, or fix the embedded +// platforms to provide a no-op std::atomic. See https://crbug.com/442112336. +extern "C++" { +BSSL_NAMESPACE_BEGIN #if defined(OPENSSL_THREADS) - -using CRYPTO_atomic_u32 = std::atomic; - -static_assert(sizeof(CRYPTO_atomic_u32) == sizeof(uint32_t)); - -inline uint32_t CRYPTO_atomic_load_u32(const CRYPTO_atomic_u32 *val) { - return val->load(std::memory_order_seq_cst); -} - -inline bool CRYPTO_atomic_compare_exchange_weak_u32(CRYPTO_atomic_u32 *val, - uint32_t *expected, - uint32_t desired) { - return val->compare_exchange_weak( - *expected, desired, std::memory_order_seq_cst, std::memory_order_seq_cst); -} - -inline void CRYPTO_atomic_store_u32(CRYPTO_atomic_u32 *val, uint32_t desired) { - val->store(desired, std::memory_order_seq_cst); -} - +template +using Atomic = std::atomic; #else +template +class Atomic { + public: + static_assert(std::is_integral_v || std::is_pointer_v); -typedef uint32_t CRYPTO_atomic_u32; - -inline uint32_t CRYPTO_atomic_load_u32(CRYPTO_atomic_u32 *val) { return *val; } - -inline int CRYPTO_atomic_compare_exchange_weak_u32(CRYPTO_atomic_u32 *val, - uint32_t *expected, - uint32_t desired) { - if (*val != *expected) { - *expected = *val; - return 0; + Atomic() = default; + constexpr Atomic(T value) : value_(value) {} + Atomic(const Atomic &) = delete; + Atomic &operator=(const Atomic &) = delete; + T operator=(T value) { + value_ = value; + return value_; } - *val = desired; - return 1; -} -inline void CRYPTO_atomic_store_u32(CRYPTO_atomic_u32 *val, uint32_t desired) { - *val = desired; -} + T load() const { return value_; } + void store(T desired) { value_ = desired; } + bool compare_exchange_strong(T &expected, T desired) { + if (value_ != expected) { + expected = value_; + return false; + } + value_ = desired; + return true; + } + bool compare_exchange_weak(T &expected, T desired) { + return compare_exchange_strong(expected, desired); + } + + T exchange(T desired) { return std::exchange(value_, desired); } + + private: + T value_; +}; #endif - -// See the comment in the |__cplusplus| section above. -static_assert(sizeof(CRYPTO_atomic_u32) == sizeof(uint32_t), - "CRYPTO_atomic_u32 does not match uint32_t size"); -static_assert(alignof(CRYPTO_atomic_u32) == alignof(uint32_t), - "CRYPTO_atomic_u32 does not match uint32_t alignment"); +BSSL_NAMESPACE_END +} // extern "C++" // Reference counting. @@ -583,7 +590,7 @@ static_assert(alignof(CRYPTO_atomic_u32) == alignof(uint32_t), // CRYPTO_REFCOUNT_MAX is the value at which the reference count saturates. #define CRYPTO_REFCOUNT_MAX 0xffffffff -using CRYPTO_refcount_t = CRYPTO_atomic_u32; +using CRYPTO_refcount_t = bssl::Atomic; // CRYPTO_refcount_inc atomically increments the value at |*count| unless the // value would overflow. It's safe for multiple threads to concurrently call @@ -735,15 +742,15 @@ typedef struct { // final entry of |funcs|, or NULL if empty. CRYPTO_EX_DATA_FUNCS *funcs, *last; // num_funcs is the number of entries in |funcs|. - CRYPTO_atomic_u32 num_funcs; + bssl::Atomic num_funcs; // num_reserved is one if the ex_data index zero is reserved for legacy // |TYPE_get_app_data| functions. uint8_t num_reserved; } CRYPTO_EX_DATA_CLASS; -#define CRYPTO_EX_DATA_CLASS_INIT {CRYPTO_MUTEX_INIT, NULL, NULL, {}, 0} +#define CRYPTO_EX_DATA_CLASS_INIT {CRYPTO_MUTEX_INIT, nullptr, nullptr, {}, 0} #define CRYPTO_EX_DATA_CLASS_INIT_WITH_APP_DATA \ - {CRYPTO_MUTEX_INIT, NULL, NULL, {}, 1} + {CRYPTO_MUTEX_INIT, nullptr, nullptr, {}, 1} // CRYPTO_get_ex_new_index_ex allocates a new index for |ex_data_class|. Each // class of object should provide a wrapper function that uses the correct @@ -824,7 +831,7 @@ extern "C++" { static inline const void *OPENSSL_memchr(const void *s, int c, size_t n) { if (n == 0) { - return NULL; + return nullptr; } return memchr(s, c, n); @@ -832,7 +839,7 @@ static inline const void *OPENSSL_memchr(const void *s, int c, size_t n) { static inline void *OPENSSL_memchr(void *s, int c, size_t n) { if (n == 0) { - return NULL; + return nullptr; } return memchr(s, c, n); @@ -843,7 +850,7 @@ static inline void *OPENSSL_memchr(void *s, int c, size_t n) { static inline void *OPENSSL_memchr(const void *s, int c, size_t n) { if (n == 0) { - return NULL; + return nullptr; } return memchr(s, c, n); @@ -1087,7 +1094,7 @@ inline void boringssl_fips_inc_counter(enum fips_counter_t counter) {} #if defined(BORINGSSL_FIPS_BREAK_TESTS) inline int boringssl_fips_break_test(const char *test) { const char *const value = getenv("BORINGSSL_FIPS_BREAK_TEST"); - return value != NULL && strcmp(value, test) == 0; + return value != nullptr && strcmp(value, test) == 0; } #else inline int boringssl_fips_break_test(const char *test) { return 0; } @@ -1606,4 +1613,28 @@ static inline uint64_t CRYPTO_subc_u64(uint64_t x, uint64_t y, uint64_t borrow, #endif +BSSL_NAMESPACE_BEGIN +// Cleanup implements a custom scope guard, when the cleanup logic does not fit +// in a destructor. Usage: +// +// bssl::Cleanup cleanup = [&] { SomeCleanupWork(local_var); }; +template +class Cleanup { + public: + static_assert(std::is_invocable_v); + static_assert(std::is_same_v, void>); + + Cleanup(F func) : func_(func) {} + Cleanup(const Cleanup &) = delete; + Cleanup &operator=(const Cleanup &) = delete; + ~Cleanup() { func_(); } + + private: + F func_; +}; +template +Cleanup(F func) -> Cleanup; +BSSL_NAMESPACE_END + + #endif // OPENSSL_HEADER_CRYPTO_INTERNAL_H diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/kyber/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/kyber/internal.h index 59c80f7156..89475a9d6e 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/kyber/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/kyber/internal.h @@ -16,13 +16,122 @@ #define OPENSSL_HEADER_CRYPTO_KYBER_INTERNAL_H #include -#include #if defined(__cplusplus) extern "C" { #endif +// Kyber is the pre-standard version of ML-KEM. This was once exported as public +// API, but is now internal and only used by libssl. It will be removed entirely +// in the future. +// +// This implements the round-3 specification of Kyber, defined at +// https://pq-crystals.org/kyber/data/kyber-specification-round3-20210804.pdf + +// KYBER_public_key contains a Kyber768 public key. The contents of this +// object should never leave the address space since the format is unstable. +struct KYBER_public_key { + union { + uint8_t bytes[512 * (3 + 9) + 32 + 32]; + uint16_t alignment; + } opaque; +}; + +// KYBER_private_key contains a Kyber768 private key. The contents of this +// object should never leave the address space since the format is unstable. +struct KYBER_private_key { + union { + uint8_t bytes[512 * (3 + 3 + 9) + 32 + 32 + 32]; + uint16_t alignment; + } opaque; +}; + +// KYBER_PUBLIC_KEY_BYTES is the number of bytes in an encoded Kyber768 public +// key. +#define KYBER_PUBLIC_KEY_BYTES 1184 + +// KYBER_SHARED_SECRET_BYTES is the number of bytes in the Kyber768 shared +// secret. Although the round-3 specification has a variable-length output, the +// final ML-KEM construction is expected to use a fixed 32-byte output. To +// simplify the future transition, we apply the same restriction. +#define KYBER_SHARED_SECRET_BYTES 32 + +// KYBER_generate_key generates a random public/private key pair, writes the +// encoded public key to |out_encoded_public_key| and sets |out_private_key| to +// the private key. +OPENSSL_EXPORT void KYBER_generate_key( + uint8_t out_encoded_public_key[KYBER_PUBLIC_KEY_BYTES], + struct KYBER_private_key *out_private_key); + +// KYBER_public_from_private sets |*out_public_key| to the public key that +// corresponds to |private_key|. (This is faster than parsing the output of +// |KYBER_generate_key| if, for some reason, you need to encapsulate to a key +// that was just generated.) +OPENSSL_EXPORT void KYBER_public_from_private( + struct KYBER_public_key *out_public_key, + const struct KYBER_private_key *private_key); + +// KYBER_CIPHERTEXT_BYTES is number of bytes in the Kyber768 ciphertext. +#define KYBER_CIPHERTEXT_BYTES 1088 + +// KYBER_encap encrypts a random shared secret for |public_key|, writes the +// ciphertext to |out_ciphertext|, and writes the random shared secret to +// |out_shared_secret|. +OPENSSL_EXPORT void KYBER_encap( + uint8_t out_ciphertext[KYBER_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[KYBER_SHARED_SECRET_BYTES], + const struct KYBER_public_key *public_key); + +// KYBER_decap decrypts a shared secret from |ciphertext| using |private_key| +// and writes it to |out_shared_secret|. If |ciphertext| is invalid, +// |out_shared_secret| is filled with a key that will always be the same for the +// same |ciphertext| and |private_key|, but which appears to be random unless +// one has access to |private_key|. These alternatives occur in constant time. +// Any subsequent symmetric encryption using |out_shared_secret| must use an +// authenticated encryption scheme in order to discover the decapsulation +// failure. +OPENSSL_EXPORT void KYBER_decap( + uint8_t out_shared_secret[KYBER_SHARED_SECRET_BYTES], + const uint8_t ciphertext[KYBER_CIPHERTEXT_BYTES], + const struct KYBER_private_key *private_key); + + +// Serialisation of keys. + +// KYBER_marshal_public_key serializes |public_key| to |out| in the standard +// format for Kyber public keys. It returns one on success or zero on allocation +// error. +OPENSSL_EXPORT int KYBER_marshal_public_key( + CBB *out, const struct KYBER_public_key *public_key); + +// KYBER_parse_public_key parses a public key, in the format generated by +// |KYBER_marshal_public_key|, from |in| and writes the result to +// |out_public_key|. It returns one on success or zero on parse error or if +// there are trailing bytes in |in|. +OPENSSL_EXPORT int KYBER_parse_public_key( + struct KYBER_public_key *out_public_key, CBS *in); + +// KYBER_marshal_private_key serializes |private_key| to |out| in the standard +// format for Kyber private keys. It returns one on success or zero on +// allocation error. +OPENSSL_EXPORT int KYBER_marshal_private_key( + CBB *out, const struct KYBER_private_key *private_key); + +// KYBER_PRIVATE_KEY_BYTES is the length of the data produced by +// |KYBER_marshal_private_key|. +#define KYBER_PRIVATE_KEY_BYTES 2400 + +// KYBER_parse_private_key parses a private key, in the format generated by +// |KYBER_marshal_private_key|, from |in| and writes the result to +// |out_private_key|. It returns one on success or zero on parse error or if +// there are trailing bytes in |in|. +OPENSSL_EXPORT int KYBER_parse_private_key( + struct KYBER_private_key *out_private_key, CBS *in); + + +// Internal symbols. + // KYBER_ENCAP_ENTROPY is the number of bytes of uniformly random entropy // necessary to encapsulate a secret. The entropy will be leaked to the // decapsulating party. diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/kyber/kyber.cc b/naiveproxy/src/third_party/boringssl/src/crypto/kyber/kyber.cc index 15eb65fde8..bcd52ab82a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/kyber/kyber.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/kyber/kyber.cc @@ -12,9 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -#define OPENSSL_UNSTABLE_EXPERIMENTAL_KYBER -#include - #include #include @@ -247,7 +244,7 @@ static void scalar_sub(scalar *lhs, const scalar *rhs) { // the 2*ith and (2*i+1)th entries of the scalar as elements of GF(3329)[X]/(X^2 // - 17^(2*bitreverse(i)+1)) The value of 17^(2*bitreverse(i)+1) mod 3329 is // stored in the precomputed |kModRoots| table. Note that our Barrett transform -// only allows us to multipy two reduced numbers together, so we need some +// only allows us to multiply two reduced numbers together, so we need some // intermediate reduction steps, even if an uint64_t could hold 3 multiplied // numbers. static void scalar_mult(scalar *out, const scalar *lhs, const scalar *rhs) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/lhash/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/lhash/internal.h index 5484880ce9..fe510eaf1b 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/lhash/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/lhash/internal.h @@ -187,7 +187,7 @@ OPENSSL_EXPORT void OPENSSL_lh_doall_arg(_LHASH *lh, \ inline int lh_##type##_insert(LHASH_OF(type) *lh, type **old_data, \ type *data) { \ - void *old_data_void = NULL; \ + void *old_data_void = nullptr; \ int ret = OPENSSL_lh_insert((_LHASH *)lh, &old_data_void, data, \ lh_##type##_call_hash_func, \ lh_##type##_call_cmp_func); \ diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/lhash/lhash.cc b/naiveproxy/src/third_party/boringssl/src/crypto/lhash/lhash.cc index 28fde70156..7fab7fa0b4 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/lhash/lhash.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/lhash/lhash.cc @@ -61,16 +61,16 @@ struct lhash_st { _LHASH *OPENSSL_lh_new(lhash_hash_func hash, lhash_cmp_func comp) { _LHASH *ret = reinterpret_cast<_LHASH *>(OPENSSL_zalloc(sizeof(_LHASH))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->num_buckets = kMinNumBuckets; ret->buckets = reinterpret_cast( OPENSSL_calloc(ret->num_buckets, sizeof(LHASH_ITEM *))); - if (ret->buckets == NULL) { + if (ret->buckets == nullptr) { OPENSSL_free(ret); - return NULL; + return nullptr; } ret->comp = comp; @@ -79,13 +79,13 @@ _LHASH *OPENSSL_lh_new(lhash_hash_func hash, lhash_cmp_func comp) { } void OPENSSL_lh_free(_LHASH *lh) { - if (lh == NULL) { + if (lh == nullptr) { return; } for (size_t i = 0; i < lh->num_buckets; i++) { LHASH_ITEM *next; - for (LHASH_ITEM *n = lh->buckets[i]; n != NULL; n = next) { + for (LHASH_ITEM *n = lh->buckets[i]; n != nullptr; n = next) { next = n->next; OPENSSL_free(n); } @@ -109,12 +109,12 @@ static LHASH_ITEM **get_next_ptr_and_hash(const _LHASH *lh, uint32_t *out_hash, lhash_hash_func_helper call_hash_func, lhash_cmp_func_helper call_cmp_func) { const uint32_t hash = call_hash_func(lh->hash, data); - if (out_hash != NULL) { + if (out_hash != nullptr) { *out_hash = hash; } LHASH_ITEM **ret = &lh->buckets[hash % lh->num_buckets]; - for (LHASH_ITEM *cur = *ret; cur != NULL; cur = *ret) { + for (LHASH_ITEM *cur = *ret; cur != nullptr; cur = *ret) { if (call_cmp_func(lh->comp, cur->data, data) == 0) { break; } @@ -131,7 +131,7 @@ static LHASH_ITEM **get_next_ptr_by_key(const _LHASH *lh, const void *key, int (*cmp_key)(const void *key, const void *value)) { LHASH_ITEM **ret = &lh->buckets[key_hash % lh->num_buckets]; - for (LHASH_ITEM *cur = *ret; cur != NULL; cur = *ret) { + for (LHASH_ITEM *cur = *ret; cur != nullptr; cur = *ret) { if (cmp_key(key, cur->data) == 0) { break; } @@ -145,8 +145,8 @@ void *OPENSSL_lh_retrieve(const _LHASH *lh, const void *data, lhash_hash_func_helper call_hash_func, lhash_cmp_func_helper call_cmp_func) { LHASH_ITEM **next_ptr = - get_next_ptr_and_hash(lh, NULL, data, call_hash_func, call_cmp_func); - return *next_ptr == NULL ? NULL : (*next_ptr)->data; + get_next_ptr_and_hash(lh, nullptr, data, call_hash_func, call_cmp_func); + return *next_ptr == nullptr ? nullptr : (*next_ptr)->data; } void *OPENSSL_lh_retrieve_key(const _LHASH *lh, const void *key, @@ -154,7 +154,7 @@ void *OPENSSL_lh_retrieve_key(const _LHASH *lh, const void *key, int (*cmp_key)(const void *key, const void *value)) { LHASH_ITEM **next_ptr = get_next_ptr_by_key(lh, key, key_hash, cmp_key); - return *next_ptr == NULL ? NULL : (*next_ptr)->data; + return *next_ptr == nullptr ? nullptr : (*next_ptr)->data; } // lh_rebucket allocates a new array of |new_num_buckets| pointers and @@ -170,12 +170,12 @@ static void lh_rebucket(_LHASH *lh, const size_t new_num_buckets) { } new_buckets = reinterpret_cast(OPENSSL_zalloc(alloc_size)); - if (new_buckets == NULL) { + if (new_buckets == nullptr) { return; } for (i = 0; i < lh->num_buckets; i++) { - for (cur = lh->buckets[i]; cur != NULL; cur = next) { + for (cur = lh->buckets[i]; cur != nullptr; cur = next) { const size_t new_bucket = cur->hash % new_num_buckets; next = cur->next; cur->next = new_buckets[new_bucket]; @@ -225,12 +225,12 @@ int OPENSSL_lh_insert(_LHASH *lh, void **old_data, void *data, uint32_t hash; LHASH_ITEM **next_ptr, *item; - *old_data = NULL; + *old_data = nullptr; next_ptr = get_next_ptr_and_hash(lh, &hash, data, call_hash_func, call_cmp_func); - if (*next_ptr != NULL) { + if (*next_ptr != nullptr) { // An element equal to |data| already exists in the hash table. It will be // replaced. *old_data = (*next_ptr)->data; @@ -240,13 +240,13 @@ int OPENSSL_lh_insert(_LHASH *lh, void **old_data, void *data, // An element equal to |data| doesn't exist in the hash table yet. item = reinterpret_cast(OPENSSL_malloc(sizeof(LHASH_ITEM))); - if (item == NULL) { + if (item == nullptr) { return 0; } item->data = data; item->hash = hash; - item->next = NULL; + item->next = nullptr; *next_ptr = item; lh->num_items++; lh_maybe_resize(lh); @@ -260,11 +260,11 @@ void *OPENSSL_lh_delete(_LHASH *lh, const void *data, LHASH_ITEM **next_ptr, *item, *ret; next_ptr = - get_next_ptr_and_hash(lh, NULL, data, call_hash_func, call_cmp_func); + get_next_ptr_and_hash(lh, nullptr, data, call_hash_func, call_cmp_func); - if (*next_ptr == NULL) { + if (*next_ptr == nullptr) { // No such element. - return NULL; + return nullptr; } item = *next_ptr; @@ -279,7 +279,7 @@ void *OPENSSL_lh_delete(_LHASH *lh, const void *data, } void OPENSSL_lh_doall_arg(_LHASH *lh, void (*func)(void *, void *), void *arg) { - if (lh == NULL) { + if (lh == nullptr) { return; } @@ -290,7 +290,7 @@ void OPENSSL_lh_doall_arg(_LHASH *lh, void (*func)(void *, void *), void *arg) { for (size_t i = 0; i < lh->num_buckets; i++) { LHASH_ITEM *next; - for (LHASH_ITEM *cur = lh->buckets[i]; cur != NULL; cur = next) { + for (LHASH_ITEM *cur = lh->buckets[i]; cur != nullptr; cur = next) { next = cur->next; func(cur->data, arg); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/mem.cc b/naiveproxy/src/third_party/boringssl/src/crypto/mem.cc index 83a1af7425..21faca6f67 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/mem.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/mem.cc @@ -63,7 +63,7 @@ static void __asan_unpoison_memory_region(const void *addr, size_t size) {} } #else #define WEAK_SYMBOL_FUNC(rettype, name, args) \ - static rettype(*const name) args = NULL; + static rettype(*const name) args = nullptr; #endif #if defined(BORINGSSL_DETECT_SDALLOCX) @@ -77,7 +77,7 @@ static void __asan_unpoison_memory_region(const void *addr, size_t size) {} // allocator with |sdallocx| is imported which does. WEAK_SYMBOL_FUNC(void, sdallocx, (void *ptr, size_t size, int flags)) #else -static void (*const sdallocx)(void *ptr, size_t size, int flags) = NULL; +static void (*const sdallocx)(void *ptr, size_t size, int flags) = nullptr; #endif // The following three functions can be defined to override default heap @@ -121,7 +121,7 @@ static void malloc_exit_handler(void) { static void init_malloc_failure(void) { const char *env = getenv("MALLOC_NUMBER_TO_FAIL"); - if (env != NULL && env[0] != 0) { + if (env != nullptr && env[0] != 0) { char *endptr; malloc_number_to_fail = strtoull(env, &endptr, 10); if (*endptr == 0) { @@ -129,7 +129,7 @@ static void init_malloc_failure(void) { atexit(malloc_exit_handler); } } - break_on_malloc_fail = getenv("MALLOC_BREAK_ON_FAIL") != NULL; + break_on_malloc_fail = getenv("MALLOC_BREAK_ON_FAIL") != nullptr; } // should_fail_allocation returns one if the current allocation should fail and @@ -188,11 +188,11 @@ void *OPENSSL_malloc(size_t size) { goto err; } - if (OPENSSL_memory_alloc != NULL) { - assert(OPENSSL_memory_free != NULL); - assert(OPENSSL_memory_get_size != NULL); + if (OPENSSL_memory_alloc != nullptr) { + assert(OPENSSL_memory_free != nullptr); + assert(OPENSSL_memory_get_size != nullptr); void *ptr2 = OPENSSL_memory_alloc(size); - if (ptr2 == NULL && size != 0) { + if (ptr2 == nullptr && size != 0) { goto err; } return ptr2; @@ -203,7 +203,7 @@ void *OPENSSL_malloc(size_t size) { } ptr = malloc(size + OPENSSL_MALLOC_PREFIX); - if (ptr == NULL) { + if (ptr == nullptr) { goto err; } @@ -215,12 +215,12 @@ void *OPENSSL_malloc(size_t size) { err: // This only works because ERR does not call OPENSSL_malloc. OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE); - return NULL; + return nullptr; } void *OPENSSL_zalloc(size_t size) { void *ret = OPENSSL_malloc(size); - if (ret != NULL) { + if (ret != nullptr) { OPENSSL_memset(ret, 0, size); } return ret; @@ -229,18 +229,18 @@ void *OPENSSL_zalloc(size_t size) { void *OPENSSL_calloc(size_t num, size_t size) { if (size != 0 && num > SIZE_MAX / size) { OPENSSL_PUT_ERROR(CRYPTO, ERR_R_OVERFLOW); - return NULL; + return nullptr; } return OPENSSL_zalloc(num * size); } void OPENSSL_free(void *orig_ptr) { - if (orig_ptr == NULL) { + if (orig_ptr == nullptr) { return; } - if (OPENSSL_memory_free != NULL) { + if (OPENSSL_memory_free != nullptr) { OPENSSL_memory_free(orig_ptr); return; } @@ -265,12 +265,12 @@ void OPENSSL_free(void *orig_ptr) { } void *OPENSSL_realloc(void *orig_ptr, size_t new_size) { - if (orig_ptr == NULL) { + if (orig_ptr == nullptr) { return OPENSSL_malloc(new_size); } size_t old_size; - if (OPENSSL_memory_get_size != NULL) { + if (OPENSSL_memory_get_size != nullptr) { old_size = OPENSSL_memory_get_size(orig_ptr); } else { void *ptr = ((uint8_t *)orig_ptr) - OPENSSL_MALLOC_PREFIX; @@ -280,8 +280,8 @@ void *OPENSSL_realloc(void *orig_ptr, size_t new_size) { } void *ret = OPENSSL_malloc(new_size); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } size_t to_copy = new_size; @@ -365,8 +365,8 @@ size_t OPENSSL_strnlen(const char *s, size_t len) { } char *OPENSSL_strdup(const char *s) { - if (s == NULL) { - return NULL; + if (s == nullptr) { + return nullptr; } // Copy the NUL terminator. return reinterpret_cast(OPENSSL_memdup(s, strlen(s) + 1)); @@ -462,11 +462,12 @@ int OPENSSL_vasprintf_internal(char **str, const char *format, va_list args, void (*deallocate)(void *) = system_malloc ? free : OPENSSL_free; void *(*reallocate)(void *, size_t) = system_malloc ? realloc : OPENSSL_realloc; - char *candidate = NULL; + char *candidate = nullptr; size_t candidate_len = 64; // TODO(bbe) what's the best initial size? int ret; - if ((candidate = reinterpret_cast(allocate(candidate_len))) == NULL) { + if ((candidate = reinterpret_cast(allocate(candidate_len))) == + nullptr) { goto err; } va_list args_copy; @@ -482,7 +483,7 @@ int OPENSSL_vasprintf_internal(char **str, const char *format, va_list args, candidate_len = (size_t)ret + 1; if ((tmp = reinterpret_cast( - reallocate(candidate, candidate_len))) == NULL) { + reallocate(candidate, candidate_len))) == nullptr) { goto err; } candidate = tmp; @@ -497,7 +498,7 @@ int OPENSSL_vasprintf_internal(char **str, const char *format, va_list args, err: deallocate(candidate); - *str = NULL; + *str = nullptr; errno = ENOMEM; return -1; } @@ -521,11 +522,11 @@ char *OPENSSL_strndup(const char *str, size_t size) { if (alloc_size < size) { // overflow OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE); - return NULL; + return nullptr; } char *ret = reinterpret_cast(OPENSSL_malloc(alloc_size)); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } OPENSSL_memcpy(ret, str, size); @@ -558,12 +559,12 @@ size_t OPENSSL_strlcat(char *dst, const char *src, size_t dst_size) { void *OPENSSL_memdup(const void *data, size_t size) { if (size == 0) { - return NULL; + return nullptr; } void *ret = OPENSSL_malloc(size); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } OPENSSL_memcpy(ret, data, size); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/mem_internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/mem_internal.h index 80d61bbbfe..5ba44dcf8d 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/mem_internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/mem_internal.h @@ -86,6 +86,8 @@ UniquePtr MakeUnique(Args &&...args) { template class Array { public: + using value_type = std::remove_cv_t; + // Array's default constructor creates an empty array. Array() {} Array(const Array &) = delete; @@ -377,6 +379,8 @@ using PackedSize = std::conditional_t< template class InplaceVector { public: + using value_type = std::remove_cv_t; + InplaceVector() = default; InplaceVector(const InplaceVector &other) { *this = other; } InplaceVector(InplaceVector &&other) { *this = std::move(other); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/mldsa/mldsa.cc b/naiveproxy/src/third_party/boringssl/src/crypto/mldsa/mldsa.cc index bbe4062b3c..7b7c6055ec 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/mldsa/mldsa.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/mldsa/mldsa.cc @@ -16,59 +16,26 @@ #include "../fipsmodule/bcm_interface.h" -static_assert(sizeof(BCM_mldsa65_private_key) == sizeof(MLDSA65_private_key)); -static_assert(alignof(BCM_mldsa65_private_key) == alignof(MLDSA65_private_key)); -static_assert(sizeof(BCM_mldsa65_public_key) == sizeof(MLDSA65_public_key)); -static_assert(alignof(BCM_mldsa65_public_key) == alignof(MLDSA65_public_key)); -static_assert(sizeof(BCM_mldsa65_prehash) == sizeof(MLDSA65_prehash)); -static_assert(alignof(BCM_mldsa65_prehash) == alignof(MLDSA65_prehash)); -static_assert(sizeof(BCM_mldsa87_private_key) == sizeof(MLDSA87_private_key)); -static_assert(alignof(BCM_mldsa87_private_key) == alignof(MLDSA87_private_key)); -static_assert(sizeof(BCM_mldsa87_public_key) == sizeof(MLDSA87_public_key)); -static_assert(alignof(BCM_mldsa87_public_key) == alignof(MLDSA87_public_key)); -static_assert(sizeof(BCM_mldsa87_prehash) == sizeof(MLDSA87_prehash)); -static_assert(alignof(BCM_mldsa87_prehash) == alignof(MLDSA87_prehash)); -static_assert(sizeof(BCM_mldsa44_private_key) == sizeof(MLDSA44_private_key)); -static_assert(alignof(BCM_mldsa44_private_key) == alignof(MLDSA44_private_key)); -static_assert(sizeof(BCM_mldsa44_public_key) == sizeof(MLDSA44_public_key)); -static_assert(alignof(BCM_mldsa44_public_key) == alignof(MLDSA44_public_key)); -static_assert(sizeof(BCM_mldsa44_prehash) == sizeof(MLDSA44_prehash)); -static_assert(alignof(BCM_mldsa44_prehash) == alignof(MLDSA44_prehash)); -static_assert(MLDSA_SEED_BYTES == BCM_MLDSA_SEED_BYTES); -static_assert(MLDSA_MU_BYTES == BCM_MLDSA_MU_BYTES); -static_assert(MLDSA65_PRIVATE_KEY_BYTES == BCM_MLDSA65_PRIVATE_KEY_BYTES); -static_assert(MLDSA65_PUBLIC_KEY_BYTES == BCM_MLDSA65_PUBLIC_KEY_BYTES); -static_assert(MLDSA65_SIGNATURE_BYTES == BCM_MLDSA65_SIGNATURE_BYTES); -static_assert(MLDSA87_PRIVATE_KEY_BYTES == BCM_MLDSA87_PRIVATE_KEY_BYTES); -static_assert(MLDSA87_PUBLIC_KEY_BYTES == BCM_MLDSA87_PUBLIC_KEY_BYTES); -static_assert(MLDSA87_SIGNATURE_BYTES == BCM_MLDSA87_SIGNATURE_BYTES); -static_assert(MLDSA44_PRIVATE_KEY_BYTES == BCM_MLDSA44_PRIVATE_KEY_BYTES); -static_assert(MLDSA44_PUBLIC_KEY_BYTES == BCM_MLDSA44_PUBLIC_KEY_BYTES); -static_assert(MLDSA44_SIGNATURE_BYTES == BCM_MLDSA44_SIGNATURE_BYTES); - int MLDSA65_generate_key( uint8_t out_encoded_public_key[MLDSA65_PUBLIC_KEY_BYTES], uint8_t out_seed[MLDSA_SEED_BYTES], struct MLDSA65_private_key *out_private_key) { - return bcm_success(BCM_mldsa65_generate_key( - out_encoded_public_key, out_seed, - reinterpret_cast(out_private_key))); + return bcm_success(BCM_mldsa65_generate_key(out_encoded_public_key, out_seed, + out_private_key)); } int MLDSA65_private_key_from_seed(struct MLDSA65_private_key *out_private_key, const uint8_t *seed, size_t seed_len) { - if (seed_len != BCM_MLDSA_SEED_BYTES) { + if (seed_len != MLDSA_SEED_BYTES) { return 0; } - return bcm_success(BCM_mldsa65_private_key_from_seed( - reinterpret_cast(out_private_key), seed)); + return bcm_success(BCM_mldsa65_private_key_from_seed(out_private_key, seed)); } int MLDSA65_public_from_private(struct MLDSA65_public_key *out_public_key, const struct MLDSA65_private_key *private_key) { - return bcm_success(BCM_mldsa65_public_from_private( - reinterpret_cast(out_public_key), - reinterpret_cast(private_key))); + return bcm_success( + BCM_mldsa65_public_from_private(out_public_key, private_key)); } int MLDSA65_sign(uint8_t out_encoded_signature[MLDSA65_SIGNATURE_BYTES], @@ -78,22 +45,19 @@ int MLDSA65_sign(uint8_t out_encoded_signature[MLDSA65_SIGNATURE_BYTES], if (context_len > 255) { return 0; } - return bcm_success(BCM_mldsa65_sign( - out_encoded_signature, - reinterpret_cast(private_key), msg, - msg_len, context, context_len)); + return bcm_success(BCM_mldsa65_sign(out_encoded_signature, private_key, msg, + msg_len, context, context_len)); } int MLDSA65_verify(const struct MLDSA65_public_key *public_key, const uint8_t *signature, size_t signature_len, const uint8_t *msg, size_t msg_len, const uint8_t *context, size_t context_len) { - if (context_len > 255 || signature_len != BCM_MLDSA65_SIGNATURE_BYTES) { + if (context_len > 255 || signature_len != MLDSA65_SIGNATURE_BYTES) { return 0; } - return bcm_success(BCM_mldsa65_verify( - reinterpret_cast(public_key), signature, - msg, msg_len, context, context_len)); + return bcm_success(BCM_mldsa65_verify(public_key, signature, msg, msg_len, + context, context_len)); } int MLDSA65_prehash_init(struct MLDSA65_prehash *out_state, @@ -102,23 +66,18 @@ int MLDSA65_prehash_init(struct MLDSA65_prehash *out_state, if (context_len > 255) { return 0; } - BCM_mldsa65_prehash_init( - reinterpret_cast(out_state), - reinterpret_cast(public_key), context, - context_len); + BCM_mldsa65_prehash_init(out_state, public_key, context, context_len); return 1; } void MLDSA65_prehash_update(struct MLDSA65_prehash *inout_state, const uint8_t *msg, size_t msg_len) { - BCM_mldsa65_prehash_update( - reinterpret_cast(inout_state), msg, msg_len); + BCM_mldsa65_prehash_update(inout_state, msg, msg_len); } void MLDSA65_prehash_finalize(uint8_t out_msg_rep[MLDSA_MU_BYTES], struct MLDSA65_prehash *inout_state) { - BCM_mldsa65_prehash_finalize( - out_msg_rep, reinterpret_cast(inout_state)); + BCM_mldsa65_prehash_finalize(out_msg_rep, inout_state); } int MLDSA65_sign_message_representative( @@ -126,44 +85,49 @@ int MLDSA65_sign_message_representative( const struct MLDSA65_private_key *private_key, const uint8_t msg_rep[MLDSA_MU_BYTES]) { return bcm_success(BCM_mldsa65_sign_message_representative( - out_encoded_signature, - reinterpret_cast(private_key), msg_rep)); + out_encoded_signature, private_key, msg_rep)); +} + +int MLDSA65_verify_message_representative( + const struct MLDSA65_public_key *public_key, + const uint8_t *signature, size_t signature_len, + const uint8_t msg_rep[MLDSA_MU_BYTES]) { + if (signature_len != MLDSA65_SIGNATURE_BYTES) { + return 0; + } + return bcm_success(BCM_mldsa65_verify_message_representative( + public_key, signature, msg_rep)); } int MLDSA65_marshal_public_key(CBB *out, const struct MLDSA65_public_key *public_key) { - return bcm_success(BCM_mldsa65_marshal_public_key( - out, reinterpret_cast(public_key))); + return bcm_success(BCM_mldsa65_marshal_public_key(out, public_key)); } int MLDSA65_parse_public_key(struct MLDSA65_public_key *public_key, CBS *in) { - return bcm_success(BCM_mldsa65_parse_public_key( - reinterpret_cast(public_key), in)); + return bcm_success(BCM_mldsa65_parse_public_key(public_key, in)); } int MLDSA87_generate_key( uint8_t out_encoded_public_key[MLDSA87_PUBLIC_KEY_BYTES], uint8_t out_seed[MLDSA_SEED_BYTES], struct MLDSA87_private_key *out_private_key) { - return bcm_success(BCM_mldsa87_generate_key( - out_encoded_public_key, out_seed, - reinterpret_cast(out_private_key))); + return bcm_success(BCM_mldsa87_generate_key(out_encoded_public_key, out_seed, + out_private_key)); } int MLDSA87_private_key_from_seed(struct MLDSA87_private_key *out_private_key, const uint8_t *seed, size_t seed_len) { - if (seed_len != BCM_MLDSA_SEED_BYTES) { + if (seed_len != MLDSA_SEED_BYTES) { return 0; } - return bcm_success(BCM_mldsa87_private_key_from_seed( - reinterpret_cast(out_private_key), seed)); + return bcm_success(BCM_mldsa87_private_key_from_seed(out_private_key, seed)); } int MLDSA87_public_from_private(struct MLDSA87_public_key *out_public_key, const struct MLDSA87_private_key *private_key) { - return bcm_success(BCM_mldsa87_public_from_private( - reinterpret_cast(out_public_key), - reinterpret_cast(private_key))); + return bcm_success( + BCM_mldsa87_public_from_private(out_public_key, private_key)); } int MLDSA87_sign(uint8_t out_encoded_signature[MLDSA87_SIGNATURE_BYTES], @@ -173,22 +137,19 @@ int MLDSA87_sign(uint8_t out_encoded_signature[MLDSA87_SIGNATURE_BYTES], if (context_len > 255) { return 0; } - return bcm_success(BCM_mldsa87_sign( - out_encoded_signature, - reinterpret_cast(private_key), msg, - msg_len, context, context_len)); + return bcm_success(BCM_mldsa87_sign(out_encoded_signature, private_key, msg, + msg_len, context, context_len)); } int MLDSA87_verify(const struct MLDSA87_public_key *public_key, const uint8_t *signature, size_t signature_len, const uint8_t *msg, size_t msg_len, const uint8_t *context, size_t context_len) { - if (context_len > 255 || signature_len != BCM_MLDSA87_SIGNATURE_BYTES) { + if (context_len > 255 || signature_len != MLDSA87_SIGNATURE_BYTES) { return 0; } - return bcm_success(BCM_mldsa87_verify( - reinterpret_cast(public_key), signature, - msg, msg_len, context, context_len)); + return bcm_success(BCM_mldsa87_verify(public_key, signature, msg, msg_len, + context, context_len)); } int MLDSA87_prehash_init(struct MLDSA87_prehash *out_state, @@ -197,23 +158,18 @@ int MLDSA87_prehash_init(struct MLDSA87_prehash *out_state, if (context_len > 255) { return 0; } - BCM_mldsa87_prehash_init( - reinterpret_cast(out_state), - reinterpret_cast(public_key), context, - context_len); + BCM_mldsa87_prehash_init(out_state, public_key, context, context_len); return 1; } void MLDSA87_prehash_update(struct MLDSA87_prehash *inout_state, const uint8_t *msg, size_t msg_len) { - BCM_mldsa87_prehash_update( - reinterpret_cast(inout_state), msg, msg_len); + BCM_mldsa87_prehash_update(inout_state, msg, msg_len); } void MLDSA87_prehash_finalize(uint8_t out_msg_rep[MLDSA_MU_BYTES], struct MLDSA87_prehash *inout_state) { - BCM_mldsa87_prehash_finalize( - out_msg_rep, reinterpret_cast(inout_state)); + BCM_mldsa87_prehash_finalize(out_msg_rep, inout_state); } int MLDSA87_sign_message_representative( @@ -221,44 +177,49 @@ int MLDSA87_sign_message_representative( const struct MLDSA87_private_key *private_key, const uint8_t msg_rep[MLDSA_MU_BYTES]) { return bcm_success(BCM_mldsa87_sign_message_representative( - out_encoded_signature, - reinterpret_cast(private_key), msg_rep)); + out_encoded_signature, private_key, msg_rep)); +} + +int MLDSA87_verify_message_representative( + const struct MLDSA87_public_key *public_key, + const uint8_t *signature, size_t signature_len, + const uint8_t msg_rep[MLDSA_MU_BYTES]) { + if (signature_len != MLDSA87_SIGNATURE_BYTES) { + return 0; + } + return bcm_success(BCM_mldsa87_verify_message_representative( + public_key, signature, msg_rep)); } int MLDSA87_marshal_public_key(CBB *out, const struct MLDSA87_public_key *public_key) { - return bcm_success(BCM_mldsa87_marshal_public_key( - out, reinterpret_cast(public_key))); + return bcm_success(BCM_mldsa87_marshal_public_key(out, public_key)); } int MLDSA87_parse_public_key(struct MLDSA87_public_key *public_key, CBS *in) { - return bcm_success(BCM_mldsa87_parse_public_key( - reinterpret_cast(public_key), in)); + return bcm_success(BCM_mldsa87_parse_public_key(public_key, in)); } int MLDSA44_generate_key( uint8_t out_encoded_public_key[MLDSA44_PUBLIC_KEY_BYTES], uint8_t out_seed[MLDSA_SEED_BYTES], struct MLDSA44_private_key *out_private_key) { - return bcm_success(BCM_mldsa44_generate_key( - out_encoded_public_key, out_seed, - reinterpret_cast(out_private_key))); + return bcm_success(BCM_mldsa44_generate_key(out_encoded_public_key, out_seed, + out_private_key)); } int MLDSA44_private_key_from_seed(struct MLDSA44_private_key *out_private_key, const uint8_t *seed, size_t seed_len) { - if (seed_len != BCM_MLDSA_SEED_BYTES) { + if (seed_len != MLDSA_SEED_BYTES) { return 0; } - return bcm_success(BCM_mldsa44_private_key_from_seed( - reinterpret_cast(out_private_key), seed)); + return bcm_success(BCM_mldsa44_private_key_from_seed(out_private_key, seed)); } int MLDSA44_public_from_private(struct MLDSA44_public_key *out_public_key, const struct MLDSA44_private_key *private_key) { - return bcm_success(BCM_mldsa44_public_from_private( - reinterpret_cast(out_public_key), - reinterpret_cast(private_key))); + return bcm_success( + BCM_mldsa44_public_from_private(out_public_key, private_key)); } int MLDSA44_sign(uint8_t out_encoded_signature[MLDSA44_SIGNATURE_BYTES], @@ -268,22 +229,19 @@ int MLDSA44_sign(uint8_t out_encoded_signature[MLDSA44_SIGNATURE_BYTES], if (context_len > 255) { return 0; } - return bcm_success(BCM_mldsa44_sign( - out_encoded_signature, - reinterpret_cast(private_key), msg, - msg_len, context, context_len)); + return bcm_success(BCM_mldsa44_sign(out_encoded_signature, private_key, msg, + msg_len, context, context_len)); } int MLDSA44_verify(const struct MLDSA44_public_key *public_key, const uint8_t *signature, size_t signature_len, const uint8_t *msg, size_t msg_len, const uint8_t *context, size_t context_len) { - if (context_len > 255 || signature_len != BCM_MLDSA44_SIGNATURE_BYTES) { + if (context_len > 255 || signature_len != MLDSA44_SIGNATURE_BYTES) { return 0; } - return bcm_success(BCM_mldsa44_verify( - reinterpret_cast(public_key), signature, - msg, msg_len, context, context_len)); + return bcm_success(BCM_mldsa44_verify(public_key, signature, msg, msg_len, + context, context_len)); } int MLDSA44_prehash_init(struct MLDSA44_prehash *out_state, @@ -292,23 +250,18 @@ int MLDSA44_prehash_init(struct MLDSA44_prehash *out_state, if (context_len > 255) { return 0; } - BCM_mldsa44_prehash_init( - reinterpret_cast(out_state), - reinterpret_cast(public_key), context, - context_len); + BCM_mldsa44_prehash_init(out_state, public_key, context, context_len); return 1; } void MLDSA44_prehash_update(struct MLDSA44_prehash *inout_state, const uint8_t *msg, size_t msg_len) { - BCM_mldsa44_prehash_update( - reinterpret_cast(inout_state), msg, msg_len); + BCM_mldsa44_prehash_update(inout_state, msg, msg_len); } void MLDSA44_prehash_finalize(uint8_t out_msg_rep[MLDSA_MU_BYTES], struct MLDSA44_prehash *inout_state) { - BCM_mldsa44_prehash_finalize( - out_msg_rep, reinterpret_cast(inout_state)); + BCM_mldsa44_prehash_finalize(out_msg_rep, inout_state); } int MLDSA44_sign_message_representative( @@ -316,17 +269,25 @@ int MLDSA44_sign_message_representative( const struct MLDSA44_private_key *private_key, const uint8_t msg_rep[MLDSA_MU_BYTES]) { return bcm_success(BCM_mldsa44_sign_message_representative( - out_encoded_signature, - reinterpret_cast(private_key), msg_rep)); + out_encoded_signature, private_key, msg_rep)); +} + +int MLDSA44_verify_message_representative( + const struct MLDSA44_public_key *public_key, + const uint8_t *signature, size_t signature_len, + const uint8_t msg_rep[MLDSA_MU_BYTES]) { + if (signature_len != MLDSA44_SIGNATURE_BYTES) { + return 0; + } + return bcm_success(BCM_mldsa44_verify_message_representative( + public_key, signature, msg_rep)); } int MLDSA44_marshal_public_key(CBB *out, const struct MLDSA44_public_key *public_key) { - return bcm_success(BCM_mldsa44_marshal_public_key( - out, reinterpret_cast(public_key))); + return bcm_success(BCM_mldsa44_marshal_public_key(out, public_key)); } int MLDSA44_parse_public_key(struct MLDSA44_public_key *public_key, CBS *in) { - return bcm_success(BCM_mldsa44_parse_public_key( - reinterpret_cast(public_key), in)); + return bcm_success(BCM_mldsa44_parse_public_key(public_key, in)); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/mlkem/mlkem.cc b/naiveproxy/src/third_party/boringssl/src/crypto/mlkem/mlkem.cc index 3b7cb46664..505414be59 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/mlkem/mlkem.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/mlkem/mlkem.cc @@ -17,128 +17,90 @@ #include "../fipsmodule/bcm_interface.h" -static_assert(sizeof(BCM_mlkem768_private_key) <= sizeof(MLKEM768_private_key)); -static_assert(alignof(BCM_mlkem768_private_key) <= - alignof(MLKEM768_private_key)); -static_assert(sizeof(BCM_mlkem768_public_key) <= sizeof(MLKEM768_public_key)); -static_assert(alignof(BCM_mlkem768_public_key) <= alignof(MLKEM768_public_key)); -static_assert(MLKEM768_PUBLIC_KEY_BYTES == BCM_MLKEM768_PUBLIC_KEY_BYTES); -static_assert(MLKEM_SEED_BYTES == BCM_MLKEM_SEED_BYTES); -static_assert(MLKEM768_CIPHERTEXT_BYTES == BCM_MLKEM768_CIPHERTEXT_BYTES); -static_assert(MLKEM_SHARED_SECRET_BYTES == BCM_MLKEM_SHARED_SECRET_BYTES); -static_assert(MLKEM1024_PUBLIC_KEY_BYTES == BCM_MLKEM1024_PUBLIC_KEY_BYTES); -static_assert(MLKEM1024_CIPHERTEXT_BYTES == BCM_MLKEM1024_CIPHERTEXT_BYTES); - void MLKEM768_generate_key( uint8_t out_encoded_public_key[MLKEM768_PUBLIC_KEY_BYTES], uint8_t optional_out_seed[MLKEM_SEED_BYTES], struct MLKEM768_private_key *out_private_key) { - BCM_mlkem768_generate_key( - out_encoded_public_key, optional_out_seed, - reinterpret_cast(out_private_key)); + BCM_mlkem768_generate_key(out_encoded_public_key, optional_out_seed, + out_private_key); } int MLKEM768_private_key_from_seed(struct MLKEM768_private_key *out_private_key, const uint8_t *seed, size_t seed_len) { - return bcm_success(BCM_mlkem768_private_key_from_seed( - reinterpret_cast(out_private_key), seed, - seed_len)); + return bcm_success( + BCM_mlkem768_private_key_from_seed(out_private_key, seed, seed_len)); } void MLKEM768_public_from_private( struct MLKEM768_public_key *out_public_key, const struct MLKEM768_private_key *private_key) { - (void)BCM_mlkem768_public_from_private( - reinterpret_cast(out_public_key), - reinterpret_cast(private_key)); + (void)BCM_mlkem768_public_from_private(out_public_key, private_key); } void MLKEM768_encap(uint8_t out_ciphertext[MLKEM768_CIPHERTEXT_BYTES], uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], const struct MLKEM768_public_key *public_key) { - (void)BCM_mlkem768_encap( - out_ciphertext, out_shared_secret, - reinterpret_cast(public_key)); + (void)BCM_mlkem768_encap(out_ciphertext, out_shared_secret, public_key); } int MLKEM768_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], const uint8_t *ciphertext, size_t ciphertext_len, const struct MLKEM768_private_key *private_key) { - return bcm_success(BCM_mlkem768_decap( - out_shared_secret, ciphertext, ciphertext_len, - reinterpret_cast(private_key))); + return bcm_success(BCM_mlkem768_decap(out_shared_secret, ciphertext, + ciphertext_len, private_key)); } int MLKEM768_marshal_public_key(CBB *out, const struct MLKEM768_public_key *public_key) { - return bcm_success(BCM_mlkem768_marshal_public_key( - out, reinterpret_cast(public_key))); + return bcm_success(BCM_mlkem768_marshal_public_key(out, public_key)); } int MLKEM768_parse_public_key(struct MLKEM768_public_key *out_public_key, CBS *in) { - return bcm_success(BCM_mlkem768_parse_public_key( - reinterpret_cast(out_public_key), in)); + return bcm_success(BCM_mlkem768_parse_public_key(out_public_key, in)); } -static_assert(sizeof(BCM_mlkem1024_private_key) <= - sizeof(MLKEM1024_private_key)); -static_assert(alignof(BCM_mlkem1024_private_key) <= - alignof(MLKEM1024_private_key)); -static_assert(sizeof(BCM_mlkem1024_public_key) <= sizeof(MLKEM1024_public_key)); -static_assert(alignof(BCM_mlkem1024_public_key) <= - alignof(MLKEM1024_public_key)); - void MLKEM1024_generate_key( uint8_t out_encoded_public_key[MLKEM1024_PUBLIC_KEY_BYTES], uint8_t optional_out_seed[MLKEM_SEED_BYTES], struct MLKEM1024_private_key *out_private_key) { - (void)BCM_mlkem1024_generate_key( - out_encoded_public_key, optional_out_seed, - reinterpret_cast(out_private_key)); + (void)BCM_mlkem1024_generate_key(out_encoded_public_key, optional_out_seed, + out_private_key); } int MLKEM1024_private_key_from_seed( struct MLKEM1024_private_key *out_private_key, const uint8_t *seed, size_t seed_len) { - return bcm_success(BCM_mlkem1024_private_key_from_seed( - reinterpret_cast(out_private_key), seed, - seed_len)); + return bcm_success( + BCM_mlkem1024_private_key_from_seed(out_private_key, seed, seed_len)); } void MLKEM1024_public_from_private( struct MLKEM1024_public_key *out_public_key, const struct MLKEM1024_private_key *private_key) { - (void)BCM_mlkem1024_public_from_private( - reinterpret_cast(out_public_key), - reinterpret_cast(private_key)); + (void)BCM_mlkem1024_public_from_private(out_public_key, private_key); } void MLKEM1024_encap(uint8_t out_ciphertext[MLKEM1024_CIPHERTEXT_BYTES], uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], const struct MLKEM1024_public_key *public_key) { - (void)BCM_mlkem1024_encap( - out_ciphertext, out_shared_secret, - reinterpret_cast(public_key)); + (void)BCM_mlkem1024_encap(out_ciphertext, out_shared_secret, public_key); } int MLKEM1024_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], const uint8_t *ciphertext, size_t ciphertext_len, const struct MLKEM1024_private_key *private_key) { - return bcm_success(BCM_mlkem1024_decap( - out_shared_secret, ciphertext, ciphertext_len, - reinterpret_cast(private_key))); + return bcm_success(BCM_mlkem1024_decap(out_shared_secret, ciphertext, + ciphertext_len, private_key)); } int MLKEM1024_marshal_public_key( CBB *out, const struct MLKEM1024_public_key *public_key) { - return bcm_success(BCM_mlkem1024_marshal_public_key( - out, reinterpret_cast(public_key))); + return bcm_success(BCM_mlkem1024_marshal_public_key(out, public_key)); } int MLKEM1024_parse_public_key(struct MLKEM1024_public_key *out_public_key, CBS *in) { - return bcm_success(BCM_mlkem1024_parse_public_key( - reinterpret_cast(out_public_key), in)); + return bcm_success(BCM_mlkem1024_parse_public_key(out_public_key, in)); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj.cc b/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj.cc index 3f2d85ead9..6eaadf6c53 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj.cc @@ -18,6 +18,8 @@ #include #include +#include + #include #include #include @@ -35,10 +37,10 @@ DEFINE_LHASH_OF(ASN1_OBJECT) static CRYPTO_MUTEX global_added_lock = CRYPTO_MUTEX_INIT; // These globals are protected by |global_added_lock|. -static LHASH_OF(ASN1_OBJECT) *global_added_by_data = NULL; -static LHASH_OF(ASN1_OBJECT) *global_added_by_nid = NULL; -static LHASH_OF(ASN1_OBJECT) *global_added_by_short_name = NULL; -static LHASH_OF(ASN1_OBJECT) *global_added_by_long_name = NULL; +static LHASH_OF(ASN1_OBJECT) *global_added_by_data = nullptr; +static LHASH_OF(ASN1_OBJECT) *global_added_by_nid = nullptr; +static LHASH_OF(ASN1_OBJECT) *global_added_by_short_name = nullptr; +static LHASH_OF(ASN1_OBJECT) *global_added_by_long_name = nullptr; static CRYPTO_MUTEX global_next_nid_lock = CRYPTO_MUTEX_INIT; static unsigned global_next_nid = NUM_NID; @@ -52,11 +54,11 @@ static int obj_next_nid(void) { ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o) { ASN1_OBJECT *r; - unsigned char *data = NULL; - char *sn = NULL, *ln = NULL; + unsigned char *data = nullptr; + char *sn = nullptr, *ln = nullptr; - if (o == NULL) { - return NULL; + if (o == nullptr) { + return nullptr; } if (!(o->flags & ASN1_OBJECT_FLAG_DYNAMIC)) { @@ -65,31 +67,31 @@ ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o) { } r = ASN1_OBJECT_new(); - if (r == NULL) { + if (r == nullptr) { OPENSSL_PUT_ERROR(OBJ, ERR_R_ASN1_LIB); - return NULL; + return nullptr; } - r->ln = r->sn = NULL; + r->ln = r->sn = nullptr; // once data is attached to an object, it remains const r->data = reinterpret_cast(OPENSSL_memdup(o->data, o->length)); - if (o->length != 0 && r->data == NULL) { + if (o->length != 0 && r->data == nullptr) { goto err; } r->length = o->length; r->nid = o->nid; - if (o->ln != NULL) { + if (o->ln != nullptr) { ln = OPENSSL_strdup(o->ln); - if (ln == NULL) { + if (ln == nullptr) { goto err; } } - if (o->sn != NULL) { + if (o->sn != nullptr) { sn = OPENSSL_strdup(o->sn); - if (sn == NULL) { + if (sn == nullptr) { goto err; } } @@ -107,7 +109,7 @@ err: OPENSSL_free(sn); OPENSSL_free(data); OPENSSL_free(r); - return NULL; + return nullptr; } int OBJ_cmp(const ASN1_OBJECT *a, const ASN1_OBJECT *b) { @@ -120,15 +122,15 @@ int OBJ_cmp(const ASN1_OBJECT *a, const ASN1_OBJECT *b) { } const uint8_t *OBJ_get0_data(const ASN1_OBJECT *obj) { - if (obj == NULL) { - return NULL; + if (obj == nullptr) { + return nullptr; } return obj->data; } size_t OBJ_length(const ASN1_OBJECT *obj) { - if (obj == NULL || obj->length < 0) { + if (obj == nullptr || obj->length < 0) { return 0; } @@ -152,7 +154,7 @@ static int obj_cmp(const void *key, const void *element) { } int OBJ_obj2nid(const ASN1_OBJECT *obj) { - if (obj == NULL) { + if (obj == nullptr) { return NID_undef; } @@ -161,11 +163,11 @@ int OBJ_obj2nid(const ASN1_OBJECT *obj) { } CRYPTO_MUTEX_lock_read(&global_added_lock); - if (global_added_by_data != NULL) { + if (global_added_by_data != nullptr) { ASN1_OBJECT *match; match = lh_ASN1_OBJECT_retrieve(global_added_by_data, obj); - if (match != NULL) { + if (match != nullptr) { CRYPTO_MUTEX_unlock_read(&global_added_lock); return match->nid; } @@ -173,9 +175,9 @@ int OBJ_obj2nid(const ASN1_OBJECT *obj) { CRYPTO_MUTEX_unlock_read(&global_added_lock); const uint16_t *nid_ptr = reinterpret_cast( - bsearch(obj, kNIDsInOIDOrder, OPENSSL_ARRAY_SIZE(kNIDsInOIDOrder), + bsearch(obj, kNIDsInOIDOrder, std::size(kNIDsInOIDOrder), sizeof(kNIDsInOIDOrder[0]), obj_cmp)); - if (nid_ptr == NULL) { + if (nid_ptr == nullptr) { return NID_undef; } @@ -207,23 +209,22 @@ static int short_name_cmp(const void *key, const void *element) { int OBJ_sn2nid(const char *short_name) { CRYPTO_MUTEX_lock_read(&global_added_lock); - if (global_added_by_short_name != NULL) { + if (global_added_by_short_name != nullptr) { ASN1_OBJECT *match, templ; templ.sn = short_name; match = lh_ASN1_OBJECT_retrieve(global_added_by_short_name, &templ); - if (match != NULL) { + if (match != nullptr) { CRYPTO_MUTEX_unlock_read(&global_added_lock); return match->nid; } } CRYPTO_MUTEX_unlock_read(&global_added_lock); - const uint16_t *nid_ptr = reinterpret_cast( - bsearch(short_name, kNIDsInShortNameOrder, - OPENSSL_ARRAY_SIZE(kNIDsInShortNameOrder), - sizeof(kNIDsInShortNameOrder[0]), short_name_cmp)); - if (nid_ptr == NULL) { + const uint16_t *nid_ptr = reinterpret_cast(bsearch( + short_name, kNIDsInShortNameOrder, std::size(kNIDsInShortNameOrder), + sizeof(kNIDsInShortNameOrder[0]), short_name_cmp)); + if (nid_ptr == nullptr) { return NID_undef; } @@ -242,22 +243,22 @@ static int long_name_cmp(const void *key, const void *element) { int OBJ_ln2nid(const char *long_name) { CRYPTO_MUTEX_lock_read(&global_added_lock); - if (global_added_by_long_name != NULL) { + if (global_added_by_long_name != nullptr) { ASN1_OBJECT *match, templ; templ.ln = long_name; match = lh_ASN1_OBJECT_retrieve(global_added_by_long_name, &templ); - if (match != NULL) { + if (match != nullptr) { CRYPTO_MUTEX_unlock_read(&global_added_lock); return match->nid; } } CRYPTO_MUTEX_unlock_read(&global_added_lock); - const uint16_t *nid_ptr = reinterpret_cast(bsearch( - long_name, kNIDsInLongNameOrder, OPENSSL_ARRAY_SIZE(kNIDsInLongNameOrder), - sizeof(kNIDsInLongNameOrder[0]), long_name_cmp)); - if (nid_ptr == NULL) { + const uint16_t *nid_ptr = reinterpret_cast( + bsearch(long_name, kNIDsInLongNameOrder, std::size(kNIDsInLongNameOrder), + sizeof(kNIDsInLongNameOrder[0]), long_name_cmp)); + if (nid_ptr == nullptr) { return NID_undef; } @@ -276,7 +277,7 @@ int OBJ_txt2nid(const char *s) { OPENSSL_EXPORT int OBJ_nid2cbb(CBB *out, int nid) { const ASN1_OBJECT *obj = OBJ_nid2obj(nid); - return obj != NULL && + return obj != nullptr && CBB_add_asn1_element(out, CBS_ASN1_OBJECT, obj->data, obj->length); } @@ -286,7 +287,7 @@ const ASN1_OBJECT *OBJ_get_undef(void) { /*ln=*/LN_undef, /*nid=*/NID_undef, /*length=*/0, - /*data=*/NULL, + /*data=*/nullptr, /*flags=*/0, }; return &kUndef; @@ -306,12 +307,12 @@ ASN1_OBJECT *OBJ_nid2obj(int nid) { } CRYPTO_MUTEX_lock_read(&global_added_lock); - if (global_added_by_nid != NULL) { + if (global_added_by_nid != nullptr) { ASN1_OBJECT *match, templ; templ.nid = nid; match = lh_ASN1_OBJECT_retrieve(global_added_by_nid, &templ); - if (match != NULL) { + if (match != nullptr) { CRYPTO_MUTEX_unlock_read(&global_added_lock); return match; } @@ -320,13 +321,13 @@ ASN1_OBJECT *OBJ_nid2obj(int nid) { err: OPENSSL_PUT_ERROR(OBJ, OBJ_R_UNKNOWN_NID); - return NULL; + return nullptr; } const char *OBJ_nid2sn(int nid) { const ASN1_OBJECT *obj = OBJ_nid2obj(nid); - if (obj == NULL) { - return NULL; + if (obj == nullptr) { + return nullptr; } return obj->sn; @@ -334,8 +335,8 @@ const char *OBJ_nid2sn(int nid) { const char *OBJ_nid2ln(int nid) { const ASN1_OBJECT *obj = OBJ_nid2obj(nid); - if (obj == NULL) { - return NULL; + if (obj == nullptr) { + return nullptr; } return obj->ln; @@ -353,7 +354,7 @@ static ASN1_OBJECT *create_object_with_text_oid(int (*get_nid)(void), !CBB_finish(&cbb, &buf, &len)) { OPENSSL_PUT_ERROR(OBJ, OBJ_R_INVALID_OID_STRING); CBB_cleanup(&cbb); - return NULL; + return nullptr; } ASN1_OBJECT *ret = ASN1_OBJECT_create(get_nid ? get_nid() : NID_undef, buf, @@ -374,7 +375,7 @@ ASN1_OBJECT *OBJ_txt2obj(const char *s, int dont_search_names) { } } - return create_object_with_text_oid(NULL, s, NULL, NULL); + return create_object_with_text_oid(nullptr, s, nullptr, nullptr); } static int strlcpy_int(char *dst, const char *src, int dst_size) { @@ -390,7 +391,7 @@ int OBJ_obj2txt(char *out, int out_len, const ASN1_OBJECT *obj, int always_return_oid) { // Python depends on the empty OID successfully encoding as the empty // string. - if (obj == NULL || obj->length == 0) { + if (obj == nullptr || obj->length == 0) { return strlcpy_int(out, "", out_len); } @@ -398,10 +399,10 @@ int OBJ_obj2txt(char *out, int out_len, const ASN1_OBJECT *obj, int nid = OBJ_obj2nid(obj); if (nid != NID_undef) { const char *name = OBJ_nid2ln(nid); - if (name == NULL) { + if (name == nullptr) { name = OBJ_nid2sn(nid); } - if (name != NULL) { + if (name != nullptr) { return strlcpy_int(out, name, out_len); } } @@ -410,7 +411,7 @@ int OBJ_obj2txt(char *out, int out_len, const ASN1_OBJECT *obj, CBS cbs; CBS_init(&cbs, obj->data, obj->length); char *txt = CBS_asn1_oid_to_text(&cbs); - if (txt == NULL) { + if (txt == nullptr) { if (out_len > 0) { out[0] = '\0'; } @@ -455,26 +456,26 @@ static int obj_add_object(ASN1_OBJECT *obj) { ASN1_OBJECT_FLAG_DYNAMIC_DATA); CRYPTO_MUTEX_lock_write(&global_added_lock); - if (global_added_by_nid == NULL) { + if (global_added_by_nid == nullptr) { global_added_by_nid = lh_ASN1_OBJECT_new(hash_nid, cmp_nid); } - if (global_added_by_data == NULL) { + if (global_added_by_data == nullptr) { global_added_by_data = lh_ASN1_OBJECT_new(hash_data, OBJ_cmp); } - if (global_added_by_short_name == NULL) { + if (global_added_by_short_name == nullptr) { global_added_by_short_name = lh_ASN1_OBJECT_new(hash_short_name, cmp_short_name); } - if (global_added_by_long_name == NULL) { + if (global_added_by_long_name == nullptr) { global_added_by_long_name = lh_ASN1_OBJECT_new(hash_long_name, cmp_long_name); } int ok = 0; - if (global_added_by_nid == NULL || // - global_added_by_data == NULL || // - global_added_by_short_name == NULL || // - global_added_by_long_name == NULL) { + if (global_added_by_nid == nullptr || // + global_added_by_data == nullptr || // + global_added_by_short_name == nullptr || // + global_added_by_long_name == nullptr) { goto err; } @@ -484,13 +485,13 @@ static int obj_add_object(ASN1_OBJECT *obj) { // should always have objects in |global_added_by_nid|. ASN1_OBJECT *old_object; ok = lh_ASN1_OBJECT_insert(global_added_by_nid, &old_object, obj); - if (obj->length != 0 && obj->data != NULL) { + if (obj->length != 0 && obj->data != nullptr) { ok &= lh_ASN1_OBJECT_insert(global_added_by_data, &old_object, obj); } - if (obj->sn != NULL) { + if (obj->sn != nullptr) { ok &= lh_ASN1_OBJECT_insert(global_added_by_short_name, &old_object, obj); } - if (obj->ln != NULL) { + if (obj->ln != nullptr) { ok &= lh_ASN1_OBJECT_insert(global_added_by_long_name, &old_object, obj); } @@ -502,7 +503,7 @@ err: int OBJ_create(const char *oid, const char *short_name, const char *long_name) { ASN1_OBJECT *op = create_object_with_text_oid(obj_next_nid, oid, short_name, long_name); - if (op == NULL || !obj_add_object(op)) { + if (op == nullptr || !obj_add_object(op)) { return NID_undef; } return op->nid; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj_dat.h b/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj_dat.h index a857d535cb..d8b86dcd29 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj_dat.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj_dat.h @@ -15,7 +15,7 @@ // This file is generated by crypto/obj/objects.go. -#define NUM_NID 966 +#define NUM_NID 971 static const uint8_t kObjectData[] = { /* NID_rsadsi */ @@ -7095,6 +7095,56 @@ static const uint8_t kObjectData[] = { 0x04, 0x02, 0x06, + /* NID_ML_KEM_1024 */ + 0x60, + 0x86, + 0x48, + 0x01, + 0x65, + 0x03, + 0x04, + 0x04, + 0x03, + /* NID_ML_DSA_44 */ + 0x60, + 0x86, + 0x48, + 0x01, + 0x65, + 0x03, + 0x04, + 0x03, + 0x11, + /* NID_ML_DSA_65 */ + 0x60, + 0x86, + 0x48, + 0x01, + 0x65, + 0x03, + 0x04, + 0x03, + 0x12, + /* NID_ML_DSA_87 */ + 0x60, + 0x86, + 0x48, + 0x01, + 0x65, + 0x03, + 0x04, + 0x03, + 0x13, + /* NID_ML_KEM_768 */ + 0x60, + 0x86, + 0x48, + 0x01, + 0x65, + 0x03, + 0x04, + 0x04, + 0x02, }; static const ASN1_OBJECT kObjects[NUM_NID] = { @@ -8742,6 +8792,13 @@ static const ASN1_OBJECT kObjects[NUM_NID] = { {"X25519Kyber768Draft00", "X25519Kyber768Draft00", NID_X25519Kyber768Draft00, 0, NULL, 0}, {"X25519MLKEM768", "X25519MLKEM768", NID_X25519MLKEM768, 0, NULL, 0}, + {"id-alg-ml-kem-1024", "ML-KEM-1024", NID_ML_KEM_1024, 9, + &kObjectData[6196], 0}, + {"id-ml-dsa-44", "ML-DSA-44", NID_ML_DSA_44, 9, &kObjectData[6205], 0}, + {"id-ml-dsa-65", "ML-DSA-65", NID_ML_DSA_65, 9, &kObjectData[6214], 0}, + {"id-ml-dsa-87", "ML-DSA-87", NID_ML_DSA_87, 9, &kObjectData[6223], 0}, + {"id-alg-ml-kem-768", "ML-KEM-768", NID_ML_KEM_768, 9, &kObjectData[6232], + 0}, }; static const uint16_t kNIDsInShortNameOrder[] = { @@ -9179,6 +9236,8 @@ static const uint16_t kNIDsInShortNameOrder[] = { 323 /* id-alg-des40 */, 326 /* id-alg-dh-pop */, 325 /* id-alg-dh-sig-hmac-sha1 */, + 966 /* id-alg-ml-kem-1024 */, + 970 /* id-alg-ml-kem-768 */, 324 /* id-alg-noSignature */, 907 /* id-camellia128-wrap */, 908 /* id-camellia192-wrap */, @@ -9232,6 +9291,9 @@ static const uint16_t kNIDsInShortNameOrder[] = { 784 /* id-it-suppLangTags */, 304 /* id-it-unsupportedOIDs */, 128 /* id-kp */, + 967 /* id-ml-dsa-44 */, + 968 /* id-ml-dsa-65 */, + 969 /* id-ml-dsa-87 */, 280 /* id-mod-attribute-cert */, 274 /* id-mod-cmc */, 277 /* id-mod-cmp */, @@ -9755,6 +9817,11 @@ static const uint16_t kNIDsInLongNameOrder[] = { 647 /* International Organizations */, 142 /* Invalidity Date */, 504 /* MIME MHS */, + 967 /* ML-DSA-44 */, + 968 /* ML-DSA-65 */, + 969 /* ML-DSA-87 */, + 966 /* ML-KEM-1024 */, + 970 /* ML-KEM-768 */, 388 /* Mail */, 383 /* Management */, 417 /* Microsoft CSP Name */, @@ -11370,6 +11437,11 @@ static const uint16_t kNIDsInOIDOrder[] = { 962 /* 2.16.840.1.101.3.4.2.6 (OBJ_sha512_256) */, 802 /* 2.16.840.1.101.3.4.3.1 (OBJ_dsa_with_SHA224) */, 803 /* 2.16.840.1.101.3.4.3.2 (OBJ_dsa_with_SHA256) */, + 967 /* 2.16.840.1.101.3.4.3.17 (OBJ_ML_DSA_44) */, + 968 /* 2.16.840.1.101.3.4.3.18 (OBJ_ML_DSA_65) */, + 969 /* 2.16.840.1.101.3.4.3.19 (OBJ_ML_DSA_87) */, + 970 /* 2.16.840.1.101.3.4.4.2 (OBJ_ML_KEM_768) */, + 966 /* 2.16.840.1.101.3.4.4.3 (OBJ_ML_KEM_1024) */, 71 /* 2.16.840.1.113730.1.1 (OBJ_netscape_cert_type) */, 72 /* 2.16.840.1.113730.1.2 (OBJ_netscape_base_url) */, 73 /* 2.16.840.1.113730.1.3 (OBJ_netscape_revocation_url) */, diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj_mac.num b/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj_mac.num index 6e2a2aed64..ae863e29de 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj_mac.num +++ b/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj_mac.num @@ -953,3 +953,8 @@ sha512_256 962 hkdf 963 X25519Kyber768Draft00 964 X25519MLKEM768 965 +ML_KEM_1024 966 +ML_DSA_44 967 +ML_DSA_65 968 +ML_DSA_87 969 +ML_KEM_768 970 diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj_xref.cc b/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj_xref.cc index 0095deaf33..a322a3f41d 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj_xref.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/obj/obj_xref.cc @@ -50,13 +50,13 @@ static const nid_triple kTriples[] = { }; int OBJ_find_sigid_algs(int sign_nid, int *out_digest_nid, int *out_pkey_nid) { - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kTriples); i++) { - if (kTriples[i].sign_nid == sign_nid) { - if (out_digest_nid != NULL) { - *out_digest_nid = kTriples[i].digest_nid; + for (const auto &triple : kTriples) { + if (triple.sign_nid == sign_nid) { + if (out_digest_nid != nullptr) { + *out_digest_nid = triple.digest_nid; } - if (out_pkey_nid != NULL) { - *out_pkey_nid = kTriples[i].pkey_nid; + if (out_pkey_nid != nullptr) { + *out_pkey_nid = triple.pkey_nid; } return 1; } @@ -66,11 +66,11 @@ int OBJ_find_sigid_algs(int sign_nid, int *out_digest_nid, int *out_pkey_nid) { } int OBJ_find_sigid_by_algs(int *out_sign_nid, int digest_nid, int pkey_nid) { - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kTriples); i++) { - if (kTriples[i].digest_nid == digest_nid && - kTriples[i].pkey_nid == pkey_nid) { - if (out_sign_nid != NULL) { - *out_sign_nid = kTriples[i].sign_nid; + for (const auto &triple : kTriples) { + if (triple.digest_nid == digest_nid && + triple.pkey_nid == pkey_nid) { + if (out_sign_nid != nullptr) { + *out_sign_nid = triple.sign_nid; } return 1; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/obj/objects.go b/naiveproxy/src/third_party/boringssl/src/crypto/obj/objects.go index dacc1361d1..eeff0692d4 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/obj/objects.go +++ b/naiveproxy/src/third_party/boringssl/src/crypto/obj/objects.go @@ -19,6 +19,7 @@ package main import ( "bufio" "bytes" + "encoding/asn1" "errors" "fmt" "os" @@ -42,7 +43,7 @@ type object struct { // corresponding SN_foo or LN_foo macro is not defined. shortName, longName string hasShortName, hasLongName bool - oid []int + oid asn1.ObjectIdentifier encoded []byte } @@ -123,7 +124,7 @@ func readNumbers(path string) (nameToNID map[string]int, numNIDs int, err error) return nameToNID, numNIDs, nil } -func parseOID(aliases map[string][]int, in []string) (oid []int, err error) { +func parseOID(aliases map[string]asn1.ObjectIdentifier, in []string) (oid asn1.ObjectIdentifier, err error) { if len(in) == 0 { return } @@ -212,7 +213,7 @@ func readObjects(numPath, objectsPath string) (*objects, error) { var lineNo int longNamesSeen := make(map[string]struct{}) shortNamesSeen := make(map[string]struct{}) - aliases := make(map[string][]int) + aliases := make(map[string]asn1.ObjectIdentifier) scanner := bufio.NewScanner(in) for scanner.Scan() { line := scanner.Text() @@ -407,7 +408,7 @@ func writeHeader(path string, objs *objects) error { #ifndef OPENSSL_HEADER_NID_H #define OPENSSL_HEADER_NID_H -#include +#include // IWYU pragma: export #if defined(__cplusplus) extern "C" { @@ -424,7 +425,18 @@ extern "C" { // should instead embed the encodings of the few consumed OIDs and compare // against those. // -// These values should not be used outside of a single process; they are not +// Constants are defined as follows: +// +// - NID_foo is the integer NID of foo. +// - SN_foo is the "short name" of foo, omitted if there is no short name. +// - LN_foo is the "long name" of foo, omitted if there is no long name. +// - OBJ_foo expands to a comma-separated sequence of integers for foo's OID, +// omitted if foo has no OID. +// - OBJ_ENC_foo expands to a comma-separated sequence of bytes for foo's OID +// encoded in DER, excluding the tag and length. This is omitted if foo has +// no OID. +// +// NID values should not be used outside of a single process; they are not // stable identifiers. @@ -447,18 +459,29 @@ extern "C" { // OBJ_undef as if it were zero. oid := obj.oid if nid == 0 { - oid = []int{0} + oid = asn1.ObjectIdentifier{0} } if len(oid) != 0 { - var oidStr string + var oidStr strings.Builder for _, val := range oid { - if len(oidStr) != 0 { - oidStr += "," + if oidStr.Len() != 0 { + oidStr.WriteString(", ") } - oidStr += fmt.Sprintf("%dL", val) + fmt.Fprintf(&oidStr, "%dL", val) } - - fmt.Fprintf(&b, "#define OBJ_%s %s\n", obj.name, oidStr) + fmt.Fprintf(&b, "#define OBJ_%s %s\n", obj.name, oidStr.String()) + } + // Some NIDs refer to the top-level OID arcs, which cannot be encoded + // as OIDs. (The encoding can only represent two or more components.) + if len(oid) > 1 { + var oidEncStr strings.Builder + for _, val := range encodeOID(oid) { + if oidEncStr.Len() != 0 { + oidEncStr.WriteString(", ") + } + fmt.Fprintf(&oidEncStr, "0x%02x", val) + } + fmt.Fprintf(&b, "#define OBJ_ENC_%s %s\n", obj.name, oidEncStr.String()) } fmt.Fprintf(&b, "\n") diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_all.cc b/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_all.cc index acd3b25bc7..f03b6080c5 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_all.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_all.cc @@ -38,14 +38,17 @@ IMPLEMENT_PEM_rw(PKCS7, PKCS7, PEM_STRING_PKCS7, PKCS7) // the relevant private key: this means can handle "traditional" and PKCS#8 // formats transparently. static RSA *pkey_get_rsa(EVP_PKEY *key, RSA **rsa) { - RSA *rtmp; if (!key) { - return NULL; + return nullptr; } - rtmp = EVP_PKEY_get1_RSA(key); - EVP_PKEY_free(key); + if (EVP_PKEY_id(key) != EVP_PKEY_RSA) { + // Don't accept RSA-PSS keys in this function. + OPENSSL_PUT_ERROR(EVP, EVP_R_EXPECTING_AN_RSA_KEY); + return nullptr; + } + RSA *rtmp = EVP_PKEY_get1_RSA(key); if (!rtmp) { - return NULL; + return nullptr; } if (rsa) { RSA_free(*rsa); @@ -56,15 +59,13 @@ static RSA *pkey_get_rsa(EVP_PKEY *key, RSA **rsa) { RSA *PEM_read_bio_RSAPrivateKey(BIO *bp, RSA **rsa, pem_password_cb *cb, void *u) { - EVP_PKEY *pktmp; - pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u); - return pkey_get_rsa(pktmp, rsa); + bssl::UniquePtr pkey(PEM_read_bio_PrivateKey(bp, nullptr, cb, u)); + return pkey_get_rsa(pkey.get(), rsa); } RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u) { - EVP_PKEY *pktmp; - pktmp = PEM_read_PrivateKey(fp, NULL, cb, u); - return pkey_get_rsa(pktmp, rsa); + bssl::UniquePtr pkey(PEM_read_PrivateKey(fp, nullptr, cb, u)); + return pkey_get_rsa(pkey.get(), rsa); } IMPLEMENT_PEM_write_cb_const(RSAPrivateKey, RSA, PEM_STRING_RSA, RSAPrivateKey) @@ -76,12 +77,12 @@ IMPLEMENT_PEM_rw(RSA_PUBKEY, RSA, PEM_STRING_PUBLIC, RSA_PUBKEY) static DSA *pkey_get_dsa(EVP_PKEY *key, DSA **dsa) { DSA *dtmp; if (!key) { - return NULL; + return nullptr; } dtmp = EVP_PKEY_get1_DSA(key); EVP_PKEY_free(key); if (!dtmp) { - return NULL; + return nullptr; } if (dsa) { DSA_free(*dsa); @@ -93,7 +94,7 @@ static DSA *pkey_get_dsa(EVP_PKEY *key, DSA **dsa) { DSA *PEM_read_bio_DSAPrivateKey(BIO *bp, DSA **dsa, pem_password_cb *cb, void *u) { EVP_PKEY *pktmp; - pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u); + pktmp = PEM_read_bio_PrivateKey(bp, nullptr, cb, u); return pkey_get_dsa(pktmp, dsa); // will free pktmp } @@ -102,7 +103,7 @@ IMPLEMENT_PEM_write_cb_const(DSAPrivateKey, DSA, PEM_STRING_DSA, DSAPrivateKey) IMPLEMENT_PEM_rw(DSA_PUBKEY, DSA, PEM_STRING_PUBLIC, DSA_PUBKEY) DSA *PEM_read_DSAPrivateKey(FILE *fp, DSA **dsa, pem_password_cb *cb, void *u) { EVP_PKEY *pktmp; - pktmp = PEM_read_PrivateKey(fp, NULL, cb, u); + pktmp = PEM_read_PrivateKey(fp, nullptr, cb, u); return pkey_get_dsa(pktmp, dsa); // will free pktmp } @@ -111,12 +112,12 @@ IMPLEMENT_PEM_rw_const(DSAparams, DSA, PEM_STRING_DSAPARAMS, DSAparams) static EC_KEY *pkey_get_eckey(EVP_PKEY *key, EC_KEY **eckey) { EC_KEY *dtmp; if (!key) { - return NULL; + return nullptr; } dtmp = EVP_PKEY_get1_EC_KEY(key); EVP_PKEY_free(key); if (!dtmp) { - return NULL; + return nullptr; } if (eckey) { EC_KEY_free(*eckey); @@ -128,7 +129,7 @@ static EC_KEY *pkey_get_eckey(EVP_PKEY *key, EC_KEY **eckey) { EC_KEY *PEM_read_bio_ECPrivateKey(BIO *bp, EC_KEY **key, pem_password_cb *cb, void *u) { EVP_PKEY *pktmp; - pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u); + pktmp = PEM_read_bio_PrivateKey(bp, nullptr, cb, u); return pkey_get_eckey(pktmp, key); // will free pktmp } @@ -139,7 +140,7 @@ IMPLEMENT_PEM_rw(EC_PUBKEY, EC_KEY, PEM_STRING_PUBLIC, EC_PUBKEY) EC_KEY *PEM_read_ECPrivateKey(FILE *fp, EC_KEY **eckey, pem_password_cb *cb, void *u) { EVP_PKEY *pktmp; - pktmp = PEM_read_PrivateKey(fp, NULL, cb, u); + pktmp = PEM_read_PrivateKey(fp, nullptr, cb, u); return pkey_get_eckey(pktmp, eckey); // will free pktmp } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_info.cc b/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_info.cc index edc97f4587..081381336e 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_info.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_info.cc @@ -34,7 +34,7 @@ static X509_PKEY *X509_PKEY_new(void) { } static void X509_PKEY_free(X509_PKEY *x) { - if (x == NULL) { + if (x == nullptr) { return; } @@ -47,7 +47,7 @@ static X509_INFO *X509_INFO_new(void) { } void X509_INFO_free(X509_INFO *x) { - if (x == NULL) { + if (x == nullptr) { return; } @@ -62,9 +62,9 @@ void X509_INFO_free(X509_INFO *x) { STACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, void *u) { BIO *b = BIO_new_fp(fp, BIO_NOCLOSE); - if (b == NULL) { + if (b == nullptr) { OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB); - return 0; + return nullptr; } STACK_OF(X509_INFO) *ret = PEM_X509_INFO_read_bio(b, sk, cb, u); BIO_free(b); @@ -79,57 +79,57 @@ enum parse_result_t { static enum parse_result_t parse_x509(X509_INFO *info, const uint8_t *data, size_t len, int key_type) { - if (info->x509 != NULL) { + if (info->x509 != nullptr) { return parse_new_entry; } - info->x509 = d2i_X509(NULL, &data, len); - return info->x509 != NULL ? parse_ok : parse_error; + info->x509 = d2i_X509(nullptr, &data, len); + return info->x509 != nullptr ? parse_ok : parse_error; } static enum parse_result_t parse_x509_aux(X509_INFO *info, const uint8_t *data, size_t len, int key_type) { - if (info->x509 != NULL) { + if (info->x509 != nullptr) { return parse_new_entry; } - info->x509 = d2i_X509_AUX(NULL, &data, len); - return info->x509 != NULL ? parse_ok : parse_error; + info->x509 = d2i_X509_AUX(nullptr, &data, len); + return info->x509 != nullptr ? parse_ok : parse_error; } static enum parse_result_t parse_crl(X509_INFO *info, const uint8_t *data, size_t len, int key_type) { - if (info->crl != NULL) { + if (info->crl != nullptr) { return parse_new_entry; } - info->crl = d2i_X509_CRL(NULL, &data, len); - return info->crl != NULL ? parse_ok : parse_error; + info->crl = d2i_X509_CRL(nullptr, &data, len); + return info->crl != nullptr ? parse_ok : parse_error; } static enum parse_result_t parse_key(X509_INFO *info, const uint8_t *data, size_t len, int key_type) { - if (info->x_pkey != NULL) { + if (info->x_pkey != nullptr) { return parse_new_entry; } info->x_pkey = X509_PKEY_new(); - if (info->x_pkey == NULL) { + if (info->x_pkey == nullptr) { return parse_error; } - info->x_pkey->dec_pkey = d2i_PrivateKey(key_type, NULL, &data, len); - return info->x_pkey->dec_pkey != NULL ? parse_ok : parse_error; + info->x_pkey->dec_pkey = d2i_PrivateKey(key_type, nullptr, &data, len); + return info->x_pkey->dec_pkey != nullptr ? parse_ok : parse_error; } STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, void *u) { - X509_INFO *info = NULL; - char *name = NULL, *header = NULL; - unsigned char *data = NULL; + X509_INFO *info = nullptr; + char *name = nullptr, *header = nullptr; + unsigned char *data = nullptr; long len; int ok = 0; - STACK_OF(X509_INFO) *ret = NULL; + STACK_OF(X509_INFO) *ret = nullptr; - if (sk == NULL) { + if (sk == nullptr) { ret = sk_X509_INFO_new_null(); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } } else { ret = sk; @@ -137,15 +137,13 @@ STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, size_t orig_num = sk_X509_INFO_num(ret); info = X509_INFO_new(); - if (info == NULL) { + if (info == nullptr) { goto err; } for (;;) { if (!PEM_read_bio(bp, &name, &header, &data, &len)) { - uint32_t error = ERR_peek_last_error(); - if (ERR_GET_LIB(error) == ERR_LIB_PEM && - ERR_GET_REASON(error) == PEM_R_NO_START_LINE) { + if (ERR_equals(ERR_peek_last_error(), ERR_LIB_PEM, PEM_R_NO_START_LINE)) { ERR_clear_error(); break; } @@ -153,7 +151,7 @@ STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, } enum parse_result_t (*parse_function)(X509_INFO *, const uint8_t *, size_t, - int) = NULL; + int) = nullptr; int key_type = EVP_PKEY_NONE; if (strcmp(name, PEM_STRING_X509) == 0 || strcmp(name, PEM_STRING_X509_OLD) == 0) { @@ -176,25 +174,25 @@ STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, // If a private key has a header, assume it is encrypted. This function does // not decrypt private keys. if (key_type != EVP_PKEY_NONE && strlen(header) > 10) { - if (info->x_pkey != NULL) { + if (info->x_pkey != nullptr) { if (!sk_X509_INFO_push(ret, info)) { goto err; } info = X509_INFO_new(); - if (info == NULL) { + if (info == nullptr) { goto err; } } // Use an empty key as a placeholder. info->x_pkey = X509_PKEY_new(); - if (info->x_pkey == NULL || + if (info->x_pkey == nullptr || !PEM_get_EVP_CIPHER_INFO(header, &info->enc_cipher)) { goto err; } info->enc_data = (char *)data; info->enc_len = (int)len; - data = NULL; - } else if (parse_function != NULL) { + data = nullptr; + } else if (parse_function != nullptr) { EVP_CIPHER_INFO cipher; if (!PEM_get_EVP_CIPHER_INFO(header, &cipher) || !PEM_do_header(&cipher, data, &len, cb, u)) { @@ -206,7 +204,7 @@ STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, goto err; } info = X509_INFO_new(); - if (info == NULL) { + if (info == nullptr) { goto err; } result = parse_function(info, data, len, key_type); @@ -219,18 +217,18 @@ STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, OPENSSL_free(name); OPENSSL_free(header); OPENSSL_free(data); - name = NULL; - header = NULL; - data = NULL; + name = nullptr; + header = nullptr; + data = nullptr; } // Push the last entry on the stack if not empty. - if (info->x509 != NULL || info->crl != NULL || info->x_pkey != NULL || - info->enc_data != NULL) { + if (info->x509 != nullptr || info->crl != nullptr || + info->x_pkey != nullptr || info->enc_data != nullptr) { if (!sk_X509_INFO_push(ret, info)) { goto err; } - info = NULL; + info = nullptr; } ok = 1; @@ -244,7 +242,7 @@ err: if (ret != sk) { sk_X509_INFO_free(ret); } - ret = NULL; + ret = nullptr; } OPENSSL_free(name); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_lib.cc b/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_lib.cc index e7c4e0b6ef..3f142bd8d5 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_lib.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_lib.cc @@ -86,9 +86,9 @@ static void PEM_dek_info(char buf[PEM_BUFSIZE], const char *type, size_t len, void *PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x, pem_password_cb *cb, void *u) { BIO *b = BIO_new_fp(fp, BIO_NOCLOSE); - if (b == NULL) { + if (b == nullptr) { OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB); - return NULL; + return nullptr; } void *ret = PEM_ASN1_read_bio(d2i, name, b, x, cb, u); BIO_free(b); @@ -167,7 +167,7 @@ static const EVP_CIPHER *cipher_by_name(std::string_view name) { } else if (name == SN_aes_256_cbc) { return EVP_aes_256_cbc(); } else { - return NULL; + return nullptr; } } @@ -175,16 +175,14 @@ int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, const char *name, BIO *bp, pem_password_cb *cb, void *u) { EVP_CIPHER_INFO cipher; - char *nm = NULL, *header = NULL; - unsigned char *data = NULL; + char *nm = nullptr, *header = nullptr; + unsigned char *data = nullptr; long len; int ret = 0; for (;;) { if (!PEM_read_bio(bp, &nm, &header, &data, &len)) { - uint32_t error = ERR_peek_error(); - if (ERR_GET_LIB(error) == ERR_LIB_PEM && - ERR_GET_REASON(error) == PEM_R_NO_START_LINE) { + if (ERR_equals(ERR_peek_error(), ERR_LIB_PEM, PEM_R_NO_START_LINE)) { ERR_add_error_data(2, "Expecting: ", name); } return 0; @@ -227,7 +225,7 @@ int PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp, void *x, const EVP_CIPHER *enc, const unsigned char *pass, int pass_len, pem_password_cb *callback, void *u) { BIO *b = BIO_new_fp(fp, BIO_NOCLOSE); - if (b == NULL) { + if (b == nullptr) { OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB); return 0; } @@ -242,22 +240,22 @@ int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, int pass_len, pem_password_cb *callback, void *u) { bssl::ScopedEVP_CIPHER_CTX ctx; int dsize = 0, i, j, ret = 0; - unsigned char *p, *data = NULL; - const char *objstr = NULL; + unsigned char *p, *data = nullptr; + const char *objstr = nullptr; char buf[PEM_BUFSIZE]; unsigned char key[EVP_MAX_KEY_LENGTH]; unsigned char iv[EVP_MAX_IV_LENGTH]; - if (enc != NULL) { + if (enc != nullptr) { objstr = OBJ_nid2sn(EVP_CIPHER_nid(enc)); - if (objstr == NULL || cipher_by_name(objstr) == NULL || + if (objstr == nullptr || cipher_by_name(objstr) == nullptr || EVP_CIPHER_iv_length(enc) < 8) { OPENSSL_PUT_ERROR(PEM, PEM_R_UNSUPPORTED_CIPHER); goto err; } } - if ((dsize = i2d(x, NULL)) < 0) { + if ((dsize = i2d(x, nullptr)) < 0) { OPENSSL_PUT_ERROR(PEM, ERR_R_ASN1_LIB); dsize = 0; goto err; @@ -265,16 +263,16 @@ int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, // dzise + 8 bytes are needed // actually it needs the cipher block size extra... data = (unsigned char *)OPENSSL_malloc((unsigned int)dsize + 20); - if (data == NULL) { + if (data == nullptr) { goto err; } p = data; i = i2d(x, &p); - if (enc != NULL) { + if (enc != nullptr) { const unsigned iv_len = EVP_CIPHER_iv_length(enc); - if (pass == NULL) { + if (pass == nullptr) { if (!callback) { callback = PEM_def_callback; } @@ -291,7 +289,7 @@ int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, } // The 'iv' is used as the iv and as a salt. It is NOT taken from // the BytesToKey function - if (!EVP_BytesToKey(enc, EVP_md5(), iv, pass, pass_len, 1, key, NULL)) { + if (!EVP_BytesToKey(enc, EVP_md5(), iv, pass, pass_len, 1, key, nullptr)) { goto err; } @@ -307,7 +305,7 @@ int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, // k=strlen(buf); ret = 1; - if (!EVP_EncryptInit_ex(ctx.get(), enc, NULL, key, iv) || + if (!EVP_EncryptInit_ex(ctx.get(), enc, nullptr, key, iv) || !EVP_EncryptUpdate(ctx.get(), data, &j, data, i) || !EVP_EncryptFinal_ex(ctx.get(), &(data[j]), &i)) { ret = 0; @@ -343,7 +341,7 @@ int PEM_do_header(const EVP_CIPHER_INFO *cipher, unsigned char *data, len = *plen; - if (cipher->cipher == NULL) { + if (cipher->cipher == nullptr) { return 1; } @@ -358,12 +356,12 @@ int PEM_do_header(const EVP_CIPHER_INFO *cipher, unsigned char *data, } if (!EVP_BytesToKey(cipher->cipher, EVP_md5(), cipher->iv, - (unsigned char *)buf, pass_len, 1, key, NULL)) { + (unsigned char *)buf, pass_len, 1, key, nullptr)) { return 0; } j = (int)len; - o = EVP_DecryptInit_ex(ctx.get(), cipher->cipher, NULL, key, cipher->iv); + o = EVP_DecryptInit_ex(ctx.get(), cipher->cipher, nullptr, key, cipher->iv); if (o) { o = EVP_DecryptUpdate(ctx.get(), data, &i, data, j); } @@ -382,9 +380,9 @@ int PEM_do_header(const EVP_CIPHER_INFO *cipher, unsigned char *data, } int PEM_get_EVP_CIPHER_INFO(const char *header, EVP_CIPHER_INFO *cipher) { - cipher->cipher = NULL; + cipher->cipher = nullptr; OPENSSL_memset(cipher->iv, 0, sizeof(cipher->iv)); - if ((header == NULL) || (*header == '\0') || (*header == '\n')) { + if ((header == nullptr) || (*header == '\0') || (*header == '\n')) { return 1; } if (strncmp(header, "Proc-Type: ", 11) != 0) { @@ -425,7 +423,7 @@ int PEM_get_EVP_CIPHER_INFO(const char *header, EVP_CIPHER_INFO *cipher) { } cipher->cipher = cipher_by_name(std::string_view(p, header - p)); header++; - if (cipher->cipher == NULL) { + if (cipher->cipher == nullptr) { OPENSSL_PUT_ERROR(PEM, PEM_R_UNSUPPORTED_ENCRYPTION); return 0; } @@ -469,7 +467,7 @@ static int load_iv(const char **fromp, unsigned char *to, size_t num) { int PEM_write(FILE *fp, const char *name, const char *header, const unsigned char *data, long len) { BIO *b = BIO_new_fp(fp, BIO_NOCLOSE); - if (b == NULL) { + if (b == nullptr) { OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB); return 0; } @@ -481,7 +479,7 @@ int PEM_write(FILE *fp, const char *name, const char *header, int PEM_write_bio(BIO *bp, const char *name, const char *header, const unsigned char *data, long len) { int nlen, n, i, j, outl; - unsigned char *buf = NULL; + unsigned char *buf = nullptr; EVP_ENCODE_CTX ctx; int reason = ERR_R_BUF_LIB; int retval = 0; @@ -503,7 +501,7 @@ int PEM_write_bio(BIO *bp, const char *name, const char *header, } buf = reinterpret_cast(OPENSSL_malloc(PEM_BUFSIZE * 8)); - if (buf == NULL) { + if (buf == nullptr) { goto err; } @@ -540,7 +538,7 @@ err: int PEM_read(FILE *fp, char **name, char **header, unsigned char **data, long *len) { BIO *b = BIO_new_fp(fp, BIO_NOCLOSE); - if (b == NULL) { + if (b == nullptr) { OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB); return 0; } @@ -561,7 +559,7 @@ int PEM_read_bio(BIO *bp, char **name, char **header, unsigned char **data, nameB = BUF_MEM_new(); headerB = BUF_MEM_new(); dataB = BUF_MEM_new(); - if ((nameB == NULL) || (headerB == NULL) || (dataB == NULL)) { + if ((nameB == nullptr) || (headerB == nullptr) || (dataB == nullptr)) { BUF_MEM_free(nameB); BUF_MEM_free(headerB); BUF_MEM_free(dataB); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_oth.cc b/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_oth.cc index 86ab947c9c..c19a78e93c 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_oth.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_oth.cc @@ -27,17 +27,17 @@ void *PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, void **x, pem_password_cb *cb, void *u) { - const unsigned char *p = NULL; - unsigned char *data = NULL; + const unsigned char *p = nullptr; + unsigned char *data = nullptr; long len; - char *ret = NULL; + char *ret = nullptr; - if (!PEM_bytes_read_bio(&data, &len, NULL, name, bp, cb, u)) { - return NULL; + if (!PEM_bytes_read_bio(&data, &len, nullptr, name, bp, cb, u)) { + return nullptr; } p = data; ret = reinterpret_cast(d2i(x, &p, len)); - if (ret == NULL) { + if (ret == nullptr) { OPENSSL_PUT_ERROR(PEM, ERR_R_ASN1_LIB); } OPENSSL_free(data); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_pk8.cc b/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_pk8.cc index fb09f62666..9f477e9f43 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_pk8.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_pk8.cc @@ -37,7 +37,7 @@ static int do_pk8pkey_fp(FILE *bp, const EVP_PKEY *x, int isder, int nid, int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, const EVP_PKEY *x, int nid, const char *pass, int pass_len, pem_password_cb *cb, void *u) { - return do_pk8pkey(bp, x, 0, nid, NULL, pass, pass_len, cb, u); + return do_pk8pkey(bp, x, 0, nid, nullptr, pass, pass_len, cb, u); } int PEM_write_bio_PKCS8PrivateKey(BIO *bp, const EVP_PKEY *x, @@ -55,7 +55,7 @@ int i2d_PKCS8PrivateKey_bio(BIO *bp, const EVP_PKEY *x, const EVP_CIPHER *enc, int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, const EVP_PKEY *x, int nid, const char *pass, int pass_len, pem_password_cb *cb, void *u) { - return do_pk8pkey(bp, x, 1, nid, NULL, pass, pass_len, cb, u); + return do_pk8pkey(bp, x, 1, nid, nullptr, pass, pass_len, cb, u); } static int do_pk8pkey(BIO *bp, const EVP_PKEY *x, int isder, int nid, @@ -83,7 +83,7 @@ static int do_pk8pkey(BIO *bp, const EVP_PKEY *x, int isder, int nid, pass = buf; } - p8 = PKCS8_encrypt(nid, enc, pass, pass_len, NULL, 0, 0, p8inf); + p8 = PKCS8_encrypt(nid, enc, pass, pass_len, nullptr, 0, 0, p8inf); if (pass == buf) { OPENSSL_cleanse(buf, pass_len); } @@ -108,14 +108,14 @@ static int do_pk8pkey(BIO *bp, const EVP_PKEY *x, int isder, int nid, EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u) { - PKCS8_PRIV_KEY_INFO *p8inf = NULL; - X509_SIG *p8 = NULL; + PKCS8_PRIV_KEY_INFO *p8inf = nullptr; + X509_SIG *p8 = nullptr; int pass_len; EVP_PKEY *ret; char psbuf[PEM_BUFSIZE]; - p8 = d2i_PKCS8_bio(bp, NULL); + p8 = d2i_PKCS8_bio(bp, nullptr); if (!p8) { - return NULL; + return nullptr; } pass_len = 0; @@ -126,18 +126,18 @@ EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, if (pass_len < 0) { OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_PASSWORD_READ); X509_SIG_free(p8); - return NULL; + return nullptr; } p8inf = PKCS8_decrypt(p8, psbuf, pass_len); X509_SIG_free(p8); OPENSSL_cleanse(psbuf, pass_len); if (!p8inf) { - return NULL; + return nullptr; } ret = EVP_PKCS82PKEY(p8inf); PKCS8_PRIV_KEY_INFO_free(p8inf); if (!ret) { - return NULL; + return nullptr; } if (x) { if (*x) { @@ -158,13 +158,13 @@ int i2d_PKCS8PrivateKey_fp(FILE *fp, const EVP_PKEY *x, const EVP_CIPHER *enc, int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, const EVP_PKEY *x, int nid, const char *pass, int pass_len, pem_password_cb *cb, void *u) { - return do_pk8pkey_fp(fp, x, 1, nid, NULL, pass, pass_len, cb, u); + return do_pk8pkey_fp(fp, x, 1, nid, nullptr, pass, pass_len, cb, u); } int PEM_write_PKCS8PrivateKey_nid(FILE *fp, const EVP_PKEY *x, int nid, const char *pass, int pass_len, pem_password_cb *cb, void *u) { - return do_pk8pkey_fp(fp, x, 0, nid, NULL, pass, pass_len, cb, u); + return do_pk8pkey_fp(fp, x, 0, nid, nullptr, pass, pass_len, cb, u); } int PEM_write_PKCS8PrivateKey(FILE *fp, const EVP_PKEY *x, @@ -193,7 +193,7 @@ EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, EVP_PKEY *ret; if (!(bp = BIO_new_fp(fp, BIO_NOCLOSE))) { OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB); - return NULL; + return nullptr; } ret = d2i_PKCS8PrivateKey_bio(bp, x, cb, u); BIO_free(bp); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_pkey.cc b/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_pkey.cc index c40bba4430..433215e0f4 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_pkey.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/pem/pem_pkey.cc @@ -28,20 +28,20 @@ EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u) { - char *nm = NULL; - const unsigned char *p = NULL; - unsigned char *data = NULL; + char *nm = nullptr; + const unsigned char *p = nullptr; + unsigned char *data = nullptr; long len; - EVP_PKEY *ret = NULL; + EVP_PKEY *ret = nullptr; if (!PEM_bytes_read_bio(&data, &len, &nm, PEM_STRING_EVP_PKEY, bp, cb, u)) { - return NULL; + return nullptr; } p = data; if (strcmp(nm, PEM_STRING_PKCS8INF) == 0) { PKCS8_PRIV_KEY_INFO *p8inf; - p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, &p, len); + p8inf = d2i_PKCS8_PRIV_KEY_INFO(nullptr, &p, len); if (!p8inf) { goto p8err; } @@ -58,7 +58,7 @@ EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, X509_SIG *p8; int pass_len; char psbuf[PEM_BUFSIZE]; - p8 = d2i_X509_SIG(NULL, &p, len); + p8 = d2i_X509_SIG(nullptr, &p, len); if (!p8) { goto p8err; } @@ -98,7 +98,7 @@ EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, ret = d2i_PrivateKey(EVP_PKEY_DSA, x, &p, len); } p8err: - if (ret == NULL) { + if (ret == nullptr) { OPENSSL_PUT_ERROR(PEM, ERR_R_ASN1_LIB); } @@ -118,9 +118,9 @@ int PEM_write_bio_PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, EVP_PKEY *PEM_read_PrivateKey(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void *u) { BIO *b = BIO_new_fp(fp, BIO_NOCLOSE); - if (b == NULL) { + if (b == nullptr) { OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB); - return NULL; + return nullptr; } EVP_PKEY *ret = PEM_read_bio_PrivateKey(b, x, cb, u); BIO_free(b); @@ -131,7 +131,7 @@ int PEM_write_PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, const unsigned char *pass, int pass_len, pem_password_cb *cb, void *u) { BIO *b = BIO_new_fp(fp, BIO_NOCLOSE); - if (b == NULL) { + if (b == nullptr) { OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB); return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/perlasm/readme b/naiveproxy/src/third_party/boringssl/src/crypto/perlasm/readme index 4fb6fa25d0..78d7d0c89d 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/perlasm/readme +++ b/naiveproxy/src/third_party/boringssl/src/crypto/perlasm/readme @@ -1,5 +1,5 @@ The perl scripts in this directory are my 'hack' to generate -multiple different assembler formats via the one origional script. +multiple different assembler formats via the one original script. The way to use this library is to start with adding the path to this directory and then include it. @@ -35,7 +35,7 @@ Functions of interest are: &function_begin_B(name,extra) Same as normal function_begin but no pushing. &function_end(name) Call at end of function. &function_end_A(name) Standard pop and ret, for use inside functions -&function_end_B(name) Call at end but with poping or 'ret'. +&function_end_B(name) Call at end but with popping or 'ret'. &swtmp(num) Address on stack temp word. &wparam(num) Parameter number num, that was push in C convention. This all works over pushes diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/pkcs7/pkcs7.cc b/naiveproxy/src/third_party/boringssl/src/crypto/pkcs7/pkcs7.cc index aa92cc137b..2b0b87911c 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/pkcs7/pkcs7.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/pkcs7/pkcs7.cc @@ -45,7 +45,7 @@ int pkcs7_parse_header(uint8_t **der_bytes, CBS *out, CBS *cbs) { uint64_t version; // The input may be in BER format. - *der_bytes = NULL; + *der_bytes = nullptr; if (!CBS_asn1_ber_to_der(cbs, &in, der_bytes) || // See https://tools.ietf.org/html/rfc2315#section-7 !CBS_get_asn1(&in, &content_info, CBS_ASN1_SEQUENCE) || @@ -64,8 +64,8 @@ int pkcs7_parse_header(uint8_t **der_bytes, CBS *out, CBS *cbs) { CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 0) || !CBS_get_asn1(&wrapped_signed_data, &signed_data, CBS_ASN1_SEQUENCE) || !CBS_get_asn1_uint64(&signed_data, &version) || - !CBS_get_asn1(&signed_data, NULL /* digests */, CBS_ASN1_SET) || - !CBS_get_asn1(&signed_data, NULL /* content */, CBS_ASN1_SEQUENCE)) { + !CBS_get_asn1(&signed_data, nullptr /* digests */, CBS_ASN1_SET) || + !CBS_get_asn1(&signed_data, nullptr /* content */, CBS_ASN1_SEQUENCE)) { goto err; } @@ -79,14 +79,14 @@ int pkcs7_parse_header(uint8_t **der_bytes, CBS *out, CBS *cbs) { err: OPENSSL_free(*der_bytes); - *der_bytes = NULL; + *der_bytes = nullptr; return 0; } int PKCS7_get_raw_certificates(STACK_OF(CRYPTO_BUFFER) *out_certs, CBS *cbs, CRYPTO_BUFFER_POOL *pool) { CBS signed_data, certificates; - uint8_t *der_bytes = NULL; + uint8_t *der_bytes = nullptr; int ret = 0, has_certificates; const size_t initial_certs_len = sk_CRYPTO_BUFFER_num(out_certs); @@ -99,7 +99,7 @@ int PKCS7_get_raw_certificates(STACK_OF(CRYPTO_BUFFER) *out_certs, CBS *cbs, } if (!has_certificates) { - CBS_init(&certificates, NULL, 0); + CBS_init(&certificates, nullptr, 0); } while (CBS_len(&certificates) > 0) { @@ -109,7 +109,7 @@ int PKCS7_get_raw_certificates(STACK_OF(CRYPTO_BUFFER) *out_certs, CBS *cbs, } CRYPTO_BUFFER *buf = CRYPTO_BUFFER_new_from_CBS(&cert, pool); - if (buf == NULL || !sk_CRYPTO_BUFFER_push(out_certs, buf)) { + if (buf == nullptr || !sk_CRYPTO_BUFFER_push(out_certs, buf)) { CRYPTO_BUFFER_free(buf); goto err; } @@ -179,14 +179,15 @@ int pkcs7_add_signed_data(CBB *out, uint64_t signed_data_version, !CBB_add_asn1(&wrapped_seq, &seq, CBS_ASN1_SEQUENCE) || !CBB_add_asn1_uint64(&seq, signed_data_version) || !CBB_add_asn1(&seq, &digest_algos_set, CBS_ASN1_SET) || - (digest_algos_cb != NULL && !digest_algos_cb(&digest_algos_set, arg)) || + (digest_algos_cb != nullptr && + !digest_algos_cb(&digest_algos_set, arg)) || !CBB_flush_asn1_set_of(&digest_algos_set) || !CBB_add_asn1(&seq, &content_info, CBS_ASN1_SEQUENCE) || !CBB_add_asn1_element(&content_info, CBS_ASN1_OBJECT, kPKCS7Data, sizeof(kPKCS7Data)) || - (cert_crl_cb != NULL && !cert_crl_cb(&seq, arg)) || + (cert_crl_cb != nullptr && !cert_crl_cb(&seq, arg)) || !CBB_add_asn1(&seq, &signer_infos, CBS_ASN1_SET) || - (signer_infos_cb != NULL && !signer_infos_cb(&signer_infos, arg)) || + (signer_infos_cb != nullptr && !signer_infos_cb(&signer_infos, arg)) || !CBB_flush_asn1_set_of(&signer_infos)) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/pkcs7/pkcs7_x509.cc b/naiveproxy/src/third_party/boringssl/src/crypto/pkcs7/pkcs7_x509.cc index 8933f61b32..efc2f2fa29 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/pkcs7/pkcs7_x509.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/pkcs7/pkcs7_x509.cc @@ -40,14 +40,14 @@ int PKCS7_get_certificates(STACK_OF(X509) *out_certs, CBS *cbs) { int ret = 0; const size_t initial_certs_len = sk_X509_num(out_certs); STACK_OF(CRYPTO_BUFFER) *raw = sk_CRYPTO_BUFFER_new_null(); - if (raw == NULL || !PKCS7_get_raw_certificates(raw, cbs, NULL)) { + if (raw == nullptr || !PKCS7_get_raw_certificates(raw, cbs, nullptr)) { goto err; } for (size_t i = 0; i < sk_CRYPTO_BUFFER_num(raw); i++) { CRYPTO_BUFFER *buf = sk_CRYPTO_BUFFER_value(raw, i); X509 *x509 = X509_parse_from_buffer(buf); - if (x509 == NULL || !sk_X509_push(out_certs, x509)) { + if (x509 == nullptr || !sk_X509_push(out_certs, x509)) { X509_free(x509); goto err; } @@ -69,7 +69,7 @@ err: int PKCS7_get_CRLs(STACK_OF(X509_CRL) *out_crls, CBS *cbs) { CBS signed_data, crls; - uint8_t *der_bytes = NULL; + uint8_t *der_bytes = nullptr; int ret = 0, has_crls; const size_t initial_crls_len = sk_X509_CRL_num(out_crls); @@ -78,7 +78,7 @@ int PKCS7_get_CRLs(STACK_OF(X509_CRL) *out_crls, CBS *cbs) { // Even if only CRLs are included, there may be an empty certificates // block. OpenSSL does this, for example. !CBS_get_optional_asn1( - &signed_data, NULL, NULL, + &signed_data, nullptr, nullptr, CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 0) || !CBS_get_optional_asn1( &signed_data, &crls, &has_crls, @@ -87,7 +87,7 @@ int PKCS7_get_CRLs(STACK_OF(X509_CRL) *out_crls, CBS *cbs) { } if (!has_crls) { - CBS_init(&crls, NULL, 0); + CBS_init(&crls, nullptr, 0); } while (CBS_len(&crls) > 0) { @@ -103,7 +103,7 @@ int PKCS7_get_CRLs(STACK_OF(X509_CRL) *out_crls, CBS *cbs) { goto err; } inp = CBS_data(&crl_data); - crl = d2i_X509_CRL(NULL, &inp, (long)CBS_len(&crl_data)); + crl = d2i_X509_CRL(nullptr, &inp, (long)CBS_len(&crl_data)); if (!crl) { goto err; } @@ -138,10 +138,10 @@ int PKCS7_get_PEM_certificates(STACK_OF(X509) *out_certs, BIO *pem_bio) { // Even though we pass PEM_STRING_PKCS7 as the expected PEM type here, PEM // internally will actually allow several other values too, including // "CERTIFICATE". - if (!PEM_bytes_read_bio(&data, &len, NULL /* PEM type output */, + if (!PEM_bytes_read_bio(&data, &len, nullptr /* PEM type output */, PEM_STRING_PKCS7, pem_bio, - NULL /* password callback */, - NULL /* password callback argument */)) { + nullptr /* password callback */, + nullptr /* password callback argument */)) { return 0; } @@ -160,10 +160,10 @@ int PKCS7_get_PEM_CRLs(STACK_OF(X509_CRL) *out_crls, BIO *pem_bio) { // Even though we pass PEM_STRING_PKCS7 as the expected PEM type here, PEM // internally will actually allow several other values too, including // "CERTIFICATE". - if (!PEM_bytes_read_bio(&data, &len, NULL /* PEM type output */, + if (!PEM_bytes_read_bio(&data, &len, nullptr /* PEM type output */, PEM_STRING_PKCS7, pem_bio, - NULL /* password callback */, - NULL /* password callback argument */)) { + nullptr /* password callback */, + nullptr /* password callback argument */)) { return 0; } @@ -188,7 +188,7 @@ static int pkcs7_bundle_certificates_cb(CBB *out, void *arg) { for (i = 0; i < sk_X509_num(certs); i++) { X509 *x509 = sk_X509_value(certs, i); uint8_t *buf; - int len = i2d_X509(x509, NULL); + int len = i2d_X509(x509, nullptr); if (len < 0 || !CBB_add_space(&certificates, &buf, len) || i2d_X509(x509, &buf) < 0) { @@ -221,7 +221,7 @@ static int pkcs7_bundle_crls_cb(CBB *out, void *arg) { for (i = 0; i < sk_X509_CRL_num(crls); i++) { X509_CRL *crl = sk_X509_CRL_value(crls, i); uint8_t *buf; - int len = i2d_X509_CRL(crl, NULL); + int len = i2d_X509_CRL(crl, nullptr); if (len < 0 || !CBB_add_space(&crl_data, &buf, len) || i2d_X509_CRL(crl, &buf) < 0) { @@ -243,18 +243,18 @@ int PKCS7_bundle_CRLs(CBB *out, const STACK_OF(X509_CRL) *crls) { static PKCS7 *pkcs7_new(CBS *cbs) { CBS copy = *cbs, copy2 = *cbs; PKCS7 *ret = reinterpret_cast(OPENSSL_zalloc(sizeof(PKCS7))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->type = OBJ_nid2obj(NID_pkcs7_signed); ret->d.sign = reinterpret_cast(OPENSSL_malloc(sizeof(PKCS7_SIGNED))); - if (ret->d.sign == NULL) { + if (ret->d.sign == nullptr) { goto err; } ret->d.sign->cert = sk_X509_new_null(); ret->d.sign->crl = sk_X509_CRL_new_null(); - if (ret->d.sign->cert == NULL || ret->d.sign->crl == NULL || + if (ret->d.sign->cert == nullptr || ret->d.sign->crl == nullptr || !PKCS7_get_certificates(ret->d.sign->cert, ©) || !PKCS7_get_CRLs(ret->d.sign->crl, cbs)) { goto err; @@ -262,18 +262,18 @@ static PKCS7 *pkcs7_new(CBS *cbs) { if (sk_X509_num(ret->d.sign->cert) == 0) { sk_X509_free(ret->d.sign->cert); - ret->d.sign->cert = NULL; + ret->d.sign->cert = nullptr; } if (sk_X509_CRL_num(ret->d.sign->crl) == 0) { sk_X509_CRL_free(ret->d.sign->crl); - ret->d.sign->crl = NULL; + ret->d.sign->crl = nullptr; } ret->ber_len = CBS_len(©2) - CBS_len(cbs); ret->ber_bytes = reinterpret_cast( OPENSSL_memdup(CBS_data(©2), ret->ber_len)); - if (ret->ber_bytes == NULL) { + if (ret->ber_bytes == nullptr) { goto err; } @@ -281,18 +281,18 @@ static PKCS7 *pkcs7_new(CBS *cbs) { err: PKCS7_free(ret); - return NULL; + return nullptr; } PKCS7 *d2i_PKCS7(PKCS7 **out, const uint8_t **inp, size_t len) { CBS cbs; CBS_init(&cbs, *inp, len); PKCS7 *ret = pkcs7_new(&cbs); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } *inp = CBS_data(&cbs); - if (out != NULL) { + if (out != nullptr) { PKCS7_free(*out); *out = ret; } @@ -305,14 +305,14 @@ PKCS7 *d2i_PKCS7_bio(BIO *bio, PKCS7 **out) { uint8_t *data; size_t len; if (!BIO_read_asn1(bio, &data, &len, kMaxSize)) { - return NULL; + return nullptr; } CBS cbs; CBS_init(&cbs, data, len); PKCS7 *ret = pkcs7_new(&cbs); OPENSSL_free(data); - if (out != NULL && ret != NULL) { + if (out != nullptr && ret != nullptr) { PKCS7_free(*out); *out = ret; } @@ -325,14 +325,14 @@ int i2d_PKCS7(const PKCS7 *p7, uint8_t **out) { return -1; } - if (out == NULL) { + if (out == nullptr) { return (int)p7->ber_len; } - if (*out == NULL) { + if (*out == nullptr) { *out = reinterpret_cast(OPENSSL_memdup(p7->ber_bytes, p7->ber_len)); - if (*out == NULL) { + if (*out == nullptr) { return -1; } } else { @@ -347,14 +347,14 @@ int i2d_PKCS7_bio(BIO *bio, const PKCS7 *p7) { } void PKCS7_free(PKCS7 *p7) { - if (p7 == NULL) { + if (p7 == nullptr) { return; } OPENSSL_free(p7->ber_bytes); ASN1_OBJECT_free(p7->type); // We only supported signed data. - if (p7->d.sign != NULL) { + if (p7->d.sign != nullptr) { sk_X509_pop_free(p7->d.sign->cert, X509_free); sk_X509_CRL_pop_free(p7->d.sign->crl, X509_CRL_free); OPENSSL_free(p7->d.sign); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/pkcs8/p5_pbev2.cc b/naiveproxy/src/third_party/boringssl/src/crypto/pkcs8/p5_pbev2.cc index e70bdb54de..bfb2f418fe 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/pkcs8/p5_pbev2.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/pkcs8/p5_pbev2.cc @@ -122,7 +122,7 @@ static int pkcs5_pbe2_cipher_init(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, uint8_t key[EVP_MAX_KEY_LENGTH]; int ret = PKCS5_PBKDF2_HMAC(pass, pass_len, salt, salt_len, iterations, pbkdf2_md, EVP_CIPHER_key_length(cipher), key) && - EVP_CipherInit_ex(ctx, cipher, NULL /* engine */, key, iv, enc); + EVP_CipherInit_ex(ctx, cipher, nullptr /* engine */, key, iv, enc); OPENSSL_cleanse(key, EVP_MAX_KEY_LENGTH); return ret; } @@ -199,7 +199,7 @@ int PKCS5_pbe2_decrypt_init(const struct pbe_suite *suite, EVP_CIPHER_CTX *ctx, // See if we recognise the encryption algorithm. const EVP_CIPHER *cipher = cbs_to_cipher(&enc_obj); - if (cipher == NULL) { + if (cipher == nullptr) { OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_UNSUPPORTED_CIPHER); return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/pkcs8/pkcs8.cc b/naiveproxy/src/third_party/boringssl/src/crypto/pkcs8/pkcs8.cc index 91a81fac02..11ee7e9a26 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/pkcs8/pkcs8.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/pkcs8/pkcs8.cc @@ -72,13 +72,13 @@ int pkcs12_key_gen(const char *pass, size_t pass_len, const uint8_t *salt, int ret = 0; EVP_MD_CTX ctx; EVP_MD_CTX_init(&ctx); - uint8_t *pass_raw = NULL, *I = NULL; + uint8_t *pass_raw = nullptr, *I = nullptr; size_t pass_raw_len = 0, I_len = 0; { // If |pass| is NULL, we use the empty string rather than {0, 0} as the raw // password. - if (pass != NULL && + if (pass != nullptr && !pkcs12_encode_password(pass, pass_len, &pass_raw, &pass_raw_len)) { goto err; } @@ -115,7 +115,7 @@ int pkcs12_key_gen(const char *pass, size_t pass_len, const uint8_t *salt, } I = reinterpret_cast(OPENSSL_malloc(I_len)); - if (I_len != 0 && I == NULL) { + if (I_len != 0 && I == nullptr) { goto err; } @@ -131,14 +131,14 @@ int pkcs12_key_gen(const char *pass, size_t pass_len, const uint8_t *salt, // H(H(H(... H(D||I)))) uint8_t A[EVP_MAX_MD_SIZE]; unsigned A_len; - if (!EVP_DigestInit_ex(&ctx, md, NULL) || + if (!EVP_DigestInit_ex(&ctx, md, nullptr) || !EVP_DigestUpdate(&ctx, D, block_size) || !EVP_DigestUpdate(&ctx, I, I_len) || !EVP_DigestFinal_ex(&ctx, A, &A_len)) { goto err; } for (uint32_t iter = 1; iter < iterations; iter++) { - if (!EVP_DigestInit_ex(&ctx, md, NULL) || + if (!EVP_DigestInit_ex(&ctx, md, nullptr) || !EVP_DigestUpdate(&ctx, A, A_len) || !EVP_DigestFinal_ex(&ctx, A, &A_len)) { goto err; @@ -202,7 +202,7 @@ static int pkcs12_pbe_cipher_init(const struct pbe_suite *suite, return 0; } - int ret = EVP_CipherInit_ex(ctx, cipher, NULL, key, iv, is_encrypt); + int ret = EVP_CipherInit_ex(ctx, cipher, nullptr, key, iv, is_encrypt); OPENSSL_cleanse(key, EVP_MAX_KEY_LENGTH); OPENSSL_cleanse(iv, EVP_MAX_IV_LENGTH); return ret; @@ -264,22 +264,22 @@ static const struct pbe_suite kBuiltinPBE[] = { // 1.2.840.113549.1.5.13 {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0d}, 9, - NULL, - NULL, + nullptr, + nullptr, PKCS5_pbe2_decrypt_init, }, }; static const struct pbe_suite *get_pkcs12_pbe_suite(int pbe_nid) { - for (unsigned i = 0; i < OPENSSL_ARRAY_SIZE(kBuiltinPBE); i++) { - if (kBuiltinPBE[i].pbe_nid == pbe_nid && + for (const auto &pbe : kBuiltinPBE) { + if (pbe.pbe_nid == pbe_nid && // If |cipher_func| or |md_func| are missing, this is a PBES2 scheme. - kBuiltinPBE[i].cipher_func != NULL && kBuiltinPBE[i].md_func != NULL) { - return &kBuiltinPBE[i]; + pbe.cipher_func != nullptr && pbe.md_func != nullptr) { + return &pbe; } } - return NULL; + return nullptr; } int pkcs12_pbe_encrypt_init(CBB *out, EVP_CIPHER_CTX *ctx, int alg_nid, @@ -296,7 +296,7 @@ int pkcs12_pbe_encrypt_init(CBB *out, EVP_CIPHER_CTX *ctx, int alg_nid, } const struct pbe_suite *suite = get_pkcs12_pbe_suite(alg_nid); - if (suite == NULL) { + if (suite == nullptr) { OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_UNKNOWN_ALGORITHM); return 0; } @@ -323,23 +323,23 @@ int pkcs8_pbe_decrypt(uint8_t **out, size_t *out_len, CBS *algorithm, const char *pass, size_t pass_len, const uint8_t *in, size_t in_len) { int ret = 0; - uint8_t *buf = NULL; + uint8_t *buf = nullptr; bssl::ScopedEVP_CIPHER_CTX ctx; CBS obj; - const struct pbe_suite *suite = NULL; + const struct pbe_suite *suite = nullptr; if (!CBS_get_asn1(algorithm, &obj, CBS_ASN1_OBJECT)) { OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_DECODE_ERROR); goto err; } - for (unsigned i = 0; i < OPENSSL_ARRAY_SIZE(kBuiltinPBE); i++) { - if (CBS_mem_equal(&obj, kBuiltinPBE[i].oid, kBuiltinPBE[i].oid_len)) { - suite = &kBuiltinPBE[i]; + for (const auto &pbe : kBuiltinPBE) { + if (CBS_mem_equal(&obj, pbe.oid, pbe.oid_len)) { + suite = &pbe; break; } } - if (suite == NULL) { + if (suite == nullptr) { OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_UNKNOWN_ALGORITHM); goto err; } @@ -350,7 +350,7 @@ int pkcs8_pbe_decrypt(uint8_t **out, size_t *out_len, CBS *algorithm, } buf = reinterpret_cast(OPENSSL_malloc(in_len)); - if (buf == NULL) { + if (buf == nullptr) { goto err; } @@ -368,7 +368,7 @@ int pkcs8_pbe_decrypt(uint8_t **out, size_t *out_len, CBS *algorithm, *out = buf; *out_len = n1 + n2; ret = 1; - buf = NULL; + buf = nullptr; err: OPENSSL_free(buf); @@ -384,14 +384,14 @@ EVP_PKEY *PKCS8_parse_encrypted_private_key(CBS *cbs, const char *pass, !CBS_get_asn1(&epki, &ciphertext, CBS_ASN1_OCTETSTRING) || CBS_len(&epki) != 0) { OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_DECODE_ERROR); - return 0; + return nullptr; } uint8_t *out; size_t out_len; if (!pkcs8_pbe_decrypt(&out, &out_len, &algorithm, pass, pass_len, CBS_data(&ciphertext), CBS_len(&ciphertext))) { - return 0; + return nullptr; } CBS pki; @@ -407,19 +407,19 @@ int PKCS8_marshal_encrypted_private_key(CBB *out, int pbe_nid, const uint8_t *salt, size_t salt_len, int iterations, const EVP_PKEY *pkey) { int ret = 0; - uint8_t *plaintext = NULL, *salt_buf = NULL; + uint8_t *plaintext = nullptr, *salt_buf = nullptr; size_t plaintext_len = 0; bssl::ScopedEVP_CIPHER_CTX ctx; { // Generate a random salt if necessary. - if (salt == NULL) { + if (salt == nullptr) { if (salt_len == 0) { salt_len = PKCS5_SALT_LEN; } salt_buf = reinterpret_cast(OPENSSL_malloc(salt_len)); - if (salt_buf == NULL || !RAND_bytes(salt_buf, salt_len)) { + if (salt_buf == nullptr || !RAND_bytes(salt_buf, salt_len)) { goto err; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/pkcs8/pkcs8_x509.cc b/naiveproxy/src/third_party/boringssl/src/crypto/pkcs8/pkcs8_x509.cc index 168912b60b..d2ccec17c8 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/pkcs8/pkcs8_x509.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/pkcs8/pkcs8_x509.cc @@ -62,20 +62,20 @@ ASN1_SEQUENCE(PKCS8_PRIV_KEY_INFO) = { IMPLEMENT_ASN1_FUNCTIONS_const(PKCS8_PRIV_KEY_INFO) EVP_PKEY *EVP_PKCS82PKEY(const PKCS8_PRIV_KEY_INFO *p8) { - uint8_t *der = NULL; + uint8_t *der = nullptr; int der_len = i2d_PKCS8_PRIV_KEY_INFO(p8, &der); if (der_len < 0) { - return NULL; + return nullptr; } CBS cbs; CBS_init(&cbs, der, (size_t)der_len); EVP_PKEY *ret = EVP_parse_private_key(&cbs); - if (ret == NULL || CBS_len(&cbs) != 0) { + if (ret == nullptr || CBS_len(&cbs) != 0) { OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_DECODE_ERROR); EVP_PKEY_free(ret); OPENSSL_free(der); - return NULL; + return nullptr; } OPENSSL_free(der); @@ -84,19 +84,19 @@ EVP_PKEY *EVP_PKCS82PKEY(const PKCS8_PRIV_KEY_INFO *p8) { PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(const EVP_PKEY *pkey) { CBB cbb; - uint8_t *der = NULL; + uint8_t *der = nullptr; size_t der_len; if (!CBB_init(&cbb, 0) || !EVP_marshal_private_key(&cbb, pkey) || !CBB_finish(&cbb, &der, &der_len) || der_len > LONG_MAX) { CBB_cleanup(&cbb); OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_ENCODE_ERROR); OPENSSL_free(der); - return NULL; + return nullptr; } const uint8_t *p = der; - PKCS8_PRIV_KEY_INFO *p8 = d2i_PKCS8_PRIV_KEY_INFO(NULL, &p, (long)der_len); - if (p8 == NULL || p != der + der_len) { + PKCS8_PRIV_KEY_INFO *p8 = d2i_PKCS8_PRIV_KEY_INFO(nullptr, &p, (long)der_len); + if (p8 == nullptr || p != der + der_len) { PKCS8_PRIV_KEY_INFO_free(p8); OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_DECODE_ERROR); goto err; @@ -107,21 +107,21 @@ PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(const EVP_PKEY *pkey) { err: OPENSSL_free(der); - return NULL; + return nullptr; } PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(X509_SIG *pkcs8, const char *pass, int pass_len_in) { size_t pass_len; - if (pass_len_in == -1 && pass != NULL) { + if (pass_len_in == -1 && pass != nullptr) { pass_len = strlen(pass); } else { pass_len = (size_t)pass_len_in; } - PKCS8_PRIV_KEY_INFO *ret = NULL; - EVP_PKEY *pkey = NULL; - uint8_t *in = NULL; + PKCS8_PRIV_KEY_INFO *ret = nullptr; + EVP_PKEY *pkey = nullptr; + uint8_t *in = nullptr; // Convert the legacy ASN.1 object to a byte string. int in_len = i2d_X509_SIG(pkcs8, &in); @@ -132,7 +132,7 @@ PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(X509_SIG *pkcs8, const char *pass, CBS cbs; CBS_init(&cbs, in, in_len); pkey = PKCS8_parse_encrypted_private_key(&cbs, pass, pass_len); - if (pkey == NULL || CBS_len(&cbs) != 0) { + if (pkey == nullptr || CBS_len(&cbs) != 0) { goto err; } @@ -148,7 +148,7 @@ X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, const char *pass, int pass_len_in, const uint8_t *salt, size_t salt_len, int iterations, PKCS8_PRIV_KEY_INFO *p8inf) { size_t pass_len; - if (pass_len_in == -1 && pass != NULL) { + if (pass_len_in == -1 && pass != nullptr) { pass_len = strlen(pass); } else { pass_len = (size_t)pass_len_in; @@ -156,12 +156,12 @@ X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, const char *pass, // Parse out the private key. EVP_PKEY *pkey = EVP_PKCS82PKEY(p8inf); - if (pkey == NULL) { - return NULL; + if (pkey == nullptr) { + return nullptr; } - X509_SIG *ret = NULL; - uint8_t *der = NULL; + X509_SIG *ret = nullptr; + uint8_t *der = nullptr; const uint8_t *ptr; size_t der_len; CBB cbb; @@ -176,11 +176,11 @@ X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, const char *pass, // Convert back to legacy ASN.1 objects. ptr = der; - ret = d2i_X509_SIG(NULL, &ptr, der_len); - if (ret == NULL || ptr != der + der_len) { + ret = d2i_X509_SIG(nullptr, &ptr, der_len); + if (ret == nullptr || ptr != der + der_len) { OPENSSL_PUT_ERROR(PKCS8, ERR_R_INTERNAL_ERROR); X509_SIG_free(ret); - ret = NULL; + ret = nullptr; } err: @@ -201,7 +201,7 @@ struct pkcs12_context { static int PKCS12_handle_sequence( CBS *sequence, struct pkcs12_context *ctx, int (*handle_element)(CBS *cbs, struct pkcs12_context *ctx)) { - uint8_t *storage = NULL; + uint8_t *storage = nullptr; CBS in; int ret = 0; @@ -269,7 +269,7 @@ static const uint8_t kX509Certificate[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, // success and zero on error. static int parse_bag_attributes(CBS *attrs, uint8_t **out_friendly_name, size_t *out_friendly_name_len) { - *out_friendly_name = NULL; + *out_friendly_name = nullptr; *out_friendly_name_len = 0; // See https://tools.ietf.org/html/rfc7292#section-4.2. @@ -284,7 +284,7 @@ static int parse_bag_attributes(CBS *attrs, uint8_t **out_friendly_name, if (CBS_mem_equal(&oid, kFriendlyName, sizeof(kFriendlyName))) { // See https://tools.ietf.org/html/rfc2985, section 5.5.1. CBS value; - if (*out_friendly_name != NULL || + if (*out_friendly_name != nullptr || !CBS_get_asn1(&values, &value, CBS_ASN1_BMPSTRING) || CBS_len(&values) != 0 || CBS_len(&value) == 0) { OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA); @@ -314,7 +314,7 @@ static int parse_bag_attributes(CBS *attrs, uint8_t **out_friendly_name, err: OPENSSL_free(*out_friendly_name); - *out_friendly_name = NULL; + *out_friendly_name = nullptr; *out_friendly_name_len = 0; return 0; } @@ -330,7 +330,7 @@ static int PKCS12_handle_safe_bag(CBS *safe_bag, struct pkcs12_context *ctx) { return 0; } if (CBS_len(safe_bag) == 0) { - CBS_init(&bag_attrs, NULL, 0); + CBS_init(&bag_attrs, nullptr, 0); } else if (!CBS_get_asn1(safe_bag, &bag_attrs, CBS_ASN1_SET) || CBS_len(safe_bag) != 0) { OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA); @@ -351,7 +351,7 @@ static int PKCS12_handle_safe_bag(CBS *safe_bag, struct pkcs12_context *ctx) { is_key_bag ? EVP_parse_private_key(&wrapped_value) : PKCS8_parse_encrypted_private_key( &wrapped_value, ctx->password, ctx->password_len); - if (pkey == NULL) { + if (pkey == nullptr) { return 0; } @@ -389,7 +389,7 @@ static int PKCS12_handle_safe_bag(CBS *safe_bag, struct pkcs12_context *ctx) { } const uint8_t *inp = CBS_data(&cert); - X509 *x509 = d2i_X509(NULL, &inp, (long)CBS_len(&cert)); + X509 *x509 = d2i_X509(nullptr, &inp, (long)CBS_len(&cert)); if (!x509) { OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_BAD_PKCS12_DATA); return 0; @@ -436,7 +436,7 @@ static int PKCS12_handle_content_info(CBS *content_info, struct pkcs12_context *ctx) { CBS content_type, wrapped_contents, contents; int ret = 0; - uint8_t *storage = NULL; + uint8_t *storage = nullptr; if (!CBS_get_asn1(content_info, &content_type, CBS_ASN1_OBJECT) || !CBS_get_asn1(content_info, &wrapped_contents, @@ -523,8 +523,8 @@ static int pkcs12_check_mac(int *out_mac_ok, const char *password, uint8_t hmac[EVP_MAX_MD_SIZE]; unsigned hmac_len; - if (NULL == HMAC(md, hmac_key, EVP_MD_size(md), CBS_data(authsafes), - CBS_len(authsafes), hmac, &hmac_len)) { + if (nullptr == HMAC(md, hmac_key, EVP_MD_size(md), CBS_data(authsafes), + CBS_len(authsafes), hmac, &hmac_len)) { goto err; } @@ -542,7 +542,7 @@ err: int PKCS12_get_key_and_certs(EVP_PKEY **out_key, STACK_OF(X509) *out_certs, CBS *ber_in, const char *password) { - uint8_t *storage = NULL; + uint8_t *storage = nullptr; CBS in, pfx, mac_data, authsafe, content_type, wrapped_authsafes, authsafes; uint64_t version; int ret = 0; @@ -555,7 +555,7 @@ int PKCS12_get_key_and_certs(EVP_PKEY **out_key, STACK_OF(X509) *out_certs, return 0; } - *out_key = NULL; + *out_key = nullptr; OPENSSL_memset(&ctx, 0, sizeof(ctx)); // See ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-12/pkcs-12v1.pdf, section @@ -610,7 +610,7 @@ int PKCS12_get_key_and_certs(EVP_PKEY **out_key, STACK_OF(X509) *out_certs, ctx.out_key = out_key; ctx.out_certs = out_certs; ctx.password = password; - ctx.password_len = password != NULL ? strlen(password) : 0; + ctx.password_len = password != nullptr ? strlen(password) : 0; // Verify the MAC. { @@ -621,7 +621,7 @@ int PKCS12_get_key_and_certs(EVP_PKEY **out_key, STACK_OF(X509) *out_certs, } const EVP_MD *md = EVP_parse_digest_algorithm(&mac); - if (md == NULL) { + if (md == nullptr) { goto err; } @@ -654,7 +654,7 @@ int PKCS12_get_key_and_certs(EVP_PKEY **out_key, STACK_OF(X509) *out_certs, // array for "no password". OpenSSL considers a non-NULL password as {0, // 0} and a NULL password as {}. It then, in high-level PKCS#12 parsing // code, tries both options. We match this behavior. - ctx.password = ctx.password != NULL ? NULL : ""; + ctx.password = ctx.password != nullptr ? nullptr : ""; if (!pkcs12_check_mac(&mac_ok, ctx.password, ctx.password_len, &salt, iterations, md, &authsafes, &expected_mac)) { goto err; @@ -677,7 +677,7 @@ err: OPENSSL_free(storage); if (!ret) { EVP_PKEY_free(*out_key); - *out_key = NULL; + *out_key = nullptr; while (sk_X509_num(out_certs) > original_out_certs_len) { X509 *x509 = sk_X509_pop(out_certs); X509_free(x509); @@ -698,14 +698,14 @@ PKCS12 *d2i_PKCS12(PKCS12 **out_p12, const uint8_t **ber_bytes, size_t ber_len) { PKCS12 *p12 = reinterpret_cast(OPENSSL_malloc(sizeof(PKCS12))); if (!p12) { - return NULL; + return nullptr; } p12->ber_bytes = reinterpret_cast(OPENSSL_memdup(*ber_bytes, ber_len)); if (!p12->ber_bytes) { OPENSSL_free(p12); - return NULL; + return nullptr; } p12->ber_len = ber_len; @@ -724,11 +724,11 @@ PKCS12 *d2i_PKCS12_bio(BIO *bio, PKCS12 **out_p12) { BUF_MEM *buf; const uint8_t *dummy; static const size_t kMaxSize = 256 * 1024; - PKCS12 *ret = NULL; + PKCS12 *ret = nullptr; buf = BUF_MEM_new(); - if (buf == NULL) { - return NULL; + if (buf == nullptr) { + return nullptr; } if (BUF_MEM_grow(buf, 8192) == 0) { goto out; @@ -775,7 +775,7 @@ PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **out_p12) { bio = BIO_new_fp(fp, 0 /* don't take ownership */); if (!bio) { - return NULL; + return nullptr; } ret = d2i_PKCS12_bio(bio, out_p12); @@ -789,14 +789,14 @@ int i2d_PKCS12(const PKCS12 *p12, uint8_t **out) { return -1; } - if (out == NULL) { + if (out == nullptr) { return (int)p12->ber_len; } - if (*out == NULL) { + if (*out == nullptr) { *out = reinterpret_cast( OPENSSL_memdup(p12->ber_bytes, p12->ber_len)); - if (*out == NULL) { + if (*out == nullptr) { return -1; } } else { @@ -812,7 +812,7 @@ int i2d_PKCS12_bio(BIO *bio, const PKCS12 *p12) { int i2d_PKCS12_fp(FILE *fp, const PKCS12 *p12) { BIO *bio = BIO_new_fp(fp, 0 /* don't take ownership */); - if (bio == NULL) { + if (bio == nullptr) { return 0; } @@ -824,16 +824,16 @@ int i2d_PKCS12_fp(FILE *fp, const PKCS12 *p12) { int PKCS12_parse(const PKCS12 *p12, const char *password, EVP_PKEY **out_pkey, X509 **out_cert, STACK_OF(X509) **out_ca_certs) { CBS ber_bytes; - STACK_OF(X509) *ca_certs = NULL; + STACK_OF(X509) *ca_certs = nullptr; char ca_certs_alloced = 0; - if (out_ca_certs != NULL && *out_ca_certs != NULL) { + if (out_ca_certs != nullptr && *out_ca_certs != nullptr) { ca_certs = *out_ca_certs; } if (!ca_certs) { ca_certs = sk_X509_new_null(); - if (ca_certs == NULL) { + if (ca_certs == nullptr) { return 0; } ca_certs_alloced = 1; @@ -849,9 +849,9 @@ int PKCS12_parse(const PKCS12 *p12, const char *password, EVP_PKEY **out_pkey, // OpenSSL selects the last certificate which matches the private key as // |out_cert|. - *out_cert = NULL; + *out_cert = nullptr; size_t num_certs = sk_X509_num(ca_certs); - if (*out_pkey != NULL && num_certs > 0) { + if (*out_pkey != nullptr && num_certs > 0) { for (size_t i = num_certs - 1; i < num_certs; i--) { X509 *cert = sk_X509_value(ca_certs, i); if (X509_check_private_key(cert, *out_pkey)) { @@ -874,19 +874,19 @@ int PKCS12_parse(const PKCS12 *p12, const char *password, EVP_PKEY **out_pkey, int PKCS12_verify_mac(const PKCS12 *p12, const char *password, int password_len) { - if (password == NULL) { + if (password == nullptr) { if (password_len != 0) { return 0; } } else if (password_len != -1 && (password[password_len] != 0 || - OPENSSL_memchr(password, 0, password_len) != NULL)) { + OPENSSL_memchr(password, 0, password_len) != nullptr)) { return 0; } - EVP_PKEY *pkey = NULL; - X509 *cert = NULL; - if (!PKCS12_parse(p12, password, &pkey, &cert, NULL)) { + EVP_PKEY *pkey = nullptr; + X509 *cert = nullptr; + if (!PKCS12_parse(p12, password, &pkey, &cert, nullptr)) { ERR_clear_error(); return 0; } @@ -901,7 +901,7 @@ int PKCS12_verify_mac(const PKCS12 *p12, const char *password, // containing the specified friendlyName and localKeyId attributes. static int add_bag_attributes(CBB *bag, const char *name, size_t name_len, const uint8_t *key_id, size_t key_id_len) { - if (name == NULL && key_id_len == 0) { + if (name == nullptr && key_id_len == 0) { return 1; // Omit the OPTIONAL SET. } // See https://tools.ietf.org/html/rfc7292#section-4.2. @@ -961,7 +961,7 @@ static int add_cert_bag(CBB *cbb, X509 *cert, const char *name, return 0; } uint8_t *buf; - int len = i2d_X509(cert, NULL); + int len = i2d_X509(cert, nullptr); int int_name_len = 0; const char *cert_name = (const char *)X509_alias_get0(cert, &int_name_len); @@ -990,14 +990,15 @@ static int add_cert_safe_contents(CBB *cbb, X509 *cert, const uint8_t *key_id, size_t key_id_len) { CBB safe_contents; if (!CBB_add_asn1(cbb, &safe_contents, CBS_ASN1_SEQUENCE) || - (cert != NULL && + (cert != nullptr && !add_cert_bag(&safe_contents, cert, name, key_id, key_id_len))) { return 0; } for (size_t i = 0; i < sk_X509_num(chain); i++) { // Only the leaf certificate gets attributes. - if (!add_cert_bag(&safe_contents, sk_X509_value(chain, i), NULL, NULL, 0)) { + if (!add_cert_bag(&safe_contents, sk_X509_value(chain, i), nullptr, nullptr, + 0)) { return 0; } } @@ -1088,9 +1089,9 @@ PKCS12 *PKCS12_create(const char *password, const char *name, // PKCS#12 file. mac_iterations < 0 || // Don't encode empty objects. - (pkey == NULL && cert == NULL && sk_X509_num(chain) == 0)) { + (pkey == nullptr && cert == nullptr && sk_X509_num(chain) == 0)) { OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_UNSUPPORTED_OPTIONS); - return 0; + return nullptr; } // PKCS#12 is a very confusing recursive data format, built out of another @@ -1126,22 +1127,22 @@ PKCS12 *PKCS12_create(const char *password, const char *name, // Note that |password| may be NULL to specify no password, rather than the // empty string. They are encoded differently in PKCS#12. (One is the empty // byte array and the other is NUL-terminated UCS-2.) - size_t password_len = password != NULL ? strlen(password) : 0; + size_t password_len = password != nullptr ? strlen(password) : 0; uint8_t key_id[EVP_MAX_MD_SIZE]; unsigned key_id_len = 0; - if (cert != NULL && pkey != NULL) { + if (cert != nullptr && pkey != nullptr) { if (!X509_check_private_key(cert, pkey) || // Matching OpenSSL, use the SHA-1 hash of the certificate as the local // key ID. Some PKCS#12 consumers require one to connect the private key // and certificate. !X509_digest(cert, EVP_sha1(), key_id, &key_id_len)) { - return 0; + return nullptr; } } // See https://tools.ietf.org/html/rfc7292#section-4. - PKCS12 *ret = NULL; + PKCS12 *ret = nullptr; CBB cbb, pfx, auth_safe, auth_safe_wrapper, auth_safe_data, content_infos; uint8_t mac_key[EVP_MAX_MD_SIZE]; if (!CBB_init(&cbb, 0) || !CBB_add_asn1(&cbb, &pfx, CBS_ASN1_SEQUENCE) || @@ -1162,7 +1163,7 @@ PKCS12 *PKCS12_create(const char *password, const char *name, // If there are any certificates, place them in CertBags wrapped in a single // encrypted ContentInfo. - if (cert != NULL || sk_X509_num(chain) > 0) { + if (cert != nullptr || sk_X509_num(chain) > 0) { if (cert_nid < 0) { // Place the certificates in an unencrypted ContentInfo. This could be // more compactly-encoded by reusing the same ContentInfo as the key, but @@ -1208,7 +1209,7 @@ PKCS12 *PKCS12_create(const char *password, const char *name, // wrapped in an unencrypted ContentInfo. (One could also place it in a KeyBag // inside an encrypted ContentInfo, but OpenSSL does not do this and some // PKCS#12 consumers do not support KeyBags.) - if (pkey != NULL) { + if (pkey != nullptr) { CBB content_info, wrapper, data, safe_contents, bag, bag_contents; if ( // Add another data ContentInfo. !CBB_add_asn1(&content_infos, &content_info, CBS_ASN1_SEQUENCE) || @@ -1244,7 +1245,7 @@ PKCS12 *PKCS12_create(const char *password, const char *name, CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 0) || !PKCS8_marshal_encrypted_private_key( &bag_contents, key_nid, cipher, password, password_len, - NULL /* generate a random salt */, + nullptr /* generate a random salt */, 0 /* use default salt length */, iterations, pkey)) { goto err; } @@ -1300,9 +1301,9 @@ PKCS12 *PKCS12_create(const char *password, const char *name, } ret = reinterpret_cast(OPENSSL_malloc(sizeof(PKCS12))); - if (ret == NULL || !CBB_finish(&cbb, &ret->ber_bytes, &ret->ber_len)) { + if (ret == nullptr || !CBB_finish(&cbb, &ret->ber_bytes, &ret->ber_len)) { OPENSSL_free(ret); - ret = NULL; + ret = nullptr; goto err; } } @@ -1314,7 +1315,7 @@ err: } void PKCS12_free(PKCS12 *p12) { - if (p12 == NULL) { + if (p12 == nullptr) { return; } OPENSSL_free(p12->ber_bytes); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/pool/pool.cc b/naiveproxy/src/third_party/boringssl/src/crypto/pool/pool.cc index 3761bfdb9e..fb0e6665bc 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/pool/pool.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/pool/pool.cc @@ -32,7 +32,7 @@ static uint32_t CRYPTO_BUFFER_hash(const CRYPTO_BUFFER *buf) { static int CRYPTO_BUFFER_cmp(const CRYPTO_BUFFER *a, const CRYPTO_BUFFER *b) { // Only |CRYPTO_BUFFER|s from the same pool have compatible hashes. - assert(a->pool != NULL); + assert(a->pool != nullptr); assert(a->pool == b->pool); if (a->len != b->len) { return 1; @@ -43,14 +43,14 @@ static int CRYPTO_BUFFER_cmp(const CRYPTO_BUFFER *a, const CRYPTO_BUFFER *b) { CRYPTO_BUFFER_POOL *CRYPTO_BUFFER_POOL_new(void) { CRYPTO_BUFFER_POOL *pool = reinterpret_cast( OPENSSL_zalloc(sizeof(CRYPTO_BUFFER_POOL))); - if (pool == NULL) { - return NULL; + if (pool == nullptr) { + return nullptr; } pool->bufs = lh_CRYPTO_BUFFER_new(CRYPTO_BUFFER_hash, CRYPTO_BUFFER_cmp); - if (pool->bufs == NULL) { + if (pool->bufs == nullptr) { OPENSSL_free(pool); - return NULL; + return nullptr; } CRYPTO_MUTEX_init(&pool->lock); @@ -60,7 +60,7 @@ CRYPTO_BUFFER_POOL *CRYPTO_BUFFER_POOL_new(void) { } void CRYPTO_BUFFER_POOL_free(CRYPTO_BUFFER_POOL *pool) { - if (pool == NULL) { + if (pool == nullptr) { return; } @@ -85,7 +85,7 @@ static void crypto_buffer_free_object(CRYPTO_BUFFER *buf) { static CRYPTO_BUFFER *crypto_buffer_new(const uint8_t *data, size_t len, int data_is_static, CRYPTO_BUFFER_POOL *pool) { - if (pool != NULL) { + if (pool != nullptr) { CRYPTO_BUFFER tmp; tmp.data = (uint8_t *)data; tmp.len = len; @@ -93,25 +93,25 @@ static CRYPTO_BUFFER *crypto_buffer_new(const uint8_t *data, size_t len, CRYPTO_MUTEX_lock_read(&pool->lock); CRYPTO_BUFFER *duplicate = lh_CRYPTO_BUFFER_retrieve(pool->bufs, &tmp); - if (data_is_static && duplicate != NULL && !duplicate->data_is_static) { + if (data_is_static && duplicate != nullptr && !duplicate->data_is_static) { // If the new |CRYPTO_BUFFER| would have static data, but the duplicate // does not, we replace the old one with the new static version. - duplicate = NULL; + duplicate = nullptr; } - if (duplicate != NULL) { + if (duplicate != nullptr) { CRYPTO_refcount_inc(&duplicate->references); } CRYPTO_MUTEX_unlock_read(&pool->lock); - if (duplicate != NULL) { + if (duplicate != nullptr) { return duplicate; } } CRYPTO_BUFFER *const buf = reinterpret_cast(OPENSSL_zalloc(sizeof(CRYPTO_BUFFER))); - if (buf == NULL) { - return NULL; + if (buf == nullptr) { + return nullptr; } if (data_is_static) { @@ -119,16 +119,16 @@ static CRYPTO_BUFFER *crypto_buffer_new(const uint8_t *data, size_t len, buf->data_is_static = 1; } else { buf->data = reinterpret_cast(OPENSSL_memdup(data, len)); - if (len != 0 && buf->data == NULL) { + if (len != 0 && buf->data == nullptr) { OPENSSL_free(buf); - return NULL; + return nullptr; } } buf->len = len; buf->references = 1; - if (pool == NULL) { + if (pool == nullptr) { return buf; } @@ -136,14 +136,14 @@ static CRYPTO_BUFFER *crypto_buffer_new(const uint8_t *data, size_t len, CRYPTO_MUTEX_lock_write(&pool->lock); CRYPTO_BUFFER *duplicate = lh_CRYPTO_BUFFER_retrieve(pool->bufs, buf); - if (data_is_static && duplicate != NULL && !duplicate->data_is_static) { + if (data_is_static && duplicate != nullptr && !duplicate->data_is_static) { // If the new |CRYPTO_BUFFER| would have static data, but the duplicate does // not, we replace the old one with the new static version. - duplicate = NULL; + duplicate = nullptr; } int inserted = 0; - if (duplicate == NULL) { - CRYPTO_BUFFER *old = NULL; + if (duplicate == nullptr) { + CRYPTO_BUFFER *old = nullptr; inserted = lh_CRYPTO_BUFFER_insert(pool->bufs, &old, buf); // |old| may be non-NULL if a match was found but ignored. |pool->bufs| does // not increment refcounts, so there is no need to clean up after the @@ -171,14 +171,14 @@ CRYPTO_BUFFER *CRYPTO_BUFFER_new(const uint8_t *data, size_t len, CRYPTO_BUFFER *CRYPTO_BUFFER_alloc(uint8_t **out_data, size_t len) { CRYPTO_BUFFER *const buf = reinterpret_cast(OPENSSL_zalloc(sizeof(CRYPTO_BUFFER))); - if (buf == NULL) { - return NULL; + if (buf == nullptr) { + return nullptr; } buf->data = reinterpret_cast(OPENSSL_malloc(len)); - if (len != 0 && buf->data == NULL) { + if (len != 0 && buf->data == nullptr) { OPENSSL_free(buf); - return NULL; + return nullptr; } buf->len = len; buf->references = 1; @@ -198,12 +198,12 @@ CRYPTO_BUFFER *CRYPTO_BUFFER_new_from_static_data_unsafe( } void CRYPTO_BUFFER_free(CRYPTO_BUFFER *buf) { - if (buf == NULL) { + if (buf == nullptr) { return; } CRYPTO_BUFFER_POOL *const pool = buf->pool; - if (pool == NULL) { + if (pool == nullptr) { if (CRYPTO_refcount_dec_and_test_zero(&buf->references)) { // If a reference count of zero is observed, there cannot be a reference // from any pool to this buffer and thus we are able to free this diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/rand/deterministic.cc b/naiveproxy/src/third_party/boringssl/src/crypto/rand/deterministic.cc index ca97d95fc0..f520e10f7d 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/rand/deterministic.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/rand/deterministic.cc @@ -53,11 +53,6 @@ void CRYPTO_sysrand(uint8_t *out, size_t requested) { CRYPTO_chacha_20(out, out, requested, kZeroKey, nonce, 0); } -int CRYPTO_sysrand_if_available(uint8_t *buf, size_t len) { - CRYPTO_sysrand(buf, len); - return 1; -} - void CRYPTO_sysrand_for_seed(uint8_t *out, size_t requested) { CRYPTO_sysrand(out, requested); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/rand/fork_detect.cc b/naiveproxy/src/third_party/boringssl/src/crypto/rand/fork_detect.cc index b30c8cc8e4..9a62f32aef 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/rand/fork_detect.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/rand/fork_detect.cc @@ -41,7 +41,7 @@ static int g_force_madv_wipeonfork; static int g_force_madv_wipeonfork_enabled; static CRYPTO_once_t g_fork_detect_once = CRYPTO_ONCE_INIT; static CRYPTO_MUTEX g_fork_detect_lock = CRYPTO_MUTEX_INIT; -static CRYPTO_atomic_u32 *g_fork_detect_addr; +static bssl::Atomic *g_fork_detect_addr; static uint64_t g_fork_generation; static void init_fork_detect(void) { @@ -54,7 +54,7 @@ static void init_fork_detect(void) { return; } - void *addr = mmap(NULL, (size_t)page_size, PROT_READ | PROT_WRITE, + void *addr = mmap(nullptr, (size_t)page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (addr == MAP_FAILED) { return; @@ -71,8 +71,8 @@ static void init_fork_detect(void) { return; } - CRYPTO_atomic_u32 *const atomic = reinterpret_cast(addr); - CRYPTO_atomic_store_u32(atomic, 1); + auto *const atomic = reinterpret_cast *>(addr); + atomic->store(1); g_fork_detect_addr = atomic; g_fork_generation = 1; } @@ -91,8 +91,8 @@ uint64_t CRYPTO_get_fork_generation(void) { // child process is single-threaded, the child may become multi-threaded // before it observes this. Therefore, we must synchronize the logic below. - CRYPTO_atomic_u32 *const flag_ptr = g_fork_detect_addr; - if (flag_ptr == NULL) { + bssl::Atomic *const flag_ptr = g_fork_detect_addr; + if (flag_ptr == nullptr) { // Our kernel is too old to support |MADV_WIPEONFORK| or // |g_force_madv_wipeonfork| is set. if (g_force_madv_wipeonfork && g_force_madv_wipeonfork_enabled) { @@ -112,7 +112,7 @@ uint64_t CRYPTO_get_fork_generation(void) { // In the common case, try to observe the flag without taking a lock. This // avoids cacheline contention in the PRNG. uint64_t *const generation_ptr = &g_fork_generation; - if (CRYPTO_atomic_load_u32(flag_ptr) != 0) { + if (flag_ptr->load() != 0) { // If we observe a non-zero flag, it is safe to read |generation_ptr| // without a lock. The flag and generation number are fixed for this copy of // the address space. @@ -125,7 +125,7 @@ uint64_t CRYPTO_get_fork_generation(void) { CRYPTO_MUTEX *const lock = &g_fork_detect_lock; CRYPTO_MUTEX_lock_write(lock); uint64_t current_generation = *generation_ptr; - if (CRYPTO_atomic_load_u32(flag_ptr) == 0) { + if (flag_ptr->load() == 0) { // A fork has occurred. current_generation++; if (current_generation == 0) { @@ -136,7 +136,7 @@ uint64_t CRYPTO_get_fork_generation(void) { // We must update |generation_ptr| before |flag_ptr|. Other threads may // observe |flag_ptr| without taking a lock. *generation_ptr = current_generation; - CRYPTO_atomic_store_u32(flag_ptr, 1); + flag_ptr->store(1); } CRYPTO_MUTEX_unlock_write(lock); @@ -163,7 +163,7 @@ static void we_are_forked(void) { } static void init_pthread_fork_detection(void) { - if (pthread_atfork(NULL, NULL, we_are_forked) != 0) { + if (pthread_atfork(nullptr, nullptr, we_are_forked) != 0) { abort(); } g_atfork_fork_generation = 1; @@ -187,7 +187,7 @@ uint64_t CRYPTO_get_fork_generation(void) { return 0xc0ffee; } // These platforms may fork, but we do not have a mitigation mechanism in // place. Returning a constant zero value makes BoringSSL assume that address -// space duplication could have occured on any call entropy must be added to +// space duplication could have occurred on any call entropy must be added to // every RAND_bytes call. uint64_t CRYPTO_get_fork_generation(void) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/rand/forkunsafe.cc b/naiveproxy/src/third_party/boringssl/src/crypto/rand/forkunsafe.cc index 87c5be0b2c..7b1aa847f1 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/rand/forkunsafe.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/rand/forkunsafe.cc @@ -22,7 +22,7 @@ // g_buffering_enabled is one if fork-unsafe buffering has been enabled and zero // otherwise. -static CRYPTO_atomic_u32 g_buffering_enabled; +static bssl::Atomic g_buffering_enabled; #if !defined(OPENSSL_WINDOWS) void RAND_enable_fork_unsafe_buffering(int fd) { @@ -31,14 +31,12 @@ void RAND_enable_fork_unsafe_buffering(int fd) { abort(); } - CRYPTO_atomic_store_u32(&g_buffering_enabled, 1); + g_buffering_enabled.store(1); } -void RAND_disable_fork_unsafe_buffering(void) { - CRYPTO_atomic_store_u32(&g_buffering_enabled, 0); -} +void RAND_disable_fork_unsafe_buffering(void) { g_buffering_enabled.store(0); } #endif int rand_fork_unsafe_buffering_enabled(void) { - return CRYPTO_atomic_load_u32(&g_buffering_enabled) != 0; + return g_buffering_enabled.load() != 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/rand/getentropy.cc b/naiveproxy/src/third_party/boringssl/src/crypto/rand/getentropy.cc index 64cb3e96dd..f2956bb550 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/rand/getentropy.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/rand/getentropy.cc @@ -48,11 +48,6 @@ void CRYPTO_sysrand(uint8_t *out, size_t requested) { } } -int CRYPTO_sysrand_if_available(uint8_t *buf, size_t len) { - CRYPTO_sysrand(buf, len); - return 1; -} - void CRYPTO_sysrand_for_seed(uint8_t *out, size_t requested) { CRYPTO_sysrand(out, requested); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/rand/ios.cc b/naiveproxy/src/third_party/boringssl/src/crypto/rand/ios.cc index dd418df1b4..a9135e4a32 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/rand/ios.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/rand/ios.cc @@ -30,11 +30,6 @@ void CRYPTO_sysrand(uint8_t *out, size_t requested) { } } -int CRYPTO_sysrand_if_available(uint8_t *buf, size_t len) { - CRYPTO_sysrand(buf, len); - return 1; -} - void CRYPTO_sysrand_for_seed(uint8_t *out, size_t requested) { CRYPTO_sysrand(out, requested); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/rand/passive.cc b/naiveproxy/src/third_party/boringssl/src/crypto/rand/passive.cc index b216d6b873..be72b8b04f 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/rand/passive.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/rand/passive.cc @@ -38,7 +38,7 @@ static void passive_get_seed_entropy(uint8_t *out_entropy, } #define ENTROPY_READ_LEN \ - (/* last_block size */ 16 + CTR_DRBG_ENTROPY_LEN * BORINGSSL_FIPS_OVERREAD) + (/* last_block size */ 16 + CTR_DRBG_SEED_LEN * BORINGSSL_FIPS_OVERREAD) #if defined(OPENSSL_ANDROID) diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/rand/rand.cc b/naiveproxy/src/third_party/boringssl/src/crypto/rand/rand.cc index fd82bbc76c..6e0ca986be 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/rand/rand.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/rand/rand.cc @@ -44,7 +44,7 @@ int RAND_load_file(const char *path, long num) { } } -const char *RAND_file_name(char *buf, size_t num) { return NULL; } +const char *RAND_file_name(char *buf, size_t num) { return nullptr; } void RAND_add(const void *buf, int num, double entropy) {} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/rand/trusty.cc b/naiveproxy/src/third_party/boringssl/src/crypto/rand/trusty.cc index a2b23aee22..ad73a06ae0 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/rand/trusty.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/rand/trusty.cc @@ -34,11 +34,6 @@ void CRYPTO_sysrand(uint8_t *out, size_t requested) { } } -int CRYPTO_sysrand_if_available(uint8_t *buf, size_t len) { - CRYPTO_sysrand(buf, len); - return 1; -} - void CRYPTO_sysrand_for_seed(uint8_t *out, size_t requested) { CRYPTO_sysrand(out, requested); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/rand/urandom.cc b/naiveproxy/src/third_party/boringssl/src/crypto/rand/urandom.cc index 4ff6602c6a..d1eed694a5 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/rand/urandom.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/rand/urandom.cc @@ -28,14 +28,8 @@ #include #include #include -#include - -#if defined(OPENSSL_LINUX) -#if defined(BORINGSSL_FIPS) -#include -#include -#endif #include +#include #if defined(OPENSSL_ANDROID) #include @@ -57,7 +51,6 @@ #if defined(OPENSSL_HAS_GETAUXVAL) #include #endif -#endif // OPENSSL_LINUX #include @@ -165,12 +158,6 @@ static void init_once(void) { #endif // USE_NR_getrandom // FIPS builds must support getrandom. - // - // Historically, only Android FIPS builds required getrandom, while Linux FIPS - // builds had a /dev/urandom fallback which used RNDGETENTCNT as a poor - // approximation for getrandom's blocking behavior. This is now removed, but - // avoid making assumptions on this removal until March 2023, in case it needs - // to be restored. This comment can be deleted after March 2023. #if defined(BORINGSSL_FIPS) perror("getrandom not found"); abort(); @@ -238,33 +225,26 @@ static void wait_for_entropy(void) { } // fill_with_entropy writes |len| bytes of entropy into |out|. It returns one -// on success and zero on error. If |block| is one, this function will block -// until the entropy pool is initialized. Otherwise, this function may fail, -// setting |errno| to |EAGAIN| if the entropy pool has not yet been initialized. -// If |seed| is one, this function will OR in the value of +// on success and zero on error. This function will block until the entropy pool +// is initialized. If |seed| is one, this function will OR in the value of // |*extra_getrandom_flags_for_seed()| when using |getrandom|. -static int fill_with_entropy(uint8_t *out, size_t len, int block, int seed) { +static int fill_with_entropy(uint8_t *out, size_t len, int seed) { if (len == 0) { return 1; } -#if defined(USE_NR_getrandom) || defined(FREEBSD_GETRANDOM) - int getrandom_flags = 0; - if (!block) { - getrandom_flags |= GRND_NONBLOCK; - } -#endif - #if defined(USE_NR_getrandom) + int getrandom_flags = 0; if (seed) { getrandom_flags |= extra_getrandom_flags_for_seed; } #endif CRYPTO_init_sysrand(); - if (block) { - CRYPTO_once(&wait_for_entropy_once, wait_for_entropy); - } + // TODO(crbug.com/446280903): After the change to uniformly use OS entropy has + // stuck, remove this |wait_for_entropy| hook. The |getrandom| calls below + // already wait for entropy. |wait_for_entropy| just added more useful errors. + CRYPTO_once(&wait_for_entropy_once, wait_for_entropy); // Clear |errno| so it has defined value if |read| or |getrandom| // "successfully" returns zero. @@ -299,29 +279,17 @@ void CRYPTO_init_sysrand(void) { CRYPTO_once(&rand_once, init_once); } // CRYPTO_sysrand puts |requested| random bytes into |out|. void CRYPTO_sysrand(uint8_t *out, size_t requested) { - if (!fill_with_entropy(out, requested, /*block=*/1, /*seed=*/0)) { + if (!fill_with_entropy(out, requested, /*seed=*/0)) { perror("entropy fill failed"); abort(); } } void CRYPTO_sysrand_for_seed(uint8_t *out, size_t requested) { - if (!fill_with_entropy(out, requested, /*block=*/1, /*seed=*/1)) { + if (!fill_with_entropy(out, requested, /*seed=*/1)) { perror("entropy fill failed"); abort(); } } -int CRYPTO_sysrand_if_available(uint8_t *out, size_t requested) { - if (fill_with_entropy(out, requested, /*block=*/0, /*seed=*/0)) { - return 1; - } else if (errno == EAGAIN) { - OPENSSL_memset(out, 0, requested); - return 0; - } else { - perror("opportunistic entropy fill failed"); - abort(); - } -} - #endif // OPENSSL_RAND_URANDOM diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/rand/windows.cc b/naiveproxy/src/third_party/boringssl/src/crypto/rand/windows.cc index 59df467e78..1916e892de 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/rand/windows.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/rand/windows.cc @@ -43,7 +43,7 @@ void CRYPTO_sysrand(uint8_t *out, size_t requested) { output_bytes_this_pass = (ULONG)requested; } if (!BCRYPT_SUCCESS(BCryptGenRandom( - /*hAlgorithm=*/NULL, out, output_bytes_this_pass, + /*hAlgorithm=*/nullptr, out, output_bytes_this_pass, BCRYPT_USE_SYSTEM_PREFERRED_RNG))) { abort(); } @@ -56,15 +56,15 @@ void CRYPTO_sysrand(uint8_t *out, size_t requested) { // See: https://learn.microsoft.com/en-us/windows/win32/seccng/processprng typedef BOOL (WINAPI *ProcessPrngFunction)(PBYTE pbData, SIZE_T cbData); -static ProcessPrngFunction g_processprng_fn = NULL; +static ProcessPrngFunction g_processprng_fn = nullptr; static void init_processprng(void) { HMODULE hmod = LoadLibraryW(L"bcryptprimitives"); - if (hmod == NULL) { + if (hmod == nullptr) { abort(); } g_processprng_fn = (ProcessPrngFunction)GetProcAddress(hmod, "ProcessPrng"); - if (g_processprng_fn == NULL) { + if (g_processprng_fn == nullptr) { abort(); } } @@ -86,11 +86,6 @@ void CRYPTO_sysrand(uint8_t *out, size_t requested) { #endif // WINAPI_PARTITION_APP && !WINAPI_PARTITION_DESKTOP -int CRYPTO_sysrand_if_available(uint8_t *buf, size_t len) { - CRYPTO_sysrand(buf, len); - return 1; -} - void CRYPTO_sysrand_for_seed(uint8_t *out, size_t requested) { CRYPTO_sysrand(out, requested); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/refcount.cc b/naiveproxy/src/third_party/boringssl/src/crypto/refcount.cc index 742ba7166a..f3ebd2054e 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/refcount.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/refcount.cc @@ -19,18 +19,18 @@ void CRYPTO_refcount_inc(CRYPTO_refcount_t *count) { - uint32_t expected = CRYPTO_atomic_load_u32(count); + uint32_t expected = count->load(); while (expected != CRYPTO_REFCOUNT_MAX) { uint32_t new_value = expected + 1; - if (CRYPTO_atomic_compare_exchange_weak_u32(count, &expected, new_value)) { + if (count->compare_exchange_weak(expected, new_value)) { break; } } } int CRYPTO_refcount_dec_and_test_zero(CRYPTO_refcount_t *count) { - uint32_t expected = CRYPTO_atomic_load_u32(count); + uint32_t expected = count->load(); for (;;) { if (expected == 0) { @@ -39,8 +39,7 @@ int CRYPTO_refcount_dec_and_test_zero(CRYPTO_refcount_t *count) { return 0; } else { const uint32_t new_value = expected - 1; - if (CRYPTO_atomic_compare_exchange_weak_u32(count, &expected, - new_value)) { + if (count->compare_exchange_weak(expected, new_value)) { return new_value == 0; } } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/rsa/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/rsa/internal.h index 21552bf33c..887f491778 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/rsa/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/rsa/internal.h @@ -17,6 +17,8 @@ #include +#include "../fipsmodule/rsa/internal.h" + #if defined(__cplusplus) extern "C" { #endif @@ -28,6 +30,24 @@ int RSA_padding_check_PKCS1_OAEP_mgf1(uint8_t *out, size_t *out_len, size_t param_len, const EVP_MD *md, const EVP_MD *mgf1md); +// rsa_pss_params_get_md returns the hash function used with |params|. This also +// specifies the MGF-1 hash and the salt length because we do not support other +// configurations. +const EVP_MD *rsa_pss_params_get_md(rsa_pss_params_t params); + +// rsa_marshal_pss_params marshals |params| as a DER-encoded RSASSA-PSS-params +// (RFC 4055). It returns one on success and zero on error. If |params| is +// |rsa_pss_params_none|, this function gives an error. +int rsa_marshal_pss_params(CBB *cbb, rsa_pss_params_t params); + +// rsa_marshal_pss_params decodes a DER-encoded RSASSA-PSS-params +// (RFC 4055). It returns one on success and zero on error. On success, it sets +// |*out| to the result. If |allow_explicit_trailer| is non-zero, an explicit +// encoding of the trailerField is allowed, although it is not valid DER. This +// function never outputs |rsa_pss_params_none|. +int rsa_parse_pss_params(CBS *cbs, rsa_pss_params_t *out, + int allow_explicit_trailer); + #if defined(__cplusplus) } // extern C diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/rsa/rsa_asn1.cc b/naiveproxy/src/third_party/boringssl/src/crypto/rsa/rsa_asn1.cc index a71cc3a462..0bb4924989 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/rsa/rsa_asn1.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/rsa/rsa_asn1.cc @@ -20,25 +20,30 @@ #include #include +#include #include #include +#include +#include +#include -#include "../fipsmodule/rsa/internal.h" #include "../bytestring/internal.h" +#include "../fipsmodule/rsa/internal.h" #include "../internal.h" +#include "internal.h" static int parse_integer(CBS *cbs, BIGNUM **out) { - assert(*out == NULL); + assert(*out == nullptr); *out = BN_new(); - if (*out == NULL) { + if (*out == nullptr) { return 0; } return BN_parse_asn1_unsigned(cbs, *out); } static int marshal_integer(CBB *cbb, BIGNUM *bn) { - if (bn == NULL) { + if (bn == nullptr) { // An RSA object may be missing some components. OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING); return 0; @@ -48,8 +53,8 @@ static int marshal_integer(CBB *cbb, BIGNUM *bn) { RSA *RSA_parse_public_key(CBS *cbs) { RSA *ret = RSA_new(); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } CBS child; if (!CBS_get_asn1(cbs, &child, CBS_ASN1_SEQUENCE) || @@ -58,13 +63,13 @@ RSA *RSA_parse_public_key(CBS *cbs) { CBS_len(&child) != 0) { OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_ENCODING); RSA_free(ret); - return NULL; + return nullptr; } if (!RSA_check_key(ret)) { OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_RSA_PARAMETERS); RSA_free(ret); - return NULL; + return nullptr; } return ret; @@ -74,10 +79,10 @@ RSA *RSA_public_key_from_bytes(const uint8_t *in, size_t in_len) { CBS cbs; CBS_init(&cbs, in, in_len); RSA *ret = RSA_parse_public_key(&cbs); - if (ret == NULL || CBS_len(&cbs) != 0) { + if (ret == nullptr || CBS_len(&cbs) != 0) { OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_ENCODING); RSA_free(ret); - return NULL; + return nullptr; } return ret; } @@ -109,13 +114,13 @@ int RSA_public_key_to_bytes(uint8_t **out_bytes, size_t *out_len, } // kVersionTwoPrime is the value of the version field for a two-prime -// RSAPrivateKey structure (RFC 3447). +// RSAPrivateKey structure (RFC 8017). static const uint64_t kVersionTwoPrime = 0; RSA *RSA_parse_private_key(CBS *cbs) { RSA *ret = RSA_new(); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } CBS child; @@ -156,17 +161,17 @@ RSA *RSA_parse_private_key(CBS *cbs) { err: RSA_free(ret); - return NULL; + return nullptr; } RSA *RSA_private_key_from_bytes(const uint8_t *in, size_t in_len) { CBS cbs; CBS_init(&cbs, in, in_len); RSA *ret = RSA_parse_private_key(&cbs); - if (ret == NULL || CBS_len(&cbs) != 0) { + if (ret == nullptr || CBS_len(&cbs) != 0) { OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_ENCODING); RSA_free(ret); - return NULL; + return nullptr; } return ret; } @@ -205,66 +210,30 @@ int RSA_private_key_to_bytes(uint8_t **out_bytes, size_t *out_len, } RSA *d2i_RSAPublicKey(RSA **out, const uint8_t **inp, long len) { - if (len < 0) { - return NULL; - } - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - RSA *ret = RSA_parse_public_key(&cbs); - if (ret == NULL) { - return NULL; - } - if (out != NULL) { - RSA_free(*out); - *out = ret; - } - *inp = CBS_data(&cbs); - return ret; + return bssl::D2IFromCBS(out, inp, len, RSA_parse_public_key); } int i2d_RSAPublicKey(const RSA *in, uint8_t **outp) { - CBB cbb; - if (!CBB_init(&cbb, 0) || - !RSA_marshal_public_key(&cbb, in)) { - CBB_cleanup(&cbb); - return -1; - } - return CBB_finish_i2d(&cbb, outp); + return bssl::I2DFromCBB( + /*initial_capacity=*/256, outp, + [&](CBB *cbb) -> bool { return RSA_marshal_public_key(cbb, in); }); } RSA *d2i_RSAPrivateKey(RSA **out, const uint8_t **inp, long len) { - if (len < 0) { - return NULL; - } - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - RSA *ret = RSA_parse_private_key(&cbs); - if (ret == NULL) { - return NULL; - } - if (out != NULL) { - RSA_free(*out); - *out = ret; - } - *inp = CBS_data(&cbs); - return ret; + return bssl::D2IFromCBS(out, inp, len, RSA_parse_private_key); } int i2d_RSAPrivateKey(const RSA *in, uint8_t **outp) { - CBB cbb; - if (!CBB_init(&cbb, 0) || - !RSA_marshal_private_key(&cbb, in)) { - CBB_cleanup(&cbb); - return -1; - } - return CBB_finish_i2d(&cbb, outp); + return bssl::I2DFromCBB( + /*initial_capacity=*/512, outp, + [&](CBB *cbb) -> bool { return RSA_marshal_private_key(cbb, in); }); } RSA *RSAPublicKey_dup(const RSA *rsa) { uint8_t *der; size_t der_len; if (!RSA_public_key_to_bytes(&der, &der_len, rsa)) { - return NULL; + return nullptr; } RSA *ret = RSA_public_key_from_bytes(der, der_len); OPENSSL_free(der); @@ -275,9 +244,157 @@ RSA *RSAPrivateKey_dup(const RSA *rsa) { uint8_t *der; size_t der_len; if (!RSA_private_key_to_bytes(&der, &der_len, rsa)) { - return NULL; + return nullptr; } RSA *ret = RSA_private_key_from_bytes(der, der_len); OPENSSL_free(der); return ret; } + +static const uint8_t kPSSParamsSHA256[] = { + 0x30, 0x34, 0xa0, 0x0f, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, + 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0xa1, 0x1c, 0x30, + 0x1a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x08, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, + 0x04, 0x02, 0x01, 0x05, 0x00, 0xa2, 0x03, 0x02, 0x01, 0x20}; + +static const uint8_t kPSSParamsSHA384[] = { + 0x30, 0x34, 0xa0, 0x0f, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, + 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0xa1, 0x1c, 0x30, + 0x1a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x08, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, + 0x04, 0x02, 0x02, 0x05, 0x00, 0xa2, 0x03, 0x02, 0x01, 0x30}; + +static const uint8_t kPSSParamsSHA512[] = { + 0x30, 0x34, 0xa0, 0x0f, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, + 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0xa1, 0x1c, 0x30, + 0x1a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x08, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, + 0x04, 0x02, 0x03, 0x05, 0x00, 0xa2, 0x03, 0x02, 0x01, 0x40}; + +const EVP_MD *rsa_pss_params_get_md(rsa_pss_params_t params) { + switch (params) { + case rsa_pss_none: + return nullptr; + case rsa_pss_sha256: + return EVP_sha256(); + case rsa_pss_sha384: + return EVP_sha384(); + case rsa_pss_sha512: + return EVP_sha512(); + } + abort(); +} + +int rsa_marshal_pss_params(CBB *cbb, rsa_pss_params_t params) { + bssl::Span bytes; + switch (params) { + case rsa_pss_none: + OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR); + return 0; + case rsa_pss_sha256: + bytes = kPSSParamsSHA256; + break; + case rsa_pss_sha384: + bytes = kPSSParamsSHA384; + break; + case rsa_pss_sha512: + bytes = kPSSParamsSHA512; + break; + } + + return CBB_add_bytes(cbb, bytes.data(), bytes.size()); +} + +// 1.2.840.113549.1.1.8 +static const uint8_t kMGF1OID[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x08}; + +int rsa_parse_pss_params(CBS *cbs, rsa_pss_params_t *out, + int allow_explicit_trailer) { + // See RFC 4055, section 3.1. + // + // hashAlgorithm, maskGenAlgorithm, and saltLength all have DEFAULTs + // corresponding to SHA-1. We do not support SHA-1 with PSS, so we do not + // bother recognizing the omitted versions. + CBS params, hash_wrapper, mask_wrapper, mask_alg, mask_oid, salt_wrapper; + uint64_t salt_len; + if (!CBS_get_asn1(cbs, ¶ms, CBS_ASN1_SEQUENCE) || + !CBS_get_asn1(¶ms, &hash_wrapper, + CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 0) || + // |hash_wrapper| will be parsed below. + !CBS_get_asn1(¶ms, &mask_wrapper, + CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 1) || + !CBS_get_asn1(&mask_wrapper, &mask_alg, CBS_ASN1_SEQUENCE) || + !CBS_get_asn1(&mask_alg, &mask_oid, CBS_ASN1_OBJECT) || + // We only support MGF-1. + bssl::Span(mask_oid) != kMGF1OID || + // The remainder of |mask_alg| will be parsed below. + CBS_len(&mask_wrapper) != 0 || + !CBS_get_asn1(¶ms, &salt_wrapper, + CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 2) || + !CBS_get_asn1_uint64(&salt_wrapper, &salt_len) || + CBS_len(&salt_wrapper) != 0) { + OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_ENCODING); + return 0; + } + + // The trailer field must be 1 (0xbc). This value is DEFAULT, so the structure + // is required to omit it in DER. + if (CBS_len(¶ms) != 0 && allow_explicit_trailer) { + CBS trailer_wrapper; + uint64_t trailer; + if (!CBS_get_asn1(¶ms, &trailer_wrapper, + CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 3) || + !CBS_get_asn1_uint64(&trailer_wrapper, &trailer) || // + trailer != 1) { + OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_ENCODING); + return 0; + } + } + if (CBS_len(¶ms) != 0) { + OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_ENCODING); + return 0; + } + + int hash_nid = EVP_parse_digest_algorithm_nid(&hash_wrapper); + if (hash_nid == NID_undef || CBS_len(&hash_wrapper) != 0) { + OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_ENCODING); + return 0; + } + + // We only support combinations where the MGF-1 hash matches the overall hash. + int mgf1_hash_nid = EVP_parse_digest_algorithm_nid(&mask_alg); + if (mgf1_hash_nid != hash_nid || CBS_len(&mask_alg) != 0) { + OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_ENCODING); + return 0; + } + + // We only support salt lengths that match the hash length. + rsa_pss_params_t ret; + uint64_t hash_len; + switch (hash_nid) { + case NID_sha256: + ret = rsa_pss_sha256; + hash_len = 32; + break; + case NID_sha384: + ret = rsa_pss_sha384; + hash_len = 48; + break; + case NID_sha512: + ret = rsa_pss_sha512; + hash_len = 64; + break; + default: + OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_ENCODING); + return 0; + } + if (salt_len != hash_len) { + OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_ENCODING); + return 0; + } + + *out = ret; + return 1; +} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/rsa/rsa_crypt.cc b/naiveproxy/src/third_party/boringssl/src/crypto/rsa/rsa_crypt.cc index ce4ae7d3fa..632a71716f 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/rsa/rsa_crypt.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/rsa/rsa_crypt.cc @@ -45,10 +45,10 @@ int RSA_padding_add_PKCS1_OAEP_mgf1(uint8_t *to, size_t to_len, const uint8_t *from, size_t from_len, const uint8_t *param, size_t param_len, const EVP_MD *md, const EVP_MD *mgf1md) { - if (md == NULL) { + if (md == nullptr) { md = EVP_sha1(); } - if (mgf1md == NULL) { + if (mgf1md == nullptr) { mgf1md = md; } @@ -74,9 +74,9 @@ int RSA_padding_add_PKCS1_OAEP_mgf1(uint8_t *to, size_t to_len, uint8_t *seed = to + 1; uint8_t *db = to + mdlen + 1; - uint8_t *dbmask = NULL; + uint8_t *dbmask = nullptr; int ret = 0; - if (!EVP_Digest(param, param_len, db, NULL, md, NULL)) { + if (!EVP_Digest(param, param_len, db, nullptr, md, nullptr)) { goto out; } OPENSSL_memset(db + mdlen, 0, emlen - from_len - 2 * mdlen - 1); @@ -87,7 +87,7 @@ int RSA_padding_add_PKCS1_OAEP_mgf1(uint8_t *to, size_t to_len, } dbmask = reinterpret_cast(OPENSSL_malloc(emlen - mdlen)); - if (dbmask == NULL) { + if (dbmask == nullptr) { goto out; } @@ -117,13 +117,13 @@ int RSA_padding_check_PKCS1_OAEP_mgf1(uint8_t *out, size_t *out_len, size_t from_len, const uint8_t *param, size_t param_len, const EVP_MD *md, const EVP_MD *mgf1md) { - uint8_t *db = NULL; + uint8_t *db = nullptr; { - if (md == NULL) { + if (md == nullptr) { md = EVP_sha1(); } - if (mgf1md == NULL) { + if (mgf1md == nullptr) { mgf1md = md; } @@ -140,7 +140,7 @@ int RSA_padding_check_PKCS1_OAEP_mgf1(uint8_t *out, size_t *out_len, size_t dblen = from_len - mdlen - 1; db = reinterpret_cast(OPENSSL_malloc(dblen)); - if (db == NULL) { + if (db == nullptr) { goto err; } @@ -163,7 +163,7 @@ int RSA_padding_check_PKCS1_OAEP_mgf1(uint8_t *out, size_t *out_len, } uint8_t phash[EVP_MAX_MD_SIZE]; - if (!EVP_Digest(param, param_len, phash, NULL, md, NULL)) { + if (!EVP_Digest(param, param_len, phash, nullptr, md, nullptr)) { goto err; } @@ -339,7 +339,7 @@ int RSA_private_encrypt(size_t flen, const uint8_t *from, uint8_t *to, RSA *rsa, int RSA_encrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, const uint8_t *in, size_t in_len, int padding) { - if (rsa->n == NULL || rsa->e == NULL) { + if (rsa->n == nullptr || rsa->e == nullptr) { OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING); return 0; } @@ -424,7 +424,7 @@ static int rsa_default_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, const uint8_t *in, size_t in_len, int padding) { const unsigned rsa_size = RSA_size(rsa); - uint8_t *buf = NULL; + uint8_t *buf = nullptr; int ret = 0; if (max_out < rsa_size) { @@ -437,7 +437,7 @@ static int rsa_default_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, } else { // Allocate a temporary buffer to hold the padded plaintext. buf = reinterpret_cast(OPENSSL_malloc(rsa_size)); - if (buf == NULL) { + if (buf == nullptr) { goto err; } } @@ -458,8 +458,8 @@ static int rsa_default_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, break; case RSA_PKCS1_OAEP_PADDING: // Use the default parameters: SHA-1 for both hashes and no label. - ret = RSA_padding_check_PKCS1_OAEP_mgf1(out, out_len, rsa_size, buf, - rsa_size, NULL, 0, NULL, NULL); + ret = RSA_padding_check_PKCS1_OAEP_mgf1( + out, out_len, rsa_size, buf, rsa_size, nullptr, 0, nullptr, nullptr); break; case RSA_NO_PADDING: *out_len = rsa_size; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/rsa/rsa_extra.cc b/naiveproxy/src/third_party/boringssl/src/crypto/rsa/rsa_extra.cc index 1563720b25..58015bd4b7 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/rsa/rsa_extra.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/rsa/rsa_extra.cc @@ -17,3 +17,14 @@ int RSA_blinding_on(RSA *rsa, BN_CTX *ctx) { return 1; } void RSA_blinding_off(RSA *rsa) {} + +const RSA_PSS_PARAMS *RSA_get0_pss_params(const RSA *rsa) { + // We do not currently implement this function. By default, we will not parse + // |EVP_PKEY_RSA_PSS|. Callers that opt in with a BoringSSL-specific API are + // currently assumed to not need this function. Callers that need that opt-in + // and this functionality should contact the BoringSSL team. + // + // If we do add support later, the |maskHash| field should be filled in for + // OpenSSL compatibility. + return nullptr; +} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/sha/sha512.cc b/naiveproxy/src/third_party/boringssl/src/crypto/sha/sha512.cc index a24f7170aa..5ea8442f52 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/sha/sha512.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/sha/sha512.cc @@ -80,9 +80,9 @@ int SHA512_Update(SHA512_CTX *sha, const void *data, size_t len) { } int SHA512_Final(uint8_t out[SHA512_DIGEST_LENGTH], SHA512_CTX *sha) { - // Historically this function retured failure if passed NULL, even - // though other final functions do not. - if (out == NULL) { + // Historically this function returned failure if passed NULL, even though + // other final functions do not. + if (out == nullptr) { return 0; } BCM_sha512_final(out, sha); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/stack/stack.cc b/naiveproxy/src/third_party/boringssl/src/crypto/stack/stack.cc index bbe5eb748e..cd94693335 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/stack/stack.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/stack/stack.cc @@ -44,13 +44,13 @@ static const size_t kMinSize = 4; OPENSSL_STACK *OPENSSL_sk_new(OPENSSL_sk_cmp_func comp) { OPENSSL_STACK *ret = reinterpret_cast(OPENSSL_zalloc(sizeof(OPENSSL_STACK))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->data = reinterpret_cast(OPENSSL_calloc(kMinSize, sizeof(void *))); - if (ret->data == NULL) { + if (ret->data == nullptr) { goto err; } @@ -61,20 +61,20 @@ OPENSSL_STACK *OPENSSL_sk_new(OPENSSL_sk_cmp_func comp) { err: OPENSSL_free(ret); - return NULL; + return nullptr; } -OPENSSL_STACK *OPENSSL_sk_new_null(void) { return OPENSSL_sk_new(NULL); } +OPENSSL_STACK *OPENSSL_sk_new_null(void) { return OPENSSL_sk_new(nullptr); } size_t OPENSSL_sk_num(const OPENSSL_STACK *sk) { - if (sk == NULL) { + if (sk == nullptr) { return 0; } return sk->num; } void OPENSSL_sk_zero(OPENSSL_STACK *sk) { - if (sk == NULL || sk->num == 0) { + if (sk == nullptr || sk->num == 0) { return; } OPENSSL_memset(sk->data, 0, sizeof(void *) * sk->num); @@ -84,20 +84,20 @@ void OPENSSL_sk_zero(OPENSSL_STACK *sk) { void *OPENSSL_sk_value(const OPENSSL_STACK *sk, size_t i) { if (!sk || i >= sk->num) { - return NULL; + return nullptr; } return sk->data[i]; } void *OPENSSL_sk_set(OPENSSL_STACK *sk, size_t i, void *value) { if (!sk || i >= sk->num) { - return NULL; + return nullptr; } return sk->data[i] = value; } void OPENSSL_sk_free(OPENSSL_STACK *sk) { - if (sk == NULL) { + if (sk == nullptr) { return; } OPENSSL_free(sk->data); @@ -107,12 +107,12 @@ void OPENSSL_sk_free(OPENSSL_STACK *sk) { void OPENSSL_sk_pop_free_ex(OPENSSL_STACK *sk, OPENSSL_sk_call_free_func call_free_func, OPENSSL_sk_free_func free_func) { - if (sk == NULL) { + if (sk == nullptr) { return; } for (size_t i = 0; i < sk->num; i++) { - if (sk->data[i] != NULL) { + if (sk->data[i] != nullptr) { call_free_func(free_func, sk->data[i]); } } @@ -131,7 +131,7 @@ void sk_pop_free(OPENSSL_STACK *sk, OPENSSL_sk_free_func free_func) { } size_t OPENSSL_sk_insert(OPENSSL_STACK *sk, void *p, size_t where) { - if (sk == NULL) { + if (sk == nullptr) { return 0; } @@ -158,7 +158,7 @@ size_t OPENSSL_sk_insert(OPENSSL_STACK *sk, void *p, size_t where) { } data = reinterpret_cast(OPENSSL_realloc(sk->data, alloc_size)); - if (data == NULL) { + if (data == nullptr) { return 0; } @@ -184,7 +184,7 @@ void *OPENSSL_sk_delete(OPENSSL_STACK *sk, size_t where) { void *ret; if (!sk || where >= sk->num) { - return NULL; + return nullptr; } ret = sk->data[where]; @@ -199,8 +199,8 @@ void *OPENSSL_sk_delete(OPENSSL_STACK *sk, size_t where) { } void *OPENSSL_sk_delete_ptr(OPENSSL_STACK *sk, const void *p) { - if (sk == NULL) { - return NULL; + if (sk == nullptr) { + return nullptr; } for (size_t i = 0; i < sk->num; i++) { @@ -209,13 +209,13 @@ void *OPENSSL_sk_delete_ptr(OPENSSL_STACK *sk, const void *p) { } } - return NULL; + return nullptr; } void OPENSSL_sk_delete_if(OPENSSL_STACK *sk, OPENSSL_sk_call_delete_if_func call_func, OPENSSL_sk_delete_if_func func, void *data) { - if (sk == NULL) { + if (sk == nullptr) { return; } @@ -231,11 +231,11 @@ void OPENSSL_sk_delete_if(OPENSSL_STACK *sk, int OPENSSL_sk_find(const OPENSSL_STACK *sk, size_t *out_index, const void *p, OPENSSL_sk_call_cmp_func call_cmp_func) { - if (sk == NULL) { + if (sk == nullptr) { return 0; } - if (sk->comp == NULL) { + if (sk->comp == nullptr) { // Use pointer equality when no comparison function has been set. for (size_t i = 0; i < sk->num; i++) { if (sk->data[i] == p) { @@ -248,7 +248,7 @@ int OPENSSL_sk_find(const OPENSSL_STACK *sk, size_t *out_index, const void *p, return 0; } - if (p == NULL) { + if (p == nullptr) { return 0; } @@ -282,7 +282,7 @@ int OPENSSL_sk_find(const OPENSSL_STACK *sk, size_t *out_index, const void *p, // |mid| matches. However, this function returns the earliest match, so we // can only return if the range has size one. if (hi - lo == 1) { - if (out_index != NULL) { + if (out_index != nullptr) { *out_index = mid; } return 1; @@ -299,11 +299,11 @@ int OPENSSL_sk_find(const OPENSSL_STACK *sk, size_t *out_index, const void *p, } void *OPENSSL_sk_shift(OPENSSL_STACK *sk) { - if (sk == NULL) { - return NULL; + if (sk == nullptr) { + return nullptr; } if (sk->num == 0) { - return NULL; + return nullptr; } return OPENSSL_sk_delete(sk, 0); } @@ -313,29 +313,29 @@ size_t OPENSSL_sk_push(OPENSSL_STACK *sk, void *p) { } void *OPENSSL_sk_pop(OPENSSL_STACK *sk) { - if (sk == NULL) { - return NULL; + if (sk == nullptr) { + return nullptr; } if (sk->num == 0) { - return NULL; + return nullptr; } return OPENSSL_sk_delete(sk, sk->num - 1); } OPENSSL_STACK *OPENSSL_sk_dup(const OPENSSL_STACK *sk) { - if (sk == NULL) { - return NULL; + if (sk == nullptr) { + return nullptr; } OPENSSL_STACK *ret = reinterpret_cast(OPENSSL_zalloc(sizeof(OPENSSL_STACK))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->data = reinterpret_cast( OPENSSL_memdup(sk->data, sizeof(void *) * sk->num_alloc)); - if (ret->data == NULL) { + if (ret->data == nullptr) { goto err; } @@ -347,7 +347,7 @@ OPENSSL_STACK *OPENSSL_sk_dup(const OPENSSL_STACK *sk) { err: OPENSSL_sk_free(ret); - return NULL; + return nullptr; } static size_t parent_idx(size_t idx) { @@ -360,7 +360,7 @@ static size_t left_idx(size_t idx) { // |ptrdiff_t|, a signed type, is the same size as |size_t|, this cannot // overflow. assert(idx <= PTRDIFF_MAX); - static_assert(PTRDIFF_MAX <= (SIZE_MAX - 1) / 2, "2 * idx + 1 may oveflow"); + static_assert(PTRDIFF_MAX <= (SIZE_MAX - 1) / 2, "2 * idx + 1 may overflow"); return 2 * idx + 1; } @@ -399,7 +399,7 @@ static void down_heap(OPENSSL_STACK *sk, OPENSSL_sk_call_cmp_func call_cmp_func, void OPENSSL_sk_sort(OPENSSL_STACK *sk, OPENSSL_sk_call_cmp_func call_cmp_func) { - if (sk == NULL || sk->comp == NULL || sk->sorted) { + if (sk == nullptr || sk->comp == nullptr || sk->sorted) { return; } @@ -432,7 +432,7 @@ int OPENSSL_sk_is_sorted(const OPENSSL_STACK *sk) { return 1; } // Zero- and one-element lists are always sorted. - return sk->sorted || (sk->comp != NULL && sk->num < 2); + return sk->sorted || (sk->comp != nullptr && sk->num < 2); } OPENSSL_sk_cmp_func OPENSSL_sk_set_cmp_func(OPENSSL_STACK *sk, @@ -453,23 +453,23 @@ OPENSSL_STACK *OPENSSL_sk_deep_copy(const OPENSSL_STACK *sk, OPENSSL_sk_call_free_func call_free_func, OPENSSL_sk_free_func free_func) { OPENSSL_STACK *ret = OPENSSL_sk_dup(sk); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } for (size_t i = 0; i < ret->num; i++) { - if (ret->data[i] == NULL) { + if (ret->data[i] == nullptr) { continue; } ret->data[i] = call_copy_func(copy_func, ret->data[i]); - if (ret->data[i] == NULL) { + if (ret->data[i] == nullptr) { for (size_t j = 0; j < i; j++) { - if (ret->data[j] != NULL) { + if (ret->data[j] != nullptr) { call_free_func(free_func, ret->data[j]); } } OPENSSL_sk_free(ret); - return NULL; + return nullptr; } } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/test/asm/trampoline-x86_64.pl b/naiveproxy/src/third_party/boringssl/src/crypto/test/asm/trampoline-x86_64.pl index 737299eab3..784929b30b 100755 --- a/naiveproxy/src/third_party/boringssl/src/crypto/test/asm/trampoline-x86_64.pl +++ b/naiveproxy/src/third_party/boringssl/src/crypto/test/asm/trampoline-x86_64.pl @@ -185,7 +185,7 @@ $code .= <<____ if (!$win64); movq $unwind, $unwind_offset(%rsp) ____ # Store our caller's state. This is needed because we modify it ourselves, and -# also to isolate the test infrastruction from the function under test failing +# also to isolate the test infrastructure from the function under test failing # to save some register. $code .= store_caller_state($caller_state_offset, "%rsp", sub { my ($off, $reg) = @_; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/test/der_trailing_data.cc b/naiveproxy/src/third_party/boringssl/src/crypto/test/der_trailing_data.cc new file mode 100644 index 0000000000..f5dcf44b88 --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/test/der_trailing_data.cc @@ -0,0 +1,78 @@ +// Copyright 2025 The BoringSSL Authors +// +// Licensed under the Apache License, Version 2.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 "der_trailing_data.h" + +#include + +#include + +static bool RewriteWithTrailingData(CBB *cbb, CBS *cbs, + std::optional *rewrite_counter) { + CBS contents; + CBS_ASN1_TAG tag; + if (!CBS_get_any_asn1(cbs, &contents, &tag)) { + return false; + } + + if (!rewrite_counter->has_value() || (tag & CBS_ASN1_CONSTRUCTED) == 0) { + return CBB_add_asn1_element(cbb, tag, CBS_data(&contents), + CBS_len(&contents)); + } + + CBB child; + if (!CBB_add_asn1(cbb, &child, tag)) { + return false; + } + + if (rewrite_counter->value() == 0) { + *rewrite_counter = std::nullopt; + return CBB_add_bytes(&child, CBS_data(&contents), CBS_len(&contents)) && + // Add a BER EOC, which is always invalid in DER. + CBB_add_u8(&child, 0) && // + CBB_add_u8(&child, 0) && // + CBB_flush(cbb); + } + + *rewrite_counter = rewrite_counter->value() - 1; + while (CBS_len(&contents) != 0) { + if (!RewriteWithTrailingData(&child, &contents, rewrite_counter)) { + return false; + } + } + return CBB_flush(cbb); +} + +bool TestDERTrailingData( + bssl::Span in, + std::function, size_t)> func) { + for (size_t elem_to_rewrite = 0; true; elem_to_rewrite++) { + std::optional rewrite_counter = elem_to_rewrite; + CBS cbs = in; + bssl::ScopedCBB cbb; + if (!CBB_init(cbb.get(), in.size() + /* EOC */ 2 + + /* in case lengths get larger */ 8) || + !RewriteWithTrailingData(cbb.get(), &cbs, &rewrite_counter) || + CBS_len(&cbs) != 0) { + return false; + } + + // We have exhausted every constructed element. + if (rewrite_counter.has_value()) { + return true; + } + + func(bssl::Span(CBB_data(cbb.get()), CBB_len(cbb.get())), elem_to_rewrite); + } +} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/test/der_trailing_data.h b/naiveproxy/src/third_party/boringssl/src/crypto/test/der_trailing_data.h new file mode 100644 index 0000000000..2d5b36903d --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/test/der_trailing_data.h @@ -0,0 +1,38 @@ +// Copyright 2025 The BoringSSL Authors +// +// Licensed under the Apache License, Version 2.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. + +#ifndef OPENSSL_HEADER_CRYPTO_TEST_DER_TRAILING_DATA_H +#define OPENSSL_HEADER_CRYPTO_TEST_DER_TRAILING_DATA_H + +#include + +#include + +// TestDERTrailingData decodes |in| as an arbitrary DER structure. It then calls +// |func| multiple times on different modified versions of |in|, each time with +// extra data appended to a different constructed element. The extra data will +// be a BER EOC, so this is guaranteed to make the structure invalid. +// +// |func| is expected to parse its argument and then assert with GTest that the +// parser failed. |n|, passed to |func|, is the number of the constructed +// element that was rewritten, following a pre-order numbering from zero. |func| +// should pass it to |SCOPED_TRACE| to aid debugging. +// +// TestDERTrailingData returns whether it successful rewrote |in| and called +// |func| for every constructed element. +bool TestDERTrailingData( + bssl::Span in, + std::function rewritten, size_t n)> func); + +#endif // OPENSSL_HEADER_CRYPTO_TEST_DER_TRAILING_DATA_H diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/test/file_test.h b/naiveproxy/src/third_party/boringssl/src/crypto/test/file_test.h index 4cd22db141..6708cea4ef 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/test/file_test.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/test/file_test.h @@ -24,6 +24,7 @@ #include #include #include +#include #include // File-based test framework. @@ -76,7 +77,7 @@ // number in any output. |PrintLine| does this automatically. // // Each attribute in a test and all instructions applying to it must be -// consumed. When a test completes, if any attributes or insturctions haven't +// consumed. When a test completes, if any attributes or instructions haven't // been processed, the framework reports an error. class FileTest; @@ -138,36 +139,36 @@ class FileTest { const std::string &GetParameter(); // HasAttribute returns true if the current test has an attribute named |key|. - bool HasAttribute(const std::string &key); + bool HasAttribute(std::string_view key); // GetAttribute looks up the attribute with key |key|. It sets |*out_value| to // the value and returns true if it exists and returns false with an error to // |stderr| otherwise. - bool GetAttribute(std::string *out_value, const std::string &key); + bool GetAttribute(std::string *out_value, std::string_view key); // GetAttributeOrDie looks up the attribute with key |key| and aborts if it is // missing. It should only be used after a |HasAttribute| call. - const std::string &GetAttributeOrDie(const std::string &key); + const std::string &GetAttributeOrDie(std::string_view key); // IgnoreAttribute marks the attribute with key |key| as used. - void IgnoreAttribute(const std::string &key) { HasAttribute(key); } + void IgnoreAttribute(std::string_view key) { HasAttribute(key); } // GetBytes looks up the attribute with key |key| and decodes it as a byte // string. On success, it writes the result to |*out| and returns // true. Otherwise it returns false with an error to |stderr|. The value may // be either a hexadecimal string or a quoted ASCII string. It returns true on // success and returns false with an error to |stderr| on failure. - bool GetBytes(std::vector *out, const std::string &key); + bool GetBytes(std::vector *out, std::string_view key); // AtNewInstructionBlock returns true if the current test was immediately // preceded by an instruction block. bool IsAtNewInstructionBlock() const; // HasInstruction returns true if the current test has an instruction. - bool HasInstruction(const std::string &key); + bool HasInstruction(std::string_view key); // IgnoreInstruction marks the instruction with key |key| as used. - void IgnoreInstruction(const std::string &key) { HasInstruction(key); } + void IgnoreInstruction(std::string_view key) { HasInstruction(key); } // IgnoreAllUnusedInstructions disables checking for unused instructions. void IgnoreAllUnusedInstructions(); @@ -176,15 +177,15 @@ class FileTest { // |*out_value| to the value (empty string if the instruction has no value) // and returns true if it exists and returns false with an error to |stderr| // otherwise. - bool GetInstruction(std::string *out_value, const std::string &key); + bool GetInstruction(std::string *out_value, std::string_view key); // GetInstructionOrDie looks up the instruction with key |key| and aborts if // it is missing. It should only be used after a |HasInstruction| call. - const std::string &GetInstructionOrDie(const std::string &key); + const std::string &GetInstructionOrDie(std::string_view key); // GetInstructionBytes behaves like GetBytes, but looks up the corresponding // instruction. - bool GetInstructionBytes(std::vector *out, const std::string &key); + bool GetInstructionBytes(std::vector *out, std::string_view key); // CurrentTestToString returns the file content parsed for the current test. // If the current test was preceded by an instruction block, the return test @@ -194,7 +195,7 @@ class FileTest { // InjectInstruction adds a key value pair to the most recently parsed set of // instructions. - void InjectInstruction(const std::string &key, const std::string &value); + void InjectInstruction(std::string key, std::string value); // SkipCurrent passes the current test case. Unused attributes are ignored. void SkipCurrent(); @@ -202,9 +203,9 @@ class FileTest { private: void ClearTest(); void ClearInstructions(); - void OnKeyUsed(const std::string &key); - void OnInstructionUsed(const std::string &key); - bool ConvertToBytes(std::vector *out, const std::string &value); + void OnKeyUsed(std::string_view key); + void OnInstructionUsed(std::string_view key); + bool ConvertToBytes(std::vector *out, std::string_view value); std::unique_ptr reader_; // line_ is the number of lines read. @@ -218,17 +219,17 @@ class FileTest { std::string parameter_; // attribute_count_ maps unsuffixed attribute names to the number of times // they have occurred so far. - std::map attribute_count_; + std::map> attribute_count_; // attributes_ contains all attributes in the test, including the first. - std::map attributes_; + std::map> attributes_; // instructions_ contains all instructions in scope for the test. - std::map instructions_; + std::map> instructions_; // unused_attributes_ is the set of attributes that have not been queried. - std::set unused_attributes_; + std::set> unused_attributes_; // unused_instructions_ is the set of instructions that have not been queried. - std::set unused_instructions_; + std::set> unused_instructions_; std::string current_test_; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/test/test_util.cc b/naiveproxy/src/third_party/boringssl/src/crypto/test/test_util.cc index 78ce8d882c..28ab074781 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/test/test_util.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/test/test_util.cc @@ -16,6 +16,7 @@ #include +#include #include #include "../internal.h" @@ -41,7 +42,7 @@ std::ostream &operator<<(std::ostream &os, const Bytes &in) { return os; } -bool DecodeHex(std::vector *out, const std::string &in) { +bool DecodeHex(std::vector *out, std::string_view in) { out->clear(); if (in.size() % 2 != 0) { return false; @@ -70,7 +71,7 @@ std::string EncodeHex(bssl::Span in) { } testing::AssertionResult ErrorEquals(uint32_t err, int lib, int reason) { - if (ERR_GET_LIB(err) == lib && ERR_GET_REASON(err) == reason) { + if (ERR_equals(err, lib, reason)) { return testing::AssertionSuccess(); } @@ -82,3 +83,17 @@ testing::AssertionResult ErrorEquals(uint32_t err, int lib, int reason) { sizeof(expected)) << "\""; } + +bssl::UniquePtr HexToBIGNUM(const char *hex) { + BIGNUM *bn = nullptr; + BN_hex2bn(&bn, hex); + return bssl::UniquePtr(bn); +} + +std::string BIGNUMToHex(const BIGNUM *bn) { + bssl::UniquePtr hex(BN_bn2hex(bn)); + if (hex == nullptr) { + return "error"; + } + return hex.get(); +} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/test/test_util.h b/naiveproxy/src/third_party/boringssl/src/crypto/test/test_util.h index b7671c166a..4433cc37a0 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/test/test_util.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/test/test_util.h @@ -67,7 +67,7 @@ std::ostream &operator<<(std::ostream &os, const Bytes &in); // DecodeHex decodes |in| from hexadecimal and writes the output to |out|. It // returns true on success and false if |in| is not a valid hexadecimal byte // string. -bool DecodeHex(std::vector *out, const std::string &in); +bool DecodeHex(std::vector *out, std::string_view in); // EncodeHex returns |in| encoded in hexadecimal. std::string EncodeHex(bssl::Span in); @@ -76,5 +76,12 @@ std::string EncodeHex(bssl::Span in); // |reason|. testing::AssertionResult ErrorEquals(uint32_t err, int lib, int reason); +// HexToBignum decodes |hex| as a hexadecimal, big-endian, unsigned integer and +// returns it as a |BIGNUM|, or nullptr on error. +bssl::UniquePtr HexToBIGNUM(const char *hex); + +// BIGNUMToHex returns |bn| as a hexadecimal, big-endian, unsigned integer. +std::string BIGNUMToHex(const BIGNUM *bn); + #endif // OPENSSL_HEADER_CRYPTO_TEST_TEST_UTIL_H diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/thread.cc b/naiveproxy/src/third_party/boringssl/src/crypto/thread.cc index 16c20b188c..f7d2b76903 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/thread.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/thread.cc @@ -22,7 +22,7 @@ void CRYPTO_set_locking_callback(void (*func)(int mode, int lock_num, void (*CRYPTO_get_locking_callback(void))(int mode, int lock_num, const char *file, int line) { - return NULL; + return nullptr; } void CRYPTO_set_add_lock_callback(int (*func)(int *num, int mount, int lock_num, @@ -53,16 +53,16 @@ void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function)( struct CRYPTO_dynlock_value *(*CRYPTO_get_dynlock_create_callback(void))( const char *file, int line) { - return NULL; + return nullptr; } void (*CRYPTO_get_dynlock_lock_callback(void))(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { - return NULL; + return nullptr; } void (*CRYPTO_get_dynlock_destroy_callback(void))( struct CRYPTO_dynlock_value *l, const char *file, int line) { - return NULL; + return nullptr; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/thread_pthread.cc b/naiveproxy/src/third_party/boringssl/src/crypto/thread_pthread.cc index 307effb6c7..7e57df1eec 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/thread_pthread.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/thread_pthread.cc @@ -24,7 +24,7 @@ #include void CRYPTO_MUTEX_init(CRYPTO_MUTEX *lock) { - if (pthread_rwlock_init(lock, NULL) != 0) { + if (pthread_rwlock_init(lock, nullptr) != 0) { abort(); } } @@ -67,7 +67,7 @@ static thread_local_destructor_t g_destructors[NUM_OPENSSL_THREAD_LOCALS]; // thread_local_destructor is called when a thread exits. It releases thread // local data for that thread only. static void thread_local_destructor(void *arg) { - if (arg == NULL) { + if (arg == nullptr) { return; } @@ -81,7 +81,7 @@ static void thread_local_destructor(void *arg) { unsigned i; void **pointers = reinterpret_cast(arg); for (i = 0; i < NUM_OPENSSL_THREAD_LOCALS; i++) { - if (destructors[i] != NULL) { + if (destructors[i] != nullptr) { destructors[i](pointers[i]); } } @@ -101,13 +101,13 @@ static void thread_local_init(void) { void *CRYPTO_get_thread_local(thread_local_data_t index) { CRYPTO_once(&g_thread_local_init_once, thread_local_init); if (!g_thread_local_key_created) { - return NULL; + return nullptr; } void **pointers = reinterpret_cast(pthread_getspecific(g_thread_local_key)); - if (pointers == NULL) { - return NULL; + if (pointers == nullptr) { + return nullptr; } return pointers[index]; } @@ -122,10 +122,10 @@ int CRYPTO_set_thread_local(thread_local_data_t index, void *value, void **pointers = reinterpret_cast(pthread_getspecific(g_thread_local_key)); - if (pointers == NULL) { + if (pointers == nullptr) { pointers = reinterpret_cast( malloc(sizeof(void *) * NUM_OPENSSL_THREAD_LOCALS)); - if (pointers == NULL) { + if (pointers == nullptr) { destructor(value); return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/thread_win.cc b/naiveproxy/src/third_party/boringssl/src/crypto/thread_win.cc index 4e22c47da6..8d7316ed37 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/thread_win.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/thread_win.cc @@ -31,7 +31,7 @@ static BOOL CALLBACK call_once_init(INIT_ONCE *once, void *arg, void **out) { } void CRYPTO_once(CRYPTO_once_t *once, void (*init)(void)) { - if (!InitOnceExecuteOnce(once, call_once_init, &init, NULL)) { + if (!InitOnceExecuteOnce(once, call_once_init, &init, nullptr)) { abort(); } } @@ -85,7 +85,7 @@ static void NTAPI thread_local_destructor(PVOID module, DWORD reason, } void **pointers = (void **)TlsGetValue(g_thread_local_key); - if (pointers == NULL) { + if (pointers == nullptr) { return; } @@ -96,7 +96,7 @@ static void NTAPI thread_local_destructor(PVOID module, DWORD reason, ReleaseSRWLockExclusive(&g_destructors_lock); for (unsigned i = 0; i < NUM_OPENSSL_THREAD_LOCALS; i++) { - if (destructors[i] != NULL) { + if (destructors[i] != nullptr) { destructors[i](pointers[i]); } } @@ -193,12 +193,12 @@ static void **get_thread_locals(void) { void *CRYPTO_get_thread_local(thread_local_data_t index) { CRYPTO_once(&g_thread_local_init_once, thread_local_init); if (g_thread_local_failed) { - return NULL; + return nullptr; } void **pointers = get_thread_locals(); - if (pointers == NULL) { - return NULL; + if (pointers == nullptr) { + return nullptr; } return pointers[index]; } @@ -212,10 +212,10 @@ int CRYPTO_set_thread_local(thread_local_data_t index, void *value, } void **pointers = get_thread_locals(); - if (pointers == NULL) { + if (pointers == nullptr) { pointers = reinterpret_cast( malloc(sizeof(void *) * NUM_OPENSSL_THREAD_LOCALS)); - if (pointers == NULL) { + if (pointers == nullptr) { destructor(value); return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/trust_token/pmbtoken.cc b/naiveproxy/src/third_party/boringssl/src/crypto/trust_token/pmbtoken.cc index 58ba28f256..ce910b0b4b 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/trust_token/pmbtoken.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/trust_token/pmbtoken.cc @@ -97,7 +97,7 @@ static int derive_scalar_from_secret(const PMBTOKEN_METHOD *method, int ok = 0; CBB cbb; CBB_zero(&cbb); - uint8_t *buf = NULL; + uint8_t *buf = nullptr; size_t len; if (!CBB_init(&cbb, 0) || !CBB_add_bytes(&cbb, kKeygenLabel, sizeof(kKeygenLabel)) || @@ -173,8 +173,8 @@ static int mul_public_3(const EC_GROUP *group, EC_JACOBIAN *out, const EC_JACOBIAN *p2, const EC_SCALAR *scalar2) { EC_JACOBIAN points[3] = {*p0, *p1, *p2}; EC_SCALAR scalars[3] = {*scalar0, *scalar1, *scalar2}; - return ec_point_mul_scalar_public_batch(group, out, /*g_scalar=*/NULL, points, - scalars, 3); + return ec_point_mul_scalar_public_batch(group, out, /*g_scalar=*/nullptr, + points, scalars, 3); } static int pmbtoken_compute_keys(const PMBTOKEN_METHOD *method, @@ -185,24 +185,25 @@ static int pmbtoken_compute_keys(const PMBTOKEN_METHOD *method, const EC_GROUP *group = method->group; EC_JACOBIAN pub[3]; if (!ec_point_mul_scalar_precomp(group, &pub[0], &method->g_precomp, x0, - &method->h_precomp, y0, NULL, NULL) || + &method->h_precomp, y0, nullptr, nullptr) || !ec_point_mul_scalar_precomp(group, &pub[1], &method->g_precomp, x1, - &method->h_precomp, y1, NULL, NULL) || + &method->h_precomp, y1, nullptr, nullptr) || !ec_point_mul_scalar_precomp(method->group, &pub[2], &method->g_precomp, - xs, &method->h_precomp, ys, NULL, NULL)) { + xs, &method->h_precomp, ys, nullptr, + nullptr)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_KEYGEN_FAILURE); return 0; } const EC_SCALAR *scalars[] = {x0, y0, x1, y1, xs, ys}; size_t scalar_len = BN_num_bytes(EC_GROUP_get0_order(group)); - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(scalars); i++) { + for (const EC_SCALAR *scalar : scalars) { uint8_t *buf; if (!CBB_add_space(out_private, &buf, scalar_len)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_BUFFER_TOO_SMALL); return 0; } - ec_scalar_to_bytes(group, buf, &scalar_len, scalars[i]); + ec_scalar_to_bytes(group, buf, &scalar_len, scalar); } EC_AFFINE pub_affine[3]; @@ -287,10 +288,9 @@ static int pmbtoken_issuer_key_from_bytes(const PMBTOKEN_METHOD *method, size_t scalar_len = BN_num_bytes(EC_GROUP_get0_order(group)); EC_SCALAR *scalars[] = {&key->x0, &key->y0, &key->x1, &key->y1, &key->xs, &key->ys}; - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(scalars); i++) { + for (EC_SCALAR *scalar : scalars) { if (!CBS_get_bytes(&cbs, &tmp, scalar_len) || - !ec_scalar_from_bytes(group, scalars[i], CBS_data(&tmp), - CBS_len(&tmp))) { + !ec_scalar_from_bytes(group, scalar, CBS_data(&tmp), CBS_len(&tmp))) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_FAILURE); return 0; } @@ -300,13 +300,16 @@ static int pmbtoken_issuer_key_from_bytes(const PMBTOKEN_METHOD *method, EC_JACOBIAN pub[3]; EC_AFFINE pub_affine[3]; if (!ec_point_mul_scalar_precomp(group, &pub[0], &method->g_precomp, &key->x0, - &method->h_precomp, &key->y0, NULL, NULL) || + &method->h_precomp, &key->y0, nullptr, + nullptr) || !ec_init_precomp(group, &key->pub0_precomp, &pub[0]) || !ec_point_mul_scalar_precomp(group, &pub[1], &method->g_precomp, &key->x1, - &method->h_precomp, &key->y1, NULL, NULL) || + &method->h_precomp, &key->y1, nullptr, + nullptr) || !ec_init_precomp(group, &key->pub1_precomp, &pub[1]) || !ec_point_mul_scalar_precomp(group, &pub[2], &method->g_precomp, &key->xs, - &method->h_precomp, &key->ys, NULL, NULL) || + &method->h_precomp, &key->ys, nullptr, + nullptr) || !ec_init_precomp(group, &key->pubs_precomp, &pub[2]) || !ec_jacobian_to_affine_batch(group, pub_affine, pub, 3)) { return 0; @@ -326,7 +329,7 @@ static STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_blind( const EC_GROUP *group = method->group; STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens = sk_TRUST_TOKEN_PRETOKEN_new_null(); - if (pretokens == NULL) { + if (pretokens == nullptr) { goto err; } @@ -334,7 +337,7 @@ static STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_blind( // Insert |pretoken| into |pretokens| early to simplify error-handling. TRUST_TOKEN_PRETOKEN *pretoken = reinterpret_cast( OPENSSL_malloc(sizeof(TRUST_TOKEN_PRETOKEN))); - if (pretoken == NULL || + if (pretoken == nullptr || !sk_TRUST_TOKEN_PRETOKEN_push(pretokens, pretoken)) { TRUST_TOKEN_PRETOKEN_free(pretoken); goto err; @@ -380,7 +383,7 @@ static STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_blind( err: sk_TRUST_TOKEN_PRETOKEN_pop_free(pretokens, TRUST_TOKEN_PRETOKEN_free); - return NULL; + return nullptr; } static int scalar_to_cbb(CBB *out, const EC_GROUP *group, @@ -415,7 +418,7 @@ static int hash_c_dleq(const PMBTOKEN_METHOD *method, EC_SCALAR *out, int ok = 0; CBB cbb; CBB_zero(&cbb); - uint8_t *buf = NULL; + uint8_t *buf = nullptr; size_t len; if (!CBB_init(&cbb, 0) || !CBB_add_bytes(&cbb, kDLEQ2Label, sizeof(kDLEQ2Label)) || @@ -448,7 +451,7 @@ static int hash_c_dleqor(const PMBTOKEN_METHOD *method, EC_SCALAR *out, int ok = 0; CBB cbb; CBB_zero(&cbb); - uint8_t *buf = NULL; + uint8_t *buf = nullptr; size_t len; if (!CBB_init(&cbb, 0) || !CBB_add_bytes(&cbb, kDLEQOR2Label, sizeof(kDLEQOR2Label)) || @@ -486,7 +489,7 @@ static int hash_c_batch(const PMBTOKEN_METHOD *method, EC_SCALAR *out, int ok = 0; CBB cbb; CBB_zero(&cbb); - uint8_t *buf = NULL; + uint8_t *buf = nullptr; size_t len; if (!CBB_init(&cbb, 0) || !CBB_add_bytes(&cbb, kDLEQBatchLabel, sizeof(kDLEQBatchLabel)) || @@ -541,9 +544,9 @@ static int dleq_generate(const PMBTOKEN_METHOD *method, CBB *cbb, // Ks = ks0*(G;T) + ks1*(H;S) !ec_point_mul_scalar_precomp(group, &jacobians[idx_Ks0], &method->g_precomp, &ks0, &method->h_precomp, - &ks1, NULL, NULL) || + &ks1, nullptr, nullptr) || !ec_point_mul_scalar_batch(group, &jacobians[idx_Ks1], T, &ks0, S, &ks1, - NULL, NULL)) { + nullptr, nullptr)) { return 0; } @@ -565,9 +568,9 @@ static int dleq_generate(const PMBTOKEN_METHOD *method, CBB *cbb, // Kb = k0*(G;T) + k1*(H;S) !ec_point_mul_scalar_precomp(group, &jacobians[idx_Kb0], &method->g_precomp, &k0, &method->h_precomp, - &k1, NULL, NULL) || + &k1, nullptr, nullptr) || !ec_point_mul_scalar_batch(group, &jacobians[idx_Kb1], T, &k0, S, &k1, - NULL, NULL) || + nullptr, nullptr) || // co, uo, vo <- Zp !ec_random_nonzero_scalar(group, &minus_co, kDefaultAdditionalData) || !ec_random_nonzero_scalar(group, &uo, kDefaultAdditionalData) || @@ -833,9 +836,10 @@ static int pmbtoken_sign(const PMBTOKEN_METHOD *method, EC_AFFINE affines[3]; if (!method->hash_s(group, &jacobians[0], &Tp_affine, s) || !ec_point_mul_scalar_batch(group, &jacobians[1], &Tp, &xb, - &jacobians[0], &yb, NULL, NULL) || + &jacobians[0], &yb, nullptr, nullptr) || !ec_point_mul_scalar_batch(group, &jacobians[2], &Tp, &key->xs, - &jacobians[0], &key->ys, NULL, NULL) || + &jacobians[0], &key->ys, nullptr, + nullptr) || !ec_jacobian_to_affine_batch(group, affines, jacobians, 3) || !CBB_add_bytes(cbb, s, TRUST_TOKEN_NONCE_SIZE) || !cbb_add_prefixed_point(cbb, group, &affines[1], @@ -872,16 +876,16 @@ static int pmbtoken_sign(const PMBTOKEN_METHOD *method, EC_JACOBIAN Tp_batch, Sp_batch, Wp_batch, Wsp_batch; if (!ec_point_mul_scalar_public_batch(group, &Tp_batch, - /*g_scalar=*/NULL, Tps, es, + /*g_scalar=*/nullptr, Tps, es, num_to_issue) || !ec_point_mul_scalar_public_batch(group, &Sp_batch, - /*g_scalar=*/NULL, Sps, es, + /*g_scalar=*/nullptr, Sps, es, num_to_issue) || !ec_point_mul_scalar_public_batch(group, &Wp_batch, - /*g_scalar=*/NULL, Wps, es, + /*g_scalar=*/nullptr, Wps, es, num_to_issue) || !ec_point_mul_scalar_public_batch(group, &Wsp_batch, - /*g_scalar=*/NULL, Wsps, es, + /*g_scalar=*/nullptr, Wsps, es, num_to_issue)) { goto err; } @@ -925,7 +929,7 @@ static STACK_OF(TRUST_TOKEN) *pmbtoken_unblind( const EC_GROUP *group = method->group; if (count > sk_TRUST_TOKEN_PRETOKEN_num(pretokens)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_FAILURE); - return NULL; + return nullptr; } int ok = 0; @@ -942,8 +946,8 @@ static STACK_OF(TRUST_TOKEN) *pmbtoken_unblind( reinterpret_cast(OPENSSL_calloc(count, sizeof(EC_SCALAR))); CBB batch_cbb; CBB_zero(&batch_cbb); - if (ret == NULL || Tps == NULL || Sps == NULL || Wps == NULL || - Wsps == NULL || es == NULL || !CBB_init(&batch_cbb, 0) || + if (ret == nullptr || Tps == nullptr || Sps == nullptr || Wps == nullptr || + Wsps == nullptr || es == nullptr || !CBB_init(&batch_cbb, 0) || !point_to_cbb(&batch_cbb, method->group, &key->pubs) || !point_to_cbb(&batch_cbb, method->group, &key->pub0) || !point_to_cbb(&batch_cbb, method->group, &key->pub1)) { @@ -1012,7 +1016,7 @@ static STACK_OF(TRUST_TOKEN) *pmbtoken_unblind( TRUST_TOKEN *token = TRUST_TOKEN_new(CBB_data(&token_cbb), CBB_len(&token_cbb)); CBB_cleanup(&token_cbb); - if (token == NULL || !sk_TRUST_TOKEN_push(ret, token)) { + if (token == nullptr || !sk_TRUST_TOKEN_push(ret, token)) { TRUST_TOKEN_free(token); goto err; } @@ -1029,13 +1033,14 @@ static STACK_OF(TRUST_TOKEN) *pmbtoken_unblind( EC_JACOBIAN Tp_batch, Sp_batch, Wp_batch, Wsp_batch; if (!ec_point_mul_scalar_public_batch(group, &Tp_batch, - /*g_scalar=*/NULL, Tps, es, count) || + /*g_scalar=*/nullptr, Tps, es, count) || !ec_point_mul_scalar_public_batch(group, &Sp_batch, - /*g_scalar=*/NULL, Sps, es, count) || + /*g_scalar=*/nullptr, Sps, es, count) || !ec_point_mul_scalar_public_batch(group, &Wp_batch, - /*g_scalar=*/NULL, Wps, es, count) || + /*g_scalar=*/nullptr, Wps, es, count) || !ec_point_mul_scalar_public_batch(group, &Wsp_batch, - /*g_scalar=*/NULL, Wsps, es, count)) { + /*g_scalar=*/nullptr, Wsps, es, + count)) { goto err; } @@ -1058,7 +1063,7 @@ err: CBB_cleanup(&batch_cbb); if (!ok) { sk_TRUST_TOKEN_pop_free(ret, TRUST_TOKEN_free); - ret = NULL; + ret = nullptr; } return ret; } @@ -1111,7 +1116,7 @@ static int pmbtoken_read(const PMBTOKEN_METHOD *method, EC_JACOBIAN Ws_calculated; // Check the validity of the token. if (!ec_point_mul_scalar_precomp(group, &Ws_calculated, &T_precomp, &key->xs, - &S_precomp, &key->ys, NULL, NULL) || + &S_precomp, &key->ys, nullptr, nullptr) || !ec_affine_jacobian_equal(group, &Ws, &Ws_calculated)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_BAD_VALIDITY_CHECK); return 0; @@ -1119,9 +1124,9 @@ static int pmbtoken_read(const PMBTOKEN_METHOD *method, EC_JACOBIAN W0, W1; if (!ec_point_mul_scalar_precomp(group, &W0, &T_precomp, &key->x0, &S_precomp, - &key->y0, NULL, NULL) || + &key->y0, nullptr, nullptr) || !ec_point_mul_scalar_precomp(group, &W1, &T_precomp, &key->x1, &S_precomp, - &key->y1, NULL, NULL)) { + &key->y1, nullptr, nullptr)) { return 0; } @@ -1154,7 +1159,7 @@ static int pmbtoken_exp1_hash_s(const EC_GROUP *group, EC_JACOBIAN *out, const uint8_t kHashSLabel[] = "PMBTokens Experiment V1 HashS"; int ret = 0; CBB cbb; - uint8_t *buf = NULL; + uint8_t *buf = nullptr; size_t len; if (!CBB_init(&cbb, 0) || !point_to_cbb(&cbb, group, t) || !CBB_add_bytes(&cbb, s, TRUST_TOKEN_NONCE_SIZE) || @@ -1260,7 +1265,7 @@ STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_exp1_blind(CBB *cbb, size_t count, const uint8_t *msg, size_t msg_len) { if (!pmbtoken_exp1_init_method()) { - return NULL; + return nullptr; } return pmbtoken_blind(&pmbtoken_exp1_method, cbb, count, include_message, msg, msg_len); @@ -1281,7 +1286,7 @@ STACK_OF(TRUST_TOKEN) *pmbtoken_exp1_unblind( const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, uint32_t key_id) { if (!pmbtoken_exp1_init_method()) { - return NULL; + return nullptr; } return pmbtoken_unblind(&pmbtoken_exp1_method, key, pretokens, cbs, count, key_id); @@ -1326,7 +1331,7 @@ static int pmbtoken_exp2_hash_s(const EC_GROUP *group, EC_JACOBIAN *out, const uint8_t kHashSLabel[] = "PMBTokens Experiment V2 HashS"; int ret = 0; CBB cbb; - uint8_t *buf = NULL; + uint8_t *buf = nullptr; size_t len; if (!CBB_init(&cbb, 0) || !point_to_cbb(&cbb, group, t) || !CBB_add_bytes(&cbb, s, TRUST_TOKEN_NONCE_SIZE) || @@ -1432,7 +1437,7 @@ STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_exp2_blind(CBB *cbb, size_t count, const uint8_t *msg, size_t msg_len) { if (!pmbtoken_exp2_init_method()) { - return NULL; + return nullptr; } return pmbtoken_blind(&pmbtoken_exp2_method, cbb, count, include_message, msg, msg_len); @@ -1453,7 +1458,7 @@ STACK_OF(TRUST_TOKEN) *pmbtoken_exp2_unblind( const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, uint32_t key_id) { if (!pmbtoken_exp2_init_method()) { - return NULL; + return nullptr; } return pmbtoken_unblind(&pmbtoken_exp2_method, key, pretokens, cbs, count, key_id); @@ -1498,7 +1503,7 @@ static int pmbtoken_pst1_hash_s(const EC_GROUP *group, EC_JACOBIAN *out, const uint8_t kHashSLabel[] = "PMBTokens PST V1 HashS"; int ret = 0; CBB cbb; - uint8_t *buf = NULL; + uint8_t *buf = nullptr; size_t len; if (!CBB_init(&cbb, 0) || !point_to_cbb(&cbb, group, t) || !CBB_add_bytes(&cbb, s, TRUST_TOKEN_NONCE_SIZE) || @@ -1604,7 +1609,7 @@ STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_pst1_blind(CBB *cbb, size_t count, const uint8_t *msg, size_t msg_len) { if (!pmbtoken_pst1_init_method()) { - return NULL; + return nullptr; } return pmbtoken_blind(&pmbtoken_pst1_method, cbb, count, include_message, msg, msg_len); @@ -1625,7 +1630,7 @@ STACK_OF(TRUST_TOKEN) *pmbtoken_pst1_unblind( const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, uint32_t key_id) { if (!pmbtoken_pst1_init_method()) { - return NULL; + return nullptr; } return pmbtoken_unblind(&pmbtoken_pst1_method, key, pretokens, cbs, count, key_id); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/trust_token/trust_token.cc b/naiveproxy/src/third_party/boringssl/src/crypto/trust_token/trust_token.cc index a5c2b879e6..6fa3582119 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/trust_token/trust_token.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/trust_token/trust_token.cc @@ -12,12 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include + +#include + #include #include #include #include #include -#include #include "internal.h" @@ -120,20 +123,20 @@ void TRUST_TOKEN_PRETOKEN_free(TRUST_TOKEN_PRETOKEN *pretoken) { TRUST_TOKEN *TRUST_TOKEN_new(const uint8_t *data, size_t len) { TRUST_TOKEN *ret = reinterpret_cast(OPENSSL_zalloc(sizeof(TRUST_TOKEN))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->data = reinterpret_cast(OPENSSL_memdup(data, len)); - if (len != 0 && ret->data == NULL) { + if (len != 0 && ret->data == nullptr) { OPENSSL_free(ret); - return NULL; + return nullptr; } ret->len = len; return ret; } void TRUST_TOKEN_free(TRUST_TOKEN *token) { - if (token == NULL) { + if (token == nullptr) { return; } OPENSSL_free(token->data); @@ -159,8 +162,8 @@ int TRUST_TOKEN_generate_key(const TRUST_TOKEN_METHOD *method, return 0; } - if (!CBB_finish(&priv_cbb, NULL, out_priv_key_len) || - !CBB_finish(&pub_cbb, NULL, out_pub_key_len)) { + if (!CBB_finish(&priv_cbb, nullptr, out_priv_key_len) || + !CBB_finish(&pub_cbb, nullptr, out_pub_key_len)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_BUFFER_TOO_SMALL); return 0; } @@ -188,8 +191,8 @@ int TRUST_TOKEN_derive_key_from_secret( return 0; } - if (!CBB_finish(&priv_cbb, NULL, out_priv_key_len) || - !CBB_finish(&pub_cbb, NULL, out_pub_key_len)) { + if (!CBB_finish(&priv_cbb, nullptr, out_priv_key_len) || + !CBB_finish(&pub_cbb, nullptr, out_pub_key_len)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_BUFFER_TOO_SMALL); return 0; } @@ -202,13 +205,13 @@ TRUST_TOKEN_CLIENT *TRUST_TOKEN_CLIENT_new(const TRUST_TOKEN_METHOD *method, if (max_batchsize > 0xffff) { // The protocol supports only two-byte token counts. OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_OVERFLOW); - return NULL; + return nullptr; } TRUST_TOKEN_CLIENT *ret = reinterpret_cast( OPENSSL_zalloc(sizeof(TRUST_TOKEN_CLIENT))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->method = method; ret->max_batchsize = (uint16_t)max_batchsize; @@ -216,7 +219,7 @@ TRUST_TOKEN_CLIENT *TRUST_TOKEN_CLIENT_new(const TRUST_TOKEN_METHOD *method, } void TRUST_TOKEN_CLIENT_free(TRUST_TOKEN_CLIENT *ctx) { - if (ctx == NULL) { + if (ctx == nullptr) { return; } EVP_PKEY_free(ctx->srr_key); @@ -226,7 +229,7 @@ void TRUST_TOKEN_CLIENT_free(TRUST_TOKEN_CLIENT *ctx) { int TRUST_TOKEN_CLIENT_add_key(TRUST_TOKEN_CLIENT *ctx, size_t *out_key_index, const uint8_t *key, size_t key_len) { - if (ctx->num_keys == OPENSSL_ARRAY_SIZE(ctx->keys) || + if (ctx->num_keys == std::size(ctx->keys) || ctx->num_keys >= ctx->method->max_keys) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_TOO_MANY_KEYS); return 0; @@ -267,14 +270,14 @@ static int trust_token_client_begin_issuance_impl( int ret = 0; CBB request; - STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens = NULL; + STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens = nullptr; if (!CBB_init(&request, 0) || !CBB_add_u16(&request, count)) { goto err; } pretokens = ctx->method->blind(&request, count, include_message, msg, msg_len); - if (pretokens == NULL) { + if (pretokens == nullptr) { goto err; } @@ -284,7 +287,7 @@ static int trust_token_client_begin_issuance_impl( sk_TRUST_TOKEN_PRETOKEN_pop_free(ctx->pretokens, TRUST_TOKEN_PRETOKEN_free); ctx->pretokens = pretokens; - pretokens = NULL; + pretokens = nullptr; ret = 1; err: @@ -296,7 +299,8 @@ err: int TRUST_TOKEN_CLIENT_begin_issuance(TRUST_TOKEN_CLIENT *ctx, uint8_t **out, size_t *out_len, size_t count) { return trust_token_client_begin_issuance_impl(ctx, out, out_len, count, - /*include_message=*/0, NULL, 0); + /*include_message=*/0, nullptr, + 0); } int TRUST_TOKEN_CLIENT_begin_issuance_over_message( @@ -316,11 +320,11 @@ STACK_OF(TRUST_TOKEN) *TRUST_TOKEN_CLIENT_finish_issuance( uint32_t key_id; if (!CBS_get_u16(&in, &count) || !CBS_get_u32(&in, &key_id)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_FAILURE); - return NULL; + return nullptr; } size_t key_index = 0; - const struct trust_token_client_key_st *key = NULL; + const struct trust_token_client_key_st *key = nullptr; for (size_t i = 0; i < ctx->num_keys; i++) { if (ctx->keys[i].id == key_id) { key_index = i; @@ -329,30 +333,30 @@ STACK_OF(TRUST_TOKEN) *TRUST_TOKEN_CLIENT_finish_issuance( } } - if (key == NULL) { + if (key == nullptr) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_INVALID_KEY_ID); - return NULL; + return nullptr; } if (count > sk_TRUST_TOKEN_PRETOKEN_num(ctx->pretokens)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_FAILURE); - return NULL; + return nullptr; } STACK_OF(TRUST_TOKEN) *tokens = ctx->method->unblind(&key->key, ctx->pretokens, &in, count, key_id); - if (tokens == NULL) { - return NULL; + if (tokens == nullptr) { + return nullptr; } if (CBS_len(&in) != 0) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_FAILURE); sk_TRUST_TOKEN_pop_free(tokens, TRUST_TOKEN_free); - return NULL; + return nullptr; } sk_TRUST_TOKEN_PRETOKEN_pop_free(ctx->pretokens, TRUST_TOKEN_PRETOKEN_free); - ctx->pretokens = NULL; + ctx->pretokens = nullptr; *out_key_index = key_index; return tokens; @@ -389,7 +393,7 @@ int TRUST_TOKEN_CLIENT_finish_redemption(TRUST_TOKEN_CLIENT *ctx, return 0; } - *out_sig = NULL; + *out_sig = nullptr; *out_sig_len = 0; return 1; } @@ -400,16 +404,17 @@ int TRUST_TOKEN_CLIENT_finish_redemption(TRUST_TOKEN_CLIENT *ctx, return 0; } - if (ctx->srr_key == NULL) { + if (ctx->srr_key == nullptr) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_NO_SRR_KEY_CONFIGURED); return 0; } EVP_MD_CTX md_ctx; EVP_MD_CTX_init(&md_ctx); - int sig_ok = EVP_DigestVerifyInit(&md_ctx, NULL, NULL, NULL, ctx->srr_key) && - EVP_DigestVerify(&md_ctx, CBS_data(&sig), CBS_len(&sig), - CBS_data(&srr), CBS_len(&srr)); + int sig_ok = + EVP_DigestVerifyInit(&md_ctx, nullptr, nullptr, nullptr, ctx->srr_key) && + EVP_DigestVerify(&md_ctx, CBS_data(&sig), CBS_len(&sig), CBS_data(&srr), + CBS_len(&srr)); EVP_MD_CTX_cleanup(&md_ctx); if (!sig_ok) { @@ -417,7 +422,7 @@ int TRUST_TOKEN_CLIENT_finish_redemption(TRUST_TOKEN_CLIENT *ctx, return 0; } - uint8_t *srr_buf = NULL, *sig_buf = NULL; + uint8_t *srr_buf = nullptr, *sig_buf = nullptr; size_t srr_len, sig_len; if (!CBS_stow(&srr, &srr_buf, &srr_len) || !CBS_stow(&sig, &sig_buf, &sig_len)) { @@ -438,13 +443,13 @@ TRUST_TOKEN_ISSUER *TRUST_TOKEN_ISSUER_new(const TRUST_TOKEN_METHOD *method, if (max_batchsize > 0xffff) { // The protocol supports only two-byte token counts. OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_OVERFLOW); - return NULL; + return nullptr; } TRUST_TOKEN_ISSUER *ret = reinterpret_cast( OPENSSL_zalloc(sizeof(TRUST_TOKEN_ISSUER))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->method = method; ret->max_batchsize = (uint16_t)max_batchsize; @@ -452,7 +457,7 @@ TRUST_TOKEN_ISSUER *TRUST_TOKEN_ISSUER_new(const TRUST_TOKEN_METHOD *method, } void TRUST_TOKEN_ISSUER_free(TRUST_TOKEN_ISSUER *ctx) { - if (ctx == NULL) { + if (ctx == nullptr) { return; } EVP_PKEY_free(ctx->srr_key); @@ -462,7 +467,7 @@ void TRUST_TOKEN_ISSUER_free(TRUST_TOKEN_ISSUER *ctx) { int TRUST_TOKEN_ISSUER_add_key(TRUST_TOKEN_ISSUER *ctx, const uint8_t *key, size_t key_len) { - if (ctx->num_keys == OPENSSL_ARRAY_SIZE(ctx->keys) || + if (ctx->num_keys == std::size(ctx->keys) || ctx->num_keys >= ctx->method->max_keys) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_TOO_MANY_KEYS); return 0; @@ -499,7 +504,7 @@ int TRUST_TOKEN_ISSUER_set_metadata_key(TRUST_TOKEN_ISSUER *ctx, OPENSSL_free(ctx->metadata_key); ctx->metadata_key_len = 0; ctx->metadata_key = reinterpret_cast(OPENSSL_memdup(key, len)); - if (ctx->metadata_key == NULL) { + if (ctx->metadata_key == nullptr) { return 0; } ctx->metadata_key_len = len; @@ -513,7 +518,7 @@ static const struct trust_token_issuer_key_st *trust_token_issuer_get_key( return &ctx->keys[i]; } } - return NULL; + return nullptr; } int TRUST_TOKEN_ISSUER_issue(const TRUST_TOKEN_ISSUER *ctx, uint8_t **out, @@ -527,7 +532,7 @@ int TRUST_TOKEN_ISSUER_issue(const TRUST_TOKEN_ISSUER *ctx, uint8_t **out, const struct trust_token_issuer_key_st *key = trust_token_issuer_get_key(ctx, public_metadata); - if (key == NULL || private_metadata > 1 || + if (key == nullptr || private_metadata > 1 || (!ctx->method->has_private_metadata && private_metadata != 0)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_INVALID_METADATA); return 0; @@ -599,7 +604,7 @@ static int trust_token_issuer_redeem_impl( const struct trust_token_issuer_key_st *key = trust_token_issuer_get_key(ctx, public_metadata); uint8_t nonce[TRUST_TOKEN_NONCE_SIZE]; - if (key == NULL || + if (key == nullptr || !ctx->method->read(&key->key, nonce, &private_metadata, CBS_data(&token_cbs), CBS_len(&token_cbs), include_message, msg, msg_len)) { @@ -615,7 +620,7 @@ static int trust_token_issuer_redeem_impl( return 0; } - uint8_t *client_data_buf = NULL; + uint8_t *client_data_buf = nullptr; size_t client_data_len = 0; TRUST_TOKEN *token; if (!CBS_stow(&client_data, &client_data_buf, &client_data_len)) { @@ -623,7 +628,7 @@ static int trust_token_issuer_redeem_impl( } token = TRUST_TOKEN_new(nonce, TRUST_TOKEN_NONCE_SIZE); - if (token == NULL) { + if (token == nullptr) { goto err; } *out_public = public_metadata; @@ -648,7 +653,7 @@ int TRUST_TOKEN_ISSUER_redeem(const TRUST_TOKEN_ISSUER *ctx, const uint8_t *request, size_t request_len) { return trust_token_issuer_redeem_impl(ctx, out_public, out_private, out_token, out_client_data, out_client_data_len, - request, request_len, 0, NULL, 0); + request, request_len, 0, nullptr, 0); } int TRUST_TOKEN_ISSUER_redeem_over_message( diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/trust_token/voprf.cc b/naiveproxy/src/third_party/boringssl/src/crypto/trust_token/voprf.cc index 9eca4bf66a..2fbb49ce7b 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/trust_token/voprf.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/trust_token/voprf.cc @@ -143,7 +143,7 @@ static int voprf_derive_key_from_secret(const VOPRF_METHOD *method, int ok = 0; CBB cbb; CBB_zero(&cbb); - uint8_t *buf = NULL; + uint8_t *buf = nullptr; size_t len; if (!CBB_init(&cbb, 0) || !CBB_add_bytes(&cbb, kKeygenLabel, sizeof(kKeygenLabel)) || @@ -203,7 +203,7 @@ static STACK_OF(TRUST_TOKEN_PRETOKEN) *voprf_blind(const VOPRF_METHOD *method, const EC_GROUP *group = method->group_func(); STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens = sk_TRUST_TOKEN_PRETOKEN_new_null(); - if (pretokens == NULL) { + if (pretokens == nullptr) { goto err; } @@ -211,7 +211,7 @@ static STACK_OF(TRUST_TOKEN_PRETOKEN) *voprf_blind(const VOPRF_METHOD *method, // Insert |pretoken| into |pretokens| early to simplify error-handling. TRUST_TOKEN_PRETOKEN *pretoken = reinterpret_cast( OPENSSL_malloc(sizeof(TRUST_TOKEN_PRETOKEN))); - if (pretoken == NULL || + if (pretoken == nullptr || !sk_TRUST_TOKEN_PRETOKEN_push(pretokens, pretoken)) { TRUST_TOKEN_PRETOKEN_free(pretoken); goto err; @@ -257,7 +257,7 @@ static STACK_OF(TRUST_TOKEN_PRETOKEN) *voprf_blind(const VOPRF_METHOD *method, err: sk_TRUST_TOKEN_PRETOKEN_pop_free(pretokens, TRUST_TOKEN_PRETOKEN_free); - return NULL; + return nullptr; } static int hash_to_scalar_dleq(const VOPRF_METHOD *method, EC_SCALAR *out, @@ -270,7 +270,7 @@ static int hash_to_scalar_dleq(const VOPRF_METHOD *method, EC_SCALAR *out, int ok = 0; CBB cbb; CBB_zero(&cbb); - uint8_t *buf = NULL; + uint8_t *buf = nullptr; size_t len; if (!CBB_init(&cbb, 0) || !CBB_add_bytes(&cbb, kDLEQLabel, sizeof(kDLEQLabel)) || @@ -306,7 +306,7 @@ static int hash_to_scalar_challenge(const VOPRF_METHOD *method, EC_SCALAR *out, !cbb_serialize_point(&cbb, group, a2) || !cbb_serialize_point(&cbb, group, a3) || !CBB_add_bytes(&cbb, kChallengeLabel, sizeof(kChallengeLabel) - 1) || - !CBB_finish(&cbb, NULL, &len) || + !CBB_finish(&cbb, nullptr, &len) || !method->hash_to_scalar(group, out, transcript, len)) { return 0; } @@ -326,7 +326,7 @@ static int hash_to_scalar_batch(const VOPRF_METHOD *method, EC_SCALAR *out, int ok = 0; CBB cbb; CBB_zero(&cbb); - uint8_t *buf = NULL; + uint8_t *buf = nullptr; size_t len; if (!CBB_init(&cbb, 0) || !CBB_add_bytes(&cbb, kDLEQBatchLabel, sizeof(kDLEQBatchLabel)) || @@ -405,8 +405,8 @@ static int mul_public_2(const EC_GROUP *group, EC_JACOBIAN *out, const EC_JACOBIAN *p1, const EC_SCALAR *scalar1) { EC_JACOBIAN points[2] = {*p0, *p1}; EC_SCALAR scalars[2] = {*scalar0, *scalar1}; - return ec_point_mul_scalar_public_batch(group, out, /*g_scalar=*/NULL, points, - scalars, 2); + return ec_point_mul_scalar_public_batch(group, out, /*g_scalar=*/nullptr, + points, scalars, 2); } static int dleq_verify(const VOPRF_METHOD *method, CBS *cbs, @@ -529,10 +529,10 @@ static int voprf_sign_tt(const VOPRF_METHOD *method, EC_JACOBIAN BT_batch, Z_batch; if (!ec_point_mul_scalar_public_batch(group, &BT_batch, - /*g_scalar=*/NULL, BTs, es, + /*g_scalar=*/nullptr, BTs, es, num_to_issue) || !ec_point_mul_scalar_public_batch(group, &Z_batch, - /*g_scalar=*/NULL, Zs, es, + /*g_scalar=*/nullptr, Zs, es, num_to_issue)) { goto err; } @@ -569,7 +569,7 @@ static STACK_OF(TRUST_TOKEN) *voprf_unblind_tt( const EC_GROUP *group = method->group_func(); if (count > sk_TRUST_TOKEN_PRETOKEN_num(pretokens)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_FAILURE); - return NULL; + return nullptr; } int ok = 0; @@ -582,7 +582,7 @@ static STACK_OF(TRUST_TOKEN) *voprf_unblind_tt( reinterpret_cast(OPENSSL_calloc(count, sizeof(EC_SCALAR))); CBB batch_cbb; CBB_zero(&batch_cbb); - if (ret == NULL || BTs == NULL || Zs == NULL || es == NULL || + if (ret == nullptr || BTs == nullptr || Zs == nullptr || es == nullptr || !CBB_init(&batch_cbb, 0) || !cbb_add_point(&batch_cbb, group, &key->pubs)) { goto err; @@ -631,7 +631,7 @@ static STACK_OF(TRUST_TOKEN) *voprf_unblind_tt( TRUST_TOKEN *token = TRUST_TOKEN_new(CBB_data(&token_cbb), CBB_len(&token_cbb)); CBB_cleanup(&token_cbb); - if (token == NULL || !sk_TRUST_TOKEN_push(ret, token)) { + if (token == nullptr || !sk_TRUST_TOKEN_push(ret, token)) { TRUST_TOKEN_free(token); goto err; } @@ -648,9 +648,9 @@ static STACK_OF(TRUST_TOKEN) *voprf_unblind_tt( EC_JACOBIAN BT_batch, Z_batch; if (!ec_point_mul_scalar_public_batch(group, &BT_batch, - /*g_scalar=*/NULL, BTs, es, count) || + /*g_scalar=*/nullptr, BTs, es, count) || !ec_point_mul_scalar_public_batch(group, &Z_batch, - /*g_scalar=*/NULL, Zs, es, count)) { + /*g_scalar=*/nullptr, Zs, es, count)) { goto err; } @@ -670,7 +670,7 @@ err: CBB_cleanup(&batch_cbb); if (!ok) { sk_TRUST_TOKEN_pop_free(ret, TRUST_TOKEN_free); - ret = NULL; + ret = nullptr; } return ret; } @@ -729,7 +729,7 @@ static int compute_composite_element(const VOPRF_METHOD *method, !CBB_add_u16(&cbb, index) || !cbb_serialize_point(&cbb, group, C) || !cbb_serialize_point(&cbb, group, D) || !CBB_add_bytes(&cbb, kCompositeLabel, sizeof(kCompositeLabel) - 1) || - !CBB_finish(&cbb, NULL, &len) || + !CBB_finish(&cbb, nullptr, &len) || !method->hash_to_scalar(group, di, transcript, len)) { return 0; } @@ -898,7 +898,7 @@ static int voprf_sign_impl(const VOPRF_METHOD *method, EC_JACOBIAN M, Z; if (!ec_point_mul_scalar_public_batch(group, &M, - /*g_scalar=*/NULL, BTs, dis, + /*g_scalar=*/nullptr, BTs, dis, num_to_issue) || !ec_point_mul_scalar(group, &Z, &M, &key->xs)) { goto err; @@ -961,7 +961,7 @@ static STACK_OF(TRUST_TOKEN) *voprf_unblind( const EC_GROUP *group = method->group_func(); if (count > sk_TRUST_TOKEN_PRETOKEN_num(pretokens)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_FAILURE); - return NULL; + return nullptr; } int ok = 0; @@ -972,7 +972,7 @@ static STACK_OF(TRUST_TOKEN) *voprf_unblind( OPENSSL_calloc(count, sizeof(EC_JACOBIAN))); EC_SCALAR *dis = reinterpret_cast(OPENSSL_calloc(count, sizeof(EC_SCALAR))); - if (ret == NULL || !BTs || !Zs || !dis) { + if (ret == nullptr || !BTs || !Zs || !dis) { goto err; } @@ -1023,7 +1023,7 @@ static STACK_OF(TRUST_TOKEN) *voprf_unblind( TRUST_TOKEN *token = TRUST_TOKEN_new(CBB_data(&token_cbb), CBB_len(&token_cbb)); CBB_cleanup(&token_cbb); - if (token == NULL || !sk_TRUST_TOKEN_push(ret, token)) { + if (token == nullptr || !sk_TRUST_TOKEN_push(ret, token)) { TRUST_TOKEN_free(token); goto err; } @@ -1031,9 +1031,10 @@ static STACK_OF(TRUST_TOKEN) *voprf_unblind( EC_JACOBIAN M, Z; if (!ec_point_mul_scalar_public_batch(group, &M, - /*g_scalar=*/NULL, BTs, dis, count) || + /*g_scalar=*/nullptr, BTs, dis, + count) || !ec_point_mul_scalar_public_batch(group, &Z, - /*g_scalar=*/NULL, Zs, dis, count)) { + /*g_scalar=*/nullptr, Zs, dis, count)) { goto err; } @@ -1051,7 +1052,7 @@ err: OPENSSL_free(dis); if (!ok) { sk_TRUST_TOKEN_pop_free(ret, TRUST_TOKEN_free); - ret = NULL; + ret = nullptr; } return ret; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/a_digest.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/a_digest.cc index f3ddf73acd..9f5dde968c 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/a_digest.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/a_digest.cc @@ -24,14 +24,14 @@ int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data, int i, ret; unsigned char *str, *p; - i = i2d(data, NULL); - if ((str = (unsigned char *)OPENSSL_malloc(i)) == NULL) { + i = i2d(data, nullptr); + if ((str = (unsigned char *)OPENSSL_malloc(i)) == nullptr) { return 0; } p = str; i2d(data, &p); - ret = EVP_Digest(str, i, md, len, type, NULL); + ret = EVP_Digest(str, i, md, len, type, nullptr); OPENSSL_free(str); return ret; } @@ -39,14 +39,14 @@ int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data, int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, void *asn, unsigned char *md, unsigned int *len) { int i, ret; - unsigned char *str = NULL; + unsigned char *str = nullptr; i = ASN1_item_i2d(reinterpret_cast(asn), &str, it); if (!str) { return 0; } - ret = EVP_Digest(str, i, md, len, type, NULL); + ret = EVP_Digest(str, i, md, len, type, nullptr); OPENSSL_free(str); return ret; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/a_sign.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/a_sign.cc index 018a31b1d4..90b8784140 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/a_sign.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/a_sign.cc @@ -18,12 +18,16 @@ #include #include #include +#include #include #include +#include "../internal.h" +#include "../mem_internal.h" #include "internal.h" + int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2, ASN1_BIT_STRING *signature, void *asn, EVP_PKEY *pkey, const EVP_MD *type) { @@ -41,55 +45,56 @@ int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2, int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2, ASN1_BIT_STRING *signature, void *asn, EVP_MD_CTX *ctx) { - int ret = 0; - uint8_t *in = NULL, *out = NULL; + // Historically, this function called |EVP_MD_CTX_cleanup| on return. Some + // callers rely on this to avoid memory leaks. + bssl::Cleanup cleanup = [&] { EVP_MD_CTX_cleanup(ctx); }; - { - if (signature->type != V_ASN1_BIT_STRING) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE); - goto err; - } - - // Write out the requested copies of the AlgorithmIdentifier. - if (algor1 && !x509_digest_sign_algorithm(ctx, algor1)) { - goto err; - } - if (algor2 && !x509_digest_sign_algorithm(ctx, algor2)) { - goto err; - } - - int in_len = ASN1_item_i2d(reinterpret_cast(asn), &in, it); - if (in_len < 0) { - goto err; - } - - EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx->pctx); - size_t out_len = EVP_PKEY_size(pkey); - if (out_len > INT_MAX) { - OPENSSL_PUT_ERROR(X509, ERR_R_OVERFLOW); - goto err; - } - - out = reinterpret_cast(OPENSSL_malloc(out_len)); - if (out == NULL) { - goto err; - } - - if (!EVP_DigestSign(ctx, out, &out_len, in, in_len)) { - OPENSSL_PUT_ERROR(X509, ERR_R_EVP_LIB); - goto err; - } - - ASN1_STRING_set0(signature, out, (int)out_len); - out = NULL; - signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); - signature->flags |= ASN1_STRING_FLAG_BITS_LEFT; - ret = (int)out_len; + // Write out the requested copies of the AlgorithmIdentifier. This may modify + // |asn|, so we must do it first. + if ((algor1 != nullptr && !x509_digest_sign_algorithm(ctx, algor1)) || + (algor2 != nullptr && !x509_digest_sign_algorithm(ctx, algor2))) { + return 0; } -err: - EVP_MD_CTX_cleanup(ctx); - OPENSSL_free(in); - OPENSSL_free(out); - return ret; + uint8_t *in = nullptr; + int in_len = ASN1_item_i2d(reinterpret_cast(asn), &in, it); + if (in_len < 0) { + return 0; + } + bssl::UniquePtr free_in(in); + + return x509_sign_to_bit_string(ctx, signature, bssl::Span(in, in_len)); +} + +int x509_sign_to_bit_string(EVP_MD_CTX *ctx, ASN1_BIT_STRING *out, + bssl::Span in) { + if (out->type != V_ASN1_BIT_STRING) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE); + return 0; + } + + EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx->pctx); + size_t sig_len = EVP_PKEY_size(pkey); + if (sig_len > INT_MAX) { + // Ensure the signature will fit in |out|. + OPENSSL_PUT_ERROR(X509, ERR_R_OVERFLOW); + return 0; + } + bssl::Array sig; + if (!sig.Init(sig_len)) { + return 0; + } + + if (!EVP_DigestSign(ctx, sig.data(), &sig_len, in.data(), in.size())) { + OPENSSL_PUT_ERROR(X509, ERR_R_EVP_LIB); + return 0; + } + sig.Shrink(sig_len); + + uint8_t *sig_data; + sig.Release(&sig_data, &sig_len); + ASN1_STRING_set0(out, sig_data, static_cast(sig_len)); + out->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); + out->flags |= ASN1_STRING_FLAG_BITS_LEFT; + return static_cast(sig_len); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/a_verify.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/a_verify.cc index 58085eddbb..2e7b97ca93 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/a_verify.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/a_verify.cc @@ -17,18 +17,21 @@ #include #include +#include #include #include #include #include #include #include +#include #include "internal.h" -int ASN1_item_verify(const ASN1_ITEM *it, const X509_ALGOR *a, - const ASN1_BIT_STRING *signature, void *asn, - EVP_PKEY *pkey) { + +int x509_verify_signature(const X509_ALGOR *sigalg, + const ASN1_BIT_STRING *signature, + bssl::Span in, EVP_PKEY *pkey) { if (!pkey) { OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER); return 0; @@ -41,34 +44,29 @@ int ASN1_item_verify(const ASN1_ITEM *it, const X509_ALGOR *a, return 0; } } else { - sig_len = (size_t)ASN1_STRING_length(signature); + sig_len = static_cast(ASN1_STRING_length(signature)); } - EVP_MD_CTX ctx; - uint8_t *buf_in = NULL; - int ret = 0, inl = 0; - EVP_MD_CTX_init(&ctx); - - if (!x509_digest_verify_init(&ctx, a, pkey)) { - goto err; + bssl::ScopedEVP_MD_CTX ctx; + if (!x509_digest_verify_init(ctx.get(), sigalg, pkey)) { + return 0; } - - inl = ASN1_item_i2d(reinterpret_cast(asn), &buf_in, it); - - if (buf_in == NULL) { - goto err; - } - - if (!EVP_DigestVerify(&ctx, ASN1_STRING_get0_data(signature), sig_len, buf_in, - inl)) { + if (!EVP_DigestVerify(ctx.get(), ASN1_STRING_get0_data(signature), sig_len, + in.data(), in.size())) { OPENSSL_PUT_ERROR(X509, ERR_R_EVP_LIB); - goto err; + return 0; } - - ret = 1; - -err: - OPENSSL_free(buf_in); - EVP_MD_CTX_cleanup(&ctx); - return ret; + return 1; +} + +int ASN1_item_verify(const ASN1_ITEM *it, const X509_ALGOR *sigalg, + const ASN1_BIT_STRING *signature, void *asn, + EVP_PKEY *pkey) { + uint8_t *in = nullptr; + int in_len = ASN1_item_i2d(reinterpret_cast(asn), &in, it); + if (in_len < 0) { + return 0; + } + bssl::UniquePtr free_in(in); + return x509_verify_signature(sigalg, signature, bssl::Span(in, in_len), pkey); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/algorithm.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/algorithm.cc index 5e86014bd5..f6b3da7256 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/algorithm.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/algorithm.cc @@ -22,6 +22,12 @@ #include "internal.h" + +// TODO(crbug.com/42290422): Rewrite this logic to recognize signature +// algorithms without pulling in the OID table. We can enumerate every supported +// signature algorithm into a small enum and convert them to/from |EVP_PKEY_CTX| +// and |X509_ALGOR|. + // Restrict the digests that are allowed in X509 certificates static int x509_digest_nid_ok(const int digest_nid) { switch (digest_nid) { @@ -34,12 +40,13 @@ static int x509_digest_nid_ok(const int digest_nid) { int x509_digest_sign_algorithm(EVP_MD_CTX *ctx, X509_ALGOR *algor) { EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx->pctx); - if (pkey == NULL) { + if (pkey == nullptr) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_CONTEXT_NOT_INITIALISED); return 0; } - if (EVP_PKEY_id(pkey) == EVP_PKEY_RSA) { + if (EVP_PKEY_id(pkey) == EVP_PKEY_RSA || + EVP_PKEY_id(pkey) == EVP_PKEY_RSA_PSS) { int pad_mode; if (!EVP_PKEY_CTX_get_rsa_padding(ctx->pctx, &pad_mode)) { return 0; @@ -51,13 +58,14 @@ int x509_digest_sign_algorithm(EVP_MD_CTX *ctx, X509_ALGOR *algor) { } if (EVP_PKEY_id(pkey) == EVP_PKEY_ED25519) { - return X509_ALGOR_set0(algor, OBJ_nid2obj(NID_ED25519), V_ASN1_UNDEF, NULL); + return X509_ALGOR_set0(algor, OBJ_nid2obj(NID_ED25519), V_ASN1_UNDEF, + nullptr); } // Default behavior: look up the OID for the algorithm/hash pair and encode // that. const EVP_MD *digest = EVP_MD_CTX_get0_md(ctx); - if (digest == NULL) { + if (digest == nullptr) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_CONTEXT_NOT_INITIALISED); return 0; } @@ -74,7 +82,7 @@ int x509_digest_sign_algorithm(EVP_MD_CTX *ctx, X509_ALGOR *algor) { // it. int paramtype = (EVP_PKEY_id(pkey) == EVP_PKEY_RSA) ? V_ASN1_NULL : V_ASN1_UNDEF; - return X509_ALGOR_set0(algor, OBJ_nid2obj(sign_nid), paramtype, NULL); + return X509_ALGOR_set0(algor, OBJ_nid2obj(sign_nid), paramtype, nullptr); } int x509_digest_verify_init(EVP_MD_CTX *ctx, const X509_ALGOR *sigalg, @@ -88,7 +96,10 @@ int x509_digest_verify_init(EVP_MD_CTX *ctx, const X509_ALGOR *sigalg, } // Check the public key OID matches the public key type. - if (pkey_nid != EVP_PKEY_id(pkey)) { + const bool pkey_matches = + pkey_nid == EVP_PKEY_id(pkey) || + (sigalg_nid == NID_rsassaPss && EVP_PKEY_id(pkey) == EVP_PKEY_RSA_PSS); + if (!pkey_matches) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_PUBLIC_KEY_TYPE); return 0; } @@ -105,11 +116,11 @@ int x509_digest_verify_init(EVP_MD_CTX *ctx, const X509_ALGOR *sigalg, return x509_rsa_pss_to_ctx(ctx, sigalg, pkey); } if (sigalg_nid == NID_ED25519) { - if (sigalg->parameter != NULL) { + if (sigalg->parameter != nullptr) { OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PARAMETER); return 0; } - return EVP_DigestVerifyInit(ctx, NULL, NULL, NULL, pkey); + return EVP_DigestVerifyInit(ctx, nullptr, nullptr, nullptr, pkey); } OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM); return 0; @@ -120,17 +131,17 @@ int x509_digest_verify_init(EVP_MD_CTX *ctx, const X509_ALGOR *sigalg, // // TODO(davidben): Chromium's verifier allows both forms for RSA, but enforces // ECDSA more strictly. Align with Chromium and add a flag for b/167375496. - if (sigalg->parameter != NULL && sigalg->parameter->type != V_ASN1_NULL) { + if (sigalg->parameter != nullptr && sigalg->parameter->type != V_ASN1_NULL) { OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PARAMETER); return 0; } // Otherwise, initialize with the digest from the OID. const EVP_MD *digest = EVP_get_digestbynid(digest_nid); - if (digest == NULL) { + if (digest == nullptr) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM); return 0; } - return EVP_DigestVerifyInit(ctx, NULL, digest, NULL, pkey); + return EVP_DigestVerifyInit(ctx, nullptr, digest, nullptr, pkey); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/asn1_gen.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/asn1_gen.cc index 9b6bf17ef8..c134289488 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/asn1_gen.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/asn1_gen.cc @@ -159,7 +159,7 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, // Modifiers end at commas. const char *comma = strchr(str, ','); - if (comma == NULL) { + if (comma == nullptr) { break; } @@ -187,7 +187,7 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, CBS_skip(&modifier, 1); // Skip the colon. } else { name = modifier; - CBS_init(&modifier, NULL, 0); + CBS_init(&modifier, nullptr, 0); } if (cbs_str_equal(&name, "FORMAT") || cbs_str_equal(&name, "FORM")) { @@ -251,7 +251,7 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, const char *colon = strchr(str, ':'); CBS name; const char *value; - int has_value = colon != NULL; + int has_value = colon != nullptr; if (has_value) { CBS_init(&name, (const uint8_t *)str, colon - str); value = colon + 1; @@ -299,9 +299,9 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, {"SET", CBS_ASN1_SET}, }; CBS_ASN1_TAG type = 0; - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kTypes); i++) { - if (cbs_str_equal(&name, kTypes[i].name)) { - type = kTypes[i].type; + for (const auto &t : kTypes) { + if (cbs_str_equal(&name, t.name)) { + type = t.type; break; } } @@ -344,12 +344,12 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, OPENSSL_PUT_ERROR(ASN1, ASN1_R_INTEGER_NOT_ASCII_FORMAT); return 0; } - ASN1_INTEGER *obj = s2i_ASN1_INTEGER(NULL, value); - if (obj == NULL) { + ASN1_INTEGER *obj = s2i_ASN1_INTEGER(nullptr, value); + if (obj == nullptr) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_INTEGER); return 0; } - int len = i2c_ASN1_INTEGER(obj, NULL); + int len = i2c_ASN1_INTEGER(obj, nullptr); uint8_t *out; int ok = len > 0 && // CBB_add_space(&child, &out, len) && @@ -364,7 +364,7 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, return 0; } ASN1_OBJECT *obj = OBJ_txt2obj(value, /*dont_search_names=*/0); - if (obj == NULL || obj->length == 0) { + if (obj == nullptr || obj->length == 0) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OBJECT); return 0; } @@ -382,9 +382,9 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, CBS value_cbs; CBS_init(&value_cbs, (const uint8_t *)value, strlen(value)); int ok = type == CBS_ASN1_UTCTIME - ? CBS_parse_utc_time(&value_cbs, NULL, + ? CBS_parse_utc_time(&value_cbs, nullptr, /*allow_timezone_offset=*/0) - : CBS_parse_generalized_time(&value_cbs, NULL, + : CBS_parse_generalized_time(&value_cbs, nullptr, /*allow_timezone_offset=*/0); if (!ok) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_TIME_VALUE); @@ -414,7 +414,7 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, // as a loose cap so fuzzers can exit from excessively long inputs // earlier. This limit is not load-bearing because |ASN1_mbstring_ncopy|'s // output is already linear in the input. - ASN1_STRING *obj = NULL; + ASN1_STRING *obj = nullptr; if (ASN1_mbstring_ncopy(&obj, (const uint8_t *)value, -1, encoding, ASN1_tag2bit(type), /*minsize=*/0, /*maxsize=*/ASN1_GEN_MAX_OUTPUT) <= 0) { @@ -428,7 +428,7 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, case CBS_ASN1_BITSTRING: if (format == ASN1_GEN_FORMAT_BITLIST) { ASN1_BIT_STRING *obj = ASN1_BIT_STRING_new(); - if (obj == NULL) { + if (obj == nullptr) { return 0; } if (!CONF_parse_list(value, ',', 1, bitstr_cb, obj)) { @@ -436,7 +436,7 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, ASN1_BIT_STRING_free(obj); return 0; } - int len = i2c_ASN1_BIT_STRING(obj, NULL); + int len = i2c_ASN1_BIT_STRING(obj, nullptr); uint8_t *out; int ok = len > 0 && // CBB_add_space(&child, &out, len) && @@ -461,7 +461,7 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, if (format == ASN1_GEN_FORMAT_HEX) { size_t len; uint8_t *data = x509v3_hex_to_bytes(value, &len); - if (data == NULL) { + if (data == nullptr) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_HEX); return 0; } @@ -476,12 +476,12 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, case CBS_ASN1_SEQUENCE: case CBS_ASN1_SET: if (has_value) { - if (cnf == NULL) { + if (cnf == nullptr) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG); return 0; } const STACK_OF(CONF_VALUE) *section = X509V3_get_section(cnf, value); - if (section == NULL) { + if (section == nullptr) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG); return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/by_dir.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/by_dir.cc index a6df712670..584ecec11f 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/by_dir.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/by_dir.cc @@ -47,7 +47,7 @@ static int dir_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl, static int new_dir(X509_LOOKUP *lu); static void free_dir(X509_LOOKUP *lu); static int add_cert_dir(BY_DIR *ctx, const char *dir, int type); -static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name, +static int get_cert_by_subject(X509_LOOKUP *xl, int type, const X509_NAME *name, X509_OBJECT *ret); static const X509_LOOKUP_METHOD x509_dir_lookup = { new_dir, // new @@ -63,7 +63,7 @@ const X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void) { static int dir_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl, char **retp) { int ret = 0; - char *dir = NULL; + char *dir = nullptr; BY_DIR *ld = reinterpret_cast(ctx->method_data); @@ -91,10 +91,10 @@ static int dir_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl, static int new_dir(X509_LOOKUP *lu) { BY_DIR *a; - if ((a = (BY_DIR *)OPENSSL_malloc(sizeof(BY_DIR))) == NULL) { + if ((a = (BY_DIR *)OPENSSL_malloc(sizeof(BY_DIR))) == nullptr) { return 0; } - a->dirs = NULL; + a->dirs = nullptr; lu->method_data = a; return 1; } @@ -113,7 +113,7 @@ static int by_dir_hash_cmp(const BY_DIR_HASH *const *a, } static void by_dir_entry_free(BY_DIR_ENTRY *ent) { - if (ent != NULL) { + if (ent != nullptr) { CRYPTO_MUTEX_cleanup(&ent->lock); OPENSSL_free(ent->dir); sk_BY_DIR_HASH_pop_free(ent->hashes, by_dir_hash_free); @@ -123,7 +123,7 @@ static void by_dir_entry_free(BY_DIR_ENTRY *ent) { static void free_dir(X509_LOOKUP *lu) { BY_DIR *a = reinterpret_cast(lu->method_data); - if (a != NULL) { + if (a != nullptr) { sk_BY_DIR_ENTRY_pop_free(a->dirs, by_dir_entry_free); OPENSSL_free(a); } @@ -139,7 +139,7 @@ static int add_cert_dir(BY_DIR *ctx, const char *dir, int type) { size_t j, len; const char *s, *ss, *p; - if (dir == NULL || !*dir) { + if (dir == nullptr || !*dir) { OPENSSL_PUT_ERROR(X509, X509_R_INVALID_DIRECTORY); return 0; } @@ -164,7 +164,7 @@ static int add_cert_dir(BY_DIR *ctx, const char *dir, int type) { if (j < sk_BY_DIR_ENTRY_num(ctx->dirs)) { continue; } - if (ctx->dirs == NULL) { + if (ctx->dirs == nullptr) { ctx->dirs = sk_BY_DIR_ENTRY_new_null(); if (!ctx->dirs) { return 0; @@ -179,7 +179,7 @@ static int add_cert_dir(BY_DIR *ctx, const char *dir, int type) { ent->dir_type = type; ent->hashes = sk_BY_DIR_HASH_new(by_dir_hash_cmp); ent->dir = OPENSSL_strndup(ss, len); - if (ent->dir == NULL || ent->hashes == NULL || + if (ent->dir == nullptr || ent->hashes == nullptr || !sk_BY_DIR_ENTRY_push(ctx->dirs, ent)) { by_dir_entry_free(ent); return 0; @@ -189,7 +189,7 @@ static int add_cert_dir(BY_DIR *ctx, const char *dir, int type) { return 1; } -static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name, +static int get_cert_by_subject(X509_LOOKUP *xl, int type, const X509_NAME *name, X509_OBJECT *ret) { bssl::UniquePtr lookup_cert; bssl::UniquePtr lookup_crl; @@ -199,11 +199,11 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name, uint32_t h; uint32_t hash_array[2]; int hash_index; - char *b = NULL; + char *b = nullptr; X509_OBJECT stmp, *tmp; const char *postfix = ""; - if (name == NULL) { + if (name == nullptr) { return 0; } @@ -246,13 +246,13 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name, hent = sk_BY_DIR_HASH_value(ent->hashes, idx); k = hent->suffix; } else { - hent = NULL; + hent = nullptr; k = 0; } CRYPTO_MUTEX_unlock_read(&ent->lock); } else { k = 0; - hent = NULL; + hent = nullptr; } for (;;) { OPENSSL_free(b); @@ -283,7 +283,7 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name, // we have added it to the cache so now pull it out again CRYPTO_MUTEX_lock_write(&xl->store_ctx->objs_lock); - tmp = NULL; + tmp = nullptr; sk_X509_OBJECT_sort(xl->store_ctx->objs); if (sk_X509_OBJECT_find(xl->store_ctx->objs, &idx, &stmp)) { tmp = sk_X509_OBJECT_value(xl->store_ctx->objs, idx); @@ -306,7 +306,7 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name, if (!hent) { hent = reinterpret_cast( OPENSSL_malloc(sizeof(BY_DIR_HASH))); - if (hent == NULL) { + if (hent == nullptr) { CRYPTO_MUTEX_unlock_write(&ent->lock); ok = 0; goto finish; @@ -327,7 +327,7 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name, CRYPTO_MUTEX_unlock_write(&ent->lock); } - if (tmp != NULL) { + if (tmp != nullptr) { ok = 1; ret->type = tmp->type; OPENSSL_memcpy(&ret->data, &tmp->data, sizeof(ret->data)); @@ -348,5 +348,5 @@ finish: } int X509_LOOKUP_add_dir(X509_LOOKUP *lookup, const char *name, int type) { - return X509_LOOKUP_ctrl(lookup, X509_L_ADD_DIR, name, type, NULL); + return X509_LOOKUP_ctrl(lookup, X509_L_ADD_DIR, name, type, nullptr); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/by_file.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/by_file.cc index d9e0778e0e..c3b4d09bd4 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/by_file.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/by_file.cc @@ -23,10 +23,10 @@ static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, long argl, char **ret); static const X509_LOOKUP_METHOD x509_file_lookup = { - NULL, // new - NULL, // free + nullptr, // new + nullptr, // free by_file_ctrl, // ctrl - NULL, // get_by_subject + nullptr, // get_by_subject }; const X509_LOOKUP_METHOD *X509_LOOKUP_file(void) { return &x509_file_lookup; } @@ -39,7 +39,7 @@ static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl, const char *file = argp; int type = argl; if (argl == X509_FILETYPE_DEFAULT) { - if ((file = getenv(X509_get_default_cert_file_env())) == NULL) { + if ((file = getenv(X509_get_default_cert_file_env())) == nullptr) { file = X509_get_default_cert_file(); } type = X509_FILETYPE_PEM; @@ -55,24 +55,24 @@ static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl, int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type) { int ret = 0; - BIO *in = NULL; + BIO *in = nullptr; int i, count = 0; - X509 *x = NULL; + X509 *x = nullptr; in = BIO_new(BIO_s_file()); - if ((in == NULL) || (BIO_read_filename(in, file) <= 0)) { + if ((in == nullptr) || (BIO_read_filename(in, file) <= 0)) { OPENSSL_PUT_ERROR(X509, ERR_R_SYS_LIB); goto err; } if (type == X509_FILETYPE_PEM) { for (;;) { - x = PEM_read_bio_X509_AUX(in, NULL, NULL, NULL); - if (x == NULL) { - uint32_t error = ERR_peek_last_error(); - if (ERR_GET_LIB(error) == ERR_LIB_PEM && - ERR_GET_REASON(error) == PEM_R_NO_START_LINE && count > 0) { + x = PEM_read_bio_X509_AUX(in, nullptr, nullptr, nullptr); + if (x == nullptr) { + if (ERR_equals(ERR_peek_last_error(), ERR_LIB_PEM, + PEM_R_NO_START_LINE) && + count > 0) { ERR_clear_error(); break; } @@ -85,12 +85,12 @@ int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type) { } count++; X509_free(x); - x = NULL; + x = nullptr; } ret = count; } else if (type == X509_FILETYPE_ASN1) { - x = d2i_X509_bio(in, NULL); - if (x == NULL) { + x = d2i_X509_bio(in, nullptr); + if (x == nullptr) { OPENSSL_PUT_ERROR(X509, ERR_R_ASN1_LIB); goto err; } @@ -116,24 +116,24 @@ err: int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type) { int ret = 0; - BIO *in = NULL; + BIO *in = nullptr; int i, count = 0; - X509_CRL *x = NULL; + X509_CRL *x = nullptr; in = BIO_new(BIO_s_file()); - if ((in == NULL) || (BIO_read_filename(in, file) <= 0)) { + if ((in == nullptr) || (BIO_read_filename(in, file) <= 0)) { OPENSSL_PUT_ERROR(X509, ERR_R_SYS_LIB); goto err; } if (type == X509_FILETYPE_PEM) { for (;;) { - x = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL); - if (x == NULL) { - uint32_t error = ERR_peek_last_error(); - if (ERR_GET_LIB(error) == ERR_LIB_PEM && - ERR_GET_REASON(error) == PEM_R_NO_START_LINE && count > 0) { + x = PEM_read_bio_X509_CRL(in, nullptr, nullptr, nullptr); + if (x == nullptr) { + if (ERR_equals(ERR_peek_last_error(), ERR_LIB_PEM, + PEM_R_NO_START_LINE) && + count > 0) { ERR_clear_error(); break; } @@ -146,12 +146,12 @@ int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type) { } count++; X509_CRL_free(x); - x = NULL; + x = nullptr; } ret = count; } else if (type == X509_FILETYPE_ASN1) { - x = d2i_X509_CRL_bio(in, NULL); - if (x == NULL) { + x = d2i_X509_CRL_bio(in, nullptr); + if (x == nullptr) { OPENSSL_PUT_ERROR(X509, ERR_R_ASN1_LIB); goto err; } @@ -190,7 +190,7 @@ int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type) { OPENSSL_PUT_ERROR(X509, ERR_R_SYS_LIB); return 0; } - inf = PEM_X509_INFO_read_bio(in, NULL, NULL, NULL); + inf = PEM_X509_INFO_read_bio(in, nullptr, nullptr, nullptr); BIO_free(in); if (!inf) { OPENSSL_PUT_ERROR(X509, ERR_R_PEM_LIB); @@ -222,5 +222,5 @@ err: } int X509_LOOKUP_load_file(X509_LOOKUP *lookup, const char *name, int type) { - return X509_LOOKUP_ctrl(lookup, X509_L_FILE_LOAD, name, type, NULL); + return X509_LOOKUP_ctrl(lookup, X509_L_FILE_LOAD, name, type, nullptr); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/internal.h b/naiveproxy/src/third_party/boringssl/src/crypto/x509/internal.h index 345b44c21e..4310089a1e 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/internal.h @@ -17,6 +17,7 @@ #include #include +#include #include #include "../asn1/internal.h" @@ -29,26 +30,29 @@ extern "C" { // Internal structures. -typedef struct X509_val_st { - ASN1_TIME *notBefore; - ASN1_TIME *notAfter; -} X509_VAL; - -DECLARE_ASN1_FUNCTIONS_const(X509_VAL) - struct X509_pubkey_st { - X509_ALGOR *algor; - ASN1_BIT_STRING *public_key; + X509_ALGOR algor; + ASN1_BIT_STRING public_key; EVP_PKEY *pkey; } /* X509_PUBKEY */; +void x509_pubkey_init(X509_PUBKEY *key); +void x509_pubkey_cleanup(X509_PUBKEY *key); + +int x509_parse_public_key(CBS *cbs, X509_PUBKEY *out, + bssl::Span algs); +int x509_marshal_public_key(CBB *cbb, const X509_PUBKEY *in); +int x509_pubkey_set1(X509_PUBKEY *key, EVP_PKEY *pkey); + // X509_PUBKEY is an |ASN1_ITEM| whose ASN.1 type is SubjectPublicKeyInfo and C // type is |X509_PUBKEY*|. +// TODO(crbug.com/42290417): Remove this when |X509| and |X509_REQ| no longer +// depend on the tables. DECLARE_ASN1_ITEM(X509_PUBKEY) struct X509_name_entry_st { ASN1_OBJECT *object; - ASN1_STRING *value; + ASN1_STRING value; int set; } /* X509_NAME_ENTRY */; @@ -56,13 +60,19 @@ struct X509_name_entry_st { // (RFC 5280) and C type is |X509_NAME_ENTRY*|. DECLARE_ASN1_ITEM(X509_NAME_ENTRY) -// we always keep X509_NAMEs in 2 forms. +struct X509_NAME_CACHE { + // canon contains the DER-encoded canonicalized X.509 Name, not including the + // outermost TLV. + uint8_t *canon; + size_t canon_len; + // der contains the DER-encoded X.509 Name, including the outermost TLV. + uint8_t *der; + size_t der_len; +}; + struct X509_name_st { STACK_OF(X509_NAME_ENTRY) *entries; - int modified; // true if 'bytes' needs to be built - BUF_MEM *bytes; - unsigned char *canon_enc; - int canon_enclen; + mutable bssl::Atomic cache; } /* X509_NAME */; struct x509_attributes_st { @@ -97,28 +107,27 @@ DECLARE_ASN1_ITEM(X509_EXTENSION) // (RFC 5280) and C type is |STACK_OF(X509_EXTENSION)*|. DECLARE_ASN1_ITEM(X509_EXTENSIONS) -typedef struct { - ASN1_INTEGER *version; // [ 0 ] default of v1 - ASN1_INTEGER *serialNumber; - X509_ALGOR *signature; - X509_NAME *issuer; - X509_VAL *validity; - X509_NAME *subject; - X509_PUBKEY *key; +struct x509_st { + // TBSCertificate fields: + uint8_t version; // One of the |X509_VERSION_*| constants. + ASN1_INTEGER serialNumber; + X509_ALGOR tbs_sig_alg; + X509_NAME issuer; + ASN1_TIME notBefore; + ASN1_TIME notAfter; + X509_NAME subject; + X509_PUBKEY key; ASN1_BIT_STRING *issuerUID; // [ 1 ] optional in v2 ASN1_BIT_STRING *subjectUID; // [ 2 ] optional in v2 STACK_OF(X509_EXTENSION) *extensions; // [ 3 ] optional in v3 - ASN1_ENCODING enc; -} X509_CINF; - -// TODO(https://crbug.com/boringssl/407): This is not const because it contains -// an |X509_NAME|. -DECLARE_ASN1_FUNCTIONS(X509_CINF) - -struct x509_st { - X509_CINF *cert_info; - X509_ALGOR *sig_alg; - ASN1_BIT_STRING *signature; + // Certificate fields: + X509_ALGOR sig_alg; + ASN1_BIT_STRING signature; + // Other state: + // buf, if not nullptr, contains a copy of the serialized Certificate. + // TODO(davidben): Now every parsed |X509| has an underlying |CRYPTO_BUFFER|, + // but |X509|s created peacemeal do not. Can we make this more uniform? + CRYPTO_BUFFER *buf; CRYPTO_refcount_t references; CRYPTO_EX_DATA ex_data; // These contain copies of various extension values @@ -136,6 +145,8 @@ struct x509_st { CRYPTO_MUTEX lock; } /* X509 */; +int x509_marshal_tbs_cert(CBB *cbb, const X509 *x509); + // X509 is an |ASN1_ITEM| whose ASN.1 type is X.509 Certificate (RFC 5280) and C // type is |X509*|. DECLARE_ASN1_ITEM(X509) @@ -149,9 +160,7 @@ typedef struct { STACK_OF(X509_ATTRIBUTE) *attributes; // [ 0 ] } X509_REQ_INFO; -// TODO(https://crbug.com/boringssl/407): This is not const because it contains -// an |X509_NAME|. -DECLARE_ASN1_FUNCTIONS(X509_REQ_INFO) +DECLARE_ASN1_FUNCTIONS_const(X509_REQ_INFO) struct X509_req_st { X509_REQ_INFO *req_info; @@ -187,9 +196,7 @@ typedef struct { ASN1_ENCODING enc; } X509_CRL_INFO; -// TODO(https://crbug.com/boringssl/407): This is not const because it contains -// an |X509_NAME|. -DECLARE_ASN1_FUNCTIONS(X509_CRL_INFO) +DECLARE_ASN1_FUNCTIONS_const(X509_CRL_INFO) // Values in idp_flags field // IDP present @@ -276,7 +283,7 @@ struct x509_lookup_method_st { void (*free)(X509_LOOKUP *ctx); int (*ctrl)(X509_LOOKUP *ctx, int cmd, const char *argc, long argl, char **ret); - int (*get_by_subject)(X509_LOOKUP *ctx, int type, X509_NAME *name, + int (*get_by_subject)(X509_LOOKUP *ctx, int type, const X509_NAME *name, X509_OBJECT *ret); } /* X509_LOOKUP_METHOD */; @@ -385,6 +392,17 @@ int x509_digest_sign_algorithm(EVP_MD_CTX *ctx, X509_ALGOR *algor); int x509_digest_verify_init(EVP_MD_CTX *ctx, const X509_ALGOR *sigalg, EVP_PKEY *pkey); +// x509_verify_signature verifies a |signature| using |sigalg| and |pkey| over +// |in|. It returns one if the signature is valid and zero on error. +int x509_verify_signature(const X509_ALGOR *sigalg, + const ASN1_BIT_STRING *signature, + bssl::Span in, EVP_PKEY *pkey); + +// x509_sign_to_bit_string signs |in| using |ctx| and saves the result in |out|. +// It returns the length of the signature on success and zero on error. +int x509_sign_to_bit_string(EVP_MD_CTX *ctx, ASN1_BIT_STRING *out, + bssl::Span in); + // Path-building functions. @@ -406,7 +424,8 @@ int X509_policy_check(const STACK_OF(X509) *certs, // TODO(davidben): Reduce the scope of the verify callback and remove this. The // callback only runs with |X509_V_FLAG_CB_ISSUER_CHECK|, which is only used by // one internal project and rust-openssl, who use it by mistake. -int x509_check_issued_with_callback(X509_STORE_CTX *ctx, X509 *x, X509 *issuer); +int x509_check_issued_with_callback(X509_STORE_CTX *ctx, const X509 *x, + const X509 *issuer); // x509v3_bytes_to_hex encodes |len| bytes from |in| to hex and returns a // newly-allocated NUL-terminated string containing the result, or NULL on @@ -536,9 +555,7 @@ GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const STACK_OF(CONF_VALUE) *nval); -// TODO(https://crbug.com/boringssl/407): Make |issuer| const once the -// |X509_NAME| issue is resolved. -int X509_check_akid(X509 *issuer, const AUTHORITY_KEYID *akid); +int X509_check_akid(const X509 *issuer, const AUTHORITY_KEYID *akid); int X509_is_valid_trust_id(int trust); @@ -547,13 +564,28 @@ int X509_PURPOSE_get_trust(const X509_PURPOSE *xp); // TODO(https://crbug.com/boringssl/695): Remove this. int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn, X509_NAME *iname); +void x509_name_init(X509_NAME *name); +void x509_name_cleanup(X509_NAME *name); + +// x509_parse_name parses a DER-encoded, X.509 Name from |cbs| and writes the +// result to |*out|. It returns one on success and zero on error. +int x509_parse_name(CBS *cbs, X509_NAME *out); + // x509_marshal_name marshals |in| as a DER-encoded, X.509 Name and writes the // result to |out|. It returns one on success and zero on error. -// -// TODO(https://crbug.com/boringssl/407): This function should be const and -// thread-safe but is currently neither in some cases, notably if |in| was -// mutated. -int x509_marshal_name(CBB *out, X509_NAME *in); +int x509_marshal_name(CBB *out, const X509_NAME *in); + +const X509_NAME_CACHE *x509_name_get_cache(const X509_NAME *name); +void x509_name_invalidate_cache(X509_NAME *name); + +int x509_name_copy(X509_NAME *dst, const X509_NAME *src); + +void x509_algor_init(X509_ALGOR *alg); +void x509_algor_cleanup(X509_ALGOR *alg); + +// x509_parse_algorithm parses a DER-encoded, AlgorithmIdentifier from |cbs| and +// writes the result to |*out|. It returns one on success and zero on error. +int x509_parse_algorithm(CBS *cbs, X509_ALGOR *out); // x509_marshal_algorithm marshals |in| as a DER-encoded, AlgorithmIdentifier // and writes the result to |out|. It returns one on success and zero on error. diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/name_print.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/name_print.cc index 3e41ba80f7..20a30cb7b6 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/name_print.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/name_print.cc @@ -25,7 +25,7 @@ static int maybe_write(BIO *out, const void *buf, int len) { // If |out| is NULL, ignore the output but report the length. - return out == NULL || BIO_write(out, buf, len) == len; + return out == nullptr || BIO_write(out, buf, len) == len; } // do_indent prints |indent| spaces to |out|. @@ -170,12 +170,12 @@ int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent, int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm, int indent, unsigned long flags) { - BIO *bio = NULL; - if (fp != NULL) { + BIO *bio = nullptr; + if (fp != nullptr) { // If |fp| is NULL, this function returns the number of bytes without // writing. bio = BIO_new_fp(fp, BIO_NOCLOSE); - if (bio == NULL) { + if (bio == nullptr) { return -1; } } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/policy.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/policy.cc index 453576a903..deb8cf721f 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/policy.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/policy.cc @@ -24,24 +24,18 @@ #include "internal.h" -// This file computes the X.509 policy tree, as described in RFC 5280, section -// 6.1. It differs in that: +// This file computes the X.509 policy graph, as described in RFC 9618. +// Implementation notes: // // (1) It does not track "qualifier_set". This is not needed as it is not // output by this implementation. // -// (2) It builds a directed acyclic graph, rather than a tree. When a given -// policy matches multiple parents, RFC 5280 makes a separate node for -// each parent. This representation condenses them into one node with -// multiple parents. Thus we refer to this structure as a "policy graph", -// rather than a "policy tree". -// -// (3) "expected_policy_set" is not tracked explicitly and built temporarily +// (2) "expected_policy_set" is not tracked explicitly and built temporarily // as part of building the graph. // -// (4) anyPolicy nodes are not tracked explicitly. +// (3) anyPolicy nodes are not tracked explicitly. // -// (5) Some pruning steps are deferred to when policies are evaluated, as a +// (4) Some pruning steps are deferred to when policies are evaluated, as a // reachability pass. // An X509_POLICY_NODE is a node in the policy graph. It corresponds to a node @@ -96,7 +90,7 @@ static int is_any_policy(const ASN1_OBJECT *obj) { } static void x509_policy_node_free(X509_POLICY_NODE *node) { - if (node != NULL) { + if (node != nullptr) { ASN1_OBJECT_free(node->policy); sk_ASN1_OBJECT_pop_free(node->parent_policies, ASN1_OBJECT_free); OPENSSL_free(node); @@ -107,14 +101,14 @@ static X509_POLICY_NODE *x509_policy_node_new(const ASN1_OBJECT *policy) { assert(!is_any_policy(policy)); X509_POLICY_NODE *node = reinterpret_cast( OPENSSL_zalloc(sizeof(X509_POLICY_NODE))); - if (node == NULL) { - return NULL; + if (node == nullptr) { + return nullptr; } node->policy = OBJ_dup(policy); node->parent_policies = sk_ASN1_OBJECT_new_null(); - if (node->policy == NULL || node->parent_policies == NULL) { + if (node->policy == nullptr || node->parent_policies == nullptr) { x509_policy_node_free(node); - return NULL; + return nullptr; } return node; } @@ -125,7 +119,7 @@ static int x509_policy_node_cmp(const X509_POLICY_NODE *const *a, } static void x509_policy_level_free(X509_POLICY_LEVEL *level) { - if (level != NULL) { + if (level != nullptr) { sk_X509_POLICY_NODE_pop_free(level->nodes, x509_policy_node_free); OPENSSL_free(level); } @@ -134,13 +128,13 @@ static void x509_policy_level_free(X509_POLICY_LEVEL *level) { static X509_POLICY_LEVEL *x509_policy_level_new(void) { X509_POLICY_LEVEL *level = reinterpret_cast( OPENSSL_zalloc(sizeof(X509_POLICY_LEVEL))); - if (level == NULL) { - return NULL; + if (level == nullptr) { + return nullptr; } level->nodes = sk_X509_POLICY_NODE_new(x509_policy_node_cmp); - if (level->nodes == NULL) { + if (level->nodes == nullptr) { x509_policy_level_free(level); - return NULL; + return nullptr; } return level; } @@ -166,7 +160,7 @@ static X509_POLICY_NODE *x509_policy_level_find(X509_POLICY_LEVEL *level, node.policy = (ASN1_OBJECT *)policy; size_t idx; if (!sk_X509_POLICY_NODE_find(level->nodes, &idx, &node)) { - return NULL; + return nullptr; } return sk_X509_POLICY_NODE_value(level->nodes, idx); } @@ -185,7 +179,7 @@ static int x509_policy_level_add_nodes(X509_POLICY_LEVEL *level, if (!sk_X509_POLICY_NODE_push(level->nodes, node)) { return 0; } - sk_X509_POLICY_NODE_set(nodes, i, NULL); + sk_X509_POLICY_NODE_set(nodes, i, nullptr); } sk_X509_POLICY_NODE_sort(level->nodes); @@ -210,7 +204,7 @@ static int delete_if_not_in_policies(X509_POLICY_NODE *node, void *data) { assert(sk_POLICYINFO_is_sorted(policies)); POLICYINFO info; info.policyid = node->policy; - if (sk_POLICYINFO_find(policies, NULL, &info)) { + if (sk_POLICYINFO_find(policies, nullptr, &info)) { return 0; } x509_policy_node_free(node); @@ -229,12 +223,12 @@ static int process_certificate_policies(const X509 *x509, int any_policy_allowed) { int ret = 0; int critical; - STACK_OF(X509_POLICY_NODE) *new_nodes = NULL; + STACK_OF(X509_POLICY_NODE) *new_nodes = nullptr; CERTIFICATEPOLICIES *policies = reinterpret_cast( - X509_get_ext_d2i(x509, NID_certificate_policies, &critical, NULL)); + X509_get_ext_d2i(x509, NID_certificate_policies, &critical, nullptr)); { - if (policies == NULL) { + if (policies == nullptr) { if (critical != -1) { return 0; // Syntax error in the extension. } @@ -268,7 +262,7 @@ static int process_certificate_policies(const X509 *x509, } // This does the same thing as RFC 5280, section 6.1.3, step (d), though in - // a slighty different order. |level| currently contains + // a slightly different order. |level| currently contains // "expected_policy_set" values of the previous level. See // |process_policy_mappings| for details. const int previous_level_has_any_policy = level->has_any_policy; @@ -286,7 +280,7 @@ static int process_certificate_policies(const X509 *x509, // node. if (previous_level_has_any_policy) { new_nodes = sk_X509_POLICY_NODE_new_null(); - if (new_nodes == NULL) { + if (new_nodes == nullptr) { goto err; } for (size_t i = 0; i < sk_POLICYINFO_num(policies); i++) { @@ -294,9 +288,9 @@ static int process_certificate_policies(const X509 *x509, // Though we've reordered the steps slightly, |policy| is in |level| if // and only if it would have been a match in step (d.1.ii). if (!is_any_policy(policy->policyid) && - x509_policy_level_find(level, policy->policyid) == NULL) { + x509_policy_level_find(level, policy->policyid) == nullptr) { X509_POLICY_NODE *node = x509_policy_node_new(policy->policyid); - if (node == NULL || // + if (node == nullptr || // !sk_X509_POLICY_NODE_push(new_nodes, node)) { x509_policy_node_free(node); goto err; @@ -333,7 +327,7 @@ static int delete_if_mapped(X509_POLICY_NODE *node, void *data) { assert(sk_POLICY_MAPPING_is_sorted(mappings)); POLICY_MAPPING mapping; mapping.issuerDomainPolicy = node->policy; - if (!sk_POLICY_MAPPING_find(mappings, /*out_index=*/NULL, &mapping)) { + if (!sk_POLICY_MAPPING_find(mappings, /*out_index=*/nullptr, &mapping)) { return 0; } x509_policy_node_free(node); @@ -354,25 +348,25 @@ static int delete_if_mapped(X509_POLICY_NODE *node, void *data) { // with P1 in |parent_policies|. // // This is equivalent to the |X509_POLICY_LEVEL| that would result if the next -// certificats contained anyPolicy. |process_certificate_policies| will filter +// certificates contained anyPolicy. |process_certificate_policies| will filter // this result down to compute the actual level. static X509_POLICY_LEVEL *process_policy_mappings(const X509 *cert, X509_POLICY_LEVEL *level, int mapping_allowed) { int ok = 0; - STACK_OF(X509_POLICY_NODE) *new_nodes = NULL; - X509_POLICY_LEVEL *next = NULL; + STACK_OF(X509_POLICY_NODE) *new_nodes = nullptr; + X509_POLICY_LEVEL *next = nullptr; int critical; POLICY_MAPPINGS *mappings = reinterpret_cast( - X509_get_ext_d2i(cert, NID_policy_mappings, &critical, NULL)); + X509_get_ext_d2i(cert, NID_policy_mappings, &critical, nullptr)); { - if (mappings == NULL && critical != -1) { + if (mappings == nullptr && critical != -1) { // Syntax error in the policy mappings extension. goto err; } - if (mappings != NULL) { + if (mappings != nullptr) { // PolicyMappings may not be empty. See RFC 5280, section 4.2.1.5. // TODO(https://crbug.com/boringssl/443): Move this check into the parser. if (sk_POLICY_MAPPING_num(mappings) == 0) { @@ -397,14 +391,14 @@ static X509_POLICY_LEVEL *process_policy_mappings(const X509 *cert, // Mark nodes as mapped, and add any nodes to |level| which may be // needed as part of RFC 5280, section 6.1.4, step (b.1). new_nodes = sk_X509_POLICY_NODE_new_null(); - if (new_nodes == NULL) { + if (new_nodes == nullptr) { goto err; } - const ASN1_OBJECT *last_policy = NULL; + const ASN1_OBJECT *last_policy = nullptr; for (size_t i = 0; i < sk_POLICY_MAPPING_num(mappings); i++) { const POLICY_MAPPING *mapping = sk_POLICY_MAPPING_value(mappings, i); // There may be multiple mappings with the same |issuerDomainPolicy|. - if (last_policy != NULL && + if (last_policy != nullptr && OBJ_cmp(mapping->issuerDomainPolicy, last_policy) == 0) { continue; } @@ -412,12 +406,12 @@ static X509_POLICY_LEVEL *process_policy_mappings(const X509 *cert, X509_POLICY_NODE *node = x509_policy_level_find(level, mapping->issuerDomainPolicy); - if (node == NULL) { + if (node == nullptr) { if (!level->has_any_policy) { continue; } node = x509_policy_node_new(mapping->issuerDomainPolicy); - if (node == NULL || // + if (node == nullptr || // !sk_X509_POLICY_NODE_push(new_nodes, node)) { x509_policy_node_free(node); goto err; @@ -433,15 +427,15 @@ static X509_POLICY_LEVEL *process_policy_mappings(const X509 *cert, // all mapped nodes. sk_X509_POLICY_NODE_delete_if(level->nodes, delete_if_mapped, mappings); sk_POLICY_MAPPING_pop_free(mappings, POLICY_MAPPING_free); - mappings = NULL; + mappings = nullptr; } } // If a node was not mapped, it retains the original "explicit_policy_set" // value, itself. Add those to |mappings|. - if (mappings == NULL) { + if (mappings == nullptr) { mappings = sk_POLICY_MAPPING_new_null(); - if (mappings == NULL) { + if (mappings == nullptr) { goto err; } } @@ -449,13 +443,13 @@ static X509_POLICY_LEVEL *process_policy_mappings(const X509 *cert, X509_POLICY_NODE *node = sk_X509_POLICY_NODE_value(level->nodes, i); if (!node->mapped) { POLICY_MAPPING *mapping = POLICY_MAPPING_new(); - if (mapping == NULL) { + if (mapping == nullptr) { goto err; } mapping->issuerDomainPolicy = OBJ_dup(node->policy); mapping->subjectDomainPolicy = OBJ_dup(node->policy); - if (mapping->issuerDomainPolicy == NULL || - mapping->subjectDomainPolicy == NULL || + if (mapping->issuerDomainPolicy == nullptr || + mapping->subjectDomainPolicy == nullptr || !sk_POLICY_MAPPING_push(mappings, mapping)) { POLICY_MAPPING_free(mapping); goto err; @@ -469,24 +463,25 @@ static X509_POLICY_LEVEL *process_policy_mappings(const X509 *cert, // Convert |mappings| to our "expected_policy_set" representation. next = x509_policy_level_new(); - if (next == NULL) { + if (next == nullptr) { goto err; } next->has_any_policy = level->has_any_policy; - X509_POLICY_NODE *last_node = NULL; + X509_POLICY_NODE *last_node = nullptr; for (size_t i = 0; i < sk_POLICY_MAPPING_num(mappings); i++) { POLICY_MAPPING *mapping = sk_POLICY_MAPPING_value(mappings, i); // Skip mappings where |issuerDomainPolicy| does not appear in the graph. if (!level->has_any_policy && - x509_policy_level_find(level, mapping->issuerDomainPolicy) == NULL) { + x509_policy_level_find(level, mapping->issuerDomainPolicy) == + nullptr) { continue; } - if (last_node == NULL || + if (last_node == nullptr || OBJ_cmp(last_node->policy, mapping->subjectDomainPolicy) != 0) { last_node = x509_policy_node_new(mapping->subjectDomainPolicy); - if (last_node == NULL || + if (last_node == nullptr || !sk_X509_POLICY_NODE_push(next->nodes, last_node)) { x509_policy_node_free(last_node); goto err; @@ -497,7 +492,7 @@ static X509_POLICY_LEVEL *process_policy_mappings(const X509 *cert, mapping->issuerDomainPolicy)) { goto err; } - mapping->issuerDomainPolicy = NULL; + mapping->issuerDomainPolicy = nullptr; } sk_X509_POLICY_NODE_sort(next->nodes); @@ -507,7 +502,7 @@ static X509_POLICY_LEVEL *process_policy_mappings(const X509 *cert, err: if (!ok) { x509_policy_level_free(next); - next = NULL; + next = nullptr; } sk_POLICY_MAPPING_pop_free(mappings, POLICY_MAPPING_free); @@ -519,7 +514,7 @@ err: // of its current value and |skip_certs|. It returns one on success and zero if // |skip_certs| is negative. static int apply_skip_certs(const ASN1_INTEGER *skip_certs, size_t *value) { - if (skip_certs == NULL) { + if (skip_certs == nullptr) { return 1; } @@ -547,13 +542,13 @@ static int process_policy_constraints(const X509 *x509, size_t *explicit_policy, size_t *inhibit_any_policy) { int critical; POLICY_CONSTRAINTS *constraints = reinterpret_cast( - X509_get_ext_d2i(x509, NID_policy_constraints, &critical, NULL)); - if (constraints == NULL && critical != -1) { + X509_get_ext_d2i(x509, NID_policy_constraints, &critical, nullptr)); + if (constraints == nullptr && critical != -1) { return 0; } - if (constraints != NULL) { - if (constraints->requireExplicitPolicy == NULL && - constraints->inhibitPolicyMapping == NULL) { + if (constraints != nullptr) { + if (constraints->requireExplicitPolicy == nullptr && + constraints->inhibitPolicyMapping == nullptr) { // Per RFC 5280, section 4.2.1.11, at least one of the fields must be // present. OPENSSL_PUT_ERROR(X509, X509_R_INVALID_POLICY_EXTENSION); @@ -570,8 +565,8 @@ static int process_policy_constraints(const X509 *x509, size_t *explicit_policy, } ASN1_INTEGER *inhibit_any_policy_ext = reinterpret_cast( - X509_get_ext_d2i(x509, NID_inhibit_any_policy, &critical, NULL)); - if (inhibit_any_policy_ext == NULL && critical != -1) { + X509_get_ext_d2i(x509, NID_inhibit_any_policy, &critical, nullptr)); + if (inhibit_any_policy_ext == nullptr && critical != -1) { return 0; } int ok = apply_skip_certs(inhibit_any_policy_ext, inhibit_any_policy); @@ -586,7 +581,7 @@ static int process_policy_constraints(const X509 *x509, size_t *explicit_policy, // evaluation. static int has_explicit_policy(STACK_OF(X509_POLICY_LEVEL) *levels, const STACK_OF(ASN1_OBJECT) *user_policies) { - assert(user_policies == NULL || sk_ASN1_OBJECT_is_sorted(user_policies)); + assert(user_policies == nullptr || sk_ASN1_OBJECT_is_sorted(user_policies)); // Step (g.i). If the policy graph is empty, the intersection is empty. size_t num_levels = sk_X509_POLICY_LEVEL_num(levels); @@ -637,7 +632,7 @@ static int has_explicit_policy(STACK_OF(X509_POLICY_LEVEL) *levels, // |node|'s parent is anyPolicy and is part of "valid_policy_node_set". // If it exists in |user_policies|, the intersection is non-empty and we // can return immediately. - if (sk_ASN1_OBJECT_find(user_policies, /*out_index=*/NULL, + if (sk_ASN1_OBJECT_find(user_policies, /*out_index=*/nullptr, node->policy)) { return 1; } @@ -648,7 +643,7 @@ static int has_explicit_policy(STACK_OF(X509_POLICY_LEVEL) *levels, for (size_t k = 0; k < sk_ASN1_OBJECT_num(node->parent_policies); k++) { X509_POLICY_NODE *parent = x509_policy_level_find( prev, sk_ASN1_OBJECT_value(node->parent_policies, k)); - if (parent != NULL) { + if (parent != nullptr) { parent->reachable = 1; } } @@ -667,11 +662,11 @@ static int asn1_object_cmp(const ASN1_OBJECT *const *a, int X509_policy_check(const STACK_OF(X509) *certs, const STACK_OF(ASN1_OBJECT) *user_policies, unsigned long flags, X509 **out_current_cert) { - *out_current_cert = NULL; + *out_current_cert = nullptr; int ret = X509_V_ERR_OUT_OF_MEM; - X509_POLICY_LEVEL *level = NULL; - STACK_OF(X509_POLICY_LEVEL) *levels = NULL; - STACK_OF(ASN1_OBJECT) *user_policies_sorted = NULL; + X509_POLICY_LEVEL *level = nullptr; + STACK_OF(X509_POLICY_LEVEL) *levels = nullptr; + STACK_OF(ASN1_OBJECT) *user_policies_sorted = nullptr; size_t num_certs = sk_X509_num(certs); // Skip policy checking if the chain is just the trust anchor. @@ -687,7 +682,7 @@ int X509_policy_check(const STACK_OF(X509) *certs, size_t policy_mapping = (flags & X509_V_FLAG_INHIBIT_MAP) ? 0 : num_certs + 1; levels = sk_X509_POLICY_LEVEL_new_null(); - if (levels == NULL) { + if (levels == nullptr) { goto err; } @@ -698,10 +693,10 @@ int X509_policy_check(const STACK_OF(X509) *certs, } const int is_self_issued = (cert->ex_flags & EXFLAG_SI) != 0; - if (level == NULL) { + if (level == nullptr) { assert(i == num_certs - 2); level = x509_policy_level_new(); - if (level == NULL) { + if (level == nullptr) { goto err; } level->has_any_policy = 1; @@ -728,14 +723,14 @@ int X509_policy_check(const STACK_OF(X509) *certs, goto err; } X509_POLICY_LEVEL *current_level = level; - level = NULL; + level = nullptr; // If this is not the leaf certificate, we go to section 6.1.4. If it // is the leaf certificate, we go to section 6.1.5 instead. if (i != 0) { // RFC 5280, section 6.1.4, steps (a) and (b). level = process_policy_mappings(cert, current_level, policy_mapping > 0); - if (level == NULL) { + if (level == nullptr) { ret = X509_V_ERR_INVALID_POLICY_EXTENSION; *out_current_cert = cert; goto err; @@ -769,9 +764,9 @@ int X509_policy_check(const STACK_OF(X509) *certs, // is only necessary to check if the user-constrained-policy-set is not empty. if (explicit_policy == 0) { // Build a sorted copy of |user_policies| for more efficient lookup. - if (user_policies != NULL) { + if (user_policies != nullptr) { user_policies_sorted = sk_ASN1_OBJECT_dup(user_policies); - if (user_policies_sorted == NULL) { + if (user_policies_sorted == nullptr) { goto err; } sk_ASN1_OBJECT_set_cmp_func(user_policies_sorted, asn1_object_cmp); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/rsa_pss.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/rsa_pss.cc index 689f64d318..78398ce35b 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/rsa_pss.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/rsa_pss.cc @@ -19,11 +19,14 @@ #include #include +#include #include #include #include #include +#include +#include "../rsa/internal.h" #include "internal.h" @@ -46,111 +49,18 @@ ASN1_SEQUENCE_cb(RSA_PSS_PARAMS, rsa_pss_cb) = { IMPLEMENT_ASN1_FUNCTIONS_const(RSA_PSS_PARAMS) -// Given an MGF1 Algorithm ID decode to an Algorithm Identifier -static X509_ALGOR *rsa_mgf1_decode(const X509_ALGOR *alg) { - if (OBJ_obj2nid(alg->algorithm) != NID_mgf1 || alg->parameter == NULL || - alg->parameter->type != V_ASN1_SEQUENCE) { - return NULL; - } - - const uint8_t *p = alg->parameter->value.sequence->data; - int plen = alg->parameter->value.sequence->length; - return d2i_X509_ALGOR(NULL, &p, plen); -} - -static RSA_PSS_PARAMS *rsa_pss_decode(const X509_ALGOR *alg) { - if (alg->parameter == NULL || alg->parameter->type != V_ASN1_SEQUENCE) { - return NULL; - } - - const uint8_t *p = alg->parameter->value.sequence->data; - int plen = alg->parameter->value.sequence->length; - return d2i_RSA_PSS_PARAMS(NULL, &p, plen); -} - -static int is_allowed_pss_md(const EVP_MD *md) { - int md_type = EVP_MD_type(md); - return md_type == NID_sha256 || md_type == NID_sha384 || - md_type == NID_sha512; -} - -// rsa_md_to_algor sets |*palg| to an |X509_ALGOR| describing the digest |md|, -// which must be an allowed PSS digest. -static int rsa_md_to_algor(X509_ALGOR **palg, const EVP_MD *md) { - // SHA-1 should be omitted (DEFAULT), but we do not allow SHA-1. - assert(is_allowed_pss_md(md)); - *palg = X509_ALGOR_new(); - if (*palg == NULL) { +static int rsa_pss_decode(const X509_ALGOR *alg, rsa_pss_params_t *out) { + if (alg->parameter == nullptr || alg->parameter->type != V_ASN1_SEQUENCE) { return 0; } - if (!X509_ALGOR_set_md(*palg, md)) { - X509_ALGOR_free(*palg); - *palg = NULL; - return 0; - } - return 1; -} -// rsa_md_to_mgf1 sets |*palg| to an |X509_ALGOR| describing MGF-1 with the -// digest |mgf1md|, which must be an allowed PSS digest. -static int rsa_md_to_mgf1(X509_ALGOR **palg, const EVP_MD *mgf1md) { - // SHA-1 should be omitted (DEFAULT), but we do not allow SHA-1. - assert(is_allowed_pss_md(mgf1md)); - X509_ALGOR *algtmp = NULL; - ASN1_STRING *stmp = NULL; - // need to embed algorithm ID inside another - if (!rsa_md_to_algor(&algtmp, mgf1md) || - !ASN1_item_pack(algtmp, ASN1_ITEM_rptr(X509_ALGOR), &stmp)) { - goto err; - } - *palg = X509_ALGOR_new(); - if (!*palg) { - goto err; - } - if (!X509_ALGOR_set0(*palg, OBJ_nid2obj(NID_mgf1), V_ASN1_SEQUENCE, stmp)) { - goto err; - } - stmp = NULL; - -err: - ASN1_STRING_free(stmp); - X509_ALGOR_free(algtmp); - if (*palg) { - return 1; - } - - return 0; -} - -static const EVP_MD *rsa_algor_to_md(const X509_ALGOR *alg) { - if (!alg) { - // If omitted, PSS defaults to SHA-1, which we do not allow. - OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS); - return NULL; - } - const EVP_MD *md = EVP_get_digestbyobj(alg->algorithm); - if (md == NULL || !is_allowed_pss_md(md)) { - OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS); - return NULL; - } - return md; -} - -static const EVP_MD *rsa_mgf1_to_md(const X509_ALGOR *alg) { - if (!alg) { - // If omitted, PSS defaults to MGF-1 with SHA-1, which we do not allow. - OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS); - return NULL; - } - // Check mask and lookup mask hash algorithm. - X509_ALGOR *maskHash = rsa_mgf1_decode(alg); - if (maskHash == NULL) { - OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS); - return NULL; - } - const EVP_MD *ret = rsa_algor_to_md(maskHash); - X509_ALGOR_free(maskHash); - return ret; + // Although a syntax error in DER, we tolerate an explicitly-encoded trailer. + // See the certificates in cl/362617931. + CBS cbs; + CBS_init(&cbs, alg->parameter->value.sequence->data, + alg->parameter->value.sequence->length); + return rsa_parse_pss_params(&cbs, out, /*allow_explicit_trailer=*/true) && + CBS_len(&cbs) == 0; } int x509_rsa_ctx_to_pss(EVP_MD_CTX *ctx, X509_ALGOR *algor) { @@ -162,203 +72,115 @@ int x509_rsa_ctx_to_pss(EVP_MD_CTX *ctx, X509_ALGOR *algor) { return 0; } - if (sigmd != mgf1md || !is_allowed_pss_md(sigmd)) { + if (sigmd != mgf1md) { OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS); return 0; } int md_len = (int)EVP_MD_size(sigmd); - if (saltlen == RSA_PSS_SALTLEN_DIGEST) { - saltlen = md_len; - } else if (saltlen != md_len) { + if (saltlen != RSA_PSS_SALTLEN_DIGEST && saltlen != md_len) { OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS); return 0; } - int ret = 0; - ASN1_STRING *os = NULL; - RSA_PSS_PARAMS *pss = RSA_PSS_PARAMS_new(); - if (!pss) { - goto err; + rsa_pss_params_t params; + switch (EVP_MD_type(sigmd)) { + case NID_sha256: + params = rsa_pss_sha256; + break; + case NID_sha384: + params = rsa_pss_sha384; + break; + case NID_sha512: + params = rsa_pss_sha512; + break; + default: + OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS); + return 0; } - // The DEFAULT value is 20, but this does not match any supported digest. - assert(saltlen != 20); - pss->saltLength = ASN1_INTEGER_new(); - if (!pss->saltLength || // - !ASN1_INTEGER_set_int64(pss->saltLength, saltlen)) { - goto err; + // Encode |params| to an |ASN1_STRING|. + uint8_t buf[128]; // The largest param fits comfortably in 128 bytes. + CBB cbb; + CBB_init_fixed(&cbb, buf, sizeof(buf)); + if (!rsa_marshal_pss_params(&cbb, params)) { + return 0; } - - if (!rsa_md_to_algor(&pss->hashAlgorithm, sigmd) || - !rsa_md_to_mgf1(&pss->maskGenAlgorithm, mgf1md)) { - goto err; - } - - // Finally create string with pss parameter encoding. - if (!ASN1_item_pack(pss, ASN1_ITEM_rptr(RSA_PSS_PARAMS), &os)) { - goto err; + bssl::UniquePtr params_str( + ASN1_STRING_type_new(V_ASN1_SEQUENCE)); + if (params_str == nullptr || + !ASN1_STRING_set(params_str.get(), CBB_data(&cbb), CBB_len(&cbb))) { + return 0; } if (!X509_ALGOR_set0(algor, OBJ_nid2obj(NID_rsassaPss), V_ASN1_SEQUENCE, - os)) { - goto err; + params_str.get())) { + return 0; } - os = NULL; - ret = 1; - -err: - RSA_PSS_PARAMS_free(pss); - ASN1_STRING_free(os); - return ret; + params_str.release(); // |X509_ALGOR_set0| took ownership. + return 1; } int x509_rsa_pss_to_ctx(EVP_MD_CTX *ctx, const X509_ALGOR *sigalg, EVP_PKEY *pkey) { assert(OBJ_obj2nid(sigalg->algorithm) == NID_rsassaPss); - - // Decode PSS parameters - int ret = 0; - RSA_PSS_PARAMS *pss = rsa_pss_decode(sigalg); - - { - if (pss == NULL) { - OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS); - goto err; - } - - const EVP_MD *mgf1md = rsa_mgf1_to_md(pss->maskGenAlgorithm); - const EVP_MD *md = rsa_algor_to_md(pss->hashAlgorithm); - if (mgf1md == NULL || md == NULL) { - goto err; - } - - // We require the MGF-1 and signing hashes to match. - if (mgf1md != md) { - OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS); - goto err; - } - - // We require the salt length be the hash length. The DEFAULT value is 20, - // but this does not match any supported salt length. - uint64_t salt_len = 0; - if (pss->saltLength == NULL || - !ASN1_INTEGER_get_uint64(&salt_len, pss->saltLength) || - salt_len != EVP_MD_size(md)) { - OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS); - goto err; - } - assert(salt_len <= INT_MAX); - - // The trailer field must be 1 (0xbc). This value is DEFAULT, so the - // structure is required to omit it in DER. Although a syntax error, we also - // tolerate an explicitly-encoded value. See the certificates in - // cl/362617931. - if (pss->trailerField != NULL && ASN1_INTEGER_get(pss->trailerField) != 1) { - OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS); - goto err; - } - - EVP_PKEY_CTX *pctx; - if (!EVP_DigestVerifyInit(ctx, &pctx, md, NULL, pkey) || - !EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) || - !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, (int)salt_len) || - !EVP_PKEY_CTX_set_rsa_mgf1_md(pctx, mgf1md)) { - goto err; - } - - ret = 1; + rsa_pss_params_t params; + if (!rsa_pss_decode(sigalg, ¶ms)) { + OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS); + return 0; } -err: - RSA_PSS_PARAMS_free(pss); - return ret; + const EVP_MD *md = rsa_pss_params_get_md(params); + EVP_PKEY_CTX *pctx; + if (!EVP_DigestVerifyInit(ctx, &pctx, md, nullptr, pkey) || + !EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) || + !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, RSA_PSS_SALTLEN_DIGEST) || + !EVP_PKEY_CTX_set_rsa_mgf1_md(pctx, md)) { + return 0; + } + + return 1; } int x509_print_rsa_pss_params(BIO *bp, const X509_ALGOR *sigalg, int indent, ASN1_PCTX *pctx) { assert(OBJ_obj2nid(sigalg->algorithm) == NID_rsassaPss); + rsa_pss_params_t params; + if (!rsa_pss_decode(sigalg, ¶ms)) { + return BIO_puts(bp, " (INVALID PSS PARAMETERS)\n") <= 0; + } - int rv = 0; - X509_ALGOR *maskHash = NULL; - RSA_PSS_PARAMS *pss = rsa_pss_decode(sigalg); - if (!pss) { - if (BIO_puts(bp, " (INVALID PSS PARAMETERS)\n") <= 0) { - goto err; - } - rv = 1; - goto err; + const char *hash_str = nullptr; + uint32_t salt_len = 0; + switch (params) { + case rsa_pss_none: + // |rsa_pss_decode| will never return this. + OPENSSL_PUT_ERROR(X509, ERR_R_INTERNAL_ERROR); + return 0; + case rsa_pss_sha256: + hash_str = "sha256"; + salt_len = 32; + break; + case rsa_pss_sha384: + hash_str = "sha384"; + salt_len = 48; + break; + case rsa_pss_sha512: + hash_str = "sha512"; + salt_len = 64; + break; } if (BIO_puts(bp, "\n") <= 0 || // !BIO_indent(bp, indent, 128) || // - BIO_puts(bp, "Hash Algorithm: ") <= 0) { - goto err; - } - - if (pss->hashAlgorithm) { - if (i2a_ASN1_OBJECT(bp, pss->hashAlgorithm->algorithm) <= 0) { - goto err; - } - } else if (BIO_puts(bp, "sha1 (default)") <= 0) { - goto err; - } - - if (BIO_puts(bp, "\n") <= 0 || // + BIO_printf(bp, "Hash Algorithm: %s\n", hash_str) <= 0 || !BIO_indent(bp, indent, 128) || // - BIO_puts(bp, "Mask Algorithm: ") <= 0) { - goto err; + BIO_printf(bp, "Mask Algorithm: mgf1 with %s\n", hash_str) <= 0 || + !BIO_indent(bp, indent, 128) || // + BIO_printf(bp, "Salt Length: 0x%x\n", salt_len) <= 0 || + !BIO_indent(bp, indent, 128) || // + BIO_puts(bp, "Trailer Field: 0xBC (default)\n") <= 0) { + return 0; } - if (pss->maskGenAlgorithm) { - maskHash = rsa_mgf1_decode(pss->maskGenAlgorithm); - if (maskHash == NULL) { - if (BIO_puts(bp, "INVALID") <= 0) { - goto err; - } - } else { - if (i2a_ASN1_OBJECT(bp, pss->maskGenAlgorithm->algorithm) <= 0 || - BIO_puts(bp, " with ") <= 0 || - i2a_ASN1_OBJECT(bp, maskHash->algorithm) <= 0) { - goto err; - } - } - } else if (BIO_puts(bp, "mgf1 with sha1 (default)") <= 0) { - goto err; - } - BIO_puts(bp, "\n"); - - if (!BIO_indent(bp, indent, 128) || // - BIO_puts(bp, "Salt Length: 0x") <= 0) { - goto err; - } - - if (pss->saltLength) { - if (i2a_ASN1_INTEGER(bp, pss->saltLength) <= 0) { - goto err; - } - } else if (BIO_puts(bp, "14 (default)") <= 0) { - goto err; - } - BIO_puts(bp, "\n"); - - if (!BIO_indent(bp, indent, 128) || // - BIO_puts(bp, "Trailer Field: 0x") <= 0) { - goto err; - } - - if (pss->trailerField) { - if (i2a_ASN1_INTEGER(bp, pss->trailerField) <= 0) { - goto err; - } - } else if (BIO_puts(bp, "BC (default)") <= 0) { - goto err; - } - BIO_puts(bp, "\n"); - - rv = 1; - -err: - RSA_PSS_PARAMS_free(pss); - X509_ALGOR_free(maskHash); - return rv; + return 1; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/t_crl.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/t_crl.cc index aca2df0157..5ef99ab38a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/t_crl.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/t_crl.cc @@ -21,9 +21,9 @@ #include -int X509_CRL_print_fp(FILE *fp, X509_CRL *x) { +int X509_CRL_print_fp(FILE *fp, const X509_CRL *x) { BIO *b = BIO_new_fp(fp, BIO_NOCLOSE); - if (b == NULL) { + if (b == nullptr) { OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB); return 0; } @@ -32,7 +32,7 @@ int X509_CRL_print_fp(FILE *fp, X509_CRL *x) { return ret; } -int X509_CRL_print(BIO *out, X509_CRL *x) { +int X509_CRL_print(BIO *out, const X509_CRL *x) { long version = X509_CRL_get_version(x); assert(X509_CRL_VERSION_1 <= version && version <= X509_CRL_VERSION_2); const X509_ALGOR *sig_alg; @@ -44,12 +44,13 @@ int X509_CRL_print(BIO *out, X509_CRL *x) { // Note this and the other |X509_signature_print| call both print the // outer signature algorithm, rather than printing the inner and outer // ones separately. This matches OpenSSL, though it was probably a bug. - !X509_signature_print(out, sig_alg, NULL)) { + !X509_signature_print(out, sig_alg, nullptr)) { return 0; } - char *issuer = X509_NAME_oneline(X509_CRL_get_issuer(x), NULL, 0); - int ok = issuer != NULL && BIO_printf(out, "%8sIssuer: %s\n", "", issuer) > 0; + char *issuer = X509_NAME_oneline(X509_CRL_get_issuer(x), nullptr, 0); + int ok = + issuer != nullptr && BIO_printf(out, "%8sIssuer: %s\n", "", issuer) > 0; OPENSSL_free(issuer); if (!ok) { return 0; @@ -76,7 +77,9 @@ int X509_CRL_print(BIO *out, X509_CRL *x) { return 0; } - const STACK_OF(X509_REVOKED) *rev = X509_CRL_get_REVOKED(x); + // TODO(crbug.com/442860745): |X509_CRL_get_REVOKED| is not const-correct. + const STACK_OF(X509_REVOKED) *rev = + X509_CRL_get_REVOKED(const_cast(x)); if (sk_X509_REVOKED_num(rev) > 0) { if (BIO_printf(out, "Revoked Certificates:\n") <= 0) { return 0; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/t_req.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/t_req.cc index 2f557e532b..5374539c0c 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/t_req.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/t_req.cc @@ -24,9 +24,9 @@ #include "internal.h" -int X509_REQ_print_fp(FILE *fp, X509_REQ *x) { +int X509_REQ_print_fp(FILE *fp, const X509_REQ *x) { BIO *bio = BIO_new_fp(fp, BIO_NOCLOSE); - if (bio == NULL) { + if (bio == nullptr) { OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB); return 0; } @@ -35,7 +35,7 @@ int X509_REQ_print_fp(FILE *fp, X509_REQ *x) { return ret; } -int X509_REQ_print_ex(BIO *bio, X509_REQ *x, unsigned long nmflags, +int X509_REQ_print_ex(BIO *bio, const X509_REQ *x, unsigned long nmflags, unsigned long cflag) { long l; STACK_OF(X509_ATTRIBUTE) *sk; @@ -52,7 +52,7 @@ int X509_REQ_print_ex(BIO *bio, X509_REQ *x, unsigned long nmflags, nmindent = 16; } - X509_REQ_INFO *ri = x->req_info; + const X509_REQ_INFO *ri = x->req_info; if (!(cflag & X509_FLAG_NO_HEADER)) { if (BIO_write(bio, "Certificate Request:\n", 21) <= 0 || BIO_write(bio, " Data:\n", 10) <= 0) { @@ -79,17 +79,17 @@ int X509_REQ_print_ex(BIO *bio, X509_REQ *x, unsigned long nmflags, if (!(cflag & X509_FLAG_NO_PUBKEY)) { if (BIO_write(bio, " Subject Public Key Info:\n", 33) <= 0 || BIO_printf(bio, "%12sPublic Key Algorithm: ", "") <= 0 || - i2a_ASN1_OBJECT(bio, ri->pubkey->algor->algorithm) <= 0 || + i2a_ASN1_OBJECT(bio, ri->pubkey->algor.algorithm) <= 0 || BIO_puts(bio, "\n") <= 0) { goto err; } const EVP_PKEY *pkey = X509_REQ_get0_pubkey(x); - if (pkey == NULL) { + if (pkey == nullptr) { BIO_printf(bio, "%12sUnable to load Public Key\n", ""); ERR_print_errors(bio); } else { - EVP_PKEY_print_public(bio, pkey, 16, NULL); + EVP_PKEY_print_public(bio, pkey, 16, nullptr); } } @@ -106,8 +106,10 @@ int X509_REQ_print_ex(BIO *bio, X509_REQ *x, unsigned long nmflags, } else { size_t i; for (i = 0; i < sk_X509_ATTRIBUTE_num(sk); i++) { + // TODO(crbug.com/442860745): |X509_ATTRIBUTE| accessors are not + // const-correct. X509_ATTRIBUTE *a = sk_X509_ATTRIBUTE_value(sk, i); - ASN1_OBJECT *aobj = X509_ATTRIBUTE_get0_object(a); + const ASN1_OBJECT *aobj = X509_ATTRIBUTE_get0_object(a); if (X509_REQ_extension_nid(OBJ_obj2nid(aobj))) { continue; @@ -131,7 +133,7 @@ int X509_REQ_print_ex(BIO *bio, X509_REQ *x, unsigned long nmflags, for (j = 0; j < num_attrs; j++) { const ASN1_TYPE *at = X509_ATTRIBUTE_get0_type(a, j); const int type = at->type; - ASN1_BIT_STRING *bs = at->value.asn1_string; + const ASN1_BIT_STRING *bs = at->value.asn1_string; int k; for (k = 25 - obj_str_len; k > 0; k--) { @@ -146,7 +148,8 @@ int X509_REQ_print_ex(BIO *bio, X509_REQ *x, unsigned long nmflags, if (type == V_ASN1_PRINTABLESTRING || type == V_ASN1_UTF8STRING || type == V_ASN1_IA5STRING || type == V_ASN1_T61STRING) { - if (BIO_write(bio, (char *)bs->data, bs->length) != bs->length) { + if (BIO_write(bio, (const char *)bs->data, bs->length) != + bs->length) { goto err; } BIO_puts(bio, "\n"); @@ -198,6 +201,6 @@ err: return 0; } -int X509_REQ_print(BIO *bio, X509_REQ *req) { +int X509_REQ_print(BIO *bio, const X509_REQ *req) { return X509_REQ_print_ex(bio, req, XN_FLAG_COMPAT, X509_FLAG_COMPAT); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/t_x509.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/t_x509.cc index fffe63a0f9..9837e38367 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/t_x509.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/t_x509.cc @@ -26,10 +26,10 @@ #include "internal.h" -int X509_print_ex_fp(FILE *fp, X509 *x, unsigned long nmflag, +int X509_print_ex_fp(FILE *fp, const X509 *x, unsigned long nmflag, unsigned long cflag) { BIO *b = BIO_new_fp(fp, BIO_NOCLOSE); - if (b == NULL) { + if (b == nullptr) { OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB); return 0; } @@ -38,15 +38,15 @@ int X509_print_ex_fp(FILE *fp, X509 *x, unsigned long nmflag, return ret; } -int X509_print_fp(FILE *fp, X509 *x) { +int X509_print_fp(FILE *fp, const X509 *x) { return X509_print_ex_fp(fp, x, XN_FLAG_COMPAT, X509_FLAG_COMPAT); } -int X509_print(BIO *bp, X509 *x) { +int X509_print(BIO *bp, const X509 *x) { return X509_print_ex(bp, x, XN_FLAG_COMPAT, X509_FLAG_COMPAT); } -int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, +int X509_print_ex(BIO *bp, const X509 *x, unsigned long nmflags, unsigned long cflag) { char mlch = ' '; int nmindent = 0; @@ -59,7 +59,6 @@ int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, nmindent = 16; } - const X509_CINF *ci = x->cert_info; if (!(cflag & X509_FLAG_NO_HEADER)) { if (BIO_write(bp, "Certificate:\n", 13) <= 0) { return 0; @@ -107,7 +106,7 @@ int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, } if (!(cflag & X509_FLAG_NO_SIGNAME)) { - if (X509_signature_print(bp, ci->signature, NULL) <= 0) { + if (X509_signature_print(bp, &x->tbs_sig_alg, nullptr) <= 0) { return 0; } } @@ -131,13 +130,13 @@ int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, if (BIO_write(bp, " Not Before: ", 24) <= 0) { return 0; } - if (!ASN1_TIME_print(bp, X509_get_notBefore(x))) { + if (!ASN1_TIME_print(bp, X509_get0_notBefore(x))) { return 0; } if (BIO_write(bp, "\n Not After : ", 25) <= 0) { return 0; } - if (!ASN1_TIME_print(bp, X509_get_notAfter(x))) { + if (!ASN1_TIME_print(bp, X509_get0_notAfter(x))) { return 0; } if (BIO_write(bp, "\n", 1) <= 0) { @@ -163,7 +162,7 @@ int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, if (BIO_printf(bp, "%12sPublic Key Algorithm: ", "") <= 0) { return 0; } - if (i2a_ASN1_OBJECT(bp, ci->key->algor->algorithm) <= 0) { + if (i2a_ASN1_OBJECT(bp, x->key.algor.algorithm) <= 0) { return 0; } if (BIO_puts(bp, "\n") <= 0) { @@ -171,39 +170,39 @@ int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, } const EVP_PKEY *pkey = X509_get0_pubkey(x); - if (pkey == NULL) { + if (pkey == nullptr) { BIO_printf(bp, "%12sUnable to load Public Key\n", ""); ERR_print_errors(bp); } else { - EVP_PKEY_print_public(bp, pkey, 16, NULL); + EVP_PKEY_print_public(bp, pkey, 16, nullptr); } } if (!(cflag & X509_FLAG_NO_IDS)) { - if (ci->issuerUID) { + if (x->issuerUID) { if (BIO_printf(bp, "%8sIssuer Unique ID: ", "") <= 0) { return 0; } - if (!X509_signature_dump(bp, ci->issuerUID, 12)) { + if (!X509_signature_dump(bp, x->issuerUID, 12)) { return 0; } } - if (ci->subjectUID) { + if (x->subjectUID) { if (BIO_printf(bp, "%8sSubject Unique ID: ", "") <= 0) { return 0; } - if (!X509_signature_dump(bp, ci->subjectUID, 12)) { + if (!X509_signature_dump(bp, x->subjectUID, 12)) { return 0; } } } if (!(cflag & X509_FLAG_NO_EXTENSIONS)) { - X509V3_extensions_print(bp, "X509v3 extensions", ci->extensions, cflag, 8); + X509V3_extensions_print(bp, "X509v3 extensions", x->extensions, cflag, 8); } if (!(cflag & X509_FLAG_NO_SIGDUMP)) { - if (X509_signature_print(bp, x->sig_alg, x->signature) <= 0) { + if (X509_signature_print(bp, &x->sig_alg, &x->signature) <= 0) { return 0; } } @@ -228,7 +227,7 @@ int X509_signature_print(BIO *bp, const X509_ALGOR *sigalg, // RSA-PSS signatures have parameters to print. int sig_nid = OBJ_obj2nid(sigalg->algorithm); if (sig_nid == NID_rsassaPss && - !x509_print_rsa_pss_params(bp, sigalg, 9, 0)) { + !x509_print_rsa_pss_params(bp, sigalg, 9, nullptr)) { return 0; } @@ -244,7 +243,7 @@ int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase) { char *s, *c, *b; int ret = 0, i; - b = X509_NAME_oneline(name, NULL, 0); + b = X509_NAME_oneline(name, nullptr, 0); if (!b) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca.pem index 50d1318fcd..d723adf009 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca.pem +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca.pem @@ -1,9 +1,10 @@ -----BEGIN CERTIFICATE----- -MIIBOzCB4qADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv -bnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow -GAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH -A0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo -jS6aHNHZXk0vMEE/3I8P8D4KHlejEzARMA8GA1UdEwEB/wQFMAMBAf8wCgYIKoZI -zj0EAwIDSAAwRQIgTNs2aQPDZs+Pal5LA1fAKyC4AKTNN+JE/vEYndKhFxYCIQDf -b7IjDoXx/3GBnsrht14NUmzUBdqkQafJvC+eHIdtQA== +MIIBWzCCAQGgAwIBAgIBATAKBggqhkjOPQQDAjAcMRowGAYDVQQDExFCYXNpYyBD +b25zdHJhaW50czAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHDEa +MBgGA1UEAxMRQmFzaWMgQ29uc3RyYWludHMwWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZREvmcBCJBjVIREacR +qI0umhzR2V5NLzBBP9yPD/A+Ch5XozIwMDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSVJnTJEo2ZtBk89CL5Gtu7Yyz74DAKBggqhkjOPQQDAgNIADBFAiEA1XIf +pXKo6VX4fPYU+vxWQ6YxVPQ6/UjdfDnWePaHdDUCIGkn5fQacQUwxxZMqfsFTG0c +zaflanLgMXTJPKvzzdQW -----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca_pathlen_0.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca_pathlen_0.pem index 2d6680117a..cc4e260f71 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca_pathlen_0.pem +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca_pathlen_0.pem @@ -1,9 +1,10 @@ -----BEGIN CERTIFICATE----- -MIIBPjCB5aADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv -bnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow -GAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH -A0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo -jS6aHNHZXk0vMEE/3I8P8D4KHlejFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQAwCgYI -KoZIzj0EAwIDSAAwRQIgHdMalNLi3hzz58PdNQPAqiA5KAa/dfQWuNNjzE6iDIcC -IQCda6js7OKQvdqCFb/POHPriXX1YXIJ3N95+SE7qFJ9Gg== +MIIBXjCCAQSgAwIBAgIBATAKBggqhkjOPQQDAjAcMRowGAYDVQQDExFCYXNpYyBD +b25zdHJhaW50czAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHDEa +MBgGA1UEAxMRQmFzaWMgQ29uc3RyYWludHMwWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZREvmcBCJBjVIREacR +qI0umhzR2V5NLzBBP9yPD/A+Ch5XozUwMzASBgNVHRMBAf8ECDAGAQH/AgEAMB0G +A1UdDgQWBBSVJnTJEo2ZtBk89CL5Gtu7Yyz74DAKBggqhkjOPQQDAgNIADBFAiEA +//dl8Jlo5tRsWYFN7U1AZyK/HHmCpKO9mqsI/Heo5AYCIDYJEAWtE2GdMQYp+gLK +BM9D5tkwoV+I2h3Y6efgIJdF -----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca_pathlen_1.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca_pathlen_1.pem index b9d35d0142..f345b0ab4c 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca_pathlen_1.pem +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca_pathlen_1.pem @@ -1,9 +1,10 @@ -----BEGIN CERTIFICATE----- -MIIBPjCB5aADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv -bnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow -GAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH -A0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo -jS6aHNHZXk0vMEE/3I8P8D4KHlejFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI -KoZIzj0EAwIDSAAwRQIgZx7fIDI65CU7Lck0t7ep/GtBkpELR0gKkUJrI09/JJoC -IQDFPukkJgYA7RpFsAsEq77S+i9gf/S/IreobhvQm/401w== +MIIBXjCCAQSgAwIBAgIBATAKBggqhkjOPQQDAjAcMRowGAYDVQQDExFCYXNpYyBD +b25zdHJhaW50czAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHDEa +MBgGA1UEAxMRQmFzaWMgQ29uc3RyYWludHMwWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZREvmcBCJBjVIREacR +qI0umhzR2V5NLzBBP9yPD/A+Ch5XozUwMzASBgNVHRMBAf8ECDAGAQH/AgEBMB0G +A1UdDgQWBBSVJnTJEo2ZtBk89CL5Gtu7Yyz74DAKBggqhkjOPQQDAgNIADBFAiAK +1MyuX43BX0icQNiYIHer+Az89dkq6HcHlMf0Mr0yLAIhAPJUo5ydeqnVsLgafmj9 +MZKIQz0qfmObAuakM0KTvK25 -----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca_pathlen_10.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca_pathlen_10.pem index c4698a6a78..dcf44d77bb 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca_pathlen_10.pem +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_ca_pathlen_10.pem @@ -1,9 +1,10 @@ -----BEGIN CERTIFICATE----- -MIIBPjCB5aADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv -bnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow -GAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH -A0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo -jS6aHNHZXk0vMEE/3I8P8D4KHlejFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQowCgYI -KoZIzj0EAwIDSAAwRQIhALj37ijrYfommrWjrXMXjJyILvGNH7KxViKU1cWjX5dF -AiA6WjePmZdKilZebpZ++MTPs5cbpdcShWYuJ45sANCKgw== +MIIBXjCCAQSgAwIBAgIBATAKBggqhkjOPQQDAjAcMRowGAYDVQQDExFCYXNpYyBD +b25zdHJhaW50czAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHDEa +MBgGA1UEAxMRQmFzaWMgQ29uc3RyYWludHMwWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZREvmcBCJBjVIREacR +qI0umhzR2V5NLzBBP9yPD/A+Ch5XozUwMzASBgNVHRMBAf8ECDAGAQH/AgEKMB0G +A1UdDgQWBBSVJnTJEo2ZtBk89CL5Gtu7Yyz74DAKBggqhkjOPQQDAgNIADBFAiEA +vCVipjcdQ2owk1GFm6S/XDTsDTL8fA/6fhwBQ2ANUmoCIA38QpJZc8yK9XzzILV0 +cB7Esu6hj6Sav9dgtyqXDfST -----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_leaf.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_leaf.pem index 4b9b8c295c..4d4f7b747e 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_leaf.pem +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_leaf.pem @@ -4,6 +4,6 @@ bnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow GAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH A0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo jS6aHNHZXk0vMEE/3I8P8D4KHlejEDAOMAwGA1UdEwEB/wQCMAAwCgYIKoZIzj0E -AwIDSQAwRgIhAIc3Cbr1SRZZ8ZusjOQjA/9Ro5ijEZbMaD1ClW62/GqSAiEAy1tU -No3zRwTUcuyAnav+XbXkS1a5Fm2/rFBoWN8ZAxA= +AwIDSQAwRgIhAM4sVSr7q42V+IXDqrCXdiutbpZt0vLKH1nUHspE0TU0AiEAtC9a +MKTrgElqXiwsoA1F8IwkoHVrYN9KeJYLfivhyKw= -----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_none.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_none.pem index 1228961ff7..f3c3dbc857 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_none.pem +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/basic_constraints_none.pem @@ -1,9 +1,9 @@ -----BEGIN CERTIFICATE----- -MIIBKjCB0aADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv +MIIBJjCBzaADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv bnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow GAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH A0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo -jS6aHNHZXk0vMEE/3I8P8D4KHlejAjAAMAoGCCqGSM49BAMCA0gAMEUCIQCQ1/Ca -RanCM+PIUqVkCpfumEeLKawHMYIA2ZM3Yy2wngIgZg10Sd25/POZKIXlMAiwlDrM -UQcfzZiBh8T5JEWKeRc= +jS6aHNHZXk0vMEE/3I8P8D4KHlcwCgYIKoZIzj0EAwIDSAAwRQIhAPNhlCe3SSe8 +N69R8vWMRN5x3DbmHIsYUfdN9006F3Y3AiBYvD8xfGQfre/BfXBcIzSHbs5WR2Eo +9TAiHSScjYFBRQ== -----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/make_unusual_tbs.go b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/make_unusual_tbs.go new file mode 100644 index 0000000000..8424ba5ab4 --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/make_unusual_tbs.go @@ -0,0 +1,140 @@ +// Copyright 2025 The BoringSSL Authors +// +// Licensed under the Apache License, Version 2.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. + +//go:build ignore + +// make_unusual_tbs.go refreshes the signatures on the unusual_tbs_*.pem +// certificates. +package main + +import ( + "crypto" + "crypto/ecdsa" + "crypto/rand" + _ "crypto/sha256" + "crypto/x509" + "encoding/pem" + "fmt" + "os" + + "golang.org/x/crypto/cryptobyte" + "golang.org/x/crypto/cryptobyte/asn1" +) + +func digest(hash crypto.Hash, in []byte) []byte { + h := hash.New() + h.Write(in) + return h.Sum(nil) +} + +func verifySignature(key crypto.PublicKey, in, sig []byte, opts crypto.SignerOpts) bool { + switch k := key.(type) { + case *ecdsa.PublicKey: + return ecdsa.VerifyASN1(k, digest(opts.HashFunc(), in), sig) + default: + panic(fmt.Sprintf("unknown key type %T", k)) + } +} + +func updateSignature(path string, key crypto.Signer, opts crypto.SignerOpts) error { + inp, err := os.ReadFile(path) + if err != nil { + return err + } + block, _ := pem.Decode(inp) + if block == nil || block.Type != "CERTIFICATE" { + return fmt.Errorf("%q did not contain a PEM CERTIFICATE block", path) + } + + s := cryptobyte.String(block.Bytes) + var cert, tbsCert, sigAlg cryptobyte.String + var sig []byte + if !s.ReadASN1(&cert, asn1.SEQUENCE) || + !cert.ReadASN1Element(&tbsCert, asn1.SEQUENCE) || + !cert.ReadASN1Element(&sigAlg, asn1.SEQUENCE) || + !cert.ReadASN1BitStringAsBytes(&sig) || + !cert.Empty() { + return fmt.Errorf("could not parse certificate in %q", path) + } + + // Check if the signature is already valid. + if verifySignature(key.Public(), tbsCert, sig, opts) { + return nil + } + + newSig, err := key.Sign(rand.Reader, digest(opts.HashFunc(), tbsCert), opts) + if err != nil { + return err + } + + b := cryptobyte.NewBuilder(nil) + b.AddASN1(asn1.SEQUENCE, func(child *cryptobyte.Builder) { + child.AddBytes(tbsCert) + child.AddBytes(sigAlg) + child.AddASN1BitString(newSig) + }) + newCert, err := b.Bytes() + if err != nil { + return err + } + + newPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: newCert}) + return os.WriteFile(path, newPEM, 0644) +} + +func loadPEMPrivateKey(path string) (crypto.Signer, error) { + inp, err := os.ReadFile(path) + if err != nil { + return nil, err + } + block, _ := pem.Decode(inp) + if block == nil || block.Type != "PRIVATE KEY" { + return nil, fmt.Errorf("%q did not contain a PEM PRIVATE KEY block", path) + } + key, err := x509.ParsePKCS8PrivateKey(block.Bytes) + if err != nil { + return nil, err + } + signer, ok := key.(crypto.Signer) + if !ok { + return nil, fmt.Errorf("key in %q was not a signing key", path) + } + return signer, nil +} + +func main() { + key, err := loadPEMPrivateKey("unusual_tbs_key.pem") + if err != nil { + fmt.Fprintf(os.Stderr, "Error loading private key: %s\n", err) + os.Exit(1) + } + + paths := []string{ + "unusual_tbs_critical_ber.pem", + "unusual_tbs_critical_false_not_omitted.pem", + "unusual_tbs_empty_extension_not_omitted.pem", + "unusual_tbs_null_sigalg_param.pem", + "unusual_tbs_uid_both.pem", + "unusual_tbs_uid_issuer.pem", + "unusual_tbs_uid_subject.pem", + "unusual_tbs_wrong_attribute_order.pem", + "unusual_tbs_v1_not_omitted.pem", + } + for _, path := range paths { + if err := updateSignature(path, key, crypto.SHA256); err != nil { + fmt.Fprintf(os.Stderr, "Error signing %q: %s\n", path, err) + os.Exit(1) + } + } +} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/rsa_pss_sha256_key.pk8 b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/rsa_pss_sha256_key.pk8 new file mode 100644 index 0000000000000000000000000000000000000000..9bb598d982a270786bf9c5e1e94131d74ffca4bb GIT binary patch literal 1268 zcmV&LNQU31Egu0c8UO0s#d8q5}c}AOwO0rZ9p8q5=T`0)hbn0L=h_>U%2T z>IT)Hd~@0Vxk?FPTrNwe#x~CIjnh*;!x&X1uocH?xte#@a$EVsQ!1NoUuGxO`-K(< zXw%)P%hOqOQ5P57Jusaw#D3%-m*Xnif1TK5p~QB2W^T=Kyc(?a=TU!4I9X5Xn+4=8 zTH2Ws0Du$ZQx>GzyN=L?xQ!@vi>$AbEk>wlw1v_+$-3(fD`Z(G5cDf89-ySOfGi8_ zt1^#@Xs`!6+f;Avseqj*Ns%i#3>7lGeksRgkAZdiA(IUQQZV$wR-5~$N8`_qm8D`0o;-!mYw98ib+ET&1#k2zA$#2gpk`BbCd6 z%s=g0utT<<-V6sIMNk4&M=O3YBYR?Ax672V@366{<*8JXqOs{$_OrZZ+Ng!+Z0&^7bO`Clfa% zXi3Sw@)vLD_rv(Rk-9fc)jO{}?14=y-oXqX+=$K5Xm;{z9^a$zlo@{CO+x=4vX>D9 zxR}a?oI-Mk2x^2Xv=F;#&n-2tYvTfefdJHga!P;n5J<9c!cs~>0f&oo6`Qv`J-iru zA`W9)H8lBdBsv&PllWk^zq@O3!R?wJA4P?O0z5DtmZp-ypo>$`?3}3(5DkDu9y@); zpc|}8?C*{Dn1pM>HK2^UqR&hQfK0&>8R=FC#}wo7Lk&qEt-GTtS5cr(mvmS($)y5; zfFbflE4jH{{Q``UOZS=a%6I6RmDLSA7Sn|IMPG~8ub#8tqt%hwge~tQUv@C4Uh8$0)Me3`!aZ*ZlK(x~?Dd02<02!Mm_so&UO_pr3!S?(>2- z+3U>5BDph!Hr?kDkrH`~CV-q8jqF1pVFH1GA9WC_V#3(oN<332CxP@H0?_ER0#mPio!TjY90<^-AIpG=o?$TxF9 zPhe&@a*QnlQM&`fCdj*Ury=M1R6yz>a=W2MU(7Jvu-W*TFz6MkAAgrAs8`?)132AT z0)c={9}RVH=Y9bRnq@CgsEd1OUB$lum>pdscKr-*;+)mCICDgKFj{l1JQbPKo~}Et z17E#w?FYh*=LM5Ed7y4c=B5K^ZrI{h3SVmR^1@HAN~vJuf*5ZV?%e63NgC%cXbsfQ ecZ+cPsAwjuG9yQP$rE?6nr&JxuA&)s3+~lXoJENM literal 0 HcmV?d00001 diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_critical_ber.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_critical_ber.pem new file mode 100644 index 0000000000..80b85bd46b --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_critical_ber.pem @@ -0,0 +1,9 @@ +-----BEGIN CERTIFICATE----- +MIIBJjCBzqADAgECAgkAhl+3uPLdFykwCgYIKoZIzj0EAwIwDzENMAsGA1UEAwwE +VGVzdDAeFw0yNTA5MDIxODQzMTdaFw0yNTEwMDIxODQzMTdaMA8xDTALBgNVBAMM +BFRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATszjOipC1du8ay50pozmB3 +x6bHKTrwAVOMhhTg87UC2JhffDIvz2TBsePGC+aH/1oGDUs6PqR+wkjFQtSZSl3N +oxMwETAPBgNVHRMBAQEEBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIHsifHzBqZaB +miT+i/7bzfKSRBxGlETKtQ4Uk+970fQWAiAZDm/huJD42HnOi9q4OUHzAtsxVAml +NtUuQ1k4eJAh/A== +-----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_critical_false_not_omitted.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_critical_false_not_omitted.pem new file mode 100644 index 0000000000..7e0bda4a9e --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_critical_false_not_omitted.pem @@ -0,0 +1,9 @@ +-----BEGIN CERTIFICATE----- +MIIBJjCBzqADAgECAgkAhl+3uPLdFykwCgYIKoZIzj0EAwIwDzENMAsGA1UEAwwE +VGVzdDAeFw0yNTA5MDIxODQzMTdaFw0yNTEwMDIxODQzMTdaMA8xDTALBgNVBAMM +BFRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATszjOipC1du8ay50pozmB3 +x6bHKTrwAVOMhhTg87UC2JhffDIvz2TBsePGC+aH/1oGDUs6PqR+wkjFQtSZSl3N +oxMwETAPBgNVHRMBAQAEBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIEWpqBLkyjns +J0B3yF1vBxYjctK0JlIcM7zaesbsiAMMAiAwm4T0zi2e72yk5NNuL1CJTqUeJ/OC +FCj5wnR6w2Si+A== +-----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_empty_extension_not_omitted.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_empty_extension_not_omitted.pem new file mode 100644 index 0000000000..d43f7efe53 --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_empty_extension_not_omitted.pem @@ -0,0 +1,8 @@ +-----BEGIN CERTIFICATE----- +MIIBFjCBvaADAgECAgkAhl+3uPLdFykwCgYIKoZIzj0EAwIwDzENMAsGA1UEAwwE +VGVzdDAeFw0yNTA5MDIxODQzMTdaFw0yNTEwMDIxODQzMTdaMA8xDTALBgNVBAMM +BFRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATszjOipC1du8ay50pozmB3 +x6bHKTrwAVOMhhTg87UC2JhffDIvz2TBsePGC+aH/1oGDUs6PqR+wkjFQtSZSl3N +owIwADAKBggqhkjOPQQDAgNIADBFAiEArzc2EQr44G4O7x1v30+5xjCr/fEwAl3I +1dCXXsp9+9ICIBF4FtNRgfbzt6x+5wYBUGBZR1Iqsw2FIJuITa3p25TA +-----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_key.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_key.pem new file mode 100644 index 0000000000..966dd5547c --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_key.pem @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgi4QXNrPgfmMLj/RO +TXhG2JejJFliP8hPbMCk7kWh4HOhRANCAATszjOipC1du8ay50pozmB3x6bHKTrw +AVOMhhTg87UC2JhffDIvz2TBsePGC+aH/1oGDUs6PqR+wkjFQtSZSl3N +-----END PRIVATE KEY----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_null_sigalg_param.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_null_sigalg_param.pem new file mode 100644 index 0000000000..1c0e2bb6ad --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_null_sigalg_param.pem @@ -0,0 +1,8 @@ +-----BEGIN CERTIFICATE----- +MIIBETCBtgIJAIZft7jy3RcpMAwGCCqGSM49BAMCBQAwDzENMAsGA1UEAwwEVGVz +dDAeFw0yNTA5MDIxODQzMTdaFw0yNTEwMDIxODQzMTdaMA8xDTALBgNVBAMMBFRl +c3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATszjOipC1du8ay50pozmB3x6bH +KTrwAVOMhhTg87UC2JhffDIvz2TBsePGC+aH/1oGDUs6PqR+wkjFQtSZSl3NMAwG +CCqGSM49BAMCBQADSAAwRQIhAJHIFuDC7wlXEfVm/tIJ3EPYAqCFF1gNFWarj7IZ +waItAiBkpFzOXFeRV58oBXVYUe3OMCoBhUyi2Lse3qjc3nvsEQ== +-----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_uid_both.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_uid_both.pem new file mode 100644 index 0000000000..7f7923c5f3 --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_uid_both.pem @@ -0,0 +1,9 @@ +-----BEGIN CERTIFICATE----- +MIIBJDCBzKADAgEBAgkAhl+3uPLdFykwCgYIKoZIzj0EAwIwDzENMAsGA1UEAwwE +VGVzdDAeFw0yNTA5MDIxODQzMTdaFw0yNTEwMDIxODQzMTdaMA8xDTALBgNVBAMM +BFRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATszjOipC1du8ay50pozmB3 +x6bHKTrwAVOMhhTg87UC2JhffDIvz2TBsePGC+aH/1oGDUs6PqR+wkjFQtSZSl3N +gQcAaXNzdWVygggAc3ViamVjdDAKBggqhkjOPQQDAgNHADBEAiA54JGXx+BJfSZN +C6zG5i/PJ2aOFdXueTtxx44IfnTbFgIgVYpUxshFOIIk8l/wAZ9CoS8e2cQ0XKqK +tUUzhyOXgeg= +-----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_uid_issuer.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_uid_issuer.pem new file mode 100644 index 0000000000..8f8724b140 --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_uid_issuer.pem @@ -0,0 +1,8 @@ +-----BEGIN CERTIFICATE----- +MIIBGzCBwqADAgEBAgkAhl+3uPLdFykwCgYIKoZIzj0EAwIwDzENMAsGA1UEAwwE +VGVzdDAeFw0yNTA5MDIxODQzMTdaFw0yNTEwMDIxODQzMTdaMA8xDTALBgNVBAMM +BFRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATszjOipC1du8ay50pozmB3 +x6bHKTrwAVOMhhTg87UC2JhffDIvz2TBsePGC+aH/1oGDUs6PqR+wkjFQtSZSl3N +gQcAaXNzdWVyMAoGCCqGSM49BAMCA0gAMEUCIFpVYsgIUl2CwFSwPISEIXoHzCKG +cjYcinUtlG3jHqPGAiEAm/jB7DE1QHlveUGc4lRHzBPvU0AthpUS/Q5XGf/hAnA= +-----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_uid_subject.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_uid_subject.pem new file mode 100644 index 0000000000..776363a306 --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_uid_subject.pem @@ -0,0 +1,8 @@ +-----BEGIN CERTIFICATE----- +MIIBHDCBw6ADAgEBAgkAhl+3uPLdFykwCgYIKoZIzj0EAwIwDzENMAsGA1UEAwwE +VGVzdDAeFw0yNTA5MDIxODQzMTdaFw0yNTEwMDIxODQzMTdaMA8xDTALBgNVBAMM +BFRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATszjOipC1du8ay50pozmB3 +x6bHKTrwAVOMhhTg87UC2JhffDIvz2TBsePGC+aH/1oGDUs6PqR+wkjFQtSZSl3N +gggAc3ViamVjdDAKBggqhkjOPQQDAgNIADBFAiBvKz3oALhCqKrRFLUbax6+tI1s +1B14IPVk2ZHbBEou5gIhAOpvJRNj5qluPXKLXmZvIK8uOjUhiZoowYvborSS1EBK +-----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_v1_not_omitted.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_v1_not_omitted.pem new file mode 100644 index 0000000000..2e090281a9 --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_v1_not_omitted.pem @@ -0,0 +1,8 @@ +-----BEGIN CERTIFICATE----- +MIIBETCBuaADAgEAAgkAhl+3uPLdFykwCgYIKoZIzj0EAwIwDzENMAsGA1UEAwwE +VGVzdDAeFw0yNTA5MDIxODQzMTdaFw0yNTEwMDIxODQzMTdaMA8xDTALBgNVBAMM +BFRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATszjOipC1du8ay50pozmB3 +x6bHKTrwAVOMhhTg87UC2JhffDIvz2TBsePGC+aH/1oGDUs6PqR+wkjFQtSZSl3N +MAoGCCqGSM49BAMCA0cAMEQCIF/B+SrEnMPlhmATBjKSff2d6vGeiObEhS6CQV7q +jal2AiAFtgBo9YMcRn8jmkuuBpEjto3e9iMMk9hcbatc3MBepw== +-----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_wrong_attribute_order.pem b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_wrong_attribute_order.pem new file mode 100644 index 0000000000..12e9bde12e --- /dev/null +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/test/unusual_tbs_wrong_attribute_order.pem @@ -0,0 +1,9 @@ +-----BEGIN CERTIFICATE----- +MIIBJjCBzgIJAIZft7jy3RcpMAoGCCqGSM49BAMCMBwxGjALBgNVBAoMBFRlc3Qw +CwYDVQQDDARUZXN0MB4XDTI1MDkwMjE4NDMxN1oXDTI1MTAwMjE4NDMxN1owHDEa +MAsGA1UECgwEVGVzdDALBgNVBAMMBFRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAATszjOipC1du8ay50pozmB3x6bHKTrwAVOMhhTg87UC2JhffDIvz2TBsePG +C+aH/1oGDUs6PqR+wkjFQtSZSl3NMAoGCCqGSM49BAMCA0cAMEQCIGxfTqIwedli +0QhOn70oL+SBnqtm9S0g73pq46AEmGFFAiAv6t930j82rFcZeud1qAqRX68kmO+q +GOf5K70Buh5LXA== +-----END CERTIFICATE----- diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_akey.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_akey.cc index 6c3c6a98c0..e64365d15e 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_akey.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_akey.cc @@ -36,27 +36,27 @@ const X509V3_EXT_METHOD v3_akey_id = { NID_authority_key_identifier, X509V3_EXT_MULTILINE, ASN1_ITEM_ref(AUTHORITY_KEYID), - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, i2v_AUTHORITY_KEYID, v2i_AUTHORITY_KEYID, - 0, - 0, - NULL, + nullptr, + nullptr, + nullptr, }; static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_KEYID( const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *extlist) { const AUTHORITY_KEYID *akeyid = reinterpret_cast(ext); - int extlist_was_null = extlist == NULL; + int extlist_was_null = extlist == nullptr; if (akeyid->keyid) { char *tmp = x509v3_bytes_to_hex(akeyid->keyid->data, akeyid->keyid->length); - int ok = tmp != NULL && X509V3_add_value("keyid", tmp, &extlist); + int ok = tmp != nullptr && X509V3_add_value("keyid", tmp, &extlist); OPENSSL_free(tmp); if (!ok) { goto err; @@ -64,8 +64,8 @@ static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_KEYID( } if (akeyid->issuer) { STACK_OF(CONF_VALUE) *tmpextlist = - i2v_GENERAL_NAMES(NULL, akeyid->issuer, extlist); - if (tmpextlist == NULL) { + i2v_GENERAL_NAMES(nullptr, akeyid->issuer, extlist); + if (tmpextlist == nullptr) { goto err; } extlist = tmpextlist; @@ -81,7 +81,7 @@ err: if (extlist_was_null) { sk_CONF_VALUE_pop_free(extlist, X509V3_conf_free); } - return NULL; + return nullptr; } // Currently two options: keyid: use the issuers subject keyid, the value @@ -95,11 +95,11 @@ static void *v2i_AUTHORITY_KEYID(const X509V3_EXT_METHOD *method, const STACK_OF(CONF_VALUE) *values) { char keyid = 0, issuer = 0; int j; - ASN1_OCTET_STRING *ikeyid = NULL; - X509_NAME *isname = NULL; - GENERAL_NAMES *gens = NULL; - GENERAL_NAME *gen = NULL; - ASN1_INTEGER *serial = NULL; + ASN1_OCTET_STRING *ikeyid = nullptr; + X509_NAME *isname = nullptr; + GENERAL_NAMES *gens = nullptr; + GENERAL_NAME *gen = nullptr; + ASN1_INTEGER *serial = nullptr; const X509 *cert; AUTHORITY_KEYID *akeyid; @@ -118,7 +118,7 @@ static void *v2i_AUTHORITY_KEYID(const X509V3_EXT_METHOD *method, } else { OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_OPTION); ERR_add_error_data(2, "name=", cnf->name); - return NULL; + return nullptr; } } @@ -127,7 +127,7 @@ static void *v2i_AUTHORITY_KEYID(const X509V3_EXT_METHOD *method, return AUTHORITY_KEYID_new(); } OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_ISSUER_CERTIFICATE); - return NULL; + return nullptr; } cert = ctx->issuer_cert; @@ -140,7 +140,7 @@ static void *v2i_AUTHORITY_KEYID(const X509V3_EXT_METHOD *method, } if (keyid == 2 && !ikeyid) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNABLE_TO_GET_ISSUER_KEYID); - return NULL; + return nullptr; } } @@ -176,5 +176,5 @@ err: X509_NAME_free(isname); ASN1_INTEGER_free(serial); ASN1_OCTET_STRING_free(ikeyid); - return NULL; + return nullptr; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_akeya.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_akeya.cc index d5a84601d3..a9ef7d479d 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_akeya.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_akeya.cc @@ -28,4 +28,4 @@ ASN1_SEQUENCE(AUTHORITY_KEYID) = { ASN1_IMP_OPT(AUTHORITY_KEYID, serial, ASN1_INTEGER, 2), } ASN1_SEQUENCE_END(AUTHORITY_KEYID) -IMPLEMENT_ASN1_FUNCTIONS(AUTHORITY_KEYID) +IMPLEMENT_ASN1_FUNCTIONS_const(AUTHORITY_KEYID) diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_alt.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_alt.cc index 64bd889167..cb4a72ab08 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_alt.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_alt.cc @@ -47,12 +47,12 @@ const X509V3_EXT_METHOD v3_subject_alt_name = { NID_subject_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES), - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, i2v_GENERAL_NAMES_cb, v2i_subject_alt, nullptr, @@ -64,12 +64,12 @@ const X509V3_EXT_METHOD v3_issuer_alt_name = { NID_issuer_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES), - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, i2v_GENERAL_NAMES_cb, v2i_issuer_alt, nullptr, @@ -81,31 +81,31 @@ const X509V3_EXT_METHOD v3_certificate_issuer = { NID_certificate_issuer, 0, ASN1_ITEM_ref(GENERAL_NAMES), - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, i2v_GENERAL_NAMES_cb, - NULL, - NULL, - NULL, - NULL, + nullptr, + nullptr, + nullptr, + nullptr, }; STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(const X509V3_EXT_METHOD *method, const GENERAL_NAMES *gens, STACK_OF(CONF_VALUE) *ret) { - int ret_was_null = ret == NULL; + int ret_was_null = ret == nullptr; for (size_t i = 0; i < sk_GENERAL_NAME_num(gens); i++) { const GENERAL_NAME *gen = sk_GENERAL_NAME_value(gens, i); STACK_OF(CONF_VALUE) *tmp = i2v_GENERAL_NAME(method, gen, ret); - if (tmp == NULL) { + if (tmp == nullptr) { if (ret_was_null) { sk_CONF_VALUE_pop_free(ret, X509V3_conf_free); } - return NULL; + return nullptr; } ret = tmp; } @@ -127,44 +127,44 @@ STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(const X509V3_EXT_METHOD *method, switch (gen->type) { case GEN_OTHERNAME: if (!X509V3_add_value("othername", "", &ret)) { - return NULL; + return nullptr; } break; case GEN_X400: if (!X509V3_add_value("X400Name", "", &ret)) { - return NULL; + return nullptr; } break; case GEN_EDIPARTY: if (!X509V3_add_value("EdiPartyName", "", &ret)) { - return NULL; + return nullptr; } break; case GEN_EMAIL: if (!x509V3_add_value_asn1_string("email", gen->d.ia5, &ret)) { - return NULL; + return nullptr; } break; case GEN_DNS: if (!x509V3_add_value_asn1_string("DNS", gen->d.ia5, &ret)) { - return NULL; + return nullptr; } break; case GEN_URI: if (!x509V3_add_value_asn1_string("URI", gen->d.ia5, &ret)) { - return NULL; + return nullptr; } break; case GEN_DIRNAME: - if (X509_NAME_oneline(gen->d.dirn, oline, 256) == NULL || + if (X509_NAME_oneline(gen->d.dirn, oline, 256) == nullptr || !X509V3_add_value("DirName", oline, &ret)) { - return NULL; + return nullptr; } break; @@ -185,19 +185,19 @@ STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(const X509V3_EXT_METHOD *method, } } else { if (!X509V3_add_value("IP Address", "", &ret)) { - return NULL; + return nullptr; } break; } if (!X509V3_add_value("IP Address", oline, &ret)) { - return NULL; + return nullptr; } break; case GEN_RID: i2t_ASN1_OBJECT(oline, 256, gen->d.rid); if (!X509V3_add_value("Registered ID", oline, &ret)) { - return NULL; + return nullptr; } break; } @@ -270,8 +270,8 @@ static void *v2i_issuer_alt(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const STACK_OF(CONF_VALUE) *nval) { GENERAL_NAMES *gens = sk_GENERAL_NAME_new_null(); - if (gens == NULL) { - return NULL; + if (gens == nullptr) { + return nullptr; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { const CONF_VALUE *cnf = sk_CONF_VALUE_value(nval, i); @@ -282,7 +282,7 @@ static void *v2i_issuer_alt(const X509V3_EXT_METHOD *method, } } else { GENERAL_NAME *gen = v2i_GENERAL_NAME(method, ctx, cnf); - if (gen == NULL || !sk_GENERAL_NAME_push(gens, gen)) { + if (gen == nullptr || !sk_GENERAL_NAME_push(gens, gen)) { GENERAL_NAME_free(gen); goto err; } @@ -291,7 +291,7 @@ static void *v2i_issuer_alt(const X509V3_EXT_METHOD *method, return gens; err: sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free); - return NULL; + return nullptr; } // Append subject altname of issuer to issuer alt name of subject @@ -310,7 +310,7 @@ static int copy_issuer(const X509V3_CTX *ctx, GENERAL_NAMES *gens) { } int ret = 0; - GENERAL_NAMES *ialt = NULL; + GENERAL_NAMES *ialt = nullptr; X509_EXTENSION *ext; if (!(ext = X509_get_ext(ctx->issuer_cert, i)) || !(ialt = reinterpret_cast(X509V3_EXT_d2i(ext)))) { @@ -324,7 +324,7 @@ static int copy_issuer(const X509V3_CTX *ctx, GENERAL_NAMES *gens) { goto err; } // Ownership of |gen| has moved from |ialt| to |gens|. - sk_GENERAL_NAME_set(ialt, j, NULL); + sk_GENERAL_NAME_set(ialt, j, nullptr); } ret = 1; @@ -338,8 +338,8 @@ static void *v2i_subject_alt(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const STACK_OF(CONF_VALUE) *nval) { GENERAL_NAMES *gens = sk_GENERAL_NAME_new_null(); - if (gens == NULL) { - return NULL; + if (gens == nullptr) { + return nullptr; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { const CONF_VALUE *cnf = sk_CONF_VALUE_value(nval, i); @@ -355,7 +355,7 @@ static void *v2i_subject_alt(const X509V3_EXT_METHOD *method, } } else { GENERAL_NAME *gen = v2i_GENERAL_NAME(method, ctx, cnf); - if (gen == NULL || !sk_GENERAL_NAME_push(gens, gen)) { + if (gen == nullptr || !sk_GENERAL_NAME_push(gens, gen)) { GENERAL_NAME_free(gen); goto err; } @@ -364,18 +364,18 @@ static void *v2i_subject_alt(const X509V3_EXT_METHOD *method, return gens; err: sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free); - return NULL; + return nullptr; } // Copy any email addresses in a certificate or request to GENERAL_NAMES static int copy_email(const X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p) { X509_NAME *nm; - ASN1_IA5STRING *email = NULL; + ASN1_IA5STRING *email = nullptr; X509_NAME_ENTRY *ne; - GENERAL_NAME *gen = NULL; + GENERAL_NAME *gen = nullptr; int i; - if (ctx != NULL && ctx->flags == X509V3_CTX_TEST) { + if (ctx != nullptr && ctx->flags == X509V3_CTX_TEST) { return 1; } if (!ctx || (!ctx->subject_cert && !ctx->subject_req)) { @@ -403,12 +403,12 @@ static int copy_email(const X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p) { goto err; } gen->d.ia5 = email; - email = NULL; + email = nullptr; gen->type = GEN_EMAIL; if (!sk_GENERAL_NAME_push(gens, gen)) { goto err; } - gen = NULL; + gen = nullptr; } return 1; @@ -423,13 +423,13 @@ GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const STACK_OF(CONF_VALUE) *nval) { GENERAL_NAMES *gens = sk_GENERAL_NAME_new_null(); - if (gens == NULL) { - return NULL; + if (gens == nullptr) { + return nullptr; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { const CONF_VALUE *cnf = sk_CONF_VALUE_value(nval, i); GENERAL_NAME *gen = v2i_GENERAL_NAME(method, ctx, cnf); - if (gen == NULL || !sk_GENERAL_NAME_push(gens, gen)) { + if (gen == nullptr || !sk_GENERAL_NAME_push(gens, gen)) { GENERAL_NAME_free(gen); goto err; } @@ -437,12 +437,12 @@ GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, return gens; err: sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free); - return NULL; + return nullptr; } GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const CONF_VALUE *cnf) { - return v2i_GENERAL_NAME_ex(NULL, method, ctx, cnf, 0); + return v2i_GENERAL_NAME_ex(nullptr, method, ctx, cnf, 0); } static GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, @@ -451,16 +451,16 @@ static GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, const char *value, int is_nc) { if (!value) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE); - return NULL; + return nullptr; } - GENERAL_NAME *gen = NULL; + GENERAL_NAME *gen = nullptr; if (out) { gen = out; } else { gen = GENERAL_NAME_new(); - if (gen == NULL) { - return NULL; + if (gen == nullptr) { + return nullptr; } } @@ -469,7 +469,7 @@ static GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, case GEN_EMAIL: case GEN_DNS: { ASN1_IA5STRING *str = ASN1_IA5STRING_new(); - if (str == NULL || !ASN1_STRING_set(str, value, strlen(value))) { + if (str == nullptr || !ASN1_STRING_set(str, value, strlen(value))) { ASN1_STRING_free(str); goto err; } @@ -497,7 +497,7 @@ static GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, } else { gen->d.ip = a2i_IPADDRESS(value); } - if (gen->d.ip == NULL) { + if (gen->d.ip == nullptr) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_BAD_IP_ADDRESS); ERR_add_error_data(2, "value=", value); goto err; @@ -528,7 +528,7 @@ err: if (!out) { GENERAL_NAME_free(gen); } - return NULL; + return nullptr; } GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, @@ -539,7 +539,7 @@ GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, const char *value = cnf->value; if (!value) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE); - return NULL; + return nullptr; } int type; @@ -560,7 +560,7 @@ GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, } else { OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNSUPPORTED_OPTION); ERR_add_error_data(2, "name=", name); - return NULL; + return nullptr; } return a2i_GENERAL_NAME(out, method, ctx, type, value, is_nc); @@ -569,29 +569,29 @@ GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, static int do_othername(GENERAL_NAME *gen, const char *value, const X509V3_CTX *ctx) { const char *semicolon = strchr(value, ';'); - if (semicolon == NULL) { + if (semicolon == nullptr) { return 0; } OTHERNAME *name = OTHERNAME_new(); - if (name == NULL) { + if (name == nullptr) { return 0; } char *objtmp = OPENSSL_strndup(value, semicolon - value); - if (objtmp == NULL) { + if (objtmp == nullptr) { goto err; } ASN1_OBJECT_free(name->type_id); name->type_id = OBJ_txt2obj(objtmp, /*dont_search_names=*/0); OPENSSL_free(objtmp); - if (name->type_id == NULL) { + if (name->type_id == nullptr) { goto err; } ASN1_TYPE_free(name->value); name->value = ASN1_generate_v3(semicolon + 1, ctx); - if (name->value == NULL) { + if (name->value == nullptr) { goto err; } @@ -609,10 +609,10 @@ static int do_dirname(GENERAL_NAME *gen, const char *value, int ret = 0; const STACK_OF(CONF_VALUE) *sk = X509V3_get_section(ctx, value); X509_NAME *nm = X509_NAME_new(); - if (nm == NULL) { + if (nm == nullptr) { goto err; } - if (sk == NULL) { + if (sk == nullptr) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_SECTION_NOT_FOUND); ERR_add_error_data(2, "section=", value); goto err; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_bcons.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_bcons.cc index 0399557a53..5d24ced50a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_bcons.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_bcons.cc @@ -35,17 +35,17 @@ const X509V3_EXT_METHOD v3_bcons = { NID_basic_constraints, 0, ASN1_ITEM_ref(BASIC_CONSTRAINTS), - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, i2v_BASIC_CONSTRAINTS, v2i_BASIC_CONSTRAINTS, - NULL, - NULL, - NULL, + nullptr, + nullptr, + nullptr, }; ASN1_SEQUENCE(BASIC_CONSTRAINTS) = { @@ -67,9 +67,9 @@ static STACK_OF(CONF_VALUE) *i2v_BASIC_CONSTRAINTS( static void *v2i_BASIC_CONSTRAINTS(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const STACK_OF(CONF_VALUE) *values) { - BASIC_CONSTRAINTS *bcons = NULL; + BASIC_CONSTRAINTS *bcons = nullptr; if (!(bcons = BASIC_CONSTRAINTS_new())) { - return NULL; + return nullptr; } for (size_t i = 0; i < sk_CONF_VALUE_num(values); i++) { const CONF_VALUE *val = sk_CONF_VALUE_value(values, i); @@ -90,5 +90,5 @@ static void *v2i_BASIC_CONSTRAINTS(const X509V3_EXT_METHOD *method, return bcons; err: BASIC_CONSTRAINTS_free(bcons); - return NULL; + return nullptr; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_bitst.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_bitst.cc index eb7d0e1d46..3f629d2727 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_bitst.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_bitst.cc @@ -24,15 +24,11 @@ static const BIT_STRING_BITNAME ns_cert_type_table[] = { - {0, "SSL Client", "client"}, - {1, "SSL Server", "server"}, - {2, "S/MIME", "email"}, - {3, "Object Signing", "objsign"}, - {4, "Unused", "reserved"}, - {5, "SSL CA", "sslCA"}, - {6, "S/MIME CA", "emailCA"}, - {7, "Object Signing CA", "objCA"}, - {-1, NULL, NULL}}; + {0, "SSL Client", "client"}, {1, "SSL Server", "server"}, + {2, "S/MIME", "email"}, {3, "Object Signing", "objsign"}, + {4, "Unused", "reserved"}, {5, "SSL CA", "sslCA"}, + {6, "S/MIME CA", "emailCA"}, {7, "Object Signing CA", "objCA"}, + {-1, nullptr, nullptr}}; static const BIT_STRING_BITNAME key_usage_type_table[] = { {0, "Digital Signature", "digitalSignature"}, @@ -44,7 +40,7 @@ static const BIT_STRING_BITNAME key_usage_type_table[] = { {6, "CRL Sign", "cRLSign"}, {7, "Encipher Only", "encipherOnly"}, {8, "Decipher Only", "decipherOnly"}, - {-1, NULL, NULL}}; + {-1, nullptr, nullptr}}; static STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING( const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *ret) { @@ -53,7 +49,7 @@ static STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING( for (bnam = reinterpret_cast(method->usr_data); bnam->lname; bnam++) { if (ASN1_BIT_STRING_get_bit(bits, bnam->bitnum)) { - X509V3_add_value(bnam->lname, NULL, &ret); + X509V3_add_value(bnam->lname, nullptr, &ret); } } return ret; @@ -64,7 +60,7 @@ static void *v2i_ASN1_BIT_STRING(const X509V3_EXT_METHOD *method, const STACK_OF(CONF_VALUE) *nval) { ASN1_BIT_STRING *bs; if (!(bs = ASN1_BIT_STRING_new())) { - return NULL; + return nullptr; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { const CONF_VALUE *val = sk_CONF_VALUE_value(nval, i); @@ -74,7 +70,7 @@ static void *v2i_ASN1_BIT_STRING(const X509V3_EXT_METHOD *method, if (!strcmp(bnam->sname, val->name) || !strcmp(bnam->lname, val->name)) { if (!ASN1_BIT_STRING_set_bit(bs, bnam->bitnum, 1)) { ASN1_BIT_STRING_free(bs); - return NULL; + return nullptr; } break; } @@ -83,7 +79,7 @@ static void *v2i_ASN1_BIT_STRING(const X509V3_EXT_METHOD *method, OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT); X509V3_conf_err(val); ASN1_BIT_STRING_free(bs); - return NULL; + return nullptr; } } return bs; @@ -92,7 +88,8 @@ static void *v2i_ASN1_BIT_STRING(const X509V3_EXT_METHOD *method, #define EXT_BITSTRING(nid, table) \ { \ nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), 0, 0, 0, 0, 0, 0, \ - i2v_ASN1_BIT_STRING, v2i_ASN1_BIT_STRING, NULL, NULL, (void *)(table) \ + i2v_ASN1_BIT_STRING, v2i_ASN1_BIT_STRING, nullptr, nullptr, \ + (void *)(table) \ } const X509V3_EXT_METHOD v3_nscert = diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_conf.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_conf.cc index f48c128cfd..33b05b1b3d 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_conf.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_conf.cc @@ -44,8 +44,8 @@ X509_EXTENSION *X509V3_EXT_nconf(const CONF *conf, const X509V3_CTX *ctx, const char *name, const char *value) { // If omitted, fill in an empty |X509V3_CTX|. X509V3_CTX ctx_tmp; - if (ctx == NULL) { - X509V3_set_ctx(&ctx_tmp, NULL, NULL, NULL, NULL, 0); + if (ctx == nullptr) { + X509V3_set_ctx(&ctx_tmp, nullptr, nullptr, nullptr, nullptr, 0); X509V3_set_nconf(&ctx_tmp, conf); ctx = &ctx_tmp; } @@ -67,8 +67,8 @@ X509_EXTENSION *X509V3_EXT_nconf_nid(const CONF *conf, const X509V3_CTX *ctx, int ext_nid, const char *value) { // If omitted, fill in an empty |X509V3_CTX|. X509V3_CTX ctx_tmp; - if (ctx == NULL) { - X509V3_set_ctx(&ctx_tmp, NULL, NULL, NULL, NULL, 0); + if (ctx == nullptr) { + X509V3_set_ctx(&ctx_tmp, nullptr, nullptr, nullptr, nullptr, 0); X509V3_set_nconf(&ctx_tmp, conf); ctx = &ctx_tmp; } @@ -89,15 +89,15 @@ static X509_EXTENSION *do_ext_nconf(const CONF *conf, const X509V3_CTX *ctx, const X509V3_EXT_METHOD *method; X509_EXTENSION *ext; const STACK_OF(CONF_VALUE) *nval; - STACK_OF(CONF_VALUE) *nval_owned = NULL; + STACK_OF(CONF_VALUE) *nval_owned = nullptr; void *ext_struc; if (ext_nid == NID_undef) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_EXTENSION_NAME); - return NULL; + return nullptr; } if (!(method = X509V3_EXT_get_nid(ext_nid))) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_EXTENSION); - return NULL; + return nullptr; } // Now get internal extension representation based on type if (method->v2i) { @@ -105,29 +105,29 @@ static X509_EXTENSION *do_ext_nconf(const CONF *conf, const X509V3_CTX *ctx, // TODO(davidben): This is the only place where |X509V3_EXT_nconf|'s // |conf| parameter is used. All other codepaths use the copy inside // |ctx|. Should this be switched and then the parameter ignored? - if (conf == NULL) { + if (conf == nullptr) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_CONFIG_DATABASE); - return NULL; + return nullptr; } nval = NCONF_get_section(conf, value + 1); } else { nval_owned = X509V3_parse_list(value); nval = nval_owned; } - if (nval == NULL || sk_CONF_VALUE_num(nval) <= 0) { + if (nval == nullptr || sk_CONF_VALUE_num(nval) <= 0) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_EXTENSION_STRING); ERR_add_error_data(4, "name=", OBJ_nid2sn(ext_nid), ",section=", value); sk_CONF_VALUE_pop_free(nval_owned, X509V3_conf_free); - return NULL; + return nullptr; } ext_struc = method->v2i(method, ctx, nval); sk_CONF_VALUE_pop_free(nval_owned, X509V3_conf_free); if (!ext_struc) { - return NULL; + return nullptr; } } else if (method->s2i) { if (!(ext_struc = method->s2i(method, ctx, value))) { - return NULL; + return nullptr; } } else if (method->r2i) { // TODO(davidben): Should this check be removed? This matches OpenSSL, but @@ -136,15 +136,15 @@ static X509_EXTENSION *do_ext_nconf(const CONF *conf, const X509V3_CTX *ctx, // |X509V3_get_section| returning NULL. if (!ctx->db) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_CONFIG_DATABASE); - return NULL; + return nullptr; } if (!(ext_struc = method->r2i(method, ctx, value))) { - return NULL; + return nullptr; } } else { OPENSSL_PUT_ERROR(X509V3, X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED); ERR_add_error_data(2, "name=", OBJ_nid2sn(ext_nid)); - return NULL; + return nullptr; } ext = do_ext_i2d(method, ext_nid, crit, ext_struc); @@ -156,22 +156,22 @@ static X509_EXTENSION *do_ext_nconf(const CONF *conf, const X509V3_CTX *ctx, static X509_EXTENSION *do_ext_i2d(const X509V3_EXT_METHOD *method, int ext_nid, int crit, void *ext_struc) { // Convert the extension's internal representation to DER. - unsigned char *ext_der = NULL; + unsigned char *ext_der = nullptr; int ext_len = ASN1_item_i2d(reinterpret_cast(ext_struc), &ext_der, ASN1_ITEM_ptr(method->it)); if (ext_len < 0) { - return NULL; + return nullptr; } ASN1_OCTET_STRING *ext_oct = ASN1_OCTET_STRING_new(); - if (ext_oct == NULL) { + if (ext_oct == nullptr) { OPENSSL_free(ext_der); - return NULL; + return nullptr; } ASN1_STRING_set0(ext_oct, ext_der, ext_len); X509_EXTENSION *ext = - X509_EXTENSION_create_by_NID(NULL, ext_nid, crit, ext_oct); + X509_EXTENSION_create_by_NID(nullptr, ext_nid, crit, ext_oct); ASN1_OCTET_STRING_free(ext_oct); return ext; } @@ -182,7 +182,7 @@ X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc) { const X509V3_EXT_METHOD *method; if (!(method = X509V3_EXT_get_nid(ext_nid))) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_EXTENSION); - return NULL; + return nullptr; } return do_ext_i2d(method, ext_nid, crit, ext_struc); } @@ -266,14 +266,14 @@ static X509_EXTENSION *v3_generic_extension(const char *ext, const char *value, static unsigned char *generic_asn1(const char *value, const X509V3_CTX *ctx, size_t *ext_len) { ASN1_TYPE *typ = ASN1_generate_v3(value, ctx); - if (typ == NULL) { - return NULL; + if (typ == nullptr) { + return nullptr; } - unsigned char *ext_der = NULL; + unsigned char *ext_der = nullptr; int len = i2d_ASN1_TYPE(typ, &ext_der); ASN1_TYPE_free(typ); if (len < 0) { - return NULL; + return nullptr; } *ext_len = len; return ext_der; @@ -286,14 +286,14 @@ int X509V3_EXT_add_nconf_sk(const CONF *conf, const X509V3_CTX *ctx, const char *section, STACK_OF(X509_EXTENSION) **sk) { const STACK_OF(CONF_VALUE) *nval = NCONF_get_section(conf, section); - if (nval == NULL) { + if (nval == nullptr) { return 0; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { const CONF_VALUE *val = sk_CONF_VALUE_value(nval, i); X509_EXTENSION *ext = X509V3_EXT_nconf(conf, ctx, val->name, val->value); - int ok = ext != NULL && // - (sk == NULL || X509v3_add_ext(sk, ext, -1) != NULL); + int ok = ext != nullptr && // + (sk == nullptr || X509v3_add_ext(sk, ext, -1) != nullptr); X509_EXTENSION_free(ext); if (!ok) { return 0; @@ -306,9 +306,9 @@ int X509V3_EXT_add_nconf_sk(const CONF *conf, const X509V3_CTX *ctx, int X509V3_EXT_add_nconf(const CONF *conf, const X509V3_CTX *ctx, const char *section, X509 *cert) { - STACK_OF(X509_EXTENSION) **sk = NULL; + STACK_OF(X509_EXTENSION) **sk = nullptr; if (cert) { - sk = &cert->cert_info->extensions; + sk = &cert->extensions; } return X509V3_EXT_add_nconf_sk(conf, ctx, section, sk); } @@ -317,7 +317,7 @@ int X509V3_EXT_add_nconf(const CONF *conf, const X509V3_CTX *ctx, int X509V3_EXT_CRL_add_nconf(const CONF *conf, const X509V3_CTX *ctx, const char *section, X509_CRL *crl) { - STACK_OF(X509_EXTENSION) **sk = NULL; + STACK_OF(X509_EXTENSION) **sk = nullptr; if (crl) { sk = &crl->crl->extensions; } @@ -328,7 +328,7 @@ int X509V3_EXT_CRL_add_nconf(const CONF *conf, const X509V3_CTX *ctx, int X509V3_EXT_REQ_add_nconf(const CONF *conf, const X509V3_CTX *ctx, const char *section, X509_REQ *req) { - STACK_OF(X509_EXTENSION) *extlist = NULL, **sk = NULL; + STACK_OF(X509_EXTENSION) *extlist = nullptr, **sk = nullptr; int i; if (req) { sk = &extlist; @@ -346,9 +346,9 @@ int X509V3_EXT_REQ_add_nconf(const CONF *conf, const X509V3_CTX *ctx, const STACK_OF(CONF_VALUE) *X509V3_get_section(const X509V3_CTX *ctx, const char *section) { - if (ctx->db == NULL) { + if (ctx->db == nullptr) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_OPERATION_NOT_DEFINED); - return NULL; + return nullptr; } return NCONF_get_section(ctx->db, section); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_cpols.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_cpols.cc index 7664de21e9..217a808f4a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_cpols.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_cpols.cc @@ -48,17 +48,17 @@ const X509V3_EXT_METHOD v3_cpols = { NID_certificate_policies, 0, ASN1_ITEM_ref(CERTIFICATEPOLICIES), - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, i2r_certpol, r2i_certpol, - NULL, + nullptr, }; DECLARE_ASN1_ITEM(POLICYINFO) @@ -113,13 +113,13 @@ IMPLEMENT_ASN1_ALLOC_FUNCTIONS(NOTICEREF) static void *r2i_certpol(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const char *value) { STACK_OF(POLICYINFO) *pols = sk_POLICYINFO_new_null(); - if (pols == NULL) { - return NULL; + if (pols == nullptr) { + return nullptr; } STACK_OF(CONF_VALUE) *vals = X509V3_parse_list(value); { - if (vals == NULL) { + if (vals == nullptr) { OPENSSL_PUT_ERROR(X509V3, ERR_R_X509V3_LIB); goto err; } @@ -150,13 +150,13 @@ static void *r2i_certpol(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, } } else { ASN1_OBJECT *pobj = OBJ_txt2obj(cnf->name, 0); - if (pobj == NULL) { + if (pobj == nullptr) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER); X509V3_conf_err(cnf); goto err; } pol = POLICYINFO_new(); - if (pol == NULL) { + if (pol == nullptr) { ASN1_OBJECT_free(pobj); goto err; } @@ -174,7 +174,7 @@ static void *r2i_certpol(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, err: sk_CONF_VALUE_pop_free(vals, X509V3_conf_free); sk_POLICYINFO_pop_free(pols, POLICYINFO_free); - return NULL; + return nullptr; } static POLICYINFO *policy_section(const X509V3_CTX *ctx, @@ -207,12 +207,12 @@ static POLICYINFO *policy_section(const X509V3_CTX *ctx, goto err; } qual->pqualid = OBJ_nid2obj(NID_id_qt_cps); - if (qual->pqualid == NULL) { + if (qual->pqualid == nullptr) { OPENSSL_PUT_ERROR(X509V3, ERR_R_INTERNAL_ERROR); goto err; } qual->d.cpsuri = ASN1_IA5STRING_new(); - if (qual->d.cpsuri == NULL) { + if (qual->d.cpsuri == nullptr) { goto err; } if (!ASN1_STRING_set(qual->d.cpsuri, cnf->value, strlen(cnf->value))) { @@ -257,7 +257,7 @@ static POLICYINFO *policy_section(const X509V3_CTX *ctx, err: POLICYINFO_free(pol); - return NULL; + return nullptr; } static POLICYQUALINFO *notice_section(const X509V3_CTX *ctx, @@ -269,7 +269,7 @@ static POLICYQUALINFO *notice_section(const X509V3_CTX *ctx, goto err; } qual->pqualid = OBJ_nid2obj(NID_id_qt_unotice); - if (qual->pqualid == NULL) { + if (qual->pqualid == nullptr) { OPENSSL_PUT_ERROR(X509V3, ERR_R_INTERNAL_ERROR); goto err; } @@ -281,7 +281,7 @@ static POLICYQUALINFO *notice_section(const X509V3_CTX *ctx, const CONF_VALUE *cnf = sk_CONF_VALUE_value(unot, i); if (!strcmp(cnf->name, "explicitText")) { notice->exptext = ASN1_VISIBLESTRING_new(); - if (notice->exptext == NULL) { + if (notice->exptext == nullptr) { goto err; } if (!ASN1_STRING_set(notice->exptext, cnf->value, strlen(cnf->value))) { @@ -346,15 +346,15 @@ static POLICYQUALINFO *notice_section(const X509V3_CTX *ctx, err: POLICYQUALINFO_free(qual); - return NULL; + return nullptr; } static int nref_nos(STACK_OF(ASN1_INTEGER) *nnums, const STACK_OF(CONF_VALUE) *nos) { for (size_t i = 0; i < sk_CONF_VALUE_num(nos); i++) { const CONF_VALUE *cnf = sk_CONF_VALUE_value(nos, i); - ASN1_INTEGER *aint = s2i_ASN1_INTEGER(NULL, cnf->name); - if (aint == NULL) { + ASN1_INTEGER *aint = s2i_ASN1_INTEGER(nullptr, cnf->name); + if (aint == nullptr) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NUMBER); return 0; } @@ -423,11 +423,11 @@ static void print_notice(BIO *out, const USERNOTICE *notice, int indent) { if (i) { BIO_puts(out, ", "); } - if (num == NULL) { + if (num == nullptr) { BIO_puts(out, "(null)"); } else { - tmp = i2s_ASN1_INTEGER(NULL, num); - if (tmp == NULL) { + tmp = i2s_ASN1_INTEGER(nullptr, num); + if (tmp == nullptr) { return; } BIO_puts(out, tmp); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_crld.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_crld.cc index 5ba89d1794..22f9835fad 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_crld.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_crld.cc @@ -35,40 +35,31 @@ const X509V3_EXT_METHOD v3_crld = { NID_crl_distribution_points, 0, ASN1_ITEM_ref(CRL_DIST_POINTS), - 0, - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, v2i_crld, i2r_crldp, - 0, - NULL, + nullptr, + nullptr, }; const X509V3_EXT_METHOD v3_freshest_crl = { - NID_freshest_crl, - 0, - ASN1_ITEM_ref(CRL_DIST_POINTS), - 0, - 0, - 0, - 0, - 0, - 0, - 0, - v2i_crld, - i2r_crldp, - 0, - NULL, + NID_freshest_crl, 0, ASN1_ITEM_ref(CRL_DIST_POINTS), + nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, + nullptr, v2i_crld, i2r_crldp, + nullptr, nullptr, }; static STACK_OF(GENERAL_NAME) *gnames_from_sectname(const X509V3_CTX *ctx, char *sect) { const STACK_OF(CONF_VALUE) *gnsect; - STACK_OF(CONF_VALUE) *gnsect_owned = NULL; + STACK_OF(CONF_VALUE) *gnsect_owned = nullptr; if (*sect == '@') { gnsect = X509V3_get_section(ctx, sect + 1); } else { @@ -77,9 +68,9 @@ static STACK_OF(GENERAL_NAME) *gnames_from_sectname(const X509V3_CTX *ctx, } if (!gnsect) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_SECTION_NOT_FOUND); - return NULL; + return nullptr; } - STACK_OF(GENERAL_NAME) *gens = v2i_GENERAL_NAMES(NULL, ctx, gnsect); + STACK_OF(GENERAL_NAME) *gens = v2i_GENERAL_NAMES(nullptr, ctx, gnsect); sk_CONF_VALUE_pop_free(gnsect_owned, X509V3_conf_free); return gens; } @@ -90,12 +81,12 @@ static STACK_OF(GENERAL_NAME) *gnames_from_sectname(const X509V3_CTX *ctx, // additional syntax. static int set_dist_point_name(DIST_POINT_NAME **pdp, const X509V3_CTX *ctx, const CONF_VALUE *cnf) { - STACK_OF(GENERAL_NAME) *fnm = NULL; - STACK_OF(X509_NAME_ENTRY) *rnm = NULL; + STACK_OF(GENERAL_NAME) *fnm = nullptr; + STACK_OF(X509_NAME_ENTRY) *rnm = nullptr; if (!strncmp(cnf->name, "fullname", 9)) { // If |cnf| comes from |X509V3_parse_list|, which is possible for a v2i // function, |cnf->value| may be NULL. - if (cnf->value == NULL) { + if (cnf->value == nullptr) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE); return -1; } @@ -106,7 +97,7 @@ static int set_dist_point_name(DIST_POINT_NAME **pdp, const X509V3_CTX *ctx, } else if (!strcmp(cnf->name, "relativename")) { // If |cnf| comes from |X509V3_parse_list|, which is possible for a v2i // function, |cnf->value| may be NULL. - if (cnf->value == NULL) { + if (cnf->value == nullptr) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE); return -1; } @@ -121,7 +112,7 @@ static int set_dist_point_name(DIST_POINT_NAME **pdp, const X509V3_CTX *ctx, } int ret = X509V3_NAME_from_section(nm, dnsect, MBSTRING_ASC); rnm = nm->entries; - nm->entries = NULL; + nm->entries = nullptr; X509_NAME_free(nm); if (!ret || sk_X509_NAME_ENTRY_num(rnm) <= 0) { goto err; @@ -170,7 +161,7 @@ static const BIT_STRING_BITNAME reason_flags[] = { {6, "Certificate Hold", "certificateHold"}, {7, "Privilege Withdrawn", "privilegeWithdrawn"}, {8, "AA Compromise", "AACompromise"}, - {-1, NULL, NULL}}; + {-1, nullptr, nullptr}}; static int set_reasons(ASN1_BIT_STRING **preas, const char *value) { if (*preas) { @@ -236,7 +227,7 @@ static int print_reasons(BIO *out, const char *rname, ASN1_BIT_STRING *rflags, static DIST_POINT *crldp_from_section(const X509V3_CTX *ctx, const STACK_OF(CONF_VALUE) *nval) { - DIST_POINT *point = NULL; + DIST_POINT *point = nullptr; point = DIST_POINT_new(); if (!point) { goto err; @@ -267,14 +258,14 @@ static DIST_POINT *crldp_from_section(const X509V3_CTX *ctx, err: DIST_POINT_free(point); - return NULL; + return nullptr; } static void *v2i_crld(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const STACK_OF(CONF_VALUE) *nval) { - STACK_OF(DIST_POINT) *crld = NULL; - GENERAL_NAMES *gens = NULL; - GENERAL_NAME *gen = NULL; + STACK_OF(DIST_POINT) *crld = nullptr; + GENERAL_NAMES *gens = nullptr; + GENERAL_NAME *gen = nullptr; if (!(crld = sk_DIST_POINT_new_null())) { goto err; } @@ -304,7 +295,7 @@ static void *v2i_crld(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, if (!sk_GENERAL_NAME_push(gens, gen)) { goto err; } - gen = NULL; + gen = nullptr; if (!(point = DIST_POINT_new())) { goto err; } @@ -317,7 +308,7 @@ static void *v2i_crld(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, } point->distpoint->name.fullname = gens; point->distpoint->type = 0; - gens = NULL; + gens = nullptr; } } return crld; @@ -326,7 +317,7 @@ err: GENERAL_NAME_free(gen); GENERAL_NAMES_free(gens); sk_DIST_POINT_pop_free(crld, DIST_POINT_free); - return NULL; + return nullptr; } static int dpn_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, @@ -335,7 +326,7 @@ static int dpn_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, switch (operation) { case ASN1_OP_NEW_POST: - dpn->dpname = NULL; + dpn->dpname = nullptr; break; case ASN1_OP_FREE_POST: @@ -365,7 +356,7 @@ ASN1_ITEM_TEMPLATE(CRL_DIST_POINTS) = ASN1_EX_TEMPLATE_TYPE( ASN1_TFLG_SEQUENCE_OF, 0, CRLDistributionPoints, DIST_POINT) ASN1_ITEM_TEMPLATE_END(CRL_DIST_POINTS) -IMPLEMENT_ASN1_FUNCTIONS(CRL_DIST_POINTS) +IMPLEMENT_ASN1_FUNCTIONS_const(CRL_DIST_POINTS) ASN1_SEQUENCE(ISSUING_DIST_POINT) = { ASN1_EXP_OPT(ISSUING_DIST_POINT, distpoint, DIST_POINT_NAME, 0), @@ -376,7 +367,7 @@ ASN1_SEQUENCE(ISSUING_DIST_POINT) = { ASN1_IMP_OPT(ISSUING_DIST_POINT, onlyattr, ASN1_FBOOLEAN, 5), } ASN1_SEQUENCE_END(ISSUING_DIST_POINT) -IMPLEMENT_ASN1_FUNCTIONS(ISSUING_DIST_POINT) +IMPLEMENT_ASN1_FUNCTIONS_const(ISSUING_DIST_POINT) static int i2r_idp(const X509V3_EXT_METHOD *method, void *pidp, BIO *out, int indent); @@ -387,17 +378,17 @@ const X509V3_EXT_METHOD v3_idp = { NID_issuing_distribution_point, X509V3_EXT_MULTILINE, ASN1_ITEM_ref(ISSUING_DIST_POINT), - 0, - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, v2i_idp, i2r_idp, - 0, - NULL, + nullptr, + nullptr, }; static void *v2i_idp(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, @@ -447,7 +438,7 @@ static void *v2i_idp(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, err: ISSUING_DIST_POINT_free(idp); - return NULL; + return nullptr; } static int print_gens(BIO *out, STACK_OF(GENERAL_NAME) *gens, int indent) { @@ -542,14 +533,14 @@ int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn, X509_NAME *iname) { ne = sk_X509_NAME_ENTRY_value(frag, i); if (!X509_NAME_add_entry(dpn->dpname, ne, -1, i ? 0 : 1)) { X509_NAME_free(dpn->dpname); - dpn->dpname = NULL; + dpn->dpname = nullptr; return 0; } } // generate cached encoding of name - if (i2d_X509_NAME(dpn->dpname, NULL) < 0) { + if (i2d_X509_NAME(dpn->dpname, nullptr) < 0) { X509_NAME_free(dpn->dpname); - dpn->dpname = NULL; + dpn->dpname = nullptr; return 0; } return 1; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_enum.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_enum.cc index 95ee398905..d467553171 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_enum.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_enum.cc @@ -38,7 +38,7 @@ static const ENUMERATED_NAMES crl_reasons[] = { {CRL_REASON_PRIVILEGE_WITHDRAWN, "Privilege Withdrawn", "privilegeWithdrawn"}, {CRL_REASON_AA_COMPROMISE, "AA Compromise", "AACompromise"}, - {-1, NULL, NULL}}; + {-1, nullptr, nullptr}}; static char *i2s_ASN1_ENUMERATED_TABLE(const X509V3_EXT_METHOD *method, void *ext) { @@ -58,15 +58,15 @@ const X509V3_EXT_METHOD v3_crl_reason = { NID_crl_reason, 0, ASN1_ITEM_ref(ASN1_ENUMERATED), - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, i2s_ASN1_ENUMERATED_TABLE, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, (void *)crl_reasons, }; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_extku.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_extku.cc index 15bcc5170d..441557bc8f 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_extku.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_extku.cc @@ -33,17 +33,17 @@ const X509V3_EXT_METHOD v3_ext_ku = { NID_ext_key_usage, 0, ASN1_ITEM_ref(EXTENDED_KEY_USAGE), - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, i2v_EXTENDED_KEY_USAGE, v2i_EXTENDED_KEY_USAGE, - 0, - 0, - NULL, + nullptr, + nullptr, + nullptr, }; ASN1_ITEM_TEMPLATE(EXTENDED_KEY_USAGE) = ASN1_EX_TEMPLATE_TYPE( @@ -60,7 +60,7 @@ static STACK_OF(CONF_VALUE) *i2v_EXTENDED_KEY_USAGE( const ASN1_OBJECT *obj = sk_ASN1_OBJECT_value(eku, i); char obj_tmp[80]; i2t_ASN1_OBJECT(obj_tmp, 80, obj); - X509V3_add_value(NULL, obj_tmp, &ext_list); + X509V3_add_value(nullptr, obj_tmp, &ext_list); } return ext_list; } @@ -69,8 +69,8 @@ static void *v2i_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const STACK_OF(CONF_VALUE) *nval) { EXTENDED_KEY_USAGE *extku = sk_ASN1_OBJECT_new_null(); - if (extku == NULL) { - return NULL; + if (extku == nullptr) { + return nullptr; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { @@ -82,12 +82,12 @@ static void *v2i_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD *method, extval = val->name; } ASN1_OBJECT *obj = OBJ_txt2obj(extval, 0); - if (obj == NULL || !sk_ASN1_OBJECT_push(extku, obj)) { + if (obj == nullptr || !sk_ASN1_OBJECT_push(extku, obj)) { ASN1_OBJECT_free(obj); sk_ASN1_OBJECT_pop_free(extku, ASN1_OBJECT_free); OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER); X509V3_conf_err(val); - return NULL; + return nullptr; } } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_genn.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_genn.cc index 63d4cf25e0..5d0d4e4393 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_genn.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_genn.cc @@ -53,25 +53,25 @@ ASN1_CHOICE(GENERAL_NAME) = { ASN1_IMP(GENERAL_NAME, d.registeredID, ASN1_OBJECT, GEN_RID), } ASN1_CHOICE_END(GENERAL_NAME) -IMPLEMENT_ASN1_FUNCTIONS(GENERAL_NAME) +IMPLEMENT_ASN1_FUNCTIONS_const(GENERAL_NAME) ASN1_ITEM_TEMPLATE(GENERAL_NAMES) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, GeneralNames, GENERAL_NAME) ASN1_ITEM_TEMPLATE_END(GENERAL_NAMES) -IMPLEMENT_ASN1_FUNCTIONS(GENERAL_NAMES) +IMPLEMENT_ASN1_FUNCTIONS_const(GENERAL_NAMES) -IMPLEMENT_ASN1_DUP_FUNCTION(GENERAL_NAME) +IMPLEMENT_ASN1_DUP_FUNCTION_const(GENERAL_NAME) static int edipartyname_cmp(const EDIPARTYNAME *a, const EDIPARTYNAME *b) { // nameAssigner is optional and may be NULL. - if (a->nameAssigner == NULL) { - if (b->nameAssigner != NULL) { + if (a->nameAssigner == nullptr) { + if (b->nameAssigner != nullptr) { return -1; } } else { - if (b->nameAssigner == NULL || + if (b->nameAssigner == nullptr || ASN1_STRING_cmp(a->nameAssigner, b->nameAssigner) != 0) { return -1; } @@ -195,7 +195,7 @@ void *GENERAL_NAME_get0_value(const GENERAL_NAME *a, int *out_type) { return a->d.rid; default: - return NULL; + return nullptr; } } @@ -218,10 +218,10 @@ int GENERAL_NAME_get0_otherName(const GENERAL_NAME *gen, ASN1_OBJECT **out_oid, if (gen->type != GEN_OTHERNAME) { return 0; } - if (out_oid != NULL) { + if (out_oid != nullptr) { *out_oid = gen->d.otherName->type_id; } - if (out_value != NULL) { + if (out_value != nullptr) { *out_value = gen->d.otherName->value; } return 1; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_ia5.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_ia5.cc index 36f9e65285..e950aac781 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_ia5.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_ia5.cc @@ -30,10 +30,10 @@ static char *i2s_ASN1_IA5STRING(const X509V3_EXT_METHOD *method, void *ext) { const ASN1_IA5STRING *ia5 = reinterpret_cast(ext); char *tmp; if (!ia5 || !ia5->length) { - return NULL; + return nullptr; } if (!(tmp = reinterpret_cast(OPENSSL_malloc(ia5->length + 1)))) { - return NULL; + return nullptr; } OPENSSL_memcpy(tmp, ia5->data, ia5->length); tmp[ia5->length] = 0; @@ -45,7 +45,7 @@ static void *s2i_ASN1_IA5STRING(const X509V3_EXT_METHOD *method, ASN1_IA5STRING *ia5; if (!str) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_ARGUMENT); - return NULL; + return nullptr; } if (!(ia5 = ASN1_IA5STRING_new())) { goto err; @@ -56,13 +56,13 @@ static void *s2i_ASN1_IA5STRING(const X509V3_EXT_METHOD *method, } return ia5; err: - return NULL; + return nullptr; } #define EXT_IA5STRING(nid) \ { \ nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), 0, 0, 0, 0, i2s_ASN1_IA5STRING, \ - s2i_ASN1_IA5STRING, 0, 0, 0, 0, NULL \ + s2i_ASN1_IA5STRING, 0, 0, 0, 0, nullptr \ } const X509V3_EXT_METHOD v3_netscape_base_url = diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_info.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_info.cc index 00b4744fbf..0e09fa0e50 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_info.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_info.cc @@ -36,34 +36,34 @@ const X509V3_EXT_METHOD v3_info = { NID_info_access, X509V3_EXT_MULTILINE, ASN1_ITEM_ref(AUTHORITY_INFO_ACCESS), - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, i2v_AUTHORITY_INFO_ACCESS, v2i_AUTHORITY_INFO_ACCESS, - 0, - 0, - NULL, + nullptr, + nullptr, + nullptr, }; const X509V3_EXT_METHOD v3_sinfo = { NID_sinfo_access, X509V3_EXT_MULTILINE, ASN1_ITEM_ref(AUTHORITY_INFO_ACCESS), - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, i2v_AUTHORITY_INFO_ACCESS, v2i_AUTHORITY_INFO_ACCESS, - 0, - 0, - NULL, + nullptr, + nullptr, + nullptr, }; ASN1_SEQUENCE(ACCESS_DESCRIPTION) = { @@ -77,7 +77,7 @@ ASN1_ITEM_TEMPLATE(AUTHORITY_INFO_ACCESS) = ASN1_EX_TEMPLATE_TYPE( ASN1_TFLG_SEQUENCE_OF, 0, GeneralNames, ACCESS_DESCRIPTION) ASN1_ITEM_TEMPLATE_END(AUTHORITY_INFO_ACCESS) -IMPLEMENT_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS) +IMPLEMENT_ASN1_FUNCTIONS_const(AUTHORITY_INFO_ACCESS) static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_INFO_ACCESS( const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *ret) { @@ -93,7 +93,7 @@ static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_INFO_ACCESS( desc = sk_ACCESS_DESCRIPTION_value(ainfo, i); tmp = i2v_GENERAL_NAME(method, desc->location, tret); - if (tmp == NULL) { + if (tmp == nullptr) { goto err; } tret = tmp; @@ -106,16 +106,16 @@ static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_INFO_ACCESS( OPENSSL_free(vtmp->name); vtmp->name = name; } - if (ret == NULL && tret == NULL) { + if (ret == nullptr && tret == nullptr) { return sk_CONF_VALUE_new_null(); } return tret; err: - if (ret == NULL && tret != NULL) { + if (ret == nullptr && tret != nullptr) { sk_CONF_VALUE_pop_free(tret, X509V3_conf_free); } - return NULL; + return nullptr; } static void *v2i_AUTHORITY_INFO_ACCESS(const X509V3_EXT_METHOD *method, diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_int.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_int.cc index 8f4942fa5a..b28a6254a2 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_int.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_int.cc @@ -33,49 +33,49 @@ const X509V3_EXT_METHOD v3_crl_num = { NID_crl_number, 0, ASN1_ITEM_ref(ASN1_INTEGER), - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, i2s_ASN1_INTEGER_cb, - 0, - 0, - 0, - 0, - 0, - NULL, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, }; const X509V3_EXT_METHOD v3_delta_crl = { NID_delta_crl, 0, ASN1_ITEM_ref(ASN1_INTEGER), - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, i2s_ASN1_INTEGER_cb, - 0, - 0, - 0, - 0, - 0, - NULL, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, }; const X509V3_EXT_METHOD v3_inhibit_anyp = { NID_inhibit_any_policy, 0, ASN1_ITEM_ref(ASN1_INTEGER), - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, i2s_ASN1_INTEGER_cb, s2i_asn1_int, - 0, - 0, - 0, - 0, - NULL, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, }; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_lib.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_lib.cc index dadc978bf1..64b790c582 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_lib.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_lib.cc @@ -27,7 +27,7 @@ DEFINE_STACK_OF(X509V3_EXT_METHOD) -static STACK_OF(X509V3_EXT_METHOD) *ext_list = NULL; +static STACK_OF(X509V3_EXT_METHOD) *ext_list = nullptr; static int ext_stack_cmp(const X509V3_EXT_METHOD *const *a, const X509V3_EXT_METHOD *const *b) { @@ -36,7 +36,7 @@ static int ext_stack_cmp(const X509V3_EXT_METHOD *const *a, int X509V3_EXT_add(X509V3_EXT_METHOD *ext) { // We only support |ASN1_ITEM|-based extensions. - assert(ext->it != NULL); + assert(ext->it != nullptr); // TODO(davidben): This should be locked. Also check for duplicates. if (!ext_list && !(ext_list = sk_X509V3_EXT_METHOD_new(ext_stack_cmp))) { @@ -131,14 +131,14 @@ const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid) { const X509V3_EXT_METHOD *X509V3_EXT_get(const X509_EXTENSION *ext) { int nid; if ((nid = OBJ_obj2nid(ext->object)) == NID_undef) { - return NULL; + return nullptr; } return X509V3_EXT_get_nid(nid); } int X509V3_EXT_free(int nid, void *ext_data) { const X509V3_EXT_METHOD *ext_method = X509V3_EXT_get_nid(nid); - if (ext_method == NULL) { + if (ext_method == nullptr) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_CANNOT_FIND_FREE_FUNCTION); return 0; } @@ -180,20 +180,20 @@ void *X509V3_EXT_d2i(const X509_EXTENSION *ext) { const unsigned char *p; if (!(method = X509V3_EXT_get(ext))) { - return NULL; + return nullptr; } p = ext->value->data; void *ret = - ASN1_item_d2i(NULL, &p, ext->value->length, ASN1_ITEM_ptr(method->it)); - if (ret == NULL) { - return NULL; + ASN1_item_d2i(nullptr, &p, ext->value->length, ASN1_ITEM_ptr(method->it)); + if (ret == nullptr) { + return nullptr; } // Check for trailing data. if (p != ext->value->data + ext->value->length) { ASN1_item_free(reinterpret_cast(ret), ASN1_ITEM_ptr(method->it)); OPENSSL_PUT_ERROR(X509V3, X509V3_R_TRAILING_DATA_IN_EXTENSION); - return NULL; + return nullptr; } return ret; } @@ -201,7 +201,7 @@ void *X509V3_EXT_d2i(const X509_EXTENSION *ext) { void *X509V3_get_d2i(const STACK_OF(X509_EXTENSION) *extensions, int nid, int *out_critical, int *out_idx) { int lastpos; - X509_EXTENSION *ex, *found_ex = NULL; + X509_EXTENSION *ex, *found_ex = nullptr; if (!extensions) { if (out_idx) { *out_idx = -1; @@ -209,7 +209,7 @@ void *X509V3_get_d2i(const STACK_OF(X509_EXTENSION) *extensions, int nid, if (out_critical) { *out_critical = -1; } - return NULL; + return nullptr; } if (out_idx) { lastpos = *out_idx + 1; @@ -233,7 +233,7 @@ void *X509V3_get_d2i(const STACK_OF(X509_EXTENSION) *extensions, int nid, if (out_critical) { *out_critical = -2; } - return NULL; + return nullptr; } found_ex = ex; } @@ -253,7 +253,7 @@ void *X509V3_get_d2i(const STACK_OF(X509_EXTENSION) *extensions, int nid, if (out_critical) { *out_critical = -1; } - return NULL; + return nullptr; } // This function is a general extension append, replace and delete utility. @@ -263,8 +263,8 @@ void *X509V3_get_d2i(const STACK_OF(X509_EXTENSION) *extensions, int nid, int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, int crit, unsigned long flags) { int errcode, extidx = -1; - X509_EXTENSION *ext = NULL, *extmp; - STACK_OF(X509_EXTENSION) *ret = NULL; + X509_EXTENSION *ext = nullptr, *extmp; + STACK_OF(X509_EXTENSION) *ret = nullptr; unsigned long ext_op = flags & X509V3_ADD_OP_MASK; // If appending we don't care if it exists, otherwise look for existing @@ -287,7 +287,7 @@ int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, // If delete, just delete it if (ext_op == X509V3_ADD_DELETE) { X509_EXTENSION *prev_ext = sk_X509_EXTENSION_delete(*x, extidx); - if (prev_ext == NULL) { + if (prev_ext == nullptr) { return -1; } X509_EXTENSION_free(prev_ext); @@ -322,7 +322,8 @@ int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, return 1; } - if ((ret = *x) == NULL && (ret = sk_X509_EXTENSION_new_null()) == NULL) { + if ((ret = *x) == nullptr && + (ret = sk_X509_EXTENSION_new_null()) == nullptr) { goto m_fail; } if (!sk_X509_EXTENSION_push(ret, ext)) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_ncons.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_ncons.cc index 7661ea8403..95457e4f2a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_ncons.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_ncons.cc @@ -32,13 +32,13 @@ static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, static int i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, void *a, BIO *bp, int ind); static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method, - STACK_OF(GENERAL_SUBTREE) *trees, BIO *bp, - int ind, const char *name); + const STACK_OF(GENERAL_SUBTREE) *trees, + BIO *bp, int ind, const char *name); static int print_nc_ipadd(BIO *bp, const ASN1_OCTET_STRING *ip); -static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc); -static int nc_match_single(GENERAL_NAME *sub, GENERAL_NAME *gen); -static int nc_dn(X509_NAME *sub, X509_NAME *nm); +static int nc_match(const GENERAL_NAME *gen, const NAME_CONSTRAINTS *nc); +static int nc_match_single(const GENERAL_NAME *sub, const GENERAL_NAME *gen); +static int nc_dn(const X509_NAME *sub, const X509_NAME *nm); static int nc_dns(const ASN1_IA5STRING *sub, const ASN1_IA5STRING *dns); static int nc_email(const ASN1_IA5STRING *sub, const ASN1_IA5STRING *eml); static int nc_uri(const ASN1_IA5STRING *uri, const ASN1_IA5STRING *base); @@ -47,17 +47,17 @@ const X509V3_EXT_METHOD v3_name_constraints = { NID_name_constraints, 0, ASN1_ITEM_ref(NAME_CONSTRAINTS), - 0, - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, v2i_NAME_CONSTRAINTS, i2r_NAME_CONSTRAINTS, - 0, - NULL, + nullptr, + nullptr, }; ASN1_SEQUENCE(GENERAL_SUBTREE) = { @@ -80,9 +80,9 @@ IMPLEMENT_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const STACK_OF(CONF_VALUE) *nval) { - STACK_OF(GENERAL_SUBTREE) **ptree = NULL; - NAME_CONSTRAINTS *ncons = NULL; - GENERAL_SUBTREE *sub = NULL; + STACK_OF(GENERAL_SUBTREE) **ptree = nullptr; + NAME_CONSTRAINTS *ncons = nullptr; + GENERAL_SUBTREE *sub = nullptr; ncons = NAME_CONSTRAINTS_new(); if (!ncons) { goto err; @@ -111,7 +111,7 @@ static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, if (!*ptree || !sk_GENERAL_SUBTREE_push(*ptree, sub)) { goto err; } - sub = NULL; + sub = nullptr; } return ncons; @@ -119,7 +119,7 @@ static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, err: NAME_CONSTRAINTS_free(ncons); GENERAL_SUBTREE_free(sub); - return NULL; + return nullptr; } static int i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, void *a, @@ -132,15 +132,12 @@ static int i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, void *a, } static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method, - STACK_OF(GENERAL_SUBTREE) *trees, BIO *bp, - int ind, const char *name) { - GENERAL_SUBTREE *tree; - size_t i; + const STACK_OF(GENERAL_SUBTREE) *trees, + BIO *bp, int ind, const char *name) { if (sk_GENERAL_SUBTREE_num(trees) > 0) { BIO_printf(bp, "%*s%s:\n", ind, "", name); } - for (i = 0; i < sk_GENERAL_SUBTREE_num(trees); i++) { - tree = sk_GENERAL_SUBTREE_value(trees, i); + for (const GENERAL_SUBTREE *tree : trees) { BIO_printf(bp, "%*s", ind + 2, ""); if (tree->base->type == GEN_IPADD) { print_nc_ipadd(bp, tree->base->d.ip); @@ -191,12 +188,8 @@ static int print_nc_ipadd(BIO *bp, const ASN1_OCTET_STRING *ip) { // syntax. // X509_V_ERR_UNSUPPORTED_NAME_SYNTAX: Bad or unsupported syntax of name. -int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) { - int r, i; - size_t j; - X509_NAME *nm; - - nm = X509_get_subject_name(x); +int NAME_CONSTRAINTS_check(const X509 *x, const NAME_CONSTRAINTS *nc) { + const X509_NAME *nm = X509_get_subject_name(x); // Guard against certificates with an excessive number of names or // constraints causing a computationally expensive name constraints @@ -216,10 +209,9 @@ int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) { if (X509_NAME_entry_count(nm) > 0) { GENERAL_NAME gntmp; gntmp.type = GEN_DIRNAME; - gntmp.d.directoryName = nm; - - r = nc_match(&gntmp, nc); + gntmp.d.directoryName = const_cast(nm); + int r = nc_match(&gntmp, nc); if (r != X509_V_OK) { return r; } @@ -227,8 +219,7 @@ int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) { gntmp.type = GEN_EMAIL; // Process any email address attributes in subject name - - for (i = -1;;) { + for (int i = -1;;) { i = X509_NAME_get_index_by_NID(nm, NID_pkcs9_emailAddress, i); if (i == -1) { break; @@ -240,16 +231,14 @@ int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) { } r = nc_match(&gntmp, nc); - if (r != X509_V_OK) { return r; } } } - for (j = 0; j < sk_GENERAL_NAME_num(x->altname); j++) { - GENERAL_NAME *gen = sk_GENERAL_NAME_value(x->altname, j); - r = nc_match(gen, nc); + for (const GENERAL_NAME *gen : x->altname) { + int r = nc_match(gen, nc); if (r != X509_V_OK) { return r; } @@ -258,16 +247,11 @@ int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) { return X509_V_OK; } -static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) { - GENERAL_SUBTREE *sub; - int r, match = 0; - size_t i; - +static int nc_match(const GENERAL_NAME *gen, const NAME_CONSTRAINTS *nc) { // Permitted subtrees: if any subtrees exist of matching the type at // least one subtree must match. - - for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->permittedSubtrees); i++) { - sub = sk_GENERAL_SUBTREE_value(nc->permittedSubtrees, i); + int match = 0; + for (const GENERAL_SUBTREE *sub : nc->permittedSubtrees) { if (gen->type != sub->base->type) { continue; } @@ -281,7 +265,7 @@ static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) { if (match == 0) { match = 1; } - r = nc_match_single(gen, sub->base); + int r = nc_match_single(gen, sub->base); if (r == X509_V_OK) { match = 2; } else if (r != X509_V_ERR_PERMITTED_VIOLATION) { @@ -294,9 +278,7 @@ static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) { } // Excluded subtrees: must not match any of these - - for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->excludedSubtrees); i++) { - sub = sk_GENERAL_SUBTREE_value(nc->excludedSubtrees, i); + for (const GENERAL_SUBTREE *sub : nc->excludedSubtrees) { if (gen->type != sub->base->type) { continue; } @@ -304,7 +286,7 @@ static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) { return X509_V_ERR_SUBTREE_MINMAX; } - r = nc_match_single(gen, sub->base); + int r = nc_match_single(gen, sub->base); if (r == X509_V_OK) { return X509_V_ERR_EXCLUDED_VIOLATION; } else if (r != X509_V_ERR_PERMITTED_VIOLATION) { @@ -315,7 +297,7 @@ static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) { return X509_V_OK; } -static int nc_match_single(GENERAL_NAME *gen, GENERAL_NAME *base) { +static int nc_match_single(const GENERAL_NAME *gen, const GENERAL_NAME *base) { switch (base->type) { case GEN_DIRNAME: return nc_dn(gen->d.directoryName, base->d.directoryName); @@ -339,18 +321,20 @@ static int nc_match_single(GENERAL_NAME *gen, GENERAL_NAME *base) { // X509_NAME makes this comparison easy. It is matched if the subtree is a // subset of the name. -static int nc_dn(X509_NAME *nm, X509_NAME *base) { - // Ensure canonical encodings are up to date. - if (nm->modified && i2d_X509_NAME(nm, NULL) < 0) { +static int nc_dn(const X509_NAME *nm, const X509_NAME *base) { + const X509_NAME_CACHE *nm_cache = x509_name_get_cache(nm); + if (nm_cache == nullptr) { return X509_V_ERR_OUT_OF_MEM; } - if (base->modified && i2d_X509_NAME(base, NULL) < 0) { + const X509_NAME_CACHE *base_cache = x509_name_get_cache(base); + if (base_cache == nullptr) { return X509_V_ERR_OUT_OF_MEM; } - if (base->canon_enclen > nm->canon_enclen) { + if (base_cache->canon_len > nm_cache->canon_len) { return X509_V_ERR_PERMITTED_VIOLATION; } - if (OPENSSL_memcmp(base->canon_enc, nm->canon_enc, base->canon_enclen)) { + if (OPENSSL_memcmp(base_cache->canon, nm_cache->canon, + base_cache->canon_len)) { return X509_V_ERR_PERMITTED_VIOLATION; } return X509_V_OK; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_ocsp.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_ocsp.cc index d0a5d672f2..1cc55641c8 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_ocsp.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_ocsp.cc @@ -34,34 +34,34 @@ const X509V3_EXT_METHOD v3_crl_invdate = { NID_invalidity_date, 0, ASN1_ITEM_ref(ASN1_GENERALIZEDTIME), - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, i2r_ocsp_acutoff, - 0, - NULL, + nullptr, + nullptr, }; const X509V3_EXT_METHOD v3_ocsp_nocheck = { NID_id_pkix_OCSP_noCheck, 0, ASN1_ITEM_ref(ASN1_NULL), - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, s2i_ocsp_nocheck, - 0, - 0, + nullptr, + nullptr, i2r_ocsp_nocheck, - 0, - NULL, + nullptr, + nullptr, }; static int i2r_ocsp_acutoff(const X509V3_EXT_METHOD *method, void *cutoff, diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_pcons.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_pcons.cc index 417f1ad4aa..5943949d4c 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_pcons.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_pcons.cc @@ -36,17 +36,17 @@ const X509V3_EXT_METHOD v3_policy_constraints = { NID_policy_constraints, 0, ASN1_ITEM_ref(POLICY_CONSTRAINTS), - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, i2v_POLICY_CONSTRAINTS, v2i_POLICY_CONSTRAINTS, - NULL, - NULL, - NULL}; + nullptr, + nullptr, + nullptr}; ASN1_SEQUENCE(POLICY_CONSTRAINTS) = { ASN1_IMP_OPT(POLICY_CONSTRAINTS, requireExplicitPolicy, ASN1_INTEGER, 0), @@ -68,9 +68,9 @@ static STACK_OF(CONF_VALUE) *i2v_POLICY_CONSTRAINTS( static void *v2i_POLICY_CONSTRAINTS(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const STACK_OF(CONF_VALUE) *values) { - POLICY_CONSTRAINTS *pcons = NULL; + POLICY_CONSTRAINTS *pcons = nullptr; if (!(pcons = POLICY_CONSTRAINTS_new())) { - return NULL; + return nullptr; } for (size_t i = 0; i < sk_CONF_VALUE_num(values); i++) { const CONF_VALUE *val = sk_CONF_VALUE_value(values, i); @@ -96,5 +96,5 @@ static void *v2i_POLICY_CONSTRAINTS(const X509V3_EXT_METHOD *method, return pcons; err: POLICY_CONSTRAINTS_free(pcons); - return NULL; + return nullptr; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_pmaps.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_pmaps.cc index 62ccb1bfdc..c1b82e6e05 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_pmaps.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_pmaps.cc @@ -33,17 +33,17 @@ const X509V3_EXT_METHOD v3_policy_mappings = { NID_policy_mappings, 0, ASN1_ITEM_ref(POLICY_MAPPINGS), - 0, - 0, - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, i2v_POLICY_MAPPINGS, v2i_POLICY_MAPPINGS, - 0, - 0, - NULL, + nullptr, + nullptr, + nullptr, }; ASN1_SEQUENCE(POLICY_MAPPING) = { @@ -74,8 +74,8 @@ static void *v2i_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const STACK_OF(CONF_VALUE) *nval) { POLICY_MAPPINGS *pmaps = sk_POLICY_MAPPING_new_null(); - if (pmaps == NULL) { - return NULL; + if (pmaps == nullptr) { + return nullptr; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { @@ -87,7 +87,7 @@ static void *v2i_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method, } POLICY_MAPPING *pmap = POLICY_MAPPING_new(); - if (pmap == NULL || !sk_POLICY_MAPPING_push(pmaps, pmap)) { + if (pmap == nullptr || !sk_POLICY_MAPPING_push(pmaps, pmap)) { POLICY_MAPPING_free(pmap); goto err; } @@ -104,5 +104,5 @@ static void *v2i_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method, err: sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free); - return NULL; + return nullptr; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_prn.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_prn.cc index fb6119e857..74f22e986a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_prn.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_prn.cc @@ -63,19 +63,19 @@ static void X509V3_EXT_val_prn(BIO *out, const STACK_OF(CONF_VALUE) *val, int X509V3_EXT_print(BIO *out, const X509_EXTENSION *ext, unsigned long flag, int indent) { const X509V3_EXT_METHOD *method = X509V3_EXT_get(ext); - if (method == NULL) { + if (method == nullptr) { return unknown_ext_print(out, ext, flag, indent, 0); } const ASN1_STRING *ext_data = X509_EXTENSION_get_data(ext); const unsigned char *p = ASN1_STRING_get0_data(ext_data); - void *ext_str = ASN1_item_d2i(NULL, &p, ASN1_STRING_length(ext_data), + void *ext_str = ASN1_item_d2i(nullptr, &p, ASN1_STRING_length(ext_data), ASN1_ITEM_ptr(method->it)); if (!ext_str) { return unknown_ext_print(out, ext, flag, indent, 1); } - char *value = NULL; - STACK_OF(CONF_VALUE) *nval = NULL; + char *value = nullptr; + STACK_OF(CONF_VALUE) *nval = nullptr; int ok = 0; if (method->i2s) { if (!(value = method->i2s(method, ext_str))) { @@ -83,7 +83,7 @@ int X509V3_EXT_print(BIO *out, const X509_EXTENSION *ext, unsigned long flag, } BIO_printf(out, "%*s%s", indent, "", value); } else if (method->i2v) { - if (!(nval = method->i2v(method, ext_str, NULL))) { + if (!(nval = method->i2v(method, ext_str, nullptr))) { goto err; } X509V3_EXT_val_prn(out, nval, indent, diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_purp.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_purp.cc index 096fa53562..685676f05b 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_purp.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_purp.cc @@ -14,6 +14,7 @@ #include +#include #include #include #include @@ -91,7 +92,7 @@ int X509_check_purpose(X509 *x, int id, int ca) { return 1; } const X509_PURPOSE *pt = X509_PURPOSE_get0(id); - if (pt == NULL) { + if (pt == nullptr) { return 0; } // Historically, |check_purpose| implementations other than |X509_PURPOSE_ANY| @@ -105,18 +106,18 @@ int X509_check_purpose(X509 *x, int id, int ca) { } const X509_PURPOSE *X509_PURPOSE_get0(int id) { - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(xstandard); i++) { - if (xstandard[i].purpose == id) { - return &xstandard[i]; + for (const auto &p : xstandard) { + if (p.purpose == id) { + return &p; } } - return NULL; + return nullptr; } int X509_PURPOSE_get_by_sname(const char *sname) { - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(xstandard); i++) { - if (strcmp(xstandard[i].sname, sname) == 0) { - return xstandard[i].purpose; + for (const auto &p : xstandard) { + if (strcmp(p.sname, sname) == 0) { + return p.purpose; } } return -1; @@ -143,7 +144,7 @@ static int setup_dp(X509 *x, DIST_POINT *dp) { if (!dp->distpoint || (dp->distpoint->type != 1)) { return 1; } - X509_NAME *iname = NULL; + X509_NAME *iname = nullptr; for (size_t i = 0; i < sk_GENERAL_NAME_num(dp->CRLissuer); i++) { GENERAL_NAME *gen = sk_GENERAL_NAME_value(dp->CRLissuer, i); if (gen->type == GEN_DIRNAME) { @@ -161,8 +162,8 @@ static int setup_dp(X509 *x, DIST_POINT *dp) { static int setup_crldp(X509 *x) { int j; x->crldp = reinterpret_cast( - X509_get_ext_d2i(x, NID_crl_distribution_points, &j, NULL)); - if (x->crldp == NULL && j != -1) { + X509_get_ext_d2i(x, NID_crl_distribution_points, &j, nullptr)); + if (x->crldp == nullptr && j != -1) { return 0; } for (size_t i = 0; i < sk_DIST_POINT_num(x->crldp); i++) { @@ -194,7 +195,7 @@ int x509v3_cache_extensions(X509 *x) { return (x->ex_flags & EXFLAG_INVALID) == 0; } - if (!X509_digest(x, EVP_sha256(), x->cert_hash, NULL)) { + if (!X509_digest(x, EVP_sha256(), x->cert_hash, nullptr)) { x->ex_flags |= EXFLAG_INVALID; } // V1 should mean no extensions ... @@ -203,7 +204,7 @@ int x509v3_cache_extensions(X509 *x) { } // Handle basic constraints if ((bs = reinterpret_cast( - X509_get_ext_d2i(x, NID_basic_constraints, &j, NULL)))) { + X509_get_ext_d2i(x, NID_basic_constraints, &j, nullptr)))) { if (bs->ca) { x->ex_flags |= EXFLAG_CA; } @@ -229,7 +230,7 @@ int x509v3_cache_extensions(X509 *x) { } // Handle key usage if ((usage = reinterpret_cast( - X509_get_ext_d2i(x, NID_key_usage, &j, NULL)))) { + X509_get_ext_d2i(x, NID_key_usage, &j, nullptr)))) { if (usage->length > 0) { x->ex_kusage = usage->data[0]; if (usage->length > 1) { @@ -245,7 +246,7 @@ int x509v3_cache_extensions(X509 *x) { } x->ex_xkusage = 0; if ((extusage = reinterpret_cast( - X509_get_ext_d2i(x, NID_ext_key_usage, &j, NULL)))) { + X509_get_ext_d2i(x, NID_ext_key_usage, &j, nullptr)))) { x->ex_flags |= EXFLAG_XKUSAGE; for (i = 0; i < sk_ASN1_OBJECT_num(extusage); i++) { switch (OBJ_obj2nid(sk_ASN1_OBJECT_value(extusage, i))) { @@ -293,13 +294,13 @@ int x509v3_cache_extensions(X509 *x) { } x->skid = reinterpret_cast( - X509_get_ext_d2i(x, NID_subject_key_identifier, &j, NULL)); - if (x->skid == NULL && j != -1) { + X509_get_ext_d2i(x, NID_subject_key_identifier, &j, nullptr)); + if (x->skid == nullptr && j != -1) { x->ex_flags |= EXFLAG_INVALID; } x->akid = reinterpret_cast( - X509_get_ext_d2i(x, NID_authority_key_identifier, &j, NULL)); - if (x->akid == NULL && j != -1) { + X509_get_ext_d2i(x, NID_authority_key_identifier, &j, nullptr)); + if (x->akid == nullptr && j != -1) { x->ex_flags |= EXFLAG_INVALID; } // Does subject name match issuer ? @@ -312,13 +313,13 @@ int x509v3_cache_extensions(X509 *x) { } } x->altname = reinterpret_cast( - X509_get_ext_d2i(x, NID_subject_alt_name, &j, NULL)); - if (x->altname == NULL && j != -1) { + X509_get_ext_d2i(x, NID_subject_alt_name, &j, nullptr)); + if (x->altname == nullptr && j != -1) { x->ex_flags |= EXFLAG_INVALID; } x->nc = reinterpret_cast( - X509_get_ext_d2i(x, NID_name_constraints, &j, NULL)); - if (x->nc == NULL && j != -1) { + X509_get_ext_d2i(x, NID_name_constraints, &j, nullptr)); + if (x->nc == nullptr && j != -1) { x->ex_flags |= EXFLAG_INVALID; } if (!setup_crldp(x)) { @@ -356,8 +357,8 @@ static int check_ca(const X509 *x) { return ((x->ex_flags & EXFLAG_BCONS) && (x->ex_flags & EXFLAG_CA)); } -int X509_check_ca(X509 *x) { - if (!x509v3_cache_extensions(x)) { +int X509_check_ca(const X509 *x) { + if (!x509v3_cache_extensions(const_cast(x))) { return 0; } return check_ca(x); @@ -460,12 +461,13 @@ static int check_purpose_timestamp_sign(const X509_PURPOSE *xp, const X509 *x, static int no_check(const X509_PURPOSE *xp, const X509 *x, int ca) { return 1; } -int X509_check_issued(X509 *issuer, X509 *subject) { +int X509_check_issued(const X509 *issuer, const X509 *subject) { if (X509_NAME_cmp(X509_get_subject_name(issuer), X509_get_issuer_name(subject))) { return X509_V_ERR_SUBJECT_ISSUER_MISMATCH; } - if (!x509v3_cache_extensions(issuer) || !x509v3_cache_extensions(subject)) { + if (!x509v3_cache_extensions(const_cast(issuer)) || + !x509v3_cache_extensions(const_cast(subject))) { return X509_V_ERR_UNSPECIFIED; } @@ -482,7 +484,7 @@ int X509_check_issued(X509 *issuer, X509 *subject) { return X509_V_OK; } -int X509_check_akid(X509 *issuer, const AUTHORITY_KEYID *akid) { +int X509_check_akid(const X509 *issuer, const AUTHORITY_KEYID *akid) { if (!akid) { return X509_V_OK; } @@ -494,7 +496,7 @@ int X509_check_akid(X509 *issuer, const AUTHORITY_KEYID *akid) { } // Check serial number if (akid->serial && - ASN1_INTEGER_cmp(X509_get_serialNumber(issuer), akid->serial)) { + ASN1_INTEGER_cmp(X509_get0_serialNumber(issuer), akid->serial)) { return X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH; } // Check issuer name @@ -502,13 +504,8 @@ int X509_check_akid(X509 *issuer, const AUTHORITY_KEYID *akid) { // Ugh, for some peculiar reason AKID includes SEQUENCE OF // GeneralName. So look for a DirName. There may be more than one but // we only take any notice of the first. - GENERAL_NAMES *gens; - GENERAL_NAME *gen; - X509_NAME *nm = NULL; - size_t i; - gens = akid->issuer; - for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) { - gen = sk_GENERAL_NAME_value(gens, i); + const X509_NAME *nm = nullptr; + for (const GENERAL_NAME *gen : akid->issuer) { if (gen->type == GEN_DIRNAME) { nm = gen->d.dirn; break; @@ -555,30 +552,30 @@ uint32_t X509_get_extended_key_usage(X509 *x) { const ASN1_OCTET_STRING *X509_get0_subject_key_id(X509 *x509) { if (!x509v3_cache_extensions(x509)) { - return NULL; + return nullptr; } return x509->skid; } const ASN1_OCTET_STRING *X509_get0_authority_key_id(X509 *x509) { if (!x509v3_cache_extensions(x509)) { - return NULL; + return nullptr; } - return x509->akid != NULL ? x509->akid->keyid : NULL; + return x509->akid != nullptr ? x509->akid->keyid : nullptr; } const GENERAL_NAMES *X509_get0_authority_issuer(X509 *x509) { if (!x509v3_cache_extensions(x509)) { - return NULL; + return nullptr; } - return x509->akid != NULL ? x509->akid->issuer : NULL; + return x509->akid != nullptr ? x509->akid->issuer : nullptr; } const ASN1_INTEGER *X509_get0_authority_serial(X509 *x509) { if (!x509v3_cache_extensions(x509)) { - return NULL; + return nullptr; } - return x509->akid != NULL ? x509->akid->serial : NULL; + return x509->akid != nullptr ? x509->akid->serial : nullptr; } long X509_get_pathlen(X509 *x509) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_skey.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_skey.cc index fd86d93c0b..5025e9d908 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_skey.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_skey.cc @@ -36,8 +36,8 @@ ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(const X509V3_EXT_METHOD *method, size_t len; uint8_t *data = x509v3_hex_to_bytes(str, &len); ASN1_OCTET_STRING *oct; - if (data == NULL) { - return NULL; + if (data == nullptr) { + return nullptr; } if (len > INT_MAX) { OPENSSL_PUT_ERROR(X509V3, ERR_R_OVERFLOW); @@ -45,7 +45,7 @@ ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(const X509V3_EXT_METHOD *method, } oct = ASN1_OCTET_STRING_new(); - if (oct == NULL) { + if (oct == nullptr) { goto err; } ASN1_STRING_set0(oct, data, (int)len); @@ -53,7 +53,7 @@ ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(const X509V3_EXT_METHOD *method, err: OPENSSL_free(data); - return NULL; + return nullptr; } static char *i2s_ASN1_OCTET_STRING_cb(const X509V3_EXT_METHOD *method, @@ -65,7 +65,7 @@ static char *i2s_ASN1_OCTET_STRING_cb(const X509V3_EXT_METHOD *method, static void *s2i_skey_id(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const char *str) { ASN1_OCTET_STRING *oct; - ASN1_BIT_STRING *pk; + const ASN1_BIT_STRING *pk; unsigned char pkey_dig[EVP_MAX_MD_SIZE]; unsigned int diglen; @@ -74,7 +74,7 @@ static void *s2i_skey_id(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, } if (!(oct = ASN1_OCTET_STRING_new())) { - return NULL; + return nullptr; } if (ctx && (ctx->flags == X509V3_CTX_TEST)) { @@ -87,17 +87,13 @@ static void *s2i_skey_id(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, } if (ctx->subject_req) { - pk = ctx->subject_req->req_info->pubkey->public_key; + pk = &ctx->subject_req->req_info->pubkey->public_key; } else { - pk = ctx->subject_cert->cert_info->key->public_key; + pk = &ctx->subject_cert->key.public_key; } - if (!pk) { - OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_PUBLIC_KEY); - goto err; - } - - if (!EVP_Digest(pk->data, pk->length, pkey_dig, &diglen, EVP_sha1(), NULL)) { + if (!EVP_Digest(pk->data, pk->length, pkey_dig, &diglen, EVP_sha1(), + nullptr)) { goto err; } @@ -109,22 +105,22 @@ static void *s2i_skey_id(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, err: ASN1_OCTET_STRING_free(oct); - return NULL; + return nullptr; } const X509V3_EXT_METHOD v3_skey_id = { NID_subject_key_identifier, 0, ASN1_ITEM_ref(ASN1_OCTET_STRING), - 0, - 0, - 0, - 0, + nullptr, + nullptr, + nullptr, + nullptr, i2s_ASN1_OCTET_STRING_cb, s2i_skey_id, - 0, - 0, - 0, - 0, - NULL, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, }; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_utl.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_utl.cc index 35ca6679a3..015bbcad29 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_utl.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/v3_utl.cc @@ -49,9 +49,9 @@ static int ipv6_hex(uint8_t *out, const char *in, size_t inlen); static int x509V3_add_len_value(const char *name, const char *value, size_t value_len, int omit_value, STACK_OF(CONF_VALUE) **extlist) { - CONF_VALUE *vtmp = NULL; - char *tname = NULL, *tvalue = NULL; - int extlist_was_null = *extlist == NULL; + CONF_VALUE *vtmp = nullptr; + char *tname = nullptr, *tvalue = nullptr; + int extlist_was_null = *extlist == nullptr; if (name && !(tname = OPENSSL_strdup(name))) { goto err; } @@ -62,7 +62,7 @@ static int x509V3_add_len_value(const char *name, const char *value, goto err; } tvalue = OPENSSL_strndup(value, value_len); - if (tvalue == NULL) { + if (tvalue == nullptr) { goto err; } } @@ -72,7 +72,7 @@ static int x509V3_add_len_value(const char *name, const char *value, if (!*extlist && !(*extlist = sk_CONF_VALUE_new_null())) { goto err; } - vtmp->section = NULL; + vtmp->section = nullptr; vtmp->name = tname; vtmp->value = tvalue; if (!sk_CONF_VALUE_push(*extlist, vtmp)) { @@ -82,7 +82,7 @@ static int x509V3_add_len_value(const char *name, const char *value, err: if (extlist_was_null) { sk_CONF_VALUE_free(*extlist); - *extlist = NULL; + *extlist = nullptr; } OPENSSL_free(vtmp); OPENSSL_free(tname); @@ -92,8 +92,8 @@ err: int X509V3_add_value(const char *name, const char *value, STACK_OF(CONF_VALUE) **extlist) { - return x509V3_add_len_value(name, value, value != NULL ? strlen(value) : 0, - /*omit_value=*/value == NULL, extlist); + return x509V3_add_len_value(name, value, value != nullptr ? strlen(value) : 0, + /*omit_value=*/value == nullptr, extlist); } int x509V3_add_value_asn1_string(const char *name, const ASN1_STRING *value, @@ -133,8 +133,8 @@ static char *bignum_to_string(const BIGNUM *bn) { } tmp = BN_bn2hex(bn); - if (tmp == NULL) { - return NULL; + if (tmp == nullptr) { + return nullptr; } // Prepend "0x", but place it after the "-" if negative. @@ -148,12 +148,12 @@ static char *bignum_to_string(const BIGNUM *bn) { char *i2s_ASN1_ENUMERATED(const X509V3_EXT_METHOD *method, const ASN1_ENUMERATED *a) { - BIGNUM *bntmp = NULL; - char *strtmp = NULL; + BIGNUM *bntmp = nullptr; + char *strtmp = nullptr; if (!a) { - return NULL; + return nullptr; } - if (!(bntmp = ASN1_ENUMERATED_to_BN(a, NULL)) || + if (!(bntmp = ASN1_ENUMERATED_to_BN(a, nullptr)) || !(strtmp = bignum_to_string(bntmp))) { } BN_free(bntmp); @@ -161,12 +161,12 @@ char *i2s_ASN1_ENUMERATED(const X509V3_EXT_METHOD *method, } char *i2s_ASN1_INTEGER(const X509V3_EXT_METHOD *method, const ASN1_INTEGER *a) { - BIGNUM *bntmp = NULL; - char *strtmp = NULL; + BIGNUM *bntmp = nullptr; + char *strtmp = nullptr; if (!a) { - return NULL; + return nullptr; } - if (!(bntmp = ASN1_INTEGER_to_BN(a, NULL)) || + if (!(bntmp = ASN1_INTEGER_to_BN(a, nullptr)) || !(strtmp = bignum_to_string(bntmp))) { } BN_free(bntmp); @@ -175,13 +175,13 @@ char *i2s_ASN1_INTEGER(const X509V3_EXT_METHOD *method, const ASN1_INTEGER *a) { ASN1_INTEGER *s2i_ASN1_INTEGER(const X509V3_EXT_METHOD *method, const char *value) { - BIGNUM *bn = NULL; + BIGNUM *bn = nullptr; ASN1_INTEGER *aint; int isneg, ishex; int ret; if (!value) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE); - return 0; + return nullptr; } bn = BN_new(); if (value[0] == '-') { @@ -203,13 +203,13 @@ ASN1_INTEGER *s2i_ASN1_INTEGER(const X509V3_EXT_METHOD *method, } else { // Decoding from decimal scales quadratically in the input length. Bound the // largest decimal input we accept in the config parser. 8,192 decimal - // digits allows values up to 27,213 bits. Ths exceeds the largest RSA, DSA, - // or DH modulus we support, and those are not usefully represented in + // digits allows values up to 27,213 bits. This exceeds the largest RSA, + // DSA, or DH modulus we support, and those are not usefully represented in // decimal. if (strlen(value) > 8192) { BN_free(bn); OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NUMBER); - return 0; + return nullptr; } ret = BN_dec2bn(&bn, value); } @@ -217,18 +217,18 @@ ASN1_INTEGER *s2i_ASN1_INTEGER(const X509V3_EXT_METHOD *method, if (!ret || value[ret]) { BN_free(bn); OPENSSL_PUT_ERROR(X509V3, X509V3_R_BN_DEC2BN_ERROR); - return 0; + return nullptr; } if (isneg && BN_is_zero(bn)) { isneg = 0; } - aint = BN_to_ASN1_INTEGER(bn, NULL); + aint = BN_to_ASN1_INTEGER(bn, nullptr); BN_free(bn); if (!aint) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_BN_TO_ASN1_INTEGER_ERROR); - return 0; + return nullptr; } if (isneg) { aint->type |= V_ASN1_NEG; @@ -243,7 +243,7 @@ int X509V3_add_value_int(const char *name, const ASN1_INTEGER *aint, if (!aint) { return 1; } - if (!(strtmp = i2s_ASN1_INTEGER(NULL, aint))) { + if (!(strtmp = i2s_ASN1_INTEGER(nullptr, aint))) { return 0; } ret = X509V3_add_value(name, strtmp, extlist); @@ -268,7 +268,7 @@ int X509V3_bool_from_string(const char *str, ASN1_BOOLEAN *out_bool) { int X509V3_get_value_bool(const CONF_VALUE *value, ASN1_BOOLEAN *out_bool) { const char *btmp = value->value; - if (btmp == NULL) { + if (btmp == nullptr) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_BOOLEAN_STRING); goto err; } @@ -284,7 +284,7 @@ err: int X509V3_get_value_int(const CONF_VALUE *value, ASN1_INTEGER **aint) { ASN1_INTEGER *itmp; - if (!(itmp = s2i_ASN1_INTEGER(NULL, value->value))) { + if (!(itmp = s2i_ASN1_INTEGER(nullptr, value->value))) { X509V3_conf_err(value); return 0; } @@ -301,16 +301,16 @@ int X509V3_get_value_int(const CONF_VALUE *value, ASN1_INTEGER **aint) { STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line) { char *p, *q, c; char *ntmp, *vtmp; - STACK_OF(CONF_VALUE) *values = NULL; + STACK_OF(CONF_VALUE) *values = nullptr; char *linebuf; int state; // We are going to modify the line so copy it first linebuf = OPENSSL_strdup(line); - if (linebuf == NULL) { + if (linebuf == nullptr) { goto err; } state = HDR_NAME; - ntmp = NULL; + ntmp = nullptr; // Go through all characters for (p = linebuf, q = linebuf; (c = *p) && (c != '\r') && (c != '\n'); p++) { switch (state) { @@ -335,7 +335,7 @@ STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME); goto err; } - X509V3_add_value(ntmp, NULL, &values); + X509V3_add_value(ntmp, nullptr, &values); } break; @@ -352,7 +352,7 @@ STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line) { goto err; } X509V3_add_value(ntmp, vtmp, &values); - ntmp = NULL; + ntmp = nullptr; q = p + 1; } } @@ -377,7 +377,7 @@ STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME); goto err; } - X509V3_add_value(ntmp, NULL, &values); + X509V3_add_value(ntmp, nullptr, &values); } OPENSSL_free(linebuf); return values; @@ -385,7 +385,7 @@ STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line) { err: OPENSSL_free(linebuf); sk_CONF_VALUE_pop_free(values, X509V3_conf_free); - return NULL; + return nullptr; } // Delete leading and trailing spaces from a string @@ -397,7 +397,7 @@ static char *strip_spaces(char *name) { p++; } if (!*p) { - return NULL; + return nullptr; } q = p + strlen(p) - 1; while ((q != p) && OPENSSL_isspace((unsigned char)*q)) { @@ -407,7 +407,7 @@ static char *strip_spaces(char *name) { q[1] = 0; } if (!*p) { - return NULL; + return nullptr; } return p; } @@ -437,7 +437,7 @@ char *x509v3_bytes_to_hex(const uint8_t *in, size_t len) { err: CBB_cleanup(&cbb); - return NULL; + return nullptr; } unsigned char *x509v3_hex_to_bytes(const char *str, size_t *len) { @@ -446,7 +446,7 @@ unsigned char *x509v3_hex_to_bytes(const char *str, size_t *len) { uint8_t high, low; if (!str) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_ARGUMENT); - return NULL; + return nullptr; } if (!(hexbuf = reinterpret_cast(OPENSSL_malloc(strlen(str) >> 1)))) { @@ -461,7 +461,7 @@ unsigned char *x509v3_hex_to_bytes(const char *str, size_t *len) { if (!cl) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_ODD_NUMBER_OF_DIGITS); OPENSSL_free(hexbuf); - return NULL; + return nullptr; } if (!OPENSSL_fromxdigit(&high, ch)) { goto badhex; @@ -480,12 +480,12 @@ unsigned char *x509v3_hex_to_bytes(const char *str, size_t *len) { err: OPENSSL_free(hexbuf); - return NULL; + return nullptr; badhex: OPENSSL_free(hexbuf); OPENSSL_PUT_ERROR(X509V3, X509V3_R_ILLEGAL_HEX_DIGIT); - return NULL; + return nullptr; } int x509v3_conf_name_matches(const char *name, const char *cmp) { @@ -507,7 +507,7 @@ STACK_OF(OPENSSL_STRING) *X509_get1_email(const X509 *x) { STACK_OF(OPENSSL_STRING) *ret; gens = reinterpret_cast( - X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL)); + X509_get_ext_d2i(x, NID_subject_alt_name, nullptr, nullptr)); ret = get_email(X509_get_subject_name(x), gens); sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free); return ret; @@ -515,13 +515,13 @@ STACK_OF(OPENSSL_STRING) *X509_get1_email(const X509 *x) { STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(const X509 *x) { AUTHORITY_INFO_ACCESS *info; - STACK_OF(OPENSSL_STRING) *ret = NULL; + STACK_OF(OPENSSL_STRING) *ret = nullptr; size_t i; info = reinterpret_cast( - X509_get_ext_d2i(x, NID_info_access, NULL, NULL)); + X509_get_ext_d2i(x, NID_info_access, nullptr, nullptr)); if (!info) { - return NULL; + return nullptr; } for (i = 0; i < sk_ACCESS_DESCRIPTION_num(info); i++) { ACCESS_DESCRIPTION *ad = sk_ACCESS_DESCRIPTION_value(info, i); @@ -544,7 +544,7 @@ STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(const X509_REQ *x) { exts = X509_REQ_get_extensions(x); gens = reinterpret_cast( - X509V3_get_d2i(exts, NID_subject_alt_name, NULL, NULL)); + X509V3_get_d2i(exts, NID_subject_alt_name, nullptr, nullptr)); ret = get_email(X509_REQ_get_subject_name(x), gens); sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free); sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free); @@ -553,7 +553,7 @@ STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(const X509_REQ *x) { static STACK_OF(OPENSSL_STRING) *get_email(const X509_NAME *name, const GENERAL_NAMES *gens) { - STACK_OF(OPENSSL_STRING) *ret = NULL; + STACK_OF(OPENSSL_STRING) *ret = nullptr; // Now add any email address(es) to STACK int i = -1; // First supplied X509_NAME @@ -562,7 +562,7 @@ static STACK_OF(OPENSSL_STRING) *get_email(const X509_NAME *name, const X509_NAME_ENTRY *ne = X509_NAME_get_entry(name, i); const ASN1_IA5STRING *email = X509_NAME_ENTRY_get_data(ne); if (!append_ia5(&ret, email)) { - return NULL; + return nullptr; } } for (size_t j = 0; j < sk_GENERAL_NAME_num(gens); j++) { @@ -571,7 +571,7 @@ static STACK_OF(OPENSSL_STRING) *get_email(const X509_NAME *name, continue; } if (!append_ia5(&ret, gen->d.ia5)) { - return NULL; + return nullptr; } } return ret; @@ -585,16 +585,16 @@ static int append_ia5(STACK_OF(OPENSSL_STRING) **sk, if (email->type != V_ASN1_IA5STRING) { return 1; } - if (email->data == NULL || email->length == 0) { + if (email->data == nullptr || email->length == 0) { return 1; } // |OPENSSL_STRING| cannot represent strings with embedded NULs. Do not // report them as outputs. - if (OPENSSL_memchr(email->data, 0, email->length) != NULL) { + if (OPENSSL_memchr(email->data, 0, email->length) != nullptr) { return 1; } - char *emtmp = NULL; + char *emtmp = nullptr; if (!*sk) { *sk = sk_OPENSSL_STRING_new(sk_strcmp); } @@ -603,13 +603,13 @@ static int append_ia5(STACK_OF(OPENSSL_STRING) **sk, } emtmp = OPENSSL_strndup((char *)email->data, email->length); - if (emtmp == NULL) { + if (emtmp == nullptr) { goto err; } // Don't add duplicates sk_OPENSSL_STRING_sort(*sk); - if (sk_OPENSSL_STRING_find(*sk, NULL, emtmp)) { + if (sk_OPENSSL_STRING_find(*sk, nullptr, emtmp)) { OPENSSL_free(emtmp); return 1; } @@ -623,7 +623,7 @@ err: // on |append_ia5| leaving |*sk| at NULL on error. OPENSSL_free(emtmp); X509_email_free(*sk); - *sk = NULL; + *sk = nullptr; return 0; } @@ -754,7 +754,7 @@ static int wildcard_match(const unsigned char *prefix, size_t prefix_len, static const unsigned char *valid_star(const unsigned char *p, size_t len, unsigned int flags) { - const unsigned char *star = 0; + const unsigned char *star = nullptr; size_t i; int state = LABEL_START; int dots = 0; @@ -767,12 +767,12 @@ static const unsigned char *valid_star(const unsigned char *p, size_t len, // At most one wildcard per pattern. // No wildcards in IDNA labels. // No wildcards after the first label. - if (star != NULL || (state & LABEL_IDNA) != 0 || dots) { - return NULL; + if (star != nullptr || (state & LABEL_IDNA) != 0 || dots) { + return nullptr; } // Only full-label '*.example.com' wildcards. if (!atstart || !atend) { - return NULL; + return nullptr; } star = &p[i]; state &= ~LABEL_START; @@ -784,25 +784,25 @@ static const unsigned char *valid_star(const unsigned char *p, size_t len, state &= ~(LABEL_HYPHEN | LABEL_START); } else if (p[i] == '.') { if ((state & (LABEL_HYPHEN | LABEL_START)) != 0) { - return NULL; + return nullptr; } state = LABEL_START; ++dots; } else if (p[i] == '-') { // no domain/subdomain starts with '-' if ((state & LABEL_START) != 0) { - return NULL; + return nullptr; } state |= LABEL_HYPHEN; } else { - return NULL; + return nullptr; } } // The final label must not end in a hyphen or ".", and // there must be at least two dots after the star. if ((state & (LABEL_START | LABEL_HYPHEN)) != 0 || dots < 2) { - return NULL; + return nullptr; } return star; } @@ -811,14 +811,14 @@ static const unsigned char *valid_star(const unsigned char *p, size_t len, static int equal_wildcard(const unsigned char *pattern, size_t pattern_len, const unsigned char *subject, size_t subject_len, unsigned int flags) { - const unsigned char *star = NULL; + const unsigned char *star = nullptr; // Subject names starting with '.' can only match a wildcard pattern // via a subject sub-domain pattern suffix match. if (!(subject_len > 1 && subject[0] == '.')) { star = valid_star(pattern, pattern_len, flags); } - if (star == NULL) { + if (star == nullptr) { return equal_nocase(pattern, pattern_len, subject, subject_len, flags); } return wildcard_match(pattern, star - pattern, star + 1, @@ -892,7 +892,7 @@ static int do_check_string(const ASN1_STRING *a, int cmp_type, equal_fn equal, } if (rv > 0 && peername) { *peername = OPENSSL_strndup((char *)a->data, a->length); - if (*peername == NULL) { + if (*peername == nullptr) { return -1; } } @@ -913,7 +913,7 @@ static int do_check_string(const ASN1_STRING *a, int cmp_type, equal_fn equal, } if (rv > 0 && peername) { *peername = OPENSSL_strndup((char *)astr, astrlen); - if (*peername == NULL) { + if (*peername == nullptr) { return -1; } } @@ -946,7 +946,7 @@ static int do_x509_check(const X509 *x, const char *chk, size_t chklen, } GENERAL_NAMES *gens = reinterpret_cast( - X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL)); + X509_get_ext_d2i(x, NID_subject_alt_name, nullptr, nullptr)); if (gens) { for (size_t i = 0; i < sk_GENERAL_NAME_num(gens); i++) { const GENERAL_NAME *gen = sk_GENERAL_NAME_value(gens, i); @@ -992,7 +992,7 @@ static int do_x509_check(const X509 *x, const char *chk, size_t chklen, int X509_check_host(const X509 *x, const char *chk, size_t chklen, unsigned int flags, char **peername) { - if (chk == NULL) { + if (chk == nullptr) { return -2; } if (OPENSSL_memchr(chk, '\0', chklen)) { @@ -1003,35 +1003,36 @@ int X509_check_host(const X509 *x, const char *chk, size_t chklen, int X509_check_email(const X509 *x, const char *chk, size_t chklen, unsigned int flags) { - if (chk == NULL) { + if (chk == nullptr) { return -2; } if (OPENSSL_memchr(chk, '\0', chklen)) { return -2; } - return do_x509_check(x, chk, chklen, flags, GEN_EMAIL, NULL); + return do_x509_check(x, chk, chklen, flags, GEN_EMAIL, nullptr); } int X509_check_ip(const X509 *x, const unsigned char *chk, size_t chklen, unsigned int flags) { - if (chk == NULL) { + if (chk == nullptr) { return -2; } - return do_x509_check(x, (const char *)chk, chklen, flags, GEN_IPADD, NULL); + return do_x509_check(x, (const char *)chk, chklen, flags, GEN_IPADD, nullptr); } int X509_check_ip_asc(const X509 *x, const char *ipasc, unsigned int flags) { unsigned char ipout[16]; size_t iplen; - if (ipasc == NULL) { + if (ipasc == nullptr) { return -2; } iplen = (size_t)x509v3_a2i_ipadd(ipout, ipasc); if (iplen == 0) { return -2; } - return do_x509_check(x, (const char *)ipout, iplen, flags, GEN_IPADD, NULL); + return do_x509_check(x, (const char *)ipout, iplen, flags, GEN_IPADD, + nullptr); } // Convert IP addresses both IPv4 and IPv6 into an OCTET STRING compatible @@ -1044,33 +1045,33 @@ ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc) { iplen = x509v3_a2i_ipadd(ipout, ipasc); if (!iplen) { - return NULL; + return nullptr; } ret = ASN1_OCTET_STRING_new(); if (!ret) { - return NULL; + return nullptr; } if (!ASN1_OCTET_STRING_set(ret, ipout, iplen)) { ASN1_OCTET_STRING_free(ret); - return NULL; + return nullptr; } return ret; } ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc) { - ASN1_OCTET_STRING *ret = NULL; + ASN1_OCTET_STRING *ret = nullptr; unsigned char ipout[32]; - char *iptmp = NULL, *p; + char *iptmp = nullptr, *p; int iplen1, iplen2; // FIXME: yes, this function takes a const pointer and writes to it! p = const_cast(strchr(ipasc, '/')); if (!p) { - return NULL; + return nullptr; } iptmp = OPENSSL_strdup(ipasc); if (!iptmp) { - return NULL; + return nullptr; } p = iptmp + (p - ipasc); *p++ = 0; @@ -1084,7 +1085,7 @@ ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc) { iplen2 = x509v3_a2i_ipadd(ipout + iplen1, p); OPENSSL_free(iptmp); - iptmp = NULL; + iptmp = nullptr; if (!iplen2 || (iplen1 != iplen2)) { goto err; @@ -1103,7 +1104,7 @@ ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc) { err: OPENSSL_free(iptmp); ASN1_OCTET_STRING_free(ret); - return NULL; + return nullptr; } int x509v3_a2i_ipadd(uint8_t ipout[16], const char *ipasc) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_att.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_att.cc index 49363b2295..3afcf4892d 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_att.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_att.cc @@ -27,9 +27,9 @@ X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, const ASN1_OBJECT *obj; obj = OBJ_nid2obj(nid); - if (obj == NULL) { + if (obj == nullptr) { OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_NID); - return NULL; + return nullptr; } return X509_ATTRIBUTE_create_by_OBJ(attr, obj, attrtype, data, len); } @@ -40,9 +40,9 @@ X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, int len) { X509_ATTRIBUTE *ret; - if ((attr == NULL) || (*attr == NULL)) { - if ((ret = X509_ATTRIBUTE_new()) == NULL) { - return NULL; + if ((attr == nullptr) || (*attr == nullptr)) { + if ((ret = X509_ATTRIBUTE_new()) == nullptr) { + return nullptr; } } else { ret = *attr; @@ -55,15 +55,15 @@ X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, goto err; } - if ((attr != NULL) && (*attr == NULL)) { + if ((attr != nullptr) && (*attr == nullptr)) { *attr = ret; } return ret; err: - if ((attr == NULL) || (ret != *attr)) { + if ((attr == nullptr) || (ret != *attr)) { X509_ATTRIBUTE_free(ret); } - return NULL; + return nullptr; } X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, @@ -74,10 +74,10 @@ X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, X509_ATTRIBUTE *nattr; obj = OBJ_txt2obj(attrname, 0); - if (obj == NULL) { + if (obj == nullptr) { OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_NAME); ERR_add_error_data(2, "name=", attrname); - return NULL; + return nullptr; } nattr = X509_ATTRIBUTE_create_by_OBJ(attr, obj, type, bytes, len); ASN1_OBJECT_free(obj); @@ -85,12 +85,12 @@ X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, } int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj) { - if ((attr == NULL) || (obj == NULL)) { + if ((attr == nullptr) || (obj == nullptr)) { return 0; } ASN1_OBJECT_free(attr->object); attr->object = OBJ_dup(obj); - return attr->object != NULL; + return attr->object != nullptr; } int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, @@ -106,7 +106,7 @@ int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, } ASN1_TYPE *typ = ASN1_TYPE_new(); - if (typ == NULL) { + if (typ == nullptr) { return 0; } @@ -116,9 +116,9 @@ int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, // preferred ASN.1 type. Note |len| may be -1, in which case // |ASN1_STRING_set_by_NID| calls |strlen| automatically. ASN1_STRING *str = - ASN1_STRING_set_by_NID(NULL, reinterpret_cast(data), + ASN1_STRING_set_by_NID(nullptr, reinterpret_cast(data), len, attrtype, OBJ_obj2nid(attr->object)); - if (str == NULL) { + if (str == nullptr) { OPENSSL_PUT_ERROR(X509, ERR_R_ASN1_LIB); goto err; } @@ -127,7 +127,7 @@ int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, // |attrtype| must be a valid |ASN1_STRING| type. |data| and |len| is a // value in the corresponding |ASN1_STRING| representation. ASN1_STRING *str = ASN1_STRING_type_new(attrtype); - if (str == NULL || !ASN1_STRING_set(str, data, len)) { + if (str == nullptr || !ASN1_STRING_set(str, data, len)) { ASN1_STRING_free(str); goto err; } @@ -155,8 +155,8 @@ int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr) { } ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr) { - if (attr == NULL) { - return NULL; + if (attr == nullptr) { + return nullptr; } return attr->object; } @@ -166,21 +166,21 @@ void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int attrtype, ASN1_TYPE *ttmp; ttmp = X509_ATTRIBUTE_get0_type(attr, idx); if (!ttmp) { - return NULL; + return nullptr; } if (attrtype != ASN1_TYPE_get(ttmp)) { OPENSSL_PUT_ERROR(X509, X509_R_WRONG_TYPE); - return NULL; + return nullptr; } return (void *)asn1_type_value_as_pointer(ttmp); } ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx) { - if (attr == NULL) { - return NULL; + if (attr == nullptr) { + return nullptr; } if (idx >= X509_ATTRIBUTE_count(attr)) { - return NULL; + return nullptr; } return sk_ASN1_TYPE_value(attr->set, idx); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_cmp.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_cmp.cc index fd2f30fba1..511ec64c0e 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_cmp.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_cmp.cc @@ -29,15 +29,15 @@ int X509_issuer_name_cmp(const X509 *a, const X509 *b) { - return (X509_NAME_cmp(a->cert_info->issuer, b->cert_info->issuer)); + return X509_NAME_cmp(&a->issuer, &b->issuer); } int X509_subject_name_cmp(const X509 *a, const X509 *b) { - return (X509_NAME_cmp(a->cert_info->subject, b->cert_info->subject)); + return X509_NAME_cmp(&a->subject, &b->subject); } int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b) { - return (X509_NAME_cmp(a->crl->issuer, b->crl->issuer)); + return X509_NAME_cmp(a->crl->issuer, b->crl->issuer); } int X509_CRL_match(const X509_CRL *a, const X509_CRL *b) { @@ -45,35 +45,35 @@ int X509_CRL_match(const X509_CRL *a, const X509_CRL *b) { } X509_NAME *X509_get_issuer_name(const X509 *a) { - return a->cert_info->issuer; + // This function is not const-correct for OpenSSL compatibility. + return const_cast(&a->issuer); } -uint32_t X509_issuer_name_hash(X509 *x) { - return X509_NAME_hash(x->cert_info->issuer); +uint32_t X509_issuer_name_hash(const X509 *x) { + return X509_NAME_hash(&x->issuer); } -uint32_t X509_issuer_name_hash_old(X509 *x) { - return (X509_NAME_hash_old(x->cert_info->issuer)); +uint32_t X509_issuer_name_hash_old(const X509 *x) { + return X509_NAME_hash_old(&x->issuer); } X509_NAME *X509_get_subject_name(const X509 *a) { - return a->cert_info->subject; + // This function is not const-correct for OpenSSL compatibility. + return const_cast(&a->subject); } -ASN1_INTEGER *X509_get_serialNumber(X509 *a) { - return a->cert_info->serialNumber; -} +ASN1_INTEGER *X509_get_serialNumber(X509 *a) { return &a->serialNumber; } const ASN1_INTEGER *X509_get0_serialNumber(const X509 *x509) { - return x509->cert_info->serialNumber; + return &x509->serialNumber; } -uint32_t X509_subject_name_hash(X509 *x) { - return X509_NAME_hash(x->cert_info->subject); +uint32_t X509_subject_name_hash(const X509 *x) { + return X509_NAME_hash(&x->subject); } -uint32_t X509_subject_name_hash_old(X509 *x) { - return X509_NAME_hash_old(x->cert_info->subject); +uint32_t X509_subject_name_hash_old(const X509 *x) { + return X509_NAME_hash_old(&x->subject); } // Compare two certificates: they must be identical for this to work. NB: @@ -98,62 +98,60 @@ int X509_cmp(const X509 *a, const X509 *b) { } int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b) { - int ret; - - // Ensure canonical encoding is present and up to date - - if (!a->canon_enc || a->modified) { - ret = i2d_X509_NAME((X509_NAME *)a, NULL); - if (ret < 0) { - return -2; - } + const X509_NAME_CACHE *a_cache = x509_name_get_cache(a); + if (a_cache == nullptr) { + return -2; } - - if (!b->canon_enc || b->modified) { - ret = i2d_X509_NAME((X509_NAME *)b, NULL); - if (ret < 0) { - return -2; - } + const X509_NAME_CACHE *b_cache = x509_name_get_cache(b); + if (b_cache == nullptr) { + return -2; } - - ret = a->canon_enclen - b->canon_enclen; - - if (ret) { - return ret; + if (a_cache->canon_len < b_cache->canon_len) { + return -1; } - - return OPENSSL_memcmp(a->canon_enc, b->canon_enc, a->canon_enclen); + if (a_cache->canon_len > b_cache->canon_len) { + return 1; + } + int ret = OPENSSL_memcmp(a_cache->canon, b_cache->canon, a_cache->canon_len); + // Canonicalize the return value so it is even possible to distinguish the + // error case from a < b, though ideally we would not have an error case. + if (ret < 0) { + return -1; + } + if (ret > 0) { + return 1; + } + return 0; } -uint32_t X509_NAME_hash(X509_NAME *x) { - // Make sure the X509_NAME structure contains a valid cached encoding. - if (i2d_X509_NAME(x, NULL) < 0) { +uint32_t X509_NAME_hash(const X509_NAME *x) { + const X509_NAME_CACHE *cache = x509_name_get_cache(x); + if (cache == nullptr) { return 0; } - uint8_t md[SHA_DIGEST_LENGTH]; - SHA1(x->canon_enc, x->canon_enclen, md); + SHA1(cache->canon, cache->canon_len, md); return CRYPTO_load_u32_le(md); } // I now DER encode the name and hash it. Since I cache the DER encoding, // this is reasonably efficient. -uint32_t X509_NAME_hash_old(X509_NAME *x) { - // Make sure the X509_NAME structure contains a valid cached encoding. - if (i2d_X509_NAME(x, NULL) < 0) { +uint32_t X509_NAME_hash_old(const X509_NAME *x) { + const X509_NAME_CACHE *cache = x509_name_get_cache(x); + if (cache == nullptr) { return 0; } - - uint8_t md[SHA_DIGEST_LENGTH]; - MD5((const uint8_t *)x->bytes->data, x->bytes->length, md); + uint8_t md[MD5_DIGEST_LENGTH]; + MD5(cache->der, cache->der_len, md); return CRYPTO_load_u32_le(md); } -X509 *X509_find_by_issuer_and_serial(const STACK_OF(X509) *sk, X509_NAME *name, +X509 *X509_find_by_issuer_and_serial(const STACK_OF(X509) *sk, + const X509_NAME *name, const ASN1_INTEGER *serial) { if (serial->type != V_ASN1_INTEGER && serial->type != V_ASN1_NEG_INTEGER) { - return NULL; + return nullptr; } for (size_t i = 0; i < sk_X509_num(sk); i++) { @@ -163,43 +161,44 @@ X509 *X509_find_by_issuer_and_serial(const STACK_OF(X509) *sk, X509_NAME *name, return x509; } } - return NULL; + return nullptr; } -X509 *X509_find_by_subject(const STACK_OF(X509) *sk, X509_NAME *name) { +X509 *X509_find_by_subject(const STACK_OF(X509) *sk, const X509_NAME *name) { for (size_t i = 0; i < sk_X509_num(sk); i++) { X509 *x509 = sk_X509_value(sk, i); if (X509_NAME_cmp(X509_get_subject_name(x509), name) == 0) { return x509; } } - return NULL; + return nullptr; } EVP_PKEY *X509_get0_pubkey(const X509 *x) { - if (x == NULL) { - return NULL; + if (x == nullptr) { + return nullptr; } - return X509_PUBKEY_get0(x->cert_info->key); + return X509_PUBKEY_get0(&x->key); } EVP_PKEY *X509_get_pubkey(const X509 *x) { - if (x == NULL) { - return NULL; + if (x == nullptr) { + return nullptr; } - return X509_PUBKEY_get(x->cert_info->key); + return X509_PUBKEY_get(&x->key); } ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x) { if (!x) { - return NULL; + return nullptr; } - return x->cert_info->key->public_key; + // This function is not const-correct for OpenSSL compatibility. + return const_cast(&x->key.public_key); } int X509_check_private_key(const X509 *x, const EVP_PKEY *k) { const EVP_PKEY *xk = X509_get0_pubkey(x); - if (xk == NULL) { + if (xk == nullptr) { return 0; } @@ -228,8 +227,8 @@ int X509_check_private_key(const X509 *x, const EVP_PKEY *k) { // each X509 structure. STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain) { STACK_OF(X509) *ret = sk_X509_dup(chain); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } for (size_t i = 0; i < sk_X509_num(ret); i++) { X509_up_ref(sk_X509_value(ret, i)); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_d2.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_d2.cc index c4b16c4227..1ef80bf058 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_d2.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_d2.cc @@ -20,16 +20,16 @@ int X509_STORE_set_default_paths(X509_STORE *ctx) { X509_LOOKUP *lookup; lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_file()); - if (lookup == NULL) { + if (lookup == nullptr) { return 0; } - X509_LOOKUP_load_file(lookup, NULL, X509_FILETYPE_DEFAULT); + X509_LOOKUP_load_file(lookup, nullptr, X509_FILETYPE_DEFAULT); lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_hash_dir()); - if (lookup == NULL) { + if (lookup == nullptr) { return 0; } - X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT); + X509_LOOKUP_add_dir(lookup, nullptr, X509_FILETYPE_DEFAULT); // clear any errors ERR_clear_error(); @@ -41,25 +41,25 @@ int X509_STORE_load_locations(X509_STORE *ctx, const char *file, const char *path) { X509_LOOKUP *lookup; - if (file != NULL) { + if (file != nullptr) { lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_file()); - if (lookup == NULL) { + if (lookup == nullptr) { return 0; } if (X509_LOOKUP_load_file(lookup, file, X509_FILETYPE_PEM) != 1) { return 0; } } - if (path != NULL) { + if (path != nullptr) { lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_hash_dir()); - if (lookup == NULL) { + if (lookup == nullptr) { return 0; } if (X509_LOOKUP_add_dir(lookup, path, X509_FILETYPE_PEM) != 1) { return 0; } } - if ((path == NULL) && (file == NULL)) { + if ((path == nullptr) && (file == nullptr)) { return 0; } return 1; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_ext.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_ext.cc index dbc2dc136c..ed1cea0b25 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_ext.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_ext.cc @@ -21,28 +21,38 @@ #include "internal.h" int X509_CRL_get_ext_count(const X509_CRL *x) { - return (X509v3_get_ext_count(x->crl->extensions)); + return X509v3_get_ext_count(x->crl->extensions); } int X509_CRL_get_ext_by_NID(const X509_CRL *x, int nid, int lastpos) { - return (X509v3_get_ext_by_NID(x->crl->extensions, nid, lastpos)); + return X509v3_get_ext_by_NID(x->crl->extensions, nid, lastpos); } int X509_CRL_get_ext_by_OBJ(const X509_CRL *x, const ASN1_OBJECT *obj, int lastpos) { - return (X509v3_get_ext_by_OBJ(x->crl->extensions, obj, lastpos)); + return X509v3_get_ext_by_OBJ(x->crl->extensions, obj, lastpos); } int X509_CRL_get_ext_by_critical(const X509_CRL *x, int crit, int lastpos) { - return (X509v3_get_ext_by_critical(x->crl->extensions, crit, lastpos)); + return X509v3_get_ext_by_critical(x->crl->extensions, crit, lastpos); } X509_EXTENSION *X509_CRL_get_ext(const X509_CRL *x, int loc) { - return (X509v3_get_ext(x->crl->extensions, loc)); + return X509v3_get_ext(x->crl->extensions, loc); +} + +static X509_EXTENSION *delete_ext(STACK_OF(X509_EXTENSION) **exts, int loc) { + X509_EXTENSION *ext = X509v3_delete_ext(*exts, loc); + // Empty extension lists are omitted. + if (*exts != nullptr && sk_X509_EXTENSION_num(*exts) == 0) { + sk_X509_EXTENSION_pop_free(*exts, X509_EXTENSION_free); + *exts = nullptr; + } + return ext; } X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc) { - return (X509v3_delete_ext(x->crl->extensions, loc)); + return delete_ext(&x->crl->extensions, loc); } void *X509_CRL_get_ext_d2i(const X509_CRL *crl, int nid, int *out_critical, @@ -56,76 +66,75 @@ int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit, } int X509_CRL_add_ext(X509_CRL *x, const X509_EXTENSION *ex, int loc) { - return (X509v3_add_ext(&(x->crl->extensions), ex, loc) != NULL); + return X509v3_add_ext(&x->crl->extensions, ex, loc) != nullptr; } int X509_get_ext_count(const X509 *x) { - return (X509v3_get_ext_count(x->cert_info->extensions)); + return X509v3_get_ext_count(x->extensions); } int X509_get_ext_by_NID(const X509 *x, int nid, int lastpos) { - return (X509v3_get_ext_by_NID(x->cert_info->extensions, nid, lastpos)); + return X509v3_get_ext_by_NID(x->extensions, nid, lastpos); } int X509_get_ext_by_OBJ(const X509 *x, const ASN1_OBJECT *obj, int lastpos) { - return (X509v3_get_ext_by_OBJ(x->cert_info->extensions, obj, lastpos)); + return X509v3_get_ext_by_OBJ(x->extensions, obj, lastpos); } int X509_get_ext_by_critical(const X509 *x, int crit, int lastpos) { - return (X509v3_get_ext_by_critical(x->cert_info->extensions, crit, lastpos)); + return X509v3_get_ext_by_critical(x->extensions, crit, lastpos); } X509_EXTENSION *X509_get_ext(const X509 *x, int loc) { - return (X509v3_get_ext(x->cert_info->extensions, loc)); + return X509v3_get_ext(x->extensions, loc); } X509_EXTENSION *X509_delete_ext(X509 *x, int loc) { - return (X509v3_delete_ext(x->cert_info->extensions, loc)); + return delete_ext(&x->extensions, loc); } int X509_add_ext(X509 *x, const X509_EXTENSION *ex, int loc) { - return (X509v3_add_ext(&(x->cert_info->extensions), ex, loc) != NULL); + return X509v3_add_ext(&x->extensions, ex, loc) != nullptr; } void *X509_get_ext_d2i(const X509 *x509, int nid, int *out_critical, int *out_idx) { - return X509V3_get_d2i(x509->cert_info->extensions, nid, out_critical, - out_idx); + return X509V3_get_d2i(x509->extensions, nid, out_critical, out_idx); } int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, unsigned long flags) { - return X509V3_add1_i2d(&x->cert_info->extensions, nid, value, crit, flags); + return X509V3_add1_i2d(&x->extensions, nid, value, crit, flags); } int X509_REVOKED_get_ext_count(const X509_REVOKED *x) { - return (X509v3_get_ext_count(x->extensions)); + return X509v3_get_ext_count(x->extensions); } int X509_REVOKED_get_ext_by_NID(const X509_REVOKED *x, int nid, int lastpos) { - return (X509v3_get_ext_by_NID(x->extensions, nid, lastpos)); + return X509v3_get_ext_by_NID(x->extensions, nid, lastpos); } int X509_REVOKED_get_ext_by_OBJ(const X509_REVOKED *x, const ASN1_OBJECT *obj, int lastpos) { - return (X509v3_get_ext_by_OBJ(x->extensions, obj, lastpos)); + return X509v3_get_ext_by_OBJ(x->extensions, obj, lastpos); } int X509_REVOKED_get_ext_by_critical(const X509_REVOKED *x, int crit, int lastpos) { - return (X509v3_get_ext_by_critical(x->extensions, crit, lastpos)); + return X509v3_get_ext_by_critical(x->extensions, crit, lastpos); } X509_EXTENSION *X509_REVOKED_get_ext(const X509_REVOKED *x, int loc) { - return (X509v3_get_ext(x->extensions, loc)); + return X509v3_get_ext(x->extensions, loc); } X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc) { - return (X509v3_delete_ext(x->extensions, loc)); + return delete_ext(&x->extensions, loc); } int X509_REVOKED_add_ext(X509_REVOKED *x, const X509_EXTENSION *ex, int loc) { - return (X509v3_add_ext(&(x->extensions), ex, loc) != NULL); + return X509v3_add_ext(&x->extensions, ex, loc) != nullptr; } void *X509_REVOKED_get_ext_d2i(const X509_REVOKED *revoked, int nid, diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_lu.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_lu.cc index eb9624ad25..93181e0d74 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_lu.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_lu.cc @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include +#include #include #include @@ -23,40 +25,41 @@ static int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type, - X509_NAME *name); + const X509_NAME *name); static X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, - int type, X509_NAME *name); + int type, + const X509_NAME *name); static X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, X509_OBJECT *x); static int X509_OBJECT_up_ref_count(X509_OBJECT *a); static X509_LOOKUP *X509_LOOKUP_new(const X509_LOOKUP_METHOD *method, X509_STORE *store); -static int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name, - X509_OBJECT *ret); +static int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, + const X509_NAME *name, X509_OBJECT *ret); static X509_LOOKUP *X509_LOOKUP_new(const X509_LOOKUP_METHOD *method, X509_STORE *store) { X509_LOOKUP *ret = reinterpret_cast(OPENSSL_zalloc(sizeof(X509_LOOKUP))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->method = method; ret->store_ctx = store; - if (method->new_item != NULL && !method->new_item(ret)) { + if (method->new_item != nullptr && !method->new_item(ret)) { OPENSSL_free(ret); - return NULL; + return nullptr; } return ret; } void X509_LOOKUP_free(X509_LOOKUP *ctx) { - if (ctx == NULL) { + if (ctx == nullptr) { return; } - if (ctx->method != NULL && ctx->method->free != NULL) { + if (ctx->method != nullptr && ctx->method->free != nullptr) { (*ctx->method->free)(ctx); } OPENSSL_free(ctx); @@ -64,19 +67,19 @@ void X509_LOOKUP_free(X509_LOOKUP *ctx) { int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, long argl, char **ret) { - if (ctx->method == NULL) { + if (ctx->method == nullptr) { return -1; } - if (ctx->method->ctrl != NULL) { + if (ctx->method->ctrl != nullptr) { return ctx->method->ctrl(ctx, cmd, argc, argl, ret); } else { return 1; } } -static int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name, - X509_OBJECT *ret) { - if (ctx->method == NULL || ctx->method->get_by_subject == NULL) { +static int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, + const X509_NAME *name, X509_OBJECT *ret) { + if (ctx->method == nullptr || ctx->method->get_by_subject == nullptr) { return 0; } // Note |get_by_subject| leaves |ret| in an inconsistent state. It has @@ -86,16 +89,32 @@ static int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name, return ctx->method->get_by_subject(ctx, type, name, ret) > 0; } -static int x509_object_cmp(const X509_OBJECT *a, const X509_OBJECT *b) { - int ret = a->type - b->type; +// x509_object_cmp_name compares |a| against the specified type and name. This +// avoids needing to construct a reference certificate or CRL. +static int x509_object_cmp_name(const X509_OBJECT *a, int type, + const X509_NAME *name) { + int ret = a->type - type; if (ret) { return ret; } - switch (a->type) { + switch (type) { case X509_LU_X509: - return X509_subject_name_cmp(a->data.x509, b->data.x509); + return X509_NAME_cmp(X509_get_subject_name(a->data.x509), name); case X509_LU_CRL: - return X509_CRL_cmp(a->data.crl, b->data.crl); + return X509_NAME_cmp(X509_CRL_get_issuer(a->data.crl), name); + default: + // abort(); + return 0; + } +} + +static int x509_object_cmp(const X509_OBJECT *a, const X509_OBJECT *b) { + switch (b->type) { + case X509_LU_X509: + return x509_object_cmp_name(a, b->type, + X509_get_subject_name(b->data.x509)); + case X509_LU_CRL: + return x509_object_cmp_name(a, b->type, X509_CRL_get_issuer(b->data.crl)); default: // abort(); return 0; @@ -110,8 +129,8 @@ static int x509_object_cmp_sk(const X509_OBJECT *const *a, X509_STORE *X509_STORE_new(void) { X509_STORE *ret = reinterpret_cast(OPENSSL_zalloc(sizeof(X509_STORE))); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->references = 1; @@ -119,10 +138,10 @@ X509_STORE *X509_STORE_new(void) { ret->objs = sk_X509_OBJECT_new(x509_object_cmp_sk); ret->get_cert_methods = sk_X509_LOOKUP_new_null(); ret->param = X509_VERIFY_PARAM_new(); - if (ret->objs == NULL || ret->get_cert_methods == NULL || - ret->param == NULL) { + if (ret->objs == nullptr || ret->get_cert_methods == nullptr || + ret->param == nullptr) { X509_STORE_free(ret); - return NULL; + return nullptr; } return ret; @@ -155,23 +174,23 @@ X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, const X509_LOOKUP_METHOD *m) { } X509_LOOKUP *lu = X509_LOOKUP_new(m, v); - if (lu == NULL || !sk_X509_LOOKUP_push(v->get_cert_methods, lu)) { + if (lu == nullptr || !sk_X509_LOOKUP_push(v->get_cert_methods, lu)) { X509_LOOKUP_free(lu); - return NULL; + return nullptr; } return lu; } -int X509_STORE_CTX_get_by_subject(X509_STORE_CTX *vs, int type, X509_NAME *name, - X509_OBJECT *ret) { +int X509_STORE_CTX_get_by_subject(X509_STORE_CTX *vs, int type, + const X509_NAME *name, X509_OBJECT *ret) { X509_STORE *ctx = vs->ctx; X509_OBJECT stmp; CRYPTO_MUTEX_lock_write(&ctx->objs_lock); X509_OBJECT *tmp = X509_OBJECT_retrieve_by_subject(ctx->objs, type, name); CRYPTO_MUTEX_unlock_write(&ctx->objs_lock); - if (tmp == NULL || type == X509_LU_CRL) { + if (tmp == nullptr || type == X509_LU_CRL) { for (size_t i = 0; i < sk_X509_LOOKUP_num(ctx->get_cert_methods); i++) { X509_LOOKUP *lu = sk_X509_LOOKUP_value(ctx->get_cert_methods, i); if (X509_LOOKUP_by_subject(lu, type, name, &stmp)) { @@ -179,7 +198,7 @@ int X509_STORE_CTX_get_by_subject(X509_STORE_CTX *vs, int type, X509_NAME *name, break; } } - if (tmp == NULL) { + if (tmp == nullptr) { return 0; } } @@ -193,12 +212,12 @@ int X509_STORE_CTX_get_by_subject(X509_STORE_CTX *vs, int type, X509_NAME *name, } static int x509_store_add(X509_STORE *ctx, void *x, int is_crl) { - if (x == NULL) { + if (x == nullptr) { return 0; } X509_OBJECT *const obj = X509_OBJECT_new(); - if (obj == NULL) { + if (obj == nullptr) { return 0; } @@ -242,7 +261,7 @@ X509_OBJECT *X509_OBJECT_new(void) { } void X509_OBJECT_free(X509_OBJECT *obj) { - if (obj == NULL) { + if (obj == nullptr) { return; } X509_OBJECT_free_contents(obj); @@ -277,76 +296,75 @@ void X509_OBJECT_free_contents(X509_OBJECT *a) { int X509_OBJECT_get_type(const X509_OBJECT *a) { return a->type; } X509 *X509_OBJECT_get0_X509(const X509_OBJECT *a) { - if (a == NULL || a->type != X509_LU_X509) { - return NULL; + if (a == nullptr || a->type != X509_LU_X509) { + return nullptr; } return a->data.x509; } static int x509_object_idx_cnt(STACK_OF(X509_OBJECT) *h, int type, - X509_NAME *name, int *pnmatch) { - X509_OBJECT stmp; - X509 x509_s; - X509_CINF cinf_s; - X509_CRL crl_s; - X509_CRL_INFO crl_info_s; - - stmp.type = type; - switch (type) { - case X509_LU_X509: - stmp.data.x509 = &x509_s; - x509_s.cert_info = &cinf_s; - cinf_s.subject = name; - break; - case X509_LU_CRL: - stmp.data.crl = &crl_s; - crl_s.crl = &crl_info_s; - crl_info_s.issuer = name; - break; - default: - // abort(); - return -1; - } - - size_t idx; + const X509_NAME *name, int *out_num_match) { sk_X509_OBJECT_sort(h); - if (!sk_X509_OBJECT_find(h, &idx, &stmp)) { + + // Find the first matching object. |sk_X509_OBJECT_find| would require + // constructing an |X509| or |X509_CRL| object, so implement our own binary + // search. + size_t start = 0, end = sk_X509_OBJECT_num(h); + while (end - start > 1) { + // Bias |mid| towards |start|. The range has more than one element, so |mid| + // is not the last element. + size_t mid = start + (end - start - 1) / 2; + assert(start <= mid && mid + 1 < end); + int r = x509_object_cmp_name(sk_X509_OBJECT_value(h, mid), type, name); + if (r < 0) { + start = mid + 1; // |mid| is too low. + } else if (r > 0) { + end = mid; // |mid| is too high. + } else { + // |mid| matches, but we need to keep searching to find the first match. + end = mid + 1; + } + } + if (start == end || + x509_object_cmp_name(sk_X509_OBJECT_value(h, start), type, name) != 0) { return -1; } - if (pnmatch != NULL) { - *pnmatch = 1; - for (size_t tidx = idx + 1; tidx < sk_X509_OBJECT_num(h); tidx++) { + if (out_num_match != nullptr) { + *out_num_match = 1; + for (size_t tidx = start + 1; tidx < sk_X509_OBJECT_num(h); tidx++) { const X509_OBJECT *tobj = sk_X509_OBJECT_value(h, tidx); - if (x509_object_cmp(tobj, &stmp)) { + if (x509_object_cmp_name(tobj, type, name) != 0) { break; } - (*pnmatch)++; + (*out_num_match)++; } } - return (int)idx; + assert(start <= INT_MAX); // |STACK_OF(T)| never stores more than |INT_MAX|. + return static_cast(start); } static int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type, - X509_NAME *name) { - return x509_object_idx_cnt(h, type, name, NULL); + const X509_NAME *name) { + return x509_object_idx_cnt(h, type, name, nullptr); } static X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, - int type, X509_NAME *name) { + int type, + const X509_NAME *name) { int idx; idx = X509_OBJECT_idx_by_subject(h, type, name); if (idx == -1) { - return NULL; + return nullptr; } return sk_X509_OBJECT_value(h, idx); } static X509_OBJECT *x509_object_dup(const X509_OBJECT *obj) { X509_OBJECT *ret = X509_OBJECT_new(); - if (ret == NULL) { - return NULL; + if (ret == nullptr) { + return nullptr; } ret->type = obj->type; ret->data = obj->data; @@ -366,11 +384,12 @@ STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *store) { return store->objs; } -STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *ctx, X509_NAME *nm) { +STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *ctx, + const X509_NAME *nm) { int cnt; STACK_OF(X509) *sk = sk_X509_new_null(); - if (sk == NULL) { - return NULL; + if (sk == nullptr) { + return nullptr; } CRYPTO_MUTEX_lock_write(&ctx->ctx->objs_lock); int idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_X509, nm, &cnt); @@ -381,7 +400,7 @@ STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *ctx, X509_NAME *nm) { CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock); if (!X509_STORE_CTX_get_by_subject(ctx, X509_LU_X509, nm, &xobj)) { sk_X509_free(sk); - return NULL; + return nullptr; } X509_OBJECT_free_contents(&xobj); CRYPTO_MUTEX_lock_write(&ctx->ctx->objs_lock); @@ -389,7 +408,7 @@ STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *ctx, X509_NAME *nm) { if (idx < 0) { CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock); sk_X509_free(sk); - return NULL; + return nullptr; } } for (int i = 0; i < cnt; i++, idx++) { @@ -398,7 +417,7 @@ STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *ctx, X509_NAME *nm) { if (!sk_X509_push(sk, x)) { CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock); sk_X509_pop_free(sk, X509_free); - return NULL; + return nullptr; } X509_up_ref(x); } @@ -407,18 +426,18 @@ STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *ctx, X509_NAME *nm) { } STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls(X509_STORE_CTX *ctx, - X509_NAME *nm) { + const X509_NAME *nm) { int cnt; X509_OBJECT xobj; STACK_OF(X509_CRL) *sk = sk_X509_CRL_new_null(); - if (sk == NULL) { - return NULL; + if (sk == nullptr) { + return nullptr; } // Always do lookup to possibly add new CRLs to cache. if (!X509_STORE_CTX_get_by_subject(ctx, X509_LU_CRL, nm, &xobj)) { sk_X509_CRL_free(sk); - return NULL; + return nullptr; } X509_OBJECT_free_contents(&xobj); CRYPTO_MUTEX_lock_write(&ctx->ctx->objs_lock); @@ -426,7 +445,7 @@ STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls(X509_STORE_CTX *ctx, if (idx < 0) { CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock); sk_X509_CRL_free(sk); - return NULL; + return nullptr; } for (int i = 0; i < cnt; i++, idx++) { @@ -437,7 +456,7 @@ STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls(X509_STORE_CTX *ctx, CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock); X509_CRL_free(x); sk_X509_CRL_pop_free(sk, X509_CRL_free); - return NULL; + return nullptr; } } CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock); @@ -449,7 +468,7 @@ static X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, sk_X509_OBJECT_sort(h); size_t idx; if (!sk_X509_OBJECT_find(h, &idx, x)) { - return NULL; + return nullptr; } if ((x->type != X509_LU_X509) && (x->type != X509_LU_CRL)) { return sk_X509_OBJECT_value(h, idx); @@ -457,7 +476,7 @@ static X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, for (size_t i = idx; i < sk_X509_OBJECT_num(h); i++) { X509_OBJECT *obj = sk_X509_OBJECT_value(h, i); if (x509_object_cmp(obj, x)) { - return NULL; + return nullptr; } if (x->type == X509_LU_X509) { if (!X509_cmp(obj->data.x509, x->data.x509)) { @@ -471,11 +490,11 @@ static X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, return obj; } } - return NULL; + return nullptr; } int X509_STORE_CTX_get1_issuer(X509 **out_issuer, X509_STORE_CTX *ctx, - X509 *x) { + const X509 *x) { X509_NAME *xn; X509_OBJECT obj, *pobj; int idx, ret; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_obj.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_obj.cc index 6eb5df9986..10cf9bd225 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_obj.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_obj.cc @@ -25,7 +25,7 @@ // Limit to ensure we don't overflow: much greater than -// anything enountered in practice. +// anything encountered in practice. #define NAME_ONELINE_MAX (1024 * 1024) @@ -36,13 +36,13 @@ char *X509_NAME_oneline(const X509_NAME *a, char *buf, int len) { const char *s; char *p; unsigned char *q; - BUF_MEM *b = NULL; + BUF_MEM *b = nullptr; static const char hex[17] = "0123456789ABCDEF"; int gs_doit[4]; char tmp_buf[80]; - if (buf == NULL) { - if ((b = BUF_MEM_new()) == NULL) { + if (buf == nullptr) { + if ((b = BUF_MEM_new()) == nullptr) { goto err; } if (!BUF_MEM_grow(b, 200)) { @@ -51,9 +51,9 @@ char *X509_NAME_oneline(const X509_NAME *a, char *buf, int len) { b->data[0] = '\0'; len = 200; } else if (len <= 0) { - return NULL; + return nullptr; } - if (a == NULL) { + if (a == nullptr) { if (b) { buf = b->data; OPENSSL_free(b); @@ -67,19 +67,19 @@ char *X509_NAME_oneline(const X509_NAME *a, char *buf, int len) { for (i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) { ne = sk_X509_NAME_ENTRY_value(a->entries, i); n = OBJ_obj2nid(ne->object); - if ((n == NID_undef) || ((s = OBJ_nid2sn(n)) == NULL)) { + if ((n == NID_undef) || ((s = OBJ_nid2sn(n)) == nullptr)) { i2t_ASN1_OBJECT(tmp_buf, sizeof(tmp_buf), ne->object); s = tmp_buf; } l1 = strlen(s); - type = ne->value->type; - num = ne->value->length; + type = ne->value.type; + num = ne->value.length; if (num > NAME_ONELINE_MAX) { OPENSSL_PUT_ERROR(X509, X509_R_NAME_TOO_LONG); goto err; } - q = ne->value->data; + q = ne->value.data; if ((type == V_ASN1_GENERALSTRING) && ((num % 4) == 0)) { gs_doit[0] = gs_doit[1] = gs_doit[2] = gs_doit[3] = 0; @@ -115,7 +115,7 @@ char *X509_NAME_oneline(const X509_NAME *a, char *buf, int len) { OPENSSL_PUT_ERROR(X509, X509_R_NAME_TOO_LONG); goto err; } - if (b != NULL) { + if (b != nullptr) { if (!BUF_MEM_grow(b, l + 1)) { goto err; } @@ -130,7 +130,7 @@ char *X509_NAME_oneline(const X509_NAME *a, char *buf, int len) { p += l1; *(p++) = '='; - q = ne->value->data; + q = ne->value.data; for (j = 0; j < num; j++) { if (!gs_doit[j & 3]) { @@ -148,7 +148,7 @@ char *X509_NAME_oneline(const X509_NAME *a, char *buf, int len) { } *p = '\0'; } - if (b != NULL) { + if (b != nullptr) { p = b->data; OPENSSL_free(b); } else { @@ -160,5 +160,5 @@ char *X509_NAME_oneline(const X509_NAME *a, char *buf, int len) { return p; err: BUF_MEM_free(b); - return NULL; + return nullptr; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_req.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_req.cc index ffaaf82456..31c97242c3 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_req.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_req.cc @@ -35,22 +35,22 @@ X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req) { } EVP_PKEY *X509_REQ_get_pubkey(const X509_REQ *req) { - if (req == NULL) { - return NULL; + if (req == nullptr) { + return nullptr; } return X509_PUBKEY_get(req->req_info->pubkey); } EVP_PKEY *X509_REQ_get0_pubkey(const X509_REQ *req) { - if (req == NULL) { - return NULL; + if (req == nullptr) { + return nullptr; } return X509_PUBKEY_get0(req->req_info->pubkey); } int X509_REQ_check_private_key(const X509_REQ *x, const EVP_PKEY *k) { const EVP_PKEY *xk = X509_REQ_get0_pubkey(x); - if (xk == NULL) { + if (xk == nullptr) { return 0; } @@ -83,8 +83,8 @@ int X509_REQ_extension_nid(int req_nid) { } STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(const X509_REQ *req) { - if (req == NULL || req->req_info == NULL) { - return NULL; + if (req == nullptr || req->req_info == nullptr) { + return nullptr; } int idx = X509_REQ_get_attr_by_NID(req, NID_ext_req, -1); @@ -92,7 +92,7 @@ STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(const X509_REQ *req) { idx = X509_REQ_get_attr_by_NID(req, NID_ms_ext_req, -1); } if (idx == -1) { - return NULL; + return nullptr; } const X509_ATTRIBUTE *attr = X509_REQ_get_attr(req, idx); @@ -100,11 +100,12 @@ STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(const X509_REQ *req) { // take and return a const pointer. const ASN1_TYPE *ext = X509_ATTRIBUTE_get0_type((X509_ATTRIBUTE *)attr, 0); if (!ext || ext->type != V_ASN1_SEQUENCE) { - return NULL; + return nullptr; } const unsigned char *p = ext->value.sequence->data; return (STACK_OF(X509_EXTENSION) *)ASN1_item_d2i( - NULL, &p, ext->value.sequence->length, ASN1_ITEM_rptr(X509_EXTENSIONS)); + nullptr, &p, ext->value.sequence->length, + ASN1_ITEM_rptr(X509_EXTENSIONS)); } // Add a STACK_OF extensions to a certificate request: allow alternative OIDs @@ -113,7 +114,7 @@ STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(const X509_REQ *req) { int X509_REQ_add_extensions_nid(X509_REQ *req, const STACK_OF(X509_EXTENSION) *exts, int nid) { // Generate encoding of extensions - unsigned char *ext = NULL; + unsigned char *ext = nullptr; int ext_len = ASN1_item_i2d((ASN1_VALUE *)exts, &ext, ASN1_ITEM_rptr(X509_EXTENSIONS)); if (ext_len <= 0) { @@ -136,7 +137,7 @@ int X509_REQ_get_attr_count(const X509_REQ *req) { int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos) { const ASN1_OBJECT *obj = OBJ_nid2obj(nid); - if (obj == NULL) { + if (obj == nullptr) { return -1; } return X509_REQ_get_attr_by_OBJ(req, obj, lastpos); @@ -144,7 +145,7 @@ int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos) { int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, const ASN1_OBJECT *obj, int lastpos) { - if (req->req_info->attributes == NULL) { + if (req->req_info->attributes == nullptr) { return -1; } lastpos++; @@ -163,26 +164,26 @@ int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, const ASN1_OBJECT *obj, } X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc) { - if (req->req_info->attributes == NULL || loc < 0 || + if (req->req_info->attributes == nullptr || loc < 0 || sk_X509_ATTRIBUTE_num(req->req_info->attributes) <= (size_t)loc) { - return NULL; + return nullptr; } return sk_X509_ATTRIBUTE_value(req->req_info->attributes, loc); } X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc) { - if (req->req_info->attributes == NULL || loc < 0 || + if (req->req_info->attributes == nullptr || loc < 0 || sk_X509_ATTRIBUTE_num(req->req_info->attributes) <= (size_t)loc) { - return NULL; + return nullptr; } return sk_X509_ATTRIBUTE_delete(req->req_info->attributes, loc); } static int X509_REQ_add0_attr(X509_REQ *req, X509_ATTRIBUTE *attr) { - if (req->req_info->attributes == NULL) { + if (req->req_info->attributes == nullptr) { req->req_info->attributes = sk_X509_ATTRIBUTE_new_null(); } - if (req->req_info->attributes == NULL || + if (req->req_info->attributes == nullptr || !sk_X509_ATTRIBUTE_push(req->req_info->attributes, attr)) { return 0; } @@ -192,7 +193,7 @@ static int X509_REQ_add0_attr(X509_REQ *req, X509_ATTRIBUTE *attr) { int X509_REQ_add1_attr(X509_REQ *req, const X509_ATTRIBUTE *attr) { X509_ATTRIBUTE *new_attr = X509_ATTRIBUTE_dup(attr); - if (new_attr == NULL || !X509_REQ_add0_attr(req, new_attr)) { + if (new_attr == nullptr || !X509_REQ_add0_attr(req, new_attr)) { X509_ATTRIBUTE_free(new_attr); return 0; } @@ -204,8 +205,8 @@ int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, const ASN1_OBJECT *obj, int attrtype, const unsigned char *data, int len) { X509_ATTRIBUTE *attr = - X509_ATTRIBUTE_create_by_OBJ(NULL, obj, attrtype, data, len); - if (attr == NULL || !X509_REQ_add0_attr(req, attr)) { + X509_ATTRIBUTE_create_by_OBJ(nullptr, obj, attrtype, data, len); + if (attr == nullptr || !X509_REQ_add0_attr(req, attr)) { X509_ATTRIBUTE_free(attr); return 0; } @@ -216,8 +217,8 @@ int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, const ASN1_OBJECT *obj, int X509_REQ_add1_attr_by_NID(X509_REQ *req, int nid, int attrtype, const unsigned char *data, int len) { X509_ATTRIBUTE *attr = - X509_ATTRIBUTE_create_by_NID(NULL, nid, attrtype, data, len); - if (attr == NULL || !X509_REQ_add0_attr(req, attr)) { + X509_ATTRIBUTE_create_by_NID(nullptr, nid, attrtype, data, len); + if (attr == nullptr || !X509_REQ_add0_attr(req, attr)) { X509_ATTRIBUTE_free(attr); return 0; } @@ -228,8 +229,8 @@ int X509_REQ_add1_attr_by_NID(X509_REQ *req, int nid, int attrtype, int X509_REQ_add1_attr_by_txt(X509_REQ *req, const char *attrname, int attrtype, const unsigned char *data, int len) { X509_ATTRIBUTE *attr = - X509_ATTRIBUTE_create_by_txt(NULL, attrname, attrtype, data, len); - if (attr == NULL || !X509_REQ_add0_attr(req, attr)) { + X509_ATTRIBUTE_create_by_txt(nullptr, attrname, attrtype, data, len); + if (attr == nullptr || !X509_REQ_add0_attr(req, attr)) { X509_ATTRIBUTE_free(attr); return 0; } @@ -239,10 +240,10 @@ int X509_REQ_add1_attr_by_txt(X509_REQ *req, const char *attrname, int attrtype, void X509_REQ_get0_signature(const X509_REQ *req, const ASN1_BIT_STRING **psig, const X509_ALGOR **palg) { - if (psig != NULL) { + if (psig != nullptr) { *psig = req->signature; } - if (palg != NULL) { + if (palg != nullptr) { *palg = req->sig_alg; } } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_set.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_set.cc index 332c0a5b2c..9f39a72fd6 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_set.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_set.cc @@ -21,16 +21,10 @@ #include "internal.h" -long X509_get_version(const X509 *x509) { - // The default version is v1(0). - if (x509->cert_info->version == NULL) { - return X509_VERSION_1; - } - return ASN1_INTEGER_get(x509->cert_info->version); -} +long X509_get_version(const X509 *x509) { return x509->version; } int X509_set_version(X509 *x, long version) { - if (x == NULL) { + if (x == nullptr) { return 0; } @@ -39,20 +33,8 @@ int X509_set_version(X509 *x, long version) { return 0; } - // v1(0) is default and is represented by omitting the version. - if (version == X509_VERSION_1) { - ASN1_INTEGER_free(x->cert_info->version); - x->cert_info->version = NULL; - return 1; - } - - if (x->cert_info->version == NULL) { - x->cert_info->version = ASN1_INTEGER_new(); - if (x->cert_info->version == NULL) { - return 0; - } - } - return ASN1_INTEGER_set_int64(x->cert_info->version, version); + x->version = static_cast(version); + return 1; } int X509_set_serialNumber(X509 *x, const ASN1_INTEGER *serial) { @@ -61,138 +43,99 @@ int X509_set_serialNumber(X509 *x, const ASN1_INTEGER *serial) { return 0; } - ASN1_INTEGER *in; - if (x == NULL) { - return 0; - } - in = x->cert_info->serialNumber; - if (in != serial) { - in = ASN1_INTEGER_dup(serial); - if (in != NULL) { - ASN1_INTEGER_free(x->cert_info->serialNumber); - x->cert_info->serialNumber = in; - } - } - return in != NULL; + return ASN1_STRING_copy(&x->serialNumber, serial); } -int X509_set_issuer_name(X509 *x, X509_NAME *name) { - if ((x == NULL) || (x->cert_info == NULL)) { +int X509_set_issuer_name(X509 *x, const X509_NAME *name) { + if (x == nullptr) { return 0; } - return (X509_NAME_set(&x->cert_info->issuer, name)); + return x509_name_copy(&x->issuer, name); } -int X509_set_subject_name(X509 *x, X509_NAME *name) { - if ((x == NULL) || (x->cert_info == NULL)) { +int X509_set_subject_name(X509 *x, const X509_NAME *name) { + if (x == nullptr) { return 0; } - return (X509_NAME_set(&x->cert_info->subject, name)); + return x509_name_copy(&x->subject, name); } int X509_set1_notBefore(X509 *x, const ASN1_TIME *tm) { - ASN1_TIME *in; - - if ((x == NULL) || (x->cert_info->validity == NULL)) { - return 0; - } - in = x->cert_info->validity->notBefore; - if (in != tm) { - in = ASN1_STRING_dup(tm); - if (in != NULL) { - ASN1_TIME_free(x->cert_info->validity->notBefore); - x->cert_info->validity->notBefore = in; - } - } - return in != NULL; + // TODO(crbug.com/42290309): Check that |tm->type| is correct. + return ASN1_STRING_copy(&x->notBefore, tm); } int X509_set_notBefore(X509 *x, const ASN1_TIME *tm) { return X509_set1_notBefore(x, tm); } -const ASN1_TIME *X509_get0_notBefore(const X509 *x) { - return x->cert_info->validity->notBefore; -} +const ASN1_TIME *X509_get0_notBefore(const X509 *x) { return &x->notBefore; } ASN1_TIME *X509_getm_notBefore(X509 *x) { // Note this function takes a const |X509| pointer in OpenSSL. We require // non-const as this allows mutating |x|. If it comes up for compatibility, // we can relax this. - return x->cert_info->validity->notBefore; + return &x->notBefore; } ASN1_TIME *X509_get_notBefore(const X509 *x509) { // In OpenSSL, this function is an alias for |X509_getm_notBefore|, but our // |X509_getm_notBefore| is const-correct. |X509_get_notBefore| was // originally a macro, so it needs to capture both get0 and getm use cases. - return x509->cert_info->validity->notBefore; + return const_cast(&x509->notBefore); } int X509_set1_notAfter(X509 *x, const ASN1_TIME *tm) { - ASN1_TIME *in; - - if ((x == NULL) || (x->cert_info->validity == NULL)) { - return 0; - } - in = x->cert_info->validity->notAfter; - if (in != tm) { - in = ASN1_STRING_dup(tm); - if (in != NULL) { - ASN1_TIME_free(x->cert_info->validity->notAfter); - x->cert_info->validity->notAfter = in; - } - } - return in != NULL; + // TODO(crbug.com/42290309): Check that |tm->type| is correct. + return ASN1_STRING_copy(&x->notAfter, tm); } int X509_set_notAfter(X509 *x, const ASN1_TIME *tm) { return X509_set1_notAfter(x, tm); } -const ASN1_TIME *X509_get0_notAfter(const X509 *x) { - return x->cert_info->validity->notAfter; -} +const ASN1_TIME *X509_get0_notAfter(const X509 *x) { return &x->notAfter; } ASN1_TIME *X509_getm_notAfter(X509 *x) { // Note this function takes a const |X509| pointer in OpenSSL. We require // non-const as this allows mutating |x|. If it comes up for compatibility, // we can relax this. - return x->cert_info->validity->notAfter; + return &x->notAfter; } ASN1_TIME *X509_get_notAfter(const X509 *x509) { // In OpenSSL, this function is an alias for |X509_getm_notAfter|, but our // |X509_getm_notAfter| is const-correct. |X509_get_notAfter| was // originally a macro, so it needs to capture both get0 and getm use cases. - return x509->cert_info->validity->notAfter; -} + return const_cast(&x509->notAfter); + } void X509_get0_uids(const X509 *x509, const ASN1_BIT_STRING **out_issuer_uid, const ASN1_BIT_STRING **out_subject_uid) { - if (out_issuer_uid != NULL) { - *out_issuer_uid = x509->cert_info->issuerUID; + if (out_issuer_uid != nullptr) { + *out_issuer_uid = x509->issuerUID; } - if (out_subject_uid != NULL) { - *out_subject_uid = x509->cert_info->subjectUID; + if (out_subject_uid != nullptr) { + *out_subject_uid = x509->subjectUID; } } int X509_set_pubkey(X509 *x, EVP_PKEY *pkey) { - if ((x == NULL) || (x->cert_info == NULL)) { + if (x == nullptr) { return 0; } - return (X509_PUBKEY_set(&(x->cert_info->key), pkey)); + return x509_pubkey_set1(&x->key, pkey); } const STACK_OF(X509_EXTENSION) *X509_get0_extensions(const X509 *x) { - return x->cert_info->extensions; + return x->extensions; } const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x) { - return x->cert_info->signature; + return &x->tbs_sig_alg; } X509_PUBKEY *X509_get_X509_PUBKEY(const X509 *x509) { - return x509->cert_info->key; + // This function is not const-correct for OpenSSL compatibility. + return const_cast(&x509->key); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_trs.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_trs.cc index d5540bfc0f..4b90d30a37 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_trs.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_trs.cc @@ -43,12 +43,12 @@ static const X509_TRUST trstandard[] = { {X509_TRUST_TSA, trust_1oidany, NID_time_stamp}}; static const X509_TRUST *X509_TRUST_get0(int id) { - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(trstandard); i++) { - if (trstandard[i].trust == id) { - return &trstandard[i]; + for (const auto &t : trstandard) { + if (t.trust == id) { + return &t; } } - return NULL; + return nullptr; } int X509_check_trust(X509 *x, int id, int flags) { @@ -61,10 +61,10 @@ int X509_check_trust(X509 *x, int id, int flags) { if (rv != X509_TRUST_UNTRUSTED) { return rv; } - return trust_compat(NULL, x); + return trust_compat(nullptr, x); } const X509_TRUST *pt = X509_TRUST_get0(id); - if (pt == NULL) { + if (pt == nullptr) { // Unknown trust IDs are silently reintrepreted as NIDs. This is unreachable // from the certificate verifier itself, but wpa_supplicant relies on it. // Note this relies on commonly-used NIDs and trust IDs not colliding. @@ -74,7 +74,7 @@ int X509_check_trust(X509 *x, int id, int flags) { } int X509_is_valid_trust_id(int trust) { - return X509_TRUST_get0(trust) != NULL; + return X509_TRUST_get0(trust) != nullptr; } static int trust_1oidany(const X509_TRUST *trust, X509 *x) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_v3.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_v3.cc index 9033d7673c..c4e2aafdd0 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_v3.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_v3.cc @@ -23,7 +23,7 @@ int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x) { - if (x == NULL) { + if (x == nullptr) { return 0; } return (int)sk_X509_EXTENSION_num(x); @@ -32,7 +32,7 @@ int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x) { int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, int nid, int lastpos) { const ASN1_OBJECT *obj = OBJ_nid2obj(nid); - if (obj == NULL) { + if (obj == nullptr) { return -1; } return X509v3_get_ext_by_OBJ(x, obj, lastpos); @@ -40,7 +40,7 @@ int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, int nid, int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *sk, const ASN1_OBJECT *obj, int lastpos) { - if (sk == NULL) { + if (sk == nullptr) { return -1; } lastpos++; @@ -59,7 +59,7 @@ int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *sk, int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *sk, int crit, int lastpos) { - if (sk == NULL) { + if (sk == nullptr) { return -1; } @@ -80,8 +80,8 @@ int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *sk, int crit, } X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc) { - if (x == NULL || loc < 0 || sk_X509_EXTENSION_num(x) <= (size_t)loc) { - return NULL; + if (x == nullptr || loc < 0 || sk_X509_EXTENSION_num(x) <= (size_t)loc) { + return nullptr; } else { return sk_X509_EXTENSION_value(x, loc); } @@ -90,8 +90,8 @@ X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc) { X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc) { X509_EXTENSION *ret; - if (x == NULL || loc < 0 || sk_X509_EXTENSION_num(x) <= (size_t)loc) { - return NULL; + if (x == nullptr || loc < 0 || sk_X509_EXTENSION_num(x) <= (size_t)loc) { + return nullptr; } ret = sk_X509_EXTENSION_delete(x, loc); return ret; @@ -99,17 +99,17 @@ X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc) { STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, const X509_EXTENSION *ex, int loc) { - X509_EXTENSION *new_ex = NULL; - STACK_OF(X509_EXTENSION) *sk = NULL; + X509_EXTENSION *new_ex = nullptr; + STACK_OF(X509_EXTENSION) *sk = nullptr; int free_sk = 0, n; - if (x == NULL) { + if (x == nullptr) { OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER); goto err; } - if (*x == NULL) { - if ((sk = sk_X509_EXTENSION_new_null()) == NULL) { + if (*x == nullptr) { + if ((sk = sk_X509_EXTENSION_new_null()) == nullptr) { goto err; } free_sk = 1; @@ -124,13 +124,13 @@ STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, loc = n; } - if ((new_ex = X509_EXTENSION_dup(ex)) == NULL) { + if ((new_ex = X509_EXTENSION_dup(ex)) == nullptr) { goto err; } if (!sk_X509_EXTENSION_insert(sk, new_ex, loc)) { goto err; } - if (*x == NULL) { + if (*x == nullptr) { *x = sk; } return sk; @@ -140,7 +140,7 @@ err: if (free_sk) { sk_X509_EXTENSION_free(sk); } - return NULL; + return nullptr; } X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, int nid, @@ -150,9 +150,9 @@ X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, int nid, X509_EXTENSION *ret; obj = OBJ_nid2obj(nid); - if (obj == NULL) { + if (obj == nullptr) { OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_NID); - return NULL; + return nullptr; } ret = X509_EXTENSION_create_by_OBJ(ex, obj, crit, data); return ret; @@ -163,9 +163,9 @@ X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex, const ASN1_OCTET_STRING *data) { X509_EXTENSION *ret; - if ((ex == NULL) || (*ex == NULL)) { - if ((ret = X509_EXTENSION_new()) == NULL) { - return NULL; + if ((ex == nullptr) || (*ex == nullptr)) { + if ((ret = X509_EXTENSION_new()) == nullptr) { + return nullptr; } } else { ret = *ex; @@ -181,28 +181,28 @@ X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex, goto err; } - if ((ex != NULL) && (*ex == NULL)) { + if ((ex != nullptr) && (*ex == nullptr)) { *ex = ret; } return ret; err: - if ((ex == NULL) || (ret != *ex)) { + if ((ex == nullptr) || (ret != *ex)) { X509_EXTENSION_free(ret); } - return NULL; + return nullptr; } int X509_EXTENSION_set_object(X509_EXTENSION *ex, const ASN1_OBJECT *obj) { - if ((ex == NULL) || (obj == NULL)) { + if ((ex == nullptr) || (obj == nullptr)) { return 0; } ASN1_OBJECT_free(ex->object); ex->object = OBJ_dup(obj); - return ex->object != NULL; + return ex->object != nullptr; } int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit) { - if (ex == NULL) { + if (ex == nullptr) { return 0; } // The critical field is DEFAULT FALSE, so non-critical extensions should omit @@ -214,7 +214,7 @@ int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit) { int X509_EXTENSION_set_data(X509_EXTENSION *ex, const ASN1_OCTET_STRING *data) { int i; - if (ex == NULL) { + if (ex == nullptr) { return 0; } i = ASN1_OCTET_STRING_set(ex->value, data->data, data->length); @@ -225,21 +225,21 @@ int X509_EXTENSION_set_data(X509_EXTENSION *ex, const ASN1_OCTET_STRING *data) { } ASN1_OBJECT *X509_EXTENSION_get_object(const X509_EXTENSION *ex) { - if (ex == NULL) { - return NULL; + if (ex == nullptr) { + return nullptr; } return ex->object; } ASN1_OCTET_STRING *X509_EXTENSION_get_data(const X509_EXTENSION *ex) { - if (ex == NULL) { - return NULL; + if (ex == nullptr) { + return nullptr; } return ex->value; } int X509_EXTENSION_get_critical(const X509_EXTENSION *ex) { - if (ex == NULL) { + if (ex == nullptr) { return 0; } if (ex->critical > 0) { diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_vfy.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_vfy.cc index 87a714aac9..a1ae85fd97 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_vfy.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_vfy.cc @@ -106,12 +106,12 @@ static int call_verify_cb(int ok, X509_STORE_CTX *ctx) { // Given a certificate try and find an exact match in the store static X509 *lookup_cert_match(X509_STORE_CTX *ctx, X509 *x) { STACK_OF(X509) *certs; - X509 *xtmp = NULL; + X509 *xtmp = nullptr; size_t i; // Lookup all certs with matching subject name certs = X509_STORE_CTX_get1_certs(ctx, X509_get_subject_name(x)); - if (certs == NULL) { - return NULL; + if (certs == nullptr) { + return nullptr; } // Look for exact match for (i = 0; i < sk_X509_num(certs); i++) { @@ -123,28 +123,28 @@ static X509 *lookup_cert_match(X509_STORE_CTX *ctx, X509 *x) { if (i < sk_X509_num(certs)) { X509_up_ref(xtmp); } else { - xtmp = NULL; + xtmp = nullptr; } sk_X509_pop_free(certs, X509_free); return xtmp; } int X509_verify_cert(X509_STORE_CTX *ctx) { - X509 *chain_ss = NULL; + X509 *chain_ss = nullptr; int bad_chain = 0; X509_VERIFY_PARAM *param = ctx->param; int i, ok = 0; int j, retry, trust; - STACK_OF(X509) *sktmp = NULL; + STACK_OF(X509) *sktmp = nullptr; { - if (ctx->cert == NULL) { + if (ctx->cert == nullptr) { OPENSSL_PUT_ERROR(X509, X509_R_NO_CERT_SET_FOR_US_TO_VERIFY); ctx->error = X509_V_ERR_INVALID_CALL; return 0; } - if (ctx->chain != NULL) { + if (ctx->chain != nullptr) { // This X509_STORE_CTX has already been used to verify a cert. We // cannot do another one. OPENSSL_PUT_ERROR(X509, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); @@ -165,7 +165,7 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { // first we make sure the chain we are going to build is present and that // the first entry is in place ctx->chain = sk_X509_new_null(); - if (ctx->chain == NULL || !sk_X509_push(ctx->chain, ctx->cert)) { + if (ctx->chain == nullptr || !sk_X509_push(ctx->chain, ctx->cert)) { ctx->error = X509_V_ERR_OUT_OF_MEM; goto end; } @@ -173,8 +173,8 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { ctx->last_untrusted = 1; // We use a temporary STACK so we can chop and hack at it. - if (ctx->untrusted != NULL && - (sktmp = sk_X509_dup(ctx->untrusted)) == NULL) { + if (ctx->untrusted != nullptr && + (sktmp = sk_X509_dup(ctx->untrusted)) == nullptr) { ctx->error = X509_V_ERR_OUT_OF_MEM; goto end; } @@ -205,7 +205,7 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { // If asked see if we can find issuer in trusted store first if (ctx->param->flags & X509_V_FLAG_TRUSTED_FIRST) { X509 *issuer = get_trusted_issuer(ctx, x); - if (issuer != NULL) { + if (issuer != nullptr) { // Free the certificate. It will be picked up again later. X509_free(issuer); break; @@ -213,9 +213,9 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { } // If we were passed a cert chain, use it first - if (sktmp != NULL) { + if (sktmp != nullptr) { X509 *issuer = find_issuer(ctx, sktmp, x); - if (issuer != NULL) { + if (issuer != nullptr) { if (!sk_X509_push(ctx->chain, issuer)) { ctx->error = X509_V_ERR_OUT_OF_MEM; goto end; @@ -256,7 +256,7 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { // find it in the store. We must have an exact match to avoid // possible impersonation. X509 *issuer = get_trusted_issuer(ctx, x); - if (issuer == NULL || X509_cmp(x, issuer) != 0) { + if (issuer == nullptr || X509_cmp(x, issuer) != 0) { X509_free(issuer); ctx->error = X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT; ctx->current_cert = x; @@ -299,7 +299,7 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { break; } X509 *issuer = get_trusted_issuer(ctx, x); - if (issuer == NULL) { + if (issuer == nullptr) { break; } x = issuer; @@ -330,7 +330,7 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { X509 *issuer = get_trusted_issuer(ctx, sk_X509_value(ctx->chain, j - 1)); // Check if we found an alternate chain - if (issuer != NULL) { + if (issuer != nullptr) { // Free up the found cert we'll add it again later X509_free(issuer); @@ -352,7 +352,7 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { // self signed certificate in which case we've indicated an error already // and set bad_chain == 1 if (trust != X509_TRUST_TRUSTED && !bad_chain) { - if (chain_ss == NULL || + if (chain_ss == nullptr || !x509_check_issued_with_callback(ctx, x, chain_ss)) { if (ctx->last_untrusted >= num) { ctx->error = X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY; @@ -369,7 +369,7 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { ctx->last_untrusted = num; ctx->current_cert = chain_ss; ctx->error = X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN; - chain_ss = NULL; + chain_ss = nullptr; } ctx->error_depth = num - 1; @@ -418,13 +418,13 @@ static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x) { return issuer; } } - return NULL; + return nullptr; } // Given a possible certificate and issuer check them -int x509_check_issued_with_callback(X509_STORE_CTX *ctx, X509 *x, - X509 *issuer) { +int x509_check_issued_with_callback(X509_STORE_CTX *ctx, const X509 *x, + const X509 *issuer) { int ret; ret = X509_check_issued(issuer, x); if (ret == X509_V_OK) { @@ -436,23 +436,23 @@ int x509_check_issued_with_callback(X509_STORE_CTX *ctx, X509 *x, } ctx->error = ret; - ctx->current_cert = x; + ctx->current_cert = const_cast(x); return call_verify_cb(0, ctx); } static X509 *get_trusted_issuer(X509_STORE_CTX *ctx, X509 *x) { X509 *issuer; - if (ctx->trusted_stack != NULL) { + if (ctx->trusted_stack != nullptr) { // Ignore the store and use the configured stack instead. issuer = find_issuer(ctx, ctx->trusted_stack, x); - if (issuer != NULL) { + if (issuer != nullptr) { X509_up_ref(issuer); } return issuer; } if (!X509_STORE_CTX_get1_issuer(&issuer, ctx, x)) { - return NULL; + return nullptr; } return issuer; } @@ -589,7 +589,7 @@ static int check_name_constraints(X509_STORE_CTX *ctx) { // worse. A decorative common-name misidentified as a DNS name would fail // the name constraint anyway. X509 *leaf = sk_X509_value(ctx->chain, 0); - if (has_name_constraints && leaf->altname == NULL) { + if (has_name_constraints && leaf->altname == nullptr) { rv = reject_dns_name_in_common_name(leaf); switch (rv) { case X509_V_OK: @@ -625,7 +625,7 @@ static int check_hosts(X509 *x, X509_VERIFY_PARAM *param) { for (i = 0; i < n; ++i) { name = sk_OPENSSL_STRING_value(param->hosts, i); - if (X509_check_host(x, name, strlen(name), param->hostflags, NULL) > 0) { + if (X509_check_host(x, name, strlen(name), param->hostflags, nullptr) > 0) { return 1; } } @@ -659,7 +659,7 @@ static int check_id(X509_STORE_CTX *ctx) { } static int check_trust(X509_STORE_CTX *ctx) { - X509 *x = NULL; + X509 *x = nullptr; // Check all trusted certificates in chain for (size_t i = ctx->last_untrusted; i < sk_X509_num(ctx->chain); i++) { x = sk_X509_value(ctx->chain, i); @@ -721,11 +721,11 @@ static int check_revocation(X509_STORE_CTX *ctx) { } static int check_cert(X509_STORE_CTX *ctx) { - X509_CRL *crl = NULL; + X509_CRL *crl = nullptr; int ok = 0, cnum = ctx->error_depth; X509 *x = sk_X509_value(ctx->chain, cnum); ctx->current_cert = x; - ctx->current_crl_issuer = NULL; + ctx->current_crl_issuer = nullptr; ctx->current_crl_score = 0; // Try to retrieve the relevant CRL. Note that |get_crl| sets @@ -751,7 +751,7 @@ static int check_cert(X509_STORE_CTX *ctx) { err: X509_CRL_free(crl); - ctx->current_crl = NULL; + ctx->current_crl = nullptr; return ok; } @@ -768,7 +768,7 @@ static int check_crl_time(X509_STORE_CTX *ctx, X509_CRL *crl, int notify) { if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME) { ptime = ctx->param->check_time; } else { - ptime = time(NULL); + ptime = time(nullptr); } int i = X509_cmp_time_posix(X509_CRL_get0_lastUpdate(crl), ptime); @@ -816,7 +816,7 @@ static int check_crl_time(X509_STORE_CTX *ctx, X509_CRL *crl, int notify) { } if (notify) { - ctx->current_crl = NULL; + ctx->current_crl = nullptr; } return 1; @@ -826,8 +826,8 @@ static int get_crl_sk(X509_STORE_CTX *ctx, X509_CRL **pcrl, X509 **pissuer, int *pscore, STACK_OF(X509_CRL) *crls) { int crl_score, best_score = *pscore; X509 *x = ctx->current_cert; - X509_CRL *best_crl = NULL; - X509 *crl_issuer = NULL, *best_crl_issuer = NULL; + X509_CRL *best_crl = nullptr; + X509 *crl_issuer = nullptr, *best_crl_issuer = nullptr; for (size_t i = 0; i < sk_X509_CRL_num(crls); i++) { X509_CRL *crl = sk_X509_CRL_value(crls, i); @@ -836,7 +836,7 @@ static int get_crl_sk(X509_STORE_CTX *ctx, X509_CRL **pcrl, X509 **pissuer, continue; } // If current CRL is equivalent use it if it is newer - if (crl_score == best_score && best_crl != NULL) { + if (crl_score == best_score && best_crl != nullptr) { int day, sec; if (ASN1_TIME_diff(&day, &sec, X509_CRL_get0_lastUpdate(best_crl), X509_CRL_get0_lastUpdate(crl)) == 0) { @@ -918,7 +918,7 @@ static int get_crl_score(X509_STORE_CTX *ctx, X509 **pissuer, X509_CRL *crl, static int crl_akid_check(X509_STORE_CTX *ctx, X509_CRL *crl, X509 **pissuer, int *pcrl_score) { - X509 *crl_issuer = NULL; + X509 *crl_issuer = nullptr; X509_NAME *cnm = X509_CRL_get_issuer(crl); int cidx = ctx->error_depth; @@ -954,8 +954,8 @@ static int crl_akid_check(X509_STORE_CTX *ctx, X509_CRL *crl, X509 **pissuer, // relative. Compare X509_NAME to GENERAL_NAMES. 3. Both are full names and // compare two GENERAL_NAMES. 4. One is NULL: automatic match. static int idp_check_dp(DIST_POINT_NAME *a, DIST_POINT_NAME *b) { - X509_NAME *nm = NULL; - GENERAL_NAMES *gens = NULL; + X509_NAME *nm = nullptr; + GENERAL_NAMES *gens = nullptr; GENERAL_NAME *gena, *genb; size_t i, j; if (!a || !b) { @@ -1042,7 +1042,7 @@ static int crl_crldp_check(X509 *x, X509_CRL *crl, int crl_score) { // // We also do not support indirect CRLs, and a CRL issuer can only match // indirect CRLs (RFC 5280, section 6.3.3, step b.1). - if (dp->reasons != NULL || dp->CRLissuer != NULL) { + if (dp->reasons != nullptr || dp->CRLissuer != nullptr) { continue; } // At this point we have already checked that the CRL issuer matches @@ -1064,10 +1064,10 @@ static int crl_crldp_check(X509 *x, X509_CRL *crl, int crl_score) { // Retrieve CRL corresponding to current certificate. static int get_crl(X509_STORE_CTX *ctx, X509_CRL **pcrl, X509 *x) { - X509 *issuer = NULL; + X509 *issuer = nullptr; int crl_score = 0; - X509_CRL *crl = NULL; - STACK_OF(X509_CRL) *skcrl = NULL; + X509_CRL *crl = nullptr; + STACK_OF(X509_CRL) *skcrl = nullptr; if (get_crl_sk(ctx, &crl, &issuer, &crl_score, ctx->crls)) { goto done; } @@ -1098,7 +1098,7 @@ done: // Check CRL validity static int check_crl(X509_STORE_CTX *ctx, X509_CRL *crl) { - X509 *issuer = NULL; + X509 *issuer = nullptr; int cnum = ctx->error_depth; int chnum = (int)sk_X509_num(ctx->chain) - 1; // If we have an alternative CRL issuer cert use that. Otherwise, it is the @@ -1195,7 +1195,7 @@ static int cert_crl(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x) { } static int check_policy(X509_STORE_CTX *ctx) { - X509 *current_cert = NULL; + X509 *current_cert = nullptr; int ret = X509_policy_check(ctx->chain, ctx->param->policies, ctx->param->flags, ¤t_cert); if (ret != X509_V_OK) { @@ -1219,7 +1219,7 @@ static int check_cert_time(X509_STORE_CTX *ctx, X509 *x) { if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME) { ptime = ctx->param->check_time; } else { - ptime = time(NULL); + ptime = time(nullptr); } int i = X509_cmp_time_posix(X509_get_notBefore(x), ptime); @@ -1299,7 +1299,7 @@ static int internal_verify(X509_STORE_CTX *ctx) { // time. if (xs != xi || (ctx->param->flags & X509_V_FLAG_CHECK_SS_SIGNATURE)) { EVP_PKEY *pkey = X509_get0_pubkey(xi); - if (pkey == NULL) { + if (pkey == nullptr) { ctx->error = X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY; ctx->current_cert = xi; if (!call_verify_cb(0, ctx)) { @@ -1336,11 +1336,11 @@ static int internal_verify(X509_STORE_CTX *ctx) { } int X509_cmp_current_time(const ASN1_TIME *ctm) { - return X509_cmp_time_posix(ctm, time(NULL)); + return X509_cmp_time_posix(ctm, time(nullptr)); } int X509_cmp_time(const ASN1_TIME *ctm, const time_t *cmp_time) { - int64_t compare_time = (cmp_time == NULL) ? time(NULL) : *cmp_time; + int64_t compare_time = (cmp_time == nullptr) ? time(nullptr) : *cmp_time; return X509_cmp_time_posix(ctm, compare_time); } @@ -1354,7 +1354,7 @@ int X509_cmp_time_posix(const ASN1_TIME *ctm, int64_t cmp_time) { } ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long offset_sec) { - return X509_time_adj(s, offset_sec, NULL); + return X509_time_adj(s, offset_sec, nullptr); } ASN1_TIME *X509_time_adj(ASN1_TIME *s, long offset_sec, const time_t *in_tm) { @@ -1368,7 +1368,7 @@ ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, int offset_day, long offset_sec, if (in_tm) { t = *in_tm; } else { - t = time(NULL); + t = time(nullptr); } return ASN1_TIME_adj(s, t, offset_day, offset_sec); @@ -1413,7 +1413,7 @@ STACK_OF(X509) *X509_STORE_CTX_get0_chain(const X509_STORE_CTX *ctx) { STACK_OF(X509) *X509_STORE_CTX_get1_chain(const X509_STORE_CTX *ctx) { if (!ctx->chain) { - return NULL; + return nullptr; } return X509_chain_up_ref(ctx->chain); } @@ -1426,7 +1426,7 @@ X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(const X509_STORE_CTX *ctx) { // In OpenSSL, an |X509_STORE_CTX| sometimes has a parent context during CRL // path validation for indirect CRLs. We require the CRL to be issued // somewhere along the certificate path, so this is always NULL. - return NULL; + return nullptr; } void X509_STORE_CTX_set_chain(X509_STORE_CTX *ctx, STACK_OF(X509) *sk) { @@ -1448,7 +1448,7 @@ int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose) { } const X509_PURPOSE *pobj = X509_PURPOSE_get0(purpose); - if (pobj == NULL) { + if (pobj == nullptr) { OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_PURPOSE_ID); return 0; } @@ -1487,7 +1487,7 @@ X509_STORE_CTX *X509_STORE_CTX_new(void) { } void X509_STORE_CTX_free(X509_STORE_CTX *ctx) { - if (ctx == NULL) { + if (ctx == nullptr) { return; } X509_STORE_CTX_cleanup(ctx); @@ -1504,7 +1504,7 @@ int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509, CRYPTO_new_ex_data(&ctx->ex_data); - if (store == NULL) { + if (store == nullptr) { OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER); goto err; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_vpm.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_vpm.cc index 5a113fb8dd..83509ef251 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_vpm.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509_vpm.cc @@ -34,7 +34,7 @@ static int int_x509_param_set_hosts(X509_VERIFY_PARAM *param, int mode, const char *name, size_t namelen) { char *copy; - if (name == NULL || namelen == 0) { + if (name == nullptr || namelen == 0) { // Unlike OpenSSL, we reject trying to set or add an empty name. return 0; } @@ -47,16 +47,16 @@ static int int_x509_param_set_hosts(X509_VERIFY_PARAM *param, int mode, if (mode == SET_HOST && param->hosts) { sk_OPENSSL_STRING_pop_free(param->hosts, str_free); - param->hosts = NULL; + param->hosts = nullptr; } copy = OPENSSL_strndup(name, namelen); - if (copy == NULL) { + if (copy == nullptr) { return 0; } - if (param->hosts == NULL && - (param->hosts = sk_OPENSSL_STRING_new_null()) == NULL) { + if (param->hosts == nullptr && + (param->hosts = sk_OPENSSL_STRING_new_null()) == nullptr) { OPENSSL_free(copy); return 0; } @@ -65,7 +65,7 @@ static int int_x509_param_set_hosts(X509_VERIFY_PARAM *param, int mode, OPENSSL_free(copy); if (sk_OPENSSL_STRING_num(param->hosts) == 0) { sk_OPENSSL_STRING_free(param->hosts); - param->hosts = NULL; + param->hosts = nullptr; } return 0; } @@ -77,14 +77,14 @@ X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void) { X509_VERIFY_PARAM *param = reinterpret_cast( OPENSSL_zalloc(sizeof(X509_VERIFY_PARAM))); if (!param) { - return NULL; + return nullptr; } param->depth = -1; return param; } void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param) { - if (param == NULL) { + if (param == nullptr) { return; } sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free); @@ -117,7 +117,7 @@ static void copy_int_param(int *dest, const int *src, int default_val, static int x509_verify_param_copy(X509_VERIFY_PARAM *dest, const X509_VERIFY_PARAM *src, int prefer_src) { - if (src == NULL) { + if (src == nullptr) { return 1; } @@ -135,19 +135,20 @@ static int x509_verify_param_copy(X509_VERIFY_PARAM *dest, dest->flags |= src->flags; - if (should_copy(dest->policies != NULL, src->policies != NULL, prefer_src)) { + if (should_copy(dest->policies != nullptr, src->policies != nullptr, + prefer_src)) { if (!X509_VERIFY_PARAM_set1_policies(dest, src->policies)) { return 0; } } - if (should_copy(dest->hosts != NULL, src->hosts != NULL, prefer_src)) { + if (should_copy(dest->hosts != nullptr, src->hosts != nullptr, prefer_src)) { sk_OPENSSL_STRING_pop_free(dest->hosts, str_free); - dest->hosts = NULL; + dest->hosts = nullptr; if (src->hosts) { dest->hosts = sk_OPENSSL_STRING_deep_copy(src->hosts, OPENSSL_strdup, str_free); - if (dest->hosts == NULL) { + if (dest->hosts == nullptr) { return 0; } // Copy the host flags if and only if we're copying the host list. Note @@ -158,13 +159,13 @@ static int x509_verify_param_copy(X509_VERIFY_PARAM *dest, } } - if (should_copy(dest->email != NULL, src->email != NULL, prefer_src)) { + if (should_copy(dest->email != nullptr, src->email != nullptr, prefer_src)) { if (!X509_VERIFY_PARAM_set1_email(dest, src->email, src->emaillen)) { return 0; } } - if (should_copy(dest->ip != NULL, src->ip != NULL, prefer_src)) { + if (should_copy(dest->ip != nullptr, src->ip != nullptr, prefer_src)) { if (!X509_VERIFY_PARAM_set1_ip(dest, src->ip, src->iplen)) { return 0; } @@ -191,7 +192,7 @@ int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, static int int_x509_param_set1(char **pdest, size_t *pdestlen, const char *src, size_t srclen) { void *tmp; - if (src == NULL || srclen == 0) { + if (src == nullptr || srclen == 0) { // Unlike OpenSSL, we do not allow an empty string to disable previously // configured checks. return 0; @@ -228,7 +229,7 @@ unsigned long X509_VERIFY_PARAM_get_flags(const X509_VERIFY_PARAM *param) { } int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose) { - if (X509_PURPOSE_get0(purpose) == NULL) { + if (X509_PURPOSE_get0(purpose) == nullptr) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_PURPOSE); return 0; } @@ -281,7 +282,7 @@ int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free); if (!policies) { - param->policies = NULL; + param->policies = nullptr; return 1; } @@ -319,7 +320,7 @@ void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param, int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, const char *email, size_t emaillen) { - if (OPENSSL_memchr(email, '\0', emaillen) != NULL || + if (OPENSSL_memchr(email, '\0', emaillen) != nullptr || !int_x509_param_set1(¶m->email, ¶m->emaillen, email, emaillen)) { param->poison = 1; return 0; @@ -436,5 +437,5 @@ const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name) { if (strcmp(name, "ssl_server") == 0) { return &kSSLServerParam; } - return NULL; + return nullptr; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509cset.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509cset.cc index 3fd39f7255..a6d686b5ee 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509cset.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509cset.cc @@ -22,7 +22,7 @@ #include "internal.h" int X509_CRL_set_version(X509_CRL *x, long version) { - if (x == NULL) { + if (x == nullptr) { return 0; } @@ -34,21 +34,21 @@ int X509_CRL_set_version(X509_CRL *x, long version) { // v1(0) is default and is represented by omitting the version. if (version == X509_CRL_VERSION_1) { ASN1_INTEGER_free(x->crl->version); - x->crl->version = NULL; + x->crl->version = nullptr; return 1; } - if (x->crl->version == NULL) { + if (x->crl->version == nullptr) { x->crl->version = ASN1_INTEGER_new(); - if (x->crl->version == NULL) { + if (x->crl->version == nullptr) { return 0; } } return ASN1_INTEGER_set_int64(x->crl->version, version); } -int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name) { - if ((x == NULL) || (x->crl == NULL)) { +int X509_CRL_set_issuer_name(X509_CRL *x, const X509_NAME *name) { + if ((x == nullptr) || (x->crl == nullptr)) { return 0; } return (X509_NAME_set(&x->crl->issuer, name)); @@ -57,35 +57,35 @@ int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name) { int X509_CRL_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm) { ASN1_TIME *in; - if (x == NULL) { + if (x == nullptr) { return 0; } in = x->crl->lastUpdate; if (in != tm) { in = ASN1_STRING_dup(tm); - if (in != NULL) { + if (in != nullptr) { ASN1_TIME_free(x->crl->lastUpdate); x->crl->lastUpdate = in; } } - return in != NULL; + return in != nullptr; } int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm) { ASN1_TIME *in; - if (x == NULL) { + if (x == nullptr) { return 0; } in = x->crl->nextUpdate; if (in != tm) { in = ASN1_STRING_dup(tm); - if (in != NULL) { + if (in != nullptr) { ASN1_TIME_free(x->crl->nextUpdate); x->crl->nextUpdate = in; } } - return in != NULL; + return in != nullptr; } int X509_CRL_sort(X509_CRL *c) { @@ -132,10 +132,10 @@ const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl) { void X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig, const X509_ALGOR **palg) { - if (psig != NULL) { + if (psig != nullptr) { *psig = crl->signature; } - if (palg != NULL) { + if (palg != nullptr) { *palg = crl->sig_alg; } } @@ -152,18 +152,18 @@ int X509_REVOKED_set_revocationDate(X509_REVOKED *revoked, const ASN1_TIME *tm) { ASN1_TIME *in; - if (revoked == NULL) { + if (revoked == nullptr) { return 0; } in = revoked->revocationDate; if (in != tm) { in = ASN1_STRING_dup(tm); - if (in != NULL) { + if (in != nullptr) { ASN1_TIME_free(revoked->revocationDate); revoked->revocationDate = in; } } - return in != NULL; + return in != nullptr; } const ASN1_INTEGER *X509_REVOKED_get0_serialNumber( @@ -180,18 +180,18 @@ int X509_REVOKED_set_serialNumber(X509_REVOKED *revoked, return 0; } - if (revoked == NULL) { + if (revoked == nullptr) { return 0; } in = revoked->serialNumber; if (in != serial) { in = ASN1_INTEGER_dup(serial); - if (in != NULL) { + if (in != nullptr) { ASN1_INTEGER_free(revoked->serialNumber); revoked->serialNumber = in; } } - return in != NULL; + return in != nullptr; } const STACK_OF(X509_EXTENSION) *X509_REVOKED_get0_extensions( @@ -209,19 +209,8 @@ int i2d_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp) { } int X509_CRL_set1_signature_algo(X509_CRL *crl, const X509_ALGOR *algo) { - X509_ALGOR *copy1 = X509_ALGOR_dup(algo); - X509_ALGOR *copy2 = X509_ALGOR_dup(algo); - if (copy1 == NULL || copy2 == NULL) { - X509_ALGOR_free(copy1); - X509_ALGOR_free(copy2); - return 0; - } - - X509_ALGOR_free(crl->sig_alg); - crl->sig_alg = copy1; - X509_ALGOR_free(crl->crl->sig_alg); - crl->crl->sig_alg = copy2; - return 1; + return X509_ALGOR_copy(crl->sig_alg, algo) && + X509_ALGOR_copy(crl->crl->sig_alg, algo); } int X509_CRL_set1_signature_value(X509_CRL *crl, const uint8_t *sig, diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509name.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509name.cc index 8f9792c517..1625fd8b98 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509name.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509name.cc @@ -31,7 +31,7 @@ int X509_NAME_get_text_by_NID(const X509_NAME *name, int nid, char *buf, const ASN1_OBJECT *obj; obj = OBJ_nid2obj(nid); - if (obj == NULL) { + if (obj == nullptr) { return -1; } return (X509_NAME_get_text_by_OBJ(name, obj, buf, len)); @@ -45,7 +45,7 @@ int X509_NAME_get_text_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj, } const ASN1_STRING *data = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, i)); - unsigned char *text = NULL; + unsigned char *text = nullptr; int ret = -1; int text_len = ASN1_STRING_to_UTF8(&text, data); // Fail if we could not encode as UTF-8. @@ -54,13 +54,13 @@ int X509_NAME_get_text_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj, } CBS cbs; CBS_init(&cbs, text, text_len); - // Fail if the UTF-8 encoding constains a 0 byte because this is - // returned as a C string and callers very often do not check. + // Fail if the UTF-8 encoding contains a 0 byte because this is returned as a + // C string and callers very often do not check. if (CBS_contains_zero_byte(&cbs)) { goto out; } // We still support the "pass NULL to find out how much" API - if (buf != NULL) { + if (buf != nullptr) { if (text_len >= len || len <= 0 || !CBS_copy_bytes(&cbs, (uint8_t *)buf, text_len)) { goto out; @@ -76,7 +76,7 @@ out: } int X509_NAME_entry_count(const X509_NAME *name) { - if (name == NULL) { + if (name == nullptr) { return 0; } return (int)sk_X509_NAME_ENTRY_num(name->entries); @@ -86,16 +86,16 @@ int X509_NAME_get_index_by_NID(const X509_NAME *name, int nid, int lastpos) { const ASN1_OBJECT *obj; obj = OBJ_nid2obj(nid); - if (obj == NULL) { + if (obj == nullptr) { return -2; } return X509_NAME_get_index_by_OBJ(name, obj, lastpos); } -// NOTE: you should be passsing -1, not 0 as lastpos +// NOTE: you should be passing -1, not 0 as lastpos int X509_NAME_get_index_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj, int lastpos) { - if (name == NULL) { + if (name == nullptr) { return -1; } if (lastpos < 0) { @@ -113,24 +113,24 @@ int X509_NAME_get_index_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj, } X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name, int loc) { - if (name == NULL || loc < 0 || + if (name == nullptr || loc < 0 || sk_X509_NAME_ENTRY_num(name->entries) <= (size_t)loc) { - return NULL; + return nullptr; } else { return (sk_X509_NAME_ENTRY_value(name->entries, loc)); } } X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc) { - if (name == NULL || loc < 0 || + if (name == nullptr || loc < 0 || sk_X509_NAME_ENTRY_num(name->entries) <= (size_t)loc) { - return NULL; + return nullptr; } STACK_OF(X509_NAME_ENTRY) *sk = name->entries; X509_NAME_ENTRY *ret = sk_X509_NAME_ENTRY_delete(sk, loc); size_t n = sk_X509_NAME_ENTRY_num(sk); - name->modified = 1; + x509_name_invalidate_cache(name); if ((size_t)loc == n) { return ret; } @@ -157,7 +157,7 @@ int X509_NAME_add_entry_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, int type, const unsigned char *bytes, ossl_ssize_t len, int loc, int set) { X509_NAME_ENTRY *ne = - X509_NAME_ENTRY_create_by_OBJ(NULL, obj, type, bytes, len); + X509_NAME_ENTRY_create_by_OBJ(nullptr, obj, type, bytes, len); if (!ne) { return 0; } @@ -170,7 +170,7 @@ int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, const unsigned char *bytes, ossl_ssize_t len, int loc, int set) { X509_NAME_ENTRY *ne = - X509_NAME_ENTRY_create_by_NID(NULL, nid, type, bytes, len); + X509_NAME_ENTRY_create_by_NID(nullptr, nid, type, bytes, len); if (!ne) { return 0; } @@ -183,7 +183,7 @@ int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, const unsigned char *bytes, ossl_ssize_t len, int loc, int set) { X509_NAME_ENTRY *ne = - X509_NAME_ENTRY_create_by_txt(NULL, field, type, bytes, len); + X509_NAME_ENTRY_create_by_txt(nullptr, field, type, bytes, len); if (!ne) { return 0; } @@ -196,14 +196,17 @@ int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, // guy we are about to stomp on. int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *entry, int loc, int set) { - X509_NAME_ENTRY *new_name = NULL; - int i, inc; - STACK_OF(X509_NAME_ENTRY) *sk; - - if (name == NULL) { + if (name == nullptr) { return 0; } - sk = name->entries; + if (name->entries == nullptr) { + name->entries = sk_X509_NAME_ENTRY_new_null(); + if (name->entries == nullptr) { + return 0; + } + } + + STACK_OF(X509_NAME_ENTRY) *sk = name->entries; int n = (int)sk_X509_NAME_ENTRY_num(sk); if (loc > n) { loc = n; @@ -211,8 +214,8 @@ int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *entry, int loc, loc = n; } - inc = (set == 0); - name->modified = 1; + bool inc = set == 0; + x509_name_invalidate_cache(name); if (set == -1) { if (loc == 0) { @@ -222,7 +225,6 @@ int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *entry, int loc, set = sk_X509_NAME_ENTRY_value(sk, loc - 1)->set; } } else { // if (set >= 0) - if (loc >= n) { if (loc != 0) { set = sk_X509_NAME_ENTRY_value(sk, loc - 1)->set + 1; @@ -234,25 +236,22 @@ int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *entry, int loc, } } - if ((new_name = X509_NAME_ENTRY_dup(entry)) == NULL) { - goto err; + bssl::UniquePtr new_entry(X509_NAME_ENTRY_dup(entry)); + if (new_entry == nullptr) { + return 0; } - new_name->set = set; - if (!sk_X509_NAME_ENTRY_insert(sk, new_name, loc)) { - goto err; + new_entry->set = set; + if (!sk_X509_NAME_ENTRY_insert(sk, new_entry.get(), loc)) { + return 0; } + new_entry.release(); // |sk| took ownership. if (inc) { n = (int)sk_X509_NAME_ENTRY_num(sk); - for (i = loc + 1; i < n; i++) { + for (int i = loc + 1; i < n; i++) { sk_X509_NAME_ENTRY_value(sk, i)->set += 1; } } return 1; -err: - if (new_name != NULL) { - X509_NAME_ENTRY_free(new_name); - } - return 0; } X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, @@ -263,10 +262,10 @@ X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, X509_NAME_ENTRY *nentry; obj = OBJ_txt2obj(field, 0); - if (obj == NULL) { + if (obj == nullptr) { OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_NAME); ERR_add_error_data(2, "name=", field); - return NULL; + return nullptr; } nentry = X509_NAME_ENTRY_create_by_OBJ(ne, obj, type, bytes, len); ASN1_OBJECT_free(obj); @@ -278,9 +277,9 @@ X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, const unsigned char *bytes, ossl_ssize_t len) { const ASN1_OBJECT *obj = OBJ_nid2obj(nid); - if (obj == NULL) { + if (obj == nullptr) { OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_NID); - return NULL; + return nullptr; } return X509_NAME_ENTRY_create_by_OBJ(ne, obj, type, bytes, len); } @@ -291,9 +290,9 @@ X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, ossl_ssize_t len) { X509_NAME_ENTRY *ret; - if ((ne == NULL) || (*ne == NULL)) { - if ((ret = X509_NAME_ENTRY_new()) == NULL) { - return NULL; + if ((ne == nullptr) || (*ne == nullptr)) { + if ((ret = X509_NAME_ENTRY_new()) == nullptr) { + return nullptr; } } else { ret = *ne; @@ -306,60 +305,60 @@ X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, goto err; } - if ((ne != NULL) && (*ne == NULL)) { + if ((ne != nullptr) && (*ne == nullptr)) { *ne = ret; } return ret; err: - if ((ne == NULL) || (ret != *ne)) { + if ((ne == nullptr) || (ret != *ne)) { X509_NAME_ENTRY_free(ret); } - return NULL; + return nullptr; } int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, const ASN1_OBJECT *obj) { - if ((ne == NULL) || (obj == NULL)) { + if ((ne == nullptr) || (obj == nullptr)) { OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER); return 0; } ASN1_OBJECT_free(ne->object); ne->object = OBJ_dup(obj); - return ((ne->object == NULL) ? 0 : 1); + return ((ne->object == nullptr) ? 0 : 1); } int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, const unsigned char *bytes, ossl_ssize_t len) { - if ((ne == NULL) || ((bytes == NULL) && (len != 0))) { + if ((ne == nullptr) || ((bytes == nullptr) && (len != 0))) { return 0; } if ((type > 0) && (type & MBSTRING_FLAG)) { - return ASN1_STRING_set_by_NID(&ne->value, bytes, len, type, - OBJ_obj2nid(ne->object)) - ? 1 - : 0; + ASN1_STRING *dst = &ne->value; + return ASN1_STRING_set_by_NID(&dst, bytes, len, type, + OBJ_obj2nid(ne->object)) != nullptr; } if (len < 0) { len = strlen((const char *)bytes); } - if (!ASN1_STRING_set(ne->value, bytes, len)) { + if (!ASN1_STRING_set(&ne->value, bytes, len)) { return 0; } if (type != V_ASN1_UNDEF) { - ne->value->type = type; + ne->value.type = type; } return 1; } ASN1_OBJECT *X509_NAME_ENTRY_get_object(const X509_NAME_ENTRY *ne) { - if (ne == NULL) { - return NULL; + if (ne == nullptr) { + return nullptr; } return ne->object; } ASN1_STRING *X509_NAME_ENTRY_get_data(const X509_NAME_ENTRY *ne) { - if (ne == NULL) { - return NULL; + if (ne == nullptr) { + return nullptr; } - return ne->value; + // This function is not const-correct for OpenSSL compatibility. + return const_cast(&ne->value); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509rset.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509rset.cc index eaff8c627a..15a147fdfb 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509rset.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509rset.cc @@ -21,7 +21,7 @@ int X509_REQ_set_version(X509_REQ *x, long version) { - if (x == NULL) { + if (x == nullptr) { return 0; } if (version != X509_REQ_VERSION_1) { @@ -32,28 +32,21 @@ int X509_REQ_set_version(X509_REQ *x, long version) { } int X509_REQ_set_subject_name(X509_REQ *x, X509_NAME *name) { - if ((x == NULL) || (x->req_info == NULL)) { + if ((x == nullptr) || (x->req_info == nullptr)) { return 0; } return (X509_NAME_set(&x->req_info->subject, name)); } int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey) { - if ((x == NULL) || (x->req_info == NULL)) { + if ((x == nullptr) || (x->req_info == nullptr)) { return 0; } return (X509_PUBKEY_set(&x->req_info->pubkey, pkey)); } int X509_REQ_set1_signature_algo(X509_REQ *req, const X509_ALGOR *algo) { - X509_ALGOR *copy = X509_ALGOR_dup(algo); - if (copy == NULL) { - return 0; - } - - X509_ALGOR_free(req->sig_alg); - req->sig_alg = copy; - return 1; + return X509_ALGOR_copy(req->sig_alg, algo); } int X509_REQ_set1_signature_value(X509_REQ *req, const uint8_t *sig, diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509spki.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509spki.cc index 6649f47575..67b07997f8 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509spki.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x509spki.cc @@ -20,15 +20,15 @@ #include int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey) { - if ((x == NULL) || (x->spkac == NULL)) { + if ((x == nullptr) || (x->spkac == nullptr)) { return 0; } return (X509_PUBKEY_set(&(x->spkac->pubkey), pkey)); } EVP_PKEY *NETSCAPE_SPKI_get_pubkey(const NETSCAPE_SPKI *x) { - if ((x == NULL) || (x->spkac == NULL)) { - return NULL; + if ((x == nullptr) || (x->spkac == nullptr)) { + return nullptr; } return (X509_PUBKEY_get(x->spkac->pubkey)); } @@ -45,19 +45,19 @@ NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, ossl_ssize_t len) { } if (!EVP_DecodedLength(&spki_len, len)) { OPENSSL_PUT_ERROR(X509, X509_R_BASE64_DECODE_ERROR); - return NULL; + return nullptr; } if (!(spki_der = reinterpret_cast(OPENSSL_malloc(spki_len)))) { - return NULL; + return nullptr; } if (!EVP_DecodeBase64(spki_der, &spki_len, spki_len, (const uint8_t *)str, len)) { OPENSSL_PUT_ERROR(X509, X509_R_BASE64_DECODE_ERROR); OPENSSL_free(spki_der); - return NULL; + return nullptr; } p = spki_der; - spki = d2i_NETSCAPE_SPKI(NULL, &p, spki_len); + spki = d2i_NETSCAPE_SPKI(nullptr, &p, spki_len); OPENSSL_free(spki_der); return spki; } @@ -69,19 +69,19 @@ char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *spki) { char *b64_str; size_t b64_len; int der_len; - der_len = i2d_NETSCAPE_SPKI(spki, NULL); + der_len = i2d_NETSCAPE_SPKI(spki, nullptr); if (!EVP_EncodedLength(&b64_len, der_len)) { OPENSSL_PUT_ERROR(X509, ERR_R_OVERFLOW); - return NULL; + return nullptr; } der_spki = reinterpret_cast(OPENSSL_malloc(der_len)); - if (der_spki == NULL) { - return NULL; + if (der_spki == nullptr) { + return nullptr; } b64_str = reinterpret_cast(OPENSSL_malloc(b64_len)); - if (b64_str == NULL) { + if (b64_str == nullptr) { OPENSSL_free(der_spki); - return NULL; + return nullptr; } p = der_spki; i2d_NETSCAPE_SPKI(spki, &p); diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_algor.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_algor.cc index 60eb006623..6c78dadd06 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_algor.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_algor.cc @@ -17,29 +17,142 @@ #include #include #include +#include #include +#include #include "../asn1/internal.h" +#include "../bytestring/internal.h" +#include "../internal.h" +#include "../mem_internal.h" #include "internal.h" -ASN1_SEQUENCE(X509_ALGOR) = { - ASN1_SIMPLE(X509_ALGOR, algorithm, ASN1_OBJECT), - ASN1_OPT(X509_ALGOR, parameter, ASN1_ANY), -} ASN1_SEQUENCE_END(X509_ALGOR) +void x509_algor_init(X509_ALGOR *alg) { + OPENSSL_memset(alg, 0, sizeof(X509_ALGOR)); + alg->algorithm = const_cast(OBJ_get_undef()); +} -IMPLEMENT_ASN1_FUNCTIONS_const(X509_ALGOR) -IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_ALGOR) +void x509_algor_cleanup(X509_ALGOR *alg) { + ASN1_OBJECT_free(alg->algorithm); + ASN1_TYPE_free(alg->parameter); +} + +X509_ALGOR *X509_ALGOR_new(void) { + bssl::UniquePtr ret = bssl::MakeUnique(); + if (ret == nullptr) { + return nullptr; + } + x509_algor_init(ret.get()); + return ret.release(); +} + +void X509_ALGOR_free(X509_ALGOR *alg) { + if (alg != nullptr) { + x509_algor_cleanup(alg); + OPENSSL_free(alg); + } +} + +int x509_parse_algorithm(CBS *cbs, X509_ALGOR *out) { + CBS seq; + if (!CBS_get_asn1(cbs, &seq, CBS_ASN1_SEQUENCE)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + + bssl::UniquePtr obj(asn1_parse_object(&seq, /*tag=*/0)); + if (obj == nullptr) { + return 0; + } + ASN1_OBJECT_free(out->algorithm); + out->algorithm = obj.release(); + if (CBS_len(&seq) == 0) { + ASN1_TYPE_free(out->parameter); + out->parameter = nullptr; + } else { + if (out->parameter == nullptr) { + out->parameter = ASN1_TYPE_new(); + } + if (out->parameter == nullptr || // + !asn1_parse_any(&seq, out->parameter)) { + return 0; + } + } + if (CBS_len(&seq) != 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + return 1; +} + +int x509_marshal_algorithm(CBB *out, const X509_ALGOR *in) { + CBB seq; + return CBB_add_asn1(out, &seq, CBS_ASN1_SEQUENCE) && + asn1_marshal_object(&seq, in->algorithm, /*tag=*/0) && + (in->parameter == nullptr || asn1_marshal_any(&seq, in->parameter)) && + CBB_flush(out); +} + +X509_ALGOR *d2i_X509_ALGOR(X509_ALGOR **out, const uint8_t **inp, long len) { + return bssl::D2IFromCBS( + out, inp, len, [](CBS *cbs) -> bssl::UniquePtr { + bssl::UniquePtr ret(X509_ALGOR_new()); + if (ret == nullptr || !x509_parse_algorithm(cbs, ret.get())) { + return nullptr; + } + return ret; + }); +} + +int i2d_X509_ALGOR(const X509_ALGOR *in, uint8_t **outp) { + return bssl::I2DFromCBB(/*initial_capacity=*/32, outp, [&](CBB *cbb) -> bool { + return x509_marshal_algorithm(cbb, in); + }); +} + +IMPLEMENT_EXTERN_ASN1_SIMPLE(X509_ALGOR, X509_ALGOR_new, X509_ALGOR_free, + CBS_ASN1_SEQUENCE, x509_parse_algorithm, + i2d_X509_ALGOR) + +X509_ALGOR *X509_ALGOR_dup(const X509_ALGOR *alg) { + bssl::UniquePtr copy(X509_ALGOR_new()); + if (copy == nullptr || !X509_ALGOR_copy(copy.get(), alg)) { + return nullptr; + } + return copy.release(); +} + +int X509_ALGOR_copy(X509_ALGOR *dst, const X509_ALGOR *src) { + bssl::UniquePtr algorithm(OBJ_dup(src->algorithm)); + if (algorithm == nullptr) { + return 0; + } + bssl::UniquePtr parameter; + if (src->parameter != nullptr) { + parameter.reset(ASN1_TYPE_new()); + if (parameter == nullptr || + !ASN1_TYPE_set1(parameter.get(), src->parameter->type, + asn1_type_value_as_pointer(src->parameter))) { + return 0; + } + } + ASN1_OBJECT_free(dst->algorithm); + dst->algorithm = algorithm.release(); + ASN1_TYPE_free(dst->parameter); + dst->parameter = parameter.release(); + return 1; +} int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval) { if (!alg) { return 0; } if (ptype != V_ASN1_UNDEF) { - if (alg->parameter == NULL) { + if (alg->parameter == nullptr) { alg->parameter = ASN1_TYPE_new(); } - if (alg->parameter == NULL) { + if (alg->parameter == nullptr) { return 0; } } @@ -53,7 +166,7 @@ int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval) { if (ptype == V_ASN1_UNDEF) { if (alg->parameter) { ASN1_TYPE_free(alg->parameter); - alg->parameter = NULL; + alg->parameter = nullptr; } } else { ASN1_TYPE_set(alg->parameter, ptype, pval); @@ -63,18 +176,18 @@ int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval) { void X509_ALGOR_get0(const ASN1_OBJECT **out_obj, int *out_param_type, const void **out_param_value, const X509_ALGOR *alg) { - if (out_obj != NULL) { + if (out_obj != nullptr) { *out_obj = alg->algorithm; } - if (out_param_type != NULL) { + if (out_param_type != nullptr) { int type = V_ASN1_UNDEF; - const void *value = NULL; - if (alg->parameter != NULL) { + const void *value = nullptr; + if (alg->parameter != nullptr) { type = alg->parameter->type; value = asn1_type_value_as_pointer(alg->parameter); } *out_param_type = type; - if (out_param_value != NULL) { + if (out_param_value != nullptr) { *out_param_value = value; } } @@ -91,7 +204,8 @@ int X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md) { param_type = V_ASN1_NULL; } - return X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL); + return X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, + nullptr); } // X509_ALGOR_cmp returns 0 if |a| and |b| are equal and non-zero otherwise. @@ -106,11 +220,3 @@ int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b) { } return ASN1_TYPE_cmp(a->parameter, b->parameter); } - -int x509_marshal_algorithm(CBB *out, const X509_ALGOR *in) { - uint8_t *ptr; - int len = i2d_X509_ALGOR(in, NULL); - return len > 0 && // - CBB_add_space(out, &ptr, static_cast(len)) && - i2d_X509_ALGOR(in, &ptr) == len; -} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_all.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_all.cc index 4393750e83..d47711200f 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_all.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_all.cc @@ -17,24 +17,33 @@ #include #include +#include #include #include #include #include #include +#include #include #include "../asn1/internal.h" +#include "../internal.h" #include "internal.h" int X509_verify(X509 *x509, EVP_PKEY *pkey) { - if (X509_ALGOR_cmp(x509->sig_alg, x509->cert_info->signature)) { + if (X509_ALGOR_cmp(&x509->sig_alg, &x509->tbs_sig_alg)) { OPENSSL_PUT_ERROR(X509, X509_R_SIGNATURE_ALGORITHM_MISMATCH); return 0; } - return ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), x509->sig_alg, - x509->signature, x509->cert_info, pkey); + // This uses the cached TBSCertificate encoding, if any. + bssl::ScopedCBB cbb; + if (!CBB_init(cbb.get(), 128) || !x509_marshal_tbs_cert(cbb.get(), x509)) { + return 0; + } + return x509_verify_signature( + &x509->sig_alg, &x509->signature, + bssl::Span(CBB_data(cbb.get()), CBB_len(cbb.get())), pkey); } int X509_REQ_verify(X509_REQ *req, EVP_PKEY *pkey) { @@ -43,33 +52,53 @@ int X509_REQ_verify(X509_REQ *req, EVP_PKEY *pkey) { } int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md) { - asn1_encoding_clear(&x->cert_info->enc); - return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature, - x->sig_alg, x->signature, x->cert_info, pkey, md)); + bssl::ScopedEVP_MD_CTX ctx; + if (!EVP_DigestSignInit(ctx.get(), nullptr, md, nullptr, pkey)) { + return 0; + } + return X509_sign_ctx(x, ctx.get()); } int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx) { - asn1_encoding_clear(&x->cert_info->enc); - return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature, - x->sig_alg, x->signature, x->cert_info, ctx); + // Historically, this function called |EVP_MD_CTX_cleanup| on return. Some + // callers rely on this to avoid memory leaks. + bssl::Cleanup cleanup = [&] { EVP_MD_CTX_cleanup(ctx); }; + + // Fill in the two copies of AlgorithmIdentifier. Note one of these modifies + // the TBSCertificate. + if (!x509_digest_sign_algorithm(ctx, &x->tbs_sig_alg) || + !x509_digest_sign_algorithm(ctx, &x->sig_alg)) { + return 0; + } + + // Discard the cached encoding. (We just modified it.) + CRYPTO_BUFFER_free(x->buf); + x->buf = nullptr; + + bssl::ScopedCBB cbb; + if (!CBB_init(cbb.get(), 128) || !x509_marshal_tbs_cert(cbb.get(), x)) { + return 0; + } + return x509_sign_to_bit_string( + ctx, &x->signature, bssl::Span(CBB_data(cbb.get()), CBB_len(cbb.get()))); } int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md) { asn1_encoding_clear(&x->req_info->enc); - return (ASN1_item_sign(ASN1_ITEM_rptr(X509_REQ_INFO), x->sig_alg, NULL, - x->signature, x->req_info, pkey, md)); + return ASN1_item_sign(ASN1_ITEM_rptr(X509_REQ_INFO), x->sig_alg, nullptr, + x->signature, x->req_info, pkey, md); } int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx) { asn1_encoding_clear(&x->req_info->enc); - return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_REQ_INFO), x->sig_alg, NULL, + return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_REQ_INFO), x->sig_alg, nullptr, x->signature, x->req_info, ctx); } int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md) { asn1_encoding_clear(&x->crl->enc); - return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CRL_INFO), x->crl->sig_alg, - x->sig_alg, x->signature, x->crl, pkey, md)); + return ASN1_item_sign(ASN1_ITEM_rptr(X509_CRL_INFO), x->crl->sig_alg, + x->sig_alg, x->signature, x->crl, pkey, md); } int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx) { @@ -79,13 +108,13 @@ int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx) { } int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md) { - return (ASN1_item_sign(ASN1_ITEM_rptr(NETSCAPE_SPKAC), x->sig_algor, NULL, - x->signature, x->spkac, pkey, md)); + return ASN1_item_sign(ASN1_ITEM_rptr(NETSCAPE_SPKAC), x->sig_algor, nullptr, + x->signature, x->spkac, pkey, md); } int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *spki, EVP_PKEY *pkey) { - return (ASN1_item_verify(ASN1_ITEM_rptr(NETSCAPE_SPKAC), spki->sig_algor, - spki->signature, spki->spkac, pkey)); + return ASN1_item_verify(ASN1_ITEM_rptr(NETSCAPE_SPKAC), spki->sig_algor, + spki->signature, spki->spkac, pkey); } X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl) { @@ -93,7 +122,7 @@ X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl) { ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl)); } -int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl) { +int i2d_X509_CRL_fp(FILE *fp, const X509_CRL *crl) { return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl); } @@ -102,7 +131,7 @@ X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl) { ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl)); } -int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl) { +int i2d_X509_CRL_bio(BIO *bp, const X509_CRL *crl) { return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl); } @@ -111,7 +140,7 @@ X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req) { ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ), fp, req)); } -int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req) { +int i2d_X509_REQ_fp(FILE *fp, const X509_REQ *req) { return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_REQ), fp, req); } @@ -120,7 +149,7 @@ X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req) { ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_REQ), bp, req)); } -int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req) { +int i2d_X509_REQ_bio(BIO *bp, const X509_REQ *req) { return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_REQ), bp, req); } @@ -128,8 +157,8 @@ int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req) { #define IMPLEMENT_D2I_FP(type, name, bio_func) \ type *name(FILE *fp, type **obj) { \ BIO *bio = BIO_new_fp(fp, BIO_NOCLOSE); \ - if (bio == NULL) { \ - return NULL; \ + if (bio == nullptr) { \ + return nullptr; \ } \ type *ret = bio_func(bio, obj); \ BIO_free(bio); \ @@ -137,9 +166,9 @@ int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req) { } #define IMPLEMENT_I2D_FP(type, name, bio_func) \ - int name(FILE *fp, type *obj) { \ + int name(FILE *fp, const type *obj) { \ BIO *bio = BIO_new_fp(fp, BIO_NOCLOSE); \ - if (bio == NULL) { \ + if (bio == nullptr) { \ return 0; \ } \ int ret = bio_func(bio, obj); \ @@ -164,7 +193,7 @@ IMPLEMENT_I2D_FP(RSA, i2d_RSA_PUBKEY_fp, i2d_RSA_PUBKEY_bio) uint8_t *data; \ size_t len; \ if (!BIO_read_asn1(bio, &data, &len, 100 * 1024)) { \ - return NULL; \ + return nullptr; \ } \ const uint8_t *ptr = data; \ type *ret = d2i_func(obj, &ptr, (long)len); \ @@ -173,8 +202,8 @@ IMPLEMENT_I2D_FP(RSA, i2d_RSA_PUBKEY_fp, i2d_RSA_PUBKEY_bio) } #define IMPLEMENT_I2D_BIO(type, name, i2d_func) \ - int name(BIO *bio, type *obj) { \ - uint8_t *data = NULL; \ + int name(BIO *bio, const type *obj) { \ + uint8_t *data = nullptr; \ int len = i2d_func(obj, &data); \ if (len < 0) { \ return 0; \ @@ -227,19 +256,18 @@ int X509_pubkey_digest(const X509 *data, const EVP_MD *type, unsigned char *md, if (!key) { return 0; } - return EVP_Digest(key->data, key->length, md, len, type, NULL); + return EVP_Digest(key->data, key->length, md, len, type, nullptr); } int X509_digest(const X509 *x509, const EVP_MD *md, uint8_t *out, unsigned *out_len) { - uint8_t *der = NULL; - // TODO(https://crbug.com/boringssl/407): This function is not const-correct. - int der_len = i2d_X509((X509 *)x509, &der); + uint8_t *der = nullptr; + int der_len = i2d_X509(x509, &der); if (der_len < 0) { return 0; } - int ret = EVP_Digest(der, der_len, out, out_len, md, NULL); + int ret = EVP_Digest(der, der_len, out, out_len, md, nullptr); OPENSSL_free(der); return ret; } @@ -273,7 +301,7 @@ IMPLEMENT_D2I_FP(PKCS8_PRIV_KEY_INFO, d2i_PKCS8_PRIV_KEY_INFO_fp, IMPLEMENT_I2D_FP(PKCS8_PRIV_KEY_INFO, i2d_PKCS8_PRIV_KEY_INFO_fp, i2d_PKCS8_PRIV_KEY_INFO_bio) -int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key) { +int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, const EVP_PKEY *key) { PKCS8_PRIV_KEY_INFO *p8inf; int ret; p8inf = EVP_PKEY2PKCS8(key); @@ -296,7 +324,7 @@ IMPLEMENT_D2I_BIO(PKCS8_PRIV_KEY_INFO, d2i_PKCS8_PRIV_KEY_INFO_bio, IMPLEMENT_I2D_BIO(PKCS8_PRIV_KEY_INFO, i2d_PKCS8_PRIV_KEY_INFO_bio, i2d_PKCS8_PRIV_KEY_INFO) -int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key) { +int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, const EVP_PKEY *key) { PKCS8_PRIV_KEY_INFO *p8inf; int ret; p8inf = EVP_PKEY2PKCS8(key); @@ -315,4 +343,4 @@ IMPLEMENT_D2I_BIO(EVP_PKEY, d2i_PUBKEY_bio, d2i_PUBKEY) IMPLEMENT_I2D_BIO(EVP_PKEY, i2d_PUBKEY_bio, i2d_PUBKEY) IMPLEMENT_D2I_BIO(DH, d2i_DHparams_bio, d2i_DHparams) -IMPLEMENT_I2D_BIO(const DH, i2d_DHparams_bio, i2d_DHparams) +IMPLEMENT_I2D_BIO(DH, i2d_DHparams_bio, i2d_DHparams) diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_attrib.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_attrib.cc index 20ab3b08ee..f030cf702a 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_attrib.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_attrib.cc @@ -30,13 +30,13 @@ IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_ATTRIBUTE) X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int attrtype, void *value) { ASN1_OBJECT *obj = OBJ_nid2obj(nid); - if (obj == NULL) { - return NULL; + if (obj == nullptr) { + return nullptr; } X509_ATTRIBUTE *ret = X509_ATTRIBUTE_new(); ASN1_TYPE *val = ASN1_TYPE_new(); - if (ret == NULL || val == NULL) { + if (ret == nullptr || val == nullptr) { goto err; } @@ -51,5 +51,5 @@ X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int attrtype, void *value) { err: X509_ATTRIBUTE_free(ret); ASN1_TYPE_free(val); - return NULL; + return nullptr; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_crl.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_crl.cc index 2d486ae068..1d22ed638f 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_crl.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_crl.cc @@ -42,7 +42,7 @@ static int crl_lookup(X509_CRL *crl, X509_REVOKED **ret, const ASN1_INTEGER *serial, X509_NAME *issuer); // The X509_CRL_INFO structure needs a bit of customisation. Since we cache -// the original encoding the signature wont be affected by reordering of the +// the original encoding the signature won't be affected by reordering of the // revoked field. static int crl_inf_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg) { @@ -73,13 +73,28 @@ ASN1_SEQUENCE_enc(X509_CRL_INFO, enc, crl_inf_cb) = { } ASN1_SEQUENCE_END_enc(X509_CRL_INFO, X509_CRL_INFO) static int crl_parse_entry_extensions(X509_CRL *crl) { + long version = ASN1_INTEGER_get(crl->crl->version); STACK_OF(X509_REVOKED) *revoked = X509_CRL_get_REVOKED(crl); for (size_t i = 0; i < sk_X509_REVOKED_num(revoked); i++) { X509_REVOKED *rev = sk_X509_REVOKED_value(revoked, i); + // Per RFC 5280, section 5.1, CRL entry extensions require v2. + const STACK_OF(X509_EXTENSION) *exts = rev->extensions; + if (version == X509_CRL_VERSION_1 && exts != nullptr) { + OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION); + return 0; + } + + // Extensions is a SEQUENCE SIZE (1..MAX), so it cannot be empty. An empty + // extensions list is encoded by omitting the OPTIONAL field. + if (exts != nullptr && sk_X509_EXTENSION_num(exts) == 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + int crit; ASN1_ENUMERATED *reason = reinterpret_cast( - X509_REVOKED_get_ext_d2i(rev, NID_crl_reason, &crit, NULL)); + X509_REVOKED_get_ext_d2i(rev, NID_crl_reason, &crit, nullptr)); if (!reason && crit != -1) { crl->flags |= EXFLAG_INVALID; return 1; @@ -93,7 +108,6 @@ static int crl_parse_entry_extensions(X509_CRL *crl) { } // We do not support any critical CRL entry extensions. - const STACK_OF(X509_EXTENSION) *exts = rev->extensions; for (size_t j = 0; j < sk_X509_EXTENSION_num(exts); j++) { const X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, j); if (X509_EXTENSION_get_critical(ext)) { @@ -115,8 +129,8 @@ static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, switch (operation) { case ASN1_OP_NEW_POST: - crl->idp = NULL; - crl->akid = NULL; + crl->idp = nullptr; + crl->akid = nullptr; crl->flags = 0; crl->idp_flags = 0; break; @@ -124,30 +138,36 @@ static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, case ASN1_OP_D2I_POST: { // The version must be one of v1(0) or v2(1). long version = X509_CRL_VERSION_1; - if (crl->crl->version != NULL) { + if (crl->crl->version != nullptr) { version = ASN1_INTEGER_get(crl->crl->version); - // TODO(https://crbug.com/boringssl/364): |X509_CRL_VERSION_1| - // should also be rejected. This means an explicitly-encoded X.509v1 - // version. v1 is DEFAULT, so DER requires it be omitted. - if (version < X509_CRL_VERSION_1 || version > X509_CRL_VERSION_2) { + // Versions v1 and v2. v1 is DEFAULT, so cannot be encoded explicitly. + if (version != X509_CRL_VERSION_2) { OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION); return 0; } } // Per RFC 5280, section 5.1.2.1, extensions require v2. - if (version != X509_CRL_VERSION_2 && crl->crl->extensions != NULL) { + if (version != X509_CRL_VERSION_2 && crl->crl->extensions != nullptr) { OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION); return 0; } - if (!X509_CRL_digest(crl, EVP_sha256(), crl->crl_hash, NULL)) { + // Extensions is a SEQUENCE SIZE (1..MAX), so it cannot be empty. An empty + // extensions list is encoded by omitting the OPTIONAL field. + if (crl->crl->extensions != nullptr && + sk_X509_EXTENSION_num(crl->crl->extensions) == 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); return 0; } - crl->idp = reinterpret_cast( - X509_CRL_get_ext_d2i(crl, NID_issuing_distribution_point, &i, NULL)); - if (crl->idp != NULL) { + if (!X509_CRL_digest(crl, EVP_sha256(), crl->crl_hash, nullptr)) { + return 0; + } + + crl->idp = reinterpret_cast(X509_CRL_get_ext_d2i( + crl, NID_issuing_distribution_point, &i, nullptr)); + if (crl->idp != nullptr) { if (!setup_idp(crl, crl->idp)) { return 0; } @@ -156,8 +176,8 @@ static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, } crl->akid = reinterpret_cast( - X509_CRL_get_ext_d2i(crl, NID_authority_key_identifier, &i, NULL)); - if (crl->akid == NULL && i != -1) { + X509_CRL_get_ext_d2i(crl, NID_authority_key_identifier, &i, nullptr)); + if (crl->akid == nullptr && i != -1) { return 0; } @@ -243,15 +263,12 @@ ASN1_SEQUENCE_ref(X509_CRL, crl_cb) = { ASN1_SIMPLE(X509_CRL, signature, ASN1_BIT_STRING), } ASN1_SEQUENCE_END_ref(X509_CRL, X509_CRL) -// Although |X509_REVOKED| contains an |X509_NAME|, it can be const. It is not -// affected by https://crbug.com/boringssl/407 because the |X509_NAME| does -// not participate in serialization. IMPLEMENT_ASN1_FUNCTIONS_const(X509_REVOKED) IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_REVOKED) -IMPLEMENT_ASN1_FUNCTIONS(X509_CRL_INFO) -IMPLEMENT_ASN1_FUNCTIONS(X509_CRL) -IMPLEMENT_ASN1_DUP_FUNCTION(X509_CRL) +IMPLEMENT_ASN1_FUNCTIONS_const(X509_CRL_INFO) +IMPLEMENT_ASN1_FUNCTIONS_const(X509_CRL) +IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_CRL) static int X509_REVOKED_cmp(const X509_REVOKED *const *a, const X509_REVOKED *const *b) { @@ -283,7 +300,7 @@ int X509_CRL_verify(X509_CRL *crl, EVP_PKEY *pkey) { int X509_CRL_get0_by_serial(X509_CRL *crl, X509_REVOKED **ret, const ASN1_INTEGER *serial) { - return crl_lookup(crl, ret, serial, NULL); + return crl_lookup(crl, ret, serial, nullptr); } int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x) { @@ -293,7 +310,7 @@ int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x) { static int crl_revoked_issuer_match(X509_CRL *crl, X509_NAME *nm, X509_REVOKED *rev) { - return nm == NULL || X509_NAME_cmp(nm, X509_CRL_get_issuer(crl)) == 0; + return nm == nullptr || X509_NAME_cmp(nm, X509_CRL_get_issuer(crl)) == 0; } static CRYPTO_MUTEX g_crl_sort_lock = CRYPTO_MUTEX_INIT; diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_name.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_name.cc index 035a03a779..ac0c7b7334 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_name.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_name.cc @@ -13,489 +13,419 @@ // limitations under the License. #include +#include #include +#include + #include #include +#include #include #include #include #include #include #include -#include #include "../asn1/internal.h" +#include "../bytestring/internal.h" #include "../internal.h" +#include "../mem_internal.h" #include "internal.h" -typedef STACK_OF(X509_NAME_ENTRY) STACK_OF_X509_NAME_ENTRY; -DEFINE_STACK_OF(STACK_OF_X509_NAME_ENTRY) - -// Maximum length of X509_NAME: much larger than anything we should -// ever see in practice. - +// X509_NAME_MAX is the length of the maximum encoded |X509_NAME| we accept. #define X509_NAME_MAX (1024 * 1024) -static int x509_name_ex_d2i(ASN1_VALUE **val, const unsigned char **in, - long len, const ASN1_ITEM *it, int opt, - ASN1_TLC *ctx); +static int asn1_marshal_string_canon(CBB *cbb, const ASN1_STRING *in); -static int x509_name_ex_i2d(ASN1_VALUE **val, unsigned char **out, - const ASN1_ITEM *it); -static int x509_name_ex_new(ASN1_VALUE **val, const ASN1_ITEM *it); -static void x509_name_ex_free(ASN1_VALUE **val, const ASN1_ITEM *it); - -static int x509_name_encode(X509_NAME *a); -static int x509_name_canon(X509_NAME *a); -static int asn1_string_canon(ASN1_STRING *out, ASN1_STRING *in); -static int i2d_name_canon(STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname, - unsigned char **in); - -ASN1_SEQUENCE(X509_NAME_ENTRY) = { - ASN1_SIMPLE(X509_NAME_ENTRY, object, ASN1_OBJECT), - ASN1_SIMPLE(X509_NAME_ENTRY, value, ASN1_ANY_AS_STRING), -} ASN1_SEQUENCE_END(X509_NAME_ENTRY) - -IMPLEMENT_ASN1_ALLOC_FUNCTIONS(X509_NAME_ENTRY) -IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_NAME_ENTRY) - -// For the "Name" type we need a SEQUENCE OF { SET OF X509_NAME_ENTRY } so -// declare two template wrappers for this - -ASN1_ITEM_TEMPLATE(X509_NAME_ENTRIES) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SET_OF, - 0, RDNS, - X509_NAME_ENTRY) -ASN1_ITEM_TEMPLATE_END(X509_NAME_ENTRIES) - -ASN1_ITEM_TEMPLATE(X509_NAME_INTERNAL) = - ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, Name, X509_NAME_ENTRIES) -ASN1_ITEM_TEMPLATE_END(X509_NAME_INTERNAL) - -// Normally that's where it would end: we'd have two nested STACK structures -// representing the ASN1. Unfortunately X509_NAME uses a completely different -// form and caches encodings so we have to process the internal form and -// convert to the external form. - -static const ASN1_EXTERN_FUNCS x509_name_ff = { - x509_name_ex_new, - x509_name_ex_free, - x509_name_ex_d2i, - x509_name_ex_i2d, -}; - -IMPLEMENT_EXTERN_ASN1(X509_NAME, V_ASN1_SEQUENCE, x509_name_ff) - -IMPLEMENT_ASN1_FUNCTIONS(X509_NAME) - -IMPLEMENT_ASN1_DUP_FUNCTION(X509_NAME) - -static int x509_name_ex_new(ASN1_VALUE **val, const ASN1_ITEM *it) { - X509_NAME *ret = NULL; - ret = reinterpret_cast(OPENSSL_malloc(sizeof(X509_NAME))); - if (!ret) { - goto memerr; +X509_NAME_ENTRY *X509_NAME_ENTRY_new(void) { + bssl::UniquePtr ret = bssl::MakeUnique(); + if (ret == nullptr) { + return nullptr; } - if ((ret->entries = sk_X509_NAME_ENTRY_new_null()) == NULL) { - goto memerr; + ret->object = const_cast(OBJ_get_undef()); + asn1_string_init(&ret->value, -1); + ret->set = 0; + return ret.release(); +} + +void X509_NAME_ENTRY_free(X509_NAME_ENTRY *entry) { + if (entry != nullptr) { + ASN1_OBJECT_free(entry->object); + asn1_string_cleanup(&entry->value); + OPENSSL_free(entry); } - if ((ret->bytes = BUF_MEM_new()) == NULL) { - goto memerr; +} + +static int x509_parse_name_entry(CBS *cbs, X509_NAME_ENTRY *out) { + CBS seq; + if (!CBS_get_asn1(cbs, &seq, CBS_ASN1_SEQUENCE)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + ASN1_OBJECT_free(out->object); + out->object = asn1_parse_object(&seq, /*tag=*/0); + if (out->object == nullptr || // + !asn1_parse_any_as_string(&seq, &out->value) || // + CBS_len(&seq) != 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; } - ret->canon_enc = NULL; - ret->canon_enclen = 0; - ret->modified = 1; - *val = (ASN1_VALUE *)ret; return 1; +} -memerr: - if (ret) { - if (ret->entries) { - sk_X509_NAME_ENTRY_free(ret->entries); +static int x509_marshal_name_entry(CBB *cbb, const X509_NAME_ENTRY *entry, + int canonicalize) { + CBB seq; + if (!CBB_add_asn1(cbb, &seq, CBS_ASN1_SEQUENCE) || + !asn1_marshal_object(&seq, entry->object, /*tag=*/0)) { + return 0; + } + int ok = canonicalize ? asn1_marshal_string_canon(&seq, &entry->value) + : asn1_marshal_any_string(&seq, &entry->value); + if (!ok) { + return 0; + } + return CBB_flush(cbb); +} + +static int i2d_x509_name_entry(const X509_NAME_ENTRY *entry, uint8_t **out) { + return bssl::I2DFromCBB(/*initial_capacity=*/16, out, [&](CBB *cbb) -> bool { + return x509_marshal_name_entry(cbb, entry, /*canonicalize=*/0); + }); +} + +IMPLEMENT_EXTERN_ASN1_SIMPLE(X509_NAME_ENTRY, X509_NAME_ENTRY_new, + X509_NAME_ENTRY_free, CBS_ASN1_SEQUENCE, + x509_parse_name_entry, i2d_x509_name_entry) + +X509_NAME_ENTRY *X509_NAME_ENTRY_dup(const X509_NAME_ENTRY *entry) { + bssl::ScopedCBB cbb; + if (!CBB_init(cbb.get(), 16) || + !x509_marshal_name_entry(cbb.get(), entry, /*canonicalize=*/0)) { + return nullptr; + } + CBS cbs; + CBS_init(&cbs, CBB_data(cbb.get()), CBB_len(cbb.get())); + bssl::UniquePtr copy(X509_NAME_ENTRY_new()); + if (copy == nullptr || !x509_parse_name_entry(&cbs, copy.get())) { + return nullptr; + } + return copy.release(); +} + +static void x509_name_cache_free(X509_NAME_CACHE *cache) { + if (cache != nullptr) { + OPENSSL_free(cache->canon); + OPENSSL_free(cache->der); + OPENSSL_free(cache); + } +} + +void x509_name_init(X509_NAME *name) { + OPENSSL_memset(name, 0, sizeof(X509_NAME)); +} + +void x509_name_cleanup(X509_NAME *name) { + sk_X509_NAME_ENTRY_pop_free(name->entries, X509_NAME_ENTRY_free); + x509_name_cache_free(name->cache.exchange(nullptr)); +} + +X509_NAME *X509_NAME_new(void) { + return static_cast(OPENSSL_zalloc(sizeof(X509_NAME))); +} + +void X509_NAME_free(X509_NAME *name) { + if (name != nullptr) { + x509_name_cleanup(name); + OPENSSL_free(name); + } +} + +int x509_parse_name(CBS *cbs, X509_NAME *out) { + // Reset the old state. + x509_name_cleanup(out); + x509_name_init(out); + + out->entries = sk_X509_NAME_ENTRY_new_null(); + if (out->entries == nullptr) { + return 0; + } + CBS seq, rdn; + if (!CBS_get_asn1(cbs, &seq, CBS_ASN1_SEQUENCE) || + // Bound the size of an X509_NAME we are willing to parse. + CBS_len(&seq) > X509_NAME_MAX) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + static_assert(X509_NAME_MAX <= INT_MAX, "set may overflow"); + for (int set = 0; CBS_len(&seq) > 0; set++) { + if (!CBS_get_asn1(&seq, &rdn, CBS_ASN1_SET) || // + CBS_len(&rdn) == 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; } - OPENSSL_free(ret); - } - return 0; -} - -static void x509_name_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { - X509_NAME *a; - if (!pval || !*pval) { - return; - } - a = (X509_NAME *)*pval; - - BUF_MEM_free(a->bytes); - sk_X509_NAME_ENTRY_pop_free(a->entries, X509_NAME_ENTRY_free); - if (a->canon_enc) { - OPENSSL_free(a->canon_enc); - } - OPENSSL_free(a); - *pval = NULL; -} - -static void local_sk_X509_NAME_ENTRY_free(STACK_OF(X509_NAME_ENTRY) *ne) { - sk_X509_NAME_ENTRY_free(ne); -} - -static void local_sk_X509_NAME_ENTRY_pop_free(STACK_OF(X509_NAME_ENTRY) *ne) { - sk_X509_NAME_ENTRY_pop_free(ne, X509_NAME_ENTRY_free); -} - -static int x509_name_ex_d2i(ASN1_VALUE **val, const unsigned char **in, - long len, const ASN1_ITEM *it, int opt, - ASN1_TLC *ctx) { - const unsigned char *p = *in, *q; - STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname = NULL; - X509_NAME *nm = NULL; - size_t i, j; - int ret; - STACK_OF(X509_NAME_ENTRY) *entries; - X509_NAME_ENTRY *entry; - // Bound the size of an X509_NAME we are willing to parse. - if (len > X509_NAME_MAX) { - len = X509_NAME_MAX; - } - q = p; - - // Get internal representation of Name - ASN1_VALUE *intname_val = NULL; - ret = ASN1_item_ex_d2i(&intname_val, &p, len, - ASN1_ITEM_rptr(X509_NAME_INTERNAL), /*tag=*/-1, - /*aclass=*/0, opt, /*buf=*/NULL); - if (ret <= 0) { - return ret; - } - intname = (STACK_OF(STACK_OF_X509_NAME_ENTRY) *)intname_val; - - if (*val) { - x509_name_ex_free(val, NULL); - } - ASN1_VALUE *nm_val = NULL; - if (!x509_name_ex_new(&nm_val, NULL)) { - goto err; - } - nm = (X509_NAME *)nm_val; - // We've decoded it: now cache encoding - if (!BUF_MEM_grow(nm->bytes, p - q)) { - goto err; - } - OPENSSL_memcpy(nm->bytes->data, q, p - q); - - // Convert internal representation to X509_NAME structure - for (i = 0; i < sk_STACK_OF_X509_NAME_ENTRY_num(intname); i++) { - entries = sk_STACK_OF_X509_NAME_ENTRY_value(intname, i); - for (j = 0; j < sk_X509_NAME_ENTRY_num(entries); j++) { - entry = sk_X509_NAME_ENTRY_value(entries, j); - entry->set = (int)i; - if (!sk_X509_NAME_ENTRY_push(nm->entries, entry)) { - goto err; + while (CBS_len(&rdn) != 0) { + bssl::UniquePtr entry(X509_NAME_ENTRY_new()); + if (entry == nullptr || !x509_parse_name_entry(&rdn, entry.get())) { + return 0; } - (void)sk_X509_NAME_ENTRY_set(entries, j, NULL); - } - } - ret = x509_name_canon(nm); - if (!ret) { - goto err; - } - sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname, local_sk_X509_NAME_ENTRY_free); - nm->modified = 0; - *val = (ASN1_VALUE *)nm; - *in = p; - return ret; -err: - X509_NAME_free(nm); - sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname, - local_sk_X509_NAME_ENTRY_pop_free); - OPENSSL_PUT_ERROR(X509, ERR_R_ASN1_LIB); - return 0; -} - -static int x509_name_ex_i2d(ASN1_VALUE **val, unsigned char **out, - const ASN1_ITEM *it) { - X509_NAME *a = (X509_NAME *)*val; - if (a->modified && (!x509_name_encode(a) || !x509_name_canon(a))) { - return -1; - } - int ret = a->bytes->length; - if (out != NULL) { - OPENSSL_memcpy(*out, a->bytes->data, ret); - *out += ret; - } - return ret; -} - -static int x509_name_encode(X509_NAME *a) { - int len; - unsigned char *p; - STACK_OF(X509_NAME_ENTRY) *entries = NULL; - X509_NAME_ENTRY *entry; - int set = -1; - size_t i; - STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname = - sk_STACK_OF_X509_NAME_ENTRY_new_null(); - - { - if (!intname) { - goto err; - } - for (i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) { - entry = sk_X509_NAME_ENTRY_value(a->entries, i); - if (entry->set != set) { - entries = sk_X509_NAME_ENTRY_new_null(); - if (!entries) { - goto err; - } - if (!sk_STACK_OF_X509_NAME_ENTRY_push(intname, entries)) { - sk_X509_NAME_ENTRY_free(entries); - goto err; - } - set = entry->set; - } - if (!sk_X509_NAME_ENTRY_push(entries, entry)) { - goto err; + entry->set = set; + if (!bssl::PushToStack(out->entries, std::move(entry))) { + return 0; } } - ASN1_VALUE *intname_val = (ASN1_VALUE *)intname; - len = - ASN1_item_ex_i2d(&intname_val, NULL, ASN1_ITEM_rptr(X509_NAME_INTERNAL), - /*tag=*/-1, /*aclass=*/0); - if (len <= 0) { - goto err; - } - if (!BUF_MEM_grow(a->bytes, len)) { - goto err; - } - p = (unsigned char *)a->bytes->data; - if (ASN1_item_ex_i2d(&intname_val, &p, ASN1_ITEM_rptr(X509_NAME_INTERNAL), - /*tag=*/-1, /*aclass=*/0) <= 0) { - goto err; - } - sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname, - local_sk_X509_NAME_ENTRY_free); - a->modified = 0; + } + + // While we are single-threaded, also fill in the cached state. + return x509_name_get_cache(out) != nullptr; +} + +static int x509_marshal_name_entries(CBB *out, const X509_NAME *name, + int canonicalize) { + if (sk_X509_NAME_ENTRY_num(name->entries) == 0) { return 1; } -err: - sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname, local_sk_X509_NAME_ENTRY_free); - return 0; -} - -// This function generates the canonical encoding of the Name structure. In -// it all strings are converted to UTF8, leading, trailing and multiple -// spaces collapsed, converted to lower case and the leading SEQUENCE header -// removed. In future we could also normalize the UTF8 too. By doing this -// comparison of Name structures can be rapidly perfomed by just using -// OPENSSL_memcmp() of the canonical encoding. By omitting the leading SEQUENCE -// name constraints of type dirName can also be checked with a simple -// OPENSSL_memcmp(). - -static int x509_name_canon(X509_NAME *a) { - unsigned char *p; - STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname = NULL; - STACK_OF(X509_NAME_ENTRY) *entries = NULL; - X509_NAME_ENTRY *entry, *tmpentry = NULL; - int set = -1, ret = 0, len; - size_t i; - - if (a->canon_enc) { - OPENSSL_free(a->canon_enc); - a->canon_enc = NULL; + // Bootstrap the first RDN. + int set = sk_X509_NAME_ENTRY_value(name->entries, 0)->set; + CBB rdn; + if (!CBB_add_asn1(out, &rdn, CBS_ASN1_SET)) { + return 0; } - // Special case: empty X509_NAME => null encoding - if (sk_X509_NAME_ENTRY_num(a->entries) == 0) { - a->canon_enclen = 0; - return 1; - } - intname = sk_STACK_OF_X509_NAME_ENTRY_new_null(); - if (!intname) { - goto err; - } - for (i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) { - entry = sk_X509_NAME_ENTRY_value(a->entries, i); + + for (const X509_NAME_ENTRY *entry : name->entries) { if (entry->set != set) { - entries = sk_X509_NAME_ENTRY_new_null(); - if (!entries) { - goto err; - } - if (!sk_STACK_OF_X509_NAME_ENTRY_push(intname, entries)) { - sk_X509_NAME_ENTRY_free(entries); - goto err; + // Flush the previous RDN and start a new one. + if (!CBB_flush_asn1_set_of(&rdn) || + !CBB_add_asn1(out, &rdn, CBS_ASN1_SET)) { + return 0; } set = entry->set; } - tmpentry = X509_NAME_ENTRY_new(); - if (tmpentry == NULL) { - goto err; - } - tmpentry->object = OBJ_dup(entry->object); - if (!asn1_string_canon(tmpentry->value, entry->value)) { - goto err; - } - if (!sk_X509_NAME_ENTRY_push(entries, tmpentry)) { - goto err; - } - tmpentry = NULL; - } - - // Finally generate encoding - - len = i2d_name_canon(intname, NULL); - if (len < 0) { - goto err; - } - a->canon_enclen = len; - - p = reinterpret_cast(OPENSSL_malloc(a->canon_enclen)); - - if (!p) { - goto err; - } - - a->canon_enc = p; - - i2d_name_canon(intname, &p); - - ret = 1; - -err: - - if (tmpentry) { - X509_NAME_ENTRY_free(tmpentry); - } - if (intname) { - sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname, - local_sk_X509_NAME_ENTRY_pop_free); - } - return ret; -} - -// Bitmap of all the types of string that will be canonicalized. - -#define ASN1_MASK_CANON \ - (B_ASN1_UTF8STRING | B_ASN1_BMPSTRING | B_ASN1_UNIVERSALSTRING | \ - B_ASN1_PRINTABLESTRING | B_ASN1_T61STRING | B_ASN1_IA5STRING | \ - B_ASN1_VISIBLESTRING) - -static int asn1_string_canon(ASN1_STRING *out, ASN1_STRING *in) { - unsigned char *to, *from; - int len, i; - - // If type not in bitmask just copy string across - if (!(ASN1_tag2bit(in->type) & ASN1_MASK_CANON)) { - if (!ASN1_STRING_copy(out, in)) { + if (!x509_marshal_name_entry(&rdn, entry, canonicalize)) { return 0; } - return 1; } - out->type = V_ASN1_UTF8STRING; - out->length = ASN1_STRING_to_UTF8(&out->data, in); - if (out->length == -1) { + return CBB_flush_asn1_set_of(&rdn) && CBB_flush(out); +} + +const X509_NAME_CACHE *x509_name_get_cache(const X509_NAME *name) { + const X509_NAME_CACHE *cache = name->cache.load(); + if (cache != nullptr) { + return cache; + } + + X509_NAME_CACHE *new_cache = + static_cast(OPENSSL_zalloc(sizeof(X509_NAME_CACHE))); + // Cache the DER encoding, including the outer TLV. + bssl::ScopedCBB cbb; + CBB seq; + if (!CBB_init(cbb.get(), 16) || + !CBB_add_asn1(cbb.get(), &seq, CBS_ASN1_SEQUENCE) || + !x509_marshal_name_entries(&seq, name, /*canonicalize=*/0) || + !CBB_finish(cbb.get(), &new_cache->der, &new_cache->der_len)) { + x509_name_cache_free(new_cache); + return nullptr; + } + // Cache the canonicalized form, without the outer TLV. + if (!CBB_init(cbb.get(), 16) || + !x509_marshal_name_entries(cbb.get(), name, /*canonicalize=*/1) || + !CBB_finish(cbb.get(), &new_cache->canon, &new_cache->canon_len)) { + x509_name_cache_free(new_cache); + return nullptr; + } + + X509_NAME_CACHE *expected = nullptr; + if (name->cache.compare_exchange_strong(expected, new_cache)) { + // We won the race. |name| now owns |new_cache|. + return new_cache; + } + + // Some other thread installed a (presumably identical) cache. Release the one + // we made and return the winning one. + assert(expected != nullptr); + x509_name_cache_free(new_cache); + return expected; +} + +void x509_name_invalidate_cache(X509_NAME *name) { + x509_name_cache_free(name->cache.exchange(nullptr)); +} + +int x509_marshal_name(CBB *out, const X509_NAME *in) { + const X509_NAME_CACHE *cache = x509_name_get_cache(in); + if (cache == nullptr) { return 0; } + return CBB_add_bytes(out, cache->der, cache->der_len); +} - to = out->data; - from = to; - - len = out->length; - - // Convert string in place to canonical form. - - // Ignore leading spaces - while ((len > 0) && OPENSSL_isspace(*from)) { - from++; - len--; +int x509_name_copy(X509_NAME *dst, const X509_NAME *src) { + const X509_NAME_CACHE *cache = x509_name_get_cache(src); + if (cache == nullptr) { + return 0; } - - to = from + len; - - // Ignore trailing spaces - while ((len > 0) && OPENSSL_isspace(to[-1])) { - to--; - len--; + // Callers sometimes try to set a name back to itself. We check this after + // |x509_name_get_cache| because, if |src| was so broken that it could not be + // serialized, we used to return an error. (It's not clear if this codepath is + // even possible.) + if (dst == src) { + return 1; } - - to = out->data; - - i = 0; - while (i < len) { - // Collapse multiple spaces - if (OPENSSL_isspace(*from)) { - // Copy one space across - *to++ = ' '; - // Ignore subsequent spaces. Note: don't need to check len here - // because we know the last character is a non-space so we can't - // overflow. - do { - from++; - i++; - } while (OPENSSL_isspace(*from)); - } else { - *to++ = OPENSSL_tolower(*from); - from++; - i++; - } + CBS cbs; + CBS_init(&cbs, cache->der, cache->der_len); + if (!x509_parse_name(&cbs, dst)) { + return 0; } - - out->length = to - out->data; - + assert(CBS_len(&cbs) == 0); return 1; } -static int i2d_name_canon(STACK_OF(STACK_OF_X509_NAME_ENTRY) *_intname, - unsigned char **in) { - int len, ltmp; - size_t i; - ASN1_VALUE *v; - STACK_OF(ASN1_VALUE) *intname = (STACK_OF(ASN1_VALUE) *)_intname; - - len = 0; - for (i = 0; i < sk_ASN1_VALUE_num(intname); i++) { - v = sk_ASN1_VALUE_value(intname, i); - ltmp = ASN1_item_ex_i2d(&v, in, ASN1_ITEM_rptr(X509_NAME_ENTRIES), - /*tag=*/-1, /*aclass=*/0); - if (ltmp < 0) { - return ltmp; - } - len += ltmp; +X509_NAME *X509_NAME_dup(const X509_NAME *name) { + bssl::UniquePtr copy(X509_NAME_new()); + if (copy == nullptr || !x509_name_copy(copy.get(), name)) { + return nullptr; } + return copy.release(); +} + +X509_NAME *d2i_X509_NAME(X509_NAME **out, const uint8_t **inp, long len) { + return bssl::D2IFromCBS( + out, inp, len, [](CBS *cbs) -> bssl::UniquePtr { + bssl::UniquePtr name(X509_NAME_new()); + if (name == nullptr || !x509_parse_name(cbs, name.get())) { + return nullptr; + } + return name; + }); +} + +int i2d_X509_NAME(const X509_NAME *in, uint8_t **outp) { + if (in == nullptr) { + OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER); + return -1; + } + const X509_NAME_CACHE *cache = x509_name_get_cache(in); + if (cache == nullptr) { + return -1; + } + if (cache->der_len > INT_MAX) { + OPENSSL_PUT_ERROR(X509, ERR_R_OVERFLOW); + return -1; + } + int len = static_cast(cache->der_len); + if (outp == nullptr) { + return len; + } + if (*outp == nullptr) { + *outp = static_cast(OPENSSL_memdup(cache->der, cache->der_len)); + return *outp != nullptr ? len : -1; + } + OPENSSL_memcpy(*outp, cache->der, cache->der_len); + *outp += cache->der_len; return len; } -int X509_NAME_set(X509_NAME **xn, X509_NAME *name) { - if ((name = X509_NAME_dup(name)) == NULL) { +IMPLEMENT_EXTERN_ASN1_SIMPLE(X509_NAME, X509_NAME_new, X509_NAME_free, + CBS_ASN1_SEQUENCE, x509_parse_name, i2d_X509_NAME) + +static int asn1_marshal_string_canon(CBB *cbb, const ASN1_STRING *in) { + int (*decode_func)(CBS *, uint32_t *); + int error; + switch (in->type) { + case V_ASN1_UTF8STRING: + decode_func = CBS_get_utf8; + error = ASN1_R_INVALID_UTF8STRING; + break; + case V_ASN1_BMPSTRING: + decode_func = CBS_get_ucs2_be; + error = ASN1_R_INVALID_BMPSTRING; + break; + case V_ASN1_UNIVERSALSTRING: + decode_func = CBS_get_utf32_be; + error = ASN1_R_INVALID_UNIVERSALSTRING; + break; + case V_ASN1_PRINTABLESTRING: + case V_ASN1_T61STRING: + case V_ASN1_IA5STRING: + case V_ASN1_VISIBLESTRING: + decode_func = CBS_get_latin1; + error = ERR_R_INTERNAL_ERROR; // Latin-1 inputs are never invalid. + break; + default: + // Other string types are not canonicalized. + return asn1_marshal_any_string(cbb, in); + } + + CBB child; + if (!CBB_add_asn1(cbb, &child, CBS_ASN1_UTF8STRING)) { + return 0; + } + + bool empty = true; + bool in_whitespace = false; + CBS cbs; + CBS_init(&cbs, in->data, in->length); + while (CBS_len(&cbs) != 0) { + uint32_t c; + if (!decode_func(&cbs, &c)) { + OPENSSL_PUT_ERROR(ASN1, error); + return 0; + } + if (OPENSSL_isspace(c)) { + if (empty) { + continue; // Trim leading whitespace. + } + in_whitespace = true; + } else { + if (in_whitespace) { + // Collapse the previous run of whitespace into one space. + if (!CBB_add_u8(&child, ' ')) { + return 0; + } + } + in_whitespace = false; + // Lowecase ASCII codepoints. + if (c <= 0x7f) { + c = OPENSSL_tolower(c); + } + if (!CBB_add_utf8(&child, c)) { + return 0; + } + empty = false; + } + } + + return CBB_flush(cbb); +} + +int X509_NAME_set(X509_NAME **xn, const X509_NAME *name) { + bssl::UniquePtr copy(X509_NAME_dup(name)); + if (copy == nullptr) { return 0; } X509_NAME_free(*xn); - *xn = name; + *xn = copy.release(); return 1; } int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne) { return ne->set; } -int X509_NAME_get0_der(X509_NAME *nm, const unsigned char **out_der, +int X509_NAME_get0_der(const X509_NAME *nm, const unsigned char **out_der, size_t *out_der_len) { - // Make sure encoding is valid - if (i2d_X509_NAME(nm, NULL) <= 0) { + const X509_NAME_CACHE *cache = x509_name_get_cache(nm); + if (cache == nullptr) { return 0; } - if (out_der != NULL) { - *out_der = (unsigned char *)nm->bytes->data; + if (out_der != nullptr) { + *out_der = cache->der; } - if (out_der_len != NULL) { - *out_der_len = nm->bytes->length; + if (out_der_len != nullptr) { + *out_der_len = cache->der_len; } return 1; } - -int x509_marshal_name(CBB *out, X509_NAME *in) { - int len = i2d_X509_NAME(in, nullptr); - if (len <= 0) { - return 0; - } - uint8_t *ptr; - return CBB_add_space(out, &ptr, len) && i2d_X509_NAME(in, &ptr) == len; -} diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_pubkey.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_pubkey.cc index b3a33299fb..20046241bf 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_pubkey.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_pubkey.cc @@ -23,104 +23,150 @@ #include #include #include +#include +#include "../asn1/internal.h" +#include "../bytestring/internal.h" +#include "../evp/internal.h" #include "../internal.h" +#include "../mem_internal.h" #include "internal.h" -static void x509_pubkey_changed(X509_PUBKEY *pub) { - EVP_PKEY_free(pub->pkey); - pub->pkey = NULL; - - // Re-encode the |X509_PUBKEY| to DER and parse it with EVP's APIs. - uint8_t *spki = NULL; - int spki_len = i2d_X509_PUBKEY(pub, &spki); - EVP_PKEY *pkey; - if (spki_len < 0) { - goto err; - } - - CBS cbs; - CBS_init(&cbs, spki, (size_t)spki_len); - pkey = EVP_parse_public_key(&cbs); - if (pkey == NULL || CBS_len(&cbs) != 0) { - EVP_PKEY_free(pkey); - goto err; - } - - pub->pkey = pkey; - -err: - OPENSSL_free(spki); - // If the operation failed, clear errors. An |X509_PUBKEY| whose key we cannot - // parse is still a valid SPKI. It just cannot be converted to an |EVP_PKEY|. - ERR_clear_error(); +void x509_pubkey_init(X509_PUBKEY *key) { + OPENSSL_memset(key, 0, sizeof(X509_PUBKEY)); + x509_algor_init(&key->algor); + asn1_string_init(&key->public_key, V_ASN1_BIT_STRING); } -static int pubkey_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, - void *exarg) { - X509_PUBKEY *pubkey = (X509_PUBKEY *)*pval; - if (operation == ASN1_OP_FREE_POST) { - EVP_PKEY_free(pubkey->pkey); - } else if (operation == ASN1_OP_D2I_POST) { - x509_pubkey_changed(pubkey); +X509_PUBKEY *X509_PUBKEY_new(void) { + bssl::UniquePtr ret = bssl::MakeUnique(); + if (ret == nullptr) { + return nullptr; } + x509_pubkey_init(ret.get()); + return ret.release(); +} + +void x509_pubkey_cleanup(X509_PUBKEY *key) { + x509_algor_cleanup(&key->algor); + asn1_string_cleanup(&key->public_key); + EVP_PKEY_free(key->pkey); +} + +void X509_PUBKEY_free(X509_PUBKEY *key) { + if (key != nullptr) { + x509_pubkey_cleanup(key); + OPENSSL_free(key); + } +} + +static void x509_pubkey_changed(X509_PUBKEY *pub, + bssl::Span algs) { + EVP_PKEY_free(pub->pkey); + pub->pkey = nullptr; + + // Re-encode the |X509_PUBKEY| to DER and parse it with EVP's APIs. If the + // operation fails, clear errors. An |X509_PUBKEY| whose key we cannot parse + // is still a valid SPKI. It just cannot be converted to an |EVP_PKEY|. + bssl::ScopedCBB cbb; + if (!CBB_init(cbb.get(), 64) || !x509_marshal_public_key(cbb.get(), pub)) { + ERR_clear_error(); + return; + } + bssl::UniquePtr pkey(EVP_PKEY_from_subject_public_key_info( + CBB_data(cbb.get()), CBB_len(cbb.get()), algs.data(), algs.size())); + if (pkey == nullptr) { + ERR_clear_error(); + return; + } + + pub->pkey = pkey.release(); +} + +int x509_parse_public_key(CBS *cbs, X509_PUBKEY *out, + bssl::Span algs) { + CBS seq; + if (!CBS_get_asn1(cbs, &seq, CBS_ASN1_SEQUENCE) || + !x509_parse_algorithm(&seq, &out->algor) || + !asn1_parse_bit_string(&seq, &out->public_key, /*tag=*/0) || + CBS_len(&seq) != 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return 0; + } + x509_pubkey_changed(out, algs); return 1; } -ASN1_SEQUENCE_cb(X509_PUBKEY, pubkey_cb) = { - ASN1_SIMPLE(X509_PUBKEY, algor, X509_ALGOR), - ASN1_SIMPLE(X509_PUBKEY, public_key, ASN1_BIT_STRING), -} ASN1_SEQUENCE_END_cb(X509_PUBKEY, X509_PUBKEY) +static int x509_parse_public_key_default(CBS *cbs, X509_PUBKEY *out) { + return x509_parse_public_key(cbs, out, bssl::GetDefaultEVPAlgorithms()); +} -IMPLEMENT_ASN1_FUNCTIONS_const(X509_PUBKEY) +int x509_marshal_public_key(CBB *cbb, const X509_PUBKEY *in) { + CBB seq; + return CBB_add_asn1(cbb, &seq, CBS_ASN1_SEQUENCE) && + x509_marshal_algorithm(&seq, &in->algor) && + asn1_marshal_bit_string(&seq, &in->public_key, /*tag=*/0) && + CBB_flush(cbb); +} -int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey) { - X509_PUBKEY *pk = NULL; - uint8_t *spki = NULL; - size_t spki_len; +X509_PUBKEY *d2i_X509_PUBKEY(X509_PUBKEY **out, const uint8_t **inp, long len) { + return bssl::D2IFromCBS( + out, inp, len, [](CBS *cbs) -> bssl::UniquePtr { + bssl::UniquePtr ret(X509_PUBKEY_new()); + if (ret == nullptr || !x509_parse_public_key_default(cbs, ret.get())) { + return nullptr; + } + return ret; + }); +} - if (x == NULL) { +int i2d_X509_PUBKEY(const X509_PUBKEY *key, uint8_t **outp) { + return bssl::I2DFromCBB(/*initial_capacity=*/32, outp, [&](CBB *cbb) -> bool { + return x509_marshal_public_key(cbb, key); + }); +} + +// TODO(crbug.com/42290417): Remove this when |X509| and |X509_REQ| no longer +// depend on the tables. +IMPLEMENT_EXTERN_ASN1_SIMPLE(X509_PUBKEY, X509_PUBKEY_new, X509_PUBKEY_free, + CBS_ASN1_SEQUENCE, x509_parse_public_key_default, + i2d_X509_PUBKEY) + +int x509_pubkey_set1(X509_PUBKEY *key, EVP_PKEY *pkey) { + bssl::ScopedCBB cbb; + if (!CBB_init(cbb.get(), 64) || + !EVP_marshal_public_key(cbb.get(), pkey)) { + OPENSSL_PUT_ERROR(X509, X509_R_PUBLIC_KEY_ENCODE_ERROR); return 0; } - CBB cbb; - const uint8_t *p; - if (!CBB_init(&cbb, 0) || // - !EVP_marshal_public_key(&cbb, pkey) || - !CBB_finish(&cbb, &spki, &spki_len) || // - spki_len > LONG_MAX) { - CBB_cleanup(&cbb); - OPENSSL_PUT_ERROR(X509, X509_R_PUBLIC_KEY_ENCODE_ERROR); - goto error; - } + CBS cbs; + CBS_init(&cbs, CBB_data(cbb.get()), CBB_len(cbb.get())); + // TODO(crbug.com/42290364): Use an |EVP_PKEY_ALG| derived from |pkey|. + // |X509_PUBKEY_get0| does not currently work when setting, say, an + // |EVP_PKEY_RSA_PSS| key. + return x509_parse_public_key(&cbs, key, bssl::GetDefaultEVPAlgorithms()); +} - p = spki; - pk = d2i_X509_PUBKEY(NULL, &p, (long)spki_len); - if (pk == NULL || p != spki + spki_len) { - OPENSSL_PUT_ERROR(X509, X509_R_PUBLIC_KEY_DECODE_ERROR); - goto error; +int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey) { + bssl::UniquePtr new_key(X509_PUBKEY_new()); + if (new_key == nullptr || !x509_pubkey_set1(new_key.get(), pkey)) { + return 0; } - - OPENSSL_free(spki); X509_PUBKEY_free(*x); - *x = pk; - + *x = new_key.release(); return 1; -error: - X509_PUBKEY_free(pk); - OPENSSL_free(spki); - return 0; } EVP_PKEY *X509_PUBKEY_get0(const X509_PUBKEY *key) { - if (key == NULL) { - return NULL; + if (key == nullptr) { + return nullptr; } - if (key->pkey == NULL) { + if (key->pkey == nullptr) { OPENSSL_PUT_ERROR(X509, X509_R_PUBLIC_KEY_DECODE_ERROR); - return NULL; + return nullptr; } return key->pkey; @@ -128,7 +174,7 @@ EVP_PKEY *X509_PUBKEY_get0(const X509_PUBKEY *key) { EVP_PKEY *X509_PUBKEY_get(const X509_PUBKEY *key) { EVP_PKEY *pkey = X509_PUBKEY_get0(key); - if (pkey != NULL) { + if (pkey != nullptr) { EVP_PKEY_up_ref(pkey); } return pkey; @@ -136,35 +182,35 @@ EVP_PKEY *X509_PUBKEY_get(const X509_PUBKEY *key) { int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *obj, int param_type, void *param_value, uint8_t *key, int key_len) { - if (!X509_ALGOR_set0(pub->algor, obj, param_type, param_value)) { + if (!X509_ALGOR_set0(&pub->algor, obj, param_type, param_value)) { return 0; } - ASN1_STRING_set0(pub->public_key, key, key_len); + ASN1_STRING_set0(&pub->public_key, key, key_len); // Set the number of unused bits to zero. - pub->public_key->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); - pub->public_key->flags |= ASN1_STRING_FLAG_BITS_LEFT; + pub->public_key.flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); + pub->public_key.flags |= ASN1_STRING_FLAG_BITS_LEFT; - x509_pubkey_changed(pub); + x509_pubkey_changed(pub, bssl::GetDefaultEVPAlgorithms()); return 1; } int X509_PUBKEY_get0_param(ASN1_OBJECT **out_obj, const uint8_t **out_key, int *out_key_len, X509_ALGOR **out_alg, X509_PUBKEY *pub) { - if (out_obj != NULL) { - *out_obj = pub->algor->algorithm; + if (out_obj != nullptr) { + *out_obj = pub->algor.algorithm; } - if (out_key != NULL) { - *out_key = pub->public_key->data; - *out_key_len = pub->public_key->length; + if (out_key != nullptr) { + *out_key = pub->public_key.data; + *out_key_len = pub->public_key.length; } - if (out_alg != NULL) { - *out_alg = pub->algor; + if (out_alg != nullptr) { + *out_alg = &pub->algor; } return 1; } const ASN1_BIT_STRING *X509_PUBKEY_get0_public_key(const X509_PUBKEY *pub) { - return pub->public_key; + return &pub->public_key; } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_req.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_req.cc index ca74904336..b8c0f84515 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_req.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_req.cc @@ -60,7 +60,7 @@ ASN1_SEQUENCE_enc(X509_REQ_INFO, enc, rinf_cb) = { ASN1_IMP_SET_OF_OPT(X509_REQ_INFO, attributes, X509_ATTRIBUTE, 0), } ASN1_SEQUENCE_END_enc(X509_REQ_INFO, X509_REQ_INFO) -IMPLEMENT_ASN1_FUNCTIONS(X509_REQ_INFO) +IMPLEMENT_ASN1_FUNCTIONS_const(X509_REQ_INFO) ASN1_SEQUENCE(X509_REQ) = { ASN1_SIMPLE(X509_REQ, req_info, X509_REQ_INFO), @@ -68,6 +68,6 @@ ASN1_SEQUENCE(X509_REQ) = { ASN1_SIMPLE(X509_REQ, signature, ASN1_BIT_STRING), } ASN1_SEQUENCE_END(X509_REQ) -IMPLEMENT_ASN1_FUNCTIONS(X509_REQ) +IMPLEMENT_ASN1_FUNCTIONS_const(X509_REQ) -IMPLEMENT_ASN1_DUP_FUNCTION(X509_REQ) +IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_REQ) diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_sig.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_sig.cc index e64c01404b..c361c630dd 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_sig.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_sig.cc @@ -32,20 +32,20 @@ IMPLEMENT_ASN1_FUNCTIONS_const(X509_SIG) void X509_SIG_get0(const X509_SIG *sig, const X509_ALGOR **out_alg, const ASN1_OCTET_STRING **out_digest) { - if (out_alg != NULL) { + if (out_alg != nullptr) { *out_alg = sig->algor; } - if (out_digest != NULL) { + if (out_digest != nullptr) { *out_digest = sig->digest; } } void X509_SIG_getm(X509_SIG *sig, X509_ALGOR **out_alg, ASN1_OCTET_STRING **out_digest) { - if (out_alg != NULL) { + if (out_alg != nullptr) { *out_alg = sig->algor; } - if (out_digest != NULL) { + if (out_digest != nullptr) { *out_digest = sig->digest; } } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_val.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_val.cc deleted file mode 100644 index c9bc0a0501..0000000000 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_val.cc +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.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 - -#include -#include - -#include "internal.h" - - -ASN1_SEQUENCE(X509_VAL) = { - ASN1_SIMPLE(X509_VAL, notBefore, ASN1_TIME), - ASN1_SIMPLE(X509_VAL, notAfter, ASN1_TIME), -} ASN1_SEQUENCE_END(X509_VAL) - -IMPLEMENT_ASN1_FUNCTIONS_const(X509_VAL) diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_x509.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_x509.cc index 3e6c2a0d83..bf2d5942e0 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_x509.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_x509.cc @@ -27,69 +27,64 @@ #include "../asn1/internal.h" #include "../bytestring/internal.h" +#include "../evp/internal.h" #include "../internal.h" #include "internal.h" static CRYPTO_EX_DATA_CLASS g_ex_data_class = CRYPTO_EX_DATA_CLASS_INIT; -ASN1_SEQUENCE_enc(X509_CINF, enc, 0) = { - ASN1_EXP_OPT(X509_CINF, version, ASN1_INTEGER, 0), - ASN1_SIMPLE(X509_CINF, serialNumber, ASN1_INTEGER), - ASN1_SIMPLE(X509_CINF, signature, X509_ALGOR), - ASN1_SIMPLE(X509_CINF, issuer, X509_NAME), - ASN1_SIMPLE(X509_CINF, validity, X509_VAL), - ASN1_SIMPLE(X509_CINF, subject, X509_NAME), - ASN1_SIMPLE(X509_CINF, key, X509_PUBKEY), - ASN1_IMP_OPT(X509_CINF, issuerUID, ASN1_BIT_STRING, 1), - ASN1_IMP_OPT(X509_CINF, subjectUID, ASN1_BIT_STRING, 2), - ASN1_EXP_SEQUENCE_OF_OPT(X509_CINF, extensions, X509_EXTENSION, 3), -} ASN1_SEQUENCE_END_enc(X509_CINF, X509_CINF) +static constexpr CBS_ASN1_TAG kVersionTag = + CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 0; +static constexpr CBS_ASN1_TAG kIssuerUIDTag = CBS_ASN1_CONTEXT_SPECIFIC | 1; +static constexpr CBS_ASN1_TAG kSubjectUIDTag = CBS_ASN1_CONTEXT_SPECIFIC | 2; +static constexpr CBS_ASN1_TAG kExtensionsTag = + CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 3; -IMPLEMENT_ASN1_FUNCTIONS(X509_CINF) - -// x509_new_null returns a new |X509| object where the |cert_info|, |sig_alg|, -// and |signature| fields are not yet filled in. -static X509 *x509_new_null(void) { - X509 *ret = reinterpret_cast(OPENSSL_zalloc(sizeof(X509))); - if (ret == NULL) { - return NULL; +X509 *X509_new(void) { + bssl::UniquePtr ret( + reinterpret_cast(OPENSSL_zalloc(sizeof(X509)))); + if (ret == nullptr) { + return nullptr; } ret->references = 1; ret->ex_pathlen = -1; + ret->version = X509_VERSION_1; + asn1_string_init(&ret->serialNumber, V_ASN1_INTEGER); + x509_algor_init(&ret->tbs_sig_alg); + x509_name_init(&ret->issuer); + asn1_string_init(&ret->notBefore, -1); + asn1_string_init(&ret->notAfter, -1); + x509_name_init(&ret->subject); + x509_pubkey_init(&ret->key); + x509_algor_init(&ret->sig_alg); + asn1_string_init(&ret->signature, V_ASN1_BIT_STRING); CRYPTO_new_ex_data(&ret->ex_data); CRYPTO_MUTEX_init(&ret->lock); - return ret; -} - -X509 *X509_new(void) { - X509 *ret = x509_new_null(); - if (ret == NULL) { - return NULL; - } - - ret->cert_info = X509_CINF_new(); - ret->sig_alg = X509_ALGOR_new(); - ret->signature = ASN1_BIT_STRING_new(); - if (ret->cert_info == NULL || ret->sig_alg == NULL || - ret->signature == NULL) { - X509_free(ret); - return NULL; - } - - return ret; + return ret.release(); } void X509_free(X509 *x509) { - if (x509 == NULL || !CRYPTO_refcount_dec_and_test_zero(&x509->references)) { + if (x509 == nullptr || + !CRYPTO_refcount_dec_and_test_zero(&x509->references)) { return; } CRYPTO_free_ex_data(&g_ex_data_class, &x509->ex_data); - X509_CINF_free(x509->cert_info); - X509_ALGOR_free(x509->sig_alg); - ASN1_BIT_STRING_free(x509->signature); + asn1_string_cleanup(&x509->serialNumber); + x509_algor_cleanup(&x509->tbs_sig_alg); + x509_name_cleanup(&x509->issuer); + asn1_string_cleanup(&x509->notBefore); + asn1_string_cleanup(&x509->notAfter); + x509_name_cleanup(&x509->subject); + x509_pubkey_cleanup(&x509->key); + ASN1_BIT_STRING_free(x509->issuerUID); + ASN1_BIT_STRING_free(x509->subjectUID); + sk_X509_EXTENSION_pop_free(x509->extensions, X509_EXTENSION_free); + x509_algor_cleanup(&x509->sig_alg); + asn1_string_cleanup(&x509->signature); + CRYPTO_BUFFER_free(x509->buf); ASN1_OCTET_STRING_free(x509->skid); AUTHORITY_KEYID_free(x509->akid); CRL_DIST_POINTS_free(x509->crldp); @@ -101,176 +96,240 @@ void X509_free(X509 *x509) { OPENSSL_free(x509); } -static X509 *x509_parse(CBS *cbs, CRYPTO_BUFFER *buf) { - CBS cert, tbs, sigalg, sig; - if (!CBS_get_asn1(cbs, &cert, CBS_ASN1_SEQUENCE) || - // Bound the length to comfortably fit in an int. Lengths in this - // module often omit overflow checks. - CBS_len(&cert) > INT_MAX / 2 || - !CBS_get_asn1_element(&cert, &tbs, CBS_ASN1_SEQUENCE) || - !CBS_get_asn1_element(&cert, &sigalg, CBS_ASN1_SEQUENCE)) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); +X509 *X509_parse_with_algorithms(CRYPTO_BUFFER *buf, + const EVP_PKEY_ALG *const *algs, + size_t num_algs) { + bssl::UniquePtr ret(X509_new()); + if (ret == nullptr) { return nullptr; } - // For just the signature field, we accept non-minimal BER lengths, though not - // indefinite-length encoding. See b/18228011. - // - // TODO(crbug.com/boringssl/354): Switch the affected callers to convert the - // certificate before parsing and then remove this workaround. - CBS_ASN1_TAG tag; - size_t header_len; - int indefinite; - if (!CBS_get_any_ber_asn1_element(&cert, &sig, &tag, &header_len, - /*out_ber_found=*/nullptr, - &indefinite) || - tag != CBS_ASN1_BITSTRING || indefinite || // - !CBS_skip(&sig, header_len) || // + // Save the buffer to cache the original encoding. + ret->buf = bssl::UpRef(buf).release(); + + // Parse the Certificate. + CBS cbs, cert, tbs; + CRYPTO_BUFFER_init_CBS(buf, &cbs); + if (!CBS_get_asn1(&cbs, &cert, CBS_ASN1_SEQUENCE) || // + CBS_len(&cbs) != 0 || + // Bound the length to comfortably fit in an int. Lengths in this + // module often omit overflow checks. + CBS_len(&cert) > INT_MAX / 2 || + !CBS_get_asn1(&cert, &tbs, CBS_ASN1_SEQUENCE) || + !x509_parse_algorithm(&cert, &ret->sig_alg) || + // For just the signature field, we accept non-minimal BER lengths, though + // not indefinite-length encoding. See b/18228011. + // + // TODO(crbug.com/boringssl/354): Switch the affected callers to convert + // the certificate before parsing and then remove this workaround. + !asn1_parse_bit_string_with_bad_length(&cert, &ret->signature) || CBS_len(&cert) != 0) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); return nullptr; } - bssl::UniquePtr ret(x509_new_null()); - if (ret == nullptr) { - return nullptr; - } - - // TODO(crbug.com/boringssl/443): When the rest of the library is decoupled - // from the tasn_*.c implementation, replace this with |CBS|-based - // functions. - const uint8_t *inp = CBS_data(&tbs); - if (ASN1_item_ex_d2i((ASN1_VALUE **)&ret->cert_info, &inp, CBS_len(&tbs), - ASN1_ITEM_rptr(X509_CINF), /*tag=*/-1, - /*aclass=*/0, /*opt=*/0, buf) <= 0 || - inp != CBS_data(&tbs) + CBS_len(&tbs)) { - return nullptr; - } - - inp = CBS_data(&sigalg); - ret->sig_alg = d2i_X509_ALGOR(nullptr, &inp, CBS_len(&sigalg)); - if (ret->sig_alg == nullptr || inp != CBS_data(&sigalg) + CBS_len(&sigalg)) { - return nullptr; - } - - inp = CBS_data(&sig); - ret->signature = c2i_ASN1_BIT_STRING(nullptr, &inp, CBS_len(&sig)); - if (ret->signature == nullptr || inp != CBS_data(&sig) + CBS_len(&sig)) { - return nullptr; - } - - // The version must be one of v1(0), v2(1), or v3(2). - long version = X509_VERSION_1; - if (ret->cert_info->version != nullptr) { - version = ASN1_INTEGER_get(ret->cert_info->version); - // TODO(https://crbug.com/boringssl/364): |X509_VERSION_1| should - // also be rejected here. This means an explicitly-encoded X.509v1 - // version. v1 is DEFAULT, so DER requires it be omitted. - if (version < X509_VERSION_1 || version > X509_VERSION_3) { + // Parse the TBSCertificate. + if (CBS_peek_asn1_tag(&tbs, kVersionTag)) { + CBS wrapper; + uint64_t version; + if (!CBS_get_asn1(&tbs, &wrapper, kVersionTag) || + !CBS_get_asn1_uint64(&wrapper, &version) || // + CBS_len(&wrapper) != 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return nullptr; + } + // The version must be one of v1(0), v2(1), or v3(2). + // TODO(https://crbug.com/42290225): Also reject |X509_VERSION_1|. v1 is + // DEFAULT, so DER requires it be omitted. + if (version != X509_VERSION_1 && version != X509_VERSION_2 && + version != X509_VERSION_3) { OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION); return nullptr; } + ret->version = static_cast(version); + } else { + ret->version = X509_VERSION_1; } - - // Per RFC 5280, section 4.1.2.8, these fields require v2 or v3. - if (version == X509_VERSION_1 && (ret->cert_info->issuerUID != nullptr || - ret->cert_info->subjectUID != nullptr)) { - OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION); + CBS validity; + if (!asn1_parse_integer(&tbs, &ret->serialNumber, /*tag=*/0) || + !x509_parse_algorithm(&tbs, &ret->tbs_sig_alg) || + !x509_parse_name(&tbs, &ret->issuer) || + !CBS_get_asn1(&tbs, &validity, CBS_ASN1_SEQUENCE) || + !asn1_parse_time(&validity, &ret->notBefore, + /*allow_utc_timezone_offset=*/1) || + !asn1_parse_time(&validity, &ret->notAfter, + /*allow_utc_timezone_offset=*/1) || + CBS_len(&validity) != 0 || // + !x509_parse_name(&tbs, &ret->subject) || + !x509_parse_public_key(&tbs, &ret->key, bssl::Span(algs, num_algs))) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); return nullptr; } - - // Per RFC 5280, section 4.1.2.9, extensions require v3. - if (version != X509_VERSION_3 && ret->cert_info->extensions != nullptr) { - OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION); + // Per RFC 5280, section 4.1.2.8, these fields require v2 or v3: + if (ret->version >= X509_VERSION_2 && + CBS_peek_asn1_tag(&tbs, kIssuerUIDTag)) { + ret->issuerUID = ASN1_BIT_STRING_new(); + if (ret->issuerUID == nullptr || + !asn1_parse_bit_string(&tbs, ret->issuerUID, kIssuerUIDTag)) { + return nullptr; + } + } + if (ret->version >= X509_VERSION_2 && + CBS_peek_asn1_tag(&tbs, kSubjectUIDTag)) { + ret->subjectUID = ASN1_BIT_STRING_new(); + if (ret->subjectUID == nullptr || + !asn1_parse_bit_string(&tbs, ret->subjectUID, kSubjectUIDTag)) { + return nullptr; + } + } + // Per RFC 5280, section 4.1.2.9, extensions require v3: + if (ret->version >= X509_VERSION_3 && + CBS_peek_asn1_tag(&tbs, kExtensionsTag)) { + CBS wrapper; + if (!CBS_get_asn1(&tbs, &wrapper, kExtensionsTag)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return nullptr; + } + // TODO(crbug.com/442221114, crbug.com/42290219): Empty extension lists + // should be rejected. Extensions is a SEQUENCE SIZE (1..MAX), so it cannot + // be empty. An empty extensions list is encoded by omitting the OPTIONAL + // field. libpki already rejects this. + const uint8_t *p = CBS_data(&wrapper); + ret->extensions = d2i_X509_EXTENSIONS(nullptr, &p, CBS_len(&wrapper)); + if (ret->extensions == nullptr || + p != CBS_data(&wrapper) + CBS_len(&wrapper)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return nullptr; + } + } + if (CBS_len(&tbs) != 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); return nullptr; } return ret.release(); } -X509 *d2i_X509(X509 **out, const uint8_t **inp, long len) { - X509 *ret = NULL; - if (len < 0) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_BUFFER_TOO_SMALL); - goto err; - } - - CBS cbs; - CBS_init(&cbs, *inp, (size_t)len); - ret = x509_parse(&cbs, NULL); - if (ret == NULL) { - goto err; - } - - *inp = CBS_data(&cbs); - -err: - if (out != NULL) { - X509_free(*out); - *out = ret; - } - return ret; +X509 *X509_parse_from_buffer(CRYPTO_BUFFER *buf) { + auto algs = bssl::GetDefaultEVPAlgorithms(); + return X509_parse_with_algorithms(buf, algs.data(), algs.size()); } -int i2d_X509(X509 *x509, uint8_t **outp) { - if (x509 == NULL) { +static bssl::UniquePtr x509_parse(CBS *cbs) { + CBS cert; + if (!CBS_get_asn1_element(cbs, &cert, CBS_ASN1_SEQUENCE)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return nullptr; + } + + bssl::UniquePtr buf(CRYPTO_BUFFER_new_from_CBS(&cert, nullptr)); + if (buf == nullptr) { + return nullptr; + } + return bssl::UniquePtr(X509_parse_from_buffer(buf.get())); +} + +int x509_marshal_tbs_cert(CBB *cbb, const X509 *x509) { + if (x509->buf != nullptr) { + // Replay the saved TBSCertificate from the |CRYPTO_BUFFER|, to verify + // exactly what we parsed. The |CRYPTO_BUFFER| contains the full + // Certificate, so we need to find the TBSCertificate portion. + CBS cbs, cert, tbs; + CRYPTO_BUFFER_init_CBS(x509->buf, &cbs); + if (!CBS_get_asn1(&cbs, &cert, CBS_ASN1_SEQUENCE) || + !CBS_get_asn1_element(&cert, &tbs, CBS_ASN1_SEQUENCE)) { + // This should be impossible. + OPENSSL_PUT_ERROR(X509, ERR_R_INTERNAL_ERROR); + return 0; + } + return CBB_add_bytes(cbb, CBS_data(&tbs), CBS_len(&tbs)); + } + + // No saved TBSCertificate encoding. Encode it anew. + CBB tbs, version, validity, extensions; + if (!CBB_add_asn1(cbb, &tbs, CBS_ASN1_SEQUENCE)) { + return 0; + } + if (x509->version != X509_VERSION_1) { + if (!CBB_add_asn1(&tbs, &version, kVersionTag) || + !CBB_add_asn1_uint64(&version, x509->version)) { + return 0; + } + } + if (!asn1_marshal_integer(&tbs, &x509->serialNumber, /*tag=*/0) || + !x509_marshal_algorithm(&tbs, &x509->tbs_sig_alg) || + !x509_marshal_name(&tbs, &x509->issuer) || + !CBB_add_asn1(&tbs, &validity, CBS_ASN1_SEQUENCE) || + !asn1_marshal_time(&validity, &x509->notBefore) || + !asn1_marshal_time(&validity, &x509->notAfter) || + !x509_marshal_name(&tbs, &x509->subject) || + !x509_marshal_public_key(&tbs, &x509->key) || + (x509->issuerUID != nullptr && + !asn1_marshal_bit_string(&tbs, x509->issuerUID, kIssuerUIDTag)) || + (x509->subjectUID != nullptr && + !asn1_marshal_bit_string(&tbs, x509->subjectUID, kSubjectUIDTag))) { + return 0; + } + if (x509->extensions != nullptr) { + int len = i2d_X509_EXTENSIONS(x509->extensions, nullptr); + uint8_t *out; + if (len <= 0 || // + !CBB_add_asn1(&tbs, &extensions, kExtensionsTag) || + !CBB_add_space(&extensions, &out, len) || + i2d_X509_EXTENSIONS(x509->extensions, &out) != len) { + return 0; + } + } + return CBB_flush(cbb); +} + +static int x509_marshal(CBB *cbb, const X509 *x509) { + CBB cert; + return CBB_add_asn1(cbb, &cert, CBS_ASN1_SEQUENCE) && + x509_marshal_tbs_cert(&cert, x509) && + x509_marshal_algorithm(&cert, &x509->sig_alg) && + asn1_marshal_bit_string(&cert, &x509->signature, /*tag=*/0) && + CBB_flush(cbb); +} + +X509 *d2i_X509(X509 **out, const uint8_t **inp, long len) { + return bssl::D2IFromCBS(out, inp, len, x509_parse); +} + +int i2d_X509(const X509 *x509, uint8_t **outp) { + if (x509 == nullptr) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE); return -1; } - bssl::ScopedCBB cbb; - CBB cert; - if (!CBB_init(cbb.get(), 64) || // - !CBB_add_asn1(cbb.get(), &cert, CBS_ASN1_SEQUENCE)) { - return -1; - } - - // TODO(crbug.com/boringssl/443): When the rest of the library is decoupled - // from the tasn_*.c implementation, replace this with |CBS|-based functions. - uint8_t *out; - int len = i2d_X509_CINF(x509->cert_info, NULL); - if (len < 0 || // - !CBB_add_space(&cert, &out, static_cast(len)) || - i2d_X509_CINF(x509->cert_info, &out) != len || - !x509_marshal_algorithm(&cert, x509->sig_alg) || - !asn1_marshal_bit_string(&cert, x509->signature, /*tag=*/0)) { - return -1; - } - - return CBB_finish_i2d(cbb.get(), outp); + return bssl::I2DFromCBB( + /*initial_capacity=*/256, outp, + [&](CBB *cbb) -> bool { return x509_marshal(cbb, x509); }); } static int x509_new_cb(ASN1_VALUE **pval, const ASN1_ITEM *it) { *pval = (ASN1_VALUE *)X509_new(); - return *pval != NULL; + return *pval != nullptr; } static void x509_free_cb(ASN1_VALUE **pval, const ASN1_ITEM *it) { X509_free((X509 *)*pval); - *pval = NULL; + *pval = nullptr; } -static int x509_d2i_cb(ASN1_VALUE **pval, const unsigned char **in, long len, - const ASN1_ITEM *it, int opt, ASN1_TLC *ctx) { - if (len < 0) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_BUFFER_TOO_SMALL); +static int x509_parse_cb(ASN1_VALUE **pval, CBS *cbs, const ASN1_ITEM *it, + int opt) { + if (opt && !CBS_peek_asn1_tag(cbs, CBS_ASN1_SEQUENCE)) { + return 1; + } + + bssl::UniquePtr ret = x509_parse(cbs); + if (ret == nullptr) { return 0; } - CBS cbs; - CBS_init(&cbs, *in, len); - if (opt && !CBS_peek_asn1_tag(&cbs, CBS_ASN1_SEQUENCE)) { - return -1; - } - - X509 *ret = x509_parse(&cbs, NULL); - if (ret == NULL) { - return 0; - } - - *in = CBS_data(&cbs); X509_free((X509 *)*pval); - *pval = (ASN1_VALUE *)ret; + *pval = (ASN1_VALUE *)ret.release(); return 1; } @@ -279,40 +338,23 @@ static int x509_i2d_cb(ASN1_VALUE **pval, unsigned char **out, return i2d_X509((X509 *)*pval, out); } -static const ASN1_EXTERN_FUNCS x509_extern_funcs = { - x509_new_cb, - x509_free_cb, - x509_d2i_cb, - x509_i2d_cb, -}; +static const ASN1_EXTERN_FUNCS x509_extern_funcs = {x509_new_cb, x509_free_cb, + x509_parse_cb, x509_i2d_cb}; +IMPLEMENT_EXTERN_ASN1(X509, x509_extern_funcs) -IMPLEMENT_EXTERN_ASN1(X509, V_ASN1_SEQUENCE, x509_extern_funcs) - -X509 *X509_dup(X509 *x509) { - uint8_t *der = NULL; +X509 *X509_dup(const X509 *x509) { + uint8_t *der = nullptr; int len = i2d_X509(x509, &der); if (len < 0) { - return NULL; + return nullptr; } const uint8_t *inp = der; - X509 *ret = d2i_X509(NULL, &inp, len); + X509 *ret = d2i_X509(nullptr, &inp, len); OPENSSL_free(der); return ret; } -X509 *X509_parse_from_buffer(CRYPTO_BUFFER *buf) { - CBS cbs; - CBS_init(&cbs, CRYPTO_BUFFER_data(buf), CRYPTO_BUFFER_len(buf)); - X509 *ret = x509_parse(&cbs, buf); - if (ret == NULL || CBS_len(&cbs) != 0) { - X509_free(ret); - return NULL; - } - - return ret; -} - int X509_up_ref(X509 *x) { CRYPTO_refcount_inc(&x->references); return 1; @@ -342,13 +384,13 @@ X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp, long length) { X509 *ret; int freeret = 0; - if (!a || *a == NULL) { + if (!a || *a == nullptr) { freeret = 1; } ret = d2i_X509(a, &q, length); // If certificate unreadable then forget it if (!ret) { - return NULL; + return nullptr; } // update length length -= q - *pp; @@ -362,34 +404,34 @@ err: if (freeret) { X509_free(ret); if (a) { - *a = NULL; + *a = nullptr; } } - return NULL; + return nullptr; } // Serialize trusted certificate to *pp or just return the required buffer // length if pp == NULL. We ultimately want to avoid modifying *pp in the // error path, but that depends on similar hygiene in lower-level functions. // Here we avoid compounding the problem. -static int i2d_x509_aux_internal(X509 *a, unsigned char **pp) { +static int i2d_x509_aux_internal(const X509 *a, unsigned char **pp) { int length, tmplen; - unsigned char *start = pp != NULL ? *pp : NULL; + unsigned char *start = pp != nullptr ? *pp : nullptr; - assert(pp == NULL || *pp != NULL); + assert(pp == nullptr || *pp != nullptr); // This might perturb *pp on error, but fixing that belongs in i2d_X509() // not here. It should be that if a == NULL length is zero, but we check // both just in case. length = i2d_X509(a, pp); - if (length <= 0 || a == NULL) { + if (length <= 0 || a == nullptr) { return length; } - if (a->aux != NULL) { + if (a->aux != nullptr) { tmplen = i2d_X509_CERT_AUX(a->aux, pp); if (tmplen < 0) { - if (start != NULL) { + if (start != nullptr) { *pp = start; } return tmplen; @@ -407,23 +449,23 @@ static int i2d_x509_aux_internal(X509 *a, unsigned char **pp) { // we're writing two ASN.1 objects back to back, we can't have i2d_X509() do // the allocation, nor can we allow i2d_X509_CERT_AUX() to increment the // allocated buffer. -int i2d_X509_AUX(X509 *a, unsigned char **pp) { +int i2d_X509_AUX(const X509 *a, unsigned char **pp) { int length; unsigned char *tmp; // Buffer provided by caller - if (pp == NULL || *pp != NULL) { + if (pp == nullptr || *pp != nullptr) { return i2d_x509_aux_internal(a, pp); } // Obtain the combined length - if ((length = i2d_x509_aux_internal(a, NULL)) <= 0) { + if ((length = i2d_x509_aux_internal(a, nullptr)) <= 0) { return length; } // Allocate requisite combined storage *pp = tmp = reinterpret_cast(OPENSSL_malloc(length)); - if (tmp == NULL) { + if (tmp == nullptr) { return -1; // Push error onto error stack? } @@ -431,55 +473,47 @@ int i2d_X509_AUX(X509 *a, unsigned char **pp) { length = i2d_x509_aux_internal(a, &tmp); if (length <= 0) { OPENSSL_free(*pp); - *pp = NULL; + *pp = nullptr; } return length; } -int i2d_re_X509_tbs(X509 *x509, unsigned char **outp) { - asn1_encoding_clear(&x509->cert_info->enc); - return i2d_X509_CINF(x509->cert_info, outp); +int i2d_re_X509_tbs(X509 *x509, uint8_t **outp) { + CRYPTO_BUFFER_free(x509->buf); + x509->buf = nullptr; + return i2d_X509_tbs(x509, outp); } -int i2d_X509_tbs(X509 *x509, unsigned char **outp) { - return i2d_X509_CINF(x509->cert_info, outp); +int i2d_X509_tbs(const X509 *x509, uint8_t **outp) { + return bssl::I2DFromCBB(/*initial_capacity=*/128, outp, [&](CBB *cbb) -> bool { + return x509_marshal_tbs_cert(cbb, x509); + }); } int X509_set1_signature_algo(X509 *x509, const X509_ALGOR *algo) { - X509_ALGOR *copy1 = X509_ALGOR_dup(algo); - X509_ALGOR *copy2 = X509_ALGOR_dup(algo); - if (copy1 == NULL || copy2 == NULL) { - X509_ALGOR_free(copy1); - X509_ALGOR_free(copy2); - return 0; - } - - X509_ALGOR_free(x509->sig_alg); - x509->sig_alg = copy1; - X509_ALGOR_free(x509->cert_info->signature); - x509->cert_info->signature = copy2; - return 1; + return X509_ALGOR_copy(&x509->sig_alg, algo) && + X509_ALGOR_copy(&x509->tbs_sig_alg, algo); } int X509_set1_signature_value(X509 *x509, const uint8_t *sig, size_t sig_len) { - if (!ASN1_STRING_set(x509->signature, sig, sig_len)) { + if (!ASN1_STRING_set(&x509->signature, sig, sig_len)) { return 0; } - x509->signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); - x509->signature->flags |= ASN1_STRING_FLAG_BITS_LEFT; + x509->signature.flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); + x509->signature.flags |= ASN1_STRING_FLAG_BITS_LEFT; return 1; } void X509_get0_signature(const ASN1_BIT_STRING **psig, const X509_ALGOR **palg, const X509 *x) { if (psig) { - *psig = x->signature; + *psig = &x->signature; } if (palg) { - *palg = x->sig_alg; + *palg = &x->sig_alg; } } int X509_get_signature_nid(const X509 *x) { - return OBJ_obj2nid(x->sig_alg->algorithm); + return OBJ_obj2nid(x->sig_alg.algorithm); } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_x509a.cc b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_x509a.cc index 9318d43eb6..e78e6fe6bc 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_x509a.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/x509/x_x509a.cc @@ -40,10 +40,10 @@ IMPLEMENT_ASN1_FUNCTIONS_const(X509_CERT_AUX) static X509_CERT_AUX *aux_get(X509 *x) { if (!x) { - return NULL; + return nullptr; } if (!x->aux && !(x->aux = X509_CERT_AUX_new())) { - return NULL; + return nullptr; } return x->aux; } @@ -58,7 +58,7 @@ int X509_alias_set1(X509 *x, const uint8_t *name, ossl_ssize_t len) { return 1; } ASN1_UTF8STRING_free(x->aux->alias); - x->aux->alias = NULL; + x->aux->alias = nullptr; return 1; } if (!(aux = aux_get(x))) { @@ -80,7 +80,7 @@ int X509_keyid_set1(X509 *x, const uint8_t *id, ossl_ssize_t len) { return 1; } ASN1_OCTET_STRING_free(x->aux->keyid); - x->aux->keyid = NULL; + x->aux->keyid = nullptr; return 1; } if (!(aux = aux_get(x))) { @@ -93,19 +93,19 @@ int X509_keyid_set1(X509 *x, const uint8_t *id, ossl_ssize_t len) { } const uint8_t *X509_alias_get0(const X509 *x, int *out_len) { - const ASN1_UTF8STRING *alias = x->aux != NULL ? x->aux->alias : NULL; - if (out_len != NULL) { - *out_len = alias != NULL ? alias->length : 0; + const ASN1_UTF8STRING *alias = x->aux != nullptr ? x->aux->alias : nullptr; + if (out_len != nullptr) { + *out_len = alias != nullptr ? alias->length : 0; } - return alias != NULL ? alias->data : NULL; + return alias != nullptr ? alias->data : nullptr; } const uint8_t *X509_keyid_get0(const X509 *x, int *out_len) { - const ASN1_OCTET_STRING *keyid = x->aux != NULL ? x->aux->keyid : NULL; - if (out_len != NULL) { - *out_len = keyid != NULL ? keyid->length : 0; + const ASN1_OCTET_STRING *keyid = x->aux != nullptr ? x->aux->keyid : nullptr; + if (out_len != nullptr) { + *out_len = keyid != nullptr ? keyid->length : 0; } - return keyid != NULL ? keyid->data : NULL; + return keyid != nullptr ? keyid->data : nullptr; } int X509_add1_trust_object(X509 *x, const ASN1_OBJECT *obj) { @@ -141,13 +141,13 @@ int X509_add1_reject_object(X509 *x, const ASN1_OBJECT *obj) { void X509_trust_clear(X509 *x) { if (x->aux && x->aux->trust) { sk_ASN1_OBJECT_pop_free(x->aux->trust, ASN1_OBJECT_free); - x->aux->trust = NULL; + x->aux->trust = nullptr; } } void X509_reject_clear(X509 *x) { if (x->aux && x->aux->reject) { sk_ASN1_OBJECT_pop_free(x->aux->reject, ASN1_OBJECT_free); - x->aux->reject = NULL; + x->aux->reject = nullptr; } } diff --git a/naiveproxy/src/third_party/boringssl/src/crypto/xwing/xwing.cc b/naiveproxy/src/third_party/boringssl/src/crypto/xwing/xwing.cc index 216f12a441..38436a0b46 100644 --- a/naiveproxy/src/third_party/boringssl/src/crypto/xwing/xwing.cc +++ b/naiveproxy/src/third_party/boringssl/src/crypto/xwing/xwing.cc @@ -29,18 +29,19 @@ struct private_key { uint8_t seed[XWING_PRIVATE_KEY_BYTES]; }; -static struct private_key *private_key_from_external( - const struct XWING_private_key *external) { - static_assert(sizeof(struct XWING_private_key) == sizeof(struct private_key), - "XWING private key size is incorrect"); - static_assert( - alignof(struct XWING_private_key) == alignof(struct private_key), - "XWING private key alignment is incorrect"); - return (struct private_key *)external; +static_assert(sizeof(XWING_private_key) == sizeof(private_key)); +static_assert(alignof(XWING_private_key) == alignof(private_key)); + +static const private_key *private_key_from_external( + const XWING_private_key *external) { + return reinterpret_cast(external); +} +static private_key *private_key_from_external(XWING_private_key *external) { + return reinterpret_cast(external); } -static void xwing_expand_private_key(struct private_key *inout_private_key) { - struct BORINGSSL_keccak_st context; +static void xwing_expand_private_key(private_key *inout_private_key) { + BORINGSSL_keccak_st context; BORINGSSL_keccak_init(&context, boringssl_shake256); BORINGSSL_keccak_absorb(&context, inout_private_key->seed, sizeof(inout_private_key->seed)); @@ -56,8 +57,7 @@ static void xwing_expand_private_key(struct private_key *inout_private_key) { sizeof(inout_private_key->x25519_private_key)); } -static int xwing_parse_private_key(struct private_key *out_private_key, - CBS *in) { +static int xwing_parse_private_key(private_key *out_private_key, CBS *in) { if (!CBS_copy_bytes(in, out_private_key->seed, sizeof(out_private_key->seed))) { return 0; @@ -67,14 +67,13 @@ static int xwing_parse_private_key(struct private_key *out_private_key, return 1; } -static int xwing_marshal_private_key(CBB *out, - const struct private_key *private_key) { +static int xwing_marshal_private_key(CBB *out, const private_key *private_key) { return CBB_add_bytes(out, private_key->seed, sizeof(private_key->seed)); } static int xwing_public_from_private( uint8_t out_encoded_public_key[XWING_PUBLIC_KEY_BYTES], - const struct private_key *private_key) { + const private_key *private_key) { CBB cbb; if (!CBB_init_fixed(&cbb, out_encoded_public_key, XWING_PUBLIC_KEY_BYTES)) { return 0; @@ -107,7 +106,7 @@ static void xwing_combiner( const uint8_t mlkem_shared_secret[MLKEM_SHARED_SECRET_BYTES], const uint8_t x25519_shared_secret[32], const uint8_t x25519_ciphertext[32], const uint8_t x25519_public_key[32]) { - struct BORINGSSL_keccak_st context; + BORINGSSL_keccak_st context; BORINGSSL_keccak_init(&context, boringssl_sha3_256); BORINGSSL_keccak_absorb(&context, mlkem_shared_secret, @@ -142,7 +141,7 @@ int XWING_marshal_private_key(CBB *out, int XWING_generate_key(uint8_t out_encoded_public_key[XWING_PUBLIC_KEY_BYTES], struct XWING_private_key *out_private_key) { - struct private_key *private_key = private_key_from_external(out_private_key); + private_key *private_key = private_key_from_external(out_private_key); RAND_bytes(private_key->seed, sizeof(private_key->seed)); xwing_expand_private_key(private_key); @@ -191,9 +190,8 @@ int XWING_encap_external_entropy( static_assert(MLKEM768_PUBLIC_KEY_BYTES <= XWING_PUBLIC_KEY_BYTES); CBS_init(&mlkem_cbs, encoded_public_key, MLKEM768_PUBLIC_KEY_BYTES); - BCM_mlkem768_public_key mlkem_public_key; - if (!bcm_success( - BCM_mlkem768_parse_public_key(&mlkem_public_key, &mlkem_cbs))) { + MLKEM768_public_key mlkem_public_key; + if (!MLKEM768_parse_public_key(&mlkem_public_key, &mlkem_cbs)) { return 0; } @@ -210,7 +208,7 @@ int XWING_encap_external_entropy( static int xwing_decap(uint8_t out_shared_secret[XWING_SHARED_SECRET_BYTES], const uint8_t ciphertext[XWING_CIPHERTEXT_BYTES], - const struct private_key *private_key) { + const private_key *private_key) { static_assert(XWING_CIPHERTEXT_BYTES >= MLKEM768_CIPHERTEXT_BYTES + 32); const uint8_t *mlkem_ciphertext = ciphertext; const uint8_t *x25519_ciphertext = ciphertext + MLKEM768_CIPHERTEXT_BYTES; diff --git a/naiveproxy/src/third_party/boringssl/src/decrepit/bio/base64_bio.cc b/naiveproxy/src/third_party/boringssl/src/decrepit/bio/base64_bio.cc index 3ece828b7e..4be8d49844 100644 --- a/naiveproxy/src/third_party/boringssl/src/decrepit/bio/base64_bio.cc +++ b/naiveproxy/src/third_party/boringssl/src/decrepit/bio/base64_bio.cc @@ -50,7 +50,7 @@ typedef struct b64_struct { static int b64_new(BIO *bio) { BIO_B64_CTX *ctx = reinterpret_cast(OPENSSL_zalloc(sizeof(*ctx))); - if (ctx == NULL) { + if (ctx == nullptr) { return 0; } @@ -63,11 +63,11 @@ static int b64_new(BIO *bio) { } static int b64_free(BIO *bio) { - if (bio == NULL) { + if (bio == nullptr) { return 0; } OPENSSL_free(bio->ptr); - bio->ptr = NULL; + bio->ptr = nullptr; bio->init = 0; bio->flags = 0; return 1; @@ -78,12 +78,12 @@ static int b64_read(BIO *b, char *out, int outl) { BIO_B64_CTX *ctx; uint8_t *p, *q; - if (out == NULL) { + if (out == nullptr) { return 0; } ctx = (BIO_B64_CTX *)b->ptr; - if (ctx == NULL || b->next_bio == NULL) { + if (ctx == nullptr || b->next_bio == nullptr) { return 0; } @@ -310,7 +310,7 @@ static int b64_write(BIO *b, const char *in, int inl) { ctx->buf_off = 0; ctx->buf_len = 0; - if (in == NULL || inl <= 0) { + if (in == nullptr || inl <= 0) { return 0; } @@ -430,7 +430,7 @@ static long b64_ctrl(BIO *b, int cmd, long num, void *ptr) { // do a final write again: while (ctx->buf_len != ctx->buf_off) { - i = b64_write(b, NULL, 0); + i = b64_write(b, nullptr, 0); if (i < 0) { return i; } @@ -470,7 +470,7 @@ static long b64_ctrl(BIO *b, int cmd, long num, void *ptr) { } static long b64_callback_ctrl(BIO *b, int cmd, BIO_info_cb *fp) { - if (b->next_bio == NULL) { + if (b->next_bio == nullptr) { return 0; } return BIO_callback_ctrl(b->next_bio, cmd, fp); diff --git a/naiveproxy/src/third_party/boringssl/src/decrepit/evp/evp_do_all.cc b/naiveproxy/src/third_party/boringssl/src/decrepit/evp/evp_do_all.cc index e04b80cd6a..feaf17c72c 100644 --- a/naiveproxy/src/third_party/boringssl/src/decrepit/evp/evp_do_all.cc +++ b/naiveproxy/src/third_party/boringssl/src/decrepit/evp/evp_do_all.cc @@ -19,75 +19,75 @@ void EVP_CIPHER_do_all_sorted(void (*callback)(const EVP_CIPHER *cipher, const char *name, const char *unused, void *arg), void *arg) { - callback(EVP_aes_128_cbc(), "AES-128-CBC", NULL, arg); - callback(EVP_aes_192_cbc(), "AES-192-CBC", NULL, arg); - callback(EVP_aes_256_cbc(), "AES-256-CBC", NULL, arg); - callback(EVP_aes_128_ctr(), "AES-128-CTR", NULL, arg); - callback(EVP_aes_192_ctr(), "AES-192-CTR", NULL, arg); - callback(EVP_aes_256_ctr(), "AES-256-CTR", NULL, arg); - callback(EVP_aes_128_ecb(), "AES-128-ECB", NULL, arg); - callback(EVP_aes_192_ecb(), "AES-192-ECB", NULL, arg); - callback(EVP_aes_256_ecb(), "AES-256-ECB", NULL, arg); - callback(EVP_aes_128_ofb(), "AES-128-OFB", NULL, arg); - callback(EVP_aes_192_ofb(), "AES-192-OFB", NULL, arg); - callback(EVP_aes_256_ofb(), "AES-256-OFB", NULL, arg); - callback(EVP_aes_128_gcm(), "AES-128-GCM", NULL, arg); - callback(EVP_aes_192_gcm(), "AES-192-GCM", NULL, arg); - callback(EVP_aes_256_gcm(), "AES-256-GCM", NULL, arg); - callback(EVP_des_cbc(), "DES-CBC", NULL, arg); - callback(EVP_des_ecb(), "DES-ECB", NULL, arg); - callback(EVP_des_ede(), "DES-EDE", NULL, arg); - callback(EVP_des_ede_cbc(), "DES-EDE-CBC", NULL, arg); - callback(EVP_des_ede3_cbc(), "DES-EDE3-CBC", NULL, arg); - callback(EVP_rc2_cbc(), "RC2-CBC", NULL, arg); - callback(EVP_rc4(), "RC4", NULL, arg); + callback(EVP_aes_128_cbc(), "AES-128-CBC", nullptr, arg); + callback(EVP_aes_192_cbc(), "AES-192-CBC", nullptr, arg); + callback(EVP_aes_256_cbc(), "AES-256-CBC", nullptr, arg); + callback(EVP_aes_128_ctr(), "AES-128-CTR", nullptr, arg); + callback(EVP_aes_192_ctr(), "AES-192-CTR", nullptr, arg); + callback(EVP_aes_256_ctr(), "AES-256-CTR", nullptr, arg); + callback(EVP_aes_128_ecb(), "AES-128-ECB", nullptr, arg); + callback(EVP_aes_192_ecb(), "AES-192-ECB", nullptr, arg); + callback(EVP_aes_256_ecb(), "AES-256-ECB", nullptr, arg); + callback(EVP_aes_128_ofb(), "AES-128-OFB", nullptr, arg); + callback(EVP_aes_192_ofb(), "AES-192-OFB", nullptr, arg); + callback(EVP_aes_256_ofb(), "AES-256-OFB", nullptr, arg); + callback(EVP_aes_128_gcm(), "AES-128-GCM", nullptr, arg); + callback(EVP_aes_192_gcm(), "AES-192-GCM", nullptr, arg); + callback(EVP_aes_256_gcm(), "AES-256-GCM", nullptr, arg); + callback(EVP_des_cbc(), "DES-CBC", nullptr, arg); + callback(EVP_des_ecb(), "DES-ECB", nullptr, arg); + callback(EVP_des_ede(), "DES-EDE", nullptr, arg); + callback(EVP_des_ede_cbc(), "DES-EDE-CBC", nullptr, arg); + callback(EVP_des_ede3_cbc(), "DES-EDE3-CBC", nullptr, arg); + callback(EVP_rc2_cbc(), "RC2-CBC", nullptr, arg); + callback(EVP_rc4(), "RC4", nullptr, arg); // OpenSSL returns everything twice, the second time in lower case. - callback(EVP_aes_128_cbc(), "aes-128-cbc", NULL, arg); - callback(EVP_aes_192_cbc(), "aes-192-cbc", NULL, arg); - callback(EVP_aes_256_cbc(), "aes-256-cbc", NULL, arg); - callback(EVP_aes_128_ctr(), "aes-128-ctr", NULL, arg); - callback(EVP_aes_192_ctr(), "aes-192-ctr", NULL, arg); - callback(EVP_aes_256_ctr(), "aes-256-ctr", NULL, arg); - callback(EVP_aes_128_ecb(), "aes-128-ecb", NULL, arg); - callback(EVP_aes_192_ecb(), "aes-192-ecb", NULL, arg); - callback(EVP_aes_256_ecb(), "aes-256-ecb", NULL, arg); - callback(EVP_aes_128_ofb(), "aes-128-ofb", NULL, arg); - callback(EVP_aes_192_ofb(), "aes-192-ofb", NULL, arg); - callback(EVP_aes_256_ofb(), "aes-256-ofb", NULL, arg); - callback(EVP_aes_128_gcm(), "aes-128-gcm", NULL, arg); - callback(EVP_aes_192_gcm(), "aes-192-gcm", NULL, arg); - callback(EVP_aes_256_gcm(), "aes-256-gcm", NULL, arg); - callback(EVP_des_cbc(), "des-cbc", NULL, arg); - callback(EVP_des_ecb(), "des-ecb", NULL, arg); - callback(EVP_des_ede(), "des-ede", NULL, arg); - callback(EVP_des_ede_cbc(), "des-ede-cbc", NULL, arg); - callback(EVP_des_ede3_cbc(), "des-ede3-cbc", NULL, arg); - callback(EVP_rc2_cbc(), "rc2-cbc", NULL, arg); - callback(EVP_rc4(), "rc4", NULL, arg); + callback(EVP_aes_128_cbc(), "aes-128-cbc", nullptr, arg); + callback(EVP_aes_192_cbc(), "aes-192-cbc", nullptr, arg); + callback(EVP_aes_256_cbc(), "aes-256-cbc", nullptr, arg); + callback(EVP_aes_128_ctr(), "aes-128-ctr", nullptr, arg); + callback(EVP_aes_192_ctr(), "aes-192-ctr", nullptr, arg); + callback(EVP_aes_256_ctr(), "aes-256-ctr", nullptr, arg); + callback(EVP_aes_128_ecb(), "aes-128-ecb", nullptr, arg); + callback(EVP_aes_192_ecb(), "aes-192-ecb", nullptr, arg); + callback(EVP_aes_256_ecb(), "aes-256-ecb", nullptr, arg); + callback(EVP_aes_128_ofb(), "aes-128-ofb", nullptr, arg); + callback(EVP_aes_192_ofb(), "aes-192-ofb", nullptr, arg); + callback(EVP_aes_256_ofb(), "aes-256-ofb", nullptr, arg); + callback(EVP_aes_128_gcm(), "aes-128-gcm", nullptr, arg); + callback(EVP_aes_192_gcm(), "aes-192-gcm", nullptr, arg); + callback(EVP_aes_256_gcm(), "aes-256-gcm", nullptr, arg); + callback(EVP_des_cbc(), "des-cbc", nullptr, arg); + callback(EVP_des_ecb(), "des-ecb", nullptr, arg); + callback(EVP_des_ede(), "des-ede", nullptr, arg); + callback(EVP_des_ede_cbc(), "des-ede-cbc", nullptr, arg); + callback(EVP_des_ede3_cbc(), "des-ede3-cbc", nullptr, arg); + callback(EVP_rc2_cbc(), "rc2-cbc", nullptr, arg); + callback(EVP_rc4(), "rc4", nullptr, arg); } void EVP_MD_do_all_sorted(void (*callback)(const EVP_MD *cipher, const char *name, const char *unused, void *arg), void *arg) { - callback(EVP_md4(), "MD4", NULL, arg); - callback(EVP_md5(), "MD5", NULL, arg); - callback(EVP_sha1(), "SHA1", NULL, arg); - callback(EVP_sha224(), "SHA224", NULL, arg); - callback(EVP_sha256(), "SHA256", NULL, arg); - callback(EVP_sha384(), "SHA384", NULL, arg); - callback(EVP_sha512(), "SHA512", NULL, arg); - callback(EVP_sha512_256(), "SHA512-256", NULL, arg); + callback(EVP_md4(), "MD4", nullptr, arg); + callback(EVP_md5(), "MD5", nullptr, arg); + callback(EVP_sha1(), "SHA1", nullptr, arg); + callback(EVP_sha224(), "SHA224", nullptr, arg); + callback(EVP_sha256(), "SHA256", nullptr, arg); + callback(EVP_sha384(), "SHA384", nullptr, arg); + callback(EVP_sha512(), "SHA512", nullptr, arg); + callback(EVP_sha512_256(), "SHA512-256", nullptr, arg); - callback(EVP_md4(), "md4", NULL, arg); - callback(EVP_md5(), "md5", NULL, arg); - callback(EVP_sha1(), "sha1", NULL, arg); - callback(EVP_sha224(), "sha224", NULL, arg); - callback(EVP_sha256(), "sha256", NULL, arg); - callback(EVP_sha384(), "sha384", NULL, arg); - callback(EVP_sha512(), "sha512", NULL, arg); - callback(EVP_sha512_256(), "sha512-256", NULL, arg); + callback(EVP_md4(), "md4", nullptr, arg); + callback(EVP_md5(), "md5", nullptr, arg); + callback(EVP_sha1(), "sha1", nullptr, arg); + callback(EVP_sha224(), "sha224", nullptr, arg); + callback(EVP_sha256(), "sha256", nullptr, arg); + callback(EVP_sha384(), "sha384", nullptr, arg); + callback(EVP_sha512(), "sha512", nullptr, arg); + callback(EVP_sha512_256(), "sha512-256", nullptr, arg); } void EVP_MD_do_all(void (*callback)(const EVP_MD *cipher, const char *name, diff --git a/naiveproxy/src/third_party/boringssl/src/decrepit/ripemd/ripemd.cc b/naiveproxy/src/third_party/boringssl/src/decrepit/ripemd/ripemd.cc index dbbb2b37fe..485387f396 100644 --- a/naiveproxy/src/third_party/boringssl/src/decrepit/ripemd/ripemd.cc +++ b/naiveproxy/src/third_party/boringssl/src/decrepit/ripemd/ripemd.cc @@ -701,7 +701,7 @@ uint8_t *RIPEMD160(const uint8_t *data, size_t len, RIPEMD160_CTX ctx; if (!RIPEMD160_Init(&ctx)) { - return NULL; + return nullptr; } RIPEMD160_Update(&ctx, data, len); diff --git a/naiveproxy/src/third_party/boringssl/src/decrepit/rsa/rsa_decrepit.cc b/naiveproxy/src/third_party/boringssl/src/decrepit/rsa/rsa_decrepit.cc index a1b943fee3..f4cc431363 100644 --- a/naiveproxy/src/third_party/boringssl/src/decrepit/rsa/rsa_decrepit.cc +++ b/naiveproxy/src/third_party/boringssl/src/decrepit/rsa/rsa_decrepit.cc @@ -38,17 +38,17 @@ RSA *RSA_generate_key(int bits, uint64_t e_value, void *callback, int RSA_padding_add_PKCS1_PSS(const RSA *rsa, uint8_t *EM, const uint8_t *mHash, const EVP_MD *Hash, int sLen) { - return RSA_padding_add_PKCS1_PSS_mgf1(rsa, EM, mHash, Hash, NULL, sLen); + return RSA_padding_add_PKCS1_PSS_mgf1(rsa, EM, mHash, Hash, nullptr, sLen); } int RSA_verify_PKCS1_PSS(const RSA *rsa, const uint8_t *mHash, const EVP_MD *Hash, const uint8_t *EM, int sLen) { - return RSA_verify_PKCS1_PSS_mgf1(rsa, mHash, Hash, NULL, EM, sLen); + return RSA_verify_PKCS1_PSS_mgf1(rsa, mHash, Hash, nullptr, EM, sLen); } int RSA_padding_add_PKCS1_OAEP(uint8_t *to, size_t to_len, const uint8_t *from, size_t from_len, const uint8_t *param, size_t param_len) { return RSA_padding_add_PKCS1_OAEP_mgf1(to, to_len, from, from_len, param, - param_len, NULL, NULL); + param_len, nullptr, nullptr); } diff --git a/naiveproxy/src/third_party/boringssl/src/decrepit/ssl/ssl_decrepit.cc b/naiveproxy/src/third_party/boringssl/src/decrepit/ssl/ssl_decrepit.cc index 8a2a9b0310..d72ddfeaab 100644 --- a/naiveproxy/src/third_party/boringssl/src/decrepit/ssl/ssl_decrepit.cc +++ b/naiveproxy/src/third_party/boringssl/src/decrepit/ssl/ssl_decrepit.cc @@ -28,7 +28,7 @@ int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack, const char *path) { DIR *dir = opendir(path); - if (dir == NULL) { + if (dir == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_SYS_LIB); ERR_add_error_data(3, "opendir('", dir, "')"); return 0; @@ -39,7 +39,7 @@ int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack, // |readdir| may fail with or without setting |errno|. errno = 0; struct dirent *dirent = readdir(dir); - if (dirent == NULL) { + if (dirent == nullptr) { if (errno) { OPENSSL_PUT_ERROR(SSL, ERR_R_SYS_LIB); ERR_add_error_data(3, "readdir('", path, "')"); diff --git a/naiveproxy/src/third_party/boringssl/src/decrepit/x509/x509_decrepit.cc b/naiveproxy/src/third_party/boringssl/src/decrepit/x509/x509_decrepit.cc index 5611d42ce5..eb3262929f 100644 --- a/naiveproxy/src/third_party/boringssl/src/decrepit/x509/x509_decrepit.cc +++ b/naiveproxy/src/third_party/boringssl/src/decrepit/x509/x509_decrepit.cc @@ -22,6 +22,6 @@ X509_EXTENSION *X509V3_EXT_conf_nid(CRYPTO_MUST_BE_NULL *conf, const X509V3_CTX *ctx, int ext_nid, const char *value) { - assert(conf == NULL); - return X509V3_EXT_nconf_nid(NULL, ctx, ext_nid, value); + assert(conf == nullptr); + return X509V3_EXT_nconf_nid(nullptr, ctx, ext_nid, value); } diff --git a/naiveproxy/src/third_party/boringssl/src/decrepit/xts/xts.cc b/naiveproxy/src/third_party/boringssl/src/decrepit/xts/xts.cc index 398fa9000f..3b7e96cec0 100644 --- a/naiveproxy/src/third_party/boringssl/src/decrepit/xts/xts.cc +++ b/naiveproxy/src/third_party/boringssl/src/decrepit/xts/xts.cc @@ -193,8 +193,8 @@ static int aes_xts_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr) { return -1; } // key1 and key2 are used as an indicator both key and IV are set - xctx->xts.key1 = NULL; - xctx->xts.key2 = NULL; + xctx->xts.key1 = nullptr; + xctx->xts.key2 = nullptr; return 1; } diff --git a/naiveproxy/src/third_party/boringssl/src/docs/releasing.md b/naiveproxy/src/third_party/boringssl/src/docs/releasing.md index e610ed8687..5da2dfd206 100644 --- a/naiveproxy/src/third_party/boringssl/src/docs/releasing.md +++ b/naiveproxy/src/third_party/boringssl/src/docs/releasing.md @@ -14,26 +14,30 @@ release, do the following: The "Annotation" field must be non-empty. (Just using the name of the tag again is fine.) -4. Wait for the tag to be mirrored to GitHub, and create a corresponding - GitHub [release](https://github.com/google/boringssl/releases/new). You - have to be a boringssl owner on github for this to work, if it the new link - does not work, bug davidben to invite you to the repository. +4. Wait for the tag to be mirrored to GitHub. If this takes too long, fetch the + tag in your local checkout and push it by hand. (`git fetch origin` + followed by `git push github NAME_OF_TAG`, if `github` is the name of the + remote in your checkout.) -5. Download the "Source code (tar.gz)" archive from the new release and - re-attach it to the release by clicking the edit button, and selecting "Attach New File" - overtop of the release artifacts in github. (The next step will check that the archive is - correct.) +5. Download the tarball of the tag [from GitHub](https://github.com/google/boringssl/tags) + using the "tar.gz" link. -6. Clone a copy of https://github.com/bazelbuild/bazel-central-registry so that you - can make a github pull request against it. +6. Create a corresponding GitHub + [release](https://github.com/google/boringssl/releases/new). You have to be + an owner of GitHub repository for this to work. Ask in the team chat if it + does not work. Attach the tarball to the release. (The `prepare_bcr_module` + tool will check that this was correct.) -6. Run `go run ./util/prepare_bcr_module TAG` and follow the instructions. The +7. Clone a copy of https://github.com/bazelbuild/bazel-central-registry so that you + can make a GitHub pull request against it. + +8. Run `go run ./util/prepare_bcr_module TAG` and follow the instructions. The tool does not require special privileges, though it does fetch URLs from GitHub and read the local checkout. It outputs a JSON file for BCR's tooling to consume. The instructions will tell you to run a bazelisk command. -7. CD into the root of your bazel-central-registry fork, and run the bazelisk +9. CD into the root of your bazel-central-registry fork, and run the bazelisk command indicated by the script output above. It will add a directory to the - repository which is untracked, use "git status " to find it, and "git add" to + repository which is untracked, use `git status` to find it, and `git add` to add it to what you are about to commit. Then commit the changes and added directory, and submit it as a pr to bazel-central-registry. diff --git a/naiveproxy/src/third_party/boringssl/src/gen/bcm/armv8-mont-apple.S b/naiveproxy/src/third_party/boringssl/src/gen/bcm/armv8-mont-apple.S index fadf3e2463..f360147fe4 100644 --- a/naiveproxy/src/third_party/boringssl/src/gen/bcm/armv8-mont-apple.S +++ b/naiveproxy/src/third_party/boringssl/src/gen/bcm/armv8-mont-apple.S @@ -428,7 +428,7 @@ Lsqr8x_outer_loop: adc x24,x24,x15 adds x24,x24,x16 - sub x14,x3,x5 // rewinded ap + sub x14,x3,x5 // rewound ap adc x25,xzr,xzr // t[14] add x25,x25,x17 @@ -775,7 +775,7 @@ Lsqr8x_tail: // to be zero at this point ldp x6,x7,[x2,#8*0] sub x27,x3,x1 // done yet? - sub x16,x3,x5 // rewinded np + sub x16,x3,x5 // rewound np ldp x8,x9,[x2,#8*2] ldp x10,x11,[x2,#8*4] ldp x12,x13,[x2,#8*6] @@ -1115,7 +1115,7 @@ Loop_mul4x_1st_tail: //adc x0,x0,xzr cbnz x28,Loop_mul4x_1st_tail - sub x11,x27,x5 // rewinded x1 + sub x11,x27,x5 // rewound x1 cbz x10,Lmul4x_proceed ldp x6,x7,[x1,#8*0] @@ -1257,7 +1257,7 @@ Loop_mul4x_tail: //adc x0,x0,xzr cbnz x28,Loop_mul4x_tail - sub x11,x3,x5 // rewinded np? + sub x11,x3,x5 // rewound np? adc x0,x0,xzr cbz x10,Loop_mul4x_break diff --git a/naiveproxy/src/third_party/boringssl/src/gen/bcm/armv8-mont-linux.S b/naiveproxy/src/third_party/boringssl/src/gen/bcm/armv8-mont-linux.S index 574647f82d..760bd8840f 100644 --- a/naiveproxy/src/third_party/boringssl/src/gen/bcm/armv8-mont-linux.S +++ b/naiveproxy/src/third_party/boringssl/src/gen/bcm/armv8-mont-linux.S @@ -428,7 +428,7 @@ __bn_sqr8x_mont: adc x24,x24,x15 adds x24,x24,x16 - sub x14,x3,x5 // rewinded ap + sub x14,x3,x5 // rewound ap adc x25,xzr,xzr // t[14] add x25,x25,x17 @@ -775,7 +775,7 @@ __bn_sqr8x_mont: // to be zero at this point ldp x6,x7,[x2,#8*0] sub x27,x3,x1 // done yet? - sub x16,x3,x5 // rewinded np + sub x16,x3,x5 // rewound np ldp x8,x9,[x2,#8*2] ldp x10,x11,[x2,#8*4] ldp x12,x13,[x2,#8*6] @@ -1115,7 +1115,7 @@ __bn_mul4x_mont: //adc x0,x0,xzr cbnz x28,.Loop_mul4x_1st_tail - sub x11,x27,x5 // rewinded x1 + sub x11,x27,x5 // rewound x1 cbz x10,.Lmul4x_proceed ldp x6,x7,[x1,#8*0] @@ -1257,7 +1257,7 @@ __bn_mul4x_mont: //adc x0,x0,xzr cbnz x28,.Loop_mul4x_tail - sub x11,x3,x5 // rewinded np? + sub x11,x3,x5 // rewound np? adc x0,x0,xzr cbz x10,.Loop_mul4x_break diff --git a/naiveproxy/src/third_party/boringssl/src/gen/bcm/armv8-mont-win.S b/naiveproxy/src/third_party/boringssl/src/gen/bcm/armv8-mont-win.S index 84f3473e5f..40d724962b 100644 --- a/naiveproxy/src/third_party/boringssl/src/gen/bcm/armv8-mont-win.S +++ b/naiveproxy/src/third_party/boringssl/src/gen/bcm/armv8-mont-win.S @@ -432,7 +432,7 @@ Lsqr8x_outer_loop: adc x24,x24,x15 adds x24,x24,x16 - sub x14,x3,x5 // rewinded ap + sub x14,x3,x5 // rewound ap adc x25,xzr,xzr // t[14] add x25,x25,x17 @@ -779,7 +779,7 @@ Lsqr8x_tail: // to be zero at this point ldp x6,x7,[x2,#8*0] sub x27,x3,x1 // done yet? - sub x16,x3,x5 // rewinded np + sub x16,x3,x5 // rewound np ldp x8,x9,[x2,#8*2] ldp x10,x11,[x2,#8*4] ldp x12,x13,[x2,#8*6] @@ -1121,7 +1121,7 @@ Loop_mul4x_1st_tail: //adc x0,x0,xzr cbnz x28,Loop_mul4x_1st_tail - sub x11,x27,x5 // rewinded x1 + sub x11,x27,x5 // rewound x1 cbz x10,Lmul4x_proceed ldp x6,x7,[x1,#8*0] @@ -1263,7 +1263,7 @@ Loop_mul4x_tail: //adc x0,x0,xzr cbnz x28,Loop_mul4x_tail - sub x11,x3,x5 // rewinded np? + sub x11,x3,x5 // rewound np? adc x0,x0,xzr cbz x10,Loop_mul4x_break diff --git a/naiveproxy/src/third_party/boringssl/src/gen/crypto/chacha20_poly1305_armv8-apple.S b/naiveproxy/src/third_party/boringssl/src/gen/crypto/chacha20_poly1305_armv8-apple.S index 66c538c0dc..73647cfb1e 100644 --- a/naiveproxy/src/third_party/boringssl/src/gen/crypto/chacha20_poly1305_armv8-apple.S +++ b/naiveproxy/src/third_party/boringssl/src/gen/crypto/chacha20_poly1305_armv8-apple.S @@ -1199,7 +1199,7 @@ Lseal_hash_extra_load: subs x4, x4, #1 b.gt Lseal_hash_extra_load - // Hash in the final padded extra_in blcok + // Hash in the final padded extra_in block mov x11, v20.d[0] mov x12, v20.d[1] adds x8, x8, x11 diff --git a/naiveproxy/src/third_party/boringssl/src/gen/crypto/chacha20_poly1305_armv8-linux.S b/naiveproxy/src/third_party/boringssl/src/gen/crypto/chacha20_poly1305_armv8-linux.S index f1f2b6792e..49712202a7 100644 --- a/naiveproxy/src/third_party/boringssl/src/gen/crypto/chacha20_poly1305_armv8-linux.S +++ b/naiveproxy/src/third_party/boringssl/src/gen/crypto/chacha20_poly1305_armv8-linux.S @@ -1199,7 +1199,7 @@ chacha20_poly1305_seal: subs x4, x4, #1 b.gt .Lseal_hash_extra_load - // Hash in the final padded extra_in blcok + // Hash in the final padded extra_in block mov x11, v20.d[0] mov x12, v20.d[1] adds x8, x8, x11 diff --git a/naiveproxy/src/third_party/boringssl/src/gen/crypto/chacha20_poly1305_armv8-win.S b/naiveproxy/src/third_party/boringssl/src/gen/crypto/chacha20_poly1305_armv8-win.S index 4c0b96713a..dac5eee2cb 100644 --- a/naiveproxy/src/third_party/boringssl/src/gen/crypto/chacha20_poly1305_armv8-win.S +++ b/naiveproxy/src/third_party/boringssl/src/gen/crypto/chacha20_poly1305_armv8-win.S @@ -1203,7 +1203,7 @@ Lseal_hash_extra_load: subs x4, x4, #1 b.gt Lseal_hash_extra_load - // Hash in the final padded extra_in blcok + // Hash in the final padded extra_in block mov x11, v20.d[0] mov x12, v20.d[1] adds x8, x8, x11 diff --git a/naiveproxy/src/third_party/boringssl/src/gen/crypto/err_data.cc b/naiveproxy/src/third_party/boringssl/src/gen/crypto/err_data.cc index f3d8f7c257..6c73376e58 100644 --- a/naiveproxy/src/third_party/boringssl/src/gen/crypto/err_data.cc +++ b/naiveproxy/src/third_party/boringssl/src/gen/crypto/err_data.cc @@ -78,54 +78,54 @@ const uint32_t kOpenSSLReasonValues[] = { 0xc3b00f7, 0xc3b8921, 0x10320892, - 0x103296b2, - 0x103316be, - 0x103396d7, - 0x103416ea, + 0x103296c6, + 0x103316d2, + 0x103396eb, + 0x103416fe, 0x10348fd3, 0x10350d1f, - 0x103596fd, - 0x10361727, - 0x1036973a, - 0x10371759, - 0x10379772, - 0x10381787, - 0x103897a5, - 0x103917b4, - 0x103997d0, - 0x103a17eb, - 0x103a97fa, - 0x103b1816, - 0x103b9831, - 0x103c1857, + 0x10359711, + 0x1036173b, + 0x1036974e, + 0x1037176d, + 0x10379786, + 0x1038179b, + 0x103897b9, + 0x103917c8, + 0x103997e4, + 0x103a17ff, + 0x103a980e, + 0x103b182a, + 0x103b9845, + 0x103c186b, 0x103c80f7, - 0x103d1868, - 0x103d987c, - 0x103e189b, - 0x103e98aa, - 0x103f18c1, - 0x103f98d4, + 0x103d187c, + 0x103d9890, + 0x103e18af, + 0x103e98be, + 0x103f18d5, + 0x103f98e8, 0x10400ce3, - 0x104098e7, - 0x10411905, - 0x10419918, - 0x10421932, - 0x10429942, - 0x10431956, - 0x1043996c, - 0x10441984, - 0x10449999, - 0x104519ad, - 0x104599bf, + 0x104098fb, + 0x10411919, + 0x1041992c, + 0x10421946, + 0x10429956, + 0x1043196a, + 0x10439980, + 0x10441998, + 0x104499ad, + 0x104519c1, + 0x104599d3, 0x10460635, 0x1046899a, - 0x104719d4, - 0x104799eb, - 0x10481a00, - 0x10489a0e, + 0x104719e8, + 0x104799ff, + 0x10481a14, + 0x10489a22, 0x10490f1f, - 0x10499848, - 0x104a1712, + 0x1049985c, + 0x104a1726, 0x14320cb3, 0x14328cd4, 0x14330ce3, @@ -139,57 +139,58 @@ const uint32_t kOpenSSLReasonValues[] = { 0x1833903f, 0x18341053, 0x183480f7, - 0x18351072, - 0x1835908a, - 0x183610b2, - 0x183690c6, - 0x183710fe, - 0x18379114, - 0x18381128, - 0x18389138, + 0x183510ae, + 0x18359072, + 0x1836109a, + 0x183690c1, + 0x183710f9, + 0x1837910f, + 0x18381123, + 0x18389133, 0x18390ac0, - 0x18399148, - 0x183a116e, - 0x183a9194, + 0x18399143, + 0x183a1169, + 0x183a918f, 0x183b0d2b, - 0x183b91e3, - 0x183c11f5, - 0x183c9200, - 0x183d1210, - 0x183d9221, - 0x183e1232, - 0x183e9244, - 0x183f126d, - 0x183f9286, - 0x1840129e, + 0x183b91de, + 0x183c11f0, + 0x183c91fb, + 0x183d120b, + 0x183d921c, + 0x183e122d, + 0x183e923f, + 0x183f1268, + 0x183f929a, + 0x184012b2, 0x1840870d, - 0x184111b7, - 0x18419182, - 0x184211a1, + 0x184111b2, + 0x1841917d, + 0x1842119c, 0x18428cc1, - 0x1843115d, - 0x184391c9, + 0x18431158, + 0x184391c4, 0x18441068, - 0x184490ea, - 0x1845109f, - 0x203212d8, - 0x203292c5, - 0x243212e4, + 0x184490e5, + 0x18451087, + 0x18459281, + 0x203212ec, + 0x203292d9, + 0x243212f8, 0x243289e0, - 0x243312f6, - 0x24339303, - 0x24341310, - 0x24349322, - 0x24351331, - 0x2435934e, - 0x2436135b, - 0x24369369, - 0x24371377, - 0x24379385, - 0x2438138e, - 0x2438939b, - 0x243913ae, - 0x243993c5, + 0x2433130a, + 0x24339317, + 0x24341324, + 0x24349336, + 0x24351345, + 0x24359362, + 0x2436136f, + 0x2436937d, + 0x2437138b, + 0x24379399, + 0x243813a2, + 0x243893af, + 0x243913c2, + 0x243993d9, 0x28320d13, 0x28328d2b, 0x28330ce3, @@ -199,51 +200,51 @@ const uint32_t kOpenSSLReasonValues[] = { 0x283500f7, 0x28358cc1, 0x2836099a, - 0x2c3233f9, - 0x2c3293e3, - 0x2c333407, - 0x2c33b419, - 0x2c34342d, - 0x2c34b43f, - 0x2c35345a, - 0x2c35b46c, - 0x2c36349c, + 0x2c32341d, + 0x2c3293f7, + 0x2c33342b, + 0x2c33b43d, + 0x2c343451, + 0x2c34b463, + 0x2c35347e, + 0x2c35b490, + 0x2c3634c0, 0x2c36833a, - 0x2c3734a9, - 0x2c37b4d5, - 0x2c383513, - 0x2c38b52a, - 0x2c393548, - 0x2c39b558, - 0x2c3a356a, - 0x2c3ab57e, - 0x2c3b358f, - 0x2c3bb5ae, - 0x2c3c13f5, - 0x2c3c940b, - 0x2c3d35f3, - 0x2c3d9424, - 0x2c3e361d, - 0x2c3eb62b, - 0x2c3f3643, - 0x2c3fb65b, - 0x2c403685, - 0x2c4092d8, - 0x2c413696, - 0x2c41b6a9, - 0x2c42129e, - 0x2c42b6ba, + 0x2c3734cd, + 0x2c37b4f9, + 0x2c383537, + 0x2c38b54e, + 0x2c39356c, + 0x2c39b57c, + 0x2c3a358e, + 0x2c3ab5a2, + 0x2c3b35b3, + 0x2c3bb5d2, + 0x2c3c1409, + 0x2c3c941f, + 0x2c3d3617, + 0x2c3d9438, + 0x2c3e3641, + 0x2c3eb64f, + 0x2c3f3667, + 0x2c3fb67f, + 0x2c4036a9, + 0x2c4092ec, + 0x2c4136ba, + 0x2c41b6cd, + 0x2c4212b2, + 0x2c42b6de, 0x2c43076d, - 0x2c43b5a0, - 0x2c4434e8, - 0x2c44b668, - 0x2c45347f, - 0x2c45b4bb, - 0x2c463538, - 0x2c46b5c2, - 0x2c4735d7, - 0x2c47b610, - 0x2c4834fa, + 0x2c43b5c4, + 0x2c44350c, + 0x2c44b68c, + 0x2c4534a3, + 0x2c45b4df, + 0x2c46355c, + 0x2c46b5e6, + 0x2c4735fb, + 0x2c47b634, + 0x2c48351e, 0x30320000, 0x30328015, 0x3033001f, @@ -383,268 +384,269 @@ const uint32_t kOpenSSLReasonValues[] = { 0x3c418e13, 0x3c420f1f, 0x3c428ea9, - 0x40321a7a, - 0x40329a90, - 0x40331abe, - 0x40339ac8, - 0x40341adf, - 0x40349afd, - 0x40351b0d, - 0x40359b1f, - 0x40361b2c, - 0x40369b38, - 0x40371b4d, - 0x40379b5f, - 0x40381b6a, - 0x40389b7c, + 0x40321a8e, + 0x40329aa4, + 0x40331ad2, + 0x40339adc, + 0x40341af3, + 0x40349b11, + 0x40351b21, + 0x40359b33, + 0x40361b40, + 0x40369b4c, + 0x40371b61, + 0x40379b73, + 0x40381b7e, + 0x40389b90, 0x40390fd3, - 0x40399b8c, - 0x403a1b9f, - 0x403a9bc0, - 0x403b1bd1, - 0x403b9be1, + 0x40399ba0, + 0x403a1bb3, + 0x403a9bd4, + 0x403b1be5, + 0x403b9bf5, 0x403c0071, 0x403c8090, - 0x403d1c42, - 0x403d9c58, - 0x403e1c67, - 0x403e9c9f, - 0x403f1cb9, - 0x403f9ce1, - 0x40401cf6, - 0x40409d0a, - 0x40411d45, - 0x40419d60, - 0x40421d79, - 0x40429d8c, - 0x40431da0, - 0x40439dce, - 0x40441de5, + 0x403d1c56, + 0x403d9c6c, + 0x403e1c7b, + 0x403e9cb3, + 0x403f1ccd, + 0x403f9cf5, + 0x40401d0a, + 0x40409d1e, + 0x40411d59, + 0x40419d74, + 0x40421d8d, + 0x40429da0, + 0x40431db4, + 0x40439de2, + 0x40441df9, 0x404480b9, - 0x40451dfa, - 0x40459e0c, - 0x40461e30, - 0x40469e50, - 0x40471e5e, - 0x40479e85, - 0x40481ef6, - 0x40489fb0, - 0x40491fc7, - 0x40499fe1, - 0x404a1ff8, - 0x404aa016, - 0x404b202e, - 0x404ba05b, - 0x404c2071, - 0x404ca083, - 0x404d20a4, - 0x404da0dd, - 0x404e20f1, - 0x404ea0fe, - 0x404f21af, - 0x404fa225, - 0x405022af, - 0x4050a2c3, - 0x405122f6, - 0x40522306, - 0x4052a32a, - 0x40532342, - 0x4053a355, - 0x4054236a, - 0x4054a38d, - 0x405523b8, - 0x4055a3f5, - 0x4056241a, - 0x4056a433, - 0x4057244b, - 0x4057a45e, - 0x40582473, - 0x4058a49a, - 0x405924c9, - 0x4059a509, - 0x405aa51d, - 0x405b2535, - 0x405ba546, - 0x405c2559, - 0x405ca598, - 0x405d25a5, - 0x405da5ca, - 0x405e2608, + 0x40451e0e, + 0x40459e20, + 0x40461e44, + 0x40469e64, + 0x40471e72, + 0x40479e99, + 0x40481f1a, + 0x40489fd4, + 0x40491feb, + 0x4049a005, + 0x404a201c, + 0x404aa03a, + 0x404b2052, + 0x404ba07f, + 0x404c2095, + 0x404ca0a7, + 0x404d20c8, + 0x404da101, + 0x404e2115, + 0x404ea122, + 0x404f21f5, + 0x404fa26b, + 0x405022f5, + 0x4050a309, + 0x40512356, + 0x40522366, + 0x4052a38a, + 0x405323a2, + 0x4053a3b5, + 0x405423ca, + 0x4054a3ed, + 0x40552418, + 0x4055a455, + 0x4056247a, + 0x4056a493, + 0x405724ab, + 0x4057a4be, + 0x405824d3, + 0x4058a4fa, + 0x40592529, + 0x4059a569, + 0x405aa57d, + 0x405b2595, + 0x405ba5a6, + 0x405c25b9, + 0x405ca5f8, + 0x405d2605, + 0x405da62a, + 0x405e2668, 0x405e8afe, - 0x405f2657, - 0x405fa664, - 0x40602672, - 0x4060a694, - 0x40612708, - 0x4061a740, - 0x40622757, - 0x4062a768, - 0x406327b5, - 0x4063a7ca, - 0x406427e1, - 0x4064a80d, - 0x40652828, - 0x4065a83f, - 0x40662857, - 0x4066a881, - 0x406728ac, - 0x4067a8f1, - 0x40682939, - 0x4068a95a, - 0x4069298c, - 0x4069a9ba, - 0x406a29db, - 0x406aa9fb, - 0x406b2b83, - 0x406baba6, - 0x406c2bbc, - 0x406caec6, - 0x406d2ef5, - 0x406daf1d, - 0x406e2f4b, - 0x406eaf98, - 0x406f2ff1, - 0x406fb029, - 0x4070303c, - 0x4070b059, + 0x405f26b7, + 0x405fa6c4, + 0x406026d2, + 0x4060a6f4, + 0x40612768, + 0x4061a7a0, + 0x406227b7, + 0x4062a7c8, + 0x40632815, + 0x4063a82a, + 0x40642841, + 0x4064a86d, + 0x40652888, + 0x4065a89f, + 0x406628b7, + 0x4066a8e1, + 0x4067290c, + 0x4067a951, + 0x40682999, + 0x4068a9ba, + 0x406929ec, + 0x4069aa1a, + 0x406a2a3b, + 0x406aaa5b, + 0x406b2be3, + 0x406bac06, + 0x406c2c1c, + 0x406caf26, + 0x406d2f55, + 0x406daf7d, + 0x406e2fab, + 0x406eaff8, + 0x406f3051, + 0x406fb089, + 0x4070309c, + 0x4070b0b9, 0x4071084d, - 0x4071b06b, - 0x4072307e, - 0x4072b0b4, - 0x407330cc, - 0x4073960d, - 0x407430e0, - 0x4074b0fa, - 0x4075310b, - 0x4075b11f, - 0x4076312d, - 0x4076939b, - 0x40773152, - 0x4077b1ea, - 0x40783205, - 0x4078b23e, - 0x40793255, - 0x4079b26b, - 0x407a3297, - 0x407ab2aa, - 0x407b32bf, - 0x407bb2d1, - 0x407c3302, - 0x407cb30b, - 0x407d2975, - 0x407da24d, - 0x407e321a, - 0x407ea4aa, - 0x407f1e72, - 0x407fa045, - 0x408021bf, - 0x40809e9a, - 0x40812318, - 0x4081a14c, - 0x40822f36, - 0x40829bed, - 0x40832485, - 0x4083a7f2, - 0x40841eae, - 0x4084a4e2, - 0x4085256a, - 0x4085a6cf, - 0x408625ea, - 0x4086a267, - 0x40872f7c, - 0x4087a71d, - 0x40881c2b, - 0x4088a904, - 0x40891c7a, - 0x40899c07, - 0x408a2bf4, - 0x408a9a25, - 0x408b32e6, - 0x408bb006, - 0x408c257a, - 0x408d1f96, - 0x408d9ee0, - 0x408e20c6, - 0x408ea3d5, - 0x408f2918, - 0x408fa6eb, - 0x409028cd, - 0x4090a5bc, - 0x40912bdc, - 0x40919a5d, - 0x40921cc7, - 0x4092afb7, - 0x40933097, - 0x4093a278, - 0x40941ec2, - 0x4094ac0d, - 0x40952779, - 0x4095b277, - 0x40962f63, - 0x4096a1d8, - 0x409722de, - 0x4097a115, - 0x40981d27, - 0x4098a78d, - 0x40992fd3, - 0x4099a402, - 0x409a239b, - 0x409a9a41, - 0x409b1f1c, - 0x409b9f47, - 0x409c31cc, - 0x409c9f6f, - 0x409d2194, - 0x409da162, - 0x409e1db8, - 0x409ea20d, - 0x409f21f5, - 0x409f9f0f, - 0x40a02235, - 0x40a0a12f, - 0x40a1217d, - 0x40a1a4f6, - 0x40a22294, - 0x40a2a648, - 0x40a326bc, - 0x40a3b174, - 0x40a43190, - 0x40a4b1aa, - 0x41f42aae, - 0x41f92b40, - 0x41fe2a33, - 0x41feace9, - 0x41ff2e17, - 0x42032ac7, - 0x42082ae9, - 0x4208ab25, - 0x42092a17, - 0x4209ab5f, - 0x420a2a6e, - 0x420aaa4e, - 0x420b2a8e, - 0x420bab07, - 0x420c2e33, - 0x420cac1d, - 0x420d2cd0, - 0x420dad07, - 0x42122d3a, - 0x42172dfa, - 0x4217ad7c, - 0x421c2d9e, - 0x421f2d59, - 0x42212eab, - 0x42262ddd, - 0x422b2e89, - 0x422bacab, - 0x422c2e6b, - 0x422cac5e, - 0x422d2c37, - 0x422dae4a, - 0x422e2c8a, - 0x42302db9, - 0x4230ad21, - 0x42312629, + 0x4071b0cb, + 0x407230de, + 0x4072b114, + 0x4073312c, + 0x40739621, + 0x40743140, + 0x4074b15a, + 0x4075316b, + 0x4075b17f, + 0x4076318d, + 0x407693af, + 0x407731b2, + 0x4077b20e, + 0x40783229, + 0x4078b262, + 0x40793279, + 0x4079b28f, + 0x407a32bb, + 0x407ab2ce, + 0x407b32e3, + 0x407bb2f5, + 0x407c3326, + 0x407cb32f, + 0x407d29d5, + 0x407da293, + 0x407e323e, + 0x407ea50a, + 0x407f1e86, + 0x407fa069, + 0x40802205, + 0x40809eae, + 0x40812378, + 0x4081a170, + 0x40822f96, + 0x40829c01, + 0x408324e5, + 0x4083a852, + 0x40841ed2, + 0x4084a542, + 0x408525ca, + 0x4085a72f, + 0x4086264a, + 0x4086a2ad, + 0x40872fdc, + 0x4087a77d, + 0x40881c3f, + 0x4088a964, + 0x40891c8e, + 0x40899c1b, + 0x408a2c54, + 0x408a9a39, + 0x408b330a, + 0x408bb066, + 0x408c25da, + 0x408d1fba, + 0x408d9f04, + 0x408e20ea, + 0x408ea435, + 0x408f2978, + 0x408fa74b, + 0x4090292d, + 0x4090a61c, + 0x40912c3c, + 0x40919a71, + 0x40921cdb, + 0x4092b017, + 0x409330f7, + 0x4093a2be, + 0x40941ee6, + 0x4094ac6d, + 0x409527d9, + 0x4095b29b, + 0x40962fc3, + 0x4096a21e, + 0x4097233e, + 0x4097a139, + 0x40981d3b, + 0x4098a7ed, + 0x40993033, + 0x4099a462, + 0x409a23fb, + 0x409a9a55, + 0x409b1f40, + 0x409b9f6b, + 0x409c31f0, + 0x409c9f93, + 0x409d21da, + 0x409da186, + 0x409e1dcc, + 0x409ea253, + 0x409f223b, + 0x409f9f33, + 0x40a0227b, + 0x40a0a153, + 0x40a121a1, + 0x40a1a556, + 0x40a222da, + 0x40a2a6a8, + 0x40a3271c, + 0x40a3b1d4, + 0x40a42324, + 0x40a4a1b8, + 0x40a51ec2, + 0x41f42b0e, + 0x41f92ba0, + 0x41fe2a93, + 0x41fead49, + 0x41ff2e77, + 0x42032b27, + 0x42082b49, + 0x4208ab85, + 0x42092a77, + 0x4209abbf, + 0x420a2ace, + 0x420aaaae, + 0x420b2aee, + 0x420bab67, + 0x420c2e93, + 0x420cac7d, + 0x420d2d30, + 0x420dad67, + 0x42122d9a, + 0x42172e5a, + 0x4217addc, + 0x421c2dfe, + 0x421f2db9, + 0x42212f0b, + 0x42262e3d, + 0x422b2ee9, + 0x422bad0b, + 0x422c2ecb, + 0x422cacbe, + 0x422d2c97, + 0x422daeaa, + 0x422e2cea, + 0x42302e19, + 0x4230ad81, + 0x42312689, 0x44320778, 0x44328787, 0x44330793, @@ -662,109 +664,109 @@ const uint32_t kOpenSSLReasonValues[] = { 0x4439084d, 0x4439885b, 0x443a086e, - 0x483213e3, - 0x483293f5, - 0x4833140b, - 0x48339424, - 0x4c321461, - 0x4c329471, - 0x4c331484, - 0x4c3394a4, + 0x483213f7, + 0x48329409, + 0x4833141f, + 0x48339438, + 0x4c321475, + 0x4c329485, + 0x4c331498, + 0x4c3394b8, 0x4c3400b9, 0x4c3480f7, - 0x4c3514b0, - 0x4c3594be, - 0x4c3614da, - 0x4c369500, - 0x4c37150f, - 0x4c37951d, - 0x4c381532, - 0x4c38953e, - 0x4c39155e, - 0x4c399588, - 0x4c3a15a1, - 0x4c3a95ba, + 0x4c3514c4, + 0x4c3594d2, + 0x4c3614ee, + 0x4c369514, + 0x4c371523, + 0x4c379531, + 0x4c381546, + 0x4c389552, + 0x4c391572, + 0x4c39959c, + 0x4c3a15b5, + 0x4c3a95ce, 0x4c3b0635, - 0x4c3b95d3, - 0x4c3c15e5, - 0x4c3c95f4, - 0x4c3d160d, + 0x4c3b95e7, + 0x4c3c15f9, + 0x4c3c9608, + 0x4c3d1621, 0x4c3d8d06, - 0x4c3e167a, - 0x4c3e961c, - 0x4c3f169c, - 0x4c3f939b, - 0x4c401632, - 0x4c40944d, - 0x4c41166a, - 0x4c4194ed, - 0x4c421656, - 0x4c429435, - 0x503236cc, - 0x5032b6db, - 0x503336e6, - 0x5033b6f6, - 0x5034370f, - 0x5034b729, - 0x50353737, - 0x5035b74d, - 0x5036375f, - 0x5036b775, - 0x5037378e, - 0x5037b7a1, - 0x503837b9, - 0x5038b7ca, - 0x503937df, - 0x5039b7f3, - 0x503a3813, - 0x503ab829, - 0x503b3841, - 0x503bb853, - 0x503c386f, - 0x503cb886, - 0x503d389f, - 0x503db8b5, - 0x503e38c2, - 0x503eb8d8, - 0x503f38ea, + 0x4c3e168e, + 0x4c3e9630, + 0x4c3f16b0, + 0x4c3f93af, + 0x4c401646, + 0x4c409461, + 0x4c41167e, + 0x4c419501, + 0x4c42166a, + 0x4c429449, + 0x503236f0, + 0x5032b6ff, + 0x5033370a, + 0x5033b71a, + 0x50343733, + 0x5034b74d, + 0x5035375b, + 0x5035b771, + 0x50363783, + 0x5036b799, + 0x503737b2, + 0x5037b7c5, + 0x503837dd, + 0x5038b7ee, + 0x50393803, + 0x5039b817, + 0x503a3837, + 0x503ab84d, + 0x503b3865, + 0x503bb877, + 0x503c3893, + 0x503cb8aa, + 0x503d38c3, + 0x503db8d9, + 0x503e38e6, + 0x503eb8fc, + 0x503f390e, 0x503f83b3, - 0x504038fd, - 0x5040b90d, - 0x50413927, - 0x5041b936, - 0x50423950, - 0x5042b96d, - 0x5043397d, - 0x5043b98d, - 0x504439aa, + 0x50403921, + 0x5040b931, + 0x5041394b, + 0x5041b95a, + 0x50423974, + 0x5042b991, + 0x504339a1, + 0x5043b9b1, + 0x504439ce, 0x50448469, - 0x504539be, - 0x5045b9dc, - 0x504639ef, - 0x5046ba05, - 0x50473a17, - 0x5047ba2c, - 0x50483a52, - 0x5048ba60, - 0x50493a73, - 0x5049ba88, - 0x504a3a9e, - 0x504abaae, - 0x504b3ace, - 0x504bbae1, - 0x504c3b04, - 0x504cbb32, - 0x504d3b5f, - 0x504dbb7c, - 0x504e3b97, - 0x504ebbb3, - 0x504f3bc5, - 0x504fbbdc, - 0x50503beb, + 0x504539e2, + 0x5045ba00, + 0x50463a13, + 0x5046ba29, + 0x50473a3b, + 0x5047ba50, + 0x50483a76, + 0x5048ba84, + 0x50493a97, + 0x5049baac, + 0x504a3ac2, + 0x504abad2, + 0x504b3af2, + 0x504bbb05, + 0x504c3b28, + 0x504cbb56, + 0x504d3b83, + 0x504dbba0, + 0x504e3bbb, + 0x504ebbd7, + 0x504f3be9, + 0x504fbc00, + 0x50503c0f, 0x50508729, - 0x50513bfe, - 0x5051b99c, - 0x50523b44, + 0x50513c22, + 0x5051b9c0, + 0x50523b68, 0x58321011, 0x68320fd3, 0x68328d2b, @@ -806,22 +808,22 @@ const uint32_t kOpenSSLReasonValues[] = { 0x783d8b97, 0x783e0aed, 0x783e8a9f, - 0x7c3212b4, - 0x80321500, + 0x7c3212c8, + 0x80321514, 0x80328090, - 0x803333c8, + 0x803333ec, 0x803380b9, - 0x803433d7, - 0x8034b33f, - 0x8035335d, - 0x8035b3eb, - 0x8036339f, - 0x8036b34e, - 0x80373391, - 0x8037b32c, - 0x803833b2, - 0x8038b36e, - 0x80393383, + 0x803433fb, + 0x8034b363, + 0x80353381, + 0x8035b40f, + 0x803633c3, + 0x8036b372, + 0x803733b5, + 0x8037b350, + 0x803833d6, + 0x8038b392, + 0x803933a7, 0x84320bb0, 0x84328bc9, }; @@ -1049,10 +1051,10 @@ const char kOpenSSLReasonStringData[] = "DIFFERENT_KEY_TYPES\0" "DIFFERENT_PARAMETERS\0" "EMPTY_PSK\0" - "EXPECTING_AN_EC_KEY_KEY\0" "EXPECTING_AN_RSA_KEY\0" "EXPECTING_A_DH_KEY\0" "EXPECTING_A_DSA_KEY\0" + "EXPECTING_A_EC_KEY\0" "ILLEGAL_OR_UNSUPPORTED_PADDING_MODE\0" "INVALID_BUFFER_SIZE\0" "INVALID_DIGEST_LENGTH\0" @@ -1075,6 +1077,7 @@ const char kOpenSSLReasonStringData[] = "NO_PARAMETERS_SET\0" "OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE\0" "OPERATON_NOT_INITIALIZED\0" + "PRIVATE_KEY_WAS_NOT_SEED\0" "UNKNOWN_PUBLIC_KEY_TYPE\0" "UNSUPPORTED_ALGORITHM\0" "OUTPUT_TOO_LARGE\0" @@ -1221,6 +1224,7 @@ const char kOpenSSLReasonStringData[] = "DOWNGRADE_DETECTED\0" "DTLS_MESSAGE_TOO_BIG\0" "DUPLICATE_EXTENSION\0" + "DUPLICATE_GROUP\0" "DUPLICATE_KEY_SHARE\0" "DUPLICATE_SIGNATURE_ALGORITHM\0" "EARLY_DATA_NOT_IN_USE\0" @@ -1250,6 +1254,7 @@ const char kOpenSSLReasonStringData[] = "INVALID_ALPN_PROTOCOL\0" "INVALID_ALPN_PROTOCOL_LIST\0" "INVALID_ALPS_CODEPOINT\0" + "INVALID_CERTIFICATE_PROPERTY_LIST\0" "INVALID_CLIENT_HELLO_INNER\0" "INVALID_COMMAND\0" "INVALID_COMPRESSION_LIST\0" @@ -1264,6 +1269,7 @@ const char kOpenSSLReasonStringData[] = "INVALID_SPAKE2PLUSV1_VALUE\0" "INVALID_SSL_SESSION\0" "INVALID_TICKET_KEYS_LENGTH\0" + "INVALID_TRUST_ANCHOR_LIST\0" "KEY_USAGE_BIT_INCORRECT\0" "LENGTH_MISMATCH\0" "MISSING_EXTENSION\0" @@ -1406,8 +1412,6 @@ const char kOpenSSLReasonStringData[] = "UNSAFE_LEGACY_RENEGOTIATION_DISABLED\0" "UNSUPPORTED_COMPRESSION_ALGORITHM\0" "UNSUPPORTED_CREDENTIAL_LIST\0" - "INVALID_TRUST_ANCHOR_LIST\0" - "INVALID_CERTIFICATE_PROPERTY_LIST\0" "UNSUPPORTED_ECH_SERVER_CONFIG\0" "UNSUPPORTED_ELLIPTIC_CURVE\0" "UNSUPPORTED_PROTOCOL\0" diff --git a/naiveproxy/src/third_party/boringssl/src/gen/sources.bzl b/naiveproxy/src/third_party/boringssl/src/gen/sources.bzl index dc70c3f1ad..f7f8f3ff3b 100644 --- a/naiveproxy/src/third_party/boringssl/src/gen/sources.bzl +++ b/naiveproxy/src/third_party/boringssl/src/gen/sources.bzl @@ -75,6 +75,8 @@ bcm_internal_headers = [ "crypto/fipsmodule/ec/wnaf.cc.inc", "crypto/fipsmodule/ecdh/ecdh.cc.inc", "crypto/fipsmodule/ecdsa/ecdsa.cc.inc", + "crypto/fipsmodule/entropy/jitter.cc.inc", + "crypto/fipsmodule/entropy/sha512.cc.inc", "crypto/fipsmodule/hkdf/hkdf.cc.inc", "crypto/fipsmodule/hmac/hmac.cc.inc", "crypto/fipsmodule/keccak/keccak.cc.inc", @@ -358,17 +360,13 @@ crypto_sources = [ "crypto/evp/evp_asn1.cc", "crypto/evp/evp_ctx.cc", "crypto/evp/p_dh.cc", - "crypto/evp/p_dh_asn1.cc", - "crypto/evp/p_dsa_asn1.cc", + "crypto/evp/p_dsa.cc", "crypto/evp/p_ec.cc", - "crypto/evp/p_ec_asn1.cc", "crypto/evp/p_ed25519.cc", - "crypto/evp/p_ed25519_asn1.cc", "crypto/evp/p_hkdf.cc", + "crypto/evp/p_mldsa.cc", "crypto/evp/p_rsa.cc", - "crypto/evp/p_rsa_asn1.cc", "crypto/evp/p_x25519.cc", - "crypto/evp/p_x25519_asn1.cc", "crypto/evp/pbkdf.cc", "crypto/evp/print.cc", "crypto/evp/scrypt.cc", @@ -501,7 +499,6 @@ crypto_sources = [ "crypto/x509/x_req.cc", "crypto/x509/x_sig.cc", "crypto/x509/x_spki.cc", - "crypto/x509/x_val.cc", "crypto/x509/x_x509.cc", "crypto/x509/x_x509a.cc", "crypto/xwing/xwing.cc", @@ -518,7 +515,6 @@ crypto_headers = [ "include/openssl/asn1t.h", "include/openssl/base.h", "include/openssl/base64.h", - "include/openssl/bcm_public.h", "include/openssl/bio.h", "include/openssl/blake2.h", "include/openssl/blowfish.h", @@ -550,7 +546,6 @@ crypto_headers = [ "include/openssl/evp.h", "include/openssl/evp_errors.h", "include/openssl/ex_data.h", - "include/openssl/experimental/kyber.h", "include/openssl/hkdf.h", "include/openssl/hmac.h", "include/openssl/hpke.h", @@ -632,6 +627,7 @@ crypto_internal_headers = [ "crypto/fipsmodule/ec/p256-nistz.h", "crypto/fipsmodule/ec/p256_table.h", "crypto/fipsmodule/ecdsa/internal.h", + "crypto/fipsmodule/entropy/internal.h", "crypto/fipsmodule/keccak/internal.h", "crypto/fipsmodule/rand/internal.h", "crypto/fipsmodule/rsa/internal.h", @@ -751,6 +747,7 @@ crypto_test_sources = [ "crypto/fipsmodule/ec/p256-nistz_test.cc", "crypto/fipsmodule/ec/p256_test.cc", "crypto/fipsmodule/ecdsa/ecdsa_test.cc", + "crypto/fipsmodule/entropy/jitter_test.cc", "crypto/fipsmodule/hkdf/hkdf_test.cc", "crypto/fipsmodule/keccak/keccak_test.cc", "crypto/fipsmodule/rand/ctrdrbg_test.cc", @@ -830,8 +827,14 @@ crypto_test_data = [ "crypto/cipher/test/xchacha20_poly1305_tests.txt", "crypto/curve25519/ed25519_tests.txt", "crypto/ecdh/ecdh_tests.txt", - "crypto/evp/evp_tests.txt", - "crypto/evp/scrypt_tests.txt", + "crypto/evp/test/dh_tests.txt", + "crypto/evp/test/ec_tests.txt", + "crypto/evp/test/ed25519_tests.txt", + "crypto/evp/test/evp_tests.txt", + "crypto/evp/test/mldsa_tests.txt", + "crypto/evp/test/rsa_tests.txt", + "crypto/evp/test/scrypt_tests.txt", + "crypto/evp/test/x25519_tests.txt", "crypto/fipsmodule/aes/aes_tests.txt", "crypto/fipsmodule/bn/test/exp_tests.txt", "crypto/fipsmodule/bn/test/gcd_tests.txt", @@ -853,6 +856,7 @@ crypto_test_data = [ "crypto/fipsmodule/ecdsa/ecdsa_sign_tests.txt", "crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt", "crypto/fipsmodule/keccak/keccak_tests.txt", + "crypto/fipsmodule/rand/ctrdrbg_df_vectors.txt", "crypto/fipsmodule/rand/ctrdrbg_vectors.txt", "crypto/hmac/hmac_tests.txt", "crypto/hpke/hpke_test_vectors.txt", @@ -986,6 +990,7 @@ crypto_test_data = [ "crypto/x509/test/pss_sha256_wrong_trailer.pem", "crypto/x509/test/pss_sha384.pem", "crypto/x509/test/pss_sha512.pem", + "crypto/x509/test/rsa_pss_sha256_key.pk8", "crypto/x509/test/some_names1.pem", "crypto/x509/test/some_names2.pem", "crypto/x509/test/some_names3.pem", @@ -996,13 +1001,32 @@ crypto_test_data = [ "crypto/x509/test/trailing_data_leaf_name_constraints.pem", "crypto/x509/test/trailing_data_leaf_subject_alt_name.pem", "crypto/x509/test/trailing_data_leaf_subject_key_identifier.pem", + "crypto/x509/test/unusual_tbs_critical_ber.pem", + "crypto/x509/test/unusual_tbs_critical_false_not_omitted.pem", + "crypto/x509/test/unusual_tbs_empty_extension_not_omitted.pem", + "crypto/x509/test/unusual_tbs_key.pem", + "crypto/x509/test/unusual_tbs_null_sigalg_param.pem", + "crypto/x509/test/unusual_tbs_uid_both.pem", + "crypto/x509/test/unusual_tbs_uid_issuer.pem", + "crypto/x509/test/unusual_tbs_uid_subject.pem", + "crypto/x509/test/unusual_tbs_v1_not_omitted.pem", + "crypto/x509/test/unusual_tbs_wrong_attribute_order.pem", "third_party/wycheproof_testvectors/aes_cbc_pkcs5_test.txt", "third_party/wycheproof_testvectors/aes_cmac_test.txt", "third_party/wycheproof_testvectors/aes_eax_test.txt", "third_party/wycheproof_testvectors/aes_gcm_siv_test.txt", "third_party/wycheproof_testvectors/aes_gcm_test.txt", + "third_party/wycheproof_testvectors/aes_kwp_test.txt", + "third_party/wycheproof_testvectors/aes_wrap_test.txt", "third_party/wycheproof_testvectors/chacha20_poly1305_test.txt", - "third_party/wycheproof_testvectors/dsa_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_224_sha224_p1363_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_224_sha224_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_224_sha256_p1363_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_224_sha256_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_256_sha256_p1363_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_256_sha256_test.txt", + "third_party/wycheproof_testvectors/dsa_3072_256_sha256_p1363_test.txt", + "third_party/wycheproof_testvectors/dsa_3072_256_sha256_test.txt", "third_party/wycheproof_testvectors/ecdh_secp224r1_test.txt", "third_party/wycheproof_testvectors/ecdh_secp256r1_test.txt", "third_party/wycheproof_testvectors/ecdh_secp384r1_test.txt", @@ -1023,7 +1047,7 @@ crypto_test_data = [ "third_party/wycheproof_testvectors/ecdsa_secp384r1_sha512_test.txt", "third_party/wycheproof_testvectors/ecdsa_secp521r1_sha512_p1363_test.txt", "third_party/wycheproof_testvectors/ecdsa_secp521r1_sha512_test.txt", - "third_party/wycheproof_testvectors/eddsa_test.txt", + "third_party/wycheproof_testvectors/ed25519_test.txt", "third_party/wycheproof_testvectors/hkdf_sha1_test.txt", "third_party/wycheproof_testvectors/hkdf_sha256_test.txt", "third_party/wycheproof_testvectors/hkdf_sha384_test.txt", @@ -1033,14 +1057,12 @@ crypto_test_data = [ "third_party/wycheproof_testvectors/hmac_sha256_test.txt", "third_party/wycheproof_testvectors/hmac_sha384_test.txt", "third_party/wycheproof_testvectors/hmac_sha512_test.txt", - "third_party/wycheproof_testvectors/kw_test.txt", - "third_party/wycheproof_testvectors/kwp_test.txt", - "third_party/wycheproof_testvectors/mldsa_44_standard_sign_test.txt", - "third_party/wycheproof_testvectors/mldsa_44_standard_verify_test.txt", - "third_party/wycheproof_testvectors/mldsa_65_standard_sign_test.txt", - "third_party/wycheproof_testvectors/mldsa_65_standard_verify_test.txt", - "third_party/wycheproof_testvectors/mldsa_87_standard_sign_test.txt", - "third_party/wycheproof_testvectors/mldsa_87_standard_verify_test.txt", + "third_party/wycheproof_testvectors/mldsa_44_sign_noseed_test.txt", + "third_party/wycheproof_testvectors/mldsa_44_verify_test.txt", + "third_party/wycheproof_testvectors/mldsa_65_sign_noseed_test.txt", + "third_party/wycheproof_testvectors/mldsa_65_verify_test.txt", + "third_party/wycheproof_testvectors/mldsa_87_sign_noseed_test.txt", + "third_party/wycheproof_testvectors/mldsa_87_verify_test.txt", "third_party/wycheproof_testvectors/primality_test.txt", "third_party/wycheproof_testvectors/rsa_oaep_2048_sha1_mgf1sha1_test.txt", "third_party/wycheproof_testvectors/rsa_oaep_2048_sha224_mgf1sha1_test.txt", @@ -1060,8 +1082,13 @@ crypto_test_data = [ "third_party/wycheproof_testvectors/rsa_oaep_4096_sha512_mgf1sha1_test.txt", "third_party/wycheproof_testvectors/rsa_oaep_4096_sha512_mgf1sha512_test.txt", "third_party/wycheproof_testvectors/rsa_oaep_misc_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_1024_sig_gen_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_1536_sig_gen_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_2048_sig_gen_test.txt", "third_party/wycheproof_testvectors/rsa_pkcs1_2048_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_3072_sig_gen_test.txt", "third_party/wycheproof_testvectors/rsa_pkcs1_3072_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_4096_sig_gen_test.txt", "third_party/wycheproof_testvectors/rsa_pkcs1_4096_test.txt", "third_party/wycheproof_testvectors/rsa_pss_2048_sha1_mgf1_20_test.txt", "third_party/wycheproof_testvectors/rsa_pss_2048_sha256_mgf1_0_test.txt", @@ -1070,7 +1097,6 @@ crypto_test_data = [ "third_party/wycheproof_testvectors/rsa_pss_4096_sha256_mgf1_32_test.txt", "third_party/wycheproof_testvectors/rsa_pss_4096_sha512_mgf1_32_test.txt", "third_party/wycheproof_testvectors/rsa_pss_misc_test.txt", - "third_party/wycheproof_testvectors/rsa_sig_gen_misc_test.txt", "third_party/wycheproof_testvectors/rsa_signature_2048_sha224_test.txt", "third_party/wycheproof_testvectors/rsa_signature_2048_sha256_test.txt", "third_party/wycheproof_testvectors/rsa_signature_2048_sha384_test.txt", @@ -1078,9 +1104,12 @@ crypto_test_data = [ "third_party/wycheproof_testvectors/rsa_signature_3072_sha256_test.txt", "third_party/wycheproof_testvectors/rsa_signature_3072_sha384_test.txt", "third_party/wycheproof_testvectors/rsa_signature_3072_sha512_test.txt", + "third_party/wycheproof_testvectors/rsa_signature_4096_sha256_test.txt", "third_party/wycheproof_testvectors/rsa_signature_4096_sha384_test.txt", "third_party/wycheproof_testvectors/rsa_signature_4096_sha512_test.txt", - "third_party/wycheproof_testvectors/rsa_signature_test.txt", + "third_party/wycheproof_testvectors/rsa_signature_8192_sha256_test.txt", + "third_party/wycheproof_testvectors/rsa_signature_8192_sha384_test.txt", + "third_party/wycheproof_testvectors/rsa_signature_8192_sha512_test.txt", "third_party/wycheproof_testvectors/x25519_test.txt", "third_party/wycheproof_testvectors/xchacha20_poly1305_test.txt", ] @@ -1121,6 +1150,16 @@ decrepit_test_sources = [ "decrepit/xts/xts_test.cc", ] +entropy_modulewrapper_sources = [ + "util/fipstools/acvp/entropy_modulewrapper/main.cc", + "util/fipstools/acvp/entropy_modulewrapper/modulewrapper.cc", + "util/fipstools/acvp/modulewrapper/proto.cc", +] + +entropy_modulewrapper_internal_headers = [ + "util/fipstools/acvp/modulewrapper/modulewrapper.h", +] + fuzz_sources = [ "fuzz/arm_cpuinfo.cc", "fuzz/bn_div.cc", @@ -1161,6 +1200,7 @@ fuzz_sources = [ modulewrapper_sources = [ "util/fipstools/acvp/modulewrapper/main.cc", "util/fipstools/acvp/modulewrapper/modulewrapper.cc", + "util/fipstools/acvp/modulewrapper/proto.cc", ] modulewrapper_internal_headers = [ @@ -2827,6 +2867,7 @@ ssl_test_sources = [ test_support_sources = [ "crypto/test/abi_test.cc", + "crypto/test/der_trailing_data.cc", "crypto/test/file_test.cc", "crypto/test/file_test_gtest.cc", "crypto/test/file_util.cc", @@ -2837,6 +2878,7 @@ test_support_sources = [ test_support_internal_headers = [ "crypto/test/abi_test.h", + "crypto/test/der_trailing_data.h", "crypto/test/file_test.h", "crypto/test/file_util.h", "crypto/test/gtest_main.h", diff --git a/naiveproxy/src/third_party/boringssl/src/gen/sources.cmake b/naiveproxy/src/third_party/boringssl/src/gen/sources.cmake index df53126ed1..dbac7a5090 100644 --- a/naiveproxy/src/third_party/boringssl/src/gen/sources.cmake +++ b/naiveproxy/src/third_party/boringssl/src/gen/sources.cmake @@ -79,6 +79,8 @@ set( crypto/fipsmodule/ec/wnaf.cc.inc crypto/fipsmodule/ecdh/ecdh.cc.inc crypto/fipsmodule/ecdsa/ecdsa.cc.inc + crypto/fipsmodule/entropy/jitter.cc.inc + crypto/fipsmodule/entropy/sha512.cc.inc crypto/fipsmodule/hkdf/hkdf.cc.inc crypto/fipsmodule/hmac/hmac.cc.inc crypto/fipsmodule/keccak/keccak.cc.inc @@ -372,17 +374,13 @@ set( crypto/evp/evp_asn1.cc crypto/evp/evp_ctx.cc crypto/evp/p_dh.cc - crypto/evp/p_dh_asn1.cc - crypto/evp/p_dsa_asn1.cc + crypto/evp/p_dsa.cc crypto/evp/p_ec.cc - crypto/evp/p_ec_asn1.cc crypto/evp/p_ed25519.cc - crypto/evp/p_ed25519_asn1.cc crypto/evp/p_hkdf.cc + crypto/evp/p_mldsa.cc crypto/evp/p_rsa.cc - crypto/evp/p_rsa_asn1.cc crypto/evp/p_x25519.cc - crypto/evp/p_x25519_asn1.cc crypto/evp/pbkdf.cc crypto/evp/print.cc crypto/evp/scrypt.cc @@ -515,7 +513,6 @@ set( crypto/x509/x_req.cc crypto/x509/x_sig.cc crypto/x509/x_spki.cc - crypto/x509/x_val.cc crypto/x509/x_x509.cc crypto/x509/x_x509a.cc crypto/xwing/xwing.cc @@ -534,7 +531,6 @@ set( include/openssl/asn1t.h include/openssl/base.h include/openssl/base64.h - include/openssl/bcm_public.h include/openssl/bio.h include/openssl/blake2.h include/openssl/blowfish.h @@ -566,7 +562,6 @@ set( include/openssl/evp.h include/openssl/evp_errors.h include/openssl/ex_data.h - include/openssl/experimental/kyber.h include/openssl/hkdf.h include/openssl/hmac.h include/openssl/hpke.h @@ -650,6 +645,7 @@ set( crypto/fipsmodule/ec/p256-nistz.h crypto/fipsmodule/ec/p256_table.h crypto/fipsmodule/ecdsa/internal.h + crypto/fipsmodule/entropy/internal.h crypto/fipsmodule/keccak/internal.h crypto/fipsmodule/rand/internal.h crypto/fipsmodule/rsa/internal.h @@ -775,6 +771,7 @@ set( crypto/fipsmodule/ec/p256-nistz_test.cc crypto/fipsmodule/ec/p256_test.cc crypto/fipsmodule/ecdsa/ecdsa_test.cc + crypto/fipsmodule/entropy/jitter_test.cc crypto/fipsmodule/hkdf/hkdf_test.cc crypto/fipsmodule/keccak/keccak_test.cc crypto/fipsmodule/rand/ctrdrbg_test.cc @@ -856,8 +853,14 @@ set( crypto/cipher/test/xchacha20_poly1305_tests.txt crypto/curve25519/ed25519_tests.txt crypto/ecdh/ecdh_tests.txt - crypto/evp/evp_tests.txt - crypto/evp/scrypt_tests.txt + crypto/evp/test/dh_tests.txt + crypto/evp/test/ec_tests.txt + crypto/evp/test/ed25519_tests.txt + crypto/evp/test/evp_tests.txt + crypto/evp/test/mldsa_tests.txt + crypto/evp/test/rsa_tests.txt + crypto/evp/test/scrypt_tests.txt + crypto/evp/test/x25519_tests.txt crypto/fipsmodule/aes/aes_tests.txt crypto/fipsmodule/bn/test/exp_tests.txt crypto/fipsmodule/bn/test/gcd_tests.txt @@ -879,6 +882,7 @@ set( crypto/fipsmodule/ecdsa/ecdsa_sign_tests.txt crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt crypto/fipsmodule/keccak/keccak_tests.txt + crypto/fipsmodule/rand/ctrdrbg_df_vectors.txt crypto/fipsmodule/rand/ctrdrbg_vectors.txt crypto/hmac/hmac_tests.txt crypto/hpke/hpke_test_vectors.txt @@ -1012,6 +1016,7 @@ set( crypto/x509/test/pss_sha256_wrong_trailer.pem crypto/x509/test/pss_sha384.pem crypto/x509/test/pss_sha512.pem + crypto/x509/test/rsa_pss_sha256_key.pk8 crypto/x509/test/some_names1.pem crypto/x509/test/some_names2.pem crypto/x509/test/some_names3.pem @@ -1022,13 +1027,32 @@ set( crypto/x509/test/trailing_data_leaf_name_constraints.pem crypto/x509/test/trailing_data_leaf_subject_alt_name.pem crypto/x509/test/trailing_data_leaf_subject_key_identifier.pem + crypto/x509/test/unusual_tbs_critical_ber.pem + crypto/x509/test/unusual_tbs_critical_false_not_omitted.pem + crypto/x509/test/unusual_tbs_empty_extension_not_omitted.pem + crypto/x509/test/unusual_tbs_key.pem + crypto/x509/test/unusual_tbs_null_sigalg_param.pem + crypto/x509/test/unusual_tbs_uid_both.pem + crypto/x509/test/unusual_tbs_uid_issuer.pem + crypto/x509/test/unusual_tbs_uid_subject.pem + crypto/x509/test/unusual_tbs_v1_not_omitted.pem + crypto/x509/test/unusual_tbs_wrong_attribute_order.pem third_party/wycheproof_testvectors/aes_cbc_pkcs5_test.txt third_party/wycheproof_testvectors/aes_cmac_test.txt third_party/wycheproof_testvectors/aes_eax_test.txt third_party/wycheproof_testvectors/aes_gcm_siv_test.txt third_party/wycheproof_testvectors/aes_gcm_test.txt + third_party/wycheproof_testvectors/aes_kwp_test.txt + third_party/wycheproof_testvectors/aes_wrap_test.txt third_party/wycheproof_testvectors/chacha20_poly1305_test.txt - third_party/wycheproof_testvectors/dsa_test.txt + third_party/wycheproof_testvectors/dsa_2048_224_sha224_p1363_test.txt + third_party/wycheproof_testvectors/dsa_2048_224_sha224_test.txt + third_party/wycheproof_testvectors/dsa_2048_224_sha256_p1363_test.txt + third_party/wycheproof_testvectors/dsa_2048_224_sha256_test.txt + third_party/wycheproof_testvectors/dsa_2048_256_sha256_p1363_test.txt + third_party/wycheproof_testvectors/dsa_2048_256_sha256_test.txt + third_party/wycheproof_testvectors/dsa_3072_256_sha256_p1363_test.txt + third_party/wycheproof_testvectors/dsa_3072_256_sha256_test.txt third_party/wycheproof_testvectors/ecdh_secp224r1_test.txt third_party/wycheproof_testvectors/ecdh_secp256r1_test.txt third_party/wycheproof_testvectors/ecdh_secp384r1_test.txt @@ -1049,7 +1073,7 @@ set( third_party/wycheproof_testvectors/ecdsa_secp384r1_sha512_test.txt third_party/wycheproof_testvectors/ecdsa_secp521r1_sha512_p1363_test.txt third_party/wycheproof_testvectors/ecdsa_secp521r1_sha512_test.txt - third_party/wycheproof_testvectors/eddsa_test.txt + third_party/wycheproof_testvectors/ed25519_test.txt third_party/wycheproof_testvectors/hkdf_sha1_test.txt third_party/wycheproof_testvectors/hkdf_sha256_test.txt third_party/wycheproof_testvectors/hkdf_sha384_test.txt @@ -1059,14 +1083,12 @@ set( third_party/wycheproof_testvectors/hmac_sha256_test.txt third_party/wycheproof_testvectors/hmac_sha384_test.txt third_party/wycheproof_testvectors/hmac_sha512_test.txt - third_party/wycheproof_testvectors/kw_test.txt - third_party/wycheproof_testvectors/kwp_test.txt - third_party/wycheproof_testvectors/mldsa_44_standard_sign_test.txt - third_party/wycheproof_testvectors/mldsa_44_standard_verify_test.txt - third_party/wycheproof_testvectors/mldsa_65_standard_sign_test.txt - third_party/wycheproof_testvectors/mldsa_65_standard_verify_test.txt - third_party/wycheproof_testvectors/mldsa_87_standard_sign_test.txt - third_party/wycheproof_testvectors/mldsa_87_standard_verify_test.txt + third_party/wycheproof_testvectors/mldsa_44_sign_noseed_test.txt + third_party/wycheproof_testvectors/mldsa_44_verify_test.txt + third_party/wycheproof_testvectors/mldsa_65_sign_noseed_test.txt + third_party/wycheproof_testvectors/mldsa_65_verify_test.txt + third_party/wycheproof_testvectors/mldsa_87_sign_noseed_test.txt + third_party/wycheproof_testvectors/mldsa_87_verify_test.txt third_party/wycheproof_testvectors/primality_test.txt third_party/wycheproof_testvectors/rsa_oaep_2048_sha1_mgf1sha1_test.txt third_party/wycheproof_testvectors/rsa_oaep_2048_sha224_mgf1sha1_test.txt @@ -1086,8 +1108,13 @@ set( third_party/wycheproof_testvectors/rsa_oaep_4096_sha512_mgf1sha1_test.txt third_party/wycheproof_testvectors/rsa_oaep_4096_sha512_mgf1sha512_test.txt third_party/wycheproof_testvectors/rsa_oaep_misc_test.txt + third_party/wycheproof_testvectors/rsa_pkcs1_1024_sig_gen_test.txt + third_party/wycheproof_testvectors/rsa_pkcs1_1536_sig_gen_test.txt + third_party/wycheproof_testvectors/rsa_pkcs1_2048_sig_gen_test.txt third_party/wycheproof_testvectors/rsa_pkcs1_2048_test.txt + third_party/wycheproof_testvectors/rsa_pkcs1_3072_sig_gen_test.txt third_party/wycheproof_testvectors/rsa_pkcs1_3072_test.txt + third_party/wycheproof_testvectors/rsa_pkcs1_4096_sig_gen_test.txt third_party/wycheproof_testvectors/rsa_pkcs1_4096_test.txt third_party/wycheproof_testvectors/rsa_pss_2048_sha1_mgf1_20_test.txt third_party/wycheproof_testvectors/rsa_pss_2048_sha256_mgf1_0_test.txt @@ -1096,7 +1123,6 @@ set( third_party/wycheproof_testvectors/rsa_pss_4096_sha256_mgf1_32_test.txt third_party/wycheproof_testvectors/rsa_pss_4096_sha512_mgf1_32_test.txt third_party/wycheproof_testvectors/rsa_pss_misc_test.txt - third_party/wycheproof_testvectors/rsa_sig_gen_misc_test.txt third_party/wycheproof_testvectors/rsa_signature_2048_sha224_test.txt third_party/wycheproof_testvectors/rsa_signature_2048_sha256_test.txt third_party/wycheproof_testvectors/rsa_signature_2048_sha384_test.txt @@ -1104,9 +1130,12 @@ set( third_party/wycheproof_testvectors/rsa_signature_3072_sha256_test.txt third_party/wycheproof_testvectors/rsa_signature_3072_sha384_test.txt third_party/wycheproof_testvectors/rsa_signature_3072_sha512_test.txt + third_party/wycheproof_testvectors/rsa_signature_4096_sha256_test.txt third_party/wycheproof_testvectors/rsa_signature_4096_sha384_test.txt third_party/wycheproof_testvectors/rsa_signature_4096_sha512_test.txt - third_party/wycheproof_testvectors/rsa_signature_test.txt + third_party/wycheproof_testvectors/rsa_signature_8192_sha256_test.txt + third_party/wycheproof_testvectors/rsa_signature_8192_sha384_test.txt + third_party/wycheproof_testvectors/rsa_signature_8192_sha512_test.txt third_party/wycheproof_testvectors/x25519_test.txt third_party/wycheproof_testvectors/xchacha20_poly1305_test.txt ) @@ -1153,6 +1182,20 @@ set( decrepit/xts/xts_test.cc ) +set( + ENTROPY_MODULEWRAPPER_SOURCES + + util/fipstools/acvp/entropy_modulewrapper/main.cc + util/fipstools/acvp/entropy_modulewrapper/modulewrapper.cc + util/fipstools/acvp/modulewrapper/proto.cc +) + +set( + ENTROPY_MODULEWRAPPER_INTERNAL_HEADERS + + util/fipstools/acvp/modulewrapper/modulewrapper.h +) + set( FUZZ_SOURCES @@ -1197,6 +1240,7 @@ set( util/fipstools/acvp/modulewrapper/main.cc util/fipstools/acvp/modulewrapper/modulewrapper.cc + util/fipstools/acvp/modulewrapper/proto.cc ) set( @@ -2889,6 +2933,7 @@ set( TEST_SUPPORT_SOURCES crypto/test/abi_test.cc + crypto/test/der_trailing_data.cc crypto/test/file_test.cc crypto/test/file_test_gtest.cc crypto/test/file_util.cc @@ -2901,6 +2946,7 @@ set( TEST_SUPPORT_INTERNAL_HEADERS crypto/test/abi_test.h + crypto/test/der_trailing_data.h crypto/test/file_test.h crypto/test/file_util.h crypto/test/gtest_main.h diff --git a/naiveproxy/src/third_party/boringssl/src/gen/sources.gni b/naiveproxy/src/third_party/boringssl/src/gen/sources.gni index c6d3ef1806..a7539266d5 100644 --- a/naiveproxy/src/third_party/boringssl/src/gen/sources.gni +++ b/naiveproxy/src/third_party/boringssl/src/gen/sources.gni @@ -75,6 +75,8 @@ bcm_internal_headers = [ "crypto/fipsmodule/ec/wnaf.cc.inc", "crypto/fipsmodule/ecdh/ecdh.cc.inc", "crypto/fipsmodule/ecdsa/ecdsa.cc.inc", + "crypto/fipsmodule/entropy/jitter.cc.inc", + "crypto/fipsmodule/entropy/sha512.cc.inc", "crypto/fipsmodule/hkdf/hkdf.cc.inc", "crypto/fipsmodule/hmac/hmac.cc.inc", "crypto/fipsmodule/keccak/keccak.cc.inc", @@ -358,17 +360,13 @@ crypto_sources = [ "crypto/evp/evp_asn1.cc", "crypto/evp/evp_ctx.cc", "crypto/evp/p_dh.cc", - "crypto/evp/p_dh_asn1.cc", - "crypto/evp/p_dsa_asn1.cc", + "crypto/evp/p_dsa.cc", "crypto/evp/p_ec.cc", - "crypto/evp/p_ec_asn1.cc", "crypto/evp/p_ed25519.cc", - "crypto/evp/p_ed25519_asn1.cc", "crypto/evp/p_hkdf.cc", + "crypto/evp/p_mldsa.cc", "crypto/evp/p_rsa.cc", - "crypto/evp/p_rsa_asn1.cc", "crypto/evp/p_x25519.cc", - "crypto/evp/p_x25519_asn1.cc", "crypto/evp/pbkdf.cc", "crypto/evp/print.cc", "crypto/evp/scrypt.cc", @@ -501,7 +499,6 @@ crypto_sources = [ "crypto/x509/x_req.cc", "crypto/x509/x_sig.cc", "crypto/x509/x_spki.cc", - "crypto/x509/x_val.cc", "crypto/x509/x_x509.cc", "crypto/x509/x_x509a.cc", "crypto/xwing/xwing.cc", @@ -518,7 +515,6 @@ crypto_headers = [ "include/openssl/asn1t.h", "include/openssl/base.h", "include/openssl/base64.h", - "include/openssl/bcm_public.h", "include/openssl/bio.h", "include/openssl/blake2.h", "include/openssl/blowfish.h", @@ -550,7 +546,6 @@ crypto_headers = [ "include/openssl/evp.h", "include/openssl/evp_errors.h", "include/openssl/ex_data.h", - "include/openssl/experimental/kyber.h", "include/openssl/hkdf.h", "include/openssl/hmac.h", "include/openssl/hpke.h", @@ -632,6 +627,7 @@ crypto_internal_headers = [ "crypto/fipsmodule/ec/p256-nistz.h", "crypto/fipsmodule/ec/p256_table.h", "crypto/fipsmodule/ecdsa/internal.h", + "crypto/fipsmodule/entropy/internal.h", "crypto/fipsmodule/keccak/internal.h", "crypto/fipsmodule/rand/internal.h", "crypto/fipsmodule/rsa/internal.h", @@ -751,6 +747,7 @@ crypto_test_sources = [ "crypto/fipsmodule/ec/p256-nistz_test.cc", "crypto/fipsmodule/ec/p256_test.cc", "crypto/fipsmodule/ecdsa/ecdsa_test.cc", + "crypto/fipsmodule/entropy/jitter_test.cc", "crypto/fipsmodule/hkdf/hkdf_test.cc", "crypto/fipsmodule/keccak/keccak_test.cc", "crypto/fipsmodule/rand/ctrdrbg_test.cc", @@ -830,8 +827,14 @@ crypto_test_data = [ "crypto/cipher/test/xchacha20_poly1305_tests.txt", "crypto/curve25519/ed25519_tests.txt", "crypto/ecdh/ecdh_tests.txt", - "crypto/evp/evp_tests.txt", - "crypto/evp/scrypt_tests.txt", + "crypto/evp/test/dh_tests.txt", + "crypto/evp/test/ec_tests.txt", + "crypto/evp/test/ed25519_tests.txt", + "crypto/evp/test/evp_tests.txt", + "crypto/evp/test/mldsa_tests.txt", + "crypto/evp/test/rsa_tests.txt", + "crypto/evp/test/scrypt_tests.txt", + "crypto/evp/test/x25519_tests.txt", "crypto/fipsmodule/aes/aes_tests.txt", "crypto/fipsmodule/bn/test/exp_tests.txt", "crypto/fipsmodule/bn/test/gcd_tests.txt", @@ -853,6 +856,7 @@ crypto_test_data = [ "crypto/fipsmodule/ecdsa/ecdsa_sign_tests.txt", "crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt", "crypto/fipsmodule/keccak/keccak_tests.txt", + "crypto/fipsmodule/rand/ctrdrbg_df_vectors.txt", "crypto/fipsmodule/rand/ctrdrbg_vectors.txt", "crypto/hmac/hmac_tests.txt", "crypto/hpke/hpke_test_vectors.txt", @@ -986,6 +990,7 @@ crypto_test_data = [ "crypto/x509/test/pss_sha256_wrong_trailer.pem", "crypto/x509/test/pss_sha384.pem", "crypto/x509/test/pss_sha512.pem", + "crypto/x509/test/rsa_pss_sha256_key.pk8", "crypto/x509/test/some_names1.pem", "crypto/x509/test/some_names2.pem", "crypto/x509/test/some_names3.pem", @@ -996,13 +1001,32 @@ crypto_test_data = [ "crypto/x509/test/trailing_data_leaf_name_constraints.pem", "crypto/x509/test/trailing_data_leaf_subject_alt_name.pem", "crypto/x509/test/trailing_data_leaf_subject_key_identifier.pem", + "crypto/x509/test/unusual_tbs_critical_ber.pem", + "crypto/x509/test/unusual_tbs_critical_false_not_omitted.pem", + "crypto/x509/test/unusual_tbs_empty_extension_not_omitted.pem", + "crypto/x509/test/unusual_tbs_key.pem", + "crypto/x509/test/unusual_tbs_null_sigalg_param.pem", + "crypto/x509/test/unusual_tbs_uid_both.pem", + "crypto/x509/test/unusual_tbs_uid_issuer.pem", + "crypto/x509/test/unusual_tbs_uid_subject.pem", + "crypto/x509/test/unusual_tbs_v1_not_omitted.pem", + "crypto/x509/test/unusual_tbs_wrong_attribute_order.pem", "third_party/wycheproof_testvectors/aes_cbc_pkcs5_test.txt", "third_party/wycheproof_testvectors/aes_cmac_test.txt", "third_party/wycheproof_testvectors/aes_eax_test.txt", "third_party/wycheproof_testvectors/aes_gcm_siv_test.txt", "third_party/wycheproof_testvectors/aes_gcm_test.txt", + "third_party/wycheproof_testvectors/aes_kwp_test.txt", + "third_party/wycheproof_testvectors/aes_wrap_test.txt", "third_party/wycheproof_testvectors/chacha20_poly1305_test.txt", - "third_party/wycheproof_testvectors/dsa_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_224_sha224_p1363_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_224_sha224_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_224_sha256_p1363_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_224_sha256_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_256_sha256_p1363_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_256_sha256_test.txt", + "third_party/wycheproof_testvectors/dsa_3072_256_sha256_p1363_test.txt", + "third_party/wycheproof_testvectors/dsa_3072_256_sha256_test.txt", "third_party/wycheproof_testvectors/ecdh_secp224r1_test.txt", "third_party/wycheproof_testvectors/ecdh_secp256r1_test.txt", "third_party/wycheproof_testvectors/ecdh_secp384r1_test.txt", @@ -1023,7 +1047,7 @@ crypto_test_data = [ "third_party/wycheproof_testvectors/ecdsa_secp384r1_sha512_test.txt", "third_party/wycheproof_testvectors/ecdsa_secp521r1_sha512_p1363_test.txt", "third_party/wycheproof_testvectors/ecdsa_secp521r1_sha512_test.txt", - "third_party/wycheproof_testvectors/eddsa_test.txt", + "third_party/wycheproof_testvectors/ed25519_test.txt", "third_party/wycheproof_testvectors/hkdf_sha1_test.txt", "third_party/wycheproof_testvectors/hkdf_sha256_test.txt", "third_party/wycheproof_testvectors/hkdf_sha384_test.txt", @@ -1033,14 +1057,12 @@ crypto_test_data = [ "third_party/wycheproof_testvectors/hmac_sha256_test.txt", "third_party/wycheproof_testvectors/hmac_sha384_test.txt", "third_party/wycheproof_testvectors/hmac_sha512_test.txt", - "third_party/wycheproof_testvectors/kw_test.txt", - "third_party/wycheproof_testvectors/kwp_test.txt", - "third_party/wycheproof_testvectors/mldsa_44_standard_sign_test.txt", - "third_party/wycheproof_testvectors/mldsa_44_standard_verify_test.txt", - "third_party/wycheproof_testvectors/mldsa_65_standard_sign_test.txt", - "third_party/wycheproof_testvectors/mldsa_65_standard_verify_test.txt", - "third_party/wycheproof_testvectors/mldsa_87_standard_sign_test.txt", - "third_party/wycheproof_testvectors/mldsa_87_standard_verify_test.txt", + "third_party/wycheproof_testvectors/mldsa_44_sign_noseed_test.txt", + "third_party/wycheproof_testvectors/mldsa_44_verify_test.txt", + "third_party/wycheproof_testvectors/mldsa_65_sign_noseed_test.txt", + "third_party/wycheproof_testvectors/mldsa_65_verify_test.txt", + "third_party/wycheproof_testvectors/mldsa_87_sign_noseed_test.txt", + "third_party/wycheproof_testvectors/mldsa_87_verify_test.txt", "third_party/wycheproof_testvectors/primality_test.txt", "third_party/wycheproof_testvectors/rsa_oaep_2048_sha1_mgf1sha1_test.txt", "third_party/wycheproof_testvectors/rsa_oaep_2048_sha224_mgf1sha1_test.txt", @@ -1060,8 +1082,13 @@ crypto_test_data = [ "third_party/wycheproof_testvectors/rsa_oaep_4096_sha512_mgf1sha1_test.txt", "third_party/wycheproof_testvectors/rsa_oaep_4096_sha512_mgf1sha512_test.txt", "third_party/wycheproof_testvectors/rsa_oaep_misc_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_1024_sig_gen_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_1536_sig_gen_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_2048_sig_gen_test.txt", "third_party/wycheproof_testvectors/rsa_pkcs1_2048_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_3072_sig_gen_test.txt", "third_party/wycheproof_testvectors/rsa_pkcs1_3072_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_4096_sig_gen_test.txt", "third_party/wycheproof_testvectors/rsa_pkcs1_4096_test.txt", "third_party/wycheproof_testvectors/rsa_pss_2048_sha1_mgf1_20_test.txt", "third_party/wycheproof_testvectors/rsa_pss_2048_sha256_mgf1_0_test.txt", @@ -1070,7 +1097,6 @@ crypto_test_data = [ "third_party/wycheproof_testvectors/rsa_pss_4096_sha256_mgf1_32_test.txt", "third_party/wycheproof_testvectors/rsa_pss_4096_sha512_mgf1_32_test.txt", "third_party/wycheproof_testvectors/rsa_pss_misc_test.txt", - "third_party/wycheproof_testvectors/rsa_sig_gen_misc_test.txt", "third_party/wycheproof_testvectors/rsa_signature_2048_sha224_test.txt", "third_party/wycheproof_testvectors/rsa_signature_2048_sha256_test.txt", "third_party/wycheproof_testvectors/rsa_signature_2048_sha384_test.txt", @@ -1078,9 +1104,12 @@ crypto_test_data = [ "third_party/wycheproof_testvectors/rsa_signature_3072_sha256_test.txt", "third_party/wycheproof_testvectors/rsa_signature_3072_sha384_test.txt", "third_party/wycheproof_testvectors/rsa_signature_3072_sha512_test.txt", + "third_party/wycheproof_testvectors/rsa_signature_4096_sha256_test.txt", "third_party/wycheproof_testvectors/rsa_signature_4096_sha384_test.txt", "third_party/wycheproof_testvectors/rsa_signature_4096_sha512_test.txt", - "third_party/wycheproof_testvectors/rsa_signature_test.txt", + "third_party/wycheproof_testvectors/rsa_signature_8192_sha256_test.txt", + "third_party/wycheproof_testvectors/rsa_signature_8192_sha384_test.txt", + "third_party/wycheproof_testvectors/rsa_signature_8192_sha512_test.txt", "third_party/wycheproof_testvectors/x25519_test.txt", "third_party/wycheproof_testvectors/xchacha20_poly1305_test.txt", ] @@ -1121,6 +1150,16 @@ decrepit_test_sources = [ "decrepit/xts/xts_test.cc", ] +entropy_modulewrapper_sources = [ + "util/fipstools/acvp/entropy_modulewrapper/main.cc", + "util/fipstools/acvp/entropy_modulewrapper/modulewrapper.cc", + "util/fipstools/acvp/modulewrapper/proto.cc", +] + +entropy_modulewrapper_internal_headers = [ + "util/fipstools/acvp/modulewrapper/modulewrapper.h", +] + fuzz_sources = [ "fuzz/arm_cpuinfo.cc", "fuzz/bn_div.cc", @@ -1161,6 +1200,7 @@ fuzz_sources = [ modulewrapper_sources = [ "util/fipstools/acvp/modulewrapper/main.cc", "util/fipstools/acvp/modulewrapper/modulewrapper.cc", + "util/fipstools/acvp/modulewrapper/proto.cc", ] modulewrapper_internal_headers = [ @@ -2827,6 +2867,7 @@ ssl_test_sources = [ test_support_sources = [ "crypto/test/abi_test.cc", + "crypto/test/der_trailing_data.cc", "crypto/test/file_test.cc", "crypto/test/file_test_gtest.cc", "crypto/test/file_util.cc", @@ -2837,6 +2878,7 @@ test_support_sources = [ test_support_internal_headers = [ "crypto/test/abi_test.h", + "crypto/test/der_trailing_data.h", "crypto/test/file_test.h", "crypto/test/file_util.h", "crypto/test/gtest_main.h", diff --git a/naiveproxy/src/third_party/boringssl/src/gen/sources.json b/naiveproxy/src/third_party/boringssl/src/gen/sources.json index 8e07625b35..beec447621 100644 --- a/naiveproxy/src/third_party/boringssl/src/gen/sources.json +++ b/naiveproxy/src/third_party/boringssl/src/gen/sources.json @@ -60,6 +60,8 @@ "crypto/fipsmodule/ec/wnaf.cc.inc", "crypto/fipsmodule/ecdh/ecdh.cc.inc", "crypto/fipsmodule/ecdsa/ecdsa.cc.inc", + "crypto/fipsmodule/entropy/jitter.cc.inc", + "crypto/fipsmodule/entropy/sha512.cc.inc", "crypto/fipsmodule/hkdf/hkdf.cc.inc", "crypto/fipsmodule/hmac/hmac.cc.inc", "crypto/fipsmodule/keccak/keccak.cc.inc", @@ -342,17 +344,13 @@ "crypto/evp/evp_asn1.cc", "crypto/evp/evp_ctx.cc", "crypto/evp/p_dh.cc", - "crypto/evp/p_dh_asn1.cc", - "crypto/evp/p_dsa_asn1.cc", + "crypto/evp/p_dsa.cc", "crypto/evp/p_ec.cc", - "crypto/evp/p_ec_asn1.cc", "crypto/evp/p_ed25519.cc", - "crypto/evp/p_ed25519_asn1.cc", "crypto/evp/p_hkdf.cc", + "crypto/evp/p_mldsa.cc", "crypto/evp/p_rsa.cc", - "crypto/evp/p_rsa_asn1.cc", "crypto/evp/p_x25519.cc", - "crypto/evp/p_x25519_asn1.cc", "crypto/evp/pbkdf.cc", "crypto/evp/print.cc", "crypto/evp/scrypt.cc", @@ -485,7 +483,6 @@ "crypto/x509/x_req.cc", "crypto/x509/x_sig.cc", "crypto/x509/x_spki.cc", - "crypto/x509/x_val.cc", "crypto/x509/x_x509.cc", "crypto/x509/x_x509a.cc", "crypto/xwing/xwing.cc", @@ -501,7 +498,6 @@ "include/openssl/asn1t.h", "include/openssl/base.h", "include/openssl/base64.h", - "include/openssl/bcm_public.h", "include/openssl/bio.h", "include/openssl/blake2.h", "include/openssl/blowfish.h", @@ -533,7 +529,6 @@ "include/openssl/evp.h", "include/openssl/evp_errors.h", "include/openssl/ex_data.h", - "include/openssl/experimental/kyber.h", "include/openssl/hkdf.h", "include/openssl/hmac.h", "include/openssl/hpke.h", @@ -614,6 +609,7 @@ "crypto/fipsmodule/ec/p256-nistz.h", "crypto/fipsmodule/ec/p256_table.h", "crypto/fipsmodule/ecdsa/internal.h", + "crypto/fipsmodule/entropy/internal.h", "crypto/fipsmodule/keccak/internal.h", "crypto/fipsmodule/rand/internal.h", "crypto/fipsmodule/rsa/internal.h", @@ -732,6 +728,7 @@ "crypto/fipsmodule/ec/p256-nistz_test.cc", "crypto/fipsmodule/ec/p256_test.cc", "crypto/fipsmodule/ecdsa/ecdsa_test.cc", + "crypto/fipsmodule/entropy/jitter_test.cc", "crypto/fipsmodule/hkdf/hkdf_test.cc", "crypto/fipsmodule/keccak/keccak_test.cc", "crypto/fipsmodule/rand/ctrdrbg_test.cc", @@ -810,8 +807,14 @@ "crypto/cipher/test/xchacha20_poly1305_tests.txt", "crypto/curve25519/ed25519_tests.txt", "crypto/ecdh/ecdh_tests.txt", - "crypto/evp/evp_tests.txt", - "crypto/evp/scrypt_tests.txt", + "crypto/evp/test/dh_tests.txt", + "crypto/evp/test/ec_tests.txt", + "crypto/evp/test/ed25519_tests.txt", + "crypto/evp/test/evp_tests.txt", + "crypto/evp/test/mldsa_tests.txt", + "crypto/evp/test/rsa_tests.txt", + "crypto/evp/test/scrypt_tests.txt", + "crypto/evp/test/x25519_tests.txt", "crypto/fipsmodule/aes/aes_tests.txt", "crypto/fipsmodule/bn/test/exp_tests.txt", "crypto/fipsmodule/bn/test/gcd_tests.txt", @@ -833,6 +836,7 @@ "crypto/fipsmodule/ecdsa/ecdsa_sign_tests.txt", "crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt", "crypto/fipsmodule/keccak/keccak_tests.txt", + "crypto/fipsmodule/rand/ctrdrbg_df_vectors.txt", "crypto/fipsmodule/rand/ctrdrbg_vectors.txt", "crypto/hmac/hmac_tests.txt", "crypto/hpke/hpke_test_vectors.txt", @@ -966,6 +970,7 @@ "crypto/x509/test/pss_sha256_wrong_trailer.pem", "crypto/x509/test/pss_sha384.pem", "crypto/x509/test/pss_sha512.pem", + "crypto/x509/test/rsa_pss_sha256_key.pk8", "crypto/x509/test/some_names1.pem", "crypto/x509/test/some_names2.pem", "crypto/x509/test/some_names3.pem", @@ -976,13 +981,32 @@ "crypto/x509/test/trailing_data_leaf_name_constraints.pem", "crypto/x509/test/trailing_data_leaf_subject_alt_name.pem", "crypto/x509/test/trailing_data_leaf_subject_key_identifier.pem", + "crypto/x509/test/unusual_tbs_critical_ber.pem", + "crypto/x509/test/unusual_tbs_critical_false_not_omitted.pem", + "crypto/x509/test/unusual_tbs_empty_extension_not_omitted.pem", + "crypto/x509/test/unusual_tbs_key.pem", + "crypto/x509/test/unusual_tbs_null_sigalg_param.pem", + "crypto/x509/test/unusual_tbs_uid_both.pem", + "crypto/x509/test/unusual_tbs_uid_issuer.pem", + "crypto/x509/test/unusual_tbs_uid_subject.pem", + "crypto/x509/test/unusual_tbs_v1_not_omitted.pem", + "crypto/x509/test/unusual_tbs_wrong_attribute_order.pem", "third_party/wycheproof_testvectors/aes_cbc_pkcs5_test.txt", "third_party/wycheproof_testvectors/aes_cmac_test.txt", "third_party/wycheproof_testvectors/aes_eax_test.txt", "third_party/wycheproof_testvectors/aes_gcm_siv_test.txt", "third_party/wycheproof_testvectors/aes_gcm_test.txt", + "third_party/wycheproof_testvectors/aes_kwp_test.txt", + "third_party/wycheproof_testvectors/aes_wrap_test.txt", "third_party/wycheproof_testvectors/chacha20_poly1305_test.txt", - "third_party/wycheproof_testvectors/dsa_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_224_sha224_p1363_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_224_sha224_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_224_sha256_p1363_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_224_sha256_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_256_sha256_p1363_test.txt", + "third_party/wycheproof_testvectors/dsa_2048_256_sha256_test.txt", + "third_party/wycheproof_testvectors/dsa_3072_256_sha256_p1363_test.txt", + "third_party/wycheproof_testvectors/dsa_3072_256_sha256_test.txt", "third_party/wycheproof_testvectors/ecdh_secp224r1_test.txt", "third_party/wycheproof_testvectors/ecdh_secp256r1_test.txt", "third_party/wycheproof_testvectors/ecdh_secp384r1_test.txt", @@ -1003,7 +1027,7 @@ "third_party/wycheproof_testvectors/ecdsa_secp384r1_sha512_test.txt", "third_party/wycheproof_testvectors/ecdsa_secp521r1_sha512_p1363_test.txt", "third_party/wycheproof_testvectors/ecdsa_secp521r1_sha512_test.txt", - "third_party/wycheproof_testvectors/eddsa_test.txt", + "third_party/wycheproof_testvectors/ed25519_test.txt", "third_party/wycheproof_testvectors/hkdf_sha1_test.txt", "third_party/wycheproof_testvectors/hkdf_sha256_test.txt", "third_party/wycheproof_testvectors/hkdf_sha384_test.txt", @@ -1013,14 +1037,12 @@ "third_party/wycheproof_testvectors/hmac_sha256_test.txt", "third_party/wycheproof_testvectors/hmac_sha384_test.txt", "third_party/wycheproof_testvectors/hmac_sha512_test.txt", - "third_party/wycheproof_testvectors/kw_test.txt", - "third_party/wycheproof_testvectors/kwp_test.txt", - "third_party/wycheproof_testvectors/mldsa_44_standard_sign_test.txt", - "third_party/wycheproof_testvectors/mldsa_44_standard_verify_test.txt", - "third_party/wycheproof_testvectors/mldsa_65_standard_sign_test.txt", - "third_party/wycheproof_testvectors/mldsa_65_standard_verify_test.txt", - "third_party/wycheproof_testvectors/mldsa_87_standard_sign_test.txt", - "third_party/wycheproof_testvectors/mldsa_87_standard_verify_test.txt", + "third_party/wycheproof_testvectors/mldsa_44_sign_noseed_test.txt", + "third_party/wycheproof_testvectors/mldsa_44_verify_test.txt", + "third_party/wycheproof_testvectors/mldsa_65_sign_noseed_test.txt", + "third_party/wycheproof_testvectors/mldsa_65_verify_test.txt", + "third_party/wycheproof_testvectors/mldsa_87_sign_noseed_test.txt", + "third_party/wycheproof_testvectors/mldsa_87_verify_test.txt", "third_party/wycheproof_testvectors/primality_test.txt", "third_party/wycheproof_testvectors/rsa_oaep_2048_sha1_mgf1sha1_test.txt", "third_party/wycheproof_testvectors/rsa_oaep_2048_sha224_mgf1sha1_test.txt", @@ -1040,8 +1062,13 @@ "third_party/wycheproof_testvectors/rsa_oaep_4096_sha512_mgf1sha1_test.txt", "third_party/wycheproof_testvectors/rsa_oaep_4096_sha512_mgf1sha512_test.txt", "third_party/wycheproof_testvectors/rsa_oaep_misc_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_1024_sig_gen_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_1536_sig_gen_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_2048_sig_gen_test.txt", "third_party/wycheproof_testvectors/rsa_pkcs1_2048_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_3072_sig_gen_test.txt", "third_party/wycheproof_testvectors/rsa_pkcs1_3072_test.txt", + "third_party/wycheproof_testvectors/rsa_pkcs1_4096_sig_gen_test.txt", "third_party/wycheproof_testvectors/rsa_pkcs1_4096_test.txt", "third_party/wycheproof_testvectors/rsa_pss_2048_sha1_mgf1_20_test.txt", "third_party/wycheproof_testvectors/rsa_pss_2048_sha256_mgf1_0_test.txt", @@ -1050,7 +1077,6 @@ "third_party/wycheproof_testvectors/rsa_pss_4096_sha256_mgf1_32_test.txt", "third_party/wycheproof_testvectors/rsa_pss_4096_sha512_mgf1_32_test.txt", "third_party/wycheproof_testvectors/rsa_pss_misc_test.txt", - "third_party/wycheproof_testvectors/rsa_sig_gen_misc_test.txt", "third_party/wycheproof_testvectors/rsa_signature_2048_sha224_test.txt", "third_party/wycheproof_testvectors/rsa_signature_2048_sha256_test.txt", "third_party/wycheproof_testvectors/rsa_signature_2048_sha384_test.txt", @@ -1058,9 +1084,12 @@ "third_party/wycheproof_testvectors/rsa_signature_3072_sha256_test.txt", "third_party/wycheproof_testvectors/rsa_signature_3072_sha384_test.txt", "third_party/wycheproof_testvectors/rsa_signature_3072_sha512_test.txt", + "third_party/wycheproof_testvectors/rsa_signature_4096_sha256_test.txt", "third_party/wycheproof_testvectors/rsa_signature_4096_sha384_test.txt", "third_party/wycheproof_testvectors/rsa_signature_4096_sha512_test.txt", - "third_party/wycheproof_testvectors/rsa_signature_test.txt", + "third_party/wycheproof_testvectors/rsa_signature_8192_sha256_test.txt", + "third_party/wycheproof_testvectors/rsa_signature_8192_sha384_test.txt", + "third_party/wycheproof_testvectors/rsa_signature_8192_sha512_test.txt", "third_party/wycheproof_testvectors/x25519_test.txt", "third_party/wycheproof_testvectors/xchacha20_poly1305_test.txt" ] @@ -1102,6 +1131,16 @@ "decrepit/xts/xts_test.cc" ] }, + "entropy_modulewrapper": { + "srcs": [ + "util/fipstools/acvp/entropy_modulewrapper/main.cc", + "util/fipstools/acvp/entropy_modulewrapper/modulewrapper.cc", + "util/fipstools/acvp/modulewrapper/proto.cc" + ], + "internal_hdrs": [ + "util/fipstools/acvp/modulewrapper/modulewrapper.h" + ] + }, "fuzz": { "srcs": [ "fuzz/arm_cpuinfo.cc", @@ -1143,7 +1182,8 @@ "modulewrapper": { "srcs": [ "util/fipstools/acvp/modulewrapper/main.cc", - "util/fipstools/acvp/modulewrapper/modulewrapper.cc" + "util/fipstools/acvp/modulewrapper/modulewrapper.cc", + "util/fipstools/acvp/modulewrapper/proto.cc" ], "internal_hdrs": [ "util/fipstools/acvp/modulewrapper/modulewrapper.h" @@ -2811,6 +2851,7 @@ "test_support": { "srcs": [ "crypto/test/abi_test.cc", + "crypto/test/der_trailing_data.cc", "crypto/test/file_test.cc", "crypto/test/file_test_gtest.cc", "crypto/test/file_util.cc", @@ -2820,6 +2861,7 @@ ], "internal_hdrs": [ "crypto/test/abi_test.h", + "crypto/test/der_trailing_data.h", "crypto/test/file_test.h", "crypto/test/file_util.h", "crypto/test/gtest_main.h", diff --git a/naiveproxy/src/third_party/boringssl/src/gen/sources.mk b/naiveproxy/src/third_party/boringssl/src/gen/sources.mk index 05e0f9f8fa..622d9324f8 100644 --- a/naiveproxy/src/third_party/boringssl/src/gen/sources.mk +++ b/naiveproxy/src/third_party/boringssl/src/gen/sources.mk @@ -74,6 +74,8 @@ boringssl_bcm_internal_headers := \ crypto/fipsmodule/ec/wnaf.cc.inc \ crypto/fipsmodule/ecdh/ecdh.cc.inc \ crypto/fipsmodule/ecdsa/ecdsa.cc.inc \ + crypto/fipsmodule/entropy/jitter.cc.inc \ + crypto/fipsmodule/entropy/sha512.cc.inc \ crypto/fipsmodule/hkdf/hkdf.cc.inc \ crypto/fipsmodule/hmac/hmac.cc.inc \ crypto/fipsmodule/keccak/keccak.cc.inc \ @@ -352,17 +354,13 @@ boringssl_crypto_sources := \ crypto/evp/evp_asn1.cc \ crypto/evp/evp_ctx.cc \ crypto/evp/p_dh.cc \ - crypto/evp/p_dh_asn1.cc \ - crypto/evp/p_dsa_asn1.cc \ + crypto/evp/p_dsa.cc \ crypto/evp/p_ec.cc \ - crypto/evp/p_ec_asn1.cc \ crypto/evp/p_ed25519.cc \ - crypto/evp/p_ed25519_asn1.cc \ crypto/evp/p_hkdf.cc \ + crypto/evp/p_mldsa.cc \ crypto/evp/p_rsa.cc \ - crypto/evp/p_rsa_asn1.cc \ crypto/evp/p_x25519.cc \ - crypto/evp/p_x25519_asn1.cc \ crypto/evp/pbkdf.cc \ crypto/evp/print.cc \ crypto/evp/scrypt.cc \ @@ -495,7 +493,6 @@ boringssl_crypto_sources := \ crypto/x509/x_req.cc \ crypto/x509/x_sig.cc \ crypto/x509/x_spki.cc \ - crypto/x509/x_val.cc \ crypto/x509/x_x509.cc \ crypto/x509/x_x509a.cc \ crypto/xwing/xwing.cc \ @@ -511,7 +508,6 @@ boringssl_crypto_headers := \ include/openssl/asn1t.h \ include/openssl/base.h \ include/openssl/base64.h \ - include/openssl/bcm_public.h \ include/openssl/bio.h \ include/openssl/blake2.h \ include/openssl/blowfish.h \ @@ -543,7 +539,6 @@ boringssl_crypto_headers := \ include/openssl/evp.h \ include/openssl/evp_errors.h \ include/openssl/ex_data.h \ - include/openssl/experimental/kyber.h \ include/openssl/hkdf.h \ include/openssl/hmac.h \ include/openssl/hpke.h \ @@ -624,6 +619,7 @@ boringssl_crypto_internal_headers := \ crypto/fipsmodule/ec/p256-nistz.h \ crypto/fipsmodule/ec/p256_table.h \ crypto/fipsmodule/ecdsa/internal.h \ + crypto/fipsmodule/entropy/internal.h \ crypto/fipsmodule/keccak/internal.h \ crypto/fipsmodule/rand/internal.h \ crypto/fipsmodule/rsa/internal.h \ @@ -740,6 +736,7 @@ boringssl_crypto_test_sources := \ crypto/fipsmodule/ec/p256-nistz_test.cc \ crypto/fipsmodule/ec/p256_test.cc \ crypto/fipsmodule/ecdsa/ecdsa_test.cc \ + crypto/fipsmodule/entropy/jitter_test.cc \ crypto/fipsmodule/hkdf/hkdf_test.cc \ crypto/fipsmodule/keccak/keccak_test.cc \ crypto/fipsmodule/rand/ctrdrbg_test.cc \ @@ -818,8 +815,14 @@ boringssl_crypto_test_data := \ crypto/cipher/test/xchacha20_poly1305_tests.txt \ crypto/curve25519/ed25519_tests.txt \ crypto/ecdh/ecdh_tests.txt \ - crypto/evp/evp_tests.txt \ - crypto/evp/scrypt_tests.txt \ + crypto/evp/test/dh_tests.txt \ + crypto/evp/test/ec_tests.txt \ + crypto/evp/test/ed25519_tests.txt \ + crypto/evp/test/evp_tests.txt \ + crypto/evp/test/mldsa_tests.txt \ + crypto/evp/test/rsa_tests.txt \ + crypto/evp/test/scrypt_tests.txt \ + crypto/evp/test/x25519_tests.txt \ crypto/fipsmodule/aes/aes_tests.txt \ crypto/fipsmodule/bn/test/exp_tests.txt \ crypto/fipsmodule/bn/test/gcd_tests.txt \ @@ -841,6 +844,7 @@ boringssl_crypto_test_data := \ crypto/fipsmodule/ecdsa/ecdsa_sign_tests.txt \ crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt \ crypto/fipsmodule/keccak/keccak_tests.txt \ + crypto/fipsmodule/rand/ctrdrbg_df_vectors.txt \ crypto/fipsmodule/rand/ctrdrbg_vectors.txt \ crypto/hmac/hmac_tests.txt \ crypto/hpke/hpke_test_vectors.txt \ @@ -974,6 +978,7 @@ boringssl_crypto_test_data := \ crypto/x509/test/pss_sha256_wrong_trailer.pem \ crypto/x509/test/pss_sha384.pem \ crypto/x509/test/pss_sha512.pem \ + crypto/x509/test/rsa_pss_sha256_key.pk8 \ crypto/x509/test/some_names1.pem \ crypto/x509/test/some_names2.pem \ crypto/x509/test/some_names3.pem \ @@ -984,13 +989,32 @@ boringssl_crypto_test_data := \ crypto/x509/test/trailing_data_leaf_name_constraints.pem \ crypto/x509/test/trailing_data_leaf_subject_alt_name.pem \ crypto/x509/test/trailing_data_leaf_subject_key_identifier.pem \ + crypto/x509/test/unusual_tbs_critical_ber.pem \ + crypto/x509/test/unusual_tbs_critical_false_not_omitted.pem \ + crypto/x509/test/unusual_tbs_empty_extension_not_omitted.pem \ + crypto/x509/test/unusual_tbs_key.pem \ + crypto/x509/test/unusual_tbs_null_sigalg_param.pem \ + crypto/x509/test/unusual_tbs_uid_both.pem \ + crypto/x509/test/unusual_tbs_uid_issuer.pem \ + crypto/x509/test/unusual_tbs_uid_subject.pem \ + crypto/x509/test/unusual_tbs_v1_not_omitted.pem \ + crypto/x509/test/unusual_tbs_wrong_attribute_order.pem \ third_party/wycheproof_testvectors/aes_cbc_pkcs5_test.txt \ third_party/wycheproof_testvectors/aes_cmac_test.txt \ third_party/wycheproof_testvectors/aes_eax_test.txt \ third_party/wycheproof_testvectors/aes_gcm_siv_test.txt \ third_party/wycheproof_testvectors/aes_gcm_test.txt \ + third_party/wycheproof_testvectors/aes_kwp_test.txt \ + third_party/wycheproof_testvectors/aes_wrap_test.txt \ third_party/wycheproof_testvectors/chacha20_poly1305_test.txt \ - third_party/wycheproof_testvectors/dsa_test.txt \ + third_party/wycheproof_testvectors/dsa_2048_224_sha224_p1363_test.txt \ + third_party/wycheproof_testvectors/dsa_2048_224_sha224_test.txt \ + third_party/wycheproof_testvectors/dsa_2048_224_sha256_p1363_test.txt \ + third_party/wycheproof_testvectors/dsa_2048_224_sha256_test.txt \ + third_party/wycheproof_testvectors/dsa_2048_256_sha256_p1363_test.txt \ + third_party/wycheproof_testvectors/dsa_2048_256_sha256_test.txt \ + third_party/wycheproof_testvectors/dsa_3072_256_sha256_p1363_test.txt \ + third_party/wycheproof_testvectors/dsa_3072_256_sha256_test.txt \ third_party/wycheproof_testvectors/ecdh_secp224r1_test.txt \ third_party/wycheproof_testvectors/ecdh_secp256r1_test.txt \ third_party/wycheproof_testvectors/ecdh_secp384r1_test.txt \ @@ -1011,7 +1035,7 @@ boringssl_crypto_test_data := \ third_party/wycheproof_testvectors/ecdsa_secp384r1_sha512_test.txt \ third_party/wycheproof_testvectors/ecdsa_secp521r1_sha512_p1363_test.txt \ third_party/wycheproof_testvectors/ecdsa_secp521r1_sha512_test.txt \ - third_party/wycheproof_testvectors/eddsa_test.txt \ + third_party/wycheproof_testvectors/ed25519_test.txt \ third_party/wycheproof_testvectors/hkdf_sha1_test.txt \ third_party/wycheproof_testvectors/hkdf_sha256_test.txt \ third_party/wycheproof_testvectors/hkdf_sha384_test.txt \ @@ -1021,14 +1045,12 @@ boringssl_crypto_test_data := \ third_party/wycheproof_testvectors/hmac_sha256_test.txt \ third_party/wycheproof_testvectors/hmac_sha384_test.txt \ third_party/wycheproof_testvectors/hmac_sha512_test.txt \ - third_party/wycheproof_testvectors/kw_test.txt \ - third_party/wycheproof_testvectors/kwp_test.txt \ - third_party/wycheproof_testvectors/mldsa_44_standard_sign_test.txt \ - third_party/wycheproof_testvectors/mldsa_44_standard_verify_test.txt \ - third_party/wycheproof_testvectors/mldsa_65_standard_sign_test.txt \ - third_party/wycheproof_testvectors/mldsa_65_standard_verify_test.txt \ - third_party/wycheproof_testvectors/mldsa_87_standard_sign_test.txt \ - third_party/wycheproof_testvectors/mldsa_87_standard_verify_test.txt \ + third_party/wycheproof_testvectors/mldsa_44_sign_noseed_test.txt \ + third_party/wycheproof_testvectors/mldsa_44_verify_test.txt \ + third_party/wycheproof_testvectors/mldsa_65_sign_noseed_test.txt \ + third_party/wycheproof_testvectors/mldsa_65_verify_test.txt \ + third_party/wycheproof_testvectors/mldsa_87_sign_noseed_test.txt \ + third_party/wycheproof_testvectors/mldsa_87_verify_test.txt \ third_party/wycheproof_testvectors/primality_test.txt \ third_party/wycheproof_testvectors/rsa_oaep_2048_sha1_mgf1sha1_test.txt \ third_party/wycheproof_testvectors/rsa_oaep_2048_sha224_mgf1sha1_test.txt \ @@ -1048,8 +1070,13 @@ boringssl_crypto_test_data := \ third_party/wycheproof_testvectors/rsa_oaep_4096_sha512_mgf1sha1_test.txt \ third_party/wycheproof_testvectors/rsa_oaep_4096_sha512_mgf1sha512_test.txt \ third_party/wycheproof_testvectors/rsa_oaep_misc_test.txt \ + third_party/wycheproof_testvectors/rsa_pkcs1_1024_sig_gen_test.txt \ + third_party/wycheproof_testvectors/rsa_pkcs1_1536_sig_gen_test.txt \ + third_party/wycheproof_testvectors/rsa_pkcs1_2048_sig_gen_test.txt \ third_party/wycheproof_testvectors/rsa_pkcs1_2048_test.txt \ + third_party/wycheproof_testvectors/rsa_pkcs1_3072_sig_gen_test.txt \ third_party/wycheproof_testvectors/rsa_pkcs1_3072_test.txt \ + third_party/wycheproof_testvectors/rsa_pkcs1_4096_sig_gen_test.txt \ third_party/wycheproof_testvectors/rsa_pkcs1_4096_test.txt \ third_party/wycheproof_testvectors/rsa_pss_2048_sha1_mgf1_20_test.txt \ third_party/wycheproof_testvectors/rsa_pss_2048_sha256_mgf1_0_test.txt \ @@ -1058,7 +1085,6 @@ boringssl_crypto_test_data := \ third_party/wycheproof_testvectors/rsa_pss_4096_sha256_mgf1_32_test.txt \ third_party/wycheproof_testvectors/rsa_pss_4096_sha512_mgf1_32_test.txt \ third_party/wycheproof_testvectors/rsa_pss_misc_test.txt \ - third_party/wycheproof_testvectors/rsa_sig_gen_misc_test.txt \ third_party/wycheproof_testvectors/rsa_signature_2048_sha224_test.txt \ third_party/wycheproof_testvectors/rsa_signature_2048_sha256_test.txt \ third_party/wycheproof_testvectors/rsa_signature_2048_sha384_test.txt \ @@ -1066,9 +1092,12 @@ boringssl_crypto_test_data := \ third_party/wycheproof_testvectors/rsa_signature_3072_sha256_test.txt \ third_party/wycheproof_testvectors/rsa_signature_3072_sha384_test.txt \ third_party/wycheproof_testvectors/rsa_signature_3072_sha512_test.txt \ + third_party/wycheproof_testvectors/rsa_signature_4096_sha256_test.txt \ third_party/wycheproof_testvectors/rsa_signature_4096_sha384_test.txt \ third_party/wycheproof_testvectors/rsa_signature_4096_sha512_test.txt \ - third_party/wycheproof_testvectors/rsa_signature_test.txt \ + third_party/wycheproof_testvectors/rsa_signature_8192_sha256_test.txt \ + third_party/wycheproof_testvectors/rsa_signature_8192_sha384_test.txt \ + third_party/wycheproof_testvectors/rsa_signature_8192_sha512_test.txt \ third_party/wycheproof_testvectors/x25519_test.txt \ third_party/wycheproof_testvectors/xchacha20_poly1305_test.txt @@ -1105,6 +1134,14 @@ boringssl_decrepit_test_sources := \ decrepit/ripemd/ripemd_test.cc \ decrepit/xts/xts_test.cc +boringssl_entropy_modulewrapper_sources := \ + util/fipstools/acvp/entropy_modulewrapper/main.cc \ + util/fipstools/acvp/entropy_modulewrapper/modulewrapper.cc \ + util/fipstools/acvp/modulewrapper/proto.cc + +boringssl_entropy_modulewrapper_internal_headers := \ + util/fipstools/acvp/modulewrapper/modulewrapper.h + boringssl_fuzz_sources := \ fuzz/arm_cpuinfo.cc \ fuzz/bn_div.cc \ @@ -1143,7 +1180,8 @@ boringssl_fuzz_sources := \ boringssl_modulewrapper_sources := \ util/fipstools/acvp/modulewrapper/main.cc \ - util/fipstools/acvp/modulewrapper/modulewrapper.cc + util/fipstools/acvp/modulewrapper/modulewrapper.cc \ + util/fipstools/acvp/modulewrapper/proto.cc boringssl_modulewrapper_internal_headers := \ util/fipstools/acvp/modulewrapper/modulewrapper.h @@ -2797,6 +2835,7 @@ boringssl_ssl_test_sources := \ boringssl_test_support_sources := \ crypto/test/abi_test.cc \ + crypto/test/der_trailing_data.cc \ crypto/test/file_test.cc \ crypto/test/file_test_gtest.cc \ crypto/test/file_util.cc \ @@ -2806,6 +2845,7 @@ boringssl_test_support_sources := \ boringssl_test_support_internal_headers := \ crypto/test/abi_test.h \ + crypto/test/der_trailing_data.h \ crypto/test/file_test.h \ crypto/test/file_util.h \ crypto/test/gtest_main.h \ diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/aead.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/aead.h index e9c8fbe178..97dd338a6f 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/aead.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/aead.h @@ -169,7 +169,7 @@ OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_gcm_randnonce(void); OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_256_gcm_randnonce(void); // EVP_aead_aes_128_ccm_bluetooth is AES-128-CCM with M=4 and L=2 (4-byte tags -// and 13-byte nonces), as decribed in the Bluetooth Core Specification v5.0, +// and 13-byte nonces), as described in the Bluetooth Core Specification v5.0, // Volume 6, Part E, Section 1. OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_ccm_bluetooth(void); diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/asm_base.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/asm_base.h index 4fc5dd5dc6..941b482560 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/asm_base.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/asm_base.h @@ -56,7 +56,7 @@ // https://lpc.events/event/7/contributions/729/attachments/496/903/CET-LPC-2020.pdf // // cet.h defines _CET_ENDBR which is used to mark function entry points for IBT. -// and adds the assembly marker. The value of _CET_ENDBR is made dependant on if +// and adds the assembly marker. The value of _CET_ENDBR is made dependent on if // '-fcf-protection' is passed to the compiler. _CET_ENDBR is only required when // the function is the target of an indirect jump, but BoringSSL chooses to mark // all assembly entry points because it is easier, and allows BoringSSL's ABI diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/asn1.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/asn1.h index 8eb8e8b0f2..dbbefbb7e3 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/asn1.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/asn1.h @@ -77,10 +77,6 @@ extern "C" { // V_ASN1_ANY is used by the ASN.1 templates to indicate an ANY type. #define V_ASN1_ANY (-4) -// V_ASN1_ANY_AS_STRING is used by the ASN.1 templates to indicate an ANY type -// represented with |ASN1_STRING| instead of |ASN1_TYPE|. -#define V_ASN1_ANY_AS_STRING (-5) - // The following constants are tag numbers for universal types. #define V_ASN1_EOC 0 #define V_ASN1_BOOLEAN 1 @@ -335,8 +331,10 @@ OPENSSL_EXPORT void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *out); // // These functions may not be used with |ASN1_ITEM|s whose C type is // |ASN1_BOOLEAN|. -OPENSSL_EXPORT int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *in); -OPENSSL_EXPORT int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *in); +OPENSSL_EXPORT int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, + const void *in); +OPENSSL_EXPORT int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, + const void *in); // ASN1_item_unpack parses |oct|'s contents as |it|'s ASN.1 type. It returns a // newly-allocated instance of |it|'s C type on success, or NULL on error. @@ -722,7 +720,10 @@ OPENSSL_EXPORT int ASN1_mbstring_ncopy(ASN1_STRING **out, const uint8_t *in, // |mask|, |minsize|, and |maxsize| based on |nid|. When |nid| is a recognized // X.509 attribute type, it will pick a suitable ASN.1 string type and bounds. // For most attribute types, it preferentially chooses UTF8String. If |nid| is -// unrecognized, it uses UTF8String by default. +// unrecognized, it uses UTF8String by default. This function will also enforce +// any known attribute-specific constraints on the sizes of the string and fail +// if the size is invalid. In RFC 5280, these bounds are specified by +// constraints like "SIZE (1..ub-common-name)" in ASN.1. // // Slightly unlike |ASN1_mbstring_ncopy|, this function interprets |out| and // returns its result as follows: If |out| is NULL, it returns a newly-allocated @@ -756,7 +757,7 @@ OPENSSL_EXPORT ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, // // WARNING: This function affects global state in the library. If two libraries // in the same address space register information for the same OID, one call -// will fail. Prefer directly passing the desired parametrs to +// will fail. Prefer directly passing the desired parameters to // |ASN1_mbstring_copy| or |ASN1_mbstring_ncopy| instead. OPENSSL_EXPORT int ASN1_STRING_TABLE_add(int nid, long minsize, long maxsize, unsigned long mask, @@ -801,10 +802,6 @@ OPENSSL_EXPORT ASN1_STRING *d2i_DIRECTORYSTRING(ASN1_STRING **out, // 5280), as described in |i2d_SAMPLE|. OPENSSL_EXPORT int i2d_DIRECTORYSTRING(const ASN1_STRING *in, uint8_t **outp); -// DIRECTORYSTRING is an |ASN1_ITEM| whose ASN.1 type is X.509 DirectoryString -// (RFC 5280) and C type is |ASN1_STRING*|. -DECLARE_ASN1_ITEM(DIRECTORYSTRING) - // B_ASN1_DISPLAYTEXT is a bitmask of types allowed in an X.509 DisplayText (RFC // 5280). #define B_ASN1_DISPLAYTEXT \ @@ -834,10 +831,6 @@ OPENSSL_EXPORT ASN1_STRING *d2i_DISPLAYTEXT(ASN1_STRING **out, // as described in |i2d_SAMPLE|. OPENSSL_EXPORT int i2d_DISPLAYTEXT(const ASN1_STRING *in, uint8_t **outp); -// DISPLAYTEXT is an |ASN1_ITEM| whose ASN.1 type is X.509 DisplayText (RFC -// 5280) and C type is |ASN1_STRING*|. -DECLARE_ASN1_ITEM(DISPLAYTEXT) - // Bit strings. // @@ -938,7 +931,7 @@ OPENSSL_EXPORT int ASN1_BIT_STRING_set(ASN1_BIT_STRING *str, // ASN1_BIT_STRING_set_bit sets bit |n| of |str| to one if |value| is non-zero // and zero if |value| is zero, resizing |str| as needed. It then truncates -// trailing zeros in |str| to align with the DER represention for a bit string +// trailing zeros in |str| to align with the DER representation for a bit string // with named bits. It returns one on success and zero on error. |n| is indexed // beginning from zero. OPENSSL_EXPORT int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *str, int n, @@ -1258,10 +1251,6 @@ OPENSSL_EXPORT ASN1_TIME *d2i_ASN1_TIME(ASN1_TIME **out, const uint8_t **inp, // described in |i2d_SAMPLE|. OPENSSL_EXPORT int i2d_ASN1_TIME(const ASN1_TIME *in, uint8_t **outp); -// ASN1_TIME is an |ASN1_ITEM| whose ASN.1 type is X.509 Time (RFC 5280) and C -// type is |ASN1_TIME*|. -DECLARE_ASN1_ITEM(ASN1_TIME) - // ASN1_TIME_diff computes |to| - |from|. On success, it sets |*out_days| to the // difference in days, rounded towards zero, sets |*out_seconds| to the // remainder, and returns one. On error, it returns zero. diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/asn1t.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/asn1t.h index b3650af101..2e8d2969c8 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/asn1t.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/asn1t.h @@ -491,8 +491,8 @@ typedef struct ASN1_AUX_st { ASN1_ITEM_start(itname) ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, \ sizeof(ASN1_STRING), #itname ASN1_ITEM_end(itname) -#define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ - ASN1_ITEM_start(sname) ASN1_ITYPE_EXTERN, tag, NULL, 0, &fptrs, 0, \ +#define IMPLEMENT_EXTERN_ASN1(sname, fptrs) \ + ASN1_ITEM_start(sname) ASN1_ITYPE_EXTERN, -1, NULL, 0, &fptrs, 0, \ #sname ASN1_ITEM_end(sname) /* Macro to implement standard functions in terms of ASN1_ITEM structures */ diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/base.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/base.h index 95cc15df18..e8d070ce33 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/base.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/base.h @@ -73,7 +73,7 @@ extern "C" { // A consumer may use this symbol in the preprocessor to temporarily build // against multiple revisions of BoringSSL at the same time. It is not // recommended to do so for longer than is necessary. -#define BORINGSSL_API_VERSION 36 +#define BORINGSSL_API_VERSION 37 #if defined(BORINGSSL_SHARED_LIBRARY) @@ -183,7 +183,7 @@ extern "C" { // C and C++ handle inline functions differently. In C++, an inline function is // defined in just the header file, potentially emitted in multiple compilation // units (in cases the compiler did not inline), but each copy must be identical -// to satsify ODR. In C, a non-static inline must be manually emitted in exactly +// to satisfy ODR. In C, a non-static inline must be manually emitted in exactly // one compilation unit with a separate extern inline declaration. // // In both languages, exported inline functions referencing file-local symbols @@ -330,6 +330,7 @@ typedef struct evp_hpke_ctx_st EVP_HPKE_CTX; typedef struct evp_hpke_kdf_st EVP_HPKE_KDF; typedef struct evp_hpke_kem_st EVP_HPKE_KEM; typedef struct evp_hpke_key_st EVP_HPKE_KEY; +typedef struct evp_pkey_alg_st EVP_PKEY_ALG; typedef struct evp_pkey_ctx_st EVP_PKEY_CTX; typedef struct evp_pkey_st EVP_PKEY; typedef struct hmac_ctx_st HMAC_CTX; diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/bcm_public.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/bcm_public.h deleted file mode 100644 index e2c0a93e45..0000000000 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/bcm_public.h +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2024 The BoringSSL Authors -// -// Licensed under the Apache License, Version 2.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. - -#ifndef OPENSSL_HEADER_BCM_PUBLIC_H_ -#define OPENSSL_HEADER_BCM_PUBLIC_H_ - -#include // IWYU pragma: export - -#if defined(__cplusplus) -extern "C" { -#endif - -// Public types referenced by BoringCrypto -// -// This header contains public types referenced by BCM. Such types are difficult -// to hide from the libcrypto interface, so we treat them as part of BCM. - -// BCM_SHA_CBLOCK is the block size of SHA-1. -#define BCM_SHA_CBLOCK 64 - -// SHA_CTX -struct sha_state_st { -#if defined(__cplusplus) || defined(OPENSSL_WINDOWS) - uint32_t h[5]; -#else - // wpa_supplicant accesses |h0|..|h4| so we must support those names for - // compatibility with it until it can be updated. Anonymous unions are only - // standard in C11, so disable this workaround in C++. - union { - uint32_t h[5]; - struct { - uint32_t h0; - uint32_t h1; - uint32_t h2; - uint32_t h3; - uint32_t h4; - }; - }; -#endif - uint32_t Nl, Nh; - uint8_t data[BCM_SHA_CBLOCK]; - unsigned num; -}; - -// SHA256_CBLOCK is the block size of SHA-256. -#define BCM_SHA256_CBLOCK 64 - -// SHA256_CTX -struct sha256_state_st { - uint32_t h[8]; - uint32_t Nl, Nh; - uint8_t data[BCM_SHA256_CBLOCK]; - unsigned num, md_len; -}; - -// BCM_SHA512_CBLOCK is the block size of SHA-512. -#define BCM_SHA512_CBLOCK 128 - -struct sha512_state_st { - uint64_t h[8]; - uint16_t num, md_len; - uint32_t bytes_so_far_high; - uint64_t bytes_so_far_low; - uint8_t p[BCM_SHA512_CBLOCK]; -}; - - -#if defined(__cplusplus) -} // extern C -#endif - -#endif // OPENSSL_HEADER_BCM_PUBLIC_H_ diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/bn.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/bn.h index d35b06b4d1..f6aca92396 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/bn.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/bn.h @@ -505,6 +505,9 @@ OPENSSL_EXPORT int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, // If |a| is a square and |p| > 2, there are two possible square roots. This // function may return either and may even select one non-deterministically. // +// If |in| is non-NULL, the function, instead of allocating the result, stores +// the result in |in| and returns |in| on success or NULL on failure. +// // This function only works if |p| is a prime. If |p| is composite, it may fail // or return an arbitrary value. Callers should not pass attacker-controlled // values of |p|. diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/bytestring.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/bytestring.h index d5df0b2f85..6dc5c247db 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/bytestring.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/bytestring.h @@ -175,7 +175,7 @@ OPENSSL_EXPORT int CBS_get_u64_decimal(CBS *cbs, uint64_t *out); // compiler, the following functions act on tag-length-value elements in the // serialization itself. Thus the caller is responsible for looping over a // SEQUENCE, branching on CHOICEs or OPTIONAL fields, checking for trailing -// data, and handling explict vs. implicit tagging. +// data, and handling explicit vs. implicit tagging. // // Tags are represented as |CBS_ASN1_TAG| values in memory. The upper few bits // store the class and constructed bit, and the remaining bits store the tag @@ -645,7 +645,7 @@ OPENSSL_EXPORT int CBB_add_asn1_bool(CBB *cbb, int value); // CBB_add_asn1_oid_from_text decodes |len| bytes from |text| as an ASCII OID // representation, e.g. "1.2.840.113554.4.1.72585", and writes the DER-encoded // contents to |cbb|. It returns one on success and zero on malloc failure or if -// |text| was invalid. It does not include the OBJECT IDENTIFER framing, only +// |text| was invalid. It does not include the OBJECT IDENTIFIER framing, only // the element's contents. // // This function considers OID strings with components which do not fit in a diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/cipher.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/cipher.h index 13e68ad20a..a5533caf45 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/cipher.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/cipher.h @@ -133,6 +133,12 @@ OPENSSL_EXPORT int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, // |out| must have sufficient space. The number of bytes actually output is // written to |*out_len|. It returns one on success and zero otherwise. // +// Note that the total output length across |EVP_EncryptUpdate| and +// |EVP_EncryptFinal_ex| will never exceed the sum of |in_len|. However, in +// ciphers whose the block size is not 1, such as CBC, individual calls to +// |EVP_EncryptUpdate| may output more or less than |in_len| bytes. In this +// case, the maximum output length is |in_len| plus the block size minus one. +// // If |ctx| is an AEAD cipher, e.g. |EVP_aes_128_gcm|, and |out| is NULL, this // function instead adds |in_len| bytes from |in| to the AAD and sets |*out_len| // to |in_len|. The AAD must be fully specified in this way before this function @@ -141,19 +147,26 @@ OPENSSL_EXPORT int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len, const uint8_t *in, int in_len); -// EVP_EncryptFinal_ex writes at most a block of ciphertext to |out| and sets -// |*out_len| to the number of bytes written. If padding is enabled (the -// default) then standard padding is applied to create the final block. If -// padding is disabled (with |EVP_CIPHER_CTX_set_padding|) then any partial -// block remaining will cause an error. The function returns one on success and -// zero otherwise. +// EVP_EncryptFinal_ex writes at most a block of ciphertext (if block length is +// >1) to |out| and sets |*out_len| to the number of bytes written. If padding +// is enabled (the default) then standard padding is applied to create the +// final block. If padding is disabled (with |EVP_CIPHER_CTX_set_padding|) then +// any partial block remaining will cause an error. The function returns one on +// success and zero otherwise. OPENSSL_EXPORT int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len); // EVP_DecryptUpdate decrypts |in_len| bytes from |in| to |out|. The number of -// output bytes may be up to |in_len| plus the block length minus one and |out| -// must have sufficient space. The number of bytes actually output is written -// to |*out_len|. It returns one on success and zero otherwise. +// output bytes may be up to |in_len| plus the block length (if block length is +// >1) and |out| must have sufficient space. The number of bytes actually +// output is written to |*out_len|. It returns one on success and zero +// otherwise. +// +// Note that the total output length across |EVP_DecryptUpdate| and +// |EVP_DecryptFinal_ex| will never exceed the sum of |in_len|. However, in +// ciphers whose the block size is not 1, such as CBC, individual calls to +// |EVP_DecryptUpdate| may output more or less than |in_len| bytes. In this +// case, the maximum output length is |in_len| plus the block size. // // If |ctx| is an AEAD cipher, e.g. |EVP_aes_128_gcm|, and |out| is NULL, this // function instead adds |in_len| bytes from |in| to the AAD and sets |*out_len| @@ -163,9 +176,9 @@ OPENSSL_EXPORT int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len, const uint8_t *in, int in_len); -// EVP_DecryptFinal_ex writes at most a block of ciphertext to |out| and sets -// |*out_len| to the number of bytes written. If padding is enabled (the -// default) then padding is removed from the final block. +// EVP_DecryptFinal_ex writes at most a block of ciphertext (if block length is +// >1) to |out| and sets |*out_len| to the number of bytes written. If padding +// is enabled (the default) then padding is removed from the final block. // // WARNING: it is unsafe to call this function with unauthenticated // ciphertext if padding is enabled. diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/cms.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/cms.h index 6616348ad9..59700b540f 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/cms.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/cms.h @@ -39,7 +39,7 @@ extern "C" { DECLARE_STACK_OF(X509) // CMS_* are flags that can be passed to functions in this library. Their -// interpretation is specified in the corresponding functinos. +// interpretation is specified in the corresponding functions. #define CMS_NOCERTS 0x2 #define CMS_DETACHED 0x40 #define CMS_BINARY 0x80 diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/conf.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/conf.h index 9bbded4bfe..875124ec2b 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/conf.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/conf.h @@ -96,6 +96,9 @@ OPENSSL_EXPORT int CONF_modules_load_file(const char *filename, const char *appname, unsigned long flags); +// CONF_modules_unload does nothing. +OPENSSL_EXPORT void CONF_modules_unload(int all); + // CONF_modules_free does nothing. OPENSSL_EXPORT void CONF_modules_free(void); diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/crypto.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/crypto.h index 1e8e6ad7b4..a22bfa2369 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/crypto.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/crypto.h @@ -100,7 +100,7 @@ OPENSSL_EXPORT int FIPS_mode(void); // fips_counter_t denotes specific APIs/algorithms. A counter is maintained for // each in FIPS mode so that tests can be written to assert that the expected, -// FIPS functions are being called by a certain peice of code. +// FIPS functions are being called by a certain piece of code. enum fips_counter_t { fips_counter_evp_aes_128_gcm = 0, fips_counter_evp_aes_256_gcm = 1, @@ -162,6 +162,9 @@ OPENSSL_EXPORT void ENGINE_load_builtin_engines(void); // ENGINE_register_all_complete returns one. OPENSSL_EXPORT int ENGINE_register_all_complete(void); +// ENGINE_cleanup does nothing. +OPENSSL_EXPORT void ENGINE_cleanup(void); + // OPENSSL_load_builtin_modules does nothing. OPENSSL_EXPORT void OPENSSL_load_builtin_modules(void); diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/ctrdrbg.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/ctrdrbg.h index 60749358f2..849fc82ba0 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/ctrdrbg.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/ctrdrbg.h @@ -15,7 +15,7 @@ #ifndef OPENSSL_HEADER_CTRDRBG_H #define OPENSSL_HEADER_CTRDRBG_H -#include // IWYU pragma: export +#include // IWYU pragma: export #if defined(__cplusplus) extern "C" { @@ -29,33 +29,67 @@ extern "C" { // // CTR_DRBG_STATE contains the state of a FIPS AES-CTR-based pseudo-random // number generator. If BoringSSL was built in FIPS mode then this is a FIPS -// Approved algorithm. +// Approved algorithm. BoringSSL supports CTR-DRBG both with, and without, a +// derivation function. -// CTR_DRBG_ENTROPY_LEN is the number of bytes of input entropy. See SP -// 800-90Ar1, table 3. +// CTR_DRBG_MIN_ENTROPY_LEN is the minimum number of bytes of input entropy +// when using a derivation function. See SP 800-90Ar1, table 3. +#define CTR_DRBG_MIN_ENTROPY_LEN 32 + +// CTR_DRBG_MAX_ENTROPY_LEN is the maximum number of bytes of input entropy +// when using a derivation function. This is an implementation limitation. +#define CTR_DRBG_MAX_ENTROPY_LEN 64 + +// CTR_DRBG_ENTROPY_LEN is a fixed amount of entropy required when not using a +// derivation function. #define CTR_DRBG_ENTROPY_LEN 48 +// The length of a seed, when using a derivation function. See SP 800-90Ar1, +// table 3. +#define CTR_DRBG_SEED_LEN (32 + CTR_DRBG_NONCE_LEN) + +// CTR_DRBG_NONCE_LEN is the number of bytes of input nonce. This only applies +// when using a derivation function. +#define CTR_DRBG_NONCE_LEN 16 + // CTR_DRBG_MAX_GENERATE_LENGTH is the maximum number of bytes that can be // generated in a single call to |CTR_DRBG_generate|. #define CTR_DRBG_MAX_GENERATE_LENGTH 65536 // CTR_DRBG_new returns an initialized |CTR_DRBG_STATE|, or NULL if either -// allocation failed or if |personalization_len| is invalid. +// allocation failed or if |personalization_len| is invalid. This DRBG will not +// use a derivation function. OPENSSL_EXPORT CTR_DRBG_STATE *CTR_DRBG_new( const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], const uint8_t *personalization, size_t personalization_len); +// CTR_DRBG_new_df returns an initialized |CTR_DRBG_STATE|, or NULL if either +// allocation failed or if an argument is invalid. This DRBG will use a +// derivation function. +OPENSSL_EXPORT CTR_DRBG_STATE *CTR_DRBG_new_df( + const uint8_t *entropy, size_t entropy_len, + const uint8_t nonce[CTR_DRBG_NONCE_LEN], const uint8_t *personalization, + size_t personalization_len); + // CTR_DRBG_free frees |state| if non-NULL, or else does nothing. -OPENSSL_EXPORT void CTR_DRBG_free(CTR_DRBG_STATE* state); +OPENSSL_EXPORT void CTR_DRBG_free(CTR_DRBG_STATE *state); // CTR_DRBG_reseed reseeds |drbg| given |CTR_DRBG_ENTROPY_LEN| bytes of entropy -// in |entropy| and, optionally, up to |CTR_DRBG_ENTROPY_LEN| bytes of +// in |entropy| and, optionally, up to |CTR_DRBG_SEED_LEN| bytes of // additional data. It returns one on success or zero on error. OPENSSL_EXPORT int CTR_DRBG_reseed(CTR_DRBG_STATE *drbg, const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], const uint8_t *additional_data, size_t additional_data_len); +// CTR_DRBG_reseed_ex acts like `CTR_DRBG_reseed` but with variable-length +// entropy input, up to |CTR_DRBG_MAX_ENTROPY_LEN|. +OPENSSL_EXPORT int CTR_DRBG_reseed_ex(CTR_DRBG_STATE *drbg, + const uint8_t *entropy, + size_t entropy_len, + const uint8_t *additional_data, + size_t additional_data_len); + // CTR_DRBG_generate processes to up |CTR_DRBG_ENTROPY_LEN| bytes of additional // data (if any) and then writes |out_len| random bytes to |out|, where // |out_len| <= |CTR_DRBG_MAX_GENERATE_LENGTH|. It returns one on success or diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/dh.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/dh.h index 4397d0e542..4a3fb986c1 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/dh.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/dh.h @@ -111,32 +111,38 @@ OPENSSL_EXPORT DH *DH_get_rfc7919_2048(void); // BN_get_rfc3526_prime_1536 sets |*ret| to the 1536-bit MODP group from RFC // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated -// and returned. It returns NULL on allocation failure. +// and returned. It returns NULL on allocation failure. The generator for this +// group is 2. OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_1536(BIGNUM *ret); // BN_get_rfc3526_prime_2048 sets |*ret| to the 2048-bit MODP group from RFC // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated -// and returned. It returns NULL on allocation failure. +// and returned. It returns NULL on allocation failure. The generator for this +// group is 2. OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_2048(BIGNUM *ret); // BN_get_rfc3526_prime_3072 sets |*ret| to the 3072-bit MODP group from RFC // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated -// and returned. It returns NULL on allocation failure. +// and returned. It returns NULL on allocation failure. The generator for this +// group is 2. OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_3072(BIGNUM *ret); // BN_get_rfc3526_prime_4096 sets |*ret| to the 4096-bit MODP group from RFC // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated -// and returned. It returns NULL on allocation failure. +// and returned. It returns NULL on allocation failure. The generator for this +// group is 2. OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_4096(BIGNUM *ret); // BN_get_rfc3526_prime_6144 sets |*ret| to the 6144-bit MODP group from RFC // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated -// and returned. It returns NULL on allocation failure. +// and returned. It returns NULL on allocation failure. The generator for this +// group is 2. OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_6144(BIGNUM *ret); // BN_get_rfc3526_prime_8192 sets |*ret| to the 8192-bit MODP group from RFC // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated -// and returned. It returns NULL on allocation failure. +// and returned. It returns NULL on allocation failure. The generator for this +// group is 2. OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_8192(BIGNUM *ret); diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/digest.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/digest.h index 710c6e6d11..a86c18926e 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/digest.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/digest.h @@ -213,6 +213,11 @@ OPENSSL_EXPORT int EVP_MD_CTX_type(const EVP_MD_CTX *ctx); // returns the digest function or NULL on error. OPENSSL_EXPORT const EVP_MD *EVP_parse_digest_algorithm(CBS *cbs); +// EVP_parse_digest_algorithm_nid behaves like |EVP_parse_digest_algorithm| +// except it returns |NID_undef| on error and some other value on success. This +// may be used to avoid depending on every digest algorithm in the library. +OPENSSL_EXPORT int EVP_parse_digest_algorithm_nid(CBS *cbs); + // EVP_marshal_digest_algorithm marshals |md| as an AlgorithmIdentifier // structure and appends the result to |cbb|. It returns one on success and zero // on error. It sets the parameters field to NULL. Use @@ -251,7 +256,7 @@ OPENSSL_EXPORT int EVP_add_digest(const EVP_MD *digest); OPENSSL_EXPORT const EVP_MD *EVP_get_digestbyname(const char *); // EVP_dss1 returns the value of EVP_sha1(). This was provided by OpenSSL to -// specifiy the original DSA signatures, which were fixed to use SHA-1. Note, +// specify the original DSA signatures, which were fixed to use SHA-1. Note, // however, that attempting to sign or verify DSA signatures with the EVP // interface will always fail. OPENSSL_EXPORT const EVP_MD *EVP_dss1(void); diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/ec.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/ec.h index 29dc86a15d..247922866c 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/ec.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/ec.h @@ -16,7 +16,7 @@ #ifndef OPENSSL_HEADER_EC_H #define OPENSSL_HEADER_EC_H -#include // IWYU pragma: export +#include // IWYU pragma: export #if defined(__cplusplus) extern "C" { @@ -312,13 +312,37 @@ OPENSSL_EXPORT int EC_hash_to_curve_p384_xmd_sha384_sswu( const EC_GROUP *group, EC_POINT *out, const uint8_t *dst, size_t dst_len, const uint8_t *msg, size_t msg_len); +// EC_encode_to_curve_p256_xmd_sha256_sswu hashes |msg| to a point on |group| +// and writes the result to |out|, implementing the P256_XMD:SHA-256_SSWU_NU_ +// suite from RFC 9380. It returns one on success and zero on error. +// +// This is a nonuniform encoding from byte strings to points in |group|. That +// is, the set of possible outputs is only a fraction of the points in |group|, +// and some points in this set are more likely to be output than others. See +// also RFC 9380, section 10.4 +OPENSSL_EXPORT int EC_encode_to_curve_p256_xmd_sha256_sswu( + const EC_GROUP *group, EC_POINT *out, const uint8_t *dst, size_t dst_len, + const uint8_t *msg, size_t msg_len); + +// EC_encode_to_curve_p384_xmd_sha384_sswu hashes |msg| to a point on |group| +// and writes the result to |out|, implementing the P384_XMD:SHA-384_SSWU_NU_ +// suite from RFC 9380. It returns one on success and zero on error. +// +// This is a nonuniform encoding from byte strings to points in |group|. That +// is, the set of possible outputs is only a fraction of the points in |group|, +// and some points in this set are more likely to be output than others. See +// also RFC 9380, section 10.4 +OPENSSL_EXPORT int EC_encode_to_curve_p384_xmd_sha384_sswu( + const EC_GROUP *group, EC_POINT *out, const uint8_t *dst, size_t dst_len, + const uint8_t *msg, size_t msg_len); + // Deprecated functions. // EC_GROUP_free releases a reference to |group|, if |group| was created by // |EC_GROUP_new_curve_GFp|. If |group| is static, it does nothing. // -// This function exists for OpenSSL compatibilty, and to manage dynamic +// This function exists for OpenSSL compatibility, and to manage dynamic // |EC_GROUP|s constructed by |EC_GROUP_new_curve_GFp|. Callers that do not need // either may ignore this function. OPENSSL_EXPORT void EC_GROUP_free(EC_GROUP *group); @@ -327,7 +351,7 @@ OPENSSL_EXPORT void EC_GROUP_free(EC_GROUP *group); // was created by |EC_GROUP_new_curve_GFp|. If |group| is static, it simply // returns |group|. // -// This function exists for OpenSSL compatibilty, and to manage dynamic +// This function exists for OpenSSL compatibility, and to manage dynamic // |EC_GROUP|s constructed by |EC_GROUP_new_curve_GFp|. Callers that do not need // either may ignore this function. OPENSSL_EXPORT EC_GROUP *EC_GROUP_dup(const EC_GROUP *group); diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/ec_key.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/ec_key.h index 1133a37c90..47d50636cc 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/ec_key.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/ec_key.h @@ -87,7 +87,7 @@ OPENSSL_EXPORT const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key); // EC_KEY_set_public_key sets the public key of |key| to |pub|, by copying it. // It returns one on success and zero otherwise. |key| must already have had a // group configured (see |EC_KEY_set_group| and |EC_KEY_new_by_curve_name|), and -// |pub| must also belong to that group. +// |pub| must also belong to that group, and must not be the point at infinity. OPENSSL_EXPORT int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub); #define EC_PKEY_NO_PARAMETERS 0x001 diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/err.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/err.h index 0263505f22..ee19f70e05 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/err.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/err.h @@ -80,6 +80,13 @@ OPENSSL_INLINE int ERR_GET_REASON(uint32_t packed_error) { return (int)(packed_error & 0xfff); } +// ERR_equals returns one if |packed_error|'s library and reason code are |lib| +// and |reason|, respectively, and zero otherwise. +OPENSSL_INLINE int ERR_equals(uint32_t packed_error, int lib, int reason) { + return ERR_GET_LIB(packed_error) == lib && + ERR_GET_REASON(packed_error) == reason; +} + // ERR_get_error gets the packed error code for the least recent error and // removes that error from the queue. If there are no errors in the queue then // it returns zero. @@ -258,7 +265,7 @@ enum { ERR_NUM_LIBS }; -// The following reason codes used to denote an error occuring in another +// The following reason codes used to denote an error occurring in another // library. They are sometimes used for a stack trace. #define ERR_R_SYS_LIB ERR_LIB_SYS #define ERR_R_BN_LIB ERR_LIB_BN diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/evp.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/evp.h index 988e1dac52..135781d066 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/evp.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/evp.h @@ -21,8 +21,6 @@ // OpenSSL included digest and cipher functions in this header so we include // them for users that still expect that. -// -// TODO(fork): clean up callers so that they include what they use. #include #include #include @@ -37,7 +35,7 @@ extern "C" { // EVP abstracts over public/private key algorithms. -// Public key objects. +// Public/private key objects. // // An |EVP_PKEY| object represents a public or private key. A given object may // be used concurrently on multiple threads by non-mutating functions, provided @@ -78,6 +76,13 @@ OPENSSL_EXPORT int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from); // parameters or zero if not, or if the algorithm doesn't take parameters. OPENSSL_EXPORT int EVP_PKEY_missing_parameters(const EVP_PKEY *pkey); +// EVP_PKEY_cmp_parameters compares the parameters of |a| and |b|. It returns +// one if they match, zero if not, or a negative number on error. +// +// WARNING: the return value differs from the usual return value convention. +OPENSSL_EXPORT int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, + const EVP_PKEY *b); + // EVP_PKEY_size returns the maximum size, in bytes, of a signature signed by // |pkey|. For an RSA key, this returns the number of bytes needed to represent // the modulus. For an EC key, this returns the maximum size of a DER-encoded @@ -89,14 +94,145 @@ OPENSSL_EXPORT int EVP_PKEY_size(const EVP_PKEY *pkey); // length of the group order. OPENSSL_EXPORT int EVP_PKEY_bits(const EVP_PKEY *pkey); +// The following constants are returned by |EVP_PKEY_id| and specify the type of +// key. +#define EVP_PKEY_NONE NID_undef +#define EVP_PKEY_RSA NID_rsaEncryption +#define EVP_PKEY_RSA_PSS NID_rsassaPss +#define EVP_PKEY_DSA NID_dsa +#define EVP_PKEY_EC NID_X9_62_id_ecPublicKey +#define EVP_PKEY_ED25519 NID_ED25519 +#define EVP_PKEY_X25519 NID_X25519 +#define EVP_PKEY_HKDF NID_hkdf +#define EVP_PKEY_DH NID_dhKeyAgreement +#define EVP_PKEY_ML_DSA_44 NID_ML_DSA_44 +#define EVP_PKEY_ML_DSA_65 NID_ML_DSA_65 +#define EVP_PKEY_ML_DSA_87 NID_ML_DSA_87 + // EVP_PKEY_id returns the type of |pkey|, which is one of the |EVP_PKEY_*| -// values. +// values above. These type values generally correspond to the algorithm OID, +// but not the parameters, of a SubjectPublicKeyInfo (RFC 5280) or +// PrivateKeyInfo (RFC 5208) AlgorithmIdentifier. Algorithm parameters can be +// inspected with algorithm-specific accessors, e.g. +// |EVP_PKEY_get_ec_curve_nid|. OPENSSL_EXPORT int EVP_PKEY_id(const EVP_PKEY *pkey); -// Getting and setting concrete public key types. +// Algorithms. // -// The following functions get and set the underlying public key in an +// An |EVP_PKEY| may carry a key from one of several algorithms, represented by +// |EVP_PKEY_ALG|. |EVP_PKEY_ALG|s are used by functions that construct +// |EVP_PKEY|s, such as parsing, so that callers can specify the algorithm(s) to +// use. +// +// Each |EVP_PKEY_ALG| generally corresponds to the AlgorithmIdentifier of a +// SubjectPublicKeyInfo (RFC 5280) or PrivateKeyInfo (RFC 5208), but some may +// support multiple sets of AlgorithmIdentifier parameters, while others may be +// specific to one parameter. + +// EVP_pkey_rsa implements RSA keys (RFC 8017), encoded as rsaEncryption (RFC +// 3279, Section 2.3.1). The rsaEncryption encoding is confusingly named: these +// keys are used for all RSA operations, including signing. The |EVP_PKEY_id| +// value is |EVP_PKEY_RSA|. +// +// WARNING: This |EVP_PKEY_ALG| accepts all RSA key sizes supported by +// BoringSSL. When parsing RSA keys, callers should check the size is within +// their desired bounds with |EVP_PKEY_bits|. RSA public key operations scale +// quadratically and RSA private key operations scale cubicly, so key sizes may +// be a DoS vector. +OPENSSL_EXPORT const EVP_PKEY_ALG *EVP_pkey_rsa(void); + +// EVP_pkey_ec_* implement EC keys, encoded as id-ecPublicKey (RFC 5480, +// Section 2.1.1). The id-ecPublicKey encoding is confusingly named: it is also +// used for private keys (RFC 5915). The |EVP_PKEY_id| value is |EVP_PKEY_EC|. +// +// Each function only supports the specified curve, but curves are not reflected +// in |EVP_PKEY_id|. The curve can be inspected with +// |EVP_PKEY_get_ec_curve_nid|. +OPENSSL_EXPORT const EVP_PKEY_ALG *EVP_pkey_ec_p224(void); +OPENSSL_EXPORT const EVP_PKEY_ALG *EVP_pkey_ec_p256(void); +OPENSSL_EXPORT const EVP_PKEY_ALG *EVP_pkey_ec_p384(void); +OPENSSL_EXPORT const EVP_PKEY_ALG *EVP_pkey_ec_p521(void); + +// EVP_pkey_x25519 implements X25519 keys (RFC 7748), encoded as in RFC 8410. +// The |EVP_PKEY_id| value is |EVP_PKEY_X25519|. +OPENSSL_EXPORT const EVP_PKEY_ALG *EVP_pkey_x25519(void); + +// EVP_pkey_ed25519 implements Ed25519 keys (RFC 8032), encoded as in RFC 8410. +// The |EVP_PKEY_id| value is |EVP_PKEY_ED25519|. +OPENSSL_EXPORT const EVP_PKEY_ALG *EVP_pkey_ed25519(void); + +// EVP_pkey_ml_dsa_* implement ML-DSA keys, encoded as in +// draft-ietf-lamps-dilithium-certificates. The |EVP_PKEY_id| values are +// |EVP_PKEY_ML_DSA_*|. In the private key representation, only the "seed" form +// is serialized or parsed. +// +// To configure OpenSSL to output the standard "seed" form, configure the +// "ml-dsa.output_formats" provider parameter so that "seed-only" is first. This +// can be done programmatically with OpenSSL's +// |OSSL_PROVIDER_add_conf_parameter| function, or by passing "-provparam" to +// the command-line tool. +OPENSSL_EXPORT const EVP_PKEY_ALG *EVP_pkey_ml_dsa_44(void); +OPENSSL_EXPORT const EVP_PKEY_ALG *EVP_pkey_ml_dsa_65(void); +OPENSSL_EXPORT const EVP_PKEY_ALG *EVP_pkey_ml_dsa_87(void); + +// EVP_pkey_dsa implements DSA keys, encoded as in RFC 3279, Section 2.3.2. The +// |EVP_PKEY_id| value is |EVP_PKEY_DSA|. This |EVP_PKEY_ALG| accepts all DSA +// parameters supported by BoringSSL. +// +// Keys of this type are not usable with any operations, though the underlying +// |DSA| object can be extracted with |EVP_PKEY_get0_DSA|. This key type is +// deprecated and only implemented for compatibility with legacy applications. +// +// TODO(crbug.com/42290364): We didn't wire up |EVP_PKEY_sign| and +// |EVP_PKEY_verify| just so it was auditable which callers used DSA. Once DSA +// is removed from the default SPKI and PKCS#8 parser and DSA users explicitly +// request |EVP_pkey_dsa|, we could change that. +OPENSSL_EXPORT const EVP_PKEY_ALG *EVP_pkey_dsa(void); + +// EVP_pkey_rsa_pss_* implements RSASSA-PSS keys, encoded as id-RSASSA-PSS +// (RFC 4055, Section 3.1). The |EVP_PKEY_id| value is |EVP_PKEY_RSA_PSS|. Each +// |EVP_PKEY_ALG| only accepts keys whose parameters specify: +// +// - A hashAlgorithm of the specified hash +// - A maskGenAlgorithm of MGF1 with the specified hash +// - A minimum saltLength of the specified hash's digest length +// - A trailerField of one (must be omitted in the encoding) +// +// Keys of this type will only be usable with RSASSA-PSS with matching signature +// parameters. +// +// This algorithm type is not recommended. The id-RSASSA-PSS key type is not +// widely implemented. Using it negates any compatibility benefits of using RSA. +// More modern algorithms like ECDSA are more performant and more compatible +// than id-RSASSA-PSS keys. This key type also adds significant complexity to a +// system. It has a wide range of possible parameter sets, so any uses must +// ensure all components not only support id-RSASSA-PSS, but also the specific +// parameters chosen. +// +// Note the id-RSASSA-PSS key type is distinct from the RSASSA-PSS signature +// algorithm. The widely implemented id-rsaEncryption key type (|EVP_pkey_rsa| +// and |EVP_PKEY_RSA|) also supports RSASSA-PSS signatures. +// +// WARNING: Any |EVP_PKEY|s produced by this algorithm will return a non-NULL +// |RSA| object through |EVP_PKEY_get1_RSA| and |EVP_PKEY_get0_RSA|. This is +// dangerous as existing code may assume a non-NULL return implies the more +// common id-rsaEncryption key. Additionally, the operations on the underlying +// |RSA| object will not capture the RSA-PSS constraints, so callers risk +// misusing the key by calling these functions. Callers using this algorithm +// must use |EVP_PKEY_id| to distinguish |EVP_PKEY_RSA| and |EVP_PKEY_RSA_PSS|. +// +// WARNING: BoringSSL does not currently implement |RSA_get0_pss_params| with +// these keys. Callers that require this functionality should contact the +// BoringSSL team. +OPENSSL_EXPORT const EVP_PKEY_ALG *EVP_pkey_rsa_pss_sha256(void); +OPENSSL_EXPORT const EVP_PKEY_ALG *EVP_pkey_rsa_pss_sha384(void); +OPENSSL_EXPORT const EVP_PKEY_ALG *EVP_pkey_rsa_pss_sha512(void); + + +// Getting and setting concrete key types. +// +// The following functions get and set the underlying key representation in an // |EVP_PKEY| object. The |set1| functions take an additional reference to the // underlying key and return one on success or zero if |key| is NULL. The // |assign| functions adopt the caller's reference and return one on success or @@ -108,6 +244,18 @@ OPENSSL_EXPORT int EVP_PKEY_id(const EVP_PKEY *pkey); // non-mutating for thread-safety purposes, but mutating functions on the // returned lower-level objects are considered to also mutate the |EVP_PKEY| and // may not be called concurrently with other operations on the |EVP_PKEY|. +// +// WARNING: Matching OpenSSL, the RSA functions behave non-uniformly. +// |EVP_PKEY_set1_RSA| and |EVP_PKEY_assign_RSA| construct an |EVP_PKEY_RSA| +// key, while the |EVP_PKEY_get0_RSA| and |EVP_PKEY_get1_RSA| will return +// non-NULL for both |EVP_PKEY_RSA| and |EVP_PKEY_RSA_PSS|. +// +// This means callers risk misusing a key if they assume a non-NULL return from +// |EVP_PKEY_get0_RSA| or |EVP_PKEY_get1_RSA| implies |EVP_PKEY_RSA|. Prefer +// |EVP_PKEY_id| to check the type of a key. To reduce this risk, BoringSSL does +// not make |EVP_PKEY_RSA_PSS| available by default, only when callers opt in +// via |EVP_pkey_rsa_pss_sha256|. This differs from upstream OpenSSL, where +// callers are exposed to |EVP_PKEY_RSA_PSS| by default. OPENSSL_EXPORT int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, RSA *key); OPENSSL_EXPORT int EVP_PKEY_assign_RSA(EVP_PKEY *pkey, RSA *key); @@ -129,39 +277,36 @@ OPENSSL_EXPORT int EVP_PKEY_assign_DH(EVP_PKEY *pkey, DH *key); OPENSSL_EXPORT DH *EVP_PKEY_get0_DH(const EVP_PKEY *pkey); OPENSSL_EXPORT DH *EVP_PKEY_get1_DH(const EVP_PKEY *pkey); -#define EVP_PKEY_NONE NID_undef -#define EVP_PKEY_RSA NID_rsaEncryption -#define EVP_PKEY_RSA_PSS NID_rsassaPss -#define EVP_PKEY_DSA NID_dsa -#define EVP_PKEY_EC NID_X9_62_id_ecPublicKey -#define EVP_PKEY_ED25519 NID_ED25519 -#define EVP_PKEY_X25519 NID_X25519 -#define EVP_PKEY_HKDF NID_hkdf -#define EVP_PKEY_DH NID_dhKeyAgreement - -// EVP_PKEY_set_type sets the type of |pkey| to |type|. It returns one if -// successful or zero if the |type| argument is not one of the |EVP_PKEY_*| -// values. If |pkey| is NULL, it simply reports whether the type is known. -OPENSSL_EXPORT int EVP_PKEY_set_type(EVP_PKEY *pkey, int type); - -// EVP_PKEY_cmp_parameters compares the parameters of |a| and |b|. It returns -// one if they match, zero if not, or a negative number of on error. -// -// WARNING: the return value differs from the usual return value convention. -OPENSSL_EXPORT int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, - const EVP_PKEY *b); - // ASN.1 functions +// EVP_PKEY_from_subject_public_key_info decodes a DER-encoded +// SubjectPublicKeyInfo structure (RFC 5280) from |in|. It returns a +// newly-allocated |EVP_PKEY| or NULL on error. Only the |num_algs| algorithms +// in |algs| will be considered when parsing. +OPENSSL_EXPORT EVP_PKEY *EVP_PKEY_from_subject_public_key_info( + const uint8_t *in, size_t len, const EVP_PKEY_ALG *const *algs, + size_t num_algs); + // EVP_parse_public_key decodes a DER-encoded SubjectPublicKeyInfo structure // (RFC 5280) from |cbs| and advances |cbs|. It returns a newly-allocated -// |EVP_PKEY| or NULL on error. If the key is an EC key, the curve is guaranteed -// to be set. +// |EVP_PKEY| or NULL on error. // -// The caller must check the type of the parsed public key to ensure it is -// suitable and validate other desired key properties such as RSA modulus size -// or EC curve. +// Prefer |EVP_PKEY_from_subject_public_key_info| instead. This function has +// several pitfalls: +// +// Callers are expected to handle trailing data returned from |cbs|, making more +// common cases error-prone. +// +// There is also no way to pass in supported algorithms. This function instead +// supports some default set of algorithms. Future versions of BoringSSL may add +// to this list, based on the needs of the other callers. Conversely, some +// algorithms may be intentionally omitted, if they cause too much risk to +// existing callers. +// +// This means callers must check the type of the parsed public key to ensure it +// is suitable and validate other desired key properties such as RSA modulus +// size or EC curve. OPENSSL_EXPORT EVP_PKEY *EVP_parse_public_key(CBS *cbs); // EVP_marshal_public_key marshals |key| as a DER-encoded SubjectPublicKeyInfo @@ -169,19 +314,41 @@ OPENSSL_EXPORT EVP_PKEY *EVP_parse_public_key(CBS *cbs); // success and zero on error. OPENSSL_EXPORT int EVP_marshal_public_key(CBB *cbb, const EVP_PKEY *key); +// EVP_PKEY_from_private_key_info decodes a DER-encoded PrivateKeyInfo structure +// (RFC 5208) from |in|. It returns a newly-allocated |EVP_PKEY| or NULL on +// error. Only the |num_algs| algorithms in |algs| will be considered when +// parsing. +// +// A PrivateKeyInfo ends with an optional set of attributes. These are silently +// ignored. +OPENSSL_EXPORT EVP_PKEY *EVP_PKEY_from_private_key_info( + const uint8_t *in, size_t len, const EVP_PKEY_ALG *const *algs, + size_t num_algs); + // EVP_parse_private_key decodes a DER-encoded PrivateKeyInfo structure (RFC // 5208) from |cbs| and advances |cbs|. It returns a newly-allocated |EVP_PKEY| // or NULL on error. // -// The caller must check the type of the parsed private key to ensure it is -// suitable and validate other desired key properties such as RSA modulus size -// or EC curve. In particular, RSA private key operations scale cubicly, so +// Prefer |EVP_PKEY_from_private_key_info| instead. This function has +// several pitfalls: +// +// Callers are expected to handle trailing data returned from |cbs|, making more +// common cases error-prone. +// +// There is also no way to pass in supported algorithms. This function instead +// supports some default set of algorithms. Future versions of BoringSSL may add +// to this list, based on the needs of the other callers. Conversely, some +// algorithms may be intentionally omitted, if they cause too much risk to +// existing callers. +// +// This means the caller must check the type of the parsed private key to ensure +// it is suitable and validate other desired key properties such as RSA modulus +// size or EC curve. In particular, RSA private key operations scale cubicly, so // applications accepting RSA private keys from external sources may need to // bound key sizes (use |EVP_PKEY_bits| or |RSA_bits|) to avoid a DoS vector. // -// A PrivateKeyInfo ends with an optional set of attributes. These are not -// processed and so this function will silently ignore any trailing data in the -// structure. +// A PrivateKeyInfo ends with an optional set of attributes. These are silently +// ignored. OPENSSL_EXPORT EVP_PKEY *EVP_parse_private_key(CBS *cbs); // EVP_marshal_private_key marshals |key| as a DER-encoded PrivateKeyInfo @@ -192,42 +359,69 @@ OPENSSL_EXPORT int EVP_marshal_private_key(CBB *cbb, const EVP_PKEY *key); // Raw keys // -// Some keys types support a "raw" serialization. Currently the only supported -// raw formats are X25519 and Ed25519, where the formats are those specified in -// RFC 7748 and RFC 8032, respectively. Note the RFC 8032 private key format is -// the 32-byte prefix of |ED25519_sign|'s 64-byte private key. +// These functions give access to the "raw" type-specific public and private key +// formats. Algorithms with such formats are: +// +// - X25519, using the formats in RFC 7748. +// +// - Ed25519, using the formats in RFC 8032. Note the RFC 8032 private key +// format is the 32-byte prefix of |ED25519_sign|'s 64-byte private key. +// +// - ML-DSA, using the formats in FIPS 204. The private key representation +// supported by BoringSSL is the 32-byte "seed", defined in FIPS 204 as 𝜉, not +// the larger expanded form. For OpenSSL compatibility, it is not used with +// the |EVP_PKEY_from_raw_private_key| and |EVP_PKEY_get_raw_private_key| +// APIs, but instead the |EVP_PKEY_from_private_seed| and +// |EVP_PKEY_get_private_seed| APIs. +// +// These formats are suitable if serializing a key in a context where the +// algorithm is already known and there is no need to encode it. -// EVP_PKEY_new_raw_private_key returns a newly allocated |EVP_PKEY| wrapping a -// private key of the specified type. It returns one on success and zero on -// error. -OPENSSL_EXPORT EVP_PKEY *EVP_PKEY_new_raw_private_key(int type, ENGINE *unused, +// EVP_PKEY_from_raw_private_key interprets |in| as a raw private key of type +// |alg| and returns a newly-allocated |EVP_PKEY|, or nullptr on error. +OPENSSL_EXPORT EVP_PKEY *EVP_PKEY_from_raw_private_key(const EVP_PKEY_ALG *alg, + const uint8_t *in, + size_t len); + +// EVP_PKEY_from_private_seed interprets |in| as a private seed of type |alg| +// and returns a newly-allocated |EVP_PKEY|, or nullptr on error. +OPENSSL_EXPORT EVP_PKEY *EVP_PKEY_from_private_seed(const EVP_PKEY_ALG *alg, + const uint8_t *in, + size_t len); + +// EVP_PKEY_from_raw_public_key interprets |in| as a raw public key of type +// |alg| and returns a newly-allocated |EVP_PKEY|, or nullptr on error. +OPENSSL_EXPORT EVP_PKEY *EVP_PKEY_from_raw_public_key(const EVP_PKEY_ALG *alg, const uint8_t *in, size_t len); -// EVP_PKEY_new_raw_public_key returns a newly allocated |EVP_PKEY| wrapping a -// public key of the specified type. It returns one on success and zero on -// error. -OPENSSL_EXPORT EVP_PKEY *EVP_PKEY_new_raw_public_key(int type, ENGINE *unused, - const uint8_t *in, - size_t len); - // EVP_PKEY_get_raw_private_key outputs the private key for |pkey| in raw form. // If |out| is NULL, it sets |*out_len| to the size of the raw private key. // Otherwise, it writes at most |*out_len| bytes to |out| and sets |*out_len| to // the number of bytes written. // // It returns one on success and zero if |pkey| has no private key, the key -// type does not support a raw format, or the buffer is too small. +// type does not support this format, or the buffer is too small. OPENSSL_EXPORT int EVP_PKEY_get_raw_private_key(const EVP_PKEY *pkey, uint8_t *out, size_t *out_len); +// EVP_PKEY_get_private_seed outputs the private key for |pkey| as a private +// seed. If |out| is NULL, it sets |*out_len| to the size of the seed. +// Otherwise, it writes at most |*out_len| bytes to |out| and sets +// |*out_len| to the number of bytes written. +// +// It returns one on success and zero if |pkey| has no private key, the key +// type does not support this format, or the buffer is too small. +OPENSSL_EXPORT int EVP_PKEY_get_private_seed(const EVP_PKEY *pkey, uint8_t *out, + size_t *out_len); + // EVP_PKEY_get_raw_public_key outputs the public key for |pkey| in raw form. // If |out| is NULL, it sets |*out_len| to the size of the raw public key. // Otherwise, it writes at most |*out_len| bytes to |out| and sets |*out_len| to // the number of bytes written. // // It returns one on success and zero if |pkey| has no public key, the key -// type does not support a raw format, or the buffer is too small. +// type does not support this format, or the buffer is too small. OPENSSL_EXPORT int EVP_PKEY_get_raw_public_key(const EVP_PKEY *pkey, uint8_t *out, size_t *out_len); @@ -468,10 +662,33 @@ OPENSSL_EXPORT int EVP_PBE_scrypt(const char *password, size_t password_len, size_t key_len); -// Public key contexts. +// Operations. // -// |EVP_PKEY_CTX| objects hold the context of an operation (e.g. signing or -// encrypting) that uses a public key. +// |EVP_PKEY_CTX| objects hold the context for an operation (e.g. signing or +// encrypting) that uses an |EVP_PKEY|. They are used to configure +// algorithm-specific parameters for the operation before performing the +// operation. The general pattern for performing an operation in EVP is: +// +// 1. Construct an |EVP_PKEY_CTX|, either with |EVP_PKEY_CTX_new| (operations +// using a key, like signing) or |EVP_PKEY_CTX_new_id| (operations not using +// an existing key, like key generation). +// +// 2. Initialize it for an operation. For example, |EVP_PKEY_sign_init| +// initializes an |EVP_PKEY_CTX| for signing. +// +// 3. Configure algorithm-specific parameters for the operation by calling +// control functions on the |EVP_PKEY_CTX|. Some functions are generic, such +// as |EVP_PKEY_CTX_set_signature_md|, and some are specific to an algorithm, +// such as |EVP_PKEY_CTX_set_rsa_padding|. +// +// 4. Perform the operation. For example, |EVP_PKEY_sign| signs with the +// corresponding parameters. +// +// 5. Release the |EVP_PKEY_CTX| with |EVP_PKEY_CTX_free|. +// +// Each |EVP_PKEY| algorithm interprets operations and parameters differently. +// Not all algorithms support all operations. Functions will fail if the +// algorithm does not support the parameter or operation. // EVP_PKEY_CTX_new allocates a fresh |EVP_PKEY_CTX| for use with |pkey|. It // returns the context or NULL on error. @@ -903,6 +1120,25 @@ OPENSSL_EXPORT EVP_PKEY *d2i_PublicKey(int type, EVP_PKEY **out, OPENSSL_EXPORT int EVP_PKEY_CTX_set_ec_param_enc(EVP_PKEY_CTX *ctx, int encoding); +// EVP_PKEY_set_type sets the type of |pkey| to |type|. It returns one if +// successful or zero if the |type| argument is not one of the |EVP_PKEY_*| +// values supported for use with this function. If |pkey| is NULL, it simply +// reports whether the type is known. +// +// There are very few cases where this function is useful. Changing |pkey|'s +// type clears any previously stored keys, so there is no benefit to loading a +// key and then changing its type. Although |pkey| is left with a type +// configured, it has no key, and functions which set a key, such as +// |EVP_PKEY_set1_RSA|, will configure a type anyway. If writing unit tests that +// are only sensitive to the type of a key, it is preferable to construct a real +// key, so that tests are more representative of production code. +// +// The only API pattern which requires this function is +// |EVP_PKEY_set1_tls_encodedpoint| with X25519, which requires a half-empty +// |EVP_PKEY| that was first configured with |EVP_PKEY_X25519|. Currently, all +// other values of |type| will result in an error. +OPENSSL_EXPORT int EVP_PKEY_set_type(EVP_PKEY *pkey, int type); + // EVP_PKEY_set1_tls_encodedpoint replaces |pkey| with a public key encoded by // |in|. It returns one on success and zero on error. // @@ -1014,6 +1250,26 @@ OPENSSL_EXPORT int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key); // EVP_PKEY_type returns |nid|. OPENSSL_EXPORT int EVP_PKEY_type(int nid); +// EVP_PKEY_new_raw_private_key interprets |in| as a raw private key of type +// |type|, which must be an |EVP_PKEY_*| constant, such as |EVP_PKEY_X25519|, +// and returns a newly-allocated |EVP_PKEY|, or nullptr on error. +// +// Prefer |EVP_PKEY_from_raw_private_key|, which allows dead code elimination to +// discard algorithms that aren't reachable from the caller. +OPENSSL_EXPORT EVP_PKEY *EVP_PKEY_new_raw_private_key(int type, ENGINE *unused, + const uint8_t *in, + size_t len); + +// EVP_PKEY_new_raw_public_key interprets |in| as a raw public key of type +// |type|, which must be an |EVP_PKEY_*| constant, such as |EVP_PKEY_X25519|, +// and returns a newly-allocated |EVP_PKEY|, or nullptr on error. +// +// Prefer |EVP_PKEY_from_raw_private_key|, which allows dead code elimination to +// discard algorithms that aren't reachable from the caller. +OPENSSL_EXPORT EVP_PKEY *EVP_PKEY_new_raw_public_key(int type, ENGINE *unused, + const uint8_t *in, + size_t len); + // Preprocessor compatibility section (hidden). // diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/evp_errors.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/evp_errors.h index c7fa18055b..4cccdb8560 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/evp_errors.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/evp_errors.h @@ -21,7 +21,7 @@ #define EVP_R_DIFFERENT_KEY_TYPES 103 #define EVP_R_DIFFERENT_PARAMETERS 104 #define EVP_R_ENCODE_ERROR 105 -#define EVP_R_EXPECTING_AN_EC_KEY_KEY 106 +#define EVP_R_EXPECTING_A_EC_KEY 106 #define EVP_R_EXPECTING_AN_RSA_KEY 107 #define EVP_R_EXPECTING_A_DSA_KEY 108 #define EVP_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE 109 @@ -54,5 +54,6 @@ #define EVP_R_EMPTY_PSK 136 #define EVP_R_INVALID_BUFFER_SIZE 137 #define EVP_R_EXPECTING_A_DH_KEY 138 +#define EVP_R_PRIVATE_KEY_WAS_NOT_SEED 139 #endif // OPENSSL_HEADER_EVP_ERRORS_H diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/experimental/kyber.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/experimental/kyber.h deleted file mode 100644 index 14ff973a1d..0000000000 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/experimental/kyber.h +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2023 The BoringSSL Authors -// -// Licensed under the Apache License, Version 2.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. - -#ifndef OPENSSL_HEADER_KYBER_H -#define OPENSSL_HEADER_KYBER_H - -#include // IWYU pragma: export - -#if defined(__cplusplus) -extern "C" { -#endif - - -#if defined(OPENSSL_UNSTABLE_EXPERIMENTAL_KYBER) -// This header implements experimental, draft versions of not-yet-standardized -// primitives. When the standard is complete, these functions will be removed -// and replaced with the final, incompatible standard version. They are -// available now for short-lived experiments, but must not be deployed anywhere -// durable, such as a long-lived key store. To use these functions define -// OPENSSL_UNSTABLE_EXPERIMENTAL_KYBER - -// Kyber768. -// -// This implements the round-3 specification of Kyber, defined at -// https://pq-crystals.org/kyber/data/kyber-specification-round3-20210804.pdf - - -// KYBER_public_key contains a Kyber768 public key. The contents of this -// object should never leave the address space since the format is unstable. -struct KYBER_public_key { - union { - uint8_t bytes[512 * (3 + 9) + 32 + 32]; - uint16_t alignment; - } opaque; -}; - -// KYBER_private_key contains a Kyber768 private key. The contents of this -// object should never leave the address space since the format is unstable. -struct KYBER_private_key { - union { - uint8_t bytes[512 * (3 + 3 + 9) + 32 + 32 + 32]; - uint16_t alignment; - } opaque; -}; - -// KYBER_PUBLIC_KEY_BYTES is the number of bytes in an encoded Kyber768 public -// key. -#define KYBER_PUBLIC_KEY_BYTES 1184 - -// KYBER_SHARED_SECRET_BYTES is the number of bytes in the Kyber768 shared -// secret. Although the round-3 specification has a variable-length output, the -// final ML-KEM construction is expected to use a fixed 32-byte output. To -// simplify the future transition, we apply the same restriction. -#define KYBER_SHARED_SECRET_BYTES 32 - -// KYBER_generate_key generates a random public/private key pair, writes the -// encoded public key to |out_encoded_public_key| and sets |out_private_key| to -// the private key. -OPENSSL_EXPORT void KYBER_generate_key( - uint8_t out_encoded_public_key[KYBER_PUBLIC_KEY_BYTES], - struct KYBER_private_key *out_private_key); - -// KYBER_public_from_private sets |*out_public_key| to the public key that -// corresponds to |private_key|. (This is faster than parsing the output of -// |KYBER_generate_key| if, for some reason, you need to encapsulate to a key -// that was just generated.) -OPENSSL_EXPORT void KYBER_public_from_private( - struct KYBER_public_key *out_public_key, - const struct KYBER_private_key *private_key); - -// KYBER_CIPHERTEXT_BYTES is number of bytes in the Kyber768 ciphertext. -#define KYBER_CIPHERTEXT_BYTES 1088 - -// KYBER_encap encrypts a random shared secret for |public_key|, writes the -// ciphertext to |out_ciphertext|, and writes the random shared secret to -// |out_shared_secret|. -OPENSSL_EXPORT void KYBER_encap( - uint8_t out_ciphertext[KYBER_CIPHERTEXT_BYTES], - uint8_t out_shared_secret[KYBER_SHARED_SECRET_BYTES], - const struct KYBER_public_key *public_key); - -// KYBER_decap decrypts a shared secret from |ciphertext| using |private_key| -// and writes it to |out_shared_secret|. If |ciphertext| is invalid, -// |out_shared_secret| is filled with a key that will always be the same for the -// same |ciphertext| and |private_key|, but which appears to be random unless -// one has access to |private_key|. These alternatives occur in constant time. -// Any subsequent symmetric encryption using |out_shared_secret| must use an -// authenticated encryption scheme in order to discover the decapsulation -// failure. -OPENSSL_EXPORT void KYBER_decap( - uint8_t out_shared_secret[KYBER_SHARED_SECRET_BYTES], - const uint8_t ciphertext[KYBER_CIPHERTEXT_BYTES], - const struct KYBER_private_key *private_key); - - -// Serialisation of keys. - -// KYBER_marshal_public_key serializes |public_key| to |out| in the standard -// format for Kyber public keys. It returns one on success or zero on allocation -// error. -OPENSSL_EXPORT int KYBER_marshal_public_key( - CBB *out, const struct KYBER_public_key *public_key); - -// KYBER_parse_public_key parses a public key, in the format generated by -// |KYBER_marshal_public_key|, from |in| and writes the result to -// |out_public_key|. It returns one on success or zero on parse error or if -// there are trailing bytes in |in|. -OPENSSL_EXPORT int KYBER_parse_public_key( - struct KYBER_public_key *out_public_key, CBS *in); - -// KYBER_marshal_private_key serializes |private_key| to |out| in the standard -// format for Kyber private keys. It returns one on success or zero on -// allocation error. -OPENSSL_EXPORT int KYBER_marshal_private_key( - CBB *out, const struct KYBER_private_key *private_key); - -// KYBER_PRIVATE_KEY_BYTES is the length of the data produced by -// |KYBER_marshal_private_key|. -#define KYBER_PRIVATE_KEY_BYTES 2400 - -// KYBER_parse_private_key parses a private key, in the format generated by -// |KYBER_marshal_private_key|, from |in| and writes the result to -// |out_private_key|. It returns one on success or zero on parse error or if -// there are trailing bytes in |in|. -OPENSSL_EXPORT int KYBER_parse_private_key( - struct KYBER_private_key *out_private_key, CBS *in); - -#endif // OPENSSL_UNSTABLE_EXPERIMENTAL_KYBER - - -#if defined(__cplusplus) -} // extern C -#endif - -#endif // OPENSSL_HEADER_KYBER_H diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/hmac.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/hmac.h index 7f626436ed..2266f99f39 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/hmac.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/hmac.h @@ -81,10 +81,10 @@ OPENSSL_EXPORT int HMAC_Update(HMAC_CTX *ctx, const uint8_t *data, size_t data_len); // HMAC_Final completes the HMAC operation in |ctx| and writes the result to -// |out| and the sets |*out_len| to the length of the result. On entry, |out| -// must contain at least |HMAC_size| bytes of space. An output size of -// |EVP_MAX_MD_SIZE| will always be large enough. It returns one on success or -// zero on allocation failure. +// |out|. If |out_len| is not |NULL| then it writes the length of the result to +// |*out_len|. On entry, |out| must contain at least |HMAC_size| bytes of +// space. An output size of |EVP_MAX_MD_SIZE| will always be large enough. It +// returns one on success or zero on allocation failure. OPENSSL_EXPORT int HMAC_Final(HMAC_CTX *ctx, uint8_t *out, unsigned int *out_len); diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/hpke.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/hpke.h index 7ccc6c655d..5336211636 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/hpke.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/hpke.h @@ -43,6 +43,8 @@ extern "C" { #define EVP_HPKE_DHKEM_P256_HKDF_SHA256 0x0010 #define EVP_HPKE_DHKEM_X25519_HKDF_SHA256 0x0020 #define EVP_HPKE_XWING 0x647a +#define EVP_HPKE_MLKEM768 0x0041 +#define EVP_HPKE_MLKEM1024 0x0042 // The following functions are KEM algorithms which may be used with HPKE. Note // that, while some HPKE KEMs use KDFs internally, this is separate from the @@ -50,6 +52,8 @@ extern "C" { OPENSSL_EXPORT const EVP_HPKE_KEM *EVP_hpke_x25519_hkdf_sha256(void); OPENSSL_EXPORT const EVP_HPKE_KEM *EVP_hpke_p256_hkdf_sha256(void); OPENSSL_EXPORT const EVP_HPKE_KEM *EVP_hpke_xwing(void); +OPENSSL_EXPORT const EVP_HPKE_KEM *EVP_hpke_mlkem768(void); +OPENSSL_EXPORT const EVP_HPKE_KEM *EVP_hpke_mlkem1024(void); // EVP_HPKE_KEM_id returns the HPKE KEM identifier for |kem|, which // will be one of the |EVP_HPKE_KEM_*| constants. @@ -57,7 +61,7 @@ OPENSSL_EXPORT uint16_t EVP_HPKE_KEM_id(const EVP_HPKE_KEM *kem); // EVP_HPKE_MAX_PUBLIC_KEY_LENGTH is the maximum length of an encoded public key // for all KEMs currently supported by this library. -#define EVP_HPKE_MAX_PUBLIC_KEY_LENGTH 1216 +#define EVP_HPKE_MAX_PUBLIC_KEY_LENGTH 1568 // EVP_HPKE_KEM_public_key_len returns the length of a public key for |kem|. // This value will be at most |EVP_HPKE_MAX_PUBLIC_KEY_LENGTH|. @@ -65,7 +69,7 @@ OPENSSL_EXPORT size_t EVP_HPKE_KEM_public_key_len(const EVP_HPKE_KEM *kem); // EVP_HPKE_MAX_PRIVATE_KEY_LENGTH is the maximum length of an encoded private // key for all KEMs currently supported by this library. -#define EVP_HPKE_MAX_PRIVATE_KEY_LENGTH 32 +#define EVP_HPKE_MAX_PRIVATE_KEY_LENGTH 64 // EVP_HPKE_KEM_private_key_len returns the length of a private key for |kem|. // This value will be at most |EVP_HPKE_MAX_PRIVATE_KEY_LENGTH|. @@ -73,7 +77,7 @@ OPENSSL_EXPORT size_t EVP_HPKE_KEM_private_key_len(const EVP_HPKE_KEM *kem); // EVP_HPKE_MAX_ENC_LENGTH is the maximum length of "enc", the encapsulated // shared secret, for all KEMs currently supported by this library. -#define EVP_HPKE_MAX_ENC_LENGTH 1120 +#define EVP_HPKE_MAX_ENC_LENGTH 1568 // EVP_HPKE_KEM_enc_len returns the length of the "enc", the encapsulated shared // secret, for |kem|. This value will be at most |EVP_HPKE_MAX_ENC_LENGTH|. diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/kdf.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/kdf.h index 29daa6a2cb..b434e2d884 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/kdf.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/kdf.h @@ -33,7 +33,8 @@ extern "C" { // |EVP_PKEY_derive_init|. // EVP_PKEY_HKDEF_MODE_* define "modes" for use with |EVP_PKEY_CTX_hkdf_mode|. -// The mispelling of "HKDF" as "HKDEF" is intentional for OpenSSL compatibility. +// The misspelling of "HKDF" as "HKDEF" is intentional for OpenSSL +// compatibility. #define EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND 0 #define EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY 1 #define EVP_PKEY_HKDEF_MODE_EXPAND_ONLY 2 diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/mldsa.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/mldsa.h index 63dc91f325..3d6b04c76a 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/mldsa.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/mldsa.h @@ -41,7 +41,7 @@ extern "C" { // object should never leave the address space since the format is unstable. struct MLDSA65_private_key { union { - uint8_t bytes[32 + 32 + 64 + 256 * 4 * (5 + 6 + 6)]; + uint8_t bytes[(32 + 64 + 256 * 4 * 6) + 32 + 256 * 4 * (5 + 6 + 6)]; uint32_t alignment; } opaque; }; @@ -65,10 +65,6 @@ struct MLDSA65_prehash { } opaque; }; -// MLDSA65_PRIVATE_KEY_BYTES is the number of bytes in an encoded ML-DSA-65 -// private key. -#define MLDSA65_PRIVATE_KEY_BYTES 4032 - // MLDSA65_PUBLIC_KEY_BYTES is the number of bytes in an encoded ML-DSA-65 // public key. #define MLDSA65_PUBLIC_KEY_BYTES 1952 @@ -161,6 +157,17 @@ OPENSSL_EXPORT int MLDSA65_sign_message_representative( const struct MLDSA65_private_key *private_key, const uint8_t msg_rep[MLDSA_MU_BYTES]); +// MLDSA65_verify_message_representative verifies that |signature| constitutes a +// valid signature for the pre-hashed message |msg_rep| using |public_key|. The +// |msg_rep| should be obtained via calls to |MLDSA65_prehash_init|, +// |MLDSA65_prehash_update| and |MLDSA65_prehash_finalize| using |public key| +// and the same context as when the signature was generated. Returns 1 on +// success or 0 on error. +OPENSSL_EXPORT int MLDSA65_verify_message_representative( + const struct MLDSA65_public_key *public_key, + const uint8_t *signature, size_t signature_len, + const uint8_t msg_rep[MLDSA_MU_BYTES]); + // MLDSA65_marshal_public_key serializes |public_key| to |out| in the standard // format for ML-DSA-65 public keys. It returns 1 on success or 0 on // allocation error. @@ -184,7 +191,7 @@ OPENSSL_EXPORT int MLDSA65_parse_public_key( // object should never leave the address space since the format is unstable. struct MLDSA87_private_key { union { - uint8_t bytes[32 + 32 + 64 + 256 * 4 * (7 + 8 + 8)]; + uint8_t bytes[(32 + 64 + 256 * 4 * 8) + 32 + 256 * 4 * (7 + 8 + 8)]; uint32_t alignment; } opaque; }; @@ -208,10 +215,6 @@ struct MLDSA87_prehash { } opaque; }; -// MLDSA87_PRIVATE_KEY_BYTES is the number of bytes in an encoded ML-DSA-87 -// private key. -#define MLDSA87_PRIVATE_KEY_BYTES 4896 - // MLDSA87_PUBLIC_KEY_BYTES is the number of bytes in an encoded ML-DSA-87 // public key. #define MLDSA87_PUBLIC_KEY_BYTES 2592 @@ -304,6 +307,17 @@ OPENSSL_EXPORT int MLDSA87_sign_message_representative( const struct MLDSA87_private_key *private_key, const uint8_t msg_rep[MLDSA_MU_BYTES]); +// MLDSA87_verify_message_representative verifies that |signature| constitutes a +// valid signature for the pre-hashed message |msg_rep| using |public_key|. The +// |msg_rep| should be obtained via calls to |MLDSA87_prehash_init|, +// |MLDSA87_prehash_update| and |MLDSA87_prehash_finalize| using |public key| +// and the same context as when the signature was generated. Returns 1 on +// success or 0 on error. +OPENSSL_EXPORT int MLDSA87_verify_message_representative( + const struct MLDSA87_public_key *public_key, + const uint8_t *signature, size_t signature_len, + const uint8_t msg_rep[MLDSA_MU_BYTES]); + // MLDSA87_marshal_public_key serializes |public_key| to |out| in the standard // format for ML-DSA-87 public keys. It returns 1 on success or 0 on // allocation error. @@ -324,7 +338,7 @@ OPENSSL_EXPORT int MLDSA87_parse_public_key( // object should never leave the address space since the format is unstable. struct MLDSA44_private_key { union { - uint8_t bytes[32 + 32 + 64 + 256 * 4 * (4 + 4 + 4)]; + uint8_t bytes[(32 + 64 + 256 * 4 * 4) + 32 + 256 * 4 * (4 + 4 + 4)]; uint32_t alignment; } opaque; }; @@ -348,10 +362,6 @@ struct MLDSA44_prehash { } opaque; }; -// MLDSA44_PRIVATE_KEY_BYTES is the number of bytes in an encoded ML-DSA-44 -// private key. -#define MLDSA44_PRIVATE_KEY_BYTES 2560 - // MLDSA44_PUBLIC_KEY_BYTES is the number of bytes in an encoded ML-DSA-44 // public key. #define MLDSA44_PUBLIC_KEY_BYTES 1312 @@ -444,6 +454,17 @@ OPENSSL_EXPORT int MLDSA44_sign_message_representative( const struct MLDSA44_private_key *private_key, const uint8_t msg_rep[MLDSA_MU_BYTES]); +// MLDSA44_verify_message_representative verifies that |signature| constitutes a +// valid signature for the pre-hashed message |msg_rep| using |public_key|. The +// |msg_rep| should be obtained via calls to |MLDSA44_prehash_init|, +// |MLDSA44_prehash_update| and |MLDSA44_prehash_finalize| using |public key| +// and the same context as when the signature was generated. Returns 1 on +// success or 0 on error. +OPENSSL_EXPORT int MLDSA44_verify_message_representative( + const struct MLDSA44_public_key *public_key, + const uint8_t *signature, size_t signature_len, + const uint8_t msg_rep[MLDSA_MU_BYTES]); + // MLDSA44_marshal_public_key serializes |public_key| to |out| in the standard // format for ML-DSA-44 public keys. It returns 1 on success or 0 on // allocation error. diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/nid.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/nid.h index 88a3e2ac91..83a1cf5929 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/nid.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/nid.h @@ -17,7 +17,7 @@ #ifndef OPENSSL_HEADER_NID_H #define OPENSSL_HEADER_NID_H -#include // IWYU pragma: export +#include // IWYU pragma: export #if defined(__cplusplus) extern "C" { @@ -34,7 +34,18 @@ extern "C" { // should instead embed the encodings of the few consumed OIDs and compare // against those. // -// These values should not be used outside of a single process; they are not +// Constants are defined as follows: +// +// - NID_foo is the integer NID of foo. +// - SN_foo is the "short name" of foo, omitted if there is no short name. +// - LN_foo is the "long name" of foo, omitted if there is no long name. +// - OBJ_foo expands to a comma-separated sequence of integers for foo's OID, +// omitted if foo has no OID. +// - OBJ_ENC_foo expands to a comma-separated sequence of bytes for foo's OID +// encoded in DER, excluding the tag and length. This is omitted if foo has +// no OID. +// +// NID values should not be used outside of a single process; they are not // stable identifiers. @@ -47,150 +58,193 @@ extern "C" { #define LN_rsadsi "RSA Data Security, Inc." #define NID_rsadsi 1 #define OBJ_rsadsi 1L, 2L, 840L, 113549L +#define OBJ_ENC_rsadsi 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d #define SN_pkcs "pkcs" #define LN_pkcs "RSA Data Security, Inc. PKCS" #define NID_pkcs 2 #define OBJ_pkcs 1L, 2L, 840L, 113549L, 1L +#define OBJ_ENC_pkcs 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01 #define SN_md2 "MD2" #define LN_md2 "md2" #define NID_md2 3 #define OBJ_md2 1L, 2L, 840L, 113549L, 2L, 2L +#define OBJ_ENC_md2 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x02 #define SN_md5 "MD5" #define LN_md5 "md5" #define NID_md5 4 #define OBJ_md5 1L, 2L, 840L, 113549L, 2L, 5L +#define OBJ_ENC_md5 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05 #define SN_rc4 "RC4" #define LN_rc4 "rc4" #define NID_rc4 5 #define OBJ_rc4 1L, 2L, 840L, 113549L, 3L, 4L +#define OBJ_ENC_rc4 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x04 #define LN_rsaEncryption "rsaEncryption" #define NID_rsaEncryption 6 #define OBJ_rsaEncryption 1L, 2L, 840L, 113549L, 1L, 1L, 1L +#define OBJ_ENC_rsaEncryption \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01 #define SN_md2WithRSAEncryption "RSA-MD2" #define LN_md2WithRSAEncryption "md2WithRSAEncryption" #define NID_md2WithRSAEncryption 7 #define OBJ_md2WithRSAEncryption 1L, 2L, 840L, 113549L, 1L, 1L, 2L +#define OBJ_ENC_md2WithRSAEncryption \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x02 #define SN_md5WithRSAEncryption "RSA-MD5" #define LN_md5WithRSAEncryption "md5WithRSAEncryption" #define NID_md5WithRSAEncryption 8 #define OBJ_md5WithRSAEncryption 1L, 2L, 840L, 113549L, 1L, 1L, 4L +#define OBJ_ENC_md5WithRSAEncryption \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04 #define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" #define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" #define NID_pbeWithMD2AndDES_CBC 9 #define OBJ_pbeWithMD2AndDES_CBC 1L, 2L, 840L, 113549L, 1L, 5L, 1L +#define OBJ_ENC_pbeWithMD2AndDES_CBC \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x01 #define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" #define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" #define NID_pbeWithMD5AndDES_CBC 10 #define OBJ_pbeWithMD5AndDES_CBC 1L, 2L, 840L, 113549L, 1L, 5L, 3L +#define OBJ_ENC_pbeWithMD5AndDES_CBC \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x03 #define SN_X500 "X500" #define LN_X500 "directory services (X.500)" #define NID_X500 11 #define OBJ_X500 2L, 5L +#define OBJ_ENC_X500 0x55 #define SN_X509 "X509" #define NID_X509 12 #define OBJ_X509 2L, 5L, 4L +#define OBJ_ENC_X509 0x55, 0x04 #define SN_commonName "CN" #define LN_commonName "commonName" #define NID_commonName 13 #define OBJ_commonName 2L, 5L, 4L, 3L +#define OBJ_ENC_commonName 0x55, 0x04, 0x03 #define SN_countryName "C" #define LN_countryName "countryName" #define NID_countryName 14 #define OBJ_countryName 2L, 5L, 4L, 6L +#define OBJ_ENC_countryName 0x55, 0x04, 0x06 #define SN_localityName "L" #define LN_localityName "localityName" #define NID_localityName 15 #define OBJ_localityName 2L, 5L, 4L, 7L +#define OBJ_ENC_localityName 0x55, 0x04, 0x07 #define SN_stateOrProvinceName "ST" #define LN_stateOrProvinceName "stateOrProvinceName" #define NID_stateOrProvinceName 16 #define OBJ_stateOrProvinceName 2L, 5L, 4L, 8L +#define OBJ_ENC_stateOrProvinceName 0x55, 0x04, 0x08 #define SN_organizationName "O" #define LN_organizationName "organizationName" #define NID_organizationName 17 #define OBJ_organizationName 2L, 5L, 4L, 10L +#define OBJ_ENC_organizationName 0x55, 0x04, 0x0a #define SN_organizationalUnitName "OU" #define LN_organizationalUnitName "organizationalUnitName" #define NID_organizationalUnitName 18 #define OBJ_organizationalUnitName 2L, 5L, 4L, 11L +#define OBJ_ENC_organizationalUnitName 0x55, 0x04, 0x0b #define SN_rsa "RSA" #define LN_rsa "rsa" #define NID_rsa 19 #define OBJ_rsa 2L, 5L, 8L, 1L, 1L +#define OBJ_ENC_rsa 0x55, 0x08, 0x01, 0x01 #define SN_pkcs7 "pkcs7" #define NID_pkcs7 20 #define OBJ_pkcs7 1L, 2L, 840L, 113549L, 1L, 7L +#define OBJ_ENC_pkcs7 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07 #define LN_pkcs7_data "pkcs7-data" #define NID_pkcs7_data 21 #define OBJ_pkcs7_data 1L, 2L, 840L, 113549L, 1L, 7L, 1L +#define OBJ_ENC_pkcs7_data 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01 #define LN_pkcs7_signed "pkcs7-signedData" #define NID_pkcs7_signed 22 #define OBJ_pkcs7_signed 1L, 2L, 840L, 113549L, 1L, 7L, 2L +#define OBJ_ENC_pkcs7_signed \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02 #define LN_pkcs7_enveloped "pkcs7-envelopedData" #define NID_pkcs7_enveloped 23 #define OBJ_pkcs7_enveloped 1L, 2L, 840L, 113549L, 1L, 7L, 3L +#define OBJ_ENC_pkcs7_enveloped \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x03 #define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" #define NID_pkcs7_signedAndEnveloped 24 #define OBJ_pkcs7_signedAndEnveloped 1L, 2L, 840L, 113549L, 1L, 7L, 4L +#define OBJ_ENC_pkcs7_signedAndEnveloped \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x04 #define LN_pkcs7_digest "pkcs7-digestData" #define NID_pkcs7_digest 25 #define OBJ_pkcs7_digest 1L, 2L, 840L, 113549L, 1L, 7L, 5L +#define OBJ_ENC_pkcs7_digest \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x05 #define LN_pkcs7_encrypted "pkcs7-encryptedData" #define NID_pkcs7_encrypted 26 #define OBJ_pkcs7_encrypted 1L, 2L, 840L, 113549L, 1L, 7L, 6L +#define OBJ_ENC_pkcs7_encrypted \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x06 #define SN_pkcs3 "pkcs3" #define NID_pkcs3 27 #define OBJ_pkcs3 1L, 2L, 840L, 113549L, 1L, 3L +#define OBJ_ENC_pkcs3 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x03 #define LN_dhKeyAgreement "dhKeyAgreement" #define NID_dhKeyAgreement 28 #define OBJ_dhKeyAgreement 1L, 2L, 840L, 113549L, 1L, 3L, 1L +#define OBJ_ENC_dhKeyAgreement \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x03, 0x01 #define SN_des_ecb "DES-ECB" #define LN_des_ecb "des-ecb" #define NID_des_ecb 29 #define OBJ_des_ecb 1L, 3L, 14L, 3L, 2L, 6L +#define OBJ_ENC_des_ecb 0x2b, 0x0e, 0x03, 0x02, 0x06 #define SN_des_cfb64 "DES-CFB" #define LN_des_cfb64 "des-cfb" #define NID_des_cfb64 30 #define OBJ_des_cfb64 1L, 3L, 14L, 3L, 2L, 9L +#define OBJ_ENC_des_cfb64 0x2b, 0x0e, 0x03, 0x02, 0x09 #define SN_des_cbc "DES-CBC" #define LN_des_cbc "des-cbc" #define NID_des_cbc 31 #define OBJ_des_cbc 1L, 3L, 14L, 3L, 2L, 7L +#define OBJ_ENC_des_cbc 0x2b, 0x0e, 0x03, 0x02, 0x07 #define SN_des_ede_ecb "DES-EDE" #define LN_des_ede_ecb "des-ede" #define NID_des_ede_ecb 32 #define OBJ_des_ede_ecb 1L, 3L, 14L, 3L, 2L, 17L +#define OBJ_ENC_des_ede_ecb 0x2b, 0x0e, 0x03, 0x02, 0x11 #define SN_des_ede3_ecb "DES-EDE3" #define LN_des_ede3_ecb "des-ede3" @@ -200,6 +254,8 @@ extern "C" { #define LN_idea_cbc "idea-cbc" #define NID_idea_cbc 34 #define OBJ_idea_cbc 1L, 3L, 6L, 1L, 4L, 1L, 188L, 7L, 1L, 1L, 2L +#define OBJ_ENC_idea_cbc \ + 0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0x3c, 0x07, 0x01, 0x01, 0x02 #define SN_idea_cfb64 "IDEA-CFB" #define LN_idea_cfb64 "idea-cfb" @@ -213,6 +269,7 @@ extern "C" { #define LN_rc2_cbc "rc2-cbc" #define NID_rc2_cbc 37 #define OBJ_rc2_cbc 1L, 2L, 840L, 113549L, 3L, 2L +#define OBJ_ENC_rc2_cbc 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x02 #define SN_rc2_ecb "RC2-ECB" #define LN_rc2_ecb "rc2-ecb" @@ -230,11 +287,13 @@ extern "C" { #define LN_sha "sha" #define NID_sha 41 #define OBJ_sha 1L, 3L, 14L, 3L, 2L, 18L +#define OBJ_ENC_sha 0x2b, 0x0e, 0x03, 0x02, 0x12 #define SN_shaWithRSAEncryption "RSA-SHA" #define LN_shaWithRSAEncryption "shaWithRSAEncryption" #define NID_shaWithRSAEncryption 42 #define OBJ_shaWithRSAEncryption 1L, 3L, 14L, 3L, 2L, 15L +#define OBJ_ENC_shaWithRSAEncryption 0x2b, 0x0e, 0x03, 0x02, 0x0f #define SN_des_ede_cbc "DES-EDE-CBC" #define LN_des_ede_cbc "des-ede-cbc" @@ -244,11 +303,13 @@ extern "C" { #define LN_des_ede3_cbc "des-ede3-cbc" #define NID_des_ede3_cbc 44 #define OBJ_des_ede3_cbc 1L, 2L, 840L, 113549L, 3L, 7L +#define OBJ_ENC_des_ede3_cbc 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x07 #define SN_des_ofb64 "DES-OFB" #define LN_des_ofb64 "des-ofb" #define NID_des_ofb64 45 #define OBJ_des_ofb64 1L, 3L, 14L, 3L, 2L, 8L +#define OBJ_ENC_des_ofb64 0x2b, 0x0e, 0x03, 0x02, 0x08 #define SN_idea_ofb64 "IDEA-OFB" #define LN_idea_ofb64 "idea-ofb" @@ -257,57 +318,81 @@ extern "C" { #define SN_pkcs9 "pkcs9" #define NID_pkcs9 47 #define OBJ_pkcs9 1L, 2L, 840L, 113549L, 1L, 9L +#define OBJ_ENC_pkcs9 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09 #define LN_pkcs9_emailAddress "emailAddress" #define NID_pkcs9_emailAddress 48 #define OBJ_pkcs9_emailAddress 1L, 2L, 840L, 113549L, 1L, 9L, 1L +#define OBJ_ENC_pkcs9_emailAddress \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01 #define LN_pkcs9_unstructuredName "unstructuredName" #define NID_pkcs9_unstructuredName 49 #define OBJ_pkcs9_unstructuredName 1L, 2L, 840L, 113549L, 1L, 9L, 2L +#define OBJ_ENC_pkcs9_unstructuredName \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x02 #define LN_pkcs9_contentType "contentType" #define NID_pkcs9_contentType 50 #define OBJ_pkcs9_contentType 1L, 2L, 840L, 113549L, 1L, 9L, 3L +#define OBJ_ENC_pkcs9_contentType \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x03 #define LN_pkcs9_messageDigest "messageDigest" #define NID_pkcs9_messageDigest 51 #define OBJ_pkcs9_messageDigest 1L, 2L, 840L, 113549L, 1L, 9L, 4L +#define OBJ_ENC_pkcs9_messageDigest \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x04 #define LN_pkcs9_signingTime "signingTime" #define NID_pkcs9_signingTime 52 #define OBJ_pkcs9_signingTime 1L, 2L, 840L, 113549L, 1L, 9L, 5L +#define OBJ_ENC_pkcs9_signingTime \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x05 #define LN_pkcs9_countersignature "countersignature" #define NID_pkcs9_countersignature 53 #define OBJ_pkcs9_countersignature 1L, 2L, 840L, 113549L, 1L, 9L, 6L +#define OBJ_ENC_pkcs9_countersignature \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x06 #define LN_pkcs9_challengePassword "challengePassword" #define NID_pkcs9_challengePassword 54 #define OBJ_pkcs9_challengePassword 1L, 2L, 840L, 113549L, 1L, 9L, 7L +#define OBJ_ENC_pkcs9_challengePassword \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x07 #define LN_pkcs9_unstructuredAddress "unstructuredAddress" #define NID_pkcs9_unstructuredAddress 55 #define OBJ_pkcs9_unstructuredAddress 1L, 2L, 840L, 113549L, 1L, 9L, 8L +#define OBJ_ENC_pkcs9_unstructuredAddress \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x08 #define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" #define NID_pkcs9_extCertAttributes 56 #define OBJ_pkcs9_extCertAttributes 1L, 2L, 840L, 113549L, 1L, 9L, 9L +#define OBJ_ENC_pkcs9_extCertAttributes \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x09 #define SN_netscape "Netscape" #define LN_netscape "Netscape Communications Corp." #define NID_netscape 57 #define OBJ_netscape 2L, 16L, 840L, 1L, 113730L +#define OBJ_ENC_netscape 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42 #define SN_netscape_cert_extension "nsCertExt" #define LN_netscape_cert_extension "Netscape Certificate Extension" #define NID_netscape_cert_extension 58 #define OBJ_netscape_cert_extension 2L, 16L, 840L, 1L, 113730L, 1L +#define OBJ_ENC_netscape_cert_extension \ + 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01 #define SN_netscape_data_type "nsDataType" #define LN_netscape_data_type "Netscape Data Type" #define NID_netscape_data_type 59 #define OBJ_netscape_data_type 2L, 16L, 840L, 1L, 113730L, 2L +#define OBJ_ENC_netscape_data_type \ + 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x02 #define SN_des_ede_cfb64 "DES-EDE-CFB" #define LN_des_ede_cfb64 "des-ede-cfb" @@ -329,80 +414,107 @@ extern "C" { #define LN_sha1 "sha1" #define NID_sha1 64 #define OBJ_sha1 1L, 3L, 14L, 3L, 2L, 26L +#define OBJ_ENC_sha1 0x2b, 0x0e, 0x03, 0x02, 0x1a #define SN_sha1WithRSAEncryption "RSA-SHA1" #define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" #define NID_sha1WithRSAEncryption 65 #define OBJ_sha1WithRSAEncryption 1L, 2L, 840L, 113549L, 1L, 1L, 5L +#define OBJ_ENC_sha1WithRSAEncryption \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05 #define SN_dsaWithSHA "DSA-SHA" #define LN_dsaWithSHA "dsaWithSHA" #define NID_dsaWithSHA 66 #define OBJ_dsaWithSHA 1L, 3L, 14L, 3L, 2L, 13L +#define OBJ_ENC_dsaWithSHA 0x2b, 0x0e, 0x03, 0x02, 0x0d #define SN_dsa_2 "DSA-old" #define LN_dsa_2 "dsaEncryption-old" #define NID_dsa_2 67 #define OBJ_dsa_2 1L, 3L, 14L, 3L, 2L, 12L +#define OBJ_ENC_dsa_2 0x2b, 0x0e, 0x03, 0x02, 0x0c #define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" #define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" #define NID_pbeWithSHA1AndRC2_CBC 68 #define OBJ_pbeWithSHA1AndRC2_CBC 1L, 2L, 840L, 113549L, 1L, 5L, 11L +#define OBJ_ENC_pbeWithSHA1AndRC2_CBC \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0b #define LN_id_pbkdf2 "PBKDF2" #define NID_id_pbkdf2 69 #define OBJ_id_pbkdf2 1L, 2L, 840L, 113549L, 1L, 5L, 12L +#define OBJ_ENC_id_pbkdf2 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0c #define SN_dsaWithSHA1_2 "DSA-SHA1-old" #define LN_dsaWithSHA1_2 "dsaWithSHA1-old" #define NID_dsaWithSHA1_2 70 #define OBJ_dsaWithSHA1_2 1L, 3L, 14L, 3L, 2L, 27L +#define OBJ_ENC_dsaWithSHA1_2 0x2b, 0x0e, 0x03, 0x02, 0x1b #define SN_netscape_cert_type "nsCertType" #define LN_netscape_cert_type "Netscape Cert Type" #define NID_netscape_cert_type 71 #define OBJ_netscape_cert_type 2L, 16L, 840L, 1L, 113730L, 1L, 1L +#define OBJ_ENC_netscape_cert_type \ + 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01 #define SN_netscape_base_url "nsBaseUrl" #define LN_netscape_base_url "Netscape Base Url" #define NID_netscape_base_url 72 #define OBJ_netscape_base_url 2L, 16L, 840L, 1L, 113730L, 1L, 2L +#define OBJ_ENC_netscape_base_url \ + 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x02 #define SN_netscape_revocation_url "nsRevocationUrl" #define LN_netscape_revocation_url "Netscape Revocation Url" #define NID_netscape_revocation_url 73 #define OBJ_netscape_revocation_url 2L, 16L, 840L, 1L, 113730L, 1L, 3L +#define OBJ_ENC_netscape_revocation_url \ + 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x03 #define SN_netscape_ca_revocation_url "nsCaRevocationUrl" #define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" #define NID_netscape_ca_revocation_url 74 #define OBJ_netscape_ca_revocation_url 2L, 16L, 840L, 1L, 113730L, 1L, 4L +#define OBJ_ENC_netscape_ca_revocation_url \ + 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x04 #define SN_netscape_renewal_url "nsRenewalUrl" #define LN_netscape_renewal_url "Netscape Renewal Url" #define NID_netscape_renewal_url 75 #define OBJ_netscape_renewal_url 2L, 16L, 840L, 1L, 113730L, 1L, 7L +#define OBJ_ENC_netscape_renewal_url \ + 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x07 #define SN_netscape_ca_policy_url "nsCaPolicyUrl" #define LN_netscape_ca_policy_url "Netscape CA Policy Url" #define NID_netscape_ca_policy_url 76 #define OBJ_netscape_ca_policy_url 2L, 16L, 840L, 1L, 113730L, 1L, 8L +#define OBJ_ENC_netscape_ca_policy_url \ + 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x08 #define SN_netscape_ssl_server_name "nsSslServerName" #define LN_netscape_ssl_server_name "Netscape SSL Server Name" #define NID_netscape_ssl_server_name 77 #define OBJ_netscape_ssl_server_name 2L, 16L, 840L, 1L, 113730L, 1L, 12L +#define OBJ_ENC_netscape_ssl_server_name \ + 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x0c #define SN_netscape_comment "nsComment" #define LN_netscape_comment "Netscape Comment" #define NID_netscape_comment 78 #define OBJ_netscape_comment 2L, 16L, 840L, 1L, 113730L, 1L, 13L +#define OBJ_ENC_netscape_comment \ + 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x0d #define SN_netscape_cert_sequence "nsCertSequence" #define LN_netscape_cert_sequence "Netscape Certificate Sequence" #define NID_netscape_cert_sequence 79 #define OBJ_netscape_cert_sequence 2L, 16L, 840L, 1L, 113730L, 2L, 5L +#define OBJ_ENC_netscape_cert_sequence \ + 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x02, 0x05 #define SN_desx_cbc "DESX-CBC" #define LN_desx_cbc "desx-cbc" @@ -411,56 +523,67 @@ extern "C" { #define SN_id_ce "id-ce" #define NID_id_ce 81 #define OBJ_id_ce 2L, 5L, 29L +#define OBJ_ENC_id_ce 0x55, 0x1d #define SN_subject_key_identifier "subjectKeyIdentifier" #define LN_subject_key_identifier "X509v3 Subject Key Identifier" #define NID_subject_key_identifier 82 #define OBJ_subject_key_identifier 2L, 5L, 29L, 14L +#define OBJ_ENC_subject_key_identifier 0x55, 0x1d, 0x0e #define SN_key_usage "keyUsage" #define LN_key_usage "X509v3 Key Usage" #define NID_key_usage 83 #define OBJ_key_usage 2L, 5L, 29L, 15L +#define OBJ_ENC_key_usage 0x55, 0x1d, 0x0f #define SN_private_key_usage_period "privateKeyUsagePeriod" #define LN_private_key_usage_period "X509v3 Private Key Usage Period" #define NID_private_key_usage_period 84 #define OBJ_private_key_usage_period 2L, 5L, 29L, 16L +#define OBJ_ENC_private_key_usage_period 0x55, 0x1d, 0x10 #define SN_subject_alt_name "subjectAltName" #define LN_subject_alt_name "X509v3 Subject Alternative Name" #define NID_subject_alt_name 85 #define OBJ_subject_alt_name 2L, 5L, 29L, 17L +#define OBJ_ENC_subject_alt_name 0x55, 0x1d, 0x11 #define SN_issuer_alt_name "issuerAltName" #define LN_issuer_alt_name "X509v3 Issuer Alternative Name" #define NID_issuer_alt_name 86 #define OBJ_issuer_alt_name 2L, 5L, 29L, 18L +#define OBJ_ENC_issuer_alt_name 0x55, 0x1d, 0x12 #define SN_basic_constraints "basicConstraints" #define LN_basic_constraints "X509v3 Basic Constraints" #define NID_basic_constraints 87 #define OBJ_basic_constraints 2L, 5L, 29L, 19L +#define OBJ_ENC_basic_constraints 0x55, 0x1d, 0x13 #define SN_crl_number "crlNumber" #define LN_crl_number "X509v3 CRL Number" #define NID_crl_number 88 #define OBJ_crl_number 2L, 5L, 29L, 20L +#define OBJ_ENC_crl_number 0x55, 0x1d, 0x14 #define SN_certificate_policies "certificatePolicies" #define LN_certificate_policies "X509v3 Certificate Policies" #define NID_certificate_policies 89 #define OBJ_certificate_policies 2L, 5L, 29L, 32L +#define OBJ_ENC_certificate_policies 0x55, 0x1d, 0x20 #define SN_authority_key_identifier "authorityKeyIdentifier" #define LN_authority_key_identifier "X509v3 Authority Key Identifier" #define NID_authority_key_identifier 90 #define OBJ_authority_key_identifier 2L, 5L, 29L, 35L +#define OBJ_ENC_authority_key_identifier 0x55, 0x1d, 0x23 #define SN_bf_cbc "BF-CBC" #define LN_bf_cbc "bf-cbc" #define NID_bf_cbc 91 #define OBJ_bf_cbc 1L, 3L, 6L, 1L, 4L, 1L, 3029L, 1L, 2L +#define OBJ_ENC_bf_cbc 0x2b, 0x06, 0x01, 0x04, 0x01, 0x97, 0x55, 0x01, 0x02 #define SN_bf_ecb "BF-ECB" #define LN_bf_ecb "bf-ecb" @@ -478,11 +601,13 @@ extern "C" { #define LN_mdc2 "mdc2" #define NID_mdc2 95 #define OBJ_mdc2 2L, 5L, 8L, 3L, 101L +#define OBJ_ENC_mdc2 0x55, 0x08, 0x03, 0x65 #define SN_mdc2WithRSA "RSA-MDC2" #define LN_mdc2WithRSA "mdc2WithRSA" #define NID_mdc2WithRSA 96 #define OBJ_mdc2WithRSA 2L, 5L, 8L, 3L, 100L +#define OBJ_ENC_mdc2WithRSA 0x55, 0x08, 0x03, 0x64 #define SN_rc4_40 "RC4-40" #define LN_rc4_40 "rc4-40" @@ -496,44 +621,53 @@ extern "C" { #define LN_givenName "givenName" #define NID_givenName 99 #define OBJ_givenName 2L, 5L, 4L, 42L +#define OBJ_ENC_givenName 0x55, 0x04, 0x2a #define SN_surname "SN" #define LN_surname "surname" #define NID_surname 100 #define OBJ_surname 2L, 5L, 4L, 4L +#define OBJ_ENC_surname 0x55, 0x04, 0x04 #define SN_initials "initials" #define LN_initials "initials" #define NID_initials 101 #define OBJ_initials 2L, 5L, 4L, 43L +#define OBJ_ENC_initials 0x55, 0x04, 0x2b #define SN_crl_distribution_points "crlDistributionPoints" #define LN_crl_distribution_points "X509v3 CRL Distribution Points" #define NID_crl_distribution_points 103 #define OBJ_crl_distribution_points 2L, 5L, 29L, 31L +#define OBJ_ENC_crl_distribution_points 0x55, 0x1d, 0x1f #define SN_md5WithRSA "RSA-NP-MD5" #define LN_md5WithRSA "md5WithRSA" #define NID_md5WithRSA 104 #define OBJ_md5WithRSA 1L, 3L, 14L, 3L, 2L, 3L +#define OBJ_ENC_md5WithRSA 0x2b, 0x0e, 0x03, 0x02, 0x03 #define LN_serialNumber "serialNumber" #define NID_serialNumber 105 #define OBJ_serialNumber 2L, 5L, 4L, 5L +#define OBJ_ENC_serialNumber 0x55, 0x04, 0x05 #define SN_title "title" #define LN_title "title" #define NID_title 106 #define OBJ_title 2L, 5L, 4L, 12L +#define OBJ_ENC_title 0x55, 0x04, 0x0c #define LN_description "description" #define NID_description 107 #define OBJ_description 2L, 5L, 4L, 13L +#define OBJ_ENC_description 0x55, 0x04, 0x0d #define SN_cast5_cbc "CAST5-CBC" #define LN_cast5_cbc "cast5-cbc" #define NID_cast5_cbc 108 #define OBJ_cast5_cbc 1L, 2L, 840L, 113533L, 7L, 66L, 10L +#define OBJ_ENC_cast5_cbc 0x2a, 0x86, 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x42, 0x0a #define SN_cast5_ecb "CAST5-ECB" #define LN_cast5_ecb "cast5-ecb" @@ -550,11 +684,14 @@ extern "C" { #define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" #define NID_pbeWithMD5AndCast5_CBC 112 #define OBJ_pbeWithMD5AndCast5_CBC 1L, 2L, 840L, 113533L, 7L, 66L, 12L +#define OBJ_ENC_pbeWithMD5AndCast5_CBC \ + 0x2a, 0x86, 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x42, 0x0c #define SN_dsaWithSHA1 "DSA-SHA1" #define LN_dsaWithSHA1 "dsaWithSHA1" #define NID_dsaWithSHA1 113 #define OBJ_dsaWithSHA1 1L, 2L, 840L, 10040L, 4L, 3L +#define OBJ_ENC_dsaWithSHA1 0x2a, 0x86, 0x48, 0xce, 0x38, 0x04, 0x03 #define SN_md5_sha1 "MD5-SHA1" #define LN_md5_sha1 "md5-sha1" @@ -564,26 +701,31 @@ extern "C" { #define LN_sha1WithRSA "sha1WithRSA" #define NID_sha1WithRSA 115 #define OBJ_sha1WithRSA 1L, 3L, 14L, 3L, 2L, 29L +#define OBJ_ENC_sha1WithRSA 0x2b, 0x0e, 0x03, 0x02, 0x1d #define SN_dsa "DSA" #define LN_dsa "dsaEncryption" #define NID_dsa 116 #define OBJ_dsa 1L, 2L, 840L, 10040L, 4L, 1L +#define OBJ_ENC_dsa 0x2a, 0x86, 0x48, 0xce, 0x38, 0x04, 0x01 #define SN_ripemd160 "RIPEMD160" #define LN_ripemd160 "ripemd160" #define NID_ripemd160 117 #define OBJ_ripemd160 1L, 3L, 36L, 3L, 2L, 1L +#define OBJ_ENC_ripemd160 0x2b, 0x24, 0x03, 0x02, 0x01 #define SN_ripemd160WithRSA "RSA-RIPEMD160" #define LN_ripemd160WithRSA "ripemd160WithRSA" #define NID_ripemd160WithRSA 119 #define OBJ_ripemd160WithRSA 1L, 3L, 36L, 3L, 3L, 1L, 2L +#define OBJ_ENC_ripemd160WithRSA 0x2b, 0x24, 0x03, 0x03, 0x01, 0x02 #define SN_rc5_cbc "RC5-CBC" #define LN_rc5_cbc "rc5-cbc" #define NID_rc5_cbc 120 #define OBJ_rc5_cbc 1L, 2L, 840L, 113549L, 3L, 8L +#define OBJ_ENC_rc5_cbc 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x08 #define SN_rc5_ecb "RC5-ECB" #define LN_rc5_ecb "rc5-ecb" @@ -601,192 +743,255 @@ extern "C" { #define LN_zlib_compression "zlib compression" #define NID_zlib_compression 125 #define OBJ_zlib_compression 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 3L, 8L +#define OBJ_ENC_zlib_compression \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x03, 0x08 #define SN_ext_key_usage "extendedKeyUsage" #define LN_ext_key_usage "X509v3 Extended Key Usage" #define NID_ext_key_usage 126 #define OBJ_ext_key_usage 2L, 5L, 29L, 37L +#define OBJ_ENC_ext_key_usage 0x55, 0x1d, 0x25 #define SN_id_pkix "PKIX" #define NID_id_pkix 127 #define OBJ_id_pkix 1L, 3L, 6L, 1L, 5L, 5L, 7L +#define OBJ_ENC_id_pkix 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07 #define SN_id_kp "id-kp" #define NID_id_kp 128 #define OBJ_id_kp 1L, 3L, 6L, 1L, 5L, 5L, 7L, 3L +#define OBJ_ENC_id_kp 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03 #define SN_server_auth "serverAuth" #define LN_server_auth "TLS Web Server Authentication" #define NID_server_auth 129 #define OBJ_server_auth 1L, 3L, 6L, 1L, 5L, 5L, 7L, 3L, 1L +#define OBJ_ENC_server_auth 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01 #define SN_client_auth "clientAuth" #define LN_client_auth "TLS Web Client Authentication" #define NID_client_auth 130 #define OBJ_client_auth 1L, 3L, 6L, 1L, 5L, 5L, 7L, 3L, 2L +#define OBJ_ENC_client_auth 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02 #define SN_code_sign "codeSigning" #define LN_code_sign "Code Signing" #define NID_code_sign 131 #define OBJ_code_sign 1L, 3L, 6L, 1L, 5L, 5L, 7L, 3L, 3L +#define OBJ_ENC_code_sign 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x03 #define SN_email_protect "emailProtection" #define LN_email_protect "E-mail Protection" #define NID_email_protect 132 #define OBJ_email_protect 1L, 3L, 6L, 1L, 5L, 5L, 7L, 3L, 4L +#define OBJ_ENC_email_protect 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x04 #define SN_time_stamp "timeStamping" #define LN_time_stamp "Time Stamping" #define NID_time_stamp 133 #define OBJ_time_stamp 1L, 3L, 6L, 1L, 5L, 5L, 7L, 3L, 8L +#define OBJ_ENC_time_stamp 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x08 #define SN_ms_code_ind "msCodeInd" #define LN_ms_code_ind "Microsoft Individual Code Signing" #define NID_ms_code_ind 134 #define OBJ_ms_code_ind 1L, 3L, 6L, 1L, 4L, 1L, 311L, 2L, 1L, 21L +#define OBJ_ENC_ms_code_ind \ + 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x15 #define SN_ms_code_com "msCodeCom" #define LN_ms_code_com "Microsoft Commercial Code Signing" #define NID_ms_code_com 135 #define OBJ_ms_code_com 1L, 3L, 6L, 1L, 4L, 1L, 311L, 2L, 1L, 22L +#define OBJ_ENC_ms_code_com \ + 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x16 #define SN_ms_ctl_sign "msCTLSign" #define LN_ms_ctl_sign "Microsoft Trust List Signing" #define NID_ms_ctl_sign 136 #define OBJ_ms_ctl_sign 1L, 3L, 6L, 1L, 4L, 1L, 311L, 10L, 3L, 1L +#define OBJ_ENC_ms_ctl_sign \ + 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x0a, 0x03, 0x01 #define SN_ms_sgc "msSGC" #define LN_ms_sgc "Microsoft Server Gated Crypto" #define NID_ms_sgc 137 #define OBJ_ms_sgc 1L, 3L, 6L, 1L, 4L, 1L, 311L, 10L, 3L, 3L +#define OBJ_ENC_ms_sgc \ + 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x0a, 0x03, 0x03 #define SN_ms_efs "msEFS" #define LN_ms_efs "Microsoft Encrypted File System" #define NID_ms_efs 138 #define OBJ_ms_efs 1L, 3L, 6L, 1L, 4L, 1L, 311L, 10L, 3L, 4L +#define OBJ_ENC_ms_efs \ + 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x0a, 0x03, 0x04 #define SN_ns_sgc "nsSGC" #define LN_ns_sgc "Netscape Server Gated Crypto" #define NID_ns_sgc 139 #define OBJ_ns_sgc 2L, 16L, 840L, 1L, 113730L, 4L, 1L +#define OBJ_ENC_ns_sgc 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x04, 0x01 #define SN_delta_crl "deltaCRL" #define LN_delta_crl "X509v3 Delta CRL Indicator" #define NID_delta_crl 140 #define OBJ_delta_crl 2L, 5L, 29L, 27L +#define OBJ_ENC_delta_crl 0x55, 0x1d, 0x1b #define SN_crl_reason "CRLReason" #define LN_crl_reason "X509v3 CRL Reason Code" #define NID_crl_reason 141 #define OBJ_crl_reason 2L, 5L, 29L, 21L +#define OBJ_ENC_crl_reason 0x55, 0x1d, 0x15 #define SN_invalidity_date "invalidityDate" #define LN_invalidity_date "Invalidity Date" #define NID_invalidity_date 142 #define OBJ_invalidity_date 2L, 5L, 29L, 24L +#define OBJ_ENC_invalidity_date 0x55, 0x1d, 0x18 #define SN_sxnet "SXNetID" #define LN_sxnet "Strong Extranet ID" #define NID_sxnet 143 #define OBJ_sxnet 1L, 3L, 101L, 1L, 4L, 1L +#define OBJ_ENC_sxnet 0x2b, 0x65, 0x01, 0x04, 0x01 #define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" #define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" #define NID_pbe_WithSHA1And128BitRC4 144 #define OBJ_pbe_WithSHA1And128BitRC4 1L, 2L, 840L, 113549L, 1L, 12L, 1L, 1L +#define OBJ_ENC_pbe_WithSHA1And128BitRC4 \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x01, 0x01 #define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" #define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" #define NID_pbe_WithSHA1And40BitRC4 145 #define OBJ_pbe_WithSHA1And40BitRC4 1L, 2L, 840L, 113549L, 1L, 12L, 1L, 2L +#define OBJ_ENC_pbe_WithSHA1And40BitRC4 \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x01, 0x02 #define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" #define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" #define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 #define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC \ 1L, 2L, 840L, 113549L, 1L, 12L, 1L, 3L +#define OBJ_ENC_pbe_WithSHA1And3_Key_TripleDES_CBC \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x01, 0x03 #define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" #define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" #define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 #define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC \ 1L, 2L, 840L, 113549L, 1L, 12L, 1L, 4L +#define OBJ_ENC_pbe_WithSHA1And2_Key_TripleDES_CBC \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x01, 0x04 #define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" #define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" #define NID_pbe_WithSHA1And128BitRC2_CBC 148 #define OBJ_pbe_WithSHA1And128BitRC2_CBC 1L, 2L, 840L, 113549L, 1L, 12L, 1L, 5L +#define OBJ_ENC_pbe_WithSHA1And128BitRC2_CBC \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x01, 0x05 #define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" #define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" #define NID_pbe_WithSHA1And40BitRC2_CBC 149 #define OBJ_pbe_WithSHA1And40BitRC2_CBC 1L, 2L, 840L, 113549L, 1L, 12L, 1L, 6L +#define OBJ_ENC_pbe_WithSHA1And40BitRC2_CBC \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x01, 0x06 #define LN_keyBag "keyBag" #define NID_keyBag 150 #define OBJ_keyBag 1L, 2L, 840L, 113549L, 1L, 12L, 10L, 1L, 1L +#define OBJ_ENC_keyBag \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x0a, 0x01, 0x01 #define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" #define NID_pkcs8ShroudedKeyBag 151 #define OBJ_pkcs8ShroudedKeyBag 1L, 2L, 840L, 113549L, 1L, 12L, 10L, 1L, 2L +#define OBJ_ENC_pkcs8ShroudedKeyBag \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x0a, 0x01, 0x02 #define LN_certBag "certBag" #define NID_certBag 152 #define OBJ_certBag 1L, 2L, 840L, 113549L, 1L, 12L, 10L, 1L, 3L +#define OBJ_ENC_certBag \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x0a, 0x01, 0x03 #define LN_crlBag "crlBag" #define NID_crlBag 153 #define OBJ_crlBag 1L, 2L, 840L, 113549L, 1L, 12L, 10L, 1L, 4L +#define OBJ_ENC_crlBag \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x0a, 0x01, 0x04 #define LN_secretBag "secretBag" #define NID_secretBag 154 #define OBJ_secretBag 1L, 2L, 840L, 113549L, 1L, 12L, 10L, 1L, 5L +#define OBJ_ENC_secretBag \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x0a, 0x01, 0x05 #define LN_safeContentsBag "safeContentsBag" #define NID_safeContentsBag 155 #define OBJ_safeContentsBag 1L, 2L, 840L, 113549L, 1L, 12L, 10L, 1L, 6L +#define OBJ_ENC_safeContentsBag \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x0a, 0x01, 0x06 #define LN_friendlyName "friendlyName" #define NID_friendlyName 156 #define OBJ_friendlyName 1L, 2L, 840L, 113549L, 1L, 9L, 20L +#define OBJ_ENC_friendlyName \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x14 #define LN_localKeyID "localKeyID" #define NID_localKeyID 157 #define OBJ_localKeyID 1L, 2L, 840L, 113549L, 1L, 9L, 21L +#define OBJ_ENC_localKeyID 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x15 #define LN_x509Certificate "x509Certificate" #define NID_x509Certificate 158 #define OBJ_x509Certificate 1L, 2L, 840L, 113549L, 1L, 9L, 22L, 1L +#define OBJ_ENC_x509Certificate \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x16, 0x01 #define LN_sdsiCertificate "sdsiCertificate" #define NID_sdsiCertificate 159 #define OBJ_sdsiCertificate 1L, 2L, 840L, 113549L, 1L, 9L, 22L, 2L +#define OBJ_ENC_sdsiCertificate \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x16, 0x02 #define LN_x509Crl "x509Crl" #define NID_x509Crl 160 #define OBJ_x509Crl 1L, 2L, 840L, 113549L, 1L, 9L, 23L, 1L +#define OBJ_ENC_x509Crl \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x17, 0x01 #define LN_pbes2 "PBES2" #define NID_pbes2 161 #define OBJ_pbes2 1L, 2L, 840L, 113549L, 1L, 5L, 13L +#define OBJ_ENC_pbes2 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0d #define LN_pbmac1 "PBMAC1" #define NID_pbmac1 162 #define OBJ_pbmac1 1L, 2L, 840L, 113549L, 1L, 5L, 14L +#define OBJ_ENC_pbmac1 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0e #define LN_hmacWithSHA1 "hmacWithSHA1" #define NID_hmacWithSHA1 163 #define OBJ_hmacWithSHA1 1L, 2L, 840L, 113549L, 2L, 7L +#define OBJ_ENC_hmacWithSHA1 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x07 #define SN_id_qt_cps "id-qt-cps" #define LN_id_qt_cps "Policy Qualifier CPS" #define NID_id_qt_cps 164 #define OBJ_id_qt_cps 1L, 3L, 6L, 1L, 5L, 5L, 7L, 2L, 1L +#define OBJ_ENC_id_qt_cps 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01 #define SN_id_qt_unotice "id-qt-unotice" #define LN_id_qt_unotice "Policy Qualifier User Notice" #define NID_id_qt_unotice 165 #define OBJ_id_qt_unotice 1L, 3L, 6L, 1L, 5L, 5L, 7L, 2L, 2L +#define OBJ_ENC_id_qt_unotice 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02 #define SN_rc2_64_cbc "RC2-64-CBC" #define LN_rc2_64_cbc "rc2-64-cbc" @@ -796,69 +1001,88 @@ extern "C" { #define LN_SMIMECapabilities "S/MIME Capabilities" #define NID_SMIMECapabilities 167 #define OBJ_SMIMECapabilities 1L, 2L, 840L, 113549L, 1L, 9L, 15L +#define OBJ_ENC_SMIMECapabilities \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x0f #define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" #define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" #define NID_pbeWithMD2AndRC2_CBC 168 #define OBJ_pbeWithMD2AndRC2_CBC 1L, 2L, 840L, 113549L, 1L, 5L, 4L +#define OBJ_ENC_pbeWithMD2AndRC2_CBC \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x04 #define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" #define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" #define NID_pbeWithMD5AndRC2_CBC 169 #define OBJ_pbeWithMD5AndRC2_CBC 1L, 2L, 840L, 113549L, 1L, 5L, 6L +#define OBJ_ENC_pbeWithMD5AndRC2_CBC \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x06 #define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" #define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" #define NID_pbeWithSHA1AndDES_CBC 170 #define OBJ_pbeWithSHA1AndDES_CBC 1L, 2L, 840L, 113549L, 1L, 5L, 10L +#define OBJ_ENC_pbeWithSHA1AndDES_CBC \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0a #define SN_ms_ext_req "msExtReq" #define LN_ms_ext_req "Microsoft Extension Request" #define NID_ms_ext_req 171 #define OBJ_ms_ext_req 1L, 3L, 6L, 1L, 4L, 1L, 311L, 2L, 1L, 14L +#define OBJ_ENC_ms_ext_req \ + 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0e #define SN_ext_req "extReq" #define LN_ext_req "Extension Request" #define NID_ext_req 172 #define OBJ_ext_req 1L, 2L, 840L, 113549L, 1L, 9L, 14L +#define OBJ_ENC_ext_req 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x0e #define SN_name "name" #define LN_name "name" #define NID_name 173 #define OBJ_name 2L, 5L, 4L, 41L +#define OBJ_ENC_name 0x55, 0x04, 0x29 #define SN_dnQualifier "dnQualifier" #define LN_dnQualifier "dnQualifier" #define NID_dnQualifier 174 #define OBJ_dnQualifier 2L, 5L, 4L, 46L +#define OBJ_ENC_dnQualifier 0x55, 0x04, 0x2e #define SN_id_pe "id-pe" #define NID_id_pe 175 #define OBJ_id_pe 1L, 3L, 6L, 1L, 5L, 5L, 7L, 1L +#define OBJ_ENC_id_pe 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01 #define SN_id_ad "id-ad" #define NID_id_ad 176 #define OBJ_id_ad 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L +#define OBJ_ENC_id_ad 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30 #define SN_info_access "authorityInfoAccess" #define LN_info_access "Authority Information Access" #define NID_info_access 177 #define OBJ_info_access 1L, 3L, 6L, 1L, 5L, 5L, 7L, 1L, 1L +#define OBJ_ENC_info_access 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01 #define SN_ad_OCSP "OCSP" #define LN_ad_OCSP "OCSP" #define NID_ad_OCSP 178 #define OBJ_ad_OCSP 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 1L +#define OBJ_ENC_ad_OCSP 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01 #define SN_ad_ca_issuers "caIssuers" #define LN_ad_ca_issuers "CA Issuers" #define NID_ad_ca_issuers 179 #define OBJ_ad_ca_issuers 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 2L +#define OBJ_ENC_ad_ca_issuers 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02 #define SN_OCSP_sign "OCSPSigning" #define LN_OCSP_sign "OCSP Signing" #define NID_OCSP_sign 180 #define OBJ_OCSP_sign 1L, 3L, 6L, 1L, 5L, 5L, 7L, 3L, 9L +#define OBJ_ENC_OCSP_sign 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x09 #define SN_iso "ISO" #define LN_iso "iso" @@ -869,1959 +1093,2630 @@ extern "C" { #define LN_member_body "ISO Member Body" #define NID_member_body 182 #define OBJ_member_body 1L, 2L +#define OBJ_ENC_member_body 0x2a #define SN_ISO_US "ISO-US" #define LN_ISO_US "ISO US Member Body" #define NID_ISO_US 183 #define OBJ_ISO_US 1L, 2L, 840L +#define OBJ_ENC_ISO_US 0x2a, 0x86, 0x48 #define SN_X9_57 "X9-57" #define LN_X9_57 "X9.57" #define NID_X9_57 184 #define OBJ_X9_57 1L, 2L, 840L, 10040L +#define OBJ_ENC_X9_57 0x2a, 0x86, 0x48, 0xce, 0x38 #define SN_X9cm "X9cm" #define LN_X9cm "X9.57 CM ?" #define NID_X9cm 185 #define OBJ_X9cm 1L, 2L, 840L, 10040L, 4L +#define OBJ_ENC_X9cm 0x2a, 0x86, 0x48, 0xce, 0x38, 0x04 #define SN_pkcs1 "pkcs1" #define NID_pkcs1 186 #define OBJ_pkcs1 1L, 2L, 840L, 113549L, 1L, 1L +#define OBJ_ENC_pkcs1 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01 #define SN_pkcs5 "pkcs5" #define NID_pkcs5 187 #define OBJ_pkcs5 1L, 2L, 840L, 113549L, 1L, 5L +#define OBJ_ENC_pkcs5 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05 #define SN_SMIME "SMIME" #define LN_SMIME "S/MIME" #define NID_SMIME 188 #define OBJ_SMIME 1L, 2L, 840L, 113549L, 1L, 9L, 16L +#define OBJ_ENC_SMIME 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10 #define SN_id_smime_mod "id-smime-mod" #define NID_id_smime_mod 189 #define OBJ_id_smime_mod 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 0L +#define OBJ_ENC_id_smime_mod \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x00 #define SN_id_smime_ct "id-smime-ct" #define NID_id_smime_ct 190 #define OBJ_id_smime_ct 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 1L +#define OBJ_ENC_id_smime_ct \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x01 #define SN_id_smime_aa "id-smime-aa" #define NID_id_smime_aa 191 #define OBJ_id_smime_aa 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L +#define OBJ_ENC_id_smime_aa \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02 #define SN_id_smime_alg "id-smime-alg" #define NID_id_smime_alg 192 #define OBJ_id_smime_alg 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 3L +#define OBJ_ENC_id_smime_alg \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x03 #define SN_id_smime_cd "id-smime-cd" #define NID_id_smime_cd 193 #define OBJ_id_smime_cd 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 4L +#define OBJ_ENC_id_smime_cd \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x04 #define SN_id_smime_spq "id-smime-spq" #define NID_id_smime_spq 194 #define OBJ_id_smime_spq 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 5L +#define OBJ_ENC_id_smime_spq \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x05 #define SN_id_smime_cti "id-smime-cti" #define NID_id_smime_cti 195 #define OBJ_id_smime_cti 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 6L +#define OBJ_ENC_id_smime_cti \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x06 #define SN_id_smime_mod_cms "id-smime-mod-cms" #define NID_id_smime_mod_cms 196 #define OBJ_id_smime_mod_cms 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 0L, 1L +#define OBJ_ENC_id_smime_mod_cms \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x00, 0x01 #define SN_id_smime_mod_ess "id-smime-mod-ess" #define NID_id_smime_mod_ess 197 #define OBJ_id_smime_mod_ess 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 0L, 2L +#define OBJ_ENC_id_smime_mod_ess \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x00, 0x02 #define SN_id_smime_mod_oid "id-smime-mod-oid" #define NID_id_smime_mod_oid 198 #define OBJ_id_smime_mod_oid 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 0L, 3L +#define OBJ_ENC_id_smime_mod_oid \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x00, 0x03 #define SN_id_smime_mod_msg_v3 "id-smime-mod-msg-v3" #define NID_id_smime_mod_msg_v3 199 #define OBJ_id_smime_mod_msg_v3 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 0L, 4L +#define OBJ_ENC_id_smime_mod_msg_v3 \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x00, 0x04 #define SN_id_smime_mod_ets_eSignature_88 "id-smime-mod-ets-eSignature-88" #define NID_id_smime_mod_ets_eSignature_88 200 #define OBJ_id_smime_mod_ets_eSignature_88 \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 0L, 5L +#define OBJ_ENC_id_smime_mod_ets_eSignature_88 \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x00, 0x05 #define SN_id_smime_mod_ets_eSignature_97 "id-smime-mod-ets-eSignature-97" #define NID_id_smime_mod_ets_eSignature_97 201 #define OBJ_id_smime_mod_ets_eSignature_97 \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 0L, 6L +#define OBJ_ENC_id_smime_mod_ets_eSignature_97 \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x00, 0x06 #define SN_id_smime_mod_ets_eSigPolicy_88 "id-smime-mod-ets-eSigPolicy-88" #define NID_id_smime_mod_ets_eSigPolicy_88 202 #define OBJ_id_smime_mod_ets_eSigPolicy_88 \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 0L, 7L +#define OBJ_ENC_id_smime_mod_ets_eSigPolicy_88 \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x00, 0x07 #define SN_id_smime_mod_ets_eSigPolicy_97 "id-smime-mod-ets-eSigPolicy-97" #define NID_id_smime_mod_ets_eSigPolicy_97 203 #define OBJ_id_smime_mod_ets_eSigPolicy_97 \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 0L, 8L +#define OBJ_ENC_id_smime_mod_ets_eSigPolicy_97 \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x00, 0x08 #define SN_id_smime_ct_receipt "id-smime-ct-receipt" #define NID_id_smime_ct_receipt 204 #define OBJ_id_smime_ct_receipt 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 1L, 1L +#define OBJ_ENC_id_smime_ct_receipt \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x01, 0x01 #define SN_id_smime_ct_authData "id-smime-ct-authData" #define NID_id_smime_ct_authData 205 #define OBJ_id_smime_ct_authData 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 1L, 2L +#define OBJ_ENC_id_smime_ct_authData \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x01, 0x02 #define SN_id_smime_ct_publishCert "id-smime-ct-publishCert" #define NID_id_smime_ct_publishCert 206 #define OBJ_id_smime_ct_publishCert 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 1L, 3L +#define OBJ_ENC_id_smime_ct_publishCert \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x01, 0x03 #define SN_id_smime_ct_TSTInfo "id-smime-ct-TSTInfo" #define NID_id_smime_ct_TSTInfo 207 #define OBJ_id_smime_ct_TSTInfo 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 1L, 4L +#define OBJ_ENC_id_smime_ct_TSTInfo \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x01, 0x04 #define SN_id_smime_ct_TDTInfo "id-smime-ct-TDTInfo" #define NID_id_smime_ct_TDTInfo 208 #define OBJ_id_smime_ct_TDTInfo 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 1L, 5L +#define OBJ_ENC_id_smime_ct_TDTInfo \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x01, 0x05 #define SN_id_smime_ct_contentInfo "id-smime-ct-contentInfo" #define NID_id_smime_ct_contentInfo 209 #define OBJ_id_smime_ct_contentInfo 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 1L, 6L +#define OBJ_ENC_id_smime_ct_contentInfo \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x01, 0x06 #define SN_id_smime_ct_DVCSRequestData "id-smime-ct-DVCSRequestData" #define NID_id_smime_ct_DVCSRequestData 210 #define OBJ_id_smime_ct_DVCSRequestData \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 1L, 7L +#define OBJ_ENC_id_smime_ct_DVCSRequestData \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x01, 0x07 #define SN_id_smime_ct_DVCSResponseData "id-smime-ct-DVCSResponseData" #define NID_id_smime_ct_DVCSResponseData 211 #define OBJ_id_smime_ct_DVCSResponseData \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 1L, 8L +#define OBJ_ENC_id_smime_ct_DVCSResponseData \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x01, 0x08 #define SN_id_smime_aa_receiptRequest "id-smime-aa-receiptRequest" #define NID_id_smime_aa_receiptRequest 212 #define OBJ_id_smime_aa_receiptRequest \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 1L +#define OBJ_ENC_id_smime_aa_receiptRequest \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x01 #define SN_id_smime_aa_securityLabel "id-smime-aa-securityLabel" #define NID_id_smime_aa_securityLabel 213 #define OBJ_id_smime_aa_securityLabel 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 2L +#define OBJ_ENC_id_smime_aa_securityLabel \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x02 #define SN_id_smime_aa_mlExpandHistory "id-smime-aa-mlExpandHistory" #define NID_id_smime_aa_mlExpandHistory 214 #define OBJ_id_smime_aa_mlExpandHistory \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 3L +#define OBJ_ENC_id_smime_aa_mlExpandHistory \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x03 #define SN_id_smime_aa_contentHint "id-smime-aa-contentHint" #define NID_id_smime_aa_contentHint 215 #define OBJ_id_smime_aa_contentHint 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 4L +#define OBJ_ENC_id_smime_aa_contentHint \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x04 #define SN_id_smime_aa_msgSigDigest "id-smime-aa-msgSigDigest" #define NID_id_smime_aa_msgSigDigest 216 #define OBJ_id_smime_aa_msgSigDigest 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 5L +#define OBJ_ENC_id_smime_aa_msgSigDigest \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x05 #define SN_id_smime_aa_encapContentType "id-smime-aa-encapContentType" #define NID_id_smime_aa_encapContentType 217 #define OBJ_id_smime_aa_encapContentType \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 6L +#define OBJ_ENC_id_smime_aa_encapContentType \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x06 #define SN_id_smime_aa_contentIdentifier "id-smime-aa-contentIdentifier" #define NID_id_smime_aa_contentIdentifier 218 #define OBJ_id_smime_aa_contentIdentifier \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 7L +#define OBJ_ENC_id_smime_aa_contentIdentifier \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x07 #define SN_id_smime_aa_macValue "id-smime-aa-macValue" #define NID_id_smime_aa_macValue 219 #define OBJ_id_smime_aa_macValue 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 8L +#define OBJ_ENC_id_smime_aa_macValue \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x08 #define SN_id_smime_aa_equivalentLabels "id-smime-aa-equivalentLabels" #define NID_id_smime_aa_equivalentLabels 220 #define OBJ_id_smime_aa_equivalentLabels \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 9L +#define OBJ_ENC_id_smime_aa_equivalentLabels \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x09 #define SN_id_smime_aa_contentReference "id-smime-aa-contentReference" #define NID_id_smime_aa_contentReference 221 #define OBJ_id_smime_aa_contentReference \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 10L +#define OBJ_ENC_id_smime_aa_contentReference \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x0a #define SN_id_smime_aa_encrypKeyPref "id-smime-aa-encrypKeyPref" #define NID_id_smime_aa_encrypKeyPref 222 #define OBJ_id_smime_aa_encrypKeyPref \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 11L +#define OBJ_ENC_id_smime_aa_encrypKeyPref \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x0b #define SN_id_smime_aa_signingCertificate "id-smime-aa-signingCertificate" #define NID_id_smime_aa_signingCertificate 223 #define OBJ_id_smime_aa_signingCertificate \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 12L +#define OBJ_ENC_id_smime_aa_signingCertificate \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x0c #define SN_id_smime_aa_smimeEncryptCerts "id-smime-aa-smimeEncryptCerts" #define NID_id_smime_aa_smimeEncryptCerts 224 #define OBJ_id_smime_aa_smimeEncryptCerts \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 13L +#define OBJ_ENC_id_smime_aa_smimeEncryptCerts \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x0d #define SN_id_smime_aa_timeStampToken "id-smime-aa-timeStampToken" #define NID_id_smime_aa_timeStampToken 225 #define OBJ_id_smime_aa_timeStampToken \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 14L +#define OBJ_ENC_id_smime_aa_timeStampToken \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x0e #define SN_id_smime_aa_ets_sigPolicyId "id-smime-aa-ets-sigPolicyId" #define NID_id_smime_aa_ets_sigPolicyId 226 #define OBJ_id_smime_aa_ets_sigPolicyId \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 15L +#define OBJ_ENC_id_smime_aa_ets_sigPolicyId \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x0f #define SN_id_smime_aa_ets_commitmentType "id-smime-aa-ets-commitmentType" #define NID_id_smime_aa_ets_commitmentType 227 #define OBJ_id_smime_aa_ets_commitmentType \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 16L +#define OBJ_ENC_id_smime_aa_ets_commitmentType \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x10 #define SN_id_smime_aa_ets_signerLocation "id-smime-aa-ets-signerLocation" #define NID_id_smime_aa_ets_signerLocation 228 #define OBJ_id_smime_aa_ets_signerLocation \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 17L +#define OBJ_ENC_id_smime_aa_ets_signerLocation \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x11 #define SN_id_smime_aa_ets_signerAttr "id-smime-aa-ets-signerAttr" #define NID_id_smime_aa_ets_signerAttr 229 #define OBJ_id_smime_aa_ets_signerAttr \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 18L +#define OBJ_ENC_id_smime_aa_ets_signerAttr \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x12 #define SN_id_smime_aa_ets_otherSigCert "id-smime-aa-ets-otherSigCert" #define NID_id_smime_aa_ets_otherSigCert 230 #define OBJ_id_smime_aa_ets_otherSigCert \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 19L +#define OBJ_ENC_id_smime_aa_ets_otherSigCert \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x13 #define SN_id_smime_aa_ets_contentTimestamp "id-smime-aa-ets-contentTimestamp" #define NID_id_smime_aa_ets_contentTimestamp 231 #define OBJ_id_smime_aa_ets_contentTimestamp \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 20L +#define OBJ_ENC_id_smime_aa_ets_contentTimestamp \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x14 #define SN_id_smime_aa_ets_CertificateRefs "id-smime-aa-ets-CertificateRefs" #define NID_id_smime_aa_ets_CertificateRefs 232 #define OBJ_id_smime_aa_ets_CertificateRefs \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 21L +#define OBJ_ENC_id_smime_aa_ets_CertificateRefs \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x15 #define SN_id_smime_aa_ets_RevocationRefs "id-smime-aa-ets-RevocationRefs" #define NID_id_smime_aa_ets_RevocationRefs 233 #define OBJ_id_smime_aa_ets_RevocationRefs \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 22L +#define OBJ_ENC_id_smime_aa_ets_RevocationRefs \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x16 #define SN_id_smime_aa_ets_certValues "id-smime-aa-ets-certValues" #define NID_id_smime_aa_ets_certValues 234 #define OBJ_id_smime_aa_ets_certValues \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 23L +#define OBJ_ENC_id_smime_aa_ets_certValues \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x17 #define SN_id_smime_aa_ets_revocationValues "id-smime-aa-ets-revocationValues" #define NID_id_smime_aa_ets_revocationValues 235 #define OBJ_id_smime_aa_ets_revocationValues \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 24L +#define OBJ_ENC_id_smime_aa_ets_revocationValues \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x18 #define SN_id_smime_aa_ets_escTimeStamp "id-smime-aa-ets-escTimeStamp" #define NID_id_smime_aa_ets_escTimeStamp 236 #define OBJ_id_smime_aa_ets_escTimeStamp \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 25L +#define OBJ_ENC_id_smime_aa_ets_escTimeStamp \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x19 #define SN_id_smime_aa_ets_certCRLTimestamp "id-smime-aa-ets-certCRLTimestamp" #define NID_id_smime_aa_ets_certCRLTimestamp 237 #define OBJ_id_smime_aa_ets_certCRLTimestamp \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 26L +#define OBJ_ENC_id_smime_aa_ets_certCRLTimestamp \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x1a #define SN_id_smime_aa_ets_archiveTimeStamp "id-smime-aa-ets-archiveTimeStamp" #define NID_id_smime_aa_ets_archiveTimeStamp 238 #define OBJ_id_smime_aa_ets_archiveTimeStamp \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 27L +#define OBJ_ENC_id_smime_aa_ets_archiveTimeStamp \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x1b #define SN_id_smime_aa_signatureType "id-smime-aa-signatureType" #define NID_id_smime_aa_signatureType 239 #define OBJ_id_smime_aa_signatureType \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 28L +#define OBJ_ENC_id_smime_aa_signatureType \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x1c #define SN_id_smime_aa_dvcs_dvc "id-smime-aa-dvcs-dvc" #define NID_id_smime_aa_dvcs_dvc 240 #define OBJ_id_smime_aa_dvcs_dvc 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 2L, 29L +#define OBJ_ENC_id_smime_aa_dvcs_dvc \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x02, 0x1d #define SN_id_smime_alg_ESDHwith3DES "id-smime-alg-ESDHwith3DES" #define NID_id_smime_alg_ESDHwith3DES 241 #define OBJ_id_smime_alg_ESDHwith3DES 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 3L, 1L +#define OBJ_ENC_id_smime_alg_ESDHwith3DES \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x03, 0x01 #define SN_id_smime_alg_ESDHwithRC2 "id-smime-alg-ESDHwithRC2" #define NID_id_smime_alg_ESDHwithRC2 242 #define OBJ_id_smime_alg_ESDHwithRC2 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 3L, 2L +#define OBJ_ENC_id_smime_alg_ESDHwithRC2 \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x03, 0x02 #define SN_id_smime_alg_3DESwrap "id-smime-alg-3DESwrap" #define NID_id_smime_alg_3DESwrap 243 #define OBJ_id_smime_alg_3DESwrap 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 3L, 3L +#define OBJ_ENC_id_smime_alg_3DESwrap \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x03, 0x03 #define SN_id_smime_alg_RC2wrap "id-smime-alg-RC2wrap" #define NID_id_smime_alg_RC2wrap 244 #define OBJ_id_smime_alg_RC2wrap 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 3L, 4L +#define OBJ_ENC_id_smime_alg_RC2wrap \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x03, 0x04 #define SN_id_smime_alg_ESDH "id-smime-alg-ESDH" #define NID_id_smime_alg_ESDH 245 #define OBJ_id_smime_alg_ESDH 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 3L, 5L +#define OBJ_ENC_id_smime_alg_ESDH \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x03, 0x05 #define SN_id_smime_alg_CMS3DESwrap "id-smime-alg-CMS3DESwrap" #define NID_id_smime_alg_CMS3DESwrap 246 #define OBJ_id_smime_alg_CMS3DESwrap 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 3L, 6L +#define OBJ_ENC_id_smime_alg_CMS3DESwrap \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x03, 0x06 #define SN_id_smime_alg_CMSRC2wrap "id-smime-alg-CMSRC2wrap" #define NID_id_smime_alg_CMSRC2wrap 247 #define OBJ_id_smime_alg_CMSRC2wrap 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 3L, 7L +#define OBJ_ENC_id_smime_alg_CMSRC2wrap \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x03, 0x07 #define SN_id_smime_cd_ldap "id-smime-cd-ldap" #define NID_id_smime_cd_ldap 248 #define OBJ_id_smime_cd_ldap 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 4L, 1L +#define OBJ_ENC_id_smime_cd_ldap \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x04, 0x01 #define SN_id_smime_spq_ets_sqt_uri "id-smime-spq-ets-sqt-uri" #define NID_id_smime_spq_ets_sqt_uri 249 #define OBJ_id_smime_spq_ets_sqt_uri 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 5L, 1L +#define OBJ_ENC_id_smime_spq_ets_sqt_uri \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x05, 0x01 #define SN_id_smime_spq_ets_sqt_unotice "id-smime-spq-ets-sqt-unotice" #define NID_id_smime_spq_ets_sqt_unotice 250 #define OBJ_id_smime_spq_ets_sqt_unotice \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 5L, 2L +#define OBJ_ENC_id_smime_spq_ets_sqt_unotice \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x05, 0x02 #define SN_id_smime_cti_ets_proofOfOrigin "id-smime-cti-ets-proofOfOrigin" #define NID_id_smime_cti_ets_proofOfOrigin 251 #define OBJ_id_smime_cti_ets_proofOfOrigin \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 6L, 1L +#define OBJ_ENC_id_smime_cti_ets_proofOfOrigin \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x06, 0x01 #define SN_id_smime_cti_ets_proofOfReceipt "id-smime-cti-ets-proofOfReceipt" #define NID_id_smime_cti_ets_proofOfReceipt 252 #define OBJ_id_smime_cti_ets_proofOfReceipt \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 6L, 2L +#define OBJ_ENC_id_smime_cti_ets_proofOfReceipt \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x06, 0x02 #define SN_id_smime_cti_ets_proofOfDelivery "id-smime-cti-ets-proofOfDelivery" #define NID_id_smime_cti_ets_proofOfDelivery 253 #define OBJ_id_smime_cti_ets_proofOfDelivery \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 6L, 3L +#define OBJ_ENC_id_smime_cti_ets_proofOfDelivery \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x06, 0x03 #define SN_id_smime_cti_ets_proofOfSender "id-smime-cti-ets-proofOfSender" #define NID_id_smime_cti_ets_proofOfSender 254 #define OBJ_id_smime_cti_ets_proofOfSender \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 6L, 4L +#define OBJ_ENC_id_smime_cti_ets_proofOfSender \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x06, 0x04 #define SN_id_smime_cti_ets_proofOfApproval "id-smime-cti-ets-proofOfApproval" #define NID_id_smime_cti_ets_proofOfApproval 255 #define OBJ_id_smime_cti_ets_proofOfApproval \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 6L, 5L +#define OBJ_ENC_id_smime_cti_ets_proofOfApproval \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x06, 0x05 #define SN_id_smime_cti_ets_proofOfCreation "id-smime-cti-ets-proofOfCreation" #define NID_id_smime_cti_ets_proofOfCreation 256 #define OBJ_id_smime_cti_ets_proofOfCreation \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 6L, 6L +#define OBJ_ENC_id_smime_cti_ets_proofOfCreation \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x06, 0x06 #define SN_md4 "MD4" #define LN_md4 "md4" #define NID_md4 257 #define OBJ_md4 1L, 2L, 840L, 113549L, 2L, 4L +#define OBJ_ENC_md4 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x04 #define SN_id_pkix_mod "id-pkix-mod" #define NID_id_pkix_mod 258 #define OBJ_id_pkix_mod 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L +#define OBJ_ENC_id_pkix_mod 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00 #define SN_id_qt "id-qt" #define NID_id_qt 259 #define OBJ_id_qt 1L, 3L, 6L, 1L, 5L, 5L, 7L, 2L +#define OBJ_ENC_id_qt 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02 #define SN_id_it "id-it" #define NID_id_it 260 #define OBJ_id_it 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L +#define OBJ_ENC_id_it 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04 #define SN_id_pkip "id-pkip" #define NID_id_pkip 261 #define OBJ_id_pkip 1L, 3L, 6L, 1L, 5L, 5L, 7L, 5L +#define OBJ_ENC_id_pkip 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x05 #define SN_id_alg "id-alg" #define NID_id_alg 262 #define OBJ_id_alg 1L, 3L, 6L, 1L, 5L, 5L, 7L, 6L +#define OBJ_ENC_id_alg 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x06 #define SN_id_cmc "id-cmc" #define NID_id_cmc 263 #define OBJ_id_cmc 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L +#define OBJ_ENC_id_cmc 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07 #define SN_id_on "id-on" #define NID_id_on 264 #define OBJ_id_on 1L, 3L, 6L, 1L, 5L, 5L, 7L, 8L +#define OBJ_ENC_id_on 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x08 #define SN_id_pda "id-pda" #define NID_id_pda 265 #define OBJ_id_pda 1L, 3L, 6L, 1L, 5L, 5L, 7L, 9L +#define OBJ_ENC_id_pda 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x09 #define SN_id_aca "id-aca" #define NID_id_aca 266 #define OBJ_id_aca 1L, 3L, 6L, 1L, 5L, 5L, 7L, 10L +#define OBJ_ENC_id_aca 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x0a #define SN_id_qcs "id-qcs" #define NID_id_qcs 267 #define OBJ_id_qcs 1L, 3L, 6L, 1L, 5L, 5L, 7L, 11L +#define OBJ_ENC_id_qcs 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x0b #define SN_id_cct "id-cct" #define NID_id_cct 268 #define OBJ_id_cct 1L, 3L, 6L, 1L, 5L, 5L, 7L, 12L +#define OBJ_ENC_id_cct 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x0c #define SN_id_pkix1_explicit_88 "id-pkix1-explicit-88" #define NID_id_pkix1_explicit_88 269 #define OBJ_id_pkix1_explicit_88 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 1L +#define OBJ_ENC_id_pkix1_explicit_88 \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x01 #define SN_id_pkix1_implicit_88 "id-pkix1-implicit-88" #define NID_id_pkix1_implicit_88 270 #define OBJ_id_pkix1_implicit_88 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 2L +#define OBJ_ENC_id_pkix1_implicit_88 \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x02 #define SN_id_pkix1_explicit_93 "id-pkix1-explicit-93" #define NID_id_pkix1_explicit_93 271 #define OBJ_id_pkix1_explicit_93 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 3L +#define OBJ_ENC_id_pkix1_explicit_93 \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x03 #define SN_id_pkix1_implicit_93 "id-pkix1-implicit-93" #define NID_id_pkix1_implicit_93 272 #define OBJ_id_pkix1_implicit_93 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 4L +#define OBJ_ENC_id_pkix1_implicit_93 \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x04 #define SN_id_mod_crmf "id-mod-crmf" #define NID_id_mod_crmf 273 #define OBJ_id_mod_crmf 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 5L +#define OBJ_ENC_id_mod_crmf 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x05 #define SN_id_mod_cmc "id-mod-cmc" #define NID_id_mod_cmc 274 #define OBJ_id_mod_cmc 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 6L +#define OBJ_ENC_id_mod_cmc 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x06 #define SN_id_mod_kea_profile_88 "id-mod-kea-profile-88" #define NID_id_mod_kea_profile_88 275 #define OBJ_id_mod_kea_profile_88 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 7L +#define OBJ_ENC_id_mod_kea_profile_88 \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x07 #define SN_id_mod_kea_profile_93 "id-mod-kea-profile-93" #define NID_id_mod_kea_profile_93 276 #define OBJ_id_mod_kea_profile_93 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 8L +#define OBJ_ENC_id_mod_kea_profile_93 \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x08 #define SN_id_mod_cmp "id-mod-cmp" #define NID_id_mod_cmp 277 #define OBJ_id_mod_cmp 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 9L +#define OBJ_ENC_id_mod_cmp 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x09 #define SN_id_mod_qualified_cert_88 "id-mod-qualified-cert-88" #define NID_id_mod_qualified_cert_88 278 #define OBJ_id_mod_qualified_cert_88 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 10L +#define OBJ_ENC_id_mod_qualified_cert_88 \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x0a #define SN_id_mod_qualified_cert_93 "id-mod-qualified-cert-93" #define NID_id_mod_qualified_cert_93 279 #define OBJ_id_mod_qualified_cert_93 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 11L +#define OBJ_ENC_id_mod_qualified_cert_93 \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x0b #define SN_id_mod_attribute_cert "id-mod-attribute-cert" #define NID_id_mod_attribute_cert 280 #define OBJ_id_mod_attribute_cert 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 12L +#define OBJ_ENC_id_mod_attribute_cert \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x0c #define SN_id_mod_timestamp_protocol "id-mod-timestamp-protocol" #define NID_id_mod_timestamp_protocol 281 #define OBJ_id_mod_timestamp_protocol 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 13L +#define OBJ_ENC_id_mod_timestamp_protocol \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x0d #define SN_id_mod_ocsp "id-mod-ocsp" #define NID_id_mod_ocsp 282 #define OBJ_id_mod_ocsp 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 14L +#define OBJ_ENC_id_mod_ocsp 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x0e #define SN_id_mod_dvcs "id-mod-dvcs" #define NID_id_mod_dvcs 283 #define OBJ_id_mod_dvcs 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 15L +#define OBJ_ENC_id_mod_dvcs 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x0f #define SN_id_mod_cmp2000 "id-mod-cmp2000" #define NID_id_mod_cmp2000 284 #define OBJ_id_mod_cmp2000 1L, 3L, 6L, 1L, 5L, 5L, 7L, 0L, 16L +#define OBJ_ENC_id_mod_cmp2000 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x00, 0x10 #define SN_biometricInfo "biometricInfo" #define LN_biometricInfo "Biometric Info" #define NID_biometricInfo 285 #define OBJ_biometricInfo 1L, 3L, 6L, 1L, 5L, 5L, 7L, 1L, 2L +#define OBJ_ENC_biometricInfo 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x02 #define SN_qcStatements "qcStatements" #define NID_qcStatements 286 #define OBJ_qcStatements 1L, 3L, 6L, 1L, 5L, 5L, 7L, 1L, 3L +#define OBJ_ENC_qcStatements 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x03 #define SN_ac_auditEntity "ac-auditEntity" #define NID_ac_auditEntity 287 #define OBJ_ac_auditEntity 1L, 3L, 6L, 1L, 5L, 5L, 7L, 1L, 4L +#define OBJ_ENC_ac_auditEntity 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x04 #define SN_ac_targeting "ac-targeting" #define NID_ac_targeting 288 #define OBJ_ac_targeting 1L, 3L, 6L, 1L, 5L, 5L, 7L, 1L, 5L +#define OBJ_ENC_ac_targeting 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x05 #define SN_aaControls "aaControls" #define NID_aaControls 289 #define OBJ_aaControls 1L, 3L, 6L, 1L, 5L, 5L, 7L, 1L, 6L +#define OBJ_ENC_aaControls 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x06 #define SN_sbgp_ipAddrBlock "sbgp-ipAddrBlock" #define NID_sbgp_ipAddrBlock 290 #define OBJ_sbgp_ipAddrBlock 1L, 3L, 6L, 1L, 5L, 5L, 7L, 1L, 7L +#define OBJ_ENC_sbgp_ipAddrBlock 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x07 #define SN_sbgp_autonomousSysNum "sbgp-autonomousSysNum" #define NID_sbgp_autonomousSysNum 291 #define OBJ_sbgp_autonomousSysNum 1L, 3L, 6L, 1L, 5L, 5L, 7L, 1L, 8L +#define OBJ_ENC_sbgp_autonomousSysNum \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x08 #define SN_sbgp_routerIdentifier "sbgp-routerIdentifier" #define NID_sbgp_routerIdentifier 292 #define OBJ_sbgp_routerIdentifier 1L, 3L, 6L, 1L, 5L, 5L, 7L, 1L, 9L +#define OBJ_ENC_sbgp_routerIdentifier \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x09 #define SN_textNotice "textNotice" #define NID_textNotice 293 #define OBJ_textNotice 1L, 3L, 6L, 1L, 5L, 5L, 7L, 2L, 3L +#define OBJ_ENC_textNotice 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x03 #define SN_ipsecEndSystem "ipsecEndSystem" #define LN_ipsecEndSystem "IPSec End System" #define NID_ipsecEndSystem 294 #define OBJ_ipsecEndSystem 1L, 3L, 6L, 1L, 5L, 5L, 7L, 3L, 5L +#define OBJ_ENC_ipsecEndSystem 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x05 #define SN_ipsecTunnel "ipsecTunnel" #define LN_ipsecTunnel "IPSec Tunnel" #define NID_ipsecTunnel 295 #define OBJ_ipsecTunnel 1L, 3L, 6L, 1L, 5L, 5L, 7L, 3L, 6L +#define OBJ_ENC_ipsecTunnel 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x06 #define SN_ipsecUser "ipsecUser" #define LN_ipsecUser "IPSec User" #define NID_ipsecUser 296 #define OBJ_ipsecUser 1L, 3L, 6L, 1L, 5L, 5L, 7L, 3L, 7L +#define OBJ_ENC_ipsecUser 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x07 #define SN_dvcs "DVCS" #define LN_dvcs "dvcs" #define NID_dvcs 297 #define OBJ_dvcs 1L, 3L, 6L, 1L, 5L, 5L, 7L, 3L, 10L +#define OBJ_ENC_dvcs 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x0a #define SN_id_it_caProtEncCert "id-it-caProtEncCert" #define NID_id_it_caProtEncCert 298 #define OBJ_id_it_caProtEncCert 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 1L +#define OBJ_ENC_id_it_caProtEncCert \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x01 #define SN_id_it_signKeyPairTypes "id-it-signKeyPairTypes" #define NID_id_it_signKeyPairTypes 299 #define OBJ_id_it_signKeyPairTypes 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 2L +#define OBJ_ENC_id_it_signKeyPairTypes \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x02 #define SN_id_it_encKeyPairTypes "id-it-encKeyPairTypes" #define NID_id_it_encKeyPairTypes 300 #define OBJ_id_it_encKeyPairTypes 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 3L +#define OBJ_ENC_id_it_encKeyPairTypes \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x03 #define SN_id_it_preferredSymmAlg "id-it-preferredSymmAlg" #define NID_id_it_preferredSymmAlg 301 #define OBJ_id_it_preferredSymmAlg 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 4L +#define OBJ_ENC_id_it_preferredSymmAlg \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x04 #define SN_id_it_caKeyUpdateInfo "id-it-caKeyUpdateInfo" #define NID_id_it_caKeyUpdateInfo 302 #define OBJ_id_it_caKeyUpdateInfo 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 5L +#define OBJ_ENC_id_it_caKeyUpdateInfo \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x05 #define SN_id_it_currentCRL "id-it-currentCRL" #define NID_id_it_currentCRL 303 #define OBJ_id_it_currentCRL 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 6L +#define OBJ_ENC_id_it_currentCRL 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x06 #define SN_id_it_unsupportedOIDs "id-it-unsupportedOIDs" #define NID_id_it_unsupportedOIDs 304 #define OBJ_id_it_unsupportedOIDs 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 7L +#define OBJ_ENC_id_it_unsupportedOIDs \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x07 #define SN_id_it_subscriptionRequest "id-it-subscriptionRequest" #define NID_id_it_subscriptionRequest 305 #define OBJ_id_it_subscriptionRequest 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 8L +#define OBJ_ENC_id_it_subscriptionRequest \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x08 #define SN_id_it_subscriptionResponse "id-it-subscriptionResponse" #define NID_id_it_subscriptionResponse 306 #define OBJ_id_it_subscriptionResponse 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 9L +#define OBJ_ENC_id_it_subscriptionResponse \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x09 #define SN_id_it_keyPairParamReq "id-it-keyPairParamReq" #define NID_id_it_keyPairParamReq 307 #define OBJ_id_it_keyPairParamReq 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 10L +#define OBJ_ENC_id_it_keyPairParamReq \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x0a #define SN_id_it_keyPairParamRep "id-it-keyPairParamRep" #define NID_id_it_keyPairParamRep 308 #define OBJ_id_it_keyPairParamRep 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 11L +#define OBJ_ENC_id_it_keyPairParamRep \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x0b #define SN_id_it_revPassphrase "id-it-revPassphrase" #define NID_id_it_revPassphrase 309 #define OBJ_id_it_revPassphrase 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 12L +#define OBJ_ENC_id_it_revPassphrase \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x0c #define SN_id_it_implicitConfirm "id-it-implicitConfirm" #define NID_id_it_implicitConfirm 310 #define OBJ_id_it_implicitConfirm 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 13L +#define OBJ_ENC_id_it_implicitConfirm \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x0d #define SN_id_it_confirmWaitTime "id-it-confirmWaitTime" #define NID_id_it_confirmWaitTime 311 #define OBJ_id_it_confirmWaitTime 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 14L +#define OBJ_ENC_id_it_confirmWaitTime \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x0e #define SN_id_it_origPKIMessage "id-it-origPKIMessage" #define NID_id_it_origPKIMessage 312 #define OBJ_id_it_origPKIMessage 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 15L +#define OBJ_ENC_id_it_origPKIMessage \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x0f #define SN_id_regCtrl "id-regCtrl" #define NID_id_regCtrl 313 #define OBJ_id_regCtrl 1L, 3L, 6L, 1L, 5L, 5L, 7L, 5L, 1L +#define OBJ_ENC_id_regCtrl 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x05, 0x01 #define SN_id_regInfo "id-regInfo" #define NID_id_regInfo 314 #define OBJ_id_regInfo 1L, 3L, 6L, 1L, 5L, 5L, 7L, 5L, 2L +#define OBJ_ENC_id_regInfo 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x05, 0x02 #define SN_id_regCtrl_regToken "id-regCtrl-regToken" #define NID_id_regCtrl_regToken 315 #define OBJ_id_regCtrl_regToken 1L, 3L, 6L, 1L, 5L, 5L, 7L, 5L, 1L, 1L +#define OBJ_ENC_id_regCtrl_regToken \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x05, 0x01, 0x01 #define SN_id_regCtrl_authenticator "id-regCtrl-authenticator" #define NID_id_regCtrl_authenticator 316 #define OBJ_id_regCtrl_authenticator 1L, 3L, 6L, 1L, 5L, 5L, 7L, 5L, 1L, 2L +#define OBJ_ENC_id_regCtrl_authenticator \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x05, 0x01, 0x02 #define SN_id_regCtrl_pkiPublicationInfo "id-regCtrl-pkiPublicationInfo" #define NID_id_regCtrl_pkiPublicationInfo 317 #define OBJ_id_regCtrl_pkiPublicationInfo 1L, 3L, 6L, 1L, 5L, 5L, 7L, 5L, 1L, 3L +#define OBJ_ENC_id_regCtrl_pkiPublicationInfo \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x05, 0x01, 0x03 #define SN_id_regCtrl_pkiArchiveOptions "id-regCtrl-pkiArchiveOptions" #define NID_id_regCtrl_pkiArchiveOptions 318 #define OBJ_id_regCtrl_pkiArchiveOptions 1L, 3L, 6L, 1L, 5L, 5L, 7L, 5L, 1L, 4L +#define OBJ_ENC_id_regCtrl_pkiArchiveOptions \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x05, 0x01, 0x04 #define SN_id_regCtrl_oldCertID "id-regCtrl-oldCertID" #define NID_id_regCtrl_oldCertID 319 #define OBJ_id_regCtrl_oldCertID 1L, 3L, 6L, 1L, 5L, 5L, 7L, 5L, 1L, 5L +#define OBJ_ENC_id_regCtrl_oldCertID \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x05, 0x01, 0x05 #define SN_id_regCtrl_protocolEncrKey "id-regCtrl-protocolEncrKey" #define NID_id_regCtrl_protocolEncrKey 320 #define OBJ_id_regCtrl_protocolEncrKey 1L, 3L, 6L, 1L, 5L, 5L, 7L, 5L, 1L, 6L +#define OBJ_ENC_id_regCtrl_protocolEncrKey \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x05, 0x01, 0x06 #define SN_id_regInfo_utf8Pairs "id-regInfo-utf8Pairs" #define NID_id_regInfo_utf8Pairs 321 #define OBJ_id_regInfo_utf8Pairs 1L, 3L, 6L, 1L, 5L, 5L, 7L, 5L, 2L, 1L +#define OBJ_ENC_id_regInfo_utf8Pairs \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x05, 0x02, 0x01 #define SN_id_regInfo_certReq "id-regInfo-certReq" #define NID_id_regInfo_certReq 322 #define OBJ_id_regInfo_certReq 1L, 3L, 6L, 1L, 5L, 5L, 7L, 5L, 2L, 2L +#define OBJ_ENC_id_regInfo_certReq \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x05, 0x02, 0x02 #define SN_id_alg_des40 "id-alg-des40" #define NID_id_alg_des40 323 #define OBJ_id_alg_des40 1L, 3L, 6L, 1L, 5L, 5L, 7L, 6L, 1L +#define OBJ_ENC_id_alg_des40 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x06, 0x01 #define SN_id_alg_noSignature "id-alg-noSignature" #define NID_id_alg_noSignature 324 #define OBJ_id_alg_noSignature 1L, 3L, 6L, 1L, 5L, 5L, 7L, 6L, 2L +#define OBJ_ENC_id_alg_noSignature \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x06, 0x02 #define SN_id_alg_dh_sig_hmac_sha1 "id-alg-dh-sig-hmac-sha1" #define NID_id_alg_dh_sig_hmac_sha1 325 #define OBJ_id_alg_dh_sig_hmac_sha1 1L, 3L, 6L, 1L, 5L, 5L, 7L, 6L, 3L +#define OBJ_ENC_id_alg_dh_sig_hmac_sha1 \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x06, 0x03 #define SN_id_alg_dh_pop "id-alg-dh-pop" #define NID_id_alg_dh_pop 326 #define OBJ_id_alg_dh_pop 1L, 3L, 6L, 1L, 5L, 5L, 7L, 6L, 4L +#define OBJ_ENC_id_alg_dh_pop 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x06, 0x04 #define SN_id_cmc_statusInfo "id-cmc-statusInfo" #define NID_id_cmc_statusInfo 327 #define OBJ_id_cmc_statusInfo 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 1L +#define OBJ_ENC_id_cmc_statusInfo 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x01 #define SN_id_cmc_identification "id-cmc-identification" #define NID_id_cmc_identification 328 #define OBJ_id_cmc_identification 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 2L +#define OBJ_ENC_id_cmc_identification \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x02 #define SN_id_cmc_identityProof "id-cmc-identityProof" #define NID_id_cmc_identityProof 329 #define OBJ_id_cmc_identityProof 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 3L +#define OBJ_ENC_id_cmc_identityProof \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x03 #define SN_id_cmc_dataReturn "id-cmc-dataReturn" #define NID_id_cmc_dataReturn 330 #define OBJ_id_cmc_dataReturn 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 4L +#define OBJ_ENC_id_cmc_dataReturn 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x04 #define SN_id_cmc_transactionId "id-cmc-transactionId" #define NID_id_cmc_transactionId 331 #define OBJ_id_cmc_transactionId 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 5L +#define OBJ_ENC_id_cmc_transactionId \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x05 #define SN_id_cmc_senderNonce "id-cmc-senderNonce" #define NID_id_cmc_senderNonce 332 #define OBJ_id_cmc_senderNonce 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 6L +#define OBJ_ENC_id_cmc_senderNonce \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x06 #define SN_id_cmc_recipientNonce "id-cmc-recipientNonce" #define NID_id_cmc_recipientNonce 333 #define OBJ_id_cmc_recipientNonce 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 7L +#define OBJ_ENC_id_cmc_recipientNonce \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x07 #define SN_id_cmc_addExtensions "id-cmc-addExtensions" #define NID_id_cmc_addExtensions 334 #define OBJ_id_cmc_addExtensions 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 8L +#define OBJ_ENC_id_cmc_addExtensions \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x08 #define SN_id_cmc_encryptedPOP "id-cmc-encryptedPOP" #define NID_id_cmc_encryptedPOP 335 #define OBJ_id_cmc_encryptedPOP 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 9L +#define OBJ_ENC_id_cmc_encryptedPOP \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x09 #define SN_id_cmc_decryptedPOP "id-cmc-decryptedPOP" #define NID_id_cmc_decryptedPOP 336 #define OBJ_id_cmc_decryptedPOP 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 10L +#define OBJ_ENC_id_cmc_decryptedPOP \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x0a #define SN_id_cmc_lraPOPWitness "id-cmc-lraPOPWitness" #define NID_id_cmc_lraPOPWitness 337 #define OBJ_id_cmc_lraPOPWitness 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 11L +#define OBJ_ENC_id_cmc_lraPOPWitness \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x0b #define SN_id_cmc_getCert "id-cmc-getCert" #define NID_id_cmc_getCert 338 #define OBJ_id_cmc_getCert 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 15L +#define OBJ_ENC_id_cmc_getCert 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x0f #define SN_id_cmc_getCRL "id-cmc-getCRL" #define NID_id_cmc_getCRL 339 #define OBJ_id_cmc_getCRL 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 16L +#define OBJ_ENC_id_cmc_getCRL 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x10 #define SN_id_cmc_revokeRequest "id-cmc-revokeRequest" #define NID_id_cmc_revokeRequest 340 #define OBJ_id_cmc_revokeRequest 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 17L +#define OBJ_ENC_id_cmc_revokeRequest \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x11 #define SN_id_cmc_regInfo "id-cmc-regInfo" #define NID_id_cmc_regInfo 341 #define OBJ_id_cmc_regInfo 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 18L +#define OBJ_ENC_id_cmc_regInfo 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x12 #define SN_id_cmc_responseInfo "id-cmc-responseInfo" #define NID_id_cmc_responseInfo 342 #define OBJ_id_cmc_responseInfo 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 19L +#define OBJ_ENC_id_cmc_responseInfo \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x13 #define SN_id_cmc_queryPending "id-cmc-queryPending" #define NID_id_cmc_queryPending 343 #define OBJ_id_cmc_queryPending 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 21L +#define OBJ_ENC_id_cmc_queryPending \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x15 #define SN_id_cmc_popLinkRandom "id-cmc-popLinkRandom" #define NID_id_cmc_popLinkRandom 344 #define OBJ_id_cmc_popLinkRandom 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 22L +#define OBJ_ENC_id_cmc_popLinkRandom \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x16 #define SN_id_cmc_popLinkWitness "id-cmc-popLinkWitness" #define NID_id_cmc_popLinkWitness 345 #define OBJ_id_cmc_popLinkWitness 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 23L +#define OBJ_ENC_id_cmc_popLinkWitness \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x17 #define SN_id_cmc_confirmCertAcceptance "id-cmc-confirmCertAcceptance" #define NID_id_cmc_confirmCertAcceptance 346 #define OBJ_id_cmc_confirmCertAcceptance 1L, 3L, 6L, 1L, 5L, 5L, 7L, 7L, 24L +#define OBJ_ENC_id_cmc_confirmCertAcceptance \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x07, 0x18 #define SN_id_on_personalData "id-on-personalData" #define NID_id_on_personalData 347 #define OBJ_id_on_personalData 1L, 3L, 6L, 1L, 5L, 5L, 7L, 8L, 1L +#define OBJ_ENC_id_on_personalData \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x08, 0x01 #define SN_id_pda_dateOfBirth "id-pda-dateOfBirth" #define NID_id_pda_dateOfBirth 348 #define OBJ_id_pda_dateOfBirth 1L, 3L, 6L, 1L, 5L, 5L, 7L, 9L, 1L +#define OBJ_ENC_id_pda_dateOfBirth \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x09, 0x01 #define SN_id_pda_placeOfBirth "id-pda-placeOfBirth" #define NID_id_pda_placeOfBirth 349 #define OBJ_id_pda_placeOfBirth 1L, 3L, 6L, 1L, 5L, 5L, 7L, 9L, 2L +#define OBJ_ENC_id_pda_placeOfBirth \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x09, 0x02 #define SN_id_pda_gender "id-pda-gender" #define NID_id_pda_gender 351 #define OBJ_id_pda_gender 1L, 3L, 6L, 1L, 5L, 5L, 7L, 9L, 3L +#define OBJ_ENC_id_pda_gender 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x09, 0x03 #define SN_id_pda_countryOfCitizenship "id-pda-countryOfCitizenship" #define NID_id_pda_countryOfCitizenship 352 #define OBJ_id_pda_countryOfCitizenship 1L, 3L, 6L, 1L, 5L, 5L, 7L, 9L, 4L +#define OBJ_ENC_id_pda_countryOfCitizenship \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x09, 0x04 #define SN_id_pda_countryOfResidence "id-pda-countryOfResidence" #define NID_id_pda_countryOfResidence 353 #define OBJ_id_pda_countryOfResidence 1L, 3L, 6L, 1L, 5L, 5L, 7L, 9L, 5L +#define OBJ_ENC_id_pda_countryOfResidence \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x09, 0x05 #define SN_id_aca_authenticationInfo "id-aca-authenticationInfo" #define NID_id_aca_authenticationInfo 354 #define OBJ_id_aca_authenticationInfo 1L, 3L, 6L, 1L, 5L, 5L, 7L, 10L, 1L +#define OBJ_ENC_id_aca_authenticationInfo \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x0a, 0x01 #define SN_id_aca_accessIdentity "id-aca-accessIdentity" #define NID_id_aca_accessIdentity 355 #define OBJ_id_aca_accessIdentity 1L, 3L, 6L, 1L, 5L, 5L, 7L, 10L, 2L +#define OBJ_ENC_id_aca_accessIdentity \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x0a, 0x02 #define SN_id_aca_chargingIdentity "id-aca-chargingIdentity" #define NID_id_aca_chargingIdentity 356 #define OBJ_id_aca_chargingIdentity 1L, 3L, 6L, 1L, 5L, 5L, 7L, 10L, 3L +#define OBJ_ENC_id_aca_chargingIdentity \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x0a, 0x03 #define SN_id_aca_group "id-aca-group" #define NID_id_aca_group 357 #define OBJ_id_aca_group 1L, 3L, 6L, 1L, 5L, 5L, 7L, 10L, 4L +#define OBJ_ENC_id_aca_group 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x0a, 0x04 #define SN_id_aca_role "id-aca-role" #define NID_id_aca_role 358 #define OBJ_id_aca_role 1L, 3L, 6L, 1L, 5L, 5L, 7L, 10L, 5L +#define OBJ_ENC_id_aca_role 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x0a, 0x05 #define SN_id_qcs_pkixQCSyntax_v1 "id-qcs-pkixQCSyntax-v1" #define NID_id_qcs_pkixQCSyntax_v1 359 #define OBJ_id_qcs_pkixQCSyntax_v1 1L, 3L, 6L, 1L, 5L, 5L, 7L, 11L, 1L +#define OBJ_ENC_id_qcs_pkixQCSyntax_v1 \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x0b, 0x01 #define SN_id_cct_crs "id-cct-crs" #define NID_id_cct_crs 360 #define OBJ_id_cct_crs 1L, 3L, 6L, 1L, 5L, 5L, 7L, 12L, 1L +#define OBJ_ENC_id_cct_crs 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x0c, 0x01 #define SN_id_cct_PKIData "id-cct-PKIData" #define NID_id_cct_PKIData 361 #define OBJ_id_cct_PKIData 1L, 3L, 6L, 1L, 5L, 5L, 7L, 12L, 2L +#define OBJ_ENC_id_cct_PKIData 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x0c, 0x02 #define SN_id_cct_PKIResponse "id-cct-PKIResponse" #define NID_id_cct_PKIResponse 362 #define OBJ_id_cct_PKIResponse 1L, 3L, 6L, 1L, 5L, 5L, 7L, 12L, 3L +#define OBJ_ENC_id_cct_PKIResponse \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x0c, 0x03 #define SN_ad_timeStamping "ad_timestamping" #define LN_ad_timeStamping "AD Time Stamping" #define NID_ad_timeStamping 363 #define OBJ_ad_timeStamping 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 3L +#define OBJ_ENC_ad_timeStamping 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x03 #define SN_ad_dvcs "AD_DVCS" #define LN_ad_dvcs "ad dvcs" #define NID_ad_dvcs 364 #define OBJ_ad_dvcs 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 4L +#define OBJ_ENC_ad_dvcs 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x04 #define SN_id_pkix_OCSP_basic "basicOCSPResponse" #define LN_id_pkix_OCSP_basic "Basic OCSP Response" #define NID_id_pkix_OCSP_basic 365 #define OBJ_id_pkix_OCSP_basic 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 1L, 1L +#define OBJ_ENC_id_pkix_OCSP_basic \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x01 #define SN_id_pkix_OCSP_Nonce "Nonce" #define LN_id_pkix_OCSP_Nonce "OCSP Nonce" #define NID_id_pkix_OCSP_Nonce 366 #define OBJ_id_pkix_OCSP_Nonce 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 1L, 2L +#define OBJ_ENC_id_pkix_OCSP_Nonce \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x02 #define SN_id_pkix_OCSP_CrlID "CrlID" #define LN_id_pkix_OCSP_CrlID "OCSP CRL ID" #define NID_id_pkix_OCSP_CrlID 367 #define OBJ_id_pkix_OCSP_CrlID 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 1L, 3L +#define OBJ_ENC_id_pkix_OCSP_CrlID \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x03 #define SN_id_pkix_OCSP_acceptableResponses "acceptableResponses" #define LN_id_pkix_OCSP_acceptableResponses "Acceptable OCSP Responses" #define NID_id_pkix_OCSP_acceptableResponses 368 #define OBJ_id_pkix_OCSP_acceptableResponses \ 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 1L, 4L +#define OBJ_ENC_id_pkix_OCSP_acceptableResponses \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x04 #define SN_id_pkix_OCSP_noCheck "noCheck" #define LN_id_pkix_OCSP_noCheck "OCSP No Check" #define NID_id_pkix_OCSP_noCheck 369 #define OBJ_id_pkix_OCSP_noCheck 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 1L, 5L +#define OBJ_ENC_id_pkix_OCSP_noCheck \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x05 #define SN_id_pkix_OCSP_archiveCutoff "archiveCutoff" #define LN_id_pkix_OCSP_archiveCutoff "OCSP Archive Cutoff" #define NID_id_pkix_OCSP_archiveCutoff 370 #define OBJ_id_pkix_OCSP_archiveCutoff 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 1L, 6L +#define OBJ_ENC_id_pkix_OCSP_archiveCutoff \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x06 #define SN_id_pkix_OCSP_serviceLocator "serviceLocator" #define LN_id_pkix_OCSP_serviceLocator "OCSP Service Locator" #define NID_id_pkix_OCSP_serviceLocator 371 #define OBJ_id_pkix_OCSP_serviceLocator 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 1L, 7L +#define OBJ_ENC_id_pkix_OCSP_serviceLocator \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x07 #define SN_id_pkix_OCSP_extendedStatus "extendedStatus" #define LN_id_pkix_OCSP_extendedStatus "Extended OCSP Status" #define NID_id_pkix_OCSP_extendedStatus 372 #define OBJ_id_pkix_OCSP_extendedStatus 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 1L, 8L +#define OBJ_ENC_id_pkix_OCSP_extendedStatus \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x08 #define SN_id_pkix_OCSP_valid "valid" #define NID_id_pkix_OCSP_valid 373 #define OBJ_id_pkix_OCSP_valid 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 1L, 9L +#define OBJ_ENC_id_pkix_OCSP_valid \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x09 #define SN_id_pkix_OCSP_path "path" #define NID_id_pkix_OCSP_path 374 #define OBJ_id_pkix_OCSP_path 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 1L, 10L +#define OBJ_ENC_id_pkix_OCSP_path \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x0a #define SN_id_pkix_OCSP_trustRoot "trustRoot" #define LN_id_pkix_OCSP_trustRoot "Trust Root" #define NID_id_pkix_OCSP_trustRoot 375 #define OBJ_id_pkix_OCSP_trustRoot 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 1L, 11L +#define OBJ_ENC_id_pkix_OCSP_trustRoot \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x0b #define SN_algorithm "algorithm" #define LN_algorithm "algorithm" #define NID_algorithm 376 #define OBJ_algorithm 1L, 3L, 14L, 3L, 2L +#define OBJ_ENC_algorithm 0x2b, 0x0e, 0x03, 0x02 #define SN_rsaSignature "rsaSignature" #define NID_rsaSignature 377 #define OBJ_rsaSignature 1L, 3L, 14L, 3L, 2L, 11L +#define OBJ_ENC_rsaSignature 0x2b, 0x0e, 0x03, 0x02, 0x0b #define SN_X500algorithms "X500algorithms" #define LN_X500algorithms "directory services - algorithms" #define NID_X500algorithms 378 #define OBJ_X500algorithms 2L, 5L, 8L +#define OBJ_ENC_X500algorithms 0x55, 0x08 #define SN_org "ORG" #define LN_org "org" #define NID_org 379 #define OBJ_org 1L, 3L +#define OBJ_ENC_org 0x2b #define SN_dod "DOD" #define LN_dod "dod" #define NID_dod 380 #define OBJ_dod 1L, 3L, 6L +#define OBJ_ENC_dod 0x2b, 0x06 #define SN_iana "IANA" #define LN_iana "iana" #define NID_iana 381 #define OBJ_iana 1L, 3L, 6L, 1L +#define OBJ_ENC_iana 0x2b, 0x06, 0x01 #define SN_Directory "directory" #define LN_Directory "Directory" #define NID_Directory 382 #define OBJ_Directory 1L, 3L, 6L, 1L, 1L +#define OBJ_ENC_Directory 0x2b, 0x06, 0x01, 0x01 #define SN_Management "mgmt" #define LN_Management "Management" #define NID_Management 383 #define OBJ_Management 1L, 3L, 6L, 1L, 2L +#define OBJ_ENC_Management 0x2b, 0x06, 0x01, 0x02 #define SN_Experimental "experimental" #define LN_Experimental "Experimental" #define NID_Experimental 384 #define OBJ_Experimental 1L, 3L, 6L, 1L, 3L +#define OBJ_ENC_Experimental 0x2b, 0x06, 0x01, 0x03 #define SN_Private "private" #define LN_Private "Private" #define NID_Private 385 #define OBJ_Private 1L, 3L, 6L, 1L, 4L +#define OBJ_ENC_Private 0x2b, 0x06, 0x01, 0x04 #define SN_Security "security" #define LN_Security "Security" #define NID_Security 386 #define OBJ_Security 1L, 3L, 6L, 1L, 5L +#define OBJ_ENC_Security 0x2b, 0x06, 0x01, 0x05 #define SN_SNMPv2 "snmpv2" #define LN_SNMPv2 "SNMPv2" #define NID_SNMPv2 387 #define OBJ_SNMPv2 1L, 3L, 6L, 1L, 6L +#define OBJ_ENC_SNMPv2 0x2b, 0x06, 0x01, 0x06 #define LN_Mail "Mail" #define NID_Mail 388 #define OBJ_Mail 1L, 3L, 6L, 1L, 7L +#define OBJ_ENC_Mail 0x2b, 0x06, 0x01, 0x07 #define SN_Enterprises "enterprises" #define LN_Enterprises "Enterprises" #define NID_Enterprises 389 #define OBJ_Enterprises 1L, 3L, 6L, 1L, 4L, 1L +#define OBJ_ENC_Enterprises 0x2b, 0x06, 0x01, 0x04, 0x01 #define SN_dcObject "dcobject" #define LN_dcObject "dcObject" #define NID_dcObject 390 #define OBJ_dcObject 1L, 3L, 6L, 1L, 4L, 1L, 1466L, 344L +#define OBJ_ENC_dcObject 0x2b, 0x06, 0x01, 0x04, 0x01, 0x8b, 0x3a, 0x82, 0x58 #define SN_domainComponent "DC" #define LN_domainComponent "domainComponent" #define NID_domainComponent 391 #define OBJ_domainComponent 0L, 9L, 2342L, 19200300L, 100L, 1L, 25L +#define OBJ_ENC_domainComponent \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x19 #define SN_Domain "domain" #define LN_Domain "Domain" #define NID_Domain 392 #define OBJ_Domain 0L, 9L, 2342L, 19200300L, 100L, 4L, 13L +#define OBJ_ENC_Domain \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x0d #define SN_selected_attribute_types "selected-attribute-types" #define LN_selected_attribute_types "Selected Attribute Types" #define NID_selected_attribute_types 394 #define OBJ_selected_attribute_types 2L, 5L, 1L, 5L +#define OBJ_ENC_selected_attribute_types 0x55, 0x01, 0x05 #define SN_clearance "clearance" #define NID_clearance 395 #define OBJ_clearance 2L, 5L, 1L, 5L, 55L +#define OBJ_ENC_clearance 0x55, 0x01, 0x05, 0x37 #define SN_md4WithRSAEncryption "RSA-MD4" #define LN_md4WithRSAEncryption "md4WithRSAEncryption" #define NID_md4WithRSAEncryption 396 #define OBJ_md4WithRSAEncryption 1L, 2L, 840L, 113549L, 1L, 1L, 3L +#define OBJ_ENC_md4WithRSAEncryption \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x03 #define SN_ac_proxying "ac-proxying" #define NID_ac_proxying 397 #define OBJ_ac_proxying 1L, 3L, 6L, 1L, 5L, 5L, 7L, 1L, 10L +#define OBJ_ENC_ac_proxying 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x0a #define SN_sinfo_access "subjectInfoAccess" #define LN_sinfo_access "Subject Information Access" #define NID_sinfo_access 398 #define OBJ_sinfo_access 1L, 3L, 6L, 1L, 5L, 5L, 7L, 1L, 11L +#define OBJ_ENC_sinfo_access 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x0b #define SN_id_aca_encAttrs "id-aca-encAttrs" #define NID_id_aca_encAttrs 399 #define OBJ_id_aca_encAttrs 1L, 3L, 6L, 1L, 5L, 5L, 7L, 10L, 6L +#define OBJ_ENC_id_aca_encAttrs 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x0a, 0x06 #define SN_role "role" #define LN_role "role" #define NID_role 400 #define OBJ_role 2L, 5L, 4L, 72L +#define OBJ_ENC_role 0x55, 0x04, 0x48 #define SN_policy_constraints "policyConstraints" #define LN_policy_constraints "X509v3 Policy Constraints" #define NID_policy_constraints 401 #define OBJ_policy_constraints 2L, 5L, 29L, 36L +#define OBJ_ENC_policy_constraints 0x55, 0x1d, 0x24 #define SN_target_information "targetInformation" #define LN_target_information "X509v3 AC Targeting" #define NID_target_information 402 #define OBJ_target_information 2L, 5L, 29L, 55L +#define OBJ_ENC_target_information 0x55, 0x1d, 0x37 #define SN_no_rev_avail "noRevAvail" #define LN_no_rev_avail "X509v3 No Revocation Available" #define NID_no_rev_avail 403 #define OBJ_no_rev_avail 2L, 5L, 29L, 56L +#define OBJ_ENC_no_rev_avail 0x55, 0x1d, 0x38 #define SN_ansi_X9_62 "ansi-X9-62" #define LN_ansi_X9_62 "ANSI X9.62" #define NID_ansi_X9_62 405 #define OBJ_ansi_X9_62 1L, 2L, 840L, 10045L +#define OBJ_ENC_ansi_X9_62 0x2a, 0x86, 0x48, 0xce, 0x3d #define SN_X9_62_prime_field "prime-field" #define NID_X9_62_prime_field 406 #define OBJ_X9_62_prime_field 1L, 2L, 840L, 10045L, 1L, 1L +#define OBJ_ENC_X9_62_prime_field 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x01, 0x01 #define SN_X9_62_characteristic_two_field "characteristic-two-field" #define NID_X9_62_characteristic_two_field 407 #define OBJ_X9_62_characteristic_two_field 1L, 2L, 840L, 10045L, 1L, 2L +#define OBJ_ENC_X9_62_characteristic_two_field \ + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x01, 0x02 #define SN_X9_62_id_ecPublicKey "id-ecPublicKey" #define NID_X9_62_id_ecPublicKey 408 #define OBJ_X9_62_id_ecPublicKey 1L, 2L, 840L, 10045L, 2L, 1L +#define OBJ_ENC_X9_62_id_ecPublicKey 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01 #define SN_X9_62_prime192v1 "prime192v1" #define NID_X9_62_prime192v1 409 #define OBJ_X9_62_prime192v1 1L, 2L, 840L, 10045L, 3L, 1L, 1L +#define OBJ_ENC_X9_62_prime192v1 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x01 #define SN_X9_62_prime192v2 "prime192v2" #define NID_X9_62_prime192v2 410 #define OBJ_X9_62_prime192v2 1L, 2L, 840L, 10045L, 3L, 1L, 2L +#define OBJ_ENC_X9_62_prime192v2 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x02 #define SN_X9_62_prime192v3 "prime192v3" #define NID_X9_62_prime192v3 411 #define OBJ_X9_62_prime192v3 1L, 2L, 840L, 10045L, 3L, 1L, 3L +#define OBJ_ENC_X9_62_prime192v3 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x03 #define SN_X9_62_prime239v1 "prime239v1" #define NID_X9_62_prime239v1 412 #define OBJ_X9_62_prime239v1 1L, 2L, 840L, 10045L, 3L, 1L, 4L +#define OBJ_ENC_X9_62_prime239v1 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x04 #define SN_X9_62_prime239v2 "prime239v2" #define NID_X9_62_prime239v2 413 #define OBJ_X9_62_prime239v2 1L, 2L, 840L, 10045L, 3L, 1L, 5L +#define OBJ_ENC_X9_62_prime239v2 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x05 #define SN_X9_62_prime239v3 "prime239v3" #define NID_X9_62_prime239v3 414 #define OBJ_X9_62_prime239v3 1L, 2L, 840L, 10045L, 3L, 1L, 6L +#define OBJ_ENC_X9_62_prime239v3 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x06 #define SN_X9_62_prime256v1 "prime256v1" #define NID_X9_62_prime256v1 415 #define OBJ_X9_62_prime256v1 1L, 2L, 840L, 10045L, 3L, 1L, 7L +#define OBJ_ENC_X9_62_prime256v1 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07 #define SN_ecdsa_with_SHA1 "ecdsa-with-SHA1" #define NID_ecdsa_with_SHA1 416 #define OBJ_ecdsa_with_SHA1 1L, 2L, 840L, 10045L, 4L, 1L +#define OBJ_ENC_ecdsa_with_SHA1 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x01 #define SN_ms_csp_name "CSPName" #define LN_ms_csp_name "Microsoft CSP Name" #define NID_ms_csp_name 417 #define OBJ_ms_csp_name 1L, 3L, 6L, 1L, 4L, 1L, 311L, 17L, 1L +#define OBJ_ENC_ms_csp_name 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x11, 0x01 #define SN_aes_128_ecb "AES-128-ECB" #define LN_aes_128_ecb "aes-128-ecb" #define NID_aes_128_ecb 418 #define OBJ_aes_128_ecb 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 1L +#define OBJ_ENC_aes_128_ecb 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x01 #define SN_aes_128_cbc "AES-128-CBC" #define LN_aes_128_cbc "aes-128-cbc" #define NID_aes_128_cbc 419 #define OBJ_aes_128_cbc 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 2L +#define OBJ_ENC_aes_128_cbc 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x02 #define SN_aes_128_ofb128 "AES-128-OFB" #define LN_aes_128_ofb128 "aes-128-ofb" #define NID_aes_128_ofb128 420 #define OBJ_aes_128_ofb128 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 3L +#define OBJ_ENC_aes_128_ofb128 \ + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x03 #define SN_aes_128_cfb128 "AES-128-CFB" #define LN_aes_128_cfb128 "aes-128-cfb" #define NID_aes_128_cfb128 421 #define OBJ_aes_128_cfb128 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 4L +#define OBJ_ENC_aes_128_cfb128 \ + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x04 #define SN_aes_192_ecb "AES-192-ECB" #define LN_aes_192_ecb "aes-192-ecb" #define NID_aes_192_ecb 422 #define OBJ_aes_192_ecb 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 21L +#define OBJ_ENC_aes_192_ecb 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x15 #define SN_aes_192_cbc "AES-192-CBC" #define LN_aes_192_cbc "aes-192-cbc" #define NID_aes_192_cbc 423 #define OBJ_aes_192_cbc 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 22L +#define OBJ_ENC_aes_192_cbc 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x16 #define SN_aes_192_ofb128 "AES-192-OFB" #define LN_aes_192_ofb128 "aes-192-ofb" #define NID_aes_192_ofb128 424 #define OBJ_aes_192_ofb128 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 23L +#define OBJ_ENC_aes_192_ofb128 \ + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x17 #define SN_aes_192_cfb128 "AES-192-CFB" #define LN_aes_192_cfb128 "aes-192-cfb" #define NID_aes_192_cfb128 425 #define OBJ_aes_192_cfb128 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 24L +#define OBJ_ENC_aes_192_cfb128 \ + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x18 #define SN_aes_256_ecb "AES-256-ECB" #define LN_aes_256_ecb "aes-256-ecb" #define NID_aes_256_ecb 426 #define OBJ_aes_256_ecb 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 41L +#define OBJ_ENC_aes_256_ecb 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x29 #define SN_aes_256_cbc "AES-256-CBC" #define LN_aes_256_cbc "aes-256-cbc" #define NID_aes_256_cbc 427 #define OBJ_aes_256_cbc 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 42L +#define OBJ_ENC_aes_256_cbc 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2a #define SN_aes_256_ofb128 "AES-256-OFB" #define LN_aes_256_ofb128 "aes-256-ofb" #define NID_aes_256_ofb128 428 #define OBJ_aes_256_ofb128 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 43L +#define OBJ_ENC_aes_256_ofb128 \ + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2b #define SN_aes_256_cfb128 "AES-256-CFB" #define LN_aes_256_cfb128 "aes-256-cfb" #define NID_aes_256_cfb128 429 #define OBJ_aes_256_cfb128 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 44L +#define OBJ_ENC_aes_256_cfb128 \ + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2c #define SN_hold_instruction_code "holdInstructionCode" #define LN_hold_instruction_code "Hold Instruction Code" #define NID_hold_instruction_code 430 #define OBJ_hold_instruction_code 2L, 5L, 29L, 23L +#define OBJ_ENC_hold_instruction_code 0x55, 0x1d, 0x17 #define SN_hold_instruction_none "holdInstructionNone" #define LN_hold_instruction_none "Hold Instruction None" #define NID_hold_instruction_none 431 #define OBJ_hold_instruction_none 1L, 2L, 840L, 10040L, 2L, 1L +#define OBJ_ENC_hold_instruction_none 0x2a, 0x86, 0x48, 0xce, 0x38, 0x02, 0x01 #define SN_hold_instruction_call_issuer "holdInstructionCallIssuer" #define LN_hold_instruction_call_issuer "Hold Instruction Call Issuer" #define NID_hold_instruction_call_issuer 432 #define OBJ_hold_instruction_call_issuer 1L, 2L, 840L, 10040L, 2L, 2L +#define OBJ_ENC_hold_instruction_call_issuer \ + 0x2a, 0x86, 0x48, 0xce, 0x38, 0x02, 0x02 #define SN_hold_instruction_reject "holdInstructionReject" #define LN_hold_instruction_reject "Hold Instruction Reject" #define NID_hold_instruction_reject 433 #define OBJ_hold_instruction_reject 1L, 2L, 840L, 10040L, 2L, 3L +#define OBJ_ENC_hold_instruction_reject 0x2a, 0x86, 0x48, 0xce, 0x38, 0x02, 0x03 #define SN_data "data" #define NID_data 434 #define OBJ_data 0L, 9L +#define OBJ_ENC_data 0x09 #define SN_pss "pss" #define NID_pss 435 #define OBJ_pss 0L, 9L, 2342L +#define OBJ_ENC_pss 0x09, 0x92, 0x26 #define SN_ucl "ucl" #define NID_ucl 436 #define OBJ_ucl 0L, 9L, 2342L, 19200300L +#define OBJ_ENC_ucl 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c #define SN_pilot "pilot" #define NID_pilot 437 #define OBJ_pilot 0L, 9L, 2342L, 19200300L, 100L +#define OBJ_ENC_pilot 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64 #define LN_pilotAttributeType "pilotAttributeType" #define NID_pilotAttributeType 438 #define OBJ_pilotAttributeType 0L, 9L, 2342L, 19200300L, 100L, 1L +#define OBJ_ENC_pilotAttributeType \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01 #define LN_pilotAttributeSyntax "pilotAttributeSyntax" #define NID_pilotAttributeSyntax 439 #define OBJ_pilotAttributeSyntax 0L, 9L, 2342L, 19200300L, 100L, 3L +#define OBJ_ENC_pilotAttributeSyntax \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x03 #define LN_pilotObjectClass "pilotObjectClass" #define NID_pilotObjectClass 440 #define OBJ_pilotObjectClass 0L, 9L, 2342L, 19200300L, 100L, 4L +#define OBJ_ENC_pilotObjectClass \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04 #define LN_pilotGroups "pilotGroups" #define NID_pilotGroups 441 #define OBJ_pilotGroups 0L, 9L, 2342L, 19200300L, 100L, 10L +#define OBJ_ENC_pilotGroups 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x0a #define LN_iA5StringSyntax "iA5StringSyntax" #define NID_iA5StringSyntax 442 #define OBJ_iA5StringSyntax 0L, 9L, 2342L, 19200300L, 100L, 3L, 4L +#define OBJ_ENC_iA5StringSyntax \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x03, 0x04 #define LN_caseIgnoreIA5StringSyntax "caseIgnoreIA5StringSyntax" #define NID_caseIgnoreIA5StringSyntax 443 #define OBJ_caseIgnoreIA5StringSyntax 0L, 9L, 2342L, 19200300L, 100L, 3L, 5L +#define OBJ_ENC_caseIgnoreIA5StringSyntax \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x03, 0x05 #define LN_pilotObject "pilotObject" #define NID_pilotObject 444 #define OBJ_pilotObject 0L, 9L, 2342L, 19200300L, 100L, 4L, 3L +#define OBJ_ENC_pilotObject \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x03 #define LN_pilotPerson "pilotPerson" #define NID_pilotPerson 445 #define OBJ_pilotPerson 0L, 9L, 2342L, 19200300L, 100L, 4L, 4L +#define OBJ_ENC_pilotPerson \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x04 #define SN_account "account" #define NID_account 446 #define OBJ_account 0L, 9L, 2342L, 19200300L, 100L, 4L, 5L +#define OBJ_ENC_account \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x05 #define SN_document "document" #define NID_document 447 #define OBJ_document 0L, 9L, 2342L, 19200300L, 100L, 4L, 6L +#define OBJ_ENC_document \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x06 #define SN_room "room" #define NID_room 448 #define OBJ_room 0L, 9L, 2342L, 19200300L, 100L, 4L, 7L +#define OBJ_ENC_room 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x07 #define LN_documentSeries "documentSeries" #define NID_documentSeries 449 #define OBJ_documentSeries 0L, 9L, 2342L, 19200300L, 100L, 4L, 9L +#define OBJ_ENC_documentSeries \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x09 #define LN_rFC822localPart "rFC822localPart" #define NID_rFC822localPart 450 #define OBJ_rFC822localPart 0L, 9L, 2342L, 19200300L, 100L, 4L, 14L +#define OBJ_ENC_rFC822localPart \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x0e #define LN_dNSDomain "dNSDomain" #define NID_dNSDomain 451 #define OBJ_dNSDomain 0L, 9L, 2342L, 19200300L, 100L, 4L, 15L +#define OBJ_ENC_dNSDomain \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x0f #define LN_domainRelatedObject "domainRelatedObject" #define NID_domainRelatedObject 452 #define OBJ_domainRelatedObject 0L, 9L, 2342L, 19200300L, 100L, 4L, 17L +#define OBJ_ENC_domainRelatedObject \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x11 #define LN_friendlyCountry "friendlyCountry" #define NID_friendlyCountry 453 #define OBJ_friendlyCountry 0L, 9L, 2342L, 19200300L, 100L, 4L, 18L +#define OBJ_ENC_friendlyCountry \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x12 #define LN_simpleSecurityObject "simpleSecurityObject" #define NID_simpleSecurityObject 454 #define OBJ_simpleSecurityObject 0L, 9L, 2342L, 19200300L, 100L, 4L, 19L +#define OBJ_ENC_simpleSecurityObject \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x13 #define LN_pilotOrganization "pilotOrganization" #define NID_pilotOrganization 455 #define OBJ_pilotOrganization 0L, 9L, 2342L, 19200300L, 100L, 4L, 20L +#define OBJ_ENC_pilotOrganization \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x14 #define LN_pilotDSA "pilotDSA" #define NID_pilotDSA 456 #define OBJ_pilotDSA 0L, 9L, 2342L, 19200300L, 100L, 4L, 21L +#define OBJ_ENC_pilotDSA \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x15 #define LN_qualityLabelledData "qualityLabelledData" #define NID_qualityLabelledData 457 #define OBJ_qualityLabelledData 0L, 9L, 2342L, 19200300L, 100L, 4L, 22L +#define OBJ_ENC_qualityLabelledData \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x04, 0x16 #define SN_userId "UID" #define LN_userId "userId" #define NID_userId 458 #define OBJ_userId 0L, 9L, 2342L, 19200300L, 100L, 1L, 1L +#define OBJ_ENC_userId \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x01 #define LN_textEncodedORAddress "textEncodedORAddress" #define NID_textEncodedORAddress 459 #define OBJ_textEncodedORAddress 0L, 9L, 2342L, 19200300L, 100L, 1L, 2L +#define OBJ_ENC_textEncodedORAddress \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x02 #define SN_rfc822Mailbox "mail" #define LN_rfc822Mailbox "rfc822Mailbox" #define NID_rfc822Mailbox 460 #define OBJ_rfc822Mailbox 0L, 9L, 2342L, 19200300L, 100L, 1L, 3L +#define OBJ_ENC_rfc822Mailbox \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x03 #define SN_info "info" #define NID_info 461 #define OBJ_info 0L, 9L, 2342L, 19200300L, 100L, 1L, 4L +#define OBJ_ENC_info 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x04 #define LN_favouriteDrink "favouriteDrink" #define NID_favouriteDrink 462 #define OBJ_favouriteDrink 0L, 9L, 2342L, 19200300L, 100L, 1L, 5L +#define OBJ_ENC_favouriteDrink \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x05 #define LN_roomNumber "roomNumber" #define NID_roomNumber 463 #define OBJ_roomNumber 0L, 9L, 2342L, 19200300L, 100L, 1L, 6L +#define OBJ_ENC_roomNumber \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x06 #define SN_photo "photo" #define NID_photo 464 #define OBJ_photo 0L, 9L, 2342L, 19200300L, 100L, 1L, 7L +#define OBJ_ENC_photo 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x07 #define LN_userClass "userClass" #define NID_userClass 465 #define OBJ_userClass 0L, 9L, 2342L, 19200300L, 100L, 1L, 8L +#define OBJ_ENC_userClass \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x08 #define SN_host "host" #define NID_host 466 #define OBJ_host 0L, 9L, 2342L, 19200300L, 100L, 1L, 9L +#define OBJ_ENC_host 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x09 #define SN_manager "manager" #define NID_manager 467 #define OBJ_manager 0L, 9L, 2342L, 19200300L, 100L, 1L, 10L +#define OBJ_ENC_manager \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x0a #define LN_documentIdentifier "documentIdentifier" #define NID_documentIdentifier 468 #define OBJ_documentIdentifier 0L, 9L, 2342L, 19200300L, 100L, 1L, 11L +#define OBJ_ENC_documentIdentifier \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x0b #define LN_documentTitle "documentTitle" #define NID_documentTitle 469 #define OBJ_documentTitle 0L, 9L, 2342L, 19200300L, 100L, 1L, 12L +#define OBJ_ENC_documentTitle \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x0c #define LN_documentVersion "documentVersion" #define NID_documentVersion 470 #define OBJ_documentVersion 0L, 9L, 2342L, 19200300L, 100L, 1L, 13L +#define OBJ_ENC_documentVersion \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x0d #define LN_documentAuthor "documentAuthor" #define NID_documentAuthor 471 #define OBJ_documentAuthor 0L, 9L, 2342L, 19200300L, 100L, 1L, 14L +#define OBJ_ENC_documentAuthor \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x0e #define LN_documentLocation "documentLocation" #define NID_documentLocation 472 #define OBJ_documentLocation 0L, 9L, 2342L, 19200300L, 100L, 1L, 15L +#define OBJ_ENC_documentLocation \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x0f #define LN_homeTelephoneNumber "homeTelephoneNumber" #define NID_homeTelephoneNumber 473 #define OBJ_homeTelephoneNumber 0L, 9L, 2342L, 19200300L, 100L, 1L, 20L +#define OBJ_ENC_homeTelephoneNumber \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x14 #define SN_secretary "secretary" #define NID_secretary 474 #define OBJ_secretary 0L, 9L, 2342L, 19200300L, 100L, 1L, 21L +#define OBJ_ENC_secretary \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x15 #define LN_otherMailbox "otherMailbox" #define NID_otherMailbox 475 #define OBJ_otherMailbox 0L, 9L, 2342L, 19200300L, 100L, 1L, 22L +#define OBJ_ENC_otherMailbox \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x16 #define LN_lastModifiedTime "lastModifiedTime" #define NID_lastModifiedTime 476 #define OBJ_lastModifiedTime 0L, 9L, 2342L, 19200300L, 100L, 1L, 23L +#define OBJ_ENC_lastModifiedTime \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x17 #define LN_lastModifiedBy "lastModifiedBy" #define NID_lastModifiedBy 477 #define OBJ_lastModifiedBy 0L, 9L, 2342L, 19200300L, 100L, 1L, 24L +#define OBJ_ENC_lastModifiedBy \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x18 #define LN_aRecord "aRecord" #define NID_aRecord 478 #define OBJ_aRecord 0L, 9L, 2342L, 19200300L, 100L, 1L, 26L +#define OBJ_ENC_aRecord \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x1a #define LN_pilotAttributeType27 "pilotAttributeType27" #define NID_pilotAttributeType27 479 #define OBJ_pilotAttributeType27 0L, 9L, 2342L, 19200300L, 100L, 1L, 27L +#define OBJ_ENC_pilotAttributeType27 \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x1b #define LN_mXRecord "mXRecord" #define NID_mXRecord 480 #define OBJ_mXRecord 0L, 9L, 2342L, 19200300L, 100L, 1L, 28L +#define OBJ_ENC_mXRecord \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x1c #define LN_nSRecord "nSRecord" #define NID_nSRecord 481 #define OBJ_nSRecord 0L, 9L, 2342L, 19200300L, 100L, 1L, 29L +#define OBJ_ENC_nSRecord \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x1d #define LN_sOARecord "sOARecord" #define NID_sOARecord 482 #define OBJ_sOARecord 0L, 9L, 2342L, 19200300L, 100L, 1L, 30L +#define OBJ_ENC_sOARecord \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x1e #define LN_cNAMERecord "cNAMERecord" #define NID_cNAMERecord 483 #define OBJ_cNAMERecord 0L, 9L, 2342L, 19200300L, 100L, 1L, 31L +#define OBJ_ENC_cNAMERecord \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x1f #define LN_associatedDomain "associatedDomain" #define NID_associatedDomain 484 #define OBJ_associatedDomain 0L, 9L, 2342L, 19200300L, 100L, 1L, 37L +#define OBJ_ENC_associatedDomain \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x25 #define LN_associatedName "associatedName" #define NID_associatedName 485 #define OBJ_associatedName 0L, 9L, 2342L, 19200300L, 100L, 1L, 38L +#define OBJ_ENC_associatedName \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x26 #define LN_homePostalAddress "homePostalAddress" #define NID_homePostalAddress 486 #define OBJ_homePostalAddress 0L, 9L, 2342L, 19200300L, 100L, 1L, 39L +#define OBJ_ENC_homePostalAddress \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x27 #define LN_personalTitle "personalTitle" #define NID_personalTitle 487 #define OBJ_personalTitle 0L, 9L, 2342L, 19200300L, 100L, 1L, 40L +#define OBJ_ENC_personalTitle \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x28 #define LN_mobileTelephoneNumber "mobileTelephoneNumber" #define NID_mobileTelephoneNumber 488 #define OBJ_mobileTelephoneNumber 0L, 9L, 2342L, 19200300L, 100L, 1L, 41L +#define OBJ_ENC_mobileTelephoneNumber \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x29 #define LN_pagerTelephoneNumber "pagerTelephoneNumber" #define NID_pagerTelephoneNumber 489 #define OBJ_pagerTelephoneNumber 0L, 9L, 2342L, 19200300L, 100L, 1L, 42L +#define OBJ_ENC_pagerTelephoneNumber \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x2a #define LN_friendlyCountryName "friendlyCountryName" #define NID_friendlyCountryName 490 #define OBJ_friendlyCountryName 0L, 9L, 2342L, 19200300L, 100L, 1L, 43L +#define OBJ_ENC_friendlyCountryName \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x2b #define LN_organizationalStatus "organizationalStatus" #define NID_organizationalStatus 491 #define OBJ_organizationalStatus 0L, 9L, 2342L, 19200300L, 100L, 1L, 45L +#define OBJ_ENC_organizationalStatus \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x2d #define LN_janetMailbox "janetMailbox" #define NID_janetMailbox 492 #define OBJ_janetMailbox 0L, 9L, 2342L, 19200300L, 100L, 1L, 46L +#define OBJ_ENC_janetMailbox \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x2e #define LN_mailPreferenceOption "mailPreferenceOption" #define NID_mailPreferenceOption 493 #define OBJ_mailPreferenceOption 0L, 9L, 2342L, 19200300L, 100L, 1L, 47L +#define OBJ_ENC_mailPreferenceOption \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x2f #define LN_buildingName "buildingName" #define NID_buildingName 494 #define OBJ_buildingName 0L, 9L, 2342L, 19200300L, 100L, 1L, 48L +#define OBJ_ENC_buildingName \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x30 #define LN_dSAQuality "dSAQuality" #define NID_dSAQuality 495 #define OBJ_dSAQuality 0L, 9L, 2342L, 19200300L, 100L, 1L, 49L +#define OBJ_ENC_dSAQuality \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x31 #define LN_singleLevelQuality "singleLevelQuality" #define NID_singleLevelQuality 496 #define OBJ_singleLevelQuality 0L, 9L, 2342L, 19200300L, 100L, 1L, 50L +#define OBJ_ENC_singleLevelQuality \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x32 #define LN_subtreeMinimumQuality "subtreeMinimumQuality" #define NID_subtreeMinimumQuality 497 #define OBJ_subtreeMinimumQuality 0L, 9L, 2342L, 19200300L, 100L, 1L, 51L +#define OBJ_ENC_subtreeMinimumQuality \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x33 #define LN_subtreeMaximumQuality "subtreeMaximumQuality" #define NID_subtreeMaximumQuality 498 #define OBJ_subtreeMaximumQuality 0L, 9L, 2342L, 19200300L, 100L, 1L, 52L +#define OBJ_ENC_subtreeMaximumQuality \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x34 #define LN_personalSignature "personalSignature" #define NID_personalSignature 499 #define OBJ_personalSignature 0L, 9L, 2342L, 19200300L, 100L, 1L, 53L +#define OBJ_ENC_personalSignature \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x35 #define LN_dITRedirect "dITRedirect" #define NID_dITRedirect 500 #define OBJ_dITRedirect 0L, 9L, 2342L, 19200300L, 100L, 1L, 54L +#define OBJ_ENC_dITRedirect \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x36 #define SN_audio "audio" #define NID_audio 501 #define OBJ_audio 0L, 9L, 2342L, 19200300L, 100L, 1L, 55L +#define OBJ_ENC_audio 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x37 #define LN_documentPublisher "documentPublisher" #define NID_documentPublisher 502 #define OBJ_documentPublisher 0L, 9L, 2342L, 19200300L, 100L, 1L, 56L +#define OBJ_ENC_documentPublisher \ + 0x09, 0x92, 0x26, 0x89, 0x93, 0xf2, 0x2c, 0x64, 0x01, 0x38 #define LN_x500UniqueIdentifier "x500UniqueIdentifier" #define NID_x500UniqueIdentifier 503 #define OBJ_x500UniqueIdentifier 2L, 5L, 4L, 45L +#define OBJ_ENC_x500UniqueIdentifier 0x55, 0x04, 0x2d #define SN_mime_mhs "mime-mhs" #define LN_mime_mhs "MIME MHS" #define NID_mime_mhs 504 #define OBJ_mime_mhs 1L, 3L, 6L, 1L, 7L, 1L +#define OBJ_ENC_mime_mhs 0x2b, 0x06, 0x01, 0x07, 0x01 #define SN_mime_mhs_headings "mime-mhs-headings" #define LN_mime_mhs_headings "mime-mhs-headings" #define NID_mime_mhs_headings 505 #define OBJ_mime_mhs_headings 1L, 3L, 6L, 1L, 7L, 1L, 1L +#define OBJ_ENC_mime_mhs_headings 0x2b, 0x06, 0x01, 0x07, 0x01, 0x01 #define SN_mime_mhs_bodies "mime-mhs-bodies" #define LN_mime_mhs_bodies "mime-mhs-bodies" #define NID_mime_mhs_bodies 506 #define OBJ_mime_mhs_bodies 1L, 3L, 6L, 1L, 7L, 1L, 2L +#define OBJ_ENC_mime_mhs_bodies 0x2b, 0x06, 0x01, 0x07, 0x01, 0x02 #define SN_id_hex_partial_message "id-hex-partial-message" #define LN_id_hex_partial_message "id-hex-partial-message" #define NID_id_hex_partial_message 507 #define OBJ_id_hex_partial_message 1L, 3L, 6L, 1L, 7L, 1L, 1L, 1L +#define OBJ_ENC_id_hex_partial_message 0x2b, 0x06, 0x01, 0x07, 0x01, 0x01, 0x01 #define SN_id_hex_multipart_message "id-hex-multipart-message" #define LN_id_hex_multipart_message "id-hex-multipart-message" #define NID_id_hex_multipart_message 508 #define OBJ_id_hex_multipart_message 1L, 3L, 6L, 1L, 7L, 1L, 1L, 2L +#define OBJ_ENC_id_hex_multipart_message \ + 0x2b, 0x06, 0x01, 0x07, 0x01, 0x01, 0x02 #define LN_generationQualifier "generationQualifier" #define NID_generationQualifier 509 #define OBJ_generationQualifier 2L, 5L, 4L, 44L +#define OBJ_ENC_generationQualifier 0x55, 0x04, 0x2c #define LN_pseudonym "pseudonym" #define NID_pseudonym 510 #define OBJ_pseudonym 2L, 5L, 4L, 65L +#define OBJ_ENC_pseudonym 0x55, 0x04, 0x41 #define SN_id_set "id-set" #define LN_id_set "Secure Electronic Transactions" #define NID_id_set 512 #define OBJ_id_set 2L, 23L, 42L +#define OBJ_ENC_id_set 0x67, 0x2a #define SN_set_ctype "set-ctype" #define LN_set_ctype "content types" #define NID_set_ctype 513 #define OBJ_set_ctype 2L, 23L, 42L, 0L +#define OBJ_ENC_set_ctype 0x67, 0x2a, 0x00 #define SN_set_msgExt "set-msgExt" #define LN_set_msgExt "message extensions" #define NID_set_msgExt 514 #define OBJ_set_msgExt 2L, 23L, 42L, 1L +#define OBJ_ENC_set_msgExt 0x67, 0x2a, 0x01 #define SN_set_attr "set-attr" #define NID_set_attr 515 #define OBJ_set_attr 2L, 23L, 42L, 3L +#define OBJ_ENC_set_attr 0x67, 0x2a, 0x03 #define SN_set_policy "set-policy" #define NID_set_policy 516 #define OBJ_set_policy 2L, 23L, 42L, 5L +#define OBJ_ENC_set_policy 0x67, 0x2a, 0x05 #define SN_set_certExt "set-certExt" #define LN_set_certExt "certificate extensions" #define NID_set_certExt 517 #define OBJ_set_certExt 2L, 23L, 42L, 7L +#define OBJ_ENC_set_certExt 0x67, 0x2a, 0x07 #define SN_set_brand "set-brand" #define NID_set_brand 518 #define OBJ_set_brand 2L, 23L, 42L, 8L +#define OBJ_ENC_set_brand 0x67, 0x2a, 0x08 #define SN_setct_PANData "setct-PANData" #define NID_setct_PANData 519 #define OBJ_setct_PANData 2L, 23L, 42L, 0L, 0L +#define OBJ_ENC_setct_PANData 0x67, 0x2a, 0x00, 0x00 #define SN_setct_PANToken "setct-PANToken" #define NID_setct_PANToken 520 #define OBJ_setct_PANToken 2L, 23L, 42L, 0L, 1L +#define OBJ_ENC_setct_PANToken 0x67, 0x2a, 0x00, 0x01 #define SN_setct_PANOnly "setct-PANOnly" #define NID_setct_PANOnly 521 #define OBJ_setct_PANOnly 2L, 23L, 42L, 0L, 2L +#define OBJ_ENC_setct_PANOnly 0x67, 0x2a, 0x00, 0x02 #define SN_setct_OIData "setct-OIData" #define NID_setct_OIData 522 #define OBJ_setct_OIData 2L, 23L, 42L, 0L, 3L +#define OBJ_ENC_setct_OIData 0x67, 0x2a, 0x00, 0x03 #define SN_setct_PI "setct-PI" #define NID_setct_PI 523 #define OBJ_setct_PI 2L, 23L, 42L, 0L, 4L +#define OBJ_ENC_setct_PI 0x67, 0x2a, 0x00, 0x04 #define SN_setct_PIData "setct-PIData" #define NID_setct_PIData 524 #define OBJ_setct_PIData 2L, 23L, 42L, 0L, 5L +#define OBJ_ENC_setct_PIData 0x67, 0x2a, 0x00, 0x05 #define SN_setct_PIDataUnsigned "setct-PIDataUnsigned" #define NID_setct_PIDataUnsigned 525 #define OBJ_setct_PIDataUnsigned 2L, 23L, 42L, 0L, 6L +#define OBJ_ENC_setct_PIDataUnsigned 0x67, 0x2a, 0x00, 0x06 #define SN_setct_HODInput "setct-HODInput" #define NID_setct_HODInput 526 #define OBJ_setct_HODInput 2L, 23L, 42L, 0L, 7L +#define OBJ_ENC_setct_HODInput 0x67, 0x2a, 0x00, 0x07 #define SN_setct_AuthResBaggage "setct-AuthResBaggage" #define NID_setct_AuthResBaggage 527 #define OBJ_setct_AuthResBaggage 2L, 23L, 42L, 0L, 8L +#define OBJ_ENC_setct_AuthResBaggage 0x67, 0x2a, 0x00, 0x08 #define SN_setct_AuthRevReqBaggage "setct-AuthRevReqBaggage" #define NID_setct_AuthRevReqBaggage 528 #define OBJ_setct_AuthRevReqBaggage 2L, 23L, 42L, 0L, 9L +#define OBJ_ENC_setct_AuthRevReqBaggage 0x67, 0x2a, 0x00, 0x09 #define SN_setct_AuthRevResBaggage "setct-AuthRevResBaggage" #define NID_setct_AuthRevResBaggage 529 #define OBJ_setct_AuthRevResBaggage 2L, 23L, 42L, 0L, 10L +#define OBJ_ENC_setct_AuthRevResBaggage 0x67, 0x2a, 0x00, 0x0a #define SN_setct_CapTokenSeq "setct-CapTokenSeq" #define NID_setct_CapTokenSeq 530 #define OBJ_setct_CapTokenSeq 2L, 23L, 42L, 0L, 11L +#define OBJ_ENC_setct_CapTokenSeq 0x67, 0x2a, 0x00, 0x0b #define SN_setct_PInitResData "setct-PInitResData" #define NID_setct_PInitResData 531 #define OBJ_setct_PInitResData 2L, 23L, 42L, 0L, 12L +#define OBJ_ENC_setct_PInitResData 0x67, 0x2a, 0x00, 0x0c #define SN_setct_PI_TBS "setct-PI-TBS" #define NID_setct_PI_TBS 532 #define OBJ_setct_PI_TBS 2L, 23L, 42L, 0L, 13L +#define OBJ_ENC_setct_PI_TBS 0x67, 0x2a, 0x00, 0x0d #define SN_setct_PResData "setct-PResData" #define NID_setct_PResData 533 #define OBJ_setct_PResData 2L, 23L, 42L, 0L, 14L +#define OBJ_ENC_setct_PResData 0x67, 0x2a, 0x00, 0x0e #define SN_setct_AuthReqTBS "setct-AuthReqTBS" #define NID_setct_AuthReqTBS 534 #define OBJ_setct_AuthReqTBS 2L, 23L, 42L, 0L, 16L +#define OBJ_ENC_setct_AuthReqTBS 0x67, 0x2a, 0x00, 0x10 #define SN_setct_AuthResTBS "setct-AuthResTBS" #define NID_setct_AuthResTBS 535 #define OBJ_setct_AuthResTBS 2L, 23L, 42L, 0L, 17L +#define OBJ_ENC_setct_AuthResTBS 0x67, 0x2a, 0x00, 0x11 #define SN_setct_AuthResTBSX "setct-AuthResTBSX" #define NID_setct_AuthResTBSX 536 #define OBJ_setct_AuthResTBSX 2L, 23L, 42L, 0L, 18L +#define OBJ_ENC_setct_AuthResTBSX 0x67, 0x2a, 0x00, 0x12 #define SN_setct_AuthTokenTBS "setct-AuthTokenTBS" #define NID_setct_AuthTokenTBS 537 #define OBJ_setct_AuthTokenTBS 2L, 23L, 42L, 0L, 19L +#define OBJ_ENC_setct_AuthTokenTBS 0x67, 0x2a, 0x00, 0x13 #define SN_setct_CapTokenData "setct-CapTokenData" #define NID_setct_CapTokenData 538 #define OBJ_setct_CapTokenData 2L, 23L, 42L, 0L, 20L +#define OBJ_ENC_setct_CapTokenData 0x67, 0x2a, 0x00, 0x14 #define SN_setct_CapTokenTBS "setct-CapTokenTBS" #define NID_setct_CapTokenTBS 539 #define OBJ_setct_CapTokenTBS 2L, 23L, 42L, 0L, 21L +#define OBJ_ENC_setct_CapTokenTBS 0x67, 0x2a, 0x00, 0x15 #define SN_setct_AcqCardCodeMsg "setct-AcqCardCodeMsg" #define NID_setct_AcqCardCodeMsg 540 #define OBJ_setct_AcqCardCodeMsg 2L, 23L, 42L, 0L, 22L +#define OBJ_ENC_setct_AcqCardCodeMsg 0x67, 0x2a, 0x00, 0x16 #define SN_setct_AuthRevReqTBS "setct-AuthRevReqTBS" #define NID_setct_AuthRevReqTBS 541 #define OBJ_setct_AuthRevReqTBS 2L, 23L, 42L, 0L, 23L +#define OBJ_ENC_setct_AuthRevReqTBS 0x67, 0x2a, 0x00, 0x17 #define SN_setct_AuthRevResData "setct-AuthRevResData" #define NID_setct_AuthRevResData 542 #define OBJ_setct_AuthRevResData 2L, 23L, 42L, 0L, 24L +#define OBJ_ENC_setct_AuthRevResData 0x67, 0x2a, 0x00, 0x18 #define SN_setct_AuthRevResTBS "setct-AuthRevResTBS" #define NID_setct_AuthRevResTBS 543 #define OBJ_setct_AuthRevResTBS 2L, 23L, 42L, 0L, 25L +#define OBJ_ENC_setct_AuthRevResTBS 0x67, 0x2a, 0x00, 0x19 #define SN_setct_CapReqTBS "setct-CapReqTBS" #define NID_setct_CapReqTBS 544 #define OBJ_setct_CapReqTBS 2L, 23L, 42L, 0L, 26L +#define OBJ_ENC_setct_CapReqTBS 0x67, 0x2a, 0x00, 0x1a #define SN_setct_CapReqTBSX "setct-CapReqTBSX" #define NID_setct_CapReqTBSX 545 #define OBJ_setct_CapReqTBSX 2L, 23L, 42L, 0L, 27L +#define OBJ_ENC_setct_CapReqTBSX 0x67, 0x2a, 0x00, 0x1b #define SN_setct_CapResData "setct-CapResData" #define NID_setct_CapResData 546 #define OBJ_setct_CapResData 2L, 23L, 42L, 0L, 28L +#define OBJ_ENC_setct_CapResData 0x67, 0x2a, 0x00, 0x1c #define SN_setct_CapRevReqTBS "setct-CapRevReqTBS" #define NID_setct_CapRevReqTBS 547 #define OBJ_setct_CapRevReqTBS 2L, 23L, 42L, 0L, 29L +#define OBJ_ENC_setct_CapRevReqTBS 0x67, 0x2a, 0x00, 0x1d #define SN_setct_CapRevReqTBSX "setct-CapRevReqTBSX" #define NID_setct_CapRevReqTBSX 548 #define OBJ_setct_CapRevReqTBSX 2L, 23L, 42L, 0L, 30L +#define OBJ_ENC_setct_CapRevReqTBSX 0x67, 0x2a, 0x00, 0x1e #define SN_setct_CapRevResData "setct-CapRevResData" #define NID_setct_CapRevResData 549 #define OBJ_setct_CapRevResData 2L, 23L, 42L, 0L, 31L +#define OBJ_ENC_setct_CapRevResData 0x67, 0x2a, 0x00, 0x1f #define SN_setct_CredReqTBS "setct-CredReqTBS" #define NID_setct_CredReqTBS 550 #define OBJ_setct_CredReqTBS 2L, 23L, 42L, 0L, 32L +#define OBJ_ENC_setct_CredReqTBS 0x67, 0x2a, 0x00, 0x20 #define SN_setct_CredReqTBSX "setct-CredReqTBSX" #define NID_setct_CredReqTBSX 551 #define OBJ_setct_CredReqTBSX 2L, 23L, 42L, 0L, 33L +#define OBJ_ENC_setct_CredReqTBSX 0x67, 0x2a, 0x00, 0x21 #define SN_setct_CredResData "setct-CredResData" #define NID_setct_CredResData 552 #define OBJ_setct_CredResData 2L, 23L, 42L, 0L, 34L +#define OBJ_ENC_setct_CredResData 0x67, 0x2a, 0x00, 0x22 #define SN_setct_CredRevReqTBS "setct-CredRevReqTBS" #define NID_setct_CredRevReqTBS 553 #define OBJ_setct_CredRevReqTBS 2L, 23L, 42L, 0L, 35L +#define OBJ_ENC_setct_CredRevReqTBS 0x67, 0x2a, 0x00, 0x23 #define SN_setct_CredRevReqTBSX "setct-CredRevReqTBSX" #define NID_setct_CredRevReqTBSX 554 #define OBJ_setct_CredRevReqTBSX 2L, 23L, 42L, 0L, 36L +#define OBJ_ENC_setct_CredRevReqTBSX 0x67, 0x2a, 0x00, 0x24 #define SN_setct_CredRevResData "setct-CredRevResData" #define NID_setct_CredRevResData 555 #define OBJ_setct_CredRevResData 2L, 23L, 42L, 0L, 37L +#define OBJ_ENC_setct_CredRevResData 0x67, 0x2a, 0x00, 0x25 #define SN_setct_PCertReqData "setct-PCertReqData" #define NID_setct_PCertReqData 556 #define OBJ_setct_PCertReqData 2L, 23L, 42L, 0L, 38L +#define OBJ_ENC_setct_PCertReqData 0x67, 0x2a, 0x00, 0x26 #define SN_setct_PCertResTBS "setct-PCertResTBS" #define NID_setct_PCertResTBS 557 #define OBJ_setct_PCertResTBS 2L, 23L, 42L, 0L, 39L +#define OBJ_ENC_setct_PCertResTBS 0x67, 0x2a, 0x00, 0x27 #define SN_setct_BatchAdminReqData "setct-BatchAdminReqData" #define NID_setct_BatchAdminReqData 558 #define OBJ_setct_BatchAdminReqData 2L, 23L, 42L, 0L, 40L +#define OBJ_ENC_setct_BatchAdminReqData 0x67, 0x2a, 0x00, 0x28 #define SN_setct_BatchAdminResData "setct-BatchAdminResData" #define NID_setct_BatchAdminResData 559 #define OBJ_setct_BatchAdminResData 2L, 23L, 42L, 0L, 41L +#define OBJ_ENC_setct_BatchAdminResData 0x67, 0x2a, 0x00, 0x29 #define SN_setct_CardCInitResTBS "setct-CardCInitResTBS" #define NID_setct_CardCInitResTBS 560 #define OBJ_setct_CardCInitResTBS 2L, 23L, 42L, 0L, 42L +#define OBJ_ENC_setct_CardCInitResTBS 0x67, 0x2a, 0x00, 0x2a #define SN_setct_MeAqCInitResTBS "setct-MeAqCInitResTBS" #define NID_setct_MeAqCInitResTBS 561 #define OBJ_setct_MeAqCInitResTBS 2L, 23L, 42L, 0L, 43L +#define OBJ_ENC_setct_MeAqCInitResTBS 0x67, 0x2a, 0x00, 0x2b #define SN_setct_RegFormResTBS "setct-RegFormResTBS" #define NID_setct_RegFormResTBS 562 #define OBJ_setct_RegFormResTBS 2L, 23L, 42L, 0L, 44L +#define OBJ_ENC_setct_RegFormResTBS 0x67, 0x2a, 0x00, 0x2c #define SN_setct_CertReqData "setct-CertReqData" #define NID_setct_CertReqData 563 #define OBJ_setct_CertReqData 2L, 23L, 42L, 0L, 45L +#define OBJ_ENC_setct_CertReqData 0x67, 0x2a, 0x00, 0x2d #define SN_setct_CertReqTBS "setct-CertReqTBS" #define NID_setct_CertReqTBS 564 #define OBJ_setct_CertReqTBS 2L, 23L, 42L, 0L, 46L +#define OBJ_ENC_setct_CertReqTBS 0x67, 0x2a, 0x00, 0x2e #define SN_setct_CertResData "setct-CertResData" #define NID_setct_CertResData 565 #define OBJ_setct_CertResData 2L, 23L, 42L, 0L, 47L +#define OBJ_ENC_setct_CertResData 0x67, 0x2a, 0x00, 0x2f #define SN_setct_CertInqReqTBS "setct-CertInqReqTBS" #define NID_setct_CertInqReqTBS 566 #define OBJ_setct_CertInqReqTBS 2L, 23L, 42L, 0L, 48L +#define OBJ_ENC_setct_CertInqReqTBS 0x67, 0x2a, 0x00, 0x30 #define SN_setct_ErrorTBS "setct-ErrorTBS" #define NID_setct_ErrorTBS 567 #define OBJ_setct_ErrorTBS 2L, 23L, 42L, 0L, 49L +#define OBJ_ENC_setct_ErrorTBS 0x67, 0x2a, 0x00, 0x31 #define SN_setct_PIDualSignedTBE "setct-PIDualSignedTBE" #define NID_setct_PIDualSignedTBE 568 #define OBJ_setct_PIDualSignedTBE 2L, 23L, 42L, 0L, 50L +#define OBJ_ENC_setct_PIDualSignedTBE 0x67, 0x2a, 0x00, 0x32 #define SN_setct_PIUnsignedTBE "setct-PIUnsignedTBE" #define NID_setct_PIUnsignedTBE 569 #define OBJ_setct_PIUnsignedTBE 2L, 23L, 42L, 0L, 51L +#define OBJ_ENC_setct_PIUnsignedTBE 0x67, 0x2a, 0x00, 0x33 #define SN_setct_AuthReqTBE "setct-AuthReqTBE" #define NID_setct_AuthReqTBE 570 #define OBJ_setct_AuthReqTBE 2L, 23L, 42L, 0L, 52L +#define OBJ_ENC_setct_AuthReqTBE 0x67, 0x2a, 0x00, 0x34 #define SN_setct_AuthResTBE "setct-AuthResTBE" #define NID_setct_AuthResTBE 571 #define OBJ_setct_AuthResTBE 2L, 23L, 42L, 0L, 53L +#define OBJ_ENC_setct_AuthResTBE 0x67, 0x2a, 0x00, 0x35 #define SN_setct_AuthResTBEX "setct-AuthResTBEX" #define NID_setct_AuthResTBEX 572 #define OBJ_setct_AuthResTBEX 2L, 23L, 42L, 0L, 54L +#define OBJ_ENC_setct_AuthResTBEX 0x67, 0x2a, 0x00, 0x36 #define SN_setct_AuthTokenTBE "setct-AuthTokenTBE" #define NID_setct_AuthTokenTBE 573 #define OBJ_setct_AuthTokenTBE 2L, 23L, 42L, 0L, 55L +#define OBJ_ENC_setct_AuthTokenTBE 0x67, 0x2a, 0x00, 0x37 #define SN_setct_CapTokenTBE "setct-CapTokenTBE" #define NID_setct_CapTokenTBE 574 #define OBJ_setct_CapTokenTBE 2L, 23L, 42L, 0L, 56L +#define OBJ_ENC_setct_CapTokenTBE 0x67, 0x2a, 0x00, 0x38 #define SN_setct_CapTokenTBEX "setct-CapTokenTBEX" #define NID_setct_CapTokenTBEX 575 #define OBJ_setct_CapTokenTBEX 2L, 23L, 42L, 0L, 57L +#define OBJ_ENC_setct_CapTokenTBEX 0x67, 0x2a, 0x00, 0x39 #define SN_setct_AcqCardCodeMsgTBE "setct-AcqCardCodeMsgTBE" #define NID_setct_AcqCardCodeMsgTBE 576 #define OBJ_setct_AcqCardCodeMsgTBE 2L, 23L, 42L, 0L, 58L +#define OBJ_ENC_setct_AcqCardCodeMsgTBE 0x67, 0x2a, 0x00, 0x3a #define SN_setct_AuthRevReqTBE "setct-AuthRevReqTBE" #define NID_setct_AuthRevReqTBE 577 #define OBJ_setct_AuthRevReqTBE 2L, 23L, 42L, 0L, 59L +#define OBJ_ENC_setct_AuthRevReqTBE 0x67, 0x2a, 0x00, 0x3b #define SN_setct_AuthRevResTBE "setct-AuthRevResTBE" #define NID_setct_AuthRevResTBE 578 #define OBJ_setct_AuthRevResTBE 2L, 23L, 42L, 0L, 60L +#define OBJ_ENC_setct_AuthRevResTBE 0x67, 0x2a, 0x00, 0x3c #define SN_setct_AuthRevResTBEB "setct-AuthRevResTBEB" #define NID_setct_AuthRevResTBEB 579 #define OBJ_setct_AuthRevResTBEB 2L, 23L, 42L, 0L, 61L +#define OBJ_ENC_setct_AuthRevResTBEB 0x67, 0x2a, 0x00, 0x3d #define SN_setct_CapReqTBE "setct-CapReqTBE" #define NID_setct_CapReqTBE 580 #define OBJ_setct_CapReqTBE 2L, 23L, 42L, 0L, 62L +#define OBJ_ENC_setct_CapReqTBE 0x67, 0x2a, 0x00, 0x3e #define SN_setct_CapReqTBEX "setct-CapReqTBEX" #define NID_setct_CapReqTBEX 581 #define OBJ_setct_CapReqTBEX 2L, 23L, 42L, 0L, 63L +#define OBJ_ENC_setct_CapReqTBEX 0x67, 0x2a, 0x00, 0x3f #define SN_setct_CapResTBE "setct-CapResTBE" #define NID_setct_CapResTBE 582 #define OBJ_setct_CapResTBE 2L, 23L, 42L, 0L, 64L +#define OBJ_ENC_setct_CapResTBE 0x67, 0x2a, 0x00, 0x40 #define SN_setct_CapRevReqTBE "setct-CapRevReqTBE" #define NID_setct_CapRevReqTBE 583 #define OBJ_setct_CapRevReqTBE 2L, 23L, 42L, 0L, 65L +#define OBJ_ENC_setct_CapRevReqTBE 0x67, 0x2a, 0x00, 0x41 #define SN_setct_CapRevReqTBEX "setct-CapRevReqTBEX" #define NID_setct_CapRevReqTBEX 584 #define OBJ_setct_CapRevReqTBEX 2L, 23L, 42L, 0L, 66L +#define OBJ_ENC_setct_CapRevReqTBEX 0x67, 0x2a, 0x00, 0x42 #define SN_setct_CapRevResTBE "setct-CapRevResTBE" #define NID_setct_CapRevResTBE 585 #define OBJ_setct_CapRevResTBE 2L, 23L, 42L, 0L, 67L +#define OBJ_ENC_setct_CapRevResTBE 0x67, 0x2a, 0x00, 0x43 #define SN_setct_CredReqTBE "setct-CredReqTBE" #define NID_setct_CredReqTBE 586 #define OBJ_setct_CredReqTBE 2L, 23L, 42L, 0L, 68L +#define OBJ_ENC_setct_CredReqTBE 0x67, 0x2a, 0x00, 0x44 #define SN_setct_CredReqTBEX "setct-CredReqTBEX" #define NID_setct_CredReqTBEX 587 #define OBJ_setct_CredReqTBEX 2L, 23L, 42L, 0L, 69L +#define OBJ_ENC_setct_CredReqTBEX 0x67, 0x2a, 0x00, 0x45 #define SN_setct_CredResTBE "setct-CredResTBE" #define NID_setct_CredResTBE 588 #define OBJ_setct_CredResTBE 2L, 23L, 42L, 0L, 70L +#define OBJ_ENC_setct_CredResTBE 0x67, 0x2a, 0x00, 0x46 #define SN_setct_CredRevReqTBE "setct-CredRevReqTBE" #define NID_setct_CredRevReqTBE 589 #define OBJ_setct_CredRevReqTBE 2L, 23L, 42L, 0L, 71L +#define OBJ_ENC_setct_CredRevReqTBE 0x67, 0x2a, 0x00, 0x47 #define SN_setct_CredRevReqTBEX "setct-CredRevReqTBEX" #define NID_setct_CredRevReqTBEX 590 #define OBJ_setct_CredRevReqTBEX 2L, 23L, 42L, 0L, 72L +#define OBJ_ENC_setct_CredRevReqTBEX 0x67, 0x2a, 0x00, 0x48 #define SN_setct_CredRevResTBE "setct-CredRevResTBE" #define NID_setct_CredRevResTBE 591 #define OBJ_setct_CredRevResTBE 2L, 23L, 42L, 0L, 73L +#define OBJ_ENC_setct_CredRevResTBE 0x67, 0x2a, 0x00, 0x49 #define SN_setct_BatchAdminReqTBE "setct-BatchAdminReqTBE" #define NID_setct_BatchAdminReqTBE 592 #define OBJ_setct_BatchAdminReqTBE 2L, 23L, 42L, 0L, 74L +#define OBJ_ENC_setct_BatchAdminReqTBE 0x67, 0x2a, 0x00, 0x4a #define SN_setct_BatchAdminResTBE "setct-BatchAdminResTBE" #define NID_setct_BatchAdminResTBE 593 #define OBJ_setct_BatchAdminResTBE 2L, 23L, 42L, 0L, 75L +#define OBJ_ENC_setct_BatchAdminResTBE 0x67, 0x2a, 0x00, 0x4b #define SN_setct_RegFormReqTBE "setct-RegFormReqTBE" #define NID_setct_RegFormReqTBE 594 #define OBJ_setct_RegFormReqTBE 2L, 23L, 42L, 0L, 76L +#define OBJ_ENC_setct_RegFormReqTBE 0x67, 0x2a, 0x00, 0x4c #define SN_setct_CertReqTBE "setct-CertReqTBE" #define NID_setct_CertReqTBE 595 #define OBJ_setct_CertReqTBE 2L, 23L, 42L, 0L, 77L +#define OBJ_ENC_setct_CertReqTBE 0x67, 0x2a, 0x00, 0x4d #define SN_setct_CertReqTBEX "setct-CertReqTBEX" #define NID_setct_CertReqTBEX 596 #define OBJ_setct_CertReqTBEX 2L, 23L, 42L, 0L, 78L +#define OBJ_ENC_setct_CertReqTBEX 0x67, 0x2a, 0x00, 0x4e #define SN_setct_CertResTBE "setct-CertResTBE" #define NID_setct_CertResTBE 597 #define OBJ_setct_CertResTBE 2L, 23L, 42L, 0L, 79L +#define OBJ_ENC_setct_CertResTBE 0x67, 0x2a, 0x00, 0x4f #define SN_setct_CRLNotificationTBS "setct-CRLNotificationTBS" #define NID_setct_CRLNotificationTBS 598 #define OBJ_setct_CRLNotificationTBS 2L, 23L, 42L, 0L, 80L +#define OBJ_ENC_setct_CRLNotificationTBS 0x67, 0x2a, 0x00, 0x50 #define SN_setct_CRLNotificationResTBS "setct-CRLNotificationResTBS" #define NID_setct_CRLNotificationResTBS 599 #define OBJ_setct_CRLNotificationResTBS 2L, 23L, 42L, 0L, 81L +#define OBJ_ENC_setct_CRLNotificationResTBS 0x67, 0x2a, 0x00, 0x51 #define SN_setct_BCIDistributionTBS "setct-BCIDistributionTBS" #define NID_setct_BCIDistributionTBS 600 #define OBJ_setct_BCIDistributionTBS 2L, 23L, 42L, 0L, 82L +#define OBJ_ENC_setct_BCIDistributionTBS 0x67, 0x2a, 0x00, 0x52 #define SN_setext_genCrypt "setext-genCrypt" #define LN_setext_genCrypt "generic cryptogram" #define NID_setext_genCrypt 601 #define OBJ_setext_genCrypt 2L, 23L, 42L, 1L, 1L +#define OBJ_ENC_setext_genCrypt 0x67, 0x2a, 0x01, 0x01 #define SN_setext_miAuth "setext-miAuth" #define LN_setext_miAuth "merchant initiated auth" #define NID_setext_miAuth 602 #define OBJ_setext_miAuth 2L, 23L, 42L, 1L, 3L +#define OBJ_ENC_setext_miAuth 0x67, 0x2a, 0x01, 0x03 #define SN_setext_pinSecure "setext-pinSecure" #define NID_setext_pinSecure 603 #define OBJ_setext_pinSecure 2L, 23L, 42L, 1L, 4L +#define OBJ_ENC_setext_pinSecure 0x67, 0x2a, 0x01, 0x04 #define SN_setext_pinAny "setext-pinAny" #define NID_setext_pinAny 604 #define OBJ_setext_pinAny 2L, 23L, 42L, 1L, 5L +#define OBJ_ENC_setext_pinAny 0x67, 0x2a, 0x01, 0x05 #define SN_setext_track2 "setext-track2" #define NID_setext_track2 605 #define OBJ_setext_track2 2L, 23L, 42L, 1L, 7L +#define OBJ_ENC_setext_track2 0x67, 0x2a, 0x01, 0x07 #define SN_setext_cv "setext-cv" #define LN_setext_cv "additional verification" #define NID_setext_cv 606 #define OBJ_setext_cv 2L, 23L, 42L, 1L, 8L +#define OBJ_ENC_setext_cv 0x67, 0x2a, 0x01, 0x08 #define SN_set_policy_root "set-policy-root" #define NID_set_policy_root 607 #define OBJ_set_policy_root 2L, 23L, 42L, 5L, 0L +#define OBJ_ENC_set_policy_root 0x67, 0x2a, 0x05, 0x00 #define SN_setCext_hashedRoot "setCext-hashedRoot" #define NID_setCext_hashedRoot 608 #define OBJ_setCext_hashedRoot 2L, 23L, 42L, 7L, 0L +#define OBJ_ENC_setCext_hashedRoot 0x67, 0x2a, 0x07, 0x00 #define SN_setCext_certType "setCext-certType" #define NID_setCext_certType 609 #define OBJ_setCext_certType 2L, 23L, 42L, 7L, 1L +#define OBJ_ENC_setCext_certType 0x67, 0x2a, 0x07, 0x01 #define SN_setCext_merchData "setCext-merchData" #define NID_setCext_merchData 610 #define OBJ_setCext_merchData 2L, 23L, 42L, 7L, 2L +#define OBJ_ENC_setCext_merchData 0x67, 0x2a, 0x07, 0x02 #define SN_setCext_cCertRequired "setCext-cCertRequired" #define NID_setCext_cCertRequired 611 #define OBJ_setCext_cCertRequired 2L, 23L, 42L, 7L, 3L +#define OBJ_ENC_setCext_cCertRequired 0x67, 0x2a, 0x07, 0x03 #define SN_setCext_tunneling "setCext-tunneling" #define NID_setCext_tunneling 612 #define OBJ_setCext_tunneling 2L, 23L, 42L, 7L, 4L +#define OBJ_ENC_setCext_tunneling 0x67, 0x2a, 0x07, 0x04 #define SN_setCext_setExt "setCext-setExt" #define NID_setCext_setExt 613 #define OBJ_setCext_setExt 2L, 23L, 42L, 7L, 5L +#define OBJ_ENC_setCext_setExt 0x67, 0x2a, 0x07, 0x05 #define SN_setCext_setQualf "setCext-setQualf" #define NID_setCext_setQualf 614 #define OBJ_setCext_setQualf 2L, 23L, 42L, 7L, 6L +#define OBJ_ENC_setCext_setQualf 0x67, 0x2a, 0x07, 0x06 #define SN_setCext_PGWYcapabilities "setCext-PGWYcapabilities" #define NID_setCext_PGWYcapabilities 615 #define OBJ_setCext_PGWYcapabilities 2L, 23L, 42L, 7L, 7L +#define OBJ_ENC_setCext_PGWYcapabilities 0x67, 0x2a, 0x07, 0x07 #define SN_setCext_TokenIdentifier "setCext-TokenIdentifier" #define NID_setCext_TokenIdentifier 616 #define OBJ_setCext_TokenIdentifier 2L, 23L, 42L, 7L, 8L +#define OBJ_ENC_setCext_TokenIdentifier 0x67, 0x2a, 0x07, 0x08 #define SN_setCext_Track2Data "setCext-Track2Data" #define NID_setCext_Track2Data 617 #define OBJ_setCext_Track2Data 2L, 23L, 42L, 7L, 9L +#define OBJ_ENC_setCext_Track2Data 0x67, 0x2a, 0x07, 0x09 #define SN_setCext_TokenType "setCext-TokenType" #define NID_setCext_TokenType 618 #define OBJ_setCext_TokenType 2L, 23L, 42L, 7L, 10L +#define OBJ_ENC_setCext_TokenType 0x67, 0x2a, 0x07, 0x0a #define SN_setCext_IssuerCapabilities "setCext-IssuerCapabilities" #define NID_setCext_IssuerCapabilities 619 #define OBJ_setCext_IssuerCapabilities 2L, 23L, 42L, 7L, 11L +#define OBJ_ENC_setCext_IssuerCapabilities 0x67, 0x2a, 0x07, 0x0b #define SN_setAttr_Cert "setAttr-Cert" #define NID_setAttr_Cert 620 #define OBJ_setAttr_Cert 2L, 23L, 42L, 3L, 0L +#define OBJ_ENC_setAttr_Cert 0x67, 0x2a, 0x03, 0x00 #define SN_setAttr_PGWYcap "setAttr-PGWYcap" #define LN_setAttr_PGWYcap "payment gateway capabilities" #define NID_setAttr_PGWYcap 621 #define OBJ_setAttr_PGWYcap 2L, 23L, 42L, 3L, 1L +#define OBJ_ENC_setAttr_PGWYcap 0x67, 0x2a, 0x03, 0x01 #define SN_setAttr_TokenType "setAttr-TokenType" #define NID_setAttr_TokenType 622 #define OBJ_setAttr_TokenType 2L, 23L, 42L, 3L, 2L +#define OBJ_ENC_setAttr_TokenType 0x67, 0x2a, 0x03, 0x02 #define SN_setAttr_IssCap "setAttr-IssCap" #define LN_setAttr_IssCap "issuer capabilities" #define NID_setAttr_IssCap 623 #define OBJ_setAttr_IssCap 2L, 23L, 42L, 3L, 3L +#define OBJ_ENC_setAttr_IssCap 0x67, 0x2a, 0x03, 0x03 #define SN_set_rootKeyThumb "set-rootKeyThumb" #define NID_set_rootKeyThumb 624 #define OBJ_set_rootKeyThumb 2L, 23L, 42L, 3L, 0L, 0L +#define OBJ_ENC_set_rootKeyThumb 0x67, 0x2a, 0x03, 0x00, 0x00 #define SN_set_addPolicy "set-addPolicy" #define NID_set_addPolicy 625 #define OBJ_set_addPolicy 2L, 23L, 42L, 3L, 0L, 1L +#define OBJ_ENC_set_addPolicy 0x67, 0x2a, 0x03, 0x00, 0x01 #define SN_setAttr_Token_EMV "setAttr-Token-EMV" #define NID_setAttr_Token_EMV 626 #define OBJ_setAttr_Token_EMV 2L, 23L, 42L, 3L, 2L, 1L +#define OBJ_ENC_setAttr_Token_EMV 0x67, 0x2a, 0x03, 0x02, 0x01 #define SN_setAttr_Token_B0Prime "setAttr-Token-B0Prime" #define NID_setAttr_Token_B0Prime 627 #define OBJ_setAttr_Token_B0Prime 2L, 23L, 42L, 3L, 2L, 2L +#define OBJ_ENC_setAttr_Token_B0Prime 0x67, 0x2a, 0x03, 0x02, 0x02 #define SN_setAttr_IssCap_CVM "setAttr-IssCap-CVM" #define NID_setAttr_IssCap_CVM 628 #define OBJ_setAttr_IssCap_CVM 2L, 23L, 42L, 3L, 3L, 3L +#define OBJ_ENC_setAttr_IssCap_CVM 0x67, 0x2a, 0x03, 0x03, 0x03 #define SN_setAttr_IssCap_T2 "setAttr-IssCap-T2" #define NID_setAttr_IssCap_T2 629 #define OBJ_setAttr_IssCap_T2 2L, 23L, 42L, 3L, 3L, 4L +#define OBJ_ENC_setAttr_IssCap_T2 0x67, 0x2a, 0x03, 0x03, 0x04 #define SN_setAttr_IssCap_Sig "setAttr-IssCap-Sig" #define NID_setAttr_IssCap_Sig 630 #define OBJ_setAttr_IssCap_Sig 2L, 23L, 42L, 3L, 3L, 5L +#define OBJ_ENC_setAttr_IssCap_Sig 0x67, 0x2a, 0x03, 0x03, 0x05 #define SN_setAttr_GenCryptgrm "setAttr-GenCryptgrm" #define LN_setAttr_GenCryptgrm "generate cryptogram" #define NID_setAttr_GenCryptgrm 631 #define OBJ_setAttr_GenCryptgrm 2L, 23L, 42L, 3L, 3L, 3L, 1L +#define OBJ_ENC_setAttr_GenCryptgrm 0x67, 0x2a, 0x03, 0x03, 0x03, 0x01 #define SN_setAttr_T2Enc "setAttr-T2Enc" #define LN_setAttr_T2Enc "encrypted track 2" #define NID_setAttr_T2Enc 632 #define OBJ_setAttr_T2Enc 2L, 23L, 42L, 3L, 3L, 4L, 1L +#define OBJ_ENC_setAttr_T2Enc 0x67, 0x2a, 0x03, 0x03, 0x04, 0x01 #define SN_setAttr_T2cleartxt "setAttr-T2cleartxt" #define LN_setAttr_T2cleartxt "cleartext track 2" #define NID_setAttr_T2cleartxt 633 #define OBJ_setAttr_T2cleartxt 2L, 23L, 42L, 3L, 3L, 4L, 2L +#define OBJ_ENC_setAttr_T2cleartxt 0x67, 0x2a, 0x03, 0x03, 0x04, 0x02 #define SN_setAttr_TokICCsig "setAttr-TokICCsig" #define LN_setAttr_TokICCsig "ICC or token signature" #define NID_setAttr_TokICCsig 634 #define OBJ_setAttr_TokICCsig 2L, 23L, 42L, 3L, 3L, 5L, 1L +#define OBJ_ENC_setAttr_TokICCsig 0x67, 0x2a, 0x03, 0x03, 0x05, 0x01 #define SN_setAttr_SecDevSig "setAttr-SecDevSig" #define LN_setAttr_SecDevSig "secure device signature" #define NID_setAttr_SecDevSig 635 #define OBJ_setAttr_SecDevSig 2L, 23L, 42L, 3L, 3L, 5L, 2L +#define OBJ_ENC_setAttr_SecDevSig 0x67, 0x2a, 0x03, 0x03, 0x05, 0x02 #define SN_set_brand_IATA_ATA "set-brand-IATA-ATA" #define NID_set_brand_IATA_ATA 636 #define OBJ_set_brand_IATA_ATA 2L, 23L, 42L, 8L, 1L +#define OBJ_ENC_set_brand_IATA_ATA 0x67, 0x2a, 0x08, 0x01 #define SN_set_brand_Diners "set-brand-Diners" #define NID_set_brand_Diners 637 #define OBJ_set_brand_Diners 2L, 23L, 42L, 8L, 30L +#define OBJ_ENC_set_brand_Diners 0x67, 0x2a, 0x08, 0x1e #define SN_set_brand_AmericanExpress "set-brand-AmericanExpress" #define NID_set_brand_AmericanExpress 638 #define OBJ_set_brand_AmericanExpress 2L, 23L, 42L, 8L, 34L +#define OBJ_ENC_set_brand_AmericanExpress 0x67, 0x2a, 0x08, 0x22 #define SN_set_brand_JCB "set-brand-JCB" #define NID_set_brand_JCB 639 #define OBJ_set_brand_JCB 2L, 23L, 42L, 8L, 35L +#define OBJ_ENC_set_brand_JCB 0x67, 0x2a, 0x08, 0x23 #define SN_set_brand_Visa "set-brand-Visa" #define NID_set_brand_Visa 640 #define OBJ_set_brand_Visa 2L, 23L, 42L, 8L, 4L +#define OBJ_ENC_set_brand_Visa 0x67, 0x2a, 0x08, 0x04 #define SN_set_brand_MasterCard "set-brand-MasterCard" #define NID_set_brand_MasterCard 641 #define OBJ_set_brand_MasterCard 2L, 23L, 42L, 8L, 5L +#define OBJ_ENC_set_brand_MasterCard 0x67, 0x2a, 0x08, 0x05 #define SN_set_brand_Novus "set-brand-Novus" #define NID_set_brand_Novus 642 #define OBJ_set_brand_Novus 2L, 23L, 42L, 8L, 6011L +#define OBJ_ENC_set_brand_Novus 0x67, 0x2a, 0x08, 0xae, 0x7b #define SN_des_cdmf "DES-CDMF" #define LN_des_cdmf "des-cdmf" #define NID_des_cdmf 643 #define OBJ_des_cdmf 1L, 2L, 840L, 113549L, 3L, 10L +#define OBJ_ENC_des_cdmf 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x0a #define SN_rsaOAEPEncryptionSET "rsaOAEPEncryptionSET" #define NID_rsaOAEPEncryptionSET 644 #define OBJ_rsaOAEPEncryptionSET 1L, 2L, 840L, 113549L, 1L, 1L, 6L +#define OBJ_ENC_rsaOAEPEncryptionSET \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x06 #define SN_itu_t "ITU-T" #define LN_itu_t "itu-t" @@ -2837,16 +3732,21 @@ extern "C" { #define LN_international_organizations "International Organizations" #define NID_international_organizations 647 #define OBJ_international_organizations 2L, 23L +#define OBJ_ENC_international_organizations 0x67 #define SN_ms_smartcard_login "msSmartcardLogin" #define LN_ms_smartcard_login "Microsoft Smartcardlogin" #define NID_ms_smartcard_login 648 #define OBJ_ms_smartcard_login 1L, 3L, 6L, 1L, 4L, 1L, 311L, 20L, 2L, 2L +#define OBJ_ENC_ms_smartcard_login \ + 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x02 #define SN_ms_upn "msUPN" #define LN_ms_upn "Microsoft Universal Principal Name" #define NID_ms_upn 649 #define OBJ_ms_upn 1L, 3L, 6L, 1L, 4L, 1L, 311L, 20L, 2L, 3L +#define OBJ_ENC_ms_upn \ + 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x03 #define SN_aes_128_cfb1 "AES-128-CFB1" #define LN_aes_128_cfb1 "aes-128-cfb1" @@ -2892,374 +3792,472 @@ extern "C" { #define LN_streetAddress "streetAddress" #define NID_streetAddress 660 #define OBJ_streetAddress 2L, 5L, 4L, 9L +#define OBJ_ENC_streetAddress 0x55, 0x04, 0x09 #define LN_postalCode "postalCode" #define NID_postalCode 661 #define OBJ_postalCode 2L, 5L, 4L, 17L +#define OBJ_ENC_postalCode 0x55, 0x04, 0x11 #define SN_id_ppl "id-ppl" #define NID_id_ppl 662 #define OBJ_id_ppl 1L, 3L, 6L, 1L, 5L, 5L, 7L, 21L +#define OBJ_ENC_id_ppl 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x15 #define SN_proxyCertInfo "proxyCertInfo" #define LN_proxyCertInfo "Proxy Certificate Information" #define NID_proxyCertInfo 663 #define OBJ_proxyCertInfo 1L, 3L, 6L, 1L, 5L, 5L, 7L, 1L, 14L +#define OBJ_ENC_proxyCertInfo 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x0e #define SN_id_ppl_anyLanguage "id-ppl-anyLanguage" #define LN_id_ppl_anyLanguage "Any language" #define NID_id_ppl_anyLanguage 664 #define OBJ_id_ppl_anyLanguage 1L, 3L, 6L, 1L, 5L, 5L, 7L, 21L, 0L +#define OBJ_ENC_id_ppl_anyLanguage \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x15, 0x00 #define SN_id_ppl_inheritAll "id-ppl-inheritAll" #define LN_id_ppl_inheritAll "Inherit all" #define NID_id_ppl_inheritAll 665 #define OBJ_id_ppl_inheritAll 1L, 3L, 6L, 1L, 5L, 5L, 7L, 21L, 1L +#define OBJ_ENC_id_ppl_inheritAll 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x15, 0x01 #define SN_name_constraints "nameConstraints" #define LN_name_constraints "X509v3 Name Constraints" #define NID_name_constraints 666 #define OBJ_name_constraints 2L, 5L, 29L, 30L +#define OBJ_ENC_name_constraints 0x55, 0x1d, 0x1e #define SN_Independent "id-ppl-independent" #define LN_Independent "Independent" #define NID_Independent 667 #define OBJ_Independent 1L, 3L, 6L, 1L, 5L, 5L, 7L, 21L, 2L +#define OBJ_ENC_Independent 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x15, 0x02 #define SN_sha256WithRSAEncryption "RSA-SHA256" #define LN_sha256WithRSAEncryption "sha256WithRSAEncryption" #define NID_sha256WithRSAEncryption 668 #define OBJ_sha256WithRSAEncryption 1L, 2L, 840L, 113549L, 1L, 1L, 11L +#define OBJ_ENC_sha256WithRSAEncryption \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b #define SN_sha384WithRSAEncryption "RSA-SHA384" #define LN_sha384WithRSAEncryption "sha384WithRSAEncryption" #define NID_sha384WithRSAEncryption 669 #define OBJ_sha384WithRSAEncryption 1L, 2L, 840L, 113549L, 1L, 1L, 12L +#define OBJ_ENC_sha384WithRSAEncryption \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c #define SN_sha512WithRSAEncryption "RSA-SHA512" #define LN_sha512WithRSAEncryption "sha512WithRSAEncryption" #define NID_sha512WithRSAEncryption 670 #define OBJ_sha512WithRSAEncryption 1L, 2L, 840L, 113549L, 1L, 1L, 13L +#define OBJ_ENC_sha512WithRSAEncryption \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0d #define SN_sha224WithRSAEncryption "RSA-SHA224" #define LN_sha224WithRSAEncryption "sha224WithRSAEncryption" #define NID_sha224WithRSAEncryption 671 #define OBJ_sha224WithRSAEncryption 1L, 2L, 840L, 113549L, 1L, 1L, 14L +#define OBJ_ENC_sha224WithRSAEncryption \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0e #define SN_sha256 "SHA256" #define LN_sha256 "sha256" #define NID_sha256 672 #define OBJ_sha256 2L, 16L, 840L, 1L, 101L, 3L, 4L, 2L, 1L +#define OBJ_ENC_sha256 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01 #define SN_sha384 "SHA384" #define LN_sha384 "sha384" #define NID_sha384 673 #define OBJ_sha384 2L, 16L, 840L, 1L, 101L, 3L, 4L, 2L, 2L +#define OBJ_ENC_sha384 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02 #define SN_sha512 "SHA512" #define LN_sha512 "sha512" #define NID_sha512 674 #define OBJ_sha512 2L, 16L, 840L, 1L, 101L, 3L, 4L, 2L, 3L +#define OBJ_ENC_sha512 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03 #define SN_sha224 "SHA224" #define LN_sha224 "sha224" #define NID_sha224 675 #define OBJ_sha224 2L, 16L, 840L, 1L, 101L, 3L, 4L, 2L, 4L +#define OBJ_ENC_sha224 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04 #define SN_identified_organization "identified-organization" #define NID_identified_organization 676 #define OBJ_identified_organization 1L, 3L +#define OBJ_ENC_identified_organization 0x2b #define SN_certicom_arc "certicom-arc" #define NID_certicom_arc 677 #define OBJ_certicom_arc 1L, 3L, 132L +#define OBJ_ENC_certicom_arc 0x2b, 0x81, 0x04 #define SN_wap "wap" #define NID_wap 678 #define OBJ_wap 2L, 23L, 43L +#define OBJ_ENC_wap 0x67, 0x2b #define SN_wap_wsg "wap-wsg" #define NID_wap_wsg 679 #define OBJ_wap_wsg 2L, 23L, 43L, 1L +#define OBJ_ENC_wap_wsg 0x67, 0x2b, 0x01 #define SN_X9_62_id_characteristic_two_basis "id-characteristic-two-basis" #define NID_X9_62_id_characteristic_two_basis 680 #define OBJ_X9_62_id_characteristic_two_basis 1L, 2L, 840L, 10045L, 1L, 2L, 3L +#define OBJ_ENC_X9_62_id_characteristic_two_basis \ + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x01, 0x02, 0x03 #define SN_X9_62_onBasis "onBasis" #define NID_X9_62_onBasis 681 #define OBJ_X9_62_onBasis 1L, 2L, 840L, 10045L, 1L, 2L, 3L, 1L +#define OBJ_ENC_X9_62_onBasis \ + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x01, 0x02, 0x03, 0x01 #define SN_X9_62_tpBasis "tpBasis" #define NID_X9_62_tpBasis 682 #define OBJ_X9_62_tpBasis 1L, 2L, 840L, 10045L, 1L, 2L, 3L, 2L +#define OBJ_ENC_X9_62_tpBasis \ + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x01, 0x02, 0x03, 0x02 #define SN_X9_62_ppBasis "ppBasis" #define NID_X9_62_ppBasis 683 #define OBJ_X9_62_ppBasis 1L, 2L, 840L, 10045L, 1L, 2L, 3L, 3L +#define OBJ_ENC_X9_62_ppBasis \ + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x01, 0x02, 0x03, 0x03 #define SN_X9_62_c2pnb163v1 "c2pnb163v1" #define NID_X9_62_c2pnb163v1 684 #define OBJ_X9_62_c2pnb163v1 1L, 2L, 840L, 10045L, 3L, 0L, 1L +#define OBJ_ENC_X9_62_c2pnb163v1 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x01 #define SN_X9_62_c2pnb163v2 "c2pnb163v2" #define NID_X9_62_c2pnb163v2 685 #define OBJ_X9_62_c2pnb163v2 1L, 2L, 840L, 10045L, 3L, 0L, 2L +#define OBJ_ENC_X9_62_c2pnb163v2 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x02 #define SN_X9_62_c2pnb163v3 "c2pnb163v3" #define NID_X9_62_c2pnb163v3 686 #define OBJ_X9_62_c2pnb163v3 1L, 2L, 840L, 10045L, 3L, 0L, 3L +#define OBJ_ENC_X9_62_c2pnb163v3 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x03 #define SN_X9_62_c2pnb176v1 "c2pnb176v1" #define NID_X9_62_c2pnb176v1 687 #define OBJ_X9_62_c2pnb176v1 1L, 2L, 840L, 10045L, 3L, 0L, 4L +#define OBJ_ENC_X9_62_c2pnb176v1 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x04 #define SN_X9_62_c2tnb191v1 "c2tnb191v1" #define NID_X9_62_c2tnb191v1 688 #define OBJ_X9_62_c2tnb191v1 1L, 2L, 840L, 10045L, 3L, 0L, 5L +#define OBJ_ENC_X9_62_c2tnb191v1 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x05 #define SN_X9_62_c2tnb191v2 "c2tnb191v2" #define NID_X9_62_c2tnb191v2 689 #define OBJ_X9_62_c2tnb191v2 1L, 2L, 840L, 10045L, 3L, 0L, 6L +#define OBJ_ENC_X9_62_c2tnb191v2 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x06 #define SN_X9_62_c2tnb191v3 "c2tnb191v3" #define NID_X9_62_c2tnb191v3 690 #define OBJ_X9_62_c2tnb191v3 1L, 2L, 840L, 10045L, 3L, 0L, 7L +#define OBJ_ENC_X9_62_c2tnb191v3 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x07 #define SN_X9_62_c2onb191v4 "c2onb191v4" #define NID_X9_62_c2onb191v4 691 #define OBJ_X9_62_c2onb191v4 1L, 2L, 840L, 10045L, 3L, 0L, 8L +#define OBJ_ENC_X9_62_c2onb191v4 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x08 #define SN_X9_62_c2onb191v5 "c2onb191v5" #define NID_X9_62_c2onb191v5 692 #define OBJ_X9_62_c2onb191v5 1L, 2L, 840L, 10045L, 3L, 0L, 9L +#define OBJ_ENC_X9_62_c2onb191v5 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x09 #define SN_X9_62_c2pnb208w1 "c2pnb208w1" #define NID_X9_62_c2pnb208w1 693 #define OBJ_X9_62_c2pnb208w1 1L, 2L, 840L, 10045L, 3L, 0L, 10L +#define OBJ_ENC_X9_62_c2pnb208w1 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x0a #define SN_X9_62_c2tnb239v1 "c2tnb239v1" #define NID_X9_62_c2tnb239v1 694 #define OBJ_X9_62_c2tnb239v1 1L, 2L, 840L, 10045L, 3L, 0L, 11L +#define OBJ_ENC_X9_62_c2tnb239v1 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x0b #define SN_X9_62_c2tnb239v2 "c2tnb239v2" #define NID_X9_62_c2tnb239v2 695 #define OBJ_X9_62_c2tnb239v2 1L, 2L, 840L, 10045L, 3L, 0L, 12L +#define OBJ_ENC_X9_62_c2tnb239v2 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x0c #define SN_X9_62_c2tnb239v3 "c2tnb239v3" #define NID_X9_62_c2tnb239v3 696 #define OBJ_X9_62_c2tnb239v3 1L, 2L, 840L, 10045L, 3L, 0L, 13L +#define OBJ_ENC_X9_62_c2tnb239v3 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x0d #define SN_X9_62_c2onb239v4 "c2onb239v4" #define NID_X9_62_c2onb239v4 697 #define OBJ_X9_62_c2onb239v4 1L, 2L, 840L, 10045L, 3L, 0L, 14L +#define OBJ_ENC_X9_62_c2onb239v4 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x0e #define SN_X9_62_c2onb239v5 "c2onb239v5" #define NID_X9_62_c2onb239v5 698 #define OBJ_X9_62_c2onb239v5 1L, 2L, 840L, 10045L, 3L, 0L, 15L +#define OBJ_ENC_X9_62_c2onb239v5 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x0f #define SN_X9_62_c2pnb272w1 "c2pnb272w1" #define NID_X9_62_c2pnb272w1 699 #define OBJ_X9_62_c2pnb272w1 1L, 2L, 840L, 10045L, 3L, 0L, 16L +#define OBJ_ENC_X9_62_c2pnb272w1 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x10 #define SN_X9_62_c2pnb304w1 "c2pnb304w1" #define NID_X9_62_c2pnb304w1 700 #define OBJ_X9_62_c2pnb304w1 1L, 2L, 840L, 10045L, 3L, 0L, 17L +#define OBJ_ENC_X9_62_c2pnb304w1 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x11 #define SN_X9_62_c2tnb359v1 "c2tnb359v1" #define NID_X9_62_c2tnb359v1 701 #define OBJ_X9_62_c2tnb359v1 1L, 2L, 840L, 10045L, 3L, 0L, 18L +#define OBJ_ENC_X9_62_c2tnb359v1 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x12 #define SN_X9_62_c2pnb368w1 "c2pnb368w1" #define NID_X9_62_c2pnb368w1 702 #define OBJ_X9_62_c2pnb368w1 1L, 2L, 840L, 10045L, 3L, 0L, 19L +#define OBJ_ENC_X9_62_c2pnb368w1 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x13 #define SN_X9_62_c2tnb431r1 "c2tnb431r1" #define NID_X9_62_c2tnb431r1 703 #define OBJ_X9_62_c2tnb431r1 1L, 2L, 840L, 10045L, 3L, 0L, 20L +#define OBJ_ENC_X9_62_c2tnb431r1 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x00, 0x14 #define SN_secp112r1 "secp112r1" #define NID_secp112r1 704 #define OBJ_secp112r1 1L, 3L, 132L, 0L, 6L +#define OBJ_ENC_secp112r1 0x2b, 0x81, 0x04, 0x00, 0x06 #define SN_secp112r2 "secp112r2" #define NID_secp112r2 705 #define OBJ_secp112r2 1L, 3L, 132L, 0L, 7L +#define OBJ_ENC_secp112r2 0x2b, 0x81, 0x04, 0x00, 0x07 #define SN_secp128r1 "secp128r1" #define NID_secp128r1 706 #define OBJ_secp128r1 1L, 3L, 132L, 0L, 28L +#define OBJ_ENC_secp128r1 0x2b, 0x81, 0x04, 0x00, 0x1c #define SN_secp128r2 "secp128r2" #define NID_secp128r2 707 #define OBJ_secp128r2 1L, 3L, 132L, 0L, 29L +#define OBJ_ENC_secp128r2 0x2b, 0x81, 0x04, 0x00, 0x1d #define SN_secp160k1 "secp160k1" #define NID_secp160k1 708 #define OBJ_secp160k1 1L, 3L, 132L, 0L, 9L +#define OBJ_ENC_secp160k1 0x2b, 0x81, 0x04, 0x00, 0x09 #define SN_secp160r1 "secp160r1" #define NID_secp160r1 709 #define OBJ_secp160r1 1L, 3L, 132L, 0L, 8L +#define OBJ_ENC_secp160r1 0x2b, 0x81, 0x04, 0x00, 0x08 #define SN_secp160r2 "secp160r2" #define NID_secp160r2 710 #define OBJ_secp160r2 1L, 3L, 132L, 0L, 30L +#define OBJ_ENC_secp160r2 0x2b, 0x81, 0x04, 0x00, 0x1e #define SN_secp192k1 "secp192k1" #define NID_secp192k1 711 #define OBJ_secp192k1 1L, 3L, 132L, 0L, 31L +#define OBJ_ENC_secp192k1 0x2b, 0x81, 0x04, 0x00, 0x1f #define SN_secp224k1 "secp224k1" #define NID_secp224k1 712 #define OBJ_secp224k1 1L, 3L, 132L, 0L, 32L +#define OBJ_ENC_secp224k1 0x2b, 0x81, 0x04, 0x00, 0x20 #define SN_secp224r1 "secp224r1" #define NID_secp224r1 713 #define OBJ_secp224r1 1L, 3L, 132L, 0L, 33L +#define OBJ_ENC_secp224r1 0x2b, 0x81, 0x04, 0x00, 0x21 #define SN_secp256k1 "secp256k1" #define NID_secp256k1 714 #define OBJ_secp256k1 1L, 3L, 132L, 0L, 10L +#define OBJ_ENC_secp256k1 0x2b, 0x81, 0x04, 0x00, 0x0a #define SN_secp384r1 "secp384r1" #define NID_secp384r1 715 #define OBJ_secp384r1 1L, 3L, 132L, 0L, 34L +#define OBJ_ENC_secp384r1 0x2b, 0x81, 0x04, 0x00, 0x22 #define SN_secp521r1 "secp521r1" #define NID_secp521r1 716 #define OBJ_secp521r1 1L, 3L, 132L, 0L, 35L +#define OBJ_ENC_secp521r1 0x2b, 0x81, 0x04, 0x00, 0x23 #define SN_sect113r1 "sect113r1" #define NID_sect113r1 717 #define OBJ_sect113r1 1L, 3L, 132L, 0L, 4L +#define OBJ_ENC_sect113r1 0x2b, 0x81, 0x04, 0x00, 0x04 #define SN_sect113r2 "sect113r2" #define NID_sect113r2 718 #define OBJ_sect113r2 1L, 3L, 132L, 0L, 5L +#define OBJ_ENC_sect113r2 0x2b, 0x81, 0x04, 0x00, 0x05 #define SN_sect131r1 "sect131r1" #define NID_sect131r1 719 #define OBJ_sect131r1 1L, 3L, 132L, 0L, 22L +#define OBJ_ENC_sect131r1 0x2b, 0x81, 0x04, 0x00, 0x16 #define SN_sect131r2 "sect131r2" #define NID_sect131r2 720 #define OBJ_sect131r2 1L, 3L, 132L, 0L, 23L +#define OBJ_ENC_sect131r2 0x2b, 0x81, 0x04, 0x00, 0x17 #define SN_sect163k1 "sect163k1" #define NID_sect163k1 721 #define OBJ_sect163k1 1L, 3L, 132L, 0L, 1L +#define OBJ_ENC_sect163k1 0x2b, 0x81, 0x04, 0x00, 0x01 #define SN_sect163r1 "sect163r1" #define NID_sect163r1 722 #define OBJ_sect163r1 1L, 3L, 132L, 0L, 2L +#define OBJ_ENC_sect163r1 0x2b, 0x81, 0x04, 0x00, 0x02 #define SN_sect163r2 "sect163r2" #define NID_sect163r2 723 #define OBJ_sect163r2 1L, 3L, 132L, 0L, 15L +#define OBJ_ENC_sect163r2 0x2b, 0x81, 0x04, 0x00, 0x0f #define SN_sect193r1 "sect193r1" #define NID_sect193r1 724 #define OBJ_sect193r1 1L, 3L, 132L, 0L, 24L +#define OBJ_ENC_sect193r1 0x2b, 0x81, 0x04, 0x00, 0x18 #define SN_sect193r2 "sect193r2" #define NID_sect193r2 725 #define OBJ_sect193r2 1L, 3L, 132L, 0L, 25L +#define OBJ_ENC_sect193r2 0x2b, 0x81, 0x04, 0x00, 0x19 #define SN_sect233k1 "sect233k1" #define NID_sect233k1 726 #define OBJ_sect233k1 1L, 3L, 132L, 0L, 26L +#define OBJ_ENC_sect233k1 0x2b, 0x81, 0x04, 0x00, 0x1a #define SN_sect233r1 "sect233r1" #define NID_sect233r1 727 #define OBJ_sect233r1 1L, 3L, 132L, 0L, 27L +#define OBJ_ENC_sect233r1 0x2b, 0x81, 0x04, 0x00, 0x1b #define SN_sect239k1 "sect239k1" #define NID_sect239k1 728 #define OBJ_sect239k1 1L, 3L, 132L, 0L, 3L +#define OBJ_ENC_sect239k1 0x2b, 0x81, 0x04, 0x00, 0x03 #define SN_sect283k1 "sect283k1" #define NID_sect283k1 729 #define OBJ_sect283k1 1L, 3L, 132L, 0L, 16L +#define OBJ_ENC_sect283k1 0x2b, 0x81, 0x04, 0x00, 0x10 #define SN_sect283r1 "sect283r1" #define NID_sect283r1 730 #define OBJ_sect283r1 1L, 3L, 132L, 0L, 17L +#define OBJ_ENC_sect283r1 0x2b, 0x81, 0x04, 0x00, 0x11 #define SN_sect409k1 "sect409k1" #define NID_sect409k1 731 #define OBJ_sect409k1 1L, 3L, 132L, 0L, 36L +#define OBJ_ENC_sect409k1 0x2b, 0x81, 0x04, 0x00, 0x24 #define SN_sect409r1 "sect409r1" #define NID_sect409r1 732 #define OBJ_sect409r1 1L, 3L, 132L, 0L, 37L +#define OBJ_ENC_sect409r1 0x2b, 0x81, 0x04, 0x00, 0x25 #define SN_sect571k1 "sect571k1" #define NID_sect571k1 733 #define OBJ_sect571k1 1L, 3L, 132L, 0L, 38L +#define OBJ_ENC_sect571k1 0x2b, 0x81, 0x04, 0x00, 0x26 #define SN_sect571r1 "sect571r1" #define NID_sect571r1 734 #define OBJ_sect571r1 1L, 3L, 132L, 0L, 39L +#define OBJ_ENC_sect571r1 0x2b, 0x81, 0x04, 0x00, 0x27 #define SN_wap_wsg_idm_ecid_wtls1 "wap-wsg-idm-ecid-wtls1" #define NID_wap_wsg_idm_ecid_wtls1 735 #define OBJ_wap_wsg_idm_ecid_wtls1 2L, 23L, 43L, 1L, 4L, 1L +#define OBJ_ENC_wap_wsg_idm_ecid_wtls1 0x67, 0x2b, 0x01, 0x04, 0x01 #define SN_wap_wsg_idm_ecid_wtls3 "wap-wsg-idm-ecid-wtls3" #define NID_wap_wsg_idm_ecid_wtls3 736 #define OBJ_wap_wsg_idm_ecid_wtls3 2L, 23L, 43L, 1L, 4L, 3L +#define OBJ_ENC_wap_wsg_idm_ecid_wtls3 0x67, 0x2b, 0x01, 0x04, 0x03 #define SN_wap_wsg_idm_ecid_wtls4 "wap-wsg-idm-ecid-wtls4" #define NID_wap_wsg_idm_ecid_wtls4 737 #define OBJ_wap_wsg_idm_ecid_wtls4 2L, 23L, 43L, 1L, 4L, 4L +#define OBJ_ENC_wap_wsg_idm_ecid_wtls4 0x67, 0x2b, 0x01, 0x04, 0x04 #define SN_wap_wsg_idm_ecid_wtls5 "wap-wsg-idm-ecid-wtls5" #define NID_wap_wsg_idm_ecid_wtls5 738 #define OBJ_wap_wsg_idm_ecid_wtls5 2L, 23L, 43L, 1L, 4L, 5L +#define OBJ_ENC_wap_wsg_idm_ecid_wtls5 0x67, 0x2b, 0x01, 0x04, 0x05 #define SN_wap_wsg_idm_ecid_wtls6 "wap-wsg-idm-ecid-wtls6" #define NID_wap_wsg_idm_ecid_wtls6 739 #define OBJ_wap_wsg_idm_ecid_wtls6 2L, 23L, 43L, 1L, 4L, 6L +#define OBJ_ENC_wap_wsg_idm_ecid_wtls6 0x67, 0x2b, 0x01, 0x04, 0x06 #define SN_wap_wsg_idm_ecid_wtls7 "wap-wsg-idm-ecid-wtls7" #define NID_wap_wsg_idm_ecid_wtls7 740 #define OBJ_wap_wsg_idm_ecid_wtls7 2L, 23L, 43L, 1L, 4L, 7L +#define OBJ_ENC_wap_wsg_idm_ecid_wtls7 0x67, 0x2b, 0x01, 0x04, 0x07 #define SN_wap_wsg_idm_ecid_wtls8 "wap-wsg-idm-ecid-wtls8" #define NID_wap_wsg_idm_ecid_wtls8 741 #define OBJ_wap_wsg_idm_ecid_wtls8 2L, 23L, 43L, 1L, 4L, 8L +#define OBJ_ENC_wap_wsg_idm_ecid_wtls8 0x67, 0x2b, 0x01, 0x04, 0x08 #define SN_wap_wsg_idm_ecid_wtls9 "wap-wsg-idm-ecid-wtls9" #define NID_wap_wsg_idm_ecid_wtls9 742 #define OBJ_wap_wsg_idm_ecid_wtls9 2L, 23L, 43L, 1L, 4L, 9L +#define OBJ_ENC_wap_wsg_idm_ecid_wtls9 0x67, 0x2b, 0x01, 0x04, 0x09 #define SN_wap_wsg_idm_ecid_wtls10 "wap-wsg-idm-ecid-wtls10" #define NID_wap_wsg_idm_ecid_wtls10 743 #define OBJ_wap_wsg_idm_ecid_wtls10 2L, 23L, 43L, 1L, 4L, 10L +#define OBJ_ENC_wap_wsg_idm_ecid_wtls10 0x67, 0x2b, 0x01, 0x04, 0x0a #define SN_wap_wsg_idm_ecid_wtls11 "wap-wsg-idm-ecid-wtls11" #define NID_wap_wsg_idm_ecid_wtls11 744 #define OBJ_wap_wsg_idm_ecid_wtls11 2L, 23L, 43L, 1L, 4L, 11L +#define OBJ_ENC_wap_wsg_idm_ecid_wtls11 0x67, 0x2b, 0x01, 0x04, 0x0b #define SN_wap_wsg_idm_ecid_wtls12 "wap-wsg-idm-ecid-wtls12" #define NID_wap_wsg_idm_ecid_wtls12 745 #define OBJ_wap_wsg_idm_ecid_wtls12 2L, 23L, 43L, 1L, 4L, 12L +#define OBJ_ENC_wap_wsg_idm_ecid_wtls12 0x67, 0x2b, 0x01, 0x04, 0x0c #define SN_any_policy "anyPolicy" #define LN_any_policy "X509v3 Any Policy" #define NID_any_policy 746 #define OBJ_any_policy 2L, 5L, 29L, 32L, 0L +#define OBJ_ENC_any_policy 0x55, 0x1d, 0x20, 0x00 #define SN_policy_mappings "policyMappings" #define LN_policy_mappings "X509v3 Policy Mappings" #define NID_policy_mappings 747 #define OBJ_policy_mappings 2L, 5L, 29L, 33L +#define OBJ_ENC_policy_mappings 0x55, 0x1d, 0x21 #define SN_inhibit_any_policy "inhibitAnyPolicy" #define LN_inhibit_any_policy "X509v3 Inhibit Any Policy" #define NID_inhibit_any_policy 748 #define OBJ_inhibit_any_policy 2L, 5L, 29L, 54L +#define OBJ_ENC_inhibit_any_policy 0x55, 0x1d, 0x36 #define SN_ipsec3 "Oakley-EC2N-3" #define LN_ipsec3 "ipsec3" @@ -3273,46 +4271,61 @@ extern "C" { #define LN_camellia_128_cbc "camellia-128-cbc" #define NID_camellia_128_cbc 751 #define OBJ_camellia_128_cbc 1L, 2L, 392L, 200011L, 61L, 1L, 1L, 1L, 2L +#define OBJ_ENC_camellia_128_cbc \ + 0x2a, 0x83, 0x08, 0x8c, 0x9a, 0x4b, 0x3d, 0x01, 0x01, 0x01, 0x02 #define SN_camellia_192_cbc "CAMELLIA-192-CBC" #define LN_camellia_192_cbc "camellia-192-cbc" #define NID_camellia_192_cbc 752 #define OBJ_camellia_192_cbc 1L, 2L, 392L, 200011L, 61L, 1L, 1L, 1L, 3L +#define OBJ_ENC_camellia_192_cbc \ + 0x2a, 0x83, 0x08, 0x8c, 0x9a, 0x4b, 0x3d, 0x01, 0x01, 0x01, 0x03 #define SN_camellia_256_cbc "CAMELLIA-256-CBC" #define LN_camellia_256_cbc "camellia-256-cbc" #define NID_camellia_256_cbc 753 #define OBJ_camellia_256_cbc 1L, 2L, 392L, 200011L, 61L, 1L, 1L, 1L, 4L +#define OBJ_ENC_camellia_256_cbc \ + 0x2a, 0x83, 0x08, 0x8c, 0x9a, 0x4b, 0x3d, 0x01, 0x01, 0x01, 0x04 #define SN_camellia_128_ecb "CAMELLIA-128-ECB" #define LN_camellia_128_ecb "camellia-128-ecb" #define NID_camellia_128_ecb 754 #define OBJ_camellia_128_ecb 0L, 3L, 4401L, 5L, 3L, 1L, 9L, 1L +#define OBJ_ENC_camellia_128_ecb 0x03, 0xa2, 0x31, 0x05, 0x03, 0x01, 0x09, 0x01 #define SN_camellia_192_ecb "CAMELLIA-192-ECB" #define LN_camellia_192_ecb "camellia-192-ecb" #define NID_camellia_192_ecb 755 #define OBJ_camellia_192_ecb 0L, 3L, 4401L, 5L, 3L, 1L, 9L, 21L +#define OBJ_ENC_camellia_192_ecb 0x03, 0xa2, 0x31, 0x05, 0x03, 0x01, 0x09, 0x15 #define SN_camellia_256_ecb "CAMELLIA-256-ECB" #define LN_camellia_256_ecb "camellia-256-ecb" #define NID_camellia_256_ecb 756 #define OBJ_camellia_256_ecb 0L, 3L, 4401L, 5L, 3L, 1L, 9L, 41L +#define OBJ_ENC_camellia_256_ecb 0x03, 0xa2, 0x31, 0x05, 0x03, 0x01, 0x09, 0x29 #define SN_camellia_128_cfb128 "CAMELLIA-128-CFB" #define LN_camellia_128_cfb128 "camellia-128-cfb" #define NID_camellia_128_cfb128 757 #define OBJ_camellia_128_cfb128 0L, 3L, 4401L, 5L, 3L, 1L, 9L, 4L +#define OBJ_ENC_camellia_128_cfb128 \ + 0x03, 0xa2, 0x31, 0x05, 0x03, 0x01, 0x09, 0x04 #define SN_camellia_192_cfb128 "CAMELLIA-192-CFB" #define LN_camellia_192_cfb128 "camellia-192-cfb" #define NID_camellia_192_cfb128 758 #define OBJ_camellia_192_cfb128 0L, 3L, 4401L, 5L, 3L, 1L, 9L, 24L +#define OBJ_ENC_camellia_192_cfb128 \ + 0x03, 0xa2, 0x31, 0x05, 0x03, 0x01, 0x09, 0x18 #define SN_camellia_256_cfb128 "CAMELLIA-256-CFB" #define LN_camellia_256_cfb128 "camellia-256-cfb" #define NID_camellia_256_cfb128 759 #define OBJ_camellia_256_cfb128 0L, 3L, 4401L, 5L, 3L, 1L, 9L, 44L +#define OBJ_ENC_camellia_256_cfb128 \ + 0x03, 0xa2, 0x31, 0x05, 0x03, 0x01, 0x09, 0x2c #define SN_camellia_128_cfb1 "CAMELLIA-128-CFB1" #define LN_camellia_128_cfb1 "camellia-128-cfb1" @@ -3342,170 +4355,221 @@ extern "C" { #define LN_camellia_128_ofb128 "camellia-128-ofb" #define NID_camellia_128_ofb128 766 #define OBJ_camellia_128_ofb128 0L, 3L, 4401L, 5L, 3L, 1L, 9L, 3L +#define OBJ_ENC_camellia_128_ofb128 \ + 0x03, 0xa2, 0x31, 0x05, 0x03, 0x01, 0x09, 0x03 #define SN_camellia_192_ofb128 "CAMELLIA-192-OFB" #define LN_camellia_192_ofb128 "camellia-192-ofb" #define NID_camellia_192_ofb128 767 #define OBJ_camellia_192_ofb128 0L, 3L, 4401L, 5L, 3L, 1L, 9L, 23L +#define OBJ_ENC_camellia_192_ofb128 \ + 0x03, 0xa2, 0x31, 0x05, 0x03, 0x01, 0x09, 0x17 #define SN_camellia_256_ofb128 "CAMELLIA-256-OFB" #define LN_camellia_256_ofb128 "camellia-256-ofb" #define NID_camellia_256_ofb128 768 #define OBJ_camellia_256_ofb128 0L, 3L, 4401L, 5L, 3L, 1L, 9L, 43L +#define OBJ_ENC_camellia_256_ofb128 \ + 0x03, 0xa2, 0x31, 0x05, 0x03, 0x01, 0x09, 0x2b #define SN_subject_directory_attributes "subjectDirectoryAttributes" #define LN_subject_directory_attributes "X509v3 Subject Directory Attributes" #define NID_subject_directory_attributes 769 #define OBJ_subject_directory_attributes 2L, 5L, 29L, 9L +#define OBJ_ENC_subject_directory_attributes 0x55, 0x1d, 0x09 #define SN_issuing_distribution_point "issuingDistributionPoint" #define LN_issuing_distribution_point "X509v3 Issuing Distribution Point" #define NID_issuing_distribution_point 770 #define OBJ_issuing_distribution_point 2L, 5L, 29L, 28L +#define OBJ_ENC_issuing_distribution_point 0x55, 0x1d, 0x1c #define SN_certificate_issuer "certificateIssuer" #define LN_certificate_issuer "X509v3 Certificate Issuer" #define NID_certificate_issuer 771 #define OBJ_certificate_issuer 2L, 5L, 29L, 29L +#define OBJ_ENC_certificate_issuer 0x55, 0x1d, 0x1d #define SN_kisa "KISA" #define LN_kisa "kisa" #define NID_kisa 773 #define OBJ_kisa 1L, 2L, 410L, 200004L +#define OBJ_ENC_kisa 0x2a, 0x83, 0x1a, 0x8c, 0x9a, 0x44 #define SN_seed_ecb "SEED-ECB" #define LN_seed_ecb "seed-ecb" #define NID_seed_ecb 776 #define OBJ_seed_ecb 1L, 2L, 410L, 200004L, 1L, 3L +#define OBJ_ENC_seed_ecb 0x2a, 0x83, 0x1a, 0x8c, 0x9a, 0x44, 0x01, 0x03 #define SN_seed_cbc "SEED-CBC" #define LN_seed_cbc "seed-cbc" #define NID_seed_cbc 777 #define OBJ_seed_cbc 1L, 2L, 410L, 200004L, 1L, 4L +#define OBJ_ENC_seed_cbc 0x2a, 0x83, 0x1a, 0x8c, 0x9a, 0x44, 0x01, 0x04 #define SN_seed_ofb128 "SEED-OFB" #define LN_seed_ofb128 "seed-ofb" #define NID_seed_ofb128 778 #define OBJ_seed_ofb128 1L, 2L, 410L, 200004L, 1L, 6L +#define OBJ_ENC_seed_ofb128 0x2a, 0x83, 0x1a, 0x8c, 0x9a, 0x44, 0x01, 0x06 #define SN_seed_cfb128 "SEED-CFB" #define LN_seed_cfb128 "seed-cfb" #define NID_seed_cfb128 779 #define OBJ_seed_cfb128 1L, 2L, 410L, 200004L, 1L, 5L +#define OBJ_ENC_seed_cfb128 0x2a, 0x83, 0x1a, 0x8c, 0x9a, 0x44, 0x01, 0x05 #define SN_hmac_md5 "HMAC-MD5" #define LN_hmac_md5 "hmac-md5" #define NID_hmac_md5 780 #define OBJ_hmac_md5 1L, 3L, 6L, 1L, 5L, 5L, 8L, 1L, 1L +#define OBJ_ENC_hmac_md5 0x2b, 0x06, 0x01, 0x05, 0x05, 0x08, 0x01, 0x01 #define SN_hmac_sha1 "HMAC-SHA1" #define LN_hmac_sha1 "hmac-sha1" #define NID_hmac_sha1 781 #define OBJ_hmac_sha1 1L, 3L, 6L, 1L, 5L, 5L, 8L, 1L, 2L +#define OBJ_ENC_hmac_sha1 0x2b, 0x06, 0x01, 0x05, 0x05, 0x08, 0x01, 0x02 #define SN_id_PasswordBasedMAC "id-PasswordBasedMAC" #define LN_id_PasswordBasedMAC "password based MAC" #define NID_id_PasswordBasedMAC 782 #define OBJ_id_PasswordBasedMAC 1L, 2L, 840L, 113533L, 7L, 66L, 13L +#define OBJ_ENC_id_PasswordBasedMAC \ + 0x2a, 0x86, 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x42, 0x0d #define SN_id_DHBasedMac "id-DHBasedMac" #define LN_id_DHBasedMac "Diffie-Hellman based MAC" #define NID_id_DHBasedMac 783 #define OBJ_id_DHBasedMac 1L, 2L, 840L, 113533L, 7L, 66L, 30L +#define OBJ_ENC_id_DHBasedMac \ + 0x2a, 0x86, 0x48, 0x86, 0xf6, 0x7d, 0x07, 0x42, 0x1e #define SN_id_it_suppLangTags "id-it-suppLangTags" #define NID_id_it_suppLangTags 784 #define OBJ_id_it_suppLangTags 1L, 3L, 6L, 1L, 5L, 5L, 7L, 4L, 16L +#define OBJ_ENC_id_it_suppLangTags \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x04, 0x10 #define SN_caRepository "caRepository" #define LN_caRepository "CA Repository" #define NID_caRepository 785 #define OBJ_caRepository 1L, 3L, 6L, 1L, 5L, 5L, 7L, 48L, 5L +#define OBJ_ENC_caRepository 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x05 #define SN_id_smime_ct_compressedData "id-smime-ct-compressedData" #define NID_id_smime_ct_compressedData 786 #define OBJ_id_smime_ct_compressedData \ 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 1L, 9L +#define OBJ_ENC_id_smime_ct_compressedData \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x01, 0x09 #define SN_id_ct_asciiTextWithCRLF "id-ct-asciiTextWithCRLF" #define NID_id_ct_asciiTextWithCRLF 787 #define OBJ_id_ct_asciiTextWithCRLF 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 1L, 27L +#define OBJ_ENC_id_ct_asciiTextWithCRLF \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x01, 0x1b #define SN_id_aes128_wrap "id-aes128-wrap" #define NID_id_aes128_wrap 788 #define OBJ_id_aes128_wrap 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 5L +#define OBJ_ENC_id_aes128_wrap \ + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x05 #define SN_id_aes192_wrap "id-aes192-wrap" #define NID_id_aes192_wrap 789 #define OBJ_id_aes192_wrap 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 25L +#define OBJ_ENC_id_aes192_wrap \ + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x19 #define SN_id_aes256_wrap "id-aes256-wrap" #define NID_id_aes256_wrap 790 #define OBJ_id_aes256_wrap 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 45L +#define OBJ_ENC_id_aes256_wrap \ + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2d #define SN_ecdsa_with_Recommended "ecdsa-with-Recommended" #define NID_ecdsa_with_Recommended 791 #define OBJ_ecdsa_with_Recommended 1L, 2L, 840L, 10045L, 4L, 2L +#define OBJ_ENC_ecdsa_with_Recommended 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x02 #define SN_ecdsa_with_Specified "ecdsa-with-Specified" #define NID_ecdsa_with_Specified 792 #define OBJ_ecdsa_with_Specified 1L, 2L, 840L, 10045L, 4L, 3L +#define OBJ_ENC_ecdsa_with_Specified 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03 #define SN_ecdsa_with_SHA224 "ecdsa-with-SHA224" #define NID_ecdsa_with_SHA224 793 #define OBJ_ecdsa_with_SHA224 1L, 2L, 840L, 10045L, 4L, 3L, 1L +#define OBJ_ENC_ecdsa_with_SHA224 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x01 #define SN_ecdsa_with_SHA256 "ecdsa-with-SHA256" #define NID_ecdsa_with_SHA256 794 #define OBJ_ecdsa_with_SHA256 1L, 2L, 840L, 10045L, 4L, 3L, 2L +#define OBJ_ENC_ecdsa_with_SHA256 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02 #define SN_ecdsa_with_SHA384 "ecdsa-with-SHA384" #define NID_ecdsa_with_SHA384 795 #define OBJ_ecdsa_with_SHA384 1L, 2L, 840L, 10045L, 4L, 3L, 3L +#define OBJ_ENC_ecdsa_with_SHA384 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03 #define SN_ecdsa_with_SHA512 "ecdsa-with-SHA512" #define NID_ecdsa_with_SHA512 796 #define OBJ_ecdsa_with_SHA512 1L, 2L, 840L, 10045L, 4L, 3L, 4L +#define OBJ_ENC_ecdsa_with_SHA512 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x04 #define LN_hmacWithMD5 "hmacWithMD5" #define NID_hmacWithMD5 797 #define OBJ_hmacWithMD5 1L, 2L, 840L, 113549L, 2L, 6L +#define OBJ_ENC_hmacWithMD5 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x06 #define LN_hmacWithSHA224 "hmacWithSHA224" #define NID_hmacWithSHA224 798 #define OBJ_hmacWithSHA224 1L, 2L, 840L, 113549L, 2L, 8L +#define OBJ_ENC_hmacWithSHA224 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x08 #define LN_hmacWithSHA256 "hmacWithSHA256" #define NID_hmacWithSHA256 799 #define OBJ_hmacWithSHA256 1L, 2L, 840L, 113549L, 2L, 9L +#define OBJ_ENC_hmacWithSHA256 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x09 #define LN_hmacWithSHA384 "hmacWithSHA384" #define NID_hmacWithSHA384 800 #define OBJ_hmacWithSHA384 1L, 2L, 840L, 113549L, 2L, 10L +#define OBJ_ENC_hmacWithSHA384 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x0a #define LN_hmacWithSHA512 "hmacWithSHA512" #define NID_hmacWithSHA512 801 #define OBJ_hmacWithSHA512 1L, 2L, 840L, 113549L, 2L, 11L +#define OBJ_ENC_hmacWithSHA512 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x0b #define SN_dsa_with_SHA224 "dsa_with_SHA224" #define NID_dsa_with_SHA224 802 #define OBJ_dsa_with_SHA224 2L, 16L, 840L, 1L, 101L, 3L, 4L, 3L, 1L +#define OBJ_ENC_dsa_with_SHA224 \ + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x01 #define SN_dsa_with_SHA256 "dsa_with_SHA256" #define NID_dsa_with_SHA256 803 #define OBJ_dsa_with_SHA256 2L, 16L, 840L, 1L, 101L, 3L, 4L, 3L, 2L +#define OBJ_ENC_dsa_with_SHA256 \ + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x02 #define SN_whirlpool "whirlpool" #define NID_whirlpool 804 #define OBJ_whirlpool 1L, 0L, 10118L, 3L, 0L, 55L +#define OBJ_ENC_whirlpool 0x28, 0xcf, 0x06, 0x03, 0x00, 0x37 #define SN_cryptopro "cryptopro" #define NID_cryptopro 805 #define OBJ_cryptopro 1L, 2L, 643L, 2L, 2L +#define OBJ_ENC_cryptopro 0x2a, 0x85, 0x03, 0x02, 0x02 #define SN_cryptocom "cryptocom" #define NID_cryptocom 806 #define OBJ_cryptocom 1L, 2L, 643L, 2L, 9L +#define OBJ_ENC_cryptocom 0x2a, 0x85, 0x03, 0x02, 0x09 #define SN_id_GostR3411_94_with_GostR3410_2001 \ "id-GostR3411-94-with-GostR3410-2001" @@ -3513,37 +4577,46 @@ extern "C" { "GOST R 34.11-94 with GOST R 34.10-2001" #define NID_id_GostR3411_94_with_GostR3410_2001 807 #define OBJ_id_GostR3411_94_with_GostR3410_2001 1L, 2L, 643L, 2L, 2L, 3L +#define OBJ_ENC_id_GostR3411_94_with_GostR3410_2001 \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x03 #define SN_id_GostR3411_94_with_GostR3410_94 "id-GostR3411-94-with-GostR3410-94" #define LN_id_GostR3411_94_with_GostR3410_94 \ "GOST R 34.11-94 with GOST R 34.10-94" #define NID_id_GostR3411_94_with_GostR3410_94 808 #define OBJ_id_GostR3411_94_with_GostR3410_94 1L, 2L, 643L, 2L, 2L, 4L +#define OBJ_ENC_id_GostR3411_94_with_GostR3410_94 \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x04 #define SN_id_GostR3411_94 "md_gost94" #define LN_id_GostR3411_94 "GOST R 34.11-94" #define NID_id_GostR3411_94 809 #define OBJ_id_GostR3411_94 1L, 2L, 643L, 2L, 2L, 9L +#define OBJ_ENC_id_GostR3411_94 0x2a, 0x85, 0x03, 0x02, 0x02, 0x09 #define SN_id_HMACGostR3411_94 "id-HMACGostR3411-94" #define LN_id_HMACGostR3411_94 "HMAC GOST 34.11-94" #define NID_id_HMACGostR3411_94 810 #define OBJ_id_HMACGostR3411_94 1L, 2L, 643L, 2L, 2L, 10L +#define OBJ_ENC_id_HMACGostR3411_94 0x2a, 0x85, 0x03, 0x02, 0x02, 0x0a #define SN_id_GostR3410_2001 "gost2001" #define LN_id_GostR3410_2001 "GOST R 34.10-2001" #define NID_id_GostR3410_2001 811 #define OBJ_id_GostR3410_2001 1L, 2L, 643L, 2L, 2L, 19L +#define OBJ_ENC_id_GostR3410_2001 0x2a, 0x85, 0x03, 0x02, 0x02, 0x13 #define SN_id_GostR3410_94 "gost94" #define LN_id_GostR3410_94 "GOST R 34.10-94" #define NID_id_GostR3410_94 812 #define OBJ_id_GostR3410_94 1L, 2L, 643L, 2L, 2L, 20L +#define OBJ_ENC_id_GostR3410_94 0x2a, 0x85, 0x03, 0x02, 0x02, 0x14 #define SN_id_Gost28147_89 "gost89" #define LN_id_Gost28147_89 "GOST 28147-89" #define NID_id_Gost28147_89 813 #define OBJ_id_Gost28147_89 1L, 2L, 643L, 2L, 2L, 21L +#define OBJ_ENC_id_Gost28147_89 0x2a, 0x85, 0x03, 0x02, 0x02, 0x15 #define SN_gost89_cnt "gost89-cnt" #define NID_gost89_cnt 814 @@ -3552,184 +4625,250 @@ extern "C" { #define LN_id_Gost28147_89_MAC "GOST 28147-89 MAC" #define NID_id_Gost28147_89_MAC 815 #define OBJ_id_Gost28147_89_MAC 1L, 2L, 643L, 2L, 2L, 22L +#define OBJ_ENC_id_Gost28147_89_MAC 0x2a, 0x85, 0x03, 0x02, 0x02, 0x16 #define SN_id_GostR3411_94_prf "prf-gostr3411-94" #define LN_id_GostR3411_94_prf "GOST R 34.11-94 PRF" #define NID_id_GostR3411_94_prf 816 #define OBJ_id_GostR3411_94_prf 1L, 2L, 643L, 2L, 2L, 23L +#define OBJ_ENC_id_GostR3411_94_prf 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17 #define SN_id_GostR3410_2001DH "id-GostR3410-2001DH" #define LN_id_GostR3410_2001DH "GOST R 34.10-2001 DH" #define NID_id_GostR3410_2001DH 817 #define OBJ_id_GostR3410_2001DH 1L, 2L, 643L, 2L, 2L, 98L +#define OBJ_ENC_id_GostR3410_2001DH 0x2a, 0x85, 0x03, 0x02, 0x02, 0x62 #define SN_id_GostR3410_94DH "id-GostR3410-94DH" #define LN_id_GostR3410_94DH "GOST R 34.10-94 DH" #define NID_id_GostR3410_94DH 818 #define OBJ_id_GostR3410_94DH 1L, 2L, 643L, 2L, 2L, 99L +#define OBJ_ENC_id_GostR3410_94DH 0x2a, 0x85, 0x03, 0x02, 0x02, 0x63 #define SN_id_Gost28147_89_CryptoPro_KeyMeshing \ "id-Gost28147-89-CryptoPro-KeyMeshing" #define NID_id_Gost28147_89_CryptoPro_KeyMeshing 819 #define OBJ_id_Gost28147_89_CryptoPro_KeyMeshing 1L, 2L, 643L, 2L, 2L, 14L, 1L +#define OBJ_ENC_id_Gost28147_89_CryptoPro_KeyMeshing \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x0e, 0x01 #define SN_id_Gost28147_89_None_KeyMeshing "id-Gost28147-89-None-KeyMeshing" #define NID_id_Gost28147_89_None_KeyMeshing 820 #define OBJ_id_Gost28147_89_None_KeyMeshing 1L, 2L, 643L, 2L, 2L, 14L, 0L +#define OBJ_ENC_id_Gost28147_89_None_KeyMeshing \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x0e, 0x00 #define SN_id_GostR3411_94_TestParamSet "id-GostR3411-94-TestParamSet" #define NID_id_GostR3411_94_TestParamSet 821 #define OBJ_id_GostR3411_94_TestParamSet 1L, 2L, 643L, 2L, 2L, 30L, 0L +#define OBJ_ENC_id_GostR3411_94_TestParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1e, 0x00 #define SN_id_GostR3411_94_CryptoProParamSet "id-GostR3411-94-CryptoProParamSet" #define NID_id_GostR3411_94_CryptoProParamSet 822 #define OBJ_id_GostR3411_94_CryptoProParamSet 1L, 2L, 643L, 2L, 2L, 30L, 1L +#define OBJ_ENC_id_GostR3411_94_CryptoProParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1e, 0x01 #define SN_id_Gost28147_89_TestParamSet "id-Gost28147-89-TestParamSet" #define NID_id_Gost28147_89_TestParamSet 823 #define OBJ_id_Gost28147_89_TestParamSet 1L, 2L, 643L, 2L, 2L, 31L, 0L +#define OBJ_ENC_id_Gost28147_89_TestParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x00 #define SN_id_Gost28147_89_CryptoPro_A_ParamSet \ "id-Gost28147-89-CryptoPro-A-ParamSet" #define NID_id_Gost28147_89_CryptoPro_A_ParamSet 824 #define OBJ_id_Gost28147_89_CryptoPro_A_ParamSet 1L, 2L, 643L, 2L, 2L, 31L, 1L +#define OBJ_ENC_id_Gost28147_89_CryptoPro_A_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x01 #define SN_id_Gost28147_89_CryptoPro_B_ParamSet \ "id-Gost28147-89-CryptoPro-B-ParamSet" #define NID_id_Gost28147_89_CryptoPro_B_ParamSet 825 #define OBJ_id_Gost28147_89_CryptoPro_B_ParamSet 1L, 2L, 643L, 2L, 2L, 31L, 2L +#define OBJ_ENC_id_Gost28147_89_CryptoPro_B_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x02 #define SN_id_Gost28147_89_CryptoPro_C_ParamSet \ "id-Gost28147-89-CryptoPro-C-ParamSet" #define NID_id_Gost28147_89_CryptoPro_C_ParamSet 826 #define OBJ_id_Gost28147_89_CryptoPro_C_ParamSet 1L, 2L, 643L, 2L, 2L, 31L, 3L +#define OBJ_ENC_id_Gost28147_89_CryptoPro_C_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x03 #define SN_id_Gost28147_89_CryptoPro_D_ParamSet \ "id-Gost28147-89-CryptoPro-D-ParamSet" #define NID_id_Gost28147_89_CryptoPro_D_ParamSet 827 #define OBJ_id_Gost28147_89_CryptoPro_D_ParamSet 1L, 2L, 643L, 2L, 2L, 31L, 4L +#define OBJ_ENC_id_Gost28147_89_CryptoPro_D_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x04 #define SN_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet \ "id-Gost28147-89-CryptoPro-Oscar-1-1-ParamSet" #define NID_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet 828 #define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet \ 1L, 2L, 643L, 2L, 2L, 31L, 5L +#define OBJ_ENC_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x05 #define SN_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet \ "id-Gost28147-89-CryptoPro-Oscar-1-0-ParamSet" #define NID_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet 829 #define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet \ 1L, 2L, 643L, 2L, 2L, 31L, 6L +#define OBJ_ENC_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x06 #define SN_id_Gost28147_89_CryptoPro_RIC_1_ParamSet \ "id-Gost28147-89-CryptoPro-RIC-1-ParamSet" #define NID_id_Gost28147_89_CryptoPro_RIC_1_ParamSet 830 #define OBJ_id_Gost28147_89_CryptoPro_RIC_1_ParamSet \ 1L, 2L, 643L, 2L, 2L, 31L, 7L +#define OBJ_ENC_id_Gost28147_89_CryptoPro_RIC_1_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x07 #define SN_id_GostR3410_94_TestParamSet "id-GostR3410-94-TestParamSet" #define NID_id_GostR3410_94_TestParamSet 831 #define OBJ_id_GostR3410_94_TestParamSet 1L, 2L, 643L, 2L, 2L, 32L, 0L +#define OBJ_ENC_id_GostR3410_94_TestParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x20, 0x00 #define SN_id_GostR3410_94_CryptoPro_A_ParamSet \ "id-GostR3410-94-CryptoPro-A-ParamSet" #define NID_id_GostR3410_94_CryptoPro_A_ParamSet 832 #define OBJ_id_GostR3410_94_CryptoPro_A_ParamSet 1L, 2L, 643L, 2L, 2L, 32L, 2L +#define OBJ_ENC_id_GostR3410_94_CryptoPro_A_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x20, 0x02 #define SN_id_GostR3410_94_CryptoPro_B_ParamSet \ "id-GostR3410-94-CryptoPro-B-ParamSet" #define NID_id_GostR3410_94_CryptoPro_B_ParamSet 833 #define OBJ_id_GostR3410_94_CryptoPro_B_ParamSet 1L, 2L, 643L, 2L, 2L, 32L, 3L +#define OBJ_ENC_id_GostR3410_94_CryptoPro_B_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x20, 0x03 #define SN_id_GostR3410_94_CryptoPro_C_ParamSet \ "id-GostR3410-94-CryptoPro-C-ParamSet" #define NID_id_GostR3410_94_CryptoPro_C_ParamSet 834 #define OBJ_id_GostR3410_94_CryptoPro_C_ParamSet 1L, 2L, 643L, 2L, 2L, 32L, 4L +#define OBJ_ENC_id_GostR3410_94_CryptoPro_C_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x20, 0x04 #define SN_id_GostR3410_94_CryptoPro_D_ParamSet \ "id-GostR3410-94-CryptoPro-D-ParamSet" #define NID_id_GostR3410_94_CryptoPro_D_ParamSet 835 #define OBJ_id_GostR3410_94_CryptoPro_D_ParamSet 1L, 2L, 643L, 2L, 2L, 32L, 5L +#define OBJ_ENC_id_GostR3410_94_CryptoPro_D_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x20, 0x05 #define SN_id_GostR3410_94_CryptoPro_XchA_ParamSet \ "id-GostR3410-94-CryptoPro-XchA-ParamSet" #define NID_id_GostR3410_94_CryptoPro_XchA_ParamSet 836 #define OBJ_id_GostR3410_94_CryptoPro_XchA_ParamSet \ 1L, 2L, 643L, 2L, 2L, 33L, 1L +#define OBJ_ENC_id_GostR3410_94_CryptoPro_XchA_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x21, 0x01 #define SN_id_GostR3410_94_CryptoPro_XchB_ParamSet \ "id-GostR3410-94-CryptoPro-XchB-ParamSet" #define NID_id_GostR3410_94_CryptoPro_XchB_ParamSet 837 #define OBJ_id_GostR3410_94_CryptoPro_XchB_ParamSet \ 1L, 2L, 643L, 2L, 2L, 33L, 2L +#define OBJ_ENC_id_GostR3410_94_CryptoPro_XchB_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x21, 0x02 #define SN_id_GostR3410_94_CryptoPro_XchC_ParamSet \ "id-GostR3410-94-CryptoPro-XchC-ParamSet" #define NID_id_GostR3410_94_CryptoPro_XchC_ParamSet 838 #define OBJ_id_GostR3410_94_CryptoPro_XchC_ParamSet \ 1L, 2L, 643L, 2L, 2L, 33L, 3L +#define OBJ_ENC_id_GostR3410_94_CryptoPro_XchC_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x21, 0x03 #define SN_id_GostR3410_2001_TestParamSet "id-GostR3410-2001-TestParamSet" #define NID_id_GostR3410_2001_TestParamSet 839 #define OBJ_id_GostR3410_2001_TestParamSet 1L, 2L, 643L, 2L, 2L, 35L, 0L +#define OBJ_ENC_id_GostR3410_2001_TestParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x00 #define SN_id_GostR3410_2001_CryptoPro_A_ParamSet \ "id-GostR3410-2001-CryptoPro-A-ParamSet" #define NID_id_GostR3410_2001_CryptoPro_A_ParamSet 840 #define OBJ_id_GostR3410_2001_CryptoPro_A_ParamSet 1L, 2L, 643L, 2L, 2L, 35L, 1L +#define OBJ_ENC_id_GostR3410_2001_CryptoPro_A_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 #define SN_id_GostR3410_2001_CryptoPro_B_ParamSet \ "id-GostR3410-2001-CryptoPro-B-ParamSet" #define NID_id_GostR3410_2001_CryptoPro_B_ParamSet 841 #define OBJ_id_GostR3410_2001_CryptoPro_B_ParamSet 1L, 2L, 643L, 2L, 2L, 35L, 2L +#define OBJ_ENC_id_GostR3410_2001_CryptoPro_B_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x02 #define SN_id_GostR3410_2001_CryptoPro_C_ParamSet \ "id-GostR3410-2001-CryptoPro-C-ParamSet" #define NID_id_GostR3410_2001_CryptoPro_C_ParamSet 842 #define OBJ_id_GostR3410_2001_CryptoPro_C_ParamSet 1L, 2L, 643L, 2L, 2L, 35L, 3L +#define OBJ_ENC_id_GostR3410_2001_CryptoPro_C_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x03 #define SN_id_GostR3410_2001_CryptoPro_XchA_ParamSet \ "id-GostR3410-2001-CryptoPro-XchA-ParamSet" #define NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet 843 #define OBJ_id_GostR3410_2001_CryptoPro_XchA_ParamSet \ 1L, 2L, 643L, 2L, 2L, 36L, 0L +#define OBJ_ENC_id_GostR3410_2001_CryptoPro_XchA_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x24, 0x00 #define SN_id_GostR3410_2001_CryptoPro_XchB_ParamSet \ "id-GostR3410-2001-CryptoPro-XchB-ParamSet" #define NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet 844 #define OBJ_id_GostR3410_2001_CryptoPro_XchB_ParamSet \ 1L, 2L, 643L, 2L, 2L, 36L, 1L +#define OBJ_ENC_id_GostR3410_2001_CryptoPro_XchB_ParamSet \ + 0x2a, 0x85, 0x03, 0x02, 0x02, 0x24, 0x01 #define SN_id_GostR3410_94_a "id-GostR3410-94-a" #define NID_id_GostR3410_94_a 845 #define OBJ_id_GostR3410_94_a 1L, 2L, 643L, 2L, 2L, 20L, 1L +#define OBJ_ENC_id_GostR3410_94_a 0x2a, 0x85, 0x03, 0x02, 0x02, 0x14, 0x01 #define SN_id_GostR3410_94_aBis "id-GostR3410-94-aBis" #define NID_id_GostR3410_94_aBis 846 #define OBJ_id_GostR3410_94_aBis 1L, 2L, 643L, 2L, 2L, 20L, 2L +#define OBJ_ENC_id_GostR3410_94_aBis 0x2a, 0x85, 0x03, 0x02, 0x02, 0x14, 0x02 #define SN_id_GostR3410_94_b "id-GostR3410-94-b" #define NID_id_GostR3410_94_b 847 #define OBJ_id_GostR3410_94_b 1L, 2L, 643L, 2L, 2L, 20L, 3L +#define OBJ_ENC_id_GostR3410_94_b 0x2a, 0x85, 0x03, 0x02, 0x02, 0x14, 0x03 #define SN_id_GostR3410_94_bBis "id-GostR3410-94-bBis" #define NID_id_GostR3410_94_bBis 848 #define OBJ_id_GostR3410_94_bBis 1L, 2L, 643L, 2L, 2L, 20L, 4L +#define OBJ_ENC_id_GostR3410_94_bBis 0x2a, 0x85, 0x03, 0x02, 0x02, 0x14, 0x04 #define SN_id_Gost28147_89_cc "id-Gost28147-89-cc" #define LN_id_Gost28147_89_cc "GOST 28147-89 Cryptocom ParamSet" #define NID_id_Gost28147_89_cc 849 #define OBJ_id_Gost28147_89_cc 1L, 2L, 643L, 2L, 9L, 1L, 6L, 1L +#define OBJ_ENC_id_Gost28147_89_cc \ + 0x2a, 0x85, 0x03, 0x02, 0x09, 0x01, 0x06, 0x01 #define SN_id_GostR3410_94_cc "gost94cc" #define LN_id_GostR3410_94_cc "GOST 34.10-94 Cryptocom" #define NID_id_GostR3410_94_cc 850 #define OBJ_id_GostR3410_94_cc 1L, 2L, 643L, 2L, 9L, 1L, 5L, 3L +#define OBJ_ENC_id_GostR3410_94_cc \ + 0x2a, 0x85, 0x03, 0x02, 0x09, 0x01, 0x05, 0x03 #define SN_id_GostR3410_2001_cc "gost2001cc" #define LN_id_GostR3410_2001_cc "GOST 34.10-2001 Cryptocom" #define NID_id_GostR3410_2001_cc 851 #define OBJ_id_GostR3410_2001_cc 1L, 2L, 643L, 2L, 9L, 1L, 5L, 4L +#define OBJ_ENC_id_GostR3410_2001_cc \ + 0x2a, 0x85, 0x03, 0x02, 0x09, 0x01, 0x05, 0x04 #define SN_id_GostR3411_94_with_GostR3410_94_cc \ "id-GostR3411-94-with-GostR3410-94-cc" @@ -3738,6 +4877,8 @@ extern "C" { #define NID_id_GostR3411_94_with_GostR3410_94_cc 852 #define OBJ_id_GostR3411_94_with_GostR3410_94_cc \ 1L, 2L, 643L, 2L, 9L, 1L, 3L, 3L +#define OBJ_ENC_id_GostR3411_94_with_GostR3410_94_cc \ + 0x2a, 0x85, 0x03, 0x02, 0x09, 0x01, 0x03, 0x03 #define SN_id_GostR3411_94_with_GostR3410_2001_cc \ "id-GostR3411-94-with-GostR3410-2001-cc" @@ -3746,12 +4887,16 @@ extern "C" { #define NID_id_GostR3411_94_with_GostR3410_2001_cc 853 #define OBJ_id_GostR3411_94_with_GostR3410_2001_cc \ 1L, 2L, 643L, 2L, 9L, 1L, 3L, 4L +#define OBJ_ENC_id_GostR3411_94_with_GostR3410_2001_cc \ + 0x2a, 0x85, 0x03, 0x02, 0x09, 0x01, 0x03, 0x04 #define SN_id_GostR3410_2001_ParamSet_cc "id-GostR3410-2001-ParamSet-cc" #define LN_id_GostR3410_2001_ParamSet_cc \ "GOST R 3410-2001 Parameter Set Cryptocom" #define NID_id_GostR3410_2001_ParamSet_cc 854 #define OBJ_id_GostR3410_2001_ParamSet_cc 1L, 2L, 643L, 2L, 9L, 1L, 8L, 1L +#define OBJ_ENC_id_GostR3410_2001_ParamSet_cc \ + 0x2a, 0x85, 0x03, 0x02, 0x09, 0x01, 0x08, 0x01 #define SN_hmac "HMAC" #define LN_hmac "hmac" @@ -3761,156 +4906,196 @@ extern "C" { #define LN_LocalKeySet "Microsoft Local Key set" #define NID_LocalKeySet 856 #define OBJ_LocalKeySet 1L, 3L, 6L, 1L, 4L, 1L, 311L, 17L, 2L +#define OBJ_ENC_LocalKeySet 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x11, 0x02 #define SN_freshest_crl "freshestCRL" #define LN_freshest_crl "X509v3 Freshest CRL" #define NID_freshest_crl 857 #define OBJ_freshest_crl 2L, 5L, 29L, 46L +#define OBJ_ENC_freshest_crl 0x55, 0x1d, 0x2e #define SN_id_on_permanentIdentifier "id-on-permanentIdentifier" #define LN_id_on_permanentIdentifier "Permanent Identifier" #define NID_id_on_permanentIdentifier 858 #define OBJ_id_on_permanentIdentifier 1L, 3L, 6L, 1L, 5L, 5L, 7L, 8L, 3L +#define OBJ_ENC_id_on_permanentIdentifier \ + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x08, 0x03 #define LN_searchGuide "searchGuide" #define NID_searchGuide 859 #define OBJ_searchGuide 2L, 5L, 4L, 14L +#define OBJ_ENC_searchGuide 0x55, 0x04, 0x0e #define LN_businessCategory "businessCategory" #define NID_businessCategory 860 #define OBJ_businessCategory 2L, 5L, 4L, 15L +#define OBJ_ENC_businessCategory 0x55, 0x04, 0x0f #define LN_postalAddress "postalAddress" #define NID_postalAddress 861 #define OBJ_postalAddress 2L, 5L, 4L, 16L +#define OBJ_ENC_postalAddress 0x55, 0x04, 0x10 #define LN_postOfficeBox "postOfficeBox" #define NID_postOfficeBox 862 #define OBJ_postOfficeBox 2L, 5L, 4L, 18L +#define OBJ_ENC_postOfficeBox 0x55, 0x04, 0x12 #define LN_physicalDeliveryOfficeName "physicalDeliveryOfficeName" #define NID_physicalDeliveryOfficeName 863 #define OBJ_physicalDeliveryOfficeName 2L, 5L, 4L, 19L +#define OBJ_ENC_physicalDeliveryOfficeName 0x55, 0x04, 0x13 #define LN_telephoneNumber "telephoneNumber" #define NID_telephoneNumber 864 #define OBJ_telephoneNumber 2L, 5L, 4L, 20L +#define OBJ_ENC_telephoneNumber 0x55, 0x04, 0x14 #define LN_telexNumber "telexNumber" #define NID_telexNumber 865 #define OBJ_telexNumber 2L, 5L, 4L, 21L +#define OBJ_ENC_telexNumber 0x55, 0x04, 0x15 #define LN_teletexTerminalIdentifier "teletexTerminalIdentifier" #define NID_teletexTerminalIdentifier 866 #define OBJ_teletexTerminalIdentifier 2L, 5L, 4L, 22L +#define OBJ_ENC_teletexTerminalIdentifier 0x55, 0x04, 0x16 #define LN_facsimileTelephoneNumber "facsimileTelephoneNumber" #define NID_facsimileTelephoneNumber 867 #define OBJ_facsimileTelephoneNumber 2L, 5L, 4L, 23L +#define OBJ_ENC_facsimileTelephoneNumber 0x55, 0x04, 0x17 #define LN_x121Address "x121Address" #define NID_x121Address 868 #define OBJ_x121Address 2L, 5L, 4L, 24L +#define OBJ_ENC_x121Address 0x55, 0x04, 0x18 #define LN_internationaliSDNNumber "internationaliSDNNumber" #define NID_internationaliSDNNumber 869 #define OBJ_internationaliSDNNumber 2L, 5L, 4L, 25L +#define OBJ_ENC_internationaliSDNNumber 0x55, 0x04, 0x19 #define LN_registeredAddress "registeredAddress" #define NID_registeredAddress 870 #define OBJ_registeredAddress 2L, 5L, 4L, 26L +#define OBJ_ENC_registeredAddress 0x55, 0x04, 0x1a #define LN_destinationIndicator "destinationIndicator" #define NID_destinationIndicator 871 #define OBJ_destinationIndicator 2L, 5L, 4L, 27L +#define OBJ_ENC_destinationIndicator 0x55, 0x04, 0x1b #define LN_preferredDeliveryMethod "preferredDeliveryMethod" #define NID_preferredDeliveryMethod 872 #define OBJ_preferredDeliveryMethod 2L, 5L, 4L, 28L +#define OBJ_ENC_preferredDeliveryMethod 0x55, 0x04, 0x1c #define LN_presentationAddress "presentationAddress" #define NID_presentationAddress 873 #define OBJ_presentationAddress 2L, 5L, 4L, 29L +#define OBJ_ENC_presentationAddress 0x55, 0x04, 0x1d #define LN_supportedApplicationContext "supportedApplicationContext" #define NID_supportedApplicationContext 874 #define OBJ_supportedApplicationContext 2L, 5L, 4L, 30L +#define OBJ_ENC_supportedApplicationContext 0x55, 0x04, 0x1e #define SN_member "member" #define NID_member 875 #define OBJ_member 2L, 5L, 4L, 31L +#define OBJ_ENC_member 0x55, 0x04, 0x1f #define SN_owner "owner" #define NID_owner 876 #define OBJ_owner 2L, 5L, 4L, 32L +#define OBJ_ENC_owner 0x55, 0x04, 0x20 #define LN_roleOccupant "roleOccupant" #define NID_roleOccupant 877 #define OBJ_roleOccupant 2L, 5L, 4L, 33L +#define OBJ_ENC_roleOccupant 0x55, 0x04, 0x21 #define SN_seeAlso "seeAlso" #define NID_seeAlso 878 #define OBJ_seeAlso 2L, 5L, 4L, 34L +#define OBJ_ENC_seeAlso 0x55, 0x04, 0x22 #define LN_userPassword "userPassword" #define NID_userPassword 879 #define OBJ_userPassword 2L, 5L, 4L, 35L +#define OBJ_ENC_userPassword 0x55, 0x04, 0x23 #define LN_userCertificate "userCertificate" #define NID_userCertificate 880 #define OBJ_userCertificate 2L, 5L, 4L, 36L +#define OBJ_ENC_userCertificate 0x55, 0x04, 0x24 #define LN_cACertificate "cACertificate" #define NID_cACertificate 881 #define OBJ_cACertificate 2L, 5L, 4L, 37L +#define OBJ_ENC_cACertificate 0x55, 0x04, 0x25 #define LN_authorityRevocationList "authorityRevocationList" #define NID_authorityRevocationList 882 #define OBJ_authorityRevocationList 2L, 5L, 4L, 38L +#define OBJ_ENC_authorityRevocationList 0x55, 0x04, 0x26 #define LN_certificateRevocationList "certificateRevocationList" #define NID_certificateRevocationList 883 #define OBJ_certificateRevocationList 2L, 5L, 4L, 39L +#define OBJ_ENC_certificateRevocationList 0x55, 0x04, 0x27 #define LN_crossCertificatePair "crossCertificatePair" #define NID_crossCertificatePair 884 #define OBJ_crossCertificatePair 2L, 5L, 4L, 40L +#define OBJ_ENC_crossCertificatePair 0x55, 0x04, 0x28 #define LN_enhancedSearchGuide "enhancedSearchGuide" #define NID_enhancedSearchGuide 885 #define OBJ_enhancedSearchGuide 2L, 5L, 4L, 47L +#define OBJ_ENC_enhancedSearchGuide 0x55, 0x04, 0x2f #define LN_protocolInformation "protocolInformation" #define NID_protocolInformation 886 #define OBJ_protocolInformation 2L, 5L, 4L, 48L +#define OBJ_ENC_protocolInformation 0x55, 0x04, 0x30 #define LN_distinguishedName "distinguishedName" #define NID_distinguishedName 887 #define OBJ_distinguishedName 2L, 5L, 4L, 49L +#define OBJ_ENC_distinguishedName 0x55, 0x04, 0x31 #define LN_uniqueMember "uniqueMember" #define NID_uniqueMember 888 #define OBJ_uniqueMember 2L, 5L, 4L, 50L +#define OBJ_ENC_uniqueMember 0x55, 0x04, 0x32 #define LN_houseIdentifier "houseIdentifier" #define NID_houseIdentifier 889 #define OBJ_houseIdentifier 2L, 5L, 4L, 51L +#define OBJ_ENC_houseIdentifier 0x55, 0x04, 0x33 #define LN_supportedAlgorithms "supportedAlgorithms" #define NID_supportedAlgorithms 890 #define OBJ_supportedAlgorithms 2L, 5L, 4L, 52L +#define OBJ_ENC_supportedAlgorithms 0x55, 0x04, 0x34 #define LN_deltaRevocationList "deltaRevocationList" #define NID_deltaRevocationList 891 #define OBJ_deltaRevocationList 2L, 5L, 4L, 53L +#define OBJ_ENC_deltaRevocationList 0x55, 0x04, 0x35 #define SN_dmdName "dmdName" #define NID_dmdName 892 #define OBJ_dmdName 2L, 5L, 4L, 54L +#define OBJ_ENC_dmdName 0x55, 0x04, 0x36 #define SN_id_alg_PWRI_KEK "id-alg-PWRI-KEK" #define NID_id_alg_PWRI_KEK 893 #define OBJ_id_alg_PWRI_KEK 1L, 2L, 840L, 113549L, 1L, 9L, 16L, 3L, 9L +#define OBJ_ENC_id_alg_PWRI_KEK \ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x03, 0x09 #define SN_cmac "CMAC" #define LN_cmac "cmac" @@ -3920,43 +5105,55 @@ extern "C" { #define LN_aes_128_gcm "aes-128-gcm" #define NID_aes_128_gcm 895 #define OBJ_aes_128_gcm 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 6L +#define OBJ_ENC_aes_128_gcm 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x06 #define SN_aes_128_ccm "id-aes128-CCM" #define LN_aes_128_ccm "aes-128-ccm" #define NID_aes_128_ccm 896 #define OBJ_aes_128_ccm 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 7L +#define OBJ_ENC_aes_128_ccm 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x07 #define SN_id_aes128_wrap_pad "id-aes128-wrap-pad" #define NID_id_aes128_wrap_pad 897 #define OBJ_id_aes128_wrap_pad 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 8L +#define OBJ_ENC_id_aes128_wrap_pad \ + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x08 #define SN_aes_192_gcm "id-aes192-GCM" #define LN_aes_192_gcm "aes-192-gcm" #define NID_aes_192_gcm 898 #define OBJ_aes_192_gcm 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 26L +#define OBJ_ENC_aes_192_gcm 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x1a #define SN_aes_192_ccm "id-aes192-CCM" #define LN_aes_192_ccm "aes-192-ccm" #define NID_aes_192_ccm 899 #define OBJ_aes_192_ccm 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 27L +#define OBJ_ENC_aes_192_ccm 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x1b #define SN_id_aes192_wrap_pad "id-aes192-wrap-pad" #define NID_id_aes192_wrap_pad 900 #define OBJ_id_aes192_wrap_pad 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 28L +#define OBJ_ENC_id_aes192_wrap_pad \ + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x1c #define SN_aes_256_gcm "id-aes256-GCM" #define LN_aes_256_gcm "aes-256-gcm" #define NID_aes_256_gcm 901 #define OBJ_aes_256_gcm 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 46L +#define OBJ_ENC_aes_256_gcm 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2e #define SN_aes_256_ccm "id-aes256-CCM" #define LN_aes_256_ccm "aes-256-ccm" #define NID_aes_256_ccm 902 #define OBJ_aes_256_ccm 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 47L +#define OBJ_ENC_aes_256_ccm 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2f #define SN_id_aes256_wrap_pad "id-aes256-wrap-pad" #define NID_id_aes256_wrap_pad 903 #define OBJ_id_aes256_wrap_pad 2L, 16L, 840L, 1L, 101L, 3L, 4L, 1L, 48L +#define OBJ_ENC_id_aes256_wrap_pad \ + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x30 #define SN_aes_128_ctr "AES-128-CTR" #define LN_aes_128_ctr "aes-128-ctr" @@ -3973,29 +5170,38 @@ extern "C" { #define SN_id_camellia128_wrap "id-camellia128-wrap" #define NID_id_camellia128_wrap 907 #define OBJ_id_camellia128_wrap 1L, 2L, 392L, 200011L, 61L, 1L, 1L, 3L, 2L +#define OBJ_ENC_id_camellia128_wrap \ + 0x2a, 0x83, 0x08, 0x8c, 0x9a, 0x4b, 0x3d, 0x01, 0x01, 0x03, 0x02 #define SN_id_camellia192_wrap "id-camellia192-wrap" #define NID_id_camellia192_wrap 908 #define OBJ_id_camellia192_wrap 1L, 2L, 392L, 200011L, 61L, 1L, 1L, 3L, 3L +#define OBJ_ENC_id_camellia192_wrap \ + 0x2a, 0x83, 0x08, 0x8c, 0x9a, 0x4b, 0x3d, 0x01, 0x01, 0x03, 0x03 #define SN_id_camellia256_wrap "id-camellia256-wrap" #define NID_id_camellia256_wrap 909 #define OBJ_id_camellia256_wrap 1L, 2L, 392L, 200011L, 61L, 1L, 1L, 3L, 4L +#define OBJ_ENC_id_camellia256_wrap \ + 0x2a, 0x83, 0x08, 0x8c, 0x9a, 0x4b, 0x3d, 0x01, 0x01, 0x03, 0x04 #define SN_anyExtendedKeyUsage "anyExtendedKeyUsage" #define LN_anyExtendedKeyUsage "Any Extended Key Usage" #define NID_anyExtendedKeyUsage 910 #define OBJ_anyExtendedKeyUsage 2L, 5L, 29L, 37L, 0L +#define OBJ_ENC_anyExtendedKeyUsage 0x55, 0x1d, 0x25, 0x00 #define SN_mgf1 "MGF1" #define LN_mgf1 "mgf1" #define NID_mgf1 911 #define OBJ_mgf1 1L, 2L, 840L, 113549L, 1L, 1L, 8L +#define OBJ_ENC_mgf1 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x08 #define SN_rsassaPss "RSASSA-PSS" #define LN_rsassaPss "rsassaPss" #define NID_rsassaPss 912 #define OBJ_rsassaPss 1L, 2L, 840L, 113549L, 1L, 1L, 10L +#define OBJ_ENC_rsassaPss 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0a #define SN_aes_128_xts "AES-128-XTS" #define LN_aes_128_xts "aes-128-xts" @@ -4025,123 +5231,174 @@ extern "C" { #define LN_rsaesOaep "rsaesOaep" #define NID_rsaesOaep 919 #define OBJ_rsaesOaep 1L, 2L, 840L, 113549L, 1L, 1L, 7L +#define OBJ_ENC_rsaesOaep 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x07 #define SN_dhpublicnumber "dhpublicnumber" #define LN_dhpublicnumber "X9.42 DH" #define NID_dhpublicnumber 920 #define OBJ_dhpublicnumber 1L, 2L, 840L, 10046L, 2L, 1L +#define OBJ_ENC_dhpublicnumber 0x2a, 0x86, 0x48, 0xce, 0x3e, 0x02, 0x01 #define SN_brainpoolP160r1 "brainpoolP160r1" #define NID_brainpoolP160r1 921 #define OBJ_brainpoolP160r1 1L, 3L, 36L, 3L, 3L, 2L, 8L, 1L, 1L, 1L +#define OBJ_ENC_brainpoolP160r1 \ + 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x01 #define SN_brainpoolP160t1 "brainpoolP160t1" #define NID_brainpoolP160t1 922 #define OBJ_brainpoolP160t1 1L, 3L, 36L, 3L, 3L, 2L, 8L, 1L, 1L, 2L +#define OBJ_ENC_brainpoolP160t1 \ + 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x02 #define SN_brainpoolP192r1 "brainpoolP192r1" #define NID_brainpoolP192r1 923 #define OBJ_brainpoolP192r1 1L, 3L, 36L, 3L, 3L, 2L, 8L, 1L, 1L, 3L +#define OBJ_ENC_brainpoolP192r1 \ + 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x03 #define SN_brainpoolP192t1 "brainpoolP192t1" #define NID_brainpoolP192t1 924 #define OBJ_brainpoolP192t1 1L, 3L, 36L, 3L, 3L, 2L, 8L, 1L, 1L, 4L +#define OBJ_ENC_brainpoolP192t1 \ + 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x04 #define SN_brainpoolP224r1 "brainpoolP224r1" #define NID_brainpoolP224r1 925 #define OBJ_brainpoolP224r1 1L, 3L, 36L, 3L, 3L, 2L, 8L, 1L, 1L, 5L +#define OBJ_ENC_brainpoolP224r1 \ + 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x05 #define SN_brainpoolP224t1 "brainpoolP224t1" #define NID_brainpoolP224t1 926 #define OBJ_brainpoolP224t1 1L, 3L, 36L, 3L, 3L, 2L, 8L, 1L, 1L, 6L +#define OBJ_ENC_brainpoolP224t1 \ + 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x06 #define SN_brainpoolP256r1 "brainpoolP256r1" #define NID_brainpoolP256r1 927 #define OBJ_brainpoolP256r1 1L, 3L, 36L, 3L, 3L, 2L, 8L, 1L, 1L, 7L +#define OBJ_ENC_brainpoolP256r1 \ + 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x07 #define SN_brainpoolP256t1 "brainpoolP256t1" #define NID_brainpoolP256t1 928 #define OBJ_brainpoolP256t1 1L, 3L, 36L, 3L, 3L, 2L, 8L, 1L, 1L, 8L +#define OBJ_ENC_brainpoolP256t1 \ + 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x08 #define SN_brainpoolP320r1 "brainpoolP320r1" #define NID_brainpoolP320r1 929 #define OBJ_brainpoolP320r1 1L, 3L, 36L, 3L, 3L, 2L, 8L, 1L, 1L, 9L +#define OBJ_ENC_brainpoolP320r1 \ + 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x09 #define SN_brainpoolP320t1 "brainpoolP320t1" #define NID_brainpoolP320t1 930 #define OBJ_brainpoolP320t1 1L, 3L, 36L, 3L, 3L, 2L, 8L, 1L, 1L, 10L +#define OBJ_ENC_brainpoolP320t1 \ + 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0a #define SN_brainpoolP384r1 "brainpoolP384r1" #define NID_brainpoolP384r1 931 #define OBJ_brainpoolP384r1 1L, 3L, 36L, 3L, 3L, 2L, 8L, 1L, 1L, 11L +#define OBJ_ENC_brainpoolP384r1 \ + 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0b #define SN_brainpoolP384t1 "brainpoolP384t1" #define NID_brainpoolP384t1 932 #define OBJ_brainpoolP384t1 1L, 3L, 36L, 3L, 3L, 2L, 8L, 1L, 1L, 12L +#define OBJ_ENC_brainpoolP384t1 \ + 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0c #define SN_brainpoolP512r1 "brainpoolP512r1" #define NID_brainpoolP512r1 933 #define OBJ_brainpoolP512r1 1L, 3L, 36L, 3L, 3L, 2L, 8L, 1L, 1L, 13L +#define OBJ_ENC_brainpoolP512r1 \ + 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0d #define SN_brainpoolP512t1 "brainpoolP512t1" #define NID_brainpoolP512t1 934 #define OBJ_brainpoolP512t1 1L, 3L, 36L, 3L, 3L, 2L, 8L, 1L, 1L, 14L +#define OBJ_ENC_brainpoolP512t1 \ + 0x2b, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0e #define SN_pSpecified "PSPECIFIED" #define LN_pSpecified "pSpecified" #define NID_pSpecified 935 #define OBJ_pSpecified 1L, 2L, 840L, 113549L, 1L, 1L, 9L +#define OBJ_ENC_pSpecified 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x09 #define SN_dhSinglePass_stdDH_sha1kdf_scheme "dhSinglePass-stdDH-sha1kdf-scheme" #define NID_dhSinglePass_stdDH_sha1kdf_scheme 936 #define OBJ_dhSinglePass_stdDH_sha1kdf_scheme \ 1L, 3L, 133L, 16L, 840L, 63L, 0L, 2L +#define OBJ_ENC_dhSinglePass_stdDH_sha1kdf_scheme \ + 0x2b, 0x81, 0x05, 0x10, 0x86, 0x48, 0x3f, 0x00, 0x02 #define SN_dhSinglePass_stdDH_sha224kdf_scheme \ "dhSinglePass-stdDH-sha224kdf-scheme" #define NID_dhSinglePass_stdDH_sha224kdf_scheme 937 #define OBJ_dhSinglePass_stdDH_sha224kdf_scheme 1L, 3L, 132L, 1L, 11L, 0L +#define OBJ_ENC_dhSinglePass_stdDH_sha224kdf_scheme \ + 0x2b, 0x81, 0x04, 0x01, 0x0b, 0x00 #define SN_dhSinglePass_stdDH_sha256kdf_scheme \ "dhSinglePass-stdDH-sha256kdf-scheme" #define NID_dhSinglePass_stdDH_sha256kdf_scheme 938 #define OBJ_dhSinglePass_stdDH_sha256kdf_scheme 1L, 3L, 132L, 1L, 11L, 1L +#define OBJ_ENC_dhSinglePass_stdDH_sha256kdf_scheme \ + 0x2b, 0x81, 0x04, 0x01, 0x0b, 0x01 #define SN_dhSinglePass_stdDH_sha384kdf_scheme \ "dhSinglePass-stdDH-sha384kdf-scheme" #define NID_dhSinglePass_stdDH_sha384kdf_scheme 939 #define OBJ_dhSinglePass_stdDH_sha384kdf_scheme 1L, 3L, 132L, 1L, 11L, 2L +#define OBJ_ENC_dhSinglePass_stdDH_sha384kdf_scheme \ + 0x2b, 0x81, 0x04, 0x01, 0x0b, 0x02 #define SN_dhSinglePass_stdDH_sha512kdf_scheme \ "dhSinglePass-stdDH-sha512kdf-scheme" #define NID_dhSinglePass_stdDH_sha512kdf_scheme 940 #define OBJ_dhSinglePass_stdDH_sha512kdf_scheme 1L, 3L, 132L, 1L, 11L, 3L +#define OBJ_ENC_dhSinglePass_stdDH_sha512kdf_scheme \ + 0x2b, 0x81, 0x04, 0x01, 0x0b, 0x03 #define SN_dhSinglePass_cofactorDH_sha1kdf_scheme \ "dhSinglePass-cofactorDH-sha1kdf-scheme" #define NID_dhSinglePass_cofactorDH_sha1kdf_scheme 941 #define OBJ_dhSinglePass_cofactorDH_sha1kdf_scheme \ 1L, 3L, 133L, 16L, 840L, 63L, 0L, 3L +#define OBJ_ENC_dhSinglePass_cofactorDH_sha1kdf_scheme \ + 0x2b, 0x81, 0x05, 0x10, 0x86, 0x48, 0x3f, 0x00, 0x03 #define SN_dhSinglePass_cofactorDH_sha224kdf_scheme \ "dhSinglePass-cofactorDH-sha224kdf-scheme" #define NID_dhSinglePass_cofactorDH_sha224kdf_scheme 942 #define OBJ_dhSinglePass_cofactorDH_sha224kdf_scheme 1L, 3L, 132L, 1L, 14L, 0L +#define OBJ_ENC_dhSinglePass_cofactorDH_sha224kdf_scheme \ + 0x2b, 0x81, 0x04, 0x01, 0x0e, 0x00 #define SN_dhSinglePass_cofactorDH_sha256kdf_scheme \ "dhSinglePass-cofactorDH-sha256kdf-scheme" #define NID_dhSinglePass_cofactorDH_sha256kdf_scheme 943 #define OBJ_dhSinglePass_cofactorDH_sha256kdf_scheme 1L, 3L, 132L, 1L, 14L, 1L +#define OBJ_ENC_dhSinglePass_cofactorDH_sha256kdf_scheme \ + 0x2b, 0x81, 0x04, 0x01, 0x0e, 0x01 #define SN_dhSinglePass_cofactorDH_sha384kdf_scheme \ "dhSinglePass-cofactorDH-sha384kdf-scheme" #define NID_dhSinglePass_cofactorDH_sha384kdf_scheme 944 #define OBJ_dhSinglePass_cofactorDH_sha384kdf_scheme 1L, 3L, 132L, 1L, 14L, 2L +#define OBJ_ENC_dhSinglePass_cofactorDH_sha384kdf_scheme \ + 0x2b, 0x81, 0x04, 0x01, 0x0e, 0x02 #define SN_dhSinglePass_cofactorDH_sha512kdf_scheme \ "dhSinglePass-cofactorDH-sha512kdf-scheme" #define NID_dhSinglePass_cofactorDH_sha512kdf_scheme 945 #define OBJ_dhSinglePass_cofactorDH_sha512kdf_scheme 1L, 3L, 132L, 1L, 14L, 3L +#define OBJ_ENC_dhSinglePass_cofactorDH_sha512kdf_scheme \ + 0x2b, 0x81, 0x04, 0x01, 0x0e, 0x03 #define SN_dh_std_kdf "dh-std-kdf" #define NID_dh_std_kdf 946 @@ -4152,10 +5409,12 @@ extern "C" { #define SN_X25519 "X25519" #define NID_X25519 948 #define OBJ_X25519 1L, 3L, 101L, 110L +#define OBJ_ENC_X25519 0x2b, 0x65, 0x6e #define SN_ED25519 "ED25519" #define NID_ED25519 949 #define OBJ_ED25519 1L, 3L, 101L, 112L +#define OBJ_ENC_ED25519 0x2b, 0x65, 0x70 #define SN_chacha20_poly1305 "ChaCha20-Poly1305" #define LN_chacha20_poly1305 "chacha20-poly1305" @@ -4196,15 +5455,18 @@ extern "C" { #define SN_ED448 "ED448" #define NID_ED448 960 #define OBJ_ED448 1L, 3L, 101L, 113L +#define OBJ_ENC_ED448 0x2b, 0x65, 0x71 #define SN_X448 "X448" #define NID_X448 961 #define OBJ_X448 1L, 3L, 101L, 111L +#define OBJ_ENC_X448 0x2b, 0x65, 0x6f #define SN_sha512_256 "SHA512-256" #define LN_sha512_256 "sha512-256" #define NID_sha512_256 962 #define OBJ_sha512_256 2L, 16L, 840L, 1L, 101L, 3L, 4L, 2L, 6L +#define OBJ_ENC_sha512_256 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x06 #define SN_hkdf "HKDF" #define LN_hkdf "hkdf" @@ -4216,6 +5478,36 @@ extern "C" { #define SN_X25519MLKEM768 "X25519MLKEM768" #define NID_X25519MLKEM768 965 +#define SN_ML_KEM_1024 "id-alg-ml-kem-1024" +#define LN_ML_KEM_1024 "ML-KEM-1024" +#define NID_ML_KEM_1024 966 +#define OBJ_ML_KEM_1024 2L, 16L, 840L, 1L, 101L, 3L, 4L, 4L, 3L +#define OBJ_ENC_ML_KEM_1024 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x04, 0x03 + +#define SN_ML_DSA_44 "id-ml-dsa-44" +#define LN_ML_DSA_44 "ML-DSA-44" +#define NID_ML_DSA_44 967 +#define OBJ_ML_DSA_44 2L, 16L, 840L, 1L, 101L, 3L, 4L, 3L, 17L +#define OBJ_ENC_ML_DSA_44 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x11 + +#define SN_ML_DSA_65 "id-ml-dsa-65" +#define LN_ML_DSA_65 "ML-DSA-65" +#define NID_ML_DSA_65 968 +#define OBJ_ML_DSA_65 2L, 16L, 840L, 1L, 101L, 3L, 4L, 3L, 18L +#define OBJ_ENC_ML_DSA_65 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x12 + +#define SN_ML_DSA_87 "id-ml-dsa-87" +#define LN_ML_DSA_87 "ML-DSA-87" +#define NID_ML_DSA_87 969 +#define OBJ_ML_DSA_87 2L, 16L, 840L, 1L, 101L, 3L, 4L, 3L, 19L +#define OBJ_ENC_ML_DSA_87 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x13 + +#define SN_ML_KEM_768 "id-alg-ml-kem-768" +#define LN_ML_KEM_768 "ML-KEM-768" +#define NID_ML_KEM_768 970 +#define OBJ_ML_KEM_768 2L, 16L, 840L, 1L, 101L, 3L, 4L, 4L, 2L +#define OBJ_ENC_ML_KEM_768 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x04, 0x02 + #if defined(__cplusplus) } /* extern C */ diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/pkcs7.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/pkcs7.h index 9990580576..63a4457b67 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/pkcs7.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/pkcs7.h @@ -176,8 +176,7 @@ OPENSSL_EXPORT int PKCS7_type_is_encrypted(const PKCS7 *p7); // PKCS7_type_is_enveloped returns zero. OPENSSL_EXPORT int PKCS7_type_is_enveloped(const PKCS7 *p7); -// PKCS7_type_is_signed returns one. (We only supporte signed data -// ContentInfos.) +// PKCS7_type_is_signed returns one. (We only support signed data ContentInfos.) OPENSSL_EXPORT int PKCS7_type_is_signed(const PKCS7 *p7); // PKCS7_type_is_signedAndEnveloped returns zero. diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/pki/certificate.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/pki/certificate.h index 3eeeeeff7f..7c217f394d 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/pki/certificate.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/pki/certificate.h @@ -38,14 +38,14 @@ class OPENSSL_EXPORT Certificate { // FromDER returns a certificate from an DER-encoded X.509 object in |der|. // In the event of a failure, it will return no value, and |out_diagnostic| // may be set to a string of human readable debugging information if - // information abou the failure is available. + // information about the failure is available. static std::unique_ptr FromDER( bssl::Span der, std::string *out_diagnostic); // FromPEM returns a certificate from the first CERTIFICATE PEM block in // |pem|. In the event of a failure, it will return no value, and // |out_diagnostic| may be set to a string of human readable debugging - // informtion if informaiton about the failuew is available. + // information if information about the failure is available. static std::unique_ptr FromPEM( std::string_view pem, std::string *out_diagnostic); @@ -57,7 +57,7 @@ class OPENSSL_EXPORT Certificate { // may or may not be this, and may check other properties of the certificate. bool IsSelfIssued() const; - // Validity specifies the temporal validity of a cerificate, expressed in + // Validity specifies the temporal validity of a certificate, expressed in // POSIX time values of seconds since the POSIX epoch. The certificate is // valid at POSIX time t in second granularity, where not_before <= t <= // not_after. diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/pki/verify_error.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/pki/verify_error.h index 22c219d6fa..a01864d486 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/pki/verify_error.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/pki/verify_error.h @@ -107,7 +107,7 @@ class OPENSSL_EXPORT VerifyError { StatusCode Code() const; // Index returns the certificate in the chain for which the error first - // occured, starting with 0 for the leaf certificate. Later certificates in + // occurred, starting with 0 for the leaf certificate. Later certificates in // the chain may also exhibit the same error. If the error is not specific to // a certificate, -1 is returned. ptrdiff_t Index() const; diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/rsa.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/rsa.h index d948b193eb..8fbb1ae099 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/rsa.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/rsa.h @@ -763,8 +763,13 @@ OPENSSL_EXPORT int RSA_padding_add_PKCS1_OAEP(uint8_t *to, size_t to_len, OPENSSL_EXPORT int RSA_print(BIO *bio, const RSA *rsa, int indent); // RSA_get0_pss_params returns NULL. In OpenSSL, this function retries RSA-PSS -// parameters associated with |RSA| objects, but BoringSSL does not support -// the id-RSASSA-PSS key encoding. +// parameters associated with |RSA| objects, but BoringSSL does not enable the +// id-RSASSA-PSS key encoding by default. +// +// WARNING: BoringSSL does support id-RSASSA-PSS parameters when callers opt in +// (see |EVP_pkey_rsa_pss_sha256| and others). We currently assume such callers +// do not need this function. Callers that opt into id-RSASSA-PSS support and +// require this functionality should contact the BoringSSL team. OPENSSL_EXPORT const RSA_PSS_PARAMS *RSA_get0_pss_params(const RSA *rsa); // RSA_new_method_no_e returns a newly-allocated |RSA| object backed by diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/sha.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/sha.h index 4ac28ebf75..ba17bfaa12 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/sha.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/sha.h @@ -15,8 +15,7 @@ #ifndef OPENSSL_HEADER_SHA_H #define OPENSSL_HEADER_SHA_H -#include // IWYU pragma: export -#include // IWYU pragma: export +#include // IWYU pragma: export // `sha.h` historically included SHA-1 and SHA-2 hash functions. So, for // backward compatibility `sha2.h` is included here. New uses of this header @@ -62,6 +61,29 @@ OPENSSL_EXPORT uint8_t *SHA1(const uint8_t *data, size_t len, OPENSSL_EXPORT void SHA1_Transform(SHA_CTX *sha, const uint8_t block[SHA_CBLOCK]); +struct sha_state_st { +#if defined(__cplusplus) || defined(OPENSSL_WINDOWS) + uint32_t h[5]; +#else + // wpa_supplicant accesses |h0|..|h4| so we must support those names for + // compatibility with it until it can be updated. Anonymous unions are only + // standard in C11, so disable this workaround in C++. + union { + uint32_t h[5]; + struct { + uint32_t h0; + uint32_t h1; + uint32_t h2; + uint32_t h3; + uint32_t h4; + }; + }; +#endif + uint32_t Nl, Nh; + uint8_t data[SHA_CBLOCK]; + unsigned num; +} /* SHA_CTX */; + // CRYPTO_fips_186_2_prf derives |out_len| bytes from |xkey| using the PRF // defined in FIPS 186-2, Appendix 3.1, with change notice 1 applied. The b // parameter is 160 and seed, XKEY, is also 160 bits. The optional XSEED user diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/sha2.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/sha2.h index 286c41654e..5fe9f5379d 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/sha2.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/sha2.h @@ -15,8 +15,7 @@ #ifndef OPENSSL_HEADER_SHA2_H #define OPENSSL_HEADER_SHA2_H -#include // IWYU pragma: export -#include // IWYU pragma: export +#include // IWYU pragma: export #if defined(__cplusplus) extern "C" { @@ -90,6 +89,13 @@ OPENSSL_EXPORT void SHA256_TransformBlocks(uint32_t state[8], const uint8_t *data, size_t num_blocks); +struct sha256_state_st { + uint32_t h[8]; + uint32_t Nl, Nh; + uint8_t data[SHA256_CBLOCK]; + unsigned num, md_len; +} /* SHA256_CTX */; + // SHA-384. @@ -150,6 +156,14 @@ OPENSSL_EXPORT uint8_t *SHA512(const uint8_t *data, size_t len, OPENSSL_EXPORT void SHA512_Transform(SHA512_CTX *sha, const uint8_t block[SHA512_CBLOCK]); +struct sha512_state_st { + uint64_t h[8]; + uint16_t num, md_len; + uint32_t bytes_so_far_high; + uint64_t bytes_so_far_low; + uint8_t p[SHA512_CBLOCK]; +} /* SHA512_CTX */; + // SHA-512-256 // diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/span.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/span.h index 440b6571f0..4f01247f26 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/span.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/span.h @@ -24,6 +24,7 @@ extern "C++" { #include #include +#include #include #include @@ -33,24 +34,27 @@ extern "C++" { #if defined(__cpp_lib_ranges) && __cpp_lib_ranges >= 201911L #include -BSSL_NAMESPACE_BEGIN -template -class Span; -BSSL_NAMESPACE_END - -// Mark `Span` as satisfying the `view` and `borrowed_range` concepts. This -// should be done before the definition of `Span`, so that any inlined calls to -// range functionality use the correct specializations. -template -inline constexpr bool std::ranges::enable_view> = true; -template -inline constexpr bool std::ranges::enable_borrowed_range> = true; #endif BSSL_NAMESPACE_BEGIN +inline constexpr size_t dynamic_extent = std::numeric_limits::max(); -template +template class Span; +BSSL_NAMESPACE_END + +#if defined(__cpp_lib_ranges) && __cpp_lib_ranges >= 201911L +// Mark `Span` as satisfying the `view` and `borrowed_range` concepts. This +// should be done before the definition of `Span`, so that any inlined calls to +// range functionality use the correct specializations. +template +inline constexpr bool std::ranges::enable_view> = true; +template +inline constexpr bool std::ranges::enable_borrowed_range> = + true; +#endif + +BSSL_NAMESPACE_BEGIN namespace internal { template @@ -67,6 +71,32 @@ class SpanBase { friend bool operator!=(Span lhs, Span rhs) { return !(lhs == rhs); } }; +// Container class to store the size of a span at runtime or compile time. +template +class SpanStorage : private SpanBase { + public: + constexpr SpanStorage(T *data, size_t size) : data_(data) { + BSSL_CHECK(size == N); + } + constexpr T *data() const { return data_; } + constexpr size_t size() const { return N; } + + private: + T *data_; +}; + +template +class SpanStorage : private SpanBase { + public: + constexpr SpanStorage(T *data, size_t size) : data_(data), size_(size) {} + constexpr T *data() const { return data_; } + constexpr size_t size() const { return size_; } + + private: + T *data_; + size_t size_; +}; + // Heuristically test whether C is a container type that can be converted into // a Span by checking for data() and size() member functions. template @@ -74,6 +104,10 @@ using EnableIfContainer = std::enable_if_t< std::is_convertible_v().data()), T *> && std::is_integral_v().size())>>; +// A fake type used to be able to SFINAE between two different container +// constructors - by giving one this as a second default argument, and one not. +struct AllowRedeclaringConstructor {}; + } // namespace internal // A Span is a non-owning reference to a contiguous array of objects of type @@ -104,14 +138,12 @@ using EnableIfContainer = std::enable_if_t< // // FooMutate(bssl::Span(vec)); // -// Note that Spans have value type sematics. They are cheap to construct and +// Note that Spans have value type semantics. They are cheap to construct and // copy, and should be passed by value whenever a method would otherwise accept // a reference or pointer to a container or array. -template -class Span : private internal::SpanBase { +template +class Span : public internal::SpanStorage { public: - static const size_t npos = static_cast(-1); - using element_type = T; using value_type = std::remove_cv_t; using size_type = size_t; @@ -123,90 +155,161 @@ class Span : private internal::SpanBase { using iterator = T *; using const_iterator = const T *; - constexpr Span() : Span(nullptr, 0) {} - constexpr Span(T *ptr, size_t len) : data_(ptr), size_(len) {} + template > + constexpr Span() : internal::SpanStorage(nullptr, 0) {} - template - constexpr Span(T (&array)[N]) : Span(array, N) {} + // NOTE: This constructor may abort() at runtime if len differs from the + // compile-time size, if any. + constexpr Span(T *ptr, size_t len) : internal::SpanStorage(ptr, len) {} + + template > + // NOLINTNEXTLINE(google-explicit-constructor): same as std::span. + constexpr Span(T (&array)[NA]) : internal::SpanStorage(array, NA) {} + + template < + size_t NA, typename U, + typename = std::enable_if_t>, + typename = std::enable_if_t> + // NOLINTNEXTLINE(google-explicit-constructor): same as std::span. + constexpr Span(Span other) + : internal::SpanStorage(other.data(), other.size()) {} template , - typename = std::enable_if_t::value, C>> + typename = std::enable_if_t::value, C>, + typename = std::enable_if_t> + // NOLINTNEXTLINE(google-explicit-constructor): same as std::span. constexpr Span(const C &container) - : data_(container.data()), size_(container.size()) {} + : internal::SpanStorage(container.data(), container.size()) {} + // NOTE: This constructor may abort() at runtime if the container's length + // differs from the compile-time size, if any. + template , + typename = std::enable_if_t::value, C>, + typename = std::enable_if_t> + constexpr explicit Span(const C &container, + internal::AllowRedeclaringConstructor = {}) + : internal::SpanStorage(container.data(), container.size()) {} + + // NOTE: This constructor may abort() at runtime if the container's length + // differs from the compile-time size, if any. template , typename = std::enable_if_t::value, C>> constexpr explicit Span(C &container) - : data_(container.data()), size_(container.size()) {} + : internal::SpanStorage(container.data(), container.size()) {} - constexpr T *data() const { return data_; } - constexpr size_t size() const { return size_; } - constexpr bool empty() const { return size_ == 0; } + using internal::SpanStorage::data; + using internal::SpanStorage::size; + constexpr bool empty() const { return size() == 0; } - constexpr iterator begin() const { return data_; } - constexpr const_iterator cbegin() const { return data_; } - constexpr iterator end() const { return data_ + size_; } + constexpr iterator begin() const { return data(); } + constexpr const_iterator cbegin() const { return data(); } + constexpr iterator end() const { return data() + size(); } constexpr const_iterator cend() const { return end(); } constexpr T &front() const { - if (size_ == 0) { - abort(); - } - return data_[0]; + BSSL_CHECK(size() != 0); + return data()[0]; } constexpr T &back() const { - if (size_ == 0) { - abort(); - } - return data_[size_ - 1]; + BSSL_CHECK(size() != 0); + return data()[size() - 1]; } constexpr T &operator[](size_t i) const { - if (i >= size_) { - abort(); - } - return data_[i]; + BSSL_CHECK(i < size()); + return data()[i]; } T &at(size_t i) const { return (*this)[i]; } - constexpr Span subspan(size_t pos = 0, size_t len = npos) const { - if (pos > size_) { - // absl::Span throws an exception here. Note std::span and Chromium - // base::span additionally forbid pos + len being out of range, with a - // special case at npos/dynamic_extent, while absl::Span::subspan clips - // the span. For now, we align with absl::Span in case we switch to it in - // the future. - abort(); - } - return Span(data_ + pos, std::min(size_ - pos, len)); - } - - constexpr Span first(size_t len) const { - if (len > size_) { - abort(); - } - return Span(data_, len); - } - - constexpr Span last(size_t len) const { - if (len > size_) { - abort(); - } - return Span(data_ + size_ - len, len); - } - private: - T *data_; - size_t size_; -}; + static constexpr size_t SubspanOutLen(size_t size, size_t pos, size_t len) { + // NOTE: This differs from std::span's subspan length in that this one + // performs clipping. + // + // For std::span, this would be: + // + // len != dynamic_extent ? len : size - pos + return std::min(size - pos, len); + } + static constexpr size_t SubspanTypeOutLen(size_t size, size_t pos, + size_t len) { + // NOTE: This differs from std::span's subspan length in that this one + // performs clipping, and thus has to return dynamic extent whenever the + // input span has dynamic extent. + // + // For std::span, this would be: + // + // len != dynamic_extent + // ? len + // : (size != dynamic_extent ? size - pos : dynamic_extent) + if (size == dynamic_extent) { + return dynamic_extent; + } + return SubspanOutLen(size, pos, len); + } -template -const size_t Span::npos; + public: + // NOTE: This method may abort() at runtime if pos is out of range. + constexpr Span subspan(size_t pos = 0, size_t len = dynamic_extent) const { + // absl::Span throws an exception here. Note std::span and Chromium + // base::span additionally forbid pos + len being out of range, with a + // special case at npos/dynamic_extent, while absl::Span::subspan clips + // the span. For now, we align with absl::Span in case we switch to it in + // the future. + BSSL_CHECK(pos <= size()); + return Span(data() + pos, SubspanOutLen(size(), pos, len)); + } + + // NOTE: This method may abort() at runtime if len is out of range. + template + constexpr Span subspan() const { + // absl::Span throws an exception here. Note std::span and Chromium + // base::span additionally forbid pos + len being out of range, with a + // special case at npos/dynamic_extent, while absl::Span::subspan clips + // the span. For now, we align with absl::Span in case we switch to it in + // the future. + // + // Removing clipping however will allow making the return type have a + // static extent whenever len is static, which matches std::span and + // could improve efficiency. + BSSL_CHECK(pos <= size()); + return Span(data() + pos, + std::min(size() - pos, len)); + } + + // NOTE: This method may abort() at runtime if len is out of range. + constexpr Span first(size_t len) const { + BSSL_CHECK(len <= size()); + return Span(data(), len); + } + + // NOTE: This method may abort() at runtime if len is out of range. + template + constexpr Span first() const { + BSSL_CHECK(len <= size()); + return Span(data(), len); + } + + // NOTE: This method may abort() at runtime if len is out of range. + constexpr Span last(size_t len) const { + BSSL_CHECK(len <= size()); + return Span(data() + size() - len, len); + } + + // NOTE: This method may abort() at runtime if len is out of range. + template + constexpr Span last() const { + BSSL_CHECK(len <= size()); + return Span(data() + size() - len, len); + } +}; template Span(T *, size_t) -> Span; template -Span(T (&array)[size]) -> Span; +Span(T (&array)[size]) -> Span; template < typename C, typename T = std::remove_pointer_t().data())>, @@ -224,8 +327,8 @@ constexpr auto MakeSpan(C &c) -> decltype(MakeSpan(c.data(), c.size())) { } template -constexpr Span MakeSpan(T (&array)[N]) { - return Span(array, N); +constexpr Span MakeSpan(T (&array)[N]) { + return array; } template @@ -240,7 +343,7 @@ constexpr auto MakeConstSpan(const C &c) } template -constexpr Span MakeConstSpan(T (&array)[size]) { +constexpr Span MakeConstSpan(T (&array)[size]) { return array; } diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/ssl.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/ssl.h index 6d72829068..ff68ba69e8 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/ssl.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/ssl.h @@ -1454,17 +1454,44 @@ OPENSSL_EXPORT int SSL_can_release_private_key(const SSL *ssl); DEFINE_CONST_STACK_OF(SSL_CIPHER) +// The following constants are TLS cipher suite protocol IDs, as returned from +// |SSL_CIPHER_get_protocol_id|. +#define SSL_CIPHER_AES_128_GCM_SHA256 0x1301 +#define SSL_CIPHER_AES_256_GCM_SHA384 0x1302 +#define SSL_CIPHER_CHACHA20_POLY1305_SHA256 0x1303 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0xc02b +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0xc02c +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0xc02f +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0xc030 +#define SSL_CIPHER_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 0xcca8 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 0xcca9 +#define SSL_CIPHER_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 0xccac +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0xc009 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0xc00a +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA 0xc013 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA 0xc014 +#define SSL_CIPHER_ECDHE_PSK_WITH_AES_128_CBC_SHA 0xc035 +#define SSL_CIPHER_ECDHE_PSK_WITH_AES_256_CBC_SHA 0xc036 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256 0xc027 +#define SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 0x009c +#define SSL_CIPHER_RSA_WITH_AES_256_GCM_SHA384 0x009d +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA 0x002f +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA 0x0035 +#define SSL_CIPHER_PSK_WITH_AES_128_CBC_SHA 0x008c +#define SSL_CIPHER_PSK_WITH_AES_256_CBC_SHA 0x008d +#define SSL_CIPHER_RSA_WITH_3DES_EDE_CBC_SHA 0x000a + +// The following constants are not cipher suites, but are used in the protocol +// as signalling values. +#define SSL_CIPHER_EMPTY_RENEGOTIATION_INFO_SCSV 0x00ff +#define SSL_CIPHER_FALLBACK_SCSV 0x5600 + // SSL_get_cipher_by_value returns the structure representing a TLS cipher // suite based on its assigned number, or NULL if unknown. See // https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4. OPENSSL_EXPORT const SSL_CIPHER *SSL_get_cipher_by_value(uint16_t value); -// SSL_CIPHER_get_id returns |cipher|'s non-IANA id. This is not its -// IANA-assigned number, which is called the "value" here, although it may be -// cast to a |uint16_t| to get it. -OPENSSL_EXPORT uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *cipher); - -// SSL_CIPHER_get_protocol_id returns |cipher|'s IANA-assigned number. +// SSL_CIPHER_get_protocol_id returns |cipher|'s two-byte protocol ID. OPENSSL_EXPORT uint16_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *cipher); // SSL_CIPHER_is_aead returns one if |cipher| uses an AEAD cipher. @@ -1521,11 +1548,6 @@ OPENSSL_EXPORT uint16_t SSL_CIPHER_get_max_version(const SSL_CIPHER *cipher); // example, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256". OPENSSL_EXPORT const char *SSL_CIPHER_standard_name(const SSL_CIPHER *cipher); -// SSL_CIPHER_get_name returns the OpenSSL name of |cipher|. For example, -// "ECDHE-RSA-AES128-GCM-SHA256". Callers are recommended to use -// |SSL_CIPHER_standard_name| instead. -OPENSSL_EXPORT const char *SSL_CIPHER_get_name(const SSL_CIPHER *cipher); - // SSL_CIPHER_get_kx_name returns a string that describes the key-exchange // method used by |cipher|. For example, "ECDHE_ECDSA". TLS 1.3 AEAD-only // ciphers return the string "GENERIC". @@ -1746,9 +1768,8 @@ OPENSSL_EXPORT STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *ssl); // // This is the same as |SSL_get_peer_cert_chain| except that this function // always returns the full chain, i.e. the first element of the return value -// (if any) will be the leaf certificate. In constrast, -// |SSL_get_peer_cert_chain| returns only the intermediate certificates if the -// |ssl| is a server. +// (if any) will be the leaf certificate. In contrast, |SSL_get_peer_cert_chain| +// returns only the intermediate certificates if the |ssl| is a server. OPENSSL_EXPORT STACK_OF(X509) *SSL_get_peer_full_cert_chain(const SSL *ssl); // SSL_get0_peer_certificates returns the peer's certificate chain, or NULL if @@ -2440,7 +2461,7 @@ enum ssl_ticket_aead_result_t BORINGSSL_ENUM_INT { // ssl_ticket_aead_ignore_ticket indicates that the ticket should be ignored // (i.e. is corrupt or otherwise undecryptable). ssl_ticket_aead_ignore_ticket, - // ssl_ticket_aead_error indicates that a fatal error occured and the + // ssl_ticket_aead_error indicates that a fatal error occurred and the // handshake should be terminated. ssl_ticket_aead_error, }; @@ -2528,17 +2549,20 @@ OPENSSL_EXPORT size_t SSL_CTX_get_num_tickets(const SSL_CTX *ctx); #define SSL_GROUP_X25519 29 #define SSL_GROUP_X25519_MLKEM768 0x11ec #define SSL_GROUP_X25519_KYBER768_DRAFT00 0x6399 +#define SSL_GROUP_MLKEM1024 0x0202 // SSL_CTX_set1_group_ids sets the preferred groups for |ctx| to |group_ids|. -// Each element of |group_ids| should be one of the |SSL_GROUP_*| constants. It +// Each element of |group_ids| should be a unique one of the |SSL_GROUP_*| +// constants. If |group_ids| is empty, a default list will be set instead. It // returns one on success and zero on failure. OPENSSL_EXPORT int SSL_CTX_set1_group_ids(SSL_CTX *ctx, const uint16_t *group_ids, size_t num_group_ids); // SSL_set1_group_ids sets the preferred groups for |ssl| to |group_ids|. Each -// element of |group_ids| should be one of the |SSL_GROUP_*| constants. It -// returns one on success and zero on failure. +// element of |group_ids| should be a unique one of the |SSL_GROUP_*| constants. +// If |group_ids| is empty, a default list will be set instead. It returns one +// on success and zero on failure. OPENSSL_EXPORT int SSL_set1_group_ids(SSL *ssl, const uint16_t *group_ids, size_t num_group_ids); @@ -2572,25 +2596,29 @@ OPENSSL_EXPORT size_t SSL_get_all_group_names(const char **out, size_t max_out); // library. // SSL_CTX_set1_groups sets the preferred groups for |ctx| to be |groups|. Each -// element of |groups| should be a |NID_*| constant from nid.h. It returns one -// on success and zero on failure. +// element of |groups| should be a unique |NID_*| constant from nid.h. If +// |groups| is empty, a default list will be set instead. It returns one on +// success and zero on failure. OPENSSL_EXPORT int SSL_CTX_set1_groups(SSL_CTX *ctx, const int *groups, size_t num_groups); // SSL_set1_groups sets the preferred groups for |ssl| to be |groups|. Each -// element of |groups| should be a |NID_*| constant from nid.h. It returns one -// on success and zero on failure. +// element of |groups| should be a unique |NID_*| constant from nid.h. If +// |groups| is empty, a default list will be set instead. It returns one on +// success and zero on failure. OPENSSL_EXPORT int SSL_set1_groups(SSL *ssl, const int *groups, size_t num_groups); -// SSL_CTX_set1_groups_list decodes |groups| as a colon-separated list of group -// names (e.g. "X25519" or "P-256") and sets |ctx|'s preferred groups to the -// result. It returns one on success and zero on failure. +// SSL_CTX_set1_groups_list decodes |groups| as a non-empty colon-separated list +// of group names (e.g. "X25519" or "P-256") and sets |ctx|'s preferred groups +// to the result. The list must not contain duplicates. It returns one on +// success and zero on failure. OPENSSL_EXPORT int SSL_CTX_set1_groups_list(SSL_CTX *ctx, const char *groups); -// SSL_set1_groups_list decodes |groups| as a colon-separated list of group -// names (e.g. "X25519" or "P-256") and sets |ssl|'s preferred groups to the -// result. It returns one on success and zero on failure. +// SSL_set1_groups_list decodes |groups| as a non-empty colon-separated list of +// group names (e.g. "X25519" or "P-256") and sets |ssl|'s preferred groups to +// the result. The list must not contain duplicates. It returns one on success +// and zero on failure. OPENSSL_EXPORT int SSL_set1_groups_list(SSL *ssl, const char *groups); // SSL_get_negotiated_group returns the NID of the group used by |ssl|'s most @@ -2598,6 +2626,68 @@ OPENSSL_EXPORT int SSL_set1_groups_list(SSL *ssl, const char *groups); OPENSSL_EXPORT int SSL_get_negotiated_group(const SSL *ssl); +// Client key shares. +// +// The key_share extension in TLS 1.3 (RFC 8446 section 4.2.8) may be sent in +// the initial ClientHello to provide key exchange parameters for a subset of +// the groups offered in the client's supported_groups extension, in hopes of +// saving a round-trip by having proactively started a key exchange for the +// ultimately-negotiated group. +// +// If not otherwise configured, the default client key share selection logic +// outputs key shares for up to two supported groups, at most one of which is +// post-quantum. + +// SSL_set1_client_key_shares, when called by a client before the handshake, +// configures |ssl| to send a key_share extension in the initial ClientHello +// containing exactly the groups given by |group_ids|, in the order given. Each +// member of |group_ids| should be one of the |SSL_GROUP_*| constants, and they +// must be unique. This function returns one on success and zero on failure. +// +// If non-empty, the sequence of |group_ids| must be a (not necessarily +// contiguous) subsequence of the groups supported by |ssl|, which may have been +// configured explicitly on |ssl| or its context, or populated by default. +// Caller should finish configuring the group list before calling this function. +// Changing the supported groups for |ssl| after having set client key shares +// will result in the key share selections being reset if this constraint no +// longer holds. +// +// Setting an empty sequence of |group_ids| results in an empty client +// key_share, which will cause the handshake to always take an extra round-trip +// for HelloRetryRequest. +// +// An extra round-trip will be needed if the server's choice of group is not +// among the key shares sent; conversely, sending any key shares other than the +// server's choice wastes CPU and bandwidth (the latter is particularly costly +// for post-quantum key exchanges). To avoid these sub-optimal outcomes, +// key shares should be chosen such that they are likely to be supported by the +// peer server. +OPENSSL_EXPORT int SSL_set1_client_key_shares(SSL *ssl, + const uint16_t *group_ids, + size_t num_group_ids); + +// SSL_set1_server_supported_groups_hint, when |ssl| is a client, indicates that +// the server is likely to support groups listed in |server_groups|, in order of +// decreasing server preference. This function returns one on success and zero +// on error. This may be used when receiving a server hint, such as described in +// draft-ietf-tls-key-share-prediction. +// +// If called, |ssl| will try to predict the server's selected named group based +// on |ssl|'s local preferences and |server_groups|. If it predicts a group, it +// will then send an initial ClientHello with key_share extension containing +// only this prediction. In this case, the prediction will supersede any +// configuration from |SSL_set1_client_key_shares|. This is a convenience +// function so that callers do not need to process the server preference list +// themselves. +// +// Groups listed in |server_groups| should be identified by their TLS group IDs, +// such as the |SSL_GROUP_*| constants. A server may implement groups not known +// to BoringSSL, so |server_groups| may contain unrecognized group IDs. If so, +// this function will ignore them. +OPENSSL_EXPORT int SSL_set1_server_supported_groups_hint( + SSL *ssl, const uint16_t *server_groups, size_t num_server_groups); + + // Certificate verification. // // SSL may authenticate either endpoint with an X.509 certificate. Typically @@ -3057,7 +3147,7 @@ OPENSSL_EXPORT int SSL_add_bio_cert_subjects_to_stack(STACK_OF(X509_NAME) *out, // issuer of the final certificate in |cred|'s certificate chain. // // Additionally, |cred| must enable issuer matching (see -// SSL_CREDENTIAL_set_must_match_issuer|) for this value to take effect. +// |SSL_CREDENTIAL_set_must_match_issuer|) for this value to take effect. // // For better extensibility, callers are recommended to configure this // information with a CertificatePropertyList instead. See @@ -4927,7 +5017,7 @@ enum ssl_select_cert_result_t BORINGSSL_ENUM_INT { // ssl_select_cert_retry indicates that the operation could not be // immediately completed and must be reattempted at a later point. ssl_select_cert_retry = 0, - // ssl_select_cert_error indicates that a fatal error occured and the + // ssl_select_cert_error indicates that a fatal error occurred and the // handshake should be terminated. ssl_select_cert_error = -1, // ssl_select_cert_disable_ech indicates that, although an encrypted @@ -5201,6 +5291,16 @@ OPENSSL_EXPORT const char *SSL_CIPHER_description(const SSL_CIPHER *cipher, // SSL_CIPHER_get_version returns the string "TLSv1/SSLv3". OPENSSL_EXPORT const char *SSL_CIPHER_get_version(const SSL_CIPHER *cipher); +// SSL_CIPHER_get_id returns |cipher|'s IANA-assigned number, OR-d with +// 0x03000000. This is part of OpenSSL's SSL 2.0 legacy. SSL 2.0 has long since +// been removed from BoringSSL. Use |SSL_CIPHER_get_protocol_id| instead. +OPENSSL_EXPORT uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *cipher); + +// SSL_CIPHER_get_name returns the OpenSSL name of |cipher|. For example, +// "ECDHE-RSA-AES128-GCM-SHA256". Callers are recommended to use +// |SSL_CIPHER_standard_name| instead. +OPENSSL_EXPORT const char *SSL_CIPHER_get_name(const SSL_CIPHER *cipher); + typedef void COMP_METHOD; typedef struct ssl_comp_st SSL_COMP; @@ -5353,12 +5453,12 @@ OPENSSL_EXPORT int SSL_get_shared_sigalgs(SSL *ssl, int idx, int *psign, // Use |SSL_SESSION_to_bytes| instead. OPENSSL_EXPORT int i2d_SSL_SESSION(SSL_SESSION *in, uint8_t **pp); -// d2i_SSL_SESSION parses a serialized session from the |length| bytes pointed -// to by |*pp|, as described in |d2i_SAMPLE|. +// d2i_SSL_SESSION parses a serialized session from the |len| bytes pointed to +// by |*inp|, as described in |d2i_SAMPLE|. // // Use |SSL_SESSION_from_bytes| instead. -OPENSSL_EXPORT SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const uint8_t **pp, - long length); +OPENSSL_EXPORT SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **out, + const uint8_t **inp, long len); // i2d_SSL_SESSION_bio serializes |session| and writes the result to |bio|. It // returns the number of bytes written on success and <= 0 on error. @@ -5918,7 +6018,7 @@ enum ssl_compliance_policy_t BORINGSSL_ENUM_INT { // * For TLS 1.3, only AES-GCM // * P-256 or P-384 for key agreement. // * For server signatures, only PKCS#1/PSS with SHA256/384/512, or ECDSA - // with P-256 or P-384. + // with P-256 or P-384 and SHA256/SHA384. // // Note: this policy can be configured even if BoringSSL has not been built in // FIPS mode. Call |FIPS_mode| to check that. @@ -5946,7 +6046,7 @@ enum ssl_compliance_policy_t BORINGSSL_ENUM_INT { // dominate other considerations. ssl_compliance_policy_wpa3_192_202304, - // ssl_compliance_policy_cnsa_202407 confingures a TLS connection to use: + // ssl_compliance_policy_cnsa_202407 configures a TLS connection to use: // * For TLS 1.3, AES-256-GCM over AES-128-GCM over ChaCha20-Poly1305. // // I.e. it ensures that AES-GCM will be used whenever the client supports it. @@ -6468,6 +6568,7 @@ BSSL_NAMESPACE_END #define SSL_R_UNSUPPORTED_CREDENTIAL_LIST 327 #define SSL_R_INVALID_TRUST_ANCHOR_LIST 328 #define SSL_R_INVALID_CERTIFICATE_PROPERTY_LIST 329 +#define SSL_R_DUPLICATE_GROUP 330 #define SSL_R_SSLV3_ALERT_CLOSE_NOTIFY 1000 #define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010 #define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC 1020 diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/ssl3.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/ssl3.h index 331582f8b7..db04f9817b 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/ssl3.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/ssl3.h @@ -23,78 +23,23 @@ extern "C" { #endif -// These are kept to support clients that negotiates higher protocol versions +// These are kept to support clients that negotiate higher protocol versions // using SSLv2 client hello records. #define SSL2_MT_CLIENT_HELLO 1 #define SSL2_VERSION 0x0002 -// Signalling cipher suite value from RFC 5746. +// The following constants are equal to TLS cipher suite values, OR-d with +// 0x03000000. This is part of OpenSSL's SSL 2.0 legacy. SSL 2.0 has long since +// been removed from BoringSSL. +// TODO(davidben): Define these in terms of |SSL_CIPHER_*| constants. The +// challenge is that existing code expects them to be defined in ssl3.h, so we +// must first merge ssl3.h into ssl.h. +#define SSL3_CK_RSA_DES_192_CBC3_SHA 0x0300000A #define SSL3_CK_SCSV 0x030000FF -// Fallback signalling cipher suite value from RFC 7507. #define SSL3_CK_FALLBACK_SCSV 0x03005600 -#define SSL3_CK_RSA_NULL_MD5 0x03000001 -#define SSL3_CK_RSA_NULL_SHA 0x03000002 -#define SSL3_CK_RSA_RC4_40_MD5 0x03000003 -#define SSL3_CK_RSA_RC4_128_MD5 0x03000004 -#define SSL3_CK_RSA_RC4_128_SHA 0x03000005 -#define SSL3_CK_RSA_RC2_40_MD5 0x03000006 -#define SSL3_CK_RSA_IDEA_128_SHA 0x03000007 -#define SSL3_CK_RSA_DES_40_CBC_SHA 0x03000008 -#define SSL3_CK_RSA_DES_64_CBC_SHA 0x03000009 -#define SSL3_CK_RSA_DES_192_CBC3_SHA 0x0300000A - -#define SSL3_CK_DH_DSS_DES_40_CBC_SHA 0x0300000B -#define SSL3_CK_DH_DSS_DES_64_CBC_SHA 0x0300000C -#define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 0x0300000D -#define SSL3_CK_DH_RSA_DES_40_CBC_SHA 0x0300000E -#define SSL3_CK_DH_RSA_DES_64_CBC_SHA 0x0300000F -#define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 0x03000010 - -#define SSL3_CK_EDH_DSS_DES_40_CBC_SHA 0x03000011 -#define SSL3_CK_EDH_DSS_DES_64_CBC_SHA 0x03000012 -#define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA 0x03000013 -#define SSL3_CK_EDH_RSA_DES_40_CBC_SHA 0x03000014 -#define SSL3_CK_EDH_RSA_DES_64_CBC_SHA 0x03000015 -#define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA 0x03000016 - -#define SSL3_CK_ADH_RC4_40_MD5 0x03000017 -#define SSL3_CK_ADH_RC4_128_MD5 0x03000018 -#define SSL3_CK_ADH_DES_40_CBC_SHA 0x03000019 -#define SSL3_CK_ADH_DES_64_CBC_SHA 0x0300001A -#define SSL3_CK_ADH_DES_192_CBC_SHA 0x0300001B - -#define SSL3_TXT_RSA_NULL_MD5 "NULL-MD5" -#define SSL3_TXT_RSA_NULL_SHA "NULL-SHA" -#define SSL3_TXT_RSA_RC4_40_MD5 "EXP-RC4-MD5" -#define SSL3_TXT_RSA_RC4_128_MD5 "RC4-MD5" -#define SSL3_TXT_RSA_RC4_128_SHA "RC4-SHA" -#define SSL3_TXT_RSA_RC2_40_MD5 "EXP-RC2-CBC-MD5" -#define SSL3_TXT_RSA_IDEA_128_SHA "IDEA-CBC-SHA" -#define SSL3_TXT_RSA_DES_40_CBC_SHA "EXP-DES-CBC-SHA" -#define SSL3_TXT_RSA_DES_64_CBC_SHA "DES-CBC-SHA" #define SSL3_TXT_RSA_DES_192_CBC3_SHA "DES-CBC3-SHA" -#define SSL3_TXT_DH_DSS_DES_40_CBC_SHA "EXP-DH-DSS-DES-CBC-SHA" -#define SSL3_TXT_DH_DSS_DES_64_CBC_SHA "DH-DSS-DES-CBC-SHA" -#define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA "DH-DSS-DES-CBC3-SHA" -#define SSL3_TXT_DH_RSA_DES_40_CBC_SHA "EXP-DH-RSA-DES-CBC-SHA" -#define SSL3_TXT_DH_RSA_DES_64_CBC_SHA "DH-RSA-DES-CBC-SHA" -#define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA "DH-RSA-DES-CBC3-SHA" - -#define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA "EXP-EDH-DSS-DES-CBC-SHA" -#define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA "EDH-DSS-DES-CBC-SHA" -#define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA "EDH-DSS-DES-CBC3-SHA" -#define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA "EXP-EDH-RSA-DES-CBC-SHA" -#define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA "EDH-RSA-DES-CBC-SHA" -#define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA "EDH-RSA-DES-CBC3-SHA" - -#define SSL3_TXT_ADH_RC4_40_MD5 "EXP-ADH-RC4-MD5" -#define SSL3_TXT_ADH_RC4_128_MD5 "ADH-RC4-MD5" -#define SSL3_TXT_ADH_DES_40_CBC_SHA "EXP-ADH-DES-CBC-SHA" -#define SSL3_TXT_ADH_DES_64_CBC_SHA "ADH-DES-CBC-SHA" -#define SSL3_TXT_ADH_DES_192_CBC_SHA "ADH-DES-CBC3-SHA" - #define SSL3_SSL_SESSION_ID_LENGTH 32 #define SSL3_MAX_SSL_SESSION_ID_LENGTH 32 @@ -159,9 +104,6 @@ extern "C" { #define SSL3_RT_MAX_PACKET_SIZE \ (SSL3_RT_MAX_ENCRYPTED_LENGTH + SSL3_RT_HEADER_LENGTH) -#define SSL3_MD_CLIENT_FINISHED_CONST "\x43\x4C\x4E\x54" -#define SSL3_MD_SERVER_FINISHED_CONST "\x53\x52\x56\x52" - #define SSL3_RT_CHANGE_CIPHER_SPEC 20 #define SSL3_RT_ALERT 21 #define SSL3_RT_HANDSHAKE 22 diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/tls1.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/tls1.h index dde04dd7e3..ea55e2a072 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/tls1.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/tls1.h @@ -169,171 +169,32 @@ extern "C" { #define TLSEXT_MAXLEN_host_name 255 -// PSK ciphersuites from 4279 -#define TLS1_CK_PSK_WITH_RC4_128_SHA 0x0300008A -#define TLS1_CK_PSK_WITH_3DES_EDE_CBC_SHA 0x0300008B +// The following constants are equal to TLS cipher suite values, OR-d with +// 0x03000000. This is part of OpenSSL's SSL 2.0 legacy. SSL 2.0 has long since +// been removed from BoringSSL. +// TODO(davidben): Define these in terms of |SSL_CIPHER_*| constants. The +// challenge is that existing code expects them to be defined in tls1.h, so we +// must first merge tls1.h into ssl.h. #define TLS1_CK_PSK_WITH_AES_128_CBC_SHA 0x0300008C #define TLS1_CK_PSK_WITH_AES_256_CBC_SHA 0x0300008D - -// PSK ciphersuites from RFC 5489 #define TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA 0x0300C035 #define TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA 0x0300C036 - -// Additional TLS ciphersuites from expired Internet Draft -// draft-ietf-tls-56-bit-ciphersuites-01.txt -// (available if TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES is defined, see -// s3_lib.c). We actually treat them like SSL 3.0 ciphers, which we probably -// shouldn't. Note that the first two are actually not in the IDs. -#define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_MD5 0x03000060 // not in ID -#define TLS1_CK_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 0x03000061 // not in ID -#define TLS1_CK_RSA_EXPORT1024_WITH_DES_CBC_SHA 0x03000062 -#define TLS1_CK_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA 0x03000063 -#define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_SHA 0x03000064 -#define TLS1_CK_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA 0x03000065 -#define TLS1_CK_DHE_DSS_WITH_RC4_128_SHA 0x03000066 - -// AES ciphersuites from RFC 3268 - #define TLS1_CK_RSA_WITH_AES_128_SHA 0x0300002F -#define TLS1_CK_DH_DSS_WITH_AES_128_SHA 0x03000030 -#define TLS1_CK_DH_RSA_WITH_AES_128_SHA 0x03000031 -#define TLS1_CK_DHE_DSS_WITH_AES_128_SHA 0x03000032 -#define TLS1_CK_DHE_RSA_WITH_AES_128_SHA 0x03000033 -#define TLS1_CK_ADH_WITH_AES_128_SHA 0x03000034 - #define TLS1_CK_RSA_WITH_AES_256_SHA 0x03000035 -#define TLS1_CK_DH_DSS_WITH_AES_256_SHA 0x03000036 -#define TLS1_CK_DH_RSA_WITH_AES_256_SHA 0x03000037 -#define TLS1_CK_DHE_DSS_WITH_AES_256_SHA 0x03000038 -#define TLS1_CK_DHE_RSA_WITH_AES_256_SHA 0x03000039 -#define TLS1_CK_ADH_WITH_AES_256_SHA 0x0300003A - -// TLS v1.2 ciphersuites -#define TLS1_CK_RSA_WITH_NULL_SHA256 0x0300003B -#define TLS1_CK_RSA_WITH_AES_128_SHA256 0x0300003C -#define TLS1_CK_RSA_WITH_AES_256_SHA256 0x0300003D -#define TLS1_CK_DH_DSS_WITH_AES_128_SHA256 0x0300003E -#define TLS1_CK_DH_RSA_WITH_AES_128_SHA256 0x0300003F -#define TLS1_CK_DHE_DSS_WITH_AES_128_SHA256 0x03000040 - -// Camellia ciphersuites from RFC 4132 -#define TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000041 -#define TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000042 -#define TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000043 -#define TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000044 -#define TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000045 -#define TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA 0x03000046 - -// TLS v1.2 ciphersuites -#define TLS1_CK_DHE_RSA_WITH_AES_128_SHA256 0x03000067 -#define TLS1_CK_DH_DSS_WITH_AES_256_SHA256 0x03000068 -#define TLS1_CK_DH_RSA_WITH_AES_256_SHA256 0x03000069 -#define TLS1_CK_DHE_DSS_WITH_AES_256_SHA256 0x0300006A -#define TLS1_CK_DHE_RSA_WITH_AES_256_SHA256 0x0300006B -#define TLS1_CK_ADH_WITH_AES_128_SHA256 0x0300006C -#define TLS1_CK_ADH_WITH_AES_256_SHA256 0x0300006D - -// Camellia ciphersuites from RFC 4132 -#define TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000084 -#define TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000085 -#define TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000086 -#define TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000087 -#define TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000088 -#define TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA 0x03000089 - -// SEED ciphersuites from RFC 4162 -#define TLS1_CK_RSA_WITH_SEED_SHA 0x03000096 -#define TLS1_CK_DH_DSS_WITH_SEED_SHA 0x03000097 -#define TLS1_CK_DH_RSA_WITH_SEED_SHA 0x03000098 -#define TLS1_CK_DHE_DSS_WITH_SEED_SHA 0x03000099 -#define TLS1_CK_DHE_RSA_WITH_SEED_SHA 0x0300009A -#define TLS1_CK_ADH_WITH_SEED_SHA 0x0300009B - -// TLS v1.2 GCM ciphersuites from RFC 5288 #define TLS1_CK_RSA_WITH_AES_128_GCM_SHA256 0x0300009C #define TLS1_CK_RSA_WITH_AES_256_GCM_SHA384 0x0300009D -#define TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256 0x0300009E -#define TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384 0x0300009F -#define TLS1_CK_DH_RSA_WITH_AES_128_GCM_SHA256 0x030000A0 -#define TLS1_CK_DH_RSA_WITH_AES_256_GCM_SHA384 0x030000A1 -#define TLS1_CK_DHE_DSS_WITH_AES_128_GCM_SHA256 0x030000A2 -#define TLS1_CK_DHE_DSS_WITH_AES_256_GCM_SHA384 0x030000A3 -#define TLS1_CK_DH_DSS_WITH_AES_128_GCM_SHA256 0x030000A4 -#define TLS1_CK_DH_DSS_WITH_AES_256_GCM_SHA384 0x030000A5 -#define TLS1_CK_ADH_WITH_AES_128_GCM_SHA256 0x030000A6 -#define TLS1_CK_ADH_WITH_AES_256_GCM_SHA384 0x030000A7 - -// ECC ciphersuites from RFC 4492 -#define TLS1_CK_ECDH_ECDSA_WITH_NULL_SHA 0x0300C001 -#define TLS1_CK_ECDH_ECDSA_WITH_RC4_128_SHA 0x0300C002 -#define TLS1_CK_ECDH_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C003 -#define TLS1_CK_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0x0300C004 -#define TLS1_CK_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0x0300C005 - -#define TLS1_CK_ECDHE_ECDSA_WITH_NULL_SHA 0x0300C006 -#define TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA 0x0300C007 -#define TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C008 #define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0x0300C009 #define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0x0300C00A - -#define TLS1_CK_ECDH_RSA_WITH_NULL_SHA 0x0300C00B -#define TLS1_CK_ECDH_RSA_WITH_RC4_128_SHA 0x0300C00C -#define TLS1_CK_ECDH_RSA_WITH_DES_192_CBC3_SHA 0x0300C00D -#define TLS1_CK_ECDH_RSA_WITH_AES_128_CBC_SHA 0x0300C00E -#define TLS1_CK_ECDH_RSA_WITH_AES_256_CBC_SHA 0x0300C00F - -#define TLS1_CK_ECDHE_RSA_WITH_NULL_SHA 0x0300C010 -#define TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA 0x0300C011 -#define TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA 0x0300C012 #define TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA 0x0300C013 #define TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA 0x0300C014 - #define TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA256 0x0300C027 - -#define TLS1_CK_ECDH_anon_WITH_NULL_SHA 0x0300C015 -#define TLS1_CK_ECDH_anon_WITH_RC4_128_SHA 0x0300C016 -#define TLS1_CK_ECDH_anon_WITH_DES_192_CBC3_SHA 0x0300C017 -#define TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA 0x0300C018 -#define TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA 0x0300C019 - -// SRP ciphersuites from RFC 5054 -#define TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA 0x0300C01A -#define TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA 0x0300C01B -#define TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA 0x0300C01C -#define TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA 0x0300C01D -#define TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA 0x0300C01E -#define TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA 0x0300C01F -#define TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA 0x0300C020 -#define TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA 0x0300C021 -#define TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA 0x0300C022 - -// ECDH HMAC based ciphersuites from RFC 5289 - -#define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256 0x0300C023 -#define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384 0x0300C024 -#define TLS1_CK_ECDH_ECDSA_WITH_AES_128_SHA256 0x0300C025 -#define TLS1_CK_ECDH_ECDSA_WITH_AES_256_SHA384 0x0300C026 -#define TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256 0x0300C027 -#define TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384 0x0300C028 -#define TLS1_CK_ECDH_RSA_WITH_AES_128_SHA256 0x0300C029 -#define TLS1_CK_ECDH_RSA_WITH_AES_256_SHA384 0x0300C02A - -// ECDH GCM based ciphersuites from RFC 5289 #define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02B #define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02C -#define TLS1_CK_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02D -#define TLS1_CK_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02E #define TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0x0300C02F #define TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0x0300C030 -#define TLS1_CK_ECDH_RSA_WITH_AES_128_GCM_SHA256 0x0300C031 -#define TLS1_CK_ECDH_RSA_WITH_AES_256_GCM_SHA384 0x0300C032 - -// ChaCha20-Poly1305 cipher suites from RFC 7905. #define TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 0x0300CCA8 #define TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 0x0300CCA9 #define TLS1_CK_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 0x0300CCAC - -// TLS 1.3 ciphersuites from RFC 8446. #define TLS1_3_CK_AES_128_GCM_SHA256 0x03001301 #define TLS1_3_CK_AES_256_GCM_SHA384 0x03001302 #define TLS1_3_CK_CHACHA20_POLY1305_SHA256 0x03001303 @@ -344,186 +205,38 @@ extern "C" { #define TLS1_CK_AES_256_GCM_SHA384 TLS1_3_CK_AES_256_GCM_SHA384 #define TLS1_CK_CHACHA20_POLY1305_SHA256 TLS1_3_CK_CHACHA20_POLY1305_SHA256 -// XXX -// Inconsistency alert: -// The OpenSSL names of ciphers with ephemeral DH here include the string -// "DHE", while elsewhere it has always been "EDH". -// (The alias for the list of all such ciphers also is "EDH".) -// The specifications speak of "EDH"; maybe we should allow both forms -// for everything. -#define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5 "EXP1024-RC4-MD5" -#define TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 "EXP1024-RC2-CBC-MD5" -#define TLS1_TXT_RSA_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DES-CBC-SHA" -#define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA \ - "EXP1024-DHE-DSS-DES-CBC-SHA" -#define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_SHA "EXP1024-RC4-SHA" -#define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA "EXP1024-DHE-DSS-RC4-SHA" -#define TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA "DHE-DSS-RC4-SHA" - -// AES ciphersuites from RFC 3268 -#define TLS1_TXT_RSA_WITH_AES_128_SHA "AES128-SHA" -#define TLS1_TXT_DH_DSS_WITH_AES_128_SHA "DH-DSS-AES128-SHA" -#define TLS1_TXT_DH_RSA_WITH_AES_128_SHA "DH-RSA-AES128-SHA" -#define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA "DHE-DSS-AES128-SHA" -#define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA "DHE-RSA-AES128-SHA" -#define TLS1_TXT_ADH_WITH_AES_128_SHA "ADH-AES128-SHA" - -#define TLS1_TXT_RSA_WITH_AES_256_SHA "AES256-SHA" -#define TLS1_TXT_DH_DSS_WITH_AES_256_SHA "DH-DSS-AES256-SHA" -#define TLS1_TXT_DH_RSA_WITH_AES_256_SHA "DH-RSA-AES256-SHA" -#define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA "DHE-DSS-AES256-SHA" -#define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA "DHE-RSA-AES256-SHA" -#define TLS1_TXT_ADH_WITH_AES_256_SHA "ADH-AES256-SHA" - -// ECC ciphersuites from RFC 4492 -#define TLS1_TXT_ECDH_ECDSA_WITH_NULL_SHA "ECDH-ECDSA-NULL-SHA" -#define TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA "ECDH-ECDSA-RC4-SHA" -#define TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA "ECDH-ECDSA-DES-CBC3-SHA" -#define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA "ECDH-ECDSA-AES128-SHA" -#define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA "ECDH-ECDSA-AES256-SHA" - -#define TLS1_TXT_ECDHE_ECDSA_WITH_NULL_SHA "ECDHE-ECDSA-NULL-SHA" -#define TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA "ECDHE-ECDSA-RC4-SHA" -#define TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA "ECDHE-ECDSA-DES-CBC3-SHA" -#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA "ECDHE-ECDSA-AES128-SHA" -#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA "ECDHE-ECDSA-AES256-SHA" - -#define TLS1_TXT_ECDH_RSA_WITH_NULL_SHA "ECDH-RSA-NULL-SHA" -#define TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA "ECDH-RSA-RC4-SHA" -#define TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA "ECDH-RSA-DES-CBC3-SHA" -#define TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA "ECDH-RSA-AES128-SHA" -#define TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA "ECDH-RSA-AES256-SHA" - -#define TLS1_TXT_ECDHE_RSA_WITH_NULL_SHA "ECDHE-RSA-NULL-SHA" -#define TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA "ECDHE-RSA-RC4-SHA" -#define TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA "ECDHE-RSA-DES-CBC3-SHA" -#define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA "ECDHE-RSA-AES128-SHA" -#define TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA "ECDHE-RSA-AES256-SHA" - -#define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA256 "ECDHE-RSA-AES128-SHA256" - -#define TLS1_TXT_ECDH_anon_WITH_NULL_SHA "AECDH-NULL-SHA" -#define TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA "AECDH-RC4-SHA" -#define TLS1_TXT_ECDH_anon_WITH_DES_192_CBC3_SHA "AECDH-DES-CBC3-SHA" -#define TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA "AECDH-AES128-SHA" -#define TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA "AECDH-AES256-SHA" - -// PSK ciphersuites from RFC 4279 -#define TLS1_TXT_PSK_WITH_RC4_128_SHA "PSK-RC4-SHA" -#define TLS1_TXT_PSK_WITH_3DES_EDE_CBC_SHA "PSK-3DES-EDE-CBC-SHA" +// The following constants are the OpenSSL names (see |SSL_CIPHER_get_name|) for +// various TLS ciphers. Prefer the standard name, returned from +// |SSL_CIPHER_standard_name| and supported by |SSL_CTX_set_cipher_list|. #define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA "PSK-AES128-CBC-SHA" #define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA "PSK-AES256-CBC-SHA" - -// PSK ciphersuites from RFC 5489 #define TLS1_TXT_ECDHE_PSK_WITH_AES_128_CBC_SHA "ECDHE-PSK-AES128-CBC-SHA" #define TLS1_TXT_ECDHE_PSK_WITH_AES_256_CBC_SHA "ECDHE-PSK-AES256-CBC-SHA" - -// SRP ciphersuite from RFC 5054 -#define TLS1_TXT_SRP_SHA_WITH_3DES_EDE_CBC_SHA "SRP-3DES-EDE-CBC-SHA" -#define TLS1_TXT_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA "SRP-RSA-3DES-EDE-CBC-SHA" -#define TLS1_TXT_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA "SRP-DSS-3DES-EDE-CBC-SHA" -#define TLS1_TXT_SRP_SHA_WITH_AES_128_CBC_SHA "SRP-AES-128-CBC-SHA" -#define TLS1_TXT_SRP_SHA_RSA_WITH_AES_128_CBC_SHA "SRP-RSA-AES-128-CBC-SHA" -#define TLS1_TXT_SRP_SHA_DSS_WITH_AES_128_CBC_SHA "SRP-DSS-AES-128-CBC-SHA" -#define TLS1_TXT_SRP_SHA_WITH_AES_256_CBC_SHA "SRP-AES-256-CBC-SHA" -#define TLS1_TXT_SRP_SHA_RSA_WITH_AES_256_CBC_SHA "SRP-RSA-AES-256-CBC-SHA" -#define TLS1_TXT_SRP_SHA_DSS_WITH_AES_256_CBC_SHA "SRP-DSS-AES-256-CBC-SHA" - -// Camellia ciphersuites from RFC 4132 -#define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA "CAMELLIA128-SHA" -#define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA "DH-DSS-CAMELLIA128-SHA" -#define TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA "DH-RSA-CAMELLIA128-SHA" -#define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA "DHE-DSS-CAMELLIA128-SHA" -#define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA "DHE-RSA-CAMELLIA128-SHA" -#define TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA "ADH-CAMELLIA128-SHA" - -#define TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA "CAMELLIA256-SHA" -#define TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA "DH-DSS-CAMELLIA256-SHA" -#define TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA "DH-RSA-CAMELLIA256-SHA" -#define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA "DHE-DSS-CAMELLIA256-SHA" -#define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA "DHE-RSA-CAMELLIA256-SHA" -#define TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA "ADH-CAMELLIA256-SHA" - -// SEED ciphersuites from RFC 4162 -#define TLS1_TXT_RSA_WITH_SEED_SHA "SEED-SHA" -#define TLS1_TXT_DH_DSS_WITH_SEED_SHA "DH-DSS-SEED-SHA" -#define TLS1_TXT_DH_RSA_WITH_SEED_SHA "DH-RSA-SEED-SHA" -#define TLS1_TXT_DHE_DSS_WITH_SEED_SHA "DHE-DSS-SEED-SHA" -#define TLS1_TXT_DHE_RSA_WITH_SEED_SHA "DHE-RSA-SEED-SHA" -#define TLS1_TXT_ADH_WITH_SEED_SHA "ADH-SEED-SHA" - -// TLS v1.2 ciphersuites -#define TLS1_TXT_RSA_WITH_NULL_SHA256 "NULL-SHA256" -#define TLS1_TXT_RSA_WITH_AES_128_SHA256 "AES128-SHA256" -#define TLS1_TXT_RSA_WITH_AES_256_SHA256 "AES256-SHA256" -#define TLS1_TXT_DH_DSS_WITH_AES_128_SHA256 "DH-DSS-AES128-SHA256" -#define TLS1_TXT_DH_RSA_WITH_AES_128_SHA256 "DH-RSA-AES128-SHA256" -#define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA256 "DHE-DSS-AES128-SHA256" -#define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256 "DHE-RSA-AES128-SHA256" -#define TLS1_TXT_DH_DSS_WITH_AES_256_SHA256 "DH-DSS-AES256-SHA256" -#define TLS1_TXT_DH_RSA_WITH_AES_256_SHA256 "DH-RSA-AES256-SHA256" -#define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA256 "DHE-DSS-AES256-SHA256" -#define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256 "DHE-RSA-AES256-SHA256" -#define TLS1_TXT_ADH_WITH_AES_128_SHA256 "ADH-AES128-SHA256" -#define TLS1_TXT_ADH_WITH_AES_256_SHA256 "ADH-AES256-SHA256" - -// TLS v1.2 GCM ciphersuites from RFC 5288 +#define TLS1_TXT_RSA_WITH_AES_128_SHA "AES128-SHA" +#define TLS1_TXT_RSA_WITH_AES_256_SHA "AES256-SHA" #define TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256 "AES128-GCM-SHA256" #define TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384 "AES256-GCM-SHA384" -#define TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256 "DHE-RSA-AES128-GCM-SHA256" -#define TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384 "DHE-RSA-AES256-GCM-SHA384" -#define TLS1_TXT_DH_RSA_WITH_AES_128_GCM_SHA256 "DH-RSA-AES128-GCM-SHA256" -#define TLS1_TXT_DH_RSA_WITH_AES_256_GCM_SHA384 "DH-RSA-AES256-GCM-SHA384" -#define TLS1_TXT_DHE_DSS_WITH_AES_128_GCM_SHA256 "DHE-DSS-AES128-GCM-SHA256" -#define TLS1_TXT_DHE_DSS_WITH_AES_256_GCM_SHA384 "DHE-DSS-AES256-GCM-SHA384" -#define TLS1_TXT_DH_DSS_WITH_AES_128_GCM_SHA256 "DH-DSS-AES128-GCM-SHA256" -#define TLS1_TXT_DH_DSS_WITH_AES_256_GCM_SHA384 "DH-DSS-AES256-GCM-SHA384" -#define TLS1_TXT_ADH_WITH_AES_128_GCM_SHA256 "ADH-AES128-GCM-SHA256" -#define TLS1_TXT_ADH_WITH_AES_256_GCM_SHA384 "ADH-AES256-GCM-SHA384" - -// ECDH HMAC based ciphersuites from RFC 5289 - -#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_SHA256 "ECDHE-ECDSA-AES128-SHA256" -#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_SHA384 "ECDHE-ECDSA-AES256-SHA384" -#define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_SHA256 "ECDH-ECDSA-AES128-SHA256" -#define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_SHA384 "ECDH-ECDSA-AES256-SHA384" -#define TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256 "ECDHE-RSA-AES128-SHA256" -#define TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384 "ECDHE-RSA-AES256-SHA384" -#define TLS1_TXT_ECDH_RSA_WITH_AES_128_SHA256 "ECDH-RSA-AES128-SHA256" -#define TLS1_TXT_ECDH_RSA_WITH_AES_256_SHA384 "ECDH-RSA-AES256-SHA384" - -// ECDH GCM based ciphersuites from RFC 5289 +#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA "ECDHE-ECDSA-AES128-SHA" +#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA "ECDHE-ECDSA-AES256-SHA" +#define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA "ECDHE-RSA-AES128-SHA" +#define TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA "ECDHE-RSA-AES256-SHA" +#define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA256 "ECDHE-RSA-AES128-SHA256" #define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 \ "ECDHE-ECDSA-AES128-GCM-SHA256" #define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 \ "ECDHE-ECDSA-AES256-GCM-SHA384" -#define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 \ - "ECDH-ECDSA-AES128-GCM-SHA256" -#define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 \ - "ECDH-ECDSA-AES256-GCM-SHA384" #define TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 "ECDHE-RSA-AES128-GCM-SHA256" #define TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384 "ECDHE-RSA-AES256-GCM-SHA384" -#define TLS1_TXT_ECDH_RSA_WITH_AES_128_GCM_SHA256 "ECDH-RSA-AES128-GCM-SHA256" -#define TLS1_TXT_ECDH_RSA_WITH_AES_256_GCM_SHA384 "ECDH-RSA-AES256-GCM-SHA384" - #define TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 \ "ECDHE-RSA-CHACHA20-POLY1305" #define TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 \ "ECDHE-ECDSA-CHACHA20-POLY1305" #define TLS1_TXT_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 \ "ECDHE-PSK-CHACHA20-POLY1305" - -// TLS 1.3 ciphersuites from RFC 8446. #define TLS1_3_RFC_AES_128_GCM_SHA256 "TLS_AES_128_GCM_SHA256" #define TLS1_3_RFC_AES_256_GCM_SHA384 "TLS_AES_256_GCM_SHA384" #define TLS1_3_RFC_CHACHA20_POLY1305_SHA256 "TLS_CHACHA20_POLY1305_SHA256" -// The following constants are legacy aliases of |TLS1_3_CK_*|. -// TODO(bbe): Migrate callers to the new name and remove these. -#define TLS1_TXT_AES_128_GCM_SHA256 TLS1_3_RFC_AES_128_GCM_SHA256 -#define TLS1_TXT_AES_256_GCM_SHA384 TLS1_3_RFC_AES_256_GCM_SHA384 -#define TLS1_TXT_CHACHA20_POLY1305_SHA256 TLS1_3_RFC_CHACHA20_POLY1305_SHA256 - #define TLS_CT_RSA_SIGN 1 #define TLS_CT_DSS_SIGN 2 #define TLS_CT_RSA_FIXED_DH 3 @@ -532,8 +245,6 @@ extern "C" { #define TLS_CT_RSA_FIXED_ECDH 65 #define TLS_CT_ECDSA_FIXED_ECDH 66 -#define TLS_MD_MAX_CONST_SIZE 20 - #ifdef __cplusplus } // extern C diff --git a/naiveproxy/src/third_party/boringssl/src/include/openssl/x509.h b/naiveproxy/src/third_party/boringssl/src/include/openssl/x509.h index 0cd8716d43..926f365f4d 100644 --- a/naiveproxy/src/third_party/boringssl/src/include/openssl/x509.h +++ b/naiveproxy/src/third_party/boringssl/src/include/openssl/x509.h @@ -87,11 +87,7 @@ OPENSSL_EXPORT STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain); // function works by serializing the structure, so auxiliary properties (see // |i2d_X509_AUX|) are not preserved. Additionally, if |x509| is incomplete, // this function may fail. -// -// TODO(https://crbug.com/boringssl/407): This function should be const and -// thread-safe but is currently neither in some cases, notably if |crl| was -// mutated. -OPENSSL_EXPORT X509 *X509_dup(X509 *x509); +OPENSSL_EXPORT X509 *X509_dup(const X509 *x509); // X509_free decrements |x509|'s reference count and, if zero, releases memory // associated with |x509|. @@ -101,19 +97,25 @@ OPENSSL_EXPORT void X509_free(X509 *x509); // Certificate (RFC 5280), as described in |d2i_SAMPLE|. OPENSSL_EXPORT X509 *d2i_X509(X509 **out, const uint8_t **inp, long len); -// X509_parse_from_buffer parses an X.509 structure from |buf| and returns a +// X509_parse_with_algorithms parses an X.509 structure from |buf| and returns a // fresh X509 or NULL on error. There must not be any trailing data in |buf|. -// The returned structure (if any) holds a reference to |buf| rather than -// copying parts of it as a normal |d2i_X509| call would do. +// The returned structure (if any) increment's |buf|'s reference count and +// retains a reference to it. +// +// Only the |num_algs| algorithms from |algs| will be considered when parsing +// the certificate's public key. If the certificate uses a different algorithm, +// it will still be parsed, but |X509_get0_pubkey| will return NULL. +OPENSSL_EXPORT X509 *X509_parse_with_algorithms(CRYPTO_BUFFER *buf, + const EVP_PKEY_ALG *const *algs, + size_t num_algs); + +// X509_parse_from_buffer behaves like |X509_parse_with_algorithms| but uses a +// default algorithm list. OPENSSL_EXPORT X509 *X509_parse_from_buffer(CRYPTO_BUFFER *buf); // i2d_X509 marshals |x509| as a DER-encoded X.509 Certificate (RFC 5280), as // described in |i2d_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/407): This function should be const and -// thread-safe but is currently neither in some cases, notably if |x509| was -// mutated. -OPENSSL_EXPORT int i2d_X509(X509 *x509, uint8_t **outp); +OPENSSL_EXPORT int i2d_X509(const X509 *x509, uint8_t **outp); // X509_VERSION_* are X.509 version numbers. Note the numerical values of all // defined X.509 versions are one less than the named version. @@ -183,9 +185,9 @@ OPENSSL_EXPORT void X509_get0_uids(const X509 *x509, // EXFLAG_BCONS indicates the certificate has a basic constraints extension. #define EXFLAG_BCONS 0x1 -// EXFLAG_KUSAGE indicates the certifcate has a key usage extension. +// EXFLAG_KUSAGE indicates the certificate has a key usage extension. #define EXFLAG_KUSAGE 0x2 -// EXFLAG_XKUSAGE indicates the certifcate has an extended key usage extension. +// EXFLAG_XKUSAGE indicates the certificate has an extended key usage extension. #define EXFLAG_XKUSAGE 0x4 // EXFLAG_CA indicates the certificate has a basic constraints extension with // the CA bit set. @@ -385,7 +387,7 @@ OPENSSL_EXPORT int X509_get_signature_nid(const X509 *x509); // not reflect modifications made to |x509|. It may be used to manually verify // the signature of an existing certificate. To generate certificates, use // |i2d_re_X509_tbs| instead. -OPENSSL_EXPORT int i2d_X509_tbs(X509 *x509, unsigned char **outp); +OPENSSL_EXPORT int i2d_X509_tbs(const X509 *x509, uint8_t **outp); // X509_verify checks that |x509| has a valid signature by |pkey|. It returns // one if the signature is valid and zero otherwise. Note this function only @@ -428,9 +430,6 @@ OPENSSL_EXPORT void X509_email_free(STACK_OF(OPENSSL_STRING) *sk); // serialized, the current behavior is to compare all unencodable certificates // as equal. This function should only be used with |X509| objects that were // parsed from bytes and never mutated. -// -// TODO(https://crbug.com/boringssl/407): This function is const, but it is not -// always thread-safe, notably if |a| and |b| were mutated. OPENSSL_EXPORT int X509_cmp(const X509 *a, const X509 *b); @@ -472,11 +471,11 @@ OPENSSL_EXPORT ASN1_TIME *X509_getm_notAfter(X509 *x); // X509_set_issuer_name sets |x509|'s issuer to a copy of |name|. It returns one // on success and zero on error. -OPENSSL_EXPORT int X509_set_issuer_name(X509 *x509, X509_NAME *name); +OPENSSL_EXPORT int X509_set_issuer_name(X509 *x509, const X509_NAME *name); // X509_set_subject_name sets |x509|'s subject to a copy of |name|. It returns // one on success and zero on error. -OPENSSL_EXPORT int X509_set_subject_name(X509 *x509, X509_NAME *name); +OPENSSL_EXPORT int X509_set_subject_name(X509 *x509, const X509_NAME *name); // X509_set_pubkey sets |x509|'s public key to |pkey|. It returns one on success // and zero on error. This function does not take ownership of |pkey| and @@ -529,7 +528,13 @@ OPENSSL_EXPORT int X509_sign_ctx(X509 *x509, EVP_MD_CTX *ctx); // This function re-encodes the TBSCertificate and may not reflect |x509|'s // original encoding. It may be used to manually generate a signature for a new // certificate. To verify certificates, use |i2d_X509_tbs| instead. -OPENSSL_EXPORT int i2d_re_X509_tbs(X509 *x509, unsigned char **outp); +// +// Unlike |i2d_X509_tbs|, this function is not |const| and thus may not be to +// use concurrently with other functions that access |x509|. It mutates |x509| +// by dropping the cached encoding. This function is intended to be used during +// certificate construction, where |x509| is still single-threaded and being +// mutated. +OPENSSL_EXPORT int i2d_re_X509_tbs(X509 *x509, uint8_t **outp); // X509_set1_signature_algo sets |x509|'s signature algorithm to |algo| and // returns one on success or zero on error. It updates both the signature field @@ -563,9 +568,7 @@ OPENSSL_EXPORT int X509_set1_signature_value(X509 *x509, const uint8_t *sig, // Unlike similarly-named functions, this function does not output a single // ASN.1 element. Directly embedding the output in a larger ASN.1 structure will // not behave correctly. -// -// TODO(crbug.com/boringssl/407): |x509| should be const. -OPENSSL_EXPORT int i2d_X509_AUX(X509 *x509, uint8_t **outp); +OPENSSL_EXPORT int i2d_X509_AUX(const X509 *x509, uint8_t **outp); // d2i_X509_AUX parses up to |length| bytes from |*inp| as a DER-encoded X.509 // Certificate (RFC 5280), followed optionally by a separate, OpenSSL-specific @@ -674,11 +677,7 @@ OPENSSL_EXPORT int X509_CRL_up_ref(X509_CRL *crl); // X509_CRL_dup returns a newly-allocated copy of |crl|, or NULL on error. This // function works by serializing the structure, so if |crl| is incomplete, it // may fail. -// -// TODO(https://crbug.com/boringssl/407): This function should be const and -// thread-safe but is currently neither in some cases, notably if |crl| was -// mutated. -OPENSSL_EXPORT X509_CRL *X509_CRL_dup(X509_CRL *crl); +OPENSSL_EXPORT X509_CRL *X509_CRL_dup(const X509_CRL *crl); // X509_CRL_free decrements |crl|'s reference count and, if zero, releases // memory associated with |crl|. @@ -691,11 +690,7 @@ OPENSSL_EXPORT X509_CRL *d2i_X509_CRL(X509_CRL **out, const uint8_t **inp, // i2d_X509_CRL marshals |crl| as a X.509 CertificateList (RFC 5280), as // described in |i2d_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/407): This function should be const and -// thread-safe but is currently neither in some cases, notably if |crl| was -// mutated. -OPENSSL_EXPORT int i2d_X509_CRL(X509_CRL *crl, uint8_t **outp); +OPENSSL_EXPORT int i2d_X509_CRL(const X509_CRL *crl, uint8_t **outp); // X509_CRL_match compares |a| and |b| and returns zero if they are equal, a // negative number if |b| sorts after |a| and a negative number if |a| sorts @@ -749,7 +744,7 @@ OPENSSL_EXPORT int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **out, // X509_CRL_get_REVOKED returns the list of revoked certificates in |crl|, or // NULL if |crl| omits it. // -// TOOD(davidben): This function was originally a macro, without clear const +// TODO(davidben): This function was originally a macro, without clear const // semantics. It should take a const input and give const output, but the latter // would break existing callers. For now, we match upstream. OPENSSL_EXPORT STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl); @@ -842,7 +837,8 @@ OPENSSL_EXPORT int X509_CRL_set_version(X509_CRL *crl, long version); // X509_CRL_set_issuer_name sets |crl|'s issuer to a copy of |name|. It returns // one on success and zero on error. -OPENSSL_EXPORT int X509_CRL_set_issuer_name(X509_CRL *crl, X509_NAME *name); +OPENSSL_EXPORT int X509_CRL_set_issuer_name(X509_CRL *crl, + const X509_NAME *name); // X509_CRL_set1_lastUpdate sets |crl|'s thisUpdate time to |tm|. It returns one // on success and zero on error. The OpenSSL API refers to this field as @@ -1067,11 +1063,7 @@ OPENSSL_EXPORT int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, // X509_REQ_dup returns a newly-allocated copy of |req|, or NULL on error. This // function works by serializing the structure, so if |req| is incomplete, it // may fail. -// -// TODO(https://crbug.com/boringssl/407): This function should be const and -// thread-safe but is currently neither in some cases, notably if |req| was -// mutated. -OPENSSL_EXPORT X509_REQ *X509_REQ_dup(X509_REQ *req); +OPENSSL_EXPORT X509_REQ *X509_REQ_dup(const X509_REQ *req); // X509_REQ_free releases memory associated with |req|. OPENSSL_EXPORT void X509_REQ_free(X509_REQ *req); @@ -1083,11 +1075,7 @@ OPENSSL_EXPORT X509_REQ *d2i_X509_REQ(X509_REQ **out, const uint8_t **inp, // i2d_X509_REQ marshals |req| as a CertificateRequest (RFC 2986), as described // in |i2d_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/407): This function should be const and -// thread-safe but is currently neither in some cases, notably if |req| was -// mutated. -OPENSSL_EXPORT int i2d_X509_REQ(X509_REQ *req, uint8_t **outp); +OPENSSL_EXPORT int i2d_X509_REQ(const X509_REQ *req, uint8_t **outp); // X509_REQ_VERSION_1 is the version constant for |X509_REQ| objects. No other // versions are defined. @@ -1351,26 +1339,15 @@ OPENSSL_EXPORT X509_NAME *d2i_X509_NAME(X509_NAME **out, const uint8_t **inp, // i2d_X509_NAME marshals |in| as a DER-encoded X.509 Name (RFC 5280), as // described in |i2d_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/407): This function should be const and -// thread-safe but is currently neither in some cases, notably if |in| was -// mutated. -OPENSSL_EXPORT int i2d_X509_NAME(X509_NAME *in, uint8_t **outp); +OPENSSL_EXPORT int i2d_X509_NAME(const X509_NAME *in, uint8_t **outp); // X509_NAME_dup returns a newly-allocated copy of |name|, or NULL on error. -// -// TODO(https://crbug.com/boringssl/407): This function should be const and -// thread-safe but is currently neither in some cases, notably if |name| was -// mutated. -OPENSSL_EXPORT X509_NAME *X509_NAME_dup(X509_NAME *name); +OPENSSL_EXPORT X509_NAME *X509_NAME_dup(const X509_NAME *name); // X509_NAME_cmp compares |a| and |b|'s canonicalized forms. It returns zero if // they are equal, one if |a| sorts after |b|, -1 if |b| sorts after |a|, and -2 // on error. // -// TODO(https://crbug.com/boringssl/407): This function is const, but it is not -// always thread-safe, notably if |name| was mutated. -// // TODO(https://crbug.com/boringssl/355): The -2 return is very inconvenient to // pass to a sorting function. Can we make this infallible? In the meantime, // prefer to use this function only for equality checks rather than comparisons. @@ -1382,22 +1359,13 @@ OPENSSL_EXPORT int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b); // containing the result. Otherwise, it returns zero. |*out_der| is owned by // |name| and must not be freed by the caller. It is invalidated after |name| is // mutated or freed. -// -// Avoid this function and prefer |i2d_X509_NAME|. It is one of the reasons -// |X509_NAME| functions, including this one, are not consistently thread-safe -// or const-correct. Depending on the resolution of -// https://crbug.com/boringssl/407, this function may be removed or cause poor -// performance. -OPENSSL_EXPORT int X509_NAME_get0_der(X509_NAME *name, const uint8_t **out_der, +OPENSSL_EXPORT int X509_NAME_get0_der(const X509_NAME *name, + const uint8_t **out_der, size_t *out_der_len); // X509_NAME_set makes a copy of |name|. On success, it frees |*xn|, sets |*xn| // to the copy, and returns one. Otherwise, it returns zero. -// -// TODO(https://crbug.com/boringssl/407): This function should be const and -// thread-safe but is currently neither in some cases, notably if |name| was -// mutated. -OPENSSL_EXPORT int X509_NAME_set(X509_NAME **xn, X509_NAME *name); +OPENSSL_EXPORT int X509_NAME_set(X509_NAME **xn, const X509_NAME *name); // X509_NAME_entry_count returns the number of entries in |name|. OPENSSL_EXPORT int X509_NAME_entry_count(const X509_NAME *name); @@ -2092,20 +2060,12 @@ OPENSSL_EXPORT GENERAL_NAME *d2i_GENERAL_NAME(GENERAL_NAME **out, // i2d_GENERAL_NAME marshals |in| as a DER-encoded X.509 GeneralName (RFC 5280), // as described in |i2d_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/407): This function should be const and -// thread-safe but is currently neither in some cases, notably if |in| is an -// directoryName and the |X509_NAME| has been modified. -OPENSSL_EXPORT int i2d_GENERAL_NAME(GENERAL_NAME *in, uint8_t **outp); +OPENSSL_EXPORT int i2d_GENERAL_NAME(const GENERAL_NAME *in, uint8_t **outp); // GENERAL_NAME_dup returns a newly-allocated copy of |gen|, or NULL on error. // This function works by serializing the structure, so it will fail if |gen| is // empty. -// -// TODO(https://crbug.com/boringssl/407): This function should be const and -// thread-safe but is currently neither in some cases, notably if |gen| is an -// directoryName and the |X509_NAME| has been modified. -OPENSSL_EXPORT GENERAL_NAME *GENERAL_NAME_dup(GENERAL_NAME *gen); +OPENSSL_EXPORT GENERAL_NAME *GENERAL_NAME_dup(const GENERAL_NAME *gen); // GENERAL_NAMES_new returns a new, empty |GENERAL_NAMES|, or NULL on error. OPENSSL_EXPORT GENERAL_NAMES *GENERAL_NAMES_new(void); @@ -2120,11 +2080,7 @@ OPENSSL_EXPORT GENERAL_NAMES *d2i_GENERAL_NAMES(GENERAL_NAMES **out, // i2d_GENERAL_NAMES marshals |in| as a DER-encoded SEQUENCE OF GeneralName, as // described in |i2d_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/407): This function should be const and -// thread-safe but is currently neither in some cases, notably if some element -// of |in| is an directoryName and the |X509_NAME| has been modified. -OPENSSL_EXPORT int i2d_GENERAL_NAMES(GENERAL_NAMES *in, uint8_t **outp); +OPENSSL_EXPORT int i2d_GENERAL_NAMES(const GENERAL_NAMES *in, uint8_t **outp); // OTHERNAME_new returns a new, empty |OTHERNAME|, or NULL on error. OPENSSL_EXPORT OTHERNAME *OTHERNAME_new(void); @@ -2163,7 +2119,7 @@ OPENSSL_EXPORT void GENERAL_NAME_set0_value(GENERAL_NAME *gen, int type, // result. // // WARNING: This function is not const-correct. The return value should be -// const. Callers shoudl not mutate the returned object. +// const. Callers should not mutate the returned object. OPENSSL_EXPORT void *GENERAL_NAME_get0_value(const GENERAL_NAME *gen, int *out_type); @@ -2228,10 +2184,8 @@ OPENSSL_EXPORT AUTHORITY_KEYID *d2i_AUTHORITY_KEYID(AUTHORITY_KEYID **out, // i2d_AUTHORITY_KEYID marshals |akid| as a DER-encoded AuthorityKeyIdentifier // (RFC 5280), as described in |i2d_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/407): |akid| is not const because it -// contains an |X509_NAME|. -OPENSSL_EXPORT int i2d_AUTHORITY_KEYID(AUTHORITY_KEYID *akid, uint8_t **outp); +OPENSSL_EXPORT int i2d_AUTHORITY_KEYID(const AUTHORITY_KEYID *akid, + uint8_t **outp); // Name constraints. @@ -2321,10 +2275,7 @@ OPENSSL_EXPORT AUTHORITY_INFO_ACCESS *d2i_AUTHORITY_INFO_ACCESS( // i2d_AUTHORITY_INFO_ACCESS marshals |aia| as a DER-encoded // AuthorityInfoAccessSyntax (RFC 5280), as described in |i2d_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/407): |aia| is not const because it -// contains an |X509_NAME|. -OPENSSL_EXPORT int i2d_AUTHORITY_INFO_ACCESS(AUTHORITY_INFO_ACCESS *aia, +OPENSSL_EXPORT int i2d_AUTHORITY_INFO_ACCESS(const AUTHORITY_INFO_ACCESS *aia, uint8_t **outp); @@ -2396,10 +2347,8 @@ OPENSSL_EXPORT CRL_DIST_POINTS *d2i_CRL_DIST_POINTS(CRL_DIST_POINTS **out, // i2d_CRL_DIST_POINTS marshals |crldp| as a DER-encoded CRLDistributionPoints // (RFC 5280), as described in |i2d_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/407): |crldp| is not const because it -// contains an |X509_NAME|. -OPENSSL_EXPORT int i2d_CRL_DIST_POINTS(CRL_DIST_POINTS *crldp, uint8_t **outp); +OPENSSL_EXPORT int i2d_CRL_DIST_POINTS(const CRL_DIST_POINTS *crldp, + uint8_t **outp); // A ISSUING_DIST_POINT_st, aka |ISSUING_DIST_POINT|, represents a // IssuingDistributionPoint structure (RFC 5280). @@ -2430,10 +2379,7 @@ OPENSSL_EXPORT ISSUING_DIST_POINT *d2i_ISSUING_DIST_POINT( // i2d_ISSUING_DIST_POINT marshals |idp| as a DER-encoded // IssuingDistributionPoint (RFC 5280), as described in |i2d_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/407): |idp| is not const because it -// contains an |X509_NAME|. -OPENSSL_EXPORT int i2d_ISSUING_DIST_POINT(ISSUING_DIST_POINT *idp, +OPENSSL_EXPORT int i2d_ISSUING_DIST_POINT(const ISSUING_DIST_POINT *idp, uint8_t **outp); @@ -2443,7 +2389,7 @@ OPENSSL_EXPORT int i2d_ISSUING_DIST_POINT(ISSUING_DIST_POINT *idp, // suite of related extensions determines the "policies" that apply to a // certificate path. Evaluating these policies is extremely complex and has led // to denial-of-service vulnerabilities in several X.509 implementations. See -// draft-ietf-lamps-x509-policy-graph. +// RFC 9618. // // Do not use this mechanism. @@ -2597,6 +2543,10 @@ OPENSSL_EXPORT X509_ALGOR *X509_ALGOR_new(void); // it may fail. OPENSSL_EXPORT X509_ALGOR *X509_ALGOR_dup(const X509_ALGOR *alg); +// X509_ALGOR_copy sets |dst| to a copy of the contents of |src|. It returns one +// on success and zero on error. +OPENSSL_EXPORT int X509_ALGOR_copy(X509_ALGOR *dst, const X509_ALGOR *src); + // X509_ALGOR_free releases memory associated with |alg|. OPENSSL_EXPORT void X509_ALGOR_free(X509_ALGOR *alg); @@ -2980,9 +2930,9 @@ OPENSSL_EXPORT void X509_STORE_CTX_free(X509_STORE_CTX *ctx); OPENSSL_EXPORT int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509, STACK_OF(X509) *chain); -// X509_verify_cert performs certifice verification with |ctx|, which must have -// been initialized with |X509_STORE_CTX_init|. It returns one on success and -// zero on error. On success, |X509_STORE_CTX_get0_chain| or +// X509_verify_cert performs certificate verification with |ctx|, which must +// have been initialized with |X509_STORE_CTX_init|. It returns one on success +// and zero on error. On success, |X509_STORE_CTX_get0_chain| or // |X509_STORE_CTX_get1_chain| may be used to return the verified certificate // chain. On error, |X509_STORE_CTX_get_error| may be used to return additional // error information. @@ -3095,7 +3045,7 @@ OPENSSL_EXPORT void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int err); OPENSSL_EXPORT const char *X509_verify_cert_error_string(long err); // X509_STORE_CTX_get_error_depth returns the depth at which the error returned -// by |X509_STORE_CTX_get_error| occured. This is zero-indexed integer into the +// by |X509_STORE_CTX_get_error| occurred. This is zero-indexed integer into the // certificate chain. Zero indicates the target certificate, one its issuer, and // so on. OPENSSL_EXPORT int X509_STORE_CTX_get_error_depth(const X509_STORE_CTX *ctx); @@ -3704,11 +3654,7 @@ OPENSSL_EXPORT int X509_load_cert_crl_file(X509_LOOKUP *lookup, // not suitable for general-purpose X.509 name processing. It is very short, so // there will be hash collisions. It also depends on an OpenSSL-specific // canonicalization process. -// -// TODO(https://crbug.com/boringssl/407): This should be const and thread-safe -// but currently is neither, notably if |name| was modified from its parsed -// value. -OPENSSL_EXPORT uint32_t X509_NAME_hash(X509_NAME *name); +OPENSSL_EXPORT uint32_t X509_NAME_hash(const X509_NAME *name); // X509_NAME_hash_old returns a hash of |name|, or zero on error. This is the // legacy hash used by |X509_LOOKUP_add_dir|, which is still supported for @@ -3717,11 +3663,7 @@ OPENSSL_EXPORT uint32_t X509_NAME_hash(X509_NAME *name); // This hash is specific to the |X509_LOOKUP_add_dir| filesystem format and is // not suitable for general-purpose X.509 name processing. It is very short, so // there will be hash collisions. -// -// TODO(https://crbug.com/boringssl/407): This should be const and thread-safe -// but currently is neither, notably if |name| was modified from its parsed -// value. -OPENSSL_EXPORT uint32_t X509_NAME_hash_old(X509_NAME *name); +OPENSSL_EXPORT uint32_t X509_NAME_hash_old(const X509_NAME *name); // X509_STORE_set_default_paths configures |store| to read from some "default" // filesystem paths. It returns one on success and zero on error. The filesystem @@ -4061,40 +4003,40 @@ OPENSSL_EXPORT void X509_SIG_getm(X509_SIG *sig, X509_ALGOR **out_alg, // returns one on success and zero on error. |nmflags| is the flags parameter // for |X509_NAME_print_ex| when printing the subject and issuer. |cflag| should // be some combination of the |X509_FLAG_*| and |X509V3_EXT_*| constants. -OPENSSL_EXPORT int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag, +OPENSSL_EXPORT int X509_print_ex(BIO *bp, const X509 *x, unsigned long nmflag, unsigned long cflag); // X509_print_ex_fp behaves like |X509_print_ex| but writes to |fp|. -OPENSSL_EXPORT int X509_print_ex_fp(FILE *fp, X509 *x, unsigned long nmflag, - unsigned long cflag); +OPENSSL_EXPORT int X509_print_ex_fp(FILE *fp, const X509 *x, + unsigned long nmflag, unsigned long cflag); // X509_print calls |X509_print_ex| with |XN_FLAG_COMPAT| and |X509_FLAG_COMPAT| // flags. -OPENSSL_EXPORT int X509_print(BIO *bp, X509 *x); +OPENSSL_EXPORT int X509_print(BIO *bp, const X509 *x); // X509_print_fp behaves like |X509_print| but writes to |fp|. -OPENSSL_EXPORT int X509_print_fp(FILE *fp, X509 *x); +OPENSSL_EXPORT int X509_print_fp(FILE *fp, const X509 *x); // X509_CRL_print writes a human-readable representation of |x| to |bp|. It // returns one on success and zero on error. -OPENSSL_EXPORT int X509_CRL_print(BIO *bp, X509_CRL *x); +OPENSSL_EXPORT int X509_CRL_print(BIO *bp, const X509_CRL *x); // X509_CRL_print_fp behaves like |X509_CRL_print| but writes to |fp|. -OPENSSL_EXPORT int X509_CRL_print_fp(FILE *fp, X509_CRL *x); +OPENSSL_EXPORT int X509_CRL_print_fp(FILE *fp, const X509_CRL *x); // X509_REQ_print_ex writes a human-readable representation of |x| to |bp|. It // returns one on success and zero on error. |nmflags| is the flags parameter // for |X509_NAME_print_ex|, when printing the subject. |cflag| should be some // combination of the |X509_FLAG_*| and |X509V3_EXT_*| constants. -OPENSSL_EXPORT int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, - unsigned long cflag); +OPENSSL_EXPORT int X509_REQ_print_ex(BIO *bp, const X509_REQ *x, + unsigned long nmflag, unsigned long cflag); // X509_REQ_print calls |X509_REQ_print_ex| with |XN_FLAG_COMPAT| and // |X509_FLAG_COMPAT| flags. -OPENSSL_EXPORT int X509_REQ_print(BIO *bp, X509_REQ *req); +OPENSSL_EXPORT int X509_REQ_print(BIO *bp, const X509_REQ *req); // X509_REQ_print_fp behaves like |X509_REQ_print| but writes to |fp|. -OPENSSL_EXPORT int X509_REQ_print_fp(FILE *fp, X509_REQ *req); +OPENSSL_EXPORT int X509_REQ_print_fp(FILE *fp, const X509_REQ *req); // The following flags are control |X509_NAME_print_ex|. They must not collide // with |ASN1_STRFLGS_*|. @@ -4313,27 +4255,27 @@ OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a); // functions, but write the result to |bp|. They return one on success and zero // on error. Callers using them with memory |BIO|s to encode structures to // memory should use |i2d_*| directly instead. -OPENSSL_EXPORT int i2d_X509_bio(BIO *bp, X509 *x509); -OPENSSL_EXPORT int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl); -OPENSSL_EXPORT int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req); -OPENSSL_EXPORT int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa); -OPENSSL_EXPORT int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa); -OPENSSL_EXPORT int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa); -OPENSSL_EXPORT int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa); -OPENSSL_EXPORT int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa); -OPENSSL_EXPORT int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey); -OPENSSL_EXPORT int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey); -OPENSSL_EXPORT int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8); -OPENSSL_EXPORT int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, - PKCS8_PRIV_KEY_INFO *p8inf); -OPENSSL_EXPORT int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey); -OPENSSL_EXPORT int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey); +OPENSSL_EXPORT int i2d_X509_bio(BIO *bp, const X509 *x509); +OPENSSL_EXPORT int i2d_X509_CRL_bio(BIO *bp, const X509_CRL *crl); +OPENSSL_EXPORT int i2d_X509_REQ_bio(BIO *bp, const X509_REQ *req); +OPENSSL_EXPORT int i2d_RSAPrivateKey_bio(BIO *bp, const RSA *rsa); +OPENSSL_EXPORT int i2d_RSAPublicKey_bio(BIO *bp, const RSA *rsa); +OPENSSL_EXPORT int i2d_RSA_PUBKEY_bio(BIO *bp, const RSA *rsa); +OPENSSL_EXPORT int i2d_DSA_PUBKEY_bio(BIO *bp, const DSA *dsa); +OPENSSL_EXPORT int i2d_DSAPrivateKey_bio(BIO *bp, const DSA *dsa); +OPENSSL_EXPORT int i2d_EC_PUBKEY_bio(BIO *bp, const EC_KEY *eckey); +OPENSSL_EXPORT int i2d_ECPrivateKey_bio(BIO *bp, const EC_KEY *eckey); +OPENSSL_EXPORT int i2d_PKCS8_bio(BIO *bp, const X509_SIG *p8); +OPENSSL_EXPORT int i2d_PKCS8_PRIV_KEY_INFO_bio( + BIO *bp, const PKCS8_PRIV_KEY_INFO *p8inf); +OPENSSL_EXPORT int i2d_PrivateKey_bio(BIO *bp, const EVP_PKEY *pkey); +OPENSSL_EXPORT int i2d_PUBKEY_bio(BIO *bp, const EVP_PKEY *pkey); OPENSSL_EXPORT int i2d_DHparams_bio(BIO *bp, const DH *dh); // i2d_PKCS8PrivateKeyInfo_bio encodes |key| as a PKCS#8 PrivateKeyInfo // structure (see |EVP_marshal_private_key|) and writes the result to |bp|. It // returns one on success and zero on error. -OPENSSL_EXPORT int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key); +OPENSSL_EXPORT int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, const EVP_PKEY *key); // The following functions behave like the corresponding |d2i_*_bio| functions, // but read from |fp| instead. @@ -4355,34 +4297,34 @@ OPENSSL_EXPORT EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a); // The following functions behave like the corresponding |i2d_*_bio| functions, // but write to |fp| instead. -OPENSSL_EXPORT int i2d_X509_fp(FILE *fp, X509 *x509); -OPENSSL_EXPORT int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl); -OPENSSL_EXPORT int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req); -OPENSSL_EXPORT int i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa); -OPENSSL_EXPORT int i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa); -OPENSSL_EXPORT int i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa); -OPENSSL_EXPORT int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa); -OPENSSL_EXPORT int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa); -OPENSSL_EXPORT int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey); -OPENSSL_EXPORT int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey); -OPENSSL_EXPORT int i2d_PKCS8_fp(FILE *fp, X509_SIG *p8); +OPENSSL_EXPORT int i2d_X509_fp(FILE *fp, const X509 *x509); +OPENSSL_EXPORT int i2d_X509_CRL_fp(FILE *fp, const X509_CRL *crl); +OPENSSL_EXPORT int i2d_X509_REQ_fp(FILE *fp, const X509_REQ *req); +OPENSSL_EXPORT int i2d_RSAPrivateKey_fp(FILE *fp, const RSA *rsa); +OPENSSL_EXPORT int i2d_RSAPublicKey_fp(FILE *fp, const RSA *rsa); +OPENSSL_EXPORT int i2d_RSA_PUBKEY_fp(FILE *fp, const RSA *rsa); +OPENSSL_EXPORT int i2d_DSA_PUBKEY_fp(FILE *fp, const DSA *dsa); +OPENSSL_EXPORT int i2d_DSAPrivateKey_fp(FILE *fp, const DSA *dsa); +OPENSSL_EXPORT int i2d_EC_PUBKEY_fp(FILE *fp, const EC_KEY *eckey); +OPENSSL_EXPORT int i2d_ECPrivateKey_fp(FILE *fp, const EC_KEY *eckey); +OPENSSL_EXPORT int i2d_PKCS8_fp(FILE *fp, const X509_SIG *p8); OPENSSL_EXPORT int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, - PKCS8_PRIV_KEY_INFO *p8inf); -OPENSSL_EXPORT int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key); -OPENSSL_EXPORT int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey); -OPENSSL_EXPORT int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey); + const PKCS8_PRIV_KEY_INFO *p8inf); +OPENSSL_EXPORT int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, const EVP_PKEY *key); +OPENSSL_EXPORT int i2d_PrivateKey_fp(FILE *fp, const EVP_PKEY *pkey); +OPENSSL_EXPORT int i2d_PUBKEY_fp(FILE *fp, const EVP_PKEY *pkey); // X509_find_by_issuer_and_serial returns the first |X509| in |sk| whose issuer // and serial are |name| and |serial|, respectively. If no match is found, it // returns NULL. OPENSSL_EXPORT X509 *X509_find_by_issuer_and_serial(const STACK_OF(X509) *sk, - X509_NAME *name, + const X509_NAME *name, const ASN1_INTEGER *serial); // X509_find_by_subject returns the first |X509| in |sk| whose subject is // |name|. If no match is found, it returns NULL. OPENSSL_EXPORT X509 *X509_find_by_subject(const STACK_OF(X509) *sk, - X509_NAME *name); + const X509_NAME *name); // X509_cmp_time compares |s| against |*t|. On success, it returns a negative // number if |s| <= |*t| and a positive number if |s| > |*t|. On error, it @@ -4439,7 +4381,7 @@ OPENSSL_EXPORT int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b); // not suitable for general-purpose X.509 name processing. It is very short, so // there will be hash collisions. It also depends on an OpenSSL-specific // canonicalization process. -OPENSSL_EXPORT uint32_t X509_issuer_name_hash(X509 *x509); +OPENSSL_EXPORT uint32_t X509_issuer_name_hash(const X509 *x509); // X509_subject_name_hash returns the hash of |x509|'s subject name with // |X509_NAME_hash|. @@ -4448,7 +4390,7 @@ OPENSSL_EXPORT uint32_t X509_issuer_name_hash(X509 *x509); // not suitable for general-purpose X.509 name processing. It is very short, so // there will be hash collisions. It also depends on an OpenSSL-specific // canonicalization process. -OPENSSL_EXPORT uint32_t X509_subject_name_hash(X509 *x509); +OPENSSL_EXPORT uint32_t X509_subject_name_hash(const X509 *x509); // X509_issuer_name_hash_old returns the hash of |x509|'s issuer name with // |X509_NAME_hash_old|. @@ -4456,7 +4398,7 @@ OPENSSL_EXPORT uint32_t X509_subject_name_hash(X509 *x509); // This hash is specific to the |X509_LOOKUP_add_dir| filesystem format and is // not suitable for general-purpose X.509 name processing. It is very short, so // there will be hash collisions. -OPENSSL_EXPORT uint32_t X509_issuer_name_hash_old(X509 *x509); +OPENSSL_EXPORT uint32_t X509_issuer_name_hash_old(const X509 *x509); // X509_subject_name_hash_old returns the hash of |x509|'s usjbect name with // |X509_NAME_hash_old|. @@ -4464,7 +4406,7 @@ OPENSSL_EXPORT uint32_t X509_issuer_name_hash_old(X509 *x509); // This hash is specific to the |X509_LOOKUP_add_dir| filesystem format and is // not suitable for general-purpose X.509 name processing. It is very short, so // there will be hash collisions. -OPENSSL_EXPORT uint32_t X509_subject_name_hash_old(X509 *x509); +OPENSSL_EXPORT uint32_t X509_subject_name_hash_old(const X509 *x509); // ex_data functions. @@ -4535,6 +4477,9 @@ OPENSSL_EXPORT int ASN1_item_verify(const ASN1_ITEM *it, // |md|, or |pkey|'s default if NULL. Other signing parameters use |pkey|'s // defaults. To customize them, use |ASN1_item_sign_ctx|. // +// |algor1| and |algor2| may point into part of |asn| and will be updated before +// |asn| is serialized. +// // WARNING: |data| must be a pointer with the same type as |it|'s corresponding // C type. Using the wrong type is a potentially exploitable memory error. OPENSSL_EXPORT int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, @@ -4550,6 +4495,9 @@ OPENSSL_EXPORT int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, // On success or failure, this function mutates |ctx| and resets it to the empty // state. Caller should not rely on its contents after the function returns. // +// |algor1| and |algor2| may point into part of |asn| and will be updated before +// |asn| is serialized. +// // WARNING: |data| must be a pointer with the same type as |it|'s corresponding // C type. Using the wrong type is a potentially exploitable memory error. OPENSSL_EXPORT int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, @@ -4581,9 +4529,7 @@ OPENSSL_EXPORT int X509_supported_extension(const X509_EXTENSION *ex); // // This function returning one does not indicate that |x509| is trusted, only // that it is eligible to be a CA. -// -// TODO(crbug.com/boringssl/407): |x509| should be const. -OPENSSL_EXPORT int X509_check_ca(X509 *x509); +OPENSSL_EXPORT int X509_check_ca(const X509 *x509); // X509_check_issued checks if |issuer| and |subject|'s name, authority key // identifier, and key usage fields allow |issuer| to have issued |subject|. It @@ -4592,15 +4538,12 @@ OPENSSL_EXPORT int X509_check_ca(X509 *x509); // This function does not check the signature on |subject|. Rather, it is // intended to prune the set of possible issuer certificates during // path-building. -// -// TODO(crbug.com/boringssl/407): Both parameters should be const. -OPENSSL_EXPORT int X509_check_issued(X509 *issuer, X509 *subject); +OPENSSL_EXPORT int X509_check_issued(const X509 *issuer, const X509 *subject); // NAME_CONSTRAINTS_check checks if |x509| satisfies name constraints in |nc|. // It returns |X509_V_OK| on success and some |X509_V_ERR_*| constant on error. -// -// TODO(crbug.com/boringssl/407): Both parameters should be const. -OPENSSL_EXPORT int NAME_CONSTRAINTS_check(X509 *x509, NAME_CONSTRAINTS *nc); +OPENSSL_EXPORT int NAME_CONSTRAINTS_check(const X509 *x509, + const NAME_CONSTRAINTS *nc); // X509_check_host checks if |x509| matches the DNS name |chk|. It returns one // on match, zero on mismatch, or a negative number on error. |flags| should be @@ -4678,10 +4621,9 @@ OPENSSL_EXPORT int X509_check_ip_asc(const X509 *x509, const char *ipasc, // // This function only searches for trusted issuers. It does not consider // untrusted intermediates passed in to |X509_STORE_CTX_init|. -// -// TODO(crbug.com/boringssl/407): |x509| should be const. OPENSSL_EXPORT int X509_STORE_CTX_get1_issuer(X509 **out_issuer, - X509_STORE_CTX *ctx, X509 *x509); + X509_STORE_CTX *ctx, + const X509 *x509); // X509_check_purpose performs checks if |x509|'s basic constraints, key usage, // and extended key usage extensions for the specified purpose. |purpose| should @@ -4712,25 +4654,21 @@ OPENSSL_EXPORT int X509_check_trust(X509 *x509, int id, int flags); // trusted certificates in |ctx|'s |X509_STORE| whose subject matches |name|, or // NULL on error. The caller must release the result with |sk_X509_pop_free| and // |X509_free| when done. -// -// TODO(crbug.com/boringssl/407): |name| should be const. OPENSSL_EXPORT STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *ctx, - X509_NAME *name); + const X509_NAME *name); // X509_STORE_CTX_get1_crls returns a newly-allocated stack containing all // CRLs in |ctx|'s |X509_STORE| whose subject matches |name|, or NULL on error. // The caller must release the result with |sk_X509_CRL_pop_free| and // |X509_CRL_free| when done. -// -// TODO(crbug.com/boringssl/407): |name| should be const. -OPENSSL_EXPORT STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls(X509_STORE_CTX *ctx, - X509_NAME *name); +OPENSSL_EXPORT STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls( + X509_STORE_CTX *ctx, const X509_NAME *name); // X509_STORE_CTX_get_by_subject looks up an object of type |type| in |ctx|'s // |X509_STORE| that matches |name|. |type| should be one of the |X509_LU_*| // constants to indicate the type of object. If a match was found, it stores the // result in |ret| and returns one. Otherwise, it returns zero. If multiple -// objects match, this function outputs an arbitray one. +// objects match, this function outputs an arbitrary one. // // WARNING: |ret| must be in the empty state, as returned by |X509_OBJECT_new|. // Otherwise, the object currently in |ret| will be leaked when overwritten. @@ -4739,10 +4677,8 @@ OPENSSL_EXPORT STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls(X509_STORE_CTX *ctx, // WARNING: Multiple trusted certificates or CRLs may share a name. In this // case, this function returns an arbitrary match. Use // |X509_STORE_CTX_get1_certs| or |X509_STORE_CTX_get1_crls| instead. -// -// TODO(crbug.com/boringssl/407): |name| should be const. OPENSSL_EXPORT int X509_STORE_CTX_get_by_subject(X509_STORE_CTX *ctx, int type, - X509_NAME *name, + const X509_NAME *name, X509_OBJECT *ret); @@ -5013,7 +4949,7 @@ OPENSSL_EXPORT int X509V3_EXT_CRL_add_nconf(const CONF *conf, OPENSSL_EXPORT char *i2s_ASN1_OCTET_STRING(const X509V3_EXT_METHOD *method, const ASN1_OCTET_STRING *oct); -// s2i_ASN1_OCTET_STRING decodes |str| as a hexdecimal byte string, with +// s2i_ASN1_OCTET_STRING decodes |str| as a hexadecimal byte string, with // optional colon separators between bytes. It returns a newly-allocated // |ASN1_OCTET_STRING| with the result on success, or NULL on error. |method| // and |ctx| are ignored. diff --git a/naiveproxy/src/third_party/boringssl/src/infra/config/generated/cr-buildbucket.cfg b/naiveproxy/src/third_party/boringssl/src/infra/config/generated/cr-buildbucket.cfg index 49462acf41..7513a835c2 100644 --- a/naiveproxy/src/third_party/boringssl/src/infra/config/generated/cr-buildbucket.cfg +++ b/naiveproxy/src/third_party/boringssl/src/infra/config/generated/cr-buildbucket.cfg @@ -15,23 +15,14 @@ buckets { swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -42,35 +33,20 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_aarch64_fips" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\",\"BUILD_SHARED_LIBS\":\"1\",\"FIPS\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "BUILD_SHARED_LIBS": "1",' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -81,36 +57,20 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_aarch64_fips_noasm" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\",\"BUILD_SHARED_LIBS\":\"1\",\"FIPS\":\"1\",\"OPENSSL_NO_ASM\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "BUILD_SHARED_LIBS": "1",' - ' "FIPS": "1",' - ' "OPENSSL_NO_ASM": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -121,34 +81,20 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_aarch64_fips_static" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\",\"FIPS\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -159,34 +105,20 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_aarch64_rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\",\"CMAKE_BUILD_TYPE\":\"Release\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -197,33 +129,20 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_arm" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"armeabi-v7a\",\"ANDROID_PLATFORM\":\"android-21\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "armeabi-v7a",' - ' "ANDROID_PLATFORM": "android-18"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -234,35 +153,20 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_arm_armmode_rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"armeabi-v7a\",\"ANDROID_ARM_MODE\":\"arm\",\"ANDROID_PLATFORM\":\"android-21\",\"CMAKE_BUILD_TYPE\":\"Release\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "armeabi-v7a",' - ' "ANDROID_ARM_MODE": "arm",' - ' "ANDROID_PLATFORM": "android-18",' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -273,35 +177,20 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_arm_fips" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"armeabi-v7a\",\"ANDROID_PLATFORM\":\"android-21\",\"BUILD_SHARED_LIBS\":\"1\",\"FIPS\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "armeabi-v7a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "BUILD_SHARED_LIBS": "1",' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -312,36 +201,20 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_arm_rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"armeabi-v7a\",\"ANDROID_PLATFORM\":\"android-21\",\"CMAKE_BUILD_TYPE\":\"Release\",\"CMAKE_CXX_FLAGS\":\"-DOPENSSL_NO_STATIC_NEON_FOR_TESTING=1\",\"CMAKE_C_FLAGS\":\"-DOPENSSL_NO_STATIC_NEON_FOR_TESTING=1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "armeabi-v7a",' - ' "ANDROID_PLATFORM": "android-18",' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "CMAKE_CXX_FLAGS": "-DOPENSSL_NO_STATIC_NEON_FOR_TESTING=1",' - ' "CMAKE_C_FLAGS": "-DOPENSSL_NO_STATIC_NEON_FOR_TESTING=1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -352,10 +225,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_riscv64_compile_only" @@ -363,29 +232,16 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"riscv64\",\"ANDROID_PLATFORM\":\"android-35\",\"CMAKE_BUILD_TYPE\":\"Release\"}" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "riscv64",' - ' "ANDROID_PLATFORM": "android-35",' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "gclient_vars": {' - ' "android_ndk_revision": "wC8sJjVPRDPTbaZFlki_qXTC1lWJNbJi8glUO0woJ1MC"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -396,10 +252,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "docs" @@ -407,18 +259,12 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl_docs" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "recipe": "boringssl_docs"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -429,35 +275,22 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "ios64_compile" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-12|Mac-13" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_OSX_ARCHITECTURES\":\"arm64\",\"CMAKE_OSX_SYSROOT\":\"iphoneos\"}" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_OSX_ARCHITECTURES": "arm64",' - ' "CMAKE_OSX_SYSROOT": "iphoneos"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -472,10 +305,6 @@ buckets { path: "osx_sdk" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux" @@ -483,24 +312,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "check_stack:true" + properties_j: "cmake_args:{\"BORINGSSL_ALLOW_CXX_RUNTIME\":\"1\",\"RUST_BINDINGS\":\"x86_64-unknown-linux-gnu\"}" + properties_j: "rust:true" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "check_stack": true,' - ' "cmake_args": {' - ' "BORINGSSL_ALLOW_CXX_RUNTIME": "1",' - ' "RUST_BINDINGS": "x86_64-unknown-linux-gnu"' - ' },' - ' "recipe": "boringssl",' - ' "rust": true' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -511,10 +331,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux32" @@ -522,28 +338,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "check_stack:true" + properties_j: "cmake_args:{\"CMAKE_ASM_FLAGS\":\"-m32 -msse2\",\"CMAKE_CXX_FLAGS\":\"-m32 -msse2\",\"CMAKE_C_FLAGS\":\"-m32 -msse2\",\"CMAKE_SYSTEM_NAME\":\"Linux\",\"CMAKE_SYSTEM_PROCESSOR\":\"x86\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "check_stack": true,' - ' "cmake_args": {' - ' "CMAKE_ASM_FLAGS": "-m32 -msse2",' - ' "CMAKE_CXX_FLAGS": "-m32 -msse2",' - ' "CMAKE_C_FLAGS": "-m32 -msse2",' - ' "CMAKE_SYSTEM_NAME": "Linux",' - ' "CMAKE_SYSTEM_PROCESSOR": "x86",' - ' "RUST_BINDINGS": "i686-unknown-linux-gnu"' - ' },' - ' "recipe": "boringssl",' - ' "rust": true' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -554,10 +356,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux32_nosse2_noasm" @@ -565,27 +363,13 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_ASM_FLAGS\":\"-m32 -msse2\",\"CMAKE_CXX_FLAGS\":\"-m32 -msse2\",\"CMAKE_C_FLAGS\":\"-m32 -msse2\",\"CMAKE_SYSTEM_NAME\":\"Linux\",\"CMAKE_SYSTEM_PROCESSOR\":\"x86\",\"OPENSSL_NO_ASM\":\"1\",\"OPENSSL_NO_SSE2_FOR_TESTING\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_ASM_FLAGS": "-m32 -msse2",' - ' "CMAKE_CXX_FLAGS": "-m32 -msse2",' - ' "CMAKE_C_FLAGS": "-m32 -msse2",' - ' "CMAKE_SYSTEM_NAME": "Linux",' - ' "CMAKE_SYSTEM_PROCESSOR": "x86",' - ' "OPENSSL_NO_ASM": "1",' - ' "OPENSSL_NO_SSE2_FOR_TESTING": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -596,10 +380,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux32_rel" @@ -607,26 +387,13 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_ASM_FLAGS\":\"-m32 -msse2\",\"CMAKE_BUILD_TYPE\":\"Release\",\"CMAKE_CXX_FLAGS\":\"-m32 -msse2\",\"CMAKE_C_FLAGS\":\"-m32 -msse2\",\"CMAKE_SYSTEM_NAME\":\"Linux\",\"CMAKE_SYSTEM_PROCESSOR\":\"x86\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_ASM_FLAGS": "-m32 -msse2",' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "CMAKE_CXX_FLAGS": "-m32 -msse2",' - ' "CMAKE_C_FLAGS": "-m32 -msse2",' - ' "CMAKE_SYSTEM_NAME": "Linux",' - ' "CMAKE_SYSTEM_PROCESSOR": "x86"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -637,10 +404,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux32_sde" @@ -648,28 +411,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_ASM_FLAGS\":\"-m32 -msse2\",\"CMAKE_BUILD_TYPE\":\"RelWithAsserts\",\"CMAKE_CXX_FLAGS\":\"-m32 -msse2\",\"CMAKE_C_FLAGS\":\"-m32 -msse2\",\"CMAKE_SYSTEM_NAME\":\"Linux\",\"CMAKE_SYSTEM_PROCESSOR\":\"x86\"}" + properties_j: "run_ssl_tests:false" + properties_j: "sde:true" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_ASM_FLAGS": "-m32 -msse2",' - ' "CMAKE_BUILD_TYPE": "RelWithAsserts",' - ' "CMAKE_CXX_FLAGS": "-m32 -msse2",' - ' "CMAKE_C_FLAGS": "-m32 -msse2",' - ' "CMAKE_SYSTEM_NAME": "Linux",' - ' "CMAKE_SYSTEM_PROCESSOR": "x86"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "sde": true' - '}' execution_timeout_secs: 10800 caches { name: "gocache" @@ -680,10 +430,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_bazel" @@ -691,18 +437,12 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl_bazel" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "recipe": "boringssl_bazel"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -713,10 +453,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_clang_cfi" @@ -724,22 +460,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CFI\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "clang": true,' - ' "cmake_args": {' - ' "CFI": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -750,10 +478,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_clang_rel" @@ -761,22 +485,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -787,10 +503,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_clang_rel_msan" @@ -798,27 +510,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\",\"MSAN\":\"1\",\"USE_CUSTOM_LIBCXX\":\"1\"}" + properties_j: "gclient_vars:{\"checkout_libcxx\":true}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "MSAN": "1",' - ' "USE_CUSTOM_LIBCXX": "1"' - ' },' - ' "gclient_vars": {' - ' "checkout_libcxx": true' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -829,10 +529,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_clang_rel_tsan" @@ -840,28 +536,16 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\",\"TSAN\":\"1\",\"USE_CUSTOM_LIBCXX\":\"1\"}" + properties_j: "gclient_vars:{\"checkout_libcxx\":true}" + properties_j: "run_ssl_tests:false" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "TSAN": "1",' - ' "USE_CUSTOM_LIBCXX": "1"' - ' },' - ' "gclient_vars": {' - ' "checkout_libcxx": true' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -872,10 +556,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_clang_ubsan" @@ -883,23 +563,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"RelWithAsserts\",\"UBSAN\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "RelWithAsserts",' - ' "UBSAN": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -910,10 +581,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_fips" @@ -921,21 +588,13 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"FIPS\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -946,10 +605,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_fips_clang" @@ -957,22 +612,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "clang:true" + properties_j: "cmake_args:{\"FIPS\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "clang": true,' - ' "cmake_args": {' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -983,10 +630,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_fips_clang_rel" @@ -994,23 +637,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\",\"FIPS\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1021,10 +655,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_fips_noasm_asan" @@ -1032,24 +662,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "clang:true" + properties_j: "cmake_args:{\"ASAN\":\"1\",\"FIPS\":\"1\",\"OPENSSL_NO_ASM\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "clang": true,' - ' "cmake_args": {' - ' "ASAN": "1",' - ' "FIPS": "1",' - ' "OPENSSL_NO_ASM": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1060,10 +680,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_fips_rel" @@ -1071,22 +687,13 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\",\"FIPS\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1097,10 +704,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_fuzz" @@ -1108,26 +711,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "clang:true" + properties_j: "cmake_args:{\"FUZZ\":\"1\",\"LIBFUZZER_FROM_DEPS\":\"1\"}" + properties_j: "gclient_vars:{\"checkout_fuzzer\":true}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "clang": true,' - ' "cmake_args": {' - ' "FUZZ": "1",' - ' "LIBFUZZER_FROM_DEPS": "1"' - ' },' - ' "gclient_vars": {' - ' "checkout_fuzzer": true' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1138,10 +730,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_noasm_asan" @@ -1149,23 +737,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "clang:true" + properties_j: "cmake_args:{\"ASAN\":\"1\",\"OPENSSL_NO_ASM\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "clang": true,' - ' "cmake_args": {' - ' "ASAN": "1",' - ' "OPENSSL_NO_ASM": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1176,10 +755,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_nosse2_noasm" @@ -1187,22 +762,13 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"OPENSSL_NO_ASM\":\"1\",\"OPENSSL_NO_SSE2_FOR_TESTING\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "OPENSSL_NO_ASM": "1",' - ' "OPENSSL_NO_SSE2_FOR_TESTING": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1213,10 +779,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_nothreads" @@ -1224,22 +786,13 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_CXX_FLAGS\":\"-DOPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED=1\",\"CMAKE_C_FLAGS\":\"-DOPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED=1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_CXX_FLAGS": "-DOPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED=1",' - ' "CMAKE_C_FLAGS": "-DOPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED=1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1250,10 +803,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_rel" @@ -1261,21 +810,13 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1286,10 +827,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_sde" @@ -1297,23 +834,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"RelWithAsserts\"}" + properties_j: "run_ssl_tests:false" + properties_j: "sde:true" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "RelWithAsserts"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "sde": true' - '}' execution_timeout_secs: 10800 caches { name: "gocache" @@ -1324,10 +853,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_shared" @@ -1335,22 +860,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "check_imported_libraries:true" + properties_j: "cmake_args:{\"BUILD_SHARED_LIBS\":\"1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "check_imported_libraries": true,' - ' "cmake_args": {' - ' "BUILD_SHARED_LIBS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1361,10 +878,6 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_small" @@ -1372,22 +885,13 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_CXX_FLAGS\":\"-DOPENSSL_SMALL=1\",\"CMAKE_C_FLAGS\":\"-DOPENSSL_SMALL=1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_CXX_FLAGS": "-DOPENSSL_SMALL=1",' - ' "CMAKE_C_FLAGS": "-DOPENSSL_SMALL=1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1398,33 +902,21 @@ buckets { path: "gopath" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "mac" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-12|Mac-13" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"RUST_BINDINGS\":\"x86_64-apple-darwin\"}" + properties_j: "rust:true" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "RUST_BINDINGS": "x86_64-apple-darwin"' - ' },' - ' "recipe": "boringssl",' - ' "rust": true' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -1439,10 +931,6 @@ buckets { path: "osx_sdk" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "mac_arm64" @@ -1450,22 +938,14 @@ buckets { dimensions: "cpu:arm64" dimensions: "os:Mac" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"RUST_BINDINGS\":\"aarch64-apple-darwin\"}" + properties_j: "rust:true" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "RUST_BINDINGS": "aarch64-apple-darwin"' - ' },' - ' "recipe": "boringssl",' - ' "rust": true' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -1480,10 +960,6 @@ buckets { path: "osx_sdk" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "mac_arm64_bazel" @@ -1491,18 +967,12 @@ buckets { dimensions: "cpu:arm64" dimensions: "os:Mac" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl_bazel" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "recipe": "boringssl_bazel"' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -1517,32 +987,20 @@ buckets { path: "osx_sdk" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "mac_rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-12|Mac-13" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -1557,33 +1015,20 @@ buckets { path: "osx_sdk" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "mac_small" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-12|Mac-13" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_CXX_FLAGS\":\"-DOPENSSL_SMALL=1\",\"CMAKE_C_FLAGS\":\"-DOPENSSL_SMALL=1\"}" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_CXX_FLAGS": "-DOPENSSL_SMALL=1",' - ' "CMAKE_C_FLAGS": "-DOPENSSL_SMALL=1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 caches { name: "gocache" @@ -1598,10 +1043,6 @@ buckets { path: "osx_sdk" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win32" @@ -1609,19 +1050,13 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "msvc_target:\"x86\"" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "msvc_target": "x86",' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1636,10 +1071,6 @@ buckets { path: "win_toolchain" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win32_clang" @@ -1647,27 +1078,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_ASM_FLAGS\":\"-m32 -msse2\",\"CMAKE_CXX_FLAGS\":\"-m32 -msse2\",\"CMAKE_C_FLAGS\":\"-m32 -msse2\",\"CMAKE_SYSTEM_NAME\":\"Windows\",\"CMAKE_SYSTEM_PROCESSOR\":\"x86\"}" + properties_j: "msvc_target:\"x86\"" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_ASM_FLAGS": "-m32 -msse2",' - ' "CMAKE_CXX_FLAGS": "-m32 -msse2",' - ' "CMAKE_C_FLAGS": "-m32 -msse2",' - ' "CMAKE_SYSTEM_NAME": "Windows",' - ' "CMAKE_SYSTEM_PROCESSOR": "x86"' - ' },' - ' "msvc_target": "x86",' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1682,10 +1101,6 @@ buckets { path: "win_toolchain" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win32_rel" @@ -1693,22 +1108,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\"}" + properties_j: "msvc_target:\"x86\"" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "msvc_target": "x86",' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1723,10 +1130,6 @@ buckets { path: "win_toolchain" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win32_sde" @@ -1734,24 +1137,16 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"RelWithAsserts\"}" + properties_j: "msvc_target:\"x86\"" + properties_j: "run_ssl_tests:false" + properties_j: "sde:true" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "RelWithAsserts"' - ' },' - ' "msvc_target": "x86",' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "sde": true' - '}' execution_timeout_secs: 10800 caches { name: "gocache" @@ -1766,10 +1161,6 @@ buckets { path: "win_toolchain" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win32_small" @@ -1777,23 +1168,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_CXX_FLAGS\":\"-DOPENSSL_SMALL=1\",\"CMAKE_C_FLAGS\":\"-DOPENSSL_SMALL=1\"}" + properties_j: "msvc_target:\"x86\"" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_CXX_FLAGS": "-DOPENSSL_SMALL=1",' - ' "CMAKE_C_FLAGS": "-DOPENSSL_SMALL=1"' - ' },' - ' "msvc_target": "x86",' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1808,10 +1190,6 @@ buckets { path: "win_toolchain" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win64" @@ -1819,19 +1197,13 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "msvc_target:\"x64\"" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "msvc_target": "x64",' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1846,10 +1218,6 @@ buckets { path: "win_toolchain" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win64_clang" @@ -1857,20 +1225,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "clang:true" + properties_j: "msvc_target:\"x64\"" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "clang": true,' - ' "msvc_target": "x64",' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1885,10 +1247,6 @@ buckets { path: "win_toolchain" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win64_rel" @@ -1896,24 +1254,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\",\"RUST_BINDINGS\":\"x86_64-pc-windows-msvc\"}" + properties_j: "msvc_target:\"x64\"" + properties_j: "rust:true" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "RUST_BINDINGS": "x86_64-pc-windows-msvc"' - ' },' - ' "msvc_target": "x64",' - ' "recipe": "boringssl",' - ' "rust": true' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -1928,10 +1277,6 @@ buckets { path: "win_toolchain" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win64_sde" @@ -1939,24 +1284,16 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"RelWithAsserts\"}" + properties_j: "msvc_target:\"x64\"" + properties_j: "run_ssl_tests:false" + properties_j: "sde:true" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "RelWithAsserts"' - ' },' - ' "msvc_target": "x64",' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "sde": true' - '}' execution_timeout_secs: 10800 caches { name: "gocache" @@ -1971,10 +1308,6 @@ buckets { path: "win_toolchain" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win64_small" @@ -1982,23 +1315,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_CXX_FLAGS\":\"-DOPENSSL_SMALL=1\",\"CMAKE_C_FLAGS\":\"-DOPENSSL_SMALL=1\"}" + properties_j: "msvc_target:\"x64\"" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_CXX_FLAGS": "-DOPENSSL_SMALL=1",' - ' "CMAKE_C_FLAGS": "-DOPENSSL_SMALL=1"' - ' },' - ' "msvc_target": "x64",' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -2013,10 +1337,6 @@ buckets { path: "win_toolchain" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win_arm64_compile" @@ -2024,32 +1344,18 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_ASM_FLAGS\":\"--target=arm64-windows\",\"CMAKE_CXX_FLAGS\":\"--target=arm64-windows\",\"CMAKE_C_FLAGS\":\"--target=arm64-windows\",\"CMAKE_SYSTEM_NAME\":\"Windows\",\"CMAKE_SYSTEM_PROCESSOR\":\"arm64\"}" + properties_j: "gclient_vars:{\"checkout_nasm\":false}" + properties_j: "msvc_target:\"arm64\"" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_ASM_FLAGS": "--target=arm64-windows",' - ' "CMAKE_CXX_FLAGS": "--target=arm64-windows",' - ' "CMAKE_C_FLAGS": "--target=arm64-windows",' - ' "CMAKE_SYSTEM_NAME": "Windows",' - ' "CMAKE_SYSTEM_PROCESSOR": "arm64"' - ' },' - ' "gclient_vars": {' - ' "checkout_nasm": false' - ' },' - ' "msvc_target": "arm64",' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -2064,10 +1370,6 @@ buckets { path: "win_toolchain" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win_arm64_msvc_compile" @@ -2075,29 +1377,17 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.ci" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "$gatekeeper:{\"group\":\"client.boringssl\"}" + properties_j: "cmake_args:{\"CMAKE_SYSTEM_NAME\":\"Windows\",\"CMAKE_SYSTEM_PROCESSOR\":\"arm64\",\"OPENSSL_NO_ASM\":\"1\"}" + properties_j: "gclient_vars:{\"checkout_nasm\":false}" + properties_j: "msvc_target:\"arm64\"" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "$gatekeeper": {' - ' "group": "client.boringssl"' - ' },' - ' "cmake_args": {' - ' "CMAKE_SYSTEM_NAME": "Windows",' - ' "CMAKE_SYSTEM_PROCESSOR": "arm64",' - ' "OPENSSL_NO_ASM": "1"' - ' },' - ' "gclient_vars": {' - ' "checkout_nasm": false' - ' },' - ' "msvc_target": "arm64",' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 caches { name: "gocache" @@ -2112,10 +1402,6 @@ buckets { path: "win_toolchain" } service_account: "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } } } @@ -2138,26 +1424,15 @@ buckets { swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\"}" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_aarch64_compile" @@ -2165,56 +1440,32 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\"}" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_aarch64_fips" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\",\"BUILD_SHARED_LIBS\":\"1\",\"FIPS\":\"1\"}" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "BUILD_SHARED_LIBS": "1",' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_aarch64_fips_compile" @@ -2222,59 +1473,32 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\",\"BUILD_SHARED_LIBS\":\"1\",\"FIPS\":\"1\"}" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "BUILD_SHARED_LIBS": "1",' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_aarch64_fips_noasm" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\",\"BUILD_SHARED_LIBS\":\"1\",\"FIPS\":\"1\",\"OPENSSL_NO_ASM\":\"1\"}" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "BUILD_SHARED_LIBS": "1",' - ' "FIPS": "1",' - ' "OPENSSL_NO_ASM": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_aarch64_fips_noasm_compile" @@ -2282,58 +1506,32 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\",\"BUILD_SHARED_LIBS\":\"1\",\"FIPS\":\"1\",\"OPENSSL_NO_ASM\":\"1\"}" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "BUILD_SHARED_LIBS": "1",' - ' "FIPS": "1",' - ' "OPENSSL_NO_ASM": "1"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_aarch64_fips_static" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\",\"FIPS\":\"1\"}" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_aarch64_fips_static_compile" @@ -2341,56 +1539,32 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\",\"FIPS\":\"1\"}" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_aarch64_rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\",\"CMAKE_BUILD_TYPE\":\"Release\"}" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_aarch64_rel_compile" @@ -2398,83 +1572,47 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"arm64-v8a\",\"ANDROID_PLATFORM\":\"android-21\",\"CMAKE_BUILD_TYPE\":\"Release\"}" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "arm64-v8a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_arm" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"armeabi-v7a\",\"ANDROID_PLATFORM\":\"android-21\"}" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "armeabi-v7a",' - ' "ANDROID_PLATFORM": "android-18"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_arm_armmode_rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"armeabi-v7a\",\"ANDROID_ARM_MODE\":\"arm\",\"ANDROID_PLATFORM\":\"android-21\",\"CMAKE_BUILD_TYPE\":\"Release\"}" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "armeabi-v7a",' - ' "ANDROID_ARM_MODE": "arm",' - ' "ANDROID_PLATFORM": "android-18",' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_arm_armmode_rel_compile" @@ -2482,30 +1620,17 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"armeabi-v7a\",\"ANDROID_ARM_MODE\":\"arm\",\"ANDROID_PLATFORM\":\"android-21\",\"CMAKE_BUILD_TYPE\":\"Release\"}" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "armeabi-v7a",' - ' "ANDROID_ARM_MODE": "arm",' - ' "ANDROID_PLATFORM": "android-18",' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_arm_compile" @@ -2513,56 +1638,32 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"armeabi-v7a\",\"ANDROID_PLATFORM\":\"android-21\"}" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "armeabi-v7a",' - ' "ANDROID_PLATFORM": "android-18"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_arm_fips" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"armeabi-v7a\",\"ANDROID_PLATFORM\":\"android-21\",\"BUILD_SHARED_LIBS\":\"1\",\"FIPS\":\"1\"}" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "armeabi-v7a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "BUILD_SHARED_LIBS": "1",' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_arm_fips_compile" @@ -2570,59 +1671,32 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"armeabi-v7a\",\"ANDROID_PLATFORM\":\"android-21\",\"BUILD_SHARED_LIBS\":\"1\",\"FIPS\":\"1\"}" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "armeabi-v7a",' - ' "ANDROID_PLATFORM": "android-21",' - ' "BUILD_SHARED_LIBS": "1",' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_arm_rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "device_type:walleye" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"armeabi-v7a\",\"ANDROID_PLATFORM\":\"android-21\",\"CMAKE_BUILD_TYPE\":\"Release\",\"CMAKE_CXX_FLAGS\":\"-DOPENSSL_NO_STATIC_NEON_FOR_TESTING=1\",\"CMAKE_C_FLAGS\":\"-DOPENSSL_NO_STATIC_NEON_FOR_TESTING=1\"}" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "armeabi-v7a",' - ' "ANDROID_PLATFORM": "android-18",' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "CMAKE_CXX_FLAGS": "-DOPENSSL_NO_STATIC_NEON_FOR_TESTING=1",' - ' "CMAKE_C_FLAGS": "-DOPENSSL_NO_STATIC_NEON_FOR_TESTING=1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_arm_rel_compile" @@ -2630,31 +1704,17 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"armeabi-v7a\",\"ANDROID_PLATFORM\":\"android-21\",\"CMAKE_BUILD_TYPE\":\"Release\",\"CMAKE_CXX_FLAGS\":\"-DOPENSSL_NO_STATIC_NEON_FOR_TESTING=1\",\"CMAKE_C_FLAGS\":\"-DOPENSSL_NO_STATIC_NEON_FOR_TESTING=1\"}" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "armeabi-v7a",' - ' "ANDROID_PLATFORM": "android-18",' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "CMAKE_CXX_FLAGS": "-DOPENSSL_NO_STATIC_NEON_FOR_TESTING=1",' - ' "CMAKE_C_FLAGS": "-DOPENSSL_NO_STATIC_NEON_FOR_TESTING=1"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "android_riscv64_compile_only" @@ -2662,32 +1722,17 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "android:true" + properties_j: "cmake_args:{\"ANDROID_ABI\":\"riscv64\",\"ANDROID_PLATFORM\":\"android-35\",\"CMAKE_BUILD_TYPE\":\"Release\"}" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "android": true,' - ' "cmake_args": {' - ' "ANDROID_ABI": "riscv64",' - ' "ANDROID_PLATFORM": "android-35",' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "gclient_vars": {' - ' "android_ndk_revision": "wC8sJjVPRDPTbaZFlki_qXTC1lWJNbJi8glUO0woJ1MC"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "docs" @@ -2695,53 +1740,34 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl_docs" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" } - properties: - '{' - ' "recipe": "boringssl_docs"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "ios64_compile" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-12|Mac-13" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_OSX_ARCHITECTURES\":\"arm64\",\"CMAKE_OSX_SYSROOT\":\"iphoneos\"}" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_OSX_ARCHITECTURES": "arm64",' - ' "CMAKE_OSX_SYSROOT": "iphoneos"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 3600 caches { name: "osx_sdk" path: "osx_sdk" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux" @@ -2749,27 +1775,16 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "check_stack:true" + properties_j: "cmake_args:{\"BORINGSSL_ALLOW_CXX_RUNTIME\":\"1\",\"RUST_BINDINGS\":\"x86_64-unknown-linux-gnu\"}" + properties_j: "rust:true" } - properties: - '{' - ' "check_stack": true,' - ' "cmake_args": {' - ' "BORINGSSL_ALLOW_CXX_RUNTIME": "1",' - ' "RUST_BINDINGS": "x86_64-unknown-linux-gnu"' - ' },' - ' "recipe": "boringssl",' - ' "rust": true' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux32" @@ -2777,31 +1792,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "check_stack:true" + properties_j: "cmake_args:{\"CMAKE_ASM_FLAGS\":\"-m32 -msse2\",\"CMAKE_CXX_FLAGS\":\"-m32 -msse2\",\"CMAKE_C_FLAGS\":\"-m32 -msse2\",\"CMAKE_SYSTEM_NAME\":\"Linux\",\"CMAKE_SYSTEM_PROCESSOR\":\"x86\"}" } - properties: - '{' - ' "check_stack": true,' - ' "cmake_args": {' - ' "CMAKE_ASM_FLAGS": "-m32 -msse2",' - ' "CMAKE_CXX_FLAGS": "-m32 -msse2",' - ' "CMAKE_C_FLAGS": "-m32 -msse2",' - ' "CMAKE_SYSTEM_NAME": "Linux",' - ' "CMAKE_SYSTEM_PROCESSOR": "x86",' - ' "RUST_BINDINGS": "i686-unknown-linux-gnu"' - ' },' - ' "recipe": "boringssl",' - ' "rust": true' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux32_nosse2_noasm" @@ -2809,30 +1808,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_ASM_FLAGS\":\"-m32 -msse2\",\"CMAKE_CXX_FLAGS\":\"-m32 -msse2\",\"CMAKE_C_FLAGS\":\"-m32 -msse2\",\"CMAKE_SYSTEM_NAME\":\"Linux\",\"CMAKE_SYSTEM_PROCESSOR\":\"x86\",\"OPENSSL_NO_ASM\":\"1\",\"OPENSSL_NO_SSE2_FOR_TESTING\":\"1\"}" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_ASM_FLAGS": "-m32 -msse2",' - ' "CMAKE_CXX_FLAGS": "-m32 -msse2",' - ' "CMAKE_C_FLAGS": "-m32 -msse2",' - ' "CMAKE_SYSTEM_NAME": "Linux",' - ' "CMAKE_SYSTEM_PROCESSOR": "x86",' - ' "OPENSSL_NO_ASM": "1",' - ' "OPENSSL_NO_SSE2_FOR_TESTING": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux32_rel" @@ -2840,29 +1823,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_ASM_FLAGS\":\"-m32 -msse2\",\"CMAKE_BUILD_TYPE\":\"Release\",\"CMAKE_CXX_FLAGS\":\"-m32 -msse2\",\"CMAKE_C_FLAGS\":\"-m32 -msse2\",\"CMAKE_SYSTEM_NAME\":\"Linux\",\"CMAKE_SYSTEM_PROCESSOR\":\"x86\"}" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_ASM_FLAGS": "-m32 -msse2",' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "CMAKE_CXX_FLAGS": "-m32 -msse2",' - ' "CMAKE_C_FLAGS": "-m32 -msse2",' - ' "CMAKE_SYSTEM_NAME": "Linux",' - ' "CMAKE_SYSTEM_PROCESSOR": "x86"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux32_sde" @@ -2870,31 +1838,16 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_ASM_FLAGS\":\"-m32 -msse2\",\"CMAKE_BUILD_TYPE\":\"RelWithAsserts\",\"CMAKE_CXX_FLAGS\":\"-m32 -msse2\",\"CMAKE_C_FLAGS\":\"-m32 -msse2\",\"CMAKE_SYSTEM_NAME\":\"Linux\",\"CMAKE_SYSTEM_PROCESSOR\":\"x86\"}" + properties_j: "run_ssl_tests:false" + properties_j: "sde:true" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_ASM_FLAGS": "-m32 -msse2",' - ' "CMAKE_BUILD_TYPE": "RelWithAsserts",' - ' "CMAKE_CXX_FLAGS": "-m32 -msse2",' - ' "CMAKE_C_FLAGS": "-m32 -msse2",' - ' "CMAKE_SYSTEM_NAME": "Linux",' - ' "CMAKE_SYSTEM_PROCESSOR": "x86"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "sde": true' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_bazel" @@ -2902,21 +1855,13 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl_bazel" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" } - properties: - '{' - ' "recipe": "boringssl_bazel"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_clang_cfi" @@ -2924,25 +1869,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CFI\":\"1\"}" } - properties: - '{' - ' "clang": true,' - ' "cmake_args": {' - ' "CFI": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_clang_rel" @@ -2950,25 +1885,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\"}" } - properties: - '{' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_clang_rel_msan" @@ -2976,30 +1901,16 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\",\"MSAN\":\"1\",\"USE_CUSTOM_LIBCXX\":\"1\"}" + properties_j: "gclient_vars:{\"checkout_libcxx\":true}" } - properties: - '{' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "MSAN": "1",' - ' "USE_CUSTOM_LIBCXX": "1"' - ' },' - ' "gclient_vars": {' - ' "checkout_libcxx": true' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_clang_rel_tsan" @@ -3007,31 +1918,17 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\",\"TSAN\":\"1\",\"USE_CUSTOM_LIBCXX\":\"1\"}" + properties_j: "gclient_vars:{\"checkout_libcxx\":true}" + properties_j: "run_ssl_tests:false" } - properties: - '{' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "TSAN": "1",' - ' "USE_CUSTOM_LIBCXX": "1"' - ' },' - ' "gclient_vars": {' - ' "checkout_libcxx": true' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_clang_ubsan" @@ -3039,26 +1936,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"RelWithAsserts\",\"UBSAN\":\"1\"}" } - properties: - '{' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "RelWithAsserts",' - ' "UBSAN": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_fips" @@ -3066,24 +1952,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"FIPS\":\"1\"}" } - properties: - '{' - ' "cmake_args": {' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_fips_clang" @@ -3091,25 +1967,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "cmake_args:{\"FIPS\":\"1\"}" } - properties: - '{' - ' "clang": true,' - ' "cmake_args": {' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_fips_clang_rel" @@ -3117,26 +1983,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\",\"FIPS\":\"1\"}" } - properties: - '{' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_fips_noasm_asan" @@ -3144,27 +1999,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "cmake_args:{\"ASAN\":\"1\",\"FIPS\":\"1\",\"OPENSSL_NO_ASM\":\"1\"}" } - properties: - '{' - ' "clang": true,' - ' "cmake_args": {' - ' "ASAN": "1",' - ' "FIPS": "1",' - ' "OPENSSL_NO_ASM": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_fips_rel" @@ -3172,25 +2015,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\",\"FIPS\":\"1\"}" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "FIPS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_fuzz" @@ -3198,29 +2030,16 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "cmake_args:{\"FUZZ\":\"1\",\"LIBFUZZER_FROM_DEPS\":\"1\"}" + properties_j: "gclient_vars:{\"checkout_fuzzer\":true}" } - properties: - '{' - ' "clang": true,' - ' "cmake_args": {' - ' "FUZZ": "1",' - ' "LIBFUZZER_FROM_DEPS": "1"' - ' },' - ' "gclient_vars": {' - ' "checkout_fuzzer": true' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_noasm_asan" @@ -3228,26 +2047,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "cmake_args:{\"ASAN\":\"1\",\"OPENSSL_NO_ASM\":\"1\"}" } - properties: - '{' - ' "clang": true,' - ' "cmake_args": {' - ' "ASAN": "1",' - ' "OPENSSL_NO_ASM": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_nosse2_noasm" @@ -3255,25 +2063,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"OPENSSL_NO_ASM\":\"1\",\"OPENSSL_NO_SSE2_FOR_TESTING\":\"1\"}" } - properties: - '{' - ' "cmake_args": {' - ' "OPENSSL_NO_ASM": "1",' - ' "OPENSSL_NO_SSE2_FOR_TESTING": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_nothreads" @@ -3281,25 +2078,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_CXX_FLAGS\":\"-DOPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED=1\",\"CMAKE_C_FLAGS\":\"-DOPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED=1\"}" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_CXX_FLAGS": "-DOPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED=1",' - ' "CMAKE_C_FLAGS": "-DOPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED=1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_rel" @@ -3307,24 +2093,14 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\"}" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_sde" @@ -3332,26 +2108,16 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"RelWithAsserts\"}" + properties_j: "run_ssl_tests:false" + properties_j: "sde:true" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "RelWithAsserts"' - ' },' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "sde": true' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_shared" @@ -3359,25 +2125,15 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "check_imported_libraries:true" + properties_j: "cmake_args:{\"BUILD_SHARED_LIBS\":\"1\"}" } - properties: - '{' - ' "check_imported_libraries": true,' - ' "cmake_args": {' - ' "BUILD_SHARED_LIBS": "1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "linux_small" @@ -3385,55 +2141,34 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_CXX_FLAGS\":\"-DOPENSSL_SMALL=1\",\"CMAKE_C_FLAGS\":\"-DOPENSSL_SMALL=1\"}" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_CXX_FLAGS": "-DOPENSSL_SMALL=1",' - ' "CMAKE_C_FLAGS": "-DOPENSSL_SMALL=1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "mac" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-12|Mac-13" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"RUST_BINDINGS\":\"x86_64-apple-darwin\"}" + properties_j: "rust:true" } - properties: - '{' - ' "cmake_args": {' - ' "RUST_BINDINGS": "x86_64-apple-darwin"' - ' },' - ' "recipe": "boringssl",' - ' "rust": true' - '}' execution_timeout_secs: 3600 caches { name: "osx_sdk" path: "osx_sdk" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "mac_arm64" @@ -3441,29 +2176,19 @@ buckets { dimensions: "cpu:arm64" dimensions: "os:Mac" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"RUST_BINDINGS\":\"aarch64-apple-darwin\"}" + properties_j: "rust:true" } - properties: - '{' - ' "cmake_args": {' - ' "RUST_BINDINGS": "aarch64-apple-darwin"' - ' },' - ' "recipe": "boringssl",' - ' "rust": true' - '}' execution_timeout_secs: 3600 caches { name: "osx_sdk" path: "osx_sdk" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "mac_arm64_bazel" @@ -3471,84 +2196,55 @@ buckets { dimensions: "cpu:arm64" dimensions: "os:Mac" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl_bazel" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" } - properties: - '{' - ' "recipe": "boringssl_bazel"' - '}' execution_timeout_secs: 3600 caches { name: "osx_sdk" path: "osx_sdk" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "mac_rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-12|Mac-13" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\"}" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 caches { name: "osx_sdk" path: "osx_sdk" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "mac_small" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-12|Mac-13" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_CXX_FLAGS\":\"-DOPENSSL_SMALL=1\",\"CMAKE_C_FLAGS\":\"-DOPENSSL_SMALL=1\"}" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_CXX_FLAGS": "-DOPENSSL_SMALL=1",' - ' "CMAKE_C_FLAGS": "-DOPENSSL_SMALL=1"' - ' },' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 3600 caches { name: "osx_sdk" path: "osx_sdk" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win32" @@ -3556,26 +2252,18 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "msvc_target:\"x86\"" } - properties: - '{' - ' "msvc_target": "x86",' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win32_clang" @@ -3583,34 +2271,20 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_ASM_FLAGS\":\"-m32 -msse2\",\"CMAKE_CXX_FLAGS\":\"-m32 -msse2\",\"CMAKE_C_FLAGS\":\"-m32 -msse2\",\"CMAKE_SYSTEM_NAME\":\"Windows\",\"CMAKE_SYSTEM_PROCESSOR\":\"x86\"}" + properties_j: "msvc_target:\"x86\"" } - properties: - '{' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_ASM_FLAGS": "-m32 -msse2",' - ' "CMAKE_CXX_FLAGS": "-m32 -msse2",' - ' "CMAKE_C_FLAGS": "-m32 -msse2",' - ' "CMAKE_SYSTEM_NAME": "Windows",' - ' "CMAKE_SYSTEM_PROCESSOR": "x86"' - ' },' - ' "msvc_target": "x86",' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win32_clang_compile" @@ -3618,36 +2292,22 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_ASM_FLAGS\":\"-m32 -msse2\",\"CMAKE_CXX_FLAGS\":\"-m32 -msse2\",\"CMAKE_C_FLAGS\":\"-m32 -msse2\",\"CMAKE_SYSTEM_NAME\":\"Windows\",\"CMAKE_SYSTEM_PROCESSOR\":\"x86\"}" + properties_j: "msvc_target:\"x86\"" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_ASM_FLAGS": "-m32 -msse2",' - ' "CMAKE_CXX_FLAGS": "-m32 -msse2",' - ' "CMAKE_C_FLAGS": "-m32 -msse2",' - ' "CMAKE_SYSTEM_NAME": "Windows",' - ' "CMAKE_SYSTEM_PROCESSOR": "x86"' - ' },' - ' "msvc_target": "x86",' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win32_compile" @@ -3655,28 +2315,20 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "msvc_target:\"x86\"" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "msvc_target": "x86",' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win32_rel" @@ -3684,29 +2336,19 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\"}" + properties_j: "msvc_target:\"x86\"" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release"' - ' },' - ' "msvc_target": "x86",' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win32_sde" @@ -3714,31 +2356,21 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"RelWithAsserts\"}" + properties_j: "msvc_target:\"x86\"" + properties_j: "run_ssl_tests:false" + properties_j: "sde:true" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "RelWithAsserts"' - ' },' - ' "msvc_target": "x86",' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "sde": true' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win32_small" @@ -3746,30 +2378,19 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_CXX_FLAGS\":\"-DOPENSSL_SMALL=1\",\"CMAKE_C_FLAGS\":\"-DOPENSSL_SMALL=1\"}" + properties_j: "msvc_target:\"x86\"" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_CXX_FLAGS": "-DOPENSSL_SMALL=1",' - ' "CMAKE_C_FLAGS": "-DOPENSSL_SMALL=1"' - ' },' - ' "msvc_target": "x86",' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win64" @@ -3777,26 +2398,18 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "msvc_target:\"x64\"" } - properties: - '{' - ' "msvc_target": "x64",' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win64_clang" @@ -3804,27 +2417,19 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "msvc_target:\"x64\"" } - properties: - '{' - ' "clang": true,' - ' "msvc_target": "x64",' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win64_clang_compile" @@ -3832,29 +2437,21 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "msvc_target:\"x64\"" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "clang": true,' - ' "msvc_target": "x64",' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win64_compile" @@ -3862,28 +2459,20 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "msvc_target:\"x64\"" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "msvc_target": "x64",' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win64_rel" @@ -3891,31 +2480,20 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"Release\",\"RUST_BINDINGS\":\"x86_64-pc-windows-msvc\"}" + properties_j: "msvc_target:\"x64\"" + properties_j: "rust:true" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "Release",' - ' "RUST_BINDINGS": "x86_64-pc-windows-msvc"' - ' },' - ' "msvc_target": "x64",' - ' "recipe": "boringssl",' - ' "rust": true' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win64_sde" @@ -3923,31 +2501,21 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_BUILD_TYPE\":\"RelWithAsserts\"}" + properties_j: "msvc_target:\"x64\"" + properties_j: "run_ssl_tests:false" + properties_j: "sde:true" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_BUILD_TYPE": "RelWithAsserts"' - ' },' - ' "msvc_target": "x64",' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "sde": true' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win64_small" @@ -3955,30 +2523,19 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_CXX_FLAGS\":\"-DOPENSSL_SMALL=1\",\"CMAKE_C_FLAGS\":\"-DOPENSSL_SMALL=1\"}" + properties_j: "msvc_target:\"x64\"" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_CXX_FLAGS": "-DOPENSSL_SMALL=1",' - ' "CMAKE_C_FLAGS": "-DOPENSSL_SMALL=1"' - ' },' - ' "msvc_target": "x64",' - ' "recipe": "boringssl"' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win_arm64_compile" @@ -3986,39 +2543,23 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "clang:true" + properties_j: "cmake_args:{\"CMAKE_ASM_FLAGS\":\"--target=arm64-windows\",\"CMAKE_CXX_FLAGS\":\"--target=arm64-windows\",\"CMAKE_C_FLAGS\":\"--target=arm64-windows\",\"CMAKE_SYSTEM_NAME\":\"Windows\",\"CMAKE_SYSTEM_PROCESSOR\":\"arm64\"}" + properties_j: "gclient_vars:{\"checkout_nasm\":false}" + properties_j: "msvc_target:\"arm64\"" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "clang": true,' - ' "cmake_args": {' - ' "CMAKE_ASM_FLAGS": "--target=arm64-windows",' - ' "CMAKE_CXX_FLAGS": "--target=arm64-windows",' - ' "CMAKE_C_FLAGS": "--target=arm64-windows",' - ' "CMAKE_SYSTEM_NAME": "Windows",' - ' "CMAKE_SYSTEM_PROCESSOR": "arm64"' - ' },' - ' "gclient_vars": {' - ' "checkout_nasm": false' - ' },' - ' "msvc_target": "arm64",' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } builders { name: "win_arm64_msvc_compile" @@ -4026,36 +2567,22 @@ buckets { dimensions: "cpu:x86-64" dimensions: "os:Windows-10" dimensions: "pool:luci.flex.try" - exe { + recipe { + name: "boringssl" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" - cmd: "luciexe" + properties_j: "cmake_args:{\"CMAKE_SYSTEM_NAME\":\"Windows\",\"CMAKE_SYSTEM_PROCESSOR\":\"arm64\",\"OPENSSL_NO_ASM\":\"1\"}" + properties_j: "gclient_vars:{\"checkout_nasm\":false}" + properties_j: "msvc_target:\"arm64\"" + properties_j: "run_ssl_tests:false" + properties_j: "run_unit_tests:false" } - properties: - '{' - ' "cmake_args": {' - ' "CMAKE_SYSTEM_NAME": "Windows",' - ' "CMAKE_SYSTEM_PROCESSOR": "arm64",' - ' "OPENSSL_NO_ASM": "1"' - ' },' - ' "gclient_vars": {' - ' "checkout_nasm": false' - ' },' - ' "msvc_target": "arm64",' - ' "recipe": "boringssl",' - ' "run_ssl_tests": false,' - ' "run_unit_tests": false' - '}' execution_timeout_secs: 1800 caches { name: "win_toolchain" path: "win_toolchain" } service_account: "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } } } } diff --git a/naiveproxy/src/third_party/boringssl/src/infra/config/generated/project.cfg b/naiveproxy/src/third_party/boringssl/src/infra/config/generated/project.cfg index 093f6e516a..5fa3c574a2 100644 --- a/naiveproxy/src/third_party/boringssl/src/infra/config/generated/project.cfg +++ b/naiveproxy/src/third_party/boringssl/src/infra/config/generated/project.cfg @@ -7,7 +7,7 @@ name: "boringssl" access: "group:all" lucicfg { - version: "1.45.6" + version: "1.45.8" package_dir: ".." config_dir: "generated" entry_point: "main.star" diff --git a/naiveproxy/src/third_party/boringssl/src/infra/config/main.star b/naiveproxy/src/third_party/boringssl/src/infra/config/main.star index 570837a111..4e556841fc 100755 --- a/naiveproxy/src/third_party/boringssl/src/infra/config/main.star +++ b/naiveproxy/src/third_party/boringssl/src/infra/config/main.star @@ -156,7 +156,6 @@ def ci_builder( executable = luci.recipe( name = recipe, cipd_package = RECIPE_BUNDLE, - use_python3 = True, ), service_account = "boringssl-ci-builder@chops-service-accounts.iam.gserviceaccount.com", dimensions = dimensions, @@ -202,7 +201,6 @@ def cq_builder( executable = luci.recipe( name = recipe, cipd_package = RECIPE_BUNDLE, - use_python3 = True, ), service_account = "boringssl-try-builder@chops-service-accounts.iam.gserviceaccount.com", dimensions = dimensions, @@ -312,7 +310,8 @@ MAC_ARM64_HOST = { MAC_X86_64_HOST = { "dimensions": { - "os": "Mac-10.15|Mac-11", + # macOS 12 or later is needed as of Go 1.25. + "os": "Mac-12|Mac-13", "cpu": "x86-64", }, "caches": [swarming.cache("osx_sdk")], @@ -446,7 +445,7 @@ both_builders( "android": True, "cmake_args": { "ANDROID_ABI": "armeabi-v7a", - "ANDROID_PLATFORM": "android-18", + "ANDROID_PLATFORM": "android-21", }, }, ) @@ -461,7 +460,7 @@ both_builders( "android": True, "cmake_args": { "ANDROID_ABI": "armeabi-v7a", - "ANDROID_PLATFORM": "android-18", + "ANDROID_PLATFORM": "android-21", "CMAKE_BUILD_TYPE": "Release", # Although Android now requires NEON support, on one builder, we # ignore the |__ARM_NEON| preprocessor option, to keep testing @@ -501,7 +500,7 @@ both_builders( "cmake_args": { "ANDROID_ABI": "armeabi-v7a", "ANDROID_ARM_MODE": "arm", - "ANDROID_PLATFORM": "android-18", + "ANDROID_PLATFORM": "android-21", "CMAKE_BUILD_TYPE": "Release", }, }, @@ -518,11 +517,6 @@ both_builders( "ANDROID_PLATFORM": "android-35", "CMAKE_BUILD_TYPE": "Release", }, - # The default Android NDK cannot be updated until https://crbug.com/boringssl/454 is fixed. - # Meanwhile, RISC-V support requires a newer NDK, thus we override for this builder. - "gclient_vars": { - "android_ndk_revision": "wC8sJjVPRDPTbaZFlki_qXTC1lWJNbJi8glUO0woJ1MC", - }, "run_unit_tests": False, "run_ssl_tests": False, }, @@ -589,10 +583,7 @@ both_builders( "CMAKE_ASM_FLAGS": "-m32 -msse2", "CMAKE_CXX_FLAGS": "-m32 -msse2", "CMAKE_C_FLAGS": "-m32 -msse2", - "RUST_BINDINGS": "i686-unknown-linux-gnu", }, - # Also build and test the Rust code. - "rust": True, }, ) both_builders( diff --git a/naiveproxy/src/third_party/boringssl/src/pki/cert_errors.h b/naiveproxy/src/third_party/boringssl/src/pki/cert_errors.h index 2538c6a484..57474acb5a 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/cert_errors.h +++ b/naiveproxy/src/third_party/boringssl/src/pki/cert_errors.h @@ -121,7 +121,7 @@ class OPENSSL_EXPORT CertErrors { CertError::Severity severity) const; // Returns true if the error |id| was added to this CertErrors at - // high serverity. + // high severity. bool ContainsError(CertErrorId id) const; // Returns true if this contains any errors of the given severity level. diff --git a/naiveproxy/src/third_party/boringssl/src/pki/certificate_policies.h b/naiveproxy/src/third_party/boringssl/src/pki/certificate_policies.h index ecedbdfd73..4137e9b5d9 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/certificate_policies.h +++ b/naiveproxy/src/third_party/boringssl/src/pki/certificate_policies.h @@ -95,7 +95,7 @@ OPENSSL_EXPORT bool ParseCertificatePoliciesExtension( // // If a policy qualifier other than User Notice/CPS is present, parsing // will fail if |fail_parsing_unknown_qualifier_oids| was set to true, -// otherwise the unrecognized qualifiers wil be skipped and not parsed +// otherwise the unrecognized qualifiers will be skipped and not parsed // any further. // // Returns true on success. On failure returns false and may add errors to diff --git a/naiveproxy/src/third_party/boringssl/src/pki/common_cert_errors.h b/naiveproxy/src/third_party/boringssl/src/pki/common_cert_errors.h index 5bbf41281b..a1486fe819 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/common_cert_errors.h +++ b/naiveproxy/src/third_party/boringssl/src/pki/common_cert_errors.h @@ -104,8 +104,8 @@ OPENSSL_EXPORT extern const CertErrorId kEkuLacksClientAuth; OPENSSL_EXPORT extern const CertErrorId kCertIsNotTrustAnchor; // The chain is not valid for any policy, and an explicit policy was required. -// (Either because the relying party requested it during verificaiton, or it was -// requrested by a PolicyConstraints extension). +// (Either because the relying party requested it during verification, or it was +// requested by a PolicyConstraints extension). OPENSSL_EXPORT extern const CertErrorId kNoValidPolicy; // The certificate is trying to map to, or from, anyPolicy. diff --git a/naiveproxy/src/third_party/boringssl/src/pki/input.h b/naiveproxy/src/third_party/boringssl/src/pki/input.h index 933c537775..9e2d5d3d63 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/input.h +++ b/naiveproxy/src/third_party/boringssl/src/pki/input.h @@ -95,8 +95,7 @@ class OPENSSL_EXPORT Input { constexpr uint8_t operator[](size_t idx) const { return data_[idx]; } constexpr uint8_t front() const { return data_.front(); } constexpr uint8_t back() const { return data_.back(); } - constexpr Input subspan(size_t pos = 0, - size_t len = Span::npos) const { + constexpr Input subspan(size_t pos = 0, size_t len = dynamic_extent) const { return Input(data_.subspan(pos, len)); } constexpr Input first(size_t len) const { return Input(data_.first(len)); } diff --git a/naiveproxy/src/third_party/boringssl/src/pki/ocsp.cc b/naiveproxy/src/third_party/boringssl/src/pki/ocsp.cc index 9f42403342..d0f970899c 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/ocsp.cc +++ b/naiveproxy/src/third_party/boringssl/src/pki/ocsp.cc @@ -309,7 +309,7 @@ bool ParseOCSPResponseData(der::Input raw_tlv, OCSPResponseData *out) { return false; } - // For compatibilty, we ignore the restriction from X.690 Section 11.5 that + // For compatibility, we ignore the restriction from X.690 Section 11.5 that // DEFAULT values should be omitted for values equal to the default value. // TODO: Add warning about non-strict parsing. if (version_present) { @@ -847,7 +847,7 @@ OCSPRevocationStatus GetRevocationStatusForCert( } // The SingleResponse matches the certificate, but may be out of date. Out - // of date responses are noted seperate from responses with mismatched + // of date responses are noted separate from responses with mismatched // serial numbers. If an OCSP responder provides both an up to date // response and an expired response, the up to date response takes // precedence (PROVIDED > INVALID_DATE). diff --git a/naiveproxy/src/third_party/boringssl/src/pki/parse_certificate.h b/naiveproxy/src/third_party/boringssl/src/pki/parse_certificate.h index d2bf9dbdd0..0481903d49 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/parse_certificate.h +++ b/naiveproxy/src/third_party/boringssl/src/pki/parse_certificate.h @@ -251,7 +251,7 @@ struct OPENSSL_EXPORT ParsedTbsCertificate { // // Parsing guarantees that notBefore (validity_not_before) and notAfter // (validity_not_after) are valid DER-encoded dates, however it DOES NOT - // gurantee anything about their values. For instance notAfter could be + // guarantee anything about their values. For instance notAfter could be // before notBefore, or the dates could indicate an expired certificate. // Consumers are responsible for testing expiration. der::GeneralizedTime validity_not_before; diff --git a/naiveproxy/src/third_party/boringssl/src/pki/path_builder.cc b/naiveproxy/src/third_party/boringssl/src/pki/path_builder.cc index 876cc9b09e..2cff35dc8e 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/path_builder.cc +++ b/naiveproxy/src/third_party/boringssl/src/pki/path_builder.cc @@ -92,7 +92,7 @@ enum KeyIdentifierMatch { // Returns an integer that represents the relative ordering of |issuer| for // prioritizing certificates in path building based on |issuer|'s // subjectKeyIdentifier and |target|'s authorityKeyIdentifier. Lower return -// values indicate higer priority. +// values indicate higher priority. KeyIdentifierMatch CalculateKeyIdentifierMatch( const ParsedCertificate *target, const ParsedCertificate *issuer) { if (!target->authority_key_identifier()) { @@ -117,7 +117,7 @@ KeyIdentifierMatch CalculateKeyIdentifierMatch( // Returns an integer that represents the relative ordering of |issuer| based // on |issuer_trust| and authorityKeyIdentifier matching for prioritizing -// certificates in path building. Lower return values indicate higer priority. +// certificates in path building. Lower return values indicate higher priority. int TrustAndKeyIdentifierMatchToOrder(const ParsedCertificate *target, const ParsedCertificate *issuer, const CertificateTrust &issuer_trust) { diff --git a/naiveproxy/src/third_party/boringssl/src/pki/pem.cc b/naiveproxy/src/third_party/boringssl/src/pki/pem.cc index 880f7ef404..d4687a4b50 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/pem.cc +++ b/naiveproxy/src/third_party/boringssl/src/pki/pem.cc @@ -15,6 +15,7 @@ #include "pem.h" #include "string_util.h" +#include #include namespace { @@ -37,6 +38,16 @@ struct PEMTokenizer::PEMType { PEMTokenizer::PEMTokenizer( std::string_view str, const std::vector &allowed_block_types) { + std::vector types; + for (const auto &type : allowed_block_types) { + types.emplace_back(type); + } + Init(str, bssl::Span(types)); +} + +PEMTokenizer::PEMTokenizer( + std::string_view str, + bssl::Span allowed_block_types) { Init(str, allowed_block_types); } @@ -95,7 +106,7 @@ bool PEMTokenizer::GetNext() { } void PEMTokenizer::Init(std::string_view str, - const std::vector &allowed_block_types) { + bssl::Span allowed_block_types) { str_ = str; pos_ = 0; @@ -114,6 +125,35 @@ void PEMTokenizer::Init(std::string_view str, } } +std::vector PEMDecode( + std::string_view data, bssl::Span allowed_types) { + std::vector results; + PEMTokenizer tokenizer(data, allowed_types); + while (tokenizer.GetNext()) { + results.push_back(PEMToken{tokenizer.block_type(), tokenizer.data()}); + } + return results; +} + +std::optional PEMDecodeSingle( + std::string_view data, std::string_view allowed_type) { + const std::array allowed_types = {allowed_type}; + PEMTokenizer tokenizer(data, allowed_types); + if (!tokenizer.GetNext()) { + return std::nullopt; + } + + std::string result = tokenizer.data(); + + // We need exactly one token of the allowed types, so return nullopt if + // there's more than one. + if (tokenizer.GetNext()) { + return std::nullopt; + } + + return result; +} + std::string PEMEncode(std::string_view data, const std::string &type) { std::string b64_encoded; string_util::Base64Encode(data, &b64_encoded); diff --git a/naiveproxy/src/third_party/boringssl/src/pki/pem.h b/naiveproxy/src/third_party/boringssl/src/pki/pem.h index 42e374cac4..f0e45541b1 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/pem.h +++ b/naiveproxy/src/third_party/boringssl/src/pki/pem.h @@ -17,11 +17,13 @@ #include +#include #include #include #include #include +#include BSSL_NAMESPACE_BEGIN @@ -36,6 +38,8 @@ class OPENSSL_EXPORT PEMTokenizer { // |str| must remain valid for the duration of the PEMTokenizer. PEMTokenizer(std::string_view str, const std::vector &allowed_block_types); + PEMTokenizer(std::string_view str, + bssl::Span allowed_block_types); PEMTokenizer(const PEMTokenizer &) = delete; PEMTokenizer &operator=(const PEMTokenizer &) = delete; @@ -59,7 +63,7 @@ class OPENSSL_EXPORT PEMTokenizer { private: void Init(std::string_view str, - const std::vector &allowed_block_types); + bssl::Span allowed_block_types); // A simple cache of the allowed PEM header and footer for a given PEM // block type, so that it is only computed once. @@ -86,8 +90,29 @@ class OPENSSL_EXPORT PEMTokenizer { std::string data_; }; -// Encodes |data| in the encapsulated message format described in RFC 1421, -// with |type| as the PEM block type (eg: CERTIFICATE). +// PEMToken represents a single PEM token. Headers are not stored or supported. +struct PEMToken { + std::string type; + std::string data; +}; + +// PEMDecode decodes |data| into a sequence of PEM tokens. Only tokens whose +// type appears in |allowed_types| are included in the resulting vector. The +// resulting vector may be empty if either there are no valid PEM tokens in the +// input, or there are valid tokens but none of them match any of the allowed +// types. +OPENSSL_EXPORT std::vector PEMDecode( + std::string_view data, bssl::Span allowed_types); + +// PEMDecodeSingle decodes |data| into a single PEM token, which must be of the +// specified |allowed_type|, and returns that token's base64-decoded body. +// Returns nullopt if there is not exactly one token of the allowed type in the +// input for any reason. +OPENSSL_EXPORT std::optional PEMDecodeSingle( + std::string_view data, std::string_view allowed_type); + +// PEMEncode encodes |data| in the encapsulated message format described in RFC +// 1421, with |type| as the PEM block type (eg: CERTIFICATE). OPENSSL_EXPORT std::string PEMEncode(std::string_view data, const std::string &type); diff --git a/naiveproxy/src/third_party/boringssl/src/pki/signature_algorithm.cc b/naiveproxy/src/third_party/boringssl/src/pki/signature_algorithm.cc index a0dcb805bf..9e5fe31077 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/signature_algorithm.cc +++ b/naiveproxy/src/third_party/boringssl/src/pki/signature_algorithm.cc @@ -16,6 +16,7 @@ #include #include +#include #include "input.h" #include "parse_values.h" @@ -25,6 +26,11 @@ BSSL_NAMESPACE_BEGIN namespace { +// These OIDs do not reference libcrypto's OBJ table, as that table is very +// large and includes many more OIDs than we need. However, where OIDs are +// already in the table, we reuse the |OBJ_ENC_*| constants to avoid needing to +// specify them a second time. + // From RFC 5912: // // sha1WithRSAEncryption OBJECT IDENTIFIER ::= { @@ -32,8 +38,7 @@ namespace { // pkcs-1(1) 5 } // // In dotted notation: 1.2.840.113549.1.1.5 -const uint8_t kOidSha1WithRsaEncryption[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x05}; +const uint8_t kOidSha1WithRsaEncryption[] = {OBJ_ENC_sha1WithRSAEncryption}; // sha1WithRSASignature is a deprecated equivalent of // sha1WithRSAEncryption. @@ -47,7 +52,7 @@ const uint8_t kOidSha1WithRsaEncryption[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, // See also: https://bugzilla.mozilla.org/show_bug.cgi?id=1042479 // // In dotted notation: 1.3.14.3.2.29 -const uint8_t kOidSha1WithRsaSignature[] = {0x2b, 0x0e, 0x03, 0x02, 0x1d}; +const uint8_t kOidSha1WithRsaSignature[] = {OBJ_ENC_sha1WithRSA}; // From RFC 5912: // @@ -59,24 +64,21 @@ const uint8_t kOidSha1WithRsaSignature[] = {0x2b, 0x0e, 0x03, 0x02, 0x1d}; // sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } // // In dotted notation: 1.2.840.113549.1.1.11 -const uint8_t kOidSha256WithRsaEncryption[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x0b}; +const uint8_t kOidSha256WithRsaEncryption[] = {OBJ_ENC_sha256WithRSAEncryption}; // From RFC 5912: // // sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } // // In dotted notation: 1.2.840.113549.1.1.11 -const uint8_t kOidSha384WithRsaEncryption[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x0c}; +const uint8_t kOidSha384WithRsaEncryption[] = {OBJ_ENC_sha384WithRSAEncryption}; // From RFC 5912: // // sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } // // In dotted notation: 1.2.840.113549.1.1.13 -const uint8_t kOidSha512WithRsaEncryption[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x0d}; +const uint8_t kOidSha512WithRsaEncryption[] = {OBJ_ENC_sha512WithRSAEncryption}; // From RFC 5912: // @@ -85,7 +87,7 @@ const uint8_t kOidSha512WithRsaEncryption[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, // signatures(4) 1 } // // In dotted notation: 1.2.840.10045.4.1 -const uint8_t kOidEcdsaWithSha1[] = {0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x01}; +const uint8_t kOidEcdsaWithSha1[] = {OBJ_ENC_ecdsa_with_SHA1}; // From RFC 5912: // @@ -94,8 +96,7 @@ const uint8_t kOidEcdsaWithSha1[] = {0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x01}; // ecdsa-with-SHA2(3) 2 } // // In dotted notation: 1.2.840.10045.4.3.2 -const uint8_t kOidEcdsaWithSha256[] = {0x2a, 0x86, 0x48, 0xce, - 0x3d, 0x04, 0x03, 0x02}; +const uint8_t kOidEcdsaWithSha256[] = {OBJ_ENC_ecdsa_with_SHA256}; // From RFC 5912: // @@ -104,8 +105,7 @@ const uint8_t kOidEcdsaWithSha256[] = {0x2a, 0x86, 0x48, 0xce, // ecdsa-with-SHA2(3) 3 } // // In dotted notation: 1.2.840.10045.4.3.3 -const uint8_t kOidEcdsaWithSha384[] = {0x2a, 0x86, 0x48, 0xce, - 0x3d, 0x04, 0x03, 0x03}; +const uint8_t kOidEcdsaWithSha384[] = {OBJ_ENC_ecdsa_with_SHA384}; // From RFC 5912: // @@ -114,24 +114,21 @@ const uint8_t kOidEcdsaWithSha384[] = {0x2a, 0x86, 0x48, 0xce, // ecdsa-with-SHA2(3) 4 } // // In dotted notation: 1.2.840.10045.4.3.4 -const uint8_t kOidEcdsaWithSha512[] = {0x2a, 0x86, 0x48, 0xce, - 0x3d, 0x04, 0x03, 0x04}; +const uint8_t kOidEcdsaWithSha512[] = {OBJ_ENC_ecdsa_with_SHA512}; // From RFC 5912: // // id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } // // In dotted notation: 1.2.840.113549.1.1.10 -const uint8_t kOidRsaSsaPss[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x0a}; +const uint8_t kOidRsaSsaPss[] = {OBJ_ENC_rsassaPss}; // From RFC 5912: // // id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 } // // In dotted notation: 1.2.840.113549.1.1.8 -const uint8_t kOidMgf1[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x08}; +const uint8_t kOidMgf1[] = {OBJ_ENC_mgf1}; // Returns true if the entirety of the input is a NULL value. [[nodiscard]] bool IsNull(der::Input input) { diff --git a/naiveproxy/src/third_party/boringssl/src/pki/simple_path_builder_delegate.cc b/naiveproxy/src/third_party/boringssl/src/pki/simple_path_builder_delegate.cc index 787061167a..a3b52052f7 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/simple_path_builder_delegate.cc +++ b/naiveproxy/src/third_party/boringssl/src/pki/simple_path_builder_delegate.cc @@ -100,12 +100,7 @@ bool SimplePathBuilderDelegate::IsPublicKeyAcceptable(EVP_PKEY *public_key, int pkey_id = EVP_PKEY_id(public_key); if (pkey_id == EVP_PKEY_RSA) { // Extract the modulus length from the key. - RSA *rsa = EVP_PKEY_get0_RSA(public_key); - if (!rsa) { - return false; - } - unsigned int modulus_length_bits = RSA_bits(rsa); - + unsigned int modulus_length_bits = EVP_PKEY_bits(public_key); if (modulus_length_bits < min_rsa_modulus_length_bits_) { errors->AddWarning( kRsaModulusTooSmall, diff --git a/naiveproxy/src/third_party/boringssl/src/pki/string_util.cc b/naiveproxy/src/third_party/boringssl/src/pki/string_util.cc index c2b91b967c..818c5fc12b 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/string_util.cc +++ b/naiveproxy/src/third_party/boringssl/src/pki/string_util.cc @@ -154,7 +154,7 @@ std::string CollapseWhitespaceASCII(std::string_view text, --chars_written; } } else { - // Non-whitespace chracters are copied straight across. + // Non-whitespace characters are copied straight across. in_whitespace = false; already_trimmed = false; result[chars_written++] = *i; diff --git a/naiveproxy/src/third_party/boringssl/src/pki/test_helpers.cc b/naiveproxy/src/third_party/boringssl/src/pki/test_helpers.cc index 32376146a3..3d7762f87c 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/test_helpers.cc +++ b/naiveproxy/src/third_party/boringssl/src/pki/test_helpers.cc @@ -145,7 +145,7 @@ der::Input SequenceValueFromString(std::string_view s) { // mappings_copy is used to keep track of which mappings have already been // satisfied (by nulling the |value| field). This is used to track when - // blocks are mulitply defined. + // blocks are multiply defined. std::vector mappings_copy(mappings, mappings + mappings_length); diff --git a/naiveproxy/src/third_party/boringssl/src/pki/verify.cc b/naiveproxy/src/third_party/boringssl/src/pki/verify.cc index c0ed8ad550..1ee57fff6b 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/verify.cc +++ b/naiveproxy/src/third_party/boringssl/src/pki/verify.cc @@ -207,7 +207,7 @@ std::optional>> CertificateVerifyInternal( if (opts.time.has_value()) { now = opts.time.value(); } else { - now = time(NULL); + now = time(nullptr); } der::GeneralizedTime verification_time; diff --git a/naiveproxy/src/third_party/boringssl/src/pki/verify_certificate_chain.cc b/naiveproxy/src/third_party/boringssl/src/pki/verify_certificate_chain.cc index 9bbad953eb..0134ae2e18 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/verify_certificate_chain.cc +++ b/naiveproxy/src/third_party/boringssl/src/pki/verify_certificate_chain.cc @@ -784,7 +784,7 @@ class PathVerifier { const std::set &user_initial_policy_set, bool allow_precertificate, CertErrors *errors); - // Enforces trust anchor constraints compatibile with RFC 5937. + // Enforces trust anchor constraints compatible with RFC 5937. // // Note that the anchor constraints are encoded via the attached certificate // itself. @@ -875,7 +875,7 @@ class PathVerifier { // * working_public_key_parameters // // They are combined for simplicity since the signature verification takes an - // EVP_PKEY, and the parameter inheritence is not applicable for the supported + // EVP_PKEY, and the parameter inheritance is not applicable for the supported // key types. |working_public_key_| may be null if parsing failed. // // An approximate explanation of |working_public_key_| is this description diff --git a/naiveproxy/src/third_party/boringssl/src/pki/verify_signed_data.cc b/naiveproxy/src/third_party/boringssl/src/pki/verify_signed_data.cc index e77dcc4ec9..f1ccb723a6 100644 --- a/naiveproxy/src/third_party/boringssl/src/pki/verify_signed_data.cc +++ b/naiveproxy/src/third_party/boringssl/src/pki/verify_signed_data.cc @@ -14,6 +14,8 @@ #include "verify_signed_data.h" +#include + #include #include #include @@ -151,15 +153,17 @@ bool ParsePublicKey(der::Input public_key_spki, bssl::UniquePtr *public_key) { // Parse the SPKI to an EVP_PKEY. OpenSSLErrStackTracer err_tracer; - - CBS cbs; - CBS_init(&cbs, public_key_spki.data(), public_key_spki.size()); - public_key->reset(EVP_parse_public_key(&cbs)); - if (!*public_key || CBS_len(&cbs) != 0) { - public_key->reset(); - return false; - } - return true; + const EVP_PKEY_ALG *const algs[] = { + EVP_pkey_rsa(), + EVP_pkey_ec_p256(), + EVP_pkey_ec_p384(), + // TODO(davidben): Remove P-521 from here, or let callers configure this. + // We don't advertise it in TLS. + EVP_pkey_ec_p521(), + }; + public_key->reset(EVP_PKEY_from_subject_public_key_info( + public_key_spki.data(), public_key_spki.size(), algs, std::size(algs))); + return *public_key != nullptr; } bool VerifySignedData(SignatureAlgorithm algorithm, der::Input signed_data, diff --git a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/cipher/mod.rs b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/cipher/mod.rs index ac797cd5e1..c628b9287d 100644 --- a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/cipher/mod.rs +++ b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/cipher/mod.rs @@ -182,7 +182,7 @@ impl Cipher { } fn apply_keystream_in_place(&mut self, buffer: &mut [u8]) -> Result<(), CipherError> { - // WARNING: This is not safe to re-use for the CBC mode of operation since it is applying + // WARNING: This is not safe to reuse for the CBC mode of operation since it is applying // the key stream in-place. assert_eq!( self.cipher_mode(), diff --git a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/ec.rs b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/ec.rs index 59bd1b2dde..987c27bc3c 100644 --- a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/ec.rs +++ b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/ec.rs @@ -71,13 +71,22 @@ pub enum Group { impl Group { fn as_ffi_ptr(self) -> *const bssl_sys::EC_GROUP { - // Safety: `group` is an address-space constant. These functions - // cannot fail and no resources need to be released in the future. + // Safety: These functions cannot fail and no resources need to be + // released in the future. match self { Group::P256 => unsafe { bssl_sys::EC_group_p256() }, Group::P384 => unsafe { bssl_sys::EC_group_p384() }, } } + + fn as_evp_pkey_alg(self) -> *const bssl_sys::EVP_PKEY_ALG { + // Safety: These functions cannot fail and no resources need to be + // released in the future. + match self { + Group::P256 => unsafe { bssl_sys::EVP_pkey_ec_p256() }, + Group::P384 => unsafe { bssl_sys::EVP_pkey_ec_p384() }, + } + } } /// Point is a valid, finite point on some curve. @@ -99,7 +108,7 @@ impl Point { Self { group, point } } - /// Construct a point by multipling the curve's base point by the given + /// Construct a point by multiplying the curve's base point by the given /// scalar. /// /// Safety: `scalar` must be a valid pointer. @@ -193,27 +202,18 @@ impl Point { } pub fn from_der_subject_public_key_info(group: Group, spki: &[u8]) -> Option { - let mut pkey = scoped::EvpPkey::from_ptr(parse_with_cbs( - spki, - // Safety: if called, `pkey` is the non-null result of `EVP_parse_public_key`. - |pkey| unsafe { bssl_sys::EVP_PKEY_free(pkey) }, - // Safety: `cbs` is a valid pointer in this context. - |cbs| unsafe { bssl_sys::EVP_parse_public_key(cbs) }, - )?); + let alg = group.as_evp_pkey_alg(); + let mut pkey = + scoped::EvpPkey::from_der_subject_public_key_info(spki, core::slice::from_ref(&alg))?; let ec_key = unsafe { bssl_sys::EVP_PKEY_get0_EC_KEY(pkey.as_ffi_ptr()) }; - if ec_key.is_null() { - // Not an ECC key. - return None; - } + // We only passed in one allowed algorithm, an EC algorithm. + assert!(!ec_key.is_null()); let parsed_group = unsafe { bssl_sys::EC_KEY_get0_group(ec_key) }; - if parsed_group != group.as_ffi_ptr() { - // ECC key for a different curve. - return None; - } + // We only passed in one allowed algorithm, this EC group. + assert!(parsed_group == group.as_ffi_ptr()); let point = unsafe { bssl_sys::EC_KEY_get0_public_key(ec_key) }; - if point.is_null() { - return None; - } + // A valid EC SPKI cannot be missing the public key. + assert!(!point.is_null()); // Safety: `ec_key` is still owned by `pkey` and doesn't need to be freed. Some(unsafe { Self::clone_from_ptr(parsed_group, point) }) } @@ -374,37 +374,19 @@ impl Key { /// Parses a PrivateKeyInfo structure (from RFC 5208). pub fn from_der_private_key_info(group: Group, der: &[u8]) -> Option { - let mut pkey = scoped::EvpPkey::from_ptr(parse_with_cbs( - der, - // Safety: in this context, `pkey` is the non-null result of - // `EVP_parse_private_key`. - |pkey| unsafe { bssl_sys::EVP_PKEY_free(pkey) }, - // Safety: `cbs` is valid per `parse_with_cbs`. - |cbs| unsafe { bssl_sys::EVP_parse_private_key(cbs) }, - )?); + let alg = group.as_evp_pkey_alg(); + let mut pkey = + scoped::EvpPkey::from_der_private_key_info(der, core::slice::from_ref(&alg))?; let ec_key = unsafe { bssl_sys::EVP_PKEY_get1_EC_KEY(pkey.as_ffi_ptr()) }; - if ec_key.is_null() { - return None; - } + // We only passed in one allowed algorithm, an EC algorithm. + assert!(!ec_key.is_null()); // Safety: `ec_key` is now owned by this function. let parsed_group = unsafe { bssl_sys::EC_KEY_get0_group(ec_key) }; - if parsed_group == group.as_ffi_ptr() { - // Safety: parsing an EC_KEY always set the public key. It should - // be impossible for the public key to be infinity, but double-check. - let is_infinite = unsafe { - bssl_sys::EC_POINT_is_at_infinity( - bssl_sys::EC_KEY_get0_group(ec_key), - bssl_sys::EC_KEY_get0_public_key(ec_key), - ) - }; - if is_infinite == 0 { - // Safety: `EVP_PKEY_get1_EC_KEY` returned ownership, which we can move - // into the returned object. - return Some(Self(ec_key)); - } - } - unsafe { bssl_sys::EC_KEY_free(ec_key) }; - None + // We only passed in one allowed algorithm, this EC group. + assert!(parsed_group == group.as_ffi_ptr()); + // Safety: `EVP_PKEY_get1_EC_KEY` returned ownership, which we can move + // into the returned object. + Some(Self(ec_key)) } /// Serializes this private key as a PrivateKeyInfo structure from RFC 5208. diff --git a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/ed25519.rs b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/ed25519.rs index 73c90fbe76..2056a74b01 100644 --- a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/ed25519.rs +++ b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/ed25519.rs @@ -35,8 +35,7 @@ //! ``` use crate::{ - cbb_to_buffer, parse_with_cbs, scoped, with_output_array, Buffer, FfiMutSlice, FfiSlice, - InvalidSignatureError, + cbb_to_buffer, scoped, with_output_array, Buffer, FfiMutSlice, FfiSlice, InvalidSignatureError, }; /// The length in bytes of an Ed25519 public key. @@ -154,39 +153,20 @@ impl PublicKey { /// Parse a public key in SubjectPublicKeyInfo format. pub fn from_der_subject_public_key_info(spki: &[u8]) -> Option { - let mut pkey = scoped::EvpPkey::from_ptr(parse_with_cbs( - spki, - // Safety: `pkey` is a non-null result from `EVP_parse_public_key` here. - |pkey| unsafe { bssl_sys::EVP_PKEY_free(pkey) }, - // Safety: cbs is valid per `parse_with_cbs`. - |cbs| unsafe { bssl_sys::EVP_parse_public_key(cbs) }, - )?); - - let mut out_len = 0; - // When the out buffer is null, `out_len` is set to the size of the raw public key. - // Safety: the arguments are valid. - let result = unsafe { - bssl_sys::EVP_PKEY_get_raw_public_key( - pkey.as_ffi_ptr(), - core::ptr::null_mut(), - &mut out_len, - ) - }; - if result != 1 { - return None; - } - if out_len != PUBLIC_KEY_LEN { - return None; - } - - // When the out buffer is not null, the raw public key is written into it. - // Safety: the arguments are valid. + // Safety: `EVP_pkey_ed25519` is always safe to call. + let alg = unsafe { bssl_sys::EVP_pkey_ed25519() }; + let mut pkey = + scoped::EvpPkey::from_der_subject_public_key_info(spki, core::slice::from_ref(&alg))?; let raw_pkey: [u8; PUBLIC_KEY_LEN] = unsafe { - with_output_array(|out, _| { + with_output_array(|out, mut out_len| { + // We only passed one key type, so `pkey` must be an Ed25519 + // key. The raw public key then must be available, and must be + // `PUBLIC_KEY_LEN` bytes. assert_eq!( 1, bssl_sys::EVP_PKEY_get_raw_public_key(pkey.as_ffi_ptr(), out, &mut out_len) ); + assert_eq!(out_len, PUBLIC_KEY_LEN); }) }; Some(PublicKey(raw_pkey)) @@ -196,9 +176,8 @@ impl PublicKey { pub fn to_der_subject_public_key_info(&self) -> Buffer { // Safety: this only copies from the `self.0` buffer. let mut pkey = scoped::EvpPkey::from_ptr(unsafe { - bssl_sys::EVP_PKEY_new_raw_public_key( - bssl_sys::EVP_PKEY_ED25519, - /*unused=*/ core::ptr::null_mut(), + bssl_sys::EVP_PKEY_from_raw_public_key( + bssl_sys::EVP_pkey_ed25519(), self.0.as_ffi_ptr(), PUBLIC_KEY_LEN, ) @@ -268,6 +247,14 @@ mod test { assert!(PublicKey::from_der_subject_public_key_info(b"").is_none()); } + #[test] + fn der_subject_public_key_info_wrong_type() { + // This is an X25519 key, not an Ed25519 key. + let spki = test_helpers::decode_hex_into_vec("302a300506032b656e032100e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c"); + // `from_der_subject_public_key_info` should reject it. + assert!(PublicKey::from_der_subject_public_key_info(&spki).is_none()); + } + #[test] fn empty_msg() { // Test Case 1 from RFC test vectors: https://www.rfc-editor.org/rfc/rfc8032#section-7.1 diff --git a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/hkdf.rs b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/hkdf.rs index 968e6441a2..fd740b835e 100644 --- a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/hkdf.rs +++ b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/hkdf.rs @@ -244,7 +244,7 @@ impl Prk { info.len(), ); // The output length is known to be within bounds so the only other - // possibily is an allocation failure, which we don't attempt to + // possibility is an allocation failure, which we don't attempt to // handle. assert_eq!(result, 1); }) diff --git a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/hpke.rs b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/hpke.rs index 82bb1c1a95..72bc31a0ae 100644 --- a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/hpke.rs +++ b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/hpke.rs @@ -82,6 +82,12 @@ pub enum Kem { P256HkdfSha256 = 16, // 0x0010 /// KEM using DHKEM X25519 and HKDF-SHA256. X25519HkdfSha256 = 32, // 0x0020 + /// X-Wing hybrid KEM. + XWing = 25722, // 0x647a + /// ML-KEM-768. + MlKem768 = 65, // 0x0041 + /// ML-KEM-1024. + MlKem1024 = 66, // 0x0042 } impl Kem { @@ -91,6 +97,9 @@ impl Kem { match self { Kem::P256HkdfSha256 => bssl_sys::EVP_hpke_p256_hkdf_sha256(), Kem::X25519HkdfSha256 => bssl_sys::EVP_hpke_x25519_hkdf_sha256(), + Kem::XWing => bssl_sys::EVP_hpke_xwing(), + Kem::MlKem768 => bssl_sys::EVP_hpke_mlkem768(), + Kem::MlKem1024 => bssl_sys::EVP_hpke_mlkem1024(), } } } @@ -99,6 +108,9 @@ impl Kem { match n { n if n == Kem::P256HkdfSha256 as u16 => Some(Self::P256HkdfSha256), n if n == Kem::X25519HkdfSha256 as u16 => Some(Self::X25519HkdfSha256), + n if n == Kem::XWing as u16 => Some(Self::XWing), + n if n == Kem::MlKem768 as u16 => Some(Self::MlKem768), + n if n == Kem::MlKem1024 as u16 => Some(Self::MlKem1024), _ => None, } } @@ -552,7 +564,7 @@ mod test { #[test] fn all_algorithms() { - let kems = vec![Kem::X25519HkdfSha256, Kem::P256HkdfSha256]; + let kems = vec![Kem::X25519HkdfSha256, Kem::P256HkdfSha256, Kem::XWing, Kem::MlKem768, Kem::MlKem1024]; let kdfs = vec![Kdf::HkdfSha256]; let aeads = vec![Aead::Aes128Gcm, Aead::Aes256Gcm, Aead::Chacha20Poly1305]; let plaintext: &[u8] = b"plaintext"; @@ -590,7 +602,7 @@ mod test { #[test] fn kem_public_from_private() { - let kems = vec![Kem::X25519HkdfSha256, Kem::P256HkdfSha256]; + let kems = vec![Kem::X25519HkdfSha256, Kem::P256HkdfSha256, Kem::XWing, Kem::MlKem768, Kem::MlKem1024]; for kem in &kems { let (pub_key, priv_key) = kem.generate_keypair(); assert_eq!(kem.public_from_private(&priv_key), Some(pub_key)); diff --git a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/lib.rs b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/lib.rs index 2a03e0bfd0..b30cbe16dc 100644 --- a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/lib.rs +++ b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/lib.rs @@ -79,15 +79,15 @@ pub struct InvalidSignatureError; /// the pointer. When passing pointers into C/C++ code, that is not a valid /// pointer. Thus this method should be used whenever passing a pointer to a /// slice into BoringSSL code. -trait FfiSlice { - fn as_ffi_ptr(&self) -> *const u8; +trait FfiSlice { + fn as_ffi_ptr(&self) -> *const T; fn as_ffi_void_ptr(&self) -> *const c_void { self.as_ffi_ptr() as *const c_void } } -impl FfiSlice for [u8] { - fn as_ffi_ptr(&self) -> *const u8 { +impl FfiSlice for [T] { + fn as_ffi_ptr(&self) -> *const T { if self.is_empty() { core::ptr::null() } else { @@ -96,8 +96,8 @@ impl FfiSlice for [u8] { } } -impl FfiSlice for [u8; N] { - fn as_ffi_ptr(&self) -> *const u8 { +impl FfiSlice for [T; N] { + fn as_ffi_ptr(&self) -> *const T { if N == 0 { core::ptr::null() } else { diff --git a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/mldsa.rs b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/mldsa.rs index 9ee28c578c..309c3da2d0 100644 --- a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/mldsa.rs +++ b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/mldsa.rs @@ -36,7 +36,8 @@ use crate::{ as_cbs, cbb_to_vec, initialized_boxed_struct, initialized_boxed_struct_fallible, - with_output_vec, with_output_vec_fallible, FfiSlice, InvalidSignatureError, + initialized_struct, with_output_vec, with_output_vec_fallible, FfiMutSlice, FfiSlice, + InvalidSignatureError, }; use alloc::{boxed::Box, vec::Vec}; use core::mem::MaybeUninit; @@ -56,6 +57,9 @@ pub const SIGNATURE_BYTES_65: usize = bssl_sys::MLDSA65_SIGNATURE_BYTES as usize /// The number of bytes in an ML-DSA seed value. pub const SEED_BYTES: usize = bssl_sys::MLDSA_SEED_BYTES as usize; +/// The number of bytes in an ML-DSA external mu. +pub const MU_BYTES: usize = bssl_sys::MLDSA_MU_BYTES as usize; + impl PrivateKey65 { /// Generates a random public/private key pair returning a serialized public /// key, a private key, and a private seed value that can be used to @@ -164,6 +168,27 @@ impl PrivateKey65 { }) } } + + /// Sign pre-hashed data. + pub fn sign_prehashed(&self, prehash: Prehash65) -> Vec { + let representative = prehash.finalize(); + unsafe { + // Safety: `signature` is the correct size via the type system and + // is always fully written; `representative` is an array of the + // correct size. + with_output_vec(SIGNATURE_BYTES_65, |signature| { + let ok = bssl_sys::MLDSA65_sign_message_representative( + signature, + &*self.0, + representative.as_ffi_ptr(), + ); + // This function can only fail if out of memory, which is not a + // case that this crate handles. + assert_eq!(ok, 1); + SIGNATURE_BYTES_65 + }) + } + } } impl PublicKey65 { @@ -237,6 +262,83 @@ impl PublicKey65 { } } } + + /// Verify pre-hashed data. + pub fn verify_prehashed( + &self, + prehash: Prehash65, + signature: &[u8], + ) -> Result<(), InvalidSignatureError> { + let representative = prehash.finalize(); + unsafe { + let ok = bssl_sys::MLDSA65_verify_message_representative( + &*self.0, + signature.as_ffi_ptr(), + signature.len(), + representative.as_ffi_ptr(), + ); + if ok == 1 { + Ok(()) + } else { + Err(InvalidSignatureError) + } + } + } + + /// Start a pre-hashing operation using this public key. + pub fn prehash(&self) -> Prehash65 { + unsafe { + // Safety: `self.0` is the correct size via the type system and + // is fully written if this function returns 1. + initialized_struct(|prehash: *mut Prehash65| { + let ok = bssl_sys::MLDSA65_prehash_init( + &mut (*prehash).0, + &*self.0, + core::ptr::null(), + 0, + ); + // This function can only fail if too much context is provided, but no context is + // used here. + assert_eq!(ok, 1); + }) + } + } +} + +/// An in-progress ML-DSA-65 pre-hashing operation. +pub struct Prehash65(bssl_sys::MLDSA65_prehash); + +impl Prehash65 { + /// Add data to the pre-hashing operation. + pub fn update(&mut self, data: &[u8]) { + unsafe { + // Safety: `self.0` is the correct size via the type system and `data` + // is a valid Rust slice. + bssl_sys::MLDSA65_prehash_update(&mut self.0, data.as_ffi_ptr(), data.len()); + } + } + + /// Complete the pre-hashing operation. + fn finalize(mut self) -> [u8; MU_BYTES] { + let mut mu = [0u8; MU_BYTES]; + unsafe { + // Safety: `self.0` is the correct size via the type system, as is `mu`. + bssl_sys::MLDSA65_prehash_finalize(mu.as_mut_ffi_ptr(), &mut self.0); + } + mu + } +} + +#[cfg(feature = "std")] +impl std::io::Write for Prehash65 { + fn write(&mut self, buf: &[u8]) -> std::io::Result { + self.update(buf); + Ok(buf.len()) + } + + fn flush(&mut self) -> std::io::Result<()> { + Ok(()) + } } #[cfg(test)] @@ -265,6 +367,87 @@ mod test { .is_ok()); } + #[test] + fn sign_prehashed() { + let (serialized_public_key, private_key, _private_seed) = PrivateKey65::generate(); + let public_key = PublicKey65::parse(&serialized_public_key).unwrap(); + let message = &[0u8, 1, 2, 3, 4, 5, 6]; + + let mut prehash = public_key.prehash(); + prehash.update(&message[0..2]); + prehash.update(&message[2..4]); + prehash.update(&message[4..]); + let mut signature = private_key.sign_prehashed(prehash); + + assert!(public_key.verify(message, &signature).is_ok()); + signature[5] ^= 1; + assert!(public_key.verify(message, &signature).is_err()); + } + + #[cfg(feature = "std")] + #[test] + fn sign_prehashed_write() { + use std::io::Write; + let (serialized_public_key, private_key, _private_seed) = PrivateKey65::generate(); + let public_key = PublicKey65::parse(&serialized_public_key).unwrap(); + let message = &[0u8, 1, 2, 3, 4, 5, 6]; + + let mut prehash = public_key.prehash(); + prehash.write(&message[0..2]).unwrap(); + prehash.write(&message[2..4]).unwrap(); + prehash.write(&message[4..]).unwrap(); + prehash.flush().unwrap(); + let mut signature = private_key.sign_prehashed(prehash); + + assert!(public_key.verify(message, &signature).is_ok()); + signature[5] ^= 1; + assert!(public_key.verify(message, &signature).is_err()); + } + + #[test] + fn verify_prehashed() { + let (serialized_public_key, private_key, _private_seed) = PrivateKey65::generate(); + let public_key = PublicKey65::parse(&serialized_public_key).unwrap(); + let message = &[0u8, 1, 2, 3, 4, 5, 6]; + + let signature = private_key.sign(message); + + let mut prehash = public_key.prehash(); + prehash.update(&message[0..2]); + prehash.update(&message[2..4]); + assert!(public_key.verify_prehashed(prehash, &signature).is_err()); + + let mut prehash = public_key.prehash(); + prehash.update(&message[0..2]); + prehash.update(&message[2..4]); + prehash.update(&message[4..]); + assert!(public_key.verify_prehashed(prehash, &signature).is_ok()); + } + + #[cfg(feature = "std")] + #[test] + fn verify_prehashed_write() { + use std::io::Write; + let (serialized_public_key, private_key, _private_seed) = PrivateKey65::generate(); + let public_key = PublicKey65::parse(&serialized_public_key).unwrap(); + let message = &[0u8, 1, 2, 3, 4, 5, 6]; + + let signature = private_key.sign(message); + + let mut prehash = public_key.prehash(); + prehash.write(&message[0..2]).unwrap(); + prehash.write(&message[2..4]).unwrap(); + prehash.flush().unwrap(); + assert!(public_key.verify_prehashed(prehash, &signature).is_err()); + + let mut prehash = public_key.prehash(); + prehash.write(&message[0..2]).unwrap(); + prehash.write(&message[2..4]).unwrap(); + prehash.write(&message[4..]).unwrap(); + prehash.flush().unwrap(); + assert!(public_key.verify_prehashed(prehash, &signature).is_ok()); + } + #[test] fn marshal_public_key() { let (serialized_public_key, private_key, _) = PrivateKey65::generate(); diff --git a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/rsa.rs b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/rsa.rs index 84539f7941..0f22d9f0e5 100644 --- a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/rsa.rs +++ b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/rsa.rs @@ -88,13 +88,10 @@ impl PublicKey { /// Parse a DER-encoded SubjectPublicKeyInfo. This format is found in, /// for example, X.509 certificates. pub fn from_der_subject_public_key_info(spki: &[u8]) -> Option { - let mut pkey = scoped::EvpPkey::from_ptr(parse_with_cbs( - spki, - // Safety: `pkey` is a non-null result from `EVP_parse_public_key` here. - |pkey| unsafe { bssl_sys::EVP_PKEY_free(pkey) }, - // Safety: cbs is valid per `parse_with_cbs`. - |cbs| unsafe { bssl_sys::EVP_parse_public_key(cbs) }, - )?); + // Safety: `EVP_pkey_rsa` is always safe to call. + let alg = unsafe { bssl_sys::EVP_pkey_rsa() }; + let mut pkey = + scoped::EvpPkey::from_der_subject_public_key_info(spki, core::slice::from_ref(&alg))?; let rsa = unsafe { bssl_sys::EVP_PKEY_get1_RSA(pkey.as_ffi_ptr()) }; if !rsa.is_null() { // Safety: `EVP_PKEY_get1_RSA` adds a reference so we are not @@ -222,18 +219,14 @@ impl PrivateKey { /// Parse a DER-encrypted PrivateKeyInfo struct (from RFC 5208). This is often called "PKCS#8 format". pub fn from_der_private_key_info(der: &[u8]) -> Option { - let mut pkey = scoped::EvpPkey::from_ptr(parse_with_cbs( - der, - // Safety: `ptr` is a non-null result from `EVP_parse_private_key` here. - |pkey| unsafe { bssl_sys::EVP_PKEY_free(pkey) }, - // Safety: `cbs` is valid per `parse_with_cbs`. - |cbs| unsafe { bssl_sys::EVP_parse_private_key(cbs) }, - )?); + // Safety: `EVP_pkey_rsa` is always safe to call. + let alg = unsafe { bssl_sys::EVP_pkey_rsa() }; + let mut pkey = + scoped::EvpPkey::from_der_private_key_info(der, core::slice::from_ref(&alg))?; // Safety: `pkey` is valid and was created just above. let rsa = unsafe { bssl_sys::EVP_PKEY_get1_RSA(pkey.as_ffi_ptr()) }; - if rsa.is_null() { - return None; - } + // We only passed one allowed algorithm, an RSA algorithm. + assert!(!rsa.is_null()); Some(Self(rsa)) } diff --git a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/scoped.rs b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/scoped.rs index 2a19c7b62f..4099c0a25f 100644 --- a/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/scoped.rs +++ b/naiveproxy/src/third_party/boringssl/src/rust/bssl-crypto/src/scoped.rs @@ -14,7 +14,7 @@ //! Helpers to ensure that some temporary objects are always freed. -use crate::initialized_struct; +use crate::{initialized_struct, FfiSlice}; /// A scoped `EC_KEY`. pub struct EvpPkey(*mut bssl_sys::EVP_PKEY); @@ -32,6 +32,48 @@ impl EvpPkey { EvpPkey(ptr) } + pub fn from_ptr_or_null(ptr: *mut bssl_sys::EVP_PKEY) -> Option { + if ptr.is_null() { + None + } else { + Some(EvpPkey::from_ptr(ptr)) + } + } + + pub fn from_der_subject_public_key_info( + spki: &[u8], + algs: &[*const bssl_sys::EVP_PKEY_ALG], + ) -> Option { + EvpPkey::from_ptr_or_null( + // Safety: Both input buffers are valid. + unsafe { + bssl_sys::EVP_PKEY_from_subject_public_key_info( + spki.as_ffi_ptr(), + spki.len(), + algs.as_ffi_ptr(), + algs.len(), + ) + }, + ) + } + + pub fn from_der_private_key_info( + spki: &[u8], + algs: &[*const bssl_sys::EVP_PKEY_ALG], + ) -> Option { + EvpPkey::from_ptr_or_null( + // Safety: Both input buffers are valid. + unsafe { + bssl_sys::EVP_PKEY_from_private_key_info( + spki.as_ffi_ptr(), + spki.len(), + algs.as_ffi_ptr(), + algs.len(), + ) + }, + ) + } + pub fn as_ffi_ptr(&mut self) -> *mut bssl_sys::EVP_PKEY { self.0 } diff --git a/naiveproxy/src/third_party/boringssl/src/rust/bssl-sys/CMakeLists.txt b/naiveproxy/src/third_party/boringssl/src/rust/bssl-sys/CMakeLists.txt index a5ca2c3a8f..c5ea3153dd 100644 --- a/naiveproxy/src/third_party/boringssl/src/rust/bssl-sys/CMakeLists.txt +++ b/naiveproxy/src/third_party/boringssl/src/rust/bssl-sys/CMakeLists.txt @@ -3,8 +3,10 @@ # the depfile using the same syntax as the command-line argument, and ninja # requires a path relative to the top-level build directory. set(wrapper_rs wrapper_${RUST_BINDINGS}.rs) -binary_dir_relative_path(${wrapper_rs} wrapper_rs_relative) -binary_dir_relative_path(${wrapper_rs}.d depfile_relative) +set(wrapper_rs_relative "${CMAKE_CURRENT_BINARY_DIR}/${wrapper_rs}") +set(depfile_relative "${CMAKE_CURRENT_BINARY_DIR}/${wrapper_rs}.d") +cmake_path(RELATIVE_PATH wrapper_rs_relative BASE_DIRECTORY "${CMAKE_BINARY_DIR}") +cmake_path(RELATIVE_PATH depfile_relative BASE_DIRECTORY "${CMAKE_BINARY_DIR}") add_custom_command( OUTPUT ${wrapper_rs} wrapper.c diff --git a/naiveproxy/src/third_party/boringssl/src/rust/bssl-sys/src/lib.rs b/naiveproxy/src/third_party/boringssl/src/rust/bssl-sys/src/lib.rs index a55bdffaa1..a1f79db0dd 100644 --- a/naiveproxy/src/third_party/boringssl/src/rust/bssl-sys/src/lib.rs +++ b/naiveproxy/src/third_party/boringssl/src/rust/bssl-sys/src/lib.rs @@ -2,7 +2,7 @@ // unnecessary_transmutes, needed to work around a Rust bug, is not available in // older Rusts. Stable lacks any way to condition code on Rust version, so the -// workaroud for a Rust bug below needs this additional Rust workaround. +// workaround for a Rust bug below needs this additional Rust workaround. #![allow(unknown_lints)] #![allow(non_upper_case_globals)] diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/bio_ssl.cc b/naiveproxy/src/third_party/boringssl/src/ssl/bio_ssl.cc index da7612a8cd..2a37398035 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/bio_ssl.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/bio_ssl.cc @@ -23,7 +23,7 @@ static SSL *get_ssl(BIO *bio) { return reinterpret_cast(bio->ptr); } static int ssl_read(BIO *bio, char *out, int outl) { SSL *ssl = get_ssl(bio); - if (ssl == NULL) { + if (ssl == nullptr) { return 0; } @@ -63,7 +63,7 @@ static int ssl_read(BIO *bio, char *out, int outl) { static int ssl_write(BIO *bio, const char *out, int outl) { SSL *ssl = get_ssl(bio); - if (ssl == NULL) { + if (ssl == nullptr) { return 0; } @@ -97,13 +97,13 @@ static int ssl_write(BIO *bio, const char *out, int outl) { static long ssl_ctrl(BIO *bio, int cmd, long num, void *ptr) { SSL *ssl = get_ssl(bio); - if (ssl == NULL && cmd != BIO_C_SET_SSL) { + if (ssl == nullptr && cmd != BIO_C_SET_SSL) { return 0; } switch (cmd) { case BIO_C_SET_SSL: - if (ssl != NULL) { + if (ssl != nullptr) { // OpenSSL allows reusing an SSL BIO with a different SSL object. We do // not support this. OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); @@ -156,7 +156,7 @@ static int ssl_new(BIO *bio) { return 1; } static int ssl_free(BIO *bio) { SSL *ssl = get_ssl(bio); - if (ssl == NULL) { + if (ssl == nullptr) { return 1; } @@ -170,7 +170,7 @@ static int ssl_free(BIO *bio) { static long ssl_callback_ctrl(BIO *bio, int cmd, BIO_info_cb *fp) { SSL *ssl = get_ssl(bio); - if (ssl == NULL) { + if (ssl == nullptr) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/d1_both.cc b/naiveproxy/src/third_party/boringssl/src/ssl/d1_both.cc index 4a02d260fa..a4a84b301f 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/d1_both.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/d1_both.cc @@ -195,7 +195,7 @@ static UniquePtr dtls_new_incoming_message( !CBB_add_u16(cbb.get(), msg_hdr->seq) || !CBB_add_u24(cbb.get(), 0 /* frag_off */) || !CBB_add_u24(cbb.get(), msg_hdr->msg_len) || - !CBB_finish(cbb.get(), NULL, NULL)) { + !CBB_finish(cbb.get(), nullptr, nullptr)) { return nullptr; } @@ -223,12 +223,12 @@ static DTLSIncomingMessage *dtls1_get_incoming_message( if (msg_hdr->seq < ssl->d1->handshake_read_seq || msg_hdr->seq - ssl->d1->handshake_read_seq >= SSL_MAX_HANDSHAKE_FLIGHT) { *out_alert = SSL_AD_INTERNAL_ERROR; - return NULL; + return nullptr; } size_t idx = msg_hdr->seq % SSL_MAX_HANDSHAKE_FLIGHT; DTLSIncomingMessage *frag = ssl->d1->incoming_messages[idx].get(); - if (frag != NULL) { + if (frag != nullptr) { assert(frag->seq == msg_hdr->seq); // The new fragment must be compatible with the previous fragments from this // message. @@ -236,7 +236,7 @@ static DTLSIncomingMessage *dtls1_get_incoming_message( frag->msg_len() != msg_hdr->msg_len) { OPENSSL_PUT_ERROR(SSL, SSL_R_FRAGMENT_MISMATCH); *out_alert = SSL_AD_ILLEGAL_PARAMETER; - return NULL; + return nullptr; } return frag; } @@ -245,7 +245,7 @@ static DTLSIncomingMessage *dtls1_get_incoming_message( ssl->d1->incoming_messages[idx] = dtls_new_incoming_message(msg_hdr); if (!ssl->d1->incoming_messages[idx]) { *out_alert = SSL_AD_INTERNAL_ERROR; - return NULL; + return nullptr; } return ssl->d1->incoming_messages[idx].get(); } @@ -337,6 +337,7 @@ bool dtls1_process_handshake_fragments(SSL *ssl, uint8_t *out_alert, // Copy the body into the fragment. Span dest = frag->msg().subspan(frag_off, CBS_len(&body)); + assert(dest.size() == CBS_len(&body)); OPENSSL_memcpy(dest.data(), CBS_data(&body), CBS_len(&body)); frag->reassembly.MarkRange(frag_off, frag_off + frag_len); } @@ -589,7 +590,7 @@ static bool add_outgoing(SSL *ssl, bool is_ccs, Array data) { } // TODO(svaldez): Move this up a layer to fix abstraction for SSLTranscript // on hs. - if (ssl->s3->hs != NULL && !ssl->s3->hs->transcript.Update(data)) { + if (ssl->s3->hs != nullptr && !ssl->s3->hs->transcript.Update(data)) { OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); return false; } @@ -646,12 +647,12 @@ static void dtls1_update_mtu(SSL *ssl) { // |SSL_set_mtu|. Does this need to be so complex? if (ssl->d1->mtu < dtls1_min_mtu() && !(SSL_get_options(ssl) & SSL_OP_NO_QUERY_MTU)) { - long mtu = BIO_ctrl(ssl->wbio.get(), BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL); + long mtu = BIO_ctrl(ssl->wbio.get(), BIO_CTRL_DGRAM_QUERY_MTU, 0, nullptr); if (mtu >= 0 && mtu <= (1 << 30) && (unsigned)mtu >= dtls1_min_mtu()) { ssl->d1->mtu = (unsigned)mtu; } else { ssl->d1->mtu = kDefaultMTU; - BIO_ctrl(ssl->wbio.get(), BIO_CTRL_DGRAM_SET_MTU, ssl->d1->mtu, NULL); + BIO_ctrl(ssl->wbio.get(), BIO_CTRL_DGRAM_SET_MTU, ssl->d1->mtu, nullptr); } } @@ -722,7 +723,7 @@ static seal_result_t seal_next_record(SSL *ssl, Span out, // Pack as many handshake fragments into one record as we can. We stage the // fragments in the output buffer, to be sealed in-place. bool should_continue = false; - Span fragments = out.subspan(prefix_len, max_in_len); + Span fragments = out.subspan(prefix_len, /* up to */ max_in_len); CBB cbb; CBB_init_fixed(&cbb, fragments.data(), fragments.size()); DTLSSentRecord sent_record; @@ -920,11 +921,7 @@ static int send_flight(SSL *ssl) { } } - if (BIO_flush(ssl->wbio.get()) <= 0) { - ssl->s3->rwstate = SSL_ERROR_WANT_WRITE; - return -1; - } - + ssl->d1->pending_flush = true; return 1; } @@ -1015,11 +1012,7 @@ static int send_ack(SSL *ssl) { return bio_ret; } - if (BIO_flush(ssl->wbio.get()) <= 0) { - ssl->s3->rwstate = SSL_ERROR_WANT_WRITE; - return -1; - } - + ssl->d1->pending_flush = true; return 1; } @@ -1062,6 +1055,14 @@ int dtls1_flush(SSL *ssl) { } } + if (ssl->d1->pending_flush) { + if (BIO_flush(ssl->wbio.get()) <= 0) { + ssl->s3->rwstate = SSL_ERROR_WANT_WRITE; + return -1; + } + ssl->d1->pending_flush = false; + } + return 1; } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/d1_lib.cc b/naiveproxy/src/third_party/boringssl/src/ssl/d1_lib.cc index c37e704ad2..01ff5b7766 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/d1_lib.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/d1_lib.cc @@ -36,6 +36,7 @@ DTLS1_STATE::DTLS1_STATE() handshake_read_overflow(false), sending_flight(false), sending_ack(false), + pending_flush(false), queued_key_update(QueuedKeyUpdate::kNone) {} DTLS1_STATE::~DTLS1_STATE() {} @@ -68,12 +69,12 @@ bool dtls1_new(SSL *ssl) { void dtls1_free(SSL *ssl) { tls_free(ssl); - if (ssl == NULL) { + if (ssl == nullptr) { return; } Delete(ssl->d1); - ssl->d1 = NULL; + ssl->d1 = nullptr; } void DTLSTimer::StartMicroseconds(OPENSSL_timeval now, uint64_t microseconds) { diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/d1_srtp.cc b/naiveproxy/src/third_party/boringssl/src/ssl/d1_srtp.cc index 198ed7b363..25759d7647 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/d1_srtp.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/d1_srtp.cc @@ -33,7 +33,7 @@ static const SRTP_PROTECTION_PROFILE kSRTPProfiles[] = { {"SRTP_AES128_CM_SHA1_32", SRTP_AES128_CM_SHA1_32}, {"SRTP_AEAD_AES_128_GCM", SRTP_AEAD_AES_128_GCM}, {"SRTP_AEAD_AES_256_GCM", SRTP_AEAD_AES_256_GCM}, - {0, 0}, + {nullptr, 0}, }; static int find_profile_by_name(const char *profile_name, diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/dtls_record.cc b/naiveproxy/src/third_party/boringssl/src/ssl/dtls_record.cc index da5c31800c..f5e4227263 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/dtls_record.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/dtls_record.cc @@ -504,7 +504,7 @@ bool dtls_seal_record(SSL *ssl, DTLSRecordNumber *out_number, uint8_t *out, } bool dtls13_header = use_dtls13_record_header(ssl, epoch); - uint8_t *extra_in = NULL; + uint8_t *extra_in = nullptr; size_t extra_in_len = 0; if (dtls13_header) { extra_in = &type; diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/encrypted_client_hello.cc b/naiveproxy/src/third_party/boringssl/src/ssl/encrypted_client_hello.cc index 5110508541..be01d9c0da 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/encrypted_client_hello.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/encrypted_client_hello.cc @@ -285,11 +285,21 @@ bool ssl_client_hello_decrypt(SSL_HANDSHAKE *hs, uint8_t *out_alert, // We assert with |uintptr_t| because the comparison would be UB if they // didn't alias. + // - |payload| must be contained in |extensions|. assert(reinterpret_cast(client_hello_outer->extensions) <= reinterpret_cast(payload.data())); assert(reinterpret_cast(client_hello_outer->extensions + client_hello_outer->extensions_len) >= reinterpret_cast(payload.data() + payload.size())); + // - |extensions| must be contained in |client_hello|. + assert(reinterpret_cast(client_hello_outer->client_hello) <= + reinterpret_cast(client_hello_outer->extensions)); + assert(reinterpret_cast(client_hello_outer->client_hello + + client_hello_outer->client_hello_len) >= + reinterpret_cast(client_hello_outer->extensions + + client_hello_outer->extensions_len)); + // From this then follows that |aad|, being a copy of |client_hello|, contains + // the |payload| byte range as well. Span payload_aad = Span(aad).subspan( payload.data() - client_hello_outer->client_hello, payload.size()); OPENSSL_memset(payload_aad.data(), 0, payload_aad.size()); @@ -584,7 +594,7 @@ bool ECHServerConfig::SetupContext(EVP_HPKE_CTX *ctx, uint16_t kdf_id, } assert(kdf_id == EVP_HPKE_HKDF_SHA256); - assert(get_ech_aead(aead_id) != NULL); + assert(get_ech_aead(aead_id) != nullptr); return EVP_HPKE_CTX_setup_recipient(ctx, key_.get(), EVP_hpke_hkdf_sha256(), get_ech_aead(aead_id), enc.data(), enc.size(), CBB_data(info_cbb.get()), diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/extensions.cc b/naiveproxy/src/third_party/boringssl/src/ssl/extensions.cc index b177e72c8f..c5f90688c5 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/extensions.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/extensions.cc @@ -102,6 +102,7 @@ static bool is_post_quantum_group(uint16_t id) { switch (id) { case SSL_GROUP_X25519_KYBER768_DRAFT00: case SSL_GROUP_X25519_MLKEM768: + case SSL_GROUP_MLKEM1024: return true; default: return false; @@ -199,19 +200,6 @@ bool ssl_client_hello_get_extension(const SSL_CLIENT_HELLO *client_hello, return false; } -static const uint16_t kDefaultGroups[] = { - SSL_GROUP_X25519, - SSL_GROUP_SECP256R1, - SSL_GROUP_SECP384R1, -}; - -Span tls1_get_grouplist(const SSL_HANDSHAKE *hs) { - if (!hs->config->supported_group_list.empty()) { - return hs->config->supported_group_list; - } - return Span(kDefaultGroups); -} - bool tls1_get_shared_group(SSL_HANDSHAKE *hs, uint16_t *out_group_id) { SSL *const ssl = hs->ssl; assert(ssl->server); @@ -222,10 +210,10 @@ bool tls1_get_shared_group(SSL_HANDSHAKE *hs, uint16_t *out_group_id) { // // However, in the interests of compatibility, we will skip ECDH if the // client didn't send an extension because we can't be sure that they'll - // support our favoured group. Thus we do not special-case an emtpy + // support our favoured group. Thus we do not special-case an empty // |peer_supported_group_list|. - Span groups = tls1_get_grouplist(hs); + Span groups = hs->config->supported_group_list; Span pref, supp; if (ssl->options & SSL_OP_CIPHER_SERVER_PREFERENCE) { pref = groups; @@ -263,7 +251,7 @@ bool tls1_check_group_id(const SSL_HANDSHAKE *hs, uint16_t group_id) { return false; } - for (uint16_t supported : tls1_get_grouplist(hs)) { + for (uint16_t supported : hs->config->supported_group_list) { if (supported == group_id) { return true; } @@ -452,7 +440,7 @@ bool ssl_parse_flags_extension_response(const CBS *cbs, SSLFlags *out, // is additionally passed two output |CBB|s. If the extension is the same // independent of the value of |type|, the callback may write to // |out_compressible| instead of |out|. When serializing the ClientHelloInner, -// all compressible extensions will be made continguous and replaced with +// all compressible extensions will be made contiguous and replaced with // ech_outer_extensions when encrypted. When serializing the ClientHelloOuter // or not offering ECH, |out| will be equal to |out_compressible|, so writing to // |out_compressible| still works. @@ -479,7 +467,7 @@ struct tls_extension { static bool forbid_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { - if (contents != NULL) { + if (contents != nullptr) { // Servers MUST NOT send this extension. *out_alert = SSL_AD_UNSUPPORTED_EXTENSION; OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION); @@ -534,7 +522,7 @@ static bool ext_sni_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { // The server may acknowledge SNI with an empty extension. We check the syntax // but otherwise ignore this signal. - return contents == NULL || CBS_len(contents) == 0; + return contents == nullptr || CBS_len(contents) == 0; } static bool ext_sni_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert, @@ -595,7 +583,7 @@ static bool ext_ech_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, static bool ext_ech_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { SSL *const ssl = hs->ssl; - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -707,7 +695,7 @@ static bool ext_ri_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, static bool ext_ri_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { SSL *const ssl = hs->ssl; - if (contents != NULL && ssl_protocol_version(ssl) >= TLS1_3_VERSION) { + if (contents != nullptr && ssl_protocol_version(ssl) >= TLS1_3_VERSION) { *out_alert = SSL_AD_ILLEGAL_PARAMETER; return false; } @@ -715,13 +703,13 @@ static bool ext_ri_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, // Servers may not switch between omitting the extension and supporting it. // See RFC 5746, sections 3.5 and 4.2. if (ssl->s3->initial_handshake_complete && - (contents != NULL) != ssl->s3->send_connection_binding) { + (contents != nullptr) != ssl->s3->send_connection_binding) { *out_alert = SSL_AD_HANDSHAKE_FAILURE; OPENSSL_PUT_ERROR(SSL, SSL_R_RENEGOTIATION_MISMATCH); return false; } - if (contents == NULL) { + if (contents == nullptr) { // Strictly speaking, if we want to avoid an attack we should *always* see // RI even on initial ServerHello because the client doesn't see any // renegotiation during an attack. However this would mean we could not @@ -788,7 +776,7 @@ static bool ext_ri_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert, return true; } - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -856,7 +844,7 @@ static bool ext_ems_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { SSL *const ssl = hs->ssl; - if (contents != NULL) { + if (contents != nullptr) { if (ssl_protocol_version(ssl) >= TLS1_3_VERSION || // CBS_len(contents) != 0) { return false; @@ -883,7 +871,7 @@ static bool ext_ems_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert, return true; } - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -948,7 +936,7 @@ static bool ext_ticket_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, static bool ext_ticket_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { SSL *const ssl = hs->ssl; - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -1016,7 +1004,7 @@ static bool ext_sigalgs_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, static bool ext_sigalgs_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { hs->peer_sigalgs.Reset(); - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -1058,7 +1046,7 @@ static bool ext_ocsp_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, static bool ext_ocsp_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { SSL *const ssl = hs->ssl; - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -1083,7 +1071,7 @@ static bool ext_ocsp_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, static bool ext_ocsp_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -1123,7 +1111,7 @@ static bool ext_npn_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, CBB *out_compressible, ssl_client_hello_type_t type) { const SSL *const ssl = hs->ssl; - if (ssl->ctx->next_proto_select_cb == NULL || + if (ssl->ctx->next_proto_select_cb == nullptr || // Do not allow NPN to change on renegotiation. ssl->s3->initial_handshake_complete || // NPN is not defined in DTLS or TLS 1.3. @@ -1143,7 +1131,7 @@ static bool ext_npn_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, static bool ext_npn_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { SSL *const ssl = hs->ssl; - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -1156,7 +1144,7 @@ static bool ext_npn_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, // called. assert(!ssl->s3->initial_handshake_complete); assert(!SSL_is_dtls(ssl)); - assert(ssl->ctx->next_proto_select_cb != NULL); + assert(ssl->ctx->next_proto_select_cb != nullptr); if (!ssl->s3->alpn_selected.empty()) { // NPN and ALPN may not be negotiated in the same connection. @@ -1199,13 +1187,13 @@ static bool ext_npn_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert, return true; } - if (contents != NULL && CBS_len(contents) != 0) { + if (contents != nullptr && CBS_len(contents) != 0) { return false; } - if (contents == NULL || // - ssl->s3->initial_handshake_complete || // - ssl->ctx->next_protos_advertised_cb == NULL || // + if (contents == nullptr || // + ssl->s3->initial_handshake_complete || // + ssl->ctx->next_protos_advertised_cb == nullptr || // SSL_is_dtls(ssl)) { return true; } @@ -1266,7 +1254,7 @@ static bool ext_sct_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, static bool ext_sct_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { SSL *const ssl = hs->ssl; - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -1304,7 +1292,7 @@ static bool ext_sct_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, static bool ext_sct_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -1374,7 +1362,7 @@ static bool ext_alpn_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, static bool ext_alpn_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { SSL *const ssl = hs->ssl; - if (contents == NULL) { + if (contents == nullptr) { if (SSL_is_quic(ssl)) { // ALPN is required when QUIC is used. OPENSSL_PUT_ERROR(SSL, SSL_R_NO_APPLICATION_PROTOCOL); @@ -1471,7 +1459,7 @@ bool ssl_negotiate_alpn(SSL_HANDSHAKE *hs, uint8_t *out_alert, const SSL_CLIENT_HELLO *client_hello) { SSL *const ssl = hs->ssl; CBS contents; - if (ssl->ctx->alpn_select_cb == NULL || + if (ssl->ctx->alpn_select_cb == nullptr || !ssl_client_hello_get_extension( client_hello, &contents, TLSEXT_TYPE_application_layer_protocol_negotiation)) { @@ -1592,7 +1580,7 @@ static bool ext_channel_id_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, static bool ext_channel_id_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -1611,7 +1599,8 @@ static bool ext_channel_id_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { SSL *const ssl = hs->ssl; - if (contents == NULL || !hs->config->channel_id_enabled || SSL_is_dtls(ssl)) { + if (contents == nullptr || !hs->config->channel_id_enabled || + SSL_is_dtls(ssl)) { return true; } @@ -1647,7 +1636,7 @@ static bool ext_srtp_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, const SSL *const ssl = hs->ssl; const STACK_OF(SRTP_PROTECTION_PROFILE) *profiles = SSL_get_srtp_profiles(ssl); - if (profiles == NULL || // + if (profiles == nullptr || // sk_SRTP_PROTECTION_PROFILE_num(profiles) == 0 || // !SSL_is_dtls(ssl)) { return true; @@ -1677,7 +1666,7 @@ static bool ext_srtp_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, static bool ext_srtp_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { SSL *const ssl = hs->ssl; - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -1721,7 +1710,7 @@ static bool ext_srtp_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { SSL *const ssl = hs->ssl; // DTLS-SRTP is only defined for DTLS. - if (contents == NULL || !SSL_is_dtls(ssl)) { + if (contents == nullptr || !SSL_is_dtls(ssl)) { return true; } @@ -1761,7 +1750,7 @@ static bool ext_srtp_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert, static bool ext_srtp_add_serverhello(SSL_HANDSHAKE *hs, CBB *out) { SSL *const ssl = hs->ssl; - if (ssl->s3->srtp_profile == NULL) { + if (ssl->s3->srtp_profile == nullptr) { return true; } @@ -1809,7 +1798,7 @@ static bool ext_ec_point_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, static bool ext_ec_point_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -1827,7 +1816,7 @@ static bool ext_ec_point_parse_serverhello(SSL_HANDSHAKE *hs, // point format. if (OPENSSL_memchr(CBS_data(&ec_point_format_list), TLSEXT_ECPOINTFORMAT_uncompressed, - CBS_len(&ec_point_format_list)) == NULL) { + CBS_len(&ec_point_format_list)) == nullptr) { *out_alert = SSL_AD_ILLEGAL_PARAMETER; return false; } @@ -2072,7 +2061,7 @@ static bool ext_psk_key_exchange_modes_add_clienthello( static bool ext_psk_key_exchange_modes_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -2086,7 +2075,7 @@ static bool ext_psk_key_exchange_modes_parse_clienthello(SSL_HANDSHAKE *hs, // We only support tickets with PSK_DHE_KE. hs->accept_psk_mode = OPENSSL_memchr(CBS_data(&ke_modes), SSL_PSK_DHE_KE, - CBS_len(&ke_modes)) != NULL; + CBS_len(&ke_modes)) != nullptr; return true; } @@ -2128,7 +2117,7 @@ static bool ext_early_data_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { SSL *const ssl = hs->ssl; - if (contents == NULL) { + if (contents == nullptr) { if (hs->early_data_offered && !ssl->s3->used_hello_retry_request) { ssl->s3->early_data_reason = ssl->s3->session_reused ? ssl_early_data_peer_declined @@ -2166,7 +2155,7 @@ static bool ext_early_data_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { SSL *const ssl = hs->ssl; - if (contents == NULL || ssl_protocol_version(ssl) < TLS1_3_VERSION) { + if (contents == nullptr || ssl_protocol_version(ssl) < TLS1_3_VERSION) { return true; } @@ -2200,8 +2189,7 @@ static bool ext_early_data_add_serverhello(SSL_HANDSHAKE *hs, CBB *out) { bool ssl_setup_key_shares(SSL_HANDSHAKE *hs, uint16_t override_group_id) { SSL *const ssl = hs->ssl; - hs->key_shares[0].reset(); - hs->key_shares[1].reset(); + hs->key_shares.clear(); hs->key_share_bytes.Reset(); // If offering a PAKE, do not set up key shares. We do not currently support @@ -2210,6 +2198,67 @@ bool ssl_setup_key_shares(SSL_HANDSHAKE *hs, uint16_t override_group_id) { return true; } + const Span supported_group_list = + hs->config->supported_group_list; + if (supported_group_list.empty()) { + OPENSSL_PUT_ERROR(SSL, SSL_R_NO_GROUPS_SPECIFIED); + return false; + } + + std::optional> selected_key_shares; + + // This is used for HelloRetryRequest, where we have already been given the + // correct group to use. + if (override_group_id != 0) { + assert(std::find(supported_group_list.begin(), supported_group_list.end(), + override_group_id) != supported_group_list.end()); + selected_key_shares.emplace(&override_group_id, 1u); + } + + // First try to predict the most preferred (by our preference order) group + // that was hinted by the server. + const auto &server_hint_list = ssl->config->server_supported_groups_hint; + if (!selected_key_shares.has_value() && !server_hint_list.empty()) { + for (const uint16_t &supported_group : supported_group_list) { + if (std::find(server_hint_list.begin(), server_hint_list.end(), + supported_group) != server_hint_list.end()) { + selected_key_shares.emplace(&supported_group, 1u); + break; + } + } + } + + // Otherwise, try to use explicitly configured key shares from the caller. + if (!selected_key_shares.has_value() && + ssl->config->client_key_share_selections.has_value()) { + selected_key_shares.emplace(*ssl->config->client_key_share_selections); + } + + // Run the default selection if we don't have anything better. + InplaceVector default_key_shares; + if (!selected_key_shares.has_value()) { + // By default, predict the most preferred group. + if (!default_key_shares.TryPushBack(supported_group_list[0])) { + return false; + } + // We'll try to include one post-quantum and one classical initial key + // share. + for (size_t i = 1; i < supported_group_list.size(); i++) { + if (is_post_quantum_group(default_key_shares[0]) == + is_post_quantum_group(supported_group_list[i])) { + continue; + } + if (!default_key_shares.TryPushBack(supported_group_list[i])) { + return false; + } + assert(default_key_shares[1] != default_key_shares[0]); + break; + } + selected_key_shares.emplace(default_key_shares); + } + + assert(selected_key_shares.has_value()); + bssl::ScopedCBB cbb; if (!CBB_init(cbb.get(), 64)) { return false; @@ -2224,43 +2273,14 @@ bool ssl_setup_key_shares(SSL_HANDSHAKE *hs, uint16_t override_group_id) { } } - uint16_t group_id = override_group_id; - uint16_t second_group_id = 0; - if (override_group_id == 0) { - // Predict the most preferred group. - Span groups = tls1_get_grouplist(hs); - if (groups.empty()) { - OPENSSL_PUT_ERROR(SSL, SSL_R_NO_GROUPS_SPECIFIED); - return false; - } - - group_id = groups[0]; - - // We'll try to include one post-quantum and one classical initial key - // share. - for (size_t i = 1; i < groups.size() && second_group_id == 0; i++) { - if (is_post_quantum_group(group_id) != is_post_quantum_group(groups[i])) { - second_group_id = groups[i]; - assert(second_group_id != group_id); - } - } - } - CBB key_exchange; - hs->key_shares[0] = SSLKeyShare::Create(group_id); - if (!hs->key_shares[0] || // - !CBB_add_u16(cbb.get(), group_id) || - !CBB_add_u16_length_prefixed(cbb.get(), &key_exchange) || - !hs->key_shares[0]->Generate(&key_exchange)) { - return false; - } - - if (second_group_id != 0) { - hs->key_shares[1] = SSLKeyShare::Create(second_group_id); - if (!hs->key_shares[1] || // - !CBB_add_u16(cbb.get(), second_group_id) || - !CBB_add_u16_length_prefixed(cbb.get(), &key_exchange) || - !hs->key_shares[1]->Generate(&key_exchange)) { + for (const uint16_t group_id : *selected_key_shares) { + UniquePtr key_share = SSLKeyShare::Create(group_id); + if (key_share == nullptr || // + !CBB_add_u16(cbb.get(), group_id) || // + !CBB_add_u16_length_prefixed(cbb.get(), &key_exchange) || // + !key_share->Generate(&key_exchange) || // + !hs->key_shares.TryPushBack(std::move(key_share))) { return false; } } @@ -2277,7 +2297,12 @@ static bool ext_key_share_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, return true; } - assert(!hs->key_share_bytes.empty()); + // The caller may explicitly configure empty key shares to request a + // HelloRetryRequest. + assert(!hs->key_share_bytes.empty() || + (hs->config->client_key_share_selections.has_value() && + hs->config->client_key_share_selections->empty())); + CBB contents, kse_bytes; if (!CBB_add_u16(out_compressible, TLSEXT_TYPE_key_share) || !CBB_add_u16_length_prefixed(out_compressible, &contents) || @@ -2294,13 +2319,9 @@ static bool ext_key_share_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, bool ssl_ext_key_share_parse_serverhello(SSL_HANDSHAKE *hs, Array *out_secret, uint8_t *out_alert, CBS *contents) { - if (hs->key_shares[0] == nullptr) { - // If we did not offer key shares, the extension should have been rejected - // as unsolicited. - OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); - *out_alert = SSL_AD_INTERNAL_ERROR; - return false; - } + // If we did not offer key shares, the extension should have been rejected + // as unsolicited. + assert(!hs->key_shares.empty()); CBS ciphertext; uint16_t group_id; @@ -2312,24 +2333,23 @@ bool ssl_ext_key_share_parse_serverhello(SSL_HANDSHAKE *hs, return false; } - SSLKeyShare *key_share = hs->key_shares[0].get(); - if (key_share->GroupID() != group_id) { - if (!hs->key_shares[1] || hs->key_shares[1]->GroupID() != group_id) { - *out_alert = SSL_AD_ILLEGAL_PARAMETER; - OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE); - return false; - } - key_share = hs->key_shares[1].get(); + const auto key_share_it = + std::find_if(hs->key_shares.begin(), hs->key_shares.end(), + [group_id](const auto &key_share) { + return key_share->GroupID() == group_id; + }); + if (key_share_it == hs->key_shares.end()) { + *out_alert = SSL_AD_ILLEGAL_PARAMETER; + OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE); + return false; } - - if (!key_share->Decap(out_secret, out_alert, ciphertext)) { + if (!(*key_share_it)->Decap(out_secret, out_alert, ciphertext)) { *out_alert = SSL_AD_INTERNAL_ERROR; return false; } hs->new_session->group_id = group_id; - hs->key_shares[0].reset(); - hs->key_shares[1].reset(); + hs->key_shares.clear(); return true; } @@ -2520,7 +2540,7 @@ static bool ext_supported_groups_add_clienthello(const SSL_HANDSHAKE *hs, return false; } - for (uint16_t group : tls1_get_grouplist(hs)) { + for (uint16_t group : hs->config->supported_group_list) { if (is_post_quantum_group(group) && hs->max_version < TLS1_3_VERSION) { continue; } @@ -2566,7 +2586,7 @@ static bool parse_u16_array(const CBS *cbs, Array *out) { static bool ext_supported_groups_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -2593,9 +2613,9 @@ static bool ext_certificate_authorities_add_clienthello( if (ssl_has_CA_names(hs->config)) { CBB ca_contents; if (!CBB_add_u16(out_compressible, - TLSEXT_TYPE_certificate_authorities) || // - !CBB_add_u16_length_prefixed(out_compressible, &ca_contents) || // - !ssl_add_CA_names(hs, &ca_contents) || // + TLSEXT_TYPE_certificate_authorities) || // + !CBB_add_u16_length_prefixed(out_compressible, &ca_contents) || // + !ssl_add_CA_names(hs, &ca_contents) || // !CBB_flush(out_compressible)) { return false; } @@ -2606,7 +2626,7 @@ static bool ext_certificate_authorities_add_clienthello( static bool ext_certificate_authorities_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert, CBS *contents) { - if (contents == NULL) { + if (contents == nullptr) { return true; } @@ -3201,7 +3221,7 @@ bool ssl_ext_pake_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t prover_secret[spake2plus::kSecretSize]; if (!hs->pake_prover->ComputeConfirmation( prover_confirm, prover_secret, - pake_msg_span.subspan(0, spake2plus::kShareSize), + pake_msg_span.first(), pake_msg_span.subspan(spake2plus::kShareSize))) { // Record a failure before releasing the answer to the client. hs->credential->ClaimPAKEAttempt(); @@ -3712,10 +3732,10 @@ static const struct tls_extension kExtensions[] = { #define kNumExtensions (sizeof(kExtensions) / sizeof(struct tls_extension)) static_assert(kNumExtensions <= - sizeof(((SSL_HANDSHAKE *)NULL)->extensions.sent) * 8, + sizeof(((SSL_HANDSHAKE *)nullptr)->extensions.sent) * 8, "too many extensions for sent bitset"); static_assert(kNumExtensions <= - sizeof(((SSL_HANDSHAKE *)NULL)->extensions.received) * 8, + sizeof(((SSL_HANDSHAKE *)nullptr)->extensions.received) * 8, "too many extensions for received bitset"); bool ssl_setup_extension_permutation(SSL_HANDSHAKE *hs) { @@ -3752,7 +3772,7 @@ static const struct tls_extension *tls_extension_find(uint32_t *out_index, } } - return NULL; + return nullptr; } static bool add_padding_extension(CBB *cbb, uint16_t ext, size_t len) { @@ -3773,7 +3793,7 @@ static bool ssl_add_clienthello_tlsext_inner(SSL_HANDSHAKE *hs, CBB *out, // ClientHellos concurrently, to handle compression. Uncompressed extensions // are written to |extensions| and copied to |extensions_encoded|. Compressed // extensions are buffered in |compressed| and written to the end. (ECH can - // only compress continguous extensions.) + // only compress contiguous extensions.) SSL *const ssl = hs->ssl; bssl::ScopedCBB compressed, outer_extensions; CBB extensions, extensions_encoded; @@ -4053,7 +4073,7 @@ static bool ssl_scan_clienthello_tlsext(SSL_HANDSHAKE *hs, unsigned ext_index; const struct tls_extension *const ext = tls_extension_find(&ext_index, type); - if (ext == NULL) { + if (ext == nullptr) { continue; } @@ -4072,11 +4092,11 @@ static bool ssl_scan_clienthello_tlsext(SSL_HANDSHAKE *hs, continue; } - CBS *contents = NULL, fake_contents; + CBS *contents = nullptr, fake_contents; static const uint8_t kFakeRenegotiateExtension[] = {0}; if (kExtensions[i].value == TLSEXT_TYPE_renegotiate && - ssl_client_cipher_list_contains_cipher(client_hello, - SSL3_CK_SCSV & 0xffff)) { + ssl_client_cipher_list_contains_cipher( + client_hello, SSL_CIPHER_EMPTY_RENEGOTIATION_INFO_SCSV)) { // The renegotiation SCSV was received so pretend that we received a // renegotiation extension. CBS_init(&fake_contents, kFakeRenegotiateExtension, @@ -4140,7 +4160,7 @@ static bool ssl_scan_serverhello_tlsext(SSL_HANDSHAKE *hs, const CBS *cbs, const struct tls_extension *const ext = tls_extension_find(&ext_index, type); - if (ext == NULL) { + if (ext == nullptr) { OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION); ERR_add_error_dataf("extension %u", (unsigned)type); *out_alert = SSL_AD_UNSUPPORTED_EXTENSION; @@ -4174,7 +4194,7 @@ static bool ssl_scan_serverhello_tlsext(SSL_HANDSHAKE *hs, const CBS *cbs, // Extension wasn't observed so call the callback with a NULL // parameter. uint8_t alert = SSL_AD_DECODE_ERROR; - if (!kExtensions[i].parse_serverhello(hs, &alert, NULL)) { + if (!kExtensions[i].parse_serverhello(hs, &alert, nullptr)) { OPENSSL_PUT_ERROR(SSL, SSL_R_MISSING_EXTENSION); ERR_add_error_dataf("extension %u", (unsigned)kExtensions[i].value); *out_alert = alert; @@ -4190,9 +4210,9 @@ static bool ssl_check_clienthello_tlsext(SSL_HANDSHAKE *hs) { SSL *const ssl = hs->ssl; int ret = SSL_TLSEXT_ERR_NOACK; int al = SSL_AD_UNRECOGNIZED_NAME; - if (ssl->ctx->servername_callback != 0) { + if (ssl->ctx->servername_callback != nullptr) { ret = ssl->ctx->servername_callback(ssl, &al, ssl->ctx->servername_arg); - } else if (ssl->session_ctx->servername_callback != 0) { + } else if (ssl->session_ctx->servername_callback != nullptr) { ret = ssl->session_ctx->servername_callback( ssl, &al, ssl->session_ctx->servername_arg); } @@ -4273,7 +4293,7 @@ static enum ssl_ticket_aead_result_t decrypt_ticket_with_cipher_ctx( auto ticket_mac = ticket.last(mac_len); ticket = ticket.first(ticket.size() - mac_len); HMAC_Update(hmac_ctx, ticket.data(), ticket.size()); - HMAC_Final(hmac_ctx, mac, NULL); + HMAC_Final(hmac_ctx, mac, nullptr); assert(mac_len == ticket_mac.size()); bool mac_ok = CRYPTO_memcmp(mac, ticket_mac.data(), mac_len) == 0; if (CRYPTO_fuzzer_mode_enabled()) { @@ -4317,11 +4337,11 @@ static enum ssl_ticket_aead_result_t ssl_decrypt_ticket_with_cb( assert(ticket.size() >= SSL_TICKET_KEY_NAME_LEN + EVP_MAX_IV_LENGTH); ScopedEVP_CIPHER_CTX cipher_ctx; ScopedHMAC_CTX hmac_ctx; - auto name = ticket.subspan(0, SSL_TICKET_KEY_NAME_LEN); + auto name = ticket.first(); // The actual IV is shorter, but the length is determined by the callback's // chosen cipher. Instead we pass in |EVP_MAX_IV_LENGTH| worth of IV to ensure // the callback has enough. - auto iv = ticket.subspan(SSL_TICKET_KEY_NAME_LEN, EVP_MAX_IV_LENGTH); + auto iv = ticket.subspan(); int cb_ret = hs->ssl->session_ctx->ticket_key_cb( hs->ssl, const_cast(name.data()), const_cast(iv.data()), cipher_ctx.get(), hmac_ctx.get(), @@ -4350,7 +4370,7 @@ static enum ssl_ticket_aead_result_t ssl_decrypt_ticket_with_ticket_keys( } const EVP_CIPHER *cipher = EVP_aes_128_cbc(); - auto name = ticket.subspan(0, SSL_TICKET_KEY_NAME_LEN); + auto name = ticket.first(); auto iv = ticket.subspan(SSL_TICKET_KEY_NAME_LEN, EVP_CIPHER_iv_length(cipher)); @@ -4368,8 +4388,8 @@ static enum ssl_ticket_aead_result_t ssl_decrypt_ticket_with_ticket_keys( return ssl_ticket_aead_ignore_ticket; } if (!HMAC_Init_ex(hmac_ctx.get(), key->hmac_key, sizeof(key->hmac_key), - tlsext_tick_md(), NULL) || - !EVP_DecryptInit_ex(cipher_ctx.get(), cipher, NULL, key->aes_key, + tlsext_tick_md(), nullptr) || + !EVP_DecryptInit_ex(cipher_ctx.get(), cipher, nullptr, key->aes_key, iv.data())) { return ssl_ticket_aead_error; } @@ -4437,7 +4457,7 @@ enum ssl_ticket_aead_result_t ssl_process_ticket( } } else if (!is_psk && hints && !hs->hints_requested && hints->ignore_ticket) { result = ssl_ticket_aead_ignore_ticket; - } else if (ssl->session_ctx->ticket_aead_method != NULL) { + } else if (ssl->session_ctx->ticket_aead_method != nullptr) { result = ssl_decrypt_ticket_with_method(hs, &plaintext, out_renew_ticket, ticket); } else { @@ -4447,7 +4467,7 @@ enum ssl_ticket_aead_result_t ssl_process_ticket( // HMAC. if (ticket.size() < SSL_TICKET_KEY_NAME_LEN + EVP_MAX_IV_LENGTH) { result = ssl_ticket_aead_ignore_ticket; - } else if (ssl->session_ctx->ticket_key_cb != NULL) { + } else if (ssl->session_ctx->ticket_key_cb != nullptr) { result = ssl_decrypt_ticket_with_cb(hs, &plaintext, out_renew_ticket, ticket); } else { @@ -4559,7 +4579,8 @@ bool tls1_choose_signature_algorithm(SSL_HANDSHAKE *hs, } Span sigalgs = - cred->sigalgs.empty() ? Span(kSignSignatureAlgorithms) : cred->sigalgs; + cred->sigalgs.empty() ? Span(kSignSignatureAlgorithms) + : Span(cred->sigalgs); for (uint16_t sigalg : sigalgs) { if (!ssl_pkey_supports_algorithm(ssl, cred->pubkey.get(), sigalg, /*is_verify=*/false)) { @@ -4601,10 +4622,10 @@ bool tls1_verify_channel_id(SSL_HANDSHAKE *hs, const SSLMessage &msg) { } const uint8_t *p = CBS_data(&extension); - if (BN_bin2bn(p + 0, 32, x.get()) == NULL || - BN_bin2bn(p + 32, 32, y.get()) == NULL || - BN_bin2bn(p + 64, 32, sig->r) == NULL || - BN_bin2bn(p + 96, 32, sig->s) == NULL) { + if (BN_bin2bn(p + 0, 32, x.get()) == nullptr || + BN_bin2bn(p + 32, 32, y.get()) == nullptr || + BN_bin2bn(p + 64, 32, sig->r) == nullptr || + BN_bin2bn(p + 96, 32, sig->s) == nullptr) { return false; } @@ -4699,7 +4720,7 @@ bool tls1_channel_id_hash(SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len) { static const char kClientIDMagic[] = "TLS Channel ID signature"; SHA256_Update(&ctx, kClientIDMagic, sizeof(kClientIDMagic)); - if (ssl->session != NULL) { + if (ssl->session != nullptr) { static const char kResumptionMagic[] = "Resumption"; SHA256_Update(&ctx, kResumptionMagic, sizeof(kResumptionMagic)); if (ssl->session->original_handshake_hash.empty()) { @@ -4726,7 +4747,7 @@ bool tls1_record_handshake_hashes_for_channel_id(SSL_HANDSHAKE *hs) { // This function should never be called for a resumed session because the // handshake hashes that we wish to record are for the original, full // handshake. - if (ssl->session != NULL) { + if (ssl->session != nullptr) { return false; } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/handoff.cc b/naiveproxy/src/third_party/boringssl/src/ssl/handoff.cc index a24d741d5d..8dfc5f9a16 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/handoff.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/handoff.cc @@ -17,6 +17,8 @@ #include #include +#include + #include "../crypto/internal.h" #include "internal.h" @@ -48,7 +50,7 @@ static bool serialize_features(CBB *out) { } Span all_ciphers = AllCiphers(); for (const SSL_CIPHER &cipher : all_ciphers) { - if (!CBB_add_u16(&ciphers, static_cast(cipher.id))) { + if (!CBB_add_u16(&ciphers, cipher.protocol_id)) { return false; } } @@ -115,7 +117,7 @@ bool SSL_decline_handoff(SSL *ssl) { } // apply_remote_features reads a list of supported features from |in| and -// (possibly) reconfigures |ssl| to disallow the negotation of features whose +// (possibly) reconfigures |ssl| to disallow the negotiation of features whose // support has not been indicated. (This prevents the the handshake from // committing to features that are not supported on the handoff/handback side.) static bool apply_remote_features(SSL *ssl, CBS *in) { @@ -186,21 +188,15 @@ static bool apply_remote_features(SSL *ssl, CBS *in) { supported_groups[idx++] = group; } Span configured_groups = - tls1_get_grouplist(ssl->s3->hs.get()); + ssl->s3->hs->config->supported_group_list; Array new_configured_groups; if (!new_configured_groups.InitForOverwrite(configured_groups.size())) { return false; } idx = 0; for (uint16_t configured_group : configured_groups) { - bool ok = false; - for (uint16_t supported_group : supported_groups) { - if (supported_group == configured_group) { - ok = true; - break; - } - } - if (ok) { + if (std::find(supported_groups.begin(), supported_groups.end(), + configured_group) != supported_groups.end()) { new_configured_groups[idx++] = configured_group; } } @@ -760,9 +756,10 @@ bool SSL_apply_handback(SSL *ssl, Span handback) { !CBS_get_asn1(&key_share, &private_key, CBS_ASN1_OCTETSTRING)) { return false; } - hs->key_shares[0] = SSLKeyShare::Create(group_id); - if (!hs->key_shares[0] || - !hs->key_shares[0]->DeserializePrivateKey(&private_key)) { + UniquePtr ssl_key_share = SSLKeyShare::Create(group_id); + if (ssl_key_share == nullptr || + !ssl_key_share->DeserializePrivateKey(&private_key) || + !hs->key_shares.TryPushBack(std::move(ssl_key_share))) { return false; } } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/handshake.cc b/naiveproxy/src/third_party/boringssl/src/ssl/handshake.cc index 1b1a9b566a..88b42a79f3 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/handshake.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/handshake.cc @@ -20,6 +20,7 @@ #include #include +#include #include #include "../crypto/internal.h" @@ -229,7 +230,7 @@ bool ssl_parse_extensions(const CBS *cbs, uint8_t *out_alert, enum ssl_verify_result_t ssl_verify_peer_cert(SSL_HANDSHAKE *hs) { SSL *const ssl = hs->ssl; const SSL_SESSION *prev_session = ssl->s3->established_session.get(); - if (prev_session != NULL) { + if (prev_session != nullptr) { // If renegotiating, the server must not change the server certificate. See // https://mitls.org/pages/attacks/3SHAKE. We never resume on renegotiation, // so this check is sufficient to ensure the reported peer certificate never @@ -548,9 +549,8 @@ int ssl_run_handshake(SSL_HANDSHAKE *hs, bool *out_early_return) { } if (ret == ssl_open_record_error && hs->wait == ssl_hs_read_server_hello) { - uint32_t err = ERR_peek_error(); - if (ERR_GET_LIB(err) == ERR_LIB_SSL && - ERR_GET_REASON(err) == SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE) { + if (ERR_equals(ERR_peek_error(), ERR_LIB_SSL, + SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE)) { // Add a dedicated error code to the queue for a handshake_failure // alert in response to ClientHello. This matches NSS's client // behavior and gives a better error on a (probable) failure to diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/handshake_client.cc b/naiveproxy/src/third_party/boringssl/src/ssl/handshake_client.cc index 77d02fde50..c96dedc4db 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/handshake_client.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/handshake_client.cc @@ -76,7 +76,7 @@ static void ssl_get_client_disabled(const SSL_HANDSHAKE *hs, *out_mask_k = 0; // PSK requires a client callback. - if (hs->config->psk_client_callback == NULL) { + if (hs->config->psk_client_callback == nullptr) { *out_mask_a |= SSL_aPSK; *out_mask_k |= SSL_kPSK; } @@ -111,19 +111,19 @@ static bool ssl_write_client_cipher_list(const SSL_HANDSHAKE *hs, CBB *out, // hardware support. if (hs->max_version >= TLS1_3_VERSION) { static const uint16_t kCiphersNoAESHardware[] = { - TLS1_3_CK_CHACHA20_POLY1305_SHA256 & 0xffff, - TLS1_3_CK_AES_128_GCM_SHA256 & 0xffff, - TLS1_3_CK_AES_256_GCM_SHA384 & 0xffff, + SSL_CIPHER_CHACHA20_POLY1305_SHA256, + SSL_CIPHER_AES_128_GCM_SHA256, + SSL_CIPHER_AES_256_GCM_SHA384, }; static const uint16_t kCiphersAESHardware[] = { - TLS1_3_CK_AES_128_GCM_SHA256 & 0xffff, - TLS1_3_CK_AES_256_GCM_SHA384 & 0xffff, - TLS1_3_CK_CHACHA20_POLY1305_SHA256 & 0xffff, + SSL_CIPHER_AES_128_GCM_SHA256, + SSL_CIPHER_AES_256_GCM_SHA384, + SSL_CIPHER_CHACHA20_POLY1305_SHA256, }; static const uint16_t kCiphersCNSA[] = { - TLS1_3_CK_AES_256_GCM_SHA384 & 0xffff, - TLS1_3_CK_AES_128_GCM_SHA256 & 0xffff, - TLS1_3_CK_CHACHA20_POLY1305_SHA256 & 0xffff, + SSL_CIPHER_AES_256_GCM_SHA384, + SSL_CIPHER_AES_128_GCM_SHA256, + SSL_CIPHER_CHACHA20_POLY1305_SHA256, }; const bool has_aes_hw = ssl->config->aes_hw_override @@ -169,7 +169,7 @@ static bool ssl_write_client_cipher_list(const SSL_HANDSHAKE *hs, CBB *out, } if (ssl->mode & SSL_MODE_SEND_FALLBACK_SCSV) { - if (!CBB_add_u16(&child, SSL3_CK_FALLBACK_SCSV & 0xffff)) { + if (!CBB_add_u16(&child, SSL_CIPHER_FALLBACK_SCSV)) { return false; } } @@ -240,7 +240,7 @@ bool ssl_add_client_hello(SSL_HANDSHAKE *hs) { // ClientHellOuterAAD computation would break. assert(type != ssl_client_hello_outer); if (!tls13_write_psk_binder(hs, hs->transcript, Span(msg), - /*out_binder_len=*/0)) { + /*out_binder_len=*/nullptr)) { return false; } } @@ -665,8 +665,7 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) { } // Clear some TLS 1.3 state that no longer needs to be retained. - hs->key_shares[0].reset(); - hs->key_shares[1].reset(); + hs->key_shares.clear(); ssl_done_writing_client_hello(hs); // TLS 1.2 handshakes cannot accept ECH. @@ -688,7 +687,7 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) { sizeof(kJDK11DowngradeRandom) == sizeof(kTLS13DowngradeRandom), "downgrade signals have different size"); auto suffix = - Span(ssl->s3->server_random).last(sizeof(kTLS13DowngradeRandom)); + Span(ssl->s3->server_random).last(); if (suffix == kTLS12DowngradeRandom || suffix == kTLS13DowngradeRandom || suffix == kJDK11DowngradeRandom) { OPENSSL_PUT_ERROR(SSL, SSL_R_TLS13_DOWNGRADE); @@ -750,7 +749,7 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) { ssl->s3->session_reused = true; } else { // The session wasn't resumed. Create a fresh SSL_SESSION to fill out. - ssl_set_session(ssl, NULL); + ssl_set_session(ssl, nullptr); if (!ssl_get_new_session(hs)) { ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); return ssl_hs_error; @@ -774,7 +773,7 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) { // If doing a full handshake, the server may request a client certificate // which requires hashing the handshake transcript. Otherwise, the handshake // buffer may be released. - if (ssl->session != NULL || + if (ssl->session != nullptr || !ssl_cipher_uses_certificate_auth(hs->new_cipher)) { hs->transcript.FreeBuffer(); } @@ -791,7 +790,7 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) { return ssl_hs_error; } - if (ssl->session != NULL && + if (ssl->session != nullptr && hs->extended_master_secret != ssl->session->extended_master_secret) { if (ssl->session->extended_master_secret) { OPENSSL_PUT_ERROR(SSL, SSL_R_RESUMED_EMS_SESSION_WITHOUT_EMS_EXTENSION); @@ -804,7 +803,7 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) { ssl->method->next_message(ssl); - if (ssl->session != NULL) { + if (ssl->session != nullptr) { if (ssl->ctx->reverify_on_resume && ssl_cipher_uses_certificate_auth(hs->new_cipher)) { hs->state = state_reverify_server_certificate; @@ -849,7 +848,7 @@ static enum ssl_hs_wait_t do_read_server_certificate(SSL_HANDSHAKE *hs) { CBS body = msg.body; uint8_t alert = SSL_AD_DECODE_ERROR; if (!ssl_parse_cert_chain(&alert, &hs->new_session->certs, &hs->peer_pubkey, - NULL, &body, ssl->ctx->pool)) { + nullptr, &body, ssl->ctx->pool)) { ssl_send_alert(ssl, SSL3_AL_FATAL, alert); return ssl_hs_error; } @@ -1380,7 +1379,7 @@ static enum ssl_hs_wait_t do_send_client_key_exchange(SSL_HANDSHAKE *hs) { unsigned psk_len = 0; uint8_t psk[PSK_MAX_PSK_LEN]; if (alg_a & SSL_aPSK) { - if (hs->config->psk_client_callback == NULL) { + if (hs->config->psk_client_callback == nullptr) { OPENSSL_PUT_ERROR(SSL, SSL_R_PSK_NO_CLIENT_CB); return ssl_hs_error; } @@ -1415,7 +1414,7 @@ static enum ssl_hs_wait_t do_send_client_key_exchange(SSL_HANDSHAKE *hs) { // Depending on the key exchange method, compute |pms|. if (alg_k & SSL_kRSA) { RSA *rsa = EVP_PKEY_get0_RSA(hs->peer_pubkey.get()); - if (rsa == NULL) { + if (rsa == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); return ssl_hs_error; } @@ -1647,7 +1646,7 @@ static bool can_false_start(const SSL_HANDSHAKE *hs) { static enum ssl_hs_wait_t do_finish_flight(SSL_HANDSHAKE *hs) { SSL *const ssl = hs->ssl; - if (ssl->session != NULL) { + if (ssl->session != nullptr) { hs->state = state_finish_client_handshake; return ssl_hs_ok; } @@ -1758,7 +1757,7 @@ static enum ssl_hs_wait_t do_read_server_finished(SSL_HANDSHAKE *hs) { return wait; } - if (ssl->session != NULL) { + if (ssl->session != nullptr) { hs->state = state_send_client_finished; return ssl_hs_ok; } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/handshake_server.cc b/naiveproxy/src/third_party/boringssl/src/ssl/handshake_server.cc index ecfcaa1284..5d119ef931 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/handshake_server.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/handshake_server.cc @@ -115,7 +115,7 @@ static bool negotiate_version(SSL_HANDSHAKE *hs, uint8_t *out_alert, // Handle FALLBACK_SCSV. if (ssl_client_cipher_list_contains_cipher(client_hello, - SSL3_CK_FALLBACK_SCSV & 0xffff) && + SSL_CIPHER_FALLBACK_SCSV) && ssl_protocol_version(ssl) < hs->max_version) { OPENSSL_PUT_ERROR(SSL, SSL_R_INAPPROPRIATE_FALLBACK); *out_alert = SSL3_AD_INAPPROPRIATE_FALLBACK; @@ -145,7 +145,7 @@ static UniquePtr ssl_parse_client_cipher_list( } const SSL_CIPHER *c = SSL_get_cipher_by_value(cipher_suite); - if (c != NULL && !sk_SSL_CIPHER_push(sk.get(), c)) { + if (c != nullptr && !sk_SSL_CIPHER_push(sk.get(), c)) { return nullptr; } } @@ -297,7 +297,7 @@ static bool is_probably_jdk11_with_tls13(const SSL_CLIENT_HELLO *client_hello) { // JDK 11 does not support ChaCha20-Poly1305. This is unusual: many modern // clients implement ChaCha20-Poly1305. if (ssl_client_cipher_list_contains_cipher( - client_hello, TLS1_3_CK_CHACHA20_POLY1305_SHA256 & 0xffff)) { + client_hello, SSL_CIPHER_CHACHA20_POLY1305_SHA256)) { return false; } @@ -584,7 +584,7 @@ static enum ssl_hs_wait_t do_read_client_hello_after_ech(SSL_HANDSHAKE *hs) { } // Run the early callback. - if (ssl->ctx->select_certificate_cb != NULL) { + if (ssl->ctx->select_certificate_cb != nullptr) { switch (ssl->ctx->select_certificate_cb(&client_hello)) { case ssl_select_cert_retry: return ssl_hs_certificate_selection_pending; @@ -634,7 +634,7 @@ static enum ssl_hs_wait_t do_read_client_hello_after_ech(SSL_HANDSHAKE *hs) { // Only null compression is supported. TLS 1.3 further requires the peer // advertise no other compression. if (OPENSSL_memchr(client_hello.compression_methods, 0, - client_hello.compression_methods_len) == NULL || + client_hello.compression_methods_len) == nullptr || (ssl_protocol_version(ssl) >= TLS1_3_VERSION && client_hello.compression_methods_len != 1)) { OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_COMPRESSION_LIST); @@ -656,7 +656,7 @@ static enum ssl_hs_wait_t do_cert_callback(SSL_HANDSHAKE *hs) { SSL *const ssl = hs->ssl; // Call |cert_cb| to update server certificates if required. - if (hs->config->cert->cert_cb != NULL) { + if (hs->config->cert->cert_cb != nullptr) { int rv = hs->config->cert->cert_cb(ssl, hs->config->cert->cert_cb_arg); if (rv == 0) { OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_CB_ERROR); @@ -817,7 +817,7 @@ static enum ssl_hs_wait_t do_select_parameters(SSL_HANDSHAKE *hs) { } } - if (ssl->ctx->dos_protection_cb != NULL && + if (ssl->ctx->dos_protection_cb != nullptr && ssl->ctx->dos_protection_cb(&client_hello) == 0) { // Connection rejected for DOS reasons. OPENSSL_PUT_ERROR(SSL, SSL_R_CONNECTION_REJECTED); @@ -825,7 +825,7 @@ static enum ssl_hs_wait_t do_select_parameters(SSL_HANDSHAKE *hs) { return ssl_hs_error; } - if (ssl->session == NULL) { + if (ssl->session == nullptr) { hs->new_session->cipher = hs->new_cipher; if (hs->new_session->cipher->algorithm_mkey & SSL_kECDHE) { assert(has_ecdhe_group); @@ -1025,10 +1025,12 @@ static enum ssl_hs_wait_t do_send_server_certificate(SSL_HANDSHAKE *hs) { if (alg_k & SSL_kECDHE) { assert(hs->new_session->group_id != 0); - hs->key_shares[0] = SSLKeyShare::Create(hs->new_session->group_id); - if (!hs->key_shares[0] || // - !CBB_add_u8(cbb.get(), NAMED_CURVE_TYPE) || // - !CBB_add_u16(cbb.get(), hs->new_session->group_id) || // + UniquePtr ssl_key_share = + SSLKeyShare::Create(hs->new_session->group_id); + if (ssl_key_share == nullptr || // + !hs->key_shares.TryPushBack(std::move(ssl_key_share)) || // + !CBB_add_u8(cbb.get(), NAMED_CURVE_TYPE) || // + !CBB_add_u16(cbb.get(), hs->new_session->group_id) || // !CBB_add_u8_length_prefixed(cbb.get(), &child)) { return ssl_hs_error; } @@ -1367,7 +1369,7 @@ static enum ssl_hs_wait_t do_read_client_key_exchange(SSL_HANDSHAKE *hs) { return ssl_hs_error; } - // Check the padding. See RFC 3447, section 7.2.2. + // Check the padding. See RFC 8017, section 7.2.2. size_t padding_len = decrypt_len - premaster_secret.size(); uint8_t good = constant_time_eq_int_8(decrypt_buf[0], 0) & constant_time_eq_int_8(decrypt_buf[1], 2); @@ -1407,8 +1409,7 @@ static enum ssl_hs_wait_t do_read_client_key_exchange(SSL_HANDSHAKE *hs) { } // The key exchange state may now be discarded. - hs->key_shares[0].reset(); - hs->key_shares[1].reset(); + hs->key_shares.clear(); } else if (!(alg_k & SSL_kPSK)) { OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); @@ -1418,7 +1419,7 @@ static enum ssl_hs_wait_t do_read_client_key_exchange(SSL_HANDSHAKE *hs) { // For a PSK cipher suite, the actual pre-master secret is combined with the // pre-shared key. if (alg_a & SSL_aPSK) { - if (hs->config->psk_server_callback == NULL) { + if (hs->config->psk_server_callback == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); return ssl_hs_error; @@ -1566,7 +1567,7 @@ static enum ssl_hs_wait_t do_read_client_certificate_verify(SSL_HANDSHAKE *hs) { } static enum ssl_hs_wait_t do_read_change_cipher_spec(SSL_HANDSHAKE *hs) { - if (hs->handback && hs->ssl->session != NULL) { + if (hs->handback && hs->ssl->session != nullptr) { return ssl_hs_handback; } hs->state = state12_process_change_cipher_spec; @@ -1649,7 +1650,7 @@ static enum ssl_hs_wait_t do_read_client_finished(SSL_HANDSHAKE *hs) { return wait; } - if (ssl->session != NULL) { + if (ssl->session != nullptr) { hs->state = state12_finish_server_handshake; } else { hs->state = state12_send_server_finished; @@ -1658,7 +1659,7 @@ static enum ssl_hs_wait_t do_read_client_finished(SSL_HANDSHAKE *hs) { // If this is a full handshake with ChannelID then record the handshake // hashes in |hs->new_session| in case we need them to verify a // ChannelID signature on a resumption of this session in the future. - if (ssl->session == NULL && ssl->s3->channel_id_valid && + if (ssl->session == nullptr && ssl->s3->channel_id_valid && !tls1_record_handshake_hashes_for_channel_id(hs)) { return ssl_hs_error; } @@ -1672,7 +1673,7 @@ static enum ssl_hs_wait_t do_send_server_finished(SSL_HANDSHAKE *hs) { if (hs->ticket_expected) { const SSL_SESSION *session; UniquePtr session_copy; - if (ssl->session == NULL) { + if (ssl->session == nullptr) { // Fix the timeout to measure from the ticket issuance time. ssl_session_rebase_time(ssl, hs->new_session.get()); session = hs->new_session.get(); @@ -1710,7 +1711,7 @@ static enum ssl_hs_wait_t do_send_server_finished(SSL_HANDSHAKE *hs) { return ssl_hs_error; } - if (ssl->session != NULL) { + if (ssl->session != nullptr) { hs->state = state12_read_change_cipher_spec; } else { hs->state = state12_finish_server_handshake; @@ -1728,7 +1729,7 @@ static enum ssl_hs_wait_t do_finish_server_handshake(SSL_HANDSHAKE *hs) { ssl->method->on_handshake_complete(ssl); // If we aren't retaining peer certificates then we can discard it now. - if (hs->new_session != NULL && + if (hs->new_session != nullptr && hs->config->retain_only_sha256_of_client_certs) { hs->new_session->certs.reset(); ssl->ctx->x509_method->session_clear(hs->new_session.get()); diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/internal.h b/naiveproxy/src/third_party/boringssl/src/ssl/internal.h index fe41e49669..a69505b470 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/internal.h +++ b/naiveproxy/src/third_party/boringssl/src/ssl/internal.h @@ -118,16 +118,16 @@ OPENSSL_EXPORT bool CBBFinishArray(CBB *cbb, Array *out); // it would have liked to have written. The strings written consist of // |fixed_names_len| strings from |fixed_names| followed by |objects_len| // strings taken by projecting |objects| through |name|. -template +template inline size_t GetAllNames(const char **out, size_t max_out, - Span fixed_names, Name(T::*name), - Span objects) { + Span fixed_names, + Name(T::*name), Span objects) { auto span = bssl::Span(out, max_out); for (size_t i = 0; !span.empty() && i < fixed_names.size(); i++) { span[0] = fixed_names[i]; span = span.subspan(1); } - span = span.subspan(0, objects.size()); + span = span.subspan(0, /* up to */ objects.size()); for (size_t i = 0; i < span.size(); i++) { span[i] = objects[i].*name; } @@ -242,8 +242,8 @@ struct ssl_cipher_st { const char *name; // standard_name is the IETF name for the cipher. const char *standard_name; - // id is the cipher suite value bitwise OR-d with 0x03000000. - uint32_t id; + // protocol_id is the cipher's two-byte protocol ID. + uint16_t protocol_id; // algorithm_* determine the cipher suite. See constants below for the values. uint32_t algorithm_mkey; @@ -878,6 +878,12 @@ enum ssl_private_key_result_t ssl_private_key_decrypt(SSL_HANDSHAKE *hs, size_t max_out, Span in); +// ssl_parse_peer_subject_public_key_info decodes a SubjectPublicKeyInfo +// representing the peer TLS key. It returns a newly-allocated |EVP_PKEY| or +// nullptr on error. +bssl::UniquePtr ssl_parse_peer_subject_public_key_info( + Span spki); + // ssl_pkey_supports_algorithm returns whether |pkey| may be used to sign // |sigalg|. bool ssl_pkey_supports_algorithm(const SSL *ssl, EVP_PKEY *pkey, @@ -948,6 +954,13 @@ struct NamedGroup { // NamedGroups returns all supported groups. Span NamedGroups(); +// kNumNamedGroups is the number of supported groups. +constexpr size_t kNumNamedGroups = 7u; + +// DefaultSupportedGroupIds returns the list of IDs for the default groups that +// are supported when the caller hasn't explicitly configured supported groups. +Span DefaultSupportedGroupIds(); + // ssl_nid_to_group_id looks up the group corresponding to |nid|. On success, it // sets |*out_group_id| to the group ID and returns true. Otherwise, it returns // false. @@ -1345,10 +1358,11 @@ size_t ssl_ech_confirmation_signal_hello_offset(const SSL *ssl); // |transcript| with |msg|. The |ECH_CONFIRMATION_SIGNAL_LEN| bytes from // |offset| in |msg| are replaced with zeros before hashing. This function // returns true on success, and false on failure. -bool ssl_ech_accept_confirmation(const SSL_HANDSHAKE *hs, Span out, - Span client_random, - const SSLTranscript &transcript, bool is_hrr, - Span msg, size_t offset); +bool ssl_ech_accept_confirmation( + const SSL_HANDSHAKE *hs, Span out, + Span client_random, + const SSLTranscript &transcript, bool is_hrr, Span msg, + size_t offset); // ssl_is_valid_ech_public_name returns true if |public_name| is a valid ECH // public name and false otherwise. It is exported for testing. @@ -1756,10 +1770,9 @@ struct SSL_HANDSHAKE { // error, if |wait| is |ssl_hs_error|, is the error the handshake failed on. UniquePtr error; - // key_shares are the current key exchange instances. The second is only used - // as a client if we believe that we should offer two key shares in a - // ClientHello. - UniquePtr key_shares[2]; + // key_shares are the current key exchange instances, in preference order. Any + // members of this vector must be non-null. + InplaceVector, kNumNamedGroups> key_shares; // transcript is the current handshake transcript. SSLTranscript transcript; @@ -2116,9 +2129,22 @@ bssl::UniquePtr tls13_create_session_with_ticket(SSL *ssl, bool ssl_setup_extension_permutation(SSL_HANDSHAKE *hs); // ssl_setup_key_shares computes client key shares and saves them in |hs|. It -// returns true on success and false on failure. If |override_group_id| is zero, -// it offers the default groups, including GREASE. If it is non-zero, it offers -// a single key share of the specified group. +// returns true on success and false on failure. In order of precedence: +// +// - If |override_group_id| is non-zero, it offers a single key share of the +// specified group. +// +// - If a group can be predicted on the basis of a server hint set via +// |SSL_set1_server_supported_groups_hint|, a single key share of that group +// is sent. +// +// - If any number of key shares (including zero) were previously specified by +// the caller via |SSL_set1_client_key_shares|, those are used. +// +// - Otherwise, it selects the first supported group and may select a second if +// at most one of the two is a post-quantum group. +// +// GREASE will be included if enabled, when |override_group_id| is zero. bool ssl_setup_key_shares(SSL_HANDSHAKE *hs, uint16_t override_group_id); // ssl_setup_pake_shares computes the client PAKE shares and saves them in |hs|. @@ -3113,6 +3139,8 @@ struct DTLS1_STATE { // a handshake flight and ACK, respectively. bool sending_flight : 1; bool sending_ack : 1; + // pending_flush is whether we have a pending flush on the transport. + bool pending_flush : 1; // queued_key_update, if not kNone, indicates we've queued a KeyUpdate message // to send after the current flight is ACKed. @@ -3259,7 +3287,23 @@ struct SSL_CONFIG { // Trust anchor IDs to be requested in the trust_anchors extension. std::optional> requested_trust_anchors; - Array supported_group_list; // our list + // Our list of supported groups. If this list is modified, for a client, + // |client_key_share_selections| must be reset if the key shares are no longer + // a valid subsequence of the supported group list. + Array supported_group_list; + + // For a client, this may contain a subsequence of the group IDs in + // |suppported_group_list|, which gives the groups for which key shares should + // be sent in the client's key_share extension. This is non-nullopt iff + // |SSL_set1_client_key_shares| was successfully called to configure key + // shares. If non-nullopt, these groups are in the same order as they appear + // in |supported_group_list|, and may not contain duplicates. + std::optional> + client_key_share_selections; + + // For a client, this contains a list of groups believed to be supported by + // the server, in server preference order. + Array server_supported_groups_hint; // channel_id_private is the client's Channel ID private key, or null if // Channel ID should not be offered on this connection. @@ -3581,9 +3625,6 @@ bool tls1_change_cipher_state(SSL_HANDSHAKE *hs, bool tls1_generate_master_secret(SSL_HANDSHAKE *hs, Span out, Span premaster); -// tls1_get_grouplist returns the locally-configured group preference list. -Span tls1_get_grouplist(const SSL_HANDSHAKE *ssl); - // tls1_check_group_id returns whether |group_id| is consistent with locally- // configured group preferences. bool tls1_check_group_id(const SSL_HANDSHAKE *ssl, uint16_t group_id); @@ -3626,7 +3667,7 @@ bool ssl_parse_serverhello_tlsext(SSL_HANDSHAKE *hs, const CBS *extensions); // fresh ticket should be sent, but the given ticket cannot be used. // |ssl_ticket_aead_retry|: the ticket could not be immediately decrypted. // Retry later. -// |ssl_ticket_aead_error|: an error occured that is fatal to the connection. +// |ssl_ticket_aead_error|: an error occurred that is fatal to the connection. enum ssl_ticket_aead_result_t ssl_process_ticket( SSL_HANDSHAKE *hs, UniquePtr *out_session, bool *out_renew_ticket, Span ticket, @@ -3655,7 +3696,7 @@ bool tls1_record_handshake_hashes_for_channel_id(SSL_HANDSHAKE *hs); // ssl_can_write returns whether |ssl| is allowed to write. bool ssl_can_write(const SSL *ssl); -// ssl_can_read returns wheter |ssl| is allowed to read. +// ssl_can_read returns whether |ssl| is allowed to read. bool ssl_can_read(const SSL *ssl); OPENSSL_timeval ssl_ctx_get_current_time(const SSL_CTX *ctx); @@ -3702,12 +3743,12 @@ struct ssl_ctx_st : public bssl::RefCounted { // conf_max_version is the maximum acceptable protocol version configured by // |SSL_CTX_set_max_proto_version|. Note this version is normalized in DTLS - // and is further constrainted by |SSL_OP_NO_*|. + // and is further constrained by |SSL_OP_NO_*|. uint16_t conf_max_version = 0; // conf_min_version is the minimum acceptable protocol version configured by // |SSL_CTX_set_min_proto_version|. Note this version is normalized in DTLS - // and is further constrainted by |SSL_OP_NO_*|. + // and is further constrained by |SSL_OP_NO_*|. uint16_t conf_min_version = 0; // num_tickets is the number of tickets to send immediately after the TLS 1.3 diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/s3_both.cc b/naiveproxy/src/third_party/boringssl/src/ssl/s3_both.cc index d30cabba2e..898b5490ec 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/s3_both.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/s3_both.cc @@ -99,7 +99,8 @@ bool tls_add_message(SSL *ssl, Array msg) { Span rest = msg; if (!SSL_is_quic(ssl) && ssl->s3->aead_write_ctx->is_null_cipher()) { while (!rest.empty()) { - Span chunk = rest.subspan(0, ssl->max_send_fragment); + Span chunk = + rest.subspan(0, /* up to */ ssl->max_send_fragment); rest = rest.subspan(chunk.size()); if (!add_record_to_flight(ssl, SSL3_RT_HANDSHAKE, chunk)) { @@ -118,7 +119,7 @@ bool tls_add_message(SSL *ssl, Array msg) { size_t pending_len = ssl->s3->pending_hs_data ? ssl->s3->pending_hs_data->length : 0; Span chunk = - rest.subspan(0, ssl->max_send_fragment - pending_len); + rest.subspan(0, /* up to */ ssl->max_send_fragment - pending_len); assert(!chunk.empty()); rest = rest.subspan(chunk.size()); @@ -136,7 +137,7 @@ bool tls_add_message(SSL *ssl, Array msg) { ssl_do_msg_callback(ssl, 1 /* write */, SSL3_RT_HANDSHAKE, msg); // TODO(svaldez): Move this up a layer to fix abstraction for SSLTranscript on // hs. - if (ssl->s3->hs != NULL && // + if (ssl->s3->hs != nullptr && // !ssl->s3->hs->transcript.Update(msg)) { return false; } @@ -363,7 +364,7 @@ static ssl_open_record_t read_v2_client_hello(SSL *ssl, size_t *out_consumed, // Add the null compression scheme and finish. if (!CBB_add_u8(&hello_body, 1) || // !CBB_add_u8(&hello_body, 0) || // - !CBB_finish(client_hello.get(), NULL, &ssl->s3->hs_buf->length)) { + !CBB_finish(client_hello.get(), nullptr, &ssl->s3->hs_buf->length)) { OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); return ssl_open_record_error; } @@ -586,9 +587,9 @@ class CNsaCipherScorer : public CipherScorer { virtual ~CNsaCipherScorer() override = default; Score Evaluate(const SSL_CIPHER *a) const override { - if (a->id == TLS1_3_CK_AES_256_GCM_SHA384) { + if (a->protocol_id == SSL_CIPHER_AES_256_GCM_SHA384) { return 3; - } else if (a->id == TLS1_3_CK_AES_128_GCM_SHA256) { + } else if (a->protocol_id == SSL_CIPHER_AES_128_GCM_SHA256) { return 2; } return 1; @@ -606,10 +607,10 @@ bool ssl_tls13_cipher_meets_policy(uint16_t cipher_id, case ssl_compliance_policy_fips_202205: switch (cipher_id) { - case TLS1_3_CK_AES_128_GCM_SHA256 & 0xffff: - case TLS1_3_CK_AES_256_GCM_SHA384 & 0xffff: + case SSL_CIPHER_AES_128_GCM_SHA256: + case SSL_CIPHER_AES_256_GCM_SHA384: return true; - case TLS1_3_CK_CHACHA20_POLY1305_SHA256 & 0xffff: + case SSL_CIPHER_CHACHA20_POLY1305_SHA256: return false; default: assert(false); @@ -618,10 +619,10 @@ bool ssl_tls13_cipher_meets_policy(uint16_t cipher_id, case ssl_compliance_policy_wpa3_192_202304: switch (cipher_id) { - case TLS1_3_CK_AES_256_GCM_SHA384 & 0xffff: + case SSL_CIPHER_AES_256_GCM_SHA384: return true; - case TLS1_3_CK_AES_128_GCM_SHA256 & 0xffff: - case TLS1_3_CK_CHACHA20_POLY1305_SHA256 & 0xffff: + case SSL_CIPHER_AES_128_GCM_SHA256: + case SSL_CIPHER_CHACHA20_POLY1305_SHA256: return false; default: assert(false); diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/s3_lib.cc b/naiveproxy/src/third_party/boringssl/src/ssl/s3_lib.cc index bae2e078cf..327e1a96d3 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/s3_lib.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/s3_lib.cc @@ -77,12 +77,12 @@ bool tls_new(SSL *ssl) { } void tls_free(SSL *ssl) { - if (ssl->s3 == NULL) { + if (ssl->s3 == nullptr) { return; } Delete(ssl->s3); - ssl->s3 = NULL; + ssl->s3 = nullptr; } BSSL_NAMESPACE_END diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_aead_ctx.cc b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_aead_ctx.cc index a30825b4ce..e44d09abb2 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_aead_ctx.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_aead_ctx.cc @@ -401,7 +401,7 @@ bool SSLAEADContext::Seal(uint8_t *out, size_t *out_len, size_t max_out_len, } if (!SealScatter(out, out + prefix_len, out + prefix_len + in_len, type, - record_version, seqnum, header, in, in_len, 0, 0)) { + record_version, seqnum, header, in, in_len, nullptr, 0)) { return false; } *out_len = prefix_len + in_len + suffix_len; diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_asn1.cc b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_asn1.cc index 484dc9c5e3..2fe50eac77 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_asn1.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_asn1.cc @@ -142,7 +142,7 @@ static const CBS_ASN1_TAG kResumableAcrossNamesTag = static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, int for_ticket) { - if (in == NULL || in->cipher == NULL) { + if (in == nullptr || in->cipher == nullptr) { return 0; } @@ -151,7 +151,7 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, !CBB_add_asn1_uint64(&session, kVersion) || !CBB_add_asn1_uint64(&session, in->ssl_version) || !CBB_add_asn1(&session, &child, CBS_ASN1_OCTETSTRING) || - !CBB_add_u16(&child, (uint16_t)(in->cipher->id & 0xffff)) || + !CBB_add_u16(&child, in->cipher->protocol_id) || // The session ID is irrelevant for a session ticket. !CBB_add_asn1_octet_string(&session, in->session_id.data(), for_ticket ? 0 : in->session_id.size()) || @@ -262,7 +262,7 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, // The certificate chain is only serialized if the leaf's SHA-256 isn't // serialized instead. - if (in->certs != NULL && // + if (in->certs != nullptr && // !in->peer_sha256_valid && // sk_CRYPTO_BUFFER_num(in->certs.get()) >= 2) { if (!CBB_add_asn1(&session, &child, kCertChainTag)) { @@ -389,7 +389,7 @@ static int SSL_SESSION_parse_string(CBS *cbs, UniquePtr *out, static bool SSL_SESSION_parse_octet_string(CBS *cbs, Array *out, CBS_ASN1_TAG tag) { CBS value; - if (!CBS_get_optional_asn1_octet_string(cbs, &value, NULL, tag)) { + if (!CBS_get_optional_asn1_octet_string(cbs, &value, nullptr, tag)) { OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SSL_SESSION); return false; } @@ -492,7 +492,7 @@ UniquePtr SSL_SESSION_parse(CBS *cbs, return nullptr; } ret->cipher = SSL_get_cipher_by_value(cipher_value); - if (ret->cipher == NULL) { + if (ret->cipher == nullptr) { OPENSSL_PUT_ERROR(SSL, SSL_R_UNSUPPORTED_CIPHER); return nullptr; } @@ -592,7 +592,7 @@ UniquePtr SSL_SESSION_parse(CBS *cbs, } CBS cert_chain; - CBS_init(&cert_chain, NULL, 0); + CBS_init(&cert_chain, nullptr, 0); int has_cert_chain; if (!CBS_get_optional_asn1(&session, &cert_chain, &has_cert_chain, kCertChainTag) || @@ -620,7 +620,7 @@ UniquePtr SSL_SESSION_parse(CBS *cbs, while (CBS_len(&cert_chain) > 0) { CBS cert; - if (!CBS_get_any_asn1_element(&cert_chain, &cert, NULL, NULL) || + if (!CBS_get_any_asn1_element(&cert_chain, &cert, nullptr, nullptr) || CBS_len(&cert) == 0) { OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SSL_SESSION); return nullptr; @@ -726,7 +726,7 @@ int SSL_SESSION_to_bytes(const SSL_SESSION *in, uint8_t **out_data, *out_len = strlen(kNotResumableSession); *out_data = (uint8_t *)OPENSSL_memdup(kNotResumableSession, *out_len); - if (*out_data == NULL) { + if (*out_data == nullptr) { return 0; } @@ -785,11 +785,11 @@ SSL_SESSION *SSL_SESSION_from_bytes(const uint8_t *in, size_t in_len, UniquePtr ret = SSL_SESSION_parse(&cbs, ctx->x509_method, ctx->pool); if (!ret) { - return NULL; + return nullptr; } if (CBS_len(&cbs) != 0) { OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SSL_SESSION); - return NULL; + return nullptr; } return ret.release(); } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_buffer.cc b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_buffer.cc index 2cdcbc3461..8c5c7bcd96 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_buffer.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_buffer.cc @@ -70,7 +70,7 @@ bool SSLBuffer::EnsureCap(size_t header_len, size_t new_cap) { // sensitive data, we allocate with malloc rather than |OPENSSL_malloc| and // avoid zeroing on free. new_buf = (uint8_t *)malloc(new_cap + SSL3_ALIGN_PAYLOAD - 1); - if (new_buf == NULL) { + if (new_buf == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_cert.cc b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_cert.cc index c0d510b324..72218aeead 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_cert.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_cert.cc @@ -82,12 +82,12 @@ static int cert_set_chain_and_key( CERT *cert, CRYPTO_BUFFER *const *certs, size_t num_certs, EVP_PKEY *privkey, const SSL_PRIVATE_KEY_METHOD *privkey_method) { if (num_certs == 0 || // - (privkey == NULL && privkey_method == NULL)) { + (privkey == nullptr && privkey_method == nullptr)) { OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER); return 0; } - if (privkey != NULL && privkey_method != NULL) { + if (privkey != nullptr && privkey_method != nullptr) { OPENSSL_PUT_ERROR(SSL, SSL_R_CANNOT_HAVE_BOTH_PRIVKEY_AND_METHOD); return 0; } @@ -164,7 +164,7 @@ bool ssl_parse_cert_chain(uint8_t *out_alert, } // Retain the hash of the leaf certificate if requested. - if (out_leaf_sha256 != NULL) { + if (out_leaf_sha256 != nullptr) { SHA256(CBS_data(&certificate), CBS_len(&certificate), out_leaf_sha256); } } @@ -210,19 +210,19 @@ static bool ssl_cert_skip_to_spki(const CBS *in, CBS *out_tbs_cert) { !CBS_get_asn1(&toplevel, out_tbs_cert, CBS_ASN1_SEQUENCE) || // // version !CBS_get_optional_asn1( - out_tbs_cert, NULL, NULL, + out_tbs_cert, nullptr, nullptr, CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 0) || // // serialNumber - !CBS_get_asn1(out_tbs_cert, NULL, CBS_ASN1_INTEGER) || + !CBS_get_asn1(out_tbs_cert, nullptr, CBS_ASN1_INTEGER) || // signature algorithm - !CBS_get_asn1(out_tbs_cert, NULL, CBS_ASN1_SEQUENCE) || + !CBS_get_asn1(out_tbs_cert, nullptr, CBS_ASN1_SEQUENCE) || // issuer - !CBS_get_asn1(out_tbs_cert, NULL, CBS_ASN1_SEQUENCE) || + !CBS_get_asn1(out_tbs_cert, nullptr, CBS_ASN1_SEQUENCE) || // validity - !CBS_get_asn1(out_tbs_cert, NULL, CBS_ASN1_SEQUENCE) || + !CBS_get_asn1(out_tbs_cert, nullptr, CBS_ASN1_SEQUENCE) || // subject - !CBS_get_asn1(out_tbs_cert, NULL, CBS_ASN1_SEQUENCE)) { + !CBS_get_asn1(out_tbs_cert, nullptr, CBS_ASN1_SEQUENCE)) { return false; } @@ -239,12 +239,12 @@ bool ssl_cert_extract_issuer(const CBS *in, CBS *out_dn) { !CBS_get_asn1(&toplevel, &cert, CBS_ASN1_SEQUENCE) || // // version !CBS_get_optional_asn1( - &cert, NULL, NULL, + &cert, nullptr, nullptr, CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 0) || // // serialNumber - !CBS_get_asn1(&cert, NULL, CBS_ASN1_INTEGER) || // + !CBS_get_asn1(&cert, nullptr, CBS_ASN1_INTEGER) || // // signature algorithm - !CBS_get_asn1(&cert, NULL, CBS_ASN1_SEQUENCE) || // + !CBS_get_asn1(&cert, nullptr, CBS_ASN1_SEQUENCE) || // // issuer !CBS_get_asn1_element(&cert, out_dn, CBS_ASN1_SEQUENCE)) { return false; @@ -262,13 +262,14 @@ bool ssl_cert_matches_issuer(const CBS *in, const CBS *dn) { } UniquePtr ssl_cert_parse_pubkey(const CBS *in) { - CBS buf = *in, tbs_cert; - if (!ssl_cert_skip_to_spki(&buf, &tbs_cert)) { + CBS buf = *in, tbs_cert, spki; + if (!ssl_cert_skip_to_spki(&buf, &tbs_cert) || + !CBS_get_asn1_element(&tbs_cert, &spki, CBS_ASN1_SEQUENCE)) { OPENSSL_PUT_ERROR(SSL, SSL_R_CANNOT_PARSE_LEAF_CERT); return nullptr; } - return UniquePtr(EVP_parse_public_key(&tbs_cert)); + return ssl_parse_peer_subject_public_key_info(spki); } bool ssl_compare_public_and_private_key(const EVP_PKEY *pubkey, @@ -304,12 +305,12 @@ bool ssl_cert_check_key_usage(const CBS *in, enum ssl_key_usage_t bit) { int has_extensions; if (!ssl_cert_skip_to_spki(&buf, &tbs_cert) || // subjectPublicKeyInfo - !CBS_get_asn1(&tbs_cert, NULL, CBS_ASN1_SEQUENCE) || + !CBS_get_asn1(&tbs_cert, nullptr, CBS_ASN1_SEQUENCE) || // issuerUniqueID - !CBS_get_optional_asn1(&tbs_cert, NULL, NULL, + !CBS_get_optional_asn1(&tbs_cert, nullptr, nullptr, CBS_ASN1_CONTEXT_SPECIFIC | 1) || // subjectUniqueID - !CBS_get_optional_asn1(&tbs_cert, NULL, NULL, + !CBS_get_optional_asn1(&tbs_cert, nullptr, nullptr, CBS_ASN1_CONTEXT_SPECIFIC | 2) || !CBS_get_optional_asn1( &tbs_cert, &outer_extensions, &has_extensions, @@ -333,7 +334,7 @@ bool ssl_cert_check_key_usage(const CBS *in, enum ssl_key_usage_t bit) { if (!CBS_get_asn1(&extensions, &extension, CBS_ASN1_SEQUENCE) || !CBS_get_asn1(&extension, &oid, CBS_ASN1_OBJECT) || (CBS_peek_asn1_tag(&extension, CBS_ASN1_BOOLEAN) && - !CBS_get_asn1(&extension, NULL, CBS_ASN1_BOOLEAN)) || + !CBS_get_asn1(&extension, nullptr, CBS_ASN1_BOOLEAN)) || !CBS_get_asn1(&extension, &contents, CBS_ASN1_OCTETSTRING) || CBS_len(&extension) != 0) { OPENSSL_PUT_ERROR(SSL, SSL_R_CANNOT_PARSE_LEAF_CERT); @@ -548,7 +549,7 @@ const STACK_OF(CRYPTO_BUFFER) *SSL_get0_chain(const SSL *ssl) { int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, size_t der_len, const uint8_t *der) { - UniquePtr buffer(CRYPTO_BUFFER_new(der, der_len, NULL)); + UniquePtr buffer(CRYPTO_BUFFER_new(der, der_len, nullptr)); if (!buffer) { return 0; } @@ -557,7 +558,7 @@ int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, size_t der_len, } int SSL_use_certificate_ASN1(SSL *ssl, const uint8_t *der, size_t der_len) { - UniquePtr buffer(CRYPTO_BUFFER_new(der, der_len, NULL)); + UniquePtr buffer(CRYPTO_BUFFER_new(der, der_len, nullptr)); if (!buffer || !ssl->config) { return 0; } @@ -579,16 +580,16 @@ void SSL_set_cert_cb(SSL *ssl, int (*cb)(SSL *ssl, void *arg), void *arg) { const STACK_OF(CRYPTO_BUFFER) *SSL_get0_peer_certificates(const SSL *ssl) { SSL_SESSION *session = SSL_get_session(ssl); - if (session == NULL) { - return NULL; + if (session == nullptr) { + return nullptr; } return session->certs.get(); } const STACK_OF(CRYPTO_BUFFER) *SSL_get0_server_requested_CAs(const SSL *ssl) { - if (ssl->s3->hs == NULL) { - return NULL; + if (ssl->s3->hs == nullptr) { + return nullptr; } return ssl->s3->hs->ca_names.get(); } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_cipher.cc b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_cipher.cc index 724a0f2722..010e2ae43f 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_cipher.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_cipher.cc @@ -19,6 +19,8 @@ #include #include +#include + #include #include #include @@ -38,7 +40,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { SSL3_TXT_RSA_DES_192_CBC3_SHA, "TLS_RSA_WITH_3DES_EDE_CBC_SHA", - SSL3_CK_RSA_DES_192_CBC3_SHA, + SSL_CIPHER_RSA_WITH_3DES_EDE_CBC_SHA, SSL_kRSA, SSL_aRSA_DECRYPT, SSL_3DES, @@ -53,7 +55,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_RSA_WITH_AES_128_SHA, "TLS_RSA_WITH_AES_128_CBC_SHA", - TLS1_CK_RSA_WITH_AES_128_SHA, + SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA, SSL_kRSA, SSL_aRSA_DECRYPT, SSL_AES128, @@ -65,7 +67,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_RSA_WITH_AES_256_SHA, "TLS_RSA_WITH_AES_256_CBC_SHA", - TLS1_CK_RSA_WITH_AES_256_SHA, + SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA, SSL_kRSA, SSL_aRSA_DECRYPT, SSL_AES256, @@ -79,7 +81,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_PSK_WITH_AES_128_CBC_SHA, "TLS_PSK_WITH_AES_128_CBC_SHA", - TLS1_CK_PSK_WITH_AES_128_CBC_SHA, + SSL_CIPHER_PSK_WITH_AES_128_CBC_SHA, SSL_kPSK, SSL_aPSK, SSL_AES128, @@ -91,7 +93,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_PSK_WITH_AES_256_CBC_SHA, "TLS_PSK_WITH_AES_256_CBC_SHA", - TLS1_CK_PSK_WITH_AES_256_CBC_SHA, + SSL_CIPHER_PSK_WITH_AES_256_CBC_SHA, SSL_kPSK, SSL_aPSK, SSL_AES256, @@ -105,7 +107,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256, "TLS_RSA_WITH_AES_128_GCM_SHA256", - TLS1_CK_RSA_WITH_AES_128_GCM_SHA256, + SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256, SSL_kRSA, SSL_aRSA_DECRYPT, SSL_AES128GCM, @@ -117,7 +119,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384, "TLS_RSA_WITH_AES_256_GCM_SHA384", - TLS1_CK_RSA_WITH_AES_256_GCM_SHA384, + SSL_CIPHER_RSA_WITH_AES_256_GCM_SHA384, SSL_kRSA, SSL_aRSA_DECRYPT, SSL_AES256GCM, @@ -131,7 +133,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_3_RFC_AES_128_GCM_SHA256, "TLS_AES_128_GCM_SHA256", - TLS1_3_CK_AES_128_GCM_SHA256, + SSL_CIPHER_AES_128_GCM_SHA256, SSL_kGENERIC, SSL_aGENERIC, SSL_AES128GCM, @@ -143,7 +145,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_3_RFC_AES_256_GCM_SHA384, "TLS_AES_256_GCM_SHA384", - TLS1_3_CK_AES_256_GCM_SHA384, + SSL_CIPHER_AES_256_GCM_SHA384, SSL_kGENERIC, SSL_aGENERIC, SSL_AES256GCM, @@ -155,7 +157,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_3_RFC_CHACHA20_POLY1305_SHA256, "TLS_CHACHA20_POLY1305_SHA256", - TLS1_3_CK_CHACHA20_POLY1305_SHA256, + SSL_CIPHER_CHACHA20_POLY1305_SHA256, SSL_kGENERIC, SSL_aGENERIC, SSL_CHACHA20POLY1305, @@ -167,7 +169,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", - TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, SSL_kECDHE, SSL_aECDSA, SSL_AES128, @@ -179,7 +181,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", - TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, SSL_kECDHE, SSL_aECDSA, SSL_AES256, @@ -191,7 +193,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", - TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA, + SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA, SSL_kECDHE, SSL_aRSA_SIGN, SSL_AES128, @@ -203,7 +205,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", - TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA, + SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA, SSL_kECDHE, SSL_aRSA_SIGN, SSL_AES256, @@ -215,7 +217,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA256, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", - TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256, SSL_kECDHE, SSL_aRSA_SIGN, SSL_AES128, @@ -229,7 +231,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", - TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, SSL_kECDHE, SSL_aECDSA, SSL_AES128GCM, @@ -241,7 +243,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", - TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, SSL_kECDHE, SSL_aECDSA, SSL_AES256GCM, @@ -253,7 +255,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", - TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256, SSL_kECDHE, SSL_aRSA_SIGN, SSL_AES128GCM, @@ -265,7 +267,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384, "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", - TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + SSL_CIPHER_ECDHE_RSA_WITH_AES_256_GCM_SHA384, SSL_kECDHE, SSL_aRSA_SIGN, SSL_AES256GCM, @@ -279,7 +281,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_ECDHE_PSK_WITH_AES_128_CBC_SHA, "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA", - TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA, + SSL_CIPHER_ECDHE_PSK_WITH_AES_128_CBC_SHA, SSL_kECDHE, SSL_aPSK, SSL_AES128, @@ -291,7 +293,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_ECDHE_PSK_WITH_AES_256_CBC_SHA, "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA", - TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA, + SSL_CIPHER_ECDHE_PSK_WITH_AES_256_CBC_SHA, SSL_kECDHE, SSL_aPSK, SSL_AES256, @@ -305,7 +307,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", - TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + SSL_CIPHER_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, SSL_kECDHE, SSL_aRSA_SIGN, SSL_CHACHA20POLY1305, @@ -317,7 +319,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256", - TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, + SSL_CIPHER_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, SSL_kECDHE, SSL_aECDSA, SSL_CHACHA20POLY1305, @@ -329,7 +331,7 @@ static constexpr SSL_CIPHER kCiphers[] = { { TLS1_TXT_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, "TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256", - TLS1_CK_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, + SSL_CIPHER_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, SSL_kECDHE, SSL_aPSK, SSL_CHACHA20POLY1305, @@ -445,13 +447,13 @@ static const CIPHER_ALIAS kCipherAliases[] = { {"SHA384", 0, 0, 0, 0, 0}, }; -static const size_t kCipherAliasesLen = OPENSSL_ARRAY_SIZE(kCipherAliases); +static const size_t kCipherAliasesLen = std::size(kCipherAliases); bool ssl_cipher_get_evp_aead(const EVP_AEAD **out_aead, size_t *out_mac_secret_len, size_t *out_fixed_iv_len, const SSL_CIPHER *cipher, uint16_t version) { - *out_aead = NULL; + *out_aead = nullptr; *out_mac_secret_len = 0; *out_fixed_iv_len = 0; @@ -535,7 +537,7 @@ const EVP_MD *ssl_get_handshake_digest(uint16_t version, return EVP_sha384(); default: assert(0); - return NULL; + return nullptr; } } @@ -561,15 +563,15 @@ static void ll_append_tail(CIPHER_ORDER **head, CIPHER_ORDER *curr, if (curr == *head) { *head = curr->next; } - if (curr->prev != NULL) { + if (curr->prev != nullptr) { curr->prev->next = curr->next; } - if (curr->next != NULL) { + if (curr->next != nullptr) { curr->next->prev = curr->prev; } (*tail)->next = curr; curr->prev = *tail; - curr->next = NULL; + curr->next = nullptr; *tail = curr; } @@ -581,15 +583,15 @@ static void ll_append_head(CIPHER_ORDER **head, CIPHER_ORDER *curr, if (curr == *tail) { *tail = curr->prev; } - if (curr->next != NULL) { + if (curr->next != nullptr) { curr->next->prev = curr->prev; } - if (curr->prev != NULL) { + if (curr->prev != nullptr) { curr->prev->next = curr->next; } (*head)->prev = curr; curr->next = *head; - curr->prev = NULL; + curr->prev = nullptr; *head = curr; } @@ -640,7 +642,7 @@ void SSLCipherPreferenceList::Remove(const SSL_CIPHER *cipher) { } bool ssl_cipher_is_deprecated(const SSL_CIPHER *cipher) { - return cipher->id == TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA256 || + return cipher->protocol_id == SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256 || cipher->algorithm_enc == SSL_3DES; } @@ -653,7 +655,7 @@ bool ssl_cipher_is_deprecated(const SSL_CIPHER *cipher) { // of that strength. // - Otherwise, |alias| must be non-null. It selects ciphers that matches // |*alias|. -static void ssl_cipher_apply_rule(uint32_t cipher_id, const CIPHER_ALIAS *alias, +static void ssl_cipher_apply_rule(uint16_t cipher_id, const CIPHER_ALIAS *alias, int rule, int strength_bits, bool in_group, CIPHER_ORDER **head_p, CIPHER_ORDER **tail_p) { @@ -684,14 +686,14 @@ static void ssl_cipher_apply_rule(uint32_t cipher_id, const CIPHER_ALIAS *alias, last = tail; } - curr = NULL; + curr = nullptr; for (;;) { if (curr == last) { break; } curr = next; - if (curr == NULL) { + if (curr == nullptr) { break; } @@ -701,11 +703,11 @@ static void ssl_cipher_apply_rule(uint32_t cipher_id, const CIPHER_ALIAS *alias, // Selection criteria is either a specific cipher, the value of // |strength_bits|, or the algorithms used. if (cipher_id != 0) { - if (cipher_id != cp->id) { + if (cipher_id != cp->protocol_id) { continue; } } else if (strength_bits >= 0) { - if (strength_bits != SSL_CIPHER_get_bits(cp, NULL)) { + if (strength_bits != SSL_CIPHER_get_bits(cp, nullptr)) { continue; } } else { @@ -759,14 +761,14 @@ static void ssl_cipher_apply_rule(uint32_t cipher_id, const CIPHER_ALIAS *alias, tail = curr->prev; } curr->active = false; - if (curr->next != NULL) { + if (curr->next != nullptr) { curr->next->prev = curr->prev; } - if (curr->prev != NULL) { + if (curr->prev != nullptr) { curr->prev->next = curr->next; } - curr->next = NULL; - curr->prev = NULL; + curr->next = nullptr; + curr->prev = nullptr; } } @@ -781,10 +783,10 @@ static bool ssl_cipher_strength_sort(CIPHER_ORDER **head_p, // '+' movement to the end of the list. int max_strength_bits = 0; CIPHER_ORDER *curr = *head_p; - while (curr != NULL) { + while (curr != nullptr) { if (curr->active && - SSL_CIPHER_get_bits(curr->cipher, NULL) > max_strength_bits) { - max_strength_bits = SSL_CIPHER_get_bits(curr->cipher, NULL); + SSL_CIPHER_get_bits(curr->cipher, nullptr) > max_strength_bits) { + max_strength_bits = SSL_CIPHER_get_bits(curr->cipher, nullptr); } curr = curr->next; } @@ -796,9 +798,9 @@ static bool ssl_cipher_strength_sort(CIPHER_ORDER **head_p, // Now find the strength_bits values actually used. curr = *head_p; - while (curr != NULL) { + while (curr != nullptr) { if (curr->active) { - number_uses[SSL_CIPHER_get_bits(curr->cipher, NULL)]++; + number_uses[SSL_CIPHER_get_bits(curr->cipher, nullptr)]++; } curr = curr->next; } @@ -886,7 +888,7 @@ static bool ssl_cipher_process_rulestr(const char *rule_str, } bool multi = false; - uint32_t cipher_id = 0; + uint16_t cipher_id = 0; CIPHER_ALIAS alias; bool skip_rule = false; @@ -916,11 +918,10 @@ static bool ssl_cipher_process_rulestr(const char *rule_str, // Look for a matching exact cipher. These aren't allowed in multipart // rules. if (!multi && ch != '+') { - for (j = 0; j < OPENSSL_ARRAY_SIZE(kCiphers); j++) { - const SSL_CIPHER *cipher = &kCiphers[j]; - if (rule_equals(cipher->name, buf, buf_len) || - rule_equals(cipher->standard_name, buf, buf_len)) { - cipher_id = cipher->id; + for (const SSL_CIPHER &cipher : kCiphers) { + if (rule_equals(cipher.name, buf, buf_len) || + rule_equals(cipher.standard_name, buf, buf_len)) { + cipher_id = cipher.protocol_id; break; } } @@ -938,7 +939,7 @@ static bool ssl_cipher_process_rulestr(const char *rule_str, // enables deprecated ciphers, deprecated ciphers are included. This // is slightly different from the bitmasks in that adding aliases // can increase the set of matched ciphers. This is so that an alias - // like "RSA" will only specifiy AES-based RSA ciphers, but + // like "RSA" will only specify AES-based RSA ciphers, but // "RSA+3DES" will still specify 3DES. alias.include_deprecated |= kCipherAliases[j].include_deprecated; @@ -1001,7 +1002,7 @@ bool ssl_create_cipher_list(UniquePtr *out_cipher_list, const bool has_aes_hw, const char *rule_str, bool strict) { // Return with error if nothing to do. - if (rule_str == NULL || out_cipher_list == NULL) { + if (rule_str == nullptr || out_cipher_list == nullptr) { return false; } @@ -1009,46 +1010,44 @@ bool ssl_create_cipher_list(UniquePtr *out_cipher_list, // non-AEAD. The constants are masked by 0xffff to remove the vestigial 0x03 // byte from SSL 2.0. static const uint16_t kAESCiphers[] = { - TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 & 0xffff, - TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256 & 0xffff, - TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 & 0xffff, - TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384 & 0xffff, + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + SSL_CIPHER_ECDHE_RSA_WITH_AES_256_GCM_SHA384, }; static const uint16_t kChaChaCiphers[] = { - TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 & 0xffff, - TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 & 0xffff, - TLS1_CK_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 & 0xffff, + SSL_CIPHER_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, + SSL_CIPHER_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + SSL_CIPHER_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, }; static const uint16_t kLegacyCiphers[] = { - TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA & 0xffff, - TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA & 0xffff, - TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA & 0xffff, - TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA & 0xffff, - TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA & 0xffff, - TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA & 0xffff, - TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA256 & 0xffff, - TLS1_CK_RSA_WITH_AES_128_GCM_SHA256 & 0xffff, - TLS1_CK_RSA_WITH_AES_256_GCM_SHA384 & 0xffff, - TLS1_CK_RSA_WITH_AES_128_SHA & 0xffff, - TLS1_CK_PSK_WITH_AES_128_CBC_SHA & 0xffff, - TLS1_CK_RSA_WITH_AES_256_SHA & 0xffff, - TLS1_CK_PSK_WITH_AES_256_CBC_SHA & 0xffff, - SSL3_CK_RSA_DES_192_CBC3_SHA & 0xffff, + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA, + SSL_CIPHER_ECDHE_PSK_WITH_AES_128_CBC_SHA, + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA, + SSL_CIPHER_ECDHE_PSK_WITH_AES_256_CBC_SHA, + SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256, + SSL_CIPHER_RSA_WITH_AES_256_GCM_SHA384, + SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA, + SSL_CIPHER_PSK_WITH_AES_128_CBC_SHA, + SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA, + SSL_CIPHER_PSK_WITH_AES_256_CBC_SHA, + SSL_CIPHER_RSA_WITH_3DES_EDE_CBC_SHA, }; // Set up a linked list of ciphers. - CIPHER_ORDER co_list[OPENSSL_ARRAY_SIZE(kAESCiphers) + - OPENSSL_ARRAY_SIZE(kChaChaCiphers) + - OPENSSL_ARRAY_SIZE(kLegacyCiphers)]; - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(co_list); i++) { - co_list[i].next = - i + 1 < OPENSSL_ARRAY_SIZE(co_list) ? &co_list[i + 1] : nullptr; + CIPHER_ORDER co_list[std::size(kAESCiphers) + std::size(kChaChaCiphers) + + std::size(kLegacyCiphers)]; + for (size_t i = 0; i < std::size(co_list); i++) { + co_list[i].next = i + 1 < std::size(co_list) ? &co_list[i + 1] : nullptr; co_list[i].prev = i == 0 ? nullptr : &co_list[i - 1]; co_list[i].active = false; co_list[i].in_group = false; } CIPHER_ORDER *head = &co_list[0]; - CIPHER_ORDER *tail = &co_list[OPENSSL_ARRAY_SIZE(co_list) - 1]; + CIPHER_ORDER *tail = &co_list[std::size(co_list) - 1]; // Order AES ciphers vs ChaCha ciphers based on whether we have AES hardware. // @@ -1075,9 +1074,8 @@ bool ssl_create_cipher_list(UniquePtr *out_cipher_list, co_list[num++].cipher = SSL_get_cipher_by_value(id); assert(co_list[num - 1].cipher != nullptr); } - assert(num == OPENSSL_ARRAY_SIZE(co_list)); - static_assert(OPENSSL_ARRAY_SIZE(co_list) + NumTLS13Ciphers() == - OPENSSL_ARRAY_SIZE(kCiphers), + assert(num == std::size(co_list)); + static_assert(std::size(co_list) + NumTLS13Ciphers() == std::size(kCiphers), "Not all ciphers are included in the cipher order"); // If the rule_string begins with DEFAULT, apply the default rule before @@ -1104,14 +1102,14 @@ bool ssl_create_cipher_list(UniquePtr *out_cipher_list, UniquePtr cipherstack(sk_SSL_CIPHER_new_null()); Array in_group_flags; if (cipherstack == nullptr || - !in_group_flags.InitForOverwrite(OPENSSL_ARRAY_SIZE(kCiphers))) { + !in_group_flags.InitForOverwrite(std::size(kCiphers))) { return false; } // The cipher selection for the list is done. The ciphers are added // to the resulting precedence to the STACK_OF(SSL_CIPHER). size_t num_in_group_flags = 0; - for (CIPHER_ORDER *curr = head; curr != NULL; curr = curr->next) { + for (CIPHER_ORDER *curr = head; curr != nullptr; curr = curr->next) { if (curr->active) { if (!sk_SSL_CIPHER_push(cipherstack.get(), curr->cipher)) { return false; @@ -1189,10 +1187,10 @@ using namespace bssl; static constexpr int ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b) { - if (a->id > b->id) { + if (a->protocol_id > b->protocol_id) { return 1; } - if (a->id < b->id) { + if (a->protocol_id < b->protocol_id) { return -1; } return 0; @@ -1218,20 +1216,20 @@ static_assert(ssl_ciphers_sorted(kCiphers), const SSL_CIPHER *SSL_get_cipher_by_value(uint16_t value) { SSL_CIPHER c; - - c.id = 0x03000000L | value; + c.protocol_id = value; return reinterpret_cast( - bsearch(&c, kCiphers, OPENSSL_ARRAY_SIZE(kCiphers), sizeof(SSL_CIPHER), + bsearch(&c, kCiphers, std::size(kCiphers), sizeof(SSL_CIPHER), ssl_cipher_id_cmp_void)); } -uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *cipher) { return cipher->id; } +uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *cipher) { + // Historically, OpenSSL added a leading 0x03 byte to cipher IDs, to + // distinguish between SSL 2.0 and SSL 3.0. + return cipher->protocol_id | 0x03000000; +} uint16_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *cipher) { - // All OpenSSL cipher IDs are prefaced with 0x03. Historically this referred - // to SSLv2 vs SSLv3. - assert((cipher->id & 0xff000000) == 0x03000000); - return static_cast(cipher->id); + return cipher->protocol_id; } int SSL_CIPHER_is_aead(const SSL_CIPHER *cipher) { @@ -1311,12 +1309,12 @@ const EVP_MD *SSL_CIPHER_get_handshake_digest(const SSL_CIPHER *cipher) { return EVP_sha384(); } assert(0); - return NULL; + return nullptr; } int SSL_CIPHER_get_prf_nid(const SSL_CIPHER *cipher) { const EVP_MD *md = SSL_CIPHER_get_handshake_digest(cipher); - if (md == NULL) { + if (md == nullptr) { return NID_undef; } return EVP_MD_nid(md); @@ -1348,11 +1346,11 @@ uint16_t SSL_CIPHER_get_max_version(const SSL_CIPHER *cipher) { return TLS1_2_VERSION; } -static const char *kUnknownCipher = "(NONE)"; +static const char *const kUnknownCipher = "(NONE)"; // return the actual cipher being used const char *SSL_CIPHER_get_name(const SSL_CIPHER *cipher) { - if (cipher != NULL) { + if (cipher != nullptr) { return cipher->name; } @@ -1364,7 +1362,7 @@ const char *SSL_CIPHER_standard_name(const SSL_CIPHER *cipher) { } const char *SSL_CIPHER_get_kx_name(const SSL_CIPHER *cipher) { - if (cipher == NULL) { + if (cipher == nullptr) { return ""; } @@ -1400,7 +1398,7 @@ const char *SSL_CIPHER_get_kx_name(const SSL_CIPHER *cipher) { } int SSL_CIPHER_get_bits(const SSL_CIPHER *cipher, int *out_alg_bits) { - if (cipher == NULL) { + if (cipher == nullptr) { return 0; } @@ -1430,7 +1428,7 @@ int SSL_CIPHER_get_bits(const SSL_CIPHER *cipher, int *out_alg_bits) { strength_bits = 0; } - if (out_alg_bits != NULL) { + if (out_alg_bits != nullptr) { *out_alg_bits = alg_bits; } return strength_bits; @@ -1538,11 +1536,11 @@ const char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, break; } - if (buf == NULL) { + if (buf == nullptr) { len = 128; buf = (char *)OPENSSL_malloc(len); - if (buf == NULL) { - return NULL; + if (buf == nullptr) { + return nullptr; } } else if (len < 128) { return "Buffer too small"; @@ -1557,11 +1555,11 @@ const char *SSL_CIPHER_get_version(const SSL_CIPHER *cipher) { return "TLSv1/SSLv3"; } -STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void) { return NULL; } +STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void) { return nullptr; } int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm) { return 1; } -const char *SSL_COMP_get_name(const COMP_METHOD *comp) { return NULL; } +const char *SSL_COMP_get_name(const COMP_METHOD *comp) { return nullptr; } const char *SSL_COMP_get0_name(const SSL_COMP *comp) { return comp->name; } @@ -1575,6 +1573,6 @@ size_t SSL_get_all_cipher_names(const char **out, size_t max_out) { } size_t SSL_get_all_standard_cipher_names(const char **out, size_t max_out) { - return GetAllNames(out, max_out, Span(), + return GetAllNames(out, max_out, Span(), &SSL_CIPHER::standard_name, Span(kCiphers)); } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_credential.cc b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_credential.cc index 95c1a761ca..bbbd767017 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_credential.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_credential.cc @@ -428,9 +428,8 @@ int SSL_CREDENTIAL_set1_delegated_credential(SSL_CREDENTIAL *cred, return 0; } - UniquePtr pubkey(EVP_parse_public_key(&spki)); - if (pubkey == nullptr || CBS_len(&spki) != 0) { - OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR); + UniquePtr pubkey = ssl_parse_peer_subject_public_key_info(spki); + if (pubkey == nullptr) { return 0; } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_file.cc b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_file.cc index c284d904cf..e2df63df33 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_file.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_file.cc @@ -69,7 +69,7 @@ static int add_bio_cert_subjects_to_stack(STACK_OF(X509_NAME) *out, BIO *bio, X509_NAME *subject = X509_get_subject_name(x509.get()); // Skip if already present in |out|. Duplicates in |to_append| will be // handled separately. - if (sk_X509_NAME_find(out, /*out_index=*/NULL, subject)) { + if (sk_X509_NAME_find(out, /*out_index=*/nullptr, subject)) { continue; } @@ -343,9 +343,7 @@ int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file) { } // When the while loop ends, it's usually just EOF. - uint32_t err = ERR_peek_last_error(); - if (ERR_GET_LIB(err) == ERR_LIB_PEM && - ERR_GET_REASON(err) == PEM_R_NO_START_LINE) { + if (ERR_equals(ERR_peek_last_error(), ERR_LIB_PEM, PEM_R_NO_START_LINE)) { ERR_clear_error(); return 1; } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_key_share.cc b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_key_share.cc index 856d0d6a79..d155b5527e 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_key_share.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_key_share.cc @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -24,8 +25,6 @@ #include #include #include -#define OPENSSL_UNSTABLE_EXPERIMENTAL_KYBER -#include #include #include #include @@ -34,6 +33,7 @@ #include #include "../crypto/internal.h" +#include "../crypto/kyber/internal.h" #include "internal.h" BSSL_NAMESPACE_BEGIN @@ -375,6 +375,66 @@ class X25519MLKEM768KeyShare : public SSLKeyShare { MLKEM768_private_key mlkem_private_key_; }; +// draft-ietf-tls-mlkem-04 +class MLKEM1024KeyShare : public SSLKeyShare { + public: + MLKEM1024KeyShare() = default; + + uint16_t GroupID() const override { return SSL_GROUP_MLKEM1024; } + + bool Generate(CBB *out_public_key) override { + uint8_t public_key[MLKEM1024_PUBLIC_KEY_BYTES]; + MLKEM1024_generate_key(public_key, /*optional_out_seed=*/nullptr, + &private_key_); + return CBB_add_bytes(out_public_key, public_key, sizeof(public_key)); + } + + bool Encap(CBB *out_ciphertext, Array *out_secret, + uint8_t *out_alert, Span peer_key) override { + MLKEM1024_public_key peer_pub; + CBS peer_pub_cbs; + CBS_init(&peer_pub_cbs, peer_key.data(), peer_key.size()); + if (!MLKEM1024_parse_public_key(&peer_pub, &peer_pub_cbs)) { + *out_alert = SSL_AD_ILLEGAL_PARAMETER; + OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_ECPOINT); + return false; + } + + Array secret; + if (!secret.InitForOverwrite(MLKEM_SHARED_SECRET_BYTES)) { + return false; + } + uint8_t ciphertext[MLKEM1024_CIPHERTEXT_BYTES]; + MLKEM1024_encap(ciphertext, secret.data(), &peer_pub); + if (!CBB_add_bytes(out_ciphertext, ciphertext, sizeof(ciphertext))) { + return false; + } + *out_secret = std::move(secret); + return true; + } + + bool Decap(Array *out_secret, uint8_t *out_alert, + Span ciphertext) override { + Array secret; + if (!secret.InitForOverwrite(MLKEM_SHARED_SECRET_BYTES)) { + *out_alert = SSL_AD_INTERNAL_ERROR; + return false; + } + + if (!MLKEM1024_decap(secret.data(), ciphertext.data(), ciphertext.size(), + &private_key_)) { + *out_alert = SSL_AD_ILLEGAL_PARAMETER; + OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_ECPOINT); + return false; + } + *out_secret = std::move(secret); + return true; + } + + private: + MLKEM1024_private_key private_key_; +}; + constexpr NamedGroup kNamedGroups[] = { {NID_X9_62_prime256v1, SSL_GROUP_SECP256R1, "P-256", "prime256v1"}, {NID_secp384r1, SSL_GROUP_SECP384R1, "P-384", "secp384r1"}, @@ -383,12 +443,25 @@ constexpr NamedGroup kNamedGroups[] = { {NID_X25519Kyber768Draft00, SSL_GROUP_X25519_KYBER768_DRAFT00, "X25519Kyber768Draft00", ""}, {NID_X25519MLKEM768, SSL_GROUP_X25519_MLKEM768, "X25519MLKEM768", ""}, + {NID_ML_KEM_1024, SSL_GROUP_MLKEM1024, "MLKEM1024", ""}, }; +static_assert(std::size(kNamedGroups) == kNumNamedGroups, + "kNamedGroups size mismatch"); + } // namespace Span NamedGroups() { return kNamedGroups; } +Span DefaultSupportedGroupIds() { + static const uint16_t kDefaultSupportedGroupIds[] = { + SSL_GROUP_X25519, + SSL_GROUP_SECP256R1, + SSL_GROUP_SECP384R1, + }; + return Span(kDefaultSupportedGroupIds); +} + UniquePtr SSLKeyShare::Create(uint16_t group_id) { switch (group_id) { case SSL_GROUP_SECP256R1: @@ -403,6 +476,8 @@ UniquePtr SSLKeyShare::Create(uint16_t group_id) { return MakeUnique(); case SSL_GROUP_X25519_MLKEM768: return MakeUnique(); + case SSL_GROUP_MLKEM1024: + return MakeUnique(); default: return nullptr; } @@ -458,6 +533,6 @@ const char *SSL_get_group_name(uint16_t group_id) { } size_t SSL_get_all_group_names(const char **out, size_t max_out) { - return GetAllNames(out, max_out, Span(), &NamedGroup::name, + return GetAllNames(out, max_out, Span(), &NamedGroup::name, Span(kNamedGroups)); } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_lib.cc b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_lib.cc index aa8ef8a0c5..f64b103fbb 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_lib.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_lib.cc @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -178,7 +179,7 @@ static bool cbb_add_hex_consttime(CBB *cbb, Span in) { bool ssl_log_secret(const SSL *ssl, const char *label, Span secret) { - if (ssl->ctx->keylog_callback == NULL) { + if (ssl->ctx->keylog_callback == nullptr) { return true; } @@ -204,21 +205,21 @@ bool ssl_log_secret(const SSL *ssl, const char *label, } void ssl_do_info_callback(const SSL *ssl, int type, int value) { - void (*cb)(const SSL *ssl, int type, int value) = NULL; - if (ssl->info_callback != NULL) { + void (*cb)(const SSL *ssl, int type, int value) = nullptr; + if (ssl->info_callback != nullptr) { cb = ssl->info_callback; - } else if (ssl->ctx->info_callback != NULL) { + } else if (ssl->ctx->info_callback != nullptr) { cb = ssl->ctx->info_callback; } - if (cb != NULL) { + if (cb != nullptr) { cb(ssl, type, value); } } void ssl_do_msg_callback(const SSL *ssl, int is_write, int content_type, Span in) { - if (ssl->msg_callback == NULL) { + if (ssl->msg_callback == nullptr) { return; } @@ -242,7 +243,7 @@ void ssl_do_msg_callback(const SSL *ssl, int is_write, int content_type, } OPENSSL_timeval ssl_ctx_get_current_time(const SSL_CTX *ctx) { - if (ctx->current_time_cb != NULL) { + if (ctx->current_time_cb != nullptr) { // TODO(davidben): Update current_time_cb to use OPENSSL_timeval. See // https://crbug.com/boringssl/155. struct timeval clock; @@ -268,7 +269,7 @@ OPENSSL_timeval ssl_ctx_get_current_time(const SSL_CTX *ctx) { } #else struct timeval clock; - gettimeofday(&clock, NULL); + gettimeofday(&clock, nullptr); if (clock.tv_sec < 0) { assert(0); return {0, 0}; @@ -421,7 +422,7 @@ ssl_ctx_st::~ssl_ctx_st() { } SSL_CTX *SSL_CTX_new(const SSL_METHOD *method) { - if (method == NULL) { + if (method == nullptr) { OPENSSL_PUT_ERROR(SSL, SSL_R_NULL_SSL_METHOD_PASSED); return nullptr; } @@ -453,6 +454,10 @@ SSL_CTX *SSL_CTX_new(const SSL_METHOD *method) { return nullptr; } + if (!ret->supported_group_list.CopyFrom(DefaultSupportedGroupIds())) { + return nullptr; + } + return ret.release(); } @@ -488,7 +493,7 @@ ssl_st::~ssl_st() { CRYPTO_free_ex_data(&g_ex_data_class_ssl, &ex_data); // |config| refers to |this|, so we must release it earlier. config.reset(); - if (method != NULL) { + if (method != nullptr) { method->ssl_free(this); } } @@ -618,7 +623,7 @@ void SSL_set_bio(SSL *ssl, BIO *rbio, BIO *wbio) { // If the two arguments are equal, one fewer reference is granted than // taken. - if (rbio != NULL && rbio == wbio) { + if (rbio != nullptr && rbio == wbio) { BIO_up_ref(rbio); } @@ -718,7 +723,7 @@ int SSL_provide_quic_data(SSL *ssl, enum ssl_encryption_level_t level, int SSL_do_handshake(SSL *ssl) { ssl_reset_error_state(ssl); - if (ssl->do_handshake == NULL) { + if (ssl->do_handshake == nullptr) { OPENSSL_PUT_ERROR(SSL, SSL_R_CONNECTION_TYPE_NOT_SET); return -1; } @@ -748,7 +753,7 @@ int SSL_do_handshake(SSL *ssl) { } int SSL_connect(SSL *ssl) { - if (ssl->do_handshake == NULL) { + if (ssl->do_handshake == nullptr) { // Not properly initialized yet SSL_set_connect_state(ssl); } @@ -757,7 +762,7 @@ int SSL_connect(SSL *ssl) { } int SSL_accept(SSL *ssl) { - if (ssl->do_handshake == NULL) { + if (ssl->do_handshake == nullptr) { // Not properly initialized yet SSL_set_accept_state(ssl); } @@ -831,7 +836,7 @@ int SSL_process_quic_post_handshake(SSL *ssl) { static int ssl_read_impl(SSL *ssl) { ssl_reset_error_state(ssl); - if (ssl->do_handshake == NULL) { + if (ssl->do_handshake == nullptr) { OPENSSL_PUT_ERROR(SSL, SSL_R_UNINITIALIZED); return -1; } @@ -949,7 +954,7 @@ int SSL_write(SSL *ssl, const void *buf, int num) { return -1; } - if (ssl->do_handshake == NULL) { + if (ssl->do_handshake == nullptr) { OPENSSL_PUT_ERROR(SSL, SSL_R_UNINITIALIZED); return -1; } @@ -984,7 +989,7 @@ int SSL_write(SSL *ssl, const void *buf, int num) { int SSL_key_update(SSL *ssl, int request_type) { ssl_reset_error_state(ssl); - if (ssl->do_handshake == NULL) { + if (ssl->do_handshake == nullptr) { OPENSSL_PUT_ERROR(SSL, SSL_R_UNINITIALIZED); return 0; } @@ -1010,7 +1015,7 @@ int SSL_key_update(SSL *ssl, int request_type) { int SSL_shutdown(SSL *ssl) { ssl_reset_error_state(ssl); - if (ssl->do_handshake == NULL) { + if (ssl->do_handshake == nullptr) { OPENSSL_PUT_ERROR(SSL, SSL_R_UNINITIALIZED); return -1; } @@ -1113,7 +1118,7 @@ void SSL_set_early_data_enabled(SSL *ssl, int enabled) { } int SSL_in_early_data(const SSL *ssl) { - if (ssl->s3->hs == NULL) { + if (ssl->s3->hs == nullptr) { return 0; } return ssl->s3->hs->in_early_data; @@ -1125,7 +1130,7 @@ int SSL_early_data_accepted(const SSL *ssl) { void SSL_reset_early_data_reject(SSL *ssl) { SSL_HANDSHAKE *hs = ssl->s3->hs.get(); - if (hs == NULL || // + if (hs == nullptr || // hs->wait != ssl_hs_early_data_rejected) { abort(); } @@ -1386,7 +1391,7 @@ int SSL_get_tls_unique(const SSL *ssl, uint8_t *out, size_t *out_len, // is the client's in a full handshake and the server's for a resumption. See // https://tools.ietf.org/html/rfc5929#section-3.1. Span finished = ssl->s3->previous_client_finished; - if (ssl->session != NULL) { + if (ssl->session != nullptr) { // tls-unique is broken for resumed sessions unless EMS is used. if (!ssl->session->extended_master_secret) { return 0; @@ -1430,7 +1435,7 @@ const uint8_t *SSL_get0_session_id_context(const SSL *ssl, size_t *out_len) { if (!ssl->config) { assert(ssl->config); *out_len = 0; - return NULL; + return nullptr; } *out_len = ssl->config->cert->sid_ctx.size(); return ssl->config->cert->sid_ctx.data(); @@ -1441,7 +1446,7 @@ int SSL_get_fd(const SSL *ssl) { return SSL_get_rfd(ssl); } int SSL_get_rfd(const SSL *ssl) { int ret = -1; BIO *b = BIO_find_type(SSL_get_rbio(ssl), BIO_TYPE_DESCRIPTOR); - if (b != NULL) { + if (b != nullptr) { BIO_get_fd(b, &ret); } return ret; @@ -1450,7 +1455,7 @@ int SSL_get_rfd(const SSL *ssl) { int SSL_get_wfd(const SSL *ssl) { int ret = -1; BIO *b = BIO_find_type(SSL_get_wbio(ssl), BIO_TYPE_DESCRIPTOR); - if (b != NULL) { + if (b != nullptr) { BIO_get_fd(b, &ret); } return ret; @@ -1459,7 +1464,7 @@ int SSL_get_wfd(const SSL *ssl) { #if !defined(OPENSSL_NO_SOCK) int SSL_set_fd(SSL *ssl, int fd) { BIO *bio = BIO_new(BIO_s_socket()); - if (bio == NULL) { + if (bio == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_BUF_LIB); return 0; } @@ -1470,10 +1475,10 @@ int SSL_set_fd(SSL *ssl, int fd) { int SSL_set_wfd(SSL *ssl, int fd) { BIO *rbio = SSL_get_rbio(ssl); - if (rbio == NULL || BIO_method_type(rbio) != BIO_TYPE_SOCKET || - BIO_get_fd(rbio, NULL) != fd) { + if (rbio == nullptr || BIO_method_type(rbio) != BIO_TYPE_SOCKET || + BIO_get_fd(rbio, nullptr) != fd) { BIO *bio = BIO_new(BIO_s_socket()); - if (bio == NULL) { + if (bio == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_BUF_LIB); return 0; } @@ -1490,10 +1495,10 @@ int SSL_set_wfd(SSL *ssl, int fd) { int SSL_set_rfd(SSL *ssl, int fd) { BIO *wbio = SSL_get_wbio(ssl); - if (wbio == NULL || BIO_method_type(wbio) != BIO_TYPE_SOCKET || - BIO_get_fd(wbio, NULL) != fd) { + if (wbio == nullptr || BIO_method_type(wbio) != BIO_TYPE_SOCKET || + BIO_get_fd(wbio, nullptr) != fd) { BIO *bio = BIO_new(BIO_s_socket()); - if (bio == NULL) { + if (bio == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_BUF_LIB); return 0; } @@ -1561,12 +1566,12 @@ int SSL_get_extms_support(const SSL *ssl) { } // If the initial handshake completed, query the established session. - if (ssl->s3->established_session != NULL) { + if (ssl->s3->established_session != nullptr) { return ssl->s3->established_session->extended_master_secret; } // Otherwise, query the in-progress handshake. - if (ssl->s3->hs != NULL) { + if (ssl->s3->hs != nullptr) { return ssl->s3->hs->extended_master_secret; } assert(0); @@ -1760,7 +1765,7 @@ int SSL_CTX_get_session_cache_mode(const SSL_CTX *ctx) { int SSL_CTX_get_tlsext_ticket_keys(SSL_CTX *ctx, void *out, size_t len) { - if (out == NULL) { + if (out == nullptr) { return 48; } if (len != 48) { @@ -1783,7 +1788,7 @@ int SSL_CTX_get_tlsext_ticket_keys(SSL_CTX *ctx, void *out, size_t len) { } int SSL_CTX_set_tlsext_ticket_keys(SSL_CTX *ctx, const void *in, size_t len) { - if (in == NULL) { + if (in == nullptr) { return 48; } if (len != 48) { @@ -1814,6 +1819,21 @@ int SSL_CTX_set_tlsext_ticket_key_cb( return 1; } +static bool check_no_duplicates(Span list) { + if (list.size() < 2) { + return true; + } + for (size_t i = 0; i < list.size() - 1; ++i) { + for (size_t j = i + 1; j < list.size(); ++j) { + if (list[i] == list[j]) { + OPENSSL_PUT_ERROR(SSL, SSL_R_DUPLICATE_GROUP); + return false; + } + } + } + return true; +} + static bool check_group_ids(Span group_ids) { for (uint16_t group_id : group_ids) { if (ssl_group_id_to_nid(group_id) == NID_undef) { @@ -1821,12 +1841,46 @@ static bool check_group_ids(Span group_ids) { return false; } } - return true; + return check_no_duplicates(group_ids); +} + +// validate_key_shares returns whether the `requested_key_shares` are free of +// duplicates and are a (correctly ordered) subsequence of the supported +// `groups`. +static bool validate_key_shares(Span requested_key_shares, + Span groups) { + if (!check_no_duplicates(requested_key_shares)) { + return false; + } + if (requested_key_shares.size() > groups.size()) { + return false; + } + size_t key_shares_idx = 0u, groups_idx = 0u; + while (key_shares_idx < requested_key_shares.size() && + groups_idx < groups.size()) { + if (requested_key_shares[key_shares_idx] == groups[groups_idx++]) { + ++key_shares_idx; + } + } + return key_shares_idx == requested_key_shares.size(); +} + +static void clear_key_shares_if_invalid(SSL_CONFIG *config) { + if (!config->client_key_share_selections) { + return; + } + if (!validate_key_shares(*(config->client_key_share_selections), + config->supported_group_list)) { + config->client_key_share_selections.reset(); + } } int SSL_CTX_set1_group_ids(SSL_CTX *ctx, const uint16_t *group_ids, size_t num_group_ids) { auto span = Span(group_ids, num_group_ids); + if (span.empty()) { + span = DefaultSupportedGroupIds(); + } return check_group_ids(span) && ctx->supported_group_list.CopyFrom(span); } @@ -1836,12 +1890,22 @@ int SSL_set1_group_ids(SSL *ssl, const uint16_t *group_ids, return 0; } auto span = Span(group_ids, num_group_ids); - return check_group_ids(span) && - ssl->config->supported_group_list.CopyFrom(span); + if (span.empty()) { + span = DefaultSupportedGroupIds(); + } + if (check_group_ids(span) && + ssl->config->supported_group_list.CopyFrom(span)) { + clear_key_shares_if_invalid(ssl->config.get()); + return 1; + } + return 0; } static bool ssl_nids_to_group_ids(Array *out_group_ids, Span nids) { + if (nids.empty()) { + return out_group_ids->CopyFrom(DefaultSupportedGroupIds()); + } Array group_ids; if (!group_ids.InitForOverwrite(nids.size())) { return false; @@ -1853,6 +1917,9 @@ static bool ssl_nids_to_group_ids(Array *out_group_ids, return false; } } + if (!check_no_duplicates(group_ids)) { + return false; + } *out_group_ids = std::move(group_ids); return true; @@ -1867,8 +1934,12 @@ int SSL_set1_groups(SSL *ssl, const int *groups, size_t num_groups) { if (!ssl->config) { return 0; } - return ssl_nids_to_group_ids(&ssl->config->supported_group_list, - Span(groups, num_groups)); + if (ssl_nids_to_group_ids(&ssl->config->supported_group_list, + Span(groups, num_groups))) { + clear_key_shares_if_invalid(ssl->config.get()); + return 1; + } + return 0; } static bool ssl_str_to_group_ids(Array *out_group_ids, @@ -1904,6 +1975,9 @@ static bool ssl_str_to_group_ids(Array *out_group_ids, } while (col); assert(i == count); + if (!check_no_duplicates(group_ids)) { + return false; + } *out_group_ids = std::move(group_ids); return true; } @@ -1916,12 +1990,16 @@ int SSL_set1_groups_list(SSL *ssl, const char *groups) { if (!ssl->config) { return 0; } - return ssl_str_to_group_ids(&ssl->config->supported_group_list, groups); + if (ssl_str_to_group_ids(&ssl->config->supported_group_list, groups)) { + clear_key_shares_if_invalid(ssl->config.get()); + return 1; + } + return 0; } uint16_t SSL_get_group_id(const SSL *ssl) { SSL_SESSION *session = SSL_get_session(ssl); - if (session == NULL) { + if (session == nullptr) { return 0; } @@ -1936,6 +2014,33 @@ int SSL_get_negotiated_group(const SSL *ssl) { return ssl_group_id_to_nid(group_id); } +int SSL_set1_client_key_shares(SSL *ssl, const uint16_t *group_ids, + size_t num_group_ids) { + if (!ssl->config) { + return 0; + } + auto requested_key_shares = Span(group_ids, num_group_ids); + if (!validate_key_shares(requested_key_shares, + ssl->config->supported_group_list)) { + return 0; + } + + assert(requested_key_shares.size() <= kNumNamedGroups); + ssl->config->client_key_share_selections.emplace(); + ssl->config->client_key_share_selections->CopyFrom(requested_key_shares); + return 1; +} + +int SSL_set1_server_supported_groups_hint(SSL *ssl, + const uint16_t *server_groups, + size_t num_server_groups) { + if (!ssl->config) { + return 0; + } + auto span = Span(server_groups, num_server_groups); + return ssl->config->server_supported_groups_hint.CopyFrom(span); +} + int SSL_CTX_set_tmp_dh(SSL_CTX *ctx, const DH *dh) { return 1; } int SSL_set_tmp_dh(SSL *ssl, const DH *dh) { return 1; } @@ -1952,12 +2057,12 @@ int SSL_CTX_cipher_in_group(const SSL_CTX *ctx, size_t i) { } STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *ssl) { - if (ssl == NULL) { - return NULL; + if (ssl == nullptr) { + return nullptr; } - if (ssl->config == NULL) { + if (ssl->config == nullptr) { assert(ssl->config); - return NULL; + return nullptr; } return ssl->config->cipher_list ? ssl->config->cipher_list->ciphers.get() @@ -1965,18 +2070,18 @@ STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *ssl) { } const char *SSL_get_cipher_list(const SSL *ssl, int n) { - if (ssl == NULL) { - return NULL; + if (ssl == nullptr) { + return nullptr; } STACK_OF(SSL_CIPHER) *sk = SSL_get_ciphers(ssl); - if (sk == NULL || n < 0 || (size_t)n >= sk_SSL_CIPHER_num(sk)) { - return NULL; + if (sk == nullptr || n < 0 || (size_t)n >= sk_SSL_CIPHER_num(sk)) { + return nullptr; } const SSL_CIPHER *c = sk_SSL_CIPHER_value(sk, n); - if (c == NULL) { - return NULL; + if (c == nullptr) { + return nullptr; } return c->name; @@ -2020,7 +2125,7 @@ int SSL_set_strict_cipher_list(SSL *ssl, const char *str) { const char *SSL_get_servername(const SSL *ssl, const int type) { if (type != TLSEXT_NAMETYPE_host_name) { - return NULL; + return nullptr; } // Historically, |SSL_get_servername| was also the configuration getter @@ -2033,7 +2138,7 @@ const char *SSL_get_servername(const SSL *ssl, const int type) { } int SSL_get_servername_type(const SSL *ssl) { - if (SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name) == NULL) { + if (SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name) == nullptr) { return -1; } return TLSEXT_NAMETYPE_host_name; @@ -2083,7 +2188,7 @@ void SSL_get0_signed_cert_timestamp_list(const SSL *ssl, const uint8_t **out, SSL_SESSION *session = SSL_get_session(ssl); if (ssl->server || !session || !session->signed_cert_timestamp_list) { *out_len = 0; - *out = NULL; + *out = nullptr; return; } @@ -2096,7 +2201,7 @@ void SSL_get0_ocsp_response(const SSL *ssl, const uint8_t **out, SSL_SESSION *session = SSL_get_session(ssl); if (ssl->server || !session || !session->ocsp_response) { *out_len = 0; - *out = NULL; + *out = nullptr; return; } @@ -2415,9 +2520,9 @@ int SSL_session_reused(const SSL *ssl) { return ssl->s3->session_reused || SSL_in_early_data(ssl); } -const COMP_METHOD *SSL_get_current_compression(SSL *ssl) { return NULL; } +const COMP_METHOD *SSL_get_current_compression(SSL *ssl) { return nullptr; } -const COMP_METHOD *SSL_get_current_expansion(SSL *ssl) { return NULL; } +const COMP_METHOD *SSL_get_current_expansion(SSL *ssl) { return nullptr; } int SSL_get_server_tmp_key(SSL *ssl, EVP_PKEY **out_key) { return 0; } @@ -2469,7 +2574,7 @@ SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl) { return ssl->ctx.get(); } SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx) { if (!ssl->config) { - return NULL; + return nullptr; } if (ssl->ctx.get() == ctx) { return ssl->ctx.get(); @@ -2478,7 +2583,7 @@ SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx) { // One cannot change the X.509 callbacks during a connection. if (ssl->ctx->x509_method != ctx->x509_method) { assert(0); - return NULL; + return nullptr; } UniquePtr new_cert = ssl_cert_dup(ctx->cert.get()); @@ -2511,7 +2616,7 @@ void SSL_set_state(SSL *ssl, int state) {} char *SSL_get_shared_ciphers(const SSL *ssl, char *buf, int len) { if (len <= 0) { - return NULL; + return nullptr; } buf[0] = '\0'; return buf; @@ -2591,7 +2696,8 @@ void SSL_set_tmp_dh_callback(SSL *ssl, DH *(*cb)(SSL *ssl, int is_export, static int use_psk_identity_hint(UniquePtr *out, const char *identity_hint) { - if (identity_hint != NULL && strlen(identity_hint) > PSK_MAX_IDENTITY_LEN) { + if (identity_hint != nullptr && + strlen(identity_hint) > PSK_MAX_IDENTITY_LEN) { OPENSSL_PUT_ERROR(SSL, SSL_R_DATA_LENGTH_TOO_LONG); return 0; } @@ -2603,7 +2709,7 @@ static int use_psk_identity_hint(UniquePtr *out, // send either no hint (omit ServerKeyExchange) or an empty hint, while // ECDHE_PSK can only spell empty hint. Having different capabilities is odd, // so we interpret empty and missing as identical. - if (identity_hint != NULL && identity_hint[0] != '\0') { + if (identity_hint != nullptr && identity_hint[0] != '\0') { out->reset(OPENSSL_strdup(identity_hint)); if (*out == nullptr) { return 0; @@ -2625,23 +2731,23 @@ int SSL_use_psk_identity_hint(SSL *ssl, const char *identity_hint) { } const char *SSL_get_psk_identity_hint(const SSL *ssl) { - if (ssl == NULL) { - return NULL; + if (ssl == nullptr) { + return nullptr; } - if (ssl->config == NULL) { + if (ssl->config == nullptr) { assert(ssl->config); - return NULL; + return nullptr; } return ssl->config->psk_identity_hint.get(); } const char *SSL_get_psk_identity(const SSL *ssl) { - if (ssl == NULL) { - return NULL; + if (ssl == nullptr) { + return nullptr; } SSL_SESSION *session = SSL_get_session(ssl); - if (session == NULL) { - return NULL; + if (session == nullptr) { + return nullptr; } return session->psk_identity.get(); } @@ -2739,7 +2845,7 @@ int SSL_in_init(const SSL *ssl) { } int SSL_in_false_start(const SSL *ssl) { - if (ssl->s3->hs == NULL) { + if (ssl->s3->hs == nullptr) { return 0; } return ssl->s3->hs->in_false_start; @@ -2935,7 +3041,7 @@ int SSL_get_dtls_write_traffic_secret(const SSL *ssl, const uint8_t **out_data, uint16_t SSL_get_peer_signature_algorithm(const SSL *ssl) { SSL_SESSION *session = SSL_get_session(ssl); - if (session == NULL) { + if (session == nullptr) { return 0; } @@ -2966,8 +3072,8 @@ size_t SSL_get_server_random(const SSL *ssl, uint8_t *out, size_t max_out) { const SSL_CIPHER *SSL_get_pending_cipher(const SSL *ssl) { SSL_HANDSHAKE *hs = ssl->s3->hs.get(); - if (hs == NULL) { - return NULL; + if (hs == nullptr) { + return nullptr; } return hs->new_cipher; } @@ -3040,7 +3146,7 @@ int SSL_clear(SSL *ssl) { // established session to be offered the next time around. wpa_supplicant // depends on this behavior, so emulate it. UniquePtr session; - if (!ssl->server && ssl->s3->established_session != NULL) { + if (!ssl->server && ssl->s3->established_session != nullptr) { session = UpRef(ssl->s3->established_session); } @@ -3049,7 +3155,7 @@ int SSL_clear(SSL *ssl) { // // TODO(davidben): Avoid this. unsigned mtu = 0; - if (ssl->d1 != NULL) { + if (ssl->d1 != nullptr) { mtu = ssl->d1->mtu; } @@ -3094,7 +3200,7 @@ void SSL_load_error_strings(void) {} int SSL_cache_hit(SSL *ssl) { return SSL_session_reused(ssl); } int SSL_CTX_set_tmp_ecdh(SSL_CTX *ctx, const EC_KEY *ec_key) { - if (ec_key == NULL || EC_KEY_get0_group(ec_key) == NULL) { + if (ec_key == nullptr || EC_KEY_get0_group(ec_key) == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -3103,7 +3209,7 @@ int SSL_CTX_set_tmp_ecdh(SSL_CTX *ctx, const EC_KEY *ec_key) { } int SSL_set_tmp_ecdh(SSL *ssl, const EC_KEY *ec_key) { - if (ec_key == NULL || EC_KEY_get0_group(ec_key) == NULL) { + if (ec_key == nullptr || EC_KEY_get0_group(ec_key) == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -3273,11 +3379,9 @@ static int Configure(SSL_CTX *ctx) { // Encrypt-then-MAC extension is required for all CBC cipher suites and so // it's easier to drop them. SSL_CTX_set_strict_cipher_list(ctx, kTLS12Ciphers) && - SSL_CTX_set1_group_ids(ctx, kGroups, OPENSSL_ARRAY_SIZE(kGroups)) && - SSL_CTX_set_signing_algorithm_prefs(ctx, kSigAlgs, - OPENSSL_ARRAY_SIZE(kSigAlgs)) && - SSL_CTX_set_verify_algorithm_prefs(ctx, kSigAlgs, - OPENSSL_ARRAY_SIZE(kSigAlgs)); + SSL_CTX_set1_group_ids(ctx, kGroups, std::size(kGroups)) && + SSL_CTX_set_signing_algorithm_prefs(ctx, kSigAlgs, std::size(kSigAlgs)) && + SSL_CTX_set_verify_algorithm_prefs(ctx, kSigAlgs, std::size(kSigAlgs)); } static int Configure(SSL *ssl) { @@ -3287,11 +3391,9 @@ static int Configure(SSL *ssl) { return SSL_set_min_proto_version(ssl, TLS1_2_VERSION) && SSL_set_max_proto_version(ssl, TLS1_3_VERSION) && SSL_set_strict_cipher_list(ssl, kTLS12Ciphers) && - SSL_set1_group_ids(ssl, kGroups, OPENSSL_ARRAY_SIZE(kGroups)) && - SSL_set_signing_algorithm_prefs(ssl, kSigAlgs, - OPENSSL_ARRAY_SIZE(kSigAlgs)) && - SSL_set_verify_algorithm_prefs(ssl, kSigAlgs, - OPENSSL_ARRAY_SIZE(kSigAlgs)); + SSL_set1_group_ids(ssl, kGroups, std::size(kGroups)) && + SSL_set_signing_algorithm_prefs(ssl, kSigAlgs, std::size(kSigAlgs)) && + SSL_set_verify_algorithm_prefs(ssl, kSigAlgs, std::size(kSigAlgs)); } } // namespace fips202205 @@ -3320,11 +3422,10 @@ static int Configure(SSL_CTX *ctx) { return SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION) && SSL_CTX_set_max_proto_version(ctx, TLS1_3_VERSION) && SSL_CTX_set_strict_cipher_list(ctx, kTLS12Ciphers) && - SSL_CTX_set1_group_ids(ctx, kGroups, OPENSSL_ARRAY_SIZE(kGroups)) && + SSL_CTX_set1_group_ids(ctx, kGroups, std::size(kGroups)) && SSL_CTX_set_signing_algorithm_prefs(ctx, kSigAlgs, - OPENSSL_ARRAY_SIZE(kSigAlgs)) && - SSL_CTX_set_verify_algorithm_prefs(ctx, kSigAlgs, - OPENSSL_ARRAY_SIZE(kSigAlgs)); + std::size(kSigAlgs)) && + SSL_CTX_set_verify_algorithm_prefs(ctx, kSigAlgs, std::size(kSigAlgs)); } static int Configure(SSL *ssl) { @@ -3333,11 +3434,9 @@ static int Configure(SSL *ssl) { return SSL_set_min_proto_version(ssl, TLS1_2_VERSION) && SSL_set_max_proto_version(ssl, TLS1_3_VERSION) && SSL_set_strict_cipher_list(ssl, kTLS12Ciphers) && - SSL_set1_group_ids(ssl, kGroups, OPENSSL_ARRAY_SIZE(kGroups)) && - SSL_set_signing_algorithm_prefs(ssl, kSigAlgs, - OPENSSL_ARRAY_SIZE(kSigAlgs)) && - SSL_set_verify_algorithm_prefs(ssl, kSigAlgs, - OPENSSL_ARRAY_SIZE(kSigAlgs)); + SSL_set1_group_ids(ssl, kGroups, std::size(kGroups)) && + SSL_set_signing_algorithm_prefs(ssl, kSigAlgs, std::size(kSigAlgs)) && + SSL_set_verify_algorithm_prefs(ssl, kSigAlgs, std::size(kSigAlgs)); } } // namespace wpa202304 diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_privkey.cc b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_privkey.cc index 8e54853582..2346aa4257 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_privkey.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_privkey.cc @@ -101,18 +101,31 @@ static const SSL_SIGNATURE_ALGORITHM kSignatureAlgorithms[] = { }; static const SSL_SIGNATURE_ALGORITHM *get_signature_algorithm(uint16_t sigalg) { - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kSignatureAlgorithms); i++) { - if (kSignatureAlgorithms[i].sigalg == sigalg) { - return &kSignatureAlgorithms[i]; + for (const auto &alg : kSignatureAlgorithms) { + if (alg.sigalg == sigalg) { + return &alg; } } - return NULL; + return nullptr; +} + +bssl::UniquePtr ssl_parse_peer_subject_public_key_info( + Span spki) { + // Ideally the set of reachable algorithms would flow from |SSL_CTX| for dead + // code elimination, but for now we just specify every algorithm that might be + // reachable from libssl. + const EVP_PKEY_ALG *const algs[] = { + EVP_pkey_rsa(), EVP_pkey_ec_p256(), EVP_pkey_ec_p384(), + EVP_pkey_ec_p521(), EVP_pkey_ed25519(), + }; + return bssl::UniquePtr(EVP_PKEY_from_subject_public_key_info( + spki.data(), spki.size(), algs, std::size(algs))); } bool ssl_pkey_supports_algorithm(const SSL *ssl, EVP_PKEY *pkey, uint16_t sigalg, bool is_verify) { const SSL_SIGNATURE_ALGORITHM *alg = get_signature_algorithm(sigalg); - if (alg == NULL || EVP_PKEY_id(pkey) != alg->pkey_type) { + if (alg == nullptr || EVP_PKEY_id(pkey) != alg->pkey_type) { return false; } @@ -172,13 +185,14 @@ static bool setup_ctx(SSL *ssl, EVP_MD_CTX *ctx, EVP_PKEY *pkey, } const SSL_SIGNATURE_ALGORITHM *alg = get_signature_algorithm(sigalg); - const EVP_MD *digest = alg->digest_func != NULL ? alg->digest_func() : NULL; + const EVP_MD *digest = + alg->digest_func != nullptr ? alg->digest_func() : nullptr; EVP_PKEY_CTX *pctx; if (is_verify) { - if (!EVP_DigestVerifyInit(ctx, &pctx, digest, NULL, pkey)) { + if (!EVP_DigestVerifyInit(ctx, &pctx, digest, nullptr, pkey)) { return false; } - } else if (!EVP_DigestSignInit(ctx, &pctx, digest, NULL, pkey)) { + } else if (!EVP_DigestSignInit(ctx, &pctx, digest, nullptr, pkey)) { return false; } @@ -226,7 +240,7 @@ enum ssl_private_key_result_t ssl_private_key_sign( EVP_PKEY *privkey = cred->privkey.get(); assert(!hs->can_release_private_key); - if (key_method != NULL) { + if (key_method != nullptr) { enum ssl_private_key_result_t ret; if (hs->pending_private_key_op) { ret = key_method->complete(ssl, out, out_len, max_out); @@ -286,7 +300,7 @@ enum ssl_private_key_result_t ssl_private_key_decrypt(SSL_HANDSHAKE *hs, SSL *const ssl = hs->ssl; const SSL_CREDENTIAL *const cred = hs->credential.get(); assert(!hs->can_release_private_key); - if (cred->key_method != NULL) { + if (cred->key_method != nullptr) { enum ssl_private_key_result_t ret; if (hs->pending_private_key_op) { ret = cred->key_method->complete(ssl, out, out_len, max_out); @@ -302,7 +316,7 @@ enum ssl_private_key_result_t ssl_private_key_decrypt(SSL_HANDSHAKE *hs, } RSA *rsa = EVP_PKEY_get0_RSA(cred->privkey.get()); - if (rsa == NULL) { + if (rsa == nullptr) { // Decrypt operations are only supported for RSA keys. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); return ssl_private_key_failure; @@ -322,7 +336,7 @@ BSSL_NAMESPACE_END using namespace bssl; int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa) { - if (rsa == NULL || ssl->config == NULL) { + if (rsa == nullptr || ssl->config == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -348,7 +362,7 @@ int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, const uint8_t *der, size_t der_len) { } int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey) { - if (pkey == NULL || ssl->config == NULL) { + if (pkey == nullptr || ssl->config == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -365,7 +379,7 @@ int SSL_use_PrivateKey_ASN1(int type, SSL *ssl, const uint8_t *der, } const uint8_t *p = der; - UniquePtr pkey(d2i_PrivateKey(type, NULL, &p, (long)der_len)); + UniquePtr pkey(d2i_PrivateKey(type, nullptr, &p, (long)der_len)); if (!pkey || p != der + der_len) { OPENSSL_PUT_ERROR(SSL, ERR_R_ASN1_LIB); return 0; @@ -375,7 +389,7 @@ int SSL_use_PrivateKey_ASN1(int type, SSL *ssl, const uint8_t *der, } int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa) { - if (rsa == NULL) { + if (rsa == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -401,7 +415,7 @@ int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const uint8_t *der, } int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey) { - if (pkey == NULL) { + if (pkey == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -418,7 +432,7 @@ int SSL_CTX_use_PrivateKey_ASN1(int type, SSL_CTX *ctx, const uint8_t *der, } const uint8_t *p = der; - UniquePtr pkey(d2i_PrivateKey(type, NULL, &p, (long)der_len)); + UniquePtr pkey(d2i_PrivateKey(type, nullptr, &p, (long)der_len)); if (!pkey || p != der + der_len) { OPENSSL_PUT_ERROR(SSL, ERR_R_ASN1_LIB); return 0; @@ -489,13 +503,13 @@ const char *SSL_get_signature_algorithm_name(uint16_t sigalg, } } - return NULL; + return nullptr; } size_t SSL_get_all_signature_algorithm_names(const char **out, size_t max_out) { - const char *kPredefinedNames[] = {"ecdsa_sha256", "ecdsa_sha384", - "ecdsa_sha512"}; - return GetAllNames(out, max_out, kPredefinedNames, + const char *const kPredefinedNames[] = {"ecdsa_sha256", "ecdsa_sha384", + "ecdsa_sha512"}; + return GetAllNames(out, max_out, Span(kPredefinedNames), &SignatureAlgorithmName::name, Span(kSignatureAlgorithmNames)); } @@ -842,7 +856,7 @@ static bool parse_sigalgs_list(Array *out, const char *str) { buf[buf_used++] = c; } else { OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM); - ERR_add_error_dataf("invalid character 0x%02x at offest %zu", c, + ERR_add_error_dataf("invalid character 0x%02x at offset %zu", c, offset); return false; } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_session.cc b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_session.cc index 01a1211bd9..e7f52a3fb8 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_session.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_session.cc @@ -223,7 +223,7 @@ bool ssl_get_new_session(SSL_HANDSHAKE *hs) { } UniquePtr session = ssl_session_new(ssl->ctx->x509_method); - if (session == NULL) { + if (session == nullptr) { return false; } @@ -258,7 +258,7 @@ bool ssl_get_new_session(SSL_HANDSHAKE *hs) { session->verify_result = X509_V_ERR_INVALID_CALL; hs->new_session = std::move(session); - ssl_set_session(ssl, NULL); + ssl_set_session(ssl, nullptr); return true; } @@ -329,7 +329,7 @@ static int ssl_encrypt_ticket_with_cipher_ctx(SSL_HANDSHAKE *hs, CBB *out, SSL_CTX *tctx = hs->ssl->session_ctx.get(); uint8_t iv[EVP_MAX_IV_LENGTH]; uint8_t key_name[16]; - if (tctx->ticket_key_cb != NULL) { + if (tctx->ticket_key_cb != nullptr) { int ret = tctx->ticket_key_cb(hs->ssl, key_name, iv, ctx.get(), hctx.get(), 1 /* encrypt */); if (ret < 0) { @@ -346,10 +346,10 @@ static int ssl_encrypt_ticket_with_cipher_ctx(SSL_HANDSHAKE *hs, CBB *out, } MutexReadLock lock(&tctx->lock); if (!RAND_bytes(iv, 16) || - !EVP_EncryptInit_ex(ctx.get(), EVP_aes_128_cbc(), NULL, + !EVP_EncryptInit_ex(ctx.get(), EVP_aes_128_cbc(), nullptr, tctx->ticket_key_current->aes_key, iv) || !HMAC_Init_ex(hctx.get(), tctx->ticket_key_current->hmac_key, 16, - tlsext_tick_md(), NULL)) { + tlsext_tick_md(), nullptr)) { return 0; } OPENSSL_memcpy(key_name, tctx->ticket_key_current->name, 16); @@ -465,7 +465,7 @@ bool ssl_session_is_context_valid(const SSL_HANDSHAKE *hs, } bool ssl_session_is_time_valid(const SSL *ssl, const SSL_SESSION *session) { - if (session == NULL) { + if (session == nullptr) { return false; } @@ -665,7 +665,7 @@ void ssl_set_session(SSL *ssl, SSL_SESSION *session) { // locked by SSL_CTX in the calling function static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *session) { - if (session->next == NULL || session->prev == NULL) { + if (session->next == nullptr || session->prev == nullptr) { return; } @@ -673,8 +673,8 @@ static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *session) { // last element in list if (session->prev == (SSL_SESSION *)&ctx->session_cache_head) { // only one element in list - ctx->session_cache_head = NULL; - ctx->session_cache_tail = NULL; + ctx->session_cache_head = nullptr; + ctx->session_cache_tail = nullptr; } else { ctx->session_cache_tail = session->prev; session->prev->next = (SSL_SESSION *)&(ctx->session_cache_tail); @@ -689,15 +689,15 @@ static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *session) { session->prev->next = session->next; } } - session->prev = session->next = NULL; + session->prev = session->next = nullptr; } static void SSL_SESSION_list_add(SSL_CTX *ctx, SSL_SESSION *session) { - if (session->next != NULL && session->prev != NULL) { + if (session->next != nullptr && session->prev != nullptr) { SSL_SESSION_list_remove(ctx, session); } - if (ctx->session_cache_head == NULL) { + if (ctx->session_cache_head == nullptr) { ctx->session_cache_head = session; ctx->session_cache_tail = session; session->prev = (SSL_SESSION *)&(ctx->session_cache_head); @@ -843,7 +843,7 @@ void SSL_SESSION_free(SSL_SESSION *session) { const uint8_t *SSL_SESSION_get_id(const SSL_SESSION *session, unsigned *out_len) { - if (out_len != NULL) { + if (out_len != nullptr) { *out_len = session->session_id.size(); } return session->session_id.data(); @@ -864,7 +864,7 @@ uint32_t SSL_SESSION_get_timeout(const SSL_SESSION *session) { } uint64_t SSL_SESSION_get_time(const SSL_SESSION *session) { - if (session == NULL) { + if (session == nullptr) { // NULL should crash, but silently accept it here for compatibility. return 0; } @@ -916,7 +916,7 @@ size_t SSL_SESSION_get_master_key(const SSL_SESSION *session, uint8_t *out, } uint64_t SSL_SESSION_set_time(SSL_SESSION *session, uint64_t time) { - if (session == NULL) { + if (session == nullptr) { return 0; } @@ -925,7 +925,7 @@ uint64_t SSL_SESSION_set_time(SSL_SESSION *session, uint64_t time) { } uint32_t SSL_SESSION_set_timeout(SSL_SESSION *session, uint32_t timeout) { - if (session == NULL) { + if (session == nullptr) { return 0; } @@ -936,7 +936,7 @@ uint32_t SSL_SESSION_set_timeout(SSL_SESSION *session, uint32_t timeout) { const uint8_t *SSL_SESSION_get0_id_context(const SSL_SESSION *session, unsigned *out_len) { - if (out_len != NULL) { + if (out_len != nullptr) { *out_len = session->sid_ctx.size(); } return session->sid_ctx.data(); @@ -1061,7 +1061,7 @@ SSL_SESSION *SSL_get_session(const SSL *ssl) { SSL_SESSION *SSL_get1_session(SSL *ssl) { SSL_SESSION *ret = SSL_get_session(ssl); - if (ret != NULL) { + if (ret != nullptr) { SSL_SESSION_up_ref(ret); } return ret; @@ -1095,7 +1095,7 @@ int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *session) { int SSL_set_session(SSL *ssl, SSL_SESSION *session) { // SSL_set_session may only be called before the handshake has started. if (ssl->s3->initial_handshake_complete || // - ssl->s3->hs == NULL || // + ssl->s3->hs == nullptr || // ssl->s3->hs->state != 0) { abort(); } @@ -1105,7 +1105,7 @@ int SSL_set_session(SSL *ssl, SSL_SESSION *session) { } uint32_t SSL_CTX_set_timeout(SSL_CTX *ctx, uint32_t timeout) { - if (ctx == NULL) { + if (ctx == nullptr) { return 0; } @@ -1120,7 +1120,7 @@ uint32_t SSL_CTX_set_timeout(SSL_CTX *ctx, uint32_t timeout) { } uint32_t SSL_CTX_get_timeout(const SSL_CTX *ctx) { - if (ctx == NULL) { + if (ctx == nullptr) { return 0; } @@ -1148,7 +1148,7 @@ static void timeout_doall_arg(SSL_SESSION *session, void *void_param) { SSL_SESSION_list_remove(param->ctx, session); // TODO(https://crbug.com/boringssl/251): Callbacks should not be called // under a lock. - if (param->ctx->remove_session_cb != NULL) { + if (param->ctx->remove_session_cb != nullptr) { param->ctx->remove_session_cb(param->ctx, session); } SSL_SESSION_free(session); @@ -1160,7 +1160,7 @@ void SSL_CTX_flush_sessions(SSL_CTX *ctx, uint64_t time) { tp.ctx = ctx; tp.cache = ctx->sessions; - if (tp.cache == NULL) { + if (tp.cache == nullptr) { return; } tp.time = time; diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_transcript.cc b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_transcript.cc index b51a566ad0..101da70a83 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_transcript.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_transcript.cc @@ -168,8 +168,8 @@ bool SSLTranscript::Update(Span in) { // transcript format as TLS 1.3 is used. This means we write the 1-byte // msg_type, 3-byte length, then skip 2+3+3 bytes for the DTLS-specific // fields that get omitted. - if (!AddToBufferOrHash(in.subspan(0, 4)) || - !AddToBufferOrHash(in.subspan(12))) { + if (!AddToBufferOrHash(in.first<4>()) || + !AddToBufferOrHash(in.subspan<12>())) { return false; } return true; @@ -183,7 +183,7 @@ bool SSLTranscript::AddToBufferOrHash(Span in) { return false; } - if (EVP_MD_CTX_md(hash_.get()) != NULL) { + if (EVP_MD_CTX_md(hash_.get()) != nullptr) { EVP_DigestUpdate(hash_.get(), in.data(), in.size()); } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_versions.cc b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_versions.cc index 81b5fbf082..278504b784 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_versions.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_versions.cc @@ -16,7 +16,7 @@ #include -#include +#include #include #include @@ -90,7 +90,7 @@ bool ssl_method_supports_version(const SSL_PROTOCOL_METHOD *method, // The following functions map between API versions and wire versions. The // public API works on wire versions. -static const char *kUnknownVersion = "unknown"; +static const char *const kUnknownVersion = "unknown"; struct VersionInfo { uint16_t version; @@ -211,9 +211,9 @@ bool ssl_get_version_range(const SSL_HANDSHAKE *hs, uint16_t *out_min_version, // To account for both of these, OpenSSL interprets the client-side bitmask // as a min/max range by picking the lowest contiguous non-empty range of // enabled protocols. Note that this means it is impossible to set a maximum - // version of the higest supported TLS version in a future-proof way. + // version of the highest supported TLS version in a future-proof way. bool any_enabled = false; - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kProtocolVersions); i++) { + for (size_t i = 0; i < std::size(kProtocolVersions); i++) { // Only look at the versions already enabled. if (min_version > kProtocolVersions[i].version) { continue; diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_x509.cc b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_x509.cc index 51e4ffaea1..3edd09f9b5 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/ssl_x509.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/ssl_x509.cc @@ -26,6 +26,7 @@ #include #include "../crypto/internal.h" +#include "../crypto/bytestring/internal.h" #include "internal.h" @@ -35,25 +36,25 @@ BSSL_NAMESPACE_BEGIN // installed. Calling an X509-based method on an |ssl| with a different method // will likely misbehave and possibly crash or leak memory. static void check_ssl_x509_method(const SSL *ssl) { - assert(ssl == NULL || ssl->ctx->x509_method == &ssl_crypto_x509_method); + assert(ssl == nullptr || ssl->ctx->x509_method == &ssl_crypto_x509_method); } // check_ssl_ctx_x509_method acts like |check_ssl_x509_method|, but for an // |SSL_CTX|. static void check_ssl_ctx_x509_method(const SSL_CTX *ctx) { - assert(ctx == NULL || ctx->x509_method == &ssl_crypto_x509_method); + assert(ctx == nullptr || ctx->x509_method == &ssl_crypto_x509_method); } // x509_to_buffer returns a |CRYPTO_BUFFER| that contains the serialised // contents of |x509|. static UniquePtr x509_to_buffer(X509 *x509) { - uint8_t *buf = NULL; + uint8_t *buf = nullptr; int cert_len = i2d_X509(x509, &buf); if (cert_len <= 0) { - return 0; + return nullptr; } - UniquePtr buffer(CRYPTO_BUFFER_new(buf, cert_len, NULL)); + UniquePtr buffer(CRYPTO_BUFFER_new(buf, cert_len, nullptr)); OPENSSL_free(buf); return buffer; @@ -71,7 +72,7 @@ static void ssl_crypto_x509_cert_flush_cached_chain(CERT *cert) { // ssl_cert_set1_chain sets elements 1.. of |cert->chain| to the serialised // forms of elements of |chain|. It returns one on success or zero on error, in -// which case no change to |cert->chain| is made. It preverses the existing +// which case no change to |cert->chain| is made. It preserves the existing // leaf from |cert->chain|, if any. static bool ssl_cert_set1_chain(CERT *cert, STACK_OF(X509) *chain) { cert->legacy_credential->ClearIntermediateCerts(); @@ -370,12 +371,12 @@ using namespace bssl; X509 *SSL_get_peer_certificate(const SSL *ssl) { check_ssl_x509_method(ssl); - if (ssl == NULL) { - return NULL; + if (ssl == nullptr) { + return nullptr; } SSL_SESSION *session = SSL_get_session(ssl); - if (session == NULL || session->x509_peer == NULL) { - return NULL; + if (session == nullptr || session->x509_peer == nullptr) { + return nullptr; } X509_up_ref(session->x509_peer); return session->x509_peer; @@ -399,8 +400,8 @@ STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *ssl) { STACK_OF(X509) *SSL_get_peer_full_cert_chain(const SSL *ssl) { check_ssl_x509_method(ssl); SSL_SESSION *session = SSL_get_session(ssl); - if (session == NULL) { - return NULL; + if (session == nullptr) { + return nullptr; } return session->x509_chain; @@ -454,7 +455,7 @@ X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl) { check_ssl_x509_method(ssl); if (!ssl->config) { assert(ssl->config); - return 0; + return nullptr; } return ssl->config->param; } @@ -472,7 +473,7 @@ int (*SSL_get_verify_callback(const SSL *ssl))(int, X509_STORE_CTX *) { check_ssl_x509_method(ssl); if (!ssl->config) { assert(ssl->config); - return 0; + return nullptr; } return ssl->config->verify_callback; } @@ -500,7 +501,7 @@ void SSL_set_verify(SSL *ssl, int mode, return; } ssl->config->verify_mode = mode; - if (callback != NULL) { + if (callback != nullptr) { ssl->config->verify_callback = callback; } } @@ -546,7 +547,7 @@ int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *ca_file, long SSL_get_verify_result(const SSL *ssl) { check_ssl_x509_method(ssl); SSL_SESSION *session = SSL_get_session(ssl); - if (session == NULL) { + if (session == nullptr) { return X509_V_ERR_INVALID_CALL; } return session->verify_result; @@ -564,7 +565,7 @@ void SSL_CTX_set_cert_store(SSL_CTX *ctx, X509_STORE *store) { } static int ssl_use_certificate(CERT *cert, X509 *x) { - if (x == NULL) { + if (x == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER); return 0; } @@ -596,7 +597,7 @@ static int ssl_cert_cache_leaf_cert(CERT *cert) { assert(cert->x509_method); const SSL_CREDENTIAL *cred = cert->legacy_credential.get(); - if (cert->x509_leaf != NULL || cred->chain == NULL) { + if (cert->x509_leaf != nullptr || cred->chain == nullptr) { return 1; } @@ -606,13 +607,13 @@ static int ssl_cert_cache_leaf_cert(CERT *cert) { } cert->x509_leaf = X509_parse_from_buffer(leaf); - return cert->x509_leaf != NULL; + return cert->x509_leaf != nullptr; } static X509 *ssl_cert_get0_leaf(CERT *cert) { - if (cert->x509_leaf == NULL && // + if (cert->x509_leaf == nullptr && // !ssl_cert_cache_leaf_cert(cert)) { - return NULL; + return nullptr; } return cert->x509_leaf; @@ -622,7 +623,7 @@ X509 *SSL_get_certificate(const SSL *ssl) { check_ssl_x509_method(ssl); if (!ssl->config) { assert(ssl->config); - return 0; + return nullptr; } return ssl_cert_get0_leaf(ssl->config->cert.get()); } @@ -723,7 +724,7 @@ int SSL_add1_chain_cert(SSL *ssl, X509 *x509) { int SSL_CTX_clear_chain_certs(SSL_CTX *ctx) { check_ssl_ctx_x509_method(ctx); - return SSL_CTX_set0_chain(ctx, NULL); + return SSL_CTX_set0_chain(ctx, nullptr); } int SSL_CTX_clear_extra_chain_certs(SSL_CTX *ctx) { @@ -733,7 +734,7 @@ int SSL_CTX_clear_extra_chain_certs(SSL_CTX *ctx) { int SSL_clear_chain_certs(SSL *ssl) { check_ssl_x509_method(ssl); - return SSL_set0_chain(ssl, NULL); + return SSL_set0_chain(ssl, nullptr); } // ssl_cert_cache_chain_certs fills in |cert->x509_chain| from elements 1.. of @@ -769,7 +770,7 @@ int SSL_CTX_get0_chain_certs(const SSL_CTX *ctx, STACK_OF(X509) **out_chain) { check_ssl_ctx_x509_method(ctx); MutexWriteLock lock(const_cast(&ctx->lock)); if (!ssl_cert_cache_chain_certs(ctx->cert.get())) { - *out_chain = NULL; + *out_chain = nullptr; return 0; } @@ -789,7 +790,7 @@ int SSL_get0_chain_certs(const SSL *ssl, STACK_OF(X509) **out_chain) { return 0; } if (!ssl_cert_cache_chain_certs(ssl->config->cert.get())) { - *out_chain = NULL; + *out_chain = nullptr; return 0; } @@ -801,7 +802,7 @@ SSL_SESSION *d2i_SSL_SESSION_bio(BIO *bio, SSL_SESSION **out) { uint8_t *data; size_t len; if (!BIO_read_asn1(bio, &data, &len, 1024 * 1024)) { - return 0; + return nullptr; } bssl::UniquePtr free_data(data); const uint8_t *ptr = data; @@ -820,35 +821,15 @@ int i2d_SSL_SESSION_bio(BIO *bio, const SSL_SESSION *session) { IMPLEMENT_PEM_rw(SSL_SESSION, SSL_SESSION, PEM_STRING_SSL_SESSION, SSL_SESSION) -SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const uint8_t **pp, long length) { - if (length < 0) { - OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); - return NULL; - } - - CBS cbs; - CBS_init(&cbs, *pp, length); - - UniquePtr ret = SSL_SESSION_parse(&cbs, &ssl_crypto_x509_method, - NULL /* no buffer pool */); - if (!ret) { - return NULL; - } - - if (a) { - SSL_SESSION_free(*a); - *a = ret.get(); - } - *pp = CBS_data(&cbs); - return ret.release(); +SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **out, const uint8_t **inp, long len) { + return bssl::D2IFromCBS(out, inp, len, [](CBS *cbs) { + return SSL_SESSION_parse(cbs, &ssl_crypto_x509_method, + nullptr /* no buffer pool */); + }); } STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *list) { - // TODO(https://crbug.com/boringssl/407): |X509_NAME_dup| should be const. - auto name_dup = [](const X509_NAME *name) { - return X509_NAME_dup(const_cast(name)); - }; - return sk_X509_NAME_deep_copy(list, name_dup, X509_NAME_free); + return sk_X509_NAME_deep_copy(list, X509_NAME_dup, X509_NAME_free); } static void set_client_CA_list(UniquePtr *ca_list, @@ -860,7 +841,7 @@ static void set_client_CA_list(UniquePtr *ca_list, } for (X509_NAME *name : name_list) { - uint8_t *outp = NULL; + uint8_t *outp = nullptr; int len = i2d_X509_NAME(name, &outp); if (len < 0) { return; @@ -895,17 +876,17 @@ void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list) { static STACK_OF(X509_NAME) *buffer_names_to_x509( const STACK_OF(CRYPTO_BUFFER) *names, STACK_OF(X509_NAME) **cached) { - if (names == NULL) { - return NULL; + if (names == nullptr) { + return nullptr; } - if (*cached != NULL) { + if (*cached != nullptr) { return *cached; } UniquePtr new_cache(sk_X509_NAME_new_null()); if (!new_cache) { - return NULL; + return nullptr; } for (const CRYPTO_BUFFER *buffer : names) { @@ -915,7 +896,7 @@ static STACK_OF(X509_NAME) *buffer_names_to_x509( if (!name || inp != CRYPTO_BUFFER_data(buffer) + CRYPTO_BUFFER_len(buffer) || !PushToStack(new_cache.get(), std::move(name))) { - return NULL; + return nullptr; } } @@ -927,23 +908,23 @@ STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *ssl) { check_ssl_x509_method(ssl); if (!ssl->config) { assert(ssl->config); - return NULL; + return nullptr; } // For historical reasons, this function is used both to query configuration // state on a server as well as handshake state on a client. However, whether // |ssl| is a client or server is not known until explicitly configured with // |SSL_set_connect_state|. If |do_handshake| is NULL, |ssl| is in an // indeterminate mode and |ssl->server| is unset. - if (ssl->do_handshake != NULL && !ssl->server) { - if (ssl->s3->hs != NULL) { + if (ssl->do_handshake != nullptr && !ssl->server) { + if (ssl->s3->hs != nullptr) { return buffer_names_to_x509(ssl->s3->hs->ca_names.get(), &ssl->s3->hs->cached_x509_ca_names); } - return NULL; + return nullptr; } - if (ssl->config->client_CA != NULL) { + if (ssl->config->client_CA != nullptr) { return buffer_names_to_x509( ssl->config->client_CA.get(), (STACK_OF(X509_NAME) **)&ssl->config->cached_x509_client_CA); @@ -963,11 +944,11 @@ STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *ctx) { static int add_client_CA(UniquePtr *names, X509 *x509, CRYPTO_BUFFER_POOL *pool) { - if (x509 == NULL) { + if (x509 == nullptr) { return 0; } - uint8_t *outp = NULL; + uint8_t *outp = nullptr; int len = i2d_X509_NAME(X509_get_subject_name(x509), &outp); if (len < 0) { return 0; @@ -984,7 +965,7 @@ static int add_client_CA(UniquePtr *names, X509 *x509, names->reset(sk_CRYPTO_BUFFER_new_null()); alloced = 1; - if (*names == NULL) { + if (*names == nullptr) { return 0; } } @@ -1031,8 +1012,8 @@ static int do_client_cert_cb(SSL *ssl, void *arg) { return 1; } - X509 *x509 = NULL; - EVP_PKEY *pkey = NULL; + X509 *x509 = nullptr; + EVP_PKEY *pkey = nullptr; int ret = ssl->ctx->client_cert_cb(ssl, &x509, &pkey); if (ret < 0) { return -1; @@ -1055,7 +1036,7 @@ void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, EVP_PKEY **out_pkey)) { check_ssl_ctx_x509_method(ctx); // Emulate the old client certificate callback with the new one. - SSL_CTX_set_cert_cb(ctx, do_client_cert_cb, NULL); + SSL_CTX_set_cert_cb(ctx, do_client_cert_cb, nullptr); ctx->client_cert_cb = cb; } @@ -1064,7 +1045,7 @@ static int set_cert_store(X509_STORE **store_ptr, X509_STORE *new_store, X509_STORE_free(*store_ptr); *store_ptr = new_store; - if (new_store != NULL && take_ref) { + if (new_store != nullptr && take_ref) { X509_STORE_up_ref(new_store); } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/t1_enc.cc b/naiveproxy/src/third_party/boringssl/src/ssl/t1_enc.cc index 9b1f624686..20a21581b9 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/t1_enc.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/t1_enc.cc @@ -48,7 +48,7 @@ bool tls1_prf(const EVP_MD *digest, Span out, static bool get_key_block_lengths(const SSL *ssl, size_t *out_mac_secret_len, size_t *out_key_len, size_t *out_iv_len, const SSL_CIPHER *cipher) { - const EVP_AEAD *aead = NULL; + const EVP_AEAD *aead = nullptr; if (!ssl_cipher_get_evp_aead(&aead, out_mac_secret_len, out_iv_len, cipher, ssl_protocol_version(ssl))) { OPENSSL_PUT_ERROR(SSL, SSL_R_CIPHER_OR_HASH_UNAVAILABLE); diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/tls13_both.cc b/naiveproxy/src/third_party/boringssl/src/ssl/tls13_both.cc index db615e00c5..257e4c9973 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/tls13_both.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/tls13_both.cc @@ -256,6 +256,7 @@ bool tls13_process_certificate(SSL_HANDSHAKE *hs, const SSLMessage &msg, status_type != TLSEXT_STATUSTYPE_ocsp || !CBS_get_u24_length_prefixed(&status_request.data, &ocsp_response) || CBS_len(&ocsp_response) == 0 || CBS_len(&status_request.data) != 0) { + OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR); ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); return false; } @@ -334,7 +335,7 @@ bool tls13_process_certificate(SSL_HANDSHAKE *hs, const SSLMessage &msg, bool tls13_process_certificate_verify(SSL_HANDSHAKE *hs, const SSLMessage &msg) { SSL *const ssl = hs->ssl; - if (hs->peer_pubkey == NULL) { + if (hs->peer_pubkey == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); return false; } @@ -460,7 +461,7 @@ bool tls13_add_certificate(SSL_HANDSHAKE *hs) { } } - if (hs->ocsp_stapling_requested && cred->ocsp_response != NULL) { + if (hs->ocsp_stapling_requested && cred->ocsp_response != nullptr) { CBB contents, ocsp_response; if (!CBB_add_u16(&extensions, TLSEXT_TYPE_status_request) || !CBB_add_u16_length_prefixed(&extensions, &contents) || diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/tls13_client.cc b/naiveproxy/src/third_party/boringssl/src/ssl/tls13_client.cc index e18ad11bab..bc653e9602 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/tls13_client.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/tls13_client.cc @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -252,7 +253,11 @@ static enum ssl_hs_wait_t do_read_hello_retry_request(SSL_HANDSHAKE *hs) { // The ECH extension, if present, was already parsed by // |check_ech_confirmation|. SSLExtension cookie(TLSEXT_TYPE_cookie), - key_share(TLSEXT_TYPE_key_share, !hs->key_share_bytes.empty()), + // If offering PAKE, we won't send key_share extensions and we should + // reject key_share from the peer. Otherwise, it is valid to have sent an + // empty key_share extension, and expect the HelloRetryRequest to contain + // a key_share. + key_share(TLSEXT_TYPE_key_share, !hs->pake_prover), supported_versions(TLSEXT_TYPE_supported_versions), ech_unused(TLSEXT_TYPE_encrypted_client_hello, hs->selected_ech_config || hs->config->ech_grease_enabled); @@ -285,8 +290,6 @@ static enum ssl_hs_wait_t do_read_hello_retry_request(SSL_HANDSHAKE *hs) { } if (key_share.present) { - // If offering PAKE, we won't send key_share extensions, in which case we - // would have rejected key_share from the peer. assert(!hs->pake_prover); uint16_t group_id; @@ -306,8 +309,10 @@ static enum ssl_hs_wait_t do_read_hello_retry_request(SSL_HANDSHAKE *hs) { // Check that the HelloRetryRequest does not request a key share that was // provided in the initial ClientHello. - if (hs->key_shares[0]->GroupID() == group_id || - (hs->key_shares[1] && hs->key_shares[1]->GroupID() == group_id)) { + if (std::find_if(hs->key_shares.begin(), hs->key_shares.end(), + [group_id](const auto &hs_key_share) { + return hs_key_share->GroupID() == group_id; + }) != hs->key_shares.end()) { ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER); OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE); return ssl_hs_error; @@ -426,7 +431,7 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) { ssl_session_get_type(ssl->session.get()) == SSLSessionType::kPreSharedKey && ssl->s3->ech_status != ssl_ech_rejected; - SSLExtension key_share(TLSEXT_TYPE_key_share, hs->key_shares[0] != nullptr), + SSLExtension key_share(TLSEXT_TYPE_key_share, !hs->key_shares.empty()), pake_share(TLSEXT_TYPE_pake, hs->pake_prover != nullptr), pre_shared_key(TLSEXT_TYPE_pre_shared_key, pre_shared_key_allowed), supported_versions(TLSEXT_TYPE_supported_versions); @@ -519,7 +524,7 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) { ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); return ssl_hs_error; } - ssl_set_session(ssl, NULL); + ssl_set_session(ssl, nullptr); // Resumption incorporates fresh key material, so refresh the timeout. ssl_session_renew_timeout(ssl, hs->new_session.get(), @@ -1144,7 +1149,7 @@ bool tls13_process_new_session_ticket(SSL *ssl, const SSLMessage &msg) { } if ((ssl->session_ctx->session_cache_mode & SSL_SESS_CACHE_CLIENT) && - ssl->session_ctx->new_session_cb != NULL && + ssl->session_ctx->new_session_cb != nullptr && ssl->session_ctx->new_session_cb(ssl, session.get())) { // |new_session_cb|'s return value signals that it took ownership. session.release(); diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/tls13_enc.cc b/naiveproxy/src/third_party/boringssl/src/ssl/tls13_enc.cc index ee8a459b78..c5baa83b3c 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/tls13_enc.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/tls13_enc.cc @@ -98,7 +98,7 @@ static bool hkdf_expand_label_with_prefix(Span out, // arbitrary prefix for the label instead of using the hardcoded "tls13 " // prefix. CBB cbb, child; - uint8_t *hkdf_label = NULL; + uint8_t *hkdf_label = nullptr; size_t hkdf_label_len; CBB_zero(&cbb); if (!CBB_init(&cbb, @@ -284,7 +284,7 @@ class ChaChaRecordNumberEncrypter : public RecordNumberEncrypter { return false; } uint32_t counter = CRYPTO_load_u32_le(sample.data()); - Span nonce = sample.subspan(4); + auto nonce = sample.subspan<4>(); OPENSSL_memset(out.data(), 0, out.size()); CRYPTO_chacha_20(out.data(), out.data(), out.size(), key_, nonce.data(), counter); @@ -558,8 +558,8 @@ static bool tls13_psk_binder(uint8_t *out, size_t *out_len, if (truncated.size() < DTLS1_HM_HEADER_LENGTH) { return false; } - auto header = truncated.subspan(0, 4); - auto body = truncated.subspan(12); + auto header = truncated.first<4>(); + auto body = truncated.subspan<12>(); if (!transcript.CopyToHashContext(ctx.get(), digest) || !EVP_DigestUpdate(ctx.get(), header.data(), header.size()) || !EVP_DigestUpdate(ctx.get(), body.data(), body.size()) || @@ -644,10 +644,11 @@ size_t ssl_ech_confirmation_signal_hello_offset(const SSL *ssl) { ECH_CONFIRMATION_SIGNAL_LEN; } -bool ssl_ech_accept_confirmation(const SSL_HANDSHAKE *hs, Span out, - Span client_random, - const SSLTranscript &transcript, bool is_hrr, - Span msg, size_t offset) { +bool ssl_ech_accept_confirmation( + const SSL_HANDSHAKE *hs, Span out, + Span client_random, + const SSLTranscript &transcript, bool is_hrr, Span msg, + size_t offset) { // See draft-ietf-tls-esni-13, sections 7.2 and 7.2.1. static const uint8_t kZeros[EVP_MAX_MD_SIZE] = {0}; @@ -659,7 +660,9 @@ bool ssl_ech_accept_confirmation(const SSL_HANDSHAKE *hs, Span out, // We represent DTLS messages with the longer DTLS 1.2 header, but DTLS 1.3 // removes the extra fields from the transcript. - auto header = msg.subspan(0, SSL3_HM_HEADER_LENGTH); + // + // Size bound implied by ECH_CONFIRMATION_SIGNAL_LEN >= SSL3_HM_HEADER_LENGTH. + auto header = msg.first(); size_t full_header_len = SSL_is_dtls(hs->ssl) ? DTLS1_HM_HEADER_LENGTH : SSL3_HM_HEADER_LENGTH; auto before_zeros = msg.subspan(full_header_len, offset - full_header_len); @@ -685,7 +688,6 @@ bool ssl_ech_accept_confirmation(const SSL_HANDSHAKE *hs, Span out, return false; } - assert(out.size() == ECH_CONFIRMATION_SIGNAL_LEN); return hkdf_expand_label( out, transcript.Digest(), Span(secret, secret_len), is_hrr ? "hrr ech accept confirmation" : "ech accept confirmation", diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/tls13_server.cc b/naiveproxy/src/third_party/boringssl/src/ssl/tls13_server.cc index 185d26afb0..eade4bd66a 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/tls13_server.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/tls13_server.cc @@ -375,7 +375,7 @@ static enum ssl_hs_wait_t do_select_parameters(SSL_HANDSHAKE *hs) { // Negotiate the cipher suite. hs->new_cipher = choose_tls13_cipher(ssl, &client_hello); - if (hs->new_cipher == NULL) { + if (hs->new_cipher == nullptr) { OPENSSL_PUT_ERROR(SSL, SSL_R_NO_SHARED_CIPHER); ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); return ssl_hs_error; @@ -652,7 +652,7 @@ static enum ssl_hs_wait_t do_select_session(SSL_HANDSHAKE *hs) { } } - if (ssl->ctx->dos_protection_cb != NULL && + if (ssl->ctx->dos_protection_cb != nullptr && ssl->ctx->dos_protection_cb(&client_hello) == 0) { // Connection rejected for DOS reasons. OPENSSL_PUT_ERROR(SSL, SSL_R_CONNECTION_REJECTED); @@ -757,7 +757,7 @@ static enum ssl_hs_wait_t do_send_hello_retry_request(SSL_HANDSHAKE *hs) { // Now that the message is encoded, fill in the whole value. size_t offset = hrr.size() - ECH_CONFIRMATION_SIGNAL_LEN; if (!ssl_ech_accept_confirmation( - hs, Span(hrr).last(ECH_CONFIRMATION_SIGNAL_LEN), + hs, Span(hrr).last(), ssl->s3->client_random, hs->transcript, /*is_hrr=*/true, hrr, offset)) { return ssl_hs_error; @@ -947,7 +947,7 @@ static enum ssl_hs_wait_t do_send_server_hello(SSL_HANDSHAKE *hs) { if (hs->ech_is_inner) { // Fill in the ECH confirmation signal. const size_t offset = ssl_ech_confirmation_signal_hello_offset(ssl); - Span random_suffix = random.last(ECH_CONFIRMATION_SIGNAL_LEN); + auto random_suffix = random.last(); if (!ssl_ech_accept_confirmation(hs, random_suffix, ssl->s3->client_random, hs->transcript, /*is_hrr=*/false, server_hello, offset)) { @@ -955,8 +955,8 @@ static enum ssl_hs_wait_t do_send_server_hello(SSL_HANDSHAKE *hs) { } // Update |server_hello|. - Span server_hello_out = - Span(server_hello).subspan(offset, ECH_CONFIRMATION_SIGNAL_LEN); + auto server_hello_out = + Span(server_hello).subspan(offset).first(); OPENSSL_memcpy(server_hello_out.data(), random_suffix.data(), ECH_CONFIRMATION_SIGNAL_LEN); } diff --git a/naiveproxy/src/third_party/boringssl/src/ssl/tls_record.cc b/naiveproxy/src/third_party/boringssl/src/ssl/tls_record.cc index fca3e859a6..ba0c4c1fb9 100644 --- a/naiveproxy/src/third_party/boringssl/src/ssl/tls_record.cc +++ b/naiveproxy/src/third_party/boringssl/src/ssl/tls_record.cc @@ -143,7 +143,7 @@ ssl_open_record_t tls_open_record(SSL *ssl, uint8_t *out_type, return ssl_open_record_partial; } - Span header = in.subspan(0, SSL3_RT_HEADER_LENGTH); + auto header = in.first(SSL3_RT_HEADER_LENGTH); ssl_do_msg_callback(ssl, 0 /* read */, SSL3_RT_HEADER, header); *out_consumed = in.size() - CBS_len(&cbs); @@ -264,7 +264,7 @@ static bool do_seal_record(SSL *ssl, uint8_t *out_prefix, uint8_t *out, uint8_t *out_suffix, uint8_t type, const uint8_t *in, const size_t in_len) { SSLAEADContext *aead = ssl->s3->aead_write_ctx.get(); - uint8_t *extra_in = NULL; + uint8_t *extra_in = nullptr; size_t extra_in_len = 0; if (!aead->is_null_cipher() && ssl_protocol_version(ssl) >= TLS1_3_VERSION) { // TLS 1.3 hides the actual record type inside the encrypted data. diff --git a/naiveproxy/src/third_party/boringssl/src/third_party/fiat/README.md b/naiveproxy/src/third_party/boringssl/src/third_party/fiat/README.md index 3f981553b1..d83952d882 100644 --- a/naiveproxy/src/third_party/boringssl/src/third_party/fiat/README.md +++ b/naiveproxy/src/third_party/boringssl/src/third_party/fiat/README.md @@ -25,13 +25,13 @@ conventions are validated using unit tests. # Bedrock Routines for which assembly-level optimization is not necessary are written in -[Bedrock2](https://github.com/mit-plv/bedrock2) and tranlated to C. The file +[Bedrock2](https://github.com/mit-plv/bedrock2) and translated to C. The file `bedrock_unverified_platform.c.inc` provides the platform functionality code thus translated expects. The P256 point doubling and addition are implemented in this manner in p256_coord.br.c.inc. This code originates from Fiat Cryptogaphy commit -b8890d810b812180fb224356e0f0b932afade414 file src/Bedrock/P256.v +6e22d333861d51c7f6baa0826648a2215d0c333f file src/Bedrock/P256.v Field arithmetic operations are dispatched in p256_field.c.inc to platform-specific code including assembly, fiat-crypto-generated C, and Bedrock-generated C. diff --git a/naiveproxy/src/third_party/boringssl/src/third_party/fiat/curve25519_64_adx.h b/naiveproxy/src/third_party/boringssl/src/third_party/fiat/curve25519_64_adx.h index b9026129c3..4436ef22c8 100644 --- a/naiveproxy/src/third_party/boringssl/src/third_party/fiat/curve25519_64_adx.h +++ b/naiveproxy/src/third_party/boringssl/src/third_party/fiat/curve25519_64_adx.h @@ -402,10 +402,10 @@ static void fe4_cswap(uint64_t out1[4], uint64_t out2[4], fiat_uint1 arg1, const out2[3] = x8; } -// The following functions are adaped from crypto/curve25519/curve25519.c +// The following functions are adapted from crypto/curve25519/curve25519.c // It would be desirable to share the code, but with the current field // implementations both 4-limb and 5-limb versions of the curve-level code need -// to be included in builds targetting an unknown variant of x86_64. +// to be included in builds targeting an unknown variant of x86_64. __attribute__((target("adx,bmi2"))) static void fe4_invert(fe4 out, const fe4 z) { diff --git a/naiveproxy/src/third_party/boringssl/src/third_party/fiat/p256_field_32.br.c.inc b/naiveproxy/src/third_party/boringssl/src/third_party/fiat/p256_field_32.br.c.inc index 4fe7c1a380..e681dcb551 100644 --- a/naiveproxy/src/third_party/boringssl/src/third_party/fiat/p256_field_32.br.c.inc +++ b/naiveproxy/src/third_party/boringssl/src/third_party/fiat/p256_field_32.br.c.inc @@ -48,7 +48,6 @@ static inline void u256_shr(br_word_t p_out, br_word_t p_x, br_word_t n) { _br_store(((((p_out+4)+4)+4)+4)+4, y5); _br_store((((((p_out+4)+4)+4)+4)+4)+4, y6); _br_store(((((((p_out+4)+4)+4)+4)+4)+4)+4, y7); - return; } static inline void u256_set_p256_minushalf_conditional(br_word_t p_out, br_word_t mask) { @@ -69,5 +68,4 @@ static inline void u256_set_p256_minushalf_conditional(br_word_t p_out, br_word_ _br_store(((((p_out+4)+4)+4)+4)+4, mask&mh5); _br_store((((((p_out+4)+4)+4)+4)+4)+4, mask&mh6); _br_store(((((((p_out+4)+4)+4)+4)+4)+4)+4, mask&mh7); - return; } diff --git a/naiveproxy/src/third_party/boringssl/src/third_party/fiat/p256_field_64.br.c.inc b/naiveproxy/src/third_party/boringssl/src/third_party/fiat/p256_field_64.br.c.inc index 756d237349..b23246b1cf 100644 --- a/naiveproxy/src/third_party/boringssl/src/third_party/fiat/p256_field_64.br.c.inc +++ b/naiveproxy/src/third_party/boringssl/src/third_party/fiat/p256_field_64.br.c.inc @@ -30,7 +30,6 @@ static inline void p256_coord_add(br_word_t p_out, br_word_t p_x, br_word_t p_y) _br_store(p_out+8, r1); _br_store((p_out+8)+8, r2); _br_store(((p_out+8)+8)+8, r3); - return; } static inline void p256_coord_sub(br_word_t out, br_word_t x, br_word_t y) { @@ -48,7 +47,6 @@ static inline void p256_coord_sub(br_word_t out, br_word_t x, br_word_t y) { _br_store(out+8, r1); _br_store((out+8)+8, r2); _br_store(((out+8)+8)+8, r3); - return; } static inline br_word_t p256_coord_nonzero(br_word_t p_x) { @@ -71,7 +69,6 @@ static inline void u256_shr(br_word_t p_out, br_word_t p_x, br_word_t n) { _br_store(p_out+8, y1); _br_store((p_out+8)+8, y2); _br_store(((p_out+8)+8)+8, y3); - return; } static inline void u256_set_p256_minushalf_conditional(br_word_t p_out, br_word_t mask) { @@ -84,5 +81,4 @@ static inline void u256_set_p256_minushalf_conditional(br_word_t p_out, br_word_ _br_store(p_out+8, mask&mh1); _br_store((p_out+8)+8, mask&mh2); _br_store(((p_out+8)+8)+8, mask&mh3); - return; } diff --git a/naiveproxy/src/third_party/boringssl/src/third_party/fiat/p256_point.br.c.inc b/naiveproxy/src/third_party/boringssl/src/third_party/fiat/p256_point.br.c.inc index 84c873a4eb..117547bdfe 100644 --- a/naiveproxy/src/third_party/boringssl/src/third_party/fiat/p256_point.br.c.inc +++ b/naiveproxy/src/third_party/boringssl/src/third_party/fiat/p256_point.br.c.inc @@ -14,7 +14,6 @@ static inline void p256_coord_halve(br_word_t y, br_word_t x) { u256_set_p256_minushalf_conditional(mmh, m); u256_shr(y, x, (br_word_t)1); p256_coord_sub(y, y, mmh); - return; } static inline br_word_t p256_point_iszero(br_word_t p_P) { @@ -49,7 +48,6 @@ static inline void p256_point_double(br_word_t out, br_word_t in1) { p256_coord_mul(D, D, A); p256_coord_halve(out+32, out+32); p256_coord_sub(out+32, D, out+32); - return; } static inline br_word_t p256_point_add_nz_nz_neq(br_word_t p_out, br_word_t p_P, br_word_t p_Q) { @@ -111,5 +109,4 @@ static inline void p256_point_add_vartime_if_doubling(br_word_t p_out, br_word_t p256_point_double(p_sel, p_P); } br_memcpy(p_out, p_sel, (br_word_t)96); - return; } diff --git a/naiveproxy/src/third_party/boringssl/src/tool/digest.cc b/naiveproxy/src/third_party/boringssl/src/tool/digest.cc index 008e8f50ba..c13d61ad99 100644 --- a/naiveproxy/src/third_party/boringssl/src/tool/digest.cc +++ b/naiveproxy/src/third_party/boringssl/src/tool/digest.cc @@ -326,7 +326,7 @@ static bool Check(const CheckModeArguments &args, const EVP_MD *md, return ok; } -// DigestSum acts like the coreutils *sum utilites, with the given hash +// DigestSum acts like the coreutils *sum utilities, with the given hash // function. static bool DigestSum(const EVP_MD *md, const std::vector &args) { @@ -359,7 +359,7 @@ static bool DigestSum(const EVP_MD *md, switch (arg[i]) { case 'b': case 't': - // Binary/text mode – irrelevent, even on Windows. + // Binary/text mode – irrelevant, even on Windows. break; case 'c': check_mode = true; @@ -374,7 +374,7 @@ static bool DigestSum(const EVP_MD *md, } } } else if (arg == "--binary" || arg == "--text") { - // Binary/text mode – irrelevent, even on Windows. + // Binary/text mode – irrelevant, even on Windows. } else if (arg == "--check") { check_mode = true; } else if (arg == "--quiet") { diff --git a/naiveproxy/src/third_party/boringssl/src/tool/speed.cc b/naiveproxy/src/third_party/boringssl/src/tool/speed.cc index b9bca8e54f..b6369383c7 100644 --- a/naiveproxy/src/third_party/boringssl/src/tool/speed.cc +++ b/naiveproxy/src/third_party/boringssl/src/tool/speed.cc @@ -38,8 +38,6 @@ #include #include #include -#define OPENSSL_UNSTABLE_EXPERIMENTAL_KYBER -#include #include #include #include @@ -50,6 +48,7 @@ #include #include #include +#include #if defined(OPENSSL_WINDOWS) #include @@ -312,11 +311,11 @@ static bool SpeedRSA(const std::string &selected) { {"RSA 4096", kDERRSAPrivate4096, kDERRSAPrivate4096Len}, }; - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kRSAKeys); i++) { - const std::string name = kRSAKeys[i].name; + for (const auto &key_info : kRSAKeys) { + const std::string name = key_info.name; bssl::UniquePtr key( - RSA_private_key_from_bytes(kRSAKeys[i].key, kRSAKeys[i].key_len)); + RSA_private_key_from_bytes(key_info.key, key_info.key_len)); if (key == nullptr) { fprintf(stderr, "Failed to parse %s key.\n", name.c_str()); ERR_print_errors_fp(stderr); @@ -387,7 +386,7 @@ static bool SpeedRSA(const std::string &selected) { if (!TimeFunctionParallel(&results, [&]() -> bool { return bssl::UniquePtr(RSA_private_key_from_bytes( - kRSAKeys[i].key, kRSAKeys[i].key_len)) != nullptr; + key_info.key, key_info.key_len)) != nullptr; })) { fprintf(stderr, "Failed to parse %s key.\n", name.c_str()); ERR_print_errors_fp(stderr); @@ -1079,55 +1078,6 @@ static bool SpeedHRSS(const std::string &selected) { return true; } -static bool SpeedKyber(const std::string &selected) { - if (!selected.empty() && selected != "Kyber") { - return true; - } - - TimeResults results; - - uint8_t ciphertext[KYBER_CIPHERTEXT_BYTES]; - // This ciphertext is nonsense, but Kyber decap is constant-time so, for the - // purposes of timing, it's fine. - memset(ciphertext, 42, sizeof(ciphertext)); - if (!TimeFunctionParallel(&results, [&]() -> bool { - KYBER_private_key priv; - uint8_t encoded_public_key[KYBER_PUBLIC_KEY_BYTES]; - KYBER_generate_key(encoded_public_key, &priv); - uint8_t shared_secret[KYBER_SHARED_SECRET_BYTES]; - KYBER_decap(shared_secret, ciphertext, &priv); - return true; - })) { - fprintf(stderr, "Failed to time KYBER_generate_key + KYBER_decap.\n"); - return false; - } - - results.Print("Kyber generate + decap"); - - KYBER_private_key priv; - uint8_t encoded_public_key[KYBER_PUBLIC_KEY_BYTES]; - KYBER_generate_key(encoded_public_key, &priv); - KYBER_public_key pub; - if (!TimeFunctionParallel(&results, [&]() -> bool { - CBS encoded_public_key_cbs; - CBS_init(&encoded_public_key_cbs, encoded_public_key, - sizeof(encoded_public_key)); - if (!KYBER_parse_public_key(&pub, &encoded_public_key_cbs)) { - return false; - } - uint8_t shared_secret[KYBER_SHARED_SECRET_BYTES]; - KYBER_encap(ciphertext, shared_secret, &pub); - return true; - })) { - fprintf(stderr, "Failed to time KYBER_encap.\n"); - return false; - } - - results.Print("Kyber parse + encap"); - - return true; -} - static bool SpeedMLDSA(const std::string &selected) { if (!selected.empty() && selected != "ML-DSA") { return true; @@ -1531,9 +1481,9 @@ static bool SpeedTrustToken(std::string name, const TRUST_TOKEN_METHOD *method, uint8_t public_key[32], private_key[64]; ED25519_keypair(public_key, private_key); bssl::UniquePtr priv( - EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, nullptr, private_key, 32)); + EVP_PKEY_from_raw_private_key(EVP_pkey_ed25519(), private_key, 32)); bssl::UniquePtr pub( - EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, nullptr, public_key, 32)); + EVP_PKEY_from_raw_public_key(EVP_pkey_ed25519(), public_key, 32)); if (!priv || !pub) { fprintf(stderr, "failed to generate trust token SRR key.\n"); return false; @@ -1696,6 +1646,53 @@ static bool SpeedTrustToken(std::string name, const TRUST_TOKEN_METHOD *method, return true; } +static bool SpeedX509(const std::string &selected) { + if (!selected.empty() && selected.find("x509") == std::string::npos) { + return true; + } + + static const uint8_t kCert[] = { + 0x30, 0x82, 0x01, 0x3b, 0x30, 0x81, 0xe2, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x01, 0x01, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, + 0x04, 0x03, 0x02, 0x30, 0x1c, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x11, 0x42, 0x61, 0x73, 0x69, 0x63, 0x20, 0x43, 0x6f, + 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x30, 0x20, 0x17, + 0x0d, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x5a, 0x18, 0x0f, 0x32, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x1c, 0x31, 0x1a, 0x30, + 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x11, 0x42, 0x61, 0x73, 0x69, + 0x63, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, + 0x73, 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, + 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, + 0x03, 0x42, 0x00, 0x04, 0x91, 0x2a, 0xd8, 0xbc, 0x55, 0x6d, 0x91, 0x92, + 0x66, 0xbe, 0x2a, 0xdf, 0x63, 0x42, 0x43, 0x0d, 0x8a, 0xd9, 0x42, 0xb3, + 0x49, 0x79, 0xc3, 0xcb, 0xb7, 0x49, 0x2c, 0x26, 0xec, 0x76, 0x51, 0x12, + 0xf9, 0x9c, 0x04, 0x22, 0x41, 0x8d, 0x52, 0x11, 0x11, 0xa7, 0x11, 0xa8, + 0x8d, 0x2e, 0x9a, 0x1c, 0xd1, 0xd9, 0x5e, 0x4d, 0x2f, 0x30, 0x41, 0x3f, + 0xdc, 0x8f, 0x0f, 0xf0, 0x3e, 0x0a, 0x1e, 0x57, 0xa3, 0x13, 0x30, 0x11, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, + 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x48, 0x00, 0x30, 0x45, 0x02, 0x20, + 0x4c, 0xdb, 0x36, 0x69, 0x03, 0xc3, 0x66, 0xcf, 0x8f, 0x6a, 0x5e, 0x4b, + 0x03, 0x57, 0xc0, 0x2b, 0x20, 0xb8, 0x00, 0xa4, 0xcd, 0x37, 0xe2, 0x44, + 0xfe, 0xf1, 0x18, 0x9d, 0xd2, 0xa1, 0x17, 0x16, 0x02, 0x21, 0x00, 0xdf, + 0x6f, 0xb2, 0x23, 0x0e, 0x85, 0xf1, 0xff, 0x71, 0x81, 0x9e, 0xca, 0xe1, + 0xb7, 0x5e, 0x0d, 0x52, 0x6c, 0xd4, 0x05, 0xda, 0xa4, 0x41, 0xa7, 0xc9, + 0xbc, 0x2f, 0x9e, 0x1c, 0x87, 0x6d, 0x40}; + TimeResults results; + if (!TimeFunctionParallel(&results, [&]() -> bool { + const uint8_t *inp = kCert; + bssl::UniquePtr x509(d2i_X509(nullptr, &inp, sizeof(kCert))); + return x509 != nullptr; + })) { + fprintf(stderr, "d2i_X509 failed.\n"); + ERR_print_errors_fp(stderr); + return false; + } + results.Print("Parse X.509 certificate"); + return true; +} + #if defined(BORINGSSL_FIPS) static bool SpeedSelfTest(const std::string &selected) { if (!selected.empty() && selected.find("self-test") == std::string::npos) { @@ -1857,7 +1854,6 @@ bool Speed(const std::vector &args) { !SpeedScrypt(selected) || // !SpeedRSAKeyGen(selected) || // !SpeedHRSS(selected) || // - !SpeedKyber(selected) || // !SpeedMLDSA(selected) || // !SpeedMLKEM(selected) || // !SpeedMLKEM1024(selected) || // @@ -1875,8 +1871,9 @@ bool Speed(const std::vector &args) { TRUST_TOKEN_experiment_v2_pmb(), 1, selected) || !SpeedTrustToken("TrustToken-Exp2PMB-Batch10", TRUST_TOKEN_experiment_v2_pmb(), 10, selected) || - !SpeedBase64(selected) || // - !SpeedSipHash(selected)) { + !SpeedBase64(selected) || // + !SpeedSipHash(selected) || // + !SpeedX509(selected)) { return false; } #if defined(BORINGSSL_FIPS) diff --git a/naiveproxy/src/third_party/compiler-rt/src/lib/builtins/assembly.h b/naiveproxy/src/third_party/compiler-rt/src/lib/builtins/assembly.h index 89372f18c8..368cbaf108 100644 --- a/naiveproxy/src/third_party/compiler-rt/src/lib/builtins/assembly.h +++ b/naiveproxy/src/third_party/compiler-rt/src/lib/builtins/assembly.h @@ -14,7 +14,7 @@ #ifndef COMPILERRT_ASSEMBLY_H #define COMPILERRT_ASSEMBLY_H -#if defined(__linux__) && defined(__CET__) +#ifdef __CET__ #if __has_include() #include #endif @@ -79,11 +79,12 @@ #define FUNC_ALIGN #endif -// BTI and PAC gnu property note +// BTI, PAC, and GCS gnu property note #define NT_GNU_PROPERTY_TYPE_0 5 #define GNU_PROPERTY_AARCH64_FEATURE_1_AND 0xc0000000 #define GNU_PROPERTY_AARCH64_FEATURE_1_BTI 1 #define GNU_PROPERTY_AARCH64_FEATURE_1_PAC 2 +#define GNU_PROPERTY_AARCH64_FEATURE_1_GCS 4 #if defined(__ARM_FEATURE_BTI_DEFAULT) #define BTI_FLAG GNU_PROPERTY_AARCH64_FEATURE_1_BTI @@ -97,6 +98,12 @@ #define PAC_FLAG 0 #endif +#if defined(__ARM_FEATURE_GCS_DEFAULT) +#define GCS_FLAG GNU_PROPERTY_AARCH64_FEATURE_1_GCS +#else +#define GCS_FLAG 0 +#endif + #define GNU_PROPERTY(type, value) \ .pushsection .note.gnu.property, "a" SEPARATOR \ .p2align 3 SEPARATOR \ @@ -118,11 +125,12 @@ #define BTI_J #endif -#if (BTI_FLAG | PAC_FLAG) != 0 -#define GNU_PROPERTY_BTI_PAC \ - GNU_PROPERTY(GNU_PROPERTY_AARCH64_FEATURE_1_AND, BTI_FLAG | PAC_FLAG) +#if (BTI_FLAG | PAC_FLAG | GCS_FLAG) != 0 +#define GNU_PROPERTY_BTI_PAC_GCS \ + GNU_PROPERTY(GNU_PROPERTY_AARCH64_FEATURE_1_AND, \ + BTI_FLAG | PAC_FLAG | GCS_FLAG) #else -#define GNU_PROPERTY_BTI_PAC +#define GNU_PROPERTY_BTI_PAC_GCS #endif #if defined(__clang__) || defined(__GCC_HAVE_DWARF2_CFI_ASM) @@ -296,7 +304,7 @@ .globl FUNC_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \ SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ DECLARE_SYMBOL_VISIBILITY(name) SEPARATOR \ - .set FUNC_SYMBOL(SYMBOL_NAME(name)), FUNC_SYMBOL(target) SEPARATOR + .set FUNC_SYMBOL(SYMBOL_NAME(name)), FUNC_SYMBOL(SYMBOL_NAME(target)) SEPARATOR #if defined(__ARM_EABI__) #define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name) \ @@ -329,4 +337,9 @@ #endif #endif +#if defined(__ASSEMBLER__) && (defined(__i386__) || defined(__amd64__)) && \ + !defined(__arm64ec__) +.att_syntax +#endif + #endif // COMPILERRT_ASSEMBLY_H diff --git a/naiveproxy/src/third_party/cpu_features/README.chromium b/naiveproxy/src/third_party/cpu_features/README.chromium index 74f53bab37..b59d92188a 100644 --- a/naiveproxy/src/third_party/cpu_features/README.chromium +++ b/naiveproxy/src/third_party/cpu_features/README.chromium @@ -3,6 +3,7 @@ Short Name: cpu_features URL: https://github.com/google/cpu_features Version: v0.8.0 Date: 2023-05-17 +Update Mechanism: Manual License: BSD-2-Clause, Apache-2.0 License File: src/LICENSE Security Critical: Yes diff --git a/naiveproxy/src/third_party/jni_zero/README.chromium b/naiveproxy/src/third_party/jni_zero/README.chromium index e84db51edf..dbf2e39c97 100644 --- a/naiveproxy/src/third_party/jni_zero/README.chromium +++ b/naiveproxy/src/third_party/jni_zero/README.chromium @@ -2,6 +2,7 @@ Name: JNI Zero Short Name: jni_zero URL: This is the canonical repository Version: N/A +Update Mechanism: Static (crbug.com/422059065) License: BSD-3-Clause License File: LICENSE Security Critical: yes diff --git a/naiveproxy/src/third_party/jni_zero/codegen/header_common.py b/naiveproxy/src/third_party/jni_zero/codegen/header_common.py index 1276b2d4b5..338cd74807 100644 --- a/naiveproxy/src/third_party/jni_zero/codegen/header_common.py +++ b/naiveproxy/src/third_party/jni_zero/codegen/header_common.py @@ -49,8 +49,8 @@ def class_accessor_expression(java_class): def header_preamble(script_name, java_class, - system_includes, - user_includes, + system_includes=None, + user_includes=None, header_guard=None): if header_guard is None: header_guard = f'{java_class.to_cpp()}_JNI' @@ -65,9 +65,12 @@ def header_preamble(script_name, #define {header_guard} """) - sb.extend(f'#include <{x}>\n' for x in system_includes) - sb.append('\n') - sb.extend(f'#include "{x}"\n' for x in user_includes) + if system_includes: + sb.extend(f'#include <{x}>\n' for x in system_includes) + sb.append('\n') + if user_includes: + sb.extend(f'#include "{x}"\n' for x in user_includes) + sb.append('\n') preamble = ''.join(sb) epilogue = f""" diff --git a/naiveproxy/src/third_party/jni_zero/common_apis.h b/naiveproxy/src/third_party/jni_zero/common_apis.h index a9a28d7661..5bbc5700f9 100644 --- a/naiveproxy/src/third_party/jni_zero/common_apis.h +++ b/naiveproxy/src/third_party/jni_zero/common_apis.h @@ -6,6 +6,7 @@ #define JNI_ZERO_COMMON_APIS_H_ #include +#include #include "third_party/jni_zero/java_refs.h" #include "third_party/jni_zero/jni_export.h" diff --git a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/AccessedByNative.java b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/AccessedByNative.java index ba16be4aa9..62db5867cc 100644 --- a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/AccessedByNative.java +++ b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/AccessedByNative.java @@ -14,5 +14,5 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.CLASS) @UsedReflectively public @interface AccessedByNative { - public String value() default ""; + String value() default ""; } diff --git a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/CalledByNative.java b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/CalledByNative.java index 0adb3f959a..8c7cb89375 100644 --- a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/CalledByNative.java +++ b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/CalledByNative.java @@ -25,5 +25,5 @@ public @interface CalledByNative { /* * If present, tells which inner class the method belongs to. */ - public String value() default ""; + String value() default ""; } diff --git a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/CalledByNativeForTesting.java b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/CalledByNativeForTesting.java index c662cfc7ea..f5dabb3d25 100644 --- a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/CalledByNativeForTesting.java +++ b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/CalledByNativeForTesting.java @@ -23,5 +23,5 @@ public @interface CalledByNativeForTesting { /* * If present, tells which inner class the method belongs to. */ - public String value() default ""; + String value() default ""; } diff --git a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/CalledByNativeUnchecked.java b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/CalledByNativeUnchecked.java index 60b2244500..9aba46663c 100644 --- a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/CalledByNativeUnchecked.java +++ b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/CalledByNativeUnchecked.java @@ -26,5 +26,5 @@ public @interface CalledByNativeUnchecked { /* * If present, tells which inner class the method belongs to. */ - public String value() default ""; + String value() default ""; } diff --git a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/JNINamespace.java b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/JNINamespace.java index 4adf57df95..8337afa64f 100644 --- a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/JNINamespace.java +++ b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/JNINamespace.java @@ -16,5 +16,5 @@ import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface JNINamespace { - public String value(); + String value(); } diff --git a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/JniType.java b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/JniType.java index 06f1917b51..5059456645 100644 --- a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/JniType.java +++ b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/JniType.java @@ -26,5 +26,5 @@ public @interface JniType { * ScopedJavaLocalRef jni_zero::ToJniType(JniEnv*, const cpp_type&); *

*/ - public String value(); + String value(); } diff --git a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/NativeClassQualifiedName.java b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/NativeClassQualifiedName.java index c4dab8baca..3d59a3806e 100644 --- a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/NativeClassQualifiedName.java +++ b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/NativeClassQualifiedName.java @@ -21,5 +21,5 @@ public @interface NativeClassQualifiedName { * The first parameter of the annotated method must be an int nativePtr pointing to * an instance of this class. */ - public String value(); + String value(); } diff --git a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/NativeMethods.java b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/NativeMethods.java index d843d71278..c09b22a8eb 100644 --- a/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/NativeMethods.java +++ b/naiveproxy/src/third_party/jni_zero/java/src/org/jni_zero/NativeMethods.java @@ -16,5 +16,5 @@ public @interface NativeMethods { * should only be used for feature modules where we need a different GEN_JNI. For example, if * you did @NativeMethods("dfmname"), this would call into dfmname_GEN_JNI.java. */ - public String value() default ""; + String value() default ""; } diff --git a/naiveproxy/src/third_party/jni_zero/java_refs.h b/naiveproxy/src/third_party/jni_zero/java_refs.h index b33463959b..45be49d2e8 100644 --- a/naiveproxy/src/third_party/jni_zero/java_refs.h +++ b/naiveproxy/src/third_party/jni_zero/java_refs.h @@ -17,9 +17,7 @@ #include "third_party/jni_zero/jni_export.h" #include "third_party/jni_zero/logging.h" -#if !defined(JNI_ZERO_ENABLE_COMPAT_API) && defined(WEBRTC_ANDROID) -#define JNI_ZERO_ENABLE_COMPAT_API 1 -#else +#if !defined(JNI_ZERO_ENABLE_COMPAT_API) #define JNI_ZERO_ENABLE_COMPAT_API 0 #endif diff --git a/naiveproxy/src/third_party/jni_zero/jni_generator.py b/naiveproxy/src/third_party/jni_zero/jni_generator.py index f0e81e3368..63337cafc9 100644 --- a/naiveproxy/src/third_party/jni_zero/jni_generator.py +++ b/naiveproxy/src/third_party/jni_zero/jni_generator.py @@ -317,13 +317,21 @@ def _CollectReferencedClasses(jni_obj): return sorted(ret) -def _generate_header(jni_mode, jni_obj, extra_includes, gen_jni_class, *, - enable_definition_macros): +def _generate_header(jni_mode, + jni_obj, + gen_jni_class, + *, + enable_definition_macros, + include_path_prefix, + extra_includes=None): + user_includes = [f'{include_path_prefix}jni_zero_internal.h'] + if extra_includes: + user_includes += extra_includes preamble, epilogue = header_common.header_preamble( GetScriptName(), jni_obj.java_class, system_includes=['jni.h'], - user_includes=['third_party/jni_zero/jni_export.h'] + extra_includes) + user_includes=user_includes) sb = common.StringBuilder() sb(preamble) @@ -509,17 +517,20 @@ def _WriteHeaders(jni_mode, jni_objs, output_names, output_dir, - extra_includes, + *, + include_path_prefix, gen_jni_class=None, - enable_definition_macros=False): + enable_definition_macros=False, + extra_includes=None): for jni_obj, header_name in zip(jni_objs, output_names): output_file = os.path.join(output_dir, header_name) content = _generate_header( jni_mode, jni_obj, - extra_includes, gen_jni_class, - enable_definition_macros=enable_definition_macros) + enable_definition_macros=enable_definition_macros, + include_path_prefix=include_path_prefix, + extra_includes=extra_includes) with common.atomic_output(output_file, 'w') as f: f.write(content) @@ -535,7 +546,10 @@ def GenerateFromSource(parser, args, jni_mode): parsed_files = [ parse.parse_java_file(f, package_prefix=args.package_prefix, - package_prefix_filter=args.package_prefix_filter) + package_prefix_filter=args.package_prefix_filter, + enable_legacy_natives=args.enable_legacy_natives, + allow_private_called_by_natives=args. + allow_private_called_by_natives) for f in args.input_files ] jni_objs = [ @@ -558,9 +572,10 @@ def GenerateFromSource(parser, args, jni_mode): jni_objs, args.output_names, args.output_dir, - args.extra_includes, - gen_jni_class, - enable_definition_macros=args.enable_definition_macros) + include_path_prefix=args.include_path_prefix, + gen_jni_class=gen_jni_class, + enable_definition_macros=args.enable_definition_macros, + extra_includes=args.extra_includes) jni_objs_with_proxy_natives = [x for x in jni_objs if x.proxy_natives] # Write .srcjar @@ -610,5 +625,9 @@ def GenerateFromJar(parser, args, jni_mode): sys.stderr.write(f'{e}\n') sys.exit(1) - _WriteHeaders(jni_mode, jni_objs, args.output_names, args.output_dir, - args.extra_includes) + _WriteHeaders(jni_mode, + jni_objs, + args.output_names, + args.output_dir, + include_path_prefix=args.include_path_prefix, + extra_includes=args.extra_includes) diff --git a/naiveproxy/src/third_party/jni_zero/jni_registration_generator.py b/naiveproxy/src/third_party/jni_zero/jni_registration_generator.py index e35495fcc4..3c61350f3a 100644 --- a/naiveproxy/src/third_party/jni_zero/jni_registration_generator.py +++ b/naiveproxy/src/third_party/jni_zero/jni_registration_generator.py @@ -30,13 +30,17 @@ import proxy _THIS_DIR = os.path.dirname(__file__) -def _ParseHelper(package_prefix, package_prefix_filter, path): +def _ParseHelper(package_prefix, package_prefix_filter, enable_legacy_natives, + path): return parse.parse_java_file(path, package_prefix=package_prefix, - package_prefix_filter=package_prefix_filter) + package_prefix_filter=package_prefix_filter, + enable_legacy_natives=enable_legacy_natives, + allow_private_called_by_natives=True) -def _LoadJniObjs(paths, namespace, package_prefix, package_prefix_filter): +def _LoadJniObjs(paths, namespace, package_prefix, package_prefix_filter, *, + enable_legacy_natives): ret = {} if all(p.endswith('.jni.pickle') for p in paths): for pickle_path in paths: @@ -50,7 +54,7 @@ def _LoadJniObjs(paths, namespace, package_prefix, package_prefix_filter): ] else: func = functools.partial(_ParseHelper, package_prefix, - package_prefix_filter) + package_prefix_filter, enable_legacy_natives) with multiprocessing.Pool() as pool: for pf in pool.imap_unordered(func, paths): ret[pf.filename] = [ @@ -121,9 +125,12 @@ def _Generate(args, native_sources_set = set(native_sources) java_sources_set = set(java_sources) - jni_objs_by_path = _LoadJniObjs(native_sources_set | java_sources_set, - args.namespace, args.package_prefix, - args.package_prefix_filter) + jni_objs_by_path = _LoadJniObjs( + native_sources_set | java_sources_set, + args.namespace, + args.package_prefix, + args.package_prefix_filter, + enable_legacy_natives=args.enable_legacy_natives) _FilterJniObjs(jni_objs_by_path, args.include_test_only, args.module_name) present_jni_objs = list( @@ -290,11 +297,15 @@ def _CreateHeader(jni_mode, jni_objs, boundary_proxy_natives, gen_jni_class, header_guard = os.path.splitext(args.header_path)[0].upper() + '_' header_guard = re.sub(r'[/.-]', '_', header_guard) + user_includes = [f'{args.include_path_prefix}jni_zero_internal.h'] + if args.extra_includes: + user_includes += args.extra_includes + preamble, epilogue = header_common.header_preamble( jni_generator.GetScriptName(), gen_jni_class, system_includes=['iterator'], # For std::size(). - user_includes=['third_party/jni_zero/jni_zero_internal.h'], + user_includes=user_includes, header_guard=header_guard) module_name = args.module_name or '' diff --git a/naiveproxy/src/third_party/jni_zero/jni_zero.gni b/naiveproxy/src/third_party/jni_zero/jni_zero.gni index 31c1392fad..71826b906d 100644 --- a/naiveproxy/src/third_party/jni_zero/jni_zero.gni +++ b/naiveproxy/src/third_party/jni_zero/jni_zero.gni @@ -23,7 +23,8 @@ declare_args() { declare_args() { # Use hashed symbol names to reduce JNI symbol overhead when not multiplexing. - use_hashed_jni_names = !enable_jni_multiplexing && !is_java_debug + use_hashed_jni_names = + (!enable_jni_multiplexing && !is_java_debug) || is_cronet_build } assert(!use_hashed_jni_names || !enable_jni_multiplexing, @@ -187,6 +188,9 @@ template("generate_jni_registration") { rebase_path(depfile, root_build_dir), "--java-sources-file", rebase_path(_java_sources_list, root_build_dir), + + # TODO(http://crbug.com/434278751): Remove support for legacy natives. + "--enable-legacy-natives", ] if (defined(_native_sources_list)) { @@ -315,11 +319,6 @@ template("generate_jni_impl") { _invoke_jni_zero(_jni_zero_action_target_name) { _subdir = rebase_path(target_gen_dir, root_gen_dir) _jni_output_dir = "$jni_headers_dir/$_subdir/$_final_target_name" - if (defined(invoker.jni_generator_include)) { - _jni_generator_include = invoker.jni_generator_include - } else { - _jni_generator_include = "//third_party/jni_zero/jni_zero_internal.h" - } # The sources aren't compiled so don't check their dependencies. check_includes = false @@ -345,8 +344,6 @@ template("generate_jni_impl") { args += [ "--output-dir", rebase_path(_jni_output_dir, root_build_dir), - "--extra-include", - rebase_path(_jni_generator_include, _jni_output_dir), ] if (_from_source) { @@ -357,6 +354,9 @@ template("generate_jni_impl") { rebase_path(_srcjar_output, root_build_dir), "--placeholder-srcjar-path", rebase_path(_placeholder_srcjar_output, root_build_dir), + + # TODO(http://crbug.com/434278751): Remove support for legacy natives. + "--enable-legacy-natives", ] outputs += [ _srcjar_output, @@ -379,6 +379,10 @@ template("generate_jni_impl") { invoker.enable_definition_macros) { args += [ "--enable-definition-macros" ] } + if (defined(invoker.allow_private_called_by_natives) && + invoker.allow_private_called_by_natives) { + args += [ "--allow-private-called-by-natives" ] + } # Cronet needs to rename jni_zero classes if (defined(is_cronet_build) && is_cronet_build) { @@ -391,7 +395,9 @@ template("generate_jni_impl") { if (defined(invoker.jar_file)) { _jar_file = invoker.jar_file } else { - _jar_file = android_sdk_jar + # Use public SDK to ensure LGPL-licensed code can be built + # without the internal SDK. + _jar_file = public_android_sdk_jar } inputs += [ _jar_file, @@ -506,6 +512,9 @@ template("generate_jni") { generate_jni_impl(target_name) { forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY) forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) + + # TODO(http://crbug.com/330720762): Change to False and migrate. + allow_private_called_by_natives = true metadata = { # keep as abspath as this is used by cronet team # to convert JNI registration targets from GN to BP (GN2BP). diff --git a/naiveproxy/src/third_party/jni_zero/jni_zero.py b/naiveproxy/src/third_party/jni_zero/jni_zero.py index 69821f7be9..a10b55d6c3 100755 --- a/naiveproxy/src/third_party/jni_zero/jni_zero.py +++ b/naiveproxy/src/third_party/jni_zero/jni_zero.py @@ -6,6 +6,7 @@ import argparse import os +import posixpath import shutil import sys @@ -90,6 +91,21 @@ def _add_codegen_args(parser, *, is_final=False, is_javap=False): group.add_argument( '--module-name', help='Only look at natives annotated with a specific module name.') + this_dir = posixpath.abspath(posixpath.dirname(__file__)) + root_dir = posixpath.dirname(posixpath.dirname(this_dir)) + default_path_prefix = os.path.relpath(this_dir, root_dir) + '/' + group.add_argument('--include-path-prefix', + help='Value for #include "${PREFIX}jni_zero.h" ' + f'(default={default_path_prefix})', + default=default_path_prefix) + group.add_argument('--extra-include', + action='append', + dest='extra_includes', + help='Header file to #include in the generated header.') + group.add_argument( + '--enable-legacy-natives', + action='store_true', + help='Whether to generate code from "native" java methods.') if is_final: group.add_argument( '--add-stubs-for-missing-native', @@ -113,10 +129,6 @@ def _add_codegen_args(parser, *, is_final=False, is_javap=False): action='store_true', help='Whether to maintain ForTesting JNI methods.') else: - group.add_argument('--extra-include', - action='append', - dest='extra_includes', - help='Header file to #include in the generated header.') group.add_argument( '--split-name', help='Split name that the Java classes should be loaded from.') @@ -129,6 +141,9 @@ def _add_codegen_args(parser, *, is_final=False, is_javap=False): '--enable-definition-macros', action='store_true', help='Generate JNI glue code in DEFINE_JNI_FOR_MyClass() macros') + group.add_argument('--allow-private-called-by-natives', + action='store_true', + help='Whether to allow private @CalledByNative symbols.') if is_javap: group.add_argument('--unchecked-exceptions', @@ -216,6 +231,7 @@ def main(): parser.parse_args(sys.argv[1:] + ['-h']) else: args = parser.parse_args() + bool_arg = lambda name: getattr(args, name, False) jni_mode = common.JniMode(is_hashing=bool_arg('use_proxy_hash'), is_muxing=bool_arg('enable_jni_multiplexing'), diff --git a/naiveproxy/src/third_party/jni_zero/parse.py b/naiveproxy/src/third_party/jni_zero/parse.py index 731a007fdf..2f3a18be9b 100644 --- a/naiveproxy/src/third_party/jni_zero/parse.py +++ b/naiveproxy/src/third_party/jni_zero/parse.py @@ -7,8 +7,8 @@ import re from typing import List from typing import Optional -import java_types import common +import java_types _MODIFIER_KEYWORDS = (r'(?:(?:' + '|'.join([ 'abstract', @@ -335,7 +335,8 @@ _CALLED_BY_NATIVE_REGEX = re.compile( r'[{;]') -def _parse_called_by_natives(type_resolver, contents): +def _parse_called_by_natives(type_resolver, contents, *, + allow_private_called_by_natives): ret = [] for match in _CALLED_BY_NATIVE_REGEX.finditer(contents): return_type_grp = match.group('return_type') @@ -358,11 +359,15 @@ def _parse_called_by_natives(type_resolver, contents): if inner_class_name: java_class = java_class.make_nested(inner_class_name) + modifiers = match.group('modifiers') + if not allow_private_called_by_natives and 'private' in modifiers: + raise ParseError(f'@CalledByNative methods must not be private. ' + f'Found:\n{match.group(0)}\n') ret.append( ParsedCalledByNative(java_class=java_class, name=name, signature=signature, - static='static' in match.group('modifiers'), + static='static' in modifiers, unchecked='Unchecked' in match.group('Unchecked'))) # Check for any @CalledByNative occurrences that were not matched. @@ -404,7 +409,8 @@ def _parse_jni_namespace(contents): return m[0] -def _do_parse(filename, *, package_prefix, package_prefix_filter): +def _do_parse(filename, *, package_prefix, package_prefix_filter, + enable_legacy_natives, allow_private_called_by_natives): assert not filename.endswith('.kt'), ( f'Found {filename}, but Kotlin is not supported by JNI generator.') with open(filename) as f: @@ -433,8 +439,14 @@ def _do_parse(filename, *, package_prefix, package_prefix_filter): parsed_proxy_natives = _parse_proxy_natives(type_resolver, contents) jni_namespace = _parse_jni_namespace(contents) - non_proxy_methods = _parse_non_proxy_natives(type_resolver, contents) - called_by_natives = _parse_called_by_natives(type_resolver, contents) + if enable_legacy_natives: + non_proxy_methods = _parse_non_proxy_natives(type_resolver, contents) + else: + non_proxy_methods = [] + called_by_natives = _parse_called_by_natives( + type_resolver, + contents, + allow_private_called_by_natives=allow_private_called_by_natives) ret = ParsedFile(filename=filename, jni_namespace=jni_namespace, @@ -457,11 +469,16 @@ def _do_parse(filename, *, package_prefix, package_prefix_filter): def parse_java_file(filename, *, package_prefix=None, - package_prefix_filter=None): + package_prefix_filter=None, + enable_legacy_natives=False, + allow_private_called_by_natives=False): try: - return _do_parse(filename, - package_prefix=package_prefix, - package_prefix_filter=package_prefix_filter) + return _do_parse( + filename, + package_prefix=package_prefix, + package_prefix_filter=package_prefix_filter, + enable_legacy_natives=enable_legacy_natives, + allow_private_called_by_natives=allow_private_called_by_natives) except Exception as e: note = f' (when parsing {filename})' if e.args and isinstance(e.args[0], str): diff --git a/naiveproxy/src/third_party/jni_zero/test/integration_tests.py b/naiveproxy/src/third_party/jni_zero/test/integration_tests.py index d53ac9000c..f9fb7ddd0d 100755 --- a/naiveproxy/src/third_party/jni_zero/test/integration_tests.py +++ b/naiveproxy/src/third_party/jni_zero/test/integration_tests.py @@ -27,8 +27,10 @@ import zipfile _SCRIPT_DIR = os.path.normpath(os.path.dirname(__file__)) _GOLDENS_DIR = os.path.join(_SCRIPT_DIR, 'golden') -_EXTRA_INCLUDES = 'third_party/jni_zero/jni_zero_helper.h' +_EXTRA_INCLUDES = 'extra_include.h' _JAVA_SRC_DIR = os.path.join(_SCRIPT_DIR, 'java', 'src', 'org', 'jni_zero') +_JAVA_BIN_DIR = os.path.join(_SCRIPT_DIR, os.pardir, os.pardir, 'jdk', + 'current', 'bin') # Set this environment variable in order to regenerate the golden text # files. @@ -65,7 +67,12 @@ class CliOptions: self.__dict__.update(kwargs) def to_args(self): - ret = [os.path.join(_SCRIPT_DIR, os.pardir, 'jni_zero.py'), self.action] + ret = [ + os.path.join(_SCRIPT_DIR, os.pardir, 'jni_zero.py'), + self.action, + '--include-path-prefix=overridden/', + '--enable-legacy-natives', + ] if self.enable_jni_multiplexing: ret.append('--enable-jni-multiplexing') if self.enable_definition_macros: @@ -179,6 +186,7 @@ class BaseTest(unittest.TestCase): options.output_dir = tdir cmd = options.to_args() + cmd += ['--allow-private-called-by-natives'] if srcjar: srcjar_path = os.path.join(tdir, 'srcjar.jar') @@ -191,9 +199,12 @@ class BaseTest(unittest.TestCase): if per_file_natives: cmd += ['--per-file-natives'] - logging.info('Running: %s', shlex.join(cmd)) - subprocess.check_call(cmd) + env = os.environ.copy() + if _JAVA_BIN_DIR not in env['PATH']: + env['PATH'] = os.pathsep.join([_JAVA_BIN_DIR, env['PATH']]) + logging.info('Running: %s', shlex.join(cmd)) + subprocess.check_call(cmd, env=env) for o in options.output_files: output_path = os.path.join(tdir, o) with open(output_path, 'r') as f: diff --git a/naiveproxy/src/third_party/jni_zero/test/java/src/org/jni_zero/SampleProxyEdgeCases.java b/naiveproxy/src/third_party/jni_zero/test/java/src/org/jni_zero/SampleProxyEdgeCases.java index 6e560cd843..ebc19a1a1e 100644 --- a/naiveproxy/src/third_party/jni_zero/test/java/src/org/jni_zero/SampleProxyEdgeCases.java +++ b/naiveproxy/src/third_party/jni_zero/test/java/src/org/jni_zero/SampleProxyEdgeCases.java @@ -31,13 +31,14 @@ class SampleProxyEdgeCases> { int addStructB(SampleForTests caller, SampleForTests.InnerStructB b); // Tests a java.lang class. - public boolean setStringBuilder(StringBuilder sb); + boolean setStringBuilder(StringBuilder sb); // Tests name collisions with java.lang classes. - public void setBool(Boolean b, Integer i); + void setBool(Boolean b, Integer i); // Test IntDef - public @SomeClass.EnumType int setStringBuilder(@MyThing int sb); + @SomeClass.EnumType + int setStringBuilder(@MyThing int sb); } // Non-proxy natives in same file. diff --git a/naiveproxy/src/third_party/jni_zero/test/java/src/org/stubs/MyClass.java b/naiveproxy/src/third_party/jni_zero/test/java/src/org/stubs/MyClass.java index 8ebb2cc9ab..c195fe6b54 100644 --- a/naiveproxy/src/third_party/jni_zero/test/java/src/org/stubs/MyClass.java +++ b/naiveproxy/src/third_party/jni_zero/test/java/src/org/stubs/MyClass.java @@ -5,7 +5,7 @@ package org.stubs; public class MyClass { - public static interface FirstNestedInterface {} + public interface FirstNestedInterface {} - public static interface SecondNestedInterface {} + public interface SecondNestedInterface {} } diff --git a/naiveproxy/src/third_party/libc++/README.chromium b/naiveproxy/src/third_party/libc++/README.chromium index 51a04ffb43..a55c643dc1 100644 --- a/naiveproxy/src/third_party/libc++/README.chromium +++ b/naiveproxy/src/third_party/libc++/README.chromium @@ -2,6 +2,7 @@ Name: libcxx Short Name: libc++ URL: http://libcxx.llvm.org/ Version: 1.0 +Update Mechanism: Manual License: NCSA, Apache-with-LLVM-Exception, MIT License File: src/LICENSE.TXT Security Critical: yes diff --git a/naiveproxy/src/third_party/libc++/src/CMakeLists.txt b/naiveproxy/src/third_party/libc++/src/CMakeLists.txt index 85514cc754..a119850cd8 100644 --- a/naiveproxy/src/third_party/libc++/src/CMakeLists.txt +++ b/naiveproxy/src/third_party/libc++/src/CMakeLists.txt @@ -113,7 +113,7 @@ option(LIBCXX_ENABLE_MONOTONIC_CLOCK # # TODO TZDB make the default always ON when most platforms ship with the IANA # database. -if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") +if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") set(ENABLE_TIME_ZONE_DATABASE_DEFAULT ON) else() set(ENABLE_TIME_ZONE_DATABASE_DEFAULT OFF) @@ -159,7 +159,7 @@ set(LIBCXX_TEST_PARAMS "" CACHE STRING "A list of parameters to run the Lit test suite with.") # TODO: Figure out how to build GoogleBenchmark on those platforms, and how to build when exceptions or RTTI is disabled -if (WIN32 OR MINGW OR ANDROID OR ${CMAKE_SYSTEM_NAME} MATCHES "AIX" +if (WIN32 OR MINGW OR ANDROID OR "${CMAKE_SYSTEM_NAME}" MATCHES "AIX" OR NOT LIBCXX_ENABLE_LOCALIZATION OR NOT LIBCXX_ENABLE_THREADS OR NOT LIBCXX_ENABLE_FILESYSTEM @@ -361,8 +361,7 @@ endif() if (NOT LIBCXX_ENABLE_RTTI AND LIBCXX_ENABLE_EXCEPTIONS) message(FATAL_ERROR "Libc++ cannot be built with exceptions enabled but RTTI" " disabled, since that configuration is broken. See" - " https://github.com/llvm/llvm-project/issues/66117" - " for details.") + " https://llvm.org/PR66117 for details.") endif() if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT) @@ -466,7 +465,7 @@ include(HandleLibcxxFlags) # 'config-ix' use them during feature checks. It also adds them to both # 'LIBCXX_COMPILE_FLAGS' and 'LIBCXX_LINK_FLAGS' -if (${CMAKE_SYSTEM_NAME} MATCHES "AIX") +if ("${CMAKE_SYSTEM_NAME}" MATCHES "AIX") add_flags_if_supported("-mdefault-visibility-export-mapping=explicit") set(CMAKE_AIX_EXPORT_ALL_SYMBOLS OFF) endif() diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv7Arm.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv7Arm.cmake index e60d43f33d..be8f9ff74a 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv7Arm.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv7Arm.cmake @@ -1,3 +1,5 @@ set(CMAKE_CXX_COMPILER_TARGET "armv7l-linux-gnueabihf" CACHE STRING "") set(CMAKE_CXX_FLAGS "-marm" CACHE STRING "") set(CMAKE_C_FLAGS "-marm" CACHE STRING "") +set(LIBCXX_TEST_PARAMS "enable_modules=clang" CACHE STRING "") +set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv7M-picolibc.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv7M-picolibc.cmake index 0f8189b457..9df71fba2c 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv7M-picolibc.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv7M-picolibc.cmake @@ -5,6 +5,7 @@ set(CMAKE_C_COMPILER_TARGET "armv7m-none-eabi" CACHE STRING "") set(CMAKE_C_FLAGS "-mfloat-abi=soft" CACHE STRING "") set(CMAKE_SYSTEM_NAME Generic CACHE STRING "") set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY CACHE STRING "") +set(LLVM_USE_LINKER "lld" CACHE STRING "") set(COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "") set(COMPILER_RT_BUILD_LIBFUZZER OFF CACHE BOOL "") set(COMPILER_RT_BUILD_PROFILE OFF CACHE BOOL "") diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv7Thumb-no-exceptions.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv7Thumb-no-exceptions.cmake index 70b619f8ec..5ddfa15d77 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv7Thumb-no-exceptions.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv7Thumb-no-exceptions.cmake @@ -3,3 +3,5 @@ set(CMAKE_CXX_FLAGS "-mthumb" CACHE STRING "") set(CMAKE_C_FLAGS "-mthumb" CACHE STRING "") set(LIBCXX_ENABLE_EXCEPTIONS OFF CACHE BOOL "") set(LIBCXXABI_ENABLE_EXCEPTIONS OFF CACHE BOOL "") +set(LIBCXX_TEST_PARAMS "enable_modules=clang" CACHE STRING "") +set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv8Arm.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv8Arm.cmake index a289471603..e0379b5870 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv8Arm.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv8Arm.cmake @@ -1,3 +1,5 @@ set(CMAKE_CXX_COMPILER_TARGET "armv8l-linux-gnueabihf" CACHE STRING "") set(CMAKE_CXX_FLAGS "-marm" CACHE STRING "") set(CMAKE_C_FLAGS "-marm" CACHE STRING "") +set(LIBCXX_TEST_PARAMS "enable_modules=clang" CACHE STRING "") +set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv8Thumb-no-exceptions.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv8Thumb-no-exceptions.cmake index b4c7dfca27..b0a5348496 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv8Thumb-no-exceptions.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Armv8Thumb-no-exceptions.cmake @@ -3,3 +3,5 @@ set(CMAKE_CXX_FLAGS "-mthumb" CACHE STRING "") set(CMAKE_C_FLAGS "-mthumb" CACHE STRING "") set(LIBCXX_ENABLE_EXCEPTIONS OFF CACHE BOOL "") set(LIBCXXABI_ENABLE_EXCEPTIONS OFF CACHE BOOL "") +set(LIBCXX_TEST_PARAMS "enable_modules=clang" CACHE STRING "") +set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-debug.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-debug.cmake index 1d401ba69a..483e8a71da 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-debug.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-debug.cmake @@ -1 +1,3 @@ set(LIBCXX_HARDENING_MODE "debug" CACHE STRING "") +set(LIBCXX_TEST_PARAMS "enable_modules=clang" CACHE STRING "") +set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-extensive.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-extensive.cmake index 72263dfd84..d4d506eba5 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-extensive.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-extensive.cmake @@ -1 +1,3 @@ set(LIBCXX_HARDENING_MODE "extensive" CACHE STRING "") +set(LIBCXX_TEST_PARAMS "enable_modules=clang" CACHE STRING "") +set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-fast-with-abi-breaks.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-fast-with-abi-breaks.cmake index 699d3f8866..2d617737e9 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-fast-with-abi-breaks.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-fast-with-abi-breaks.cmake @@ -5,5 +5,8 @@ set(_defines _LIBCPP_ABI_BOUNDED_ITERATORS_IN_VECTOR _LIBCPP_ABI_BOUNDED_UNIQUE_PTR _LIBCPP_ABI_BOUNDED_ITERATORS_IN_STD_ARRAY + _LIBCPP_ABI_BOUNDED_ITERATORS_IN_OPTIONAL ) set(LIBCXX_ABI_DEFINES "${_defines}" CACHE STRING "") +set(LIBCXX_TEST_PARAMS "enable_modules=clang" CACHE STRING "") +set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-fast.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-fast.cmake index cad5a1c483..acc9cbd69a 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-fast.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-hardening-mode-fast.cmake @@ -1 +1,3 @@ set(LIBCXX_HARDENING_MODE "fast" CACHE STRING "") +set(LIBCXX_TEST_PARAMS "enable_modules=clang" CACHE STRING "") +set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-merged.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-merged.cmake index 7ebb802623..461d10336e 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-merged.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-merged.cmake @@ -9,3 +9,6 @@ set(LIBCXXABI_ENABLE_STATIC_UNWINDER ON CACHE BOOL "") set(LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY ON CACHE BOOL "") set(LIBUNWIND_ENABLE_SHARED OFF CACHE BOOL "") + +set(LIBCXX_TEST_PARAMS "enable_modules=clang" CACHE STRING "") +set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-msan.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-msan.cmake index a8fbd285a9..a7e3128399 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-msan.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-msan.cmake @@ -1,4 +1,4 @@ set(LLVM_USE_SANITIZER "MemoryWithOrigins" CACHE STRING "") -set(LIBCXX_TEST_PARAMS "long_tests=False" CACHE STRING "") # MSAN is really slow and tests can sometimes timeout otherwise +set(LIBCXX_TEST_PARAMS "long_tests=False;enable_modules=clang" CACHE STRING "") # MSAN is really slow and tests can sometimes timeout otherwise set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") set(LIBCXXABI_USE_LLVM_UNWINDER OFF CACHE BOOL "") # MSAN is compiled against the system unwinder, which leads to false positives diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-optimized-speed.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-optimized-speed.cmake index 577a5de9f3..b3a845caa0 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-optimized-speed.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-optimized-speed.cmake @@ -2,3 +2,5 @@ set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "") set(LIBCXX_TEST_PARAMS "optimization=speed" CACHE STRING "") set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") set(LIBUNWIND_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") +set(LIBCXX_TEST_PARAMS "enable_modules=clang" CACHE STRING "") +set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-static.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-static.cmake index ed2bf85714..0866a215b9 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-static.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-static.cmake @@ -1,3 +1,5 @@ set(LIBCXX_ENABLE_SHARED OFF CACHE BOOL "") set(LIBCXXABI_ENABLE_SHARED OFF CACHE BOOL "") set(LIBUNWIND_ENABLE_SHARED OFF CACHE BOOL "") +set(LIBCXX_TEST_PARAMS "enable_modules=clang" CACHE STRING "") +set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-tsan.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-tsan.cmake index c42c1bb8e7..662fb1f46e 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-tsan.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-tsan.cmake @@ -1,2 +1,4 @@ set(LLVM_USE_SANITIZER "Thread" CACHE STRING "") set(LIBCXXABI_USE_LLVM_UNWINDER OFF CACHE BOOL "") # TSAN is compiled against the system unwinder, which leads to false positives +set(LIBCXX_TEST_PARAMS "enable_modules=clang" CACHE STRING "") +set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") diff --git a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-ubsan.cmake b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-ubsan.cmake index 7ad891e4ae..f1a36c355b 100644 --- a/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-ubsan.cmake +++ b/naiveproxy/src/third_party/libc++/src/cmake/caches/Generic-ubsan.cmake @@ -1,2 +1,4 @@ set(LLVM_USE_SANITIZER "Undefined" CACHE STRING "") set(LIBCXX_ABI_UNSTABLE ON CACHE BOOL "") +set(LIBCXX_TEST_PARAMS "enable_modules=clang" CACHE STRING "") +set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "") diff --git a/naiveproxy/src/third_party/libc++/src/docs/ABIGuarantees.rst b/naiveproxy/src/third_party/libc++/src/docs/ABIGuarantees.rst index c7d5afe108..4d4674c775 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/ABIGuarantees.rst +++ b/naiveproxy/src/third_party/libc++/src/docs/ABIGuarantees.rst @@ -44,6 +44,10 @@ This removes the ``iterator`` base class from ``back_insert_iterator``, ``front_ This doesn't directly affect the layout of these types in most cases, but may result in more padding being used when they are used in combination, for example ``reverse_iterator>``. +``_LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER`` +------------------------------------------------- +This removes a second member in ``reverse_iterator`` that is unused after LWG2360. + ``_LIBCPP_ABI_VARIANT_INDEX_TYPE_OPTIMIZATION`` ------------------------------------------------- This changes the index type used inside ``variant`` to the smallest required type to reduce the datasize of variants in diff --git a/naiveproxy/src/third_party/libc++/src/docs/Contributing.rst b/naiveproxy/src/third_party/libc++/src/docs/Contributing.rst index 6aaa70764c..4e9d1ba52b 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/Contributing.rst +++ b/naiveproxy/src/third_party/libc++/src/docs/Contributing.rst @@ -174,10 +174,11 @@ Pre-commit CI Introduction ------------ -Unlike most parts of the LLVM project, libc++ uses a pre-commit CI [#]_. This -CI is hosted on `Buildkite `__ and -the build results are visible in the review on GitHub. Please make sure -the CI is green before committing a patch. +Unlike most parts of the LLVM project, libc++ uses a pre-commit CI [#]_. Some of +this CI is hosted on `Buildkite `__, +but some has migrated to the LLVM CI infrastructure. The build results are +visible in the review on GitHub. Please make sure the CI is green before +committing a patch. The CI tests libc++ for all :ref:`supported platforms `. The build is started for every commit added to a Pull Request. A complete CI @@ -246,21 +247,100 @@ Below is a short description of the most interesting CI builds [#]_: Infrastructure -------------- -All files of the CI infrastructure are in the directory ``libcxx/utils/ci``. -Note that quite a bit of this infrastructure is heavily Linux focused. This is -the platform used by most of libc++'s Buildkite runners and developers. +The files for the CI infrastructure are split between the llvm-project +and the llvm-zorg repositories. All files of the CI infrastructure in +the llvm-project are in the directory ``libcxx/utils/ci``. Note that +quite a bit of this infrastructure is heavily Linux focused. This is +the platform used by most of libc++'s Buildkite runners and +developers. -Dockerfile -~~~~~~~~~~ +Dockerfile/Container Images +~~~~~~~~~~~~~~~~~~~~~~~~~~~ Contains the Docker image for the Ubuntu CI. Because the same Docker image is used for the ``main`` and ``release`` branch, it should contain no hard-coded -versions. It contains the used versions of Clang, various clang-tools, +versions. It contains the used versions of Clang, various clang-tools, GCC, and CMake. .. note:: This image is pulled from Docker hub and not rebuild when changing the Dockerfile. +Updating the CI testing container images +---------------------------------------- + +The libcxx linux premerge testing can run on one of three sets of runner +groups. The three runner group names are "llvm-premerge-libcxx-runners", +"llvm-premerge-libcxx-release-runners" and "llvm-premerge-libcxx-next-runners". +Which runner set to use is controlled by the contents of +https://github.com/llvm/llvm-project/blob/main/.github/workflows/libcxx-build-and-test.yaml. +By default, it uses "llvm-premerge-libcxx-runners". To switch to one of the +other runner sets, just replace all uses of "llvm-premerge-libcxx-runners" in +the yaml file with the desired runner set. + +Which container image is used by these three runner sets is controlled +and set by the variable values in +https://github.com/llvm/llvm-zorg/blob/main/premerge/premerge_resources/variables.tf. +The table below shows the variable names and +the runner sets to which they correspond. To see their values, follow the +link above (to variables.tf in llvm-zorg). + ++------------------------------------+---------------------------+ +|Runner Set |Variable | ++====================================+===========================+ +|llvm-premerge-libcxx-runners |libcxx_runner_image | ++------------------------------------+---------------------------+ +|llvm-premerge-libcxx-release-runners|libcxx_release_runner_image| ++------------------------------------+---------------------------+ +|llvm-premerge-libcxx-next-runners |libcxx_next_runner_image | ++------------------------------------+---------------------------+ + + +When updating the container image you can either update just the +runner binary (the part the connects to Github), or you can update +everything (tools, etc.). Whether to update just the runner or to update +everything is controlled by the value of ``ACTIONS_BASE_IMAGE``, under +``actions-builder`` in ``libcxx/utils/ci/docker-compose.yml``. + +To update just the runner binary, change the value of ``ACTIONS_BASE_IMAGE`` +to be a modified version of one of the libcxx runner variable images from +https://github.com/llvm/llvm-zorg/blob/main/premerge/premerge_resources/variables.tf, +as follows: Find the libcxx runner image name you want to use from the +variables.tf file. The name will be something like +``ghcr.io/llvm/libcxx-linux-builder:``. Replace +``libcxx-linux-builder`` with ``libcxx-linux-builder-base``. Use this new image +name as the value you assign to ``ACTIONS_BASE_IMAGE``. + +To update the entire container image, set the value of ``ACTIONS_BASE_IMAGE`` +to ``builder-base``. If the value is already ``builder-base`` (there +have been no just-the-runner updates since the last complete update), then you +need to find the line containing ``RUN echo "Last forced update executed on`` +in ``libcxx/utils/ci/Dockerfile`` and update the date to be the current date. + +Once you have created and merged a PR with those changes, a new image +will be created, and a link to it can be found at +https://github.com/llvm/llvm-project/pkgs/container/libcxx-linux-builder, +where the actual image name should be +``ghcr.io/llvm/libcxx-linux-builder:``. + +Lastly you need to create a PR in the llvm-zorg repository, +updating the the value of the appropriate libcxx runner variable in +the variables.tf file mentioned above to the name of your newly created +image (see above paragraph about finding the image name). Once that change +has been merged, an LLVM premerge maintainer (a Google employee) must use +terraform to apply the change to the running GKE cluster. + + +Monitoring premerge testing performance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The llvm-premerge-libcxx runners mentioned above collect metrics regarding the +time the tests spend queued up before they start running and also the time it +takes the tests to actually complete running. These metrics are collected and +aggregated (based on stage and PR), and the results can be seen at the +`Libc++ Premerge Testing dashboard +`__ +. + run-buildbot-container ~~~~~~~~~~~~~~~~~~~~~~ diff --git a/naiveproxy/src/third_party/libc++/src/docs/DesignDocs/HeaderRemovalPolicy.rst b/naiveproxy/src/third_party/libc++/src/docs/DesignDocs/HeaderRemovalPolicy.rst index 02cbc16231..e52b625fae 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/DesignDocs/HeaderRemovalPolicy.rst +++ b/naiveproxy/src/third_party/libc++/src/docs/DesignDocs/HeaderRemovalPolicy.rst @@ -22,9 +22,10 @@ to port headers to platforms with reduced functionality. A disadvantage is that users unknowingly depend on these transitive includes. Thus removing an include might break their build after upgrading a newer -version of libc++. For example, ```` is often forgotten but using -algorithms will still work through those transitive includes. This problem is -solved by modules, however in practice most people do not use modules (yet). +version of libc++ by reducing the set of declarations provided by a header. +For example, ```` is often forgotten but using algorithms will +still work through those transitive includes. This problem is solved by modules, +however in practice most people do not use modules (yet). To ease the removal of transitive includes in libc++, libc++ will remove unnecessary transitive includes in newly supported C++ versions. This means @@ -33,21 +34,34 @@ newer version of the Standard. Libc++ also reserves the right to remove transitive includes at any other time, however new language versions will be used as a convenient way to perform bulk removals of transitive includes. -For libc++ developers, this means that any transitive include removal must be -guarded by something of the form: +However, libc++ intends not to gratuitously break users on stable versions of +the Standard. Hence, we intend to maintain backwards compatibility of the +declarations we provide in a header, within reason. We reserve the right to +break such backwards compatibility in the future, however we will strive to +do it in a user-friendly way, again within reason. For libc++ developers, this +means that any transitive include removal of a public header must be guarded by +something of the form: .. code-block:: cpp - #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 + #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 23 # include # include # include #endif -When users define ``_LIBCPP_REMOVE_TRANSITIVE_INCLUDES``, libc++ will not -include transitive headers, regardless of the language version. This can be -useful for users to aid the transition to a newer language version, or by users -who simply want to make sure they include what they use in their code. +Occasionally, private headers may also be included transitively for backwards +compatibility in the same manner. We currently strive to provide backwards +compatibility on the set of declarations provided by a header in all Standard +modes starting with **C++23**. Note that this is very difficult to actually +enforce, so this is done only on a best effort basis. + +When users define ``_LIBCPP_REMOVE_TRANSITIVE_INCLUDES``, libc++ will not include +transitive headers, regardless of the language version. This can be useful for users +to aid the transition to a newer language version, or by users who simply want to +make sure they include what they use in their code. However, note that defining this +macro means that the set of declarations and transitive includes provided by the library +may change from release to release, which can break your code. Rationale diff --git a/naiveproxy/src/third_party/libc++/src/docs/DesignDocs/VisibilityMacros.rst b/naiveproxy/src/third_party/libc++/src/docs/DesignDocs/VisibilityMacros.rst index e9f88118b7..db54b35386 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/DesignDocs/VisibilityMacros.rst +++ b/naiveproxy/src/third_party/libc++/src/docs/DesignDocs/VisibilityMacros.rst @@ -31,7 +31,9 @@ Visibility Macros Mark a symbol as being part of our ABI. This includes functions that are part of the libc++ library, type information and other symbols. On Windows, this macro applies `dllimport`/`dllexport` to the symbol, and on other - platforms it gives the symbol default visibility. + platforms it gives the symbol default visibility. This macro should never be + used on class templates. On classes it should only be used if the vtable + lives in the built library. **_LIBCPP_OVERRIDABLE_FUNC_VIS** Mark a symbol as being exported by the libc++ library, but allow it to be diff --git a/naiveproxy/src/third_party/libc++/src/docs/FeatureTestMacroTable.rst b/naiveproxy/src/third_party/libc++/src/docs/FeatureTestMacroTable.rst index a36848ebd2..8fba6db871 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/FeatureTestMacroTable.rst +++ b/naiveproxy/src/third_party/libc++/src/docs/FeatureTestMacroTable.rst @@ -418,6 +418,8 @@ Status ---------------------------------------------------------- ----------------- ``__cpp_lib_atomic_min_max`` *unimplemented* ---------------------------------------------------------- ----------------- + ``__cpp_lib_atomic_ref`` ``202411L`` + ---------------------------------------------------------- ----------------- ``__cpp_lib_bind_front`` ``202306L`` ---------------------------------------------------------- ----------------- ``__cpp_lib_bitset`` ``202306L`` @@ -480,7 +482,7 @@ Status ---------------------------------------------------------- ----------------- ``__cpp_lib_not_fn`` ``202306L`` ---------------------------------------------------------- ----------------- - ``__cpp_lib_optional_range_support`` *unimplemented* + ``__cpp_lib_optional_range_support`` ``202406L`` ---------------------------------------------------------- ----------------- ``__cpp_lib_out_ptr`` ``202311L`` ---------------------------------------------------------- ----------------- @@ -488,6 +490,8 @@ Status ---------------------------------------------------------- ----------------- ``__cpp_lib_ranges_concat`` *unimplemented* ---------------------------------------------------------- ----------------- + ``__cpp_lib_ranges_indices`` ``202506L`` + ---------------------------------------------------------- ----------------- ``__cpp_lib_ratio`` ``202306L`` ---------------------------------------------------------- ----------------- ``__cpp_lib_rcu`` *unimplemented* @@ -506,6 +510,8 @@ Status ---------------------------------------------------------- ----------------- ``__cpp_lib_sstream_from_string_view`` ``202306L`` ---------------------------------------------------------- ----------------- + ``__cpp_lib_string_subview`` ``202506L`` + ---------------------------------------------------------- ----------------- ``__cpp_lib_string_view`` ``202403L`` ---------------------------------------------------------- ----------------- ``__cpp_lib_submdspan`` *unimplemented* diff --git a/naiveproxy/src/third_party/libc++/src/docs/Modules.rst b/naiveproxy/src/third_party/libc++/src/docs/Modules.rst index ebd851fed9..c8f3e6194f 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/Modules.rst +++ b/naiveproxy/src/third_party/libc++/src/docs/Modules.rst @@ -72,7 +72,7 @@ Some of the current limitations * Clang: * Including headers after importing the ``std`` module may fail. This is hard to solve and there is a work-around by first including all headers - `bug report `__. + `bug report `__. Blockers ~~~~~~~~ @@ -88,8 +88,7 @@ Blockers * Clang - * Some concepts do not work properly - `bug report `__. + * Some concepts do not work properly `bug report `__. Using in external projects diff --git a/naiveproxy/src/third_party/libc++/src/docs/ReleaseNotes/21.rst b/naiveproxy/src/third_party/libc++/src/docs/ReleaseNotes/21.rst index 91123ffa3e..2b1aa28b62 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/ReleaseNotes/21.rst +++ b/naiveproxy/src/third_party/libc++/src/docs/ReleaseNotes/21.rst @@ -53,8 +53,7 @@ Implemented Papers - P2711R1: Making multi-param constructors of ``views`` ``explicit`` (`Github `__) - P2770R0: Stashing stashing ``iterators`` for proper flattening (`Github `__) - P2655R3: ``common_reference_t`` of ``reference_wrapper`` Should Be a Reference Type (`Github `__) -- P2944R3: Comparisons for ``reference_wrapper`` (`Github `__) -- P3379R0: Constrain ``std::expected equality`` operators (`Github `__) +- P3379R0: Constrain ``std::expected`` equality operators (`Github `__) Improvements and New Features ----------------------------- @@ -148,6 +147,21 @@ ABI Affecting Changes comparison between shared libraries, since all RTTI has the correct visibility now. There is no behaviour change on Clang. +- LLVM 20 contained an ABI break that can result in the size of ``std::unordered_{map,set,multimap,multiset}`` and ``std::deque`` changing when used with an allocator type that is empty and contains a base class that is the same across rebound allocator instantiations (e.g. ``Allocator`` and ``Allocator`` are both empty and contain the same base class). + In addition, the layout of a user-defined type that: + + - contains one of the following containers: ``std::unordered_{map,set,multimap,multiset}``, ``std::deque``, ``std::map``, ``std::set``, ``std::multimap``, ``std::multiset``, ``std::list`` or ``std::vector``, and + - passes an empty allocator, comparator or hasher type to that container, and + - has a member of that same empty allocator, comparator or hasher type inside the enclosing struct, and + - that member is either marked with ``[[no_unique_address]]`` or optimized out via the EBO (empty base optimization) technique + + saw its size increase from LLVM 19 to LLVM 20. This was caused by the usage of ``[[no_unique_address]]`` within some of libc++'s containers in a way that allowed subtle interactions with enclosing objects. This is fixed in LLVM 21 when using the Clang compiler (returning to the LLVM 19 ABI), however that implies an ABI break from LLVM 20 to LLVM 21. + + Furthermore, fixing this causes a slight regression to constant evaluation support in ``std::unique_ptr``. Specifically, constant evaluation will now fail when the deleter relies on being value-initialized for constant-evaluation admissibility. If a default-initialized deleter can be used during constant evaluation, or if the default constructor is non-trivial, the ``unique_ptr`` is not affected by this regression. In particular, this regression does not impact any ``unique_ptr`` using the default deleter. + + Note that there is currently no way to realistically fix this ABI break on GCC, therefore GCC will remain on the ABI introduced in LLVM 19. That also means that Clang and GCC will have a slightly different ABI for the small subset of types listed above until we are able to apply the same fix we did with Clang on GCC. + + For more details see https://llvm.org/PR154146. Build System Changes -------------------- diff --git a/naiveproxy/src/third_party/libc++/src/docs/ReleaseNotes/22.rst b/naiveproxy/src/third_party/libc++/src/docs/ReleaseNotes/22.rst index 15bf46d44b..25d33a9c2e 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/ReleaseNotes/22.rst +++ b/naiveproxy/src/third_party/libc++/src/docs/ReleaseNotes/22.rst @@ -38,22 +38,77 @@ What's New in Libc++ 22.0.0? Implemented Papers ------------------ -- P2321R2: ``zip`` (`Github `__) (The paper is partially implemented. ``zip_transform_view`` is implemented in this release) +- P2321R2: ``zip`` (`Github `__) (The paper is partially implemented. ``zip_transform_view`` + is implemented in this release) +- P3044R2: sub-``string_view`` from ``string`` (`Github `__) +- P3223R2: Making ``std::istream::ignore`` less surprising (`Github `__) +- P3060R3: Add ``std::views::indices(n)`` (`Github `__) +- P2835R7: Expose ``std::atomic_ref``'s object address (`Github `__) +- P2944R3: Comparisons for ``reference_wrapper`` (`Github `__) +- P3168R2: Give ``std::optional`` Range Support (`Github `__) Improvements and New Features ----------------------------- +- The performance of ``map::map(const map&)`` has been improved up to 2.3x +- The performance of ``map::operator=(const map&)`` has been improved by up to 11x +- The performance of ``unordered_set::unordered_set(const unordered_set&)`` has been improved by up to 3.3x. +- The performance of ``unordered_set::operator=(const unordered_set&)`` has been improved by up to 5x. +- The performance of ``map::erase`` and ``set::erase`` has been improved by up to 2x +- The performance of ``find(key)`` in ``map``, ``set``, ``multimap`` and ``multiset`` has been improved by up to 2.3x +- Some reallocations are now avoided in `std::filesystem::path::lexically_relative`, resulting in a performance + improvement of up to 1.7x. +- The performance of the ``(iterator, iterator)`` constructors of ``map``, ``set``, ``multimap`` and ``multiset`` + has been improved by up to 3x +- The performance of ``insert(iterator, iterator)`` of ``map``, ``set``, ``multimap`` and ``multiset`` has been improved + by up to 2.5x +- The performance of ``erase(iterator, iterator)`` in the unordered containers has been improved by up to 1.9x +- The performance of ``map::insert_or_assign`` has been improved by up to 2x +- ``ofstream::write`` has been optimized to pass through large strings to system calls directly instead of copying them + in chunks into a buffer. +- Multiple internal types have been refactored to use ``[[no_unique_address]]``, resulting in faster compile times and + reduced debug information. + +- The performance of ``std::find`` has been improved by up to 2x for integral types +- The ``std::distance`` and ``std::ranges::distance`` algorithms have been optimized for segmented iterators (e.g., + ``std::join_view`` iterators), reducing the complexity from ``O(n)`` to ``O(n / segment_size)``. Benchmarks show + performance improvements of over 1600x in favorable cases with large segment sizes (e.g., 1024). +- The ``std::{fill, fill_n}`` and ``std::ranges::{fill, fill_n}`` algorithms have been optimized for segmented iterators, + resulting in a performance improvement of at least 10x for ``std::deque`` iterators and + ``std::join_view>>`` iterators. +- The ``std::generate`` and ``std::generate_n`` algorithms have been optimized for segmented iterators, resulting in a + performance improvement for ``std::deque`` and ``std::join_view>>`` iterators. + Deprecations and Removals ------------------------- Potentially breaking changes ---------------------------- +- The algorithm for ``multi{map,set}::find`` has been modified such that it doesn't necessarily return an iterator to + the first equal element in the container. This was never guaranteed by the Standard, but libc++ previously happened to + always return the first equal element, like other implementations do. Starting with this release, code relying on the + first element being returned from ``find`` will be broken, and ``lower_bound`` or ``equal_range`` should be used + instead. + +- The ABI flag ``_LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER`` has been split off from + ``_LIBCPP_ABI_NO_ITERATOR_BASES``. If you are using this flag and care about ABI stability, you should set + ``_LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER`` as well. + Announcements About Future Releases ----------------------------------- ABI Affecting Changes --------------------- +- The ABI flag ``_LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER`` has been split off from + ``_LIBCPP_ABI_NO_ITERATOR_BASES``. If you are using this flag and care about ABI stability, you should set + ``_LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER`` as well. + +- The internal types ``__map_value_compare``, ``__unordered_map_hasher``, ``__unordered_map_equal``, + ``__hash_map_hasher`` and ``__hash_map_equal`` have been refactored to use ``_LIBCPP_COMPRESSED_ELEMENT`` instead of + potentially inheriting from the types they wrap. At this point in time we are not aware of any ABI changes caused by + this. + Build System Changes -------------------- diff --git a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx17Issues.csv b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx17Issues.csv index 15f4b28575..2fb7f14996 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx17Issues.csv +++ b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx17Issues.csv @@ -1,315 +1,315 @@ -"Issue #","Issue Name","Meeting","Status","First released version","Notes" -"`LWG2016 `__","Allocators must be no-throw swappable","2014-11 (Urbana)","|Complete|","","" -"`LWG2118 `__","``unique_ptr``\ for array does not support cv qualification conversion of actual argument","2014-11 (Urbana)","|Complete|","","" -"`LWG2170 `__","Aggregates cannot be ``DefaultConstructible``\ ","2014-11 (Urbana)","|Complete|","","" -"`LWG2340 `__","Replacement allocation functions declared as inline","2014-11 (Urbana)","|Complete|","","" -"`LWG2354 `__","Unnecessary copying when inserting into maps with braced-init syntax","2014-11 (Urbana)","|Complete|","","" -"`LWG2377 `__","``std::align``\ requirements overly strict","2014-11 (Urbana)","|Complete|","","" -"`LWG2396 `__","``underlying_type``\ doesn't say what to do for an incomplete enumeration type","2014-11 (Urbana)","|Complete|","","" -"`LWG2399 `__","``shared_ptr``\ 's constructor from ``unique_ptr``\ should be constrained","2014-11 (Urbana)","|Complete|","","" -"`LWG2400 `__","``shared_ptr``\ 's ``get_deleter()``\ should use ``addressof()``\ ","2014-11 (Urbana)","|Complete|","","" -"`LWG2401 `__","``std::function``\ needs more noexcept","2014-11 (Urbana)","|Complete|","","" -"`LWG2404 `__","``mismatch()``\ 's complexity needs to be updated","2014-11 (Urbana)","|Complete|","","" -"`LWG2408 `__","SFINAE-friendly ``common_type``\ / ``iterator_traits``\ is missing in C++14","2014-11 (Urbana)","|Complete|","","" -"`LWG2106 `__","``move_iterator``\ wrapping iterators returning prvalues","2014-11 (Urbana)","|Complete|","","" -"`LWG2129 `__","User specializations of ``std::initializer_list``\ ","2014-11 (Urbana)","|Complete|","21","" -"`LWG2212 `__","``tuple_size``\ for ``const pair``\ request header","2014-11 (Urbana)","|Complete|","","" -"`LWG2217 `__","``operator==(sub_match, string)``\ slices on embedded '\0's","2014-11 (Urbana)","|Complete|","","" -"`LWG2230 `__","""see below"" for ``initializer_list``\ constructors of unordered containers","2014-11 (Urbana)","|Complete|","","" -"`LWG2233 `__","``bad_function_call::what()``\ unhelpful","2014-11 (Urbana)","|Complete|","","" -"`LWG2266 `__","``vector``\ and ``deque``\ have incorrect insert requirements","2014-11 (Urbana)","|Complete|","","" -"`LWG2325 `__","``minmax_element()``\ 's behavior differing from ``max_element()``\ 's should be noted","2014-11 (Urbana)","|Complete|","","" -"`LWG2361 `__","Apply 2299 resolution throughout library","2014-11 (Urbana)","|Complete|","","" -"`LWG2365 `__","Missing noexcept in ``shared_ptr::shared_ptr(nullptr_t)``\ ","2014-11 (Urbana)","|Complete|","","" -"`LWG2376 `__","``bad_weak_ptr::what()``\ overspecified","2014-11 (Urbana)","|Complete|","","" -"`LWG2387 `__","More nested types that must be accessible and unambiguous","2014-11 (Urbana)","|Complete|","","" -"","","","","","" -"`LWG2059 `__","C++0x ambiguity problem with map::erase","2015-05 (Lenexa)","|Complete|","","" -"`LWG2063 `__","Contradictory requirements for string move assignment","2015-05 (Lenexa)","|Complete|","","" -"`LWG2076 `__","Bad CopyConstructible requirement in set constructors","2015-05 (Lenexa)","|Complete|","","" -"`LWG2160 `__","Unintended destruction ordering-specification of resize","2015-05 (Lenexa)","|Complete|","","" -"`LWG2168 `__","Inconsistent specification of uniform_real_distribution constructor","2015-05 (Lenexa)","|Complete|","","" -"`LWG2239 `__","min/max/minmax requirements","2015-05 (Lenexa)","|Complete|","","" -"`LWG2364 `__","deque and vector pop_back don't specify iterator invalidation requirements","2015-05 (Lenexa)","|Complete|","","" -"`LWG2369 `__","constexpr max(initializer_list) vs max_element","2015-05 (Lenexa)","|Complete|","","" -"`LWG2378 `__","Behaviour of standard exception types","2015-05 (Lenexa)","|Complete|","","" -"`LWG2403 `__","stof() should call strtof() and wcstof()","2015-05 (Lenexa)","|Complete|","","" -"`LWG2406 `__","negative_binomial_distribution should reject p == 1","2015-05 (Lenexa)","|Complete|","","" -"`LWG2407 `__","packaged_task(allocator_arg_t, const Allocator&, F&&) should neither be constrained nor explicit","2015-05 (Lenexa)","|Complete|","","" -"`LWG2411 `__","shared_ptr is only contextually convertible to bool","2015-05 (Lenexa)","|Complete|","","" -"`LWG2415 `__","Inconsistency between unique_ptr and shared_ptr","2015-05 (Lenexa)","|Complete|","","" -"`LWG2420 `__","function does not discard the return value of the target object","2015-05 (Lenexa)","|Complete|","","" -"`LWG2425 `__","``operator delete(void*, size_t)``\ doesn't invalidate pointers sufficiently","2015-05 (Lenexa)","|Complete|","","" -"`LWG2427 `__","Container adaptors as sequence containers, redux","2015-05 (Lenexa)","|Complete|","","" -"`LWG2428 `__","""External declaration"" used without being defined","2015-05 (Lenexa)","|Complete|","","" -"`LWG2433 `__","``uninitialized_copy()``\ /etc. should tolerate overloaded operator&","2015-05 (Lenexa)","|Complete|","","" -"`LWG2434 `__","``shared_ptr::use_count()``\ is efficient","2015-05 (Lenexa)","|Complete|","","" -"`LWG2437 `__","``iterator_traits::reference``\ can and can't be void","2015-05 (Lenexa)","|Complete|","","" -"`LWG2438 `__","``std::iterator``\ inheritance shouldn't be mandated","2015-05 (Lenexa)","|Complete|","","" -"`LWG2439 `__","``unique_copy()``\ sometimes can't fall back to reading its output","2015-05 (Lenexa)","|Complete|","","" -"`LWG2440 `__","``seed_seq::size()``\ should be noexcept","2015-05 (Lenexa)","|Complete|","","" -"`LWG2442 `__","``call_once()``\ shouldn't DECAY_COPY()","2015-05 (Lenexa)","|Complete|","","" -"`LWG2448 `__","Non-normative Container destructor specification","2015-05 (Lenexa)","|Complete|","","" -"`LWG2454 `__","Add ``raw_storage_iterator::base()``\ member","2015-05 (Lenexa)","|Complete|","","" -"`LWG2455 `__","Allocator default construction should be allowed to throw","2015-05 (Lenexa)","|Complete|","","" -"`LWG2458 `__","N3778 and new library deallocation signatures","2015-05 (Lenexa)","|Complete|","","" -"`LWG2459 `__","``std::polar``\ should require a non-negative rho","2015-05 (Lenexa)","|Complete|","","" -"`LWG2464 `__","``try_emplace``\ and ``insert_or_assign``\ misspecified","2015-05 (Lenexa)","|Complete|","","" -"`LWG2467 `__","``is_always_equal``\ has slightly inconsistent default","2015-05 (Lenexa)","|Complete|","","" -"`LWG2470 `__","Allocator's destroy function should be allowed to fail to instantiate","2015-05 (Lenexa)","|Complete|","","" -"`LWG2482 `__","[c.strings] Table 73 mentions nonexistent functions","2015-05 (Lenexa)","|Complete|","","" -"`LWG2488 `__","Placeholders should be allowed and encouraged to be constexpr","2015-05 (Lenexa)","|Complete|","","" -"","","","","","" -"`LWG1169 `__","``num_get``\ not fully compatible with ``strto*``\ ","2015-10 (Kona)","|Complete|","","" -"`LWG2072 `__","Unclear wording about capacity of temporary buffers","2015-10 (Kona)","|Complete|","","" -"`LWG2101 `__","Some transformation types can produce impossible types","2015-10 (Kona)","|Complete|","","" -"`LWG2111 `__","Which ``unexpected``\ /``terminate``\ handler is called from the exception handling runtime?","2015-10 (Kona)","|Complete|","","" -"`LWG2119 `__","Missing ``hash``\ specializations for extended integer types","2015-10 (Kona)","|Complete|","","" -"`LWG2127 `__","Move-construction with ``raw_storage_iterator``\ ","2015-10 (Kona)","|Complete|","","" -"`LWG2133 `__","Attitude to overloaded comma for iterators","2015-10 (Kona)","|Complete|","","" -"`LWG2156 `__","Unordered containers' ``reserve(n)``\ reserves for ``n-1``\ elements","2015-10 (Kona)","|Complete|","","" -"`LWG2218 `__","Unclear how containers use ``allocator_traits::construct()``\ ","2015-10 (Kona)","|Complete|","","" -"`LWG2219 `__","``*INVOKE*``\ -ing a pointer to member with a ``reference_wrapper``\ as the object expression","2015-10 (Kona)","|Complete|","","" -"`LWG2224 `__","Ambiguous status of access to non-live objects","2015-10 (Kona)","|Complete|","","" -"`LWG2234 `__","``assert()``\ should allow usage in constant expressions","2015-10 (Kona)","|Complete|","","" -"`LWG2244 `__","Issue on ``basic_istream::seekg``\ ","2015-10 (Kona)","|Complete|","","" -"`LWG2250 `__","Follow-up On Library Issue 2207","2015-10 (Kona)","|Complete|","","" -"`LWG2259 `__","Issues in 17.6.5.5 rules for member functions","2015-10 (Kona)","|Complete|","","" -"`LWG2273 `__","``regex_match``\ ambiguity","2015-10 (Kona)","|Complete|","","" -"`LWG2336 `__","``is_trivially_constructible``\ /``is_trivially_assignable``\ traits are always false","2015-10 (Kona)","|Complete|","","" -"`LWG2353 `__","``std::next``\ is over-constrained","2015-10 (Kona)","|Complete|","","" -"`LWG2367 `__","``pair``\ and ``tuple``\ are not correctly implemented for ``is_constructible``\ with no args","2015-10 (Kona)","|Complete|","","" -"`LWG2380 `__","May ````\ provide ``long ::abs(long)``\ and ``long long ::abs(long long)``\ ?","2015-10 (Kona)","|Complete|","","" -"`LWG2384 `__","Allocator's ``deallocate``\ function needs better specification","2015-10 (Kona)","|Complete|","","" -"`LWG2385 `__","``function::assign``\ allocator argument doesn't make sense","2015-10 (Kona)","|Complete|","","" -"`LWG2435 `__","``reference_wrapper::operator()``\ 's Remark should be deleted","2015-10 (Kona)","|Complete|","","" -"`LWG2447 `__","Allocators and ``volatile``\ -qualified value types","2015-10 (Kona)","|Complete|","","" -"`LWG2462 `__","``std::ios_base::failure``\ is overspecified","2015-10 (Kona)","|Complete|","","" -"`LWG2466 `__","``allocator_traits::max_size()``\ default behavior is incorrect","2015-10 (Kona)","|Complete|","","" -"`LWG2469 `__","Wrong specification of Requires clause of ``operator[]``\ for ``map``\ and ``unordered_map``\ ","2015-10 (Kona)","|Complete|","","" -"`LWG2473 `__","``basic_filebuf``\ 's relation to C ``FILE``\ semantics","2015-10 (Kona)","|Complete|","","" -"`LWG2476 `__","``scoped_allocator_adaptor``\ is not assignable","2015-10 (Kona)","|Complete|","","" -"`LWG2477 `__","Inconsistency of wordings in ``std::vector::erase()``\ and ``std::deque::erase()``\ ","2015-10 (Kona)","|Complete|","","" -"`LWG2483 `__","``throw_with_nested()``\ should use ``is_final``\ ","2015-10 (Kona)","|Complete|","","" -"`LWG2484 `__","``rethrow_if_nested()``\ is doubly unimplementable","2015-10 (Kona)","|Complete|","","" -"`LWG2485 `__","``get()``\ should be overloaded for ``const tuple&&``\ ","2015-10 (Kona)","|Complete|","","" -"`LWG2486 `__","``mem_fn()``\ should be required to use perfect forwarding","2015-10 (Kona)","|Complete|","","" -"`LWG2487 `__","``bind()``\ should be ``const``\ -overloaded, not *cv*-overloaded","2015-10 (Kona)","|Complete|","","" -"`LWG2489 `__","``mem_fn()``\ should be ``noexcept``\ ","2015-10 (Kona)","|Complete|","","" -"`LWG2492 `__","Clarify requirements for ``comp``\ ","2015-10 (Kona)","|Complete|","","" -"`LWG2495 `__","There is no such thing as an Exception Safety element","2015-10 (Kona)","|Complete|","","" -"","","","","","" -"`LWG2192 `__","Validity and return type of ``std::abs(0u)``\ is unclear","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2276 `__","Missing requirement on ``std::promise::set_exception``\ ","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2296 `__","``std::addressof``\ should be ``constexpr``\ ","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2450 `__","``(greater|less|greater_equal|less_equal)``\ do not yield a total order for pointers","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2520 `__","N4089 broke initializing ``unique_ptr``\ from a ``nullptr``\ ","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2522 `__","[fund.ts.v2] Contradiction in ``set_default_resource``\ specification","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2523 `__","``std::promise``\ synopsis shows two ``set_value_at_thread_exit()``\ 's for no apparent reason","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2537 `__","Constructors for ``priority_queue``\ taking allocators should call ``make_heap``\ ","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2539 `__","[fund.ts.v2] ``invocation_trait``\ definition definition doesn't work for surrogate call functions","2016-02 (Jacksonville)","","","" -"`LWG2545 `__","Simplify wording for ``bind``\ without explicitly specified return type","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2557 `__","Logical operator traits are broken in the zero-argument case","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2558 `__","[fund.ts.v2] Logical operator traits are broken in the zero-argument case","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2559 `__","Error in LWG 2234's resolution","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2560 `__","``is_constructible``\ underspecified when applied to a function type","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2565 `__","``std::function``\ 's move constructor should guarantee nothrow for ``reference_wrapper``\ s and function pointers","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2566 `__","Requirements on the first template parameter of container adaptors","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2571 `__","|sect|\ [map.modifiers]/2 imposes nonsensical requirement on ``insert(InputIterator, InputIterator)``\ ","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2572 `__","The remarks for ``shared_ptr::operator*``\ should apply to *cv*-qualified ``void``\ as well","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2574 `__","[fund.ts.v2] ``std::experimental::function::operator=(F&&)``\ should be constrained","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2575 `__","[fund.ts.v2] ``experimental::function::assign``\ should be removed","2016-02 (Jacksonville)","","","" -"`LWG2576 `__","``istream_iterator``\ and ``ostream_iterator``\ should use ``std::addressof``\ ","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2577 `__","``{shared,unique}_lock``\ should use ``std::addressof``\ ","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2579 `__","Inconsistency wrt Allocators in ``basic_string``\ assignment vs. ``basic_string::assign``\ ","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2581 `__","Specialization of ````\ variable templates should be prohibited","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2582 `__","|sect|\ [res.on.functions]/2's prohibition against incomplete types shouldn't apply to type traits","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2583 `__","There is no way to supply an allocator for ``basic_string(str, pos)``\ ","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2585 `__","``forward_list::resize(size_type, const value_type&)``\ effects incorrect","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2586 `__","Wrong value category used in ``scoped_allocator_adaptor::construct()``\ ","2016-02 (Jacksonville)","|Complete|","","" -"`LWG2590 `__","Aggregate initialization for ``std::array``\ ","2016-02 (Jacksonville)","|Complete|","","" -"","","","","","" -"`LWG2181 `__","Exceptions from seed sequence operations","2016-06 (Oulu)","|Complete|","","" -"`LWG2309 `__","mutex::lock() should not throw device_or_resource_busy","2016-06 (Oulu)","|Complete|","","" -"`LWG2310 `__","Public exposition only member in std::array","2016-06 (Oulu)","|Complete|","","" -"`LWG2312 `__","tuple's constructor constraints need to be phrased more precisely","2016-06 (Oulu)","|Complete|","","" -"`LWG2328 `__","Rvalue stream extraction should use perfect forwarding","2016-06 (Oulu)","|Complete|","","" -"`LWG2393 `__","std::function's Callable definition is broken","2016-06 (Oulu)","|Complete|","","" -"`LWG2422 `__","``std::numeric_limits::is_modulo``\ description: ""most machines"" errata","2016-06 (Oulu)","|Complete|","","" -"`LWG2426 `__","Issue about compare_exchange","2016-06 (Oulu)","|Complete|","","" -"`LWG2436 `__","Comparators for associative containers should always be CopyConstructible","2016-06 (Oulu)","|Complete|","","" -"`LWG2441 `__","Exact-width atomic typedefs should be provided","2016-06 (Oulu)","|Complete|","","" -"`LWG2451 `__","[fund.ts.v2] optional should 'forward' T's implicit conversions","2016-06 (Oulu)","|Nothing To Do|","","" -"`LWG2509 `__","[fund.ts.v2] any_cast doesn't work with rvalue reference targets and cannot move with a value target","2016-06 (Oulu)","|Complete|","","" -"`LWG2516 `__","[fund.ts.v2] Public ""exposition only"" members in observer_ptr","2016-06 (Oulu)","|Complete|","18","" -"`LWG2542 `__","Missing const requirements for associative containers","2016-06 (Oulu)","","","" -"`LWG2549 `__","Tuple EXPLICIT constructor templates that take tuple parameters end up taking references to temporaries and will create dangling references","2016-06 (Oulu)","|Complete|","","" -"`LWG2550 `__","Wording of unordered container's clear() method complexity","2016-06 (Oulu)","|Complete|","","" -"`LWG2551 `__","[fund.ts.v2] ""Exception safety"" cleanup in library fundamentals required","2016-06 (Oulu)","|Complete|","","" -"`LWG2555 `__","[fund.ts.v2] No handling for over-aligned types in optional","2016-06 (Oulu)","|Complete|","","" -"`LWG2573 `__","[fund.ts.v2] std::hash does not work for arrays","2016-06 (Oulu)","","","" -"`LWG2596 `__","vector::data() should use addressof","2016-06 (Oulu)","|Complete|","","" -"`LWG2667 `__","path::root_directory() description is confusing","2016-06 (Oulu)","|Complete|","","" -"`LWG2669 `__","recursive_directory_iterator effects refers to non-existent functions","2016-06 (Oulu)","|Complete|","","" -"`LWG2670 `__","system_complete refers to undefined variable 'base'","2016-06 (Oulu)","|Complete|","","" -"`LWG2671 `__","Errors in Copy","2016-06 (Oulu)","|Complete|","","" -"`LWG2673 `__","status() effects cannot be implemented as specified","2016-06 (Oulu)","|Complete|","","" -"`LWG2674 `__","Bidirectional iterator requirement on path::iterator is very expensive","2016-06 (Oulu)","|Complete|","","" -"`LWG2683 `__","filesystem::copy() says ""no effects""","2016-06 (Oulu)","|Complete|","","" -"`LWG2684 `__","priority_queue lacking comparator typedef","2016-06 (Oulu)","|Complete|","","" -"`LWG2685 `__","shared_ptr deleters must not throw on move construction","2016-06 (Oulu)","|Complete|","","" -"`LWG2687 `__","{inclusive,exclusive}_scan misspecified","2016-06 (Oulu)","|Complete|","","" -"`LWG2688 `__","clamp misses preconditions and has extraneous condition on result","2016-06 (Oulu)","|Complete|","","" -"`LWG2689 `__","Parallel versions of std::copy and std::move shouldn't be in order","2016-06 (Oulu)","|Nothing To Do|","","" -"`LWG2698 `__","Effect of assign() on iterators/pointers/references","2016-06 (Oulu)","|Complete|","","" -"`LWG2704 `__","recursive_directory_iterator's members should require '``*this`` is dereferenceable'","2016-06 (Oulu)","|Complete|","","" -"`LWG2706 `__","Error reporting for recursive_directory_iterator::pop() is under-specified","2016-06 (Oulu)","|Complete|","","" -"`LWG2707 `__","path construction and assignment should have ""string_type&&"" overloads","2016-06 (Oulu)","|Complete|","","" -"`LWG2709 `__","offsetof is unnecessarily imprecise","2016-06 (Oulu)","|Nothing To Do|","","" -"`LWG2710 `__","""Effects: Equivalent to ..."" doesn't count ""Synchronization:"" as determined semantics","2016-06 (Oulu)","|Complete|","","" -"`LWG2711 `__","path is convertible from approximately everything under the sun","2016-06 (Oulu)","|Complete|","","" -"`LWG2716 `__","Specification of shuffle and sample disallows lvalue URNGs","2016-06 (Oulu)","|Complete|","","" -"`LWG2718 `__","Parallelism bug in [algorithms.parallel.exec] p2","2016-06 (Oulu)","","","" -"`LWG2719 `__","permissions function should not be noexcept due to narrow contract","2016-06 (Oulu)","|Complete|","","" -"`LWG2720 `__","permissions function incorrectly specified for symlinks","2016-06 (Oulu)","|Complete|","","" -"`LWG2721 `__","remove_all has incorrect post conditions","2016-06 (Oulu)","|Complete|","","" -"`LWG2723 `__","Do directory_iterator and recursive_directory_iterator become the end iterator upon error?","2016-06 (Oulu)","|Complete|","","" -"`LWG2724 `__","The protected virtual member functions of memory_resource should be private","2016-06 (Oulu)","|Complete|","16","" -"`LWG2725 `__","filesystem::exists(const path&, error_code&) error reporting","2016-06 (Oulu)","|Complete|","","" -"`LWG2726 `__","``[recursive_]directory_iterator::increment(error_code&)`` is underspecified","2016-06 (Oulu)","|Complete|","","" -"`LWG2727 `__","Parallel algorithms with constexpr specifier","2016-06 (Oulu)","","","" -"`LWG2728 `__","status(p).permissions() and symlink_status(p).permissions() are not specified","2016-06 (Oulu)","|Complete|","","" -"","","","","","" -"`LWG2062 `__","Effect contradictions w/o no-throw guarantee of std::function swaps","2016-11 (Issaquah)","|Complete|","","" -"`LWG2166 `__","Heap property underspecified?","2016-11 (Issaquah)","","","" -"`LWG2221 `__","No formatted output operator for nullptr","2016-11 (Issaquah)","|Complete|","","" -"`LWG2223 `__","shrink_to_fit effect on iterator validity","2016-11 (Issaquah)","|Complete|","","" -"`LWG2261 `__","Are containers required to use their 'pointer' type internally?","2016-11 (Issaquah)","","","" -"`LWG2394 `__","locale::name specification unclear - what is implementation-defined?","2016-11 (Issaquah)","|Complete|","","" -"`LWG2460 `__","LWG issue 2408 and value categories","2016-11 (Issaquah)","|Complete|","","" -"`LWG2468 `__","Self-move-assignment of library types","2016-11 (Issaquah)","","","" -"`LWG2475 `__","Allow overwriting of std::basic_string terminator with charT() to allow cleaner interoperation with legacy APIs","2016-11 (Issaquah)","|Complete|","","" -"`LWG2503 `__","multiline option should be added to syntax_option_type","2016-11 (Issaquah)","|Complete|","","" -"`LWG2510 `__","Tag types should not be DefaultConstructible","2016-11 (Issaquah)","|Complete|","","" -"`LWG2514 `__","Type traits must not be final","2016-11 (Issaquah)","|Complete|","","" -"`LWG2518 `__","[fund.ts.v2] Non-member swap for propagate_const should call member swap","2016-11 (Issaquah)","|Complete|","","" -"`LWG2519 `__","Iterator operator-= has gratuitous undefined behaviour","2016-11 (Issaquah)","|Complete|","","" -"`LWG2521 `__","[fund.ts.v2] weak_ptr's converting move constructor should be modified as well for array support","2016-11 (Issaquah)","","","" -"`LWG2525 `__","[fund.ts.v2] get_memory_resource should be const and noexcept","2016-11 (Issaquah)","","","" -"`LWG2527 `__","[fund.ts.v2] ALLOCATOR_OF for function::operator= has incorrect default","2016-11 (Issaquah)","","","" -"`LWG2531 `__","future::get should explicitly state that the shared state is released","2016-11 (Issaquah)","|Nothing To Do|","","" -"`LWG2534 `__","Constrain rvalue stream operators","2016-11 (Issaquah)","|Complete|","","" -"`LWG2536 `__","What should do?","2016-11 (Issaquah)","|Complete|","","" -"`LWG2540 `__","unordered_multimap::insert hint iterator","2016-11 (Issaquah)","|Complete|","","" -"`LWG2543 `__","LWG 2148 (hash support for enum types) seems under-specified","2016-11 (Issaquah)","|Complete|","","" -"`LWG2544 `__","``istreambuf_iterator(basic_streambuf* s)``\ effects unclear when s is 0","2016-11 (Issaquah)","|Complete|","","" -"`LWG2556 `__","Wide contract for future::share()","2016-11 (Issaquah)","|Complete|","","" -"`LWG2562 `__","Consistent total ordering of pointers by comparison functors","2016-11 (Issaquah)","","","" -"`LWG2567 `__","Specification of logical operator traits uses BaseCharacteristic, which is defined only for UnaryTypeTraits and BinaryTypeTraits","2016-11 (Issaquah)","|Complete|","","" -"`LWG2568 `__","[fund.ts.v2] Specification of logical operator traits uses BaseCharacteristic, which is defined only for UnaryTypeTraits and BinaryTypeTraits","2016-11 (Issaquah)","|Complete|","15","" -"`LWG2569 `__","conjunction and disjunction requirements are too strict","2016-11 (Issaquah)","|Complete|","15","" -"`LWG2570 `__","[fund.ts.v2] conjunction and disjunction requirements are too strict","2016-11 (Issaquah)","","","" -"`LWG2578 `__","Iterator requirements should reference iterator traits","2016-11 (Issaquah)","|Complete|","","" -"`LWG2584 `__"," ECMAScript IdentityEscape is ambiguous","2016-11 (Issaquah)","","","" -"`LWG2587 `__","""Convertible to bool"" requirement in conjunction and disjunction","2016-11 (Issaquah)","|Nothing To Do|","","Resolved by `LWG2567 `__" -"`LWG2588 `__","[fund.ts.v2] ""Convertible to bool"" requirement in conjunction and disjunction","2016-11 (Issaquah)","|Nothing To Do|","","Resolved by `LWG2568 `__" -"`LWG2589 `__","match_results can't satisfy the requirements of a container","2016-11 (Issaquah)","|Complete|","","" -"`LWG2591 `__","std::function's member template target() should not lead to undefined behaviour","2016-11 (Issaquah)","|Complete|","","" -"`LWG2598 `__","addressof works on temporaries","2016-11 (Issaquah)","|Complete|","","" -"`LWG2664 `__","operator/ (and other append) semantics not useful if argument has root","2016-11 (Issaquah)","|Complete|","","" -"`LWG2665 `__","remove_filename() post condition is incorrect","2016-11 (Issaquah)","|Complete|","","" -"`LWG2672 `__","Should ``is_empty``\ use error_code in its specification?","2016-11 (Issaquah)","|Complete|","","" -"`LWG2678 `__","std::filesystem enum classes overspecified","2016-11 (Issaquah)","|Complete|","","" -"`LWG2679 `__","Inconsistent Use of Effects and Equivalent To","2016-11 (Issaquah)","|Complete|","","" -"`LWG2680 `__","Add ""Equivalent to"" to filesystem","2016-11 (Issaquah)","|Complete|","","" -"`LWG2681 `__","filesystem::copy() cannot copy symlinks","2016-11 (Issaquah)","|Complete|","","" -"`LWG2686 `__","Why is std::hash specialized for error_code, but not error_condition?","2016-11 (Issaquah)","|Complete|","","" -"`LWG2694 `__","Application of LWG 436 accidentally deleted definition of ""facet""","2016-11 (Issaquah)","|Complete|","","" -"`LWG2696 `__","Interaction between make_shared and enable_shared_from_this is underspecified","2016-11 (Issaquah)","|Nothing To Do|","","" -"`LWG2699 `__","Missing restriction in [numeric.requirements]","2016-11 (Issaquah)","|Complete|","","" -"`LWG2712 `__","copy_file(from, to, ...) has a number of unspecified error conditions","2016-11 (Issaquah)","|Complete|","","" -"`LWG2722 `__","equivalent incorrectly specifies throws clause","2016-11 (Issaquah)","|Complete|","","" -"`LWG2729 `__","Missing SFINAE on std::pair::operator=","2016-11 (Issaquah)","|Complete|","","" -"`LWG2732 `__","Questionable specification of path::operator/= and path::append","2016-11 (Issaquah)","|Complete|","","" -"`LWG2733 `__","[fund.ts.v2] gcd / lcm and bool","2016-11 (Issaquah)","|Complete|","","" -"`LWG2735 `__","std::abs(short), std::abs(signed char) and others should return int instead of double in order to be compatible with C++98 and C","2016-11 (Issaquah)","|Complete|","","" -"`LWG2736 `__","nullopt_t insufficiently constrained","2016-11 (Issaquah)","|Complete|","","" -"`LWG2738 `__","``is_constructible``\ with void types","2016-11 (Issaquah)","|Complete|","","" -"`LWG2739 `__","Issue with time_point non-member subtraction with an unsigned duration","2016-11 (Issaquah)","|Complete|","","" -"`LWG2740 `__","constexpr optional::operator->","2016-11 (Issaquah)","|Complete|","","" -"`LWG2742 `__","Inconsistent string interface taking string_view","2016-11 (Issaquah)","|Complete|","","" -"`LWG2744 `__","any's in_place constructors","2016-11 (Issaquah)","|Complete|","","" -"`LWG2745 `__","[fund.ts.v2] Implementability of LWG 2451","2016-11 (Issaquah)","|Complete|","","" -"`LWG2747 `__","Possibly redundant std::move in [alg.foreach]","2016-11 (Issaquah)","|Complete|","","" -"`LWG2748 `__","swappable traits for optionals","2016-11 (Issaquah)","|Complete|","","" -"`LWG2749 `__","swappable traits for variants","2016-11 (Issaquah)","|Complete|","","" -"`LWG2750 `__","[fund.ts.v2] LWG 2451 conversion constructor constraint","2016-11 (Issaquah)","|Nothing To Do|","","" -"`LWG2752 `__","""Throws:"" clauses of async and packaged_task are unimplementable","2016-11 (Issaquah)","|Nothing To Do|","","" -"`LWG2755 `__","[string.view.io] uses non-existent basic_string_view::to_string function","2016-11 (Issaquah)","|Complete|","","" -"`LWG2756 `__","C++ WP optional should 'forward' T's implicit conversions","2016-11 (Issaquah)","|Complete|","","" -"`LWG2758 `__","std::string{}.assign(""ABCDE"", 0, 1) is ambiguous","2016-11 (Issaquah)","|Complete|","","" -"`LWG2759 `__","gcd / lcm and bool for the WP","2016-11 (Issaquah)","|Complete|","","" -"`LWG2760 `__","non-const basic_string::data should not invalidate iterators","2016-11 (Issaquah)","|Complete|","","" -"`LWG2765 `__","Did LWG 1123 go too far?","2016-11 (Issaquah)","|Complete|","","" -"`LWG2767 `__","not_fn call_wrapper can form invalid types","2016-11 (Issaquah)","|Complete|","","" -"`LWG2770 `__","``tuple_size`` specialization is not SFINAE compatible and breaks decomposition declarations","2016-11 (Issaquah)","|Complete|","21","" -"`LWG2771 `__","Broken Effects of some basic_string::compare functions in terms of basic_string_view","2016-11 (Issaquah)","|Complete|","","" -"`LWG2773 `__","Making std::ignore constexpr","2016-11 (Issaquah)","|Complete|","","" -"`LWG2777 `__","basic_string_view::copy should use char_traits::copy","2016-11 (Issaquah)","|Complete|","","" -"`LWG2778 `__","basic_string_view is missing constexpr","2016-11 (Issaquah)","|Complete|","","" -"","","","","","" -"`LWG2260 `__","Missing requirement for Allocator::pointer","2017-02 (Kona)","|Complete|","","" -"`LWG2676 `__","Provide filesystem::path overloads for File-based streams","2017-02 (Kona)","|Complete|","","" -"`LWG2768 `__","any_cast and move semantics","2017-02 (Kona)","|Complete|","","" -"`LWG2769 `__","Redundant const in the return type of any_cast(const any&)","2017-02 (Kona)","|Complete|","","" -"`LWG2781 `__","Contradictory requirements for std::function and std::reference_wrapper","2017-02 (Kona)","|Complete|","","" -"`LWG2782 `__","scoped_allocator_adaptor constructors must be constrained","2017-02 (Kona)","|Complete|","","" -"`LWG2784 `__","Resolution to LWG 2484 is missing ""otherwise, no effects"" and is hard to parse","2017-02 (Kona)","|Complete|","","" -"`LWG2785 `__","quoted should work with basic_string_view","2017-02 (Kona)","|Complete|","","" -"`LWG2786 `__","Annex C should mention shared_ptr changes for array support","2017-02 (Kona)","|Complete|","","" -"`LWG2787 `__","|sect|\ [file_status.cons] doesn't match class definition","2017-02 (Kona)","|Complete|","","" -"`LWG2788 `__","basic_string range mutators unintentionally require a default constructible allocator","2017-02 (Kona)","|Complete|","","" -"`LWG2789 `__","Equivalence of contained objects","2017-02 (Kona)","|Complete|","","" -"`LWG2790 `__","Missing specification of istreambuf_iterator::operator->","2017-02 (Kona)","|Complete|","","" -"`LWG2794 `__","Missing requirements for allocator pointers","2017-02 (Kona)","|Nothing To Do|","","" -"`LWG2795 `__","|sect|\ [global.functions] provides incorrect example of ADL use","2017-02 (Kona)","|Complete|","","" -"`LWG2796 `__","tuple should be a literal type","2017-02 (Kona)","|Complete|","","" -"`LWG2801 `__","Default-constructibility of unique_ptr","2017-02 (Kona)","|Complete|","","" -"`LWG2802 `__","shared_ptr constructor requirements for a deleter","2017-02 (Kona)","|Complete|","","" -"`LWG2804 `__","Unconditional constexpr default constructor for istream_iterator","2017-02 (Kona)","|Complete|","","" -"`LWG2806 `__","Base class of bad_optional_access","2017-02 (Kona)","|Complete|","","" -"`LWG2807 `__","std::invoke should use ``std::is_nothrow_callable``\ ","2017-02 (Kona)","|Complete|","","" -"`LWG2812 `__","Range access is available with ","2017-02 (Kona)","|Complete|","","" -"`LWG2824 `__","list::sort should say that the order of elements is unspecified if an exception is thrown","2017-02 (Kona)","|Complete|","","" -"`LWG2826 `__","string_view iterators use old wording","2017-02 (Kona)","|Complete|","","" -"`LWG2834 `__","Resolution LWG 2223 is missing wording about end iterators","2017-02 (Kona)","|Complete|","","" -"`LWG2835 `__","LWG 2536 seems to misspecify ","2017-02 (Kona)","|Complete|","","" -"`LWG2837 `__","gcd and lcm should support a wider range of input values","2017-02 (Kona)","|Complete|","","" -"`LWG2838 `__","is_literal_type specification needs a little cleanup","2017-02 (Kona)","|Complete|","","" -"`LWG2842 `__","in_place_t check for optional::optional(U&&) should decay U","2017-02 (Kona)","|Complete|","","" -"`LWG2850 `__","std::function move constructor does unnecessary work","2017-02 (Kona)","|Complete|","","" -"`LWG2853 `__","Possible inconsistency in specification of erase in [vector.modifiers]","2017-02 (Kona)","|Complete|","","" -"`LWG2855 `__","std::throw_with_nested(""string_literal"")","2017-02 (Kona)","|Complete|","","" -"`LWG2857 `__","{variant,optional,any}::emplace should return the constructed value","2017-02 (Kona)","|Complete|","","" -"`LWG2861 `__","basic_string should require that charT match traits::char_type","2017-02 (Kona)","|Complete|","","" -"`LWG2866 `__","Incorrect derived classes constraints","2017-02 (Kona)","|Nothing To Do|","","" -"`LWG2868 `__","Missing specification of bad_any_cast::what()","2017-02 (Kona)","|Complete|","","" -"`LWG2872 `__","Add definition for direct-non-list-initialization","2017-02 (Kona)","|Complete|","","" -"`LWG2873 `__","Add noexcept to several shared_ptr related functions","2017-02 (Kona)","|Complete|","","" -"`LWG2874 `__","Constructor ``shared_ptr::shared_ptr(Y*)``\ should be constrained","2017-02 (Kona)","|Complete|","13","" -"`LWG2875 `__","shared_ptr::shared_ptr(Y\*, D, [|hellip|\ ]) constructors should be constrained","2017-02 (Kona)","|Complete|","","" -"`LWG2876 `__","``shared_ptr::shared_ptr(const weak_ptr&)``\ constructor should be constrained","2017-02 (Kona)","|Complete|","14","" -"`LWG2878 `__","Missing DefaultConstructible requirement for istream_iterator default constructor","2017-02 (Kona)","|Complete|","","" -"`LWG2890 `__","The definition of 'object state' applies only to class types","2017-02 (Kona)","|Complete|","","" -"`LWG2900 `__","The copy and move constructors of optional are not constexpr","2017-02 (Kona)","|Complete|","","" -"`LWG2903 `__","The form of initialization for the emplace-constructors is not specified","2017-02 (Kona)","|Complete|","","" -"`LWG2904 `__","Make variant move-assignment more exception safe","2017-02 (Kona)","|Complete|","","" -"`LWG2905 `__","is_constructible_v, P, D const &> should be false when D is not copy constructible","2017-02 (Kona)","|Complete|","","" -"`LWG2908 `__","The less-than operator for shared pointers could do more","2017-02 (Kona)","|Complete|","","" -"`LWG2911 `__","An is_aggregate type trait is needed","2017-02 (Kona)","|Complete|","","" -"`LWG2921 `__","packaged_task and type-erased allocators","2017-02 (Kona)","|Complete|","20","Originally implemented in LLVM 6 but reverted later. Old documentation incorrectly said it was implemented." -"`LWG2934 `__","optional doesn't compare with T","2017-02 (Kona)","|Complete|","","" -"","","","","","" -"`LWG2901 `__","Variants cannot properly support allocators","2017-07 (Toronto)","|Complete|","","" -"`LWG2955 `__","``to_chars / from_chars``\ depend on ``std::string``\ ","2017-07 (Toronto)","|Nothing To Do|","","Resolved by `P0682R1 `__" -"`LWG2956 `__","``filesystem::canonical()``\ still defined in terms of ``absolute(p, base)``\ ","2017-07 (Toronto)","|Complete|","","" +"Issue #","Issue Name","Meeting","Status","First released version","GitHub issue","Notes" +"`LWG2016 `__","Allocators must be no-throw swappable","2014-11 (Urbana)","|Complete|","","`#103224 `__","" +"`LWG2118 `__","``unique_ptr``\ for array does not support cv qualification conversion of actual argument","2014-11 (Urbana)","|Complete|","","`#103225 `__","" +"`LWG2170 `__","Aggregates cannot be ``DefaultConstructible``\ ","2014-11 (Urbana)","|Complete|","","`#103226 `__","" +"`LWG2340 `__","Replacement allocation functions declared as inline","2014-11 (Urbana)","|Complete|","","`#103227 `__","" +"`LWG2354 `__","Unnecessary copying when inserting into maps with braced-init syntax","2014-11 (Urbana)","|Complete|","","`#103228 `__","" +"`LWG2377 `__","``std::align``\ requirements overly strict","2014-11 (Urbana)","|Complete|","","`#103229 `__","" +"`LWG2396 `__","``underlying_type``\ doesn't say what to do for an incomplete enumeration type","2014-11 (Urbana)","|Complete|","","`#103230 `__","" +"`LWG2399 `__","``shared_ptr``\ 's constructor from ``unique_ptr``\ should be constrained","2014-11 (Urbana)","|Complete|","","`#103231 `__","" +"`LWG2400 `__","``shared_ptr``\ 's ``get_deleter()``\ should use ``addressof()``\ ","2014-11 (Urbana)","|Complete|","","`#103232 `__","" +"`LWG2401 `__","``std::function``\ needs more noexcept","2014-11 (Urbana)","|Complete|","","`#103233 `__","" +"`LWG2404 `__","``mismatch()``\ 's complexity needs to be updated","2014-11 (Urbana)","|Complete|","","`#103234 `__","" +"`LWG2408 `__","SFINAE-friendly ``common_type``\ / ``iterator_traits``\ is missing in C++14","2014-11 (Urbana)","|Complete|","","`#103235 `__","" +"`LWG2106 `__","``move_iterator``\ wrapping iterators returning prvalues","2014-11 (Urbana)","|Complete|","","`#103236 `__","" +"`LWG2129 `__","User specializations of ``std::initializer_list``\ ","2014-11 (Urbana)","|Complete|","21","`#103237 `__","" +"`LWG2212 `__","``tuple_size``\ for ``const pair``\ request header","2014-11 (Urbana)","|Complete|","","`#103238 `__","" +"`LWG2217 `__","``operator==(sub_match, string)``\ slices on embedded '\0's","2014-11 (Urbana)","|Complete|","","`#103239 `__","" +"`LWG2230 `__","""see below"" for ``initializer_list``\ constructors of unordered containers","2014-11 (Urbana)","|Complete|","","`#103240 `__","" +"`LWG2233 `__","``bad_function_call::what()``\ unhelpful","2014-11 (Urbana)","|Complete|","","`#103241 `__","" +"`LWG2266 `__","``vector``\ and ``deque``\ have incorrect insert requirements","2014-11 (Urbana)","|Complete|","","`#103242 `__","" +"`LWG2325 `__","``minmax_element()``\ 's behavior differing from ``max_element()``\ 's should be noted","2014-11 (Urbana)","|Complete|","","`#103243 `__","" +"`LWG2361 `__","Apply 2299 resolution throughout library","2014-11 (Urbana)","|Complete|","","`#103244 `__","" +"`LWG2365 `__","Missing noexcept in ``shared_ptr::shared_ptr(nullptr_t)``\ ","2014-11 (Urbana)","|Complete|","","`#103246 `__","" +"`LWG2376 `__","``bad_weak_ptr::what()``\ overspecified","2014-11 (Urbana)","|Complete|","","`#103247 `__","" +"`LWG2387 `__","More nested types that must be accessible and unambiguous","2014-11 (Urbana)","|Complete|","","`#103248 `__","" +"","","","","","","" +"`LWG2059 `__","C++0x ambiguity problem with map::erase","2015-05 (Lenexa)","|Complete|","","`#103249 `__","" +"`LWG2063 `__","Contradictory requirements for string move assignment","2015-05 (Lenexa)","|Complete|","","`#103250 `__","" +"`LWG2076 `__","Bad CopyConstructible requirement in set constructors","2015-05 (Lenexa)","|Complete|","","`#103251 `__","" +"`LWG2160 `__","Unintended destruction ordering-specification of resize","2015-05 (Lenexa)","|Complete|","","`#103252 `__","" +"`LWG2168 `__","Inconsistent specification of uniform_real_distribution constructor","2015-05 (Lenexa)","|Complete|","","`#103253 `__","" +"`LWG2239 `__","min/max/minmax requirements","2015-05 (Lenexa)","|Complete|","","`#103254 `__","" +"`LWG2364 `__","deque and vector pop_back don't specify iterator invalidation requirements","2015-05 (Lenexa)","|Complete|","","`#103255 `__","" +"`LWG2369 `__","constexpr max(initializer_list) vs max_element","2015-05 (Lenexa)","|Complete|","","`#103256 `__","" +"`LWG2378 `__","Behaviour of standard exception types","2015-05 (Lenexa)","|Complete|","","`#103257 `__","" +"`LWG2403 `__","stof() should call strtof() and wcstof()","2015-05 (Lenexa)","|Complete|","","`#103258 `__","" +"`LWG2406 `__","negative_binomial_distribution should reject p == 1","2015-05 (Lenexa)","|Complete|","","`#103259 `__","" +"`LWG2407 `__","packaged_task(allocator_arg_t, const Allocator&, F&&) should neither be constrained nor explicit","2015-05 (Lenexa)","|Complete|","","`#103260 `__","" +"`LWG2411 `__","shared_ptr is only contextually convertible to bool","2015-05 (Lenexa)","|Complete|","","`#103261 `__","" +"`LWG2415 `__","Inconsistency between unique_ptr and shared_ptr","2015-05 (Lenexa)","|Complete|","","`#103262 `__","" +"`LWG2420 `__","function does not discard the return value of the target object","2015-05 (Lenexa)","|Complete|","","`#103263 `__","" +"`LWG2425 `__","``operator delete(void*, size_t)``\ doesn't invalidate pointers sufficiently","2015-05 (Lenexa)","|Complete|","","`#103264 `__","" +"`LWG2427 `__","Container adaptors as sequence containers, redux","2015-05 (Lenexa)","|Complete|","","`#103265 `__","" +"`LWG2428 `__","""External declaration"" used without being defined","2015-05 (Lenexa)","|Complete|","","`#103266 `__","" +"`LWG2433 `__","``uninitialized_copy()``\ /etc. should tolerate overloaded operator&","2015-05 (Lenexa)","|Complete|","","`#103267 `__","" +"`LWG2434 `__","``shared_ptr::use_count()``\ is efficient","2015-05 (Lenexa)","|Complete|","","`#103268 `__","" +"`LWG2437 `__","``iterator_traits::reference``\ can and can't be void","2015-05 (Lenexa)","|Complete|","","`#103269 `__","" +"`LWG2438 `__","``std::iterator``\ inheritance shouldn't be mandated","2015-05 (Lenexa)","|Complete|","","`#103270 `__","" +"`LWG2439 `__","``unique_copy()``\ sometimes can't fall back to reading its output","2015-05 (Lenexa)","|Complete|","","`#103271 `__","" +"`LWG2440 `__","``seed_seq::size()``\ should be noexcept","2015-05 (Lenexa)","|Complete|","","`#103272 `__","" +"`LWG2442 `__","``call_once()``\ shouldn't DECAY_COPY()","2015-05 (Lenexa)","|Complete|","","`#103274 `__","" +"`LWG2448 `__","Non-normative Container destructor specification","2015-05 (Lenexa)","|Complete|","","`#103276 `__","" +"`LWG2454 `__","Add ``raw_storage_iterator::base()``\ member","2015-05 (Lenexa)","|Complete|","","`#103277 `__","" +"`LWG2455 `__","Allocator default construction should be allowed to throw","2015-05 (Lenexa)","|Complete|","","`#103278 `__","" +"`LWG2458 `__","N3778 and new library deallocation signatures","2015-05 (Lenexa)","|Complete|","","`#103279 `__","" +"`LWG2459 `__","``std::polar``\ should require a non-negative rho","2015-05 (Lenexa)","|Complete|","","`#103280 `__","" +"`LWG2464 `__","``try_emplace``\ and ``insert_or_assign``\ misspecified","2015-05 (Lenexa)","|Complete|","","`#103281 `__","" +"`LWG2467 `__","``is_always_equal``\ has slightly inconsistent default","2015-05 (Lenexa)","|Complete|","","`#103282 `__","" +"`LWG2470 `__","Allocator's destroy function should be allowed to fail to instantiate","2015-05 (Lenexa)","|Complete|","","`#103283 `__","" +"`LWG2482 `__","[c.strings] Table 73 mentions nonexistent functions","2015-05 (Lenexa)","|Complete|","","`#103284 `__","" +"`LWG2488 `__","Placeholders should be allowed and encouraged to be constexpr","2015-05 (Lenexa)","|Complete|","","`#103285 `__","" +"","","","","","","" +"`LWG1169 `__","``num_get``\ not fully compatible with ``strto*``\ ","2015-10 (Kona)","|Complete|","","`#103286 `__","" +"`LWG2072 `__","Unclear wording about capacity of temporary buffers","2015-10 (Kona)","|Complete|","","`#103287 `__","" +"`LWG2101 `__","Some transformation types can produce impossible types","2015-10 (Kona)","|Complete|","","`#103288 `__","" +"`LWG2111 `__","Which ``unexpected``\ /``terminate``\ handler is called from the exception handling runtime?","2015-10 (Kona)","|Complete|","","`#103289 `__","" +"`LWG2119 `__","Missing ``hash``\ specializations for extended integer types","2015-10 (Kona)","|Complete|","","`#103290 `__","" +"`LWG2127 `__","Move-construction with ``raw_storage_iterator``\ ","2015-10 (Kona)","|Complete|","","`#103291 `__","" +"`LWG2133 `__","Attitude to overloaded comma for iterators","2015-10 (Kona)","|Complete|","","`#103292 `__","" +"`LWG2156 `__","Unordered containers' ``reserve(n)``\ reserves for ``n-1``\ elements","2015-10 (Kona)","|Complete|","","`#103293 `__","" +"`LWG2218 `__","Unclear how containers use ``allocator_traits::construct()``\ ","2015-10 (Kona)","|Complete|","","`#103294 `__","" +"`LWG2219 `__","``*INVOKE*``\ -ing a pointer to member with a ``reference_wrapper``\ as the object expression","2015-10 (Kona)","|Complete|","","`#103295 `__","" +"`LWG2224 `__","Ambiguous status of access to non-live objects","2015-10 (Kona)","|Complete|","","`#103296 `__","" +"`LWG2234 `__","``assert()``\ should allow usage in constant expressions","2015-10 (Kona)","|Complete|","","`#103297 `__","" +"`LWG2244 `__","Issue on ``basic_istream::seekg``\ ","2015-10 (Kona)","|Complete|","","`#103312 `__","" +"`LWG2250 `__","Follow-up On Library Issue 2207","2015-10 (Kona)","|Complete|","","`#103313 `__","" +"`LWG2259 `__","Issues in 17.6.5.5 rules for member functions","2015-10 (Kona)","|Complete|","","`#103314 `__","" +"`LWG2273 `__","``regex_match``\ ambiguity","2015-10 (Kona)","|Complete|","","`#103315 `__","" +"`LWG2336 `__","``is_trivially_constructible``\ /``is_trivially_assignable``\ traits are always false","2015-10 (Kona)","|Complete|","","`#103316 `__","" +"`LWG2353 `__","``std::next``\ is over-constrained","2015-10 (Kona)","|Complete|","","`#103317 `__","" +"`LWG2367 `__","``pair``\ and ``tuple``\ are not correctly implemented for ``is_constructible``\ with no args","2015-10 (Kona)","|Complete|","","`#103318 `__","" +"`LWG2380 `__","May ````\ provide ``long ::abs(long)``\ and ``long long ::abs(long long)``\ ?","2015-10 (Kona)","|Complete|","","`#103319 `__","" +"`LWG2384 `__","Allocator's ``deallocate``\ function needs better specification","2015-10 (Kona)","|Complete|","","`#103320 `__","" +"`LWG2385 `__","``function::assign``\ allocator argument doesn't make sense","2015-10 (Kona)","|Complete|","","`#103321 `__","" +"`LWG2435 `__","``reference_wrapper::operator()``\ 's Remark should be deleted","2015-10 (Kona)","|Complete|","","`#103322 `__","" +"`LWG2447 `__","Allocators and ``volatile``\ -qualified value types","2015-10 (Kona)","|Complete|","","`#103323 `__","" +"`LWG2462 `__","``std::ios_base::failure``\ is overspecified","2015-10 (Kona)","|Complete|","","`#103324 `__","" +"`LWG2466 `__","``allocator_traits::max_size()``\ default behavior is incorrect","2015-10 (Kona)","|Complete|","","`#103325 `__","" +"`LWG2469 `__","Wrong specification of Requires clause of ``operator[]``\ for ``map``\ and ``unordered_map``\ ","2015-10 (Kona)","|Complete|","","`#103326 `__","" +"`LWG2473 `__","``basic_filebuf``\ 's relation to C ``FILE``\ semantics","2015-10 (Kona)","|Complete|","","`#103327 `__","" +"`LWG2476 `__","``scoped_allocator_adaptor``\ is not assignable","2015-10 (Kona)","|Complete|","","`#103328 `__","" +"`LWG2477 `__","Inconsistency of wordings in ``std::vector::erase()``\ and ``std::deque::erase()``\ ","2015-10 (Kona)","|Complete|","","`#103329 `__","" +"`LWG2483 `__","``throw_with_nested()``\ should use ``is_final``\ ","2015-10 (Kona)","|Complete|","","`#103330 `__","" +"`LWG2484 `__","``rethrow_if_nested()``\ is doubly unimplementable","2015-10 (Kona)","|Complete|","","`#103331 `__","" +"`LWG2485 `__","``get()``\ should be overloaded for ``const tuple&&``\ ","2015-10 (Kona)","|Complete|","","`#103332 `__","" +"`LWG2486 `__","``mem_fn()``\ should be required to use perfect forwarding","2015-10 (Kona)","|Complete|","","`#103333 `__","" +"`LWG2487 `__","``bind()``\ should be ``const``\ -overloaded, not *cv*-overloaded","2015-10 (Kona)","|Complete|","","`#103334 `__","" +"`LWG2489 `__","``mem_fn()``\ should be ``noexcept``\ ","2015-10 (Kona)","|Complete|","","`#103335 `__","" +"`LWG2492 `__","Clarify requirements for ``comp``\ ","2015-10 (Kona)","|Complete|","","`#103336 `__","" +"`LWG2495 `__","There is no such thing as an Exception Safety element","2015-10 (Kona)","|Complete|","","`#103337 `__","" +"","","","","","","" +"`LWG2192 `__","Validity and return type of ``std::abs(0u)``\ is unclear","2016-02 (Jacksonville)","|Complete|","","`#103338 `__","" +"`LWG2276 `__","Missing requirement on ``std::promise::set_exception``\ ","2016-02 (Jacksonville)","|Complete|","","`#103339 `__","" +"`LWG2296 `__","``std::addressof``\ should be ``constexpr``\ ","2016-02 (Jacksonville)","|Complete|","","`#103340 `__","" +"`LWG2450 `__","``(greater|less|greater_equal|less_equal)``\ do not yield a total order for pointers","2016-02 (Jacksonville)","|Complete|","","`#103341 `__","" +"`LWG2520 `__","N4089 broke initializing ``unique_ptr``\ from a ``nullptr``\ ","2016-02 (Jacksonville)","|Complete|","","`#103342 `__","" +"`LWG2522 `__","[fund.ts.v2] Contradiction in ``set_default_resource``\ specification","2016-02 (Jacksonville)","|Complete|","","`#103344 `__","" +"`LWG2523 `__","``std::promise``\ synopsis shows two ``set_value_at_thread_exit()``\ 's for no apparent reason","2016-02 (Jacksonville)","|Complete|","","`#103345 `__","" +"`LWG2537 `__","Constructors for ``priority_queue``\ taking allocators should call ``make_heap``\ ","2016-02 (Jacksonville)","|Complete|","","`#103346 `__","" +"`LWG2539 `__","[fund.ts.v2] ``invocation_trait``\ definition definition doesn't work for surrogate call functions","2016-02 (Jacksonville)","","","`#99954 `__","" +"`LWG2545 `__","Simplify wording for ``bind``\ without explicitly specified return type","2016-02 (Jacksonville)","|Complete|","","`#103347 `__","" +"`LWG2557 `__","Logical operator traits are broken in the zero-argument case","2016-02 (Jacksonville)","|Complete|","","`#103348 `__","" +"`LWG2558 `__","[fund.ts.v2] Logical operator traits are broken in the zero-argument case","2016-02 (Jacksonville)","|Complete|","","`#103349 `__","" +"`LWG2559 `__","Error in LWG 2234's resolution","2016-02 (Jacksonville)","|Complete|","","`#103350 `__","" +"`LWG2560 `__","``is_constructible``\ underspecified when applied to a function type","2016-02 (Jacksonville)","|Complete|","","`#103351 `__","" +"`LWG2565 `__","``std::function``\ 's move constructor should guarantee nothrow for ``reference_wrapper``\ s and function pointers","2016-02 (Jacksonville)","|Complete|","","`#103352 `__","" +"`LWG2566 `__","Requirements on the first template parameter of container adaptors","2016-02 (Jacksonville)","|Complete|","","`#103353 `__","" +"`LWG2571 `__","|sect|\ [map.modifiers]/2 imposes nonsensical requirement on ``insert(InputIterator, InputIterator)``\ ","2016-02 (Jacksonville)","|Complete|","","`#103354 `__","" +"`LWG2572 `__","The remarks for ``shared_ptr::operator*``\ should apply to *cv*-qualified ``void``\ as well","2016-02 (Jacksonville)","|Complete|","","`#103355 `__","" +"`LWG2574 `__","[fund.ts.v2] ``std::experimental::function::operator=(F&&)``\ should be constrained","2016-02 (Jacksonville)","|Complete|","","`#103356 `__","" +"`LWG2575 `__","[fund.ts.v2] ``experimental::function::assign``\ should be removed","2016-02 (Jacksonville)","","","`#99959 `__","" +"`LWG2576 `__","``istream_iterator``\ and ``ostream_iterator``\ should use ``std::addressof``\ ","2016-02 (Jacksonville)","|Complete|","","`#103357 `__","" +"`LWG2577 `__","``{shared,unique}_lock``\ should use ``std::addressof``\ ","2016-02 (Jacksonville)","|Complete|","","`#103358 `__","" +"`LWG2579 `__","Inconsistency wrt Allocators in ``basic_string``\ assignment vs. ``basic_string::assign``\ ","2016-02 (Jacksonville)","|Complete|","","`#103359 `__","" +"`LWG2581 `__","Specialization of ````\ variable templates should be prohibited","2016-02 (Jacksonville)","|Complete|","","`#103360 `__","" +"`LWG2582 `__","|sect|\ [res.on.functions]/2's prohibition against incomplete types shouldn't apply to type traits","2016-02 (Jacksonville)","|Complete|","","`#103361 `__","" +"`LWG2583 `__","There is no way to supply an allocator for ``basic_string(str, pos)``\ ","2016-02 (Jacksonville)","|Complete|","","`#103362 `__","" +"`LWG2585 `__","``forward_list::resize(size_type, const value_type&)``\ effects incorrect","2016-02 (Jacksonville)","|Complete|","","`#103363 `__","" +"`LWG2586 `__","Wrong value category used in ``scoped_allocator_adaptor::construct()``\ ","2016-02 (Jacksonville)","|Complete|","","`#103364 `__","" +"`LWG2590 `__","Aggregate initialization for ``std::array``\ ","2016-02 (Jacksonville)","|Complete|","","`#103365 `__","" +"","","","","","","" +"`LWG2181 `__","Exceptions from seed sequence operations","2016-06 (Oulu)","|Complete|","","`#103367 `__","" +"`LWG2309 `__","mutex::lock() should not throw device_or_resource_busy","2016-06 (Oulu)","|Complete|","","`#103368 `__","" +"`LWG2310 `__","Public exposition only member in std::array","2016-06 (Oulu)","|Complete|","","`#103369 `__","" +"`LWG2312 `__","tuple's constructor constraints need to be phrased more precisely","2016-06 (Oulu)","|Complete|","","`#103370 `__","" +"`LWG2328 `__","Rvalue stream extraction should use perfect forwarding","2016-06 (Oulu)","|Complete|","","`#103372 `__","" +"`LWG2393 `__","std::function's Callable definition is broken","2016-06 (Oulu)","|Complete|","","`#103373 `__","" +"`LWG2422 `__","``std::numeric_limits::is_modulo``\ description: ""most machines"" errata","2016-06 (Oulu)","|Complete|","","`#103374 `__","" +"`LWG2426 `__","Issue about compare_exchange","2016-06 (Oulu)","|Complete|","","`#103375 `__","" +"`LWG2436 `__","Comparators for associative containers should always be CopyConstructible","2016-06 (Oulu)","|Complete|","","`#103376 `__","" +"`LWG2441 `__","Exact-width atomic typedefs should be provided","2016-06 (Oulu)","|Complete|","","`#103378 `__","" +"`LWG2451 `__","[fund.ts.v2] optional should 'forward' T's implicit conversions","2016-06 (Oulu)","|Nothing To Do|","","`#103379 `__","" +"`LWG2509 `__","[fund.ts.v2] any_cast doesn't work with rvalue reference targets and cannot move with a value target","2016-06 (Oulu)","|Complete|","","`#103380 `__","" +"`LWG2516 `__","[fund.ts.v2] Public ""exposition only"" members in observer_ptr","2016-06 (Oulu)","|Complete|","18","`#103381 `__","" +"`LWG2542 `__","Missing const requirements for associative containers","2016-06 (Oulu)","","","`#99960 `__","" +"`LWG2549 `__","Tuple EXPLICIT constructor templates that take tuple parameters end up taking references to temporaries and will create dangling references","2016-06 (Oulu)","|Complete|","","`#103382 `__","" +"`LWG2550 `__","Wording of unordered container's clear() method complexity","2016-06 (Oulu)","|Complete|","","`#103383 `__","" +"`LWG2551 `__","[fund.ts.v2] ""Exception safety"" cleanup in library fundamentals required","2016-06 (Oulu)","|Complete|","","`#103384 `__","" +"`LWG2555 `__","[fund.ts.v2] No handling for over-aligned types in optional","2016-06 (Oulu)","|Complete|","","`#103385 `__","" +"`LWG2573 `__","[fund.ts.v2] std::hash does not work for arrays","2016-06 (Oulu)","","","`#99961 `__","" +"`LWG2596 `__","vector::data() should use addressof","2016-06 (Oulu)","|Complete|","","`#103386 `__","" +"`LWG2667 `__","path::root_directory() description is confusing","2016-06 (Oulu)","|Complete|","","`#103387 `__","" +"`LWG2669 `__","recursive_directory_iterator effects refers to non-existent functions","2016-06 (Oulu)","|Complete|","","`#103402 `__","" +"`LWG2670 `__","system_complete refers to undefined variable 'base'","2016-06 (Oulu)","|Complete|","","`#103404 `__","" +"`LWG2671 `__","Errors in Copy","2016-06 (Oulu)","|Complete|","","`#103405 `__","" +"`LWG2673 `__","status() effects cannot be implemented as specified","2016-06 (Oulu)","|Complete|","","`#103406 `__","" +"`LWG2674 `__","Bidirectional iterator requirement on path::iterator is very expensive","2016-06 (Oulu)","|Complete|","","`#103407 `__","" +"`LWG2683 `__","filesystem::copy() says ""no effects""","2016-06 (Oulu)","|Complete|","","`#103408 `__","" +"`LWG2684 `__","priority_queue lacking comparator typedef","2016-06 (Oulu)","|Complete|","","`#103412 `__","" +"`LWG2685 `__","shared_ptr deleters must not throw on move construction","2016-06 (Oulu)","|Complete|","","`#103413 `__","" +"`LWG2687 `__","{inclusive,exclusive}_scan misspecified","2016-06 (Oulu)","|Complete|","","`#99963 `__","" +"`LWG2688 `__","clamp misses preconditions and has extraneous condition on result","2016-06 (Oulu)","|Complete|","","`#103414 `__","" +"`LWG2689 `__","Parallel versions of std::copy and std::move shouldn't be in order","2016-06 (Oulu)","|Nothing To Do|","","`#103415 `__","" +"`LWG2698 `__","Effect of assign() on iterators/pointers/references","2016-06 (Oulu)","|Complete|","","`#103416 `__","" +"`LWG2704 `__","recursive_directory_iterator's members should require '``*this`` is dereferenceable'","2016-06 (Oulu)","|Complete|","","`#103417 `__","" +"`LWG2706 `__","Error reporting for recursive_directory_iterator::pop() is under-specified","2016-06 (Oulu)","|Complete|","","`#103418 `__","" +"`LWG2707 `__","path construction and assignment should have ""string_type&&"" overloads","2016-06 (Oulu)","|Complete|","","`#103419 `__","" +"`LWG2709 `__","offsetof is unnecessarily imprecise","2016-06 (Oulu)","|Nothing To Do|","","`#99965 `__","" +"`LWG2710 `__","""Effects: Equivalent to ..."" doesn't count ""Synchronization:"" as determined semantics","2016-06 (Oulu)","|Complete|","","`#103420 `__","" +"`LWG2711 `__","path is convertible from approximately everything under the sun","2016-06 (Oulu)","|Complete|","","`#103421 `__","" +"`LWG2716 `__","Specification of shuffle and sample disallows lvalue URNGs","2016-06 (Oulu)","|Complete|","","`#103422 `__","" +"`LWG2718 `__","Parallelism bug in [algorithms.parallel.exec] p2","2016-06 (Oulu)","","","`#99966 `__","" +"`LWG2719 `__","permissions function should not be noexcept due to narrow contract","2016-06 (Oulu)","|Complete|","","`#103423 `__","" +"`LWG2720 `__","permissions function incorrectly specified for symlinks","2016-06 (Oulu)","|Complete|","","`#103424 `__","" +"`LWG2721 `__","remove_all has incorrect post conditions","2016-06 (Oulu)","|Complete|","","`#103425 `__","" +"`LWG2723 `__","Do directory_iterator and recursive_directory_iterator become the end iterator upon error?","2016-06 (Oulu)","|Complete|","","`#103426 `__","" +"`LWG2724 `__","The protected virtual member functions of memory_resource should be private","2016-06 (Oulu)","|Complete|","16","`#103427 `__","" +"`LWG2725 `__","filesystem::exists(const path&, error_code&) error reporting","2016-06 (Oulu)","|Complete|","","`#103428 `__","" +"`LWG2726 `__","``[recursive_]directory_iterator::increment(error_code&)`` is underspecified","2016-06 (Oulu)","|Complete|","","`#103429 `__","" +"`LWG2727 `__","Parallel algorithms with constexpr specifier","2016-06 (Oulu)","","","`#99968 `__","" +"`LWG2728 `__","status(p).permissions() and symlink_status(p).permissions() are not specified","2016-06 (Oulu)","|Complete|","","`#103430 `__","" +"","","","","","","" +"`LWG2062 `__","Effect contradictions w/o no-throw guarantee of std::function swaps","2016-11 (Issaquah)","|Complete|","","`#103431 `__","" +"`LWG2166 `__","Heap property underspecified?","2016-11 (Issaquah)","","","`#99969 `__","" +"`LWG2221 `__","No formatted output operator for nullptr","2016-11 (Issaquah)","|Complete|","","`#103432 `__","" +"`LWG2223 `__","shrink_to_fit effect on iterator validity","2016-11 (Issaquah)","|Complete|","","`#103433 `__","" +"`LWG2261 `__","Are containers required to use their 'pointer' type internally?","2016-11 (Issaquah)","","","`#99970 `__","" +"`LWG2394 `__","locale::name specification unclear - what is implementation-defined?","2016-11 (Issaquah)","|Complete|","","`#103434 `__","" +"`LWG2460 `__","LWG issue 2408 and value categories","2016-11 (Issaquah)","|Complete|","","`#103435 `__","" +"`LWG2468 `__","Self-move-assignment of library types","2016-11 (Issaquah)","","","`#99971 `__","" +"`LWG2475 `__","Allow overwriting of std::basic_string terminator with charT() to allow cleaner interoperation with legacy APIs","2016-11 (Issaquah)","|Complete|","","`#103436 `__","" +"`LWG2503 `__","multiline option should be added to syntax_option_type","2016-11 (Issaquah)","|Complete|","","`#103437 `__","" +"`LWG2510 `__","Tag types should not be DefaultConstructible","2016-11 (Issaquah)","|Complete|","","`#103438 `__","" +"`LWG2514 `__","Type traits must not be final","2016-11 (Issaquah)","|Complete|","","`#103439 `__","" +"`LWG2518 `__","[fund.ts.v2] Non-member swap for propagate_const should call member swap","2016-11 (Issaquah)","|Complete|","","`#103440 `__","" +"`LWG2519 `__","Iterator operator-= has gratuitous undefined behaviour","2016-11 (Issaquah)","|Complete|","","`#103442 `__","" +"`LWG2521 `__","[fund.ts.v2] weak_ptr's converting move constructor should be modified as well for array support","2016-11 (Issaquah)","","","`#99972 `__","" +"`LWG2525 `__","[fund.ts.v2] get_memory_resource should be const and noexcept","2016-11 (Issaquah)","","","`#99973 `__","" +"`LWG2527 `__","[fund.ts.v2] ALLOCATOR_OF for function::operator= has incorrect default","2016-11 (Issaquah)","","","`#99974 `__","" +"`LWG2531 `__","future::get should explicitly state that the shared state is released","2016-11 (Issaquah)","|Nothing To Do|","","`#103443 `__","" +"`LWG2534 `__","Constrain rvalue stream operators","2016-11 (Issaquah)","|Complete|","","`#103444 `__","" +"`LWG2536 `__","What should do?","2016-11 (Issaquah)","|Complete|","","`#103448 `__","" +"`LWG2540 `__","unordered_multimap::insert hint iterator","2016-11 (Issaquah)","|Complete|","","`#103449 `__","" +"`LWG2543 `__","LWG 2148 (hash support for enum types) seems under-specified","2016-11 (Issaquah)","|Complete|","","`#103450 `__","" +"`LWG2544 `__","``istreambuf_iterator(basic_streambuf* s)``\ effects unclear when s is 0","2016-11 (Issaquah)","|Complete|","","`#103452 `__","" +"`LWG2556 `__","Wide contract for future::share()","2016-11 (Issaquah)","|Complete|","","`#103453 `__","" +"`LWG2562 `__","Consistent total ordering of pointers by comparison functors","2016-11 (Issaquah)","","","`#99975 `__","" +"`LWG2567 `__","Specification of logical operator traits uses BaseCharacteristic, which is defined only for UnaryTypeTraits and BinaryTypeTraits","2016-11 (Issaquah)","|Complete|","","`#103454 `__","" +"`LWG2568 `__","[fund.ts.v2] Specification of logical operator traits uses BaseCharacteristic, which is defined only for UnaryTypeTraits and BinaryTypeTraits","2016-11 (Issaquah)","|Complete|","15","`#103455 `__","" +"`LWG2569 `__","conjunction and disjunction requirements are too strict","2016-11 (Issaquah)","|Complete|","15","`#103456 `__","" +"`LWG2570 `__","[fund.ts.v2] conjunction and disjunction requirements are too strict","2016-11 (Issaquah)","","","`#99977 `__","" +"`LWG2578 `__","Iterator requirements should reference iterator traits","2016-11 (Issaquah)","|Complete|","","`#103457 `__","" +"`LWG2584 `__"," ECMAScript IdentityEscape is ambiguous","2016-11 (Issaquah)","","","`#99976 `__","" +"`LWG2587 `__","""Convertible to bool"" requirement in conjunction and disjunction","2016-11 (Issaquah)","|Nothing To Do|","","`#103460 `__","Resolved by `LWG2567 `__" +"`LWG2588 `__","[fund.ts.v2] ""Convertible to bool"" requirement in conjunction and disjunction","2016-11 (Issaquah)","|Nothing To Do|","","`#103461 `__","Resolved by `LWG2568 `__" +"`LWG2589 `__","match_results can't satisfy the requirements of a container","2016-11 (Issaquah)","|Complete|","","`#103462 `__","" +"`LWG2591 `__","std::function's member template target() should not lead to undefined behaviour","2016-11 (Issaquah)","|Complete|","","`#103463 `__","" +"`LWG2598 `__","addressof works on temporaries","2016-11 (Issaquah)","|Complete|","","`#103464 `__","" +"`LWG2664 `__","operator/ (and other append) semantics not useful if argument has root","2016-11 (Issaquah)","|Complete|","","`#103465 `__","" +"`LWG2665 `__","remove_filename() post condition is incorrect","2016-11 (Issaquah)","|Complete|","","`#103466 `__","" +"`LWG2672 `__","Should ``is_empty``\ use error_code in its specification?","2016-11 (Issaquah)","|Complete|","","`#103467 `__","" +"`LWG2678 `__","std::filesystem enum classes overspecified","2016-11 (Issaquah)","|Complete|","","`#103468 `__","" +"`LWG2679 `__","Inconsistent Use of Effects and Equivalent To","2016-11 (Issaquah)","|Complete|","","`#103469 `__","" +"`LWG2680 `__","Add ""Equivalent to"" to filesystem","2016-11 (Issaquah)","|Complete|","","`#103470 `__","" +"`LWG2681 `__","filesystem::copy() cannot copy symlinks","2016-11 (Issaquah)","|Complete|","","`#103472 `__","" +"`LWG2686 `__","Why is std::hash specialized for error_code, but not error_condition?","2016-11 (Issaquah)","|Complete|","","`#103505 `__","" +"`LWG2694 `__","Application of LWG 436 accidentally deleted definition of ""facet""","2016-11 (Issaquah)","|Complete|","","`#103506 `__","" +"`LWG2696 `__","Interaction between make_shared and enable_shared_from_this is underspecified","2016-11 (Issaquah)","|Nothing To Do|","","`#103507 `__","" +"`LWG2699 `__","Missing restriction in [numeric.requirements]","2016-11 (Issaquah)","|Complete|","","`#103508 `__","" +"`LWG2712 `__","copy_file(from, to, ...) has a number of unspecified error conditions","2016-11 (Issaquah)","|Complete|","","`#103509 `__","" +"`LWG2722 `__","equivalent incorrectly specifies throws clause","2016-11 (Issaquah)","|Complete|","","`#103510 `__","" +"`LWG2729 `__","Missing SFINAE on std::pair::operator=","2016-11 (Issaquah)","|Complete|","","`#103512 `__","" +"`LWG2732 `__","Questionable specification of path::operator/= and path::append","2016-11 (Issaquah)","|Complete|","","`#103513 `__","" +"`LWG2733 `__","[fund.ts.v2] gcd / lcm and bool","2016-11 (Issaquah)","|Complete|","","`#103514 `__","" +"`LWG2735 `__","std::abs(short), std::abs(signed char) and others should return int instead of double in order to be compatible with C++98 and C","2016-11 (Issaquah)","|Complete|","","`#103515 `__","" +"`LWG2736 `__","nullopt_t insufficiently constrained","2016-11 (Issaquah)","|Complete|","","`#103516 `__","" +"`LWG2738 `__","``is_constructible``\ with void types","2016-11 (Issaquah)","|Complete|","","`#103517 `__","" +"`LWG2739 `__","Issue with time_point non-member subtraction with an unsigned duration","2016-11 (Issaquah)","|Complete|","","`#103518 `__","" +"`LWG2740 `__","constexpr optional::operator->","2016-11 (Issaquah)","|Complete|","","`#103520 `__","" +"`LWG2742 `__","Inconsistent string interface taking string_view","2016-11 (Issaquah)","|Complete|","","`#103521 `__","" +"`LWG2744 `__","any's in_place constructors","2016-11 (Issaquah)","|Complete|","","`#103522 `__","" +"`LWG2745 `__","[fund.ts.v2] Implementability of LWG 2451","2016-11 (Issaquah)","|Complete|","","`#103523 `__","" +"`LWG2747 `__","Possibly redundant std::move in [alg.foreach]","2016-11 (Issaquah)","|Complete|","","`#103524 `__","" +"`LWG2748 `__","swappable traits for optionals","2016-11 (Issaquah)","|Complete|","","`#103525 `__","" +"`LWG2749 `__","swappable traits for variants","2016-11 (Issaquah)","|Complete|","","`#103526 `__","" +"`LWG2750 `__","[fund.ts.v2] LWG 2451 conversion constructor constraint","2016-11 (Issaquah)","|Nothing To Do|","","`#103527 `__","" +"`LWG2752 `__","""Throws:"" clauses of async and packaged_task are unimplementable","2016-11 (Issaquah)","|Nothing To Do|","","`#103528 `__","" +"`LWG2755 `__","[string.view.io] uses non-existent basic_string_view::to_string function","2016-11 (Issaquah)","|Complete|","","`#103531 `__","" +"`LWG2756 `__","C++ WP optional should 'forward' T's implicit conversions","2016-11 (Issaquah)","|Complete|","","`#103532 `__","" +"`LWG2758 `__","std::string{}.assign(""ABCDE"", 0, 1) is ambiguous","2016-11 (Issaquah)","|Complete|","","`#103533 `__","" +"`LWG2759 `__","gcd / lcm and bool for the WP","2016-11 (Issaquah)","|Complete|","","`#103534 `__","" +"`LWG2760 `__","non-const basic_string::data should not invalidate iterators","2016-11 (Issaquah)","|Complete|","","`#103535 `__","" +"`LWG2765 `__","Did LWG 1123 go too far?","2016-11 (Issaquah)","|Complete|","","`#103536 `__","" +"`LWG2767 `__","not_fn call_wrapper can form invalid types","2016-11 (Issaquah)","|Complete|","","`#103537 `__","" +"`LWG2770 `__","``tuple_size`` specialization is not SFINAE compatible and breaks decomposition declarations","2016-11 (Issaquah)","|Complete|","21","`#148254 `__","" +"`LWG2771 `__","Broken Effects of some basic_string::compare functions in terms of basic_string_view","2016-11 (Issaquah)","|Complete|","","`#103539 `__","" +"`LWG2773 `__","Making std::ignore constexpr","2016-11 (Issaquah)","|Complete|","","`#103541 `__","" +"`LWG2777 `__","basic_string_view::copy should use char_traits::copy","2016-11 (Issaquah)","|Complete|","","`#103542 `__","" +"`LWG2778 `__","basic_string_view is missing constexpr","2016-11 (Issaquah)","|Complete|","","`#103543 `__","" +"","","","","","","" +"`LWG2260 `__","Missing requirement for Allocator::pointer","2017-02 (Kona)","|Complete|","","`#103544 `__","" +"`LWG2676 `__","Provide filesystem::path overloads for File-based streams","2017-02 (Kona)","|Complete|","","`#103545 `__","" +"`LWG2768 `__","any_cast and move semantics","2017-02 (Kona)","|Complete|","","`#103546 `__","" +"`LWG2769 `__","Redundant const in the return type of any_cast(const any&)","2017-02 (Kona)","|Complete|","","`#103538 `__","" +"`LWG2781 `__","Contradictory requirements for std::function and std::reference_wrapper","2017-02 (Kona)","|Complete|","","`#103548 `__","" +"`LWG2782 `__","scoped_allocator_adaptor constructors must be constrained","2017-02 (Kona)","|Complete|","","`#103549 `__","" +"`LWG2784 `__","Resolution to LWG 2484 is missing ""otherwise, no effects"" and is hard to parse","2017-02 (Kona)","|Complete|","","`#103550 `__","" +"`LWG2785 `__","quoted should work with basic_string_view","2017-02 (Kona)","|Complete|","","`#103553 `__","" +"`LWG2786 `__","Annex C should mention shared_ptr changes for array support","2017-02 (Kona)","|Complete|","","`#103554 `__","" +"`LWG2787 `__","|sect|\ [file_status.cons] doesn't match class definition","2017-02 (Kona)","|Complete|","","`#103555 `__","" +"`LWG2788 `__","basic_string range mutators unintentionally require a default constructible allocator","2017-02 (Kona)","|Complete|","","`#103556 `__","" +"`LWG2789 `__","Equivalence of contained objects","2017-02 (Kona)","|Complete|","","`#103557 `__","" +"`LWG2790 `__","Missing specification of istreambuf_iterator::operator->","2017-02 (Kona)","|Complete|","","`#103558 `__","" +"`LWG2794 `__","Missing requirements for allocator pointers","2017-02 (Kona)","|Nothing To Do|","","`#103559 `__","" +"`LWG2795 `__","|sect|\ [global.functions] provides incorrect example of ADL use","2017-02 (Kona)","|Complete|","","`#103560 `__","" +"`LWG2796 `__","tuple should be a literal type","2017-02 (Kona)","|Complete|","","`#103561 `__","" +"`LWG2801 `__","Default-constructibility of unique_ptr","2017-02 (Kona)","|Complete|","","`#103562 `__","" +"`LWG2802 `__","shared_ptr constructor requirements for a deleter","2017-02 (Kona)","|Complete|","","`#103563 `__","" +"`LWG2804 `__","Unconditional constexpr default constructor for istream_iterator","2017-02 (Kona)","|Complete|","","`#103565 `__","" +"`LWG2806 `__","Base class of bad_optional_access","2017-02 (Kona)","|Complete|","","`#103566 `__","" +"`LWG2807 `__","std::invoke should use ``std::is_nothrow_callable``\ ","2017-02 (Kona)","|Complete|","","`#103567 `__","" +"`LWG2812 `__","Range access is available with ","2017-02 (Kona)","|Complete|","","`#103568 `__","" +"`LWG2824 `__","list::sort should say that the order of elements is unspecified if an exception is thrown","2017-02 (Kona)","|Complete|","","`#103569 `__","" +"`LWG2826 `__","string_view iterators use old wording","2017-02 (Kona)","|Complete|","","`#103570 `__","" +"`LWG2834 `__","Resolution LWG 2223 is missing wording about end iterators","2017-02 (Kona)","|Complete|","","`#103571 `__","" +"`LWG2835 `__","LWG 2536 seems to misspecify ","2017-02 (Kona)","|Complete|","","`#103572 `__","" +"`LWG2837 `__","gcd and lcm should support a wider range of input values","2017-02 (Kona)","|Complete|","","`#103573 `__","" +"`LWG2838 `__","is_literal_type specification needs a little cleanup","2017-02 (Kona)","|Complete|","","`#103574 `__","" +"`LWG2842 `__","in_place_t check for optional::optional(U&&) should decay U","2017-02 (Kona)","|Complete|","","`#103575 `__","" +"`LWG2850 `__","std::function move constructor does unnecessary work","2017-02 (Kona)","|Complete|","","`#103576 `__","" +"`LWG2853 `__","Possible inconsistency in specification of erase in [vector.modifiers]","2017-02 (Kona)","|Complete|","","`#103577 `__","" +"`LWG2855 `__","std::throw_with_nested(""string_literal"")","2017-02 (Kona)","|Complete|","","`#103578 `__","" +"`LWG2857 `__","{variant,optional,any}::emplace should return the constructed value","2017-02 (Kona)","|Complete|","","`#103579 `__","" +"`LWG2861 `__","basic_string should require that charT match traits::char_type","2017-02 (Kona)","|Complete|","","`#103580 `__","" +"`LWG2866 `__","Incorrect derived classes constraints","2017-02 (Kona)","|Nothing To Do|","","`#103581 `__","" +"`LWG2868 `__","Missing specification of bad_any_cast::what()","2017-02 (Kona)","|Complete|","","`#103582 `__","" +"`LWG2872 `__","Add definition for direct-non-list-initialization","2017-02 (Kona)","|Complete|","","`#103583 `__","" +"`LWG2873 `__","Add noexcept to several shared_ptr related functions","2017-02 (Kona)","|Complete|","","`#103584 `__","" +"`LWG2874 `__","Constructor ``shared_ptr::shared_ptr(Y*)``\ should be constrained","2017-02 (Kona)","|Complete|","13","`#103585 `__","" +"`LWG2875 `__","shared_ptr::shared_ptr(Y\*, D, [|hellip|\ ]) constructors should be constrained","2017-02 (Kona)","|Complete|","","`#103586 `__","" +"`LWG2876 `__","``shared_ptr::shared_ptr(const weak_ptr&)``\ constructor should be constrained","2017-02 (Kona)","|Complete|","14","`#103587 `__","" +"`LWG2878 `__","Missing DefaultConstructible requirement for istream_iterator default constructor","2017-02 (Kona)","|Complete|","","`#103588 `__","" +"`LWG2890 `__","The definition of 'object state' applies only to class types","2017-02 (Kona)","|Complete|","","`#103589 `__","" +"`LWG2900 `__","The copy and move constructors of optional are not constexpr","2017-02 (Kona)","|Complete|","","`#103591 `__","" +"`LWG2903 `__","The form of initialization for the emplace-constructors is not specified","2017-02 (Kona)","|Complete|","","`#103593 `__","" +"`LWG2904 `__","Make variant move-assignment more exception safe","2017-02 (Kona)","|Complete|","","`#103594 `__","" +"`LWG2905 `__","is_constructible_v, P, D const &> should be false when D is not copy constructible","2017-02 (Kona)","|Complete|","","`#103595 `__","" +"`LWG2908 `__","The less-than operator for shared pointers could do more","2017-02 (Kona)","|Complete|","","`#103596 `__","" +"`LWG2911 `__","An is_aggregate type trait is needed","2017-02 (Kona)","|Complete|","","`#103597 `__","" +"`LWG2921 `__","packaged_task and type-erased allocators","2017-02 (Kona)","|Complete|","20","`#103598 `__","Originally implemented in LLVM 6 but reverted later. Old documentation incorrectly said it was implemented." +"`LWG2934 `__","optional doesn't compare with T","2017-02 (Kona)","|Complete|","","`#103599 `__","" +"","","","","","","" +"`LWG2901 `__","Variants cannot properly support allocators","2017-07 (Toronto)","|Complete|","","`#103600 `__","" +"`LWG2955 `__","``to_chars / from_chars``\ depend on ``std::string``\ ","2017-07 (Toronto)","|Nothing To Do|","","`#103601 `__","Resolved by `P0682R1 `__" +"`LWG2956 `__","``filesystem::canonical()``\ still defined in terms of ``absolute(p, base)``\ ","2017-07 (Toronto)","|Complete|","","`#103602 `__","" diff --git a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx17Papers.csv b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx17Papers.csv index 24fc7f718c..1a9d3b08f3 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx17Papers.csv +++ b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx17Papers.csv @@ -1,113 +1,113 @@ -"Paper #","Paper Name","Meeting","Status","First released version","Notes" -"`N3911 `__","TransformationTrait Alias ``void_t``\ .","2014-11 (Urbana)","|Complete|","3.6","" -"`N4089 `__","Safe conversions in ``unique_ptr``\ .","2014-11 (Urbana)","|Complete|","5","" -"`N4169 `__","A proposal to add invoke function template","2014-11 (Urbana)","|Complete|","3.7","" -"`N4190 `__","Removing auto_ptr, random_shuffle(), And Old Stuff.","2014-11 (Urbana)","|Complete|","15","" -"`N4258 `__","Cleaning-up noexcept in the Library.","2014-11 (Urbana)","|Complete|","21","" -"`N4259 `__","Wording for std::uncaught_exceptions","2014-11 (Urbana)","|Complete|","3.7","``std::uncaught_exception`` is deprecated since LLVM 20" -"`N4277 `__","TriviallyCopyable ``reference_wrapper``\ .","2014-11 (Urbana)","|Complete|","3.2","" -"`N4279 `__","Improved insertion interface for unique-key maps.","2014-11 (Urbana)","|Complete|","3.7","" -"`N4280 `__","Non-member size() and more","2014-11 (Urbana)","|Complete|","3.6","" -"`N4284 `__","Contiguous Iterators.","2014-11 (Urbana)","|Complete|","3.6","" -"`N4285 `__","Cleanup for exception-specification and throw-expression.","2014-11 (Urbana)","|Complete|","4","" -"","","","","","" -"`N4387 `__","improving pair and tuple","2015-05 (Lenexa)","|Complete|","4","" -"`N4389 `__","bool_constant","2015-05 (Lenexa)","|Complete|","3.7","" -"`N4508 `__","shared_mutex for C++17","2015-05 (Lenexa)","|Complete|","3.7","" -"`N4366 `__","LWG 2228 missing SFINAE rule","2015-05 (Lenexa)","|Complete|","3.1","" -"`N4510 `__","Minimal incomplete type support for standard containers, revision 4","2015-05 (Lenexa)","|Complete|","3.6","" -"","","","","","" -"`P0004R1 `__","Remove Deprecated iostreams aliases.","2015-10 (Kona)","|Complete|","3.8","" -"`P0006R0 `__","Adopt Type Traits Variable Templates for C++17.","2015-10 (Kona)","|Complete|","3.8","" -"`P0092R1 `__","Polishing ","2015-10 (Kona)","|Complete|","3.8","" -"`P0007R1 `__","Constant View: A proposal for a ``std::as_const``\ helper function template.","2015-10 (Kona)","|Complete|","3.8","" -"`P0156R0 `__","Variadic lock_guard(rev 3).","2015-10 (Kona)","|Nothing To Do|","","Pulled at the 2017-01 meeting in Kona" -"`P0074R0 `__","Making ``std::owner_less``\ more flexible","2015-10 (Kona)","|Complete|","3.8","" -"`P0013R1 `__","Logical type traits rev 2","2015-10 (Kona)","|Complete|","3.8","" -"","","","","","" -"`P0024R2 `__","The Parallelism TS Should be Standardized","2016-02 (Jacksonville)","|Partial|","","" -"`P0226R1 `__","Mathematical Special Functions for C++17","2016-02 (Jacksonville)","|In Progress|","","Progress is tracked `here `__" -"`P0220R1 `__","Adopt Library Fundamentals V1 TS Components for C++17","2016-02 (Jacksonville)","|Complete|","16","" -"`P0218R1 `__","Adopt the File System TS for C++17","2016-02 (Jacksonville)","|Complete|","7","" -"`P0033R1 `__","Re-enabling shared_from_this","2016-02 (Jacksonville)","|Complete|","3.9","" -"`P0005R4 `__","Adopt not_fn from Library Fundamentals 2 for C++17","2016-02 (Jacksonville)","|Complete|","3.9","" -"`P0152R1 `__","constexpr ``atomic::is_always_lock_free``\ ","2016-02 (Jacksonville)","|Complete|","3.9","" -"`P0185R1 `__","Adding [nothrow-]swappable traits","2016-02 (Jacksonville)","|Complete|","3.9","" -"`P0253R1 `__","Fixing a design mistake in the searchers interface","2016-02 (Jacksonville)","|Complete|","3.9","" -"`P0025R0 `__","An algorithm to ""clamp"" a value between a pair of boundary values","2016-02 (Jacksonville)","|Complete|","3.9","" -"`P0154R1 `__","constexpr std::hardware_{constructive,destructive}_interference_size","2016-02 (Jacksonville)","|Complete|","19","The required macros are only implemented as of LLVM 19." -"`P0030R1 `__","Proposal to Introduce a 3-Argument Overload to std::hypot","2016-02 (Jacksonville)","|Complete|","3.9","" -"`P0031R0 `__","A Proposal to Add Constexpr Modifiers to reverse_iterator, move_iterator, array and Range Access","2016-02 (Jacksonville)","|Complete|","4","" -"`P0272R1 `__","Give ``std::string``\ a non-const ``.data()``\ member function","2016-02 (Jacksonville)","|Complete|","3.9","" -"`P0077R2 `__","``is_callable``\ , the missing INVOKE related trait","2016-02 (Jacksonville)","|Complete|","3.9","" -"","","","","","" -"`P0032R3 `__","Homogeneous interface for variant, any and optional","2016-06 (Oulu)","|Complete|","4","" -"`P0040R3 `__","Extending memory management tools","2016-06 (Oulu)","|Complete|","4","" -"`P0063R3 `__","C++17 should refer to C11 instead of C99","2016-06 (Oulu)","|Complete|","7","" -"`P0067R3 `__","Elementary string conversions","2016-06 (Oulu)","|Nothing To Do|","n/a","Resolved by `P0067R5 `__" -"`P0083R3 `__","Splicing Maps and Sets","2016-06 (Oulu)","|Complete|","8","" -"`P0084R2 `__","Emplace Return Type","2016-06 (Oulu)","|Complete|","4","" -"`P0088R3 `__","Variant: a type-safe union for C++17","2016-06 (Oulu)","|Complete|","4","" -"`P0137R1 `__","Core Issue 1776: Replacement of class objects containing reference members","2016-06 (Oulu)","|Complete|","6","" -"`P0163R0 `__","shared_ptr::weak_type","2016-06 (Oulu)","|Complete|","3.9","" -"`P0174R2 `__","Deprecating Vestigial Library Parts in C++17","2016-06 (Oulu)","|Complete|","15","" -"`P0175R1 `__","Synopses for the C library","2016-06 (Oulu)","|Nothing To Do|","n/a","" -"`P0180R2 `__","Reserve a New Library Namespace for Future Standardization","2016-06 (Oulu)","|Nothing To Do|","n/a","" -"`P0181R1 `__","Ordered by Default","2016-06 (Oulu)","|Nothing To Do|","n/a","Pulled at the 2017-01 meeting in Kona" -"`P0209R2 `__","make_from_tuple: apply for construction","2016-06 (Oulu)","|Complete|","3.9","" -"`P0219R1 `__","Relative Paths for Filesystem","2016-06 (Oulu)","|Complete|","7","" -"`P0254R2 `__","Integrating std::string_view and std::string","2016-06 (Oulu)","|Complete|","4","" -"`P0258R2 `__","has_unique_object_representations","2016-06 (Oulu)","|Complete|","6","" -"`P0295R0 `__","Adopt Selected Library Fundamentals V2 Components for C++17","2016-06 (Oulu)","|Complete|","4","" -"`P0302R1 `__","Removing Allocator Support in std::function","2016-06 (Oulu)","|Complete|","4","" -"`P0307R2 `__","Making Optional Greater Equal Again","2016-06 (Oulu)","|Complete|","4","" -"`P0336R1 `__","Better Names for Parallel Execution Policies in C++17","2016-06 (Oulu)","|Complete|","17","" -"`P0337R0 `__","Delete ``operator=``\ for polymorphic_allocator","2016-06 (Oulu)","|Complete|","3.9","" -"`P0346R1 `__","A Nomenclature Tweak","2016-06 (Oulu)","|Complete|","3.9","" -"`P0358R1 `__","Fixes for not_fn","2016-06 (Oulu)","|Complete|","3.9","" -"`P0371R1 `__","Temporarily discourage memory_order_consume","2016-06 (Oulu)","|Nothing To Do|","n/a","" -"`P0392R0 `__","Adapting string_view by filesystem paths","2016-06 (Oulu)","|Complete|","4","" -"`P0393R3 `__","Making Variant Greater Equal","2016-06 (Oulu)","|Complete|","4","" -"`P0394R4 `__","Hotel Parallelifornia: terminate() for Parallel Algorithms Exception Handling","2016-06 (Oulu)","|Complete|","17","" -"","","","","","" -"`P0003R5 `__","Removing Deprecated Exception Specifications from C++17","2016-11 (Issaquah)","|Complete|","5","" -"`P0067R5 `__","Elementary string conversions, revision 5","2016-11 (Issaquah)","|Partial|","","For integer types, ``std::(to|from)_chars`` has been available since v7; for ``float`` and ``double``, ``std::to_chars`` since v14 and ``std::from_chars`` since v20. Support is complete except for ``long double``." -"`P0403R1 `__","Literal suffixes for ``basic_string_view``\ ","2016-11 (Issaquah)","|Complete|","4","" -"`P0414R2 `__","Merging shared_ptr changes from Library Fundamentals to C++17","2016-11 (Issaquah)","|Complete|","11","" -"`P0418R2 `__","Fail or succeed: there is no atomic lattice","2016-11 (Issaquah)","","","" -"`P0426R1 `__","Constexpr for ``std::char_traits``\ ","2016-11 (Issaquah)","|Complete|","4","" -"`P0435R1 `__","Resolving LWG Issues re ``common_type``\ ","2016-11 (Issaquah)","|Complete|","4","" -"`P0502R0 `__","Throwing out of a parallel algorithm terminates - but how?","2016-11 (Issaquah)","","","" -"`P0503R0 `__","Correcting library usage of ""literal type""","2016-11 (Issaquah)","|Complete|","4","" -"`P0504R0 `__","Revisiting in-place tag types for any/optional/variant","2016-11 (Issaquah)","|Complete|","4","" -"`P0505R0 `__","Wording for GB 50 - constexpr for chrono","2016-11 (Issaquah)","|Complete|","4","" -"`P0508R0 `__","Wording for GB 58 - structured bindings for node_handles","2016-11 (Issaquah)","|Complete|","7","" -"`P0509R1 `__","Updating ""Restrictions on exception handling""","2016-11 (Issaquah)","|Nothing To Do|","n/a","" -"`P0510R0 `__","Disallowing references, incomplete types, arrays, and empty variants","2016-11 (Issaquah)","|Complete|","4","" -"`P0513R0 `__","Poisoning the Hash","2016-11 (Issaquah)","|Complete|","5","" -"`P0516R0 `__","Clarify That shared_future's Copy Operations have Wide Contracts","2016-11 (Issaquah)","|Complete|","4","" -"`P0517R0 `__","Make future_error Constructible","2016-11 (Issaquah)","|Complete|","4","" -"`P0521R0 `__","Proposed Resolution for CA 14 (shared_ptr use_count/unique)","2016-11 (Issaquah)","|Complete|","18","" -"","","","","","" -"`P0156R2 `__","Variadic Lock guard(rev 5)","2017-02 (Kona)","|Complete|","5","" -"`P0270R3 `__","Removing C dependencies from signal handler wording","2017-02 (Kona)","|Nothing To Do|","","" -"`P0298R3 `__","A byte type definition","2017-02 (Kona)","|Complete|","5","" -"`P0317R1 `__","Directory Entry Caching for Filesystem","2017-02 (Kona)","|Complete|","7","" -"`P0430R2 `__","File system library on non-POSIX-like operating systems","2017-02 (Kona)","|Complete|","7","" -"`P0433R2 `__","Toward a resolution of US7 and US14: Integrating template deduction for class templates into the standard library","2017-02 (Kona)","|Complete|","14","" -"`P0452R1 `__","Unifying Parallel Algorithms","2017-02 (Kona)","|Partial|","","The changes to ``std::transform_inclusive_scan`` and ``std::transform_exclusive_scan`` have not yet been implemented." -"`P0467R2 `__","Iterator Concerns for Parallel Algorithms","2017-02 (Kona)","|Partial|","","" -"`P0492R2 `__","Proposed Resolution of C++17 National Body Comments for Filesystems","2017-02 (Kona)","|Complete|","7","" -"`P0518R1 `__","Allowing copies as arguments to function objects given to parallel algorithms in response to CH11","2017-02 (Kona)","|Nothing To Do|","","" -"`P0523R1 `__","Wording for CH 10: Complexity of parallel algorithms","2017-02 (Kona)","|Nothing To Do|","","" -"`P0548R1 `__","common_type and duration","2017-02 (Kona)","|Complete|","5","" -"`P0558R1 `__","Resolving atomic named base class inconsistencies","2017-02 (Kona)","|Complete|","","" -"`P0574R1 `__","Algorithm Complexity Constraints and Parallel Overloads","2017-02 (Kona)","|Nothing To Do|","","" -"`P0599R1 `__","noexcept for hash functions","2017-02 (Kona)","|Complete|","5","" -"`P0604R0 `__","Resolving GB 55, US 84, US 85, US 86","2017-02 (Kona)","|Complete|","","" -"`P0607R0 `__","Inline Variables for the Standard Library","2017-02 (Kona)","|In Progress|","6","The parts of P0607 that are not done are the ```` bits" -"`P0618R0 `__","Deprecating ","2017-02 (Kona)","|Complete|","15","" -"`P0623R0 `__","Final C++17 Parallel Algorithms Fixes","2017-02 (Kona)","|Nothing To Do|","","" -"","","","","","" -"`P0682R1 `__","Repairing elementary string conversions","2017-07 (Toronto)","","","" -"`P0739R0 `__","Some improvements to class template argument deduction integration into the standard library","2017-07 (Toronto)","|Complete|","5","" +"Paper #","Paper Name","Meeting","Status","First released version","GitHub issue","Notes" +"`N3911 `__","TransformationTrait Alias ``void_t``\ .","2014-11 (Urbana)","|Complete|","3.6","`#103603 `__","" +"`N4089 `__","Safe conversions in ``unique_ptr``\ .","2014-11 (Urbana)","|Complete|","5","`#99936 `__","" +"`N4169 `__","A proposal to add invoke function template","2014-11 (Urbana)","|Complete|","3.7","`#103604 `__","" +"`N4190 `__","Removing auto_ptr, random_shuffle(), And Old Stuff.","2014-11 (Urbana)","|Complete|","15","`#103605 `__","" +"`N4258 `__","Cleaning-up noexcept in the Library.","2014-11 (Urbana)","|Complete|","21","`#99937 `__","" +"`N4259 `__","Wording for std::uncaught_exceptions","2014-11 (Urbana)","|Complete|","3.7","`#103606 `__","``std::uncaught_exception`` is deprecated since LLVM 20" +"`N4277 `__","TriviallyCopyable ``reference_wrapper``\ .","2014-11 (Urbana)","|Complete|","3.2","`#103608 `__","" +"`N4279 `__","Improved insertion interface for unique-key maps.","2014-11 (Urbana)","|Complete|","3.7","`#103609 `__","" +"`N4280 `__","Non-member size() and more","2014-11 (Urbana)","|Complete|","3.6","`#103610 `__","" +"`N4284 `__","Contiguous Iterators.","2014-11 (Urbana)","|Complete|","3.6","`#103611 `__","" +"`N4285 `__","Cleanup for exception-specification and throw-expression.","2014-11 (Urbana)","|Complete|","4","`#103612 `__","" +"","","","","","","" +"`N4387 `__","improving pair and tuple","2015-05 (Lenexa)","|Complete|","4","`#103613 `__","" +"`N4389 `__","bool_constant","2015-05 (Lenexa)","|Complete|","3.7","`#103614 `__","" +"`N4508 `__","shared_mutex for C++17","2015-05 (Lenexa)","|Complete|","3.7","`#103615 `__","" +"`N4366 `__","LWG 2228 missing SFINAE rule","2015-05 (Lenexa)","|Complete|","3.1","`#103616 `__","" +"`N4510 `__","Minimal incomplete type support for standard containers, revision 4","2015-05 (Lenexa)","|Complete|","3.6","`#103617 `__","" +"","","","","","","" +"`P0004R1 `__","Remove Deprecated iostreams aliases.","2015-10 (Kona)","|Complete|","3.8","`#103618 `__","" +"`P0006R0 `__","Adopt Type Traits Variable Templates for C++17.","2015-10 (Kona)","|Complete|","3.8","`#103619 `__","" +"`P0092R1 `__","Polishing ","2015-10 (Kona)","|Complete|","3.8","`#103620 `__","" +"`P0007R1 `__","Constant View: A proposal for a ``std::as_const``\ helper function template.","2015-10 (Kona)","|Complete|","3.8","`#103621 `__","" +"`P0156R0 `__","Variadic lock_guard(rev 3).","2015-10 (Kona)","|Nothing To Do|","","`#103622 `__","Pulled at the 2017-01 meeting in Kona" +"`P0074R0 `__","Making ``std::owner_less``\ more flexible","2015-10 (Kona)","|Complete|","3.8","`#103623 `__","" +"`P0013R1 `__","Logical type traits rev 2","2015-10 (Kona)","|Complete|","3.8","`#103624 `__","" +"","","","","","","" +"`P0024R2 `__","The Parallelism TS Should be Standardized","2016-02 (Jacksonville)","|Partial|","","`#99938 `__","" +"`P0226R1 `__","Mathematical Special Functions for C++17","2016-02 (Jacksonville)","|In Progress|","","`#99939 `__","Progress is tracked `here `__" +"`P0220R1 `__","Adopt Library Fundamentals V1 TS Components for C++17","2016-02 (Jacksonville)","|Complete|","16","`#103625 `__","" +"`P0218R1 `__","Adopt the File System TS for C++17","2016-02 (Jacksonville)","|Complete|","7","`#103626 `__","" +"`P0033R1 `__","Re-enabling shared_from_this","2016-02 (Jacksonville)","|Complete|","3.9","`#103627 `__","" +"`P0005R4 `__","Adopt not_fn from Library Fundamentals 2 for C++17","2016-02 (Jacksonville)","|Complete|","3.9","`#103629 `__","" +"`P0152R1 `__","constexpr ``atomic::is_always_lock_free``\ ","2016-02 (Jacksonville)","|Complete|","3.9","`#103630 `__","" +"`P0185R1 `__","Adding [nothrow-]swappable traits","2016-02 (Jacksonville)","|Complete|","3.9","`#103631 `__","" +"`P0253R1 `__","Fixing a design mistake in the searchers interface","2016-02 (Jacksonville)","|Complete|","3.9","`#103632 `__","" +"`P0025R0 `__","An algorithm to ""clamp"" a value between a pair of boundary values","2016-02 (Jacksonville)","|Complete|","3.9","`#103633 `__","" +"`P0154R1 `__","constexpr std::hardware_{constructive,destructive}_interference_size","2016-02 (Jacksonville)","|Complete|","19","`#103634 `__","The required macros are only implemented as of LLVM 19." +"`P0030R1 `__","Proposal to Introduce a 3-Argument Overload to std::hypot","2016-02 (Jacksonville)","|Complete|","3.9","`#103635 `__","" +"`P0031R0 `__","A Proposal to Add Constexpr Modifiers to reverse_iterator, move_iterator, array and Range Access","2016-02 (Jacksonville)","|Complete|","4","`#103636 `__","" +"`P0272R1 `__","Give ``std::string``\ a non-const ``.data()``\ member function","2016-02 (Jacksonville)","|Complete|","3.9","`#103637 `__","" +"`P0077R2 `__","``is_callable``\ , the missing INVOKE related trait","2016-02 (Jacksonville)","|Complete|","3.9","`#103638 `__","" +"","","","","","","" +"`P0032R3 `__","Homogeneous interface for variant, any and optional","2016-06 (Oulu)","|Complete|","4","`#103639 `__","" +"`P0040R3 `__","Extending memory management tools","2016-06 (Oulu)","|Complete|","4","`#103640 `__","" +"`P0063R3 `__","C++17 should refer to C11 instead of C99","2016-06 (Oulu)","|Complete|","7","`#103642 `__","" +"`P0067R3 `__","Elementary string conversions","2016-06 (Oulu)","|Nothing To Do|","n/a","`#103643 `__","Resolved by `P0067R5 `__" +"`P0083R3 `__","Splicing Maps and Sets","2016-06 (Oulu)","|Complete|","8","`#103645 `__","" +"`P0084R2 `__","Emplace Return Type","2016-06 (Oulu)","|Complete|","4","`#103646 `__","" +"`P0088R3 `__","Variant: a type-safe union for C++17","2016-06 (Oulu)","|Complete|","4","`#103647 `__","" +"`P0137R1 `__","Core Issue 1776: Replacement of class objects containing reference members","2016-06 (Oulu)","|Complete|","6","`#103648 `__","" +"`P0163R0 `__","shared_ptr::weak_type","2016-06 (Oulu)","|Complete|","3.9","`#103649 `__","" +"`P0174R2 `__","Deprecating Vestigial Library Parts in C++17","2016-06 (Oulu)","|Complete|","15","`#103650 `__","" +"`P0175R1 `__","Synopses for the C library","2016-06 (Oulu)","|Nothing To Do|","n/a","`#99941 `__","" +"`P0180R2 `__","Reserve a New Library Namespace for Future Standardization","2016-06 (Oulu)","|Nothing To Do|","n/a","`#103651 `__","" +"`P0181R1 `__","Ordered by Default","2016-06 (Oulu)","|Nothing To Do|","n/a","`#103652 `__","Pulled at the 2017-01 meeting in Kona" +"`P0209R2 `__","make_from_tuple: apply for construction","2016-06 (Oulu)","|Complete|","3.9","`#103653 `__","" +"`P0219R1 `__","Relative Paths for Filesystem","2016-06 (Oulu)","|Complete|","7","`#103654 `__","" +"`P0254R2 `__","Integrating std::string_view and std::string","2016-06 (Oulu)","|Complete|","4","`#103655 `__","" +"`P0258R2 `__","has_unique_object_representations","2016-06 (Oulu)","|Complete|","6","`#103656 `__","" +"`P0295R0 `__","Adopt Selected Library Fundamentals V2 Components for C++17","2016-06 (Oulu)","|Complete|","4","`#103657 `__","" +"`P0302R1 `__","Removing Allocator Support in std::function","2016-06 (Oulu)","|Complete|","4","`#103658 `__","" +"`P0307R2 `__","Making Optional Greater Equal Again","2016-06 (Oulu)","|Complete|","4","`#103659 `__","" +"`P0336R1 `__","Better Names for Parallel Execution Policies in C++17","2016-06 (Oulu)","|Complete|","17","`#103660 `__","" +"`P0337R0 `__","Delete ``operator=``\ for polymorphic_allocator","2016-06 (Oulu)","|Complete|","3.9","`#103661 `__","" +"`P0346R1 `__","A Nomenclature Tweak","2016-06 (Oulu)","|Complete|","3.9","`#103662 `__","" +"`P0358R1 `__","Fixes for not_fn","2016-06 (Oulu)","|Complete|","3.9","`#103663 `__","" +"`P0371R1 `__","Temporarily discourage memory_order_consume","2016-06 (Oulu)","|Nothing To Do|","n/a","`#103664 `__","" +"`P0392R0 `__","Adapting string_view by filesystem paths","2016-06 (Oulu)","|Complete|","4","`#103665 `__","" +"`P0393R3 `__","Making Variant Greater Equal","2016-06 (Oulu)","|Complete|","4","`#103666 `__","" +"`P0394R4 `__","Hotel Parallelifornia: terminate() for Parallel Algorithms Exception Handling","2016-06 (Oulu)","|Complete|","17","`#103667 `__","" +"","","","","","","" +"`P0003R5 `__","Removing Deprecated Exception Specifications from C++17","2016-11 (Issaquah)","|Complete|","5","`#103668 `__","" +"`P0067R5 `__","Elementary string conversions, revision 5","2016-11 (Issaquah)","|Partial|","","`#99940 `__","For integer types, ``std::(to|from)_chars`` has been available since v7; for ``float`` and ``double``, ``std::to_chars`` since v14 and ``std::from_chars`` since v20. Support is complete except for ``long double``." +"`P0403R1 `__","Literal suffixes for ``basic_string_view``\ ","2016-11 (Issaquah)","|Complete|","4","`#103669 `__","" +"`P0414R2 `__","Merging shared_ptr changes from Library Fundamentals to C++17","2016-11 (Issaquah)","|Complete|","11","`#103670 `__","" +"`P0418R2 `__","Fail or succeed: there is no atomic lattice","2016-11 (Issaquah)","","","`#99942 `__","" +"`P0426R1 `__","Constexpr for ``std::char_traits``\ ","2016-11 (Issaquah)","|Complete|","4","`#103671 `__","" +"`P0435R1 `__","Resolving LWG Issues re ``common_type``\ ","2016-11 (Issaquah)","|Complete|","4","`#103672 `__","" +"`P0502R0 `__","Throwing out of a parallel algorithm terminates - but how?","2016-11 (Issaquah)","","","`#99943 `__","" +"`P0503R0 `__","Correcting library usage of ""literal type""","2016-11 (Issaquah)","|Complete|","4","`#103673 `__","" +"`P0504R0 `__","Revisiting in-place tag types for any/optional/variant","2016-11 (Issaquah)","|Complete|","4","`#103674 `__","" +"`P0505R0 `__","Wording for GB 50 - constexpr for chrono","2016-11 (Issaquah)","|Complete|","4","`#103675 `__","" +"`P0508R0 `__","Wording for GB 58 - structured bindings for node_handles","2016-11 (Issaquah)","|Complete|","7","`#99944 `__","" +"`P0509R1 `__","Updating ""Restrictions on exception handling""","2016-11 (Issaquah)","|Nothing To Do|","n/a","`#103676 `__","" +"`P0510R0 `__","Disallowing references, incomplete types, arrays, and empty variants","2016-11 (Issaquah)","|Complete|","4","`#103677 `__","" +"`P0513R0 `__","Poisoning the Hash","2016-11 (Issaquah)","|Complete|","5","`#103678 `__","" +"`P0516R0 `__","Clarify That shared_future's Copy Operations have Wide Contracts","2016-11 (Issaquah)","|Complete|","4","`#103679 `__","" +"`P0517R0 `__","Make future_error Constructible","2016-11 (Issaquah)","|Complete|","4","`#103680 `__","" +"`P0521R0 `__","Proposed Resolution for CA 14 (shared_ptr use_count/unique)","2016-11 (Issaquah)","|Complete|","18","`#103681 `__","" +"","","","","","","" +"`P0156R2 `__","Variadic Lock guard(rev 5)","2017-02 (Kona)","|Complete|","5","`#103682 `__","" +"`P0270R3 `__","Removing C dependencies from signal handler wording","2017-02 (Kona)","|Nothing To Do|","","`#99946 `__","" +"`P0298R3 `__","A byte type definition","2017-02 (Kona)","|Complete|","5","`#103683 `__","" +"`P0317R1 `__","Directory Entry Caching for Filesystem","2017-02 (Kona)","|Complete|","7","`#103684 `__","" +"`P0430R2 `__","File system library on non-POSIX-like operating systems","2017-02 (Kona)","|Complete|","7","`#103685 `__","" +"`P0433R2 `__","Toward a resolution of US7 and US14: Integrating template deduction for class templates into the standard library","2017-02 (Kona)","|Complete|","14","`#103686 `__","" +"`P0452R1 `__","Unifying Parallel Algorithms","2017-02 (Kona)","|Partial|","","`#99948 `__","The changes to ``std::transform_inclusive_scan`` and ``std::transform_exclusive_scan`` have not yet been implemented." +"`P0467R2 `__","Iterator Concerns for Parallel Algorithms","2017-02 (Kona)","|Partial|","","`#99949 `__","" +"`P0492R2 `__","Proposed Resolution of C++17 National Body Comments for Filesystems","2017-02 (Kona)","|Complete|","7","`#103687 `__","" +"`P0518R1 `__","Allowing copies as arguments to function objects given to parallel algorithms in response to CH11","2017-02 (Kona)","|Nothing To Do|","","`#103689 `__","" +"`P0523R1 `__","Wording for CH 10: Complexity of parallel algorithms","2017-02 (Kona)","|Nothing To Do|","","`#103690 `__","" +"`P0548R1 `__","common_type and duration","2017-02 (Kona)","|Complete|","5","`#103691 `__","" +"`P0558R1 `__","Resolving atomic named base class inconsistencies","2017-02 (Kona)","|Complete|","","`#103693 `__","" +"`P0574R1 `__","Algorithm Complexity Constraints and Parallel Overloads","2017-02 (Kona)","|Nothing To Do|","","`#103694 `__","" +"`P0599R1 `__","noexcept for hash functions","2017-02 (Kona)","|Complete|","5","`#103695 `__","" +"`P0604R0 `__","Resolving GB 55, US 84, US 85, US 86","2017-02 (Kona)","|Complete|","","`#103696 `__","" +"`P0607R0 `__","Inline Variables for the Standard Library","2017-02 (Kona)","|In Progress|","6","`#99951 `__","The parts of P0607 that are not done are the ```` bits" +"`P0618R0 `__","Deprecating ","2017-02 (Kona)","|Complete|","15","`#103697 `__","" +"`P0623R0 `__","Final C++17 Parallel Algorithms Fixes","2017-02 (Kona)","|Nothing To Do|","","`#103698 `__","" +"","","","","","","" +"`P0682R1 `__","Repairing elementary string conversions","2017-07 (Toronto)","","","`#99952 `__","" +"`P0739R0 `__","Some improvements to class template argument deduction integration into the standard library","2017-07 (Toronto)","|Complete|","5","`#103699 `__","" diff --git a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx20Issues.csv b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx20Issues.csv index 98b49f92bd..3d01ff5bbb 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx20Issues.csv +++ b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx20Issues.csv @@ -1,302 +1,302 @@ -"Issue #","Issue Name","Meeting","Status","First released version","Notes" -"`LWG2070 `__","``allocate_shared``\ should use ``allocator_traits::construct``\ ","2017-07 (Toronto)","|Nothing To Do|","","Resolved by `P0674R1 `__" -"`LWG2444 `__","Inconsistent complexity for ``std::sort_heap``\ ","2017-07 (Toronto)","|Nothing To Do|","","" -"`LWG2593 `__","Moved-from state of Allocators","2017-07 (Toronto)","|Nothing To Do|","","" -"`LWG2597 `__","``std::log``\ misspecified for complex numbers","2017-07 (Toronto)","","","" -"`LWG2783 `__","``stack::emplace()``\ and ``queue::emplace()``\ should return ``decltype(auto)``\ ","2017-07 (Toronto)","|Complete|","","" -"`LWG2932 `__","Constraints on parallel algorithm implementations are underspecified","2017-07 (Toronto)","","","" -"`LWG2937 `__","Is ``equivalent(""existing_thing"", ""not_existing_thing"")``\ an error","2017-07 (Toronto)","|Complete|","","" -"`LWG2940 `__","``result_of``\ specification also needs a little cleanup","2017-07 (Toronto)","|Nothing To Do|","","" -"`LWG2942 `__","LWG 2873's resolution missed ``weak_ptr::owner_before``\ ","2017-07 (Toronto)","|Complete|","","" -"`LWG2954 `__","Specialization of the convenience variable templates should be prohibited","2017-07 (Toronto)","|Complete|","","" -"`LWG2961 `__","Bad postcondition for ``set_default_resource``\ ","2017-07 (Toronto)","|Complete|","16","" -"`LWG2966 `__","Incomplete resolution of US 74","2017-07 (Toronto)","|Nothing To Do|","","" -"`LWG2974 `__","Diagnose out of bounds ``tuple_element/variant_alternative``\ ","2017-07 (Toronto)","|Complete|","","" -"","","","","","" -"`LWG2779 `__","[networking.ts] Relax requirements on buffer sequence iterators","2017-11 (Albuquerque)","|Nothing To Do|","","" -"`LWG2870 `__","Default value of parameter theta of polar should be dependent","2017-11 (Albuquerque)","|Complete|","","" -"`LWG2935 `__","What should create_directories do when p already exists but is not a directory?","2017-11 (Albuquerque)","|Nothing To Do|","","" -"`LWG2941 `__","[thread.req.timing] wording should apply to both member and namespace-level functions","2017-11 (Albuquerque)","|Nothing To Do|","","" -"`LWG2944 `__","LWG 2905 accidentally removed requirement that construction of the deleter doesn't throw an exception","2017-11 (Albuquerque)","|Nothing To Do|","","" -"`LWG2945 `__","Order of template parameters in optional comparisons","2017-11 (Albuquerque)","|Complete|","","" -"`LWG2948 `__","unique_ptr does not define operator<< for stream output","2017-11 (Albuquerque)","|Complete|","","" -"`LWG2950 `__","std::byte operations are misspecified","2017-11 (Albuquerque)","|Complete|","","" -"`LWG2952 `__","iterator_traits should work for pointers to cv T","2017-11 (Albuquerque)","|Complete|","","" -"`LWG2953 `__","LWG 2853 should apply to deque::erase too","2017-11 (Albuquerque)","|Complete|","","" -"`LWG2958 `__","Moves improperly defined as deleted","2017-11 (Albuquerque)","|Complete|","","" -"`LWG2964 `__","Apparently redundant requirement for dynamic_pointer_cast","2017-11 (Albuquerque)","","","" -"`LWG2965 `__","Non-existing path::native_string() in filesystem_error::what() specification","2017-11 (Albuquerque)","|Nothing To Do|","","" -"`LWG2972 `__","What is ``is_trivially_destructible_v``\ ?","2017-11 (Albuquerque)","|Complete|","","" -"`LWG2976 `__","Dangling uses_allocator specialization for packaged_task","2017-11 (Albuquerque)","|Complete|","20","Originally implemented in LLVM 6 but reverted later. Old documentation incorrectly said it was implemented." -"`LWG2977 `__","unordered_meow::merge() has incorrect Throws: clause","2017-11 (Albuquerque)","|Nothing To Do|","","" -"`LWG2978 `__","Hash support for pmr::string and friends","2017-11 (Albuquerque)","|Complete|","16","" -"`LWG2979 `__","aligned_union should require complete object types","2017-11 (Albuquerque)","|Complete|","","" -"`LWG2980 `__","Cannot compare_exchange empty pointers","2017-11 (Albuquerque)","","","" -"`LWG2981 `__","Remove redundant deduction guides from standard library","2017-11 (Albuquerque)","|Nothing To Do|","","" -"`LWG2982 `__","Making size_type consistent in associative container deduction guides","2017-11 (Albuquerque)","","","" -"`LWG2988 `__","Clause 32 cleanup missed one typename","2017-11 (Albuquerque)","|Complete|","13","" -"`LWG2993 `__","reference_wrapper conversion from T&&","2017-11 (Albuquerque)","|Complete|","13","" -"`LWG2998 `__","Requirements on function objects passed to {``forward_``,}list-specific algorithms","2017-11 (Albuquerque)","|Nothing To Do|","","" -"`LWG3001 `__","weak_ptr::element_type needs remove_extent_t","2017-11 (Albuquerque)","|Complete|","14","" -"`LWG3024 `__","variant's copies must be deleted instead of disabled via SFINAE","2017-11 (Albuquerque)","|Complete|","","" -"","","","","","" -"`LWG2164 `__","What are the semantics of ``vector.emplace(vector.begin(), vector.back())``\ ?","2018-03 (Jacksonville)","|Complete|","","" -"`LWG2243 `__","``istream::putback``\ problem","2018-03 (Jacksonville)","|Complete|","","" -"`LWG2816 `__","``resize_file``\ has impossible postcondition","2018-03 (Jacksonville)","|Nothing To Do|","","" -"`LWG2843 `__","Unclear behavior of ``std::pmr::memory_resource::do_allocate()``\ ","2018-03 (Jacksonville)","|Complete|","","" -"`LWG2849 `__","Why does ``!is_regular_file(from)``\ cause ``copy_file``\ to report a ""file already exists"" error?","2018-03 (Jacksonville)","|Nothing To Do|","","" -"`LWG2851 `__","``std::filesystem``\ enum classes are now underspecified","2018-03 (Jacksonville)","|Nothing To Do|","","" -"`LWG2946 `__","LWG 2758's resolution missed further corrections","2018-03 (Jacksonville)","|Complete|","","" -"`LWG2969 `__","``polymorphic_allocator::construct()``\ shouldn't pass ``resource()``\ ","2018-03 (Jacksonville)","|Complete|","","" -"`LWG2975 `__","Missing case for ``pair``\ construction in scoped and polymorphic allocators","2018-03 (Jacksonville)","","","" -"`LWG2989 `__","``path``\ 's stream insertion operator lets you insert everything under the sun","2018-03 (Jacksonville)","|Complete|","","" -"`LWG3000 `__","``monotonic_memory_resource::do_is_equal``\ uses ``dynamic_cast``\ unnecessarily","2018-03 (Jacksonville)","|Complete|","16","" -"`LWG3002 `__","[networking.ts] ``basic_socket_acceptor::is_open()``\ isn't ``noexcept``\ ","2018-03 (Jacksonville)","|Nothing To Do|","","" -"`LWG3004 `__","|sect|\ [string.capacity] and |sect|\ [vector.capacity] should specify time complexity for ``capacity()``\ ","2018-03 (Jacksonville)","|Nothing To Do|","","" -"`LWG3005 `__","Destruction order of arrays by ``make_shared/allocate_shared``\ only recommended?","2018-03 (Jacksonville)","","","" -"`LWG3007 `__","``allocate_shared``\ should rebind allocator to *cv*-unqualified ``value_type``\ for construction","2018-03 (Jacksonville)","","","" -"`LWG3009 `__","Including ````\ doesn't provide ``std::size/empty/data``\ ","2018-03 (Jacksonville)","|Complete|","","" -"`LWG3010 `__","[networking.ts] ``uses_executor``\ says ""if a type ``T::executor_type``\ exists""","2018-03 (Jacksonville)","|Nothing To Do|","","" -"`LWG3013 `__","``(recursive_)directory_iterator``\ construction and traversal should not be ``noexcept``\ ","2018-03 (Jacksonville)","|Complete|","","" -"`LWG3014 `__","More ``noexcept``\ issues with filesystem operations","2018-03 (Jacksonville)","|Complete|","","" -"`LWG3015 `__","``copy_options::*unspecified*``\ underspecified","2018-03 (Jacksonville)","|Nothing To Do|","","" -"`LWG3017 `__","``list splice``\ functions should use ``addressof``\ ","2018-03 (Jacksonville)","|Complete|","","" -"`LWG3020 `__","[networking.ts] Remove spurious nested ``value_type``\ buffer sequence requirement","2018-03 (Jacksonville)","|Nothing To Do|","","" -"`LWG3026 `__","``filesystem::weakly_canonical``\ still defined in terms of ``canonical(p, base)``\ ","2018-03 (Jacksonville)","|Complete|","","" -"`LWG3030 `__","Who shall meet the requirements of ``try_lock``\ ?","2018-03 (Jacksonville)","|Nothing To Do|","","" -"`LWG3034 `__","P0767R1 breaks previously-standard-layout types","2018-03 (Jacksonville)","|Complete|","","" -"`LWG3035 `__","``std::allocator``\ 's constructors should be ``constexpr``\ ","2018-03 (Jacksonville)","|Complete|","","" -"`LWG3039 `__","Unnecessary ``decay``\ in ``thread``\ and ``packaged_task``\ ","2018-03 (Jacksonville)","|Complete|","","" -"`LWG3041 `__","Unnecessary ``decay``\ in ``reference_wrapper``\ ","2018-03 (Jacksonville)","|Complete|","","" -"`LWG3042 `__","``is_literal_type_v``\ should be inline","2018-03 (Jacksonville)","|Complete|","","" -"`LWG3043 `__","Bogus postcondition for ``filesystem_error``\ constructor","2018-03 (Jacksonville)","|Complete|","","" -"`LWG3045 `__","``atomic``\ doesn't have ``value_type``\ or ``difference_type``\ ","2018-03 (Jacksonville)","|Complete|","18","" -"`LWG3048 `__","``transform_reduce(exec, first1, last1, first2, init)``\ discards execution policy","2018-03 (Jacksonville)","|Complete|","17","" -"`LWG3051 `__","Floating point classifications were inadvertently changed in P0175","2018-03 (Jacksonville)","|Nothing To Do|","","" -"`LWG3075 `__","``basic_string``\ needs deduction guides from ``basic_string_view``\ ","2018-03 (Jacksonville)","|Complete|","","" -"","","","","","" -"`LWG2139 `__","What is a user-defined type?","2018-06 (Rapperswil)","","","" -"`LWG2970 `__","Return type of std::visit misspecified","2018-06 (Rapperswil)","|Complete|","11","" -"`LWG3058 `__","Parallel adjacent_difference shouldn't require creating temporaries","2018-06 (Rapperswil)","","","" -"`LWG3062 `__","Unnecessary decay_t in is_execution_policy_v should be remove_cvref_t","2018-06 (Rapperswil)","|Complete|","17","" -"`LWG3067 `__","recursive_directory_iterator::pop must invalidate","2018-06 (Rapperswil)","|Nothing To Do|","","" -"`LWG3071 `__","[networking.ts] read_until still refers to ""input sequence""","2018-06 (Rapperswil)","|Nothing To Do|","","" -"`LWG3074 `__","Non-member functions for valarray should only deduce from the valarray","2018-06 (Rapperswil)","","","" -"`LWG3076 `__","basic_string CTAD ambiguity","2018-06 (Rapperswil)","|Complete|","","" -"`LWG3079 `__","LWG 2935 forgot to fix the existing_p overloads of create_directory","2018-06 (Rapperswil)","|Nothing To Do|","","" -"`LWG3080 `__","Floating point from_chars pattern specification breaks round-tripping","2018-06 (Rapperswil)","","","" -"`LWG3083 `__","What should ios::iword(-1) do?","2018-06 (Rapperswil)","|Nothing To Do|","","" -"`LWG3094 `__","[time.duration.io]p4 makes surprising claims about encoding","2018-06 (Rapperswil)","","","" -"`LWG3100 `__","Unnecessary and confusing ""empty span"" wording","2018-06 (Rapperswil)","|Nothing To Do|","","" -"`LWG3102 `__","Clarify span iterator and ``const_iterator`` behavior","2018-06 (Rapperswil)","|Complete|","","" -"`LWG3104 `__","Fixing duration division","2018-06 (Rapperswil)","|Complete|","","" -"","","","","","" -"`LWG2183 `__","Muddled allocator requirements for ``match_results``\ constructors","2018-11 (San Diego)","|Complete|","","" -"`LWG2184 `__","Muddled allocator requirements for ``match_results``\ assignments","2018-11 (San Diego)","|Complete|","","" -"`LWG2412 `__","``promise::set_value()``\ and ``promise::get_future()``\ should not race","2018-11 (San Diego)","","","" -"`LWG2499 `__","``operator>>(basic_istream&, CharT*)``\ makes it hard to avoid buffer overflows","2018-11 (San Diego)","|Nothing To Do|","","Resolved by `P0487R1 `__" -"`LWG2682 `__","``filesystem::copy()``\ won't create a symlink to a directory","2018-11 (San Diego)","|Nothing To Do|","","" -"`LWG2697 `__","[concurr.ts] Behavior of ``future/shared_future``\ unwrapping constructor when given an invalid ``future``\ ","2018-11 (San Diego)","","","" -"`LWG2797 `__","Trait precondition violations","2018-11 (San Diego)","|Nothing To Do|","","Resolved by `P1285R0 `__" -"`LWG2936 `__","Path comparison is defined in terms of the generic format","2018-11 (San Diego)","|Complete|","","" -"`LWG2943 `__","Problematic specification of the wide version of ``basic_filebuf::open``\ ","2018-11 (San Diego)","|Nothing To Do|","","" -"`LWG2960 `__","[fund.ts.v3] ``nonesuch``\ is insufficiently useless","2018-11 (San Diego)","|Complete|","","" -"`LWG2995 `__","``basic_stringbuf``\ default constructor forbids it from using SSO capacity","2018-11 (San Diego)","|Complete|","20","" -"`LWG2996 `__","Missing rvalue overloads for ``shared_ptr``\ operations","2018-11 (San Diego)","|Complete|","17","" -"`LWG3008 `__","``make_shared``\ (sub)object destruction semantics are not specified","2018-11 (San Diego)","|Complete|","16","" -"`LWG3022 `__","``is_convertible``\ may lead to ODR","2018-11 (San Diego)","|Nothing To Do|","","Resolved by `P1285R0 `__" -"`LWG3025 `__","Map-like container deduction guides should use ``pair``\ , not ``pair``\ ","2018-11 (San Diego)","|Complete|","","" -"`LWG3031 `__","Algorithms and predicates with non-const reference arguments","2018-11 (San Diego)","","","" -"`LWG3037 `__","``polymorphic_allocator``\ and incomplete types","2018-11 (San Diego)","|Complete|","16","" -"`LWG3038 `__","``polymorphic_allocator::allocate``\ should not allow integer overflow to create vulnerabilities","2018-11 (San Diego)","|Complete|","14","" -"`LWG3054 `__","``uninitialized_copy``\ appears to not be able to meet its exception-safety guarantee","2018-11 (San Diego)","|Nothing To Do|","","" -"`LWG3065 `__","LWG 2989 missed that all ``path``\ 's other operators should be hidden friends as well","2018-11 (San Diego)","|Complete|","","" -"`LWG3096 `__","``path::lexically_relative``\ is confused by trailing slashes","2018-11 (San Diego)","|Complete|","","" -"`LWG3116 `__","``OUTERMOST_ALLOC_TRAITS``\ needs ``remove_reference_t``\ ","2018-11 (San Diego)","","","" -"`LWG3122 `__","``__cpp_lib_chrono_udls``\ was accidentally dropped","2018-11 (San Diego)","|Complete|","","" -"`LWG3127 `__","``basic_osyncstream::rdbuf``\ needs a ``const_cast``\ ","2018-11 (San Diego)","|Complete|","18","" -"`LWG3128 `__","``strstream::rdbuf``\ needs a ``const_cast``\ ","2018-11 (San Diego)","|Nothing To Do|","","" -"`LWG3129 `__","``regex_token_iterator``\ constructor uses wrong pointer arithmetic","2018-11 (San Diego)","","","" -"`LWG3130 `__","|sect|\ [input.output] needs many ``addressof``\ ","2018-11 (San Diego)","|Complete|","20","" -"`LWG3131 `__","``addressof``\ all the things","2018-11 (San Diego)","","","" -"`LWG3132 `__","Library needs to ban macros named ``expects``\ or ``ensures``\ ","2018-11 (San Diego)","|Nothing To Do|","","" -"`LWG3134 `__","[fund.ts.v3] LFTSv3 contains extraneous [meta] variable templates that should have been deleted by P09961","2018-11 (San Diego)","|Nothing To Do|","","Resolved by `P1210R0 `__" -"`LWG3137 `__","Header for ``__cpp_lib_to_chars``\ ","2018-11 (San Diego)","|Complete|","","" -"`LWG3140 `__","``COMMON_REF``\ is unimplementable as specified","2018-11 (San Diego)","|Nothing To Do|","","" -"`LWG3145 `__","``file_clock``\ breaks ABI for C++17 implementations","2018-11 (San Diego)","|Complete|","","" -"`LWG3147 `__","Definitions of ""likely"" and ""unlikely"" are likely to cause problems","2018-11 (San Diego)","|Nothing To Do|","","" -"`LWG3148 `__","````\ should be freestanding","2018-11 (San Diego)","","","" -"`LWG3153 `__","``Common``\ and ``common_type``\ have too little in common","2018-11 (San Diego)","|Complete|","13","" -"`LWG3154 `__","``Common``\ and ``CommonReference``\ have a common defect","2018-11 (San Diego)","|Nothing To Do|","","" -"","","","","","" -"`LWG3012 `__","``atomic``\ is unimplementable for non-``is_trivially_copy_constructible T``\ ","2019-02 (Kona)","","","" -"`LWG3040 `__","``basic_string_view::starts_with``\ *Effects* are incorrect","2019-02 (Kona)","|Complete|","","" -"`LWG3077 `__","``(push|emplace)_back``\ should invalidate the ``end``\ iterator","2019-02 (Kona)","|Nothing To Do|","","" -"`LWG3087 `__","One final ``&x``\ in |sect|\ [list.ops]","2019-02 (Kona)","|Nothing To Do|","","" -"`LWG3101 `__","``span``\ 's ``Container``\ constructors need another constraint","2019-02 (Kona)","|Complete|","","" -"`LWG3112 `__","``system_error``\ and ``filesystem_error``\ constructors taking a ``string``\ may not be able to meet their postconditions","2019-02 (Kona)","|Nothing To Do|","","" -"`LWG3119 `__","Program-definedness of closure types","2019-02 (Kona)","|Nothing To Do|","","" -"`LWG3133 `__","Modernizing numeric type requirements","2019-02 (Kona)","","","" -"`LWG3144 `__","``span``\ does not have a ``const_pointer``\ typedef","2019-02 (Kona)","|Complete|","","" -"`LWG3173 `__","Enable CTAD for ``ref-view``\ ","2019-02 (Kona)","|Complete|","15","" -"`LWG3179 `__","``subrange``\ should always model ``Range``\ ","2019-02 (Kona)","|Nothing To Do|","","" -"`LWG3180 `__","Inconsistently named return type for ``ranges::minmax_element``\ ","2019-02 (Kona)","|Complete|","15","" -"`LWG3182 `__","Specification of ``Same``\ could be clearer","2019-02 (Kona)","|Complete|","15","" -"","","","","","" -"`LWG2899 `__","``is_(nothrow_)move_constructible``\ and ``tuple``\ , ``optional``\ and ``unique_ptr``\ ","2019-07 (Cologne)","","","" -"`LWG3055 `__","``path::operator+=(*single-character*)``\ misspecified","2019-07 (Cologne)","|Complete|","7","" -"`LWG3158 `__","``tuple(allocator_arg_t, const Alloc&)``\ should be conditionally explicit","2019-07 (Cologne)","|Complete|","10","" -"`LWG3169 `__","``ranges``\ permutation generators discard useful information","2019-07 (Cologne)","|Complete|","15","" -"`LWG3183 `__","Normative permission to specialize Ranges variable templates","2019-07 (Cologne)","|Nothing To Do|","","" -"`LWG3184 `__","Inconsistencies in ``bind_front``\ wording","2019-07 (Cologne)","|Complete|","13","" -"`LWG3185 `__","Uses-allocator construction functions missing ``constexpr``\ and ``noexcept``\ ","2019-07 (Cologne)","|Complete|","16","" -"`LWG3186 `__","``ranges``\ removal, partition, and ``partial_sort_copy``\ algorithms discard useful information","2019-07 (Cologne)","|Complete|","15","" -"`LWG3187 `__","`P0591R4 `__ reverted DR 2586 fixes to ``scoped_allocator_adaptor::construct()``\ ","2019-07 (Cologne)","","","" -"`LWG3191 `__","``std::ranges::shuffle``\ synopsis does not match algorithm definition","2019-07 (Cologne)","|Complete|","15","" -"`LWG3196 `__","``std::optional``\ is ill-formed is ``T``\ is an array","2019-07 (Cologne)","|Complete|","","" -"`LWG3198 `__","Bad constraint on ``std::span::span()``\ ","2019-07 (Cologne)","|Complete|","","" -"`LWG3199 `__","``istream >> bitset<0>``\ fails","2019-07 (Cologne)","|Complete|","10","" -"`LWG3202 `__","P0318R1 was supposed to be revised","2019-07 (Cologne)","|Complete|","","" -"`LWG3206 `__","``year_month_day``\ conversion to ``sys_days``\ uses not-existing member function","2019-07 (Cologne)","|Complete|","","" -"`LWG3208 `__","``Boolean``\ 's expression requirements are ordered inconsistently","2019-07 (Cologne)","|Nothing To Do|","","" -"`LWG3209 `__","Expression in ``year::ok()``\ returns clause is ill-formed","2019-07 (Cologne)","|Complete|","","" -"","","","","","" -"`LWG3231 `__","``year_month_day_last::day``\ specification does not cover ``!ok()``\ values","2019-11 (Belfast)","|Nothing To Do|","","" -"`LWG3225 `__","``zoned_time``\ converting constructor shall not be ``noexcept``\ ","2019-11 (Belfast)","|Complete|","19","" -"`LWG3190 `__","``std::allocator::allocate``\ sometimes returns too little storage","2019-11 (Belfast)","|Complete|","14","" -"`LWG3218 `__","Modifier for ``%d``\ parse flag does not match POSIX and ``format``\ specification","2019-11 (Belfast)","","","" -"`LWG3224 `__","``zoned_time``\ constructor from ``TimeZonePtr``\ does not specify initialization of ``tp_``\ ","2019-11 (Belfast)","|Complete|","19","" -"`LWG3230 `__","Format specifier ``%y/%Y``\ is missing locale alternative versions","2019-11 (Belfast)","|Complete|","16","" -"`LWG3232 `__","Inconsistency in ``zoned_time``\ deduction guides","2019-11 (Belfast)","|Complete|","19","" -"`LWG3222 `__","P0574R1 introduced preconditions on non-existent parameters","2019-11 (Belfast)","","","" -"`LWG3221 `__","Result of ``year_month``\ arithmetic with ``months``\ is ambiguous","2019-11 (Belfast)","|Complete|","8","" -"`LWG3235 `__","``parse``\ manipulator without abbreviation is not callable","2019-11 (Belfast)","","","" -"`LWG3246 `__","LWG3246: What are the constraints on the template parameter of `basic_format_arg`?","2019-11 (Belfast)","|Nothing To Do|","","" -"`LWG3253 `__","``basic_syncbuf::basic_syncbuf()``\ should not be explicit","2019-11 (Belfast)","|Complete|","20","" -"`LWG3245 `__","Unnecessary restriction on ``'%p'``\ parse specifier","2019-11 (Belfast)","","","" -"`LWG3244 `__","Constraints for ``Source``\ in |sect|\ [fs.path.req] insufficiently constrainty","2019-11 (Belfast)","","","" -"`LWG3241 `__","``chrono-spec``\ grammar ambiguity in |sect|\ [time.format]","2019-11 (Belfast)","|Complete|","16","" -"`LWG3257 `__","Missing feature testing macro update from P0858","2019-11 (Belfast)","|Complete|","12","" -"`LWG3256 `__","Feature testing macro for ``constexpr``\ algorithms","2019-11 (Belfast)","|Complete|","13","" -"`LWG3273 `__","Specify ``weekday_indexed``\ to range of ``[0, 7]``\ ","2019-11 (Belfast)","|Complete|","16","" -"`LWG3070 `__","``path::lexically_relative``\ causes surprising results if a filename can also be a *root-name*","2019-11 (Belfast)","","","" -"`LWG3266 `__","``to_chars(bool)``\ should be deleted","2019-11 (Belfast)","|Complete|","14","" -"`LWG3272 `__","``%I%p``\ should parse/format ``duration``\ since midnight","2019-11 (Belfast)","","","" -"`LWG3259 `__","The definition of *constexpr iterators* should be adjusted","2019-11 (Belfast)","|Nothing To Do|","","" -"`LWG3103 `__","Errors in taking subview of ``span``\ should be ill-formed where possible","2019-11 (Belfast)","|Complete|","11","" -"`LWG3274 `__","Missing feature test macro for ````\ ","2019-11 (Belfast)","|Complete|","11","" -"`LWG3276 `__","Class ``split_view::outer_iterator::value_type``\ should inherit from ``view_interface``\ ","2019-11 (Belfast)","|Complete|","15","" -"`LWG3277 `__","Pre-increment on prvalues is not a requirement of ``weakly_incrementable``\ ","2019-11 (Belfast)","|Nothing To Do|","","" -"`LWG3149 `__","``DefaultConstructible``\ should require default initialization","2019-11 (Belfast)","|Complete|","13","" -"","","","","","" -"`LWG1203 `__","More useful rvalue stream insertion","2020-02 (Prague)","|Complete|","12","" -"`LWG2859 `__","Definition of *reachable* in [ptr.launder] misses pointer arithmetic from pointer-interconvertible object","2020-02 (Prague)","","","" -"`LWG3018 `__","``shared_ptr``\ of function type","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3050 `__","Conversion specification problem in ``chrono::duration``\ constructor","2020-02 (Prague)","|Complete|","19","" -"`LWG3141 `__","``CopyConstructible``\ doesn't preserve source values","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3150 `__","``UniformRandomBitGenerator``\ should validate ``min``\ and ``max``\ ","2020-02 (Prague)","|Complete|","13","" -"`LWG3175 `__","The ``CommonReference``\ requirement of concept ``SwappableWith``\ is not satisfied in the example","2020-02 (Prague)","|Complete|","13","" -"`LWG3194 `__","``ConvertibleTo``\ prose does not match code","2020-02 (Prague)","|Complete|","13","" -"`LWG3200 `__","``midpoint``\ should not constrain ``T``\ is complete","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3201 `__","``lerp``\ should be marked as ``noexcept``\ ","2020-02 (Prague)","|Complete|","","" -"`LWG3226 `__","``zoned_time``\ constructor from ``string_view``\ should accept ``zoned_time``\ ","2020-02 (Prague)","|Complete|","19","" -"`LWG3233 `__","Broken requirements for ``shared_ptr``\ converting constructors","2020-02 (Prague)","|Complete|","19","" -"`LWG3237 `__","LWG 3038 and 3190 have inconsistent PRs","2020-02 (Prague)","|Complete|","16","" -"`LWG3238 `__","Insufficiently-defined behavior of ``std::function``\ deduction guides","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3242 `__","``std::format``\ : missing rules for ``arg-id``\ in ``width``\ and ``precision``\ ","2020-02 (Prague)","|Complete|","14","" -"`LWG3243 `__","``std::format``\ and negative zeroes","2020-02 (Prague)","|Complete|","14","" -"`LWG3247 `__","``ranges::iter_move``\ should perform ADL-only lookup of ``iter_move``\ ","2020-02 (Prague)","|Complete|","15","" -"`LWG3248 `__","``std::format``\ ``#b``\ , ``#B``\ , ``#o``\ , ``#x``\ , and ``#X``\ presentation types misformat negative numbers","2020-02 (Prague)","|Complete|","14","" -"`LWG3250 `__","``std::format``\ : ``#``\ (alternate form) for NaN and inf","2020-02 (Prague)","|Complete|","14","" -"`LWG3251 `__","Are ``std::format``\ alignment specifiers applied to string arguments?","2020-02 (Prague)","|Complete|","14","" -"`LWG3252 `__","Parse locale's aware modifiers for commands are not consistent with POSIX spec","2020-02 (Prague)","","","" -"`LWG3254 `__","Strike ``stop_token``\ 's ``operator!=``\ ","2020-02 (Prague)","|Complete|","17","" -"`LWG3255 `__","``span``\ 's ``array``\ constructor is too strict","2020-02 (Prague)","|Complete|","","" -"`LWG3260 `__","``year_month*``\ arithmetic rejects durations convertible to years","2020-02 (Prague)","","","" -"`LWG3262 `__","Formatting of negative durations is not specified","2020-02 (Prague)","|Complete|","16","" -"`LWG3264 `__","``sized_range``\ and ``ranges::size``\ redundantly use ``disable_sized_range``\ ","2020-02 (Prague)","|Complete|","15","" -"`LWG3269 `__","Parse manipulators do not specify the result of the extraction from stream","2020-02 (Prague)","","","" -"`LWG3270 `__","Parsing and formatting ``%j``\ with ``duration``\ s","2020-02 (Prague)","|Partial|","","" -"`LWG3280 `__","View converting constructors can cause constraint recursion and are unneeded","2020-02 (Prague)","|Complete|","15","" -"`LWG3281 `__","Conversion from ``*pair-like*``\ types to ``subrange``\ is a silent semantic promotion","2020-02 (Prague)","|Complete|","13","" -"`LWG3282 `__","``subrange``\ converting constructor should disallow derived to base conversions","2020-02 (Prague)","|Complete|","15","" -"`LWG3284 `__","``random_access_iterator``\ semantic constraints accidentally promote difference type using unary negate","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3285 `__","The type of a customization point object shall satisfy ``semiregular``\ ","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3286 `__","``ranges::size``\ is not required to be valid after a call to ``ranges::begin``\ on an input range","2020-02 (Prague)","|Complete|","15","" -"`LWG3291 `__","``iota_view::iterator``\ has the wrong ``iterator_category``\ ","2020-02 (Prague)","|Complete|","15","" -"`LWG3292 `__","``iota_view``\ is under-constrained","2020-02 (Prague)","|Complete|","15","" -"`LWG3294 `__","``zoned_time``\ deduction guides misinterprets ``string``\ /``char*``\ ","2020-02 (Prague)","|Complete|","19","" -"`LWG3296 `__","Inconsistent default argument for ``basic_regex<>::assign``\ ","2020-02 (Prague)","|Complete|","","" -"`LWG3299 `__","Pointers don't need customized iterator behavior","2020-02 (Prague)","|Complete|","15","" -"`LWG3300 `__","Non-array ``ssize``\ overload is underconstrained","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3301 `__","``transform_view::iterator``\ has incorrect ``iterator_category``\ ","2020-02 (Prague)","|Complete|","15","" -"`LWG3302 `__","Range adaptor objects ``keys``\ and ``values``\ are unspecified","2020-02 (Prague)","|Complete|","16","" -"`LWG3303 `__","Bad ""``constexpr``\ "" marker for ``destroy/destroy_n``\ ","2020-02 (Prague)","","","" -"`LWG3304 `__","Allocate functions of ``std::polymorphic_allocator``\ should require ``[[nodiscard]]``\ ","2020-02 (Prague)","|Complete|","16","" -"`LWG3307 `__","``std::allocator().allocate(n)``\ ","2020-02 (Prague)","|Complete|","20","" -"`LWG3310 `__","Replace ``SIZE_MAX``\ with ``numeric_limits::max()``\ ","2020-02 (Prague)","|Complete|","16","" -"`LWG3313 `__","``join_view::iterator::operator--``\ is incorrectly constrained","2020-02 (Prague)","|Complete|","14","" -"`LWG3314 `__","Is stream insertion behavior locale dependent when ``Period::type``\ is ``micro``\ ?","2020-02 (Prague)","|Complete|","16","" -"`LWG3315 `__","Correct Allocator Default Behavior","2020-02 (Prague)","|Complete|","","" -"`LWG3316 `__","Correctly define epoch for ``utc_clock``\ / ``utc_timepoint``\ ","2020-02 (Prague)","","","" -"`LWG3317 `__","Incorrect ``operator<<``\ for floating-point durations","2020-02 (Prague)","|Complete|","16","" -"`LWG3318 `__","Clarify whether clocks can represent time before their epoch","2020-02 (Prague)","","","" -"`LWG3319 `__","Properly reference specification of IANA time zone database","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3320 `__","``span::cbegin/cend``\ methods produce different results than ``std::[ranges::]cbegin/cend``\ ","2020-02 (Prague)","|Complete|","","" -"`LWG3321 `__","``uninitialized_construct_using_allocator``\ should use ``construct_at``\ ","2020-02 (Prague)","|Complete|","16","" -"`LWG3323 `__","``*has-tuple-element*``\ helper concept needs ``convertible_to``\ ","2020-02 (Prague)","|Complete|","16","" -"`LWG3324 `__","Special-case ``std::strong/weak/partial_order``\ for pointers","2020-02 (Prague)","|Complete|","14","" -"`LWG3325 `__","Constrain return type of transformation function for ``transform_view``\ ","2020-02 (Prague)","|Complete|","15","" -"`LWG3326 `__","``enable_view``\ has false positives","2020-02 (Prague)","|Complete|","15","" -"`LWG3327 `__","Format alignment specifiers vs. text direction","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3328 `__","Clarify that ``std::string``\ is not good for UTF-8","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3329 `__","``totally_ordered_with``\ both directly and indirectly requires ``common_reference_with``\ ","2020-02 (Prague)","|Complete|","13","" -"`LWG3330 `__","Include ````\ from most library headers","2020-02 (Prague)","|Complete|","13","" -"`LWG3331 `__","Define ``totally_ordered/_with``\ in terms of ``partially-ordered-with``\ ","2020-02 (Prague)","|Complete|","13","" -"`LWG3332 `__","Issue in |sect|\ [time.format]","2020-02 (Prague)","|Complete|","16","" -"`LWG3334 `__","``basic_osyncstream``\ move assignment and destruction calls ``basic_syncbuf::emit()``\ twice","2020-02 (Prague)","|Complete|","18","" -"`LWG3335 `__","Resolve C++20 NB comments US 273 and GB 274","2020-02 (Prague)","|Complete|","15","" -"`LWG3338 `__","Rename ``default_constructible``\ to ``default_initializable``\ ","2020-02 (Prague)","|Complete|","13","" -"`LWG3340 `__","Formatting functions should throw on argument/format string mismatch in |sect|\ [format.functions]","2020-02 (Prague)","|Complete|","14","" -"`LWG3346 `__","``pair``\ and ``tuple``\ copy and move constructor have backwards specification","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3347 `__","``std::pair``\ now requires ``T``\ and ``U``\ to be less-than-comparable","2020-02 (Prague)","|Complete|","17","" -"`LWG3348 `__","``__cpp_lib_unwrap_ref``\ in wrong header","2020-02 (Prague)","|Complete|","12","" -"`LWG3349 `__","Missing ``__cpp_lib_constexpr_complex``\ for P0415R1","2020-02 (Prague)","|Complete|","16","" -"`LWG3350 `__","Simplify return type of ``lexicographical_compare_three_way``\ ","2020-02 (Prague)","|Complete|","17","" -"`LWG3351 `__","``ranges::enable_safe_range``\ should not be constrained","2020-02 (Prague)","|Complete|","15","" -"`LWG3352 `__","``strong_equality``\ isn't a thing","2020-02 (Prague)","|Complete|","19","" -"`LWG3354 `__","``has_strong_structural_equality``\ has a meaningless definition","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3355 `__","The memory algorithms should support move-only input iterators introduced by P1207","2020-02 (Prague)","|Complete|","15","" -"`LWG3356 `__","``__cpp_lib_nothrow_convertible``\ should be ``__cpp_lib_is_nothrow_convertible``\ ","2020-02 (Prague)","|Complete|","12","" -"`LWG3358 `__","|sect|\ [span.cons] is mistaken that ``to_address``\ can throw","2020-02 (Prague)","|Complete|","17","" -"`LWG3359 `__","````\ leap second support should allow for negative leap seconds","2020-02 (Prague)","|Complete|","21","" -"`LWG3360 `__","``three_way_comparable_with``\ is inconsistent with similar concepts","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3362 `__","Strike ``stop_source``\ 's ``operator!=``\ ","2020-02 (Prague)","|Complete|","17","" -"`LWG3363 `__","``drop_while_view``\ should opt-out of ``sized_range``\ ","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3364 `__","Initialize data members of ranges and their iterators","2020-02 (Prague)","|Complete|","16","" -"`LWG3367 `__","Integer-class conversions should not throw","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3369 `__","``span``\ 's deduction-guide for built-in arrays doesn't work","2020-02 (Prague)","|Complete|","14","" -"`LWG3371 `__","``visit_format_arg``\ and ``make_format_args``\ are not hidden friends","2020-02 (Prague)","|Complete|","14","" -"`LWG3372 `__","``vformat_to``\ should not try to deduce ``Out``\ twice","2020-02 (Prague)","|Complete|","14","" -"`LWG3373 `__","``{to,from}_chars_result``\ and ``format_to_n_result``\ need the ""we really mean what we say"" wording","2020-02 (Prague)","|Complete|","14","" -"`LWG3374 `__","P0653 + P1006 should have made the other ``std::to_address``\ overload ``constexpr``\ ","2020-02 (Prague)","|Complete|","12","" -"`LWG3375 `__","``decay``\ in ``viewable_range``\ should be ``remove_cvref``\ ","2020-02 (Prague)","|Complete|","15","" -"`LWG3377 `__","``elements_view::iterator``\ befriends a specialization of itself","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3379 `__","""``safe``\ "" in several library names is misleading","2020-02 (Prague)","|Complete|","15","" -"`LWG3380 `__","``common_type``\ and comparison categories","2020-02 (Prague)","|Complete|","15","" -"`LWG3381 `__","``begin``\ and ``data``\ must agree for ``contiguous_range``\ ","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3382 `__","NTTP for ``pair``\ and ``array``\ ","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3383 `__","|sect|\ [time.zone.leap.nonmembers] ``sys_seconds``\ should be replaced with ``seconds``\ ","2020-02 (Prague)","|Complete|","19","" -"`LWG3384 `__","``transform_view::*sentinel*``\ has an incorrect ``operator-``\ ","2020-02 (Prague)","|Complete|","15","" -"`LWG3385 `__","``common_iterator``\ is not sufficiently constrained for non-copyable iterators","2020-02 (Prague)","|Complete|","15","" -"`LWG3387 `__","|sect|\ [range.reverse.view] ``reverse_view``\ unintentionally requires ``range``\ ","2020-02 (Prague)","|Complete|","15","" -"`LWG3388 `__","``view``\ iterator types have ill-formed ``<=>``\ operators","2020-02 (Prague)","|Complete|","16","" -"`LWG3389 `__","A move-only iterator still does not have a ``counted_iterator``\ ","2020-02 (Prague)","|Complete|","15","" -"`LWG3390 `__","``make_move_iterator()``\ cannot be used to construct a ``move_iterator``\ for a move-only iterator","2020-02 (Prague)","|Complete|","14","" -"`LWG3393 `__","Missing/incorrect feature test macro for coroutines","2020-02 (Prague)","|Complete|","14","" -"`LWG3395 `__","Definition for three-way comparison needs to be updated (US 152)","2020-02 (Prague)","|Nothing To Do|","","" -"`LWG3396 `__","Clarify point of reference for ``source_location::current()``\ (DE 169)","2020-02 (Prague)","|Nothing To Do|","16","" -"`LWG3397 `__","``ranges::basic_istream_view::iterator``\ should not provide ``iterator_category``\ ","2020-02 (Prague)","|Complete|","16","" -"`LWG3398 `__","``tuple_element_t``\ is also wrong for ``const subrange``\ ","2020-02 (Prague)","|Complete|","14","" -"","","","","","" -"`LWG3446 `__","``indirectly_readable_traits``\ ambiguity for types with both ``value_type``\ and ``element_type``\ ","2020-11 (Virtual)","|Complete|","13","" +"Issue #","Issue Name","Meeting","Status","First released version","GitHub issue","Notes" +"`LWG2070 `__","``allocate_shared``\ should use ``allocator_traits::construct``\ ","2017-07 (Toronto)","|Nothing To Do|","","`#103733 `__","Resolved by `P0674R1 `__" +"`LWG2444 `__","Inconsistent complexity for ``std::sort_heap``\ ","2017-07 (Toronto)","|Nothing To Do|","","`#103734 `__","" +"`LWG2593 `__","Moved-from state of Allocators","2017-07 (Toronto)","|Nothing To Do|","","`#100220 `__","" +"`LWG2597 `__","``std::log``\ misspecified for complex numbers","2017-07 (Toronto)","","","`#100221 `__","" +"`LWG2783 `__","``stack::emplace()``\ and ``queue::emplace()``\ should return ``decltype(auto)``\ ","2017-07 (Toronto)","|Complete|","","`#103735 `__","" +"`LWG2932 `__","Constraints on parallel algorithm implementations are underspecified","2017-07 (Toronto)","","","`#100222 `__","" +"`LWG2937 `__","Is ``equivalent(""existing_thing"", ""not_existing_thing"")``\ an error","2017-07 (Toronto)","|Complete|","","`#103736 `__","" +"`LWG2940 `__","``result_of``\ specification also needs a little cleanup","2017-07 (Toronto)","|Nothing To Do|","","`#103737 `__","" +"`LWG2942 `__","LWG 2873's resolution missed ``weak_ptr::owner_before``\ ","2017-07 (Toronto)","|Complete|","","`#103738 `__","" +"`LWG2954 `__","Specialization of the convenience variable templates should be prohibited","2017-07 (Toronto)","|Complete|","","`#103739 `__","" +"`LWG2961 `__","Bad postcondition for ``set_default_resource``\ ","2017-07 (Toronto)","|Complete|","16","`#103740 `__","" +"`LWG2966 `__","Incomplete resolution of US 74","2017-07 (Toronto)","|Nothing To Do|","","`#103741 `__","" +"`LWG2974 `__","Diagnose out of bounds ``tuple_element/variant_alternative``\ ","2017-07 (Toronto)","|Complete|","","`#103742 `__","" +"","","","","","","" +"`LWG2779 `__","[networking.ts] Relax requirements on buffer sequence iterators","2017-11 (Albuquerque)","|Nothing To Do|","","`#100223 `__","" +"`LWG2870 `__","Default value of parameter theta of polar should be dependent","2017-11 (Albuquerque)","|Complete|","","`#103743 `__","" +"`LWG2935 `__","What should create_directories do when p already exists but is not a directory?","2017-11 (Albuquerque)","|Nothing To Do|","","`#103744 `__","" +"`LWG2941 `__","[thread.req.timing] wording should apply to both member and namespace-level functions","2017-11 (Albuquerque)","|Nothing To Do|","","`#103745 `__","" +"`LWG2944 `__","LWG 2905 accidentally removed requirement that construction of the deleter doesn't throw an exception","2017-11 (Albuquerque)","|Nothing To Do|","","`#103746 `__","" +"`LWG2945 `__","Order of template parameters in optional comparisons","2017-11 (Albuquerque)","|Complete|","","`#103747 `__","" +"`LWG2948 `__","unique_ptr does not define operator<< for stream output","2017-11 (Albuquerque)","|Complete|","","`#103748 `__","" +"`LWG2950 `__","std::byte operations are misspecified","2017-11 (Albuquerque)","|Complete|","","`#103749 `__","" +"`LWG2952 `__","iterator_traits should work for pointers to cv T","2017-11 (Albuquerque)","|Complete|","","`#103750 `__","" +"`LWG2953 `__","LWG 2853 should apply to deque::erase too","2017-11 (Albuquerque)","|Complete|","","`#103751 `__","" +"`LWG2958 `__","Moves improperly defined as deleted","2017-11 (Albuquerque)","|Complete|","","`#103752 `__","" +"`LWG2964 `__","Apparently redundant requirement for dynamic_pointer_cast","2017-11 (Albuquerque)","","","`#100224 `__","" +"`LWG2965 `__","Non-existing path::native_string() in filesystem_error::what() specification","2017-11 (Albuquerque)","|Nothing To Do|","","`#103753 `__","" +"`LWG2972 `__","What is ``is_trivially_destructible_v``\ ?","2017-11 (Albuquerque)","|Complete|","","`#103754 `__","" +"`LWG2976 `__","Dangling uses_allocator specialization for packaged_task","2017-11 (Albuquerque)","|Complete|","20","`#103755 `__","Originally implemented in LLVM 6 but reverted later. Old documentation incorrectly said it was implemented." +"`LWG2977 `__","unordered_meow::merge() has incorrect Throws: clause","2017-11 (Albuquerque)","|Nothing To Do|","","`#103756 `__","" +"`LWG2978 `__","Hash support for pmr::string and friends","2017-11 (Albuquerque)","|Complete|","16","`#103757 `__","" +"`LWG2979 `__","aligned_union should require complete object types","2017-11 (Albuquerque)","|Complete|","","`#103758 `__","" +"`LWG2980 `__","Cannot compare_exchange empty pointers","2017-11 (Albuquerque)","","","`#100225 `__","" +"`LWG2981 `__","Remove redundant deduction guides from standard library","2017-11 (Albuquerque)","|Nothing To Do|","","`#103759 `__","" +"`LWG2982 `__","Making size_type consistent in associative container deduction guides","2017-11 (Albuquerque)","","","`#100226 `__","" +"`LWG2988 `__","Clause 32 cleanup missed one typename","2017-11 (Albuquerque)","|Complete|","13","`#103760 `__","" +"`LWG2993 `__","reference_wrapper conversion from T&&","2017-11 (Albuquerque)","|Complete|","13","`#103761 `__","" +"`LWG2998 `__","Requirements on function objects passed to {``forward_``,}list-specific algorithms","2017-11 (Albuquerque)","|Nothing To Do|","","`#103762 `__","" +"`LWG3001 `__","weak_ptr::element_type needs remove_extent_t","2017-11 (Albuquerque)","|Complete|","14","`#103763 `__","" +"`LWG3024 `__","variant's copies must be deleted instead of disabled via SFINAE","2017-11 (Albuquerque)","|Complete|","","`#103764 `__","" +"","","","","","","" +"`LWG2164 `__","What are the semantics of ``vector.emplace(vector.begin(), vector.back())``\ ?","2018-03 (Jacksonville)","|Complete|","","`#103765 `__","" +"`LWG2243 `__","``istream::putback``\ problem","2018-03 (Jacksonville)","|Complete|","","`#103766 `__","" +"`LWG2816 `__","``resize_file``\ has impossible postcondition","2018-03 (Jacksonville)","|Nothing To Do|","","`#103770 `__","" +"`LWG2843 `__","Unclear behavior of ``std::pmr::memory_resource::do_allocate()``\ ","2018-03 (Jacksonville)","|Complete|","","`#103771 `__","" +"`LWG2849 `__","Why does ``!is_regular_file(from)``\ cause ``copy_file``\ to report a ""file already exists"" error?","2018-03 (Jacksonville)","|Nothing To Do|","","`#103772 `__","" +"`LWG2851 `__","``std::filesystem``\ enum classes are now underspecified","2018-03 (Jacksonville)","|Nothing To Do|","","`#103774 `__","" +"`LWG2946 `__","LWG 2758's resolution missed further corrections","2018-03 (Jacksonville)","|Complete|","","`#103775 `__","" +"`LWG2969 `__","``polymorphic_allocator::construct()``\ shouldn't pass ``resource()``\ ","2018-03 (Jacksonville)","|Complete|","","`#103776 `__","" +"`LWG2975 `__","Missing case for ``pair``\ construction in scoped and polymorphic allocators","2018-03 (Jacksonville)","","","`#100227 `__","" +"`LWG2989 `__","``path``\ 's stream insertion operator lets you insert everything under the sun","2018-03 (Jacksonville)","|Complete|","","`#103777 `__","" +"`LWG3000 `__","``monotonic_memory_resource::do_is_equal``\ uses ``dynamic_cast``\ unnecessarily","2018-03 (Jacksonville)","|Complete|","16","`#103778 `__","" +"`LWG3002 `__","[networking.ts] ``basic_socket_acceptor::is_open()``\ isn't ``noexcept``\ ","2018-03 (Jacksonville)","|Nothing To Do|","","`#100228 `__","" +"`LWG3004 `__","|sect|\ [string.capacity] and |sect|\ [vector.capacity] should specify time complexity for ``capacity()``\ ","2018-03 (Jacksonville)","|Nothing To Do|","","`#103779 `__","" +"`LWG3005 `__","Destruction order of arrays by ``make_shared/allocate_shared``\ only recommended?","2018-03 (Jacksonville)","","","`#100229 `__","" +"`LWG3007 `__","``allocate_shared``\ should rebind allocator to *cv*-unqualified ``value_type``\ for construction","2018-03 (Jacksonville)","","","`#100230 `__","" +"`LWG3009 `__","Including ````\ doesn't provide ``std::size/empty/data``\ ","2018-03 (Jacksonville)","|Complete|","","`#103780 `__","" +"`LWG3010 `__","[networking.ts] ``uses_executor``\ says ""if a type ``T::executor_type``\ exists""","2018-03 (Jacksonville)","|Nothing To Do|","","`#100231 `__","" +"`LWG3013 `__","``(recursive_)directory_iterator``\ construction and traversal should not be ``noexcept``\ ","2018-03 (Jacksonville)","|Complete|","","`#103781 `__","" +"`LWG3014 `__","More ``noexcept``\ issues with filesystem operations","2018-03 (Jacksonville)","|Complete|","","`#103782 `__","" +"`LWG3015 `__","``copy_options::*unspecified*``\ underspecified","2018-03 (Jacksonville)","|Nothing To Do|","","`#103783 `__","" +"`LWG3017 `__","``list splice``\ functions should use ``addressof``\ ","2018-03 (Jacksonville)","|Complete|","","`#103784 `__","" +"`LWG3020 `__","[networking.ts] Remove spurious nested ``value_type``\ buffer sequence requirement","2018-03 (Jacksonville)","|Nothing To Do|","","`#100232 `__","" +"`LWG3026 `__","``filesystem::weakly_canonical``\ still defined in terms of ``canonical(p, base)``\ ","2018-03 (Jacksonville)","|Complete|","","`#103785 `__","" +"`LWG3030 `__","Who shall meet the requirements of ``try_lock``\ ?","2018-03 (Jacksonville)","|Nothing To Do|","","`#103786 `__","" +"`LWG3034 `__","P0767R1 breaks previously-standard-layout types","2018-03 (Jacksonville)","|Complete|","","`#103787 `__","" +"`LWG3035 `__","``std::allocator``\ 's constructors should be ``constexpr``\ ","2018-03 (Jacksonville)","|Complete|","","`#103788 `__","" +"`LWG3039 `__","Unnecessary ``decay``\ in ``thread``\ and ``packaged_task``\ ","2018-03 (Jacksonville)","|Complete|","","`#103789 `__","" +"`LWG3041 `__","Unnecessary ``decay``\ in ``reference_wrapper``\ ","2018-03 (Jacksonville)","|Complete|","","`#103790 `__","" +"`LWG3042 `__","``is_literal_type_v``\ should be inline","2018-03 (Jacksonville)","|Complete|","","`#103791 `__","" +"`LWG3043 `__","Bogus postcondition for ``filesystem_error``\ constructor","2018-03 (Jacksonville)","|Complete|","","`#103792 `__","" +"`LWG3045 `__","``atomic``\ doesn't have ``value_type``\ or ``difference_type``\ ","2018-03 (Jacksonville)","|Complete|","18","`#103793 `__","" +"`LWG3048 `__","``transform_reduce(exec, first1, last1, first2, init)``\ discards execution policy","2018-03 (Jacksonville)","|Complete|","17","`#103794 `__","" +"`LWG3051 `__","Floating point classifications were inadvertently changed in P0175","2018-03 (Jacksonville)","|Nothing To Do|","","`#103795 `__","" +"`LWG3075 `__","``basic_string``\ needs deduction guides from ``basic_string_view``\ ","2018-03 (Jacksonville)","|Complete|","","`#103796 `__","" +"","","","","","","" +"`LWG2139 `__","What is a user-defined type?","2018-06 (Rapperswil)","","","`#100233 `__","" +"`LWG2970 `__","Return type of std::visit misspecified","2018-06 (Rapperswil)","|Complete|","11","`#103797 `__","" +"`LWG3058 `__","Parallel adjacent_difference shouldn't require creating temporaries","2018-06 (Rapperswil)","","","`#100234 `__","" +"`LWG3062 `__","Unnecessary decay_t in is_execution_policy_v should be remove_cvref_t","2018-06 (Rapperswil)","|Complete|","17","`#100235 `__","" +"`LWG3067 `__","recursive_directory_iterator::pop must invalidate","2018-06 (Rapperswil)","|Nothing To Do|","","`#103798 `__","" +"`LWG3071 `__","[networking.ts] read_until still refers to ""input sequence""","2018-06 (Rapperswil)","|Nothing To Do|","","`#103799 `__","" +"`LWG3074 `__","Non-member functions for valarray should only deduce from the valarray","2018-06 (Rapperswil)","","","`#100236 `__","" +"`LWG3076 `__","basic_string CTAD ambiguity","2018-06 (Rapperswil)","|Complete|","","`#103800 `__","" +"`LWG3079 `__","LWG 2935 forgot to fix the existing_p overloads of create_directory","2018-06 (Rapperswil)","|Nothing To Do|","","`#103801 `__","" +"`LWG3080 `__","Floating point from_chars pattern specification breaks round-tripping","2018-06 (Rapperswil)","","","`#100237 `__","" +"`LWG3083 `__","What should ios::iword(-1) do?","2018-06 (Rapperswil)","|Nothing To Do|","","`#103802 `__","" +"`LWG3094 `__","[time.duration.io]p4 makes surprising claims about encoding","2018-06 (Rapperswil)","","","`#100238 `__","" +"`LWG3100 `__","Unnecessary and confusing ""empty span"" wording","2018-06 (Rapperswil)","|Nothing To Do|","","`#103803 `__","" +"`LWG3102 `__","Clarify span iterator and ``const_iterator`` behavior","2018-06 (Rapperswil)","|Complete|","","`#103804 `__","" +"`LWG3104 `__","Fixing duration division","2018-06 (Rapperswil)","|Complete|","","`#103805 `__","" +"","","","","","","" +"`LWG2183 `__","Muddled allocator requirements for ``match_results``\ constructors","2018-11 (San Diego)","|Complete|","","`#103806 `__","" +"`LWG2184 `__","Muddled allocator requirements for ``match_results``\ assignments","2018-11 (San Diego)","|Complete|","","`#103807 `__","" +"`LWG2412 `__","``promise::set_value()``\ and ``promise::get_future()``\ should not race","2018-11 (San Diego)","","","`#100239 `__","" +"`LWG2499 `__","``operator>>(basic_istream&, CharT*)``\ makes it hard to avoid buffer overflows","2018-11 (San Diego)","|Nothing To Do|","","`#103808 `__","Resolved by `P0487R1 `__" +"`LWG2682 `__","``filesystem::copy()``\ won't create a symlink to a directory","2018-11 (San Diego)","|Nothing To Do|","","`#103504 `__","" +"`LWG2697 `__","[concurr.ts] Behavior of ``future/shared_future``\ unwrapping constructor when given an invalid ``future``\ ","2018-11 (San Diego)","","","`#100240 `__","" +"`LWG2797 `__","Trait precondition violations","2018-11 (San Diego)","|Nothing To Do|","","`#103809 `__","Resolved by `P1285R0 `__" +"`LWG2936 `__","Path comparison is defined in terms of the generic format","2018-11 (San Diego)","|Complete|","","`#103810 `__","" +"`LWG2943 `__","Problematic specification of the wide version of ``basic_filebuf::open``\ ","2018-11 (San Diego)","|Nothing To Do|","","`#103811 `__","" +"`LWG2960 `__","[fund.ts.v3] ``nonesuch``\ is insufficiently useless","2018-11 (San Diego)","|Complete|","","`#103812 `__","" +"`LWG2995 `__","``basic_stringbuf``\ default constructor forbids it from using SSO capacity","2018-11 (San Diego)","|Complete|","20","`#100242 `__","" +"`LWG2996 `__","Missing rvalue overloads for ``shared_ptr``\ operations","2018-11 (San Diego)","|Complete|","17","`#103813 `__","" +"`LWG3008 `__","``make_shared``\ (sub)object destruction semantics are not specified","2018-11 (San Diego)","|Complete|","16","`#103814 `__","" +"`LWG3022 `__","``is_convertible``\ may lead to ODR","2018-11 (San Diego)","|Nothing To Do|","","`#103815 `__","Resolved by `P1285R0 `__" +"`LWG3025 `__","Map-like container deduction guides should use ``pair``\ , not ``pair``\ ","2018-11 (San Diego)","|Complete|","","`#103817 `__","" +"`LWG3031 `__","Algorithms and predicates with non-const reference arguments","2018-11 (San Diego)","","","`#100243 `__","" +"`LWG3037 `__","``polymorphic_allocator``\ and incomplete types","2018-11 (San Diego)","|Complete|","16","`#103818 `__","" +"`LWG3038 `__","``polymorphic_allocator::allocate``\ should not allow integer overflow to create vulnerabilities","2018-11 (San Diego)","|Complete|","14","`#103819 `__","" +"`LWG3054 `__","``uninitialized_copy``\ appears to not be able to meet its exception-safety guarantee","2018-11 (San Diego)","|Nothing To Do|","","`#103820 `__","" +"`LWG3065 `__","LWG 2989 missed that all ``path``\ 's other operators should be hidden friends as well","2018-11 (San Diego)","|Complete|","","`#103821 `__","" +"`LWG3096 `__","``path::lexically_relative``\ is confused by trailing slashes","2018-11 (San Diego)","|Complete|","","`#103822 `__","" +"`LWG3116 `__","``OUTERMOST_ALLOC_TRAITS``\ needs ``remove_reference_t``\ ","2018-11 (San Diego)","","","`#100244 `__","" +"`LWG3122 `__","``__cpp_lib_chrono_udls``\ was accidentally dropped","2018-11 (San Diego)","|Complete|","","`#103823 `__","" +"`LWG3127 `__","``basic_osyncstream::rdbuf``\ needs a ``const_cast``\ ","2018-11 (San Diego)","|Complete|","18","`#103824 `__","" +"`LWG3128 `__","``strstream::rdbuf``\ needs a ``const_cast``\ ","2018-11 (San Diego)","|Nothing To Do|","","`#103825 `__","" +"`LWG3129 `__","``regex_token_iterator``\ constructor uses wrong pointer arithmetic","2018-11 (San Diego)","","","`#100245 `__","" +"`LWG3130 `__","|sect|\ [input.output] needs many ``addressof``\ ","2018-11 (San Diego)","|Complete|","20","`#100246 `__","" +"`LWG3131 `__","``addressof``\ all the things","2018-11 (San Diego)","","","`#100248 `__","" +"`LWG3132 `__","Library needs to ban macros named ``expects``\ or ``ensures``\ ","2018-11 (San Diego)","|Nothing To Do|","","`#103826 `__","" +"`LWG3134 `__","[fund.ts.v3] LFTSv3 contains extraneous [meta] variable templates that should have been deleted by P09961","2018-11 (San Diego)","|Nothing To Do|","","`#103827 `__","Resolved by `P1210R0 `__" +"`LWG3137 `__","Header for ``__cpp_lib_to_chars``\ ","2018-11 (San Diego)","|Complete|","","`#103828 `__","" +"`LWG3140 `__","``COMMON_REF``\ is unimplementable as specified","2018-11 (San Diego)","|Nothing To Do|","","`#103829 `__","" +"`LWG3145 `__","``file_clock``\ breaks ABI for C++17 implementations","2018-11 (San Diego)","|Complete|","","`#103830 `__","" +"`LWG3147 `__","Definitions of ""likely"" and ""unlikely"" are likely to cause problems","2018-11 (San Diego)","|Nothing To Do|","","`#100249 `__","" +"`LWG3148 `__","````\ should be freestanding","2018-11 (San Diego)","","","`#100250 `__","" +"`LWG3153 `__","``Common``\ and ``common_type``\ have too little in common","2018-11 (San Diego)","|Complete|","13","`#103831 `__","" +"`LWG3154 `__","``Common``\ and ``CommonReference``\ have a common defect","2018-11 (San Diego)","|Nothing To Do|","","`#103832 `__","" +"","","","","","","" +"`LWG3012 `__","``atomic``\ is unimplementable for non-``is_trivially_copy_constructible T``\ ","2019-02 (Kona)","","","`#100252 `__","" +"`LWG3040 `__","``basic_string_view::starts_with``\ *Effects* are incorrect","2019-02 (Kona)","|Complete|","","`#103834 `__","" +"`LWG3077 `__","``(push|emplace)_back``\ should invalidate the ``end``\ iterator","2019-02 (Kona)","|Nothing To Do|","","`#103835 `__","" +"`LWG3087 `__","One final ``&x``\ in |sect|\ [list.ops]","2019-02 (Kona)","|Nothing To Do|","","`#103836 `__","" +"`LWG3101 `__","``span``\ 's ``Container``\ constructors need another constraint","2019-02 (Kona)","|Complete|","","`#103837 `__","" +"`LWG3112 `__","``system_error``\ and ``filesystem_error``\ constructors taking a ``string``\ may not be able to meet their postconditions","2019-02 (Kona)","|Nothing To Do|","","`#100253 `__","" +"`LWG3119 `__","Program-definedness of closure types","2019-02 (Kona)","|Nothing To Do|","","`#103838 `__","" +"`LWG3133 `__","Modernizing numeric type requirements","2019-02 (Kona)","","","`#100254 `__","" +"`LWG3144 `__","``span``\ does not have a ``const_pointer``\ typedef","2019-02 (Kona)","|Complete|","","`#103839 `__","" +"`LWG3173 `__","Enable CTAD for ``ref-view``\ ","2019-02 (Kona)","|Complete|","15","`#103840 `__","" +"`LWG3179 `__","``subrange``\ should always model ``Range``\ ","2019-02 (Kona)","|Nothing To Do|","","`#103842 `__","" +"`LWG3180 `__","Inconsistently named return type for ``ranges::minmax_element``\ ","2019-02 (Kona)","|Complete|","15","`#103844 `__","" +"`LWG3182 `__","Specification of ``Same``\ could be clearer","2019-02 (Kona)","|Complete|","15","`#103845 `__","" +"","","","","","","" +"`LWG2899 `__","``is_(nothrow_)move_constructible``\ and ``tuple``\ , ``optional``\ and ``unique_ptr``\ ","2019-07 (Cologne)","","","`#100255 `__","" +"`LWG3055 `__","``path::operator+=(*single-character*)``\ misspecified","2019-07 (Cologne)","|Complete|","7","`#103846 `__","" +"`LWG3158 `__","``tuple(allocator_arg_t, const Alloc&)``\ should be conditionally explicit","2019-07 (Cologne)","|Complete|","10","`#103847 `__","" +"`LWG3169 `__","``ranges``\ permutation generators discard useful information","2019-07 (Cologne)","|Complete|","15","`#103848 `__","" +"`LWG3183 `__","Normative permission to specialize Ranges variable templates","2019-07 (Cologne)","|Nothing To Do|","","`#103849 `__","" +"`LWG3184 `__","Inconsistencies in ``bind_front``\ wording","2019-07 (Cologne)","|Complete|","13","`#103850 `__","" +"`LWG3185 `__","Uses-allocator construction functions missing ``constexpr``\ and ``noexcept``\ ","2019-07 (Cologne)","|Complete|","16","`#103851 `__","" +"`LWG3186 `__","``ranges``\ removal, partition, and ``partial_sort_copy``\ algorithms discard useful information","2019-07 (Cologne)","|Complete|","15","`#103852 `__","" +"`LWG3187 `__","`P0591R4 `__ reverted DR 2586 fixes to ``scoped_allocator_adaptor::construct()``\ ","2019-07 (Cologne)","","","`#100256 `__","" +"`LWG3191 `__","``std::ranges::shuffle``\ synopsis does not match algorithm definition","2019-07 (Cologne)","|Complete|","15","`#103853 `__","" +"`LWG3196 `__","``std::optional``\ is ill-formed is ``T``\ is an array","2019-07 (Cologne)","|Complete|","","`#103854 `__","" +"`LWG3198 `__","Bad constraint on ``std::span::span()``\ ","2019-07 (Cologne)","|Complete|","","`#103856 `__","" +"`LWG3199 `__","``istream >> bitset<0>``\ fails","2019-07 (Cologne)","|Complete|","10","`#100257 `__","" +"`LWG3202 `__","P0318R1 was supposed to be revised","2019-07 (Cologne)","|Complete|","","`#103857 `__","" +"`LWG3206 `__","``year_month_day``\ conversion to ``sys_days``\ uses not-existing member function","2019-07 (Cologne)","|Complete|","","`#103858 `__","" +"`LWG3208 `__","``Boolean``\ 's expression requirements are ordered inconsistently","2019-07 (Cologne)","|Nothing To Do|","","`#103860 `__","" +"`LWG3209 `__","Expression in ``year::ok()``\ returns clause is ill-formed","2019-07 (Cologne)","|Complete|","","`#103861 `__","" +"","","","","","","" +"`LWG3231 `__","``year_month_day_last::day``\ specification does not cover ``!ok()``\ values","2019-11 (Belfast)","|Nothing To Do|","","`#103862 `__","" +"`LWG3225 `__","``zoned_time``\ converting constructor shall not be ``noexcept``\ ","2019-11 (Belfast)","|Complete|","19","`#103863 `__","" +"`LWG3190 `__","``std::allocator::allocate``\ sometimes returns too little storage","2019-11 (Belfast)","|Complete|","14","`#103864 `__","" +"`LWG3218 `__","Modifier for ``%d``\ parse flag does not match POSIX and ``format``\ specification","2019-11 (Belfast)","","","`#100258 `__","" +"`LWG3224 `__","``zoned_time``\ constructor from ``TimeZonePtr``\ does not specify initialization of ``tp_``\ ","2019-11 (Belfast)","|Complete|","19","`#103865 `__","" +"`LWG3230 `__","Format specifier ``%y/%Y``\ is missing locale alternative versions","2019-11 (Belfast)","|Complete|","16","`#103868 `__","" +"`LWG3232 `__","Inconsistency in ``zoned_time``\ deduction guides","2019-11 (Belfast)","|Complete|","19","`#103869 `__","" +"`LWG3222 `__","P0574R1 introduced preconditions on non-existent parameters","2019-11 (Belfast)","","","`#100259 `__","" +"`LWG3221 `__","Result of ``year_month``\ arithmetic with ``months``\ is ambiguous","2019-11 (Belfast)","|Complete|","8","`#103870 `__","" +"`LWG3235 `__","``parse``\ manipulator without abbreviation is not callable","2019-11 (Belfast)","","","`#100262 `__","" +"`LWG3246 `__","LWG3246: What are the constraints on the template parameter of `basic_format_arg`?","2019-11 (Belfast)","|Nothing To Do|","","`#100263 `__","" +"`LWG3253 `__","``basic_syncbuf::basic_syncbuf()``\ should not be explicit","2019-11 (Belfast)","|Complete|","20","`#100264 `__","" +"`LWG3245 `__","Unnecessary restriction on ``'%p'``\ parse specifier","2019-11 (Belfast)","","","`#100265 `__","" +"`LWG3244 `__","Constraints for ``Source``\ in |sect|\ [fs.path.req] insufficiently constrainty","2019-11 (Belfast)","","","`#100266 `__","" +"`LWG3241 `__","``chrono-spec``\ grammar ambiguity in |sect|\ [time.format]","2019-11 (Belfast)","|Complete|","16","`#103871 `__","" +"`LWG3257 `__","Missing feature testing macro update from P0858","2019-11 (Belfast)","|Complete|","12","`#103873 `__","" +"`LWG3256 `__","Feature testing macro for ``constexpr``\ algorithms","2019-11 (Belfast)","|Complete|","13","`#103874 `__","" +"`LWG3273 `__","Specify ``weekday_indexed``\ to range of ``[0, 7]``\ ","2019-11 (Belfast)","|Complete|","16","`#103875 `__","" +"`LWG3070 `__","``path::lexically_relative``\ causes surprising results if a filename can also be a *root-name*","2019-11 (Belfast)","","","`#100267 `__","" +"`LWG3266 `__","``to_chars(bool)``\ should be deleted","2019-11 (Belfast)","|Complete|","14","`#103876 `__","" +"`LWG3272 `__","``%I%p``\ should parse/format ``duration``\ since midnight","2019-11 (Belfast)","","","`#100268 `__","" +"`LWG3259 `__","The definition of *constexpr iterators* should be adjusted","2019-11 (Belfast)","|Nothing To Do|","","`#103877 `__","" +"`LWG3103 `__","Errors in taking subview of ``span``\ should be ill-formed where possible","2019-11 (Belfast)","|Complete|","11","`#103878 `__","" +"`LWG3274 `__","Missing feature test macro for ````\ ","2019-11 (Belfast)","|Complete|","11","`#103880 `__","" +"`LWG3276 `__","Class ``split_view::outer_iterator::value_type``\ should inherit from ``view_interface``\ ","2019-11 (Belfast)","|Complete|","15","`#103881 `__","" +"`LWG3277 `__","Pre-increment on prvalues is not a requirement of ``weakly_incrementable``\ ","2019-11 (Belfast)","|Nothing To Do|","","`#103882 `__","" +"`LWG3149 `__","``DefaultConstructible``\ should require default initialization","2019-11 (Belfast)","|Complete|","13","`#103883 `__","" +"","","","","","","" +"`LWG1203 `__","More useful rvalue stream insertion","2020-02 (Prague)","|Complete|","12","`#103884 `__","" +"`LWG2859 `__","Definition of *reachable* in [ptr.launder] misses pointer arithmetic from pointer-interconvertible object","2020-02 (Prague)","","","`#100269 `__","" +"`LWG3018 `__","``shared_ptr``\ of function type","2020-02 (Prague)","|Nothing To Do|","","`#103885 `__","" +"`LWG3050 `__","Conversion specification problem in ``chrono::duration``\ constructor","2020-02 (Prague)","|Complete|","19","`#103887 `__","" +"`LWG3141 `__","``CopyConstructible``\ doesn't preserve source values","2020-02 (Prague)","|Nothing To Do|","","`#103889 `__","" +"`LWG3150 `__","``UniformRandomBitGenerator``\ should validate ``min``\ and ``max``\ ","2020-02 (Prague)","|Complete|","13","`#103890 `__","" +"`LWG3175 `__","The ``CommonReference``\ requirement of concept ``SwappableWith``\ is not satisfied in the example","2020-02 (Prague)","|Complete|","13","`#103891 `__","" +"`LWG3194 `__","``ConvertibleTo``\ prose does not match code","2020-02 (Prague)","|Complete|","13","`#103892 `__","" +"`LWG3200 `__","``midpoint``\ should not constrain ``T``\ is complete","2020-02 (Prague)","|Nothing To Do|","","`#103893 `__","" +"`LWG3201 `__","``lerp``\ should be marked as ``noexcept``\ ","2020-02 (Prague)","|Complete|","","`#103894 `__","" +"`LWG3226 `__","``zoned_time``\ constructor from ``string_view``\ should accept ``zoned_time``\ ","2020-02 (Prague)","|Complete|","19","`#103896 `__","" +"`LWG3233 `__","Broken requirements for ``shared_ptr``\ converting constructors","2020-02 (Prague)","|Complete|","19","`#103897 `__","" +"`LWG3237 `__","LWG 3038 and 3190 have inconsistent PRs","2020-02 (Prague)","|Complete|","16","`#103899 `__","" +"`LWG3238 `__","Insufficiently-defined behavior of ``std::function``\ deduction guides","2020-02 (Prague)","|Nothing To Do|","","`#103901 `__","" +"`LWG3242 `__","``std::format``\ : missing rules for ``arg-id``\ in ``width``\ and ``precision``\ ","2020-02 (Prague)","|Complete|","14","`#103902 `__","" +"`LWG3243 `__","``std::format``\ and negative zeroes","2020-02 (Prague)","|Complete|","14","`#103904 `__","" +"`LWG3247 `__","``ranges::iter_move``\ should perform ADL-only lookup of ``iter_move``\ ","2020-02 (Prague)","|Complete|","15","`#103906 `__","" +"`LWG3248 `__","``std::format``\ ``#b``\ , ``#B``\ , ``#o``\ , ``#x``\ , and ``#X``\ presentation types misformat negative numbers","2020-02 (Prague)","|Complete|","14","`#103907 `__","" +"`LWG3250 `__","``std::format``\ : ``#``\ (alternate form) for NaN and inf","2020-02 (Prague)","|Complete|","14","`#103908 `__","" +"`LWG3251 `__","Are ``std::format``\ alignment specifiers applied to string arguments?","2020-02 (Prague)","|Complete|","14","`#103909 `__","" +"`LWG3252 `__","Parse locale's aware modifiers for commands are not consistent with POSIX spec","2020-02 (Prague)","","","`#100271 `__","" +"`LWG3254 `__","Strike ``stop_token``\ 's ``operator!=``\ ","2020-02 (Prague)","|Complete|","17","`#103910 `__","" +"`LWG3255 `__","``span``\ 's ``array``\ constructor is too strict","2020-02 (Prague)","|Complete|","","`#103911 `__","" +"`LWG3260 `__","``year_month*``\ arithmetic rejects durations convertible to years","2020-02 (Prague)","","","`#100274 `__","" +"`LWG3262 `__","Formatting of negative durations is not specified","2020-02 (Prague)","|Complete|","16","`#103912 `__","" +"`LWG3264 `__","``sized_range``\ and ``ranges::size``\ redundantly use ``disable_sized_range``\ ","2020-02 (Prague)","|Complete|","15","`#103913 `__","" +"`LWG3269 `__","Parse manipulators do not specify the result of the extraction from stream","2020-02 (Prague)","","","`#100275 `__","" +"`LWG3270 `__","Parsing and formatting ``%j``\ with ``duration``\ s","2020-02 (Prague)","|Partial|","","`#100418 `__","" +"`LWG3280 `__","View converting constructors can cause constraint recursion and are unneeded","2020-02 (Prague)","|Complete|","15","`#103914 `__","" +"`LWG3281 `__","Conversion from ``*pair-like*``\ types to ``subrange``\ is a silent semantic promotion","2020-02 (Prague)","|Complete|","13","`#103915 `__","" +"`LWG3282 `__","``subrange``\ converting constructor should disallow derived to base conversions","2020-02 (Prague)","|Complete|","15","`#103916 `__","" +"`LWG3284 `__","``random_access_iterator``\ semantic constraints accidentally promote difference type using unary negate","2020-02 (Prague)","|Nothing To Do|","","`#103918 `__","" +"`LWG3285 `__","The type of a customization point object shall satisfy ``semiregular``\ ","2020-02 (Prague)","|Nothing To Do|","","`#103919 `__","" +"`LWG3286 `__","``ranges::size``\ is not required to be valid after a call to ``ranges::begin``\ on an input range","2020-02 (Prague)","|Complete|","15","`#103920 `__","" +"`LWG3291 `__","``iota_view::iterator``\ has the wrong ``iterator_category``\ ","2020-02 (Prague)","|Complete|","15","`#103921 `__","" +"`LWG3292 `__","``iota_view``\ is under-constrained","2020-02 (Prague)","|Complete|","15","`#103922 `__","" +"`LWG3294 `__","``zoned_time``\ deduction guides misinterprets ``string``\ /``char*``\ ","2020-02 (Prague)","|Complete|","19","`#103924 `__","" +"`LWG3296 `__","Inconsistent default argument for ``basic_regex<>::assign``\ ","2020-02 (Prague)","|Complete|","","`#103925 `__","" +"`LWG3299 `__","Pointers don't need customized iterator behavior","2020-02 (Prague)","|Complete|","15","`#103926 `__","" +"`LWG3300 `__","Non-array ``ssize``\ overload is underconstrained","2020-02 (Prague)","|Nothing To Do|","","`#103929 `__","" +"`LWG3301 `__","``transform_view::iterator``\ has incorrect ``iterator_category``\ ","2020-02 (Prague)","|Complete|","15","`#103932 `__","" +"`LWG3302 `__","Range adaptor objects ``keys``\ and ``values``\ are unspecified","2020-02 (Prague)","|Complete|","16","`#103933 `__","" +"`LWG3303 `__","Bad ""``constexpr``\ "" marker for ``destroy/destroy_n``\ ","2020-02 (Prague)","","","`#101693 `__","" +"`LWG3304 `__","Allocate functions of ``std::polymorphic_allocator``\ should require ``[[nodiscard]]``\ ","2020-02 (Prague)","|Complete|","16","`#103934 `__","" +"`LWG3307 `__","``std::allocator().allocate(n)``\ ","2020-02 (Prague)","|Complete|","20","`#100422 `__","" +"`LWG3310 `__","Replace ``SIZE_MAX``\ with ``numeric_limits::max()``\ ","2020-02 (Prague)","|Complete|","16","`#103936 `__","" +"`LWG3313 `__","``join_view::iterator::operator--``\ is incorrectly constrained","2020-02 (Prague)","|Complete|","14","`#103937 `__","" +"`LWG3314 `__","Is stream insertion behavior locale dependent when ``Period::type``\ is ``micro``\ ?","2020-02 (Prague)","|Complete|","16","`#103940 `__","" +"`LWG3315 `__","Correct Allocator Default Behavior","2020-02 (Prague)","|Complete|","","`#100426 `__","" +"`LWG3316 `__","Correctly define epoch for ``utc_clock``\ / ``utc_timepoint``\ ","2020-02 (Prague)","","","`#100428 `__","" +"`LWG3317 `__","Incorrect ``operator<<``\ for floating-point durations","2020-02 (Prague)","|Complete|","16","`#100429 `__","" +"`LWG3318 `__","Clarify whether clocks can represent time before their epoch","2020-02 (Prague)","","","`#100430 `__","" +"`LWG3319 `__","Properly reference specification of IANA time zone database","2020-02 (Prague)","|Nothing To Do|","","`#103941 `__","" +"`LWG3320 `__","``span::cbegin/cend``\ methods produce different results than ``std::[ranges::]cbegin/cend``\ ","2020-02 (Prague)","|Complete|","","`#103942 `__","" +"`LWG3321 `__","``uninitialized_construct_using_allocator``\ should use ``construct_at``\ ","2020-02 (Prague)","|Complete|","16","`#103943 `__","" +"`LWG3323 `__","``*has-tuple-element*``\ helper concept needs ``convertible_to``\ ","2020-02 (Prague)","|Complete|","16","`#103944 `__","" +"`LWG3324 `__","Special-case ``std::strong/weak/partial_order``\ for pointers","2020-02 (Prague)","|Complete|","14","`#103945 `__","" +"`LWG3325 `__","Constrain return type of transformation function for ``transform_view``\ ","2020-02 (Prague)","|Complete|","15","`#103947 `__","" +"`LWG3326 `__","``enable_view``\ has false positives","2020-02 (Prague)","|Complete|","15","`#103948 `__","" +"`LWG3327 `__","Format alignment specifiers vs. text direction","2020-02 (Prague)","|Nothing To Do|","","`#103949 `__","" +"`LWG3328 `__","Clarify that ``std::string``\ is not good for UTF-8","2020-02 (Prague)","|Nothing To Do|","","`#100431 `__","" +"`LWG3329 `__","``totally_ordered_with``\ both directly and indirectly requires ``common_reference_with``\ ","2020-02 (Prague)","|Complete|","13","`#103950 `__","" +"`LWG3330 `__","Include ````\ from most library headers","2020-02 (Prague)","|Complete|","13","`#103951 `__","" +"`LWG3331 `__","Define ``totally_ordered/_with``\ in terms of ``partially-ordered-with``\ ","2020-02 (Prague)","|Complete|","13","`#103952 `__","" +"`LWG3332 `__","Issue in |sect|\ [time.format]","2020-02 (Prague)","|Complete|","16","`#103953 `__","" +"`LWG3334 `__","``basic_osyncstream``\ move assignment and destruction calls ``basic_syncbuf::emit()``\ twice","2020-02 (Prague)","|Complete|","18","`#103954 `__","" +"`LWG3335 `__","Resolve C++20 NB comments US 273 and GB 274","2020-02 (Prague)","|Complete|","15","`#103955 `__","" +"`LWG3338 `__","Rename ``default_constructible``\ to ``default_initializable``\ ","2020-02 (Prague)","|Complete|","13","`#103956 `__","" +"`LWG3340 `__","Formatting functions should throw on argument/format string mismatch in |sect|\ [format.functions]","2020-02 (Prague)","|Complete|","14","`#103957 `__","" +"`LWG3346 `__","``pair``\ and ``tuple``\ copy and move constructor have backwards specification","2020-02 (Prague)","|Nothing To Do|","","`#103958 `__","" +"`LWG3347 `__","``std::pair``\ now requires ``T``\ and ``U``\ to be less-than-comparable","2020-02 (Prague)","|Complete|","17","`#103959 `__","" +"`LWG3348 `__","``__cpp_lib_unwrap_ref``\ in wrong header","2020-02 (Prague)","|Complete|","12","`#103960 `__","" +"`LWG3349 `__","Missing ``__cpp_lib_constexpr_complex``\ for P0415R1","2020-02 (Prague)","|Complete|","16","`#103961 `__","" +"`LWG3350 `__","Simplify return type of ``lexicographical_compare_three_way``\ ","2020-02 (Prague)","|Complete|","17","`#103962 `__","" +"`LWG3351 `__","``ranges::enable_safe_range``\ should not be constrained","2020-02 (Prague)","|Complete|","15","`#103963 `__","" +"`LWG3352 `__","``strong_equality``\ isn't a thing","2020-02 (Prague)","|Complete|","19","`#103964 `__","" +"`LWG3354 `__","``has_strong_structural_equality``\ has a meaningless definition","2020-02 (Prague)","|Nothing To Do|","","`#103965 `__","" +"`LWG3355 `__","The memory algorithms should support move-only input iterators introduced by P1207","2020-02 (Prague)","|Complete|","15","`#103966 `__","" +"`LWG3356 `__","``__cpp_lib_nothrow_convertible``\ should be ``__cpp_lib_is_nothrow_convertible``\ ","2020-02 (Prague)","|Complete|","12","`#103967 `__","" +"`LWG3358 `__","|sect|\ [span.cons] is mistaken that ``to_address``\ can throw","2020-02 (Prague)","|Complete|","17","`#103968 `__","" +"`LWG3359 `__","````\ leap second support should allow for negative leap seconds","2020-02 (Prague)","|Complete|","21","`#100432 `__","" +"`LWG3360 `__","``three_way_comparable_with``\ is inconsistent with similar concepts","2020-02 (Prague)","|Nothing To Do|","","`#103969 `__","" +"`LWG3362 `__","Strike ``stop_source``\ 's ``operator!=``\ ","2020-02 (Prague)","|Complete|","17","`#100433 `__","" +"`LWG3363 `__","``drop_while_view``\ should opt-out of ``sized_range``\ ","2020-02 (Prague)","|Nothing To Do|","","`#103970 `__","" +"`LWG3364 `__","Initialize data members of ranges and their iterators","2020-02 (Prague)","|Complete|","16","`#103971 `__","" +"`LWG3367 `__","Integer-class conversions should not throw","2020-02 (Prague)","|Nothing To Do|","","`#103973 `__","" +"`LWG3369 `__","``span``\ 's deduction-guide for built-in arrays doesn't work","2020-02 (Prague)","|Complete|","14","`#103974 `__","" +"`LWG3371 `__","``visit_format_arg``\ and ``make_format_args``\ are not hidden friends","2020-02 (Prague)","|Complete|","14","`#103975 `__","" +"`LWG3372 `__","``vformat_to``\ should not try to deduce ``Out``\ twice","2020-02 (Prague)","|Complete|","14","`#103976 `__","" +"`LWG3373 `__","``{to,from}_chars_result``\ and ``format_to_n_result``\ need the ""we really mean what we say"" wording","2020-02 (Prague)","|Complete|","14","`#103977 `__","" +"`LWG3374 `__","P0653 + P1006 should have made the other ``std::to_address``\ overload ``constexpr``\ ","2020-02 (Prague)","|Complete|","12","`#103978 `__","" +"`LWG3375 `__","``decay``\ in ``viewable_range``\ should be ``remove_cvref``\ ","2020-02 (Prague)","|Complete|","15","`#103979 `__","" +"`LWG3377 `__","``elements_view::iterator``\ befriends a specialization of itself","2020-02 (Prague)","|Nothing To Do|","","`#103981 `__","" +"`LWG3379 `__","""``safe``\ "" in several library names is misleading","2020-02 (Prague)","|Complete|","15","`#103982 `__","" +"`LWG3380 `__","``common_type``\ and comparison categories","2020-02 (Prague)","|Complete|","15","`#103983 `__","" +"`LWG3381 `__","``begin``\ and ``data``\ must agree for ``contiguous_range``\ ","2020-02 (Prague)","|Nothing To Do|","","`#103984 `__","" +"`LWG3382 `__","NTTP for ``pair``\ and ``array``\ ","2020-02 (Prague)","|Nothing To Do|","","`#103985 `__","" +"`LWG3383 `__","|sect|\ [time.zone.leap.nonmembers] ``sys_seconds``\ should be replaced with ``seconds``\ ","2020-02 (Prague)","|Complete|","19","`#103987 `__","" +"`LWG3384 `__","``transform_view::*sentinel*``\ has an incorrect ``operator-``\ ","2020-02 (Prague)","|Complete|","15","`#103988 `__","" +"`LWG3385 `__","``common_iterator``\ is not sufficiently constrained for non-copyable iterators","2020-02 (Prague)","|Complete|","15","`#103989 `__","" +"`LWG3387 `__","|sect|\ [range.reverse.view] ``reverse_view``\ unintentionally requires ``range``\ ","2020-02 (Prague)","|Complete|","15","`#103990 `__","" +"`LWG3388 `__","``view``\ iterator types have ill-formed ``<=>``\ operators","2020-02 (Prague)","|Complete|","16","`#103991 `__","" +"`LWG3389 `__","A move-only iterator still does not have a ``counted_iterator``\ ","2020-02 (Prague)","|Complete|","15","`#103992 `__","" +"`LWG3390 `__","``make_move_iterator()``\ cannot be used to construct a ``move_iterator``\ for a move-only iterator","2020-02 (Prague)","|Complete|","14","`#103993 `__","" +"`LWG3393 `__","Missing/incorrect feature test macro for coroutines","2020-02 (Prague)","|Complete|","14","`#103994 `__","" +"`LWG3395 `__","Definition for three-way comparison needs to be updated (US 152)","2020-02 (Prague)","|Nothing To Do|","","`#100434 `__","" +"`LWG3396 `__","Clarify point of reference for ``source_location::current()``\ (DE 169)","2020-02 (Prague)","|Nothing To Do|","16","`#103995 `__","" +"`LWG3397 `__","``ranges::basic_istream_view::iterator``\ should not provide ``iterator_category``\ ","2020-02 (Prague)","|Complete|","16","`#103996 `__","" +"`LWG3398 `__","``tuple_element_t``\ is also wrong for ``const subrange``\ ","2020-02 (Prague)","|Complete|","14","`#103997 `__","" +"","","","","","","" +"`LWG3446 `__","``indirectly_readable_traits``\ ambiguity for types with both ``value_type``\ and ``element_type``\ ","2020-11 (Virtual)","|Complete|","13","`#103998 `__","" diff --git a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx20Papers.csv b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx20Papers.csv index e692bb2dc0..7fbccde688 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx20Papers.csv +++ b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx20Papers.csv @@ -1,206 +1,206 @@ -"Paper #","Paper Name","Meeting","Status","First released version","Notes" -"`P0463R1 `__","Endian just Endian","2017-07 (Toronto)","|Complete|","7","" -"`P0674R1 `__","Extending make_shared to Support Arrays","2017-07 (Toronto)","|Complete|","15","" -"","","","","","" -"`P0020R6 `__","Floating Point Atomic","2017-11 (Albuquerque)","|Complete|","18","The feature-test macro was not set until LLVM 20." -"`P0053R7 `__","C++ Synchronized Buffered Ostream","2017-11 (Albuquerque)","|Complete|","18","" -"`P0202R3 `__","Add constexpr modifiers to functions in and Headers","2017-11 (Albuquerque)","|Complete|","12","" -"`P0415R1 `__","Constexpr for ``std::complex``\ ","2017-11 (Albuquerque)","|Complete|","16","" -"`P0439R0 `__","Make ``std::memory_order``\ a scoped enumeration","2017-11 (Albuquerque)","|Complete|","","" -"`P0457R2 `__","String Prefix and Suffix Checking","2017-11 (Albuquerque)","|Complete|","6","" -"`P0550R2 `__","Transformation Trait ``remove_cvref``\ ","2017-11 (Albuquerque)","|Complete|","6","" -"`P0600R1 `__","nodiscard in the Library","2017-11 (Albuquerque)","|Complete|","16","" -"`P0616R0 `__","de-pessimize legacy algorithms with std::move","2017-11 (Albuquerque)","|Complete|","12","" -"`P0653R2 `__","Utility to convert a pointer to a raw pointer","2017-11 (Albuquerque)","|Complete|","6","" -"`P0718R2 `__","Atomic shared_ptr","2017-11 (Albuquerque)","","","" -"`P0767R1 `__","Deprecate POD","2017-11 (Albuquerque)","|Complete|","21","It was previously erroneously marked as complete in LLVM 7." -"`P0768R1 `__","Library Support for the Spaceship (Comparison) Operator","2017-11 (Albuquerque)","|Complete|","","" -"`P0777R1 `__","Treating Unnecessary ``decay``\ ","2017-11 (Albuquerque)","|Complete|","7","" -"","","","","","" -"`P0122R7 `__","","2018-03 (Jacksonville)","|Complete|","7","" -"`P0355R7 `__","Extending chrono to Calendars and Time Zones","2018-03 (Jacksonville)","|Partial|","","See the `Github issue `__ for detailed status" -"`P0551R3 `__","Thou Shalt Not Specialize ``std``\ Function Templates!","2018-03 (Jacksonville)","|Complete|","11","" -"`P0753R2 `__","Manipulators for C++ Synchronized Buffered Ostream","2018-03 (Jacksonville)","","","" -"`P0754R2 `__","","2018-03 (Jacksonville)","|Complete|","7","" -"`P0809R0 `__","Comparing Unordered Containers","2018-03 (Jacksonville)","|Nothing To Do|","","" -"`P0858R0 `__","Constexpr iterator requirements","2018-03 (Jacksonville)","|Complete|","12","" -"`P0905R1 `__","Symmetry for spaceship","2018-03 (Jacksonville)","|Complete|","7","" -"`P0966R1 `__","``string::reserve``\ Should Not Shrink","2018-03 (Jacksonville)","|Complete|","12","It was previously erroneously marked as complete in version 8. See `bug 45368 `__" -"","","","","","" -"`P0019R8 `__","Atomic Ref","2018-06 (Rapperswil)","|Complete|","19","" -"`P0458R2 `__","Checking for Existence of an Element in Associative Containers","2018-06 (Rapperswil)","|Complete|","13","" -"`P0475R1 `__","LWG 2511: guaranteed copy elision for piecewise construction","2018-06 (Rapperswil)","|Complete|","","" -"`P0476R2 `__","Bit-casting object representations","2018-06 (Rapperswil)","|Complete|","14","" -"`P0528R3 `__","The Curious Case of Padding Bits, Featuring Atomic Compare-and-Exchange","2018-06 (Rapperswil)","","","" -"`P0542R5 `__","Support for contract based programming in C++","2018-06 (Rapperswil)","|Nothing To Do|","n/a","Pulled at the 2019-07 meeting in Cologne" -"`P0556R3 `__","Integral power-of-2 operations","2018-06 (Rapperswil)","|Complete|","9","" -"`P0619R4 `__","Reviewing Deprecated Facilities of C++17 for C++20","2018-06 (Rapperswil)","|Complete|","20","Removed headers are still provided as an extension, but with deprecation warnings." -"`P0646R1 `__","Improving the Return Value of Erase-Like Algorithms","2018-06 (Rapperswil)","|Complete|","10","" -"`P0722R3 `__","Efficient sized delete for variable sized classes","2018-06 (Rapperswil)","|Complete|","9","" -"`P0758R1 `__","Implicit conversion traits and utility functions","2018-06 (Rapperswil)","|Complete|","","" -"`P0759R1 `__","fpos Requirements","2018-06 (Rapperswil)","|Complete|","11","" -"`P0769R2 `__","Add shift to ","2018-06 (Rapperswil)","|Complete|","12","" -"`P0788R3 `__","Standard Library Specification in a Concepts and Contracts World","2018-06 (Rapperswil)","|Nothing To Do|","n/a","Pulled at the 2019-07 meeting in Cologne" -"`P0879R0 `__","Constexpr for swap and swap related functions Also resolves LWG issue 2800.","2018-06 (Rapperswil)","|Complete|","13","" -"`P0887R1 `__","The identity metafunction","2018-06 (Rapperswil)","|Complete|","8","" -"`P0892R2 `__","P0892R2: explicit(bool)","2018-06 (Rapperswil)","|Nothing To Do|","","" -"`P0898R3 `__","Standard Library Concepts","2018-06 (Rapperswil)","|Complete|","13","" -"`P0935R0 `__","Eradicating unnecessarily explicit default constructors from the standard library","2018-06 (Rapperswil)","|Complete|","12","" -"`P0941R2 `__","Integrating feature-test macros into the C++ WD","2018-06 (Rapperswil)","|In Progress|","","" -"`P1023R0 `__","constexpr comparison operators for std::array","2018-06 (Rapperswil)","|Complete|","8","" -"`P1025R1 `__","Update The Reference To The Unicode Standard","2018-06 (Rapperswil)","","","" -"`P1120R0 `__","Consistency improvements for <=> and other comparison operators","2018-06 (Rapperswil)","","","" -"","","","","","" -"`P0318R1 `__","unwrap_ref_decay and unwrap_reference","2018-11 (San Diego)","|Complete|","8","" -"`P0356R5 `__","Simplified partial function application","2018-11 (San Diego)","|Complete|","13","" -"`P0357R3 `__","reference_wrapper for incomplete types","2018-11 (San Diego)","|Complete|","8","" -"`P0482R6 `__","char8_t: A type for UTF-8 characters and strings","2018-11 (San Diego)","|Complete|","16","" -"`P0487R1 `__","Fixing ``operator>>(basic_istream&, CharT*)``\ (LWG 2499)","2018-11 (San Diego)","|Complete|","8","" -"`P0591R4 `__","Utility functions to implement uses-allocator construction","2018-11 (San Diego)","|Partial|","","The changes in [mem.poly.allocator.mem] are missing" -"`P0595R2 `__","std::is_constant_evaluated()","2018-11 (San Diego)","|Complete|","9","" -"`P0602R4 `__","variant and optional should propagate copy/move triviality","2018-11 (San Diego)","|Complete|","8","" -"`P0608R3 `__","A sane variant converting constructor","2018-11 (San Diego)","|Complete|","9","" -"`P0655R1 `__","visit: Explicit Return Type for visit","2018-11 (San Diego)","|Complete|","12","" -"`P0771R1 `__","std::function move constructor should be noexcept","2018-11 (San Diego)","|Complete|","6","" -"`P0896R4 `__","The One Ranges Proposal","2018-11 (San Diego)","|Complete|","15","" -"`P0899R1 `__","P0899R1 - LWG 3016 is not a defect","2018-11 (San Diego)","|Nothing To Do|","","" -"`P0919R3 `__","Heterogeneous lookup for unordered containers","2018-11 (San Diego)","|Complete|","12","" -"`P0972R0 `__"," ``zero()``\ , ``min()``\ , and ``max()``\ should be noexcept","2018-11 (San Diego)","|Complete|","8","" -"`P1006R1 `__","Constexpr in std::pointer_traits","2018-11 (San Diego)","|Complete|","8","" -"`P1007R3 `__","``std::assume_aligned``\ ","2018-11 (San Diego)","|Complete|","15","" -"`P1020R1 `__","Smart pointer creation with default initialization","2018-11 (San Diego)","|Complete|","16","The feature-test macro was not set until LLVM 20." -"`P1032R1 `__","Misc constexpr bits","2018-11 (San Diego)","|Complete|","13","" -"`P1085R2 `__","Should Span be Regular?","2018-11 (San Diego)","|Complete|","8","" -"`P1123R0 `__","Editorial Guidance for merging P0019r8 and P0528r3","2018-11 (San Diego)","","","" -"`P1148R0 `__","Cleaning up Clause 20","2018-11 (San Diego)","","","" -"`P1165R1 `__","Make stateful allocator propagation more consistent for ``operator+(basic_string)``\ ","2018-11 (San Diego)","|Complete|","15","" -"`P1209R0 `__","Adopt Consistent Container Erasure from Library Fundamentals 2 for C++20","2018-11 (San Diego)","|Complete|","8","" -"`P1210R0 `__","P1210R0: Completing the Rebase of Library Fundamentals, Version 3, Working Draft","2018-11 (San Diego)","|Nothing To Do|","","" -"`P1236R1 `__","Alternative Wording for P0907R4 Signed Integers are Two's Complement","2018-11 (San Diego)","","","" -"`P1248R1 `__","Remove CommonReference requirement from StrictWeakOrdering (a.k.a Fixing Relations)","2018-11 (San Diego)","|Complete|","13","" -"`P1285R0 `__","Improving Completeness Requirements for Type Traits","2018-11 (San Diego)","","","" -"`P1353R0 `__","Missing feature test macros","2018-11 (San Diego)","|Complete|","19","" -"","","","","","" -"`P0339R6 `__","polymorphic_allocator<> as a vocabulary type","2019-02 (Kona)","|Complete|","16","" -"`P0340R3 `__","Making std::underlying_type SFINAE-friendly","2019-02 (Kona)","|Complete|","9","" -"`P0738R2 `__","I Stream, You Stream, We All Stream for istream_iterator","2019-02 (Kona)","","","" -"`P0811R3 `__","Well-behaved interpolation for numbers and pointers","2019-02 (Kona)","|Complete|","9","" -"`P0920R2 `__","Precalculated hash values in lookup","2019-02 (Kona)","|Nothing To Do|","","Reverted by `P1661 `__" -"`P1001R2 `__","Target Vectorization Policies from Parallelism V2 TS to C++20","2019-02 (Kona)","|Complete|","17","" -"`P1024R3 `__","Usability Enhancements for std::span","2019-02 (Kona)","|Complete|","9","" -"`P1164R1 `__","Make create_directory() Intuitive","2019-02 (Kona)","|Complete|","12","" -"`P1227R2 `__","Signed ssize() functions, unsigned size() functions","2019-02 (Kona)","|Complete|","9","" -"`P1252R2 `__","Ranges Design Cleanup","2019-02 (Kona)","|Complete|","15","" -"`P1286R2 `__","Contra CWG DR1778","2019-02 (Kona)","","","" -"`P1357R1 `__","Traits for [Un]bounded Arrays","2019-02 (Kona)","|Complete|","9","" -"`P1458R1 `__","Mandating the Standard Library: Clause 16 - Language support library","2019-02 (Kona)","|Complete|","9","" -"`P1459R1 `__","Mandating the Standard Library: Clause 18 - Diagnostics library","2019-02 (Kona)","|Complete|","9","" -"`P1462R1 `__","Mandating the Standard Library: Clause 20 - Strings library","2019-02 (Kona)","|Complete|","9","" -"`P1463R1 `__","Mandating the Standard Library: Clause 21 - Containers library","2019-02 (Kona)","","","" -"`P1464R1 `__","Mandating the Standard Library: Clause 22 - Iterators library","2019-02 (Kona)","|Complete|","9","" -"","","","","","" -"`P0325R4 `__","to_array from LFTS with updates","2019-07 (Cologne)","|Complete|","10","" -"`P0408R7 `__","Efficient Access to basic_stringbuf's Buffer","2019-07 (Cologne)","|Complete|","17","" -"`P0466R5 `__","Layout-compatibility and Pointer-interconvertibility Traits","2019-07 (Cologne)","","","" -"`P0553R4 `__","Bit operations","2019-07 (Cologne)","|Complete|","9","" -"`P0631R8 `__","Math Constants","2019-07 (Cologne)","|Complete|","11","" -"`P0645R10 `__","Text Formatting","2019-07 (Cologne)","|Complete|","14","The implementation was complete since LLVM 14, but the feature-test macro was not set until LLVM 19" -"`P0660R10 `__","Stop Token and Joining Thread, Rev 10.","2019-07 (Cologne)","|Complete|","20","The feature was implemented since LLVM 18 but was guarded behind ``-fexperimental-library``." -"`P0784R7 `__","More constexpr containers","2019-07 (Cologne)","|Complete|","12","" -"`P0980R1 `__","Making std::string constexpr","2019-07 (Cologne)","|Complete|","15","" -"`P1004R2 `__","Making std::vector constexpr","2019-07 (Cologne)","|Complete|","15","" -"`P1035R7 `__","Input Range Adaptors","2019-07 (Cologne)","|Complete|","16","" -"`P1065R2 `__","Constexpr INVOKE","2019-07 (Cologne)","|Complete|","12","" -"`P1135R6 `__","The C++20 Synchronization Library","2019-07 (Cologne)","|Complete|","11","" -"`P1207R4 `__","Movability of Single-pass Iterators","2019-07 (Cologne)","|Complete|","15","" -"`P1208R6 `__","Adopt source_location for C++20","2019-07 (Cologne)","|Complete|","16","" -"`P1355R2 `__","Exposing a narrow contract for ceil2","2019-07 (Cologne)","|Complete|","9","" -"`P1361R2 `__","Integration of chrono with text formatting","2019-07 (Cologne)","|Complete|","21","" -"`P1423R3 `__","char8_t backward compatibility remediation","2019-07 (Cologne)","|Complete|","15","" -"`P1424R1 `__","'constexpr' feature macro concerns","2019-07 (Cologne)","|Nothing To Do|","","Superseded by `P1902 `__" -"`P1466R3 `__","Miscellaneous minor fixes for chrono","2019-07 (Cologne)","|Partial|","","" -"`P1474R1 `__","Helpful pointers for ContiguousIterator","2019-07 (Cologne)","|Complete|","15","" -"`P1502R1 `__","Standard library header units for C++20","2019-07 (Cologne)","","","" -"`P1522R1 `__","Iterator Difference Type and Integer Overflow","2019-07 (Cologne)","|Complete|","15","" -"`P1523R1 `__","Views and Size Types","2019-07 (Cologne)","|Complete|","15","" -"`P1612R1 `__","Relocate Endian's Specification","2019-07 (Cologne)","|Complete|","10","" -"`P1614R2 `__","The Mothership has Landed","2019-07 (Cologne)","|Complete|","19","``std::strong_order(long double, long double)`` is partly implemented." -"`P1638R1 `__","basic_istream_view::iterator should not be copyable","2019-07 (Cologne)","|Complete|","16","" -"`P1643R1 `__","Add wait/notify to atomic_ref","2019-07 (Cologne)","|Complete|","19","" -"`P1644R0 `__","Add wait/notify to atomic","2019-07 (Cologne)","","","" -"`P1650R0 `__","Output std::chrono::days with 'd' suffix","2019-07 (Cologne)","|Complete|","16","" -"`P1651R0 `__","bind_front should not unwrap reference_wrapper","2019-07 (Cologne)","|Complete|","13","" -"`P1652R1 `__","Printf corner cases in std::format","2019-07 (Cologne)","|Complete|","14","" -"`P1661R1 `__","Remove dedicated precalculated hash lookup interface","2019-07 (Cologne)","|Nothing To Do|","","" -"`P1754R1 `__","Rename concepts to standard_case for C++20, while we still can","2019-07 (Cologne)","|Complete|","15","" -"","","","","","" -"`P0883R2 `__","Fixing Atomic Initialization","2019-11 (Belfast)","|Complete|","14","shared_ptr and floating-point changes weren't applied as they themselves aren't implemented yet. Also, ``ATOMIC_FLAG_INIT`` was marked deprecated in version 14, but was undeprecated with the implementation of LWG3659 in version 15." -"`P1391R4 `__","Range constructor for std::string_view","2019-11 (Belfast)","|Complete|","14","" -"`P1394R4 `__","Range constructor for std::span","2019-11 (Belfast)","|Complete|","14","" -"`P1456R1 `__","Move-only views","2019-11 (Belfast)","|Complete|","15","" -"`P1622R3 `__","Mandating the Standard Library: Clause 32 - Thread support library","2019-11 (Belfast)","","","" -"`P1645R1 `__","constexpr for numeric algorithms","2019-11 (Belfast)","|Complete|","12","" -"`P1686R2 `__","Mandating the Standard Library: Clause 27 - Time library","2019-11 (Belfast)","","","" -"`P1690R1 `__","Refinement Proposal for P0919 Heterogeneous lookup for unordered containers","2019-11 (Belfast)","|Complete|","12","" -"`P1716R3 `__","ranges compare algorithm are over-constrained","2019-11 (Belfast)","|Complete|","15","" -"`P1718R2 `__","Mandating the Standard Library: Clause 25 - Algorithms library","2019-11 (Belfast)","","","" -"`P1719R2 `__","Mandating the Standard Library: Clause 26 - Numerics library","2019-11 (Belfast)","","","" -"`P1720R2 `__","Mandating the Standard Library: Clause 28 - Localization library","2019-11 (Belfast)","","","" -"`P1721R2 `__","Mandating the Standard Library: Clause 29 - Input/Output library","2019-11 (Belfast)","","","" -"`P1722R2 `__","Mandating the Standard Library: Clause 30 - Regular Expression library","2019-11 (Belfast)","","","" -"`P1723R2 `__","Mandating the Standard Library: Clause 31 - Atomics library","2019-11 (Belfast)","","","" -"`P1855R0 `__","Make ````\ freestanding","2019-11 (Belfast)","","","" -"`P1862R1 `__","Ranges adaptors for non-copyable iterators","2019-11 (Belfast)","|Complete|","16","" -"`P1865R1 `__","Add max() to latch and barrier","2019-11 (Belfast)","|Complete|","11","" -"`P1869R1 `__","Rename 'condition_variable_any' interruptible wait methods","2019-11 (Belfast)","|Complete|","18","" -"`P1870R1 `__","forwarding-range is too subtle","2019-11 (Belfast)","|Complete|","15","" -"`P1871R1 `__","Concept traits should be named after concepts","2019-11 (Belfast)","|Complete|","14","" -"`P1872R0 `__","span should have size_type, not index_type","2019-11 (Belfast)","|Complete|","10","" -"`P1878R1 `__","Constraining Readable Types","2019-11 (Belfast)","|Complete|","15","" -"`P1892R1 `__","Extended locale-specific presentation specifiers for std::format","2019-11 (Belfast)","|Complete|","14","" -"`P1902R1 `__","Missing feature-test macros 2018-2019","2019-11 (Belfast)","","","" -"`P1959R0 `__","Remove std::weak_equality and std::strong_equality","2019-11 (Belfast)","|Nothing To Do|","","" -"`P1960R0 `__","NB Comment Changes Reviewed by SG1","2019-11 (Belfast)","","","" -"`P1961R0 `__","Harmonizing the definitions of total order for pointers","2019-11 (Belfast)","","","" -"`P1965R0 `__","Blanket Wording for Specifying ""Hidden Friends""","2019-11 (Belfast)","","","" -"","","","","","" -"`P0586R2 `__","Safe integral comparisons","2020-02 (Prague)","|Complete|","13","" -"`P0593R6 `__","Implicit creation of objects for low-level object manipulation","2020-02 (Prague)","","","" -"`P1115R3 `__","Improving the Return Value of Erase-Like Algorithms II: Free erase/erase if","2020-02 (Prague)","|Complete|","11","" -"`P1243R4 `__","Rangify New Algorithms","2020-02 (Prague)","|Complete|","15","" -"`P1460R1 `__","Mandating the Standard Library: Clause 20 - Utilities library","2020-02 (Prague)","","","" -"`P1739R4 `__","Avoid template bloat for safe_ranges in combination with ""subrange-y"" view adaptors","2020-02 (Prague)","|Complete|","15","" -"`P1831R1 `__","Deprecating volatile: library","2020-02 (Prague)","","","" -"`P1868R2 `__","width: clarifying units of width and precision in std::format","2020-02 (Prague)","|Complete|","14","" -"`P1956R1 `__","On the names of low-level bit manipulation functions","2020-02 (Prague)","|Complete|","12","" -"`P1957R2 `__","Converting from ``T*``\ to bool should be considered narrowing (re: US 212)","2020-02 (Prague)","|Complete|","18","" -"`P1963R0 `__","P1963R0: Fixing US 313","2020-02 (Prague)","|Nothing To Do|","","" -"`P1964R2 `__","Wording for boolean-testable","2020-02 (Prague)","|Complete|","13","" -"`P1970R2 `__","Consistency for size() functions: Add ranges::ssize","2020-02 (Prague)","|Complete|","15","" -"`P1973R1 `__","Rename ""_default_init"" Functions, Rev1","2020-02 (Prague)","|Complete|","16","The feature-test macro was not set until LLVM 20." -"`P1976R2 `__","Fixed-size span construction from dynamic range","2020-02 (Prague)","|Complete|","11","" -"`P1981R0 `__","Rename leap to leap_second","2020-02 (Prague)","|Complete|","19","" -"`P1982R0 `__","Rename link to time_zone_link","2020-02 (Prague)","|Complete|","19","" -"`P1983R0 `__","Wording for GB301, US296, US292, US291, and US283","2020-02 (Prague)","|Complete|","15","" -"`P1994R1 `__","elements_view needs its own sentinel","2020-02 (Prague)","|Complete|","16","" -"`P2002R1 `__","Defaulted comparison specification cleanups","2020-02 (Prague)","|Complete|","7","" -"`P2045R1 `__","P2045R1: Missing Mandates for the standard library","2020-02 (Prague)","|Nothing To Do|","","" -"`P2085R0 `__","Consistent defaulted comparisons","2020-02 (Prague)","","","" -"`P2091R0 `__","Issues with range access CPOs","2020-02 (Prague)","|Complete|","15","" -"`P2101R0 `__","P2101R0: 'Models' subsumes 'satisfies' (Wording for US298 and US300)","2020-02 (Prague)","|Nothing To Do|","","" -"`P2102R0 `__","Make 'implicit expression variations' more explicit (Wording for US185)","2020-02 (Prague)","|Complete|","15","" -"`P2106R0 `__","Alternative wording for GB315 and GB316","2020-02 (Prague)","|Complete|","15","" -"`P2116R0 `__","Remove tuple-like protocol support from fixed-extent span","2020-02 (Prague)","|Complete|","11","" -"","","","","","" -"`P2231R1 `__","Missing constexpr in std::optional and std::variant","2021-06 (Virtual)","|Complete|","19","Changes of feature-test macros are completed in LLVM 20." -"`P2325R3 `__","Views should not be required to be default constructible","2021-06 (Virtual)","|Complete|","16","" -"`P2210R2 `__","Superior String Splitting","2021-06 (Virtual)","|Complete|","16","" -"`P2216R3 `__","std::format improvements","2021-06 (Virtual)","|Complete|","15","" -"`P2281R1 `__","Clarifying range adaptor objects","2021-06 (Virtual)","|Complete|","14","" -"`P2328R1 `__","join_view should join all views of ranges","2021-06 (Virtual)","|Complete|","15","" -"`P2367R0 `__","Remove misuses of list-initialization from Clause 24","2021-06 (Virtual)","|Complete|","15","" -"","","","","","" -"`P2372R3 `__","Fixing locale handling in chrono formatters","2021-10 (Virtual)","|Complete|","21","" -"`P2415R2 `__","What is a ``view``","2021-10 (Virtual)","|Complete|","14","" -"`P2418R2 `__","Add support for ``std::generator``-like types to ``std::format``","2021-10 (Virtual)","|Complete|","15","" -"`P2432R1 `__","Fix ``istream_view``","2021-10 (Virtual)","|Complete|","16","" +"Paper #","Paper Name","Meeting","Status","First released version","GitHub issue","Notes" +"`P0463R1 `__","Endian just Endian","2017-07 (Toronto)","|Complete|","7","`#103999 `__","" +"`P0674R1 `__","Extending make_shared to Support Arrays","2017-07 (Toronto)","|Complete|","15","`#104000 `__","" +"","","","","","","" +"`P0020R6 `__","Floating Point Atomic","2017-11 (Albuquerque)","|Complete|","18","`#104001 `__","The feature-test macro was not set until LLVM 20." +"`P0053R7 `__","C++ Synchronized Buffered Ostream","2017-11 (Albuquerque)","|Complete|","18","`#104002 `__","" +"`P0202R3 `__","Add constexpr modifiers to functions in and Headers","2017-11 (Albuquerque)","|Complete|","12","`#104003 `__","" +"`P0415R1 `__","Constexpr for ``std::complex``\ ","2017-11 (Albuquerque)","|Complete|","16","`#104004 `__","" +"`P0439R0 `__","Make ``std::memory_order``\ a scoped enumeration","2017-11 (Albuquerque)","|Complete|","","`#104005 `__","" +"`P0457R2 `__","String Prefix and Suffix Checking","2017-11 (Albuquerque)","|Complete|","6","`#104006 `__","" +"`P0550R2 `__","Transformation Trait ``remove_cvref``\ ","2017-11 (Albuquerque)","|Complete|","6","`#104007 `__","" +"`P0600R1 `__","nodiscard in the Library","2017-11 (Albuquerque)","|Complete|","16","`#104010 `__","" +"`P0616R0 `__","de-pessimize legacy algorithms with std::move","2017-11 (Albuquerque)","|Complete|","12","`#104011 `__","" +"`P0653R2 `__","Utility to convert a pointer to a raw pointer","2017-11 (Albuquerque)","|Complete|","6","`#104012 `__","" +"`P0718R2 `__","Atomic shared_ptr","2017-11 (Albuquerque)","","","`#99980 `__","" +"`P0767R1 `__","Deprecate POD","2017-11 (Albuquerque)","|Complete|","21","`#104013 `__","It was previously erroneously marked as complete in LLVM 7." +"`P0768R1 `__","Library Support for the Spaceship (Comparison) Operator","2017-11 (Albuquerque)","|Complete|","","`#104014 `__","" +"`P0777R1 `__","Treating Unnecessary ``decay``\ ","2017-11 (Albuquerque)","|Complete|","7","`#104016 `__","" +"","","","","","","" +"`P0122R7 `__","","2018-03 (Jacksonville)","|Complete|","7","`#104017 `__","" +"`P0355R7 `__","Extending chrono to Calendars and Time Zones","2018-03 (Jacksonville)","|Partial|","","`#99982 `__","See the `Github issue `__ for detailed status" +"`P0551R3 `__","Thou Shalt Not Specialize ``std``\ Function Templates!","2018-03 (Jacksonville)","|Complete|","11","`#104018 `__","" +"`P0753R2 `__","Manipulators for C++ Synchronized Buffered Ostream","2018-03 (Jacksonville)","","","`#99983 `__","" +"`P0754R2 `__","","2018-03 (Jacksonville)","|Complete|","7","`#104021 `__","" +"`P0809R0 `__","Comparing Unordered Containers","2018-03 (Jacksonville)","|Nothing To Do|","","`#104022 `__","" +"`P0858R0 `__","Constexpr iterator requirements","2018-03 (Jacksonville)","|Complete|","12","`#104024 `__","" +"`P0905R1 `__","Symmetry for spaceship","2018-03 (Jacksonville)","|Complete|","7","`#104025 `__","" +"`P0966R1 `__","``string::reserve``\ Should Not Shrink","2018-03 (Jacksonville)","|Complete|","12","`#104026 `__","It was previously erroneously marked as complete in version 8. See `bug 45368 `__" +"","","","","","","" +"`P0019R8 `__","Atomic Ref","2018-06 (Rapperswil)","|Complete|","19","`#104028 `__","" +"`P0458R2 `__","Checking for Existence of an Element in Associative Containers","2018-06 (Rapperswil)","|Complete|","13","`#104029 `__","" +"`P0475R1 `__","LWG 2511: guaranteed copy elision for piecewise construction","2018-06 (Rapperswil)","|Complete|","","`#104031 `__","" +"`P0476R2 `__","Bit-casting object representations","2018-06 (Rapperswil)","|Complete|","14","`#104087 `__","" +"`P0528R3 `__","The Curious Case of Padding Bits, Featuring Atomic Compare-and-Exchange","2018-06 (Rapperswil)","","","`#99984 `__","" +"`P0542R5 `__","Support for contract based programming in C++","2018-06 (Rapperswil)","|Nothing To Do|","n/a","`#104089 `__","Pulled at the 2019-07 meeting in Cologne" +"`P0556R3 `__","Integral power-of-2 operations","2018-06 (Rapperswil)","|Complete|","9","`#104090 `__","" +"`P0619R4 `__","Reviewing Deprecated Facilities of C++17 for C++20","2018-06 (Rapperswil)","|Complete|","20","`#99985 `__","Removed headers are still provided as an extension, but with deprecation warnings." +"`P0646R1 `__","Improving the Return Value of Erase-Like Algorithms","2018-06 (Rapperswil)","|Complete|","10","`#104091 `__","" +"`P0722R3 `__","Efficient sized delete for variable sized classes","2018-06 (Rapperswil)","|Complete|","9","`#104092 `__","" +"`P0758R1 `__","Implicit conversion traits and utility functions","2018-06 (Rapperswil)","|Complete|","","`#104093 `__","" +"`P0759R1 `__","fpos Requirements","2018-06 (Rapperswil)","|Complete|","11","`#104094 `__","" +"`P0769R2 `__","Add shift to ","2018-06 (Rapperswil)","|Complete|","12","`#104095 `__","" +"`P0788R3 `__","Standard Library Specification in a Concepts and Contracts World","2018-06 (Rapperswil)","|Nothing To Do|","n/a","`#104096 `__","Pulled at the 2019-07 meeting in Cologne" +"`P0879R0 `__","Constexpr for swap and swap related functions Also resolves LWG issue 2800.","2018-06 (Rapperswil)","|Complete|","13","`#104097 `__","" +"`P0887R1 `__","The identity metafunction","2018-06 (Rapperswil)","|Complete|","8","`#104099 `__","" +"`P0892R2 `__","P0892R2: explicit(bool)","2018-06 (Rapperswil)","|Nothing To Do|","","`#100597 `__","" +"`P0898R3 `__","Standard Library Concepts","2018-06 (Rapperswil)","|Complete|","13","`#104100 `__","" +"`P0935R0 `__","Eradicating unnecessarily explicit default constructors from the standard library","2018-06 (Rapperswil)","|Complete|","12","`#104101 `__","" +"`P0941R2 `__","Integrating feature-test macros into the C++ WD","2018-06 (Rapperswil)","|In Progress|","","`#99986 `__","" +"`P1023R0 `__","constexpr comparison operators for std::array","2018-06 (Rapperswil)","|Complete|","8","`#104103 `__","" +"`P1025R1 `__","Update The Reference To The Unicode Standard","2018-06 (Rapperswil)","","","`#100598 `__","" +"`P1120R0 `__","Consistency improvements for <=> and other comparison operators","2018-06 (Rapperswil)","","","`#99989 `__","" +"","","","","","","" +"`P0318R1 `__","unwrap_ref_decay and unwrap_reference","2018-11 (San Diego)","|Complete|","8","`#104105 `__","" +"`P0356R5 `__","Simplified partial function application","2018-11 (San Diego)","|Complete|","13","`#104106 `__","" +"`P0357R3 `__","reference_wrapper for incomplete types","2018-11 (San Diego)","|Complete|","8","`#104107 `__","" +"`P0482R6 `__","char8_t: A type for UTF-8 characters and strings","2018-11 (San Diego)","|Complete|","16","`#104108 `__","" +"`P0487R1 `__","Fixing ``operator>>(basic_istream&, CharT*)``\ (LWG 2499)","2018-11 (San Diego)","|Complete|","8","`#104110 `__","" +"`P0591R4 `__","Utility functions to implement uses-allocator construction","2018-11 (San Diego)","|Partial|","","`#99990 `__","The changes in [mem.poly.allocator.mem] are missing" +"`P0595R2 `__","std::is_constant_evaluated()","2018-11 (San Diego)","|Complete|","9","`#104111 `__","" +"`P0602R4 `__","variant and optional should propagate copy/move triviality","2018-11 (San Diego)","|Complete|","8","`#104112 `__","" +"`P0608R3 `__","A sane variant converting constructor","2018-11 (San Diego)","|Complete|","9","`#104113 `__","" +"`P0655R1 `__","visit: Explicit Return Type for visit","2018-11 (San Diego)","|Complete|","12","`#104115 `__","" +"`P0771R1 `__","std::function move constructor should be noexcept","2018-11 (San Diego)","|Complete|","6","`#104116 `__","" +"`P0896R4 `__","The One Ranges Proposal","2018-11 (San Diego)","|Complete|","15","`#104118 `__","" +"`P0899R1 `__","P0899R1 - LWG 3016 is not a defect","2018-11 (San Diego)","|Nothing To Do|","","`#104120 `__","" +"`P0919R3 `__","Heterogeneous lookup for unordered containers","2018-11 (San Diego)","|Complete|","12","`#104122 `__","" +"`P0972R0 `__"," ``zero()``\ , ``min()``\ , and ``max()``\ should be noexcept","2018-11 (San Diego)","|Complete|","8","`#104123 `__","" +"`P1006R1 `__","Constexpr in std::pointer_traits","2018-11 (San Diego)","|Complete|","8","`#104124 `__","" +"`P1007R3 `__","``std::assume_aligned``\ ","2018-11 (San Diego)","|Complete|","15","`#104125 `__","" +"`P1020R1 `__","Smart pointer creation with default initialization","2018-11 (San Diego)","|Complete|","16","`#104126 `__","The feature-test macro was not set until LLVM 20." +"`P1032R1 `__","Misc constexpr bits","2018-11 (San Diego)","|Complete|","13","`#104127 `__","" +"`P1085R2 `__","Should Span be Regular?","2018-11 (San Diego)","|Complete|","8","`#104128 `__","" +"`P1123R0 `__","Editorial Guidance for merging P0019r8 and P0528r3","2018-11 (San Diego)","","","`#99991 `__","" +"`P1148R0 `__","Cleaning up Clause 20","2018-11 (San Diego)","","","`#99992 `__","" +"`P1165R1 `__","Make stateful allocator propagation more consistent for ``operator+(basic_string)``\ ","2018-11 (San Diego)","|Complete|","15","`#104129 `__","" +"`P1209R0 `__","Adopt Consistent Container Erasure from Library Fundamentals 2 for C++20","2018-11 (San Diego)","|Complete|","8","`#104130 `__","" +"`P1210R0 `__","P1210R0: Completing the Rebase of Library Fundamentals, Version 3, Working Draft","2018-11 (San Diego)","|Nothing To Do|","","`#100612 `__","" +"`P1236R1 `__","Alternative Wording for P0907R4 Signed Integers are Two's Complement","2018-11 (San Diego)","","","`#99994 `__","" +"`P1248R1 `__","Remove CommonReference requirement from StrictWeakOrdering (a.k.a Fixing Relations)","2018-11 (San Diego)","|Complete|","13","`#104131 `__","" +"`P1285R0 `__","Improving Completeness Requirements for Type Traits","2018-11 (San Diego)","","","`#99995 `__","" +"`P1353R0 `__","Missing feature test macros","2018-11 (San Diego)","|Complete|","19","`#100006 `__","" +"","","","","","","" +"`P0339R6 `__","polymorphic_allocator<> as a vocabulary type","2019-02 (Kona)","|Complete|","16","`#104132 `__","" +"`P0340R3 `__","Making std::underlying_type SFINAE-friendly","2019-02 (Kona)","|Complete|","9","`#104133 `__","" +"`P0738R2 `__","I Stream, You Stream, We All Stream for istream_iterator","2019-02 (Kona)","","","`#100007 `__","" +"`P0811R3 `__","Well-behaved interpolation for numbers and pointers","2019-02 (Kona)","|Complete|","9","`#104134 `__","" +"`P0920R2 `__","Precalculated hash values in lookup","2019-02 (Kona)","|Nothing To Do|","","`#104135 `__","Reverted by `P1661 `__" +"`P1001R2 `__","Target Vectorization Policies from Parallelism V2 TS to C++20","2019-02 (Kona)","|Complete|","17","`#104136 `__","" +"`P1024R3 `__","Usability Enhancements for std::span","2019-02 (Kona)","|Complete|","9","`#104137 `__","" +"`P1164R1 `__","Make create_directory() Intuitive","2019-02 (Kona)","|Complete|","12","`#104138 `__","" +"`P1227R2 `__","Signed ssize() functions, unsigned size() functions","2019-02 (Kona)","|Complete|","9","`#104139 `__","" +"`P1252R2 `__","Ranges Design Cleanup","2019-02 (Kona)","|Complete|","15","`#104140 `__","" +"`P1286R2 `__","Contra CWG DR1778","2019-02 (Kona)","","","`#100009 `__","" +"`P1357R1 `__","Traits for [Un]bounded Arrays","2019-02 (Kona)","|Complete|","9","`#104141 `__","" +"`P1458R1 `__","Mandating the Standard Library: Clause 16 - Language support library","2019-02 (Kona)","|Complete|","9","`#104142 `__","" +"`P1459R1 `__","Mandating the Standard Library: Clause 18 - Diagnostics library","2019-02 (Kona)","|Complete|","9","`#104143 `__","" +"`P1462R1 `__","Mandating the Standard Library: Clause 20 - Strings library","2019-02 (Kona)","|Complete|","9","`#104145 `__","" +"`P1463R1 `__","Mandating the Standard Library: Clause 21 - Containers library","2019-02 (Kona)","","","`#100010 `__","" +"`P1464R1 `__","Mandating the Standard Library: Clause 22 - Iterators library","2019-02 (Kona)","|Complete|","9","`#104147 `__","" +"","","","","","","" +"`P0325R4 `__","to_array from LFTS with updates","2019-07 (Cologne)","|Complete|","10","`#104149 `__","" +"`P0408R7 `__","Efficient Access to basic_stringbuf's Buffer","2019-07 (Cologne)","|Complete|","17","`#104150 `__","" +"`P0466R5 `__","Layout-compatibility and Pointer-interconvertibility Traits","2019-07 (Cologne)","","","`#100013 `__","" +"`P0553R4 `__","Bit operations","2019-07 (Cologne)","|Complete|","9","`#104151 `__","" +"`P0631R8 `__","Math Constants","2019-07 (Cologne)","|Complete|","11","`#104152 `__","" +"`P0645R10 `__","Text Formatting","2019-07 (Cologne)","|Complete|","14","`#104153 `__","The implementation was complete since LLVM 14, but the feature-test macro was not set until LLVM 19" +"`P0660R10 `__","Stop Token and Joining Thread, Rev 10.","2019-07 (Cologne)","|Complete|","20","`#104154 `__","The feature was implemented since LLVM 18 but was guarded behind ``-fexperimental-library``." +"`P0784R7 `__","More constexpr containers","2019-07 (Cologne)","|Complete|","12","`#104156 `__","" +"`P0980R1 `__","Making std::string constexpr","2019-07 (Cologne)","|Complete|","15","`#104157 `__","" +"`P1004R2 `__","Making std::vector constexpr","2019-07 (Cologne)","|Complete|","15","`#104158 `__","" +"`P1035R7 `__","Input Range Adaptors","2019-07 (Cologne)","|Complete|","16","`#104159 `__","" +"`P1065R2 `__","Constexpr INVOKE","2019-07 (Cologne)","|Complete|","12","`#104160 `__","" +"`P1135R6 `__","The C++20 Synchronization Library","2019-07 (Cologne)","|Complete|","11","`#104161 `__","" +"`P1207R4 `__","Movability of Single-pass Iterators","2019-07 (Cologne)","|Complete|","15","`#104162 `__","" +"`P1208R6 `__","Adopt source_location for C++20","2019-07 (Cologne)","|Complete|","16","`#104163 `__","" +"`P1355R2 `__","Exposing a narrow contract for ceil2","2019-07 (Cologne)","|Complete|","9","`#104164 `__","" +"`P1361R2 `__","Integration of chrono with text formatting","2019-07 (Cologne)","|Complete|","21","`#100014 `__","" +"`P1423R3 `__","char8_t backward compatibility remediation","2019-07 (Cologne)","|Complete|","15","`#104165 `__","" +"`P1424R1 `__","'constexpr' feature macro concerns","2019-07 (Cologne)","|Nothing To Do|","","`#104166 `__","Superseded by `P1902 `__" +"`P1466R3 `__","Miscellaneous minor fixes for chrono","2019-07 (Cologne)","|Partial|","","`#100015 `__","" +"`P1474R1 `__","Helpful pointers for ContiguousIterator","2019-07 (Cologne)","|Complete|","15","`#104167 `__","" +"`P1502R1 `__","Standard library header units for C++20","2019-07 (Cologne)","","","`#100016 `__","" +"`P1522R1 `__","Iterator Difference Type and Integer Overflow","2019-07 (Cologne)","|Complete|","15","`#104169 `__","" +"`P1523R1 `__","Views and Size Types","2019-07 (Cologne)","|Complete|","15","`#104170 `__","" +"`P1612R1 `__","Relocate Endian's Specification","2019-07 (Cologne)","|Complete|","10","`#104172 `__","" +"`P1614R2 `__","The Mothership has Landed","2019-07 (Cologne)","|Complete|","19","`#100018 `__","``std::strong_order(long double, long double)`` is partly implemented." +"`P1638R1 `__","basic_istream_view::iterator should not be copyable","2019-07 (Cologne)","|Complete|","16","`#104173 `__","" +"`P1643R1 `__","Add wait/notify to atomic_ref","2019-07 (Cologne)","|Complete|","19","`#104174 `__","" +"`P1644R0 `__","Add wait/notify to atomic","2019-07 (Cologne)","","","`#100019 `__","" +"`P1650R0 `__","Output std::chrono::days with 'd' suffix","2019-07 (Cologne)","|Complete|","16","`#104175 `__","" +"`P1651R0 `__","bind_front should not unwrap reference_wrapper","2019-07 (Cologne)","|Complete|","13","`#104176 `__","" +"`P1652R1 `__","Printf corner cases in std::format","2019-07 (Cologne)","|Complete|","14","`#104177 `__","" +"`P1661R1 `__","Remove dedicated precalculated hash lookup interface","2019-07 (Cologne)","|Nothing To Do|","","`#104178 `__","" +"`P1754R1 `__","Rename concepts to standard_case for C++20, while we still can","2019-07 (Cologne)","|Complete|","15","`#104179 `__","" +"","","","","","","" +"`P0883R2 `__","Fixing Atomic Initialization","2019-11 (Belfast)","|Complete|","14","`#104180 `__","shared_ptr and floating-point changes weren't applied as they themselves aren't implemented yet. Also, ``ATOMIC_FLAG_INIT`` was marked deprecated in version 14, but was undeprecated with the implementation of LWG3659 in version 15." +"`P1391R4 `__","Range constructor for std::string_view","2019-11 (Belfast)","|Complete|","14","`#104181 `__","" +"`P1394R4 `__","Range constructor for std::span","2019-11 (Belfast)","|Complete|","14","`#104182 `__","" +"`P1456R1 `__","Move-only views","2019-11 (Belfast)","|Complete|","15","`#104183 `__","" +"`P1622R3 `__","Mandating the Standard Library: Clause 32 - Thread support library","2019-11 (Belfast)","","","`#100020 `__","" +"`P1645R1 `__","constexpr for numeric algorithms","2019-11 (Belfast)","|Complete|","12","`#104184 `__","" +"`P1686R2 `__","Mandating the Standard Library: Clause 27 - Time library","2019-11 (Belfast)","","","`#100021 `__","" +"`P1690R1 `__","Refinement Proposal for P0919 Heterogeneous lookup for unordered containers","2019-11 (Belfast)","|Complete|","12","`#104185 `__","" +"`P1716R3 `__","ranges compare algorithm are over-constrained","2019-11 (Belfast)","|Complete|","15","`#104186 `__","" +"`P1718R2 `__","Mandating the Standard Library: Clause 25 - Algorithms library","2019-11 (Belfast)","","","`#100022 `__","" +"`P1719R2 `__","Mandating the Standard Library: Clause 26 - Numerics library","2019-11 (Belfast)","","","`#100023 `__","" +"`P1720R2 `__","Mandating the Standard Library: Clause 28 - Localization library","2019-11 (Belfast)","","","`#100025 `__","" +"`P1721R2 `__","Mandating the Standard Library: Clause 29 - Input/Output library","2019-11 (Belfast)","","","`#100026 `__","" +"`P1722R2 `__","Mandating the Standard Library: Clause 30 - Regular Expression library","2019-11 (Belfast)","","","`#100027 `__","" +"`P1723R2 `__","Mandating the Standard Library: Clause 31 - Atomics library","2019-11 (Belfast)","","","`#100029 `__","" +"`P1855R0 `__","Make ````\ freestanding","2019-11 (Belfast)","","","`#100030 `__","" +"`P1862R1 `__","Ranges adaptors for non-copyable iterators","2019-11 (Belfast)","|Complete|","16","`#104187 `__","" +"`P1865R1 `__","Add max() to latch and barrier","2019-11 (Belfast)","|Complete|","11","`#104188 `__","" +"`P1869R1 `__","Rename 'condition_variable_any' interruptible wait methods","2019-11 (Belfast)","|Complete|","18","`#100031 `__","" +"`P1870R1 `__","forwarding-range is too subtle","2019-11 (Belfast)","|Complete|","15","`#104190 `__","" +"`P1871R1 `__","Concept traits should be named after concepts","2019-11 (Belfast)","|Complete|","14","`#104191 `__","" +"`P1872R0 `__","span should have size_type, not index_type","2019-11 (Belfast)","|Complete|","10","`#104192 `__","" +"`P1878R1 `__","Constraining Readable Types","2019-11 (Belfast)","|Complete|","15","`#104194 `__","" +"`P1892R1 `__","Extended locale-specific presentation specifiers for std::format","2019-11 (Belfast)","|Complete|","14","`#104196 `__","" +"`P1902R1 `__","Missing feature-test macros 2018-2019","2019-11 (Belfast)","","","`#100032 `__","" +"`P1959R0 `__","Remove std::weak_equality and std::strong_equality","2019-11 (Belfast)","|Nothing To Do|","","`#104198 `__","" +"`P1960R0 `__","NB Comment Changes Reviewed by SG1","2019-11 (Belfast)","","","`#100033 `__","" +"`P1961R0 `__","Harmonizing the definitions of total order for pointers","2019-11 (Belfast)","","","`#100611 `__","" +"`P1965R0 `__","Blanket Wording for Specifying ""Hidden Friends""","2019-11 (Belfast)","","","`#100034 `__","" +"","","","","","","" +"`P0586R2 `__","Safe integral comparisons","2020-02 (Prague)","|Complete|","13","`#104199 `__","" +"`P0593R6 `__","Implicit creation of objects for low-level object manipulation","2020-02 (Prague)","","","`#100035 `__","" +"`P1115R3 `__","Improving the Return Value of Erase-Like Algorithms II: Free erase/erase if","2020-02 (Prague)","|Complete|","11","`#104200 `__","" +"`P1243R4 `__","Rangify New Algorithms","2020-02 (Prague)","|Complete|","15","`#104201 `__","" +"`P1460R1 `__","Mandating the Standard Library: Clause 20 - Utilities library","2020-02 (Prague)","","","`#100037 `__","" +"`P1739R4 `__","Avoid template bloat for safe_ranges in combination with ""subrange-y"" view adaptors","2020-02 (Prague)","|Complete|","15","`#104202 `__","" +"`P1831R1 `__","Deprecating volatile: library","2020-02 (Prague)","","","`#100038 `__","" +"`P1868R2 `__","width: clarifying units of width and precision in std::format","2020-02 (Prague)","|Complete|","14","`#104203 `__","" +"`P1956R1 `__","On the names of low-level bit manipulation functions","2020-02 (Prague)","|Complete|","12","`#104204 `__","" +"`P1957R2 `__","Converting from ``T*``\ to bool should be considered narrowing (re: US 212)","2020-02 (Prague)","|Complete|","18","`#104205 `__","" +"`P1963R0 `__","P1963R0: Fixing US 313","2020-02 (Prague)","|Nothing To Do|","","`#100039 `__","" +"`P1964R2 `__","Wording for boolean-testable","2020-02 (Prague)","|Complete|","13","`#104206 `__","" +"`P1970R2 `__","Consistency for size() functions: Add ranges::ssize","2020-02 (Prague)","|Complete|","15","`#104207 `__","" +"`P1973R1 `__","Rename ""_default_init"" Functions, Rev1","2020-02 (Prague)","|Complete|","16","`#104208 `__","The feature-test macro was not set until LLVM 20." +"`P1976R2 `__","Fixed-size span construction from dynamic range","2020-02 (Prague)","|Complete|","11","`#104209 `__","" +"`P1981R0 `__","Rename leap to leap_second","2020-02 (Prague)","|Complete|","19","`#104210 `__","" +"`P1982R0 `__","Rename link to time_zone_link","2020-02 (Prague)","|Complete|","19","`#104211 `__","" +"`P1983R0 `__","Wording for GB301, US296, US292, US291, and US283","2020-02 (Prague)","|Complete|","15","`#104212 `__","" +"`P1994R1 `__","elements_view needs its own sentinel","2020-02 (Prague)","|Complete|","16","`#104213 `__","" +"`P2002R1 `__","Defaulted comparison specification cleanups","2020-02 (Prague)","|Complete|","7","`#100615 `__","" +"`P2045R1 `__","P2045R1: Missing Mandates for the standard library","2020-02 (Prague)","|Nothing To Do|","","`#100041 `__","" +"`P2085R0 `__","Consistent defaulted comparisons","2020-02 (Prague)","","","`#100617 `__","" +"`P2091R0 `__","Issues with range access CPOs","2020-02 (Prague)","|Complete|","15","`#104214 `__","" +"`P2101R0 `__","P2101R0: 'Models' subsumes 'satisfies' (Wording for US298 and US300)","2020-02 (Prague)","|Nothing To Do|","","`#100618 `__","" +"`P2102R0 `__","Make 'implicit expression variations' more explicit (Wording for US185)","2020-02 (Prague)","|Complete|","15","`#100042 `__","" +"`P2106R0 `__","Alternative wording for GB315 and GB316","2020-02 (Prague)","|Complete|","15","`#104215 `__","" +"`P2116R0 `__","Remove tuple-like protocol support from fixed-extent span","2020-02 (Prague)","|Complete|","11","`#104216 `__","" +"","","","","","","" +"`P2231R1 `__","Missing constexpr in std::optional and std::variant","2021-06 (Virtual)","|Complete|","19","`#104217 `__","Changes of feature-test macros are completed in LLVM 20." +"`P2325R3 `__","Views should not be required to be default constructible","2021-06 (Virtual)","|Complete|","16","`#104218 `__","" +"`P2210R2 `__","Superior String Splitting","2021-06 (Virtual)","|Complete|","16","`#104219 `__","" +"`P2216R3 `__","std::format improvements","2021-06 (Virtual)","|Complete|","15","`#104220 `__","" +"`P2281R1 `__","Clarifying range adaptor objects","2021-06 (Virtual)","|Complete|","14","`#104221 `__","" +"`P2328R1 `__","join_view should join all views of ranges","2021-06 (Virtual)","|Complete|","15","`#104222 `__","" +"`P2367R0 `__","Remove misuses of list-initialization from Clause 24","2021-06 (Virtual)","|Complete|","15","`#104223 `__","" +"","","","","","","" +"`P2372R3 `__","Fixing locale handling in chrono formatters","2021-10 (Virtual)","|Complete|","21","`#100043 `__","" +"`P2415R2 `__","What is a ``view``","2021-10 (Virtual)","|Complete|","14","`#104224 `__","" +"`P2418R2 `__","Add support for ``std::generator``-like types to ``std::format``","2021-10 (Virtual)","|Complete|","15","`#104225 `__","" +"`P2432R1 `__","Fix ``istream_view``","2021-10 (Virtual)","|Complete|","16","`#104226 `__","" diff --git a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx23Issues.csv b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx23Issues.csv index 189f8452e0..5a68b51ec8 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx23Issues.csv +++ b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx23Issues.csv @@ -1,308 +1,308 @@ -"Issue #","Issue Name","Meeting","Status","First released version","Notes" -"`LWG2839 `__","Self-move-assignment of library types, again","2020-11 (Virtual)","|Nothing To Do|","","" -"`LWG3117 `__","Missing ``packaged_task`` deduction guides","2020-11 (Virtual)","|Complete|","16","" -"`LWG3143 `__","``monotonic_buffer_resource`` growth policy is unclear","2020-11 (Virtual)","","","" -"`LWG3195 `__","What is the stored pointer value of an empty ``weak_ptr``?","2020-11 (Virtual)","|Nothing To Do|","","" -"`LWG3211 `__","``std::tuple<>`` should be trivially constructible","2020-11 (Virtual)","|Complete|","9","" -"`LWG3236 `__","Random access iterator requirements lack limiting relational operators domain to comparing those from the same range","2020-11 (Virtual)","|Nothing To Do|","","" -"`LWG3265 `__","``move_iterator``'s conversions are more broken after P1207","2020-11 (Virtual)","|Nothing To Do|","","Resolved by `LWG3435 `__" -"`LWG3435 `__","``three_way_comparable_with, reverse_iterator>``","2020-11 (Virtual)","|Complete|","13","" -"`LWG3432 `__","Missing requirement for ``comparison_category``","2020-11 (Virtual)","|Complete|","16","" -"`LWG3447 `__","Deduction guides for ``take_view`` and ``drop_view`` have different constraints","2020-11 (Virtual)","|Complete|","14","" -"`LWG3450 `__","The const overloads of ``take_while_view::begin/end`` are underconstrained","2020-11 (Virtual)","|Complete|","16","" -"`LWG3464 `__","``istream::gcount()`` can overflow","2020-11 (Virtual)","|Complete|","18","" -"`LWG2731 `__","Existence of ``lock_guard::mutex_type`` typedef unclear","2020-11 (Virtual)","|Complete|","5","" -"`LWG2743 `__","P0083R3 ``node_handle`` private members missing ""exposition only"" comment","2020-11 (Virtual)","|Nothing To Do|","","" -"`LWG2820 `__","Clarify ```` macros","2020-11 (Virtual)","|Nothing To Do|","","" -"`LWG3120 `__","Unclear behavior of ``monotonic_buffer_resource::release()``","2020-11 (Virtual)","|Complete|","16","" -"`LWG3170 `__","``is_always_equal`` added to ``std::allocator`` makes the standard library treat derived types as always equal","2020-11 (Virtual)","|Complete|","18","" -"`LWG3036 `__","``polymorphic_allocator::destroy`` is extraneous","2020-11 (Virtual)","|Nothing To Do|","","Reverted by P2875R4" -"`LWG3171 `__","LWG2989 breaks ``directory_entry`` stream insertion","2020-11 (Virtual)","|Complete|","14","" -"`LWG3306 `__","``ranges::advance`` violates its preconditions","2020-11 (Virtual)","|Complete|","14","" -"`LWG3403 `__","Domain of ``ranges::ssize(E)`` doesn't ``match ranges::size(E)``","2020-11 (Virtual)","","","" -"`LWG3404 `__","Finish removing subrange's conversions from pair-like","2020-11 (Virtual)","|Complete|","13","" -"`LWG3405 `__","``common_view``'s converting constructor is bad, too","2020-11 (Virtual)","|Complete|","14","" -"`LWG3406 `__","``elements_view::begin()`` and ``elements_view::end()`` have incompatible constraints","2020-11 (Virtual)","|Complete|","16","" -"`LWG3419 `__","[algorithms.requirements]/15 doesn't reserve as many rights as it intends to","2020-11 (Virtual)","|Nothing To Do|","","" -"`LWG3420 `__","cpp17-iterator should check that the type looks like an iterator first","2020-11 (Virtual)","|Complete|","14","" -"`LWG3421 `__","Imperfect ADL emulation for boolean-testable","2020-11 (Virtual)","|Nothing To Do|","","" -"`LWG3425 `__","``condition_variable_any`` fails to constrain its Lock parameters","2020-11 (Virtual)","|Nothing To Do|","","" -"`LWG3426 `__","``operator<=>(const unique_ptr&, nullptr_t)`` can't get no satisfaction","2020-11 (Virtual)","|Complete|","16","" -"`LWG3427 `__","``operator<=>(const shared_ptr&, nullptr_t)`` definition ill-formed","2020-11 (Virtual)","|Complete|","16","" -"`LWG3428 `__","``single_view``'s in place constructor should be explicit","2020-11 (Virtual)","|Complete|","14","" -"`LWG3434 `__","``ios_base`` never reclaims memory for iarray and parray","2020-11 (Virtual)","|Nothing To Do|","","" -"`LWG3437 `__","``__cpp_lib_polymorphic_allocator`` is in the wrong header","2020-11 (Virtual)","|Complete|","14","" -"`LWG3446 `__","``indirectly_readable_traits`` ambiguity for types with both ``value_type`` and ``element_type``","2020-11 (Virtual)","|Complete|","14","" -"`LWG3448 `__","``transform_view``'s ``sentinel`` not comparable with ``iterator``","2020-11 (Virtual)","","","" -"`LWG3449 `__","``take_view`` and ``take_while_view``'s ``sentinel`` not comparable with their ``const iterator``","2020-11 (Virtual)","|Complete|","16","" -"`LWG3453 `__","Generic code cannot call ``ranges::advance(i, s)``","2020-11 (Virtual)","|Nothing To Do|","","" -"`LWG3455 `__","Incorrect Postconditions on ``unique_ptr`` move assignment","2020-11 (Virtual)","|Nothing To Do|","","" -"`LWG3460 `__","Unimplementable ``noop_coroutine_handle`` guarantees","2020-11 (Virtual)","|Complete|","14","" -"`LWG3461 `__","``convertible_to``'s description mishandles cv-qualified ``void``","2020-11 (Virtual)","|Nothing To Do|","","" -"`LWG3465 `__","``compare_partial_order_fallback`` requires ``F < E``","2020-11 (Virtual)","|Complete|","14","" -"`LWG3466 `__","Specify the requirements for ``promise``/``future``/``shared_future`` consistently","2020-11 (Virtual)","|Nothing To Do|","","" -"`LWG3467 `__","``bool`` can't be an integer-like type","2020-11 (Virtual)","|Complete|","14","" -"`LWG3472 `__","``counted_iterator`` is missing preconditions","2020-11 (Virtual)","|Complete|","14","" -"`LWG3473 `__","Normative encouragement in non-normative note","2020-11 (Virtual)","|Complete|","15","" -"`LWG3474 `__","Nesting ``join_views`` is broken because of CTAD","2020-11 (Virtual)","|Complete|","15","" -"`LWG3476 `__","``thread`` and ``jthread`` constructors require that the parameters be move-constructible but never move construct the parameters","2020-11 (Virtual)","","","" -"`LWG3477 `__","Simplify constraints for ``semiregular-box``","2020-11 (Virtual)","|Complete|","13","" -"`LWG3482 `__","``drop_view``'s const begin should additionally require ``sized_range``","2020-11 (Virtual)","|Complete|","14","" -"`LWG3483 `__","``transform_view::iterator``'s difference is overconstrained","2020-11 (Virtual)","|Complete|","14","" -"","","","","","" -"`LWG3391 `__","Problems with ``counted_iterator``/``move_iterator::base() const &``","2021-02 (Virtual)","","","" -"`LWG3433 `__","``subrange::advance(n)`` has UB when ``n < 0``","2021-02 (Virtual)","|Complete|","14","" -"`LWG3490 `__","``ranges::drop_while_view::begin()`` is missing a precondition","2021-02 (Virtual)","|Nothing To Do|","","" -"`LWG3492 `__","Minimal improvements to ``elements_view::iterator``","2021-02 (Virtual)","|Complete|","16","" -"`LWG3494 `__","Allow ranges to be conditionally borrowed","2021-02 (Virtual)","|Nothing To Do|","","Superseded by `P2017R1 `__" -"`LWG3495 `__","``constexpr launder`` makes pointers to inactive members of unions usable","2021-02 (Virtual)","|Nothing To Do|","","" -"`LWG3500 `__","``join_view::iterator::operator->()`` is bogus","2021-02 (Virtual)","|Complete|","14","" -"`LWG3502 `__","``elements_view`` should not be allowed to return dangling reference","2021-02 (Virtual)","|Complete|","16","" -"`LWG3505 `__","``split_view::outer-iterator::operator++`` misspecified","2021-02 (Virtual)","","","" -"","","","","","" -"`LWG2774 `__","``std::function`` construction vs assignment","2021-06 (Virtual)","","","" -"`LWG2818 `__","``::std::`` everywhere rule needs tweaking","2021-06 (Virtual)","|Nothing To Do|","","" -"`LWG2997 `__","LWG 491 and the specification of ``{forward_,}list::unique``","2021-06 (Virtual)","","","" -"`LWG3410 `__","``lexicographical_compare_three_way`` is overspecified","2021-06 (Virtual)","|Complete|","17","" -"`LWG3430 `__","``std::fstream`` & co. should be constructible from string_view","2021-06 (Virtual)","|Complete|","19","" -"`LWG3462 `__","§[formatter.requirements]: Formatter requirements forbid use of ``fc.arg()``","2021-06 (Virtual)","|Nothing To Do|","","" -"`LWG3481 `__","``viewable_range`` mishandles lvalue move-only views","2021-06 (Virtual)","|Nothing To Do|","","Superseded by `P2415R2 `__" -"`LWG3506 `__","Missing allocator-extended constructors for ``priority_queue``","2021-06 (Virtual)","|Complete|","14","" -"`LWG3517 `__","``join_view::iterator``'s ``iter_swap`` is underconstrained","2021-06 (Virtual)","|Complete|","14","" -"`LWG3518 `__","Exception requirements on char trait operations unclear","2021-06 (Virtual)","|Nothing To Do|","","" -"`LWG3519 `__","Incomplete synopses for ```` classes","2021-06 (Virtual)","","","" -"`LWG3520 `__","``iter_move`` and ``iter_swap`` are inconsistent for ``transform_view::iterator``","2021-06 (Virtual)","|Complete|","14","" -"`LWG3521 `__","Overly strict requirements on ``qsort`` and ``bsearch``","2021-06 (Virtual)","|Nothing To Do|","","" -"`LWG3522 `__","Missing requirement on ``InputIterator`` template parameter for ``priority_queue`` constructors","2021-06 (Virtual)","|Complete|","14","" -"`LWG3523 `__","``iota_view::sentinel`` is not always ``iota_view``'s sentinel","2021-06 (Virtual)","|Complete|","17","" -"`LWG3526 `__","Return types of ``uses_allocator_construction_args`` unspecified","2021-06 (Virtual)","","","" -"`LWG3527 `__","``uses_allocator_construction_args`` handles rvalue pairs of rvalue references incorrectly","2021-06 (Virtual)","","","" -"`LWG3528 `__","``make_from_tuple`` can perform (the equivalent of) a C-style cast","2021-06 (Virtual)","|Complete|","19","" -"`LWG3529 `__","``priority_queue(first, last)`` should construct ``c`` with ``(first, last)``","2021-06 (Virtual)","|Complete|","14","" -"`LWG3530 `__","``BUILTIN-PTR-MEOW`` should not opt the type out of syntactic checks","2021-06 (Virtual)","","","" -"`LWG3532 `__","``split_view::inner-iterator::operator++(int)`` should depend on ``Base``","2021-06 (Virtual)","","","" -"`LWG3533 `__","Make ``base() const &`` consistent across iterator wrappers that supports ``input_iterators``","2021-06 (Virtual)","|Complete|","14","" -"`LWG3536 `__","Should ``chrono::from_stream()`` assign zero to duration for failure?","2021-06 (Virtual)","","","" -"`LWG3539 `__","``format_to`` must not copy models of ``output_iterator``","2021-06 (Virtual)","|Complete|","14","" -"`LWG3540 `__","§[format.arg] There should be no const in ``basic_format_arg(const T* p)``","2021-06 (Virtual)","|Complete|","14","" -"`LWG3541 `__","``indirectly_readable_traits`` should be SFINAE-friendly for all types","2021-06 (Virtual)","|Complete|","14","" -"`LWG3542 `__","``basic_format_arg`` mishandles ``basic_string_view`` with custom traits","2021-06 (Virtual)","|Complete|","14","" -"`LWG3543 `__","Definition of when ``counted_iterators`` refer to the same sequence isn't quite right","2021-06 (Virtual)","|Nothing To Do|","","" -"`LWG3544 `__","``format-arg-store::args`` is unintentionally not exposition-only","2021-06 (Virtual)","|Complete|","14","" -"`LWG3546 `__","``common_iterator``'s postfix-proxy is not quite right","2021-06 (Virtual)","","","" -"`LWG3548 `__","``shared_ptr`` construction from ``unique_ptr`` should move (not copy) the deleter","2021-06 (Virtual)","|Complete|","15","" -"`LWG3549 `__","``view_interface`` is overspecified to derive from ``view_base``","2021-06 (Virtual)","|Complete|","14","" -"`LWG3551 `__","``borrowed_{iterator,subrange}_t`` are overspecified","2021-06 (Virtual)","|Nothing To Do|","","" -"`LWG3552 `__","Parallel specialized memory algorithms should require forward iterators","2021-06 (Virtual)","","","" -"`LWG3553 `__","Useless constraint in ``split_view::outer-iterator::value_type::begin()``","2021-06 (Virtual)","","","" -"`LWG3555 `__","``{transform,elements}_view::iterator::iterator_concept`` should consider const-qualification of the underlying range","2021-06 (Virtual)","","","" -"","","","","","" -"`LWG2191 `__","Incorrect specification of ``match_results(match_results&&)``","2021-10 (Virtual)","|Nothing To Do|","","" -"`LWG2381 `__","Inconsistency in parsing floating point numbers","2021-10 (Virtual)","|Complete|","19","" -"`LWG2762 `__","``unique_ptr operator*()`` should be ``noexcept``","2021-10 (Virtual)","|Complete|","19","" -"`LWG3121 `__","``tuple`` constructor constraints for ``UTypes&&...`` overloads","2021-10 (Virtual)","","","" -"`LWG3123 `__","``duration`` constructor from representation shouldn't be effectively non-throwing","2021-10 (Virtual)","","","" -"`LWG3146 `__","Excessive unwrapping in ``std::ref/cref``","2021-10 (Virtual)","|Complete|","14","" -"`LWG3152 `__","``common_type`` and ``common_reference`` have flaws in common","2021-10 (Virtual)","","","" -"`LWG3293 `__","``move_iterator operator+()`` has incorrect constraints","2021-10 (Virtual)","|Complete|","15","" -"`LWG3361 `__","``safe_range`` case","2021-10 (Virtual)","|Nothing To Do|","","" -"`LWG3392 `__","``ranges::distance()`` cannot be used on a move-only iterator with a sized sentinel","2021-10 (Virtual)","|Complete|","14","" -"`LWG3407 `__","Some problems with the wording changes of P1739R4","2021-10 (Virtual)","|Complete|","15","" -"`LWG3422 `__","Issues of ``seed_seq``'s constructors","2021-10 (Virtual)","|Complete|","14","" -"`LWG3470 `__","``convertible-to-non-slicing`` seems to reject valid case","2021-10 (Virtual)","|Complete|","14","" -"`LWG3480 `__","``directory_iterator`` and ``recursive_directory_iterator`` are not C++20 ranges","2021-10 (Virtual)","|Complete|","14","" -"`LWG3498 `__","Inconsistent ``noexcept``-specifiers for ``basic_syncbuf``","2021-10 (Virtual)","","","" -"`LWG3535 `__","``join_view::iterator::iterator_category`` and ``::iterator_concept`` lie","2021-10 (Virtual)","|Complete|","15","" -"`LWG3554 `__","``chrono::parse`` needs ``const charT*`` and ``basic_string_view`` overloads","2021-10 (Virtual)","","","" -"`LWG3557 `__","The ``static_cast`` expression in ``convertible_to`` has the wrong operand","2021-10 (Virtual)","|Complete|","14","" -"`LWG3559 `__","Semantic requirements of ``sized_range`` is circular","2021-10 (Virtual)","|Nothing To Do|","","" -"`LWG3560 `__","``ranges::equal`` and ``ranges::is_permutation`` should short-circuit for ``sized_ranges``","2021-10 (Virtual)","","","" -"`LWG3561 `__","Issue with internal counter in ``discard_block_engine``","2021-10 (Virtual)","","","" -"`LWG3563 `__","``keys_view`` example is broken","2021-10 (Virtual)","","","" -"`LWG3566 `__","Constraint recursion for ``operator<=>(optional, U)``","2021-10 (Virtual)","|Complete|","17","" -"`LWG3567 `__","Formatting move-only iterators take two","2021-10 (Virtual)","|Complete|","16","" -"`LWG3568 `__","``basic_istream_view`` needs to initialize ``value_``","2021-10 (Virtual)","|Complete|","16","" -"`LWG3570 `__","``basic_osyncstream::emit`` should be an unformatted output function","2021-10 (Virtual)","|Complete|","18","" -"`LWG3571 `__","``flush_emit`` should set ``badbit`` if the ``emit`` call fails","2021-10 (Virtual)","","","" -"`LWG3572 `__","``copyable-box`` should be fully ``constexpr``","2021-10 (Virtual)","|Complete|","14","" -"`LWG3573 `__","Missing Throws element for ``basic_string_view(It begin, End end)``","2021-10 (Virtual)","|Complete|","14","" -"`LWG3574 `__","``common_iterator`` should be completely ``constexpr``-able","2021-10 (Virtual)","|Complete|","14","" -"`LWG3580 `__","``iota_view``'s ``iterator``'s binary ``operator+`` should be improved","2021-10 (Virtual)","|Complete|","14","" -"`LWG3581 `__","The range constructor makes ``basic_string_view`` not trivially move constructible","2021-10 (Virtual)","|Complete|","14","" -"`LWG3585 `__","``variant`` converting assignment with immovable alternative","2021-10 (Virtual)","","","" -"`LWG3589 `__","The ``const`` lvalue reference overload of ``get`` for ``subrange`` does not constrain ``I`` to be ``copyable`` when ``N == 0``","2021-10 (Virtual)","|Complete|","14","" -"`LWG3590 `__","``split_view::base() const &`` is overconstrained","2021-10 (Virtual)","|Complete|","16","" -"`LWG3591 `__","``lazy_split_view::inner-iterator::base() &&`` invalidates outer iterators","2021-10 (Virtual)","","","" -"`LWG3592 `__","``lazy_split_view`` needs to check the simpleness of Pattern","2021-10 (Virtual)","","","" -"`LWG3593 `__","Several iterators' ``base() const &`` and ``lazy_split_view::outer-iterator::value_type::end()`` missing ``noexcept``","2021-10 (Virtual)","","","" -"`LWG3595 `__","Exposition-only classes proxy and postfix-proxy for ``common_iterator`` should be fully ``constexpr``","2021-10 (Virtual)","|Complete|","14","" -"","","","","","" -"`LWG3088 `__","``forward_list::merge`` behaviour unclear when passed ``*this``","2022-02 (Virtual)","|Complete|","Yes","" -"`LWG3471 `__","``polymorphic_allocator::allocate`` does not satisfy ``Cpp17Allocator`` requirements","2022-02 (Virtual)","","","" -"`LWG3525 `__","``uses_allocator_construction_args`` fails to handle types convertible to ``pair``","2022-02 (Virtual)","","","" -"`LWG3598 `__","``system_category().default_error_condition(0)`` is underspecified","2022-02 (Virtual)","","","" -"`LWG3601 `__","common_iterator's postfix-proxy needs ``indirectly_readable`` ","2022-02 (Virtual)","","","" -"`LWG3607 `__","``contiguous_iterator`` should not be allowed to have custom ``iter_move`` and ``iter_swap`` behavior","2022-02 (Virtual)","|Nothing To Do|","","" -"`LWG3610 `__","``iota_view::size`` sometimes rejects integer-class types","2022-02 (Virtual)","","","" -"`LWG3612 `__","Inconsistent pointer alignment in ``std::format`` ","2022-02 (Virtual)","|Complete|","14","" -"`LWG3616 `__","LWG 3498 seems to miss the non-member ``swap`` for ``basic_syncbuf`` ","2022-02 (Virtual)","|Complete|","18","" -"`LWG3618 `__","Unnecessary ``iter_move`` for ``transform_view::iterator`` ","2022-02 (Virtual)","|Complete|","19","" -"`LWG3619 `__","Specification of ``vformat_to`` contains ill-formed ``formatted_size`` calls","2022-02 (Virtual)","|Nothing To Do|","","" -"`LWG3621 `__","Remove feature-test macro ``__cpp_lib_monadic_optional`` ","2022-02 (Virtual)","|Complete|","15","" -"`LWG3632 `__","``unique_ptr`` ""Mandates: This constructor is not selected by class template argument deduction""","2022-02 (Virtual)","|Nothing To Do|","","" -"`LWG3643 `__","Missing ``constexpr`` in ``std::counted_iterator`` ","2022-02 (Virtual)","|Complete|","19","" -"`LWG3648 `__","``format`` should not print ``bool`` with ``'c'`` ","2022-02 (Virtual)","|Complete|","15","" -"`LWG3649 `__","[fund.ts.v2] Reinstate and bump ``__cpp_lib_experimental_memory_resource`` feature test macro","2022-02 (Virtual)","","","" -"`LWG3650 `__","Are ``std::basic_string`` 's ``iterator`` and ``const_iterator`` constexpr iterators?","2022-02 (Virtual)","|Nothing To Do|","","" -"`LWG3654 `__","``basic_format_context::arg(size_t)`` should be ``noexcept`` ","2022-02 (Virtual)","|Complete|","15","" -"`LWG3657 `__","``std::hash`` is not enabled","2022-02 (Virtual)","|Complete|","17","" -"`LWG3660 `__","``iterator_traits::pointer`` should conform to §[iterator.traits]","2022-02 (Virtual)","|Complete|","14","" -"`LWG3661 `__","``constinit atomic> a(nullptr);`` should work","2022-02 (Virtual)","","","" -"","","","","","" -"`LWG3564 `__","``transform_view::iterator::value_type`` and ``iterator_category`` should use ``const F&``","2022-07 (Virtual)","|Complete|","20","" -"`LWG3617 `__","``function``/``packaged_task`` deduction guides and deducing ``this``","2022-07 (Virtual)","","","" -"`LWG3656 `__","Inconsistent bit operations returning a count","2022-07 (Virtual)","|Complete|","15","" -"`LWG3659 `__","Consider ``ATOMIC_FLAG_INIT`` undeprecation","2022-07 (Virtual)","|Complete|","15","" -"`LWG3670 `__","``Cpp17InputIterators`` don't have integer-class difference types","2022-07 (Virtual)","","","" -"`LWG3671 `__","``atomic_fetch_xor`` missing from ``stdatomic.h``","2022-07 (Virtual)","|Complete|","20","" -"`LWG3672 `__","``common_iterator::operator->()`` should return by value","2022-07 (Virtual)","|Complete|","19","" -"`LWG3683 `__","``operator==`` for ``polymorphic_allocator`` cannot deduce template argument in common cases","2022-07 (Virtual)","|Complete|","20","" -"`LWG3687 `__","``expected`` move constructor should move","2022-07 (Virtual)","|Complete|","16","" -"`LWG3692 `__","``zip_view::iterator``'s ``operator<=>`` is overconstrained","2022-07 (Virtual)","|Complete|","20","" -"`LWG3701 `__","Make ``formatter, charT>`` requirement explicit","2022-07 (Virtual)","|Complete|","15","" -"`LWG3702 `__","Should ``zip_transform_view::iterator`` remove ``operator<``","2022-07 (Virtual)","|Complete|","22","" -"`LWG3703 `__","Missing requirements for ``expected`` requires ``is_void``","2022-07 (Virtual)","|Complete|","16","" -"`LWG3704 `__","LWG 2059 added overloads that might be ill-formed for sets","2022-07 (Virtual)","","","" -"`LWG3705 `__","Hashability shouldn't depend on basic_string's allocator","2022-07 (Virtual)","|Complete|","16","" -"`LWG3707 `__","chunk_view::outer-iterator::value_type::size should return unsigned type","2022-07 (Virtual)","","","" -"`LWG3708 `__","``take_while_view::sentinel``'s conversion constructor should move","2022-07 (Virtual)","|Complete|","16","" -"`LWG3709 `__","LWG-3703 was underly ambitious","2022-07 (Virtual)","","","" -"`LWG3710 `__","The ``end`` of ``chunk_view`` for input ranges can be ``const``","2022-07 (Virtual)","","","" -"`LWG3711 `__","Missing preconditions for slide_view constructor","2022-07 (Virtual)","","","" -"`LWG3712 `__","``chunk_view`` and ``slide_view`` should not be ``default_initializable``","2022-07 (Virtual)","","","" -"`LWG3713 `__","Sorted with respect to comparator (only)","2022-07 (Virtual)","|Nothing To Do|","","" -"`LWG3715 `__","``view_interface::empty`` is overconstrained","2022-07 (Virtual)","|Complete|","19","" -"`LWG3719 `__","Directory iterators should be usable with default sentinel","2022-07 (Virtual)","|Complete|","17","" -"`LWG3721 `__","Allow an ``arg-id`` with a value of zero for ``width`` in ``std-format-spec``","2022-07 (Virtual)","|Complete|","16","" -"`LWG3724 `__","``decay-copy`` should be constrained","2022-07 (Virtual)","|Complete|","14","" -"","","","","","" -"`LWG3028 `__","Container requirements tables should distinguish ``const`` and non-``const`` variables","2022-11 (Kona)","","","" -"`LWG3118 `__","``fpos`` equality comparison unspecified","2022-11 (Kona)","","","" -"`LWG3177 `__","Limit permission to specialize variable templates to program-defined types","2022-11 (Kona)","|Nothing To Do|","","" -"`LWG3515 `__","§[stacktrace.basic.nonmem]: ``operator<<`` should be less templatized","2022-11 (Kona)","","","" -"`LWG3545 `__","``std::pointer_traits`` should be SFINAE-friendly","2022-11 (Kona)","|Complete|","18","" -"`LWG3569 `__","``join_view`` fails to support ranges of ranges with non-default_initializable iterators","2022-11 (Kona)","","","" -"`LWG3594 `__","``inout_ptr`` — inconsistent ``release()`` in destructor","2022-11 (Kona)","|Complete|","19","" -"`LWG3597 `__","Unsigned integer types don't model advanceable","2022-11 (Kona)","","","" -"`LWG3600 `__","Making ``istream_iterator`` copy constructor trivial is an ABI break","2022-11 (Kona)","|Complete|","","" -"`LWG3629 `__","``make_error_code`` and ``make_error_condition`` are customization points","2022-11 (Kona)","|Complete|","16","" -"`LWG3636 `__","``formatter::format`` should be ``const``-qualified","2022-11 (Kona)","|Complete|","16","" -"`LWG3646 `__","``std::ranges::view_interface::size`` returns a signed type","2022-11 (Kona)","|Complete|","16","" -"`LWG3677 `__","Is a cv-qualified ``pair`` specially handled in uses-allocator construction?","2022-11 (Kona)","|Complete|","18","" -"`LWG3717 `__","``common_view::end`` should improve ``random_access_range`` case","2022-11 (Kona)","","","" -"`LWG3732 `__","``prepend_range`` and ``append_range`` can't be amortized constant time","2022-11 (Kona)","|Nothing To Do|","","" -"`LWG3736 `__","``move_iterator`` missing ``disable_sized_sentinel_for`` specialization","2022-11 (Kona)","|Complete|","19","" -"`LWG3737 `__","``take_view::sentinel`` should provide ``operator-``","2022-11 (Kona)","","","" -"`LWG3738 `__","Missing preconditions for ``take_view`` constructor","2022-11 (Kona)","|Complete|","16","" -"`LWG3743 `__","``ranges::to``'s reserve may be ill-formed","2022-11 (Kona)","","","" -"`LWG3745 `__","``std::atomic_wait`` and its friends lack ``noexcept``","2022-11 (Kona)","|Complete|","16","" -"`LWG3746 `__","``optional``'s spaceship with ``U`` with a type derived from optional causes infinite constraint meta-recursion","2022-11 (Kona)","|Complete|","17","" -"`LWG3747 `__","``ranges::uninitialized_copy_n``, ``ranges::uninitialized_move_n``, and ``ranges::destroy_n`` should use ``std::move``","2022-11 (Kona)","","","" -"`LWG3750 `__","Too many papers bump ``__cpp_lib_format``","2022-11 (Kona)","|Partial|","","Only ``__cpp_lib_format_ranges`` is fully implemented" -"`LWG3751 `__","Missing feature macro for ``flat_set``","2022-11 (Kona)","","","" -"`LWG3753 `__","Clarify entity vs. freestanding entity","2022-11 (Kona)","","","" -"`LWG3754 `__","Class template expected synopsis contains declarations that do not match the detailed description","2022-11 (Kona)","|Nothing To Do|","","" -"`LWG3755 `__","``tuple-for-each`` can call ``user-defined`` ``operator,``","2022-11 (Kona)","|Complete|","17","" -"`LWG3757 `__","What's the effect of ``std::forward_like(x)``?","2022-11 (Kona)","|Complete|","","" -"`LWG3759 `__","``ranges::rotate_copy`` should use ``std::move``","2022-11 (Kona)","|Complete|","15","" -"`LWG3760 `__","``cartesian_product_view::iterator``'s ``parent_`` is never valid","2022-11 (Kona)","","","" -"`LWG3761 `__","``cartesian_product_view::iterator::operator-`` should pass by reference","2022-11 (Kona)","","","" -"`LWG3762 `__","``generator::iterator::operator==`` should pass by reference","2022-11 (Kona)","","","" -"`LWG3764 `__","``reference_wrapper::operator()`` should propagate noexcept","2022-11 (Kona)","|Complete|","17","" -"`LWG3765 `__","``const_sentinel`` should be constrained","2022-11 (Kona)","","","" -"`LWG3766 `__","``view_interface::cbegin`` is underconstrained","2022-11 (Kona)","","","" -"`LWG3770 `__","``const_sentinel_t`` is missing","2022-11 (Kona)","","","" -"`LWG3773 `__","``views::zip_transform`` still requires ``F`` to be ``copy_constructible`` when empty pack","2022-11 (Kona)","|Complete|","22","" -"`LWG3774 `__","```` should include ````","2022-11 (Kona)","","","" -"`LWG3775 `__","Broken dependencies in the ``Cpp17Allocator`` requirements","2022-11 (Kona)","","","" -"`LWG3778 `__","``vector`` missing exception specifications","2022-11 (Kona)","|Complete|","3.7","" -"`LWG3781 `__","The exposition-only alias templates ``cont-key-type`` and ``cont-mapped-type`` should be removed","2022-11 (Kona)","|Nothing To Do|","","" -"`LWG3782 `__","Should ```` declare ``::lerp``?","2022-11 (Kona)","|Complete|","17","" -"`LWG3784 `__","std.compat should not provide ``::byte`` and its friends","2022-11 (Kona)","|Complete|","19","" -"`LWG3785 `__","``ranges::to`` is over-constrained on the destination type being a range","2022-11 (Kona)","","","" -"`LWG3788 `__","``jthread::operator=(jthread&&)`` postconditions are unimplementable under self-assignment","2022-11 (Kona)","","","" -"`LWG3792 `__","``__cpp_lib_constexpr_algorithms`` should also be defined in ````","2022-11 (Kona)","|Complete|","16","" -"`LWG3795 `__","Self-move-assignment of ``std::future`` and ``std::shared_future`` have unimplementable postconditions","2022-11 (Kona)","","","" -"`LWG3796 `__","``movable-box`` as member should use ``default-initialization`` instead of ``copy-initialization``","2022-11 (Kona)","","","" -"`LWG3798 `__","Rvalue reference and ``iterator_category``","2022-11 (Kona)","|Partial|","","``adjacent_transform_view`` hasn't been done yet since this type isn't implemented yet" -"`LWG3801 `__","``cartesian_product_view::iterator::distance-from`` ignores the size of last underlying range","2022-11 (Kona)","","","" -"`LWG3814 `__","Add freestanding items requested by NB comments","2022-11 (Kona)","","","" -"`LWG3816 `__","``flat_map`` and ``flat_multimap`` should impose sequence container requirements","2022-11 (Kona)","","","" -"`LWG3817 `__","Missing preconditions on ``forward_list`` modifiers","2022-11 (Kona)","","","" -"`LWG3818 `__","Exposition-only concepts are not described in library intro","2022-11 (Kona)","|Nothing To Do|","","" -"`LWG3822 `__","Avoiding normalization in ``filesystem::weakly_canonical``","2022-11 (Kona)","","","" -"`LWG3823 `__","Unnecessary precondition for ``is_aggregate``","2022-11 (Kona)","|Nothing To Do|","","" -"`LWG3824 `__","Number of ``bind`` placeholders is underspecified","2022-11 (Kona)","|Nothing To Do|","","" -"`LWG3826 `__","Redundant specification [for overload of yield_value]","2022-11 (Kona)","|Nothing To Do|","","" -"","","","","","" -"`LWG2195 `__","Missing constructors for ``match_results``","2023-02 (Issaquah)","","","" -"`LWG2295 `__","Locale name when the provided ``Facet`` is a ``nullptr``","2023-02 (Issaquah)","","","" -"`LWG3032 `__","``ValueSwappable`` requirement missing for ``push_heap`` and ``make_heap``","2023-02 (Issaquah)","","","" -"`LWG3085 `__","``char_traits::copy`` precondition too weak","2023-02 (Issaquah)","","","" -"`LWG3664 `__","`LWG 3392 `__ ``broke std::ranges::distance(a, a+3)``","2023-02 (Issaquah)","","","" -"`LWG3720 `__","Restrict the valid types of ``arg-id`` for width and precision in ``std-format-spec``","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3756 `__","Is the ``std::atomic_flag`` class signal-safe?","2023-02 (Issaquah)","","","" -"`LWG3769 `__","``basic_const_iterator::operator==`` causes infinite constraint recursion","2023-02 (Issaquah)","","","" -"`LWG3807 `__","The feature test macro for ``ranges::find_last`` should be renamed","2023-02 (Issaquah)","","","" -"`LWG3811 `__","``views::as_const`` on ``ref_view`` should return ``ref_view``","2023-02 (Issaquah)","","","" -"`LWG3820 `__","``cartesian_product_view::iterator::prev`` is not quite right","2023-02 (Issaquah)","","","" -"`LWG3825 `__","Missing compile-time argument ``id`` check in ``basic_format_parse_context::next_arg_id``","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3204 `__","``sub_match::swap`` only swaps the base class","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3733 `__","``ranges::to`` misuses ``cpp17-input-iterator``","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3742 `__","``deque::prepend_range`` needs to permute","2023-02 (Issaquah)","","","" -"`LWG3790 `__","`P1467 `__ accidentally changed ``nexttoward``'s signature","2023-02 (Issaquah)","","","" -"`LWG3819 `__","``reference_meows_from_temporary`` should not use ``is_meowible``","2023-02 (Issaquah)","","","" -"`LWG3821 `__","``uses_allocator_construction_args`` should have overload for ``pair-like``","2023-02 (Issaquah)","|Complete|","18","" -"`LWG3834 `__","Missing ``constexpr`` for ``std::intmax_t`` math functions in ````","2023-02 (Issaquah)","","","" -"`LWG3839 `__","``range_formatter``'s ``set_separator``, ``set_brackets``, and ``underlying`` functions should be ``noexcept``","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3841 `__","```` should not be ""all freestanding""","2023-02 (Issaquah)","","","" -"`LWG3842 `__","Unclear wording for ``precision`` in ``chrono-format-spec``","2023-02 (Issaquah)","|Complete|","16","" -"`LWG3848 `__","``adjacent_view``, ``adjacent_transform_view`` and ``slide_view`` missing ``base`` accessor","2023-02 (Issaquah)","","","" -"`LWG3849 `__","``cartesian_product_view::iterator``'s default constructor is overconstrained","2023-02 (Issaquah)","","","" -"`LWG3850 `__","``views::as_const`` on ``empty_view`` should return ``empty_view``","2023-02 (Issaquah)","","","" -"`LWG3851 `__","``chunk_view::inner-iterator`` missing custom ``iter_move`` and ``iter_swap``","2023-02 (Issaquah)","","","" -"`LWG3853 `__","``basic_const_iterator::operator->`` is ill-formed","2023-02 (Issaquah)","","","" -"`LWG3857 `__","``basic_string_view`` should allow explicit conversion when only traits vary","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3860 `__","``range_common_reference_t`` is missing","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3866 `__","Bad Mandates for ``expected::transform_error`` overloads","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3867 `__","Should ``std::basic_osyncstream``'s move assignment operator be ``noexcept``?","2023-02 (Issaquah)","|Complete|","18","" -"`LWG3441 `__","Misleading note about calls to customization points","2023-02 (Issaquah)","","","" -"`LWG3622 `__","Misspecified transitivity of equivalence in §[unord.req.general]","2023-02 (Issaquah)","","","" -"`LWG3631 `__","``basic_format_arg(T&&)`` should use ``remove_cvref_t`` throughout","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3645 `__","``resize_and_overwrite`` is overspecified to call its callback with lvalues","2023-02 (Issaquah)","|Complete|","14","" -"`LWG3655 `__","The ``INVOKE`` operation and union types","2023-02 (Issaquah)","|Complete|","18","" -"`LWG3723 `__","``priority_queue::push_range`` needs to ``append_range``","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3734 `__","Inconsistency in ``inout_ptr`` and ``out_ptr`` for empty case","2023-02 (Issaquah)","|Complete|","19","" -"`LWG3772 `__","``repeat_view``'s ``piecewise`` constructor is missing Postconditions","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3786 `__","Flat maps' deduction guide needs to default ``Allocator`` to be useful","2023-02 (Issaquah)","","","" -"`LWG3803 `__","``flat_foo`` constructors taking ``KeyContainer`` lack ``KeyCompare`` parameter","2023-02 (Issaquah)","","","" -"`LWG3810 `__","CTAD for ``std::basic_format_args``","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3827 `__","Deprecate ```` and ```` macros","2023-02 (Issaquah)","","","" -"`LWG3828 `__","Sync ``intmax_t`` and ``uintmax_t`` with C2x","2023-02 (Issaquah)","|Nothing To Do|","","" -"`LWG3833 `__","Remove specialization ``template struct formatter``","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3836 `__","``std::expected`` conversion constructor ``expected(const expected&)`` should take precedence over ``expected(U&&)`` with operator ``bool``","2023-02 (Issaquah)","|Complete|","18","" -"`LWG3843 `__","``std::expected::value() &`` assumes ``E`` is copy constructible","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3847 `__","``ranges::to`` can still return views","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3862 `__","``basic_const_iterator``'s ``common_type`` specialization is underconstrained","2023-02 (Issaquah)","","","" -"`LWG3865 `__","Sorting a range of ``pairs``","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3869 `__","Deprecate ``std::errc`` constants related to UNIX STREAMS","2023-02 (Issaquah)","|Complete|","19","" -"`LWG3870 `__","Remove ``voidify``","2023-02 (Issaquah)","|Complete|","20","" -"`LWG3871 `__","Adjust note about ``terminate``","2023-02 (Issaquah)","","","" -"`LWG3872 `__","``basic_const_iterator`` should have custom ``iter_move``","2023-02 (Issaquah)","","","" -"`LWG3875 `__","``std::ranges::repeat_view::iterator`` may be ill-formed","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3876 `__","Default constructor of ``std::layout_XX::mapping`` misses precondition","2023-02 (Issaquah)","","","" -"`LWG3877 `__","Incorrect constraints on ``const``-qualified monadic overloads for ``std::expected``","2023-02 (Issaquah)","|Complete|","17","" -"`LWG3878 `__","import ``std;`` should guarantee initialization of standard iostreams objects","2023-02 (Issaquah)","","","" -"`LWG3879 `__","``erase_if`` for ``flat_{,multi}set`` is incorrectly specified","2023-02 (Issaquah)","","","" -"`LWG3880 `__","Clarify ``operator+=`` complexity for ``{chunk,stride}_view::iterator``","2023-02 (Issaquah)","","","" -"`LWG3881 `__","Incorrect formatting of container adapters backed by ``std::string``","2023-02 (Issaquah)","|Complete|","17","" +"Issue #","Issue Name","Meeting","Status","First released version","GitHub issue","Notes" +"`LWG2839 `__","Self-move-assignment of library types, again","2020-11 (Virtual)","|Nothing To Do|","","`#104255 `__","" +"`LWG3117 `__","Missing ``packaged_task`` deduction guides","2020-11 (Virtual)","|Complete|","16","`#104256 `__","" +"`LWG3143 `__","``monotonic_buffer_resource`` growth policy is unclear","2020-11 (Virtual)","","","`#104258 `__","" +"`LWG3195 `__","What is the stored pointer value of an empty ``weak_ptr``?","2020-11 (Virtual)","|Nothing To Do|","","`#104259 `__","" +"`LWG3211 `__","``std::tuple<>`` should be trivially constructible","2020-11 (Virtual)","|Complete|","9","`#104260 `__","" +"`LWG3236 `__","Random access iterator requirements lack limiting relational operators domain to comparing those from the same range","2020-11 (Virtual)","|Nothing To Do|","","`#104261 `__","" +"`LWG3265 `__","``move_iterator``'s conversions are more broken after P1207","2020-11 (Virtual)","|Nothing To Do|","","`#104262 `__","Resolved by `LWG3435 `__" +"`LWG3435 `__","``three_way_comparable_with, reverse_iterator>``","2020-11 (Virtual)","|Complete|","13","`#104263 `__","" +"`LWG3432 `__","Missing requirement for ``comparison_category``","2020-11 (Virtual)","|Complete|","16","`#104265 `__","" +"`LWG3447 `__","Deduction guides for ``take_view`` and ``drop_view`` have different constraints","2020-11 (Virtual)","|Complete|","14","`#104266 `__","" +"`LWG3450 `__","The const overloads of ``take_while_view::begin/end`` are underconstrained","2020-11 (Virtual)","|Complete|","16","`#104267 `__","" +"`LWG3464 `__","``istream::gcount()`` can overflow","2020-11 (Virtual)","|Complete|","18","`#104269 `__","" +"`LWG2731 `__","Existence of ``lock_guard::mutex_type`` typedef unclear","2020-11 (Virtual)","|Complete|","5","`#104270 `__","" +"`LWG2743 `__","P0083R3 ``node_handle`` private members missing ""exposition only"" comment","2020-11 (Virtual)","|Nothing To Do|","","`#104272 `__","" +"`LWG2820 `__","Clarify ```` macros","2020-11 (Virtual)","|Nothing To Do|","","`#104273 `__","" +"`LWG3120 `__","Unclear behavior of ``monotonic_buffer_resource::release()``","2020-11 (Virtual)","|Complete|","16","`#104274 `__","" +"`LWG3170 `__","``is_always_equal`` added to ``std::allocator`` makes the standard library treat derived types as always equal","2020-11 (Virtual)","|Complete|","18","`#104275 `__","" +"`LWG3036 `__","``polymorphic_allocator::destroy`` is extraneous","2020-11 (Virtual)","|Nothing To Do|","","`#104276 `__","Reverted by P2875R4" +"`LWG3171 `__","LWG2989 breaks ``directory_entry`` stream insertion","2020-11 (Virtual)","|Complete|","14","`#104277 `__","" +"`LWG3306 `__","``ranges::advance`` violates its preconditions","2020-11 (Virtual)","|Complete|","14","`#104279 `__","" +"`LWG3403 `__","Domain of ``ranges::ssize(E)`` doesn't ``match ranges::size(E)``","2020-11 (Virtual)","","","`#104280 `__","" +"`LWG3404 `__","Finish removing subrange's conversions from pair-like","2020-11 (Virtual)","|Complete|","13","`#104282 `__","" +"`LWG3405 `__","``common_view``'s converting constructor is bad, too","2020-11 (Virtual)","|Complete|","14","`#104283 `__","" +"`LWG3406 `__","``elements_view::begin()`` and ``elements_view::end()`` have incompatible constraints","2020-11 (Virtual)","|Complete|","16","`#104284 `__","" +"`LWG3419 `__","[algorithms.requirements]/15 doesn't reserve as many rights as it intends to","2020-11 (Virtual)","|Nothing To Do|","","`#104286 `__","" +"`LWG3420 `__","cpp17-iterator should check that the type looks like an iterator first","2020-11 (Virtual)","|Complete|","14","`#104287 `__","" +"`LWG3421 `__","Imperfect ADL emulation for boolean-testable","2020-11 (Virtual)","|Nothing To Do|","","`#104288 `__","" +"`LWG3425 `__","``condition_variable_any`` fails to constrain its Lock parameters","2020-11 (Virtual)","|Nothing To Do|","","`#104289 `__","" +"`LWG3426 `__","``operator<=>(const unique_ptr&, nullptr_t)`` can't get no satisfaction","2020-11 (Virtual)","|Complete|","16","`#104290 `__","" +"`LWG3427 `__","``operator<=>(const shared_ptr&, nullptr_t)`` definition ill-formed","2020-11 (Virtual)","|Complete|","16","`#104291 `__","" +"`LWG3428 `__","``single_view``'s in place constructor should be explicit","2020-11 (Virtual)","|Complete|","14","`#104292 `__","" +"`LWG3434 `__","``ios_base`` never reclaims memory for iarray and parray","2020-11 (Virtual)","|Nothing To Do|","","`#104293 `__","" +"`LWG3437 `__","``__cpp_lib_polymorphic_allocator`` is in the wrong header","2020-11 (Virtual)","|Complete|","14","`#104294 `__","" +"`LWG3446 `__","``indirectly_readable_traits`` ambiguity for types with both ``value_type`` and ``element_type``","2020-11 (Virtual)","|Complete|","14","`#103998 `__","" +"`LWG3448 `__","``transform_view``'s ``sentinel`` not comparable with ``iterator``","2020-11 (Virtual)","","","`#104295 `__","" +"`LWG3449 `__","``take_view`` and ``take_while_view``'s ``sentinel`` not comparable with their ``const iterator``","2020-11 (Virtual)","|Complete|","16","`#104296 `__","" +"`LWG3453 `__","Generic code cannot call ``ranges::advance(i, s)``","2020-11 (Virtual)","|Nothing To Do|","","`#104297 `__","" +"`LWG3455 `__","Incorrect Postconditions on ``unique_ptr`` move assignment","2020-11 (Virtual)","|Nothing To Do|","","`#104298 `__","" +"`LWG3460 `__","Unimplementable ``noop_coroutine_handle`` guarantees","2020-11 (Virtual)","|Complete|","14","`#104299 `__","" +"`LWG3461 `__","``convertible_to``'s description mishandles cv-qualified ``void``","2020-11 (Virtual)","|Nothing To Do|","","`#104300 `__","" +"`LWG3465 `__","``compare_partial_order_fallback`` requires ``F < E``","2020-11 (Virtual)","|Complete|","14","`#104301 `__","" +"`LWG3466 `__","Specify the requirements for ``promise``/``future``/``shared_future`` consistently","2020-11 (Virtual)","|Nothing To Do|","","`#104302 `__","" +"`LWG3467 `__","``bool`` can't be an integer-like type","2020-11 (Virtual)","|Complete|","14","`#104303 `__","" +"`LWG3472 `__","``counted_iterator`` is missing preconditions","2020-11 (Virtual)","|Complete|","14","`#104304 `__","" +"`LWG3473 `__","Normative encouragement in non-normative note","2020-11 (Virtual)","|Complete|","15","`#104305 `__","" +"`LWG3474 `__","Nesting ``join_views`` is broken because of CTAD","2020-11 (Virtual)","|Complete|","15","`#104306 `__","" +"`LWG3476 `__","``thread`` and ``jthread`` constructors require that the parameters be move-constructible but never move construct the parameters","2020-11 (Virtual)","","","`#104307 `__","" +"`LWG3477 `__","Simplify constraints for ``semiregular-box``","2020-11 (Virtual)","|Complete|","13","`#104308 `__","" +"`LWG3482 `__","``drop_view``'s const begin should additionally require ``sized_range``","2020-11 (Virtual)","|Complete|","14","`#104309 `__","" +"`LWG3483 `__","``transform_view::iterator``'s difference is overconstrained","2020-11 (Virtual)","|Complete|","14","`#104310 `__","" +"","","","","","","" +"`LWG3391 `__","Problems with ``counted_iterator``/``move_iterator::base() const &``","2021-02 (Virtual)","","","`#104311 `__","" +"`LWG3433 `__","``subrange::advance(n)`` has UB when ``n < 0``","2021-02 (Virtual)","|Complete|","14","`#104312 `__","" +"`LWG3490 `__","``ranges::drop_while_view::begin()`` is missing a precondition","2021-02 (Virtual)","|Nothing To Do|","","`#104313 `__","" +"`LWG3492 `__","Minimal improvements to ``elements_view::iterator``","2021-02 (Virtual)","|Complete|","16","`#104314 `__","" +"`LWG3494 `__","Allow ranges to be conditionally borrowed","2021-02 (Virtual)","|Nothing To Do|","","`#104315 `__","Superseded by `P2017R1 `__" +"`LWG3495 `__","``constexpr launder`` makes pointers to inactive members of unions usable","2021-02 (Virtual)","|Nothing To Do|","","`#104316 `__","" +"`LWG3500 `__","``join_view::iterator::operator->()`` is bogus","2021-02 (Virtual)","|Complete|","14","`#104318 `__","" +"`LWG3502 `__","``elements_view`` should not be allowed to return dangling reference","2021-02 (Virtual)","|Complete|","16","`#104319 `__","" +"`LWG3505 `__","``split_view::outer-iterator::operator++`` misspecified","2021-02 (Virtual)","","","`#104320 `__","" +"","","","","","","" +"`LWG2774 `__","``std::function`` construction vs assignment","2021-06 (Virtual)","","","`#104321 `__","" +"`LWG2818 `__","``::std::`` everywhere rule needs tweaking","2021-06 (Virtual)","|Nothing To Do|","","`#104322 `__","" +"`LWG2997 `__","LWG 491 and the specification of ``{forward_,}list::unique``","2021-06 (Virtual)","","","`#104323 `__","" +"`LWG3410 `__","``lexicographical_compare_three_way`` is overspecified","2021-06 (Virtual)","|Complete|","17","`#104324 `__","" +"`LWG3430 `__","``std::fstream`` & co. should be constructible from string_view","2021-06 (Virtual)","|Complete|","19","`#104325 `__","" +"`LWG3462 `__","§[formatter.requirements]: Formatter requirements forbid use of ``fc.arg()``","2021-06 (Virtual)","|Nothing To Do|","","`#104326 `__","" +"`LWG3481 `__","``viewable_range`` mishandles lvalue move-only views","2021-06 (Virtual)","|Nothing To Do|","","`#104327 `__","Superseded by `P2415R2 `__" +"`LWG3506 `__","Missing allocator-extended constructors for ``priority_queue``","2021-06 (Virtual)","|Complete|","14","`#104329 `__","" +"`LWG3517 `__","``join_view::iterator``'s ``iter_swap`` is underconstrained","2021-06 (Virtual)","|Complete|","14","`#104330 `__","" +"`LWG3518 `__","Exception requirements on char trait operations unclear","2021-06 (Virtual)","|Nothing To Do|","","`#104331 `__","" +"`LWG3519 `__","Incomplete synopses for ```` classes","2021-06 (Virtual)","","","`#104332 `__","" +"`LWG3520 `__","``iter_move`` and ``iter_swap`` are inconsistent for ``transform_view::iterator``","2021-06 (Virtual)","|Complete|","14","`#104333 `__","" +"`LWG3521 `__","Overly strict requirements on ``qsort`` and ``bsearch``","2021-06 (Virtual)","|Nothing To Do|","","`#104334 `__","" +"`LWG3522 `__","Missing requirement on ``InputIterator`` template parameter for ``priority_queue`` constructors","2021-06 (Virtual)","|Complete|","14","`#104335 `__","" +"`LWG3523 `__","``iota_view::sentinel`` is not always ``iota_view``'s sentinel","2021-06 (Virtual)","|Complete|","17","`#104336 `__","" +"`LWG3526 `__","Return types of ``uses_allocator_construction_args`` unspecified","2021-06 (Virtual)","","","`#104337 `__","" +"`LWG3527 `__","``uses_allocator_construction_args`` handles rvalue pairs of rvalue references incorrectly","2021-06 (Virtual)","","","`#104338 `__","" +"`LWG3528 `__","``make_from_tuple`` can perform (the equivalent of) a C-style cast","2021-06 (Virtual)","|Complete|","19","`#104339 `__","" +"`LWG3529 `__","``priority_queue(first, last)`` should construct ``c`` with ``(first, last)``","2021-06 (Virtual)","|Complete|","14","`#104340 `__","" +"`LWG3530 `__","``BUILTIN-PTR-MEOW`` should not opt the type out of syntactic checks","2021-06 (Virtual)","","","`#104341 `__","" +"`LWG3532 `__","``split_view::inner-iterator::operator++(int)`` should depend on ``Base``","2021-06 (Virtual)","","","`#104342 `__","" +"`LWG3533 `__","Make ``base() const &`` consistent across iterator wrappers that supports ``input_iterators``","2021-06 (Virtual)","|Complete|","14","`#104343 `__","" +"`LWG3536 `__","Should ``chrono::from_stream()`` assign zero to duration for failure?","2021-06 (Virtual)","","","`#104344 `__","" +"`LWG3539 `__","``format_to`` must not copy models of ``output_iterator``","2021-06 (Virtual)","|Complete|","14","`#104345 `__","" +"`LWG3540 `__","§[format.arg] There should be no const in ``basic_format_arg(const T* p)``","2021-06 (Virtual)","|Complete|","14","`#104348 `__","" +"`LWG3541 `__","``indirectly_readable_traits`` should be SFINAE-friendly for all types","2021-06 (Virtual)","|Complete|","14","`#104349 `__","" +"`LWG3542 `__","``basic_format_arg`` mishandles ``basic_string_view`` with custom traits","2021-06 (Virtual)","|Complete|","14","`#104350 `__","" +"`LWG3543 `__","Definition of when ``counted_iterators`` refer to the same sequence isn't quite right","2021-06 (Virtual)","|Nothing To Do|","","`#104351 `__","" +"`LWG3544 `__","``format-arg-store::args`` is unintentionally not exposition-only","2021-06 (Virtual)","|Complete|","14","`#104352 `__","" +"`LWG3546 `__","``common_iterator``'s postfix-proxy is not quite right","2021-06 (Virtual)","","","`#104353 `__","" +"`LWG3548 `__","``shared_ptr`` construction from ``unique_ptr`` should move (not copy) the deleter","2021-06 (Virtual)","|Complete|","15","`#104354 `__","" +"`LWG3549 `__","``view_interface`` is overspecified to derive from ``view_base``","2021-06 (Virtual)","|Complete|","14","`#104355 `__","" +"`LWG3551 `__","``borrowed_{iterator,subrange}_t`` are overspecified","2021-06 (Virtual)","|Nothing To Do|","","`#104356 `__","" +"`LWG3552 `__","Parallel specialized memory algorithms should require forward iterators","2021-06 (Virtual)","","","`#104357 `__","" +"`LWG3553 `__","Useless constraint in ``split_view::outer-iterator::value_type::begin()``","2021-06 (Virtual)","","","`#104358 `__","" +"`LWG3555 `__","``{transform,elements}_view::iterator::iterator_concept`` should consider const-qualification of the underlying range","2021-06 (Virtual)","","","`#104359 `__","" +"","","","","","","" +"`LWG2191 `__","Incorrect specification of ``match_results(match_results&&)``","2021-10 (Virtual)","|Nothing To Do|","","`#104360 `__","" +"`LWG2381 `__","Inconsistency in parsing floating point numbers","2021-10 (Virtual)","|Complete|","19","`#104361 `__","" +"`LWG2762 `__","``unique_ptr operator*()`` should be ``noexcept``","2021-10 (Virtual)","|Complete|","19","`#104362 `__","" +"`LWG3121 `__","``tuple`` constructor constraints for ``UTypes&&...`` overloads","2021-10 (Virtual)","","","`#104364 `__","" +"`LWG3123 `__","``duration`` constructor from representation shouldn't be effectively non-throwing","2021-10 (Virtual)","","","`#104365 `__","" +"`LWG3146 `__","Excessive unwrapping in ``std::ref/cref``","2021-10 (Virtual)","|Complete|","14","`#104366 `__","" +"`LWG3152 `__","``common_type`` and ``common_reference`` have flaws in common","2021-10 (Virtual)","","","`#104367 `__","" +"`LWG3293 `__","``move_iterator operator+()`` has incorrect constraints","2021-10 (Virtual)","|Complete|","15","`#104368 `__","" +"`LWG3361 `__","``safe_range`` case","2021-10 (Virtual)","|Nothing To Do|","","`#104369 `__","" +"`LWG3392 `__","``ranges::distance()`` cannot be used on a move-only iterator with a sized sentinel","2021-10 (Virtual)","|Complete|","14","`#104370 `__","" +"`LWG3407 `__","Some problems with the wording changes of P1739R4","2021-10 (Virtual)","|Complete|","15","`#104371 `__","" +"`LWG3422 `__","Issues of ``seed_seq``'s constructors","2021-10 (Virtual)","|Complete|","14","`#104372 `__","" +"`LWG3470 `__","``convertible-to-non-slicing`` seems to reject valid case","2021-10 (Virtual)","|Complete|","14","`#104373 `__","" +"`LWG3480 `__","``directory_iterator`` and ``recursive_directory_iterator`` are not C++20 ranges","2021-10 (Virtual)","|Complete|","14","`#104374 `__","" +"`LWG3498 `__","Inconsistent ``noexcept``-specifiers for ``basic_syncbuf``","2021-10 (Virtual)","","","`#104375 `__","" +"`LWG3535 `__","``join_view::iterator::iterator_category`` and ``::iterator_concept`` lie","2021-10 (Virtual)","|Complete|","15","`#104376 `__","" +"`LWG3554 `__","``chrono::parse`` needs ``const charT*`` and ``basic_string_view`` overloads","2021-10 (Virtual)","","","`#104377 `__","" +"`LWG3557 `__","The ``static_cast`` expression in ``convertible_to`` has the wrong operand","2021-10 (Virtual)","|Complete|","14","`#104378 `__","" +"`LWG3559 `__","Semantic requirements of ``sized_range`` is circular","2021-10 (Virtual)","|Nothing To Do|","","`#104379 `__","" +"`LWG3560 `__","``ranges::equal`` and ``ranges::is_permutation`` should short-circuit for ``sized_ranges``","2021-10 (Virtual)","","","`#104380 `__","" +"`LWG3561 `__","Issue with internal counter in ``discard_block_engine``","2021-10 (Virtual)","","","`#104381 `__","" +"`LWG3563 `__","``keys_view`` example is broken","2021-10 (Virtual)","","","`#104382 `__","" +"`LWG3566 `__","Constraint recursion for ``operator<=>(optional, U)``","2021-10 (Virtual)","|Complete|","17","`#104383 `__","" +"`LWG3567 `__","Formatting move-only iterators take two","2021-10 (Virtual)","|Complete|","16","`#104384 `__","" +"`LWG3568 `__","``basic_istream_view`` needs to initialize ``value_``","2021-10 (Virtual)","|Complete|","16","`#104385 `__","" +"`LWG3570 `__","``basic_osyncstream::emit`` should be an unformatted output function","2021-10 (Virtual)","|Complete|","18","`#104386 `__","" +"`LWG3571 `__","``flush_emit`` should set ``badbit`` if the ``emit`` call fails","2021-10 (Virtual)","","","`#104387 `__","" +"`LWG3572 `__","``copyable-box`` should be fully ``constexpr``","2021-10 (Virtual)","|Complete|","14","`#104388 `__","" +"`LWG3573 `__","Missing Throws element for ``basic_string_view(It begin, End end)``","2021-10 (Virtual)","|Complete|","14","`#104389 `__","" +"`LWG3574 `__","``common_iterator`` should be completely ``constexpr``-able","2021-10 (Virtual)","|Complete|","14","`#104931 `__","" +"`LWG3580 `__","``iota_view``'s ``iterator``'s binary ``operator+`` should be improved","2021-10 (Virtual)","|Complete|","14","`#104932 `__","" +"`LWG3581 `__","The range constructor makes ``basic_string_view`` not trivially move constructible","2021-10 (Virtual)","|Complete|","14","`#104933 `__","" +"`LWG3585 `__","``variant`` converting assignment with immovable alternative","2021-10 (Virtual)","","","`#104934 `__","" +"`LWG3589 `__","The ``const`` lvalue reference overload of ``get`` for ``subrange`` does not constrain ``I`` to be ``copyable`` when ``N == 0``","2021-10 (Virtual)","|Complete|","14","`#104935 `__","" +"`LWG3590 `__","``split_view::base() const &`` is overconstrained","2021-10 (Virtual)","|Complete|","16","`#104936 `__","" +"`LWG3591 `__","``lazy_split_view::inner-iterator::base() &&`` invalidates outer iterators","2021-10 (Virtual)","","","`#104937 `__","" +"`LWG3592 `__","``lazy_split_view`` needs to check the simpleness of Pattern","2021-10 (Virtual)","","","`#104938 `__","" +"`LWG3593 `__","Several iterators' ``base() const &`` and ``lazy_split_view::outer-iterator::value_type::end()`` missing ``noexcept``","2021-10 (Virtual)","","","`#104939 `__","" +"`LWG3595 `__","Exposition-only classes proxy and postfix-proxy for ``common_iterator`` should be fully ``constexpr``","2021-10 (Virtual)","|Complete|","14","`#104940 `__","" +"","","","","","","" +"`LWG3088 `__","``forward_list::merge`` behaviour unclear when passed ``*this``","2022-02 (Virtual)","|Complete|","Yes","`#104942 `__","" +"`LWG3471 `__","``polymorphic_allocator::allocate`` does not satisfy ``Cpp17Allocator`` requirements","2022-02 (Virtual)","","","`#104943 `__","" +"`LWG3525 `__","``uses_allocator_construction_args`` fails to handle types convertible to ``pair``","2022-02 (Virtual)","","","`#104944 `__","" +"`LWG3598 `__","``system_category().default_error_condition(0)`` is underspecified","2022-02 (Virtual)","","","`#104945 `__","" +"`LWG3601 `__","common_iterator's postfix-proxy needs ``indirectly_readable`` ","2022-02 (Virtual)","","","`#104946 `__","" +"`LWG3607 `__","``contiguous_iterator`` should not be allowed to have custom ``iter_move`` and ``iter_swap`` behavior","2022-02 (Virtual)","|Nothing To Do|","","`#104947 `__","" +"`LWG3610 `__","``iota_view::size`` sometimes rejects integer-class types","2022-02 (Virtual)","","","`#104948 `__","" +"`LWG3612 `__","Inconsistent pointer alignment in ``std::format`` ","2022-02 (Virtual)","|Complete|","14","`#104949 `__","" +"`LWG3616 `__","LWG 3498 seems to miss the non-member ``swap`` for ``basic_syncbuf`` ","2022-02 (Virtual)","|Complete|","18","`#104950 `__","" +"`LWG3618 `__","Unnecessary ``iter_move`` for ``transform_view::iterator`` ","2022-02 (Virtual)","|Complete|","19","`#104951 `__","" +"`LWG3619 `__","Specification of ``vformat_to`` contains ill-formed ``formatted_size`` calls","2022-02 (Virtual)","|Nothing To Do|","","`#104952 `__","" +"`LWG3621 `__","Remove feature-test macro ``__cpp_lib_monadic_optional`` ","2022-02 (Virtual)","|Complete|","15","`#104953 `__","" +"`LWG3632 `__","``unique_ptr`` ""Mandates: This constructor is not selected by class template argument deduction""","2022-02 (Virtual)","|Nothing To Do|","","`#104954 `__","" +"`LWG3643 `__","Missing ``constexpr`` in ``std::counted_iterator`` ","2022-02 (Virtual)","|Complete|","19","`#104955 `__","" +"`LWG3648 `__","``format`` should not print ``bool`` with ``'c'`` ","2022-02 (Virtual)","|Complete|","15","`#104956 `__","" +"`LWG3649 `__","[fund.ts.v2] Reinstate and bump ``__cpp_lib_experimental_memory_resource`` feature test macro","2022-02 (Virtual)","","","`#104957 `__","" +"`LWG3650 `__","Are ``std::basic_string`` 's ``iterator`` and ``const_iterator`` constexpr iterators?","2022-02 (Virtual)","|Nothing To Do|","","`#104958 `__","" +"`LWG3654 `__","``basic_format_context::arg(size_t)`` should be ``noexcept`` ","2022-02 (Virtual)","|Complete|","15","`#104959 `__","" +"`LWG3657 `__","``std::hash`` is not enabled","2022-02 (Virtual)","|Complete|","17","`#104960 `__","" +"`LWG3660 `__","``iterator_traits::pointer`` should conform to §[iterator.traits]","2022-02 (Virtual)","|Complete|","14","`#104961 `__","" +"`LWG3661 `__","``constinit atomic> a(nullptr);`` should work","2022-02 (Virtual)","","","`#104962 `__","" +"","","","","","","" +"`LWG3564 `__","``transform_view::iterator::value_type`` and ``iterator_category`` should use ``const F&``","2022-07 (Virtual)","|Complete|","20","`#104963 `__","" +"`LWG3617 `__","``function``/``packaged_task`` deduction guides and deducing ``this``","2022-07 (Virtual)","","","`#104965 `__","" +"`LWG3656 `__","Inconsistent bit operations returning a count","2022-07 (Virtual)","|Complete|","15","`#104966 `__","" +"`LWG3659 `__","Consider ``ATOMIC_FLAG_INIT`` undeprecation","2022-07 (Virtual)","|Complete|","15","`#104968 `__","" +"`LWG3670 `__","``Cpp17InputIterators`` don't have integer-class difference types","2022-07 (Virtual)","","","`#104969 `__","" +"`LWG3671 `__","``atomic_fetch_xor`` missing from ``stdatomic.h``","2022-07 (Virtual)","|Complete|","20","`#104970 `__","" +"`LWG3672 `__","``common_iterator::operator->()`` should return by value","2022-07 (Virtual)","|Complete|","19","`#104971 `__","" +"`LWG3683 `__","``operator==`` for ``polymorphic_allocator`` cannot deduce template argument in common cases","2022-07 (Virtual)","|Complete|","20","`#104972 `__","" +"`LWG3687 `__","``expected`` move constructor should move","2022-07 (Virtual)","|Complete|","16","`#104973 `__","" +"`LWG3692 `__","``zip_view::iterator``'s ``operator<=>`` is overconstrained","2022-07 (Virtual)","|Complete|","20","`#104975 `__","" +"`LWG3701 `__","Make ``formatter, charT>`` requirement explicit","2022-07 (Virtual)","|Complete|","15","`#104976 `__","" +"`LWG3702 `__","Should ``zip_transform_view::iterator`` remove ``operator<``","2022-07 (Virtual)","|Complete|","22","`#104977 `__","" +"`LWG3703 `__","Missing requirements for ``expected`` requires ``is_void``","2022-07 (Virtual)","|Complete|","16","`#104978 `__","" +"`LWG3704 `__","LWG 2059 added overloads that might be ill-formed for sets","2022-07 (Virtual)","","","`#104979 `__","" +"`LWG3705 `__","Hashability shouldn't depend on basic_string's allocator","2022-07 (Virtual)","|Complete|","16","`#104980 `__","" +"`LWG3707 `__","chunk_view::outer-iterator::value_type::size should return unsigned type","2022-07 (Virtual)","","","`#104981 `__","" +"`LWG3708 `__","``take_while_view::sentinel``'s conversion constructor should move","2022-07 (Virtual)","|Complete|","16","`#104982 `__","" +"`LWG3709 `__","LWG-3703 was underly ambitious","2022-07 (Virtual)","","","`#104983 `__","" +"`LWG3710 `__","The ``end`` of ``chunk_view`` for input ranges can be ``const``","2022-07 (Virtual)","","","`#104985 `__","" +"`LWG3711 `__","Missing preconditions for slide_view constructor","2022-07 (Virtual)","","","`#104987 `__","" +"`LWG3712 `__","``chunk_view`` and ``slide_view`` should not be ``default_initializable``","2022-07 (Virtual)","","","`#104988 `__","" +"`LWG3713 `__","Sorted with respect to comparator (only)","2022-07 (Virtual)","|Nothing To Do|","","`#104989 `__","" +"`LWG3715 `__","``view_interface::empty`` is overconstrained","2022-07 (Virtual)","|Complete|","19","`#104990 `__","" +"`LWG3719 `__","Directory iterators should be usable with default sentinel","2022-07 (Virtual)","|Complete|","17","`#104992 `__","" +"`LWG3721 `__","Allow an ``arg-id`` with a value of zero for ``width`` in ``std-format-spec``","2022-07 (Virtual)","|Complete|","16","`#104993 `__","" +"`LWG3724 `__","``decay-copy`` should be constrained","2022-07 (Virtual)","|Complete|","14","`#104994 `__","" +"","","","","","","" +"`LWG3028 `__","Container requirements tables should distinguish ``const`` and non-``const`` variables","2022-11 (Kona)","","","`#104995 `__","" +"`LWG3118 `__","``fpos`` equality comparison unspecified","2022-11 (Kona)","","","`#104996 `__","" +"`LWG3177 `__","Limit permission to specialize variable templates to program-defined types","2022-11 (Kona)","|Nothing To Do|","","`#104997 `__","" +"`LWG3515 `__","§[stacktrace.basic.nonmem]: ``operator<<`` should be less templatized","2022-11 (Kona)","","","`#104998 `__","" +"`LWG3545 `__","``std::pointer_traits`` should be SFINAE-friendly","2022-11 (Kona)","|Complete|","18","`#104999 `__","" +"`LWG3569 `__","``join_view`` fails to support ranges of ranges with non-default_initializable iterators","2022-11 (Kona)","","","`#105000 `__","" +"`LWG3594 `__","``inout_ptr`` — inconsistent ``release()`` in destructor","2022-11 (Kona)","|Complete|","19","`#105001 `__","" +"`LWG3597 `__","Unsigned integer types don't model advanceable","2022-11 (Kona)","","","`#105002 `__","" +"`LWG3600 `__","Making ``istream_iterator`` copy constructor trivial is an ABI break","2022-11 (Kona)","|Complete|","","`#105003 `__","" +"`LWG3629 `__","``make_error_code`` and ``make_error_condition`` are customization points","2022-11 (Kona)","|Complete|","16","`#105004 `__","" +"`LWG3636 `__","``formatter::format`` should be ``const``-qualified","2022-11 (Kona)","|Complete|","16","`#105005 `__","" +"`LWG3646 `__","``std::ranges::view_interface::size`` returns a signed type","2022-11 (Kona)","|Complete|","16","`#105006 `__","" +"`LWG3677 `__","Is a cv-qualified ``pair`` specially handled in uses-allocator construction?","2022-11 (Kona)","|Complete|","18","`#105007 `__","" +"`LWG3717 `__","``common_view::end`` should improve ``random_access_range`` case","2022-11 (Kona)","","","`#105008 `__","" +"`LWG3732 `__","``prepend_range`` and ``append_range`` can't be amortized constant time","2022-11 (Kona)","|Nothing To Do|","","`#105011 `__","" +"`LWG3736 `__","``move_iterator`` missing ``disable_sized_sentinel_for`` specialization","2022-11 (Kona)","|Complete|","19","`#105012 `__","" +"`LWG3737 `__","``take_view::sentinel`` should provide ``operator-``","2022-11 (Kona)","","","`#105013 `__","" +"`LWG3738 `__","Missing preconditions for ``take_view`` constructor","2022-11 (Kona)","|Complete|","16","`#105014 `__","" +"`LWG3743 `__","``ranges::to``'s reserve may be ill-formed","2022-11 (Kona)","","","`#105015 `__","" +"`LWG3745 `__","``std::atomic_wait`` and its friends lack ``noexcept``","2022-11 (Kona)","|Complete|","16","`#105016 `__","" +"`LWG3746 `__","``optional``'s spaceship with ``U`` with a type derived from optional causes infinite constraint meta-recursion","2022-11 (Kona)","|Complete|","17","`#105017 `__","" +"`LWG3747 `__","``ranges::uninitialized_copy_n``, ``ranges::uninitialized_move_n``, and ``ranges::destroy_n`` should use ``std::move``","2022-11 (Kona)","","","`#105018 `__","" +"`LWG3750 `__","Too many papers bump ``__cpp_lib_format``","2022-11 (Kona)","|Partial|","","`#105020 `__","Only ``__cpp_lib_format_ranges`` is fully implemented" +"`LWG3751 `__","Missing feature macro for ``flat_set``","2022-11 (Kona)","|Complete|","21","`#105021 `__","" +"`LWG3753 `__","Clarify entity vs. freestanding entity","2022-11 (Kona)","","","`#105022 `__","" +"`LWG3754 `__","Class template expected synopsis contains declarations that do not match the detailed description","2022-11 (Kona)","|Nothing To Do|","","`#105023 `__","" +"`LWG3755 `__","``tuple-for-each`` can call ``user-defined`` ``operator,``","2022-11 (Kona)","|Complete|","17","`#105024 `__","" +"`LWG3757 `__","What's the effect of ``std::forward_like(x)``?","2022-11 (Kona)","|Complete|","","`#105026 `__","" +"`LWG3759 `__","``ranges::rotate_copy`` should use ``std::move``","2022-11 (Kona)","|Complete|","15","`#105027 `__","" +"`LWG3760 `__","``cartesian_product_view::iterator``'s ``parent_`` is never valid","2022-11 (Kona)","","","`#105028 `__","" +"`LWG3761 `__","``cartesian_product_view::iterator::operator-`` should pass by reference","2022-11 (Kona)","","","`#105029 `__","" +"`LWG3762 `__","``generator::iterator::operator==`` should pass by reference","2022-11 (Kona)","","","`#105030 `__","" +"`LWG3764 `__","``reference_wrapper::operator()`` should propagate noexcept","2022-11 (Kona)","|Complete|","17","`#105031 `__","" +"`LWG3765 `__","``const_sentinel`` should be constrained","2022-11 (Kona)","","","`#105032 `__","" +"`LWG3766 `__","``view_interface::cbegin`` is underconstrained","2022-11 (Kona)","","","`#105033 `__","" +"`LWG3770 `__","``const_sentinel_t`` is missing","2022-11 (Kona)","","","`#105034 `__","" +"`LWG3773 `__","``views::zip_transform`` still requires ``F`` to be ``copy_constructible`` when empty pack","2022-11 (Kona)","|Complete|","22","`#105035 `__","" +"`LWG3774 `__","```` should include ````","2022-11 (Kona)","|Complete|","21","`#105036 `__","" +"`LWG3775 `__","Broken dependencies in the ``Cpp17Allocator`` requirements","2022-11 (Kona)","","","`#105038 `__","" +"`LWG3778 `__","``vector`` missing exception specifications","2022-11 (Kona)","|Complete|","3.7","`#105039 `__","" +"`LWG3781 `__","The exposition-only alias templates ``cont-key-type`` and ``cont-mapped-type`` should be removed","2022-11 (Kona)","|Nothing To Do|","","`#105040 `__","" +"`LWG3782 `__","Should ```` declare ``::lerp``?","2022-11 (Kona)","|Complete|","17","`#105041 `__","" +"`LWG3784 `__","std.compat should not provide ``::byte`` and its friends","2022-11 (Kona)","|Complete|","19","`#105042 `__","" +"`LWG3785 `__","``ranges::to`` is over-constrained on the destination type being a range","2022-11 (Kona)","","","`#105044 `__","" +"`LWG3788 `__","``jthread::operator=(jthread&&)`` postconditions are unimplementable under self-assignment","2022-11 (Kona)","|Complete|","18","`#105045 `__","" +"`LWG3792 `__","``__cpp_lib_constexpr_algorithms`` should also be defined in ````","2022-11 (Kona)","|Complete|","16","`#105046 `__","" +"`LWG3795 `__","Self-move-assignment of ``std::future`` and ``std::shared_future`` have unimplementable postconditions","2022-11 (Kona)","","","`#105047 `__","" +"`LWG3796 `__","``movable-box`` as member should use ``default-initialization`` instead of ``copy-initialization``","2022-11 (Kona)","","","`#105048 `__","" +"`LWG3798 `__","Rvalue reference and ``iterator_category``","2022-11 (Kona)","|Partial|","","`#105049 `__","``adjacent_transform_view`` hasn't been done yet since this type isn't implemented yet" +"`LWG3801 `__","``cartesian_product_view::iterator::distance-from`` ignores the size of last underlying range","2022-11 (Kona)","","","`#105051 `__","" +"`LWG3814 `__","Add freestanding items requested by NB comments","2022-11 (Kona)","","","`#105052 `__","" +"`LWG3816 `__","``flat_map`` and ``flat_multimap`` should impose sequence container requirements","2022-11 (Kona)","","","`#105053 `__","" +"`LWG3817 `__","Missing preconditions on ``forward_list`` modifiers","2022-11 (Kona)","","","`#105055 `__","" +"`LWG3818 `__","Exposition-only concepts are not described in library intro","2022-11 (Kona)","|Nothing To Do|","","`#105056 `__","" +"`LWG3822 `__","Avoiding normalization in ``filesystem::weakly_canonical``","2022-11 (Kona)","","","`#105057 `__","" +"`LWG3823 `__","Unnecessary precondition for ``is_aggregate``","2022-11 (Kona)","|Nothing To Do|","","`#105058 `__","" +"`LWG3824 `__","Number of ``bind`` placeholders is underspecified","2022-11 (Kona)","|Nothing To Do|","","`#105060 `__","" +"`LWG3826 `__","Redundant specification [for overload of yield_value]","2022-11 (Kona)","|Nothing To Do|","","`#105061 `__","" +"","","","","","","" +"`LWG2195 `__","Missing constructors for ``match_results``","2023-02 (Issaquah)","","","`#105062 `__","" +"`LWG2295 `__","Locale name when the provided ``Facet`` is a ``nullptr``","2023-02 (Issaquah)","","","`#105063 `__","" +"`LWG3032 `__","``ValueSwappable`` requirement missing for ``push_heap`` and ``make_heap``","2023-02 (Issaquah)","","","`#105064 `__","" +"`LWG3085 `__","``char_traits::copy`` precondition too weak","2023-02 (Issaquah)","","","`#105065 `__","" +"`LWG3664 `__","`LWG 3392 `__ ``broke std::ranges::distance(a, a+3)``","2023-02 (Issaquah)","","","`#105066 `__","" +"`LWG3720 `__","Restrict the valid types of ``arg-id`` for width and precision in ``std-format-spec``","2023-02 (Issaquah)","|Complete|","17","`#105067 `__","" +"`LWG3756 `__","Is the ``std::atomic_flag`` class signal-safe?","2023-02 (Issaquah)","","","`#105068 `__","" +"`LWG3769 `__","``basic_const_iterator::operator==`` causes infinite constraint recursion","2023-02 (Issaquah)","","","`#105069 `__","" +"`LWG3807 `__","The feature test macro for ``ranges::find_last`` should be renamed","2023-02 (Issaquah)","","","`#105070 `__","" +"`LWG3811 `__","``views::as_const`` on ``ref_view`` should return ``ref_view``","2023-02 (Issaquah)","","","`#105071 `__","" +"`LWG3820 `__","``cartesian_product_view::iterator::prev`` is not quite right","2023-02 (Issaquah)","","","`#105072 `__","" +"`LWG3825 `__","Missing compile-time argument ``id`` check in ``basic_format_parse_context::next_arg_id``","2023-02 (Issaquah)","|Complete|","17","`#105073 `__","" +"`LWG3204 `__","``sub_match::swap`` only swaps the base class","2023-02 (Issaquah)","|Complete|","17","`#105074 `__","" +"`LWG3733 `__","``ranges::to`` misuses ``cpp17-input-iterator``","2023-02 (Issaquah)","|Complete|","17","`#105075 `__","" +"`LWG3742 `__","``deque::prepend_range`` needs to permute","2023-02 (Issaquah)","","","`#105077 `__","" +"`LWG3790 `__","`P1467 `__ accidentally changed ``nexttoward``'s signature","2023-02 (Issaquah)","","","`#105078 `__","" +"`LWG3819 `__","``reference_meows_from_temporary`` should not use ``is_meowible``","2023-02 (Issaquah)","","","`#105079 `__","" +"`LWG3821 `__","``uses_allocator_construction_args`` should have overload for ``pair-like``","2023-02 (Issaquah)","|Complete|","18","`#105080 `__","" +"`LWG3834 `__","Missing ``constexpr`` for ``std::intmax_t`` math functions in ````","2023-02 (Issaquah)","","","`#105081 `__","" +"`LWG3839 `__","``range_formatter``'s ``set_separator``, ``set_brackets``, and ``underlying`` functions should be ``noexcept``","2023-02 (Issaquah)","|Complete|","17","`#105082 `__","" +"`LWG3841 `__","```` should not be ""all freestanding""","2023-02 (Issaquah)","","","`#105083 `__","" +"`LWG3842 `__","Unclear wording for ``precision`` in ``chrono-format-spec``","2023-02 (Issaquah)","|Complete|","16","`#105085 `__","" +"`LWG3848 `__","``adjacent_view``, ``adjacent_transform_view`` and ``slide_view`` missing ``base`` accessor","2023-02 (Issaquah)","","","`#105086 `__","" +"`LWG3849 `__","``cartesian_product_view::iterator``'s default constructor is overconstrained","2023-02 (Issaquah)","","","`#105087 `__","" +"`LWG3850 `__","``views::as_const`` on ``empty_view`` should return ``empty_view``","2023-02 (Issaquah)","","","`#105088 `__","" +"`LWG3851 `__","``chunk_view::inner-iterator`` missing custom ``iter_move`` and ``iter_swap``","2023-02 (Issaquah)","","","`#105089 `__","" +"`LWG3853 `__","``basic_const_iterator::operator->`` is ill-formed","2023-02 (Issaquah)","","","`#105090 `__","" +"`LWG3857 `__","``basic_string_view`` should allow explicit conversion when only traits vary","2023-02 (Issaquah)","|Complete|","17","`#105092 `__","" +"`LWG3860 `__","``range_common_reference_t`` is missing","2023-02 (Issaquah)","|Complete|","17","`#105094 `__","" +"`LWG3866 `__","Bad Mandates for ``expected::transform_error`` overloads","2023-02 (Issaquah)","|Complete|","17","`#105095 `__","" +"`LWG3867 `__","Should ``std::basic_osyncstream``'s move assignment operator be ``noexcept``?","2023-02 (Issaquah)","|Complete|","18","`#105097 `__","" +"`LWG3441 `__","Misleading note about calls to customization points","2023-02 (Issaquah)","","","`#105098 `__","" +"`LWG3622 `__","Misspecified transitivity of equivalence in §[unord.req.general]","2023-02 (Issaquah)","","","`#105100 `__","" +"`LWG3631 `__","``basic_format_arg(T&&)`` should use ``remove_cvref_t`` throughout","2023-02 (Issaquah)","|Complete|","17","`#105101 `__","" +"`LWG3645 `__","``resize_and_overwrite`` is overspecified to call its callback with lvalues","2023-02 (Issaquah)","|Complete|","14","`#105102 `__","" +"`LWG3655 `__","The ``INVOKE`` operation and union types","2023-02 (Issaquah)","|Complete|","18","`#105103 `__","" +"`LWG3723 `__","``priority_queue::push_range`` needs to ``append_range``","2023-02 (Issaquah)","|Complete|","17","`#105104 `__","" +"`LWG3734 `__","Inconsistency in ``inout_ptr`` and ``out_ptr`` for empty case","2023-02 (Issaquah)","|Complete|","19","`#105105 `__","" +"`LWG3772 `__","``repeat_view``'s ``piecewise`` constructor is missing Postconditions","2023-02 (Issaquah)","|Complete|","17","`#105106 `__","" +"`LWG3786 `__","Flat maps' deduction guide needs to default ``Allocator`` to be useful","2023-02 (Issaquah)","","","`#105107 `__","" +"`LWG3803 `__","``flat_foo`` constructors taking ``KeyContainer`` lack ``KeyCompare`` parameter","2023-02 (Issaquah)","","","`#105108 `__","" +"`LWG3810 `__","CTAD for ``std::basic_format_args``","2023-02 (Issaquah)","|Complete|","17","`#105109 `__","" +"`LWG3827 `__","Deprecate ```` and ```` macros","2023-02 (Issaquah)","","","`#105110 `__","" +"`LWG3828 `__","Sync ``intmax_t`` and ``uintmax_t`` with C2x","2023-02 (Issaquah)","|Nothing To Do|","","`#105111 `__","" +"`LWG3833 `__","Remove specialization ``template struct formatter``","2023-02 (Issaquah)","|Complete|","17","`#105112 `__","" +"`LWG3836 `__","``std::expected`` conversion constructor ``expected(const expected&)`` should take precedence over ``expected(U&&)`` with operator ``bool``","2023-02 (Issaquah)","|Complete|","18","`#105113 `__","" +"`LWG3843 `__","``std::expected::value() &`` assumes ``E`` is copy constructible","2023-02 (Issaquah)","|Complete|","17","`#105114 `__","" +"`LWG3847 `__","``ranges::to`` can still return views","2023-02 (Issaquah)","|Complete|","17","`#105115 `__","" +"`LWG3862 `__","``basic_const_iterator``'s ``common_type`` specialization is underconstrained","2023-02 (Issaquah)","","","`#105116 `__","" +"`LWG3865 `__","Sorting a range of ``pairs``","2023-02 (Issaquah)","|Complete|","17","`#105117 `__","" +"`LWG3869 `__","Deprecate ``std::errc`` constants related to UNIX STREAMS","2023-02 (Issaquah)","|Complete|","19","`#105118 `__","" +"`LWG3870 `__","Remove ``voidify``","2023-02 (Issaquah)","|Complete|","20","`#105119 `__","" +"`LWG3871 `__","Adjust note about ``terminate``","2023-02 (Issaquah)","","","`#105122 `__","" +"`LWG3872 `__","``basic_const_iterator`` should have custom ``iter_move``","2023-02 (Issaquah)","","","`#105123 `__","" +"`LWG3875 `__","``std::ranges::repeat_view::iterator`` may be ill-formed","2023-02 (Issaquah)","|Complete|","17","`#105124 `__","" +"`LWG3876 `__","Default constructor of ``std::layout_XX::mapping`` misses precondition","2023-02 (Issaquah)","","","`#105125 `__","" +"`LWG3877 `__","Incorrect constraints on ``const``-qualified monadic overloads for ``std::expected``","2023-02 (Issaquah)","|Complete|","17","`#105126 `__","" +"`LWG3878 `__","import ``std;`` should guarantee initialization of standard iostreams objects","2023-02 (Issaquah)","","","`#105127 `__","" +"`LWG3879 `__","``erase_if`` for ``flat_{,multi}set`` is incorrectly specified","2023-02 (Issaquah)","","","`#105128 `__","" +"`LWG3880 `__","Clarify ``operator+=`` complexity for ``{chunk,stride}_view::iterator``","2023-02 (Issaquah)","","","`#105129 `__","" +"`LWG3881 `__","Incorrect formatting of container adapters backed by ``std::string``","2023-02 (Issaquah)","|Complete|","17","`#105130 `__","" diff --git a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx23Papers.csv b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx23Papers.csv index f1d8e9a2bd..b655384bad 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx23Papers.csv +++ b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx23Papers.csv @@ -1,122 +1,122 @@ -"Paper #","Paper Name","Meeting","Status","First released version","Notes" -"`P0881R7 `__","A Proposal to add stacktrace library","2020-11 (Virtual)","","","" -"`P0943R6 `__","Support C atomics in C++","2020-11 (Virtual)","|Complete|","15","" -"`P1048R1 `__","A proposal for a type trait to detect scoped enumerations","2020-11 (Virtual)","|Complete|","12","" -"`P1679R3 `__","string contains function","2020-11 (Virtual)","|Complete|","12","" -"","","","","","" -"`P1682R3 `__","std::to_underlying for enumerations","2021-02 (Virtual)","|Complete|","13","" -"`P2017R1 `__","Conditionally borrowed ranges","2021-02 (Virtual)","|Complete|","16","" -"`P2160R1 `__","Locks lock lockables","2021-02 (Virtual)","|Nothing To Do|","","" -"`P2162R2 `__","Inheriting from std::variant","2021-02 (Virtual)","|Complete|","13","" -"`P2212R2 `__","Relax Requirements for time_point::clock","2021-02 (Virtual)","|Nothing To Do|","","" -"`P2259R1 `__","Repairing input range adaptors and counted_iterator","2021-02 (Virtual)","","","" -"","","","","","" -"`P0401R6 `__","Providing size feedback in the Allocator interface","2021-06 (Virtual)","|Complete|","15","" -"`P0448R4 `__","A strstream replacement using span as buffer","2021-06 (Virtual)","","","" -"`P1132R8 `__","out_ptr - a scalable output pointer abstraction","2021-06 (Virtual)","|Complete|","19","" -"`P1328R1 `__","Making std::type_info::operator== constexpr","2021-06 (Virtual)","|Complete|","17","" -"`P1425R4 `__","Iterators pair constructors for stack and queue","2021-06 (Virtual)","|Complete|","14","" -"`P1518R2 `__","Stop overconstraining allocators in container deduction guides","2021-06 (Virtual)","|Complete|","13","" -"`P1659R3 `__","starts_with and ends_with","2021-06 (Virtual)","|Complete|","19","" -"`P1951R1 `__","Default Arguments for pair Forwarding Constructor","2021-06 (Virtual)","|Complete|","14","" -"`P1989R2 `__","Range constructor for std::string_view","2021-06 (Virtual)","|Complete|","14","" -"`P2136R3 `__","invoke_r","2021-06 (Virtual)","|Complete|","17","" -"`P2166R1 `__","A Proposal to Prohibit std::basic_string and std::basic_string_view construction from nullptr","2021-06 (Virtual)","|Complete|","13","" -"","","","","","" -"`P0288R9 `__","``any_invocable``","2021-10 (Virtual)","","","" -"`P0798R8 `__","Monadic operations for ``std::optional``","2021-10 (Virtual)","|Complete|","14","" -"`P0849R8 `__","``auto(x)``: ``DECAY_COPY`` in the language","2021-10 (Virtual)","|Complete|","14","" -"`P1072R10 `__","``basic_string::resize_and_overwrite``","2021-10 (Virtual)","|Complete|","14","" -"`P1147R1 `__","Printing ``volatile`` Pointers","2021-10 (Virtual)","|Complete|","14","" -"`P1272R4 `__","Byteswapping for fun&&nuf","2021-10 (Virtual)","|Complete|","14","" -"`P1675R2 `__","``rethrow_exception`` must be allowed to copy","2021-10 (Virtual)","|Nothing To Do|","","" -"`P2077R3 `__","Heterogeneous erasure overloads for associative containers","2021-10 (Virtual)","","","" -"`P2251R1 `__","Require ``span`` & ``basic_string_view`` to be Trivially Copyable","2021-10 (Virtual)","|Complete|","14","" -"`P2301R1 `__","Add a ``pmr`` alias for ``std::stacktrace``","2021-10 (Virtual)","","","" -"`P2321R2 `__","``zip``","2021-10 (Virtual)","|In Progress|","","" -"`P2340R1 `__","Clarifying the status of the 'C headers'","2021-10 (Virtual)","|Nothing To Do|","","" -"`P2393R1 `__","Cleaning up ``integer``-class types","2021-10 (Virtual)","","","" -"`P2401R0 `__","Add a conditional ``noexcept`` specification to ``std::exchange``","2021-10 (Virtual)","|Complete|","14","" -"","","","","","" -"`P0323R12 `__","``std::expected``","2022-02 (Virtual)","|Complete|","16","" -"`P0533R9 `__","``constexpr`` for ```` and ````","2022-02 (Virtual)","|In Progress|","","``isfinite``, ``isinf``, ``isnan`` and ``isnormal`` are implemented" -"`P0627R6 `__","Function to mark unreachable code","2022-02 (Virtual)","|Complete|","15","" -"`P1206R7 `__","``ranges::to``: A function to convert any range to a container","2022-02 (Virtual)","|Complete|","17","" -"`P1413R3 `__","Deprecate ``std::aligned_storage`` and ``std::aligned_union``","2022-02 (Virtual)","|Complete|","","``std::aligned_storage_t`` and ``std::aligned_union_t`` are marked deprecated, but clang doesn't issue a diagnostic for deprecated using template declarations." -"`P2255R2 `__","A type trait to detect reference binding to temporary","2022-02 (Virtual)","|Partial|","","Implemented the type traits only." -"`P2273R3 `__","Making ``std::unique_ptr`` constexpr","2022-02 (Virtual)","|Complete|","16","" -"`P2387R3 `__","Pipe support for user-defined range adaptors","2022-02 (Virtual)","|Complete|","19","" -"`P2440R1 `__","``ranges::iota``, ``ranges::shift_left`` and ``ranges::shift_right``","2022-02 (Virtual)","|Partial|","","Only ``ranges::iota`` is implemented." -"`P2441R2 `__","``views::join_with``","2022-02 (Virtual)","|Complete|","21","" -"`P2442R1 `__","Windowing range adaptors: ``views::chunk`` and ``views::slide``","2022-02 (Virtual)","","","" -"`P2443R1 `__","``views::chunk_by``","2022-02 (Virtual)","|Complete|","18","" -"","","","","","" -"`P0009R18 `__","mdspan: A Non-Owning Multidimensional Array Reference","2022-07 (Virtual)","|Complete|","18","" -"`P0429R9 `__","A Standard ``flat_map``","2022-07 (Virtual)","|Complete|","20","" -"`P1169R4 `__","``static operator()``","2022-07 (Virtual)","|Complete|","16","" -"`P1222R4 `__","A Standard ``flat_set``","2022-07 (Virtual)","|Complete|","21","" -"`P1223R5 `__","``ranges::find_last()``, ``ranges::find_last_if()``, and ``ranges::find_last_if_not()``","2022-07 (Virtual)","|Complete|","19","" -"`P1467R9 `__","Extended ``floating-point`` types and standard names","2022-07 (Virtual)","","","" -"`P1642R11 `__","Freestanding ``[utilities]``, ``[ranges]``, and ``[iterators]``","2022-07 (Virtual)","","","" -"`P1899R3 `__","``stride_view``","2022-07 (Virtual)","","","" -"`P2093R14 `__","Formatted output","2022-07 (Virtual)","|Complete|","18","" -"`P2165R4 `__","Compatibility between ``tuple``, ``pair`` and ``tuple-like`` objects","2022-07 (Virtual)","|Partial|","","Changes of ``tuple``, ``adjacent_view``, and ``cartesian_product_view`` are not yet implemented." -"`P2278R4 `__","``cbegin`` should always return a constant iterator","2022-07 (Virtual)","","","" -"`P2286R8 `__","Formatting Ranges","2022-07 (Virtual)","|Complete|","16","" -"`P2291R3 `__","Add Constexpr Modifiers to Functions ``to_chars`` and ``from_chars`` for Integral Types in ```` Header","2022-07 (Virtual)","|Complete|","16","" -"`P2302R4 `__","``std::ranges::contains``","2022-07 (Virtual)","|Complete|","19","" -"`P2322R6 `__","``ranges::fold``","2022-07 (Virtual)","","","" -"`P2374R4 `__","``views::cartesian_product``","2022-07 (Virtual)","","","" -"`P2404R3 `__","Move-only types for ``equality_comparable_with``, ``totally_ordered_with``, and ``three_way_comparable_with``","2022-07 (Virtual)","","","" -"`P2408R5 `__","Ranges iterators as inputs to non-Ranges algorithms","2022-07 (Virtual)","","","" -"`P2417R2 `__","A more ``constexpr`` ``bitset``","2022-07 (Virtual)","|Complete|","16","" -"`P2419R2 `__","Clarify handling of encodings in localized formatting of chrono types","2022-07 (Virtual)","","","" -"`P2438R2 `__","``std::string::substr() &&``","2022-07 (Virtual)","|Complete|","16","" -"`P2445R1 `__","``forward_like``","2022-07 (Virtual)","|Complete|","16","" -"`P2446R2 `__","``views::as_rvalue``","2022-07 (Virtual)","|Complete|","16","" -"`P2460R2 `__","Relax requirements on ``wchar_t`` to match existing practices","2022-07 (Virtual)","|Nothing To Do|","","" -"`P2465R3 `__","Standard Library Modules ``std`` and ``std.compat``","2022-07 (Virtual)","|Complete|","19","" -"`P2467R1 `__","Support exclusive mode for ``fstreams``","2022-07 (Virtual)","|Complete|","18","" -"`P2474R2 `__","``views::repeat``","2022-07 (Virtual)","|Complete|","17","" -"`P2494R2 `__","Relaxing range adaptors to allow for move only types","2022-07 (Virtual)","|Complete|","17","" -"`P2499R0 `__","``string_view`` range constructor should be ``explicit``","2022-07 (Virtual)","|Complete|","16","" -"`P2502R2 `__","``std::generator``: Synchronous Coroutine Generator for Ranges","2022-07 (Virtual)","","","" -"`P2508R1 `__","Exposing ``std::basic-format-string``","2022-07 (Virtual)","|Complete|","15","" -"`P2517R1 `__","Add a conditional ``noexcept`` specification to ``std::apply``","2022-07 (Virtual)","|Complete|","3.9","" -"`P2520R0 `__","``move_iterator`` should be a random access iterator","2022-07 (Virtual)","|Complete|","17","Implemented as a DR in C++20" -"`P2540R1 `__","Empty Product for certain Views","2022-07 (Virtual)","","","" -"`P2549R1 `__","``std::unexpected`` should have ``error()`` as member accessor","2022-07 (Virtual)","|Complete|","16","" -"`P2585R0 `__","Improving default container formatting","2022-07 (Virtual)","|Complete|","17","" -"`P2590R2 `__","Explicit lifetime management","2022-07 (Virtual)","","","" -"`P2599R2 `__","``mdspan::size_type`` should be ``index_type``","2022-07 (Virtual)","|Complete|","18","" -"`P2604R0 `__","mdspan: rename pointer and contiguous","2022-07 (Virtual)","|Complete|","18","" -"`P2613R1 `__","Add the missing ``empty`` to ``mdspan``","2022-07 (Virtual)","|Complete|","18","" -"","","","","","" -"`P1202R5 `__","Asymmetric Fences","2022-11 (Kona)","","","" -"`P1264R2 `__","Revising the wording of ``stream`` input operations","2022-11 (Kona)","|Complete|","9","" -"`P1478R8 `__","``Byte-wise`` ``atomic`` ``memcpy``","2022-11 (Kona)","","","" -"`P2167R3 `__","Improved Proposed Wording for LWG 2114","2022-11 (Kona)","|Complete|","20","The `[cmp.alg] `__ part is implemented as a DR against C++20. MSVC STL does the same. Other parts are Nothing To Do." -"`P2396R1 `__","Concurrency TS 2 fixes ","2022-11 (Kona)","","","" -"`P2505R5 `__","Monadic Functions for ``std::expected``","2022-11 (Kona)","|Complete|","17","" -"`P2539R4 `__","Should the output of ``std::print`` to a terminal be synchronized with the underlying stream?","2022-11 (Kona)","|Complete|","18","" -"`P2602R2 `__","Poison Pills are Too Toxic","2022-11 (Kona)","|Complete|","19","Implemented as a DR in C++20." -"`P2708R1 `__","No Further Fundamentals TSes","2022-11 (Kona)","|Nothing To Do|","","" -"","","","","","" -"`P0290R4 `__","``apply()`` for ``synchronized_value``","2023-02 (Issaquah)","","","" -"`P2770R0 `__","Stashing stashing ``iterators`` for proper flattening","2023-02 (Issaquah)","|Complete|","21","" -"`P2164R9 `__","``views::enumerate``","2023-02 (Issaquah)","","","" -"`P2711R1 `__","Making multi-param constructors of ``views`` ``explicit``","2023-02 (Issaquah)","|Complete|","21","" -"`P2609R3 `__","Relaxing Ranges Just A Smidge","2023-02 (Issaquah)","|Complete|","20","Implemented as a DR in C++20. Other implementations will do the same." -"`P2713R1 `__","Escaping improvements in ``std::format``","2023-02 (Issaquah)","|Complete|","19","" -"`P2675R1 `__","``format``'s width estimation is too approximate and not forward compatible","2023-02 (Issaquah)","|Complete|","17","" -"`P2572R1 `__","``std::format`` fill character allowances","2023-02 (Issaquah)","|Complete|","17","" -"`P2693R1 `__","Formatting ``thread::id`` and ``stacktrace``","2023-02 (Issaquah)","|Partial|","","The formatter for ``stacktrace`` is not implemented, since ``stacktrace`` is not implemented yet" -"`P2679R2 `__","Fixing ``std::start_lifetime_as`` for arrays","2023-02 (Issaquah)","","","" -"`P2674R1 `__","A trait for implicit lifetime types","2023-02 (Issaquah)","|Complete|","20","" -"`P2655R3 `__","``common_reference_t`` of ``reference_wrapper`` Should Be a Reference Type","2023-02 (Issaquah)","|Complete|","21","The paper is implemented as a DR to C++20" -"`P2652R2 `__","Disallow User Specialization of ``allocator_traits``","2023-02 (Issaquah)","|Complete|","19","" -"`P2787R1 `__","``pmr::generator`` - Promise Types are not Values","2023-02 (Issaquah)","","","" -"`P2614R2 `__","Deprecate ``numeric_limits::has_denorm``","2023-02 (Issaquah)","|Complete|","18","" -"`P2588R3 `__","``barrier``’s phase completion guarantees","2023-02 (Issaquah)","","","" -"`P2763R1 `__","``layout_stride`` static extents default constructor fix","2023-02 (Issaquah)","","","" -"`P2736R2 `__","Referencing The Unicode Standard","2023-02 (Issaquah)","|Complete|","19","" +"Paper #","Paper Name","Meeting","Status","First released version","GitHub issue","Notes" +"`P0881R7 `__","A Proposal to add stacktrace library","2020-11 (Virtual)","","","`#105131 `__","" +"`P0943R6 `__","Support C atomics in C++","2020-11 (Virtual)","|Complete|","15","`#105132 `__","" +"`P1048R1 `__","A proposal for a type trait to detect scoped enumerations","2020-11 (Virtual)","|Complete|","12","`#105134 `__","" +"`P1679R3 `__","string contains function","2020-11 (Virtual)","|Complete|","12","`#105135 `__","" +"","","","","","","" +"`P1682R3 `__","std::to_underlying for enumerations","2021-02 (Virtual)","|Complete|","13","`#105136 `__","" +"`P2017R1 `__","Conditionally borrowed ranges","2021-02 (Virtual)","|Complete|","16","`#105138 `__","" +"`P2160R1 `__","Locks lock lockables","2021-02 (Virtual)","|Nothing To Do|","","`#105139 `__","" +"`P2162R2 `__","Inheriting from std::variant","2021-02 (Virtual)","|Complete|","13","`#105140 `__","" +"`P2212R2 `__","Relax Requirements for time_point::clock","2021-02 (Virtual)","|Nothing To Do|","","`#105141 `__","" +"`P2259R1 `__","Repairing input range adaptors and counted_iterator","2021-02 (Virtual)","","","`#105142 `__","" +"","","","","","","" +"`P0401R6 `__","Providing size feedback in the Allocator interface","2021-06 (Virtual)","|Complete|","15","`#105144 `__","" +"`P0448R4 `__","A strstream replacement using span as buffer","2021-06 (Virtual)","","","`#105145 `__","" +"`P1132R8 `__","out_ptr - a scalable output pointer abstraction","2021-06 (Virtual)","|Complete|","19","`#105146 `__","" +"`P1328R1 `__","Making std::type_info::operator== constexpr","2021-06 (Virtual)","|Complete|","17","`#105147 `__","" +"`P1425R4 `__","Iterators pair constructors for stack and queue","2021-06 (Virtual)","|Complete|","14","`#105149 `__","" +"`P1518R2 `__","Stop overconstraining allocators in container deduction guides","2021-06 (Virtual)","|Complete|","13","`#105150 `__","" +"`P1659R3 `__","starts_with and ends_with","2021-06 (Virtual)","|Complete|","19","`#105151 `__","" +"`P1951R1 `__","Default Arguments for pair Forwarding Constructor","2021-06 (Virtual)","|Complete|","14","`#105153 `__","" +"`P1989R2 `__","Range constructor for std::string_view","2021-06 (Virtual)","|Complete|","14","`#105154 `__","" +"`P2136R3 `__","invoke_r","2021-06 (Virtual)","|Complete|","17","`#105155 `__","" +"`P2166R1 `__","A Proposal to Prohibit std::basic_string and std::basic_string_view construction from nullptr","2021-06 (Virtual)","|Complete|","13","`#105156 `__","" +"","","","","","","" +"`P0288R9 `__","``any_invocable``","2021-10 (Virtual)","","","`#105157 `__","" +"`P0798R8 `__","Monadic operations for ``std::optional``","2021-10 (Virtual)","|Complete|","14","`#105158 `__","" +"`P0849R8 `__","``auto(x)``: ``DECAY_COPY`` in the language","2021-10 (Virtual)","|Complete|","14","`#105159 `__","" +"`P1072R10 `__","``basic_string::resize_and_overwrite``","2021-10 (Virtual)","|Complete|","14","`#105160 `__","" +"`P1147R1 `__","Printing ``volatile`` Pointers","2021-10 (Virtual)","|Complete|","14","`#105161 `__","" +"`P1272R4 `__","Byteswapping for fun&&nuf","2021-10 (Virtual)","|Complete|","14","`#105163 `__","" +"`P1675R2 `__","``rethrow_exception`` must be allowed to copy","2021-10 (Virtual)","|Nothing To Do|","","`#105164 `__","" +"`P2077R3 `__","Heterogeneous erasure overloads for associative containers","2021-10 (Virtual)","","","`#105165 `__","" +"`P2251R1 `__","Require ``span`` & ``basic_string_view`` to be Trivially Copyable","2021-10 (Virtual)","|Complete|","14","`#105166 `__","" +"`P2301R1 `__","Add a ``pmr`` alias for ``std::stacktrace``","2021-10 (Virtual)","","","`#105167 `__","" +"`P2321R2 `__","``zip``","2021-10 (Virtual)","|In Progress|","","`#105169 `__","" +"`P2340R1 `__","Clarifying the status of the 'C headers'","2021-10 (Virtual)","|Nothing To Do|","","`#105170 `__","" +"`P2393R1 `__","Cleaning up ``integer``-class types","2021-10 (Virtual)","","","`#105171 `__","" +"`P2401R0 `__","Add a conditional ``noexcept`` specification to ``std::exchange``","2021-10 (Virtual)","|Complete|","14","`#105172 `__","" +"","","","","","","" +"`P0323R12 `__","``std::expected``","2022-02 (Virtual)","|Complete|","16","`#105173 `__","" +"`P0533R9 `__","``constexpr`` for ```` and ````","2022-02 (Virtual)","|In Progress|","","`#105174 `__","``isfinite``, ``isinf``, ``isnan`` and ``isnormal`` are implemented" +"`P0627R6 `__","Function to mark unreachable code","2022-02 (Virtual)","|Complete|","15","`#105175 `__","" +"`P1206R7 `__","``ranges::to``: A function to convert any range to a container","2022-02 (Virtual)","|Complete|","17","`#105176 `__","" +"`P1413R3 `__","Deprecate ``std::aligned_storage`` and ``std::aligned_union``","2022-02 (Virtual)","|Complete|","","`#105177 `__","``std::aligned_storage_t`` and ``std::aligned_union_t`` are marked deprecated, but clang doesn't issue a diagnostic for deprecated using template declarations." +"`P2255R2 `__","A type trait to detect reference binding to temporary","2022-02 (Virtual)","|Partial|","","`#105180 `__","Implemented the type traits only." +"`P2273R3 `__","Making ``std::unique_ptr`` constexpr","2022-02 (Virtual)","|Complete|","16","`#105182 `__","" +"`P2387R3 `__","Pipe support for user-defined range adaptors","2022-02 (Virtual)","|Complete|","19","`#105183 `__","" +"`P2440R1 `__","``ranges::iota``, ``ranges::shift_left`` and ``ranges::shift_right``","2022-02 (Virtual)","|Partial|","","`#105184 `__","Only ``ranges::iota`` is implemented." +"`P2441R2 `__","``views::join_with``","2022-02 (Virtual)","|Complete|","21","`#105185 `__","" +"`P2442R1 `__","Windowing range adaptors: ``views::chunk`` and ``views::slide``","2022-02 (Virtual)","","","`#105187 `__","" +"`P2443R1 `__","``views::chunk_by``","2022-02 (Virtual)","|Complete|","18","`#105188 `__","" +"","","","","","","" +"`P0009R18 `__","mdspan: A Non-Owning Multidimensional Array Reference","2022-07 (Virtual)","|Complete|","18","`#105189 `__","" +"`P0429R9 `__","A Standard ``flat_map``","2022-07 (Virtual)","|Complete|","20","`#105190 `__","" +"`P1169R4 `__","``static operator()``","2022-07 (Virtual)","|Complete|","16","`#105192 `__","" +"`P1222R4 `__","A Standard ``flat_set``","2022-07 (Virtual)","|Complete|","21","`#105193 `__","" +"`P1223R5 `__","``ranges::find_last()``, ``ranges::find_last_if()``, and ``ranges::find_last_if_not()``","2022-07 (Virtual)","|Complete|","19","`#105194 `__","" +"`P1467R9 `__","Extended ``floating-point`` types and standard names","2022-07 (Virtual)","","","`#105196 `__","" +"`P1642R11 `__","Freestanding ``[utilities]``, ``[ranges]``, and ``[iterators]``","2022-07 (Virtual)","","","`#105197 `__","" +"`P1899R3 `__","``stride_view``","2022-07 (Virtual)","","","`#105198 `__","" +"`P2093R14 `__","Formatted output","2022-07 (Virtual)","|Complete|","18","`#105199 `__","" +"`P2165R4 `__","Compatibility between ``tuple``, ``pair`` and ``tuple-like`` objects","2022-07 (Virtual)","|Partial|","","`#105200 `__","Only the part for ``zip_view`` is implemented." +"`P2278R4 `__","``cbegin`` should always return a constant iterator","2022-07 (Virtual)","","","`#105201 `__","" +"`P2286R8 `__","Formatting Ranges","2022-07 (Virtual)","|Complete|","16","`#105202 `__","" +"`P2291R3 `__","Add Constexpr Modifiers to Functions ``to_chars`` and ``from_chars`` for Integral Types in ```` Header","2022-07 (Virtual)","|Complete|","16","`#105204 `__","" +"`P2302R4 `__","``std::ranges::contains``","2022-07 (Virtual)","|Complete|","19","`#105206 `__","" +"`P2322R6 `__","``ranges::fold``","2022-07 (Virtual)","","","`#105208 `__","" +"`P2374R4 `__","``views::cartesian_product``","2022-07 (Virtual)","","","`#105209 `__","" +"`P2404R3 `__","Move-only types for ``equality_comparable_with``, ``totally_ordered_with``, and ``three_way_comparable_with``","2022-07 (Virtual)","","","`#105210 `__","" +"`P2408R5 `__","Ranges iterators as inputs to non-Ranges algorithms","2022-07 (Virtual)","","","`#105211 `__","" +"`P2417R2 `__","A more ``constexpr`` ``bitset``","2022-07 (Virtual)","|Complete|","16","`#105212 `__","" +"`P2419R2 `__","Clarify handling of encodings in localized formatting of chrono types","2022-07 (Virtual)","","","`#105213 `__","" +"`P2438R2 `__","``std::string::substr() &&``","2022-07 (Virtual)","|Complete|","16","`#105215 `__","" +"`P2445R1 `__","``forward_like``","2022-07 (Virtual)","|Complete|","16","`#105216 `__","" +"`P2446R2 `__","``views::as_rvalue``","2022-07 (Virtual)","|Complete|","16","`#105217 `__","" +"`P2460R2 `__","Relax requirements on ``wchar_t`` to match existing practices","2022-07 (Virtual)","|Nothing To Do|","","`#105218 `__","" +"`P2465R3 `__","Standard Library Modules ``std`` and ``std.compat``","2022-07 (Virtual)","|Complete|","19","`#105219 `__","" +"`P2467R1 `__","Support exclusive mode for ``fstreams``","2022-07 (Virtual)","|Complete|","18","`#105221 `__","" +"`P2474R2 `__","``views::repeat``","2022-07 (Virtual)","|Complete|","17","`#105222 `__","" +"`P2494R2 `__","Relaxing range adaptors to allow for move only types","2022-07 (Virtual)","|Complete|","17","`#105224 `__","" +"`P2499R0 `__","``string_view`` range constructor should be ``explicit``","2022-07 (Virtual)","|Complete|","16","`#105225 `__","" +"`P2502R2 `__","``std::generator``: Synchronous Coroutine Generator for Ranges","2022-07 (Virtual)","","","`#105226 `__","" +"`P2508R1 `__","Exposing ``std::basic-format-string``","2022-07 (Virtual)","|Complete|","15","`#105227 `__","" +"`P2517R1 `__","Add a conditional ``noexcept`` specification to ``std::apply``","2022-07 (Virtual)","|Complete|","3.9","`#105229 `__","" +"`P2520R0 `__","``move_iterator`` should be a random access iterator","2022-07 (Virtual)","|Complete|","17","`#105230 `__","Implemented as a DR in C++20" +"`P2540R1 `__","Empty Product for certain Views","2022-07 (Virtual)","","","`#105231 `__","" +"`P2549R1 `__","``std::unexpected`` should have ``error()`` as member accessor","2022-07 (Virtual)","|Complete|","16","`#105232 `__","" +"`P2585R0 `__","Improving default container formatting","2022-07 (Virtual)","|Complete|","17","`#105233 `__","" +"`P2590R2 `__","Explicit lifetime management","2022-07 (Virtual)","","","`#105234 `__","" +"`P2599R2 `__","``mdspan::size_type`` should be ``index_type``","2022-07 (Virtual)","|Complete|","18","`#105235 `__","" +"`P2604R0 `__","mdspan: rename pointer and contiguous","2022-07 (Virtual)","|Complete|","18","`#105236 `__","" +"`P2613R1 `__","Add the missing ``empty`` to ``mdspan``","2022-07 (Virtual)","|Complete|","18","`#105237 `__","" +"","","","","","","" +"`P1202R5 `__","Asymmetric Fences","2022-11 (Kona)","","","`#105238 `__","" +"`P1264R2 `__","Revising the wording of ``stream`` input operations","2022-11 (Kona)","|Complete|","9","`#105239 `__","" +"`P1478R8 `__","``Byte-wise`` ``atomic`` ``memcpy``","2022-11 (Kona)","","","`#105240 `__","" +"`P2167R3 `__","Improved Proposed Wording for LWG 2114","2022-11 (Kona)","|Complete|","20","`#105241 `__","The `[cmp.alg] `__ part is implemented as a DR against C++20. MSVC STL does the same. Other parts are Nothing To Do." +"`P2396R1 `__","Concurrency TS 2 fixes ","2022-11 (Kona)","","","`#105242 `__","" +"`P2505R5 `__","Monadic Functions for ``std::expected``","2022-11 (Kona)","|Complete|","17","`#105243 `__","" +"`P2539R4 `__","Should the output of ``std::print`` to a terminal be synchronized with the underlying stream?","2022-11 (Kona)","|Complete|","18","`#105245 `__","" +"`P2602R2 `__","Poison Pills are Too Toxic","2022-11 (Kona)","|Complete|","19","`#105246 `__","Implemented as a DR in C++20." +"`P2708R1 `__","No Further Fundamentals TSes","2022-11 (Kona)","|Nothing To Do|","","`#105247 `__","" +"","","","","","","" +"`P0290R4 `__","``apply()`` for ``synchronized_value``","2023-02 (Issaquah)","","","`#105249 `__","" +"`P2770R0 `__","Stashing stashing ``iterators`` for proper flattening","2023-02 (Issaquah)","|Complete|","21","`#105250 `__","" +"`P2164R9 `__","``views::enumerate``","2023-02 (Issaquah)","","","`#105251 `__","" +"`P2711R1 `__","Making multi-param constructors of ``views`` ``explicit``","2023-02 (Issaquah)","|Complete|","21","`#105252 `__","" +"`P2609R3 `__","Relaxing Ranges Just A Smidge","2023-02 (Issaquah)","|Complete|","20","`#105253 `__","Implemented as a DR in C++20. Other implementations will do the same." +"`P2713R1 `__","Escaping improvements in ``std::format``","2023-02 (Issaquah)","|Complete|","19","`#105254 `__","" +"`P2675R1 `__","``format``'s width estimation is too approximate and not forward compatible","2023-02 (Issaquah)","|Complete|","17","`#105255 `__","" +"`P2572R1 `__","``std::format`` fill character allowances","2023-02 (Issaquah)","|Complete|","17","`#105256 `__","" +"`P2693R1 `__","Formatting ``thread::id`` and ``stacktrace``","2023-02 (Issaquah)","|Partial|","","`#105257 `__","The formatter for ``stacktrace`` is not implemented, since ``stacktrace`` is not implemented yet" +"`P2679R2 `__","Fixing ``std::start_lifetime_as`` for arrays","2023-02 (Issaquah)","","","`#105258 `__","" +"`P2674R1 `__","A trait for implicit lifetime types","2023-02 (Issaquah)","|Complete|","20","`#105259 `__","" +"`P2655R3 `__","``common_reference_t`` of ``reference_wrapper`` Should Be a Reference Type","2023-02 (Issaquah)","|Complete|","21","`#105260 `__","The paper is implemented as a DR to C++20" +"`P2652R2 `__","Disallow User Specialization of ``allocator_traits``","2023-02 (Issaquah)","|Complete|","19","`#105262 `__","" +"`P2787R1 `__","``pmr::generator`` - Promise Types are not Values","2023-02 (Issaquah)","","","`#105263 `__","" +"`P2614R2 `__","Deprecate ``numeric_limits::has_denorm``","2023-02 (Issaquah)","|Complete|","18","`#105264 `__","" +"`P2588R3 `__","``barrier``’s phase completion guarantees","2023-02 (Issaquah)","","","`#105265 `__","" +"`P2763R1 `__","``layout_stride`` static extents default constructor fix","2023-02 (Issaquah)","","","`#105266 `__","" +"`P2736R2 `__","Referencing The Unicode Standard","2023-02 (Issaquah)","|Complete|","19","`#105267 `__","" diff --git a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx2cIssues.csv b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx2cIssues.csv index c6225127a7..859c49af17 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx2cIssues.csv +++ b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx2cIssues.csv @@ -1,153 +1,153 @@ -"Issue #","Issue Name","Meeting","Status","First released version","Notes" -"`LWG2994 `__","Needless UB for ``basic_string`` and ``basic_string_view``","2023-06 (Varna)","|Complete|","5","" -"`LWG3884 `__","``flat_foo`` is missing allocator-extended copy/move constructors","2023-06 (Varna)","","","" -"`LWG3885 `__","``op`` should be in [zombie.names]","2023-06 (Varna)","|Nothing To Do|","","" -"`LWG3887 `__","Version macro for ``allocate_at_least``","2023-06 (Varna)","|Complete|","19","" -"`LWG3893 `__","LWG 3661 broke ``atomic> a; a = nullptr;``","2023-06 (Varna)","","","" -"`LWG3894 `__","``generator::promise_type::yield_value(ranges::elements_of)`` should not be ``noexcept``","2023-06 (Varna)","","","" -"`LWG3903 `__","span destructor is redundantly noexcept","2023-06 (Varna)","|Complete|","7","" -"`LWG3904 `__","``lazy_split_view::outer-iterator``'s const-converting constructor isn't setting ``trailing_empty_``","2023-06 (Varna)","","","" -"`LWG3905 `__","Type of ``std::fexcept_t``","2023-06 (Varna)","|Complete|","3.4","" -"`LWG3912 `__","``enumerate_view::iterator::operator-`` should be ``noexcept``","2023-06 (Varna)","","","" -"`LWG3914 `__","Inconsistent template-head of ``ranges::enumerate_view``","2023-06 (Varna)","","","" -"`LWG3915 `__","Redundant paragraph about expression variations","2023-06 (Varna)","","","" -"`LWG3925 `__","Concept ``formattable``'s definition is incorrect","2023-06 (Varna)","|Complete|","17","" -"`LWG3927 `__","Unclear preconditions for ``operator[]`` for sequence containers","2023-06 (Varna)","|Nothing To Do|","","" -"`LWG3935 `__","``template constexpr complex& operator=(const complex&)`` has no specification","2023-06 (Varna)","|Complete|","3.4","" -"`LWG3938 `__","Cannot use ``std::expected`` monadic ops with move-only ``error_type``","2023-06 (Varna)","|Complete|","18","" -"`LWG3940 `__","``std::expected::value()`` also needs ``E`` to be copy constructible","2023-06 (Varna)","|Complete|","18","" -"","","","","","" -"`LWG2392 `__","""character type"" is used but not defined","2023-11 (Kona)","","","" -"`LWG3203 `__","``span`` element access invalidation","2023-11 (Kona)","|Nothing To Do|","","" -"`LWG3305 `__","``any_cast``","2023-11 (Kona)","|Complete|","18","" -"`LWG3431 `__","``<=>`` for containers should require ``three_way_comparable`` instead of ``<=>``","2023-11 (Kona)","","","" -"`LWG3749 `__","``common_iterator`` should handle integer-class difference types","2023-11 (Kona)","","","" -"`LWG3809 `__","Is ``std::subtract_with_carry_engine`` supposed to work","2023-11 (Kona)","","","" -"`LWG3892 `__","Incorrect formatting of nested ranges and tuples","2023-11 (Kona)","|Complete|","17","" -"`LWG3897 `__","``inout_ptr`` will not update raw pointer to 0","2023-11 (Kona)","|Complete|","19","" -"`LWG3946 `__","The definition of ``const_iterator_t`` should be reworked","2023-11 (Kona)","","","" -"`LWG3947 `__","Unexpected constraints on ``adjacent_transform_view::base()``","2023-11 (Kona)","","","" -"`LWG3948 `__","``possibly-const-range and as-const-pointer`` should be ``noexcept``","2023-11 (Kona)","","","" -"`LWG3949 `__","``std::atomic``'s trivial destructor dropped in C++17 spec wording","2023-11 (Kona)","","","" -"`LWG3951 `__","[expected.object.swap]: Using ``value()`` instead of ``has_value()``","2023-11 (Kona)","|Complete|","16","" -"`LWG3953 `__","``iter_move`` for ``common_iterator`` and ``counted_iterator`` should return ``decltype(auto)``","2023-11 (Kona)","|Complete|","20","" -"`LWG3957 `__","[container.alloc.reqmts] The value category of v should be claimed","2023-11 (Kona)","","","" -"`LWG3965 `__","Incorrect example in [format.string.escaped] p3 for formatting of combining characters","2023-11 (Kona)","|Complete|","19","" -"`LWG3970 `__","[mdspan.syn] Missing definition of ``full_extent_t`` and ``full_extent``","2023-11 (Kona)","","","" -"`LWG3973 `__","Monadic operations should be ADL-proof","2023-11 (Kona)","","","" -"`LWG3974 `__","``mdspan::operator[]`` should not copy ``OtherIndexTypes``","2023-11 (Kona)","","","" -"`LWG3987 `__","Including `` doesn't provide `std::begin`/`end`","2023-11 (Kona)","|Complete|","","" -"`LWG3990 `__","Program-defined specializations of ``std::tuple`` and ``std::variant`` can't be properly supported","2023-11 (Kona)","|Complete|","21","" -"`LWG4001 `__","``iota_view`` should provide ``empty``","2023-11 (Kona)","|Complete|","19","" -"","","","","","" -"`LWG3767 `__","``codecvt`` incorrectly added to locale","2024-03 (Tokyo)","","","" -"`LWG3919 `__","``enumerate_view`` may invoke UB for sized common non-forward underlying ranges","2024-03 (Tokyo)","","","" -"`LWG3950 `__","``std::basic_string_view`` comparison operators are overspecified","2024-03 (Tokyo)","|Complete|","18","" -"`LWG3975 `__","Specializations of ``basic_format_context`` should not be permitted","2024-03 (Tokyo)","|Nothing To Do|","","" -"`LWG3984 `__","``ranges::to``'s recursion branch may be ill-formed","2024-03 (Tokyo)","|Complete|","19","" -"`LWG4011 `__","""`Effects`: Equivalent to return"" in ``[span.elem]``","2024-03 (Tokyo)","|Nothing To Do|","","" -"`LWG4012 `__","``common_view::begin/end`` are missing the ``simple-view`` check","2024-03 (Tokyo)","","","" -"`LWG4013 `__","``lazy_split_view::outer-iterator::value_type`` should not provide default constructor","2024-03 (Tokyo)","","","" -"`LWG4016 `__","container-insertable checks do not match what container-inserter does","2024-03 (Tokyo)","|Complete|","20","" -"`LWG4023 `__","Preconditions of ``std::basic_streambuf::setg/setp``","2024-03 (Tokyo)","|Complete|","19","" -"`LWG4025 `__","Move assignment operator of ``std::expected`` should not be conditionally deleted","2024-03 (Tokyo)","|Complete|","20","" -"`LWG4030 `__","Clarify whether arithmetic expressions in ``[numeric.sat.func]`` are mathematical or C++","2024-03 (Tokyo)","|Nothing To Do|","","" -"`LWG4031 `__","``bad_expected_access`` member functions should be ``noexcept``","2024-03 (Tokyo)","|Complete|","16","" -"`LWG4035 `__","``single_view`` should provide ``empty``","2024-03 (Tokyo)","|Complete|","19","" -"`LWG4036 `__","``__alignof_is_defined`` is only implicitly specified in C++ and not yet deprecated","2024-03 (Tokyo)","","","" -"`LWG4037 `__","Static data members of ``ctype_base`` are not yet required to be usable in constant expressions","2024-03 (Tokyo)","","","" -"`LWG4038 `__","``std::text_encoding::aliases_view`` should have constexpr iterators","2024-03 (Tokyo)","","","" -"`LWG4043 `__","""ASCII"" is not a registered character encoding","2024-03 (Tokyo)","|Nothing To Do|","","" -"`LWG4045 `__","``tuple`` can create dangling references from ``tuple-like``","2024-03 (Tokyo)","","","" -"`LWG4053 `__","Unary call to ``std::views::repeat`` does not decay the argument","2024-03 (Tokyo)","|Complete|","19","" -"`LWG4054 `__","Repeating a ``repeat_view`` should repeat the view","2024-03 (Tokyo)","|Complete|","19","" -"","","","","","" -"`LWG3944 `__","Formatters converting sequences of ``char`` to sequences of ``wchar_t``","2024-06 (St. Louis)","|Complete|","21","" -"`LWG4060 `__","``submdspan`` preconditions do not forbid creating invalid pointer","2024-06 (St. Louis)","","","" -"`LWG4061 `__","Should ``std::basic_format_context`` be default-constructible/copyable/movable?","2024-06 (St. Louis)","|Complete|","19","" -"`LWG4071 `__","``reference_wrapper`` comparisons are not SFINAE-friendly","2024-06 (St. Louis)","|Complete|","19","" -"`LWG4074 `__","``compatible-joinable-ranges`` is underconstrained","2024-06 (St. Louis)","|Complete|","21","" -"`LWG4076 `__","``concat_view`` should be freestanding","2024-06 (St. Louis)","","","" -"`LWG4079 `__","Missing Preconditions in ``concat_view::iterator``\`s conversion constructor","2024-06 (St. Louis)","","","" -"`LWG4082 `__","``views::concat(r)`` is well-formed when ``r`` is an ``output_range``","2024-06 (St. Louis)","","","" -"`LWG4083 `__","``views::as_rvalue`` should reject non-input ranges","2024-06 (St. Louis)","","","" -"`LWG4096 `__","``views::iota(views::iota(0))`` should be rejected","2024-06 (St. Louis)","","","" -"`LWG4098 `__","``views::adjacent<0>`` should reject non-forward ranges","2024-06 (St. Louis)","","","" -"`LWG4105 `__","``ranges::ends_with``\`s Returns misses difference casting","2024-06 (St. Louis)","","","" -"`LWG4106 `__","``basic_format_args`` should not be default-constructible","2024-06 (St. Louis)","|Complete|","19","" -"","","","","","" -"`LWG3216 `__","Rebinding the allocator before calling ``construct``/``destroy`` in ``allocate_shared``","2024-11 (Wrocław)","","","" -"`LWG3436 `__","``std::construct_at`` should support arrays","2024-11 (Wrocław)","","","" -"`LWG3886 `__","Monad mo' problems","2024-11 (Wrocław)","","","" -"`LWG3899 `__","``co_yield``\ing elements of an lvalue generator is unnecessarily inefficient","2024-11 (Wrocław)","","","" -"`LWG3900 `__","The ``allocator_arg_t`` overloads of ``generator::promise_type::operator new`` should not be constrained","2024-11 (Wrocław)","","","" -"`LWG3918 `__","``std::uninitialized_move/_n`` and guaranteed copy elision","2024-11 (Wrocław)","","","" -"`LWG4014 `__","LWG 3809 changes behavior of some existing ``std::subtract_with_carry_engine code``","2024-11 (Wrocław)","","","" -"`LWG4024 `__","Underspecified destruction of objects created in ``std::make_shared_for_overwrite``/``std::allocate_shared_for_overwrite``","2024-11 (Wrocław)","|Complete|","16","" -"`LWG4027 `__","``possibly-const-range`` should prefer returning ``const R&``","2024-11 (Wrocław)","","","" -"`LWG4044 `__","Confusing requirements for ``std::print`` on POSIX platforms","2024-11 (Wrocław)","","","" -"`LWG4064 `__","Clarify that ``std::launder`` is not needed when using the result of ``std::memcpy``","2024-11 (Wrocław)","","","" -"`LWG4072 `__","``std::optional`` comparisons: constrain harder","2024-11 (Wrocław)","","","" -"`LWG4084 `__","``std::fixed`` ignores ``std::uppercase``","2024-11 (Wrocław)","","","" -"`LWG4085 `__","``ranges::generate_random``'s helper lambda should specify the return type","2024-11 (Wrocław)","","","" -"`LWG4088 `__","``println`` ignores the locale imbued in ``std::ostream``","2024-11 (Wrocław)","|Complete|","18","" -"`LWG4112 `__","``has-arrow`` should required ``operator->()`` to be ``const``-qualified","2024-11 (Wrocław)","","","" -"`LWG4113 `__","Disallow ``has_unique_object_representations``","2024-11 (Wrocław)","|Complete|","","" -"`LWG4119 `__","``generator::promise_type::yield_value(ranges::elements_of)``'s nested ``generator`` may be ill-formed","2024-11 (Wrocław)","","","" -"`LWG4124 `__","Cannot format ``zoned_time`` with resolution coarser than ``seconds``","2024-11 (Wrocław)","","","" -"`LWG4126 `__","Some feature-test macros for fully freestanding features are not yet marked freestanding","2024-11 (Wrocław)","","","" -"`LWG4134 `__","Issue with Philox algorithm specification","2024-11 (Wrocław)","","","" -"`LWG4135 `__","The helper lambda of ``std::erase`` for list should specify return type as ``bool``","2024-11 (Wrocław)","|Complete|","21","" -"`LWG4140 `__","Useless default constructors for bit reference types","2024-11 (Wrocław)","|Complete|","","" -"`LWG4141 `__","Improve prohibitions on ""additional storage""","2024-11 (Wrocław)","","","" -"`LWG4142 `__","``format_parse_context::check_dynamic_spec`` should require at least one type","2024-11 (Wrocław)","","","" -"`LWG4144 `__","Disallow ``unique_ptr``","2024-11 (Wrocław)","","","" -"`LWG4147 `__","Precondition on ``inplace_vector::emplace``","2024-11 (Wrocław)","","","" -"`LWG4148 `__","``unique_ptr::operator*`` should not allow dangling references","2024-11 (Wrocław)","","","" -"`LWG4153 `__","Fix extra ""-1"" for ``philox_engine::max()``","2024-11 (Wrocław)","","","" -"`LWG4154 `__","The Mandates for ``std::packaged_task``'s constructor from a callable entity should consider decaying","2024-11 (Wrocław)","","","" -"`LWG4157 `__","The resolution of LWG3465 was damaged by P2167R3","2024-11 (Wrocław)","|Complete|","20","" -"`LWG4164 `__","Missing guarantees for ``forward_list`` modifiers","2024-11 (Wrocław)","|Complete|","21","" -"`LWG4169 `__","``std::atomic``'s default constructor should be constrained","2024-11 (Wrocław)","","","" -"`LWG4170 `__","``contiguous_iterator`` should require ``to_address(I{})``","2024-11 (Wrocław)","","","" -"","","","","","" -"`LWG3578 `__","Iterator SCARYness in the context of associative container merging","2025-02 (Hagenberg)","","","" -"`LWG3956 `__","``chrono::parse`` uses ``from_stream`` as a customization point","2025-02 (Hagenberg)","","","" -"`LWG4172 `__","``unique_lock`` self-move-assignment is broken","2025-02 (Hagenberg)","","","" -"`LWG4175 `__","``get_env()`` specified in terms of ``as_const()`` but this doesn't work with rvalue senders","2025-02 (Hagenberg)","","","" -"`LWG4179 `__","Wrong range in ``[alg.search]``","2025-02 (Hagenberg)","","","" -"`LWG4186 `__","``regex_traits::transform_primary`` mistakenly detects ``typeid`` of a function","2025-02 (Hagenberg)","","","" -"`LWG4189 `__","``cache_latest_view`` should be freestanding","2025-02 (Hagenberg)","","","" -"`LWG4191 `__","P1467 changed the return type of ``pow(complex, int)``","2025-02 (Hagenberg)","","","" -"`LWG4196 `__","Complexity of ``inplace_merge()`` is incorrect","2025-02 (Hagenberg)","","","" -"","","","","","" -"`LWG4198 `__","``schedule_from`` isn't starting the schedule sender if decay-copying results throws","2025-06 (Sofia)","","","" -"`LWG4202 `__","``enable-sender`` should be a variable template","2025-06 (Sofia)","","","" -"`LWG4203 `__","Constraints on ``get-state`` functions are incorrect","2025-06 (Sofia)","","","" -"`LWG4204 `__","specification of ``as-sndr2(Sig)`` in [exec.let] is incomplete","2025-06 (Sofia)","","","" -"`LWG4205 `__","``let_[*].transform_env`` is specified in terms of the ``let_*`` sender itself instead of its child","2025-06 (Sofia)","","","" -"`LWG4208 `__","Wording needs to ensure that in ``connect(sndr, rcvr)`` that ``rcvr`` expression is only evaluated once","2025-06 (Sofia)","","","" -"`LWG4209 `__","``default_domain::transform_env`` should be returning ``FWD-ENV(env)``","2025-06 (Sofia)","","","" -"`LWG4188 `__","``ostream::sentry`` destructor should handle exceptions","2025-06 (Sofia)","","","" -"`LWG4200 `__","The ``operation_state`` concept can be simplified","2025-06 (Sofia)","","","" -"`LWG4201 `__","``with-await-transform::await_transform`` should not use a deduced return type","2025-06 (Sofia)","","","" -"`LWG4217 `__","Clarify ``mdspan`` layout mapping requirements for ``rank == 0``","2025-06 (Sofia)","","","" -"`LWG4222 `__","``expected`` constructor from a single value missing a constraint","2025-06 (Sofia)","","","" -"`LWG4224 `__","Philox engines should be freestanding","2025-06 (Sofia)","","","" -"`LWG4227 `__","Missing ``noexcept`` operator in [exec.when.all]","2025-06 (Sofia)","","","" -"`LWG4231 `__","``datapar::chunk`` should use ``simd-size-type`` instead of ``size_t``","2025-06 (Sofia)","","","" -"`LWG4232 `__","``datapar::resize`` does not resize","2025-06 (Sofia)","","","" -"`LWG4233 `__","The helper lambda of ``std::erase`` for ``hive`` should specify return type as ``bool``","2025-06 (Sofia)","","","" -"`LWG4234 `__","Including ```` doesn't provide ``std::begin/end``","2025-06 (Sofia)","","","" -"`LWG4235 `__","``cache_latest_view`` and ``to_input_view`` miss ``reserve_hint``","2025-06 (Sofia)","","","" -"`LWG4236 `__","``chunk_view::outer-iterator::value_type`` should provide ``reserve_hint``","2025-06 (Sofia)","","","" -"`LWG4239 `__","``flat_map``'s transparent comparator no longer works for string literals","2025-06 (Sofia)","","","" -"`LWG4242 `__","``ranges::distance`` does not work with volatile iterators","2025-06 (Sofia)","","","" -"`LWG4245 `__","Operators that interact with ``counted_iterator`` and ``default_sentinel_t`` should be ``noexcept``","2025-06 (Sofia)","","","" -"`LWG4247 `__","Header ```` is not yet freestanding","2025-06 (Sofia)","","","" -"","","","","","" -"`LWG3343 `__","Ordering of calls to ``unlock()`` and ``notify_all()`` in Effects element of ``notify_all_at_thread_exit()`` should be reversed","Not Adopted Yet","|Complete|","16","" -"`LWG4139 `__","§[time.zone.leap] recursive constraint in ``<=>``","Not Adopted Yet","|Complete|","20","" -"`LWG3456 `__","Pattern used by ``std::from_chars`` is underspecified (option B)","Not Adopted Yet","|Complete|","20","" -"`LWG3882 `__","``tuple`` relational operators have confused friendships","Not Adopted Yet","|Complete|","21","The comparsion operators are constrained harder than the proposed resolution. libstdc++ and MSVC STL do the same." -"","","","","","" +"Issue #","Issue Name","Meeting","Status","First released version","GitHub issue","Notes" +"`LWG2994 `__","Needless UB for ``basic_string`` and ``basic_string_view``","2023-06 (Varna)","|Complete|","5","`#105268 `__","" +"`LWG3884 `__","``flat_foo`` is missing allocator-extended copy/move constructors","2023-06 (Varna)","","","`#105269 `__","" +"`LWG3885 `__","``op`` should be in [zombie.names]","2023-06 (Varna)","|Nothing To Do|","","`#105270 `__","" +"`LWG3887 `__","Version macro for ``allocate_at_least``","2023-06 (Varna)","|Complete|","19","`#105271 `__","" +"`LWG3893 `__","LWG 3661 broke ``atomic> a; a = nullptr;``","2023-06 (Varna)","","","`#105273 `__","" +"`LWG3894 `__","``generator::promise_type::yield_value(ranges::elements_of)`` should not be ``noexcept``","2023-06 (Varna)","","","`#105274 `__","" +"`LWG3903 `__","span destructor is redundantly noexcept","2023-06 (Varna)","|Complete|","7","`#105275 `__","" +"`LWG3904 `__","``lazy_split_view::outer-iterator``'s const-converting constructor isn't setting ``trailing_empty_``","2023-06 (Varna)","","","`#105276 `__","" +"`LWG3905 `__","Type of ``std::fexcept_t``","2023-06 (Varna)","|Complete|","3.4","`#105277 `__","" +"`LWG3912 `__","``enumerate_view::iterator::operator-`` should be ``noexcept``","2023-06 (Varna)","","","`#105279 `__","" +"`LWG3914 `__","Inconsistent template-head of ``ranges::enumerate_view``","2023-06 (Varna)","","","`#105280 `__","" +"`LWG3915 `__","Redundant paragraph about expression variations","2023-06 (Varna)","","","`#105281 `__","" +"`LWG3925 `__","Concept ``formattable``'s definition is incorrect","2023-06 (Varna)","|Complete|","17","`#105282 `__","" +"`LWG3927 `__","Unclear preconditions for ``operator[]`` for sequence containers","2023-06 (Varna)","|Nothing To Do|","","`#105283 `__","" +"`LWG3935 `__","``template constexpr complex& operator=(const complex&)`` has no specification","2023-06 (Varna)","|Complete|","3.4","`#105284 `__","" +"`LWG3938 `__","Cannot use ``std::expected`` monadic ops with move-only ``error_type``","2023-06 (Varna)","|Complete|","18","`#105285 `__","" +"`LWG3940 `__","``std::expected::value()`` also needs ``E`` to be copy constructible","2023-06 (Varna)","|Complete|","18","`#105286 `__","" +"","","","","","","" +"`LWG2392 `__","""character type"" is used but not defined","2023-11 (Kona)","","","`#105287 `__","" +"`LWG3203 `__","``span`` element access invalidation","2023-11 (Kona)","|Nothing To Do|","","`#105288 `__","" +"`LWG3305 `__","``any_cast``","2023-11 (Kona)","|Complete|","18","`#105289 `__","" +"`LWG3431 `__","``<=>`` for containers should require ``three_way_comparable`` instead of ``<=>``","2023-11 (Kona)","","","`#105290 `__","" +"`LWG3749 `__","``common_iterator`` should handle integer-class difference types","2023-11 (Kona)","","","`#105291 `__","" +"`LWG3809 `__","Is ``std::subtract_with_carry_engine`` supposed to work","2023-11 (Kona)","","","`#105295 `__","" +"`LWG3892 `__","Incorrect formatting of nested ranges and tuples","2023-11 (Kona)","|Complete|","17","`#105296 `__","" +"`LWG3897 `__","``inout_ptr`` will not update raw pointer to 0","2023-11 (Kona)","|Complete|","19","`#105297 `__","" +"`LWG3946 `__","The definition of ``const_iterator_t`` should be reworked","2023-11 (Kona)","","","`#105298 `__","" +"`LWG3947 `__","Unexpected constraints on ``adjacent_transform_view::base()``","2023-11 (Kona)","","","`#105299 `__","" +"`LWG3948 `__","``possibly-const-range and as-const-pointer`` should be ``noexcept``","2023-11 (Kona)","","","`#105300 `__","" +"`LWG3949 `__","``std::atomic``'s trivial destructor dropped in C++17 spec wording","2023-11 (Kona)","","","`#105301 `__","" +"`LWG3951 `__","[expected.object.swap]: Using ``value()`` instead of ``has_value()``","2023-11 (Kona)","|Complete|","16","`#105302 `__","" +"`LWG3953 `__","``iter_move`` for ``common_iterator`` and ``counted_iterator`` should return ``decltype(auto)``","2023-11 (Kona)","|Complete|","20","`#105303 `__","" +"`LWG3957 `__","[container.alloc.reqmts] The value category of v should be claimed","2023-11 (Kona)","","","`#105304 `__","" +"`LWG3965 `__","Incorrect example in [format.string.escaped] p3 for formatting of combining characters","2023-11 (Kona)","|Complete|","19","`#105305 `__","" +"`LWG3970 `__","[mdspan.syn] Missing definition of ``full_extent_t`` and ``full_extent``","2023-11 (Kona)","","","`#105306 `__","" +"`LWG3973 `__","Monadic operations should be ADL-proof","2023-11 (Kona)","","","`#105307 `__","" +"`LWG3974 `__","``mdspan::operator[]`` should not copy ``OtherIndexTypes``","2023-11 (Kona)","","","`#105308 `__","" +"`LWG3987 `__","Including `` doesn't provide `std::begin`/`end`","2023-11 (Kona)","|Complete|","","`#105309 `__","" +"`LWG3990 `__","Program-defined specializations of ``std::tuple`` and ``std::variant`` can't be properly supported","2023-11 (Kona)","|Complete|","21","`#105310 `__","" +"`LWG4001 `__","``iota_view`` should provide ``empty``","2023-11 (Kona)","|Complete|","19","`#105311 `__","" +"","","","","","","" +"`LWG3767 `__","``codecvt`` incorrectly added to locale","2024-03 (Tokyo)","","","`#105313 `__","" +"`LWG3919 `__","``enumerate_view`` may invoke UB for sized common non-forward underlying ranges","2024-03 (Tokyo)","","","`#105315 `__","" +"`LWG3950 `__","``std::basic_string_view`` comparison operators are overspecified","2024-03 (Tokyo)","|Complete|","18","`#105316 `__","" +"`LWG3975 `__","Specializations of ``basic_format_context`` should not be permitted","2024-03 (Tokyo)","|Nothing To Do|","","`#105317 `__","" +"`LWG3984 `__","``ranges::to``'s recursion branch may be ill-formed","2024-03 (Tokyo)","|Complete|","19","`#105318 `__","" +"`LWG4011 `__","""`Effects`: Equivalent to return"" in ``[span.elem]``","2024-03 (Tokyo)","|Nothing To Do|","","`#105319 `__","" +"`LWG4012 `__","``common_view::begin/end`` are missing the ``simple-view`` check","2024-03 (Tokyo)","","","`#105320 `__","" +"`LWG4013 `__","``lazy_split_view::outer-iterator::value_type`` should not provide default constructor","2024-03 (Tokyo)","","","`#105321 `__","" +"`LWG4016 `__","container-insertable checks do not match what container-inserter does","2024-03 (Tokyo)","|Complete|","20","`#105322 `__","" +"`LWG4023 `__","Preconditions of ``std::basic_streambuf::setg/setp``","2024-03 (Tokyo)","|Complete|","19","`#105323 `__","" +"`LWG4025 `__","Move assignment operator of ``std::expected`` should not be conditionally deleted","2024-03 (Tokyo)","|Complete|","20","`#105324 `__","" +"`LWG4030 `__","Clarify whether arithmetic expressions in ``[numeric.sat.func]`` are mathematical or C++","2024-03 (Tokyo)","|Nothing To Do|","","`#105325 `__","" +"`LWG4031 `__","``bad_expected_access`` member functions should be ``noexcept``","2024-03 (Tokyo)","|Complete|","16","`#105326 `__","" +"`LWG4035 `__","``single_view`` should provide ``empty``","2024-03 (Tokyo)","|Complete|","19","`#105328 `__","" +"`LWG4036 `__","``__alignof_is_defined`` is only implicitly specified in C++ and not yet deprecated","2024-03 (Tokyo)","","","`#105329 `__","" +"`LWG4037 `__","Static data members of ``ctype_base`` are not yet required to be usable in constant expressions","2024-03 (Tokyo)","","","`#105330 `__","" +"`LWG4038 `__","``std::text_encoding::aliases_view`` should have constexpr iterators","2024-03 (Tokyo)","","","`#105332 `__","" +"`LWG4043 `__","""ASCII"" is not a registered character encoding","2024-03 (Tokyo)","|Nothing To Do|","","`#105335 `__","" +"`LWG4045 `__","``tuple`` can create dangling references from ``tuple-like``","2024-03 (Tokyo)","","","`#105337 `__","" +"`LWG4053 `__","Unary call to ``std::views::repeat`` does not decay the argument","2024-03 (Tokyo)","|Complete|","19","`#105338 `__","" +"`LWG4054 `__","Repeating a ``repeat_view`` should repeat the view","2024-03 (Tokyo)","|Complete|","19","`#105340 `__","" +"","","","","","","" +"`LWG3944 `__","Formatters converting sequences of ``char`` to sequences of ``wchar_t``","2024-06 (St. Louis)","|Complete|","21","`#105342 `__","" +"`LWG4060 `__","``submdspan`` preconditions do not forbid creating invalid pointer","2024-06 (St. Louis)","","","`#105343 `__","" +"`LWG4061 `__","Should ``std::basic_format_context`` be default-constructible/copyable/movable?","2024-06 (St. Louis)","|Complete|","19","`#105344 `__","" +"`LWG4071 `__","``reference_wrapper`` comparisons are not SFINAE-friendly","2024-06 (St. Louis)","|Complete|","19","`#105345 `__","" +"`LWG4074 `__","``compatible-joinable-ranges`` is underconstrained","2024-06 (St. Louis)","|Complete|","21","`#105346 `__","" +"`LWG4076 `__","``concat_view`` should be freestanding","2024-06 (St. Louis)","","","`#105347 `__","" +"`LWG4079 `__","Missing Preconditions in ``concat_view::iterator``\`s conversion constructor","2024-06 (St. Louis)","","","`#105348 `__","" +"`LWG4082 `__","``views::concat(r)`` is well-formed when ``r`` is an ``output_range``","2024-06 (St. Louis)","","","`#105349 `__","" +"`LWG4083 `__","``views::as_rvalue`` should reject non-input ranges","2024-06 (St. Louis)","|Complete|","22","`#105351 `__","" +"`LWG4096 `__","``views::iota(views::iota(0))`` should be rejected","2024-06 (St. Louis)","|Complete|","22","`#105352 `__","" +"`LWG4098 `__","``views::adjacent<0>`` should reject non-forward ranges","2024-06 (St. Louis)","","","`#105353 `__","" +"`LWG4105 `__","``ranges::ends_with``\`s Returns misses difference casting","2024-06 (St. Louis)","","","`#105354 `__","" +"`LWG4106 `__","``basic_format_args`` should not be default-constructible","2024-06 (St. Louis)","|Complete|","19","`#105355 `__","" +"","","","","","","" +"`LWG3216 `__","Rebinding the allocator before calling ``construct``/``destroy`` in ``allocate_shared``","2024-11 (Wrocław)","","","`#118332 `__","" +"`LWG3436 `__","``std::construct_at`` should support arrays","2024-11 (Wrocław)","","","`#118335 `__","" +"`LWG3886 `__","Monad mo' problems","2024-11 (Wrocław)","|Complete|","22","`#118336 `__","" +"`LWG3899 `__","``co_yield``\ing elements of an lvalue generator is unnecessarily inefficient","2024-11 (Wrocław)","","","`#118337 `__","" +"`LWG3900 `__","The ``allocator_arg_t`` overloads of ``generator::promise_type::operator new`` should not be constrained","2024-11 (Wrocław)","","","`#118338 `__","" +"`LWG3918 `__","``std::uninitialized_move/_n`` and guaranteed copy elision","2024-11 (Wrocław)","","","`#118339 `__","" +"`LWG4014 `__","LWG 3809 changes behavior of some existing ``std::subtract_with_carry_engine code``","2024-11 (Wrocław)","","","`#118340 `__","" +"`LWG4024 `__","Underspecified destruction of objects created in ``std::make_shared_for_overwrite``/``std::allocate_shared_for_overwrite``","2024-11 (Wrocław)","|Complete|","16","`#118341 `__","" +"`LWG4027 `__","``possibly-const-range`` should prefer returning ``const R&``","2024-11 (Wrocław)","","","`#118342 `__","" +"`LWG4044 `__","Confusing requirements for ``std::print`` on POSIX platforms","2024-11 (Wrocław)","","","`#118343 `__","" +"`LWG4064 `__","Clarify that ``std::launder`` is not needed when using the result of ``std::memcpy``","2024-11 (Wrocław)","","","`#118344 `__","" +"`LWG4072 `__","``std::optional`` comparisons: constrain harder","2024-11 (Wrocław)","","","`#118345 `__","" +"`LWG4084 `__","``std::fixed`` ignores ``std::uppercase``","2024-11 (Wrocław)","","","`#118346 `__","" +"`LWG4085 `__","``ranges::generate_random``'s helper lambda should specify the return type","2024-11 (Wrocław)","","","`#118347 `__","" +"`LWG4088 `__","``println`` ignores the locale imbued in ``std::ostream``","2024-11 (Wrocław)","|Complete|","18","`#118348 `__","" +"`LWG4112 `__","``has-arrow`` should required ``operator->()`` to be ``const``-qualified","2024-11 (Wrocław)","","","`#118349 `__","" +"`LWG4113 `__","Disallow ``has_unique_object_representations``","2024-11 (Wrocław)","|Complete|","","`#118350 `__","" +"`LWG4119 `__","``generator::promise_type::yield_value(ranges::elements_of)``'s nested ``generator`` may be ill-formed","2024-11 (Wrocław)","","","`#118351 `__","" +"`LWG4124 `__","Cannot format ``zoned_time`` with resolution coarser than ``seconds``","2024-11 (Wrocław)","","","`#118352 `__","" +"`LWG4126 `__","Some feature-test macros for fully freestanding features are not yet marked freestanding","2024-11 (Wrocław)","","","`#118353 `__","" +"`LWG4134 `__","Issue with Philox algorithm specification","2024-11 (Wrocław)","","","`#118354 `__","" +"`LWG4135 `__","The helper lambda of ``std::erase`` for list should specify return type as ``bool``","2024-11 (Wrocław)","|Complete|","21","`#118355 `__","" +"`LWG4140 `__","Useless default constructors for bit reference types","2024-11 (Wrocław)","|Complete|","","`#118356 `__","" +"`LWG4141 `__","Improve prohibitions on ""additional storage""","2024-11 (Wrocław)","","","`#118357 `__","" +"`LWG4142 `__","``format_parse_context::check_dynamic_spec`` should require at least one type","2024-11 (Wrocław)","","","`#118358 `__","" +"`LWG4144 `__","Disallow ``unique_ptr``","2024-11 (Wrocław)","","","`#118359 `__","" +"`LWG4147 `__","Precondition on ``inplace_vector::emplace``","2024-11 (Wrocław)","","","`#118361 `__","" +"`LWG4148 `__","``unique_ptr::operator*`` should not allow dangling references","2024-11 (Wrocław)","","","`#118362 `__","" +"`LWG4153 `__","Fix extra ""-1"" for ``philox_engine::max()``","2024-11 (Wrocław)","","","`#118363 `__","" +"`LWG4154 `__","The Mandates for ``std::packaged_task``'s constructor from a callable entity should consider decaying","2024-11 (Wrocław)","","","`#118364 `__","" +"`LWG4157 `__","The resolution of LWG3465 was damaged by P2167R3","2024-11 (Wrocław)","|Complete|","20","`#118365 `__","" +"`LWG4164 `__","Missing guarantees for ``forward_list`` modifiers","2024-11 (Wrocław)","|Complete|","21","`#118366 `__","" +"`LWG4169 `__","``std::atomic``'s default constructor should be constrained","2024-11 (Wrocław)","","","`#118367 `__","" +"`LWG4170 `__","``contiguous_iterator`` should require ``to_address(I{})``","2024-11 (Wrocław)","","","`#118368 `__","" +"","","","","","","" +"`LWG3578 `__","Iterator SCARYness in the context of associative container merging","2025-02 (Hagenberg)","","","`#127859 `__","" +"`LWG3956 `__","``chrono::parse`` uses ``from_stream`` as a customization point","2025-02 (Hagenberg)","","","`#127860 `__","" +"`LWG4172 `__","``unique_lock`` self-move-assignment is broken","2025-02 (Hagenberg)","","","`#127861 `__","" +"`LWG4175 `__","``get_env()`` specified in terms of ``as_const()`` but this doesn't work with rvalue senders","2025-02 (Hagenberg)","","","`#127862 `__","" +"`LWG4179 `__","Wrong range in ``[alg.search]``","2025-02 (Hagenberg)","","","`#127863 `__","" +"`LWG4186 `__","``regex_traits::transform_primary`` mistakenly detects ``typeid`` of a function","2025-02 (Hagenberg)","","","`#127864 `__","" +"`LWG4189 `__","``cache_latest_view`` should be freestanding","2025-02 (Hagenberg)","","","`#127865 `__","" +"`LWG4191 `__","P1467 changed the return type of ``pow(complex, int)``","2025-02 (Hagenberg)","","","`#127866 `__","" +"`LWG4196 `__","Complexity of ``inplace_merge()`` is incorrect","2025-02 (Hagenberg)","","","`#127867 `__","" +"","","","","","","" +"`LWG4198 `__","``schedule_from`` isn't starting the schedule sender if decay-copying results throws","2025-06 (Sofia)","","","`#148188 `__","" +"`LWG4202 `__","``enable-sender`` should be a variable template","2025-06 (Sofia)","","","`#148189 `__","" +"`LWG4203 `__","Constraints on ``get-state`` functions are incorrect","2025-06 (Sofia)","","","`#148190 `__","" +"`LWG4204 `__","specification of ``as-sndr2(Sig)`` in [exec.let] is incomplete","2025-06 (Sofia)","","","`#148192 `__","" +"`LWG4205 `__","``let_[*].transform_env`` is specified in terms of the ``let_*`` sender itself instead of its child","2025-06 (Sofia)","","","`#148193 `__","" +"`LWG4208 `__","Wording needs to ensure that in ``connect(sndr, rcvr)`` that ``rcvr`` expression is only evaluated once","2025-06 (Sofia)","","","`#148194 `__","" +"`LWG4209 `__","``default_domain::transform_env`` should be returning ``FWD-ENV(env)``","2025-06 (Sofia)","","","`#148196 `__","" +"`LWG4188 `__","``ostream::sentry`` destructor should handle exceptions","2025-06 (Sofia)","","","`#148200 `__","" +"`LWG4200 `__","The ``operation_state`` concept can be simplified","2025-06 (Sofia)","","","`#148201 `__","" +"`LWG4201 `__","``with-await-transform::await_transform`` should not use a deduced return type","2025-06 (Sofia)","","","`#148202 `__","" +"`LWG4217 `__","Clarify ``mdspan`` layout mapping requirements for ``rank == 0``","2025-06 (Sofia)","","","`#148203 `__","" +"`LWG4222 `__","``expected`` constructor from a single value missing a constraint","2025-06 (Sofia)","|Complete|","22","`#148208 `__","" +"`LWG4224 `__","Philox engines should be freestanding","2025-06 (Sofia)","","","`#148210 `__","" +"`LWG4227 `__","Missing ``noexcept`` operator in [exec.when.all]","2025-06 (Sofia)","","","`#148211 `__","" +"`LWG4231 `__","``datapar::chunk`` should use ``simd-size-type`` instead of ``size_t``","2025-06 (Sofia)","","","`#148215 `__","" +"`LWG4232 `__","``datapar::resize`` does not resize","2025-06 (Sofia)","","","`#148216 `__","" +"`LWG4233 `__","The helper lambda of ``std::erase`` for ``hive`` should specify return type as ``bool``","2025-06 (Sofia)","","","`#148217 `__","" +"`LWG4234 `__","Including ```` doesn't provide ``std::begin/end``","2025-06 (Sofia)","","","`#148218 `__","" +"`LWG4235 `__","``cache_latest_view`` and ``to_input_view`` miss ``reserve_hint``","2025-06 (Sofia)","","","`#148219 `__","" +"`LWG4236 `__","``chunk_view::outer-iterator::value_type`` should provide ``reserve_hint``","2025-06 (Sofia)","","","`#148220 `__","" +"`LWG4239 `__","``flat_map``'s transparent comparator no longer works for string literals","2025-06 (Sofia)","","","`#148223 `__","" +"`LWG4242 `__","``ranges::distance`` does not work with volatile iterators","2025-06 (Sofia)","","","`#148224 `__","" +"`LWG4245 `__","Operators that interact with ``counted_iterator`` and ``default_sentinel_t`` should be ``noexcept``","2025-06 (Sofia)","","","`#148226 `__","" +"`LWG4247 `__","Header ```` is not yet freestanding","2025-06 (Sofia)","","","`#148227 `__","" +"","","","","","","" +"`LWG3343 `__","Ordering of calls to ``unlock()`` and ``notify_all()`` in Effects element of ``notify_all_at_thread_exit()`` should be reversed","Not Adopted Yet","|Complete|","16","`#105356 `__","" +"`LWG4139 `__","§[time.zone.leap] recursive constraint in ``<=>``","Not Adopted Yet","|Complete|","20","`#118369 `__","" +"`LWG3456 `__","Pattern used by ``std::from_chars`` is underspecified (option B)","Not Adopted Yet","|Complete|","20","`#118370 `__","" +"`LWG3882 `__","``tuple`` relational operators have confused friendships","Not Adopted Yet","|Complete|","22","The comparsion operators are constrained harder than the proposed resolution. libstdc++ and MSVC STL do the same.","" +"","","","","","","" diff --git a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx2cPapers.csv b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx2cPapers.csv index e8b0c9559f..a5423acf0d 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx2cPapers.csv +++ b/naiveproxy/src/third_party/libc++/src/docs/Status/Cxx2cPapers.csv @@ -1,159 +1,159 @@ -"Paper #","Paper Name","Meeting","Status","First released version","Notes" -"`P2497R0 `__","Testing for success or failure of ```` functions","2023-06 (Varna)","|Complete|","18","" -"`P2592R3 `__","Hashing support for ``std::chrono`` value classes","2023-06 (Varna)","","","" -"`P2587R3 `__","``to_string`` or not ``to_string``","2023-06 (Varna)","","","" -"`P2562R1 `__","``constexpr`` Stable Sorting","2023-06 (Varna)","|Complete|","21","" -"`P2545R4 `__","Read-Copy Update (RCU)","2023-06 (Varna)","","","" -"`P2530R3 `__","Hazard Pointers for C++26","2023-06 (Varna)","","","" -"`P2538R1 `__","ADL-proof ``std::projected``","2023-06 (Varna)","|Complete|","18","" -"`P2495R3 `__","Interfacing ``stringstream``\s with ``string_view``","2023-06 (Varna)","|Complete|","19","" -"`P2510R3 `__","Formatting pointers","2023-06 (Varna)","|Complete|","17","Implemented as a DR against C++20. (MSVC STL and libstdc++ will do the same.)" -"`P2198R7 `__","Freestanding Feature-Test Macros and Implementation-Defined Extensions","2023-06 (Varna)","","","" -"`P2338R4 `__","Freestanding Library: Character primitives and the C library","2023-06 (Varna)","","","" -"`P2013R5 `__","Freestanding Language: Optional ``::operator new``","2023-06 (Varna)","","","" -"`P2363R5 `__","Extending associative containers with the remaining heterogeneous overloads","2023-06 (Varna)","","","" -"`P1901R2 `__","Enabling the Use of ``weak_ptr`` as Keys in Unordered Associative Containers","2023-06 (Varna)","","","" -"`P1885R12 `__","Naming Text Encodings to Demystify Them","2023-06 (Varna)","","","" -"`P0792R14 `__","``function_ref``: a type-erased callable reference","2023-06 (Varna)","","","" -"`P2874R2 `__","P2874R2: Mandating Annex D Require No More","2023-06 (Varna)","|Complete|","12","" -"`P2757R3 `__","Type-checking format args","2023-06 (Varna)","","","" -"`P2637R3 `__","Member ``visit``","2023-06 (Varna)","|Complete|","19","Change of ``__cpp_lib_variant`` is completed in LLVM 20. Change of ``__cpp_lib_format`` is blocked by `P2419R2 `__." -"`P2641R4 `__","Checking if a ``union`` alternative is active","2023-06 (Varna)","","","" -"`P1759R6 `__","Native handles and file streams","2023-06 (Varna)","|Complete|","18","" -"`P2697R1 `__","Interfacing ``bitset`` with ``string_view``","2023-06 (Varna)","|Complete|","18","" -"`P1383R2 `__","More ``constexpr`` for ```` and ````","2023-06 (Varna)","","","" -"`P2734R0 `__","Adding the new SI prefixes","2023-06 (Varna)","|Complete|","17","" -"`P2548R6 `__","``copyable_function``","2023-06 (Varna)","","","" -"`P2714R1 `__","Bind front and back to NTTP callables","2023-06 (Varna)","|Partial|","20","" -"`P2630R4 `__","``submdspan``","2023-06 (Varna)","","","" -"","","","","","" -"`P0543R3 `__","Saturation arithmetic","2023-11 (Kona)","|Complete|","18","" -"`P2407R5 `__","Freestanding Library: Partial Classes","2023-11 (Kona)","","","" -"`P2546R5 `__","Debugging Support","2023-11 (Kona)","","","" -"`P2905R2 `__","Runtime format strings","2023-11 (Kona)","|Complete|","18","" -"`P2918R2 `__","Runtime format strings II","2023-11 (Kona)","|Complete|","18","" -"`P2909R4 `__","Fix formatting of code units as integers (Dude, where’s my ``char``?)","2023-11 (Kona)","|Complete|","18","" -"`P0952R2 `__","A new specification for ``std::generate_canonical``","2023-11 (Kona)","","","" -"`P2447R6 `__","``std::span`` over an initializer list","2023-11 (Kona)","|Complete|","18","" -"`P2821R5 `__","``span.at()``","2023-11 (Kona)","|Complete|","18","" -"`P2868R3 `__","Remove Deprecated ``std::allocator`` Typedef From C++26","2023-11 (Kona)","|Complete|","18","" -"`P2870R3 `__","Remove ``basic_string::reserve()`` From C++26","2023-11 (Kona)","|Complete|","18","" -"`P2871R3 `__","Remove Deprecated Unicode Conversion Facets from C++26","2023-11 (Kona)","|Complete|","18","" -"`P2819R2 `__","Add tuple protocol to complex","2023-11 (Kona)","|Complete|","19","" -"`P2937R0 `__","Freestanding: Remove ``strtok``","2023-11 (Kona)","","","" -"`P2833R2 `__","Freestanding Library: inout expected span","2023-11 (Kona)","","","" -"`P2836R1 `__","``std::basic_const_iterator`` should follow its underlying type's convertibility","2023-11 (Kona)","","","" -"`P2264R7 `__","Make ``assert()`` macro user friendly for C and C++","2023-11 (Kona)","","","" -"`P1673R13 `__","A free function linear algebra interface based on the BLAS","2023-11 (Kona)","","","" -"","","","","","" -"`P2875R4 `__","Undeprecate ``polymorphic_allocator::destroy`` for C++26","2024-03 (Tokyo)","|Complete|","15","" -"`P2867R2 `__","Remove Deprecated ``strstreams`` From C++26","2024-03 (Tokyo)","|Complete|","19","" -"`P2869R4 `__","Remove Deprecated ``shared_ptr`` Atomic Access APIs from C++26","2024-03 (Tokyo)","","","" -"`P2872R3 `__","Remove ``wstring_convert`` From C++26","2024-03 (Tokyo)","|Complete|","19","" -"`P3107R5 `__","Permit an efficient implementation of ``std::print``","2024-03 (Tokyo)","","","" -"`P3142R0 `__","Printing Blank Lines with ``println``","2024-03 (Tokyo)","|Complete|","19","Implemented as a DR against C++23. (MSVC STL and libstdc++ will do the same.)" -"`P2845R8 `__","Formatting of ``std::filesystem::path``","2024-03 (Tokyo)","","","" -"`P0493R5 `__","Atomic minimum/maximum","2024-03 (Tokyo)","","","" -"`P2542R8 `__","``views::concat``","2024-03 (Tokyo)","","","" -"`P2591R5 `__","Concatenation of strings and string views","2024-03 (Tokyo)","|Complete|","19","" -"`P2248R8 `__","Enabling list-initialization for algorithms","2024-03 (Tokyo)","","","" -"`P2810R4 `__","``is_debugger_present`` ``is_replaceable``","2024-03 (Tokyo)","","","" -"`P1068R11 `__","Vector API for random number generation","2024-03 (Tokyo)","","","" -"`P2944R3 `__","Comparisons for ``reference_wrapper``","2024-03 (Tokyo)","|Complete|","21","" -"`P2642R6 `__","Padded ``mdspan`` layouts","2024-03 (Tokyo)","","","" -"`P3029R1 `__","Better ``mdspan``'s CTAD","2024-03 (Tokyo)","|Complete|","19","" -"","","","","","" -"`P2747R2 `__","``constexpr`` placement new","2024-06 (St. Louis)","|Complete|","20","" -"`P2997R1 `__","Removing the common reference requirement from the indirectly invocable concepts","2024-06 (St. Louis)","|Complete|","19","Implemented as a DR against C++20. (MSVC STL and libstdc++ will do the same.)" -"`P2389R2 `__","``dextents`` Index Type Parameter","2024-06 (St. Louis)","|Complete|","19","" -"`P3168R2 `__","Give ``std::optional`` Range Support","2024-06 (St. Louis)","","","" -"`P3217R0 `__","Adjoints to 'Enabling list-initialization for algorithms': find_last","2024-06 (St. Louis)","","","" -"`P2985R0 `__","A type trait for detecting virtual base classes","2024-06 (St. Louis)","|Complete|","20","" -"`P0843R14 `__","``inplace_vector``","2024-06 (St. Louis)","","","" -"`P3235R3 `__","``std::print`` more types faster with less memory","2024-06 (St. Louis)","","","" -"`P2968R2 `__","Make ``std::ignore`` a first-class object","2024-06 (St. Louis)","|Complete|","19","" -"`P2075R6 `__","Philox as an extension of the C++ RNG engines","2024-06 (St. Louis)","","","" -"`P2422R1 `__","Remove ``nodiscard`` annotations from the standard library specification","2024-06 (St. Louis)","|Complete|","19","``nodiscard`` attributes were kept as a conforming extension" -"`P2300R10 `__","``std::execution``","2024-06 (St. Louis)","","","" -"","","","","","" -"`P3136R1 `__","Retiring niebloids","2024-11 (Wrocław)","|Complete|","14","" -"`P3138R5 `__","``views::cache_latest``","2024-11 (Wrocław)","","","" -"`P3379R0 `__","Constrain ``std::expected`` equality operators","2024-11 (Wrocław)","|Complete|","21","" -"`P2862R1 `__","``text_encoding::name()`` should never return null values","2024-11 (Wrocław)","","","" -"`P2897R7 `__","``aligned_accessor``: An ``mdspan`` accessor expressing pointer over-alignment","2024-11 (Wrocław)","|Complete|","21","" -"`P3355R1 `__","Fix ``submdspan`` for C++26","2024-11 (Wrocław)","","","" -"`P3222R0 `__","Fix C++26 by adding transposed special cases for P2642 layouts","2024-11 (Wrocław)","","","" -"`P3050R2 `__","Fix C++26 by optimizing ``linalg::conjugated`` for noncomplex value types","2024-11 (Wrocław)","","","" -"`P3396R1 `__","``std::execution`` wording fixes","2024-11 (Wrocław)","","","" -"`P2835R7 `__","Expose ``std::atomic_ref``'s object address","2024-11 (Wrocław)","","","" -"`P3323R1 `__","cv-qualified types in ``atomic`` and ``atomic_ref``","2024-11 (Wrocław)","","","" -"`P3508R0 `__","Wording for ""constexpr for specialized memory algorithms""","2024-11 (Wrocław)","","","" -"`P3369R0 `__","constexpr for ``uninitialized_default_construct``","2024-11 (Wrocław)","","","" -"`P3370R1 `__","Add new library headers from C23","2024-11 (Wrocław)","","","" -"`P3309R3 `__","constexpr ``atomic`` and ``atomic_ref``","2024-11 (Wrocław)","","","" -"`P1928R15 `__","``std::simd`` — merge data-parallel types from the Parallelism TS 2","2024-11 (Wrocław)","","","" -"`P3325R5 `__","A Utility for Creating Execution Environments","2024-11 (Wrocław)","","","" -"`P3068R6 `__","Allowing exception throwing in constant-evaluation","2024-11 (Wrocław)","","","" -"`P3247R2 `__","Deprecate the notion of trivial types","2024-11 (Wrocław)","|Complete|","21","" -"","","","","","" -"`P3074R7 `__","trivial unions (was ``std::uninitialized``)","2025-02 (Hagenberg)","","","" -"`P1494R5 `__","Partial program correctness","2025-02 (Hagenberg)","","","" -"`P2900R14 `__","Contracts for C++","2025-02 (Hagenberg)","","","" -"`P3475R2 `__","Defang and deprecate ``memory_order::consume``","2025-02 (Hagenberg)","","","" -"`P2786R13 `__","Trivial Relocatability For C++26","2025-02 (Hagenberg)","","","" -"`P3137R3 `__","``views::to_input``","2025-02 (Hagenberg)","","","" -"`P0472R3 `__","Put ``std::monostate`` in ````","2025-02 (Hagenberg)","|Complete|","21","" -"`P3349R1 `__","Converting contiguous iterators to pointers","2025-02 (Hagenberg)","","","" -"`P3372R3 `__","constexpr containers and adaptors","2025-02 (Hagenberg)","|In Progress|","","" -"`P3378R2 `__","constexpr exception types","2025-02 (Hagenberg)","","","" -"`P3441R2 `__","Rename ``simd_split`` to ``simd_chunk``","2025-02 (Hagenberg)","","","" -"`P3287R3 `__","Exploration of namespaces for ``std::simd``","2025-02 (Hagenberg)","","","" -"`P2976R1 `__","Freestanding Library: ``algorithm``, ``numeric``, and ``random``","2025-02 (Hagenberg)","","","" -"`P3430R3 `__","simd issues: explicit, unsequenced, identity-element position, and members of disabled simd","2025-02 (Hagenberg)","","","" -"`P2663R7 `__","Interleaved complex values support in ``std::simd``","2025-02 (Hagenberg)","","","" -"`P2933R4 `__","Extend ```` header function with overloads for ``std::simd``","2025-02 (Hagenberg)","","","" -"`P2846R6 `__","``reserve_hint``: Eagerly reserving memory for not-quite-sized lazy ranges","2025-02 (Hagenberg)","","","" -"`P3471R4 `__","Standard Library Hardening","2025-02 (Hagenberg)","","","" -"`P0447R28 `__","Introduction of ``std::hive`` to the standard library","2025-02 (Hagenberg)","","","" -"`P3019R14 `__","``indirect`` and ``polymorphic``: Vocabulary Types for Composite Class Design","2025-02 (Hagenberg)","","","" -"","","","","","" -"`P2996R13 `__","Reflection for C++26","2025-06 (Sofia)","","","" -"`P3394R4 `__","Annotations for Reflection","2025-06 (Sofia)","","","" -"`P3293R3 `__","Splicing a base class subobject","2025-06 (Sofia)","","","" -"`P3491R3 `__","``define_static_{string,object,array}``","2025-06 (Sofia)","","","" -"`P3096R12 `__","Function Parameter Reflection in Reflection for C++26","2025-06 (Sofia)","","","" -"`P2988R12 `__","``std::optional``","2025-06 (Sofia)","","","" -"`P3348R4 `__","C++26 should refer to C23 not C17","2025-06 (Sofia)","","","" -"`P3037R6 `__","``constexpr`` ``std::shared_ptr`` and friends","2025-06 (Sofia)","","","" -"`P3284R4 `__","``write_env`` and ``unstoppable`` Sender Adaptors","2025-06 (Sofia)","","","" -"`P3179R9 `__","Parallel Range Algorithms","2025-06 (Sofia)","","","" -"`P3709R2 `__","Reconsider parallel ``ranges::rotate_copy`` and ``ranges::reverse_copy``","2025-06 (Sofia)","","","" -"`P3641R0 `__","Rename ``std::observable`` to ``std::observable_checkpoint``, and add a feature-test macro","2025-06 (Sofia)","","","" -"`P3044R2 `__","sub-``string_view`` from ``string``","2025-06 (Sofia)","","","" -"`P2876R3 `__","Proposal to extend ``std::simd`` with more constructors and accessors","2025-06 (Sofia)","","","" -"`P3480R6 `__","``std::simd`` is a range","2025-06 (Sofia)","","","" -"`P2664R11 `__","Extend ``std::simd`` with permutation API","2025-06 (Sofia)","","","" -"`P3691R1 `__","Reconsider naming of the namespace for ``std::simd``","2025-06 (Sofia)","","","" -"`P3383R3 `__","``mdspan.at()``","2025-06 (Sofia)","","","" -"`P2927R3 `__","Inspecting ``exception_ptr``","2025-06 (Sofia)","","","" -"`P3748R0 `__","Inspecting ``exception_ptr`` should be constexpr","2025-06 (Sofia)","","","" -"`P2830R10 `__","Standardized Constexpr Type Ordering","2025-06 (Sofia)","","","" -"`P3570R2 `__","optional variants in sender/receiver","2025-06 (Sofia)","","","" -"`P3481R5 `__","``std::execution::bulk()`` issues","2025-06 (Sofia)","","","" -"`P3433R1 `__","Allocator Support for Operation States","2025-06 (Sofia)","","","" -"`P3149R11 `__","``async_scope`` - Creating scopes for non-sequential concurrency","2025-06 (Sofia)","","","" -"`P3682R0 `__","Remove ``std::execution::split``","2025-06 (Sofia)","","","" -"`P2079R10 `__","Parallel scheduler","2025-06 (Sofia)","","","" -"`P3557R3 `__","High-Quality Sender Diagnostics with Constexpr Exceptions","2025-06 (Sofia)","","","" -"`P3560R2 `__","Error Handling in Reflection","2025-06 (Sofia)","","","" -"`P3503R3 `__","Make type-erased allocator use in ``promise`` and ``packaged_task`` consistent","2025-06 (Sofia)","","","" -"`P3008R6 `__","Atomic floating-point min/max","2025-06 (Sofia)","","","" -"`P3111R8 `__","Atomic Reduction Operations","2025-06 (Sofia)","","","" -"`P3060R3 `__","Add ``std::views::indices(n)``","2025-06 (Sofia)","","","" -"`P2319R5 `__","Prevent ``path`` presentation problems","2025-06 (Sofia)","","","" -"`P3223R2 `__","Making ``std::istream::ignore`` less surprising","2025-06 (Sofia)","","","" -"`P2781R9 `__","``std::constant_wrapper``","2025-06 (Sofia)","","","" -"`P3697R1 `__","Minor additions to C++26 standard library hardening","2025-06 (Sofia)","","","" -"`P3552R3 `__","Add a Coroutine Task Type","2025-06 (Sofia)","","","" -"`P1317R2 `__","Remove return type deduction in ``std::apply``","2025-06 (Sofia)","","","" -"","","","","","" +"Paper #","Paper Name","Meeting","Status","First released version","GitHub issue","Notes" +"`P2497R0 `__","Testing for success or failure of ```` functions","2023-06 (Varna)","|Complete|","18","`#105357 `__","" +"`P2592R3 `__","Hashing support for ``std::chrono`` value classes","2023-06 (Varna)","","","`#105358 `__","" +"`P2587R3 `__","``to_string`` or not ``to_string``","2023-06 (Varna)","","","`#105359 `__","" +"`P2562R1 `__","``constexpr`` Stable Sorting","2023-06 (Varna)","|Complete|","21","`#105360 `__","" +"`P2545R4 `__","Read-Copy Update (RCU)","2023-06 (Varna)","","","`#105361 `__","" +"`P2530R3 `__","Hazard Pointers for C++26","2023-06 (Varna)","","","`#105362 `__","" +"`P2538R1 `__","ADL-proof ``std::projected``","2023-06 (Varna)","|Complete|","18","`#105363 `__","" +"`P2495R3 `__","Interfacing ``stringstream``\s with ``string_view``","2023-06 (Varna)","|Complete|","19","`#105364 `__","" +"`P2510R3 `__","Formatting pointers","2023-06 (Varna)","|Complete|","17","`#105365 `__","Implemented as a DR against C++20. (MSVC STL and libstdc++ will do the same.)" +"`P2198R7 `__","Freestanding Feature-Test Macros and Implementation-Defined Extensions","2023-06 (Varna)","","","`#105368 `__","" +"`P2338R4 `__","Freestanding Library: Character primitives and the C library","2023-06 (Varna)","","","`#105369 `__","" +"`P2013R5 `__","Freestanding Language: Optional ``::operator new``","2023-06 (Varna)","","","`#105370 `__","" +"`P2363R5 `__","Extending associative containers with the remaining heterogeneous overloads","2023-06 (Varna)","","","`#105371 `__","" +"`P1901R2 `__","Enabling the Use of ``weak_ptr`` as Keys in Unordered Associative Containers","2023-06 (Varna)","","","`#105372 `__","" +"`P1885R12 `__","Naming Text Encodings to Demystify Them","2023-06 (Varna)","","","`#105373 `__","" +"`P0792R14 `__","``function_ref``: a type-erased callable reference","2023-06 (Varna)","","","`#105376 `__","" +"`P2874R2 `__","P2874R2: Mandating Annex D Require No More","2023-06 (Varna)","|Complete|","12","`#105377 `__","" +"`P2757R3 `__","Type-checking format args","2023-06 (Varna)","","","`#105378 `__","" +"`P2637R3 `__","Member ``visit``","2023-06 (Varna)","|Complete|","19","`#105380 `__","Change of ``__cpp_lib_variant`` is completed in LLVM 20. Change of ``__cpp_lib_format`` is blocked by `P2419R2 `__." +"`P2641R4 `__","Checking if a ``union`` alternative is active","2023-06 (Varna)","","","`#105381 `__","" +"`P1759R6 `__","Native handles and file streams","2023-06 (Varna)","|Complete|","18","`#105382 `__","" +"`P2697R1 `__","Interfacing ``bitset`` with ``string_view``","2023-06 (Varna)","|Complete|","18","`#105384 `__","" +"`P1383R2 `__","More ``constexpr`` for ```` and ````","2023-06 (Varna)","","","`#105385 `__","" +"`P2734R0 `__","Adding the new SI prefixes","2023-06 (Varna)","|Complete|","17","`#105386 `__","" +"`P2548R6 `__","``copyable_function``","2023-06 (Varna)","","","`#105387 `__","" +"`P2714R1 `__","Bind front and back to NTTP callables","2023-06 (Varna)","|Partial|","20","`#105388 `__","" +"`P2630R4 `__","``submdspan``","2023-06 (Varna)","","","`#105389 `__","" +"","","","","","","" +"`P0543R3 `__","Saturation arithmetic","2023-11 (Kona)","|Complete|","18","`#105390 `__","" +"`P2407R5 `__","Freestanding Library: Partial Classes","2023-11 (Kona)","","","`#105391 `__","" +"`P2546R5 `__","Debugging Support","2023-11 (Kona)","","","`#105392 `__","" +"`P2905R2 `__","Runtime format strings","2023-11 (Kona)","|Complete|","18","`#105393 `__","" +"`P2918R2 `__","Runtime format strings II","2023-11 (Kona)","|Complete|","18","`#105394 `__","" +"`P2909R4 `__","Fix formatting of code units as integers (Dude, where’s my ``char``?)","2023-11 (Kona)","|Complete|","18","`#105395 `__","" +"`P0952R2 `__","A new specification for ``std::generate_canonical``","2023-11 (Kona)","","","`#105396 `__","" +"`P2447R6 `__","``std::span`` over an initializer list","2023-11 (Kona)","|Complete|","18","`#105397 `__","" +"`P2821R5 `__","``span.at()``","2023-11 (Kona)","|Complete|","18","`#105399 `__","" +"`P2868R3 `__","Remove Deprecated ``std::allocator`` Typedef From C++26","2023-11 (Kona)","|Complete|","18","`#105400 `__","" +"`P2870R3 `__","Remove ``basic_string::reserve()`` From C++26","2023-11 (Kona)","|Complete|","18","`#105401 `__","" +"`P2871R3 `__","Remove Deprecated Unicode Conversion Facets from C++26","2023-11 (Kona)","|Complete|","18","`#105402 `__","" +"`P2819R2 `__","Add tuple protocol to complex","2023-11 (Kona)","|Complete|","19","`#105403 `__","" +"`P2937R0 `__","Freestanding: Remove ``strtok``","2023-11 (Kona)","","","`#105404 `__","" +"`P2833R2 `__","Freestanding Library: inout expected span","2023-11 (Kona)","","","`#105405 `__","" +"`P2836R1 `__","``std::basic_const_iterator`` should follow its underlying type's convertibility","2023-11 (Kona)","","","`#105406 `__","" +"`P2264R7 `__","Make ``assert()`` macro user friendly for C and C++","2023-11 (Kona)","","","`#105407 `__","" +"`P1673R13 `__","A free function linear algebra interface based on the BLAS","2023-11 (Kona)","","","`#105408 `__","" +"","","","","","","" +"`P2875R4 `__","Undeprecate ``polymorphic_allocator::destroy`` for C++26","2024-03 (Tokyo)","|Complete|","15","`#105410 `__","" +"`P2867R2 `__","Remove Deprecated ``strstreams`` From C++26","2024-03 (Tokyo)","|Complete|","19","`#105411 `__","" +"`P2869R4 `__","Remove Deprecated ``shared_ptr`` Atomic Access APIs from C++26","2024-03 (Tokyo)","","","`#105412 `__","" +"`P2872R3 `__","Remove ``wstring_convert`` From C++26","2024-03 (Tokyo)","|Complete|","19","`#105413 `__","" +"`P3107R5 `__","Permit an efficient implementation of ``std::print``","2024-03 (Tokyo)","","","`#105414 `__","" +"`P3142R0 `__","Printing Blank Lines with ``println``","2024-03 (Tokyo)","|Complete|","19","`#105415 `__","Implemented as a DR against C++23. (MSVC STL and libstdc++ will do the same.)" +"`P2845R8 `__","Formatting of ``std::filesystem::path``","2024-03 (Tokyo)","","","`#105416 `__","" +"`P0493R5 `__","Atomic minimum/maximum","2024-03 (Tokyo)","","","`#105418 `__","" +"`P2542R8 `__","``views::concat``","2024-03 (Tokyo)","","","`#105419 `__","" +"`P2591R5 `__","Concatenation of strings and string views","2024-03 (Tokyo)","|Complete|","19","`#105420 `__","" +"`P2248R8 `__","Enabling list-initialization for algorithms","2024-03 (Tokyo)","","","`#105421 `__","" +"`P2810R4 `__","``is_debugger_present`` ``is_replaceable``","2024-03 (Tokyo)","","","`#105422 `__","" +"`P1068R11 `__","Vector API for random number generation","2024-03 (Tokyo)","","","`#105423 `__","" +"`P2944R3 `__","Comparisons for ``reference_wrapper``","2024-03 (Tokyo)","|Complete|","22","`#105424 `__","The changes to ``tuple``'s equality overload from P2165R4 are not yet implemented." +"`P2642R6 `__","Padded ``mdspan`` layouts","2024-03 (Tokyo)","","","`#105425 `__","" +"`P3029R1 `__","Better ``mdspan``'s CTAD","2024-03 (Tokyo)","|Complete|","19","`#105426 `__","" +"","","","","","","" +"`P2747R2 `__","``constexpr`` placement new","2024-06 (St. Louis)","|Complete|","20","`#105427 `__","" +"`P2997R1 `__","Removing the common reference requirement from the indirectly invocable concepts","2024-06 (St. Louis)","|Complete|","19","`#105428 `__","Implemented as a DR against C++20. (MSVC STL and libstdc++ will do the same.)" +"`P2389R2 `__","``dextents`` Index Type Parameter","2024-06 (St. Louis)","|Complete|","19","`#105429 `__","" +"`P3168R2 `__","Give ``std::optional`` Range Support","2024-06 (St. Louis)","|Complete|","22","`#105430 `__","" +"`P3217R0 `__","Adjoints to 'Enabling list-initialization for algorithms': find_last","2024-06 (St. Louis)","","","`#105431 `__","" +"`P2985R0 `__","A type trait for detecting virtual base classes","2024-06 (St. Louis)","|Complete|","20","`#105432 `__","" +"`P0843R14 `__","``inplace_vector``","2024-06 (St. Louis)","","","`#105433 `__","" +"`P3235R3 `__","``std::print`` more types faster with less memory","2024-06 (St. Louis)","","","`#105435 `__","" +"`P2968R2 `__","Make ``std::ignore`` a first-class object","2024-06 (St. Louis)","|Complete|","19","`#105436 `__","" +"`P2075R6 `__","Philox as an extension of the C++ RNG engines","2024-06 (St. Louis)","","","`#105437 `__","" +"`P2422R1 `__","Remove ``nodiscard`` annotations from the standard library specification","2024-06 (St. Louis)","|Complete|","19","`#105438 `__","``nodiscard`` attributes were kept as a conforming extension" +"`P2300R10 `__","``std::execution``","2024-06 (St. Louis)","","","`#105440 `__","" +"","","","","","","" +"`P3136R1 `__","Retiring niebloids","2024-11 (Wrocław)","|Complete|","14","`#118133 `__","" +"`P3138R5 `__","``views::cache_latest``","2024-11 (Wrocław)","","","`#118134 `__","" +"`P3379R0 `__","Constrain ``std::expected`` equality operators","2024-11 (Wrocław)","|Complete|","21","`#118135 `__","" +"`P2862R1 `__","``text_encoding::name()`` should never return null values","2024-11 (Wrocław)","","","`#118371 `__","" +"`P2897R7 `__","``aligned_accessor``: An ``mdspan`` accessor expressing pointer over-alignment","2024-11 (Wrocław)","|Complete|","21","`#118372 `__","" +"`P3355R1 `__","Fix ``submdspan`` for C++26","2024-11 (Wrocław)","","","`#118373 `__","" +"`P3222R0 `__","Fix C++26 by adding transposed special cases for P2642 layouts","2024-11 (Wrocław)","","","`#118374 `__","" +"`P3050R2 `__","Fix C++26 by optimizing ``linalg::conjugated`` for noncomplex value types","2024-11 (Wrocław)","","","`#118375 `__","" +"`P3396R1 `__","``std::execution`` wording fixes","2024-11 (Wrocław)","","","`#118376 `__","" +"`P2835R7 `__","Expose ``std::atomic_ref``'s object address","2024-11 (Wrocław)","|Complete|","22","`#118377 `__","" +"`P3323R1 `__","cv-qualified types in ``atomic`` and ``atomic_ref``","2024-11 (Wrocław)","","","`#118378 `__","" +"`P3508R0 `__","Wording for ""constexpr for specialized memory algorithms""","2024-11 (Wrocław)","","","`#118379 `__","" +"`P3369R0 `__","constexpr for ``uninitialized_default_construct``","2024-11 (Wrocław)","","","`#118380 `__","" +"`P3370R1 `__","Add new library headers from C23","2024-11 (Wrocław)","","","`#118381 `__","" +"`P3309R3 `__","constexpr ``atomic`` and ``atomic_ref``","2024-11 (Wrocław)","","","`#118382 `__","" +"`P1928R15 `__","``std::simd`` — merge data-parallel types from the Parallelism TS 2","2024-11 (Wrocław)","","","`#118384 `__","" +"`P3325R5 `__","A Utility for Creating Execution Environments","2024-11 (Wrocław)","","","`#118385 `__","" +"`P3068R6 `__","Allowing exception throwing in constant-evaluation","2024-11 (Wrocław)","","","`#118386 `__","" +"`P3247R2 `__","Deprecate the notion of trivial types","2024-11 (Wrocław)","|Complete|","21","`#118387 `__","" +"","","","","","","" +"`P3074R7 `__","trivial unions (was ``std::uninitialized``)","2025-02 (Hagenberg)","","","`#127868 `__","" +"`P1494R5 `__","Partial program correctness","2025-02 (Hagenberg)","","","`#127869 `__","" +"`P2900R14 `__","Contracts for C++","2025-02 (Hagenberg)","","","`#127870 `__","" +"`P3475R2 `__","Defang and deprecate ``memory_order::consume``","2025-02 (Hagenberg)","","","`#127871 `__","" +"`P2786R13 `__","Trivial Relocatability For C++26","2025-02 (Hagenberg)","","","`#127872 `__","" +"`P3137R3 `__","``views::to_input``","2025-02 (Hagenberg)","","","`#127873 `__","" +"`P0472R3 `__","Put ``std::monostate`` in ````","2025-02 (Hagenberg)","|Complete|","21","`#127874 `__","" +"`P3349R1 `__","Converting contiguous iterators to pointers","2025-02 (Hagenberg)","","","`#127875 `__","" +"`P3372R3 `__","constexpr containers and adaptors","2025-02 (Hagenberg)","|In Progress|","","`#127876 `__","" +"`P3378R2 `__","constexpr exception types","2025-02 (Hagenberg)","","","`#127877 `__","" +"`P3441R2 `__","Rename ``simd_split`` to ``simd_chunk``","2025-02 (Hagenberg)","","","`#127878 `__","" +"`P3287R3 `__","Exploration of namespaces for ``std::simd``","2025-02 (Hagenberg)","","","`#127879 `__","" +"`P2976R1 `__","Freestanding Library: ``algorithm``, ``numeric``, and ``random``","2025-02 (Hagenberg)","","","`#127880 `__","" +"`P3430R3 `__","simd issues: explicit, unsequenced, identity-element position, and members of disabled simd","2025-02 (Hagenberg)","","","`#127881 `__","" +"`P2663R7 `__","Interleaved complex values support in ``std::simd``","2025-02 (Hagenberg)","","","`#127882 `__","" +"`P2933R4 `__","Extend ```` header function with overloads for ``std::simd``","2025-02 (Hagenberg)","","","`#127883 `__","" +"`P2846R6 `__","``reserve_hint``: Eagerly reserving memory for not-quite-sized lazy ranges","2025-02 (Hagenberg)","","","`#127884 `__","" +"`P3471R4 `__","Standard Library Hardening","2025-02 (Hagenberg)","","","`#127885 `__","" +"`P0447R28 `__","Introduction of ``std::hive`` to the standard library","2025-02 (Hagenberg)","","","`#127886 `__","" +"`P3019R14 `__","``indirect`` and ``polymorphic``: Vocabulary Types for Composite Class Design","2025-02 (Hagenberg)","","","`#127887 `__","" +"","","","","","","" +"`P2996R13 `__","Reflection for C++26","2025-06 (Sofia)","","","`#148123 `__","" +"`P3394R4 `__","Annotations for Reflection","2025-06 (Sofia)","","","`#148124 `__","" +"`P3293R3 `__","Splicing a base class subobject","2025-06 (Sofia)","","","`#148125 `__","" +"`P3491R3 `__","``define_static_{string,object,array}``","2025-06 (Sofia)","","","`#148126 `__","" +"`P3096R12 `__","Function Parameter Reflection in Reflection for C++26","2025-06 (Sofia)","","","`#148127 `__","" +"`P2988R12 `__","``std::optional``","2025-06 (Sofia)","","","`#148131 `__","" +"`P3348R4 `__","C++26 should refer to C23 not C17","2025-06 (Sofia)","","","`#148133 `__","" +"`P3037R6 `__","``constexpr`` ``std::shared_ptr`` and friends","2025-06 (Sofia)","","","`#148135 `__","" +"`P3284R4 `__","``write_env`` and ``unstoppable`` Sender Adaptors","2025-06 (Sofia)","","","`#148136 `__","" +"`P3179R9 `__","Parallel Range Algorithms","2025-06 (Sofia)","","","`#148137 `__","" +"`P3709R2 `__","Reconsider parallel ``ranges::rotate_copy`` and ``ranges::reverse_copy``","2025-06 (Sofia)","","","`#148138 `__","" +"`P3641R0 `__","Rename ``std::observable`` to ``std::observable_checkpoint``, and add a feature-test macro","2025-06 (Sofia)","","","`#148139 `__","" +"`P3044R2 `__","sub-``string_view`` from ``string``","2025-06 (Sofia)","|Complete|","22","`#148140 `__","" +"`P2876R3 `__","Proposal to extend ``std::simd`` with more constructors and accessors","2025-06 (Sofia)","","","`#148143 `__","" +"`P3480R6 `__","``std::simd`` is a range","2025-06 (Sofia)","","","`#148144 `__","" +"`P2664R11 `__","Extend ``std::simd`` with permutation API","2025-06 (Sofia)","","","`#148145 `__","" +"`P3691R1 `__","Reconsider naming of the namespace for ``std::simd``","2025-06 (Sofia)","","","`#148148 `__","" +"`P3383R3 `__","``mdspan.at()``","2025-06 (Sofia)","","","`#148149 `__","" +"`P2927R3 `__","Inspecting ``exception_ptr``","2025-06 (Sofia)","","","`#148150 `__","" +"`P3748R0 `__","Inspecting ``exception_ptr`` should be constexpr","2025-06 (Sofia)","","","`#148151 `__","" +"`P2830R10 `__","Standardized Constexpr Type Ordering","2025-06 (Sofia)","","","`#148152 `__","" +"`P3570R2 `__","optional variants in sender/receiver","2025-06 (Sofia)","","","`#148153 `__","" +"`P3481R5 `__","``std::execution::bulk()`` issues","2025-06 (Sofia)","","","`#148155 `__","" +"`P3433R1 `__","Allocator Support for Operation States","2025-06 (Sofia)","","","`#148157 `__","" +"`P3149R11 `__","``async_scope`` - Creating scopes for non-sequential concurrency","2025-06 (Sofia)","","","`#148158 `__","" +"`P3682R0 `__","Remove ``std::execution::split``","2025-06 (Sofia)","","","`#148160 `__","" +"`P2079R10 `__","Parallel scheduler","2025-06 (Sofia)","","","`#148161 `__","" +"`P3557R3 `__","High-Quality Sender Diagnostics with Constexpr Exceptions","2025-06 (Sofia)","","","`#148162 `__","" +"`P3560R2 `__","Error Handling in Reflection","2025-06 (Sofia)","","","`#148128 `__","" +"`P3503R3 `__","Make type-erased allocator use in ``promise`` and ``packaged_task`` consistent","2025-06 (Sofia)","","","`#148164 `__","" +"`P3008R6 `__","Atomic floating-point min/max","2025-06 (Sofia)","","","`#148168 `__","" +"`P3111R8 `__","Atomic Reduction Operations","2025-06 (Sofia)","","","`#148174 `__","" +"`P3060R3 `__","Add ``std::views::indices(n)``","2025-06 (Sofia)","|Complete|","22","`#148175 `__","" +"`P2319R5 `__","Prevent ``path`` presentation problems","2025-06 (Sofia)","","","`#148177 `__","" +"`P3223R2 `__","Making ``std::istream::ignore`` less surprising","2025-06 (Sofia)","|Complete|","22","`#148178 `__","" +"`P2781R9 `__","``std::constant_wrapper``","2025-06 (Sofia)","","","`#148179 `__","" +"`P3697R1 `__","Minor additions to C++26 standard library hardening","2025-06 (Sofia)","","","`#148180 `__","" +"`P3552R3 `__","Add a Coroutine Task Type","2025-06 (Sofia)","","","`#148182 `__","" +"`P1317R2 `__","Remove return type deduction in ``std::apply``","2025-06 (Sofia)","","","`#148183 `__","" +"","","","","","","" diff --git a/naiveproxy/src/third_party/libc++/src/docs/TestingLibcxx.rst b/naiveproxy/src/third_party/libc++/src/docs/TestingLibcxx.rst index 56cf4aca23..dbe69484ab 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/TestingLibcxx.rst +++ b/naiveproxy/src/third_party/libc++/src/docs/TestingLibcxx.rst @@ -419,10 +419,10 @@ writing tests easier. See `libc++-specific Lit Directives`_ for more information - ``// FILE_DEPENDENCIES: file, directory, /path/to/file, ...`` - The paths given to the ``FILE_DEPENDENCIES`` directive can specify directories or specific files upon which a given test depend. For example, a test that requires some test input stored in a data file would use this libc++-specific Lit directive. When a test file contains the ``FILE_DEPENDENCIES`` directive, Lit will collect the named files and copy - them to the directory represented by the ``%T`` substitution before the test executes. The copy is performed from the directory represented by the ``%S`` substitution + them to the directory represented by the ``%{temp}`` substitution before the test executes. The copy is performed from the directory represented by the ``%S`` substitution (i.e. the source directory of the test being executed) which makes it possible to use relative paths to specify the location of dependency files. After Lit copies - all the dependent files to the directory specified by the ``%T`` substitution, that directory should contain *all* the necessary inputs to run. In other words, - it should be possible to copy the contents of the directory specified by the ``%T`` substitution to a remote host where the execution of the test will actually occur. + all the dependent files to the directory specified by the ``%{temp}`` substitution, that directory should contain *all* the necessary inputs to run. In other words, + it should be possible to copy the contents of the directory specified by the ``%{temp}`` substitution to a remote host where the execution of the test will actually occur. * - ``ADDITIONAL_COMPILE_FLAGS`` - ``// ADDITIONAL_COMPILE_FLAGS: flag1 flag2 ...`` - The additional compiler flags specified by a space-separated list to the ``ADDITIONAL_COMPILE_FLAGS`` libc++-specific Lit directive will be added to the end of the ``%{compile_flags}`` @@ -471,7 +471,7 @@ removed from the Standard. These tests should be written like: Benchmarks ========== -Libc++'s test suite also contains benchmarks. The benchmarks are written using the `Google Benchmark`_ +Libc++'s test suite also contains benchmarks. Many benchmarks are written using the `Google Benchmark`_ library, a copy of which is stored in the LLVM monorepo. For more information about using the Google Benchmark library, see the `official documentation `_. @@ -482,7 +482,7 @@ when running the benchmarks. For example, .. code-block:: bash - $ libcxx/utils/libcxx-lit libcxx/test/benchmarks/string.bench.cpp --show-all --param optimization=speed + $ libcxx/utils/libcxx-lit libcxx/test/benchmarks/containers/string.bench.cpp --show-all --param optimization=speed Note that benchmarks are only dry-run when run via the ``check-cxx`` target since we only want to make sure they don't rot. Do not rely on the results of benchmarks @@ -490,27 +490,56 @@ run through ``check-cxx`` for anything, instead run the benchmarks manually usin the instructions for running individual tests. If you want to compare the results of different benchmark runs, we recommend using the -``libcxx-compare-benchmarks`` helper tool. First, configure CMake in a build directory -and run the benchmark: +``compare-benchmarks`` helper tool. Note that the script has some dependencies, which can +be installed with: .. code-block:: bash - $ cmake -S runtimes -B [...] - $ libcxx/utils/libcxx-lit libcxx/test/benchmarks/string.bench.cpp --param optimization=speed + $ python -m venv .venv && source .venv/bin/activate # Optional but recommended + $ pip install -r libcxx/utils/requirements.txt -Then, do the same for the second configuration you want to test. Use a different build -directory for that configuration: +Once that's done, start by configuring CMake in a build directory and running one or +more benchmarks, as usual: .. code-block:: bash - $ cmake -S runtimes -B [...] - $ libcxx/utils/libcxx-lit libcxx/test/benchmarks/string.bench.cpp --param optimization=speed + $ cmake -S runtimes -B [...] + $ libcxx/utils/libcxx-lit libcxx/test/benchmarks/containers/string.bench.cpp --param optimization=speed -Finally, use ``libcxx-compare-benchmarks`` to compare both: +Then, get the consolidated benchmark output for that run using ``consolidate-benchmarks``: .. code-block:: bash - $ libcxx/utils/libcxx-compare-benchmarks libcxx/test/benchmarks/string.bench.cpp + $ libcxx/utils/consolidate-benchmarks > baseline.lnt + +The ``baseline.lnt`` file will contain a consolidation of all the benchmark results present in the build +directory. You can then make the desired modifications to the code, run the benchmark(s) again, and then run: + +.. code-block:: bash + + $ libcxx/utils/consolidate-benchmarks > candidate.lnt + +Finally, use ``compare-benchmarks`` to compare both: + +.. code-block:: bash + + $ libcxx/utils/compare-benchmarks baseline.lnt candidate.lnt + + # Useful one-liner when iterating locally: + $ libcxx/utils/compare-benchmarks baseline.lnt <(libcxx/utils/consolidate-benchmarks ) + +The ``compare-benchmarks`` script provides some useful options like creating a chart to easily visualize +differences in a browser window. Use ``compare-benchmarks --help`` for details. + +Additionally, adding a comment of the following form to a libc++ PR will cause the specified benchmarks to be run +on our pre-commit CI infrastructure and the results to be reported in the PR by our CI system: + +.. code-block:: + + /libcxx-bot benchmark ... + +Note that this is currently experimental and the results should not be relied upon too strongly, since +we do not have dedicated hardware to run the benchmarks on. .. _`Google Benchmark`: https://github.com/google/benchmark diff --git a/naiveproxy/src/third_party/libc++/src/docs/VendorDocumentation.rst b/naiveproxy/src/third_party/libc++/src/docs/VendorDocumentation.rst index aede8f9a81..7eba598909 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/VendorDocumentation.rst +++ b/naiveproxy/src/third_party/libc++/src/docs/VendorDocumentation.rst @@ -443,7 +443,7 @@ e.g. the ``mingw-w64-x86_64-clang`` package), together with CMake and ninja. -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ \ -DLLVM_ENABLE_LLD=ON \ - -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ + -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \ -DLIBCXXABI_ENABLE_SHARED=OFF \ -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON > ninja -C build cxx diff --git a/naiveproxy/src/third_party/libc++/src/docs/index.rst b/naiveproxy/src/third_party/libc++/src/docs/index.rst index a44c316153..495ccceb31 100644 --- a/naiveproxy/src/third_party/libc++/src/docs/index.rst +++ b/naiveproxy/src/third_party/libc++/src/docs/index.rst @@ -133,7 +133,7 @@ velocity, libc++ drops support for older compilers as newer ones are released. Compiler Versions Restrictions Support policy ============ =================== ========================== ===================== Clang 19, 20, 21-git latest two stable releases per `LLVM's release page `_ and the development version -AppleClang 16.4 latest stable release per `Xcode's release page `_ +AppleClang 26.0 latest stable release per `Xcode's release page `_ Open XL 17.1.3 (AIX) latest stable release per `Open XL's documentation page `_ GCC 15 In C++11 or later only latest stable release per `GCC's release page `_ ============ =================== ========================== ===================== @@ -147,7 +147,7 @@ macOS 10.13+ i386, x86_64, arm64 FreeBSD 12+ i386, x86_64, arm Linux i386, x86_64, arm, arm64 Only glibc-2.24 and later and no other libc is officially supported Android 5.0+ i386, x86_64, arm, arm64 -Windows i386, x86_64 Both MSVC and MinGW style environments, ABI in MSVC environments is :doc:`unstable ` +Windows i386, x86_64, arm64 Both MSVC and MinGW style environments, ABI in MSVC environments is :doc:`unstable ` AIX 7.2TL5+ powerpc, powerpc64 Embedded (picolibc) arm ===================== ========================= ============================ diff --git a/naiveproxy/src/third_party/libc++/src/include/CMakeLists.txt b/naiveproxy/src/third_party/libc++/src/include/CMakeLists.txt index 51444ec668..37259a7e6e 100644 --- a/naiveproxy/src/third_party/libc++/src/include/CMakeLists.txt +++ b/naiveproxy/src/third_party/libc++/src/include/CMakeLists.txt @@ -216,6 +216,7 @@ set(files __atomic/check_memory_order.h __atomic/contention_t.h __atomic/fence.h + __atomic/floating_point_helper.h __atomic/is_always_lock_free.h __atomic/kill_dependency.h __atomic/memory_order.h @@ -447,14 +448,12 @@ set(files __fwd/get.h __fwd/ios.h __fwd/istream.h - __fwd/map.h __fwd/mdspan.h __fwd/memory.h __fwd/memory_resource.h __fwd/ostream.h __fwd/pair.h __fwd/queue.h - __fwd/set.h __fwd/span.h __fwd/sstream.h __fwd/stack.h @@ -780,11 +779,9 @@ set(files __tree __tuple/find_index.h __tuple/ignore.h - __tuple/make_tuple_types.h __tuple/sfinae_helpers.h __tuple/tuple_element.h __tuple/tuple_like.h - __tuple/tuple_like_ext.h __tuple/tuple_like_no_subrange.h __tuple/tuple_size.h __tuple/tuple_types.h @@ -794,7 +791,6 @@ set(files __type_traits/aligned_storage.h __type_traits/aligned_union.h __type_traits/alignment_of.h - __type_traits/can_extract_key.h __type_traits/common_reference.h __type_traits/common_type.h __type_traits/conditional.h @@ -842,6 +838,7 @@ set(files __type_traits/is_floating_point.h __type_traits/is_function.h __type_traits/is_fundamental.h + __type_traits/is_generic_transparent_comparator.h __type_traits/is_implicit_lifetime.h __type_traits/is_implicitly_default_constructible.h __type_traits/is_integral.h @@ -875,6 +872,7 @@ set(files __type_traits/is_trivially_relocatable.h __type_traits/is_unbounded_array.h __type_traits/is_union.h + __type_traits/is_unqualified.h __type_traits/is_unsigned.h __type_traits/is_valid_expansion.h __type_traits/is_void.h @@ -883,6 +881,7 @@ set(files __type_traits/make_32_64_or_128_bit.h __type_traits/make_const_lvalue_ref.h __type_traits/make_signed.h + __type_traits/make_transparent.h __type_traits/make_unsigned.h __type_traits/maybe_const.h __type_traits/nat.h @@ -914,6 +913,7 @@ set(files __utility/cmp.h __utility/convert_to_integral.h __utility/declval.h + __utility/default_three_way_comparator.h __utility/element_count.h __utility/empty.h __utility/exception_guard.h @@ -924,6 +924,7 @@ set(files __utility/integer_sequence.h __utility/is_pointer_in_range.h __utility/is_valid_range.h + __utility/lazy_synth_three_way_comparator.h __utility/move.h __utility/no_destroy.h __utility/pair.h @@ -935,6 +936,7 @@ set(files __utility/small_buffer.h __utility/swap.h __utility/to_underlying.h + __utility/try_key_extraction.h __utility/unreachable.h __variant/monostate.h __vector/comparison.h @@ -1591,7 +1593,6 @@ set(files __cxx03/cmath __cxx03/codecvt __cxx03/complex - __cxx03/complex.h __cxx03/condition_variable __cxx03/csetjmp __cxx03/csignal @@ -1604,25 +1605,20 @@ set(files __cxx03/cstring __cxx03/ctgmath __cxx03/ctime - __cxx03/ctype.h __cxx03/cuchar __cxx03/cwchar __cxx03/cwctype __cxx03/deque - __cxx03/errno.h __cxx03/exception __cxx03/experimental/__config __cxx03/experimental/utility __cxx03/ext/__hash __cxx03/ext/hash_map __cxx03/ext/hash_set - __cxx03/fenv.h - __cxx03/float.h __cxx03/forward_list __cxx03/fstream __cxx03/functional __cxx03/future - __cxx03/inttypes.h __cxx03/iomanip __cxx03/ios __cxx03/iosfwd @@ -1649,11 +1645,8 @@ set(files __cxx03/sstream __cxx03/stack __cxx03/stdatomic.h - __cxx03/stdbool.h - __cxx03/stddef.h __cxx03/stdexcept __cxx03/stdint.h - __cxx03/stdio.h __cxx03/stdlib.h __cxx03/streambuf __cxx03/string @@ -1661,7 +1654,6 @@ set(files __cxx03/string_view __cxx03/strstream __cxx03/system_error - __cxx03/tgmath.h __cxx03/thread __cxx03/type_traits __cxx03/typeindex @@ -1674,7 +1666,6 @@ set(files __cxx03/vector __cxx03/version __cxx03/wchar.h - __cxx03/wctype.h ) configure_file("__config_site.in" "${LIBCXX_GENERATED_INCLUDE_TARGET_DIR}/__config_site" @ONLY) diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/comp.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/comp.h index ab3c598418..38e2fb9f5e 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/comp.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/comp.h @@ -11,6 +11,7 @@ #include <__config> #include <__type_traits/desugars_to.h> +#include <__type_traits/is_generic_transparent_comparator.h> #include <__type_traits/is_integral.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -48,6 +49,9 @@ inline const bool __desugars_to_v<__less_tag, __less<>, _Tp, _Tp> = true; template inline const bool __desugars_to_v<__totally_ordered_less_tag, __less<>, _Tp, _Tp> = is_integral<_Tp>::value; +template <> +inline const bool __is_generic_transparent_comparator_v<__less<> > = true; + _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___ALGORITHM_COMP_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/copy.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/copy.h index 63877281bf..21fd25ce6f 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/copy.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/copy.h @@ -197,7 +197,8 @@ struct __copy_impl { _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> operator()(_InIter __first, _InIter __last, _OutIter __result) const { using _Traits = __segmented_iterator_traits<_OutIter>; - using _DiffT = typename common_type<__iter_diff_t<_InIter>, __iter_diff_t<_OutIter> >::type; + using _DiffT = + typename common_type<__iterator_difference_type<_InIter>, __iterator_difference_type<_OutIter> >::type; if (__first == __last) return std::make_pair(std::move(__first), std::move(__result)); diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/copy_backward.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/copy_backward.h index 807c64b55a..6c9eba672e 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/copy_backward.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/copy_backward.h @@ -214,7 +214,8 @@ struct __copy_backward_impl { auto __local_last = _Traits::__local(__result); while (true) { - using _DiffT = typename common_type<__iter_diff_t<_InIter>, __iter_diff_t<_OutIter> >::type; + using _DiffT = + typename common_type<__iterator_difference_type<_InIter>, __iterator_difference_type<_OutIter> >::type; auto __local_first = _Traits::__begin(__segment_iterator); auto __size = std::min<_DiffT>(__local_last - __local_first, __last - __first); diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/count.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/count.h index 0cbe9b6e61..8529d110a3 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/count.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/count.h @@ -72,7 +72,7 @@ __count_bool(__bit_iterator<_Cp, _IsConst> __first, typename __size_difference_t } template ::value, int> = 0> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __iter_diff_t<__bit_iterator<_Cp, _IsConst> > +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __iterator_difference_type<__bit_iterator<_Cp, _IsConst> > __count(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value, _Proj&) { if (__value) return std::__count_bool( @@ -82,7 +82,7 @@ __count(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __l } template -[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __iter_diff_t<_InputIterator> +[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __iterator_difference_type<_InputIterator> count(_InputIterator __first, _InputIterator __last, const _Tp& __value) { __identity __proj; return std::__count<_ClassicAlgPolicy>(__first, __last, __value, __proj); diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/fill.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/fill.h index 1ce3eadb01..328ebb6633 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/fill.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/fill.h @@ -10,8 +10,11 @@ #define _LIBCPP___ALGORITHM_FILL_H #include <__algorithm/fill_n.h> +#include <__algorithm/for_each_segment.h> #include <__config> #include <__iterator/iterator_traits.h> +#include <__iterator/segmented_iterator.h> +#include <__type_traits/enable_if.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -21,23 +24,40 @@ _LIBCPP_BEGIN_NAMESPACE_STD // fill isn't specialized for std::memset, because the compiler already optimizes the loop to a call to std::memset. -template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void -__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, forward_iterator_tag) { +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +__fill(_ForwardIterator __first, _Sentinel __last, const _Tp& __value) { for (; __first != __last; ++__first) *__first = __value; + return __first; } -template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void -__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value, random_access_iterator_tag) { - std::fill_n(__first, __last - __first, __value); +template ::value && + !__is_segmented_iterator_v<_RandomAccessIterator>, + int> = 0> +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _RandomAccessIterator +__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value) { + return std::__fill_n(__first, __last - __first, __value); } +#ifndef _LIBCPP_CXX03_LANG +template , int> = 0> +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +_SegmentedIterator __fill(_SegmentedIterator __first, _SegmentedIterator __last, const _Tp& __value) { + using __local_iterator_t = typename __segmented_iterator_traits<_SegmentedIterator>::__local_iterator; + std::__for_each_segment(__first, __last, [&](__local_iterator_t __lfirst, __local_iterator_t __llast) { + std::__fill(__lfirst, __llast, __value); + }); + return __last; +} +#endif // !_LIBCPP_CXX03_LANG + template inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) { - std::__fill(__first, __last, __value, typename iterator_traits<_ForwardIterator>::iterator_category()); + std::__fill(__first, __last, __value); } _LIBCPP_END_NAMESPACE_STD diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/fill_n.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/fill_n.h index 0da78e1f38..2bfacf3178 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/fill_n.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/fill_n.h @@ -9,10 +9,17 @@ #ifndef _LIBCPP___ALGORITHM_FILL_N_H #define _LIBCPP___ALGORITHM_FILL_N_H +#include <__algorithm/for_each_n_segment.h> #include <__algorithm/min.h> #include <__config> #include <__fwd/bit_reference.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/segmented_iterator.h> #include <__memory/pointer_traits.h> +#include <__type_traits/conjunction.h> +#include <__type_traits/enable_if.h> +#include <__type_traits/integral_constant.h> +#include <__type_traits/negation.h> #include <__utility/convert_to_integral.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -26,9 +33,38 @@ _LIBCPP_BEGIN_NAMESPACE_STD // fill_n isn't specialized for std::memset, because the compiler already optimizes the loop to a call to std::memset. -template +template >, + __has_random_access_local_iterator<_OutputIterator>>::value, + int> = 0 +#endif + > inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator -__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value); +__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value) { + for (; __n > 0; ++__first, (void)--__n) + *__first = __value; + return __first; +} + +#ifndef _LIBCPP_CXX03_LANG +template < class _OutputIterator, + class _Size, + class _Tp, + __enable_if_t<_And<_BoolConstant<__is_segmented_iterator_v<_OutputIterator>>, + __has_random_access_local_iterator<_OutputIterator>>::value, + int> = 0> +inline _LIBCPP_HIDE_FROM_ABI +_LIBCPP_CONSTEXPR_SINCE_CXX14 _OutputIterator __fill_n(_OutputIterator __first, _Size __n, const _Tp& __value) { + using __local_iterator_t = typename __segmented_iterator_traits<_OutputIterator>::__local_iterator; + return std::__for_each_n_segment(__first, __n, [&](__local_iterator_t __lfirst, __local_iterator_t __llast) { + std::__fill_n(__lfirst, __llast - __lfirst, __value); + }); +} +#endif // !_LIBCPP_CXX03_LANG template _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void @@ -68,14 +104,6 @@ __fill_n(__bit_iterator<_Cp, false> __first, _Size __n, const bool& __value) { return __first + __n; } -template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator -__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value) { - for (; __n > 0; ++__first, (void)--__n) - *__first = __value; - return __first; -} - template inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator fill_n(_OutputIterator __first, _Size __n, const _Tp& __value) { diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/find.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/find.h index 8c8cb5820f..10379d7074 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/find.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/find.h @@ -12,16 +12,19 @@ #include <__algorithm/find_segment_if.h> #include <__algorithm/min.h> +#include <__algorithm/simd_utils.h> #include <__algorithm/unwrap_iter.h> #include <__bit/countr.h> #include <__bit/invert_if.h> #include <__config> +#include <__cstddef/size_t.h> #include <__functional/identity.h> #include <__fwd/bit_reference.h> #include <__iterator/segmented_iterator.h> #include <__string/constexpr_c_functions.h> #include <__type_traits/enable_if.h> #include <__type_traits/invoke.h> +#include <__type_traits/is_constant_evaluated.h> #include <__type_traits/is_equality_comparable.h> #include <__type_traits/is_integral.h> #include <__type_traits/is_signed.h> @@ -44,39 +47,102 @@ _LIBCPP_BEGIN_NAMESPACE_STD // generic implementation template _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Iter -__find(_Iter __first, _Sent __last, const _Tp& __value, _Proj& __proj) { +__find_loop(_Iter __first, _Sent __last, const _Tp& __value, _Proj& __proj) { for (; __first != __last; ++__first) if (std::__invoke(__proj, *__first) == __value) break; return __first; } -// trivially equality comparable implementations -template ::value && __libcpp_is_trivially_equality_comparable<_Tp, _Up>::value && - sizeof(_Tp) == 1, - int> = 0> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp* __find(_Tp* __first, _Tp* __last, const _Up& __value, _Proj&) { - if (auto __ret = std::__constexpr_memchr(__first, __value, __last - __first)) - return __ret; - return __last; +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Iter +__find(_Iter __first, _Sent __last, const _Tp& __value, _Proj& __proj) { + return std::__find_loop(std::move(__first), std::move(__last), __value, __proj); } -#if _LIBCPP_HAS_WIDE_CHARACTERS -template ::value && __libcpp_is_trivially_equality_comparable<_Tp, _Up>::value && - sizeof(_Tp) == sizeof(wchar_t) && _LIBCPP_ALIGNOF(_Tp) >= _LIBCPP_ALIGNOF(wchar_t), - int> = 0> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp* __find(_Tp* __first, _Tp* __last, const _Up& __value, _Proj&) { - if (auto __ret = std::__constexpr_wmemchr(__first, __value, __last - __first)) - return __ret; - return __last; +#if _LIBCPP_VECTORIZE_ALGORITHMS +template +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI +_LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp* __find_vectorized(_Tp* __first, _Tp* __last, _Up __value) { + if (!__libcpp_is_constant_evaluated()) { + constexpr size_t __unroll_count = 4; + constexpr size_t __vec_size = __native_vector_size<_Tp>; + using __vec = __simd_vector<_Tp, __vec_size>; + + auto __orig_first = __first; + + auto __values = static_cast<__simd_vector<_Tp, __vec_size>>(__value); // broadcast the value + while (static_cast(__last - __first) >= __unroll_count * __vec_size) [[__unlikely__]] { + __vec __lhs[__unroll_count]; + + for (size_t __i = 0; __i != __unroll_count; ++__i) + __lhs[__i] = std::__load_vector<__vec>(__first + __i * __vec_size); + + for (size_t __i = 0; __i != __unroll_count; ++__i) { + if (auto __cmp_res = __lhs[__i] == __values; std::__any_of(__cmp_res)) { + auto __offset = __i * __vec_size + std::__find_first_set(__cmp_res); + return __first + __offset; + } + } + + __first += __unroll_count * __vec_size; + } + + // check the remaining 0-3 vectors + while (static_cast(__last - __first) >= __vec_size) { + if (auto __cmp_res = std::__load_vector<__vec>(__first) == __values; std::__any_of(__cmp_res)) { + return __first + std::__find_first_set(__cmp_res); + } + __first += __vec_size; + } + + if (__last - __first == 0) + return __first; + + // Check if we can load elements in front of the current pointer. If that's the case load a vector at + // (last - vector_size) to check the remaining elements + if (static_cast(__first - __orig_first) >= __vec_size) { + __first = __last - __vec_size; + return __first + std::__find_first_set(std::__load_vector<__vec>(__first) == __values); + } + } + + __identity __proj; + return std::__find_loop(__first, __last, __value, __proj); } -#endif // _LIBCPP_HAS_WIDE_CHARACTERS +#endif + +#ifndef _LIBCPP_CXX03_LANG +// trivially equality comparable implementations +template < + class _Tp, + class _Up, + class _Proj, + __enable_if_t<__is_identity<_Proj>::value && __libcpp_is_trivially_equality_comparable<_Tp, _Up>::value, int> = 0> +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp* __find(_Tp* __first, _Tp* __last, const _Up& __value, _Proj&) { + if constexpr (sizeof(_Tp) == 1) { + if (auto __ret = std::__constexpr_memchr(__first, __value, __last - __first)) + return __ret; + return __last; + } +# if _LIBCPP_HAS_WIDE_CHARACTERS + else if constexpr (sizeof(_Tp) == sizeof(wchar_t) && _LIBCPP_ALIGNOF(_Tp) >= _LIBCPP_ALIGNOF(wchar_t)) { + if (auto __ret = std::__constexpr_wmemchr(__first, __value, __last - __first)) + return __ret; + return __last; + } +# endif +# if _LIBCPP_VECTORIZE_ALGORITHMS + else if constexpr (is_integral<_Tp>::value) { + return std::__find_vectorized(__first, __last, __value); + } +# endif + else { + __identity __proj; + return std::__find_loop(__first, __last, __value, __proj); + } +} +#endif // TODO: This should also be possible to get right with different signedness // cast integral types to allow vectorization diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/for_each.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/for_each.h index e31fcae83a..6fb66d25a2 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/for_each.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/for_each.h @@ -16,15 +16,11 @@ #include <__iterator/segmented_iterator.h> #include <__type_traits/enable_if.h> #include <__type_traits/invoke.h> -#include <__utility/move.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif -_LIBCPP_PUSH_MACROS -#include <__undef_macros> - _LIBCPP_BEGIN_NAMESPACE_STD template @@ -60,6 +56,4 @@ for_each(_InputIterator __first, _InputIterator __last, _Func __f) { _LIBCPP_END_NAMESPACE_STD -_LIBCPP_POP_MACROS - #endif // _LIBCPP___ALGORITHM_FOR_EACH_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/generate.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/generate.h index c95b527402..c4cd75cd0a 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/generate.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/generate.h @@ -9,7 +9,9 @@ #ifndef _LIBCPP___ALGORITHM_GENERATE_H #define _LIBCPP___ALGORITHM_GENERATE_H +#include <__algorithm/for_each.h> #include <__config> +#include <__utility/forward.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -20,8 +22,8 @@ _LIBCPP_BEGIN_NAMESPACE_STD template inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen) { - for (; __first != __last; ++__first) - *__first = __gen(); + using __iter_ref = decltype(*__first); + std::for_each(__first, __last, [&](__iter_ref __element) { std::forward<__iter_ref>(__element) = __gen(); }); } _LIBCPP_END_NAMESPACE_STD diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/generate_n.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/generate_n.h index f36403fd0f..e9da133f05 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/generate_n.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/generate_n.h @@ -9,8 +9,10 @@ #ifndef _LIBCPP___ALGORITHM_GENERATE_N_H #define _LIBCPP___ALGORITHM_GENERATE_N_H +#include <__algorithm/for_each_n.h> #include <__config> -#include <__utility/convert_to_integral.h> +#include <__functional/identity.h> +#include <__utility/forward.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -21,11 +23,10 @@ _LIBCPP_BEGIN_NAMESPACE_STD template inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator generate_n(_OutputIterator __first, _Size __orig_n, _Generator __gen) { - typedef decltype(std::__convert_to_integral(__orig_n)) _IntegralSize; - _IntegralSize __n = __orig_n; - for (; __n > 0; ++__first, (void)--__n) - *__first = __gen(); - return __first; + using __iter_ref = decltype(*__first); + __identity __proj; + auto __f = [&](__iter_ref __element) { std::forward<__iter_ref>(__element) = __gen(); }; + return std::__for_each_n(__first, __orig_n, __f, __proj); } _LIBCPP_END_NAMESPACE_STD diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/is_permutation.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/is_permutation.h index 1afb11596b..86f469c279 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/is_permutation.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/is_permutation.h @@ -78,7 +78,7 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool __is_permutation_impl( _Pred&& __pred, _Proj1&& __proj1, _Proj2&& __proj2) { - using _D1 = __iter_diff_t<_Iter1>; + using _D1 = __iterator_difference_type<_Iter1>; for (auto __i = __first1; __i != __last1; ++__i) { // Have we already counted the number of *__i in [f1, l1)? @@ -126,7 +126,7 @@ template ; + using _D1 = __iterator_difference_type<_ForwardIterator1>; _D1 __l1 = _IterOps<_AlgPolicy>::distance(__first1, __last1); if (__l1 == _D1(1)) return false; @@ -173,10 +173,10 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool __is_permutation( if (__first2 == __last2) // Second range is shorter return false; - using _D1 = __iter_diff_t<_Iter1>; + using _D1 = __iterator_difference_type<_Iter1>; _D1 __l1 = _IterOps<_AlgPolicy>::distance(__first1, __last1); - using _D2 = __iter_diff_t<_Iter2>; + using _D2 = __iterator_difference_type<_Iter2>; _D2 __l2 = _IterOps<_AlgPolicy>::distance(__first2, __last2); if (__l1 != __l2) return false; diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/lexicographical_compare_three_way.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/lexicographical_compare_three_way.h index a5872e90cf..442223e79e 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/lexicographical_compare_three_way.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/lexicographical_compare_three_way.h @@ -37,13 +37,13 @@ template _LIBCPP_HIDE_FROM_ABI constexpr auto __lexicographical_compare_three_way_fast_path( _InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, _Cmp& __comp) -> decltype(__comp(*__first1, *__first2)) { - static_assert( - signed_integral<__iter_diff_t<_InputIterator1>>, "Using a non-integral difference_type is undefined behavior."); - static_assert( - signed_integral<__iter_diff_t<_InputIterator2>>, "Using a non-integral difference_type is undefined behavior."); + static_assert(signed_integral<__iterator_difference_type<_InputIterator1>>, + "Using a non-integral difference_type is undefined behavior."); + static_assert(signed_integral<__iterator_difference_type<_InputIterator2>>, + "Using a non-integral difference_type is undefined behavior."); - using _Len1 = __iter_diff_t<_InputIterator1>; - using _Len2 = __iter_diff_t<_InputIterator2>; + using _Len1 = __iterator_difference_type<_InputIterator1>; + using _Len2 = __iterator_difference_type<_InputIterator2>; using _Common = common_type_t<_Len1, _Len2>; _Len1 __len1 = __last1 - __first1; diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/make_heap.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/make_heap.h index e8f0cdb273..f98a0d2f89 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/make_heap.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/make_heap.h @@ -12,9 +12,11 @@ #include <__algorithm/comp.h> #include <__algorithm/comp_ref_type.h> #include <__algorithm/iterator_operations.h> +#include <__algorithm/push_heap.h> #include <__algorithm/sift_down.h> #include <__config> #include <__iterator/iterator_traits.h> +#include <__type_traits/is_arithmetic.h> #include <__utility/move.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -31,13 +33,23 @@ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void __make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare&& __comp) { __comp_ref_type<_Compare> __comp_ref = __comp; - using difference_type = typename iterator_traits<_RandomAccessIterator>::difference_type; - difference_type __n = __last - __first; + using __diff_t = __iterator_difference_type<_RandomAccessIterator>; + const __diff_t __n = __last - __first; + + const bool __assume_both_children = is_arithmetic<__iterator_value_type<_RandomAccessIterator> >::value; + + // While it would be correct to always assume we have both children, in practice we observed this to be a performance + // improvement only for arithmetic types. + const __diff_t __sift_down_n = __assume_both_children ? ((__n & 1) ? __n : __n - 1) : __n; + if (__n > 1) { // start from the first parent, there is no need to consider children - for (difference_type __start = (__n - 2) / 2; __start >= 0; --__start) { - std::__sift_down<_AlgPolicy>(__first, __comp_ref, __n, __first + __start); + + for (__diff_t __start = (__sift_down_n - 2) / 2; __start >= 0; --__start) { + std::__sift_down<_AlgPolicy, __assume_both_children>(__first, __comp_ref, __sift_down_n, __start); } + if _LIBCPP_CONSTEXPR (__assume_both_children) + std::__sift_up<_AlgPolicy>(__first, __last, __comp, __n); } } diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/mismatch.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/mismatch.h index a6836792c0..749c701974 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/mismatch.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/mismatch.h @@ -60,7 +60,7 @@ __mismatch(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Pred& __pred, _Pro template [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_Iter, _Iter> __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) { - using __value_type = __iter_value_type<_Iter>; + using __value_type = __iterator_value_type<_Iter>; constexpr size_t __unroll_count = 4; constexpr size_t __vec_size = __native_vector_size<__value_type>; using __vec = __simd_vector<__value_type, __vec_size>; diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/move.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/move.h index 73b780d9b1..52bd5fb525 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/move.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/move.h @@ -80,7 +80,8 @@ struct __move_impl { _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> operator()(_InIter __first, _InIter __last, _OutIter __result) const { using _Traits = __segmented_iterator_traits<_OutIter>; - using _DiffT = typename common_type<__iter_diff_t<_InIter>, __iter_diff_t<_OutIter> >::type; + using _DiffT = + typename common_type<__iterator_difference_type<_InIter>, __iterator_difference_type<_OutIter> >::type; if (__first == __last) return std::make_pair(std::move(__first), std::move(__result)); diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/move_backward.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/move_backward.h index e3e61c7bc1..a4698327b4 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/move_backward.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/move_backward.h @@ -86,7 +86,8 @@ struct __move_backward_impl { _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> operator()(_InIter __first, _InIter __last, _OutIter __result) const { using _Traits = __segmented_iterator_traits<_OutIter>; - using _DiffT = typename common_type<__iter_diff_t<_InIter>, __iter_diff_t<_OutIter> >::type; + using _DiffT = + typename common_type<__iterator_difference_type<_InIter>, __iterator_difference_type<_OutIter> >::type; // When the range contains no elements, __result might not be a valid iterator if (__first == __last) diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/partial_sort.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/partial_sort.h index 7f8d0c4914..4b39ae0cf2 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/partial_sort.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/partial_sort.h @@ -45,7 +45,7 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _RandomAccessIterator __part for (; __i != __last; ++__i) { if (__comp(*__i, *__first)) { _IterOps<_AlgPolicy>::iter_swap(__i, __first); - std::__sift_down<_AlgPolicy>(__first, __comp, __len, __first); + std::__sift_down<_AlgPolicy, false>(__first, __comp, __len, 0); } } std::__sort_heap<_AlgPolicy>(std::move(__first), std::move(__middle), __comp); diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/partial_sort_copy.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/partial_sort_copy.h index 172f53b290..2230dfc9cc 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/partial_sort_copy.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/partial_sort_copy.h @@ -60,7 +60,7 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_InputIterator, _Random for (; __first != __last; ++__first) if (std::__invoke(__comp, std::__invoke(__proj1, *__first), std::__invoke(__proj2, *__result_first))) { *__result_first = *__first; - std::__sift_down<_AlgPolicy>(__result_first, __projected_comp, __len, __result_first); + std::__sift_down<_AlgPolicy, false>(__result_first, __projected_comp, __len, 0); } std::__sort_heap<_AlgPolicy>(__result_first, __r, __projected_comp); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/pstl.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/pstl.h index aa7b49de93..eea07e2b96 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/pstl.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/pstl.h @@ -115,7 +115,7 @@ template , enable_if_t, int> = 0> -_LIBCPP_HIDE_FROM_ABI __iter_diff_t<_ForwardIterator> +_LIBCPP_HIDE_FROM_ABI __iterator_difference_type<_ForwardIterator> count_if(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) { _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR( _ForwardIterator, "count_if(first, last, pred) requires [first, last) to be ForwardIterators"); @@ -129,7 +129,7 @@ template , enable_if_t, int> = 0> -_LIBCPP_HIDE_FROM_ABI __iter_diff_t<_ForwardIterator> +_LIBCPP_HIDE_FROM_ABI __iterator_difference_type<_ForwardIterator> count(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) { _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR( _ForwardIterator, "count(first, last, val) requires [first, last) to be ForwardIterators"); diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/radix_sort.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/radix_sort.h index 055d8a0765..5549a69f5e 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/radix_sort.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/radix_sort.h @@ -72,14 +72,14 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 14 template -_LIBCPP_HIDE_FROM_ABI constexpr pair<_OutputIterator, __iter_value_type<_InputIterator>> +_LIBCPP_HIDE_FROM_ABI constexpr pair<_OutputIterator, __iterator_value_type<_InputIterator>> __partial_sum_max(_InputIterator __first, _InputIterator __last, _OutputIterator __result) { if (__first == __last) return {__result, 0}; - auto __max = *__first; - __iter_value_type<_InputIterator> __sum = *__first; - *__result = __sum; + auto __max = *__first; + __iterator_value_type<_InputIterator> __sum = *__first; + *__result = __sum; while (++__first != __last) { if (__max < *__first) { @@ -124,7 +124,7 @@ _LIBCPP_HIDE_FROM_ABI constexpr auto __nth_radix(size_t __radix_number, _Radix _ template _LIBCPP_HIDE_FROM_ABI constexpr void __collect(_ForwardIterator __first, _ForwardIterator __last, _Map __map, _RandomAccessIterator __counters) { - using __value_type = __iter_value_type<_ForwardIterator>; + using __value_type = __iterator_value_type<_ForwardIterator>; using __traits = __counting_sort_traits<__value_type, _Map>; std::for_each(__first, __last, [&__counters, &__map](const auto& __preimage) { ++__counters[__map(__preimage)]; }); @@ -160,7 +160,7 @@ _LIBCPP_HIDE_FROM_ABI constexpr bool __collect_impl( _RandomAccessIterator1 __counters, _RandomAccessIterator2 __maximums, index_sequence<_Radices...>) { - using __value_type = __iter_value_type<_ForwardIterator>; + using __value_type = __iterator_value_type<_ForwardIterator>; constexpr auto __radix_value_range = __radix_sort_traits<__value_type, _Map, _Radix>::__radix_value_range; auto __previous = numeric_limits<__invoke_result_t<_Map, __value_type>>::min(); @@ -189,7 +189,7 @@ __collect(_ForwardIterator __first, _Radix __radix, _RandomAccessIterator1 __counters, _RandomAccessIterator2 __maximums) { - using __value_type = __iter_value_type<_ForwardIterator>; + using __value_type = __iterator_value_type<_ForwardIterator>; constexpr auto __radix_count = __radix_sort_traits<__value_type, _Map, _Radix>::__radix_count; return std::__collect_impl( __first, __last, __map, __radix, __counters, __maximums, make_index_sequence<__radix_count>()); @@ -213,10 +213,10 @@ _LIBCPP_HIDE_FROM_ABI constexpr void __dispose_backward( template _LIBCPP_HIDE_FROM_ABI constexpr _RandomAccessIterator __counting_sort_impl(_ForwardIterator __first, _ForwardIterator __last, _RandomAccessIterator __result, _Map __map) { - using __value_type = __iter_value_type<_ForwardIterator>; + using __value_type = __iterator_value_type<_ForwardIterator>; using __traits = __counting_sort_traits<__value_type, _Map>; - __iter_diff_t<_RandomAccessIterator> __counters[__traits::__value_range + 1] = {0}; + __iterator_difference_type<_RandomAccessIterator> __counters[__traits::__value_range + 1] = {0}; std::__collect(__first, __last, __map, std::next(std::begin(__counters))); std::__dispose(__first, __last, __result, __map, std::begin(__counters)); @@ -224,12 +224,13 @@ __counting_sort_impl(_ForwardIterator __first, _ForwardIterator __last, _RandomA return __result + __counters[__traits::__value_range]; } -template , _Map, _Radix>::__radix_count == 1, - int> = 0> +template < + class _RandomAccessIterator1, + class _RandomAccessIterator2, + class _Map, + class _Radix, + enable_if_t<__radix_sort_traits<__iterator_value_type<_RandomAccessIterator1>, _Map, _Radix>::__radix_count == 1, + int> = 0> _LIBCPP_HIDE_FROM_ABI constexpr void __radix_sort_impl( _RandomAccessIterator1 __first, _RandomAccessIterator1 __last, @@ -243,24 +244,25 @@ _LIBCPP_HIDE_FROM_ABI constexpr void __radix_sort_impl( std::move(__buffer, __buffer_end, __first); } -template < - class _RandomAccessIterator1, - class _RandomAccessIterator2, - class _Map, - class _Radix, - enable_if_t< __radix_sort_traits<__iter_value_type<_RandomAccessIterator1>, _Map, _Radix>::__radix_count % 2 == 0, - int> = 0 > +template , _Map, _Radix>::__radix_count % 2 == 0, + int> = 0> _LIBCPP_HIDE_FROM_ABI constexpr void __radix_sort_impl( _RandomAccessIterator1 __first, _RandomAccessIterator1 __last, _RandomAccessIterator2 __buffer_begin, _Map __map, _Radix __radix) { - using __value_type = __iter_value_type<_RandomAccessIterator1>; + using __value_type = __iterator_value_type<_RandomAccessIterator1>; using __traits = __radix_sort_traits<__value_type, _Map, _Radix>; - __iter_diff_t<_RandomAccessIterator1> __counters[__traits::__radix_count][__traits::__radix_value_range] = {{0}}; - __iter_diff_t<_RandomAccessIterator1> __maximums[__traits::__radix_count] = {0}; + __iterator_difference_type<_RandomAccessIterator1> + __counters[__traits::__radix_count][__traits::__radix_value_range] = {{0}}; + __iterator_difference_type<_RandomAccessIterator1> __maximums[__traits::__radix_count] = {0}; const auto __is_sorted = std::__collect(__first, __last, __map, __radix, __counters, __maximums); if (!__is_sorted) { const auto __range_size = std::distance(__first, __last); diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/ranges_fill.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/ranges_fill.h index c248009f98..814ae6363f 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/ranges_fill.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/ranges_fill.h @@ -9,12 +9,14 @@ #ifndef _LIBCPP___ALGORITHM_RANGES_FILL_H #define _LIBCPP___ALGORITHM_RANGES_FILL_H -#include <__algorithm/ranges_fill_n.h> +#include <__algorithm/fill.h> +#include <__algorithm/fill_n.h> #include <__config> #include <__iterator/concepts.h> #include <__ranges/access.h> #include <__ranges/concepts.h> #include <__ranges/dangling.h> +#include <__utility/move.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -31,12 +33,11 @@ namespace ranges { struct __fill { template _Iter, sentinel_for<_Iter> _Sent> _LIBCPP_HIDE_FROM_ABI constexpr _Iter operator()(_Iter __first, _Sent __last, const _Type& __value) const { - if constexpr (random_access_iterator<_Iter> && sized_sentinel_for<_Sent, _Iter>) { - return ranges::fill_n(__first, __last - __first, __value); + if constexpr (sized_sentinel_for<_Sent, _Iter>) { + auto __n = __last - __first; + return std::__fill_n(std::move(__first), __n, __value); } else { - for (; __first != __last; ++__first) - *__first = __value; - return __first; + return std::__fill(std::move(__first), std::move(__last), __value); } } diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/sift_down.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/sift_down.h index 42803e3063..f827754575 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/sift_down.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/sift_down.h @@ -24,59 +24,60 @@ _LIBCPP_PUSH_MACROS _LIBCPP_BEGIN_NAMESPACE_STD -template +template _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void __sift_down(_RandomAccessIterator __first, _Compare&& __comp, - typename iterator_traits<_RandomAccessIterator>::difference_type __len, - _RandomAccessIterator __start) { + __iterator_difference_type<_RandomAccessIterator> __len, + __iterator_difference_type<_RandomAccessIterator> __start) { using _Ops = _IterOps<_AlgPolicy>; typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; // left-child of __start is at 2 * __start + 1 // right-child of __start is at 2 * __start + 2 - difference_type __child = __start - __first; + difference_type __child = __start; if (__len < 2 || (__len - 2) / 2 < __child) return; - __child = 2 * __child + 1; - _RandomAccessIterator __child_i = __first + __child; + __child = 2 * __child + 1; - if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + difference_type(1)))) { + if _LIBCPP_CONSTEXPR (__assume_both_children) { + // right-child exists and is greater than left-child + __child += __comp(__first[__child], __first[__child + 1]); + } else if ((__child + 1) < __len && __comp(__first[__child], __first[__child + 1])) { // right-child exists and is greater than left-child - ++__child_i; ++__child; } // check if we are in heap-order - if (__comp(*__child_i, *__start)) + if (__comp(__first[__child], __first[__start])) // we are, __start is larger than its largest child return; - value_type __top(_Ops::__iter_move(__start)); + value_type __top(_Ops::__iter_move(__first + __start)); do { // we are not in heap-order, swap the parent with its largest child - *__start = _Ops::__iter_move(__child_i); - __start = __child_i; + __first[__start] = _Ops::__iter_move(__first + __child); + __start = __child; if ((__len - 2) / 2 < __child) break; // recompute the child based off of the updated parent - __child = 2 * __child + 1; - __child_i = __first + __child; + __child = 2 * __child + 1; - if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + difference_type(1)))) { + if _LIBCPP_CONSTEXPR (__assume_both_children) { + __child += __comp(__first[__child], __first[__child + 1]); + } else if ((__child + 1) < __len && __comp(__first[__child], __first[__child + 1])) { // right-child exists and is greater than left-child - ++__child_i; ++__child; } // check if we are in heap-order - } while (!__comp(*__child_i, __top)); - *__start = std::move(__top); + } while (!__comp(__first[__child], __top)); + __first[__start] = std::move(__top); } template diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/simd_utils.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/simd_utils.h index 07fef20f61..aaeb8a881d 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/simd_utils.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/simd_utils.h @@ -114,6 +114,11 @@ template }(make_index_sequence<__simd_vector_size_v<_VecT>>{}); } +template +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI bool __any_of(__simd_vector<_Tp, _Np> __vec) noexcept { + return __builtin_reduce_or(__builtin_convertvector(__vec, __simd_vector)); +} + template [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI bool __all_of(__simd_vector<_Tp, _Np> __vec) noexcept { return __builtin_reduce_and(__builtin_convertvector(__vec, __simd_vector)); @@ -123,7 +128,7 @@ template [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_t __find_first_set(__simd_vector<_Tp, _Np> __vec) noexcept { using __mask_vec = __simd_vector; - // This has MSan disabled du to https://github.com/llvm/llvm-project/issues/85876 + // This has MSan disabled du to https://llvm.org/PR85876 auto __impl = [&](_MaskT) _LIBCPP_NO_SANITIZE("memory") noexcept { # if defined(_LIBCPP_BIG_ENDIAN) return std::min( diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/sort.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/sort.h index 06cb5b8ce7..8aa894e922 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/sort.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/sort.h @@ -860,6 +860,9 @@ __sort<__less&, long double*>(long double*, long double*, __less _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __sort_dispatch(_RandomAccessIterator __first, _RandomAccessIterator __last, _Comp& __comp) { + if (__first == __last) // log(0) is undefined, so don't try computing the depth + return; + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; difference_type __depth_limit = 2 * std::__bit_log2(std::__to_unsigned_like(__last - __first)); diff --git a/naiveproxy/src/third_party/libc++/src/include/__algorithm/stable_sort.h b/naiveproxy/src/third_party/libc++/src/include/__algorithm/stable_sort.h index 1ca66f6a51..64c8080834 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__algorithm/stable_sort.h +++ b/naiveproxy/src/third_party/libc++/src/include/__algorithm/stable_sort.h @@ -247,7 +247,7 @@ _LIBCPP_CONSTEXPR_SINCE_CXX26 void __stable_sort( constexpr auto __default_comp = __desugars_to_v<__less_tag, _Compare, value_type, value_type >; constexpr auto __radix_sortable = __is_ordered_integer_representable_v && - is_same_v< value_type&, __iter_reference<_RandomAccessIterator>>; + is_same_v< value_type&, __iterator_reference<_RandomAccessIterator>>; if constexpr (__default_comp && __radix_sortable) { if (__len <= __buff_size && __len >= static_cast(std::__radix_sort_min_bound()) && __len <= static_cast(std::__radix_sort_max_bound())) { diff --git a/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic.h b/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic.h index eead49dde6..44835820bb 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic.h +++ b/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic.h @@ -11,6 +11,7 @@ #include <__atomic/atomic_sync.h> #include <__atomic/check_memory_order.h> +#include <__atomic/floating_point_helper.h> #include <__atomic/is_always_lock_free.h> #include <__atomic/memory_order.h> #include <__atomic/support.h> @@ -113,22 +114,16 @@ struct __atomic_base // false } #if _LIBCPP_STD_VER >= 20 - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void wait(_Tp __v, memory_order __m = memory_order_seq_cst) const - volatile _NOEXCEPT { + _LIBCPP_HIDE_FROM_ABI void wait(_Tp __v, memory_order __m = memory_order_seq_cst) const volatile _NOEXCEPT { std::__atomic_wait(*this, __v, __m); } - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void - wait(_Tp __v, memory_order __m = memory_order_seq_cst) const _NOEXCEPT { + _LIBCPP_HIDE_FROM_ABI void wait(_Tp __v, memory_order __m = memory_order_seq_cst) const _NOEXCEPT { std::__atomic_wait(*this, __v, __m); } - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_one() volatile _NOEXCEPT { - std::__atomic_notify_one(*this); - } - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_one() _NOEXCEPT { std::__atomic_notify_one(*this); } - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_all() volatile _NOEXCEPT { - std::__atomic_notify_all(*this); - } - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_all() _NOEXCEPT { std::__atomic_notify_all(*this); } + _LIBCPP_HIDE_FROM_ABI void notify_one() volatile _NOEXCEPT { std::__atomic_notify_one(*this); } + _LIBCPP_HIDE_FROM_ABI void notify_one() _NOEXCEPT { std::__atomic_notify_one(*this); } + _LIBCPP_HIDE_FROM_ABI void notify_all() volatile _NOEXCEPT { std::__atomic_notify_all(*this); } + _LIBCPP_HIDE_FROM_ABI void notify_all() _NOEXCEPT { std::__atomic_notify_all(*this); } #endif // _LIBCPP_STD_VER >= 20 #if _LIBCPP_STD_VER >= 20 @@ -332,42 +327,18 @@ template requires is_floating_point_v<_Tp> struct atomic<_Tp> : __atomic_base<_Tp> { private: - _LIBCPP_HIDE_FROM_ABI static constexpr bool __is_fp80_long_double() { - // Only x87-fp80 long double has 64-bit mantissa - return __LDBL_MANT_DIG__ == 64 && std::is_same_v<_Tp, long double>; - } - - _LIBCPP_HIDE_FROM_ABI static constexpr bool __has_rmw_builtin() { -# ifndef _LIBCPP_COMPILER_CLANG_BASED - return false; -# else - // The builtin __cxx_atomic_fetch_add errors during compilation for - // long double on platforms with fp80 format. - // For more details, see - // lib/Sema/SemaChecking.cpp function IsAllowedValueType - // LLVM Parser does not allow atomicrmw with x86_fp80 type. - // if (ValType->isSpecificBuiltinType(BuiltinType::LongDouble) && - // &Context.getTargetInfo().getLongDoubleFormat() == - // &llvm::APFloat::x87DoubleExtended()) - // For more info - // https://github.com/llvm/llvm-project/issues/68602 - // https://reviews.llvm.org/D53965 - return !__is_fp80_long_double(); -# endif - } - template _LIBCPP_HIDE_FROM_ABI static _Tp __rmw_op(_This&& __self, _Tp __operand, memory_order __m, _Operation __operation, _BuiltinOp __builtin_op) { - if constexpr (__has_rmw_builtin()) { + if constexpr (std::__has_rmw_builtin<_Tp>()) { return __builtin_op(std::addressof(std::forward<_This>(__self).__a_), __operand, __m); } else { _Tp __old = __self.load(memory_order_relaxed); _Tp __new = __operation(__old, __operand); while (!__self.compare_exchange_weak(__old, __new, __m, memory_order_relaxed)) { # ifdef _LIBCPP_COMPILER_CLANG_BASED - if constexpr (__is_fp80_long_double()) { - // https://github.com/llvm/llvm-project/issues/47978 + if constexpr (std::__is_fp80_long_double<_Tp>()) { + // https://llvm.org/PR47978 // clang bug: __old is not updated on failure for atomic::compare_exchange_weak // Note __old = __self.load(memory_order_relaxed) will not work std::__cxx_atomic_load_inplace(std::addressof(__self.__a_), std::addressof(__old), memory_order_relaxed); @@ -642,28 +613,27 @@ _LIBCPP_HIDE_FROM_ABI bool atomic_compare_exchange_strong_explicit( // atomic_wait template -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void +_LIBCPP_HIDE_FROM_ABI void atomic_wait(const volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __v) _NOEXCEPT { return __o->wait(__v); } template -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void -atomic_wait(const atomic<_Tp>* __o, typename atomic<_Tp>::value_type __v) _NOEXCEPT { +_LIBCPP_HIDE_FROM_ABI void atomic_wait(const atomic<_Tp>* __o, typename atomic<_Tp>::value_type __v) _NOEXCEPT { return __o->wait(__v); } // atomic_wait_explicit template -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void +_LIBCPP_HIDE_FROM_ABI void atomic_wait_explicit(const volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __v, memory_order __m) _NOEXCEPT _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m) { return __o->wait(__v, __m); } template -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void +_LIBCPP_HIDE_FROM_ABI void atomic_wait_explicit(const atomic<_Tp>* __o, typename atomic<_Tp>::value_type __v, memory_order __m) _NOEXCEPT _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m) { return __o->wait(__v, __m); @@ -672,22 +642,22 @@ atomic_wait_explicit(const atomic<_Tp>* __o, typename atomic<_Tp>::value_type __ // atomic_notify_one template -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void atomic_notify_one(volatile atomic<_Tp>* __o) _NOEXCEPT { +_LIBCPP_HIDE_FROM_ABI void atomic_notify_one(volatile atomic<_Tp>* __o) _NOEXCEPT { __o->notify_one(); } template -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void atomic_notify_one(atomic<_Tp>* __o) _NOEXCEPT { +_LIBCPP_HIDE_FROM_ABI void atomic_notify_one(atomic<_Tp>* __o) _NOEXCEPT { __o->notify_one(); } // atomic_notify_all template -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void atomic_notify_all(volatile atomic<_Tp>* __o) _NOEXCEPT { +_LIBCPP_HIDE_FROM_ABI void atomic_notify_all(volatile atomic<_Tp>* __o) _NOEXCEPT { __o->notify_all(); } template -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void atomic_notify_all(atomic<_Tp>* __o) _NOEXCEPT { +_LIBCPP_HIDE_FROM_ABI void atomic_notify_all(atomic<_Tp>* __o) _NOEXCEPT { __o->notify_all(); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic_flag.h b/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic_flag.h index 5cc6fb0c55..28ed2d53b7 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic_flag.h +++ b/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic_flag.h @@ -49,22 +49,16 @@ struct atomic_flag { } #if _LIBCPP_STD_VER >= 20 - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void wait(bool __v, memory_order __m = memory_order_seq_cst) const - volatile _NOEXCEPT { + _LIBCPP_HIDE_FROM_ABI void wait(bool __v, memory_order __m = memory_order_seq_cst) const volatile _NOEXCEPT { std::__atomic_wait(*this, _LIBCPP_ATOMIC_FLAG_TYPE(__v), __m); } - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void - wait(bool __v, memory_order __m = memory_order_seq_cst) const _NOEXCEPT { + _LIBCPP_HIDE_FROM_ABI void wait(bool __v, memory_order __m = memory_order_seq_cst) const _NOEXCEPT { std::__atomic_wait(*this, _LIBCPP_ATOMIC_FLAG_TYPE(__v), __m); } - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_one() volatile _NOEXCEPT { - std::__atomic_notify_one(*this); - } - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_one() _NOEXCEPT { std::__atomic_notify_one(*this); } - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_all() volatile _NOEXCEPT { - std::__atomic_notify_all(*this); - } - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_all() _NOEXCEPT { std::__atomic_notify_all(*this); } + _LIBCPP_HIDE_FROM_ABI void notify_one() volatile _NOEXCEPT { std::__atomic_notify_one(*this); } + _LIBCPP_HIDE_FROM_ABI void notify_one() _NOEXCEPT { std::__atomic_notify_one(*this); } + _LIBCPP_HIDE_FROM_ABI void notify_all() volatile _NOEXCEPT { std::__atomic_notify_all(*this); } + _LIBCPP_HIDE_FROM_ABI void notify_all() _NOEXCEPT { std::__atomic_notify_all(*this); } #endif #if _LIBCPP_STD_VER >= 20 @@ -143,43 +137,26 @@ inline _LIBCPP_HIDE_FROM_ABI void atomic_flag_clear_explicit(atomic_flag* __o, m } #if _LIBCPP_STD_VER >= 20 -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void -atomic_flag_wait(const volatile atomic_flag* __o, bool __v) _NOEXCEPT { +inline _LIBCPP_HIDE_FROM_ABI void atomic_flag_wait(const volatile atomic_flag* __o, bool __v) _NOEXCEPT { __o->wait(__v); } -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void -atomic_flag_wait(const atomic_flag* __o, bool __v) _NOEXCEPT { - __o->wait(__v); -} +inline _LIBCPP_HIDE_FROM_ABI void atomic_flag_wait(const atomic_flag* __o, bool __v) _NOEXCEPT { __o->wait(__v); } -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void +inline _LIBCPP_HIDE_FROM_ABI void atomic_flag_wait_explicit(const volatile atomic_flag* __o, bool __v, memory_order __m) _NOEXCEPT { __o->wait(__v, __m); } -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void +inline _LIBCPP_HIDE_FROM_ABI void atomic_flag_wait_explicit(const atomic_flag* __o, bool __v, memory_order __m) _NOEXCEPT { __o->wait(__v, __m); } -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void -atomic_flag_notify_one(volatile atomic_flag* __o) _NOEXCEPT { - __o->notify_one(); -} - -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void atomic_flag_notify_one(atomic_flag* __o) _NOEXCEPT { - __o->notify_one(); -} - -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void -atomic_flag_notify_all(volatile atomic_flag* __o) _NOEXCEPT { - __o->notify_all(); -} - -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void atomic_flag_notify_all(atomic_flag* __o) _NOEXCEPT { - __o->notify_all(); -} +inline _LIBCPP_HIDE_FROM_ABI void atomic_flag_notify_one(volatile atomic_flag* __o) _NOEXCEPT { __o->notify_one(); } +inline _LIBCPP_HIDE_FROM_ABI void atomic_flag_notify_one(atomic_flag* __o) _NOEXCEPT { __o->notify_one(); } +inline _LIBCPP_HIDE_FROM_ABI void atomic_flag_notify_all(volatile atomic_flag* __o) _NOEXCEPT { __o->notify_all(); } +inline _LIBCPP_HIDE_FROM_ABI void atomic_flag_notify_all(atomic_flag* __o) _NOEXCEPT { __o->notify_all(); } #endif // _LIBCPP_STD_VER >= 20 _LIBCPP_END_NAMESPACE_STD diff --git a/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic_ref.h b/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic_ref.h index b5493662c5..ec5ae2c28c 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic_ref.h +++ b/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic_ref.h @@ -20,6 +20,7 @@ #include <__assert> #include <__atomic/atomic_sync.h> #include <__atomic/check_memory_order.h> +#include <__atomic/floating_point_helper.h> #include <__atomic/memory_order.h> #include <__atomic/to_gcc_order.h> #include <__concepts/arithmetic.h> @@ -219,6 +220,9 @@ public: } _LIBCPP_HIDE_FROM_ABI void notify_one() const noexcept { std::__atomic_notify_one(*this); } _LIBCPP_HIDE_FROM_ABI void notify_all() const noexcept { std::__atomic_notify_all(*this); } +# if _LIBCPP_STD_VER >= 26 + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _Tp* address() const noexcept { return __ptr_; } +# endif protected: using _Aligned_Tp [[__gnu__::__aligned__(required_alignment), __gnu__::__nodebug__]] = _Tp; @@ -322,20 +326,28 @@ struct atomic_ref<_Tp> : public __atomic_ref_base<_Tp> { atomic_ref& operator=(const atomic_ref&) = delete; _LIBCPP_HIDE_FROM_ABI _Tp fetch_add(_Tp __arg, memory_order __order = memory_order_seq_cst) const noexcept { - _Tp __old = this->load(memory_order_relaxed); - _Tp __new = __old + __arg; - while (!this->compare_exchange_weak(__old, __new, __order, memory_order_relaxed)) { - __new = __old + __arg; + if constexpr (std::__has_rmw_builtin<_Tp>()) { + return __atomic_fetch_add(this->__ptr_, __arg, std::__to_gcc_order(__order)); + } else { + _Tp __old = this->load(memory_order_relaxed); + _Tp __new = __old + __arg; + while (!this->compare_exchange_weak(__old, __new, __order, memory_order_relaxed)) { + __new = __old + __arg; + } + return __old; } - return __old; } _LIBCPP_HIDE_FROM_ABI _Tp fetch_sub(_Tp __arg, memory_order __order = memory_order_seq_cst) const noexcept { - _Tp __old = this->load(memory_order_relaxed); - _Tp __new = __old - __arg; - while (!this->compare_exchange_weak(__old, __new, __order, memory_order_relaxed)) { - __new = __old - __arg; + if constexpr (std::__has_rmw_builtin<_Tp>()) { + return __atomic_fetch_sub(this->__ptr_, __arg, std::__to_gcc_order(__order)); + } else { + _Tp __old = this->load(memory_order_relaxed); + _Tp __new = __old - __arg; + while (!this->compare_exchange_weak(__old, __new, __order, memory_order_relaxed)) { + __new = __old - __arg; + } + return __old; } - return __old; } _LIBCPP_HIDE_FROM_ABI _Tp operator+=(_Tp __arg) const noexcept { return fetch_add(__arg) + __arg; } diff --git a/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic_sync.h b/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic_sync.h index 0dae448d64..93953dfbc9 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic_sync.h +++ b/naiveproxy/src/third_party/libc++/src/include/__atomic/atomic_sync.h @@ -58,20 +58,16 @@ struct __atomic_waitable< _Tp, #if _LIBCPP_STD_VER >= 20 # if _LIBCPP_HAS_THREADS -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_EXPORTED_FROM_ABI void __cxx_atomic_notify_one(void const volatile*) _NOEXCEPT; -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_EXPORTED_FROM_ABI void __cxx_atomic_notify_all(void const volatile*) _NOEXCEPT; -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_EXPORTED_FROM_ABI __cxx_contention_t -__libcpp_atomic_monitor(void const volatile*) _NOEXCEPT; -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_EXPORTED_FROM_ABI void -__libcpp_atomic_wait(void const volatile*, __cxx_contention_t) _NOEXCEPT; +_LIBCPP_EXPORTED_FROM_ABI void __cxx_atomic_notify_one(void const volatile*) _NOEXCEPT; +_LIBCPP_EXPORTED_FROM_ABI void __cxx_atomic_notify_all(void const volatile*) _NOEXCEPT; +_LIBCPP_EXPORTED_FROM_ABI __cxx_contention_t __libcpp_atomic_monitor(void const volatile*) _NOEXCEPT; +_LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_wait(void const volatile*, __cxx_contention_t) _NOEXCEPT; -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_EXPORTED_FROM_ABI void -__cxx_atomic_notify_one(__cxx_atomic_contention_t const volatile*) _NOEXCEPT; -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_EXPORTED_FROM_ABI void -__cxx_atomic_notify_all(__cxx_atomic_contention_t const volatile*) _NOEXCEPT; -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_EXPORTED_FROM_ABI __cxx_contention_t +_LIBCPP_EXPORTED_FROM_ABI void __cxx_atomic_notify_one(__cxx_atomic_contention_t const volatile*) _NOEXCEPT; +_LIBCPP_EXPORTED_FROM_ABI void __cxx_atomic_notify_all(__cxx_atomic_contention_t const volatile*) _NOEXCEPT; +_LIBCPP_EXPORTED_FROM_ABI __cxx_contention_t __libcpp_atomic_monitor(__cxx_atomic_contention_t const volatile*) _NOEXCEPT; -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_EXPORTED_FROM_ABI void +_LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_wait(__cxx_atomic_contention_t const volatile*, __cxx_contention_t) _NOEXCEPT; template @@ -82,7 +78,6 @@ struct __atomic_wait_backoff_impl { using __waitable_traits _LIBCPP_NODEBUG = __atomic_waitable_traits<__decay_t<_AtomicWaitable> >; - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI bool __update_monitor_val_and_poll(__cxx_atomic_contention_t const volatile*, __cxx_contention_t& __monitor_val) const { // In case the contention type happens to be __cxx_atomic_contention_t, i.e. __cxx_atomic_impl, @@ -95,7 +90,6 @@ struct __atomic_wait_backoff_impl { return __poll_(__monitor_val); } - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI bool __update_monitor_val_and_poll(void const volatile* __contention_address, __cxx_contention_t& __monitor_val) const { // In case the contention type is anything else, platform wait is monitoring a __cxx_atomic_contention_t @@ -105,7 +99,6 @@ struct __atomic_wait_backoff_impl { return __poll_(__current_val); } - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI bool operator()(chrono::nanoseconds __elapsed) const { if (__elapsed > chrono::microseconds(4)) { auto __contention_address = __waitable_traits::__atomic_contention_address(__a_); @@ -128,8 +121,7 @@ struct __atomic_wait_backoff_impl { // `false`, it must set the argument to its current understanding of the atomic // value. The predicate function must not return `false` spuriously. template -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void -__atomic_wait_unless(const _AtomicWaitable& __a, memory_order __order, _Poll&& __poll) { +_LIBCPP_HIDE_FROM_ABI void __atomic_wait_unless(const _AtomicWaitable& __a, memory_order __order, _Poll&& __poll) { static_assert(__atomic_waitable<_AtomicWaitable>::value, ""); __atomic_wait_backoff_impl<_AtomicWaitable, __decay_t<_Poll> > __backoff_fn = {__a, __poll, __order}; std::__libcpp_thread_poll_with_backoff( @@ -142,13 +134,13 @@ __atomic_wait_unless(const _AtomicWaitable& __a, memory_order __order, _Poll&& _ } template -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void __atomic_notify_one(const _AtomicWaitable& __a) { +_LIBCPP_HIDE_FROM_ABI void __atomic_notify_one(const _AtomicWaitable& __a) { static_assert(__atomic_waitable<_AtomicWaitable>::value, ""); std::__cxx_atomic_notify_one(__atomic_waitable_traits<__decay_t<_AtomicWaitable> >::__atomic_contention_address(__a)); } template -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void __atomic_notify_all(const _AtomicWaitable& __a) { +_LIBCPP_HIDE_FROM_ABI void __atomic_notify_all(const _AtomicWaitable& __a) { static_assert(__atomic_waitable<_AtomicWaitable>::value, ""); std::__cxx_atomic_notify_all(__atomic_waitable_traits<__decay_t<_AtomicWaitable> >::__atomic_contention_address(__a)); } @@ -180,8 +172,7 @@ _LIBCPP_HIDE_FROM_ABI bool __cxx_nonatomic_compare_equal(_Tp const& __lhs, _Tp c } template -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void -__atomic_wait(_AtomicWaitable& __a, _Tp __val, memory_order __order) { +_LIBCPP_HIDE_FROM_ABI void __atomic_wait(_AtomicWaitable& __a, _Tp __val, memory_order __order) { static_assert(__atomic_waitable<_AtomicWaitable>::value, ""); std::__atomic_wait_unless(__a, __order, [&](_Tp const& __current) { return !std::__cxx_nonatomic_compare_equal(__current, __val); diff --git a/naiveproxy/src/third_party/libc++/src/include/__atomic/floating_point_helper.h b/naiveproxy/src/third_party/libc++/src/include/__atomic/floating_point_helper.h new file mode 100644 index 0000000000..8762ec234b --- /dev/null +++ b/naiveproxy/src/third_party/libc++/src/include/__atomic/floating_point_helper.h @@ -0,0 +1,55 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ATOMIC_FLOATING_POINT_HELPER_H +#define _LIBCPP___ATOMIC_FLOATING_POINT_HELPER_H + +#include <__config> +#include <__type_traits/is_floating_point.h> +#include <__type_traits/is_same.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER >= 20 + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool __is_fp80_long_double() { + // Only x87-fp80 long double has 64-bit mantissa + return __LDBL_MANT_DIG__ == 64 && std::is_same_v<_Tp, long double>; +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool __has_rmw_builtin() { + static_assert(std::is_floating_point_v<_Tp>); +# ifndef _LIBCPP_COMPILER_CLANG_BASED + return false; +# else + // The builtin __cxx_atomic_fetch_add errors during compilation for + // long double on platforms with fp80 format. + // For more details, see + // lib/Sema/SemaChecking.cpp function IsAllowedValueType + // LLVM Parser does not allow atomicrmw with x86_fp80 type. + // if (ValType->isSpecificBuiltinType(BuiltinType::LongDouble) && + // &Context.getTargetInfo().getLongDoubleFormat() == + // &llvm::APFloat::x87DoubleExtended()) + // For more info + // https://llvm.org/PR68602 + // https://reviews.llvm.org/D53965 + return !std::__is_fp80_long_double<_Tp>(); +# endif +} + +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ATOMIC_FLOATING_POINT_HELPER_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__bit/bit_log2.h b/naiveproxy/src/third_party/libc++/src/include/__bit/bit_log2.h index 8077cd91d6..9ceeec1b2b 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__bit/bit_log2.h +++ b/naiveproxy/src/third_party/libc++/src/include/__bit/bit_log2.h @@ -9,6 +9,7 @@ #ifndef _LIBCPP___BIT_BIT_LOG2_H #define _LIBCPP___BIT_BIT_LOG2_H +#include <__assert> #include <__bit/countl.h> #include <__config> #include <__type_traits/integer_traits.h> @@ -23,6 +24,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD template _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp __bit_log2(_Tp __t) _NOEXCEPT { static_assert(__is_unsigned_integer_v<_Tp>, "__bit_log2 requires an unsigned integer type"); + _LIBCPP_ASSERT_INTERNAL(__t != 0, "logarithm of 0 is undefined"); return numeric_limits<_Tp>::digits - 1 - std::__countl_zero(__t); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__bit/countl.h b/naiveproxy/src/third_party/libc++/src/include/__bit/countl.h index 0759140208..c95828f58d 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__bit/countl.h +++ b/naiveproxy/src/third_party/libc++/src/include/__bit/countl.h @@ -24,7 +24,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD template _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 int __countl_zero(_Tp __t) _NOEXCEPT { - static_assert(__is_unsigned_integer_v<_Tp>, "__countl_zero requires an unsigned integer type"); return __builtin_clzg(__t, numeric_limits<_Tp>::digits); } @@ -37,7 +36,7 @@ template <__unsigned_integer _Tp> template <__unsigned_integer _Tp> [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr int countl_one(_Tp __t) noexcept { - return __t != numeric_limits<_Tp>::max() ? std::countl_zero(static_cast<_Tp>(~__t)) : numeric_limits<_Tp>::digits; + return std::countl_zero(static_cast<_Tp>(~__t)); } #endif // _LIBCPP_STD_VER >= 20 diff --git a/naiveproxy/src/third_party/libc++/src/include/__bit/countr.h b/naiveproxy/src/third_party/libc++/src/include/__bit/countr.h index f6c98695d3..16f689d6da 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__bit/countr.h +++ b/naiveproxy/src/third_party/libc++/src/include/__bit/countr.h @@ -24,7 +24,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD template [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __countr_zero(_Tp __t) _NOEXCEPT { - static_assert(__is_unsigned_integer_v<_Tp>, "__countr_zero only works with unsigned types"); return __builtin_ctzg(__t, numeric_limits<_Tp>::digits); } @@ -37,7 +36,7 @@ template <__unsigned_integer _Tp> template <__unsigned_integer _Tp> [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr int countr_one(_Tp __t) noexcept { - return __t != numeric_limits<_Tp>::max() ? std::countr_zero(static_cast<_Tp>(~__t)) : numeric_limits<_Tp>::digits; + return std::countr_zero(static_cast<_Tp>(~__t)); } #endif // _LIBCPP_STD_VER >= 20 diff --git a/naiveproxy/src/third_party/libc++/src/include/__bit/has_single_bit.h b/naiveproxy/src/third_party/libc++/src/include/__bit/has_single_bit.h index b43e69323e..d10ab7d6c1 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__bit/has_single_bit.h +++ b/naiveproxy/src/third_party/libc++/src/include/__bit/has_single_bit.h @@ -25,7 +25,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD template <__unsigned_integer _Tp> [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool has_single_bit(_Tp __t) noexcept { - return __t != 0 && (((__t & (__t - 1)) == 0)); + return __t != 0 && ((__t & (__t - 1)) == 0); } _LIBCPP_END_NAMESPACE_STD diff --git a/naiveproxy/src/third_party/libc++/src/include/__bit/popcount.h b/naiveproxy/src/third_party/libc++/src/include/__bit/popcount.h index 8d9ba09938..d104c8e8f0 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__bit/popcount.h +++ b/naiveproxy/src/third_party/libc++/src/include/__bit/popcount.h @@ -23,7 +23,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD template [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __popcount(_Tp __t) _NOEXCEPT { - static_assert(__is_unsigned_integer_v<_Tp>, "__popcount only works with unsigned types"); return __builtin_popcountg(__t); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__bit/rotate.h b/naiveproxy/src/third_party/libc++/src/include/__bit/rotate.h index c6f34bdaf6..fde9058887 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__bit/rotate.h +++ b/naiveproxy/src/third_party/libc++/src/include/__bit/rotate.h @@ -22,46 +22,35 @@ _LIBCPP_BEGIN_NAMESPACE_STD // Writing two full functions for rotl and rotr makes it easier for the compiler // to optimize the code. On x86 this function becomes the ROL instruction and // the rotr function becomes the ROR instruction. -template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp __rotl(_Tp __x, int __s) _NOEXCEPT { - static_assert(__is_unsigned_integer_v<_Tp>, "__rotl requires an unsigned integer type"); - const int __n = numeric_limits<_Tp>::digits; - int __r = __s % __n; - - if (__r == 0) - return __x; - - if (__r > 0) - return (__x << __r) | (__x >> (__n - __r)); - - return (__x >> -__r) | (__x << (__n + __r)); -} - -template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp __rotr(_Tp __x, int __s) _NOEXCEPT { - static_assert(__is_unsigned_integer_v<_Tp>, "__rotr requires an unsigned integer type"); - const int __n = numeric_limits<_Tp>::digits; - int __r = __s % __n; - - if (__r == 0) - return __x; - - if (__r > 0) - return (__x >> __r) | (__x << (__n - __r)); - - return (__x << -__r) | (__x >> (__n + __r)); -} #if _LIBCPP_STD_VER >= 20 template <__unsigned_integer _Tp> [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _Tp rotl(_Tp __t, int __cnt) noexcept { - return std::__rotl(__t, __cnt); + const int __n = numeric_limits<_Tp>::digits; + int __r = __cnt % __n; + + if (__r == 0) + return __t; + + if (__r > 0) + return (__t << __r) | (__t >> (__n - __r)); + + return (__t >> -__r) | (__t << (__n + __r)); } template <__unsigned_integer _Tp> [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _Tp rotr(_Tp __t, int __cnt) noexcept { - return std::__rotr(__t, __cnt); + const int __n = numeric_limits<_Tp>::digits; + int __r = __cnt % __n; + + if (__r == 0) + return __t; + + if (__r > 0) + return (__t >> __r) | (__t << (__n - __r)); + + return (__t << -__r) | (__t >> (__n + __r)); } #endif // _LIBCPP_STD_VER >= 20 diff --git a/naiveproxy/src/third_party/libc++/src/include/__charconv/from_chars_result.h b/naiveproxy/src/third_party/libc++/src/include/__charconv/from_chars_result.h index a7bfd6530a..b4ecea3d11 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__charconv/from_chars_result.h +++ b/naiveproxy/src/third_party/libc++/src/include/__charconv/from_chars_result.h @@ -21,7 +21,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 17 -struct _LIBCPP_EXPORTED_FROM_ABI from_chars_result { +struct from_chars_result { const char* ptr; errc ec; # if _LIBCPP_STD_VER >= 20 diff --git a/naiveproxy/src/third_party/libc++/src/include/__charconv/to_chars_result.h b/naiveproxy/src/third_party/libc++/src/include/__charconv/to_chars_result.h index 41dea4ab14..a3cd4e28d0 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__charconv/to_chars_result.h +++ b/naiveproxy/src/third_party/libc++/src/include/__charconv/to_chars_result.h @@ -21,7 +21,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 17 -struct _LIBCPP_EXPORTED_FROM_ABI to_chars_result { +struct to_chars_result { char* ptr; errc ec; # if _LIBCPP_STD_VER >= 20 diff --git a/naiveproxy/src/third_party/libc++/src/include/__chrono/file_clock.h b/naiveproxy/src/third_party/libc++/src/include/__chrono/file_clock.h index b4b7e9dc14..1885f0facc 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__chrono/file_clock.h +++ b/naiveproxy/src/third_party/libc++/src/include/__chrono/file_clock.h @@ -60,7 +60,7 @@ struct _FilesystemClock { _LIBCPP_EXPORTED_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX14 const bool is_steady = false; - _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY _LIBCPP_EXPORTED_FROM_ABI static time_point now() noexcept; + _LIBCPP_EXPORTED_FROM_ABI static time_point now() noexcept; # if _LIBCPP_STD_VER >= 20 template diff --git a/naiveproxy/src/third_party/libc++/src/include/__chrono/time_point.h b/naiveproxy/src/third_party/libc++/src/include/__chrono/time_point.h index fc4408d23d..bc2c7798a6 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__chrono/time_point.h +++ b/naiveproxy/src/third_party/libc++/src/include/__chrono/time_point.h @@ -95,7 +95,7 @@ struct common_type, chrono::time_point<_C namespace chrono { -template +template , int> = 0> inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 time_point<_Clock, _ToDuration> time_point_cast(const time_point<_Clock, _Duration>& __t) { return time_point<_Clock, _ToDuration>(chrono::duration_cast<_ToDuration>(__t.time_since_epoch())); diff --git a/naiveproxy/src/third_party/libc++/src/include/__compare/strong_order.h b/naiveproxy/src/third_party/libc++/src/include/__compare/strong_order.h index 8c363b5638..ba6de44643 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__compare/strong_order.h +++ b/naiveproxy/src/third_party/libc++/src/include/__compare/strong_order.h @@ -13,7 +13,6 @@ #include <__compare/compare_three_way.h> #include <__compare/ordering.h> #include <__config> -#include <__math/exponential_functions.h> #include <__math/traits.h> #include <__type_traits/conditional.h> #include <__type_traits/decay.h> @@ -53,38 +52,21 @@ struct __fn { template > requires is_same_v<_Dp, decay_t<_Up>> && is_floating_point_v<_Dp> _LIBCPP_HIDE_FROM_ABI static constexpr strong_ordering __go(_Tp&& __t, _Up&& __u, __priority_tag<1>) noexcept { - if constexpr (numeric_limits<_Dp>::is_iec559 && sizeof(_Dp) == sizeof(int32_t)) { - int32_t __rx = std::bit_cast(__t); - int32_t __ry = std::bit_cast(__u); - __rx = (__rx < 0) ? (numeric_limits::min() - __rx - 1) : __rx; - __ry = (__ry < 0) ? (numeric_limits::min() - __ry - 1) : __ry; - return (__rx <=> __ry); - } else if constexpr (numeric_limits<_Dp>::is_iec559 && sizeof(_Dp) == sizeof(int64_t)) { - int64_t __rx = std::bit_cast(__t); - int64_t __ry = std::bit_cast(__u); - __rx = (__rx < 0) ? (numeric_limits::min() - __rx - 1) : __rx; - __ry = (__ry < 0) ? (numeric_limits::min() - __ry - 1) : __ry; + if constexpr (numeric_limits<_Dp>::is_iec559 && + (sizeof(_Dp) == sizeof(int32_t) || sizeof(_Dp) == sizeof(int64_t))) { + using _IntT = conditional_t; + _IntT __rx = std::bit_cast<_IntT>(__t); + _IntT __ry = std::bit_cast<_IntT>(__u); + __rx = (__rx < 0) ? (numeric_limits<_IntT>::min() - __rx - 1) : __rx; + __ry = (__ry < 0) ? (numeric_limits<_IntT>::min() - __ry - 1) : __ry; return (__rx <=> __ry); } else if (__t < __u) { return strong_ordering::less; } else if (__t > __u) { return strong_ordering::greater; } else if (__t == __u) { - if constexpr (numeric_limits<_Dp>::radix == 2) { - return __math::signbit(__u) <=> __math::signbit(__t); - } else { - // This is bullet 3 of the IEEE754 algorithm, relevant - // only for decimal floating-point; - // see https://stackoverflow.com/questions/69068075/ - if (__t == 0 || __math::isinf(__t)) { - return __math::signbit(__u) <=> __math::signbit(__t); - } else { - int __texp, __uexp; - (void)__math::frexp(__t, &__texp); - (void)__math::frexp(__u, &__uexp); - return (__t < 0) ? (__texp <=> __uexp) : (__uexp <=> __texp); - } - } + static_assert(numeric_limits<_Dp>::radix == 2, "floating point type with a radix other than 2?"); + return __math::signbit(__u) <=> __math::signbit(__t); } else { // They're unordered, so one of them must be a NAN. // The order is -QNAN, -SNAN, numbers, +SNAN, +QNAN. @@ -93,9 +75,9 @@ struct __fn { bool __t_is_negative = __math::signbit(__t); bool __u_is_negative = __math::signbit(__u); using _IntType = - conditional_t< sizeof(__t) == sizeof(int32_t), - int32_t, - conditional_t< sizeof(__t) == sizeof(int64_t), int64_t, void> >; + conditional_t>; if constexpr (is_same_v<_IntType, void>) { static_assert(sizeof(_Dp) == 0, "std::strong_order is unimplemented for this floating-point type"); } else if (__t_is_nan && __u_is_nan) { diff --git a/naiveproxy/src/third_party/libc++/src/include/__config b/naiveproxy/src/third_party/libc++/src/include/__config index 77a71b6cf1..b4c081dcdf 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__config +++ b/naiveproxy/src/third_party/libc++/src/include/__config @@ -934,7 +934,7 @@ typedef __char32_t char32_t; # endif # endif -# if defined(__FreeBSD__) && defined(__clang__) && __has_attribute(__no_thread_safety_analysis__) +# if __has_attribute(__no_thread_safety_analysis__) # define _LIBCPP_NO_THREAD_SAFETY_ANALYSIS __attribute__((__no_thread_safety_analysis__)) # else # define _LIBCPP_NO_THREAD_SAFETY_ANALYSIS @@ -1156,6 +1156,13 @@ typedef __char32_t char32_t; # define _LIBCPP_LIFETIMEBOUND # endif +// This is to work around https://llvm.org/PR156809 +# ifndef _LIBCPP_CXX03_LANG +# define _LIBCPP_CTOR_LIFETIMEBOUND _LIBCPP_LIFETIMEBOUND +# else +# define _LIBCPP_CTOR_LIFETIMEBOUND +# endif + # if __has_cpp_attribute(_Clang::__noescape__) # define _LIBCPP_NOESCAPE [[_Clang::__noescape__]] # else @@ -1169,12 +1176,6 @@ typedef __char32_t char32_t; # define _LIBCPP_NO_SPECIALIZATIONS # endif -# if __has_cpp_attribute(_Clang::__standalone_debug__) -# define _LIBCPP_STANDALONE_DEBUG [[_Clang::__standalone_debug__]] -# else -# define _LIBCPP_STANDALONE_DEBUG -# endif - # if __has_cpp_attribute(_Clang::__preferred_name__) # define _LIBCPP_PREFERRED_NAME(x) [[_Clang::__preferred_name__(x)]] # else diff --git a/naiveproxy/src/third_party/libc++/src/include/__configuration/abi.h b/naiveproxy/src/third_party/libc++/src/include/__configuration/abi.h index a75cd0a675..c9936df30f 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__configuration/abi.h +++ b/naiveproxy/src/third_party/libc++/src/include/__configuration/abi.h @@ -30,8 +30,20 @@ #elif _LIBCPP_ABI_FORCE_MICROSOFT # define _LIBCPP_ABI_MICROSOFT #else +// Windows uses the Microsoft ABI # if defined(_WIN32) && defined(_MSC_VER) # define _LIBCPP_ABI_MICROSOFT + +// 32-bit ARM uses the Itanium ABI with a few differences (array cookies, etc), +// and so does 64-bit ARM on Apple platforms. +# elif defined(__arm__) || (defined(__APPLE__) && defined(__aarch64__)) +# define _LIBCPP_ABI_ITANIUM_WITH_ARM_DIFFERENCES + +// Non-Apple 64-bit ARM uses the vanilla Itanium ABI +# elif defined(__aarch64__) +# define _LIBCPP_ABI_ITANIUM + +// We assume that other architectures also use the vanilla Itanium ABI too # else # define _LIBCPP_ABI_ITANIUM # endif @@ -72,6 +84,7 @@ # define _LIBCPP_ABI_NO_FILESYSTEM_INLINE_NAMESPACE # define _LIBCPP_ABI_NO_ITERATOR_BASES # define _LIBCPP_ABI_NO_RANDOM_DEVICE_COMPATIBILITY_LAYOUT +# define _LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER # define _LIBCPP_ABI_OPTIMIZED_FUNCTION # define _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO # define _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION @@ -98,11 +111,20 @@ # endif #endif +// TODO(LLVM 22): Remove this check +#if defined(_LIBCPP_ABI_NO_ITERATOR_BASES) && !defined(_LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER) +# ifndef _LIBCPP_ONLY_NO_ITERATOR_BASES +# error "You probably want to define _LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER. This has been split out from" \ + " _LIBCPP_ABI_NO_ITERATOR_BASES to allow only removing the second iterator member, since they aren't really related." \ + "If you actually want this ABI configuration, please define _LIBCPP_ONLY_NO_ITERATOR_BASES instead." +# endif +#endif + // We had some bugs where we use [[no_unique_address]] together with construct_at, // which causes UB as the call on construct_at could write to overlapping subobjects // -// https://github.com/llvm/llvm-project/issues/70506 -// https://github.com/llvm/llvm-project/issues/70494 +// https://llvm.org/PR70506 +// https://llvm.org/PR70494 // // To fix the bug we had to change the ABI of some classes to remove [[no_unique_address]] under certain conditions. // The macro below is used for all classes whose ABI have changed as part of fixing these bugs. diff --git a/naiveproxy/src/third_party/libc++/src/include/__configuration/availability.h b/naiveproxy/src/third_party/libc++/src/include/__configuration/availability.h index ae58e36b50..d0414ecfac 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__configuration/availability.h +++ b/naiveproxy/src/third_party/libc++/src/include/__configuration/availability.h @@ -72,7 +72,7 @@ // // We also allow users to force-disable availability markup via the `_LIBCPP_DISABLE_AVAILABILITY` // macro because that is the only way to work around a Clang bug related to availability -// attributes: https://github.com/llvm/llvm-project/issues/134151. +// attributes: https://llvm.org/PR134151. // Once that bug has been fixed, we should remove the macro. #if defined(_LIBCPP_BUILDING_LIBRARY) || defined(_LIBCXXABI_BUILDING_LIBRARY) || \ !defined(_LIBCPP_COMPILER_CLANG_BASED) || defined(_LIBCPP_DISABLE_AVAILABILITY) @@ -108,14 +108,6 @@ # define _LIBCPP_INTRODUCED_IN_LLVM_12 1 # define _LIBCPP_INTRODUCED_IN_LLVM_12_ATTRIBUTE /* nothing */ -# define _LIBCPP_INTRODUCED_IN_LLVM_11 1 -# define _LIBCPP_INTRODUCED_IN_LLVM_11_ATTRIBUTE /* nothing */ - -# define _LIBCPP_INTRODUCED_IN_LLVM_9 1 -# define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE /* nothing */ -# define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_PUSH /* nothing */ -# define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_POP /* nothing */ - #elif defined(__APPLE__) // clang-format off @@ -215,48 +207,6 @@ __attribute__((availability(bridgeos, strict, introduced = 6.0))) \ __attribute__((availability(driverkit, strict, introduced = 21.3))) -// LLVM 11 -# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 110000) || \ - (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 140000) || \ - (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 140000) || \ - (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 70000) -# define _LIBCPP_INTRODUCED_IN_LLVM_11 0 -# else -# define _LIBCPP_INTRODUCED_IN_LLVM_11 1 -# endif -# define _LIBCPP_INTRODUCED_IN_LLVM_11_ATTRIBUTE \ - __attribute__((availability(macos, strict, introduced = 11.0))) \ - __attribute__((availability(ios, strict, introduced = 14.0))) \ - __attribute__((availability(tvos, strict, introduced = 14.0))) \ - __attribute__((availability(watchos, strict, introduced = 7.0))) - -// LLVM 9 -# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101500) || \ - (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 130000) || \ - (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 130000) || \ - (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 60000) -# define _LIBCPP_INTRODUCED_IN_LLVM_9 0 -# else -# define _LIBCPP_INTRODUCED_IN_LLVM_9 1 -# endif -# define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE \ - __attribute__((availability(macos, strict, introduced = 10.15))) \ - __attribute__((availability(ios, strict, introduced = 13.0))) \ - __attribute__((availability(tvos, strict, introduced = 13.0))) \ - __attribute__((availability(watchos, strict, introduced = 6.0))) -# define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_PUSH \ - _Pragma("clang attribute push(__attribute__((availability(macos,strict,introduced=10.15))), apply_to=any(function,record))") \ - _Pragma("clang attribute push(__attribute__((availability(ios,strict,introduced=13.0))), apply_to=any(function,record))") \ - _Pragma("clang attribute push(__attribute__((availability(tvos,strict,introduced=13.0))), apply_to=any(function,record))") \ - _Pragma("clang attribute push(__attribute__((availability(watchos,strict,introduced=6.0))), apply_to=any(function,record))") -# define _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_POP \ - _Pragma("clang attribute pop") \ - _Pragma("clang attribute pop") \ - _Pragma("clang attribute pop") \ - _Pragma("clang attribute pop") - -// clang-format on - #else // ...New vendors can add availability markup here... @@ -266,20 +216,6 @@ #endif -// These macros control the availability of all parts of that -// depend on something in the dylib. -#define _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_LIBRARY _LIBCPP_INTRODUCED_IN_LLVM_9 -#define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE -#define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_PUSH _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_PUSH -#define _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_POP _LIBCPP_INTRODUCED_IN_LLVM_9_ATTRIBUTE_POP - -// This controls the availability of the C++20 synchronization library, -// which requires shared library support for various operations -// (see libcxx/src/atomic.cpp). This includes , , -// , and notification functions on std::atomic. -#define _LIBCPP_AVAILABILITY_HAS_SYNC _LIBCPP_INTRODUCED_IN_LLVM_11 -#define _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INTRODUCED_IN_LLVM_11_ATTRIBUTE - // Enable additional explicit instantiations of iostreams components. This // reduces the number of weak definitions generated in programs that use // iostreams by providing a single strong definition in the shared library. @@ -307,7 +243,7 @@ // This controls the availability of the C++17 std::pmr library, // which is implemented in large part in the built library. // -// TODO: Enable std::pmr markup once https://github.com/llvm/llvm-project/issues/40340 has been fixed +// TODO: Enable std::pmr markup once https://llvm.org/PR40340 has been fixed // Until then, it is possible for folks to try to use `std::pmr` when back-deploying to targets that don't support // it and it'll be a load-time error, but we don't have a good alternative because the library won't compile if we // use availability annotations until that bug has been fixed. diff --git a/naiveproxy/src/third_party/libc++/src/include/__coroutine/noop_coroutine_handle.h b/naiveproxy/src/third_party/libc++/src/include/__coroutine/noop_coroutine_handle.h index 2b2838b6bf..692398a8a8 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__coroutine/noop_coroutine_handle.h +++ b/naiveproxy/src/third_party/libc++/src/include/__coroutine/noop_coroutine_handle.h @@ -20,8 +20,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD -# if __has_builtin(__builtin_coro_noop) || defined(_LIBCPP_COMPILER_GCC) - // [coroutine.noop] // [coroutine.promise.noop] struct noop_coroutine_promise {}; @@ -56,12 +54,12 @@ public: private: _LIBCPP_HIDE_FROM_ABI friend coroutine_handle noop_coroutine() noexcept; -# if __has_builtin(__builtin_coro_noop) +# if __has_builtin(__builtin_coro_noop) _LIBCPP_HIDE_FROM_ABI coroutine_handle() noexcept { this->__handle_ = __builtin_coro_noop(); } void* __handle_ = nullptr; -# elif defined(_LIBCPP_COMPILER_GCC) +# elif defined(_LIBCPP_COMPILER_GCC) // GCC doesn't implement __builtin_coro_noop(). // Construct the coroutine frame manually instead. struct __noop_coroutine_frame_ty_ { @@ -78,20 +76,18 @@ private: _LIBCPP_HIDE_FROM_ABI coroutine_handle() noexcept = default; -# endif // __has_builtin(__builtin_coro_noop) +# endif // __has_builtin(__builtin_coro_noop) }; using noop_coroutine_handle = coroutine_handle; -# if defined(_LIBCPP_COMPILER_GCC) +# if defined(_LIBCPP_COMPILER_GCC) inline noop_coroutine_handle::__noop_coroutine_frame_ty_ noop_coroutine_handle::__noop_coroutine_frame_{}; -# endif +# endif // [coroutine.noop.coroutine] inline _LIBCPP_HIDE_FROM_ABI noop_coroutine_handle noop_coroutine() noexcept { return noop_coroutine_handle(); } -# endif // __has_builtin(__builtin_coro_noop) || defined(_LIBCPP_COMPILER_GCC) - _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP_STD_VER >= 20 diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__algorithm/count.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__algorithm/count.h index 5440fd031a..5b05b4b71f 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__algorithm/count.h +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__algorithm/count.h @@ -54,18 +54,18 @@ __count_bool(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) if (__first.__ctz_ != 0) { __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); __storage_type __dn = std::min(__clz_f, __n); - __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); - __r = std::__libcpp_popcount(std::__invert_if(*__first.__seg_) & __m); + __storage_type __m = (__storage_type(~0) << __first.__ctz_) & (__storage_type(~0) >> (__clz_f - __dn)); + __r = std::__libcpp_popcount<__storage_type>(std::__invert_if(*__first.__seg_) & __m); __n -= __dn; ++__first.__seg_; } // do middle whole words for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) - __r += std::__libcpp_popcount(std::__invert_if(*__first.__seg_)); + __r += std::__libcpp_popcount<__storage_type>(std::__invert_if(*__first.__seg_)); // do last partial word if (__n > 0) { - __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); - __r += std::__libcpp_popcount(std::__invert_if(*__first.__seg_) & __m); + __storage_type __m = __storage_type(~0) >> (__bits_per_word - __n); + __r += std::__libcpp_popcount<__storage_type>(std::__invert_if(*__first.__seg_) & __m); } return __r; } diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__algorithm/find.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__algorithm/find.h index ddf8201c6e..baa8e4ccd0 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__algorithm/find.h +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__algorithm/find.h @@ -105,7 +105,7 @@ __find_bool(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); __storage_type __b = std::__invert_if(*__first.__seg_) & __m; if (__b) - return _It(__first.__seg_, static_cast(std::__libcpp_ctz(__b))); + return _It(__first.__seg_, static_cast(std::__countr_zero(__b))); if (__n == __dn) return __first + __n; __n -= __dn; @@ -115,14 +115,14 @@ __find_bool(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) { __storage_type __b = std::__invert_if(*__first.__seg_); if (__b) - return _It(__first.__seg_, static_cast(std::__libcpp_ctz(__b))); + return _It(__first.__seg_, static_cast(std::__countr_zero(__b))); } // do last partial word if (__n > 0) { __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); __storage_type __b = std::__invert_if(*__first.__seg_) & __m; if (__b) - return _It(__first.__seg_, static_cast(std::__libcpp_ctz(__b))); + return _It(__first.__seg_, static_cast(std::__countr_zero(__b))); } return _It(__first.__seg_, static_cast(__n)); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__algorithm/for_each.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__algorithm/for_each.h index d160a9eddc..1ffb0137c0 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__algorithm/for_each.h +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__algorithm/for_each.h @@ -14,15 +14,11 @@ #include <__cxx03/__config> #include <__cxx03/__iterator/segmented_iterator.h> #include <__cxx03/__type_traits/enable_if.h> -#include <__cxx03/__utility/move.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif -_LIBCPP_PUSH_MACROS -#include <__cxx03/__undef_macros> - _LIBCPP_BEGIN_NAMESPACE_STD template @@ -34,6 +30,4 @@ _LIBCPP_HIDE_FROM_ABI _Function for_each(_InputIterator __first, _InputIterator _LIBCPP_END_NAMESPACE_STD -_LIBCPP_POP_MACROS - #endif // _LIBCPP___CXX03___ALGORITHM_FOR_EACH_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__atomic/atomic.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__atomic/atomic.h index bc4a3937ce..f2e849318d 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__atomic/atomic.h +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__atomic/atomic.h @@ -34,9 +34,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD template struct atomic : public __atomic_base<_Tp> { - using __base = __atomic_base<_Tp>; - using value_type = _Tp; - using difference_type = value_type; + using __base = __atomic_base<_Tp>; _LIBCPP_HIDE_FROM_ABI atomic() _NOEXCEPT = default; @@ -59,8 +57,8 @@ struct atomic : public __atomic_base<_Tp> { template struct atomic<_Tp*> : public __atomic_base<_Tp*> { - using __base = __atomic_base<_Tp*>; - using value_type = _Tp*; + using __base = __atomic_base<_Tp*>; + using difference_type = ptrdiff_t; _LIBCPP_HIDE_FROM_ABI atomic() _NOEXCEPT = default; diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__atomic/atomic_base.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__atomic/atomic_base.h index a2b40c6a7e..d79ef7d78c 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__atomic/atomic_base.h +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__atomic/atomic_base.h @@ -32,6 +32,8 @@ struct __atomic_base // false { mutable __cxx_atomic_impl<_Tp> __a_; + using value_type = _Tp; + _LIBCPP_HIDE_FROM_ABI bool is_lock_free() const volatile _NOEXCEPT { return __cxx_atomic_is_lock_free(sizeof(__cxx_atomic_impl<_Tp>)); } @@ -127,6 +129,8 @@ template struct __atomic_base<_Tp, true> : public __atomic_base<_Tp, false> { using __base = __atomic_base<_Tp, false>; + using difference_type = typename __base::value_type; + _LIBCPP_HIDE_FROM_ABI __atomic_base() _NOEXCEPT = default; _LIBCPP_HIDE_FROM_ABI __atomic_base(_Tp __d) _NOEXCEPT : __base(__d) {} diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__bit/popcount.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__bit/popcount.h index 64404d2cf4..a61a92177c 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__bit/popcount.h +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__bit/popcount.h @@ -6,9 +6,6 @@ // //===----------------------------------------------------------------------===// -// TODO: __builtin_popcountg is available since Clang 19 and GCC 14. When support for older versions is dropped, we can -// refactor this code to exclusively use __builtin_popcountg. - #ifndef _LIBCPP___CXX03___BIT_POPCOUNT_H #define _LIBCPP___CXX03___BIT_POPCOUNT_H @@ -25,12 +22,9 @@ _LIBCPP_PUSH_MACROS _LIBCPP_BEGIN_NAMESPACE_STD -inline _LIBCPP_HIDE_FROM_ABI int __libcpp_popcount(unsigned __x) _NOEXCEPT { return __builtin_popcount(__x); } - -inline _LIBCPP_HIDE_FROM_ABI int __libcpp_popcount(unsigned long __x) _NOEXCEPT { return __builtin_popcountl(__x); } - -inline _LIBCPP_HIDE_FROM_ABI int __libcpp_popcount(unsigned long long __x) _NOEXCEPT { - return __builtin_popcountll(__x); +template +_LIBCPP_HIDE_FROM_ABI int __libcpp_popcount(_Tp __v) { + return __builtin_popcountg(__v); } _LIBCPP_END_NAMESPACE_STD diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__bit_reference b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__bit_reference index 76027e2d15..ac0005ff00 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__bit_reference +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__bit_reference @@ -167,7 +167,7 @@ _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> __copy_aligned( unsigned __clz = __bits_per_word - __first.__ctz_; difference_type __dn = std::min(static_cast(__clz), __n); __n -= __dn; - __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn)); + __storage_type __m = (__storage_type(~0) << __first.__ctz_) & (__storage_type(~0) >> (__clz - __dn)); __storage_type __b = *__first.__seg_ & __m; *__result.__seg_ &= ~__m; *__result.__seg_ |= __b; @@ -185,7 +185,7 @@ _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> __copy_aligned( // do last word if (__n > 0) { __first.__seg_ += __nw; - __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __m = __storage_type(~0) >> (__bits_per_word - __n); __storage_type __b = *__first.__seg_ & __m; *__result.__seg_ &= ~__m; *__result.__seg_ |= __b; @@ -210,11 +210,11 @@ _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> __copy_unaligned( unsigned __clz_f = __bits_per_word - __first.__ctz_; difference_type __dn = std::min(static_cast(__clz_f), __n); __n -= __dn; - __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __m = (__storage_type(~0) << __first.__ctz_) & (__storage_type(~0) >> (__clz_f - __dn)); __storage_type __b = *__first.__seg_ & __m; unsigned __clz_r = __bits_per_word - __result.__ctz_; __storage_type __ddn = std::min<__storage_type>(__dn, __clz_r); - __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); + __m = (__storage_type(~0) << __result.__ctz_) & (__storage_type(~0) >> (__clz_r - __ddn)); *__result.__seg_ &= ~__m; if (__result.__ctz_ > __first.__ctz_) *__result.__seg_ |= __b << (__result.__ctz_ - __first.__ctz_); @@ -224,7 +224,7 @@ _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> __copy_unaligned( __result.__ctz_ = static_cast((__ddn + __result.__ctz_) % __bits_per_word); __dn -= __ddn; if (__dn > 0) { - __m = ~__storage_type(0) >> (__bits_per_word - __dn); + __m = __storage_type(~0) >> (__bits_per_word - __dn); *__result.__seg_ &= ~__m; *__result.__seg_ |= __b >> (__first.__ctz_ + __ddn); __result.__ctz_ = static_cast(__dn); @@ -235,7 +235,7 @@ _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> __copy_unaligned( // __first.__ctz_ == 0; // do middle words unsigned __clz_r = __bits_per_word - __result.__ctz_; - __storage_type __m = ~__storage_type(0) << __result.__ctz_; + __storage_type __m = __storage_type(~0) << __result.__ctz_; for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_) { __storage_type __b = *__first.__seg_; *__result.__seg_ &= ~__m; @@ -246,17 +246,17 @@ _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> __copy_unaligned( } // do last word if (__n > 0) { - __m = ~__storage_type(0) >> (__bits_per_word - __n); + __m = __storage_type(~0) >> (__bits_per_word - __n); __storage_type __b = *__first.__seg_ & __m; __storage_type __dn = std::min(__n, static_cast(__clz_r)); - __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn)); + __m = (__storage_type(~0) << __result.__ctz_) & (__storage_type(~0) >> (__clz_r - __dn)); *__result.__seg_ &= ~__m; *__result.__seg_ |= __b << __result.__ctz_; __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; __result.__ctz_ = static_cast((__dn + __result.__ctz_) % __bits_per_word); __n -= __dn; if (__n > 0) { - __m = ~__storage_type(0) >> (__bits_per_word - __n); + __m = __storage_type(~0) >> (__bits_per_word - __n); *__result.__seg_ &= ~__m; *__result.__seg_ |= __b >> __dn; __result.__ctz_ = static_cast(__n); diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__chrono/time_point.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__chrono/time_point.h index 8ec687d837..7f2a73af83 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__chrono/time_point.h +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__chrono/time_point.h @@ -81,7 +81,7 @@ common_type, chrono::time_point<_Clock, _ namespace chrono { -template +template ::value, int> = 0> inline _LIBCPP_HIDE_FROM_ABI time_point<_Clock, _ToDuration> time_point_cast(const time_point<_Clock, _Duration>& __t) { return time_point<_Clock, _ToDuration>(chrono::duration_cast<_ToDuration>(__t.time_since_epoch())); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__config b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__config index 9b88a49505..d574eab8a1 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__config +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__config @@ -622,18 +622,6 @@ typedef __char32_t char32_t; # define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION # endif -// It is not yet possible to use aligned_alloc() on all Apple platforms since -// 10.15 was the first version to ship an implementation of aligned_alloc(). -# if defined(__APPLE__) -# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \ - __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101500) -# define _LIBCPP_HAS_NO_C11_ALIGNED_ALLOC -# endif -# elif defined(__ANDROID__) && __ANDROID_API__ < 28 -// Android only provides aligned_alloc when targeting API 28 or higher. -# define _LIBCPP_HAS_NO_C11_ALIGNED_ALLOC -# endif - # if defined(__APPLE__) || defined(__FreeBSD__) # define _LIBCPP_HAS_DEFAULTRUNELOCALE # endif diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__iterator/prev.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__iterator/prev.h index dc1bdaf584..32f6e66dac 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__iterator/prev.h +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__iterator/prev.h @@ -15,16 +15,20 @@ #include <__cxx03/__iterator/advance.h> #include <__cxx03/__iterator/iterator_traits.h> #include <__cxx03/__type_traits/enable_if.h> +#include <__cxx03/__utility/move.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif +_LIBCPP_PUSH_MACROS +#include <__cxx03/__undef_macros> + _LIBCPP_BEGIN_NAMESPACE_STD template ::value, int> = 0> inline _LIBCPP_HIDE_FROM_ABI _InputIter -prev(_InputIter __x, typename iterator_traits<_InputIter>::difference_type __n = 1) { +prev(_InputIter __x, typename iterator_traits<_InputIter>::difference_type __n) { // Calling `advance` with a negative value on a non-bidirectional iterator is a no-op in the current implementation. // Note that this check duplicates the similar check in `std::advance`. _LIBCPP_ASSERT_PEDANTIC(__n <= 0 || __has_bidirectional_iterator_category<_InputIter>::value, @@ -33,6 +37,18 @@ prev(_InputIter __x, typename iterator_traits<_InputIter>::difference_type __n = return __x; } +// LWG 3197 +// It is unclear what the implications of "BidirectionalIterator" in the standard are. +// However, calling std::prev(non-bidi-iterator) is obviously an error and we should catch it at compile time. +template ::value, int> = 0> +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _InputIter prev(_InputIter __it) { + static_assert(__has_bidirectional_iterator_category<_InputIter>::value, + "Attempt to prev(it) with a non-bidirectional iterator"); + return std::prev(std::move(__it), 1); +} + +_LIBCPP_POP_MACROS + _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___CXX03___ITERATOR_PREV_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__locale b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__locale index d5faa89b99..70dd1e65cf 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__locale +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__locale @@ -578,22 +578,10 @@ public: #ifdef _CACHED_RUNES static const size_t table_size = _CACHED_RUNES; #else - static const size_t table_size = 256; // FIXME: Don't hardcode this. + static const size_t table_size = 256; #endif _LIBCPP_HIDE_FROM_ABI const mask* table() const _NOEXCEPT { return __tab_; } static const mask* classic_table() _NOEXCEPT; -#if defined(__GLIBC__) || defined(__EMSCRIPTEN__) - static const int* __classic_upper_table() _NOEXCEPT; - static const int* __classic_lower_table() _NOEXCEPT; -#endif -#if defined(__NetBSD__) - static const short* __classic_upper_table() _NOEXCEPT; - static const short* __classic_lower_table() _NOEXCEPT; -#endif -#if defined(__MVS__) - static const unsigned short* __classic_upper_table() _NOEXCEPT; - static const unsigned short* __classic_lower_table() _NOEXCEPT; -#endif protected: ~ctype() override; diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__math/traits.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__math/traits.h index 0d27680d57..250e88beb7 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__math/traits.h +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__math/traits.h @@ -12,7 +12,6 @@ #include <__cxx03/__config> #include <__cxx03/__type_traits/enable_if.h> #include <__cxx03/__type_traits/is_arithmetic.h> -#include <__cxx03/__type_traits/is_floating_point.h> #include <__cxx03/__type_traits/is_integral.h> #include <__cxx03/__type_traits/is_signed.h> #include <__cxx03/__type_traits/promote.h> @@ -28,8 +27,21 @@ namespace __math { // signbit -template ::value, int> = 0> -_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool signbit(_A1 __x) _NOEXCEPT { +// The universal C runtime (UCRT) in the WinSDK provides floating point overloads +// for std::signbit(). By defining our overloads as templates, we can work around +// this issue as templates are less preferred than non-template functions. +template +_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool signbit(float __x) _NOEXCEPT { + return __builtin_signbit(__x); +} + +template +_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool signbit(double __x) _NOEXCEPT { + return __builtin_signbit(__x); +} + +template +_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool signbit(long double __x) _NOEXCEPT { return __builtin_signbit(__x); } @@ -109,16 +121,19 @@ _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isnan(long double __x) _NOEX // isnormal -template ::value, int> = 0> -_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI bool isnormal(_A1 __x) _NOEXCEPT { - return __builtin_isnormal(__x); -} - template ::value, int> = 0> _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI bool isnormal(_A1 __x) _NOEXCEPT { return __x != 0; } +_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isnormal(float __x) _NOEXCEPT { return __builtin_isnormal(__x); } + +_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isnormal(double __x) _NOEXCEPT { return __builtin_isnormal(__x); } + +_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isnormal(long double __x) _NOEXCEPT { + return __builtin_isnormal(__x); +} + // isgreater template ::value && is_arithmetic<_A2>::value, int> = 0> diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__mutex/once_flag.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__mutex/once_flag.h index eaeaa6121b..529aa77071 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__mutex/once_flag.h +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__mutex/once_flag.h @@ -10,6 +10,7 @@ #define _LIBCPP___CXX03___MUTEX_ONCE_FLAG_H #include <__cxx03/__config> +#include <__cxx03/__memory/addressof.h> #include <__cxx03/__memory/shared_ptr.h> // __libcpp_acquire_load #include <__cxx03/__tuple/tuple_indices.h> #include <__cxx03/__tuple/tuple_size.h> @@ -82,7 +83,7 @@ template inline _LIBCPP_HIDE_FROM_ABI void call_once(once_flag& __flag, _Callable& __func) { if (__libcpp_acquire_load(&__flag.__state_) != once_flag::_Complete) { __call_once_param<_Callable> __p(__func); - std::__call_once(__flag.__state_, &__p, &__call_once_proxy<_Callable>); + std::__call_once(__flag.__state_, std::addressof(__p), std::addressof(__call_once_proxy<_Callable>)); } } @@ -90,7 +91,7 @@ template inline _LIBCPP_HIDE_FROM_ABI void call_once(once_flag& __flag, const _Callable& __func) { if (__libcpp_acquire_load(&__flag.__state_) != once_flag::_Complete) { __call_once_param __p(__func); - std::__call_once(__flag.__state_, &__p, &__call_once_proxy); + std::__call_once(__flag.__state_, std::addressof(__p), std::addressof(__call_once_proxy)); } } diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__thread/support/pthread.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__thread/support/pthread.h index 4dc7a4980d..4ec5531003 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__thread/support/pthread.h +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__thread/support/pthread.h @@ -14,7 +14,7 @@ #include <__cxx03/__chrono/duration.h> #include <__cxx03/__config> #include <__cxx03/ctime> -#include <__cxx03/errno.h> +#include #include #include diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__verbose_abort b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__verbose_abort index 4fcfffa2b4..52d1297b65 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/__verbose_abort +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/__verbose_abort @@ -21,7 +21,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD // This function should never be called directly from the code -- it should only be called through // the _LIBCPP_VERBOSE_ABORT macro. _LIBCPP_NORETURN _LIBCPP_AVAILABILITY_VERBOSE_ABORT _LIBCPP_OVERRIDABLE_FUNC_VIS -_LIBCPP_ATTRIBUTE_FORMAT(__printf__, 1, 2) void __libcpp_verbose_abort(const char* __format, ...); +_LIBCPP_ATTRIBUTE_FORMAT(__printf__, 1, 2) void __libcpp_verbose_abort(const char* __format, ...) _NOEXCEPT; // _LIBCPP_VERBOSE_ABORT(format, args...) // diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/bitset b/naiveproxy/src/third_party/libc++/src/include/__cxx03/bitset index 63d2c23a73..37ad674686 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/bitset +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/bitset @@ -185,9 +185,9 @@ protected: __storage_type __first_[_N_words]; typedef __bit_reference<__bitset> reference; - typedef __bit_const_reference<__bitset> const_reference; - typedef __bit_iterator<__bitset, false> iterator; - typedef __bit_iterator<__bitset, true> const_iterator; + typedef __bit_const_reference<__bitset> __const_reference; + typedef __bit_iterator<__bitset, false> __iterator; + typedef __bit_iterator<__bitset, true> __const_iterator; _LIBCPP_HIDE_FROM_ABI __bitset() _NOEXCEPT; _LIBCPP_HIDE_FROM_ABI explicit __bitset(unsigned long long __v) _NOEXCEPT; @@ -195,14 +195,14 @@ protected: _LIBCPP_HIDE_FROM_ABI reference __make_ref(size_t __pos) _NOEXCEPT { return reference(__first_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word); } - _LIBCPP_HIDE_FROM_ABI const_reference __make_ref(size_t __pos) const _NOEXCEPT { - return const_reference(__first_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word); + _LIBCPP_HIDE_FROM_ABI __const_reference __make_ref(size_t __pos) const _NOEXCEPT { + return __const_reference(__first_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word); } - _LIBCPP_HIDE_FROM_ABI iterator __make_iter(size_t __pos) _NOEXCEPT { - return iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word); + _LIBCPP_HIDE_FROM_ABI __iterator __make_iter(size_t __pos) _NOEXCEPT { + return __iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word); } - _LIBCPP_HIDE_FROM_ABI const_iterator __make_iter(size_t __pos) const _NOEXCEPT { - return const_iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word); + _LIBCPP_HIDE_FROM_ABI __const_iterator __make_iter(size_t __pos) const _NOEXCEPT { + return __const_iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word); } _LIBCPP_HIDE_FROM_ABI void operator&=(const __bitset& __v) _NOEXCEPT; @@ -302,8 +302,8 @@ _LIBCPP_HIDE_FROM_ABI void __bitset<_N_words, _Size>::flip() _NOEXCEPT { template _LIBCPP_HIDE_FROM_ABI unsigned long __bitset<_N_words, _Size>::to_ulong(false_type) const { - const_iterator __e = __make_iter(_Size); - const_iterator __i = std::find(__make_iter(sizeof(unsigned long) * CHAR_BIT), __e, true); + __const_iterator __e = __make_iter(_Size); + __const_iterator __i = std::find(__make_iter(sizeof(unsigned long) * CHAR_BIT), __e, true); if (__i != __e) __throw_overflow_error("bitset to_ulong overflow error"); @@ -317,8 +317,8 @@ inline _LIBCPP_HIDE_FROM_ABI unsigned long __bitset<_N_words, _Size>::to_ulong(t template _LIBCPP_HIDE_FROM_ABI unsigned long long __bitset<_N_words, _Size>::to_ullong(false_type) const { - const_iterator __e = __make_iter(_Size); - const_iterator __i = std::find(__make_iter(sizeof(unsigned long long) * CHAR_BIT), __e, true); + __const_iterator __e = __make_iter(_Size); + __const_iterator __i = std::find(__make_iter(sizeof(unsigned long long) * CHAR_BIT), __e, true); if (__i != __e) __throw_overflow_error("bitset to_ullong overflow error"); @@ -410,9 +410,9 @@ protected: __storage_type __first_; typedef __bit_reference<__bitset> reference; - typedef __bit_const_reference<__bitset> const_reference; - typedef __bit_iterator<__bitset, false> iterator; - typedef __bit_iterator<__bitset, true> const_iterator; + typedef __bit_const_reference<__bitset> __const_reference; + typedef __bit_iterator<__bitset, false> __iterator; + typedef __bit_iterator<__bitset, true> __const_iterator; _LIBCPP_HIDE_FROM_ABI __bitset() _NOEXCEPT; _LIBCPP_HIDE_FROM_ABI explicit __bitset(unsigned long long __v) _NOEXCEPT; @@ -420,14 +420,14 @@ protected: _LIBCPP_HIDE_FROM_ABI reference __make_ref(size_t __pos) _NOEXCEPT { return reference(&__first_, __storage_type(1) << __pos); } - _LIBCPP_HIDE_FROM_ABI const_reference __make_ref(size_t __pos) const _NOEXCEPT { - return const_reference(&__first_, __storage_type(1) << __pos); + _LIBCPP_HIDE_FROM_ABI __const_reference __make_ref(size_t __pos) const _NOEXCEPT { + return __const_reference(&__first_, __storage_type(1) << __pos); } - _LIBCPP_HIDE_FROM_ABI iterator __make_iter(size_t __pos) _NOEXCEPT { - return iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word); + _LIBCPP_HIDE_FROM_ABI __iterator __make_iter(size_t __pos) _NOEXCEPT { + return __iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word); } - _LIBCPP_HIDE_FROM_ABI const_iterator __make_iter(size_t __pos) const _NOEXCEPT { - return const_iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word); + _LIBCPP_HIDE_FROM_ABI __const_iterator __make_iter(size_t __pos) const _NOEXCEPT { + return __const_iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word); } _LIBCPP_HIDE_FROM_ABI void operator&=(const __bitset& __v) _NOEXCEPT; @@ -522,17 +522,17 @@ protected: friend struct __bit_array<__bitset>; typedef __bit_reference<__bitset> reference; - typedef __bit_const_reference<__bitset> const_reference; - typedef __bit_iterator<__bitset, false> iterator; - typedef __bit_iterator<__bitset, true> const_iterator; + typedef __bit_const_reference<__bitset> __const_reference; + typedef __bit_iterator<__bitset, false> __iterator; + typedef __bit_iterator<__bitset, true> __const_iterator; _LIBCPP_HIDE_FROM_ABI __bitset() _NOEXCEPT; _LIBCPP_HIDE_FROM_ABI explicit __bitset(unsigned long long) _NOEXCEPT; _LIBCPP_HIDE_FROM_ABI reference __make_ref(size_t) _NOEXCEPT { return reference(nullptr, 1); } - _LIBCPP_HIDE_FROM_ABI const_reference __make_ref(size_t) const _NOEXCEPT { return const_reference(nullptr, 1); } - _LIBCPP_HIDE_FROM_ABI iterator __make_iter(size_t) _NOEXCEPT { return iterator(nullptr, 0); } - _LIBCPP_HIDE_FROM_ABI const_iterator __make_iter(size_t) const _NOEXCEPT { return const_iterator(nullptr, 0); } + _LIBCPP_HIDE_FROM_ABI __const_reference __make_ref(size_t) const _NOEXCEPT { return __const_reference(nullptr, 1); } + _LIBCPP_HIDE_FROM_ABI __iterator __make_iter(size_t) _NOEXCEPT { return __iterator(nullptr, 0); } + _LIBCPP_HIDE_FROM_ABI __const_iterator __make_iter(size_t) const _NOEXCEPT { return __const_iterator(nullptr, 0); } _LIBCPP_HIDE_FROM_ABI void operator&=(const __bitset&) _NOEXCEPT {} _LIBCPP_HIDE_FROM_ABI void operator|=(const __bitset&) _NOEXCEPT {} @@ -563,15 +563,15 @@ class _LIBCPP_TEMPLATE_VIS bitset : private __bitset<_Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1, _Size> { public: static const unsigned __n_words = _Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1; - typedef __bitset<__n_words, _Size> base; + typedef __bitset<__n_words, _Size> __base; public: - typedef typename base::reference reference; - typedef typename base::const_reference const_reference; + typedef typename __base::reference reference; + typedef typename __base::__const_reference __const_reference; // 23.3.5.1 constructors: _LIBCPP_HIDE_FROM_ABI bitset() _NOEXCEPT {} - _LIBCPP_HIDE_FROM_ABI bitset(unsigned long long __v) _NOEXCEPT : base(__v) {} + _LIBCPP_HIDE_FROM_ABI bitset(unsigned long long __v) _NOEXCEPT : __base(__v) {} template ::value, int> = 0> _LIBCPP_HIDE_FROM_ABI explicit bitset( const _CharT* __str, @@ -613,11 +613,11 @@ public: // element access: #ifdef _LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL - _LIBCPP_HIDE_FROM_ABI bool operator[](size_t __p) const { return base::__make_ref(__p); } + _LIBCPP_HIDE_FROM_ABI bool operator[](size_t __p) const { return __base::__make_ref(__p); } #else - _LIBCPP_HIDE_FROM_ABI const_reference operator[](size_t __p) const { return base::__make_ref(__p); } + _LIBCPP_HIDE_FROM_ABI __const_reference operator[](size_t __p) const { return __base::__make_ref(__p); } #endif - _LIBCPP_HIDE_FROM_ABI reference operator[](size_t __p) { return base::__make_ref(__p); } + _LIBCPP_HIDE_FROM_ABI reference operator[](size_t __p) { return __base::__make_ref(__p); } _LIBCPP_HIDE_FROM_ABI unsigned long to_ulong() const; _LIBCPP_HIDE_FROM_ABI unsigned long long to_ullong() const; template @@ -656,51 +656,51 @@ private: _CharT __c = __str[__mp - 1 - __i]; (*this)[__i] = _Traits::eq(__c, __one); } - std::fill(base::__make_iter(__i), base::__make_iter(_Size), false); + std::fill(__base::__make_iter(__i), __base::__make_iter(_Size), false); } - _LIBCPP_HIDE_FROM_ABI size_t __hash_code() const _NOEXCEPT { return base::__hash_code(); } + _LIBCPP_HIDE_FROM_ABI size_t __hash_code() const _NOEXCEPT { return __base::__hash_code(); } friend struct hash; }; template inline _LIBCPP_HIDE_FROM_ABI bitset<_Size>& bitset<_Size>::operator&=(const bitset& __rhs) _NOEXCEPT { - base::operator&=(__rhs); + __base::operator&=(__rhs); return *this; } template inline _LIBCPP_HIDE_FROM_ABI bitset<_Size>& bitset<_Size>::operator|=(const bitset& __rhs) _NOEXCEPT { - base::operator|=(__rhs); + __base::operator|=(__rhs); return *this; } template inline _LIBCPP_HIDE_FROM_ABI bitset<_Size>& bitset<_Size>::operator^=(const bitset& __rhs) _NOEXCEPT { - base::operator^=(__rhs); + __base::operator^=(__rhs); return *this; } template _LIBCPP_HIDE_FROM_ABI bitset<_Size>& bitset<_Size>::operator<<=(size_t __pos) _NOEXCEPT { __pos = std::min(__pos, _Size); - std::copy_backward(base::__make_iter(0), base::__make_iter(_Size - __pos), base::__make_iter(_Size)); - std::fill_n(base::__make_iter(0), __pos, false); + std::copy_backward(__base::__make_iter(0), __base::__make_iter(_Size - __pos), __base::__make_iter(_Size)); + std::fill_n(__base::__make_iter(0), __pos, false); return *this; } template _LIBCPP_HIDE_FROM_ABI bitset<_Size>& bitset<_Size>::operator>>=(size_t __pos) _NOEXCEPT { __pos = std::min(__pos, _Size); - std::copy(base::__make_iter(__pos), base::__make_iter(_Size), base::__make_iter(0)); - std::fill_n(base::__make_iter(_Size - __pos), __pos, false); + std::copy(__base::__make_iter(__pos), __base::__make_iter(_Size), __base::__make_iter(0)); + std::fill_n(__base::__make_iter(_Size - __pos), __pos, false); return *this; } template inline _LIBCPP_HIDE_FROM_ABI bitset<_Size>& bitset<_Size>::set() _NOEXCEPT { - std::fill_n(base::__make_iter(0), _Size, true); + std::fill_n(__base::__make_iter(0), _Size, true); return *this; } @@ -715,7 +715,7 @@ _LIBCPP_HIDE_FROM_ABI bitset<_Size>& bitset<_Size>::set(size_t __pos, bool __val template inline _LIBCPP_HIDE_FROM_ABI bitset<_Size>& bitset<_Size>::reset() _NOEXCEPT { - std::fill_n(base::__make_iter(0), _Size, false); + std::fill_n(__base::__make_iter(0), _Size, false); return *this; } @@ -737,7 +737,7 @@ inline _LIBCPP_HIDE_FROM_ABI bitset<_Size> bitset<_Size>::operator~() const _NOE template inline _LIBCPP_HIDE_FROM_ABI bitset<_Size>& bitset<_Size>::flip() _NOEXCEPT { - base::flip(); + __base::flip(); return *this; } @@ -746,19 +746,19 @@ _LIBCPP_HIDE_FROM_ABI bitset<_Size>& bitset<_Size>::flip(size_t __pos) { if (__pos >= _Size) __throw_out_of_range("bitset flip argument out of range"); - reference __r = base::__make_ref(__pos); + reference __r = __base::__make_ref(__pos); __r = ~__r; return *this; } template inline _LIBCPP_HIDE_FROM_ABI unsigned long bitset<_Size>::to_ulong() const { - return base::to_ulong(); + return __base::to_ulong(); } template inline _LIBCPP_HIDE_FROM_ABI unsigned long long bitset<_Size>::to_ullong() const { - return base::to_ullong(); + return __base::to_ullong(); } template @@ -795,12 +795,12 @@ bitset<_Size>::to_string(char __zero, char __one) const { template inline _LIBCPP_HIDE_FROM_ABI size_t bitset<_Size>::count() const _NOEXCEPT { - return static_cast(std::count(base::__make_iter(0), base::__make_iter(_Size), true)); + return static_cast(std::count(__base::__make_iter(0), __base::__make_iter(_Size), true)); } template inline _LIBCPP_HIDE_FROM_ABI bool bitset<_Size>::operator==(const bitset& __rhs) const _NOEXCEPT { - return std::equal(base::__make_iter(0), base::__make_iter(_Size), __rhs.__make_iter(0)); + return std::equal(__base::__make_iter(0), __base::__make_iter(_Size), __rhs.__make_iter(0)); } template @@ -818,12 +818,12 @@ _LIBCPP_HIDE_FROM_ABI bool bitset<_Size>::test(size_t __pos) const { template inline _LIBCPP_HIDE_FROM_ABI bool bitset<_Size>::all() const _NOEXCEPT { - return base::all(); + return __base::all(); } template inline _LIBCPP_HIDE_FROM_ABI bool bitset<_Size>::any() const _NOEXCEPT { - return base::any(); + return __base::any(); } template diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cctype b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cctype index 7f1becb463..e074f5410e 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cctype +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cctype @@ -36,9 +36,9 @@ int toupper(int c); #include <__cxx03/__config> -#include <__cxx03/ctype.h> +#include -#ifndef _LIBCPP___CXX03_CTYPE_H +#ifndef _LIBCPP_CTYPE_H # error tried including but didn't find libc++'s header. \ This usually means that your header search paths are not configured properly. \ The header search paths should contain the C++ Standard Library headers before \ diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cerrno b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cerrno index acb894ea19..a11a53f5c2 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cerrno +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cerrno @@ -24,9 +24,9 @@ Macros: #include <__cxx03/__config> -#include <__cxx03/errno.h> +#include -#ifndef _LIBCPP___CXX03_ERRNO_H +#ifndef _LIBCPP_ERRNO_H # error tried including but didn't find libc++'s header. \ This usually means that your header search paths are not configured properly. \ The header search paths should contain the C++ Standard Library headers before \ diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cfenv b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cfenv index d707f5a65b..d3a5839221 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cfenv +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cfenv @@ -54,9 +54,9 @@ int feupdateenv(const fenv_t* envp); #include <__cxx03/__config> -#include <__cxx03/fenv.h> +#include -#ifndef _LIBCPP___CXX03_FENV_H +#ifndef _LIBCPP_FENV_H # error tried including but didn't find libc++'s header. \ This usually means that your header search paths are not configured properly. \ The header search paths should contain the C++ Standard Library headers before \ diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cfloat b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cfloat index 5d10db6a45..a48a213f16 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cfloat +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cfloat @@ -71,9 +71,9 @@ Macros: #include <__cxx03/__config> -#include <__cxx03/float.h> +#include -#ifndef _LIBCPP___CXX03_FLOAT_H +#ifndef _LIBCPP_FLOAT_H # error tried including but didn't find libc++'s header. \ This usually means that your header search paths are not configured properly. \ The header search paths should contain the C++ Standard Library headers before \ diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cinttypes b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cinttypes index a14c1a57e6..68a926cc75 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cinttypes +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cinttypes @@ -241,9 +241,9 @@ uintmax_t wcstoumax(const wchar_t* restrict nptr, wchar_t** restrict endptr, int // [cinttypes.syn] #include <__cxx03/cstdint> -#include <__cxx03/inttypes.h> +#include -#ifndef _LIBCPP___CXX03_INTTYPES_H +#ifndef _LIBCPP_INTTYPES_H # error tried including but didn't find libc++'s header. \ This usually means that your header search paths are not configured properly. \ The header search paths should contain the C++ Standard Library headers before \ diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/complex.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/complex.h deleted file mode 100644 index 373017ff3f..0000000000 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/complex.h +++ /dev/null @@ -1,32 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___CXX03_COMPLEX_H -#define _LIBCPP___CXX03_COMPLEX_H - -/* - complex.h synopsis - -#include <__cxx03/ccomplex> - -*/ - -#include <__cxx03/__config> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -#ifdef __cplusplus -# include <__cxx03/ccomplex> -#elif __has_include_next() -# include_next -#endif - -#endif // _LIBCPP___CXX03_COMPLEX_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cstddef b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cstddef index f1527901bd..2b52c5fb42 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cstddef +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cstddef @@ -39,9 +39,9 @@ Types: #include <__cxx03/__type_traits/is_integral.h> #include <__cxx03/version> -#include <__cxx03/stddef.h> +#include -#ifndef _LIBCPP___CXX03_STDDEF_H +#ifndef _LIBCPP_STDDEF_H # error tried including but didn't find libc++'s header. \ This usually means that your header search paths are not configured properly. \ The header search paths should contain the C++ Standard Library headers before \ diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cstdio b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cstdio index 166ac0d8ab..90149044ae 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cstdio +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cstdio @@ -97,9 +97,9 @@ void perror(const char* s); #include <__cxx03/__config> -#include <__cxx03/stdio.h> +#include -#ifndef _LIBCPP___CXX03_STDIO_H +#ifndef _LIBCPP_STDIO_H # error tried including but didn't find libc++'s header. \ This usually means that your header search paths are not configured properly. \ The header search paths should contain the C++ Standard Library headers before \ diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/ctype.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/ctype.h deleted file mode 100644 index cd4097ab01..0000000000 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/ctype.h +++ /dev/null @@ -1,61 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___CXX03_CTYPE_H -#define _LIBCPP___CXX03_CTYPE_H - -/* - ctype.h synopsis - -int isalnum(int c); -int isalpha(int c); -int isblank(int c); // C99 -int iscntrl(int c); -int isdigit(int c); -int isgraph(int c); -int islower(int c); -int isprint(int c); -int ispunct(int c); -int isspace(int c); -int isupper(int c); -int isxdigit(int c); -int tolower(int c); -int toupper(int c); -*/ - -#include <__cxx03/__config> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -#if __has_include_next() -# include_next -#endif - -#ifdef __cplusplus - -# undef isalnum -# undef isalpha -# undef isblank -# undef iscntrl -# undef isdigit -# undef isgraph -# undef islower -# undef isprint -# undef ispunct -# undef isspace -# undef isupper -# undef isxdigit -# undef tolower -# undef toupper - -#endif - -#endif // _LIBCPP___CXX03_CTYPE_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cwctype b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cwctype index 5228124936..336b22634a 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/cwctype +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/cwctype @@ -52,9 +52,9 @@ wctrans_t wctrans(const char* property); #include <__cxx03/__config> #include <__cxx03/cctype> -#include <__cxx03/wctype.h> +#include -#ifndef _LIBCPP___CXX03_WCTYPE_H +#ifndef _LIBCPP_WCTYPE_H # error tried including but didn't find libc++'s header. \ This usually means that your header search paths are not configured properly. \ The header search paths should contain the C++ Standard Library headers before \ diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/errno.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/errno.h deleted file mode 100644 index 440235bef8..0000000000 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/errno.h +++ /dev/null @@ -1,399 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___CXX03_ERRNO_H -#define _LIBCPP___CXX03_ERRNO_H - -/* - errno.h synopsis - -Macros: - - EDOM - EILSEQ // C99 - ERANGE - errno - -*/ - -#include <__cxx03/__config> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -#if __has_include_next() -# include_next -#endif - -#ifdef __cplusplus - -# if !defined(EOWNERDEAD) || !defined(ENOTRECOVERABLE) - -# ifdef ELAST - -static const int __elast1 = ELAST + 1; -static const int __elast2 = ELAST + 2; - -# else - -static const int __elast1 = 104; -static const int __elast2 = 105; - -# endif - -# ifdef ENOTRECOVERABLE - -# define EOWNERDEAD __elast1 - -# ifdef ELAST -# undef ELAST -# define ELAST EOWNERDEAD -# endif - -# elif defined(EOWNERDEAD) - -# define ENOTRECOVERABLE __elast1 -# ifdef ELAST -# undef ELAST -# define ELAST ENOTRECOVERABLE -# endif - -# else // defined(EOWNERDEAD) - -# define EOWNERDEAD __elast1 -# define ENOTRECOVERABLE __elast2 -# ifdef ELAST -# undef ELAST -# define ELAST ENOTRECOVERABLE -# endif - -# endif // defined(EOWNERDEAD) - -# endif // !defined(EOWNERDEAD) || !defined(ENOTRECOVERABLE) - -// supply errno values likely to be missing, particularly on Windows - -# ifndef EAFNOSUPPORT -# define EAFNOSUPPORT 9901 -# endif - -# ifndef EADDRINUSE -# define EADDRINUSE 9902 -# endif - -# ifndef EADDRNOTAVAIL -# define EADDRNOTAVAIL 9903 -# endif - -# ifndef EISCONN -# define EISCONN 9904 -# endif - -# ifndef EBADMSG -# define EBADMSG 9905 -# endif - -# ifndef ECONNABORTED -# define ECONNABORTED 9906 -# endif - -# ifndef EALREADY -# define EALREADY 9907 -# endif - -# ifndef ECONNREFUSED -# define ECONNREFUSED 9908 -# endif - -# ifndef ECONNRESET -# define ECONNRESET 9909 -# endif - -# ifndef EDESTADDRREQ -# define EDESTADDRREQ 9910 -# endif - -# ifndef EHOSTUNREACH -# define EHOSTUNREACH 9911 -# endif - -# ifndef EIDRM -# define EIDRM 9912 -# endif - -# ifndef EMSGSIZE -# define EMSGSIZE 9913 -# endif - -# ifndef ENETDOWN -# define ENETDOWN 9914 -# endif - -# ifndef ENETRESET -# define ENETRESET 9915 -# endif - -# ifndef ENETUNREACH -# define ENETUNREACH 9916 -# endif - -# ifndef ENOBUFS -# define ENOBUFS 9917 -# endif - -# ifndef ENOLINK -# define ENOLINK 9918 -# endif - -# ifndef ENODATA -# define ENODATA 9919 -# endif - -# ifndef ENOMSG -# define ENOMSG 9920 -# endif - -# ifndef ENOPROTOOPT -# define ENOPROTOOPT 9921 -# endif - -# ifndef ENOSR -# define ENOSR 9922 -# endif - -# ifndef ENOTSOCK -# define ENOTSOCK 9923 -# endif - -# ifndef ENOSTR -# define ENOSTR 9924 -# endif - -# ifndef ENOTCONN -# define ENOTCONN 9925 -# endif - -# ifndef ENOTSUP -# define ENOTSUP 9926 -# endif - -# ifndef ECANCELED -# define ECANCELED 9927 -# endif - -# ifndef EINPROGRESS -# define EINPROGRESS 9928 -# endif - -# ifndef EOPNOTSUPP -# define EOPNOTSUPP 9929 -# endif - -# ifndef EWOULDBLOCK -# define EWOULDBLOCK 9930 -# endif - -# ifndef EOWNERDEAD -# define EOWNERDEAD 9931 -# endif - -# ifndef EPROTO -# define EPROTO 9932 -# endif - -# ifndef EPROTONOSUPPORT -# define EPROTONOSUPPORT 9933 -# endif - -# ifndef ENOTRECOVERABLE -# define ENOTRECOVERABLE 9934 -# endif - -# ifndef ETIME -# define ETIME 9935 -# endif - -# ifndef ETXTBSY -# define ETXTBSY 9936 -# endif - -# ifndef ETIMEDOUT -# define ETIMEDOUT 9938 -# endif - -# ifndef ELOOP -# define ELOOP 9939 -# endif - -# ifndef EOVERFLOW -# define EOVERFLOW 9940 -# endif - -# ifndef EPROTOTYPE -# define EPROTOTYPE 9941 -# endif - -# ifndef ENOSYS -# define ENOSYS 9942 -# endif - -# ifndef EINVAL -# define EINVAL 9943 -# endif - -# ifndef ERANGE -# define ERANGE 9944 -# endif - -# ifndef EILSEQ -# define EILSEQ 9945 -# endif - -// Windows Mobile doesn't appear to define these: - -# ifndef E2BIG -# define E2BIG 9946 -# endif - -# ifndef EDOM -# define EDOM 9947 -# endif - -# ifndef EFAULT -# define EFAULT 9948 -# endif - -# ifndef EBADF -# define EBADF 9949 -# endif - -# ifndef EPIPE -# define EPIPE 9950 -# endif - -# ifndef EXDEV -# define EXDEV 9951 -# endif - -# ifndef EBUSY -# define EBUSY 9952 -# endif - -# ifndef ENOTEMPTY -# define ENOTEMPTY 9953 -# endif - -# ifndef ENOEXEC -# define ENOEXEC 9954 -# endif - -# ifndef EEXIST -# define EEXIST 9955 -# endif - -# ifndef EFBIG -# define EFBIG 9956 -# endif - -# ifndef ENAMETOOLONG -# define ENAMETOOLONG 9957 -# endif - -# ifndef ENOTTY -# define ENOTTY 9958 -# endif - -# ifndef EINTR -# define EINTR 9959 -# endif - -# ifndef ESPIPE -# define ESPIPE 9960 -# endif - -# ifndef EIO -# define EIO 9961 -# endif - -# ifndef EISDIR -# define EISDIR 9962 -# endif - -# ifndef ECHILD -# define ECHILD 9963 -# endif - -# ifndef ENOLCK -# define ENOLCK 9964 -# endif - -# ifndef ENOSPC -# define ENOSPC 9965 -# endif - -# ifndef ENXIO -# define ENXIO 9966 -# endif - -# ifndef ENODEV -# define ENODEV 9967 -# endif - -# ifndef ENOENT -# define ENOENT 9968 -# endif - -# ifndef ESRCH -# define ESRCH 9969 -# endif - -# ifndef ENOTDIR -# define ENOTDIR 9970 -# endif - -# ifndef ENOMEM -# define ENOMEM 9971 -# endif - -# ifndef EPERM -# define EPERM 9972 -# endif - -# ifndef EACCES -# define EACCES 9973 -# endif - -# ifndef EROFS -# define EROFS 9974 -# endif - -# ifndef EDEADLK -# define EDEADLK 9975 -# endif - -# ifndef EAGAIN -# define EAGAIN 9976 -# endif - -# ifndef ENFILE -# define ENFILE 9977 -# endif - -# ifndef EMFILE -# define EMFILE 9978 -# endif - -# ifndef EMLINK -# define EMLINK 9979 -# endif - -#endif // __cplusplus - -#endif // _LIBCPP___CXX03_ERRNO_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/ext/__hash b/naiveproxy/src/third_party/libc++/src/include/__cxx03/ext/__hash index 8f27c7ea10..e2c5215682 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/ext/__hash +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/ext/__hash @@ -14,8 +14,8 @@ #include <__cxx03/__config> #include <__cxx03/cstring> -#include <__cxx03/stddef.h> #include <__cxx03/string> +#include namespace __gnu_cxx { diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/fenv.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/fenv.h deleted file mode 100644 index 87fe9d18b2..0000000000 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/fenv.h +++ /dev/null @@ -1,114 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___CXX03_FENV_H -#define _LIBCPP___CXX03_FENV_H - -/* - fenv.h synopsis - -This entire header is C99 / C++0X - -Macros: - - FE_DIVBYZERO - FE_INEXACT - FE_INVALID - FE_OVERFLOW - FE_UNDERFLOW - FE_ALL_EXCEPT - FE_DOWNWARD - FE_TONEAREST - FE_TOWARDZERO - FE_UPWARD - FE_DFL_ENV - -Types: - - fenv_t - fexcept_t - -int feclearexcept(int excepts); -int fegetexceptflag(fexcept_t* flagp, int excepts); -int feraiseexcept(int excepts); -int fesetexceptflag(const fexcept_t* flagp, int excepts); -int fetestexcept(int excepts); -int fegetround(); -int fesetround(int round); -int fegetenv(fenv_t* envp); -int feholdexcept(fenv_t* envp); -int fesetenv(const fenv_t* envp); -int feupdateenv(const fenv_t* envp); - - -*/ - -#include <__cxx03/__config> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -#if __has_include_next() -# include_next -#endif - -#ifdef __cplusplus - -extern "C++" { - -# ifdef feclearexcept -# undef feclearexcept -# endif - -# ifdef fegetexceptflag -# undef fegetexceptflag -# endif - -# ifdef feraiseexcept -# undef feraiseexcept -# endif - -# ifdef fesetexceptflag -# undef fesetexceptflag -# endif - -# ifdef fetestexcept -# undef fetestexcept -# endif - -# ifdef fegetround -# undef fegetround -# endif - -# ifdef fesetround -# undef fesetround -# endif - -# ifdef fegetenv -# undef fegetenv -# endif - -# ifdef feholdexcept -# undef feholdexcept -# endif - -# ifdef fesetenv -# undef fesetenv -# endif - -# ifdef feupdateenv -# undef feupdateenv -# endif - -} // extern "C++" - -#endif // defined(__cplusplus) - -#endif // _LIBCPP___CXX03_FENV_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/float.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/float.h deleted file mode 100644 index 38f199067f..0000000000 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/float.h +++ /dev/null @@ -1,95 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___CXX03_FLOAT_H -#define _LIBCPP___CXX03_FLOAT_H - -/* - float.h synopsis - -Macros: - - FLT_ROUNDS - FLT_EVAL_METHOD // C99 - FLT_RADIX - - FLT_MANT_DIG - DBL_MANT_DIG - LDBL_MANT_DIG - - FLT_HAS_SUBNORM // C11 - DBL_HAS_SUBNORM // C11 - LDBL_HAS_SUBNORM // C11 - - DECIMAL_DIG // C99 - FLT_DECIMAL_DIG // C11 - DBL_DECIMAL_DIG // C11 - LDBL_DECIMAL_DIG // C11 - - FLT_DIG - DBL_DIG - LDBL_DIG - - FLT_MIN_EXP - DBL_MIN_EXP - LDBL_MIN_EXP - - FLT_MIN_10_EXP - DBL_MIN_10_EXP - LDBL_MIN_10_EXP - - FLT_MAX_EXP - DBL_MAX_EXP - LDBL_MAX_EXP - - FLT_MAX_10_EXP - DBL_MAX_10_EXP - LDBL_MAX_10_EXP - - FLT_MAX - DBL_MAX - LDBL_MAX - - FLT_EPSILON - DBL_EPSILON - LDBL_EPSILON - - FLT_MIN - DBL_MIN - LDBL_MIN - - FLT_TRUE_MIN // C11 - DBL_TRUE_MIN // C11 - LDBL_TRUE_MIN // C11 - -*/ - -#include <__cxx03/__config> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -#if __has_include_next() -# include_next -#endif - -#ifdef __cplusplus - -# ifndef FLT_EVAL_METHOD -# define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ -# endif - -# ifndef DECIMAL_DIG -# define DECIMAL_DIG __DECIMAL_DIG__ -# endif - -#endif // __cplusplus - -#endif // _LIBCPP___CXX03_FLOAT_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/forward_list b/naiveproxy/src/third_party/libc++/src/include/__cxx03/forward_list index 8a8b5f289e..da7d9f18f0 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/forward_list +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/forward_list @@ -572,12 +572,12 @@ void __forward_list_base<_Tp, _Alloc>::clear() _NOEXCEPT { template */> class _LIBCPP_TEMPLATE_VIS forward_list : private __forward_list_base<_Tp, _Alloc> { - typedef __forward_list_base<_Tp, _Alloc> base; - typedef typename base::__node_allocator __node_allocator; - typedef typename base::__node_type __node_type; - typedef typename base::__node_traits __node_traits; - typedef typename base::__node_pointer __node_pointer; - typedef typename base::__begin_node_pointer __begin_node_pointer; + typedef __forward_list_base<_Tp, _Alloc> __base; + typedef typename __base::__node_allocator __node_allocator; + typedef typename __base::__node_type __node_type; + typedef typename __base::__node_traits __node_traits; + typedef typename __base::__node_pointer __node_pointer; + typedef typename __base::__begin_node_pointer __begin_node_pointer; public: typedef _Tp value_type; @@ -598,8 +598,8 @@ public: typedef typename allocator_traits::size_type size_type; typedef typename allocator_traits::difference_type difference_type; - typedef typename base::iterator iterator; - typedef typename base::const_iterator const_iterator; + typedef typename __base::iterator iterator; + typedef typename __base::const_iterator const_iterator; typedef void __remove_return_type; _LIBCPP_HIDE_FROM_ABI forward_list() {} // = default; @@ -608,7 +608,7 @@ public: _LIBCPP_HIDE_FROM_ABI forward_list(size_type __n, const value_type& __v); template <__enable_if_t<__is_allocator<_Alloc>::value, int> = 0> - _LIBCPP_HIDE_FROM_ABI forward_list(size_type __n, const value_type& __v, const allocator_type& __a) : base(__a) { + _LIBCPP_HIDE_FROM_ABI forward_list(size_type __n, const value_type& __v, const allocator_type& __a) : __base(__a) { insert_after(cbefore_begin(), __n, __v); } @@ -630,35 +630,37 @@ public: _LIBCPP_HIDE_FROM_ABI void assign(size_type __n, const value_type& __v); - _LIBCPP_HIDE_FROM_ABI allocator_type get_allocator() const _NOEXCEPT { return allocator_type(base::__alloc()); } + _LIBCPP_HIDE_FROM_ABI allocator_type get_allocator() const _NOEXCEPT { return allocator_type(__base::__alloc()); } - _LIBCPP_HIDE_FROM_ABI iterator begin() _NOEXCEPT { return iterator(base::__before_begin()->__next_); } + _LIBCPP_HIDE_FROM_ABI iterator begin() _NOEXCEPT { return iterator(__base::__before_begin()->__next_); } _LIBCPP_HIDE_FROM_ABI const_iterator begin() const _NOEXCEPT { - return const_iterator(base::__before_begin()->__next_); + return const_iterator(__base::__before_begin()->__next_); } _LIBCPP_HIDE_FROM_ABI iterator end() _NOEXCEPT { return iterator(nullptr); } _LIBCPP_HIDE_FROM_ABI const_iterator end() const _NOEXCEPT { return const_iterator(nullptr); } _LIBCPP_HIDE_FROM_ABI const_iterator cbegin() const _NOEXCEPT { - return const_iterator(base::__before_begin()->__next_); + return const_iterator(__base::__before_begin()->__next_); } _LIBCPP_HIDE_FROM_ABI const_iterator cend() const _NOEXCEPT { return const_iterator(nullptr); } - _LIBCPP_HIDE_FROM_ABI iterator before_begin() _NOEXCEPT { return iterator(base::__before_begin()); } - _LIBCPP_HIDE_FROM_ABI const_iterator before_begin() const _NOEXCEPT { return const_iterator(base::__before_begin()); } + _LIBCPP_HIDE_FROM_ABI iterator before_begin() _NOEXCEPT { return iterator(__base::__before_begin()); } + _LIBCPP_HIDE_FROM_ABI const_iterator before_begin() const _NOEXCEPT { + return const_iterator(__base::__before_begin()); + } _LIBCPP_HIDE_FROM_ABI const_iterator cbefore_begin() const _NOEXCEPT { - return const_iterator(base::__before_begin()); + return const_iterator(__base::__before_begin()); } _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI bool empty() const _NOEXCEPT { - return base::__before_begin()->__next_ == nullptr; + return __base::__before_begin()->__next_ == nullptr; } _LIBCPP_HIDE_FROM_ABI size_type max_size() const _NOEXCEPT { - return std::min(__node_traits::max_size(base::__alloc()), numeric_limits::max()); + return std::min(__node_traits::max_size(__base::__alloc()), numeric_limits::max()); } - _LIBCPP_HIDE_FROM_ABI reference front() { return base::__before_begin()->__next_->__get_value(); } - _LIBCPP_HIDE_FROM_ABI const_reference front() const { return base::__before_begin()->__next_->__get_value(); } + _LIBCPP_HIDE_FROM_ABI reference front() { return __base::__before_begin()->__next_->__get_value(); } + _LIBCPP_HIDE_FROM_ABI const_reference front() const { return __base::__before_begin()->__next_->__get_value(); } _LIBCPP_HIDE_FROM_ABI void push_front(const value_type& __v); @@ -675,11 +677,11 @@ public: _LIBCPP_HIDE_FROM_ABI iterator erase_after(const_iterator __p); _LIBCPP_HIDE_FROM_ABI iterator erase_after(const_iterator __f, const_iterator __l); - _LIBCPP_HIDE_FROM_ABI void swap(forward_list& __x) { base::swap(__x); } + _LIBCPP_HIDE_FROM_ABI void swap(forward_list& __x) { __base::swap(__x); } _LIBCPP_HIDE_FROM_ABI void resize(size_type __n); _LIBCPP_HIDE_FROM_ABI void resize(size_type __n, const value_type& __v); - _LIBCPP_HIDE_FROM_ABI void clear() _NOEXCEPT { base::clear(); } + _LIBCPP_HIDE_FROM_ABI void clear() _NOEXCEPT { __base::clear(); } _LIBCPP_HIDE_FROM_ABI void splice_after(const_iterator __p, forward_list&& __x); _LIBCPP_HIDE_FROM_ABI void splice_after(const_iterator __p, forward_list&& __x, const_iterator __i); @@ -716,12 +718,12 @@ private: }; template -inline forward_list<_Tp, _Alloc>::forward_list(const allocator_type& __a) : base(__a) {} +inline forward_list<_Tp, _Alloc>::forward_list(const allocator_type& __a) : __base(__a) {} template forward_list<_Tp, _Alloc>::forward_list(size_type __n) { if (__n > 0) { - for (__begin_node_pointer __p = base::__before_begin(); __n > 0; --__n, __p = __p->__next_as_begin()) { + for (__begin_node_pointer __p = __base::__before_begin(); __n > 0; --__n, __p = __p->__next_as_begin()) { __p->__next_ = this->__create_node(/* next = */ nullptr); } } @@ -740,26 +742,27 @@ forward_list<_Tp, _Alloc>::forward_list(_InputIterator __f, _InputIterator __l) template template ::value, int> > -forward_list<_Tp, _Alloc>::forward_list(_InputIterator __f, _InputIterator __l, const allocator_type& __a) : base(__a) { +forward_list<_Tp, _Alloc>::forward_list(_InputIterator __f, _InputIterator __l, const allocator_type& __a) + : __base(__a) { insert_after(cbefore_begin(), __f, __l); } template forward_list<_Tp, _Alloc>::forward_list(const forward_list& __x) - : base(__node_traits::select_on_container_copy_construction(__x.__alloc())) { + : __base(__node_traits::select_on_container_copy_construction(__x.__alloc())) { insert_after(cbefore_begin(), __x.begin(), __x.end()); } template forward_list<_Tp, _Alloc>::forward_list(const forward_list& __x, const __type_identity_t& __a) - : base(__a) { + : __base(__a) { insert_after(cbefore_begin(), __x.begin(), __x.end()); } template forward_list<_Tp, _Alloc>& forward_list<_Tp, _Alloc>::operator=(const forward_list& __x) { if (this != std::addressof(__x)) { - base::__copy_assign_alloc(__x); + __base::__copy_assign_alloc(__x); assign(__x.begin(), __x.end()); } return *this; @@ -800,13 +803,13 @@ void forward_list<_Tp, _Alloc>::assign(size_type __n, const value_type& __v) { template void forward_list<_Tp, _Alloc>::push_front(const value_type& __v) { - base::__before_begin()->__next_ = this->__create_node(/* next = */ base::__before_begin()->__next_, __v); + __base::__before_begin()->__next_ = this->__create_node(/* next = */ __base::__before_begin()->__next_, __v); } template void forward_list<_Tp, _Alloc>::pop_front() { - __node_pointer __p = base::__before_begin()->__next_; - base::__before_begin()->__next_ = __p->__next_; + __node_pointer __p = __base::__before_begin()->__next_; + __base::__before_begin()->__next_ = __p->__next_; this->__delete_node(__p); } @@ -1082,8 +1085,9 @@ template template void forward_list<_Tp, _Alloc>::merge(forward_list& __x, _Compare __comp) { if (this != std::addressof(__x)) { - base::__before_begin()->__next_ = __merge(base::__before_begin()->__next_, __x.__before_begin()->__next_, __comp); - __x.__before_begin()->__next_ = nullptr; + __base::__before_begin()->__next_ = + __merge(__base::__before_begin()->__next_, __x.__before_begin()->__next_, __comp); + __x.__before_begin()->__next_ = nullptr; } } @@ -1127,7 +1131,7 @@ forward_list<_Tp, _Alloc>::__merge(__node_pointer __f1, __node_pointer __f2, _Co template template inline void forward_list<_Tp, _Alloc>::sort(_Compare __comp) { - base::__before_begin()->__next_ = __sort(base::__before_begin()->__next_, std::distance(begin(), end()), __comp); + __base::__before_begin()->__next_ = __sort(__base::__before_begin()->__next_, std::distance(begin(), end()), __comp); } template @@ -1157,7 +1161,7 @@ forward_list<_Tp, _Alloc>::__sort(__node_pointer __f1, difference_type __sz, _Co template void forward_list<_Tp, _Alloc>::reverse() _NOEXCEPT { - __node_pointer __p = base::__before_begin()->__next_; + __node_pointer __p = __base::__before_begin()->__next_; if (__p != nullptr) { __node_pointer __f = __p->__next_; __p->__next_ = nullptr; @@ -1167,7 +1171,7 @@ void forward_list<_Tp, _Alloc>::reverse() _NOEXCEPT { __p = __f; __f = __t; } - base::__before_begin()->__next_ = __p; + __base::__before_begin()->__next_ = __p; } } diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/fstream b/naiveproxy/src/third_party/libc++/src/include/__cxx03/fstream index 44bdabc460..65c2c3e975 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/fstream +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/fstream @@ -191,6 +191,7 @@ typedef basic_fstream wfstream; #include <__cxx03/__config> #include <__cxx03/__fwd/fstream.h> #include <__cxx03/__locale> +#include <__cxx03/__memory/addressof.h> #include <__cxx03/__type_traits/enable_if.h> #include <__cxx03/__type_traits/is_same.h> #include <__cxx03/__utility/move.h> @@ -1062,11 +1063,12 @@ private: }; template -inline basic_ifstream<_CharT, _Traits>::basic_ifstream() : basic_istream(&__sb_) {} +inline basic_ifstream<_CharT, _Traits>::basic_ifstream() + : basic_istream(std::addressof(__sb_)) {} template inline basic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base::openmode __mode) - : basic_istream(&__sb_) { + : basic_istream(std::addressof(__sb_)) { if (__sb_.open(__s, __mode | ios_base::in) == nullptr) this->setstate(ios_base::failbit); } @@ -1074,15 +1076,16 @@ inline basic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base # ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR template inline basic_ifstream<_CharT, _Traits>::basic_ifstream(const wchar_t* __s, ios_base::openmode __mode) - : basic_istream(&__sb_) { + : basic_istream(std::addressof(__sb_)) { if (__sb_.open(__s, __mode | ios_base::in) == nullptr) this->setstate(ios_base::failbit); } # endif +// extension template inline basic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_base::openmode __mode) - : basic_istream(&__sb_) { + : basic_istream(std::addressof(__sb_)) { if (__sb_.open(__s, __mode | ios_base::in) == nullptr) this->setstate(ios_base::failbit); } @@ -1090,7 +1093,7 @@ inline basic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_ba template inline basic_ifstream<_CharT, _Traits>::basic_ifstream(basic_ifstream&& __rhs) : basic_istream(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) { - this->set_rdbuf(&__sb_); + this->set_rdbuf(std::addressof(__sb_)); } template @@ -1113,7 +1116,7 @@ inline _LIBCPP_HIDE_FROM_ABI void swap(basic_ifstream<_CharT, _Traits>& __x, bas template inline basic_filebuf<_CharT, _Traits>* basic_ifstream<_CharT, _Traits>::rdbuf() const { - return const_cast*>(&__sb_); + return const_cast*>(std::addressof(__sb_)); } template @@ -1199,11 +1202,12 @@ private: }; template -inline basic_ofstream<_CharT, _Traits>::basic_ofstream() : basic_ostream(&__sb_) {} +inline basic_ofstream<_CharT, _Traits>::basic_ofstream() + : basic_ostream(std::addressof(__sb_)) {} template inline basic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base::openmode __mode) - : basic_ostream(&__sb_) { + : basic_ostream(std::addressof(__sb_)) { if (__sb_.open(__s, __mode | ios_base::out) == nullptr) this->setstate(ios_base::failbit); } @@ -1211,15 +1215,16 @@ inline basic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base # ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR template inline basic_ofstream<_CharT, _Traits>::basic_ofstream(const wchar_t* __s, ios_base::openmode __mode) - : basic_ostream(&__sb_) { + : basic_ostream(std::addressof(__sb_)) { if (__sb_.open(__s, __mode | ios_base::out) == nullptr) this->setstate(ios_base::failbit); } # endif +// extension template inline basic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_base::openmode __mode) - : basic_ostream(&__sb_) { + : basic_ostream(std::addressof(__sb_)) { if (__sb_.open(__s, __mode | ios_base::out) == nullptr) this->setstate(ios_base::failbit); } @@ -1227,7 +1232,7 @@ inline basic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_ba template inline basic_ofstream<_CharT, _Traits>::basic_ofstream(basic_ofstream&& __rhs) : basic_ostream(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) { - this->set_rdbuf(&__sb_); + this->set_rdbuf(std::addressof(__sb_)); } template @@ -1250,7 +1255,7 @@ inline _LIBCPP_HIDE_FROM_ABI void swap(basic_ofstream<_CharT, _Traits>& __x, bas template inline basic_filebuf<_CharT, _Traits>* basic_ofstream<_CharT, _Traits>::rdbuf() const { - return const_cast*>(&__sb_); + return const_cast*>(std::addressof(__sb_)); } template @@ -1340,11 +1345,12 @@ private: }; template -inline basic_fstream<_CharT, _Traits>::basic_fstream() : basic_iostream(&__sb_) {} +inline basic_fstream<_CharT, _Traits>::basic_fstream() + : basic_iostream(std::addressof(__sb_)) {} template inline basic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base::openmode __mode) - : basic_iostream(&__sb_) { + : basic_iostream(std::addressof(__sb_)) { if (__sb_.open(__s, __mode) == nullptr) this->setstate(ios_base::failbit); } @@ -1352,7 +1358,7 @@ inline basic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base:: # ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR template inline basic_fstream<_CharT, _Traits>::basic_fstream(const wchar_t* __s, ios_base::openmode __mode) - : basic_iostream(&__sb_) { + : basic_iostream(std::addressof(__sb_)) { if (__sb_.open(__s, __mode) == nullptr) this->setstate(ios_base::failbit); } @@ -1360,15 +1366,16 @@ inline basic_fstream<_CharT, _Traits>::basic_fstream(const wchar_t* __s, ios_bas template inline basic_fstream<_CharT, _Traits>::basic_fstream(const string& __s, ios_base::openmode __mode) - : basic_iostream(&__sb_) { + : basic_iostream(std::addressof(__sb_)) { if (__sb_.open(__s, __mode) == nullptr) this->setstate(ios_base::failbit); } +// extension template inline basic_fstream<_CharT, _Traits>::basic_fstream(basic_fstream&& __rhs) : basic_iostream(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) { - this->set_rdbuf(&__sb_); + this->set_rdbuf(std::addressof(__sb_)); } template @@ -1391,7 +1398,7 @@ inline _LIBCPP_HIDE_FROM_ABI void swap(basic_fstream<_CharT, _Traits>& __x, basi template inline basic_filebuf<_CharT, _Traits>* basic_fstream<_CharT, _Traits>::rdbuf() const { - return const_cast*>(&__sb_); + return const_cast*>(std::addressof(__sb_)); } template diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/inttypes.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/inttypes.h deleted file mode 100644 index 82acd87f5e..0000000000 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/inttypes.h +++ /dev/null @@ -1,264 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___CXX03_INTTYPES_H -// AIX system headers need inttypes.h to be re-enterable while _STD_TYPES_T -// is defined until an inclusion of it without _STD_TYPES_T occurs, in which -// case the header guard macro is defined. -#if !defined(_AIX) || !defined(_STD_TYPES_T) -# define _LIBCPP___CXX03_INTTYPES_H -#endif // _STD_TYPES_T - -/* - inttypes.h synopsis - -This entire header is C99 / C++0X - -#include <__cxx03/stdint.h> // includes - -Macros: - - PRId8 - PRId16 - PRId32 - PRId64 - - PRIdLEAST8 - PRIdLEAST16 - PRIdLEAST32 - PRIdLEAST64 - - PRIdFAST8 - PRIdFAST16 - PRIdFAST32 - PRIdFAST64 - - PRIdMAX - PRIdPTR - - PRIi8 - PRIi16 - PRIi32 - PRIi64 - - PRIiLEAST8 - PRIiLEAST16 - PRIiLEAST32 - PRIiLEAST64 - - PRIiFAST8 - PRIiFAST16 - PRIiFAST32 - PRIiFAST64 - - PRIiMAX - PRIiPTR - - PRIo8 - PRIo16 - PRIo32 - PRIo64 - - PRIoLEAST8 - PRIoLEAST16 - PRIoLEAST32 - PRIoLEAST64 - - PRIoFAST8 - PRIoFAST16 - PRIoFAST32 - PRIoFAST64 - - PRIoMAX - PRIoPTR - - PRIu8 - PRIu16 - PRIu32 - PRIu64 - - PRIuLEAST8 - PRIuLEAST16 - PRIuLEAST32 - PRIuLEAST64 - - PRIuFAST8 - PRIuFAST16 - PRIuFAST32 - PRIuFAST64 - - PRIuMAX - PRIuPTR - - PRIx8 - PRIx16 - PRIx32 - PRIx64 - - PRIxLEAST8 - PRIxLEAST16 - PRIxLEAST32 - PRIxLEAST64 - - PRIxFAST8 - PRIxFAST16 - PRIxFAST32 - PRIxFAST64 - - PRIxMAX - PRIxPTR - - PRIX8 - PRIX16 - PRIX32 - PRIX64 - - PRIXLEAST8 - PRIXLEAST16 - PRIXLEAST32 - PRIXLEAST64 - - PRIXFAST8 - PRIXFAST16 - PRIXFAST32 - PRIXFAST64 - - PRIXMAX - PRIXPTR - - SCNd8 - SCNd16 - SCNd32 - SCNd64 - - SCNdLEAST8 - SCNdLEAST16 - SCNdLEAST32 - SCNdLEAST64 - - SCNdFAST8 - SCNdFAST16 - SCNdFAST32 - SCNdFAST64 - - SCNdMAX - SCNdPTR - - SCNi8 - SCNi16 - SCNi32 - SCNi64 - - SCNiLEAST8 - SCNiLEAST16 - SCNiLEAST32 - SCNiLEAST64 - - SCNiFAST8 - SCNiFAST16 - SCNiFAST32 - SCNiFAST64 - - SCNiMAX - SCNiPTR - - SCNo8 - SCNo16 - SCNo32 - SCNo64 - - SCNoLEAST8 - SCNoLEAST16 - SCNoLEAST32 - SCNoLEAST64 - - SCNoFAST8 - SCNoFAST16 - SCNoFAST32 - SCNoFAST64 - - SCNoMAX - SCNoPTR - - SCNu8 - SCNu16 - SCNu32 - SCNu64 - - SCNuLEAST8 - SCNuLEAST16 - SCNuLEAST32 - SCNuLEAST64 - - SCNuFAST8 - SCNuFAST16 - SCNuFAST32 - SCNuFAST64 - - SCNuMAX - SCNuPTR - - SCNx8 - SCNx16 - SCNx32 - SCNx64 - - SCNxLEAST8 - SCNxLEAST16 - SCNxLEAST32 - SCNxLEAST64 - - SCNxFAST8 - SCNxFAST16 - SCNxFAST32 - SCNxFAST64 - - SCNxMAX - SCNxPTR - -Types: - - imaxdiv_t - -intmax_t imaxabs(intmax_t j); -imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom); -intmax_t strtoimax(const char* restrict nptr, char** restrict endptr, int base); -uintmax_t strtoumax(const char* restrict nptr, char** restrict endptr, int base); -intmax_t wcstoimax(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base); -uintmax_t wcstoumax(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base); - -*/ - -#include <__cxx03/__config> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -/* C99 stdlib (e.g. glibc < 2.18) does not provide format macros needed - for C++11 unless __STDC_FORMAT_MACROS is defined -*/ -#if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS) -# define __STDC_FORMAT_MACROS -#endif - -#if __has_include_next() -# include_next -#endif - -#ifdef __cplusplus - -# include <__cxx03/stdint.h> - -# undef imaxabs -# undef imaxdiv - -#endif // __cplusplus - -#endif // _LIBCPP___CXX03_INTTYPES_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/ios b/naiveproxy/src/third_party/libc++/src/include/__cxx03/ios index 7c522909e6..aa03ce348b 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/ios +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/ios @@ -218,6 +218,7 @@ storage-class-specifier const error_category& iostream_category() noexcept; # include <__cxx03/__fwd/ios.h> # include <__cxx03/__ios/fpos.h> # include <__cxx03/__locale> +# include <__cxx03/__memory/addressof.h> # include <__cxx03/__system_error/error_category.h> # include <__cxx03/__system_error/error_code.h> # include <__cxx03/__system_error/error_condition.h> @@ -696,7 +697,7 @@ inline _LIBCPP_HIDE_FROM_ABI _CharT basic_ios<_CharT, _Traits>::fill(char_type _ template basic_ios<_CharT, _Traits>& basic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs) { - if (this != &__rhs) { + if (this != std::addressof(__rhs)) { __call_callbacks(erase_event); ios_base::copyfmt(__rhs); __tie_ = __rhs.__tie_; diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/list b/naiveproxy/src/third_party/libc++/src/include/__cxx03/list index f863885fbc..25aff2f5eb 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/list +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/list @@ -612,14 +612,14 @@ void __list_imp<_Tp, _Alloc>::swap(__list_imp& __c) { template */> class _LIBCPP_TEMPLATE_VIS list : private __list_imp<_Tp, _Alloc> { - typedef __list_imp<_Tp, _Alloc> base; - typedef typename base::__node_type __node_type; - typedef typename base::__node_allocator __node_allocator; - typedef typename base::__node_pointer __node_pointer; - typedef typename base::__node_alloc_traits __node_alloc_traits; - typedef typename base::__node_base __node_base; - typedef typename base::__node_base_pointer __node_base_pointer; - typedef typename base::__link_pointer __link_pointer; + typedef __list_imp<_Tp, _Alloc> __base; + typedef typename __base::__node_type __node_type; + typedef typename __base::__node_allocator __node_allocator; + typedef typename __base::__node_pointer __node_pointer; + typedef typename __base::__node_alloc_traits __node_alloc_traits; + typedef typename __base::__node_base __node_base; + typedef typename __base::__node_base_pointer __node_base_pointer; + typedef typename __base::__link_pointer __link_pointer; public: typedef _Tp value_type; @@ -629,22 +629,22 @@ public: "Allocator::value_type must be same type as value_type"); typedef value_type& reference; typedef const value_type& const_reference; - typedef typename base::pointer pointer; - typedef typename base::const_pointer const_pointer; - typedef typename base::size_type size_type; - typedef typename base::difference_type difference_type; - typedef typename base::iterator iterator; - typedef typename base::const_iterator const_iterator; + typedef typename __base::pointer pointer; + typedef typename __base::const_pointer const_pointer; + typedef typename __base::size_type size_type; + typedef typename __base::difference_type difference_type; + typedef typename __base::iterator iterator; + typedef typename __base::const_iterator const_iterator; typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; typedef void __remove_return_type; _LIBCPP_HIDE_FROM_ABI list() {} - _LIBCPP_HIDE_FROM_ABI explicit list(const allocator_type& __a) : base(__a) {} + _LIBCPP_HIDE_FROM_ABI explicit list(const allocator_type& __a) : __base(__a) {} _LIBCPP_HIDE_FROM_ABI explicit list(size_type __n); _LIBCPP_HIDE_FROM_ABI list(size_type __n, const value_type& __x); template <__enable_if_t<__is_allocator<_Alloc>::value, int> = 0> - _LIBCPP_HIDE_FROM_ABI list(size_type __n, const value_type& __x, const allocator_type& __a) : base(__a) { + _LIBCPP_HIDE_FROM_ABI list(size_type __n, const value_type& __x, const allocator_type& __a) : __base(__a) { for (; __n > 0; --__n) push_back(__x); } @@ -666,18 +666,18 @@ public: _LIBCPP_HIDE_FROM_ABI allocator_type get_allocator() const _NOEXCEPT; - _LIBCPP_HIDE_FROM_ABI size_type size() const _NOEXCEPT { return base::__sz(); } - _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI bool empty() const _NOEXCEPT { return base::empty(); } + _LIBCPP_HIDE_FROM_ABI size_type size() const _NOEXCEPT { return __base::__sz(); } + _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI bool empty() const _NOEXCEPT { return __base::empty(); } _LIBCPP_HIDE_FROM_ABI size_type max_size() const _NOEXCEPT { - return std::min(base::__node_alloc_max_size(), numeric_limits::max()); + return std::min(__base::__node_alloc_max_size(), numeric_limits::max()); } - _LIBCPP_HIDE_FROM_ABI iterator begin() _NOEXCEPT { return base::begin(); } - _LIBCPP_HIDE_FROM_ABI const_iterator begin() const _NOEXCEPT { return base::begin(); } - _LIBCPP_HIDE_FROM_ABI iterator end() _NOEXCEPT { return base::end(); } - _LIBCPP_HIDE_FROM_ABI const_iterator end() const _NOEXCEPT { return base::end(); } - _LIBCPP_HIDE_FROM_ABI const_iterator cbegin() const _NOEXCEPT { return base::begin(); } - _LIBCPP_HIDE_FROM_ABI const_iterator cend() const _NOEXCEPT { return base::end(); } + _LIBCPP_HIDE_FROM_ABI iterator begin() _NOEXCEPT { return __base::begin(); } + _LIBCPP_HIDE_FROM_ABI const_iterator begin() const _NOEXCEPT { return __base::begin(); } + _LIBCPP_HIDE_FROM_ABI iterator end() _NOEXCEPT { return __base::end(); } + _LIBCPP_HIDE_FROM_ABI const_iterator end() const _NOEXCEPT { return __base::end(); } + _LIBCPP_HIDE_FROM_ABI const_iterator cbegin() const _NOEXCEPT { return __base::begin(); } + _LIBCPP_HIDE_FROM_ABI const_iterator cend() const _NOEXCEPT { return __base::end(); } _LIBCPP_HIDE_FROM_ABI reverse_iterator rbegin() _NOEXCEPT { return reverse_iterator(end()); } _LIBCPP_HIDE_FROM_ABI const_reverse_iterator rbegin() const _NOEXCEPT { return const_reverse_iterator(end()); } @@ -688,19 +688,19 @@ public: _LIBCPP_HIDE_FROM_ABI reference front() { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "list::front called on empty list"); - return base::__end_.__next_->__as_node()->__get_value(); + return __base::__end_.__next_->__as_node()->__get_value(); } _LIBCPP_HIDE_FROM_ABI const_reference front() const { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "list::front called on empty list"); - return base::__end_.__next_->__as_node()->__get_value(); + return __base::__end_.__next_->__as_node()->__get_value(); } _LIBCPP_HIDE_FROM_ABI reference back() { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "list::back called on empty list"); - return base::__end_.__prev_->__as_node()->__get_value(); + return __base::__end_.__prev_->__as_node()->__get_value(); } _LIBCPP_HIDE_FROM_ABI const_reference back() const { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "list::back called on empty list"); - return base::__end_.__prev_->__as_node()->__get_value(); + return __base::__end_.__prev_->__as_node()->__get_value(); } _LIBCPP_HIDE_FROM_ABI void push_front(const value_type& __x); @@ -714,8 +714,8 @@ public: template ::value, int> = 0> _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __p, _InpIter __f, _InpIter __l); - _LIBCPP_HIDE_FROM_ABI void swap(list& __c) { base::swap(__c); } - _LIBCPP_HIDE_FROM_ABI void clear() _NOEXCEPT { base::clear(); } + _LIBCPP_HIDE_FROM_ABI void swap(list& __c) { __base::swap(__c); } + _LIBCPP_HIDE_FROM_ABI void clear() _NOEXCEPT { __base::clear(); } _LIBCPP_HIDE_FROM_ABI void pop_front(); _LIBCPP_HIDE_FROM_ABI void pop_back(); @@ -779,24 +779,24 @@ inline void list<_Tp, _Alloc>::__link_nodes(__link_pointer __p, __link_pointer _ // Link in nodes [__f, __l] at the front of the list template inline void list<_Tp, _Alloc>::__link_nodes_at_front(__link_pointer __f, __link_pointer __l) { - __f->__prev_ = base::__end_as_link(); - __l->__next_ = base::__end_.__next_; - __l->__next_->__prev_ = __l; - base::__end_.__next_ = __f; + __f->__prev_ = __base::__end_as_link(); + __l->__next_ = __base::__end_.__next_; + __l->__next_->__prev_ = __l; + __base::__end_.__next_ = __f; } // Link in nodes [__f, __l] at the back of the list template inline void list<_Tp, _Alloc>::__link_nodes_at_back(__link_pointer __f, __link_pointer __l) { - __l->__next_ = base::__end_as_link(); - __f->__prev_ = base::__end_.__prev_; - __f->__prev_->__next_ = __f; - base::__end_.__prev_ = __l; + __l->__next_ = __base::__end_as_link(); + __f->__prev_ = __base::__end_.__prev_; + __f->__prev_->__next_ = __f; + __base::__end_.__prev_ = __l; } template inline typename list<_Tp, _Alloc>::iterator list<_Tp, _Alloc>::__iterator(size_type __n) { - return __n <= base::__sz() / 2 ? std::next(begin(), __n) : std::prev(end(), base::__sz() - __n); + return __n <= __base::__sz() / 2 ? std::next(begin(), __n) : std::prev(end(), __base::__sz() - __n); } template @@ -820,20 +820,20 @@ list<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l) { template template ::value, int> > -list<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l, const allocator_type& __a) : base(__a) { +list<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l, const allocator_type& __a) : __base(__a) { for (; __f != __l; ++__f) __emplace_back(*__f); } template list<_Tp, _Alloc>::list(const list& __c) - : base(__node_alloc_traits::select_on_container_copy_construction(__c.__node_alloc())) { + : __base(__node_alloc_traits::select_on_container_copy_construction(__c.__node_alloc())) { for (const_iterator __i = __c.begin(), __e = __c.end(); __i != __e; ++__i) push_back(*__i); } template -list<_Tp, _Alloc>::list(const list& __c, const __type_identity_t& __a) : base(__a) { +list<_Tp, _Alloc>::list(const list& __c, const __type_identity_t& __a) : __base(__a) { for (const_iterator __i = __c.begin(), __e = __c.end(); __i != __e; ++__i) push_back(*__i); } @@ -841,7 +841,7 @@ list<_Tp, _Alloc>::list(const list& __c, const __type_identity_t template inline list<_Tp, _Alloc>& list<_Tp, _Alloc>::operator=(const list& __c) { if (this != std::addressof(__c)) { - base::__copy_assign_alloc(__c); + __base::__copy_assign_alloc(__c); assign(__c.begin(), __c.end()); } return *this; @@ -880,14 +880,14 @@ void list<_Tp, _Alloc>::assign(size_type __n, const value_type& __x) { template inline _Alloc list<_Tp, _Alloc>::get_allocator() const _NOEXCEPT { - return allocator_type(base::__node_alloc()); + return allocator_type(__base::__node_alloc()); } template typename list<_Tp, _Alloc>::iterator list<_Tp, _Alloc>::insert(const_iterator __p, const value_type& __x) { __node_pointer __node = this->__create_node(/* prev = */ nullptr, /* next = */ nullptr, __x); __link_nodes(__p.__ptr_, __node->__as_link(), __node->__as_link()); - ++base::__sz(); + ++__base::__sz(); return iterator(__node->__as_link()); } @@ -921,7 +921,7 @@ list<_Tp, _Alloc>::insert(const_iterator __p, size_type __n, const value_type& _ } #endif // _LIBCPP_HAS_NO_EXCEPTIONS __link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_); - base::__sz() += __ds; + __base::__sz() += __ds; } return __r; } @@ -963,7 +963,7 @@ list<_Tp, _Alloc>::__insert_with_sentinel(const_iterator __p, _Iterator __f, _Se } #endif // _LIBCPP_HAS_NO_EXCEPTIONS __link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_); - base::__sz() += __ds; + __base::__sz() += __ds; } return __r; } @@ -973,7 +973,7 @@ void list<_Tp, _Alloc>::push_front(const value_type& __x) { __node_pointer __node = this->__create_node(/* prev = */ nullptr, /* next = */ nullptr, __x); __link_pointer __nl = __node->__as_link(); __link_nodes_at_front(__nl, __nl); - ++base::__sz(); + ++__base::__sz(); } template @@ -981,24 +981,24 @@ void list<_Tp, _Alloc>::push_back(const value_type& __x) { __node_pointer __node = this->__create_node(/* prev = */ nullptr, /* next = */ nullptr, __x); __link_pointer __nl = __node->__as_link(); __link_nodes_at_back(__nl, __nl); - ++base::__sz(); + ++__base::__sz(); } template void list<_Tp, _Alloc>::pop_front() { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "list::pop_front() called with empty list"); - __link_pointer __n = base::__end_.__next_; - base::__unlink_nodes(__n, __n); - --base::__sz(); + __link_pointer __n = __base::__end_.__next_; + __base::__unlink_nodes(__n, __n); + --__base::__sz(); this->__delete_node(__n->__as_node()); } template void list<_Tp, _Alloc>::pop_back() { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "list::pop_back() called on an empty list"); - __link_pointer __n = base::__end_.__prev_; - base::__unlink_nodes(__n, __n); - --base::__sz(); + __link_pointer __n = __base::__end_.__prev_; + __base::__unlink_nodes(__n, __n); + --__base::__sz(); this->__delete_node(__n->__as_node()); } @@ -1007,8 +1007,8 @@ typename list<_Tp, _Alloc>::iterator list<_Tp, _Alloc>::erase(const_iterator __p _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__p != end(), "list::erase(iterator) called with a non-dereferenceable iterator"); __link_pointer __n = __p.__ptr_; __link_pointer __r = __n->__next_; - base::__unlink_nodes(__n, __n); - --base::__sz(); + __base::__unlink_nodes(__n, __n); + --__base::__sz(); this->__delete_node(__n->__as_node()); return iterator(__r); } @@ -1016,11 +1016,11 @@ typename list<_Tp, _Alloc>::iterator list<_Tp, _Alloc>::erase(const_iterator __p template typename list<_Tp, _Alloc>::iterator list<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l) { if (__f != __l) { - base::__unlink_nodes(__f.__ptr_, __l.__ptr_->__prev_); + __base::__unlink_nodes(__f.__ptr_, __l.__ptr_->__prev_); while (__f != __l) { __link_pointer __n = __f.__ptr_; ++__f; - --base::__sz(); + --__base::__sz(); this->__delete_node(__n->__as_node()); } } @@ -1029,10 +1029,10 @@ typename list<_Tp, _Alloc>::iterator list<_Tp, _Alloc>::erase(const_iterator __f template void list<_Tp, _Alloc>::resize(size_type __n) { - if (__n < base::__sz()) + if (__n < __base::__sz()) erase(__iterator(__n), end()); - else if (__n > base::__sz()) { - __n -= base::__sz(); + else if (__n > __base::__sz()) { + __n -= __base::__sz(); size_type __ds = 0; __node_pointer __node = this->__create_node(/* prev = */ nullptr, /* next = */ nullptr); ++__ds; @@ -1058,16 +1058,16 @@ void list<_Tp, _Alloc>::resize(size_type __n) { } #endif // _LIBCPP_HAS_NO_EXCEPTIONS __link_nodes_at_back(__r.__ptr_, __e.__ptr_); - base::__sz() += __ds; + __base::__sz() += __ds; } } template void list<_Tp, _Alloc>::resize(size_type __n, const value_type& __x) { - if (__n < base::__sz()) + if (__n < __base::__sz()) erase(__iterator(__n), end()); - else if (__n > base::__sz()) { - __n -= base::__sz(); + else if (__n > __base::__sz()) { + __n -= __base::__sz(); size_type __ds = 0; __node_pointer __node = this->__create_node(/* prev = */ nullptr, /* next = */ nullptr, __x); ++__ds; @@ -1093,8 +1093,8 @@ void list<_Tp, _Alloc>::resize(size_type __n, const value_type& __x) { throw; } #endif // _LIBCPP_HAS_NO_EXCEPTIONS - __link_nodes(base::__end_as_link(), __r.__ptr_, __e.__ptr_); - base::__sz() += __ds; + __link_nodes(__base::__end_as_link(), __r.__ptr_, __e.__ptr_); + __base::__sz() += __ds; } } @@ -1105,9 +1105,9 @@ void list<_Tp, _Alloc>::splice(const_iterator __p, list& __c) { if (!__c.empty()) { __link_pointer __f = __c.__end_.__next_; __link_pointer __l = __c.__end_.__prev_; - base::__unlink_nodes(__f, __l); + __base::__unlink_nodes(__f, __l); __link_nodes(__p.__ptr_, __f, __l); - base::__sz() += __c.__sz(); + __base::__sz() += __c.__sz(); __c.__sz() = 0; } } @@ -1116,10 +1116,10 @@ template void list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __i) { if (__p.__ptr_ != __i.__ptr_ && __p.__ptr_ != __i.__ptr_->__next_) { __link_pointer __f = __i.__ptr_; - base::__unlink_nodes(__f, __f); + __base::__unlink_nodes(__f, __f); __link_nodes(__p.__ptr_, __f, __f); --__c.__sz(); - ++base::__sz(); + ++__base::__sz(); } } @@ -1132,9 +1132,9 @@ void list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f if (this != std::addressof(__c)) { size_type __s = std::distance(__f, __l) + 1; __c.__sz() -= __s; - base::__sz() += __s; + __base::__sz() += __s; } - base::__unlink_nodes(__first, __last); + __base::__unlink_nodes(__first, __last); __link_nodes(__p.__ptr_, __first, __last); } } @@ -1214,12 +1214,12 @@ void list<_Tp, _Alloc>::merge(list& __c, _Comp __comp) { iterator __m2 = std::next(__f2); for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2, (void)++__ds) ; - base::__sz() += __ds; + __base::__sz() += __ds; __c.__sz() -= __ds; __link_pointer __f = __f2.__ptr_; __link_pointer __l = __m2.__ptr_->__prev_; __f2 = __m2; - base::__unlink_nodes(__f, __l); + __base::__unlink_nodes(__f, __l); __m2 = std::next(__f1); __link_nodes(__f1.__ptr_, __f, __l); __f1 = __m2; @@ -1238,7 +1238,7 @@ inline void list<_Tp, _Alloc>::sort() { template template inline void list<_Tp, _Alloc>::sort(_Comp __comp) { - __sort(begin(), end(), base::__sz(), __comp); + __sort(begin(), end(), __base::__sz(), __comp); } template @@ -1252,7 +1252,7 @@ list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __ case 2: if (__comp(*--__e2, *__f1)) { __link_pointer __f = __e2.__ptr_; - base::__unlink_nodes(__f, __f); + __base::__unlink_nodes(__f, __f); __link_nodes(__f1.__ptr_, __f, __f); return __e2; } @@ -1270,7 +1270,7 @@ list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __ __link_pointer __l = __m2.__ptr_->__prev_; __r = __f2; __e1 = __f2 = __m2; - base::__unlink_nodes(__f, __l); + __base::__unlink_nodes(__f, __l); __m2 = std::next(__f1); __link_nodes(__f1.__ptr_, __f, __l); __f1 = __m2; @@ -1286,7 +1286,7 @@ list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __ if (__e1 == __f2) __e1 = __m2; __f2 = __m2; - base::__unlink_nodes(__f, __l); + __base::__unlink_nodes(__f, __l); __m2 = std::next(__f1); __link_nodes(__f1.__ptr_, __f, __l); __f1 = __m2; @@ -1298,7 +1298,7 @@ list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __ template void list<_Tp, _Alloc>::reverse() _NOEXCEPT { - if (base::__sz() > 1) { + if (__base::__sz() > 1) { iterator __e = end(); for (iterator __i = begin(); __i.__ptr_ != __e.__ptr_;) { std::swap(__i.__ptr_->__prev_, __i.__ptr_->__next_); diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/locale b/naiveproxy/src/third_party/libc++/src/include/__cxx03/locale index 64162f5a4f..79cd50e0e2 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/locale +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/locale @@ -2030,10 +2030,6 @@ protected: _LIBCPP_HIDE_FROM_ABI ~__time_get_storage() {} time_base::dateorder __do_date_order() const; - -private: - void init(const ctype<_CharT>&); - string_type __analyze(char __fmt, const ctype<_CharT>&); }; # define _LIBCPP_TIME_GET_STORAGE_EXPLICIT_INSTANTIATION(_CharT) \ @@ -2043,19 +2039,10 @@ private: _LIBCPP_EXPORTED_FROM_ABI __time_get_storage<_CharT>::__time_get_storage(const char*); \ template <> \ _LIBCPP_EXPORTED_FROM_ABI __time_get_storage<_CharT>::__time_get_storage(const string&); \ - template <> \ - _LIBCPP_EXPORTED_FROM_ABI void __time_get_storage<_CharT>::init(const ctype<_CharT>&); \ - template <> \ - _LIBCPP_EXPORTED_FROM_ABI __time_get_storage<_CharT>::string_type __time_get_storage<_CharT>::__analyze( \ - char, const ctype<_CharT>&); \ extern template _LIBCPP_EXPORTED_FROM_ABI time_base::dateorder __time_get_storage<_CharT>::__do_date_order() \ const; \ extern template _LIBCPP_EXPORTED_FROM_ABI __time_get_storage<_CharT>::__time_get_storage(const char*); \ - extern template _LIBCPP_EXPORTED_FROM_ABI __time_get_storage<_CharT>::__time_get_storage(const string&); \ - extern template _LIBCPP_EXPORTED_FROM_ABI void __time_get_storage<_CharT>::init(const ctype<_CharT>&); \ - extern template _LIBCPP_EXPORTED_FROM_ABI __time_get_storage<_CharT>::string_type \ - __time_get_storage<_CharT>::__analyze(char, const ctype<_CharT>&); \ - /**/ + extern template _LIBCPP_EXPORTED_FROM_ABI __time_get_storage<_CharT>::__time_get_storage(const string&); _LIBCPP_TIME_GET_STORAGE_EXPLICIT_INSTANTIATION(char) # ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS @@ -2460,6 +2447,8 @@ _LIBCPP_HIDE_FROM_ABI void __double_or_nothing(unique_ptr<_Tp, void (*)(void*)>& __throw_bad_alloc(); if (__owns) __b.release(); + else + std::memcpy(__t, __b.get(), __cur_cap); __b = unique_ptr<_Tp, void (*)(void*)>(__t, free); __new_cap /= sizeof(_Tp); __n = __b.get() + __n_off; @@ -2655,20 +2644,22 @@ _InputIterator money_get<_CharT, _InputIterator>::do_get( char_type __atoms[sizeof(__src) - 1]; __ct.widen(__src, __src + (sizeof(__src) - 1), __atoms); char __nbuf[__bz]; - char* __nc = __nbuf; + char* __nc = __nbuf; + const char* __nc_in = __nc; unique_ptr __h(nullptr, free); if (__wn - __wb.get() > __bz - 2) { __h.reset((char*)malloc(static_cast(__wn - __wb.get() + 2))); if (__h.get() == nullptr) __throw_bad_alloc(); - __nc = __h.get(); + __nc = __h.get(); + __nc_in = __nc; } if (__neg) *__nc++ = '-'; for (const char_type* __w = __wb.get(); __w < __wn; ++__w, ++__nc) *__nc = __src[std::find(__atoms, std::end(__atoms), *__w) - __atoms]; *__nc = char(); - if (sscanf(__nbuf, "%Lf", &__v) != 1) + if (sscanf(__nc_in, "%Lf", &__v) != 1) __throw_runtime_error("money_get error"); } if (__b == __e) diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/regex b/naiveproxy/src/third_party/libc++/src/include/__cxx03/regex index b96d59d3a2..b6a78f27fb 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/regex +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/regex @@ -2100,7 +2100,7 @@ public: __ranges_.push_back( std::make_pair(__traits_.transform(__b.begin(), __b.end()), __traits_.transform(__e.begin(), __e.end()))); } else { - if (__b.size() != 1 || __e.size() != 1) + if (__b.size() != 1 || __e.size() != 1 || char_traits::lt(__e[0], __b[0])) __throw_regex_error(); if (__icase_) { __b[0] = __traits_.translate_nocase(__b[0]); @@ -3911,7 +3911,7 @@ _ForwardIterator basic_regex<_CharT, _Traits>::__parse_character_escape( ++__first; break; default: - if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum)) { + if (!__traits_.isctype(*__first, ctype_base::alnum)) { if (__str) *__str = *__first; else diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/sstream b/naiveproxy/src/third_party/libc++/src/include/__cxx03/sstream index de56cd9955..741158aa1a 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/sstream +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/sstream @@ -354,9 +354,15 @@ private: public: // [stringbuf.cons] constructors: - _LIBCPP_HIDE_FROM_ABI basic_stringbuf() : __hm_(nullptr), __mode_(ios_base::in | ios_base::out) {} + _LIBCPP_HIDE_FROM_ABI basic_stringbuf() : __hm_(nullptr), __mode_(ios_base::in | ios_base::out) { + // it is implementation-defined whether we initialize eback() & friends to nullptr, and libc++ doesn't + __init_buf_ptrs(); + } - _LIBCPP_HIDE_FROM_ABI explicit basic_stringbuf(ios_base::openmode __wch) : __hm_(nullptr), __mode_(__wch) {} + _LIBCPP_HIDE_FROM_ABI explicit basic_stringbuf(ios_base::openmode __wch) : __hm_(nullptr), __mode_(__wch) { + // it is implementation-defined whether we initialize eback() & friends to nullptr, and libc++ doesn't + __init_buf_ptrs(); + } _LIBCPP_HIDE_FROM_ABI explicit basic_stringbuf(const string_type& __s, ios_base::openmode __wch = ios_base::in | ios_base::out) @@ -713,18 +719,19 @@ private: public: // [istringstream.cons] Constructors: - _LIBCPP_HIDE_FROM_ABI basic_istringstream() : basic_istream<_CharT, _Traits>(&__sb_), __sb_(ios_base::in) {} + _LIBCPP_HIDE_FROM_ABI basic_istringstream() + : basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(ios_base::in) {} _LIBCPP_HIDE_FROM_ABI explicit basic_istringstream(ios_base::openmode __wch) - : basic_istream<_CharT, _Traits>(&__sb_), __sb_(__wch | ios_base::in) {} + : basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch | ios_base::in) {} _LIBCPP_HIDE_FROM_ABI explicit basic_istringstream(const string_type& __s, ios_base::openmode __wch = ios_base::in) - : basic_istream<_CharT, _Traits>(&__sb_), __sb_(__s, __wch | ios_base::in) {} + : basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::in) {} basic_istringstream(const basic_istringstream&) = delete; _LIBCPP_HIDE_FROM_ABI basic_istringstream(basic_istringstream&& __rhs) : basic_istream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) { - basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_); + basic_istream<_CharT, _Traits>::set_rdbuf(std::addressof(__sb_)); } // [istringstream.assign] Assign and swap: @@ -741,7 +748,7 @@ public: // [istringstream.members] Member functions: _LIBCPP_HIDE_FROM_ABI basic_stringbuf* rdbuf() const { - return const_cast*>(&__sb_); + return const_cast*>(std::addressof(__sb_)); } _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); } @@ -774,18 +781,19 @@ private: public: // [ostringstream.cons] Constructors: - _LIBCPP_HIDE_FROM_ABI basic_ostringstream() : basic_ostream<_CharT, _Traits>(&__sb_), __sb_(ios_base::out) {} + _LIBCPP_HIDE_FROM_ABI basic_ostringstream() + : basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(ios_base::out) {} _LIBCPP_HIDE_FROM_ABI explicit basic_ostringstream(ios_base::openmode __wch) - : basic_ostream<_CharT, _Traits>(&__sb_), __sb_(__wch | ios_base::out) {} + : basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch | ios_base::out) {} _LIBCPP_HIDE_FROM_ABI explicit basic_ostringstream(const string_type& __s, ios_base::openmode __wch = ios_base::out) - : basic_ostream<_CharT, _Traits>(&__sb_), __sb_(__s, __wch | ios_base::out) {} + : basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::out) {} basic_ostringstream(const basic_ostringstream&) = delete; _LIBCPP_HIDE_FROM_ABI basic_ostringstream(basic_ostringstream&& __rhs) : basic_ostream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) { - basic_ostream<_CharT, _Traits>::set_rdbuf(&__sb_); + basic_ostream<_CharT, _Traits>::set_rdbuf(std::addressof(__sb_)); } // [ostringstream.assign] Assign and swap: @@ -803,7 +811,7 @@ public: // [ostringstream.members] Member functions: _LIBCPP_HIDE_FROM_ABI basic_stringbuf* rdbuf() const { - return const_cast*>(&__sb_); + return const_cast*>(std::addressof(__sb_)); } _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); } @@ -836,19 +844,19 @@ private: public: // [stringstream.cons] constructors _LIBCPP_HIDE_FROM_ABI basic_stringstream() - : basic_iostream<_CharT, _Traits>(&__sb_), __sb_(ios_base::in | ios_base::out) {} + : basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(ios_base::in | ios_base::out) {} _LIBCPP_HIDE_FROM_ABI explicit basic_stringstream(ios_base::openmode __wch) - : basic_iostream<_CharT, _Traits>(&__sb_), __sb_(__wch) {} + : basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch) {} _LIBCPP_HIDE_FROM_ABI explicit basic_stringstream(const string_type& __s, ios_base::openmode __wch = ios_base::in | ios_base::out) - : basic_iostream<_CharT, _Traits>(&__sb_), __sb_(__s, __wch) {} + : basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch) {} basic_stringstream(const basic_stringstream&) = delete; _LIBCPP_HIDE_FROM_ABI basic_stringstream(basic_stringstream&& __rhs) : basic_iostream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) { - basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_); + basic_istream<_CharT, _Traits>::set_rdbuf(std::addressof(__sb_)); } // [stringstream.assign] Assign and swap: @@ -865,7 +873,7 @@ public: // [stringstream.members] Member functions: _LIBCPP_HIDE_FROM_ABI basic_stringbuf* rdbuf() const { - return const_cast*>(&__sb_); + return const_cast*>(std::addressof(__sb_)); } _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/stdbool.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/stdbool.h deleted file mode 100644 index e6c2eae2cf..0000000000 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/stdbool.h +++ /dev/null @@ -1,40 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___CXX03_STDBOOL_H -#define _LIBCPP___CXX03_STDBOOL_H - -/* - stdbool.h synopsis - -Macros: - - __bool_true_false_are_defined - -*/ - -#include <__cxx03/__config> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -#if __has_include_next() -# include_next -#endif - -#ifdef __cplusplus -# undef bool -# undef true -# undef false -# undef __bool_true_false_are_defined -# define __bool_true_false_are_defined 1 -#endif - -#endif // _LIBCPP___CXX03_STDBOOL_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/stddef.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/stddef.h deleted file mode 100644 index 5d46cf27c3..0000000000 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/stddef.h +++ /dev/null @@ -1,44 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -/* - stddef.h synopsis - -Macros: - - offsetof(type,member-designator) - NULL - -Types: - - ptrdiff_t - size_t - max_align_t // C++11 - nullptr_t - -*/ - -#include <__cxx03/__config> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -// Note: This include is outside of header guards because we sometimes get included multiple times -// with different defines and the underlying will know how to deal with that. -#include_next - -#ifndef _LIBCPP___CXX03_STDDEF_H -# define _LIBCPP___CXX03_STDDEF_H - -# ifdef __cplusplus -typedef decltype(nullptr) nullptr_t; -# endif - -#endif // _LIBCPP___CXX03_STDDEF_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/stdio.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/stdio.h deleted file mode 100644 index 6c6671e90c..0000000000 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/stdio.h +++ /dev/null @@ -1,123 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#if defined(__need_FILE) || defined(__need___FILE) - -# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -# endif - -# include_next - -#elif !defined(_LIBCPP___CXX03_STDIO_H) -# define _LIBCPP___CXX03_STDIO_H - -/* - stdio.h synopsis - -Macros: - - BUFSIZ - EOF - FILENAME_MAX - FOPEN_MAX - L_tmpnam - NULL - SEEK_CUR - SEEK_END - SEEK_SET - TMP_MAX - _IOFBF - _IOLBF - _IONBF - stderr - stdin - stdout - -Types: - -FILE -fpos_t -size_t - -int remove(const char* filename); -int rename(const char* old, const char* new); -FILE* tmpfile(void); -char* tmpnam(char* s); -int fclose(FILE* stream); -int fflush(FILE* stream); -FILE* fopen(const char* restrict filename, const char* restrict mode); -FILE* freopen(const char* restrict filename, const char * restrict mode, - FILE * restrict stream); -void setbuf(FILE* restrict stream, char* restrict buf); -int setvbuf(FILE* restrict stream, char* restrict buf, int mode, size_t size); -int fprintf(FILE* restrict stream, const char* restrict format, ...); -int fscanf(FILE* restrict stream, const char * restrict format, ...); -int printf(const char* restrict format, ...); -int scanf(const char* restrict format, ...); -int snprintf(char* restrict s, size_t n, const char* restrict format, ...); // C99 -int sprintf(char* restrict s, const char* restrict format, ...); -int sscanf(const char* restrict s, const char* restrict format, ...); -int vfprintf(FILE* restrict stream, const char* restrict format, va_list arg); -int vfscanf(FILE* restrict stream, const char* restrict format, va_list arg); // C99 -int vprintf(const char* restrict format, va_list arg); -int vscanf(const char* restrict format, va_list arg); // C99 -int vsnprintf(char* restrict s, size_t n, const char* restrict format, // C99 - va_list arg); -int vsprintf(char* restrict s, const char* restrict format, va_list arg); -int vsscanf(const char* restrict s, const char* restrict format, va_list arg); // C99 -int fgetc(FILE* stream); -char* fgets(char* restrict s, int n, FILE* restrict stream); -int fputc(int c, FILE* stream); -int fputs(const char* restrict s, FILE* restrict stream); -int getc(FILE* stream); -int getchar(void); -char* gets(char* s); // removed in C++14 -int putc(int c, FILE* stream); -int putchar(int c); -int puts(const char* s); -int ungetc(int c, FILE* stream); -size_t fread(void* restrict ptr, size_t size, size_t nmemb, - FILE* restrict stream); -size_t fwrite(const void* restrict ptr, size_t size, size_t nmemb, - FILE* restrict stream); -int fgetpos(FILE* restrict stream, fpos_t* restrict pos); -int fseek(FILE* stream, long offset, int whence); -int fsetpos(FILE*stream, const fpos_t* pos); -long ftell(FILE* stream); -void rewind(FILE* stream); -void clearerr(FILE* stream); -int feof(FILE* stream); -int ferror(FILE* stream); -void perror(const char* s); -*/ - -# include <__cxx03/__config> - -# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -# endif - -# if __has_include_next() -# include_next -# endif - -# ifdef __cplusplus - -# undef getc -# undef putc -# undef clearerr -# undef feof -# undef ferror -# undef putchar -# undef getchar - -# endif - -#endif // _LIBCPP___CXX03_STDIO_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/string b/naiveproxy/src/third_party/libc++/src/include/__cxx03/string index 7d54030d0b..6c43fca08f 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/string +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/string @@ -1101,12 +1101,20 @@ public: _LIBCPP_HIDE_FROM_ABI size_type length() const _NOEXCEPT { return size(); } _LIBCPP_HIDE_FROM_ABI size_type max_size() const _NOEXCEPT { - size_type __m = __alloc_traits::max_size(__alloc()); - if (__m <= std::numeric_limits::max() / 2) { - return __m - __alignment; + if (size_type __m = __alloc_traits::max_size(__alloc()); __m <= std::numeric_limits::max() / 2) { + size_type __res = __m - __alignment; + + // When the __endian_factor == 2, our string representation assumes that the capacity + // (including the null terminator) is always even, so we have to make sure the lowest bit isn't set when the + // string grows to max_size() + if (__endian_factor == 2) + __res &= ~size_type(1); + + // We have to allocate space for the null terminator, but max_size() doesn't include it. + return __res - 1; } else { bool __uses_lsb = __endian_factor == 2; - return __uses_lsb ? __m - __alignment : (__m / 2) - __alignment; + return __uses_lsb ? __m - __alignment - 1 : (__m / 2) - __alignment - 1; } } @@ -1970,11 +1978,11 @@ void basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace( size_type __n_add, const value_type* __p_new_stuff) { size_type __ms = max_size(); - if (__delta_cap > __ms - __old_cap - 1) + if (__delta_cap > __ms - __old_cap) __throw_length_error(); pointer __old_p = __get_pointer(); size_type __cap = - __old_cap < __ms / 2 - __alignment ? __recommend(std::max(__old_cap + __delta_cap, 2 * __old_cap)) : __ms - 1; + __old_cap < __ms / 2 - __alignment ? __recommend(std::max(__old_cap + __delta_cap, 2 * __old_cap)) : __ms; __annotate_delete(); auto __allocation = std::__allocate_at_least(__alloc(), __cap + 1); pointer __p = __allocation.ptr; @@ -2017,7 +2025,7 @@ void __throw_length_error(); pointer __old_p = __get_pointer(); size_type __cap = - __old_cap < __ms / 2 - __alignment ? __recommend(std::max(__old_cap + __delta_cap, 2 * __old_cap)) : __ms - 1; + __old_cap < __ms / 2 - __alignment ? __recommend(std::max(__old_cap + __delta_cap, 2 * __old_cap)) : __ms; __annotate_delete(); auto __allocation = std::__allocate_at_least(__alloc(), __cap + 1); pointer __p = __allocation.ptr; @@ -2858,13 +2866,13 @@ inline void basic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str) "swapping non-equal allocators"); if (!__is_long()) __annotate_delete(); - if (this != &__str && !__str.__is_long()) + if (this != std::addressof(__str) && !__str.__is_long()) __str.__annotate_delete(); std::swap(__r_.first(), __str.__r_.first()); std::__swap_allocator(__alloc(), __str.__alloc()); if (!__is_long()) __annotate_new(__get_short_size()); - if (this != &__str && !__str.__is_long()) + if (this != std::addressof(__str) && !__str.__is_long()) __str.__annotate_new(__str.__get_short_size()); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/tgmath.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/tgmath.h deleted file mode 100644 index 7d81a110ed..0000000000 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/tgmath.h +++ /dev/null @@ -1,34 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___CXX03_TGMATH_H -#define _LIBCPP___CXX03_TGMATH_H - -/* - tgmath.h synopsis - -#include <__cxx03/ctgmath> - -*/ - -#include <__cxx03/__config> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -#ifdef __cplusplus -# include <__cxx03/ctgmath> -#else -# if __has_include_next() -# include_next -# endif -#endif - -#endif // _LIBCPP___CXX03_TGMATH_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/vector b/naiveproxy/src/third_party/libc++/src/include/__cxx03/vector index 8192ffc1a0..43e82cd24b 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/vector +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/vector @@ -432,10 +432,12 @@ public: template <__enable_if_t<__is_allocator<_Allocator>::value, int> = 0> _LIBCPP_HIDE_FROM_ABI vector(size_type __n, const value_type& __x, const allocator_type& __a) : __end_cap_(nullptr, __a) { + auto __guard = std::__make_exception_guard(__destroy_vector(*this)); if (__n > 0) { __vallocate(__n); __construct_at_end(__n, __x); } + __guard.__complete(); } template ::vector(vector&& __x, const __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr; } else { typedef move_iterator _Ip; - auto __guard = std::__make_exception_guard(__destroy_vector(*this)); - assign(_Ip(__x.begin()), _Ip(__x.end())); - __guard.__complete(); + __init_with_size(_Ip(__x.begin()), _Ip(__x.end()), __x.size()); } } @@ -1630,7 +1630,7 @@ private: return __n * __bits_per_word; } _LIBCPP_HIDE_FROM_ABI static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT { - return (__n - 1) / __bits_per_word + 1; + return __n > 0 ? (__n - 1) / __bits_per_word + 1 : size_type(0); } public: @@ -1891,7 +1891,7 @@ vector::__recommend(size_type __new_size) const { const size_type __cap = capacity(); if (__cap >= __ms / 2) return __ms; - return std::max(2 * __cap, __align_it(__new_size)); + return std::max(2 * __cap, __align_it(__new_size)); } // Default constructs __n objects starting at __end_ @@ -2142,11 +2142,13 @@ void vector::reserve(size_type __n) { template void vector::shrink_to_fit() _NOEXCEPT { - if (__external_cap_to_internal(size()) > __cap()) { + if (__external_cap_to_internal(size()) < __cap()) { #ifndef _LIBCPP_HAS_NO_EXCEPTIONS try { #endif // _LIBCPP_HAS_NO_EXCEPTIONS - vector(*this, allocator_type(__alloc())).swap(*this); + vector __v(*this, allocator_type(__alloc())); + if (__v.__cap() < __cap()) + __v.swap(*this); #ifndef _LIBCPP_HAS_NO_EXCEPTIONS } catch (...) { } diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/wchar.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/wchar.h index 91975f7df4..f30b18df9c 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/wchar.h +++ b/naiveproxy/src/third_party/libc++/src/include/__cxx03/wchar.h @@ -106,7 +106,7 @@ size_t wcsrtombs(char* restrict dst, const wchar_t** restrict src, size_t len, */ # include <__cxx03/__config> -# include <__cxx03/stddef.h> +# include # if defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS) # error \ diff --git a/naiveproxy/src/third_party/libc++/src/include/__cxx03/wctype.h b/naiveproxy/src/third_party/libc++/src/include/__cxx03/wctype.h deleted file mode 100644 index 131d8b51ea..0000000000 --- a/naiveproxy/src/third_party/libc++/src/include/__cxx03/wctype.h +++ /dev/null @@ -1,95 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___CXX03_WCTYPE_H -#define _LIBCPP___CXX03_WCTYPE_H - -/* - wctype.h synopsis - -Macros: - - WEOF - -Types: - - wint_t - wctrans_t - wctype_t - -int iswalnum(wint_t wc); -int iswalpha(wint_t wc); -int iswblank(wint_t wc); // C99 -int iswcntrl(wint_t wc); -int iswdigit(wint_t wc); -int iswgraph(wint_t wc); -int iswlower(wint_t wc); -int iswprint(wint_t wc); -int iswpunct(wint_t wc); -int iswspace(wint_t wc); -int iswupper(wint_t wc); -int iswxdigit(wint_t wc); -int iswctype(wint_t wc, wctype_t desc); -wctype_t wctype(const char* property); -wint_t towlower(wint_t wc); -wint_t towupper(wint_t wc); -wint_t towctrans(wint_t wc, wctrans_t desc); -wctrans_t wctrans(const char* property); - -*/ - -#include <__cxx03/__config> - -#if defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS) -# error \ - "The header is not supported since libc++ has been configured with LIBCXX_ENABLE_WIDE_CHARACTERS disabled" -#endif - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -// TODO: -// In the future, we should unconditionally include_next here and instead -// have a mode under which the library does not need libc++'s or -// at all (i.e. a mode without wchar_t). As it stands, we need to do that to completely -// bypass the using declarations in when we did not include <__cxx03/wctype.h>. -// Otherwise, a using declaration like `using ::wint_t` in will refer to -// nothing (with using_if_exists), and if we include another header that defines one -// of these declarations (e.g. ), the second `using ::wint_t` with using_if_exists -// will fail because it does not refer to the same declaration. -#if __has_include_next() -# include_next -# define _LIBCPP_INCLUDED_C_LIBRARY_WCTYPE_H -#endif - -#ifdef __cplusplus - -# undef iswalnum -# undef iswalpha -# undef iswblank -# undef iswcntrl -# undef iswdigit -# undef iswgraph -# undef iswlower -# undef iswprint -# undef iswpunct -# undef iswspace -# undef iswupper -# undef iswxdigit -# undef iswctype -# undef wctype -# undef towlower -# undef towupper -# undef towctrans -# undef wctrans - -#endif // __cplusplus - -#endif // _LIBCPP___CXX03_WCTYPE_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__debug_utils/strict_weak_ordering_check.h b/naiveproxy/src/third_party/libc++/src/include/__debug_utils/strict_weak_ordering_check.h index 3a9d887284..3724ca95c5 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__debug_utils/strict_weak_ordering_check.h +++ b/naiveproxy/src/third_party/libc++/src/include/__debug_utils/strict_weak_ordering_check.h @@ -27,7 +27,7 @@ template _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void __check_strict_weak_ordering_sorted(_RandomAccessIterator __first, _RandomAccessIterator __last, _Comp& __comp) { #if _LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_DEBUG - using __diff_t = __iter_diff_t<_RandomAccessIterator>; + using __diff_t = __iterator_difference_type<_RandomAccessIterator>; using _Comp_ref = __comp_ref_type<_Comp>; if (!__libcpp_is_constant_evaluated()) { // Check if the range is actually sorted. diff --git a/naiveproxy/src/third_party/libc++/src/include/__exception/exception.h b/naiveproxy/src/third_party/libc++/src/include/__exception/exception.h index f7dab6e83a..161cc49979 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__exception/exception.h +++ b/naiveproxy/src/third_party/libc++/src/include/__exception/exception.h @@ -48,7 +48,7 @@ public: __data_._DoFree = true; } - exception(exception const&) _NOEXCEPT {} + exception(exception const&) _NOEXCEPT : __data_() {} exception& operator=(exception const&) _NOEXCEPT { return *this; } diff --git a/naiveproxy/src/third_party/libc++/src/include/__expected/expected.h b/naiveproxy/src/third_party/libc++/src/include/__expected/expected.h index 0f446b8707..8b3eeebd38 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__expected/expected.h +++ b/naiveproxy/src/third_party/libc++/src/include/__expected/expected.h @@ -555,9 +555,10 @@ public: is_nothrow_constructible_v<_Tp, _Up> && is_nothrow_constructible_v<_Err, _OtherErr>) // strengthened : __base(__other.__has_val(), std::move(__other.__union())) {} - template + template > requires(!is_same_v, in_place_t> && !is_same_v> && - is_constructible_v<_Tp, _Up> && !__is_std_unexpected>::value && + !is_same_v, unexpect_t> && is_constructible_v<_Tp, _Up> && + !__is_std_unexpected>::value && (!is_same_v, bool> || !__is_std_expected>::value)) _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_Up, _Tp>) expected(_Up&& __u) noexcept(is_nothrow_constructible_v<_Tp, _Up>) // strengthened @@ -668,7 +669,7 @@ public: return *this; } - template + template > _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(_Up&& __v) requires(!is_same_v> && !__is_std_unexpected>::value && is_constructible_v<_Tp, _Up> && is_assignable_v<_Tp&, _Up> && @@ -886,14 +887,14 @@ public: return std::move(this->__unex()); } - template + template > _LIBCPP_HIDE_FROM_ABI constexpr _Tp value_or(_Up&& __v) const& { static_assert(is_copy_constructible_v<_Tp>, "value_type has to be copy constructible"); static_assert(is_convertible_v<_Up, _Tp>, "argument has to be convertible to value_type"); return this->__has_val() ? this->__val() : static_cast<_Tp>(std::forward<_Up>(__v)); } - template + template > _LIBCPP_HIDE_FROM_ABI constexpr _Tp value_or(_Up&& __v) && { static_assert(is_move_constructible_v<_Tp>, "value_type has to be move constructible"); static_assert(is_convertible_v<_Up, _Tp>, "argument has to be convertible to value_type"); diff --git a/naiveproxy/src/third_party/libc++/src/include/__filesystem/directory_entry.h b/naiveproxy/src/third_party/libc++/src/include/__filesystem/directory_entry.h index 5f236cf264..3513a4975a 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__filesystem/directory_entry.h +++ b/naiveproxy/src/third_party/libc++/src/include/__filesystem/directory_entry.h @@ -40,8 +40,6 @@ _LIBCPP_PUSH_MACROS _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_PUSH - class directory_entry { typedef filesystem::path _Path; @@ -459,8 +457,6 @@ private: directory_entry __elem_; }; -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_POP - _LIBCPP_END_NAMESPACE_FILESYSTEM #endif // _LIBCPP_STD_VER >= 17 && _LIBCPP_HAS_FILESYSTEM diff --git a/naiveproxy/src/third_party/libc++/src/include/__filesystem/directory_iterator.h b/naiveproxy/src/third_party/libc++/src/include/__filesystem/directory_iterator.h index f5085b39eb..5e9fea636d 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__filesystem/directory_iterator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__filesystem/directory_iterator.h @@ -34,8 +34,6 @@ _LIBCPP_PUSH_MACROS _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_PUSH - class _LIBCPP_HIDDEN __dir_stream; class directory_iterator { public: @@ -127,19 +125,15 @@ inline _LIBCPP_HIDE_FROM_ABI directory_iterator begin(directory_iterator __iter) inline _LIBCPP_HIDE_FROM_ABI directory_iterator end(directory_iterator) noexcept { return directory_iterator(); } -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_POP - _LIBCPP_END_NAMESPACE_FILESYSTEM # if _LIBCPP_STD_VER >= 20 template <> -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY inline constexpr bool - std::ranges::enable_borrowed_range = true; +inline constexpr bool std::ranges::enable_borrowed_range = true; template <> -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY inline constexpr bool - std::ranges::enable_view = true; +inline constexpr bool std::ranges::enable_view = true; # endif // _LIBCPP_STD_VER >= 20 diff --git a/naiveproxy/src/third_party/libc++/src/include/__filesystem/file_status.h b/naiveproxy/src/third_party/libc++/src/include/__filesystem/file_status.h index da316c8b02..eecaf3c492 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__filesystem/file_status.h +++ b/naiveproxy/src/third_party/libc++/src/include/__filesystem/file_status.h @@ -22,7 +22,7 @@ _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM -class _LIBCPP_EXPORTED_FROM_ABI file_status { +class file_status { public: // constructors _LIBCPP_HIDE_FROM_ABI file_status() noexcept : file_status(file_type::none) {} diff --git a/naiveproxy/src/third_party/libc++/src/include/__filesystem/filesystem_error.h b/naiveproxy/src/third_party/libc++/src/include/__filesystem/filesystem_error.h index 73592bba31..0df170f3d3 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__filesystem/filesystem_error.h +++ b/naiveproxy/src/third_party/libc++/src/include/__filesystem/filesystem_error.h @@ -27,7 +27,7 @@ _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM -class _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY _LIBCPP_EXPORTED_FROM_ABI filesystem_error : public system_error { +class _LIBCPP_EXPORTED_FROM_ABI filesystem_error : public system_error { public: _LIBCPP_HIDE_FROM_ABI filesystem_error(const string& __what, error_code __ec) : system_error(__ec, __what), __storage_(make_shared<_Storage>(path(), path())) { @@ -69,14 +69,12 @@ private: # if _LIBCPP_HAS_EXCEPTIONS template -[[__noreturn__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY void -__throw_filesystem_error(_Args&&... __args) { +[[__noreturn__]] inline _LIBCPP_HIDE_FROM_ABI void __throw_filesystem_error(_Args&&... __args) { throw filesystem_error(std::forward<_Args>(__args)...); } # else template -[[__noreturn__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY void -__throw_filesystem_error(_Args&&...) { +[[__noreturn__]] inline _LIBCPP_HIDE_FROM_ABI void __throw_filesystem_error(_Args&&...) { _LIBCPP_VERBOSE_ABORT("filesystem_error was thrown in -fno-exceptions mode"); } # endif diff --git a/naiveproxy/src/third_party/libc++/src/include/__filesystem/operations.h b/naiveproxy/src/third_party/libc++/src/include/__filesystem/operations.h index 29b6c2f798..0fd55c1941 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__filesystem/operations.h +++ b/naiveproxy/src/third_party/libc++/src/include/__filesystem/operations.h @@ -31,8 +31,6 @@ _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_PUSH - _LIBCPP_EXPORTED_FROM_ABI path __absolute(const path&, error_code* __ec = nullptr); _LIBCPP_EXPORTED_FROM_ABI path __canonical(const path&, error_code* __ec = nullptr); _LIBCPP_EXPORTED_FROM_ABI bool @@ -301,8 +299,6 @@ inline _LIBCPP_HIDE_FROM_ABI path weakly_canonical(path const& __p, error_code& return __weakly_canonical(__p, &__ec); } -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_POP - _LIBCPP_END_NAMESPACE_FILESYSTEM #endif // _LIBCPP_STD_VER >= 17 && _LIBCPP_HAS_FILESYSTEM diff --git a/naiveproxy/src/third_party/libc++/src/include/__filesystem/path.h b/naiveproxy/src/third_party/libc++/src/include/__filesystem/path.h index 381e5678a5..b3f324342f 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__filesystem/path.h +++ b/naiveproxy/src/third_party/libc++/src/include/__filesystem/path.h @@ -42,8 +42,6 @@ _LIBCPP_PUSH_MACROS _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_PUSH - template struct __can_convert_char { static const bool value = false; @@ -861,7 +859,7 @@ public: } // iterators - class _LIBCPP_EXPORTED_FROM_ABI iterator; + class iterator; typedef iterator const_iterator; iterator begin() const; @@ -910,14 +908,12 @@ inline _LIBCPP_HIDE_FROM_ABI void swap(path& __lhs, path& __rhs) noexcept { __lh _LIBCPP_EXPORTED_FROM_ABI size_t hash_value(const path& __p) noexcept; -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_POP - _LIBCPP_END_NAMESPACE_FILESYSTEM _LIBCPP_BEGIN_NAMESPACE_STD template <> -struct _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY hash : __unary_function { +struct hash : __unary_function { _LIBCPP_HIDE_FROM_ABI size_t operator()(filesystem::path const& __p) const noexcept { return filesystem::hash_value(__p); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__filesystem/path_iterator.h b/naiveproxy/src/third_party/libc++/src/include/__filesystem/path_iterator.h index e0f601662d..3fab2b7ff3 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__filesystem/path_iterator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__filesystem/path_iterator.h @@ -95,12 +95,10 @@ private: _ParserState __state_; }; -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY inline _LIBCPP_HIDE_FROM_ABI bool operator==(const path::iterator& __lhs, const path::iterator& __rhs) { return __lhs.__path_ptr_ == __rhs.__path_ptr_ && __lhs.__entry_.data() == __rhs.__entry_.data(); } -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY inline _LIBCPP_HIDE_FROM_ABI bool operator!=(const path::iterator& __lhs, const path::iterator& __rhs) { return !(__lhs == __rhs); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__filesystem/recursive_directory_iterator.h b/naiveproxy/src/third_party/libc++/src/include/__filesystem/recursive_directory_iterator.h index ad01a9982b..6ea875285b 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__filesystem/recursive_directory_iterator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__filesystem/recursive_directory_iterator.h @@ -33,8 +33,6 @@ _LIBCPP_PUSH_MACROS _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_PUSH - class recursive_directory_iterator { public: using value_type = directory_entry; @@ -140,19 +138,15 @@ inline _LIBCPP_HIDE_FROM_ABI recursive_directory_iterator end(recursive_director return recursive_directory_iterator(); } -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_POP - _LIBCPP_END_NAMESPACE_FILESYSTEM # if _LIBCPP_STD_VER >= 20 template <> -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY inline constexpr bool - std::ranges::enable_borrowed_range = true; +inline constexpr bool std::ranges::enable_borrowed_range = true; template <> -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY inline constexpr bool - std::ranges::enable_view = true; +inline constexpr bool std::ranges::enable_view = true; # endif // _LIBCPP_STD_VER >= 20 diff --git a/naiveproxy/src/third_party/libc++/src/include/__filesystem/space_info.h b/naiveproxy/src/third_party/libc++/src/include/__filesystem/space_info.h index 3fa57d3309..28f7ced40d 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__filesystem/space_info.h +++ b/naiveproxy/src/third_party/libc++/src/include/__filesystem/space_info.h @@ -21,7 +21,7 @@ _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM -struct _LIBCPP_EXPORTED_FROM_ABI space_info { +struct space_info { uintmax_t capacity; uintmax_t free; uintmax_t available; diff --git a/naiveproxy/src/third_party/libc++/src/include/__filesystem/u8path.h b/naiveproxy/src/third_party/libc++/src/include/__filesystem/u8path.h index a701425e42..885372b0d1 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__filesystem/u8path.h +++ b/naiveproxy/src/third_party/libc++/src/include/__filesystem/u8path.h @@ -24,8 +24,6 @@ _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_PUSH - template ::value, int> = 0> _LIBCPP_HIDE_FROM_ABI _LIBCPP_DEPRECATED_WITH_CHAR8_T path u8path(_InputIt __f, _InputIt __l) { static_assert( @@ -86,8 +84,6 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_DEPRECATED_WITH_CHAR8_T path u8path(const _Source& # endif } -_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_POP - _LIBCPP_END_NAMESPACE_FILESYSTEM #endif // _LIBCPP_STD_VER >= 17 diff --git a/naiveproxy/src/third_party/libc++/src/include/__flat_map/flat_map.h b/naiveproxy/src/third_party/libc++/src/include/__flat_map/flat_map.h index bf193f6d3c..159e652e1a 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__flat_map/flat_map.h +++ b/naiveproxy/src/third_party/libc++/src/include/__flat_map/flat_map.h @@ -29,7 +29,6 @@ #include <__flat_map/key_value_iterator.h> #include <__flat_map/sorted_unique.h> #include <__flat_map/utils.h> -#include <__functional/invoke.h> #include <__functional/is_transparent.h> #include <__functional/operations.h> #include <__fwd/memory.h> @@ -48,7 +47,7 @@ #include <__ranges/container_compatible_range.h> #include <__ranges/drop_view.h> #include <__ranges/from_range.h> -#include <__ranges/ref_view.h> +#include <__ranges/range_adaptor.h> #include <__ranges/size.h> #include <__ranges/subrange.h> #include <__ranges/zip_view.h> @@ -1125,8 +1124,7 @@ private: }; template > - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && - !__is_allocator<_MappedContainer>::value && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && !__is_allocator_v<_MappedContainer> && is_invocable_v) @@ -1139,7 +1137,7 @@ flat_map(_KeyContainer, _MappedContainer, _Compare = _Compare()) template requires(uses_allocator_v<_KeyContainer, _Allocator> && uses_allocator_v<_MappedContainer, _Allocator> && - !__is_allocator<_KeyContainer>::value && !__is_allocator<_MappedContainer>::value) + !__is_allocator_v<_KeyContainer> && !__is_allocator_v<_MappedContainer>) flat_map(_KeyContainer, _MappedContainer, _Allocator) -> flat_map; template - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && - !__is_allocator<_MappedContainer>::value && uses_allocator_v<_KeyContainer, _Allocator> && - uses_allocator_v<_MappedContainer, _Allocator> && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && !__is_allocator_v<_MappedContainer> && + uses_allocator_v<_KeyContainer, _Allocator> && uses_allocator_v<_MappedContainer, _Allocator> && is_invocable_v) @@ -1162,8 +1159,7 @@ flat_map(_KeyContainer, _MappedContainer, _Compare, _Allocator) _MappedContainer>; template > - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && - !__is_allocator<_MappedContainer>::value && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && !__is_allocator_v<_MappedContainer> && is_invocable_v) @@ -1176,7 +1172,7 @@ flat_map(sorted_unique_t, _KeyContainer, _MappedContainer, _Compare = _Compare() template requires(uses_allocator_v<_KeyContainer, _Allocator> && uses_allocator_v<_MappedContainer, _Allocator> && - !__is_allocator<_KeyContainer>::value && !__is_allocator<_MappedContainer>::value) + !__is_allocator_v<_KeyContainer> && !__is_allocator_v<_MappedContainer>) flat_map(sorted_unique_t, _KeyContainer, _MappedContainer, _Allocator) -> flat_map; template - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && - !__is_allocator<_MappedContainer>::value && uses_allocator_v<_KeyContainer, _Allocator> && - uses_allocator_v<_MappedContainer, _Allocator> && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && !__is_allocator_v<_MappedContainer> && + uses_allocator_v<_KeyContainer, _Allocator> && uses_allocator_v<_MappedContainer, _Allocator> && is_invocable_v) @@ -1199,19 +1194,19 @@ flat_map(sorted_unique_t, _KeyContainer, _MappedContainer, _Compare, _Allocator) _MappedContainer>; template >> - requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator<_Compare>::value) + requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator_v<_Compare>) flat_map(_InputIterator, _InputIterator, _Compare = _Compare()) -> flat_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare>; template >> - requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator<_Compare>::value) + requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator_v<_Compare>) flat_map(sorted_unique_t, _InputIterator, _InputIterator, _Compare = _Compare()) -> flat_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare>; template >, class _Allocator = allocator, - class = __enable_if_t::value && __is_allocator<_Allocator>::value>> + class = __enable_if_t && __is_allocator_v<_Allocator>>> flat_map(from_range_t, _Range&&, _Compare = _Compare(), _Allocator = _Allocator()) -> flat_map< __range_key_type<_Range>, __range_mapped_type<_Range>, @@ -1219,7 +1214,7 @@ flat_map(from_range_t, _Range&&, _Compare = _Compare(), _Allocator = _Allocator( vector<__range_key_type<_Range>, __allocator_traits_rebind_t<_Allocator, __range_key_type<_Range>>>, vector<__range_mapped_type<_Range>, __allocator_traits_rebind_t<_Allocator, __range_mapped_type<_Range>>>>; -template ::value>> +template >> flat_map(from_range_t, _Range&&, _Allocator) -> flat_map< __range_key_type<_Range>, __range_mapped_type<_Range>, @@ -1228,11 +1223,11 @@ flat_map(from_range_t, _Range&&, _Allocator) -> flat_map< vector<__range_mapped_type<_Range>, __allocator_traits_rebind_t<_Allocator, __range_mapped_type<_Range>>>>; template > - requires(!__is_allocator<_Compare>::value) + requires(!__is_allocator_v<_Compare>) flat_map(initializer_list>, _Compare = _Compare()) -> flat_map<_Key, _Tp, _Compare>; template > - requires(!__is_allocator<_Compare>::value) + requires(!__is_allocator_v<_Compare>) flat_map(sorted_unique_t, initializer_list>, _Compare = _Compare()) -> flat_map<_Key, _Tp, _Compare>; template diff --git a/naiveproxy/src/third_party/libc++/src/include/__flat_map/flat_multimap.h b/naiveproxy/src/third_party/libc++/src/include/__flat_map/flat_multimap.h index 260d93ed25..6a608723da 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__flat_map/flat_multimap.h +++ b/naiveproxy/src/third_party/libc++/src/include/__flat_map/flat_multimap.h @@ -22,7 +22,6 @@ #include <__algorithm/upper_bound.h> #include <__assert> #include <__compare/synth_three_way.h> -#include <__concepts/convertible_to.h> #include <__concepts/swappable.h> #include <__config> #include <__cstddef/byte.h> @@ -30,7 +29,6 @@ #include <__flat_map/key_value_iterator.h> #include <__flat_map/sorted_equivalent.h> #include <__flat_map/utils.h> -#include <__functional/invoke.h> #include <__functional/is_transparent.h> #include <__functional/operations.h> #include <__fwd/vector.h> @@ -47,7 +45,7 @@ #include <__ranges/container_compatible_range.h> #include <__ranges/drop_view.h> #include <__ranges/from_range.h> -#include <__ranges/ref_view.h> +#include <__ranges/range_adaptor.h> #include <__ranges/size.h> #include <__ranges/subrange.h> #include <__ranges/zip_view.h> @@ -57,14 +55,12 @@ #include <__type_traits/is_allocator.h> #include <__type_traits/is_nothrow_constructible.h> #include <__type_traits/is_same.h> -#include <__type_traits/maybe_const.h> #include <__utility/exception_guard.h> #include <__utility/move.h> #include <__utility/pair.h> #include <__utility/scope_guard.h> #include <__vector/vector.h> #include -#include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -928,8 +924,7 @@ private: }; template > - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && - !__is_allocator<_MappedContainer>::value && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && !__is_allocator_v<_MappedContainer> && is_invocable_v) @@ -942,7 +937,7 @@ flat_multimap(_KeyContainer, _MappedContainer, _Compare = _Compare()) template requires(uses_allocator_v<_KeyContainer, _Allocator> && uses_allocator_v<_MappedContainer, _Allocator> && - !__is_allocator<_KeyContainer>::value && !__is_allocator<_MappedContainer>::value) + !__is_allocator_v<_KeyContainer> && !__is_allocator_v<_MappedContainer>) flat_multimap(_KeyContainer, _MappedContainer, _Allocator) -> flat_multimap; template - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && - !__is_allocator<_MappedContainer>::value && uses_allocator_v<_KeyContainer, _Allocator> && - uses_allocator_v<_MappedContainer, _Allocator> && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && !__is_allocator_v<_MappedContainer> && + uses_allocator_v<_KeyContainer, _Allocator> && uses_allocator_v<_MappedContainer, _Allocator> && is_invocable_v) @@ -965,8 +959,7 @@ flat_multimap(_KeyContainer, _MappedContainer, _Compare, _Allocator) _MappedContainer>; template > - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && - !__is_allocator<_MappedContainer>::value && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && !__is_allocator_v<_MappedContainer> && is_invocable_v) @@ -979,7 +972,7 @@ flat_multimap(sorted_equivalent_t, _KeyContainer, _MappedContainer, _Compare = _ template requires(uses_allocator_v<_KeyContainer, _Allocator> && uses_allocator_v<_MappedContainer, _Allocator> && - !__is_allocator<_KeyContainer>::value && !__is_allocator<_MappedContainer>::value) + !__is_allocator_v<_KeyContainer> && !__is_allocator_v<_MappedContainer>) flat_multimap(sorted_equivalent_t, _KeyContainer, _MappedContainer, _Allocator) -> flat_multimap; template - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && - !__is_allocator<_MappedContainer>::value && uses_allocator_v<_KeyContainer, _Allocator> && - uses_allocator_v<_MappedContainer, _Allocator> && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && !__is_allocator_v<_MappedContainer> && + uses_allocator_v<_KeyContainer, _Allocator> && uses_allocator_v<_MappedContainer, _Allocator> && is_invocable_v) @@ -1002,19 +994,19 @@ flat_multimap(sorted_equivalent_t, _KeyContainer, _MappedContainer, _Compare, _A _MappedContainer>; template >> - requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator<_Compare>::value) + requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator_v<_Compare>) flat_multimap(_InputIterator, _InputIterator, _Compare = _Compare()) -> flat_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare>; template >> - requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator<_Compare>::value) + requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator_v<_Compare>) flat_multimap(sorted_equivalent_t, _InputIterator, _InputIterator, _Compare = _Compare()) -> flat_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare>; template >, class _Allocator = allocator, - class = __enable_if_t::value && __is_allocator<_Allocator>::value>> + class = __enable_if_t && __is_allocator_v<_Allocator>>> flat_multimap(from_range_t, _Range&&, _Compare = _Compare(), _Allocator = _Allocator()) -> flat_multimap< __range_key_type<_Range>, __range_mapped_type<_Range>, @@ -1022,7 +1014,7 @@ flat_multimap(from_range_t, _Range&&, _Compare = _Compare(), _Allocator = _Alloc vector<__range_key_type<_Range>, __allocator_traits_rebind_t<_Allocator, __range_key_type<_Range>>>, vector<__range_mapped_type<_Range>, __allocator_traits_rebind_t<_Allocator, __range_mapped_type<_Range>>>>; -template ::value>> +template >> flat_multimap(from_range_t, _Range&&, _Allocator) -> flat_multimap< __range_key_type<_Range>, __range_mapped_type<_Range>, @@ -1031,11 +1023,11 @@ flat_multimap(from_range_t, _Range&&, _Allocator) -> flat_multimap< vector<__range_mapped_type<_Range>, __allocator_traits_rebind_t<_Allocator, __range_mapped_type<_Range>>>>; template > - requires(!__is_allocator<_Compare>::value) + requires(!__is_allocator_v<_Compare>) flat_multimap(initializer_list>, _Compare = _Compare()) -> flat_multimap<_Key, _Tp, _Compare>; template > - requires(!__is_allocator<_Compare>::value) + requires(!__is_allocator_v<_Compare>) flat_multimap(sorted_equivalent_t, initializer_list>, _Compare = _Compare()) -> flat_multimap<_Key, _Tp, _Compare>; diff --git a/naiveproxy/src/third_party/libc++/src/include/__flat_map/key_value_iterator.h b/naiveproxy/src/third_party/libc++/src/include/__flat_map/key_value_iterator.h index d04a23d1f8..795651a079 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__flat_map/key_value_iterator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__flat_map/key_value_iterator.h @@ -20,7 +20,6 @@ #include <__type_traits/conditional.h> #include <__utility/forward.h> #include <__utility/move.h> -#include <__utility/pair.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header diff --git a/naiveproxy/src/third_party/libc++/src/include/__flat_set/flat_multiset.h b/naiveproxy/src/third_party/libc++/src/include/__flat_set/flat_multiset.h index 44d8af05a5..7be0b2d20c 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__flat_set/flat_multiset.h +++ b/naiveproxy/src/third_party/libc++/src/include/__flat_set/flat_multiset.h @@ -13,54 +13,41 @@ #include <__algorithm/equal_range.h> #include <__algorithm/lexicographical_compare_three_way.h> #include <__algorithm/lower_bound.h> -#include <__algorithm/min.h> #include <__algorithm/ranges_equal.h> #include <__algorithm/ranges_inplace_merge.h> #include <__algorithm/ranges_is_sorted.h> #include <__algorithm/ranges_sort.h> -#include <__algorithm/ranges_unique.h> #include <__algorithm/remove_if.h> #include <__algorithm/upper_bound.h> #include <__assert> #include <__compare/synth_three_way.h> -#include <__concepts/convertible_to.h> #include <__concepts/swappable.h> #include <__config> -#include <__cstddef/byte.h> -#include <__cstddef/ptrdiff_t.h> -#include <__flat_map/key_value_iterator.h> #include <__flat_map/sorted_equivalent.h> #include <__flat_set/ra_iterator.h> #include <__flat_set/utils.h> -#include <__functional/invoke.h> #include <__functional/is_transparent.h> #include <__functional/operations.h> #include <__fwd/vector.h> #include <__iterator/concepts.h> -#include <__iterator/distance.h> #include <__iterator/iterator_traits.h> #include <__iterator/prev.h> -#include <__iterator/ranges_iterator_traits.h> #include <__iterator/reverse_iterator.h> #include <__memory/allocator_traits.h> #include <__memory/uses_allocator.h> #include <__memory/uses_allocator_construction.h> -#include <__ranges/access.h> #include <__ranges/concepts.h> #include <__ranges/container_compatible_range.h> #include <__ranges/drop_view.h> #include <__ranges/from_range.h> -#include <__ranges/ref_view.h> +#include <__ranges/range_adaptor.h> #include <__ranges/size.h> #include <__ranges/subrange.h> -#include <__ranges/zip_view.h> -#include <__type_traits/conjunction.h> #include <__type_traits/container_traits.h> #include <__type_traits/invoke.h> #include <__type_traits/is_allocator.h> #include <__type_traits/is_nothrow_constructible.h> #include <__type_traits/is_same.h> -#include <__type_traits/maybe_const.h> #include <__utility/as_const.h> #include <__utility/exception_guard.h> #include <__utility/move.h> @@ -689,7 +676,7 @@ private: }; template > - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && is_invocable_v) @@ -697,12 +684,12 @@ flat_multiset(_KeyContainer, _Compare = _Compare()) -> flat_multiset; template - requires(uses_allocator_v<_KeyContainer, _Allocator> && !__is_allocator<_KeyContainer>::value) + requires(uses_allocator_v<_KeyContainer, _Allocator> && !__is_allocator_v<_KeyContainer>) flat_multiset(_KeyContainer, _Allocator) -> flat_multiset, _KeyContainer>; template - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && uses_allocator_v<_KeyContainer, _Allocator> && is_invocable_v flat_multiset; template > - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && is_invocable_v) @@ -719,12 +706,12 @@ flat_multiset(sorted_equivalent_t, _KeyContainer, _Compare = _Compare()) -> flat_multiset; template - requires(uses_allocator_v<_KeyContainer, _Allocator> && !__is_allocator<_KeyContainer>::value) + requires(uses_allocator_v<_KeyContainer, _Allocator> && !__is_allocator_v<_KeyContainer>) flat_multiset(sorted_equivalent_t, _KeyContainer, _Allocator) -> flat_multiset, _KeyContainer>; template - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && uses_allocator_v<_KeyContainer, _Allocator> && is_invocable_v flat_multiset(sorted_equivalent_t, _KeyContainer, _Compare, _Allocator) -> flat_multiset; -template >> - requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator<_Compare>::value) +template >> + requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator_v<_Compare>) flat_multiset(_InputIterator, _InputIterator, _Compare = _Compare()) - -> flat_multiset<__iter_value_type<_InputIterator>, _Compare>; + -> flat_multiset<__iterator_value_type<_InputIterator>, _Compare>; -template >> - requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator<_Compare>::value) +template >> + requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator_v<_Compare>) flat_multiset(sorted_equivalent_t, _InputIterator, _InputIterator, _Compare = _Compare()) - -> flat_multiset<__iter_value_type<_InputIterator>, _Compare>; + -> flat_multiset<__iterator_value_type<_InputIterator>, _Compare>; template >, class _Allocator = allocator>, - class = __enable_if_t::value && __is_allocator<_Allocator>::value>> + class = __enable_if_t && __is_allocator_v<_Allocator>>> flat_multiset(from_range_t, _Range&&, _Compare = _Compare(), _Allocator = _Allocator()) -> flat_multiset< ranges::range_value_t<_Range>, _Compare, vector, __allocator_traits_rebind_t<_Allocator, ranges::range_value_t<_Range>>>>; -template ::value>> +template >> flat_multiset(from_range_t, _Range&&, _Allocator) -> flat_multiset< ranges::range_value_t<_Range>, less>, vector, __allocator_traits_rebind_t<_Allocator, ranges::range_value_t<_Range>>>>; template > - requires(!__is_allocator<_Compare>::value) + requires(!__is_allocator_v<_Compare>) flat_multiset(initializer_list<_Key>, _Compare = _Compare()) -> flat_multiset<_Key, _Compare>; template > - requires(!__is_allocator<_Compare>::value) + requires(!__is_allocator_v<_Compare>) flat_multiset(sorted_equivalent_t, initializer_list<_Key>, _Compare = _Compare()) -> flat_multiset<_Key, _Compare>; template diff --git a/naiveproxy/src/third_party/libc++/src/include/__flat_set/flat_set.h b/naiveproxy/src/third_party/libc++/src/include/__flat_set/flat_set.h index 95cb998459..0c8fdb5a80 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__flat_set/flat_set.h +++ b/naiveproxy/src/third_party/libc++/src/include/__flat_set/flat_set.h @@ -12,7 +12,6 @@ #include <__algorithm/lexicographical_compare_three_way.h> #include <__algorithm/lower_bound.h> -#include <__algorithm/min.h> #include <__algorithm/ranges_adjacent_find.h> #include <__algorithm/ranges_equal.h> #include <__algorithm/ranges_inplace_merge.h> @@ -24,20 +23,16 @@ #include <__compare/synth_three_way.h> #include <__concepts/swappable.h> #include <__config> -#include <__cstddef/ptrdiff_t.h> #include <__flat_map/sorted_unique.h> #include <__flat_set/ra_iterator.h> #include <__flat_set/utils.h> -#include <__functional/invoke.h> #include <__functional/is_transparent.h> #include <__functional/operations.h> #include <__fwd/vector.h> #include <__iterator/concepts.h> -#include <__iterator/distance.h> #include <__iterator/iterator_traits.h> #include <__iterator/next.h> #include <__iterator/prev.h> -#include <__iterator/ranges_iterator_traits.h> #include <__iterator/reverse_iterator.h> #include <__memory/allocator_traits.h> #include <__memory/uses_allocator.h> @@ -47,10 +42,7 @@ #include <__ranges/container_compatible_range.h> #include <__ranges/drop_view.h> #include <__ranges/from_range.h> -#include <__ranges/ref_view.h> #include <__ranges/size.h> -#include <__ranges/subrange.h> -#include <__type_traits/conjunction.h> #include <__type_traits/container_traits.h> #include <__type_traits/invoke.h> #include <__type_traits/is_allocator.h> @@ -774,19 +766,19 @@ private: }; template > - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && is_invocable_v) flat_set(_KeyContainer, _Compare = _Compare()) -> flat_set; template - requires(uses_allocator_v<_KeyContainer, _Allocator> && !__is_allocator<_KeyContainer>::value) + requires(uses_allocator_v<_KeyContainer, _Allocator> && !__is_allocator_v<_KeyContainer>) flat_set(_KeyContainer, _Allocator) -> flat_set, _KeyContainer>; template - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && uses_allocator_v<_KeyContainer, _Allocator> && is_invocable_v flat_set(_KeyContainer, _Compare, _Allocator) -> flat_set; template > - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && is_invocable_v) @@ -802,12 +794,12 @@ flat_set(sorted_unique_t, _KeyContainer, _Compare = _Compare()) -> flat_set; template - requires(uses_allocator_v<_KeyContainer, _Allocator> && !__is_allocator<_KeyContainer>::value) + requires(uses_allocator_v<_KeyContainer, _Allocator> && !__is_allocator_v<_KeyContainer>) flat_set(sorted_unique_t, _KeyContainer, _Allocator) -> flat_set, _KeyContainer>; template - requires(!__is_allocator<_Compare>::value && !__is_allocator<_KeyContainer>::value && + requires(!__is_allocator_v<_Compare> && !__is_allocator_v<_KeyContainer> && uses_allocator_v<_KeyContainer, _Allocator> && is_invocable_v flat_set(sorted_unique_t, _KeyContainer, _Compare, _Allocator) -> flat_set; -template >> - requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator<_Compare>::value) +template >> + requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator_v<_Compare>) flat_set(_InputIterator, _InputIterator, _Compare = _Compare()) - -> flat_set<__iter_value_type<_InputIterator>, _Compare>; + -> flat_set<__iterator_value_type<_InputIterator>, _Compare>; -template >> - requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator<_Compare>::value) +template >> + requires(__has_input_iterator_category<_InputIterator>::value && !__is_allocator_v<_Compare>) flat_set(sorted_unique_t, _InputIterator, _InputIterator, _Compare = _Compare()) - -> flat_set<__iter_value_type<_InputIterator>, _Compare>; + -> flat_set<__iterator_value_type<_InputIterator>, _Compare>; template >, class _Allocator = allocator>, - class = __enable_if_t::value && __is_allocator<_Allocator>::value>> + class = __enable_if_t && __is_allocator_v<_Allocator>>> flat_set(from_range_t, _Range&&, _Compare = _Compare(), _Allocator = _Allocator()) -> flat_set< ranges::range_value_t<_Range>, _Compare, vector, __allocator_traits_rebind_t<_Allocator, ranges::range_value_t<_Range>>>>; -template ::value>> +template >> flat_set(from_range_t, _Range&&, _Allocator) -> flat_set< ranges::range_value_t<_Range>, less>, vector, __allocator_traits_rebind_t<_Allocator, ranges::range_value_t<_Range>>>>; template > - requires(!__is_allocator<_Compare>::value) + requires(!__is_allocator_v<_Compare>) flat_set(initializer_list<_Key>, _Compare = _Compare()) -> flat_set<_Key, _Compare>; template > - requires(!__is_allocator<_Compare>::value) + requires(!__is_allocator_v<_Compare>) flat_set(sorted_unique_t, initializer_list<_Key>, _Compare = _Compare()) -> flat_set<_Key, _Compare>; template diff --git a/naiveproxy/src/third_party/libc++/src/include/__format/formatter_output.h b/naiveproxy/src/third_party/libc++/src/include/__format/formatter_output.h index cc74e3858a..d53b6cec70 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__format/formatter_output.h +++ b/naiveproxy/src/third_party/libc++/src/include/__format/formatter_output.h @@ -45,7 +45,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD namespace __formatter { -struct _LIBCPP_EXPORTED_FROM_ABI __padding_size_result { +struct __padding_size_result { size_t __before_; size_t __after_; }; diff --git a/naiveproxy/src/third_party/libc++/src/include/__functional/function.h b/naiveproxy/src/third_party/libc++/src/include/__functional/function.h index dc112ebfd0..c768fd90d0 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__functional/function.h +++ b/naiveproxy/src/third_party/libc++/src/include/__functional/function.h @@ -15,16 +15,14 @@ #include <__cstddef/nullptr_t.h> #include <__exception/exception.h> #include <__functional/binary_function.h> -#include <__functional/invoke.h> #include <__functional/unary_function.h> #include <__memory/addressof.h> #include <__type_traits/aligned_storage.h> #include <__type_traits/decay.h> -#include <__type_traits/is_core_convertible.h> +#include <__type_traits/invoke.h> #include <__type_traits/is_scalar.h> #include <__type_traits/is_trivially_constructible.h> #include <__type_traits/is_trivially_destructible.h> -#include <__type_traits/is_void.h> #include <__type_traits/strip_signature.h> #include <__utility/forward.h> #include <__utility/move.h> @@ -95,29 +93,29 @@ template struct __maybe_derive_from_binary_function<_Rp(_A1, _A2)> : public __binary_function<_A1, _A2, _Rp> {}; template -_LIBCPP_HIDE_FROM_ABI bool __not_null(_Fp const&) { - return true; +_LIBCPP_HIDE_FROM_ABI bool __is_null(_Fp const&) { + return false; } template -_LIBCPP_HIDE_FROM_ABI bool __not_null(_Fp* __ptr) { - return __ptr; +_LIBCPP_HIDE_FROM_ABI bool __is_null(_Fp* __ptr) { + return !__ptr; } template -_LIBCPP_HIDE_FROM_ABI bool __not_null(_Ret _Class::*__ptr) { - return __ptr; +_LIBCPP_HIDE_FROM_ABI bool __is_null(_Ret _Class::* __ptr) { + return !__ptr; } template -_LIBCPP_HIDE_FROM_ABI bool __not_null(function<_Fp> const& __f) { - return !!__f; +_LIBCPP_HIDE_FROM_ABI bool __is_null(function<_Fp> const& __f) { + return !__f; } # if __has_extension(blocks) template -_LIBCPP_HIDE_FROM_ABI bool __not_null(_Rp (^__p)(_Args...)) { - return __p; +_LIBCPP_HIDE_FROM_ABI bool __is_null(_Rp (^__p)(_Args...)) { + return !__p; } # endif @@ -206,12 +204,13 @@ public: _LIBCPP_HIDE_FROM_ABI explicit __value_func(_Fp&& __f) : __f_(nullptr) { typedef __function::__func<_Fp, _Rp(_ArgTypes...)> _Fun; - if (__function::__not_null(__f)) { - if (sizeof(_Fun) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value) { - __f_ = ::new (std::addressof(__buf_)) _Fun(std::move(__f)); - } else { - __f_ = new _Fun(std::move(__f)); - } + if (__function::__is_null(__f)) + return; + + if (sizeof(_Fun) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value) { + __f_ = ::new (std::addressof(__buf_)) _Fun(std::move(__f)); + } else { + __f_ = new _Fun(std::move(__f)); } } @@ -356,7 +355,31 @@ struct __policy { // type. template _LIBCPP_HIDE_FROM_ABI static const __policy* __create() { - return __choose_policy<_Fun>(__use_small_storage<_Fun>()); + if constexpr (__use_small_storage<_Fun>::value) { + static constexpr __policy __policy = { + nullptr, + nullptr, + false, +# if _LIBCPP_HAS_RTTI + &typeid(_Fun) +# else + nullptr +# endif + }; + return &__policy; + } else { + static constexpr __policy __policy = { + std::addressof(__large_clone<_Fun>), + std::addressof(__large_destroy<_Fun>), + false, +# if _LIBCPP_HAS_RTTI + &typeid(_Fun) +# else + nullptr +# endif + }; + return &__policy; + } } _LIBCPP_HIDE_FROM_ABI static const __policy* __create_empty() { @@ -384,36 +407,6 @@ private: _LIBCPP_HIDE_FROM_ABI static void __large_destroy(void* __s) { delete static_cast<_Fun*>(__s); } - - template - _LIBCPP_HIDE_FROM_ABI static const __policy* __choose_policy(/* is_small = */ false_type) { - static constexpr __policy __policy = { - std::addressof(__large_clone<_Fun>), - std::addressof(__large_destroy<_Fun>), - false, -# if _LIBCPP_HAS_RTTI - &typeid(_Fun) -# else - nullptr -# endif - }; - return &__policy; - } - - template - _LIBCPP_HIDE_FROM_ABI static const __policy* __choose_policy(/* is_small = */ true_type) { - static constexpr __policy __policy = { - nullptr, - nullptr, - false, -# if _LIBCPP_HAS_RTTI - &typeid(_Fun) -# else - nullptr -# endif - }; - return &__policy; - } }; // Used to choose between perfect forwarding or pass-by-value. Pass-by-value is @@ -455,14 +448,15 @@ public: template , __policy_func>::value, int> = 0> _LIBCPP_HIDE_FROM_ABI explicit __policy_func(_Fp&& __f) : __policy_(__policy::__create_empty()) { - if (__function::__not_null(__f)) { - __func_ = __call_func<_Fp>; - __policy_ = __policy::__create<_Fp>(); - if (__use_small_storage<_Fp>()) { - ::new ((void*)&__buf_.__small) _Fp(std::move(__f)); - } else { - __buf_.__large = ::new _Fp(std::move(__f)); - } + if (__function::__is_null(__f)) + return; + + __func_ = __call_func<_Fp>; + __policy_ = __policy::__create<_Fp>(); + if (__use_small_storage<_Fp>()) { + ::new ((void*)&__buf_.__small) _Fp(std::move(__f)); + } else { + __buf_.__large = ::new _Fp(std::move(__f)); } } @@ -615,21 +609,9 @@ class function<_Rp(_ArgTypes...)> __func __f_; - template , function>, __is_invocable<_Fp, _ArgTypes...> >::value> - struct __callable; template - struct __callable<_Fp, true> { - static const bool value = - is_void<_Rp>::value || __is_core_convertible<__invoke_result_t<_Fp, _ArgTypes...>, _Rp>::value; - }; - template - struct __callable<_Fp, false> { - static const bool value = false; - }; - - template - using _EnableIfLValueCallable _LIBCPP_NODEBUG = __enable_if_t<__callable<_Fp&>::value>; + using _EnableIfLValueCallable _LIBCPP_NODEBUG = __enable_if_t< + _And<_IsNotSame<__remove_cvref_t<_Fp>, function>, __is_invocable_r<_Rp, _Fp&, _ArgTypes...>>::value>; public: typedef _Rp result_type; diff --git a/naiveproxy/src/third_party/libc++/src/include/__functional/hash.h b/naiveproxy/src/third_party/libc++/src/include/__functional/hash.h index 489a6f00b8..83bbf1b5e2 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__functional/hash.h +++ b/naiveproxy/src/third_party/libc++/src/include/__functional/hash.h @@ -21,6 +21,7 @@ #include <__type_traits/is_enum.h> #include <__type_traits/is_floating_point.h> #include <__type_traits/is_integral.h> +#include <__type_traits/is_unqualified.h> #include <__type_traits/underlying_type.h> #include <__utility/pair.h> #include <__utility/swap.h> @@ -355,7 +356,8 @@ struct __hash_impl { }; template -struct __hash_impl<_Tp, __enable_if_t::value> > : __unary_function<_Tp, size_t> { +struct __hash_impl<_Tp, __enable_if_t::value && __is_unqualified_v<_Tp> > > + : __unary_function<_Tp, size_t> { _LIBCPP_HIDE_FROM_ABI size_t operator()(_Tp __v) const _NOEXCEPT { using type = __underlying_type_t<_Tp>; return hash()(static_cast(__v)); @@ -363,17 +365,21 @@ struct __hash_impl<_Tp, __enable_if_t::value> > : __unary_function< }; template -struct __hash_impl<_Tp, __enable_if_t::value && (sizeof(_Tp) <= sizeof(size_t))> > +struct __hash_impl< + _Tp, + __enable_if_t::value && __is_unqualified_v<_Tp> && (sizeof(_Tp) <= sizeof(size_t))> > : __unary_function<_Tp, size_t> { _LIBCPP_HIDE_FROM_ABI size_t operator()(_Tp __v) const _NOEXCEPT { return static_cast(__v); } }; template -struct __hash_impl<_Tp, __enable_if_t::value && (sizeof(_Tp) > sizeof(size_t))> > +struct __hash_impl<_Tp, + __enable_if_t::value && __is_unqualified_v<_Tp> && (sizeof(_Tp) > sizeof(size_t))> > : __scalar_hash<_Tp> {}; template -struct __hash_impl<_Tp, __enable_if_t::value> > : __scalar_hash<_Tp> { +struct __hash_impl<_Tp, __enable_if_t::value && __is_unqualified_v<_Tp> > > + : __scalar_hash<_Tp> { _LIBCPP_HIDE_FROM_ABI size_t operator()(_Tp __v) const _NOEXCEPT { // -0.0 and 0.0 should return same hash if (__v == 0.0f) diff --git a/naiveproxy/src/third_party/libc++/src/include/__functional/is_transparent.h b/naiveproxy/src/third_party/libc++/src/include/__functional/is_transparent.h index 567df1a662..c2c6fbce24 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__functional/is_transparent.h +++ b/naiveproxy/src/third_party/libc++/src/include/__functional/is_transparent.h @@ -29,6 +29,14 @@ inline const bool __is_transparent_v<_Tp, _Key, __void_t(arg))`. +// +// This is different from `__is_transparent_v`, which is only a property of the comparator and doesn't provide +// additional semantic guarantees. +template +inline const bool __is_transparently_comparable_v = false; + _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___FUNCTIONAL_IS_TRANSPARENT diff --git a/naiveproxy/src/third_party/libc++/src/include/__functional/operations.h b/naiveproxy/src/third_party/libc++/src/include/__functional/operations.h index 7b0ea11db5..7f315ca851 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__functional/operations.h +++ b/naiveproxy/src/third_party/libc++/src/include/__functional/operations.h @@ -15,7 +15,9 @@ #include <__functional/unary_function.h> #include <__fwd/functional.h> #include <__type_traits/desugars_to.h> +#include <__type_traits/is_generic_transparent_comparator.h> #include <__type_traits/is_integral.h> +#include <__type_traits/make_transparent.h> #include <__utility/forward.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -377,6 +379,14 @@ struct less { typedef void is_transparent; }; +template +struct __make_transparent > { + using type _LIBCPP_NODEBUG = less<>; +}; + +template <> +inline const bool __is_generic_transparent_comparator_v> = true; + template inline const bool __desugars_to_v<__less_tag, less<>, _Tp, _Up> = true; @@ -466,6 +476,14 @@ struct greater { template inline const bool __desugars_to_v<__greater_tag, greater<>, _Tp, _Up> = true; + +template +struct __make_transparent> { + using type _LIBCPP_NODEBUG = greater<>; +}; + +template <> +inline const bool __is_generic_transparent_comparator_v> = true; #endif // Logical operations diff --git a/naiveproxy/src/third_party/libc++/src/include/__functional/ranges_operations.h b/naiveproxy/src/third_party/libc++/src/include/__functional/ranges_operations.h index df95843e7c..dc9da061af 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__functional/ranges_operations.h +++ b/naiveproxy/src/third_party/libc++/src/include/__functional/ranges_operations.h @@ -14,6 +14,7 @@ #include <__concepts/totally_ordered.h> #include <__config> #include <__type_traits/desugars_to.h> +#include <__type_traits/is_generic_transparent_comparator.h> #include <__utility/forward.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -108,6 +109,12 @@ inline const bool __desugars_to_v<__less_tag, ranges::less, _Tp, _Up> = true; template inline const bool __desugars_to_v<__greater_tag, ranges::greater, _Tp, _Up> = true; +template <> +inline const bool __is_generic_transparent_comparator_v = true; + +template <> +inline const bool __is_generic_transparent_comparator_v = true; + #endif // _LIBCPP_STD_VER >= 20 _LIBCPP_END_NAMESPACE_STD diff --git a/naiveproxy/src/third_party/libc++/src/include/__fwd/map.h b/naiveproxy/src/third_party/libc++/src/include/__fwd/map.h deleted file mode 100644 index 940298dd3e..0000000000 --- a/naiveproxy/src/third_party/libc++/src/include/__fwd/map.h +++ /dev/null @@ -1,31 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___FWD_MAP_H -#define _LIBCPP___FWD_MAP_H - -#include <__config> -#include <__fwd/functional.h> -#include <__fwd/memory.h> -#include <__fwd/pair.h> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -_LIBCPP_BEGIN_NAMESPACE_STD - -template , class _Allocator = allocator > > -class map; - -template , class _Allocator = allocator > > -class multimap; - -_LIBCPP_END_NAMESPACE_STD - -#endif // _LIBCPP___FWD_MAP_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__fwd/tuple.h b/naiveproxy/src/third_party/libc++/src/include/__fwd/tuple.h index fb922b29f3..dc96c03e20 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__fwd/tuple.h +++ b/naiveproxy/src/third_party/libc++/src/include/__fwd/tuple.h @@ -21,11 +21,25 @@ _LIBCPP_BEGIN_NAMESPACE_STD template struct tuple_element; +template +using __tuple_element_t _LIBCPP_NODEBUG = typename tuple_element<_Np, _Tp>::type; + #ifndef _LIBCPP_CXX03_LANG template class tuple; +template +inline const bool __is_tuple_v = false; + +template +inline const bool __is_tuple_v> = true; + +template +struct tuple_element<_Ip, tuple<_Tp...> > { + using type _LIBCPP_NODEBUG = __type_pack_element<_Ip, _Tp...>; +}; + template struct tuple_size; diff --git a/naiveproxy/src/third_party/libc++/src/include/__hash_table b/naiveproxy/src/third_party/libc++/src/include/__hash_table index dacc152030..5432abb4ab 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__hash_table +++ b/naiveproxy/src/third_party/libc++/src/include/__hash_table @@ -10,6 +10,7 @@ #ifndef _LIBCPP___HASH_TABLE #define _LIBCPP___HASH_TABLE +#include <__algorithm/fill_n.h> #include <__algorithm/max.h> #include <__algorithm/min.h> #include <__assert> @@ -28,7 +29,6 @@ #include <__memory/swap_allocator.h> #include <__memory/unique_ptr.h> #include <__new/launder.h> -#include <__type_traits/can_extract_key.h> #include <__type_traits/copy_cvref.h> #include <__type_traits/enable_if.h> #include <__type_traits/invoke.h> @@ -44,7 +44,9 @@ #include <__utility/forward.h> #include <__utility/move.h> #include <__utility/pair.h> +#include <__utility/scope_guard.h> #include <__utility/swap.h> +#include <__utility/try_key_extraction.h> #include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -165,7 +167,12 @@ public: } #endif - _LIBCPP_HIDE_FROM_ABI explicit __hash_node(__next_pointer __next, size_t __hash) : _Base(__next), __hash_(__hash) {} + template + _LIBCPP_HIDE_FROM_ABI explicit __hash_node(size_t __hash, _Alloc& __na, _Args&&... __args) + : _Base(nullptr), __hash_(__hash) { + allocator_traits<_Alloc>::construct(__na, std::addressof(__get_value()), std::forward<_Args>(__args)...); + } + _LIBCPP_HIDE_FROM_ABI ~__hash_node() {} }; @@ -200,22 +207,11 @@ struct __hash_node_types; template struct __hash_node_types<_NodePtr, __hash_node<_Tp, _VoidPtr> > { - typedef ptrdiff_t difference_type; - typedef size_t size_type; - - typedef __rebind_pointer_t<_NodePtr, void> __void_pointer; - typedef typename pointer_traits<_NodePtr>::element_type __node_type; - typedef _NodePtr __node_pointer; - typedef __hash_node_base<__node_pointer> __node_base_type; - typedef __rebind_pointer_t<_NodePtr, __node_base_type> __node_base_pointer; - - typedef typename __node_base_type::__next_pointer __next_pointer; + typedef typename __hash_node_base<_NodePtr>::__next_pointer __next_pointer; using __node_value_type _LIBCPP_NODEBUG = __get_hash_node_value_type_t<_Tp>; - typedef __rebind_pointer_t<_VoidPtr, __node_value_type> __node_value_type_pointer; - typedef __rebind_pointer_t<_VoidPtr, const __node_value_type> __const_node_value_type_pointer; private: static_assert(!is_const<__node_type>::value, "_NodePtr should never be a pointer to const"); @@ -236,13 +232,6 @@ struct __hash_node_types_from_iterator<__hash_local_iterator<_NodePtr> > : __has template struct __hash_node_types_from_iterator<__hash_const_local_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {}; -template -struct __make_hash_node_types { - typedef __hash_node<_NodeValueTp, _VoidPtr> _NodeTp; - typedef __rebind_pointer_t<_VoidPtr, _NodeTp> _NodePtr; - typedef __hash_node_types<_NodePtr> type; -}; - template class __hash_iterator { typedef __hash_node_types<_NodePtr> _NodeTypes; @@ -254,9 +243,9 @@ class __hash_iterator { public: typedef forward_iterator_tag iterator_category; typedef typename _NodeTypes::__node_value_type value_type; - typedef typename _NodeTypes::difference_type difference_type; + using difference_type = ptrdiff_t; typedef value_type& reference; - typedef typename _NodeTypes::__node_value_type_pointer pointer; + using pointer = __rebind_pointer_t<_NodePtr, value_type>; _LIBCPP_HIDE_FROM_ABI __hash_iterator() _NOEXCEPT : __node_(nullptr) {} @@ -321,9 +310,9 @@ public: typedef forward_iterator_tag iterator_category; typedef typename _NodeTypes::__node_value_type value_type; - typedef typename _NodeTypes::difference_type difference_type; + using difference_type = ptrdiff_t; typedef const value_type& reference; - typedef typename _NodeTypes::__const_node_value_type_pointer pointer; + using pointer = __rebind_pointer_t<_NodePtr, const value_type>; _LIBCPP_HIDE_FROM_ABI __hash_const_iterator() _NOEXCEPT : __node_(nullptr) {} @@ -386,9 +375,9 @@ class __hash_local_iterator { public: typedef forward_iterator_tag iterator_category; typedef typename _NodeTypes::__node_value_type value_type; - typedef typename _NodeTypes::difference_type difference_type; + using difference_type = ptrdiff_t; typedef value_type& reference; - typedef typename _NodeTypes::__node_value_type_pointer pointer; + using pointer = __rebind_pointer_t<_NodePtr, value_type>; _LIBCPP_HIDE_FROM_ABI __hash_local_iterator() _NOEXCEPT : __node_(nullptr) {} @@ -464,9 +453,9 @@ public: typedef forward_iterator_tag iterator_category; typedef typename _NodeTypes::__node_value_type value_type; - typedef typename _NodeTypes::difference_type difference_type; + using difference_type = ptrdiff_t; typedef const value_type& reference; - typedef typename _NodeTypes::__const_node_value_type_pointer pointer; + using pointer = __rebind_pointer_t<_ConstNodePtr, const value_type>; _LIBCPP_HIDE_FROM_ABI __hash_const_local_iterator() _NOEXCEPT : __node_(nullptr) {} @@ -645,10 +634,8 @@ public: private: typedef allocator_traits __alloc_traits; - typedef typename __make_hash_node_types<_Tp, typename __alloc_traits::void_pointer>::type _NodeTypes; public: - typedef typename _NodeTypes::__node_value_type __node_value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef typename __alloc_traits::pointer pointer; @@ -656,22 +643,23 @@ public: #ifndef _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE typedef typename __alloc_traits::size_type size_type; #else - typedef typename _NodeTypes::size_type size_type; + using size_type = size_t; #endif - typedef typename _NodeTypes::difference_type difference_type; + using difference_type = ptrdiff_t; public: // Create __node - typedef typename _NodeTypes::__node_type __node; - typedef __rebind_alloc<__alloc_traits, __node> __node_allocator; - typedef allocator_traits<__node_allocator> __node_traits; - typedef typename _NodeTypes::__void_pointer __void_pointer; - typedef typename _NodeTypes::__node_pointer __node_pointer; - typedef typename _NodeTypes::__node_pointer __node_const_pointer; - typedef typename _NodeTypes::__node_base_type __first_node; - typedef typename _NodeTypes::__node_base_pointer __node_base_pointer; - typedef typename _NodeTypes::__next_pointer __next_pointer; + using __void_pointer _LIBCPP_NODEBUG = typename __alloc_traits::void_pointer; + + using __node _LIBCPP_NODEBUG = __hash_node<_Tp, __void_pointer>; + using __node_allocator _LIBCPP_NODEBUG = __rebind_alloc<__alloc_traits, __node>; + using __node_traits _LIBCPP_NODEBUG = allocator_traits<__node_allocator>; + using __node_pointer _LIBCPP_NODEBUG = __rebind_pointer_t<__void_pointer, __node>; + + using __first_node _LIBCPP_NODEBUG = __hash_node_base<__node_pointer>; + using __node_base_pointer _LIBCPP_NODEBUG = __rebind_pointer_t<__void_pointer, __first_node>; + using __next_pointer _LIBCPP_NODEBUG = __node_base_pointer; private: // check for sane allocator pointer rebinding semantics. Rebinding the @@ -700,6 +688,38 @@ private: _LIBCPP_HIDE_FROM_ABI size_type& size() _NOEXCEPT { return __size_; } + _LIBCPP_HIDE_FROM_ABI void + __copy_construct(__next_pointer __other_iter, __next_pointer __own_iter, size_t __current_chash) { + auto __bucket_count = bucket_count(); + + for (; __other_iter; __other_iter = __other_iter->__next_) { + __node_holder __new_node = __construct_node_hash(__other_iter->__hash(), __other_iter->__upcast()->__get_value()); + + size_t __new_chash = std::__constrain_hash(__new_node->__hash(), __bucket_count); + if (__new_chash != __current_chash) { + __bucket_list_[__new_chash] = __own_iter; + __current_chash = __new_chash; + } + + __own_iter->__next_ = static_cast<__next_pointer>(__new_node.release()); + __own_iter = __own_iter->__next_; + } + } + + _LIBCPP_HIDE_FROM_ABI void __copy_construct(__next_pointer __other_iter) { + __next_pointer __own_iter = __first_node_.__ptr(); + { + __node_holder __new_node = __construct_node_hash(__other_iter->__hash(), __other_iter->__upcast()->__get_value()); + __own_iter->__next_ = static_cast<__next_pointer>(__new_node.release()); + } + + size_t __current_chash = std::__constrain_hash(__own_iter->__next_->__hash(), bucket_count()); + __bucket_list_[__current_chash] = __own_iter; + __other_iter = __other_iter->__next_; + __own_iter = __own_iter->__next_; + __copy_construct(__other_iter, __own_iter, __current_chash); + } + public: _LIBCPP_HIDE_FROM_ABI size_type size() const _NOEXCEPT { return __size_; } @@ -764,40 +784,66 @@ public: _LIBCPP_HIDE_FROM_ABI iterator __node_insert_multi(__node_pointer __nd); _LIBCPP_HIDE_FROM_ABI iterator __node_insert_multi(const_iterator __p, __node_pointer __nd); - template - _LIBCPP_HIDE_FROM_ABI pair __emplace_unique_key_args(_Key const& __k, _Args&&... __args); - - template - _LIBCPP_HIDE_FROM_ABI pair __emplace_unique_impl(_Args&&... __args); - - template - _LIBCPP_HIDE_FROM_ABI pair __emplace_unique(_Pp&& __x) { - return __emplace_unique_extract_key(std::forward<_Pp>(__x), __can_extract_key<_Pp, key_type>()); - } - - template ::value, int> = 0> - _LIBCPP_HIDE_FROM_ABI pair __emplace_unique(_First&& __f, _Second&& __s) { - return __emplace_unique_key_args(__f, std::forward<_First>(__f), std::forward<_Second>(__s)); - } - template _LIBCPP_HIDE_FROM_ABI pair __emplace_unique(_Args&&... __args) { - return __emplace_unique_impl(std::forward<_Args>(__args)...); - } - - template - _LIBCPP_HIDE_FROM_ABI pair __emplace_unique_extract_key(_Pp&& __x, __extract_key_fail_tag) { - return __emplace_unique_impl(std::forward<_Pp>(__x)); - } - template - _LIBCPP_HIDE_FROM_ABI pair __emplace_unique_extract_key(_Pp&& __x, __extract_key_self_tag) { - return __emplace_unique_key_args(__x, std::forward<_Pp>(__x)); - } - template - _LIBCPP_HIDE_FROM_ABI pair __emplace_unique_extract_key(_Pp&& __x, __extract_key_first_tag) { - return __emplace_unique_key_args(__x.first, std::forward<_Pp>(__x)); + return std::__try_key_extraction( + [this](const key_type& __key, _Args&&... __args2) { + size_t __hash = hash_function()(__key); + size_type __bc = bucket_count(); + bool __inserted = false; + __next_pointer __nd; + size_t __chash; + if (__bc != 0) { + __chash = std::__constrain_hash(__hash, __bc); + __nd = __bucket_list_[__chash]; + if (__nd != nullptr) { + for (__nd = __nd->__next_; + __nd != nullptr && + (__nd->__hash() == __hash || std::__constrain_hash(__nd->__hash(), __bc) == __chash); + __nd = __nd->__next_) { + if ((__nd->__hash() == __hash) && key_eq()(__nd->__upcast()->__get_value(), __key)) + goto __done; + } + } + } + { + __node_holder __h = __construct_node_hash(__hash, std::forward<_Args>(__args2)...); + if (size() + 1 > __bc * max_load_factor()) { + __rehash_unique(std::max(2 * __bc + !std::__is_hash_power2(__bc), + size_type(__math::ceil(float(size() + 1) / max_load_factor())))); + __bc = bucket_count(); + __chash = std::__constrain_hash(__hash, __bc); + } + // insert_after __bucket_list_[__chash], or __first_node if bucket is null + __next_pointer __pn = __bucket_list_[__chash]; + if (__pn == nullptr) { + __pn = __first_node_.__ptr(); + __h->__next_ = __pn->__next_; + __pn->__next_ = __h.get()->__ptr(); + // fix up __bucket_list_ + __bucket_list_[__chash] = __pn; + if (__h->__next_ != nullptr) + __bucket_list_[std::__constrain_hash(__h->__next_->__hash(), __bc)] = __h.get()->__ptr(); + } else { + __h->__next_ = __pn->__next_; + __pn->__next_ = static_cast<__next_pointer>(__h.get()); + } + __nd = static_cast<__next_pointer>(__h.release()); + // increment size + ++size(); + __inserted = true; + } + __done: + return pair(iterator(__nd), __inserted); + }, + [this](_Args&&... __args2) { + __node_holder __h = __construct_node(std::forward<_Args>(__args2)...); + pair __r = __node_insert_unique(__h.get()); + if (__r.second) + __h.release(); + return __r; + }, + std::forward<_Args>(__args)...); } template @@ -966,8 +1012,8 @@ private: template _LIBCPP_HIDE_FROM_ABI __node_holder __construct_node(_Args&&... __args); - template - _LIBCPP_HIDE_FROM_ABI __node_holder __construct_node_hash(size_t __hash, _First&& __f, _Rest&&... __rest); + template + _LIBCPP_HIDE_FROM_ABI __node_holder __construct_node_hash(size_t __hash, _Args&&... __args); _LIBCPP_HIDE_FROM_ABI void __copy_assign_alloc(const __hash_table& __u) { __copy_assign_alloc(__u, integral_constant()); @@ -991,7 +1037,21 @@ private: } _LIBCPP_HIDE_FROM_ABI void __move_assign_alloc(__hash_table&, false_type) _NOEXCEPT {} - _LIBCPP_HIDE_FROM_ABI void __deallocate_node(__next_pointer __np) _NOEXCEPT; + _LIBCPP_HIDE_FROM_ABI void __deallocate_node(__node_pointer __nd) _NOEXCEPT { + auto& __alloc = __node_alloc(); + __node_traits::destroy(__alloc, std::addressof(__nd->__get_value())); + std::__destroy_at(std::__to_address(__nd)); + __node_traits::deallocate(__alloc, __nd, 1); + } + + _LIBCPP_HIDE_FROM_ABI void __deallocate_node_list(__next_pointer __np) _NOEXCEPT { + while (__np != nullptr) { + __next_pointer __next = __np->__next_; + __deallocate_node(__np->__upcast()); + __np = __next; + } + } + _LIBCPP_HIDE_FROM_ABI __next_pointer __detach() _NOEXCEPT; template ::value, int> = 0> @@ -1048,16 +1108,29 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const allocator_type& __a __max_load_factor_(1.0f) {} template -__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __u) +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __other) : __bucket_list_(nullptr, - __bucket_list_deleter(allocator_traits<__pointer_allocator>::select_on_container_copy_construction( - __u.__bucket_list_.get_deleter().__alloc()), + __bucket_list_deleter(__pointer_alloc_traits::select_on_container_copy_construction( + __other.__bucket_list_.get_deleter().__alloc()), 0)), - __node_alloc_(allocator_traits<__node_allocator>::select_on_container_copy_construction(__u.__node_alloc())), + __node_alloc_(__node_traits::select_on_container_copy_construction(__other.__node_alloc())), __size_(0), - __hasher_(__u.hash_function()), - __max_load_factor_(__u.__max_load_factor_), - __key_eq_(__u.__key_eq_) {} + __hasher_(__other.hash_function()), + __max_load_factor_(__other.__max_load_factor_), + __key_eq_(__other.__key_eq_) { + if (__other.size() == 0) + return; + + auto& __bucket_list_del = __bucket_list_.get_deleter(); + auto __bucket_count = __other.bucket_count(); + __bucket_list_.reset(__pointer_alloc_traits::allocate(__bucket_list_del.__alloc(), __bucket_count)); + __bucket_list_del.size() = __bucket_count; + + std::fill_n(__bucket_list_.get(), __bucket_count, nullptr); + + __copy_construct(__other.__first_node_.__next_); + __size_ = __other.size(); +} template __hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __u, const allocator_type& __a) @@ -1116,7 +1189,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::~__hash_table() { static_assert(is_copy_constructible::value, "Hasher must be copy-constructible."); #endif - __deallocate_node(__first_node_.__next_); + __deallocate_node_list(__first_node_.__next_); } template @@ -1131,28 +1204,76 @@ void __hash_table<_Tp, _Hash, _Equal, _Alloc>::__copy_assign_alloc(const __hash_ } template -__hash_table<_Tp, _Hash, _Equal, _Alloc>& __hash_table<_Tp, _Hash, _Equal, _Alloc>::operator=(const __hash_table& __u) { - if (this != std::addressof(__u)) { - __copy_assign_alloc(__u); - hash_function() = __u.hash_function(); - key_eq() = __u.key_eq(); - max_load_factor() = __u.max_load_factor(); - __assign_multi(__u.begin(), __u.end()); - } - return *this; -} +__hash_table<_Tp, _Hash, _Equal, _Alloc>& +__hash_table<_Tp, _Hash, _Equal, _Alloc>::operator=(const __hash_table& __other) { + if (this == std::addressof(__other)) + return *this; -template -void __hash_table<_Tp, _Hash, _Equal, _Alloc>::__deallocate_node(__next_pointer __np) _NOEXCEPT { - __node_allocator& __na = __node_alloc(); - while (__np != nullptr) { - __next_pointer __next = __np->__next_; - __node_pointer __real_np = __np->__upcast(); - __node_traits::destroy(__na, std::addressof(__real_np->__get_value())); - std::__destroy_at(std::addressof(*__real_np)); - __node_traits::deallocate(__na, __real_np, 1); - __np = __next; + __copy_assign_alloc(__other); + hash_function() = __other.hash_function(); + key_eq() = __other.key_eq(); + max_load_factor() = __other.max_load_factor(); + + if (__other.size() == 0) { + clear(); + return *this; } + + auto __bucket_count = __other.bucket_count(); + if (__bucket_count != bucket_count()) { + auto& __bucket_list_del = __bucket_list_.get_deleter(); + __bucket_list_.reset(__pointer_alloc_traits::allocate(__bucket_list_del.__alloc(), __bucket_count)); + __bucket_list_del.size() = __bucket_count; + } + std::fill_n(__bucket_list_.get(), __bucket_count, nullptr); + + if (!__first_node_.__next_) { + __copy_construct(__other.__first_node_.__next_); + __size_ = __other.size(); + return *this; + } + + __next_pointer __other_iter = __other.__first_node_.__next_; + __next_pointer __own_iter = __first_node_.__ptr(); + { + __node_pointer __next = __own_iter->__next_->__upcast(); + __assign_value(__next->__get_value(), __other_iter->__upcast()->__get_value()); + __next->__hash_ = __other_iter->__hash(); + } + size_t __current_chash = std::__constrain_hash(__own_iter->__next_->__hash(), __bucket_count); + __bucket_list_[__current_chash] = __own_iter; + __other_iter = __other_iter->__next_; + __own_iter = __own_iter->__next_; + + // Go through the nodes of the incoming hash table and copy then into the destination hash table, reusing as many + // existing nodes as posssible in the destination. + while (__other_iter && __own_iter->__next_) { + __node_pointer __next = __own_iter->__next_->__upcast(); + __assign_value(__next->__get_value(), __other_iter->__upcast()->__get_value()); + __next->__hash_ = __other_iter->__hash(); + + size_t __new_chash = std::__constrain_hash(__next->__hash_, __bucket_count); + if (__new_chash != __current_chash) { + __bucket_list_[__new_chash] = __own_iter; + __current_chash = __new_chash; + } + + __other_iter = __other_iter->__next_; + __own_iter = __own_iter->__next_; + } + + // At this point we either have consumed the whole incoming hash table, or we don't have any more nodes to reuse in + // the destination. Either continue with constructing new nodes, or deallocate the left over nodes. + if (__own_iter->__next_) { + __deallocate_node_list(__own_iter->__next_); + __own_iter->__next_ = nullptr; + } else { + __copy_construct(__other_iter, __own_iter, __current_chash); + } + + __size_ = __other.size(); + + return *this; } template @@ -1198,23 +1319,14 @@ void __hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign(__hash_table& __u, max_load_factor() = __u.max_load_factor(); if (bucket_count() != 0) { __next_pointer __cache = __detach(); -#if _LIBCPP_HAS_EXCEPTIONS - try { -#endif // _LIBCPP_HAS_EXCEPTIONS - const_iterator __i = __u.begin(); - while (__cache != nullptr && __u.size() != 0) { - __assign_value(__cache->__upcast()->__get_value(), std::move(__u.remove(__i++)->__get_value())); - __next_pointer __next = __cache->__next_; - __node_insert_multi(__cache->__upcast()); - __cache = __next; - } -#if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - __deallocate_node(__cache); - throw; + auto __guard = std::__make_scope_guard([&] { __deallocate_node_list(__cache); }); + const_iterator __i = __u.begin(); + while (__cache != nullptr && __u.size() != 0) { + __assign_value(__cache->__upcast()->__get_value(), std::move(__u.remove(__i++)->__get_value())); + __next_pointer __next = __cache->__next_; + __node_insert_multi(__cache->__upcast()); + __cache = __next; } -#endif // _LIBCPP_HAS_EXCEPTIONS - __deallocate_node(__cache); } const_iterator __i = __u.begin(); while (__u.size() != 0) @@ -1242,22 +1354,13 @@ void __hash_table<_Tp, _Hash, _Equal, _Alloc>::__assign_unique(_InputIterator __ if (bucket_count() != 0) { __next_pointer __cache = __detach(); -#if _LIBCPP_HAS_EXCEPTIONS - try { -#endif // _LIBCPP_HAS_EXCEPTIONS - for (; __cache != nullptr && __first != __last; ++__first) { - __assign_value(__cache->__upcast()->__get_value(), *__first); - __next_pointer __next = __cache->__next_; - __node_insert_unique(__cache->__upcast()); - __cache = __next; - } -#if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - __deallocate_node(__cache); - throw; + auto __guard = std::__make_scope_guard([&] { __deallocate_node_list(__cache); }); + for (; __cache != nullptr && __first != __last; ++__first) { + __assign_value(__cache->__upcast()->__get_value(), *__first); + __next_pointer __next = __cache->__next_; + __node_insert_unique(__cache->__upcast()); + __cache = __next; } -#endif // _LIBCPP_HAS_EXCEPTIONS - __deallocate_node(__cache); } for (; __first != __last; ++__first) __emplace_unique(*__first); @@ -1272,22 +1375,13 @@ void __hash_table<_Tp, _Hash, _Equal, _Alloc>::__assign_multi(_InputIterator __f "__assign_multi may only be called with the containers value type or the nodes value type"); if (bucket_count() != 0) { __next_pointer __cache = __detach(); -#if _LIBCPP_HAS_EXCEPTIONS - try { -#endif // _LIBCPP_HAS_EXCEPTIONS - for (; __cache != nullptr && __first != __last; ++__first) { - __assign_value(__cache->__upcast()->__get_value(), *__first); - __next_pointer __next = __cache->__next_; - __node_insert_multi(__cache->__upcast()); - __cache = __next; - } -#if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - __deallocate_node(__cache); - throw; + auto __guard = std::__make_scope_guard([&] { __deallocate_node_list(__cache); }); + for (; __cache != nullptr && __first != __last; ++__first) { + __assign_value(__cache->__upcast()->__get_value(), *__first); + __next_pointer __next = __cache->__next_; + __node_insert_multi(__cache->__upcast()); + __cache = __next; } -#endif // _LIBCPP_HAS_EXCEPTIONS - __deallocate_node(__cache); } for (; __first != __last; ++__first) __emplace_multi(*__first); @@ -1320,7 +1414,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::end() const _NOEXCEPT { template void __hash_table<_Tp, _Hash, _Equal, _Alloc>::clear() _NOEXCEPT { if (size() > 0) { - __deallocate_node(__first_node_.__next_); + __deallocate_node_list(__first_node_.__next_); __first_node_.__next_ = nullptr; size_type __bc = bucket_count(); for (size_type __i = 0; __i < __bc; ++__i) @@ -1506,69 +1600,6 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi(const_iterator __p return __node_insert_multi(__cp); } -template -template -pair::iterator, bool> -__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique_key_args(_Key const& __k, _Args&&... __args) { - size_t __hash = hash_function()(__k); - size_type __bc = bucket_count(); - bool __inserted = false; - __next_pointer __nd; - size_t __chash; - if (__bc != 0) { - __chash = std::__constrain_hash(__hash, __bc); - __nd = __bucket_list_[__chash]; - if (__nd != nullptr) { - for (__nd = __nd->__next_; - __nd != nullptr && (__nd->__hash() == __hash || std::__constrain_hash(__nd->__hash(), __bc) == __chash); - __nd = __nd->__next_) { - if ((__nd->__hash() == __hash) && key_eq()(__nd->__upcast()->__get_value(), __k)) - goto __done; - } - } - } - { - __node_holder __h = __construct_node_hash(__hash, std::forward<_Args>(__args)...); - if (size() + 1 > __bc * max_load_factor() || __bc == 0) { - __rehash_unique(std::max( - 2 * __bc + !std::__is_hash_power2(__bc), size_type(__math::ceil(float(size() + 1) / max_load_factor())))); - __bc = bucket_count(); - __chash = std::__constrain_hash(__hash, __bc); - } - // insert_after __bucket_list_[__chash], or __first_node if bucket is null - __next_pointer __pn = __bucket_list_[__chash]; - if (__pn == nullptr) { - __pn = __first_node_.__ptr(); - __h->__next_ = __pn->__next_; - __pn->__next_ = __h.get()->__ptr(); - // fix up __bucket_list_ - __bucket_list_[__chash] = __pn; - if (__h->__next_ != nullptr) - __bucket_list_[std::__constrain_hash(__h->__next_->__hash(), __bc)] = __h.get()->__ptr(); - } else { - __h->__next_ = __pn->__next_; - __pn->__next_ = static_cast<__next_pointer>(__h.get()); - } - __nd = static_cast<__next_pointer>(__h.release()); - // increment size - ++size(); - __inserted = true; - } -__done: - return pair(iterator(__nd), __inserted); -} - -template -template -pair::iterator, bool> -__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique_impl(_Args&&... __args) { - __node_holder __h = __construct_node(std::forward<_Args>(__args)...); - pair __r = __node_insert_unique(__h.get()); - if (__r.second) - __h.release(); - return __r; -} - template template typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator @@ -1803,16 +1834,13 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node(_Args&&... __args) { __node_allocator& __na = __node_alloc(); __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); - // Begin the lifetime of the node itself. Note that this doesn't begin the lifetime of the value - // held inside the node, since we need to use the allocator's construct() method for that. + // Begin the lifetime of the node itself and the value_type contained within. // // We don't use the allocator's construct() method to construct the node itself since the // Cpp17FooInsertable named requirements don't require the allocator's construct() method // to work on anything other than the value_type. - std::__construct_at(std::addressof(*__h), /* next = */ nullptr, /* hash = */ 0); + std::__construct_at(std::addressof(*__h), /* hash = */ 0, __na, std::forward<_Args>(__args)...); - // Now construct the value_type using the allocator's construct() method. - __node_traits::construct(__na, std::addressof(__h->__get_value()), std::forward<_Args>(__args)...); __h.get_deleter().__value_constructed = true; __h->__hash_ = hash_function()(__h->__get_value()); @@ -1820,15 +1848,13 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node(_Args&&... __args) { } template -template +template typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder -__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node_hash(size_t __hash, _First&& __f, _Rest&&... __rest) { - static_assert(!__is_hash_value_type<_First, _Rest...>::value, "Construct cannot be called with a hash value type"); +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node_hash(size_t __hash, _Args&&... __args) { + static_assert(!__is_hash_value_type<_Args...>::value, "Construct cannot be called with a hash value type"); __node_allocator& __na = __node_alloc(); __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); - std::__construct_at(std::addressof(*__h), /* next = */ nullptr, /* hash = */ __hash); - __node_traits::construct( - __na, std::addressof(__h->__get_value()), std::forward<_First>(__f), std::forward<_Rest>(__rest)...); + std::__construct_at(std::addressof(*__h), /* hash = */ __hash, __na, std::forward<_Args>(__args)...); __h.get_deleter().__value_constructed = true; return __h; } @@ -1848,12 +1874,61 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __p) { template typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator __hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __first, const_iterator __last) { - for (const_iterator __p = __first; __first != __last; __p = __first) { - ++__first; - erase(__p); + if (__first == __last) + return iterator(__last.__node_); + + // current node + __next_pointer __current = __first.__node_; + size_type __bucket_count = bucket_count(); + size_t __chash = std::__constrain_hash(__current->__hash(), __bucket_count); + // find previous node + __next_pointer __before_first = __bucket_list_[__chash]; + for (; __before_first->__next_ != __current; __before_first = __before_first->__next_) + ; + + __next_pointer __last_node = __last.__node_; + + // If __before_first is in the same bucket (i.e. the first element we erase is not the first in the bucket), clear + // this bucket first without re-linking it + if (__before_first != __first_node_.__ptr() && + std::__constrain_hash(__before_first->__hash(), __bucket_count) == __chash) { + while (__current != __last_node) { + auto __next = __current->__next_; + __deallocate_node(__current->__upcast()); + __current = __next; + --__size_; + + if (__next) { + if (auto __next_chash = std::__constrain_hash(__next->__hash(), __bucket_count); __next_chash != __chash) { + __bucket_list_[__next_chash] = __before_first; + __chash = __next_chash; + break; + } + } + } } - __next_pointer __np = __last.__node_; - return iterator(__np); + + while (__current != __last_node) { + auto __next = __current->__next_; + __deallocate_node(__current->__upcast()); + __current = __next; + --__size_; + + // When switching buckets, set the old bucket to be empty and update the next bucket to have __before_first as its + // before-first element + if (__next) { + if (auto __next_chash = std::__constrain_hash(__next->__hash(), __bucket_count); __next_chash != __chash) { + __bucket_list_[__chash] = nullptr; + __bucket_list_[__next_chash] = __before_first; + __chash = __next_chash; + } + } + } + + // re-link __before_first with __last + __before_first->__next_ = __current; + + return iterator(__last.__node_); } template diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/back_insert_iterator.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/back_insert_iterator.h index 3a11fae4cb..d051c08751 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/back_insert_iterator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/back_insert_iterator.h @@ -26,15 +26,9 @@ _LIBCPP_PUSH_MACROS _LIBCPP_BEGIN_NAMESPACE_STD -_LIBCPP_SUPPRESS_DEPRECATED_PUSH template class back_insert_iterator -#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) - : public iterator -#endif -{ - _LIBCPP_SUPPRESS_DEPRECATED_POP - + : public __iterator_base, output_iterator_tag, void, void, void, void> { protected: _Container* container; diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/bounded_iter.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/bounded_iter.h index d12750d1f8..d2a0906112 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/bounded_iter.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/bounded_iter.h @@ -74,12 +74,12 @@ struct __bounded_iter { _LIBCPP_HIDE_FROM_ABI __bounded_iter(__bounded_iter const&) = default; _LIBCPP_HIDE_FROM_ABI __bounded_iter(__bounded_iter&&) = default; - template < class _OtherIterator, - __enable_if_t< - _And< is_convertible, - _Or >, - is_same > > > >::value, - int> = 0> + template , + _Or >, + is_same > > > >::value, + int> = 0> _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __bounded_iter(__bounded_iter<_OtherIterator> const& __other) _NOEXCEPT : __current_(__other.__current_), __begin_(__other.__begin_), @@ -116,8 +116,7 @@ public: // These operations check that the iterator is dereferenceable. Since the class invariant is // that the iterator is always within `[begin, end]`, we only need to check it's not pointing to // `end`. This is easier for the optimizer because it aligns with the `iter != container.end()` - // checks that typical callers already use (see - // https://github.com/llvm/llvm-project/issues/78829). + // checks that typical callers already use (see https://llvm.org/PR78829). _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 reference operator*() const _NOEXCEPT { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS( __current_ != __end_, "__bounded_iter::operator*: Attempt to dereference an iterator at the end"); diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/concepts.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/concepts.h index 20a1ab4691..f38688734b 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/concepts.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/concepts.h @@ -118,7 +118,7 @@ concept __signed_integer_like = signed_integral<_Tp>; template concept weakly_incrementable = - // TODO: remove this once the clang bug is fixed (bugs.llvm.org/PR48173). + // TODO: remove this once the clang bug is fixed (https://llvm.org/PR48173). !same_as<_Ip, bool> && // Currently, clang does not handle bool correctly. movable<_Ip> && requires(_Ip __i) { typename iter_difference_t<_Ip>; diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/cpp17_iterator_concepts.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/cpp17_iterator_concepts.h index ba3536b686..ecd30d8e11 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/cpp17_iterator_concepts.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/cpp17_iterator_concepts.h @@ -68,7 +68,8 @@ concept __cpp17_default_constructible = is_default_constructible_v<_Tp>; template concept __cpp17_iterator = __cpp17_copy_constructible<_Iter> && __cpp17_copy_assignable<_Iter> && __cpp17_destructible<_Iter> && - (is_signed_v<__iter_diff_t<_Iter>> || is_void_v<__iter_diff_t<_Iter>>) && requires(_Iter __iter) { + (is_signed_v<__iterator_difference_type<_Iter>> || is_void_v<__iterator_difference_type<_Iter>>) && + requires(_Iter __iter) { { *__iter }; { ++__iter } -> same_as<_Iter&>; }; @@ -81,8 +82,8 @@ concept __cpp17_input_iterator = { __lhs != std::as_const(__rhs) } -> __boolean_testable; { std::as_const(__lhs) != std::as_const(__rhs) } -> __boolean_testable; - { *__lhs } -> same_as<__iter_reference<_Iter>>; - { *std::as_const(__lhs) } -> same_as<__iter_reference<_Iter>>; + { *__lhs } -> same_as<__iterator_reference<_Iter>>; + { *std::as_const(__lhs) } -> same_as<__iterator_reference<_Iter>>; { ++__lhs } -> same_as<_Iter&>; { (void)__lhs++ }; @@ -101,19 +102,19 @@ template concept __cpp17_forward_iterator = __cpp17_input_iterator<_Iter> && __cpp17_default_constructible<_Iter> && requires(_Iter __iter) { { __iter++ } -> convertible_to; - { *__iter++ } -> same_as<__iter_reference<_Iter>>; + { *__iter++ } -> same_as<__iterator_reference<_Iter>>; }; template concept __cpp17_bidirectional_iterator = __cpp17_forward_iterator<_Iter> && requires(_Iter __iter) { { --__iter } -> same_as<_Iter&>; { __iter-- } -> convertible_to; - { *__iter-- } -> same_as<__iter_reference<_Iter>>; + { *__iter-- } -> same_as<__iterator_reference<_Iter>>; }; template concept __cpp17_random_access_iterator = - __cpp17_bidirectional_iterator<_Iter> && requires(_Iter __iter, __iter_diff_t<_Iter> __n) { + __cpp17_bidirectional_iterator<_Iter> && requires(_Iter __iter, __iterator_difference_type<_Iter> __n) { { __iter += __n } -> same_as<_Iter&>; { __iter + __n } -> same_as<_Iter>; @@ -125,13 +126,13 @@ concept __cpp17_random_access_iterator = { __iter - __n } -> same_as<_Iter>; { std::as_const(__iter) - __n } -> same_as<_Iter>; - { __iter - __iter } -> same_as<__iter_diff_t<_Iter>>; - { std::as_const(__iter) - __iter } -> same_as<__iter_diff_t<_Iter>>; - { __iter - std::as_const(__iter) } -> same_as<__iter_diff_t<_Iter>>; - { std::as_const(__iter) - std::as_const(__iter) } -> same_as<__iter_diff_t<_Iter>>; + { __iter - __iter } -> same_as<__iterator_difference_type<_Iter>>; + { std::as_const(__iter) - __iter } -> same_as<__iterator_difference_type<_Iter>>; + { __iter - std::as_const(__iter) } -> same_as<__iterator_difference_type<_Iter>>; + { std::as_const(__iter) - std::as_const(__iter) } -> same_as<__iterator_difference_type<_Iter>>; - { __iter[__n] } -> convertible_to<__iter_reference<_Iter>>; - { std::as_const(__iter)[__n] } -> convertible_to<__iter_reference<_Iter>>; + { __iter[__n] } -> convertible_to<__iterator_reference<_Iter>>; + { std::as_const(__iter)[__n] } -> convertible_to<__iterator_reference<_Iter>>; { __iter < __iter } -> __boolean_testable; { std::as_const(__iter) < __iter } -> __boolean_testable; diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/distance.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/distance.h index 1732aa527f..9be9db0f0c 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/distance.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/distance.h @@ -10,41 +10,71 @@ #ifndef _LIBCPP___ITERATOR_DISTANCE_H #define _LIBCPP___ITERATOR_DISTANCE_H +#include <__algorithm/for_each_segment.h> #include <__config> #include <__iterator/concepts.h> #include <__iterator/incrementable_traits.h> #include <__iterator/iterator_traits.h> +#include <__iterator/segmented_iterator.h> #include <__ranges/access.h> #include <__ranges/concepts.h> #include <__ranges/size.h> #include <__type_traits/decay.h> +#include <__type_traits/enable_if.h> #include <__type_traits/remove_cvref.h> +#include <__utility/move.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + _LIBCPP_BEGIN_NAMESPACE_STD -template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 typename iterator_traits<_InputIter>::difference_type -__distance(_InputIter __first, _InputIter __last, input_iterator_tag) { - typename iterator_traits<_InputIter>::difference_type __r(0); +#if _LIBCPP_STD_VER >= 20 +template +using __iter_distance_t _LIBCPP_NODEBUG = std::iter_difference_t<_Iter>; +#else +template +using __iter_distance_t _LIBCPP_NODEBUG = typename iterator_traits<_Iter>::difference_type; +#endif + +template +inline _LIBCPP_HIDE_FROM_ABI +_LIBCPP_CONSTEXPR_SINCE_CXX17 __iter_distance_t<_InputIter> __distance(_InputIter __first, _Sent __last) { + __iter_distance_t<_InputIter> __r(0); for (; __first != __last; ++__first) ++__r; return __r; } -template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 typename iterator_traits<_RandIter>::difference_type -__distance(_RandIter __first, _RandIter __last, random_access_iterator_tag) { +template ::value, int> = 0> +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 __iter_distance_t<_RandIter> +__distance(_RandIter __first, _RandIter __last) { return __last - __first; } +#if _LIBCPP_STD_VER >= 20 +template ::value && + __is_segmented_iterator_v<_SegmentedIter>, + int> = 0> +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 __iter_distance_t<_SegmentedIter> +__distance(_SegmentedIter __first, _SegmentedIter __last) { + __iter_distance_t<_SegmentedIter> __r(0); + std::__for_each_segment(__first, __last, [&__r](auto __lfirst, auto __llast) { + __r += std::__distance(__lfirst, __llast); + }); + return __r; +} +#endif // _LIBCPP_STD_VER >= 20 + template inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 typename iterator_traits<_InputIter>::difference_type distance(_InputIter __first, _InputIter __last) { - return std::__distance(__first, __last, typename iterator_traits<_InputIter>::iterator_category()); + return std::__distance(__first, __last); } #if _LIBCPP_STD_VER >= 20 @@ -56,12 +86,7 @@ struct __distance { template _Sp> requires(!sized_sentinel_for<_Sp, _Ip>) _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Ip> operator()(_Ip __first, _Sp __last) const { - iter_difference_t<_Ip> __n = 0; - while (__first != __last) { - ++__first; - ++__n; - } - return __n; + return std::__distance(std::move(__first), std::move(__last)); } template > _Sp> @@ -92,4 +117,6 @@ inline constexpr auto distance = __distance{}; _LIBCPP_END_NAMESPACE_STD +_LIBCPP_POP_MACROS + #endif // _LIBCPP___ITERATOR_DISTANCE_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/front_insert_iterator.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/front_insert_iterator.h index d79c4d78b6..2ab5383a1d 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/front_insert_iterator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/front_insert_iterator.h @@ -26,15 +26,9 @@ _LIBCPP_PUSH_MACROS _LIBCPP_BEGIN_NAMESPACE_STD -_LIBCPP_SUPPRESS_DEPRECATED_PUSH template class front_insert_iterator -#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) - : public iterator -#endif -{ - _LIBCPP_SUPPRESS_DEPRECATED_POP - + : public __iterator_base, output_iterator_tag, void, void, void, void> { protected: _Container* container; diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/insert_iterator.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/insert_iterator.h index 95768cb8e0..6a5818b478 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/insert_iterator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/insert_iterator.h @@ -35,15 +35,9 @@ template using __insert_iterator_iter_t _LIBCPP_NODEBUG = typename _Container::iterator; #endif -_LIBCPP_SUPPRESS_DEPRECATED_PUSH template class insert_iterator -#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) - : public iterator -#endif -{ - _LIBCPP_SUPPRESS_DEPRECATED_POP - + : public __iterator_base, output_iterator_tag, void, void, void, void> { protected: _Container* container; __insert_iterator_iter_t<_Container> iter; diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/istream_iterator.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/istream_iterator.h index cdb8056cfe..f4b13f09c7 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/istream_iterator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/istream_iterator.h @@ -25,15 +25,14 @@ _LIBCPP_BEGIN_NAMESPACE_STD -_LIBCPP_SUPPRESS_DEPRECATED_PUSH template , class _Distance = ptrdiff_t> class istream_iterator -#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) - : public iterator -#endif -{ - _LIBCPP_SUPPRESS_DEPRECATED_POP - + : public __iterator_base, + input_iterator_tag, + _Tp, + _Distance, + const _Tp*, + const _Tp&> { public: typedef input_iterator_tag iterator_category; typedef _Tp value_type; diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/istreambuf_iterator.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/istreambuf_iterator.h index b7b28cd1a0..4fc87a84f0 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/istreambuf_iterator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/istreambuf_iterator.h @@ -25,15 +25,14 @@ _LIBCPP_BEGIN_NAMESPACE_STD -_LIBCPP_SUPPRESS_DEPRECATED_PUSH template class istreambuf_iterator -#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) - : public iterator -#endif -{ - _LIBCPP_SUPPRESS_DEPRECATED_POP - + : public __iterator_base, + input_iterator_tag, + _CharT, + typename _Traits::off_type, + _CharT*, + _CharT> { public: typedef input_iterator_tag iterator_category; typedef _CharT value_type; diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/iterator.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/iterator.h index d7fcd8c4dd..c599f61797 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/iterator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/iterator.h @@ -28,6 +28,19 @@ struct _LIBCPP_DEPRECATED_IN_CXX17 iterator { typedef _Category iterator_category; }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH +#ifdef _LIBCPP_ABI_NO_ITERATOR_BASES +template +struct __no_iterator_base {}; + +template +using __iterator_base _LIBCPP_NODEBUG = __no_iterator_base<_Derived>; +#else +template +using __iterator_base _LIBCPP_NODEBUG = iterator<_Category, _Tp, _Distance, _Pointer, _Reference>; +#endif +_LIBCPP_SUPPRESS_DEPRECATED_POP + _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___ITERATOR_ITERATOR_H diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/iterator_traits.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/iterator_traits.h index f727e8ff36..ebf315a53b 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/iterator_traits.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/iterator_traits.h @@ -420,44 +420,43 @@ using __has_exactly_bidirectional_iterator_category _LIBCPP_NODEBUG = !__has_iterator_category_convertible_to<_Tp, random_access_iterator_tag>::value>; template -using __iter_value_type _LIBCPP_NODEBUG = typename iterator_traits<_InputIterator>::value_type; +using __iterator_value_type _LIBCPP_NODEBUG = typename iterator_traits<_InputIterator>::value_type; #if _LIBCPP_STD_VER >= 23 template -using __iter_key_type _LIBCPP_NODEBUG = remove_const_t>>; +using __iter_key_type _LIBCPP_NODEBUG = remove_const_t>>; template -using __iter_mapped_type _LIBCPP_NODEBUG = tuple_element_t<1, __iter_value_type<_InputIterator>>; +using __iter_mapped_type _LIBCPP_NODEBUG = tuple_element_t<1, __iterator_value_type<_InputIterator>>; template using __iter_to_alloc_type _LIBCPP_NODEBUG = - pair>, - tuple_element_t<1, __iter_value_type<_InputIterator>>>; + pair>, + tuple_element_t<1, __iterator_value_type<_InputIterator>>>; #else template -using __iter_key_type _LIBCPP_NODEBUG = - __remove_const_t::value_type::first_type>; +using __iter_key_type _LIBCPP_NODEBUG = __remove_const_t::first_type>; template -using __iter_mapped_type _LIBCPP_NODEBUG = typename iterator_traits<_InputIterator>::value_type::second_type; +using __iter_mapped_type _LIBCPP_NODEBUG = typename __iterator_value_type<_InputIterator>::second_type; template using __iter_to_alloc_type _LIBCPP_NODEBUG = - pair::value_type::first_type, - typename iterator_traits<_InputIterator>::value_type::second_type>; + pair::first_type, + typename __iterator_value_type<_InputIterator>::second_type>; #endif // _LIBCPP_STD_VER >= 23 template -using __iterator_category_type _LIBCPP_NODEBUG = typename iterator_traits<_Iter>::iterator_category; +using __iterator_iterator_category _LIBCPP_NODEBUG = typename iterator_traits<_Iter>::iterator_category; template -using __iterator_pointer_type _LIBCPP_NODEBUG = typename iterator_traits<_Iter>::pointer; +using __iterator_pointer _LIBCPP_NODEBUG = typename iterator_traits<_Iter>::pointer; template -using __iter_diff_t _LIBCPP_NODEBUG = typename iterator_traits<_Iter>::difference_type; +using __iterator_difference_type _LIBCPP_NODEBUG = typename iterator_traits<_Iter>::difference_type; template -using __iter_reference _LIBCPP_NODEBUG = typename iterator_traits<_Iter>::reference; +using __iterator_reference _LIBCPP_NODEBUG = typename iterator_traits<_Iter>::reference; #if _LIBCPP_STD_VER >= 20 diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/ostream_iterator.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/ostream_iterator.h index 2b459f4628..64e79f010f 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/ostream_iterator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/ostream_iterator.h @@ -24,15 +24,9 @@ _LIBCPP_BEGIN_NAMESPACE_STD -_LIBCPP_SUPPRESS_DEPRECATED_PUSH template > class ostream_iterator -#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) - : public iterator -#endif -{ - _LIBCPP_SUPPRESS_DEPRECATED_POP - + : public __iterator_base, output_iterator_tag, void, void, void, void> { public: typedef output_iterator_tag iterator_category; typedef void value_type; diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/ostreambuf_iterator.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/ostreambuf_iterator.h index 7133331a7b..4a3b2fa024 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/ostreambuf_iterator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/ostreambuf_iterator.h @@ -25,15 +25,9 @@ _LIBCPP_BEGIN_NAMESPACE_STD -_LIBCPP_SUPPRESS_DEPRECATED_PUSH template class ostreambuf_iterator -#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) - : public iterator -#endif -{ - _LIBCPP_SUPPRESS_DEPRECATED_POP - + : public __iterator_base, output_iterator_tag, void, void, void, void> { public: typedef output_iterator_tag iterator_category; typedef void value_type; diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/reverse_iterator.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/reverse_iterator.h index 8935e5a8ff..834695dd16 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/reverse_iterator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/reverse_iterator.h @@ -46,21 +46,16 @@ _LIBCPP_BEGIN_NAMESPACE_STD -_LIBCPP_SUPPRESS_DEPRECATED_PUSH template class reverse_iterator -#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) - : public iterator::iterator_category, - typename iterator_traits<_Iter>::value_type, - typename iterator_traits<_Iter>::difference_type, - typename iterator_traits<_Iter>::pointer, - typename iterator_traits<_Iter>::reference> -#endif -{ - _LIBCPP_SUPPRESS_DEPRECATED_POP - + : public __iterator_base, + typename iterator_traits<_Iter>::iterator_category, + typename iterator_traits<_Iter>::value_type, + typename iterator_traits<_Iter>::difference_type, + typename iterator_traits<_Iter>::pointer, + typename iterator_traits<_Iter>::reference> { private: -#ifndef _LIBCPP_ABI_NO_ITERATOR_BASES +#ifndef _LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER _Iter __t_; // no longer used as of LWG #2360, not removed due to ABI break #endif @@ -91,7 +86,7 @@ public: using reference = typename iterator_traits<_Iter>::reference; #endif -#ifndef _LIBCPP_ABI_NO_ITERATOR_BASES +#ifndef _LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator() : __t_(), current() {} _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 explicit reverse_iterator(_Iter __x) : __t_(__x), current(__x) {} diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/static_bounded_iter.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/static_bounded_iter.h index 8f4fbdf6df..d8fc7d185e 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/static_bounded_iter.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/static_bounded_iter.h @@ -99,9 +99,9 @@ struct __static_bounded_iter { template , - _Or >, - is_same > > > >::value, + _And, + _Or >, + is_same > > > >::value, int> = 0> _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __static_bounded_iter(__static_bounded_iter<_OtherIterator, _Size> const& __other) _NOEXCEPT diff --git a/naiveproxy/src/third_party/libc++/src/include/__iterator/wrap_iter.h b/naiveproxy/src/third_party/libc++/src/include/__iterator/wrap_iter.h index 2b5bc489dd..d18d9682da 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__iterator/wrap_iter.h +++ b/naiveproxy/src/third_party/libc++/src/include/__iterator/wrap_iter.h @@ -49,12 +49,12 @@ private: public: _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter() _NOEXCEPT : __i_() {} - template < - class _OtherIter, - __enable_if_t< _And< is_convertible, - _Or >, - is_same > > > >::value, - int> = 0> + template , + _Or >, + is_same > > > >::value, + int> = 0> _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter(const __wrap_iter<_OtherIter>& __u) _NOEXCEPT : __i_(__u.__i_) {} _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 reference operator*() const _NOEXCEPT { return *__i_; } @@ -117,6 +117,8 @@ private: friend class span; template friend struct array; + template + friend class optional; }; template diff --git a/naiveproxy/src/third_party/libc++/src/include/__locale b/naiveproxy/src/third_party/libc++/src/include/__locale index 757a53951f..eb7b778620 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__locale +++ b/naiveproxy/src/third_party/libc++/src/include/__locale @@ -585,7 +585,7 @@ public: # ifdef _CACHED_RUNES static const size_t table_size = _CACHED_RUNES; # else - static const size_t table_size = 256; // FIXME: Don't hardcode this. + static const size_t table_size = 256; # endif _LIBCPP_HIDE_FROM_ABI const mask* table() const _NOEXCEPT { return __tab_; } static const mask* classic_table() _NOEXCEPT; diff --git a/naiveproxy/src/third_party/libc++/src/include/__locale_dir/time.h b/naiveproxy/src/third_party/libc++/src/include/__locale_dir/time.h index 5f60d5f36b..78698e9651 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__locale_dir/time.h +++ b/naiveproxy/src/third_party/libc++/src/include/__locale_dir/time.h @@ -601,17 +601,13 @@ private: template <> \ _LIBCPP_EXPORTED_FROM_ABI __time_get_storage<_CharT>::__time_get_storage(const string&); \ template <> \ - _LIBCPP_EXPORTED_FROM_ABI void __time_get_storage<_CharT>::init(const ctype<_CharT>&); \ + void __time_get_storage<_CharT>::init(const ctype<_CharT>&); \ template <> \ - _LIBCPP_EXPORTED_FROM_ABI __time_get_storage<_CharT>::string_type __time_get_storage<_CharT>::__analyze( \ - char, const ctype<_CharT>&); \ + __time_get_storage<_CharT>::string_type __time_get_storage<_CharT>::__analyze(char, const ctype<_CharT>&); \ extern template _LIBCPP_EXPORTED_FROM_ABI time_base::dateorder __time_get_storage<_CharT>::__do_date_order() \ const; \ extern template _LIBCPP_EXPORTED_FROM_ABI __time_get_storage<_CharT>::__time_get_storage(const char*); \ - extern template _LIBCPP_EXPORTED_FROM_ABI __time_get_storage<_CharT>::__time_get_storage(const string&); \ - extern template _LIBCPP_EXPORTED_FROM_ABI void __time_get_storage<_CharT>::init(const ctype<_CharT>&); \ - extern template _LIBCPP_EXPORTED_FROM_ABI __time_get_storage<_CharT>::string_type \ - __time_get_storage<_CharT>::__analyze(char, const ctype<_CharT>&); + extern template _LIBCPP_EXPORTED_FROM_ABI __time_get_storage<_CharT>::__time_get_storage(const string&); _LIBCPP_TIME_GET_STORAGE_EXPLICIT_INSTANTIATION(char) # if _LIBCPP_HAS_WIDE_CHARACTERS diff --git a/naiveproxy/src/third_party/libc++/src/include/__math/hypot.h b/naiveproxy/src/third_party/libc++/src/include/__math/hypot.h index 8e8c35b4a4..2b12d7be21 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__math/hypot.h +++ b/naiveproxy/src/third_party/libc++/src/include/__math/hypot.h @@ -53,7 +53,7 @@ inline _LIBCPP_HIDE_FROM_ABI __promote_t<_A1, _A2> hypot(_A1 __x, _A2 __y) _NOEX // Computes the three-dimensional hypotenuse: `std::hypot(x,y,z)`. // The naive implementation might over-/underflow which is why this implementation is more involved: // If the square of an argument might run into issues, we scale the arguments appropriately. -// See https://github.com/llvm/llvm-project/issues/92782 for a detailed discussion and summary. +// See https://llvm.org/PR92782 for a detailed discussion and summary. template _LIBCPP_HIDE_FROM_ABI _Real __hypot(_Real __x, _Real __y, _Real __z) { // Factors needed to determine if over-/underflow might happen diff --git a/naiveproxy/src/third_party/libc++/src/include/__math/traits.h b/naiveproxy/src/third_party/libc++/src/include/__math/traits.h index 4a6e58c6da..00db2a8289 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__math/traits.h +++ b/naiveproxy/src/third_party/libc++/src/include/__math/traits.h @@ -189,6 +189,82 @@ template ::value && is_ar return __builtin_isunordered((type)__x, (type)__y); } +// MS UCRT incorrectly defines some functions in a way not working with integer types. Until C++20, this was worked +// around by -fdelayed-template-parsing. Since C++20, we can use standard feature "requires" instead. + +// TODO: Remove the workaround once UCRT fixes these functions. Note that this doesn't seem planned as of 2025-07 per +// https://developercommunity.visualstudio.com/t/10294165. + +#if defined(_LIBCPP_MSVCRT) && _LIBCPP_STD_VER >= 20 +namespace __ucrt { +template + requires is_integral_v<_A1> +[[nodiscard]] inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(_A1) noexcept { + return true; +} + +template + requires is_integral_v<_A1> +[[nodiscard]] inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(_A1) noexcept { + return false; +} + +template + requires is_integral_v<_A1> +[[nodiscard]] inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(_A1) noexcept { + return false; +} + +template + requires is_integral_v<_A1> +[[nodiscard]] inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnormal(_A1 __x) noexcept { + return __x != 0; +} + +template + requires is_arithmetic_v<_A1> && is_arithmetic_v<_A2> +[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI bool isgreater(_A1 __x, _A2 __y) noexcept { + using type = __promote_t<_A1, _A2>; + return __builtin_isgreater((type)__x, (type)__y); +} + +template + requires is_arithmetic_v<_A1> && is_arithmetic_v<_A2> +[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI bool isgreaterequal(_A1 __x, _A2 __y) noexcept { + using type = __promote_t<_A1, _A2>; + return __builtin_isgreaterequal((type)__x, (type)__y); +} + +template + requires is_arithmetic_v<_A1> && is_arithmetic_v<_A2> +[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI bool isless(_A1 __x, _A2 __y) noexcept { + using type = __promote_t<_A1, _A2>; + return __builtin_isless((type)__x, (type)__y); +} + +template + requires is_arithmetic_v<_A1> && is_arithmetic_v<_A2> +[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI bool islessequal(_A1 __x, _A2 __y) noexcept { + using type = __promote_t<_A1, _A2>; + return __builtin_islessequal((type)__x, (type)__y); +} + +template + requires is_arithmetic_v<_A1> && is_arithmetic_v<_A2> +[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI bool islessgreater(_A1 __x, _A2 __y) noexcept { + using type = __promote_t<_A1, _A2>; + return __builtin_islessgreater((type)__x, (type)__y); +} + +template + requires is_arithmetic_v<_A1> && is_arithmetic_v<_A2> +[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI bool isunordered(_A1 __x, _A2 __y) noexcept { + using type = __promote_t<_A1, _A2>; + return __builtin_isunordered((type)__x, (type)__y); +} +} // namespace __ucrt +#endif + } // namespace __math _LIBCPP_END_NAMESPACE_STD diff --git a/naiveproxy/src/third_party/libc++/src/include/__memory/allocate_at_least.h b/naiveproxy/src/third_party/libc++/src/include/__memory/allocate_at_least.h index 9b5a8bcbd4..72140d0de2 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__memory/allocate_at_least.h +++ b/naiveproxy/src/third_party/libc++/src/include/__memory/allocate_at_least.h @@ -19,26 +19,31 @@ _LIBCPP_BEGIN_NAMESPACE_STD +template +struct __allocation_result { + _Pointer ptr; + _SizeT count; + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __allocation_result(_Pointer __ptr, _SizeT __count) + : ptr(__ptr), count(__count) {} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(__allocation_result); + #if _LIBCPP_STD_VER >= 23 template [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto __allocate_at_least(_Alloc& __alloc, size_t __n) { - return std::allocator_traits<_Alloc>::allocate_at_least(__alloc, __n); + auto __res = std::allocator_traits<_Alloc>::allocate_at_least(__alloc, __n); + return __allocation_result{__res.ptr, __res.count}; } #else -template -struct __allocation_result { - _Pointer ptr; - size_t count; -}; - -template +template > [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI -_LIBCPP_CONSTEXPR __allocation_result::pointer> +_LIBCPP_CONSTEXPR __allocation_result __allocate_at_least(_Alloc& __alloc, size_t __n) { - return {__alloc.allocate(__n), __n}; + return __allocation_result(__alloc.allocate(__n), __n); } #endif // _LIBCPP_STD_VER >= 23 diff --git a/naiveproxy/src/third_party/libc++/src/include/__memory/array_cookie.h b/naiveproxy/src/third_party/libc++/src/include/__memory/array_cookie.h index 806a9e99ec..be59f365aa 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__memory/array_cookie.h +++ b/naiveproxy/src/third_party/libc++/src/include/__memory/array_cookie.h @@ -13,6 +13,7 @@ #include <__config> #include <__configuration/abi.h> #include <__cstddef/size_t.h> +#include <__memory/addressof.h> #include <__type_traits/integral_constant.h> #include <__type_traits/is_trivially_destructible.h> #include <__type_traits/negation.h> @@ -26,14 +27,15 @@ _LIBCPP_BEGIN_NAMESPACE_STD // Trait representing whether a type requires an array cookie at the start of its allocation when // allocated as `new T[n]` and deallocated as `delete[] array`. // -// Under the Itanium C++ ABI [1], we know that an array cookie is available unless `T` is trivially -// destructible and the call to `operator delete[]` is not a sized operator delete. Under ABIs other -// than the Itanium ABI, we assume there are no array cookies. +// Under the Itanium C++ ABI [1] and the ARM ABI which derives from it, we know that an array cookie is available +// unless `T` is trivially destructible and the call to `operator delete[]` is not a sized operator delete. Under +// other ABIs, we assume there are no array cookies. // // [1]: https://itanium-cxx-abi.github.io/cxx-abi/abi.html#array-cookies -#ifdef _LIBCPP_ABI_ITANIUM +#if defined(_LIBCPP_ABI_ITANIUM) || defined(_LIBCPP_ABI_ITANIUM_WITH_ARM_DIFFERENCES) // TODO: Use a builtin instead -// TODO: We should factor in the choice of the usual deallocation function in this determination. +// TODO: We should factor in the choice of the usual deallocation function in this determination: +// a cookie may be available in more cases but we ignore those for now. template struct __has_array_cookie : _Not > {}; #else @@ -41,13 +43,79 @@ template struct __has_array_cookie : false_type {}; #endif +struct __itanium_array_cookie { + size_t __element_count; +}; + +template +struct [[__gnu__::__aligned__(_LIBCPP_ALIGNOF(_Tp))]] __arm_array_cookie { + size_t __element_size; + size_t __element_count; +}; + +// Return the element count in the array cookie located before the given pointer. +// +// In the Itanium ABI [1] +// ---------------------- +// The element count is stored immediately before the first element of the array. If the preferred alignment +// of array elements (which is different from the ABI alignment) is more than that of size_t, additional +// padding bytes exist before the array cookie. Assuming array elements of size and alignment 16 bytes, that +// gives us the following layout: +// +// |ooooooooxxxxxxxxaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbccccccccccccccccdddddddddddddddd| +// ^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// | ^^^^^^^^ | +// | | array elements +// padding | +// element count +// +// +// In the Itanium ABI with ARM differences [2] +// ------------------------------------------- +// The array cookie is stored at the very start of the allocation and it has the following form: +// +// struct array_cookie { +// std::size_t element_size; // element_size != 0 +// std::size_t element_count; +// }; +// +// Assuming elements of size and alignment 32 bytes, this gives us the following layout: +// +// |xxxxxxxxXXXXXXXXooooooooooooooooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb| +// ^^^^^^^^ ^^^^^^^^^^^^^^^^ +// | ^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// element size | padding | +// element count array elements +// +// We must be careful to take into account the alignment of the array cookie, which may result in padding +// bytes between the element count and the first element of the array. Note that for ARM, the compiler +// aligns the array cookie using the ABI alignment, not the preferred alignment of array elements. +// +// [1]: https://itanium-cxx-abi.github.io/cxx-abi/abi.html#array-cookies +// [2]: https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platforms#Handle-C++-differences template // Avoid failures when -fsanitize-address-poison-custom-array-cookie is enabled -_LIBCPP_HIDE_FROM_ABI _LIBCPP_NO_SANITIZE("address") size_t __get_array_cookie(_Tp const* __ptr) { +_LIBCPP_HIDE_FROM_ABI _LIBCPP_NO_SANITIZE("address") size_t __get_array_cookie([[__maybe_unused__]] _Tp const* __ptr) { static_assert( __has_array_cookie<_Tp>::value, "Trying to access the array cookie of a type that is not guaranteed to have one"); - size_t const* __cookie = reinterpret_cast(__ptr) - 1; // TODO: Use a builtin instead - return *__cookie; + +#if defined(_LIBCPP_ABI_ITANIUM) + using _ArrayCookie = __itanium_array_cookie; +#elif defined(_LIBCPP_ABI_ITANIUM_WITH_ARM_DIFFERENCES) + using _ArrayCookie = __arm_array_cookie<_Tp>; +#else + static_assert(false, "The array cookie layout is unknown on this ABI"); + struct _ArrayCookie { // dummy definition required to make the function parse + size_t element_count; + }; +#endif + + char const* __array_cookie_start = reinterpret_cast(__ptr) - sizeof(_ArrayCookie); + _ArrayCookie __cookie; + // This is necessary to avoid violating strict aliasing. It's valid because _ArrayCookie is an + // implicit lifetime type. + __builtin_memcpy(std::addressof(__cookie), __array_cookie_start, sizeof(_ArrayCookie)); + return __cookie.__element_count; } _LIBCPP_END_NAMESPACE_STD diff --git a/naiveproxy/src/third_party/libc++/src/include/__memory/compressed_pair.h b/naiveproxy/src/third_party/libc++/src/include/__memory/compressed_pair.h index fb7b7b7afc..0388d752cc 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__memory/compressed_pair.h +++ b/naiveproxy/src/third_party/libc++/src/include/__memory/compressed_pair.h @@ -28,8 +28,8 @@ _LIBCPP_BEGIN_NAMESPACE_STD // understand how it works). // // ================================================================================================================== // -// The first member is aligned to the alignment of the second member to force padding in front of the compressed pair -// in case there are members before it. +// On GCC, the first member is aligned to the alignment of the second member to force padding in front of the compressed +// pair in case there are members before it. // // For example: // (assuming x86-64 linux) @@ -52,7 +52,10 @@ _LIBCPP_BEGIN_NAMESPACE_STD // // Furthermore, that alignment must be the same as what was used in the old __compressed_pair layout, so we must // handle reference types specially since alignof(T&) == alignof(T). -// See https://github.com/llvm/llvm-project/issues/118559. +// See https://llvm.org/PR118559. +// +// On Clang, this is unnecessary, since we use anonymous structs instead, which automatically handle the alignment +// correctly. #ifndef _LIBCPP_ABI_NO_COMPRESSED_PAIR_PADDING @@ -80,23 +83,50 @@ class __compressed_pair_padding { template class __compressed_pair_padding<_ToPad, true> {}; -# define _LIBCPP_COMPRESSED_PAIR(T1, Initializer1, T2, Initializer2) \ - _LIBCPP_NO_UNIQUE_ADDRESS __attribute__((__aligned__(::std::__compressed_pair_alignment))) T1 Initializer1; \ - _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding1_, __LINE__, _); \ - _LIBCPP_NO_UNIQUE_ADDRESS T2 Initializer2; \ - _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding2_, __LINE__, _) +# define _LIBCPP_COMPRESSED_ELEMENT(T1, Initializer1) \ + _LIBCPP_NO_UNIQUE_ADDRESS T1 Initializer1; \ + _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding_, __LINE__, _) -# define _LIBCPP_COMPRESSED_TRIPLE(T1, Initializer1, T2, Initializer2, T3, Initializer3) \ - _LIBCPP_NO_UNIQUE_ADDRESS \ - __attribute__((__aligned__(::std::__compressed_pair_alignment), \ - __aligned__(::std::__compressed_pair_alignment))) T1 Initializer1; \ - _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding1_, __LINE__, _); \ - _LIBCPP_NO_UNIQUE_ADDRESS T2 Initializer2; \ - _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding2_, __LINE__, _); \ - _LIBCPP_NO_UNIQUE_ADDRESS T3 Initializer3; \ - _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding3_, __LINE__, _) +// TODO: Fix the ABI for GCC as well once https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121637 is fixed +# ifdef _LIBCPP_COMPILER_GCC +# define _LIBCPP_COMPRESSED_PAIR(T1, Initializer1, T2, Initializer2) \ + _LIBCPP_NO_UNIQUE_ADDRESS __attribute__((__aligned__(::std::__compressed_pair_alignment))) T1 Initializer1; \ + _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding1_, __LINE__, _); \ + _LIBCPP_NO_UNIQUE_ADDRESS T2 Initializer2; \ + _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding2_, __LINE__, _) + +# define _LIBCPP_COMPRESSED_TRIPLE(T1, Initializer1, T2, Initializer2, T3, Initializer3) \ + _LIBCPP_NO_UNIQUE_ADDRESS \ + __attribute__((__aligned__(::std::__compressed_pair_alignment), \ + __aligned__(::std::__compressed_pair_alignment))) T1 Initializer1; \ + _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding1_, __LINE__, _); \ + _LIBCPP_NO_UNIQUE_ADDRESS T2 Initializer2; \ + _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding2_, __LINE__, _); \ + _LIBCPP_NO_UNIQUE_ADDRESS T3 Initializer3; \ + _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding3_, __LINE__, _) +# else +# define _LIBCPP_COMPRESSED_PAIR(T1, Initializer1, T2, Initializer2) \ + struct { \ + _LIBCPP_NO_UNIQUE_ADDRESS T1 Initializer1; \ + _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding1_, __LINE__, _); \ + _LIBCPP_NO_UNIQUE_ADDRESS T2 Initializer2; \ + _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding2_, __LINE__, _); \ + } + +# define _LIBCPP_COMPRESSED_TRIPLE(T1, Initializer1, T2, Initializer2, T3, Initializer3) \ + struct { \ + _LIBCPP_NO_UNIQUE_ADDRESS T1 Initializer1; \ + _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding1_, __LINE__, _); \ + _LIBCPP_NO_UNIQUE_ADDRESS T2 Initializer2; \ + _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding2_, __LINE__, _); \ + _LIBCPP_NO_UNIQUE_ADDRESS T3 Initializer3; \ + _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding _LIBCPP_CONCAT3(__padding3_, __LINE__, _); \ + } +# endif #else +# define _LIBCPP_COMPRESSED_ELEMENT(T1, Initializer1) _LIBCPP_NO_UNIQUE_ADDRESS T1 Initializer1 + # define _LIBCPP_COMPRESSED_PAIR(T1, Name1, T2, Name2) \ _LIBCPP_NO_UNIQUE_ADDRESS T1 Name1; \ _LIBCPP_NO_UNIQUE_ADDRESS T2 Name2 diff --git a/naiveproxy/src/third_party/libc++/src/include/__memory/pointer_traits.h b/naiveproxy/src/third_party/libc++/src/include/__memory/pointer_traits.h index 8c7f8dff1b..62fcd93263 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__memory/pointer_traits.h +++ b/naiveproxy/src/third_party/libc++/src/include/__memory/pointer_traits.h @@ -255,7 +255,7 @@ concept __resettable_smart_pointer_with_args = requires(_Smart __s, _Pointer __p // This function ensures safe conversions between fancy pointers at compile-time, where we avoid casts from/to // `__void_pointer` by obtaining the underlying raw pointer from the fancy pointer using `std::to_address`, // then dereferencing it to retrieve the pointed-to object, and finally constructing the target fancy pointer -// to that object using the `std::pointer_traits<>::pinter_to` function. +// to that object using the `std::pointer_traits<>::pointer_to` function. template _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI _PtrTo __static_fancy_pointer_cast(const _PtrFrom& __p) { using __ptr_traits = pointer_traits<_PtrTo>; diff --git a/naiveproxy/src/third_party/libc++/src/include/__memory/raw_storage_iterator.h b/naiveproxy/src/third_party/libc++/src/include/__memory/raw_storage_iterator.h index 0e8b909070..d98b3faf48 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__memory/raw_storage_iterator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__memory/raw_storage_iterator.h @@ -28,15 +28,9 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_RAW_STORAGE_ITERATOR) -_LIBCPP_SUPPRESS_DEPRECATED_PUSH template class _LIBCPP_DEPRECATED_IN_CXX17 raw_storage_iterator -# if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) - : public iterator -# endif -{ - _LIBCPP_SUPPRESS_DEPRECATED_POP - + : public __iterator_base, output_iterator_tag, void, void, void, void> { private: _OutputIterator __x_; diff --git a/naiveproxy/src/third_party/libc++/src/include/__memory/shared_count.h b/naiveproxy/src/third_party/libc++/src/include/__memory/shared_count.h index dad20bcabd..b40d8c9cf7 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__memory/shared_count.h +++ b/naiveproxy/src/third_party/libc++/src/include/__memory/shared_count.h @@ -22,37 +22,10 @@ _LIBCPP_BEGIN_NAMESPACE_STD // NOTE: Relaxed and acq/rel atomics (for increment and decrement respectively) // should be sufficient for thread safety. // See https://llvm.org/PR22803 -#if (defined(__clang__) && __has_builtin(__atomic_add_fetch) && defined(__ATOMIC_RELAXED) && \ - defined(__ATOMIC_ACQ_REL)) || \ - defined(_LIBCPP_COMPILER_GCC) -# define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT 1 -#else -# define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT 0 -#endif - -template -inline _LIBCPP_HIDE_FROM_ABI _ValueType __libcpp_relaxed_load(_ValueType const* __value) { -#if _LIBCPP_HAS_THREADS && defined(__ATOMIC_RELAXED) && \ - (__has_builtin(__atomic_load_n) || defined(_LIBCPP_COMPILER_GCC)) - return __atomic_load_n(__value, __ATOMIC_RELAXED); -#else - return *__value; -#endif -} - -template -inline _LIBCPP_HIDE_FROM_ABI _ValueType __libcpp_acquire_load(_ValueType const* __value) { -#if _LIBCPP_HAS_THREADS && defined(__ATOMIC_ACQUIRE) && \ - (__has_builtin(__atomic_load_n) || defined(_LIBCPP_COMPILER_GCC)) - return __atomic_load_n(__value, __ATOMIC_ACQUIRE); -#else - return *__value; -#endif -} template inline _LIBCPP_HIDE_FROM_ABI _Tp __libcpp_atomic_refcount_increment(_Tp& __t) _NOEXCEPT { -#if _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT && _LIBCPP_HAS_THREADS +#if _LIBCPP_HAS_THREADS return __atomic_add_fetch(std::addressof(__t), 1, __ATOMIC_RELAXED); #else return __t += 1; @@ -61,7 +34,7 @@ inline _LIBCPP_HIDE_FROM_ABI _Tp __libcpp_atomic_refcount_increment(_Tp& __t) _N template inline _LIBCPP_HIDE_FROM_ABI _Tp __libcpp_atomic_refcount_decrement(_Tp& __t) _NOEXCEPT { -#if _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT && _LIBCPP_HAS_THREADS +#if _LIBCPP_HAS_THREADS return __atomic_add_fetch(std::addressof(__t), -1, __ATOMIC_ACQ_REL); #else return __t -= 1; @@ -95,7 +68,13 @@ public: return false; } #endif - _LIBCPP_HIDE_FROM_ABI long use_count() const _NOEXCEPT { return __libcpp_relaxed_load(&__shared_owners_) + 1; } + _LIBCPP_HIDE_FROM_ABI long use_count() const _NOEXCEPT { +#if _LIBCPP_HAS_THREADS + return __atomic_load_n(&__shared_owners_, __ATOMIC_RELAXED) + 1; +#else + return __shared_owners_ + 1; +#endif + } }; class _LIBCPP_EXPORTED_FROM_ABI __shared_weak_count : private __shared_count { diff --git a/naiveproxy/src/third_party/libc++/src/include/__memory/shared_ptr.h b/naiveproxy/src/third_party/libc++/src/include/__memory/shared_ptr.h index 0cbd995105..e90db587d2 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__memory/shared_ptr.h +++ b/naiveproxy/src/third_party/libc++/src/include/__memory/shared_ptr.h @@ -54,6 +54,7 @@ #include <__type_traits/remove_extent.h> #include <__type_traits/remove_reference.h> #include <__utility/declval.h> +#include <__utility/exception_guard.h> #include <__utility/forward.h> #include <__utility/move.h> #include <__utility/swap.h> @@ -352,23 +353,16 @@ public: template ::value, int> = 0> _LIBCPP_HIDE_FROM_ABI shared_ptr(_Yp* __p, _Dp __d) : __ptr_(__p) { -#if _LIBCPP_HAS_EXCEPTIONS - try { -#endif // _LIBCPP_HAS_EXCEPTIONS - typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; - typedef __shared_ptr_pointer<_Yp*, _Dp, _AllocT> _CntrlBlk; + auto __guard = std::__make_exception_guard([&] { __d(__p); }); + typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; + typedef __shared_ptr_pointer<_Yp*, _Dp, _AllocT> _CntrlBlk; #ifndef _LIBCPP_CXX03_LANG - __cntrl_ = new _CntrlBlk(__p, std::move(__d), _AllocT()); + __cntrl_ = new _CntrlBlk(__p, std::move(__d), _AllocT()); #else __cntrl_ = new _CntrlBlk(__p, __d, _AllocT()); #endif // not _LIBCPP_CXX03_LANG - __enable_weak_this(__p, __p); -#if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - __d(__p); - throw; - } -#endif // _LIBCPP_HAS_EXCEPTIONS + __enable_weak_this(__p, __p); + __guard.__complete(); } template ::value, int> = 0> _LIBCPP_HIDE_FROM_ABI shared_ptr(_Yp* __p, _Dp __d, _Alloc __a) : __ptr_(__p) { -#if _LIBCPP_HAS_EXCEPTIONS - try { -#endif // _LIBCPP_HAS_EXCEPTIONS - typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk; - typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; - typedef __allocator_destructor<_A2> _D2; - _A2 __a2(__a); - unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); - ::new ((void*)std::addressof(*__hold2.get())) + auto __guard = std::__make_exception_guard([&] { __d(__p); }); + typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk; + typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; + typedef __allocator_destructor<_A2> _D2; + _A2 __a2(__a); + unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); + ::new ((void*)std::addressof(*__hold2.get())) #ifndef _LIBCPP_CXX03_LANG - _CntrlBlk(__p, std::move(__d), __a); + _CntrlBlk(__p, std::move(__d), __a); #else _CntrlBlk(__p, __d, __a); #endif // not _LIBCPP_CXX03_LANG - __cntrl_ = std::addressof(*__hold2.release()); - __enable_weak_this(__p, __p); -#if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - __d(__p); - throw; - } -#endif // _LIBCPP_HAS_EXCEPTIONS + __cntrl_ = std::addressof(*__hold2.release()); + __enable_weak_this(__p, __p); + __guard.__complete(); } template @@ -406,22 +393,15 @@ public: _Dp __d, __enable_if_t<__shared_ptr_nullptr_deleter_ctor_reqs<_Dp>::value, __nullptr_sfinae_tag> = __nullptr_sfinae_tag()) : __ptr_(nullptr) { -#if _LIBCPP_HAS_EXCEPTIONS - try { -#endif // _LIBCPP_HAS_EXCEPTIONS - typedef typename __shared_ptr_default_allocator<_Tp>::type _AllocT; - typedef __shared_ptr_pointer _CntrlBlk; + auto __guard = std::__make_exception_guard([&] { __d(__p); }); + typedef typename __shared_ptr_default_allocator<_Tp>::type _AllocT; + typedef __shared_ptr_pointer _CntrlBlk; #ifndef _LIBCPP_CXX03_LANG - __cntrl_ = new _CntrlBlk(__p, std::move(__d), _AllocT()); + __cntrl_ = new _CntrlBlk(__p, std::move(__d), _AllocT()); #else __cntrl_ = new _CntrlBlk(__p, __d, _AllocT()); #endif // not _LIBCPP_CXX03_LANG -#if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - __d(__p); - throw; - } -#endif // _LIBCPP_HAS_EXCEPTIONS + __guard.__complete(); } template @@ -431,27 +411,20 @@ public: _Alloc __a, __enable_if_t<__shared_ptr_nullptr_deleter_ctor_reqs<_Dp>::value, __nullptr_sfinae_tag> = __nullptr_sfinae_tag()) : __ptr_(nullptr) { -#if _LIBCPP_HAS_EXCEPTIONS - try { -#endif // _LIBCPP_HAS_EXCEPTIONS - typedef __shared_ptr_pointer _CntrlBlk; - typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; - typedef __allocator_destructor<_A2> _D2; - _A2 __a2(__a); - unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); - ::new ((void*)std::addressof(*__hold2.get())) + auto __guard = std::__make_exception_guard([&] { __d(__p); }); + typedef __shared_ptr_pointer _CntrlBlk; + typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; + typedef __allocator_destructor<_A2> _D2; + _A2 __a2(__a); + unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); + ::new ((void*)std::addressof(*__hold2.get())) #ifndef _LIBCPP_CXX03_LANG - _CntrlBlk(__p, std::move(__d), __a); + _CntrlBlk(__p, std::move(__d), __a); #else _CntrlBlk(__p, __d, __a); #endif // not _LIBCPP_CXX03_LANG - __cntrl_ = std::addressof(*__hold2.release()); -#if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - __d(__p); - throw; - } -#endif // _LIBCPP_HAS_EXCEPTIONS + __cntrl_ = std::addressof(*__hold2.release()); + __guard.__complete(); } template diff --git a/naiveproxy/src/third_party/libc++/src/include/__memory/uninitialized_algorithms.h b/naiveproxy/src/third_party/libc++/src/include/__memory/uninitialized_algorithms.h index e802366400..34d065dc97 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__memory/uninitialized_algorithms.h +++ b/naiveproxy/src/third_party/libc++/src/include/__memory/uninitialized_algorithms.h @@ -61,17 +61,10 @@ template __uninitialized_copy( _InputIterator __ifirst, _Sentinel1 __ilast, _ForwardIterator __ofirst, _EndPredicate __stop_copying) { _ForwardIterator __idx = __ofirst; -#if _LIBCPP_HAS_EXCEPTIONS - try { -#endif - for (; __ifirst != __ilast && !__stop_copying(__idx); ++__ifirst, (void)++__idx) - ::new (static_cast(std::addressof(*__idx))) _ValueType(*__ifirst); -#if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - std::__destroy(__ofirst, __idx); - throw; - } -#endif + auto __guard = std::__make_exception_guard([&] { std::__destroy(__ofirst, __idx); }); + for (; __ifirst != __ilast && !__stop_copying(__idx); ++__ifirst, (void)++__idx) + ::new (static_cast(std::addressof(*__idx))) _ValueType(*__ifirst); + __guard.__complete(); return pair<_InputIterator, _ForwardIterator>(std::move(__ifirst), std::move(__idx)); } @@ -91,17 +84,10 @@ template __uninitialized_copy_n(_InputIterator __ifirst, _Size __n, _ForwardIterator __ofirst, _EndPredicate __stop_copying) { _ForwardIterator __idx = __ofirst; -#if _LIBCPP_HAS_EXCEPTIONS - try { -#endif - for (; __n > 0 && !__stop_copying(__idx); ++__ifirst, (void)++__idx, (void)--__n) - ::new (static_cast(std::addressof(*__idx))) _ValueType(*__ifirst); -#if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - std::__destroy(__ofirst, __idx); - throw; - } -#endif + auto __guard = std::__make_exception_guard([&] { std::__destroy(__ofirst, __idx); }); + for (; __n > 0 && !__stop_copying(__idx); ++__ifirst, (void)++__idx, (void)--__n) + ::new (static_cast(std::addressof(*__idx))) _ValueType(*__ifirst); + __guard.__complete(); return pair<_InputIterator, _ForwardIterator>(std::move(__ifirst), std::move(__idx)); } @@ -121,17 +107,10 @@ template inline _LIBCPP_HIDE_FROM_ABI _ForwardIterator __uninitialized_fill(_ForwardIterator __first, _Sentinel __last, const _Tp& __x) { _ForwardIterator __idx = __first; -#if _LIBCPP_HAS_EXCEPTIONS - try { -#endif - for (; __idx != __last; ++__idx) - ::new (static_cast(std::addressof(*__idx))) _ValueType(__x); -#if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - std::__destroy(__first, __idx); - throw; - } -#endif + auto __guard = std::__make_exception_guard([&] { std::__destroy(__first, __idx); }); + for (; __idx != __last; ++__idx) + ::new (static_cast(std::addressof(*__idx))) _ValueType(__x); + __guard.__complete(); return __idx; } @@ -149,17 +128,10 @@ template inline _LIBCPP_HIDE_FROM_ABI _ForwardIterator __uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x) { _ForwardIterator __idx = __first; -#if _LIBCPP_HAS_EXCEPTIONS - try { -#endif - for (; __n > 0; ++__idx, (void)--__n) - ::new (static_cast(std::addressof(*__idx))) _ValueType(__x); -#if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - std::__destroy(__first, __idx); - throw; - } -#endif + auto __guard = std::__make_exception_guard([&] { std::__destroy(__first, __idx); }); + for (; __n > 0; ++__idx, (void)--__n) + ::new (static_cast(std::addressof(*__idx))) _ValueType(__x); + __guard.__complete(); return __idx; } @@ -178,18 +150,11 @@ uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x) { template inline _LIBCPP_HIDE_FROM_ABI _ForwardIterator __uninitialized_default_construct(_ForwardIterator __first, _Sentinel __last) { - auto __idx = __first; -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif - for (; __idx != __last; ++__idx) - ::new (static_cast(std::addressof(*__idx))) _ValueType; -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - std::__destroy(__first, __idx); - throw; - } -# endif + auto __idx = __first; + auto __guard = std::__make_exception_guard([&] { std::__destroy(__first, __idx); }); + for (; __idx != __last; ++__idx) + ::new (static_cast(std::addressof(*__idx))) _ValueType; + __guard.__complete(); return __idx; } @@ -205,17 +170,10 @@ inline _LIBCPP_HIDE_FROM_ABI void uninitialized_default_construct(_ForwardIterat template inline _LIBCPP_HIDE_FROM_ABI _ForwardIterator __uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) { auto __idx = __first; -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif - for (; __n > 0; ++__idx, (void)--__n) - ::new (static_cast(std::addressof(*__idx))) _ValueType; -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - std::__destroy(__first, __idx); - throw; - } -# endif + auto __guard = std::__make_exception_guard([&] { std::__destroy(__first, __idx); }); + for (; __n > 0; ++__idx, (void)--__n) + ::new (static_cast(std::addressof(*__idx))) _ValueType; + __guard.__complete(); return __idx; } @@ -231,18 +189,11 @@ inline _LIBCPP_HIDE_FROM_ABI _ForwardIterator uninitialized_default_construct_n( template inline _LIBCPP_HIDE_FROM_ABI _ForwardIterator __uninitialized_value_construct(_ForwardIterator __first, _Sentinel __last) { - auto __idx = __first; -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif - for (; __idx != __last; ++__idx) - ::new (static_cast(std::addressof(*__idx))) _ValueType(); -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - std::__destroy(__first, __idx); - throw; - } -# endif + auto __idx = __first; + auto __guard = std::__make_exception_guard([&] { std::__destroy(__first, __idx); }); + for (; __idx != __last; ++__idx) + ::new (static_cast(std::addressof(*__idx))) _ValueType(); + __guard.__complete(); return __idx; } @@ -258,17 +209,10 @@ inline _LIBCPP_HIDE_FROM_ABI void uninitialized_value_construct(_ForwardIterator template inline _LIBCPP_HIDE_FROM_ABI _ForwardIterator __uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) { auto __idx = __first; -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif - for (; __n > 0; ++__idx, (void)--__n) - ::new (static_cast(std::addressof(*__idx))) _ValueType(); -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - std::__destroy(__first, __idx); - throw; - } -# endif + auto __guard = std::__make_exception_guard([&] { std::__destroy(__first, __idx); }); + for (; __n > 0; ++__idx, (void)--__n) + ::new (static_cast(std::addressof(*__idx))) _ValueType(); + __guard.__complete(); return __idx; } @@ -293,19 +237,12 @@ inline _LIBCPP_HIDE_FROM_ABI pair<_InputIterator, _ForwardIterator> __uninitiali _ForwardIterator __ofirst, _EndPredicate __stop_moving, _IterMove __iter_move) { - auto __idx = __ofirst; -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif - for (; __ifirst != __ilast && !__stop_moving(__idx); ++__idx, (void)++__ifirst) { - ::new (static_cast(std::addressof(*__idx))) _ValueType(__iter_move(__ifirst)); - } -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - std::__destroy(__ofirst, __idx); - throw; + auto __idx = __ofirst; + auto __guard = std::__make_exception_guard([&] { std::__destroy(__ofirst, __idx); }); + for (; __ifirst != __ilast && !__stop_moving(__idx); ++__idx, (void)++__ifirst) { + ::new (static_cast(std::addressof(*__idx))) _ValueType(__iter_move(__ifirst)); } -# endif + __guard.__complete(); return {std::move(__ifirst), std::move(__idx)}; } @@ -331,18 +268,11 @@ template inline _LIBCPP_HIDE_FROM_ABI pair<_InputIterator, _ForwardIterator> __uninitialized_move_n( _InputIterator __ifirst, _Size __n, _ForwardIterator __ofirst, _EndPredicate __stop_moving, _IterMove __iter_move) { - auto __idx = __ofirst; -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif - for (; __n > 0 && !__stop_moving(__idx); ++__idx, (void)++__ifirst, --__n) - ::new (static_cast(std::addressof(*__idx))) _ValueType(__iter_move(__ifirst)); -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - std::__destroy(__ofirst, __idx); - throw; - } -# endif + auto __idx = __ofirst; + auto __guard = std::__make_exception_guard([&] { std::__destroy(__ofirst, __idx); }); + for (; __n > 0 && !__stop_moving(__idx); ++__idx, (void)++__ifirst, --__n) + ::new (static_cast(std::addressof(*__idx))) _ValueType(__iter_move(__ifirst)); + __guard.__complete(); return {std::move(__ifirst), std::move(__idx)}; } diff --git a/naiveproxy/src/third_party/libc++/src/include/__memory/uses_allocator_construction.h b/naiveproxy/src/third_party/libc++/src/include/__memory/uses_allocator_construction.h index 49ddf99d9c..6733f5cf6f 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__memory/uses_allocator_construction.h +++ b/naiveproxy/src/third_party/libc++/src/include/__memory/uses_allocator_construction.h @@ -17,6 +17,7 @@ #include <__type_traits/remove_cv.h> #include <__utility/declval.h> #include <__utility/pair.h> +#include <__utility/piecewise_construct.h> #include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) diff --git a/naiveproxy/src/third_party/libc++/src/include/__memory_resource/polymorphic_allocator.h b/naiveproxy/src/third_party/libc++/src/include/__memory_resource/polymorphic_allocator.h index 6e7a9afc25..9a351199b5 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__memory_resource/polymorphic_allocator.h +++ b/naiveproxy/src/third_party/libc++/src/include/__memory_resource/polymorphic_allocator.h @@ -18,6 +18,7 @@ #include <__new/exceptions.h> #include <__new/placement_new_delete.h> #include <__utility/exception_guard.h> +#include <__utility/piecewise_construct.h> #include #include diff --git a/naiveproxy/src/third_party/libc++/src/include/__memory_resource/pool_options.h b/naiveproxy/src/third_party/libc++/src/include/__memory_resource/pool_options.h index 324b8aaa85..fd20ced567 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__memory_resource/pool_options.h +++ b/naiveproxy/src/third_party/libc++/src/include/__memory_resource/pool_options.h @@ -24,7 +24,7 @@ namespace pmr { // [mem.res.pool.options] -struct _LIBCPP_EXPORTED_FROM_ABI pool_options { +struct pool_options { size_t max_blocks_per_chunk = 0; size_t largest_required_pool_block = 0; }; diff --git a/naiveproxy/src/third_party/libc++/src/include/__mutex/once_flag.h b/naiveproxy/src/third_party/libc++/src/include/__mutex/once_flag.h index e384c15a9f..808b1ea99c 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__mutex/once_flag.h +++ b/naiveproxy/src/third_party/libc++/src/include/__mutex/once_flag.h @@ -10,10 +10,9 @@ #define _LIBCPP___MUTEX_ONCE_FLAG_H #include <__config> -#include <__functional/invoke.h> #include <__memory/addressof.h> -#include <__memory/shared_count.h> // __libcpp_acquire_load #include <__tuple/tuple_size.h> +#include <__type_traits/invoke.h> #include <__utility/forward.h> #include <__utility/integer_sequence.h> #include <__utility/move.h> @@ -118,6 +117,15 @@ void _LIBCPP_HIDE_FROM_ABI __call_once_proxy(void* __vp) { _LIBCPP_EXPORTED_FROM_ABI void __call_once(volatile once_flag::_State_type&, void*, void (*)(void*)); +template +inline _LIBCPP_HIDE_FROM_ABI _ValueType __libcpp_acquire_load(_ValueType const* __value) { +#if _LIBCPP_HAS_THREADS + return __atomic_load_n(__value, __ATOMIC_ACQUIRE); +#else + return *__value; +#endif +} + #ifndef _LIBCPP_CXX03_LANG template diff --git a/naiveproxy/src/third_party/libc++/src/include/__mutex/tag_types.h b/naiveproxy/src/third_party/libc++/src/include/__mutex/tag_types.h index 2b2dd58ee4..36b1a3d92b 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__mutex/tag_types.h +++ b/naiveproxy/src/third_party/libc++/src/include/__mutex/tag_types.h @@ -17,15 +17,15 @@ _LIBCPP_BEGIN_NAMESPACE_STD -struct _LIBCPP_EXPORTED_FROM_ABI defer_lock_t { +struct defer_lock_t { explicit defer_lock_t() = default; }; -struct _LIBCPP_EXPORTED_FROM_ABI try_to_lock_t { +struct try_to_lock_t { explicit try_to_lock_t() = default; }; -struct _LIBCPP_EXPORTED_FROM_ABI adopt_lock_t { +struct adopt_lock_t { explicit adopt_lock_t() = default; }; diff --git a/naiveproxy/src/third_party/libc++/src/include/__new/nothrow_t.h b/naiveproxy/src/third_party/libc++/src/include/__new/nothrow_t.h index a286bf7af6..a099772123 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__new/nothrow_t.h +++ b/naiveproxy/src/third_party/libc++/src/include/__new/nothrow_t.h @@ -19,7 +19,7 @@ # include #else _LIBCPP_BEGIN_UNVERSIONED_NAMESPACE_STD -struct _LIBCPP_EXPORTED_FROM_ABI nothrow_t { +struct nothrow_t { explicit nothrow_t() = default; }; extern _LIBCPP_EXPORTED_FROM_ABI const nothrow_t nothrow; diff --git a/naiveproxy/src/third_party/libc++/src/include/__numeric/pstl.h b/naiveproxy/src/third_party/libc++/src/include/__numeric/pstl.h index 22d971ac3b..fe7b2cc7a8 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__numeric/pstl.h +++ b/naiveproxy/src/third_party/libc++/src/include/__numeric/pstl.h @@ -70,7 +70,7 @@ template , enable_if_t, int> = 0> -_LIBCPP_HIDE_FROM_ABI __iter_value_type<_ForwardIterator> +_LIBCPP_HIDE_FROM_ABI __iterator_value_type<_ForwardIterator> reduce(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last) { _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "reduce requires ForwardIterators"); using _Implementation = __pstl::__dispatch<__pstl::__reduce, __pstl::__current_configuration, _RawPolicy>; @@ -78,7 +78,7 @@ reduce(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator _ std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), - __iter_value_type<_ForwardIterator>(), + __iterator_value_type<_ForwardIterator>(), plus{}); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__pstl/backends/default.h b/naiveproxy/src/third_party/libc++/src/include/__pstl/backends/default.h index 3672bbf60a..43b1f1ce38 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__pstl/backends/default.h +++ b/naiveproxy/src/third_party/libc++/src/include/__pstl/backends/default.h @@ -102,7 +102,7 @@ struct __find<__default_backend_tag, _ExecutionPolicy> { operator()(_Policy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) const noexcept { using _FindIf = __dispatch<__find_if, __current_configuration, _ExecutionPolicy>; return _FindIf()( - __policy, std::move(__first), std::move(__last), [&](__iter_reference<_ForwardIterator> __element) { + __policy, std::move(__first), std::move(__last), [&](__iterator_reference<_ForwardIterator> __element) { return __element == __value; }); } @@ -137,7 +137,7 @@ struct __all_of<__default_backend_tag, _ExecutionPolicy> { [[nodiscard]] _LIBCPP_HIDE_FROM_ABI optional operator()(_Policy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Pred&& __pred) const noexcept { using _AnyOf = __dispatch<__any_of, __current_configuration, _ExecutionPolicy>; - auto __res = _AnyOf()(__policy, __first, __last, [&](__iter_reference<_ForwardIterator> __value) { + auto __res = _AnyOf()(__policy, __first, __last, [&](__iterator_reference<_ForwardIterator> __value) { return !__pred(__value); }); if (!__res) @@ -204,7 +204,7 @@ struct __fill<__default_backend_tag, _ExecutionPolicy> { [[nodiscard]] _LIBCPP_HIDE_FROM_ABI optional<__empty> operator()(_Policy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Tp const& __value) const noexcept { using _ForEach = __dispatch<__for_each, __current_configuration, _ExecutionPolicy>; - using _Ref = __iter_reference<_ForwardIterator>; + using _Ref = __iterator_reference<_ForwardIterator>; return _ForEach()(__policy, std::move(__first), std::move(__last), [&](_Ref __element) { __element = __value; }); } }; @@ -233,7 +233,7 @@ struct __replace<__default_backend_tag, _ExecutionPolicy> { operator()(_Policy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Tp const& __old, _Tp const& __new) const noexcept { using _ReplaceIf = __dispatch<__replace_if, __current_configuration, _ExecutionPolicy>; - using _Ref = __iter_reference<_ForwardIterator>; + using _Ref = __iterator_reference<_ForwardIterator>; return _ReplaceIf()( __policy, std::move(__first), std::move(__last), [&](_Ref __element) { return __element == __old; }, __new); } @@ -246,7 +246,7 @@ struct __replace_if<__default_backend_tag, _ExecutionPolicy> { _Policy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Pred&& __pred, _Tp const& __new_value) const noexcept { using _ForEach = __dispatch<__for_each, __current_configuration, _ExecutionPolicy>; - using _Ref = __iter_reference<_ForwardIterator>; + using _Ref = __iterator_reference<_ForwardIterator>; return _ForEach()(__policy, std::move(__first), std::move(__last), [&](_Ref __element) { if (__pred(__element)) __element = __new_value; @@ -260,7 +260,7 @@ struct __generate<__default_backend_tag, _ExecutionPolicy> { [[nodiscard]] _LIBCPP_HIDE_FROM_ABI optional<__empty> operator()(_Policy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Generator&& __gen) const noexcept { using _ForEach = __dispatch<__for_each, __current_configuration, _ExecutionPolicy>; - using _Ref = __iter_reference<_ForwardIterator>; + using _Ref = __iterator_reference<_ForwardIterator>; return _ForEach()(__policy, std::move(__first), std::move(__last), [&](_Ref __element) { __element = __gen(); }); } }; @@ -271,7 +271,7 @@ struct __generate_n<__default_backend_tag, _ExecutionPolicy> { [[nodiscard]] _LIBCPP_HIDE_FROM_ABI optional<__empty> operator()(_Policy&& __policy, _ForwardIterator __first, _Size __n, _Generator&& __gen) const noexcept { using _ForEachN = __dispatch<__for_each_n, __current_configuration, _ExecutionPolicy>; - using _Ref = __iter_reference<_ForwardIterator>; + using _Ref = __iterator_reference<_ForwardIterator>; return _ForEachN()(__policy, std::move(__first), __n, [&](_Ref __element) { __element = __gen(); }); } }; @@ -295,11 +295,11 @@ struct __sort<__default_backend_tag, _ExecutionPolicy> { template struct __count_if<__default_backend_tag, _ExecutionPolicy> { template - [[nodiscard]] _LIBCPP_HIDE_FROM_ABI optional<__iter_diff_t<_ForwardIterator>> operator()( + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI optional<__iterator_difference_type<_ForwardIterator>> operator()( _Policy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate&& __pred) const noexcept { using _TransformReduce = __dispatch<__transform_reduce, __current_configuration, _ExecutionPolicy>; - using _DiffT = __iter_diff_t<_ForwardIterator>; - using _Ref = __iter_reference<_ForwardIterator>; + using _DiffT = __iterator_difference_type<_ForwardIterator>; + using _Ref = __iterator_reference<_ForwardIterator>; return _TransformReduce()( __policy, std::move(__first), std::move(__last), _DiffT{}, std::plus{}, [&](_Ref __element) -> _DiffT { return __pred(__element) ? _DiffT(1) : _DiffT(0); @@ -310,10 +310,10 @@ struct __count_if<__default_backend_tag, _ExecutionPolicy> { template struct __count<__default_backend_tag, _ExecutionPolicy> { template - [[nodiscard]] _LIBCPP_HIDE_FROM_ABI optional<__iter_diff_t<_ForwardIterator>> + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI optional<__iterator_difference_type<_ForwardIterator>> operator()(_Policy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Tp const& __value) const noexcept { using _CountIf = __dispatch<__count_if, __current_configuration, _ExecutionPolicy>; - using _Ref = __iter_reference<_ForwardIterator>; + using _Ref = __iterator_reference<_ForwardIterator>; return _CountIf()(__policy, std::move(__first), std::move(__last), [&](_Ref __element) -> bool { return __element == __value; }); @@ -402,7 +402,7 @@ struct __replace_copy_if<__default_backend_tag, _ExecutionPolicy> { _Pred&& __pred, _Tp const& __new_value) const noexcept { using _Transform = __dispatch<__transform, __current_configuration, _ExecutionPolicy>; - using _Ref = __iter_reference<_ForwardIterator>; + using _Ref = __iterator_reference<_ForwardIterator>; auto __res = _Transform()(__policy, std::move(__first), std::move(__last), std::move(__out_it), [&](_Ref __element) { return __pred(__element) ? __new_value : __element; @@ -424,7 +424,7 @@ struct __replace_copy<__default_backend_tag, _ExecutionPolicy> { _Tp const& __old_value, _Tp const& __new_value) const noexcept { using _ReplaceCopyIf = __dispatch<__replace_copy_if, __current_configuration, _ExecutionPolicy>; - using _Ref = __iter_reference<_ForwardIterator>; + using _Ref = __iterator_reference<_ForwardIterator>; return _ReplaceCopyIf()( __policy, std::move(__first), diff --git a/naiveproxy/src/third_party/libc++/src/include/__pstl/backends/libdispatch.h b/naiveproxy/src/third_party/libc++/src/include/__pstl/backends/libdispatch.h index a640a40352..88d4231d29 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__pstl/backends/libdispatch.h +++ b/naiveproxy/src/third_party/libc++/src/include/__pstl/backends/libdispatch.h @@ -269,7 +269,7 @@ struct __cpu_traits<__libdispatch_backend_tag> { return __empty{}; } - using _Value = __iter_value_type<_RandomAccessIterator>; + using _Value = __iterator_value_type<_RandomAccessIterator>; auto __destroy = [__size](_Value* __ptr) { std::destroy_n(__ptr, __size); @@ -282,7 +282,7 @@ struct __cpu_traits<__libdispatch_backend_tag> { // Initialize all elements to a moved-from state // TODO: Don't do this - this can be done in the first merge - see https://llvm.org/PR63928 std::__construct_at(__values.get(), std::move(*__first)); - for (__iter_diff_t<_RandomAccessIterator> __i = 1; __i != __size; ++__i) { + for (__iterator_difference_type<_RandomAccessIterator> __i = 1; __i != __size; ++__i) { std::__construct_at(__values.get() + __i, std::move(__values.get()[__i - 1])); } *__first = std::move(__values.get()[__size - 1]); diff --git a/naiveproxy/src/third_party/libc++/src/include/__pstl/cpu_algos/find_if.h b/naiveproxy/src/third_party/libc++/src/include/__pstl/cpu_algos/find_if.h index ebb4ecb4a0..aae64b66eb 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__pstl/cpu_algos/find_if.h +++ b/naiveproxy/src/third_party/libc++/src/include/__pstl/cpu_algos/find_if.h @@ -119,7 +119,7 @@ struct __cpu_parallel_find_if { true); } else if constexpr (__is_unsequenced_execution_policy_v<_RawExecutionPolicy> && __has_random_access_iterator_category_or_concept<_ForwardIterator>::value) { - using __diff_t = __iter_diff_t<_ForwardIterator>; + using __diff_t = __iterator_difference_type<_ForwardIterator>; return __pstl::__simd_first<_Backend>( __first, __diff_t(0), __last - __first, [&__pred](_ForwardIterator __iter, __diff_t __i) { return __pred(__iter[__i]); diff --git a/naiveproxy/src/third_party/libc++/src/include/__pstl/cpu_algos/transform.h b/naiveproxy/src/third_party/libc++/src/include/__pstl/cpu_algos/transform.h index 979121be8c..30d117d754 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__pstl/cpu_algos/transform.h +++ b/naiveproxy/src/third_party/libc++/src/include/__pstl/cpu_algos/transform.h @@ -84,9 +84,8 @@ struct __cpu_parallel_transform { __first, __last - __first, __result, - [&](__iter_reference<_ForwardIterator> __in_value, __iter_reference<_ForwardOutIterator> __out_value) { - __out_value = __op(__in_value); - }); + [&](__iterator_reference<_ForwardIterator> __in_value, + __iterator_reference<_ForwardOutIterator> __out_value) { __out_value = __op(__in_value); }); } else { return std::transform(__first, __last, __result, __op); } @@ -138,9 +137,9 @@ struct __cpu_parallel_transform_binary { __last1 - __first1, __first2, __result, - [&](__iter_reference<_ForwardIterator1> __in1, - __iter_reference<_ForwardIterator2> __in2, - __iter_reference<_ForwardOutIterator> __out_value) { __out_value = __op(__in1, __in2); }); + [&](__iterator_reference<_ForwardIterator1> __in1, + __iterator_reference<_ForwardIterator2> __in2, + __iterator_reference<_ForwardOutIterator> __out_value) { __out_value = __op(__in1, __in2); }); } else { return std::transform(__first1, __last1, __first2, __result, __op); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__pstl/cpu_algos/transform_reduce.h b/naiveproxy/src/third_party/libc++/src/include/__pstl/cpu_algos/transform_reduce.h index abd9d42a6f..edfb28b446 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__pstl/cpu_algos/transform_reduce.h +++ b/naiveproxy/src/third_party/libc++/src/include/__pstl/cpu_algos/transform_reduce.h @@ -148,9 +148,10 @@ struct __cpu_parallel_transform_reduce_binary { __has_random_access_iterator_category_or_concept<_ForwardIterator1>::value && __has_random_access_iterator_category_or_concept<_ForwardIterator2>::value) { return __pstl::__simd_transform_reduce<_Backend>( - __last1 - __first1, std::move(__init), std::move(__reduce), [&](__iter_diff_t<_ForwardIterator1> __i) { - return __transform(__first1[__i], __first2[__i]); - }); + __last1 - __first1, + std::move(__init), + std::move(__reduce), + [&](__iterator_difference_type<_ForwardIterator1> __i) { return __transform(__first1[__i], __first2[__i]); }); } else { return std::transform_reduce( std::move(__first1), @@ -200,7 +201,7 @@ struct __cpu_parallel_transform_reduce { __last - __first, std::move(__init), std::move(__reduce), - [=, &__transform](__iter_diff_t<_ForwardIterator> __i) { return __transform(__first[__i]); }); + [=, &__transform](__iterator_difference_type<_ForwardIterator> __i) { return __transform(__first[__i]); }); } else { return std::transform_reduce( std::move(__first), std::move(__last), std::move(__init), std::move(__reduce), std::move(__transform)); diff --git a/naiveproxy/src/third_party/libc++/src/include/__random/binomial_distribution.h b/naiveproxy/src/third_party/libc++/src/include/__random/binomial_distribution.h index b4b4340827..bada8cfdd7 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__random/binomial_distribution.h +++ b/naiveproxy/src/third_party/libc++/src/include/__random/binomial_distribution.h @@ -97,13 +97,25 @@ public: } }; -// The LLVM C library provides this with conflicting `noexcept` attributes. -#if !defined(_LIBCPP_MSVCRT_LIKE) && !defined(__LLVM_LIBC__) -extern "C" double lgamma_r(double, int*); +// Some libc declares the math functions to be `noexcept`. +#if defined(_LIBCPP_GLIBC_PREREQ) +# if _LIBCPP_GLIBC_PREREQ(2, 8) +# define _LIBCPP_LGAMMA_R_NOEXCEPT _NOEXCEPT +# else +# define _LIBCPP_LGAMMA_R_NOEXCEPT +# endif +#elif defined(__LLVM_LIBC__) +# define _LIBCPP_LGAMMA_R_NOEXCEPT _NOEXCEPT +#else +# define _LIBCPP_LGAMMA_R_NOEXCEPT +#endif + +#if !defined(_LIBCPP_MSVCRT_LIKE) +extern "C" double lgamma_r(double, int*) _LIBCPP_LGAMMA_R_NOEXCEPT; #endif inline _LIBCPP_HIDE_FROM_ABI double __libcpp_lgamma(double __d) { -#if defined(_LIBCPP_MSVCRT_LIKE) || defined(__LLVM_LIBC__) +#if defined(_LIBCPP_MSVCRT_LIKE) return lgamma(__d); #else int __sign; diff --git a/naiveproxy/src/third_party/libc++/src/include/__ranges/as_rvalue_view.h b/naiveproxy/src/third_party/libc++/src/include/__ranges/as_rvalue_view.h index 5849a6c368..08acf3d773 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__ranges/as_rvalue_view.h +++ b/naiveproxy/src/third_party/libc++/src/include/__ranges/as_rvalue_view.h @@ -117,7 +117,7 @@ struct __fn : __range_adaptor_closure<__fn> { return /*---------------------------------*/ as_rvalue_view(std::forward<_Range>(__range)); } - template + template requires same_as, range_reference_t<_Range>> [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr auto operator()(_Range&& __range) noexcept(noexcept(views::all(std::forward<_Range>(__range)))) diff --git a/naiveproxy/src/third_party/libc++/src/include/__ranges/iota_view.h b/naiveproxy/src/third_party/libc++/src/include/__ranges/iota_view.h index 4b84585258..22adc22e69 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__ranges/iota_view.h +++ b/naiveproxy/src/third_party/libc++/src/include/__ranges/iota_view.h @@ -30,6 +30,7 @@ #include <__ranges/movable_box.h> #include <__ranges/view_interface.h> #include <__type_traits/conditional.h> +#include <__type_traits/decay.h> #include <__type_traits/is_nothrow_constructible.h> #include <__type_traits/make_unsigned.h> #include <__type_traits/type_identity.h> @@ -374,10 +375,10 @@ namespace views { namespace __iota { struct __fn { template + requires(requires(_Start __s) { ranges::iota_view>(std::forward<_Start>(__s)); }) _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Start&& __start) const - noexcept(noexcept(ranges::iota_view(std::forward<_Start>(__start)))) - -> decltype(ranges::iota_view(std::forward<_Start>(__start))) { - return ranges::iota_view(std::forward<_Start>(__start)); + noexcept(noexcept(ranges::iota_view>(std::forward<_Start>(__start)))) { + return ranges::iota_view>(std::forward<_Start>(__start)); } template @@ -392,6 +393,15 @@ struct __fn { inline namespace __cpo { inline constexpr auto iota = __iota::__fn{}; } // namespace __cpo + +# if _LIBCPP_STD_VER >= 26 + +inline constexpr auto indices = [](__integer_like auto __size) static { + return ranges::views::iota(decltype(__size){}, __size); +}; + +# endif + } // namespace views } // namespace ranges diff --git a/naiveproxy/src/third_party/libc++/src/include/__ranges/join_view.h b/naiveproxy/src/third_party/libc++/src/include/__ranges/join_view.h index 327b349f47..364f056d8d 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__ranges/join_view.h +++ b/naiveproxy/src/third_party/libc++/src/include/__ranges/join_view.h @@ -410,8 +410,13 @@ struct __segmented_iterator_traits<_JoinViewIterator> { static constexpr _LIBCPP_HIDE_FROM_ABI _JoinViewIterator __compose(__segment_iterator __seg_iter, __local_iterator __local_iter) { - return _JoinViewIterator( - std::move(__seg_iter).__get_data(), std::move(__seg_iter).__get_iter(), std::move(__local_iter)); + auto&& __parent = std::move(__seg_iter).__get_data(); + auto&& __outer = std::move(__seg_iter).__get_iter(); + if (__local_iter == ranges::end(*__outer)) { + ++__outer; + return _JoinViewIterator(*__parent, __outer); + } + return _JoinViewIterator(__parent, __outer, std::move(__local_iter)); } }; diff --git a/naiveproxy/src/third_party/libc++/src/include/__split_buffer b/naiveproxy/src/third_party/libc++/src/include/__split_buffer index 21e58f4abc..15368a3bc8 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__split_buffer +++ b/naiveproxy/src/third_party/libc++/src/include/__split_buffer @@ -13,10 +13,12 @@ #include <__algorithm/max.h> #include <__algorithm/move.h> #include <__algorithm/move_backward.h> +#include <__assert> #include <__config> #include <__iterator/distance.h> #include <__iterator/iterator_traits.h> #include <__iterator/move_iterator.h> +#include <__memory/addressof.h> #include <__memory/allocate_at_least.h> #include <__memory/allocator.h> #include <__memory/allocator_traits.h> @@ -45,25 +47,434 @@ _LIBCPP_PUSH_MACROS _LIBCPP_BEGIN_NAMESPACE_STD -// __split_buffer allocates a contiguous chunk of memory and stores objects in the range [__begin_, __end_). -// It has uninitialized memory in the ranges [__first_, __begin_) and [__end_, __cap_). That allows -// it to grow both in the front and back without having to move the data. +template class _Layout> +class __split_buffer; + +template +class __split_buffer_pointer_layout { +protected: + using value_type = _Tp; + using allocator_type = _Allocator; + using __alloc_rr _LIBCPP_NODEBUG = __libcpp_remove_reference_t; + using __alloc_traits _LIBCPP_NODEBUG = allocator_traits<__alloc_rr>; + using reference = value_type&; + using const_reference = const value_type&; + using size_type = typename __alloc_traits::size_type; + using difference_type = typename __alloc_traits::difference_type; + using pointer = typename __alloc_traits::pointer; + using const_pointer = typename __alloc_traits::const_pointer; + using iterator = pointer; + using const_iterator = const_pointer; + using __sentinel_type _LIBCPP_NODEBUG = pointer; -template > -struct __split_buffer { public: - using value_type = _Tp; - using allocator_type = _Allocator; - using __alloc_rr _LIBCPP_NODEBUG = __libcpp_remove_reference_t; - using __alloc_traits _LIBCPP_NODEBUG = allocator_traits<__alloc_rr>; - using reference = value_type&; - using const_reference = const value_type&; - using size_type = typename __alloc_traits::size_type; - using difference_type = typename __alloc_traits::difference_type; - using pointer = typename __alloc_traits::pointer; - using const_pointer = typename __alloc_traits::const_pointer; - using iterator = pointer; - using const_iterator = const_pointer; + // Can't be defaulted due to _LIBCPP_COMPRESSED_PAIR not being an aggregate in C++03 and C++11. + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __split_buffer_pointer_layout() : __back_cap_(nullptr) {} + + _LIBCPP_CONSTEXPR_SINCE_CXX20 + _LIBCPP_HIDE_FROM_ABI explicit __split_buffer_pointer_layout(const allocator_type& __alloc) + : __back_cap_(nullptr), __alloc_(__alloc) {} + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer __front_cap() _NOEXCEPT { return __front_cap_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_pointer __front_cap() const _NOEXCEPT { + return __front_cap_; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer begin() _NOEXCEPT { return __begin_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_pointer begin() const _NOEXCEPT { return __begin_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer end() _NOEXCEPT { return __end_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer end() const _NOEXCEPT { return __end_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type size() const _NOEXCEPT { + return static_cast(__end_ - __begin_); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool empty() const _NOEXCEPT { return __begin_ == __end_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type capacity() const _NOEXCEPT { + return static_cast(__back_cap_ - __front_cap_); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI allocator_type& __get_allocator() _NOEXCEPT { return __alloc_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI allocator_type const& __get_allocator() const _NOEXCEPT { + return __alloc_; + } + + // Returns the sentinel object directly. Should be used in conjunction with automatic type deduction, + // not explicit types. + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __sentinel_type __raw_sentinel() const _NOEXCEPT { + return __end_; + } + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __sentinel_type __raw_capacity() const _NOEXCEPT { + return __back_cap_; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __set_data(pointer __new_first) _NOEXCEPT { + __front_cap_ = __new_first; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void + __set_valid_range(pointer __new_begin, pointer __new_end) _NOEXCEPT { + __begin_ = __new_begin; + __end_ = __new_end; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void + __set_valid_range(pointer __new_begin, size_type __new_size) _NOEXCEPT { + __begin_ = __new_begin; + __end_ = __begin_ + __new_size; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __set_sentinel(pointer __new_end) _NOEXCEPT { + _LIBCPP_ASSERT_INTERNAL(__front_cap_ <= __new_end, "__new_end cannot precede __front_cap_"); + __end_ = __new_end; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __set_sentinel(size_type __new_size) _NOEXCEPT { + __end_ = __begin_ + __new_size; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __set_capacity(size_type __new_capacity) _NOEXCEPT { + __back_cap_ = __front_cap_ + __new_capacity; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __set_capacity(pointer __new_capacity) _NOEXCEPT { + __back_cap_ = __new_capacity; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type __front_spare() const _NOEXCEPT { + return static_cast(__begin_ - __front_cap_); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type __back_spare() const _NOEXCEPT { + return static_cast(__back_cap_ - __end_); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference back() _NOEXCEPT { return *(__end_ - 1); } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference back() const _NOEXCEPT { return *(__end_ - 1); } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __swap_without_allocator( + __split_buffer_pointer_layout<__split_buffer, + value_type, + __alloc_rr&>& __other) _NOEXCEPT { + std::swap(__front_cap_, __other.__front_cap_); + std::swap(__begin_, __other.__begin_); + std::swap(__back_cap_, __other.__back_cap_); + std::swap(__end_, __other.__end_); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void swap(__split_buffer_pointer_layout& __other) _NOEXCEPT { + std::swap(__front_cap_, __other.__front_cap_); + std::swap(__begin_, __other.__begin_); + std::swap(__back_cap_, __other.__back_cap_); + std::swap(__end_, __other.__end_); + std::__swap_allocator(__alloc_, __other.__alloc_); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __reset() _NOEXCEPT { + __front_cap_ = nullptr; + __begin_ = nullptr; + __end_ = nullptr; + __back_cap_ = nullptr; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void + __copy_without_alloc(__split_buffer_pointer_layout const& __other) + _NOEXCEPT_(is_nothrow_copy_assignable::value) { + __front_cap_ = __other.__front_cap_; + __begin_ = __other.__begin_; + __end_ = __other.__end_; + __back_cap_ = __other.__back_cap_; + } + +private: + pointer __front_cap_ = nullptr; + pointer __begin_ = nullptr; + pointer __end_ = nullptr; + _LIBCPP_COMPRESSED_PAIR(pointer, __back_cap_, allocator_type, __alloc_); + + template + friend class __split_buffer_pointer_layout; +}; + +template +class __split_buffer_size_layout { +protected: + using value_type = _Tp; + using allocator_type = _Allocator; + using __alloc_rr _LIBCPP_NODEBUG = __libcpp_remove_reference_t; + using __alloc_traits _LIBCPP_NODEBUG = allocator_traits<__alloc_rr>; + using reference = value_type&; + using const_reference = const value_type&; + using size_type = typename __alloc_traits::size_type; + using difference_type = typename __alloc_traits::difference_type; + using pointer = typename __alloc_traits::pointer; + using const_pointer = typename __alloc_traits::const_pointer; + using iterator = pointer; + using const_iterator = const_pointer; + using __sentinel_type _LIBCPP_NODEBUG = size_type; + +public: + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __split_buffer_size_layout() = default; + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit __split_buffer_size_layout(const allocator_type& __alloc) + : __alloc_(__alloc) {} + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer __front_cap() _NOEXCEPT { return __front_cap_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_pointer __front_cap() const _NOEXCEPT { + return __front_cap_; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer begin() _NOEXCEPT { return __begin_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_pointer begin() const _NOEXCEPT { return __begin_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer end() _NOEXCEPT { return __begin_ + __size_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer end() const _NOEXCEPT { return __begin_ + __size_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type size() const _NOEXCEPT { return __size_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool empty() const _NOEXCEPT { return __size_ == 0; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type capacity() const _NOEXCEPT { return __cap_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI allocator_type& __get_allocator() _NOEXCEPT { return __alloc_; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI allocator_type const& __get_allocator() const _NOEXCEPT { + return __alloc_; + } + + // Returns the sentinel object directly. Should be used in conjunction with automatic type deduction, + // not explicit types. + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __sentinel_type __raw_sentinel() const _NOEXCEPT { + return __size_; + } + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __sentinel_type __raw_capacity() const _NOEXCEPT { + return __cap_; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __set_data(pointer __new_first) _NOEXCEPT { + __front_cap_ = __new_first; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void + __set_valid_range(pointer __new_begin, pointer __new_end) _NOEXCEPT { + // Size-based __split_buffers track their size directly: we need to explicitly update the size + // when the front is adjusted. + __size_ -= __new_begin - __begin_; + __begin_ = __new_begin; + __set_sentinel(__new_end); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void + __set_valid_range(pointer __new_begin, size_type __new_size) _NOEXCEPT { + // Size-based __split_buffers track their size directly: we need to explicitly update the size + // when the front is adjusted. + __size_ -= __new_begin - __begin_; + __begin_ = __new_begin; + __set_sentinel(__new_size); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __set_sentinel(pointer __new_end) _NOEXCEPT { + _LIBCPP_ASSERT_INTERNAL(__front_cap_ <= __new_end, "__new_end cannot precede __front_cap_"); + __size_ += __new_end - end(); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __set_sentinel(size_type __new_size) _NOEXCEPT { + __size_ = __new_size; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __set_capacity(size_type __new_capacity) _NOEXCEPT { + __cap_ = __new_capacity; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __set_capacity(pointer __new_capacity) _NOEXCEPT { + __cap_ = __new_capacity - __begin_; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type __front_spare() const _NOEXCEPT { + return static_cast(__begin_ - __front_cap_); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type __back_spare() const _NOEXCEPT { + // `__cap_ - __end_` tells us the total number of spares when in size-mode. We need to remove + // the __front_spare from the count. + return __cap_ - __size_ - __front_spare(); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference back() _NOEXCEPT { return __begin_[__size_ - 1]; } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference back() const _NOEXCEPT { + return __begin_[__size_ - 1]; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __swap_without_allocator( + __split_buffer_pointer_layout<__split_buffer, + value_type, + __alloc_rr&>& __other) _NOEXCEPT { + std::swap(__front_cap_, __other.__front_cap_); + std::swap(__begin_, __other.__begin_); + std::swap(__cap_, __other.__cap_); + std::swap(__size_, __other.__size_); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void swap(__split_buffer_size_layout& __other) _NOEXCEPT { + std::swap(__front_cap_, __other.__front_cap_); + std::swap(__begin_, __other.__begin_); + std::swap(__cap_, __other.__cap_); + std::swap(__size_, __other.__size_); + std::__swap_allocator(__alloc_, __other.__alloc_); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __reset() _NOEXCEPT { + __front_cap_ = nullptr; + __begin_ = nullptr; + __size_ = 0; + __cap_ = 0; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void + __copy_without_alloc(__split_buffer_size_layout const& __other) + _NOEXCEPT_(is_nothrow_copy_assignable::value) { + __front_cap_ = __other.__front_cap_; + __begin_ = __other.__begin_; + __cap_ = __other.__cap_; + __size_ = __other.__size_; + } + +private: + pointer __front_cap_ = nullptr; + pointer __begin_ = nullptr; + size_type __size_ = 0; + size_type __cap_ = 0; + _LIBCPP_NO_UNIQUE_ADDRESS allocator_type __alloc_; + + template + friend class __split_buffer_size_layout; +}; + +// `__split_buffer` is a contiguous array data structure. It may hold spare capacity at both ends of +// the sequence. This allows for a `__split_buffer` to grow from both the front and the back without +// relocating its contents until it runs out of room. This characteristic sets it apart from +// `std::vector`, which only holds spare capacity at its end. As such, `__split_buffer` is useful +// for implementing both `std::vector` and `std::deque`. +// +// The sequence is stored as a contiguous chunk of memory delimited by the following "pointers" (`o` denotes +// uninitialized memory and `x` denotes a valid object): +// +// |oooooooooooooooooooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoooooooooooooooooooooooo| +// ^ ^ ^ ^ +// __front_cap_ __begin_ __end_ __back_cap_ +// +// The range [__front_cap_, __begin_) contains uninitialized memory. It is referred to as the "front spare capacity". +// The range [__begin_, __end_) contains valid objects. It is referred to as the "valid range". +// The range [__end_, __back_cap_) contains uninitialized memory. It is referred to as the "back spare capacity". +// +// The layout of `__split_buffer` is determined by the `_Layout` template template parameter. This +// `_Layout` allows the above pointers to be stored as different representations, such as integer +// offsets. A layout class template must provide the following interface: +// +// template +// class __layout { +// protected: +// using value_type = _Tp; +// using allocator_type = _Allocator; +// using __alloc_rr = __libcpp_remove_reference_t; +// using __alloc_traits = allocator_traits<__alloc_rr>; +// using reference = value_type&; +// using const_reference = const value_type&; +// using size_type = typename __alloc_traits::size_type; +// using difference_type = typename __alloc_traits::difference_type; +// using pointer = typename __alloc_traits::pointer; +// using const_pointer = typename __alloc_traits::const_pointer; +// using iterator = pointer; +// using const_iterator = const_pointer; +// using __sentinel_type = /* type that represents the layout's sentinel */; +// +// public: +// __layout() = default; +// explicit __layout(const allocator_type&); +// +// pointer __front_cap(); +// const_pointer __front_cap() const; +// +// pointer begin(); +// const_pointer begin() const; +// +// pointer end(); +// pointer end() const; +// +// size_type size() const; +// bool empty() const; +// size_type capacity() const; +// +// allocator_type& __get_allocator(); +// allocator_type const& __get_allocator() const; +// +// __sentinel_type __raw_sentinel() const; +// __sentinel_type __raw_capacity() const; +// +// void __set_data(pointer); +// void __set_valid_range(pointer __begin, pointer __end); +// void __set_valid_range(pointer __begin, size_type __size); +// void __set_sentinel(pointer __end); +// void __set_sentinel(size_type __size); +// +// void __set_capacity(size_type __capacity); +// void __set_capacity(pointer __capacity); +// +// size_type __front_spare() const; +// size_type __back_spare() const; +// +// reference back(); +// const_reference back() const; +// +// template +// void __swap_without_allocator(_OtherLayout&); +// void swap(__layout&); +// +// void __reset(); +// void __copy_without_alloc(__layout const&); +// }; +// +template class _Layout> +class __split_buffer : _Layout<__split_buffer<_Tp, _Allocator, _Layout>, _Tp, _Allocator> { + using __base_type _LIBCPP_NODEBUG = _Layout<__split_buffer<_Tp, _Allocator, _Layout>, _Tp, _Allocator>; + +public: + using __base_type::__back_spare; + using __base_type::__copy_without_alloc; + using __base_type::__front_cap; + using __base_type::__front_spare; + using __base_type::__get_allocator; + using __base_type::__raw_capacity; + using __base_type::__raw_sentinel; + using __base_type::__reset; + using __base_type::__set_capacity; + using __base_type::__set_data; + using __base_type::__set_sentinel; + using __base_type::__set_valid_range; + + using typename __base_type::__alloc_rr; + using typename __base_type::__alloc_traits; + using typename __base_type::allocator_type; + using typename __base_type::const_iterator; + using typename __base_type::const_pointer; + using typename __base_type::const_reference; + using typename __base_type::difference_type; + using typename __base_type::iterator; + using typename __base_type::pointer; + using typename __base_type::reference; + using typename __base_type::size_type; + using typename __base_type::value_type; // A __split_buffer contains the following members which may be trivially relocatable: // - pointer: may be trivially relocatable, so it's checked @@ -78,23 +489,15 @@ public: __split_buffer, void>; - pointer __first_; - pointer __begin_; - pointer __end_; - _LIBCPP_COMPRESSED_PAIR(pointer, __cap_, allocator_type, __alloc_); - __split_buffer(const __split_buffer&) = delete; __split_buffer& operator=(const __split_buffer&) = delete; - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __split_buffer() - _NOEXCEPT_(is_nothrow_default_constructible::value) - : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __cap_(nullptr) {} + _LIBCPP_HIDE_FROM_ABI __split_buffer() = default; - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit __split_buffer(__alloc_rr& __a) - : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __cap_(nullptr), __alloc_(__a) {} + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit __split_buffer(__alloc_rr& __a) : __base_type(__a) {} _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit __split_buffer(const __alloc_rr& __a) - : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __cap_(nullptr), __alloc_(__a) {} + : __base_type(__a) {} _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __split_buffer(size_type __cap, size_type __start, __alloc_rr& __a); @@ -111,36 +514,16 @@ public: _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI ~__split_buffer(); - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator begin() _NOEXCEPT { return __begin_; } - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator begin() const _NOEXCEPT { return __begin_; } + using __base_type::back; + using __base_type::begin; + using __base_type::capacity; + using __base_type::empty; + using __base_type::end; + using __base_type::size; - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator end() _NOEXCEPT { return __end_; } - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator end() const _NOEXCEPT { return __end_; } - - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void clear() _NOEXCEPT { __destruct_at_end(__begin_); } - - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type size() const { - return static_cast(__end_ - __begin_); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool empty() const { return __end_ == __begin_; } - - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type capacity() const { - return static_cast(__cap_ - __first_); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type __front_spare() const { - return static_cast(__begin_ - __first_); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type __back_spare() const { - return static_cast(__cap_ - __end_); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference front() { return *__begin_; } - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference front() const { return *__begin_; } - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference back() { return *(__end_ - 1); } - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference back() const { return *(__end_ - 1); } + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void clear() _NOEXCEPT { __destruct_at_end(begin()); } + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference front() { return *begin(); } + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference front() const { return *begin(); } _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void shrink_to_fit() _NOEXCEPT; @@ -149,8 +532,8 @@ public: template _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void emplace_back(_Args&&... __args); - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void pop_front() { __destruct_at_begin(__begin_ + 1); } - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void pop_back() { __destruct_at_end(__end_ - 1); } + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void pop_front() { __destruct_at_begin(begin() + 1); } + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void pop_back() { __destruct_at_end(end() - 1); } _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __construct_at_end(size_type __n); _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __construct_at_end(size_type __n, const_reference __x); @@ -184,242 +567,240 @@ public: _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void swap(__split_buffer& __x) _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || __is_nothrow_swappable_v<__alloc_rr>); - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool __invariants() const; + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool __invariants() const { + if (__front_cap() == nullptr) { + if (begin() != nullptr) + return false; + + if (!empty()) + return false; + + if (capacity() != 0) + return false; + + return true; + } else { + if (begin() < __front_cap()) + return false; + + if (capacity() < size()) + return false; + + if (end() < begin()) + return false; + + return true; + } + } + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void + __swap_without_allocator(__split_buffer& __other) _NOEXCEPT { + __base_type::__swap_without_allocator(__other); + } private: _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign_alloc(__split_buffer& __c, true_type) _NOEXCEPT_(is_nothrow_move_assignable::value) { - __alloc_ = std::move(__c.__alloc_); + __get_allocator() = std::move(__c.__get_allocator()); } _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign_alloc(__split_buffer&, false_type) _NOEXCEPT {} struct _ConstructTransaction { _LIBCPP_CONSTEXPR_SINCE_CXX20 - _LIBCPP_HIDE_FROM_ABI explicit _ConstructTransaction(pointer* __p, size_type __n) _NOEXCEPT - : __pos_(*__p), - __end_(*__p + __n), - __dest_(__p) {} + _LIBCPP_HIDE_FROM_ABI explicit _ConstructTransaction(__split_buffer* __parent, pointer __p, size_type __n) _NOEXCEPT + : __pos_(__p), + __end_(__p + __n), + __parent_(__parent) {} - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI ~_ConstructTransaction() { *__dest_ = __pos_; } + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI ~_ConstructTransaction() { __parent_->__set_sentinel(__pos_); } pointer __pos_; const pointer __end_; private: - pointer* __dest_; + __split_buffer* __parent_; }; + + template class _L2> + friend class __split_buffer; }; -template -_LIBCPP_CONSTEXPR_SINCE_CXX20 bool __split_buffer<_Tp, _Allocator>::__invariants() const { - if (__first_ == nullptr) { - if (__begin_ != nullptr) - return false; - if (__end_ != nullptr) - return false; - if (__cap_ != nullptr) - return false; - } else { - if (__begin_ < __first_) - return false; - if (__end_ < __begin_) - return false; - if (__cap_ < __end_) - return false; - } - return true; -} - -// Default constructs __n objects starting at __end_ +// Default constructs __n objects starting at `end()` // throws if construction throws // Precondition: __n > 0 // Precondition: size() + __n <= capacity() // Postcondition: size() == size() + __n -template -_LIBCPP_CONSTEXPR_SINCE_CXX20 void __split_buffer<_Tp, _Allocator>::__construct_at_end(size_type __n) { - _ConstructTransaction __tx(std::addressof(this->__end_), __n); +template class _Layout> +_LIBCPP_CONSTEXPR_SINCE_CXX20 void __split_buffer<_Tp, _Allocator, _Layout>::__construct_at_end(size_type __n) { + _ConstructTransaction __tx(this, end(), __n); for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_) { - __alloc_traits::construct(__alloc_, std::__to_address(__tx.__pos_)); + __alloc_traits::construct(__get_allocator(), std::__to_address(__tx.__pos_)); } } -// Copy constructs __n objects starting at __end_ from __x +// Copy constructs __n objects starting at `end()` from __x // throws if construction throws // Precondition: __n > 0 // Precondition: size() + __n <= capacity() // Postcondition: size() == old size() + __n // Postcondition: [i] == __x for all i in [size() - __n, __n) -template +template class _Layout> _LIBCPP_CONSTEXPR_SINCE_CXX20 void -__split_buffer<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x) { - _ConstructTransaction __tx(std::addressof(this->__end_), __n); +__split_buffer<_Tp, _Allocator, _Layout>::__construct_at_end(size_type __n, const_reference __x) { + _ConstructTransaction __tx(this, end(), __n); for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_) { - __alloc_traits::construct(__alloc_, std::__to_address(__tx.__pos_), __x); + __alloc_traits::construct(__get_allocator(), std::__to_address(__tx.__pos_), __x); } } -template +template class _Layout> template _LIBCPP_CONSTEXPR_SINCE_CXX20 void -__split_buffer<_Tp, _Allocator>::__construct_at_end_with_sentinel(_Iterator __first, _Sentinel __last) { - __alloc_rr& __a = __alloc_; +__split_buffer<_Tp, _Allocator, _Layout>::__construct_at_end_with_sentinel(_Iterator __first, _Sentinel __last) { + __alloc_rr& __a = __get_allocator(); for (; __first != __last; ++__first) { - if (__end_ == __cap_) { - size_type __old_cap = __cap_ - __first_; + if (__back_spare() == 0) { + size_type __old_cap = capacity(); size_type __new_cap = std::max(2 * __old_cap, 8); __split_buffer __buf(__new_cap, 0, __a); - for (pointer __p = __begin_; __p != __end_; ++__p, (void)++__buf.__end_) - __alloc_traits::construct(__buf.__alloc_, std::__to_address(__buf.__end_), std::move(*__p)); + pointer __buf_end = __buf.end(); + pointer __end = end(); + for (pointer __p = begin(); __p != __end; ++__p) { + __alloc_traits::construct(__buf.__get_allocator(), std::__to_address(__buf_end), std::move(*__p)); + __buf.__set_sentinel(++__buf_end); + } swap(__buf); } - __alloc_traits::construct(__a, std::__to_address(this->__end_), *__first); - ++this->__end_; + + __alloc_traits::construct(__a, std::__to_address(end()), *__first); + __set_sentinel(size() + 1); } } -template + +template class _Layout> template ::value, int> > _LIBCPP_CONSTEXPR_SINCE_CXX20 void -__split_buffer<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last) { +__split_buffer<_Tp, _Allocator, _Layout>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last) { __construct_at_end_with_size(__first, std::distance(__first, __last)); } -template +template class _Layout> template _LIBCPP_CONSTEXPR_SINCE_CXX20 void -__split_buffer<_Tp, _Allocator>::__construct_at_end_with_size(_ForwardIterator __first, size_type __n) { - _ConstructTransaction __tx(std::addressof(this->__end_), __n); +__split_buffer<_Tp, _Allocator, _Layout>::__construct_at_end_with_size(_ForwardIterator __first, size_type __n) { + _ConstructTransaction __tx(this, end(), __n); for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_, (void)++__first) { - __alloc_traits::construct(__alloc_, std::__to_address(__tx.__pos_), *__first); + __alloc_traits::construct(__get_allocator(), std::__to_address(__tx.__pos_), *__first); } } -template +template class _Layout> _LIBCPP_CONSTEXPR_SINCE_CXX20 inline void -__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, false_type) { - while (__begin_ != __new_begin) - __alloc_traits::destroy(__alloc_, std::__to_address(__begin_++)); +__split_buffer<_Tp, _Allocator, _Layout>::__destruct_at_begin(pointer __new_begin, false_type) { + pointer __begin = begin(); + // Updating begin at every iteration is unnecessary because destruction can't throw. + while (__begin != __new_begin) + __alloc_traits::destroy(__get_allocator(), std::__to_address(__begin++)); + __set_valid_range(__begin, end()); } -template +template class _Layout> _LIBCPP_CONSTEXPR_SINCE_CXX20 inline void -__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, true_type) { - __begin_ = __new_begin; +__split_buffer<_Tp, _Allocator, _Layout>::__destruct_at_begin(pointer __new_begin, true_type) { + __set_valid_range(__new_begin, end()); } -template +template class _Layout> _LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI void -__split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, false_type) _NOEXCEPT { - while (__new_last != __end_) - __alloc_traits::destroy(__alloc_, std::__to_address(--__end_)); +__split_buffer<_Tp, _Allocator, _Layout>::__destruct_at_end(pointer __new_last, false_type) _NOEXCEPT { + pointer __end = end(); + // Updating begin at every iteration is unnecessary because destruction can't throw. + while (__new_last != __end) + __alloc_traits::destroy(__get_allocator(), std::__to_address(--__end)); + __set_sentinel(__end); } -template -_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI void -__split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, true_type) _NOEXCEPT { - __end_ = __new_last; -} - -template +template class _Layout> _LIBCPP_CONSTEXPR_SINCE_CXX20 -__split_buffer<_Tp, _Allocator>::__split_buffer(size_type __cap, size_type __start, __alloc_rr& __a) - : __cap_(nullptr), __alloc_(__a) { - if (__cap == 0) { - __first_ = nullptr; - } else { - auto __allocation = std::__allocate_at_least(__alloc_, __cap); - __first_ = __allocation.ptr; - __cap = __allocation.count; +__split_buffer<_Tp, _Allocator, _Layout>::__split_buffer(size_type __cap, size_type __start, __alloc_rr& __a) + : __base_type(__a) { + _LIBCPP_ASSERT_INTERNAL(__cap >= __start, "can't have a start point outside the capacity"); + if (__cap > 0) { + auto __allocation = std::__allocate_at_least(__get_allocator(), __cap); + __set_data(__allocation.ptr); + __cap = __allocation.count; } - __begin_ = __end_ = __first_ + __start; - __cap_ = __first_ + __cap; + + pointer __begin = __front_cap() + __start; + __set_valid_range(__begin, __begin); + __set_capacity(__cap); } -template -_LIBCPP_CONSTEXPR_SINCE_CXX20 __split_buffer<_Tp, _Allocator>::~__split_buffer() { +template class _Layout> +_LIBCPP_CONSTEXPR_SINCE_CXX20 __split_buffer<_Tp, _Allocator, _Layout>::~__split_buffer() { clear(); - if (__first_) - __alloc_traits::deallocate(__alloc_, __first_, capacity()); + if (__front_cap()) + __alloc_traits::deallocate(__get_allocator(), __front_cap(), capacity()); } -template -_LIBCPP_CONSTEXPR_SINCE_CXX20 __split_buffer<_Tp, _Allocator>::__split_buffer(__split_buffer&& __c) +template class _Layout> +_LIBCPP_CONSTEXPR_SINCE_CXX20 __split_buffer<_Tp, _Allocator, _Layout>::__split_buffer(__split_buffer&& __c) _NOEXCEPT_(is_nothrow_move_constructible::value) - : __first_(std::move(__c.__first_)), - __begin_(std::move(__c.__begin_)), - __end_(std::move(__c.__end_)), - __cap_(std::move(__c.__cap_)), - __alloc_(std::move(__c.__alloc_)) { - __c.__first_ = nullptr; - __c.__begin_ = nullptr; - __c.__end_ = nullptr; - __c.__cap_ = nullptr; + : __base_type(std::move(__c)) { + __c.__reset(); } -template +template class _Layout> _LIBCPP_CONSTEXPR_SINCE_CXX20 -__split_buffer<_Tp, _Allocator>::__split_buffer(__split_buffer&& __c, const __alloc_rr& __a) - : __cap_(nullptr), __alloc_(__a) { - if (__a == __c.__alloc_) { - __first_ = __c.__first_; - __begin_ = __c.__begin_; - __end_ = __c.__end_; - __cap_ = __c.__cap_; - __c.__first_ = nullptr; - __c.__begin_ = nullptr; - __c.__end_ = nullptr; - __c.__cap_ = nullptr; +__split_buffer<_Tp, _Allocator, _Layout>::__split_buffer(__split_buffer&& __c, const __alloc_rr& __a) + : __base_type(__a) { + if (__a == __c.__get_allocator()) { + __set_data(__c.__front_cap()); + __set_valid_range(__c.begin(), __c.end()); + __set_capacity(__c.capacity()); + __c.__reset(); } else { - auto __allocation = std::__allocate_at_least(__alloc_, __c.size()); - __first_ = __allocation.ptr; - __begin_ = __end_ = __first_; - __cap_ = __first_ + __allocation.count; + auto __allocation = std::__allocate_at_least(__get_allocator(), __c.size()); + __set_data(__allocation.ptr); + __set_valid_range(__front_cap(), __front_cap()); + __set_capacity(__allocation.count); typedef move_iterator _Ip; __construct_at_end(_Ip(__c.begin()), _Ip(__c.end())); } } -template -_LIBCPP_CONSTEXPR_SINCE_CXX20 __split_buffer<_Tp, _Allocator>& -__split_buffer<_Tp, _Allocator>::operator=(__split_buffer&& __c) +template class _Layout> +_LIBCPP_CONSTEXPR_SINCE_CXX20 __split_buffer<_Tp, _Allocator, _Layout>& +__split_buffer<_Tp, _Allocator, _Layout>::operator=(__split_buffer&& __c) _NOEXCEPT_((__alloc_traits::propagate_on_container_move_assignment::value && is_nothrow_move_assignable::value) || !__alloc_traits::propagate_on_container_move_assignment::value) { clear(); shrink_to_fit(); - __first_ = __c.__first_; - __begin_ = __c.__begin_; - __end_ = __c.__end_; - __cap_ = __c.__cap_; + __copy_without_alloc(__c); __move_assign_alloc(__c, integral_constant()); - __c.__first_ = __c.__begin_ = __c.__end_ = __c.__cap_ = nullptr; + __c.__reset(); return *this; } -template -_LIBCPP_CONSTEXPR_SINCE_CXX20 void __split_buffer<_Tp, _Allocator>::swap(__split_buffer& __x) +template class _Layout> +_LIBCPP_CONSTEXPR_SINCE_CXX20 void __split_buffer<_Tp, _Allocator, _Layout>::swap(__split_buffer& __x) _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || __is_nothrow_swappable_v<__alloc_rr>) { - std::swap(__first_, __x.__first_); - std::swap(__begin_, __x.__begin_); - std::swap(__end_, __x.__end_); - std::swap(__cap_, __x.__cap_); - std::__swap_allocator(__alloc_, __x.__alloc_); + __base_type::swap(__x); } -template -_LIBCPP_CONSTEXPR_SINCE_CXX20 void __split_buffer<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT { +template class _Layout> +_LIBCPP_CONSTEXPR_SINCE_CXX20 void __split_buffer<_Tp, _Allocator, _Layout>::shrink_to_fit() _NOEXCEPT { if (capacity() > size()) { #if _LIBCPP_HAS_EXCEPTIONS try { #endif // _LIBCPP_HAS_EXCEPTIONS - __split_buffer __t(size(), 0, __alloc_); + __split_buffer __t(size(), 0, __get_allocator()); if (__t.capacity() < capacity()) { - __t.__construct_at_end(move_iterator(__begin_), move_iterator(__end_)); - __t.__end_ = __t.__begin_ + (__end_ - __begin_); - std::swap(__first_, __t.__first_); - std::swap(__begin_, __t.__begin_); - std::swap(__end_, __t.__end_); - std::swap(__cap_, __t.__cap_); + __t.__construct_at_end(move_iterator(begin()), move_iterator(end())); + __t.__set_sentinel(size()); + __swap_without_allocator(__t); } #if _LIBCPP_HAS_EXCEPTIONS } catch (...) { @@ -428,55 +809,56 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 void __split_buffer<_Tp, _Allocator>::shrink_to_fi } } -template +template class _Layout> template -_LIBCPP_CONSTEXPR_SINCE_CXX20 void __split_buffer<_Tp, _Allocator>::emplace_front(_Args&&... __args) { - if (__begin_ == __first_) { - if (__end_ < __cap_) { - difference_type __d = __cap_ - __end_; +_LIBCPP_CONSTEXPR_SINCE_CXX20 void __split_buffer<_Tp, _Allocator, _Layout>::emplace_front(_Args&&... __args) { + if (__front_spare() == 0) { + pointer __end = end(); + if (__back_spare() > 0) { + // The elements are pressed up against the front of the buffer: we need to move them back a + // little bit to make `emplace_front` have amortised O(1) complexity. + difference_type __d = __back_spare(); __d = (__d + 1) / 2; - __begin_ = std::move_backward(__begin_, __end_, __end_ + __d); - __end_ += __d; + auto __new_end = __end + __d; + __set_valid_range(std::move_backward(begin(), __end, __new_end), __new_end); } else { - size_type __c = std::max(2 * static_cast(__cap_ - __first_), 1); - __split_buffer __t(__c, (__c + 3) / 4, __alloc_); - __t.__construct_at_end(move_iterator(__begin_), move_iterator(__end_)); - std::swap(__first_, __t.__first_); - std::swap(__begin_, __t.__begin_); - std::swap(__end_, __t.__end_); - std::swap(__cap_, __t.__cap_); + size_type __c = std::max(2 * capacity(), 1); + __split_buffer __t(__c, (__c + 3) / 4, __get_allocator()); + __t.__construct_at_end(move_iterator(begin()), move_iterator(__end)); + __base_type::__swap_without_allocator(__t); } } - __alloc_traits::construct(__alloc_, std::__to_address(__begin_ - 1), std::forward<_Args>(__args)...); - --__begin_; + + __alloc_traits::construct(__get_allocator(), std::__to_address(begin() - 1), std::forward<_Args>(__args)...); + __set_valid_range(begin() - 1, size() + 1); } -template +template class _Layout> template -_LIBCPP_CONSTEXPR_SINCE_CXX20 void __split_buffer<_Tp, _Allocator>::emplace_back(_Args&&... __args) { - if (__end_ == __cap_) { - if (__begin_ > __first_) { - difference_type __d = __begin_ - __first_; +_LIBCPP_CONSTEXPR_SINCE_CXX20 void __split_buffer<_Tp, _Allocator, _Layout>::emplace_back(_Args&&... __args) { + pointer __end = end(); + if (__back_spare() == 0) { + if (__front_spare() > 0) { + difference_type __d = __front_spare(); __d = (__d + 1) / 2; - __end_ = std::move(__begin_, __end_, __begin_ - __d); - __begin_ -= __d; + __end = std::move(begin(), __end, begin() - __d); + __set_valid_range(begin() - __d, __end); } else { - size_type __c = std::max(2 * static_cast(__cap_ - __first_), 1); - __split_buffer __t(__c, __c / 4, __alloc_); - __t.__construct_at_end(move_iterator(__begin_), move_iterator(__end_)); - std::swap(__first_, __t.__first_); - std::swap(__begin_, __t.__begin_); - std::swap(__end_, __t.__end_); - std::swap(__cap_, __t.__cap_); + size_type __c = std::max(2 * capacity(), 1); + __split_buffer __t(__c, __c / 4, __get_allocator()); + __t.__construct_at_end(move_iterator(begin()), move_iterator(__end)); + __base_type::__swap_without_allocator(__t); } } - __alloc_traits::construct(__alloc_, std::__to_address(__end_), std::forward<_Args>(__args)...); - ++__end_; + + __alloc_traits::construct(__get_allocator(), std::__to_address(__end), std::forward<_Args>(__args)...); + __set_sentinel(++__end); } -template +template class _Layout> _LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI void -swap(__split_buffer<_Tp, _Allocator>& __x, __split_buffer<_Tp, _Allocator>& __y) _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) { +swap(__split_buffer<_Tp, _Allocator, _Layout>& __x, __split_buffer<_Tp, _Allocator, _Layout>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) { __x.swap(__y); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__stop_token/atomic_unique_lock.h b/naiveproxy/src/third_party/libc++/src/include/__stop_token/atomic_unique_lock.h index 05e8f22316..4b0ae05ca8 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__stop_token/atomic_unique_lock.h +++ b/naiveproxy/src/third_party/libc++/src/include/__stop_token/atomic_unique_lock.h @@ -27,7 +27,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD // where State contains a lock bit and might contain other data, // and LockedBit is the value of State when the lock bit is set, e.g 1 << 2 template -class _LIBCPP_AVAILABILITY_SYNC __atomic_unique_lock { +class __atomic_unique_lock { static_assert(std::__popcount(static_cast(_LockedBit)) == 1, "LockedBit must be an integer where only one bit is set"); diff --git a/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_callback.h b/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_callback.h index a4d7a29953..76d438e096 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_callback.h +++ b/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_callback.h @@ -34,7 +34,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 20 && _LIBCPP_HAS_THREADS template -class _LIBCPP_AVAILABILITY_SYNC stop_callback : private __stop_callback_base { +class stop_callback : private __stop_callback_base { static_assert(invocable<_Callback>, "Mandates: stop_callback is instantiated with an argument for the template parameter Callback that " "satisfies invocable."); @@ -91,7 +91,7 @@ private: }; template -_LIBCPP_AVAILABILITY_SYNC stop_callback(stop_token, _Callback) -> stop_callback<_Callback>; +stop_callback(stop_token, _Callback) -> stop_callback<_Callback>; #endif // _LIBCPP_STD_VER >= 20 && _LIBCPP_HAS_THREADS diff --git a/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_source.h b/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_source.h index 85d67efe06..aea9429388 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_source.h +++ b/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_source.h @@ -30,7 +30,7 @@ struct nostopstate_t { inline constexpr nostopstate_t nostopstate{}; -class _LIBCPP_AVAILABILITY_SYNC stop_source { +class stop_source { public: _LIBCPP_HIDE_FROM_ABI stop_source() : __state_(new __stop_state()) { __state_->__increment_stop_source_counter(); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_state.h b/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_state.h index cc1f1d830e..74fafbdc63 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_state.h +++ b/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_state.h @@ -100,7 +100,7 @@ public: return ((__curent_state & __stop_requested_bit) != 0) || ((__curent_state >> __stop_source_counter_shift) != 0); } - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI bool __request_stop() noexcept { + _LIBCPP_HIDE_FROM_ABI bool __request_stop() noexcept { auto __cb_list_lock = __try_lock_for_request_stop(); if (!__cb_list_lock.__owns_lock()) { return false; @@ -137,7 +137,7 @@ public: return true; } - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI bool __add_callback(__stop_callback_base* __cb) noexcept { + _LIBCPP_HIDE_FROM_ABI bool __add_callback(__stop_callback_base* __cb) noexcept { // If it is already stop_requested. Do not try to request it again. const auto __give_up_trying_to_lock_condition = [__cb](__state_t __state) { if ((__state & __stop_requested_bit) != 0) { @@ -164,7 +164,7 @@ public: } // called by the destructor of stop_callback - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void __remove_callback(__stop_callback_base* __cb) noexcept { + _LIBCPP_HIDE_FROM_ABI void __remove_callback(__stop_callback_base* __cb) noexcept { __callback_list_lock __cb_list_lock(__state_); // under below condition, the request_stop call just popped __cb from the list and could execute it now @@ -192,7 +192,7 @@ public: } private: - _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI __callback_list_lock __try_lock_for_request_stop() noexcept { + _LIBCPP_HIDE_FROM_ABI __callback_list_lock __try_lock_for_request_stop() noexcept { // If it is already stop_requested, do not try to request stop or lock the list again. const auto __lock_fail_condition = [](__state_t __state) { return (__state & __stop_requested_bit) != 0; }; diff --git a/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_token.h b/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_token.h index 178b1728c3..4a6ca27ac4 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_token.h +++ b/naiveproxy/src/third_party/libc++/src/include/__stop_token/stop_token.h @@ -22,7 +22,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 20 && _LIBCPP_HAS_THREADS -class _LIBCPP_AVAILABILITY_SYNC stop_token { +class stop_token { public: _LIBCPP_HIDE_FROM_ABI stop_token() noexcept = default; diff --git a/naiveproxy/src/third_party/libc++/src/include/__string/char_traits.h b/naiveproxy/src/third_party/libc++/src/include/__string/char_traits.h index 86c92477cb..8292750919 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__string/char_traits.h +++ b/naiveproxy/src/third_party/libc++/src/include/__string/char_traits.h @@ -369,6 +369,13 @@ _LIBCPP_HIDE_FROM_ABI inline _LIBCPP_CONSTEXPR_SINCE_CXX14 const _CharT* __searc if (__len1 < __len2) return __last1; + if (__builtin_constant_p(__len2 == 1) && __len2 == 1) { + auto __res = _Traits::find(__first1, __len1, *__first2); + if (__res == nullptr) + return __last1; + return __res; + } + // First element of __first2 is loop invariant. _CharT __f2 = *__first2; while (true) { diff --git a/naiveproxy/src/third_party/libc++/src/include/__string/constexpr_c_functions.h b/naiveproxy/src/third_party/libc++/src/include/__string/constexpr_c_functions.h index 119669e16b..160d2af109 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__string/constexpr_c_functions.h +++ b/naiveproxy/src/third_party/libc++/src/include/__string/constexpr_c_functions.h @@ -22,7 +22,6 @@ #include <__type_traits/is_equality_comparable.h> #include <__type_traits/is_integral.h> #include <__type_traits/is_same.h> -#include <__type_traits/is_trivially_copyable.h> #include <__type_traits/is_trivially_lexicographically_comparable.h> #include <__type_traits/remove_cv.h> #include <__utility/element_count.h> @@ -225,6 +224,8 @@ __constexpr_memmove(_Tp* __dest, _Up* __src, __element_count __n) { std::__assign_trivially_copyable(__dest[__i], __src[__i]); } } + } else if _LIBCPP_CONSTEXPR (sizeof(_Tp) == __datasizeof_v<_Tp>) { + ::__builtin_memmove(__dest, __src, __count * sizeof(_Tp)); } else if (__count > 0) { ::__builtin_memmove(__dest, __src, (__count - 1) * sizeof(_Tp) + __datasizeof_v<_Tp>); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__system_error/error_category.h b/naiveproxy/src/third_party/libc++/src/include/__system_error/error_category.h index 7233e22110..191f4d83a9 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__system_error/error_category.h +++ b/naiveproxy/src/third_party/libc++/src/include/__system_error/error_category.h @@ -20,7 +20,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD -class _LIBCPP_EXPORTED_FROM_ABI error_condition; +class error_condition; class _LIBCPP_EXPORTED_FROM_ABI error_code; class _LIBCPP_HIDDEN __do_message; diff --git a/naiveproxy/src/third_party/libc++/src/include/__thread/id.h b/naiveproxy/src/third_party/libc++/src/include/__thread/id.h index c9c86c80c8..14a51fc9ee 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__thread/id.h +++ b/naiveproxy/src/third_party/libc++/src/include/__thread/id.h @@ -23,7 +23,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_HAS_THREADS -class _LIBCPP_EXPORTED_FROM_ABI __thread_id; +class __thread_id; namespace this_thread { diff --git a/naiveproxy/src/third_party/libc++/src/include/__thread/jthread.h b/naiveproxy/src/third_party/libc++/src/include/__thread/jthread.h index 7289b835d3..481ffe296c 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__thread/jthread.h +++ b/naiveproxy/src/third_party/libc++/src/include/__thread/jthread.h @@ -36,7 +36,7 @@ _LIBCPP_PUSH_MACROS _LIBCPP_BEGIN_NAMESPACE_STD -class _LIBCPP_AVAILABILITY_SYNC jthread { +class jthread { public: // types using id = thread::id; diff --git a/naiveproxy/src/third_party/libc++/src/include/__thread/poll_with_backoff.h b/naiveproxy/src/third_party/libc++/src/include/__thread/poll_with_backoff.h index 4f961fe3f7..b42b1285c1 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__thread/poll_with_backoff.h +++ b/naiveproxy/src/third_party/libc++/src/include/__thread/poll_with_backoff.h @@ -34,7 +34,7 @@ static _LIBCPP_CONSTEXPR const int __libcpp_polling_count = 64; // - __max_elapsed is the maximum duration to try polling for. If the maximum duration is exceeded, // the polling loop will return false to report a timeout. template -_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI bool __libcpp_thread_poll_with_backoff( +_LIBCPP_HIDE_FROM_ABI bool __libcpp_thread_poll_with_backoff( _Poll&& __poll, _Backoff&& __backoff, chrono::nanoseconds __max_elapsed = chrono::nanoseconds::zero()) { auto const __start = chrono::high_resolution_clock::now(); for (int __count = 0;;) { diff --git a/naiveproxy/src/third_party/libc++/src/include/__tree b/naiveproxy/src/third_party/libc++/src/include/__tree index f8bb4f01b1..0738c8c6a5 100644 --- a/naiveproxy/src/third_party/libc++/src/include/__tree +++ b/naiveproxy/src/third_party/libc++/src/include/__tree @@ -13,35 +13,35 @@ #include <__algorithm/min.h> #include <__assert> #include <__config> -#include <__fwd/map.h> #include <__fwd/pair.h> -#include <__fwd/set.h> #include <__iterator/distance.h> #include <__iterator/iterator_traits.h> #include <__iterator/next.h> #include <__memory/addressof.h> #include <__memory/allocator_traits.h> #include <__memory/compressed_pair.h> +#include <__memory/construct_at.h> #include <__memory/pointer_traits.h> #include <__memory/swap_allocator.h> #include <__memory/unique_ptr.h> -#include <__type_traits/can_extract_key.h> +#include <__new/launder.h> #include <__type_traits/copy_cvref.h> #include <__type_traits/enable_if.h> #include <__type_traits/invoke.h> -#include <__type_traits/is_const.h> #include <__type_traits/is_constructible.h> #include <__type_traits/is_nothrow_assignable.h> #include <__type_traits/is_nothrow_constructible.h> #include <__type_traits/is_same.h> +#include <__type_traits/is_specialization.h> #include <__type_traits/is_swappable.h> +#include <__type_traits/make_transparent.h> #include <__type_traits/remove_const.h> -#include <__type_traits/remove_const_ref.h> -#include <__type_traits/remove_cvref.h> #include <__utility/forward.h> +#include <__utility/lazy_synth_three_way_comparator.h> #include <__utility/move.h> #include <__utility/pair.h> #include <__utility/swap.h> +#include <__utility/try_key_extraction.h> #include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -51,14 +51,31 @@ _LIBCPP_PUSH_MACROS #include <__undef_macros> -_LIBCPP_BEGIN_NAMESPACE_STD +_LIBCPP_DIAGNOSTIC_PUSH +// GCC complains about the backslashes at the end, see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121528 +_LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wcomment") +// __tree is a red-black-tree implementation used for the associative containers (i.e. (multi)map/set). It stores +// - (1) a pointer to the node with the smallest (i.e. leftmost) element, namely __begin_node_ +// - (2) the number of nodes in the tree, namely __size_ +// - (3) a pointer to the root of the tree, namely __end_node_ +// +// Storing (1) and (2) is required to allow for constant time lookups. A tree looks like this in memory: +// +// __end_node_ +// | +// root +// / \ +// l1 r1 +// / \ / \ +// ... ... ... ... +// +// All nodes except __end_node_ have a __left_ and __right_ pointer as well as a __parent_ pointer. +// __end_node_ only contains a __left_ pointer, which points to the root of the tree. +// This layout allows for iteration through the tree without a need for special handling of the end node. See +// __tree_next_iter and __tree_prev_iter for more details. +_LIBCPP_DIAGNOSTIC_POP -template -class __tree; -template -class __tree_iterator; -template -class __tree_const_iterator; +_LIBCPP_BEGIN_NAMESPACE_STD template class __tree_end_node; @@ -70,13 +87,6 @@ class __tree_node; template struct __value_type; -template -class __map_node_destructor; -template -class __map_iterator; -template -class __map_const_iterator; - /* _NodePtr algorithms @@ -185,6 +195,11 @@ _LIBCPP_HIDE_FROM_ABI _NodePtr __tree_next(_NodePtr __x) _NOEXCEPT { return __x->__parent_unsafe(); } +// __tree_next_iter and __tree_prev_iter implement iteration through the tree. The order is as follows: +// left sub-tree -> node -> right sub-tree. When the right-most node of a sub-tree is reached, we walk up the tree until +// we find a node where we were in the left sub-tree. We are _always_ in a left sub-tree, since the __end_node_ points +// to the actual root of the tree through a __left_ pointer. Incrementing the end() pointer is UB, so we can assume that +// never happens. template inline _LIBCPP_HIDE_FROM_ABI _EndNodePtr __tree_next_iter(_NodePtr __x) _NOEXCEPT { _LIBCPP_ASSERT_INTERNAL(__x != nullptr, "node shouldn't be null"); @@ -494,16 +509,7 @@ _LIBCPP_HIDE_FROM_ABI void __tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEP // node traits template -struct __is_tree_value_type_imp : false_type {}; - -template -struct __is_tree_value_type_imp<__value_type<_Key, _Value> > : true_type {}; - -template -struct __is_tree_value_type : false_type {}; - -template -struct __is_tree_value_type<_One> : __is_tree_value_type_imp<__remove_cvref_t<_One> > {}; +inline const bool __is_tree_value_type_v = __is_specialization_v<_Tp, __value_type>; template struct __get_tree_key_type { @@ -549,15 +555,14 @@ private: template class __tree_end_node { public: - typedef _Pointer pointer; + using pointer = _Pointer; pointer __left_; _LIBCPP_HIDE_FROM_ABI __tree_end_node() _NOEXCEPT : __left_() {} }; template -class _LIBCPP_STANDALONE_DEBUG -__tree_node_base : public __tree_end_node<__rebind_pointer_t<_VoidPtr, __tree_node_base<_VoidPtr> > > { +class __tree_node_base : public __tree_end_node<__rebind_pointer_t<_VoidPtr, __tree_node_base<_VoidPtr> > > { public: using pointer = __rebind_pointer_t<_VoidPtr, __tree_node_base>; using __end_node_pointer _LIBCPP_NODEBUG = __rebind_pointer_t<_VoidPtr, __tree_end_node >; @@ -570,20 +575,41 @@ public: _LIBCPP_HIDE_FROM_ABI void __set_parent(pointer __p) { __parent_ = static_cast<__end_node_pointer>(__p); } - ~__tree_node_base() = delete; + _LIBCPP_HIDE_FROM_ABI __tree_node_base() = default; __tree_node_base(__tree_node_base const&) = delete; __tree_node_base& operator=(__tree_node_base const&) = delete; }; template -class _LIBCPP_STANDALONE_DEBUG __tree_node : public __tree_node_base<_VoidPtr> { +class __tree_node : public __tree_node_base<_VoidPtr> { public: using __node_value_type _LIBCPP_NODEBUG = __get_node_value_type_t<_Tp>; - __node_value_type __value_; +// We use a union to avoid initialization during member initialization, which allows us +// to use the allocator from the container to construct the `__node_value_type` in the +// memory provided by the union member +#ifndef _LIBCPP_CXX03_LANG +private: + union { + __node_value_type __value_; + }; + +public: _LIBCPP_HIDE_FROM_ABI __node_value_type& __get_value() { return __value_; } +#else +private: + _ALIGNAS_TYPE(__node_value_type) unsigned char __buffer_[sizeof(__node_value_type)]; + +public: + _LIBCPP_HIDE_FROM_ABI __node_value_type& __get_value() { return *reinterpret_cast<__node_value_type*>(__buffer_); } +#endif + + template + _LIBCPP_HIDE_FROM_ABI explicit __tree_node(_Alloc& __na, _Args&&... __args) { + allocator_traits<_Alloc>::construct(__na, std::addressof(__get_value()), std::forward<_Args>(__args)...); + } ~__tree_node() = delete; __tree_node(__tree_node const&) = delete; __tree_node& operator=(__tree_node const&) = delete; @@ -591,11 +617,11 @@ public: template class __tree_node_destructor { - typedef _Allocator allocator_type; - typedef allocator_traits __alloc_traits; + using allocator_type = _Allocator; + using __alloc_traits _LIBCPP_NODEBUG = allocator_traits; public: - typedef typename __alloc_traits::pointer pointer; + using pointer = typename __alloc_traits::pointer; private: allocator_type& __na_; @@ -612,7 +638,7 @@ public: _LIBCPP_HIDE_FROM_ABI void operator()(pointer __p) _NOEXCEPT { if (__value_constructed) - __alloc_traits::destroy(__na_, std::addressof(__p->__value_)); + __alloc_traits::destroy(__na_, std::addressof(__p->__get_value())); if (__p) __alloc_traits::deallocate(__na_, __p, 1); } @@ -632,10 +658,11 @@ struct __generic_container_node_destructor<__tree_node<_Tp, _VoidPtr>, _Alloc> : template class __tree_iterator { - typedef __tree_node_types<_NodePtr> _NodeTypes; - typedef _NodePtr __node_pointer; - typedef typename _NodeTypes::__node_base_pointer __node_base_pointer; - typedef typename _NodeTypes::__end_node_pointer __end_node_pointer; + using _NodeTypes _LIBCPP_NODEBUG = __tree_node_types<_NodePtr>; + // NOLINTNEXTLINE(libcpp-nodebug-on-aliases) lldb relies on this alias for pretty printing + using __node_pointer = _NodePtr; + using __node_base_pointer _LIBCPP_NODEBUG = typename _NodeTypes::__node_base_pointer; + using __end_node_pointer _LIBCPP_NODEBUG = typename _NodeTypes::__end_node_pointer; __end_node_pointer __ptr_; @@ -648,8 +675,10 @@ public: _LIBCPP_HIDE_FROM_ABI __tree_iterator() _NOEXCEPT : __ptr_(nullptr) {} - _LIBCPP_HIDE_FROM_ABI reference operator*() const { return __get_np()->__value_; } - _LIBCPP_HIDE_FROM_ABI pointer operator->() const { return pointer_traits::pointer_to(__get_np()->__value_); } + _LIBCPP_HIDE_FROM_ABI reference operator*() const { return __get_np()->__get_value(); } + _LIBCPP_HIDE_FROM_ABI pointer operator->() const { + return pointer_traits::pointer_to(__get_np()->__get_value()); + } _LIBCPP_HIDE_FROM_ABI __tree_iterator& operator++() { __ptr_ = std::__tree_next_iter<__end_node_pointer>(static_cast<__node_base_pointer>(__ptr_)); @@ -686,45 +715,34 @@ private: friend class __tree; template friend class __tree_const_iterator; - template - friend class __map_iterator; - template - friend class map; - template - friend class multimap; - template - friend class set; - template - friend class multiset; }; template class __tree_const_iterator { - typedef __tree_node_types<_NodePtr> _NodeTypes; + using _NodeTypes _LIBCPP_NODEBUG = __tree_node_types<_NodePtr>; // NOLINTNEXTLINE(libcpp-nodebug-on-aliases) lldb relies on this alias for pretty printing - using __node_pointer = _NodePtr; - typedef typename _NodeTypes::__node_base_pointer __node_base_pointer; - typedef typename _NodeTypes::__end_node_pointer __end_node_pointer; + using __node_pointer = _NodePtr; + using __node_base_pointer _LIBCPP_NODEBUG = typename _NodeTypes::__node_base_pointer; + using __end_node_pointer _LIBCPP_NODEBUG = typename _NodeTypes::__end_node_pointer; __end_node_pointer __ptr_; public: - using iterator_category = bidirectional_iterator_tag; - using value_type = __get_node_value_type_t<_Tp>; - using difference_type = _DiffType; - using reference = const value_type&; - using pointer = __rebind_pointer_t<_NodePtr, const value_type>; + using iterator_category = bidirectional_iterator_tag; + using value_type = __get_node_value_type_t<_Tp>; + using difference_type = _DiffType; + using reference = const value_type&; + using pointer = __rebind_pointer_t<_NodePtr, const value_type>; + using __non_const_iterator _LIBCPP_NODEBUG = __tree_iterator<_Tp, __node_pointer, difference_type>; _LIBCPP_HIDE_FROM_ABI __tree_const_iterator() _NOEXCEPT : __ptr_(nullptr) {} -private: - typedef __tree_iterator<_Tp, __node_pointer, difference_type> __non_const_iterator; - -public: _LIBCPP_HIDE_FROM_ABI __tree_const_iterator(__non_const_iterator __p) _NOEXCEPT : __ptr_(__p.__ptr_) {} - _LIBCPP_HIDE_FROM_ABI reference operator*() const { return __get_np()->__value_; } - _LIBCPP_HIDE_FROM_ABI pointer operator->() const { return pointer_traits::pointer_to(__get_np()->__value_); } + _LIBCPP_HIDE_FROM_ABI reference operator*() const { return __get_np()->__get_value(); } + _LIBCPP_HIDE_FROM_ABI pointer operator->() const { + return pointer_traits::pointer_to(__get_np()->__get_value()); + } _LIBCPP_HIDE_FROM_ABI __tree_const_iterator& operator++() { __ptr_ = std::__tree_next_iter<__end_node_pointer>(static_cast<__node_base_pointer>(__ptr_)); @@ -762,16 +780,6 @@ private: template friend class __tree; - template - friend class map; - template - friend class multimap; - template - friend class set; - template - friend class multiset; - template - friend class __map_const_iterator; }; template @@ -784,21 +792,20 @@ int __diagnose_non_const_comparator(); template class __tree { public: - using value_type = __get_node_value_type_t<_Tp>; - typedef _Compare value_compare; - typedef _Allocator allocator_type; + using value_type = __get_node_value_type_t<_Tp>; + using value_compare = _Compare; + using allocator_type = _Allocator; private: - typedef allocator_traits __alloc_traits; - using key_type = __get_tree_key_type_t<_Tp>; + using __alloc_traits _LIBCPP_NODEBUG = allocator_traits; + using key_type = __get_tree_key_type_t<_Tp>; public: - typedef typename __alloc_traits::pointer pointer; - typedef typename __alloc_traits::const_pointer const_pointer; - typedef typename __alloc_traits::size_type size_type; - typedef typename __alloc_traits::difference_type difference_type; + using pointer = typename __alloc_traits::pointer; + using const_pointer = typename __alloc_traits::const_pointer; + using size_type = typename __alloc_traits::size_type; + using difference_type = typename __alloc_traits::difference_type; -public: using __void_pointer _LIBCPP_NODEBUG = typename __alloc_traits::void_pointer; using __node _LIBCPP_NODEBUG = __tree_node<_Tp, __void_pointer>; @@ -813,8 +820,8 @@ public: using __parent_pointer _LIBCPP_NODEBUG = __end_node_pointer; // TODO: Remove this once the uses in are removed - typedef __rebind_alloc<__alloc_traits, __node> __node_allocator; - typedef allocator_traits<__node_allocator> __node_traits; + using __node_allocator _LIBCPP_NODEBUG = __rebind_alloc<__alloc_traits, __node>; + using __node_traits _LIBCPP_NODEBUG = allocator_traits<__node_allocator>; // TODO(LLVM 22): Remove this check #ifndef _LIBCPP_ABI_TREE_REMOVE_NODE_POINTER_UB @@ -834,8 +841,8 @@ private: // the pointer using 'pointer_traits'. static_assert(is_same<__node_pointer, typename __node_traits::pointer>::value, "Allocator does not rebind pointers in a sane manner."); - typedef __rebind_alloc<__node_traits, __node_base> __node_base_allocator; - typedef allocator_traits<__node_base_allocator> __node_base_traits; + using __node_base_allocator _LIBCPP_NODEBUG = __rebind_alloc<__node_traits, __node_base>; + using __node_base_traits _LIBCPP_NODEBUG = allocator_traits<__node_base_allocator>; static_assert(is_same<__node_base_pointer, typename __node_base_traits::pointer>::value, "Allocator does not rebind pointers in a sane manner."); @@ -872,13 +879,25 @@ public: return std::addressof(__end_node()->__left_); } - typedef __tree_iterator<_Tp, __node_pointer, difference_type> iterator; - typedef __tree_const_iterator<_Tp, __node_pointer, difference_type> const_iterator; + using iterator = __tree_iterator<_Tp, __node_pointer, difference_type>; + using const_iterator = __tree_const_iterator<_Tp, __node_pointer, difference_type>; _LIBCPP_HIDE_FROM_ABI explicit __tree(const value_compare& __comp) _NOEXCEPT_( - is_nothrow_default_constructible<__node_allocator>::value&& is_nothrow_copy_constructible::value); - _LIBCPP_HIDE_FROM_ABI explicit __tree(const allocator_type& __a); - _LIBCPP_HIDE_FROM_ABI __tree(const value_compare& __comp, const allocator_type& __a); + is_nothrow_default_constructible<__node_allocator>::value&& is_nothrow_copy_constructible::value) + : __size_(0), __value_comp_(__comp) { + __begin_node_ = __end_node(); + } + + _LIBCPP_HIDE_FROM_ABI explicit __tree(const allocator_type& __a) + : __begin_node_(), __node_alloc_(__node_allocator(__a)), __size_(0) { + __begin_node_ = __end_node(); + } + + _LIBCPP_HIDE_FROM_ABI __tree(const value_compare& __comp, const allocator_type& __a) + : __begin_node_(), __node_alloc_(__node_allocator(__a)), __size_(0), __value_comp_(__comp) { + __begin_node_ = __end_node(); + } + _LIBCPP_HIDE_FROM_ABI __tree(const __tree& __t); _LIBCPP_HIDE_FROM_ABI __tree& operator=(const __tree& __t); template @@ -888,13 +907,20 @@ public: _LIBCPP_HIDE_FROM_ABI __tree(__tree&& __t) _NOEXCEPT_( is_nothrow_move_constructible<__node_allocator>::value&& is_nothrow_move_constructible::value); _LIBCPP_HIDE_FROM_ABI __tree(__tree&& __t, const allocator_type& __a); + _LIBCPP_HIDE_FROM_ABI __tree& operator=(__tree&& __t) _NOEXCEPT_(is_nothrow_move_assignable::value && ((__node_traits::propagate_on_container_move_assignment::value && is_nothrow_move_assignable<__node_allocator>::value) || - allocator_traits<__node_allocator>::is_always_equal::value)); + allocator_traits<__node_allocator>::is_always_equal::value)) { + __move_assign(__t, integral_constant()); + return *this; + } - _LIBCPP_HIDE_FROM_ABI ~__tree(); + _LIBCPP_HIDE_FROM_ABI ~__tree() { + static_assert(is_copy_constructible::value, "Comparator must be copy-constructible."); + destroy(__root()); + } _LIBCPP_HIDE_FROM_ABI iterator begin() _NOEXCEPT { return iterator(__begin_node_); } _LIBCPP_HIDE_FROM_ABI const_iterator begin() const _NOEXCEPT { return const_iterator(__begin_node_); } @@ -915,116 +941,177 @@ public: _NOEXCEPT_(__is_nothrow_swappable_v); #endif - template - _LIBCPP_HIDE_FROM_ABI pair __emplace_unique_key_args(_Key const&, _Args&&... __args); - template - _LIBCPP_HIDE_FROM_ABI pair __emplace_hint_unique_key_args(const_iterator, _Key const&, _Args&&...); - - template - _LIBCPP_HIDE_FROM_ABI pair __emplace_unique_impl(_Args&&... __args); - - template - _LIBCPP_HIDE_FROM_ABI iterator __emplace_hint_unique_impl(const_iterator __p, _Args&&... __args); - template _LIBCPP_HIDE_FROM_ABI iterator __emplace_multi(_Args&&... __args); template _LIBCPP_HIDE_FROM_ABI iterator __emplace_hint_multi(const_iterator __p, _Args&&... __args); - template - _LIBCPP_HIDE_FROM_ABI pair __emplace_unique(_Pp&& __x) { - return __emplace_unique_extract_key(std::forward<_Pp>(__x), __can_extract_key<_Pp, key_type>()); - } - - template ::value, int> = 0> - _LIBCPP_HIDE_FROM_ABI pair __emplace_unique(_First&& __f, _Second&& __s) { - return __emplace_unique_key_args(__f, std::forward<_First>(__f), std::forward<_Second>(__s)); - } - template _LIBCPP_HIDE_FROM_ABI pair __emplace_unique(_Args&&... __args) { - return __emplace_unique_impl(std::forward<_Args>(__args)...); - } - - template - _LIBCPP_HIDE_FROM_ABI pair __emplace_unique_extract_key(_Pp&& __x, __extract_key_fail_tag) { - return __emplace_unique_impl(std::forward<_Pp>(__x)); - } - - template - _LIBCPP_HIDE_FROM_ABI pair __emplace_unique_extract_key(_Pp&& __x, __extract_key_self_tag) { - return __emplace_unique_key_args(__x, std::forward<_Pp>(__x)); - } - - template - _LIBCPP_HIDE_FROM_ABI pair __emplace_unique_extract_key(_Pp&& __x, __extract_key_first_tag) { - return __emplace_unique_key_args(__x.first, std::forward<_Pp>(__x)); - } - - template - _LIBCPP_HIDE_FROM_ABI iterator __emplace_hint_unique(const_iterator __p, _Pp&& __x) { - return __emplace_hint_unique_extract_key(__p, std::forward<_Pp>(__x), __can_extract_key<_Pp, key_type>()); - } - - template ::value, int> = 0> - _LIBCPP_HIDE_FROM_ABI iterator __emplace_hint_unique(const_iterator __p, _First&& __f, _Second&& __s) { - return __emplace_hint_unique_key_args(__p, __f, std::forward<_First>(__f), std::forward<_Second>(__s)).first; + return std::__try_key_extraction( + [this](const key_type& __key, _Args&&... __args2) { + auto [__parent, __child] = __find_equal(__key); + __node_pointer __r = static_cast<__node_pointer>(__child); + bool __inserted = false; + if (__child == nullptr) { + __node_holder __h = __construct_node(std::forward<_Args>(__args2)...); + __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); + __r = __h.release(); + __inserted = true; + } + return pair(iterator(__r), __inserted); + }, + [this](_Args&&... __args2) { + __node_holder __h = __construct_node(std::forward<_Args>(__args2)...); + auto [__parent, __child] = __find_equal(__h->__get_value()); + __node_pointer __r = static_cast<__node_pointer>(__child); + bool __inserted = false; + if (__child == nullptr) { + __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); + __r = __h.release(); + __inserted = true; + } + return pair(iterator(__r), __inserted); + }, + std::forward<_Args>(__args)...); } template - _LIBCPP_HIDE_FROM_ABI iterator __emplace_hint_unique(const_iterator __p, _Args&&... __args) { - return __emplace_hint_unique_impl(__p, std::forward<_Args>(__args)...); + _LIBCPP_HIDE_FROM_ABI pair __emplace_hint_unique(const_iterator __p, _Args&&... __args) { + return std::__try_key_extraction( + [this, __p](const key_type& __key, _Args&&... __args2) { + __node_base_pointer __dummy; + auto [__parent, __child] = __find_equal(__p, __dummy, __key); + __node_pointer __r = static_cast<__node_pointer>(__child); + bool __inserted = false; + if (__child == nullptr) { + __node_holder __h = __construct_node(std::forward<_Args>(__args2)...); + __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); + __r = __h.release(); + __inserted = true; + } + return pair(iterator(__r), __inserted); + }, + [this, __p](_Args&&... __args2) { + __node_holder __h = __construct_node(std::forward<_Args>(__args2)...); + __node_base_pointer __dummy; + auto [__parent, __child] = __find_equal(__p, __dummy, __h->__get_value()); + __node_pointer __r = static_cast<__node_pointer>(__child); + if (__child == nullptr) { + __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); + __r = __h.release(); + } + return pair(iterator(__r), __child == nullptr); + }, + std::forward<_Args>(__args)...); } - template - _LIBCPP_HIDE_FROM_ABI iterator - __emplace_hint_unique_extract_key(const_iterator __p, _Pp&& __x, __extract_key_fail_tag) { - return __emplace_hint_unique_impl(__p, std::forward<_Pp>(__x)); - } - - template - _LIBCPP_HIDE_FROM_ABI iterator - __emplace_hint_unique_extract_key(const_iterator __p, _Pp&& __x, __extract_key_self_tag) { - return __emplace_hint_unique_key_args(__p, __x, std::forward<_Pp>(__x)).first; - } - - template - _LIBCPP_HIDE_FROM_ABI iterator - __emplace_hint_unique_extract_key(const_iterator __p, _Pp&& __x, __extract_key_first_tag) { - return __emplace_hint_unique_key_args(__p, __x.first, std::forward<_Pp>(__x)).first; - } - - template ::value, int> = 0> + template , int> = 0> _LIBCPP_HIDE_FROM_ABI void __insert_unique_from_orphaned_node(const_iterator __p, __get_node_value_type_t<_Tp>&& __value) { __emplace_hint_unique(__p, const_cast(__value.first), std::move(__value.second)); } - template ::value, int> = 0> + template , int> = 0> _LIBCPP_HIDE_FROM_ABI void __insert_unique_from_orphaned_node(const_iterator __p, _Tp&& __value) { __emplace_hint_unique(__p, std::move(__value)); } - template ::value, int> = 0> + template , int> = 0> _LIBCPP_HIDE_FROM_ABI void __insert_multi_from_orphaned_node(const_iterator __p, value_type&& __value) { __emplace_hint_multi(__p, const_cast(__value.first), std::move(__value.second)); } - template ::value, int> = 0> + template , int> = 0> _LIBCPP_HIDE_FROM_ABI void __insert_multi_from_orphaned_node(const_iterator __p, _Tp&& __value) { __emplace_hint_multi(__p, std::move(__value)); } + template + _LIBCPP_HIDE_FROM_ABI void __insert_range_multi(_InIter __first, _Sent __last) { + if (__first == __last) + return; + + if (__root() == nullptr) { // Make sure we always have a root node + __insert_node_at( + __end_node(), __end_node()->__left_, static_cast<__node_base_pointer>(__construct_node(*__first).release())); + ++__first; + } + + auto __max_node = static_cast<__node_pointer>(std::__tree_max(static_cast<__node_base_pointer>(__root()))); + + for (; __first != __last; ++__first) { + __node_holder __nd = __construct_node(*__first); + // Always check the max node first. This optimizes for sorted ranges inserted at the end. + if (!value_comp()(__nd->__get_value(), __max_node->__get_value())) { // __node >= __max_val + __insert_node_at(static_cast<__end_node_pointer>(__max_node), + __max_node->__right_, + static_cast<__node_base_pointer>(__nd.get())); + __max_node = __nd.release(); + } else { + __end_node_pointer __parent; + __node_base_pointer& __child = __find_leaf_high(__parent, __nd->__get_value()); + __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd.release())); + } + } + } + _LIBCPP_HIDE_FROM_ABI pair __node_assign_unique(const value_type& __v, __node_pointer __dest); _LIBCPP_HIDE_FROM_ABI iterator __node_insert_multi(__node_pointer __nd); _LIBCPP_HIDE_FROM_ABI iterator __node_insert_multi(const_iterator __p, __node_pointer __nd); + template + _LIBCPP_HIDE_FROM_ABI void __insert_range_unique(_InIter __first, _Sent __last) { + if (__first == __last) + return; + + if (__root() == nullptr) { + __insert_node_at( + __end_node(), __end_node()->__left_, static_cast<__node_base_pointer>(__construct_node(*__first).release())); + ++__first; + } + + auto __max_node = static_cast<__node_pointer>(std::__tree_max(static_cast<__node_base_pointer>(__root()))); + + using __reference = decltype(*__first); + + for (; __first != __last; ++__first) { + std::__try_key_extraction( + [this, &__max_node](const key_type& __key, __reference&& __val) { + if (value_comp()(__max_node->__get_value(), __key)) { // __key > __max_node + __node_holder __nd = __construct_node(std::forward<__reference>(__val)); + __insert_node_at(static_cast<__end_node_pointer>(__max_node), + __max_node->__right_, + static_cast<__node_base_pointer>(__nd.get())); + __max_node = __nd.release(); + } else { + auto [__parent, __child] = __find_equal(__key); + if (__child == nullptr) { + __node_holder __nd = __construct_node(std::forward<__reference>(__val)); + __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd.release())); + } + } + }, + [this, &__max_node](__reference&& __val) { + __node_holder __nd = __construct_node(std::forward<__reference>(__val)); + if (value_comp()(__max_node->__get_value(), __nd->__get_value())) { // __node > __max_node + __insert_node_at(static_cast<__end_node_pointer>(__max_node), + __max_node->__right_, + static_cast<__node_base_pointer>(__nd.get())); + __max_node = __nd.release(); + } else { + auto [__parent, __child] = __find_equal(__nd->__get_value()); + if (__child == nullptr) { + __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd.release())); + } + } + }, + *__first); + } + } + _LIBCPP_HIDE_FROM_ABI iterator __remove_node_pointer(__node_pointer) _NOEXCEPT; #if _LIBCPP_STD_VER >= 17 @@ -1032,15 +1119,15 @@ public: _LIBCPP_HIDE_FROM_ABI _InsertReturnType __node_handle_insert_unique(_NodeHandle&&); template _LIBCPP_HIDE_FROM_ABI iterator __node_handle_insert_unique(const_iterator, _NodeHandle&&); - template - _LIBCPP_HIDE_FROM_ABI void __node_handle_merge_unique(_Tree& __source); + template + _LIBCPP_HIDE_FROM_ABI void __node_handle_merge_unique(__tree<_Tp, _Comp2, _Allocator>& __source); template _LIBCPP_HIDE_FROM_ABI iterator __node_handle_insert_multi(_NodeHandle&&); template _LIBCPP_HIDE_FROM_ABI iterator __node_handle_insert_multi(const_iterator, _NodeHandle&&); - template - _LIBCPP_HIDE_FROM_ABI void __node_handle_merge_multi(_Tree& __source); + template + _LIBCPP_HIDE_FROM_ABI void __node_handle_merge_multi(__tree<_Tp, _Comp2, _Allocator>& __source); template _LIBCPP_HIDE_FROM_ABI _NodeHandle __node_handle_extract(key_type const&); @@ -1059,41 +1146,107 @@ public: __insert_node_at(__end_node_pointer __parent, __node_base_pointer& __child, __node_base_pointer __new_node) _NOEXCEPT; template - _LIBCPP_HIDE_FROM_ABI iterator find(const _Key& __v); + _LIBCPP_HIDE_FROM_ABI iterator find(const _Key& __key) { + auto [__, __match] = __find_equal(__key); + if (__match == nullptr) + return end(); + return iterator(static_cast<__node_pointer>(__match)); + } + template - _LIBCPP_HIDE_FROM_ABI const_iterator find(const _Key& __v) const; + _LIBCPP_HIDE_FROM_ABI const_iterator find(const _Key& __key) const { + auto [__, __match] = __find_equal(__key); + if (__match == nullptr) + return end(); + return const_iterator(static_cast<__node_pointer>(__match)); + } template _LIBCPP_HIDE_FROM_ABI size_type __count_unique(const _Key& __k) const; template _LIBCPP_HIDE_FROM_ABI size_type __count_multi(const _Key& __k) const; - template - _LIBCPP_HIDE_FROM_ABI iterator lower_bound(const _Key& __v) { - return __lower_bound(__v, __root(), __end_node()); + template + _LIBCPP_HIDE_FROM_ABI __end_node_pointer __lower_upper_bound_unique_impl(const _Key& __v) const { + auto __rt = __root(); + auto __result = __end_node(); + auto __comp = __lazy_synth_three_way_comparator<_Compare, _Key, value_type>(value_comp()); + while (__rt != nullptr) { + auto __comp_res = __comp(__v, __rt->__get_value()); + + if (__comp_res.__less()) { + __result = static_cast<__end_node_pointer>(__rt); + __rt = static_cast<__node_pointer>(__rt->__left_); + } else if (__comp_res.__greater()) { + __rt = static_cast<__node_pointer>(__rt->__right_); + } else if _LIBCPP_CONSTEXPR (_LowerBound) { + return static_cast<__end_node_pointer>(__rt); + } else { + return __rt->__right_ ? static_cast<__end_node_pointer>(std::__tree_min(__rt->__right_)) : __result; + } + } + return __result; } + template - _LIBCPP_HIDE_FROM_ABI iterator __lower_bound(const _Key& __v, __node_pointer __root, __end_node_pointer __result); - template - _LIBCPP_HIDE_FROM_ABI const_iterator lower_bound(const _Key& __v) const { - return __lower_bound(__v, __root(), __end_node()); + _LIBCPP_HIDE_FROM_ABI iterator __lower_bound_unique(const _Key& __v) { + return iterator(__lower_upper_bound_unique_impl(__v)); } + + template + _LIBCPP_HIDE_FROM_ABI const_iterator __lower_bound_unique(const _Key& __v) const { + return const_iterator(__lower_upper_bound_unique_impl(__v)); + } + + template + _LIBCPP_HIDE_FROM_ABI iterator __upper_bound_unique(const _Key& __v) { + return iterator(__lower_upper_bound_unique_impl(__v)); + } + + template + _LIBCPP_HIDE_FROM_ABI const_iterator __upper_bound_unique(const _Key& __v) const { + return iterator(__lower_upper_bound_unique_impl(__v)); + } + +private: + template + _LIBCPP_HIDE_FROM_ABI iterator + __lower_bound_multi(const _Key& __v, __node_pointer __root, __end_node_pointer __result); + template _LIBCPP_HIDE_FROM_ABI const_iterator - __lower_bound(const _Key& __v, __node_pointer __root, __end_node_pointer __result) const; + __lower_bound_multi(const _Key& __v, __node_pointer __root, __end_node_pointer __result) const; + +public: template - _LIBCPP_HIDE_FROM_ABI iterator upper_bound(const _Key& __v) { - return __upper_bound(__v, __root(), __end_node()); + _LIBCPP_HIDE_FROM_ABI iterator __lower_bound_multi(const _Key& __v) { + return __lower_bound_multi(__v, __root(), __end_node()); } template - _LIBCPP_HIDE_FROM_ABI iterator __upper_bound(const _Key& __v, __node_pointer __root, __end_node_pointer __result); - template - _LIBCPP_HIDE_FROM_ABI const_iterator upper_bound(const _Key& __v) const { - return __upper_bound(__v, __root(), __end_node()); + _LIBCPP_HIDE_FROM_ABI const_iterator __lower_bound_multi(const _Key& __v) const { + return __lower_bound_multi(__v, __root(), __end_node()); } + + template + _LIBCPP_HIDE_FROM_ABI iterator __upper_bound_multi(const _Key& __v) { + return __upper_bound_multi(__v, __root(), __end_node()); + } + + template + _LIBCPP_HIDE_FROM_ABI const_iterator __upper_bound_multi(const _Key& __v) const { + return __upper_bound_multi(__v, __root(), __end_node()); + } + +private: + template + _LIBCPP_HIDE_FROM_ABI iterator + __upper_bound_multi(const _Key& __v, __node_pointer __root, __end_node_pointer __result); + template _LIBCPP_HIDE_FROM_ABI const_iterator - __upper_bound(const _Key& __v, __node_pointer __root, __end_node_pointer __result) const; + __upper_bound_multi(const _Key& __v, __node_pointer __root, __end_node_pointer __result) const; + +public: template _LIBCPP_HIDE_FROM_ABI pair __equal_range_unique(const _Key& __k); template @@ -1104,22 +1257,24 @@ public: template _LIBCPP_HIDE_FROM_ABI pair __equal_range_multi(const _Key& __k) const; - typedef __tree_node_destructor<__node_allocator> _Dp; - typedef unique_ptr<__node, _Dp> __node_holder; + using _Dp _LIBCPP_NODEBUG = __tree_node_destructor<__node_allocator>; + using __node_holder _LIBCPP_NODEBUG = unique_ptr<__node, _Dp>; _LIBCPP_HIDE_FROM_ABI __node_holder remove(const_iterator __p) _NOEXCEPT; // FIXME: Make this function const qualified. Unfortunately doing so // breaks existing code which uses non-const callable comparators. template - _LIBCPP_HIDE_FROM_ABI __node_base_pointer& __find_equal(__end_node_pointer& __parent, const _Key& __v); + _LIBCPP_HIDE_FROM_ABI pair<__end_node_pointer, __node_base_pointer&> __find_equal(const _Key& __v); + template - _LIBCPP_HIDE_FROM_ABI __node_base_pointer& __find_equal(__end_node_pointer& __parent, const _Key& __v) const { - return const_cast<__tree*>(this)->__find_equal(__parent, __v); + _LIBCPP_HIDE_FROM_ABI pair<__end_node_pointer, __node_base_pointer&> __find_equal(const _Key& __v) const { + return const_cast<__tree*>(this)->__find_equal(__v); } + template - _LIBCPP_HIDE_FROM_ABI __node_base_pointer& - __find_equal(const_iterator __hint, __end_node_pointer& __parent, __node_base_pointer& __dummy, const _Key& __v); + _LIBCPP_HIDE_FROM_ABI pair<__end_node_pointer, __node_base_pointer&> + __find_equal(const_iterator __hint, __node_base_pointer& __dummy, const _Key& __v); _LIBCPP_HIDE_FROM_ABI void __copy_assign_alloc(const __tree& __t) { __copy_assign_alloc(__t, integral_constant()); @@ -1144,7 +1299,7 @@ private: _LIBCPP_HIDE_FROM_ABI __node_holder __construct_node(_Args&&... __args); // TODO: Make this _LIBCPP_HIDE_FROM_ABI - _LIBCPP_HIDDEN void destroy(__node_pointer __nd) _NOEXCEPT; + _LIBCPP_HIDDEN void destroy(__node_pointer __nd) _NOEXCEPT { (__tree_deleter(__node_alloc_))(__nd); } _LIBCPP_HIDE_FROM_ABI void __move_assign(__tree& __t, false_type); _LIBCPP_HIDE_FROM_ABI void __move_assign(__tree& __t, true_type) _NOEXCEPT_( @@ -1162,7 +1317,7 @@ private: } _LIBCPP_HIDE_FROM_ABI void __move_assign_alloc(__tree&, false_type) _NOEXCEPT {} - template ::value, int> = 0> + template , int> = 0> _LIBCPP_HIDE_FROM_ABI static void __assign_value(__get_node_value_type_t& __lhs, _From&& __rhs) { using __key_type = __remove_const_t; @@ -1172,7 +1327,7 @@ private: __lhs.second = std::forward<_From>(__rhs).second; } - template ::value, int> = 0> + template , int> = 0> _LIBCPP_HIDE_FROM_ABI static void __assign_value(_To& __lhs, _From&& __rhs) { __lhs = std::forward<_From>(__rhs); } @@ -1213,27 +1368,106 @@ private: __node_pointer __cache_root_; __node_pointer __cache_elem_; }; + + class __tree_deleter { + __node_allocator& __alloc_; + + public: + using pointer = __node_pointer; + + _LIBCPP_HIDE_FROM_ABI __tree_deleter(__node_allocator& __alloc) : __alloc_(__alloc) {} + +#ifdef _LIBCPP_COMPILER_CLANG_BASED // FIXME: GCC complains about not being able to always_inline a recursive function + _LIBCPP_HIDE_FROM_ABI +#endif + void + operator()(__node_pointer __ptr) { + if (!__ptr) + return; + + (*this)(static_cast<__node_pointer>(__ptr->__left_)); + + auto __right = __ptr->__right_; + + __node_traits::destroy(__alloc_, std::addressof(__ptr->__get_value())); + __node_traits::deallocate(__alloc_, __ptr, 1); + + (*this)(static_cast<__node_pointer>(__right)); + } + }; + + // This copy construction will always produce a correct red-black-tree assuming the incoming tree is correct, since we + // copy the exact structure 1:1. Since this is for copy construction _only_ we know that we get a correct tree. If we + // didn't get a correct tree, the invariants of __tree are broken and we have a much bigger problem than an improperly + // balanced tree. +#ifdef _LIBCPP_COMPILER_CLANG_BASED // FIXME: GCC complains about not being able to always_inline a recursive function + _LIBCPP_HIDE_FROM_ABI +#endif + __node_pointer + __copy_construct_tree(__node_pointer __src) { + if (!__src) + return nullptr; + + __node_holder __new_node = __construct_node(__src->__get_value()); + + unique_ptr<__node, __tree_deleter> __left( + __copy_construct_tree(static_cast<__node_pointer>(__src->__left_)), __node_alloc_); + __node_pointer __right = __copy_construct_tree(static_cast<__node_pointer>(__src->__right_)); + + __node_pointer __new_node_ptr = __new_node.release(); + + __new_node_ptr->__is_black_ = __src->__is_black_; + __new_node_ptr->__left_ = static_cast<__node_base_pointer>(__left.release()); + __new_node_ptr->__right_ = static_cast<__node_base_pointer>(__right); + if (__new_node_ptr->__left_) + __new_node_ptr->__left_->__parent_ = static_cast<__end_node_pointer>(__new_node_ptr); + if (__new_node_ptr->__right_) + __new_node_ptr->__right_->__parent_ = static_cast<__end_node_pointer>(__new_node_ptr); + return __new_node_ptr; + } + + // This copy assignment will always produce a correct red-black-tree assuming the incoming tree is correct, since our + // own tree is a red-black-tree and the incoming tree is a red-black-tree. The invariants of a red-black-tree are + // temporarily not met until all of the incoming red-black tree is copied. +#ifdef _LIBCPP_COMPILER_CLANG_BASED // FIXME: GCC complains about not being able to always_inline a recursive function + _LIBCPP_HIDE_FROM_ABI +#endif + __node_pointer + __copy_assign_tree(__node_pointer __dest, __node_pointer __src) { + if (!__src) { + destroy(__dest); + return nullptr; + } + + __assign_value(__dest->__get_value(), __src->__get_value()); + __dest->__is_black_ = __src->__is_black_; + + // If we already have a left node in the destination tree, reuse it and copy-assign recursively + if (__dest->__left_) { + __dest->__left_ = static_cast<__node_base_pointer>(__copy_assign_tree( + static_cast<__node_pointer>(__dest->__left_), static_cast<__node_pointer>(__src->__left_))); + + // Otherwise, we must create new nodes; copy-construct from here on + } else if (__src->__left_) { + auto __new_left = __copy_construct_tree(static_cast<__node_pointer>(__src->__left_)); + __dest->__left_ = static_cast<__node_base_pointer>(__new_left); + __new_left->__parent_ = static_cast<__end_node_pointer>(__dest); + } + + // Identical to the left case above, just for the right nodes + if (__dest->__right_) { + __dest->__right_ = static_cast<__node_base_pointer>(__copy_assign_tree( + static_cast<__node_pointer>(__dest->__right_), static_cast<__node_pointer>(__src->__right_))); + } else if (__src->__right_) { + auto __new_right = __copy_construct_tree(static_cast<__node_pointer>(__src->__right_)); + __dest->__right_ = static_cast<__node_base_pointer>(__new_right); + __new_right->__parent_ = static_cast<__end_node_pointer>(__dest); + } + + return __dest; + } }; -template -__tree<_Tp, _Compare, _Allocator>::__tree(const value_compare& __comp) _NOEXCEPT_( - is_nothrow_default_constructible<__node_allocator>::value&& is_nothrow_copy_constructible::value) - : __size_(0), __value_comp_(__comp) { - __begin_node_ = __end_node(); -} - -template -__tree<_Tp, _Compare, _Allocator>::__tree(const allocator_type& __a) - : __begin_node_(), __node_alloc_(__node_allocator(__a)), __size_(0) { - __begin_node_ = __end_node(); -} - -template -__tree<_Tp, _Compare, _Allocator>::__tree(const value_compare& __comp, const allocator_type& __a) - : __begin_node_(), __node_alloc_(__node_allocator(__a)), __size_(0), __value_comp_(__comp) { - __begin_node_ = __end_node(); -} - // Precondition: __size_ != 0 template typename __tree<_Tp, _Compare, _Allocator>::__node_pointer @@ -1277,19 +1511,31 @@ __tree<_Tp, _Compare, _Allocator>::_DetachedTreeCache::__detach_next(__node_poin template __tree<_Tp, _Compare, _Allocator>& __tree<_Tp, _Compare, _Allocator>::operator=(const __tree& __t) { - if (this != std::addressof(__t)) { - value_comp() = __t.value_comp(); - __copy_assign_alloc(__t); - __assign_multi(__t.begin(), __t.end()); + if (this == std::addressof(__t)) + return *this; + + value_comp() = __t.value_comp(); + __copy_assign_alloc(__t); + + if (__size_ != 0) { + *__root_ptr() = static_cast<__node_base_pointer>(__copy_assign_tree(__root(), __t.__root())); + } else { + *__root_ptr() = static_cast<__node_base_pointer>(__copy_construct_tree(__t.__root())); + if (__root()) + __root()->__parent_ = __end_node(); } + __begin_node_ = + __end_node()->__left_ ? static_cast<__end_node_pointer>(std::__tree_min(__end_node()->__left_)) : __end_node(); + __size_ = __t.size(); + return *this; } template template void __tree<_Tp, _Compare, _Allocator>::__assign_unique(_ForwardIterator __first, _ForwardIterator __last) { - typedef iterator_traits<_ForwardIterator> _ITraits; - typedef typename _ITraits::value_type _ItValueType; + using _ITraits = iterator_traits<_ForwardIterator>; + using _ItValueType = typename _ITraits::value_type; static_assert( is_same<_ItValueType, value_type>::value, "__assign_unique may only be called with the containers value type"); static_assert( @@ -1308,14 +1554,14 @@ void __tree<_Tp, _Compare, _Allocator>::__assign_unique(_ForwardIterator __first template template void __tree<_Tp, _Compare, _Allocator>::__assign_multi(_InputIterator __first, _InputIterator __last) { - typedef iterator_traits<_InputIterator> _ITraits; - typedef typename _ITraits::value_type _ItValueType; + using _ITraits = iterator_traits<_InputIterator>; + using _ItValueType = typename _ITraits::value_type; static_assert( is_same<_ItValueType, value_type>::value, "__assign_multi may only be called with the containers value_type"); if (__size_ != 0) { _DetachedTreeCache __cache(this); for (; __cache.__get() && __first != __last; ++__first) { - __assign_value(__cache.__get()->__value_, *__first); + __assign_value(__cache.__get()->__get_value(), *__first); __node_insert_multi(__cache.__get()); __cache.__advance(); } @@ -1327,11 +1573,17 @@ void __tree<_Tp, _Compare, _Allocator>::__assign_multi(_InputIterator __first, _ template __tree<_Tp, _Compare, _Allocator>::__tree(const __tree& __t) - : __begin_node_(), + : __begin_node_(__end_node()), __node_alloc_(__node_traits::select_on_container_copy_construction(__t.__node_alloc())), __size_(0), __value_comp_(__t.value_comp()) { - __begin_node_ = __end_node(); + if (__t.size() == 0) + return; + + *__root_ptr() = static_cast<__node_base_pointer>(__copy_construct_tree(__t.__root())); + __root()->__parent_ = __end_node(); + __begin_node_ = static_cast<__end_node_pointer>(std::__tree_min(__end_node()->__left_)); + __size_ = __t.size(); } template @@ -1401,44 +1653,17 @@ void __tree<_Tp, _Compare, _Allocator>::__move_assign(__tree& __t, false_type) { if (__size_ != 0) { _DetachedTreeCache __cache(this); while (__cache.__get() != nullptr && __t.__size_ != 0) { - __assign_value(__cache.__get()->__value_, std::move(__t.remove(__t.begin())->__value_)); + __assign_value(__cache.__get()->__get_value(), std::move(__t.remove(__t.begin())->__get_value())); __node_insert_multi(__cache.__get()); __cache.__advance(); } } while (__t.__size_ != 0) { - __insert_multi_from_orphaned_node(__e, std::move(__t.remove(__t.begin())->__value_)); + __insert_multi_from_orphaned_node(__e, std::move(__t.remove(__t.begin())->__get_value())); } } } -template -__tree<_Tp, _Compare, _Allocator>& __tree<_Tp, _Compare, _Allocator>::operator=(__tree&& __t) - _NOEXCEPT_(is_nothrow_move_assignable::value && - ((__node_traits::propagate_on_container_move_assignment::value && - is_nothrow_move_assignable<__node_allocator>::value) || - allocator_traits<__node_allocator>::is_always_equal::value)) { - __move_assign(__t, integral_constant()); - return *this; -} - -template -__tree<_Tp, _Compare, _Allocator>::~__tree() { - static_assert(is_copy_constructible::value, "Comparator must be copy-constructible."); - destroy(__root()); -} - -template -void __tree<_Tp, _Compare, _Allocator>::destroy(__node_pointer __nd) _NOEXCEPT { - if (__nd != nullptr) { - destroy(static_cast<__node_pointer>(__nd->__left_)); - destroy(static_cast<__node_pointer>(__nd->__right_)); - __node_allocator& __na = __node_alloc(); - __node_traits::destroy(__na, std::addressof(__nd->__value_)); - __node_traits::deallocate(__na, __nd, 1); - } -} - template void __tree<_Tp, _Compare, _Allocator>::swap(__tree& __t) #if _LIBCPP_STD_VER <= 11 @@ -1481,7 +1706,7 @@ __tree<_Tp, _Compare, _Allocator>::__find_leaf_low(__end_node_pointer& __parent, __node_pointer __nd = __root(); if (__nd != nullptr) { while (true) { - if (value_comp()(__nd->__value_, __v)) { + if (value_comp()(__nd->__get_value(), __v)) { if (__nd->__right_ != nullptr) __nd = static_cast<__node_pointer>(__nd->__right_); else { @@ -1511,7 +1736,7 @@ __tree<_Tp, _Compare, _Allocator>::__find_leaf_high(__end_node_pointer& __parent __node_pointer __nd = __root(); if (__nd != nullptr) { while (true) { - if (value_comp()(__v, __nd->__value_)) { + if (value_comp()(__v, __nd->__get_value())) { if (__nd->__left_ != nullptr) __nd = static_cast<__node_pointer>(__nd->__left_); else { @@ -1562,92 +1787,90 @@ typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer& __tree<_Tp, _Co return __find_leaf_low(__parent, __v); } -// Find place to insert if __v doesn't exist -// Set __parent to parent of null leaf -// Return reference to null leaf -// If __v exists, set parent to node of __v and return reference to node of __v +// Find __v +// If __v exists, return the parent of the node of __v and a reference to the pointer to the node of __v. +// If __v doesn't exist, return the parent of the null leaf and a reference to the pointer to the null leaf. template template -typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer& -__tree<_Tp, _Compare, _Allocator>::__find_equal(__end_node_pointer& __parent, const _Key& __v) { - __node_pointer __nd = __root(); - __node_base_pointer* __nd_ptr = __root_ptr(); - if (__nd != nullptr) { - while (true) { - if (value_comp()(__v, __nd->__value_)) { - if (__nd->__left_ != nullptr) { - __nd_ptr = std::addressof(__nd->__left_); - __nd = static_cast<__node_pointer>(__nd->__left_); - } else { - __parent = static_cast<__end_node_pointer>(__nd); - return __parent->__left_; - } - } else if (value_comp()(__nd->__value_, __v)) { - if (__nd->__right_ != nullptr) { - __nd_ptr = std::addressof(__nd->__right_); - __nd = static_cast<__node_pointer>(__nd->__right_); - } else { - __parent = static_cast<__end_node_pointer>(__nd); - return __nd->__right_; - } - } else { - __parent = static_cast<__end_node_pointer>(__nd); - return *__nd_ptr; - } +_LIBCPP_HIDE_FROM_ABI pair::__end_node_pointer, + typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&> +__tree<_Tp, _Compare, _Allocator>::__find_equal(const _Key& __v) { + using _Pair = pair<__end_node_pointer, __node_base_pointer&>; + + __node_pointer __nd = __root(); + + if (__nd == nullptr) { + auto __end = __end_node(); + return _Pair(__end, __end->__left_); + } + + __node_base_pointer* __node_ptr = __root_ptr(); + auto&& __transparent = std::__as_transparent(value_comp()); + auto __comp = __lazy_synth_three_way_comparator<__make_transparent_t<_Compare>, _Key, value_type>(__transparent); + + while (true) { + auto __comp_res = __comp(__v, __nd->__get_value()); + + if (__comp_res.__less()) { + if (__nd->__left_ == nullptr) + return _Pair(static_cast<__end_node_pointer>(__nd), __nd->__left_); + + __node_ptr = std::addressof(__nd->__left_); + __nd = static_cast<__node_pointer>(__nd->__left_); + } else if (__comp_res.__greater()) { + if (__nd->__right_ == nullptr) + return _Pair(static_cast<__end_node_pointer>(__nd), __nd->__right_); + + __node_ptr = std::addressof(__nd->__right_); + __nd = static_cast<__node_pointer>(__nd->__right_); + } else { + return _Pair(static_cast<__end_node_pointer>(__nd), *__node_ptr); } } - __parent = __end_node(); - return __parent->__left_; } -// Find place to insert if __v doesn't exist +// Find __v // First check prior to __hint. // Next check after __hint. // Next do O(log N) search. -// Set __parent to parent of null leaf -// Return reference to null leaf -// If __v exists, set parent to node of __v and return reference to node of __v +// If __v exists, return the parent of the node of __v and a reference to the pointer to the node of __v. +// If __v doesn't exist, return the parent of the null leaf and a reference to the pointer to the null leaf. template template -typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer& __tree<_Tp, _Compare, _Allocator>::__find_equal( - const_iterator __hint, __end_node_pointer& __parent, __node_base_pointer& __dummy, const _Key& __v) { - if (__hint == end() || value_comp()(__v, *__hint)) // check before - { +_LIBCPP_HIDE_FROM_ABI pair::__end_node_pointer, + typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&> +__tree<_Tp, _Compare, _Allocator>::__find_equal(const_iterator __hint, __node_base_pointer& __dummy, const _Key& __v) { + using _Pair = pair<__end_node_pointer, __node_base_pointer&>; + + if (__hint == end() || value_comp()(__v, *__hint)) { // check before // __v < *__hint const_iterator __prior = __hint; if (__prior == begin() || value_comp()(*--__prior, __v)) { // *prev(__hint) < __v < *__hint - if (__hint.__ptr_->__left_ == nullptr) { - __parent = __hint.__ptr_; - return __parent->__left_; - } else { - __parent = __prior.__ptr_; - return static_cast<__node_base_pointer>(__prior.__ptr_)->__right_; - } + if (__hint.__ptr_->__left_ == nullptr) + return _Pair(__hint.__ptr_, __hint.__ptr_->__left_); + return _Pair(__prior.__ptr_, static_cast<__node_pointer>(__prior.__ptr_)->__right_); } // __v <= *prev(__hint) - return __find_equal(__parent, __v); - } else if (value_comp()(*__hint, __v)) // check after - { + return __find_equal(__v); + } + + if (value_comp()(*__hint, __v)) { // check after // *__hint < __v const_iterator __next = std::next(__hint); if (__next == end() || value_comp()(__v, *__next)) { // *__hint < __v < *std::next(__hint) - if (__hint.__get_np()->__right_ == nullptr) { - __parent = __hint.__ptr_; - return static_cast<__node_base_pointer>(__hint.__ptr_)->__right_; - } else { - __parent = __next.__ptr_; - return __parent->__left_; - } + if (__hint.__get_np()->__right_ == nullptr) + return _Pair(__hint.__ptr_, static_cast<__node_pointer>(__hint.__ptr_)->__right_); + return _Pair(__next.__ptr_, __next.__ptr_->__left_); } // *next(__hint) <= __v - return __find_equal(__parent, __v); + return __find_equal(__v); } + // else __v == *__hint - __parent = __hint.__ptr_; - __dummy = static_cast<__node_base_pointer>(__hint.__ptr_); - return __dummy; + __dummy = static_cast<__node_base_pointer>(__hint.__ptr_); + return _Pair(__hint.__ptr_, __dummy); } template @@ -1664,93 +1887,24 @@ void __tree<_Tp, _Compare, _Allocator>::__insert_node_at( ++__size_; } -template -template -pair::iterator, bool> -__tree<_Tp, _Compare, _Allocator>::__emplace_unique_key_args(_Key const& __k, _Args&&... __args) { - __end_node_pointer __parent; - __node_base_pointer& __child = __find_equal(__parent, __k); - __node_pointer __r = static_cast<__node_pointer>(__child); - bool __inserted = false; - if (__child == nullptr) { - __node_holder __h = __construct_node(std::forward<_Args>(__args)...); - __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); - __r = __h.release(); - __inserted = true; - } - return pair(iterator(__r), __inserted); -} - -template -template -pair::iterator, bool> -__tree<_Tp, _Compare, _Allocator>::__emplace_hint_unique_key_args( - const_iterator __p, _Key const& __k, _Args&&... __args) { - __end_node_pointer __parent; - __node_base_pointer __dummy; - __node_base_pointer& __child = __find_equal(__p, __parent, __dummy, __k); - __node_pointer __r = static_cast<__node_pointer>(__child); - bool __inserted = false; - if (__child == nullptr) { - __node_holder __h = __construct_node(std::forward<_Args>(__args)...); - __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); - __r = __h.release(); - __inserted = true; - } - return pair(iterator(__r), __inserted); -} - template template typename __tree<_Tp, _Compare, _Allocator>::__node_holder __tree<_Tp, _Compare, _Allocator>::__construct_node(_Args&&... __args) { __node_allocator& __na = __node_alloc(); __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); - __node_traits::construct(__na, std::addressof(__h->__value_), std::forward<_Args>(__args)...); + std::__construct_at(std::addressof(*__h), __na, std::forward<_Args>(__args)...); __h.get_deleter().__value_constructed = true; return __h; } -template -template -pair::iterator, bool> -__tree<_Tp, _Compare, _Allocator>::__emplace_unique_impl(_Args&&... __args) { - __node_holder __h = __construct_node(std::forward<_Args>(__args)...); - __end_node_pointer __parent; - __node_base_pointer& __child = __find_equal(__parent, __h->__value_); - __node_pointer __r = static_cast<__node_pointer>(__child); - bool __inserted = false; - if (__child == nullptr) { - __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); - __r = __h.release(); - __inserted = true; - } - return pair(iterator(__r), __inserted); -} - -template -template -typename __tree<_Tp, _Compare, _Allocator>::iterator -__tree<_Tp, _Compare, _Allocator>::__emplace_hint_unique_impl(const_iterator __p, _Args&&... __args) { - __node_holder __h = __construct_node(std::forward<_Args>(__args)...); - __end_node_pointer __parent; - __node_base_pointer __dummy; - __node_base_pointer& __child = __find_equal(__p, __parent, __dummy, __h->__value_); - __node_pointer __r = static_cast<__node_pointer>(__child); - if (__child == nullptr) { - __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); - __r = __h.release(); - } - return iterator(__r); -} - template template typename __tree<_Tp, _Compare, _Allocator>::iterator __tree<_Tp, _Compare, _Allocator>::__emplace_multi(_Args&&... __args) { __node_holder __h = __construct_node(std::forward<_Args>(__args)...); __end_node_pointer __parent; - __node_base_pointer& __child = __find_leaf_high(__parent, __h->__value_); + __node_base_pointer& __child = __find_leaf_high(__parent, __h->__get_value()); __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); return iterator(static_cast<__node_pointer>(__h.release())); } @@ -1761,7 +1915,7 @@ typename __tree<_Tp, _Compare, _Allocator>::iterator __tree<_Tp, _Compare, _Allocator>::__emplace_hint_multi(const_iterator __p, _Args&&... __args) { __node_holder __h = __construct_node(std::forward<_Args>(__args)...); __end_node_pointer __parent; - __node_base_pointer& __child = __find_leaf(__p, __parent, __h->__value_); + __node_base_pointer& __child = __find_leaf(__p, __parent, __h->__get_value()); __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); return iterator(static_cast<__node_pointer>(__h.release())); } @@ -1769,12 +1923,11 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_hint_multi(const_iterator __p, _Arg template pair::iterator, bool> __tree<_Tp, _Compare, _Allocator>::__node_assign_unique(const value_type& __v, __node_pointer __nd) { - __end_node_pointer __parent; - __node_base_pointer& __child = __find_equal(__parent, __v); - __node_pointer __r = static_cast<__node_pointer>(__child); - bool __inserted = false; + auto [__parent, __child] = __find_equal(__v); + __node_pointer __r = static_cast<__node_pointer>(__child); + bool __inserted = false; if (__child == nullptr) { - __assign_value(__nd->__value_, __v); + __assign_value(__nd->__get_value(), __v); __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd)); __r = __nd; __inserted = true; @@ -1786,7 +1939,7 @@ template typename __tree<_Tp, _Compare, _Allocator>::iterator __tree<_Tp, _Compare, _Allocator>::__node_insert_multi(__node_pointer __nd) { __end_node_pointer __parent; - __node_base_pointer& __child = __find_leaf_high(__parent, __nd->__value_); + __node_base_pointer& __child = __find_leaf_high(__parent, __nd->__get_value()); __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd)); return iterator(__nd); } @@ -1795,7 +1948,7 @@ template typename __tree<_Tp, _Compare, _Allocator>::iterator __tree<_Tp, _Compare, _Allocator>::__node_insert_multi(const_iterator __p, __node_pointer __nd) { __end_node_pointer __parent; - __node_base_pointer& __child = __find_leaf(__p, __parent, __nd->__value_); + __node_base_pointer& __child = __find_leaf(__p, __parent, __nd->__get_value()); __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd)); return iterator(__nd); } @@ -1821,8 +1974,7 @@ __tree<_Tp, _Compare, _Allocator>::__node_handle_insert_unique(_NodeHandle&& __n return _InsertReturnType{end(), false, _NodeHandle()}; __node_pointer __ptr = __nh.__ptr_; - __end_node_pointer __parent; - __node_base_pointer& __child = __find_equal(__parent, __ptr->__value_); + auto [__parent, __child] = __find_equal(__ptr->__get_value()); if (__child != nullptr) return _InsertReturnType{iterator(static_cast<__node_pointer>(__child)), false, std::move(__nh)}; @@ -1839,10 +1991,9 @@ __tree<_Tp, _Compare, _Allocator>::__node_handle_insert_unique(const_iterator __ return end(); __node_pointer __ptr = __nh.__ptr_; - __end_node_pointer __parent; __node_base_pointer __dummy; - __node_base_pointer& __child = __find_equal(__hint, __parent, __dummy, __ptr->__value_); - __node_pointer __r = static_cast<__node_pointer>(__child); + auto [__parent, __child] = __find_equal(__hint, __dummy, __ptr->__get_value()); + __node_pointer __r = static_cast<__node_pointer>(__child); if (__child == nullptr) { __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__ptr)); __r = __ptr; @@ -1869,14 +2020,12 @@ _LIBCPP_HIDE_FROM_ABI _NodeHandle __tree<_Tp, _Compare, _Allocator>::__node_hand } template -template -_LIBCPP_HIDE_FROM_ABI void __tree<_Tp, _Compare, _Allocator>::__node_handle_merge_unique(_Tree& __source) { - static_assert(is_same::value, ""); - - for (typename _Tree::iterator __i = __source.begin(); __i != __source.end();) { +template +_LIBCPP_HIDE_FROM_ABI void +__tree<_Tp, _Compare, _Allocator>::__node_handle_merge_unique(__tree<_Tp, _Comp2, _Allocator>& __source) { + for (iterator __i = __source.begin(); __i != __source.end();) { __node_pointer __src_ptr = __i.__get_np(); - __end_node_pointer __parent; - __node_base_pointer& __child = __find_equal(__parent, __src_ptr->__value_); + auto [__parent, __child] = __find_equal(__src_ptr->__get_value()); ++__i; if (__child != nullptr) continue; @@ -1893,7 +2042,7 @@ __tree<_Tp, _Compare, _Allocator>::__node_handle_insert_multi(_NodeHandle&& __nh return end(); __node_pointer __ptr = __nh.__ptr_; __end_node_pointer __parent; - __node_base_pointer& __child = __find_leaf_high(__parent, __ptr->__value_); + __node_base_pointer& __child = __find_leaf_high(__parent, __ptr->__get_value()); __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__ptr)); __nh.__release_ptr(); return iterator(__ptr); @@ -1908,21 +2057,20 @@ __tree<_Tp, _Compare, _Allocator>::__node_handle_insert_multi(const_iterator __h __node_pointer __ptr = __nh.__ptr_; __end_node_pointer __parent; - __node_base_pointer& __child = __find_leaf(__hint, __parent, __ptr->__value_); + __node_base_pointer& __child = __find_leaf(__hint, __parent, __ptr->__get_value()); __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__ptr)); __nh.__release_ptr(); return iterator(__ptr); } template -template -_LIBCPP_HIDE_FROM_ABI void __tree<_Tp, _Compare, _Allocator>::__node_handle_merge_multi(_Tree& __source) { - static_assert(is_same::value, ""); - - for (typename _Tree::iterator __i = __source.begin(); __i != __source.end();) { +template +_LIBCPP_HIDE_FROM_ABI void +__tree<_Tp, _Compare, _Allocator>::__node_handle_merge_multi(__tree<_Tp, _Comp2, _Allocator>& __source) { + for (iterator __i = __source.begin(); __i != __source.end();) { __node_pointer __src_ptr = __i.__get_np(); __end_node_pointer __parent; - __node_base_pointer& __child = __find_leaf_high(__parent, __src_ptr->__value_); + __node_base_pointer& __child = __find_leaf_high(__parent, __src_ptr->__get_value()); ++__i; __source.__remove_node_pointer(__src_ptr); __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__src_ptr)); @@ -1971,34 +2119,17 @@ __tree<_Tp, _Compare, _Allocator>::__erase_multi(const _Key& __k) { return __r; } -template -template -typename __tree<_Tp, _Compare, _Allocator>::iterator __tree<_Tp, _Compare, _Allocator>::find(const _Key& __v) { - iterator __p = __lower_bound(__v, __root(), __end_node()); - if (__p != end() && !value_comp()(__v, *__p)) - return __p; - return end(); -} - -template -template -typename __tree<_Tp, _Compare, _Allocator>::const_iterator -__tree<_Tp, _Compare, _Allocator>::find(const _Key& __v) const { - const_iterator __p = __lower_bound(__v, __root(), __end_node()); - if (__p != end() && !value_comp()(__v, *__p)) - return __p; - return end(); -} - template template typename __tree<_Tp, _Compare, _Allocator>::size_type __tree<_Tp, _Compare, _Allocator>::__count_unique(const _Key& __k) const { __node_pointer __rt = __root(); + auto __comp = __lazy_synth_three_way_comparator(value_comp()); while (__rt != nullptr) { - if (value_comp()(__k, __rt->__value_)) { + auto __comp_res = __comp(__k, __rt->__get_value()); + if (__comp_res.__less()) { __rt = static_cast<__node_pointer>(__rt->__left_); - } else if (value_comp()(__rt->__value_, __k)) + } else if (__comp_res.__greater()) __rt = static_cast<__node_pointer>(__rt->__right_); else return 1; @@ -2012,26 +2143,28 @@ typename __tree<_Tp, _Compare, _Allocator>::size_type __tree<_Tp, _Compare, _Allocator>::__count_multi(const _Key& __k) const { __end_node_pointer __result = __end_node(); __node_pointer __rt = __root(); + auto __comp = __lazy_synth_three_way_comparator(value_comp()); while (__rt != nullptr) { - if (value_comp()(__k, __rt->__value_)) { + auto __comp_res = __comp(__k, __rt->__get_value()); + if (__comp_res.__less()) { __result = static_cast<__end_node_pointer>(__rt); __rt = static_cast<__node_pointer>(__rt->__left_); - } else if (value_comp()(__rt->__value_, __k)) + } else if (__comp_res.__greater()) __rt = static_cast<__node_pointer>(__rt->__right_); else return std::distance( - __lower_bound(__k, static_cast<__node_pointer>(__rt->__left_), static_cast<__end_node_pointer>(__rt)), - __upper_bound(__k, static_cast<__node_pointer>(__rt->__right_), __result)); + __lower_bound_multi(__k, static_cast<__node_pointer>(__rt->__left_), static_cast<__end_node_pointer>(__rt)), + __upper_bound_multi(__k, static_cast<__node_pointer>(__rt->__right_), __result)); } return 0; } template template -typename __tree<_Tp, _Compare, _Allocator>::iterator -__tree<_Tp, _Compare, _Allocator>::__lower_bound(const _Key& __v, __node_pointer __root, __end_node_pointer __result) { +typename __tree<_Tp, _Compare, _Allocator>::iterator __tree<_Tp, _Compare, _Allocator>::__lower_bound_multi( + const _Key& __v, __node_pointer __root, __end_node_pointer __result) { while (__root != nullptr) { - if (!value_comp()(__root->__value_, __v)) { + if (!value_comp()(__root->__get_value(), __v)) { __result = static_cast<__end_node_pointer>(__root); __root = static_cast<__node_pointer>(__root->__left_); } else @@ -2042,10 +2175,10 @@ __tree<_Tp, _Compare, _Allocator>::__lower_bound(const _Key& __v, __node_pointer template template -typename __tree<_Tp, _Compare, _Allocator>::const_iterator __tree<_Tp, _Compare, _Allocator>::__lower_bound( +typename __tree<_Tp, _Compare, _Allocator>::const_iterator __tree<_Tp, _Compare, _Allocator>::__lower_bound_multi( const _Key& __v, __node_pointer __root, __end_node_pointer __result) const { while (__root != nullptr) { - if (!value_comp()(__root->__value_, __v)) { + if (!value_comp()(__root->__get_value(), __v)) { __result = static_cast<__end_node_pointer>(__root); __root = static_cast<__node_pointer>(__root->__left_); } else @@ -2056,10 +2189,10 @@ typename __tree<_Tp, _Compare, _Allocator>::const_iterator __tree<_Tp, _Compare, template template -typename __tree<_Tp, _Compare, _Allocator>::iterator -__tree<_Tp, _Compare, _Allocator>::__upper_bound(const _Key& __v, __node_pointer __root, __end_node_pointer __result) { +typename __tree<_Tp, _Compare, _Allocator>::iterator __tree<_Tp, _Compare, _Allocator>::__upper_bound_multi( + const _Key& __v, __node_pointer __root, __end_node_pointer __result) { while (__root != nullptr) { - if (value_comp()(__v, __root->__value_)) { + if (value_comp()(__v, __root->__get_value())) { __result = static_cast<__end_node_pointer>(__root); __root = static_cast<__node_pointer>(__root->__left_); } else @@ -2070,10 +2203,10 @@ __tree<_Tp, _Compare, _Allocator>::__upper_bound(const _Key& __v, __node_pointer template template -typename __tree<_Tp, _Compare, _Allocator>::const_iterator __tree<_Tp, _Compare, _Allocator>::__upper_bound( +typename __tree<_Tp, _Compare, _Allocator>::const_iterator __tree<_Tp, _Compare, _Allocator>::__upper_bound_multi( const _Key& __v, __node_pointer __root, __end_node_pointer __result) const { while (__root != nullptr) { - if (value_comp()(__v, __root->__value_)) { + if (value_comp()(__v, __root->__get_value())) { __result = static_cast<__end_node_pointer>(__root); __root = static_cast<__node_pointer>(__root->__left_); } else @@ -2086,14 +2219,16 @@ template template pair::iterator, typename __tree<_Tp, _Compare, _Allocator>::iterator> __tree<_Tp, _Compare, _Allocator>::__equal_range_unique(const _Key& __k) { - typedef pair _Pp; + using _Pp = pair; __end_node_pointer __result = __end_node(); __node_pointer __rt = __root(); + auto __comp = __lazy_synth_three_way_comparator(value_comp()); while (__rt != nullptr) { - if (value_comp()(__k, __rt->__value_)) { + auto __comp_res = __comp(__k, __rt->__get_value()); + if (__comp_res.__less()) { __result = static_cast<__end_node_pointer>(__rt); __rt = static_cast<__node_pointer>(__rt->__left_); - } else if (value_comp()(__rt->__value_, __k)) + } else if (__comp_res.__greater()) __rt = static_cast<__node_pointer>(__rt->__right_); else return _Pp(iterator(__rt), @@ -2108,14 +2243,16 @@ template pair::const_iterator, typename __tree<_Tp, _Compare, _Allocator>::const_iterator> __tree<_Tp, _Compare, _Allocator>::__equal_range_unique(const _Key& __k) const { - typedef pair _Pp; + using _Pp = pair; __end_node_pointer __result = __end_node(); __node_pointer __rt = __root(); + auto __comp = __lazy_synth_three_way_comparator(value_comp()); while (__rt != nullptr) { - if (value_comp()(__k, __rt->__value_)) { + auto __comp_res = __comp(__k, __rt->__get_value()); + if (__comp_res.__less()) { __result = static_cast<__end_node_pointer>(__rt); __rt = static_cast<__node_pointer>(__rt->__left_); - } else if (value_comp()(__rt->__value_, __k)) + } else if (__comp_res.__greater()) __rt = static_cast<__node_pointer>(__rt->__right_); else return _Pp( @@ -2130,18 +2267,21 @@ template template pair::iterator, typename __tree<_Tp, _Compare, _Allocator>::iterator> __tree<_Tp, _Compare, _Allocator>::__equal_range_multi(const _Key& __k) { - typedef pair _Pp; + using _Pp = pair; __end_node_pointer __result = __end_node(); - __node_pointer __rt = __root(); + __node_pointer __rt = __root(); + auto __comp = __lazy_synth_three_way_comparator(value_comp()); while (__rt != nullptr) { - if (value_comp()(__k, __rt->__value_)) { + auto __comp_res = __comp(__k, __rt->__get_value()); + if (__comp_res.__less()) { __result = static_cast<__end_node_pointer>(__rt); __rt = static_cast<__node_pointer>(__rt->__left_); - } else if (value_comp()(__rt->__value_, __k)) + } else if (__comp_res.__greater()) __rt = static_cast<__node_pointer>(__rt->__right_); else - return _Pp(__lower_bound(__k, static_cast<__node_pointer>(__rt->__left_), static_cast<__end_node_pointer>(__rt)), - __upper_bound(__k, static_cast<__node_pointer>(__rt->__right_), __result)); + return _Pp( + __lower_bound_multi(__k, static_cast<__node_pointer>(__rt->__left_), static_cast<__end_node_pointer>(__rt)), + __upper_bound_multi(__k, static_cast<__node_pointer>(__rt->__right_), __result)); } return _Pp(iterator(__result), iterator(__result)); } @@ -2151,18 +2291,21 @@ template pair::const_iterator, typename __tree<_Tp, _Compare, _Allocator>::const_iterator> __tree<_Tp, _Compare, _Allocator>::__equal_range_multi(const _Key& __k) const { - typedef pair _Pp; + using _Pp = pair; __end_node_pointer __result = __end_node(); - __node_pointer __rt = __root(); + __node_pointer __rt = __root(); + auto __comp = __lazy_synth_three_way_comparator(value_comp()); while (__rt != nullptr) { - if (value_comp()(__k, __rt->__value_)) { + auto __comp_res = __comp(__k, __rt->__get_value()); + if (__comp_res.__less()) { __result = static_cast<__end_node_pointer>(__rt); __rt = static_cast<__node_pointer>(__rt->__left_); - } else if (value_comp()(__rt->__value_, __k)) + } else if (__comp_res.__greater()) __rt = static_cast<__node_pointer>(__rt->__right_); else - return _Pp(__lower_bound(__k, static_cast<__node_pointer>(__rt->__left_), static_cast<__end_node_pointer>(__rt)), - __upper_bound(__k, static_cast<__node_pointer>(__rt->__right_), __result)); + return _Pp( + __lower_bound_multi(__k, static_cast<__node_pointer>(__rt->__left_), static_cast<__end_node_pointer>(__rt)), + __upper_bound_multi(__k, static_cast<__node_pointer>(__rt->__right_), __result)); } return _Pp(const_iterator(__result), const_iterator(__result)); } diff --git a/naiveproxy/src/third_party/libc++/src/include/__tuple/make_tuple_types.h b/naiveproxy/src/third_party/libc++/src/include/__tuple/make_tuple_types.h deleted file mode 100644 index 3c22ec85dc..0000000000 --- a/naiveproxy/src/third_party/libc++/src/include/__tuple/make_tuple_types.h +++ /dev/null @@ -1,77 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___TUPLE_MAKE_TUPLE_TYPES_H -#define _LIBCPP___TUPLE_MAKE_TUPLE_TYPES_H - -#include <__config> -#include <__cstddef/size_t.h> -#include <__fwd/array.h> -#include <__fwd/tuple.h> -#include <__tuple/tuple_element.h> -#include <__tuple/tuple_size.h> -#include <__tuple/tuple_types.h> -#include <__type_traits/copy_cvref.h> -#include <__type_traits/remove_cvref.h> -#include <__type_traits/remove_reference.h> -#include <__utility/integer_sequence.h> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -#ifndef _LIBCPP_CXX03_LANG - -_LIBCPP_BEGIN_NAMESPACE_STD - -// __make_tuple_types<_Tuple<_Types...>, _Ep, _Sp>::type is a -// __tuple_types<_Types...> using only those _Types in the range [_Sp, _Ep). -// _Sp defaults to 0 and _Ep defaults to tuple_size<_Tuple>. If _Tuple is a -// lvalue_reference type, then __tuple_types<_Types&...> is the result. - -template -struct __make_tuple_types_flat; - -template